From 99548fb47fee447b5f22d5338501ac574086c4fd Mon Sep 17 00:00:00 2001 From: Guillaume Melquiond Date: Wed, 15 Aug 2007 06:35:03 +0000 Subject: Added helper functions for loading files and NPCs as scripts. Put Lua helpers into a separate library automatically loaded into new contexts. --- data/scripts/libtmw.lua | 111 +++++++++++++++++++++++++++++++++++++++++++++++ data/test.lua | 112 +----------------------------------------------- 2 files changed, 113 insertions(+), 110 deletions(-) create mode 100644 data/scripts/libtmw.lua (limited to 'data') diff --git a/data/scripts/libtmw.lua b/data/scripts/libtmw.lua new file mode 100644 index 0000000..c4a14b6 --- /dev/null +++ b/data/scripts/libtmw.lua @@ -0,0 +1,111 @@ +------------------ +-- Support code -- +------------------ + +function create_npc(id, x, y, handler) + local npc = tmw.obj_create_npc(id, x, y) + npcs[npc] = handler +end + +function do_message(npc, ch, msg) + tmw.msg_npc_message(npc, ch, msg) + coroutine.yield(1) +end + +function do_choice(npc, ch, ...) + tmw.msg_npc_choice(npc, ch, ...) + return coroutine.yield(2) +end + +-- Called whenever a player starts talking to an NPC. +-- Creates a coroutine based on the register NPC handler. +function npc_start(npc, ch) + local h = npcs[npc] + if not h then return end + local co = coroutine.create(h) + local b, v = coroutine.resume(co, npc, ch) + if b and v then + states[ch] = {npc, co, v, 5} + if not timer then + timer = 600 + end + end +end + +-- Called whenever a player keeps talking to an NPC. +-- Checks that the NPC expects it, and resumes the respective coroutine. +function npc_next(npc, ch) + local w = states[ch] + if w and w[1] == npc and w[3] == 1 then + local b, v = coroutine.resume(w[2]) + if b and v then + w[3] = v + w[4] = 5 + else + states[ch] = nil + end + end +end + +-- Called whenever a player selects a particular reply. +-- Checks that the NPC expects it, and resumes the respective coroutine. +function npc_choose(npc, ch, u) + local w = states[ch] + if w and w[1] == npc and w[3] == 2 then + local b, v = coroutine.resume(w[2], u) + if b and v then + w[3] = v + w[4] = 5 + else + states[ch] = nil + end + end +end + +function npc_update(npc) +end + +function update() + -- Run every minute only, in order not to overload the server. + if not timer then return end + timer = timer - 10 + if timer ~= 0 then return end + -- Free connections that have been inactive for 3-4 minutes. + for k, w in pairs(states) do + local t = w[4] - 1 + if t == 0 then + states[k] = nil + else + w[4] = t + end + end + -- Restart timer if there are still some pending states. + if next(states) then + timer = 600 + else + timer = nil + end +end + +function atinit(f) + init_fun[#init_fun + 1] = f +end + +function create_npc_delayed(id, x, y) + -- Bind the name to a local variable first, as it will be reused. + local h = npc_handler + atinit(function() create_npc(id, x, y, h) end) + npc_handler = nil +end + +function initialize() + for i,f in ipairs(init_fun) do + f() + end + init_fun = nil +end + +npcs = {} +states = {} +init_fun = {} + diff --git a/data/test.lua b/data/test.lua index f9ffb8f..28dbf0e 100644 --- a/data/test.lua +++ b/data/test.lua @@ -1,107 +1,11 @@ ------------------- --- Support code -- ------------------- - --- NOTE: Could be put into a separate library - -function create_npc(id, x, y, handler) - local npc = tmw.obj_create_npc(id, x, y) - npcs[npc] = handler -end - -function do_message(npc, ch, msg) - tmw.msg_npc_message(npc, ch, msg) - coroutine.yield(1) -end - -function do_choice(npc, ch, ...) - tmw.msg_npc_choice(npc, ch, ...) - return coroutine.yield(2) -end - --- Called whenever a player starts talking to an NPC. --- Creates a coroutine based on the register NPC handler. -function npc_start(npc, ch) - local h = npcs[npc] - if not h then return end - local co = coroutine.create(h) - local b, v = coroutine.resume(co, npc, ch) - if b and v then - states[ch] = {npc, co, v, 5} - if not timer then - timer = 600 - end - end -end - --- Called whenever a player keeps talking to an NPC. --- Checks that the NPC expects it, and resumes the respective coroutine. -function npc_next(npc, ch) - local w = states[ch] - if w and w[1] == npc and w[3] == 1 then - local b, v = coroutine.resume(w[2]) - if b and v then - w[3] = v - w[4] = 5 - else - states[ch] = nil - end - end -end - --- Called whenever a player selects a particular reply. --- Checks that the NPC expects it, and resumes the respective coroutine. -function npc_choose(npc, ch, u) - local w = states[ch] - if w and w[1] == npc and w[3] == 2 then - local b, v = coroutine.resume(w[2], u) - if b and v then - w[3] = v - w[4] = 5 - else - states[ch] = nil - end - end -end - -function npc_update(npc) -end - -function update() - -- Run every minute only, in order not to overload the server. - if not timer then return end - timer = timer - 10 - if timer ~= 0 then return end - -- Free connections that have been inactive for 3-4 minutes. - for k, w in pairs(states) do - local t = w[4] - 1 - if t == 0 then - states[k] = nil - else - w[4] = t - end - end - -- Restart timer if there are still some pending states. - if next(states) then - timer = 600 - else - timer = nil - end -end - -npcs = {} -states = {} - -------------- -- Map code -- -------------- -function initialize() +atinit(function() create_npc(110, 50 * 32 + 16, 19 * 32 + 16, my_npc1) - create_npc(107, 53 * 32 + 16, 21 * 32 + 16, my_npc2) - create_npc(107, 53 * 32 + 16, 23 * 32 + 16, my_npc3) create_npc(108, 51 * 32 + 16, 25 * 32 + 16, my_npc4) -end +end) function my_npc1(npc, ch) do_message(npc, ch, "Hello! I am the testing NPC") @@ -128,18 +32,6 @@ function my_npc1(npc, ch) end end -npc2_times = 1 - -function my_npc2(npc, ch) - do_message(npc, ch, "You know what?") - do_message(npc, ch, string.format("I have already asked this question %d times today.", npc2_times)) - npc2_times = npc2_times + 1 -end - -function my_npc3(npc, ch) - do_message(npc, ch, "Don't you think the guy behind me is my evil twin?") -end - function my_npc4(npc, ch) do_message(npc, ch, "Where do you want to go?") local v = do_choice(npc, ch, "Map 1", "Map 3") -- cgit