From 5c520e3d52cada6b37f6f8b0c906271bf43f9675 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Sun, 9 Mar 2025 22:13:53 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BF=AE=E5=A4=8D=E6=89=80?= =?UTF-8?q?=E6=9C=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client-modules/src/audio/index.ts | 8 +- .../client-modules/src/audio/support.ts | 2 - .../client-modules/src/fallback/index.ts | 1 - packages-user/client-modules/src/index.ts | 12 +- .../client-modules/src/render/damage.ts | 4 +- .../client-modules/src/render/index.tsx | 11 +- .../client-modules/src/render/itemDetail.ts | 10 +- .../src/render/legacy/gameCanvas.ts | 22 +- .../client-modules/src/render/loopMap.ts | 8 +- packages-user/data-base/src/game.ts | 22 + packages-user/data-fallback/src/battle.ts | 226 ++-- packages-user/entry-client/src/create.ts | 15 + packages-user/entry-data/package.json | 1 + packages-user/entry-data/src/create.ts | 8 + packages-user/entry-data/src/index.ts | 2 +- packages-user/entry-data/src/mota.ts | 4 - .../legacy-plugin-data/src/dev/hotReload.ts | 4 +- .../legacy-plugin-data/src/fallback.ts | 1027 +++++++++-------- packages-user/legacy-plugin-data/src/index.ts | 15 +- packages-user/legacy-plugin-data/src/ui.ts | 4 +- packages/legacy-ui/src/data/desc.json | 40 - packages/legacy-ui/src/data/settings.json | 6 +- packages/legacy-ui/src/fx/index.ts | 6 + packages/legacy-ui/src/fx/shadow.ts | 82 +- packages/legacy-ui/src/index.ts | 8 +- packages/legacy-ui/src/preset/danmaku.ts | 40 +- packages/legacy-ui/src/preset/fixed.ts | 50 +- packages/legacy-ui/src/preset/index.ts | 10 + packages/legacy-ui/src/preset/ui.ts | 88 +- packages/legacy-ui/src/preset/uiIns.ts | 5 - packages/legacy-ui/src/ui/skill.vue | 2 +- packages/legacy-ui/src/utils.ts | 2 - packages/render-elements/src/cache.ts | 55 +- packages/render-elements/src/frame.ts | 22 +- packages/render-elements/src/index.ts | 12 + packages/render-elements/src/layer.ts | 80 +- packages/render-elements/src/viewport.ts | 10 +- public/_server/MotaAction.g4 | 2 +- public/_server/table/comment.js | 4 +- public/libs/actions.js | 10 +- public/libs/control.js | 54 +- public/libs/core.js | 12 +- public/libs/events.js | 55 +- public/libs/maps.js | 16 +- public/libs/ui.js | 17 +- public/main.js | 7 +- public/project/floors/MT0.js | 4 +- public/project/floors/MT12.js | 2 +- public/project/floors/MT16.js | 4 +- public/project/floors/MT21.js | 2 +- public/project/floors/MT31.js | 2 +- public/project/floors/MT35.js | 2 +- public/project/floors/MT5.js | 2 +- public/project/floors/MT54.js | 2 +- public/project/floors/MT55.js | 2 +- public/project/floors/MT56.js | 2 +- public/project/floors/MT58.js | 4 +- public/project/floors/MT6.js | 2 +- public/project/floors/MT80.js | 2 +- public/project/floors/MT94.js | 4 +- public/project/floors/MT95.js | 2 +- public/project/floors/MT96.js | 2 +- public/project/floors/tower5.js | 2 +- public/project/functions.js | 43 +- public/project/items.js | 88 +- src/main.ts | 8 +- types/declaration/control.d.ts | 11 +- types/declaration/event.d.ts | 14 + 68 files changed, 1230 insertions(+), 1077 deletions(-) diff --git a/packages-user/client-modules/src/audio/index.ts b/packages-user/client-modules/src/audio/index.ts index 415d35f..c09a229 100644 --- a/packages-user/client-modules/src/audio/index.ts +++ b/packages-user/client-modules/src/audio/index.ts @@ -3,9 +3,11 @@ import { OpusDecoder, VorbisDecoder } from './decoder'; import { AudioType } from './support'; import { AudioDecoder } from './decoder'; -loadAllBgm(); -AudioDecoder.registerDecoder(AudioType.Ogg, VorbisDecoder); -AudioDecoder.registerDecoder(AudioType.Opus, OpusDecoder); +export function createAudio() { + loadAllBgm(); + AudioDecoder.registerDecoder(AudioType.Ogg, VorbisDecoder); + AudioDecoder.registerDecoder(AudioType.Opus, OpusDecoder); +} export * from './support'; export * from './effect'; diff --git a/packages-user/client-modules/src/audio/support.ts b/packages-user/client-modules/src/audio/support.ts index 64240ba..66ba851 100644 --- a/packages-user/client-modules/src/audio/support.ts +++ b/packages-user/client-modules/src/audio/support.ts @@ -51,5 +51,3 @@ isAudioSupport(AudioType.Wav); isAudioSupport(AudioType.Flac); isAudioSupport(AudioType.Opus); isAudioSupport(AudioType.Aac); - -console.log(supportMap); diff --git a/packages-user/client-modules/src/fallback/index.ts b/packages-user/client-modules/src/fallback/index.ts index 49119df..36ce4bf 100644 --- a/packages-user/client-modules/src/fallback/index.ts +++ b/packages-user/client-modules/src/fallback/index.ts @@ -1,4 +1,3 @@ -import { Patch } from '@motajs/legacy-common'; import { patchAudio } from './audio'; import { patchWeather } from './weather'; import { patchUI } from './ui'; diff --git a/packages-user/client-modules/src/index.ts b/packages-user/client-modules/src/index.ts index 02ebb93..4b4d251 100644 --- a/packages-user/client-modules/src/index.ts +++ b/packages-user/client-modules/src/index.ts @@ -1,6 +1,16 @@ +import { loading } from '@user/data-base'; +import { createAudio } from './audio'; import { patchAll } from './fallback'; +import { createGameRenderer, createRender } from './render'; -patchAll(); +export function create() { + createAudio(); + patchAll(); + createRender(); + loading.once('coreInit', () => { + createGameRenderer(); + }); +} export * from './action'; export * from './weather'; diff --git a/packages-user/client-modules/src/render/damage.ts b/packages-user/client-modules/src/render/damage.ts index 22980ed..ec9a441 100644 --- a/packages-user/client-modules/src/render/damage.ts +++ b/packages-user/client-modules/src/render/damage.ts @@ -22,8 +22,6 @@ import { import { IDamageEnemy, IEnemyCollection, MapDamage } from '@motajs/types'; import { UserEnemyInfo } from '@user/data-state'; -const { ensureFloorDamage } = Mota.require('@user/data-state'); - /** * 根据伤害大小获取颜色 * @param damage 伤害大小 @@ -59,6 +57,7 @@ export class FloorDamageExtends if (!this.sprite || !floor) return; const map = core.status.maps[floor]; this.sprite.setMapSize(map.width, map.height); + const { ensureFloorDamage } = Mota.require('@user/data-state'); ensureFloorDamage(floor); const enemy = core.status.maps[floor].enemy; @@ -79,6 +78,7 @@ export class FloorDamageExtends private onUpdate = (floor: FloorIds) => { if (!this.floorBinder.bindThisFloor) { + const { ensureFloorDamage } = Mota.require('@user/data-state'); ensureFloorDamage(floor); core.status.maps[floor].enemy.calRealAttribute(); } diff --git a/packages-user/client-modules/src/render/index.tsx b/packages-user/client-modules/src/render/index.tsx index 61f5092..460022e 100644 --- a/packages-user/client-modules/src/render/index.tsx +++ b/packages-user/client-modules/src/render/index.tsx @@ -4,8 +4,11 @@ import { UIController } from '@motajs/system-ui'; import { mainSceneUI } from './ui/main'; import { MAIN_HEIGHT, MAIN_WIDTH } from './shared'; import { hook } from '@user/data-base'; +import { createItemDetail } from './itemDetail'; +import { createLoopMap } from './loopMap'; +import { createGameCanvas } from './legacy/gameCanvas'; -export function create() { +export function createGameRenderer() { const main = new MotaRenderer(); main.size(MAIN_WIDTH, MAIN_HEIGHT); @@ -34,6 +37,12 @@ export function create() { console.log(main); } +export function createRender() { + createGameCanvas(); + createItemDetail(); + createLoopMap(); +} + export * from './components'; export * from './ui'; export * from './use'; diff --git a/packages-user/client-modules/src/render/itemDetail.ts b/packages-user/client-modules/src/render/itemDetail.ts index 6035f24..f52dcc8 100644 --- a/packages-user/client-modules/src/render/itemDetail.ts +++ b/packages-user/client-modules/src/render/itemDetail.ts @@ -21,11 +21,13 @@ interface ItemData { y: number; } -hook.on('setBlock', (x, y, floorId, block) => { - FloorItemDetail.listened.forEach(v => { - v.setBlock(block, x, y); +export function createItemDetail() { + hook.on('setBlock', (x, y, floorId, block) => { + FloorItemDetail.listened.forEach(v => { + v.setBlock(block, x, y); + }); }); -}); +} export class FloorItemDetail implements ILayerGroupRenderExtends { id: string = 'item-detail'; diff --git a/packages-user/client-modules/src/render/legacy/gameCanvas.ts b/packages-user/client-modules/src/render/legacy/gameCanvas.ts index 5693b93..091af03 100644 --- a/packages-user/client-modules/src/render/legacy/gameCanvas.ts +++ b/packages-user/client-modules/src/render/legacy/gameCanvas.ts @@ -12,15 +12,19 @@ function getCanvasFilterByFloorId(floorId: FloorIds = core.status.floorId) { return filterMap.find(v => v[0].includes(floorId))?.[1] ?? ''; } -loading.once('coreInit', () => { - filterMap.push( - [['MT50', 'MT60', 'MT61'], 'contrast(120%)'], // 童心佬的滤镜( - [ - core.floorIds.slice(61, 70).concat(core.floorIds.slice(72, 107)), - 'contrast(120%)' - ] // 童心佬的滤镜( - ); -}); +export function createGameCanvas() { + loading.once('coreInit', () => { + filterMap.push( + [['MT50', 'MT60', 'MT61'], 'contrast(120%)'], // 童心佬的滤镜( + [ + core.floorIds + .slice(61, 70) + .concat(core.floorIds.slice(72, 107)), + 'contrast(120%)' + ] // 童心佬的滤镜( + ); + }); +} export class LayerGroupFilter implements ILayerGroupRenderExtends { id: string = 'filter'; diff --git a/packages-user/client-modules/src/render/loopMap.ts b/packages-user/client-modules/src/render/loopMap.ts index 2afea65..847b3ac 100644 --- a/packages-user/client-modules/src/render/loopMap.ts +++ b/packages-user/client-modules/src/render/loopMap.ts @@ -18,9 +18,11 @@ let show: boolean = false; /** 循环式地图中,更新视角的委托ticker */ let delegation: number = -1; -hook.on('changingFloor', (floorId, heroLoc) => { - enableLoopMapElement(floorId); -}); +export function createLoopMap() { + hook.on('changingFloor', (floorId, heroLoc) => { + enableLoopMapElement(floorId); + }); +} function createLayer() { const group = new LayerGroup(); diff --git a/packages-user/data-base/src/game.ts b/packages-user/data-base/src/game.ts index af79114..14fa4dc 100644 --- a/packages-user/data-base/src/game.ts +++ b/packages-user/data-base/src/game.ts @@ -7,6 +7,9 @@ interface GameLoadEvent { autotileLoaded: []; coreInit: []; loaded: []; + registered: []; + dataRegistered: []; + clientRegistered: []; } class GameLoading extends EventEmitter { @@ -58,6 +61,25 @@ class GameLoading extends EventEmitter { } export const loading = new GameLoading(); +main.loading = loading; + +let clientRegistered = false; +let dataRegistered = false; + +function checkRegistered() { + if (clientRegistered && dataRegistered) { + loading.emit('registered'); + } +} + +loading.once('clientRegistered', () => { + clientRegistered = true; + checkRegistered(); +}); +loading.once('dataRegistered', () => { + dataRegistered = true; + checkRegistered(); +}); export interface GameEvent { /** Emitted in libs/events.js resetGame. */ diff --git a/packages-user/data-fallback/src/battle.ts b/packages-user/data-fallback/src/battle.ts index fcf9220..6680918 100644 --- a/packages-user/data-fallback/src/battle.ts +++ b/packages-user/data-fallback/src/battle.ts @@ -18,6 +18,7 @@ export interface CurrentEnemy { export function patchBattle() { const patch = new Patch(PatchClass.Enemys); + const patch2 = new Patch(PatchClass.Events); patch.add('canBattle', function (x, y, floorId) { const enemy = typeof x === 'number' ? getEnemy(x, y!, floorId) : x; @@ -31,7 +32,7 @@ export function patchBattle() { return damage < core.status.hero.hp; }); - core.events.battle = function battle( + function battle( x: number | DamageEnemy, y: number, force: boolean = false, @@ -59,7 +60,7 @@ export function patchBattle() { // 战后事件 core.afterBattle(enemy, isLoc ? x : enemy.x, y); callback?.(); - }; + } const getFacedId = (enemy: DamageEnemy) => { const e = enemy.enemy; @@ -69,9 +70,7 @@ export function patchBattle() { return e.id; }; - core.enemys.getCurrentEnemys = function getCurrentEnemys( - floorId = core.status.floorId - ) { + patch.add('getCurrentEnemys', function (floorId = core.status.floorId) { floorId = floorId || core.status.floorId; const enemys: CurrentEnemy[] = []; const used: Record = {}; @@ -100,9 +99,9 @@ export function patchBattle() { const bd = b.enemy.calDamage().damage; return ad - bd; }); - }; + }); - core.events._sys_battle = function (data: Block, callback?: () => void) { + patch2.add('_sys_battle', function (data: Block, callback?: () => void) { // 检查战前事件 const floor = core.floors[core.status.floorId]; const beforeBattle: MotaEvent = []; @@ -126,11 +125,11 @@ export function patchBattle() { core.insertAction(beforeBattle, data.x, data.y, callback); } } else { - core.battle(data.x, data.y, false, callback); + battle(data.x, data.y, false, callback); } - }; + }); - core.events._action_battle = function (data, x, y, prefix) { + patch2.add('_action_battle', function (data, x, y, prefix) { if (data.id) { const enemy = getSingleEnemy(data.id as EnemyIds); // todo: 与不在地图上的怪物战斗 @@ -139,118 +138,123 @@ export function patchBattle() { core.doAction(); return; } - const [ex, ey] = this.__action_getLoc( + const [ex, ey] = core.events.__action_getLoc( data.loc, x, y, prefix ) as LocArr; - core.battle(ex, ey, true, core.doAction); + battle(ex, ey, true, core.doAction); } - }; + }); - core.events.afterBattle = function afterBattle( - enemy: DamageEnemy, - x?: number, - y?: number - ) { - const floorId = core.status.floorId; - const special = enemy.info.special; + patch2.add( + 'afterBattle', + function (enemy: DamageEnemy, x?: number, y?: number) { + const floorId = core.status.floorId; + const special = enemy.info.special; - // 播放战斗动画 - let animate: AnimationIds = 'hand'; - // 检查当前装备是否存在攻击动画 - const equipId = core.getEquip(0); - if (equipId && (core.material.items[equipId].equip || {}).animate) - animate = core.material.items[equipId].equip.animate; + // 播放战斗动画 + let animate: AnimationIds = 'hand'; + // 检查当前装备是否存在攻击动画 + const equipId = core.getEquip(0); + if (equipId && (core.material.items[equipId].equip || {}).animate) + animate = core.material.items[equipId].equip.animate; - // 检查该动画是否存在SE,如果不存在则使用默认音效 - if (!core.material.animates[animate]?.se) core.playSound('attack.opus'); + // 检查该动画是否存在SE,如果不存在则使用默认音效 + if (!core.material.animates[animate]?.se) + core.playSound('attack.opus'); - // 战斗伤害 - const info = enemy.calDamage(core.status.hero); - const damage = info.damage; - // 判定是否致死 - if (damage >= core.status.hero.hp) { - core.status.hero.hp = 0; - core.updateStatusBar(false, true); - core.events.lose('战斗失败'); - return; + // 战斗伤害 + const info = enemy.calDamage(core.status.hero); + const damage = info.damage; + // 判定是否致死 + if (damage >= core.status.hero.hp) { + core.status.hero.hp = 0; + core.updateStatusBar(false, true); + core.events.lose('战斗失败'); + return; + } + + // 扣减体力值并记录统计数据 + core.status.hero.hp -= damage; + core.status.hero.statistics.battleDamage += damage; + core.status.hero.statistics.battle++; + + // 智慧之源 + if (special.has(14) && flags.hard === 2) { + core.addFlag( + 'inte_' + floorId, + Math.ceil((core.status.hero.mdef / 10) * 0.3) * 10 + ); + core.status.hero.mdef -= + Math.ceil((core.status.hero.mdef / 10) * 0.3) * 10; + } + + // 极昼永夜 + if (special.has(22)) { + NightSpecial.addNight(floorId, -enemy.info.night!); + } + if (special.has(23)) { + NightSpecial.addNight(floorId, enemy.info.day!); + } + + // 如果是融化怪,需要特殊标记一下 + if (special.has(25) && !isNil(x) && !isNil(y)) { + flags[`melt_${floorId}`] ??= {}; + flags[`melt_${floorId}`][`${x},${y}`] = enemy.info.melt; + } + + // 获得金币 + const money = enemy.info.money!; + core.status.hero.money += money; + core.status.hero.statistics.money += money; + + // 获得经验 + const exp = enemy.info.exp!; + core.status.hero.exp += exp; + core.status.hero.statistics.exp += exp; + + const hint = + '打败 ' + + enemy.enemy.name + + ',金币+' + + money + + ',经验+' + + exp; + core.drawTip(hint, enemy.id); + + HeroSkill.disableSkill(); + + // 事件的处理 + const todo: MotaEvent = []; + + // 战后事件 + if (!isNil(core.status.floorId)) { + const loc = `${x},${y}` as LocString; + todo.push( + ...(core.floors[core.status.floorId].afterBattle[loc] ?? []) + ); + } + todo.push(...(enemy.enemy.afterBattle ?? [])); + + // 如果事件不为空,将其插入 + if (todo.length > 0) core.insertAction(todo, x, y); + + if (!isNil(x) && !isNil(y)) { + core.drawAnimate(animate, x, y); + core.removeBlock(x, y); + } else core.drawHeroAnimate(animate); + + // 如果已有事件正在处理中 + if (core.status.event.id == null) core.continueAutomaticRoute(); + else core.clearContinueAutomaticRoute(); + + core.checkAutoEvents(); + + hook.emit('afterBattle', enemy, x, y); } - - // 扣减体力值并记录统计数据 - core.status.hero.hp -= damage; - core.status.hero.statistics.battleDamage += damage; - core.status.hero.statistics.battle++; - - // 智慧之源 - if (special.has(14) && flags.hard === 2) { - core.addFlag( - 'inte_' + floorId, - Math.ceil((core.status.hero.mdef / 10) * 0.3) * 10 - ); - core.status.hero.mdef -= - Math.ceil((core.status.hero.mdef / 10) * 0.3) * 10; - } - - // 极昼永夜 - if (special.has(22)) { - NightSpecial.addNight(floorId, -enemy.info.night!); - } - if (special.has(23)) { - NightSpecial.addNight(floorId, enemy.info.day!); - } - - // 如果是融化怪,需要特殊标记一下 - if (special.has(25) && !isNil(x) && !isNil(y)) { - flags[`melt_${floorId}`] ??= {}; - flags[`melt_${floorId}`][`${x},${y}`] = enemy.info.melt; - } - - // 获得金币 - const money = enemy.info.money!; - core.status.hero.money += money; - core.status.hero.statistics.money += money; - - // 获得经验 - const exp = enemy.info.exp!; - core.status.hero.exp += exp; - core.status.hero.statistics.exp += exp; - - const hint = - '打败 ' + enemy.enemy.name + ',金币+' + money + ',经验+' + exp; - core.drawTip(hint, enemy.id); - - HeroSkill.disableSkill(); - - // 事件的处理 - const todo: MotaEvent = []; - - // 战后事件 - if (!isNil(core.status.floorId)) { - const loc = `${x},${y}` as LocString; - todo.push( - ...(core.floors[core.status.floorId].afterBattle[loc] ?? []) - ); - } - todo.push(...(enemy.enemy.afterBattle ?? [])); - - // 如果事件不为空,将其插入 - if (todo.length > 0) core.insertAction(todo, x, y); - - if (!isNil(x) && !isNil(y)) { - core.drawAnimate(animate, x, y); - core.removeBlock(x, y); - } else core.drawHeroAnimate(animate); - - // 如果已有事件正在处理中 - if (core.status.event.id == null) core.continueAutomaticRoute(); - else core.clearContinueAutomaticRoute(); - - core.checkAutoEvents(); - - hook.emit('afterBattle', enemy, x, y); - }; + ); } loading.once('coreInit', patchBattle); diff --git a/packages-user/entry-client/src/create.ts b/packages-user/entry-client/src/create.ts index 6530af1..06c6a03 100644 --- a/packages-user/entry-client/src/create.ts +++ b/packages-user/entry-client/src/create.ts @@ -18,8 +18,11 @@ import * as ClientModules from '@user/client-modules'; import * as LegacyPluginClient from '@user/legacy-plugin-client'; import * as MutateAnimate from 'mutate-animate'; import * as Vue from 'vue'; +import { hook, loading } from '@user/data-base'; export function create() { + loading.once('registered', createModule); + Mota.register('@motajs/client', Client); Mota.register('@motajs/client-base', ClientBase); Mota.register('@motajs/common', Common); @@ -39,4 +42,16 @@ export function create() { Mota.register('@user/legacy-plugin-client', LegacyPluginClient); Mota.register('MutateAnimate', MutateAnimate); Mota.register('Vue', Vue); + + loading.emit('clientRegistered'); +} + +async function createModule() { + LegacyUI.create(); + RenderElements.create(); + ClientModules.create(); + + await import('ant-design-vue/dist/antd.dark.css'); + main.renderLoaded = true; + hook.emit('renderLoaded'); } diff --git a/packages-user/entry-data/package.json b/packages-user/entry-data/package.json index 14d95bf..c2e0e05 100644 --- a/packages-user/entry-data/package.json +++ b/packages-user/entry-data/package.json @@ -1,6 +1,7 @@ { "name": "@user/entry-data", "dependencies": { + "@motajs/legacy-common": "workspace:*", "@user/data-base": "workspace:*", "@user/data-fallback": "workspace:*", "@user/data-state": "workspace:*", diff --git a/packages-user/entry-data/src/create.ts b/packages-user/entry-data/src/create.ts index c099666..d21750c 100644 --- a/packages-user/entry-data/src/create.ts +++ b/packages-user/entry-data/src/create.ts @@ -6,9 +6,17 @@ import * as DataUtils from '@user/data-utils'; import * as LegacyPluginData from '@user/legacy-plugin-data'; export function create() { + DataBase.loading.once('registered', createModule); + Mota.register('@user/data-base', DataBase); Mota.register('@user/data-fallback', DataFallback); Mota.register('@user/data-state', DataState); Mota.register('@user/data-utils', DataUtils); Mota.register('@user/legacy-plugin-data', LegacyPluginData); + + DataBase.loading.emit('dataRegistered'); +} + +function createModule() { + LegacyPluginData.create(); } diff --git a/packages-user/entry-data/src/index.ts b/packages-user/entry-data/src/index.ts index cd6618f..1c6fadc 100644 --- a/packages-user/entry-data/src/index.ts +++ b/packages-user/entry-data/src/index.ts @@ -1,6 +1,6 @@ -import { patchAll } from '@user/data-fallback'; import { createMota } from './mota'; import { create } from './create'; +import { patchAll } from '@user/data-fallback'; import { loading } from '@user/data-base'; import { Patch } from '@motajs/legacy-common'; diff --git a/packages-user/entry-data/src/mota.ts b/packages-user/entry-data/src/mota.ts index d05dbd2..72156d6 100644 --- a/packages-user/entry-data/src/mota.ts +++ b/packages-user/entry-data/src/mota.ts @@ -93,10 +93,6 @@ class MotaSystem implements IMota { r = r; rf = rf; - constructor() { - throw new Error(`System interface class cannot be constructed.`); - } - require(key: string): any { const data = this.modules[key]; if (data) return data; diff --git a/packages-user/legacy-plugin-data/src/dev/hotReload.ts b/packages-user/legacy-plugin-data/src/dev/hotReload.ts index 61475b6..e4016ea 100644 --- a/packages-user/legacy-plugin-data/src/dev/hotReload.ts +++ b/packages-user/legacy-plugin-data/src/dev/hotReload.ts @@ -56,8 +56,8 @@ export {}; core.status.maps[data].enemy?.calRealAttribute(); core.updateStatusBar(true, true); } - Mota.require('module', 'Shadow').Shadow.update(true); - const Binder = Mota.require('module', 'Render').LayerGroupFloorBinder; + Mota.require('@motajs/legacy-ui').Shadow.update(true); + const Binder = Mota.require('@motajs/render').LayerGroupFloorBinder; Binder.activedBinder.forEach(v => { if (v.getFloor() === core.status.floorId) { v.updateBindData(); diff --git a/packages-user/legacy-plugin-data/src/fallback.ts b/packages-user/legacy-plugin-data/src/fallback.ts index d607779..787993c 100644 --- a/packages-user/legacy-plugin-data/src/fallback.ts +++ b/packages-user/legacy-plugin-data/src/fallback.ts @@ -11,6 +11,7 @@ import type { import type { TimingFn } from 'mutate-animate'; import { BlockMover, heroMoveCollection, MoveStep } from '@user/data-state'; import { hook, loading } from '@user/data-base'; +import { Patch, PatchClass } from '@motajs/legacy-common'; // 向后兼容用,会充当两个版本间过渡的作用 @@ -91,8 +92,12 @@ export function initFallback() { Mota.require('@motajs/render'); const Animation = Mota.require('MutateAnimate'); - // ----- 勇士移动相关 - control.prototype.moveAction = async function (callback?: () => void) { + const patch = new Patch(PatchClass.Control); + const patch2 = new Patch(PatchClass.Events); + const patch3 = new Patch(PatchClass.Maps); + + //#region 勇士移动相关 + patch.add('moveAction', async function (callback?: () => void) { heroMover.clearMoveQueue(); heroMover.oneStep('forward'); const lock = core.status.lockControl; @@ -103,101 +108,102 @@ export function initFallback() { heroMover.once('stepEnd', () => { controller?.stop(); }); - }; + }); - control.prototype._moveAction_moving = function ( - callback?: () => void - ) {}; + patch.add('_moveAction_moving', () => {}); - events.prototype._action_moveAction = function ( - data: any, - x: number, - y: number, - prefix: any - ) { - if (core.canMoveHero()) { - var nx = core.nextX(), - ny = core.nextY(); - // 检查noPass决定是撞击还是移动 - if (core.noPass(nx, ny)) { - core.insertAction([{ type: 'trigger', loc: [nx, ny] }]); + patch2.add( + '_action_moveAction', + function (data: any, x: number, y: number, prefix: any) { + if (core.canMoveHero()) { + var nx = core.nextX(), + ny = core.nextY(); + // 检查noPass决定是撞击还是移动 + if (core.noPass(nx, ny)) { + core.insertAction([{ type: 'trigger', loc: [nx, ny] }]); + } else { + // 先移动一格,然后尝试触发事件 + core.insertAction([ + { + type: 'function', + function: + 'function() { core.moveAction(core.doAction); }', + async: true + }, + { type: '_label' } + ]); + } + } + core.doAction(); + } + ); + + patch2.add( + 'eventMoveHero', + async function ( + steps: string[], + time: number = 500, + callback?: () => void + ) { + if (heroMover.moving) return; + const moveSteps = getMoveSteps(steps); + + const resolved = moveSteps.map(v => { + if (v.startsWith('speed')) { + return { type: 'speed', value: Number(v.slice(6)) }; + } else { + return { type: 'dir', value: v as Move2 }; + } + }); + const start: MoveStep = { type: 'speed', value: time }; + + heroMover.insertMove(...[start, ...resolved]); + const controller = heroMover.startMove(true, true, true, false); + if (!controller) { + callback?.(); + return; + } + controller.onEnd.then(() => { + callback?.(); + }); + + const animate = fallbackIds++; + + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = controller.stop; + } + ); + + patch.add( + 'setHeroLoc', + function ( + name: 'x' | 'y' | 'direction', + value: number | Dir, + noGather?: boolean + ) { + if (!core.status.hero) return; + // @ts-ignore + core.status.hero.loc[name] = value; + if ((name === 'x' || name === 'y') && !noGather) { + core.control.gatherFollowers(); + } + if (name === 'direction') { + adapters['hero-adapter']?.sync('turn', value); + adapters['hero-adapter']?.sync('setAnimateDir', value); + setHeroDirection(value as Dir); + } else if (name === 'x') { + // 为了防止逆天样板出问题 + core.bigmap.posX = value as number; + adapters['hero-adapter']?.sync('setHeroLoc', value); } else { - // 先移动一格,然后尝试触发事件 - core.insertAction([ - { - type: 'function', - function: - 'function() { core.moveAction(core.doAction); }', - async: true - }, - { type: '_label' } - ]); + // 为了防止逆天样板出问题 + core.bigmap.posY = value as number; + adapters['hero-adapter']?.sync('setHeroLoc', void 0, value); } } - core.doAction(); - }; + ); - events.prototype.eventMoveHero = async function ( - steps: string[], - time: number = 500, - callback?: () => void - ) { - if (heroMover.moving) return; - const moveSteps = getMoveSteps(steps); - - const resolved = moveSteps.map(v => { - if (v.startsWith('speed')) { - return { type: 'speed', value: Number(v.slice(6)) }; - } else { - return { type: 'dir', value: v as Move2 }; - } - }); - const start: MoveStep = { type: 'speed', value: time }; - - heroMover.insertMove(...[start, ...resolved]); - const controller = heroMover.startMove(true, true, true, false); - if (!controller) { - callback?.(); - return; - } - controller.onEnd.then(() => { - callback?.(); - }); - - const animate = fallbackIds++; - - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = controller.stop; - }; - - control.prototype.setHeroLoc = function ( - name: 'x' | 'y' | 'direction', - value: number | Dir, - noGather?: boolean - ) { - if (!core.status.hero) return; - // @ts-ignore - core.status.hero.loc[name] = value; - if ((name === 'x' || name === 'y') && !noGather) { - this.gatherFollowers(); - } - if (name === 'direction') { - adapters['hero-adapter']?.sync('turn', value); - adapters['hero-adapter']?.sync('setAnimateDir', value); - setHeroDirection(value as Dir); - } else if (name === 'x') { - // 为了防止逆天样板出问题 - core.bigmap.posX = value as number; - adapters['hero-adapter']?.sync('setHeroLoc', value); - } else { - // 为了防止逆天样板出问题 - core.bigmap.posY = value as number; - adapters['hero-adapter']?.sync('setHeroLoc', void 0, value); - } - }; - - ////// 停止勇士的一切行动,等待勇士行动结束后,再执行callback ////// - control.prototype.waitHeroToStop = function (callback?: () => void) { + patch.add('waitHeroToStop', function (callback?: () => void) { core.stopAutomaticRoute(); core.clearContinueAutomaticRoute(); heroMover.controller?.stop(); @@ -213,435 +219,467 @@ export function initFallback() { core.status.replay.speed === 24 ? 1 : 30 ); } - }; + }); - control.prototype.moveHero = async function ( - direction?: Dir, - callback?: () => void, - noRoute: boolean = false - ) { - if (heroMover.moving) return; - heroMover.clearMoveQueue(); - heroMover.oneStep(direction ?? 'forward'); - const lock = core.status.lockControl; - const controller = heroMover.startMove(false, noRoute, lock); - controller?.onEnd.then(() => { - callback?.(); - }); - heroMover.once('stepEnd', () => { - controller?.stop(); - }); - }; + patch.add( + 'moveHero', + async function ( + direction?: Dir, + callback?: () => void, + noRoute: boolean = false + ) { + if (heroMover.moving) return; + heroMover.clearMoveQueue(); + heroMover.oneStep(direction ?? 'forward'); + const lock = core.status.lockControl; + const controller = heroMover.startMove(false, noRoute, lock); + controller?.onEnd.then(() => { + callback?.(); + }); + heroMover.once('stepEnd', () => { + controller?.stop(); + }); + } + ); - events.prototype.setHeroIcon = function (name: ImageIds) { + patch2.add('setHeroIcon', function (name: ImageIds) { const img = core.material.images.images[name]; if (!img) return; core.status.hero.image = name; adapters['hero-adapter']?.sync('setImage', img); - }; + }); - control.prototype.isMoving = function () { + patch.add('isMoving', function () { return heroMover.moving; - }; + }); - ////// 设置自动寻路路线 ////// - control.prototype.setAutomaticRoute = function ( - destX: number, - destY: number, - stepPostfix: DiredLoc[] - ) { - if (heroMover.moving) return; - if (!core.status.played || core.status.lockControl) return; - if (this._setAutomaticRoute_isMoving(destX, destY)) return; - if (this._setAutomaticRoute_isTurning(destX, destY, stepPostfix)) - return; - if ( - this._setAutomaticRoute_clickMoveDirectly( - destX, - destY, - stepPostfix + patch.add( + 'setAutomaticRoute', + function (destX: number, destY: number, stepPostfix: DiredLoc[]) { + if (heroMover.moving) return; + if (!core.status.played || core.status.lockControl) return; + if (core.control._setAutomaticRoute_isMoving(destX, destY)) + return; + if ( + core.control._setAutomaticRoute_isTurning( + destX, + destY, + stepPostfix + ) ) - ) - return; - // 找寻自动寻路路线 - const moveStep = core.automaticRoute(destX, destY); - if ( - moveStep.length == 0 && - (destX != core.status.hero.loc.x || - destY != core.status.hero.loc.y || - stepPostfix.length == 0) - ) - return; - moveStep.push(...stepPostfix); - core.status.automaticRoute.destX = destX; - core.status.automaticRoute.destY = destY; - this._setAutomaticRoute_drawRoute(moveStep); - this._setAutomaticRoute_setAutoSteps(moveStep); + return; + if ( + core.control._setAutomaticRoute_clickMoveDirectly( + destX, + destY, + stepPostfix + ) + ) + return; + // 找寻自动寻路路线 + const moveStep = core.automaticRoute(destX, destY); + if ( + moveStep.length == 0 && + (destX != core.status.hero.loc.x || + destY != core.status.hero.loc.y || + stepPostfix.length == 0) + ) + return; + moveStep.push(...stepPostfix); + core.status.automaticRoute.destX = destX; + core.status.automaticRoute.destY = destY; + core.control._setAutomaticRoute_drawRoute(moveStep); + core.control._setAutomaticRoute_setAutoSteps(moveStep); - // ??? - core.setAutoHeroMove(); + // ??? + core.setAutoHeroMove(); - // 执行移动 - const steps: MoveStep[] = moveStep.map(v => { - return { type: 'dir', value: v.direction }; - }); - heroMover.clearMoveQueue(); - heroMover.insertMove(...steps); - heroMover.startMove(); - }; - - // ----- 开关门 - events.prototype.openDoor = function ( - x: number, - y: number, - needKey: boolean, - callback?: () => void - ) { - var block = core.getBlock(x, y); - core.saveAndStopAutomaticRoute(); - if (!this._openDoor_check(block, x, y, needKey)) { - var locked = core.status.lockControl; - core.waitHeroToStop(function () { - if (!locked) core.unlockControl(); - if (callback) callback(); + // 执行移动 + const steps: MoveStep[] = moveStep.map(v => { + return { type: 'dir', value: v.direction }; }); - return; + heroMover.clearMoveQueue(); + heroMover.insertMove(...steps); + heroMover.startMove(); } - if (core.status.replay.speed === 24) { - core.status.replay.animate = true; - core.removeBlock(x, y); - setTimeout(function () { - core.status.replay.animate = false; - hook.emit( - 'afterOpenDoor', - block.event.id as AllIdsOf<'animates'>, - x, - y - ); + ); + + //#region 开关门 + + patch2.add( + 'openDoor', + function ( + x: number, + y: number, + needKey: boolean, + callback?: () => void + ) { + var block = core.getBlock(x, y); + core.saveAndStopAutomaticRoute(); + if (!core.events._openDoor_check(block, x, y, needKey)) { + var locked = core.status.lockControl; + core.waitHeroToStop(function () { + if (!locked) core.unlockControl(); + if (callback) callback(); + }); + return; + } + if (core.status.replay.speed === 24) { + core.status.replay.animate = true; + core.removeBlock(x, y); + setTimeout(function () { + core.status.replay.animate = false; + hook.emit( + 'afterOpenDoor', + block.event.id as AllIdsOf<'animates'>, + x, + y + ); + if (callback) callback(); + }, 1); // +1是为了录像检测系统 + } else { + const locked = core.status.lockControl; + core.lockControl(); + core.status.replay.animate = true; + core.removeBlock(x, y); + + const cb = () => { + core.maps._removeBlockFromMap( + core.status.floorId, + block + ); + if (!locked) core.unlockControl(); + core.status.replay.animate = false; + hook.emit( + 'afterOpenDoor', + block.event.id as AllIdsOf<'animates'>, + x, + y + ); + callback?.(); + }; + + adapters['door-animate']?.all('openDoor', block).then(cb); + + const animate = fallbackIds++; + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = cb; + // this._openDoor_animate(block, x, y, callback); + } + } + ); + + patch2.add( + 'closeDoor', + function (x: number, y: number, id: AllIds, callback?: () => void) { + id = id || ''; + if ( + // @ts-ignore + (core.material.icons.animates[id] == null && + // @ts-ignore + core.material.icons.npc48[id] == null) || + core.getBlock(x, y) != null + ) { if (callback) callback(); - }, 1); // +1是为了录像检测系统 - } else { + return; + } + var block = core.getBlockById(id); + var doorInfo = (block.event || {}).doorInfo; + if (!doorInfo) { + if (callback) callback(); + return; + } + + core.playSound(doorInfo.closeSound); + const locked = core.status.lockControl; core.lockControl(); core.status.replay.animate = true; - core.removeBlock(x, y); - - const cb = () => { - core.maps._removeBlockFromMap(core.status.floorId, block); + const cb = function () { if (!locked) core.unlockControl(); core.status.replay.animate = false; - hook.emit( - 'afterOpenDoor', - block.event.id as AllIdsOf<'animates'>, - x, - y - ); + core.setBlock(id, x, y); + core.showBlock(x, y); callback?.(); }; - adapters['door-animate']?.all('openDoor', block).then(cb); - - const animate = fallbackIds++; - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = cb; - // this._openDoor_animate(block, x, y, callback); - } - }; - - events.prototype.closeDoor = function ( - x: number, - y: number, - id: AllIds, - callback?: () => void - ) { - id = id || ''; - if ( - // @ts-ignore - (core.material.icons.animates[id] == null && - // @ts-ignore - core.material.icons.npc48[id] == null) || - core.getBlock(x, y) != null - ) { - if (callback) callback(); - return; - } - var block = core.getBlockById(id); - var doorInfo = (block.event || {}).doorInfo; - if (!doorInfo) { - if (callback) callback(); - return; - } - - core.playSound(doorInfo.closeSound); - - const locked = core.status.lockControl; - core.lockControl(); - core.status.replay.animate = true; - const cb = function () { - if (!locked) core.unlockControl(); - core.status.replay.animate = false; - core.setBlock(id, x, y); - core.showBlock(x, y); - callback?.(); - }; - - if (core.status.replay.speed === 24) { - cb(); - } else { - adapters['door-animate']?.all('closeDoor', block).then(() => { + if (core.status.replay.speed === 24) { cb(); - }); + } else { + adapters['door-animate'] + ?.all('closeDoor', block) + .then(() => { + cb(); + }); - const animate = fallbackIds++; - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = cb; - this._openDoor_animate(block, x, y, callback); + const animate = fallbackIds++; + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = cb; + core.events._openDoor_animate(block, x, y, callback); + } } - }; + ); - // ----- animate & hero animate - ////// 绘制动画 ////// - maps.prototype.drawAnimate = function ( - name: AnimationIds, - x: number, - y: number, - alignWindow?: boolean, - callback?: () => void - ) { - // @ts-ignore - name = core.getMappedName(name); + //#region 动画 - // 正在播放录像:不显示动画 - if ( - core.isReplaying() || - !core.material.animates[name] || - x == null || - y == null + patch3.add( + 'drawAnimate', + function ( + name: AnimationIds, + x: number, + y: number, + alignWindow?: boolean, + callback?: () => void ) { - if (callback) callback(); - return -1; - } + // @ts-ignore + name = core.getMappedName(name); - adapters.animate - ?.all( - 'drawAnimate', - name, - x * 32 + 16, - y * 32 + 16, - alignWindow ?? false - ) - .then(() => { + // 正在播放录像:不显示动画 + if ( + core.isReplaying() || + !core.material.animates[name] || + x == null || + y == null + ) { + if (callback) callback(); + return -1; + } + + adapters.animate + ?.all( + 'drawAnimate', + name, + x * 32 + 16, + y * 32 + 16, + alignWindow ?? false + ) + .then(() => { + callback?.(); + }); + } + ); + + patch3.add( + 'drawHeroAnimate', + function (name: AnimationIds, callback?: () => void) { + // @ts-ignore + name = core.getMappedName(name); + + // 正在播放录像或动画不存在:不显示动画 + if (core.isReplaying() || !core.material.animates[name]) { + if (callback) callback(); + return -1; + } + + adapters.animate?.global('drawHeroAnimate', name).then(() => { callback?.(); }); - }; - - maps.prototype.drawHeroAnimate = function ( - name: AnimationIds, - callback?: () => void - ) { - // @ts-ignore - name = core.getMappedName(name); - - // 正在播放录像或动画不存在:不显示动画 - if (core.isReplaying() || !core.material.animates[name]) { - if (callback) callback(); - return -1; } + ); - adapters.animate?.global('drawHeroAnimate', name).then(() => { - callback?.(); - }); - }; - - // 移动跳跃图块 & 跳跃勇士 - maps.prototype.moveBlock = async function ( - x: number, - y: number, - steps: string[], - time: number = 500, - keep: boolean = false, - callback?: () => void - ) { - if (!steps || steps.length === 0) { - callback?.(); - return; - } - const block = core.getBlock(x, y); - if (!block) { - callback?.(); - return; - } - const mover = new BlockMover(x, y, core.status.floorId, 'event'); - const moveSteps = getMoveSteps(steps); - const resolved = moveSteps.map(v => { - if (v.startsWith('speed')) { - return { type: 'speed', value: Number(v.slice(6)) }; - } else { - return { type: 'dir', value: v as Move2 }; + patch3.add( + 'moveBlock', + async function ( + x: number, + y: number, + steps: string[], + time: number = 500, + keep: boolean = false, + callback?: () => void + ) { + if (!steps || steps.length === 0) { + callback?.(); + return; } - }); - const start: MoveStep = { type: 'speed', value: time }; - mover.insertMove(...[start, ...resolved]); - const controller = mover.startMove(); + const block = core.getBlock(x, y); + if (!block) { + callback?.(); + return; + } + const mover = new BlockMover( + x, + y, + core.status.floorId, + 'event' + ); + const moveSteps = getMoveSteps(steps); + const resolved = moveSteps.map(v => { + if (v.startsWith('speed')) { + return { type: 'speed', value: Number(v.slice(6)) }; + } else { + return { type: 'dir', value: v as Move2 }; + } + }); + const start: MoveStep = { type: 'speed', value: time }; + mover.insertMove(...[start, ...resolved]); + const controller = mover.startMove(); - if (controller) { - await controller.onEnd; - } + if (controller) { + await controller.onEnd; + } - if (!keep) { - core.removeBlock(mover.x, mover.y); - } - callback?.(); - }; - - ////// 显示跳跃某块的动画,达到{"type":"jump"}的效果 ////// - maps.prototype.jumpBlock = async function ( - sx: number, - sy: number, - ex: number, - ey: number, - time: number = 500, - keep: boolean = false, - callback?: () => void - ) { - const block = core.getBlock(sx, sy); - if (!block) { + if (!keep) { + core.removeBlock(mover.x, mover.y); + } callback?.(); - return; } - time /= core.status.replay.speed; - if (core.status.replay.speed === 24) time = 1; - const dx = ex - sx; - const dy = ey - sy; + ); - const fn = generateJumpFn(dx, dy); + patch3.add( + 'jumpBlock', + async function ( + sx: number, + sy: number, + ex: number, + ey: number, + time: number = 500, + keep: boolean = false, + callback?: () => void + ) { + const block = core.getBlock(sx, sy); + if (!block) { + callback?.(); + return; + } + time /= core.status.replay.speed; + if (core.status.replay.speed === 24) time = 1; + const dx = ex - sx; + const dy = ey - sy; - const list = adapters.layer?.items ?? []; - const items = [...list].filter(v => { - if (v.layer !== 'event') return false; - const ex = v.getExtends('floor-binder') as LayerFloorBinder; - if (!ex) return false; - return ex.getFloor() === core.status.floorId; - }); - const width = core.status.thisMap.width; - const index = sx + sy * width; + const fn = generateJumpFn(dx, dy); - const promise = Promise.all( - items.map(v => { - return v.moveAs(index, ex, ey, fn, time, keep); - }) - ); + const list = adapters.layer?.items ?? []; + const items = [...list].filter(v => { + if (v.layer !== 'event') return false; + const ex = v.getExtends('floor-binder') as LayerFloorBinder; + if (!ex) return false; + return ex.getFloor() === core.status.floorId; + }); + const width = core.status.thisMap.width; + const index = sx + sy * width; - core.updateStatusBar(); - core.removeBlock(sx, sy); - await promise; - if (keep) { - core.setBlock(block.id, ex, ey); - } - core.updateStatusBar(); + const promise = Promise.all( + items.map(v => { + return v.moveAs(index, ex, ey, fn, time, keep); + }) + ); - callback?.(); - }; + core.updateStatusBar(); + core.removeBlock(sx, sy); + await promise; + if (keep) { + core.setBlock(block.id, ex, ey); + } + core.updateStatusBar(); - events.prototype.jumpHero = async function ( - ex: number, - ey: number, - time: number = 500, - callback?: () => void - ) { - if (heroMover.moving) return; - - const sx = core.getHeroLoc('x'); - const sy = core.getHeroLoc('y'); - adapters.viewport?.all('mutateTo', ex, ey, time); - - const locked = core.status.lockControl; - core.lockControl(); - const list = adapters['hero-adapter']?.items ?? []; - const items = [...list]; - - time /= core.status.replay.speed; - if (core.status.replay.speed === 24) time = 1; - const fn = generateJumpFn(ex - sx, ey - sy); - await Promise.all( - items.map(v => { - if (!v.renderable) return Promise.reject(); - return v.layer.moveRenderable( - v.renderable, - sx, - sy, - fn, - time - ); - }) - ); - - if (!locked) core.unlockControl(); - core.setHeroLoc('x', ex); - core.setHeroLoc('y', ey); - callback?.(); - }; - - // ----- 视角处理 - - ////// 瞬间移动 ////// - control.prototype.moveDirectly = function ( - destX: number, - destY: number, - ignoreSteps: number - ) { - const data = this.controldata; - const success = data.moveDirectly(destX, destY, ignoreSteps); - if (success) adapters.viewport?.all('mutateTo', destX, destY); - return success; - }; - - control.prototype.moveViewport = function ( - x: number, - y: number, - _moveMode: EaseMode, - time: number = 1, - callback?: () => void - ) { - const main = Renderer.get('render-main'); - const layer = main?.getElementById('layer-main') as LayerGroup; - if (!layer) return; - const camera = Camera.for(layer); - camera.clearOperation(); - const translate = camera.addTranslate(); - - const animateTime = time / Math.max(core.status.replay.speed, 1); - const animate = new Animation.Animation(); - animate - .absolute() - .time(1) - .mode(Animation.linear()) - .move(core.bigmap.offsetX, core.bigmap.offsetY); - animate.time(animateTime).move(x * 32, y * 32); - - camera.applyTranslateAnimation( - translate, - animate, - animateTime + 50 - ); - camera.transform = layer.camera; - - const end = () => { - core.bigmap.offsetX = x * 32; - core.bigmap.offsetY = y * 32; - camera.destroy(); callback?.(); - }; + } + ); - const timeout = window.setTimeout(end, animateTime + 50); + patch2.add( + 'jumpHero', + async function ( + ex: number, + ey: number, + time: number = 500, + callback?: () => void + ) { + if (heroMover.moving) return; - const id = fallbackIds++; - core.animateFrame.lastAsyncId = id; - core.animateFrame.asyncId[id] = () => { - end(); - clearTimeout(timeout); - }; - }; + const sx = core.getHeroLoc('x'); + const sy = core.getHeroLoc('y'); + adapters.viewport?.all('mutateTo', ex, ey, time); + + const locked = core.status.lockControl; + core.lockControl(); + const list = adapters['hero-adapter']?.items ?? []; + const items = [...list]; + + time /= core.status.replay.speed; + if (core.status.replay.speed === 24) time = 1; + const fn = generateJumpFn(ex - sx, ey - sy); + await Promise.all( + items.map(v => { + if (!v.renderable) return Promise.reject(); + return v.layer.moveRenderable( + v.renderable, + sx, + sy, + fn, + time + ); + }) + ); + + if (!locked) core.unlockControl(); + core.setHeroLoc('x', ex); + core.setHeroLoc('y', ey); + callback?.(); + } + ); + + //#region 视角处理 + + patch.add( + 'moveDirectly', + function (destX: number, destY: number, ignoreSteps: number) { + const data = core.control.controldata; + const success = data.moveDirectly(destX, destY, ignoreSteps); + if (success) adapters.viewport?.all('mutateTo', destX, destY); + return success; + } + ); + + patch.add( + 'moveViewport', + function ( + x: number, + y: number, + _moveMode: EaseMode, + time: number = 1, + callback?: () => void + ) { + const main = Renderer.get('render-main'); + const layer = main?.getElementById('layer-main') as LayerGroup; + if (!layer) return; + const camera = Camera.for(layer); + camera.clearOperation(); + const translate = camera.addTranslate(); + + const animateTime = + time / Math.max(core.status.replay.speed, 1); + const animate = new Animation.Animation(); + animate + .absolute() + .time(1) + .mode(Animation.linear()) + .move(core.bigmap.offsetX, core.bigmap.offsetY); + animate.time(animateTime).move(x * 32, y * 32); + + camera.applyTranslateAnimation( + translate, + animate, + animateTime + 50 + ); + camera.transform = layer.camera; + + const end = () => { + core.bigmap.offsetX = x * 32; + core.bigmap.offsetY = y * 32; + camera.destroy(); + callback?.(); + }; + + const timeout = window.setTimeout(end, animateTime + 50); + + const id = fallbackIds++; + core.animateFrame.lastAsyncId = id; + core.animateFrame.asyncId[id] = () => { + end(); + clearTimeout(timeout); + }; + } + ); }); loading.once('loaded', () => { @@ -653,31 +691,30 @@ export function initFallback() { animate.pitch ??= {}; } }); + loading.once('coreInit', () => { + const moveAction = new Set(['up', 'down', 'left', 'right']); + // 复写录像的移动 + core.registerReplayAction('move', action => { + if (moveAction.has(action)) { + if (!heroMover.moving) { + heroMover.startMove(); + } + if (!heroMover.controller) { + return false; + } + heroMover.controller.push({ + type: 'dir', + value: action as Dir + }); - const moveAction = new Set(['up', 'down', 'left', 'right']); - // 复写录像的移动 - core.registerReplayAction('move', action => { - if (moveAction.has(action)) { - if (!heroMover.moving) { - heroMover.startMove(); - } - if (!heroMover.controller) { + heroMover.controller.onEnd.then(() => { + core.replay(); + }); + + return true; + } else { return false; } - heroMover.controller.push({ - type: 'dir', - value: action as Dir - }); - - heroMover.controller.onEnd.then(() => { - core.replay(); - }); - - return true; - } else { - return false; - } + }); }); - - // return { readyMove, endMove, move }; } diff --git a/packages-user/legacy-plugin-data/src/index.ts b/packages-user/legacy-plugin-data/src/index.ts index c274dc4..d2c7078 100644 --- a/packages-user/legacy-plugin-data/src/index.ts +++ b/packages-user/legacy-plugin-data/src/index.ts @@ -1,3 +1,4 @@ +import { loading } from '@user/data-base'; import { initFallback } from './fallback'; import { initFiveLayer } from './fiveLayer'; import { createHook } from './hook'; @@ -8,11 +9,15 @@ if (import.meta.env.DEV) { import('./dev/hotReload'); } -initFallback(); -initFiveLayer(); -createHook(); -initReplay(); -initUI(); +export function create() { + initFallback(); + loading.once('coreInit', () => { + initFiveLayer(); + createHook(); + initReplay(); + initUI(); + }); +} export * from './chase'; export * from './fallback'; diff --git a/packages-user/legacy-plugin-data/src/ui.ts b/packages-user/legacy-plugin-data/src/ui.ts index 811d024..80eb6b1 100644 --- a/packages-user/legacy-plugin-data/src/ui.ts +++ b/packages-user/legacy-plugin-data/src/ui.ts @@ -2,7 +2,7 @@ export function initUI() { if (main.mode === 'editor') return; - const { mainUi, fixedUi, mainSetting } = Mota.requireAll('var'); + const { mainUi, fixedUi, mainSetting } = Mota.require('@motajs/legacy-ui'); ui.prototype.drawBook = function () { if (!core.isReplaying()) return mainUi.open('book'); @@ -27,7 +27,7 @@ export function initUI() { if (!core.control.noAutoEvents) core.checkAutoEvents(); core.control._updateStatusBar_setToolboxIcon(); core.control.noAutoEvents = true; - Mota.require('var', 'hook').emit('statusBarUpdate'); + Mota.require('@user/data-base').hook.emit('statusBarUpdate'); }; control.prototype.showStatusBar = function () { diff --git a/packages/legacy-ui/src/data/desc.json b/packages/legacy-ui/src/data/desc.json index aad7217..d90807f 100644 --- a/packages/legacy-ui/src/data/desc.json +++ b/packages/legacy-ui/src/data/desc.json @@ -482,46 +482,6 @@ "这些技能一般需要尽早点出。" ] }, - "study": { - "text": "学习", - "condition": "Mota.Plugin.require('skillTree_g').getSkillLevel(11) > 0", - "desc": [ - "本条目会详细说明学习的机制与所有可以被学习的技能被学习后的效果。当前已经学习的技能会以与状态栏类似的盒子展示出来。", - "
", - "
", - "首先,学习技能消耗的智慧点会越来越多,初始消耗的智慧点为500,每学习一次增加250。", - "学习的技能可以持续5场战斗,在技能树界面每升级一次增加3场,", - "当前为${Mota.Plugin.require('skillTree_g').getSkillLevel(11) * 3 + 2}场。", - "学习后对应属性的值,例如抱团怪增加的属性百分比,会与被学习的怪物相同。学习界面可以使用背包中的道具或点击状态栏打开。", - "
", - "
", - "下面会详细说明每一种可以被学习的技能被学习后的效果,没有列出的均不可学习。", - "
", - "
", - "1. 致命一击:勇士每5回合对怪物造成一次强力攻击。", - "
", - "2. 恶毒:勇士攻击无视怪物的防御。", - "
", - "3. 坚固:勇士防御不低于怪物的攻击-1。", - "
", - "4. n连击:勇士每回合攻击n次", - "
", - "5. 饥渴:勇士在战前吸取怪物一定量的攻击加载自己身上,", - "同时减少怪物相应量的攻击,优先于怪物。", - "
", - "6. 抱团:勇士周围每有一个拥有抱团属性的怪物,勇士的属性便增加一定值。", - "相应地,拥有抱团属性的怪物也会受到勇士的加成。", - "
", - "7. 勇气之刃:勇士第一回合造成一定量的伤害,之后正常。", - "
", - "8. 勇气冲锋:勇士首先发动冲锋,造成一定量的伤害,眩晕怪物5回合。", - "学习该技能后,勇士无条件先手。", - "
", - "9. 魔攻:勇士攻击无视怪物的防御。", - "
", - "10. 先攻:勇士无条件先手。" - ] - }, "special1": { "text": "第一章怪物特技", "condition": "flags.chapter > 0", diff --git a/packages/legacy-ui/src/data/settings.json b/packages/legacy-ui/src/data/settings.json index dc6c1f8..0ba3e83 100644 --- a/packages/legacy-ui/src/data/settings.json +++ b/packages/legacy-ui/src/data/settings.json @@ -26,11 +26,7 @@ "
", "注:当鼠标移动到怪物上时,经过200毫秒才会显示信息,防止误操作。" ], - "hotkey": ["设置游戏中会用到的一些快捷键"], - "toolbar": [ - "允许你在工具栏上自定义按钮,包括使用道具、开关技能、按下某个按键等。", - "推荐手机进行一些设置" - ] + "hotkey": ["设置游戏中会用到的一些快捷键"] }, "utils": { "betterLoad": [ diff --git a/packages/legacy-ui/src/fx/index.ts b/packages/legacy-ui/src/fx/index.ts index 5eea405..9cf2450 100644 --- a/packages/legacy-ui/src/fx/index.ts +++ b/packages/legacy-ui/src/fx/index.ts @@ -1,2 +1,8 @@ +import { createShadow } from './shadow'; + +export function createFx() { + createShadow(); +} + export * from './shadow'; export * from './webgl'; diff --git a/packages/legacy-ui/src/fx/shadow.ts b/packages/legacy-ui/src/fx/shadow.ts index 6cdfb27..b495367 100644 --- a/packages/legacy-ui/src/fx/shadow.ts +++ b/packages/legacy-ui/src/fx/shadow.ts @@ -75,50 +75,52 @@ function addLightFromBlock( }); } -const { hook } = Mota.require('@user/data-base'); +export function createShadow() { + const { hook } = Mota.require('@user/data-base'); -hook.once('reset', () => { - Shadow.init(); - addLightFromBlock( - core.floorIds - .slice(61, 70) - .concat(core.floorIds.slice(72, 81)) - .concat(core.floorIds.slice(85, 107)), - 103, - { decay: 50, r: 300, color: [0.9333, 0.6, 0.333, 0.3] }, - { background: [0, 0, 0, 0.2] }, - { decay: 50, r: 250, color: [0, 0, 0, 0] } - ); - addLightFromBlock( - ['MT50', 'MT60', 'MT61', 'MT72', 'MT73', 'MT74', 'MT75'], - 103, - { - decay: 20, - r: 150, - color: [0.9333, 0.6, 0.333, 0.3], - noShelter: true - }, - { background: [0, 0, 0, 0.3] } - ); - hook.on('loadData', () => { + hook.once('reset', () => { + Shadow.init(); + addLightFromBlock( + core.floorIds + .slice(61, 70) + .concat(core.floorIds.slice(72, 81)) + .concat(core.floorIds.slice(85, 107)), + 103, + { decay: 50, r: 300, color: [0.9333, 0.6, 0.333, 0.3] }, + { background: [0, 0, 0, 0.2] }, + { decay: 50, r: 250, color: [0, 0, 0, 0] } + ); + addLightFromBlock( + ['MT50', 'MT60', 'MT61', 'MT72', 'MT73', 'MT74', 'MT75'], + 103, + { + decay: 20, + r: 150, + color: [0.9333, 0.6, 0.333, 0.3], + noShelter: true + }, + { background: [0, 0, 0, 0.3] } + ); + hook.on('loadData', () => { + Shadow.update(true); + LayerShadowExtends.shadowList.forEach(v => v.update()); + }); + }); + hook.on('reset', () => { Shadow.update(true); LayerShadowExtends.shadowList.forEach(v => v.update()); }); -}); -hook.on('reset', () => { - Shadow.update(true); - LayerShadowExtends.shadowList.forEach(v => v.update()); -}); -hook.on('setBlock', () => { - Shadow.update(true); - LayerShadowExtends.shadowList.forEach(v => v.update()); -}); -hook.on('changingFloor', floorId => { - Shadow.clearBuffer(); - Shadow.update(true); - // setCanvasFilterByFloorId(floorId); - LayerShadowExtends.shadowList.forEach(v => v.update()); -}); + hook.on('setBlock', () => { + Shadow.update(true); + LayerShadowExtends.shadowList.forEach(v => v.update()); + }); + hook.on('changingFloor', floorId => { + Shadow.clearBuffer(); + Shadow.update(true); + // setCanvasFilterByFloorId(floorId); + LayerShadowExtends.shadowList.forEach(v => v.update()); + }); +} // 深度测试着色器 diff --git a/packages/legacy-ui/src/index.ts b/packages/legacy-ui/src/index.ts index 8a79720..bcca76b 100644 --- a/packages/legacy-ui/src/index.ts +++ b/packages/legacy-ui/src/index.ts @@ -1,4 +1,10 @@ -import 'ant-design-vue/dist/antd.dark.css'; +import { createFx } from './fx'; +import { createPreset } from './preset'; + +export function create() { + createFx(); + createPreset(); +} export * as UI from './ui'; export * as Components from './components'; diff --git a/packages/legacy-ui/src/preset/danmaku.ts b/packages/legacy-ui/src/preset/danmaku.ts index 226e329..20932b1 100644 --- a/packages/legacy-ui/src/preset/danmaku.ts +++ b/packages/legacy-ui/src/preset/danmaku.ts @@ -21,25 +21,27 @@ if (import.meta.env.DEV) { Danmaku.backend = `/danmaku`; } -const { hook } = Mota.require('@user/data-base'); +export function createDanmaku() { + const { hook } = Mota.require('@user/data-base'); -hook.once('reset', () => { - Danmaku.fetch(); -}); + hook.once('reset', () => { + Danmaku.fetch(); + }); -// 勇士移动后显示弹幕 -hook.on('moveOneStep', (x, y, floor) => { - const enabled = mainSetting.getValue('ui.danmaku', true); - if (!enabled) return; - const f = Danmaku.allInPos[floor]; - if (f) { - const danmaku = f[`${x},${y}`]; - if (danmaku) { - danmaku.forEach(v => { - setTimeout(() => { - v.show(); - }, Math.random() * 1000); - }); + // 勇士移动后显示弹幕 + hook.on('moveOneStep', (x, y, floor) => { + const enabled = mainSetting.getValue('ui.danmaku', true); + if (!enabled) return; + const f = Danmaku.allInPos[floor]; + if (f) { + const danmaku = f[`${x},${y}`]; + if (danmaku) { + danmaku.forEach(v => { + setTimeout(() => { + v.show(); + }, Math.random() * 1000); + }); + } } - } -}); + }); +} diff --git a/packages/legacy-ui/src/preset/fixed.ts b/packages/legacy-ui/src/preset/fixed.ts index a4c4d48..d196f01 100644 --- a/packages/legacy-ui/src/preset/fixed.ts +++ b/packages/legacy-ui/src/preset/fixed.ts @@ -38,30 +38,32 @@ const closeFixed = () => { // todo: 应当在这里实现查看临界与特殊属性的功能 export let hovered: Block | null; -const { hook, gameListener } = Mota.require('@user/data-base'); +export function createFixed() { + const { hook, gameListener } = Mota.require('@user/data-base'); -gameListener.on('hoverBlock', block => { - closeFixed(); - hovered = block; -}); -gameListener.on('leaveBlock', (_, __, leaveGame) => { - showFixed.cancel(); - if (!leaveGame) closeFixed(); - hovered = null; -}); -gameListener.on('mouseMove', e => { - cx = e.clientX; - cy = e.clientY; - showFixed.cancel(); - if (hovered) { - showFixed(hovered); - } -}); - -hook.once('mounted', () => { - const { mainUi } = Mota.require('@motajs/legacy-ui'); - mainUi.on('start', () => { - showFixed.cancel(); + gameListener.on('hoverBlock', block => { closeFixed(); + hovered = block; }); -}); + gameListener.on('leaveBlock', (_, __, leaveGame) => { + showFixed.cancel(); + if (!leaveGame) closeFixed(); + hovered = null; + }); + gameListener.on('mouseMove', e => { + cx = e.clientX; + cy = e.clientY; + showFixed.cancel(); + if (hovered) { + showFixed(hovered); + } + }); + + hook.once('mounted', () => { + const { mainUi } = Mota.require('@motajs/legacy-ui'); + mainUi.on('start', () => { + showFixed.cancel(); + closeFixed(); + }); + }); +} diff --git a/packages/legacy-ui/src/preset/index.ts b/packages/legacy-ui/src/preset/index.ts index 38b8bac..2a89c45 100644 --- a/packages/legacy-ui/src/preset/index.ts +++ b/packages/legacy-ui/src/preset/index.ts @@ -1,3 +1,13 @@ +import { createDanmaku } from './danmaku'; +import { createFixed } from './fixed'; +import { createUI } from './ui'; + +export function createPreset() { + createDanmaku(); + createFixed(); + createUI(); +} + export * from './ui'; export * from './settings'; export * from './danmaku'; diff --git a/packages/legacy-ui/src/preset/ui.ts b/packages/legacy-ui/src/preset/ui.ts index 3c9746f..8239362 100644 --- a/packages/legacy-ui/src/preset/ui.ts +++ b/packages/legacy-ui/src/preset/ui.ts @@ -9,37 +9,39 @@ import { mainSetting } from './settingIns'; //#region legacy-ui -const { hook } = Mota.require('@user/data-base'); -hook.once('mounted', () => { - const ui = document.getElementById('ui-main')!; - const fixed = document.getElementById('ui-fixed')!; +export function createUI() { + const { hook } = Mota.require('@user/data-base'); + hook.once('mounted', () => { + const ui = document.getElementById('ui-main')!; + const fixed = document.getElementById('ui-fixed')!; - const blur = mainSetting.getSetting('screen.blur'); + const blur = mainSetting.getSetting('screen.blur'); - mainUi.on('start', () => { - ui.style.display = 'flex'; - if (blur?.value) { - ui.style.backdropFilter = 'blur(5px)'; - ui.style.backgroundColor = 'rgba(0,0,0,0.7333)'; - } else { - ui.style.backdropFilter = 'none'; - ui.style.backgroundColor = 'rgba(0,0,0,0.85)'; - } - core.lockControl(); + mainUi.on('start', () => { + ui.style.display = 'flex'; + if (blur?.value) { + ui.style.backdropFilter = 'blur(5px)'; + ui.style.backgroundColor = 'rgba(0,0,0,0.7333)'; + } else { + ui.style.backdropFilter = 'none'; + ui.style.backgroundColor = 'rgba(0,0,0,0.85)'; + } + core.lockControl(); + }); + mainUi.on('end', noClosePanel => { + ui.style.display = 'none'; + if (!noClosePanel) { + core.closePanel(); + } + }); + fixedUi.on('start', () => { + fixed.style.display = 'block'; + }); + fixedUi.on('end', () => { + fixed.style.display = 'none'; + }); }); - mainUi.on('end', noClosePanel => { - ui.style.display = 'none'; - if (!noClosePanel) { - core.closePanel(); - } - }); - fixedUi.on('start', () => { - fixed.style.display = 'block'; - }); - fixedUi.on('end', () => { - fixed.style.display = 'none'; - }); -}); +} //#endregion @@ -145,7 +147,6 @@ function handleUiSetting(key: string, n: T, _o: T) { } // ----- 游戏的所有设置项 -// todo: 虚拟键盘缩放,小地图楼传缩放 mainSetting .register( 'screen', @@ -253,10 +254,6 @@ loading.once('coreInit', () => { isMobile ? 300 : Math.floor(window.innerWidth / 600) * 50 ), 'ui.mapLazy': storage.getValue('ui.mapLazy', false), - 'ui.toolbarScale': storage.getValue( - 'ui.toolbarScale', - isMobile ? 50 : Math.floor((window.innerWidth / 1700) * 10) * 10 - ), 'ui.bookScale': storage.getValue('ui.bookScale', isMobile ? 100 : 80), 'ui.danmaku': storage.getValue('ui.danmaku', true), 'ui.danmakuSpeed': storage.getValue( @@ -271,18 +268,6 @@ interface SettingTextData { [x: string]: string[] | SettingTextData; } -function getSettingText(obj: SettingTextData, key?: string) { - for (const [k, value] of Object.entries(obj)) { - const setKey = key ? key + '.' + k : k; - if (value instanceof Array) { - mainSetting.setDescription(setKey, value.join('\n')); - } else { - getSettingText(value, setKey); - } - } -} -getSettingText(settingsText); - mainSetting .setDescription('audio.bgmEnabled', `是否开启背景音乐`) .setDescription('audio.bgmVolume', `背景音乐的音量`) @@ -293,7 +278,6 @@ mainSetting 'ui.mapLazy', `是否启用小地图懒更新模式,此模式下剩余怪物数量不会实时更新而变成切换地图后更新,打开小地图时出现卡顿可以尝试开启此设置` ) - .setDescription('ui.toolbarScale', `自定义工具栏的缩放比例`) .setDescription( 'ui.bookScale', `怪物手册界面中每个怪物框体的高度缩放,最小值限定为 20% 屏幕高度` @@ -321,6 +305,18 @@ function setFontSize() { } setFontSize(); +function getSettingText(obj: SettingTextData, key?: string) { + for (const [k, value] of Object.entries(obj)) { + const setKey = key ? key + '.' + k : k; + if (value instanceof Array) { + mainSetting.setDescription(setKey, value.join('\n')); + } else { + getSettingText(value, setKey); + } + } +} +getSettingText(settingsText); + window.addEventListener('resize', () => { setFontSize(); }); diff --git a/packages/legacy-ui/src/preset/uiIns.ts b/packages/legacy-ui/src/preset/uiIns.ts index 9f3e25d..ff82705 100644 --- a/packages/legacy-ui/src/preset/uiIns.ts +++ b/packages/legacy-ui/src/preset/uiIns.ts @@ -16,20 +16,15 @@ mainUi.register( new GameUi('shop', UI.Shop), // new GameUi('achievement', UI.Achievement), new GameUi('hotkey', UI.Hotkey), - new GameUi('toolEditor', UI.ToolEditor), new GameUi('virtualKey', VirtualKey) - // todo: 把游戏主 div 加入到 mainUi 里面 ); mainUi.showAll(); export const fixedUi = new UiController(true); fixedUi.register( - new GameUi('markedEnemy', UI.Marked), new GameUi('fixed', UI.Fixed), new GameUi('chapter', UI.Chapter), - new GameUi('completeAchi', UI.CompleteAchi), new GameUi('start', UI.Start), - new GameUi('toolbar', UI.Toolbar), new GameUi('load', UI.Load), new GameUi('danmaku', UI.Danmaku), new GameUi('danmakuEditor', UI.DanmakuEditor), diff --git a/packages/legacy-ui/src/ui/skill.vue b/packages/legacy-ui/src/ui/skill.vue index a5d5de4..869752b 100644 --- a/packages/legacy-ui/src/ui/skill.vue +++ b/packages/legacy-ui/src/ui/skill.vue @@ -56,7 +56,7 @@ const content = computed(() => { .join('') .replace( /level:(\d+)/g, - 'Mota.Plugin.require("skillTree_g").getSkillLevel($1)' + 'Mota.require("@user/data-state").getSkillLevel($1)' ) + '`' ); diff --git a/packages/legacy-ui/src/utils.ts b/packages/legacy-ui/src/utils.ts index 4e9c235..e23668a 100644 --- a/packages/legacy-ui/src/utils.ts +++ b/packages/legacy-ui/src/utils.ts @@ -1,10 +1,8 @@ import { isNil } from 'lodash-es'; import { Animation, sleep, TimingFn } from 'mutate-animate'; import { Ref, ref } from 'vue'; -import { KeyCode } from '@motajs/client-base'; import axios from 'axios'; import { decompressFromBase64 } from 'lz-string'; -import { Keyboard, KeyboardEmits, isAssist } from '@motajs/system-action'; import { logger } from '@motajs/common'; type CanParseCss = keyof { diff --git a/packages/render-elements/src/cache.ts b/packages/render-elements/src/cache.ts index def0c5b..cdb2092 100644 --- a/packages/render-elements/src/cache.ts +++ b/packages/render-elements/src/cache.ts @@ -14,19 +14,6 @@ const i = (img: ImageMapKeys) => { const imageMap: Partial = {}; -const { loading } = Mota.require('@user/data-base'); -loading.once('loaded', () => { - [ - 'enemys', - 'enemy48', - 'npcs', - 'npc48', - 'terrains', - 'items', - 'animates' - ].forEach(v => (imageMap[v as ImageMapKeys] = i(v as ImageMapKeys))); -}); - interface AutotileCache { parent?: Set>; frame: number; @@ -91,21 +78,21 @@ class TextureCache { constructor() { this.material = imageMap as Record; + } - loading.once('loaded', () => { - const map = maps_90f36752_8815_4be8_b32b_d7fad1d0542e; + init() { + const map = maps_90f36752_8815_4be8_b32b_d7fad1d0542e; + // @ts-expect-error 无法推导 + this.idNumberMap = {}; + for (const [key, { id }] of Object.entries(map)) { // @ts-expect-error 无法推导 - this.idNumberMap = {}; - for (const [key, { id }] of Object.entries(map)) { - // @ts-expect-error 无法推导 - this.idNumberMap[id] = parseInt(key) as AllNumbers; - } - this.tileset = core.material.images.tilesets; - this.autotile = splitAutotiles(this.idNumberMap); - this.images = core.material.images.images; - this.calRenderable(); - this.calAutotileConnections(); - }); + this.idNumberMap[id] = parseInt(key) as AllNumbers; + } + this.tileset = core.material.images.tilesets; + this.autotile = splitAutotiles(this.idNumberMap); + this.images = core.material.images.images; + this.calRenderable(); + this.calAutotileConnections(); } /** @@ -555,3 +542,19 @@ function splitAutotiles(map: IdToNumber): AutotileCaches { return cache as AutotileCaches; } + +export function createCache() { + const { loading } = Mota.require('@user/data-base'); + loading.once('loaded', () => { + [ + 'enemys', + 'enemy48', + 'npcs', + 'npc48', + 'terrains', + 'items', + 'animates' + ].forEach(v => (imageMap[v as ImageMapKeys] = i(v as ImageMapKeys))); + texture.init(); + }); +} diff --git a/packages/render-elements/src/frame.ts b/packages/render-elements/src/frame.ts index 1d2f292..a6e54de 100644 --- a/packages/render-elements/src/frame.ts +++ b/packages/render-elements/src/frame.ts @@ -39,14 +39,16 @@ class RenderEmits extends EventEmitter { export const renderEmits = new RenderEmits(); -Mota.require('@user/data-base').hook.once('reset', () => { - let lastTime = 0; - RenderItem.ticker.add(time => { - if (!core.isPlaying()) return; - if (time - lastTime > core.values.animateSpeed) { - RenderItem.animatedFrame++; - lastTime = time; - renderEmits.emitAnimateFrame(RenderItem.animatedFrame, time); - } +export function createFrame() { + Mota.require('@user/data-base').hook.once('reset', () => { + let lastTime = 0; + RenderItem.ticker.add(time => { + if (!core.isPlaying()) return; + if (time - lastTime > core.values.animateSpeed) { + RenderItem.animatedFrame++; + lastTime = time; + renderEmits.emitAnimateFrame(RenderItem.animatedFrame, time); + } + }); }); -}); +} diff --git a/packages/render-elements/src/index.ts b/packages/render-elements/src/index.ts index 280f1f5..1361fb6 100644 --- a/packages/render-elements/src/index.ts +++ b/packages/render-elements/src/index.ts @@ -1,3 +1,15 @@ +import { createCache } from './cache'; +import { createFrame } from './frame'; +import { createLayer } from './layer'; +import { createViewport } from './viewport'; + +export function create() { + createCache(); + createFrame(); + createLayer(); + createViewport(); +} + export * from './animate'; export * from './block'; export * from './cache'; diff --git a/packages/render-elements/src/layer.ts b/packages/render-elements/src/layer.ts index 9079ce1..0c62b95 100644 --- a/packages/render-elements/src/layer.ts +++ b/packages/render-elements/src/layer.ts @@ -1551,49 +1551,51 @@ export class Layer extends Container { const layerAdapter = new RenderAdapter('layer'); -const { hook } = Mota.require('@user/data-base'); +export function createLayer() { + const { hook } = Mota.require('@user/data-base'); -hook.on('setBlock', (x, y, floor, block) => { - const isNow = floor === core.status.floorId; - LayerGroupFloorBinder.activedBinder.forEach(v => { - if (floor === v.floor || (isNow && v.bindThisFloor)) { - v.setBlock('event', block, x, y); - } - }); - LayerFloorBinder.listenedBinder.forEach(v => { - if (v.layer.layer === 'event') { - if (v.floor === floor || (isNow && v.bindThisFloor)) { - v.setBlock(block, x, y); + hook.on('setBlock', (x, y, floor, block) => { + const isNow = floor === core.status.floorId; + LayerGroupFloorBinder.activedBinder.forEach(v => { + if (floor === v.floor || (isNow && v.bindThisFloor)) { + v.setBlock('event', block, x, y); } - } - }); -}); -hook.on('changingFloor', floor => { - // 潜在隐患:如果putRenderData改成异步,那么会变成两帧后才能真正刷新并渲染 - // 考虑到楼层转换一般不会同时执行很多次,因此这里改为立刻更新 - LayerGroupFloorBinder.activedBinder.forEach(v => { - if (v.bindThisFloor) v.updateBindData(); - v.emit('floorChange', floor); - }); - LayerFloorBinder.listenedBinder.forEach(v => { - if (v.bindThisFloor) v.updateBindData(); - }); -}); -hook.on('setBgFgBlock', (name, number, x, y, floor) => { - const isNow = floor === core.status.floorId; - LayerGroupFloorBinder.activedBinder.forEach(v => { - if (floor === v.floor || (isNow && v.bindThisFloor)) { - v.setBlock(name, number, x, y); - } - }); - LayerFloorBinder.listenedBinder.forEach(v => { - if (v.layer.layer === name) { - if (v.floor === floor || (isNow && v.bindThisFloor)) { - v.setBlock(number, x, y); + }); + LayerFloorBinder.listenedBinder.forEach(v => { + if (v.layer.layer === 'event') { + if (v.floor === floor || (isNow && v.bindThisFloor)) { + v.setBlock(block, x, y); + } } - } + }); }); -}); + hook.on('changingFloor', floor => { + // 潜在隐患:如果putRenderData改成异步,那么会变成两帧后才能真正刷新并渲染 + // 考虑到楼层转换一般不会同时执行很多次,因此这里改为立刻更新 + LayerGroupFloorBinder.activedBinder.forEach(v => { + if (v.bindThisFloor) v.updateBindData(); + v.emit('floorChange', floor); + }); + LayerFloorBinder.listenedBinder.forEach(v => { + if (v.bindThisFloor) v.updateBindData(); + }); + }); + hook.on('setBgFgBlock', (name, number, x, y, floor) => { + const isNow = floor === core.status.floorId; + LayerGroupFloorBinder.activedBinder.forEach(v => { + if (floor === v.floor || (isNow && v.bindThisFloor)) { + v.setBlock(name, number, x, y); + } + }); + LayerFloorBinder.listenedBinder.forEach(v => { + if (v.layer.layer === name) { + if (v.floor === floor || (isNow && v.bindThisFloor)) { + v.setBlock(number, x, y); + } + } + }); + }); +} interface LayerGroupBinderEvent { update: [floor: FloorIds]; diff --git a/packages/render-elements/src/viewport.ts b/packages/render-elements/src/viewport.ts index 5d3b042..80635dd 100644 --- a/packages/render-elements/src/viewport.ts +++ b/packages/render-elements/src/viewport.ts @@ -346,7 +346,9 @@ adapter.receiveSync('endMove', item => { item.endMove(); }); -const { hook } = Mota.require('@user/data-base'); -hook.on('changingFloor', (_, loc) => { - adapter.all('setPosition', loc.x, loc.y); -}); +export function createViewport() { + const { hook } = Mota.require('@user/data-base'); + hook.on('changingFloor', (_, loc) => { + adapter.all('setPosition', loc.x, loc.y); + }); +} diff --git a/public/_server/MotaAction.g4 b/public/_server/MotaAction.g4 index 248c341..d24bb7a 100644 --- a/public/_server/MotaAction.g4 +++ b/public/_server/MotaAction.g4 @@ -3517,7 +3517,7 @@ isShopVisited_e /* isShopVisited_e default : ['shop1'] allShops : ['IdString_0'] -var code = 'Mota.Plugin.require("shop_g").isShopVisited(\'' + IdString_0 + '\')'; +var code = 'Mota.require('@user/legacy-plugin-data').isShopVisited(\'' + IdString_0 + '\')'; return [code, Blockly.JavaScript.ORDER_ATOMIC]; */; diff --git a/public/_server/table/comment.js b/public/_server/table/comment.js index 06bfb80..e2482cf 100644 --- a/public/_server/table/comment.js +++ b/public/_server/table/comment.js @@ -191,7 +191,7 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_leaf": true, "_type": "popCheckboxSet", "_checkboxSet": function () { - var array = Mota.require('var', 'enemySpecials'); + var array = Mota.require('@user/data-state').specials; var b = [], c = []; for (var index = 0; index < array.length; index++) { @@ -313,7 +313,7 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_leaf": true, "_type": "popCheckboxSet", "_checkboxSet": function () { - var array = Mota.require('var', 'enemySpecials'); + var array = Mota.require('@user/data-state').specials; var b = [], c = []; for (var index = 0; index < array.length; index++) { diff --git a/public/libs/actions.js b/public/libs/actions.js index d95cace..ca32512 100644 --- a/public/libs/actions.js +++ b/public/libs/actions.js @@ -1,4 +1,4 @@ -/// +/// /* actions.js:用户交互的事件的处理 @@ -582,7 +582,7 @@ actions.prototype._sys_ondown = function (x, y, px, py) { y: Math.floor((py + core.bigmap.offsetY) / 32) }; - const loopMaps = Mota.require('module', 'Mechanism').MiscData.loopMaps; + const loopMaps = Mota.require('@user/data-state').MiscData.loopMaps; if (loopMaps.has(core.status.floorId)) { const floor = core.status.thisMap; if (pos.x < 0) pos.x += floor.width; @@ -1117,7 +1117,7 @@ actions.prototype._clickAction_text = function () { // 正在淡入淡出的话不执行 if (core.status.event.animateUI) return; - const Store = Mota.require('module', 'MainUI').TextboxStore; + const Store = Mota.require('@user/client-modules').TextboxStore; const store = Store.get('main-textbox'); // var data = core.clone(core.status.event.data.current); @@ -1519,7 +1519,7 @@ actions.prototype._keyUpViewMaps = function (keycode) { ////// 快捷商店界面时的点击操作 ////// actions.prototype._clickQuickShop = function (x, y) { - const shop = Mota.Plugin.require('shop_g'); + const shop = Mota.require('@user/legacy-plugin-data'); var shopIds = shop.listShopIds(); if (this._out(x)) return; var topIndex = @@ -1557,7 +1557,7 @@ actions.prototype._keyUpQuickShop = function (keycode) { return; } this._selectChoices( - Mota.Plugin.require('shop_g').listShopIds().length + 1, + Mota.require('@user/data-state').listShopIds().length + 1, keycode, this._clickQuickShop ); diff --git a/public/libs/control.js b/public/libs/control.js index 49333c5..3fbb413 100644 --- a/public/libs/control.js +++ b/public/libs/control.js @@ -248,7 +248,7 @@ control.prototype.showStartAnimate = function (noAnimate, callback) { callback ); Mota.r(() => { - Mota.require('var', 'fixedUi').open('start'); + Mota.require('@motajs/legacy-ui').fixedUi.open('start'); }); }; @@ -526,20 +526,17 @@ control.prototype.setHeroMoveInterval = function (callback) { // render.move(true); // }); - core.interval.heroMoveInterval = window.setInterval( - function () { - // render.offset += toAdd * 4; - core.status.heroMoving += toAdd; - if (core.status.heroMoving >= 8) { - clearInterval(core.interval.heroMoveInterval); - core.status.heroMoving = 0; - // render.offset = 0; - // render.move(false); - if (callback) callback(); - } - }, - ((core.values.moveSpeed / 8) * toAdd) / core.status.replay.speed - ); + core.interval.heroMoveInterval = window.setInterval(function () { + // render.offset += toAdd * 4; + core.status.heroMoving += toAdd; + if (core.status.heroMoving >= 8) { + clearInterval(core.interval.heroMoveInterval); + core.status.heroMoving = 0; + // render.offset = 0; + // render.move(false); + if (callback) callback(); + } + }, ((core.values.moveSpeed / 8) * toAdd) / core.status.replay.speed); }; ////// 每移动一格后执行的事件 ////// @@ -1139,7 +1136,7 @@ control.prototype.checkBlock = function () { control.prototype._checkBlock_disableQuickShop = function () { // 禁用快捷商店 - const { setShopVisited } = Mota.Plugin.require('shop_g'); + const { setShopVisited } = Mota.require('@user/data-state'); if (core.flags.disableShopOnDamage) { Object.keys(core.status.shops).forEach(function (shopId) { setShopVisited(shopId, false); @@ -1283,7 +1280,7 @@ control.prototype.startReplay = function (list) { // 'warn', // '由于不可抗力,录像播放过程中将没有勇士移动动画' // ); - Mota.require('var', 'hook').emit('replayStatus', false); + Mota.require('@user/data-base').hook.emit('replayStatus', false); this.replay(); }; @@ -1298,7 +1295,7 @@ control.prototype.pauseReplay = function () { if (!core.isPlaying() || !core.isReplaying()) return; core.status.replay.pausing = true; core.drawTip('暂停播放'); - Mota.require('var', 'hook').emit('replayStatus', false); + Mota.require('@user/data-base').hook.emit('replayStatus', false); core.updateStatusBar(false, true); }; @@ -1312,7 +1309,7 @@ control.prototype.resumeReplay = function () { core.status.replay.pausing = false; core.drawTip('恢复播放'); core.replay(); - Mota.require('var', 'hook').emit('replayStatus', true); + Mota.require('@user/data-base').hook.emit('replayStatus', true); core.updateStatusBar(false, true); }; @@ -1378,7 +1375,7 @@ control.prototype.stopReplay = function (force) { core.deleteCanvas('replay'); core.updateStatusBar(false, true); core.drawTip('停止播放并恢复游戏'); - Mota.require('var', 'hook').emit('replayStatus', true); + Mota.require('@user/data-base').hook.emit('replayStatus', true); }; ////// 回退 ////// @@ -1648,7 +1645,10 @@ control.prototype._replay_error = function (action, callback) { if (core.status.replay.save.length > 0) { core.status.replay.replaying = true; core.status.replay.pausing = true; - Mota.require('var', 'hook').emit('replayStatus', false); + Mota.require('@user/data-base').hook.emit( + 'replayStatus', + false + ); core.rewindReplay(); } else { core.playSound('操作失败'); @@ -1754,7 +1754,7 @@ control.prototype._replayAction_equip = function (action) { const type = core.getEquipTypeById(equipId); if (type >= 0) t = type; else { - Mota.Plugin.require('render_r').tip( + Mota.require('@motajs/legacy-ui').tip( 'error', '无法装备' + core.material.items[equipId]?.name ); @@ -2068,7 +2068,7 @@ control.prototype._doSL_load = function (id, callback) { 1 )[0]; if (!main.replayChecking) { - Mota.require('var', 'fixedUi').closeByName('start'); + Mota.require('@motajs/legacy-ui').fixedUi.closeByName('start'); } if (core.isPlaying() && !core.status.gameOver) { core.control.autosave(0); @@ -2085,7 +2085,9 @@ control.prototype._doSL_load = function (id, callback) { null, function (data) { if (!main.replayChecking && data) { - Mota.require('var', 'fixedUi').closeByName('start'); + Mota.require('@motajs/legacy-ui').fixedUi.closeByName( + 'start' + ); } if (id == 'autoSave' && data != null) { core.saves.autosave.data = data; @@ -2143,7 +2145,7 @@ control.prototype._doSL_load_afterGet = function (id, data) { } // 追逐战 Mota.r(() => { - Mota.Plugin.require('chase_r').end(false); + Mota.require('@user/legacy-plugin-client').end(false); }); core.ui.closePanel(); core.loadData(data, function () { @@ -3114,8 +3116,6 @@ control.prototype.resize = function () { const width = window.innerWidth; const height = window.innerHeight; - const auto = Mota.require('var', 'mainSetting').getValue('autoScale', true); - if (window.innerWidth >= 600) { // 横屏 core.domStyle.isVertical = false; diff --git a/public/libs/core.js b/public/libs/core.js index 74c2c89..369e4d0 100644 --- a/public/libs/core.js +++ b/public/libs/core.js @@ -296,10 +296,14 @@ core.prototype.init = async function (coreData, callback) { }); } else { if (main.renderLoaded) - Mota.require('var', 'fixedUi').open('load', { callback }); + Mota.require('@motajs/legacy-ui').fixedUi.open('load', { + callback + }); else { - Mota.require('var', 'hook').once('renderLoaded', () => { - Mota.require('var', 'fixedUi').open('load', { callback }); + Mota.require('@user/data-base').hook.once('renderLoaded', () => { + Mota.require('@motajs/legacy-ui').fixedUi.open('load', { + callback + }); }); } } @@ -638,7 +642,7 @@ core.prototype._afterLoadResources = function (callback) { // if (core.plugin._afterLoadResources) core.plugin._afterLoadResources(); core.showStartAnimate(); - Mota.require('var', 'hook').emit('load'); + Mota.require('@user/data-base').hook.emit('load'); if (callback) callback(); }; diff --git a/public/libs/events.js b/public/libs/events.js index a4299c5..4825ddf 100644 --- a/public/libs/events.js +++ b/public/libs/events.js @@ -25,11 +25,11 @@ events.prototype.resetGame = function (hero, hard, floorId, maps, values) { events.prototype.startGame = function (hard, seed, route, callback) { hard = hard || ''; if (!main.replayChecking) { - Mota.require('var', 'fixedUi').closeByName('start'); + Mota.require('@motajs/legacy-ui').fixedUi.closeByName('start'); } if (main.mode != 'play') return; - Mota.Plugin.require('skillTree_g').resetSkillLevel(); + Mota.require('@user/data-state').resetSkillLevel(); // 无动画的开始游戏 if (core.flags.startUsingCanvas || route != null) { @@ -314,7 +314,7 @@ events.prototype.restart = function () { core.hideStatusBar(); core.showStartAnimate(); core.playBgm(main.startBgm); - Mota.require('var', 'hook').emit('restart'); + Mota.require('@user/data-base').hook.emit('restart'); }; ////// 询问是否需要重新开始 ////// @@ -537,7 +537,7 @@ events.prototype.openDoor = function (x, y, needKey, callback) { core.removeBlock(x, y); setTimeout(function () { core.status.replay.animate = false; - Mota.require('var', 'hook').emit( + Mota.require('@user/data-base').hook.emit( 'afterOpenDoor', block.event.id, x, @@ -627,7 +627,12 @@ events.prototype._openDoor_animate = function (block, x, y, callback) { core.maps._removeBlockFromMap(core.status.floorId, block); if (!locked) core.unlockControl(); core.status.replay.animate = false; - Mota.require('var', 'hook').emit('afterOpenDoor', block.event.id, x, y); + Mota.require('@user/data-base').hook.emit( + 'afterOpenDoor', + block.event.id, + x, + y + ); if (callback) callback(); }; @@ -696,18 +701,24 @@ events.prototype.getItem = function (id, num, x, y, isGentleClick, callback) { (id.endsWith('Key') ? '(钥匙类道具,遇到对应的门时自动打开)' : itemCls == 'tools' - ? '(消耗类道具,请按T在道具栏使用)' - : itemCls == 'constants' - ? '(永久类道具,请按T在道具栏使用)' - : itemCls == 'equips' - ? '(装备类道具,请按Q在装备栏进行装备)' - : '') + ? '(消耗类道具,请按T在道具栏使用)' + : itemCls == 'constants' + ? '(永久类道具,请按T在道具栏使用)' + : itemCls == 'equips' + ? '(装备类道具,请按Q在装备栏进行装备)' + : '') ); } itemHint.push(id); } - Mota.require('var', 'hook').emit('afterGetItem', id, x, y, isGentleClick); + Mota.require('@user/data-base').hook.emit( + 'afterGetItem', + id, + x, + y, + isGentleClick + ); if (callback) callback(); }; @@ -867,7 +878,7 @@ events.prototype._changeFloor_beforeChange = function (info, callback) { if (info.time === 0 || main.replayChecking) { core.events._changeFloor_changing(info, callback); } else { - const Render = Mota.require('module', 'Render').MotaRenderer; + const Render = Mota.require('@motajs/render').MotaRenderer; const main = Render.get('render-main'); const change = main.getElementById('floor-change'); change.setTitle(core.floors[info.floorId]?.title ?? ''); @@ -900,7 +911,7 @@ events.prototype._changeFloor_changing = function (info, callback) { if (info.time === 0 || main.replayChecking) { this._changeFloor_afterChange(info, callback); } else { - const Render = Mota.require('module', 'Render').MotaRenderer; + const Render = Mota.require('@motajs/render').MotaRenderer; const main = Render.get('render-main'); const change = main.getElementById('floor-change'); change.hideChange(info.time / 2).then(() => { @@ -919,7 +930,11 @@ events.prototype._changeFloor_afterChange = function (info, callback) { events.prototype.changingFloor = function (floorId, heroLoc) { this.eventdata.changingFloor(floorId, heroLoc); - Mota.require('var', 'hook').emit('changingFloor', floorId, heroLoc); + Mota.require('@user/data-base').hook.emit( + 'changingFloor', + floorId, + heroLoc + ); }; ////// 转换楼层结束的事件 ////// @@ -1553,7 +1568,7 @@ events.prototype.__action_doAsyncFunc = function (isAsync, func) { events.prototype._action_text = function (data, x, y, prefix) { if (this.__action_checkReplaying()) return; - const Store = Mota.require('module', 'MainUI').TextboxStore; + const Store = Mota.require('@user/client-modules').TextboxStore; const store = Store.get('main-textbox'); const { text } = data; let title = ''; @@ -2203,13 +2218,13 @@ events.prototype._action_unloadEquip = function (data, x, y, prefix) { }; events.prototype._action_openShop = function (data, x, y, prefix) { - Mota.Plugin.require('shop_g').setShopVisited(data.id, true); - if (data.open) Mota.Plugin.require('shop_g').openShop(data.id, true); + Mota.require('@user/data-state').setShopVisited(data.id, true); + if (data.open) Mota.require('@user/data-state').openShop(data.id, true); core.doAction(); }; events.prototype._action_disableShop = function (data, x, y, prefix) { - Mota.Plugin.require('shop_g').setShopVisited(data.id, false); + Mota.require('@user/data-state').setShopVisited(data.id, false); core.doAction(); }; @@ -3396,7 +3411,7 @@ events.prototype.openToolbox = function (fromUserAction) { ////// 点击快捷商店按钮时的打开操作 ////// events.prototype.openQuickShop = function (fromUserAction) { if (core.isReplaying()) return; - const shop = Mota.Plugin.require('shop_g'); + const shop = Mota.require('@user/data-state'); if (Object.keys(core.status.shops).length == 0) { core.playSound('操作失败'); diff --git a/public/libs/maps.js b/public/libs/maps.js index 5db3ef4..68910da 100644 --- a/public/libs/maps.js +++ b/public/libs/maps.js @@ -806,7 +806,7 @@ maps.prototype.generateMovableArray = function (floorId) { for (var x = 0; x < width; ++x) { array[x] = Array(height).fill([]); } - const loopMaps = Mota.require('module', 'Mechanism').MiscData.loopMaps; + const loopMaps = Mota.require('@user/data-state').MiscData.loopMaps; const isLoop = loopMaps.has(floorId); var v2 = floorId == core.status.floorId && core.bigmap.v2; const half = core._HALF_WIDTH_; @@ -888,7 +888,7 @@ maps.prototype._canMoveHero_checkPoint = function ( var nx = x + core.utils.scan[direction].x, ny = y + core.utils.scan[direction].y; - const loopMaps = Mota.require('module', 'Mechanism').MiscData.loopMaps; + const loopMaps = Mota.require('@user/data-state').MiscData.loopMaps; if (loopMaps.has(floorId)) { if (nx < 0) nx = floor.width - 1; if (nx >= floor.width) nx = 0; @@ -1129,7 +1129,7 @@ maps.prototype.automaticRoute = function (destX, destY) { var route = this._automaticRoute_bfs(startX, startY, destX, destY); if (route[destX + ',' + destY] == null) return []; const floor = core.status.thisMap; - const loopMaps = Mota.require('module', 'Mechanism').MiscData.loopMaps; + const loopMaps = Mota.require('@user/data-state').MiscData.loopMaps; // 路径数组转换 var ans = [], @@ -1162,7 +1162,7 @@ maps.prototype._automaticRoute_bfs = function (startX, startY, destX, destY) { queue.queue({ depth: 0, x: startX, y: startY }); var blocks = core.getMapBlocksObj(); const floor = core.status.thisMap; - const loopMaps = Mota.require('module', 'Mechanism').MiscData.loopMaps; + const loopMaps = Mota.require('@user/data-state').MiscData.loopMaps; while (queue.length != 0) { var curr = queue.dequeue(), @@ -2654,7 +2654,7 @@ maps.prototype._drawThumbnail_realDrawTempCanvas = function ( options ) { Mota.r(() => { - const setting = Mota.require('var', 'mainSetting'); + const setting = Mota.require('@motajs/legacy-ui').mainSetting; options.ctx.imageSmoothingEnabled = !setting.getValue( 'screen.antiAliasing', true @@ -3230,7 +3230,7 @@ maps.prototype.removeBlockByIndex = function (index, floorId) { delete core.status.mapBlockObjs[floorId][block.x + ',' + block.y]; core.setMapBlockDisabled(floorId, block.x, block.y, true); this._updateMapArray(floorId, block.x, block.y); - Mota.require('var', 'hook').emit( + Mota.require('@user/data-base').hook.emit( 'setBlock', block.x, block.y, @@ -3384,7 +3384,7 @@ maps.prototype.setBlock = function (number, x, y, floorId, noredraw) { } } } - Mota.require('var', 'hook').emit( + Mota.require('@user/data-base').hook.emit( 'setBlock', x, y, @@ -3626,7 +3626,7 @@ maps.prototype.setBgFgBlock = function (name, number, x, y, floorId) { else core.drawFg(floorId); } - Mota.require('var', 'hook').emit( + Mota.require('@user/data-base').hook.emit( 'setBgFgBlock', name, number, diff --git a/public/libs/ui.js b/public/libs/ui.js index ba4c14e..bbbca27 100644 --- a/public/libs/ui.js +++ b/public/libs/ui.js @@ -1088,8 +1088,8 @@ ui.prototype._getPosition = function (content) { py == null ? 'center' : py > core._HALF_HEIGHT_ - ? 'up' - : 'down'; + ? 'up' + : 'down'; } return ''; } @@ -2225,8 +2225,7 @@ ui.prototype._drawTextBox_getHorizontalPosition = function ( paddingRight = 12; if ((posInfo.px != null && posInfo.py != null) || posInfo.pos) paddingLeft = 20; - if (titleInfo.icon != null) - paddingLeft = 62; // 15 + 32 + 15 + if (titleInfo.icon != null) paddingLeft = 62; // 15 + 32 + 15 else if (titleInfo.image) paddingLeft = 90; // 10 + 70 + 10 var left = 7 + 3 * (core._HALF_WIDTH_ - 6), right = core._PX_ - left, @@ -2996,8 +2995,8 @@ ui.prototype._drawSwitchs_display = function () { (core.flags.extraDamageType == 2 ? '[最简]' : core.flags.extraDamageType == 1 - ? '[半透明]' - : '[完整]'), + ? '[半透明]' + : '[完整]'), '自动放缩: ' + (core.getLocalStorage('autoScale') ? '[ON]' : '[OFF]'), '返回上一级' ]; @@ -3053,7 +3052,7 @@ ui.prototype._drawNotes = function () { ////// 绘制快捷商店选择栏 ////// ui.prototype._drawQuickShop = function () { - const shop = Mota.Plugin.require('shop'); + const shop = Mota.require('@user/legacy-plugin-data'); core.status.event.id = 'selectShop'; var shopList = core.status.shops, keys = shop.listShopIds(); @@ -3662,8 +3661,8 @@ ui.prototype._drawSLPanel_drawRecords = function (n) { core.status.event.id == 'save' ? '存档' : core.status.event.id == 'load' - ? '读档' - : '回放'; + ? '读档' + : '回放'; for (var i = 0; i < (n || 6); i++) { var data = core.status.event.ui[i]; diff --git a/public/main.js b/public/main.js index 982b07a..e5f3a41 100644 --- a/public/main.js +++ b/public/main.js @@ -314,7 +314,10 @@ main.prototype.loadAsync = async function (mode, callback) { if (main.mode === 'editor') return; // 自动放缩最大化 - let auto = Mota.require('var', 'mainSetting').getValue('autoScale', true); + let auto = Mota.require('@motajs/legacy-ui').mainSetting.getValue( + 'autoScale', + true + ); if (auto && !core.domStyle.isVertical) { const height = window.innerHeight; @@ -327,7 +330,7 @@ main.prototype.loadAsync = async function (mode, callback) { core.domStyle.scale = window.innerWidth / core._PX_; } Mota.r(() => { - Mota.require('module', 'Render').MotaOffscreenCanvas2D.refreshAll(); + Mota.require('@motajs/render').MotaOffscreenCanvas2D.refreshAll(); }); }; diff --git a/public/project/floors/MT0.js b/public/project/floors/MT0.js index 429d456..33231b2 100644 --- a/public/project/floors/MT0.js +++ b/public/project/floors/MT0.js @@ -50,7 +50,7 @@ main.floors.MT0= "\r[red]注意!!!\r[]该塔新增了很多新的功能,同时对样板的ui进行了大幅度的改动,操作也有改变,由于内容过多,这里不再一一描述,具体请在道具栏查看百科全书!!百科全书是在你面前的几个道具中的其中一个", { "type": "function", - "function": "function(){\nif (!core.isReplaying()) Mota.require('var', 'fixedUi').open('chapter', { chapter: '序章 起源' });\n}" + "function": "function(){\nif (!core.isReplaying()) Mota.require('@motajs/legacy-ui').fixedUi.open('chapter', { chapter: '序章 起源' });\n}" } ], "parallelDo": "", @@ -78,7 +78,7 @@ main.floors.MT0= "yes": [ { "type": "function", - "function": "function(){\nMota.require('module', 'RenderUtils').swapChapter(2, flags.hard);\n}" + "function": "function(){\nMota.require('@motajs/legacy-ui').swapChapter(2, flags.hard);\n}" } ], "no": [] diff --git a/public/project/floors/MT12.js b/public/project/floors/MT12.js index 13d11a7..f3468d5 100644 --- a/public/project/floors/MT12.js +++ b/public/project/floors/MT12.js @@ -39,7 +39,7 @@ main.floors.MT12= "手机端可以点击右下角的难度来切换下方工具栏至数字键", { "type": "function", - "function": "function(){\nconst HeroSkill = Mota.require('module', 'Mechanism').HeroSkill;\nHeroSkill.learnSkill(HeroSkill.Jump);\n}" + "function": "function(){\nconst HeroSkill = Mota.require('@user/data-state').Mechanism.HeroSkill;\nHeroSkill.learnSkill(HeroSkill.Jump);\n}" }, { "type": "hide", diff --git a/public/project/floors/MT16.js b/public/project/floors/MT16.js index 36a1f1c..c571fc2 100644 --- a/public/project/floors/MT16.js +++ b/public/project/floors/MT16.js @@ -147,7 +147,7 @@ main.floors.MT16= }, { "type": "function", - "function": "function(){\nconst controller = Mota.Plugin.require('chase_r').initChase(0);\ncontroller.initAudio(false);\n}" + "function": "function(){\nconst controller = Mota.require('@user/legacy-plugin-client').initChase(0);\ncontroller.initAudio(false);\n}" }, { "type": "show", @@ -410,7 +410,7 @@ main.floors.MT16= "这里是漏怪检测,将会检测\r[gold]洞穴、山路、山脚、平原\r[white]地区的怪物是否清完", { "type": "function", - "function": "function(){\nconst enemy = Mota.Plugin.require('remainEnemy_g').getRemainEnemyString(core.floorIds.slice(5, 17));\nif (enemy.length === 0) {\n\tcore.insertAction(['当前无剩余怪物!', { \"type\": \"hide\", \"remove\": true }, ]);\n} else {\n\tcore.insertAction(enemy);\n}\n}" + "function": "function(){\nconst enemy = Mota.require('@user/legacy-plugin-data').getRemainEnemyString(core.floorIds.slice(5, 17));\nif (enemy.length === 0) {\n\tcore.insertAction(['当前无剩余怪物!', { \"type\": \"hide\", \"remove\": true }, ]);\n} else {\n\tcore.insertAction(enemy);\n}\n}" }, { "type": "loadBgm", diff --git a/public/project/floors/MT21.js b/public/project/floors/MT21.js index 89f2ca6..887b314 100644 --- a/public/project/floors/MT21.js +++ b/public/project/floors/MT21.js @@ -157,7 +157,7 @@ main.floors.MT21= "\t[低级智人]\b[up,hero]或许智慧结晶会告诉我答案吧。", { "type": "function", - "function": "function(){\nif (!core.isReplaying()) Mota.require('var', 'fixedUi').open('chapter', { chapter: '第二章 智慧' });\nMota.Plugin.require('removeMap_g').removeMaps('tower1', 'tower7', true);\ndelete flags.tower1;\ndelete flags.wordsTimeOut;\ndelete flags.boom;\ndelete flags.booming;\n}" + "function": "function(){\nif (!core.isReplaying()) Mota.require('@motajs/legacy-ui').fixedUi.open('chapter', { chapter: '第二章 智慧' });\nMota.Plugin.require('removeMap_g').removeMaps('tower1', 'tower7', true);\ndelete flags.tower1;\ndelete flags.wordsTimeOut;\ndelete flags.boom;\ndelete flags.booming;\n}" }, { "type": "setValue", diff --git a/public/project/floors/MT31.js b/public/project/floors/MT31.js index 964edab..b6bb923 100644 --- a/public/project/floors/MT31.js +++ b/public/project/floors/MT31.js @@ -149,7 +149,7 @@ main.floors.MT31= "这里是漏怪检测,会检测\r[gold]勇气之路\r[]区域是否有遗漏怪物", { "type": "function", - "function": "function(){\nconst enemy = Mota.Plugin.require('remainEnemy_g').getRemainEnemyString(core.floorIds.slice(17, 23));\nif (enemy.length === 0) {\n\tcore.insertAction(['当前无剩余怪物!', { \"type\": \"hide\", \"remove\": true }, ]);\n} else {\n\tcore.insertAction(enemy);\n}\n}" + "function": "function(){\nconst enemy = Mota.require('@user/legacy-plugin-data').getRemainEnemyString(core.floorIds.slice(17, 23));\nif (enemy.length === 0) {\n\tcore.insertAction(['当前无剩余怪物!', { \"type\": \"hide\", \"remove\": true }, ]);\n} else {\n\tcore.insertAction(enemy);\n}\n}" } ] }, diff --git a/public/project/floors/MT35.js b/public/project/floors/MT35.js index cd7ba76..7a23094 100644 --- a/public/project/floors/MT35.js +++ b/public/project/floors/MT35.js @@ -76,7 +76,7 @@ main.floors.MT35= "这里是漏怪检测,会检测\r[gold]智慧小径\r[]区域是否有遗漏怪物", { "type": "function", - "function": "function(){\nconst enemy = Mota.Plugin.require('remainEnemy_g').getRemainEnemyString(core.floorIds.slice(30, 40));\nif (enemy.length === 0) {\n\tcore.insertAction(['当前无剩余怪物!', { \"type\": \"hide\", \"remove\": true }, ]);\n} else {\n\tcore.insertAction(enemy);\n}\n}" + "function": "function(){\nconst enemy = Mota.require('@user/legacy-plugin-data').getRemainEnemyString(core.floorIds.slice(30, 40));\nif (enemy.length === 0) {\n\tcore.insertAction(['当前无剩余怪物!', { \"type\": \"hide\", \"remove\": true }, ]);\n} else {\n\tcore.insertAction(enemy);\n}\n}" } ], "7,0": [ diff --git a/public/project/floors/MT5.js b/public/project/floors/MT5.js index 0d09d2f..9b94e21 100644 --- a/public/project/floors/MT5.js +++ b/public/project/floors/MT5.js @@ -134,7 +134,7 @@ main.floors.MT5= "这里是漏怪检测,会检测\r[gold]山洞\r[]区域的怪物是否清空", { "type": "function", - "function": "function(){\nconst enemy = Mota.Plugin.require('remainEnemy_g').getRemainEnemyString(core.floorIds.slice(0, 5));\nif (enemy.length === 0) {\n\tcore.insertAction(['当前无剩余怪物!', { \"type\": \"hide\", \"remove\": true }, ]);\n} else {\n\tcore.insertAction(enemy);\n}\n}" + "function": "function(){\nconst enemy = Mota.require('@user/legacy-plugin-data').getRemainEnemyString(core.floorIds.slice(0, 5));\nif (enemy.length === 0) {\n\tcore.insertAction(['当前无剩余怪物!', { \"type\": \"hide\", \"remove\": true }, ]);\n} else {\n\tcore.insertAction(enemy);\n}\n}" } ] }, diff --git a/public/project/floors/MT54.js b/public/project/floors/MT54.js index 7092308..8d1829f 100644 --- a/public/project/floors/MT54.js +++ b/public/project/floors/MT54.js @@ -25,7 +25,7 @@ main.floors.MT54= { "type": "function", "async": true, - "function": "function(){\nMota.require('module', 'Mechanism').BluePalace.doorConvert(7, 9);\n}" + "function": "function(){\nMota.require('@user/data-state').Mechanism.BluePalace.doorConvert(7, 9);\n}" } ] }, diff --git a/public/project/floors/MT55.js b/public/project/floors/MT55.js index 58505a4..d58d956 100644 --- a/public/project/floors/MT55.js +++ b/public/project/floors/MT55.js @@ -21,7 +21,7 @@ main.floors.MT55= { "type": "function", "async": true, - "function": "function(){\nMota.require('module', 'Mechanism').BluePalace.doorConvert(6, 7);\n}" + "function": "function(){\nMota.require('@user/data-state').Mechanism.BluePalace.doorConvert(6, 7);\n}" } ] }, diff --git a/public/project/floors/MT56.js b/public/project/floors/MT56.js index cbb7a28..617bae6 100644 --- a/public/project/floors/MT56.js +++ b/public/project/floors/MT56.js @@ -21,7 +21,7 @@ main.floors.MT56= { "type": "function", "async": true, - "function": "function(){\nMota.require('module', 'Mechanism').BluePalace.doorConvert(3, 8);\n}" + "function": "function(){\nMota.require('@user/data-state').Mechanism.BluePalace.doorConvert(3, 8);\n}" } ] }, diff --git a/public/project/floors/MT58.js b/public/project/floors/MT58.js index 6d40957..540054e 100644 --- a/public/project/floors/MT58.js +++ b/public/project/floors/MT58.js @@ -21,14 +21,14 @@ main.floors.MT58= { "type": "function", "async": true, - "function": "function(){\nMota.require('module', 'Mechanism').BluePalace.doorConvert(11, 3);\n}" + "function": "function(){\nMota.require('@user/data-state').Mechanism.BluePalace.doorConvert(11, 3);\n}" } ], "6,1": [ { "type": "function", "async": true, - "function": "function(){\nMota.require('module', 'Mechanism').BluePalace.doorConvert(6, 1);\n}" + "function": "function(){\nMota.require('@user/data-state').Mechanism.BluePalace.doorConvert(6, 1);\n}" } ] }, diff --git a/public/project/floors/MT6.js b/public/project/floors/MT6.js index dfb48a9..0070106 100644 --- a/public/project/floors/MT6.js +++ b/public/project/floors/MT6.js @@ -63,7 +63,7 @@ main.floors.MT6= "\t[原始人]\b[down,hero]感觉好像可以学习一些简单的东西了。", { "type": "function", - "function": "function(){\nif (!core.isReplaying()) Mota.require('var', 'fixedUi').open('chapter', { chapter: '第一章 勇气' });\n}" + "function": "function(){\nif (!core.isReplaying()) Mota.require('@motajs/legacy-ui').fixedUi.open('chapter', { chapter: '第一章 勇气' });\n}" }, { "type": "setValue", diff --git a/public/project/floors/MT80.js b/public/project/floors/MT80.js index ba03a92..0338fbf 100644 --- a/public/project/floors/MT80.js +++ b/public/project/floors/MT80.js @@ -21,7 +21,7 @@ main.floors.MT80= { "type": "function", "async": true, - "function": "function(){\nMota.require('module', 'Mechanism').BluePalace.doorConvert(7, 2);\n}" + "function": "function(){\nMota.require('@user/data-state').Mechanism.BluePalace.doorConvert(7, 2);\n}" } ] }, diff --git a/public/project/floors/MT94.js b/public/project/floors/MT94.js index 7a4b09f..20f36f1 100644 --- a/public/project/floors/MT94.js +++ b/public/project/floors/MT94.js @@ -21,14 +21,14 @@ main.floors.MT94= "这里是漏怪检测,会检测\r[gold]第二章所有\r[]区域是否有遗漏怪物", { "type": "function", - "function": "function(){\nconst enemy = Mota.Plugin.require('remainEnemy_g').getRemainEnemyString(core.floorIds.slice(40, 107));\nif (enemy.length === 0) {\n\tcore.insertAction(['当前无剩余怪物!', { \"type\": \"hide\", \"remove\": true }, ]);\n} else {\n\tcore.insertAction(enemy);\n}\n}" + "function": "function(){\nconst enemy = Mota.require('@user/legacy-plugin-data').getRemainEnemyString(core.floorIds.slice(40, 107));\nif (enemy.length === 0) {\n\tcore.insertAction(['当前无剩余怪物!', { \"type\": \"hide\", \"remove\": true }, ]);\n} else {\n\tcore.insertAction(enemy);\n}\n}" } ], "2,5": [ { "type": "function", "async": true, - "function": "function(){\nMota.require('module', 'Mechanism').BluePalace.doorConvert(2, 5);\n}" + "function": "function(){\nMota.require('@user/data-state').Mechanism.BluePalace.doorConvert(2, 5);\n}" } ] }, diff --git a/public/project/floors/MT95.js b/public/project/floors/MT95.js index 34cab9b..f4e6341 100644 --- a/public/project/floors/MT95.js +++ b/public/project/floors/MT95.js @@ -21,7 +21,7 @@ main.floors.MT95= { "type": "function", "async": true, - "function": "function(){\nMota.require('module', 'Mechanism').BluePalace.doorConvert(3, 8);\n}" + "function": "function(){\nMota.require('@user/data-state').Mechanism.BluePalace.doorConvert(3, 8);\n}" } ] }, diff --git a/public/project/floors/MT96.js b/public/project/floors/MT96.js index 8e5611b..3c254ff 100644 --- a/public/project/floors/MT96.js +++ b/public/project/floors/MT96.js @@ -21,7 +21,7 @@ main.floors.MT96= { "type": "function", "async": true, - "function": "function(){\nMota.require('module', 'Mechanism').BluePalace.doorConvert(13, 9);\n}" + "function": "function(){\nMota.require('@user/data-state').Mechanism.BluePalace.doorConvert(13, 9);\n}" } ] }, diff --git a/public/project/floors/tower5.js b/public/project/floors/tower5.js index 5056d0e..ba96baa 100644 --- a/public/project/floors/tower5.js +++ b/public/project/floors/tower5.js @@ -21,7 +21,7 @@ main.floors.tower5= "这里是漏怪检测,会检测\r[gold]智慧之塔\r[]区域是否有遗漏怪物", { "type": "function", - "function": "function(){\nconst enemy = Mota.Plugin.require('remainEnemy_g').getRemainEnemyString([\"tower1\", \"tower2\", \"tower3\", \"tower4\", \"tower5\", \"tower6\"]);\nif (enemy.length === 0) {\n\tcore.insertAction(['当前无剩余怪物!', { \"type\": \"hide\", \"remove\": true }, ]);\n} else {\n\tcore.insertAction(enemy);\n}\n}" + "function": "function(){\nconst enemy = Mota.require('@user/legacy-plugin-data').getRemainEnemyString([\"tower1\", \"tower2\", \"tower3\", \"tower4\", \"tower5\", \"tower6\"]);\nif (enemy.length === 0) {\n\tcore.insertAction(['当前无剩余怪物!', { \"type\": \"hide\", \"remove\": true }, ]);\n} else {\n\tcore.insertAction(enemy);\n}\n}" } ] }, diff --git a/public/project/functions.js b/public/project/functions.js index 4804e4e..ad35d99 100644 --- a/public/project/functions.js +++ b/public/project/functions.js @@ -51,8 +51,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { core.hideStatusBar(core.hasFlag('showToolbox')); else core.showStatusBar(); if (main.mode === 'play' && !main.replayChecking) { - Mota.Plugin.require('fly_r').splitArea(); - Mota.require('var', 'hook').emit('reset'); + Mota.require('@motajs/legacy-ui').splitArea(); + Mota.require('@user/data-base').hook.emit('reset'); } else { flags.autoSkill ??= true; } @@ -78,10 +78,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { }); } - const { NightSpecial, HeroSkill } = Mota.require( - 'module', - 'Mechanism' - ); + const { NightSpecial, HeroSkill } = + Mota.require('@user/data-state'); NightSpecial.clearNight(core.floorIds); HeroSkill.clearSkill(); }, @@ -155,7 +153,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { } // 根据分区信息自动砍层与恢复 - Mota.Plugin.require('removeMap_g')?.autoRemoveMaps?.(floorId); + Mota.require('@user/legacy-plugin-data')?.autoRemoveMaps?.(floorId); // 重置画布尺寸 core.maps.resizeMap(floorId); @@ -219,9 +217,12 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { core.visitFloor(floorId); } } - if (!flags.debug && !main.replayChecking) - Mota.Plugin.require('completion_r').checkVisitedFloor(); - Mota.require('var', 'hook').emit('afterChangeFloor', floorId); + // if (!flags.debug && !main.replayChecking) + // Mota.Plugin.require('completion_r').checkVisitedFloor(); + Mota.require('@user/data-base').hook.emit( + 'afterChangeFloor', + floorId + ); }, flyTo: function (toId, callback) { // 楼层传送器的使用,从当前楼层飞往toId @@ -267,10 +268,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { values[key] = core.clone(core.values[key]); } - const { NightSpecial, HeroSkill } = Mota.require( - 'module', - 'Mechanism' - ); + const { NightSpecial, HeroSkill } = + Mota.require('@user/data-state'); // 要存档的内容 var data = { @@ -283,7 +282,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { version: core.firstData.version, guid: core.getGuid(), time: new Date().getTime(), - skills: Mota.Plugin.require('skillTree_g').saveSkillTree(), + skills: Mota.require('@user/data-state').saveSkillTree(), night: [...NightSpecial.saveNight()], skill: HeroSkill.saveSkill() }; @@ -329,11 +328,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { } core.setFlag('__fromLoad__', true); - Mota.Plugin.require('skillTree_g').loadSkillTree(data.skills); - const { NightSpecial, HeroSkill } = Mota.require( - 'module', - 'Mechanism' - ); + Mota.require('@user/data-state').loadSkillTree(data.skills); + const { NightSpecial, HeroSkill } = + Mota.require('@user/data-state'); if (!data.night) { // 兼容旧版 @@ -389,7 +386,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { Mota.r(() => { if (flags.onChase) { - const chase = Mota.Plugin.require('chase_r'); + const chase = Mota.require( + '@user/legacy-plugin-client' + ); const controller = chase.initChase(0); controller.start(true); } @@ -456,7 +455,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { // 如需强行终止行走可以在这里条件判定: // core.stopAutomaticRoute(); - Mota.require('var', 'hook').emit( + Mota.require('@user/data-base').hook.emit( 'moveOneStep', nowx, nowy, diff --git a/public/project/items.js b/public/project/items.js index c0bed7d..3bcc363 100644 --- a/public/project/items.js +++ b/public/project/items.js @@ -40,8 +40,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "小绿宝石", "text": ",护盾+${core.values.greenGem}", - "itemEffect": "core.status.hero.mdef += Math.round(20 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))", - "itemEffectTip": ",智慧+${Math.round(20 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))}", + "itemEffect": "core.status.hero.mdef += Math.round(20 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))", + "itemEffectTip": ",智慧+${Math.round(20 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))}", "useItemEffect": "core.status.hero.mdef += core.values.greenGem", "canUseItemEffect": "true" }, @@ -97,8 +97,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "红血瓶", "text": ",生命+${core.values.redPotion}", - "itemEffect": "core.status.hero.hp += Math.round(100 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))", - "itemEffectTip": ",生命+${Math.round(100 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))}", + "itemEffect": "core.status.hero.hp += Math.round(100 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))", + "itemEffectTip": ",生命+${Math.round(100 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))}", "useItemEffect": "core.status.hero.hp += core.values.redPotion", "canUseItemEffect": "true" }, @@ -106,8 +106,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "蓝血瓶", "text": ",生命+${core.values.bluePotion}", - "itemEffect": "core.status.hero.hp += Math.round(200 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))", - "itemEffectTip": ",生命+${Math.round(200 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))}", + "itemEffect": "core.status.hero.hp += Math.round(200 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))", + "itemEffectTip": ",生命+${Math.round(200 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))}", "useItemEffect": "core.status.hero.hp += core.values.bluePotion", "canUseItemEffect": "true" }, @@ -115,8 +115,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "黄血瓶", "text": ",生命+${core.values.yellowPotion}", - "itemEffect": "core.status.hero.hp += Math.round(400 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))", - "itemEffectTip": ",生命+${Math.round(400 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))}", + "itemEffect": "core.status.hero.hp += Math.round(400 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))", + "itemEffectTip": ",生命+${Math.round(400 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))}", "useItemEffect": "core.status.hero.hp += core.values.yellowPotion", "canUseItemEffect": "true" }, @@ -124,8 +124,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "绿血瓶", "text": ",生命+${core.values.greenPotion}", - "itemEffect": "core.status.hero.hp += Math.round(800 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))", - "itemEffectTip": ",生命+${Math.round(800 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))}", + "itemEffect": "core.status.hero.hp += Math.round(800 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))", + "itemEffectTip": ",生命+${Math.round(800 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))}", "useItemEffect": "core.status.hero.hp += core.values.greenPotion", "canUseItemEffect": "true" }, @@ -349,7 +349,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "name": "查看技能", "text": "查看勇士的技能", "canUseItemEffect": true, - "useItemEffect": "Mota.require('var', 'mainUi').open('skill');" + "useItemEffect": "Mota.require('@motajs/legacy-ui').mainUi.open('skill');" }, "dagger": { "cls": "constants", @@ -522,7 +522,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "name": "技能树", "text": "打开技能树", "hideInReplay": true, - "useItemEffect": "Mota.Plugin.require('skillTree_g').openTree();", + "useItemEffect": "Mota.require('@user/data-state').openTree();", "canUseItemEffect": "true" }, "wand": { @@ -626,8 +626,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "中绿宝石", "text": ",护盾+${core.values.greenGem}", - "itemEffect": "core.status.hero.mdef += Math.round(40 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))", - "itemEffectTip": ",智慧+${Math.round(40 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))}", + "itemEffect": "core.status.hero.mdef += Math.round(40 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))", + "itemEffectTip": ",智慧+${Math.round(40 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))}", "useItemEffect": "core.status.hero.mdef += core.values.greenGem", "canUseItemEffect": "true" }, @@ -729,8 +729,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "大绿宝石", "text": ",护盾+${core.values.greenGem}", - "itemEffect": "core.status.hero.mdef += Math.round(80 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))", - "itemEffectTip": ",智慧+${Math.round(80 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))}", + "itemEffect": "core.status.hero.mdef += Math.round(80 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))", + "itemEffectTip": ",智慧+${Math.round(80 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))}", "useItemEffect": "core.status.hero.mdef += core.values.greenGem", "canUseItemEffect": "true" }, @@ -896,8 +896,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "超大绿宝石", "text": ",护盾+${core.values.greenGem}", - "itemEffect": "core.status.hero.mdef += Math.round(160 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))", - "itemEffectTip": ",智慧+${Math.round(160 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))}", + "itemEffect": "core.status.hero.mdef += Math.round(160 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))", + "itemEffectTip": ",智慧+${Math.round(160 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))}", "useItemEffect": "core.status.hero.mdef += core.values.greenGem", "canUseItemEffect": "true" }, @@ -1019,8 +1019,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "璀璨绿宝石", "text": ",护盾+${core.values.greenGem}", - "itemEffect": "core.status.hero.mdef += Math.round(320 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))", - "itemEffectTip": ",智慧+${Math.round(320 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))}", + "itemEffect": "core.status.hero.mdef += Math.round(320 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))", + "itemEffectTip": ",智慧+${Math.round(320 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))}", "useItemEffect": "core.status.hero.mdef += core.values.greenGem", "canUseItemEffect": "true" }, @@ -1050,8 +1050,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "传奇绿宝石", "text": ",防御+${core.values.blueGem}", - "itemEffect": "core.status.hero.mdef += Math.round(640 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))", - "itemEffectTip": ",智慧+${Math.round(640 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))}", + "itemEffect": "core.status.hero.mdef += Math.round(640 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))", + "itemEffectTip": ",智慧+${Math.round(640 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))}", "useItemEffect": "core.status.hero.def += core.values.blueGem", "canUseItemEffect": "true" }, @@ -1071,8 +1071,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "史诗绿宝石", "text": ",护盾+${core.values.greenGem}", - "itemEffect": "core.status.hero.mdef += Math.round(1280 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))", - "itemEffectTip": ",智慧+${Math.round(1280 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.Plugin.require('skillTree_g').getSkillLevel(12) / 20 + 1))}", + "itemEffect": "core.status.hero.mdef += Math.round(1280 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))", + "itemEffectTip": ",智慧+${Math.round(1280 * core.status.thisMap.ratio / core.getFlag(\"hard\") * (Mota.require('@user/data-state').getSkillLevel(12) / 20 + 1))}", "useItemEffect": "core.status.hero.mdef += core.values.greenGem", "canUseItemEffect": "true" }, @@ -1100,8 +1100,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "大红血瓶", "text": ",生命+${core.values.redPotion}", - "itemEffect": "core.status.hero.hp += Math.round(1000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))", - "itemEffectTip": ",生命+${Math.round(1000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))}", + "itemEffect": "core.status.hero.hp += Math.round(1000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))", + "itemEffectTip": ",生命+${Math.round(1000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))}", "useItemEffect": "core.status.hero.hp += core.values.redPotion", "canUseItemEffect": "true" }, @@ -1113,8 +1113,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "大蓝血瓶", "text": ",生命+${core.values.redPotion}", - "itemEffect": "core.status.hero.hp += Math.round(2000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))", - "itemEffectTip": ",生命+${Math.round(2000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))}", + "itemEffect": "core.status.hero.hp += Math.round(2000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))", + "itemEffectTip": ",生命+${Math.round(2000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))}", "useItemEffect": "core.status.hero.hp += core.values.redPotion", "canUseItemEffect": "true" }, @@ -1130,8 +1130,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "大绿血瓶", "text": ",生命+${core.values.redPotion}", - "itemEffect": "core.status.hero.hp += Math.round(8000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))", - "itemEffectTip": ",生命+${Math.round(8000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))}", + "itemEffect": "core.status.hero.hp += Math.round(8000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))", + "itemEffectTip": ",生命+${Math.round(8000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))}", "useItemEffect": "core.status.hero.hp += core.values.redPotion", "canUseItemEffect": "true" }, @@ -1151,8 +1151,8 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "大黄血瓶", "text": ",生命+${core.values.redPotion}", - "itemEffect": "core.status.hero.hp += Math.round(4000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))", - "itemEffectTip": ",生命+${Math.round(4000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))}", + "itemEffect": "core.status.hero.hp += Math.round(4000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))", + "itemEffectTip": ",生命+${Math.round(4000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))}", "useItemEffect": "core.status.hero.hp += core.values.redPotion", "canUseItemEffect": "true" }, @@ -1168,20 +1168,20 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "name": "系统设置", "canUseItemEffect": "true", "text": "内含所有系统设置项", - "useItemEffect": "if (!core.isReplaying()) Mota.require('var', 'mainUi').open('settings');" + "useItemEffect": "if (!core.isReplaying()) Mota.require('@motajs/legacy-ui').mainUi.open('settings');" }, "I560": { "cls": "constants", "name": "百科全书", "canUseItemEffect": "true", "text": "一个包含游戏中所有功能详细说明的百科全书,可以查看游戏中所有的功能", - "useItemEffect": "if (!core.isReplaying()) Mota.require('var', 'mainUi').open('desc');" + "useItemEffect": "if (!core.isReplaying()) Mota.require('@motajs/legacy-ui').mainUi.open('desc');" }, "I565": { "cls": "constants", "name": "学习", "canUseItemEffect": "true", - "text": "可以学习怪物的技能,学习后持续${Mota.Plugin.require('skillTree_g').getSkillLevel(11) * 3 + 2}场战斗" + "text": "可以学习怪物的技能,学习后持续${Mota.require('@user/data-state').getSkillLevel(11) * 3 + 2}场战斗" }, "I574": { "cls": "items", @@ -1233,7 +1233,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "constants", "name": "成就", "canUseItemEffect": "true", - "useItemEffect": "Mota.require('var', 'mainUi').open('achievement');", + "useItemEffect": "Mota.require('@motajs/legacy-ui').mainUi.open('achievement');", "text": "可以查看成就" }, "I662": { @@ -1295,28 +1295,28 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "items", "name": "高级红血瓶", "canUseItemEffect": "true", - "itemEffect": "core.status.hero.hp += Math.round(10000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))", - "itemEffectTip": ",生命+${Math.round(10000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))}" + "itemEffect": "core.status.hero.hp += Math.round(10000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))", + "itemEffectTip": ",生命+${Math.round(10000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))}" }, "I695": { "cls": "items", "name": "高级蓝血瓶", "canUseItemEffect": "true", - "itemEffect": "core.status.hero.hp += Math.round(20000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))", - "itemEffectTip": ",生命+${Math.round(20000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))}" + "itemEffect": "core.status.hero.hp += Math.round(20000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))", + "itemEffectTip": ",生命+${Math.round(20000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))}" }, "I696": { "cls": "items", "name": "高级绿血瓶", "canUseItemEffect": "true", - "itemEffect": "core.status.hero.hp += Math.round(40000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))", - "itemEffectTip": ",生命+${Math.round(40000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))}" + "itemEffect": "core.status.hero.hp += Math.round(40000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))", + "itemEffectTip": ",生命+${Math.round(40000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))}" }, "I697": { "cls": "items", "name": "高级紫血瓶", "canUseItemEffect": "true", - "itemEffect": "core.status.hero.hp += Math.round(80000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))", - "itemEffectTip": ",生命+${Math.round(80000 * core.status.thisMap.ratio * (1 + Mota.Plugin.require('skillTree_g').getSkillLevel(13) / 50))}" + "itemEffect": "core.status.hero.hp += Math.round(80000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))", + "itemEffectTip": ",生命+${Math.round(80000 * core.status.thisMap.ratio * (1 + Mota.require('@user/data-state').getSkillLevel(13) / 50))}" } } \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 61471fd..ede76c2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,12 +1,14 @@ import { createApp } from 'vue'; -import App from './App.vue'; import './styles.less'; import { createGame } from '@user/entry-client'; -createApp(App).mount('#root'); - // 创建游戏实例 createGame(); +(async () => { + const App = (await import('./App.vue')).default; + createApp(App).mount('#root'); +})(); + main.init('play'); main.listen(); diff --git a/types/declaration/control.d.ts b/types/declaration/control.d.ts index b6c32a7..c0d9fb6 100644 --- a/types/declaration/control.d.ts +++ b/types/declaration/control.d.ts @@ -218,7 +218,7 @@ interface Control { /** * 脚本编辑的control函数列表 */ - readonly controlData: ControlData; + readonly controldata: ControlData; /** * @deprecated @@ -1169,6 +1169,15 @@ interface Control { _replay_SL(): void; _replay_viewMap(): void; _replay_error(action: string): void; + _setAutomaticRoute_isMoving(x: number, y: number): boolean; + _setAutomaticRoute_isTurning(x: number, y: number, postfix: any): boolean; + _setAutomaticRoute_clickMoveDirectly( + x: number, + y: number, + postfix: any + ): boolean; + _setAutomaticRoute_drawRoute(step: any): void; + _setAutomaticRoute_setAutoSteps(step: any): void; } declare const control: new () => Control; diff --git a/types/declaration/event.d.ts b/types/declaration/event.d.ts index 3dd9da0..5ad307d 100644 --- a/types/declaration/event.d.ts +++ b/types/declaration/event.d.ts @@ -812,6 +812,20 @@ interface Events extends EventData { __action_getLoc(data: any, x?: number, y?: number, prefix?: any): any; _changeFloor_beforeChange(info: any, callback: () => void): void; + + _action_moveAction(data: any, x: number, y: number, prefix: any): void; + _openDoor_check( + block: Block, + x: number, + y: number, + needKey: boolean + ): boolean; + _openDoor_animate( + block: Block, + x: number, + y: number, + callback?: () => void + ): void; } declare const events: new () => Events;