Sunday, December 30, 2012

New and improved quest API?

The current concept for scripted NPCs has various shortcommings. When I want to implement scripted quests with interesting tasks, I also need to add scripting abilities to killed monsters, item pickups, map areas and lots of other stuff. All of that wouldn't hurt, but it makes programming of a complex quest awkward, because the code is in all sorts of different places. It would be better when it would be possible to implement a quest from start to finish in a single file with no or minimal editing to the entities which are part of the quest.

So I thought that it might be better to define each quest as a list of quest steps. I would have a global ScriptManager, which manages the current quest of each player character which is currently ingame. When some event happens somewhere which could be relevant to a quest of a player character, an InterMessage is created and caught by the ScriptManager. It then checks the current quest step of the player. When it is resolved, a script function attached to the QuestStep is executed. This script can either return a new QuestStep, or nothing to end the quest.

Quests are started by scripts. Usually during talking to NPCs, but I could imagine other situations which trigger quests. NPCs should gain a "quest hint" property, which consists of quest ID, a minimum level, a variable and its value. When a player fulfills these criteria, has no active quest, and hasn't completed that quest yet (which should be indicated by the value of the variable), the NPC should be highlighted.

These are possible types of quest steps:

QuestStepKill

Kill a mob spawned by a specific SpawnArea.

QuestStepCollect

Own a specific number of items.


QuestStepExplore

Get to a certain location.

QuestStepNpc

Interact with a specific NPC.

QuestStepScripted

Wait for a certain variable to change to a specific value.

Players should also be able to abort a quest at any time to start a new one. When a player does that, the quest needs to be started from the beginning.





No comments:

Post a Comment