diff --git a/distance_logging.py b/distance_logging.py new file mode 100644 index 00000000..5eb62ef4 --- /dev/null +++ b/distance_logging.py @@ -0,0 +1,59 @@ + +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: + logger.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() + logger.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