feat(01-10): persist point event lifecycle state

- Add the approved coordinate-indexed pointEvents save field.
- Document preserve/crop resize and clear resize2 semantics.
This commit is contained in:
unanmed 2026-09-09 00:08:58 +08:00
parent bcfa1f9467
commit d3eeb1eb19

View File

@ -5,57 +5,147 @@ import {
ITileLocator
} from '@motajs/common';
import {
EventTrigger,
FaceDirection,
IDataCommonExtended,
IGameEvent,
ILocationHelper,
IMapBlockRawData,
IMapRawData,
IMoverController,
IObjectMovable,
IObjectMover,
IReadonlyGameEvent,
IRoleFaceBinder,
ISaveableContent,
ITileRawData
} from '@user/data-common';
import { ITileStore } from '@user/data-common';
//#region 事件信息
export const enum BlockEventType {
/** 普通事件类型,一般是手动触发的 */
CommonEvent,
/** 点事件类型 */
PointEvent,
/** 图块事件类型 */
TileEvent
}
export interface IBlockEventParam {
/** 自定义参数 */
readonly custom: Record<string, any>;
}
export interface IBlockEventEnv extends IDataCommonExtended {
/** 事件类型 */
readonly type: BlockEventType;
/** 本次事件的触发器类型 */
readonly trigger: EventTrigger;
/** 触发事件时玩家的位置 */
readonly heroLocator: Readonly<ITileLocator>;
/** 触发事件时触发者的位置,有可能不存在 */
readonly triggerLocator: Readonly<ITileLocator> | null;
/** 触发事件的图块,有可能不存在 */
readonly tile: IReadonlyTileBase | null;
/** 触发事件的图层,有可能不存在 */
readonly layer: IMapLayer | null;
/** 触发事件的地图,有可能不存在 */
readonly map: IGameMap | null;
}
export interface IReadonlyBlockEvent<R = void> extends IReadonlyGameEvent<
IBlockEventParam,
IBlockEventEnv,
R
> {}
export interface IBlockEvent<R = void> extends IGameEvent<
IBlockEventParam,
IBlockEventEnv,
R
> {}
//#region 图块信息
export interface IMapBlockSaveBase {
/** 此图块的触发器 */
triggers?: ReadonlySet<number>;
/** 当前图块的事件,键表示优先级,值表示事件在 `IGameEventStore` 中的 id */
readonly events?: ReadonlyMap<number, string>;
}
export interface IStaticBlockSave extends IMapBlockSaveBase {}
export interface IDynamicBlockSave extends IMapBlockSaveBase {
/** 此动态图块的图块数字 */
num: number;
readonly num: number;
}
export interface ITileBase {
export interface IReadonlyEventView {
/**
*
* @returns `IGameEventStore`
*/
get(): ReadonlyMap<number, string>;
/**
*
*/
dirty(): boolean;
}
export interface ILayerEventView extends IReadonlyEventView {
/**
*
* @param priority
* @param event `IGameEventStore` id
*/
set(priority: number, event: string): void;
/**
*
* @param priority
*/
delete(priority: number): void;
/**
*
*/
clear(): void;
/**
* `dirty`
*/
markPure(): void;
}
export interface IReadonlyTileBase {
/** 该图块所处的位置 */
readonly locator: ITileLocator;
/** 该图块所处的图层对象 */
readonly layer: IMapLayer;
/** 包含的触发器列表,不存在时表示使用图块本身的触发器 */
readonly triggers: ReadonlySet<number> | null;
/**
*
*/
raw(): ITileRawData | null;
/**
*
*/
block(): IMapBlockRawData | null;
/**
*
*/
num(): number;
/**
*
*/
tileEvent(): IReadonlyEventView;
/**
*
*/
pointEvent(): IReadonlyEventView | null;
}
export interface ITileBase extends IReadonlyTileBase {
/**
*
* @param num
@ -69,26 +159,14 @@ export interface ITileBase {
setFaceDirection(direction: FaceDirection): number;
/**
* 退
*
*/
clearTrigger(): void;
tileEvent(): ILayerEventView;
/**
*
* @param trigger
*
*/
addTrigger(trigger: number): void;
/**
*
* @param trigger
*/
deleteTrigger(trigger: number): void;
/**
*
*/
useEmptyTrigger(): void;
pointEvent(): ILayerEventView | null;
}
export interface IStaticTile
@ -328,32 +406,32 @@ interface ILayerDynamic {
*
* @param x
* @param y
* @param keepTrigger
* @param keepEvent
*/
transferToDynamic(
x: number,
y: number,
keepTrigger?: boolean
keepEvent?: boolean
): IDynamicTile | null;
/**
*
* @param tile
* @param keepTrigger 退
* @param keepEvent 退
*/
transferToStatic(
tile: IDynamicTile,
keepTrigger?: boolean
keepEvent?: boolean
): IStaticTile | null;
/**
*
* @param tile
* @param keepTrigger 退
* @param keepEvent 退
*/
transferToStaticIfSafe(
tile: IDynamicTile,
keepTrigger?: boolean
keepEvent?: boolean
): IStaticTile | null;
/**
@ -414,6 +492,11 @@ export interface IMapLayerSave {
*
*/
readonly dynamicBlocks?: ReadonlyMap<number, Readonly<IDynamicBlockSave>[]>;
/**
* id
*/
readonly pointEvents?: ReadonlyMap<number, ReadonlyMap<number, string>>;
}
export interface IMapLayer
@ -487,6 +570,21 @@ export interface IMapLayer
*/
closeDoor(num: number, x: number, y: number): Promise<void>;
/**
*
* @param x
* @param y
*/
event(x: number, y: number): ILayerEventView | null;
/**
* `event(x, y)?.get()`
* @param x
* @param y
* @returns `IGameEventStore`
*/
getPointEvent(x: number, y: number): ReadonlyMap<number, string> | null;
/**
*
* `true` `true`
@ -503,14 +601,14 @@ export interface IMapLayer
export interface IResizableMapLayer extends IMapLayer {
/**
*
*
* @param width
* @param height
*/
resize(width: number, height: number): void;
/**
*
*
* @param width
* @param height
*/