summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFernando Carmona Varo <ferkiwi@gmail.com>2015-10-21 22:22:58 +0200
committerFernando Carmona Varo <ferkiwi@gmail.com>2015-10-21 22:22:58 +0200
commit6ea7381e9f0fd639f87de33cad6d9497c0c83888 (patch)
tree064bc665ee053ba8634f41afcbcf4d4e678e151e
parent6d338337d362af15f1038cf73ca154daa57b6b2b (diff)
Added power pellet state, ghosts will run away from the player and get teleported to the ghost spawn
-rwxr-xr-xgamestate.lua25
-rw-r--r--ghost.lua50
-rw-r--r--init.lua4
3 files changed, 64 insertions, 15 deletions
diff --git a/gamestate.lua b/gamestate.lua
index 683ce3f..8b642cb 100755
--- a/gamestate.lua
+++ b/gamestate.lua
@@ -2,6 +2,9 @@
-- Array to hold all the running game states
mypacman.games = {}
+-- Duration of the power pellet effect (in seconds)
+local power_pellet_duration = 10
+
---------------------------------------------------------
-- Public functions (these can be called from any other place)
@@ -50,6 +53,8 @@ function mypacman.game_reset(id, player)
local gamestate = mypacman.games[id]
minetest.log("action", "resetting game " .. id)
+ gamestate.power_pellet = false
+
-- Position the player
local player = player or minetest.get_player_by_name(gamestate.player_name)
player:setpos(gamestate.start)
@@ -117,7 +122,27 @@ function mypacman.on_player_got_pellet(player)
minetest.sound_play("mypacman_beginning", {pos = pos,max_hear_distance = 40,gain = 10.0,})
end)
end
+end
+
+-- A player got a power pellet, update the state
+function mypacman.on_player_got_power_pellet(player)
+ local name = player:get_player_name()
+ local gamestate = mypacman.get_game_by_player(name)
+ if not gamestate then return end
+
+ minetest.chat_send_player(name, "You got a POWER PELLET")
+ gamestate.power_pellet = os.time() + power_pellet_duration
+
+ local boardcenter = vector.add(gamestate.pos, {x=13,y=0.5,z=15})
+ local powersound = minetest.sound_play("mypacman_beginning", {pos = boardcenter,max_hear_distance = 20, object=player, loop=true})
+ minetest.after(power_pellet_duration, function()
+ if os.time() >= (gamestate.power_pellet or 0) then
+ gamestate.power_pellet = false
+ minetest.chat_send_player(name, "POWER PELLET wore off")
+ minetest.sound_stop(powersound)
+ end
+ end)
end
-- Get the game that the given player is playing
diff --git a/ghost.lua b/ghost.lua
index 2714710..7a74bad 100644
--- a/ghost.lua
+++ b/ghost.lua
@@ -1,4 +1,7 @@
+local ghosts_death_delay = 5
+
+
local ghosts = {
{"pinky","Pinky"},
{"inky","Inky"},
@@ -59,23 +62,38 @@ for i in ipairs(ghosts) do
local s = self.object:getpos() -- ghost
local p = player:getpos() -- player
-
+ print(dump(gamestate))
-- find distance from ghost to player
local distance = ((p.x-s.x)^2 + (p.y-s.y)^2 + (p.z-s.z)^2)^0.5
if distance < 1.5 then
- -- player is so close it got catched!!
- gamestate.lives = gamestate.lives - 1
- if gamestate.lives < 1 then
- minetest.chat_send_player(gamestate.player_name,"Game Over")
- player:moveto(vector.add(gamestate.pos,{x=0.5,y=0.5,z=-1.5}))
- mypacman.game_end(self.gameid)
+ -- player touches ghost!!
- elseif gamestate.lives == 1 then
- minetest.chat_send_player(gamestate.player_name,"This is your last life")
- mypacman.game_reset(self.gameid, player)
+ if gamestate.power_pellet then
+ -- Player eats ghost! move it to spawn
+ local ghost_spawn = vector.add(gamestate.pos, {x=13,y=0.5,z=19})
+ self.object:setpos(ghost_spawn)
+ -- set the timer negative so it'll have to wait extra time
+ self.timer = -ghosts_death_delay
+ -- play sound and reward player
+ minetest.sound_play("mypacman_eatfruit", {pos = p,
+ max_hear_distance = 6, gain = 10.0,
+ })
+ player:get_inventory():add_item('main', 'mypacman:cherrys')
else
- minetest.chat_send_player(gamestate.player_name,"You have ".. gamestate.lives .." lives left")
- mypacman.game_reset(self.gameid, player)
+ -- Ghost catches the player!
+ gamestate.lives = gamestate.lives - 1
+ if gamestate.lives < 1 then
+ minetest.chat_send_player(gamestate.player_name,"Game Over")
+ player:moveto(vector.add(gamestate.pos,{x=0.5,y=0.5,z=-1.5}))
+ mypacman.game_end(self.gameid)
+
+ elseif gamestate.lives == 1 then
+ minetest.chat_send_player(gamestate.player_name,"This is your last life")
+ mypacman.game_reset(self.gameid, player)
+ else
+ minetest.chat_send_player(gamestate.player_name,"You have ".. gamestate.lives .." lives left")
+ mypacman.game_reset(self.gameid, player)
+ end
end
else
@@ -84,9 +102,13 @@ for i in ipairs(ghosts) do
if p.x > s.x then
yaw = yaw + math.pi
end
- -- face player and move towards him
+ -- face player and move backwards/forwards
self.object:setyaw(yaw)
- self.set_velocity(self, gamestate.speed)
+ if gamestate.power_pellet then
+ self.set_velocity(self, -gamestate.speed) --negative velocity
+ else
+ self.set_velocity(self, gamestate.speed)
+ end
end
end,
diff --git a/init.lua b/init.lua
index 2ef6f29..cc45f7e 100644
--- a/init.lua
+++ b/init.lua
@@ -64,7 +64,9 @@ minetest.register_node("mypacman:pellet_2", {
{-0.6875, -0.1875, -0.1875, -0.3125, 0.1875, 0.1875},
}
},
- on_destruct = function(pos)
+ after_dig_node = function(pos, oldnode, oldmetadata, digger)
+ mypacman.on_player_got_power_pellet(digger)
+
minetest.sound_play("mypacman_eatfruit", {
pos = pos,
max_hear_distance = 100,