Add class Recipe
This commit is contained in:
		
							parent
							
								
									22c5f9ddc7
								
							
						
					
					
						commit
						b84902ce6a
					
				
					 2 changed files with 155 additions and 0 deletions
				
			
		
							
								
								
									
										153
									
								
								cf-lib/data/Recipe.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								cf-lib/data/Recipe.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,153 @@ | |||
| ---- Utility class for a single recipe | ||||
| ---- @class Recipe | ||||
| local Recipe = {} | ||||
| 
 | ||||
| ---- Pass a recipe name or a recipe table to get a Recipe object | ||||
| ---- @param value string|table The name of the recipe or the recipe table | ||||
| function Recipe:new(value) | ||||
|     local name | ||||
|     local recipe | ||||
| 
 | ||||
|     if type(value) == "string" then | ||||
|         name = value | ||||
|         recipe = data.raw.recipe[name] | ||||
|     elseif type(value) == "table" then | ||||
|         name = value.name | ||||
|         recipe = value | ||||
|     end | ||||
| 
 | ||||
|     if not recipe then | ||||
|         log("Recipe not found: " .. name) | ||||
|         return nil | ||||
|     end | ||||
| 
 | ||||
|     local obj = { | ||||
|         prototype = recipe | ||||
|     } | ||||
| 
 | ||||
|     setmetatable(obj, self) | ||||
|     self.__index = self | ||||
|     return obj | ||||
| end | ||||
| 
 | ||||
| ---- Applies the recipe to the game | ||||
| function Recipe:apply() | ||||
|     data:extend({ self.prototype }) | ||||
| end | ||||
| 
 | ||||
| ---- Assigns data to the recipe | ||||
| ---- Shorthand for table.assign(recipe.prototype, data) | ||||
| ---- @param data table The data to assign | ||||
| function Recipe:assign(data) | ||||
|     table.assign(self.prototype, data) | ||||
| end | ||||
| 
 | ||||
| --- Adds an ingredient to the recipe | ||||
| --- @param ingredientName string The name of the ingredient | ||||
| --- @param amount number The amount of the ingredient | ||||
| function Recipe:addIngredient(ingredientName, amount) | ||||
|     local ingredientType = data.raw.item[ingredientName] and "item" | ||||
|         or data.raw.module[ingredientName] and "item" | ||||
|         or data.raw.fluid[ingredientName] and "fluid" | ||||
|         or nil | ||||
|     if not ingredientType then | ||||
|         log("Unknown ingredient: " .. ingredientName) | ||||
|         return | ||||
|     end | ||||
|     self.prototype.ingredients = self.prototype.ingredients or {} | ||||
|     for _, ingredient in pairs(self.prototype.ingredients) do | ||||
|         if ingredient.name == ingredientName then | ||||
|             ingredient.amount = amount | ||||
|             ingredient.amount_min = nil | ||||
|             ingredient.amount_max = nil | ||||
|             ingredient.probability = nil | ||||
|             return | ||||
|         end | ||||
|     end | ||||
|     table.insert(self.prototype.ingredients, { name = ingredientName, amount = amount, type = ingredientType }) | ||||
| end | ||||
| 
 | ||||
| --- Replaces an existing ingredient by name with a new ingredient or adjusts the amount | ||||
| --- @param old string The name of the existing ingredient | ||||
| --- @param new? string The name of the new ingredient | ||||
| --- @param amount? number The amount of the new ingredient | ||||
| function Recipe:replaceIngredient(old, new, amount) | ||||
|     if type(new) == "number" then | ||||
|         amount = new | ||||
|         new = old | ||||
|     end | ||||
|     if self.prototype.ingredients then | ||||
|         for _, result in pairs(self.prototype.ingredients) do | ||||
|             if result.name == old then | ||||
|                 result.name = new | ||||
|                 result.amount = amount or result.amount | ||||
|                 return | ||||
|             end | ||||
|         end | ||||
|     end | ||||
| end | ||||
| 
 | ||||
