Line 1: |
Line 1: |
− | -- Example how to not write modules.
| + | local U = require('Module:Core') |
− | | + | local getArgs = require('Module:GetArgs') |
− | local _ = require('Module:Core') | + | local Ship = require('Module:Ship') |
− | local JSON = require('Module:Core/JSON') | + | local Equipment = require('Module:Equipment') |
− | local loadData = require('Module:Data').load
| |
− | | |
− | local ShipBattleCardKai = require('Module:ShipBattleCardKai')
| |
− | local EquipmentCardKai = require('Module:EquipmentCardKai')
| |
− | local ShipsByApiId = require('Module:Collection/ShipsByApiId') | |
− | local EquipmentByApiId = require('Module:Collection/EquipmentByApiId') | |
| | | |
| local function getShipCard(ship) | | local function getShipCard(ship) |
− | return "[[" .. ship .. "]]"
| + | local s = Ship(ship) |
| + | -- local i = s:id() or s:true_id() |
| + | -- local is = i and (i < 10 and '00' .. i or i < 100 and '0' .. i or i) or '?' |
| + | return '[[File:Ship Banner ' .. s:name() .. '.png|160px|link=' .. s:base_name() .. ']]<br>[[' .. s:base_name() .. '|' .. s:name() .. ']]' |
| end | | end |
| | | |
| local function getEquipmentCard(eq) | | local function getEquipmentCard(eq) |
− | return "[[" .. eq .. "]]"
| + | local e = Equipment(eq) |
| + | return '[[File:Equipment Card ' .. e:name():gsub("/", " ") .. '.png|100px|link=' .. e:name() .. ']]' |
| + | end |
| + | |
| + | local function getFleetName(fleet, event) |
| + | local names = require('Module:FleetNames')[event] or {} |
| + | if names == 'flagship' then |
| + | return Ship(fleet[1].ship):base_name() .. ' FS' |
| + | elseif names[1] then |
| + | for _, f in ipairs(names) do |
| + | for i, ship in ipairs(f.ships) do |
| + | for j, e in ipairs(fleet) do |
| + | if f.flagship then |
| + | if i == 1 and j == 1 and string.sub(e.ship, 1, string.len(ship)) == ship then |
| + | return f.name |
| + | end |
| + | else |
| + | if string.sub(e.ship, 1, string.len(ship)) == ship then |
| + | return f.name |
| + | end |
| + | end |
| + | end |
| + | end |
| + | end |
| + | else |
| + | for name, ships in pairs(names) do |
| + | for _, ship in ipairs(ships) do |
| + | for _, e in ipairs(fleet) do |
| + | if string.sub(e.ship, 1, string.len(ship)) == ship then |
| + | return name |
| + | end |
| + | end |
| + | end |
| + | end |
| + | end |
| + | return 'Unassorted' |
| end | | end |
| | | |
− | local function fromModule(name) | + | local function formatHp(hps, maxHp) |
− | local result = '' | + | local minHp = U.imin(hps) |
| + | if minHp / maxHp <= 0.5 then |
| + | return string.format('{{color|red|{{tooltip|~/%s|%s}}}}', maxHp, U.ijoin(hps, ', ')) |
| + | elseif minHp / maxHp <= 0.75 then |
| + | return string.format('{{color|coral|{{tooltip|~/%s|%s}}}}', maxHp, U.ijoin(hps, ', ')) |
| + | else |
| + | return string.format('{{tooltip|~/%s|%s}}', maxHp, U.ijoin(hps, ', ')) |
| + | end |
| + | end |
| | | |
− | return result | + | local function formatVoice(e) |
| + | if type(e.voice) == 'number' and e.voice < 10 then |
| + | return string.format('{{audio|file=Ship Voice %s Spring 2019 Event Friend Fleet %s.mp3}}', e.ship, e.voice) |
| + | else |
| + | return string.format('{{audio|file=Ship Voice %s %s.mp3}}', e.ship, e.voice) |
| + | end |
| end | | end |
| | | |
− | local tableHeaderFriend = [=[{|class="wikitable" style="text-align:center" | + | local tableStart = |
| + | [=[{|class="wikitable mw-collapsible mw-collapsed" style="text-align:center;min-width:700px" |
| + | |- |
| + | !colspan="11"|%s]=] |
| + | |
| + | local tableHeader = [=[|- |
| !Ship | | !Ship |
| !Lv. | | !Lv. |
− | !colspan="4"|Equipment | + | !Equipment |
| ![[File:Icon HP.png]] | | ![[File:Icon HP.png]] |
| ![[File:Icon Gun.png]] | | ![[File:Icon Gun.png]] |
Line 34: |
Line 84: |
| ![[File:Icon Armor.png]]]=] | | ![[File:Icon Armor.png]]]=] |
| | | |
− | local tableHeaderSimple = [=[{|class="wikitable" style="text-align:center" | + | local function render(args) |
− | !Ship
| + | local success, data = U.requireModule('Data/FriendFleet/' .. args.friend) |
− | !colspan="4"|Equipment
| |
− | ]=]
| |
− | | |
− | -- [[Category:Todo]]: need something better here
| |
− | local friendTypes = require('Module:Fleets/Names')
| |
− | | |
− | local function getFleetType(fleet, event)
| |
− | local names = friendTypes[event] or {}
| |
− | if names[1] then
| |
− | for i, o in ipairs(names) do
| |
− | for i, ship in ipairs(o.ships) do
| |
− | if _.ifindBy(fleet, function (e) return _.startsWith(e.ship, ship) end) then
| |
− | return o.name
| |
− | end
| |
− | end
| |
− | end
| |
− | else
| |
− | for name, ships in pairs(names) do
| |
− | for i, ship in ipairs(ships) do
| |
− | if _.ifindBy(fleet, function (e) return _.startsWith(e.ship, ship) end) then
| |
− | return name
| |
− | end
| |
− | end
| |
− | end
| |
− | end
| |
− | return 'Unassorted'
| |
− | end
| |
− | | |
− | local function formatHp(hps, maxHp)
| |
− | return string.format(
| |
− | '<span class="explain" title="%s">~/%s</span>',
| |
− | _.ijoin(hps, ', '),
| |
− | maxHp
| |
− | )
| |
− | end
| |
− | | |
− | local function renderFriend(args, frame)
| |
− | -- local data = loadData('Fleet/Friend/' .. args.friend)
| |
− | local success, data = _.requireModule('Data/Fleet/Friend/' .. args.friend) | |
| if not success then | | if not success then |
| return "''No data''" | | return "''No data''" |
| end | | end |
− | local groups = {}
| + | local groups = {} |
− | for i, e in pairs(data) do
| + | for _, e in pairs(data) do |
− | if not args.map or _.ifind(e.maps, args.map) then
| + | if not args.map and not args.node or U.ifind(e.maps, args.map) or U.ifind(e.notes, args.node) then |
− | local fleetType = getFleetType(e.fleet, args.friend)
| + | local fleetType = getFleetName(e.fleet, args.friend) |
− | groups[fleetType] = groups[fleetType] or {}
| + | groups[fleetType] = groups[fleetType] or {} |
− | table.insert(groups[fleetType], e)
| + | table.insert(groups[fleetType], e) |
− | end
| |
| end | | end |
− | local result = {}
| + | end |
− | table.insert(result, '{{#tag:tabber|')
| + | local result = {} |
− | for i, fleetType in ipairs(_.isort(_.keys(groups))) do
| + | local first = true |
− | local fleets = groups[fleetType]
| + | for _, fleetType in ipairs(U.isort(U.keys(groups))) do |
− | table.sort(fleets, function(a, b)
| + | local fleets = groups[fleetType] |
− | local l1 = table.getn(a.fleet)
| + | table.sort( |
− | local l2 = table.getn(b.fleet)
| + | fleets, |
− | local ships1 = _.ijoin(_.imap(a.fleet, function (e) return e.ship end), ', ')
| + | function(a, b) |
− | local ships2 = _.ijoin(_.imap(b.fleet, function (e) return e.ship end), ', ') | + | local l1 = table.getn(a.fleet) |
− | if ships1 == ships2 then
| + | local l2 = table.getn(b.fleet) |
− | return l1 < l2
| + | local ships1 = |
| + | U.ijoin( |
| + | U.imap( |
| + | a.fleet, |
| + | function(e) |
| + | return e.ship |
| end | | end |
− | return ships1 < ships2
| + | ), |
− | end)
| + | ', ' |
− | table.insert(result, string.format('{{!}}-{{!}} %s =', fleetType))
| + | ) |
− | table.insert(result, '<tabber>') | + | local ships2 = |
− | for i, fleet in ipairs(fleets) do | + | U.ijoin( |
− | table.insert(result, string.format('|-| %s =', 'Variant ' .. i))
| + | U.imap( |
− | if table.getn(fleet.notes) > 0 then
| + | b.fleet, |
− | table.insert(result, _.ijoin(fleet.notes, '<br>'))
| + | function(e) |
− | end
| + | return e.ship |
− | table.insert(result, tableHeaderFriend)
| |
− | for j, ship in ipairs(fleet.fleet) do | |
− | table.insert(result, string.format(
| |
− | '|-\n|%s||%s||%s||%s||%s||%s||%s||%s||%s||%s||%s',
| |
− | getShipCard(ship.ship),
| |
− | ship.level,
| |
− | ship.equipment[1] and getEquipmentCard(ship.equipment[1]) or 'style="background:grey;width:100px"| ',
| |
− | ship.equipment[2] and getEquipmentCard(ship.equipment[2]) or 'style="background:grey;width:100px"| ',
| |
− | ship.equipment[3] and getEquipmentCard(ship.equipment[3]) or 'style="background:grey;width:100px"| ',
| |
− | ship.equipment[4] and getEquipmentCard(ship.equipment[4]) or 'style="background:grey;width:100px"| ',
| |
− | type(ship.hp) == 'table' and formatHp(ship.hp, ship.maxHp) or ship.hp ~= ship.maxHp and string.format('%s/%s', ship.hp, ship.maxHp) or ship.maxHp,
| |
− | ship.firepower,
| |
− | ship.torpedo,
| |
− | ship.aa,
| |
− | ship.armor
| |
− | ))
| |
− | end
| |
− | table.insert(result, '|}') | |
− | end
| |
− | table.insert(result, '</tabber>')
| |
− | end
| |
− | table.insert(result, '}}')
| |
− | return table.concat(result, '\n')
| |
− | end
| |
− | | |
− | local function render(args, frame)
| |
− | if args.friend then
| |
− | return renderFriend(args, frame)
| |
− | end
| |
− | local result = {}
| |
− | local firstCell = true
| |
− | local openTab = false
| |
− | local openSubtab = false
| |
− | for _, arg in ipairs(args) do
| |
− | if arg:sub(0, 2) == '!!' then
| |
− | if openSubtab then
| |
− | table.insert(result, string.format('|}\n|-| %s =\n' .. tableHeaderSimple, arg:sub(3)))
| |
− | else
| |
− | table.insert(result, string.format('<tabber>\n|-| %s =\n' .. tableHeaderSimple, arg:sub(3)))
| |
− | openSubtab = true
| |
− | end
| |
− | elseif arg:sub(0, 1) == '!' then
| |
− | if openSubtab then
| |
− | table.insert(result, '|}\n</tabber>')
| |
− | openSubtab = false
| |
− | end
| |
− | if openTab then
| |
− | table.insert(result, string.format('{{!}}-{{!}} %s =', arg:sub(2)))
| |
− | else
| |
− | table.insert(result, string.format('{{#tag:tabber|\n{{!}}-{{!}} %s =', arg:sub(2)))
| |
− | openTab = true
| |
− | end
| |
− | elseif arg:sub(0, 1) == '~' then
| |
− | table.insert(result, fromModule(arg:sub(2)))
| |
− | elseif arg == '-' then
| |
− | table.insert(result, '|-')
| |
− | firstCell = true
| |
− | else
| |
− | if firstCell then
| |
− | table.insert(result, '|' .. getShipCard(arg))
| |
− | firstCell = false
| |
− | else
| |
− | table.insert(result, '|' .. getEquipmentCard(arg))
| |
| end | | end |
| + | ), |
| + | ', ' |
| + | ) |
| + | if ships1 == ships2 then |
| + | return l1 < l2 |
| end | | end |
| + | return ships1 < ships2 |
| + | end |
| + | ) |
| + | for i, fleet in ipairs(fleets) do |
| + | if first then |
| + | table.insert(result, string.format(tableStart, U.ijoin(fleet.notes, ', '))) |
| + | first = false |
| + | end |
| + | local fleetNote = U.ijoin(fleet.notes, ', ') .. ' : ' ..fleetType .. ' (Variant ' .. i .. ', ' .. (fleet.date or '??') .. '~)' |
| + | if fleet.f2p and fleet.f2p > 0 then |
| + | fleetNote = fleetNote .. " '''{{color|green|{{tooltip|Regular|" .. fleet.f2p .. " samples}}}}'''" |
| + | end |
| + | if fleet.p2w and fleet.p2w > 0 then |
| + | fleetNote = fleetNote .. " '''{{color|red|{{tooltip|Powerful|" .. fleet.p2w .. " samples}}}}'''" |
| + | end |
| + | if table.getn(fleet.voices or {}) > 0 then |
| + | fleetNote = fleetNote .. ' ' .. U.ijoin(U.imap(fleet.voices, formatVoice), ' ') |
| + | end |
| + | table.insert(result, string.format('|-\n!colspan="11"|%s', fleetNote)) |
| + | table.insert(result, tableHeader) |
| + | for _, ship in ipairs(fleet.fleet) do |
| + | table.insert( |
| + | result, |
| + | string.format( |
| + | '|-\n|%s||%s||style="text-align:left;white-space:nowrap"|%s%s%s%s%s%s||%s||%s||%s||%s||%s', |
| + | getShipCard(ship.ship), |
| + | ship.level, |
| + | ship.equipment[1] and getEquipmentCard(ship.equipment[1]) or '', |
| + | ship.equipment[2] and getEquipmentCard(ship.equipment[2]) or '', |
| + | ship.equipment[3] and getEquipmentCard(ship.equipment[3]) or '', |
| + | ship.equipment[4] and getEquipmentCard(ship.equipment[4]) or '', |
| + | ship.equipment[5] and getEquipmentCard(ship.equipment[5]) or '', |
| + | ship.extraSlot and string.format('<span style="display:inline-block;border-radius:10px;border:5px solid steelblue">%s</span>', getEquipmentCard(ship.extraSlot)) or '', |
| + | type(ship.hp) == 'table' and formatHp(ship.hp, ship.maxHp) or ship.hp ~= ship.maxHp and string.format('%s/%s', ship.hp, ship.maxHp) or |
| + | ship.maxHp, |
| + | ship.firepower, |
| + | ship.torpedo, |
| + | ship.aa, |
| + | ship.armor |
| + | ) |
| + | ) |
| + | end |
| end | | end |
− | if openSubtab then
| + | end |
− | table.insert(result, '|}\n</tabber>')
| + | table.insert(result, '|}') |
− | openSubtab = false
| + | return table.concat(result, '\n') |
− | end
| |
− | if openTab then
| |
− | table.insert(result, '}}')
| |
− | openTab = false
| |
− | end
| |
− | return table.concat(result, '\n')
| |
| end | | end |
− |
| |
− | local getArgs = require('Module:GetArgs')
| |
| | | |
| return { | | return { |
− | render = function(frame)
| + | render = function(frame) |
− | return frame:preprocess(render(getArgs{ frame = frame:getParent() }))
| + | return frame:preprocess(render(getArgs {frame = frame:getParent()})) |
− | end,
| + | end |
− | test1 = render({
| |
− | '!1 DD',
| |
− | '!!Example 1',
| |
− | '-', '1', 'Type 3 Active Sonar',
| |
− | '!!Example 2',
| |
− | '-', 'Yuudachi/Kai Ni', '282', '282',
| |
− | '!2 DD',
| |
− | '!!Example 1',
| |
− | '-', 'Yuudachi/Kai Ni', 'Type 3 Active Sonar',
| |
− | '-', 'Shigure/Kai Ni', 'Type 3 Active Sonar',
| |
− | '!!Example 2',
| |
− | '-', 'Yuudachi/Kai Ni', 'Type 3 Active Sonar', 'Type 3 Active Sonar',
| |
− | '-', 'Shigure/Kai Ni', 'Type 3 Active Sonar', 'Type 3 Active Sonar',
| |
− | }),
| |
− | test2 = render({
| |
− | friend = 'Early Fall 2018 Event',
| |
− | }),
| |
− | test3 = render({
| |
− | friend = 'Early Fall 2018 Event',
| |
− | map = 'E-5',
| |
− | }),
| |
| } | | } |
− |
| |
− | -- print(p.test1)
| |
− | -- print(p.test2)
| |
− | -- print(p.test3)
| |