From c4724ed38736a2049b1c7bd795f782f64c208bfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Thu, 22 Jan 2015 22:29:55 +0100 Subject: [PATCH 1/2] Introduced a convenience function for creating patrolling NPCs It seems all patrolling NPCs need to be assigned to their patrol instance and call block/unblock in their talk function. The new NPCPatrol:create_npc function does both things. npc = patrol:create_npc(talk, update) --- scripts/functions/npcpatrol.lua | 23 +++++++++++++++----- scripts/functions/patrol.lua | 7 +++--- scripts/npcs/casern_cellar/prisonerdavid.lua | 7 ++---- scripts/npcs/village/thea.lua | 9 ++------ 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/scripts/functions/npcpatrol.lua b/scripts/functions/npcpatrol.lua index 0f009a5..6dc0c26 100644 --- a/scripts/functions/npcpatrol.lua +++ b/scripts/functions/npcpatrol.lua @@ -28,12 +28,12 @@ local mt = {__index=NPCPatrol} function NPCPatrol:new(name) local patrol = Patrol:new(name) setmetatable(patrol, mt) - patrol.blocked_dialouges = {} + patrol.blocked_dialogues = {} return patrol end function NPCPatrol:block(ch, delay) - self.blocked_dialouges[ch] = delay or -1 + self.blocked_dialogues[ch] = delay or -1 for _, member in ipairs(self.members) do member:walk(member:position()) end @@ -43,17 +43,17 @@ function NPCPatrol:block(ch, delay) end function NPCPatrol:unblock(ch) - self.blocked_dialouges[ch] = nil + self.blocked_dialogues[ch] = nil end function NPCPatrol:logic() local free = true - for ch, timer in pairs(self.blocked_dialouges) do + for ch, timer in pairs(self.blocked_dialogues) do if timer > 1 or timer < 0 then free = false - self.blocked_dialouges[ch] = timer - 1 + self.blocked_dialogues[ch] = timer - 1 else - self.blocked_dialouges[ch] = nil + self.blocked_dialogues[ch] = nil end end @@ -62,3 +62,14 @@ function NPCPatrol:logic() end end +function NPCPatrol:create_npc(talk_func, update_func) + talk_func = function(npc, ch) + self:block(ch) + talk_func(npc, ch) + self:unblock(ch) + end + + local npc = create_npc_by_name(self.name, talk_func, update_func) + self:assign_being(npc) + return npc +end diff --git a/scripts/functions/patrol.lua b/scripts/functions/patrol.lua index dfcf402..e86531b 100644 --- a/scripts/functions/patrol.lua +++ b/scripts/functions/patrol.lua @@ -1,12 +1,12 @@ --[[ Script for grouping beings together and letting them patroul - + For creating a patrol choose a name. Then add objects to the map. The name of the object has to start with the name followed by a space and then the index number of the waypoint. The type of the object has to be set to WAYPOINT. - + Possible object parameters: + stroll -> The radius in pixels that will allow the beings to stroll is a being out of this radius it will walk to a random @@ -58,12 +58,13 @@ function Patrol:new(name) path[id] = {x=x + w / 2, y=y + h / 2, tolerance=tolerance, stroll=stroll} end end - + assert(#path >= 1, "Path \"" .. name .. "\" need to have at least one waypoint") return setmetatable({ position_index = 1, path = path, + name = name, members = {} }, mt) end diff --git a/scripts/npcs/casern_cellar/prisonerdavid.lua b/scripts/npcs/casern_cellar/prisonerdavid.lua index 4756d7a..1df9099 100644 --- a/scripts/npcs/casern_cellar/prisonerdavid.lua +++ b/scripts/npcs/casern_cellar/prisonerdavid.lua @@ -22,13 +22,10 @@ local patrol = NPCPatrol:new("Prisoner David") local function prisoner_talk(npc, ch) - patrol:block(ch) say("...") - patrol:unblock(ch) end -local prisoner = create_npc_by_name("Prisoner David", prisoner_talk) - +local prisoner = patrol:create_npc(prisoner_talk) prisoner:set_base_attribute(16, 2) -patrol:assign_being(prisoner) + schedule_every(3, function() patrol:logic() end) diff --git a/scripts/npcs/village/thea.lua b/scripts/npcs/village/thea.lua index 6323670..42e5137 100644 --- a/scripts/npcs/village/thea.lua +++ b/scripts/npcs/village/thea.lua @@ -24,17 +24,12 @@ local patrol = NPCPatrol:new("Thea") local function woman_talk(npc, ch) - patrol:block(ch) - say("I'm really worried about all these boys out there in the forest.") say("Fighting against the king is a rather serious thing. " .. "I wonder if they're aware what danger they put themselves into.") - patrol:unblock(ch) end -local woman = create_npc_by_name("Thea", woman_talk) - +local woman = patrol:create_npc(woman_talk) woman:set_base_attribute(16, 2) -patrol:assign_being(woman) -schedule_every(3, function() patrol:logic() end) +schedule_every(3, function() patrol:logic() end) From 7f2c6f01b31e242291385557dd61b9ac318ae0d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Sun, 25 Jan 2015 23:23:01 +0100 Subject: [PATCH 2/2] Fixed stack overflow --- scripts/functions/npcpatrol.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/functions/npcpatrol.lua b/scripts/functions/npcpatrol.lua index 6dc0c26..5274410 100644 --- a/scripts/functions/npcpatrol.lua +++ b/scripts/functions/npcpatrol.lua @@ -63,13 +63,13 @@ function NPCPatrol:logic() end function NPCPatrol:create_npc(talk_func, update_func) - talk_func = function(npc, ch) + local blocking_talk_func = function(npc, ch) self:block(ch) talk_func(npc, ch) self:unblock(ch) end - local npc = create_npc_by_name(self.name, talk_func, update_func) + local npc = create_npc_by_name(self.name, blocking_talk_func, update_func) self:assign_being(npc) return npc end