Add 'npctoken' and 'setnpctoken' pre and post conditions, to keep data in NPC instead of player.
git-svn-id: svn://svn.code.sf.net/p/crossfire/code/maps/trunk@13336 282e977c-c81d-0410-88c4-b93c2d0d6712master
parent
33401e83d1
commit
e0538867c4
|
@ -297,8 +297,8 @@ class Dialog:
|
||||||
if os.path.isfile(path):
|
if os.path.isfile(path):
|
||||||
try:
|
try:
|
||||||
exec(open(path).read())
|
exec(open(path).read())
|
||||||
except:
|
except Exception as error:
|
||||||
Crossfire.Log(Crossfire.LogError, "CFDialog: Failed to set post-condition %s." % condition)
|
Crossfire.Log(Crossfire.LogError, "CFDialog: Failed to set post-condition %s:%s." %(condition, error))
|
||||||
else:
|
else:
|
||||||
Crossfire.Log(Crossfire.LogError, "CFDialog: Post Block called with unknown action %s." % action)
|
Crossfire.Log(Crossfire.LogError, "CFDialog: Post Block called with unknown action %s." % action)
|
||||||
|
|
||||||
|
@ -344,3 +344,46 @@ class Dialog:
|
||||||
finished = finished + ";"
|
finished = finished + ";"
|
||||||
finished = finished + key + ":" + value
|
finished = finished + key + ":" + value
|
||||||
self.__character.WriteKey("dialog_" + self.__location, finished, 1)
|
self.__character.WriteKey("dialog_" + self.__location, finished, 1)
|
||||||
|
|
||||||
|
# Search the NPC for a particular flag, and if it exists, return
|
||||||
|
# its value. Flag names are combined with the unique dialog "location"
|
||||||
|
# identifier and the player's name, and are therefore are not required
|
||||||
|
# to be unique. This also prevents flags from conflicting with other
|
||||||
|
# non-dialog-related contents in the NPC.
|
||||||
|
def getNPCStatus(self, key):
|
||||||
|
npc_status=self.__speaker.ReadKey("dialog_"+self.__location + "_" + self.__character.Name);
|
||||||
|
if npc_status == "":
|
||||||
|
return "0"
|
||||||
|
pairs=npc_status.split(";")
|
||||||
|
for i in pairs:
|
||||||
|
subpair=i.split(":")
|
||||||
|
if subpair[0] == key:
|
||||||
|
return subpair[1]
|
||||||
|
return "0"
|
||||||
|
|
||||||
|
# Store a flag in the NPC and set it to the specified value. Flag
|
||||||
|
# names are combined with the unique dialog "location" identifier
|
||||||
|
# and the player's name, and are therefore are not required to be unique.
|
||||||
|
# This also prevents flags from conflicting with other non-dialog-related
|
||||||
|
# contents in the player file.
|
||||||
|
def setNPCStatus(self, key, value):
|
||||||
|
if value == "*":
|
||||||
|
return
|
||||||
|
ishere = 0
|
||||||
|
finished = ""
|
||||||
|
npc_status = self.__speaker.ReadKey("dialog_"+self.__location + "_" + self.__character.Name);
|
||||||
|
if npc_status != "":
|
||||||
|
pairs = npc_status.split(";")
|
||||||
|
for i in pairs:
|
||||||
|
subpair = i.split(":")
|
||||||
|
if subpair[0] == key:
|
||||||
|
subpair[1] = value
|
||||||
|
ishere = 1
|
||||||
|
if finished != "":
|
||||||
|
finished = finished+";"
|
||||||
|
finished = finished + subpair[0] + ":" + subpair[1]
|
||||||
|
if ishere == 0:
|
||||||
|
if finished != "":
|
||||||
|
finished = finished + ";"
|
||||||
|
finished = finished + key + ":" + value
|
||||||
|
self.__speaker.WriteKey("dialog_" + self.__location + "_" + self.__character.Name, finished, 1)
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# setnpctoken.py
|
||||||
|
# This is one of the files that can be called by an npc_dialog,
|
||||||
|
# The following code runs when a dialog has a post rule of 'settoken'
|
||||||
|
# The syntax is ["setlocaltoken", "tokenname", "valuetosetto"]
|
||||||
|
# this can then be checked by a token condition that looks for the
|
||||||
|
# value of the token
|
||||||
|
# The token is kept in the NPC's data, and will be lost if the
|
||||||
|
# map containing the NPC resets.
|
||||||
|
## DIALOGCHECK
|
||||||
|
## MINARGS 2
|
||||||
|
## MAXARGS 2
|
||||||
|
## .*
|
||||||
|
## .*
|
||||||
|
## ENDDIALOGCHECK
|
||||||
|
|
||||||
|
self.setNPCStatus(args[0],args[1])
|
|
@ -5,6 +5,8 @@
|
||||||
# The syntax is ["settoken", "tokenname", "valuetosetto"]
|
# The syntax is ["settoken", "tokenname", "valuetosetto"]
|
||||||
# this can then be checked by a token condition that looks for the
|
# this can then be checked by a token condition that looks for the
|
||||||
# value of the token
|
# value of the token
|
||||||
|
# The token will be kept with the player's data, and survive the reset
|
||||||
|
# of the map containing the NPC.
|
||||||
## DIALOGCHECK
|
## DIALOGCHECK
|
||||||
## MINARGS 2
|
## MINARGS 2
|
||||||
## MAXARGS 2
|
## MAXARGS 2
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#npctoken.py
|
||||||
|
# This is one of the files that can be called by an npc_dialog,
|
||||||
|
# The following code runs when a dialog has a pre rule of 'token'
|
||||||
|
# The syntax is
|
||||||
|
# ["token", "tokenname", "possiblevalue1", "possiblevalue2", etc]
|
||||||
|
# To deliver a True verdict, the token tokenname must be set to one of the
|
||||||
|
# 'possiblevalue' arguments. This will normally have been done
|
||||||
|
# with a previous use of settoken
|
||||||
|
# The token is kept in the NPC's data, and will be lost if the
|
||||||
|
# map containing the NPC resets.
|
||||||
|
## DIALOGCHECK
|
||||||
|
## MINARGS 2
|
||||||
|
## MAXARGS 0
|
||||||
|
## .*
|
||||||
|
## .*
|
||||||
|
## ENDDIALOGCHECK
|
||||||
|
|
||||||
|
verdict = False
|
||||||
|
status = self.getNPCStatus(args[0])
|
||||||
|
for value in args[1:]:
|
||||||
|
if (status == value) or (value == "*"):
|
||||||
|
verdict = True
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
# To deliver a True verdict, the token tokenname must be set to one of the
|
# To deliver a True verdict, the token tokenname must be set to one of the
|
||||||
# 'possiblevalue' arguments. This will normally have been done
|
# 'possiblevalue' arguments. This will normally have been done
|
||||||
# with a previous use of settoken
|
# with a previous use of settoken
|
||||||
|
# The token is be kept with the player's data, and survive the reset
|
||||||
|
# of the map containing the NPC.
|
||||||
## DIALOGCHECK
|
## DIALOGCHECK
|
||||||
## MINARGS 2
|
## MINARGS 2
|
||||||
## MAXARGS 0
|
## MAXARGS 0
|
||||||
|
|
Loading…
Reference in New Issue