Stendhal Quest Coding: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
imported>Ufizavipupu No edit summary |
imported>Blacklads Undo revision 11659 by Ufizavipupu (Talk) |
||
| Line 1: | Line 1: | ||
=[http://egebyromedu.co.cc UNDER COSTRUCTION, PLEASE SEE THIS POST IN RESERVE COPY]= |
|||
{{Navigation for Stendhal Top|Contributing}} |
{{Navigation for Stendhal Top|Contributing}} |
||
{{Navigation for Stendhal Contributors}} |
{{Navigation for Stendhal Contributors}} |
||
| Line 18: | Line 17: | ||
== Creating a quest skeleton == |
== Creating a quest skeleton == |
||
This tutorial is based on the quest |
This tutorial is based on the quest "Beer For Hayunn". As this quest already exists, you may want to delete the java file locally in order to follow this tutorial. |
||
Quest files are put into the package games.stendhal.server.maps.quests. (If you are new to Java: this refers to the folder stendhal/src/games/stendhal/server/maps/quests). |
Quest files are put into the package games.stendhal.server.maps.quests. (If you are new to Java: this refers to the folder stendhal/src/games/stendhal/server/maps/quests). |
||
| Line 24: | Line 23: | ||
Please create a new file in that folder called BeerForHayunn.java. (Note: The upper / lower case spelling is important, even on Microsoft Windows): |
Please create a new file in that folder called BeerForHayunn.java. (Note: The upper / lower case spelling is important, even on Microsoft Windows): |
||
<source lang="java"> |
|||
package games.stendhal.server.maps.quests; |
package games.stendhal.server.maps.quests; |
||
| Line 35: | Line 34: | ||
public class BeerForHayunn extends AbstractQuest { |
public class BeerForHayunn extends AbstractQuest { |
||
public static final String QUEST_SLOT = |
public static final String QUEST_SLOT = "beer_hayunn"; |
||
@Override |
@Override |
||
| Line 49: | Line 48: | ||
@Override |
@Override |
||
public String getName() { |
public String getName() { |
||
return |
return "BeerForHayunn"; |
||
} |
} |
||
} |
} |
||
</source> |
|||
Don't worry, if you don't understand a word of this; just copy it. We will explain the important parts and extend this skeleton in the following sections. |
Don't worry, if you don't understand a word of this; just copy it. We will explain the important parts and extend this skeleton in the following sections. |
||
| Line 58: | Line 57: | ||
In order for the Stendhal server to pick up this file, it has to be registered in the file StendhalQuestSystem.java in the package games.stendhal.server.core.rp by adding two lines at the appropriate places: |
In order for the Stendhal server to pick up this file, it has to be registered in the file StendhalQuestSystem.java in the package games.stendhal.server.core.rp by adding two lines at the appropriate places: |
||
<source lang="java"> |
|||
import games.stendhal.server.maps.quests.BeerForHayunn; |
import games.stendhal.server.maps.quests.BeerForHayunn; |
||
| Line 64: | Line 63: | ||
loadQuest(new BeerForHayunn()); |
loadQuest(new BeerForHayunn()); |
||
</source> |
|||
Of course in the case of this tutorial the two lines for BeerForHayunn are already there. |
Of course in the case of this tutorial the two lines for BeerForHayunn are already there. |
||
| Line 70: | Line 69: | ||
== Teaching the NPC to talk == |
== Teaching the NPC to talk == |
||
Okay, we have now completed the preparation. Our first task is to get Hayunn to reply to the word |
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 |
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"> |
|||
public void prepareQuestStep() { |
public void prepareQuestStep() { |
||
// get a reference to the Hayunn npc |
// get a reference to the Hayunn npc |
||
SpeakerNPC npc = npcs.get( |
SpeakerNPC npc = npcs.get("Hayunn Naratha"); |
||
// add a reply on the trigger phrase |
// add a reply on the trigger phrase "quest" to Hayunn |
||
npc.addReply( |
npc.addReply("quest", "My mouth is dry, but I can't be seen to abandon this teaching room!"); |
||
} |
} |
||
</source> |
|||
There is one little step left before we can test it: We need to tell the server to execute our new method. There is already a method called |
There is one little step left before we can test it: We need to tell the server to execute our new method. There is already a method called "addToWorld" which will be executed on server start. So we add a call to our method in "addToWorld": |
||
<source lang="java"> |
|||
@Override |
@Override |
||
public void addToWorld() { |
public void addToWorld() { |
||
| Line 94: | Line 93: | ||
prepareQuestStep(); |
prepareQuestStep(); |
||
} |
} |
||
</source> |
|||
Okay, all done? Please start the server (depending on whether you are using an IDE or not you might have to compile or build first). Go to Hayunn and say |
Okay, all done? Please start the server (depending on whether you are using an IDE or not you might have to compile or build first). Go to Hayunn and say "quest", after starting the conversation with "hi". He should now respond with the sentence "My mouth is dry, but I can't be seen to abandon this teaching room!". |
||
== Commonly used conversation phrases == |
== Commonly used conversation phrases == |
||
Good, Hayunn now replies to the trigger |
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 [http://arianne.cvs.sf.net/viewvc/arianne/stendhal/src/games/stendhal/server/entity/npc/ConversationPhrases.java?view=markup ConversationPhrases]. If there are already conversation phrases defined for the triggers that you would like to add, you should use the phrases. |
||
Let's adjust the above sample by using ''ConversationPhrases.QUEST_MESSAGES'' instead of the hard coded word |
Let's adjust the above sample by using ''ConversationPhrases.QUEST_MESSAGES'' instead of the hard coded word "quest": |
||
<source lang="java"> |
|||
public void prepareQuestStep() { |
public void prepareQuestStep() { |
||
// get a reference to the Hayunn npc |
// get a reference to the Hayunn npc |
||
SpeakerNPC npc = npcs.get( |
SpeakerNPC npc = npcs.get("Hayunn Naratha"); |
||
// add a reply on quest related trigger phrases to Hayunn |
// add a reply on quest related trigger phrases to Hayunn |
||
npc.addReply(ConversationPhrases.QUEST_MESSAGES, |
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 |
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 == |
== 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 |
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 |
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() { |
public void prepareQuestStep() { |
||
// get a reference to the Hayunn npc |
// get a reference to the Hayunn npc |
||
SpeakerNPC npc = npcs.get( |
SpeakerNPC npc = npcs.get("Hayunn Naratha"); |
||
// ask for a beer and explain it |
// ask for a beer and explain it |
||
npc.addReply(ConversationPhrases.QUEST_MESSAGES, |
npc.addReply(ConversationPhrases.QUEST_MESSAGES, |
||
"Please bring me a #beer."); |
|||
// explain blue words |
// explain blue words |
||
npc.addReply( |
npc.addReply("beer", "Margaret sells beers in the #tavern."); |
||
npc.addReply( |
npc.addReply("tavern", "If you don't know where the inn is, you could ask old Monogenes."); |
||
// an example for escaping # |
// an example for escaping # |
||
npc.addReply( |
npc.addReply("trading", "http://stendhal.game-host.org/wiki/index.php/StendhalFAQ##Trading"); |
||
} |
} |
||
</source> |
|||
You know the drill: Compile, restart and try it out. |
You know the drill: Compile, restart and try it out. |
||