fix explosions
This commit is contained in:
parent
d33aca6f9f
commit
d92817820a
133
games/boybomb.p8
133
games/boybomb.p8
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user