-
Notifications
You must be signed in to change notification settings - Fork 0
/
setup_game.py
121 lines (101 loc) · 3.73 KB
/
setup_game.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
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
"""Handle the loading and initialization of game sessions."""
from __future__ import annotations
import copy
import lzma
import pickle
import traceback
from typing import Optional
import tcod
import tcod.sdl.audio
from tcod import libtcodpy
import color
from engine import Engine
from game_map import GameWorld
import input_handlers
import sounds
# Load the background image and remove the alpha channel.
background_image = tcod.image.load("menu_background.png")[:, :, :3]
def new_game(mixer) -> Engine:
"""Return a brand new game session as an Engine instance."""
map_width = 80
map_height = 43
room_max_size = 10
room_min_size = 6
max_rooms = 30
engine = Engine(mixer=mixer)
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(
"Hello and welcome, adventurer, to yet another dungeon!", color.welcome_text,
)
engine.message_log.add_message("Press 's' to view all possible keybinds!")
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)
# Initialize mixer.
engine.message_log.mixer = tcod.sdl.audio.BasicMixer(tcod.sdl.audio.open(channels=2))
return engine
class MainMenu(input_handlers.BaseEventHandler):
"""Handle the main menu rendering and input."""
def __init__(self):
self.mixer = tcod.sdl.audio.BasicMixer(tcod.sdl.audio.open(channels=2))
self.channel = sounds.play("sfx/POL-the-hordes-advance-short.wav", self.mixer)
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,
"TOMBS OF THE ANCIENT KINGS",
fg=color.menu_title,
alignment=libtcodpy.CENTER,
)
console.print(
console.width // 2,
console.height - 2,
"By (Your name here)",
fg=color.menu_title,
alignment=libtcodpy.CENTER,
)
menu_width = 24
for i, text in enumerate(
["[N] Play a new game", "[C] Continue last game", "[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:
self.channel.stop()
try:
return input_handlers.MainGameEventHandler(load_game("savegame.sav"))
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:
self.channel.stop()
return input_handlers.MainGameEventHandler(new_game(self.mixer))
return None