refactor: 脚本编辑部分内容

This commit is contained in:
unanmed 2023-12-01 21:47:43 +08:00
parent 43937c9a54
commit 9adcb5543f
14 changed files with 127 additions and 145 deletions

1
components.d.ts vendored
View File

@ -17,6 +17,7 @@ declare module '@vue/runtime-core' {
ASwitch: typeof import('ant-design-vue/es')['Switch'] ASwitch: typeof import('ant-design-vue/es')['Switch']
Box: typeof import('./src/components/box.vue')['default'] Box: typeof import('./src/components/box.vue')['default']
BoxAnimate: typeof import('./src/components/boxAnimate.vue')['default'] BoxAnimate: typeof import('./src/components/boxAnimate.vue')['default']
Changable: typeof import('./src/components/changable.vue')['default']
Colomn: typeof import('./src/components/colomn.vue')['default'] Colomn: typeof import('./src/components/colomn.vue')['default']
EnemyOne: typeof import('./src/components/enemyOne.vue')['default'] EnemyOne: typeof import('./src/components/enemyOne.vue')['default']
Scroll: typeof import('./src/components/scroll.vue')['default'] Scroll: typeof import('./src/components/scroll.vue')['default']

View File

@ -18,7 +18,6 @@ function actions() {
} }
actions.prototype._init = function () { actions.prototype._init = function () {
this.actionsdata = functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.actions;
this.actions = {}; this.actions = {};
// --- onkeyDown注册 // --- onkeyDown注册
this.registerAction( this.registerAction(
@ -531,7 +530,6 @@ actions.prototype._sys_keyUp_lockControl = function (keyCode, altKey) {
actions.prototype._sys_keyUp = function (keyCode, altKey) { actions.prototype._sys_keyUp = function (keyCode, altKey) {
if (!core.status.played) return true; if (!core.status.played) return true;
this.actionsdata.onKeyUp(keyCode, altKey);
if (core.status.automaticRoute && core.status.automaticRoute.autoHeroMove) { if (core.status.automaticRoute && core.status.automaticRoute.autoHeroMove) {
core.stopAutomaticRoute(); core.stopAutomaticRoute();
} }

View File

@ -471,7 +471,7 @@ events.prototype.openDoor = function (x, y, needKey, callback) {
core.removeBlock(x, y); core.removeBlock(x, y);
setTimeout(function () { setTimeout(function () {
core.status.replay.animate = false; core.status.replay.animate = false;
core.events.afterOpenDoor(block.event.id, x, y); mota.game.hook.emit('afterOpenDoor', block.event.id, x, y);
if (callback) callback(); if (callback) callback();
}, 1); // +1是为了录像检测系统 }, 1); // +1是为了录像检测系统
} else { } else {
@ -556,7 +556,7 @@ events.prototype._openDoor_animate = function (block, x, y, callback) {
core.maps._removeBlockFromMap(core.status.floorId, block); core.maps._removeBlockFromMap(core.status.floorId, block);
if (!locked) core.unlockControl(); if (!locked) core.unlockControl();
core.status.replay.animate = false; core.status.replay.animate = false;
core.events.afterOpenDoor(block.event.id, x, y); mota.game.hook.emit('afterOpenDoor', block.event.id, x, y);
if (callback) callback(); if (callback) callback();
}; };
@ -582,7 +582,7 @@ events.prototype._openDoor_animate = function (block, x, y, callback) {
////// 开一个门后触发的事件 ////// ////// 开一个门后触发的事件 //////
events.prototype.afterOpenDoor = function (doorId, x, y) { events.prototype.afterOpenDoor = function (doorId, x, y) {
return this.eventdata.afterOpenDoor(doorId, x, y); // Deprecated. See hook#afterOpenDoor.
}; };
events.prototype._sys_getItem = function (data, callback) { events.prototype._sys_getItem = function (data, callback) {
@ -636,12 +636,12 @@ events.prototype.getItem = function (id, num, x, y, isGentleClick, callback) {
itemHint.push(id); itemHint.push(id);
} }
this.afterGetItem(id, x, y, isGentleClick); mota.game.hook.emit('afterGetItem', id, x, y, isGentleClick);
if (callback) callback(); if (callback) callback();
}; };
events.prototype.afterGetItem = function (id, x, y, isGentleClick) { events.prototype.afterGetItem = function (id, x, y, isGentleClick) {
this.eventdata.afterGetItem(id, x, y, isGentleClick); // Deprecated. See hook#afterGetItem
}; };
////// 获得面前的物品(轻按) ////// ////// 获得面前的物品(轻按) //////

View File

@ -260,90 +260,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = {
core.changeFloor(toId, stair, loc, null, callback); core.changeFloor(toId, stair, loc, null, callback);
return true; return true;
},
afterOpenDoor: function (doorId, x, y) {
// 开一个门后触发的事件
var todo = [];
// 检查该点的获得开门后事件。
if (core.status.floorId == null) return;
var event =
core.floors[core.status.floorId].afterOpenDoor[x + ',' + y];
if (event) core.unshift(todo, event);
if (todo.length > 0) core.insertAction(todo, x, y);
if (core.status.event.id == null) core.continueAutomaticRoute();
else core.clearContinueAutomaticRoute();
},
afterGetItem: function (itemId, x, y, isGentleClick) {
// 获得一个道具后触发的事件
// itemId获得的道具IDx和y是该道具所在的坐标
// isGentleClick是否是轻按触发的
if (
(itemId.endsWith('Potion') ||
itemId == 'I482' ||
itemId == 'I484' ||
itemId == 'I487' ||
itemId == 'I491') &&
core.material.items[itemId].cls == 'items'
)
core.playSound('回血');
else core.playSound('获得道具');
var todo = [];
// 检查该点的获得道具后事件。
if (core.status.floorId == null) return;
var event =
core.floors[core.status.floorId].afterGetItem[x + ',' + y];
if (
event &&
(event instanceof Array ||
!isGentleClick ||
!event.disableOnGentleClick)
) {
core.unshift(todo, event);
}
if (core.hasFlag('spring')) {
if (!core.hasFlag('springCount'))
core.setFlag('springCount', 0);
if (
itemId.endsWith('Potion') ||
itemId == 'I482' ||
itemId == 'I484' ||
itemId == 'I487' ||
itemId == 'I491'
) {
core.addFlag('springCount', 1);
}
if (core.getFlag('springCount', 0) == 50) {
core.setFlag('springCount', 0);
core.status.hero.hpmax +=
core.getNakedStatus('hpmax') * 0.1;
}
core.updateStatusBar();
}
if (todo.length > 0) core.insertAction(todo, x, y);
}
},
actions: {
onKeyUp: function (keyCode, altKey) {
// 键盘按键处理,可以在这里自定义快捷键列表
// keyCode当前按键的keyCode每个键的keyCode自行百度
// altKeyAlt键是否被按下为true代表同时按下了Alt键
// 可以在这里任意增加或编辑每个按键的行为
if (core.status.lockControl) return;
// 如果处于正在行走状态,则不处理
if (core.isMoving()) return;
// Alt+0~9快捷换上套装
if (altKey && keyCode >= 48 && keyCode <= 57) {
core.items.quickLoadEquip(keyCode - 48);
return;
}
} }
}, },
control: { control: {
@ -436,31 +352,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = {
} }
}); });
}, },
getStatusLabel: function (name) {
// 返回某个状态英文名的对应中文标签如atk -> 攻击def -> 防御等。
// 请注意此项仅影响 libs/ 下的内容(如绘制怪物手册、数据统计等)
// 自行定义的(比如获得道具效果)中用到的“攻击+3”等需要自己去对应地方修改
return (
{
name: '名称',
lv: '等级',
hpmax: '生命回复',
hp: '生命',
manamax: '魔力上限',
mana: '额外攻击',
atk: '攻击',
def: '防御',
mdef: '智慧',
money: '金币',
exp: '经验',
point: '加点',
steps: '步数',
up: '升级',
none: '无'
}[name] || name
);
},
updateStatusBar: function () { updateStatusBar: function () {
// 更新状态栏 // 更新状态栏

View File

@ -8,6 +8,14 @@ export interface GameEvent extends EmitableEvent {
mounted: () => void; mounted: () => void;
/** Emitted in plugin/ui.js */ /** Emitted in plugin/ui.js */
statusBarUpdate: () => void; statusBarUpdate: () => void;
/** Emitted in libs/events.js */
afterGetItem: (
itemId: AllIdsOf<'items'>,
x: number,
y: number,
isGentleClick: boolean
) => void;
afterOpenDoor: (doorId: AllIdsOf<'animates'>, x: number, y: number) => void;
} }
export const hook = new EventEmitter<GameEvent>(); export const hook = new EventEmitter<GameEvent>();

61
src/plugin/game/hook.ts Normal file
View File

@ -0,0 +1,61 @@
export {};
const potionItems: AllIdsOf<'items'>[] = [
'redPotion',
'bluePotion',
'yellowPotion',
'greenPotion',
'I482',
'I484',
'I487',
'I491'
];
mota.game.hook.on('afterGetItem', (itemId, x, y, isGentleClick) => {
// 获得一个道具后触发的事件
// itemId获得的道具IDx和y是该道具所在的坐标
// isGentleClick是否是轻按触发的
if (potionItems.includes(itemId)) core.playSound('回血');
else core.playSound('获得道具');
const todo: any[] = [];
// 检查该点的获得道具后事件。
if (core.status.floorId == null) return;
const event = core.floors[core.status.floorId].afterGetItem[`${x},${y}`];
if (
event &&
(event instanceof Array ||
!isGentleClick ||
!event.disableOnGentleClick)
) {
core.unshift(todo, event as any[]);
}
if (core.hasFlag('spring')) {
if (!core.hasFlag('springCount')) core.setFlag('springCount', 0);
if (potionItems.includes(itemId)) {
core.addFlag('springCount', 1);
}
if (core.getFlag<number>('springCount', 0) === 50) {
core.setFlag('springCount', 0);
core.status.hero.hpmax += core.getNakedStatus('hpmax') * 0.1;
}
core.updateStatusBar();
}
if (todo.length > 0) core.insertAction(todo, x, y);
});
mota.game.hook.on('afterOpenDoor', (doorId, x, y) => {
// 开一个门后触发的事件
const todo: any[] = [];
// 检查该点的获得开门后事件。
if (core.status.floorId == null) return;
const event = core.floors[core.status.floorId].afterOpenDoor[`${x},${y}`];
if (event) core.unshift(todo, event as any[]);
if (todo.length > 0) core.insertAction(todo, x, y);
if (core.status.event.id == null) core.continueAutomaticRoute();
else core.clearContinueAutomaticRoute();
});

View File

@ -1,4 +1,4 @@
import { has } from '../utils'; import { getStatusLabel, has } from '../utils';
/** /**
* *
@ -28,9 +28,7 @@ export function getAddStatus(equip: Equip) {
return ( return (
<span style="display: flex"> <span style="display: flex">
<span style="flex-basis: 50%"> <span style="flex-basis: 50%">{getStatusLabel(v)}</span>
{core.getStatusLabel(v)}
</span>
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;
<span <span
style={{ style={{
@ -84,7 +82,7 @@ export function getNowStatus(nowEquip?: Equip, onCol: boolean = false) {
return ( return (
<div class="hero-status-one"> <div class="hero-status-one">
<span class="hero-status-label"> <span class="hero-status-label">
{core.getStatusLabel(v)} {getStatusLabel(v)}
</span> </span>
<div class="hero-status-value"> <div class="hero-status-value">
<span style="margin-right: 20%">{status}</span> <span style="margin-right: 20%">{status}</span>

View File

@ -307,3 +307,29 @@ export function generateBinary(arr: boolean[]) {
}); });
return num; return num;
} }
/**
*
* @param name
*/
export function getStatusLabel(name: string) {
return (
{
name: '名称',
lv: '等级',
hpmax: '生命回复',
hp: '生命',
manamax: '魔力上限',
mana: '额外攻击',
atk: '攻击',
def: '防御',
mdef: '智慧',
money: '金币',
exp: '经验',
point: '加点',
steps: '步数',
up: '升级',
none: '无'
}[name] || name
);
}

View File

@ -93,3 +93,21 @@
z-index: 999; z-index: 999;
user-select: none; user-select: none;
} }
.changable {
border-radius: 4px;
padding: 2px 4px;
}
.changable[change='true'] {
animation: changable-animate 1s linear alternate 1;
}
@keyframes changable-animate {
0% {
background-color: #7cc9;
}
100% {
background-color: #0000;
}
}

