Stendhal Quest Coding: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
imported>Hendrik Brummermann Teaching the NPC to talk |
imported>Kribbel m replace old link |
||
| (190 intermediate revisions by 12 users not shown) | |||
| Line 1: | Line 1: | ||
{{Navigation for Stendhal Top}} |
{{Navigation for Stendhal Top|Contributing}} |
||
{{Navigation for Stendhal Contributors}} |
{{Navigation for Stendhal Contributors}} |
||
| ⚫ | |||
{{ TODO | Update page for changes in quest coding }} |
|||
| ⚫ | |||
| ⚫ | |||
| ⚫ | |||
| ⚫ | |||
| ⚫ | |||
<div style="border: 3px solid green; background-color: #AFA; padding: 1em; margin-right: 20em"> |
|||
This page is currently reworked. You can find the old content on the [[Talk:Stendhal Quest Coding|talk page]] |
|||
</div> |
|||
== Before you start == |
== Before you start == |
||
| Line 16: | Line 15: | ||
This page describes how to code a quest. You don't need to know a lot about Java. You should, however, already have [[Configure a development environment (IDE)|setup an IDE]] and be able to compile and start a local Stendhal server. |
This page describes how to code a quest. You don't need to know a lot about Java. You should, however, already have [[Configure a development environment (IDE)|setup an IDE]] and be able to compile and start a local Stendhal server. |
||
This tutorial assumes that the new quest only uses NPCs and items that already exist in Stendhal. |
This tutorial assumes that the new quest only uses NPCs and items that already exist in Stendhal. To add a new NPC, see [[Stendhal NPC Coding]]. |
||
== Creating a quest skeleton == |
== Creating a quest skeleton == |
||
| Line 37: | Line 36: | ||
public class BeerForHayunn extends AbstractQuest { |
public class BeerForHayunn extends AbstractQuest { |
||
public static final String QUEST_SLOT = "beer_hayunn"; |
|||
@Override |
|||
public void addToWorld() { |
|||
super.addToWorld(); |
|||
} |
|||
| ⚫ | |||
@Override |
|||
public String getSlotName() { |
|||
return QUEST_SLOT; |
|||
} |
|||
| ⚫ | |||
@Override |
|||
public String getName() { |
|||
return "BeerForHayunn"; |
|||
} |
|||
} |
|||
public List<String> getHistory(final Player player) { |
|||
final List<String> res = new ArrayList<String>(); |
|||
return res; |
|||
} |
|||
} |
} |
||
</source> |
</source> |
||
| Line 61: | Line 65: | ||
<source lang="java"> |
<source lang="java"> |
||
import games.stendhal.server.maps.quests.BeerForHayunn; |
|||
// [...] |
// [...] |
||
loadQuest(new BeerForHayunn()); |
|||
</source> |
</source> |
||
Of course in the case of this tutorial the two lines for BeerForHayunn are |
Of course in the case of this tutorial the two lines for BeerForHayunn are already there. |
||
== Teaching the NPC to talk == |
== Teaching the NPC to talk == |
||
| Line 74: | Line 78: | ||
Okay, we have now completed the preparation. Our first task is to get Hayunn to reply to the word "quest". |
Okay, we have now completed the preparation. Our first task is to get Hayunn to reply to the word "quest". |
||
Therefore we add a new method called prepareQuestStep() at the end of the file BeerForHayunn, just above the last closing "}". This method |
Therefore we add a new method called prepareQuestStep() at the end of the file BeerForHayunn, just above the last closing "}". This method makes Hayunn reply to the word "quest" with the answer "My mouth is dry, but I can't be seen to abandon this teaching room!" |
||
<source lang="java"> |
<source lang="java"> |
||
public void prepareQuestStep() { |
|||
// get a reference to the Hayunn npc |
|||
SpeakerNPC npc = npcs.get("Hayunn Naratha"); |
|||
// add a reply on the trigger phrase "quest" to Hayunn |
|||
npc.addReply("quest", "My mouth is dry, but I can't be seen to abandon this teaching room!"); |
|||
} |
|||
</source> |
</source> |
||
| Line 91: | Line 95: | ||
<source lang="java"> |
<source lang="java"> |
||
@Override |
|||
public void addToWorld() { |
|||
super.addToWorld(); |
|||
prepareQuestStep(); |
|||
} |
|||
</source> |
</source> |
||
| Line 101: | Line 105: | ||
== |
== Commonly used conversation phrases == |
||
Good, Hayunn now replies to the trigger "quest". He does not, however, reply to "task". All other NPCs accept both words as synonym. A simple solution would be to add a second ''npc.addReply'' line. But there is a better way which makes it very easy to add additional synonyms later. We predefined lists of commonly used [https://github.com/arianne/stendhal/blob/master/src/games/stendhal/server/entity/npc/ConversationPhrases.java ConversationPhrases]. If there are already conversation phrases defined for the triggers that you would like to add, you should use the phrases. |
|||
* #beer |
|||
Let's adjust the above sample by using ''ConversationPhrases.QUEST_MESSAGES'' instead of the hard coded word "quest": |
|||
Please make sure this works before advancing to the next section of this tutorial: |
|||
<source lang="java"> |
|||
== Teaching the NPC to ask the players whether they will do the quest == |
|||
public void prepareQuestStep() { |
|||
// get a reference to the Hayunn npc |
|||
* add with states |
|||
SpeakerNPC npc = npcs.get("Hayunn Naratha"); |
|||
* very basic introduction to FSM |
|||
// add a reply on quest related trigger phrases to Hayunn |
|||
npc.addReply(ConversationPhrases.QUEST_MESSAGES, |
|||
"My mouth is dry, but I can't be seen to abandon this teaching room!"); |
|||
| ⚫ | |||
</source> |
|||
Please compile and restart your server. Hayunn should now respond to "quest", "task", and "favor", after you started the talk by saying "hi". |
|||
== Blue trigger words == |
|||
As you probably know NPCs can say words in blue, words that they expect to be repeated by the player. We want to add such words for "beer" and "tavern". As we have done before, we will add npc.addReply lines for those words. |
|||
So, how do we get the words colored blue? Simple, add a "#" in front of them. If you actually want to include a #-character, you need to repeat it. |
|||
<source lang="java"> |
|||
public void prepareQuestStep() { |
|||
// get a reference to the Hayunn npc |
|||
SpeakerNPC npc = npcs.get("Hayunn Naratha"); |
|||
// ask for a beer and explain it |
|||
npc.addReply(ConversationPhrases.QUEST_MESSAGES, |
|||
"Please bring me a #beer."); |
|||
// explain blue words |
|||
npc.addReply("beer", "Margaret sells beers in the #tavern."); |
|||
npc.addReply("tavern", "If you don't know where the inn is, you could ask old Monogenes."); |
|||
// an example for escaping # |
|||
npc.addReply("trading", "http://stendhal.game-host.org/wiki/index.php/StendhalFAQ##Trading"); |
|||
| ⚫ | |||
</source> |
|||
You know the drill: Compile, restart and try it out. |
|||
== Teaching the NPC to remember the player == |
|||
* ChatAction |
|||
* ChatCondition |
|||
== |
== Second Part of this Tutorial == |
||
Congratulations if you made it this far. You are now able to code basic dialogs with NPCs. The next section of this tutorial will describe advanced techniques. Please make sure the steps on this page work before you continue to [[Stendhal Quest Coding - Part 2|the second part of this tutorial]]. |
|||
* MultiAction |
|||
== Further Reading == |
|||
[[Category:Stendhal]] |
[[Category:Stendhal]] |
||