It took me over 6 years to finally tackle the quest feature but I finally put the work in.
I took so long because I didn’t really knew how to do it properly and I had many more thing to do prior to it.
Before the quests come the dialogues. Indeed there can be no quests if no one ever talk to you right?
I love the dialogue system so much because of its simplicity. Long story short it is an enhanced directed graph. This is actually quite common for in-game dialogue systems to be based on graph and MultiQuest make no exception.
On a dialogue graph each node correspond to an NPC dialogue line and each edges correspond to a possible player choice. A choice can lead to another node or close the dialogue if it has is no destination node. I can then attach some actions and conditions to each choice. All the conditions must evaluate to true for the choice to be available to the player and the actions are executed when the choice is selected. An action can be anything such as giving the player an item or validating a quest objective.
A dialogue graph can have multiples “launch condition” these conditions must evaluate to true for the dialogue to be available to your character.
When you interact with an NPC it goes through all its dialogue graph and it open the first one that evaluate to true.
This system is pretty basic but very flexible and it allowed me to do anything I wanted. It is robust and units tested to avoid invalid dialogue to be pushed in game.
The beauty of this system also reside in the simplicity of the client/server synchronization it simply a matter of synchronizing the state of the character in a dialogue graph.
Here is how the dialogue UI looks:
Now that we can talk to NPC we can receive some quests.
The quest system implementation is a bit more complex than the dialog but it is easily understandable. A quest is simply a list of objectives and there are many type of them (kill monster, visit area, gather item, etc…).
Some objectives are hooked to gameplay events such as the “killed entity” event, others are validated by dialog actions, etc.
Here is how the quest windows looks:
It is a pretty basic but functional interface that allow one to check its active/completed quests.
The third tab contains the completed quests with a pending reward. A completed quest will appear there if its reward cannot be given to your character (ie: full inventory). Of course you can always decide to abandon a quest if you feel like it.
During the test of this version it really felt like a real game since you now have some goals and NPC to talk to. Right now I plan to polish the game (fix known bugs, improve ai, improve settings panel, etc.).
As a long term goal I have in mind to procedurally generate the world. As you can tell from the website look, I am not really an artist lol. This will help me to have a more coherent world and I will learn a lot in the process.
Until the next release,
Cheers.