| --- Removes an existing ingredient by name | ||||
| --- @param ingredientName string The name of the ingredient | ||||
| function Recipe:removeIngredient(ingredientName) | ||||
|     if self.prototype.ingredients then | ||||
|         for i, result in pairs(self.prototype.ingredients) do | ||||
|             if result.name == ingredientName then | ||||
|                 self.prototype.ingredients[i] = nil | ||||
|                 return | ||||
|             end | ||||
|         end | ||||
|     end | ||||
| end | ||||
| 
 | ||||
| --- Replaces an existing result by name with a new result | ||||
| --- @param old string The name of the existing result | ||||
| --- @param new? string The name of the new result | ||||
| --- @param amount? number The amount of the new result (keeps the old value if not set) | ||||
| --- @param expensiveAmount? number The amount of the new result for the expensive recipe (uses amount if not set) | ||||
| function Recipe:replaceResult(old, new, amount, expensiveAmount) | ||||
|     if type(new) == "number" then | ||||
|         expensiveAmount = amount | ||||
|         amount = new | ||||
|         new = old | ||||
|     end | ||||
|     if self.prototype.results then | ||||
|         for _, result in pairs(self.prototype.results) do | ||||
|             if result.name == old then | ||||
|                 result.name = new | ||||
|                 result.amount = amount or result.amount | ||||
|             end | ||||
|         end | ||||
|         if table.main_product == old then | ||||
|             table.main_product = new | ||||
|         end | ||||
|     end | ||||
| end | ||||
| 
 | ||||
| --- Adds the recipe to a technology | ||||
| --- @param technology string|table The name of the technology or the technology table | ||||
| function Recipe:unlockedByTechnology(technology) | ||||
|     if not technology then | ||||
|         return | ||||
|     end | ||||
|     technology = type(technology) == "table" and technology or data.raw.technology[technology] | ||||
|     if (not technology.effects) then | ||||
|         technology.effects = {} | ||||
|     end | ||||
|     for _, effect in pairs(technology.effects) do | ||||
|         if effect.type == "unlock-recipe" and effect.recipe == self.prototype.name then | ||||
|             return | ||||
|         end | ||||
|     end | ||||
|     table.insert(technology.effects, { type = "unlock-recipe", recipe = self.prototype.name }) | ||||
| end | ||||
| 
 | ||||
| ---- Clones the recipe | ||||
| ---- @param name string The name of the new recipe | ||||
| function Recipe:clone(name) | ||||
|     local clone = table.deepcopy(self.prototype) | ||||
|     clone.name = name | ||||
|     return Recipe:new(clone) | ||||
| end | ||||
| 
 | ||||
| return Recipe | ||||
|  | @ -59,6 +59,7 @@ end | |||
| --- @param prerequisite string|table The name of the prerequisite or the prerequisite Technology instance | ||||
| function Technology:addPrerequisite(prerequisite) | ||||
|     local _prerequisite = prerequisiteName(prerequisite) | ||||
|     self.prototype.prerequisites = self.prototype.prerequisites or {} | ||||
|     if (not table.contains(self.prototype.prerequisites, _prerequisite)) then | ||||
|         table.insert(self.prototype.prerequisites, _prerequisite) | ||||
|     end | ||||
|  | @ -67,6 +68,7 @@ end | |||
| --- Adds multiple prerequisites to the technology | ||||
| --- @param prerequisites table The names of the prerequisite or the prerequisite Technology instances | ||||
| function Technology:addPrerequisites(prerequisites) | ||||
|     self.prototype.prerequisites = self.prototype.prerequisites or {} | ||||
|     for _, prerequisite in pairs(prerequisites) do | ||||
|         local _prerequisite = prerequisiteName(prerequisite) | ||||
|         if (not table.contains(self.prototype.prerequisites, _prerequisite)) then | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Simon Brodtmann
						Simon Brodtmann