### 攻击-护盾交互与伤害计算 Source: https://help.reogame.com/docs/battle 此代码片段实现了攻击类型与护盾类型之间的交互计算,以确定实际造成的伤害。它遍历所有攻击类型和护盾类型,根据预定义的交互表(`AttackToShield`)计算护盾抵消后的伤害,并累加为总伤害。 ```typescript AttackTypeList.forEach((attackType) => { const attackValue = attackerAttack[attackType] if (!attackValue) return ShieldTypeList.forEach((shieldType) => { const shieldValue = defenderShield[shieldType] if (!shieldValue) { totalDamage += attackValue return } // 计算护盾能承受的伤害 const shieldHoldDamage = shieldValue / AttackToShield[attackType][shieldType] // 计算经过护盾后能造成的伤害 const damageAfterShield = Math.max(0, attackValue - shieldHoldDamage) // 累加总伤害 totalDamage += damageAfterShield }) }) ``` -------------------------------- ### Damage Calculation Formula Source: https://help.reogame.com/docs/battle Calculates the total damage dealt by an attacking force, incorporating critical hit bonuses and subtracting the defender's total shield strength. Negative damage is treated as zero. ```javascript totalDamage = (attackerTotalAttackPower * critFactor) - defenderTotalShield; if (totalDamage < 0) { totalDamage = 0; } ``` -------------------------------- ### 计算攻击方攻击力 Source: https://help.reogame.com/docs/battle 此代码片段用于计算攻击方舰队的总攻击力。它依赖于一个名为 `FleetUtil` 的工具类,并接收宇宙、攻击方舰队对象以及一个布尔值(指示是否为攻击方)作为参数。输出为按攻击类型分类的攻击力对象。 ```typescript const attackerAttack = FleetUtil.calcObjAttack(universe, attackerFleetObj, isAttacker) ``` -------------------------------- ### 计算防御方护盾值 Source: https://help.reogame.com/docs/battle 此代码片段用于计算防御方舰队的总护盾值。它同样依赖于 `FleetUtil` 工具类,并接收宇宙、防御方舰队对象以及一个布尔值作为参数。输出为按护盾类型分类的护盾值对象。 ```typescript const defenderShield = FleetUtil.calcObjShield(universe, defenderFleetObj, isAttacker) ``` -------------------------------- ### 随机抽取舰船进行损失计算 Source: https://help.reogame.com/docs/battle 此代码片段实现了防御方损失的随机抽取机制。在总伤害大于0的情况下,它会不断地从剩余的防御方舰队中随机抽取舰船,并计算其装甲值来抵消伤害。 ```typescript while (totalDamage > 0) { const defenderFleetObjLeft = FleetUtil.calcUnitsAfterLoss4Fleet(defenderFleetObj, lossObj) const [pick, pickObj] = FleetUtil.pickoneShip(defenderFleetObjLeft) if (pick.length === 0) break // 计算选中舰船的装甲值并抵消伤害 // ... } ``` -------------------------------- ### 伤害随机波动 Source: https://help.reogame.com/docs/battle 此代码片段为计算出的总伤害添加了随机波动。最终伤害将在基础伤害的80%到120%之间随机浮动,增加了战斗的不确定性。 ```typescript totalDamage *= Math.random() * 0.4 + 0.8 ``` -------------------------------- ### 装甲值计算 Source: https://help.reogame.com/docs/battle 此代码片段计算了舰船的装甲值,考虑了基础防御、科技加成、随机双倍防御以及不同类型的装甲。这个值将用于抵消随机抽取的伤害。 ```typescript let defensiveFactor = (1 + bouns.defensive) * (1 + (isAttacker ? bouns.defensiveD : bouns.defensiveA)) // 概率触发双倍防御 if (bouns.doubleDefensive > Math.random()) { defensiveFactor *= 1 + bouns.doubleDefensive } // 计算不同类型装甲的总防御值 armor = ( // 轻型装甲 (unitDefense[DefensiveType.Light] || 0) * (bouns.defensiveSlight + 1) * defensiveFactor + // 中型装甲 (unitDefense[DefensiveType.Medium] || 0) * (bouns.defensiveSmedium + 1) * defensiveFactor + // 重型装甲 (unitDefense[DefensiveType.Heavy] || 0) * (bouns.defensiveSheavy + 1) * defensiveFactor ) ``` -------------------------------- ### 计算战斗结果 Source: https://help.reogame.com/docs/battle 此代码片段用于根据双方剩余单位的数量来判定战斗的最终结果。它接收攻击方和防御方的剩余单位总数作为参数,并返回战斗结果(Win, Lose, Draw)。 ```typescript const result = FleetUtil.calcBattleResult(attackersLeftSum, defendersLeftSum) ``` -------------------------------- ### Destruction Quantity Calculation Source: https://help.reogame.com/docs/battle Calculates the number of units or facilities lost by the defending side based on the total damage dealt and the defender's average armor value. Includes a safeguard against division by zero. ```javascript let defenderAverageArmor = totalDefenderArmor / totalDefenderUnits; if (defenderAverageArmor === 0) { defenderAverageArmor = 1; // Avoid division by zero } defenderLosses = Math.floor(totalDamage / defenderAverageArmor); ``` -------------------------------- ### Loss Distribution Mechanism Source: https://help.reogame.com/docs/battle Distributes the calculated losses proportionally among different types of defending units or facilities. Ensures that the number of losses for each type does not exceed its actual count and handles rounding. ```javascript for (const type in defenderUnits) { const count = defenderUnits[type].count; const loss = Math.round(defenderLosses * (count / totalDefenderUnits)); defenderUnits[type].remaining = Math.max(0, count - loss); } ```