Line 1: |
Line 1: |
| | | |
− | local format = require('Module:StringInterpolation').format | + | local format = require('Module:Core').format |
| local Formatting = require('Module:Formatting') | | local Formatting = require('Module:Formatting') |
− | local StatIcons = require('Module:StatIcons') | + | local StatIcons = require('Module:Data/Asset') |
| local Ship = require('Module:Ship') | | local Ship = require('Module:Ship') |
− | local Combat = require('Module:Combat') | + | local Combat = require('Module:Sandbox/Combat') |
| | | |
− | local equipment = { | + | local setups = { |
| DD = { | | DD = { |
| + | spotting = 1, |
| + | note = "normal attack", |
| main = { | | main = { |
− | { firepower = 3, rank = 10, k = 1 }, | + | { firepower = 3 }, |
− | { firepower = 3, rank = 10, k = 1 }, | + | { firepower = 3 }, |
| }, | | }, |
| torpedo = { | | torpedo = { |
− | -- Quint/53
| + | { torpedo = 12 }, |
− | { torpedo = 12, rank = 10, k = 1 }, | + | { torpedo = 12 }, |
− | { torpedo = 12, rank = 10, k = 1 }, | + | { torpedo = 12 }, |
− | { torpedo = 12, rank = 10, k = 1 }, | |
| }, | | }, |
| }, | | }, |
| CL = { | | CL = { |
− | -- 20.3 #3 | + | spotting = Combat.modifier.spotting.double, |
| + | note = "double attack", |
| main = { | | main = { |
− | { firepower = 10, rank = 10, k = 1 }, | + | { firepower = 10 }, |
− | { firepower = 10, rank = 10, k = 1 }, | + | { firepower = 10 }, |
| }, | | }, |
| torpedo = { | | torpedo = { |
− | { torpedo = 12, rank = 10, k = 1 }, | + | { torpedo = 12 }, |
− | { torpedo = 12, rank = 10, k = 1 }, | + | { torpedo = 12 }, |
− | { torpedo = 12, rank = 10, k = 1 }, | + | { torpedo = 12 }, |
| }, | | }, |
| }, | | }, |
| CLT = { | | CLT = { |
| + | spotting = 1, |
| + | note = "normal attack", |
| main = { | | main = { |
− | -- OTO
| + | { firepower = 10 }, |
− | { firepower = 8, rank = 10, k = 1 }, | + | { firepower = 10 }, |
− | { firepower = 8, rank = 10, k = 1 }, | |
− | -- Hyouteki
| |
| { torpedo = 12 }, | | { torpedo = 12 }, |
| }, | | }, |
| torpedo = { | | torpedo = { |
− | { torpedo = 12, rank = 10, k = 1 }, | + | { torpedo = 12 }, |
− | { torpedo = 12, rank = 10, k = 1 }, | + | { torpedo = 12 }, |
| { torpedo = 12 }, | | { torpedo = 12 }, |
| }, | | }, |
| }, | | }, |
| CA = { | | CA = { |
| + | spotting = Combat.modifier.spotting.double, |
| + | note = "double attack", |
| main = { | | main = { |
− | -- 20.3 #3
| + | { firepower = 10 }, |
− | { firepower = 10, rank = 10, k = 1 }, | + | { firepower = 10 }, |
− | { firepower = 10, rank = 10, k = 1 }, | |
− | -- FuMO
| |
| { firepower = 3 }, | | { firepower = 3 }, |
| }, | | }, |
| torpedo = { | | torpedo = { |
− | { torpedo = 12, rank = 10, k = 1 }, | + | { torpedo = 12 }, |
− | { torpedo = 12, rank = 10, k = 1 }, | + | { torpedo = 12 }, |
− | { torpedo = 12, rank = 10, k = 1 }, | + | { torpedo = 12 }, |
− | { torpedo = 12, rank = 10, k = 1 }, | + | }, |
| + | }, |
| + | Bismarck = { |
| + | spotting = Combat.modifier.spotting.double * Combat.modifier.ap.main_ap, |
| + | note = "double attack", |
| + | nb_ci = Combat.modifier.night_attack.cut_in.torpedo, |
| + | nb_ci_equip = "torpedo", |
| + | main = { |
| + | { firepower = 17 }, |
| + | { firepower = 17 }, |
| + | { firepower = 9 }, |
| + | }, |
| + | torpedo = { |
| + | { firepower = 26 }, |
| + | { firepower = 26 }, |
| + | { torpedo = 15 }, |
| + | { torpedo = 12 }, |
| + | }, |
| + | }, |
| + | FBB = { |
| + | spotting = Combat.modifier.spotting.double * Combat.modifier.ap.main_ap, |
| + | note = "double attack", |
| + | main = { |
| + | { firepower = 17 }, |
| + | { firepower = 17 }, |
| + | { firepower = 9 }, |
| + | }, |
| + | }, |
| + | Yamato = { |
| + | spotting = Combat.modifier.spotting.double * Combat.modifier.ap.main_ap, |
| + | note = "double attack", |
| + | main = { |
| + | { firepower = 30 }, |
| + | { firepower = 30 }, |
| + | { firepower = 9 }, |
| + | }, |
| + | }, |
| + | Italia = { |
| + | spotting = Combat.modifier.spotting.double * Combat.modifier.ap.main_ap, |
| + | note = "double attack", |
| + | main = { |
| + | { firepower = 21 }, |
| + | { firepower = 21 }, |
| + | { firepower = 9 }, |
| }, | | }, |
− | mixed = { | + | }, |
| + | Ise = { |
| + | spotting = Combat.modifier.spotting.double * Combat.modifier.ap.main_ap, |
| + | note = "double attack", |
| + | main = { |
| + | { firepower = 20 }, |
| + | { firepower = 20 }, |
| + | { firepower = 9 }, |
| }, | | }, |
| }, | | }, |
| } | | } |
| + | setups.Musashi = setups.Yamato |
| + | setups.Nagato = setups.Yamato |
| + | setups.Mutsu = setups.Yamato |
| + | setups.Roma = setups.Italia |
| + | setups.Fusou = setups.Italia |
| + | setups.Yamashiro = setups.Italia |
| + | setups.Hyuuga = setups.Ise |
| | | |
| local normalized_type_code = { | | local normalized_type_code = { |
Line 68: |
Line 127: |
| CL = "CL", | | CL = "CL", |
| CLT = "CLT", | | CLT = "CLT", |
− | FBB = "BB", | + | CA = "CA", |
| + | CAV = "CA", |
| + | FBB = "FBB", |
| BB = "BB", | | BB = "BB", |
− | CAV = "CA",
| |
| BBV = "BB", | | BBV = "BB", |
| CVL = "CV", | | CVL = "CV", |
Line 84: |
Line 144: |
| FBB = "main", | | FBB = "main", |
| BB = "main", | | BB = "main", |
− | CAV = "main_aviation", | + | CAV = "main", |
− | BBV = "main_aviation", | + | BBV = "main", |
| CVL = "carrier", | | CVL = "carrier", |
| CV = "carrier", | | CV = "carrier", |
| CVB = "carrier", | | CVB = "carrier", |
| -- SS = "submarine", | | -- SS = "submarine", |
− | -- SSV = "submarine_aviation", | + | -- SSV = "submarine", |
| -- AV = "...", | | -- AV = "...", |
| -- AO = "...", | | -- AO = "...", |
| } | | } |
| | | |
− | function format_damage(ship_, type_code, damage_type_fn, equip_setup, night_attack, spotting) | + | function format_damage(ship_, damage_type_fn, night_attack, setup, equip_setup, spotting, hide_normal_damage) |
| + | if not setup then return "" end |
| local combat = Combat:new(night_attack) | | local combat = Combat:new(night_attack) |
| local normal_damage = combat:damage(damage_type_fn(combat, Combat.ship(ship_, {}, night_attack))) | | local normal_damage = combat:damage(damage_type_fn(combat, Combat.ship(ship_, {}, night_attack))) |
Line 102: |
Line 163: |
| and string.format('<span style="color:red;">%s</span>', normal_damage) | | and string.format('<span style="color:red;">%s</span>', normal_damage) |
| or normal_damage | | or normal_damage |
− | local equip = equipment[type_code][equip_setup] | + | local equip = setup[equip_setup] |
− | spotting = spotting or 1 | + | if not equip then return "" end |
| + | setup.spotting = setup.spotting or 1 |
| local equip_damage_pre = combat:damage(damage_type_fn(combat, Combat.ship(ship_, equip, night_attack))) | | local equip_damage_pre = combat:damage(damage_type_fn(combat, Combat.ship(ship_, equip, night_attack))) |
| local equip_damage = combat:damage(damage_type_fn(combat, Combat.ship(ship_, equip, night_attack, spotting))) | | local equip_damage = combat:damage(damage_type_fn(combat, Combat.ship(ship_, equip, night_attack, spotting))) |
Line 112: |
Line 174: |
| return | | return |
| night_attack | | night_attack |
− | and string.format("%s", equip_damage_string) | + | and string.format("%s * 2", equip_damage_string) |
| + | or hide_normal_damage |
| + | and (spotting |
| + | and string.format("%s * 2", equip_damage_string) |
| + | or string.format("%s", equip_damage_string)) |
| or string.format("%s, %s", normal_damage_string, equip_damage_string) | | or string.format("%s, %s", normal_damage_string, equip_damage_string) |
| end | | end |
Line 122: |
Line 188: |
| ! colspan="4" |Day Battle | | ! colspan="4" |Day Battle |
| ! colspan="5" |Night Battle | | ! colspan="5" |Night Battle |
| + | ! colspan="3" |Defence |
| |- | | |- |
| !style="width:60px;"|Rank | | !style="width:60px;"|Rank |
− | !style="width:80px;"|Name | + | !style="width:85px;"|Name |
| !${fp} | | !${fp} |
| !${torp} | | !${torp} |
− | !<span title="Damage: normal attack without equipment, ${db_attack_note} with maxed equipment (all other modifiers = 1, see notes)">Hit</span> | + | !<span title="Double attack damage (* 1.5 for critical hit)">DA</span> |
− | !<span title="Normal torpedo salvo damage, all modifiers = 1, see notes">Salvo</span> | + | !<span title="Torpedo salvo damage: without and with torpedo equipment (* 1.5 for critical hit)">Salvo</span> |
| !${fp_plus_torp} | | !${fp_plus_torp} |
− | !<span title="Maximal damage from double attack (combined)">DA</span> | + | !<span title="Maximal damage from double attack (* 1.5 for critical hit)">DA</span> |
− | !<span title="Maximal damage from cut-in">CI</span> | + | !<span title="Maximal damage from torpedo cut-in (* 1.5 for critical hit)">CI</span> |
| !${luck_minus_cap} | | !${luck_minus_cap} |
− | !<span title="Torpedo/mixed cut-in rate, gun cut-in rate (only luck dependent part, no bonuses)">CI%</span> | + | !<span title="Torpedo and mixed cut-in rate (only luck dependent part, no bonuses)">CI%</span> |
| + | !${hp} |
| + | !${armor} |
| + | !${evasion} |
| ${rows}|}]], | | ${rows}|}]], |
| | | |
− | carrier = [[{| class="wikitable sortable typography-xl-optout" style="width:100%;"
| + | carrier = [[{| class="wikitable sortable typography-xl-optout" style="width:100%;" |
| + | ! colspan="3" | |
| + | ! colspan="5" |<span title="Air Power with maxed Reppuu">Air Power</span> |
| + | ! colspan="2" |Offence |
| + | ! colspan="3" |Defence |
| + | |- |
| !style="width:60px;"|Rank | | !style="width:60px;"|Rank |
− | !style="width:80px;"|Name | + | !style="width:85px;"|Name |
| !${fp} | | !${fp} |
− | !<span title="Air Power with full >> Reppuu">Air Power</span> | + | !Mule |
| + | !1st slot |
| + | !2nd |
| + | !3rd |
| + | !4th |
| !<span title="">Aerial Hit</span> | | !<span title="">Aerial Hit</span> |
| !<span title="">Shelling</span> | | !<span title="">Shelling</span> |
| + | !${hp} |
| + | !${armor} |
| + | !${evasion} |
| ${rows}|}]], | | ${rows}|}]], |
| | | |
Line 157: |
Line 239: |
| |${luck_minus_cap} | | |${luck_minus_cap} |
| |${nb_ci_rate} | | |${nb_ci_rate} |
| + | |${hp} |
| + | |${armor} |
| + | |${evasion_rate} |
| ]], | | ]], |
| | | |
− | carrier_row = [[|-
| + | carrier_row = [[|- |
| |${rank} | | |${rank} |
| |${name} | | |${name} |
| |${fp} | | |${fp} |
− | | | + | |${slot_all} |
− | | | + | |${slot1} |
− | | | + | |${slot2} |
| + | |${slot3} |
| + | |${slot4} |
| + | |${aerial} |
| + | |${shelling} |
| + | |${hp} |
| + | |${armor} |
| + | |${evasion_rate} |
| ]], | | ]], |
| | | |
− | }
| |
− |
| |
− | 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",
| |
− | },
| |
| } | | } |
| | | |
Line 198: |
Line 271: |
| template, | | template, |
| rows = frame.args[1] or "", | | rows = frame.args[1] or "", |
− | db_attack_note = attacks[type_code].note or "?", | + | db_attack_note = setups[type_code] and setups[type_code].note or "", |
| fp = Formatting:format_image{StatIcons.firepower, caption = Formatting:format_stat_name("firepower")}, | | fp = Formatting:format_image{StatIcons.firepower, caption = Formatting:format_stat_name("firepower")}, |
| torp = Formatting:format_image{StatIcons.torpedo, caption = Formatting:format_stat_name("torpedo")}, | | torp = Formatting:format_image{StatIcons.torpedo, caption = Formatting:format_stat_name("torpedo")}, |
Line 206: |
Line 279: |
| Formatting:format_image{StatIcons.torpedo, caption = Formatting:format_stat_name("torpedo")}, | | Formatting:format_image{StatIcons.torpedo, caption = Formatting:format_stat_name("torpedo")}, |
| luck_minus_cap = | | luck_minus_cap = |
− | '<span title="Luck cap">60</span>−' ..
| + | '<span title="Luck cap">60</span>−' .. |
− | Formatting:format_image{StatIcons.luck, caption = Formatting:format_stat_name("luck")} | + | Formatting:format_image{StatIcons.luck, caption = Formatting:format_stat_name("luck")}, |
| + | hp = Formatting:format_image{StatIcons.hp, caption = Formatting:format_stat_name("HP")}, |
| + | armor = Formatting:format_image{StatIcons.armor, caption = Formatting:format_stat_name("Armor")}, |
| + | evasion = Formatting:format_image{StatIcons.evasion, caption = Formatting:format_stat_name("Evasion rate at lvl 80, with normal and high morale (only level dependent part)")}, |
| } | | } |
| end | | end |
Line 218: |
Line 294: |
| | | |
| local name, suffix = Ship:process_ship_key(ship_key) | | local name, suffix = Ship:process_ship_key(ship_key) |
− | local ship = Ship:get_table(name, suffix) | + | local ship = Ship(ship_key){ _level = 80 } |
| | | |
| if rank and name and ship and ship._type then | | if rank and name and ship and ship._type then |
Line 226: |
Line 302: |
| local template = templates[type_code_to_template[type_code_] .. "_row"] | | local template = templates[type_code_to_template[type_code_] .. "_row"] |
| local luck_diff = 60 - ship._luck | | local luck_diff = 60 - ship._luck |
| + | local setup = setups[name] or setups[type_code] |
| | | |
− | return format{
| + | if type_code == "CV" then |
− | template,
| + | local air_power = Combat.air_power(ship) |
− | rank = rank,
| + | return format{ |
− | name = note and format{'[[${name}|<span title="${note}">${name}</span>]]<sup>?</sup>', name = name, note = note} or
| + | template, |
− | string.format("[[%s]]", name),
| + | rank = rank, |
− | fp = ship._firepower_max,
| + | name = note and format{'[[${name}|<span title="${note}">${name}</span>]]<sup>?</sup>', name = name, note = note} or |
− | torp = ship._torpedo_max,
| + | string.format("[[%s]]", name), |
− | fp_plus_torp = ship._firepower_max + (ship._torpedo_max or 0),
| + | fp = ship._firepower_max, |
− | db_attack = format_damage(ship, type_code, Combat.shelling, "main", nil, attacks[type_code].spotting),
| + | torp = ship._torpedo_max or "", |
− | db_torp = format_damage(ship, type_code, Combat.torpedo, "torpedo"),
| + | hp = ship._hp, |
− | nb_da = format_damage(ship, type_code, Combat.night_battle, "main", Combat.modifier.night_attack.double),
| + | armor = ship._armor_max, |
− | nb_ci = format_damage(ship, type_code, Combat.night_battle, "torpedo", Combat.modifier.night_attack.cut_in.torpedo),
| + | evasion_rate = string.format("%s%%, %s%%", Combat.evasion_rate(ship), Combat.evasion_rate(ship, true)), |
− | luck_minus_cap = luck_diff < 0 and "−" .. -luck_diff or luck_diff,
| + | slot_all = air_power.slot_all, |
− | nb_ci_rate = string.format(
| + | slot1 = air_power.slot1, |
− | "%s%%, %s%%",
| + | slot2 = air_power.slot2, |
− | Combat.nb_cut_in_rate(ship, Combat.nb_cut_in_types.torpedo),
| + | slot3 = air_power.slot3, |
− | Combat.nb_cut_in_rate(ship, Combat.nb_cut_in_types.main)),
| + | slot4 = air_power.slot4, |
− | }
| + | aerial = "", |
| + | shelling = "", |
| + | } |
| + | else |
| + | 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 or "", |
| + | fp_plus_torp = ship._firepower_max + (ship._torpedo_max or 0), |
| + | db_attack = format_damage(ship, Combat.shelling, nil, setup, "main", setup and setup.spotting, true), |
| + | db_torp = format_damage(ship, Combat.torpedo, nil, setup, "torpedo"), |
| + | nb_da = format_damage(ship, Combat.night_battle, Combat.modifier.night_attack.double, setup, "main"), |
| + | nb_ci = format_damage(ship, Combat.night_battle, Combat.modifier.night_attack.cut_in.torpedo, setup, "torpedo"), |
| + | luck_minus_cap = luck_diff < 0 and "−" .. -luck_diff or luck_diff, |
| + | nb_ci_rate = Combat.nb_cut_in_rate(ship, Combat.nb_cut_in_types.torpedo) .. '%', |
| + | hp = ship._hp, |
| + | armor = ship._armor_max, |
| + | evasion_rate = string.format("%s%%, %s%%", Combat.evasion_rate(ship), Combat.evasion_rate(ship, true)), |
| + | } |
| + | end |
| + | |
| else | | else |
| return "" | | return "" |