summaryrefslogblamecommitdiff
path: root/plugins/npc.py
blob: 5013562bfe5c1a436e5e6170dc5b3957386248a8 (plain) (tree)






































































































































                                                                    
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