feat(control): 3D-кубики в отдельном окне

Бросок синхронизирован на пульте и презентации; d100 как десятки; оверлей скрывается только кнопкой «Убрать».

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-09-04 13:01:34 +08:00
parent 86d6d157f0
commit 9ac01d217f
137 changed files with 958 additions and 1 deletions
+27
View File
@@ -59,6 +59,8 @@ import type {
SessionTimerState,
InitiativeEvent,
InitiativeState,
DiceRollEvent,
DiceRollState,
TokenId,
TokenPathSessionEvent,
TokenPathSessionState,
@@ -171,6 +173,8 @@ export const ipcChannels = {
closeTimer: 'windows.closeTimer',
openInitiative: 'windows.openInitiative',
closeInitiative: 'windows.closeInitiative',
openDice: 'windows.openDice',
closeDice: 'windows.closeDice',
openNpcsEditor: 'windows.openNpcsEditor',
closeNpcsEditor: 'windows.closeNpcsEditor',
openNpcs: 'windows.openNpcs',
@@ -218,6 +222,11 @@ export const ipcChannels = {
dispatch: 'initiative.dispatch',
stateChanged: 'initiative.stateChanged',
},
diceRoll: {
getState: 'diceRoll.getState',
dispatch: 'diceRoll.dispatch',
stateChanged: 'diceRoll.stateChanged',
},
sceneDarkness: {
getState: 'sceneDarkness.getState',
dispatch: 'sceneDarkness.dispatch',
@@ -377,6 +386,7 @@ export type IpcEventMap = {
[ipcChannels.npcsOverlay.stateChanged]: { state: NpcsOverlayState };
[ipcChannels.sessionTimer.stateChanged]: { state: SessionTimerState };
[ipcChannels.initiative.stateChanged]: { state: InitiativeState };
[ipcChannels.diceRoll.stateChanged]: { state: DiceRollState };
[ipcChannels.sceneDarkness.stateChanged]: { state: SceneDarknessState };
[ipcChannels.sceneMarker.stateChanged]: { state: SceneMarkerState };
[ipcChannels.sceneTraps.stateChanged]: { state: SceneTrapsState };
@@ -822,6 +832,14 @@ export type IpcInvokeMap = {
req: Record<string, never>;
res: { ok: true };
};
[ipcChannels.windows.openDice]: {
req: Record<string, never>;
res: { ok: true };
};
[ipcChannels.windows.closeDice]: {
req: Record<string, never>;
res: { ok: true };
};
[ipcChannels.windows.openNpcsEditor]: {
req: Record<string, never>;
res: { ok: true };
@@ -894,6 +912,14 @@ export type IpcInvokeMap = {
req: { event: InitiativeEvent };
res: { state: InitiativeState };
};
[ipcChannels.diceRoll.getState]: {
req: Record<string, never>;
res: { state: DiceRollState };
};
[ipcChannels.diceRoll.dispatch]: {
req: { event: DiceRollEvent };
res: { state: DiceRollState };
};
[ipcChannels.effects.getState]: {
req: Record<string, never>;
res: { state: EffectsState };
@@ -1148,6 +1174,7 @@ export type LegacyIpcEventMap = {
[ipcChannels.npcsOverlay.stateChanged]: { state: NpcsOverlayState };
[ipcChannels.sessionTimer.stateChanged]: { state: SessionTimerState };
[ipcChannels.initiative.stateChanged]: { state: InitiativeState };
[ipcChannels.diceRoll.stateChanged]: { state: DiceRollState };
[ipcChannels.sceneDarkness.stateChanged]: { state: SceneDarknessState };
[ipcChannels.sceneMarker.stateChanged]: { state: SceneMarkerState };
[ipcChannels.sceneTraps.stateChanged]: { state: SceneTrapsState };