118 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
# -*- coding: utf-8 -*-
 | 
						|
# npc_dialog.py - Dialog helper class
 | 
						|
#
 | 
						|
# Copyright (C) 2007 David Delbecq
 | 
						|
#
 | 
						|
# This program is free software; you can redistribute it and/or modify
 | 
						|
# it under the terms of the GNU General Public License as published by
 | 
						|
# the Free Software Foundation; either version 2 of the License, or
 | 
						|
# (at your option) any later version.
 | 
						|
#
 | 
						|
# This program is distributed in the hope that it will be useful,
 | 
						|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
# GNU General Public License for more details.
 | 
						|
#
 | 
						|
# You should have received a copy of the GNU General Public License
 | 
						|
# along with this program; if not, write to the Free Software
 | 
						|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
						|
#
 | 
						|
#
 | 
						|
# This is a simple script that makes use of CFNPCDialog.py and that receives
 | 
						|
# parameters from a JSON inside the event message. 
 | 
						|
#
 | 
						|
# An example of a map file entry is:
 | 
						|
#
 | 
						|
# arch guildmaster
 | 
						|
# name Sigmund
 | 
						|
# msg
 | 
						|
#
 | 
						|
# endmsg
 | 
						|
# x 11
 | 
						|
# y 7
 | 
						|
# arch event_say
 | 
						|
# name start/sigmund.msg
 | 
						|
# title Python
 | 
						|
# slaying /python/dialog/npc_dialog.py
 | 
						|
# end
 | 
						|
# end
 | 
						|
#
 | 
						|
# see http://wiki.metalforge.net/doku.php/user:cavesomething:guide_to_quest_dialogs 
 | 
						|
# for lots of detail on how to use this, and look at examples in test/quest_handling
 | 
						|
 | 
						|
import Crossfire
 | 
						|
import os
 | 
						|
from CFDialog import DialogRule, Dialog, IncludeRule
 | 
						|
import cjson
 | 
						|
import random
 | 
						|
 | 
						|
location = "defaultdialognamespace"
 | 
						|
 | 
						|
def parseJSON(filename, relpath):
 | 
						|
    global location
 | 
						|
    parameters = []
 | 
						|
    for filenm in filename:
 | 
						|
        if filenm[0] == "/":
 | 
						|
            filepath = os.path.join(Crossfire.DataDirectory(),
 | 
						|
                            Crossfire.MapDirectory(), filenm[1:])
 | 
						|
        else:
 | 
						|
            filepath = os.path.join(Crossfire.DataDirectory(),
 | 
						|
                            Crossfire.MapDirectory(), relpath, filenm)
 | 
						|
        try:
 | 
						|
            f = open(filepath,'rb')
 | 
						|
        except:
 | 
						|
            Crossfire.Log(Crossfire.LogDebug, "Error loading NPC dialog %s" % filepath)
 | 
						|
            raise
 | 
						|
        else:
 | 
						|
            Crossfire.Log(Crossfire.LogDebug, "Loading NPC dialog %s" % filepath)
 | 
						|
            params = cjson.decode(f.read())
 | 
						|
            f.close()
 | 
						|
        if "location" in params:
 | 
						|
            location = params["location"]
 | 
						|
        for jsonRule in params["rules"]:
 | 
						|
            if "include" in jsonRule:
 | 
						|
                shouldinclude = 0
 | 
						|
                if "pre" in jsonRule:
 | 
						|
                    incldialog = Dialog(player, npc, location)
 | 
						|
                    inclrule = IncludeRule(jsonRule["pre"])
 | 
						|
                    # There will only ever be one 'pre' block for an include
 | 
						|
                    shouldinclude = incldialog.matchConditions(inclrule)
 | 
						|
                else:
 | 
						|
                    shouldinclude =1
 | 
						|
                newfiles = jsonRule["include"]
 | 
						|
                if shouldinclude == 1:
 | 
						|
                    # this isn't a 'real' rule, so we don't include it, but we do 
 | 
						|
                    # include the results of parsing it.
 | 
						|
                    parameters.extend(parseJSON(newfiles, os.path.dirname(filepath)))
 | 
						|
                else:
 | 
						|
                    Crossfire.Log(Crossfire.LogDebug, "Ignoring NPC dialog from %s, conditions not met" % newfiles)
 | 
						|
            else:
 | 
						|
                parameters.append(jsonRule)
 | 
						|
    return parameters
 | 
						|
 | 
						|
npc = Crossfire.WhoAmI()
 | 
						|
#event = Crossfire.WhatIsEvent()
 | 
						|
player = Crossfire.WhoIsActivator()
 | 
						|
if (Crossfire.ScriptParameters() != None):
 | 
						|
    filename = Crossfire.ScriptParameters()
 | 
						|
    dialogs = parseJSON([filename], '')
 | 
						|
speech = Dialog(player, npc, location)
 | 
						|
index = 0;
 | 
						|
 | 
						|
for jsonRule in dialogs:
 | 
						|
    replies = None
 | 
						|
    if jsonRule.has_key('replies'):
 | 
						|
        replies = jsonRule['replies']
 | 
						|
    rule = DialogRule(jsonRule["match"],
 | 
						|
                      jsonRule["pre"],
 | 
						|
                      jsonRule["msg"],
 | 
						|
                      jsonRule["post"],
 | 
						|
                      replies)
 | 
						|
    speech.addRule(rule, index)
 | 
						|
    index = index + 1
 | 
						|
 | 
						|
if speech.speak(Crossfire.WhatIsMessage()) == 0:
 | 
						|
    # block the NPC for some time
 | 
						|
    Crossfire.WhoAmI().WriteKey('talked_to', str(random.randint(3, 8)), 1);
 | 
						|
    Crossfire.SetReturnValue(1)
 |