Module:Adventurer

From Dragalia Lost Wiki
Revision as of 11:46, 25 November 2019 by >Caledor92 (use the new icon template for abilities as well)
Jump to navigation Jump to search
50px Documentation

Usage

This module is intended to back the rendering of more complicated Adventurer data-related templates. Currently it only supports the Template:Character info card template.

Example

Generally, this module should be called via the regular wikitext templates instead of directly. But here is example syntax for calling the functions from wikitext:

{{#invoke:Adventurer|infoCard|The Prince}}

Lua error: Error: Table Adventurers not found..

{{#invoke:Adventurer|infoCard|Name=Edward}}

Lua error: Error: Table Adventurers not found..


-- <includeonly> (prevents literal interpretation of links or categories within the module code)
-- Lua Templating for Adventurer related info.
local p = {}
local cargo = mw.ext.cargo

-- Usage: {{#invoke:Adventurer|infoCard|<name>}} or {{#invoke:Adventurer|infoCard|Name=<name>}}
-- Ex: {{#invoke:Adventurer|infoCard|Euden}} or {{#invoke:Adventurer|infoCard|Name=Elisanne}}
function p.infoCard(frame)
  local name = frame.args[1] or frame.args['Name']

  -- Query adventurer data
  local adv = getAdventurers({
    where = '_pageName="'..name..'"',
    groupBy = '_pageName',
    limit = 1
  })[1]
  if adv == nil then
    return ''
  end
  -- CoAbility
  local coability = getCoabilities({
    where = string.format('Id="%s"', adv['ExAbilityData1']),
    groupBy = '_pageName',
    limit = 1
  })[1]
  if coability then
    coability = coability['Name']
  end
  -- Abilities
  local abilityKeys = {'Abilities11', 'Abilities12', 'Abilities13', 'Abilities21', 'Abilities22', 'Abilities31', 'Abilities32'}
  local abilities = {}
  for i, key in ipairs(abilityKeys) do
    abilities[key] = '0'
    if adv[key] and adv[key] ~= '0' then
      local ability = getAbilities({
        where = string.format('Id="%s"', adv[key]),
        groupBy = '_pageName',
        limit = 1
      })[1]
      if ability then
        abilities[key] = ability['Name']
      end
    end
  end

  -- Precompute some template outputs
  -- Portrait Image
  local portraitFileName = string.format('%s 0%s r0%s portrait.png', adv['Id'], adv['VariationId'], adv['Rarity'])
  local portraitImage = mw.title.makeTitle('File', portraitFileName)
  if (portraitImage.exists) then
    portraitImage = string.format('[[File:%s|300px|link=%s]]', portraitFileName, name)
  else
    portraitImage = string.format('[[File:Unknown.png|300px|link=%s]]', name)
  end
  -- Description
  local mcPlusHp = adv['PlusHp0'] + adv['PlusHp1'] + adv['PlusHp2'] + adv['PlusHp3'] + adv['PlusHp4']
  local mcPlusAtk = adv['PlusAtk0'] + adv['PlusAtk1'] + adv['PlusAtk2'] + adv['PlusAtk3'] + adv['PlusAtk4']
  local description =
      termDescription({'Element', inlineIconAndDesc({'Icon Element', adv['ElementalType']}, adv['ElementalType'])})..
      termDescription({'Weapon', inlineIconAndDesc({'Icon Weapon', adv['WeaponType']}, adv['WeaponType'])})..
      maxStatsTooltip('HP', adv['MaxHp'], mcPlusHp, adv['McFullBonusHp5'])..
      maxStatsTooltip('Str', adv['MaxAtk'], mcPlusAtk, adv['McFullBonusAtk5'])..
      termDescription({'Class', '[[File:Icon Type Row '..adv['CharaType']..'.png|105px|link=]]'})..
      termDescription({'Base Rarity', '[[File:Icon Rarity Row '..adv['Rarity']..'.png|75px|link=]]'})..
      termDescription({'Obtained From', adv['Obtain']})
  -- Skills
  local skill1tooltip = frame:expandTemplate{title='SkillTooltip', args={adv['Skill1Name']}}
  local skill2tooltip = adv['Skill2Name'] == '' and '' or
      ', '..frame:expandTemplate{title='SkillTooltip', args={adv['Skill2Name']}}
  -- CoAbility
  local exData = {}
  for i = 1,5 do exData[i] = adv['ExAbilityData'..i] end
  local coability = frame:expandTemplate{title='CoAbilityIconTooltip', args=exData}

  -- Abilities
  local ability1 = abilityIconTooltip({abilities['Abilities11'], abilities['Abilities12'], abilities['Abilities13']})
  local ability2 = abilities['Abilities21'] == '0' and '' or
      ', '..abilityIconTooltip({abilities['Abilities21'], abilities['Abilities22']})
  local ability3 = abilities['Abilities31'] == '0' and '' or
      ', '..abilityIconTooltip({abilities['Abilities31'], abilities['Abilities32']})

  -- Format the content
  local card = mw.html.create('div'):addClass('panel'):css('display','inline-block')
    :tag('div'):addClass('panel-heading')
      :wikitext('[['..name..']]')
      :done()
    :tag('div'):addClass('panel-body'):cssText('display:flex;flex-wrap:wrap;justify-content:center;')
      :tag('div')
        :wikitext(portraitImage)
        :done()
      :tag('div'):cssText('display:flex;flex-direction:column')
        :tag('div')
          :wikitext(description)
          :done()
        :tag('hr'):cssText('margin:1em')
          :done()
        :tag('div'):cssText('width:360px')
          :tag('div')
            :wikitext("'''Skills''': ")
            :tag('div'):cssText('display:inline-block')
              :wikitext(skill1tooltip..skill2tooltip)
              :done()
            :done()
          :tag('div')
            :wikitext("'''Co-Ability''': ")
            :tag('div'):cssText('display:inline-block')
              :wikitext(coability)
              :done()
            :done()
          :tag('div')
            :wikitext("'''Abilities''': ")
            :tag('div'):cssText('display:inline-block')
              :wikitext(ability1..ability2..ability3)
              :done()
    :allDone()
  return tostring(card)
end

-- Common templating functions

function termDescription(args)
  local frame = mw.getCurrentFrame()
  return frame:expandTemplate{title='TermDescription', args=args}
end

function inlineIconAndDesc(args, desc)
  local frame = mw.getCurrentFrame()
  return string.format('%s %s', frame:expandTemplate{title='InlineIcon', args=args}, desc)
end

function abilityIconTooltip(abilities)
  local frame = mw.getCurrentFrame()
  return frame:expandTemplate{title='AbilityIconTooltip', args=abilities}
end

function maxStatsTooltip(statType, max, mcPlus, mcFullBonus)
  local frame = mw.getCurrentFrame()
  local total = max + mcPlus + mcFullBonus
  return frame:expandTemplate{title='TermDescriptionTooltip', args={
      frame:expandTemplate{title='Tooltip', args={
          'Total Max '..statType, '5★ Max '..statType..' with All Mana Circle Nodes and Bonus'}},
      string.format('%s (%s + %s + %s)', total, max, mcPlus, mcFullBonus),
      'Total (5★ Max + Mana Circle Node Stats + Mana Circle Bonus)'}}
end

-- Common querying functions

function getAdventurers(queryArgs)
  local tables = 'Adventurers'
  local queryFields = 'Id,VariationId,CharaType,Rarity,ElementalType,WeaponType,MinHp3,MinHp4,MinHp5,MaxHp,PlusHp0,PlusHp1,PlusHp2,PlusHp3,PlusHp4,McFullBonusHp5,MinAtk3,MinAtk4,MinAtk5,MaxAtk,PlusAtk0,PlusAtk1,PlusAtk2,PlusAtk3,PlusAtk4,McFullBonusAtk5,Obtain,ExAbilityData1,ExAbilityData2,ExAbilityData3,ExAbilityData4,ExAbilityData5,Skill1Name,Skill2Name,Abilities11,Abilities12,Abilities13,Abilities21,Abilities22,Abilities31,Abilities32'
  return cargo.query(tables, queryFields, queryArgs)
end

function getCoabilities(queryArgs)
  local tables = 'CoAbilities'
  local queryFields = 'Name'
  return cargo.query(tables, queryFields, queryArgs)
end

function getAbilities(queryArgs)
  local tables = 'Abilities'
  local queryFields = 'Name'
  return cargo.query(tables, queryFields, queryArgs)
end

return p
--</includeonly>