refactor: 移动顶层实施对象

This commit is contained in:
AncTe committed 2026-06-29 23:58:52 +08:00
1 parent 327bdc840b
commit 3d72954bb2
7 files changed
+157 -186

No files matched your search

+5 -9
View File
@@ -66,8 +66,7 @@ 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';
import { DefaultHeroMoveTopImpl } from './hero';
export class CoreState implements ICoreState {
// Layer 0 公共层,最底层的接口,不会依赖任何其他内容,一般是工具性接口及不需要存档的数据
@@ -211,14 +210,11 @@ export class CoreState implements ICoreState {
});
// 勇士顶层初始化
const passChecker = new DefaultPassChecker(this.maps);
const hitAction = new DefaultHitAction(
this.maps,
this.triggerCollector,
this
const heroMoveTopImpl = new DefaultHeroMoveTopImpl(
this,
this.triggerCollector
);
this.hero.location.mover.useTerrainChecker(passChecker);
this.hero.location.mover.useHitAction(hitAction);
this.hero.location.mover.useTopImplementation(heroMoveTopImpl);
//#endregion
}
@@ -1,37 +0,0 @@
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<void> {
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);
}
}
+1 -1
View File
@@ -1,2 +1,2 @@
export * from './passChecker';
export * from './moverImpl';
export * from './types';
@@ -1,13 +1,25 @@
import { FaceDirection, PassBit } from '@user/data-common';
import {
IHeroMoveTopHandler,
IHeroMoveTopImpl,
IMapStore,
IPassCheckerHandler,
ITerrainPassChecker
IStateBase
} from '@user/data-base';
import { FaceDirection, PassBit } from '@user/data-common';
import { ITriggerCollector, ITriggerHandler } from '@user/data-system';
import { isNil } from 'lodash-es';
export class DefaultPassChecker implements ITerrainPassChecker {
constructor(readonly maps: IMapStore) {}
export class DefaultHeroMoveTopImpl implements IHeroMoveTopImpl {
/** 地图存储对象 */
private readonly maps: IMapStore;
constructor(
private readonly state: IStateBase,
private readonly collector: ITriggerCollector
) {
this.maps = state.maps;
}
//#region 通行性判断
/**
* 将朝向转换为对应的通行性位掩码。
@@ -36,7 +48,7 @@ export class DefaultPassChecker implements ITerrainPassChecker {
return x >= 0 && y >= 0 && x < width && y < height;
}
canPass(handler: IPassCheckerHandler): boolean {
canPass(handler: IHeroMoveTopHandler): boolean {
const { currLoc, nextLoc, direction, floorId, face } = handler;
if (isNil(floorId)) return false;
@@ -96,7 +108,7 @@ export class DefaultPassChecker implements ITerrainPassChecker {
return true;
}
shouldHit(handler: IPassCheckerHandler): boolean {
shouldHit(handler: IHeroMoveTopHandler): boolean {
const { nextLoc, floorId } = handler;
if (isNil(floorId)) return false;
const layerState = this.maps.getLayerState(floorId);
@@ -110,4 +122,31 @@ export class DefaultPassChecker implements ITerrainPassChecker {
if (!next || !next.raw) return false;
return !next.raw.eventPass;
}
//#endregion
//#region 触发器行为
async hit(handler: IHeroMoveTopHandler): Promise<void> {
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);
}
//#endregion
}