rpgmaker-mz-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +425 -0
- package/dist/events/commandBuilders.d.ts +405 -0
- package/dist/events/commandBuilders.d.ts.map +1 -0
- package/dist/events/commandBuilders.js +554 -0
- package/dist/events/commandBuilders.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +105 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +81 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +49 -0
- package/dist/registry.js.map +1 -0
- package/dist/tiles/autotile.d.ts +65 -0
- package/dist/tiles/autotile.d.ts.map +1 -0
- package/dist/tiles/autotile.js +201 -0
- package/dist/tiles/autotile.js.map +1 -0
- package/dist/tiles/catalog/dungeon.d.ts +16 -0
- package/dist/tiles/catalog/dungeon.d.ts.map +1 -0
- package/dist/tiles/catalog/dungeon.js +765 -0
- package/dist/tiles/catalog/dungeon.js.map +1 -0
- package/dist/tiles/catalog/index.d.ts +78 -0
- package/dist/tiles/catalog/index.d.ts.map +1 -0
- package/dist/tiles/catalog/index.js +115 -0
- package/dist/tiles/catalog/index.js.map +1 -0
- package/dist/tiles/catalog/inside.d.ts +16 -0
- package/dist/tiles/catalog/inside.d.ts.map +1 -0
- package/dist/tiles/catalog/inside.js +765 -0
- package/dist/tiles/catalog/inside.js.map +1 -0
- package/dist/tiles/catalog/outside.d.ts +16 -0
- package/dist/tiles/catalog/outside.d.ts.map +1 -0
- package/dist/tiles/catalog/outside.js +799 -0
- package/dist/tiles/catalog/outside.js.map +1 -0
- package/dist/tiles/catalog/overworld.d.ts +16 -0
- package/dist/tiles/catalog/overworld.d.ts.map +1 -0
- package/dist/tiles/catalog/overworld.js +585 -0
- package/dist/tiles/catalog/overworld.js.map +1 -0
- package/dist/tiles/catalog/sf.d.ts +16 -0
- package/dist/tiles/catalog/sf.d.ts.map +1 -0
- package/dist/tiles/catalog/sf.js +1313 -0
- package/dist/tiles/catalog/sf.js.map +1 -0
- package/dist/tiles/paint.d.ts +20 -0
- package/dist/tiles/paint.d.ts.map +1 -0
- package/dist/tiles/paint.js +65 -0
- package/dist/tiles/paint.js.map +1 -0
- package/dist/tiles/png.d.ts +11 -0
- package/dist/tiles/png.d.ts.map +1 -0
- package/dist/tiles/png.js +180 -0
- package/dist/tiles/png.js.map +1 -0
- package/dist/tiles/tileCodec.d.ts +95 -0
- package/dist/tiles/tileCodec.d.ts.map +1 -0
- package/dist/tiles/tileCodec.js +186 -0
- package/dist/tiles/tileCodec.js.map +1 -0
- package/dist/tiles/tileFlags.d.ts +98 -0
- package/dist/tiles/tileFlags.d.ts.map +1 -0
- package/dist/tiles/tileFlags.js +129 -0
- package/dist/tiles/tileFlags.js.map +1 -0
- package/dist/tiles/tilegeom.d.ts +29 -0
- package/dist/tiles/tilegeom.d.ts.map +1 -0
- package/dist/tiles/tilegeom.js +111 -0
- package/dist/tiles/tilegeom.js.map +1 -0
- package/dist/tiles/transparency.d.ts +22 -0
- package/dist/tiles/transparency.d.ts.map +1 -0
- package/dist/tiles/transparency.js +59 -0
- package/dist/tiles/transparency.js.map +1 -0
- package/dist/tools/actorTools.d.ts +48 -0
- package/dist/tools/actorTools.d.ts.map +1 -0
- package/dist/tools/actorTools.js +154 -0
- package/dist/tools/actorTools.js.map +1 -0
- package/dist/tools/allTools.d.ts +8 -0
- package/dist/tools/allTools.d.ts.map +1 -0
- package/dist/tools/allTools.js +56 -0
- package/dist/tools/allTools.js.map +1 -0
- package/dist/tools/assetTools.d.ts +113 -0
- package/dist/tools/assetTools.d.ts.map +1 -0
- package/dist/tools/assetTools.js +97 -0
- package/dist/tools/assetTools.js.map +1 -0
- package/dist/tools/batchTools.d.ts +3 -0
- package/dist/tools/batchTools.d.ts.map +1 -0
- package/dist/tools/batchTools.js +138 -0
- package/dist/tools/batchTools.js.map +1 -0
- package/dist/tools/battleTools.d.ts +72 -0
- package/dist/tools/battleTools.d.ts.map +1 -0
- package/dist/tools/battleTools.js +322 -0
- package/dist/tools/battleTools.js.map +1 -0
- package/dist/tools/catalogTools.d.ts +3 -0
- package/dist/tools/catalogTools.d.ts.map +1 -0
- package/dist/tools/catalogTools.js +134 -0
- package/dist/tools/catalogTools.js.map +1 -0
- package/dist/tools/classTools.d.ts +85 -0
- package/dist/tools/classTools.d.ts.map +1 -0
- package/dist/tools/classTools.js +279 -0
- package/dist/tools/classTools.js.map +1 -0
- package/dist/tools/commonEventTools.d.ts +32 -0
- package/dist/tools/commonEventTools.d.ts.map +1 -0
- package/dist/tools/commonEventTools.js +150 -0
- package/dist/tools/commonEventTools.js.map +1 -0
- package/dist/tools/eventCommandTools.d.ts +37 -0
- package/dist/tools/eventCommandTools.d.ts.map +1 -0
- package/dist/tools/eventCommandTools.js +893 -0
- package/dist/tools/eventCommandTools.js.map +1 -0
- package/dist/tools/eventPageTools.d.ts +112 -0
- package/dist/tools/eventPageTools.d.ts.map +1 -0
- package/dist/tools/eventPageTools.js +597 -0
- package/dist/tools/eventPageTools.js.map +1 -0
- package/dist/tools/itemTools.d.ts +82 -0
- package/dist/tools/itemTools.d.ts.map +1 -0
- package/dist/tools/itemTools.js +380 -0
- package/dist/tools/itemTools.js.map +1 -0
- package/dist/tools/listTools.d.ts +58 -0
- package/dist/tools/listTools.d.ts.map +1 -0
- package/dist/tools/listTools.js +99 -0
- package/dist/tools/listTools.js.map +1 -0
- package/dist/tools/mapTools.d.ts +270 -0
- package/dist/tools/mapTools.d.ts.map +1 -0
- package/dist/tools/mapTools.js +1066 -0
- package/dist/tools/mapTools.js.map +1 -0
- package/dist/tools/moveTools.d.ts +43 -0
- package/dist/tools/moveTools.d.ts.map +1 -0
- package/dist/tools/moveTools.js +240 -0
- package/dist/tools/moveTools.js.map +1 -0
- package/dist/tools/objectTools.d.ts +12 -0
- package/dist/tools/objectTools.d.ts.map +1 -0
- package/dist/tools/objectTools.js +221 -0
- package/dist/tools/objectTools.js.map +1 -0
- package/dist/tools/paintTools.d.ts +3 -0
- package/dist/tools/paintTools.d.ts.map +1 -0
- package/dist/tools/paintTools.js +134 -0
- package/dist/tools/paintTools.js.map +1 -0
- package/dist/tools/pluginScanTools.d.ts +22 -0
- package/dist/tools/pluginScanTools.d.ts.map +1 -0
- package/dist/tools/pluginScanTools.js +119 -0
- package/dist/tools/pluginScanTools.js.map +1 -0
- package/dist/tools/pluginTools.d.ts +11 -0
- package/dist/tools/pluginTools.d.ts.map +1 -0
- package/dist/tools/pluginTools.js +63 -0
- package/dist/tools/pluginTools.js.map +1 -0
- package/dist/tools/projectTools.d.ts +11 -0
- package/dist/tools/projectTools.d.ts.map +1 -0
- package/dist/tools/projectTools.js +74 -0
- package/dist/tools/projectTools.js.map +1 -0
- package/dist/tools/skillTools.d.ts +83 -0
- package/dist/tools/skillTools.d.ts.map +1 -0
- package/dist/tools/skillTools.js +369 -0
- package/dist/tools/skillTools.js.map +1 -0
- package/dist/tools/stateTools.d.ts +28 -0
- package/dist/tools/stateTools.d.ts.map +1 -0
- package/dist/tools/stateTools.js +161 -0
- package/dist/tools/stateTools.js.map +1 -0
- package/dist/tools/systemTools.d.ts +86 -0
- package/dist/tools/systemTools.d.ts.map +1 -0
- package/dist/tools/systemTools.js +342 -0
- package/dist/tools/systemTools.js.map +1 -0
- package/dist/tools/tileTools.d.ts +9 -0
- package/dist/tools/tileTools.d.ts.map +1 -0
- package/dist/tools/tileTools.js +34 -0
- package/dist/tools/tileTools.js.map +1 -0
- package/dist/tools/tileTransparency.d.ts +40 -0
- package/dist/tools/tileTransparency.d.ts.map +1 -0
- package/dist/tools/tileTransparency.js +156 -0
- package/dist/tools/tileTransparency.js.map +1 -0
- package/dist/tools/tilesetTools.d.ts +23 -0
- package/dist/tools/tilesetTools.d.ts.map +1 -0
- package/dist/tools/tilesetTools.js +209 -0
- package/dist/tools/tilesetTools.js.map +1 -0
- package/dist/tools/validationTools.d.ts +50 -0
- package/dist/tools/validationTools.d.ts.map +1 -0
- package/dist/tools/validationTools.js +229 -0
- package/dist/tools/validationTools.js.map +1 -0
- package/dist/utils/commit.d.ts +62 -0
- package/dist/utils/commit.d.ts.map +1 -0
- package/dist/utils/commit.js +119 -0
- package/dist/utils/commit.js.map +1 -0
- package/dist/utils/fileHandler.d.ts +49 -0
- package/dist/utils/fileHandler.d.ts.map +1 -0
- package/dist/utils/fileHandler.js +137 -0
- package/dist/utils/fileHandler.js.map +1 -0
- package/dist/utils/records.d.ts +8 -0
- package/dist/utils/records.d.ts.map +1 -0
- package/dist/utils/records.js +10 -0
- package/dist/utils/records.js.map +1 -0
- package/dist/utils/types.d.ts +465 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +5 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/validation/assets.d.ts +53 -0
- package/dist/validation/assets.d.ts.map +1 -0
- package/dist/validation/assets.js +198 -0
- package/dist/validation/assets.js.map +1 -0
- package/dist/validation/createRefs.d.ts +37 -0
- package/dist/validation/createRefs.d.ts.map +1 -0
- package/dist/validation/createRefs.js +89 -0
- package/dist/validation/createRefs.js.map +1 -0
- package/dist/validation/eventCommands.d.ts +70 -0
- package/dist/validation/eventCommands.d.ts.map +1 -0
- package/dist/validation/eventCommands.js +273 -0
- package/dist/validation/eventCommands.js.map +1 -0
- package/dist/validation/gate.d.ts +56 -0
- package/dist/validation/gate.d.ts.map +1 -0
- package/dist/validation/gate.js +50 -0
- package/dist/validation/gate.js.map +1 -0
- package/dist/validation/moveCommands.d.ts +31 -0
- package/dist/validation/moveCommands.d.ts.map +1 -0
- package/dist/validation/moveCommands.js +123 -0
- package/dist/validation/moveCommands.js.map +1 -0
- package/dist/validation/pluginCommands.d.ts +83 -0
- package/dist/validation/pluginCommands.d.ts.map +1 -0
- package/dist/validation/pluginCommands.js +134 -0
- package/dist/validation/pluginCommands.js.map +1 -0
- package/dist/validation/pluginManifest.d.ts +67 -0
- package/dist/validation/pluginManifest.d.ts.map +1 -0
- package/dist/validation/pluginManifest.js +199 -0
- package/dist/validation/pluginManifest.js.map +1 -0
- package/dist/validation/references.d.ts +57 -0
- package/dist/validation/references.d.ts.map +1 -0
- package/dist/validation/references.js +314 -0
- package/dist/validation/references.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Enemy, Troop, TroopMember, TroopPage } from '../utils/types.js';
|
|
2
|
+
import { ToolDefinition } from '../registry.js';
|
|
3
|
+
import { ValidationWarning } from '../validation/eventCommands.js';
|
|
4
|
+
import { PreCommit } from '../validation/gate.js';
|
|
5
|
+
/**
|
|
6
|
+
* Blank enemy mirroring what the RPG Maker MZ editor writes for a freshly-created
|
|
7
|
+
* enemy: 100 HP, one "Attack" action, three empty drop slots, no traits. Pure so
|
|
8
|
+
* the template shape can be unit-tested. `params` order is
|
|
9
|
+
* [mhp, mmp, atk, def, mat, mdf, agi, luk].
|
|
10
|
+
*/
|
|
11
|
+
export declare function defaultEnemy(): Omit<Enemy, 'id'>;
|
|
12
|
+
/**
|
|
13
|
+
* A blank troop battle-event page matching the editor's default: a "span whole
|
|
14
|
+
* battle" page with an empty (just the code-0 end marker) command list and the
|
|
15
|
+
* editor's default condition values (all toggles off).
|
|
16
|
+
*/
|
|
17
|
+
export declare function blankTroopPage(): TroopPage;
|
|
18
|
+
/**
|
|
19
|
+
* Warn (never throw) when an enemy's `battlerName` isn't among the project's
|
|
20
|
+
* `img/enemies` assets — a wrong battler filename is a silent runtime failure (a
|
|
21
|
+
* blank/missing sprite in battle). Skips the check when the name is empty or the
|
|
22
|
+
* asset dir is empty/missing (nothing to validate against — e.g. a fixture), so it
|
|
23
|
+
* can't emit false positives. Mirrors `characterNameWarnings` (eventPageTools) and
|
|
24
|
+
* `audioNameWarnings` (eventCommandTools).
|
|
25
|
+
*/
|
|
26
|
+
export declare function battlerNameWarnings(projectPath: string, name: string | undefined): Promise<ValidationWarning[]>;
|
|
27
|
+
/** Get all enemies from the project. */
|
|
28
|
+
export declare function getEnemies(projectPath: string): Promise<(Enemy | null)[]>;
|
|
29
|
+
/** Search enemies by name (case-insensitive). */
|
|
30
|
+
export declare function searchEnemies(projectPath: string, searchTerm: string): Promise<Enemy[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Build one new enemy record against the current array — the shared per-record
|
|
33
|
+
* source of truth for both `create_enemy` and `batch_create`. Pure: template
|
|
34
|
+
* first, caller's defined fields next, computed id last so it always wins. Does
|
|
35
|
+
* not push, commit, or run the reference check (that needs cross-file reads).
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildEnemyRecord(existing: (Enemy | null)[], input: Partial<Omit<Enemy, 'id'>>): Enemy;
|
|
38
|
+
/**
|
|
39
|
+
* Reject an enemy whose actions/drops point at a non-existent db record (P2-3:
|
|
40
|
+
* throw at author time, matching create_troop's member.enemyId check). The
|
|
41
|
+
* battlerName stays a *warning* (an asset filename, not a db id). Shared by
|
|
42
|
+
* `create_enemy` and `batch_create`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function assertEnemyRefs(projectPath: string, enemy: Enemy): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Create a new enemy. Only `name` is required; any omitted field falls back to
|
|
47
|
+
* the editor's new-enemy default (see {@link defaultEnemy}). Allocates the next
|
|
48
|
+
* unused id (max existing + 1) and writes through the commit choke point.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createEnemy(projectPath: string, overrides: Partial<Omit<Enemy, 'id'>>): Promise<Enemy>;
|
|
51
|
+
/** Update an existing enemy's properties (shallow merge). */
|
|
52
|
+
export declare function updateEnemy(projectPath: string, enemyId: number, updates: Partial<Enemy>): Promise<Enemy>;
|
|
53
|
+
/** Get all troops from the project. */
|
|
54
|
+
export declare function getTroops(projectPath: string): Promise<(Troop | null)[]>;
|
|
55
|
+
/** Search troops by name (case-insensitive). */
|
|
56
|
+
export declare function searchTroops(projectPath: string, searchTerm: string): Promise<Troop[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Create a new troop. `name` is required; `members` defaults to empty and `pages`
|
|
59
|
+
* to a single blank battle-event page. Validates that each member references an
|
|
60
|
+
* existing enemy, allocates the next unused id, and writes through the commit
|
|
61
|
+
* choke point. The `precommit` hook (see `validation/gate.ts`) runs on the built
|
|
62
|
+
* troop just before the write, so a structurally invalid page can refuse it.
|
|
63
|
+
*/
|
|
64
|
+
export declare function createTroop(projectPath: string, options: {
|
|
65
|
+
name: string;
|
|
66
|
+
members?: TroopMember[];
|
|
67
|
+
pages?: TroopPage[];
|
|
68
|
+
}, precommit?: PreCommit<Troop>): Promise<Troop>;
|
|
69
|
+
/** Update an existing troop's properties (shallow merge). */
|
|
70
|
+
export declare function updateTroop(projectPath: string, troopId: number, updates: Partial<Troop>, precommit?: PreCommit<Troop>): Promise<Troop>;
|
|
71
|
+
export declare const battleToolDefinitions: ToolDefinition[];
|
|
72
|
+
//# sourceMappingURL=battleTools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"battleTools.d.ts","sourceRoot":"","sources":["../../src/tools/battleTools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAuB,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxF,OAAO,EAAE,SAAS,EAAa,MAAM,uBAAuB,CAAC;AAI7D;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAiBhD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,SAAS,CAmB1C;AAoBD;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAM9B;AAaD,wCAAwC;AACxC,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAE/E;AAED,iDAAiD;AACjD,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAI7F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAC1B,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,GAChC,KAAK,CAOP;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAWtF;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,GACpC,OAAO,CAAC,KAAK,CAAC,CAShB;AAED,6DAA6D;AAC7D,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GACtB,OAAO,CAAC,KAAK,CAAC,CAUhB;AAID,uCAAuC;AACvC,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAE9E;AAED,gDAAgD;AAChD,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAI5F;AAoBD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAA;CAAE,EACvE,SAAS,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,GAC3B,OAAO,CAAC,KAAK,CAAC,CAoBhB;AAED,6DAA6D;AAC7D,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EACvB,SAAS,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,GAC3B,OAAO,CAAC,KAAK,CAAC,CAkBhB;AASD,eAAO,MAAM,qBAAqB,EAAE,cAAc,EAsGjD,CAAC"}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { readJsonFile, readJsonArraySoft, getDataPath } from '../utils/fileHandler.js';
|
|
3
|
+
import { commitChange } from '../utils/commit.js';
|
|
4
|
+
import { definedOnly } from '../utils/records.js';
|
|
5
|
+
import { validateCommandList } from '../validation/eventCommands.js';
|
|
6
|
+
import { writeGate } from '../validation/gate.js';
|
|
7
|
+
import { firstMissingEnemyRef } from '../validation/createRefs.js';
|
|
8
|
+
import { assetNameWarning } from './assetTools.js';
|
|
9
|
+
/**
|
|
10
|
+
* Blank enemy mirroring what the RPG Maker MZ editor writes for a freshly-created
|
|
11
|
+
* enemy: 100 HP, one "Attack" action, three empty drop slots, no traits. Pure so
|
|
12
|
+
* the template shape can be unit-tested. `params` order is
|
|
13
|
+
* [mhp, mmp, atk, def, mat, mdf, agi, luk].
|
|
14
|
+
*/
|
|
15
|
+
export function defaultEnemy() {
|
|
16
|
+
return {
|
|
17
|
+
name: '',
|
|
18
|
+
battlerName: '',
|
|
19
|
+
battlerHue: 0,
|
|
20
|
+
params: [100, 0, 10, 10, 10, 10, 10, 10],
|
|
21
|
+
exp: 0,
|
|
22
|
+
gold: 0,
|
|
23
|
+
dropItems: [
|
|
24
|
+
{ kind: 0, dataId: 1, denominator: 1 },
|
|
25
|
+
{ kind: 0, dataId: 1, denominator: 1 },
|
|
26
|
+
{ kind: 0, dataId: 1, denominator: 1 },
|
|
27
|
+
],
|
|
28
|
+
actions: [{ conditionParam1: 0, conditionParam2: 0, conditionType: 0, rating: 5, skillId: 1 }],
|
|
29
|
+
traits: [],
|
|
30
|
+
note: '',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A blank troop battle-event page matching the editor's default: a "span whole
|
|
35
|
+
* battle" page with an empty (just the code-0 end marker) command list and the
|
|
36
|
+
* editor's default condition values (all toggles off).
|
|
37
|
+
*/
|
|
38
|
+
export function blankTroopPage() {
|
|
39
|
+
return {
|
|
40
|
+
conditions: {
|
|
41
|
+
actorHp: 50,
|
|
42
|
+
actorId: 1,
|
|
43
|
+
actorValid: false,
|
|
44
|
+
enemyHp: 50,
|
|
45
|
+
enemyIndex: 0,
|
|
46
|
+
enemyValid: false,
|
|
47
|
+
switchId: 1,
|
|
48
|
+
switchValid: false,
|
|
49
|
+
turnA: 0,
|
|
50
|
+
turnB: 0,
|
|
51
|
+
turnEnding: false,
|
|
52
|
+
turnValid: false,
|
|
53
|
+
},
|
|
54
|
+
list: [{ code: 0, indent: 0, parameters: [] }],
|
|
55
|
+
span: 0,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The pre-commit gate the troop-writing tools install. A troop's pages reuse the
|
|
60
|
+
* event-command `list` format, so the same command validator applies — and, as
|
|
61
|
+
* with map events, a structurally invalid page is refused before the write
|
|
62
|
+
* rather than saved and warned about.
|
|
63
|
+
*/
|
|
64
|
+
function troopWriteGate(force) {
|
|
65
|
+
return writeGate(force, 'troop', (troop) => {
|
|
66
|
+
const warnings = [];
|
|
67
|
+
if (Array.isArray(troop.pages)) {
|
|
68
|
+
troop.pages.forEach((page, i) => {
|
|
69
|
+
warnings.push(...validateCommandList(page?.list, `troop ${troop.id} / page ${i}`));
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return warnings;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Warn (never throw) when an enemy's `battlerName` isn't among the project's
|
|
77
|
+
* `img/enemies` assets — a wrong battler filename is a silent runtime failure (a
|
|
78
|
+
* blank/missing sprite in battle). Skips the check when the name is empty or the
|
|
79
|
+
* asset dir is empty/missing (nothing to validate against — e.g. a fixture), so it
|
|
80
|
+
* can't emit false positives. Mirrors `characterNameWarnings` (eventPageTools) and
|
|
81
|
+
* `audioNameWarnings` (eventCommandTools).
|
|
82
|
+
*/
|
|
83
|
+
export async function battlerNameWarnings(projectPath, name) {
|
|
84
|
+
return assetNameWarning(projectPath, 'enemies', name, {
|
|
85
|
+
path: 'battlerName',
|
|
86
|
+
label: 'battler',
|
|
87
|
+
consequence: 'a wrong filename shows a blank sprite in battle',
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/** Attach warn-by-default battler-asset validation to an enemy-write response. */
|
|
91
|
+
async function withEnemyAssetWarnings(projectPath, enemy) {
|
|
92
|
+
const warnings = await battlerNameWarnings(projectPath, enemy.battlerName);
|
|
93
|
+
return warnings.length > 0 ? { enemy, warnings } : { enemy };
|
|
94
|
+
}
|
|
95
|
+
// --- Enemies ---------------------------------------------------------------
|
|
96
|
+
/** Get all enemies from the project. */
|
|
97
|
+
export async function getEnemies(projectPath) {
|
|
98
|
+
return await readJsonFile(getDataPath(projectPath, 'Enemies.json'));
|
|
99
|
+
}
|
|
100
|
+
/** Search enemies by name (case-insensitive). */
|
|
101
|
+
export async function searchEnemies(projectPath, searchTerm) {
|
|
102
|
+
const enemies = await getEnemies(projectPath);
|
|
103
|
+
const lower = searchTerm.toLowerCase();
|
|
104
|
+
return enemies.filter((e) => !!e && e.name.toLowerCase().includes(lower));
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Build one new enemy record against the current array — the shared per-record
|
|
108
|
+
* source of truth for both `create_enemy` and `batch_create`. Pure: template
|
|
109
|
+
* first, caller's defined fields next, computed id last so it always wins. Does
|
|
110
|
+
* not push, commit, or run the reference check (that needs cross-file reads).
|
|
111
|
+
*/
|
|
112
|
+
export function buildEnemyRecord(existing, input) {
|
|
113
|
+
const maxId = existing.reduce((max, e) => (e && e.id > max ? e.id : max), 0);
|
|
114
|
+
return {
|
|
115
|
+
...defaultEnemy(),
|
|
116
|
+
...definedOnly(input),
|
|
117
|
+
id: maxId + 1,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Reject an enemy whose actions/drops point at a non-existent db record (P2-3:
|
|
122
|
+
* throw at author time, matching create_troop's member.enemyId check). The
|
|
123
|
+
* battlerName stays a *warning* (an asset filename, not a db id). Shared by
|
|
124
|
+
* `create_enemy` and `batch_create`.
|
|
125
|
+
*/
|
|
126
|
+
export async function assertEnemyRefs(projectPath, enemy) {
|
|
127
|
+
const [skills, items, weapons, armors] = await Promise.all([
|
|
128
|
+
readJsonArraySoft(getDataPath(projectPath, 'Skills.json')),
|
|
129
|
+
readJsonArraySoft(getDataPath(projectPath, 'Items.json')),
|
|
130
|
+
readJsonArraySoft(getDataPath(projectPath, 'Weapons.json')),
|
|
131
|
+
readJsonArraySoft(getDataPath(projectPath, 'Armors.json')),
|
|
132
|
+
]);
|
|
133
|
+
const missing = firstMissingEnemyRef(enemy, { skills, items, weapons, armors });
|
|
134
|
+
if (missing) {
|
|
135
|
+
throw new Error(`Cannot create enemy "${enemy.name}": ${missing}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Create a new enemy. Only `name` is required; any omitted field falls back to
|
|
140
|
+
* the editor's new-enemy default (see {@link defaultEnemy}). Allocates the next
|
|
141
|
+
* unused id (max existing + 1) and writes through the commit choke point.
|
|
142
|
+
*/
|
|
143
|
+
export async function createEnemy(projectPath, overrides) {
|
|
144
|
+
const enemies = await getEnemies(projectPath);
|
|
145
|
+
const enemy = buildEnemyRecord(enemies, overrides);
|
|
146
|
+
await assertEnemyRefs(projectPath, enemy);
|
|
147
|
+
enemies.push(enemy);
|
|
148
|
+
await commitChange(getDataPath(projectPath, 'Enemies.json'), enemies);
|
|
149
|
+
return enemy;
|
|
150
|
+
}
|
|
151
|
+
/** Update an existing enemy's properties (shallow merge). */
|
|
152
|
+
export async function updateEnemy(projectPath, enemyId, updates) {
|
|
153
|
+
const enemies = await getEnemies(projectPath);
|
|
154
|
+
const index = enemies.findIndex((e) => e && e.id === enemyId);
|
|
155
|
+
if (index === -1) {
|
|
156
|
+
throw new Error(`Enemy with ID ${enemyId} not found`);
|
|
157
|
+
}
|
|
158
|
+
enemies[index] = { ...enemies[index], ...updates, id: enemyId };
|
|
159
|
+
await commitChange(getDataPath(projectPath, 'Enemies.json'), enemies);
|
|
160
|
+
return enemies[index];
|
|
161
|
+
}
|
|
162
|
+
// --- Troops ----------------------------------------------------------------
|
|
163
|
+
/** Get all troops from the project. */
|
|
164
|
+
export async function getTroops(projectPath) {
|
|
165
|
+
return await readJsonFile(getDataPath(projectPath, 'Troops.json'));
|
|
166
|
+
}
|
|
167
|
+
/** Search troops by name (case-insensitive). */
|
|
168
|
+
export async function searchTroops(projectPath, searchTerm) {
|
|
169
|
+
const troops = await getTroops(projectPath);
|
|
170
|
+
const lower = searchTerm.toLowerCase();
|
|
171
|
+
return troops.filter((t) => !!t && t.name.toLowerCase().includes(lower));
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Assert every troop member references an enemy that exists in Enemies.json, so a
|
|
175
|
+
* troop can't be created pointing at a non-existent enemy (mirrors create_map's
|
|
176
|
+
* parent check). Structural error → throws.
|
|
177
|
+
*/
|
|
178
|
+
async function assertMembersReferenceEnemies(projectPath, members) {
|
|
179
|
+
if (members.length === 0)
|
|
180
|
+
return;
|
|
181
|
+
const enemies = await getEnemies(projectPath);
|
|
182
|
+
for (const member of members) {
|
|
183
|
+
if (!enemies.some((e) => e && e.id === member.enemyId)) {
|
|
184
|
+
throw new Error(`Troop member references enemyId ${member.enemyId}, which does not exist`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Create a new troop. `name` is required; `members` defaults to empty and `pages`
|
|
190
|
+
* to a single blank battle-event page. Validates that each member references an
|
|
191
|
+
* existing enemy, allocates the next unused id, and writes through the commit
|
|
192
|
+
* choke point. The `precommit` hook (see `validation/gate.ts`) runs on the built
|
|
193
|
+
* troop just before the write, so a structurally invalid page can refuse it.
|
|
194
|
+
*/
|
|
195
|
+
export async function createTroop(projectPath, options, precommit) {
|
|
196
|
+
const members = options.members ?? [];
|
|
197
|
+
await assertMembersReferenceEnemies(projectPath, members);
|
|
198
|
+
const troops = await getTroops(projectPath);
|
|
199
|
+
const maxId = troops.reduce((max, t) => (t && t.id > max ? t.id : max), 0);
|
|
200
|
+
const troop = {
|
|
201
|
+
id: maxId + 1,
|
|
202
|
+
name: options.name,
|
|
203
|
+
members,
|
|
204
|
+
pages: options.pages ?? [blankTroopPage()],
|
|
205
|
+
};
|
|
206
|
+
troops.push(troop);
|
|
207
|
+
await precommit?.(troop);
|
|
208
|
+
await commitChange(getDataPath(projectPath, 'Troops.json'), troops);
|
|
209
|
+
return troop;
|
|
210
|
+
}
|
|
211
|
+
/** Update an existing troop's properties (shallow merge). */
|
|
212
|
+
export async function updateTroop(projectPath, troopId, updates, precommit) {
|
|
213
|
+
const troops = await getTroops(projectPath);
|
|
214
|
+
const index = troops.findIndex((t) => t && t.id === troopId);
|
|
215
|
+
if (index === -1) {
|
|
216
|
+
throw new Error(`Troop with ID ${troopId} not found`);
|
|
217
|
+
}
|
|
218
|
+
const merged = { ...troops[index], ...updates, id: troopId };
|
|
219
|
+
if (updates.members) {
|
|
220
|
+
await assertMembersReferenceEnemies(projectPath, merged.members);
|
|
221
|
+
}
|
|
222
|
+
troops[index] = merged;
|
|
223
|
+
await precommit?.(merged);
|
|
224
|
+
await commitChange(getDataPath(projectPath, 'Troops.json'), troops);
|
|
225
|
+
return merged;
|
|
226
|
+
}
|
|
227
|
+
const troopMemberSchema = z.object({
|
|
228
|
+
enemyId: z.number().int().describe('Enemy id from Enemies.json'),
|
|
229
|
+
x: z.number().int().describe('X screen position of the enemy in battle'),
|
|
230
|
+
y: z.number().int().describe('Y screen position of the enemy in battle'),
|
|
231
|
+
hidden: z.boolean().optional().default(false).describe('Whether the enemy starts hidden'),
|
|
232
|
+
});
|
|
233
|
+
export const battleToolDefinitions = [
|
|
234
|
+
{
|
|
235
|
+
name: 'create_enemy',
|
|
236
|
+
mutates: true,
|
|
237
|
+
description: "Create a new enemy in data/Enemies.json. Only `name` is required; omitted fields use the editor's new-enemy defaults (100 HP, one Attack action, no drops). Allocates the next unused enemy id and returns `{ enemy, warnings? }` (warn-by-default: a `battlerName` not found in img/enemies is flagged, never blocked). Throws if an `actions[].skillId` or a `dropItems[].dataId` (item/weapon/armor by `kind`) references a record that does not exist. NOTE: an enemy with no Hit Rate trait (xparam id 0: trait { code: 22, dataId: 0, value: 0.95 }) always misses physical actions — pass one in `traits` if the enemy should land basic attacks.",
|
|
238
|
+
inputSchema: {
|
|
239
|
+
name: z.string().describe('Enemy name shown in battle and the database'),
|
|
240
|
+
battlerName: z.string().optional().describe('Battler graphic filename (img/enemies)'),
|
|
241
|
+
battlerHue: z.number().int().optional().describe('Battler hue rotation 0-360'),
|
|
242
|
+
params: z
|
|
243
|
+
.array(z.number())
|
|
244
|
+
.length(8)
|
|
245
|
+
.optional()
|
|
246
|
+
.describe('8 base params: [maxHP, maxMP, atk, def, mat, mdf, agi, luk]'),
|
|
247
|
+
exp: z.number().int().optional().describe('EXP granted when defeated'),
|
|
248
|
+
gold: z.number().int().optional().describe('Gold granted when defeated'),
|
|
249
|
+
note: z.string().optional().describe('Note field'),
|
|
250
|
+
traits: z.array(z.unknown()).optional().describe('Trait objects { code, dataId, value }'),
|
|
251
|
+
dropItems: z
|
|
252
|
+
.array(z.unknown())
|
|
253
|
+
.optional()
|
|
254
|
+
.describe('Drop-item objects { kind, dataId, denominator }'),
|
|
255
|
+
actions: z
|
|
256
|
+
.array(z.unknown())
|
|
257
|
+
.optional()
|
|
258
|
+
.describe('Action patterns { skillId, conditionType, conditionParam1, conditionParam2, rating }'),
|
|
259
|
+
},
|
|
260
|
+
handler: async (ctx, args) => {
|
|
261
|
+
const { dryRun: _dryRun, ...overrides } = args;
|
|
262
|
+
const enemy = await createEnemy(ctx.projectPath, overrides);
|
|
263
|
+
return withEnemyAssetWarnings(ctx.projectPath, enemy);
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
name: 'update_enemy',
|
|
268
|
+
mutates: true,
|
|
269
|
+
description: "Update an enemy's properties (shallow merge into the existing record). Returns `{ enemy, warnings? }` — a `battlerName` not found in img/enemies is flagged warn-by-default.",
|
|
270
|
+
inputSchema: {
|
|
271
|
+
enemyId: z.number().int().positive().describe('The ID of the enemy to update'),
|
|
272
|
+
updates: z
|
|
273
|
+
.record(z.string(), z.unknown())
|
|
274
|
+
.describe('Object containing enemy properties to update'),
|
|
275
|
+
},
|
|
276
|
+
handler: async (ctx, args) => withEnemyAssetWarnings(ctx.projectPath, await updateEnemy(ctx.projectPath, args.enemyId, args.updates)),
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
name: 'create_troop',
|
|
280
|
+
mutates: true,
|
|
281
|
+
forceable: true,
|
|
282
|
+
description: 'Create a new troop (enemy battle group) in data/Troops.json. `name` is required; `members` defaults to empty and `pages` to one blank battle-event page. Every member.enemyId must reference an existing enemy. A structurally invalid battle-event page refuses the write (nothing is saved) — pass force: true to override.',
|
|
283
|
+
inputSchema: {
|
|
284
|
+
name: z.string().describe('Troop name shown in the database'),
|
|
285
|
+
members: z
|
|
286
|
+
.array(troopMemberSchema)
|
|
287
|
+
.optional()
|
|
288
|
+
.describe('Placed enemies; each references an existing enemyId'),
|
|
289
|
+
pages: z
|
|
290
|
+
.array(z.unknown())
|
|
291
|
+
.optional()
|
|
292
|
+
.describe('Battle-event pages { conditions, list, span }; defaults to one blank page'),
|
|
293
|
+
},
|
|
294
|
+
handler: async (ctx, args) => {
|
|
295
|
+
const gate = troopWriteGate(args.force);
|
|
296
|
+
const troop = await createTroop(ctx.projectPath, {
|
|
297
|
+
name: args.name,
|
|
298
|
+
members: args.members,
|
|
299
|
+
pages: args.pages,
|
|
300
|
+
}, gate.precommit);
|
|
301
|
+
return gate.respond({ troop });
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
name: 'update_troop',
|
|
306
|
+
mutates: true,
|
|
307
|
+
forceable: true,
|
|
308
|
+
description: "Update a troop's properties (shallow merge). If `members` is provided, each enemyId is validated to exist. A structurally invalid battle-event page refuses the write (nothing is saved) — pass force: true to override.",
|
|
309
|
+
inputSchema: {
|
|
310
|
+
troopId: z.number().int().positive().describe('The ID of the troop to update'),
|
|
311
|
+
updates: z
|
|
312
|
+
.record(z.string(), z.unknown())
|
|
313
|
+
.describe('Object containing troop properties to update (name, members, pages)'),
|
|
314
|
+
},
|
|
315
|
+
handler: async (ctx, args) => {
|
|
316
|
+
const gate = troopWriteGate(args.force);
|
|
317
|
+
const troop = await updateTroop(ctx.projectPath, args.troopId, args.updates, gate.precommit);
|
|
318
|
+
return gate.respond({ troop });
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
];
|
|
322
|
+
//# sourceMappingURL=battleTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"battleTools.js","sourceRoot":"","sources":["../../src/tools/battleTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalogTools.d.ts","sourceRoot":"","sources":["../../src/tools/catalogTools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAgFhD,eAAO,MAAM,sBAAsB,EAAE,cAAc,EA8ElD,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getDataPath, readJsonFile, listFiles, fileExists } from '../utils/fileHandler.js';
|
|
4
|
+
import { catalogForTileset, findTiles, hasCatalog, } from '../tiles/catalog/index.js';
|
|
5
|
+
import { annotateTransparency } from './tileTransparency.js';
|
|
6
|
+
/** Load one tileset from the project's data/Tilesets.json (1-indexed, slot 0 null). */
|
|
7
|
+
async function getTileset(projectPath, tilesetId) {
|
|
8
|
+
const tilesets = await readJsonFile(getDataPath(projectPath, 'Tilesets.json'));
|
|
9
|
+
const tileset = tilesets[tilesetId];
|
|
10
|
+
if (!tileset) {
|
|
11
|
+
throw new Error(`Tileset ${tilesetId} not found`);
|
|
12
|
+
}
|
|
13
|
+
return tileset;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load project-scoped tile catalogs from `data/tilecatalog/*.json` (written by the
|
|
17
|
+
* 3f vision-bootstrap skill) into an overlay keyed by sheet filename. Each file's
|
|
18
|
+
* `entries` (local index → { name, description?, confidence?, manual? }) becomes a
|
|
19
|
+
* tiles-by-index array, carrying through the draft metadata so the tools can
|
|
20
|
+
* surface it. A missing directory or an unreadable file yields no overlay for that
|
|
21
|
+
* sheet — the catalog gracefully falls back to built-in names. Returns `undefined`
|
|
22
|
+
* when there are no project catalogs at all (so callers pass nothing to the pure
|
|
23
|
+
* resolver).
|
|
24
|
+
*/
|
|
25
|
+
async function loadProjectCatalogs(projectPath) {
|
|
26
|
+
const dir = join(projectPath, 'data', 'tilecatalog');
|
|
27
|
+
if (!(await fileExists(dir)))
|
|
28
|
+
return undefined;
|
|
29
|
+
let files;
|
|
30
|
+
try {
|
|
31
|
+
files = await listFiles(dir, '.json');
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
const overlay = {};
|
|
37
|
+
for (const file of files) {
|
|
38
|
+
try {
|
|
39
|
+
const data = await readJsonFile(join(dir, file));
|
|
40
|
+
if (!data.sheet || !data.entries)
|
|
41
|
+
continue;
|
|
42
|
+
// Sparse array keyed by local index — forEach in the resolver skips the
|
|
43
|
+
// holes, so gaps don't need filling and index alignment is preserved.
|
|
44
|
+
const tiles = [];
|
|
45
|
+
for (const [idx, entry] of Object.entries(data.entries)) {
|
|
46
|
+
const i = Number(idx);
|
|
47
|
+
if (Number.isInteger(i) && i >= 0 && entry?.name) {
|
|
48
|
+
tiles[i] = {
|
|
49
|
+
name: entry.name,
|
|
50
|
+
...(entry.description ? { description: entry.description } : {}),
|
|
51
|
+
...(entry.confidence ? { confidence: entry.confidence } : {}),
|
|
52
|
+
...(entry.manual !== undefined ? { manual: entry.manual } : {}),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
overlay[data.sheet] = tiles;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Skip a malformed catalog file rather than failing the whole lookup.
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return Object.keys(overlay).length ? overlay : undefined;
|
|
64
|
+
}
|
|
65
|
+
export const catalogToolDefinitions = [
|
|
66
|
+
{
|
|
67
|
+
name: 'get_tile_catalog',
|
|
68
|
+
description: "Get the semantic tile catalog for a tileset: the named tiles (e.g. 'Grassland A', 'Forest', 'Sea') in each of its image sheets, each with its representative tile id and a `source` ('builtin' = RPG Maker's own labels; 'project' = a draft name from the vision-bootstrap skill). Project (custom-sheet) entries also carry the skill's `description`, `confidence` ('high'/'medium'/'low'), and `manual` (true = a human verified it) so you can gauge how trustworthy a draft name is. Autotile entries (A1–A4) return the kind's base tile id — feed it to a paint command, which recomputes the shape from neighbours. Covers the default Overworld tileset (World_A1/A2/B/C) plus any custom sheets cataloged into data/tilecatalog/ (via the tileset-catalog skill); still-uncovered sheets are omitted. **Called WITHOUT `sheet` it returns only a per-sheet index (name + entry count) to stay within the tool-output limit — a full tileset can hold thousands of named tiles. Pass `sheet` (filename 'World_A2' or slot role 'A2') to list one sheet's actual tile entries.** Sheet-filtered entries also carry `transparent` (true = the tile is see-through and needs an opaque base tile on a lower layer — painting it on layer 0 alone shows the map void; e.g. trees/objects/overlays). Read-only.",
|
|
69
|
+
inputSchema: {
|
|
70
|
+
tilesetId: z.number().int().positive().describe('Tileset id (from Tilesets.json / the map)'),
|
|
71
|
+
sheet: z
|
|
72
|
+
.string()
|
|
73
|
+
.optional()
|
|
74
|
+
.describe("Restrict to one sheet by filename ('World_A2') or role ('A2'). Omit to get a per-sheet summary (counts only) instead of every entry."),
|
|
75
|
+
},
|
|
76
|
+
handler: async (ctx, args) => {
|
|
77
|
+
const tileset = await getTileset(ctx.projectPath, args.tilesetId);
|
|
78
|
+
const overlay = await loadProjectCatalogs(ctx.projectPath);
|
|
79
|
+
const cataloged = hasCatalog(tileset.tilesetNames, overlay);
|
|
80
|
+
const entries = catalogForTileset(tileset.tilesetNames, args.sheet, overlay);
|
|
81
|
+
// Without a `sheet` filter, the full entry list can blow past the tool-output
|
|
82
|
+
// token limit (a default tileset holds thousands of named tiles). Return a
|
|
83
|
+
// per-sheet index instead, so the caller can pick a sheet to expand.
|
|
84
|
+
if (!args.sheet) {
|
|
85
|
+
const bySheet = new Map();
|
|
86
|
+
for (const e of entries) {
|
|
87
|
+
const summary = bySheet.get(e.sheet);
|
|
88
|
+
if (summary)
|
|
89
|
+
summary.count++;
|
|
90
|
+
else
|
|
91
|
+
bySheet.set(e.sheet, { sheet: e.sheet, role: e.role, source: e.source, count: 1 });
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
tilesetId: args.tilesetId,
|
|
95
|
+
tilesetName: tileset.name,
|
|
96
|
+
cataloged,
|
|
97
|
+
summary: true,
|
|
98
|
+
totalEntries: entries.length,
|
|
99
|
+
sheets: [...bySheet.values()],
|
|
100
|
+
hint: "Per-sheet index only. Call again with `sheet` (filename or role, e.g. 'A2') to list that sheet's tile entries.",
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// A single sheet's entries are bounded — annotate each with its
|
|
104
|
+
// transparency (needs-a-base) flag by reading the sheet PNG.
|
|
105
|
+
await annotateTransparency(ctx.projectPath, tileset, entries);
|
|
106
|
+
return {
|
|
107
|
+
tilesetId: args.tilesetId,
|
|
108
|
+
tilesetName: tileset.name,
|
|
109
|
+
cataloged,
|
|
110
|
+
sheet: args.sheet,
|
|
111
|
+
count: entries.length,
|
|
112
|
+
entries,
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: 'find_tile',
|
|
118
|
+
description: "Find tiles in a tileset by a case-insensitive SUBSTRING match on their catalog name — a quick bridge from a name fragment like 'grass' or 'forest' to a paintable tile id. This is a literal substring match, NOT synonym/semantic search: 'water' matches 'Endless Waterfall' but not 'Sea' or 'Pond' (their names lack the substring). To browse the actual tile names first, use get_tile_catalog with a `sheet` filter, then search a fragment you see. Returns matching catalog entries (name, sheet, tile id, autotile kind, `source`, `transparent` [true = needs an opaque base on a lower layer], plus `description`/`confidence`/`manual` for project catalog drafts). Covers the default Overworld tileset plus custom sheets cataloged into data/tilecatalog/ (via the tileset-catalog skill). Read-only.",
|
|
119
|
+
inputSchema: {
|
|
120
|
+
tilesetId: z.number().int().positive().describe('Tileset id (from Tilesets.json / the map)'),
|
|
121
|
+
query: z
|
|
122
|
+
.string()
|
|
123
|
+
.describe("Name substring to match, e.g. 'grass' or 'forest' (literal substring, no synonyms)"),
|
|
124
|
+
},
|
|
125
|
+
handler: async (ctx, args) => {
|
|
126
|
+
const tileset = await getTileset(ctx.projectPath, args.tilesetId);
|
|
127
|
+
const overlay = await loadProjectCatalogs(ctx.projectPath);
|
|
128
|
+
const matches = findTiles(tileset.tilesetNames, args.query, overlay);
|
|
129
|
+
await annotateTransparency(ctx.projectPath, tileset, matches);
|
|
130
|
+
return { tilesetId: args.tilesetId, query: args.query, count: matches.length, matches };
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
];
|
|
134
|
+
//# sourceMappingURL=catalogTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalogTools.js","sourceRoot":"","sources":["../../src/tools/catalogTools.ts"],"names":[],"mappings":"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"}
|