-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgame_api.py
91 lines (72 loc) · 2.01 KB
/
game_api.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import pexpect
import os
from charset_normalizer import from_bytes
from os import environ
GAMEFILE = environ.get("GAME_FILE", "zork1.z5")
SAVEFILE = environ.get("SAVE_FILE", "zork1.sav")
game = None
def start(width=48):
"""
Start the game and return the initial output
"""
global game
if game != None:
game.terminate()
game = pexpect.spawn(
f'bash -c "$(pwd)/dfrotz -p -w {width} $(pwd)/{GAMEFILE}"', timeout=5
)
game.expect(">")
try:
output = game.before.decode("utf-8").replace("\r", "").strip()
except Exception:
try:
output = (
str(from_bytes(game.before).best()).replace("\r", "").strip()
)
except Exception:
output = "[ERROR] Oops, something broke. Let's try that again!"
return output
def step(cmd):
"""
Execute a game command and return the output
"""
global game
game.sendline(cmd)
game.expect(">")
try:
output = game.before.decode("utf-8").replace("\r", "").strip()
except Exception:
try:
output = (
str(from_bytes(game.before).best()).replace("\r", "").strip()
)
except Exception:
output = "[ERROR] Oops, something broke. Let's try that again!"
return output
def restore():
"""
Restore the game from a save file
"""
global game
if os.path.isfile(SAVEFILE):
game.sendline("restore")
game.expect(":")
game.sendline(SAVEFILE)
game.expect(">")
if "Ok." in game.before.decode("UTF-8"):
return True
return False
def save():
"""
Save game state to a file
"""
global game
game.sendline("save")
game.expect(":")
game.sendline(SAVEFILE)
if (
game.expect(["Overwrite existing file?", pexpect.TIMEOUT], timeout=0.5)
== 0
):
game.sendline("y")
game.expect(">")