Factorio: make EnergyLink an option

This commit is contained in:
Fabian Dill 2022-02-24 22:40:16 +01:00
parent 508eb04e94
commit e985fc41ce
4 changed files with 45 additions and 33 deletions

View File

@ -53,6 +53,7 @@ recipe_time_ranges = {
Options.RecipeTime.option_slow: (5, 10) Options.RecipeTime.option_slow: (5, 10)
} }
def generate_mod(world, output_directory: str): def generate_mod(world, output_directory: str):
player = world.player player = world.player
multiworld = world.world multiworld = world.world
@ -88,38 +89,44 @@ def generate_mod(world, output_directory: str):
if base: if base:
distance = random.random() distance = random.random()
if random.randint(0, 1): if random.randint(0, 1):
return base + (high-base) * distance return base + (high - base) * distance
else: else:
return base - (base-low) * distance return base - (base - low) * distance
return random.uniform(low, high) return random.uniform(low, high)
template_data = {"locations": locations, "player_names": player_names, "tech_table": tech_table, template_data = {
"base_tech_table": base_tech_table, "tech_to_progressive_lookup": tech_to_progressive_lookup, "locations": locations, "player_names": player_names, "tech_table": tech_table,
"mod_name": mod_name, "allowed_science_packs": multiworld.max_science_pack[player].get_allowed_packs(), "base_tech_table": base_tech_table, "tech_to_progressive_lookup": tech_to_progressive_lookup,
"tech_cost_scale": tech_cost_scale, "custom_technologies": multiworld.worlds[player].custom_technologies, "mod_name": mod_name,
"tech_tree_layout_prerequisites": multiworld.tech_tree_layout_prerequisites[player], "allowed_science_packs": multiworld.max_science_pack[player].get_allowed_packs(),
"slot_name": multiworld.player_name[player], "seed_name": multiworld.seed_name, "slot_player": player, "tech_cost_scale": tech_cost_scale,
"starting_items": multiworld.starting_items[player], "recipes": recipes, "custom_technologies": multiworld.worlds[player].custom_technologies,
"random": random, "flop_random": flop_random, "tech_tree_layout_prerequisites": multiworld.tech_tree_layout_prerequisites[player],
"static_nodes": multiworld.worlds[player].static_nodes, "slot_name": multiworld.player_name[player], "seed_name": multiworld.seed_name,
"recipe_time_scale": recipe_time_scales.get(multiworld.recipe_time[player].value, None), "slot_player": player,
"recipe_time_range": recipe_time_ranges.get(multiworld.recipe_time[player].value, None), "starting_items": multiworld.starting_items[player], "recipes": recipes,
"free_sample_blacklist": {item : 1 for item in free_sample_blacklist}, "random": random, "flop_random": flop_random,
"progressive_technology_table": {tech.name : tech.progressive for tech in "static_nodes": multiworld.worlds[player].static_nodes,
progressive_technology_table.values()}, "recipe_time_scale": recipe_time_scales.get(multiworld.recipe_time[player].value, None),
"custom_recipes": world.custom_recipes, "recipe_time_range": recipe_time_ranges.get(multiworld.recipe_time[player].value, None),
"max_science_pack": multiworld.max_science_pack[player].value, "free_sample_blacklist": {item: 1 for item in free_sample_blacklist},
"liquids": liquids, "progressive_technology_table": {tech.name: tech.progressive for tech in
"goal": multiworld.goal[player].value} progressive_technology_table.values()},
"custom_recipes": world.custom_recipes,
"max_science_pack": multiworld.max_science_pack[player].value,
"liquids": liquids,
"goal": multiworld.goal[player].value,
"energy_link": multiworld.energy_link[player].value
}
for factorio_option in Options.factorio_options: for factorio_option in Options.factorio_options:
if factorio_option in ["free_sample_blacklist", "free_sample_whitelist"]: if factorio_option in ["free_sample_blacklist", "free_sample_whitelist"]:
continue continue
template_data[factorio_option] = getattr(multiworld, factorio_option)[player].value template_data[factorio_option] = getattr(multiworld, factorio_option)[player].value
if getattr(multiworld, "silo")[player].value == Options.Silo.option_randomize_recipe: if getattr(multiworld, "silo")[player].value == Options.Silo.option_randomize_recipe:
template_data["free_sample_blacklist"]["rocket-silo"] = 1 template_data["free_sample_blacklist"]["rocket-silo"] = 1
if getattr(multiworld, "satellite")[player].value == Options.Satellite.option_randomize_recipe: if getattr(multiworld, "satellite")[player].value == Options.Satellite.option_randomize_recipe:
template_data["free_sample_blacklist"]["satellite"] = 1 template_data["free_sample_blacklist"]["satellite"] = 1

