diff --git a/public/libs/enemys.js b/public/libs/enemys.js
index 54090fa..a006a85 100644
--- a/public/libs/enemys.js
+++ b/public/libs/enemys.js
@@ -427,24 +427,7 @@ enemys.prototype._getDamage = function (enemy, hero, x, y, floorId) {
////// 获得当前楼层的怪物列表 //////
enemys.prototype.getCurrentEnemys = function (floorId) {
- // todo: 重写这个函数
- floorId = floorId || core.status.floorId;
- var enemys = [],
- used = {};
- core.extractBlocks(floorId);
- core.status.maps[floorId].blocks.forEach(function (block) {
- if (!block.disable && block.event.cls.indexOf('enemy') == 0) {
- this._getCurrentEnemys_addEnemy(
- block.event.id,
- enemys,
- used,
- block.x,
- block.y,
- floorId
- );
- }
- }, this);
- return this._getCurrentEnemys_sort(enemys);
+ // Deprecated. See src/plugin/game/enemy/battle.ts
};
enemys.prototype._getCurrentEnemys_getEnemy = function (enemyId) {
diff --git a/public/libs/maps.js b/public/libs/maps.js
index 8b2d490..7663b14 100644
--- a/public/libs/maps.js
+++ b/public/libs/maps.js
@@ -3531,64 +3531,7 @@ maps.prototype.resetMap = function (floorId) {
////// 初始化独立的block canvas //////
maps.prototype._initDetachedBlock = function (blockInfo, x, y, displayDamage) {
- // todo: 不使用 nextCriticals 和 getDamageString
- var headCanvas = null,
- bodyCanvas = '__body_' + x + '_' + y,
- damageCanvas = null;
- // head
- if (!blockInfo.bigImage && blockInfo.height > 32) {
- headCanvas = '__head_' + x + '_' + y;
- core.createCanvas(headCanvas, 0, 0, 32, blockInfo.height - 32, 55);
- }
- // body
- if (blockInfo.bigImage) {
- var bigImageInfo = this._getBigImageInfo(
- blockInfo.bigImage,
- blockInfo.face,
- blockInfo.posX
- );
- core.createCanvas(
- bodyCanvas,
- 0,
- 0,
- bigImageInfo.per_width,
- bigImageInfo.per_height,
- 35
- );
- } else {
- core.createCanvas(bodyCanvas, 0, 0, 32, 32, 35);
- }
- // damage
- var damage = null,
- damageColor = null;
- if (
- blockInfo.cls.indexOf('enemy') == 0 &&
- core.hasItem('book') &&
- displayDamage
- ) {
- var damageString = core.enemys.getDamageString(blockInfo.id, x, y);
- damage = damageString.damage;
- damageColor = damageString.color;
- }
- if (damage != null) {
- damageCanvas = '__damage_' + x + '_' + y;
- var ctx = core.createCanvas(damageCanvas, 0, 0, 32, 32, 65);
- ctx.textAlign = 'left';
- ctx.font = 'bold 11px Arial';
- core.fillBoldText(ctx, damage, 1, 31, damageColor);
- if (core.flags.displayCritical) {
- var critical = core.enemys.nextCriticals(blockInfo.id);
- if (critical.length > 0) critical = critical[0];
- critical = core.formatBigNumber(critical[0], true);
- if (critical == '???') critical = '?';
- core.fillBoldText(ctx, critical, 1, 21, '#FFFFFF');
- }
- }
- return {
- headCanvas: headCanvas,
- bodyCanvas: bodyCanvas,
- damageCanvas: damageCanvas
- };
+ // Deprecated. See src/plugin/game/fx/rewrite.ts
};
////// 移动独立的block canvas //////
diff --git a/src/App.vue b/src/App.vue
index 7644a4c..4955796 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -18,6 +18,7 @@ import { uiStack } from './plugin/uiController';
display: flex;
justify-content: center;
overflow: hidden;
+ font-size: 16px;
}
@media screen and (max-width: 600px) {
diff --git a/src/components/enemyOne.vue b/src/components/enemyOne.vue
index dd58d40..8aaa654 100644
--- a/src/components/enemyOne.vue
+++ b/src/components/enemyOne.vue
@@ -7,9 +7,9 @@
>
- {{ enemy.name }}
+ {{ enemy.enemy.enemy.name }}
{{ text }} {{ text[0] }}
无属性
@@ -36,42 +36,42 @@
生命 {{
- core.formatBigNumber(enemy.hp)
+ core.formatBigNumber(enemy.enemy.info.hp)
}}
攻击 {{
- core.formatBigNumber(enemy.atk)
+ core.formatBigNumber(enemy.enemy.info.atk)
}}
防御 {{
- core.formatBigNumber(enemy.def)
+ core.formatBigNumber(enemy.enemy.info.def)
}}
金币 {{
- core.formatBigNumber(enemy.money)
+ core.formatBigNumber(enemy.enemy.enemy.money)
}}
经验 {{
- core.formatBigNumber(enemy.exp)
+ core.formatBigNumber(enemy.enemy.enemy.exp)
}}
- 伤害 {{
- core.formatBigNumber(enemy.damage!)
+ enemy.damage
}}
@@ -79,7 +79,7 @@
临界 {{
- core.formatBigNumber(enemy.critical)
+ enemy.critical
}}
@@ -87,27 +87,9 @@
减伤 {{
- enemy.criticalDamage < 0 &&
- !has(enemy.damage)
- ? isMobile
- ? '-'
- : '=>'
- : ''
- }}{{
- core.formatBigNumber(
- enemy.criticalDamage < 0
- ? -enemy.criticalDamage
- : enemy.criticalDamage
- )
- }}{{ enemy.criticalDam }}
@@ -116,7 +98,7 @@
>{{
core.formatBigNumber(core.status.thisMap.ratio)
}}防 {{
- core.formatBigNumber(enemy.defDamage)
+ core.formatBigNumber(enemy.defDam)
}}
@@ -130,9 +112,10 @@
import { has } from '../plugin/utils';
import BoxAnimate from '../components/boxAnimate.vue';
import { isMobile } from '../plugin/use';
+import { ToShowEnemy } from '../plugin/ui/book';
const props = defineProps<{
- enemy: DetailedEnemy;
+ enemy: ToShowEnemy;
selected?: boolean;
}>();
diff --git a/src/panel/enemyCritical.vue b/src/panel/enemyCritical.vue
index 4cfd139..b9f378f 100644
--- a/src/panel/enemyCritical.vue
+++ b/src/panel/enemyCritical.vue
@@ -88,14 +88,12 @@
diff --git a/src/panel/enemyTarget.vue b/src/panel/enemyTarget.vue
index 799f6df..7240bc5 100644
--- a/src/panel/enemyTarget.vue
+++ b/src/panel/enemyTarget.vue
@@ -3,7 +3,11 @@
怪物描述
- {{ enemy.description }}
+ {{
+ enemy.enemy.enemy.description
+ }}
@@ -26,14 +30,15 @@
import { ref } from 'vue';
import Scroll from '../components/scroll.vue';
import { hasMarkedEnemy, markEnemy, unmarkEnemy } from '../plugin/mark';
+import { detailInfo } from '../plugin/ui/book';
-const enemy = core.plugin.bookDetailEnemy;
-const marked = ref(hasMarkedEnemy(enemy.id));
+const enemy = detailInfo.enemy!;
+const marked = ref(hasMarkedEnemy(enemy.enemy.id));
function mark() {
- if (marked.value) unmarkEnemy(enemy.id);
- if (!marked.value) markEnemy(enemy.id);
- marked.value = hasMarkedEnemy(enemy.id);
+ if (marked.value) unmarkEnemy(enemy.enemy.id);
+ if (!marked.value) markEnemy(enemy.enemy.id);
+ marked.value = hasMarkedEnemy(enemy.enemy.id);
}
diff --git a/src/plugin/game/enemy/battle.ts b/src/plugin/game/enemy/battle.ts
index 5e2a912..933f7e6 100644
--- a/src/plugin/game/enemy/battle.ts
+++ b/src/plugin/game/enemy/battle.ts
@@ -1,11 +1,17 @@
import {
DamageDir,
DamageEnemy,
+ ensureFloorDamage,
getNeedCalDir,
getSingleEnemy
} from './damage';
import { findDir, has } from '../utils';
+export interface CurrentEnemy {
+ enemy: DamageEnemy;
+ onMapEnemy: DamageEnemy[];
+}
+
export function getEnemy(
x: number,
y: number,
@@ -228,13 +234,39 @@ core.events._action_battle = function (data, x, y, prefix) {
}
};
+core.enemys.getCurrentEnemys = function (floorId = core.status.floorId) {
+ floorId = floorId || core.status.floorId;
+ const enemys: CurrentEnemy[] = [];
+ const used: Record = {};
+ ensureFloorDamage(floorId);
+ const floor = core.status.maps[floorId];
+ floor.enemy.list.forEach(v => {
+ if (!(v.id in used)) {
+ const e = new DamageEnemy(v.enemy);
+ e.calAttribute();
+ e.getRealInfo();
+ e.calDamage();
+ const curr: CurrentEnemy = {
+ enemy: e,
+ onMapEnemy: [v]
+ };
+ enemys.push(curr);
+ used[v.id] = curr.onMapEnemy;
+ } else {
+ used[v.id].push(v);
+ }
+ });
+
+ return enemys.sort((a, b) => {
+ return (
+ (a.enemy.damage?.[0]?.damage ?? Infinity) -
+ (b.enemy.damage?.[0]?.damage ?? Infinity)
+ );
+ });
+};
+
declare global {
interface Events {
- /**
- * 与怪物战斗前
- * @param x 怪物横坐标
- * @param y 怪物纵坐标
- */
beforeBattle(
enemy: DamageEnemy,
x: number,
@@ -242,9 +274,6 @@ declare global {
dir: DamageDir
): boolean;
- /**
- * 与怪物战斗后
- */
afterBattle(
enemy: DamageEnemy,
x: number,
@@ -252,4 +281,8 @@ declare global {
dir: DamageDir
): void;
}
+
+ interface Enemys {
+ getCurrentEnemys(floorId?: FloorIds): CurrentEnemy[];
+ }
}
diff --git a/src/plugin/game/enemy/damage.ts b/src/plugin/game/enemy/damage.ts
index 514efb9..88c6cdf 100644
--- a/src/plugin/game/enemy/damage.ts
+++ b/src/plugin/game/enemy/damage.ts
@@ -417,7 +417,7 @@ export class DamageEnemy {
* 计算怪物在不计光环下的属性,在inject光环之前,预平衡光环之后执行
*/
calAttribute() {
- if (this.progress !== 1) return;
+ if (this.progress !== 1 && has(this.x) && has(this.floorId)) return;
this.progress = 2;
const special = this.info.special;
const info = this.info;
@@ -448,7 +448,7 @@ export class DamageEnemy {
* 获取怪物的真实属性信息,在inject光环后执行
*/
getRealInfo() {
- if (this.progress < 3) {
+ if (this.progress < 3 && has(this.x) && has(this.floorId)) {
throw new Error(
`Unexpected early real info calculating. Progress: ${this.progress}`
);
@@ -804,6 +804,7 @@ export class DamageEnemy {
x?: number,
y?: number
): CriticalDamageDelta[] {
+ // todo: 可以优化,根据之前的计算可以直接确定下一个临界的范围
if (!isFinite(seckill)) return [];
const res: CriticalDamageDelta[] = [];
const def = hero.def!;
diff --git a/src/plugin/game/fx/rewrite.ts b/src/plugin/game/fx/rewrite.ts
index 71e333f..271e4f5 100644
--- a/src/plugin/game/fx/rewrite.ts
+++ b/src/plugin/game/fx/rewrite.ts
@@ -2,8 +2,6 @@ import { getEnemy } from '../enemy/battle';
import { DamageDir, getNeedCalDir } from '../enemy/damage';
import { formatDamage } from '../utils';
-export {};
-
core.maps._initDetachedBlock = function (
info: BlockInfo,
x: number,
diff --git a/src/plugin/ui/book.tsx b/src/plugin/ui/book.tsx
index 2c55baf..7aafe48 100644
--- a/src/plugin/ui/book.tsx
+++ b/src/plugin/ui/book.tsx
@@ -1,39 +1,40 @@
+import { CurrentEnemy } from '../game/enemy/battle';
import { has } from '../utils';
+export interface ToShowEnemy extends CurrentEnemy {
+ critical: string;
+ criticalDam: string;
+ defDam: string;
+ /** [名称, 描述, 颜色] */
+ special: [string, string, string][];
+ damageColor: string;
+ showSpecial: [string, string, string][];
+ damage: string;
+}
+
+interface BookDetailInfo {
+ /** 怪物手册详细信息展示的怪物 */
+ enemy?: ToShowEnemy;
+ /** 怪物手册的怪物详细信息的初始位置 */
+ pos?: number;
+}
+
+export const detailInfo: BookDetailInfo = {};
+
/**
* 获取怪物的特殊技能描述
* @param enemy 怪物实例
*/
-export function getSpecialHint(enemy: Enemy & DetailedEnemy) {
- const all = core
- .getSpecials()
- .filter(v => enemy.special.includes(v[0]))
- .sort((a, b) => a[0] - b[0]);
-
- const des = all.map(v => {
- const des = v[2];
- if (des instanceof Function) {
- return des(enemy);
- }
- return des;
- });
- const name = all.map(v => {
- const name = v[1];
- if (name instanceof Function) {
- return name(enemy);
- }
- return name;
- });
-
+export function getSpecialHint(enemy: ToShowEnemy) {
return (
- {all.map((v, i) => {
+ {enemy.showSpecial.map((v, i) => {
return (
-
- {name[i]}:
+
+ {v[0]}:
-
+
);
})}
@@ -46,12 +47,9 @@ export function getSpecialHint(enemy: Enemy & DetailedEnemy) {
* @param enemy 怪物实例
*/
export function getDefDamage(
- enemy: DetailedEnemy,
+ enemy: ToShowEnemy,
addDef: number = 0,
- addAtk: number = 0,
- x?: number,
- y?: number,
- floorId?: FloorIds
+ addAtk: number = 0
) {
// todo: 删除 getDamageInfo
const ratio = core.status.thisMap.ratio;
@@ -63,29 +61,26 @@ export function getDefDamage(
const max = 100 - Math.floor(addDef / ratio);
for (let i = 0; i <= max; i++) {
- const dam = core.getDamageInfo(
- enemy.id,
+ const dam = enemy.enemy.calEnemyDamage(
{
- def: core.getStatus('def') + ratio * i + addDef,
- atk: core.getStatus('atk') + addAtk
+ atk: core.status.hero.atk + addAtk,
+ def: core.status.hero.def + addDef + i * ratio
},
- x,
- y,
- floorId
+ 'none'
);
if (res.length === 0) {
- origin = dam?.damage;
+ origin = dam[0].damage;
if (has(origin)) {
res.push([addDef + i * ratio, origin]);
last = origin;
}
continue;
}
- if (!has(dam)) continue;
- if (dam.damage === res.at(-1)?.[1]) continue;
- last = dam.damage;
- res.push([ratio * i + addDef, dam.damage]);
+ if (!isFinite(dam[0].damage)) continue;
+ if (dam[0].damage === res.at(-1)?.[1]) continue;
+ last = dam[0].damage;
+ res.push([ratio * i + addDef, dam[0].damage]);
}
return res;
@@ -96,12 +91,9 @@ export function getDefDamage(
* @param enemy 怪物实例
*/
export function getCriticalDamage(
- enemy: DetailedEnemy,
+ enemy: ToShowEnemy,
addAtk: number = 0,
- addDef: number = 0,
- x?: number,
- y?: number,
- floorId?: FloorIds
+ addDef: number = 0
): [number, number][] {
// todo: 删除 getDamageInfo
const ratio = core.status.thisMap.ratio;
@@ -113,29 +105,26 @@ export function getCriticalDamage(
const max = 100 - Math.floor(addAtk / ratio);
for (let i = 0; i <= max; i++) {
- const dam = core.getDamageInfo(
- enemy.id,
+ const dam = enemy.enemy.calEnemyDamage(
{
- atk: core.getStatus('atk') + ratio * i + addAtk,
- def: core.getStatus('def') + addDef
+ atk: core.status.hero.atk + addAtk + i * ratio,
+ def: core.status.hero.def + addDef
},
- x,
- y,
- floorId
+ 'none'
);
if (res.length === 0) {
- origin = dam?.damage;
+ origin = dam[0].damage;
if (has(origin)) {
res.push([addAtk + i * ratio, origin]);
last = origin;
}
continue;
}
- if (!has(dam)) continue;
- if (dam.damage === res.at(-1)?.[1]) continue;
- last = dam.damage;
- res.push([ratio * i + addAtk, dam.damage]);
+ if (!isFinite(dam[0].damage)) continue;
+ if (dam[0].damage === res.at(-1)?.[1]) continue;
+ last = dam[0].damage;
+ res.push([ratio * i + addAtk, dam[0].damage]);
}
return res;
diff --git a/src/types/enemy.d.ts b/src/types/enemy.d.ts
index 43629e7..3535b4c 100644
--- a/src/types/enemy.d.ts
+++ b/src/types/enemy.d.ts
@@ -390,14 +390,6 @@ interface Enemys extends EnemyData {
floorId?: FloorIds
): number;
- /**
- * 获得某张地图的敌人集合,用于手册绘制
- * @example core.getCurrentEnemys('MT0') // 主塔0层的敌人集合
- * @param floorId 地图id
- * @returns 敌人集合,按伤害升序排列,支持多朝向怪合并
- */
- getCurrentEnemys(floorId?: FloorIds): DetailedEnemy[];
-
/**
* 检查某些楼层是否还有漏打的(某种)敌人
* @example core.hasEnemyLeft('greenSlime', ['sample0', 'sample1']) // 样板0层和1层是否有漏打的绿头怪
diff --git a/src/types/plugin.d.ts b/src/types/plugin.d.ts
index 3b3d046..4b426cb 100644
--- a/src/types/plugin.d.ts
+++ b/src/types/plugin.d.ts
@@ -168,12 +168,6 @@ interface PluginUtils {
}
interface PluginUis {
- /** 怪物手册的怪物详细信息的初始位置 */
- bookDetailPos: number;
-
- /** 怪物手册详细信息展示的怪物 */
- bookDetailEnemy: DetailedEnemy;
-
/** 定点查看的界面,特殊属性还是临界 */
fixedDetailPanel: 'special' | 'critical';
diff --git a/src/ui/book.vue b/src/ui/book.vue
index 2c8fde2..be67333 100644
--- a/src/ui/book.vue
+++ b/src/ui/book.vue
@@ -15,7 +15,7 @@
v-model:now="scroll"
v-model:drag="drag"
>
-