-
Notifications
You must be signed in to change notification settings - Fork 0
/
firstrl1.py
228 lines (169 loc) · 6.92 KB
/
firstrl1.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
import libtcodpy as libtcod
# These variables shouldnt be changed and represent the settings
# for the console window which will appear
SCREEN_WIDTH = 80
SCREEN_HEIGHT = 50
MAP_WIDTH = 80
MAP_HEIGHT = 45
ROOM_MAX_SIZE = 10
ROOM_MIN_SIZE = 6
MAX_ROOMS = 30
LIMIT_FPS = 20
color_dark_wall = libtcod.Color(31, 31, 31)
color_dark_ground = libtcod.Color(94, 75, 47)
class Tile:
#a tile of the map and its properties
def __init__(self, blocked, block_sight = None):
self.blocked = blocked
#by defult if a tile is blocked it also blocks sight
if block_sight is None: block_sight = blocked
self.block_sight = block_sight
class Rect:
def __init__(self, x, y, w, h):
self.x1 = x
self.y1 = y
self.x2 = x + w
self.y2 = y + h
def center(self):
center_x = (self.x1 + self.x2) /2
center_y = (self.y1 + self.y2) /2
return (center_x, center_y)
def intersect(self,other):
return (self.x1 <= other.x2 and self.x2 >= other.x1 and
self.y1 <= other.y2 and self.y2 >= other.y1)
class Object:
# this is a generic object: the player, a monster on the screen, an item,
# stairs, its always represented by a character on screen.
def __init__(self, x, y, char, color):
self.x = x
self.y = y
self.char = char
self.color = color
def move(self, dx, dy):
# move by a given amount
if not map[self.x + dx][self.y + dy].blocked :
self.x += dx
self.y += dy
def draw(self):
# set the color and draw the object at the position
libtcod.console_set_default_foreground(con, self.color)
libtcod.console_put_char(con,self.x,self.y,self.char, libtcod.BKGND_NONE)
def clear(self):
#erase the character for this object
libtcod.console_put_char(con, self.x, self.y, ' ', libtcod.BKGND_NONE)
def create_room(room):
global map
#go through the tiles in the rectangle and make them passable
for x in range(room.x1 + 1, room.x2):
for y in range(room.y1 +1, room.y2):
map[x][y].blocked = False
map[x][y].block_sight = False
def create_h_tunnel(x1, x2, y):
global map
for x in range(min(x1, x2), max(x1, x2)+ 1):
map[x][y].blocked = False
map[x][y].block_sight = False
def create_v_tunnel(y1, y2, x):
global map
for y in range(min(y1, y2), max(y1, y2)+ 1):
map[x][y].blocked = False
map[x][y].block_sight = False
def make_map():
global map
#fill map with unblocked tiles
map = [[ Tile(True)
for y in range(MAP_HEIGHT)]
for x in range(MAP_WIDTH)]
rooms = []
num_rooms = 0
for r in range(MAX_ROOMS):
#random widths and heights
w = libtcod.random_get_int(0, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
h = libtcod.random_get_int(0, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
#random postion within the map
x = libtcod.random_get_int(0,0,MAP_WIDTH - w - 1)
y = libtcod.random_get_int(0,0, MAP_HEIGHT - h - 1)
new_room = Rect(x, y, w, h)
failed = False
for other_room in rooms:
if new_room.intersect(other_room):
failed =True
break
if not failed:
#this means their is no intersections so the room is valid
#'paint it' to the new maps tiles
create_room(new_room)
#center coordinates of new room, will be useful later
(new_x, new_y) = new_room.center()
room_no = Object(new_x, new_y, chr(65+num_rooms), libtcod.white)
objects.insert(0, room_no)
if num_rooms == 0:
#this is the first room where the player starts
player.x = new_x
player.y = new_y
else:
#all rooms after the first
#conect it to the previous room with a tunnel
#center coodinates of previous room
(prev_x, prev_y) =rooms[num_rooms-1].center()
if libtcod.random_get_int(0, 0, 1) == 1:
#first move horizontally then vertiacally
create_h_tunnel(prev_x, new_x, prev_y)
create_v_tunnel(prev_y, new_y, new_x)
else:
#first move vertically then horzontally
create_v_tunnel(prev_y, new_y, prev_x)
create_h_tunnel(prev_x, new_x, new_y)
#finally append new room to list
rooms.append(new_room)
num_rooms += 1
def render_all():
global color_light_wall
global color_light_ground
#go through all the tiles and set their background color
for y in range(MAP_HEIGHT):
for x in range(MAP_WIDTH):
wall = map[x][y].block_sight
if wall:
libtcod.console_set_char_background(con, x, y, color_dark_wall, libtcod.BKGND_SET)
else:
libtcod.console_set_char_background(con,x,y,color_dark_ground,libtcod.BKGND_SET)
#draw all objects in the list
for object in objects:
object.draw()
libtcod.console_blit(con, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 0)
def handle_keys():
# here we set the globals for the players position plus handle movement
#use check for keypress for realtime
key = libtcod.console_wait_for_keypress(True)
if key.vk == libtcod.KEY_ENTER and key.lalt:
#alt enter for fullscreen
libtcod.console_set_fullscreen(not libtcod.console_is_fullscreen())
elif key.vk == libtcod.KEY_ESCAPE:
return True #exit game
if libtcod.console_is_key_pressed(libtcod.KEY_UP):
player.move(0, -1)
if libtcod.console_is_key_pressed(libtcod.KEY_DOWN):
player.move(0, 1)
if libtcod.console_is_key_pressed(libtcod.KEY_LEFT):
player.move(-1, 0)
if libtcod.console_is_key_pressed(libtcod.KEY_RIGHT):
player.move(1, 0)
# INT stuff here which dictates the console window.
libtcod.console_set_custom_font('arial10x10.png',libtcod.FONT_TYPE_GRAYSCALE | libtcod.FONT_LAYOUT_TCOD)
libtcod.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, 'python/libtcod tutorial',False)
libtcod.sys_set_fps(LIMIT_FPS)
con = libtcod.console_new(SCREEN_WIDTH, SCREEN_HEIGHT)
player = Object(SCREEN_WIDTH/2,SCREEN_HEIGHT/2, '@', libtcod.white)
npc = Object(SCREEN_WIDTH/2-6,SCREEN_HEIGHT/2-4, '@', libtcod.yellow)
objects= [npc, player]
make_map()
# THIS is the main loop for the game.
while not libtcod.console_is_window_closed():
render_all()
libtcod.console_flush()
for object in objects:
object.clear()
exit = handle_keys()
if exit :
break