Line 216: |
Line 216: |
| self.ammo = ship.ammo or 1 | | self.ammo = ship.ammo or 1 |
| return self | | return self |
| + | |
| + | end |
| + | |
| + | -- * Table utils. |
| + | |
| + | local format = require('Module:StringInterpolation').format |
| + | local Formatting = require('Module:Formatting') |
| + | local StatIcons = require('Module:StatIcons') |
| + | local Ship = require('Module:Ship') |
| + | |
| + | local equipment = { |
| + | DD = { |
| + | main = { |
| + | { firepower = 3, rank = 10, k = 1 }, |
| + | { firepower = 3, rank = 10, k = 1 }, |
| + | }, |
| + | torpedo = { |
| + | -- Quint/53 |
| + | { torpedo = 12, rank = 10, k = 1 }, |
| + | { torpedo = 12, rank = 10, k = 1 }, |
| + | { torpedo = 12, rank = 10, k = 1 }, |
| + | }, |
| + | }, |
| + | CL = { |
| + | -- 20.3 #3 |
| + | main = { |
| + | { firepower = 10, rank = 10, k = 1 }, |
| + | { firepower = 10, rank = 10, k = 1 }, |
| + | }, |
| + | torpedo = { |
| + | { torpedo = 12, rank = 10, k = 1 }, |
| + | { torpedo = 12, rank = 10, k = 1 }, |
| + | { torpedo = 12, rank = 10, k = 1 }, |
| + | }, |
| + | }, |
| + | CLT = { |
| + | main = { |
| + | -- OTO |
| + | { firepower = 8, rank = 10, k = 1 }, |
| + | { firepower = 8, rank = 10, k = 1 }, |
| + | -- Hyouteki |
| + | { torpedo = 12 }, |
| + | }, |
| + | torpedo = { |
| + | { torpedo = 12, rank = 10, k = 1 }, |
| + | { torpedo = 12, rank = 10, k = 1 }, |
| + | { torpedo = 12 }, |
| + | }, |
| + | }, |
| + | CA = { |
| + | main = { |
| + | -- 20.3 #3 |
| + | { firepower = 10, rank = 10, k = 1 }, |
| + | { firepower = 10, rank = 10, k = 1 }, |
| + | -- FuMO |
| + | { firepower = 3 }, |
| + | }, |
| + | torpedo = { |
| + | { torpedo = 12, rank = 10, k = 1 }, |
| + | { torpedo = 12, rank = 10, k = 1 }, |
| + | { torpedo = 12, rank = 10, k = 1 }, |
| + | { torpedo = 12, rank = 10, k = 1 }, |
| + | }, |
| + | mixed = { |
| + | }, |
| + | }, |
| + | } |
| + | |
| + | local normalized_type_code = { |
| + | DD = "DD", |
| + | CL = "CL", |
| + | CLT = "CLT", |
| + | FBB = "BB", |
| + | BB = "BB", |
| + | CAV = "CA", |
| + | BBV = "BB", |
| + | CVL = "CV", |
| + | CV = "CV", |
| + | CVB = "CV", |
| + | } |
| + | |
| + | local type_code_to_template = { |
| + | DD = "main", |
| + | CL = "main", |
| + | CLT = "main", |
| + | CA = "main", |
| + | FBB = "main", |
| + | BB = "main", |
| + | CAV = "main_aviation", |
| + | BBV = "main_aviation", |
| + | CVL = "carrier", |
| + | CV = "carrier", |
| + | CVB = "carrier", |
| + | -- SS = "submarine", |
| + | -- SSV = "submarine_aviation", |
| + | -- AV = "...", |
| + | -- AO = "...", |
| + | } |
| + | |
| + | function format_damage(ship_, type_code, damage_type_fn, equip_setup, night_attack, spotting) |
| + | local combat = Combat:new(night_attack) |
| + | local normal_damage = combat:damage(damage_type_fn(combat, Ship:new(ship_, {}, night_attack))) |
| + | local normal_damage_string = |
| + | normal_damage >= combat.cap |
| + | and string.format('<span style="color:red;">%s</span>', normal_damage) |
| + | or normal_damage |
| + | local equip = equipment[type_code][equip_setup] |
| + | spotting = spotting or 1 |
| + | local equip_damage_pre = combat:damage(damage_type_fn(combat, Ship:new(ship_, equip, night_attack))) |
| + | local equip_damage = combat:damage(damage_type_fn(combat, Ship:new(ship_, equip, night_attack, spotting))) |
| + | local equip_damage_string = |
| + | equip_damage_pre >= combat.cap |
| + | and string.format('<span style="color:red;">%s</span>', equip_damage) |
| + | or equip_damage |
| + | return |
| + | night_attack |
| + | and string.format("%s", equip_damage_string) |
| + | or string.format("%s, %s", normal_damage_string, equip_damage_string) |
| + | end |
| + | |
| + | local templates = { |
| + | |
| + | main = [[{| class="wikitable sortable typography-xl-optout" style="width:100%;" |
| + | ! colspan="2" | |
| + | ! colspan="4" |Day Battle |
| + | ! colspan="5" |Night Battle |
| + | |- |
| + | !style="width:60px;"|Rank |
| + | !style="width:80px;"|Name |
| + | !${fp} |
| + | !${torp} |
| + | !<span title="Damage: normal attack without equipment, ${db_attack_note} with maxed equipment (all other modifiers = 1, see notes)">Hit</span> |
| + | !<span title="Normal torpedo salvo damage, all modifiers = 1, see notes">Salvo</span> |
| + | !${fp_plus_torp} |
| + | !<span title="Maximal damage from double attack (combined)">DA</span> |
| + | !<span title="Maximal damage from cut-in">CI</span> |
| + | !${luck_minus_cap} |
| + | !<span title="Torpedo/mixed cut-in rate, gun cut-in rate (only luck dependent part, no bonuses)">CI%</span> |
| + | ${rows}|}]], |
| + | |
| + | carrier = [[{| class="wikitable sortable typography-xl-optout" style="width:100%;" |
| + | !style="width:60px;"|Rank |
| + | !style="width:80px;"|Name |
| + | !${fp} |
| + | !<span title="Air Power with full >> Reppuu">Air Power</span> |
| + | !<span title="">Aerial Hit</span> |
| + | !<span title="">Shelling</span> |
| + | ${rows}|}]], |
| + | |
| + | main_row = [[|- |
| + | |${rank} |
| + | |${name} |
| + | |${fp} |
| + | |${torp} |
| + | |${db_attack} |
| + | |${db_torp} |
| + | |${fp_plus_torp} |
| + | |${nb_da} |
| + | |${nb_ci} |
| + | |${luck_minus_cap} |
| + | |${nb_ci_rate} |
| + | ]], |
| + | |
| + | carrier_row = [[|- |
| + | |${rank} |
| + | |${name} |
| + | |${fp} |
| + | | |
| + | | |
| + | | |
| + | ]], |
| + | |
| + | } |
| + | |
| + | local attacks = { |
| + | DD = { |
| + | spotting = 1, |
| + | note = "normal attack", |
| + | }, |
| + | CL = { |
| + | spotting = Combat.modifier.spotting.double, |
| + | note = "double attack", |
| + | }, |
| + | CLT = { |
| + | spotting = 1, |
| + | note = "normal attack", |
| + | }, |
| + | CA = { |
| + | spotting = Combat.modifier.spotting.double, |
| + | note = "double attack", |
| + | }, |
| + | } |
| + | |
| + | function Combat.header(frame) |
| + | local type_code_ = frame.args["type"] |
| + | local type_code = normalized_type_code[type_code_] |
| + | local template = templates[type_code_to_template[type_code_]] |
| + | return format{ |
| + | template, |
| + | rows = frame.args[1] or "", |
| + | db_attack_note = attacks[type_code].note or "?", |
| + | fp = Formatting:format_image{StatIcons.firepower, caption = Formatting:format_stat_name("firepower")}, |
| + | torp = Formatting:format_image{StatIcons.torpedo, caption = Formatting:format_stat_name("torpedo")}, |
| + | fp_plus_torp = |
| + | Formatting:format_image{StatIcons.firepower, caption = Formatting:format_stat_name("firepower")} |
| + | .. "+" .. |
| + | Formatting:format_image{StatIcons.torpedo, caption = Formatting:format_stat_name("torpedo")}, |
| + | luck_minus_cap = |
| + | '<span title="Luck cap">60</span>−' .. |
| + | Formatting:format_image{StatIcons.luck, caption = Formatting:format_stat_name("luck")} |
| + | } |
| + | end |
| + | |
| + | function Combat.row(frame) |
| + | |
| + | local rank = frame.args[1] |
| + | local ship_key = frame.args[2] |
| + | local note = frame.args["note"] |
| + | |
| + | local name, suffix = Ship:process_ship_key(ship_key) |
| + | local ship = Ship:get_table(name, suffix) |
| + | |
| + | if rank and name and ship and ship._type then |
| + | |
| + | local type_code_ = Formatting:format_ship_code(ship._type) |
| + | local type_code = normalized_type_code[type_code_] |
| + | local template = templates[type_code_to_template[type_code_] .. "_row"] |
| + | local luck_diff = 60 - ship._luck |
| + | |
| + | return format{ |
| + | template, |
| + | rank = rank, |
| + | name = note and format{'[[${name}|<span title="${note}">${name}</span>]]<sup>?</sup>', name = name, note = note} or |
| + | string.format("[[%s]]", name), |
| + | fp = ship._firepower_max, |
| + | torp = ship._torpedo_max, |
| + | fp_plus_torp = ship._firepower_max + (ship._torpedo_max or 0), |
| + | db_attack = format_damage(ship, type_code, Combat.shelling, "main", nil, attacks[type_code].spotting), |
| + | db_torp = format_damage(ship, type_code, Combat.torpedo, "torpedo"), |
| + | nb_da = format_damage(ship, type_code, Combat.night_battle, "main", Combat.modifier.night_attack.double), |
| + | nb_ci = format_damage(ship, type_code, Combat.night_battle, "torpedo", Combat.modifier.night_attack.cut_in.torpedo), |
| + | luck_minus_cap = luck_diff < 0 and "−" .. -luck_diff or luck_diff, |
| + | nb_ci_rate = string.format( |
| + | "%s%%, %s%%", |
| + | Combat.nb_cut_in_rate(ship, Combat.nb_cut_in_types.torpedo), |
| + | Combat.nb_cut_in_rate(ship, Combat.nb_cut_in_types.main)), |
| + | } |
| + | else |
| + | return "" |
| + | end |
| | | |
| end | | end |
| | | |
| return Combat | | return Combat |