Stendhal Quest Coding: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
imported>Hendrik Brummermann ConversationPhrases |
imported>Kribbel m replace old link |
||
| (177 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 }} |
|||
| ⚫ | |||
__TOC__ |
__TOC__ |
||
If you have ideas for new quests or are interested in helping to refine quest ideas, please have a look at the [[Stendhal Quest Contribution|Quest Contributor's Guide]] or the [[Stendhal Quest Ideas]]. |
If you have ideas for new quests or are interested in helping to refine quest ideas, please have a look at the [[Stendhal Quest Contribution|Quest Contributor's Guide]] or the [[Stendhal Quest Ideas]]. |
||
<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> |
||
| Line 77: | Line 81: | ||
<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 [ |
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. |
||
Let's adjust the above sample by using ''ConversationPhrases.QUEST_MESSAGES'' instead of the hard coded word "quest": |
|||
<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 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> |
</source> |
||
Please compile and restart your server. Hayunn should |
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 == |
|||
{{TODO| |
|||
| ⚫ | |||
* #beer |
|||
}} |
|||
| ⚫ | |||
| ⚫ | |||
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"> |
|||
== 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 |
|||
// 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 == |
||
| ⚫ | |||
* MultiAction |
|||
== Further Reading == |
|||
[[Category:Stendhal]] |
[[Category:Stendhal]] |
||