Compare commits

...

2 Commits

Author SHA1 Message Date
78f0a96529
calc_push op loop golf
Reorganizing conditionals saves tokens here.
2023-01-02 15:58:23 -08:00
d792831370
can_move also takes a rope operation table
this is approximately token-neutral but performance-saving. each function parameter makes its call cost worse. When can_move is called inside a loop, we already have a table and we unpack to call can_move; moving the unpack into can_move saves us marshalling cost. It requires us to construct a table in a different spot (where we were not previously doing so) but that spot is not in a loop.
2023-01-02 15:57:27 -08:00

View File

@ -633,10 +633,12 @@ end
ropecheck=split"-0.6,0.4,0.4"
-- argument "o" is a rope operation:
-- array of [mx0,my0,dmx,dmy]
function level:can_move(
is_player,
mx0,my0,dmx,dmy,exclude_src,exclude_dst
is_player,o,exclude_src,exclude_dst
)
local mx0,my0,dmx,dmy=unpack(o)
local mx1,my1=mx0+dmx,my0+dmy
if (is_player and self:win_at(mx1,my1)) return true
if (is_player and self:get_open_pit(mx1,my1)) return wrongbleep:adequately_warned()
@ -652,7 +654,8 @@ function level:can_move(
return true
end
-- argument is array-like: mx0,my0,dmx,dmy
-- argument is a rope operation:
-- array of [mx0,my0,dmx,dmy]
function level:tug_crate(t)
local mx0,my0,dmx,dmy=unpack(t)
local mxy0=_mix{mx0,my0}
@ -736,7 +739,7 @@ function player:update()
else
local x,y=self.x,self.y
local function try_move(dx,dy,f)
if level:can_move(true,x,y,dx,dy,0,2) then
if level:can_move(true,{x,y,dx,dy},0,2) then
self.todo=f
self.cooldown=3
local t=f[#f]
@ -1604,7 +1607,7 @@ function rope:_tug(hypothetically)
if not invalid_move then
local mv = {mx0,my0,dmx,dmy}
if level:can_move(false,mx0,my0,dmx,dmy,1,0) then
if level:can_move(false,mv,1,0) then
if (hypothetically) return ancs,0,{mv},blocks
level:tug_crate(mv)
@ -1687,17 +1690,11 @@ function rope:_calc_push(
local ops2,blocked={},{}
for o in all(ops) do
local mx,my,dmx,dmy=unpack(o)
if not level:mcoll(mx,my) then
-- great!
else
local crate=level:get_crate(mx,my)
if crate then
if not level:can_move(false,mx,my,dmx,dmy,0,0) then
add(blocked,o)
break
end
else
local mx,my=unpack(o)
if level:mcoll(mx,my)
if not (level:get_crate(mx, my)) break
if not level:can_move(false,o,0,0) then
add(blocked,o)
break
end
add(ops2,o)