diff --git a/game/sim/saveLoad.py b/game/sim/saveLoad.py new file mode 100644 index 0000000..e5307c1 --- /dev/null +++ b/game/sim/saveLoad.py @@ -0,0 +1,118 @@ +import json + + +def captureState(world): + player = world.player + return { + "level": world.level.name, + "frame": world.frame, + "score": world.score, + "coins": world.coins, + "lives": world.lives, + "gameOver": world.gameOver, + "completed": world.completed, + "active": world.active, + "activatedCheckpoints": sorted(world.activatedCheckpoints), + "player": { + "x": player.x, + "y": player.y, + "vx": player.vx, + "vy": player.vy, + "hp": player.hp, + "maxHp": player.maxHp, + "facing": player.facing, + "score": player.score, + "coins": player.coins, + "iframes": player.iframes, + "airJumps": player.airJumps, + "spawnX": player.spawnX, + "spawnY": player.spawnY, + "inventory": player.inventory.asDict(), + }, + "items": [item.collected for item in world.items], + "enemies": [ + { + "kind": enemy.kind, + "x": enemy.x, + "y": enemy.y, + "vx": enemy.vx, + "vy": enemy.vy, + "direction": enemy.direction, + "alive": enemy.alive, + "hp": enemy.hp, + "state": enemy.machine.stateName, + } + for enemy in world.enemies + ], + "platforms": [ + { + "progress": platform.progress, + "direction": platform.direction, + "x": platform.x, + "y": platform.y, + } + for platform in world.platforms + ], + } + + +def applyState(world, state): + world.frame = state["frame"] + world.score = state["score"] + world.coins = state["coins"] + world.lives = state["lives"] + world.gameOver = state["gameOver"] + world.completed = state["completed"] + world.active = state.get("active", True) + world.activatedCheckpoints = set(state["activatedCheckpoints"]) + + player = world.player + saved = state["player"] + player.x = saved["x"] + player.y = saved["y"] + player.vx = saved["vx"] + player.vy = saved["vy"] + player.hp = saved["hp"] + player.maxHp = saved["maxHp"] + player.facing = saved["facing"] + player.score = saved["score"] + player.coins = saved["coins"] + player.iframes = saved["iframes"] + player.airJumps = saved["airJumps"] + player.spawnX = saved["spawnX"] + player.spawnY = saved["spawnY"] + player.inventory.loadDict(saved["inventory"]) + + for item, collected in zip(world.items, state["items"]): + item.collected = collected + + for enemy, record in zip(world.enemies, state["enemies"]): + enemy.x = record["x"] + enemy.y = record["y"] + enemy.vx = record["vx"] + enemy.vy = record["vy"] + enemy.direction = record["direction"] + enemy.alive = record["alive"] + enemy.hp = record["hp"] + stateName = record["state"] + if stateName is not None and stateName in enemy.machine.states: + enemy.machine.current = enemy.machine.states[stateName] + + for platform, record in zip(world.platforms, state["platforms"]): + platform.progress = record["progress"] + platform.direction = record["direction"] + platform.x = record["x"] + platform.y = record["y"] + + return world + + +def saveGame(world, path): + with open(path, "w", encoding="ascii") as handle: + json.dump(captureState(world), handle, indent=2) + + +def loadGameInto(world, path): + with open(path, "r", encoding="ascii") as handle: + state = json.load(handle) + return applyState(world, state)