fix: 迁移过程中产生的所有报错

This commit is contained in:
unanmed 2025-03-09 17:38:29 +08:00
parent 0679bbb1a5
commit 4fda246a9a
72 changed files with 225 additions and 189 deletions

View File

@ -1,3 +1,8 @@
{
"name": "@user/client-modules"
"name": "@user/client-modules",
"dependencies": {
"@motajs/render": "workspace:*",
"@motajs/legacy-ui": "workspace:*",
"@user/legacy-plugin-client": "workspace:*"
}
}

View File

@ -0,0 +1 @@
export * from './move';

View File

@ -258,7 +258,7 @@ export class BgmController<
export const bgmController = new BgmController<BgmIds>(audioPlayer);
export function loadAllBgm() {
const loading = Mota.require('var', 'loading');
const { loading } = Mota.require('@user/data-base');
loading.once('coreInit', () => {
const data = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d;
for (const bgm of data.main.bgms) {

View File

@ -7,8 +7,4 @@ export function patchAll() {
patchAudio();
patchWeather();
patchUI();
const loading = Mota.require('var', 'loading');
loading.once('coreInit', () => {
Patch.patchAll();
});
}

View File

@ -2,6 +2,7 @@ import { patchAll } from './fallback';
patchAll();
export * from './action';
export * from './weather';
export * from './audio';
export * from './loader';

View File

@ -8,17 +8,21 @@ import {
import { logger } from '@motajs/common';
import EventEmitter from 'eventemitter3';
import { isNil } from 'lodash-es';
import { LayerGroupFloorBinder } from './floor';
import {
BlockCacher,
CanvasCacheItem,
ICanvasCacheItem,
calNeedRenderOf,
ILayerGroupRenderExtends,
Layer,
LayerGroup
} from './layer';
import { BlockCacher, CanvasCacheItem, ICanvasCacheItem } from './block';
LayerGroup,
LayerGroupFloorBinder,
tagMap
} from '@motajs/render';
import { IDamageEnemy, IEnemyCollection, MapDamage } from '@motajs/types';
import { UserEnemyInfo } from '@user/data-state';
const ensureFloorDamage = Mota.require('fn', 'ensureFloorDamage');
const { ensureFloorDamage } = Mota.require('@user/data-state');
/**
*
@ -323,7 +327,7 @@ export class Damage extends RenderItem<EDamageEvent> {
const y = enemy.y!;
const { damage } = enemy.calDamage();
const cri = enemy.calCritical(1)[0]?.atkDelta ?? Infinity;
const real = enemy.getRealInfo();
const real = enemy.getRealInfo() as UserEnemyInfo;
const dam1: DamageRenderable = {
align: 'left',
@ -587,4 +591,9 @@ export class Damage extends RenderItem<EDamageEvent> {
}
}
// 注册为内部元素
tagMap.register<EDamageEvent, Damage>('damage', (_0, _1, _props) => {
return new Damage();
});
// const adapter = new RenderAdapter<Damage>('damage');

View File

@ -3,7 +3,7 @@ import { defineComponent } from 'vue';
import { UIController } from '@motajs/system-ui';
import { mainSceneUI } from './ui/main';
import { MAIN_HEIGHT, MAIN_WIDTH } from './shared';
import { TextboxStore } from './components';
import { hook } from '@user/data-base';
export function create() {
const main = new MotaRenderer();
@ -23,21 +23,17 @@ export function create() {
main.hide();
createApp(App).mount(main);
Mota.require('var', 'hook').on('reset', () => {
hook.on('reset', () => {
main.show();
});
Mota.require('var', 'hook').on('restart', () => {
hook.on('restart', () => {
main.hide();
});
console.log(main);
}
Mota.register('module', 'MainUI', {
TextboxStore
});
export * from './components';
export * from './ui';
export * from './use';

View File

@ -1,13 +1,13 @@
import { logger } from '@motajs/common';
import { mainSetting } from '@motajs/legacy-ui';
import {
Damage,
DamageRenderable,
FloorDamageExtends,
LayerGroupFloorBinder,
ILayerGroupRenderExtends,
LayerGroup
} from '@motajs/render';
import { hook } from '@user/data-base';
import { ItemState } from '@user/data-state';
import { Damage, DamageRenderable, FloorDamageExtends } from './damage';
interface ItemDetailData {
x: number;
@ -21,8 +21,7 @@ interface ItemData {
y: number;
}
const ItemState = Mota.require('module', 'State').ItemState;
Mota.require('var', 'hook').on('setBlock', (x, y, floorId, block) => {
hook.on('setBlock', (x, y, floorId, block) => {
FloorItemDetail.listened.forEach(v => {
v.setBlock(block, x, y);
});
@ -199,8 +198,7 @@ export class FloorItemDetail implements ILayerGroupRenderExtends {
return;
}
// @ts-ignore
ItemState.item(id)?.itemEffectFn();
ItemState.item(id)?.itemEffectFn?.();
detail?.set(index, { x, y, diff });
});
});

View File

@ -1,22 +1,23 @@
import {
Container,
FloorDamageExtends,
LayerGroupFloorBinder,
FloorLayer,
LayerGroup,
FloorViewport,
MotaRenderer
} from '@motajs/render';
import { FloorItemDetail } from '@/plugin/fx/itemDetail';
import { hook } from '@user/data-base';
import { MiscData } from '@user/data-state';
import { FloorDamageExtends } from './damage';
import { FloorItemDetail } from './itemDetail';
const loopMaps = Mota.require('module', 'Mechanism').MiscData.loopMaps;
const loopMaps = MiscData.loopMaps;
let loopLayer: LayerGroup;
let show: boolean = false;
/** 循环式地图中更新视角的委托ticker */
let delegation: number = -1;
const hook = Mota.require('var', 'hook');
hook.on('changingFloor', (floorId, heroLoc) => {
enableLoopMapElement(floorId);
});

View File

@ -1,7 +1,6 @@
import { LayerShadowExtends } from '@/core/fx/shadow';
import { LayerShadowExtends } from '@motajs/legacy-ui';
import {
ILayerGroupRenderExtends,
FloorDamageExtends,
LayerGroupAnimate,
FloorViewport,
ILayerRenderExtends,
@ -11,13 +10,14 @@ import {
LayerGroup,
Font
} from '@motajs/render';
import { WeatherController } from '@/module/weather';
import { FloorChange } from '@/plugin/fallback';
import { LayerGroupFilter } from '@/plugin/fx/gameCanvas';
import { LayerGroupHalo } from '@/plugin/fx/halo';
import { FloorItemDetail } from '@/plugin/fx/itemDetail';
import { PopText } from '@/plugin/fx/pop';
import { LayerGroupPortal } from '@/plugin/fx/portal';
import { WeatherController } from '../../weather';
import {
FloorChange,
LayerGroupFilter,
LayerGroupHalo,
LayerGroupPortal,
PopText
} from '@user/legacy-plugin-client';
import { defineComponent, onMounted, reactive, ref } from 'vue';
import { Textbox, Tip } from '../components';
import { GameUI, UIController } from '@motajs/system-ui';
@ -35,6 +35,11 @@ import {
} from './statusBar';
import { onLoaded } from '../use';
import { ReplayingStatus } from './toolbar';
import { getHeroStatusOn, HeroSkill, NightSpecial } from '@user/data-state';
import { jumpIgnoreFloor } from '@user/legacy-plugin-data';
import { hook } from '@user/data-base';
import { FloorDamageExtends } from '../damage';
import { FloorItemDetail } from '../itemDetail';
const MainScene = defineComponent(() => {
const layerGroupExtends: ILayerGroupRenderExtends[] = [
@ -112,8 +117,6 @@ const MainScene = defineComponent(() => {
night: 0
});
const { getHeroStatusOn } = Mota.requireAll('fn');
const updateStatus = () => {
if (!core.status || !core.status.hero || !core.status.floorId) return;
hideStatus.value = core.getFlag('hideStatusBar', false);
@ -135,7 +138,6 @@ const MainScene = defineComponent(() => {
leftStatus.exAtk = getHeroStatusOn('mana');
leftStatus.magicDef = getHeroStatusOn('magicDef');
const { HeroSkill, NightSpecial } = Mota.require('module', 'Mechanism');
rightStatus.autoSkill = HeroSkill.getAutoSkill();
rightStatus.skillName = HeroSkill.getSkillName();
rightStatus.skillDesc = HeroSkill.getSkillDesc();
@ -148,7 +150,7 @@ const MainScene = defineComponent(() => {
replayStatus.played = totalList.length - toReplay.length;
replayStatus.total = totalList.length;
if (HeroSkill.learnedSkill(HeroSkill.Jump)) {
if (Mota.Plugin.require('skill_g').jumpIgnoreFloor.has(floor)) {
if (jumpIgnoreFloor.has(floor)) {
rightStatus.jumpCount = -2;
} else {
rightStatus.jumpCount = 3 - (flags[`jump_${floor}`] ?? 0);
@ -168,7 +170,7 @@ const MainScene = defineComponent(() => {
loaded.value = true;
});
Mota.require('var', 'hook').on('statusBarUpdate', updateStatus);
hook.on('statusBarUpdate', updateStatus);
return () => (
<container id="main-scene" width={MAIN_WIDTH} height={MAIN_HEIGHT}>

View File

@ -14,7 +14,7 @@ import { mainUi } from '@motajs/legacy-ui';
import { gameKey } from '@motajs/system-action';
import { generateKeyboardEvent } from '@motajs/system-action';
import { getVitualKeyOnce } from '@motajs/legacy-ui';
import { getAllSavesData, getSaveData } from '@/module/utils';
import { getAllSavesData, getSaveData } from '../../utils';
export interface SettingsProps extends Partial<ChoicesProps>, UIComponentProps {
loc: ElementLocator;
@ -410,7 +410,9 @@ export const DownloadSaveSelect = defineComponent<SettingsProps>(props => {
{ text: '请等待处理完毕' }
);
core.download(
`${core.firstData.name}_${core.formatDate2(new Date())}.h5save`,
`${core.firstData.name}_${core.formatDate2(
new Date()
)}.h5save`,
data
);
}
@ -426,7 +428,9 @@ export const DownloadSaveSelect = defineComponent<SettingsProps>(props => {
if (confirm) {
const data = await getSaveData(core.saves.saveIndex);
core.download(
`${core.firstData.name}_${core.formatDate2(new Date())}.h5save`,
`${core.firstData.name}_${core.formatDate2(
new Date()
)}.h5save`,
data
);
}

View File

@ -18,6 +18,7 @@ import {
ReplayingStatus,
ReplayingToolbar
} from './toolbar';
import { HeroSkill } from '@user/data-state';
export interface ILeftHeroStatus {
hp: number;
@ -275,7 +276,6 @@ export const RightStatusBar = defineComponent<StatusBarProps<IRightHeroStatus>>(
};
const changeAutoSkill = () => {
const { HeroSkill } = Mota.require('module', 'Mechanism');
const auto = !s.autoSkill;
HeroSkill.setAutoSkill(auto);
core.status.route.push(`set:autoSkill:${auto}`);

View File

@ -1,3 +1,4 @@
import { loading } from '@user/data-base';
import { TimingFn, Transition } from 'mutate-animate';
import {
ComponentInternalInstance,
@ -59,7 +60,6 @@ export function onOrientationChange(hook: OrientationHook) {
* @param hook
*/
export function onLoaded(hook: () => void) {
const loading = Mota.require('var', 'loading');
if (!loading.loaded) {
loading.once('loaded', hook);
} else {

View File

@ -10,6 +10,7 @@ import {
MotaOffscreenCanvas2D
} from '@motajs/render';
import { IWeather } from './weather';
import { loading } from '@user/data-base';
const snowVs = /* glsl */ `
in vec2 a_snowVertex;
@ -105,7 +106,7 @@ void main() {
/** 雨滴顶点坐标 */
const vertex = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]);
Mota.require('var', 'loading').once('coreInit', () => {
loading.once('coreInit', () => {
const shader = new SnowShader();
const gl = shader.gl;
shader.size(480, 480);

View File

@ -107,6 +107,8 @@ export interface GameEvent {
];
/** Emitted in lib/control.js */
replayStatus: [replaying: boolean];
/** Emitted in project/functions.js */
loadData: [];
}
export const hook = new EventEmitter<GameEvent>();

View File

@ -13,7 +13,8 @@ import {
HaloFn,
IEnemyCollection,
IDamageEnemy,
HaloType
HaloType,
IEnemyCollectionEvent
} from '@motajs/types';
// todo: 光环划分优先级,从而可以实现光环的多级运算
@ -52,13 +53,8 @@ specialValue
.set(31, ['hpHalo'])
.set(32, ['assimilateRange']);
interface EnemyCollectionEvent {
extract: [];
calculated: [];
}
export class EnemyCollection
extends EventEmitter<EnemyCollectionEvent>
extends EventEmitter<IEnemyCollectionEvent>
implements IEnemyCollection
{
floorId: FloorIds;

View File

@ -233,7 +233,7 @@ export function getSkillConsume(skill: number) {
export function openTree() {
if (main.replayChecking) return;
Mota.require('var', 'mainUi').open('skillTree');
Mota.require('@motajs/legacy-ui').mainUi.open('skillTree');
}
/**

View File

@ -59,7 +59,7 @@ function getRealStatus(
name: keyof HeroStatus | 'all' | (keyof HeroStatus)[],
floorId: FloorIds = core.status.floorId
): any {
const { getSkillLevel } = Mota.Plugin.require('skillTree_g');
const { getSkillLevel } = Mota.require('@user/legacy-plugin-data');
if (name instanceof Array) {
const res: any = {};
name.forEach(v => {

View File

@ -11,7 +11,7 @@ import type {
LayerMovingRenderable,
LayerFloorBinder
} from '@motajs/render';
import type { HeroKeyMover } from '@/module/action/move';
import type { HeroKeyMover } from '@user/client-modules';
import { BluePalace, MiscData } from '../mechanism/misc';
import { sleep } from '@motajs/common';
@ -939,7 +939,7 @@ export const heroMoveCollection: HeroMoveCollection = {
loading.once('coreInit', () => {
// 注册按键操作
Mota.r(() => {
const { HeroKeyMover } = Mota.require('@motajs/system-action');
const { HeroKeyMover } = Mota.require('@user/client-modules');
const { gameKey } = Mota.require('@motajs/system-action');
const keyMover = new HeroKeyMover(gameKey, heroMover);
heroMoveCollection.keyMover = keyMover;

View File

@ -16,6 +16,8 @@ import * as SystemAction from '@motajs/system-action';
import * as SystemUI from '@motajs/system-ui';
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';
export function create() {
Mota.register('@motajs/client', Client);
@ -35,4 +37,6 @@ export function create() {
Mota.register('@motajs/system-ui', SystemUI);
Mota.register('@user/client-modules', ClientModules);
Mota.register('@user/legacy-plugin-client', LegacyPluginClient);
Mota.register('MutateAnimate', MutateAnimate);
Mota.register('Vue', Vue);
}

View File

@ -1,9 +1,15 @@
import { patchAll } from '@user/data-fallback';
import { createMota } from './mota';
import { create } from './create';
import { loading } from '@user/data-base';
import { Patch } from '@motajs/legacy-common';
createMota();
patchAll();
create();
loading.once('coreInit', () => {
Patch.patchAll();
});
export * from './mota';

View File

@ -20,6 +20,9 @@ import type * as DataState from '@user/data-state';
import type * as DataUtils from '@user/data-utils';
import type * as LegacyPluginClient from '@user/legacy-plugin-client';
import type * as LegacyPluginData from '@user/legacy-plugin-data';
// ---------- 必要的第三方库
import type * as MutateAnimate from 'mutate-animate';
import type * as Vue from 'vue';
interface ModuleInterface {
'@motajs/client': typeof Client;
@ -44,6 +47,9 @@ interface ModuleInterface {
'@user/data-utils': typeof DataUtils;
'@user/legacy-plugin-client': typeof LegacyPluginClient;
'@user/legacy-plugin-data': typeof LegacyPluginData;
// ---------- 必要的第三方库
MutateAnimate: typeof MutateAnimate;
Vue: typeof Vue;
}
export interface IMota {

View File

@ -1,6 +1,7 @@
{
"name": "@user/legacy-plugin-client",
"dependencies": {
"@user/client-modules": "workspace:*",
"@user/data-state": "workspace:*"
}
}

View File

@ -1,3 +1,4 @@
import { hook } from '@user/data-base';
import { BarrageBoss } from './barrage';
import { TowerBoss } from './towerBoss';
@ -15,7 +16,7 @@ export function getBoss<T extends BarrageBoss>(): T | null {
return boss as T;
}
Mota.require('var', 'hook').on('reset', () => {
hook.on('reset', () => {
if (boss) {
boss.end();
}

View File

@ -12,8 +12,10 @@ import {
import { Pop } from '../fx/pop';
import { SplittableBall } from './palaceBossProjectile';
import { PointEffect } from '../fx/pointShader';
import { loading } from '@user/data-base';
import { clip } from '@user/legacy-plugin-data';
Mota.require('var', 'loading').once('coreInit', () => {
loading.once('coreInit', () => {
const shader = new Shader();
shader.size(480, 480);
shader.setHD(true);
@ -102,7 +104,7 @@ export class PalaceBoss extends BarrageBoss {
PalaceBoss.effect.end();
core.status.hero.hp = this.heroHp;
Mota.Plugin.require('replay_g').clip('choices:0');
clip('choices:0');
}
ai(time: number, frame: number): void {}

View File

@ -23,9 +23,11 @@ import {
} from './towerBossProjectile';
import { IStateDamageable } from '@user/data-state';
import { Pop } from '../fx/pop';
import { WeatherController } from '@/module';
import { WeatherController } from '@user/client-modules';
import { loading } from '@user/data-base';
import { clip } from '@user/legacy-plugin-data';
Mota.require('var', 'loading').once('coreInit', () => {
loading.once('coreInit', () => {
const shader = new Shader();
shader.size(480, 480);
shader.setHD(true);
@ -198,7 +200,7 @@ export class TowerBoss extends BarrageBoss {
TowerBoss.effect.end();
core.status.hero.hp = this.heroHp;
Mota.Plugin.require('replay_g').clip('choices:0');
clip('choices:0');
}
/**

View File

@ -9,7 +9,12 @@ import {
disableViewport,
enableViewport
} from '@motajs/render';
import type { HeroMover, MoveStep } from '@user/data-state';
import { loading } from '@user/data-base';
import {
heroMoveCollection,
type HeroMover,
type MoveStep
} from '@user/data-state';
import EventEmitter from 'eventemitter3';
export interface IChaseController {
@ -108,7 +113,7 @@ export class Chase extends EventEmitter<ChaseEvent> {
const layer = render.getElementById('layer-main')! as LayerGroup;
this.layer = layer;
const mover = Mota.require('module', 'State').heroMoveCollection.mover;
const mover = heroMoveCollection.mover;
this.heroMove = mover;
mover.on('stepEnd', this.onStepEnd);
@ -345,7 +350,7 @@ export class Chase extends EventEmitter<ChaseEvent> {
}
}
Mota.require('var', 'loading').once('coreInit', () => {
loading.once('coreInit', () => {
const shader = new Shader();
Chase.shader = shader;
shader.size(480, 480);

View File

@ -10,7 +10,9 @@ import {
Sprite
} from '@motajs/render';
import { PointEffect, PointEffectType } from '../fx/pointShader';
import { bgmController } from '@/module';
import { bgmController } from '@user/client-modules';
import { loading } from '@user/data-base';
import { chaseInit1, clip } from '@user/legacy-plugin-data';
const path: Partial<Record<FloorIds, LocArr[]>> = {
MT16: [
@ -107,7 +109,7 @@ let back: Sprite | undefined;
let contrastId: number = 0;
const effect = new PointEffect();
Mota.require('var', 'loading').once('loaded', () => {
loading.once('loaded', () => {
effect.create(Chase.shader, 40);
});
@ -215,7 +217,7 @@ export function initChase(): IChaseController {
para3(chase, ani);
processScale(chase, ani, scale, camera);
Mota.Plugin.require('chase_g').chaseInit1();
chaseInit1();
chase.on('end', () => {
effect.end();
@ -712,7 +714,7 @@ function para3(chase: Chase, ani: Animation) {
});
chase.onceLoc(21, 7, 'MT14', async () => {
flags.finishChase1 = true;
Mota.Plugin.require('replay_g').clip('choices:0');
clip('choices:0');
core.showStatusBar();
ani.time(750).apply('rect', 0);
chase.end(true);

View File

@ -4,6 +4,7 @@ import {
ILayerGroupRenderExtends,
LayerGroup
} from '@motajs/render';
import { loading } from '@user/data-base';
const filterMap: [FloorIds[], string][] = [];
@ -11,7 +12,7 @@ function getCanvasFilterByFloorId(floorId: FloorIds = core.status.floorId) {
return filterMap.find(v => v[0].includes(floorId))?.[1] ?? '';
}
Mota.require('var', 'loading').once('coreInit', () => {
loading.once('coreInit', () => {
filterMap.push(
[['MT50', 'MT60', 'MT61'], 'contrast(120%)'], // 童心佬的滤镜(
[

View File

@ -8,8 +8,7 @@ import {
Sprite,
Transform
} from '@motajs/render';
const gameListener = Mota.require('var', 'gameListener');
import { gameListener, hook } from '@user/data-base';
export class LayerGroupHalo implements ILayerGroupRenderExtends {
id: string = 'halo';
@ -130,7 +129,7 @@ function updateHalo(block: Block) {
}
}
Mota.require('var', 'hook').on('enemyExtract', col => {
hook.on('enemyExtract', col => {
LayerGroupHalo.sprites.forEach(v => {
const floor = v.binder.getFloor();
if (col.floorId === floor) {

View File

@ -1,6 +1,5 @@
export * from './gameCanvas';
export * from './halo';
export * from './itemDetail';
export * from './pointShader';
export * from './pop';
export * from './portal';

View File

@ -7,7 +7,7 @@ import {
LayerGroup,
Sprite
} from '@motajs/render';
import type { BluePalace } from '@user/data-state';
import { BluePalace } from '@user/data-state';
/** 最大粒子数 */
const MAX_PARTICLES = 10;
@ -24,7 +24,7 @@ export class LayerGroupPortal implements ILayerGroupRenderExtends {
portal!: Portal;
private onFloorChange = (floor: FloorIds) => {
const data = Mota.require('module', 'Mechanism').BluePalace.portals;
const data = BluePalace.portals;
this.portal.cellSize = this.group.cellSize;
this.portal.setData(data[floor] ?? []);
};

View File

@ -3,4 +3,4 @@ export * from './chase';
export * from './fx';
export * from './fallback';
export * from './loopMap';
export * from '../../client-modules/src/render/loopMap';

View File

@ -2,6 +2,7 @@
"name": "@user/legacy-plugin-data",
"dependencies": {
"@user/data-state": "workspace:*",
"@user/data-base": "workspace:*"
"@user/data-base": "workspace:*",
"@user/data-utils": "workspace:*"
}
}

View File

@ -1,4 +1,4 @@
import { has, ofDir } from '@/plugin/game/utils';
import { has, ofDir } from '@user/data-utils';
export function init() {
// 伤害弹出
@ -11,11 +11,11 @@ export function init() {
const damage = info?.damage;
if (damage) {
if (!main.replayChecking) {
Mota.Plugin.require('pop_r').addPop(
(x - core.bigmap.offsetX / 32) * 32 + 12,
(y - core.bigmap.offsetY / 32) * 32 + 20,
(-damage).toString()
);
// addPop(
// (x - core.bigmap.offsetX / 32) * 32 + 12,
// (y - core.bigmap.offsetY / 32) * 32 + 20,
// (-damage).toString()
// );
}
core.status.hero.hp -= damage;
const type = [...info.type];

View File

@ -10,6 +10,7 @@ import type {
} from '@motajs/render';
import type { TimingFn } from 'mutate-animate';
import { BlockMover, heroMoveCollection, MoveStep } from '@user/data-state';
import { hook, loading } from '@user/data-base';
// 向后兼容用,会充当两个版本间过渡的作用
@ -24,8 +25,6 @@ interface Adapters {
const adapters: Adapters = {};
export function initFallback() {
const hook = Mota.require('var', 'hook');
const loading = Mota.require('var', 'loading');
let fallbackIds: number = 1e8;
if (!main.replayChecking && main.mode === 'play') {
@ -90,7 +89,7 @@ export function initFallback() {
// ----- 引入
const { Camera, MotaRenderer: Renderer } =
Mota.require('@motajs/render');
const Animation = Mota.require('module', 'Animation');
const Animation = Mota.require('MutateAnimate');
// ----- 勇士移动相关
control.prototype.moveAction = async function (callback?: () => void) {
@ -313,7 +312,7 @@ export function initFallback() {
core.removeBlock(x, y);
setTimeout(function () {
core.status.replay.animate = false;
Mota.require('var', 'hook').emit(
hook.emit(
'afterOpenDoor',
block.event.id as AllIdsOf<'animates'>,
x,

View File

@ -1,5 +1,5 @@
import { EnemyCollection, ensureFloorDamage } from '@user/data-state';
import { formatDamage } from '../utils';
import { formatDamage } from '@user/data-utils';
export function init() {
core.control.updateDamage = function (
@ -58,7 +58,7 @@ function renderThumbnailDamage(col: EnemyCollection) {
py: 32 * (v.y! + 1) - 1,
color: color
});
const setting = Mota.require('var', 'mainSetting');
const setting = Mota.require('@motajs/legacy-ui').mainSetting;
const criGem = setting.getValue('screen.criticalGem', false);
const n = critical?.atkDelta ?? Infinity;
const ratio = core.status.maps[col.floorId].ratio;

View File

@ -40,7 +40,7 @@ export function removeMaps(
deleted = true;
}
if (deleted && !main.replayChecking) {
Mota.Plugin.require('fly_r').splitArea();
Mota.require('@motajs/legacy-ui').splitArea();
}
}

View File

@ -1,9 +1,11 @@
import { HeroSkill } from '@/game/mechanism/misc';
import { HeroSkill } from '@user/data-state';
import {
getSkillFromIndex,
upgradeSkill
} from '../../data-state/src/mechanism/skillTree';
import { canOpenShop } from './shop';
import { hook } from '@user/data-base';
import { jumpSkill } from './skill';
const replayableSettings = ['autoSkill'];
@ -27,7 +29,7 @@ export function initReplay() {
function tipAndWait(content: string, time: number) {
const speed = core.status.replay.speed;
if (main.replayChecking || speed === 24) return Promise.resolve();
const { tip } = Mota.Plugin.require('utils_r');
const { tip } = Mota.require('@motajs/legacy-ui');
tip('info', '录像播放操作:' + content);
return new Promise<void>(res => {
setTimeout(res, time / speed);
@ -78,7 +80,7 @@ export function initReplay() {
let shopOpened = false;
let openedShopId = '';
Mota.require('var', 'hook').on('reset', () => {
hook.on('reset', () => {
shopOpened = false;
openedShopId = '';
});
@ -162,7 +164,7 @@ export function initReplay() {
!core.status.floorId.startsWith('tower') &&
HeroSkill.learnedSkill(HeroSkill.Jump)
) {
const success = Mota.Plugin.require('skill_g').jumpSkill();
const success = jumpSkill();
core.status.route.push(`useSkill:${toEmit}`);
if (!success) core.replay();
return true;

View File

@ -10,7 +10,7 @@ export function openShop(shopId: string, noRoute: boolean) {
if (shop.item) {
Mota.r(() => {
if (!core.isReplaying()) {
Mota.require('var', 'mainUi').open('shop', {
Mota.require('@motajs/legacy-ui').mainUi.open('shop', {
shopId: shopId
});
}

View File

@ -529,7 +529,7 @@ export function loadDefaultResource() {
const res = LoadTask.add('byte', `byte/project/sounds/${v}`);
Mota.r(() => {
res.once('load', res => {
const { soundPlayer } = Mota.require('module', 'Audio');
const { soundPlayer } = Mota.require('@user/client-modules');
soundPlayer.add(v, res.resource!);
});
});
@ -548,7 +548,7 @@ export function loadDefaultResource() {
const res = LoadTask.add('image', `image/project/autotiles/${v}.png`);
res.once('load', res => {
autotiles[v as AllIdsOf<'autotile'>] = res.resource;
const loading = Mota.require('var', 'loading');
const { loading } = Mota.require('@user/data-base');
loading.addAutotileLoaded();
loading.onAutotileLoaded(autotiles);
core.material.images.autotile[v as AllIdsOf<'autotile'>] =
@ -675,7 +675,7 @@ export async function loadCompressedResource() {
autotiles[
name.slice(0, -4) as AllIdsOf<'autotile'>
] = image;
const loading = Mota.require('var', 'loading');
const { loading } = Mota.require('@user/data-base');
loading.addAutotileLoaded();
loading.onAutotileLoaded(autotiles);
core.material.images.autotile[
@ -717,8 +717,10 @@ export async function loadCompressedResource() {
new FontFace(name.slice(0, -4), font)
);
} else if (usage === 'sound') {
const { soundPlayer } = Mota.require('module', 'Audio');
soundPlayer.add(v, value);
const { soundPlayer } = Mota.require(
'@user/client-modules'
);
soundPlayer.add(name as SoundIds, value as Uint8Array);
} else if (usage === 'animate') {
const ani = value as string;
core.material.animates[

View File

@ -134,7 +134,7 @@ onMounted(() => {
}
drawer.drawMap();
const hook = Mota.require('var', 'hook');
const { hook } = Mota.require('@user/data-base');
hook.on('afterChangeFloor', onChange);
hook.on('afterBattle', afterBattle);
@ -168,7 +168,7 @@ onMounted(() => {
});
onUnmounted(() => {
const hook = Mota.require('var', 'hook');
const { hook } = Mota.require('@user/data-base');
hook.off('afterChangeFloor', onChange);
hook.off('afterBattle', afterBattle);
});

View File

@ -0,0 +1,2 @@
export * from './shadow';
export * from './webgl';

View File

@ -75,7 +75,7 @@ function addLightFromBlock(
});
}
const hook = Mota.require('var', 'hook');
const { hook } = Mota.require('@user/data-base');
hook.once('reset', () => {
Shadow.init();
@ -100,11 +100,9 @@ hook.once('reset', () => {
},
{ background: [0, 0, 0, 0.3] }
);
Mota.rewrite(core.control, 'loadData', 'add', () => {
if (!main.replayChecking) {
Shadow.update(true);
LayerShadowExtends.shadowList.forEach(v => v.update());
}
hook.on('loadData', () => {
Shadow.update(true);
LayerShadowExtends.shadowList.forEach(v => v.update());
});
});
hook.on('reset', () => {

View File

@ -4,6 +4,7 @@ export * as UI from './ui';
export * as Components from './components';
export * from './preset';
export * from './tools';
export * from './fx';
export * from './animateController';
export * from './controller';

View File

@ -34,7 +34,7 @@ const marked: MarkInfo<EnemyIds>[] = [];
*/
export function markEnemy(id: EnemyIds) {
if (hasMarkedEnemy(id)) return;
const DamageEnemy = Mota.require('class', 'DamageEnemy');
const { DamageEnemy, getHeroStatusOn } = Mota.require('@user/data-state');
const enemy = new DamageEnemy(core.material.enemys[id]);
enemy.calAttribute();
enemy.getRealInfo();
@ -43,7 +43,7 @@ export function markEnemy(id: EnemyIds) {
id,
enemy,
mode: 0b011111,
lastAtk: Mota.requireAll('fn').getHeroStatusOn('atk', 'empty'),
lastAtk: getHeroStatusOn('atk', 'empty'),
lastDamage: enemy.calDamage().damage,
status: 0b0,
update: ref(true)
@ -65,7 +65,7 @@ export function unmarkEnemy(id: EnemyIds) {
}
export function checkMarkedEnemy() {
const { getHeroStatusOn } = Mota.requireAll('fn');
const { getHeroStatusOn } = Mota.require('@user/data-state');
marked.forEach(v => {
const { id, enemy, mode, lastAtk, lastDamage, markDamage } = v;
const atk = getHeroStatusOn('atk', 'empty');
@ -158,7 +158,7 @@ export function hasMarkedEnemy(id: EnemyIds) {
return marked.some(v => v.id === id);
}
const hook = Mota.require('var', 'hook');
const { hook } = Mota.require('@user/data-base');
hook.on('statusBarUpdate', () => {
checkMarkedEnemy();
});

View File

@ -21,12 +21,14 @@ if (import.meta.env.DEV) {
Danmaku.backend = `/danmaku`;
}
Mota.require('var', 'hook').once('reset', () => {
const { hook } = Mota.require('@user/data-base');
hook.once('reset', () => {
Danmaku.fetch();
});
// 勇士移动后显示弹幕
Mota.require('var', 'hook').on('moveOneStep', (x, y, floor) => {
hook.on('moveOneStep', (x, y, floor) => {
const enabled = mainSetting.getValue('ui.danmaku', true);
if (!enabled) return;
const f = Danmaku.allInPos[floor];

View File

@ -37,7 +37,8 @@ const closeFixed = () => {
// todo: 应当在这里实现查看临界与特殊属性的功能
export let hovered: Block | null;
const { hook, gameListener } = Mota.requireAll('var');
const { hook, gameListener } = Mota.require('@user/data-base');
gameListener.on('hoverBlock', block => {
closeFixed();
hovered = block;

View File

@ -535,7 +535,7 @@ gameKey
core.actions._clickGameInfo_openComments();
})
.realize('skill1', () => {
const HeroSkill = Mota.require('module', 'Mechanism').HeroSkill;
const HeroSkill = Mota.require('@user/data-state').HeroSkill;
if (!HeroSkill.learnedSkill(HeroSkill.Blade)) return;
if (HeroSkill.getAutoSkill()) {
tip('error', '已开启自动切换技能!');
@ -547,13 +547,13 @@ gameKey
core.updateStatusBar();
})
.realize('skill2', () => {
const HeroSkill = Mota.require('module', 'Mechanism').HeroSkill;
const HeroSkill = Mota.require('@user/data-state').HeroSkill;
if (
!flags.onChase &&
!core.status.floorId.startsWith('tower') &&
HeroSkill.learnedSkill(HeroSkill.Jump)
) {
Mota.Plugin.require('skill_g').jumpSkill();
Mota.require('@user/legacy-plugin-data').jumpSkill();
core.status.route.push('useSkill:Jump');
} else {
if (core.hasItem('pickaxe')) {
@ -562,7 +562,7 @@ gameKey
}
})
.realize('skill3', () => {
const HeroSkill = Mota.require('module', 'Mechanism').HeroSkill;
const HeroSkill = Mota.require('@user/data-state').HeroSkill;
if (!HeroSkill.learnedSkill(HeroSkill.Shield)) return;
if (HeroSkill.getAutoSkill()) {
tip('error', '已开启自动切换技能!');

View File

@ -8,7 +8,6 @@ import {
UI,
UiController
} from '@motajs/legacy-ui';
import { bgmController, soundPlayer } from '@/module';
import settingsText from '../data/settings.json';
//#region legacy-ui
@ -47,7 +46,7 @@ fixedUi.register(
);
fixedUi.showAll();
const hook = Mota.require('var', 'hook');
const { hook } = Mota.require('@user/data-base');
hook.once('mounted', () => {
const ui = document.getElementById('ui-main')!;
const fixed = document.getElementById('ui-fixed')!;
@ -143,7 +142,7 @@ function handleActionSetting<T extends number | boolean>(
) {
if (key === 'autoSkill') {
// 自动切换技能
const HeroSkill = Mota.require('module', 'Mechanism').HeroSkill;
const HeroSkill = Mota.require('@user/data-state').HeroSkill;
HeroSkill.setAutoSkill(n as boolean);
core.status.route.push(`set:autoSkill:${n}`);
}
@ -154,6 +153,7 @@ function handleAudioSetting<T extends number | boolean>(
n: T,
_o: T
) {
const { bgmController, soundPlayer } = Mota.require('@user/client-modules');
if (key === 'bgmEnabled') {
bgmController.setEnabled(n as boolean);
core.checkBgm();
@ -261,7 +261,7 @@ mainSetting
.register('tips', '小贴士', true, COM.Boolean)
);
const loading = Mota.require('var', 'loading');
const { loading } = Mota.require('@user/data-base');
loading.once('coreInit', () => {
mainSetting.reset({
'screen.fullscreen': !!document.fullscreenElement,

View File

@ -61,7 +61,7 @@ export function getNowStatus(nowEquip?: Equip, onCol: boolean = false) {
'hpmax',
'money'
] as (keyof SelectType<HeroStatus, number>)[];
const { getHeroStatusOn } = Mota.requireAll('fn');
const { getHeroStatusOn } = Mota.require('@user/data-state');
return (
<div id="hero-status">

View File

@ -31,7 +31,7 @@ export function getDetailedEnemy(
const special: [string, string, string][] = [...enemy.info.special]
.filter(v => !enemy.info.specialHalo?.includes(v))
.map(vv => {
const s = Mota.require('var', 'enemySpecials')[vv];
const s = Mota.require('@user/data-state').specials[vv];
return [
fromFunc(s.name, enemy.info),
fromFunc(s.desc, enemy.info),

View File

@ -519,7 +519,7 @@ export class MinimapDrawer {
ctx.textBaseline = 'middle';
ctx.font = `3px "normal"`;
ctx.strokeStyle = 'black';
Mota.require('fn', 'ensureFloorDamage')(floorId);
Mota.require('@user/data-state').ensureFloorDamage(floorId);
ctx.fillStyle = 'rgba(0, 0, 0, 0.6)';
ctx.fillRect(x - 6, y - 2, 12, 4);
ctx.fillStyle = 'white';

View File

@ -107,6 +107,7 @@ import {
} from '../tools/achievement';
import Scroll from '../components/scroll.vue';
import { isMobile } from '../use';
import { mainUi } from '../preset';
const props = defineProps<{
num: number;
@ -176,7 +177,7 @@ function getAllAchievements(type: AchievementType): ResolvedAchievement[] {
}
function exit() {
Mota.require('var', 'mainUi').close(props.num);
mainUi.close(props.num);
}
</script>

View File

@ -32,13 +32,13 @@
import { onMounted, onUpdated, Ref, ref, watch } from 'vue';
import Box from '../components/box.vue';
import { GameUi } from '../controller';
import type { DamageEnemy, EnemyInfo } from '@/game/enemy/damage';
import { nextFrame } from '../utils';
import { EnemyInfo, IDamageEnemy } from '@motajs/types';
const props = defineProps<{
num: number;
ui: GameUi;
enemy: DamageEnemy;
enemy: IDamageEnemy;
close: Ref<boolean>;
loc: [x: number, y: number];
}>();
@ -83,7 +83,7 @@ const special = (() => {
};
const show = s.slice(0, 2).map(v => {
const s = Mota.require('var', 'enemySpecials')[v];
const s = Mota.require('@user/data-state').specials[v];
return [fromFunc(s.name, enemy.info), s.color];
});
if (s.length > 2) show.push(['...', 'white']);

View File

@ -74,7 +74,7 @@ onMounted(async () => {
core._afterLoadResources(props.callback);
logger.log(`Resource load end.`);
loadDiv.style.opacity = '0';
Mota.require('var', 'loading').emit('loaded');
Mota.require('@user/data-base').loading.emit('loaded');
await sleep(1000);
fixedUi.close(props.num);
fixedUi.open('start');

View File

@ -87,32 +87,31 @@ import { sleep } from 'mutate-animate';
import { gameKey } from '@motajs/system-action';
import { GameUi } from '../controller';
import { mainUi } from '../preset/ui';
import type { Chapter } from '@/plugin/game/skillTree';
const props = defineProps<{
num: number;
ui: GameUi;
}>();
const skillTree = Mota.Plugin.require('skillTree_g');
const skillTree = Mota.require('@user/legacy-plugin-data');
let canvas: HTMLCanvasElement;
let ctx: CanvasRenderingContext2D;
const selected = ref(0);
const chapter = ref<Chapter>('chapter1');
const update = ref(false);
const chapterDict = {
chapter1: '第一章',
chapter2: '第二章'
};
const selected = ref(0);
const chapter = ref<keyof typeof chapterDict>('chapter1');
const update = ref(false);
flags.skillTree ??= 0;
const s = Mota.Plugin.require('skillTree_g').skills;
const s = skillTree.skills;
const chapterList = Object.keys(s) as Chapter[];
const chapterList = Object.keys(s) as (keyof typeof chapterDict)[];
selected.value = s[chapterList[flags.skillTree]][0].index;
chapter.value = chapterList[flags.skillTree];

View File

@ -72,8 +72,6 @@ import { gameKey } from '@motajs/system-action';
import { mainUi } from '../preset/ui';
import { mainSetting } from '../preset/ui';
import { mat4 } from 'gl-matrix';
// todo:
import { bgmController } from '@/module';
const props = defineProps<{
num: number;
@ -90,7 +88,7 @@ let background: HTMLImageElement;
let buttons: HTMLSpanElement[] = [];
let played: boolean;
let played: boolean = false;
const soundChecked = ref(false);
const fullscreen = ref(!!document.fullscreenElement);
@ -327,6 +325,7 @@ onMounted(async () => {
resize();
soundChecked.value = mainSetting.getValue('audio.bgmEnabled', true);
const { bgmController } = Mota.require('@user/client-modules');
bgmController.play('title.opus');
start.style.opacity = '1';
@ -425,8 +424,7 @@ onUnmounted(() => {
);
background-clip: text;
-webkit-background-clip: text;
text-shadow:
1px 1px 4px rgba(0, 0, 0, 0.5),
text-shadow: 1px 1px 4px rgba(0, 0, 0, 0.5),
-1px -1px 3px rgba(255, 255, 255, 0.3),
5px 5px 5px rgba(0, 0, 0, 0.4);
filter: brightness(1.8);
@ -449,17 +447,14 @@ onUnmounted(() => {
position: absolute;
opacity: 0;
animation: cursor 2.5s linear 0s infinite normal running;
transition:
left 0.4s ease-out,
top 0.4s ease-out,
transition: left 0.4s ease-out, top 0.4s ease-out,
opacity 1.5s ease-out;
}
.start-button {
position: relative;
font: bold 1.5em 'normal';
text-shadow:
1px 1px 2px rgba(0, 0, 0, 0.4),
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.4),
0px 0px 1px rgba(255, 255, 255, 0.3);
background-clip: text;
-webkit-background-clip: text;

View File

@ -359,8 +359,7 @@ export function spliceBy<T>(arr: T[], from: T): T[] {
}
export async function triggerFullscreen(full: boolean) {
if (!Mota.Plugin.inited) return;
const { maxGameScale } = Mota.Plugin.require('utils_g');
const { maxGameScale } = Mota.require('@user/data-utils');
if (!!document.fullscreenElement && !full) {
if (window.jsinterface) {
window.jsinterface.requestPortrait();
@ -472,10 +471,10 @@ export function formatSize(size: number) {
return size < 1 << 10
? `${size.toFixed(2)}B`
: size < 1 << 20
? `${(size / (1 << 10)).toFixed(2)}KB`
: size < 1 << 30
? `${(size / (1 << 20)).toFixed(2)}MB`
: `${(size / (1 << 30)).toFixed(2)}GB`;
? `${(size / (1 << 10)).toFixed(2)}KB`
: size < 1 << 30
? `${(size / (1 << 20)).toFixed(2)}MB`
: `${(size / (1 << 30)).toFixed(2)}GB`;
}
let num = 0;

View File

@ -14,7 +14,8 @@ const i = (img: ImageMapKeys) => {
const imageMap: Partial<ImageMap> = {};
Mota.require('var', 'loading').once('loaded', () => {
const { loading } = Mota.require('@user/data-base');
loading.once('loaded', () => {
[
'enemys',
'enemy48',
@ -91,7 +92,7 @@ class TextureCache {
constructor() {
this.material = imageMap as Record<ImageMapKeys, HTMLImageElement>;
Mota.require('var', 'loading').once('loaded', () => {
loading.once('loaded', () => {
const map = maps_90f36752_8815_4be8_b32b_d7fad1d0542e;
// @ts-expect-error 无法推导
this.idNumberMap = {};

View File

@ -11,7 +11,7 @@ import { texture } from './cache';
import { sleep } from 'mutate-animate';
import { RenderAdapter } from '@motajs/render-core';
const hook = Mota.require('var', 'hook');
const { hook } = Mota.require('@user/data-base');
hook.on('setBlock', (x, y, floor, block) => {
const isNow = floor === core.status.floorId;

View File

@ -39,7 +39,7 @@ class RenderEmits extends EventEmitter<RenderEvent> {
export const renderEmits = new RenderEmits();
Mota.require('var', 'hook').once('reset', () => {
Mota.require('@user/data-base').hook.once('reset', () => {
let lastTime = 0;
RenderItem.ticker.add(time => {
if (!core.isPlaying()) return;

View File

@ -2,7 +2,6 @@ export * from './animate';
export * from './block';
export * from './cache';
export * from './camera';
export * from './damage';
export * from './floor';
export * from './frame';
export * from './graphics';

View File

@ -292,7 +292,7 @@ export class Icon extends RenderItem<EIconEvent> implements IAnimateFrame {
}
const num = typeof id === 'number' ? id : texture.idNumberMap[id];
const loading = Mota.require('var', 'loading');
const { loading } = Mota.require('@user/data-base');
if (loading.loaded) {
this.setIconRenderable(num);
} else {
@ -500,7 +500,7 @@ export class Winskin extends RenderItem<EWinskinEvent> {
* @param name
*/
setImageByName(name: ImageIds) {
const loading = Mota.require('var', 'loading');
const { loading } = Mota.require('@user/data-base');
if (loading.loaded) {
const image = core.material.images.images[name];
this.setImage(image);

View File

@ -346,7 +346,7 @@ adapter.receiveSync('endMove', item => {
item.endMove();
});
const hook = Mota.require('var', 'hook');
const { hook } = Mota.require('@user/data-base');
hook.on('changingFloor', (_, loc) => {
adapter.all('setPosition', loc.x, loc.y);
});

View File

@ -47,7 +47,6 @@ import {
ELayerEvent,
ELayerGroupEvent,
EAnimateEvent,
EDamageEvent,
EGraphicItemEvent
} from '@motajs/render-elements';
@ -100,7 +99,7 @@ declare module 'vue/jsx-runtime' {
custom: TagDefine<CustomProps, ERenderItemEvent>;
layer: TagDefine<LayerProps, ELayerEvent>;
'layer-group': TagDefine<LayerGroupProps, ELayerGroupEvent>;
damage: TagDefine<DamageProps, EDamageEvent>;
damage: TagDefine<DamageProps, ERenderItemEvent>;
animation: TagDefine<AnimateProps, EAnimateEvent>;
'g-rect': TagDefine<RectProps, EGraphicItemEvent>;
'g-circle': TagDefine<CirclesProps, EGraphicItemEvent>;

View File

@ -17,8 +17,6 @@ import {
Text,
Winskin,
Animate,
Damage,
EDamageEvent,
Layer,
LayerGroup,
BezierCurve,
@ -236,9 +234,6 @@ tagMap.register('layer-group', (_0, _1, props) => {
return l;
}
});
tagMap.register<EDamageEvent, Damage>('damage', (_0, _1, _props) => {
return new Damage();
});
tagMap.register('animation', (_0, _1, _props) => {
return new Animate();
});

View File

@ -1,3 +1,5 @@
import EventEmitter from 'eventemitter3';
export interface EnemyInfo extends Partial<Omit<Enemy, 'special'>> {
atk: number;
def: number;
@ -133,7 +135,12 @@ export interface IDamageEnemy {
getSeckillAtk(): number;
}
export interface IEnemyCollection {
export interface IEnemyCollectionEvent {
calculated: [];
extract: [];
}
export interface IEnemyCollection extends EventEmitter<IEnemyCollectionEvent> {
/** 这个怪物集的地图 id */
readonly floorId: FloorIds;
/** 地图宽度 */

View File

@ -1,4 +1,4 @@
///<reference path="../../src/types/core.d.ts" />
///<reference path="../../types/declaration/core.d.ts" />
var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = {
events: {
@ -395,6 +395,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = {
}
});
});
Mota.require('@user/data-base').hook.emit('loadData');
},
updateStatusBar: function () {
// 检查等级

View File

@ -29,7 +29,7 @@ import { onMounted } from 'vue';
import { mainUi, fixedUi } from '@motajs/legacy-ui';
onMounted(() => {
const { hook } = Mota.requireAll('var');
const { hook } = Mota.require('@user/data-base');
hook.emit('mounted');
});

View File

@ -17,7 +17,6 @@
"noEmit": true,
"baseUrl": ".",
"paths": {
"@/*": ["src/*"],
"@motajs/*": ["packages/*/src"],
"@user/*": ["packages-user/*/src"]
}

View File

@ -51,15 +51,7 @@ export default defineConfig({
base: `./`,
resolve: {
alias: [
...aliases,
{
find: '@',
replacement: resolve(__dirname, './src')
},
{
find: '@ui',
replacement: resolve(__dirname, './src/ui')
}
...aliases
]
},
build: {