Módulo:TamingTable
Ir para navegação
Ir para pesquisar
A documentação para este módulo pode ser criada em Módulo:TamingTable/doc
local p = {}
function p.creature( f )
local dlclink = require('Module:DLCLink').link
local args = f:getParent().args
local levels = {}
local creature = args[1]
-- if creature was not given, take it from PAGENAME
if creature == nil then
creature = f.args[1]
end
-- define the rate at which creatures are tamed
-- a value of 1 represents ARK when it was first launched in early access
local tamingSpeedMultiplier = 2
local creatureData = mw.loadData( 'Module:TamingTable/creatures' )
if creatureData[creature] ~= nil then
for i, level in ipairs(args) do
if i ~= 1 then
table.insert(levels,level)
end
end
if table.getn(levels) == 0 then
levels = {1,30,60,90,120,150}
end
local foodData = mw.loadData( 'Module:TamingTable/food' )
local tables = {}
-- initialize taming variables
local affinityNeeded, totalTorpor, torporDeplPS, foodPiecesNeeded, seconds, foodAffinity, foodValue, wakeAffinityMult, wakeFoodDeplMult, foodname = 0, 0, 0, 0, 0, 0, 0, 1, 1, ''
-- test if creature is tamend non-violently, then use wakeTame multiplicators
local nonViolent = false
if (creatureData[creature].nonViolentTame ~= nil and creatureData[creature].nonViolentTame == 1) then
nonViolent = true
if creatureData[creature].wakeAffinityMult ~= nil then
wakeAffinityMult = creatureData[creature].wakeAffinityMult
end
if creatureData[creature].wakeFoodDeplMult ~= nil then
wakeFoodDeplMult = creatureData[creature].wakeFoodDeplMult
end
end
-- creature need heavy weapon knockout? (like rock elemental, titnaosaur)
local heavyWeaponKnockout = false
if (creatureData[creature].heavyWeaponKnockout ~= nil and creatureData[creature].heavyWeaponKnockout == 1) then
heavyWeaponKnockout = true
end
for _,level in ipairs(levels) do
local headerCols = ''
if nonViolent then
headerCols = '! <span style="cursor: help; border-bottom: 1px dotted #397d75;" title="The theoretically optimal minimum">Feeding Interval</span>\n! Time'
else
-- total torpor for level
totalTorpor = creatureData[creature].torpor1 + creatureData[creature].torporIncrease * (level-1)
-- torpor depletion per second for level
-- here the linear approach of 0.01819*baseTorporDepletion/level is used. Data shows, it's actual an exponential increase
torporDeplPS = creatureData[creature].torporDepletionPS0 * (1 + 0.01819 * level)
if torporDeplPS > 0 then
headerCols = '! [[File:Narcoberry.png|30px]]\n! [[File:Narcotic.png|30px]]\n! Time'
else
headerCols = '! Time'
end
end
local rows = {'{| class="wikitable" data-description="Taming Table Level '..level..'"\n|-\n! colspan="2" | [[File:'..creature..'.png|30px]] Level '..level..'\n'..headerCols..''}
affinityNeeded = creatureData[creature].affinityNeeded0 + creatureData[creature].affinityIncrease * level;
-- foodname for display
foodname = ''
-- how much food/resources of the different kinds that this creature eats is needed
for _,food in ipairs(creatureData[creature].eats) do
local cols = {}
foodAffinity = 0
foodValue = 0
if food == 'Ração' then
foodname = 'Ração (Ovo de '..creatureData[creature].favoriteKibble..')'
else
foodname = food
end
-- check if creature handles this food in a special way (e.g. scorpions not liking raw meat as much)
if (creatureData[creature].specialFoodValues ~= nil and creatureData[creature].specialFoodValues[food] ~= nil) then
if creatureData[creature].specialFoodValues[food].affinity ~= nil then
foodAffinity = creatureData[creature].specialFoodValues[food].affinity
end
if creatureData[creature].specialFoodValues[food].value ~= nil then
foodValue = creatureData[creature].specialFoodValues[food].value
end
end
if foodData[food] ~= nil then
if foodAffinity == 0 then
foodAffinity = foodData[food].affinity
end
if foodValue == 0 then
foodValue = foodData[food].foodValue
end
end
if (foodAffinity > 0 and foodValue > 0) then
-- consider wake taming multiplicators (non-violent taming)
foodAffinity = foodAffinity * wakeAffinityMult
foodValue = foodValue * wakeFoodDeplMult
-- amount of food
foodPiecesNeeded = math.ceil((affinityNeeded/foodAffinity)/tamingSpeedMultiplier)
-- time to eat needed food
seconds = math.ceil(foodPiecesNeeded * foodValue / (creatureData[creature].foodConsumptionBase * creatureData[creature].foodConsumptionMult))
table.insert(cols,'|style="border-right-width:0"| [[File:'..foodname..'.png|30px]] '..dlclink(foodname))
table.insert(cols,';border-left-width:0"|'..foodPiecesNeeded)
if nonViolent then
-- feeding intervall (only approximately (mean), exact numbers seem to be more complicated because of inital longer pause)
-- the last feeded food grants the tame instantly, so subtract one of the needed pieces for the time
local feedingInterval = 0
if foodPiecesNeeded > 1 then
feedingInterval = seconds/(foodPiecesNeeded-1)
end
table.insert(cols,'"|'..os.date("!%M:%S",feedingInterval))
else
-- extra needed torpor to eat needed food
local torporNeeded = math.ceil(torporDeplPS * seconds - totalTorpor)
if torporNeeded < 0 then
torporNeeded = 0
end
-- only display number of narcos if columns exist
if torporDeplPS > 0 then
-- amount of Narcoberries (give 7.5 torpor each over 3s)
table.insert(cols,'"|'..math.ceil((torporNeeded/(7.5+3*torporDeplPS))/tamingSpeedMultiplier))
-- amount of Narcotics (give 40 each over 5s)
table.insert(cols,'"|'..math.ceil((torporNeeded/(40+5*torporDeplPS))/tamingSpeedMultiplier))
end
end
-- needed Time to eat
table.insert(cols,'"|'..math.floor(seconds/3600)..':'..os.date("!%M:%S",seconds))
table.insert(rows,table.concat(cols,'\n| align="right" style="min-width:2.8em'))
end
end
local torporInfoRows = ''
if not nonViolent then
if heavyWeaponKnockout then
--
local ballistaTorpor = creatureData[creature].heavyWeaponTorporValue['ballistaBolt']
local boulderTorpor = creatureData[creature].heavyWeaponTorporValue['boulder']
local rocketTorpor = creatureData[creature].heavyWeaponTorporValue['rocket']
local homingRocketTorpor = creatureData[creature].heavyWeaponTorporValue['homingRocket']
local cannonballTorpor = creatureData[creature].heavyWeaponTorporValue['cannonball']
--
local ballistaBoltsNeeded = nil
local bouldersNeeded = nil
local rocketsNeeded = nil
local homingRocketNeeded = nil
local cannonballsNeeded = nil
if (totalTorpor/ballistaTorpor) then
ballistaBoltsNeeded = '<span style="font-style:oblique;">N/A</span>'
else
ballistaBoltsNeeded = math.ceil(totalTorpor/ballistaTorpor)
end
--
if (totalTorpor/boulderTorpor == 0) then
bouldersNeeded = '<span style="font-style:oblique;">N/A</span>'
else
bouldersNeeded = math.ceil(totalTorpor/boulderTorpor)
end
--
if (totalTorpor/rocketTorpor == 0) then
rocketsNeeded = '<span style="font-style:oblique;">N/A</span>'
else
rocketsNeeded = math.ceil(totalTorpor/rocketTorpor)
end
--
if (totalTorpor/homingRocketTorpor == 0) then
homingRocketsNeeded = '<span style="font-style:oblique;">N/A</span>'
else
homingRocketsNeeded = math.ceil(totalTorpor/homingRocketTorpor)
end
--
if (totalTorpor/cannonballTorpor == 0) then
cannonballsNeeded = '<span style="font-style:oblique;">N/A</span>'
else
cannonballsNeeded = math.ceil(totalTorpor/cannonballTorpor)
end
torporInfoRows = '\n|-\n| colspan="5" align="right" | <span style="cursor: help; border-bottom: 1px dotted #397d75;" title="Acertar na cabeça é mais efetivo.">KO</span>: [[File:Ballista Bolt.png|20px|Ballista Hits]] × '
..ballistaBoltsNeeded..
'; [[File:Boulder.png|20px|Boulder Hits]] × '
..bouldersNeeded..
'; [[File:Rocket Propelled Grenade.png|20px|Rocket Propelled Grenade Shots]] × '
..rocketsNeeded..
'; [[File:Rocket Homing Missile.png|20px|Homing Missile Shots]] × '
..homingRocketsNeeded..
'; [[File:Cannon Ball.png|20px|Cannon Shots]] × '
..cannonballsNeeded
-- print torpor depletion per s
if torporDeplPS > 0 then
torporInfoRows = torporInfoRows .. '\n|- style="font-size:0.8em"\n| colspan="5" align="right" | [[Torpor]] esgota: <span style="cursor: help; border-bottom: 1px dotted #397d75;" title="Isso é aproximado. um Narcoberry a cada '..(math.floor(75/torporDeplPS)/10 + 3)..' s ou um Narcótico a cada '..(math.floor(400/torporDeplPS)/10 + 5)..' s">'..(math.ceil(100*torporDeplPS)/100)..' / s</span>, Tempo até todo torpor acabar: '..os.date("!%X", totalTorpor/torporDeplPS)
end
elseif not heavyWeaponKnockout then
-- print needed tranq arrows needed to ko creature. Bow-arrow causes 20 dmg, tranqMultiplier are 2+2.5=4.5 ==> 90 Torpor/arrow. (20 dmg)
-- crossbow 35 dmg * 4.5 ==> 157.5 torpor (35 dmg)
-- slingshot: 14 dmg, stone-tranq-mult: 1.75 ==> 24.5 torpor (14 dmg)
-- wooden club: 10 torpor (5 dmg)
-- longneck dart: 26 * 8.5 = 221 (26 dmg)
torporInfoRows = '\n|-\n| colspan="5" align="right" | <span style="cursor: help; border-bottom: 1px dotted #397d75;" title="Acertar na cabeça é mais efetivo.">KO</span>: [[File:Wooden Club.png|20px|Wooden Club Hits]] × '
..math.ceil(totalTorpor/10)..
'; [[File:Slingshot.png|20px|Slingshot Hits]] × '
..math.ceil(totalTorpor/24.5)..
'; [[File:TranqArrowBow.png|20px|Tranquilizer Arrows with a Bow]] × '
..math.ceil(totalTorpor/90)..
'; [[File:TranqArrowCrossbow.png|20px|Tranquilizer Arrows with a Crossbow]] × '
..math.ceil(totalTorpor/157.5)..
'; [[File:Tranquilizer Dart.png|20px|Tranquilizer Dart Shots]] × '
..math.ceil(totalTorpor/221)..
'; [[File:Shocking Tranquilizer Dart.png|20px|Shocking Tranquilizer Dart Shots]] × '
..math.ceil(totalTorpor/442)..
-- print torpor depletion per s
'\n|- style="font-size:0.8em"\n| colspan="5" align="right" | [[Torpor]] esgota: <span style="cursor: help; border-bottom: 1px dotted #397d75;" title="Isso é aproximado. um Narcoberry a cada '..(math.floor(75/torporDeplPS)/10 + 3)..' s ou um Narcótico a cada '..(math.floor(400/torporDeplPS)/10 + 5)..' s">'..(math.ceil(100*torporDeplPS)/100)..' / s</span>, Tempo até todo torpor acabar: '..os.date("!%X", totalTorpor/torporDeplPS)
end
end
table.insert(tables,table.concat(rows,'\n|-\n')..torporInfoRows..'\n|}')
end
return '<div style="display:inline-block;margin:0 4px">\n'..table.concat(tables,'\n</div><div style="display:inline-block;margin:0 4px">\n')..'\n</div>'
else
return '<pre>Error: No taming-data for "'..creature..'" found. If the current page is not a creature-page, write the wanted creature as first parameter. Use only the common name, found on the creature\'s dossier.</pre>'
end
end
return p