-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsetup_game.py
More file actions
130 lines (109 loc) · 3.96 KB
/
setup_game.py
File metadata and controls
130 lines (109 loc) · 3.96 KB
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
from __future__ import annotations
import copy
import lzma
import pickle
import traceback
from typing import Optional
import tcod
from tcod import libtcodpy
import color
from engine import Engine
import entity_factories
from game_map import GameWorld
import input_handlers
# Load the background image and remove the alpha channel.
background_image = tcod.image.load("data/menu_background.png")[:, :, :3]
background_image //= 4
def new_game() -> Engine:
"""Return a brand new game session as an Engine instance."""
room_max_size = 10
room_min_size = 6
max_rooms = 30
map_width = 80
map_height = 43
player = copy.deepcopy(entity_factories.player)
engine = Engine(player=player)
engine.game_world = GameWorld(
engine=engine,
max_rooms=max_rooms,
room_min_size=room_min_size,
room_max_size=room_max_size,
map_width=map_width,
map_height=map_height,
)
engine.game_world.generate_floor()
engine.update_fov()
engine.message_log.add_message(
"ALL SYSTEMS RECONNECTED: AWAKENING USER.", color.text_console
)
engine.message_log.add_message(
"WARNING: DANGEROUS LIFEFORMS SIGNALS DETECTED.", color.text_console
)
engine.message_log.add_message(
"TASK: GET OUT OF THIS PLACE!", color.text_console
)
kinfe = copy.deepcopy(entity_factories.pocket_kinfe)
chest_plate = copy.deepcopy(entity_factories.scrap_chest_plate)
kinfe.parent = player.inventory
chest_plate.parent = player.inventory
player.inventory.items.append(kinfe)
player.equipment.toggle_equip(kinfe, add_message=False)
player.inventory.items.append(chest_plate)
player.equipment.toggle_equip(chest_plate, add_message=False)
return engine
def load_game(filename: str) -> Engine:
"""Load an Engine instance from a file."""
with open(filename, "rb") as f:
engine = pickle.loads(lzma.decompress(f.read()))
assert isinstance(engine, Engine)
return engine
class MainMenu(input_handlers.BaseEventHandler):
"""Handle the main menu rendering and input."""
def on_render(self, console: tcod.Console) -> None:
"""Render the main menu on a background image."""
console.draw_semigraphics(background_image, 0, 0)
console.print(
console.width // 2,
console.height // 2 - 4,
"PYTHON RL",
fg=color.menu_title,
alignment=libtcodpy.CENTER,
)
console.print(
console.width // 2,
console.height - 2,
"By TomatoSaucey",
fg=color.menu_title,
alignment=libtcodpy.CENTER,
)
menu_width = 24
for i, text in enumerate(
["[N] New game", "[C] Continue", "[Q] Quit"]
):
console.print(
console.width // 2,
console.height // 2 - 2 + i,
text.ljust(menu_width),
fg=color.menu_text,
bg=color.black,
alignment=libtcodpy.CENTER,
bg_blend=libtcodpy.BKGND_ALPHA(64),
)
def ev_keydown(
self, event: tcod.event.KeyDown
) -> Optional[input_handlers.BaseEventHandler]:
if event.sym in (tcod.event.KeySym.q, tcod.event.KeySym.ESCAPE):
raise SystemExit()
elif event.sym == tcod.event.KeySym.c:
try:
engine = load_game("savegame.sav")
engine.game_world.update_floor_colors()
return input_handlers.MainGameEventHandler(engine)
except FileNotFoundError:
return input_handlers.PopupMessage(self, "No saved game to load.")
except Exception as exc:
traceback.print_exc() # Print to stderr.
return input_handlers.PopupMessage(self, f"Failed to load save:\n{exc}")
elif event.sym == tcod.event.KeySym.n:
return input_handlers.MainGameEventHandler(new_game())
return None