summaryrefslogblamecommitdiff
path: root/data/test.lua
blob: 5252b82539a5c8b4be9ebba06dd50f80e897f544 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
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()
  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

function my_npc1(npc, ch)
  do_message(npc, ch, "Hello! I am the testing NPC")
  do_message(npc, ch, "This message is just here for testing intertwined connections.")
  do_message(npc, ch, "What do you want?")
  local v = do_choice(npc, ch, "Guns! Lots of guns!", "Nothing.")
  if v == 1 then
    do_message(npc, ch, "Sorry, this is a heroic-fantasy game, I do not have any gun.")
  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")
  if v >= 1 and v <= 2 then
    do_message(npc, ch, "Are you really sure?")
    local w = do_choice(npc, ch, "Yes, I am.", "I still have a few things to do around here.")
    if w == 1 then
      if v == 1 then
        tmw.chr_warp(ch, nil, 60 * 32, 50 * 32)
      else
        tmw.chr_warp(ch, 3, 25 * 32, 25 * 32)
      end
    end
  end
end