Stendhal Quest Coding - Part 3: Difference between revisions
Content deleted Content added
imported>Hendrik Brummermann No edit summary |
imported>Hendrik Brummermann No edit summary |
||
Line 25:
* and finally remember that the quest was completed
But don't worry, that sounds more complicated than it actually is. There are already actions for all of these
<source lang="java">
reward.add(new DropItemAction("beer"));
reward.add(new EquipItemAction("money", 20));
reward.add(new IncreaseXPAction(50));
reward.add(new IncreaseKarmaAction(10));
reward.add(new SetQuestAction(QUEST_SLOT, "done"));
npc.add(
ConversationStates.ATTENDING,
"beer",
new PlayerHasItemWithHimCondition("beer"),
ConversationStates.ATTENDING,
"*glug glug* Ah! That hit the spot. Let me know if you need anything, ok?",
new MultipleActions(reward));
</source>
== Asking the player for the beer ==
Let's make it a bit easier for player to remember that they bought a beer to give it to Hayunn. Hayunn will notice the beer as soon as the player says "hi" and actively asks for it.
Therefore we add a new trigger for the GREETING_MESSAGE. There is an internal rule that transitions with have a condition (that is true) are preferred over equal transitions without one. So our greeting transition is used instead of the normal one if the condition is true. Similar to the MultiAction there is an AndCondition which combines multiple elementary ones.
<source lang="java">
npc.add(
ConversationStates.IDLE,
ConversationPhrases.GREETING_MESSAGES,
new AndCondition(new QuestActiveCondition(QUEST_SLOT), new PlayerHasItemWithHimCondition("beer")),
ConversationStates.QUEST_ITEM_BROUGHT,
"Hey! Is that beer for me?",
null);
npc.add(
ConversationStates.IDLE,
ConversationPhrases.GREETING_MESSAGES,
new AndCondition(new QuestActiveCondition(QUEST_SLOT), new NotCondition(new PlayerHasItemWithHimCondition("beer"))),
ConversationStates.ATTENDING,
"Hey, I'm still waiting for that beer, remember? Anyway, what can I do for you?",
null);
</source>
As we have learned in the second part of this tutorial, we use a new state for the question. In this case it is named QUEST_ITEM_BROUGHT.
Important note: You need to check again that the player still has the beer when he says yes. Otherwise he could have dropped it to the ground after Hayunn saw it and went to state QUEST_ITEM_BROUGHT.
<source lang="java">
// okay, the player wants to give us a beer :-)
List<ChatAction> reward = new LinkedList<ChatAction>();
reward.add(new DropItemAction("beer"));
reward.add(new EquipItemAction("money", 20));
Line 41 ⟶ 86:
"*glug glug* Ah! That hit the spot. Let me know if you need anything, ok?",
new MultipleActions(reward));
// the player has a beer but wants to keep it for himself :-(
npc.add(
ConversationStates.QUEST_ITEM_BROUGHT,
ConversationPhrases.NO_MESSAGES,
null,
ConversationStates.ATTENDING,
"Drat! You remembered that I asked you for one, right? I could really use it right now.",
null);
</source>
| |||