Module:TamingTable

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

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 = '! Feeding Interval \n! Time' else -- total torpor for level totalTorpor = creatureData[creature].torpor1 + creatureData[creature].torporIncrease * (level-1)

-- torpor depletion per second for level -- here an exponential approximation of the torpor Depletion is used, credits to http://crumplecorn.com/content/taming-calculator if creatureData[creature].torporDepletionPS0 ~= nil then torporDeplPS = creatureData[creature].torporDepletionPS0 + math.exp(0.800403041 * math.log(level - 1)) / (22.39671632 / creatureData[creature].torporDepletionPS0); else torporDeplPS = 0 end

if torporDeplPS > 0 then headerCols = '! \n! \n! \n! Time' else headerCols = '! Time' end end local rows = {'{| class="wikitable" data-description="Taming Table Level '..level..'"\n|-\n! colspan="2" | Level '..level..'\n'..headerCols..''}

if creatureData[creature].affinityNeeded0 ~= nil and creatureData[creature].affinityIncrease ~= nil and torporDeplPS ~= nil then 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 == 'Kibble' then foodname = ''..creatureData[creature].favoriteKibble..' Kibble' 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) -- multiply by 4 to account for the x4 taming introduced in August 2020 foodAffinity = foodAffinity * wakeAffinityMult * 4 foodValue = foodValue * wakeFoodDeplMult

-- amount of food foodPiecesNeeded = math.ceil(affinityNeeded/foodAffinity) -- time to eat needed food if creatureData[creature].constantFeedingInterval ~= nil then seconds = creatureData[creature].constantFeedingInterval * foodPiecesNeeded else seconds = math.ceil(foodPiecesNeeded * foodValue / (creatureData[creature].foodConsumptionBase * creatureData[creature].foodConsumptionMult)) end -- hack to correct basilosaurus' taming times if creatureData[creature].resultCorrection ~= nil then seconds = seconds * creatureData[creature].resultCorrection end

table.insert(cols,'|style="border-right-width:0"| '..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                if creatureData[creature].constantFeedingInterval ~= nil then              	  feedingInterval = creatureData[creature].constantFeedingInterval                else      	          feedingInterval = seconds/(foodPiecesNeeded-1)        	    end        	  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)))               -- amount of Narcotics (give 40 each over 8s)                table.insert(cols,'"|'..math.ceil(torporNeeded/(40+8*torporDeplPS))) -- amount of Bio Toxins (give 80 each over 16s) table.insert(cols,'"|'..math.ceil(torporNeeded/(80+16*torporDeplPS)))             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      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 homingRocketsNeeded = nil local cannonballsNeeded = nil

if (totalTorpor == 0 or ballistaTorpor == 0) then ballistaBoltsNeeded = ' N/A ' else ballistaBoltsNeeded = math.ceil(totalTorpor/ballistaTorpor) end --         if (totalTorpor == 0 or boulderTorpor == 0) then bouldersNeeded = ' N/A ' else bouldersNeeded = math.ceil(totalTorpor/boulderTorpor) end --         if (totalTorpor == 0 or rocketTorpor == 0) then rocketsNeeded = ' N/A ' else rocketsNeeded = math.ceil(totalTorpor/rocketTorpor) end --         if (totalTorpor == 0 or homingRocketTorpor == 0) then homingRocketsNeeded = ' N/A ' else homingRocketsNeeded = math.ceil(totalTorpor/homingRocketTorpor) end --         if (totalTorpor == 0 or cannonballTorpor == 0) then cannonballsNeeded = ' N/A ' else cannonballsNeeded = math.ceil(totalTorpor/cannonballTorpor) end torporInfoRows = '\n|-\n| colspan="6" align="right" | KO : × ' ..ballistaBoltsNeeded.. '; × '          ..bouldersNeeded.. '; × '          ..rocketsNeeded.. '; × '          ..homingRocketsNeeded.. '; × '          ..cannonballsNeeded -- print torpor depletion per s         if torporDeplPS > 0 then torporInfoRows = torporInfoRows .. '\n|- style="font-size:0.8em"\n| colspan="6" align="right" | Torpidity-depletion: '..(math.ceil(100*torporDeplPS)/100)..' / s, Time until all torpidity is depleted: '..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="6" align="right" | KO : × ' ..math.ceil(totalTorpor/10).. '; × '          ..math.ceil(totalTorpor/24.5).. '; × '          ..math.ceil(totalTorpor/90).. '; × '          ..math.ceil(totalTorpor/157.5).. '; × '          ..math.ceil(totalTorpor/221).. '; × '          ..math.ceil(totalTorpor/442) -- print torpor depletion per s         if torporDeplPS > 0 then torporInfoRows = torporInfoRows .. '\n|- style="font-size:0.8em"\n| colspan="6" align="right" | Torpidity-depletion: '..(math.ceil(100*torporDeplPS)/100)..' / s, Time until all torpidity is depleted: '..os.date("!%X", totalTorpor/torporDeplPS) end end end

table.insert(tables,table.concat(rows,'\n|-\n')..torporInfoRows..'\n|}') end return ' \n'..table.concat(tables,'\n \n')..'\n ' else return ' 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. ' end end return p