English | 日本語
- 概要
- デモ
- ドキュメント
- 環境構築手順
- 動作確認手順
- Quick Start(デモゲームを弄ってみよう)
- 🤖 LLMと会話する
- 開発コマンド
- シナリオ検証API
- 現在の状況
- ロードマップ
- できること
- 制限事項
TypeScript(JavaScript) ベースのビジュアルノベルゲームエンジンです。
- UIは普通のHTML・CSS・JavaScriptで作れます。 独自のUI記法を覚える必要はありません。自動スケーリングで様々なウィンドウサイズに対応します。
- シナリオはWebTaleScript(HTML風のマークアップ)で書き、TypeScript/JavaScriptで拡張できます。 シーンファイル内の
<script>で定義した変数や関数を、シナリオからそのまま使えます。 - シナリオからJSのメソッドやREST API(POSTを含む)を呼べます。 レスポンスは変数
resに入るので、LLMの応答をそのままキャラクターのセリフにできます(LLMと会話する)。 - Vue.jsでUIを作るサンプル(example-vue)があります。
new Core({ customUI: true })で標準UIを無効にし、EventBusのイベント(text:show/choice:showなど)を購読して画面を描きます。EventBusはフレームワークに依存しないので、Reactなど他のフレームワークにも同じ方法で組み込めます。 - AIコーディングエージェント向けの設定を同梱しています。 リポジトリ直下に
CLAUDE.md/copilot-instructions.md/.clinerulesがあります。
- 🎮 柔軟なUI作成: HTML・CSS・JavaScriptで自由にUIをデザイン
- 📝 直感的なシナリオ記述: マークアップ言語とJavaScriptでシナリオを制御
- 🔄 自動スケーリング: 様々なウィンドウサイズに自動対応
- 🎨 豊富な画像処理: フィルター・アニメーション機能を搭載
- 🔊 サウンド対応: BGM・SE・ボイス再生に対応
- 🛠️ TypeScript対応: TypeScriptでの開発をサポート
- 🧩 UIフレームワーク連携: Vue.jsでUIを作るサンプル(example-vue)付き。
customUI: trueとEventBusで、React等にも同じ方法で組み込める - 🤖 LLM連携: 全タグ共通のHTTP属性(
get/post/put/delete)でLLMのAPIを呼び、応答をセリフとして表示 - 🧑💻 AIコーディング対応: Claude Code・GitHub Copilot・Cline向けの設定ファイルを同梱
Firefoxでも、Chromeでも、Edgeでも、好きなブラウザを使いたまえ・・・!
https://test-game-chi.vercel.app/

