Line 2: |
Line 2: |
| local Equipment = require('Module:Equipment') | | local Equipment = require('Module:Equipment') |
| local EquipmentCardKai = require('Module:EquipmentCardKai') | | local EquipmentCardKai = require('Module:EquipmentCardKai') |
| + | local EquipmentGraphicKai = require('Module:EquipmentGraphicKai') |
| local Formatting = require('Module:Formatting') | | local Formatting = require('Module:Formatting') |
− | local format = require('Module:StringInterpolation').format | + | local Tabber = require('Module:Tabber') |
| + | |
| + | local U = require('Module:Core') |
| + | local format = U.format |
| | | |
| local EquipmentInfoKai = BaseData{ | | local EquipmentInfoKai = BaseData{ |
− | _template = [[{|class="${table_class}" id="${table_id}" style="border: 1px solid darkgray; width: 400px; float: ${float};" | + | _template = [[{|class="${table_class}" id="${table_id}" style="border: 1px solid darkgray; width: 380px; background-color: #fafafa;${float}" |
| |- | | |- |
− | | colspan="2" style="position: relative; padding: 1px 40px; text-align: center; background-color: ${back};${extra_style};"|<div style="position: absolute; right: 5px;">${edit_link}</div> | + | | colspan="2" id="kc-eq-namecard" style="position: relative; padding: 10px 40px; text-align: center; background-color: ${back};${extra_style};" title="${rarity}" | <div id="kc-eq-edit-link" style="position: absolute; right: 5px;">${edit_link}</div> |
− | <p style="font-size: 25px">'''${name}'''</p>${localized_name} | + | <div id="kc-eq-en-name" style="font-size: 20px; margin:0 0 4px 0;">'''${name}'''</div> |
− | <p style="font-size: 20px">'''No.${id} ${japanese_name}'''</p> | + | ${localized_name} |
| + | <div id="kc-eq-jp-entry" style="margin:4px 0 0 0;">'''No.${id} ${japanese_name}'''</div> |
| |- | | |- |
− | | colspan="2" style="text-align: center; background-color: whitesmoke;"| | + | | colspan="2" id="kc-eq-statscard" style="text-align: center; background-color: whitesmoke;" | |
− | '''${icon} ${eq_type}'''
| + | <div id="kc-eq-category" style="margin:0 0 4px 0;">${icon} <b>${eq_type}</b>${eq_group}</div> |
− | | + | <div id="kc-eq-effects" style="margin:4px 0;"><b>Effects: ${effects}</b></div> |
− | <b>Effects: ${effects}</b> | + | ${flight_stats} |
− | | + | <div id="kc-eq-scrap" style="margin:4px 0 0 0;">'''Scrap value: ${scrap}''' (${buildable})</div> |
− | '''Scrap value: ${scrap}'''${alternative_names} | + | ${alternative_names} |
− | |- | + | |- |
− | | colspan="2" style="text-align: center;" | ${card} | + | | colspan="2" id="kc-eq-pictures" style="text-align: center;" | ${card} |
| |- | | |- |
− | | colspan="2" style="text-align: center; background-color: LightSkyBlue;" | '''Refittable Class''' | + | | colspan="2" id="kc-eq-fits" style="text-align: center; background-color: LightSkyBlue;" | '''Refittable Ship Types''' |
− | ${compatibility_details} | + | ${compatibility_details}${bonus_details} |
| |}]], | | |}]], |
| + | _bonus_header = [=[|- |
| + | | colspan="2" id="kc-eq-bonus" style="text-align: center; background-color: LightSkyBlue;" | '''Bonus'''${category}]=], |
| + | _bonus_row = [=[|- |
| + | | style="width: 190px; text-align: center;" | ${text} |
| + | | style="width: 190px; text-align: center;" | ${stats}]=], |
| + | --|- |
| + | --| colspan="2" style="text-align: center; padding: 0px;" | <div class="mw-collapsible mw-collapsed"> |
| + | --<div style="background-color: lightskyblue; text-align: center; margin: 0px;">'''Improvement'''</div> |
| + | --<div class="mw-collapsible-content" style="margin-bottom: -2px;"> |
| + | --${improvement} |
| + | --</div> |
| + | --</div> |
| + | --|}]], |
| _row_starter = "|-", | | _row_starter = "|-", |
− | _compatibility_cell = [[| style="width: 200px; text-align: center; background-color: ${bg_color};" | ${label}]], | + | _compatibility_cell = [[| style="width: 190px; text-align: center; background-color: ${bg_color};" | ${label}]], |
− | _localized_name_template = "<p>''${localized_name}''</p>", | + | _lbas_compatibility_row = [=[|- |
| + | | colspan="2" style="text-align: center; background-color: LightSkyBlue;" | '''[[LBAS]] Plane''']=], |
| + | _localized_name_template = [[<div id="kc-eq-local-name" style="margin:4px 0;">${localized_name}</div>]], |
| + | _flight_stats_template = [[<div id="kc-eq-flights"><b>Combat Radius: ${combat_radius}</b> (Deployment Cost: ${deployment_cost})</div>]], |
| _alternative_names_template = [[ | | _alternative_names_template = [[ |
| |- | | |- |
− | | colspan="2" style="text-align: center; padding: 0px;" | <div class="mw-collapsible mw-collapsed" style="background-color: lightgrey; margin: 0px;">''Alternate names''<div class="mw-collapsible-content" style="background-color: whitesmoke;"> | + | | colspan="2" id="kc-eq-altnames" style="text-align: center; padding: 0px;" | <div class="mw-collapsible mw-collapsed" style="background-color: lightgrey; margin: 0px;">''Alternate names''<div class="mw-collapsible-content" style="background-color: whitesmoke;"> |
| ${names} | | ${names} |
| </div></div>]], | | </div></div>]], |
| + | -- _collapsed_content_header = [[<div style="text-align: center; background-color: lightgrey; margin:2px 0px 2px;">'''${content}'''</div>]], |
| + | -- _collapsed_content_row = [[<div style="text-align: center; background-color: whitesmoke; margin:2px 0px 2px;">${content}</div>]], |
| _alternative_name_template = [[<div style="display: inline-block; vertical-align: middle;"><small>''${label}:''</small></div> <div style="display: inline-block; vertical-align: middle;"><small>''${name}<br />${japanese_name}''</small></div>]], | | _alternative_name_template = [[<div style="display: inline-block; vertical-align: middle;"><small>''${label}:''</small></div> <div style="display: inline-block; vertical-align: middle;"><small>''${name}<br />${japanese_name}''</small></div>]], |
| + | _eq_group_template = " (${eq_group})", |
| + | _fit_group_tooltip = "Fit group based on experimental findings", |
| + | _concentrated_label = "Concentrated", |
| + | _air_radar_label = "Air Radar", |
| + | _high_angle_label = "High-angle", |
| + | _plus_fire_director_label = " + Fire Director", |
| _library_name_label = "Library name", | | _library_name_label = "Library name", |
| _list_name_label = "List name", | | _list_name_label = "List name", |
| _comparison_name_label = "Comparison name", | | _comparison_name_label = "Comparison name", |
| + | _battle_name_label = "Battle name", |
| _equipment_data_documentation = "Template:EquipmentDataDocumentation/EditIntro", | | _equipment_data_documentation = "Template:EquipmentDataDocumentation/EditIntro", |
| _edit_link_text = "Edit", | | _edit_link_text = "Edit", |
| _empty_card = "Empty equipment card slot.png", | | _empty_card = "Empty equipment card slot.png", |
| + | _buildable = "'''Buildable'''", |
| + | _unbuildable = "''Unbuildable''", |
| + | _float_style_template = " float: left; margin: 0 1.5em 1em 0;", |
| _shown_ship_types = { | | _shown_ship_types = { |
− | 2, 3, | + | 8, 9, |
− | 21, 4, | + | 10, 11, |
| + | 18, 7, |
| 5, 6, | | 5, 6, |
− | 8, 9, | + | 3, 4, |
− | 10, 7, | + | 21, 2, |
− | 11, 18, | + | 1, 13, |
− | 13, 14, | + | 14, 16, |
− | 20, 16, | + | 22, 20, |
− | 17, 19, | + | 19, 17 |
| }, | | }, |
| _fields = { | | _fields = { |
| "edit_link", | | "edit_link", |
| + | "rarity", |
| "back", | | "back", |
| "name", | | "name", |
| "localized_name", | | "localized_name", |
| + | "flight_stats", |
| "alternative_names", | | "alternative_names", |
| "id", | | "id", |
Line 63: |
Line 99: |
| "scrap", | | "scrap", |
| "image", | | "image", |
| + | "crafting", |
| "compatibility_details", | | "compatibility_details", |
| + | "bonus_details", |
| }, | | }, |
| } | | } |
Line 75: |
Line 113: |
| function EquipmentInfoKai:edit_link() | | function EquipmentInfoKai:edit_link() |
| self._vars.edit_link = Formatting:format_edit_link(self._equipment_data_module, self._edit_link_text, self._equipment_data_documentation) | | self._vars.edit_link = Formatting:format_edit_link(self._equipment_data_module, self._edit_link_text, self._equipment_data_documentation) |
| + | end |
| + | |
| + | function EquipmentInfoKai:rarity() |
| + | self._vars.rarity = Formatting:format_equipment_rarity(self._equipment:rarity()) |
| end | | end |
| | | |
| function EquipmentInfoKai:back() | | function EquipmentInfoKai:back() |
| local back = self._equipment:back() | | local back = self._equipment:back() |
− | self._vars.back, self._vars.extra_style = Formatting:format_equipment_back(back), Formatting:extra_style_background_image(false, back and back >= 4) | + | self._vars.back, self._vars.extra_style = Formatting:format_equipment_back(back), Formatting:extra_style_background_image(false, back and back > 4) |
| end | | end |
| | | |
Line 92: |
Line 134: |
| else | | else |
| self._vars.localized_name = "" | | self._vars.localized_name = "" |
| + | end |
| + | end |
| + | |
| + | function EquipmentInfoKai:flight_stats() |
| + | if self._equipment:is_lbas_plane() then |
| + | self._vars.flight_stats = format{self._flight_stats_template, combat_radius = Formatting:format_stat(self._equipment:combat_radius()), deployment_cost = Formatting:format_resources(self._equipment:deployment_cost())} |
| + | else |
| + | self._vars.flight_stats = "" |
| end | | end |
| end | | end |
Line 100: |
Line 150: |
| local library_name = self._equipment:library_name() | | local library_name = self._equipment:library_name() |
| local comparison_name = self._equipment:comparison_name() | | local comparison_name = self._equipment:comparison_name() |
| + | local battle_name = self._equipment:battle_name() |
| if list_name then | | if list_name then |
| local list_japanese_name = self._equipment:list_japanese_name() | | local list_japanese_name = self._equipment:list_japanese_name() |
Line 141: |
Line 192: |
| end | | end |
| table.insert(alternative_names, format{self._alternative_name_template, label = self._comparison_name_label, name = comparison_name, japanese_name = comparison_japanese_name}) | | table.insert(alternative_names, format{self._alternative_name_template, label = self._comparison_name_label, name = comparison_name, japanese_name = comparison_japanese_name}) |
| + | end |
| + | if battle_name then |
| + | local battle_japanese_name = self._equipment:battle_japanese_name() |
| + | local battle_reading = self._equipment:battle_reading() |
| + | if battle_reading ~= false then |
| + | battle_japanese_name = tostring(Formatting:japanese_text(Formatting:format_stat(battle_japanese_name), Formatting:format_stat(battle_reading))) |
| + | end |
| + | local battle_localized_name = self._equipment:battle_localized_name() |
| + | if battle_localized_name then |
| + | battle_name = Formatting:tooltip(Formatting:format_stat(battle_name), Formatting:format_stat(battle_localized_name)) |
| + | else |
| + | battle_name = Formatting:format_stat(battle_name) |
| + | end |
| + | table.insert(alternative_names, format{self._alternative_name_template, label = self._battle_name_label, name = battle_name, japanese_name = battle_japanese_name}) |
| end | | end |
| if #alternative_names == 0 then | | if #alternative_names == 0 then |
Line 162: |
Line 227: |
| | | |
| function EquipmentInfoKai:eq_type() | | function EquipmentInfoKai:eq_type() |
− | self._vars.eq_type = Formatting:tooltip(Formatting:format_equipment_type(self._equipment:type()), Formatting:format_equipment_rarity(self._equipment:rarity())) | + | local eq_type = self._equipment:type() |
| + | self._vars.eq_type = Formatting:format_equipment_type(self._equipment:type()) |
| + | local album_type = self._equipment:album_type() |
| + | if album_type then |
| + | self._vars.eq_type = Formatting:tooltip(self._vars.eq_type, album_type) |
| + | end |
| + | self._vars.eq_group = "" |
| + | if eq_type == 3 or eq_type == 38 then |
| + | self._vars.eq_group = format{self._eq_group_template, eq_group = Formatting:tooltip(Formatting:format_stat(self._equipment:gun_fit_group()), self._fit_group_tooltip)} |
| + | elseif eq_type == 21 then |
| + | local aa = self._equipment:aa() |
| + | if aa and aa >= 9 then |
| + | self._vars.eq_group = format{self._eq_group_template, eq_group = self._concentrated_label} |
| + | end |
| + | elseif eq_type == 12 or eq_type == 13 or eq_type == 93 then |
| + | local aa = self._equipment:aa() |
| + | if aa and aa >= 2 then |
| + | self._vars.eq_group = format{self._eq_group_template, eq_group = self._air_radar_label} |
| + | end |
| + | else |
| + | local icon = self._equipment:icon() |
| + | if icon and icon == 16 then |
| + | local aa = self._equipment:aa() |
| + | local eq_group = self._high_angle_label |
| + | if aa and aa >= 8 then |
| + | eq_group = eq_group .. self._plus_fire_director_label |
| + | end |
| + | self._vars.eq_group = format{self._eq_group_template, eq_group = eq_group} |
| + | end |
| + | end |
| end | | end |
| | | |
| function EquipmentInfoKai:effects() | | function EquipmentInfoKai:effects() |
− | self._vars.effects = Formatting:format_stat_bonuses{
| + | local stats = { |
| firepower = self._equipment:firepower(), | | firepower = self._equipment:firepower(), |
| bombing = self._equipment:bombing(), | | bombing = self._equipment:bombing(), |
Line 182: |
Line 276: |
| special = self._equipment:special(), | | special = self._equipment:special(), |
| } | | } |
| + | if self._equipment:type() == 48 then |
| + | self._vars.effects = Formatting:format_stat_bonuses_interceptor(stats) |
| + | else |
| + | self._vars.effects = Formatting:format_stat_bonuses(stats) |
| + | end |
| end | | end |
| | | |
Line 189: |
Line 288: |
| | | |
| function EquipmentInfoKai:image() | | function EquipmentInfoKai:image() |
| + | local tabber = Tabber() |
| local caption = nil | | local caption = nil |
| local card_name = self._equipment:card_name() | | local card_name = self._equipment:card_name() |
Line 204: |
Line 304: |
| caption = table.concat(card_caption) | | caption = table.concat(card_caption) |
| end | | end |
− | self._vars.card = EquipmentCardKai:card{self._equipment, caption = caption} | + | tabber:add_tab("Card", EquipmentCardKai:get{equip = self._equipment, caption = caption}) |
| + | tabber:add_tab("Fairy", EquipmentGraphicKai:get{equip = self._equipment, fairy = "only"}) |
| + | tabber:add_tab("Equipment", EquipmentGraphicKai:get{equip = self._equipment}) |
| + | tabber:add_tab("Combination", EquipmentGraphicKai:get{equip = self._equipment, fairy = true}) |
| + | self._vars.card = tostring(tabber) |
| end | | end |
| | | |
Line 213: |
Line 317: |
| table.insert(result, self._row_starter) | | table.insert(result, self._row_starter) |
| end | | end |
− | local compatibility, note = self._equipment:equippable(ship_type) | + | local compatibility, note, ship_label |
− | local ship_label = Formatting:format_ship_type(ship_type)
| + | if ship_type then |
− | if note then
| + | compatibility, note = self._equipment:equippable(ship_type) |
− | ship_label = Formatting:tooltip(ship_label, note)
| + | ship_label = Formatting:format_ship_type(ship_type)-- + " " + Formatting:format_equipment_compatibility_symbol(compatibility) |
− | end | + | if note then |
| + | ship_label = Formatting:tooltip(ship_label, note) |
| + | end |
| + | else |
| + | ship_label = Formatting:format_ship_type(ship_type) |
| + | end |
| table.insert(result, format{self._compatibility_cell, bg_color = Formatting:format_equipment_compatibility(compatibility), label = ship_label}) | | table.insert(result, format{self._compatibility_cell, bg_color = Formatting:format_equipment_compatibility(compatibility), label = ship_label}) |
| + | --table.insert(result, format{self._compatibility_cell, bg_color = Formatting:format_equipment_compatibility_color(compatibility), label = ship_label}) |
| + | end |
| + | if self._equipment:is_lbas_plane() then |
| + | table.insert(result, self._lbas_compatibility_row) |
| end | | end |
− | return table.concat(result, "\n") | + | self._vars.compatibility_details = table.concat(result, "\n") |
| + | end |
| + | |
| + | local function format_bonus_text(desc) |
| + | local with_formats = { |
| + | ["Radar"] = "[[File:Radar.png|link=Radar|Radar with accuracy ≥ 3]]", |
| + | ["SRadar"] = "[[File:Radar.png|link=Radar|Surface Radar with accuracy ≥ 3]]", |
| + | ["ARadar"] = "[[File:Radar.png|link=Radar|Air Radar with accuracy ≥ 3]]", |
| + | ["53Torpedo"] = "[[File:Torpedo.png|link=53cm Twin Torpedo Mount|53cm Twin Torpedo Mount]]", |
| + | ["61Torpedo"] = "[[File:Torpedo.png|link=Category:Equipment fits with 12.7cm Single High-angle Gun Mount (Late Model)|Fits with 61cm Triple Torpedo Mount and 61cm Triple (Oxygen) Torpedo Mount only]]", |
| + | } |
| + | local with = desc._with and with_formats[desc._with] and " " .. with_formats[desc._with] or "" |
| + | local count = desc._count and " " .. Formatting:tooltip("×" .. desc._count, "amount of equipment") or "" |
| + | local text = desc._ship and |
| + | string.format("[[%s]]%s", desc._ship, count) or |
| + | desc._class and |
| + | string.format( |
| + | "[[:Category:%s Class|%s Class]]%s%s", |
| + | desc._class, |
| + | desc._class, |
| + | desc._suffix and " " .. desc._suffix or "", |
| + | count |
| + | ) or |
| + | "??" |
| + | return text, with |
| + | end |
| + | |
| + | local function format_bonus_stat(desc, stat) |
| + | return type(desc[stat]) == "table" and |
| + | Formatting:tooltip(U.isum(desc[stat]), U.ijoin(U.imap(desc[stat], function(e) return "+" .. e end), " ")) or |
| + | desc[stat] or |
| + | false |
| end | | end |
| | | |
− | function EquipmentInfoKai:create_item() | + | function EquipmentInfoKai:bonus_details() |
− | if self._args.name then
| + | --[=[ |
− | self._equipment = Equipment(self._args.name, self._args.model)
| + | local result = { format{self._bonus_header, category = U.category("Equipment with stat bonuses") } } |
| + | for _, ship in ipairs(U.isort(U.keys(self._equipment._bonus or {}))) do |
| + | local s = self._equipment._bonus[ship] or {} |
| + | table.insert(result, format{ |
| + | self._bonus_row, |
| + | text = string.sub(ship, 1, 1) == "@" and string.sub(ship, 2) or ("[[" .. ship .. "]]"), |
| + | stats = Formatting:format_stat_bonuses({ |
| + | firepower = s._firepower or false, |
| + | bombing = s._bombing or false, |
| + | torpedo = s._torpedo or false, |
| + | aa = s._aa or false, |
| + | armor = s._armor or false, |
| + | asw = s._asw or false, |
| + | shelling_accuracy = s._shelling_accuracy or false, |
| + | torpedo_accuracy = s._torpedo_accuracy or false, |
| + | evasion = s._evasion or false, |
| + | los = s._los or false, |
| + | speed = s._speed or false, |
| + | luck = s._luck or false, |
| + | range = s._range or false, |
| + | special = s._special or false, |
| + | }) |
| + | }) |
| + | end |
| + | local text, with, prevText |
| + | for _, desc in ipairs(self._equipment._bonuses or {}) do |
| + | text, with = format_bonus_text(desc) |
| + | table.insert(result, format{ |
| + | self._bonus_row, |
| + | text = text ~= prevText and text .. with or with, |
| + | stats = Formatting:format_stat_bonuses({ |
| + | firepower = format_bonus_stat(desc, "_firepower"), |
| + | bombing = format_bonus_stat(desc, "_bombing"), |
| + | torpedo = format_bonus_stat(desc, "_torpedo"), |
| + | aa = format_bonus_stat(desc, "_aa"), |
| + | armor = format_bonus_stat(desc, "_armor"), |
| + | asw = format_bonus_stat(desc, "_asw"), |
| + | shelling_accuracy = format_bonus_stat(desc, "_shelling_accuracy"), |
| + | torpedo_accuracy = format_bonus_stat(desc, "_torpedo_accuracy"), |
| + | evasion = format_bonus_stat(desc, "_evasion"), |
| + | los = format_bonus_stat(desc, "_los"), |
| + | speed = format_bonus_stat(desc, "_speed"), |
| + | luck = format_bonus_stat(desc, "_luck"), |
| + | range = format_bonus_stat(desc, "_range"), |
| + | special = format_bonus_stat(desc, "_special"), |
| + | }) |
| + | }) |
| + | prevText = text |
| + | end |
| + | ]=]-- |
| + | self._vars.bonus_details = "" -- #result > 1 and ("\n" .. table.concat(result, "\n")) or "" |
| + | end |
| + | |
| + | function EquipmentInfoKai:crafting() |
| + | local craft_methods |
| + | if self._equipment:buildable() then |
| + | self._vars.buildable = self._buildable |
| else | | else |
− | self._equipment = Equipment(self._args[1]) | + | self._vars.buildable = self._unbuildable |
| end | | end |
| + | end |
| + | |
| + | --function EquipmentInfoKai:improvement() |
| + | -- local cells = {} |
| + | -- local improvement = self._equipment:improvement() |
| + | -- if improvement then |
| + | -- Formatting:format_resources(improvement:resources()) |
| + | -- for ship, ship_info in pairs(improvement:ships()) do |
| + | -- format{self._} |
| + | --end |
| + | |
| + | function EquipmentInfoKai:create_item() |
| + | self._equipment = Equipment(self._args[1], self._enemy) |
| end | | end |
| | | |
Line 237: |
Line 450: |
| function EquipmentInfoKai:create_infobox_prep() | | function EquipmentInfoKai:create_infobox_prep() |
| self._vars = {} | | self._vars = {} |
− | local table_classes = {"typography-xl-optout", "infobox"} | + | local table_classes = {"infobox", "infobox-left", "infobox-equipment"} |
| if self._args.classes then | | if self._args.classes then |
| table.insert(table_classes, self._args.classes) | | table.insert(table_classes, self._args.classes) |
Line 248: |
Line 461: |
| self._vars.table_class = table.concat(table_classes, " ") | | self._vars.table_class = table.concat(table_classes, " ") |
| self._vars.table_id = collapsible and collapsible ~= "true" and ("mw-customcollapsible-" .. collapsible) or "" | | self._vars.table_id = collapsible and collapsible ~= "true" and ("mw-customcollapsible-" .. collapsible) or "" |
− | self._vars.float = self._args.float or "none" | + | self._vars.float = self._args.float and "" or self._float_style_template |
| end | | end |
| | | |