feat(sim): save and load of game state
This commit is contained in:
1 parent
251d79a348
commit
d86ed92816
1 file changed
+118
@@ -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)
|
||||
Reference in new issue
Block a user