Module:HabSiteInvicta: Difference between revisions

From Terra Invicta Official Wiki
Llamageddon (talk | contribs)
mNo edit summary
Llamageddon (talk | contribs)
mNo edit summary
 
(4 intermediate revisions by the same user not shown)
Line 70: Line 70:
---@return wiki table of HabSites
---@return wiki table of HabSites
function HabSiteLister.ListHabSites(mode, specificSpaceBody, restrictInner, restrictOuter)
function HabSiteLister.ListHabSites(mode, specificSpaceBody, restrictInner, restrictOuter)
local returnString = '{| class="wikitable" style="text-align: center;"'
local returnString = '{| style="margin-left: auto; margin-right: auto; text-align:center;"'
returnString = returnString .. '\n|-'
returnString = returnString .. '\n|-'
returnString = returnString .. '\n! Site Name'
returnString = returnString .. "\n! Site Name<ref>Site resource numbers are median values of possible rolls. ''Note: 0 still has 50% roll chance for positive value.''</ref>"
returnString = returnString .. '\n!' .. IconModule.Icon({args={'water'}})
returnString = returnString .. '\n!' .. IconModule.Icon({args={'water'}})
returnString = returnString .. '\n!' .. IconModule.Icon({args={'volatiles'}})
returnString = returnString .. '\n!' .. IconModule.Icon({args={'volatiles'}})

Latest revision as of 23:21, 17 December 2025

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

---
---This is a variation of Module:HabSiteLister which imitates the format of the site list seen in the game.
---
---@module HabSiteLister
local HabSiteLister = {}

--region Dependencies
local IconModule = require('Module:Icon')

local HabSiteData = mw.loadData('Module:CSVReader/HabSite')
local MiningProfileData = mw.loadData('Module:CSVReader/MiningProfile')
local SpaceBodyData = mw.loadData('Module:CSVReader/SpaceBody')

local SpaceBodyMiningData = mw.loadData('Module:SpaceBodyLister/Mining')

local HabSiteNames = mw.loadData('Module:ENReader/HabSite')
local MiningProfileNames = mw.loadData('Module:ENReader/MiningProfile')
local SpaceBodyNames = mw.loadData('Module:ENReader/SpaceBody')
--endregion

--region Private constants
local floor = math.floor
local round = function(num, decimals)
    local mult = 10^(decimals or 0)
    return floor(num * mult + 0.5) / mult
end
local outerEffects = {
	Effect_ExploreJupiter = true,
	Effect_ExploreSaturn = true,
	Effect_ExploreOuterPlanets = true,
	Effect_ExploreKuiperBelt = true
}
--endregion



--region Private member variables
--none
--endregion

--region Private methods


--endregion

--region Public methods
function HabSiteLister.ListMedians()
	return HabSiteLister.ListHabSites(1)
end

function HabSiteLister.ListTopMeans()
	return HabSiteLister.ListHabSites(2)
end

