Allow include rules to contain a "pre" block which will be evaluated to decide

whether to allow the file(s) to be included. This is treated in exactly the same
way as the "pre" blocks for all other rules.
A test map demonstrating this in use is included.


git-svn-id: svn://svn.code.sf.net/p/crossfire/code/maps/trunk@13049 282e977c-c81d-0410-88c4-b93c2d0d6712
master
cavesomething 2010-04-30 17:19:34 +00:00
parent 96f4ed3945
commit 1c6503f49c
6 changed files with 62 additions and 7 deletions

View File

@ -163,6 +163,17 @@ class DialogRule:
def getRequires(self): def getRequires(self):
return self.__requirements return self.__requirements
# This is a subclass of the generic dialog rule that we use for determining whether to
# 'include' additional rules.
class IncludeRule(DialogRule):
def __init__(self, presemaphores):
self.__presems = presemaphores
# I could get round doing this by creating a third class to inherit both this and
# DialogRule from, but this is the easier approach
def getPreconditions(self):
return self.__presems
class Dialog: class Dialog:
# A character is the source that supplies keywords that drive the dialog. # A character is the source that supplies keywords that drive the dialog.
# The speaker is the NPC that responds to the keywords. A location is an # The speaker is the NPC that responds to the keywords. A location is an

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# npc_dialog.py - Dialog helper class # npc_dialog.py - Dialog helper class
# #
# Copyright (C) 2007 David Delbecq # Copyright (C) 2007 David Delbecq
@ -41,7 +42,7 @@
import Crossfire import Crossfire
import os import os
from CFDialog import DialogRule, Dialog from CFDialog import DialogRule, Dialog, IncludeRule
import cjson import cjson
location = "defaultdialognamespace" location = "defaultdialognamespace"
@ -66,10 +67,21 @@ def parseJSON(filename):
location = params["location"] location = params["location"]
for jsonRule in params["rules"]: for jsonRule in params["rules"]:
if "include" in jsonRule: 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"] newfiles = jsonRule["include"]
# this isn't a 'real' rule, so we don't include it, but we do if shouldinclude == 1:
# include the results of parsing it. # this isn't a 'real' rule, so we don't include it, but we do
parameters.extend(parseJSON(newfiles)) # include the results of parsing it.
parameters.extend(parseJSON(newfiles))
else:
Crossfire.Log(Crossfire.LogDebug, "Ignoring NPC dialog from %s, conditions not met" % newfiles)
else: else:
parameters.append(jsonRule) parameters.append(jsonRule)
return parameters return parameters

View File

@ -0,0 +1,14 @@
{
"rules": [
{
"match" : ["6", "six"],
"pre" : [],
"post" : [],
"msg" : ["You said 6."]
},{
"match" : ["*"],
"pre" : [],
"post" : [],
"msg" : ["I can count up to 6 now, I am clevar."]
}
]}

View File

@ -0,0 +1,9 @@
{
"rules": [
{
"match" : ["7", "seven"],
"pre" : [],
"post" : [],
"msg" : ["You said 7."]
}
]}

View File

@ -11,9 +11,12 @@
},{ },{
"include" : ["test/quest_handling/girl3.msg", "test/quest_handling/girl4.msg"] "include" : ["test/quest_handling/girl3.msg", "test/quest_handling/girl4.msg"]
},{ },{
"include" : ["test/quest_handling/girl7.msg", "test/quest_handling/girl6.msg"],
"pre" : [["token", "can count high", "1"]]
},{
"match" : ["*"], "match" : ["*"],
"pre" : [], "pre" : [],
"post" : [], "post" : [["settoken", "can count high", "1"]],
"msg" : ["You didn't say a number to me."] "msg" : ["You didn't say a number to me."]
} }
]} ]}

View File

@ -5,7 +5,7 @@ width 20
height 10 height 10
msg msg
Created: 2010-03-22 Cavesomething Created: 2010-03-22 Cavesomething
Modified: 2010-04-27 Cavesomething Modified: 2010-04-30 Cavesomething
endmsg endmsg
end end
arch graymarble arch graymarble
@ -1167,7 +1167,13 @@ end
arch sign arch sign
msg msg
This dancing girl uses rules from multiple files that include each other. This dancing girl uses rules from multiple files that include each other.
say a number between 1 and 6, and you will get a response. say a number between 1 and 5, and you will get a response.
If you say either 6 or 7, then she will only understand you if you have
said something other than 1-5 previously
Demonstrates:
Dialogs 'include'ing files
Conditional including
endmsg endmsg
x 19 x 19
y 1 y 1