View File

@ -1,7 +1,7 @@
from __future__ import annotations from __future__ import annotations
import typing import typing
from Options import Choice, OptionDict, OptionSet, ItemDict, Option, DefaultOnToggle, Range, DeathLink from Options import Choice, OptionDict, OptionSet, ItemDict, Option, DefaultOnToggle, Range, DeathLink, Toggle
from schema import Schema, Optional, And, Or from schema import Schema, Optional, And, Or
# schema helpers # schema helpers
@ -333,6 +333,11 @@ class ImportedBlueprint(DefaultOnToggle):
display_name = "Blueprints" display_name = "Blueprints"
class EnergyLink(Toggle):
"""Allow sending energy to other worlds. 25% of the energy is lost in the transfer."""
display_name = "EnergyLink"
factorio_options: typing.Dict[str, type(Option)] = { factorio_options: typing.Dict[str, type(Option)] = {
"max_science_pack": MaxSciencePack, "max_science_pack": MaxSciencePack,
"goal": Goal, "goal": Goal,
@ -353,5 +358,6 @@ factorio_options: typing.Dict[str, type(Option)] = {
"evolution_traps": EvolutionTrapCount, "evolution_traps": EvolutionTrapCount,
"attack_traps": AttackTrapCount, "attack_traps": AttackTrapCount,
"evolution_trap_increase": EvolutionTrapIncrease, "evolution_trap_increase": EvolutionTrapIncrease,
"death_link": DeathLink "death_link": DeathLink,
"energy_link": EnergyLink
} }

View File

@ -11,7 +11,8 @@ TRAP_EVO_FACTOR = {{ evolution_trap_increase }} / 100
MAX_SCIENCE_PACK = {{ max_science_pack }} MAX_SCIENCE_PACK = {{ max_science_pack }}
GOAL = {{ goal }} GOAL = {{ goal }}
ARCHIPELAGO_DEATH_LINK_SETTING = "archipelago-death-link-{{ slot_player }}-{{ seed_name }}" ARCHIPELAGO_DEATH_LINK_SETTING = "archipelago-death-link-{{ slot_player }}-{{ seed_name }}"
ENERGY_INCREMENT = 0 ENERGY_INCREMENT = {{ energy_link * 1000000 }}
ENERGY_LINK_EFFICIENCY = 0.75
if settings.global[ARCHIPELAGO_DEATH_LINK_SETTING].value then if settings.global[ARCHIPELAGO_DEATH_LINK_SETTING].value then
DEATH_LINK = 1 DEATH_LINK = 1
@ -24,9 +25,6 @@ CURRENTLY_DEATH_LOCK = 0
function on_check_energy_link(event) function on_check_energy_link(event)
--- assuming 1 MJ increment and 5MJ battery: --- assuming 1 MJ increment and 5MJ battery:
--- first 2 MJ request fill, last 2 MJ push energy, middle 1 MJ does nothing --- first 2 MJ request fill, last 2 MJ push energy, middle 1 MJ does nothing
if event.tick == 0 then
ENERGY_INCREMENT = game.entity_prototypes["ap-energy-bridge"].electric_energy_source_prototype.buffer_capacity / 5
end
if event.tick % 60 == 30 then if event.tick % 60 == 30 then
local surface = game.get_surface(1) local surface = game.get_surface(1)
local force = "player" local force = "player"
@ -39,7 +37,7 @@ function on_check_energy_link(event)
if global.forcedata[force].energy < ENERGY_INCREMENT * bridgecount * 5 then if global.forcedata[force].energy < ENERGY_INCREMENT * bridgecount * 5 then
for i, bridge in ipairs(bridges) do for i, bridge in ipairs(bridges) do
if bridge.energy > ENERGY_INCREMENT*3 then if bridge.energy > ENERGY_INCREMENT*3 then
global.forcedata[force].energy = global.forcedata[force].energy + ENERGY_INCREMENT global.forcedata[force].energy = (global.forcedata[force].energy + ENERGY_INCREMENT) * ENERGY_LINK_EFFICIENCY
bridge.energy = bridge.energy - ENERGY_INCREMENT bridge.energy = bridge.energy - ENERGY_INCREMENT
end end
end end
@ -55,7 +53,9 @@ function on_check_energy_link(event)
end end
end end
end end
script.on_event(defines.events.on_tick, on_check_energy_link) if (ENERGY_INCREMENT) then
script.on_event(defines.events.on_tick, on_check_energy_link)
end
{% if not imported_blueprints -%} {% if not imported_blueprints -%}
function set_permissions() function set_permissions()
@ -557,7 +557,6 @@ end)
commands.add_command("ap-rcon-info", "Used by the Archipelago client to get information", function(call) commands.add_command("ap-rcon-info", "Used by the Archipelago client to get information", function(call)
ENERGY_INCREMENT = game.entity_prototypes["ap-energy-bridge"].electric_energy_source_prototype.buffer_capacity / 5
rcon.print(game.table_to_json({ rcon.print(game.table_to_json({
["slot_name"] = SLOT_NAME, ["slot_name"] = SLOT_NAME,
["seed_name"] = SEED_NAME, ["seed_name"] = SEED_NAME,

View File

@ -3,7 +3,7 @@ local energy_bridge = table.deepcopy(data.raw["accumulator"]["accumulator"])
energy_bridge.name = "ap-energy-bridge" energy_bridge.name = "ap-energy-bridge"
energy_bridge.minable.result = "ap-energy-bridge" energy_bridge.minable.result = "ap-energy-bridge"
energy_bridge.localised_name = "Archipelago EnergyLink Bridge" energy_bridge.localised_name = "Archipelago EnergyLink Bridge"
energy_bridge.energy_source.buffer_capacity = "10MJ" energy_bridge.energy_source.buffer_capacity = "5MJ"
energy_bridge.energy_source.input_flow_limit = "1MW" energy_bridge.energy_source.input_flow_limit = "1MW"
energy_bridge.energy_source.output_flow_limit = "1MW" energy_bridge.energy_source.output_flow_limit = "1MW"
data.raw["accumulator"]["ap-energy-bridge"] = energy_bridge data.raw["accumulator"]["ap-energy-bridge"] = energy_bridge
@ -19,7 +19,7 @@ energy_bridge_recipe.name = "ap-energy-bridge"
energy_bridge_recipe.result = energy_bridge_item.name energy_bridge_recipe.result = energy_bridge_item.name
energy_bridge_recipe.energy_required = 1 energy_bridge_recipe.energy_required = 1
energy_bridge_recipe.ingredients = { {# {type="item", name="iron-plate", amount=1} TODO: randomized recipe #} } energy_bridge_recipe.ingredients = { {# {type="item", name="iron-plate", amount=1} TODO: randomized recipe #} }
energy_bridge_recipe.enabled = true energy_bridge_recipe.enabled = {{ energy_link }}
energy_bridge_recipe.localised_name = "Archipelago EnergyLink Bridge" energy_bridge_recipe.localised_name = "Archipelago EnergyLink Bridge"
data.raw["recipe"]["ap-energy-bridge"] = energy_bridge_recipe data.raw["recipe"]["ap-energy-bridge"] = energy_bridge_recipe