From e0c423d57d696a2c04d0a23d8455ac4c9a178738 Mon Sep 17 00:00:00 2001 From: MrTyton Date: Sun, 13 Nov 2022 00:37:22 -0500 Subject: [PATCH 1/3] Distance Logging and Filesave Fix Adds in watcher for distance logging, as well as initial results file. The distance log is calculated with the "optimal" movements, meaning no additional farming required for anything and swimmer NEA. Bugfix to saves so that things get got with the new set of saves and non-nemesis. Bugfix to reset that could happen on boat, but shouldn't ever happen. --- distance_logging.py | 61 +++++++++++++++++++++++++++++ json_ai_files/distance_logging.json | 1 + load_game.py | 20 +++++----- main.py | 9 +---- memory/main.py | 14 ++++--- 5 files changed, 83 insertions(+), 22 deletions(-) create mode 100644 distance_logging.py create mode 100644 json_ai_files/distance_logging.json diff --git a/distance_logging.py b/distance_logging.py new file mode 100644 index 00000000..c32f4b8e --- /dev/null +++ b/distance_logging.py @@ -0,0 +1,61 @@ + +from gamestate import game +from collections import defaultdict +from gamestate import game + +import memory +import vars +import threading +import logging +import json +import time + +logger = logging.getLogger(__name__) + + +game_vars = vars.vars_handle() + +def perform_distance_logging(): + distances = {} + + def _update(distance_travelled, location, zone): + if location in distances: + cur_loc = distances[location] + else: + cur_loc = {} + if zone not in cur_loc: + cur_loc[zone] = 0 + cur_loc[zone] += distance_travelled + distances[location] = cur_loc + logger.manip(f"Updated {location} - {zone} to {cur_loc[zone]}") + + def _monitor(): + distance_travelled = 0 + location = -1 + zone = -1 + previously_added = -1 + last_updated_map_time = time.time() + while not (game.state == "Sin" and game.step == 4): + new_travelled = memory.main.total_distance_travelled() + if (not new_travelled) or (memory.main.get_map() != location) or (memory.main.get_zone() != zone): + if not distance_travelled or (distance_travelled == previously_added): + pass + else: + logging.manip(f"Adding {distance_travelled}") + _update(distance_travelled, location, zone) + previously_added = distance_travelled + distance_travelled = new_travelled + # The map updates faster than the steps reset to 0 on screen transition, so we need a bit of a delay. + if (time.time() - last_updated_map_time >= 1): + location = memory.main.get_map() + last_updated_map_time = time.time() + zone = memory.main.get_zone() + logging.manip("Done logging distances.") + # write_everything + with open("./json_ai_files/distance_logging.json", "w") as fp: + json.dump(distances, fp) + return + + monitoring = threading.Thread(target=_monitor, daemon=True) + monitoring.start() + return monitoring \ No newline at end of file diff --git a/json_ai_files/distance_logging.json b/json_ai_files/distance_logging.json new file mode 100644 index 00000000..a4d5508a --- /dev/null +++ b/json_ai_files/distance_logging.json @@ -0,0 +1 @@ +{"71": {"0": 215.02772521972656}, "288": {"0": 651.0842590332031}, "41": {"0": 1414.7367553710938}, "22": {"0": 407.29345703125}, "18": {"0": 3132.0282440185547}, "95": {"0": 1468.5615844726562}, "120": {"0": 1017.9033203125}, "127": {"0": 2625.9536743164062}, "115": {"1": 1236.9472351074219}, "116": {"1": 729.8141536712646}, "79": {"0": 664.4529266357422}, "92": {"0": 2783.9503326416016}, "128": {"0": 3018.916534423828}, "93": {"0": 879.0300064086914, "1": 1596.58447265625}, "75": {"0": 3196.674758911133}, "97": {"0": 863.9864959716797}, "140": {"0": 2244.8383827209473}, "162": {"0": 2373.92032623291}, "110": {"0": 616.3773422241211}, "241": {"0": 1554.4971466064453}, "242": {"0": 1240.1963500976562}, "164": {"0": 417.08199977874756}, "192": {"0": 1290.291877746582}, "136": {"0": 2375.9225540161133}, "137": {"0": 1579.1166076660156, "1": 777.586181640625}, "138": {"0": 1287.9697570800781}, "280": {"0": 189.7969207763672}, "265": {"0": 256.5383605957031}, "351": {"0": 105.0890121459961}, "198": {"0": 570.9893188476562, "1": 1008.4601745605469}, "209": {"0": 665.9271240234375}, "208": {"0": 1030.4814758300781}, "223": {"0": 4740.568206787109}, "266": {"0": 145.4811248779297}, "56": {"0": 1197.9669799804688, "2": 1447.8811950683594}} \ No newline at end of file diff --git a/load_game.py b/load_game.py index 4f272952..eabf2ee3 100644 --- a/load_game.py +++ b/load_game.py @@ -70,19 +70,20 @@ def load_into_game(gamestate: str, step_counter: str): nemesis = key if save_num > 200: pass - elif nemesis == str(game_vars.nemesis()): + else: logger.debug(f"Found save {save_num}") save_num_conf = save_num - nemesis_conf = nemesis blitz_win = results[gamestate][step_counter][key]["blitz_win_value"] end_ver = results[gamestate][step_counter][key]["end_game_version_val"] - nea_zone = results[gamestate][step_counter][key]["nea_zone"] - nem_ap = results[gamestate][step_counter][key]["nem_ap_val"] - spec_move = results[gamestate][step_counter][key]["special_movement"] logger.debug(f"Blitz Win {blitz_win}") logger.debug(f"End game version {end_ver}") - logger.debug(f"NEA zone {nea_zone}") - logger.debug(f"Nemesis checkpoint {nem_ap}") + if nemesis == str(game_vars.nemesis()): + nemesis_conf = nemesis + nea_zone = results[gamestate][step_counter][key]["nea_zone"] + nem_ap = results[gamestate][step_counter][key]["nem_ap_val"] + spec_move = results[gamestate][step_counter][key]["special_movement"] + logger.debug(f"NEA zone {nea_zone}") + logger.debug(f"Nemesis checkpoint {nem_ap}") if save_num_conf == 0: logger.debug("Failure 2") @@ -93,8 +94,9 @@ def load_into_game(gamestate: str, step_counter: str): load_save_num(int(save_num_conf)) game_vars.set_blitz_win(value=(blitz_win == "True")) game_vars.end_game_version_set(value=int(end_ver)) - game_vars.set_nea_zone(value=int(nea_zone)) - game_vars.set_nem_checkpoint_ap(value=int(nem_ap)) + if nemesis == str(game_vars.nemesis()): + game_vars.set_nea_zone(value=int(nea_zone)) + game_vars.set_nem_checkpoint_ap(value=int(nem_ap)) if spec_move != "none": logger.debug(f"Special movement needed: {spec_move}") diff --git a/main.py b/main.py index e3fde801..ded6915e 100644 --- a/main.py +++ b/main.py @@ -35,6 +35,7 @@ import battle.main import blitz import config +import distance_logging import load_game import logs import memory.main @@ -242,13 +243,7 @@ def perform_TAS(): if game.step == 3: area.besaid.leaving() game.state = "Boat1" - if memory.main.get_tidus_slvl() < 3: - logger.warning("=========================") - logger.warning("=== Under-levelled!!! ===") - logger.warning("=========================") - game.state, game.step = reset.mid_run_reset() - else: - game.step = 1 + game.step = 1 if game.state == "Boat1": area.boats.ss_liki() diff --git a/memory/main.py b/memory/main.py index 8b3f0362..43989db6 100644 --- a/memory/main.py +++ b/memory/main.py @@ -1521,12 +1521,10 @@ def get_story_progress(): def get_map(): global base_value - key = base_value + 0x00D2CA90 progress = process.read_bytes(key, 2) return progress - def touching_save_sphere(): global base_value @@ -2711,14 +2709,18 @@ def blitz_cursor(): return cursor -# ------------------------------ -# Function for logging -def read_bytes(key, size): - return process.read_bytes(key, size) +# ------------------------------ +# Function for logging +def total_distance_travelled(): + return float_from_integer(read_val(0x00D2A9DC, 4)) + +def get_zone(): + return read_val(0x00D2CAA0, 2) + # ------------------------------ # Equipment array From 82516b320902c66e986b3066ca30f0a0e782155b Mon Sep 17 00:00:00 2001 From: MrTyton Date: Sun, 13 Nov 2022 00:38:56 -0500 Subject: [PATCH 2/3] Cleanup imports --- distance_logging.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/distance_logging.py b/distance_logging.py index c32f4b8e..02265211 100644 --- a/distance_logging.py +++ b/distance_logging.py @@ -1,6 +1,4 @@ -from gamestate import game -from collections import defaultdict from gamestate import game import memory From e3060c2ee635ec53d9aaa9dc0530efa73d147638 Mon Sep 17 00:00:00 2001 From: MrTyton Date: Sun, 13 Nov 2022 16:59:24 -0500 Subject: [PATCH 3/3] Update distance_logging.py --- distance_logging.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/distance_logging.py b/distance_logging.py index 02265211..5eb62ef4 100644 --- a/distance_logging.py +++ b/distance_logging.py @@ -39,7 +39,7 @@ def _monitor(): if not distance_travelled or (distance_travelled == previously_added): pass else: - logging.manip(f"Adding {distance_travelled}") + logger.manip(f"Adding {distance_travelled}") _update(distance_travelled, location, zone) previously_added = distance_travelled distance_travelled = new_travelled @@ -48,7 +48,7 @@ def _monitor(): location = memory.main.get_map() last_updated_map_time = time.time() zone = memory.main.get_zone() - logging.manip("Done logging distances.") + logger.manip("Done logging distances.") # write_everything with open("./json_ai_files/distance_logging.json", "w") as fp: json.dump(distances, fp)