feat(control): spawn session NPCs and resize tokens in preview

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-08-18 14:42:06 +08:00
parent 1ab6ffd593
commit 1a9f0f2557
28 changed files with 1446 additions and 89 deletions
+31
View File
@@ -30,6 +30,7 @@ import type {
SceneGrid,
SceneId,
SceneNpcToken,
NpcMapSpawnDragState,
SceneNpcTokensSessionEvent,
SceneNpcTokensSessionState,
ScenePlayerTokensSessionEvent,
@@ -233,6 +234,14 @@ export const ipcChannels = {
dispatch: 'sceneNpcTokensSession.dispatch',
stateChanged: 'sceneNpcTokensSession.stateChanged',
},
npcMapSpawn: {
beginDrag: 'npcMapSpawn.beginDrag',
setHover: 'npcMapSpawn.setHover',
commit: 'npcMapSpawn.commit',
cancel: 'npcMapSpawn.cancel',
getState: 'npcMapSpawn.getState',
stateChanged: 'npcMapSpawn.stateChanged',
},
scenePlayerTokensSession: {
getState: 'scenePlayerTokensSession.getState',
dispatch: 'scenePlayerTokensSession.dispatch',
@@ -319,6 +328,7 @@ export type IpcEventMap = {
[ipcChannels.players.stateChanged]: { players: AppPlayer[]; teams: AppPlayerTeam[] };
[ipcChannels.players.upsertProgress]: PlayersUpsertProgressEvent;
[ipcChannels.sceneNpcTokensSession.stateChanged]: { state: SceneNpcTokensSessionState };
[ipcChannels.npcMapSpawn.stateChanged]: { state: NpcMapSpawnDragState };
[ipcChannels.scenePlayerTokensSession.stateChanged]: { state: ScenePlayerTokensSessionState };
[ipcChannels.video.stateChanged]: { state: VideoPlaybackState };
[ipcChannels.license.statusChanged]: { snapshot: LicenseSnapshot };
@@ -875,6 +885,26 @@ export type IpcInvokeMap = {
req: { event: SceneNpcTokensSessionEvent };
res: { ok: true };
};
[ipcChannels.npcMapSpawn.beginDrag]: {
req: { npcId: NpcId };
res: { ok: true };
};
[ipcChannels.npcMapSpawn.setHover]: {
req: { nx: number | null; ny: number | null };
res: { ok: true };
};
[ipcChannels.npcMapSpawn.commit]: {
req: Record<string, never>;
res: { spawned: boolean };
};
[ipcChannels.npcMapSpawn.cancel]: {
req: Record<string, never>;
res: { ok: true };
};
[ipcChannels.npcMapSpawn.getState]: {
req: Record<string, never>;
res: { state: NpcMapSpawnDragState };
};
[ipcChannels.scenePlayerTokensSession.getState]: {
req: Record<string, never>;
res: { state: ScenePlayerTokensSessionState };
@@ -929,6 +959,7 @@ export type LegacyIpcEventMap = {
[ipcChannels.players.stateChanged]: { players: AppPlayer[]; teams: AppPlayerTeam[] };
[ipcChannels.players.upsertProgress]: PlayersUpsertProgressEvent;
[ipcChannels.sceneNpcTokensSession.stateChanged]: { state: SceneNpcTokensSessionState };
[ipcChannels.npcMapSpawn.stateChanged]: { state: NpcMapSpawnDragState };
[ipcChannels.scenePlayerTokensSession.stateChanged]: { state: ScenePlayerTokensSessionState };
[ipcChannels.video.stateChanged]: { state: VideoPlaybackState };
[ipcChannels.license.statusChanged]: Record<string, never>;