-
Notifications
You must be signed in to change notification settings - Fork 0
/
render_functions.py
143 lines (106 loc) · 6.01 KB
/
render_functions.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
import tcod as libtcodpy
from enum import Enum, auto
from game_states import GameStates
from menus import help_screen, character_equipment_screen, character_screen, inventory_menu, level_up_menu
class RenderOrder(Enum):
STAIRS = auto()
CORPSE = auto()
ITEM = auto()
ACTOR = auto()
def get_names_under_mouse(mouse, entities, fov_map):
(x, y) = (mouse.cx, mouse.cy)
names = [entity.name for entity in entities
if entity.x == x and entity.y == y and libtcodpy.map_is_in_fov(fov_map, entity.x, entity.y)]
names = ', '.join(names)
return names.capitalize()
def render_bar(panel, x, y, total_width, name, value, maximum, bar_color, back_color):
bar_width = int(float(value) / maximum * total_width)
libtcodpy.console_set_default_background(panel, back_color)
libtcodpy.console_rect(panel, x, y, total_width, 1, False, libtcodpy.BKGND_SCREEN)
libtcodpy.console_set_default_background(panel, bar_color)
if (bar_width > 0):
libtcodpy.console_rect(panel, x, y, bar_width, 1, False, libtcodpy.BKGND_SCREEN)
libtcodpy.console_set_default_foreground(panel, libtcodpy.white)
libtcodpy.console_print_ex(panel, int(x + total_width / 2), y, libtcodpy.BKGND_NONE, libtcodpy.CENTER,
'{0}: {1}/{2}'.format(name, value, maximum))
# Draw enties and map
def render_all(con, panel, entities, player, game_map, fov_map, fov_recompute, message_log, screen_width, screen_height,
bar_width, panel_height,
panel_y, mouse, colors, game_state):
# Draw all the tiles in the game map
if fov_recompute:
for y in range(game_map.height):
for x in range(game_map.width):
visible = libtcodpy.map_is_in_fov(fov_map, x, y)
wall = game_map.tiles[x][y].block_sight
if visible:
if wall:
libtcodpy.console_put_char(con, x, y, '#', libtcodpy.BKGND_SET)
libtcodpy.console_set_char_foreground(con, x, y, colors.get('light_wall'))
else:
libtcodpy.console_put_char(con, x, y, '.', libtcodpy.BKGND_SET)
libtcodpy.console_set_char_foreground(con, x, y, colors.get('light_ground'))
game_map.tiles[x][y].explored = True;
elif game_map.tiles[x][y].explored:
if wall:
libtcodpy.console_put_char(con, x, y, '#', libtcodpy.BKGND_SET)
libtcodpy.console_set_char_foreground(con, x, y, colors.get('dark_wall'))
else:
libtcodpy.console_put_char(con, x, y, '.', libtcodpy.BKGND_SET)
libtcodpy.console_set_char_foreground(con, x, y, colors.get('dark_ground'))
entities_in_render_order = sorted(entities, key=lambda x: x.render_order.value)
# Draw all entities in the list
for entity in entities_in_render_order:
draw_entity(con, entity, fov_map, game_map)
libtcodpy.console_blit(con, 0, 0, screen_width, screen_height, 0, 0, 0)
libtcodpy.console_set_default_background(panel, libtcodpy.black)
libtcodpy.console_clear(panel)
# Print the game messages, one line at a time
y = 1
for message in message_log.messages:
libtcodpy.console_set_default_foreground(panel, message.color)
libtcodpy.console_print_ex(panel, message_log.x, y, libtcodpy.BKGND_NONE, libtcodpy.LEFT, message.text)
y += 1
# Draw health bar
render_bar(panel, 1, 2, bar_width, 'HP', player.fighter.hp, player.fighter.max_hp, libtcodpy.Color(245,56,2),
libtcodpy.Color(138,20,0))
libtcodpy.console_print_ex(panel, 1, 4, libtcodpy.BKGND_NONE, libtcodpy.LEFT,
'Dungeon Level: {0}'.format(game_map.dungeon_level))
# Draw names
libtcodpy.console_set_default_foreground(panel, libtcodpy.Color(231,93,16))
libtcodpy.console_print_ex(panel, 1, 0, libtcodpy.BKGND_NONE, libtcodpy.LEFT,
get_names_under_mouse(mouse, entities, fov_map))
libtcodpy.console_blit(panel, 0, 0, screen_width, panel_height, 0, 0, panel_y)
# Draw Inventory
if game_state in (GameStates.SHOW_INVENTORY, GameStates.DROP_INVENTORY):
if game_state == GameStates.SHOW_INVENTORY:
inventory_title = 'Inventory'
color = libtcodpy.Color(66,190,255)
else:
inventory_title = 'Inventory'
color = libtcodpy.Color(169,0,32)
inventory_menu(con, inventory_title, player, 50, screen_width, screen_height, color)
elif game_state == GameStates.LEVEL_UP:
level_up_menu(con, 'Level up! Choose a stat to raise:', player, 40, screen_width, screen_height)
# elif game_state == GameStates.CHARACTER_SCREEN:
character_screen(player, 30, 15, screen_width, screen_height)
character_equipment_screen(player, 30, 10, screen_width)
help_screen(30, 15, screen_width)
# Draw Inventory on Side
if game_state not in (GameStates.SHOW_INVENTORY, GameStates.DROP_INVENTORY):
inventory_menu(con, 'Inventory', player, 50, screen_width, screen_height, libtcodpy.Color(121, 121, 121))
# Clears all the entites after drawing to the screen
def clear_all(con, entities, fov_map):
for entity in entities:
clear_entity(con, entity, fov_map)
# Draws the entity to the screen
def draw_entity(con, entity, fov_map, game_map):
if libtcodpy.map_is_in_fov(fov_map, entity.x, entity.y) or (
entity.stairs and game_map.tiles[entity.x][entity.y].explored):
libtcodpy.console_set_default_foreground(con, entity.color)
libtcodpy.console_put_char(con, entity.x, entity.y, entity.char, libtcodpy.BKGND_NONE)
# Clears the entity from the screen so that when the entity moves it doesn't leave a trail behind
def clear_entity(con, entity, fov_map):
# Erase the character that represents this object
if libtcodpy.map_is_in_fov(fov_map, entity.x, entity.y):
libtcodpy.console_put_char(con, entity.x, entity.y, '.', libtcodpy.BKGND_NONE)