Factorio: implement random recipe times

This commit is contained in:
Fabian Dill 2021-06-06 21:11:58 +02:00
parent 7907838c24
commit 403ddd603f
5 changed files with 31 additions and 6 deletions

View File

@ -329,6 +329,11 @@ class Visibility(Choice):
option_sending = 1
default = 1
class RecipeTime(Choice):
option_vanilla = 0
option_fast = 1
option_normal = 2
option_slow = 4
class FactorioStartItems(OptionDict):
default = {"burner-mining-drill": 19, "stone-furnace": 19}
@ -340,7 +345,8 @@ factorio_options: typing.Dict[str, type(Option)] = {"max_science_pack": MaxScien
"free_samples": FreeSamples,
"visibility": Visibility,
"random_tech_ingredients": Toggle,
"starting_items": FactorioStartItems}
"starting_items": FactorioStartItems,
"recipe_time": RecipeTime}
class AdvancementGoal(Choice):

View File

@ -49,6 +49,14 @@ function copy_factorio_icon(tech, tech_source)
tech.icon_size = table.deepcopy(technologies[tech_source].icon_size)
end
function adjust_energy(recipe_name, factor)
local energy = data.raw.recipe[recipe_name].energy_required
if (energy == nil) then
energy = 1
end
data.raw.recipe[recipe_name].energy_required = energy * factor
end
table.insert(data.raw["assembling-machine"]["assembling-machine-1"].crafting_categories, "crafting-with-fluid")
{# each randomized tech gets set to be invisible, with new nodes added that trigger those #}
@ -76,5 +84,9 @@ table.insert(new_tree_copy.prerequisites, "ap-{{ tech_table[prerequesite] }}-")
{% endif -%}
{#- add new Technology to game #}
data:extend{new_tree_copy}
{% endfor %}
{% endfor %}
{% if recipe_time %}
{%- for recipe in recipes %}
adjust_energy("{{ recipe }}", {{ 0.01 * random.randint(recipe_time*25, recipe_time*100) }})
{%- endfor -%}
{% endif %}

View File

@ -55,6 +55,11 @@ tech_tree_layout:
small_funnels: 1
medium_funnels: 1
large_funnels: 1
recipe_time:
vanilla: 1
fast: 0 # 25% to 100% of original time
normal: 0 # 50 % to 200% of original time
slow: 0 # 100% to 400% of original time
max_science_pack:
automation_science_pack: 0
logistic_science_pack: 0

View File

@ -11,7 +11,7 @@ import Utils
import shutil
import Options
from BaseClasses import MultiWorld
from .Technologies import tech_table, rocket_recipes
from .Technologies import tech_table, rocket_recipes, recipes
template_env: Optional[jinja2.Environment] = None
@ -62,7 +62,8 @@ def generate_mod(world: MultiWorld, player: int):
"tech_tree_layout_prerequisites": world.tech_tree_layout_prerequisites[player],
"rocket_recipe" : rocket_recipes[world.max_science_pack[player].value],
"slot_name": world.player_names[player][0], "seed_name": world.seed_name,
"starting_items": world.starting_items[player]}
"starting_items": world.starting_items[player], "recipes": recipes,
"recipe_time": world.recipe_time[player], "random": world.random}
for factorio_option in Options.factorio_options:
template_data[factorio_option] = getattr(world, factorio_option)[player].value

View File

@ -117,13 +117,14 @@ for technology, data in raw.items():
del (raw)
lookup_id_to_name: Dict[int, str] = {item_id: item_name for item_name, item_id in tech_table.items()}
recipes = {}
all_product_sources: Dict[str, Set[Recipe]] = {"character": set()}
for recipe_name, recipe_data in raw_recipes.items():
# example:
# "accumulator":{"ingredients":["iron-plate","battery"],"products":["accumulator"],"category":"crafting"}
recipe = Recipe(recipe_name, recipe_data["category"], set(recipe_data["ingredients"]), set(recipe_data["products"]))
recipes[recipe_name] = Recipe
if recipe.products.isdisjoint(recipe.ingredients) and "empty-barrel" not in recipe.products: # prevents loop recipes like uranium centrifuging
for product_name in recipe.products:
all_product_sources.setdefault(product_name, set()).add(recipe)