📖 オンラインドキュメント: https://endohizumi.github.io/webTaleKit/
-
Git が必要です。
- インストール確認:
git --versionでバージョンが表示されれば OK - Windowsの場合は、Git公式サイト (https://git-scm.com/) からインストールしてください。
- Macの場合は、
brew install gitを実行してインストールしてください。 - Linuxの場合は、以下のコマンドを実行してインストールしてください。
sudo apt-get update sudo apt-get install git
- インストール確認:
-
Node.js(20以降)が必要です。(nvm等お好みの方法がある場合は、そちらでも構いません)
- インストール確認:
node --versionでv20以上のバージョンが表示されれば OK - Windowsの場合は、Node.js公式サイト (https://nodejs.org/) からインストールしてください。
- Macの場合は、
brew install nodeを実行してインストールしてください。 - Linuxの場合は、以下のコマンドを実行して、インストールしてください。
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs - インストール確認:
-
以下のコマンドを実行してください
npm create tale-game your-game-title cd your-game-title npm run play
デモゲームが起動すれば、構築は完了です。
以下のコマンドを実行してください。
git clone https://github.com/EndoHizumi/testGame.git
cd testGame
npm install
npm run playこのセクションでは、プログラミングの知識がなくても簡単にゲームをカスタマイズできる方法を説明します。
手順: 既存の画像ファイルを新しい画像で置き換える(ファイル名は同じにしてください)
- キャラを変える場合
./src/resource/chara/guide.pngを新しいキャラ画像で上書きしてください(ファイル名はguide.pngのまま)
- 背景画像を変える
./src/resource/background/title_bg.pngを新しい背景画像で上書きしてください(ファイル名はtitle_bg.pngのまま)
- BGMを変える
./src/resource/bgm/title_theme.mp3を新しい音楽ファイルで上書きしてください(ファイル名はtitle_theme.mp3のまま)
- 選択肢の画像を変える
./src/resource/system/systemPicture/02_button/button.png(通常時) - ファイル名はbutton.pngのまま上書き./src/resource/system/systemPicture/02_button/button2.png(マウスを乗せた時) - ファイル名はbutton2.pngのまま上書き./src/resource/system/systemPicture/02_button/button3.png(クリック時) - ファイル名はbutton3.pngのまま上書き
パス表記について:
./は「現在のプロジェクトフォルダから」という意味です- パス区切り文字は
/(スラッシュ) を使用しています - Windowsをお使いの方:
\(バックスラッシュ) でも動作しますが、上記の/形式を推奨します
シナリオファイル(.sceneファイル)をテキストエディタで開いて、以下の方法で内容を変更できます:
- キャラを増やす
./src/resource/characterフォルダに新しいキャラ画像を保存- シナリオファイルで
<show src="キャラ画像のファイル名"></show>を記述
- セリフを増やす
<say name="キャラの名前">ここにセリフを入力</say>を記述
- 地の文(ナレーション)を増やす
<text>ここに地の文を入力</text>を記述
初心者の方へ: まずは既存のテキストを変更することから始めることをお勧めします。
選択肢はプレイヤーがゲームの進行を選ぶ重要な要素です。シナリオファイル内の <choice> タグを編集することで変更できます。
基本的な選択肢の書き方:
<item label='選択肢の文言'>
<text>選択後に表示される文章</text>
</item>実用的な例:
<choice prompt="ゲームを始めますか?">
<item label="はい">
<jump index="5" />
</item>
<item label="いいえ">
<jump index="16" />
</item>
<item label='ちょっと待ってくれ'>
<text>承知しました。</text>
<jump index="1" />
</item>
</choice>どのタグにも get / post / put / delete 属性を付けてREST APIを呼び出せます。
レスポンスのJSONは変数 res に入り、<then> の中で {{res.xxx}} として表示できます。
これを使うと、LLMの応答をそのままキャラクターのセリフにできます。
<scene>
<scenario>
<say name="案内人" post="http://localhost:3002/chat">
<progress>考え中……</progress>
<header>
<Content-Type>application/json</Content-Type>
</header>
<data>
<message>{{question}}</message>
</data>
<then>{{res.reply}}</then>
<error>ごめんなさい、いまはうまく答えられません。</error>
</say>
</scenario>
<script>
export let question = 'このゲームの遊び方を教えて'
// HTTPレスポンスが入る変数(リクエスト前に参照してもエラーにならないよう宣言しておく)
export let res = null
</script>
</scene><data>の子要素は{ "message": "…" }というJSONに変換されて送信されます。値の中の{{…}}は送信前に展開されます。<header>のContent-Type: application/jsonは省略しないでください。省略するとヘッダーが付かず、下記の中継サーバーはリクエストをJSONとして読めません。- レスポンスが2xxなら
<then>、4xx/5xxのときや通信できなかったときは<error>の内容が表示されます。 {{ }}の中身はJavaScriptの式として評価されるので、{{res.a.b}}のようなネストした参照や{{res.items[0]}}のような配列の添字も使えます。
このリポジトリには、OpenAI互換API(/chat/completions)に中継するサンプルサーバー server/chat.js が入っています。llama.cpp server・Ollama・LM Studio などのローカルLLMや、Gemini・OpenAIのOpenAI互換エンドポイントで使えます。受け取った message をLLMに渡し、{ "reply": "…" } を返します。
# ローカルLLM(APIキー不要)の例: llama.cpp server を 8082 番で起動しておく
# llama-server -m your-model.gguf --port 8082
LLM_BASE_URL=http://localhost:8082/v1 LLM_MODEL=local-model npm run chatNote
llama.cpp server の既定ポート(8080)は、サンプルゲーム(example)の開発サーバーと同じです。
同時に動かすときは、上の例のようにLLM側を別のポートで起動し、LLM_BASE_URL をそれに合わせてください。
| 環境変数 | 既定値 | 説明 |
|---|---|---|
LLM_BASE_URL |
http://localhost:8080/v1 |
OpenAI互換APIのベースURL |
LLM_API_KEY |
(空) | APIキー。ローカルLLMなら不要 |
LLM_MODEL |
local-model |
モデル名 |
SYSTEM_PROMPT |
案内人としての短い指示 | システムプロンプト |
ALLOWED_ORIGIN |
* |
CORSで許可するオリジン |
PORT |
3002 |
待ち受けポート |
Warning
APIキーをシナリオ(.scene ファイル)や <header> に書かないでください。
シナリオはブラウザに配信されるJavaScriptに変換されるため、プレイヤーが誰でも読めます。
APIキーは中継サーバーの環境変数(LLM_API_KEY)に置き、ブラウザからは中継サーバーだけを呼び出してください。
公開するときは ALLOWED_ORIGIN をゲームのURLに絞ってください。
npm run build- TypeScriptをJavaScriptにコンパイルし、配布ファイルを準備npm run dev- プロジェクトをビルドし、exampleフォルダで開発サーバーを起動npm run lint- ESLintでコード品質をチェックnpm run test- Jestでテストを実行
wtc- WebTaleScriptパーサーCLI (parser/cli.jsから利用可能)- 使用方法:
wtc <scene-file> [output-directory]で.sceneファイルを.js/.tsファイルに変換
npm run docs:dev- VitePressドキュメントサーバーを起動npm run docs:build- ドキュメントをビルドnpm run docs:preview- ビルドしたドキュメントをプレビュー
WebTaleKit には、シナリオ配列を検証しつつ、HTML風の文字列を非破壊でサニタイズできる公開APIがあります。
validateScenarioObjects- 検証結果とサニタイズ済みシナリオを返しますformatValidationOutput- エラーと警告を表示用文字列へ整形しますcreateScenarioValidationError- 検証結果から Error を生成しますassertScenarioValidation- エラーがある場合に例外を送出しますreportScenarioValidation- logger 経由で警告とエラーを出力します
これらのAPIは、エンジン実行時に自動で強制適用されません。シナリオの読み込み時、エディタ連携時、独自ビルド処理時などに、利用者が必要に応じて呼び出す想定です。
import {
assertScenarioValidation,
reportScenarioValidation,
validateScenarioObjects,
} from './src/utils/validateScenario'
const result = validateScenarioObjects(scenarioObjects, commandList)
await reportScenarioValidation(result, 'Scene import')
assertScenarioValidation(result, 'Scene import')
const safeScenario = result.sanitizedScenariosanitizedScenario は元の入力配列を破壊せずに返されます。sanitized が true の場合は、HTML風の文字列がエスケープされています。
webTaleKitは、現在アルファ版です。
開発進捗は、@endo_hizumi で行っております。 実装予定の項目については、こちらのTrelloからも確認できます。
デモをプレイした感想・WebTaleKitを使って気になったことなど、意見・感想はこちらで受け付けています! https://forms.gle/uejQwvwAb99wcJht7
検索Hashtag: #webTalekit
| バージョン | コードネーム | codeName | 内容 |
|---|---|---|---|
| 0.1.0 | 初音 | HATUNE | 初期リリース |
| 0.2.0 | 礎 | ISHIZUE | 基本機能アップデート 0.2.12〜 ダイアログ表示タグの追加 engineConfig反映バグの修正 未定義タグがある場合、undefineを呼び出すバグの修正 文字列以外を囲むとこける問題の修正 リンク切れでこける問題の修正 メッセージウィンドウオーバーフローの修正 if属性の実装 for属性の実装 既読管理の追加 |
| 0.3.0 | 舞踊 | BUYO | トランジション・アニメーション関連のアップデート テキストスピードの調整タグの追加 テキスト表示フォントサイズの変更 Webフォントのサポート(フォント変更設定の追加) 動画再生のサポート 子要素でフィルター・アニメーション設定 |
| 0.4.0 | 狭間 | HAZAMA | Vue.js・React・Svelte向け公式アダプタのパッケージ化 ( customUI: true とEventBusによる組み込み自体は現在も可能。example-vue参照) |
| 0.5.0 | 操手 | AYATURI | ゲームパッドのサポート追加 キーコンフィグの追加 VOICEBOX APIの対応 npm run recの追加 |
| 0.6.0 | 絡繰 | KARAKURI | wtsLinterの追加 VSCodeとの連携追加 wst2htmlの追加 プラグイン機能の追加 クロスプラットホームへのビルド追加 |
| 0.7.0 | 綴り | TUDURI | GUIエディタの追加 |
| 0.8.0 | 迅雷 | JINRAI | パフォーマンスアップデート |
| 0.9.0 | 出島 | DEJIMA | KAGタグコンバータの追加 |
| 1.0.0 | 暁月 | AKATUKI | メジャーアップデート |
- 地の文の表示
- キャラクターのセリフの表示・ボイスの再生
- 定義した変数の表示
- キャラクターの画像の表示・位置変更・アニメーション
- その他の画像の画像の表示・位置変更・アニメーション
- キャラクターの複数表示・位置変更・アニメーション
- CGの表示・変更
- 背景画像の表示・変更
- 画像のフィルター操作
- モノクロ化
- セピア化
- 透明度の変更
- サイズの変更
- 選択肢の表示
- 選択肢の画像の変更
- 通常時
- マウスオーバー
- 選択時
- Ctrlキーでの強制スキップ
- Enterキーで全文表示
- 表示する文章・画像の条件分岐
- セリフのジャンプ
- シナリオ(シーン)の切り替え
- BGMの再生・停止
- SEの再生・停止
- セーブ機能
- ロード機能
- HTMLで作った画面の表示
- 解像度の設定変更
- JavaScript連携
- メソッドの呼び出し
- 式の実行
- 変数の定義・値の変更
- JavaScript側での背景画像の変更
- TypeScript連携
- REST API呼び出し(レスポンスの表示)
- Desktopアプリケーションへのビルド
- Android(iOS)向けのビルド
- 画面各種のボタン
- セーブファイルの一覧の取得
- sayタグの以下の機能
- キャラが表示されていないときは、表示する
- showタグ / hideタグの以下の機能
- 子要素でフィルター指定
- 子要素でアニメーション指定
- スラッシュで区切ってリソース種類を指定
- quakeタグ(画面を揺らす)
- maskタグ(画面の暗転)
- soundタグの以下の機能
- pause
- setVolume
- getVolume
- bgmエイリアス
- voiceエイリアス
- seエイリアス
- JavaScriptでのリソースの動的定義
- ゲーム設定ファイルの反映
- 画面用HTMLのcss・jsのインライン化・minify化
MIT License
- 青: #3178C6 (TypeScript Blue)
- 緑: #02a889 (WebTaleKit Green)
- 白: #f8f8f8 (White Smoke)
