From 1a569804d8ccee61c3f505682f0041a8068d5746 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Tue, 21 Apr 2026 15:46:59 +0800 Subject: [PATCH] refactor: getFlag --- packages-user/client-modules/src/core.ts | 2 + .../client-modules/src/render/ui/main.tsx | 11 +- .../client-modules/src/render/ui/settings.tsx | 8 +- packages-user/data-base/package.json | 3 +- packages-user/data-base/src/enemy/damage.ts | 140 ++++-- packages-user/data-base/src/enemy/manager.ts | 24 +- packages-user/data-base/src/enemy/special.ts | 12 +- packages-user/data-base/src/enemy/types.ts | 72 +-- packages-user/data-fallback/src/battle.ts | 10 +- packages-user/data-fallback/src/flag.ts | 49 +- packages-user/data-fallback/src/hero.ts | 6 +- packages-user/data-state/src/core.ts | 42 +- .../data-state/src/enemy/calculator.ts | 3 +- packages-user/data-state/src/index.ts | 10 +- packages-user/data-state/src/ins.ts | 10 + packages-user/entry-client/package.json | 1 - .../legacy-plugin-client/src/dev/hotReload.ts | 10 +- packages-user/legacy-plugin-data/src/hook.ts | 22 +- packages-user/legacy-plugin-data/src/shop.ts | 6 +- packages/common/src/logger.json | 2 +- pnpm-lock.yaml | 409 +++++++++------- prompt.md | 3 +- public/libs/control.js | 441 ++---------------- public/libs/core.js | 2 +- public/libs/enemys.js | 77 +-- public/libs/events.js | 106 +++-- public/libs/items.js | 14 +- public/libs/maps.js | 57 +-- public/libs/ui.js | 7 +- public/libs/utils.js | 14 +- public/project/functions.js | 59 ++- src/types/declaration/control.d.ts | 4 +- task.md | 25 + 33 files changed, 753 insertions(+), 908 deletions(-) create mode 100644 packages-user/data-state/src/ins.ts create mode 100644 task.md diff --git a/packages-user/client-modules/src/core.ts b/packages-user/client-modules/src/core.ts index 97f1b15..8878f28 100644 --- a/packages-user/client-modules/src/core.ts +++ b/packages-user/client-modules/src/core.ts @@ -1,5 +1,7 @@ import { state } from '@user/data-state'; import { ClientCore } from './client'; +// TODO: 逐渐弱化 ClientCore 的单例概念,每个接口都通过参数传入 IClientCore 对象 + /** 客户端实例 */ export const client = new ClientCore(state); diff --git a/packages-user/client-modules/src/render/ui/main.tsx b/packages-user/client-modules/src/render/ui/main.tsx index 1b1c77c..40a77a5 100644 --- a/packages-user/client-modules/src/render/ui/main.tsx +++ b/packages-user/client-modules/src/render/ui/main.tsx @@ -96,7 +96,8 @@ const MainScene = defineComponent(() => { //#region 状态更新 const updateStatus = () => { if (!core.status || !core.status.hero || !core.status.floorId) return; - hideStatus.value = core.getFlag('hideStatusBar', false); + const flags = client.data.flags; + hideStatus.value = flags.getFieldValueDefaults('hideStatusBar', false); const hero = core.status.hero; leftStatus.atk = getHeroStatusOn('atk'); @@ -116,9 +117,9 @@ const MainScene = defineComponent(() => { leftStatus.pickaxe = core.itemCount('pickaxe'); leftStatus.bomb = core.itemCount('bomb'); leftStatus.centerFly = core.itemCount('centerFly'); - leftStatus.poison = core.getFlag('poison', true); - leftStatus.weak = core.getFlag('weak', true); - leftStatus.curse = core.getFlag('curse', true); + leftStatus.poison = flags.getFieldValueDefaults('poison', true); + leftStatus.weak = flags.getFieldValueDefaults('weak', true); + leftStatus.curse = flags.getFieldValueDefaults('curse', true); leftStatus.floor = core.status.floorId; leftStatus.lv = core.getLvName(hero.lv); @@ -129,7 +130,7 @@ const MainScene = defineComponent(() => { replayStatus.played = totalList.length - toReplay.length; replayStatus.total = totalList.length; - rightStatus.exampleHard = flags.hard; + rightStatus.exampleHard = flags.getFieldValueDefaults('hard', 0); }; const updateDataFallback = () => { diff --git a/packages-user/client-modules/src/render/ui/settings.tsx b/packages-user/client-modules/src/render/ui/settings.tsx index dd4840c..6c4e904 100644 --- a/packages-user/client-modules/src/render/ui/settings.tsx +++ b/packages-user/client-modules/src/render/ui/settings.tsx @@ -25,6 +25,7 @@ import { compressToBase64 } from 'lz-string'; import { ViewMapUI } from './viewmap'; import { CENTER_LOC, FULL_LOC, MAIN_HEIGHT, POP_BOX_WIDTH } from '../../shared'; import { useKey } from '../use'; +import { client } from '../../core'; export interface MainSettingsProps extends Partial, UIComponentProps { @@ -162,7 +163,8 @@ export const ReplaySettings = defineComponent(props => { props.controller.closeAll(); core.ui.closePanel(); const route = core.status.route.slice(); - const seed = core.getFlag('__seed__'); + const flags = client.data.flags; + const seed = flags.getFieldValue('__seed__'); core.startGame(core.status.hard, seed, route); break; } @@ -216,13 +218,15 @@ export const ReplaySettings = defineComponent(props => { break; } case ReplayChoice.Download: { + const flags = client.data.flags; + const seed = flags.getFieldValue('__seed__'); core.download( core.firstData.name + '_' + core.formatDate2() + '.h5route', compressToBase64( JSON.stringify({ name: core.firstData.name, hard: core.status.hard, - seed: core.getFlag('__seed__'), + seed, route: core.encodeRoute(core.status.route) }) ) diff --git a/packages-user/data-base/package.json b/packages-user/data-base/package.json index 41e78e2..89deac7 100644 --- a/packages-user/data-base/package.json +++ b/packages-user/data-base/package.json @@ -3,7 +3,6 @@ "dependencies": { "@motajs/common": "workspace:*", "@motajs/types": "workspace:*", - "@motajs/loader": "workspace:*", - "@user/types": "workspace:*" + "@motajs/loader": "workspace:*" } } diff --git a/packages-user/data-base/src/enemy/damage.ts b/packages-user/data-base/src/enemy/damage.ts index 733b32a..72c667c 100644 --- a/packages-user/data-base/src/enemy/damage.ts +++ b/packages-user/data-base/src/enemy/damage.ts @@ -2,6 +2,7 @@ import { ITileLocator, logger } from '@motajs/common'; import { CriticalableHeroStatus, IDamageCalculator, + IDamageContext, IDamageSystem, IEnemyContext, IEnemyCritical, @@ -20,29 +21,22 @@ interface ICriticalSearchResult { readonly info: IEnemyDamageInfo; } -export class DamageSystem implements IDamageSystem { +export class DamageContext implements IDamageContext< + TAttr, + THero +> { /** 当前正在使用的计算器 */ - private calculator: IDamageCalculator | null = null; + protected calculator: IDamageCalculator | null; /** 当前勇士属性 */ - private heroStatus: IReadonlyHeroAttribute | null = null; - /** 怪物伤害缓存 */ - private readonly cache: Map, IEnemyDamageInfo> = - new Map(); + protected heroStatus: IReadonlyHeroAttribute | null; - constructor(readonly context: IEnemyContext) {} - - useCalculator(calculator: IDamageCalculator): void { + constructor( + readonly context: IEnemyContext, + calculator: IDamageCalculator | null = null, + heroStatus: IReadonlyHeroAttribute | null = null + ) { this.calculator = calculator; - this.markAllDirty(); - } - - getCalculator(): IDamageCalculator | null { - return this.calculator; - } - - bindHeroStatus(hero: IReadonlyHeroAttribute): void { - this.heroStatus = hero; - this.markAllDirty(); + this.heroStatus = heroStatus; } /** @@ -72,17 +66,10 @@ export class DamageSystem implements IDamageSystem { const locator = this.context.getEnemyLocatorByView(enemy); if (!hero || !locator) return null; - const cached = this.cache.get(enemy); - if (cached) { - return cached; - } - const computed = enemy.getComputedEnemy(); const handler = this.createReadonlyHandler(computed, locator, hero); - const info = this.calculator.calculate(handler); - this.cache.set(enemy, info); - return info; + return this.calculator.calculate(handler); } getDamageInfoByComputed( @@ -98,34 +85,14 @@ export class DamageSystem implements IDamageSystem { } const hero = this.heroStatus; - if (!hero) return null; const view = this.context.getViewByComputed(enemy); - if (!view) return null; + if (!hero || !view) return null; const locator = this.context.getEnemyLocatorByView(view); if (!locator) return null; - const cached = this.cache.get(view); - if (cached) { - return cached; - } - const handler = this.createReadonlyHandler(enemy, locator, hero); - const info = this.calculator.calculate(handler); - this.cache.set(view, info); - return info; - } - - markDirty(enemy: IEnemyView): void { - this.cache.delete(enemy); - } - - deleteEnemy(enemy: IEnemyView): void { - this.cache.delete(enemy); - } - - markAllDirty(): void { - this.cache.clear(); + return this.calculator.calculate(handler); } *calculateCritical( @@ -238,3 +205,78 @@ export class DamageSystem implements IDamageSystem { }; } } + +export class DamageSystem + extends DamageContext + implements IDamageSystem +{ + /** 怪物伤害缓存 */ + private readonly cache: Map, IEnemyDamageInfo> = + new Map(); + + constructor(context: IEnemyContext) { + super(context); + } + + useCalculator(calculator: IDamageCalculator): void { + this.calculator = calculator; + this.markAllDirty(); + } + + getCalculator(): IDamageCalculator | null { + return this.calculator; + } + + bindHeroStatus(hero: IReadonlyHeroAttribute | null): void { + this.heroStatus = hero; + this.markAllDirty(); + } + + getDamageInfo(enemy: IEnemyView): IEnemyDamageInfo | null { + const cached = this.cache.get(enemy); + if (cached) { + return cached; + } + + const info = super.getDamageInfo(enemy); + if (!info) return info; + this.cache.set(enemy, info); + + return info; + } + + getDamageInfoByComputed( + enemy: IReadonlyEnemy + ): IEnemyDamageInfo | null { + const view = this.context.getViewByComputed(enemy); + if (view) { + const cached = this.cache.get(view); + if (cached) { + return cached; + } + } + + const info = super.getDamageInfoByComputed(enemy); + if (!view || !info) return info; + + this.cache.set(view, info); + + return info; + } + + markDirty(enemy: IEnemyView): void { + this.cache.delete(enemy); + } + + deleteEnemy(enemy: IEnemyView): void { + this.cache.delete(enemy); + } + + markAllDirty(): void { + this.cache.clear(); + } + + with(hero: IHeroAttribute): IDamageContext { + return new DamageContext(this.context, this.calculator, hero); + } +} diff --git a/packages-user/data-base/src/enemy/manager.ts b/packages-user/data-base/src/enemy/manager.ts index 8be7a86..2f69c34 100644 --- a/packages-user/data-base/src/enemy/manager.ts +++ b/packages-user/data-base/src/enemy/manager.ts @@ -42,7 +42,7 @@ export class EnemyManager implements IEnemyManager { this.attributeRegistry.set(name, defaultValue); } - fromLegacyEnemy(enemy: Enemy): IEnemy { + fromLegacyEnemy(code: number, enemy: Enemy): IEnemy { // 如果该旧样板怪物已经通过 addPrefabFromLegacy 注册为模板,直接克隆模板 const existingCode = this.legacyIdToCode.get(enemy.id); if (existingCode) { @@ -52,7 +52,7 @@ export class EnemyManager implements IEnemyManager { } } - return this.convertLegacyEnemy(0, enemy); + return this.convertLegacyEnemy(code, enemy); } /** @@ -109,6 +109,14 @@ export class EnemyManager implements IEnemyManager { return prefab.clone(); } + private internalGetPrefab(code: number | string) { + if (typeof code === 'number') { + return this.prefabByCode.get(code) ?? null; + } else { + return this.prefabById.get(code) ?? null; + } + } + addPrefab(enemy: IEnemy): void { if ( this.prefabByCode.has(enemy.code) || @@ -140,10 +148,7 @@ export class EnemyManager implements IEnemyManager { } deletePrefab(code: number | string): void { - const prefab = - typeof code === 'number' - ? this.prefabByCode.get(code) - : this.prefabById.get(code); + const prefab = this.internalGetPrefab(code); if (!prefab) return; this.prefabByCode.delete(prefab.code); this.prefabById.delete(prefab.id); @@ -156,4 +161,11 @@ export class EnemyManager implements IEnemyManager { this.prefabByCode.set(enemy.code, enemy); this.prefabById.set(enemy.id, enemy); } + + reusePrefab(source: number | string, code: number, id: string): void { + const prefab = this.internalGetPrefab(source); + if (!prefab) return; + this.prefabByCode.set(code, prefab); + this.prefabById.set(id, prefab); + } } diff --git a/packages-user/data-base/src/enemy/special.ts b/packages-user/data-base/src/enemy/special.ts index 7a7a66a..5072728 100644 --- a/packages-user/data-base/src/enemy/special.ts +++ b/packages-user/data-base/src/enemy/special.ts @@ -1,6 +1,8 @@ import { ISpecial, SpecialCreation } from './types'; -export interface ICommonSerializableSpecialConfig { +// TODO: 颜色参数 + +export interface ICommonSpecialConfig { /** 获取特殊属性的名称 */ getSpecialName: (special: ISpecial) => string; /** 获取特殊属性的描述 */ @@ -13,7 +15,7 @@ export class CommonSerializableSpecial implements ISpecial { constructor( readonly code: number, public value: T, - readonly config: ICommonSerializableSpecialConfig + readonly config: ICommonSpecialConfig ) {} setValue(value: T): void { @@ -50,7 +52,7 @@ export class NonePropertySpecial implements ISpecial { constructor( readonly code: number, - readonly config: ICommonSerializableSpecialConfig + readonly config: ICommonSpecialConfig ) {} setValue(_value: void): void { @@ -81,7 +83,7 @@ export class NonePropertySpecial implements ISpecial { export function defineCommonSerializableSpecial( code: number, value: T, - config: ICommonSerializableSpecialConfig + config: ICommonSpecialConfig ): SpecialCreation { return () => new CommonSerializableSpecial(code, structuredClone(value), config); @@ -89,7 +91,7 @@ export function defineCommonSerializableSpecial( export function defineNonePropertySpecial( code: number, - config: ICommonSerializableSpecialConfig + config: ICommonSpecialConfig ): SpecialCreation { return () => new NonePropertySpecial(code, config); } diff --git a/packages-user/data-base/src/enemy/types.ts b/packages-user/data-base/src/enemy/types.ts index 4577bfa..210381a 100644 --- a/packages-user/data-base/src/enemy/types.ts +++ b/packages-user/data-base/src/enemy/types.ts @@ -1,5 +1,5 @@ import { IRange, ITileLocator } from '@motajs/common'; -import { IReadonlyHeroAttribute } from '../hero'; +import { IHeroAttribute, IReadonlyHeroAttribute } from '../hero'; //#region 怪物基础 @@ -158,9 +158,10 @@ export interface IEnemyManager { /** * 根据旧样板怪物对象生成一个新的怪物对象 + * @param code 怪物数字 * @param enemy 旧样板怪物对象 */ - fromLegacyEnemy(enemy: Enemy): IEnemy; + fromLegacyEnemy(code: number, enemy: Enemy): IEnemy; /** * 创建怪物对象,如果对应数字的怪物不存在则会返回 `null` @@ -212,6 +213,14 @@ export interface IEnemyManager { * @param enemy 新的怪物模板 */ changePrefab(code: number | string, enemy: IEnemy): void; + + /** + * 让指定的怪物数字和怪物 id 复用指定的模板 + * @param source 怪物模板源 + * @param code 复用怪物数字 + * @param id 复用怪物 id + */ + reusePrefab(source: number | string, code: number, id: string): void; } //#endregion @@ -623,7 +632,38 @@ export interface IDamageCalculator { ): number; } -export interface IDamageSystem { +export interface IDamageContext { + /** + * 获取战斗伤害信息 + * @param enemy 怪物视图 + */ + getDamageInfo(enemy: IEnemyView): IEnemyDamageInfo | null; + + /** + * 根据怪物对象获取战斗伤害信息 + * @param enemy 怪物对象 + */ + getDamageInfoByComputed( + enemy: IReadonlyEnemy + ): IEnemyDamageInfo | null; + + /** + * 计算怪物在指定勇士属性下的临界 + * @param enemy 怪物视图 + * @param attribute 计算临界的目标勇士属性,比如计算攻击临界、自定义属性的临界等等 + * @param precision 临界计算精度,表示会进行多少次二分计算,一般填写 `12-16` 之间的数即可,默认是 12 + */ + calculateCritical( + enemy: IEnemyView, + attribute: CriticalableHeroStatus, + precision?: number + ): Generator; +} + +export interface IDamageSystem extends IDamageContext< + TAttr, + THero +> { /** 伤害系统所属的上下文 */ readonly context: IEnemyContext; @@ -644,20 +684,6 @@ export interface IDamageSystem { */ bindHeroStatus(hero: IReadonlyHeroAttribute | null): void; - /** - * 获取战斗伤害信息 - * @param enemy 怪物视图 - */ - getDamageInfo(enemy: IEnemyView): IEnemyDamageInfo | null; - - /** - * 根据怪物对象获取战斗伤害信息 - * @param enemy 怪物对象 - */ - getDamageInfoByComputed( - enemy: IReadonlyEnemy - ): IEnemyDamageInfo | null; - /** * 将指定的怪物标记为脏 * @param enemy 怪物视图 @@ -676,16 +702,10 @@ export interface IDamageSystem { markAllDirty(): void; /** - * 计算怪物在指定勇士属性下的临界 - * @param enemy 怪物视图 - * @param attribute 计算临界的目标勇士属性,比如计算攻击临界、自定义属性的临界等等 - * @param precision 临界计算精度,表示会进行多少次二分计算,一般填写 `12-16` 之间的数即可,默认是 12 + * 修改勇士属性,然后返回修改后勇士属性所组成的计算对象,不影响当前伤害系统的状态 + * @param modify 勇士修改函数 */ - calculateCritical( - enemy: IEnemyView, - attribute: CriticalableHeroStatus, - precision?: number - ): Generator; + with(hero: IHeroAttribute): IDamageContext; } //#endregion diff --git a/packages-user/data-fallback/src/battle.ts b/packages-user/data-fallback/src/battle.ts index 70e3622..bcdaacf 100644 --- a/packages-user/data-fallback/src/battle.ts +++ b/packages-user/data-fallback/src/battle.ts @@ -1,4 +1,9 @@ -import { DamageEnemy, ensureFloorDamage, getEnemy } from '@user/data-state'; +import { + DamageEnemy, + ensureFloorDamage, + getEnemy, + state +} from '@user/data-state'; import { hook } from '@user/data-base'; import { Patch, PatchClass } from '@motajs/legacy-common'; import { isNil } from 'lodash-es'; @@ -193,7 +198,8 @@ export function patchBattle() { // 仇恨 if (info.special.has(17)) { - core.setFlag('hatred', core.getFlag('hatred', 0) / 2); + const hatred = state.flags.getFieldValueDefaults('hatred', 0); + core.setFlag('hatred', hatred / 2); } else { core.addFlag('hatred', core.values.hatred); } diff --git a/packages-user/data-fallback/src/flag.ts b/packages-user/data-fallback/src/flag.ts index 7f5c05d..c0afddf 100644 --- a/packages-user/data-fallback/src/flag.ts +++ b/packages-user/data-fallback/src/flag.ts @@ -9,7 +9,7 @@ export function patchFlags(state: ICoreState) { const patch = new Patch(PatchClass.Control); const flags = state.flags; patch.add('setFlag', (name, value) => { - logger.warn(56, 'core.setFlag', 'IFlagSystem'); + logger.warn(56, 'core.setFlag', 'state.flags.setFieldValue'); if (value === null || value === undefined) { flags.deleteField(name); } else { @@ -17,7 +17,7 @@ export function patchFlags(state: ICoreState) { } }); patch.add('getFlag', (name: string, defaultValue?: T) => { - logger.warn(56, 'core.getFlag', 'IFlagSystem'); + logger.warn(56, 'core.getFlag', 'state.flags.getFieldValueDefaults'); if (defaultValue === undefined) { return flags.getFieldValue(name); } else { @@ -25,14 +25,57 @@ export function patchFlags(state: ICoreState) { } }); patch.add('addFlag', (name, value) => { - logger.warn(56, 'core.addFlag', 'IFlagSystem'); + logger.warn(56, 'core.addFlag', 'state.flags.addFieldValue'); if (typeof value !== 'number') return; flags.addFieldValue(name, value); }); patch.add('hasFlag', name => { + logger.warn(56, 'core.hasFlag', 'state.flags.occupied'); return flags.occupied(name); }); patch.add('removeFlag', name => { + logger.warn(56, 'core.removeFlag', 'state.flags.deleteField'); flags.deleteField(name); }); + + const switchName = ( + x?: number, + y?: number, + floorId?: string, + name?: string + ) => { + return ( + (floorId ?? core.status.floorId ?? ':f') + + '@' + + (x ?? 'x') + + '@' + + (y ?? 'y') + + '@' + + name + ); + }; + + patch.add('getSwitch', (x, y, floorId, name, defaultValue) => { + logger.warn(56, 'core.getSwitch', 'state.flags.getFieldValue'); + return flags.getFieldValueDefaults( + switchName(x, y, floorId, name), + defaultValue + ); + }); + patch.add('setSwitch', (x, y, floorId, name, value) => { + logger.warn(56, 'core.setSwitch', 'state.flags.setFieldValue'); + flags.setFieldValue(switchName(x, y, floorId, name), value); + }); + patch.add('addSwitch', (x, y, floorId, name, value) => { + logger.warn(56, 'core.addSwitch', 'state.flags.addFieldValue'); + flags.addFieldValue(switchName(x, y, floorId, name), value ?? 0); + }); + patch.add('hasSwitch', (x, y, floorId, name) => { + logger.warn(56, 'core.hasSwitch', 'state.flags.occupied'); + return flags.occupied(switchName(x, y, floorId, name)); + }); + patch.add('removeSwitch', (x, y, floorId, name) => { + logger.warn(56, 'core.removeSwitch', 'state.flags.deleteField'); + flags.deleteField(switchName(x, y, floorId, name)); + }); } diff --git a/packages-user/data-fallback/src/hero.ts b/packages-user/data-fallback/src/hero.ts index d889bc3..e7e609c 100644 --- a/packages-user/data-fallback/src/hero.ts +++ b/packages-user/data-fallback/src/hero.ts @@ -8,12 +8,14 @@ export function patchHero(state: ICoreState) { const attr = state.hero.getModifiableAttribute(); const proxy = new Proxy(hero, { set(target, p, newValue) { + logger.warn(56, 'core.status.hero', 'state.hero'); target[p] = newValue; // @ts-expect-error 旧样板无法处理此类型 attr.setBaseAttribute(p, newValue); return true; }, get(_, p) { + logger.warn(56, 'core.status.hero', 'state.hero'); // @ts-expect-error 旧样板无法处理此类型 return attr.getBaseAttribute(p); } @@ -23,11 +25,11 @@ export function patchHero(state: ICoreState) { // 不允许再使用旧样板的 flags 接口 const flagsProxy = new Proxy(core.status.hero.flags, { set() { - logger.error(54); + logger.error(54, 'flags', 'state.flags'); return false; }, get() { - logger.error(54); + logger.error(54, 'flags', 'state.flags'); return undefined; } }); diff --git a/packages-user/data-state/src/core.ts b/packages-user/data-state/src/core.ts index d5b6c76..4f1b491 100644 --- a/packages-user/data-state/src/core.ts +++ b/packages-user/data-state/src/core.ts @@ -1,6 +1,6 @@ import { ICoreState, IStateSaveData } from './types'; import { ILayerState, LayerState } from './map'; -import { IRoleFaceBinder, RoleFaceBinder } from './common'; +import { FaceDirection, IRoleFaceBinder, RoleFaceBinder } from './common'; import { DamageSystem, EnemyContext, @@ -15,7 +15,8 @@ import { IFlagSystem, FlagSystem, IMotaDataLoader, - MotaDataLoader + MotaDataLoader, + loading } from '@user/data-base'; import { IEnemyAttr } from './enemy/types'; import { @@ -31,6 +32,7 @@ import { import { HERO_DEFAULT_ATTRIBUTE, TILE_HEIGHT, TILE_WIDTH } from './shared'; import { IHeroAttr } from './hero'; import { ILoadProgressTotal, LoadProgressTotal } from '@motajs/loader'; +import { isNil } from 'lodash-es'; export class CoreState implements ICoreState { readonly roleFace: IRoleFaceBinder; @@ -100,9 +102,45 @@ export class CoreState implements ICoreState { this.flags = new FlagSystem(); + // 加载先使用兼容层实现 + loading.once('loaded', () => { + this.initEnemyManager(enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80); + }); + //#endregion } + /** + * 初始化怪物管理器对象 + * @param data 旧样板怪物存储对象 + */ + private initEnemyManager(data: Record) { + // TODO: 修改怪物模板并存入存档,即 core.setEnemy + const manager = this.enemyManager; + for (const [id, enemy] of Object.entries(structuredClone(data))) { + const num = this.idNumberMap.get(id); + if (isNil(num)) continue; + if (enemy.faceIds) { + // 有 faceId 的要把其他的也映射到当前怪物 + const { left, up, right, down } = enemy.faceIds; + const leftCode = this.idNumberMap.get(left)!; + const upCode = this.idNumberMap.get(up)!; + const rightCode = this.idNumberMap.get(right)!; + const downCode = this.idNumberMap.get(down)!; + manager.addPrefabFromLegacy(downCode, enemy); + this.roleFace.malloc(downCode, FaceDirection.Down); + this.roleFace.bind(leftCode, downCode, FaceDirection.Left); + this.roleFace.bind(upCode, downCode, FaceDirection.Up); + this.roleFace.bind(rightCode, downCode, FaceDirection.Down); + manager.reusePrefab(num, leftCode, left); + manager.reusePrefab(num, upCode, up); + manager.reusePrefab(num, rightCode, right); + } else { + manager.addPrefabFromLegacy(num, enemy); + } + } + } + saveState(): IStateSaveData { return structuredClone({ followers: this.hero.mover.followers diff --git a/packages-user/data-state/src/enemy/calculator.ts b/packages-user/data-state/src/enemy/calculator.ts index 52d72d1..364ba32 100644 --- a/packages-user/data-state/src/enemy/calculator.ts +++ b/packages-user/data-state/src/enemy/calculator.ts @@ -7,6 +7,7 @@ import { import { IEnemyAttr } from './types'; import { IVampireValue } from './special'; import { IHeroAttr } from '../hero'; +import { state } from '../ins'; export class MainDamageCalculator implements IDamageCalculator< IEnemyAttr, @@ -143,7 +144,7 @@ export class MainDamageCalculator implements IDamageCalculator< // 仇恨,无法被魔防减伤 if (enemy.hasSpecial(17)) { - damage += core.getFlag('hatred', 0); + damage += state.flags.getFieldValueDefaults('hatred', 0); } return { diff --git a/packages-user/data-state/src/index.ts b/packages-user/data-state/src/index.ts index ee87910..aa2296a 100644 --- a/packages-user/data-state/src/index.ts +++ b/packages-user/data-state/src/index.ts @@ -1,9 +1,9 @@ import { loading } from '@user/data-base'; -import { CoreState } from './core'; import { isNil } from 'lodash-es'; import { FaceDirection } from './common'; import { ICoreState } from './types'; import { TILE_HEIGHT, TILE_WIDTH } from './shared'; +import { state } from './ins'; function createCoreState(state: ICoreState) { //#region 地图部分 @@ -62,13 +62,6 @@ export function create() { }); } -/** - * 数据端核心状态,目前处于过渡阶段,仅服务于渲染,不负责任何逻辑计算,会在后续把核心逻辑逐渐移动至此对象。 - * 此对象是数据端状态,本身不负责任何渲染操作,仅会向渲染端发送数据让渲染端渲染,不要把渲染操作直接放到此对象上, - * 否则可能导致录像验证失败。 - */ -export const state = new CoreState(); - export * from './common'; export * from './enemy'; export * from './hero'; @@ -76,5 +69,6 @@ export * from './legacy'; export * from './map'; export * from './core'; +export * from './ins'; export * from './shared'; export * from './types'; diff --git a/packages-user/data-state/src/ins.ts b/packages-user/data-state/src/ins.ts new file mode 100644 index 0000000..ae88703 --- /dev/null +++ b/packages-user/data-state/src/ins.ts @@ -0,0 +1,10 @@ +import { CoreState } from './core'; + +// TODO: 逐渐弱化 CoreState 的单例概念,每个接口都通过参数传入 ICoreState 对象 + +/** + * 数据端核心状态,目前处于过渡阶段,仅服务于渲染,不负责任何逻辑计算,会在后续把核心逻辑逐渐移动至此对象。 + * 此对象是数据端状态,本身不负责任何渲染操作,仅会向渲染端发送数据让渲染端渲染,不要把渲染操作直接放到此对象上, + * 否则可能导致录像验证失败。 + */ +export const state = new CoreState(); diff --git a/packages-user/entry-client/package.json b/packages-user/entry-client/package.json index db7635d..30dfc82 100644 --- a/packages-user/entry-client/package.json +++ b/packages-user/entry-client/package.json @@ -9,7 +9,6 @@ "@motajs/system": "workspace:*", "@motajs/legacy-common": "workspace:*", "@motajs/legacy-client": "workspace:*", - "@motajs/legacy-data": "workspace:*", "@motajs/legacy-ui": "workspace:*", "@motajs/legacy-system": "workspace:*", "@user/client-base": "workspace:*", diff --git a/packages-user/legacy-plugin-client/src/dev/hotReload.ts b/packages-user/legacy-plugin-client/src/dev/hotReload.ts index dcca6c9..4b0a797 100644 --- a/packages-user/legacy-plugin-client/src/dev/hotReload.ts +++ b/packages-user/legacy-plugin-client/src/dev/hotReload.ts @@ -53,11 +53,11 @@ interface PortResponse { core.extractBlocks(data); if (data === core.status.floorId) { core.status.thisMap = core.status.maps[data]; - let weather = core.getFlag('__weather__', null); - if (!weather && core.status.thisMap.weather) - weather = core.status.thisMap.weather; - if (weather) core.setWeather(weather[0], weather[1]); - else core.setWeather(); + // let weather = core.getFlag('__weather__', null); + // if (!weather && core.status.thisMap.weather) + // weather = core.status.thisMap.weather; + // if (weather) core.setWeather(weather[0], weather[1]); + // else core.setWeather(); } core.status.maps[data].enemy?.extract(); core.status.maps[data].enemy?.calRealAttribute(); diff --git a/packages-user/legacy-plugin-data/src/hook.ts b/packages-user/legacy-plugin-data/src/hook.ts index c66aecc..7acd5c5 100644 --- a/packages-user/legacy-plugin-data/src/hook.ts +++ b/packages-user/legacy-plugin-data/src/hook.ts @@ -1,4 +1,5 @@ import { hook } from '@user/data-base'; +import { isNil } from 'lodash-es'; const potionItems: AllIdsOf<'items'>[] = [ 'redPotion', @@ -17,7 +18,7 @@ export function createHook() { const todo: any[] = []; // 检查该点的获得道具后事件。 - if (core.status.floorId == null) return; + if (isNil(core.status.floorId)) return; const event = core.floors[core.status.floorId].afterGetItem[`${x},${y}`]; if ( @@ -28,34 +29,23 @@ export function createHook() { ) { core.unshift(todo, event as any[]); } - if (core.hasFlag('spring')) { - if (!core.hasFlag('springCount')) core.setFlag('springCount', 0); - if (potionItems.includes(itemId)) { - core.addFlag('springCount', 1); - } - if (core.getFlag('springCount', 0) === 50) { - core.setFlag('springCount', 0); - core.status.hero.hpmax += core.getNakedStatus('hpmax') * 0.1; - } - core.updateStatusBar(); - } if (todo.length > 0) core.insertAction(todo, x, y); }); - hook.on('afterOpenDoor', (doorId, x, y) => { - // 开一个门后触发的事件 + hook.on('afterOpenDoor', (_doorId, x, y) => { + // 开一个门后触发的事件s const todo: any[] = []; // 检查该点的获得开门后事件。 - if (core.status.floorId == null) return; + if (isNil(core.status.floorId)) return; const event = core.floors[core.status.floorId].afterOpenDoor[`${x},${y}`]; if (event) core.unshift(todo, event as any[]); if (todo.length > 0) core.insertAction(todo, x, y); - if (core.status.event.id == null) core.continueAutomaticRoute(); + if (isNil(core.status.event.id)) core.continueAutomaticRoute(); else core.clearContinueAutomaticRoute(); }); } diff --git a/packages-user/legacy-plugin-data/src/shop.ts b/packages-user/legacy-plugin-data/src/shop.ts index ab36b56..46569d7 100644 --- a/packages-user/legacy-plugin-data/src/shop.ts +++ b/packages-user/legacy-plugin-data/src/shop.ts @@ -1,5 +1,7 @@ // @ts-nocheck +import { state } from '@user/data-state'; + type Shop = CommonShopEvent | CommonEventShopEvent | ItemShopEvent; export function openShop(shopId: string, noRoute: boolean) { @@ -40,7 +42,7 @@ export function openShop(shopId: string, noRoute: boolean) { /// 是否访问过某个快捷商店 export function isShopVisited(id: string) { flags.__shops__ ??= {}; - const shops = core.getFlag('__shops__'); + const shops = state.flags.getFieldValue('__shops__'); if (!shops[id]) shops[id] = {}; return shops[id].visited; } @@ -65,7 +67,7 @@ export function canOpenShop(id: string) { /// 启用或禁用某个快捷商店 export function setShopVisited(id: string, visited: boolean) { if (!core.hasFlag('__shops__')) core.setFlag('__shops__', {}); - const shops = core.getFlag('__shops__'); + const shops = state.flags.getFieldValue('__shops__'); if (!shops[id]) shops[id] = {}; if (visited) shops[id].visited = true; else delete shops[id].visited; diff --git a/packages/common/src/logger.json b/packages/common/src/logger.json index e58e476..74e1cc6 100644 --- a/packages/common/src/logger.json +++ b/packages/common/src/logger.json @@ -53,7 +53,7 @@ "51": "Animatable object cannot be animated by plans with the same start time.", "52": "To get divider payload, an excitation binding is expected.", "53": "Expected serializable value set as enemy's default attribute.", - "54": "Legacy flags API has been removed, consider using new APIs.", + "54": "Legacy '$1' API has been removed, consider using new APIs: '$2'.", "1201": "Floor-damage extension needs 'floor-binder' extension as dependency." }, "warn": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac1fd9c..1bb304c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@ant-design/icons-vue': specifier: ^6.1.0 - version: 6.1.0(vue@3.5.29(typescript@6.0.1-rc)) + version: 6.1.0(vue@3.5.29(typescript@6.0.3)) '@wasm-audio-decoders/ogg-vorbis': specifier: ^0.1.20 version: 0.1.20 @@ -19,7 +19,7 @@ importers: version: 0.0.0-alpha.0 ant-design-vue: specifier: ^3.2.20 - version: 3.2.20(vue@3.5.29(typescript@6.0.1-rc)) + version: 3.2.20(vue@3.5.29(typescript@6.0.3)) axios: specifier: ^1.13.6 version: 1.13.6 @@ -29,6 +29,9 @@ importers: codec-parser: specifier: ^2.5.0 version: 2.5.0 + dexie: + specifier: ^4.4.2 + version: 4.4.2 eventemitter3: specifier: ^5.0.4 version: 5.0.4 @@ -58,7 +61,7 @@ importers: version: 0.7.11 vue: specifier: ^3.5.29 - version: 3.5.29(typescript@6.0.1-rc) + version: 3.5.29(typescript@6.0.3) devDependencies: '@babel/cli': specifier: ^7.28.6 @@ -92,7 +95,7 @@ importers: version: 0.4.4(rollup@4.59.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.59.0)(tslib@2.8.1)(typescript@6.0.1-rc) + version: 11.1.6(rollup@4.59.0)(tslib@2.8.1)(typescript@6.0.3) '@types/archiver': specifier: ^6.0.4 version: 6.0.4 @@ -122,10 +125,10 @@ importers: version: 7.2.1(terser@5.46.0)(vite@7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)) '@vitejs/plugin-vue': specifier: ^6.0.4 - version: 6.0.4(vite@7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0))(vue@3.5.29(typescript@6.0.1-rc)) + version: 6.0.4(vite@7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0))(vue@3.5.29(typescript@6.0.3)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.4 - version: 5.1.4(vite@7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0))(vue@3.5.29(typescript@6.0.1-rc)) + version: 5.1.4(vite@7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0))(vue@3.5.29(typescript@6.0.3)) archiver: specifier: ^7.0.1 version: 7.0.1 @@ -170,7 +173,7 @@ importers: version: 4.5.1 madge: specifier: ^8.0.0 - version: 8.0.0(typescript@6.0.1-rc) + version: 8.0.0(typescript@6.0.3) markdown-it-mathjax3: specifier: ^4.3.2 version: 4.3.2(encoding@0.1.13) @@ -193,41 +196,47 @@ importers: specifier: ^4.21.0 version: 4.21.0 typescript: - specifier: 6.0.1-rc - version: 6.0.1-rc + specifier: 6.0.3 + version: 6.0.3 typescript-eslint: - specifier: ^8.57.0 - version: 8.57.0(eslint@9.39.4)(typescript@6.0.1-rc) + specifier: ^8.58.2 + version: 8.58.2(eslint@9.39.4)(typescript@6.0.3) vite: specifier: ^7.3.1 version: 7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@22.19.15)(rollup@4.59.0)(typescript@6.0.1-rc)(vite@7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)) + version: 4.5.4(@types/node@22.19.15)(rollup@4.59.0)(typescript@6.0.3)(vite@7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)) vitepress: specifier: ^1.6.4 - version: 1.6.4(@algolia/client-search@5.49.1)(@types/node@22.19.15)(async-validator@4.2.5)(axios@1.13.6)(less@4.5.1)(markdown-it-mathjax3@4.3.2(encoding@0.1.13))(postcss@8.5.8)(search-insights@2.17.3)(terser@5.46.0)(typescript@6.0.1-rc) + version: 1.6.4(@algolia/client-search@5.49.1)(@types/node@22.19.15)(async-validator@4.2.5)(axios@1.13.6)(less@4.5.1)(markdown-it-mathjax3@4.3.2(encoding@0.1.13))(postcss@8.5.8)(search-insights@2.17.3)(terser@5.46.0)(typescript@6.0.3) vitepress-plugin-mermaid: specifier: ^2.0.17 - version: 2.0.17(mermaid@11.12.3)(vitepress@1.6.4(@algolia/client-search@5.49.1)(@types/node@22.19.15)(async-validator@4.2.5)(axios@1.13.6)(less@4.5.1)(markdown-it-mathjax3@4.3.2(encoding@0.1.13))(postcss@8.5.8)(search-insights@2.17.3)(terser@5.46.0)(typescript@6.0.1-rc)) + version: 2.0.17(mermaid@11.12.3)(vitepress@1.6.4(@algolia/client-search@5.49.1)(@types/node@22.19.15)(async-validator@4.2.5)(axios@1.13.6)(less@4.5.1)(markdown-it-mathjax3@4.3.2(encoding@0.1.13))(postcss@8.5.8)(search-insights@2.17.3)(terser@5.46.0)(typescript@6.0.3)) vitest: specifier: ^4.0.18 version: 4.0.18(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0) vue-tsc: specifier: ^2.2.12 - version: 2.2.12(typescript@6.0.1-rc) + version: 2.2.12(typescript@6.0.3) ws: specifier: ^8.19.0 version: 8.19.0 packages-user/client-base: dependencies: + '@motajs/audio': + specifier: workspace:* + version: link:../../packages/audio '@motajs/client-base': specifier: workspace:* version: link:../../packages/client-base '@motajs/render': specifier: workspace:* version: link:../../packages/render + '@user/data-base': + specifier: workspace:* + version: link:../data-base packages-user/client-modules: dependencies: @@ -270,6 +279,12 @@ importers: packages-user/data-base: dependencies: + '@motajs/common': + specifier: workspace:* + version: link:../../packages/common + '@motajs/loader': + specifier: workspace:* + version: link:../../packages/loader '@motajs/types': specifier: workspace:* version: link:../../packages/types @@ -327,9 +342,6 @@ importers: '@motajs/legacy-common': specifier: workspace:* version: link:../../packages/legacy-common - '@motajs/legacy-data': - specifier: workspace:* - version: link:../../packages/legacy-data '@motajs/legacy-system': specifier: workspace:* version: link:../../packages/legacy-system @@ -401,6 +413,15 @@ importers: packages/animate: {} + packages/audio: + dependencies: + '@motajs/common': + specifier: workspace:* + version: link:../common + '@motajs/loader': + specifier: workspace:* + version: link:../loader + packages/client: dependencies: '@motajs/client-base': @@ -459,6 +480,12 @@ importers: specifier: workspace:* version: link:../system + packages/loader: + dependencies: + '@motajs/common': + specifier: workspace:* + version: link:../common + packages/render: {} packages/render-vue: @@ -2336,63 +2363,63 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.57.0': - resolution: {integrity: sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==} + '@typescript-eslint/eslint-plugin@8.58.2': + resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.57.0 + '@typescript-eslint/parser': ^8.58.2 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.57.0': - resolution: {integrity: sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==} + '@typescript-eslint/parser@8.58.2': + resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.57.0': - resolution: {integrity: sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==} + '@typescript-eslint/project-service@8.58.2': + resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.57.0': - resolution: {integrity: sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==} + '@typescript-eslint/scope-manager@8.58.2': + resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.57.0': - resolution: {integrity: sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==} + '@typescript-eslint/tsconfig-utils@8.58.2': + resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.57.0': - resolution: {integrity: sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==} + '@typescript-eslint/type-utils@8.58.2': + resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.57.0': - resolution: {integrity: sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==} + '@typescript-eslint/types@8.58.2': + resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.57.0': - resolution: {integrity: sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==} + '@typescript-eslint/typescript-estree@8.58.2': + resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.57.0': - resolution: {integrity: sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==} + '@typescript-eslint/utils@8.58.2': + resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.57.0': - resolution: {integrity: sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==} + '@typescript-eslint/visitor-keys@8.58.2': + resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -2914,6 +2941,10 @@ packages: resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} engines: {node: 18 || 20 || >=22} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -3494,6 +3525,9 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dexie@4.4.2: + resolution: {integrity: sha512-zMtV8q79EFE5U8FKZvt0Y/77PCU/Hr/RDxv1EDeo228L+m/HTbeN2AjoQm674rhQCX8n3ljK87lajt7UQuZfvw==} + diff@8.0.3: resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} engines: {node: '>=0.3.1'} @@ -4641,6 +4675,10 @@ packages: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} @@ -4963,6 +5001,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -5741,6 +5783,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + tinyrainbow@3.0.3: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} @@ -5767,8 +5813,8 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - ts-api-utils@2.4.0: - resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -5829,12 +5875,12 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.57.0: - resolution: {integrity: sha512-W8GcigEMEeB07xEZol8oJ26rigm3+bfPHxHvwbYUlu1fUDsGuQ7Hiskx5xGW/xM4USc9Ephe3jtv7ZYPQntHeA==} + typescript-eslint@8.58.2: + resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' typescript@5.8.2: resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} @@ -5846,8 +5892,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@6.0.1-rc: - resolution: {integrity: sha512-7XlzYb+p/7YxX6qSOzwB4mxVFRdAgWWkj1PgAZ+jzldeuFV6Z77vwFbNxHsUXAL/bhlWY2jCT8shLwDJR8337g==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -6377,11 +6423,11 @@ snapshots: '@ant-design/icons-svg@4.4.2': {} - '@ant-design/icons-vue@6.1.0(vue@3.5.29(typescript@6.0.1-rc))': + '@ant-design/icons-vue@6.1.0(vue@3.5.29(typescript@6.0.3))': dependencies: '@ant-design/colors': 6.0.0 '@ant-design/icons-svg': 4.4.2 - vue: 3.5.29(typescript@6.0.1-rc) + vue: 3.5.29(typescript@6.0.3) '@antfu/install-pkg@1.1.0': dependencies: @@ -7762,11 +7808,11 @@ snapshots: optionalDependencies: rollup: 4.59.0 - '@rollup/plugin-typescript@11.1.6(rollup@4.59.0)(tslib@2.8.1)(typescript@6.0.1-rc)': + '@rollup/plugin-typescript@11.1.6(rollup@4.59.0)(tslib@2.8.1)(typescript@6.0.3)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.59.0) resolve: 1.22.11 - typescript: 6.0.1-rc + typescript: 6.0.3 optionalDependencies: rollup: 4.59.0 tslib: 2.8.1 @@ -8210,123 +8256,123 @@ snapshots: dependencies: '@types/node': 22.19.15 - '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4)(typescript@6.0.1-rc))(eslint@9.39.4)(typescript@6.0.1-rc)': + '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.57.0(eslint@9.39.4)(typescript@6.0.1-rc) - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/type-utils': 8.57.0(eslint@9.39.4)(typescript@6.0.1-rc) - '@typescript-eslint/utils': 8.57.0(eslint@9.39.4)(typescript@6.0.1-rc) - '@typescript-eslint/visitor-keys': 8.57.0 + '@typescript-eslint/parser': 8.58.2(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.58.2 + '@typescript-eslint/type-utils': 8.58.2(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/utils': 8.58.2(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.58.2 eslint: 9.39.4 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@6.0.1-rc) - typescript: 6.0.1-rc + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.57.0(eslint@9.39.4)(typescript@6.0.1-rc)': + '@typescript-eslint/parser@8.58.2(eslint@9.39.4)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@6.0.1-rc) - '@typescript-eslint/visitor-keys': 8.57.0 + '@typescript-eslint/scope-manager': 8.58.2 + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3 eslint: 9.39.4 - typescript: 6.0.1-rc + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.57.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.58.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) - '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@5.9.3) + '@typescript-eslint/types': 8.58.2 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.57.0(typescript@6.0.1-rc)': + '@typescript-eslint/project-service@8.58.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@6.0.1-rc) - '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) + '@typescript-eslint/types': 8.58.2 debug: 4.4.3 - typescript: 6.0.1-rc + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.57.0': + '@typescript-eslint/scope-manager@8.58.2': dependencies: - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/visitor-keys': 8.57.0 + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/visitor-keys': 8.58.2 - '@typescript-eslint/tsconfig-utils@8.57.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.58.2(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.57.0(typescript@6.0.1-rc)': + '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.3)': dependencies: - typescript: 6.0.1-rc + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.57.0(eslint@9.39.4)(typescript@6.0.1-rc)': + '@typescript-eslint/type-utils@8.58.2(eslint@9.39.4)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@6.0.1-rc) - '@typescript-eslint/utils': 8.57.0(eslint@9.39.4)(typescript@6.0.1-rc) + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.58.2(eslint@9.39.4)(typescript@6.0.3) debug: 4.4.3 eslint: 9.39.4 - ts-api-utils: 2.4.0(typescript@6.0.1-rc) - typescript: 6.0.1-rc + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.57.0': {} + '@typescript-eslint/types@8.58.2': {} - '@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.58.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.57.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/visitor-keys': 8.57.0 + '@typescript-eslint/project-service': 8.58.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@5.9.3) + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3 - minimatch: 10.2.4 + minimatch: 10.2.5 semver: 7.7.4 - tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.57.0(typescript@6.0.1-rc)': + '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.57.0(typescript@6.0.1-rc) - '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@6.0.1-rc) - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/visitor-keys': 8.57.0 + '@typescript-eslint/project-service': 8.58.2(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3 - minimatch: 10.2.4 + minimatch: 10.2.5 semver: 7.7.4 - tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@6.0.1-rc) - typescript: 6.0.1-rc + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.0(eslint@9.39.4)(typescript@6.0.1-rc)': + '@typescript-eslint/utils@8.58.2(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@6.0.1-rc) + '@typescript-eslint/scope-manager': 8.58.2 + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) eslint: 9.39.4 - typescript: 6.0.1-rc + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.57.0': + '@typescript-eslint/visitor-keys@8.58.2': dependencies: - '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/types': 8.58.2 eslint-visitor-keys: 5.0.1 '@ungap/structured-clone@1.3.0': {} @@ -8350,7 +8396,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@5.1.4(vite@7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0))(vue@3.5.29(typescript@6.0.1-rc))': + '@vitejs/plugin-vue-jsx@5.1.4(vite@7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0))(vue@3.5.29(typescript@6.0.3))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) @@ -8358,20 +8404,20 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.7 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.0) vite: 7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0) - vue: 3.5.29(typescript@6.0.1-rc) + vue: 3.5.29(typescript@6.0.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0))(vue@3.5.29(typescript@6.0.1-rc))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0))(vue@3.5.29(typescript@6.0.3))': dependencies: vite: 5.4.21(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0) - vue: 3.5.29(typescript@6.0.1-rc) + vue: 3.5.29(typescript@6.0.3) - '@vitejs/plugin-vue@6.0.4(vite@7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0))(vue@3.5.29(typescript@6.0.1-rc))': + '@vitejs/plugin-vue@6.0.4(vite@7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0))(vue@3.5.29(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.2 vite: 7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0) - vue: 3.5.29(typescript@6.0.1-rc) + vue: 3.5.29(typescript@6.0.3) '@vitest/expect@4.0.18': dependencies: @@ -8518,7 +8564,7 @@ snapshots: dependencies: rfdc: 1.4.1 - '@vue/language-core@2.2.0(typescript@6.0.1-rc)': + '@vue/language-core@2.2.0(typescript@6.0.3)': dependencies: '@volar/language-core': 2.4.28 '@vue/compiler-dom': 3.5.29 @@ -8529,9 +8575,9 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 6.0.1-rc + typescript: 6.0.3 - '@vue/language-core@2.2.12(typescript@6.0.1-rc)': + '@vue/language-core@2.2.12(typescript@6.0.3)': dependencies: '@volar/language-core': 2.4.15 '@vue/compiler-dom': 3.5.29 @@ -8542,7 +8588,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 6.0.1-rc + typescript: 6.0.3 '@vue/reactivity@3.5.29': dependencies: @@ -8560,28 +8606,28 @@ snapshots: '@vue/shared': 3.5.29 csstype: 3.2.3 - '@vue/server-renderer@3.5.29(vue@3.5.29(typescript@6.0.1-rc))': + '@vue/server-renderer@3.5.29(vue@3.5.29(typescript@6.0.3))': dependencies: '@vue/compiler-ssr': 3.5.29 '@vue/shared': 3.5.29 - vue: 3.5.29(typescript@6.0.1-rc) + vue: 3.5.29(typescript@6.0.3) '@vue/shared@3.5.29': {} - '@vueuse/core@12.8.2(typescript@6.0.1-rc)': + '@vueuse/core@12.8.2(typescript@6.0.3)': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 12.8.2 - '@vueuse/shared': 12.8.2(typescript@6.0.1-rc) - vue: 3.5.29(typescript@6.0.1-rc) + '@vueuse/shared': 12.8.2(typescript@6.0.3) + vue: 3.5.29(typescript@6.0.3) transitivePeerDependencies: - typescript - '@vueuse/integrations@12.8.2(async-validator@4.2.5)(axios@1.13.6)(focus-trap@7.8.0)(typescript@6.0.1-rc)': + '@vueuse/integrations@12.8.2(async-validator@4.2.5)(axios@1.13.6)(focus-trap@7.8.0)(typescript@6.0.3)': dependencies: - '@vueuse/core': 12.8.2(typescript@6.0.1-rc) - '@vueuse/shared': 12.8.2(typescript@6.0.1-rc) - vue: 3.5.29(typescript@6.0.1-rc) + '@vueuse/core': 12.8.2(typescript@6.0.3) + '@vueuse/shared': 12.8.2(typescript@6.0.3) + vue: 3.5.29(typescript@6.0.3) optionalDependencies: async-validator: 4.2.5 axios: 1.13.6 @@ -8591,9 +8637,9 @@ snapshots: '@vueuse/metadata@12.8.2': {} - '@vueuse/shared@12.8.2(typescript@6.0.1-rc)': + '@vueuse/shared@12.8.2(typescript@6.0.3)': dependencies: - vue: 3.5.29(typescript@6.0.1-rc) + vue: 3.5.29(typescript@6.0.3) transitivePeerDependencies: - typescript @@ -8698,10 +8744,10 @@ snapshots: ansi-styles@6.2.3: {} - ant-design-vue@3.2.20(vue@3.5.29(typescript@6.0.1-rc)): + ant-design-vue@3.2.20(vue@3.5.29(typescript@6.0.3)): dependencies: '@ant-design/colors': 6.0.0 - '@ant-design/icons-vue': 6.1.0(vue@3.5.29(typescript@6.0.1-rc)) + '@ant-design/icons-vue': 6.1.0(vue@3.5.29(typescript@6.0.3)) '@babel/runtime': 7.28.6 '@ctrl/tinycolor': 3.6.1 '@simonwep/pickr': 1.8.2 @@ -8715,8 +8761,8 @@ snapshots: resize-observer-polyfill: 1.5.1 scroll-into-view-if-needed: 2.2.31 shallow-equal: 1.2.1 - vue: 3.5.29(typescript@6.0.1-rc) - vue-types: 3.0.2(vue@3.5.29(typescript@6.0.1-rc)) + vue: 3.5.29(typescript@6.0.3) + vue-types: 3.0.2(vue@3.5.29(typescript@6.0.3)) warning: 4.0.3 any-promise@1.3.0: {} @@ -8981,6 +9027,10 @@ snapshots: dependencies: balanced-match: 4.0.4 + brace-expansion@5.0.5: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -9587,7 +9637,7 @@ snapshots: detective-typescript@14.0.0(typescript@5.9.3): dependencies: - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) ast-module-types: 6.0.1 node-source-walk: 7.0.1 typescript: 5.9.3 @@ -9611,6 +9661,8 @@ snapshots: dependencies: dequal: 2.0.3 + dexie@4.4.2: {} + diff@8.0.3: {} doctrine@2.1.0: @@ -10089,6 +10141,10 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -10840,7 +10896,7 @@ snapshots: lz-string@1.5.0: {} - madge@8.0.0(typescript@6.0.1-rc): + madge@8.0.0(typescript@6.0.3): dependencies: chalk: 4.1.2 commander: 7.2.0 @@ -10855,7 +10911,7 @@ snapshots: ts-graphviz: 2.1.6 walkdir: 0.4.1 optionalDependencies: - typescript: 6.0.1-rc + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -10996,6 +11052,10 @@ snapshots: dependencies: brace-expansion: 5.0.4 + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.5 + minimatch@3.1.5: dependencies: brace-expansion: 1.1.12 @@ -11318,6 +11378,8 @@ snapshots: picomatch@4.0.3: {} + picomatch@4.0.4: {} + pify@4.0.1: {} pkg-types@1.3.1: @@ -12294,6 +12356,11 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + tinyrainbow@3.0.3: {} to-buffer@1.2.2: @@ -12319,13 +12386,13 @@ snapshots: trim-lines@3.0.1: {} - ts-api-utils@2.4.0(typescript@5.9.3): + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 - ts-api-utils@2.4.0(typescript@6.0.1-rc): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - typescript: 6.0.1-rc + typescript: 6.0.3 ts-dedent@2.2.0: {} @@ -12409,14 +12476,14 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.57.0(eslint@9.39.4)(typescript@6.0.1-rc): + typescript-eslint@8.58.2(eslint@9.39.4)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4)(typescript@6.0.1-rc))(eslint@9.39.4)(typescript@6.0.1-rc) - '@typescript-eslint/parser': 8.57.0(eslint@9.39.4)(typescript@6.0.1-rc) - '@typescript-eslint/typescript-estree': 8.57.0(typescript@6.0.1-rc) - '@typescript-eslint/utils': 8.57.0(eslint@9.39.4)(typescript@6.0.1-rc) + '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/parser': 8.58.2(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.58.2(eslint@9.39.4)(typescript@6.0.3) eslint: 9.39.4 - typescript: 6.0.1-rc + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -12424,7 +12491,7 @@ snapshots: typescript@5.9.3: {} - typescript@6.0.1-rc: {} + typescript@6.0.3: {} ufo@1.6.3: {} @@ -12571,18 +12638,18 @@ snapshots: - bare-abort-controller - react-native-b4a - vite-plugin-dts@4.5.4(@types/node@22.19.15)(rollup@4.59.0)(typescript@6.0.1-rc)(vite@7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)): + vite-plugin-dts@4.5.4(@types/node@22.19.15)(rollup@4.59.0)(typescript@6.0.3)(vite@7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)): dependencies: '@microsoft/api-extractor': 7.57.6(@types/node@22.19.15) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) '@volar/typescript': 2.4.28 - '@vue/language-core': 2.2.0(typescript@6.0.1-rc) + '@vue/language-core': 2.2.0(typescript@6.0.3) compare-versions: 6.1.1 debug: 4.4.3 kolorist: 1.8.0 local-pkg: 1.1.2 magic-string: 0.30.21 - typescript: 6.0.1-rc + typescript: 6.0.3 optionalDependencies: vite: 7.3.1(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0) transitivePeerDependencies: @@ -12616,14 +12683,14 @@ snapshots: terser: 5.46.0 tsx: 4.21.0 - vitepress-plugin-mermaid@2.0.17(mermaid@11.12.3)(vitepress@1.6.4(@algolia/client-search@5.49.1)(@types/node@22.19.15)(async-validator@4.2.5)(axios@1.13.6)(less@4.5.1)(markdown-it-mathjax3@4.3.2(encoding@0.1.13))(postcss@8.5.8)(search-insights@2.17.3)(terser@5.46.0)(typescript@6.0.1-rc)): + vitepress-plugin-mermaid@2.0.17(mermaid@11.12.3)(vitepress@1.6.4(@algolia/client-search@5.49.1)(@types/node@22.19.15)(async-validator@4.2.5)(axios@1.13.6)(less@4.5.1)(markdown-it-mathjax3@4.3.2(encoding@0.1.13))(postcss@8.5.8)(search-insights@2.17.3)(terser@5.46.0)(typescript@6.0.3)): dependencies: mermaid: 11.12.3 - vitepress: 1.6.4(@algolia/client-search@5.49.1)(@types/node@22.19.15)(async-validator@4.2.5)(axios@1.13.6)(less@4.5.1)(markdown-it-mathjax3@4.3.2(encoding@0.1.13))(postcss@8.5.8)(search-insights@2.17.3)(terser@5.46.0)(typescript@6.0.1-rc) + vitepress: 1.6.4(@algolia/client-search@5.49.1)(@types/node@22.19.15)(async-validator@4.2.5)(axios@1.13.6)(less@4.5.1)(markdown-it-mathjax3@4.3.2(encoding@0.1.13))(postcss@8.5.8)(search-insights@2.17.3)(terser@5.46.0)(typescript@6.0.3) optionalDependencies: '@mermaid-js/mermaid-mindmap': 9.3.0 - vitepress@1.6.4(@algolia/client-search@5.49.1)(@types/node@22.19.15)(async-validator@4.2.5)(axios@1.13.6)(less@4.5.1)(markdown-it-mathjax3@4.3.2(encoding@0.1.13))(postcss@8.5.8)(search-insights@2.17.3)(terser@5.46.0)(typescript@6.0.1-rc): + vitepress@1.6.4(@algolia/client-search@5.49.1)(@types/node@22.19.15)(async-validator@4.2.5)(axios@1.13.6)(less@4.5.1)(markdown-it-mathjax3@4.3.2(encoding@0.1.13))(postcss@8.5.8)(search-insights@2.17.3)(terser@5.46.0)(typescript@6.0.3): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.49.1)(search-insights@2.17.3) @@ -12632,17 +12699,17 @@ snapshots: '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0))(vue@3.5.29(typescript@6.0.1-rc)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0))(vue@3.5.29(typescript@6.0.3)) '@vue/devtools-api': 7.7.9 '@vue/shared': 3.5.29 - '@vueuse/core': 12.8.2(typescript@6.0.1-rc) - '@vueuse/integrations': 12.8.2(async-validator@4.2.5)(axios@1.13.6)(focus-trap@7.8.0)(typescript@6.0.1-rc) + '@vueuse/core': 12.8.2(typescript@6.0.3) + '@vueuse/integrations': 12.8.2(async-validator@4.2.5)(axios@1.13.6)(focus-trap@7.8.0)(typescript@6.0.3) focus-trap: 7.8.0 mark.js: 8.11.1 minisearch: 7.2.0 shiki: 2.5.0 vite: 5.4.21(@types/node@22.19.15)(less@4.5.1)(terser@5.46.0) - vue: 3.5.29(typescript@6.0.1-rc) + vue: 3.5.29(typescript@6.0.3) optionalDependencies: markdown-it-mathjax3: 4.3.2(encoding@0.1.13) postcss: 8.5.8 @@ -12740,26 +12807,26 @@ snapshots: transitivePeerDependencies: - supports-color - vue-tsc@2.2.12(typescript@6.0.1-rc): + vue-tsc@2.2.12(typescript@6.0.3): dependencies: '@volar/typescript': 2.4.15 - '@vue/language-core': 2.2.12(typescript@6.0.1-rc) - typescript: 6.0.1-rc + '@vue/language-core': 2.2.12(typescript@6.0.3) + typescript: 6.0.3 - vue-types@3.0.2(vue@3.5.29(typescript@6.0.1-rc)): + vue-types@3.0.2(vue@3.5.29(typescript@6.0.3)): dependencies: is-plain-object: 3.0.1 - vue: 3.5.29(typescript@6.0.1-rc) + vue: 3.5.29(typescript@6.0.3) - vue@3.5.29(typescript@6.0.1-rc): + vue@3.5.29(typescript@6.0.3): dependencies: '@vue/compiler-dom': 3.5.29 '@vue/compiler-sfc': 3.5.29 '@vue/runtime-dom': 3.5.29 - '@vue/server-renderer': 3.5.29(vue@3.5.29(typescript@6.0.1-rc)) + '@vue/server-renderer': 3.5.29(vue@3.5.29(typescript@6.0.3)) '@vue/shared': 3.5.29 optionalDependencies: - typescript: 6.0.1-rc + typescript: 6.0.3 walkdir@0.4.1: {} diff --git a/prompt.md b/prompt.md index ba6c67b..c4da0e7 100644 --- a/prompt.md +++ b/prompt.md @@ -2,10 +2,11 @@ 以下规则必须时刻遵守,任何情况下都不允许违反。 -1. 将我已经写好的代码视为绝对正确,除非我明确允许,否则不允许修改,哪怕因为接口变化或其他原因导致其中出现类型错误。如果你认为我的代码中存在逻辑错误,应当在对话中提出,而不是直接修改。 +1. 将我已经写好的代码视为绝对正确,除非我**明确允许**,否则**不允许任何修改**,哪怕因为接口变化或其他原因导致其中出现类型错误。如果你认为我的代码中存在逻辑错误,应当在对话中提出,而不是直接修改。 2. 我做的任何代码修改都是有原因的,如果我在两次对话期间新增、删除或修改了部分代码,不要将其恢复。 3. 时刻以目的进行驱动,想明白我为什么要这么设计接口,这个接口设计的目的是什么,而不是简单地以实现接口为目标。 4. 如果思考或实现时有任何问题,应该立刻提问,而不是按照自己的想法去写。 +5. 如果我的目标是重构某个接口,按照我说的方式进行重构,如果是彻底性的重构(接口完全没有重合),则按照正常的方式进行实现,旧代码仅做逻辑与思路上的参考;如果是结构性的重构(接口基本一致,但有一些细节上的差距),则应该将旧代码搬到新的接口上,然后进行一些微调,**不要**擅自新增任何参数、任何新的方法或接口,**不要**仅仅通过新增一个兼容层兼容旧代码来实现重构。 # 建议规则 diff --git a/public/libs/control.js b/public/libs/control.js index 611d726..d27ec6a 100644 --- a/public/libs/control.js +++ b/public/libs/control.js @@ -46,8 +46,6 @@ control.prototype._init = function () { this.registerReplayAction('key', this._replayAction_key); this.registerReplayAction('ignoreInput', this._replayAction_ignoreInput); this.registerReplayAction('no', this._replayAction_no); - // --- 注册系统的resize - this.registerResize('canvas', this._resize_canvas); }; // ------ requestAnimationFrame 相关 ------ // @@ -210,32 +208,7 @@ control.prototype.__animateFrame_weather_image = function (timestamp, level) {}; control.prototype._animationFrame_weather_sun = function (timestamp, level) {}; -control.prototype._animateFrame_tip = function (timestamp) { - if (core.animateFrame.tip == null) return; - var tip = core.animateFrame.tip; - if (timestamp - tip.time <= 30) return; - var delta = timestamp - tip.time; - tip.time = timestamp; - - core.setFont('data', '16px Arial'); - core.setTextAlign('data', 'left'); - core.clearMap('data', 0, 0, core._PX_, 50); - core.ui._drawTip_drawOne(tip); - if (tip.stage == 1) { - tip.opacity += 0.05; - if (tip.opacity >= 0.6) { - tip.stage = 2; - tip.displayTime = 0; - } - } else if (tip.stage == 2) { - tip.displayTime += delta; - if (tip.displayTime >= 1000) tip.stage = 3; - } else tip.opacity -= 0.05; - - if (tip.opacity <= 0) { - core.animateFrame.tip = null; - } -}; +control.prototype._animateFrame_tip = function (timestamp) {}; // ------ 标题界面的处理 ------ // @@ -312,13 +285,7 @@ control.prototype._initStatistics = function (totalTime) { ////// 清除自动寻路路线 ////// control.prototype.clearAutomaticRouteNode = function (x, y) { - // core.clearMap( - // 'route', - // x * 32 + 5 - core.status.automaticRoute.offsetX, - // y * 32 + 5 - core.status.automaticRoute.offsetY, - // 27, - // 27 - // ); + // Deprecated. }; ////// 停止自动寻路操作 ////// @@ -612,67 +579,21 @@ control.prototype._moveAction_popAutomaticRoute = function () { ////// 让勇士开始移动 ////// control.prototype.moveHero = function (direction, callback) { - // see src/plugin/game/popup.js + // Deprecated. See packages-user/legact-plugin-data/src/fallback.ts }; control.prototype._moveHero_moving = function () { - // ------ 我已经看不懂这个函数了,反正好用就行23333333 - core.status.heroStop = false; - core.status.automaticRoute.moveDirectly = false; - - var move = function () { - if (!core.status.heroStop) { - if (core.hasFlag('debug') && core.status.ctrlDown) { - if (core.status.heroMoving != 0) return; - // 检测是否穿出去 - var nx = core.nextX(), - ny = core.nextY(); - if ( - nx < 0 || - nx >= core.bigmap.width || - ny < 0 || - ny >= core.bigmap.height - ) - return; - core.eventMoveHero( - [core.getHeroLoc('direction')], - core.values.moveSpeed, - move - ); - } else { - core.moveAction(); - setTimeout(move, 50); - } - } - }; - move(); + // Deprecated. }; ////// 当前是否正在移动 ////// control.prototype.isMoving = function () { - return !core.status.heroStop || core.status.heroMoving > 0; + // Deprecated. See packages-user/legact-plugin-data/src/fallback.ts }; ////// 停止勇士的一切行动,等待勇士行动结束后,再执行callback ////// control.prototype.waitHeroToStop = function (callback) { - var lastDirection = core.status.automaticRoute.lastDirection; - core.stopAutomaticRoute(); - core.clearContinueAutomaticRoute(); - if (callback) { - core.status.replay.animate = true; - core.lockControl(); - core.status.automaticRoute.moveDirectly = false; - setTimeout( - function () { - core.status.replay.animate = false; - if (core.isset(lastDirection)) - core.setHeroLoc('direction', lastDirection); - core.drawHero(); - callback(); - }, - core.status.replay.speed == 24 ? 1 : 30 - ); - } + // Deprecated. See packages-user/legact-plugin-data/src/fallback.ts }; ////// 转向 ////// @@ -734,21 +655,11 @@ control.prototype.tryMoveDirectly = function (destX, destY) { ////// 绘制勇士 ////// control.prototype.drawHero = function (status, offset = 0, frame) { - return; + // Deprecated. }; control.prototype._drawHero_updateViewport = function (x, y, offset) { - core.bigmap.offsetX = core.clamp( - (x - core._HALF_WIDTH_) * 32 + offset.x, - 0, - Math.max(32 * core.bigmap.width - core._PX_, 0) - ); - core.bigmap.offsetY = core.clamp( - (y - core._HALF_HEIGHT_) * 32 + offset.y, - 0, - Math.max(32 * core.bigmap.height - core._PY_, 0) - ); - core.control.updateViewport(); + // Deprecated. }; control.prototype._drawHero_draw = function ( @@ -759,26 +670,7 @@ control.prototype._drawHero_draw = function ( offset, frame ) { - offset = offset || { x: 0, y: 0, offset: 0, px: 0, py: 0 }; - var opacity = core.setAlpha('hero', core.getFlag('__heroOpacity__', 1)); - this._drawHero_getDrawObjs(direction, x, y, status, offset).forEach( - function (block) { - core.drawImage( - 'hero', - block.img, - ((block.heroIcon[block.status] + (frame || 0)) % 4) * - block.width, - block.heroIcon.loc * block.height, - block.width, - block.height, - block.posx + (32 - block.width) / 2, - block.posy + 32 - block.height, - block.width, - block.height - ); - } - ); - core.setAlpha('hero', opacity); + // Deprecated. }; control.prototype._drawHero_getDrawObjs = function ( @@ -788,48 +680,7 @@ control.prototype._drawHero_getDrawObjs = function ( status, offset ) { - var heroIconArr = core.material.icons.hero, - drawObjs = [], - index = 0; - drawObjs.push({ - img: core.material.images.hero, - width: core.material.icons.hero.width || 32, - height: core.material.icons.hero.height, - heroIcon: heroIconArr[direction], - posx: x * 32 - core.bigmap.offsetX + offset.x, - posy: y * 32 - core.bigmap.offsetY + offset.y, - status: status, - index: index++ - }); - if (typeof offset.offset == 'number') { - core.status.hero.followers.forEach(function (t) { - drawObjs.push({ - img: core.material.images.images[t.name], - width: core.material.images.images[t.name].width / 4, - height: core.material.images.images[t.name].height / 4, - heroIcon: heroIconArr[t.direction], - posx: - 32 * t.x - - core.bigmap.offsetX + - (t.stop - ? 0 - : core.utils.scan2[t.direction].x * - Math.abs(offset.offset)), - posy: - 32 * t.y - - core.bigmap.offsetY + - (t.stop - ? 0 - : core.utils.scan2[t.direction].y * - Math.abs(offset.offset)), - status: t.stop ? 'stop' : status, - index: index++ - }); - }); - } - return drawObjs.sort(function (a, b) { - return a.posy == b.posy ? b.index - a.index : a.posy - b.posy; - }); + // Deprecated. }; control.prototype.setHeroOpacity = function ( @@ -838,37 +689,7 @@ control.prototype.setHeroOpacity = function ( time, callback ) { - time = time || 0; - if (time == 0) { - core.setFlag('__heroOpacity__', opacity); - core.drawHero(); - if (callback) callback(); - return; - } - time /= Math.max(core.status.replay.speed, 1); - - var fromOpacity = core.getFlag('__heroOpacity__', 1); - var step = 0, - steps = Math.floor(time / 10); - if (steps <= 0) steps = 1; - var moveFunc = core.applyEasing(moveMode); - - var animate = setInterval(function () { - step++; - core.setFlag( - '__heroOpacity__', - fromOpacity + (opacity - fromOpacity) * moveFunc(step / steps) - ); - core.drawHero(); - if (step == steps) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - if (callback) callback(); - } - }, 10); - - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = callback; + // Deprecated. }; // ------ 画布、位置、阻激夹域,显伤 ------ // @@ -876,7 +697,7 @@ control.prototype.setHeroOpacity = function ( ////// 设置画布偏移 control.prototype.setGameCanvasTranslate = function (canvas, x, y) { // Deprecated. Use RenderItem.transform instead. - // For editor compatibility. + // Remaining for editor compatibility. var c = core.dom.gameCanvas[canvas]; x = x * core.domStyle.scale; y = y * core.domStyle.scale; @@ -901,6 +722,7 @@ control.prototype.addGameCanvasTranslate = function (x, y) { ////// 更新视野范围 ////// control.prototype.updateViewport = function () { + // Deprecated. Remaining for editor compatibility. // 当前是否应该重绘? if (core.bigmap.v2) { if ( @@ -950,59 +772,12 @@ control.prototype.updateViewport = function () { ////// 设置视野范围 ////// control.prototype.setViewport = function (px, py) { - var originOffsetX = core.bigmap.offsetX, - originOffsetY = core.bigmap.offsetY; - core.bigmap.offsetX = core.clamp(px, 0, 32 * core.bigmap.width - core._PX_); - core.bigmap.offsetY = core.clamp( - py, - 0, - 32 * core.bigmap.height - core._PY_ - ); - this.updateViewport(); - // ------ hero层也需要! - var px = parseFloat(core.canvas.hero._px) || 0; - var py = parseFloat(core.canvas.hero._py) || 0; - px += originOffsetX - core.bigmap.offsetX; - py += originOffsetY - core.bigmap.offsetY; - core.control.setGameCanvasTranslate('hero', px, py); - core.canvas.hero._px = px; - core.canvas.hero._py = py; + // Deprecated. }; ////// 移动视野范围 ////// control.prototype.moveViewport = function (x, y, moveMode, time, callback) { - time = time || 0; - time /= Math.max(core.status.replay.speed, 1); - var per_time = 10, - step = 0, - steps = Math.floor(time / per_time); - if (steps <= 0) { - this.setViewport(32 * x, 32 * y); - if (callback) callback(); - return; - } - var px = core.clamp(32 * x, 0, 32 * core.bigmap.width - core._PX_); - var py = core.clamp(32 * y, 0, 32 * core.bigmap.height - core._PY_); - var cx = core.bigmap.offsetX; - var cy = core.bigmap.offsetY; - var moveFunc = core.applyEasing(moveMode); - - var animate = window.setInterval(function () { - step++; - core.setViewport( - cx + moveFunc(step / steps) * (px - cx), - cy + moveFunc(step / steps) * (py - cy) - ); - if (step == steps) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - core.setViewport(px, py); - if (callback) callback(); - } - }, per_time); - - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = callback; + // Deprecated. }; ////// 获得勇士面对位置的x坐标 ////// @@ -2549,52 +2324,27 @@ control.prototype.removeFlag = function (name) { ////// 获得某个点的独立开关 ////// control.prototype.getSwitch = function (x, y, floorId, name, defaultValue) { - var prefix = [ - floorId || core.status.floorId || ':f', - x != null ? x : 'x', - y != null ? y : 'y' - ].join('@'); - return this.getFlag(prefix + '@' + name, defaultValue); + // Deprecated. See packages-user/data-fallback/src/flag.ts }; ////// 设置某个点的独立开关 ////// control.prototype.setSwitch = function (x, y, floorId, name, value) { - var prefix = [ - floorId || core.status.floorId || ':f', - x != null ? x : 'x', - y != null ? y : 'y' - ].join('@'); - return this.setFlag(prefix + '@' + name, value); + // Deprecated. See packages-user/data-fallback/src/flag.ts }; ////// 增加某个点的独立开关 ////// control.prototype.addSwitch = function (x, y, floorId, name, value) { - var prefix = [ - floorId || core.status.floorId || ':f', - x != null ? x : 'x', - y != null ? y : 'y' - ].join('@'); - return this.addFlag(prefix + '@' + name, value); + // Deprecated. See packages-user/data-fallback/src/flag.ts }; ////// 判定某个点的独立开关 ////// control.prototype.hasSwitch = function (x, y, floorId, name) { - var prefix = [ - floorId || core.status.floorId || ':f', - x != null ? x : 'x', - y != null ? y : 'y' - ].join('@'); - return this.hasFlag(prefix + '@' + name); + // Deprecated. See packages-user/data-fallback/src/flag.ts }; ////// 删除某个点的独立开关 ////// control.prototype.removeSwitch = function (x, y, floorId, name) { - var prefix = [ - floorId || core.status.floorId || ':f', - x != null ? x : 'x', - y != null ? y : 'y' - ].join('@'); - return this.removeFlag(prefix + '@' + name); + // Deprecated. See packages-user/data-fallback/src/flag.ts }; ////// 锁定状态栏,常常用于事件处理 ////// @@ -2708,36 +2458,7 @@ control.prototype._weather_sun = function (level) {}; ////// 更改画面色调 ////// control.prototype.setCurtain = function (color, time, moveMode, callback) { - if (time == null) time = 750; - if (time <= 0) time = 0; - if (!core.status.curtainColor) core.status.curtainColor = [0, 0, 0, 0]; - if (!color) color = [0, 0, 0, 0]; - if (color[3] == null) color[3] = 1; - color[3] = core.clamp(color[3], 0, 1); - - if (time == 0) { - // 直接变色 - core.clearMap('curtain'); - core.fillRect( - 'curtain', - 0, - 0, - core._PX_, - core._PY_, - core.arrayToRGBA(color) - ); - core.status.curtainColor = color; - if (callback) callback(); - return; - } - - this._setCurtain_animate( - core.status.curtainColor, - color, - time, - moveMode, - callback - ); + // Deprecated. }; control.prototype._setCurtain_animate = function ( @@ -2747,44 +2468,7 @@ control.prototype._setCurtain_animate = function ( moveMode, callback ) { - time /= Math.max(core.status.replay.speed, 1); - var per_time = 10, - step = 0, - steps = Math.floor(time / per_time); - if (steps <= 0) steps = 1; - var curr = nowColor; - var moveFunc = core.applyEasing(moveMode); - - var cb = function () { - core.status.curtainColor = curr; - if (callback) callback(); - }; - var animate = setInterval(function () { - step++; - curr = [ - nowColor[0] + (color[0] - nowColor[0]) * moveFunc(step / steps), - nowColor[1] + (color[1] - nowColor[1]) * moveFunc(step / steps), - nowColor[2] + (color[2] - nowColor[2]) * moveFunc(step / steps), - nowColor[3] + (color[3] - nowColor[3]) * moveFunc(step / steps) - ]; - core.clearMap('curtain'); - core.fillRect( - 'curtain', - 0, - 0, - core._PX_, - core._PY_, - core.arrayToRGBA(curr) - ); - if (step == steps) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - cb(); - } - }, per_time); - - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = cb; + // Deprecated. }; ////// 画面闪烁 ////// @@ -2795,24 +2479,7 @@ control.prototype.screenFlash = function ( moveMode, callback ) { - times = times || 1; - time = time / 3; - var nowColor = core.clone(core.status.curtainColor); - core.setCurtain(color, time, moveMode, function () { - core.setCurtain(nowColor, time * 2, moveMode, function () { - if (times > 1) - core.screenFlash( - color, - time * 3, - times - 1, - moveMode, - callback - ); - else { - if (callback) callback(); - } - }); - }); + // Deprecated. }; ////// 播放背景音乐 ////// @@ -2905,71 +2572,21 @@ control.prototype.setToolbarButton = function (useButton) { // name为名称,可供注销使用 // func可以是一个函数,或者是插件中的函数名;可以接受obj参数,详见resize函数。 control.prototype.registerResize = function (name, func) { - this.unregisterResize(name); - this.resizes.push({ name: name, func: func }); + // Deprecated. }; ////// 注销一个resize函数 ////// control.prototype.unregisterResize = function (name) { - this.resizes = this.resizes.filter(function (b) { - return b.name != name; - }); + // Deprecated. }; control.prototype._doResize = function (obj) { - for (var i in this.resizes) { - try { - if (this.resizes[i].func.call(this, obj)) return true; - } catch (e) { - console.error(e); - console.error( - 'ERROR in resizes[' + - this.resizes[i].name + - ']:已自动注销该项。' - ); - this.unregisterResize(this.resizes[i].name); - } - } - return false; + // Deprecated. }; ////// 屏幕分辨率改变后重新自适应 ////// control.prototype.resize = function () { - if (main.mode === 'editor') return; - const width = window.innerWidth; - const height = window.innerHeight; - - // if (window.innerWidth >= 600) { - // // 横屏 - // core.domStyle.isVertical = false; - // core.domStyle.availableScale = []; - // const maxScale = Math.min(width / core._PX_, height / core._PY_); - // [1, 1.25, 1.5, 1.75, 2, 2.25, 2.5].forEach(function (v) { - // if (v < maxScale) { - // core.domStyle.availableScale.push(v); - // } - // }); - // if (!core.domStyle.availableScale.includes(core.domStyle.scale)) { - // core.domStyle.scale = 1; - // } - // } else { - // // 竖屏 - // core.domStyle.isVertical = true; - // core.domStyle.scale = window.innerWidth / core._PX_; - // core.domStyle.availableScale = []; - // } - - // if (!core.domStyle.isVertical) { - // const height = window.innerHeight; - // const width = window.innerWidth; - // const maxScale = Math.min(height / core._PY_, width / core._PX_); - // const target = Number((Math.floor(maxScale * 4) / 4).toFixed(2)); - // core.domStyle.scale = target - 0.25; - // } - - this._doResize({}); - this.setToolbarButton(); - core.updateStatusBar(); + // Deprecated. }; control.prototype._resize_gameGroup = function (obj) { @@ -2981,9 +2598,9 @@ control.prototype._resize_canvas = function (obj) { }; control.prototype._resize_toolBar = function (obj) { - // Deprecated. Use CustomToolbar instead. + // Deprecated. }; control.prototype._resize_tools = function (obj) { - // Deprecated. Use CustomToolbar instead. + // Deprecated. }; diff --git a/public/libs/core.js b/public/libs/core.js index 9270316..877edb0 100644 --- a/public/libs/core.js +++ b/public/libs/core.js @@ -353,7 +353,7 @@ core.prototype._init_flags = function () { core.maps._initFloors(); // 初始化怪物、道具等 - core.material.enemys = core.enemys.getEnemys(); + // core.material.enemys = core.enemys.getEnemys(); core.material.items = core.items.getItems(); core.material.icons = core.icons.getIcons(); diff --git a/public/libs/enemys.js b/public/libs/enemys.js index 9886595..8b225ba 100644 --- a/public/libs/enemys.js +++ b/public/libs/enemys.js @@ -2,12 +2,11 @@ 'use strict'; -function enemys() { - this._init(); -} +function enemys() {} ////// 初始化 ////// enemys.prototype._init = function () { + // Deprecated. Remaining for editor compatibility. this.enemys = enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80; for (var enemyId in this.enemys) { this.enemys[enemyId].id = enemyId; @@ -15,62 +14,28 @@ enemys.prototype._init = function () { }; enemys.prototype.getEnemys = function () { + // Deprecated. Remaining for editor compatibility. var enemys = core.clone(this.enemys); - var enemyInfo = core.getFlag('enemyInfo'); - if (enemyInfo) { - for (var id in enemyInfo) { - for (var name in enemyInfo[id]) { - enemys[id][name] = core.clone(enemyInfo[id][name]); - } - } - } - // 将所有怪物的各项属性映射到朝下的 - for (var id in enemys) { - if (enemys[id].faceIds) { - var downId = enemys[id].faceIds.down; - if (downId != null && downId != id && enemys[downId]) { - enemys[id] = { id: id }; - for (var property in enemys[downId]) { - if ( - property != 'id' && - enemys[downId].hasOwnProperty(property) - ) { - (function (id, downId, property) { - Object.defineProperty(enemys[id], property, { - get: function () { - return enemys[downId][property]; - }, - set: function (v) { - enemys[downId][property] = v; - }, - enumerable: true - }); - })(id, downId, property); - } - } - } - } - } return enemys; }; ////// 判断是否含有某特殊属性 ////// enemys.prototype.hasSpecial = function (special, test) { - // Deprecated. Use `Array.includes` instead. + // Deprecated. See packages-user/data-base/src/enemy/enemy.ts Enemy.hasSpecial }; enemys.prototype.getSpecials = function () { - // Deprecated. See src/plugin/game/enemy/special.ts + // Deprecated. See packages-user/data-state/src/enemy/special.ts }; ////// 获得所有特殊属性的名称 ////// enemys.prototype.getSpecialText = function (enemy) { - // Deprecated. + // Deprecated. See packages-user/data-state/src/enemy/special.ts }; ////// 获得所有特殊属性的颜色 ////// enemys.prototype.getSpecialColor = function (enemy) { - // Deprecated. + // Deprecated. See packages-user/data-state/src/enemy/special.ts }; ////// 获得所有特殊属性的额外标记 ////// @@ -80,7 +45,7 @@ enemys.prototype.getSpecialFlag = function (enemy) { ////// 获得每个特殊属性的说明 ////// enemys.prototype.getSpecialHint = function (enemy, special) { - // Deprecated. + // Deprecated. See packages-user/data-state/src/enemy/special.ts }; enemys.prototype._calSpecialContent = function (enemy, content) { @@ -103,20 +68,20 @@ enemys.prototype.getDamageString = function (enemy, x, y, floorId, hero) { ////// 接下来N个临界值和临界减伤计算 ////// enemys.prototype.nextCriticals = function (enemy, number, x, y, floorId, hero) { - // Deprecated. See src/game/enemy/damage.ts DamageEnemy.calCritical. + // Deprecated. See packages-user/data-base/src/enemy/damage.ts DamageSystem.calculateCritical }; /// 未破防临界采用二分计算 enemys.prototype._nextCriticals_overAtk = function (enemy) { - // Deprecated. See src/game/enemy/damage.ts DamageEnemy.calCritical. + // Deprecated. See packages-user/data-base/src/enemy/damage.ts DamageSystem.calculateCritical }; enemys.prototype._nextCriticals_special = function (enemy) { - // Deprecated. See src/game/enemy/damage.ts DamageEnemy.calCritical. + // Deprecated. See packages-user/data-base/src/enemy/damage.ts DamageSystem.calculateCritical }; enemys.prototype._nextCriticals_useBinarySearch = function (enemy) { - // Deprecated. See src/game/enemy/damage.ts DamageEnemy.calCritical. + // Deprecated. See packages-user/data-base/src/enemy/damage.ts DamageSystem.calculateCritical }; ////// N防减伤计算 ////// @@ -125,42 +90,42 @@ enemys.prototype.getDefDamage = function (enemy, k, x, y, floorId, hero) { }; enemys.prototype.getEnemyInfo = function (enemy, hero, x, y, floorId) { - // Deprecated. See src/game/enemy/damage.ts + // Deprecated. See packages-user/data-base/src/enemy/context.ts }; ////// 获得战斗伤害信息(实际伤害计算函数) ////// enemys.prototype.getDamageInfo = function (enemy, hero, x, y, floorId) { - // Deprecated. See src/game/enemy/damage.ts + // Deprecated. See packages-user/data-base/src/enemy/damage.ts DamageSystem.getDamageInfo }; ////// 获得在某个勇士属性下怪物伤害 ////// enemys.prototype.getDamage = function (enemy, x, y, floorId, hero) { - // Deprecated. See src/game/enemy/damage.ts + // Deprecated. See packages-user/data-base/src/enemy/damage.ts DamageSystem.getDamageInfo }; enemys.prototype._getDamage = function (enemy, hero, x, y, floorId) { - // Deprecated. See src/game/enemy/damage.ts + // Deprecated. See packages-user/data-base/src/enemy/damage.ts DamageSystem.getDamageInfo }; ////// 获得当前楼层的怪物列表 ////// enemys.prototype.getCurrentEnemys = function (floorId) { - // Deprecated. See src/plugin/game/enemy/battle.ts + // Deprecated. See packages-user/data-base/src/enemy/context.ts EnemyContext.iterateEnemy }; enemys.prototype._getCurrentEnemys_getEnemy = function (enemyId) { - // Deprecated. See src/plugin/game/enemy/battle.ts + // Deprecated. }; enemys.prototype._getCurrentEnemys_addEnemy = function (enemyId) { - // Deprecated. See src/plugin/game/enemy/battle.ts + // Deprecated. }; enemys.prototype._getCurrentEnemys_addEnemy_defDamage = function (enemy) { - // Deprecated. See src/plugin/game/enemy/battle.ts + // Deprecated. }; enemys.prototype._getCurrentEnemys_sort = function (enemys) { - // Deprecated. See src/plugin/game/enemy/battle.ts + // Deprecated. }; enemys.prototype.hasEnemyLeft = function (enemyId, floorId) { diff --git a/public/libs/events.js b/public/libs/events.js index cca411b..be02b76 100644 --- a/public/libs/events.js +++ b/public/libs/events.js @@ -105,6 +105,8 @@ events.prototype._startGame_afterStart = function (callback) { }; events.prototype._startGame_upload = function () { + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; // Upload var formData = new FormData(); formData.append('type', 'people'); @@ -112,7 +114,7 @@ events.prototype._startGame_upload = function () { formData.append('version', core.firstData.version); formData.append('platform', core.platform.string); formData.append('hard', core.encodeBase64(core.status.hard)); - formData.append('hardCode', core.getFlag('hard', 0)); + formData.append('hardCode', flags.getFieldValueDefaults('hard', 0)); formData.append('base64', 1); core.utils.http('POST', '/games/upload.php', formData); @@ -191,6 +193,8 @@ events.prototype._gameOver_confirmUpload = function (ending, norank) { }; events.prototype._gameOver_doUpload = function (username, ending, norank) { + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; var hp = core.status.hero.hp; if (username == null) hp = 1; core.ui.closePanel(); @@ -212,7 +216,7 @@ events.prototype._gameOver_doUpload = function (username, ending, norank) { formData.append('experience', core.status.hero.exp); formData.append('steps', core.status.hero.steps); formData.append('norank', norank ? 1 : 0); - formData.append('seed', core.getFlag('__seed__')); + formData.append('seed', flags.getFieldValue('__seed__')); formData.append( 'totalTime', Math.floor(core.status.hero.statistics.totalTime / 1000) @@ -228,6 +232,8 @@ events.prototype._gameOver_doUpload = function (username, ending, norank) { }; events.prototype._gameOver_confirmDownload = function (ending) { + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; core.ui.closePanel(); core.ui.drawConfirmBox( '你想下载录像吗?', @@ -236,7 +242,7 @@ events.prototype._gameOver_confirmDownload = function (ending) { name: core.firstData.name, version: core.firstData.version, hard: core.status.hard, - seed: core.getFlag('__seed__'), + seed: flags.getFieldValue('__seed__'), route: core.encodeRoute(core.status.route) }; core.download( @@ -666,6 +672,8 @@ events.prototype._sys_getItem = function (data, callback) { ////// 获得某个物品 ////// events.prototype.getItem = function (id, num, x, y, isGentleClick, callback) { + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; if (num == null) num = 1; var itemCls = core.material.items[id].cls; core.removeBlock(x, y); @@ -677,8 +685,7 @@ events.prototype.getItem = function (id, num, x, y, isGentleClick, callback) { core.drawTip(text, id); // --- 首次获得道具的提示 - if (!core.hasFlag('__itemHint__')) core.setFlag('__itemHint__', []); - var itemHint = core.getFlag('__itemHint__'); + var itemHint = flags.getFieldValueDefaults('__itemHint__', []); if ( core.flags.itemFirstText && itemHint.indexOf(id) < 0 && @@ -944,14 +951,16 @@ events.prototype.afterChangeFloor = function (floorId) { ////// 是否到达过某个楼层 ////// events.prototype.hasVisitedFloor = function (floorId) { - if (!core.hasFlag('__visited__')) core.setFlag('__visited__', {}); - return core.getFlag('__visited__')[floorId] || false; + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + return flags.getFieldValueDefaults('__visited__', {})[floorId] ?? false; }; ////// 到达某楼层 ////// events.prototype.visitFloor = function (floorId) { - if (!core.hasFlag('__visited__')) core.setFlag('__visited__', {}); - core.getFlag('__visited__')[floorId] = true; + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + flags.getFieldValueDefaults('__visited__', {})[floorId] = true; }; events.prototype._sys_pushBox = function (data, callback) { @@ -1334,26 +1343,30 @@ events.prototype.checkAutoEvents = function () { }; events.prototype.autoEventExecuting = function (symbol, value) { - var aei = core.getFlag('__aei__', []); + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + var aei = flags.getFieldValueDefaults('__aei__', []); if (value == null) return aei.indexOf(symbol) >= 0; else { aei = aei.filter(function (one) { return one != symbol; }); if (value) aei.push(symbol); - core.setFlag('__aei__', aei); + flags.setFieldValue('__aei__', aei); } }; events.prototype.autoEventExecuted = function (symbol, value) { - var aed = core.getFlag('__aed__', []); + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + var aed = flags.getFieldValueDefaults('__aed__', []); if (value == null) return aed.indexOf(symbol) >= 0; else { aed = aed.filter(function (one) { return one != symbol; }); if (value) aed.push(symbol); - core.setFlag('__aed__', aed); + flags.setFieldValue('__aed__', aed); } }; @@ -2710,19 +2723,20 @@ events.prototype._action_for = function (data, x, y, prefix) { core.setFlag(stepName, data.step); var condition = '(function () {' + - "var to = core.calValue(core.getFlag('" + + 'const { state } = Mota.require("@user/data-state"); const flags = state.flags;' + + "var to = core.calValue(flags.getFieldValue('" + toName + "'));" + - "var step = core.calValue(core.getFlag('" + + "var step = core.calValue(flags.getFieldValue('" + stepName + "'));" + "if (typeof step != 'number' || typeof to != 'number') return false;" + 'if (step == 0) return true;' + - "var currentValue = core.getFlag('@temp@" + + "var currentValue = flags.getFieldValue('@temp@" + letter + "');" + 'currentValue += step;' + - "core.setFlag('@temp@" + + "flags.setFieldValue('@temp@" + letter + "', currentValue);" + 'if (step > 0) { return currentValue <= to; }' + @@ -2751,14 +2765,17 @@ events.prototype._action_forEach = function (data, x, y, prefix) { return core.doAction(); } var listName = '@temp@forEach@' + data.name.substring(5); - core.setFlag(listName, core.clone(data.list)); + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + flags.setFieldValue(listName, core.clone(data.list)); var condition = '(function () {' + - "var list = core.getFlag('" + + "const { state } = Mota.require('@user/data-state'); const flags = state.flags;" + + "var list = flags.getFieldValue('" + listName + "', []);" + 'if (list.length == 0) return false;' + - "core.setFlag('@temp@'+'" + + "flags.setFieldValue('@temp@'+'" + data.name.substring(5) + "', list.shift());" + 'return true;' + @@ -2994,11 +3011,13 @@ events.prototype.__action_wait_afterGet = function (data) { var todo = []; var stop = false; var found = false; + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; data.data.forEach(function (one) { if (one._disabled || stop) return; - if (one['case'] == 'keyboard' && core.getFlag('type') == 0) { + if (one['case'] == 'keyboard' && flags.getFieldValue('type') == 0) { (one.keycode + '').split(',').forEach(function (keycode) { - if (core.getFlag('keycode', 0) == keycode) { + if (flags.getFieldValueDefaults('keycode', 0) == keycode) { found = true; core.push(todo, one.action); if (one['break']) stop = true; @@ -3009,14 +3028,14 @@ events.prototype.__action_wait_afterGet = function (data) { one['case'] == 'mouse' && one.px instanceof Array && one.py instanceof Array && - core.getFlag('type') == 1 + flags.getFieldValue('type') == 1 ) { var pxmin = core.calValue(one.px[0]); var pxmax = core.calValue(one.px[1]); var pymin = core.calValue(one.py[0]); var pymax = core.calValue(one.py[1]); - var px = core.getFlag('px', 0), - py = core.getFlag('py', 0); + var px = flags.getFieldValueDefaults('px', 0), + py = flags.getFieldValueDefaults('py', 0); if (px >= pxmin && px <= pxmax && py >= pymin && py <= pymax) { found = true; core.push(todo, one.action); @@ -3034,7 +3053,7 @@ events.prototype.__action_wait_afterGet = function (data) { if (one['break']) stop = true; } } - if (one['case'] == 'timeout' && core.getFlag('type') == -1) { + if (one['case'] == 'timeout' && flags.getFieldValue('type') == -1) { found = true; core.push(todo, one.action); if (one['break']) stop = true; @@ -3619,34 +3638,17 @@ events.prototype.setEnemy = function ( prefix, norefresh ) { - if (!core.hasFlag('enemyInfo')) { - core.setFlag('enemyInfo', {}); - } - var enemyInfo = core.getFlag('enemyInfo'); - if (!enemyInfo[id]) enemyInfo[id] = {}; - if (typeof value === 'string' && name == 'name') - value = value.replace(/\r/g, '\\r'); - value = this._updateValueByOperator( - core.calValue(value, prefix), - (core.material.enemys[id] || {})[name], - operator - ); - enemyInfo[id][name] = value; - (core.material.enemys[id] || {})[name] = core.clone(value); - if (!norefresh) core.updateStatusBar(); + // Deprecated. Will be refactored in 2.D }; ////// 设置某个点上的怪物属性 ////// events.prototype.setEnemyOnPoint = function (x, y) { - // Deprecated. + // Deprecated. Will be refactored in 2.D }; ////// 重置某个点上的怪物属性 ////// events.prototype.resetEnemyOnPoint = function (x, y, floorId, norefresh) { - delete ((flags.enemyOnPoint || {})[floorId || core.status.floorId] || {})[ - x + ',' + y - ]; - if (!norefresh) core.updateStatusBar(); + // Deprecated. Will be refactored in 2.D }; ////// 将某个点上已经设置的怪物属性移动到其他点 ////// @@ -3658,13 +3660,7 @@ events.prototype.moveEnemyOnPoint = function ( floorId, norefresh ) { - floorId = floorId || core.status.floorId; - if (((flags.enemyOnPoint || {})[floorId] || {})[fromX + ',' + fromY]) { - flags.enemyOnPoint[floorId][toX + ',' + toY] = - flags.enemyOnPoint[floorId][fromX + ',' + fromY]; - delete flags.enemyOnPoint[floorId][fromX + ',' + fromY]; - if (!norefresh) core.updateStatusBar(); - } + // Deprecated. Will be refactored in 2.D }; ////// 设置楼层属性 ////// @@ -3697,7 +3693,9 @@ events.prototype.setGlobalAttribute = function (name, value) { ////// 设置全局开关 ////// events.prototype.setGlobalFlag = function (name, value) { - var flags = core.getFlag('globalFlags', {}); + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + var flags = flags.getFieldValueDefaults('globalFlags', {}); if (name.startsWith('s:')) { name = name.substring(2); var statusBarItems = core.flags.statusBarItems.filter(function (v) { diff --git a/public/libs/items.js b/public/libs/items.js index 3ad1cdf..07f6329 100644 --- a/public/libs/items.js +++ b/public/libs/items.js @@ -17,12 +17,6 @@ items.prototype._init = function () { ////// 获得所有道具 ////// items.prototype.getItems = function () { var items = core.clone(this.items); - var equipInfo = core.getFlag('equipInfo'); - if (equipInfo) { - for (var id in equipInfo) { - items[id].equip = core.clone(equipInfo[id]); - } - } return items; }; @@ -370,7 +364,9 @@ items.prototype._realLoadEquip_playSound = function () { ////// 保存装备 ////// items.prototype.quickSaveEquip = function (index) { - var saveEquips = core.getFlag('saveEquips', []); + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + var saveEquips = flags.getFieldValueDefaults('saveEquips', []); saveEquips[index] = core.clone(core.status.hero.equipment); core.setFlag('saveEquips', saveEquips); core.status.route.push('saveEquip:' + index); @@ -379,7 +375,9 @@ items.prototype.quickSaveEquip = function (index) { ////// 读取装备 ////// items.prototype.quickLoadEquip = function (index) { - var current = core.getFlag('saveEquips', [])[index]; + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + var current = flags.getFieldValueDefaults('saveEquips', [])[index]; if (!current) { core.playSound('操作失败'); core.drawTip(index + '号套装不存在'); diff --git a/public/libs/maps.js b/public/libs/maps.js index 93667d9..5d9344b 100644 --- a/public/libs/maps.js +++ b/public/libs/maps.js @@ -27,14 +27,7 @@ maps.prototype._initFloors = function (floorId) { }; maps.prototype._resetFloorImages = function () { - for (var floorId in core.status.maps) { - (core.status.maps[floorId].images || []).forEach(function (one) { - var flag = '__floorImg__' + floorId + '_' + one.x + '_' + one.y; - if (core.getFlag(flag) == null) { - if (one.disabled) core.setFlag(flag, true); - } - }); - } + // Deprecated. See packages-user/client-modules/src/render/map/renderer.ts setStaticBackground & setDynamicBackground }; maps.prototype._setHDCanvasSize = function (ctx, width, height) { @@ -722,51 +715,40 @@ maps.prototype._getBgFgMapArray = function (name, floorId, noCache) { var width = core.floors[floorId].width; var height = core.floors[floorId].height; - // @ts-ignore if (!noCache && core.status[name + 'maps'][floorId]) - // @ts-ignore return core.status[name + 'maps'][floorId]; var arr = main.mode == 'editor' && - // @ts-ignore !(window.editor && editor.uievent && editor.uievent.isOpen) - ? // @ts-ignore - core.cloneArray(editor[name + 'map']) + ? core.cloneArray(editor[name + 'map']) : null; if (arr == null) - // @ts-ignore arr = core.cloneArray(core.floors[floorId][name + 'map'] || []); for (var y = 0; y < height; ++y) { if (arr[y] == null) arr[y] = Array(width).fill(0); } - // @ts-ignore - (core.getFlag('__' + name + 'v__', {})[floorId] || []).forEach( - // @ts-ignore - function (one) { - arr[one[1]][one[0]] = one[2] || 0; - } - ); - // @ts-ignore - (core.getFlag('__' + name + 'd__', {})[floorId] || []).forEach( - // @ts-ignore - function (one) { - arr[one[1]][one[0]] = 0; - } - ); + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + ( + flags.getFieldValueDefaults('__' + name + 'v__', {})[floorId] || [] + ).forEach(function (one) { + arr[one[1]][one[0]] = one[2] || 0; + }); + ( + flags.getFieldValueDefaults('__' + name + 'd__', {})[floorId] || [] + ).forEach(function (one) { + arr[one[1]][one[0]] = 0; + }); if (main.mode == 'editor') { for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { - // @ts-ignore arr[y][x] = arr[y][x].idnum || arr[y][x] || 0; } } } - // @ts-ignore - if (core.status[name + 'maps']) - // @ts-ignore - core.status[name + 'maps'][floorId] = arr; + if (core.status[name + 'maps']) core.status[name + 'maps'][floorId] = arr; return arr; }; @@ -3286,7 +3268,9 @@ maps.prototype._triggerBgFgMap = function (type, name, loc, floorId, callback) { if (!floorId) return; if (loc.length == 0) return; - var disabled = core.getFlag('__' + name + 'd__', {}); + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + var disabled = flags.getFieldValueDefaults('__' + name + 'd__', {}); disabled[floorId] = disabled[floorId] || []; loc.forEach(function (t) { if (type == 'hide') { @@ -3642,8 +3626,9 @@ maps.prototype.setBgFgBlock = function (name, number, x, y, floorId) { if (!isNaN(num)) number = num; else number = core.getNumberById(number); } - - var values = core.getFlag('__' + name + 'v__', {}); + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + var values = flags.getFieldValueDefaults('__' + name + 'v__', {}); values[floorId] = (values[floorId] || []).filter(function (one) { return one[0] != x || one[1] != y; }); diff --git a/public/libs/ui.js b/public/libs/ui.js index 1e26d18..92e0656 100644 --- a/public/libs/ui.js +++ b/public/libs/ui.js @@ -1433,7 +1433,8 @@ ui.prototype._uievent_drawBackground = function (data) { }; ui.prototype._drawWindowSkin_getOpacity = function () { - return core.getFlag('__winskin_opacity__', 0.85); + // Deprecated. Use 0.85 for editor compatibility + return 0.85; }; ui.prototype._drawBackground_drawWindowSkin = function ( @@ -1555,7 +1556,9 @@ ui.prototype._calTextBoxWidth = function ( ////// 处理 \i[xxx] 的问题 ui.prototype._getDrawableIconInfo = function (id) { if (id && id.indexOf('flag:') === 0) { - id = core.getFlag(id.substring(5), id); + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + id = flags.getFieldValueDefaults(id.substring(5), id); } id = core.getIdOfThis(id); var image = null, diff --git a/public/libs/utils.js b/public/libs/utils.js index a94921f..d5fa25f 100644 --- a/public/libs/utils.js +++ b/public/libs/utils.js @@ -98,7 +98,7 @@ utils.prototype.replaceValue = function (value) { if (value.includes('flag:') || value.includes('flag:')) value = value.replace( /flag[::]([a-zA-Z0-9_\u4E00-\u9FCC\u3040-\u30FF\u2160-\u216B\u0391-\u03C9]+)/g, - "core.getFlag('$1', 0)" + "const { state } = Mota.require('@user/data-state'); const flags = state.flags; flags.getFieldValueDefaults('$1', 0)" ); if (value.includes('global:') || value.includes('global:')) value = value.replace( @@ -130,7 +130,7 @@ utils.prototype.replaceValue = function (value) { if (value.includes('temp:')) value = value.replace( /temp:([a-zA-Z0-9_]+)/g, - "core.getFlag('@temp@$1', 0)" + "const { state } = Mota.require('@user/data-state'); const flags = state.flags; flags.getFieldValueDefaults('@temp@$1', 0)" ); // if (value.indexOf('switch:') >= 0) // value = value.replace( @@ -410,7 +410,9 @@ utils.prototype.getGlobal = function (key, defaultValue) { // 录像兼容性:尝试从flag和localStorage获得 // 注意这里不再二次记录 input2: 到录像 core.status.replay.toReplay.unshift(action); - value = core.getFlag( + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + value = flags.getFieldValueDefaults( '__global__' + key, core.getLocalStorage(key, defaultValue) ); @@ -994,9 +996,11 @@ utils.prototype.decodeBase64 = function (str) { }; utils.prototype.rand = function (num) { - var rand = core.getFlag('__rand__'); + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + var rand = flags.getFieldValue('__rand__'); rand = this.__next_rand(rand); - core.setFlag('__rand__', rand); + flags.setFieldValue('__rand__', rand); var ans = rand / 2147483647; if (num && num > 0) return Math.floor(ans * num); return ans; diff --git a/public/project/functions.js b/public/project/functions.js index 8dafa2e..0d32c92 100644 --- a/public/project/functions.js +++ b/public/project/functions.js @@ -36,13 +36,15 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { core.extractBlocks(floorId); core.maps._resetFloorImages(); // 初始化怪物和道具 - core.material.enemys = core.enemys.getEnemys(); + // core.material.enemys = core.enemys.getEnemys(); core.material.items = core.items.getItems(); // 初始化全局数值和全局开关 core.values = core.clone(core.data.values); for (var key in values || {}) core.values[key] = values[key]; core.flags = core.clone(core.data.flags); - var globalFlags = core.getFlag('globalFlags', {}); + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + var globalFlags = flags.getFieldValue('globalFlags', {}); for (var key in globalFlags) core.flags[key] = globalFlags[key]; core._init_sys_flags(); // 初始化界面,状态栏等 @@ -116,13 +118,15 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { // ---------- 此时还没有进行切换,当前floorId还是原来的 ---------- // var currentId = core.status.floorId || null; // 获得当前的floorId,可能为null - var fromLoad = core.hasFlag('__fromLoad__'); // 是否是读档造成的切换 - var isFlying = core.hasFlag('__isFlying__'); // 是否是楼传造成的切换 + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + var fromLoad = flags.occupied('__fromLoad__'); // 是否是读档造成的切换 + var isFlying = flags.occupied('__isFlying__'); // 是否是楼传造成的切换 if (!fromLoad) { if (!core.hasFlag('__leaveLoc__')) - core.setFlag('__leaveLoc__', {}); + flags.setFieldValue('__leaveLoc__', {}); if (currentId != null) - core.getFlag('__leaveLoc__')[currentId] = core.clone( + flags.getFieldValue('__leaveLoc__')[currentId] = core.clone( core.status.hero.loc ); } @@ -188,11 +192,11 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { if (!core.hasFlag('__bgm__')) core.playBgm(bgm); } // 更改天气 - var weather = core.getFlag('__weather__', null); - if (!weather && core.status.maps[floorId].weather) - weather = core.status.maps[floorId].weather; - if (weather) core.setWeather(weather[0], weather[1]); - else core.setWeather(); + // var weather = core.getFlag('__weather__', null); + // if (!weather && core.status.maps[floorId].weather) + // weather = core.status.maps[floorId].weather; + // if (weather) core.setWeather(weather[0], weather[1]); + // else core.setWeather(); core.updateDamage(); @@ -222,9 +226,11 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { // floorId是切换到的楼层 // 如果是读档,则进行检查(是否需要恢复事件) - if (core.hasFlag('__fromLoad__')) { - core.events.recoverEvents(core.getFlag('__events__')); - core.removeFlag('__events__'); + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + if (flags.occupied('__fromLoad__')) { + core.events.recoverEvents(flags.getFieldValue('__events__')); + flags.deleteField('__events__'); } else { // 每次抵达楼层执行的事件 core.insertAction(core.floors[floorId].eachArrive); @@ -261,7 +267,11 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { var stair = null, loc = null; if (core.flags.flyRecordPosition) { - loc = core.getFlag('__leaveLoc__', {})[toId] || null; + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + loc = + flags.getFieldValueDefaults('__leaveLoc__', {})[toId] || + null; } // 记录录像 @@ -312,11 +322,13 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { core.status.route = core.decodeRoute(data.route); core.control._bindRoutePush(); // 文字属性,全局属性 - core.status.textAttribute = core.getFlag( + const { state } = Mota.require('@user/data-state'); + const flags = state.flags; + core.status.textAttribute = flags.getFieldValueDefaults( 'textAttribute', core.status.textAttribute ); - var toAttribute = core.getFlag( + var toAttribute = flags.getFieldValueDefaults( 'globalAttribute', core.status.globalAttribute ); @@ -325,7 +337,10 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { core.resize(); } // 重置音量 - core.events.setVolume(core.getFlag('__volume__', 1), 0); + core.events.setVolume( + flags.getFieldValueDefaults('__volume__', 1), + 0 + ); // 加载勇士图标 var icon = core.status.hero.image; icon = core.getMappedName(icon); @@ -336,16 +351,16 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { core.material.icons.hero.height = core.material.images.images[icon].height / 4; } - core.setFlag('__fromLoad__', true); + flags.setFieldValue('__fromLoad__', true); // 切换到对应的楼层 core.changeFloor(data.floorId, null, data.hero.loc, 0, function () { - if (core.hasFlag('__bgm__')) { + if (flags.occupied('__bgm__')) { // 持续播放 - core.playBgm(core.getFlag('__bgm__')); + core.playBgm(flags.getFieldValue('__bgm__')); } - core.removeFlag('__fromLoad__'); + flags.deleteField('__fromLoad__'); if (callback) callback(); }); diff --git a/src/types/declaration/control.d.ts b/src/types/declaration/control.d.ts index 6789f65..4c3af78 100644 --- a/src/types/declaration/control.d.ts +++ b/src/types/declaration/control.d.ts @@ -883,7 +883,7 @@ interface Control { floorId?: FloorIds, name?: string, defaultValue?: T - ): T; + ): T | undefined; /** * @deprecated 可使用,暂时没有替代接口\ @@ -899,7 +899,7 @@ interface Control { y?: number, floorId?: FloorIds, name?: string, - value?: number | string + value?: number ): void; /** diff --git a/task.md b/task.md new file mode 100644 index 0000000..4d829e4 --- /dev/null +++ b/task.md @@ -0,0 +1,25 @@ +# 需要弃用 + +- `getMappedName` +- `getNextLvUpNeed` +- `getLvName` +- `getHeroLoc` +- `setHeroLoc` +- `getNakedStatus` +- `getStatusLabel` +- `setBuff` +- `addBuff` +- `getBuff` +- `setStatus` +- `addStatus` +- `getStatus` +- `getStatusOrDefault` +- `getRealStatus` +- `getRealStatusOrDefault` + +# 需要重构 + +- 存档系统 +- 寻路系统 +- `core.status.hero` +- `core.status.hero.flags`