Line 158: |
Line 158: |
| return math.floor(math.sqrt(modifier.k * ship._luck)) | | return math.floor(math.sqrt(modifier.k * ship._luck)) |
| else | | else |
− | return Combat.nb_cut_in_rate(modifier.luck_cap, modifier) | + | return math.floor(math.sqrt(modifier.k * modifier.luck_cap)) |
| end | | end |
| end | | end |
Line 216: |
Line 216: |
| | | |
| return ship | | return ship |
− |
| |
− | 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,Combat.ship(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, 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_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 |