dota2-custom-game-dev について
DOTA2 Custom Game Dev は、Dota 2のカスタムゲーム開発向けスキルで、Lua、TypeScriptToLua、Panorama UI、KVファイルを扱います。ソース編集やAPI検索を案内し、MCPによる実機確認にも対応します。オフラインでは同梱資料を参照できます。
主な機能
- 01Lua、TSTL、Panorama、KV開発のガイド
- 02TSTLとSolidJS Panoramaプロジェクトの検出
- 03同梱されたDota 2 API資料の検索
- 04上流からのスナップショット更新
- 05MCPツール利用時の実行時検証
活用シーン
- 01KV設定からLuaソースまでの追跡
- 02Panorama UIの開発やデバッグ
- 03ゲームがオフラインの際のAPI検索
- 04稼働中のDota 2でのアドオン動作確認
MCP 対応
Dota2 MCPツールが利用できる場合、最新APIの検索や接続状態、コンソール出力、アドオンの動作などの実行時確認に使います。オフライン時は同梱のAPIスナップショットを代替として参照します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ demon673/ demon-agent-skill --skill dota2-custom-game-devインストール後、Claude Code で/dota2-custom-game-devを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlreferences/solid-panorama-ui.mdtstl-dota2.mdupstream-source-map.mdreferences/vendor/vscode-dota2-tools/css.css-data.jsonhtml.html-data.jsonUPSTREAM.jsonreferences/vendor/vscode-dota2-tools/resource/dump_panorama_css_properties.jsondump_panorama_events.mdlua_api_changelog.mdPanelList.jsonPanelList.mdscripts/detect_solid_panorama_project.pydetect_tstl_project.pysearch_dota2_api.pyupdate_references.ps1詳細
DOTA2 カスタムゲーム開発
Lua、TypeScriptToLua/TSTL、SolidJS Panorama UI、Panorama JS/TS、Panorama CSS/XML、KV ファイルを扱う DOTA2 カスタムゲームアドオンの開発や、Dota 2 MCP ツールを利用できる場合の Dota 2 ランタイムのライブ調査に、このスキルを使用してください。
参照ソース
ランタイムが公開している場合は、Dota2 MCP ツールを優先してください。MCP ツールを利用できない場合、Dota 2 が起動していない場合、またはユーザーがオフラインでのソース作業のみを必要としている場合は、同梱の BigCiba/vscode-dota2-tools スナップショットを使用してください。
- 上流リポジトリ:
https://github.com/BigCiba/vscode-dota2-tools - ローカルソースマップ:
references/upstream-source-map.md - TSTL DOTA2 ガイド:
references/tstl-dota2.md - SolidJS Panorama ガイド:
references/solid-panorama-ui.md - 更新スクリプト:
scripts/update_references.ps1 - API 検索ヘルパー:
scripts/search_dota2_api.py - TSTL プロジェクト検出ツール:
scripts/detect_tstl_project.py - SolidJS Panorama プロジェクト検出ツール:
scripts/detect_solid_panorama_project.py
同梱の参照資料を恒久的に正しいものとして扱わないでください。これらはスナップショットであり、ユーザーが最新の API の動作を求めている場合や、API の正確性が重要な場合は、上流から更新してください。
Dota2 MCP ワークフロー
アドオンのテスト、ゲーム内の動作確認、コンソールエラーの読み取り、マップの起動、現在のランタイム状態の調査など、ライブゲームの情報が役立つ場合にのみ Dota2 MCP を使用してください。通常のソース編集で MCP の使用を必須にしないでください。
ライブでのテストやデバッグでは、最初に dota_status を呼び出してください。接続状況、アドオン/マップの状態、次に有効な手順が報告されます。クライアントが dota_status ではなく project_info を公開している場合は、状態確認の代わりに project_info を使用してください。
高速なランタイムループを優先してください。ソースを編集し、リポジトリのビルド/ウォッチコマンドでコンパイルし、ライブゲームをリロードしてから、MCP で確認します。通常のコード編集を反映させるだけの目的で dota_restart を呼び出さないでください。アドオンが対応している場合は、reload_script などのプロジェクトリロードコマンドを使って console_send を呼び出してください。
ユーザーがライブデバッグ/テストを依頼していない限り、ライブゲームの状態を変更したり、破壊的なコンソールコマンドを送信したり、任意のサーバー Lua を実行したりしないでください。通常のソース編集では、まずプロジェクトファイルを読み、MCP の出力は根拠としてのみ使用してください。
プロジェクトの構成
まず、アドオンのルートディレクトリを特定してください。
- ゲームスクリプト:
game/scripts/vscripts/ - NPC/KV 設定:
game/scripts/npc/ - Panorama レイアウト:
content/panorama/layout/custom_game/ - Panorama JS:
content/panorama/scripts/custom_game/ - Panorama CSS:
content/panorama/styles/custom_game/ - ローカライズ:
game/resource/ - TSTL ソース(存在する場合):
src/vscripts/、src/panorama/、src/common/ - SolidJS Panorama ソース(存在する場合):
solid/src/ui/、solid/src/components/、solid/src/utils/
プロジェクトの構成が異なる場合は、addon_game_mode.lua、npc_abilities_custom.txt、custom_net_tables.txt、custom_events.txt、custom_ui_manifest.xml、layout/custom_game、package.json、tsconfig.json、tstl、solid/build.ts、solid/src/ui を検索してください。
TSTL プロジェクトでは、生成された Lua を確認し、TypeScript ソースを編集してください。ユーザーが緊急の生成物へのパッチを明示的に依頼していない限り、game/scripts/vscripts/ 内の生成済み Lua を修正しないでください。
SolidJS Panorama プロジェクトでは、生成された JS/XML/CSS を確認し、Solid TSX、Less/SCSS、宣言ファイル、またはビルドスクリプトを編集してください。ユーザーが緊急の生成物へのパッチを明示的に依頼していない限り、生成済み Panorama アセットを修正しないでください。
API の検索ワークフロー
ライブ/最新の API の動作については、Dota2 MCP API ツールを優先してください。MCP を利用できない場合、大きな JSON ファイルを直接読むのではなく、同梱スクリプトで対象を絞って検索してください。このスキルのディレクトリから以下の例を実行するか、別の作業ディレクトリから実行する場合は、.\scripts をスキルディレクトリの解決済みパスに置き換えてください。
python .\scripts\search_dota2_api.py --kind lua --query CustomGameEventManager
python .\scripts\search_dota2_api.py --kind js --query SendCustomGameEventToServer
python .\scripts\search_dota2_api.py --kind css --query flow-children
python .\scripts\search_dota2_api.py --kind panel --query DOTAAbilityImage
python .\scripts\detect_tstl_project.py <path-to-addon>
python .\scripts\detect_solid_panorama_project.py <path-to-addon>
参照資料がない場合や古くなっている場合は、このスキルのディレクトリから更新してください。
powershell -ExecutionPolicy Bypass -File .\scripts\update_references.ps1
境界
- サーバー側の Lua が正規の情報源です。経済、ダメージ、インベントリ、報酬、クールダウン、勝利条件について、Panorama クライアントのペイロードを信頼しないでください。
- Panorama JS はクライアント UI のロジックです。サーバーに意図を送信したり、カスタムネットテーブルから公開状態を読み取ったり、パネルを更新したりできますが、サーバー側の Lua で検証する必要があります。
- KV ファイルはデータとエンジンとのバインディングを定義します。
ScriptFile、BaseClass、AbilitySpecial、モディファイア名、ローカライズトークンが、Lua および Panorama での使用状況と一致していることを確認してください。 - CSS は Panorama CSS であり、ブラウザー CSS ではありません。最新の Web CSS を使用する前に、DOTA2 CSS のリファレンスを確認してください。
- XML パネルは Panorama パネルであり、DOM 要素ではありません。ブラウザーのセマンティクスを想定する前に、パネル固有の属性やイベントを確認してください。
- TSTL の変更では、出力される Lua のセマンティクスを維持してください。
this、複数の戻り値、Lua の配列/テーブル、デコレーター、モジュールのインポート、Lua のコロン呼び出しの動作に依存する API に注意してください。 - TSTL テンプレートプロジェクトでは、生成された Lua と Panorama JS はビルド成果物です。まず
src/**/*.tsを修正し、リポジトリのビルド/型チェックコマンドを実行してください。 - SolidJS Panorama はブラウザー DOM の開発ではありません。コンポーネントは Panorama パネルに描画され、Panorama のイベント/属性を使用し、Panorama CSS/XML の制約を守る必要があります。
- Solid のエフェクトとサブスクリプションは、
onCleanupまたはプロジェクトのヘルパーユーティリティを使って、GameEvents、CustomNetTables、タイマー、パネルハンドラーをクリーンアップする必要があります。
一般的なワークフロー
Lua のアビリティまたはモディファイアを扱う場合:
- KV エントリと
ScriptFileを見つけます。 - Lua のクラス名、
LinkLuaModifier、固有モディファイア、特殊値の読み取りを調べます。 - 利用可能であれば Dota2 MCP API/ランタイムツールを使用します。そうでない場合は、Lua API スナップショットでエンジン呼び出しを検索します。
- サーバー/クライアントの境界と権限を検証します。
TSTL の vscripts を扱う場合:
scripts/detect_tstl_project.pyを実行するか、その動作を再現して、package.json、tsconfig.json、TSTL パッケージ、ソース/出力のルートを見つけます。- TypeScript のセマンティクスを変更する前に、
references/tstl-dota2.mdを読みます。 - KV の
ScriptFileから生成された Lua をたどり、さらにsrc/vscripts/**/*.tsまでさかのぼります。 - TypeScript のソースを編集することを優先し、存在するものに応じて、
npm run build、npm run build:vscripts、npm run dev、npx tstl -p tsconfig.jsonなど、リポジトリのスクリプトで検証します。 - ライブ検証では、マップを再起動する前に、watch/build と
console_send(commands="reload_script")、console_output(channel="VScript", level=3)の使用を優先します。 - ビルドコマンドに依存関係やネットワークが必要な場合は、許可を求めるか、不足している依存関係を明確に報告します。
Panorama UI を扱う場合:
- XML、JS、CSS、
custom_ui_manifest.xmlの場所を特定します。 - JS API で
GameEvents、CustomNetTables、Players、Entities、Abilitiesを検索します。 - CSS とパネルの参照を調べ、未サポートのプロパティや誤ったパネル属性がないか確認します。
CustomGameEventManagerとGameEventsを介した、JS と Lua 間のイベントの流れをたどります。- ライブ MCP ツールが利用可能な場合は、
PanoramaScriptを指定したconsole_outputと、Panorama API/CSS/イベントの各ツールを使って、ランタイムエラーとサポートされている UI API を確認します。
SolidJS の Panorama UI を扱う場合:
scripts/detect_solid_panorama_project.pyを実行するか、その動作を再現して、package.json.panorama、Solid の依存関係、ソースのルート、ビルドスクリプト、出力のルートを見つけます。- Solid のレンダリング、リアクティビティ、生成される XML/CSS、マニフェストの動作を変更する前に、
references/solid-panorama-ui.mdを読みます。 package.json.panoramaからsolid/src/ui/<name>/<name>.tsxへ、さらに生成されたcontent/<addon>/panorama/scripts/custom_game/<name>.js、レイアウト XML、スタイル、custom_ui_manifest.xmlへと、UI エントリをたどります。- TSX/Less/SCSS/宣言ファイル/ビルドプラグインのソースを編集することを優先し、
npm run build:solidまたはプロジェクトに相当するコマンドで検証します。 - DOTA2 の信頼境界を守ります。Solid/Panorama は意図の送信と複製された状態の描画を行えますが、サーバーの vscripts が引き続き権限を持ちます。
同期の不具合を扱う場合:
- 状態をプッシュイベント、ネットテーブル、ローカル限定の UI 状態のどれにすべきか特定します。
- Lua で
CustomGameEventManager:RegisterListener、CustomNetTables:SetTableValue、プレイヤーの検証を調べます。 - JS で
GameEvents.Subscribe、GameEvents.SendCustomGameEventToServer、CustomNetTables.SubscribeNetTableListenerを調べます。 - ライブ MCP ツールが利用可能な場合は、コンソール出力、エンティティ/モディファイア、安全な Lua 式を調べ、実際のランタイム状態を確認します。
- 古い状態、信頼境界、ライフサイクルのリスクを個別に報告します。
出力
API の説明やコードの修正では、以下を含めます。
- 関係するレイヤー:Lua サーバー、Panorama JS、CSS/XML、KV、またはローカライズ。
- 使用した正確なプロジェクトファイルと API リファレンス。
- サーバー/クライアントの信頼境界。
- コードが TypeScript のソースか、生成された Lua/JS か。
- SolidJS の Panorama ソースを変更したのか、生成された Panorama アセットを変更したのか。
- Dota2 MCP のライブデータを使用したか、またはバンドル済み/オフラインのリファレンスに切り替えた理由。
- バンドル済みのスナップショットを今回のターンで更新していない場合は、そのリファレンスの鮮度に関する注意。