Skip to content

Distance Logging and Filesave Fix #254

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Nov 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions distance_logging.py
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions json_ai_files/distance_logging.json
Original file line number Diff line number Diff line change
@@ -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}}
20 changes: 11 additions & 9 deletions load_game.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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}")
Expand Down
9 changes: 2 additions & 7 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import battle.main
import blitz
import config
import distance_logging
import load_game
import logs
import memory.main
Expand Down Expand Up @@ -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()
Expand Down
14 changes: 8 additions & 6 deletions memory/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down