fix explosions

This commit is contained in:
James Turk 2023-04-30 04:34:36 -05:00
parent d33aca6f9f
commit d92817820a
2 changed files with 82 additions and 60 deletions

View File

@ -184,7 +184,6 @@ levels = {
function start_level(n) function start_level(n)
start_scene("level") start_scene("level")
last_gravity = t() last_gravity = t()
exploding = false
level_dets = 0 level_dets = 0
level_boxes = 0 level_boxes = 0
level_num = n level_num = n
@ -215,7 +214,6 @@ end
particles = {} particles = {}
function add_particles(gx, gy, colors) function add_particles(gx, gy, colors)
sfx(0)
local x = gx*8+4 local x = gx*8+4
local y = gy*8+4 local y = gy*8+4
for i=0,30 do for i=0,30 do
@ -287,79 +285,92 @@ function can_move(dx, dy)
return true return true
end end
explosion_types = {
fire={8, 9, 10},
wood={4, 15},
}
function add_explosion(x, y, countdown, colors)
explode_grid[y][x] = {countdown=countdown, colors=colors}
end
function explosion_adjacent(x, y) function explosion_adjacent(x, y)
-- called when the block next door explodes -- called when the block next door explodes
local block = puzzle_grid[y][x] local block = puzzle_grid[y][x]
puzzle_grid[y][x] = 0 if block == BOX_WOOD then
if block == BOX_FIRE then add_explosion(x, y, 1, explosion_types.wood)
elseif block == BOX_FIRE then
-- TODO: add explosion -- TODO: add explosion
end end
end end
function process_block(x, y) function update_exp_grid(x, y)
-- called on each block each frame -- called on each block each frame
-- the explosion grid contains countdown objects
-- grid items are {countdown, colors}
local block = puzzle_grid[y][x] local block = puzzle_grid[y][x]
local explode = explode_grid[y][x] local explode = explode_grid[y][x]
if explode then if explode then
-- grid items are {countdown, colors} --printh("CD: "..x..", "..y.." "..explode.countdown)
explode.countdown -= 1
printh("CD: "..x..", "..y.." "..explode.countdown)
if explode.countdown == 0 then if explode.countdown == 0 then
-- blow up the box (if present) -- always add particles and destroy box
puzzle_grid[y][x] = 0
add_particles(x, y, explode.colors) add_particles(x, y, explode.colors)
-- 4, 15 for box puzzle_grid[y][x] = 0
if explode.colors ~= explosion_types.fire then
-- don't propagate
return
end
-- fiery explosion
sfx(0)
local ys = {0}
local xs = {0}
if y > 1 then
add(ys, -1)
end
if y < GRID_H then
add(ys, 1)
end
if x > 1 then
add(xs, -1)
end
if x < GRID_W then
add(xs, 1)
end
for xx in all(xs) do
for yy in all(ys) do
if xx~=0 or yy~=0 then
explosion_adjacent(x+xx, y+yy)
end
end
end
explode_grid[y][x] = nil explode_grid[y][x] = nil
end end
end end
-- elseif block == GRID_EXPLODE then
-- local ys = {0}
-- local xs = {0}
-- if y > 1 then
-- add(ys, -1)
-- end
-- if y < GRID_H then
-- add(ys, 1)
-- end
-- if x > 1 then
-- add(xs, -1)
-- end
-- if x < GRID_W then
-- add(xs, 1)
-- end
-- for xx in all(xs) do
-- for yy in all(ys) do
-- if xx~=0 or yy~=0 then
-- explosion_adjacent(x+xx, y+yy)
-- end
-- end
-- end
-- puzzle_grid[y][x] = 0
-- end
end end
function update_level() function update_level()
-- bombs break adjacent tiles -- gravity
-- fire boxes turn into more bombs
-- goal: break all boxes
-- ??? only 8 positions?
-- update grid
fall_speed = 0.3 fall_speed = 0.3
if exploding then
if bomb_spr.speed == 0 and bomb_spr.anim then
exploding = false
bomb_spr.frame = 0
bomb_y = 0
end
end
printh("===")
if t() - last_gravity > fall_speed then if t() - last_gravity > fall_speed then
last_gravity = t() last_gravity = t()
-- decrement explosions in separate loop to avoid
-- issues with chains
for x=1,GRID_W do
for y=1,GRID_H do
local exp = explode_grid[y][x]
if exp then
exp.countdown -= 1
end
end
end
for y=GRID_H,1,-1 do for y=GRID_H,1,-1 do
for x=1,GRID_W do for x=1,GRID_W do
process_block(x, y) update_exp_grid(x, y)
-- fall down -- fall down
if y < GRID_H if y < GRID_H
and puzzle_grid[y+1][x] == 0 and puzzle_grid[y+1][x] == 0
@ -381,11 +392,12 @@ function update_level()
update_sprite(bomb_spr) update_sprite(bomb_spr)
update_explosions() update_explosions()
if exploding then -- bomb animation / explosion
if bomb_spr.frame > 10 and bomb_spr.anim then if bomb_spr.frame > 1 then
if bomb_spr.is_done then
-- when explosion hits last frame, particles / update grid -- when explosion hits last frame, particles / update grid
--add_particles(bomb_x, bomb_y, {8, 9, 10}) reset_sprite(bomb_spr)
explode_grid[bomb_y][bomb_x] = {countdown=1, colors={8, 9, 10}} bomb_y = 0
end end
-- exploding means we're done before input comes -- exploding means we're done before input comes
return return
@ -412,6 +424,12 @@ function update_level()
explode() explode()
end end
-- bomb gravity after movement
if bomb_y < GRID_H and puzzle_grid[bomb_y+1][bomb_x] == 0 then
bomb_y += 1
end
-- DEBUG LEVEL SELECT -- DEBUG LEVEL SELECT
if btnp(⬇️) then if btnp(⬇️) then
level_num = max(level_num-1, 1) level_num = max(level_num-1, 1)
@ -421,16 +439,11 @@ function update_level()
level_num = min(level_num+1, #levels) level_num = min(level_num+1, #levels)
start_level(level_num) start_level(level_num)
end end
-- fall immediately
if bomb_y < GRID_H and puzzle_grid[bomb_y+1][bomb_x] == 0 then
bomb_y += 1
end
end end
function explode() function explode()
exploding = true
bomb_spr.speed = 0.1 bomb_spr.speed = 0.1
add_explosion(bomb_x, bomb_y, 4, explosion_types.fire)
level_dets += 1 level_dets += 1
end end

View File

@ -4,10 +4,18 @@ function make_sprite(x, y, anim, speed)
vx=0, vy=0, vx=0, vy=0,
frame=0, last_update=t(), frame=0, last_update=t(),
flip_x=false, flip_y=false, loop=false, flip_x=false, flip_y=false, loop=false,
is_done=false,
} }
return s return s
end end
function reset_sprite(s)
s.speed = 0
s.frame = 0
s.last_update = t()
s.is_done = false
end
function update_sprite(s) function update_sprite(s)
local now = t() local now = t()
if s.last_update == 0 then if s.last_update == 0 then
@ -26,6 +34,7 @@ function update_sprite(s)
else else
s.speed = 0 s.speed = 0
s.frame = #s.anim.frames s.frame = #s.anim.frames
s.is_done = true
end end
end end