View File

@ -86,11 +86,6 @@ interface Actions extends VoidedActionFuncs {
*/ */
readonly _HY_: number; readonly _HY_: number;
/**
*
*/
readonly actionsdata: ActionData;
/** /**
* *
*/ */

View File

@ -698,12 +698,6 @@ interface Control {
*/ */
getNakedStatus(name?: keyof NumbericHeroStatus): number; getNakedStatus(name?: keyof NumbericHeroStatus): number;
/**
*
* @param name
*/
getStatusLabel(name: string): string;
/** /**
* 1 * 1
* flag: `__${name}_${buff}__` * flag: `__${name}_${buff}__`

View File

@ -20,12 +20,6 @@ interface ControlData {
*/ */
loadData(data: Save, callback?: () => void): void; loadData(data: Save, callback?: () => void): void;
/**
*
* @param name
*/
getStatusLabel(name: string): string;
/** /**
* *
*/ */

2
src/types/map.d.ts vendored
View File

@ -215,7 +215,7 @@ interface ResolvedFloor<T extends FloorIds = FloorIds> extends FloorBase<T> {
/** /**
* *
*/ */
afterGetItem: Record<LocString, MotaEvent>; afterGetItem: Record<LocString, MotaAction>;
/** /**
* *

View File

@ -13,7 +13,7 @@
<div id="filter"> <div id="filter">
<a-select v-model:value="norm" class="select"> <a-select v-model:value="norm" class="select">
<a-select-option v-for="t of normList" :value="t">{{ <a-select-option v-for="t of normList" :value="t">{{
t === 'none' ? '所有' : label(t) t === 'none' ? '所有' : getStatusLabel(t)
}}</a-select-option> }}</a-select-option>
</a-select> </a-select>
<a-divider type="vertical" class="divider"></a-divider> <a-divider type="vertical" class="divider"></a-divider>
@ -191,12 +191,12 @@ import {
import Scroll from '../components/scroll.vue'; import Scroll from '../components/scroll.vue';
import { getAddStatus, getEquips, getNowStatus } from '../plugin/ui/equipbox'; import { getAddStatus, getEquips, getNowStatus } from '../plugin/ui/equipbox';
import BoxAnimate from '../components/boxAnimate.vue'; import BoxAnimate from '../components/boxAnimate.vue';
import { has, keycode, tip, type } from '../plugin/utils'; import { has, tip, type } from '../plugin/utils';
import { cancelGlobalDrag, isMobile, useDrag } from '../plugin/use'; import { cancelGlobalDrag, isMobile, useDrag } from '../plugin/use';
import { hyper, sleep } from 'mutate-animate'; import { hyper } from 'mutate-animate';
import { KeyCode } from '../plugin/keyCodes';
import { GameUi } from '@/core/main/custom/ui'; import { GameUi } from '@/core/main/custom/ui';
import { gameKey } from '@/core/main/init/hotkey'; import { gameKey } from '@/core/main/init/hotkey';
import { getStatusLabel } from '../plugin/utils';
const props = defineProps<{ const props = defineProps<{
num: number; num: number;
@ -223,8 +223,6 @@ const sType = ref<'value' | 'percentage'>('value');
// //
const normList = ['none', 'atk', 'def', 'hpmax', 'mana']; const normList = ['none', 'atk', 'def', 'hpmax', 'mana'];
const label = core.getStatusLabel;
watch(sort, n => { watch(sort, n => {
selected.value = toShow.value.length - selected.value - 1; selected.value = toShow.value.length - selected.value - 1;
}); });