top of page

Mongol Camp

3rd Person Action Adventure

Overview

Overview

For this project, my goal was to create a small combat encounter set in the world of Ghost of Tsushima and integrate Python automation. To accomplish this I used Python to procedurally generate a forest surrounding an enemy encampment. As this was my first experience with Python, there was a learning curve, but I’m pleased with the final results and the new skills I developed.

Design Goals:
 

  • Create a stealth-focused encounter inspired by the design principles of Ghost of Tsushima, emphasizing player choice and tactical gameplay.

  • Model key environmental assets in Maya to build a cohesive, immersive setting around the camp.

  • Develop a Python script to procedurally generate randomized forest layouts, adding natural variety and density to the landscape surrounding the camp.

Layout

layoutmap.png

For the camp, my focus was to enhance player choice by offering multiple approaches to the encounter. After analyzing the Mongol camps in Ghost of Tsushima, I noticed some common elements that inspired my design. Most camps feature at least one elevated area, such as a cliff wall or a climbable structure, as well as 2-3 distinct entrances or exits, which might include broken fences or vertical paths for grappling or platforming. I designed the environment to encourage a stealthy approach, with numerous routes for avoiding detection and cover in the form of tall grass and scattered obstacles.

To support tactical gameplay, I considered enemy numbers and placement, encouraging players to think strategically. However, the option to storm the main gate and confront enemies head-on remains available for those seeking a more aggressive approach.

I used a variety of assets, like stacks of boxes, carts, and barrels, to provide additional cover throughout the camp. Grass surrounds the camp borders and interior, giving players plenty of stealth opportunities. I also added elevated points, such as the Cliffside wall and the Climbing Rock, for players to scout the area and plan their route. Guards are spaced out and follow patrol paths that cover most areas of the camp, allowing players to time stealth takedowns. These routes are intentionally designed to lead guards behind cover or into tall grass, creating natural ambush points.

To incorporate the grappling ability Jin acquires, I set up two key grapple points with unique purposes. The first, on the Cliffside, provides a stealthy entry into the camp, allowing players to drop down unseen. The second is near the Climbing Rock entrance, strategically placed between a tent and guard post to allow a flashy takedown of the guard atop the tower.

Proxy Models and Terrain Sculpting

Proxy_models.jpg

I envisioned the Mongol camp and surrounding forest early on, so I didn’t need extensive planning for the models and assets. My goal was to keep the level relatively small, requiring only a few objects that I could reuse where possible. However, I did create some variations, such as different versions of the broken fence, tents, and carts, to add subtle diversity. The models were kept simple, with small details added to enhance realism without overcomplicating the design.

For the terrain, I used a similar approach, focusing on simplicity while ensuring some verticality. The added elevation allowed for an elevated entry point along the cliffside, adding depth to the camp layout.

References

2.png

Python Scripting

This project was definitely a challenge, as Python automation was one of the few bonus skills in the job listing with which I had no experience. I saw this as the perfect opportunity to expand my skills, so I decided to incorporate Python automation by scripting a forest generator to populate the landscape surrounding the camp. My goal was to keep the script simple yet effective, gradually adding complexity as I refined the results.

The first step was setting up a random generation for placement and rotation, which involved basic adjustable parameters like count, range, scale, and spacing. With this foundation in place, I started adding more item types, such as rocks and trees, each with unique effects to prevent unrealistic placements (e.g., upside-down or tilted trees).

Next, I tackled terrain integration, which proved trickier than anticipated. I encountered issues with naming conventions that required some troubleshooting. Eventually, I came up with a solution using the ‘closestPointOnMesh’ node. This allowed me to position objects accurately based on the terrain’s height, ensuring natural placement across varying elevations.

Once the height issues were solved, I focused on creating a more natural look for the forest. Initially, the script populated the entire plane uniformly with trees, so I added a noise function to introduce variety and organic clustering. This adjustment brought a dynamic, realistic feel to the landscape.

The final step was establishing an exclusion zone around the camp to prevent trees from spawning inside. Initially, I tried using a bounding box, but it resulted in an unnatural square around the camp. To address this, I switched to a radius-based exclusion zone, with separate settings for the cliffs and camp. This approach produced a far more natural transition at the forest edge.

bottom of page