• Welcome to the Kancolle Wiki!
  • If you have any questions regarding site content, account registration, etc., please visit the KanColle Wiki Discord

Difference between revisions of "Module:NanaminFleet"

From Kancolle Wiki
Jump to navigation Jump to search
m
m
Line 11: Line 11:
 
     _equip_bg = "whitesmoke",
 
     _equip_bg = "whitesmoke",
 
     _header_template = nil,
 
     _header_template = nil,
 +
    _calculated_cell_template = [[| colspan="4" style="background: whitesmoke;" |Effective Line of Sight: ${elos} / Fighter Power: ${fighter_power}]],
 
     _column_cell_templates = {
 
     _column_cell_templates = {
 
         ship = [[| rowspan="4" style="background: transparent;" |${values.ship_card}]],
 
         ship = [[| rowspan="4" style="background: transparent;" |${values.ship_card}]],
Line 26: Line 27:
 
     },
 
     },
 
     _blank = "Empty_ship_slot.png",
 
     _blank = "Empty_ship_slot.png",
     _default_size = "120x165px"
+
     _default_size = "120x165px",
 +
    _elos = 0,
 +
    _fighter_power = 0
 
})
 
})
  
Line 83: Line 86:
 
function NanaminFleet:create_items()
 
function NanaminFleet:create_items()
 
     local row1, row2, row3, row4 = {}, {}, {}, {}
 
     local row1, row2, row3, row4 = {}, {}, {}, {}
 +
    local los, fighter_power = 0, 0
 
     for index, item_key in ipairs(self._args) do
 
     for index, item_key in ipairs(self._args) do
 
         local item
 
         local item
Line 93: Line 97:
 
             else
 
             else
 
                 item = self._equip_class(self:process_item_key(item_key))
 
                 item = self._equip_class(self:process_item_key(item_key))
 +
               
 +
                --Calculate the effective LoS and fighter power
 +
                --[[Effective LoS = Dive Bomber LoS x (1.04) + Torpedo Bomber LoS x (1.37)
 +
                + Carrier-based Recon Plane LoS x (1.66) + Recon Seaplane LoS x (2.00)
 +
                + Seaplane Bomber LoS x (1.78) + Small Radar LoS x (1.00) + Large Radar LoS x (0.99)
 +
                + Searchlight LoS x (0.91) + √(base LoS of each ship) x (1.69)
 +
                + (HQ Lv. rounded up to the next multiple of 5) x (-0.61)--]]
 +
                local slot_number = (index - 1) % 5
 +
                local multiplier = {
 +
                    [7] = 1.04,
 +
                    [8] = 1.04,
 +
                    [9] = 1.66,
 +
                    [10] = 2.00,
 +
                    [11] = 1.78,
 +
                    [12] = 1.00,
 +
                    [13] = 0.99,
 +
                    [29] = 0.91
 +
                }
 +
                if multiplier[item:type()] ~= nil then
 +
                    los = los + (item:los() * multiplier[item:type()])
 +
                end
 +
                fighter_power = fighter_power + math.floor(math.sqrt(select(2, item:slot(slot_number))))
 
             end
 
             end
 
         end
 
         end
Line 118: Line 144:
 
         end
 
         end
 
     end
 
     end
 +
    table.insert(self._items, "extra")
 +
    self._elos = los
 +
    self._fighter_power = fighter_power
 
end
 
end
  
Line 134: Line 163:
 
         table.insert(self._data_rows, row_values)
 
         table.insert(self._data_rows, row_values)
 
     end
 
     end
 +
end
 +
 +
function NanaminFleet:build_rows()
 +
for index, row_values in ipairs(self._data_rows) do
 +
if row_values ~= "break" and row_values ~= "extra" then
 +
table.insert(self._rows, self._row_starter)
 +
if row_values == "header" then
 +
table.insert(self._rows, self._header)
 +
elseif type(row_values) == "table" then
 +
for _, column in ipairs(self._columns) do
 +
if row_values[column] then
 +
table.insert(self._rows, format(self._column_cell_templates[column] or self._cell, row_values[column]))
 +
