[Crossfire-wiki] [Crossfire DokuWiki] page added: cfdialog

no-reply_wiki at metalforge.org no-reply_wiki at metalforge.org
Tue May 8 05:25:47 CDT 2007


A page in your DokuWiki was added or changed. Here are the details:

Date        : 2007/05/08 05:25
User        : lauwenmark
Edit Summary: created CFDialog documentation page

====== CFDialog Helper Classes ======

==== What is this about ? ====
This is a small set of utility classes, to help you creating
complex dialogs. It is made for those who do not want to
bother about complex programming, but just want to make a few
dialogs that are better than the @match system used in the
server.

==== How to use this. ====

First, you need to import DialogRule and Dialog classes. Add the
following line at the beginning of your script:

''from CFDialog import DialogRule, Dialog''

Then, you can go to the dialogs themselves. A dialog is made of
several rules. Each rule is made of keywords, preconditions,
postconditions, and answers.

  * **Keywords** are what the rule will be an answer to. For example, if you want a rule to be triggered when the player will say "hi", then "hi" is the keyword to use. You can associate more than a keyword to a rule by concatenating them with the "|" character. Finally, "*" is a special keyword that means: "match everything". "*" is useful to provide generic answers.

  * **Answers** are what will be said when the rule is triggered. This is what the NPC replies to the player. Answers are stored in a list. When there is more than one answer in that list, one will be selected at random.

  * **Preconditions** are flags that must match for the rule to be triggered. Each precondition has a name and a value. The default value of a precondition is "0". The flags are stored into each player, and will survive between gaming sessions. They are useful to set the point in a dialog reached by a player - you can see those as an "NPC memory". All conditions must have a name and a value. The ":" and ";" characters are forbidden. For a rule to be triggered, all the player's flags should match the preconditions. If you give "*" as the value for a precondition, it means that there is no need to match it. A precondition is a list in the form: [key, value]. All preconditions are stored in a list.

  * **Postconditions** are the status changes to apply to the player's conditions after the rule has been triggered. Their format is similar to preconditions. A value of "*" means that the condition will not be touched.

Once you have defined your rules, you have to assemble them into a dialog. Each dialog involves somebody who triggers it, somebody who answers, and has a unique name so it cannot be confused with other dialogs.

Typically, the "one who triggers" will be the player, and the "one who answers" is an NPC the player was taking to. You are free to chose whatever you want for the dialog name, as long as it contains no space or special characters, and is not used by another dialog. You can then add the rules you created to the dialog. Rules are parsed in a given order, so you must add the most generic answer last.

==== A simple example ====

I want to create a dialog for an old man. If I say "hello" or "hi" for the first time, grandpa will greet me. If I say it for the second time, he'll grumble (because he's like that, you know :)). I also need a generic answer if I say whatever else.

In this example, the player is stored in 'player', and the old man in 'grandpa'. What the player said is in 'message'.

  # Dialog creation:
  speech = Dialog(player, grandpa, "test_grandpa_01")
  #
  # The first rule is the "hello" answer, so we place it at index 0 of the
  # rules list. The precondition is that we never said hello before.
  # The postcondition is to mark "hello" as "1", to remember we already
  # greeted grandpa.
  prer = [["hello","0"]]
  postr = [["hello", "1"]]
  rmsg = ["Hello, lad!","Hi, young fellow!","Howdy!"]
  speech.addRule(DialogRule("hello|hi", prer, rmsg, postr),0)
  #
  # The second rule is the answer to an hello if we already said it before.
  # Notice that we used "*" for the postcondition value, meaning that we
  # are leaving it as it is.
  prer = [["hello","1"]]
  postr = [["hello", "*"]]
  rmsg = ["I've heard, you know, I'm not deaf *grmbl*"]
  speech.addRule(DialogRule("hello|hi", prer, rmsg, postr),1)
  #
  # And finally, the generic answer. This is the last rule of the list.
  # We don't need to match any condition, and we don't need to change them,
  # so we use "*" in both cases this time.
  prer = [["hello","*"]]
  postr = [["hello", "*"]]
  rmsg = ["What ?", "Huh ?", "What do you want ?"]
  speech.addRule(DialogRule("*", prer, rmsg, postr),2)
  #
  # We only have to let the old man speak now:
  speech.speak(message)

IP-Address  : 217.136.39.8
Old Revision: none
New Revision: http://wiki.metalforge.net/doku.php/cfdialog

-- 
This mail was generated by DokuWiki at
http://wiki.metalforge.net/




More information about the crossfire-wiki mailing list