Earth Untamed
A survival-horror vertical slice set on a flooded, post-climate-collapse Earth - venture out from a safe base, manage health, stamina, and sanity, and get back before the Shadow Children find you.
overview
Earth Untamed is a two-month, five-person capstone production: a hand-built single level, 10-15 minute sessions, and a sanity mechanic that's deliberately binary - stay Stable, or tip into Insane and face faster, deadlier Shadow Children. The scope discipline is part of the story: one level, one loop, systems built to interlock. I owned weapons, player audio, stamina/health UI, and movement feel, working ticket-by-ticket in Jira on a per-developer branch merged through PRs.
what I built
- Interface-driven weapon system. A weapon manager implementing an
I_WeaponUserinterface, with every weapon defined as a ScriptableObject (damage, attack speed, stagger, stamina cost, range, traversal capabilities) and balanced presets for all five weapons - plus a one-click editor tool that generates the weapon assets, so designers never hand-build them. Landed as a single 1,599-line system across 12 files. - Hits that land when the swing lands. Attack flow split in two: pressing attack only spends stamina and triggers the animation; the damage raycast fires from an Animation Event at each clip's impact frame. Reach and timing come from the weapon's data, so a slow heavy axe genuinely feels different from a fast kukri.
- Traversal as a weapon capability. A bitflags enum gates world interactions by what you're holding - only the axe fells large trees, only the ice axe mounts climb walls - tying the inventory directly into level design. Tree harvesting is attack-based with three size tiers.
- First-person viewmodel system. Spawning and switching hands+weapon prefabs on the camera with a bare-hands fallback and randomized multi-variation attack animations - documented in a setup guide so teammates could add weapons without me.
- Player audio (543 lines). Timer-based footsteps with pitch variation for walk/sprint/crouch, jump and landing sounds, damage grunts, per-weapon swing SFX with wind-up delays, and a low-stamina breathing loop that triggers at the same threshold as the stamina bar's pulse warning - audio and UI fire together. I sourced and trimmed the clips myself.
- Stamina, health drain, and UI. Stamina that drains into health when depleted (per the design doc), stamina/health bars with a full-stamina flash and low-stamina pulse, and a hands animator driven by controller velocity, jumps, and attack state.
- Climbing overhaul. The base climb system was a teammate's; I extended it with jump-only mounting, proximity fallback, free climb, ledge exits, and per-face offsets, then added a climb viewmodel animator that switches with the weapon viewmodel and pins the climb arms' transform every frame to stop animation drift.
Debugging story: the prompt that never showed
The "blocked" interact prompt (you're facing a big tree with the wrong tool) never appeared. Root cause: a C#
subtlety - the explicit interface implementation IInteractable.GetInteractPrompt(GameObject) was
calling the no-argument overload, which skipped the weapon-capability check entirely. Tracing overload
dispatch through explicit interface implementations is the kind of bug that teaches you the language for
real.
process
Five per-developer branches merged into a dev branch through GitHub pull requests, a team naming convention
(C_/I_/E_/SO_ prefixes) that all my code follows, and Jira
tickets end to end. The repo is private to the team - code available on request.