From c0bfac2f36aa99e502276b1ab8d1f802755f9251 Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 24 Jan 2018 14:33:57 +0800 Subject: [PATCH] Enemy Vampire --- docs/element.md | 7 ++++ docs/img/blood.png | Bin 17287 -> 4430 bytes docs/img/tuihua.png | Bin 0 -> 9059 bytes libs/core.js | 7 ++++ libs/enemys.js | 91 ++++++++++++++++++++++++++------------------ libs/events.js | 11 +++++- 6 files changed, 79 insertions(+), 37 deletions(-) create mode 100644 docs/img/tuihua.png diff --git a/docs/element.md b/docs/element.md index c5fa346e..19b1206b 100644 --- a/docs/element.md +++ b/docs/element.md @@ -65,6 +65,7 @@ enemys.prototype.getSpecialText = function (enemyId) { if (this.hasSpecial(special, 18)) text.push("阻击"); if (this.hasSpecial(special, 19)) text.push("自爆"); if (this.hasSpecial(special, 20)) text.push("无敌"); + if (this.hasSpecial(special, 21)) text.push("退化"); return text.join(" "); } ``` @@ -94,6 +95,8 @@ N连击怪物的special是6,且我们可以为它定义n代表实际连击数 吸血怪需要在怪物后添加value,代表吸血的比例。 +可以给吸血怪添加`'add': true`来将吸血的数值加到自身上。 + ![怪物吸血](./img/blood.png) 中毒怪让勇士中毒后,每步扣减的生命值由`data.js`中的values定义。 @@ -118,6 +121,10 @@ N连击怪物的special是6,且我们可以为它定义n代表实际连击数 请注意如果吸血、领域、阻击中任何两个同时存在,则value会冲突。**因此请勿将吸血、领域或阻击放置在同一个怪物身上。** +退化怪需要在后面增加'atkValue'和'defValue'表示退化的数值。 + +![怪物退化](./img/tuihua.png) + 如有额外需求,可参见[自定义怪物属性](personalization#自定义自定义怪物属性),里面讲了如何设置一个新的怪物属性。 ## 路障,楼梯,传送门 diff --git a/docs/img/blood.png b/docs/img/blood.png index 7d369e74e31c8cb76dd5e3fa8b7cb24c551253e8..53d52171722ee3789edc85453abbbbbc4a9d1844 100644 GIT binary patch literal 4430 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 XWO*MHlv>jd6UacvSi4yB&XfND?|e(r literal 17287 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 XmoRQtQke%lJcGg0)z4*}Q$iB}c{fIL diff --git a/docs/img/tuihua.png b/docs/img/tuihua.png new file mode 100644 index 0000000000000000000000000000000000000000..de7d18367c57176c2e4bad29c561c62b72d5c08e GIT binary patch literal 9059 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 literal 0 HcmV?d00001 diff --git a/libs/core.js b/libs/core.js index ca9fb2ae..e5a4cafe 100644 --- a/libs/core.js +++ b/libs/core.js @@ -1163,6 +1163,13 @@ core.prototype.onmousewheel = function (direct) { if (direct==-1) core.ui.drawSLPanel(core.status.event.data + 10); return; } + + // 浏览地图 + if (core.status.lockControl && core.status.event.id == 'viewMaps') { + if (direct==1) core.ui.drawMaps(core.status.event.data+1); + if (direct==-1) core.ui.drawMaps(core.status.event.data-1); + return; + } } /////////// 键盘、鼠标事件相关 END /////////// diff --git a/libs/enemys.js b/libs/enemys.js index bcdd98d4..ed33c7d5 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -21,7 +21,7 @@ enemys.prototype.init = function () { 'zombie': {'name': '兽人', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'zombieKnight': {'name': '兽人武士', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'rock': {'name': '石头人', 'hp': 100, 'atk': 120, 'def': 0, 'money': 4, 'experience': 0, 'special': 3}, - 'slimeMan': {'name': '影子战士', 'hp': 100, 'atk': 0, 'def': 0, 'money': 11, 'experience': 0, 'special': 10}, // 模仿怪的攻防设为0就好 + 'slimeMan': {'name': '影子战士', 'hp': 100, 'atk': 0, 'def': 0, 'money': 11, 'experience': 0, 'special': [10,21], 'atkValue': 2, 'defValue': 3}, // 退化怪可以在后面写atkValue和defValue表示退化的数值 'bluePriest': {'name': '初级法师', 'hp': 100, 'atk': 120, 'def': 0, 'money': 3, 'experience': 0, 'special': 2, 'point': 1}, // 'point'可以在打败怪物后进行加点,详见文档说明。 'redPriest': {'name': '高级法师', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'brownWizard': {'name': '初级巫师', 'hp': 100, 'atk': 120, 'def': 0, 'money': 16, 'experience': 0, 'special': 15, 'value': 100, 'range': 2}, // 领域怪需要加value表示领域伤害的数值;range可选,代表领域伤害的范围;不加默认为1 @@ -52,7 +52,7 @@ enemys.prototype.init = function () { 'goldHornSlime': {'name': '金角怪', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'redKing': {'name': '红衣魔王', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'whiteKing': {'name': '白衣武士', 'hp': 100, 'atk': 120, 'def': 0, 'money': 17, 'experience': 0, 'special': 16}, - 'blackMagician': {'name': '黑暗大法师', 'hp': 100, 'atk': 120, 'def': 0, 'money': 12, 'experience': 0, 'special': 11, 'value': 1/3, 'bomb': false}, // 吸血怪需要在后面添加value代表吸血比例 + 'blackMagician': {'name': '黑暗大法师', 'hp': 100, 'atk': 120, 'def': 0, 'money': 12, 'experience': 0, 'special': 11, 'value': 1/3, 'add': true, 'bomb': false}, // 吸血怪需要在后面添加value代表吸血比例;添加add: true可以将吸血的伤害加到自身 'silverSlime': {'name': '银头怪', 'hp': 100, 'atk': 120, 'def': 0, 'money': 15, 'experience': 0, 'special': 14}, 'swordEmperor': {'name': '剑圣', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'whiteHornSlime': {'name': '尖角怪', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, @@ -117,6 +117,7 @@ enemys.prototype.getSpecialText = function (enemyId) { if (this.hasSpecial(special, 18)) text.push("阻击"); if (this.hasSpecial(special, 19)) text.push("自爆"); if (this.hasSpecial(special, 20)) text.push("无敌"); + if (this.hasSpecial(special, 21)) text.push("退化"); return text; } @@ -145,7 +146,7 @@ enemys.prototype.getSpecialHint = function (enemy, special) { case 8: return "反击:战斗时,怪物每回合附加角色攻击的"+parseInt(100*core.values.counterAttack)+"%作为伤害,无视角色防御"; case 9: return "净化:战斗前,怪物附加勇士魔防的"+core.values.purify+"倍作为伤害"; case 10: return "模仿:怪物的攻防和勇士攻防相等"; - case 11: return "吸血:战斗前,怪物首先吸取角色的"+parseInt(100*enemy.value)+"%生命作为伤害"; + case 11: return "吸血:战斗前,怪物首先吸取角色的"+parseInt(100*enemy.value)+"%生命作为伤害"+(enemy.add?",并把伤害数值加到自身生命上":""); case 12: return "中毒:战斗后,勇士陷入中毒状态,每一步损失生命"+core.values.poisonDamage+"点"; case 13: return "衰弱:战斗后,勇士陷入衰弱状态,攻防暂时下降"+core.values.weakValue+"点"; case 14: return "诅咒:战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验"; @@ -155,6 +156,7 @@ enemys.prototype.getSpecialHint = function (enemy, special) { case 18: return "阻击:经过怪物的十字领域时自动减生命"+enemy.value+"点,同时怪物后退一格"; case 19: return "自爆:战斗后勇士的生命值变成1"; case 20: return "无敌:勇士无法打败怪物,除非拥有十字架"; + case 21: return "退化:战斗后勇士永久下降"+(enemy.atkValue||0)+"点攻击和"+(enemy.defValue||0)+"点防御"; default: break; } return "" @@ -163,21 +165,14 @@ enemys.prototype.getSpecialHint = function (enemy, special) { ////// 获得某个怪物的伤害 ////// 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, monster.n); - if (damage == 999999999) return damage; + var damage = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); + 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); } @@ -187,14 +182,15 @@ enemys.prototype.getExtraDamage = function (monster) { ////// 临界值计算 ////// 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, monster.n); + + var last = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); + 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, monster.n); + var damage = this.calDamage(monster, core.status.hero.hp, i, core.status.hero.def, core.status.hero.mdef); if (damage < last) return i - core.status.hero.atk; last = damage; @@ -208,31 +204,45 @@ enemys.prototype.getCriticalDamage = function (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, monster.n); - if (last == 999999999) return '???'; + var last = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); + 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, monster.n); + return last - this.calDamage(monster, core.status.hero.hp, core.status.hero.atk + c, core.status.hero.def, core.status.hero.mdef); } ////// 1防减伤计算 ////// enemys.prototype.getDefDamage = function (monsterId) { var monster = core.material.enemys[monsterId]; - var nowDamage = this.calDamage(core.status.hero.atk, core.status.hero.def, core.status.hero.mdef, - monster.hp, monster.atk, monster.def, monster.special, monster.n); - var nextDamage = this.calDamage(core.status.hero.atk, core.status.hero.def + 1, core.status.hero.mdef, - monster.hp, monster.atk, monster.def, monster.special, monster.n); - if (nowDamage == 999999999 || nextDamage == 999999999) return "???"; + var nowDamage = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); + var nextDamage = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def + 1, core.status.hero.mdef); + if (nowDamage >= 999999999 || nextDamage >= 999999999) return "???"; return nowDamage - nextDamage; } ////// 具体的伤害计算公式 ////// -enemys.prototype.calDamage = function (hero_atk, hero_def, hero_mdef, mon_hp, mon_atk, mon_def, mon_special, n) { +enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, hero_mdef) { + + var mon_hp = monster.hp, mon_atk = monster.atk, mon_def = monster.def, mon_special = monster.special; if (this.hasSpecial(mon_special, 20) && !core.hasItem("cross")) // 如果是无敌属性,且勇士未持有十字架 return 999999999; // 返回无限大 + var initDamage = 0; // 战前伤害 + + // 吸血 + if (this.hasSpecial(mon_special, 11)) { + var vampireDamage = hero_hp * monster.value; + + // 如果有神圣盾免疫吸血等可以在这里写 + + vampireDamage = parseInt(vampireDamage); + // 加到自身 + if (monster.add) // 如果加到自身 + mon_hp += vampireDamage; + + initDamage += vampireDamage; + } + // 模仿 if (this.hasSpecial(mon_special,10)) { mon_atk = hero_atk; @@ -246,28 +256,36 @@ enemys.prototype.calDamage = function (hero_atk, hero_def, hero_mdef, mon_hp, mo var per_damage = mon_atk - hero_def; if (per_damage < 0) per_damage = 0; - // 2连击 & 3连击 + // 2连击 & 3连击 & N连击 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 *= (n||4); + if (this.hasSpecial(mon_special, 6)) per_damage *= (monster.n||4); var counterDamage = 0; // 反击 if (this.hasSpecial(mon_special, 8)) counterDamage += parseInt(core.values.counterAttack * hero_atk); // 先攻 - var damage = this.hasSpecial(mon_special, 1) ? per_damage : 0; + if (this.hasSpecial(mon_special, 1)) + initDamage += per_damage; + // 破甲 - if (this.hasSpecial(mon_special, 7)) damage += parseInt(core.values.breakArmor * hero_def); + if (this.hasSpecial(mon_special, 7)) + initDamage += parseInt(core.values.breakArmor * hero_def); + // 净化 - if (this.hasSpecial(mon_special, 9)) damage += core.values.purify * hero_mdef; + if (this.hasSpecial(mon_special, 9)) + initDamage += parseInt(core.values.purify * hero_mdef); var turn = parseInt((mon_hp - 1) / (hero_atk - mon_def)); - var ans = damage + turn * per_damage + (turn + 1) * counterDamage; + var ans = initDamage + turn * per_damage + (turn + 1) * counterDamage; ans -= hero_mdef; - return core.flags.enableNegativeDamage?ans:Math.max(0, ans); + if (!core.flags.enableNegativeDamage) + ans=Math.max(0, ans); + + return ans; } ////// 获得当前楼层的怪物列表 ////// @@ -281,7 +299,7 @@ enemys.prototype.getCurrentEnemys = function () { if (core.isset(used[monsterId])) continue; var monster = core.material.enemys[monsterId]; - var mon_atk = monster.atk, mon_def = monster.def; + var mon_hp = monster.hp, 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; @@ -297,11 +315,12 @@ enemys.prototype.getCurrentEnemys = function () { enemys.push({ 'id': monsterId, 'name': monster.name, - 'hp': monster.hp, + 'hp': mon_hp, 'atk': mon_atk, 'def': mon_def, 'money': monster.money, 'experience': monster.experience, + 'point': monster.point||0, // 加点 'special': specialText, 'damage': this.getDamage(monsterId), 'critical': this.getCritical(monsterId), diff --git a/libs/events.js b/libs/events.js index 4a708aa8..a7074d55 100644 --- a/libs/events.js +++ b/libs/events.js @@ -689,8 +689,10 @@ events.prototype.addPoint = function (enemy) { ////// 战斗结束后触发的事件 ////// events.prototype.afterBattle = function(enemyId,x,y,callback) { + var enemy = core.material.enemys[enemyId]; + // 毒衰咒的处理 - var special = core.material.enemys[enemyId].special; + var special = enemy.special; // 中毒 if (core.enemys.hasSpecial(special, 12) && !core.hasFlag('poison')) { core.setFlag('poison', true); @@ -713,6 +715,13 @@ events.prototype.afterBattle = function(enemyId,x,y,callback) { if (core.enemys.hasSpecial(special, 19)) { core.status.hero.hp = 1; } + // 退化 + if (core.enemys.hasSpecial(special, 21)) { + core.status.hero.atk -= (enemy.atkValue||0); + core.status.hero.def -= (enemy.defValue||0); + if (core.status.hero.atk<0) core.status.hero.atk=0; + if (core.status.hero.def<0) core.status.hero.def=0; + } // 增加仇恨值 core.setFlag('hatred', core.getFlag('hatred',0)+core.values.hatred); core.updateStatusBar();