Story 4.2 completed

This commit is contained in:
2026-05-24 00:37:21 +02:00
parent de1b33c453
commit 56eeb7cc83
21 changed files with 3836 additions and 56 deletions
+12 -3
View File
@@ -24,6 +24,7 @@ import { VisibilityManager } from './src/core/VisibilityManager.js';
import { ScryingPoolController } from './src/core/ScryingPoolController.js';
import { ScenePresetManager } from './src/core/ScenePresetManager.js';
import { PlayerPrivacyManager } from './src/core/PlayerPrivacyManager.js';
import { PortraitFallbackHandler } from './src/core/PortraitFallbackHandler.js';
import { AVTileAdapter } from './src/ui/shared/AVTileAdapter.js';
import { RoleRenderer } from './src/ui/RoleRenderer.js';
import { VisibilityBadge } from './src/ui/player/VisibilityBadge.js';
@@ -43,6 +44,7 @@ let visibilityManager;
let scryingPoolController;
let scenePresetManager;
let playerPrivacyManager;
let portraitFallbackHandler;
let avTileAdapter;
let roleRenderer;
let visibilityBadge;
@@ -193,6 +195,10 @@ Hooks.once("ready", () => {
// Story 4.1: Create PlayerPrivacyManager for automation opt-ins
playerPrivacyManager = new PlayerPrivacyManager(adapter);
// Story 4.2: Create PortraitFallbackHandler for custom portrait fallback
portraitFallbackHandler = new PortraitFallbackHandler(adapter, playerPrivacyManager);
portraitFallbackHandler.init();
// Story 3.2: Create StripOverlayLayer (shared infrastructure for UI components)
stripOverlayLayer = new StripOverlayLayer(adapter);
stripOverlayLayer.init();
@@ -228,7 +234,8 @@ Hooks.once("ready", () => {
// Story 1.5: AV tile integration + GM control UI
avTileAdapter = new AVTileAdapter(adapter);
roleRenderer = new RoleRenderer(stateStore, scryingPoolController, avTileAdapter, adapter);
// Story 4.2: Pass portraitFallbackHandler for custom portrait display
roleRenderer = new RoleRenderer(stateStore, scryingPoolController, avTileAdapter, adapter, portraitFallbackHandler);
roleRenderer.init();
if (adapter.users.isGM() && game.webrtc !== null) {
roleRenderer.openStrip();
@@ -273,11 +280,13 @@ Hooks.once("ready", () => {
}
// Story 4.1: Initialize PlayerPrivacyPanelMenu with DI dependencies
initPlayerPrivacyPanelMenu(adapter, playerPrivacyManager);
// Story 4.2: Pass portraitFallbackHandler for portrait selection
initPlayerPrivacyPanelMenu(adapter, playerPrivacyManager, portraitFallbackHandler);
// Story 4.1: Register GM-only Player Privacy Selector (Task 5.2)
// Allows GM to select any player and view their privacy settings in read-only mode
initGMPlayerPrivacySelector(adapter, playerPrivacyManager);
// Story 4.2: Pass portraitFallbackHandler for portrait display
initGMPlayerPrivacySelector(adapter, playerPrivacyManager, portraitFallbackHandler);
// Story 4.1: Register PlayerPrivacyPanel in module settings (Task 5.1)
// Note: Must be registered AFTER init calls to avoid race conditions