diff --git a/FactorioClientGUI.py b/FactorioClientGUI.py index a2bc5806..d4f4bf19 100644 --- a/FactorioClientGUI.py +++ b/FactorioClientGUI.py @@ -1,5 +1,6 @@ import os import logging + os.makedirs("logs", exist_ok=True) logging.basicConfig(format='[%(name)s]: %(message)s', level=logging.INFO) logging.getLogger().addHandler(logging.FileHandler(os.path.join("logs", "FactorioClient.txt"), "w")) @@ -7,7 +8,6 @@ os.environ["KIVY_NO_CONSOLELOG"] = "1" os.environ["KIVY_NO_FILELOG"] = "1" os.environ["KIVY_NO_ARGS"] = "1" - import asyncio from CommonClient import server_loop, logger from FactorioClient import FactorioContext, factorio_server_watcher @@ -21,7 +21,7 @@ async def main(): ui_app = FactorioManager(ctx) ui_task = asyncio.create_task(ui_app.async_run(), name="UI") - await ctx.exit_event.wait() # wait for signal to exit application + await ctx.exit_event.wait() # wait for signal to exit application ui_app.stop() ctx.server_address = None ctx.snes_reconnect_address = None @@ -35,7 +35,7 @@ async def main(): if ctx.server_task is not None: await ctx.server_task - while ctx.input_requests > 0: # clear queue for shutdown + while ctx.input_requests > 0: # clear queue for shutdown ctx.input_queue.put_nowait(None) ctx.input_requests -= 1 @@ -96,6 +96,7 @@ class FactorioManager(App): except Exception as e: logger.exception(e) + class LogtoUI(logging.Handler): def __init__(self, on_log): super(LogtoUI, self).__init__(logging.DEBUG) @@ -104,6 +105,23 @@ class LogtoUI(logging.Handler): def handle(self, record: logging.LogRecord) -> None: self.on_log(record) + +class UILog(RecycleView): + cols = 1 + + def __init__(self, *loggers_to_handle, **kwargs): + super(UILog, self).__init__(**kwargs) + self.data = [] + for logger in loggers_to_handle: + logger.addHandler(LogtoUI(self.on_log)) + + def on_log(self, record: logging.LogRecord) -> None: + self.data.append({"text": record.getMessage()}) + + def update_text_width(self, *_): + self.message.text_size = (self.message.width * 0.9, None) + + Builder.load_string(''' tab_width: 200 @@ -131,20 +149,6 @@ Builder.load_string(''' spacing: dp(3) ''') -class UILog(RecycleView): - cols = 1 - def __init__(self, *loggers_to_handle, **kwargs): - super(UILog, self).__init__(**kwargs) - self.data = [] - for logger in loggers_to_handle: - logger.addHandler(LogtoUI(self.on_log)) - - def on_log(self, record: logging.LogRecord) -> None: - self.data.append({"text": record.getMessage()}) - - def update_text_width(self, *_): - self.message.text_size = (self.message.width * 0.9, None) - if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main()) diff --git a/worlds/alttp/ItemPool.py b/worlds/alttp/ItemPool.py index 0b83bb91..d03b686b 100644 --- a/worlds/alttp/ItemPool.py +++ b/worlds/alttp/ItemPool.py @@ -241,25 +241,13 @@ def generate_itempool(world, player: int): else: world.push_item(world.get_location('Ganon', player), ItemFactory('Triforce', player), False) - if world.goal[player] in ['triforcehunt', 'localtriforcehunt']: - region = world.get_region('Light World', player) - loc = ALttPLocation(player, "Murahdahla", parent=region) - loc.access_rule = lambda state: state.has_triforce_pieces(state.world.treasure_hunt_count[player], player) - - region.locations.append(loc) - world.dynamic_locations.append(loc) - - world.clear_location_cache() - - world.push_item(loc, ItemFactory('Triforce', player), False) - loc.event = True - loc.locked = True if world.goal[player] == 'icerodhunt': world.progression_balancing[player] = False loc = world.get_location('Turtle Rock - Boss', player) - world.push_item(loc, ItemFactory('Triforce', player), False) + world.push_item(loc, ItemFactory('Triforce Piece', player), False) + world.treasure_hunt_count[player] = 1 if world.boss_shuffle[player] != 'none': if 'turtle rock-' not in world.boss_shuffle[player]: world.boss_shuffle[player] = f'Turtle Rock-Trinexx;{world.boss_shuffle[player]}' @@ -295,6 +283,19 @@ def generate_itempool(world, player: int): for item in itempool: world.push_precollected(ItemFactory(item, player)) + if world.goal[player] in ['triforcehunt', 'localtriforcehunt', 'icerodhunt']: + region = world.get_region('Light World', player) + + loc = ALttPLocation(player, "Murahdahla", parent=region) + loc.access_rule = lambda state: state.has_triforce_pieces(state.world.treasure_hunt_count[player], player) + + region.locations.append(loc) + world.dynamic_locations.append(loc) + world.clear_location_cache() + + world.push_item(loc, ItemFactory('Triforce', player), False) + loc.event = True + loc.locked = True world.get_location('Ganon', player).event = True world.get_location('Ganon', player).locked = True diff --git a/worlds/alttp/Rom.py b/worlds/alttp/Rom.py index 5a426d6d..92ed48f4 100644 --- a/worlds/alttp/Rom.py +++ b/worlds/alttp/Rom.py @@ -2337,9 +2337,13 @@ def write_strings(rom, world, player, team): tt['sign_ganon'] = f'You need {world.crystals_needed_for_ganon[player]} crystals to beat Ganon and ' \ f'have beaten Agahnim atop Ganons Tower' elif world.goal[player] == "icerodhunt": - tt['sign_ganon'] = 'Go find the Ice Rod and Kill Trinexx... Ganon is invincible!' + tt['sign_ganon'] = 'Go find the Ice Rod and Kill Trinexx, then talk to Murahdahla... Ganon is invincible!' tt['ganon_fall_in_alt'] = 'Why are you even here?\n You can\'t even hurt me! Go kill Trinexx instead.' tt['ganon_phase_3_alt'] = 'Seriously? Go Away, I will not Die.' + tt['murahdahla'] = "Hello @. I\nam Murahdahla, brother of\nSahasrahla and Aginah. Behold the power of\n" \ + "invisibility.\n\n\n\n… … …\n\nWait! you can see me? I knew I should have\n" \ + "hidden in a hollow tree. " \ + "If you bring me the Triforce piece from Turtle Rock, I can reassemble it." else: if world.crystals_needed_for_ganon[player] == 1: tt['sign_ganon'] = 'You need a crystal to beat Ganon.' @@ -2354,7 +2358,7 @@ def write_strings(rom, world, player, team): tt['sahasrahla_quest_have_master_sword'] = Sahasrahla2_texts[local_random.randint(0, len(Sahasrahla2_texts) - 1)] tt['blind_by_the_light'] = Blind_texts[local_random.randint(0, len(Blind_texts) - 1)] - if world.goal[player] in ['triforcehunt', 'localtriforcehunt']: + if world.goal[player] in ['triforcehunt', 'localtriforcehunt', 'icerodhunt']: tt['ganon_fall_in_alt'] = 'Why are you even here?\n You can\'t even hurt me! Get the Triforce Pieces.' tt['ganon_phase_3_alt'] = 'Seriously? Go Away, I will not Die.' if world.goal[player] == 'triforcehunt' and world.players > 1: @@ -2364,12 +2368,12 @@ def write_strings(rom, world, player, team): if world.treasure_hunt_count[player] > 1: tt['murahdahla'] = "Hello @. I\nam Murahdahla, brother of\nSahasrahla and Aginah. Behold the power of\n" \ "invisibility.\n\n\n\n… … …\n\nWait! you can see me? I knew I should have\n" \ - "hidden in a hollow tree. If you bring\n%d triforce pieces out of %d, I can reassemble it." % \ + "hidden in a hollow tree. If you bring\n%d Triforce pieces out of %d, I can reassemble it." % \ (world.treasure_hunt_count[player], world.triforce_pieces_available[player]) else: tt['murahdahla'] = "Hello @. I\nam Murahdahla, brother of\nSahasrahla and Aginah. Behold the power of\n" \ "invisibility.\n\n\n\n… … …\n\nWait! you can see me? I knew I should have\n" \ - "hidden in a hollow tree. If you bring\n%d triforce piece out of %d, I can reassemble it." % \ + "hidden in a hollow tree. If you bring\n%d Triforce piece out of %d, I can reassemble it." % \ (world.treasure_hunt_count[player], world.triforce_pieces_available[player]) elif world.goal[player] in ['pedestal']: tt['ganon_fall_in_alt'] = 'Why are you even here?\n You can\'t even hurt me! Your goal is at the pedestal.'