Module:Thought

From RimWorld Wiki
Revision as of 01:59, 17 August 2024 by Arcangelus (talk | contribs)
Jump to navigation Jump to search

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

--[[
The Preprocessor visited node count was reduced from 969 to 508.
]]
local p = {}
local getArgs = require('Module:Arguments').getArgs
--local valores_ingresados={"value", "value2", "value3", "value4", "value5", "value6", "value7", "value8", "value9" }

function p.main(frame)
	local args = getArgs(frame)
	local desc = tostring(args["desc"])
	local label = tostring(args["label"])
	local duration = tonumber(args["duration"])
	local stack = tonumber(args["stack"])
	local multi = tonumber(args["multi"]) or 1
-- The advantage of adding values to an empty list rather than defining a list is that no
-- nil values will get into the list. This means that values don't have to be consecutive.
-- EX: value9 is valid w/o defining value7 and value8.
	local valores = {}
	valores[#valores+1]=args["value"]
	valores[#valores+1]=args["value2"]
	valores[#valores+1]=args["value3"]
	valores[#valores+1]=args["value4"]
	valores[#valores+1]=args["value5"]
	valores[#valores+1]=args["value6"]
	valores[#valores+1]=args["value7"]
	valores[#valores+1]=args["value8"]
	valores[#valores+1]=args["value9"]
	if tonumber(args["value"]) then
		return p._main(desc, label, duration, stack, multi, valores)
		else
			return "<big><b>Missing value. Please, define a numerical value to use.</b></big>"
	end
end

function p._main(desc, label, duration, stack, multi, valores)
	local final_string = duration and " [[mood]] for "..duration.." [[Time|days]]" or " [[mood]]"
	-- "valores" is a list of all values given to the function.
	-- This checks if a second value exist
	if valores[2] then
		return p.Thought(valores)..'<abbr title="'..desc..'">'..(label:gsub("^%l", string.upper))..'</abbr>'..final_string
	else --Only initial value defined
		if stack==1 and multi==1 then
			local value = valores[1]
			if tonumber(value)>0 then
				return '<b><font color="forestgreen">'..value..'</font></b> '..'<abbr title="'..desc..'">'..(label:gsub("^%l", string.upper))..'</abbr>'..final_string
			elseif tonumber(value) == 0 then
				return '<b>'..value..'</b> '..'<abbr title="'..desc..'">'..(label:gsub("^%l", string.upper))..'</abbr>'..final_string
			else
				return '<b><font color="firebrick">'..value..'</font></b> '..'<abbr title="'..desc..'">'..(label:gsub("^%l", string.upper))..'</abbr>'..final_string
			end
		end
		return p.stacks(stack, multi, valores[1])..'<abbr title="'..desc..'">'..(label:gsub("^%l", string.upper))..'</abbr>'..final_string
	end
end

--[[
This function returns a string if more than 1 value was defined.
1.- It adds all the numbers to a list
1.1 Red for negatves, Green otherwise
2.- It concatenates all elements of said lists, wth some extras to make sense.
]]

function p.Thought(valores)
	local valores_buscados={}
	for i, j in ipairs(valores) do
		local vx = valores[i]
		local vy = ""
		if tonumber(vx) then -- A number.
			if tonumber(vx)<0 then vy='<b><font color="firebrick">'..vx.."</font></b>" else vy='<b><font color="forestgreen">'..vx.."</font></b>" end
		else
			vy='<b>'..vx.."</b>" --The idea is to prevent a hard to track error
		end
		valores_buscados[#valores_buscados+1]=vy
	end
	return "<b>"..table.concat(valores_buscados,"<b>/</b>").."</b> "
end

--[[
This function return a string for the case that only 1 value was defined.
1.  If a stack value was defined:
1.1 Is stack equal to 1
1.2 Any other case.
2.  If a stack was not defined, then check the multiplier
2.1 If the multiplier is equal or above one
2.2 If the multiplier is below 1.

Finally, some final code to decide what color to use.
1. Green for positive.
2. None for 0.
3. Red for negatives.
The retuned value is rounded half-down. (Meaning 0.5 -> 0 )
	string.format("%.2f", number))
To combat that, I add 0.001 to the number calculated. It should be enough.
]]

function p.stacks(stack, multi, value)
	local text=""
	if stack then
		if multi == 1 then
			if stack ~= 1 then 
				text = "Stacking "..stack.." times for a maximum of "..tostring(value*stack)
			end
		else
			text = "Stacking "..stack.." times with a "..multi.." multiplier for maximum of "..string.format("%.2f", value*( 1 - multi^stack)/(1 - multi) + 0.001)
--			tostring(value*( 1 - multi^stack)/(1 - multi))
		end
	else
		if multi >= 1 then --I want to avoid the case of really large numbers.
			text = "Stacking infinitely"
		else
			text = "Stacking with a "..multi.." multiplier for maximum of "..string.format("%.2f", value*( 1 - multi^100)/(1 - multi) + 0.001)
		end
	end

	if tonumber(value)>0 then
		return '<abbr title="'..text..'"><b><font color="forestgreen">'..value..'</font></b></abbr> '
	elseif tonumber(value) == 0 then
		return '<abbr title="'..text..'"><b>'..value..'</b></abbr> '
	else
		return '<abbr title="'..text..'"><b><font color="firebrick">'..value..'</font></b></abbr> '
	end
end

return p