From dbb1d76c54b5e9d81f0ecc0b5164a1426a04301b Mon Sep 17 00:00:00 2001 From: itcfangye Date: Sat, 1 Feb 2025 11:55:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=88=98=E6=96=97=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/functions.js | 356 ++++++++++++++++++++++--------------------- 1 file changed, 183 insertions(+), 173 deletions(-) diff --git a/project/functions.js b/project/functions.js index ea0a448..014cf56 100644 --- a/project/functions.js +++ b/project/functions.js @@ -892,171 +892,179 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = }; }, "getDamageInfo": function (enemy, hero, x, y, floorId) { - // 获得战斗伤害信息(实际伤害计算函数) - // - // 参数说明: - // enemy:该怪物信息 - // hero:勇士的当前数据;如果对应项不存在则会从core.status.hero中取。 - // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) - // floorId:该怪物所在的楼层 - // 后面三个参数主要是可以在光环等效果上可以适用 - floorId = floorId || core.status.floorId; + // 获得战斗伤害信息(实际伤害计算函数) + // + // 参数说明: + // enemy:该怪物信息 + // hero:勇士的当前数据;如果对应项不存在则会从core.status.hero中取。 + // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) + // floorId:该怪物所在的楼层 + // 后面三个参数主要是可以在光环等效果上可以适用 + floorId = floorId || core.status.floorId; - var hero_hp = core.getRealStatusOrDefault(hero, "hp"), - hero_atk = core.getRealStatusOrDefault(hero, "atk"), - hero_def = core.getRealStatusOrDefault(hero, "def"), - hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), - hero_speed = core.getRealStatusOrDefault(hero, "speed"), - hero_magic = core.getRealStatusOrDefault(hero, "magic"), - origin_hero_hp = core.getStatusOrDefault(hero, "hp"), - origin_hero_atk = core.getStatusOrDefault(hero, "atk"), - origin_hero_def = core.getStatusOrDefault(hero, "def"); + var hero_hp = core.getRealStatusOrDefault(hero, "hp"), + hero_atk = core.getRealStatusOrDefault(hero, "atk"), + hero_def = core.getRealStatusOrDefault(hero, "def"), + hero_matk = core.getRealStatusOrDefault(hero, "matk"), + hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), + hero_speed = core.getRealStatusOrDefault(hero, "speed"), + hero_spell = core.getRealStatusOrDefault(hero, "spell"), + origin_hero_hp = core.getStatusOrDefault(hero, "hp"), + origin_hero_atk = core.getStatusOrDefault(hero, "atk"), + origin_hero_def = core.getStatusOrDefault(hero, "def"); - // 怪物的各项数据 - // 对坚固模仿等处理扔到了脚本编辑-getEnemyInfo之中 - var enemyInfo = core.enemys.getEnemyInfo(enemy, hero, x, y, floorId); - var mon_hp = enemyInfo.hp, - mon_atk = enemyInfo.atk, - mon_def = enemyInfo.def, - mon_mdef = enemyInfo.mdef, - mon_speed = enemyInfo.speed, - mon_special = enemyInfo.special, - mon_absorb_damage = enemyInfo.absorb, - mon_barrier = enemyInfo.barrier; + // 怪物的各项数据 + // 对坚固模仿等处理扔到了脚本编辑-getEnemyInfo之中 + var enemyInfo = core.enemys.getEnemyInfo(enemy, hero, x, y, floorId); + var mon_hp = enemyInfo.hp, + mon_atk = enemyInfo.atk, + mon_def = enemyInfo.def, + mon_mdef = enemyInfo.mdef, + mon_speed = enemyInfo.speed, + mon_special = enemyInfo.special, + mon_absorb_damage = enemyInfo.absorb, + mon_barrier = enemyInfo.barrier; - //---第一部分:静态属性修正--- - //此处写入静态影响勇士属性的勇士或怪物技能(静态影响怪物属性的技能于getEnemyInfo中写入) - // 技能的处理 - if (core.getFlag("skill", 0) == 1) { - // 开启了技能1:二倍斩 - hero_atk *= 2; // 计算时攻击力翻倍 - } - //勇士属性取整 - 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)); + //---第一部分:静态属性修正--- + //此处写入静态影响勇士属性的勇士或怪物技能(静态影响怪物属性的技能于getEnemyInfo中写入) + // 技能的处理 + if (core.getFlag("skill", 0) == 1) { + // 开启了技能1:二倍斩 + hero_atk *= 2; // 计算时攻击力翻倍 + } + //勇士属性取整 + 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)); - // 如果是无敌属性,且勇士未持有十字架 - if (core.hasSpecial(mon_special, 20) && !core.hasItem("cross")) - return null; // 不可战斗 + // 如果是无敌属性,且勇士未持有十字架 + if (core.hasSpecial(mon_special, 20) && !core.hasItem("cross")) + return null; // 不可战斗 - // 战前造成的额外伤害(可被护盾抵消) - let init_damage = 0; + // 战前造成的额外伤害(可被护盾抵消) + let init_damage = 0; - // 吸血 - if (core.hasSpecial(mon_special, 11)) { - let vampire_damage = hero_hp * enemy.vampire; + // 吸血 + if (core.hasSpecial(mon_special, 11)) { + let vampire_damage = hero_hp * enemy.vampire; - // 如果有神圣盾免疫吸血等可以在这里写 - // 也可以用hasItem和hasEquip来判定装备 - // if (core.hasFlag('shield5')) vampire_damage = 0; + // 如果有神圣盾免疫吸血等可以在这里写 + // 也可以用hasItem和hasEquip来判定装备 + // if (core.hasFlag('shield5')) vampire_damage = 0; - vampire_damage = Math.floor(vampire_damage) || 0; - // 加到自身 - if (enemy.add) - // 如果加到自身 - mon_hp += vampire_damage; + vampire_damage = Math.floor(vampire_damage) || 0; + // 加到自身 + if (enemy.add) + // 如果加到自身 + mon_hp += vampire_damage; - init_damage += vampire_damage; - } + init_damage += vampire_damage; + } - //——第二部分:变量定义和初始赋值—— - // 每回合怪物对勇士造成的战斗伤害 - 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); + if (enemyInfo.magic) per_damage = Math.max(mon_atk - hero_mdef, 0); - // - 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); + if (hero_magic) hero_per_damage = Math.max(hero_atk - mon_mdef, 0); - let damage = 0, - hero_turn = 0, - mon_turn = 0; - //---第三部分:递归开始--- - let length = hero_speed * mon_speed; + let damage = 0, + hero_turn = 0, + mon_turn = 0; + //---第三部分:递归开始--- + let length = hero_speed * mon_speed; - 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 heroDiffPerTurn = [], + enemyDiffPerTurn = []; - ) { - //勇士和怪物的长度 - 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) - ) { - //怪物攻击的回合 - //这里计算怪物攻击时发生的各种变化 + 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; - //伤害与回合增加 - damage += per_damage; - if (core.hasSpecial(mon_special, 6)) { - mon_turn += enemy.n; - } else { - mon_turn += 1; - } - //重新为长度赋值 - mon_length = length; - hero_length = hero_length - mon_time * hero_speed; - } else { - //勇士攻击的回合 - // 这里计算勇士攻击时发生的各种变化 + ) { + //勇士和怪物的长度 + 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) + ) { + //怪物攻击的回合 + //这里计算怪物攻击时发生的各种变化 - // 伤害与回合数增加 - now_mon_hp -= hero_per_damage; - hero_turn += 1; //勇士回合+1,如果有勇士每回合多次攻击的情况,在这里写判断 - // 无法战斗计算 - if (hero_turn % 50 == 0) { - if (now_mon_hp >= last_mon_hp) return null; - last_mon_hp = now_mon_hp; - } - //重新为长度赋值 - hero_length = length; - mon_length = mon_length - hero_time * mon_speed; - } - } + //伤害与回合增加 + damage += per_damage; + if (core.hasSpecial(mon_special, 6)) { + mon_turn += enemy.n; + } else { + mon_turn += 1; + } + //重新为长度赋值 + mon_length = length; + hero_length = hero_length - mon_time * hero_speed; + } else { + //勇士攻击的回合 + // 这里计算勇士攻击时发生的各种变化 - //下面这些还没修改 - // 连击 - if (core.hasSpecial(mon_special, 6)) per_damage *= enemy.n || 2; + // 伤害与回合数增加 + now_mon_hp -= hero_per_damage; + hero_turn += 1; //勇士回合+1,如果有勇士每回合多次攻击的情况,在这里写判断 + // 无法战斗计算 + if (hero_turn % 50 == 0) { + if (now_mon_hp >= last_mon_hp) return null; + last_mon_hp = now_mon_hp; + } + //重新为长度赋值 + hero_length = length; + mon_length = mon_length - hero_time * mon_speed; + } + let hero_diff = {}, + mon_diff = {}; + //这里插入汇总勇士和怪物在此回合结束时的情况数值,用以跑条动画读取 + heroDiffPerTurn.push(hero_diff); + enemyDiffPerTurn.push(mon_diff); //将勇士和怪物此回合结束时的属性变动保存到heroPerInfo和enemyPerInfo中,用以跑条动画读取 + } - // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 - let counterDamage = 0; - if (core.hasSpecial(mon_special, 8)) - counterDamage += Math.floor( - (enemy.counterAttack || core.values.counterAttack) * hero_atk - ); + //下面这些还没修改 + // 连击 + if (core.hasSpecial(mon_special, 6)) per_damage *= enemy.n || 2; - // 先攻 - if (core.hasSpecial(mon_special, 1)) init_damage += per_damage; + // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 + let counterDamage = 0; + if (core.hasSpecial(mon_special, 8)) + counterDamage += Math.floor( + (enemy.counterAttack || core.values.counterAttack) * hero_atk + ); - // 破甲 - if (core.hasSpecial(mon_special, 7)) - init_damage += Math.floor( - (enemy.breakArmor || core.values.breakArmor) * hero_def - ); + // 先攻 + if (core.hasSpecial(mon_special, 1)) init_damage += per_damage; - // 净化 - if (core.hasSpecial(mon_special, 9)) - init_damage += Math.floor( - (enemy.purify || core.values.purify) * hero_mdef - ); - //上面这些还没修改 - //勇士护盾计算 - let barrier = hero_mdef; - if (enemyInfo.magic) barrier = hero_def; + // 破甲 + if (core.hasSpecial(mon_special, 7)) + init_damage += Math.floor( + (enemy.breakArmor || core.values.breakArmor) * hero_def + ); - // ------ 支援 ----- // - // 这个递归最好想明白为什么,flag:__extraTurn__是怎么用的 - /*var guards = core.getFlag("__guards__" + x + "_" + y, enemyInfo.guards); + // 净化 + if (core.hasSpecial(mon_special, 9)) + init_damage += Math.floor( + (enemy.purify || core.values.purify) * hero_mdef + ); + //上面这些还没修改 + //勇士护盾计算 + let barrier = hero_mdef; + + + // ------ 支援 ----- // + // 这个递归最好想明白为什么,flag:__extraTurn__是怎么用的 + /*var guards = core.getFlag("__guards__" + x + "_" + y, enemyInfo.guards); var guard_before_current_enemy = false; // ------ 支援怪是先打(true)还是后打(false)? turn += core.getFlag("__extraTurn__", 0); if (guards.length > 0) { @@ -1084,43 +1092,45 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } } core.removeFlag("__extraTurn__");*/ - // ------ 支援END ------ // + // ------ 支援END ------ // - // 最终伤害:初始伤害 + 怪物对勇士造成的伤害 + 反击伤害 - damage += init_damage + hero_turn * counterDamage; - // 再扣去护盾 - damage -= barrier; + // 最终伤害:初始伤害 + 怪物对勇士造成的伤害 + 反击伤害 + damage += init_damage + hero_turn * counterDamage; + // 再扣去护盾 + damage -= barrier; - // 检查是否允许负伤 - if (!core.flags.enableNegativeDamage) damage = Math.max(0, damage); + // 检查是否允许负伤 + if (!core.flags.enableNegativeDamage) damage = Math.max(0, damage); - // 最后处理仇恨和固伤(因为这两个不能被护盾减伤) - if (core.hasSpecial(mon_special, 17)) { - // 仇恨 - damage += core.getFlag("hatred", 0); - } - if (core.hasSpecial(mon_special, 22)) { - // 固伤 - damage += enemy.damage || 0; - } + // 最后处理仇恨和固伤(因为这两个不能被护盾减伤) + if (core.hasSpecial(mon_special, 17)) { + // 仇恨 + damage += core.getFlag("hatred", 0); + } + if (core.hasSpecial(mon_special, 22)) { + // 固伤 + damage += enemy.damage || 0; + } - return { - mon_hp: Math.floor(mon_hp), - mon_atk: Math.floor(mon_atk), - mon_def: Math.floor(mon_def), - mon_mdef: Math.floor(mon_mdef), - init_damage: Math.floor(init_damage), - per_damage: Math.floor(per_damage), - hero_per_damage: Math.floor(hero_per_damage), - turn: Math.floor(hero_turn), - mon_turn: Math.floor(mon_turn), - damage: Math.floor(damage), - }; - /*TODO:怪物手册的修改(需要修改这里return的内容以及一些战后判断) + return { + mon_hp: Math.floor(mon_hp), + mon_atk: Math.floor(mon_atk), + mon_def: Math.floor(mon_def), + mon_mdef: Math.floor(mon_mdef), + init_damage: Math.floor(init_damage), + per_damage: Math.floor(per_damage), + hero_per_damage: Math.floor(hero_per_damage), + turn: Math.floor(hero_turn), + mon_turn: Math.floor(mon_turn), + damage: Math.floor(damage), + }; + /*TODO:怪物手册的修改(需要修改这里return的内容以及一些战后判断) 1. 显示怪物是魔攻还是物攻(在怪物名字上做颜色变化,物攻是黄色,魔攻是蓝色) 2. 一防减伤是物防还是魔防(由怪物是物攻还是魔攻来转换) 3. 特殊战斗的怪物,在怪物手册里“伤害”写为“特殊战”*/ - } + /*TODO:怪物和勇士同时跑条到终点时,谁先出手的逻辑确定 + 怪物、勇士和装备同时跑条时的计算*/ +} }, "actions": { "onKeyUp": function (keyCode, altKey) {