| @@ 1065-1092 (lines=28) @@ | ||
| 1062 | def render_bsp(first, key, mouse): |
|
| 1063 | global bsp, bsp_generate, bsp_refresh, bsp_map |
|
| 1064 | global bsp_random_room, bsp_room_walls, bsp_depth, bsp_min_room_size |
|
| 1065 | if bsp_generate or bsp_refresh: |
|
| 1066 | # dungeon generation |
|
| 1067 | if bsp is None: |
|
| 1068 | # create the bsp |
|
| 1069 | bsp = libtcod.bsp_new_with_size(0, 0, SAMPLE_SCREEN_WIDTH, |
|
| 1070 | SAMPLE_SCREEN_HEIGHT) |
|
| 1071 | else: |
|
| 1072 | # restore the nodes size |
|
| 1073 | libtcod.bsp_resize(bsp, 0, 0, SAMPLE_SCREEN_WIDTH, |
|
| 1074 | SAMPLE_SCREEN_HEIGHT) |
|
| 1075 | bsp_map = list() |
|
| 1076 | for x in range(SAMPLE_SCREEN_WIDTH): |
|
| 1077 | bsp_map.append([False] * SAMPLE_SCREEN_HEIGHT) |
|
| 1078 | if bsp_generate: |
|
| 1079 | # build a new random bsp tree |
|
| 1080 | libtcod.bsp_remove_sons(bsp) |
|
| 1081 | if bsp_room_walls: |
|
| 1082 | libtcod.bsp_split_recursive(bsp, 0, bsp_depth, |
|
| 1083 | bsp_min_room_size + 1, |
|
| 1084 | bsp_min_room_size + 1, 1.5, 1.5) |
|
| 1085 | else: |
|
| 1086 | libtcod.bsp_split_recursive(bsp, 0, bsp_depth, |
|
| 1087 | bsp_min_room_size, |
|
| 1088 | bsp_min_room_size, 1.5, 1.5) |
|
| 1089 | # create the dungeon from the bsp |
|
| 1090 | libtcod.bsp_traverse_inverted_level_order(bsp, traverse_node) |
|
| 1091 | bsp_generate = False |
|
| 1092 | bsp_refresh = False |
|
| 1093 | libtcod.console_clear(sample_console) |
|
| 1094 | libtcod.console_set_default_foreground(sample_console, libtcod.white) |
|
| 1095 | rooms = 'OFF' |
|
| @@ 911-938 (lines=28) @@ | ||
| 908 | if left.y + left.h - 1 < right.y or right.y + right.h - 1 < left.y: |
|
| 909 | # no overlapping zone. we need a Z shaped corridor |
|
| 910 | y1 = libtcod.random_get_int(None, left.y, left.y + left.h - 1) |
|
| 911 | y2 = libtcod.random_get_int(None, |
|
| 912 | right.y, right.y + right.h - 1) |
|
| 913 | x = libtcod.random_get_int(None, left.x + left.w, right.x) |
|
| 914 | hline_left(bsp_map, x - 1, y1) |
|
| 915 | vline(bsp_map, x, y1, y2) |
|
| 916 | hline_right(bsp_map, x + 1, y2) |
|
| 917 | else: |
|
| 918 | # straight horizontal corridor |
|
| 919 | miny = max(left.y, right.y) |
|
| 920 | maxy = min(left.y + left.h - 1, right.y + right.h - 1) |
|
| 921 | y = libtcod.random_get_int(None, miny, maxy) |
|
| 922 | hline_left(bsp_map, right.x - 1, y) |
|
| 923 | hline_right(bsp_map, right.x, y) |
|
| 924 | return True |
|
| 925 | ||
| 926 | bsp = None |
|
| 927 | bsp_generate = True |
|
| 928 | bsp_refresh = False |
|
| 929 | class BSPSample(Sample): |
|
| 930 | def __init__(self): |
|
| 931 | self.name = 'Bsp toolkit' |
|
| 932 | ||
| 933 | def on_draw(self, delta_time): |
|
| 934 | global bsp, bsp_generate, bsp_refresh, bsp_map |
|
| 935 | global bsp_random_room, bsp_room_walls, bsp_depth, bsp_min_room_size |
|
| 936 | if bsp_generate or bsp_refresh: |
|
| 937 | # dungeon generation |
|
| 938 | if bsp is None: |
|
| 939 | # create the bsp |
|
| 940 | bsp = libtcod.bsp_new_with_size(0, 0, SAMPLE_SCREEN_WIDTH, |
|
| 941 | SAMPLE_SCREEN_HEIGHT) |
|