From ef8d3e9e2e646a9c1bae9d0f656f26818b417c07 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Sun, 9 Mar 2025 15:49:11 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20src/game=20=E5=85=A8=E9=83=A8?= =?UTF-8?q?=E7=A7=BB=E5=85=A5=20monorepo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 9 +- packages-user/data-base/package.json | 6 + .../data-base/src}/game.ts | 6 +- packages-user/data-base/src/index.ts | 1 + packages-user/data-fallback/package.json | 8 + .../data-fallback/src}/battle.ts | 42 ++-- packages-user/data-fallback/src/index.ts | 0 packages-user/data-state/package.json | 9 + .../data-state/src}/enemy/damage.ts | 115 ++++------- packages-user/data-state/src/enemy/index.ts | 2 + .../data-state/src}/enemy/special.ts | 12 +- packages-user/data-state/src/index.ts | 3 + .../data-state/src/mechanism/index.ts | 1 + .../data-state/src}/mechanism/misc.ts | 6 +- .../data-state/src}/state/hero.ts | 0 packages-user/data-state/src/state/index.ts | 5 + .../data-state/src}/state/interface.ts | 0 .../data-state/src}/state/item.ts | 2 +- .../data-state/src}/state/move.ts | 14 +- .../data-state/src}/state/utils.ts | 0 packages-user/data-utils/package.json | 6 + packages-user/data-utils/src/index.ts | 1 + .../data-utils/src}/range.ts | 0 packages-user/entry-client/package.json | 21 ++ packages-user/entry-client/src/create.ts | 34 ++++ packages-user/entry-client/src/index.ts | 1 + packages-user/entry-data/package.json | 3 + packages-user/entry-data/src/index.ts | 5 + .../entry-data/src/mota.ts | 8 +- packages/client/package.json | 4 +- packages/client/src/index.ts | 2 - packages/common/src/index.ts | 1 + packages/common/src/utils.ts | 3 + packages/legacy-ui/src/data/settings.json | 62 ++++++ packages/legacy-ui/src/mark.ts | 4 +- packages/legacy-ui/src/panel/keyboard.vue | 6 +- packages/legacy-ui/src/preset/ui.ts | 2 +- packages/legacy-ui/src/tools/achievement.ts | 3 +- packages/legacy-ui/src/tools/book.tsx | 8 +- packages/legacy-ui/src/tools/fixed.ts | 4 +- packages/render-elements/src/damage.ts | 15 +- packages/render-vue/src/props.ts | 5 +- packages/types/package.json | 3 + packages/types/src/enemy.ts | 189 ++++++++++++++++++ packages/types/src/index.ts | 1 + pnpm-lock.yaml | 156 ++++++++++++--- pnpm-workspace.yaml | 16 +- script/build-game.ts | 40 ++++ script/build-packages.ts | 51 +++++ src/game/index.ts | 59 ------ src/module/action/move.ts | 2 +- tsconfig.json | 8 +- types/declaration/plugin.d.ts | 4 +- vite.config.ts | 8 +- 54 files changed, 722 insertions(+), 254 deletions(-) create mode 100644 packages-user/data-base/package.json rename {src/game => packages-user/data-base/src}/game.ts (97%) create mode 100644 packages-user/data-base/src/index.ts create mode 100644 packages-user/data-fallback/package.json rename {src/game/enemy => packages-user/data-fallback/src}/battle.ts (91%) create mode 100644 packages-user/data-fallback/src/index.ts create mode 100644 packages-user/data-state/package.json rename {src/game => packages-user/data-state/src}/enemy/damage.ts (94%) create mode 100644 packages-user/data-state/src/enemy/index.ts rename {src/game => packages-user/data-state/src}/enemy/special.ts (96%) create mode 100644 packages-user/data-state/src/index.ts create mode 100644 packages-user/data-state/src/mechanism/index.ts rename {src/game => packages-user/data-state/src}/mechanism/misc.ts (98%) rename {src/game => packages-user/data-state/src}/state/hero.ts (100%) create mode 100644 packages-user/data-state/src/state/index.ts rename {src/game => packages-user/data-state/src}/state/interface.ts (100%) rename {src/game => packages-user/data-state/src}/state/item.ts (98%) rename {src/game => packages-user/data-state/src}/state/move.ts (98%) rename {src/game => packages-user/data-state/src}/state/utils.ts (100%) create mode 100644 packages-user/data-utils/package.json create mode 100644 packages-user/data-utils/src/index.ts rename {src/game/util => packages-user/data-utils/src}/range.ts (100%) create mode 100644 packages-user/entry-client/package.json create mode 100644 packages-user/entry-client/src/create.ts create mode 100644 packages-user/entry-client/src/index.ts create mode 100644 packages-user/entry-data/package.json create mode 100644 packages-user/entry-data/src/index.ts rename src/game/system.ts => packages-user/entry-data/src/mota.ts (97%) create mode 100644 packages/common/src/utils.ts create mode 100644 packages/legacy-ui/src/data/settings.json create mode 100644 packages/types/package.json create mode 100644 packages/types/src/enemy.ts create mode 100644 packages/types/src/index.ts create mode 100644 script/build-game.ts create mode 100644 script/build-packages.ts delete mode 100644 src/game/index.ts diff --git a/package.json b/package.json index 415433e..8874eae 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,12 @@ "update": "tsx script/update.ts", "declare": "tsx script/declare.ts", "type": "vue-tsc --noEmit", - "lines": "tsx script/lines.ts" + "lines": "tsx script/lines.ts", + "build:packages": "vue-tsx --noEmit && tsx script/build-packages.ts", + "build:game": "vue-tsx --noEmit && tsx script/build-game.ts", + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" }, "dependencies": { "@ant-design/icons-vue": "^6.1.0", @@ -71,7 +76,7 @@ "typescript": "^5.5.4", "typescript-eslint": "^8.18.2", "unplugin-vue-components": "^0.22.12", - "vite": "^4.5.3", + "vite": "^4.5.9", "vite-plugin-dts": "^4.4.0", "vitepress": "^1.5.0", "vue-tsc": "^2.1.6", diff --git a/packages-user/data-base/package.json b/packages-user/data-base/package.json new file mode 100644 index 0000000..d09edf8 --- /dev/null +++ b/packages-user/data-base/package.json @@ -0,0 +1,6 @@ +{ + "name": "@user/data-base", + "dependencies": { + "@motajs/types": "workspace:*" + } +} \ No newline at end of file diff --git a/src/game/game.ts b/packages-user/data-base/src/game.ts similarity index 97% rename from src/game/game.ts rename to packages-user/data-base/src/game.ts index e4ee54d..9992b92 100644 --- a/src/game/game.ts +++ b/packages-user/data-base/src/game.ts @@ -1,5 +1,5 @@ import { EventEmitter } from 'eventemitter3'; -import type { DamageEnemy, EnemyCollection } from './enemy/damage'; +import { IDamageEnemy, IEnemyCollection } from '@motajs/types'; // ----- 加载事件 interface GameLoadEvent { @@ -82,7 +82,7 @@ export interface GameEvent { /** Emitted in project/functions.js moveOneStep */ moveOneStep: [x: number, y: number, floorId: FloorIds]; /** Emitted in src/game/enemy/battle.ts afterBattle */ - afterBattle: [enemy: DamageEnemy, x?: number, y?: number]; + afterBattle: [enemy: IDamageEnemy, x?: number, y?: number]; /** Emitted in libs/events.js changingFloor */ changingFloor: [floorId: FloorIds, heroLoc: Loc]; /** Emitted in libs/maps.js setBlock */ @@ -94,7 +94,7 @@ export interface GameEvent { oldBlock: AllNumbers ]; /** Emitted in game/enemy/damage.ts */ - enemyExtract: [col: EnemyCollection]; + enemyExtract: [col: IEnemyCollection]; /** Emitted in lib/events.js restart */ restart: []; /** Emitted in lib/maps.js setBgFgBlock */ diff --git a/packages-user/data-base/src/index.ts b/packages-user/data-base/src/index.ts new file mode 100644 index 0000000..4fb36a8 --- /dev/null +++ b/packages-user/data-base/src/index.ts @@ -0,0 +1 @@ +export * from './game'; diff --git a/packages-user/data-fallback/package.json b/packages-user/data-fallback/package.json new file mode 100644 index 0000000..870c54b --- /dev/null +++ b/packages-user/data-fallback/package.json @@ -0,0 +1,8 @@ +{ + "name": "@user/data-fallback", + "dependencies": { + "@motajs/legacy-common": "workspace:*", + "@user/data-state": "workspace:*", + "@user/data-base": "workspace:*" + } +} \ No newline at end of file diff --git a/src/game/enemy/battle.ts b/packages-user/data-fallback/src/battle.ts similarity index 91% rename from src/game/enemy/battle.ts rename to packages-user/data-fallback/src/battle.ts index 10fda1e..48b2723 100644 --- a/src/game/enemy/battle.ts +++ b/packages-user/data-fallback/src/battle.ts @@ -1,7 +1,14 @@ -import { DamageEnemy, ensureFloorDamage, getSingleEnemy } from './damage'; -import { findDir, has } from '../../plugin/game/utils'; -import { hook, loading } from '../game'; -import { HeroSkill, NightSpecial } from '../mechanism/misc'; +import { + DamageEnemy, + ensureFloorDamage, + getSingleEnemy, + getEnemy, + HeroSkill, + NightSpecial +} from '@user/data-state'; +import { hook, loading } from '@user/data-base'; +import { Patch, PatchClass } from '@motajs/legacy-common'; +import { isNil } from 'lodash-es'; export interface CurrentEnemy { enemy: DamageEnemy; @@ -9,22 +16,11 @@ export interface CurrentEnemy { onMapEnemy: DamageEnemy[]; } -export function getEnemy( - x: number, - y: number, - floorId: FloorIds = core.status.floorId -) { - const enemy = core.status.maps[floorId].enemy.get(x, y); - return enemy; -} - function init() { - core.enemys.canBattle = function canBattle( - x: number | DamageEnemy, - y: number, - floorId: FloorIds = core.status.floorId - ) { - const enemy = typeof x === 'number' ? getEnemy(x, y, floorId) : x; + const patch = new Patch(PatchClass.Enemys); + + patch.add('canBattle', function (x, y, floorId) { + const enemy = typeof x === 'number' ? getEnemy(x, y!, floorId) : x; if (!enemy) { throw new Error( `Cannot get enemy on x:${x}, y:${y}, floor: ${floorId}` @@ -33,7 +29,7 @@ function init() { const { damage } = enemy.calDamage(); return damage < core.status.hero.hp; - }; + }); core.events.battle = function battle( x: number | DamageEnemy, @@ -206,7 +202,7 @@ function init() { } // 如果是融化怪,需要特殊标记一下 - if (special.has(25) && has(x) && has(y)) { + if (special.has(25) && !isNil(x) && !isNil(y)) { flags[`melt_${floorId}`] ??= {}; flags[`melt_${floorId}`][`${x},${y}`] = enemy.info.melt; } @@ -231,7 +227,7 @@ function init() { const todo: MotaEvent = []; // 战后事件 - if (has(core.status.floorId)) { + if (!isNil(core.status.floorId)) { const loc = `${x},${y}` as LocString; todo.push( ...(core.floors[core.status.floorId].afterBattle[loc] ?? []) @@ -242,7 +238,7 @@ function init() { // 如果事件不为空,将其插入 if (todo.length > 0) core.insertAction(todo, x, y); - if (has(x) && has(y)) { + if (!isNil(x) && !isNil(y)) { core.drawAnimate(animate, x, y); core.removeBlock(x, y); } else core.drawHeroAnimate(animate); diff --git a/packages-user/data-fallback/src/index.ts b/packages-user/data-fallback/src/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages-user/data-state/package.json b/packages-user/data-state/package.json new file mode 100644 index 0000000..38049ca --- /dev/null +++ b/packages-user/data-state/package.json @@ -0,0 +1,9 @@ +{ + "name": "@user/data-state", + "dependencies": { + "@motajs/types": "workspace:*", + "@motajs/common": "workspace:*", + "@user/data-base": "workspace:*", + "@user/data-utils": "workspace:*" + } +} \ No newline at end of file diff --git a/src/game/enemy/damage.ts b/packages-user/data-state/src/enemy/damage.ts similarity index 94% rename from src/game/enemy/damage.ts rename to packages-user/data-state/src/enemy/damage.ts index 6696152..b768676 100644 --- a/src/game/enemy/damage.ts +++ b/packages-user/data-state/src/enemy/damage.ts @@ -1,75 +1,28 @@ -import { getHeroStatusOf, getHeroStatusOn } from '@/game/state/hero'; -import { Range } from '../util/range'; +import { getHeroStatusOf, getHeroStatusOn } from '../state/hero'; +import { Range } from '@user/data-utils'; import { ensureArray, has, manhattan } from '@/plugin/game/utils'; import EventEmitter from 'eventemitter3'; -import { hook } from '../game'; +import { hook } from '@user/data-base'; import { HeroSkill, NightSpecial } from '../mechanism/misc'; +import { + EnemyInfo, + DamageInfo, + DamageDelta, + HaloData, + CriticalDamageDelta, + MapDamage, + HaloFn, + IEnemyCollection, + IDamageEnemy, + HaloType +} from '@motajs/types'; // todo: 光环划分优先级,从而可以实现光环的多级运算 -interface HaloType { - square: { - x: number; - y: number; - d: number; - }; - manhattan: { - x: number; - y: number; - d: number; - }; -} - -export interface EnemyInfo extends Partial> { - atk: number; - def: number; - hp: number; - special: Set; - damageDecline: number; - atkBuff_: number; - defBuff_: number; - hpBuff_: number; - enemy: Enemy; - x?: number; - y?: number; - floorId?: FloorIds; +export interface UserEnemyInfo extends EnemyInfo { togetherNum?: number; } -interface DamageInfo { - damage: number; - /** 自动切换技能时使用的技能 */ - skill?: number; -} - -export interface MapDamage { - damage: number; - type: Set; - mockery?: LocArr[]; - hunt?: [x: number, y: number, dir: Dir][]; -} - -interface HaloData { - type: T; - data: HaloType[T]; - special: number; - from?: DamageEnemy; -} - -interface DamageDelta { - /** 跟最小伤害值的减伤 */ - delta: number; - damage: number; - info: DamageInfo; -} - -interface CriticalDamageDelta extends Omit { - /** 勇士的攻击增量 */ - atkDelta: number; -} - -type HaloFn = (info: EnemyInfo, enemy: EnemyInfo) => void; - /** 光环属性 */ export const haloSpecials: Set = new Set([ 8, 21, 25, 26, 27, 29, 31, 32 @@ -105,7 +58,10 @@ interface EnemyCollectionEvent { calculated: []; } -export class EnemyCollection extends EventEmitter { +export class EnemyCollection + extends EventEmitter + implements IEnemyCollection +{ floorId: FloorIds; list: Map = new Map(); @@ -130,7 +86,7 @@ export class EnemyCollection extends EventEmitter { get(x: number, y: number) { const index = x + y * this.width; - return this.list.get(index); + return this.list.get(index) ?? null; } /** @@ -242,12 +198,12 @@ export class EnemyCollection extends EventEmitter { } } -export class DamageEnemy { - id: T; +export class DamageEnemy implements IDamageEnemy { + id: EnemyIds; x?: number; y?: number; floorId?: FloorIds; - enemy: Enemy; + enemy: Enemy; col?: EnemyCollection; /** @@ -255,7 +211,7 @@ export class DamageEnemy { * 属性计算流程:预平衡光环(即计算加光环的光环怪的光环) -> 计算怪物在没有光环下的属性 * -> provide inject 光环 -> 计算怪物的光环加成 -> 计算完毕 */ - info!: EnemyInfo; + info!: UserEnemyInfo; /** 向其他怪提供过的光环 */ providedHalo: Set = new Set(); @@ -267,7 +223,7 @@ export class DamageEnemy { progress: number = 0; constructor( - enemy: Enemy, + enemy: Enemy, x?: number, y?: number, floorId?: FloorIds, @@ -426,7 +382,7 @@ export class DamageEnemy { // 这一句必须放到applyHalo之前 this.providedHalo.add(29); - const halo = (e: EnemyInfo, enemy: EnemyInfo) => { + const halo = (e: UserEnemyInfo, enemy: UserEnemyInfo) => { const s = enemy.specialHalo!; for (const spe of s) { @@ -489,7 +445,7 @@ export class DamageEnemy { 'square', { x: this.x, y: this.y, d: 5 }, this, - (e, enemy) => { + (e: UserEnemyInfo, enemy) => { if ( e.special.has(8) && (e.x !== this.x || this.y !== e.y) @@ -620,7 +576,7 @@ export class DamageEnemy { /** * 接受其他怪的光环 */ - injectHalo(halo: HaloFn, enemy: EnemyInfo) { + injectHalo(halo: HaloFn, enemy: UserEnemyInfo) { halo(this.info, enemy); } @@ -769,7 +725,7 @@ export class DamageEnemy { if (type) damage[loc].type.add(type); } - private calEnemyDamageOf(hero: Partial, enemy: EnemyInfo) { + private calEnemyDamageOf(hero: Partial, enemy: UserEnemyInfo) { const status = getHeroStatusOf(hero, realStatus, this.floorId); let damage = calDamageWith(enemy, status) ?? Infinity; let bestSkill = -1; @@ -991,7 +947,7 @@ const skills: HeroSkill.Skill[] = [HeroSkill.Blade, HeroSkill.Shield]; * @param hero 勇士信息 */ export function calDamageWith( - info: EnemyInfo, + info: UserEnemyInfo, hero: Partial ): number | null { const { hp, mdef } = core.status.hero; @@ -1112,6 +1068,15 @@ export function getSingleEnemy(id: EnemyIds) { return enemy; } +export function getEnemy( + x: number, + y: number, + floorId: FloorIds = core.status.floorId +) { + const enemy = core.status.maps[floorId].enemy.get(x, y); + return enemy; +} + declare global { interface Floor { enemy: EnemyCollection; diff --git a/packages-user/data-state/src/enemy/index.ts b/packages-user/data-state/src/enemy/index.ts new file mode 100644 index 0000000..b34e38d --- /dev/null +++ b/packages-user/data-state/src/enemy/index.ts @@ -0,0 +1,2 @@ +export * from './damage'; +export * from './special'; diff --git a/src/game/enemy/special.ts b/packages-user/data-state/src/enemy/special.ts similarity index 96% rename from src/game/enemy/special.ts rename to packages-user/data-state/src/enemy/special.ts index 7b6bc21..60e1414 100644 --- a/src/game/enemy/special.ts +++ b/packages-user/data-state/src/enemy/special.ts @@ -1,16 +1,16 @@ -import { getHeroStatusOn } from '@/game/state/hero'; -import { EnemyInfo } from './damage'; +import { getHeroStatusOn } from '../state/hero'; +import { UserEnemyInfo } from './damage'; export interface SpecialDeclaration { code: number; - name: string | ((enemy: EnemyInfo) => string); - desc: string | ((enemy: EnemyInfo) => string); + name: string | ((enemy: UserEnemyInfo) => string); + desc: string | ((enemy: UserEnemyInfo) => string); color: string; } const fromFunc = ( - func: string | ((enemy: EnemyInfo) => string), - enemy: EnemyInfo + func: string | ((enemy: UserEnemyInfo) => string), + enemy: UserEnemyInfo ) => { return typeof func === 'string' ? func : func(enemy); }; diff --git a/packages-user/data-state/src/index.ts b/packages-user/data-state/src/index.ts new file mode 100644 index 0000000..572daa1 --- /dev/null +++ b/packages-user/data-state/src/index.ts @@ -0,0 +1,3 @@ +export * from './enemy'; +export * from './mechanism'; +export * from './state'; diff --git a/packages-user/data-state/src/mechanism/index.ts b/packages-user/data-state/src/mechanism/index.ts new file mode 100644 index 0000000..587b892 --- /dev/null +++ b/packages-user/data-state/src/mechanism/index.ts @@ -0,0 +1 @@ +export * from './misc'; diff --git a/src/game/mechanism/misc.ts b/packages-user/data-state/src/mechanism/misc.ts similarity index 98% rename from src/game/mechanism/misc.ts rename to packages-user/data-state/src/mechanism/misc.ts index 1745e6f..12d91f0 100644 --- a/src/game/mechanism/misc.ts +++ b/packages-user/data-state/src/mechanism/misc.ts @@ -1,5 +1,5 @@ import { backDir, has } from '@/plugin/game/utils'; -import { loading } from '../game'; +import { loading } from '@user/data-base'; import type { LayerDoorAnimate } from '@motajs/render'; import { getSkillLevel } from '@/plugin/game/skillTree'; @@ -210,9 +210,9 @@ export namespace BluePalace { core.lockControl(); core.playSound('door.opus'); - const Adapter = Mota.require('module', 'Render').RenderAdapter; + const Adapter = Mota.require('@motajs/render').RenderAdapter; const adapter = Adapter.get('door-animate'); - const texture = Mota.require('module', 'Render').texture; + const texture = Mota.require('@motajs/render').texture; if (adapter) { Promise.all( toConvert.map(v => { diff --git a/src/game/state/hero.ts b/packages-user/data-state/src/state/hero.ts similarity index 100% rename from src/game/state/hero.ts rename to packages-user/data-state/src/state/hero.ts diff --git a/packages-user/data-state/src/state/index.ts b/packages-user/data-state/src/state/index.ts new file mode 100644 index 0000000..3c86064 --- /dev/null +++ b/packages-user/data-state/src/state/index.ts @@ -0,0 +1,5 @@ +export * from './hero'; +export * from './interface'; +export * from './item'; +export * from './move'; +export * from './utils'; diff --git a/src/game/state/interface.ts b/packages-user/data-state/src/state/interface.ts similarity index 100% rename from src/game/state/interface.ts rename to packages-user/data-state/src/state/interface.ts diff --git a/src/game/state/item.ts b/packages-user/data-state/src/state/item.ts similarity index 98% rename from src/game/state/item.ts rename to packages-user/data-state/src/state/item.ts index 259405b..e09a14e 100644 --- a/src/game/state/item.ts +++ b/packages-user/data-state/src/state/item.ts @@ -1,5 +1,5 @@ import EventEmitter from 'eventemitter3'; -import { loading } from '../game'; +import { loading } from '@user/data-base'; type EffectFn = () => void; type CanUseEffectFn = () => boolean; diff --git a/src/game/state/move.ts b/packages-user/data-state/src/state/move.ts similarity index 98% rename from src/game/state/move.ts rename to packages-user/data-state/src/state/move.ts index 10d4175..5b3ec02 100644 --- a/src/game/state/move.ts +++ b/packages-user/data-state/src/state/move.ts @@ -1,6 +1,6 @@ import EventEmitter from 'eventemitter3'; import { backDir, checkCanMoveExtended, toDir } from './utils'; -import { loading } from '../game'; +import { loading } from '@user/data-base'; import type { RenderAdapter, HeroRenderer, @@ -13,7 +13,7 @@ import type { } from '@motajs/render'; import type { HeroKeyMover } from '@/module/action/move'; import { BluePalace, MiscData } from '../mechanism/misc'; -import { sleep } from 'mutate-animate'; +import { sleep } from '@motajs/common'; interface MoveStepDir { type: 'dir'; @@ -316,7 +316,7 @@ export class BlockMover extends ObjectMoverBase { this.blockNum = blockNum; Mota.r(() => { - const { Layer } = Mota.require('module', 'Render'); + const { Layer } = Mota.require('@motajs/render'); const r = Layer.getMovingRenderable(blockNum, this.x, this.y); if (r) { @@ -877,7 +877,7 @@ export class HeroMover extends ObjectMoverBase { const adapter = HeroMover.adapter; const viewport = HeroMover.viewport; if (!adapter || !viewport) return; - const MotaRenderer = Mota.require('module', 'Render').MotaRenderer; + const MotaRenderer = Mota.require('@motajs/render').MotaRenderer; const render = MotaRenderer.get('render-main'); const group = render?.getElementById('layer-loop') as LayerGroup; const layer = group?.getLayer('event'); @@ -939,8 +939,8 @@ export const heroMoveCollection: HeroMoveCollection = { loading.once('coreInit', () => { // 注册按键操作 Mota.r(() => { - const { HeroKeyMover } = Mota.require('module', 'Action'); - const gameKey = Mota.require('var', 'gameKey'); + const { HeroKeyMover } = Mota.require('@motajs/system-action'); + const { gameKey } = Mota.require('@motajs/system-action'); const keyMover = new HeroKeyMover(gameKey, heroMover); heroMoveCollection.keyMover = keyMover; }); @@ -949,7 +949,7 @@ loading.once('coreInit', () => { // Adapter初始化 loading.once('coreInit', () => { if (main.replayChecking || main.mode === 'editor') return; - const Adapter = Mota.require('module', 'Render').RenderAdapter; + const Adapter = Mota.require('@motajs/render').RenderAdapter; const adapter = Adapter.get('hero-adapter'); const viewport = Adapter.get('viewport'); const layerAdapter = Adapter.get('layer'); diff --git a/src/game/state/utils.ts b/packages-user/data-state/src/state/utils.ts similarity index 100% rename from src/game/state/utils.ts rename to packages-user/data-state/src/state/utils.ts diff --git a/packages-user/data-utils/package.json b/packages-user/data-utils/package.json new file mode 100644 index 0000000..2a42245 --- /dev/null +++ b/packages-user/data-utils/package.json @@ -0,0 +1,6 @@ +{ + "name": "@user/data-utils", + "dependencies": { + "@user/data-base": "workspace:*" + } +} \ No newline at end of file diff --git a/packages-user/data-utils/src/index.ts b/packages-user/data-utils/src/index.ts new file mode 100644 index 0000000..f298acd --- /dev/null +++ b/packages-user/data-utils/src/index.ts @@ -0,0 +1 @@ +export * from './range'; diff --git a/src/game/util/range.ts b/packages-user/data-utils/src/range.ts similarity index 100% rename from src/game/util/range.ts rename to packages-user/data-utils/src/range.ts diff --git a/packages-user/entry-client/package.json b/packages-user/entry-client/package.json new file mode 100644 index 0000000..97707e0 --- /dev/null +++ b/packages-user/entry-client/package.json @@ -0,0 +1,21 @@ +{ + "name": "@motajs/entry-client", + "dependencies": { + "@motajs/client": "workspace:*", + "@motajs/client-base": "workspace:*", + "@motajs/common": "workspace:*", + "@motajs/render": "workspace:*", + "@motajs/render-core": "workspace:*", + "@motajs/render-elements": "workspace:*", + "@motajs/render-style": "workspace:*", + "@motajs/render-vue": "workspace:*", + "@motajs/system": "workspace:*", + "@motajs/system-ui": "workspace:*", + "@motajs/system-action": "workspace:*", + "@motajs/legacy-common": "workspace:*", + "@motajs/legacy-client": "workspace:*", + "@motajs/legacy-data": "workspace:*", + "@motajs/legacy-ui": "workspace:*", + "@motajs/legacy-system": "workspace:*" + } +} \ No newline at end of file diff --git a/packages-user/entry-client/src/create.ts b/packages-user/entry-client/src/create.ts new file mode 100644 index 0000000..cef727a --- /dev/null +++ b/packages-user/entry-client/src/create.ts @@ -0,0 +1,34 @@ +import { Mota } from '@user/entry-data'; +import * as Client from '@motajs/client'; +import * as ClientBase from '@motajs/client-base'; +import * as Common from '@motajs/common'; +import * as LegacyClient from '@motajs/legacy-client'; +import * as LegacyCommon from '@motajs/legacy-common'; +import * as LegacySystem from '@motajs/legacy-system'; +import * as LegacyUI from '@motajs/legacy-ui'; +import * as Render from '@motajs/render'; +import * as RenderCore from '@motajs/render-core'; +import * as RenderElements from '@motajs/render-elements'; +import * as RenderStyle from '@motajs/render-style'; +import * as RenderVue from '@motajs/render-vue'; +import * as System from '@motajs/system'; +import * as SystemAction from '@motajs/system-action'; +import * as SystemUI from '@motajs/system-ui'; + +export function create() { + Mota.register('@motajs/client', Client); + Mota.register('@motajs/client-base', ClientBase); + Mota.register('@motajs/common', Common); + Mota.register('@motajs/legacy-client', LegacyClient); + Mota.register('@motajs/legacy-common', LegacyCommon); + Mota.register('@motajs/legacy-system', LegacySystem); + Mota.register('@motajs/legacy-ui', LegacyUI); + Mota.register('@motajs/render', Render); + Mota.register('@motajs/render-core', RenderCore); + Mota.register('@motajs/render-elements', RenderElements); + Mota.register('@motajs/render-style', RenderStyle); + Mota.register('@motajs/render-vue', RenderVue); + Mota.register('@motajs/system', System); + Mota.register('@motajs/system-action', SystemAction); + Mota.register('@motajs/system-ui', SystemUI); +} diff --git a/packages-user/entry-client/src/index.ts b/packages-user/entry-client/src/index.ts new file mode 100644 index 0000000..1e03cce --- /dev/null +++ b/packages-user/entry-client/src/index.ts @@ -0,0 +1 @@ +export * from './create'; diff --git a/packages-user/entry-data/package.json b/packages-user/entry-data/package.json new file mode 100644 index 0000000..35b3d3e --- /dev/null +++ b/packages-user/entry-data/package.json @@ -0,0 +1,3 @@ +{ + "name": "@user/entry-data" +} \ No newline at end of file diff --git a/packages-user/entry-data/src/index.ts b/packages-user/entry-data/src/index.ts new file mode 100644 index 0000000..2d3bd59 --- /dev/null +++ b/packages-user/entry-data/src/index.ts @@ -0,0 +1,5 @@ +import { createMota } from './mota'; + +createMota(); + +export * from './mota'; diff --git a/src/game/system.ts b/packages-user/entry-data/src/mota.ts similarity index 97% rename from src/game/system.ts rename to packages-user/entry-data/src/mota.ts index c98d476..2948676 100644 --- a/src/game/system.ts +++ b/packages-user/entry-data/src/mota.ts @@ -67,7 +67,7 @@ export interface IMota { /** * 样板接口系统,通过 Mota 获取到样板的核心功能 */ -class Mota implements IMota { +class MotaSystem implements IMota { private modules: Record = {}; r = r; @@ -137,4 +137,8 @@ declare global { } } -window.Mota = new Mota(); +export const Mota = new MotaSystem(); + +export function createMota() { + window.Mota = Mota; +} diff --git a/packages/client/package.json b/packages/client/package.json index 879c2ec..6a97b6e 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,8 +1,6 @@ { "name": "@motajs/client", "dependencies": { - "@motajs/render": "workspace:*", - "@motajs/client-base": "workspace:*", - "@motajs/system": "workspace:*" + "@motajs/client-base": "workspace:*" } } \ No newline at end of file diff --git a/packages/client/src/index.ts b/packages/client/src/index.ts index 98a34ec..ef669d9 100644 --- a/packages/client/src/index.ts +++ b/packages/client/src/index.ts @@ -1,3 +1 @@ export * as Base from '@motajs/client-base'; -export * as Render from '@motajs/render'; -export * as System from '@motajs/system'; diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 1ff09ef..8ff45f4 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -1 +1,2 @@ export * from './logger'; +export * from './utils'; diff --git a/packages/common/src/utils.ts b/packages/common/src/utils.ts new file mode 100644 index 0000000..b25856b --- /dev/null +++ b/packages/common/src/utils.ts @@ -0,0 +1,3 @@ +export function sleep(time: number) { + return new Promise(res => setTimeout(res, time)); +} diff --git a/packages/legacy-ui/src/data/settings.json b/packages/legacy-ui/src/data/settings.json new file mode 100644 index 0000000..dc6c1f8 --- /dev/null +++ b/packages/legacy-ui/src/data/settings.json @@ -0,0 +1,62 @@ +{ + "screen": { + "fullscreen": [ + "是否全屏进行游戏,全屏后按ESC退出全屏,开启后将不能通过按ESC开启系统设置菜单,", + "请按下方的按钮打开。进入或退出全屏后请存读档一下,以解决一部分绘制问题。" + ], + "halo": ["开启后,会在地图上显示范围光环。"], + "itemDetail": ["是否在地图上显示宝石血瓶装备等增加的属性值"], + "transition": [ + "是否展示当一个ui界面,如怪物手册等的打开与关闭时的动画。当此项开启时,", + "所有界面被打开或关闭时都会展示动画,否则会直接展示出来" + ], + "fontSize": [ + "在各种 ui 界面中显示的文字大小,范围为 2 - 48。注意,字体过大可能会引起 ui 布局发生错误" + ], + "criticalGem": ["临界是否显示为在当前地图要吃的宝石数"] + }, + "action": { + "autoSkill": [ + "开启后,打怪物的时候会自动选择伤害最低的技能。同时显伤也会显示此状态下的伤害,", + "临界也会考虑技能在内" + ], + "fixed": [ + "开启后,当鼠标移动到怪物上时,会以盒子的形式展示该点的怪物信息。手机端此功能无效。", + "
", + "
", + "注:当鼠标移动到怪物上时,经过200毫秒才会显示信息,防止误操作。" + ], + "hotkey": ["设置游戏中会用到的一些快捷键"], + "toolbar": [ + "允许你在工具栏上自定义按钮,包括使用道具、开关技能、按下某个按键等。", + "推荐手机进行一些设置" + ] + }, + "utils": { + "betterLoad": [ + "试验性功能", + "
", + "开启后游戏将对加载进行优化,缩短进入游戏时的加载时长,而在游戏中对资源进行部分性按需加载,从而对加载进行优化。", + "该设置不会影响你的正常游戏,但如果网络环境较差,可能会导致部分楼层转换时间明显变长。", + "
", + "
", + "注:修改后刷新页面起效。" + ], + "autoScale": [ + "开启后,每次进入游戏时会自动缩放游戏画面至合适值。该项只对电脑端有效。", + "
", + "
", + "缩放原则如下:", + "
", + "1. 首先尝试缩放至最大缩放比例", + "
", + "2. 如果缩放后游戏画面高度高于页面高度的95%,那么缩小一个缩放比例,否则保持最大比例" + ] + }, + "fx": { + "paraLight": [ + "是否开启野外的平行光阴影,在野外将会显示平行光阴影,模拟太阳光,拥有不错的视觉效果" + ], + "frag": ["开启后,在打败怪物后会触发怪物碎裂特效。"] + } +} diff --git a/packages/legacy-ui/src/mark.ts b/packages/legacy-ui/src/mark.ts index afbc9f3..65a1a34 100644 --- a/packages/legacy-ui/src/mark.ts +++ b/packages/legacy-ui/src/mark.ts @@ -1,11 +1,11 @@ +import { IDamageEnemy } from '@motajs/types'; import { fixedUi } from './preset/ui'; -import type { DamageEnemy } from '@/game/enemy/damage'; import { tip } from './utils'; import { ref, Ref } from 'vue'; export interface MarkInfo { id: T; - enemy: DamageEnemy; + enemy: IDamageEnemy; /** * 提示模式,从低到高位数分别为: * 1. 踩临界时 diff --git a/packages/legacy-ui/src/panel/keyboard.vue b/packages/legacy-ui/src/panel/keyboard.vue index 2ea40fe..b27e354 100644 --- a/packages/legacy-ui/src/panel/keyboard.vue +++ b/packages/legacy-ui/src/panel/keyboard.vue @@ -21,10 +21,8 @@