import { isNil } from 'lodash-es';
import { IDamageEnemy } from '@motajs/types';
export interface CurrentEnemy {
enemy: IDamageEnemy;
// 这个是干啥的?
onMapEnemy: IDamageEnemy[];
}
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: ToShowEnemy) {
return (
{enemy.special.map((v, i) => {
return (
{v[0]}:
);
})}
);
}
/**
* 获得怪物的最近100个加防减伤
* @param enemy 怪物实例
*/
export function getDefDamage(
enemy: ToShowEnemy,
addDef: number = 0,
addAtk: number = 0
) {
const ratio = core.status.thisMap.ratio;
const res: [number, number][] = [];
let origin: number | undefined;
let last = 0;
const max = 100 - Math.floor(addDef / ratio);
for (let i = 0; i <= max; i++) {
const dam = enemy.enemy.calDamage({
atk: core.status.hero.atk + addAtk,
def: core.status.hero.def + addDef + i * ratio
});
if (res.length === 0) {
origin = dam.damage;
if (!isNil(origin)) {
res.push([addDef + i * ratio, origin]);
last = origin;
}
continue;
}
if (!isFinite(dam.damage)) continue;
if (dam.damage === res.at(-1)?.[1]) continue;
last = dam.damage;
res.push([ratio * i + addDef, dam.damage]);
}
return res;
}
/**
* 获取怪物的临界信息
* @param enemy 怪物实例
*/
export function getCriticalDamage(
enemy: ToShowEnemy,
addAtk: number = 0,
addDef: number = 0
): [number, number][] {
const ratio = core.status.thisMap.ratio;
const res: [number, number][] = [];
let origin: number | undefined;
let last = 0;
const max = 100 - Math.floor(addAtk / ratio);
for (let i = 0; i <= max; i++) {
const dam = enemy.enemy.calDamage({
atk: core.status.hero.atk + addAtk + i * ratio,
def: core.status.hero.def + addDef
});
if (res.length === 0) {
origin = dam.damage;
if (!isNil(origin)) {
res.push([addAtk + i * ratio, origin]);
last = origin;
}
continue;
}
if (!isFinite(dam.damage)) continue;
if (dam.damage === res.at(-1)?.[1]) continue;
last = dam.damage;
res.push([ratio * i + addAtk, dam.damage]);
}
return res;
}