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,597 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { readJsonFile, readJsonArraySoft, getDataPath, getMapPath } from '../utils/fileHandler.js';
|
|
3
|
+
import { commitChange } from '../utils/commit.js';
|
|
4
|
+
import { createMapEvent, blankEventPage, eventWriteGate, summarizeCreatedEvent, } from './mapTools.js';
|
|
5
|
+
import { showText, changeGold, changeItems, changeWeapons, changeArmors, controlSelfSwitch, transferPlayer, } from '../events/commandBuilders.js';
|
|
6
|
+
import { refExists } from '../validation/references.js';
|
|
7
|
+
import { assetNameWarning } from './assetTools.js';
|
|
8
|
+
/** Event trigger names ↔ the on-disk `trigger` code. */
|
|
9
|
+
const TRIGGER_CODE = {
|
|
10
|
+
action_button: 0,
|
|
11
|
+
player_touch: 1,
|
|
12
|
+
event_touch: 2,
|
|
13
|
+
autorun: 3,
|
|
14
|
+
parallel: 4,
|
|
15
|
+
};
|
|
16
|
+
/** Priority (stacking vs. the player) names ↔ the on-disk `priorityType` code. */
|
|
17
|
+
const PRIORITY_CODE = { below: 0, same: 1, above: 2 };
|
|
18
|
+
/** Autonomous movement names ↔ the on-disk `moveType` code. */
|
|
19
|
+
const MOVE_TYPE_CODE = { fixed: 0, random: 1, approach: 2, custom: 3 };
|
|
20
|
+
/** Facing names ↔ the RPG Maker direction code. */
|
|
21
|
+
const DIRECTION_CODE = { down: 2, left: 4, right: 6, up: 8 };
|
|
22
|
+
async function getMap(projectPath, mapId) {
|
|
23
|
+
return await readJsonFile(getMapPath(projectPath, mapId));
|
|
24
|
+
}
|
|
25
|
+
// `blankEventPage` now lives in mapTools (alongside createMapEvent and the other
|
|
26
|
+
// event-page primitives) to keep the module dependency one-way; re-exported here
|
|
27
|
+
// so existing importers of this module keep working.
|
|
28
|
+
export { blankEventPage };
|
|
29
|
+
/**
|
|
30
|
+
* Warn (never throw) when a sprite `characterName` isn't among the project's
|
|
31
|
+
* `img/characters` assets — a wrong sprite name is a silent runtime failure in
|
|
32
|
+
* the engine. Skips the check when the name is empty (no graphic) or the asset
|
|
33
|
+
* dir is empty/missing (nothing to validate against — e.g. a fixture project),
|
|
34
|
+
* so it can't emit false positives. Mirrors `audioNameWarnings` in eventCommandTools.
|
|
35
|
+
*/
|
|
36
|
+
async function characterNameWarnings(projectPath, name) {
|
|
37
|
+
return assetNameWarning(projectPath, 'characters', name, {
|
|
38
|
+
path: 'image.characterName',
|
|
39
|
+
label: 'character',
|
|
40
|
+
consequence: 'a wrong filename fails silently at runtime',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Warn (never block) when a `create_npc` call sets no graphic at all — an NPC
|
|
45
|
+
* whose whole purpose is to be a visible, talkable character is almost always a
|
|
46
|
+
* mistake when invisible (F1: the Signpost NPC was created with no sprite and was
|
|
47
|
+
* unfindable in-game). Scoped to `create_npc`: a bare `create_map_event` trigger
|
|
48
|
+
* or a door-tile transfer legitimately has no graphic, so this doesn't fire there.
|
|
49
|
+
*/
|
|
50
|
+
function missingGraphicWarnings(characterName) {
|
|
51
|
+
if (characterName)
|
|
52
|
+
return [];
|
|
53
|
+
return [
|
|
54
|
+
{
|
|
55
|
+
path: 'image.characterName',
|
|
56
|
+
code: undefined,
|
|
57
|
+
message: 'create_npc made an NPC with no graphic — it will be invisible in-game. Set a characterName from list_assets("characters"), or use create_map_event if you meant an invisible trigger/controller event.',
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Update one event page's properties — graphic (`image`), trigger, priority, and
|
|
63
|
+
* movement — without rebuilding the whole page or touching its command `list`.
|
|
64
|
+
* The `image` fields are merged onto the existing graphic (so setting just a
|
|
65
|
+
* `direction` keeps the sprite); the rest overwrite. Writes through the commit
|
|
66
|
+
* choke point.
|
|
67
|
+
*/
|
|
68
|
+
export async function setEventPage(projectPath, mapId, eventId, pageIndex, updates, precommit) {
|
|
69
|
+
const map = await getMap(projectPath, mapId);
|
|
70
|
+
if (!map.events[eventId]) {
|
|
71
|
+
throw new Error(`Event ${eventId} not found on map ${mapId}`);
|
|
72
|
+
}
|
|
73
|
+
const event = map.events[eventId];
|
|
74
|
+
if (!event.pages[pageIndex]) {
|
|
75
|
+
throw new Error(`Page ${pageIndex} not found on event ${eventId}`);
|
|
76
|
+
}
|
|
77
|
+
const page = event.pages[pageIndex];
|
|
78
|
+
if (updates.image)
|
|
79
|
+
page.image = { ...page.image, ...updates.image };
|
|
80
|
+
if (updates.trigger !== undefined)
|
|
81
|
+
page.trigger = updates.trigger;
|
|
82
|
+
if (updates.priorityType !== undefined)
|
|
83
|
+
page.priorityType = updates.priorityType;
|
|
84
|
+
if (updates.through !== undefined)
|
|
85
|
+
page.through = updates.through;
|
|
86
|
+
if (updates.walkAnime !== undefined)
|
|
87
|
+
page.walkAnime = updates.walkAnime;
|
|
88
|
+
if (updates.stepAnime !== undefined)
|
|
89
|
+
page.stepAnime = updates.stepAnime;
|
|
90
|
+
if (updates.directionFix !== undefined)
|
|
91
|
+
page.directionFix = updates.directionFix;
|
|
92
|
+
if (updates.moveType !== undefined)
|
|
93
|
+
page.moveType = updates.moveType;
|
|
94
|
+
if (updates.moveSpeed !== undefined)
|
|
95
|
+
page.moveSpeed = updates.moveSpeed;
|
|
96
|
+
if (updates.moveFrequency !== undefined)
|
|
97
|
+
page.moveFrequency = updates.moveFrequency;
|
|
98
|
+
if (updates.moveRoute !== undefined)
|
|
99
|
+
page.moveRoute = updates.moveRoute;
|
|
100
|
+
await precommit?.(event);
|
|
101
|
+
await commitChange(getMapPath(projectPath, mapId), map);
|
|
102
|
+
return event;
|
|
103
|
+
}
|
|
104
|
+
/** Coerce a loosely-typed command array into well-formed EventCommands. */
|
|
105
|
+
function asCommands(raw) {
|
|
106
|
+
if (!Array.isArray(raw))
|
|
107
|
+
return [];
|
|
108
|
+
return raw.map((c) => {
|
|
109
|
+
const cmd = c;
|
|
110
|
+
return {
|
|
111
|
+
code: cmd.code,
|
|
112
|
+
indent: cmd.indent ?? 0,
|
|
113
|
+
parameters: Array.isArray(cmd.parameters) ? cmd.parameters : [],
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/** Ensure a page command list ends with the code-0 end marker (never duplicated). */
|
|
118
|
+
function terminated(list) {
|
|
119
|
+
const last = list[list.length - 1];
|
|
120
|
+
if (last && last.code === 0)
|
|
121
|
+
return list;
|
|
122
|
+
return [...list, { code: 0, indent: 0, parameters: [] }];
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* One-shot "talking NPC" builder: create a complete, placed event on a map with a
|
|
126
|
+
* single page — a graphic, a trigger, and a command list. The list comes from
|
|
127
|
+
* `text` (built as a Show Text sequence) or an explicit `commands` array
|
|
128
|
+
* (`commands` wins if both are given); either way it's code-0 terminated. Reuses
|
|
129
|
+
* `createMapEvent` so id allocation + the commit choke point are shared.
|
|
130
|
+
*
|
|
131
|
+
* Defaults tuned for the common case: a solid, action-button NPC facing down —
|
|
132
|
+
* `priorityType` same-as-characters, `pattern` 1 (idle frame) when a sprite is
|
|
133
|
+
* set.
|
|
134
|
+
*/
|
|
135
|
+
export async function createNpc(projectPath, mapId, x, y, name, options = {}, precommit) {
|
|
136
|
+
const hasGraphic = !!options.characterName;
|
|
137
|
+
const page = blankEventPage();
|
|
138
|
+
page.image = {
|
|
139
|
+
characterName: options.characterName ?? '',
|
|
140
|
+
characterIndex: options.characterIndex ?? 0,
|
|
141
|
+
direction: options.direction ?? 2,
|
|
142
|
+
pattern: options.pattern ?? (hasGraphic ? 1 : 0),
|
|
143
|
+
tileId: 0,
|
|
144
|
+
};
|
|
145
|
+
page.trigger = options.trigger ?? TRIGGER_CODE.action_button;
|
|
146
|
+
page.priorityType = options.priorityType ?? PRIORITY_CODE.same;
|
|
147
|
+
if (options.through !== undefined)
|
|
148
|
+
page.through = options.through;
|
|
149
|
+
if (options.commands && options.commands.length > 0) {
|
|
150
|
+
page.list = terminated(asCommands(options.commands));
|
|
151
|
+
}
|
|
152
|
+
else if (options.text && options.text.length > 0) {
|
|
153
|
+
const textOptions = {
|
|
154
|
+
faceName: options.faceName,
|
|
155
|
+
faceIndex: options.faceIndex,
|
|
156
|
+
speakerName: options.speakerName,
|
|
157
|
+
};
|
|
158
|
+
page.list = terminated(showText(options.text, textOptions));
|
|
159
|
+
}
|
|
160
|
+
return await createMapEvent(projectPath, mapId, { name, note: '', x, y, pages: [page] }, precommit);
|
|
161
|
+
}
|
|
162
|
+
/** The db file + label backing each non-gold chest kind. */
|
|
163
|
+
const CHEST_REF = {
|
|
164
|
+
item: { file: 'Items.json', label: 'item' },
|
|
165
|
+
weapon: { file: 'Weapons.json', label: 'weapon' },
|
|
166
|
+
armor: { file: 'Armors.json', label: 'armor' },
|
|
167
|
+
};
|
|
168
|
+
/** The Change Gold/Items/Weapons/Armors command that pays out a chest's contents. */
|
|
169
|
+
function chestGainCommand(kind, id, amount) {
|
|
170
|
+
const operand = { type: 'constant', value: amount };
|
|
171
|
+
switch (kind) {
|
|
172
|
+
case 'gold':
|
|
173
|
+
return changeGold('increase', operand);
|
|
174
|
+
case 'item':
|
|
175
|
+
return changeItems(id, 'increase', operand);
|
|
176
|
+
case 'weapon':
|
|
177
|
+
return changeWeapons(id, 'increase', operand);
|
|
178
|
+
case 'armor':
|
|
179
|
+
return changeArmors(id, 'increase', operand);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* One-shot treasure-chest builder: the two-page self-switch idiom, complete and
|
|
184
|
+
* correct, in a single call.
|
|
185
|
+
*
|
|
186
|
+
* - **Page 1** (closed chest): action-button, priority `same` so it fires when the
|
|
187
|
+
* player *faces* it, gives the contents, then flips its self switch on.
|
|
188
|
+
* - **Page 2** (opened chest): gated on that self switch, shows the opened graphic
|
|
189
|
+
* and does nothing — so the chest can never be looted twice.
|
|
190
|
+
*
|
|
191
|
+
* The RTP `!Chest` sheet packs the open/closed states on the *direction* rows of one
|
|
192
|
+
* character block (down = closed, left/right = mid-open, up = fully open), which is
|
|
193
|
+
* why the two pages differ only by `direction`.
|
|
194
|
+
*/
|
|
195
|
+
export async function createChest(projectPath, mapId, x, y, kind, options = {}, precommit) {
|
|
196
|
+
const amount = options.amount ?? 1;
|
|
197
|
+
const id = options.id ?? 0;
|
|
198
|
+
if (kind !== 'gold' && id <= 0) {
|
|
199
|
+
throw new Error(`create_chest: an \`id\` is required for a ${kind} chest`);
|
|
200
|
+
}
|
|
201
|
+
// Reject a chest paying out a record that doesn't exist — the create-time throw
|
|
202
|
+
// convention (matching create_item / create_enemy), not an after-the-fact audit.
|
|
203
|
+
if (kind !== 'gold') {
|
|
204
|
+
const { file, label } = CHEST_REF[kind];
|
|
205
|
+
const records = await readJsonArraySoft(getDataPath(projectPath, file));
|
|
206
|
+
if (records.length > 0 && !refExists(records, id)) {
|
|
207
|
+
throw new Error(`create_chest: ${label} ${id} does not exist`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
const channel = options.selfSwitch ?? 'A';
|
|
211
|
+
const characterName = options.characterName ?? '';
|
|
212
|
+
const characterIndex = options.characterIndex ?? 0;
|
|
213
|
+
const pattern = characterName ? 1 : 0;
|
|
214
|
+
const openList = [
|
|
215
|
+
...(options.text && options.text.length > 0 ? showText(options.text) : []),
|
|
216
|
+
chestGainCommand(kind, id, amount),
|
|
217
|
+
controlSelfSwitch(channel, 'on'),
|
|
218
|
+
];
|
|
219
|
+
const closedPage = blankEventPage();
|
|
220
|
+
closedPage.image = {
|
|
221
|
+
characterName,
|
|
222
|
+
characterIndex,
|
|
223
|
+
direction: options.closedDirection ?? DIRECTION_CODE.down,
|
|
224
|
+
pattern,
|
|
225
|
+
tileId: 0,
|
|
226
|
+
};
|
|
227
|
+
closedPage.trigger = TRIGGER_CODE.action_button;
|
|
228
|
+
// Priority `same` is load-bearing: an action-button event on a `below` page only
|
|
229
|
+
// fires when the player stands *on* it, which a solid chest never allows.
|
|
230
|
+
closedPage.priorityType = PRIORITY_CODE.same;
|
|
231
|
+
closedPage.list = terminated(openList);
|
|
232
|
+
const openedPage = blankEventPage();
|
|
233
|
+
openedPage.conditions = {
|
|
234
|
+
...openedPage.conditions,
|
|
235
|
+
selfSwitchValid: true,
|
|
236
|
+
selfSwitchCh: channel,
|
|
237
|
+
};
|
|
238
|
+
openedPage.image = {
|
|
239
|
+
characterName,
|
|
240
|
+
characterIndex,
|
|
241
|
+
direction: options.openedDirection ?? DIRECTION_CODE.up,
|
|
242
|
+
pattern,
|
|
243
|
+
tileId: 0,
|
|
244
|
+
};
|
|
245
|
+
openedPage.trigger = TRIGGER_CODE.action_button;
|
|
246
|
+
openedPage.priorityType = PRIORITY_CODE.same;
|
|
247
|
+
return await createMapEvent(projectPath, mapId, {
|
|
248
|
+
name: options.name ?? 'Chest',
|
|
249
|
+
note: '',
|
|
250
|
+
x,
|
|
251
|
+
y,
|
|
252
|
+
pages: [closedPage, openedPage],
|
|
253
|
+
}, precommit);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* One-shot map-transfer builder covering the two idioms that actually work:
|
|
257
|
+
*
|
|
258
|
+
* - **`action_button`** (default): a priority-`same` event the player faces and
|
|
259
|
+
* presses — the right shape for a solid landmark (building, dungeon mouth, door).
|
|
260
|
+
* - **`player_touch`**: an invisible priority-`below` doormat the player steps onto —
|
|
261
|
+
* for interior exits and map-edge gaps.
|
|
262
|
+
*
|
|
263
|
+
* Throws if the destination map doesn't exist, and warns when the destination tile
|
|
264
|
+
* is outside that map's bounds (the player would land nowhere).
|
|
265
|
+
*/
|
|
266
|
+
export async function createTransfer(projectPath, mapId, x, y, targetMapId, targetX, targetY, options = {}, precommit) {
|
|
267
|
+
const mapInfos = await readJsonArraySoft(getDataPath(projectPath, 'MapInfos.json'));
|
|
268
|
+
if (mapInfos.length > 0 && !refExists(mapInfos, targetMapId)) {
|
|
269
|
+
throw new Error(`create_transfer: target map ${targetMapId} does not exist`);
|
|
270
|
+
}
|
|
271
|
+
const warnings = [];
|
|
272
|
+
try {
|
|
273
|
+
const target = await getMap(projectPath, targetMapId);
|
|
274
|
+
if (targetX < 0 || targetY < 0 || targetX >= target.width || targetY >= target.height) {
|
|
275
|
+
warnings.push({
|
|
276
|
+
path: 'targetX/targetY',
|
|
277
|
+
message: `destination (${targetX}, ${targetY}) is outside map ${targetMapId}'s ${target.width}x${target.height} bounds — the player would land off-map`,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
// Unreadable target map file: the MapInfos check above already covers the
|
|
283
|
+
// "map doesn't exist" case, so fail soft rather than block the write.
|
|
284
|
+
}
|
|
285
|
+
const idiom = options.idiom ?? 'action_button';
|
|
286
|
+
const characterName = options.characterName ?? '';
|
|
287
|
+
const page = blankEventPage();
|
|
288
|
+
page.image = {
|
|
289
|
+
characterName,
|
|
290
|
+
characterIndex: options.characterIndex ?? 0,
|
|
291
|
+
direction: DIRECTION_CODE.down,
|
|
292
|
+
pattern: characterName ? 1 : 0,
|
|
293
|
+
tileId: 0,
|
|
294
|
+
};
|
|
295
|
+
page.trigger = idiom === 'player_touch' ? TRIGGER_CODE.player_touch : TRIGGER_CODE.action_button;
|
|
296
|
+
// An action-button transfer is meant to fire from the player *facing* a solid
|
|
297
|
+
// landmark, which needs `same`; a doormat is walked onto, so it stays `below`.
|
|
298
|
+
page.priorityType = idiom === 'player_touch' ? PRIORITY_CODE.below : PRIORITY_CODE.same;
|
|
299
|
+
page.list = terminated([
|
|
300
|
+
transferPlayer(targetMapId, targetX, targetY, {
|
|
301
|
+
direction: options.direction ?? 'retain',
|
|
302
|
+
fade: options.fade ?? 'black',
|
|
303
|
+
}),
|
|
304
|
+
]);
|
|
305
|
+
const event = await createMapEvent(projectPath, mapId, {
|
|
306
|
+
name: options.name ?? 'Transfer',
|
|
307
|
+
note: '',
|
|
308
|
+
x,
|
|
309
|
+
y,
|
|
310
|
+
pages: [page],
|
|
311
|
+
}, precommit);
|
|
312
|
+
return { event, warnings };
|
|
313
|
+
}
|
|
314
|
+
export const eventPageToolDefinitions = [
|
|
315
|
+
{
|
|
316
|
+
name: 'set_event_page',
|
|
317
|
+
mutates: true,
|
|
318
|
+
forceable: true,
|
|
319
|
+
description: "Update an existing event page's graphic and behavior in one call, without rebuilding the whole page or touching its command list: sprite (characterName/characterIndex/direction/pattern or a tileId), trigger, priority, movement (type/speed/frequency/route), and the through/walkAnime/stepAnime/directionFix flags. Graphic fields merge onto the current image; warns (never blocks) on an unknown characterName. Refuses the write if the change would leave the event unreachable (an action-button page with priority `below` on an impassable tile) — pass force: true to override.",
|
|
320
|
+
inputSchema: {
|
|
321
|
+
mapId: z.number().int().positive().describe('The ID of the map'),
|
|
322
|
+
eventId: z.number().int().positive().describe('The ID of the event'),
|
|
323
|
+
pageIndex: z.number().int().min(0).describe('Zero-based page index'),
|
|
324
|
+
characterName: z
|
|
325
|
+
.string()
|
|
326
|
+
.optional()
|
|
327
|
+
.describe('Sprite sheet basename (from list_assets("characters")); "" = no sprite'),
|
|
328
|
+
characterIndex: z.number().int().optional().describe('Sprite index 0–7 in the sheet'),
|
|
329
|
+
direction: z
|
|
330
|
+
.enum(['down', 'left', 'right', 'up'])
|
|
331
|
+
.optional()
|
|
332
|
+
.describe('Facing direction of the sprite'),
|
|
333
|
+
pattern: z.number().int().optional().describe('Sprite animation frame 0–2 (1 = idle)'),
|
|
334
|
+
tileId: z
|
|
335
|
+
.number()
|
|
336
|
+
.int()
|
|
337
|
+
.optional()
|
|
338
|
+
.describe('Use a tile as the graphic instead of a sprite (0 = none)'),
|
|
339
|
+
trigger: z
|
|
340
|
+
.enum(['action_button', 'player_touch', 'event_touch', 'autorun', 'parallel'])
|
|
341
|
+
.optional()
|
|
342
|
+
.describe('What starts the page'),
|
|
343
|
+
priority: z
|
|
344
|
+
.enum(['below', 'same', 'above'])
|
|
345
|
+
.optional()
|
|
346
|
+
.describe('Stacking vs. the player: below/same/above characters (same = solid)'),
|
|
347
|
+
through: z.boolean().optional().describe('Let the player/others pass through the event'),
|
|
348
|
+
walkAnime: z.boolean().optional().describe('Animate the walk cycle while moving'),
|
|
349
|
+
stepAnime: z.boolean().optional().describe('Animate in place while stopped'),
|
|
350
|
+
directionFix: z.boolean().optional().describe('Lock the facing direction'),
|
|
351
|
+
moveType: z
|
|
352
|
+
.enum(['fixed', 'random', 'approach', 'custom'])
|
|
353
|
+
.optional()
|
|
354
|
+
.describe('Autonomous movement (custom uses moveRoute)'),
|
|
355
|
+
moveSpeed: z.number().int().optional().describe('Movement speed 1–6 (4 = normal)'),
|
|
356
|
+
moveFrequency: z.number().int().optional().describe('Movement frequency 1–5 (3 = normal)'),
|
|
357
|
+
moveRoute: z
|
|
358
|
+
.record(z.string(), z.unknown())
|
|
359
|
+
.optional()
|
|
360
|
+
.describe('Autonomous move route (from create_move_route); pairs with moveType "custom"'),
|
|
361
|
+
indent: z.number().int().optional().describe('(unused; page-level tool)'),
|
|
362
|
+
},
|
|
363
|
+
handler: async (ctx, args) => {
|
|
364
|
+
const image = {};
|
|
365
|
+
if (args.characterName !== undefined)
|
|
366
|
+
image.characterName = args.characterName;
|
|
367
|
+
if (args.characterIndex !== undefined)
|
|
368
|
+
image.characterIndex = args.characterIndex;
|
|
369
|
+
if (args.direction !== undefined)
|
|
370
|
+
image.direction = DIRECTION_CODE[args.direction];
|
|
371
|
+
if (args.pattern !== undefined)
|
|
372
|
+
image.pattern = args.pattern;
|
|
373
|
+
if (args.tileId !== undefined)
|
|
374
|
+
image.tileId = args.tileId;
|
|
375
|
+
const updates = {
|
|
376
|
+
image: Object.keys(image).length > 0 ? image : undefined,
|
|
377
|
+
trigger: args.trigger !== undefined ? TRIGGER_CODE[args.trigger] : undefined,
|
|
378
|
+
priorityType: args.priority !== undefined ? PRIORITY_CODE[args.priority] : undefined,
|
|
379
|
+
through: args.through,
|
|
380
|
+
walkAnime: args.walkAnime,
|
|
381
|
+
stepAnime: args.stepAnime,
|
|
382
|
+
directionFix: args.directionFix,
|
|
383
|
+
moveType: args.moveType !== undefined ? MOVE_TYPE_CODE[args.moveType] : undefined,
|
|
384
|
+
moveSpeed: args.moveSpeed,
|
|
385
|
+
moveFrequency: args.moveFrequency,
|
|
386
|
+
moveRoute: args.moveRoute,
|
|
387
|
+
};
|
|
388
|
+
const gate = eventWriteGate(ctx.projectPath, args.mapId, args.force, await characterNameWarnings(ctx.projectPath, args.characterName));
|
|
389
|
+
const event = await setEventPage(ctx.projectPath, args.mapId, args.eventId, args.pageIndex, updates, gate.precommit);
|
|
390
|
+
return gate.respond({ event });
|
|
391
|
+
},
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
name: 'create_npc',
|
|
395
|
+
mutates: true,
|
|
396
|
+
forceable: true,
|
|
397
|
+
description: 'Create a complete, placed NPC event on a map in one call — a graphic + trigger + a talk list. Provide `text` (built into a Show Text sequence, with optional face/speaker) or an explicit `commands` array (commands wins if both given). Defaults to a solid, action-button NPC facing down. Warns (never blocks) on an unknown characterName, and on NO graphic at all (an NPC with no characterName is invisible in-game — use create_map_event for an intentionally-invisible trigger). The one-shot "make a talking NPC that says X" primitive.',
|
|
398
|
+
inputSchema: {
|
|
399
|
+
mapId: z.number().int().positive().describe('The ID of the map to place the NPC on'),
|
|
400
|
+
x: z.number().int().describe('X tile position'),
|
|
401
|
+
y: z.number().int().describe('Y tile position'),
|
|
402
|
+
name: z.string().describe('Event name (editor label)'),
|
|
403
|
+
characterName: z
|
|
404
|
+
.string()
|
|
405
|
+
.optional()
|
|
406
|
+
.describe('Sprite sheet basename (from list_assets("characters"))'),
|
|
407
|
+
characterIndex: z.number().int().optional().describe('Sprite index 0–7 in the sheet'),
|
|
408
|
+
direction: z
|
|
409
|
+
.enum(['down', 'left', 'right', 'up'])
|
|
410
|
+
.optional()
|
|
411
|
+
.describe('Facing direction (default down)'),
|
|
412
|
+
pattern: z
|
|
413
|
+
.number()
|
|
414
|
+
.int()
|
|
415
|
+
.optional()
|
|
416
|
+
.describe('Sprite frame 0–2 (default 1 = idle when a sprite is set)'),
|
|
417
|
+
text: z
|
|
418
|
+
.array(z.string())
|
|
419
|
+
.optional()
|
|
420
|
+
.describe('Dialogue lines shown when the NPC is triggered (built as Show Text)'),
|
|
421
|
+
faceName: z
|
|
422
|
+
.string()
|
|
423
|
+
.optional()
|
|
424
|
+
.describe('text: face image basename (from list_assets("faces"))'),
|
|
425
|
+
faceIndex: z.number().int().optional().describe('text: face index 0–7'),
|
|
426
|
+
speakerName: z.string().optional().describe('text: MZ name-box speaker name'),
|
|
427
|
+
commands: z
|
|
428
|
+
.array(z.object({
|
|
429
|
+
code: z.number().int().describe('Event command code'),
|
|
430
|
+
indent: z.number().int().optional().describe('Indentation level (default 0)'),
|
|
431
|
+
parameters: z.array(z.unknown()).optional().describe('Command parameters (default [])'),
|
|
432
|
+
}))
|
|
433
|
+
.optional()
|
|
434
|
+
.describe('Explicit command list (from the build_* tools); overrides `text` if given'),
|
|
435
|
+
trigger: z
|
|
436
|
+
.enum(['action_button', 'player_touch', 'event_touch', 'autorun', 'parallel'])
|
|
437
|
+
.optional()
|
|
438
|
+
.describe('What starts the event (default action_button)'),
|
|
439
|
+
priority: z
|
|
440
|
+
.enum(['below', 'same', 'above'])
|
|
441
|
+
.optional()
|
|
442
|
+
.describe('Stacking vs. the player (default same = solid)'),
|
|
443
|
+
through: z.boolean().optional().describe('Let the player pass through (default false)'),
|
|
444
|
+
},
|
|
445
|
+
handler: async (ctx, args) => {
|
|
446
|
+
const options = {
|
|
447
|
+
characterName: args.characterName,
|
|
448
|
+
characterIndex: args.characterIndex,
|
|
449
|
+
direction: args.direction !== undefined
|
|
450
|
+
? DIRECTION_CODE[args.direction]
|
|
451
|
+
: undefined,
|
|
452
|
+
pattern: args.pattern,
|
|
453
|
+
text: args.text,
|
|
454
|
+
faceName: args.faceName,
|
|
455
|
+
faceIndex: args.faceIndex,
|
|
456
|
+
speakerName: args.speakerName,
|
|
457
|
+
commands: args.commands !== undefined ? asCommands(args.commands) : undefined,
|
|
458
|
+
trigger: args.trigger !== undefined ? TRIGGER_CODE[args.trigger] : undefined,
|
|
459
|
+
priorityType: args.priority !== undefined ? PRIORITY_CODE[args.priority] : undefined,
|
|
460
|
+
through: args.through,
|
|
461
|
+
};
|
|
462
|
+
const gate = eventWriteGate(ctx.projectPath, args.mapId, args.force, [
|
|
463
|
+
...missingGraphicWarnings(args.characterName),
|
|
464
|
+
...(await characterNameWarnings(ctx.projectPath, args.characterName)),
|
|
465
|
+
]);
|
|
466
|
+
const event = await createNpc(ctx.projectPath, args.mapId, args.x, args.y, args.name, options, gate.precommit);
|
|
467
|
+
// Return a compact summary, not the full event with every defaulted page
|
|
468
|
+
// field — a huge token cost on every NPC (re-read via get_map_event).
|
|
469
|
+
return gate.respond({ event: summarizeCreatedEvent(event) });
|
|
470
|
+
},
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
name: 'create_chest',
|
|
474
|
+
mutates: true,
|
|
475
|
+
forceable: true,
|
|
476
|
+
description: 'Create a complete, placed treasure chest on a map in one call — the two-page self-switch idiom done correctly, so the chest can never be looted twice. Page 1 (closed) is an action-button, priority-`same` event that optionally shows `text`, gives the contents, then flips its self switch; page 2 (opened) is gated on that self switch, shows the opened graphic and does nothing. `kind` picks the payout: item/weapon/armor (needs `id`) or gold. On the RTP `!Chest` sheet the open/closed states are the *direction* rows of one character block (down = closed, up = open), which is what closedDirection/openedDirection default to. Throws if the item/weapon/armor `id` does not exist; warns (never blocks) on an unknown characterName or a chest with no graphic.',
|
|
477
|
+
inputSchema: {
|
|
478
|
+
mapId: z.number().int().positive().describe('The ID of the map to place the chest on'),
|
|
479
|
+
x: z.number().int().min(0).describe('X tile position'),
|
|
480
|
+
y: z.number().int().min(0).describe('Y tile position'),
|
|
481
|
+
kind: z
|
|
482
|
+
.enum(['item', 'weapon', 'armor', 'gold'])
|
|
483
|
+
.describe('What the chest gives; item/weapon/armor require `id`'),
|
|
484
|
+
id: z
|
|
485
|
+
.number()
|
|
486
|
+
.int()
|
|
487
|
+
.positive()
|
|
488
|
+
.optional()
|
|
489
|
+
.describe('The item/weapon/armor ID to give (omit for kind "gold")'),
|
|
490
|
+
amount: z
|
|
491
|
+
.number()
|
|
492
|
+
.int()
|
|
493
|
+
.positive()
|
|
494
|
+
.optional()
|
|
495
|
+
.describe('How many (or how much gold) to give; default 1'),
|
|
496
|
+
name: z.string().optional().describe('Event name (editor label); default "Chest"'),
|
|
497
|
+
characterName: z
|
|
498
|
+
.string()
|
|
499
|
+
.optional()
|
|
500
|
+
.describe('Chest sprite basename from list_assets("characters"), e.g. "!Chest"'),
|
|
501
|
+
characterIndex: z
|
|
502
|
+
.number()
|
|
503
|
+
.int()
|
|
504
|
+
.min(0)
|
|
505
|
+
.optional()
|
|
506
|
+
.describe('Which chest in the sheet (0-7); default 0'),
|
|
507
|
+
closedDirection: z
|
|
508
|
+
.enum(['down', 'left', 'right', 'up'])
|
|
509
|
+
.optional()
|
|
510
|
+
.describe('Direction row showing the CLOSED chest; default "down"'),
|
|
511
|
+
openedDirection: z
|
|
512
|
+
.enum(['down', 'left', 'right', 'up'])
|
|
513
|
+
.optional()
|
|
514
|
+
.describe('Direction row showing the OPENED chest; default "up"'),
|
|
515
|
+
text: z
|
|
516
|
+
.array(z.string())
|
|
517
|
+
.optional()
|
|
518
|
+
.describe('Optional message shown on opening, e.g. ["Found a Potion!"]'),
|
|
519
|
+
selfSwitch: z
|
|
520
|
+
.enum(['A', 'B', 'C', 'D'])
|
|
521
|
+
.optional()
|
|
522
|
+
.describe('Self switch channel marking the chest looted; default "A"'),
|
|
523
|
+
},
|
|
524
|
+
handler: async (ctx, args) => {
|
|
525
|
+
const options = {
|
|
526
|
+
name: args.name,
|
|
527
|
+
id: args.id,
|
|
528
|
+
amount: args.amount,
|
|
529
|
+
characterName: args.characterName,
|
|
530
|
+
characterIndex: args.characterIndex,
|
|
531
|
+
closedDirection: args.closedDirection !== undefined
|
|
532
|
+
? DIRECTION_CODE[args.closedDirection]
|
|
533
|
+
: undefined,
|
|
534
|
+
openedDirection: args.openedDirection !== undefined
|
|
535
|
+
? DIRECTION_CODE[args.openedDirection]
|
|
536
|
+
: undefined,
|
|
537
|
+
text: args.text,
|
|
538
|
+
selfSwitch: args.selfSwitch,
|
|
539
|
+
};
|
|
540
|
+
const gate = eventWriteGate(ctx.projectPath, args.mapId, args.force, [
|
|
541
|
+
...missingGraphicWarnings(args.characterName),
|
|
542
|
+
...(await characterNameWarnings(ctx.projectPath, args.characterName)),
|
|
543
|
+
]);
|
|
544
|
+
const event = await createChest(ctx.projectPath, args.mapId, args.x, args.y, args.kind, options, gate.precommit);
|
|
545
|
+
return gate.respond({ event: summarizeCreatedEvent(event) });
|
|
546
|
+
},
|
|
547
|
+
},
|
|
548
|
+
{
|
|
549
|
+
name: 'create_transfer',
|
|
550
|
+
mutates: true,
|
|
551
|
+
forceable: true,
|
|
552
|
+
description: 'Create a complete, placed map-transfer event in one call, using whichever of the two working idioms you pick. `idiom: "action_button"` (default) makes a priority-`same` event the player faces and presses — the right shape for a solid landmark (building, dungeon mouth, door); `idiom: "player_touch"` makes an invisible priority-`below` doormat the player walks onto — for interior exits and map-edge gaps. `direction` is the facing the player lands with, `fade` the screen transition. Throws if the destination map does not exist; warns if the destination tile is outside that map, if the characterName is unknown, or if the event can never fire from where it sits.',
|
|
553
|
+
inputSchema: {
|
|
554
|
+
mapId: z.number().int().positive().describe('The ID of the map the trigger is placed on'),
|
|
555
|
+
x: z.number().int().min(0).describe('X tile position of the trigger'),
|
|
556
|
+
y: z.number().int().min(0).describe('Y tile position of the trigger'),
|
|
557
|
+
targetMapId: z.number().int().positive().describe('The ID of the destination map'),
|
|
558
|
+
targetX: z.number().int().min(0).describe('X tile the player lands on'),
|
|
559
|
+
targetY: z.number().int().min(0).describe('Y tile the player lands on'),
|
|
560
|
+
idiom: z
|
|
561
|
+
.enum(['action_button', 'player_touch'])
|
|
562
|
+
.optional()
|
|
563
|
+
.describe('action_button = face a solid landmark and press (priority same, default); player_touch = walk onto a doormat (priority below)'),
|
|
564
|
+
name: z.string().optional().describe('Event name (editor label); default "Transfer"'),
|
|
565
|
+
direction: z
|
|
566
|
+
.enum(['retain', 'down', 'left', 'right', 'up'])
|
|
567
|
+
.optional()
|
|
568
|
+
.describe('Facing after the transfer; default "retain"'),
|
|
569
|
+
fade: z
|
|
570
|
+
.enum(['black', 'white', 'none'])
|
|
571
|
+
.optional()
|
|
572
|
+
.describe('Screen fade during the transfer; default "black"'),
|
|
573
|
+
characterName: z
|
|
574
|
+
.string()
|
|
575
|
+
.optional()
|
|
576
|
+
.describe('Optional sprite basename (a doormat is normally left invisible)'),
|
|
577
|
+
characterIndex: z.number().int().min(0).optional().describe('Sprite index 0-7 in the sheet'),
|
|
578
|
+
},
|
|
579
|
+
handler: async (ctx, args) => {
|
|
580
|
+
const options = {
|
|
581
|
+
name: args.name,
|
|
582
|
+
idiom: args.idiom,
|
|
583
|
+
direction: args.direction,
|
|
584
|
+
fade: args.fade,
|
|
585
|
+
characterName: args.characterName,
|
|
586
|
+
characterIndex: args.characterIndex,
|
|
587
|
+
};
|
|
588
|
+
const gate = eventWriteGate(ctx.projectPath, args.mapId, args.force, await characterNameWarnings(ctx.projectPath, args.characterName));
|
|
589
|
+
const { event, warnings: transferWarnings } = await createTransfer(ctx.projectPath, args.mapId, args.x, args.y, args.targetMapId, args.targetX, args.targetY, options, gate.precommit);
|
|
590
|
+
// createTransfer's own findings (destination bounds, graphic) are advisory,
|
|
591
|
+
// so they only need to reach the response — not the gate's block decision.
|
|
592
|
+
gate.warnings.push(...transferWarnings);
|
|
593
|
+
return gate.respond({ event: summarizeCreatedEvent(event) });
|
|
594
|
+
},
|
|
595
|
+
},
|
|
596
|
+
];
|
|
597
|
+
//# sourceMappingURL=eventPageTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventPageTools.js","sourceRoot":"","sources":["../../src/tools/eventPageTools.ts"],"names":[],"mappings":"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"}
|