Module:Sandbox/Arcangelus

From RimWorld Wiki
Revision as of 21:03, 14 August 2024 by Arcangelus (talk | contribs)
Jump to navigation Jump to search

Welcome to the RimWorld Wiki sandbox!
This sandbox is where you can experiment and practice working on a wiki page. This page will usually have little or no content. Feel free to add content or to make changes and save them to see the results.

To learn about editing and formatting start here: Help:Contents. Just start with the basics... enter some text, and learn the other pieces as you go.

Your content contributions are welcome and important. The wiki is a collaborative effort and others can help with formatting and other improvements.]

Best wishes!

Description

This is a doc attached to my sandbox. I'll use it to see the effects of my changes W/o messing something important

NOTE: LUA is usually slower than ParserFunctions for short statements. The factor varies from 7-1 to 2-1.
Lua only is an advantage to long statements, nested logic, loops (maybe others case i don't see right now).

expr only uses 1 Preprocessor visited node count, in general. Variables may change that.


function p._TableRow(skillBase, skillBonus, statMin, statMax, capImportance, capLimit, resultCols, LV, Ln)



local yesno, getArgs -- lazily initialized
local p = {}
local wrap = {} -- Holds wrapper functions that process arguments from #invoke. These act as intemediary between functions meant for #invoke and functions meant for Lua.

--Copied from https://en.wikipedia.org/wiki/Module:Math
local function err(msg)
	-- Generates wikitext error messages.
	return mw.ustring.format('<strong class="error">Formatting error: %s</strong>', msg)
end

local function unpackNumberArgs(args)
	-- Returns an unpacked list of arguments specified with numerical keys.
	local ret = {}
	for k, v in pairs(args) do
		if type(k) == 'number' then
			table.insert(ret, v)
		end
	end
	return unpack(ret)
end

local function makeArgArray(...)
	-- Makes an array of arguments from a list of arguments that might include nils.
	local args = {...} -- Table of arguments. It might contain nils or non-number values, so we can't use ipairs.
	local nums = {} -- Stores the numbers of valid numerical arguments.
	local ret = {}
	for k, v in pairs(args) do
		v = p._cleanNumber(v)
		if v then
			nums[#nums + 1] = k
			args[k] = v
		end
	end
	table.sort(nums)
	for i, num in ipairs(nums) do
		ret[#ret + 1] = args[num]
	end
	return ret
end

local function fold(func, ...)
	-- Use a function on all supplied arguments, and return the result. The function must accept two numbers as parameters,
	-- and must return a number as an output. This number is then supplied as input to the next function call.
	local vals = makeArgArray(...)
	local count = #vals -- The number of valid arguments
	if count == 0 then return
		-- Exit if we have no valid args, otherwise removing the first arg would cause an error.
		nil, 0
	end
	local ret = table.remove(vals, 1)
	for _, val in ipairs(vals) do
		ret = func(ret, val)
	end
	return ret, count
end

function p.test(frame)
	parent=frame:getParent()--equal to frame.getParent(frame)
	return parent.args
end

--[[
function p.hello()
    return 'Hola'
end

aname=string.match("Blood Filtration Limit",' %(.*)% ')

return p
]]

--[[
Fold arguments by selectively choosing values (func should return when to choose the current "dominant" value).
]]
local function binary_fold(func, ...)
	local value = fold((function(a, b) if func(a, b) then return a else return b end end), ...)
	return value
end

--TEST AREA
Quality={ Quality_general, Quality_building, Quality_Apparel, Quality_Weapons }

Quality_general={
--{ Beauty, Market Value, Max Increment, Deterioration Rate, Psychic Sensitivity }
	awful={ -0.1, 0.50, 0, 2.00, 0.5 },
	poor={ 0.5, 0.75, 0, 1.50, 0.66 },
	normal={ 1.0, 1.00, 0, 1.00, 0.83 },
	good={ 2.0, 1.25, 500, 0.80, 1.00 },
	excellent={ 3.0, 1.5, 1000, 0.60, 1.16 },
	masterwork={ 5.0, 2.5, 2000, 0.30, 1.32 },
	legendary={ 8.0, 5, 3000, 0.10, 1.50 }
}

Quality_building={
--{ Comfort, Rest Effectiveness, Surgery Success, Recreation Power, Meditation Psyfocus+, Meditation Psyfocus+ }
	awful={ 0.76, 0.86, 0.90, 0.76, 0.12, 0 },
	poor={ 0.88, 0.92, 0.95, 0.88, 0.16, 0 },
	normal={ 1.00, 1.00, 1.00, 1.00, 0.20, 0.01 },
	good={ 1.12, 1.08, 1.05, 1.12, 0.22, 0.01 },
	excellent={ 1.24, 1.14, 1.10, 1.24, 0.24, 0.01 },
	masterwork={ 1.45, 1.25, 1.15, 1.40, 0.26, 0.02 },
	legendary={ 1.70, 1.60, 1.30, 1.80, 0.28, 0.02 }
}

Quality_Apparel={
--{ Protection, Insulation, Smokepop Pack Radius, Shield Max Energy, Shield Recharge Rate, Jump Range }
	awful={ 0.60, 0.80, 0.84, 0.60, 0.90, 0.75 },
	poor={ 0.80, 0.90, 0.92, 0.80, 0.95, 0.90 },
	normal={ 1.00, 1.00, 1.00, 1.00, 1.00, 1.00 },
	good={ 1.15, 1.10, 1.08, 1.20, 1.05, 1.06 },
	excellent={ 1.30, 1.20, 1.16, 1.40, 1.10, 1.13 },
	masterwork={ 1.45, 1.50, 1.30, 1.70, 1.20, 1.19 },
	legendary={ 1.80, 1.80, 1.50, 2.10, 1.30, 1.25 }
}

Quality_Weapons={
--{ Melee Damage, Melee AP, Ranged Accuracy, Ranged Damage, Ranged AP }
	awful={ 0.80, 0.80, 0.80, 0.9, 0.90 },
	poor={ 0.90, 0.90, 0.90, 1, 1 },
	normal={ 1.00, 1.00, 1, 1, 1 },
	good={ 1.10, 1.10, 1.1, 1, 1 },
	excellent={ 1.20, 1.20, 1.2, 1, 1 },
	masterwork={ 1.45, 1.45, 1.35, 1.25, 1.25 },
	legendary={ 1.65, 1.65, 1.5, 1.5, 1.5 }	
}

--Stat Factors Table Row
function wrap.TableRow(args)
	return p._TableRow(unpackNumberArgs(args))
end
function p._TableRow(skillBase, skillBonus, statMin, statMax, capImportance, capLimit, resultCols, LV, Ln)
	local argumentos={skillBase,skillBonus,statMin,statMax,capImportance,capLimit,resultCols,LV,Ln}
	
	for i = 1,8 do --This should prevent errors if a number is not defined.
		if type(argumentos[i])~='number' then
			argumentos[i]=0
		end
	end
	-- Do note that statMin, statMax are handled by "Template:Stat Factors Table".
	-- While I could set fallbacks, I decided against it.
	
	if tonumber(Ln)==nil then --Sanitizes input and allows for 0.
		factor = skillBase + skillBonus * LV
	else
		factor = Ln
	end

	local Pval = math.min(math.max(factor,statMin),statMax)
	R_Pval = tostring(math.floor(Pval*10000+0.5)/100).."%" -- This formats the number as a 2 digit percent value, rounded up.
	if tonumber(resultCols)>1 then
		Pval = factor * ( 1 + capImportance * math.min(capLimit-1, 0.25))
		Pval = math.min(math.max(Pval,statMin),statMax)
		R_Sval="<td>"..tostring(math.floor(Pval*10000+0.5)/100).."% </td>"
	else
		R_Sval=""
	end

	if tonumber(resultCols)>2 then
		Pval = factor * ( 1 + capImportance * math.min(capLimit-1, 0.5))
		Pval = math.min(math.max(Pval,statMin),statMax)
		R_Tval="<td>"..tostring(math.floor(Pval*10000+0.5)/100).."% </td>"
	else
		R_Tval=""
	end
	
	return "|-\r\n!"..LV.."\r\n|"..R_Pval..R_Sval..R_Tval
	-- There are more efficient ways, but this works.
end
----------------
function Melee_HCC(frame)
	local baseScore=frame.args[1]
	local a = math.floor(baseScore/10)
	return frame
--[[	if a < -2 then
		return 0.05 --0.05
	end
	if a == -2 then
		return (baseScore + 20) * 0.005 + 0.05 -- 0.05 / 0.1
	end
	if a == -1 then
		return (baseScore + 10) * 0.04 + 0.1 -- 0.1 / 0.5
	end
	if a == 0 then
		return baseScore * 0.03 + 0.5 -- 0.5 / 0.8
	end
	if a == 1 then
		return (baseScore - 10)* 0.01 + 0.8 -- 0.8 / 0.9
	end
	if a<=3 then -- 2 and 3
		return (baseScore - 20) * 0.003 + 0.9 --0.9 / 0.96
	end
	if a<=5 then -- 4 and 5
		return (baseScore - 40) * 0.001 + 0.96 -- 0.96/ 0.98
	else
		return 0.98
	end]]
end

----------------
--Inspired by some fandom site.
----------------
--[[function spliting(frame)
	local texto = frame.args[1]
	local sep = frame.args[2]
	local N = frame.args[3]
	sep = sep or "%s"
	local A = {}
	for str in string.gmatch(texto, "([^"..sep.."]+)") do
		table.insert(A, str)
	end
	N=N or 0
	return A[N]
end
]]


--[[ Taken from some fandom site
local text = "And if you tolerate this"
local tab = mw.text.split( text, " ")
print(tab[3])
]]

--[[
Wrapper function that does basic argument processing. This ensures that all functions from #invoke can use either the current
frame or the parent frame, and it also trims whitespace for all arguments and removes blank arguments.
]]

--[[ Comented out to test some things.
local mt = { __index = function(t, k)
	return function(frame)
		if not getArgs then
			getArgs = require('Module:Arguments').getArgs
		end
		return wrap[k](getArgs(frame))  -- Argument processing is left to Module:Arguments. Whitespace is trimmed and blank arguments are removed.
	end
end }

return setmetatable(p, mt)
]]