commit 4c10718289e34f7d87c291a032798e42b443254e Author: Segcolt <9hmbzr275@mozmail.com> Date: Tue Dec 3 18:40:14 2024 -0300 Finish the prototype diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..e281406 --- /dev/null +++ b/main.lua @@ -0,0 +1,234 @@ +-- main.lua + +-- Constants +local TILE_SIZE = 40 +local SCREEN_WIDTH = 800 +local SCREEN_HEIGHT = 600 +local MOV_COOLDOWN = 0.2 +local EXPLOSION_TIMEOUT = 0.1 + +-- Player state +local player = { + x = 5 * TILE_SIZE, + y = 5 * TILE_SIZE, + speed = TILE_SIZE, + bombTimer = 0, + maxBombs = 2, + bombCount = 0, + bombSize = 1, +} + +-- Box state +local boxes = {} + +-- Bomb state +local bombs = {} + +-- Explosions state +local explosions = {} + +local time = 1 + +local function search_box(x, y) + for i, box in ipairs(boxes) do + if box.x == x and box.y == y then + return i + end + end + + return nil +end + +local function search_bomb(x, y) + for i, bomb in ipairs(bombs) do + if bomb.x == x and bomb.y == y then + return i + end + end + + return nil +end + +local function generate_box() + local x = math.random(0, SCREEN_WIDTH / TILE_SIZE - 1) * TILE_SIZE + local y = math.random(0, SCREEN_HEIGHT / TILE_SIZE - 1) * TILE_SIZE + local count = 0 + while (search_box(x, y) or (x == player.x and y == player.y)) and count < 100 do + x = math.random(0, SCREEN_WIDTH / TILE_SIZE - 1) * TILE_SIZE + y = math.random(0, SCREEN_HEIGHT / TILE_SIZE - 1) * TILE_SIZE + count = count + 1 + end + if count == 100 then + print("Não foi possível achar uma posição para a caixa") + return + end + table.insert(boxes, {x = x, y = y}) +end + +function love.keypressed(key) + if key == "b" then + generate_box() + return + end + + if key == "i" then + player.bombSize = player.bombSize + 1 + print("Novo tamanho de bomba: ", player.bombSize) + return + end + + if key == "o" then + player.bombSize = math.max(0, player.bombSize - 1) + print("Novo tamanho de bomba: ", player.bombSize) + return + end + + if key == "n" then + player.maxBombs = player.maxBombs + 1 + print("Nova quantidade máxima de bombas: ", player.maxBombs) + return + end + + if key == "m" then + player.maxBombs = math.max(0, player.maxBombs - 1) + print("Nova quantidade máxima de bombas: ", player.maxBombs) + return + end +end + +-- Set up initial map +function love.load() + love.window.setMode(SCREEN_WIDTH, SCREEN_HEIGHT) + love.graphics.setBackgroundColor(0.1, 0.1, 0.1) + + + math.randomseed(os.time()) + + -- Generate some destructible boxes randomly + for i = 1, 10 do + generate_box() + end +end + +local function explode_bomb(i) + local x = bombs[i].x + local y = bombs[i].y + + table.remove(bombs, i) + player.bombCount = player.bombCount - 1 + + local adds = { + {x = 1, y = 0}, + {x = 0, y = 1}, + {x = -1, y = 0}, + {x = 0, y = -1} + } + + table.insert(explosions, {x = x, y = y, time = 0}) + + for cur = 1, player.bombSize do + for _, add in ipairs(adds) do + local xd = x + cur * add.x * TILE_SIZE + local yd = y + cur * add.y * TILE_SIZE + + if xd >= 0 and xd <= SCREEN_WIDTH - TILE_SIZE and yd >= 0 and yd <= SCREEN_WIDTH - TILE_SIZE then + table.insert(explosions, {x = xd, y = yd, time = 0}) + local box = search_box(xd, yd) + if box then + table.remove(boxes, box) + end + end + end + end +end + +-- Player movement handling +function love.update(dt) + -- Player movement + time = time + dt + if time >= MOV_COOLDOWN then + if love.keyboard.isDown("up") or love.keyboard.isDown("w") then + if not search_box(player.x, player.y - player.speed) then + player.y = player.y - player.speed + end + end + + if love.keyboard.isDown("down") or love.keyboard.isDown("s") then + if not search_box(player.x, player.y + player.speed) then + player.y = player.y + player.speed + end + end + + if love.keyboard.isDown("left") or love.keyboard.isDown("a") then + if not search_box(player.x - player.speed, player.y) then + player.x = player.x - player.speed + end + end + + if love.keyboard.isDown("right") or love.keyboard.isDown("d") then + if not search_box(player.x + player.speed, player.y) then + player.x = player.x + player.speed + end + end + + time = 0 + end + + -- Ensure player stays inside the screen boundaries + player.x = math.max(0, math.min(SCREEN_WIDTH - TILE_SIZE, player.x)) + player.y = math.max(0, math.min(SCREEN_HEIGHT - TILE_SIZE, player.y)) + + -- Bomb timer (when bomb is placed, it starts ticking down) + for i, bomb in ipairs(bombs) do + bomb.timer = bomb.timer - dt + if bomb.timer <= 0 then + explode_bomb(i) + end + end + + for i, explosion in ipairs(explosions) do + explosion.time = explosion.time + dt + + if explosion.time >= EXPLOSION_TIMEOUT then + table.remove(explosions, i) + end + end + + -- Place bomb + if love.keyboard.isDown("space") then + -- Prevent placing multiple bombs at once + if player.bombTimer <= 0 and player.bombCount < player.maxBombs and not search_bomb(player.x, player.y) then + table.insert(bombs, {x = player.x, y = player.y, timer = 2, size = player.bombSize}) -- Bomb explodes after 2 seconds + player.bombTimer = 0.15 + player.bombCount = player.bombCount + 1 + end + end + + -- Update bomb cooldown + player.bombTimer = math.max(0, player.bombTimer - dt) +end + +-- Drawing the game world +function love.draw() + -- Draw destructible boxes + love.graphics.setColor(1, 1, 0) + for _, box in ipairs(boxes) do + love.graphics.rectangle("fill", box.x, box.y, TILE_SIZE, TILE_SIZE) + end + + -- Draw player + love.graphics.setColor(0, 0, 1) + love.graphics.circle("fill", player.x + TILE_SIZE / 2, player.y + TILE_SIZE / 2, TILE_SIZE / 2) + + -- Draw bombs + love.graphics.setColor(1, 0, 0) + for _, bomb in ipairs(bombs) do + love.graphics.circle("fill", bomb.x + TILE_SIZE / 2, bomb.y + TILE_SIZE / 2, TILE_SIZE / 2) + end + + -- Draw explosions + love.graphics.setColor(1, 0, 0) + for _, explosion in ipairs(explosions) do + love.graphics.rectangle("fill", explosion.x, explosion.y, TILE_SIZE, TILE_SIZE) + end +end