-
Notifications
You must be signed in to change notification settings - Fork 0
/
tunnel_view.py
156 lines (144 loc) · 6.05 KB
/
tunnel_view.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
#!/usr/bin/env python3
"""
tunnel_view.py
Copyright 2023 Steve Palmer
"""
import pyglet
import numpy as np
from utils import traced_methods, do_not_trace
from game_controller import GameView
@traced_methods
class TunnelView(GameView):
def __init__(self, game_controller, label: str = None):
super().__init__(game_controller, label or "Tunnel View")
self._step_max = game_controller.maze.shape.max()
self.indices = []
def on_resize(self, width: int, height: int):
self.switch_to()
super().on_resize(width, height)
vertices = []
limits = np.array([width // 2, height // 2])
centre = limits
next_offset = limits
for distance in range(2, self._step_max + 4):
offset = next_offset
next_offset = limits // distance
# 0. Left Bottom Outer
vertices.extend((centre[0] - offset[0], centre[1] - offset[1]))
# 1. Left Top Outer
vertices.extend((centre[0] - offset[0], centre[1] + offset[1]))
# 2. Right Bottom Outer
vertices.extend((centre[0] + offset[0], centre[1] - offset[1]))
# 3. Right Top Outer
vertices.extend((centre[0] + offset[0], centre[1] + offset[1]))
# 4. Left Bottom Inner
vertices.extend((centre[0] - offset[0], centre[1] - next_offset[1]))
# 5. Left Top Inner
vertices.extend((centre[0] - offset[0], centre[1] + next_offset[1]))
# 6. Right Bottom Inner
vertices.extend((centre[0] + offset[0], centre[1] - next_offset[1]))
# 5. Right Top Inner
vertices.extend((centre[0] + offset[0], centre[1] + next_offset[1]))
self.vertices_count = len(vertices) // 2
self.vertices = ("v2i", vertices)
self.vertices_colour = ("c4B", (255, 255, 255, 255) * self.vertices_count)
def entry(self):
super().entry()
self.display_update()
def display_update(self):
assert self.player is not None
self.switch_to()
direction = self.player.direction
left = direction.turn_left()
right = direction.turn_right()
position = self.player.position.copy()
indices = []
for step in range(1, self._step_max + 3):
if not direction: # Beyond the far wall
pass
elif position not in self.game_controller.maze: # Maze Exit
indices.extend(
((step - 1) << 3 | 0, (step - 1) << 3 | 1)
) # previous left post
indices.extend(
((step - 1) << 3 | 2, (step - 1) << 3 | 3)
) # previous right post
indices.extend((step << 3 | 0, step << 3 | 1)) # this left post
indices.extend((step << 3 | 2, step << 3 | 3)) # this right post
break
else:
room = self.game_controller.maze[position]
if room.can_move(left):
indices.extend(
((step - 1) << 3 | 4, step << 3 | 0)
) # left bottom gap
indices.extend(((step - 1) << 3 | 5, step << 3 | 1)) # left top gap
left_post = True
if step > 0:
indices.extend(
((step - 1) << 3 | 0, (step - 1) << 3 | 1)
) # previous left post
else:
indices.extend(
((step - 1) << 3 | 0, step << 3 | 0)
) # left bottom wall
indices.extend(
((step - 1) << 3 | 1, step << 3 | 1)
) # left top wall
left_post = False
if room.can_move(right):
indices.extend(
((step - 1) << 3 | 6, step << 3 | 2)
) # right bottom gap
indices.extend(
((step - 1) << 3 | 7, step << 3 | 3)
) # right top gap
right_post = True
if step > 0:
indices.extend(
((step - 1) << 3 | 2, (step - 1) << 3 | 3)
) # previous right post
else:
indices.extend(
((step - 1) << 3 | 2, step << 3 | 2)
) # right bottom wall
indices.extend(
((step - 1) << 3 | 3, step << 3 | 3)
) # right top wall
right_post = False
if room.can_move(direction):
if left_post:
indices.extend((step << 3 | 0, step << 3 | 1)) # this left post
if right_post:
indices.extend(
(step << 3 | 2, step << 3 | 3)
) # this right post
position += direction.offset()
else:
if not left_post:
indices.extend((step << 3 | 0, step << 3 | 1)) # this left post
if not right_post:
indices.extend(
(step << 3 | 2, step << 3 | 3)
) # this right post
indices.extend((step << 3 | 0, step << 3 | 2)) # end bottom wall
indices.extend((step << 3 | 1, step << 3 | 3)) # end top wall
break
self.indices = indices
def on_direction_update(self):
self.display_update()
def on_position_update(self):
self.display_update()
@do_not_trace
def on_draw(self):
if self.active and self.player is not None:
self.switch_to()
self.clear()
pyglet.graphics.draw_indexed(
self.vertices_count,
pyglet.gl.GL_LINES,
self.indices,
self.vertices,
self.vertices_colour,
)
__all__ = "TunnelView"