end
 +
end
 +
else
 +
table.insert(self._rows,
 +
format{self._cell,
 +
colspan = #self._columns, rowspan = 1,
 +
text_align = self._args[self._custom_row_prefix .. row_values .. self._text_align_suffix] or self._start_align,
 +
bg_color = self._args[self._custom_row_prefix .. row_values .. self._bg_color_suffix] or self._transparent,
 +
values = {
 +
value = self._args[self._custom_row_prefix .. row_values .. self._content_suffix] or "",
 +
},
 +
}
 +
)
 +
    end
 +
        elseif row_values == "extra" then
 +
            table.insert(self._rows, format{self._calculated_cell_template,
 +
                elos = self._elos,
 +
                fighter_power = self._fighter_power
 +
            })
 +
end
 +
end
 
end
 
end
  
 
return NanaminFleet
 
return NanaminFleet

Revision as of 05:07, 9 April 2015

Documentation for this module may be created at Module:NanaminFleet/doc

local BaseTable = require('Module:BaseTable')
local Ship = require('Module:Ship')
local ShipCardKai = require('Module:ShipCardKai')
local Equipment = require('Module:Equipment')
local Formatting = require('Module:Formatting')
local format = require('Module:StringInterpolation').format

local NanaminFleet = BaseTable({
    _item_class = Ship,
    _equip_class = Equipment,
    _equip_bg = "whitesmoke",
    _header_template = nil,
    _calculated_cell_template = [[| colspan="4" style="background: whitesmoke;" |Effective Line of Sight: ${elos} / Fighter Power: ${fighter_power}]],
    _column_cell_templates = {
        ship = [[| rowspan="4" style="background: transparent;" |${values.ship_card}]],
        equips = [[| style="background: whitesmoke; width: 15px;" |${values.equip_icon}
        | style="background: whitesmoke; width: 175px; font-size: 5px; text-align: center;" |${values.equip_link}]],
        ship2 = [[| rowspan="4" style="background: transparent;" |${values.ship_card}]],
        equips2 = [[| style="background: whitesmoke; width: 15px;" |${values.equip_icon}
        | style="background: whitesmoke; width: 175px; font-size: 5px; text-align: center;" |${values.equip_link}]]
    },
    _columns = {
        "ship",
        "equips",
        "ship2",
        "equips2"
    },
    _blank = "Empty_ship_slot.png",
    _default_size = "120x165px",
    _elos = 0,
    _fighter_power = 0
})

function NanaminFleet:create_table_prep()
    self._size = self._args.image_size or self._default_size
end

function NanaminFleet:ship(row)
    local value
    if row[1] == nil or row[1] == "break" then
        return false
    elseif row[1] == false then
        value = Formatting:format_image{self._blank, size = self._size}
    else
        value = ShipCardKai:card{ship = row[1], size = self._size, link = row[1]:link(), caption = row[1]:name()}
    end
    return {values = {ship_card = value}, bg_color = self._transparent, text_align = self._center_align}
end

function NanaminFleet:ship2(row)
    row = {row[3], row[4]}
    return self:ship(row)
end

function NanaminFleet:equips(row)
    local value, icon
    if row[2] == false then
        value = "- Unequipped -"
        icon = ""
    else
        value = Formatting:format_link(row[2]:link())
        icon = Formatting:format_image{Formatting:format_equipment_icon(row[2]:icon()), size = "22x22px"}
    end
    return {values = {equip_link = value, equip_icon = icon}, bg_color = self._equip_bg, text_align = self._center_align}
end

function NanaminFleet:equips2(row)
    row = {row[3], row[4]}
    return self:equips(row)
end

function NanaminFleet:process_item_key(item_key)
    local split = mw.ustring.find(item_key, '/')
    if split == nil then
        return item_key
    else
        ship_name = mw.ustring.sub(item_key, 1, split - 1)
        ship_suffix = mw.ustring.sub(item_key, split + 1, -1)
        if ship_suffix == "Regular" then
            ship_suffix = nil
        end
        return ship_name, ship_suffix
    end
