diff --git a/packages-user/data-base/src/hero/types.ts b/packages-user/data-base/src/hero/types.ts index 4207fc2..0746ab9 100644 --- a/packages-user/data-base/src/hero/types.ts +++ b/packages-user/data-base/src/hero/types.ts @@ -212,7 +212,7 @@ export interface IHeroLocation /** 当前所在楼层 id,undefined 表示尚不处于任何楼层 */ readonly floorId: string | undefined; /** 勇士的移动对象 */ - readonly mover: IObjectMover; + readonly mover: IHeroMover; } //#endregion diff --git a/packages-user/data-state/src/core.ts b/packages-user/data-state/src/core.ts index 1706387..5361265 100644 --- a/packages-user/data-state/src/core.ts +++ b/packages-user/data-state/src/core.ts @@ -66,6 +66,8 @@ import { ILoadProgressTotal, LoadProgressTotal } from '@motajs/loader'; import { isNil } from 'lodash-es'; import { logger } from '@motajs/common'; import { ISaveSystem, SaveSystem } from './save'; +import { DefaultPassChecker } from './hero'; +import { DefaultHitAction } from './hero/hitAction'; export class CoreState implements ICoreState { // Layer 0 公共层,最底层的接口,不会依赖任何其他内容,一般是工具性接口及不需要存档的数据 @@ -208,6 +210,16 @@ export class CoreState implements ICoreState { ); }); + // 勇士顶层初始化 + const passChecker = new DefaultPassChecker(this.maps); + const hitAction = new DefaultHitAction( + this.maps, + this.triggerCollector, + this + ); + this.hero.location.mover.useTerrainChecker(passChecker); + this.hero.location.mover.useHitAction(hitAction); + //#endregion } diff --git a/packages-user/data-state/src/hero/hitAction.ts b/packages-user/data-state/src/hero/hitAction.ts new file mode 100644 index 0000000..c377d3a --- /dev/null +++ b/packages-user/data-state/src/hero/hitAction.ts @@ -0,0 +1,37 @@ +import { + IHeroHitAction, + IHeroHitHandler, + IMapStore, + IStateBase +} from '@user/data-base'; +import { ITriggerCollector, ITriggerHandler } from '@user/data-system'; +import { isNil } from 'lodash-es'; + +export class DefaultHitAction implements IHeroHitAction { + constructor( + readonly maps: IMapStore, + readonly collector: ITriggerCollector, + readonly state: IStateBase + ) {} + + async hit(handler: IHeroHitHandler): Promise { + if (isNil(handler.floorId)) return; + + const map = this.maps.getLayerState(handler.floorId); + if (!map) return; + const event = map.eventLayer; + if (!event) return; + + const { x, y } = handler.nextLoc; + const triggers = this.collector.collect(x, y, event); + + const triggerHandler: ITriggerHandler = { + state: this.state, + layer: map, + mapLayer: event, + locator: handler.nextLoc + }; + + return triggers.trigger(triggerHandler); + } +} diff --git a/packages-user/data-state/src/hero/passChecker.ts b/packages-user/data-state/src/hero/passChecker.ts index fc2e9ab..e4f837b 100644 --- a/packages-user/data-state/src/hero/passChecker.ts +++ b/packages-user/data-state/src/hero/passChecker.ts @@ -1,6 +1,5 @@ import { FaceDirection, PassBit } from '@user/data-common'; import { - IHeroState, IMapStore, IPassCheckerHandler, ITerrainPassChecker @@ -8,10 +7,7 @@ import { import { isNil } from 'lodash-es'; export class DefaultPassChecker implements ITerrainPassChecker { - constructor( - readonly maps: IMapStore, - readonly hero: IHeroState - ) {} + constructor(readonly maps: IMapStore) {} /** * 将朝向转换为对应的通行性位掩码。 @@ -54,10 +50,10 @@ export class DefaultPassChecker implements ITerrainPassChecker { return true; } - const layerState = this.maps.getLayerState(floorId); - if (!layerState) return false; - const eventLayer = layerState.eventLayer; - if (!eventLayer) return false; + const map = this.maps.getLayerState(floorId); + if (!map) return false; + const event = map.eventLayer; + if (!event) return false; const { x, y } = currLoc; const { x: nx, y: ny } = nextLoc; @@ -70,8 +66,8 @@ export class DefaultPassChecker implements ITerrainPassChecker { let canEnter = true; // 判断事件层 - const curr = eventLayer.getLocationData(x, y); - const next = eventLayer.getLocationData(nx, ny); + const curr = event.getLocationData(x, y); + const next = event.getLocationData(nx, ny); if (curr && curr.raw) { canLeave = !!(leaveMask & curr.raw.pass.outPass); } @@ -82,8 +78,8 @@ export class DefaultPassChecker implements ITerrainPassChecker { if (!canLeave || !canEnter) return false; // 判断其他层 - for (const layer of layerState.layerList) { - if (layer === eventLayer) continue; + for (const layer of map.layerList) { + if (layer === event) continue; const curr = layer.getLocationData(x, y); const next = layer.getLocationData(nx, ny); let canLeave = true;