bomb heat detection
This commit is contained in:
@@ -214,13 +214,25 @@ end
|
|||||||
-- Map module
|
-- Map module
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
function Map.can_move_to(gridX, gridY)
|
function Map.can_move_to(gridX, gridY, player)
|
||||||
if gridX < 1 or gridY < 1 or gridX > MAP_WIDTH or gridY > MAP_HEIGHT then
|
if gridX < 1 or gridY < 1 or gridX > MAP_WIDTH or gridY > MAP_HEIGHT then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
if State.map[gridY][gridX] >= SOLID_WALL then
|
if State.map[gridY][gridX] >= SOLID_WALL then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
-- Check for bombs (but allow staying on bomb you just placed)
|
||||||
|
for _, bomb in ipairs(State.bombs) do
|
||||||
|
local bombGridX = math.floor(bomb.x / TILE_SIZE) + 1
|
||||||
|
local bombGridY = math.floor(bomb.y / TILE_SIZE) + 1
|
||||||
|
if gridX == bombGridX and gridY == bombGridY then
|
||||||
|
-- Allow if player is currently on the bomb (just placed it)
|
||||||
|
if player and player.gridX == bombGridX and player.gridY == bombGridY then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -578,16 +590,16 @@ function AI.has_adjacent_breakable_wall(gridX, gridY)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function AI.has_escape_route(gridX, gridY)
|
function AI.has_escape_route(gridX, gridY, player)
|
||||||
local dirs = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}}
|
local dirs = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}}
|
||||||
for _, dir in ipairs(dirs) do
|
for _, dir in ipairs(dirs) do
|
||||||
local newX = gridX + dir[1]
|
local newX = gridX + dir[1]
|
||||||
local newY = gridY + dir[2]
|
local newY = gridY + dir[2]
|
||||||
if Map.can_move_to(newX, newY) and not AI.is_dangerous(newX, newY) then
|
if Map.can_move_to(newX, newY, player) and not AI.is_dangerous(newX, newY) then
|
||||||
for _, dir2 in ipairs(dirs) do
|
for _, dir2 in ipairs(dirs) do
|
||||||
local safeX = newX + dir2[1]
|
local safeX = newX + dir2[1]
|
||||||
local safeY = newY + dir2[2]
|
local safeY = newY + dir2[2]
|
||||||
if Map.can_move_to(safeX, safeY) then
|
if Map.can_move_to(safeX, safeY, player) then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -608,7 +620,7 @@ function AI.escape_from_bomb(player)
|
|||||||
local newX = player.gridX + dir[1]
|
local newX = player.gridX + dir[1]
|
||||||
local newY = player.gridY + dir[2]
|
local newY = player.gridY + dir[2]
|
||||||
|
|
||||||
if Map.can_move_to(newX, newY) then
|
if Map.can_move_to(newX, newY, player) then
|
||||||
local sc = 0
|
local sc = 0
|
||||||
|
|
||||||
if not AI.in_blast_zone(newX, newY, bombGridX, bombGridY) then
|
if not AI.in_blast_zone(newX, newY, bombGridX, bombGridY) then
|
||||||
@@ -619,7 +631,7 @@ function AI.escape_from_bomb(player)
|
|||||||
local checkX = newX + dir2[1]
|
local checkX = newX + dir2[1]
|
||||||
local checkY = newY + dir2[2]
|
local checkY = newY + dir2[2]
|
||||||
if not (checkX == bombGridX and checkY == bombGridY) then
|
if not (checkX == bombGridX and checkY == bombGridY) then
|
||||||
if Map.can_move_to(checkX, checkY) then
|
if Map.can_move_to(checkX, checkY, player) then
|
||||||
sc = sc + 10
|
sc = sc + 10
|
||||||
if not AI.in_blast_zone(checkX, checkY, bombGridX, bombGridY) then
|
if not AI.in_blast_zone(checkX, checkY, bombGridX, bombGridY) then
|
||||||
sc = sc + 20
|
sc = sc + 20
|
||||||
@@ -655,7 +667,7 @@ function AI.move_and_bomb(player, target)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if should_bomb and player.activeBombs < player.maxBombs and player.bombCooldown <= 0 then
|
if should_bomb and player.activeBombs < player.maxBombs and player.bombCooldown <= 0 then
|
||||||
if AI.has_escape_route(player.gridX, player.gridY) then
|
if AI.has_escape_route(player.gridX, player.gridY, player) then
|
||||||
Bomb.place(player)
|
Bomb.place(player)
|
||||||
player.bombCooldown = AI_BOMB_COOLDOWN
|
player.bombCooldown = AI_BOMB_COOLDOWN
|
||||||
AI.escape_from_bomb(player)
|
AI.escape_from_bomb(player)
|
||||||
@@ -679,7 +691,7 @@ function AI.move_and_bomb(player, target)
|
|||||||
for _, dir in ipairs(dirs) do
|
for _, dir in ipairs(dirs) do
|
||||||
local newGridX = player.gridX + dir[1]
|
local newGridX = player.gridX + dir[1]
|
||||||
local newGridY = player.gridY + dir[2]
|
local newGridY = player.gridY + dir[2]
|
||||||
if Map.can_move_to(newGridX, newGridY) and not AI.is_dangerous(newGridX, newGridY) then
|
if Map.can_move_to(newGridX, newGridY, player) and not AI.is_dangerous(newGridX, newGridY) then
|
||||||
player.gridX = newGridX
|
player.gridX = newGridX
|
||||||
player.gridY = newGridY
|
player.gridY = newGridY
|
||||||
return
|
return
|
||||||
@@ -700,7 +712,7 @@ function AI.update(player, target)
|
|||||||
for _, dir in ipairs(dirs) do
|
for _, dir in ipairs(dirs) do
|
||||||
local newX = player.gridX + dir[1]
|
local newX = player.gridX + dir[1]
|
||||||
local newY = player.gridY + dir[2]
|
local newY = player.gridY + dir[2]
|
||||||
if Map.can_move_to(newX, newY) then
|
if Map.can_move_to(newX, newY, player) then
|
||||||
local safe = not AI.is_dangerous(newX, newY)
|
local safe = not AI.is_dangerous(newX, newY)
|
||||||
if safe and not best_safe then
|
if safe and not best_safe then
|
||||||
best_dir = dir
|
best_dir = dir
|
||||||
@@ -790,7 +802,7 @@ function Player.handle_input(player)
|
|||||||
newGridX = player.gridX + 1
|
newGridX = player.gridX + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
if Map.can_move_to(newGridX, newGridY) then
|
if Map.can_move_to(newGridX, newGridY, player) then
|
||||||
player.gridX = newGridX
|
player.gridX = newGridX
|
||||||
player.gridY = newGridY
|
player.gridY = newGridY
|
||||||
end
|
end
|
||||||
@@ -816,7 +828,7 @@ function Player.handle_input_p2(player)
|
|||||||
newGridX = player.gridX + 1
|
newGridX = player.gridX + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
if Map.can_move_to(newGridX, newGridY) then
|
if Map.can_move_to(newGridX, newGridY, player) then
|
||||||
player.gridX = newGridX
|
player.gridX = newGridX
|
||||||
player.gridY = newGridY
|
player.gridY = newGridY
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user