summaryrefslogtreecommitdiff
path: root/plugins/npc.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/npc.py')
-rw-r--r--plugins/npc.py135
1 files changed, 135 insertions, 0 deletions
diff --git a/plugins/npc.py b/plugins/npc.py
new file mode 100644
index 0000000..5013562
--- /dev/null
+++ b/plugins/npc.py
@@ -0,0 +1,135 @@
+import net.mapserv as mapserv
+from commands import commands, must_have_arg
+from loggers import debuglog
+from utils import extends
+from actor import find_nearest_being
+
+
+__all__ = [ 'PLUGIN', 'init', 'autonext', 'npc_id', 'input_type' ]
+
+
+PLUGIN = {
+ 'name': 'npc',
+ 'requires': (),
+ 'blocks': (),
+}
+
+npc_id = -1
+autonext = True
+input_type = ''
+
+
+@extends('smsg_npc_message')
+def npc_message(data):
+ npc = mapserv.beings_cache.findName(data.id)
+ m = '[npc] {} : {}'.format(npc, data.message)
+ debuglog.info(m)
+
+
+@extends('smsg_npc_choice')
+def npc_choice(data):
+ global npc_id
+ global input_type
+ npc_id = data.id
+ input_type = 'select'
+ choices = filter(lambda s: len(s.strip()) > 0,
+ data.select.split(':'))
+ debuglog.info('[npc][select]')
+ for i, s in enumerate(choices):
+ debuglog.info(' %d) %s', i + 1, s)
+
+
+@extends('smsg_npc_close')
+def npc_close(data):
+ if autonext:
+ global npc_id
+ npc_id = -1
+ mapserv.cmsg_npc_close(data.id)
+ else:
+ debuglog.info('[npc][close]')
+
+
+@extends('smsg_npc_next')
+def npc_next(data):
+ if autonext:
+ mapserv.cmsg_npc_next_request(data.id)
+ else:
+ debuglog.info('[npc][next]')
+
+
+@extends('smsg_npc_int_input')
+def npc_int_input(data):
+ global input_type
+ input_type = 'int'
+ debuglog.info('[npc][input] Enter number:')
+
+
+@extends('smsg_npc_str_input')
+def npc_str_input(data):
+ global input_type
+ input_type = 'str'
+ debuglog.info('[npc][input] Enter string:')
+
+
+@must_have_arg
+def cmd_npctalk(_, arg):
+ global npc_id
+ jobs = []
+ name = ''
+ try:
+ jobs = [int(arg)]
+ except ValueError:
+ name = arg
+
+ b = find_nearest_being(name=name, type='npc', allowed_jobs=jobs)
+
+ if b is not None:
+ npc_id = b.id
+ mapserv.cmsg_npc_talk(npc_id)
+ else:
+ debuglog.warning("NPC %s not found", arg)
+
+
+def cmd_npcclose(*unused):
+ global npc_id
+ if npc_id > -1:
+ mapserv.cmsg_npc_close(npc_id)
+ npc_id = -1
+
+
+def cmd_npcnext(*unused):
+ if npc_id > -1:
+ mapserv.cmsg_npc_next_request(npc_id)
+
+
+@must_have_arg
+def cmd_npcinput(_, arg):
+ if npc_id < 0:
+ return
+
+ global input_type
+
+ if input_type in ('int', 'select'):
+ try:
+ n = int(arg)
+ except ValueError, e:
+ debuglog.error(e.message)
+ return
+
+ if input_type == 'int':
+ mapserv.cmsg_npc_int_response(npc_id, n)
+
+ elif input_type == 'str':
+ mapserv.cmsg_npc_str_response(npc_id, arg)
+
+ elif input_type == 'select':
+ mapserv.cmsg_npc_list_choice(npc_id, n)
+
+ input_type = ''
+
+
+def init(config):
+ commands['talk'] = cmd_npctalk
+ commands['close'] = cmd_npcclose
+ commands['next'] = cmd_npcnext
+ commands['input'] = cmd_npcinput