diff --git a/_server/table/comment.js b/_server/table/comment.js index d35742e..00a9486 100644 --- a/_server/table/comment.js +++ b/_server/table/comment.js @@ -196,6 +196,11 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_data": "百分数,如10为10%法抗,怪物受到勇士的法术伤害减免比例" }, + "spell": { + "_leaf": true, + "_type": "textarea", + "_data": "法强" + }, "speed": { "_leaf": true, "_type": "textarea", diff --git a/project/functions.js b/project/functions.js index d5e7ddc..97c0782 100644 --- a/project/functions.js +++ b/project/functions.js @@ -335,7 +335,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 获得金币 var money = guards.reduce(function (curr, g) { return curr + core.material.enemys[g[2]].money; - }, core.getEnemyValue(enemy, "money", x, y)); + }, core.getEnemyInfo(enemy, null, x, y).money); if (core.hasItem("coin")) money *= 2; // 幸运金币:双倍 if (core.hasFlag("curse")) money = 0; // 诅咒效果 core.status.hero.money += money; @@ -344,7 +344,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 获得经验 var exp = guards.reduce(function (curr, g) { return curr + core.material.enemys[g[2]].exp; - }, core.getEnemyValue(enemy, "exp", x, y)); + }, core.getEnemyInfo(enemy, null, x, y).exp); if (core.hasFlag("curse")) exp = 0; core.status.hero.exp += exp; core.status.hero.statistics.exp += exp; @@ -530,33 +530,215 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 第五项为该特殊属性的标记;目前 1 代表是地图类技能(需要进行遍历全图) // 名字和描述可以直接写字符串,也可以写个function将怪物传进去 return [ - [1, "先攻", "怪物首先攻击", "#ffcc33"], - [2, "魔攻", "怪物无视角色的防御", "#bbb0ff"], - [3, "坚固", "怪物防御不小于角色攻击-1", "#c0b088"], - [4, "2连击", "怪物每回合攻击2次", "#ffee77"], - [5, "3连击", "怪物每回合攻击3次", "#ffee77"], - [6, function (enemy) { return (enemy.n || '') + "连击"; }, function (enemy) { return "怪物每回合攻击" + (enemy.n || 4) + "次"; }, "#ffee77"], - [7, "破甲", function (enemy) { return "战斗前,怪物附加角色防御的" + Math.floor(100 * (enemy.breakArmor || core.values.breakArmor || 0)) + "%作为伤害"; }, "#88c0ff"], - [8, "反击", function (enemy) { return "战斗时,怪物每回合附加角色攻击的" + Math.floor(100 * (enemy.counterAttack || core.values.counterAttack || 0)) + "%作为伤害,无视角色防御"; }, "#ffaa44"], - [9, "净化", function (enemy) { return "战斗前,怪物附加角色护盾的" + (enemy.purify || core.values.purify) + "倍作为伤害"; }, "#80eed6"], + [1, "先攻", "怪物首先攻击", "#ffcc33"], //√ + //[2, "魔攻", "怪物无视角色的防御", "#bbb0ff"], + [3, "坚固", "怪物防御不小于角色攻击-1", "#c0b088"], //√ + [ + 6, + function (enemy) { + return (enemy.n || "") + "连击"; + }, + function (enemy) { + return "怪物每回合攻击" + (enemy.n || 4) + "次"; + }, + "#ffee77", + ], //想改成“以XX%、XX%攻击力各攻击一次” + [ + 7, + "破甲", + function (enemy) { + return ( + "怪物无视角色防御的" + + Math.floor( + 100 * (enemy.breakArmor || core.values.breakArmor || 0) + ) + + "%" + ); + }, + "#88c0ff", + ], //√ + [ + 8, + "反击", + function (enemy) { + return ( + "战斗时,怪物每回合附加角色攻击的" + + Math.floor( + 100 * (enemy.counterAttack || core.values.counterAttack || 0) + ) + + "%作为伤害,无视角色防御" + ); + }, + "#ffaa44", + ], + [ + 9, + "净化", + function (enemy) { + return ( + "战斗前,怪物附加角色护盾的" + + (enemy.purify || core.values.purify) + + "倍作为伤害" + ); + }, + "#80eed6", + ], [10, "模仿", "怪物的攻防和角色攻防相等", "#b0c0dd"], - [11, "吸血", function (enemy) { return "战斗前,怪物首先吸取角色的" + Math.floor(100 * enemy.vampire || 0) + "%生命(约" + Math.floor((enemy.vampire || 0) * core.getStatus('hp')) + "点)作为伤害" + (enemy.add ? ",并把伤害数值加到自身生命上" : ""); }, "#dd4448"], - [12, "中毒", "战斗后,角色陷入中毒状态,每一步损失生命" + core.values.poisonDamage + "点", "#99ee88"], - [13, "衰弱", "战斗后,角色陷入衰弱状态,攻防暂时下降" + (core.values.weakValue >= 1 ? core.values.weakValue + "点" : parseInt(core.values.weakValue * 100) + "%"), "#f0bbcc"], - [14, "诅咒", "战斗后,角色陷入诅咒状态,战斗无法获得金币和经验", "#bbeef0"], - [15, "领域", function (enemy) { return "经过怪物周围" + (enemy.zoneSquare ? "九宫格" : "十字") + "范围内" + (enemy.range || 1) + "格时自动减生命" + (enemy.zone || 0) + "点"; }, "#c677dd"], + [ + 11, + "吸血", + function (enemy) { + return ( + "战斗前,怪物首先吸取角色的" + + Math.floor(100 * enemy.vampire || 0) + + "%生命(约" + + Math.floor((enemy.vampire || 0) * core.getStatus("hp")) + + "点)作为伤害" + + (enemy.add ? ",并把伤害数值加到自身生命上" : "") + ); + }, + "#dd4448", + ], + [ + 12, + "中毒", + "战斗后,角色陷入中毒状态,每一步损失生命" + + core.values.poisonDamage + + "点", + "#99ee88", + ], + [ + 13, + "衰弱", + "战斗后,角色陷入衰弱状态,攻防暂时下降" + + (core.values.weakValue >= 1 ? + core.values.weakValue + "点" : + parseInt(core.values.weakValue * 100) + "%"), + "#f0bbcc", + ], + [ + 14, + "诅咒", + "战斗后,角色陷入诅咒状态,战斗无法获得金币和经验", + "#bbeef0", + ], + [ + 15, + "领域", + function (enemy) { + return ( + "经过怪物周围" + + (enemy.zoneSquare ? "九宫格" : "十字") + + "范围内" + + (enemy.range || 1) + + "格时自动减生命" + + (enemy.zone || 0) + + "点" + ); + }, + "#c677dd", + ], [16, "夹击", "经过两只相同的怪物中间,角色生命值变成一半", "#bb99ee"], - [17, "仇恨", "战斗前,怪物附加之前积累的仇恨值作为伤害;战斗后,释放一半的仇恨值。(每杀死一个怪物获得" + (core.values.hatred || 0) + "点仇恨值)", "#b0b666"], - [18, "阻击", function (enemy) { return "经过怪物周围" + (enemy.zoneSquare ? "九宫格" : "十字") + "时自动减生命" + (enemy.repulse || 0) + "点,同时怪物后退一格"; }, "#8888e6"], + [ + 17, + "仇恨", + "战斗前,怪物附加之前积累的仇恨值作为伤害;战斗后,释放一半的仇恨值。(每杀死一个怪物获得" + + (core.values.hatred || 0) + + "点仇恨值)", + "#b0b666", + ], + [ + 18, + "阻击", + function (enemy) { + return ( + "经过怪物周围" + + (enemy.zoneSquare ? "九宫格" : "十字") + + "时自动减生命" + + (enemy.repulse || 0) + + "点,同时怪物后退一格" + ); + }, + "#8888e6", + ], [19, "自爆", "战斗后角色的生命值变成1", "#ff6666"], [20, "无敌", "角色无法打败怪物,除非拥有十字架", "#aaaaaa"], - [21, "退化", function (enemy) { return "战斗后角色永久下降" + (enemy.atkValue || 0) + "点攻击和" + (enemy.defValue || 0) + "点防御"; }], - [22, "固伤", function (enemy) { return "战斗前,怪物对角色造成" + (enemy.damage2 || 0) + "点固定伤害,未开启负伤时无视角色护盾。"; }, "#ff9977"], + [ + 21, + "退化", + function (enemy) { + return ( + "战斗后角色永久下降" + + (enemy.atkValue || 0) + + "点攻击和" + + (enemy.defValue || 0) + + "点防御" + ); + }, + ], + [ + 22, + "固伤", + function (enemy) { + return ( + "战斗前,怪物对角色造成" + + (enemy.damage || 0) + + "点固定伤害,未开启负伤时无视角色护盾。" + ); + }, + "#ff9977", + ], [23, "重生", "怪物被击败后,角色转换楼层则怪物将再次出现", "#a0e0ff"], - [24, "激光", function (enemy) { return "经过怪物同行或同列时自动减生命" + (enemy.laser || 0) + "点"; }, "#dda0dd"], - [25, "光环", function (enemy) { return (enemy.range != null ? ((enemy.haloSquare ? "该怪物九宫格" : "该怪物十字") + enemy.haloRange + "格范围内") : "同楼层所有") + "怪物生命提升" + (enemy.hpBuff || 0) + "%,攻击提升" + (enemy.atkBuff || 0) + "%,防御提升" + (enemy.defBuff || 0) + "%," + (enemy.haloAdd ? "可叠加" : "不可叠加"); }, "#e6e099", 1], - [26, "支援", "当周围一圈的怪物受到攻击时将上前支援,并组成小队战斗。", "#77c0b6", 1], - [27, "捕捉", function (enemy) { return "当走到怪物周围" + (enemy.zoneSquare ? "九宫格" : "十字") + "时会强制进行战斗。"; }, "#c0ddbb"] + [ + 24, + "激光", + function (enemy) { + return "经过怪物同行或同列时自动减生命" + (enemy.laser || 0) + "点"; + }, + "#dda0dd", + ], + [ + 25, + "光环", + function (enemy) { + return ( + (enemy.range != null ? + (enemy.haloSquare ? "该怪物九宫格" : "该怪物十字") + + enemy.haloRange + + "格范围内" : + "同楼层所有") + + "怪物生命提升" + + (enemy.hpBuff || 0) + + "%,攻击提升" + + (enemy.atkBuff || 0) + + "%,防御提升" + + (enemy.defBuff || 0) + + "%," + + (enemy.haloAdd ? "可叠加" : "不可叠加") + ); + }, + "#e6e099", + 1, + ], + [ + 26, + "支援", + "当周围一圈的怪物受到攻击时将上前支援,并组成小队战斗。", + "#77c0b6", + 1, + ], + [ + 27, + "捕捉", + function (enemy) { + return ( + "当走到怪物周围" + + (enemy.zoneSquare ? "九宫格" : "十字") + + "时会强制进行战斗。" + ); + }, + "#c0ddbb", + ], ]; }, "getEnemyInfo": function (enemy, hero, x, y, floorId) { @@ -579,15 +761,15 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = var mon_hp = core.getEnemyValue(enemy, "hp", x, y, floorId), mon_atk = core.getEnemyValue(enemy, "atk", x, y, floorId), mon_def = core.getEnemyValue(enemy, "def", x, y, floorId), - mon_mdef = core.getEnemyValue(enemy, "mdef", x, y, floorId), - mon_speed = core.getEnemyValue(enemy, "speed", x, y, floorId), + mon_mdef = core.getEnemyValue(enemy, "mdef", x, y, floorId) || 0, + mon_spell = core.getEnemyValue(enemy, "spell", x, y, floorId) || 0, + mon_speed = core.getEnemyValue(enemy, "speed", x, y, floorId) || 1, mon_special = core.getEnemyValue(enemy, "special", x, y, floorId); var mon_money = core.getEnemyValue(enemy, "money", x, y, floorId), mon_exp = core.getEnemyValue(enemy, "exp", x, y, floorId), mon_point = core.getEnemyValue(enemy, "point", x, y, floorId); var mon_barrier = 0, - mon_absorb_damage = 0, - mon_magic = core.getEnemyValue(enemy, "magic", x, y, floorId); + mon_absorb_damage = 0; // 模仿 if (core.hasSpecial(mon_special, 10)) { mon_atk = hero_atk; @@ -699,6 +881,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = atk: Math.floor(mon_atk), def: Math.floor(mon_def), mdef: Math.floor(mon_mdef), + spell: Math.floor(mon_spell), speed: Math.floor(mon_speed), barrier: Math.floor(mon_barrier), absorb: Math.floor(mon_absorb_damage), @@ -706,7 +889,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = exp: Math.floor(mon_exp), point: Math.floor(mon_point), special: mon_special, - magic: mon_magic, guards: guards, // 返回支援情况 }; }, @@ -726,6 +908,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = hero_def = core.getRealStatusOrDefault(hero, "def"), hero_matk = core.getRealStatusOrDefault(hero, "matk"), hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), + hero_mhp = core.getRealStatusOrDefault(hero, "mhp"), hero_speed = core.getRealStatusOrDefault(hero, "speed"), hero_spell = core.getRealStatusOrDefault(hero, "spell"), origin_hero_hp = core.getStatusOrDefault(hero, "hp"), @@ -739,6 +922,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = mon_atk = enemyInfo.atk, mon_def = enemyInfo.def, mon_mdef = enemyInfo.mdef, + mon_spell = enemyInfo.spell, mon_speed = enemyInfo.speed, mon_special = enemyInfo.special, mon_absorb_damage = enemyInfo.absorb, @@ -751,11 +935,21 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 开启了技能1:二倍斩 hero_atk *= 2; // 计算时攻击力翻倍 } + + // 破甲 + if (core.hasSpecial(mon_special, 7)) + hero_def -= Math.floor( + (enemy.breakArmor || core.values.breakArmor) * hero_def + ); + //勇士属性取整 hero_atk = Math.max(0, Math.floor(hero_atk)); hero_def = Math.max(0, Math.floor(hero_def)); - hero_mdef = Math.max(0, Math.floor(hero_mdef)); hero_speed = Math.max(0, Math.floor(hero_speed)); + hero_spell = Math.max(0, Math.floor(hero_spell)); + hero_matk = Math.min(100, Math.max(0, Math.floor(hero_matk))); + hero_mdef = Math.min(100, Math.max(0, Math.floor(hero_mdef))); + hero_mhp = Math.min(100, Math.max(0, Math.floor(hero_mhp))); // 如果是无敌属性,且勇士未持有十字架 if (core.hasSpecial(mon_special, 20) && !core.hasItem("cross")) @@ -783,12 +977,12 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = //——第二部分:变量定义和初始赋值—— // 每回合怪物对勇士造成的战斗伤害 - let per_damage = Math.max(mon_atk - hero_def, 0); - //if (enemyInfo.magic) per_damage = Math.max(mon_atk - hero_mdef, 0); - + let per_damage = Math.max(mon_atk - hero_def, 0), + per_mdamage = Math.floor(mon_spell * (100 - hero_mdef) / 100); // - let hero_per_damage = Math.max(hero_atk - mon_def, 0); - //if (hero_magic) hero_per_damage = Math.max(hero_atk - mon_mdef, 0); + let hero_per_damage = Math.max(hero_atk - mon_def, 0), + + hero_per_mdamage = Math.floor((hero_spell * hero_matk / 100) * (100 - mon_mdef) / 100); let damage = 0, hero_turn = 0, @@ -799,41 +993,48 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = let heroDiffPerTurn = [], enemyDiffPerTurn = []; - for ( - let now_mon_hp = mon_hp, - last_mon_hp = mon_hp, - mon_length = length, - hero_length = length, - mon_time = 0, - hero_time = 0; now_mon_hp > 0; + let now_mon_hp = mon_hp, + last_mon_hp = mon_hp, + mon_length = length, + hero_length = 0, + mon_time = 0, + hero_time = 0; + //先攻,先攻为怪物和勇士同时出第一刀 + if (core.hasSpecial(mon_special, 1)) mon_length = 0; + while ( + now_mon_hp > 0 ) { //勇士和怪物的长度 mon_time = mon_length / mon_speed; hero_time = hero_length / hero_speed; + if ( - mon_time < hero_time || - ((mon_time == hero_time) && mon_speed > hero_speed) + mon_time == Math.min(mon_time, hero_time) ) { //怪物攻击的回合 //这里计算怪物攻击时发生的各种变化 //伤害与回合增加 - damage += per_damage; + + //N连击,待定,想做成“以x%、y%……攻击力各攻击一次”的形式 if (core.hasSpecial(mon_special, 6)) { + damage += per_damage * enemy.n; mon_turn += enemy.n; } else { + damage += per_damage; mon_turn += 1; } + damage += per_mdamage; //重新为长度赋值 mon_length = length; hero_length = hero_length - mon_time * hero_speed; - } else { + } else if (hero_time == Math.min(mon_time, hero_time)) { //勇士攻击的回合 // 这里计算勇士攻击时发生的各种变化 // 伤害与回合数增加 - now_mon_hp -= hero_per_damage; + now_mon_hp -= hero_per_damage + hero_per_mdamage; hero_turn += 1; //勇士回合+1,如果有勇士每回合多次攻击的情况,在这里写判断 // 无法战斗计算 if (hero_turn % 50 == 0) { @@ -844,16 +1045,15 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = hero_length = length; mon_length = mon_length - hero_time * mon_speed; } + let hero_diff = {}, mon_diff = {}; - //这里插入汇总勇士和怪物在此回合结束时的情况数值,用以跑条动画读取 + //这里插入汇总勇士和怪物在此回合结束时的情况变化(hp, atk, def, speed, spell, damage, etc),用以跑条动画读取 heroDiffPerTurn.push(hero_diff); enemyDiffPerTurn.push(mon_diff); //将勇士和怪物此回合结束时的属性变动保存到heroPerInfo和enemyPerInfo中,用以跑条动画读取 } //下面这些还没修改 - // 连击 - if (core.hasSpecial(mon_special, 6)) per_damage *= enemy.n || 2; // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 let counterDamage = 0; @@ -862,14 +1062,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = (enemy.counterAttack || core.values.counterAttack) * hero_atk ); - // 先攻 - if (core.hasSpecial(mon_special, 1)) init_damage += per_damage; - // 破甲 - if (core.hasSpecial(mon_special, 7)) - init_damage += Math.floor( - (enemy.breakArmor || core.values.breakArmor) * hero_def - ); // 净化 if (core.hasSpecial(mon_special, 9)) @@ -878,7 +1071,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = ); //上面这些还没修改 //勇士护盾计算 - let barrier = hero_mdef; + let barrier = Math.floor(hero_spell * hero_mhp / 100); // ------ 支援 ----- // @@ -928,7 +1121,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } if (core.hasSpecial(mon_special, 22)) { // 固伤 - damage += enemy.damage || 0; + damage += enemy.damage2 || 0; } return {