mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-01-18 20:09:27 +08:00
完善装备栏、怪物手册,更新样板
This commit is contained in:
parent
bde0a4d1c0
commit
2f88272df8
3
.gitignore
vendored
3
.gitignore
vendored
@ -26,4 +26,5 @@ dist-ssr
|
|||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
|
|
||||||
dist.zip
|
dist.zip
|
||||||
|
story.md
|
@ -1,2 +1,3 @@
|
|||||||
vite.config.ts
|
vite.config.ts
|
||||||
public/project/data.js
|
public/project/data.js
|
||||||
|
story.md
|
14
idea.md
14
idea.md
@ -10,13 +10,14 @@
|
|||||||
- 抢夺:抢夺你的装备并使用(简单难度中,怪物使用时属性降低)
|
- 抢夺:抢夺你的装备并使用(简单难度中,怪物使用时属性降低)
|
||||||
- 抢夺 2.0:抢夺你的道具(怪物手册和楼传除外),并按照左上、右上、右下、左下的顺序依次放到地图的四角(简单无效)
|
- 抢夺 2.0:抢夺你的道具(怪物手册和楼传除外),并按照左上、右上、右下、左下的顺序依次放到地图的四角(简单无效)
|
||||||
- 抢夺 3.0:抢夺装备,但每过 10 回合便按照 2.0 方法扔至地图四角(因为怪物觉得装备不好使),然后重新抢夺你的装备(简单无效)
|
- 抢夺 3.0:抢夺装备,但每过 10 回合便按照 2.0 方法扔至地图四角(因为怪物觉得装备不好使),然后重新抢夺你的装备(简单无效)
|
||||||
- 天气之子:控制天气,包括下雨、下雪、晴天、阴天等,
|
|
||||||
|
|
||||||
#### Boss
|
#### Boss
|
||||||
|
|
||||||
音游,音乐为一个被遗忘的夜晚,可选简单与困难,困难可获得成就冰与火之舞
|
音游,音乐为一个被遗忘的夜晚,可选简单与困难,困难可获得成就冰与火之舞
|
||||||
|
|
||||||
玩法:一个会转动的圆盘,带有一个伸出去的把手,boss 从四面八方射子弹,当子弹恰好落到把手前端时,点击按键或屏幕,可以抵挡子弹,简单难度 3 条命,困难 1 条。简单难度音符密度低。困难难度为冰与火之舞的节奏。简单难度判定时间为前后各 150ms,困难为 75ms
|
玩法:一个会转动的圆盘,带有一个伸出去的把手,boss 从四面八方射子弹,当子弹恰好落到把手前端时,点击按键或屏幕,可以抵挡子弹,简单难度 3 条命,困难 1 条。简单难度音符密度低。困难难度为冰与火之舞的节奏。简单难度判定时间为前后各 100ms,困难为 50ms
|
||||||
|
|
||||||
|
### 第三章 战争
|
||||||
|
|
||||||
## 主角
|
## 主角
|
||||||
|
|
||||||
@ -32,6 +33,14 @@
|
|||||||
- 实时天气
|
- 实时天气
|
||||||
- 成就系统
|
- 成就系统
|
||||||
- 装备合成、装备(孔)强化
|
- 装备合成、装备(孔)强化
|
||||||
|
- 宝石目标设定
|
||||||
|
- 自动宝物规划,选中两个或更多宝物后自动在本地图中规划出最优拾取路线,原则是尽量减少其余宝物的捡拾,自动切换主动技能,怪物造成的伤害最低的路线
|
||||||
|
- 临界显示方式,宝石数还是数值
|
||||||
|
- 怪物目标设定
|
||||||
|
- 木牌查看系统
|
||||||
|
- 宝物目标设定
|
||||||
|
- 每个怪物加一个怪物说明
|
||||||
|
- 歌词展示系统
|
||||||
|
|
||||||
### 第二章 智慧
|
### 第二章 智慧
|
||||||
|
|
||||||
@ -39,6 +48,7 @@
|
|||||||
|
|
||||||
## 成就
|
## 成就
|
||||||
|
|
||||||
|
- 虚惊一场:打完山洞门口的怪只剩 1 滴血
|
||||||
- 学坏了:学习敌人的电摇嘲讽技能
|
- 学坏了:学习敌人的电摇嘲讽技能
|
||||||
- 我就是傻子:不学习反抢夺通过第二章
|
- 我就是傻子:不学习反抢夺通过第二章
|
||||||
- 真能刷:勇气之路的刷血怪刷到 15w 以上的血
|
- 真能刷:勇气之路的刷血怪刷到 15w 以上的血
|
||||||
|
@ -8,7 +8,8 @@
|
|||||||
"build": "vue-tsc && vite build && ts-node-esm script/compress.ts",
|
"build": "vue-tsc && vite build && ts-node-esm script/compress.ts",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"preview-node": "cd dist && node server.cjs",
|
"preview-node": "cd dist && node server.cjs",
|
||||||
"update": "ts-node-esm script/update.ts"
|
"update": "ts-node-esm script/update.ts",
|
||||||
|
"declare": "ts-node-esm script/declare.ts"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ant-design/icons-vue": "^6.1.0",
|
"@ant-design/icons-vue": "^6.1.0",
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
"use strict";
|
function items() {
|
||||||
|
|
||||||
function items () {
|
|
||||||
this._init();
|
this._init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11,7 +10,7 @@ items.prototype._init = function () {
|
|||||||
for (var itemId in this.items) {
|
for (var itemId in this.items) {
|
||||||
this.items[itemId].id = itemId;
|
this.items[itemId].id = itemId;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 获得所有道具 //////
|
////// 获得所有道具 //////
|
||||||
items.prototype.getItems = function () {
|
items.prototype.getItems = function () {
|
||||||
@ -23,7 +22,7 @@ items.prototype.getItems = function () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return items;
|
return items;
|
||||||
}
|
};
|
||||||
|
|
||||||
////// “即捡即用类”道具的使用效果 //////
|
////// “即捡即用类”道具的使用效果 //////
|
||||||
items.prototype.getItemEffect = function (itemId, itemNum) {
|
items.prototype.getItemEffect = function (itemId, itemNum) {
|
||||||
@ -34,10 +33,8 @@ items.prototype.getItemEffect = function (itemId, itemNum) {
|
|||||||
var itemEffect = core.material.items[itemId].itemEffect;
|
var itemEffect = core.material.items[itemId].itemEffect;
|
||||||
if (itemEffect) {
|
if (itemEffect) {
|
||||||
try {
|
try {
|
||||||
for (var i = 0; i < itemNum; ++i)
|
for (var i = 0; i < itemNum; ++i) eval(itemEffect);
|
||||||
eval(itemEffect);
|
} catch (e) {
|
||||||
}
|
|
||||||
catch (e) {
|
|
||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -47,17 +44,15 @@ items.prototype.getItemEffect = function (itemId, itemNum) {
|
|||||||
if (useItemEvent) {
|
if (useItemEvent) {
|
||||||
try {
|
try {
|
||||||
core.insertAction(useItemEvent);
|
core.insertAction(useItemEvent);
|
||||||
}
|
} catch (e) {
|
||||||
catch (e) {
|
|
||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
core.updateStatusBar(false, true);
|
core.updateStatusBar(false, true);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
core.addItem(itemId, itemNum);
|
core.addItem(itemId, itemNum);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
////// “即捡即用类”道具的文字提示 //////
|
////// “即捡即用类”道具的文字提示 //////
|
||||||
items.prototype.getItemEffectTip = function (itemId) {
|
items.prototype.getItemEffectTip = function (itemId) {
|
||||||
@ -67,15 +62,15 @@ items.prototype.getItemEffectTip = function (itemId) {
|
|||||||
var itemEffectTip = core.material.items[itemId].itemEffectTip;
|
var itemEffectTip = core.material.items[itemId].itemEffectTip;
|
||||||
if (itemEffectTip) {
|
if (itemEffectTip) {
|
||||||
try {
|
try {
|
||||||
return core.replaceText(itemEffectTip) || "";
|
return core.replaceText(itemEffectTip) || '';
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
return "";
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "";
|
return '';
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 使用道具 //////
|
////// 使用道具 //////
|
||||||
items.prototype.useItem = function (itemId, noRoute, callback) {
|
items.prototype.useItem = function (itemId, noRoute, callback) {
|
||||||
@ -88,17 +83,16 @@ items.prototype.useItem = function (itemId, noRoute, callback) {
|
|||||||
// 执行完毕
|
// 执行完毕
|
||||||
this._afterUseItem(itemId);
|
this._afterUseItem(itemId);
|
||||||
// 记录路线
|
// 记录路线
|
||||||
if (!noRoute) core.status.route.push("item:" + itemId);
|
if (!noRoute) core.status.route.push('item:' + itemId);
|
||||||
if (callback) callback();
|
if (callback) callback();
|
||||||
}
|
};
|
||||||
|
|
||||||
items.prototype._useItemEffect = function (itemId) {
|
items.prototype._useItemEffect = function (itemId) {
|
||||||
var useItemEffect = core.material.items[itemId].useItemEffect;
|
var useItemEffect = core.material.items[itemId].useItemEffect;
|
||||||
if (useItemEffect) {
|
if (useItemEffect) {
|
||||||
try {
|
try {
|
||||||
eval(useItemEffect);
|
eval(useItemEffect);
|
||||||
}
|
} catch (e) {
|
||||||
catch (e) {
|
|
||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -106,22 +100,20 @@ items.prototype._useItemEffect = function (itemId) {
|
|||||||
if (useItemEvent) {
|
if (useItemEvent) {
|
||||||
try {
|
try {
|
||||||
core.insertAction(useItemEvent);
|
core.insertAction(useItemEvent);
|
||||||
}
|
} catch (e) {
|
||||||
catch (e) {
|
|
||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
items.prototype._afterUseItem = function (itemId) {
|
items.prototype._afterUseItem = function (itemId) {
|
||||||
// 道具使用完毕:删除
|
// 道具使用完毕:删除
|
||||||
var itemCls = core.material.items[itemId].cls;
|
var itemCls = core.material.items[itemId].cls;
|
||||||
if (itemCls == 'tools')
|
if (itemCls == 'tools') core.status.hero.items[itemCls][itemId]--;
|
||||||
core.status.hero.items[itemCls][itemId]--;
|
|
||||||
if (core.status.hero.items[itemCls][itemId] <= 0)
|
if (core.status.hero.items[itemCls][itemId] <= 0)
|
||||||
delete core.status.hero.items[itemCls][itemId];
|
delete core.status.hero.items[itemCls][itemId];
|
||||||
core.updateStatusBar(false, true);
|
core.updateStatusBar(false, true);
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 当前能否使用道具 //////
|
////// 当前能否使用道具 //////
|
||||||
items.prototype.canUseItem = function (itemId) {
|
items.prototype.canUseItem = function (itemId) {
|
||||||
@ -132,41 +124,40 @@ items.prototype.canUseItem = function (itemId) {
|
|||||||
if (canUseItemEffect) {
|
if (canUseItemEffect) {
|
||||||
try {
|
try {
|
||||||
return eval(canUseItemEffect);
|
return eval(canUseItemEffect);
|
||||||
}
|
} catch (e) {
|
||||||
catch (e) {
|
|
||||||
console.error(e);
|
console.error(e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 获得某个物品的个数 //////
|
////// 获得某个物品的个数 //////
|
||||||
items.prototype.itemCount = function (itemId) {
|
items.prototype.itemCount = function (itemId) {
|
||||||
if (!core.material.items[itemId] || !core.isPlaying()) return 0;
|
if (!core.material.items[itemId] || !core.isPlaying()) return 0;
|
||||||
var itemCls = core.material.items[itemId].cls;
|
var itemCls = core.material.items[itemId].cls;
|
||||||
if (itemCls == "items") return 0;
|
if (itemCls == 'items') return 0;
|
||||||
return core.status.hero.items[itemCls][itemId] || 0;
|
return core.status.hero.items[itemCls][itemId] || 0;
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 是否存在某个物品 //////
|
////// 是否存在某个物品 //////
|
||||||
items.prototype.hasItem = function (itemId) {
|
items.prototype.hasItem = function (itemId) {
|
||||||
return this.itemCount(itemId) > 0;
|
return this.itemCount(itemId) > 0;
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 是否装备某件装备 //////
|
////// 是否装备某件装备 //////
|
||||||
items.prototype.hasEquip = function (itemId) {
|
items.prototype.hasEquip = function (itemId) {
|
||||||
if (!(core.material.items[itemId] || {}).equip || !core.isPlaying()) return null;
|
if (!(core.material.items[itemId] || {}).equip || !core.isPlaying())
|
||||||
|
return null;
|
||||||
|
|
||||||
for (var i in core.status.hero.equipment)
|
for (var i in core.status.hero.equipment)
|
||||||
if (core.status.hero.equipment[i] == itemId)
|
if (core.status.hero.equipment[i] == itemId) return true;
|
||||||
return true;
|
return false;
|
||||||
return false
|
};
|
||||||
}
|
|
||||||
|
|
||||||
////// 获得某个装备类型的当前装备 //////
|
////// 获得某个装备类型的当前装备 //////
|
||||||
items.prototype.getEquip = function (equipType) {
|
items.prototype.getEquip = function (equipType) {
|
||||||
return core.status.hero.equipment[equipType] || null;
|
return core.status.hero.equipment[equipType] || null;
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 设置某个物品的个数 //////
|
////// 设置某个物品的个数 //////
|
||||||
items.prototype.setItem = function (itemId, itemNum) {
|
items.prototype.setItem = function (itemId, itemNum) {
|
||||||
@ -179,7 +170,7 @@ items.prototype.setItem = function (itemId, itemNum) {
|
|||||||
delete core.status.hero.items[itemCls][itemId];
|
delete core.status.hero.items[itemCls][itemId];
|
||||||
}
|
}
|
||||||
core.updateStatusBar();
|
core.updateStatusBar();
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 增加某个物品的个数 //////
|
////// 增加某个物品的个数 //////
|
||||||
items.prototype.addItem = function (itemId, itemNum) {
|
items.prototype.addItem = function (itemId, itemNum) {
|
||||||
@ -198,7 +189,7 @@ items.prototype.addItem = function (itemId, itemNum) {
|
|||||||
if (itemCls == 'constants' && core.status.hero.items[itemCls][itemId] > 1)
|
if (itemCls == 'constants' && core.status.hero.items[itemCls][itemId] > 1)
|
||||||
core.status.hero.items[itemCls][itemId] = 1;
|
core.status.hero.items[itemCls][itemId] = 1;
|
||||||
core.updateStatusBar();
|
core.updateStatusBar();
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 删除某个物品 //////
|
////// 删除某个物品 //////
|
||||||
items.prototype.removeItem = function (itemId, itemNum) {
|
items.prototype.removeItem = function (itemId, itemNum) {
|
||||||
@ -211,7 +202,7 @@ items.prototype.removeItem = function (itemId, itemNum) {
|
|||||||
}
|
}
|
||||||
core.updateStatusBar();
|
core.updateStatusBar();
|
||||||
return true;
|
return true;
|
||||||
}
|
};
|
||||||
|
|
||||||
// ---------- 装备相关 ------------ //
|
// ---------- 装备相关 ------------ //
|
||||||
|
|
||||||
@ -225,14 +216,13 @@ items.prototype.getEquipTypeByName = function (name) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return types.length == 1 ? types[0] : -1;
|
return types.length == 1 ? types[0] : -1;
|
||||||
}
|
};
|
||||||
|
|
||||||
items.prototype.getEquipTypeById = function (equipId) {
|
items.prototype.getEquipTypeById = function (equipId) {
|
||||||
var type = core.material.items[equipId].equip.type;
|
var type = core.material.items[equipId].equip.type;
|
||||||
if (typeof type == 'string')
|
if (typeof type == 'string') type = this.getEquipTypeByName(type);
|
||||||
type = this.getEquipTypeByName(type);
|
|
||||||
return type;
|
return type;
|
||||||
}
|
};
|
||||||
|
|
||||||
// 当前能否撞上某装备
|
// 当前能否撞上某装备
|
||||||
items.prototype.canEquip = function (equipId, hint) {
|
items.prototype.canEquip = function (equipId, hint) {
|
||||||
@ -241,7 +231,7 @@ items.prototype.canEquip = function (equipId, hint) {
|
|||||||
if (!equip.equip) {
|
if (!equip.equip) {
|
||||||
if (hint) {
|
if (hint) {
|
||||||
core.playSound('操作失败');
|
core.playSound('操作失败');
|
||||||
core.drawTip("不合法的装备!");
|
core.drawTip('不合法的装备!');
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -250,7 +240,7 @@ items.prototype.canEquip = function (equipId, hint) {
|
|||||||
if (!core.hasItem(equipId) && !core.hasEquip(equipId)) {
|
if (!core.hasItem(equipId) && !core.hasEquip(equipId)) {
|
||||||
if (hint) {
|
if (hint) {
|
||||||
core.playSound('操作失败');
|
core.playSound('操作失败');
|
||||||
core.drawTip("你当前没有" + equip.name + ",无法换装");
|
core.drawTip('你当前没有' + equip.name + ',无法换装');
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -262,18 +252,17 @@ items.prototype.canEquip = function (equipId, hint) {
|
|||||||
if (!eval(canUseItemEffect)) {
|
if (!eval(canUseItemEffect)) {
|
||||||
if (hint) {
|
if (hint) {
|
||||||
core.playSound('操作失败');
|
core.playSound('操作失败');
|
||||||
core.drawTip("当前不可换上" + equip.name);
|
core.drawTip('当前不可换上' + equip.name);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
} catch (e) {
|
||||||
catch (e) {
|
|
||||||
console.error(e);
|
console.error(e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 换上 //////
|
////// 换上 //////
|
||||||
items.prototype.loadEquip = function (equipId, callback) {
|
items.prototype.loadEquip = function (equipId, callback) {
|
||||||
@ -286,13 +275,18 @@ items.prototype.loadEquip = function (equipId, callback) {
|
|||||||
var type = this.getEquipTypeById(equipId);
|
var type = this.getEquipTypeById(equipId);
|
||||||
if (type < 0) {
|
if (type < 0) {
|
||||||
core.playSound('操作失败');
|
core.playSound('操作失败');
|
||||||
core.drawTip("当前没有" + loadEquip.equip.type + "的空位!");
|
core.drawTip('当前没有' + loadEquip.equip.type + '的空位!');
|
||||||
if (callback) callback();
|
if (callback) callback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._realLoadEquip(type, equipId, core.status.hero.equipment[type], callback);
|
this._realLoadEquip(
|
||||||
}
|
type,
|
||||||
|
equipId,
|
||||||
|
core.status.hero.equipment[type],
|
||||||
|
callback
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
////// 卸下 //////
|
////// 卸下 //////
|
||||||
items.prototype.unloadEquip = function (equipType, callback) {
|
items.prototype.unloadEquip = function (equipType, callback) {
|
||||||
@ -303,11 +297,15 @@ items.prototype.unloadEquip = function (equipType, callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._realLoadEquip(equipType, null, unloadEquipId, callback);
|
this._realLoadEquip(equipType, null, unloadEquipId, callback);
|
||||||
}
|
};
|
||||||
|
|
||||||
items.prototype.compareEquipment = function (compareEquipId, beComparedEquipId) {
|
items.prototype.compareEquipment = function (
|
||||||
var result = { "value": {}, "percentage": {} };
|
compareEquipId,
|
||||||
var first = core.material.items[compareEquipId], second = core.material.items[beComparedEquipId];
|
beComparedEquipId
|
||||||
|
) {
|
||||||
|
var result = { value: {}, percentage: {} };
|
||||||
|
var first = core.material.items[compareEquipId],
|
||||||
|
second = core.material.items[beComparedEquipId];
|
||||||
for (var one in result) {
|
for (var one in result) {
|
||||||
for (var name in core.status.hero) {
|
for (var name in core.status.hero) {
|
||||||
if (typeof core.status.hero[name] == 'number') {
|
if (typeof core.status.hero[name] == 'number') {
|
||||||
@ -319,7 +317,7 @@ items.prototype.compareEquipment = function (compareEquipId, beComparedEquipId)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 实际换装的效果 //////
|
////// 实际换装的效果 //////
|
||||||
items.prototype._loadEquipEffect = function (equipId, unloadEquipId) {
|
items.prototype._loadEquipEffect = function (equipId, unloadEquipId) {
|
||||||
@ -329,12 +327,12 @@ items.prototype._loadEquipEffect = function (equipId, unloadEquipId) {
|
|||||||
for (var name in result.percentage)
|
for (var name in result.percentage)
|
||||||
core.addBuff(name, result.percentage[name] / 100);
|
core.addBuff(name, result.percentage[name] / 100);
|
||||||
|
|
||||||
for (var name in result.value)
|
for (var name in result.value) core.status.hero[name] += result.value[name];
|
||||||
core.status.hero[name] += result.value[name];
|
};
|
||||||
}
|
|
||||||
|
|
||||||
items.prototype._realLoadEquip = function (type, loadId, unloadId, callback) {
|
items.prototype._realLoadEquip = function (type, loadId, unloadId, callback) {
|
||||||
var loadEquip = core.material.items[loadId] || {}, unloadEquip = core.material.items[unloadId] || {};
|
var loadEquip = core.material.items[loadId] || {},
|
||||||
|
unloadEquip = core.material.items[unloadId] || {};
|
||||||
|
|
||||||
// --- 音效
|
// --- 音效
|
||||||
this._realLoadEquip_playSound();
|
this._realLoadEquip_playSound();
|
||||||
@ -348,44 +346,43 @@ items.prototype._realLoadEquip = function (type, loadId, unloadId, callback) {
|
|||||||
core.status.hero.equipment[type] = loadId || null;
|
core.status.hero.equipment[type] = loadId || null;
|
||||||
|
|
||||||
// --- 提示
|
// --- 提示
|
||||||
if (loadId) core.drawTip("已装备上" + loadEquip.name, loadId);
|
if (loadId) core.drawTip('已装备上' + loadEquip.name, loadId);
|
||||||
else if (unloadId) core.drawTip("已卸下" + unloadEquip.name, unloadId);
|
else if (unloadId) core.drawTip('已卸下' + unloadEquip.name, unloadId);
|
||||||
|
|
||||||
if (callback) callback();
|
if (callback) callback();
|
||||||
}
|
};
|
||||||
|
|
||||||
items.prototype._realLoadEquip_playSound = function () {
|
items.prototype._realLoadEquip_playSound = function () {
|
||||||
if (core.hasFlag("__quickLoadEquip__")) return;
|
if (core.hasFlag('__quickLoadEquip__')) return;
|
||||||
core.stopSound();
|
core.stopSound();
|
||||||
core.playSound('穿脱装备');
|
core.playSound('穿脱装备');
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 保存装备 //////
|
////// 保存装备 //////
|
||||||
items.prototype.quickSaveEquip = function (index) {
|
items.prototype.quickSaveEquip = function (index) {
|
||||||
var saveEquips = core.getFlag("saveEquips", []);
|
var saveEquips = core.getFlag('saveEquips', []);
|
||||||
saveEquips[index] = core.clone(core.status.hero.equipment);
|
saveEquips[index] = core.clone(core.status.hero.equipment);
|
||||||
core.setFlag("saveEquips", saveEquips);
|
core.setFlag('saveEquips', saveEquips);
|
||||||
core.status.route.push("saveEquip:" + index);
|
core.status.route.push('saveEquip:' + index);
|
||||||
core.drawTip("已保存" + index + "号套装");
|
core.drawTip('已保存' + index + '号套装');
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 读取装备 //////
|
////// 读取装备 //////
|
||||||
items.prototype.quickLoadEquip = function (index) {
|
items.prototype.quickLoadEquip = function (index) {
|
||||||
var current = core.getFlag("saveEquips", [])[index];
|
var current = core.getFlag('saveEquips', [])[index];
|
||||||
if (!current) {
|
if (!current) {
|
||||||
core.playSound('操作失败');
|
core.playSound('操作失败');
|
||||||
core.drawTip(index + "号套装不存在");
|
core.drawTip(index + '号套装不存在');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 检查所有的装备
|
// 检查所有的装备
|
||||||
var equipSize = core.status.globalAttribute.equipName.length;
|
var equipSize = core.status.globalAttribute.equipName.length;
|
||||||
for (var i = 0; i < equipSize; i++) {
|
for (var i = 0; i < equipSize; i++) {
|
||||||
var v = current[i];
|
var v = current[i];
|
||||||
if (v && !this.canEquip(v, true))
|
if (v && !this.canEquip(v, true)) return;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
core.status.route.push("loadEquip:" + index);
|
core.status.route.push('loadEquip:' + index);
|
||||||
core.setFlag("__quickLoadEquip__", true);
|
core.setFlag('__quickLoadEquip__', true);
|
||||||
// 快速换装
|
// 快速换装
|
||||||
var toEquip = [];
|
var toEquip = [];
|
||||||
for (var i = 0; i < equipSize; i++) {
|
for (var i = 0; i < equipSize; i++) {
|
||||||
@ -405,25 +402,39 @@ items.prototype.quickLoadEquip = function (index) {
|
|||||||
this.loadEquip(to);
|
this.loadEquip(to);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
core.removeFlag("__quickLoadEquip__");
|
core.removeFlag('__quickLoadEquip__');
|
||||||
this._realLoadEquip_playSound();
|
this._realLoadEquip_playSound();
|
||||||
|
|
||||||
core.drawTip("成功换上" + index + "号套装");
|
core.drawTip('成功换上' + index + '号套装');
|
||||||
}
|
};
|
||||||
|
|
||||||
////// 设置装备属性 //////
|
////// 设置装备属性 //////
|
||||||
items.prototype.setEquip = function (equipId, valueType, name, value, operator, prefix) {
|
items.prototype.setEquip = function (
|
||||||
|
equipId,
|
||||||
|
valueType,
|
||||||
|
name,
|
||||||
|
value,
|
||||||
|
operator,
|
||||||
|
prefix
|
||||||
|
) {
|
||||||
var equip = core.material.items[equipId];
|
var equip = core.material.items[equipId];
|
||||||
if (!equip || equip.cls != 'equips') return;
|
if (!equip || equip.cls != 'equips') return;
|
||||||
var equipInfo = equip.equip || {};
|
var equipInfo = equip.equip || {};
|
||||||
if (!equipInfo[valueType]) equipInfo[valueType] = {};
|
if (!equipInfo[valueType]) equipInfo[valueType] = {};
|
||||||
var toEquipInfo = core.clone(equipInfo);
|
var toEquipInfo = core.clone(equipInfo);
|
||||||
toEquipInfo[valueType][name] = core.events._updateValueByOperator(core.calValue(value, prefix), equipInfo[valueType][name], operator);
|
toEquipInfo[valueType][name] = core.events._updateValueByOperator(
|
||||||
|
core.calValue(value, prefix),
|
||||||
|
equipInfo[valueType][name],
|
||||||
|
operator
|
||||||
|
);
|
||||||
// 如果是穿上状态,则还需要直接修改当前数值
|
// 如果是穿上状态,则还需要直接修改当前数值
|
||||||
if (core.hasEquip(equipId)) {
|
if (core.hasEquip(equipId)) {
|
||||||
// 设置一个临时装备,然后模拟换装操作
|
// 设置一个临时装备,然后模拟换装操作
|
||||||
var tempId = 'temp:' + equipId;
|
var tempId = 'temp:' + equipId;
|
||||||
core.material.items[tempId] = { 'cls': 'equips', 'equip': core.clone(toEquipInfo) };
|
core.material.items[tempId] = {
|
||||||
|
cls: 'equips',
|
||||||
|
equip: core.clone(toEquipInfo)
|
||||||
|
};
|
||||||
this._loadEquipEffect(tempId, equipId);
|
this._loadEquipEffect(tempId, equipId);
|
||||||
delete core.material.items[tempId];
|
delete core.material.items[tempId];
|
||||||
core.updateStatusBar();
|
core.updateStatusBar();
|
||||||
@ -431,4 +442,4 @@ items.prototype.setEquip = function (equipId, valueType, name, value, operator,
|
|||||||
equip.equip = core.clone(toEquipInfo);
|
equip.equip = core.clone(toEquipInfo);
|
||||||
flags.equipInfo = flags.equipInfo || {};
|
flags.equipInfo = flags.equipInfo || {};
|
||||||
flags.equipInfo[equipId] = core.clone(toEquipInfo);
|
flags.equipInfo[equipId] = core.clone(toEquipInfo);
|
||||||
}
|
};
|
||||||
|
@ -43,6 +43,8 @@ next();
|
|||||||
|
|
||||||
let repStart;
|
let repStart;
|
||||||
|
|
||||||
|
const listenedFloors = [];
|
||||||
|
|
||||||
// ----- GET file
|
// ----- GET file
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -169,6 +171,11 @@ async function writeFile(req, res) {
|
|||||||
const type = /^type=(utf8|base64)/.exec(data)[0].slice(5);
|
const type = /^type=(utf8|base64)/.exec(data)[0].slice(5);
|
||||||
const value = /&value=[^]+/.exec(data)[0].slice(7);
|
const value = /&value=[^]+/.exec(data)[0].slice(7);
|
||||||
await fs.writeFile(dir, value, { encoding: type });
|
await fs.writeFile(dir, value, { encoding: type });
|
||||||
|
testWatchFloor(name);
|
||||||
|
if (name.endsWith('project/events.js')) doDeclaration('events', value);
|
||||||
|
if (name.endsWith('project/items.js')) doDeclaration('items', value);
|
||||||
|
if (name.endsWith('project/maps.js')) doDeclaration('maps', value);
|
||||||
|
if (name.endsWith('project/data.js')) doDeclaration('data', value);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
res.end(
|
res.end(
|
||||||
@ -226,9 +233,14 @@ async function writeMultiFiles(req, res) {
|
|||||||
const tasks = names.map((v, i) => {
|
const tasks = names.map((v, i) => {
|
||||||
try {
|
try {
|
||||||
return new Promise(res => {
|
return new Promise(res => {
|
||||||
fs.writeFile(path.resolve(__dirname, v), value[i]).then(v =>
|
fs.writeFile(
|
||||||
res(`write ${v} success.`)
|
path.resolve(__dirname, v),
|
||||||
);
|
value[i],
|
||||||
|
'base64' // 多文件是base64写入的
|
||||||
|
).then(v => {
|
||||||
|
testWatchFloor(v);
|
||||||
|
res(`write ${v} success.`);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
} catch {
|
} catch {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
@ -313,13 +325,11 @@ async function watch() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// 楼层,热重载
|
// 楼层 热重载
|
||||||
fss.watch(path.resolve(__dirname, 'project/floors/'), (a, b) => {
|
// 注意这里要逐个监听,并通过创建文件来监听文件改变
|
||||||
if (!/^\w+\.js$/.test(b)) return;
|
const floors = await extract('project/floors/*.js');
|
||||||
const floorId = b.slice(0, -3);
|
floors.forEach(v => {
|
||||||
if (hotReloadData.includes(`@@floor:${floorId}`)) return;
|
watchOneFloor(v.slice(15));
|
||||||
hotReloadData += `@@floor:${floorId}`;
|
|
||||||
console.log(`floor hot reload: ${floorId}`);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 脚本编辑 及 插件 热重载
|
// 脚本编辑 及 插件 热重载
|
||||||
@ -347,6 +357,35 @@ async function watch() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测是否是楼层文件并进行监听
|
||||||
|
* @param {string} url 要测试的路径
|
||||||
|
*/
|
||||||
|
function testWatchFloor(url) {
|
||||||
|
if (/project(\/|\\)floors(\/|\\).*\.js/.test(url)) {
|
||||||
|
const f = url.slice(15);
|
||||||
|
if (!listenedFloors.includes(f.slice(0, -3))) {
|
||||||
|
watchOneFloor(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听一个楼层文件
|
||||||
|
* @param {string} file 要监听的文件
|
||||||
|
*/
|
||||||
|
function watchOneFloor(file) {
|
||||||
|
if (!/.*\.js/.test(file)) return;
|
||||||
|
const f = file.slice(0, -3);
|
||||||
|
listenedFloors.push(file.slice(0, -3));
|
||||||
|
fss.watchFile(`project/floors/${file}`, { interval: 100 }, () => {
|
||||||
|
const floorId = f;
|
||||||
|
if (hotReloadData.includes(`@@floor:${floorId}`)) return;
|
||||||
|
hotReloadData += `@@floor:${floorId}`;
|
||||||
|
console.log(`floor hot reload: ${floorId}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改部分文件后重新加载及热重载
|
* 修改部分文件后重新加载及热重载
|
||||||
* @param {http.IncomingMessage} req
|
* @param {http.IncomingMessage} req
|
||||||
@ -555,6 +594,96 @@ async function replaySave(req, res) {
|
|||||||
res.end('success');
|
res.end('success');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----- declaration
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 声明某种类型
|
||||||
|
* @param {string} type 类型
|
||||||
|
* @param {string} data 信息
|
||||||
|
*/
|
||||||
|
async function doDeclaration(type, data) {
|
||||||
|
const buf = Buffer.from(data, 'base64');
|
||||||
|
data = buf.toString('utf-8');
|
||||||
|
if (type === 'events') {
|
||||||
|
// 事件
|
||||||
|
const eventData = JSON.parse(data.split('\n').slice(1).join(''));
|
||||||
|
|
||||||
|
let eventDec = 'type EventDeclaration = \n';
|
||||||
|
for (const id in eventData.commonEvent) {
|
||||||
|
eventDec += ` | '${id}'\n`;
|
||||||
|
}
|
||||||
|
await fs.writeFile('../src/source/events.d.ts', eventDec, 'utf-8');
|
||||||
|
} else if (type === 'items') {
|
||||||
|
// 道具
|
||||||
|
const itemData = JSON.parse(data.split('\n').slice(1).join(''));
|
||||||
|
|
||||||
|
let itemDec = 'interface ItemDeclaration {\n';
|
||||||
|
for (const id in itemData) {
|
||||||
|
itemDec += ` ${id}: '${itemData[id].cls}';\n`;
|
||||||
|
}
|
||||||
|
itemDec += '}';
|
||||||
|
await fs.writeFile('../src/source/items.d.ts', itemDec, 'utf-8');
|
||||||
|
} else if (type === 'maps') {
|
||||||
|
// 映射
|
||||||
|
const d = JSON.parse(data.split('\n').slice(1).join(''));
|
||||||
|
|
||||||
|
let id2num = 'interface IdToNumber {\n';
|
||||||
|
let num2id = 'interface NumberToId {\n';
|
||||||
|
let id2cls = 'interface IdToCls {\n';
|
||||||
|
for (const num in d) {
|
||||||
|
const { id, cls } = d[num];
|
||||||
|
id2num += ` ${id}: ${num};\n`;
|
||||||
|
num2id += ` ${num}: '${id}';\n`;
|
||||||
|
id2cls += ` ${id}: '${cls}';\n`;
|
||||||
|
}
|
||||||
|
id2cls += '}';
|
||||||
|
id2num += '}';
|
||||||
|
num2id += '}';
|
||||||
|
await fs.writeFile('../src/source/cls.d.ts', id2cls, 'utf-8');
|
||||||
|
await fs.writeFile(
|
||||||
|
'../src/source/maps.d.ts',
|
||||||
|
`${id2num}\n${num2id}`,
|
||||||
|
'utf-8'
|
||||||
|
);
|
||||||
|
} else if (type === 'data') {
|
||||||
|
// 全塔属性的注册信息
|
||||||
|
const d = JSON.parse(data.split('\n').slice(1).join('')).main;
|
||||||
|
|
||||||
|
let floorId = 'type FloorIds =\n';
|
||||||
|
let imgs = 'type ImageIds =\n';
|
||||||
|
let anis = 'type AnimationIds =\n';
|
||||||
|
let sounds = 'type SoundIds =\n';
|
||||||
|
let names = 'interface NameMap {\n';
|
||||||
|
let bgms = 'type BgmIds =\n';
|
||||||
|
let fonts = 'type FontIds =\n';
|
||||||
|
|
||||||
|
floorId += d.floorIds.map(v => ` | '${v}'\n`).join('');
|
||||||
|
imgs += d.images.map(v => ` | '${v}'\n`).join('');
|
||||||
|
anis += d.animates.map(v => ` | '${v}'\n`).join('');
|
||||||
|
sounds += d.sounds.map(v => ` | '${v}'\n`).join('');
|
||||||
|
bgms += d.bgms.map(v => ` | '${v}'\n`).join('');
|
||||||
|
fonts += d.fonts.map(v => ` | '${v}'\n`).join('');
|
||||||
|
for (const name in d.nameMap) {
|
||||||
|
names += ` '${name}': '${d.nameMap[name]}';\n`;
|
||||||
|
}
|
||||||
|
names += '}';
|
||||||
|
|
||||||
|
await fs.writeFile(
|
||||||
|
'../src/source/data.d.ts',
|
||||||
|
`
|
||||||
|
${floorId}
|
||||||
|
${d.images.length > 0 ? imgs : 'type ImageIds = never\n'}
|
||||||
|
${d.animates.length > 0 ? anis : 'type AnimationIds = never\n'}
|
||||||
|
${d.sounds.length > 0 ? sounds : 'type SoundIds = never\n'}
|
||||||
|
${d.bgms.length > 0 ? bgms : 'type BgmIds = never\n'}
|
||||||
|
${d.fonts.length > 0 ? fonts : 'type FontIds = never\n'}
|
||||||
|
${names}
|
||||||
|
`,
|
||||||
|
'utf-8'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ----- server
|
// ----- server
|
||||||
|
|
||||||
server.on('listening', () => {
|
server.on('listening', () => {
|
||||||
|
85
script/declare.ts
Normal file
85
script/declare.ts
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
import fs from 'fs/promises';
|
||||||
|
|
||||||
|
(async function () {
|
||||||
|
// 1. 声明道具
|
||||||
|
const item = await fs.readFile('./public/project/items.js', 'utf-8');
|
||||||
|
const itemData = JSON.parse(item.split('\n').slice(1).join('')) as any;
|
||||||
|
|
||||||
|
let itemDec = 'interface ItemDeclaration {\n';
|
||||||
|
for (const id in itemData) {
|
||||||
|
itemDec += ` ${id}: '${itemData[id].cls}';\n`;
|
||||||
|
}
|
||||||
|
itemDec += '}';
|
||||||
|
|
||||||
|
// 2. 声明公共事件
|
||||||
|
const event = await fs.readFile('./public/project/events.js', 'utf-8');
|
||||||
|
const eventData = JSON.parse(event.split('\n').slice(1).join('')) as any;
|
||||||
|
|
||||||
|
let eventDec = 'type EventDeclaration = \n';
|
||||||
|
for (const id in eventData.commonEvent) {
|
||||||
|
eventDec += ` | '${id}'\n`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 声明数字id映射与cls映射
|
||||||
|
const map = await fs.readFile('./public/project/maps.js', 'utf-8');
|
||||||
|
const mapData = JSON.parse(map.split('\n').slice(1).join('')) as any;
|
||||||
|
|
||||||
|
let id2num = 'interface IdToNumber {\n';
|
||||||
|
let num2id = 'interface NumberToId {\n';
|
||||||
|
let id2cls = 'interface IdToCls {\n';
|
||||||
|
for (const num in mapData) {
|
||||||
|
const { id, cls } = mapData[num];
|
||||||
|
id2num += ` ${id}: ${num};\n`;
|
||||||
|
num2id += ` ${num}: '${id}';\n`;
|
||||||
|
id2cls += ` ${id}: '${cls}';\n`;
|
||||||
|
}
|
||||||
|
id2cls += '}';
|
||||||
|
id2num += '}';
|
||||||
|
num2id += '}';
|
||||||
|
|
||||||
|
// 4. 声明楼层id,图片,动画,音效,文件别名,背景音乐,字体
|
||||||
|
const data = await fs.readFile('./public/project/data.js', 'utf-8');
|
||||||
|
const d = (JSON.parse(data.split('\n').slice(1).join('')) as any).main;
|
||||||
|
|
||||||
|
let floorId = 'type FloorIds =\n';
|
||||||
|
let imgs = 'type ImageIds =\n';
|
||||||
|
let anis = 'type AnimationIds =\n';
|
||||||
|
let sounds = 'type SoundIds =\n';
|
||||||
|
let names = 'interface NameMap {\n';
|
||||||
|
let bgms = 'type BgmIds =\n';
|
||||||
|
let fonts = 'type FontIds =\n';
|
||||||
|
|
||||||
|
floorId += d.floorIds.map((v: string) => ` | '${v}'\n`).join('');
|
||||||
|
imgs += d.images.map((v: string) => ` | '${v}'\n`).join('');
|
||||||
|
anis += d.animates.map((v: string) => ` | '${v}'\n`).join('');
|
||||||
|
sounds += d.sounds.map((v: string) => ` | '${v}'\n`).join('');
|
||||||
|
bgms += d.bgms.map((v: string) => ` | '${v}'\n`).join('');
|
||||||
|
fonts += d.fonts.map((v: string) => ` | '${v}'\n`).join('');
|
||||||
|
for (const name in d.nameMap) {
|
||||||
|
names += ` '${name}': '${d.nameMap[name]}';\n`;
|
||||||
|
}
|
||||||
|
names += '}';
|
||||||
|
|
||||||
|
// 5. 写入文件
|
||||||
|
await fs.writeFile('./src/source/cls.d.ts', id2cls, 'utf-8');
|
||||||
|
await fs.writeFile('./src/source/events.d.ts', eventDec, 'utf-8');
|
||||||
|
await fs.writeFile('./src/source/items.d.ts', itemDec, 'utf-8');
|
||||||
|
await fs.writeFile(
|
||||||
|
'./src/source/maps.d.ts',
|
||||||
|
`${id2num}\n${num2id}`,
|
||||||
|
'utf-8'
|
||||||
|
);
|
||||||
|
await fs.writeFile(
|
||||||
|
'./src/source/data.d.ts',
|
||||||
|
`
|
||||||
|
${floorId}
|
||||||
|
${d.images.length > 0 ? imgs : 'type ImageIds = never\n'}
|
||||||
|
${d.animates.length > 0 ? anis : 'type AnimationIds = never\n'}
|
||||||
|
${d.sounds.length > 0 ? sounds : 'type SoundIds = never\n'}
|
||||||
|
${d.bgms.length > 0 ? bgms : 'type BgmIds = never\n'}
|
||||||
|
${d.fonts.length > 0 ? fonts : 'type FontIds = never\n'}
|
||||||
|
${names}
|
||||||
|
`,
|
||||||
|
'utf-8'
|
||||||
|
);
|
||||||
|
})();
|
@ -75,7 +75,7 @@ export function getDefDamage(
|
|||||||
if (!has(dam)) continue;
|
if (!has(dam)) continue;
|
||||||
if (dam.damage === origin) continue;
|
if (dam.damage === origin) continue;
|
||||||
if (dam.damage === res.at(-1)?.[1]) continue;
|
if (dam.damage === res.at(-1)?.[1]) continue;
|
||||||
if (last <= 0) break;
|
if (last === dam.damage) break;
|
||||||
last = dam.damage;
|
last = dam.damage;
|
||||||
res.push([ratio * i + addDef, dam.damage]);
|
res.push([ratio * i + addDef, dam.damage]);
|
||||||
}
|
}
|
||||||
@ -121,7 +121,7 @@ export function getCriticalDamage(
|
|||||||
if (!has(dam)) continue;
|
if (!has(dam)) continue;
|
||||||
if (dam.damage === origin) continue;
|
if (dam.damage === origin) continue;
|
||||||
if (dam.damage === res.at(-1)?.[1]) continue;
|
if (dam.damage === res.at(-1)?.[1]) continue;
|
||||||
if (last <= 0) break;
|
if (last === dam.damage) break;
|
||||||
last = dam.damage;
|
last = dam.damage;
|
||||||
res.push([ratio * i + addAtk, dam.damage]);
|
res.push([ratio * i + addAtk, dam.damage]);
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,11 @@ import { has } from '../utils';
|
|||||||
/**
|
/**
|
||||||
* 获取所有装备
|
* 获取所有装备
|
||||||
*/
|
*/
|
||||||
export function getEquips() {
|
export function getEquips(): [ItemIdOf<'equips'>, number][] {
|
||||||
return Object.entries(core.status.hero.items.equips);
|
return Object.entries(core.status.hero.items.equips) as [
|
||||||
|
ItemIdOf<'equips'>,
|
||||||
|
number
|
||||||
|
][];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -13,7 +16,7 @@ export function getEquips() {
|
|||||||
*/
|
*/
|
||||||
export function getAddStatus(equip: Equip) {
|
export function getAddStatus(equip: Equip) {
|
||||||
const toGet = Object.assign({}, equip.value, equip.percentage);
|
const toGet = Object.assign({}, equip.value, equip.percentage);
|
||||||
const keys = Object.keys(toGet);
|
const keys = Object.keys(toGet) as (keyof typeof toGet)[];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div class="equip-add-detail">
|
<div class="equip-add-detail">
|
||||||
@ -46,15 +49,23 @@ export function getAddStatus(equip: Equip) {
|
|||||||
* 获取当前勇士属性,如果有选中的装备,会在后面追加显示增加量
|
* 获取当前勇士属性,如果有选中的装备,会在后面追加显示增加量
|
||||||
* @param nowEquip 当前选中的装备
|
* @param nowEquip 当前选中的装备
|
||||||
*/
|
*/
|
||||||
export function getNowStatus(nowEquip?: Equip) {
|
export function getNowStatus(nowEquip?: Equip, onCol: boolean = false) {
|
||||||
const toShow = ['hp', 'lv', 'atk', 'def', 'mdef', 'mana', 'hpmax', 'money'];
|
const toShow = [
|
||||||
|
'hp',
|
||||||
|
'lv',
|
||||||
|
'atk',
|
||||||
|
'def',
|
||||||
|
'mdef',
|
||||||
|
'mana',
|
||||||
|
'hpmax',
|
||||||
|
'money'
|
||||||
|
] as (keyof SelectType<HeroStatus, number>)[];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div id="hero-status">
|
<div id="hero-status">
|
||||||
{toShow.map(v => {
|
{toShow.map(v => {
|
||||||
let status: string;
|
let status: string;
|
||||||
if (v === 'up') status = core.getNextLvUpNeed()?.toString();
|
if (v === 'lv') status = core.getLvName() ?? '';
|
||||||
else if (v === 'lv') status = core.getLvName() ?? '';
|
|
||||||
else status = core.getRealStatus(v)?.toString();
|
else status = core.getRealStatus(v)?.toString();
|
||||||
|
|
||||||
let add = 0;
|
let add = 0;
|
||||||
@ -63,6 +74,7 @@ export function getNowStatus(nowEquip?: Equip) {
|
|||||||
const per = nowEquip.percentage[v] * core.getStatus(v);
|
const per = nowEquip.percentage[v] * core.getStatus(v);
|
||||||
add += isNaN(per) ? 0 : per;
|
add += isNaN(per) ? 0 : per;
|
||||||
}
|
}
|
||||||
|
if (onCol) add = -add;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div class="hero-status-one">
|
<div class="hero-status-one">
|
||||||
|
@ -7,8 +7,8 @@ interface ClsMap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface AllItem {
|
interface AllItem {
|
||||||
tools: [string, number][];
|
tools: [ItemIdOf<'tools'>, number][];
|
||||||
constants: [string, number][];
|
constants: [ItemIdOf<'constants'>, number][];
|
||||||
}
|
}
|
||||||
|
|
||||||
const clsMap: ClsMap = {
|
const clsMap: ClsMap = {
|
||||||
|
@ -27,7 +27,7 @@ export function has<T>(value: T): value is NonNullable<T> {
|
|||||||
* 根据伤害大小获取颜色
|
* 根据伤害大小获取颜色
|
||||||
* @param damage 伤害大小
|
* @param damage 伤害大小
|
||||||
*/
|
*/
|
||||||
export function getDamageColor(damage: number): string {
|
export function getDamageColor(damage: number): Color {
|
||||||
if (typeof damage !== 'number') return '#f00';
|
if (typeof damage !== 'number') return '#f00';
|
||||||
if (damage === 0) return '#2f2';
|
if (damage === 0) return '#2f2';
|
||||||
if (damage < 0) return '#7f7';
|
if (damage < 0) return '#7f7';
|
||||||
|
516
src/source/cls.d.ts
vendored
Normal file
516
src/source/cls.d.ts
vendored
Normal file
@ -0,0 +1,516 @@
|
|||||||
|
interface IdToCls {
|
||||||
|
yellowWall: 'animates';
|
||||||
|
whiteWall: 'animates';
|
||||||
|
blueWall: 'animates';
|
||||||
|
star: 'animates';
|
||||||
|
lava: 'animates';
|
||||||
|
ice: 'terrains';
|
||||||
|
blueShopLeft: 'terrains';
|
||||||
|
blueShopRight: 'terrains';
|
||||||
|
pinkShopLeft: 'terrains';
|
||||||
|
pinkShopRight: 'terrains';
|
||||||
|
lavaNet: 'animates';
|
||||||
|
poisonNet: 'animates';
|
||||||
|
weakNet: 'animates';
|
||||||
|
curseNet: 'animates';
|
||||||
|
blueWater: 'animates';
|
||||||
|
water: 'animates';
|
||||||
|
autotile: 'autotile';
|
||||||
|
yellowKey: 'items';
|
||||||
|
blueKey: 'items';
|
||||||
|
redKey: 'items';
|
||||||
|
greenKey: 'items';
|
||||||
|
steelKey: 'items';
|
||||||
|
bigKey: 'items';
|
||||||
|
redGem: 'items';
|
||||||
|
blueGem: 'items';
|
||||||
|
greenGem: 'items';
|
||||||
|
yellowGem: 'items';
|
||||||
|
redPotion: 'items';
|
||||||
|
bluePotion: 'items';
|
||||||
|
greenPotion: 'items';
|
||||||
|
yellowPotion: 'items';
|
||||||
|
sword1: 'items';
|
||||||
|
shield1: 'items';
|
||||||
|
sword2: 'items';
|
||||||
|
shield2: 'items';
|
||||||
|
sword3: 'items';
|
||||||
|
shield3: 'items';
|
||||||
|
sword4: 'items';
|
||||||
|
shield4: 'items';
|
||||||
|
sword5: 'items';
|
||||||
|
shield5: 'items';
|
||||||
|
book: 'items';
|
||||||
|
fly: 'items';
|
||||||
|
pickaxe: 'items';
|
||||||
|
icePickaxe: 'items';
|
||||||
|
bomb: 'items';
|
||||||
|
centerFly: 'items';
|
||||||
|
upFly: 'items';
|
||||||
|
downFly: 'items';
|
||||||
|
coin: 'items';
|
||||||
|
freezeBadge: 'items';
|
||||||
|
cross: 'items';
|
||||||
|
superPotion: 'items';
|
||||||
|
earthquake: 'items';
|
||||||
|
poisonWine: 'items';
|
||||||
|
weakWine: 'items';
|
||||||
|
curseWine: 'items';
|
||||||
|
superWine: 'items';
|
||||||
|
dagger: 'items';
|
||||||
|
silverCoin: 'items';
|
||||||
|
amulet: 'items';
|
||||||
|
hammer: 'items';
|
||||||
|
lifeWand: 'items';
|
||||||
|
jumpShoes: 'items';
|
||||||
|
sword0: 'items';
|
||||||
|
shield0: 'items';
|
||||||
|
skill1: 'items';
|
||||||
|
wand: 'items';
|
||||||
|
yellowDoor: 'animates';
|
||||||
|
blueDoor: 'animates';
|
||||||
|
redDoor: 'animates';
|
||||||
|
greenDoor: 'animates';
|
||||||
|
specialDoor: 'animates';
|
||||||
|
steelDoor: 'animates';
|
||||||
|
upFloor: 'terrains';
|
||||||
|
downFloor: 'terrains';
|
||||||
|
portal: 'animates';
|
||||||
|
starPortal: 'animates';
|
||||||
|
upPortal: 'animates';
|
||||||
|
leftPortal: 'animates';
|
||||||
|
downPortal: 'animates';
|
||||||
|
rightPortal: 'animates';
|
||||||
|
crystalUp: 'animates';
|
||||||
|
crystalBottom: 'animates';
|
||||||
|
fire: 'animates';
|
||||||
|
switch: 'animates';
|
||||||
|
steelDoor2: 'animates';
|
||||||
|
steelDoor3: 'animates';
|
||||||
|
iceDoor: 'animates';
|
||||||
|
iceDoor2: 'animates';
|
||||||
|
magentaWall: 'animates';
|
||||||
|
man: 'npcs';
|
||||||
|
trader: 'npcs';
|
||||||
|
thief: 'npcs';
|
||||||
|
fairy: 'npcs';
|
||||||
|
wizard: 'npcs';
|
||||||
|
recluse: 'npcs';
|
||||||
|
king: 'npcs';
|
||||||
|
youngMan: 'npcs';
|
||||||
|
sign: 'npcs';
|
||||||
|
expShop: 'npcs';
|
||||||
|
moneyShop: 'npcs';
|
||||||
|
princess: 'npcs';
|
||||||
|
npc0: 'npc48';
|
||||||
|
npc1: 'npc48';
|
||||||
|
npc2: 'npc48';
|
||||||
|
npc3: 'npc48';
|
||||||
|
greenMan: 'npcs';
|
||||||
|
blueTrader: 'npcs';
|
||||||
|
redMSNpc: 'npcs';
|
||||||
|
blackTrader: 'npcs';
|
||||||
|
autotile4: 'autotile';
|
||||||
|
autotile5: 'autotile';
|
||||||
|
autotile6: 'autotile';
|
||||||
|
autotile7: 'autotile';
|
||||||
|
autotile1: 'autotile';
|
||||||
|
autotile2: 'autotile';
|
||||||
|
autotile3: 'autotile';
|
||||||
|
arrowUp: 'terrains';
|
||||||
|
arrowDown: 'terrains';
|
||||||
|
arrowLeft: 'terrains';
|
||||||
|
arrowRight: 'terrains';
|
||||||
|
light: 'terrains';
|
||||||
|
darkLight: 'terrains';
|
||||||
|
ski: 'terrains';
|
||||||
|
flower: 'terrains';
|
||||||
|
box: 'terrains';
|
||||||
|
boxed: 'terrains';
|
||||||
|
octopusLeftTop: 'npcs';
|
||||||
|
octopusTop: 'npcs';
|
||||||
|
octopusRightTop: 'npcs';
|
||||||
|
octopusLeft: 'npcs';
|
||||||
|
octopusCenter: 'npcs';
|
||||||
|
octopusRight: 'npcs';
|
||||||
|
octopusLeftBottom: 'npcs';
|
||||||
|
octopusRightBottom: 'npcs';
|
||||||
|
dragonLeftTop: 'npcs';
|
||||||
|
dragonTop: 'npcs';
|
||||||
|
dragonRightTop: 'npcs';
|
||||||
|
dragonLeft: 'npcs';
|
||||||
|
dragonCenter: 'npcs';
|
||||||
|
dragonRight: 'npcs';
|
||||||
|
dragonLeftBottom: 'npcs';
|
||||||
|
dragonRightBottom: 'npcs';
|
||||||
|
greenSlime: 'enemys';
|
||||||
|
redSlime: 'enemys';
|
||||||
|
blackSlime: 'enemys';
|
||||||
|
slimelord: 'enemys';
|
||||||
|
bat: 'enemys';
|
||||||
|
bigBat: 'enemys';
|
||||||
|
redBat: 'enemys';
|
||||||
|
vampire: 'enemys';
|
||||||
|
skeleton: 'enemys';
|
||||||
|
skeletonWarrior: 'enemys';
|
||||||
|
skeletonCaptain: 'enemys';
|
||||||
|
ghostSoldier: 'enemys';
|
||||||
|
zombie: 'enemys';
|
||||||
|
zombieKnight: 'enemys';
|
||||||
|
rock: 'enemys';
|
||||||
|
slimeman: 'enemys';
|
||||||
|
bluePriest: 'enemys';
|
||||||
|
redPriest: 'enemys';
|
||||||
|
brownWizard: 'enemys';
|
||||||
|
redWizard: 'enemys';
|
||||||
|
yellowGateKeeper: 'enemys';
|
||||||
|
blueGateKeeper: 'enemys';
|
||||||
|
redGateKeeper: 'enemys';
|
||||||
|
swordsman: 'enemys';
|
||||||
|
soldier: 'enemys';
|
||||||
|
yellowKnight: 'enemys';
|
||||||
|
redKnight: 'enemys';
|
||||||
|
darkKnight: 'enemys';
|
||||||
|
blackKing: 'enemys';
|
||||||
|
yellowKing: 'enemys';
|
||||||
|
greenKing: 'enemys';
|
||||||
|
blueKnight: 'enemys';
|
||||||
|
goldSlime: 'enemys';
|
||||||
|
poisonSkeleton: 'enemys';
|
||||||
|
poisonBat: 'enemys';
|
||||||
|
ironRock: 'enemys';
|
||||||
|
skeletonPriest: 'enemys';
|
||||||
|
skeletonKing: 'enemys';
|
||||||
|
skeletonPresbyter: 'enemys';
|
||||||
|
skeletonKnight: 'enemys';
|
||||||
|
evilHero: 'enemys';
|
||||||
|
devilWarrior: 'enemys';
|
||||||
|
demonPriest: 'enemys';
|
||||||
|
goldHornSlime: 'enemys';
|
||||||
|
redKing: 'enemys';
|
||||||
|
blueKing: 'enemys';
|
||||||
|
magicMaster: 'enemys';
|
||||||
|
silverSlime: 'enemys';
|
||||||
|
blademaster: 'enemys';
|
||||||
|
whiteHornSlime: 'enemys';
|
||||||
|
evilPrincess: 'enemys';
|
||||||
|
evilFairy: 'enemys';
|
||||||
|
yellowPriest: 'enemys';
|
||||||
|
redSwordsman: 'enemys';
|
||||||
|
whiteSlimeman: 'enemys';
|
||||||
|
poisonZombie: 'enemys';
|
||||||
|
dragon: 'enemys';
|
||||||
|
octopus: 'enemys';
|
||||||
|
fairyEnemy: 'enemys';
|
||||||
|
princessEnemy: 'enemys';
|
||||||
|
angel: 'enemy48';
|
||||||
|
elemental: 'enemy48';
|
||||||
|
steelGuard: 'enemy48';
|
||||||
|
evilBat: 'enemy48';
|
||||||
|
silverSlimelord: 'enemys';
|
||||||
|
goldSlimelord: 'enemys';
|
||||||
|
grayRock: 'enemys';
|
||||||
|
blueRock: 'enemys';
|
||||||
|
skeletonLite: 'enemys';
|
||||||
|
greenKnight: 'enemys';
|
||||||
|
bowman: 'enemys';
|
||||||
|
liteBowman: 'enemys';
|
||||||
|
crimsonZombie: 'enemys';
|
||||||
|
frozenSkeleton: 'enemys';
|
||||||
|
watcherSlime: 'enemys';
|
||||||
|
mutantSlimeman: 'enemys';
|
||||||
|
frostBat: 'enemys';
|
||||||
|
devilKnight: 'enemys';
|
||||||
|
grayPriest: 'enemys';
|
||||||
|
greenGateKeeper: 'enemys';
|
||||||
|
ground: 'terrains';
|
||||||
|
sWallT: 'terrains';
|
||||||
|
sWallL: 'terrains';
|
||||||
|
sWallR: 'terrains';
|
||||||
|
sWallB: 'terrains';
|
||||||
|
grass: 'terrains';
|
||||||
|
sWallTL: 'terrains';
|
||||||
|
sWallBR: 'terrains';
|
||||||
|
grass2: 'terrains';
|
||||||
|
sWallTR: 'terrains';
|
||||||
|
sWallBL: 'terrains';
|
||||||
|
ground2: 'terrains';
|
||||||
|
sWallTB: 'terrains';
|
||||||
|
ground3: 'terrains';
|
||||||
|
sWallLR: 'terrains';
|
||||||
|
sWallBLR: 'terrains';
|
||||||
|
sWallTLR: 'terrains';
|
||||||
|
sWallTBR: 'terrains';
|
||||||
|
sWallTBL: 'terrains';
|
||||||
|
I319: 'items';
|
||||||
|
I320: 'items';
|
||||||
|
I321: 'items';
|
||||||
|
I322: 'items';
|
||||||
|
I323: 'items';
|
||||||
|
I324: 'items';
|
||||||
|
I325: 'items';
|
||||||
|
I326: 'items';
|
||||||
|
I327: 'items';
|
||||||
|
I328: 'items';
|
||||||
|
I329: 'items';
|
||||||
|
I330: 'items';
|
||||||
|
T331: 'terrains';
|
||||||
|
T332: 'terrains';
|
||||||
|
T333: 'terrains';
|
||||||
|
T334: 'terrains';
|
||||||
|
T335: 'terrains';
|
||||||
|
T336: 'terrains';
|
||||||
|
T337: 'terrains';
|
||||||
|
T338: 'terrains';
|
||||||
|
T339: 'terrains';
|
||||||
|
T340: 'terrains';
|
||||||
|
T341: 'terrains';
|
||||||
|
T342: 'terrains';
|
||||||
|
T343: 'terrains';
|
||||||
|
T344: 'terrains';
|
||||||
|
T345: 'terrains';
|
||||||
|
T346: 'terrains';
|
||||||
|
T347: 'terrains';
|
||||||
|
T348: 'terrains';
|
||||||
|
T349: 'terrains';
|
||||||
|
T350: 'terrains';
|
||||||
|
T351: 'terrains';
|
||||||
|
T352: 'terrains';
|
||||||
|
T353: 'terrains';
|
||||||
|
T354: 'terrains';
|
||||||
|
T355: 'terrains';
|
||||||
|
T356: 'terrains';
|
||||||
|
T357: 'terrains';
|
||||||
|
T358: 'terrains';
|
||||||
|
T359: 'terrains';
|
||||||
|
T360: 'terrains';
|
||||||
|
T361: 'terrains';
|
||||||
|
T362: 'terrains';
|
||||||
|
T363: 'terrains';
|
||||||
|
T364: 'terrains';
|
||||||
|
T365: 'terrains';
|
||||||
|
T366: 'terrains';
|
||||||
|
N367: 'npc48';
|
||||||
|
E368: 'enemys';
|
||||||
|
E369: 'enemys';
|
||||||
|
E370: 'enemys';
|
||||||
|
E371: 'enemys';
|
||||||
|
E372: 'enemys';
|
||||||
|
E373: 'enemys';
|
||||||
|
E374: 'enemys';
|
||||||
|
E375: 'enemys';
|
||||||
|
I376: 'items';
|
||||||
|
I377: 'items';
|
||||||
|
I378: 'items';
|
||||||
|
I379: 'items';
|
||||||
|
I380: 'items';
|
||||||
|
I381: 'items';
|
||||||
|
I382: 'items';
|
||||||
|
I383: 'items';
|
||||||
|
I384: 'items';
|
||||||
|
I385: 'items';
|
||||||
|
I386: 'items';
|
||||||
|
I387: 'items';
|
||||||
|
I388: 'items';
|
||||||
|
I389: 'items';
|
||||||
|
I390: 'items';
|
||||||
|
I391: 'items';
|
||||||
|
I392: 'items';
|
||||||
|
I393: 'items';
|
||||||
|
I394: 'items';
|
||||||
|
I395: 'items';
|
||||||
|
I396: 'items';
|
||||||
|
I397: 'items';
|
||||||
|
I398: 'items';
|
||||||
|
I399: 'items';
|
||||||
|
I400: 'items';
|
||||||
|
I401: 'items';
|
||||||
|
I402: 'items';
|
||||||
|
I403: 'items';
|
||||||
|
I404: 'items';
|
||||||
|
I405: 'items';
|
||||||
|
I406: 'items';
|
||||||
|
I407: 'items';
|
||||||
|
I408: 'items';
|
||||||
|
I409: 'items';
|
||||||
|
I410: 'items';
|
||||||
|
I411: 'items';
|
||||||
|
I412: 'items';
|
||||||
|
I413: 'items';
|
||||||
|
I414: 'items';
|
||||||
|
I415: 'items';
|
||||||
|
I416: 'items';
|
||||||
|
I417: 'items';
|
||||||
|
I418: 'items';
|
||||||
|
I419: 'items';
|
||||||
|
I420: 'items';
|
||||||
|
I421: 'items';
|
||||||
|
I422: 'items';
|
||||||
|
I423: 'items';
|
||||||
|
I424: 'items';
|
||||||
|
I425: 'items';
|
||||||
|
I426: 'items';
|
||||||
|
I427: 'items';
|
||||||
|
I428: 'items';
|
||||||
|
I429: 'items';
|
||||||
|
I430: 'items';
|
||||||
|
I431: 'items';
|
||||||
|
I432: 'items';
|
||||||
|
I433: 'items';
|
||||||
|
I434: 'items';
|
||||||
|
I435: 'items';
|
||||||
|
I436: 'items';
|
||||||
|
I437: 'items';
|
||||||
|
I438: 'items';
|
||||||
|
I439: 'items';
|
||||||
|
I440: 'items';
|
||||||
|
I441: 'items';
|
||||||
|
I442: 'items';
|
||||||
|
I443: 'items';
|
||||||
|
I444: 'items';
|
||||||
|
I445: 'items';
|
||||||
|
I446: 'items';
|
||||||
|
I447: 'items';
|
||||||
|
I448: 'items';
|
||||||
|
I449: 'items';
|
||||||
|
I450: 'items';
|
||||||
|
I451: 'items';
|
||||||
|
I452: 'items';
|
||||||
|
I453: 'items';
|
||||||
|
I454: 'items';
|
||||||
|
I455: 'items';
|
||||||
|
I456: 'items';
|
||||||
|
I457: 'items';
|
||||||
|
I458: 'items';
|
||||||
|
I459: 'items';
|
||||||
|
I460: 'items';
|
||||||
|
I461: 'items';
|
||||||
|
I462: 'items';
|
||||||
|
I463: 'items';
|
||||||
|
I464: 'items';
|
||||||
|
I465: 'items';
|
||||||
|
I466: 'items';
|
||||||
|
I467: 'items';
|
||||||
|
I468: 'items';
|
||||||
|
I469: 'items';
|
||||||
|
I470: 'items';
|
||||||
|
I471: 'items';
|
||||||
|
I472: 'items';
|
||||||
|
I473: 'items';
|
||||||
|
I474: 'items';
|
||||||
|
I475: 'items';
|
||||||
|
I476: 'items';
|
||||||
|
I477: 'items';
|
||||||
|
I478: 'items';
|
||||||
|
I479: 'items';
|
||||||
|
I480: 'items';
|
||||||
|
I481: 'items';
|
||||||
|
I482: 'items';
|
||||||
|
I483: 'items';
|
||||||
|
I484: 'items';
|
||||||
|
I485: 'items';
|
||||||
|
I486: 'items';
|
||||||
|
I487: 'items';
|
||||||
|
I488: 'items';
|
||||||
|
I489: 'items';
|
||||||
|
I490: 'items';
|
||||||
|
I491: 'items';
|
||||||
|
A492: 'animates';
|
||||||
|
A493: 'animates';
|
||||||
|
A494: 'animates';
|
||||||
|
A495: 'animates';
|
||||||
|
A496: 'animates';
|
||||||
|
A497: 'animates';
|
||||||
|
E498: 'enemys';
|
||||||
|
E499: 'enemys';
|
||||||
|
E500: 'enemys';
|
||||||
|
E501: 'enemys';
|
||||||
|
E502: 'enemys';
|
||||||
|
E503: 'enemys';
|
||||||
|
E504: 'enemys';
|
||||||
|
E505: 'enemys';
|
||||||
|
A506: 'animates';
|
||||||
|
A507: 'animates';
|
||||||
|
A508: 'animates';
|
||||||
|
A509: 'animates';
|
||||||
|
A510: 'animates';
|
||||||
|
E511: 'enemys';
|
||||||
|
E512: 'enemys';
|
||||||
|
E513: 'enemys';
|
||||||
|
E514: 'enemys';
|
||||||
|
E515: 'enemys';
|
||||||
|
T516: 'terrains';
|
||||||
|
E517: 'enemys';
|
||||||
|
E518: 'enemys';
|
||||||
|
E519: 'enemys';
|
||||||
|
E520: 'enemys';
|
||||||
|
E521: 'enemys';
|
||||||
|
E522: 'enemys';
|
||||||
|
E523: 'enemys';
|
||||||
|
E524: 'enemys';
|
||||||
|
E525: 'enemys';
|
||||||
|
T526: 'terrains';
|
||||||
|
T527: 'terrains';
|
||||||
|
T528: 'terrains';
|
||||||
|
T529: 'terrains';
|
||||||
|
T530: 'terrains';
|
||||||
|
T531: 'terrains';
|
||||||
|
N532: 'npcs';
|
||||||
|
N533: 'npcs';
|
||||||
|
N534: 'npcs';
|
||||||
|
N535: 'npcs';
|
||||||
|
E536: 'enemys';
|
||||||
|
E537: 'enemys';
|
||||||
|
E538: 'enemys';
|
||||||
|
E539: 'enemys';
|
||||||
|
A540: 'animates';
|
||||||
|
A541: 'animates';
|
||||||
|
A542: 'animates';
|
||||||
|
A543: 'animates';
|
||||||
|
E544: 'enemys';
|
||||||
|
E545: 'enemys';
|
||||||
|
E546: 'enemys';
|
||||||
|
E547: 'enemys';
|
||||||
|
E548: 'enemys';
|
||||||
|
E549: 'enemys';
|
||||||
|
E550: 'enemys';
|
||||||
|
T551: 'terrains';
|
||||||
|
T552: 'terrains';
|
||||||
|
T553: 'terrains';
|
||||||
|
T554: 'terrains';
|
||||||
|
T555: 'terrains';
|
||||||
|
E556: 'enemys';
|
||||||
|
E557: 'enemys';
|
||||||
|
I558: 'items';
|
||||||
|
X20037: 'tileset';
|
||||||
|
X20038: 'tileset';
|
||||||
|
X20039: 'tileset';
|
||||||
|
X20045: 'tileset';
|
||||||
|
X20047: 'tileset';
|
||||||
|
X20053: 'tileset';
|
||||||
|
X20054: 'tileset';
|
||||||
|
X20055: 'tileset';
|
||||||
|
X20056: 'tileset';
|
||||||
|
X20057: 'tileset';
|
||||||
|
X20058: 'tileset';
|
||||||
|
X20064: 'tileset';
|
||||||
|
X20065: 'tileset';
|
||||||
|
X20066: 'tileset';
|
||||||
|
X20074: 'tileset';
|
||||||
|
X20152: 'tileset';
|
||||||
|
X20153: 'tileset';
|
||||||
|
X30040: 'tileset';
|
||||||
|
X30041: 'tileset';
|
||||||
|
X30042: 'tileset';
|
||||||
|
X30048: 'tileset';
|
||||||
|
X30050: 'tileset';
|
||||||
|
X30056: 'tileset';
|
||||||
|
X30057: 'tileset';
|
||||||
|
X30058: 'tileset';
|
||||||
|
X30105: 'tileset';
|
||||||
|
X30112: 'tileset';
|
||||||
|
X30113: 'tileset';
|
||||||
|
X30121: 'tileset';
|
||||||
|
X30196: 'tileset';
|
||||||
|
X30204: 'tileset';
|
||||||
|
}
|
178
src/source/data.d.ts
vendored
Normal file
178
src/source/data.d.ts
vendored
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
|
||||||
|
type FloorIds =
|
||||||
|
| 'MT0'
|
||||||
|
| 'MT1'
|
||||||
|
| 'MT2'
|
||||||
|
| 'MT3'
|
||||||
|
| 'MT4'
|
||||||
|
| 'MT5'
|
||||||
|
| 'MT6'
|
||||||
|
| 'MT7'
|
||||||
|
| 'MT8'
|
||||||
|
| 'MT9'
|
||||||
|
| 'MT10'
|
||||||
|
| 'MT11'
|
||||||
|
| 'MT12'
|
||||||
|
| 'MT13'
|
||||||
|
| 'MT14'
|
||||||
|
| 'MT15'
|
||||||
|
| 'MT16'
|
||||||
|
| 'MT17'
|
||||||
|
| 'MT18'
|
||||||
|
| 'MT19'
|
||||||
|
| 'MT20'
|
||||||
|
| 'MT21'
|
||||||
|
| 'tower1'
|
||||||
|
| 'tower2'
|
||||||
|
| 'tower3'
|
||||||
|
| 'tower4'
|
||||||
|
| 'tower5'
|
||||||
|
| 'tower6'
|
||||||
|
| 'tower7'
|
||||||
|
|
||||||
|
type ImageIds =
|
||||||
|
| 'IQ.png'
|
||||||
|
| 'arrow.png'
|
||||||
|
| 'atk.png'
|
||||||
|
| 'beforeBoss.jpg'
|
||||||
|
| 'bg.jpg'
|
||||||
|
| 'boom.png'
|
||||||
|
| 'botton.png'
|
||||||
|
| 'cave.jpg'
|
||||||
|
| 'cave1.jpg'
|
||||||
|
| 'cave2.jpg'
|
||||||
|
| 'def.png'
|
||||||
|
| 'escape.jpg'
|
||||||
|
| 'exp.png'
|
||||||
|
| 'grass.jpg'
|
||||||
|
| 'hero1.png'
|
||||||
|
| 'hero2.png'
|
||||||
|
| 'hp.png'
|
||||||
|
| 'money.png'
|
||||||
|
| 'mount.jpg'
|
||||||
|
| 'plot1.jpg'
|
||||||
|
| 'skill0.png'
|
||||||
|
| 'skill1.png'
|
||||||
|
| 'skill2.png'
|
||||||
|
| 'skill3.png'
|
||||||
|
| 'skill4.png'
|
||||||
|
| 'skill5.png'
|
||||||
|
| 'skill6.png'
|
||||||
|
| 'skill7.png'
|
||||||
|
| 'title.jpg'
|
||||||
|
| 'tower.jpg'
|
||||||
|
| 'tower6.jpeg'
|
||||||
|
| 'tower7.jpeg'
|
||||||
|
| 'towerBoss.jpg'
|
||||||
|
| 'towerBoss2.jpg'
|
||||||
|
| 'towerBoss3.jpg'
|
||||||
|
| 'winskin.png'
|
||||||
|
| 'winskin2.png'
|
||||||
|
| 'winskin3.png'
|
||||||
|
|
||||||
|
type AnimationIds =
|
||||||
|
| 'amazed'
|
||||||
|
| 'angry'
|
||||||
|
| 'angry2'
|
||||||
|
| 'bulb'
|
||||||
|
| 'emm'
|
||||||
|
| 'explosion1'
|
||||||
|
| 'explosion2'
|
||||||
|
| 'explosion3'
|
||||||
|
| 'explosion4'
|
||||||
|
| 'fire'
|
||||||
|
| 'focus'
|
||||||
|
| 'fret'
|
||||||
|
| 'hand'
|
||||||
|
| 'ice'
|
||||||
|
| 'jianji'
|
||||||
|
| 'luv'
|
||||||
|
| 'magicAtk'
|
||||||
|
| 'stone'
|
||||||
|
| 'sweat'
|
||||||
|
| 'sweat2'
|
||||||
|
| 'sword'
|
||||||
|
| 'zone'
|
||||||
|
|
||||||
|
type SoundIds =
|
||||||
|
| '008-System08.ogg'
|
||||||
|
| '015-Jump01.ogg'
|
||||||
|
| '050-Explosion03.ogg'
|
||||||
|
| '051-Explosion04.ogg'
|
||||||
|
| '087-Action02.ogg'
|
||||||
|
| '094-Attack06.ogg'
|
||||||
|
| '118-Fire02.ogg'
|
||||||
|
| '119-Fire03.ogg'
|
||||||
|
| '120-Ice01.ogg'
|
||||||
|
| 'arrow.mp3'
|
||||||
|
| 'attack.mp3'
|
||||||
|
| 'bomb.mp3'
|
||||||
|
| 'cancel.mp3'
|
||||||
|
| 'centerFly.mp3'
|
||||||
|
| 'chapter.mp3'
|
||||||
|
| 'confirm.mp3'
|
||||||
|
| 'cursor.mp3'
|
||||||
|
| 'danger.mp3'
|
||||||
|
| 'door.mp3'
|
||||||
|
| 'electron.mp3'
|
||||||
|
| 'equip.mp3'
|
||||||
|
| 'error.mp3'
|
||||||
|
| 'floor.mp3'
|
||||||
|
| 'item.mp3'
|
||||||
|
| 'jump.mp3'
|
||||||
|
| 'load.mp3'
|
||||||
|
| 'open_ui.mp3'
|
||||||
|
| 'paper.mp3'
|
||||||
|
| 'pickaxe.mp3'
|
||||||
|
| 'quake.mp3'
|
||||||
|
| 'recovery.mp3'
|
||||||
|
| 'save.mp3'
|
||||||
|
| 'shake.mp3'
|
||||||
|
| 'shop.mp3'
|
||||||
|
| 'thunder.mp3'
|
||||||
|
| 'tree.mp3'
|
||||||
|
| 'zone.mp3'
|
||||||
|
|
||||||
|
type BgmIds =
|
||||||
|
| 'beforeBoss.mp3'
|
||||||
|
| 'cave.mp3'
|
||||||
|
| 'escape.mp3'
|
||||||
|
| 'grass.mp3'
|
||||||
|
| 'mount.mp3'
|
||||||
|
| 'plot1.mp3'
|
||||||
|
| 'title.mp3'
|
||||||
|
| 'tower.mp3'
|
||||||
|
| 'towerBoss.mp3'
|
||||||
|
| 'towerBoss2.mp3'
|
||||||
|
| 'towerBoss3.mp3'
|
||||||
|
|
||||||
|
type FontIds =
|
||||||
|
| 'normal'
|
||||||
|
| 'scroll'
|
||||||
|
|
||||||
|
interface NameMap {
|
||||||
|
'确定': 'confirm.mp3';
|
||||||
|
'取消': 'cancel.mp3';
|
||||||
|
'操作失败': 'error.mp3';
|
||||||
|
'光标移动': 'cursor.mp3';
|
||||||
|
'打开界面': 'open_ui.mp3';
|
||||||
|
'读档': 'load.mp3';
|
||||||
|
'存档': 'save.mp3';
|
||||||
|
'获得道具': 'item.mp3';
|
||||||
|
'回血': 'recovery.mp3';
|
||||||
|
'炸弹': 'bomb.mp3';
|
||||||
|
'飞行器': 'centerFly.mp3';
|
||||||
|
'开关门': 'door.mp3';
|
||||||
|
'上下楼': 'floor.mp3';
|
||||||
|
'跳跃': 'jump.mp3';
|
||||||
|
'破墙镐': 'pickaxe.mp3';
|
||||||
|
'破冰镐': 'icePickaxe.mp3';
|
||||||
|
'宝石': 'gem.mp3';
|
||||||
|
'阻激夹域': 'zone.mp3';
|
||||||
|
'穿脱装备': 'equip.mp3';
|
||||||
|
'背景音乐': 'bgm.mp3';
|
||||||
|
'攻击': 'attack.mp3';
|
||||||
|
'背景图': 'bg.jpg';
|
||||||
|
'商店': 'shop.mp3';
|
||||||
|
'领域': 'zone';
|
||||||
|
}
|
3
src/source/events.d.ts
vendored
Normal file
3
src/source/events.d.ts
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
type EventDeclaration =
|
||||||
|
| '加点事件'
|
||||||
|
| '回收钥匙商店'
|
182
src/source/items.d.ts
vendored
Normal file
182
src/source/items.d.ts
vendored
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
interface ItemDeclaration {
|
||||||
|
yellowKey: 'tools';
|
||||||
|
blueKey: 'tools';
|
||||||
|
redKey: 'tools';
|
||||||
|
redGem: 'items';
|
||||||
|
blueGem: 'items';
|
||||||
|
greenGem: 'items';
|
||||||
|
yellowGem: 'items';
|
||||||
|
redPotion: 'items';
|
||||||
|
bluePotion: 'items';
|
||||||
|
yellowPotion: 'items';
|
||||||
|
greenPotion: 'items';
|
||||||
|
sword0: 'items';
|
||||||
|
sword1: 'equips';
|
||||||
|
sword2: 'items';
|
||||||
|
sword3: 'items';
|
||||||
|
sword4: 'items';
|
||||||
|
sword5: 'items';
|
||||||
|
shield0: 'items';
|
||||||
|
shield1: 'equips';
|
||||||
|
shield2: 'items';
|
||||||
|
shield3: 'items';
|
||||||
|
shield4: 'items';
|
||||||
|
shield5: 'items';
|
||||||
|
superPotion: 'items';
|
||||||
|
silverCoin: 'items';
|
||||||
|
book: 'constants';
|
||||||
|
fly: 'constants';
|
||||||
|
coin: 'constants';
|
||||||
|
freezeBadge: 'constants';
|
||||||
|
cross: 'constants';
|
||||||
|
dagger: 'constants';
|
||||||
|
amulet: 'constants';
|
||||||
|
bigKey: 'tools';
|
||||||
|
greenKey: 'tools';
|
||||||
|
steelKey: 'tools';
|
||||||
|
pickaxe: 'tools';
|
||||||
|
icePickaxe: 'tools';
|
||||||
|
bomb: 'tools';
|
||||||
|
centerFly: 'constants';
|
||||||
|
upFly: 'tools';
|
||||||
|
downFly: 'tools';
|
||||||
|
earthquake: 'tools';
|
||||||
|
poisonWine: 'tools';
|
||||||
|
weakWine: 'tools';
|
||||||
|
curseWine: 'tools';
|
||||||
|
superWine: 'tools';
|
||||||
|
hammer: 'tools';
|
||||||
|
lifeWand: 'tools';
|
||||||
|
jumpShoes: 'tools';
|
||||||
|
skill1: 'constants';
|
||||||
|
wand: 'constants';
|
||||||
|
I319: 'items';
|
||||||
|
I320: 'items';
|
||||||
|
I321: 'items';
|
||||||
|
I322: 'constants';
|
||||||
|
I323: 'items';
|
||||||
|
I324: 'items';
|
||||||
|
I325: 'items';
|
||||||
|
I326: 'items';
|
||||||
|
I327: 'items';
|
||||||
|
I328: 'items';
|
||||||
|
I329: 'items';
|
||||||
|
I330: 'constants';
|
||||||
|
I376: 'items';
|
||||||
|
I377: 'items';
|
||||||
|
I378: 'items';
|
||||||
|
I379: 'items';
|
||||||
|
I380: 'items';
|
||||||
|
I381: 'items';
|
||||||
|
I382: 'items';
|
||||||
|
I383: 'items';
|
||||||
|
I384: 'items';
|
||||||
|
I385: 'items';
|
||||||
|
I386: 'items';
|
||||||
|
I387: 'items';
|
||||||
|
I388: 'items';
|
||||||
|
I389: 'items';
|
||||||
|
I390: 'items';
|
||||||
|
I391: 'items';
|
||||||
|
I392: 'items';
|
||||||
|
I393: 'items';
|
||||||
|
I394: 'items';
|
||||||
|
I395: 'items';
|
||||||
|
I396: 'items';
|
||||||
|
I397: 'items';
|
||||||
|
I398: 'items';
|
||||||
|
I399: 'items';
|
||||||
|
I400: 'items';
|
||||||
|
I401: 'items';
|
||||||
|
I402: 'items';
|
||||||
|
I403: 'items';
|
||||||
|
I404: 'items';
|
||||||
|
I405: 'items';
|
||||||
|
I406: 'items';
|
||||||
|
I407: 'items';
|
||||||
|
I408: 'items';
|
||||||
|
I409: 'items';
|
||||||
|
I410: 'items';
|
||||||
|
I411: 'items';
|
||||||
|
I412: 'items';
|
||||||
|
I413: 'items';
|
||||||
|
I414: 'items';
|
||||||
|
I415: 'items';
|
||||||
|
I416: 'items';
|
||||||
|
I417: 'items';
|
||||||
|
I418: 'items';
|
||||||
|
I419: 'items';
|
||||||
|
I420: 'items';
|
||||||
|
I421: 'items';
|
||||||
|
I422: 'items';
|
||||||
|
I423: 'items';
|
||||||
|
I424: 'items';
|
||||||
|
I425: 'items';
|
||||||
|
I426: 'items';
|
||||||
|
I427: 'items';
|
||||||
|
I428: 'items';
|
||||||
|
I429: 'items';
|
||||||
|
I430: 'items';
|
||||||
|
I431: 'items';
|
||||||
|
I432: 'items';
|
||||||
|
I433: 'items';
|
||||||
|
I434: 'items';
|
||||||
|
I435: 'items';
|
||||||
|
I436: 'items';
|
||||||
|
I437: 'items';
|
||||||
|
I438: 'items';
|
||||||
|
I439: 'items';
|
||||||
|
I440: 'items';
|
||||||
|
I441: 'items';
|
||||||
|
I442: 'items';
|
||||||
|
I443: 'items';
|
||||||
|
I444: 'items';
|
||||||
|
I445: 'items';
|
||||||
|
I446: 'items';
|
||||||
|
I447: 'items';
|
||||||
|
I448: 'items';
|
||||||
|
I449: 'items';
|
||||||
|
I450: 'items';
|
||||||
|
I451: 'items';
|
||||||
|
I452: 'items';
|
||||||
|
I453: 'items';
|
||||||
|
I454: 'items';
|
||||||
|
I455: 'items';
|
||||||
|
I456: 'items';
|
||||||
|
I457: 'items';
|
||||||
|
I458: 'items';
|
||||||
|
I459: 'items';
|
||||||
|
I460: 'items';
|
||||||
|
I461: 'items';
|
||||||
|
I462: 'items';
|
||||||
|
I463: 'items';
|
||||||
|
I464: 'items';
|
||||||
|
I465: 'items';
|
||||||
|
I466: 'items';
|
||||||
|
I467: 'items';
|
||||||
|
I468: 'items';
|
||||||
|
I469: 'items';
|
||||||
|
I470: 'items';
|
||||||
|
I471: 'items';
|
||||||
|
I472: 'items';
|
||||||
|
I473: 'items';
|
||||||
|
I474: 'items';
|
||||||
|
I475: 'items';
|
||||||
|
I476: 'items';
|
||||||
|
I477: 'items';
|
||||||
|
I478: 'items';
|
||||||
|
I479: 'items';
|
||||||
|
I480: 'items';
|
||||||
|
I481: 'items';
|
||||||
|
I482: 'items';
|
||||||
|
I483: 'items';
|
||||||
|
I484: 'items';
|
||||||
|
I485: 'items';
|
||||||
|
I486: 'items';
|
||||||
|
I487: 'items';
|
||||||
|
I488: 'items';
|
||||||
|
I489: 'items';
|
||||||
|
I490: 'items';
|
||||||
|
I491: 'items';
|
||||||
|
I558: 'constants';
|
||||||
|
}
|
1032
src/source/maps.d.ts
vendored
Normal file
1032
src/source/maps.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@ -19,6 +19,7 @@
|
|||||||
font-size: 1.6em;
|
font-size: 1.6em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 文字按钮
|
||||||
.button-text {
|
.button-text {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: color 0.2s linear;
|
transition: color 0.2s linear;
|
||||||
@ -32,6 +33,10 @@
|
|||||||
color: aquamarine;
|
color: aquamarine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.selectable {
|
||||||
|
border: #0000 0.5px solid;
|
||||||
|
}
|
||||||
|
|
||||||
.selectable[selected='true'] {
|
.selectable[selected='true'] {
|
||||||
animation: selected alternate 5s infinite ease-in-out;
|
animation: selected alternate 5s infinite ease-in-out;
|
||||||
}
|
}
|
||||||
@ -50,3 +55,17 @@
|
|||||||
background-color: rgba(39, 251, 209, 0.143);
|
background-color: rgba(39, 251, 209, 0.143);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 拖拽类
|
||||||
|
.draginable {
|
||||||
|
transition: background-color 0.2s linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
.draginable[draged='true'][access='true']:hover {
|
||||||
|
background-color: rgba(0, 255, 187, 0.31);
|
||||||
|
}
|
||||||
|
|
||||||
|
.draginable[draged='true'][access='false']:hover {
|
||||||
|
background-color: rgba(255, 0, 0, 0.319);
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
189
src/types/action.d.ts
vendored
189
src/types/action.d.ts
vendored
@ -1,74 +1,137 @@
|
|||||||
/** @file actions.js 定义了玩家的操作控制 */
|
/**
|
||||||
declare class actions {
|
* 鼠标与触屏操作的函数
|
||||||
|
*/
|
||||||
|
type MotaMouseFunc = (x: number, y: number, px: number, py: number) => boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按键操作的函数
|
||||||
|
*/
|
||||||
|
type MotaKeyboardFunc = (e: KeyboardEvent) => boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 没有最乱,只有更乱
|
||||||
|
*/
|
||||||
|
interface RegisteredActionMap {
|
||||||
|
keyDown: (keyCode: number) => boolean;
|
||||||
|
keyDownCtrl: () => boolean;
|
||||||
|
keyUp: (keyCode: number, altKey: boolean, fromReplay: boolean) => boolean;
|
||||||
|
longClick: MotaMouseFunc;
|
||||||
|
onStatusBarClick: (px: number, py: number, vertical: boolean) => boolean;
|
||||||
|
ondown: MotaMouseFunc;
|
||||||
|
onkeyDown: MotaKeyboardFunc;
|
||||||
|
onkeyUp: MotaKeyboardFunc;
|
||||||
|
onmousewheel: (direct: 1 | -1) => boolean;
|
||||||
|
onmove: MotaMouseFunc;
|
||||||
|
onup: MotaMouseFunc;
|
||||||
|
pressKey: (keyCode: number) => boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
type ActionKey = keyof RegisteredActionMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将注册的函数的返回值变成void就变成了actions上的函数...
|
||||||
|
*/
|
||||||
|
type VoidedActionFuncs = {
|
||||||
|
[P in ActionKey]: (...params: Parameters<RegisteredActionMap[P]>) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 点击位置
|
||||||
|
*/
|
||||||
|
interface ClickLoc extends Loc {
|
||||||
|
/**
|
||||||
|
* 格子的大小(这不是32还能是其它的吗??
|
||||||
|
*/
|
||||||
|
size: 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface RegisteredActionOf<K extends ActionKey> {
|
||||||
|
/**
|
||||||
|
* 交互的类型
|
||||||
|
*/
|
||||||
|
action: K;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 交互的唯一标识符
|
||||||
|
*/
|
||||||
|
name: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优先级,越高越优先执行
|
||||||
|
*/
|
||||||
|
priority: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 交互函数
|
||||||
|
*/
|
||||||
|
func: RegisteredActionMap[K];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 交互模块
|
||||||
|
*/
|
||||||
|
interface Actions extends VoidedActionFuncs {
|
||||||
|
/**
|
||||||
|
* 横向的最后一个格子的横坐标
|
||||||
|
*/
|
||||||
|
readonly LAST: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 格子长度的一半
|
||||||
|
*/
|
||||||
|
readonly _HX_: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 格子高度的一半
|
||||||
|
*/
|
||||||
|
readonly _HY_: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 脚本编辑中的交互函数
|
||||||
|
*/
|
||||||
|
readonly actionsdata: ActionData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有已注册的交互操作
|
||||||
|
*/
|
||||||
|
readonly actions: {
|
||||||
|
[P in ActionKey]: RegisteredActionOf<P>[];
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 此函数将注册一个用户交互行为。
|
* 此函数将注册一个用户交互行为。
|
||||||
* @param action 要注册的交互类型,如 ondown, onclick, keyDown 等等。
|
* @param action 要注册的交互类型
|
||||||
* @param name 你的自定义名称,可被注销使用;同名重复注册将后者覆盖前者。
|
* @param name 自定义名称,可被注销使用
|
||||||
* @param func 执行函数。
|
* @param func 执行函数,如果func返回true,则不会再继续执行其他的交互函数
|
||||||
* 如果func返回true,则不会再继续执行其他的交互函数;否则会继续执行其他的交互函数。
|
* @param priority 优先级,优先级高的将会被执行。此项可不填,默认为0
|
||||||
* @param priority 优先级;优先级高的将会被执行。此项可不填,默认为0
|
|
||||||
*/
|
*/
|
||||||
registerAction(
|
registerAction<K extends ActionKey>(
|
||||||
action: string,
|
action: K,
|
||||||
name: string,
|
name: string,
|
||||||
func: string | ((...params: any) => void),
|
func: RegisteredActionMap[K],
|
||||||
priority?: number
|
priority?: number
|
||||||
): void;
|
): void;
|
||||||
|
|
||||||
/** 注销一个用户交互行为 */
|
/**
|
||||||
unregisterAction(action: string, name: string): void;
|
* 注销一个用户交互行为
|
||||||
|
* @param action 要注销的交互类型
|
||||||
|
* @param name 要注销的自定义名称
|
||||||
|
*/
|
||||||
|
unregisterAction(action: ActionKey, name: string): void;
|
||||||
|
|
||||||
/** 执行一个用户交互行为 */
|
/**
|
||||||
doRegisteredAction(action: string, ...params: any): void;
|
* 执行一个用户交互行为
|
||||||
|
*/
|
||||||
/** 按下某个键时 */
|
doRegisteredAction<K extends ActionKey>(
|
||||||
onkeyDown(e: KeyboardEvent): void;
|
action: K,
|
||||||
|
...params: Parameters<RegisteredActionMap[K]>
|
||||||
/** 放开某个键时 */
|
|
||||||
onkeyUp(e: KeyboardEvent): void;
|
|
||||||
|
|
||||||
/** 按住某个键时 */
|
|
||||||
pressKey(keyCode: number): void;
|
|
||||||
|
|
||||||
/** 根据按下键的code来执行一系列操作 */
|
|
||||||
keyDown(keyCode: number): void;
|
|
||||||
|
|
||||||
/** 根据放开键的code来执行一系列操作 */
|
|
||||||
keyUp(keyCode: number, altKey?: boolean, fromReplay?: boolean): void;
|
|
||||||
|
|
||||||
/** 点击(触摸)事件按下时 */
|
|
||||||
ondown(loc: number[]): void;
|
|
||||||
|
|
||||||
/** 当在触摸屏上滑动时 */
|
|
||||||
onmove(loc: number[]): void;
|
|
||||||
|
|
||||||
/** 当点击(触摸)事件放开时 */
|
|
||||||
onup(loc: number[]): void;
|
|
||||||
|
|
||||||
/** 具体点击屏幕上(x,y)点时,执行的操作 */
|
|
||||||
onclick(
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
px: number,
|
|
||||||
py: number,
|
|
||||||
stepPostfix?: any
|
|
||||||
): void;
|
): void;
|
||||||
|
|
||||||
/** 滑动鼠标滚轮时的操作 */
|
/**
|
||||||
onmousewheel(direct: 1 | -1): void;
|
* 判断一个横坐标是否在(_HX_ - 2, _HX_ + 2)范围外
|
||||||
|
* @param x 要判断的横坐标
|
||||||
/** 长按Ctrl键时 */
|
*/
|
||||||
keyDownCtrl(): void;
|
_out(x: number): boolean;
|
||||||
|
|
||||||
/** 长按 */
|
|
||||||
longClick(
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
px: number,
|
|
||||||
py: number,
|
|
||||||
fromEvent?: boolean
|
|
||||||
): void;
|
|
||||||
|
|
||||||
/** 点击自绘状态栏时 */
|
|
||||||
onStatusBarClick(e?: MouseEvent): void;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare const actions: new () => Actions;
|
||||||
|
1179
src/types/control.d.ts
vendored
1179
src/types/control.d.ts
vendored
File diff suppressed because it is too large
Load Diff
1715
src/types/core.d.ts
vendored
1715
src/types/core.d.ts
vendored
File diff suppressed because it is too large
Load Diff
140
src/types/data.d.ts
vendored
Normal file
140
src/types/data.d.ts
vendored
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
interface MainData {
|
||||||
|
/**
|
||||||
|
* 所有的楼层id
|
||||||
|
*/
|
||||||
|
readonly floorIds: FloorIds[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分区指定
|
||||||
|
*/
|
||||||
|
readonly floorPatitions: [FloorIds, FloorIds?][];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有的额外素材
|
||||||
|
*/
|
||||||
|
readonly tilesets: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有的动画
|
||||||
|
*/
|
||||||
|
readonly animates: AnimationIds[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有的bgm
|
||||||
|
*/
|
||||||
|
readonly bgms: BgmIds[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有的音效
|
||||||
|
*/
|
||||||
|
readonly sounds: SoundIds[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有的字体
|
||||||
|
*/
|
||||||
|
readonly fonts: FontIds[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件别名
|
||||||
|
*/
|
||||||
|
readonly nameMap: NameMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 难度选择
|
||||||
|
*/
|
||||||
|
readonly levelChoose: LevelChooseEvent[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 装备孔的名称
|
||||||
|
*/
|
||||||
|
readonly equipName: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始界面的bgm
|
||||||
|
*/
|
||||||
|
readonly startBgm: BgmIds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主样式
|
||||||
|
*/
|
||||||
|
readonly styles: MainStyle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图片切分信息
|
||||||
|
*/
|
||||||
|
readonly splitImages: SplitImageData;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FirstData {
|
||||||
|
/**
|
||||||
|
* 游戏标题
|
||||||
|
*/
|
||||||
|
title: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 游戏英文名,应当与mota.config.ts中的一致
|
||||||
|
*/
|
||||||
|
name: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 游戏版本
|
||||||
|
*/
|
||||||
|
version: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始地图
|
||||||
|
*/
|
||||||
|
floorId: FloorIds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 勇士的初始信息
|
||||||
|
*/
|
||||||
|
hero: HeroStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标题界面事件化
|
||||||
|
*/
|
||||||
|
startCanvas: MotaEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始剧情
|
||||||
|
*/
|
||||||
|
startText: MotaEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全局商店信息
|
||||||
|
*/
|
||||||
|
shops: ShopEventOf<keyof ShopEventMap>[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 升级事件
|
||||||
|
*/
|
||||||
|
levelUp: LevelUpEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全塔属性信息
|
||||||
|
*/
|
||||||
|
interface DataCore {
|
||||||
|
/**
|
||||||
|
* 全塔属性的main信息
|
||||||
|
*/
|
||||||
|
readonly main: MainData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化信息
|
||||||
|
*/
|
||||||
|
readonly firstData: FirstData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全局数值
|
||||||
|
*/
|
||||||
|
readonly values: CoreValues;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全局变量
|
||||||
|
*/
|
||||||
|
readonly flags: CoreFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare const data: new () => Omit<DataCore, 'main'>;
|
438
src/types/enemy.d.ts
vendored
438
src/types/enemy.d.ts
vendored
@ -1,16 +1,242 @@
|
|||||||
/** @file enemys.js 定义了一系列和敌人相关的API函数。 */
|
type PartialNumbericEnemyProperty =
|
||||||
declare class enemys {
|
| 'value'
|
||||||
|
| 'zone'
|
||||||
|
| 'repulse'
|
||||||
|
| 'laser'
|
||||||
|
| 'breakArmor'
|
||||||
|
| 'counterAttack'
|
||||||
|
| 'vampire'
|
||||||
|
| 'hpBuff'
|
||||||
|
| 'atkBuff'
|
||||||
|
| 'defBuff'
|
||||||
|
| 'range'
|
||||||
|
| 'haloRange'
|
||||||
|
| 'n'
|
||||||
|
| 'purify'
|
||||||
|
| 'atkValue'
|
||||||
|
| 'defValue'
|
||||||
|
| 'damage';
|
||||||
|
|
||||||
|
type BooleanEnemyProperty =
|
||||||
|
| 'zoneSquare'
|
||||||
|
| 'haloSquare'
|
||||||
|
| 'notBomb'
|
||||||
|
| 'add'
|
||||||
|
| 'haloAdd';
|
||||||
|
|
||||||
|
type DetailedEnemy<I extends EnemyIds = EnemyIds> = {
|
||||||
|
specialText: string[];
|
||||||
|
toShowSpecial: string[];
|
||||||
|
toShowColor: Color[];
|
||||||
|
specialColor: Color[];
|
||||||
|
damageColor: Color;
|
||||||
|
} & Enemy<I>;
|
||||||
|
|
||||||
|
type Enemy<I extends EnemyIds = EnemyIds> = {
|
||||||
/**
|
/**
|
||||||
* 判定某种特殊属性的有无
|
* 怪物id
|
||||||
* @example core.hasSpecial('greenSlime', 1) // 判定绿头怪有无先攻属性
|
|
||||||
* @param special 敌人id或敌人对象或正整数数组或自然数
|
|
||||||
* @param test 待检查的属性编号
|
|
||||||
* @returns 若special为数组或数且含有test或相等、或special为敌人id或对象且具有此属性,则返回true
|
|
||||||
*/
|
*/
|
||||||
hasSpecial(
|
id: I;
|
||||||
special: number | number[] | string | Enemy,
|
|
||||||
test: number
|
/**
|
||||||
): boolean;
|
* 怪物名称
|
||||||
|
*/
|
||||||
|
name: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在怪物手册中映射到的怪物ID。如果此项不为null,则在怪物手册中,将用目标ID来替换该怪物原本的ID。
|
||||||
|
* 常被运用在同一个怪物的多朝向上
|
||||||
|
*/
|
||||||
|
displayIdInBook: EnemyIds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 战前事件
|
||||||
|
*/
|
||||||
|
beforeBattle: MotaEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 战后事件
|
||||||
|
*/
|
||||||
|
afterBattle: MotaEvent;
|
||||||
|
} & {
|
||||||
|
[P in PartialNumbericEnemyProperty]?: number;
|
||||||
|
} & {
|
||||||
|
[P in BooleanEnemyProperty]: boolean;
|
||||||
|
} & EnemyInfoBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 怪物的特殊属性定义
|
||||||
|
*/
|
||||||
|
type EnemySpecialDeclaration = [
|
||||||
|
id: number,
|
||||||
|
name: string | ((enemy: Enemy) => string),
|
||||||
|
desc: string | ((enemy: Enemy) => string),
|
||||||
|
color: Color,
|
||||||
|
extra?: number
|
||||||
|
];
|
||||||
|
|
||||||
|
interface DamageString {
|
||||||
|
/**
|
||||||
|
* 伤害字符串
|
||||||
|
*/
|
||||||
|
damage: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 伤害颜色
|
||||||
|
*/
|
||||||
|
color: Color;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EnemyInfoBase {
|
||||||
|
/**
|
||||||
|
* 生命值
|
||||||
|
*/
|
||||||
|
hp: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 攻击力
|
||||||
|
*/
|
||||||
|
atk: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 防御力
|
||||||
|
*/
|
||||||
|
def: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 金币
|
||||||
|
*/
|
||||||
|
money: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 经验
|
||||||
|
*/
|
||||||
|
exp: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加点量
|
||||||
|
*/
|
||||||
|
point: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 特殊属性列表
|
||||||
|
*/
|
||||||
|
special: number[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EnemyInfo extends EnemyInfoBase {
|
||||||
|
/**
|
||||||
|
* 支援信息
|
||||||
|
*/
|
||||||
|
guards: [x: number, y: number, id: EnemyIds];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface DamageInfo {
|
||||||
|
/**
|
||||||
|
* 怪物生命值
|
||||||
|
*/
|
||||||
|
mon_hp: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 怪物攻击力
|
||||||
|
*/
|
||||||
|
mon_atk: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 怪物防御力
|
||||||
|
*/
|
||||||
|
mon_def: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 先攻伤害
|
||||||
|
*/
|
||||||
|
init_damage: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 怪物的每回合伤害
|
||||||
|
*/
|
||||||
|
per_damage: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 勇士的每回合伤害
|
||||||
|
*/
|
||||||
|
hero_per_damage: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 战斗的回合数
|
||||||
|
*/
|
||||||
|
turn: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 勇士损失的生命值
|
||||||
|
*/
|
||||||
|
damage: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface BookEnemyInfo extends Enemy, EnemyInfo {
|
||||||
|
/**
|
||||||
|
* 怪物的坐标列表
|
||||||
|
*/
|
||||||
|
locs?: [x: number, y: number][];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 怪物的中文名
|
||||||
|
*/
|
||||||
|
name: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 特殊属性名称列表
|
||||||
|
*/
|
||||||
|
specialText: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 特殊属性的颜色列表
|
||||||
|
*/
|
||||||
|
specialColor: Color[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 怪物的伤害
|
||||||
|
*/
|
||||||
|
damage: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 第一个临界的加攻的值
|
||||||
|
*/
|
||||||
|
critical: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 临界的减伤值
|
||||||
|
*/
|
||||||
|
criticalDamage: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ratio防减伤
|
||||||
|
*/
|
||||||
|
defDamage: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 怪物模块
|
||||||
|
*/
|
||||||
|
interface Enemys extends EnemyData {
|
||||||
|
/**
|
||||||
|
* 所有的怪物信息
|
||||||
|
*/
|
||||||
|
readonly enemys: {
|
||||||
|
[P in EnemyIds]: Enemy<P>;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 脚本编辑的怪物相关
|
||||||
|
*/
|
||||||
|
readonly enemydata: EnemyData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得所有怪物原始数据的一个副本
|
||||||
|
*/
|
||||||
|
getEnemys(): {
|
||||||
|
[P in EnemyIds]: Enemy<P>;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得某种敌人的全部特殊属性名称
|
* 获得某种敌人的全部特殊属性名称
|
||||||
@ -18,120 +244,135 @@ declare class enemys {
|
|||||||
* @param enemy 敌人id或敌人对象,如core.material.enemys.greenSlime
|
* @param enemy 敌人id或敌人对象,如core.material.enemys.greenSlime
|
||||||
* @returns 字符串数组
|
* @returns 字符串数组
|
||||||
*/
|
*/
|
||||||
getSpecialText(enemy: string | Enemy): string[];
|
getSpecialText(enemy: EnemyIds | Enemy): string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得所有特殊属性的颜色
|
||||||
|
* @param enemy 敌人id或敌人对象,如core.material.enemys.greenSlime
|
||||||
|
*/
|
||||||
|
getSpecialColor(enemy: EnemyIds | Enemy): Color[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得所有特殊属性的额外标记
|
||||||
|
* @param enemy 敌人id或敌人对象,如core.material.enemys.greenSlime
|
||||||
|
*/
|
||||||
|
getSpecialFlag(enemy: EnemyIds | Enemy): number[];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得某种敌人的某种特殊属性的介绍
|
* 获得某种敌人的某种特殊属性的介绍
|
||||||
* @example core.getSpecialHint('bat', 1) // '先攻:怪物首先攻击'
|
* @example core.getSpecialHint('bat', 1) // '先攻:怪物首先攻击'
|
||||||
* @param enemy 敌人id或敌人对象,用于确定属性的具体数值,否则可选
|
* @param enemy 敌人id或敌人对象,用于确定属性的具体数值
|
||||||
* @param special 属性编号,可以是该敌人没有的属性
|
* @param special 属性编号,可以是该敌人没有的属性
|
||||||
* @returns 属性的介绍,以属性名加中文冒号开头
|
* @returns 属性的介绍,以属性名加中文冒号开头
|
||||||
*/
|
*/
|
||||||
getSpecialHint(enemy: string | Enemy, special: number): string;
|
getSpecialHint(enemy: EnemyIds | Enemy, special: number): string;
|
||||||
|
|
||||||
/** 获得某个敌人的某项属性值 */
|
/**
|
||||||
getEnemyValue(
|
* 获得某个敌人的某项属性值
|
||||||
enemy: string | Enemy,
|
* @param enemy 敌人id或敌人对象
|
||||||
name: string,
|
* @param name 获取的敌人属性
|
||||||
|
* @param x 敌人的横坐标
|
||||||
|
* @param y 敌人的纵坐标
|
||||||
|
* @param floorId 敌人所在楼层
|
||||||
|
*/
|
||||||
|
getEnemyValue<K extends keyof Enemy>(
|
||||||
|
enemy: EnemyIds | Enemy,
|
||||||
|
name: K,
|
||||||
x?: number,
|
x?: number,
|
||||||
y?: number,
|
y?: number,
|
||||||
floorId?: string
|
floorId?: FloorIds
|
||||||
): any;
|
): Enemy[K];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判定主角当前能否打败某只敌人
|
* 判定主角当前能否打败某只敌人
|
||||||
* @example core.canBattle('greenSlime',0,0,'MT0') // 能否打败主塔0层左上角的绿头怪(假设有)
|
* @example core.canBattle('greenSlime',0,0,'MT0') // 能否打败主塔0层左上角的绿头怪(假设有)
|
||||||
* @param enemy 敌人id或敌人对象
|
* @param enemy 敌人id或敌人对象
|
||||||
* @param x 敌人的横坐标,可选
|
* @param x 敌人的横坐标
|
||||||
* @param y 敌人的纵坐标,可选
|
* @param y 敌人的纵坐标
|
||||||
* @param floorId 敌人所在的地图,可选
|
* @param floorId 敌人所在的地图
|
||||||
* @returns true表示可以打败,false表示无法打败
|
* @returns true表示可以打败,false表示无法打败
|
||||||
*/
|
*/
|
||||||
canBattle(
|
canBattle(
|
||||||
enemy: string | Enemy,
|
enemy: EnemyIds | Enemy,
|
||||||
x?: number,
|
x?: number,
|
||||||
y?: number,
|
y?: number,
|
||||||
floorId?: string
|
floorId?: FloorIds
|
||||||
): boolean;
|
): boolean;
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得某只敌人对主角的总伤害
|
|
||||||
* @example core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害
|
|
||||||
* @param enemy 敌人id或敌人对象
|
|
||||||
* @param x 敌人的横坐标,可选
|
|
||||||
* @param y 敌人的纵坐标,可选
|
|
||||||
* @param floorId 敌人所在的地图,可选
|
|
||||||
* @returns 总伤害,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null
|
|
||||||
*/
|
|
||||||
getDamage(
|
|
||||||
enemy: string | Enemy,
|
|
||||||
x?: number,
|
|
||||||
y?: number,
|
|
||||||
floorId?: string
|
|
||||||
): number;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得某只敌人的地图显伤,包括颜色
|
* 获得某只敌人的地图显伤,包括颜色
|
||||||
* @example core.getDamageString('greenSlime', 0, 0, 'MT0') // 绿头怪的地图显伤
|
* @example core.getDamageString('greenSlime', 0, 0, 'MT0') // 绿头怪的地图显伤
|
||||||
* @param enemy 敌人id或敌人对象
|
* @param enemy 敌人id或敌人对象
|
||||||
* @param x 敌人的横坐标,可选
|
* @param x 敌人的横坐标
|
||||||
* @param y 敌人的纵坐标,可选
|
* @param y 敌人的纵坐标
|
||||||
* @param floorId 敌人所在的地图,可选
|
* @param floorId 敌人所在的地图
|
||||||
* @returns damage: 表示伤害值或为'???',color: 形如'#RrGgBb'
|
|
||||||
*/
|
*/
|
||||||
getDamageString(
|
getDamageString(
|
||||||
enemy: string | Enemy,
|
enemy: EnemyIds | Enemy,
|
||||||
x?: number,
|
x?: number,
|
||||||
y?: number,
|
y?: number,
|
||||||
floorId?: string
|
floorId?: FloorIds
|
||||||
): {
|
): DamageString;
|
||||||
damage: string;
|
|
||||||
color: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得某只敌人接下来的若干个临界及其减伤,算法基于useLoop开关选择回合法或二分法
|
* 获得某只敌人接下来的若干个临界及其减伤,算法基于useLoop开关选择回合法或二分法
|
||||||
* @example core.nextCriticals('greenSlime', 9, 0, 0, 'MT0') // 绿头怪接下来的9个临界
|
* @example core.nextCriticals('greenSlime', 9, 0, 0, 'MT0') // 绿头怪接下来的9个临界
|
||||||
* @param enemy 敌人id或敌人对象
|
* @param enemy 敌人id或敌人对象
|
||||||
* @param number 要计算的临界数量,可选,默认为1
|
* @param number 要计算的临界数量,默认为1
|
||||||
* @param x 敌人的横坐标,可选
|
* @param x 敌人的横坐标
|
||||||
* @param y 敌人的纵坐标,可选
|
* @param y 敌人的纵坐标
|
||||||
* @param floorId 敌人所在的地图,可选
|
* @param floorId 敌人所在的地图
|
||||||
* @returns 两列的二维数组,每行表示一个临界及其减伤
|
* @returns 两列的二维数组,每行表示一个临界及其减伤
|
||||||
*/
|
*/
|
||||||
nextCriticals(
|
nextCriticals(
|
||||||
enemy: string | Enemy,
|
enemy: EnemyIds | Enemy,
|
||||||
number?: number,
|
number?: number,
|
||||||
x?: number,
|
x?: number,
|
||||||
y?: number,
|
y?: number,
|
||||||
floorId?: string
|
floorId?: FloorIds
|
||||||
): [atk: number, dam: number][];
|
): [critical: number, damage: number][];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算再加若干点防御能使某只敌人对主角的总伤害降低多少
|
* 计算再加若干点防御能使某只敌人对主角的总伤害降低多少
|
||||||
* @example core.nextCriticals('greenSlime', 10, 0, 0, 'MT0') // 再加10点防御能使绿头怪的伤害降低多少
|
* @example core.nextCriticals('greenSlime', 10, 0, 0, 'MT0') // 再加10点防御能使绿头怪的伤害降低多少
|
||||||
* @param enemy 敌人id或敌人对象
|
* @param enemy 敌人id或敌人对象
|
||||||
* @param k 假设主角增加的防御力,可选,默认为1
|
* @param k 假设主角增加的防御力,默认为1
|
||||||
* @param x 敌人的横坐标,可选
|
* @param x 敌人的横坐标
|
||||||
* @param y 敌人的纵坐标,可选
|
* @param y 敌人的纵坐标
|
||||||
* @param floorId 敌人所在的地图,可选
|
* @param floorId 敌人所在的地图
|
||||||
* @returns 总伤害的减少量
|
* @returns 总伤害的减少量
|
||||||
*/
|
*/
|
||||||
getDefDamage(
|
getDefDamage(
|
||||||
enemy: string | Enemy,
|
enemy: EnemyIds | Enemy,
|
||||||
k?: number,
|
k?: number,
|
||||||
x?: number,
|
x?: number,
|
||||||
y?: number,
|
y?: number,
|
||||||
floorId?: string
|
floorId?: FloorIds
|
||||||
|
): number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得某只敌人对主角的总伤害
|
||||||
|
* @example core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害
|
||||||
|
* @param enemy 敌人id或敌人对象
|
||||||
|
* @param x 敌人的横坐标
|
||||||
|
* @param y 敌人的纵坐标
|
||||||
|
* @param floorId 敌人所在的地图
|
||||||
|
* @returns 总伤害,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null
|
||||||
|
*/
|
||||||
|
getDamage(
|
||||||
|
enemy: EnemyIds | Enemy,
|
||||||
|
x?: number,
|
||||||
|
y?: number,
|
||||||
|
floorId?: FloorIds
|
||||||
): number;
|
): number;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得某张地图的敌人集合,用于手册绘制
|
* 获得某张地图的敌人集合,用于手册绘制
|
||||||
* @example core.getCurrentEnemys('MT0') // 主塔0层的敌人集合
|
* @example core.getCurrentEnemys('MT0') // 主塔0层的敌人集合
|
||||||
* @param floorId 地图id,可选
|
* @param floorId 地图id
|
||||||
* @returns 敌人集合,按伤害升序排列,支持多朝向怪合并
|
* @returns 敌人集合,按伤害升序排列,支持多朝向怪合并
|
||||||
*/
|
*/
|
||||||
getCurrentEnemys(floorId?: string): (Enemy & DetailedEnemy)[];
|
getCurrentEnemys(floorId?: FloorIds): DetailedEnemy[];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查某些楼层是否还有漏打的(某种)敌人
|
* 检查某些楼层是否还有漏打的(某种)敌人
|
||||||
@ -140,63 +381,10 @@ declare class enemys {
|
|||||||
* @param floorId 地图id或其数组,可选,默认为当前地图
|
* @param floorId 地图id或其数组,可选,默认为当前地图
|
||||||
* @returns true表示有敌人被漏打,false表示敌人已死光
|
* @returns true表示有敌人被漏打,false表示敌人已死光
|
||||||
*/
|
*/
|
||||||
hasEnemyLeft(enemyId?: string, floorId?: string | string[]): boolean;
|
hasEnemyLeft(
|
||||||
|
enemyId?: EnemyIds | EnemyIds[],
|
||||||
/** 获得所有怪物原始数据的一个副本 */
|
floorId?: FloorIds | FloorIds[]
|
||||||
getEnemys(): any;
|
): boolean;
|
||||||
|
|
||||||
/** 获得所有特殊属性定义 */
|
|
||||||
getSpecials(): [
|
|
||||||
number,
|
|
||||||
string | ((enemy: Enemy) => string),
|
|
||||||
string | ((enemy: Enemy) => string),
|
|
||||||
string | [number, number, number, number?],
|
|
||||||
number?
|
|
||||||
][];
|
|
||||||
|
|
||||||
/** 获得所有特殊属性的颜色 */
|
|
||||||
getSpecialColor(
|
|
||||||
enemy: string | Enemy
|
|
||||||
): Array<string | [number, number, number, number?]>;
|
|
||||||
|
|
||||||
/** 获得所有特殊属性的额外标记 */
|
|
||||||
getSpecialFlag(enemy: string | Enemy): Array<number>;
|
|
||||||
|
|
||||||
/** 获得怪物真实属性 */
|
|
||||||
getEnemyInfo(
|
|
||||||
enemy: string | Enemy,
|
|
||||||
hero?: any,
|
|
||||||
x?: number,
|
|
||||||
y?: number,
|
|
||||||
floorId?: string
|
|
||||||
): {
|
|
||||||
hp: number;
|
|
||||||
def: number;
|
|
||||||
atk: number;
|
|
||||||
money: number;
|
|
||||||
exp: number;
|
|
||||||
point: number;
|
|
||||||
special: number | number[];
|
|
||||||
guards: Array<[number, number, string]>;
|
|
||||||
[x: string]: any;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** 获得战斗伤害信息(实际伤害计算函数) */
|
|
||||||
getDamageInfo(
|
|
||||||
enemy: string | Enemy,
|
|
||||||
hero?: any,
|
|
||||||
x?: number,
|
|
||||||
y?: number,
|
|
||||||
floorId?: string
|
|
||||||
): {
|
|
||||||
mon_hp: number;
|
|
||||||
mon_atk: number;
|
|
||||||
mon_def: number;
|
|
||||||
init_damage: number;
|
|
||||||
per_damage: number;
|
|
||||||
hero_per_damage: number;
|
|
||||||
turn: number;
|
|
||||||
damage: number;
|
|
||||||
[x: string]: any;
|
|
||||||
} | null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare const enemys: new () => Enemys;
|
||||||
|
803
src/types/event.d.ts
vendored
803
src/types/event.d.ts
vendored
File diff suppressed because it is too large
Load Diff
313
src/types/eventDec.d.ts
vendored
Normal file
313
src/types/eventDec.d.ts
vendored
Normal file
@ -0,0 +1,313 @@
|
|||||||
|
type MotaAction = any;
|
||||||
|
type MotaEvent = any[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 某种类型的商店
|
||||||
|
*/
|
||||||
|
type ShopEventOf<T extends keyof ShopEventMap> = ShopEventMap[T];
|
||||||
|
|
||||||
|
interface ShopEventMap {
|
||||||
|
/**
|
||||||
|
* 普通商店
|
||||||
|
*/
|
||||||
|
common: CommonShopEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 道具商店
|
||||||
|
*/
|
||||||
|
item: ItemShopEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 公共事件商店
|
||||||
|
*/
|
||||||
|
event: CommonEventShopEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ShopEventBase {
|
||||||
|
/**
|
||||||
|
* 商店的id
|
||||||
|
*/
|
||||||
|
id: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商店快捷名称
|
||||||
|
*/
|
||||||
|
textInList: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否在未开启状态下快捷商店不显示该商店
|
||||||
|
*/
|
||||||
|
mustEnable: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否不可预览
|
||||||
|
*/
|
||||||
|
disablePreview: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 普通商店的一个商店选项
|
||||||
|
*/
|
||||||
|
interface CommonShopChoice {
|
||||||
|
/**
|
||||||
|
* 选项文字
|
||||||
|
*/
|
||||||
|
text: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选项需求,需要是一个表达式
|
||||||
|
*/
|
||||||
|
need: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图标
|
||||||
|
*/
|
||||||
|
icon: AllIds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文字的颜色
|
||||||
|
*/
|
||||||
|
color: Color;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 该选项被选中时执行的事件
|
||||||
|
*/
|
||||||
|
action: MotaEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 普通商店
|
||||||
|
*/
|
||||||
|
interface CommonShopEvent extends ShopEventBase {
|
||||||
|
/**
|
||||||
|
* 商店中显示的文字
|
||||||
|
*/
|
||||||
|
text: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 普通商店的选项
|
||||||
|
*/
|
||||||
|
choices: CommonShopChoice[];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 道具商店的一个选项
|
||||||
|
*/
|
||||||
|
interface ItemShopChoice {
|
||||||
|
/**
|
||||||
|
* 该选项的道具id
|
||||||
|
*/
|
||||||
|
id: AllIdsOf<'items'>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 道具存量
|
||||||
|
*/
|
||||||
|
number: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 购买时消耗的资源数量,是字符串大概是因为这玩意可以用${}
|
||||||
|
*/
|
||||||
|
money: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 卖出时获得的资源数量
|
||||||
|
*/
|
||||||
|
sell: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 出现条件
|
||||||
|
*/
|
||||||
|
condition: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 道具商店
|
||||||
|
*/
|
||||||
|
interface ItemShopEvent extends ShopEventBase {
|
||||||
|
/**
|
||||||
|
* 道具商店标识
|
||||||
|
*/
|
||||||
|
item: true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 购买消耗什么东西,金币还是经验
|
||||||
|
*/
|
||||||
|
use: 'money' | 'exp';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每个选项
|
||||||
|
*/
|
||||||
|
choices: ItemShopChoice[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CommonEventShopEvent {
|
||||||
|
/**
|
||||||
|
* 使用的公共事件
|
||||||
|
*/
|
||||||
|
commonEvent: EventDeclaration;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AutoEventBase {
|
||||||
|
/**
|
||||||
|
* 自动事件的触发条件
|
||||||
|
*/
|
||||||
|
condition: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否只在当前层检测
|
||||||
|
*/
|
||||||
|
currentFloor: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优先级,优先级越高越优先执行
|
||||||
|
*/
|
||||||
|
priority: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否在事件流中延迟执行
|
||||||
|
*/
|
||||||
|
delayExecute: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否允许多次执行
|
||||||
|
*/
|
||||||
|
multiExecute: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当条件满足时执行的事件
|
||||||
|
*/
|
||||||
|
data: MotaEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AutoEvent extends AutoEventBase {
|
||||||
|
/**
|
||||||
|
* 当前的楼层id
|
||||||
|
*/
|
||||||
|
floorId: FloorIds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自动事件的索引
|
||||||
|
*/
|
||||||
|
index: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事件所在的横坐标
|
||||||
|
*/
|
||||||
|
x: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事件所在的纵坐标
|
||||||
|
*/
|
||||||
|
y: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事件的唯一标识符
|
||||||
|
*/
|
||||||
|
symbol: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface LevelChooseEvent {
|
||||||
|
/**
|
||||||
|
* 难度名称
|
||||||
|
*/
|
||||||
|
title: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 难度简称
|
||||||
|
*/
|
||||||
|
name: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 难度的hard值
|
||||||
|
*/
|
||||||
|
hard: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 难度的颜色
|
||||||
|
*/
|
||||||
|
color: RGBArray;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选择该难度时执行的事件
|
||||||
|
*/
|
||||||
|
action: MotaEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface LevelUpEvent {
|
||||||
|
/**
|
||||||
|
* 升级所需经验
|
||||||
|
*/
|
||||||
|
need: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 这个等级的等级名
|
||||||
|
*/
|
||||||
|
title: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 升级时执行的事件
|
||||||
|
*/
|
||||||
|
action: MotaEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 门信息
|
||||||
|
*/
|
||||||
|
interface DoorInfo {
|
||||||
|
/**
|
||||||
|
* 开门时间
|
||||||
|
*/
|
||||||
|
time: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开门音效
|
||||||
|
*/
|
||||||
|
openSound: SoundIds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关门音效
|
||||||
|
*/
|
||||||
|
closeSound: SoundIds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 需要的钥匙
|
||||||
|
*/
|
||||||
|
keys: Partial<Record<ItemIdOf<'tools'> | `${ItemIdOf<'tools'>}:o`, number>>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开门后事件
|
||||||
|
*/
|
||||||
|
afterOpenDoor?: MotaEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ChangeFloorEvent {
|
||||||
|
/**
|
||||||
|
* 到达的楼层
|
||||||
|
*/
|
||||||
|
floorId: ':before' | ':after' | ':now' | FloorIds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 到达的坐标,填了的话stair就无效了
|
||||||
|
*/
|
||||||
|
loc?: LocArr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 到达的坐标
|
||||||
|
*/
|
||||||
|
stair?: FloorChangeStair;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 勇士朝向
|
||||||
|
*/
|
||||||
|
direction?: HeroTurnDir;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 楼层转换时间
|
||||||
|
*/
|
||||||
|
time?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否不可穿透
|
||||||
|
*/
|
||||||
|
ignoreChangeFloor?: boolean;
|
||||||
|
}
|
456
src/types/eventStatus.d.ts
vendored
Normal file
456
src/types/eventStatus.d.ts
vendored
Normal file
@ -0,0 +1,456 @@
|
|||||||
|
interface EventStatusDataMap {
|
||||||
|
/**
|
||||||
|
* 执行事件中
|
||||||
|
*/
|
||||||
|
action: ActionStatusData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 怪物手册的信息,是当前选择了哪个怪物
|
||||||
|
*/
|
||||||
|
book: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 楼层传送器中当前楼层索引
|
||||||
|
*/
|
||||||
|
fly: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 浏览地图时的信息
|
||||||
|
*/
|
||||||
|
viewMaps: ViewMapStatusData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 装备栏的信息
|
||||||
|
*/
|
||||||
|
equipbox: EquipboxStatusData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 道具栏的信息
|
||||||
|
*/
|
||||||
|
toolbox: ToolboxStatusData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存档界面的信息
|
||||||
|
*/
|
||||||
|
save: SaveStatusData;
|
||||||
|
load: SaveStatusData;
|
||||||
|
replayLoad: SaveStatusData;
|
||||||
|
replayRemain: SaveStatusData;
|
||||||
|
replaySince: SaveStatusData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文本框界面的信息
|
||||||
|
*/
|
||||||
|
text: TextStatusData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确认框界面的信息
|
||||||
|
*/
|
||||||
|
confirmBox: ConfirmStatusData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关于界面,帮助界面,怪物手册详细信息界面,虚拟键盘界面,系统设置界面,系统选项栏界面,
|
||||||
|
* 快捷商店界面,存档笔记界面,同步存档界面,光标界面,录像回放界面,游戏信息界面,没有东西
|
||||||
|
*/
|
||||||
|
about: null;
|
||||||
|
help: null;
|
||||||
|
'book-detail': null;
|
||||||
|
keyBoard: null;
|
||||||
|
switchs: null;
|
||||||
|
'switchs-sounds': null;
|
||||||
|
'switchs-display': null;
|
||||||
|
'switchs-action': null;
|
||||||
|
settings: null;
|
||||||
|
selectShop: null;
|
||||||
|
notes: null;
|
||||||
|
syncSave: null;
|
||||||
|
syncSelect: null;
|
||||||
|
localSaveSelect: null;
|
||||||
|
storageRemove: null;
|
||||||
|
cursor: null;
|
||||||
|
replay: null;
|
||||||
|
gameInfo: null;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface _EventStatusSelectionMap {
|
||||||
|
/**
|
||||||
|
* 执行事件中,一般是选择框的当前选中项
|
||||||
|
*/
|
||||||
|
action: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 装备栏中当前选中了哪个装备
|
||||||
|
*/
|
||||||
|
equipbox: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 道具栏中当前选中了哪个道具
|
||||||
|
*/
|
||||||
|
toolbox: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前是否是删除模式
|
||||||
|
*/
|
||||||
|
save: boolean;
|
||||||
|
load: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前选择了确认(0)还是取消(1)
|
||||||
|
*/
|
||||||
|
confirmBox: 0 | 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统设置界面,存档笔记界面,同步存档界面,录像回放界面,游戏信息界面,当前的选择项
|
||||||
|
*/
|
||||||
|
switchs: number;
|
||||||
|
'switchs-sounds': number;
|
||||||
|
'switchs-display': number;
|
||||||
|
'switchs-action': number;
|
||||||
|
settings: number;
|
||||||
|
notes: number;
|
||||||
|
syncSave: number;
|
||||||
|
syncSelect: number;
|
||||||
|
localSaveSelect: number;
|
||||||
|
storageRemove: number;
|
||||||
|
replay: number;
|
||||||
|
gameInfo: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface _EventStatusUiMap {
|
||||||
|
/**
|
||||||
|
* 执行事件中,一般是与选择框有关的
|
||||||
|
*/
|
||||||
|
action: ActionStatusUi;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果是从浏览地图界面呼出的怪物手册,该项是当前正在浏览的地图的索引(注意不是id)
|
||||||
|
*/
|
||||||
|
book: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确认框中显示的文字
|
||||||
|
*/
|
||||||
|
confirmBox: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示设置的选择信息
|
||||||
|
*/
|
||||||
|
'switchs-display': SwitchsStatusData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统选项栏的选择信息
|
||||||
|
*/
|
||||||
|
settings: SwitchsStatusData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 快捷商店界面,存档笔记界面,同步存档界面,录像回放界面,游戏信息界面的绘制信息
|
||||||
|
*/
|
||||||
|
selectShop: SelectShopStatusUi;
|
||||||
|
notes: SelectShopStatusUi;
|
||||||
|
syncSave: SelectShopStatusUi;
|
||||||
|
syncSelect: SelectShopStatusUi;
|
||||||
|
localSaveSelect: SelectShopStatusUi;
|
||||||
|
storageRemove: SelectShopStatusUi;
|
||||||
|
gameInfo: SelectShopStatusUi;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface _EventStatusIntervalMap {
|
||||||
|
/**
|
||||||
|
* 执行事件中,一般用于呼出某个界面时暂存当前事件信息(?
|
||||||
|
*/
|
||||||
|
action: ActionStatusData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果是从事件中呼出的,用于存储当前事件信息,当退出怪物手册时恢复事件
|
||||||
|
*/
|
||||||
|
book: ActionStatusData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果是从事件中呼出的,用于存储当前事件信息,当退出存档节目时恢复事件
|
||||||
|
*/
|
||||||
|
save: ActionStatusData;
|
||||||
|
load: ActionStatusData;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface _EventStatusTimeoutMap {
|
||||||
|
/**
|
||||||
|
* 执行事件中,一般是等待用户操作事件等事件中的超时时间的判定
|
||||||
|
*/
|
||||||
|
action: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface _EventStatusAnimateUiMap {
|
||||||
|
/**
|
||||||
|
* 执行事件中,一般是对话框事件的动画定时器
|
||||||
|
*/
|
||||||
|
action: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
type EventStatus = keyof EventStatusDataMap;
|
||||||
|
|
||||||
|
type _FillEventStatus<T> = {
|
||||||
|
[P in EventStatus]: P extends keyof T ? T[P] : null;
|
||||||
|
};
|
||||||
|
|
||||||
|
type EventStatusSelectionMap = _FillEventStatus<_EventStatusSelectionMap>;
|
||||||
|
type EventStatusUiMap = _FillEventStatus<_EventStatusUiMap>;
|
||||||
|
type EventStatusIntervalMap = _FillEventStatus<_EventStatusIntervalMap>;
|
||||||
|
type EventStatusTimeoutMap = _FillEventStatus<_EventStatusTimeoutMap>;
|
||||||
|
type EventStatusAnimateUiMap = _FillEventStatus<_EventStatusAnimateUiMap>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 某个事件状态下的信息
|
||||||
|
*/
|
||||||
|
interface EventStatusOf<T extends EventStatus = EventStatus> {
|
||||||
|
/**
|
||||||
|
* 当前事件状态的类型
|
||||||
|
*/
|
||||||
|
id: T;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前事件状态的信息
|
||||||
|
*/
|
||||||
|
data: EventStatusDataMap[T];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前事件状态的选择信息
|
||||||
|
*/
|
||||||
|
selection: EventStatusSelectionMap[T];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前事件状态的ui信息
|
||||||
|
*/
|
||||||
|
ui: EventStatusUiMap[T];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前事件状态的定时器信息
|
||||||
|
*/
|
||||||
|
interval: EventStatusIntervalMap[T];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前事件状态的计时器信息
|
||||||
|
*/
|
||||||
|
timeout: EventStatusTimeoutMap[T];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前事件状态的动画信息
|
||||||
|
*/
|
||||||
|
animateUi: EventStatusAnimateUiMap[T];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ActionStatusEventList {
|
||||||
|
/**
|
||||||
|
* 要执行的事件列表
|
||||||
|
*/
|
||||||
|
todo: MotaEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全部的事件列表
|
||||||
|
*/
|
||||||
|
total: MotaEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行条件
|
||||||
|
*/
|
||||||
|
contidion: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ActionLocStackInfo {
|
||||||
|
/**
|
||||||
|
* 横坐标
|
||||||
|
*/
|
||||||
|
x: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 纵坐标
|
||||||
|
*/
|
||||||
|
y: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 楼层id
|
||||||
|
*/
|
||||||
|
floorId: FloorIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行事件中
|
||||||
|
*/
|
||||||
|
interface ActionStatusData {
|
||||||
|
/**
|
||||||
|
* 当前的事件列表
|
||||||
|
*/
|
||||||
|
list: DeepReadonly<ActionStatusEventList>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事件执行的横坐标,或者对话框的横坐标
|
||||||
|
*/
|
||||||
|
x?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事件执行的纵坐标,或者对话框的纵坐标
|
||||||
|
*/
|
||||||
|
y?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事件执行完毕的回调函数
|
||||||
|
*/
|
||||||
|
callback?: () => void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不太清楚用处,可能是与自动事件有关的
|
||||||
|
*/
|
||||||
|
appendingEvents: MotaEvent[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事件的坐标栈
|
||||||
|
*/
|
||||||
|
locStack: any[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前的事件类型
|
||||||
|
*/
|
||||||
|
type: EventType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前事件
|
||||||
|
*/
|
||||||
|
current: MotaAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ActionStatusUi {
|
||||||
|
/**
|
||||||
|
* 显示文字事件的文字,包括确认框等
|
||||||
|
*/
|
||||||
|
text: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确认框中确定时执行的事件
|
||||||
|
*/
|
||||||
|
yes?: MotaEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确认框中取消时执行的事件
|
||||||
|
*/
|
||||||
|
no?: MotaEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前是选择事件时所有的选项
|
||||||
|
*/
|
||||||
|
choices?: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前是选择事件时选项框的宽度
|
||||||
|
*/
|
||||||
|
width?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ViewMapStatusData {
|
||||||
|
/**
|
||||||
|
* 当前浏览的楼层索引
|
||||||
|
*/
|
||||||
|
index: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否显示伤害
|
||||||
|
*/
|
||||||
|
damage: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 大地图是否显示全部地图
|
||||||
|
*/
|
||||||
|
all: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 大地图不显示全部地图时当前的横坐标,单位格子
|
||||||
|
*/
|
||||||
|
x: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 大地图不显示全部地图时当前的纵坐标,单位格子
|
||||||
|
*/
|
||||||
|
y: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EquipboxStatusData {
|
||||||
|
/**
|
||||||
|
* 拥有装备的当前页数
|
||||||
|
*/
|
||||||
|
page: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前选中的装备
|
||||||
|
*/
|
||||||
|
selectId: ItemIdOf<'equips'>;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ToolboxStatusData {
|
||||||
|
/**
|
||||||
|
* 消耗道具的当前页码数
|
||||||
|
*/
|
||||||
|
toolsPage: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 永久道具的当前页码数
|
||||||
|
*/
|
||||||
|
constantsPage: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前选中的道具id
|
||||||
|
*/
|
||||||
|
selectId: ItemIdOf<'constants' | 'tools'>;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SaveStatusData {
|
||||||
|
/**
|
||||||
|
* 当前存读档界面的页码数
|
||||||
|
*/
|
||||||
|
page: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选择的框的偏移量,在不同状态下意义不同
|
||||||
|
*/
|
||||||
|
offset: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前存读档界面的模式,fav表示收藏,all表示所有存档
|
||||||
|
*/
|
||||||
|
mode: 'fav' | 'all';
|
||||||
|
}
|
||||||
|
|
||||||
|
interface TextStatusData {
|
||||||
|
/**
|
||||||
|
* 文本框要显示的文字列表
|
||||||
|
*/
|
||||||
|
list: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文字显示完毕后的回调函数
|
||||||
|
*/
|
||||||
|
callback: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ConfirmStatusData {
|
||||||
|
/**
|
||||||
|
* 点击确认时
|
||||||
|
*/
|
||||||
|
yes: () => void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 点击取消时
|
||||||
|
*/
|
||||||
|
no: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SwitchsStatusData {
|
||||||
|
/**
|
||||||
|
* 选择项
|
||||||
|
*/
|
||||||
|
choices: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SelectShopStatusUi {
|
||||||
|
/**
|
||||||
|
* 选择框的偏移量
|
||||||
|
*/
|
||||||
|
offset: number;
|
||||||
|
}
|
282
src/types/function.d.ts
vendored
Normal file
282
src/types/function.d.ts
vendored
Normal file
@ -0,0 +1,282 @@
|
|||||||
|
interface ActionData {
|
||||||
|
/**
|
||||||
|
* 当按键弹起时
|
||||||
|
* @param keyCode 按键的keyCode
|
||||||
|
* @param altKey 当前是否按下了alt键
|
||||||
|
*/
|
||||||
|
onKeyUp(keyCode: number, altKey: boolean): boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当点击状态栏时
|
||||||
|
* @param px 点击的横坐标
|
||||||
|
* @param py 点击的纵坐标
|
||||||
|
* @param vertical 当前是否是竖屏
|
||||||
|
*/
|
||||||
|
onClickStatusBar(px: number, py: number, vertical: boolean): boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ControlData {
|
||||||
|
/**
|
||||||
|
* 获取保存信息
|
||||||
|
*/
|
||||||
|
saveData(): Save;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取一个存档
|
||||||
|
* @param data 存档信息
|
||||||
|
* @param callback 读取完毕后的回调函数
|
||||||
|
*/
|
||||||
|
loadData(data: Save, callback?: () => void): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取一个属性对应的中文名
|
||||||
|
* @param name 要获取的状态名称
|
||||||
|
*/
|
||||||
|
getStatusLabel(name: string): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 变更勇士的debuff
|
||||||
|
* @param action 触发的类型,get表示获得debuff,remove表示移除debuff
|
||||||
|
* @param type 获取的debuff列表
|
||||||
|
*/
|
||||||
|
triggerDebuff(action: 'get' | 'remove', type: string | string[]): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 立即仅更新状态栏
|
||||||
|
*/
|
||||||
|
updateStatusBar(): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新一个地图的地图伤害
|
||||||
|
* @param floorId 要更新的楼层id
|
||||||
|
*/
|
||||||
|
updateCheckBlock(floorId: FloorIds): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每步移动后执行的函数
|
||||||
|
* @param callback 回调函数(好像没什么必要吧
|
||||||
|
*/
|
||||||
|
moveOneStep(callback?: () => void): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 瞬移到某一点
|
||||||
|
* @param x 瞬移至的横坐标
|
||||||
|
* @param y 瞬移至的纵坐标
|
||||||
|
* @param ignoreSteps 忽略的步数,不填则会自动计算
|
||||||
|
*/
|
||||||
|
moveDirectly(x: number, y: number, ignoreSteps?: number): boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 并行脚本
|
||||||
|
* @param time 距离游戏加载完毕经过的时间
|
||||||
|
*/
|
||||||
|
parallelDo(time: number): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EnemyData {
|
||||||
|
/**
|
||||||
|
* 获得所有特殊属性定义
|
||||||
|
*/
|
||||||
|
getSpecials(): EnemySpecialDeclaration[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得怪物真实属性
|
||||||
|
* @param enemy 敌人id或敌人对象
|
||||||
|
* @param hero 勇士信息,不填则从core.status.hero获取
|
||||||
|
* @param x 敌人的横坐标
|
||||||
|
* @param y 敌人的纵坐标
|
||||||
|
* @param floorId 敌人所在的地图
|
||||||
|
*/
|
||||||
|
getEnemyInfo(
|
||||||
|
enemy: EnemyIds | Enemy,
|
||||||
|
hero?: HeroStatus,
|
||||||
|
x?: number,
|
||||||
|
y?: number,
|
||||||
|
floorId?: FloorIds
|
||||||
|
): EnemyInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得战斗伤害信息(实际伤害计算函数)
|
||||||
|
* @param enemy 敌人id或敌人对象
|
||||||
|
* @param hero 勇士信息,不填则从core.status.hero获取
|
||||||
|
* @param x 敌人的横坐标
|
||||||
|
* @param y 敌人的纵坐标
|
||||||
|
* @param floorId 敌人所在的地图
|
||||||
|
*/
|
||||||
|
getDamageInfo(
|
||||||
|
enemy: EnemyIds | Enemy,
|
||||||
|
hero?: Partial<HeroStatus>,
|
||||||
|
x?: number,
|
||||||
|
y?: number,
|
||||||
|
floorId?: FloorIds
|
||||||
|
): DamageInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判定某种特殊属性的有无
|
||||||
|
* @example core.hasSpecial('greenSlime', 1) // 判定绿头怪有无先攻属性
|
||||||
|
* @param special 敌人id或敌人对象或正整数数组或自然数
|
||||||
|
* @param test 待检查的属性编号
|
||||||
|
* @returns 若special为数组或数且含有test或相等、或special为敌人id或对象且具有此属性,则返回true
|
||||||
|
*/
|
||||||
|
hasSpecial(
|
||||||
|
special: number | number[] | EnemyIds | Enemy,
|
||||||
|
test: number
|
||||||
|
): boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface UiData {
|
||||||
|
/**
|
||||||
|
* 获取道具栏要显示的道具
|
||||||
|
* @param cls 要获取的类型
|
||||||
|
*/
|
||||||
|
getToolboxItems<T extends Exclude<ItemCls, 'items'>>(cls: T): ItemIdOf<T>[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绘制状态栏
|
||||||
|
*/
|
||||||
|
drawStatusBar(): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据统计界面统计的道具数量
|
||||||
|
*/
|
||||||
|
drawStatistics(): AllIdsOf<'items'>[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绘制关于界面
|
||||||
|
*/
|
||||||
|
drawAbout(): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EventData {
|
||||||
|
/**
|
||||||
|
* 重置游戏
|
||||||
|
* @param hero 勇士信息
|
||||||
|
* @param hard 难度信息
|
||||||
|
* @param floorId 勇士所在楼层
|
||||||
|
* @param maps 所有的地图信息
|
||||||
|
* @param values 全局数值信息
|
||||||
|
*/
|
||||||
|
resetGame(
|
||||||
|
hero: HeroStatus,
|
||||||
|
hard: string,
|
||||||
|
floorId: FloorIds,
|
||||||
|
maps: GameStatus['maps'],
|
||||||
|
values: Partial<CoreValues>
|
||||||
|
): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 游戏获胜
|
||||||
|
* @param reason 胜利原因
|
||||||
|
* @param norank 是否不计榜
|
||||||
|
* @param noexit 是否不退出
|
||||||
|
*/
|
||||||
|
win(reason: string, norank?: boolean, noexit?: boolean): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 游戏失败
|
||||||
|
* @param reason 失败原因
|
||||||
|
*/
|
||||||
|
lose(reason: string): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 切换楼层中,即屏幕完全变黑的那一刻
|
||||||
|
* @param floorId 目标楼层
|
||||||
|
* @param heroLoc 勇士到达的位置
|
||||||
|
*/
|
||||||
|
changingFloor(floorId: FloorIds, heroLoc: Loc): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 切换楼层后
|
||||||
|
* @param floorId 目标楼层
|
||||||
|
*/
|
||||||
|
afterChangeFloor(floorId: FloorIds): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 飞往某个楼层
|
||||||
|
* @param toId 目标楼层
|
||||||
|
* @param callback 飞到后的回调函数
|
||||||
|
*/
|
||||||
|
flyTo(toId: FloorIds, callback: () => void): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 与怪物战斗前
|
||||||
|
* @param enemyId 打败的怪物
|
||||||
|
* @param x 怪物横坐标
|
||||||
|
* @param y 怪物纵坐标
|
||||||
|
*/
|
||||||
|
beforeBattle(
|
||||||
|
enemyId: AllIdsOf<'enemys' | 'enemy48'>,
|
||||||
|
x?: number,
|
||||||
|
y?: number
|
||||||
|
): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 与怪物战斗后
|
||||||
|
* @param enemyId 打败的怪物
|
||||||
|
* @param x 怪物横坐标
|
||||||
|
* @param y 怪物纵坐标
|
||||||
|
*/
|
||||||
|
afterBattle(
|
||||||
|
enemyId: AllIdsOf<'enemys' | 'enemy48'>,
|
||||||
|
x?: number,
|
||||||
|
y?: number
|
||||||
|
): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开门后
|
||||||
|
* @param doorId 门的id
|
||||||
|
* @param x 门的横坐标
|
||||||
|
* @param y 门的纵坐标
|
||||||
|
*/
|
||||||
|
afterOpenDoor(
|
||||||
|
doorId: AllIdsOf<Exclude<Cls, 'enemys' | 'enemy48'>>,
|
||||||
|
x: number,
|
||||||
|
y: number
|
||||||
|
): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得道具后
|
||||||
|
* @param itemId 道具id
|
||||||
|
* @param x 道具横坐标
|
||||||
|
* @param y 道具纵坐标
|
||||||
|
* @param isGentleClick 是否是轻按
|
||||||
|
*/
|
||||||
|
afterGetItem(
|
||||||
|
itemId: AllIdsOf<'items'>,
|
||||||
|
x: number,
|
||||||
|
y: number,
|
||||||
|
isGentleClick?: boolean
|
||||||
|
): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 推箱子后
|
||||||
|
*/
|
||||||
|
afterPushBox(): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FunctionsData {
|
||||||
|
/**
|
||||||
|
* 交互信息
|
||||||
|
*/
|
||||||
|
actions: ActionData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 游戏的逻辑信息
|
||||||
|
*/
|
||||||
|
control: ControlData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 怪物信息
|
||||||
|
*/
|
||||||
|
enemys: EnemyData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ui信息
|
||||||
|
*/
|
||||||
|
ui: UiData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事件信息
|
||||||
|
*/
|
||||||
|
events: EventData;
|
||||||
|
}
|
81
src/types/icon.d.ts
vendored
81
src/types/icon.d.ts
vendored
@ -1,20 +1,71 @@
|
|||||||
/** 和图标相关的函数 */
|
type IconIds =
|
||||||
declare class icons {
|
| keyof MaterialIcon['animates']
|
||||||
/** 获得所有图标类型 */
|
| keyof MaterialIcon['autotile']
|
||||||
getIcons(): void;
|
| keyof MaterialIcon['enemy48']
|
||||||
|
| keyof MaterialIcon['enemys']
|
||||||
|
| keyof MaterialIcon['hero']
|
||||||
|
| keyof MaterialIcon['items']
|
||||||
|
| keyof MaterialIcon['items']
|
||||||
|
| keyof MaterialIcon['npc48']
|
||||||
|
| keyof MaterialIcon['npcs']
|
||||||
|
| keyof MaterialIcon['terrains'];
|
||||||
|
|
||||||
/** 根据ID获得其类型 */
|
interface IconOffsetInfo {
|
||||||
getClsFromId(id?: string): BlockCls;
|
/**
|
||||||
|
* 图块所在额外素材的id
|
||||||
/** 获得所有图标的ID */
|
*/
|
||||||
getAllIconIds(): void;
|
image: string;
|
||||||
|
|
||||||
/** 根据图块数字或ID获得所在的tileset和坐标信息 */
|
|
||||||
getTilesetOffset(id?: string): void;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取图块的帧数
|
* 图块所在图片位于额外素材的横坐标
|
||||||
* @param cls 图块类型
|
|
||||||
*/
|
*/
|
||||||
getAnimateFrames(cls: BlockCls): 1 | 2 | 4;
|
x: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图块所在图片位于额外素材的纵坐标
|
||||||
|
*/
|
||||||
|
y: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 和图标相关的内容
|
||||||
|
*/
|
||||||
|
interface Icons {
|
||||||
|
/**
|
||||||
|
* 图标信息
|
||||||
|
*/
|
||||||
|
readonly icons: MaterialIcon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 额外素材偏移起点
|
||||||
|
*/
|
||||||
|
readonly tilesetStartOffset: 10000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图标的id
|
||||||
|
*/
|
||||||
|
readonly allIconIds: IconIds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得所有图标类型
|
||||||
|
*/
|
||||||
|
getIcons(): MaterialIcon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据ID获得图块类型
|
||||||
|
*/
|
||||||
|
getClsFromId<T extends AllIds>(id: T): ClsOf<T>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得所有图标的ID
|
||||||
|
*/
|
||||||
|
getAllIconIds(): IconIds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据图块数字或ID获得所在的tileset和坐标信息
|
||||||
|
* @param id 图块数字或id
|
||||||
|
*/
|
||||||
|
getTilesetOffset(id: string | number): IconOffsetInfo | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare const icons: new () => Icons;
|
||||||
|
206
src/types/item.d.ts
vendored
206
src/types/item.d.ts
vendored
@ -1,12 +1,117 @@
|
|||||||
/** @file items.js 主要负责一切和道具相关的内容。 */
|
interface Item<I extends AllIdsOf<'items'>> {
|
||||||
declare class items {
|
|
||||||
/**
|
/**
|
||||||
* 即捡即用类的道具获得时的效果
|
* 道具id
|
||||||
|
*/
|
||||||
|
id: I;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 道具的类型
|
||||||
|
*/
|
||||||
|
cls: ItemClsOf<I>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 道具的名称
|
||||||
|
*/
|
||||||
|
name: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 道具的描述
|
||||||
|
*/
|
||||||
|
text?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否在道具栏隐藏
|
||||||
|
*/
|
||||||
|
hideInToolBox: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 装备信息
|
||||||
|
*/
|
||||||
|
equip: ItemClsOf<I> extends 'equips' ? Equip : never;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 回放使用时是否不先打开道具栏再使用
|
||||||
|
*/
|
||||||
|
hideInReplay: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 即捡即用效果
|
||||||
|
*/
|
||||||
|
itemEffect?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 即捡即用道具捡过之后的提示
|
||||||
|
*/
|
||||||
|
itemEffectTip?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用道具时执行的事件
|
||||||
|
*/
|
||||||
|
useItemEvent?: MotaEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用道具时执行的代码
|
||||||
|
*/
|
||||||
|
useItemEffect?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 能否使用道具
|
||||||
|
*/
|
||||||
|
canUseItemEffect?: string | boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EquipBase {
|
||||||
|
/**
|
||||||
|
* 装备增加的数值
|
||||||
|
*/
|
||||||
|
value: Record<keyof SelectType<HeroStatus, number>, number>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 装备增加的百分比
|
||||||
|
*/
|
||||||
|
percentage: Record<keyof SelectType<HeroStatus, number>, number>;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Equip extends EquipBase {
|
||||||
|
/**
|
||||||
|
* 可以装备到的装备孔
|
||||||
|
*/
|
||||||
|
type: number | string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 动画信息
|
||||||
|
*/
|
||||||
|
animate: AnimationIds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 穿上装备时执行的事件
|
||||||
|
*/
|
||||||
|
equipEvent?: MotaEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 脱下装备时执行的事件
|
||||||
|
*/
|
||||||
|
unequipEvent?: MotaEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 道具相关的内容
|
||||||
|
*/
|
||||||
|
interface Items {
|
||||||
|
/**
|
||||||
|
* 获得所有道具
|
||||||
|
*/
|
||||||
|
getItems(): {
|
||||||
|
[P in AllIdsOf<'items'>]: Item<P>;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行即捡即用类的道具获得时的效果
|
||||||
* @example core.getItemEffect('redPotion', 10) // 执行获得10瓶红血的效果
|
* @example core.getItemEffect('redPotion', 10) // 执行获得10瓶红血的效果
|
||||||
* @param itemId 道具id
|
* @param itemId 道具id
|
||||||
* @param itemNum 道具数量,可选,默认为1
|
* @param itemNum 道具数量,默认为1
|
||||||
*/
|
*/
|
||||||
getItemEffect(itemId: string, itemNum?: number): void;
|
getItemEffect(itemId: AllIdsOf<'items'>, itemNum?: number): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 即捡即用类的道具获得时的额外提示
|
* 即捡即用类的道具获得时的额外提示
|
||||||
@ -14,16 +119,20 @@ declare class items {
|
|||||||
* @param itemId 道具id
|
* @param itemId 道具id
|
||||||
* @returns 图块属性itemEffectTip的内容
|
* @returns 图块属性itemEffectTip的内容
|
||||||
*/
|
*/
|
||||||
getItemEffectTip(itemId: string): string;
|
getItemEffectTip(itemId: AllIdsOf<'items'>): string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 使用一个道具
|
* 使用一个道具
|
||||||
* @example core.useItem('pickaxe', true) // 使用破墙镐,不计入录像,无回调
|
* @example core.useItem('pickaxe', true) // 使用破墙镐,不计入录像,无回调
|
||||||
* @param itemId 道具id
|
* @param itemId 道具id
|
||||||
* @param noRoute 是否不计入录像,快捷键使用的请填true,否则可省略
|
* @param noRoute 是否不计入录像,快捷键使用的请填true,否则可省略
|
||||||
* @param callback 道具使用完毕或使用失败后的回调函数
|
* @param callback 道具使用完毕或使用失败后的回调函数,好像没什么意义吧(
|
||||||
*/
|
*/
|
||||||
useItem(itemId: string, noRoute?: boolean, callback?: () => void): void;
|
useItem(
|
||||||
|
itemId: ItemIdOf<'tools' | 'constants'>,
|
||||||
|
noRoute?: boolean,
|
||||||
|
callback?: () => void
|
||||||
|
): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查能否使用某种道具
|
* 检查能否使用某种道具
|
||||||
@ -31,7 +140,7 @@ declare class items {
|
|||||||
* @param itemId 道具id
|
* @param itemId 道具id
|
||||||
* @returns true表示可以使用
|
* @returns true表示可以使用
|
||||||
*/
|
*/
|
||||||
canUseItem(itemId: string): boolean;
|
canUseItem(itemId: AllIdsOf<'items'>): boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 统计某种道具的持有量
|
* 统计某种道具的持有量
|
||||||
@ -39,7 +148,7 @@ declare class items {
|
|||||||
* @param itemId 道具id
|
* @param itemId 道具id
|
||||||
* @returns 该种道具的持有量,不包括已穿戴的装备
|
* @returns 该种道具的持有量,不包括已穿戴的装备
|
||||||
*/
|
*/
|
||||||
itemCount(itemId: string): number;
|
itemCount(itemId: AllIdsOf<'items'>): number;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查主角是否持有某种道具(不包括已穿戴的装备)
|
* 检查主角是否持有某种道具(不包括已穿戴的装备)
|
||||||
@ -47,7 +156,7 @@ declare class items {
|
|||||||
* @param itemId 道具id
|
* @param itemId 道具id
|
||||||
* @returns true表示持有
|
* @returns true表示持有
|
||||||
*/
|
*/
|
||||||
hasItem(itemId: string): boolean;
|
hasItem(itemId: AllIdsOf<'items'>): boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查主角是否穿戴着某件装备
|
* 检查主角是否穿戴着某件装备
|
||||||
@ -55,7 +164,7 @@ declare class items {
|
|||||||
* @param itemId 装备id
|
* @param itemId 装备id
|
||||||
* @returns true表示已装备
|
* @returns true表示已装备
|
||||||
*/
|
*/
|
||||||
hasEquip(itemId: string): boolean;
|
hasEquip(itemId: ItemIdOf<'equips'>): boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查主角某种类型的装备目前是什么
|
* 检查主角某种类型的装备目前是什么
|
||||||
@ -63,7 +172,7 @@ declare class items {
|
|||||||
* @param equipType 装备类型,自然数
|
* @param equipType 装备类型,自然数
|
||||||
* @returns 装备id,null表示未穿戴
|
* @returns 装备id,null表示未穿戴
|
||||||
*/
|
*/
|
||||||
getEquip(equipType: number): string;
|
getEquip(equipType: number): ItemIdOf<'equips'> | null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置某种道具的持有量
|
* 设置某种道具的持有量
|
||||||
@ -71,15 +180,29 @@ declare class items {
|
|||||||
* @param itemId 道具id
|
* @param itemId 道具id
|
||||||
* @param itemNum 新的持有量,可选,自然数,默认为0
|
* @param itemNum 新的持有量,可选,自然数,默认为0
|
||||||
*/
|
*/
|
||||||
setItem(itemId: string, itemNum?: number): void;
|
setItem(itemId: AllIdsOf<'items'>, itemNum?: number): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 静默增减某种道具的持有量 不会更新游戏画面或是显示提示
|
* 静默增减某种道具的持有量 不会更新游戏画面或是显示提示
|
||||||
* @example core.addItem('yellowKey', -2) // 没收两把黄钥匙
|
* @example core.addItem('yellowKey', -2) // 没收两把黄钥匙
|
||||||
* @param itemId 道具id
|
* @param itemId 道具id
|
||||||
* @param itemNum 增加量,负数表示没收
|
* @param itemNum 增加量,负数表示减少
|
||||||
*/
|
*/
|
||||||
addItem(itemId: string, itemNum?: number): void;
|
addItem(itemId: AllIdsOf<'items'>, itemNum?: number): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated 使用addItem代替。
|
||||||
|
* 删除某个物品一定的数量,相当于addItem(itemId, -n);
|
||||||
|
* @param itemId 道具id
|
||||||
|
* @param itemNum 减少量,负数表示增加
|
||||||
|
*/
|
||||||
|
removeItem(itemId?: AllIdsOf<'items'>, itemNum?: number): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据类型获得一个可用的装备孔
|
||||||
|
* @param equipId 道具名称
|
||||||
|
*/
|
||||||
|
getEquipTypeByName(name?: ItemIdOf<'equips'>): number;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判定某件装备的类型
|
* 判定某件装备的类型
|
||||||
@ -87,7 +210,7 @@ declare class items {
|
|||||||
* @param equipId 装备id
|
* @param equipId 装备id
|
||||||
* @returns 类型编号,自然数
|
* @returns 类型编号,自然数
|
||||||
*/
|
*/
|
||||||
getEquipTypeById(equipId: string): number | string;
|
getEquipTypeById(equipId: ItemIdOf<'equips'>): number;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查能否穿上某件装备
|
* 检查能否穿上某件装备
|
||||||
@ -96,7 +219,7 @@ declare class items {
|
|||||||
* @param hint 无法穿上时是否提示(比如是因为未持有还是别的什么原因)
|
* @param hint 无法穿上时是否提示(比如是因为未持有还是别的什么原因)
|
||||||
* @returns true表示可以穿上,false表示无法穿上
|
* @returns true表示可以穿上,false表示无法穿上
|
||||||
*/
|
*/
|
||||||
canEquip(equipId: string, hint: boolean): boolean;
|
canEquip(equipId: ItemIdOf<'equips'>, hint?: boolean): boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 尝试穿上某件背包里的装备并提示
|
* 尝试穿上某件背包里的装备并提示
|
||||||
@ -104,7 +227,7 @@ declare class items {
|
|||||||
* @param equipId 装备id
|
* @param equipId 装备id
|
||||||
* @param callback 穿戴成功或失败后的回调函数
|
* @param callback 穿戴成功或失败后的回调函数
|
||||||
*/
|
*/
|
||||||
loadEquip(equipId: string, callback?: () => void): void;
|
loadEquip(equipId: ItemIdOf<'equips'>, callback?: () => void): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 脱下某个类型的装备
|
* 脱下某个类型的装备
|
||||||
@ -121,10 +244,10 @@ declare class items {
|
|||||||
* @param beComparedEquipId 装备乙的id
|
* @param beComparedEquipId 装备乙的id
|
||||||
* @returns 两装备的各属性差,甲减乙,0省略
|
* @returns 两装备的各属性差,甲减乙,0省略
|
||||||
*/
|
*/
|
||||||
compareEquipment(
|
compareEquipment<F extends ItemIdOf<'equips'>>(
|
||||||
compareEquipId: string,
|
compareEquipId: F,
|
||||||
beComparedEquipId: string
|
beComparedEquipId: Exclude<ItemIdOf<'equips'>, F>
|
||||||
): { [key: string]: number };
|
): EquipBase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 保存当前套装
|
* 保存当前套装
|
||||||
@ -140,15 +263,6 @@ declare class items {
|
|||||||
*/
|
*/
|
||||||
quickLoadEquip(index: number): void;
|
quickLoadEquip(index: number): void;
|
||||||
|
|
||||||
/** 获得所有道具 */
|
|
||||||
getItems(): void;
|
|
||||||
|
|
||||||
/** 删除某个物品 */
|
|
||||||
removeItem(itemId?: string, itemNum?: number): void;
|
|
||||||
|
|
||||||
/** 根据类型获得一个可用的装备孔 */
|
|
||||||
getEquipTypeByName(name?: string): void;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置某个装备的属性并计入存档
|
* 设置某个装备的属性并计入存档
|
||||||
* @example core.setEquip('sword1', 'value', 'atk', 300, '+='); // 设置铁剑的攻击力数值再加300
|
* @example core.setEquip('sword1', 'value', 'atk', 300, '+='); // 设置铁剑的攻击力数值再加300
|
||||||
@ -156,15 +270,31 @@ declare class items {
|
|||||||
* @param valueType 增幅类型,只能是value(数值)或percentage(百分比)
|
* @param valueType 增幅类型,只能是value(数值)或percentage(百分比)
|
||||||
* @param name 要修改的属性名称,如atk
|
* @param name 要修改的属性名称,如atk
|
||||||
* @param value 要修改到的属性数值
|
* @param value 要修改到的属性数值
|
||||||
* @param operator 操作符,可选,如+=表示在原始值上增加
|
* @param operator 操作符,如+=表示在原始值上增加
|
||||||
* @param prefix 独立开关前缀,一般不需要
|
* @param prefix 独立开关前缀,一般不需要
|
||||||
*/
|
*/
|
||||||
setEquip(
|
setEquip(
|
||||||
equipId: string,
|
equipId: ItemIdOf<'equips'>,
|
||||||
valueType: string,
|
valueType: 'value' | 'percentage',
|
||||||
name: string,
|
name: keyof SelectType<HeroStatus, number>,
|
||||||
value: any,
|
value: number,
|
||||||
operator?: string,
|
operator?: MotaOperator,
|
||||||
prefix?: string
|
prefix?: string
|
||||||
): void;
|
): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 真正的穿脱装备
|
||||||
|
* @param type 装备孔
|
||||||
|
* @param loadId 装上的装备
|
||||||
|
* @param unloadId 脱下的装备
|
||||||
|
* @param callback 回调函数
|
||||||
|
*/
|
||||||
|
_realLoadEquip(
|
||||||
|
type: number,
|
||||||
|
loadId?: ItemIdOf<'equips'>,
|
||||||
|
unloadId?: ItemIdOf<'equips'>,
|
||||||
|
callback?: () => void
|
||||||
|
): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare const items: new () => Items;
|
||||||
|
78
src/types/loader.d.ts
vendored
78
src/types/loader.d.ts
vendored
@ -1,29 +1,65 @@
|
|||||||
/** @file loader.js 主要负责资源的加载 */
|
/**
|
||||||
declare class loader {
|
* 负责资源的加载
|
||||||
/** 加载一系列图片 */
|
*/
|
||||||
loadImages(dir: any, names: any, toSave: any, callback?: () => any): any;
|
interface Loader {
|
||||||
|
/**
|
||||||
|
* 加载一系列图片
|
||||||
|
* @param dir 图片所在目录
|
||||||
|
* @param names 图片名称列表
|
||||||
|
* @param toSave 要保存到的对象
|
||||||
|
* @param callback 加载完毕后的回调函数
|
||||||
|
*/
|
||||||
|
loadImages(
|
||||||
|
dir: string,
|
||||||
|
names: string[],
|
||||||
|
toSave: Record<string, HTMLImageElement>,
|
||||||
|
callback?: () => void
|
||||||
|
): void;
|
||||||
|
|
||||||
/** 加载某一张图片 */
|
/**
|
||||||
loadImage(dir: any, imgName?: any, callback?: () => any): any;
|
* 加载某一张图片
|
||||||
|
* @param dir 图片所在目录
|
||||||
|
* @param imgName 图片名称
|
||||||
|
* @param callback 加载完毕的回调函数
|
||||||
|
*/
|
||||||
|
loadImage(dir: string, imgName: string, callback?: () => void): void;
|
||||||
|
|
||||||
/** 从zip中加载一系列图片 */
|
/**
|
||||||
|
* 从zip中加载一系列图片
|
||||||
|
* @param url 图片所在目录
|
||||||
|
* @param names 图片名称列表
|
||||||
|
*/
|
||||||
loadImagesFromZip(
|
loadImagesFromZip(
|
||||||
url?: any,
|
url: string,
|
||||||
names?: any,
|
names: string,
|
||||||
toSave?: any,
|
toSave: Record<string, HTMLImageElement>,
|
||||||
onprogress?: any,
|
onprogress?: (loaded: number, total: number) => void,
|
||||||
onfinished?: any
|
onfinished?: () => void
|
||||||
): any;
|
): void;
|
||||||
|
|
||||||
/** 加载一个音乐 */
|
/**
|
||||||
loadOneMusic(name?: string): any;
|
* 加载一个音乐
|
||||||
|
* @param name 要加载的音乐的名称
|
||||||
|
*/
|
||||||
|
loadOneMusic(name: BgmIds): void;
|
||||||
|
|
||||||
/** 加载一个音效 */
|
/**
|
||||||
loadOneSound(name?: string): any;
|
* 加载一个音效
|
||||||
|
* @param name 要加载的音效的名称
|
||||||
|
*/
|
||||||
|
loadOneSound(name: SoundIds): void;
|
||||||
|
|
||||||
/** 加载一个bgm */
|
/**
|
||||||
loadBgm(name?: string): any;
|
* 加载一个bgm
|
||||||
|
* @param name 加载的bgm的id或名称
|
||||||
|
*/
|
||||||
|
loadBgm(name: BgmIds | NameMapIn<BgmIds>): void;
|
||||||
|
|
||||||
/** 释放一个bgm的缓存 */
|
/**
|
||||||
freeBgm(name?: string): any;
|
* 释放一个bgm的缓存
|
||||||
|
* @param name 要释放的bgm的id或名称
|
||||||
|
*/
|
||||||
|
freeBgm(name: BgmIds | NameMapIn<BgmIds>): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare const loader: new () => Loader;
|
||||||
|
1358
src/types/map.d.ts
vendored
1358
src/types/map.d.ts
vendored
File diff suppressed because it is too large
Load Diff
98
src/types/source.d.ts
vendored
Normal file
98
src/types/source.d.ts
vendored
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
/**
|
||||||
|
* 图块类型
|
||||||
|
*/
|
||||||
|
type Cls =
|
||||||
|
| 'autotile'
|
||||||
|
| 'animates'
|
||||||
|
| 'enemys'
|
||||||
|
| 'items'
|
||||||
|
| 'npcs'
|
||||||
|
| 'terrains'
|
||||||
|
| 'enemy48'
|
||||||
|
| 'npc48'
|
||||||
|
| 'tilesets';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有的可动画图块类型
|
||||||
|
*/
|
||||||
|
type AnimatableCls = Exclude<Cls, 'items' | 'terrains' | 'tilesets'>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 道具类型
|
||||||
|
*/
|
||||||
|
type ItemCls = 'tools' | 'items' | 'equips' | 'constants';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有的道具id
|
||||||
|
*/
|
||||||
|
type AllIds = keyof IdToNumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有的道具数字
|
||||||
|
*/
|
||||||
|
type AllNumbers = keyof NumberToId | 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 某种类型的图块的id
|
||||||
|
*/
|
||||||
|
type AllIdsOf<T extends Cls> = keyof {
|
||||||
|
[P in keyof IdToCls as IdToCls[P] extends T ? P : never]: P;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 某种类型的道具的id
|
||||||
|
*/
|
||||||
|
type ItemIdOf<T extends ItemCls> = keyof {
|
||||||
|
[P in keyof ItemDeclaration as ItemDeclaration[P] extends T ? P : never]: P;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 某个道具的类型
|
||||||
|
*/
|
||||||
|
type ItemClsOf<T extends AllIdsOf<'items'>> = ItemDeclaration[T];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取某个图块的类型
|
||||||
|
*/
|
||||||
|
type ClsOf<T extends AllIds> = IdToCls[T];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 某种类型的图块数字
|
||||||
|
*/
|
||||||
|
type AllNumbersOf<T extends Cls> = IdToNumber[AllIdsOf<T>];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选取在一段字符串中的映射名称
|
||||||
|
*/
|
||||||
|
type NameMapIn<T extends string> = keyof {
|
||||||
|
[P in keyof NameMap as NameMap[P] extends T ? P : never]: NameMap[P];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有的怪物id
|
||||||
|
*/
|
||||||
|
type EnemyIds = AllIdsOf<'enemys' | 'enemy48'>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 各种图块的动画数量
|
||||||
|
*/
|
||||||
|
interface FrameNumbers {
|
||||||
|
autotile: 4;
|
||||||
|
animates: 4;
|
||||||
|
enemys: 2;
|
||||||
|
items: 1;
|
||||||
|
npcs: 2;
|
||||||
|
terrains: 1;
|
||||||
|
enemy48: 4;
|
||||||
|
npc48: 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 动画帧数
|
||||||
|
*/
|
||||||
|
type FrameOf<T extends Cls> = FrameNumbers[T];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有的文件名
|
||||||
|
*/
|
||||||
|
type SourceIds = ImageIds | AnimationIds | SoundIds | BgmIds | FontIds;
|
1104
src/types/status.d.ts
vendored
1104
src/types/status.d.ts
vendored
File diff suppressed because it is too large
Load Diff
1108
src/types/ui.d.ts
vendored
1108
src/types/ui.d.ts
vendored
File diff suppressed because it is too large
Load Diff
924
src/types/util.d.ts
vendored
924
src/types/util.d.ts
vendored
File diff suppressed because it is too large
Load Diff
@ -44,7 +44,8 @@ import BookDetail from './bookDetail.vue';
|
|||||||
import { LeftOutlined } from '@ant-design/icons-vue';
|
import { LeftOutlined } from '@ant-design/icons-vue';
|
||||||
import { KeyCode } from '../plugin/keyCodes';
|
import { KeyCode } from '../plugin/keyCodes';
|
||||||
|
|
||||||
const floorId = core.floorIds[core.status.event?.ui] ?? core.status.floorId;
|
const floorId =
|
||||||
|
core.floorIds[core.status.event?.ui as number] ?? core.status.floorId;
|
||||||
const enemy = core.getCurrentEnemys(floorId);
|
const enemy = core.getCurrentEnemys(floorId);
|
||||||
|
|
||||||
const scroll = ref(0);
|
const scroll = ref(0);
|
||||||
@ -65,7 +66,7 @@ enemy.forEach(v => {
|
|||||||
if (typeof v === 'string') return v;
|
if (typeof v === 'string') return v;
|
||||||
else return core.arrayToRGBA(v);
|
else return core.arrayToRGBA(v);
|
||||||
});
|
});
|
||||||
v.damageColor = getDamageColor(v.damage);
|
v.damageColor = getDamageColor(v.damage!);
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -41,9 +41,10 @@
|
|||||||
><div
|
><div
|
||||||
class="equip selectable"
|
class="equip selectable"
|
||||||
v-for="([id, num], i) of toShow"
|
v-for="([id, num], i) of toShow"
|
||||||
:selected="selected === i"
|
:selected="selected === i && !isCol"
|
||||||
@mousedown="selected = i"
|
@mousedown="select(i)"
|
||||||
@touchstart="selected = i"
|
@touchstart="select(i)"
|
||||||
|
@click="clickList(i)"
|
||||||
>
|
>
|
||||||
<div class="equip-icon">
|
<div class="equip-icon">
|
||||||
<BoxAnimate
|
<BoxAnimate
|
||||||
@ -71,10 +72,17 @@
|
|||||||
style="width: 100%; height: 30vh"
|
style="width: 100%; height: 30vh"
|
||||||
:type="isMobile ? 'horizontal' : 'vertical'"
|
:type="isMobile ? 'horizontal' : 'vertical'"
|
||||||
>
|
>
|
||||||
<div id="equip-now-div">
|
<div id="equip-now-div" @touchmove="dragout">
|
||||||
<div
|
<div
|
||||||
v-for="(name, i) of equipCol"
|
v-for="(name, i) of equipCol"
|
||||||
class="equip-now-one"
|
class="equip-now-one draginable selectable"
|
||||||
|
:draged="draged"
|
||||||
|
:access="canDragin(i)"
|
||||||
|
:selected="isCol && selected === i"
|
||||||
|
@mouseenter="dragin($event, i)"
|
||||||
|
@touchmove="dragin($event, i)"
|
||||||
|
@mouseleave="dragout"
|
||||||
|
@click="select(i, true)"
|
||||||
>
|
>
|
||||||
<BoxAnimate
|
<BoxAnimate
|
||||||
:id="equiped[i] ?? 'none'"
|
:id="equiped[i] ?? 'none'"
|
||||||
@ -112,7 +120,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="equip-desc">
|
<div id="equip-desc">
|
||||||
<div id="equip-icon">
|
<div id="equip-icon">
|
||||||
<BoxAnimate :id="toShow[selected]?.[0]"></BoxAnimate>
|
<BoxAnimate
|
||||||
|
:id="
|
||||||
|
isCol
|
||||||
|
? equiped[selected] ?? 'none'
|
||||||
|
: toShow[selected]?.[0] ?? 'none'
|
||||||
|
"
|
||||||
|
></BoxAnimate>
|
||||||
<span>{{ equip.name }}</span>
|
<span>{{ equip.name }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div id="equip-type">
|
<div id="equip-type">
|
||||||
@ -135,15 +149,25 @@
|
|||||||
<div id="equip-desc-text">
|
<div id="equip-desc-text">
|
||||||
<span style="font-size: 3vh" id="title">装备介绍</span>
|
<span style="font-size: 3vh" id="title">装备介绍</span>
|
||||||
<Scroll id="desc-text" style="height: 100%; width: 100%">
|
<Scroll id="desc-text" style="height: 100%; width: 100%">
|
||||||
<div v-if="!descText.value.startsWith('!!html')">
|
<div v-if="!descText.value!.startsWith('!!html')">
|
||||||
{{ descText.value }}
|
{{ descText.value }}
|
||||||
</div>
|
</div>
|
||||||
<div v-else v-html="descText.value.slice(6)"></div>
|
<div v-else v-html="descText.value!.slice(6)"></div>
|
||||||
</Scroll>
|
</Scroll>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="icon-drag">
|
||||||
|
<BoxAnimate
|
||||||
|
class="drag-icon"
|
||||||
|
v-if="draged"
|
||||||
|
:id="toShow[selected]?.[0] ?? 'none'"
|
||||||
|
:width="48"
|
||||||
|
:height="48"
|
||||||
|
noborder
|
||||||
|
></BoxAnimate>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
@ -153,26 +177,30 @@ import {
|
|||||||
SortAscendingOutlined,
|
SortAscendingOutlined,
|
||||||
SortDescendingOutlined
|
SortDescendingOutlined
|
||||||
} from '@ant-design/icons-vue';
|
} from '@ant-design/icons-vue';
|
||||||
import { computed, onMounted, onUnmounted, ref, watch } from 'vue';
|
import { computed, onMounted, onUnmounted, reactive, ref, watch } from 'vue';
|
||||||
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, type } from '../plugin/utils';
|
import { has, type } from '../plugin/utils';
|
||||||
import { cancelGlobalDrag, isMobile, useDrag } from '../plugin/use';
|
import { cancelGlobalDrag, isMobile, useDrag } from '../plugin/use';
|
||||||
import { hyper } from 'mutate-animate';
|
import { hyper } from 'mutate-animate';
|
||||||
|
import { message } from 'ant-design-vue';
|
||||||
|
|
||||||
const equips = getEquips();
|
const equips = ref(getEquips());
|
||||||
const col = ref('all');
|
const col = ref('all');
|
||||||
const all = core.material.items;
|
const all = core.material.items;
|
||||||
const selected = ref(0);
|
const selected = ref(0);
|
||||||
|
const isCol = ref(false); // 是否是选中的已装备的装备
|
||||||
const equipCol = core.status.globalAttribute.equipName;
|
const equipCol = core.status.globalAttribute.equipName;
|
||||||
const equiped = core.status.hero.equipment;
|
const equiped = ref(core.status.hero.equipment);
|
||||||
|
const listClicked = ref(false);
|
||||||
|
|
||||||
const draged = ref(false);
|
const draged = ref(false);
|
||||||
|
const toEquipType = ref(-1); // 要穿至的装备孔,-1表示不穿
|
||||||
|
|
||||||
/** 排序方式,down表示下面大上面小 */
|
/** 排序方式,down表示下面大上面小 */
|
||||||
const sort = ref<'up' | 'down'>('down');
|
const sort = ref<'up' | 'down'>('down');
|
||||||
const norm = ref('none');
|
const norm = ref<keyof SelectType<HeroStatus, number> | 'none'>('none');
|
||||||
const sType = ref<'value' | 'percentage'>('value');
|
const sType = ref<'value' | 'percentage'>('value');
|
||||||
|
|
||||||
// 攻击 防御 回血 额外攻击
|
// 攻击 防御 回血 额外攻击
|
||||||
@ -197,38 +225,46 @@ watch(sType, n => {
|
|||||||
*/
|
*/
|
||||||
const equip = computed(() => {
|
const equip = computed(() => {
|
||||||
const index = toShow.value[selected.value];
|
const index = toShow.value[selected.value];
|
||||||
if (!has(index))
|
const none = {
|
||||||
return {
|
name: '没有选择装备',
|
||||||
name: '没有选择装备',
|
cls: 'equip',
|
||||||
cls: 'equip',
|
text: '没有选择装备',
|
||||||
text: '没有选择装备',
|
equip: { type: '无', value: {}, percentage: {}, animate: '' }
|
||||||
equip: { type: '无', value: {}, percentage: {}, animate: '' }
|
};
|
||||||
};
|
if (isCol.value) {
|
||||||
|
const id = equiped.value[selected.value];
|
||||||
|
const e = core.material.items[id];
|
||||||
|
if (!has(e)) return none;
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
if (!has(index)) return none;
|
||||||
return all[index[0]];
|
return all[index[0]];
|
||||||
});
|
});
|
||||||
|
|
||||||
const addStatus = computed(() => {
|
const addStatus = computed(() => {
|
||||||
return getAddStatus(equip.value.equip!);
|
// @ts-ignore
|
||||||
|
return getAddStatus(equip.value.equip!, isCol.value);
|
||||||
});
|
});
|
||||||
|
|
||||||
const descText = computed(() => {
|
const descText = computed(() => {
|
||||||
if (equip.value.text.startsWith('!!html')) return ref(equip.value.text);
|
if (equip.value.text!.startsWith('!!html')) return ref(equip.value.text);
|
||||||
return type(equip.value.text, 25, hyper('sin', 'out'), true);
|
return type(equip.value.text!, 25, hyper('sin', 'out'), true);
|
||||||
});
|
});
|
||||||
|
|
||||||
const nowStatus = computed(() => {
|
const nowStatus = computed(() => {
|
||||||
return getNowStatus(equip.value.equip);
|
// @ts-ignore
|
||||||
|
return getNowStatus(equip.value.equip, isCol.value);
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 需要展示的装备,需要排序等操作
|
* 需要展示的装备,已进行排序等操作
|
||||||
*/
|
*/
|
||||||
const toShow = computed(() => {
|
const toShow = computed(() => {
|
||||||
const sortType = sort.value;
|
const sortType = sort.value;
|
||||||
const sortNorm = norm.value;
|
const sortNorm = norm.value;
|
||||||
const sortBy = sType.value;
|
const sortBy = sType.value;
|
||||||
|
|
||||||
const res = equips.filter(v => {
|
const res = equips.value.filter(v => {
|
||||||
const e = all[v[0]].equip!;
|
const e = all[v[0]].equip!;
|
||||||
const t = e.type;
|
const t = e.type;
|
||||||
if (sortNorm !== 'none') {
|
if (sortNorm !== 'none') {
|
||||||
@ -268,15 +304,78 @@ function exit() {
|
|||||||
core.plugin.equipOpened.value = false;
|
core.plugin.equipOpened.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----- 交互函数
|
function clickList(i: number) {
|
||||||
let [fx, fy] = [0, 0];
|
if (i === selected.value && listClicked.value) {
|
||||||
function dragEquip(x: number, y: number) {
|
const id = toShow.value[selected.value]?.[0];
|
||||||
if ((x - fx) ** 2 + (y - fy) ** 2 > 10 ** 2) {
|
if (!core.canEquip(id)) {
|
||||||
draged.value = true;
|
message.warn({
|
||||||
|
content: '无法装备!',
|
||||||
|
class: 'antdv-message'
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
core.loadEquip(id);
|
||||||
|
update();
|
||||||
|
listClicked.value = false;
|
||||||
}
|
}
|
||||||
|
listClicked.value = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
/**
|
||||||
|
* 选择某个装备
|
||||||
|
*/
|
||||||
|
function select(i: number, col: boolean = false) {
|
||||||
|
if (i !== selected.value && !col) {
|
||||||
|
listClicked.value = false;
|
||||||
|
}
|
||||||
|
if (col) listClicked.value = false;
|
||||||
|
if (col && isCol.value === col && selected.value === i) {
|
||||||
|
core.unloadEquip(i);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
isCol.value = col;
|
||||||
|
selected.value = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否可以将当前装备拖入该栏
|
||||||
|
* @param type 装备栏
|
||||||
|
*/
|
||||||
|
function canDragin(type: number) {
|
||||||
|
if (type < 0) return false;
|
||||||
|
const et = equip.value.equip?.type;
|
||||||
|
if (!core.canEquip(toShow.value[selected.value]?.[0])) return false;
|
||||||
|
if (!has(et)) return false;
|
||||||
|
if (typeof et === 'number') return type === et;
|
||||||
|
return equipCol[type] === et;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 穿上某个装备
|
||||||
|
*/
|
||||||
|
function loadEquip() {
|
||||||
|
const num = toEquipType.value;
|
||||||
|
if (num < 0) return;
|
||||||
|
if (!canDragin(num)) {
|
||||||
|
message.warn({
|
||||||
|
content: '无法装备!',
|
||||||
|
class: 'antdv-message'
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const now = equiped.value[num];
|
||||||
|
const to = toShow.value[selected.value]?.[0];
|
||||||
|
core.items._realLoadEquip(num, to, now);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
function update() {
|
||||||
|
equiped.value = core.status.hero.equipment;
|
||||||
|
equips.value = getEquips();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----- 绑定函数
|
||||||
|
function bind() {
|
||||||
const equips = Array.from(
|
const equips = Array.from(
|
||||||
document.querySelectorAll('.equip')
|
document.querySelectorAll('.equip')
|
||||||
) as HTMLDivElement[];
|
) as HTMLDivElement[];
|
||||||
@ -289,9 +388,46 @@ onMounted(() => {
|
|||||||
fx = x;
|
fx = x;
|
||||||
fy = y;
|
fy = y;
|
||||||
},
|
},
|
||||||
void 0,
|
() => {
|
||||||
|
if (draged.value) {
|
||||||
|
draged.value = false;
|
||||||
|
loadEquip();
|
||||||
|
console.log(toEquipType.value);
|
||||||
|
}
|
||||||
|
},
|
||||||
true
|
true
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----- 交互函数
|
||||||
|
let [fx, fy] = [0, 0];
|
||||||
|
function dragEquip(x: number, y: number, e: TouchEvent | MouseEvent) {
|
||||||
|
if ((x - fx) ** 2 + (y - fy) ** 2 > 10 ** 2 && !draged.value) {
|
||||||
|
draged.value = true;
|
||||||
|
}
|
||||||
|
if (draged.value) {
|
||||||
|
const target = document.getElementById('icon-drag') as HTMLDivElement;
|
||||||
|
target.style.left = `${x - 24}px`;
|
||||||
|
target.style.top = `${y - 24}px`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function dragin(e: Event, type: number) {
|
||||||
|
e.stopPropagation();
|
||||||
|
toEquipType.value = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
function dragout(e: Event) {
|
||||||
|
e.stopPropagation();
|
||||||
|
toEquipType.value = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(toShow, n => {
|
||||||
|
bind();
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
bind();
|
||||||
});
|
});
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
@ -442,11 +578,12 @@ onUnmounted(() => {
|
|||||||
padding-left: 5%;
|
padding-left: 5%;
|
||||||
|
|
||||||
.equip-now-one {
|
.equip-now-one {
|
||||||
flex-basis: 33.3%;
|
flex-basis: 30%;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin: 3% 0 3% 0;
|
margin: 3% 3.3% 3% 0;
|
||||||
|
padding-left: 0.5%;
|
||||||
|
|
||||||
span {
|
span {
|
||||||
margin-left: 10%;
|
margin-left: 10%;
|
||||||
@ -520,6 +657,15 @@ onUnmounted(() => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#icon-drag {
|
||||||
|
position: fixed;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 600px) {
|
@media screen and (max-width: 600px) {
|
||||||
#equipbox {
|
#equipbox {
|
||||||
padding: 5%;
|
padding: 5%;
|
||||||
|
@ -78,11 +78,15 @@
|
|||||||
></BoxAnimate>
|
></BoxAnimate>
|
||||||
<div id="basic-info">
|
<div id="basic-info">
|
||||||
<span style="border-bottom: 1px solid #ddd4">{{
|
<span style="border-bottom: 1px solid #ddd4">{{
|
||||||
all[selected]?.name ?? '没有道具'
|
selected === 'none'
|
||||||
|
? '没有道具'
|
||||||
|
: all[selected].name
|
||||||
}}</span>
|
}}</span>
|
||||||
<span>{{
|
<span>{{
|
||||||
getClsName(all[selected]?.cls as ItemMode) ??
|
selected === 'none'
|
||||||
'永久道具'
|
? '永久道具'
|
||||||
|
: getClsName(all[selected].cls as ItemMode) ??
|
||||||
|
'永久道具'
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -91,10 +95,10 @@
|
|||||||
<div id="desc">
|
<div id="desc">
|
||||||
<span style="border-bottom: 1px solid #ddd4">道具描述</span>
|
<span style="border-bottom: 1px solid #ddd4">道具描述</span>
|
||||||
<Scroll id="desc-text">
|
<Scroll id="desc-text">
|
||||||
<div v-if="!descText.value.startsWith('!!html')">
|
<div v-if="!descText.value!.startsWith('!!html')">
|
||||||
{{ descText.value }}
|
{{ descText.value }}
|
||||||
</div>
|
</div>
|
||||||
<div v-else v-html="descText.value.slice(6)"></div>
|
<div v-else v-html="descText.value!.slice(6)"></div>
|
||||||
</Scroll>
|
</Scroll>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -115,6 +119,7 @@ import { message } from 'ant-design-vue';
|
|||||||
import { KeyCode } from '../plugin/keyCodes';
|
import { KeyCode } from '../plugin/keyCodes';
|
||||||
|
|
||||||
type ItemMode = 'tools' | 'constants';
|
type ItemMode = 'tools' | 'constants';
|
||||||
|
type ShowItemIds = ItemIdOf<'constants' | 'tools'> | 'none';
|
||||||
|
|
||||||
const mode = ref<ItemMode>('tools');
|
const mode = ref<ItemMode>('tools');
|
||||||
|
|
||||||
@ -126,7 +131,7 @@ const toShow = computed<ItemMode[]>(() => {
|
|||||||
|
|
||||||
const all = core.material.items;
|
const all = core.material.items;
|
||||||
|
|
||||||
const selected = ref(items[toShow.value[0]][0]?.[0] ?? 'none');
|
const selected = ref<ShowItemIds>(items[toShow.value[0]][0]?.[0] ?? 'none');
|
||||||
const index = ref(0);
|
const index = ref(0);
|
||||||
|
|
||||||
watch(index, n => {
|
watch(index, n => {
|
||||||
@ -144,15 +149,15 @@ watch(mode, n => {
|
|||||||
const descText = computed(() => {
|
const descText = computed(() => {
|
||||||
const s = selected.value;
|
const s = selected.value;
|
||||||
if (s === 'none') return ref('没有选择道具');
|
if (s === 'none') return ref('没有选择道具');
|
||||||
if (all[s].text.startsWith('!!html')) return ref(all[s].text);
|
if (all[s].text!.startsWith('!!html')) return ref(all[s].text);
|
||||||
return type(all[s].text, 25, hyper('sin', 'out'), true);
|
return type(all[s].text!, 25, hyper('sin', 'out'), true);
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 选择一个道具时
|
* 选择一个道具时
|
||||||
* @param id 道具id
|
* @param id 道具id
|
||||||
*/
|
*/
|
||||||
async function select(id: string, nouse: boolean = false) {
|
async function select(id: ShowItemIds, nouse: boolean = false) {
|
||||||
if (selected.value === id && !nouse) {
|
if (selected.value === id && !nouse) {
|
||||||
use(id);
|
use(id);
|
||||||
}
|
}
|
||||||
@ -164,7 +169,8 @@ function exit() {
|
|||||||
core.plugin.toolOpened.value = false;
|
core.plugin.toolOpened.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function use(id: string) {
|
async function use(id: ShowItemIds) {
|
||||||
|
if (id === 'none') return;
|
||||||
if (core.canUseItem(id)) {
|
if (core.canUseItem(id)) {
|
||||||
// 应该暂时把动画去掉
|
// 应该暂时把动画去掉
|
||||||
core.plugin.transition.value = false;
|
core.plugin.transition.value = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user