プラグイン開発
作成とテスト
Section titled “作成とテスト”メインメニュー、マップ管理、プラグイン管理から「Creator / Workshop」を開きます。単一マップ、2段階キャンペーン、プラグイン、関連プラグイン付きボスチュートリアルを作成し、オフラインで編集・保存・検証・テストできます。ローカル、購読、自分の公開作品、ブラウザー、タスクを管理します。「王国ミッション」テンプレートは、ブリーフィング、依頼、波、名のあるボスを備えた 1 レベルの kingdom キャンペーンを作成します。「コンテンツのインポート」またはワークスペースへのドロップで、ZIP、マップファイル、作品フォルダを取り込めます。「エクスポート…」は ZIP かフォルダを作り、「フォルダを開く」で作品のファイルを開けます。どちらも保存先フォルダを尋ね(前回のものが既定)、同じ名前があれば name-2、name-3… にし、Steam がダウンロードしたコンテンツには書き込みません。各作品はプレビュー、種類、バージョン、作者、このゲームで読み込めるか、最後のチェック結果とともに一覧表示されます。どの一覧にも検索と種類の絞り込みがあり、空のときは理由を表示し、選んだ作品の詳細にはライセンス、対応ゲームバージョン、必要なもの、フォルダが出ます。「新しいプロジェクト」はテンプレートとそれぞれが作るものを一覧にし、何かを書き込む前に作品の置き場所を示します。検証は、英雄が城から歩いて行けない拠点、宝箱、配置したボスを警告し(勝利条件がそれを必要とするならエラー)、1 枚のマップを拠点 64、宝箱 256、配置ボス 32 までに抑えます。マップのマス上の問題をダブルクリックすると、その場所でエディタが開きます。地形・キャンペーンエディタは、作品の依存コンテンツだけを読み込む独立したプロセスで開くため、プレイヤーが入れた他のコンテンツは表示も干渉もしません。保存先は作品そのものです。ワークスペースで開いたエディタに未保存の変更があるあいだ、検証・書き出し・試遊・公開は待ちます。これらは保存済みのファイルを使います。プラグインエディタでは、ボスのフェーズを表(各フェーズが始まる体力とスキル)で編集し、スキルの数・上限・予兆にもそれぞれ欄があります。プラグインエディタは編集のたびに少し後で未保存の作業の下書きを、設定ファイルの横(作品の外)に保存します。クラッシュ後にプロジェクトを開き直すと、復元するか尋ねます。プラグインエディタでは、「複製」が新しい ID で定義をコピーし、ほかの定義が参照している定義はその参照を外すまで削除できず、「組み込みをコピー…」がゲームのアクターの完全なコピーを元の ID のまま加えます。使われている場所では元の定義に置き換わりますが、ゲーム本体のファイルは変わりません。クラス、敵、建物、拠点、研究にはプロパティフォーム(能力の範囲と成長、落とすゴールド、価格、建物が募集するクラス、拠点が送り出す敵、研究の対象)があり、元の定義から受け継いだ値は灰色で示され、ゲームの範囲外の値や存在しない ID はすぐに印が付きます。依存関係は表で編集します。素材タブはドロップしたファイルを取り込み、各画像の見える範囲をゲームのサイズ・メモリ上限と並べて示し、地形やアイコンとしてプレビューし、出典とクレジットを保存し、どの定義が使っているかを一覧・指定できます。名前を変えると参照もすべて書き換わり、使用中のファイルは削除できず、存在しないファイルを指す項目は既存のファイルへ付け替えられます。テストプレイの開始時には読み込んだ内容(読み込み順に各プラグインが追加・置き換えた定義と、読み込まれなかったプラグインとその理由)が表示されます。ワークスペースにも同じ一覧が表示され、テスト中のプラグインで読み込まれなかった定義は問題一覧に入り、定義表の問題を開くとプラグインエディタのその定義へ移動します。
フォルダー/ZIP の取り込みと編集可能なコピーは新 ID を作り、自身の名前空間参照を変更し、作者・出典・ライセンスを保持します。更新の関連付けは引き継ぎません。Steam の原本は読み取り専用。相対パス、容量、配列、トリガー循環を検証します。空のライセンスは再配布許可ではありません。コピーを公開するときは、確認画面に入手元(元の作品、バージョン、作者、アイテムページ)と元の作者の条件が表示され、クレジットを残して条件に従うこと、元の作品にライセンスがない場合は作者の許可を得ていることを確認するまで送信できません。記載のないライセンスは常に共有の許可なしとして表示されます。コピーの詳細には元の作品が示され、購読中の元の作品が更新されるとその旨が表示されます。「ローカルの編集可能なコピーを作成する」「エクスポート…」「購読を解除する」のツールチップはそれぞれの働きを説明します。
公開には Steam が必要です。ページと画像を設定し、変更されないファイル/ハッシュのスナップショットを確認してから送信します。画面を閉じてもタスクは続き、準備は取り消せます。送信済み/結果不明の場合はタスク確認・再同期後に再試行します。更新はアカウント・App・プロジェクト ID ごと。画像は 1 MiB 未満、自動テストは模擬 Steam を使用します。 必要なプラグインを先に公開し、マップ/キャンペーンの確認画面で同一 App の項目 ID を確認してください。 公開ウィザードは言語別のページ本文と JSON メタデータを保存し、主画像を正方形に切り抜き、最大8枚の追加画像を並べ替え・削除できます。公開済み作品は内容を再送せずページと依存関係だけを更新でき、画像も確認用スナップショットに含まれます。ウィザードは作品そのものからメインのプレビューを作れます(地図の地形と城・拠点・宝箱、キャンペーンの最初のステージ、プラグイン自身の画像に題名を添えたもの)。アップロードされる実際のプレビューとサイズを表示し、各スクリーンショットの下部にキャプションを描け、下書きが参照していた画像がなくなっていれば知らせます。ウィザードは 3 つのステップ(ページ、依存関係とバージョン、確認)を「戻る」「次へ」(Alt+←、Alt+→)で進みます。問題があるとそのステップへ移り、修正するまで該当欄を枠で示します。確認では前回の公開から追加・変更・削除されたファイル数を表示します。失敗したタスクは、どの種類の問題か(権限、ワークショップ規約、容量、Steam の混雑、タイムアウト、Steam オフライン、チェック、結果不明、中断)、次に何をすべきか、そしてアカウント・アイテム・ファイル名を含まない WS-PERM-R15 のようなコードを示します。「自分の公開」で自分のアイテムを選ぶと、公開範囲、バージョン、作成・更新日時、サイズ、リンクされたローカル作品、そしてその作品から更新したときに変わるもの(ページの項目、ファイル、必須アイテム)の一覧が表示されます。ブラウザーでアイテムを選ぶと、説明文(Steam が提供していなければその旨)と、分けて示される二つの部分が表示されます。Steam が伝える内容(種類、必須アイテム、作者が許可したゲームのブランチ、公開時に記録されたバージョン、更新日時、サイズ、評価)と、Steam がインストールした後にアイテム自身のマニフェストが示す内容(作品とバージョン、このビルドで要求されたゲームバージョンを実行できるか、必要な作品、変更しうるもの)です。Steam が提供しなかった情報は補いません。購読したアイテムは、Steam のインストールが終わり確認に通ってから使われます。マニフェストがこのゲームで読めること、必要な作品がすべて許可された範囲のバージョンでインストールされ、循環依存がないことが条件です(同じ作品を二つのアイテムが提供する場合は自分のプラグインを、なければ最も古いアイテムを使います)。Steam が更新中のアイテムは、新しい版がインストールされるまで今の版が使われます。「購読」タブには、購読中の各アイテムの状態(Steam 待ち、ダウンロード中とそのバイト数、確認待ち、利用可能、必要な作品の不足、または失敗とその理由)が並び、ブラウザーも選んだアイテムについて同じ状態を示します。Steam が完了できなかったダウンロード(ディスクがいっぱいなど)は、「ダウンロードを再試行」を押すまで再要求しません。セーブを読み込む前に、ゲームは保存時のコンテンツを確認します。使っていた作品が更新・無効化・購読解除された、または使えない場合や、別のコンテンツが有効な場合はそれぞれを示し、確認のうえでセーブの保持コピーから読み込みます。読み込めないとき(使えるコピーがない、ゲームの更新、別の Steam アカウントやアプリ、Steam が起動していない)は理由と直し方を示し、セーブファイルと進行中のゲームはそのまま残ります。「購読」タブの「保持されたコンテンツ…」はそれらのコピーと頼っているセーブを一覧し、確認して未使用のものを削除できます。セーブが頼るコピーはセーブ名を示した確認の後にだけ削除され、実行中のゲームが使うコピーは削除されません。アイテムと作品の詳細には、このゲームのバージョン(開発ビルドでは未設定で、その場合は特定のゲームバージョンを求めるコンテンツを読み込めません)と Steam ブランチも示され、「購読」タブの「アイテムのページを開く」で使えないアイテムを確認できます。実行中に Steam が別のブランチへ切り替えたときは通知だけが表示され、自動で再起動はしません。ページのタグは作品の種類と、Story, Challenge, Bosses, Classes, Enemies, Buildings, Research, Events, Languages, Art から選んだものです。ページの手順には作成済みのページの言語が表示され(ほかの Steam 言語ではデフォルトのページが表示されます)、公開済みのアイテムでは「Steam からページを取り込む…」で Steam のページと下書きを項目ごとに比べ、チェックした項目だけを取り込めます。Steam がないときは購読アイテムは読み込まれず、保持コピーも使われません。どちらも Steam アカウントとアプリに属するためです(体験版と製品版は別のアプリで、それぞれにアイテム・下書き・コンテンツプロファイルがあります)。それらを必要とするセーブは理由を示し、自分の作品の作成・確認・テストプレイ・書き出し・取り込みはすべてオフラインでできます。テストプレイの実行中はティック時間・メモリ・スプライトアトラスを計測し、ワークスペースはそれをテストプレイの報告に加えて「問題なし」「注意」「重すぎる」に分け、改善策を示します。アップロードがコンテンツや容量で失敗したときは説明に Steam の制限が示され、完了したときは公開では確かめないので購読して読み込めるか確認するよう促します。 アップロードは 5 分間進まなかったときだけ打ち切られ、完了または取り消したタスクは 1 週間後に一覧から消えます。新しいテストプレイを始めると、どのゲームも使っていない古いセッションは削除されます。ローカルの作品で Enter を押すとエディターが開き、これらのウィンドウはどの言語でも 1280 × 720 の画面に収まります。
定義と依存関係
Section titled “定義と依存関係”バージョン付きプラグインは組み込み動作テンプレートから、独立した名前空間付きクラス、敵、建物、拠点と、スキル、研究、イベント、名前付きボス、素材、言語を追加できます。新しい ID は namespace:name。組み込み ID を使うと既存定義を上書きします。コアファイルは読み取り専用です。 外観用スキンはゲーム値を変えず、キャラクターや地形の画像を置き換えます。プレイヤーの建物は効果を持てます。攻撃・回復・シールド・状態のスキルを 1 つ、指定レベルに達すると範囲内の敵や英雄に一定の間隔で発動します。 能力が assets と languages だけのパックはスキン(skins)と言語しか含められず、ゲームが使えない画像や音は組み込みのものがそのまま使われます。
共通マニフェストはプロジェクト ID、作者、バージョン、互換範囲、素材、依存関係を記録します。新形式は依存順で決定的に読み込み、欠落・競合・循環は読み込みを止めます。旧形式と順序は維持されます。プロファイルは上書きを確認して次のゲームに適用します。コンテンツプロファイルは選んだプラグインを読み込み順に並べ、それぞれの入手元と、インストール済み・実行中のゲームで使用中・次に選ぶバージョンを示します。「上へ」「下へ」は依存関係が許す範囲でのみ順序を変え、順序は同じ Steam アカウントとアプリの次の読み込みに適用されます。適用前に、有効・無効になるプラグインと、無効にするプラグインを使う地図・キャンペーン・プラグイン・セーブを一覧します。問題をダブルクリックするとそのプラグインへ移動し、地図やキャンペーンから必要なプラグインを提案でき、表示されない購読アイテム(自分のプラグインのコピーなど)は理由を示します。
{"manifest_version":1,"format_version":1,"kind":"Plugin", "project_id":"sample:content","namespace":"sample","version":"1.0.0", "author":"Author","game_version":"*","entry_points":["plugin.json"], "assets":["preview.png"],"preview":"preview.png","languages":["en"], "capabilities":["dynamic_types","behavior_templates","bosses","assets"], "dependencies":[],"license":"","source":{}}content-manifest.json / <map-stem>.manifest.json
{"id":"sample","name":"Example","version":"1.0.0", "content":{"enemies":"content/enemies.json","skills":"content/skills.json", "bosses":"content/bosses.json","languages":["lang/en.json"]}}plugin.json
[{"id":"sample:slime","base":"SLIME","stats":{"hp":90}}][{"id":"sample:strike","template":"attack","cooldown":60,"radius":5,"power":10}][{"id":"sample:chief","enemy":"sample:slime","name":"Chief", "phases":[{"hp":1,"skills":[]},{"hp":0.5,"skills":["sample:strike"]}],"reward":100}]{"bosses":[{"definition":"sample:chief","encounter":"bridge_chief","x":21,"y":16}], "victory":"defeat_boss","victory_target":"bridge_chief"}{"project_id":"sample:content","version":">=1.0.0,<2.0.0","optional":false}| JSON | 素材と制限 |
|---|---|
| skills | attack, heal, shield, status, summon |
| adventurer_classes.skills | クラスのスキルツリー(パッシブスキル):{"id", "level", "effect", "requires": [ids]} のリスト(数は自由、同じレベルに複数可)、または旧形式の表 {"<レベル>": {"id", "effect"}}(一本の鎖として読む)。id はクラス内で一意、requires は同じクラスのスキルを指し、循環は不可 |
| adventurer_classes.active_skill, tree_skills | クラス独自のアクティブスキル(同じツリーのノード):active_skill は最初のスキル(根)の ID、tree_skills はツリーから伸びるスキルの ID(最大 12)。いずれも skills のスキル(summon 不可)で、その level に達し、requires に挙げたスキル(クラスのスキルの ID を最大 8、パッシブでもアクティブでも可。最初のスキルには不可)をすべて習得すると覚え、それぞれ自分の cooldown で待機する。active_skill がないクラスは基底クラスの最初のスキルを引き継ぐ |
| buildings.effect | 攻撃・回復・シールド・状態のスキル(召喚は不可)を、建物レベル 1–3 から 10–3600 ティックごとに発動。状態は重ならない |
| research | stat_modifier |
| castle_branches | 城の道:id、playable、buildings(建物の ID。ゲームのものでもプラグイン独自のものでも可)、effects と level3(効果名をキーにした数値。名前はゲーム標準の道と同じ)、specialities(なし、または 2 つ以上の {"id", "effects"})。標準の道と同じ ID の定義はその道を丸ごと置き換え、namespace:name 形式の ID は道を追加する(ゲームの道の後に並び、道を選べる場所ならどこでも選べる)。文言は言語キー branch_<id>, branch_<id>_desc, branch_<id>_price, branch_<id>_level3, branch_<id>_heroes と speciality_<id>_<speciality>。道が読み込まれなくなった王国は道を選んでいないものとして遊び、セーブには選択が残る |
| events | gold, enemy_wave, stat_buff |
| bosses | 1–8 phases; optional stats of its own (hp, attack, defense); a name starting i18n: is a translation key |
| skins | tiles, adventurer_classes, enemies, buildings, enemy_buildings; 外観のみ |
| assets by kind | adventurer_classes, enemies: animation_sheet / sprite, sound; buildings: sprite, icon; enemy_buildings: sprite; skills: skill_effect; skins tiles: sprite (不透明で描画); キャラクターのスキン:対象と同じ; それ以外のフィールドと、キャラクター以外の layout は使われず警告される |
| plugin art and sounds | 有効なすべてのパックで展開後の画像 256 MiB(幅 × 高さ × 4)、同じファイルは 1 回だけ数え、超えると組み込みの絵;プラグインの音はメモリに 64 MiB まで保持 |
| capabilities: assets, languages only | スキン(skins)と言語のみ。ほかの定義は拒否される |
| assets.animation_sheet | PNG: 24 columns × 5 rows |
| assets.sprite / icon / skill_effect | PNG; 8192 px/side, 16 million pixels |
| assets.sound | WAV; mono/stereo, ≤30 seconds |
| layout.anchor | [0–1, 0–1] |
| effect_frames | 1–64 |
| preview | <1 MiB |
| portable project | ≤2048 files; ≤64 MiB total; ≤16 MiB/file |
| map | ≤2048 tiles/side |
| campaign | レベルのマップ ≤127 枚 |
| spawn_enemies.action_params.count | 1–32 |
| spawn_enemies.action_params.march | castle / road |
| reveal.action_params.radius | 1–40 |
| post_bounty.action_params.reward | 1–99999 |
| post_bounty.action_params.deadline | 0–6000 ticks |
| adventurer_classes.profile.explore_range | 10–400 |
| adventurer_classes.profile.retreat_hp | 0.15–0.5 |
| adventurer_classes.profile: explore / hunt / steal / flags.* / errands.* | 0–3 |
{"id":"sample:grass","kind":"tiles","target":"GRASS", "assets":{"sprite":"assets/grass.png"}}ゲームバージョンの互換性
Section titled “ゲームバージョンの互換性”game_version は実行中のゲームのリリースバージョンに対する条件です。従来のプロジェクトも含め、"*" は受け付けます。特定の範囲は、ビルドが既知のセマンティックバージョンを宣言し、その範囲に一致する場合だけ受け付けます。それ以外は検証、読み込み、公開を拒否します。このリポジトリの game.build_info.GAME_VERSION は現在不明のため、リリースビルドが承認済みのバージョンを提供するまでは "*" を使用してください。プロジェクトの version や Steam ブランチ名はゲームバージョンの代わりにはなりません。