feat(control): трекер инициативы в отдельном окне

Очередь NPC/игроков с DnD, курсором на сцене, состояниями и запасом; сброс при смене сцены.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-09-04 10:09:51 +08:00
parent db1168a46c
commit 86d6d157f0
28 changed files with 1783 additions and 4 deletions
+27
View File
@@ -57,6 +57,8 @@ import type {
SceneViewState,
SessionTimerEvent,
SessionTimerState,
InitiativeEvent,
InitiativeState,
TokenId,
TokenPathSessionEvent,
TokenPathSessionState,
@@ -167,6 +169,8 @@ export const ipcChannels = {
closePlaylists: 'windows.closePlaylists',
openTimer: 'windows.openTimer',
closeTimer: 'windows.closeTimer',
openInitiative: 'windows.openInitiative',
closeInitiative: 'windows.closeInitiative',
openNpcsEditor: 'windows.openNpcsEditor',
closeNpcsEditor: 'windows.closeNpcsEditor',
openNpcs: 'windows.openNpcs',
@@ -209,6 +213,11 @@ export const ipcChannels = {
dispatch: 'sessionTimer.dispatch',
stateChanged: 'sessionTimer.stateChanged',
},
initiative: {
getState: 'initiative.getState',
dispatch: 'initiative.dispatch',
stateChanged: 'initiative.stateChanged',
},
sceneDarkness: {
getState: 'sceneDarkness.getState',
dispatch: 'sceneDarkness.dispatch',
@@ -367,6 +376,7 @@ export type IpcEventMap = {
[ipcChannels.materialsOverlay.stateChanged]: { state: MaterialsOverlayState };
[ipcChannels.npcsOverlay.stateChanged]: { state: NpcsOverlayState };
[ipcChannels.sessionTimer.stateChanged]: { state: SessionTimerState };
[ipcChannels.initiative.stateChanged]: { state: InitiativeState };
[ipcChannels.sceneDarkness.stateChanged]: { state: SceneDarknessState };
[ipcChannels.sceneMarker.stateChanged]: { state: SceneMarkerState };
[ipcChannels.sceneTraps.stateChanged]: { state: SceneTrapsState };
@@ -804,6 +814,14 @@ export type IpcInvokeMap = {
req: Record<string, never>;
res: { ok: true };
};
[ipcChannels.windows.openInitiative]: {
req: Record<string, never>;
res: { ok: true };
};
[ipcChannels.windows.closeInitiative]: {
req: Record<string, never>;
res: { ok: true };
};
[ipcChannels.windows.openNpcsEditor]: {
req: Record<string, never>;
res: { ok: true };
@@ -868,6 +886,14 @@ export type IpcInvokeMap = {
req: { event: SessionTimerEvent };
res: { state: SessionTimerState };
};
[ipcChannels.initiative.getState]: {
req: Record<string, never>;
res: { state: InitiativeState };
};
[ipcChannels.initiative.dispatch]: {
req: { event: InitiativeEvent };
res: { state: InitiativeState };
};
[ipcChannels.effects.getState]: {
req: Record<string, never>;
res: { state: EffectsState };
@@ -1121,6 +1147,7 @@ export type LegacyIpcEventMap = {
[ipcChannels.materialsOverlay.stateChanged]: { state: MaterialsOverlayState };
[ipcChannels.npcsOverlay.stateChanged]: { state: NpcsOverlayState };
[ipcChannels.sessionTimer.stateChanged]: { state: SessionTimerState };
[ipcChannels.initiative.stateChanged]: { state: InitiativeState };
[ipcChannels.sceneDarkness.stateChanged]: { state: SceneDarknessState };
[ipcChannels.sceneMarker.stateChanged]: { state: SceneMarkerState };
[ipcChannels.sceneTraps.stateChanged]: { state: SceneTrapsState };