Line 1: |
Line 1: |
− |
| |
| local Combat2 = {} | | local Combat2 = {} |
| | | |
Line 6: |
Line 5: |
| local min = math.min | | local min = math.min |
| local max = math.max | | local max = math.max |
| + | |
| + | function target_morale_modifier(morale) |
| + | return not morale and 1 or morale <= 20 and 1.4 or morale <= 32 and 1.2 or morale <= 52 and 1 or 0.7 |
| + | end |
| + | |
| + | -- [[Category:Todo]]: in case of other types (torpedo, etc.), use generic functions. |
| + | |
| + | -- * Shelling. |
| | | |
| function morale_modifier(morale) | | function morale_modifier(morale) |
Line 11: |
Line 18: |
| end | | end |
| | | |
− | function target_morale_modifier(morale)
| + | -- Shelling hit rate. |
− | return not morale and 1 or morale <= 20 and 1.4 or morale <= 32 and 1.2 or morale <= 52 and 1 or 0.7
| + | -- ship and target can be Ship, EnemyShip, ShipCapabilities, or a plain table. |
− | end
| + | -- [[Category:Todo]]: detection based on _equipment, fuel modifier. |
| + | function Combat2.hit_rate(ship, target, context) |
| | | |
− | -- Calculate shelling hit (normal and critical) rate.
| |
− | -- ship and target can be Ship, EnemyShip, ShipCapabilities, etc.
| |
− | -- [[Category:Todo]]:
| |
− | -- * ignoring _equipment, no fuel modifier
| |
− | -- * also use _fields instead of getter functions? then any record will do for ship and target
| |
− | function Combat2.hit_rate(ship, target, context)
| |
− |
| |
| ship = ship and ship.ship or ship | | ship = ship and ship.ship or ship |
| target = target and target.ship or target | | target = target and target.ship or target |
Line 29: |
Line 30: |
| end | | end |
| | | |
− | local level = ship:level() or 1 | + | local level = ship._level or 1 |
− | local luck = ship:luck() or 0 | + | local luck = ship._luck or 0 |
− | local accuracy = ship:accuracy() or 0 | + | local accuracy = ship._accuracy or 0 |
| local fit = ship._fit or 0 | | local fit = ship._fit or 0 |
| local as_modifier = ship._as_modifier or 1 | | local as_modifier = ship._as_modifier or 1 |
| local ap_modifier = ship._ap_modifier or 1 | | local ap_modifier = ship._ap_modifier or 1 |
− | local morale = morale_modifier(ship:morale()) | + | local morale = morale_modifier(ship._morale) |
| local formation = context._formation or ship._formation or 1 | | local formation = context._formation or ship._formation or 1 |
| | | |
| local accuracy_value = floor(((90 + 2 * sqrt(level) + sqrt(1.5 * luck) + accuracy) * morale * formation + fit) * as_modifier * ap_modifier) | | local accuracy_value = floor(((90 + 2 * sqrt(level) + sqrt(1.5 * luck) + accuracy) * morale * formation + fit) * as_modifier * ap_modifier) |
| | | |
− | local evasion = target:evasion() or 0 | + | local evasion = target._evasion or 0 |
− | local target_luck = target:luck() or 0 | + | local target_luck = target._luck or 0 |
| local target_formation = context._target_formation or target._formation or 1 | | local target_formation = context._target_formation or target._formation or 1 |
− | local target_morale = target_morale_modifier(target:morale()) | + | local target_morale = target_morale_modifier(target._morale) |
| | | |
| local base_evasion_value = floor((evasion + sqrt(2 * target_luck)) * target_formation) | | local base_evasion_value = floor((evasion + sqrt(2 * target_luck)) * target_formation) |
Line 59: |
Line 60: |
| | | |
| local capped_hit_rate = min(96, max(10, base_hit_rate) * target_morale) | | local capped_hit_rate = min(96, max(10, base_hit_rate) * target_morale) |
− |
| |
− | return capped_hit_rate + 1
| |
| | | |
| + | local proficiency = ship._proficiency or 0 |
| + | |
| + | return floor(capped_hit_rate) + proficiency + 1, capped_hit_rate |
| + | |
| + | end |
| + | |
| + | -- Shelling critical hit rate. |
| + | function Combat2.critical_hit_rate(ship, target, context) |
| + | local _, capped_hit_rate = Combat2.hit_rate(ship, target, context) |
| + | local proficiency = ship._proficiency or 0 |
| + | return floor(1.3 * sqrt(capped_hit_rate)) + proficiency + 1 |
| end | | end |
| + | |
| + | -- * Tests. |
| | | |
| function Combat2.test() | | function Combat2.test() |
| local Ship = require("Module:Ship") | | local Ship = require("Module:Ship") |
− | mw.log(Combat2.hit_rate(Ship("Nagato/Kai Ni"){ _level = 99, _accuracy = 10, _morale = 25 }, Ship("Destroyer Ro-Class"))) | + | local ship = Ship("Nagato/Kai Ni"){ |
| + | _level = 99, |
| + | _accuracy = 10, |
| + | _morale = 25, |
| + | _fit = 5 * sqrt(2) |
| + | } |
| + | local target = Ship("Destroyer Ro-Class") |
| + | mw.log(Combat2.hit_rate(ship, target)) |
| + | mw.log(Combat2.critical_hit_rate(ship, target)) |
| end | | end |
| | | |
| return Combat2 | | return Combat2 |