This commit is contained in:
2026-04-27 14:23:19 +08:00
parent 09d3fe59b3
commit fa2dbb310b
75 changed files with 7363 additions and 1487 deletions

View File

@@ -2,8 +2,12 @@ import {useEffect, useLayoutEffect, useRef, useState} from 'react';
import {resolveCompatibilityTemplateWorldType} from '../../data/customWorldRuntime';
import {MONSTERS_BY_WORLD, PLAYER_BASE_X_METERS} from '../../data/hostileNpcs';
import {resolveActiveSceneActBackgroundImage} from '../../services/customWorldSceneActRuntime';
import {AnimationState, WorldType} from '../../types';
import {buildEncounterFromSceneNpc} from '../../data/scenePresets';
import {
resolveActiveSceneActBackgroundImage,
resolveActiveSceneActEncounterNpcIds,
} from '../../services/customWorldSceneActRuntime';
import {AnimationState, type Encounter, type SceneNpc, WorldType} from '../../types';
import {GameCanvasEffectLayer} from './GameCanvasEffectLayer';
import {GameCanvasEntityLayer} from './GameCanvasEntityLayer';
import {GameCanvasOverlayLayer} from './GameCanvasOverlayLayer';
@@ -66,6 +70,42 @@ export function GameCanvasRuntime({
const backgroundSrc = activeSceneActBackground
|| currentScenePreset?.imageSrc
|| (resolvedWorldType === WorldType.WUXIA ? '/scene_bg/45_PixelSky.png' : '/scene_bg/47_PixelSky.png');
const activeSceneActEncounterNpcIds =
currentScenePreset?.id
? resolveActiveSceneActEncounterNpcIds({
profile: customWorldProfile,
sceneId: currentScenePreset.id,
storyEngineMemory,
})
: [];
const activeSceneActNpcIdSet = new Set(activeSceneActEncounterNpcIds);
const sceneActAmbientEncounters = (currentScenePreset?.npcs ?? [])
.filter((npc: SceneNpc) => {
if (activeSceneActNpcIdSet.size === 0) {
return false;
}
const candidateIds = [npc.id, npc.characterId].filter(
(value): value is string => Boolean(value),
);
const encounterIds = [encounter?.id, encounter?.characterId].filter(
(value): value is string => Boolean(value),
);
return (
candidateIds.some((id) => activeSceneActNpcIdSet.has(id)) &&
!candidateIds.some((id) => encounterIds.includes(id))
);
})
.slice(0, 2)
.map((npc: SceneNpc, index): Encounter => {
const npcEncounter = buildEncounterFromSceneNpc(npc);
return {
...npcEncounter,
xMeters: 3.2 + 1.08,
id: npcEncounter.id ?? `${npc.id}:ambient-${index}`,
};
});
const monsters = resolvedWorldType ? MONSTERS_BY_WORLD[resolvedWorldType] : [];
const groundBottom = '18%';
const stageLiftPx = 68;
@@ -181,6 +221,7 @@ export function GameCanvasRuntime({
/>
<GameCanvasEntityLayer
companions={companions}
sceneActAmbientEncounters={sceneActAmbientEncounters}
currentScenePreset={currentScenePreset}
sceneTransitionToken={sceneTransitionToken}
isSceneTransitionEntering={isSceneTransitionEntering}