end

function NanaminFleet:create_items()
    local row1, row2, row3, row4 = {}, {}, {}, {}
    local los, fighter_power = 0, 0
    for index, item_key in ipairs(self._args) do
        local item
        
        if item_key == "-" then
            item = false
        else
            if mw.ustring.find(item_key, '/') then
                item = self._item_class(self:process_item_key(item_key))
            else
                item = self._equip_class(self:process_item_key(item_key))
                
                --Calculate the effective LoS and fighter power
                --[[Effective LoS = Dive Bomber LoS x (1.04) + Torpedo Bomber LoS x (1.37)
                + Carrier-based Recon Plane LoS x (1.66) + Recon Seaplane LoS x (2.00)
                + Seaplane Bomber LoS x (1.78) + Small Radar LoS x (1.00) + Large Radar LoS x (0.99)
                + Searchlight LoS x (0.91) + √(base LoS of each ship) x (1.69)
                + (HQ Lv. rounded up to the next multiple of 5) x (-0.61)--]]
                local slot_number = (index - 1) % 5
                local multiplier = {
                    [7] = 1.04,
                    [8] = 1.04,
                    [9] = 1.66,
                    [10] = 2.00,
                    [11] = 1.78,
                    [12] = 1.00,
                    [13] = 0.99,
                    [29] = 0.91
                }
                if multiplier[item:type()] ~= nil then
                    los = los + (item:los() * multiplier[item:type()])
                end
                fighter_power = fighter_power + math.floor(math.sqrt(select(2, item:slot(slot_number))))
            end
        end
        
        local row_number = {1, 1, 2, 3, 4, 1, 1, 2, 3, 4}
        if row_number[index % 10] == 1 then
            table.insert(row1, item)
        elseif row_number[index % 10] == 2 then
            table.insert(row2, "break")
            table.insert(row2, item)
        elseif row_number[index % 10] == 3 then
            table.insert(row3, "break")
            table.insert(row3, item)
        else
            table.insert(row4, "break")
            table.insert(row4, item)
        end
        
        if index % 10 == 0 then
            table.insert(self._items, row1)
            table.insert(self._items, row2)
            table.insert(self._items, row3)
            table.insert(self._items, row4)
            row1, row2, row3, row4 = {}, {}, {}, {}
        end
    end
    table.insert(self._items, "extra")
    self._elos = los
    self._fighter_power = fighter_power
end


function NanaminFleet:create_data_rows()
    for _, item in ipairs(self._items) do
        local row_values = {}
        for _, column in ipairs(self._columns) do
            local value = self[column](self, item)
            if value then
                row_values[column] = value
                row_values[column].rowspan = item.class ~= nil and 4 or 1
                row_values[column].colspan = 1
            end
        end
        table.insert(self._data_rows, row_values)
    end
end

function NanaminFleet:build_rows()
	for index, row_values in ipairs(self._data_rows) do
		if row_values ~= "break" and row_values ~= "extra" then
			table.insert(self._rows, self._row_starter)
			if row_values == "header" then
				table.insert(self._rows, self._header)
			elseif type(row_values) == "table" then
				for _, column in ipairs(self._columns) do
					if row_values[column] then
						table.insert(self._rows, format(self._column_cell_templates[column] or self._cell, row_values[column]))
					end
				end
			else
				table.insert(self._rows, 
					format{self._cell, 
						colspan = #self._columns, rowspan = 1, 
						text_align = self._args[self._custom_row_prefix .. row_values .. self._text_align_suffix] or self._start_align, 
						bg_color = self._args[self._custom_row_prefix .. row_values .. self._bg_color_suffix] or self._transparent,
						values = {
							value = self._args[self._custom_row_prefix .. row_values .. self._content_suffix] or "",
						},
					}
				)
		    end
        elseif row_values == "extra" then
            table.insert(self._rows, format{self._calculated_cell_template,
                elos = self._elos,
                fighter_power = self._fighter_power
            })
		end
	end
end

return NanaminFleet