Overview
Rickshaw Rampage is an endless runner game where you play as an auto-rickshaw running from the cops. The player drives down the streets of a procedural Mumbai-like city, causing mayhem and destruction while avoiding getting caught. This project explores how procedural generation, when developed with a clear cultural setting and visual identity in mind, can help overcome visual monotony and repetitive gameplay.
The game uses procedural generation, dynamic materials, and real-time physics simulations to craft a dense, vibrant environment that evolves alongside the player. Algorithms like wave function collapse were used to generate expressive architecture, while dynamic materials allow for quick, art-directed texture variation and weather effects during gameplay. The physics systems create unpredictable interactions— bottles shattering when hit, fruits rolling down the street when the cart breaks—all contributing to the game’s chaotic energy.
The project also explores representation in gaming. Indian cities are rarely depicted in mainstream games. By grounding the procedural tools in real-world references, the game presents a playful but grounded view of an Indian city experience.
Concept Art
The concept art for this game was drawn digitally in Procreate and Adobe Photoshop. For the vehicles, I wanted to make sure the rickshaw stood out from the rest of the traffic and the police car. To do this, I used a rounder shape language for the rickshaw and a sharper, boxy design for the rest of the “enemy” vehicles. I also created some concepts for a chase scene from different camera angles to capture the feeling of the game.
Vehicle Models
To model vehicles, I began by creating proxy models in Maya to finalize each vehicle’s primary silhouette. For the rickshaw, I used reference blueprint diagrams to establish accurate proportions and shapes. After locking the silhouette, I added detail to create a high-poly mesh, which I then optimized by deleting edges rather than manually retopologizing with the quad-draw tool. Once optimized, I UV unwrapped the meshes using hard-surface unwrapping principles from Josh Gambrell, then applied Maya’s lattice tool to “wonkify” the forms, giving them a more dynamic, stylized look. I exported the model into Substance Painter, where I baked the high-poly details and customized Zack Maxwell’s smart material pack to suit the game's visual style. I incorporated strong ambient occlusion in purple, maroon, and blue tones and added baked lighting effects for extra depth. This workflow was repeated for the police car, public bus, and one of the traffic cars. For the second traffic car, I repurposed the police car model.
Building Generator
To generate diverse, stylized buildings for my project, I implemented the Wave Function Collapse (WFC) algorithm within Houdini using Python. WFC works by selecting compatible modules for each part of a 3D grid based on adjacency rules, ensuring logical and aesthetic consistency. I began by designing modular pieces—walls, floors, and roofs—each tagged with specific port labels to control connectivity. These modules were dimensioned to fit within a 4m x 4m x 3.5m block with details modeled using Maya for a wonky, hand-crafted look. I created a pipeline to manage the module pieces and imported it into Houdini. For flexibility, I included rotated pattern variations and made a proxy mesh preprocessor that reconstructed input shapes using standard-sized blocks. This system enabled me to generate complex, coherent building layouts that retained both visual appeal and modular logic. I brought the generator into Unreal Engine as a Houdini Digital Asset and, using it, was able to generate multiple building variations for the game. I created another HDA to place props like pipes, AC units, and satellite dishes on the buildings.
Procedural Materials
Substance Designer Materials
I used Substance Designer to create textures for larger surfaces in the game, like the road, tiled footpath, and plaster on the buildings. For the road and the plaster, I used a slope blur to create a texture that almost looks like paint strokes. This helped give the surfaces a stylized look. In Unreal Engine, to hide the visible texture tiling, I created a noise pattern in the UE5 base material. This noise is based on the Absolute World Position, so it exists seamlessly across the game world. Overlaying this onto the repeating textures eliminated the noticeable pattern repetition. I used a similar method for the sidewalk, but this time, I added a new color, roughness, and normal map to the noise areas to give the appearance of dirt.
Color Variation
To add visual variety, I used random colors for props based on their location in the game. However, this approach didn’t suit larger assets like buildings and vehicles, where random colors often looked overly saturated and inconsistent. To solve this, I used Unreal Engine blueprints and material masks. For traffic cars, I created a dynamic material that overlays a chosen color onto a desaturated base and ensured it only affected the car paint area using linear interpolation. I expanded the mask in Photoshop to fix edge bleed. In the car blueprint’s construction script, I used an array of curated colors to randomly assign paint colors per instance. I used a similar approach for buildings, where the blueprint identifies wall modules and uniformly assigns them a color from a predefined array, creating a more art-directed look for the randomized environment.
Rain System
The rain system was made using a few separate parts:
Niagara VFX – I used this to create the particle effect for the raindrops and splashes. The raindrops only spawn in a small volume around the rickshaw, like a personal rain cloud. This gives the illusion of it raining everywhere while still keeping the system efficient in the game.
Surface Shader – I created a base material that takes in a surface absorption value for each material instance. Absorbent surfaces become darker and more saturated during the rain while non-absorbent surfaces have drips and drops created using animated materials.
World Position Offset – I created a stylized tree generator in Houdini and created a material for them in Unreal Engine that adds a wind movement using the world position offset. This movement gets more vigorous when it's raining.
Post-Process Changes – I added a color grading in the post-process material to easily change the overall lighting when it rains.
Global Controls – Finally, to bring all the pieces together, I added global controls for the rain intensity and world wetness, to randomly start and stop while gradually increasing and decreasing the rain during gameplay. The world wetness is a separate control to ensure the puddles and wetness effect stick around much longer after the rain has stopped, giving it the appearance of drying up slowly.
Physics Props
Lightweight props like cardboard boxes and plastic barrels simply used basic physics simulation, while more complex interactions used Unreal’s Chaos system. For interactive props like trash cans and carts, I used physics constraints on parts like lids and wheels, fine-tuning friction for realism. To add detail, I created blueprint tools that populated carts with stacked fruits and trash cans with debris, using marketplace and Sketchfab assets with modified textures to match the game’s style. This system ensured dynamic, reactive, and stylistically cohesive prop placement throughout the game.
While everything else in this game was made by me, the trash cans, fruit cart, and bottle crates were modeled by Danny Samuels, and the fruits and trash models were obtained from the Unreal Marketplace. I added the physics and fracture simulations to these models.
Infinite Level Generation
To generate an infinite track, road tiles are spawned procedurally using a Blueprint function. Each tile contains an arrow indicating where the next tile should attach, allowing seamless expansion. The system also tracks and removes tiles that fall too far behind the player to optimize performance. Props like buildings, traffic, and sidewalk elements are also placed procedurally. Each road tile contains marked spawn points categorized by prop type, and the construction script places props at these points based on assigned probabilities, ensuring variety and a lively urban environment as the player progresses.
User Interface
For the game’s title screen and logo, I created both English and Hindi versions, displayed sequentially at startup to reflect the game’s bilingual and cultural identity. The logo design was inspired by hand-painted signs commonly seen on the backs of Indian trucks. The game icon features a hand-drawn rickshaw on a yellow background, which was also repurposed as an animated backdrop for the credits. For the menu, I customized assets from the Modern Flat GUI Pack to better match the game’s color palette and used the Super Corn font throughout for its playful look.
Polish
For lighting the scene, I had to rely on using only a single directional light to ensure the lighting appears consistent for all parts of the track as it gets generated. I changed the properties of the light to get the stylized look I wanted. The most significant change was lowering the specular intensity. This makes all the surfaces appear more matte, making everything feel more cartoony and cohesive. For the distance fog, using volumetric fog was becoming computationally expensive in the game. To get around this issue, I created a post-process material to fake a distance fog. This uses the scene depth and overlays a gradient on everything, the farther away from the camera it gets. I also used the post-process material to make the ambient occlusion more prominent.
Acknowledgements
This game was developed as my MFA thesis at DigiPen Institute of Technology. My goal was to create a project that let me dive deep into technical art tools, while keeping the gameplay simple enough to focus my time and energy on the visual and artistic aspects instead of programming. I’m incredibly grateful to my thesis committee—Matt Brunner, Mark Henne, and Benjamin Ellinger—for their invaluable guidance throughout this process. Special thanks to Jasmin Lau for her work on the sound design and audio implementation; her music and SFX truly bring the bustling, chaotic spirit of Mumbai to life. And above all, huge thanks to my husband, Russell Higgins, for his unwavering support and his help with the game’s Niagara effects.