195 lines
7.6 KiB
JavaScript
195 lines
7.6 KiB
JavaScript
function enemys() {
|
|
|
|
}
|
|
|
|
enemys.prototype.init = function () {
|
|
// 怪物属性初始化定义:
|
|
this.enemys = enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80;
|
|
delete(enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80);
|
|
}
|
|
|
|
enemys.prototype.getEnemys = function (enemyId) {
|
|
if (enemyId == undefined) {
|
|
return this.enemys;
|
|
}
|
|
return this.enemys[enemyId];
|
|
}
|
|
|
|
enemys.prototype.hasSpecial = function (special, test) {
|
|
return (special instanceof Array)?special.indexOf(test)>=0:(special!=0&&(special%100==test||this.hasSpecial(parseInt(special/100), test)));
|
|
}
|
|
|
|
enemys.prototype.getSpecialText = function (enemyId) {
|
|
if (enemyId == undefined) return "";
|
|
var special = this.enemys[enemyId].special;
|
|
var text = [];
|
|
if (this.hasSpecial(special, 1)) text.push("先攻");
|
|
if (this.hasSpecial(special, 2)) text.push("魔攻");
|
|
if (this.hasSpecial(special, 3)) text.push("坚固");
|
|
if (this.hasSpecial(special, 4)) text.push("2连击");
|
|
if (this.hasSpecial(special, 5)) text.push("3连击");
|
|
if (this.hasSpecial(special, 6)) text.push("4连击");
|
|
if (this.hasSpecial(special, 7)) text.push("破甲");
|
|
if (this.hasSpecial(special, 8)) text.push("反击");
|
|
if (this.hasSpecial(special, 9)) text.push("净化");
|
|
if (this.hasSpecial(special, 10)) text.push("模仿");
|
|
if (this.hasSpecial(special, 11)) text.push("吸血");
|
|
if (this.hasSpecial(special, 12)) text.push("中毒");
|
|
if (this.hasSpecial(special, 13)) text.push("衰弱");
|
|
if (this.hasSpecial(special, 14)) text.push("诅咒");
|
|
if (this.hasSpecial(special, 15)) text.push("领域");
|
|
if (this.hasSpecial(special, 16)) text.push("夹击");
|
|
if (this.hasSpecial(special, 17)) text.push("仇恨");
|
|
return text.join(" ");
|
|
}
|
|
|
|
enemys.prototype.getDamage = function (monsterId) {
|
|
var monster = core.material.enemys[monsterId];
|
|
var hero_atk = core.status.hero.atk, hero_def = core.status.hero.def, hero_mdef = core.status.hero.mdef;
|
|
var mon_hp = monster.hp, mon_atk = monster.atk, mon_def = monster.def, mon_special = monster.special;
|
|
var damage = this.calDamage(hero_atk, hero_def, hero_mdef, mon_hp, mon_atk, mon_def, mon_special);
|
|
if (damage == 999999999) return damage;
|
|
return damage + this.getExtraDamage(monster);
|
|
}
|
|
|
|
enemys.prototype.getExtraDamage = function (monster) {
|
|
var extra_damage = 0;
|
|
if (this.hasSpecial(monster.special, 11)) { // 吸血
|
|
// 吸血的比例
|
|
extra_damage = core.status.hero.hp * monster.value;
|
|
extra_damage = parseInt(extra_damage);
|
|
}
|
|
if (this.hasSpecial(monster.special, 17)) { // 仇恨
|
|
extra_damage += core.getFlag('hatred', 0);
|
|
}
|
|
return extra_damage;
|
|
}
|
|
|
|
// 临界值计算
|
|
enemys.prototype.getCritical = function (monsterId) {
|
|
var monster = core.material.enemys[monsterId];
|
|
if (this.hasSpecial(monster.special, 3) || this.hasSpecial(monster.special, 10)) return "???";
|
|
var last = this.calDamage(core.status.hero.atk, core.status.hero.def, core.status.hero.mdef,
|
|
monster.hp, monster.atk, monster.def, monster.special);
|
|
if (last <= 0) return 0;
|
|
|
|
for (var i = core.status.hero.atk + 1; i <= monster.hp + monster.def; i++) {
|
|
var damage = this.calDamage(i, core.status.hero.def, core.status.hero.mdef,
|
|
monster.hp, monster.atk, monster.def, monster.special);
|
|
if (damage < last)
|
|
return i - core.status.hero.atk;
|
|
last = damage;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// 临界减伤计算
|
|
enemys.prototype.getCriticalDamage = function (monsterId) {
|
|
var c = this.getCritical(monsterId);
|
|
if (c == '???') return '???';
|
|
if (c <= 0) return 0;
|
|
var monster = core.material.enemys[monsterId];
|
|
var last = this.calDamage(core.status.hero.atk, core.status.hero.def, core.status.hero.mdef,
|
|
monster.hp, monster.atk, monster.def, monster.special);
|
|
if (last == 999999999) return '???';
|
|
|
|
return last - this.calDamage(core.status.hero.atk + c, core.status.hero.def, core.status.hero.mdef,
|
|
monster.hp, monster.atk, monster.def, monster.special);
|
|
}
|
|
|
|
// 1防减伤计算
|
|
enemys.prototype.getDefDamage = function (monsterId) {
|
|
var monster = core.material.enemys[monsterId];
|
|
return this.calDamage(core.status.hero.atk, core.status.hero.def, core.status.hero.mdef,
|
|
monster.hp, monster.atk, monster.def, monster.special) -
|
|
this.calDamage(core.status.hero.atk, core.status.hero.def + 1, core.status.hero.mdef,
|
|
monster.hp, monster.atk, monster.def, monster.special)
|
|
}
|
|
|
|
enemys.prototype.calDamage = function (hero_atk, hero_def, hero_mdef, mon_hp, mon_atk, mon_def, mon_special) {
|
|
// 魔攻
|
|
if (this.hasSpecial(mon_special,2)) hero_def = 0;
|
|
// 坚固
|
|
if (this.hasSpecial(mon_special,3) && mon_def < hero_atk - 1) mon_def = hero_atk - 1;
|
|
// 模仿
|
|
if (this.hasSpecial(mon_special,10)) {
|
|
mon_atk = hero_atk;
|
|
mon_def = hero_def;
|
|
}
|
|
if (hero_atk <= mon_def) return 999999999; // 不可战斗时请直接返回999999999
|
|
|
|
var per_damage = mon_atk - hero_def;
|
|
if (per_damage < 0) per_damage = 0;
|
|
// 2连击 & 3连击
|
|
|
|
if (this.hasSpecial(mon_special, 4)) per_damage *= 2;
|
|
if (this.hasSpecial(mon_special, 5)) per_damage *= 3;
|
|
if (this.hasSpecial(mon_special, 6)) per_damage *= 4;
|
|
|
|
var counterDamage = 0;
|
|
// 反击
|
|
if (this.hasSpecial(mon_special, 8)) counterDamage += parseInt(core.values.counterAttack * hero_atk);
|
|
|
|
// 先攻
|
|
var damage = mon_special == 1 ? per_damage : 0;
|
|
// 破甲
|
|
if (this.hasSpecial(mon_special, 7)) damage += parseInt(core.values.breakArmor * hero_def);
|
|
// 净化
|
|
if (this.hasSpecial(mon_special, 9)) damage = core.values.purify * hero_mdef;
|
|
|
|
var turn = parseInt((mon_hp - 1) / (hero_atk - mon_def));
|
|
var ans = damage + turn * per_damage + (turn + 1) * counterDamage;
|
|
ans -= hero_mdef;
|
|
|
|
return core.flags.enableNegativeDamage?ans:Math.max(0, ans);
|
|
}
|
|
|
|
// 获得当前楼层的怪物列表
|
|
enemys.prototype.getCurrentEnemys = function () {
|
|
var enemys = [];
|
|
var used = {};
|
|
var mapBlocks = core.status.thisMap.blocks;
|
|
for (var b = 0; b < mapBlocks.length; b++) {
|
|
if (core.isset(mapBlocks[b].event) && !(core.isset(mapBlocks[b].enable) && !mapBlocks[b].enable) && mapBlocks[b].event.cls == 'enemys') {
|
|
var monsterId = mapBlocks[b].event.id;
|
|
if (core.isset(used[monsterId])) continue;
|
|
|
|
var monster = core.material.enemys[monsterId];
|
|
var mon_atk = monster.atk, mon_def = monster.def;
|
|
// 坚固
|
|
if (this.hasSpecial(monster.special, 3) && mon_def < core.status.hero.atk - 1)
|
|
mon_def = core.status.hero.atk - 1;
|
|
if (this.hasSpecial(monster.special, 10)) {
|
|
mon_atk=core.status.hero.atk;
|
|
mon_def=core.status.hero.def;
|
|
}
|
|
|
|
enemys.push({
|
|
'id': monsterId,
|
|
'name': monster.name,
|
|
'hp': monster.hp,
|
|
'atk': mon_atk,
|
|
'def': mon_def,
|
|
'money': monster.money,
|
|
'experience': monster.experience,
|
|
'special': core.enemys.getSpecialText(monsterId),
|
|
'damage': this.getDamage(monsterId),
|
|
'critical': this.getCritical(monsterId),
|
|
'criticalDamage': this.getCriticalDamage(monsterId),
|
|
'defDamage': this.getDefDamage(monsterId)
|
|
});
|
|
|
|
used[monsterId] = true;
|
|
}
|
|
}
|
|
|
|
enemys.sort(function (a, b) {
|
|
if (a.damage == b.damage) {
|
|
return a.money - b.money;
|
|
}
|
|
return a.damage - b.damage;
|
|
});
|
|
return enemys;
|
|
}
|
|
|
|
main.instance.enemys = new enemys(); |