powerups
This commit is contained in:
57
bomberman.rb
57
bomberman.rb
@@ -22,9 +22,14 @@ $player = {
|
|||||||
gridY: 1,
|
gridY: 1,
|
||||||
pixelX: 16,
|
pixelX: 16,
|
||||||
pixelY: 16,
|
pixelY: 16,
|
||||||
moving: false
|
moving: false,
|
||||||
|
maxBombs: 1,
|
||||||
|
activeBombs: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# powerups (extra bombs hidden under breakable walls)
|
||||||
|
$powerups = []
|
||||||
|
|
||||||
# game objects
|
# game objects
|
||||||
$bombs = []
|
$bombs = []
|
||||||
$explosions = []
|
$explosions = []
|
||||||
@@ -55,17 +60,36 @@ $map = [
|
|||||||
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
|
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def init_powerups
|
||||||
|
$powerups = []
|
||||||
|
# find all breakable walls and randomly place powerups under some
|
||||||
|
(0..8).each do |row|
|
||||||
|
(0..14).each do |col|
|
||||||
|
if $map[row][col] == BREAKABLE_WALL && rand < 0.3
|
||||||
|
$powerups << { gridX: col, gridY: row, type: :bomb }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
init_powerups
|
||||||
|
|
||||||
def TIC
|
def TIC
|
||||||
cls(0)
|
cls(0)
|
||||||
|
|
||||||
# handle player movement
|
# handle player movement
|
||||||
update_player
|
update_player
|
||||||
|
|
||||||
# place bomb
|
# place bomb (only if we have available bombs)
|
||||||
if btnp(4)
|
if btnp(4) && $player[:activeBombs] < $player[:maxBombs]
|
||||||
bombX = $player[:gridX] * TILE_SIZE
|
bombX = $player[:gridX] * TILE_SIZE
|
||||||
bombY = $player[:gridY] * TILE_SIZE
|
bombY = $player[:gridY] * TILE_SIZE
|
||||||
$bombs << { x: bombX, y: bombY, timer: BOMB_TIMER }
|
# check if there's already a bomb at this position
|
||||||
|
already_bomb = $bombs.any? { |b| b[:x] == bombX && b[:y] == bombY }
|
||||||
|
unless already_bomb
|
||||||
|
$bombs << { x: bombX, y: bombY, timer: BOMB_TIMER }
|
||||||
|
$player[:activeBombs] += 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# update bombs
|
# update bombs
|
||||||
@@ -74,6 +98,7 @@ def TIC
|
|||||||
if bomb[:timer] <= 0
|
if bomb[:timer] <= 0
|
||||||
explode(bomb[:x], bomb[:y])
|
explode(bomb[:x], bomb[:y])
|
||||||
$bombs.delete(bomb)
|
$bombs.delete(bomb)
|
||||||
|
$player[:activeBombs] -= 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -97,6 +122,26 @@ def TIC
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# draw powerups (only visible when wall is destroyed)
|
||||||
|
$powerups.each do |pw|
|
||||||
|
if $map[pw[:gridY]][pw[:gridX]] == EMPTY
|
||||||
|
drawX = pw[:gridX] * TILE_SIZE
|
||||||
|
drawY = pw[:gridY] * TILE_SIZE
|
||||||
|
# draw bomb powerup as small circle with B
|
||||||
|
rect(drawX + 3, drawY + 3, 10, 10, 6)
|
||||||
|
print("B", drawX + 5, drawY + 5, 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# check powerup pickup
|
||||||
|
$powerups.reverse_each do |pw|
|
||||||
|
if $map[pw[:gridY]][pw[:gridX]] == EMPTY &&
|
||||||
|
$player[:gridX] == pw[:gridX] && $player[:gridY] == pw[:gridY]
|
||||||
|
$player[:maxBombs] += 1
|
||||||
|
$powerups.delete(pw)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# draw bombs
|
# draw bombs
|
||||||
$bombs.each do |bomb|
|
$bombs.each do |bomb|
|
||||||
circ(bomb[:x] + 8, bomb[:y] + 8, 6, 2)
|
circ(bomb[:x] + 8, bomb[:y] + 8, 6, 2)
|
||||||
@@ -140,6 +185,8 @@ def TIC
|
|||||||
end
|
end
|
||||||
|
|
||||||
print("ARROWS:MOVE A:BOMB", 50, 2, 15)
|
print("ARROWS:MOVE A:BOMB", 50, 2, 15)
|
||||||
|
available = $player[:maxBombs] - $player[:activeBombs]
|
||||||
|
print("BOMBS:#{available}/#{$player[:maxBombs]}", 170, 2, 11)
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_player
|
def update_player
|
||||||
@@ -239,6 +286,8 @@ def reset_player
|
|||||||
$player[:pixelX] = 16
|
$player[:pixelX] = 16
|
||||||
$player[:pixelY] = 16
|
$player[:pixelY] = 16
|
||||||
$player[:moving] = false
|
$player[:moving] = false
|
||||||
|
$player[:maxBombs] = 1
|
||||||
|
$player[:activeBombs] = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
def reset_enemy
|
def reset_enemy
|
||||||
|
|||||||
Reference in New Issue
Block a user