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" > -
+