Prevent logical lockout from Pedestal/Pyramid Fairy in ice rod hunt
This commit is contained in:
parent
573931930c
commit
aa6f65ee1f
|
@ -1,5 +1,6 @@
|
||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
os.makedirs("logs", exist_ok=True)
|
os.makedirs("logs", exist_ok=True)
|
||||||
logging.basicConfig(format='[%(name)s]: %(message)s', level=logging.INFO)
|
logging.basicConfig(format='[%(name)s]: %(message)s', level=logging.INFO)
|
||||||
logging.getLogger().addHandler(logging.FileHandler(os.path.join("logs", "FactorioClient.txt"), "w"))
|
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_FILELOG"] = "1"
|
||||||
os.environ["KIVY_NO_ARGS"] = "1"
|
os.environ["KIVY_NO_ARGS"] = "1"
|
||||||
|
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
from CommonClient import server_loop, logger
|
from CommonClient import server_loop, logger
|
||||||
from FactorioClient import FactorioContext, factorio_server_watcher
|
from FactorioClient import FactorioContext, factorio_server_watcher
|
||||||
|
@ -21,7 +21,7 @@ async def main():
|
||||||
ui_app = FactorioManager(ctx)
|
ui_app = FactorioManager(ctx)
|
||||||
ui_task = asyncio.create_task(ui_app.async_run(), name="UI")
|
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()
|
ui_app.stop()
|
||||||
ctx.server_address = None
|
ctx.server_address = None
|
||||||
ctx.snes_reconnect_address = None
|
ctx.snes_reconnect_address = None
|
||||||
|
@ -35,7 +35,7 @@ async def main():
|
||||||
if ctx.server_task is not None:
|
if ctx.server_task is not None:
|
||||||
await ctx.server_task
|
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_queue.put_nowait(None)
|
||||||
ctx.input_requests -= 1
|
ctx.input_requests -= 1
|
||||||
|
|
||||||
|
@ -96,6 +96,7 @@ class FactorioManager(App):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception(e)
|
logger.exception(e)
|
||||||
|
|
||||||
|
|
||||||
class LogtoUI(logging.Handler):
|
class LogtoUI(logging.Handler):
|
||||||
def __init__(self, on_log):
|
def __init__(self, on_log):
|
||||||
super(LogtoUI, self).__init__(logging.DEBUG)
|
super(LogtoUI, self).__init__(logging.DEBUG)
|
||||||
|
@ -104,6 +105,23 @@ class LogtoUI(logging.Handler):
|
||||||
def handle(self, record: logging.LogRecord) -> None:
|
def handle(self, record: logging.LogRecord) -> None:
|
||||||
self.on_log(record)
|
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('''
|
Builder.load_string('''
|
||||||
<TabbedPanel>
|
<TabbedPanel>
|
||||||
tab_width: 200
|
tab_width: 200
|
||||||
|
@ -131,20 +149,6 @@ Builder.load_string('''
|
||||||
spacing: dp(3)
|
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__':
|
if __name__ == '__main__':
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
loop.run_until_complete(main())
|
loop.run_until_complete(main())
|
||||||
|
|
|
@ -241,25 +241,13 @@ def generate_itempool(world, player: int):
|
||||||
else:
|
else:
|
||||||
world.push_item(world.get_location('Ganon', player), ItemFactory('Triforce', player), False)
|
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':
|
if world.goal[player] == 'icerodhunt':
|
||||||
world.progression_balancing[player] = False
|
world.progression_balancing[player] = False
|
||||||
loc = world.get_location('Turtle Rock - Boss', player)
|
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 world.boss_shuffle[player] != 'none':
|
||||||
if 'turtle rock-' not in world.boss_shuffle[player]:
|
if 'turtle rock-' not in world.boss_shuffle[player]:
|
||||||
world.boss_shuffle[player] = f'Turtle Rock-Trinexx;{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:
|
for item in itempool:
|
||||||
world.push_precollected(ItemFactory(item, player))
|
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).event = True
|
||||||
world.get_location('Ganon', player).locked = True
|
world.get_location('Ganon', player).locked = True
|
||||||
|
|
|
@ -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 ' \
|
tt['sign_ganon'] = f'You need {world.crystals_needed_for_ganon[player]} crystals to beat Ganon and ' \
|
||||||
f'have beaten Agahnim atop Ganons Tower'
|
f'have beaten Agahnim atop Ganons Tower'
|
||||||
elif world.goal[player] == "icerodhunt":
|
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_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['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:
|
else:
|
||||||
if world.crystals_needed_for_ganon[player] == 1:
|
if world.crystals_needed_for_ganon[player] == 1:
|
||||||
tt['sign_ganon'] = 'You need a crystal to beat Ganon.'
|
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['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)]
|
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_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.'
|
tt['ganon_phase_3_alt'] = 'Seriously? Go Away, I will not Die.'
|
||||||
if world.goal[player] == 'triforcehunt' and world.players > 1:
|
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:
|
if world.treasure_hunt_count[player] > 1:
|
||||||
tt['murahdahla'] = "Hello @. I\nam Murahdahla, brother of\nSahasrahla and Aginah. Behold the power of\n" \
|
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" \
|
"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])
|
(world.treasure_hunt_count[player], world.triforce_pieces_available[player])
|
||||||
else:
|
else:
|
||||||
tt['murahdahla'] = "Hello @. I\nam Murahdahla, brother of\nSahasrahla and Aginah. Behold the power of\n" \
|
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" \
|
"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])
|
(world.treasure_hunt_count[player], world.triforce_pieces_available[player])
|
||||||
elif world.goal[player] in ['pedestal']:
|
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.'
|
tt['ganon_fall_in_alt'] = 'Why are you even here?\n You can\'t even hurt me! Your goal is at the pedestal.'
|
||||||
|
|
Loading…
Reference in New Issue