Line 5: |
Line 5: |
| local Formatting = require('Module:Formatting') | | local Formatting = require('Module:Formatting') |
| | | |
− | local format = require('Module:StringOperations').format | + | local U = require('Module:Core') |
| + | local format = U.format |
| | | |
| local ShipMetaKai = BaseData{ | | local ShipMetaKai = BaseData{ |
| _template = [[{|class="${table_class}" | | _template = [[{|class="${table_class}" |
| |- | | |- |
− | !class="infobox-kai-header-major" colspan=2|${name} ${japanese_name} | + | !class="infobox-kai-header-major" colspan=2|${name}<div style="float:right;margin-right:5px">${edit_link}</div> |
| |- | | |- |
| !Class | | !Class |
Line 24: |
Line 25: |
| |${availability} | | |${availability} |
| |- | | |- |
− | !Implemented on | + | !Implementation |
| |${implementation_date} | | |${implementation_date} |
| |}]], | | |}]], |
| _flat_template = [[{|class="${table_class}" | | _flat_template = [[{|class="${table_class}" |
| |- | | |- |
− | !class="infobox-kai-header-major" colspan=4|${name} ${japanese_name} | + | !class="infobox-kai-header-major" colspan=4|${name}<div style="float:right;margin-right:5px">${edit_link}</div> |
| |- | | |- |
| !${voice_actor_header} | | !${voice_actor_header} |
Line 38: |
Line 39: |
| !${artist_header} | | !${artist_header} |
| |${artist} | | |${artist} |
− | !Implemented on | + | !Implementation |
| |${implementation_date} | | |${implementation_date} |
| |}]], | | |}]], |
| + | _ship_data_documentation = "Template:ShipDataDocumentation/EditIntro", |
| + | _edit_link_text = "Edit", |
| _voice_actor_header = "[[Glossary#List of Vessels by Japanese Voice Actresses|Seiyuu]]", | | _voice_actor_header = "[[Glossary#List of Vessels by Japanese Voice Actresses|Seiyuu]]", |
| _artist_header = "[[Glossary#List of Vessels by Artist|Artist]]", | | _artist_header = "[[Glossary#List of Vessels by Artist|Artist]]", |
| _class_template = "[[:Category:${ship_class}|${ship_class}]]", | | _class_template = "[[:Category:${ship_class}|${ship_class}]]", |
| + | _name_template = "${name} ${japanese_name}", |
| _person_template = "${name} (${japanese_name})", | | _person_template = "${name} (${japanese_name})", |
− | _normal_construction_label = "Normal", | + | _normal_construction_label = "[[Construction#Building_recipes|Normal]]", |
− | _large_ship_construction_label = "LSC", | + | _large_ship_construction_label = "[[Construction#Large_Ship_Construction_Recipe|LSC]]", |
| _buildable_label = "Construction", | | _buildable_label = "Construction", |
| _drop_label = "Drop", | | _drop_label = "Drop", |
| _details_template = " (${details})", | | _details_template = " (${details})", |
− | _event_reward_label = "Event Reward", | + | _event_reward_label = "[[Template:Event_Drop|Event Reward]]", |
− | _event_drop_label = "Event Drop", | + | _event_drop_label = "[[Template:Event_Drop|Event Drop]]", |
− | _node_name_template = "${world}-${map}-${node}", | + | _node_name_template = "${world}-${map} ${node}", |
| _node_formation_template = "-${formation}", | | _node_formation_template = "-${formation}", |
− | _event_node_name_template = "${year} ${quarter} E-${map}-${node}", | + | _event_node_name_template = "${year} ${quarter} E-${map} ${node}", |
| _event_map_name_template = "${year} ${quarter} E-${map}", | | _event_map_name_template = "${year} ${quarter} E-${map}", |
− | _date_template = "${year}-${month}-${day}", | + | _date_template = "${year}/${month:2}/${day:2}", |
| _all_nodes_symbol = "*", | | _all_nodes_symbol = "*", |
| _max_drops_before_collapsible = 6, | | _max_drops_before_collapsible = 6, |
Line 73: |
Line 77: |
| }, | | }, |
| _fields = { | | _fields = { |
| + | "edit_link", |
| "name", | | "name", |
| "class", | | "class", |
Line 86: |
Line 91: |
| _args = args, | | _args = args, |
| }:create_infobox() | | }:create_infobox() |
| + | end |
| + | |
| + | function ShipMetaKai:edit_link() |
| + | self._vars.edit_link = Formatting:format_edit_link(self._ship_data_module, self._edit_link_text, self._ship_data_documentation) |
| end | | end |
| | | |
| function ShipMetaKai:name() | | function ShipMetaKai:name() |
| self._vars.name = Formatting:format_stat(self._ship:name()) | | self._vars.name = Formatting:format_stat(self._ship:name()) |
− | self._vars.japanese_name = tostring(Formatting:japanese_text(Formatting:format_stat(self._ship:japanese_name()))) | + | local japanese_name = Formatting:format_stat(self._ship:japanese_name()) |
| + | if japanese_name ~= self._vars.name then |
| + | self._vars.name = format{self._name_template, name = self._vars.name, japanese_name = tostring(Formatting:japanese_text(japanese_name))} |
| + | end |
| end | | end |
| | | |
Line 119: |
Line 131: |
| return format{self._person_template, name = Formatting:format_external_link(person:link()), japanese_name = japanese_name} | | return format{self._person_template, name = Formatting:format_external_link(person:link()), japanese_name = japanese_name} |
| end | | end |
| + | |
| + | local custom_quest_links = { |
| + | ["5A05"] = "Partials/Updates/2018_April_23rd#5A05" |
| + | } |
| | | |
| function ShipMetaKai:availability() | | function ShipMetaKai:availability() |
Line 133: |
Line 149: |
| if buildable then | | if buildable then |
| table.insert(result, self._buildable_label .. format{self._details_template, details = table.concat(buildable, ", ")}) | | table.insert(result, self._buildable_label .. format{self._details_template, details = table.concat(buildable, ", ")}) |
| + | end |
| + | if availability and availability.quest then |
| + | table.insert(result, "Quest: " .. U.ijoin(U.imap(availability.quest, function(label) |
| + | return string.format("[[%s|%s]]", custom_quest_links[label] or string.format("Quests#%s", label), label) |
| + | end), ", ")) |
| end | | end |
| for _, method in ipairs(availability or {}) do | | for _, method in ipairs(availability or {}) do |
Line 168: |
Line 189: |
| end | | end |
| elseif method == "event_reward" then | | elseif method == "event_reward" then |
− | local details = {} | + | local details, current_event_details = {}, {} |
| if availability.event_reward then | | if availability.event_reward then |
| for _, map in ipairs(availability.event_reward) do | | for _, map in ipairs(availability.event_reward) do |
Line 176: |
Line 197: |
| end | | end |
| table.insert(details, map_name) | | table.insert(details, map_name) |
| + | if map[1] == 2016 and map[2] == 7 then |
| + | table.insert(current_event_details, map_name) |
| + | end |
| end | | end |
| end | | end |
− | if #details > 0 then | + | if #details > 0 and self._detailed_availability then |
| details = format{self._details_template, details = table.concat(details, ", ")} | | details = format{self._details_template, details = table.concat(details, ", ")} |
| + | elseif #current_event_details > 0 then |
| + | details = format{self._details_template, details = table.concat(current_event_details, ", ")} |
| else | | else |
| details = "" | | details = "" |
Line 185: |
Line 211: |
| table.insert(result, self._event_reward_label .. details) | | table.insert(result, self._event_reward_label .. details) |
| elseif method == "event_drop" then | | elseif method == "event_drop" then |
− | local details = {} | + | local details, current_event_details = {}, {} |
| if availability.event_drop then | | if availability.event_drop then |
| for _, drop in ipairs(availability.event_drop) do | | for _, drop in ipairs(availability.event_drop) do |
Line 201: |
Line 227: |
| node_name = node_name .. format{self._node_formation_template, formation = complex and drop[5][node] or drop[5]} | | node_name = node_name .. format{self._node_formation_template, formation = complex and drop[5][node] or drop[5]} |
| end | | end |
− | table.insert(details, node_name)
| + | table.insert(details, node_name) |
| + | if drop[1] == 2016 and drop[2] == 7 then |
| + | table.insert(current_event_details, map_name) |
| + | end |
| end | | end |
| end | | end |
| end | | end |
| local details_len = #details | | local details_len = #details |
− | if details_len > 0 then | + | if details_len > 0 and self._detailed_availability then |
| details = format{self._details_template, details = table.concat(details, ", ")} | | details = format{self._details_template, details = table.concat(details, ", ")} |
| if details_len > self._max_drops_before_collapsible then | | if details_len > self._max_drops_before_collapsible then |
Line 213: |
Line 242: |
| table.insert(result, self._event_drop_label .. details) | | table.insert(result, self._event_drop_label .. details) |
| end | | end |
| + | elseif #current_event_details > 0 then |
| + | current_event_details = format{self._details_template, details = table.concat(current_event_details, ", ")} |
| + | table.insert(result, self._event_drop_label .. current_event_details) |
| else | | else |
| table.insert(result, self._event_drop_label) | | table.insert(result, self._event_drop_label) |
Line 222: |
Line 254: |
| | | |
| function ShipMetaKai:implementation_date() | | function ShipMetaKai:implementation_date() |
− | local implementation_date = self._ship:implementation_date() | + | local form = self._ship |
− | if implementation_date then | + | local next_form = form._remodel_to |
− | self._vars.implementation_date = format{self._date_template, year = implementation_date[1], month = implementation_date[2], day = implementation_date[3]}
| + | local i = 1 |
− | else
| + | local data = {} |
− | self._vars.implementation_date = "??"
| + | local forms = {} |
| + | if form._implementation_date then |
| + | data[format{ |
| + | self._date_template, |
| + | year = form._implementation_date[1], |
| + | month = form._implementation_date[2], |
| + | day = form._implementation_date[3] |
| + | }] = { "Base" } |
| + | end |
| + | while next_form and not forms[next_form] and i < 10 do |
| + | forms[next_form] = true |
| + | form = Ship(next_form) |
| + | if form._implementation_date then |
| + | local d = format{ |
| + | self._date_template, |
| + | year = form._implementation_date[1], |
| + | month = form._implementation_date[2], |
| + | day = form._implementation_date[3] |
| + | } |
| + | local name = form:suffix() and form:suffix() ~= "" and form:suffix() or form:name() |
| + | data[d] = data[d] or {} |
| + | table.insert(data[d], name) |
| + | end |
| + | next_form = form._remodel_to |
| + | i = i + 1 |
| end | | end |
| + | local dates = U.isort(U.keys(data)) |
| + | self._vars.implementation_date = #dates == 0 and "??" or #dates == 1 and dates[1] or U.ijoin(U.imap(dates, function (d) |
| + | return string.format("%s (%s)", d, U.ijoin(data[d], ", ")) |
| + | end), "<br>") |
| end | | end |
| | | |
Line 264: |
Line 324: |
| self[field](self) | | self[field](self) |
| end | | end |
− | return format(self.args.flat and self._flat_template or self._template, self._vars) | + | return format(self._args.thin and self._template or self._flat_template, self._vars) |
| end | | end |
| | | |
Line 278: |
Line 338: |
| return self:format_template() | | return self:format_template() |
| end | | end |
| + | |
| + | function ShipMetaKai.test() |
| + | mw.log(ShipMetaKai:Infobox({ "Ayanami" })) |
| + | mw.log(ShipMetaKai:Infobox({ "U-511" })) |
| + | mw.log(ShipMetaKai:Infobox({ "Zuikaku" })) |
| + | end |
| + | -- p.test() |
| | | |
| return ShipMetaKai | | return ShipMetaKai |