--- Example Usage: {{#invoke:HabSiteLister|ListSpecific|mode=1|specificSpaceBody=Mercury}} 
function HabSiteLister.ListSpecific(frame)
	local mode = tonumber(frame.args['mode'])
	local specificSpaceBody = frame.args['specificSpaceBody']
	local restrictInner = frame.args['restrictInner']
	local restrictOuter = frame.args['restrictOuter']
	return HabSiteLister.ListHabSites(mode,specificSpaceBody,restrictInner,restrictOuter)
end

---@param mode int what to display
---- 1: Medians 
---- 2: Top 50% Means 
---@param specificSpaceBody which space body to focus on. Use nil value to show all.
---@param restrictInner do not show outer solar system space bodies
---@param restrictOuter do not show inner solar system space bodies
---@return wiki table of HabSites
function HabSiteLister.ListHabSites(mode, specificSpaceBody, restrictInner, restrictOuter)
	local returnString = '{| style="margin-left: auto; margin-right: auto; text-align:center;"'
	returnString = returnString .. '\n|-'
	returnString = returnString .. "\n! Site Name<ref>Site resource numbers are median values of possible rolls. ''Note: 0 still has 50% roll chance for positive value.''</ref>"
	returnString = returnString .. '\n!' .. IconModule.Icon({args={'water'}})
	returnString = returnString .. '\n!' .. IconModule.Icon({args={'volatiles'}})
	returnString = returnString .. '\n!' .. IconModule.Icon({args={'metals'}})
	returnString = returnString .. '\n!' .. IconModule.Icon({args={'nobles'}})
	returnString = returnString .. '\n!' .. IconModule.Icon({args={'fissiles'}})
	returnString = returnString .. '\n|-'
	
	for rowID, row in pairs(HabSiteData) do
		local spaceBodyID = row['parentBodyName'] or ''
		if (not specificSpaceBody or specificSpaceBody == '' or specificSpaceBody == spaceBodyID)
			and (not restrictInner or restrictInner == '' or not outerEffects[SpaceBodyData[spaceBodyID]['effectToExplore']])
			and (not restrictOuter or restrictOuter == '' or outerEffects[SpaceBodyData[spaceBodyID]['effectToExplore']]) then
			returnString = returnString .. '\n| style="text-align:left;" |' .. (HabSiteNames['TIHabSiteTemplate.displayName.' .. rowID] or rowID)
				
			local miningProfileID = row['miningProfileName']
			local modifyBySize = MiningProfileData[miningProfileID]['modifyBySize']
			local waterMean = tonumber(MiningProfileData[miningProfileID]['water_mean'])
			local waterWidth = tonumber(MiningProfileData[miningProfileID]['water_width'])
			local waterMin = tonumber(MiningProfileData[miningProfileID]['water_min'])
			local waterJump = tonumber(MiningProfileData[miningProfileID]['water_jump'])
			if waterMean == 0 and waterWidth == 0 then
				returnString = returnString .. '\n| ' 
			elseif not modifyBySize or modifyBySize ~= 'true' then
				if mode == 1 then
					returnString = returnString .. '\n| ' .. tostring(waterMean)
				elseif mode == 2 then
					returnString = returnString .. '\n| ' .. tostring(round(waterMean + waterWidth * ((1 / (1 - waterJump)) - 1),3))
				else
					returnString = returnString .. '\n| ' 
				end
			else
				if mode == 1 then
					returnString = returnString .. '\n| ' .. tostring(round(waterMean * SpaceBodyMiningData[spaceBodyID]['modifierA'],3))
				elseif mode == 2 then
					returnString = returnString .. '\n| ' .. tostring(round(waterMean * SpaceBodyMiningData[spaceBodyID]['modifierA'] + waterWidth * ((1 / (1 - waterJump)) - 1),3))
				else
					returnString = returnString .. '\n| ' 
				end
			end
			
			local volatilesMean = tonumber(MiningProfileData[miningProfileID]['volatiles_mean'])
			local volatilesWidth = tonumber(MiningProfileData[miningProfileID]['volatiles_width'])
			local volatilesMin = tonumber(MiningProfileData[miningProfileID]['volatiles_min'])
			local volatilesJump = tonumber(MiningProfileData[miningProfileID]['volatiles_jump'])
			if volatilesMean == 0 and volatilesWidth == 0 then
				returnString = returnString .. '\n| ' 
			elseif not modifyBySize or modifyBySize ~= 'true' then
				if mode == 1 then
					returnString = returnString .. '\n| ' .. tostring(volatilesMean)
				elseif mode == 2 then
					returnString = returnString .. '\n| ' .. tostring(round(volatilesMean + volatilesWidth * ((1 / (1 - volatilesJump)) - 1),3))
				else
					returnString = returnString .. '\n| ' 
				end
			else
				if mode == 1 then
					returnString = returnString .. '\n| ' .. tostring(round(volatilesMean * SpaceBodyMiningData[spaceBodyID]['modifierA'],3))
				elseif mode == 2 then
					returnString = returnString .. '\n| ' .. tostring(round(volatilesMean * SpaceBodyMiningData[spaceBodyID]['modifierA'] + volatilesWidth * ((1 / (1 - volatilesJump)) - 1),3))
				else
					returnString = returnString .. '\n| ' 
				end
			end
			
			
			local metalsMean = tonumber(MiningProfileData[miningProfileID]['metals_mean'])
			local metalsWidth = tonumber(MiningProfileData[miningProfileID]['metals_width'])
			local metalsMin = tonumber(MiningProfileData[miningProfileID]['metals_min'])
			local metalsJump = tonumber(MiningProfileData[miningProfileID]['metals_jump'])
			if metalsMean == 0 and metalsWidth == 0 then
				returnString = returnString .. '\n| ' 
			elseif not modifyBySize or modifyBySize ~= 'true' then
				if mode == 1 then
					returnString = returnString .. '\n| ' .. tostring(metalsMean)
				elseif mode == 2 then
					returnString = returnString .. '\n| ' .. tostring(round(metalsMean + metalsWidth * ((1 / (1 - metalsJump)) - 1),3))
				else
					returnString = returnString .. '\n| ' 
				end
			else
				if mode == 1 then
					returnString = returnString .. '\n| ' .. tostring(round(metalsMean * SpaceBodyMiningData[spaceBodyID]['modifierB'],3))
				elseif mode == 2 then
					returnString = returnString .. '\n| ' .. tostring(round(metalsMean * SpaceBodyMiningData[spaceBodyID]['modifierB'] + metalsWidth * ((1 / (1 - metalsJump)) - 1),3))
				else
					returnString = returnString .. '\n| ' 
				end
			end
			
			
			local noblesMean = tonumber(MiningProfileData[miningProfileID]['nobles_mean'])
			local noblesWidth = tonumber(MiningProfileData[miningProfileID]['nobles_width'])
			local noblesMin = tonumber(MiningProfileData[miningProfileID]['nobles_min'])
			local noblesJump = tonumber(MiningProfileData[miningProfileID]['nobles_jump'])
			if noblesMean == 0 and noblesWidth == 0 then
				returnString = returnString .. '\n| ' 
			elseif not modifyBySize or modifyBySize ~= 'true' then
				if mode == 1 then
					returnString = returnString .. '\n| ' .. tostring(noblesMean)
				elseif mode == 2 then
					returnString = returnString .. '\n| ' .. tostring(round(noblesMean + noblesWidth * ((1 / (1 - noblesJump)) - 1),3))
				else
					returnString = returnString .. '\n| ' 
				end
			else
				if mode == 1 then
					returnString = returnString .. '\n| ' .. tostring(round(noblesMean * SpaceBodyMiningData[spaceBodyID]['modifierB'],3))
				elseif mode == 2 then
					returnString = returnString .. '\n| ' .. tostring(round(noblesMean * SpaceBodyMiningData[spaceBodyID]['modifierB'] + noblesWidth * ((1 / (1 - noblesJump)) - 1),3))
				else
					returnString = returnString .. '\n| ' 
				end
			end
			
			
			local fissilesMean = tonumber(MiningProfileData[miningProfileID]['fissiles_mean'])
			local fissilesWidth = tonumber(MiningProfileData[miningProfileID]['fissiles_width'])
			local fissilesMin = tonumber(MiningProfileData[miningProfileID]['fissiles_min'])
			local fissilesJump = tonumber(MiningProfileData[miningProfileID]['fissiles_jump'])
			if fissilesMean == 0 and fissilesWidth == 0 then
				returnString = returnString .. '\n| ' 
			elseif not modifyBySize or modifyBySize ~= 'true' then
				if mode == 1 then
					returnString = returnString .. '\n| ' .. tostring(fissilesMean)
				elseif mode == 2 then
					returnString = returnString .. '\n| ' .. tostring(round(fissilesMean + fissilesWidth * ((1 / (1 - fissilesJump)) - 1),3))
				else
					returnString = returnString .. '\n| ' 
				end
			else
				if mode == 1 then
					returnString = returnString .. '\n| ' .. tostring(round(fissilesMean * SpaceBodyMiningData[spaceBodyID]['modifierB'],3))
				elseif mode == 2 then
					returnString = returnString .. '\n| ' .. tostring(round(fissilesMean * SpaceBodyMiningData[spaceBodyID]['modifierB'] + fissilesWidth * ((1 / (1 - fissilesJump)) - 1),3))
				else
					returnString = returnString .. '\n| ' 
				end
			end
			
	    	returnString = returnString .. '\n|-'
	    end
	end
	returnString = returnString .. '\n|}'
	
	return returnString
end

--endregion

return HabSiteLister