no-productivity-modules/data-final-fixes.lua

Wed, 27 Aug 2025 10:26:12 +0300

author
Teemu Piippo <teemu.s.piippo@gmail.com>
date
Wed, 27 Aug 2025 10:26:12 +0300
changeset 19
adbc5c74f279
permissions
-rw-r--r--

Lots of stuff

---@param technology data.TechnologyPrototype
---@param x string
function remove_recipe_effect(technology, x)
	---@type (data.Modifier)[]
	local list2 = {}
	for k, v in pairs(technology.effects or {})
	do
		if v.type ~= "unlock-recipe" or v.recipe ~= x
		then
			table.insert(list2, v)
		end
	end
	technology.effects = list2
end

---@param technology data.TechnologyPrototype
---@param x data.Modifier
function remove_effect(technology, x)
	---@type (data.Modifier)[]
	local list2 = {}
	for _, technology_effect in pairs(technology.effects or {})
	do
		local match = true
		for key, value in pairs(x)
		do
			if technology_effect[key] ~= value
			then
				match = false
				break
			end
		end
		if not match
		then
			table.insert(list2, technology_effect)
		end
	end
	technology.effects = list2
end

---@param technology data.TechnologyPrototype
---@param x string
function remove_prerequisite(technology, x)
	if technology.prerequisites
	then
		local new_prerequisites = {}
		local changed = false
		for k, v in pairs(technology.prerequisites)
		do
			if v == x
			then
				changed = true
			else
				table.insert(new_prerequisites, v)
			end
		end
		if changed
		then
			technology.prerequisites = new_prerequisites
		end
	end
end

---@param recipe data.RecipePrototype
---@param ingredient_to_remove string
local function remove_ingredient(recipe, ingredient_to_remove)
	local changed = false
	local new_ingredients = {}
	for _, ingredient in pairs(recipe.ingredients or {})
	do
		if ingredient.name == ingredient_to_remove
		then
			changed = true
		else
			table.insert(new_ingredients, ingredient)
		end
	end
	if changed
	then
		recipe.ingredients = new_ingredients
	end
end

local removed_technologies = {}

---@param recipe data.RecipePrototype
local function recipe_results_in(recipe, x)
	for _, result in pairs(recipe.results or {})
	do
		if result.name == x
		then
			return true
		end
	end
	return false
end

---@param effect_name string
---@param effect_value number
local function is_effect_banned(effect_name, effect_value)
	if effect_name == "consumption"
	then
		if effect_value > 0
		then
			return settings.startup["banned-module-effect-consumption-increase"].value
		else
			return settings.startup["banned-module-effect-consumption-decrease"].value
		end
	else
		return settings.startup["banned-module-effect-"..effect_name].value
	end
end

for _, module in pairs(data.raw["module"])
do
	local new_effects = {}
	local changed = false
	local empty = true
	for effect_name, effect_value in pairs(module.effect)
	do
		if is_effect_banned(effect_name, effect_value)
		then
			changed = true
		else
			new_effects[effect_name] = effect_value
			empty = false
		end
	end
	if changed
	then
		if not empty
		then
			module.effect = new_effects
		else
			data.raw["module"][module.name].hidden = true
			for _, technology in pairs(data.raw["technology"])
			do
				if technology.effects
				then
					remove_recipe_effect(technology, module.name)
					if #technology.effects == 0
					then
						technology.hidden = true
						log("Npm: removed technology "..technology.name)
						table.insert(removed_technologies, technology.name)
					end
				end
			end
			for _, recipe in pairs(data.raw["recipe"])
			do
				if recipe_results_in(recipe, module.name)
				then
					recipe.hidden = true
				end
				remove_ingredient(recipe, module.name)
			end
		end
	end
end

if settings.startup["banned-module-effect-quality"].value
then
	---@type data.UnlockQualityModifier
	local unlock_uncommon = {type = "unlock-quality", quality = "uncommon"}
	---@type data.UnlockQualityModifier
	local unlock_rare = {type = "unlock-quality", quality = "rare"}
	if mods["quality"]
	then
		remove_effect(data.raw["technology"]["quality-module"], unlock_uncommon)
		remove_effect(data.raw["technology"]["quality-module"], unlock_rare)
	end
	if mods["promethium-quality"]
	then
		table.insert(data.raw["technology"]["refinery"].effects, unlock_uncommon)
		table.insert(data.raw["technology"]["refinery"].effects, unlock_rare)
	end
end

for _, technology in pairs(data.raw["technology"])
do
	for _, removed_tech in pairs(removed_technologies)
	do
		remove_prerequisite(technology, removed_tech)
	end
end

mercurial