fix Factorio Recipe Time randomization not being deterministic
This commit is contained in:
parent
278f40471b
commit
760fb32016
|
@ -18,7 +18,7 @@ class AdjusterWorld(object):
|
||||||
def __init__(self, sprite_pool):
|
def __init__(self, sprite_pool):
|
||||||
import random
|
import random
|
||||||
self.sprite_pool = {1: sprite_pool}
|
self.sprite_pool = {1: sprite_pool}
|
||||||
self.rom_seeds = {1: random}
|
self.slot_seeds = {1: random}
|
||||||
|
|
||||||
|
|
||||||
class ArgumentDefaultsHelpFormatter(argparse.RawTextHelpFormatter):
|
class ArgumentDefaultsHelpFormatter(argparse.RawTextHelpFormatter):
|
||||||
|
|
4
Main.py
4
Main.py
|
@ -130,8 +130,8 @@ def main(args, seed=None):
|
||||||
setattr(world, option, getattr(args, option, {}))
|
setattr(world, option, getattr(args, option, {}))
|
||||||
world.glitch_triforce = args.glitch_triforce # This is enabled/disabled globally, no per player option.
|
world.glitch_triforce = args.glitch_triforce # This is enabled/disabled globally, no per player option.
|
||||||
|
|
||||||
world.rom_seeds = {player: random.Random(world.random.randint(0, 999999999)) for player in
|
world.slot_seeds = {player: random.Random(world.random.randint(0, 999999999)) for player in
|
||||||
range(1, world.players + 1)}
|
range(1, world.players + 1)}
|
||||||
|
|
||||||
for player in range(1, world.players + 1):
|
for player in range(1, world.players + 1):
|
||||||
world.er_seeds[player] = str(world.random.randint(0, 2 ** 64))
|
world.er_seeds[player] = str(world.random.randint(0, 2 ** 64))
|
||||||
|
|
|
@ -80,7 +80,7 @@ class LocalRom(object):
|
||||||
self.write_bytes(startaddress + i, bytearray(data))
|
self.write_bytes(startaddress + i, bytearray(data))
|
||||||
|
|
||||||
def encrypt(self, world, player):
|
def encrypt(self, world, player):
|
||||||
local_random = world.rom_seeds[player]
|
local_random = world.slot_seeds[player]
|
||||||
key = bytes(local_random.getrandbits(8 * 16).to_bytes(16, 'big'))
|
key = bytes(local_random.getrandbits(8 * 16).to_bytes(16, 'big'))
|
||||||
self.write_bytes(0x1800B0, bytearray(key))
|
self.write_bytes(0x1800B0, bytearray(key))
|
||||||
self.write_int16(0x180087, 1)
|
self.write_int16(0x180087, 1)
|
||||||
|
@ -384,7 +384,7 @@ def patch_enemizer(world, team: int, player: int, rom: LocalRom, enemizercli):
|
||||||
|
|
||||||
max_enemizer_tries = 5
|
max_enemizer_tries = 5
|
||||||
for i in range(max_enemizer_tries):
|
for i in range(max_enemizer_tries):
|
||||||
enemizer_seed = str(world.rom_seeds[player].randint(0, 999999999))
|
enemizer_seed = str(world.slot_seeds[player].randint(0, 999999999))
|
||||||
enemizer_command = [os.path.abspath(enemizercli),
|
enemizer_command = [os.path.abspath(enemizercli),
|
||||||
'--rom', randopatch_path,
|
'--rom', randopatch_path,
|
||||||
'--seed', enemizer_seed,
|
'--seed', enemizer_seed,
|
||||||
|
@ -414,7 +414,7 @@ def patch_enemizer(world, team: int, player: int, rom: LocalRom, enemizercli):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
for j in range(i + 1, max_enemizer_tries):
|
for j in range(i + 1, max_enemizer_tries):
|
||||||
world.rom_seeds[player].randint(0, 999999999)
|
world.slot_seeds[player].randint(0, 999999999)
|
||||||
# Sacrifice all remaining random numbers that would have been used for unused enemizer tries.
|
# Sacrifice all remaining random numbers that would have been used for unused enemizer tries.
|
||||||
# This allows for future enemizer bug fixes to NOT affect the rest of the seed's randomness
|
# This allows for future enemizer bug fixes to NOT affect the rest of the seed's randomness
|
||||||
break
|
break
|
||||||
|
@ -760,7 +760,7 @@ def get_nonnative_item_sprite(game):
|
||||||
return game_to_id.get(game, 0x6B) # default to Power Star
|
return game_to_id.get(game, 0x6B) # default to Power Star
|
||||||
|
|
||||||
def patch_rom(world, rom, player, team, enemized):
|
def patch_rom(world, rom, player, team, enemized):
|
||||||
local_random = world.rom_seeds[player]
|
local_random = world.slot_seeds[player]
|
||||||
|
|
||||||
# progressive bow silver arrow hint hack
|
# progressive bow silver arrow hint hack
|
||||||
prog_bow_locs = world.find_items('Progressive Bow', player)
|
prog_bow_locs = world.find_items('Progressive Bow', player)
|
||||||
|
@ -1643,7 +1643,7 @@ def patch_rom(world, rom, player, team, enemized):
|
||||||
rom.write_byte(0xFEE41, 0x2A) # preopen bombable exit
|
rom.write_byte(0xFEE41, 0x2A) # preopen bombable exit
|
||||||
|
|
||||||
if world.tile_shuffle[player]:
|
if world.tile_shuffle[player]:
|
||||||
tile_set = TileSet.get_random_tile_set(world.rom_seeds[player])
|
tile_set = TileSet.get_random_tile_set(world.slot_seeds[player])
|
||||||
rom.write_byte(0x4BA21, tile_set.get_speed())
|
rom.write_byte(0x4BA21, tile_set.get_speed())
|
||||||
rom.write_byte(0x4BA1D, tile_set.get_len())
|
rom.write_byte(0x4BA1D, tile_set.get_len())
|
||||||
rom.write_bytes(0x4BA2A, tile_set.get_bytes())
|
rom.write_bytes(0x4BA2A, tile_set.get_bytes())
|
||||||
|
@ -1774,7 +1774,7 @@ def hud_format_text(text):
|
||||||
def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, sprite: str, palettes_options,
|
def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, sprite: str, palettes_options,
|
||||||
world=None, player=1, allow_random_on_event=False, reduceflashing=False,
|
world=None, player=1, allow_random_on_event=False, reduceflashing=False,
|
||||||
triforcehud: str = None):
|
triforcehud: str = None):
|
||||||
local_random = random if not world else world.rom_seeds[player]
|
local_random = random if not world else world.slot_seeds[player]
|
||||||
|
|
||||||
# enable instant item menu
|
# enable instant item menu
|
||||||
if fastmenu == 'instant':
|
if fastmenu == 'instant':
|
||||||
|
@ -2091,7 +2091,7 @@ def write_string_to_rom(rom, target, string):
|
||||||
|
|
||||||
|
|
||||||
def write_strings(rom, world, player, team):
|
def write_strings(rom, world, player, team):
|
||||||
local_random = world.rom_seeds[player]
|
local_random = world.slot_seeds[player]
|
||||||
|
|
||||||
tt = TextTable()
|
tt = TextTable()
|
||||||
tt.removeUnwantedText()
|
tt.removeUnwantedText()
|
||||||
|
|
|
@ -74,7 +74,7 @@ def generate_mod(world: MultiWorld, player: int):
|
||||||
"rocket_recipe": rocket_recipes[world.max_science_pack[player].value],
|
"rocket_recipe": rocket_recipes[world.max_science_pack[player].value],
|
||||||
"slot_name": world.player_names[player][0], "seed_name": world.seed_name,
|
"slot_name": world.player_names[player][0], "seed_name": world.seed_name,
|
||||||
"starting_items": world.starting_items[player], "recipes": recipes,
|
"starting_items": world.starting_items[player], "recipes": recipes,
|
||||||
"random": world.random,
|
"random": world.slot_seeds[player],
|
||||||
"recipe_time_scale": recipe_time_scales[world.recipe_time[player].value]}
|
"recipe_time_scale": recipe_time_scales[world.recipe_time[player].value]}
|
||||||
|
|
||||||
for factorio_option in Options.factorio_options:
|
for factorio_option in Options.factorio_options:
|
||||||
|
|
|
@ -20,7 +20,7 @@ def get_mc_data(world: MultiWorld, player: int):
|
||||||
exits = ["Overworld Structure 1", "Overworld Structure 2", "Nether Structure 1", "Nether Structure 2",
|
exits = ["Overworld Structure 1", "Overworld Structure 2", "Nether Structure 1", "Nether Structure 2",
|
||||||
"The End Structure"]
|
"The End Structure"]
|
||||||
return {
|
return {
|
||||||
'world_seed': Random(world.rom_seeds[player]).getrandbits(32),
|
'world_seed': world.slot_seeds[player].getrandbits(32),
|
||||||
# consistent and doesn't interfere with other generation
|
# consistent and doesn't interfere with other generation
|
||||||
'seed_name': world.seed_name,
|
'seed_name': world.seed_name,
|
||||||
'player_name': world.get_player_names(player),
|
'player_name': world.get_player_names(player),
|
||||||
|
|
Loading…
Reference in New Issue