The Witcher: Road To Mahakam
Set in Andrzej Sapkowski's world of The Witcher, based on CDProjektRed's game adaptations:
Geralt of Rivia agrees to meet his friend Dandelion (Known as Jaskier in the originl Polish version) on the way to the famous Mahakam ale festival, but dandelion is missing....
Location: A dwarven village in the borderlands between Rivia and Mahakam.
Gameplay: Exploration, Melee Combat
Estimated Duration: 10-15 Minutes
Camera: Third Person
Tools Used: RedKit (Witcher 2 level/quest editor)
Skills Used: Scripting (RedKit), Level Layout design, Quest Design, Art Asset implementation
Development Process and Design Breakdown:
Planning the quest:
I used draw.io to visualise the structure of my quest. To reduce the risk of running out of time, I set myself a minimum viable product featuring a very basic quest, where Geralt (Player Character) has a simple objective of fighting a monster. I also set myself a stretch goal, featuring a more advanced quest where Geralt is sent to fight the same monster, but finds his friend Dandelion in the monster nest after being sent there by the contract givers. Geralt then confronts the villagers, with the option to start a fight. The quest can also be completed by finding Dandelion early should the player go exploring, resulting in different dialogue with the villagers.
In the final product, I was able to fully implement my minimum viable product as well as most of the stretch goal, with the exception of the option to fight the villagers, which I did not have time to script.
Planning the Level Layout:
Building the Level:
Building the terrain took approximately 2 weeks. I started by using RedKit’s terrain tools to sculpt a rough terrain based on my pre-production plans. I then added in the main landmarks to test their visibility, before adding in all the foliage, rocks, and buildings.
RedKit allows the user to modify many properties of each mesh, including draw distance, so I prioritised the important landmarks, giving them a higher draw distance.
Unlike other tools such as Unreal, the player’s navigation mesh is not automatically generated in RedKit, so I had to manually place path areas to determine where the player can and cannot walk:
As some areas are not accessible to the player, it was important to maintain a consistent visual language when building the level, to avoid confusion over where the player can or cannot go.
In my level I used cliffs and rocky slopes to form “Hard Fencing” (TychoBolt, 2021) which blocks vision and movement, to contrast with grassy areas which form “Soft Fencing”, designed to nudge players onto the main path while keeping the side paths available to those who want to explore.
Since the level establishes a general rule that rocky areas are not accessible, it was essential to make sure the player can distinguish the exceptions to the rule.
I emphasised the climbable rocks by always having the path texture on the ground immediately before the climbable rocks and using the environment to form leading lines towards them.
I also made sure that the area immediately visible beyond the climb is visibly clear of foliage when compared to other rocks, inviting the player to climb it.
While I was able to find ways to easily modify the draw-distance of static meshes, I could not find a way of modifying that of NPCs. While testing the level, I noticed that npcs would not be visible from far away, before suddenly popping into existence when approached. I had to reduce the size of certain areas in order to have the NPCs visible:
Before Size Reduction:
After Size Reduction:
This problem was especially prominent in the village. I removed the problem by reducing the size as well as carefully placing objects/vegetation to block NPCs from the player’s sight at certain angles, so that the player can never see them fade in/out. All of the towns in The Witcher 2 appear to use this technique. As hardware evolves this will continue to become less necessary, but it was interesting to make design decisions based on technical limitations.
Before Size Reduction:
After Size Reduction:
Main Quest Script:
Another large amount of time was spent getting the scripted quest to work, which was probably the hardest challenge of the project, mainly because of the limited amount of tutorials available. I was able to learn the basics by following some tutorials (Milgo, 2013, Weber, 2013), and browsing information on the RedKit Wiki (CDProjektRed, 2013), before learning the rest by experimenting.
Example Dialogue Script:
Making dialogue in redkit requires the dialogue to be written into a special dialogue file, of which my project had multiple. The dialogue file contains its own logic which must be scripted to determine the start, end, and dialogue variations based on conditions. The dialogue file is also connected to the main quest file in order to be triggered and so the two scripts can share variables/conditions.
Unlike other editors, NPCs cannot simply be placed in the world. A “community” file must be placed into the level, containing all the detailed information about which NPCs to spawn/Where to spawn them/what animation they play, etc.
Community File for the village:
One of my main goals was to design the level so that it can be completed without following a mini-map. To do this I had to fill the level with various landmarks which are mentioned in quest directions.
The level is also completely non-linear, with various side paths. As a result of this, the player can potentially complete the quest early should they explore the level thoroughly before receiving the quest from the quest giver, as is possible in many Witcher quests.
Alternative Video walkthrough
(player follows side path and completes quest early):
When the player reaches the village, they must ask around the village for information of where to go next (unless the player has already completed the quest early while exploring). The information can be obtained by talking to Logmar and Fodam, 2 characters located on the east side of the village.
The village has 2 entrances, so it was important to make sure the player finds them whichever way they enter the village.
I did this by placing them close to the right path so that they are the first NPCs the player will see should they enter from that path. I also gave them a bright red wagon which stands out from the rest of the village.
Should the player enter on the left, Logmar and Fodam are not visible so I made it so that the blacksmith is the first NPC the player will see from that path. By the time the player reaches her, Logmar and Fodam are close enough to be visible and she will direct the player to talk to them.
If the player does not speak to the blacksmith, they can also receive information from other merchants around the village.