Mark
/
celeste-ai
Archived
1
0
Fork 0

Compare commits

...

2 Commits

Author SHA1 Message Date
Mark f40b58508e
Added fruit status 2023-02-24 22:17:45 -08:00
Mark dc8f0ace68
Added screenshot_source 2023-02-24 21:56:37 -08:00
3 changed files with 34 additions and 5 deletions

View File

@ -28,6 +28,9 @@ class CelesteState(NamedTuple):
# Number of deaths since game start # Number of deaths since game start
deaths: int deaths: int
# If an index is true, we got a strawberry on that stage.
berries: list[bool]
# Distance to next point # Distance to next point
dist: float dist: float
@ -223,6 +226,7 @@ class Celeste:
xvel = float(self._internal_state["vx"]), xvel = float(self._internal_state["vx"]),
yvel = float(self._internal_state["vy"]), yvel = float(self._internal_state["vy"]),
deaths = int(self._internal_state["dc"]), deaths = int(self._internal_state["dc"]),
berries = [x == "t" for x in self._internal_state["fr"][1:]],
dist = self._dist, dist = self._dist,
next_point = self._next_checkpoint_idx, next_point = self._next_checkpoint_idx,

View File

@ -15,6 +15,10 @@ if __name__ == "__main__":
# Where to read/write model data. # Where to read/write model data.
model_data_root = Path("model_data/current") model_data_root = Path("model_data/current")
# Where PICO-8 saves screenshots.
# Probably your desktop.
screenshot_source = Path("/home/mark/Desktop")
model_save_path = model_data_root / "model.torch" model_save_path = model_data_root / "model.torch"
model_archive_dir = model_data_root / "model_archive" model_archive_dir = model_data_root / "model_archive"
model_train_log = model_data_root / "train_log" model_train_log = model_data_root / "train_log"
@ -25,7 +29,7 @@ if __name__ == "__main__":
# Remove old screenshots # Remove old screenshots
shots = Path("/home/mark/Desktop").glob("hackcel_*.png") shots = screenshot_source.glob("hackcel_*.png")
for s in shots: for s in shots:
s.unlink() s.unlink()
@ -280,8 +284,6 @@ def optimize_model():
def on_state_before(celeste): def on_state_before(celeste):
global steps_done global steps_done
# Conversion to pytorch
state = celeste.state state = celeste.state
pt_state = torch.tensor( pt_state = torch.tensor(
@ -347,7 +349,7 @@ def on_state_after(celeste, before_out):
pt_next_state = None pt_next_state = None
reward = 0 reward = 0
# Reward for finishing stage # Reward for finishing a stage
elif next_state.stage >= 1: elif next_state.stage >= 1:
finished_stage = True finished_stage = True
reward = next_state.next_point - state.next_point reward = next_state.next_point - state.next_point
@ -370,6 +372,7 @@ def on_state_after(celeste, before_out):
if state.next_point == next_state.next_point: if state.next_point == next_state.next_point:
reward = 0 reward = 0
else: else:
print(f"Got point {state.next_point}")
# Reward for reaching a point # Reward for reaching a point
reward = next_state.next_point - state.next_point reward = next_state.next_point - state.next_point
@ -377,6 +380,14 @@ def on_state_after(celeste, before_out):
for i in range(state.next_point, state.next_point + reward): for i in range(state.next_point, state.next_point + reward):
point_counter[i] += 1 point_counter[i] += 1
# Strawberry reward
if next_state.berries[state.stage] and not state.berries[state.stage]:
print(f"Got stage {state.stage} bonus")
reward += 1
reward = reward * 10 reward = reward * 10
pt_reward = torch.tensor([reward], device = compute_device) pt_reward = torch.tensor([reward], device = compute_device)
@ -446,7 +457,7 @@ def on_state_after(celeste, before_out):
# Clean up screenshots # Clean up screenshots
shots = Path("/home/mark/Desktop").glob("hackcel_*.png") shots = screenshot_source.glob("hackcel_*.png")
target = screenshot_dir / Path(f"{episode_number}") target = screenshot_dir / Path(f"{episode_number}")
target.mkdir(parents = True) target.mkdir(parents = True)

View File

@ -1275,11 +1275,25 @@ function _update()
hack_has_sent_first_message = true hack_has_sent_first_message = true
out_string = "dc:" .. tostr(deaths) .. ";" out_string = "dc:" .. tostr(deaths) .. ";"
-- Dash status
if hack_can_dash then if hack_can_dash then
out_string = out_string .. "ds:t;" out_string = out_string .. "ds:t;"
else else
out_string = out_string .. "ds:f;" out_string = out_string .. "ds:f;"
end end
-- Fruit status
out_string = out_string .. "fr:"
for i = 0,29 do
if got_fruit[i] then
out_string = out_string .. "t"
else
out_string = out_string .. "f"
end
end
out_string = out_string .. ";"
for k, v in pairs(hack_player_state) do for k, v in pairs(hack_player_state) do
out_string = out_string .. k ..":" .. v .. ";" out_string = out_string .. k ..":" .. v .. ";"