Module:Adventure Mode

From Zelda Dungeon Wiki
Revision as of 02:30, August 18, 2020 by Locke (talk | contribs) (Generates interactive maps for HW Adventure Mode)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
Want an adless experience? Log in or Create an account.

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

local Args = require( 'Module:Args' )
local Tabs = require( 'Module:Tabs' )

local COLS = 'ABCDEFGHIJKLMNOP'

function buildMapTable( mapName, selection )
  local table = mw.html.create( 'table' )
    :addClass( 'zdw-tabset' )
    :attr( 'data-tab-target', mapName:gsub( '%s', '' ) )
  for rowNum = 1, 8 do
    local row = table:tag( 'tr' )
    rowNum = tostring( 9 - rowNum ) -- reverse so that top row is 8, bottom row is 1
    for colNum in COLS:gmatch( '.' ) do
      local coord = colNum .. rowNum
      row:tag( 'td' )
        :addClass( 'zdw-tab' )
        :attr( 'data-tab-selection', coord )
        :wikitext( '[[File:Hyrule Warriors ' .. mapName .. ' ' .. coord .. (selection == 'Map' and '' or (' ' .. selection)) .. '.png|link=]]' )
    end
  end

  return table
end

function buildContent( mapName )
  local container = mw.html.create( 'div' )
    :attr( 'id', mapName:gsub( '%s', '' ) )
  local frame = mw.getCurrentFrame()

  for rowNum = 1, 8 do
    for colNum in COLS:gmatch( '.' ) do
      local coord = colNum .. tostring( rowNum )
      local title = mapName .. '/' .. coord
      local pageExists, pageContent = pcall( function() frame:expandTemplate{ title = title, args = {} } end )
      container:tag( 'div' )
        :addClass( 'zdw-tabcontent' )
        :attr( 'data-tab-content', coord )
        :wikitext( pageExists and pageContent or '[[' .. title .. ']]'  )
    end
  end

  return container
end

local p = {}

function p.main( frame )
  local args = Args.fromFrame( frame )

  local mapTabs = Tabs.Tabs.new{
    width = 640
  }
  local tabSet = mapTabs:topTabs{}

  local tabs = { 'Map', 'Items', 'Fairies', 'Hearts', 'Gold Skulltulas' }
  for _, selection in ipairs( tabs ) do
    tabSet:addTab{ selection = selection }
    mapTabs:addContent{ selection = selection, content = tostring( buildMapTable( args[1], selection ) ) }
  end

  return mapTabs:render() .. tostring( buildContent( args[1] ) )
end

-- for use in the debug console:
-- =p.main(p.debugframe)
p.debugframe = {
  args = {},
  getParent = function() return {
    args = {
      [1] = "Adventure Map"
    }
  } end
}

return p