4
0

2 player mode

This commit is contained in:
Zsolt Tasnadi
2025-12-04 14:23:41 +01:00
parent a61cbc6ebf
commit 17539bc11a

View File

@@ -6,7 +6,7 @@
-- version: 0.2 -- version: 0.2
-- script: lua -- script: lua
-- luacheck: globals TIC btn btnp cls rect spr print exit sfx keyp -- luacheck: globals TIC btn btnp cls rect spr print exit sfx keyp key
-- luacheck: max line length 150 -- luacheck: max line length 150
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@@ -81,6 +81,7 @@ local State = {
game_state = GAME_STATE_SPLASH, game_state = GAME_STATE_SPLASH,
splash_timer = SPLASH_DURATION, splash_timer = SPLASH_DURATION,
menu_selection = 1, menu_selection = 1,
two_player_mode = false,
players = {}, players = {},
powerups = {}, powerups = {},
bombs = {}, bombs = {},
@@ -188,6 +189,27 @@ function Input.down_pressed()
return btnp(1) return btnp(1)
end end
-- Player 2 inputs (WASD + G for bomb)
function Input.p2_up()
return key(23) or btn(8) -- W key or gamepad 2 up
end
function Input.p2_down()
return key(19) or btn(9) -- S key or gamepad 2 down
end
function Input.p2_left()
return key(1) or btn(10) -- A key or gamepad 2 left
end
function Input.p2_right()
return key(4) or btn(11) -- D key or gamepad 2 right
end
function Input.p2_action()
return keyp(7) or btnp(12) -- G key or gamepad 2 A
end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- Map module -- Map module
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@@ -315,7 +337,11 @@ function UI.draw_game()
-- score display -- score display
print(State.score[1]..":"..State.score[2], 5, 2, COLOR_BLUE) print(State.score[1]..":"..State.score[2], 5, 2, COLOR_BLUE)
print("ARROWS:MOVE SPACE:BOMB", 50, 2, COLOR_WHITE) if State.two_player_mode then
print("P1:ARROWS+SPACE P2:WASD+G", 40, 2, COLOR_WHITE)
else
print("ARROWS:MOVE SPACE:BOMB", 50, 2, COLOR_WHITE)
end
local human = State.players[1] local human = State.players[1]
if human then if human then
local available = human.maxBombs - human.activeBombs local available = human.maxBombs - human.activeBombs
@@ -341,24 +367,30 @@ function UI.update_menu()
UI.print_shadow("Bomberman", 85, 30, COLOR_BLUE, false, 2) UI.print_shadow("Bomberman", 85, 30, COLOR_BLUE, false, 2)
UI.print_shadow("Clone", 100, 50, COLOR_BLUE, false, 2) UI.print_shadow("Clone", 100, 50, COLOR_BLUE, false, 2)
local play_color = (State.menu_selection == 1) and COLOR_GREEN_LIGHT or COLOR_WHITE local p1_color = (State.menu_selection == 1) and COLOR_GREEN_LIGHT or COLOR_WHITE
local exit_color = (State.menu_selection == 2) and COLOR_GREEN_LIGHT or COLOR_WHITE local p2_color = (State.menu_selection == 2) and COLOR_GREEN_LIGHT or COLOR_WHITE
local exit_color = (State.menu_selection == 3) and COLOR_GREEN_LIGHT or COLOR_WHITE
if State.menu_selection == 1 then local cursor_y = 80 + (State.menu_selection - 1) * 20
UI.print_shadow(">", 85, 90, COLOR_GREEN_LIGHT) UI.print_shadow(">", 60, cursor_y, COLOR_GREEN_LIGHT)
else
UI.print_shadow(">", 85, 110, COLOR_GREEN_LIGHT)
end
UI.print_shadow("Play", 95, 90, play_color) UI.print_shadow("1 Player Game", 70, 80, p1_color)
UI.print_shadow("Exit", 95, 110, exit_color) UI.print_shadow("2 Player Game", 70, 100, p2_color)
UI.print_shadow("Exit", 70, 120, exit_color)
if Input.up_pressed() then if Input.up_pressed() then
State.menu_selection = 1 State.menu_selection = State.menu_selection - 1
if State.menu_selection < 1 then State.menu_selection = 3 end
elseif Input.down_pressed() then elseif Input.down_pressed() then
State.menu_selection = 2 State.menu_selection = State.menu_selection + 1
if State.menu_selection > 3 then State.menu_selection = 1 end
elseif Input.action_pressed() then elseif Input.action_pressed() then
if State.menu_selection == 1 then if State.menu_selection == 1 then
State.two_player_mode = false
State.game_state = GAME_STATE_PLAYING
Game.init()
elseif State.menu_selection == 2 then
State.two_player_mode = true
State.game_state = GAME_STATE_PLAYING State.game_state = GAME_STATE_PLAYING
Game.init() Game.init()
else else
@@ -768,6 +800,32 @@ function Player.handle_input(player)
end end
end end
function Player.handle_input_p2(player)
if player.moving then return end
local newGridX = player.gridX
local newGridY = player.gridY
if Input.p2_up() then
newGridY = player.gridY - 1
elseif Input.p2_down() then
newGridY = player.gridY + 1
elseif Input.p2_left() then
newGridX = player.gridX - 1
elseif Input.p2_right() then
newGridX = player.gridX + 1
end
if Map.can_move_to(newGridX, newGridY) then
player.gridX = newGridX
player.gridY = newGridY
end
if Input.p2_action() then
Bomb.place(player)
end
end
function Player.reset(player) function Player.reset(player)
player.gridX = player.spawnX player.gridX = player.spawnX
player.gridY = player.spawnY player.gridY = player.spawnY
@@ -787,7 +845,8 @@ end
function Game.init() function Game.init()
State.players = {} State.players = {}
table.insert(State.players, Player.create(2, 2, COLOR_BLUE, false)) table.insert(State.players, Player.create(2, 2, COLOR_BLUE, false))
table.insert(State.players, Player.create(14, 8, COLOR_RED, true)) local p2_is_ai = not State.two_player_mode
table.insert(State.players, Player.create(14, 8, COLOR_RED, p2_is_ai))
Map.init_powerups() Map.init_powerups()
end end
@@ -883,12 +942,14 @@ function TIC()
local human_player = State.players[1] local human_player = State.players[1]
-- update all players -- update all players
for _, player in ipairs(State.players) do for idx, player in ipairs(State.players) do
Player.update_movement(player) Player.update_movement(player)
if player.is_ai then if player.is_ai then
AI.update(player, human_player) AI.update(player, human_player)
else elseif idx == 1 then
Player.handle_input(player) Player.handle_input(player)
else
Player.handle_input_p2(player)
end end
end end