Files
pixel-platformer/game/sim/saveLoad.py
T

119 lines
3.6 KiB
Python

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)