Table of contents
No headings in the article.
A very special number has been reached - a double-digit number in fact! We are officially 10 devlogs into Echolite now! This equates to about 4 months of dedicated work on the game, which I consider a huge success. While there is a ton more work to be done, I think this milestone helps show that finishing the game is possible.
Thank you so much for your support!
Finalizing Quests
With the last devlog, we set up basic quest details that allowed the character to select available quests based on several variables. These are all triggered by NPC interactions which helped bring some much needed life into the otherwise barren world. One crucial feature was purposely left out though…actually completing the quests!
There are a few items to consider with a questing system. First, we have to understand the types of quests that the player can complete. We should offer multiple types in order to add variety to the player’s experience. Collecting a few geodes may be exciting at first, but after a few dozen times it becomes a grind that many players are not willing to commit to long-term.
So, what kinds of quests are planned?
- Collect - Fairly standard, but collecting can also be performed by machinery so less grindy. Plus, it does not rely on combat since that feature is not planned for the game.
- Talk - The player needs to talk to specific NPCs in order to progress. A lot of the magic here will boil down to the quality of the dialogue, but for now we will focus on the logic.
- Discovery - We can highlight a specific location on the map with an Area2D that will auto update a “locations visited” attribute on the character. The player will need to reach that location before reporting back.
- Statistics - This will fit into the achievements system since statistics will need to be maintained in order to trigger certain statistics. We can use those same numbers for the more unique quest "events" outside of the other three that are more standard and restrictive in design.
It is worth noting that these titles are moreso for internal reference - to the player, quests will not have a specific label. The dialogue will provide unique context around specific quests without being overly direct about the type of quests the player is completing.
My personal favorite is “statistics” as it enables a more flexible way of writing quests. Rather than focusing on a specific number of actions, quest completion can be tied to external events in the world or specific character relationships. It brings a more immersive experience while still allowing the player to feel in control.
As these types of quests will look at different systems in order to evaluate quest completion, they need to be labeled on the data side. This means updating our questing JSON from last devlog with special tags like "Talk" or "Collect":
Since we already have the file open, we may as well add in the other necessary details. Based on the quest type, we can supply other fields needed to evaluate the status of a quest. For example, if we are collecting resources, we should specify what types of resources and how much:
The second consideration for a questing system is how to reward a player, especially in how those rewards scale with the player. This is where a lot of our early planning for the interactions in this game come into play! We can step a bit outside standard game design (at least to my limited knowledge) and scale quest rewards differently.
In many of the games I have enjoyed, quests will start off with small rewards, such as “25 experience points.” When reaching the late stages of the game however, this number quickly skyrockets to the millions with no realistic end in sight. One way to solve this is with rankings, but that only addresses the actual number from going up and not necessarily making it easier for the designer to plan out quests.
For Echolite, we can bring a closer relationship between quests, dialogue, and ultimately the NPCs we interact with. As a new robot, the nomads have no existing connections in which their rewards will be small (as expected). The more the player interacts with the NPCs though, the more likely they are to give better rewards.
In terms of the logic, we can have different statistics for each NPC that act as multipliers to the various rewards a player can receive. This allows things like “items given” and “experience earned” to properly scale without setting larger values for every quest. It also gives more weight to the player’s decisions during gameplay as they are in charge of what rewards are most valuable.
To keep things simple, a few attributes have been added to NPCs. They do not apply those multipliers to rewards yet, but the data is being saved for future implementation. A proper “relations” GUI will be built down the line and the rest of my TED Talk will appear in that update :)
As a teaser, here is what those stat symbols look like:
You can see those discussions from the “All Things Machines Part 2” devlog applied here. For GUI elements that are moreso icons than backdrops, we have our own 4 color palette to use. This provides a nice level of consistency that helps make the experience feel more complete.
Dialogue System
So, how does the player improve relations with NPCs? That is the fun part - dialogue choices! We return to our quest JSON and add in some new sub-dialogue elements. These entries will detail four “responses” the player can choose from alongside which attributes are impacted. We utilize tags like “SUB” and “ADD” to help signify how the statistics will update, but the player will not be aware of these items until they are chosen. This encourages the player to consider what dynamics should be built with each NPC, especially as they hold different values and perspectives about the world.
For our dialogue system, we can code it nicely into the quest options logic from the last devlog. When the player approaches an NPC, it will first evaluate any quests that apply to them. If any actions are needed, they will proceed to do so before showing any potential new quests. The NPC may need to finish a quest with the player or even resolve mid-dialogue as part of an ongoing quest chain.
We can’t just add a giant system like this without some more artwork though! Credit to Buch once again for his amazing Golden UI assets - like previous works, I have taken elements of his Golden UI atlases and stitched together some new ones. I really like how this dialogue interface turned out:
For animations, a few small effects will add some major “oomph” to the experience. If that isn’t a real word…well, it should be! With the text, the usual dialogue reveal motion should work. Godot offers a nice property for text along the lines of “percent visible.” Using some tween magic, the dialogue is revealed over a set period of time. It is a super simple effect but it adds so much in convincing the player that the NPC is actually talking.
Another effect is the blinking/moving “clicker.” There really should be an official term for this in the game dev world if there isn’t already. Essentially, an indicator will appear in the corner of the dialogue panel that rotates and bobs up and down to tell the player to click. I could have used a tween for this as well, but branching out into different nodes is always good for learning. The AnimationPlayer proved to be useful in adding both effects at once.
Finally, a little popup should be leveraged near the experience bar and dialogue panel for when game elements are changed like experience or NPC stats. Here is a (somewhat buggy but proud) gif of these effects in action:
And finally, here is how the dialogue choices are presented to the player:
What’s Next?
While NPCs need a lot more love in the future, it’s time to branch out further with the game! Our eyes are set on some new, exciting world generation. The next devlog will provide the prep work for this massive change before diving into the bulk of the work. This includes lighting revamps and new terrain elements.
Once again, thank you so much for the incredible support! If you are enjoying these devlogs, please consider adding some reactions and sharing it around your own communities :)