invert eship/pbullet collision

Also mildly trims up linked_list impl.
This commit is contained in:
2025-06-20 15:09:18 -07:00
parent 789cdf6a7a
commit 325d7444e7

View File

@ -60,7 +60,7 @@ function mknew(tt)
end end
-- intrusive singly-linked list. -- intrusive singly-linked list.
-- cannot be nested! -- cannot be nested or crossed!
linked_list = mknew{ linked_list = mknew{
is_linked_list=true, is_linked_list=true,
init = function(x) init = function(x)
@ -93,9 +93,7 @@ end
-- strip calls f(x) for each -- strip calls f(x) for each
-- node, removing each node for -- node, removing each node for
-- which f(x) returns true. it -- which f(x) returns true.
-- returns the new tail; nil
-- if the list is now empty.
function linked_list:strip(f) function linked_list:strip(f)
local p, n = self, self.next local p, n = self, self.next
while n do while n do
@ -107,7 +105,6 @@ function linked_list:strip(f)
n = n.next n = n.next
end end
self.tail = p self.tail = p
return p
end end
-- optimized special case - -- optimized special case -
@ -258,31 +255,35 @@ function updategame()
-- many bullets and many enemy ships; -- many bullets and many enemy ships;
-- use bucket collider for efficiency -- use bucket collider for efficiency
local pbullet_collider = collider.new()
local p, n = pbullets, pbullets.next local eship_collider = collider.new()
-- save tokens, lose time:
-- eships:strip(function(s) eship_collider:insert(s) end)
local p, n = eships, eships.next
while n do while n do
n.prev = p n.prev = p
pbullet_collider:insert(n) eship_collider:insert(n)
p = n p = n
n = p.next n = p.next
end end
eships:strip( -- lose tokens, save time:
function(es) -- unroll `strip` to avoid
for pb in all(pbullet_collider:get_collisions(es)) do -- function call overhead
if pb:hitship(es) then pbullets:strip(function(pb)
pbullet_collider:hide(pb) for es in all(eship_collider:get_collisions(pb)) do
pb.prev.next = pb.next if es:hitbullet(pb) then
if pb.next then eship_collider:hide(es)
pb.next.prev = pb.prev es.prev.next=es.next
else if es.next then
pbullets.tail = pb.prev es.next.prev = es.prev
end else
eships.tail = es.prev
end end
if (es:hitbullet(pb)) return true
end end
if (pb:hitship(es)) return true
end end
) end)
intangibles_fg:strip(call_move) intangibles_fg:strip(call_move)