Now correctly draws lasers behind and in front of mirrors. Phew.
This commit is contained in:
@@ -157,28 +157,34 @@ def generate_lasers(playfield):
|
||||
Return [((x, y), direction), ...]
|
||||
"""
|
||||
width, height = 16, 16
|
||||
sources = ((pos, obj.direction) for pos, obj in filter(lambda posobj: isinstance(posobj[1], Source), playfield.items()))
|
||||
sources = ((pos, obj.direction) for pos, obj
|
||||
in filter(lambda posobj: isinstance(posobj[1], Source),
|
||||
playfield.items()))
|
||||
lasers = []
|
||||
def add(start, end):
|
||||
t = (min(start, end), max(start, end))
|
||||
if not t in lasers:
|
||||
lasers.append(t)
|
||||
for start, direc in sources:
|
||||
end = start
|
||||
while True:
|
||||
cur = playfield.get(end)
|
||||
if cur is Target:
|
||||
lasers.append(((start, end), direc))
|
||||
add(start, end)
|
||||
break
|
||||
if cur is Blocker:
|
||||
lasers.append(((start, end), direc))
|
||||
add(start, end)
|
||||
break
|
||||
if cur in (MirrorLeft, MirrorRight):
|
||||
if (start, end) in ((start, end) for (start, end), direc in lasers):
|
||||
break
|
||||
lasers.append(((start, end), direc))
|
||||
add(start, end)
|
||||
direc = _mirror_new_direc(cur, direc)
|
||||
start = end
|
||||
new_end = direc.next_pos(end)
|
||||
if new_end[0] < 0 or new_end[1] < 0 or new_end[0] >= width or new_end[1] >= height:
|
||||
if (start, end) not in lasers:
|
||||
lasers.append(((start, new_end), direc))
|
||||
if new_end[0] < 0 or new_end[1] < 0 or \
|
||||
new_end[0] >= width or new_end[1] >= height:
|
||||
add(start, new_end)
|
||||
break
|
||||
end = new_end
|
||||
return lasers
|
||||
|
||||
Reference in New Issue
Block a user