An eerie RPG-to-FPS hybrid built from the ground up in one semester.
Cowpocalypse v1 is my final project for CS 4423 (Game Development). Before this class, I had never opened Unity. By the end, I shipped a fully playable low-poly RPG/FPS hybrid set on a mysterious, unsettling ranch where the animals don’t quite act like normal animals.
This post walks through what Cowpocalypse is, how it plays, the systems under the hood, the challenges I ran into, and where I’m taking the game next — including more quests, boss fights, and dynamic weather cycles.
Cowpocalypse is a short, narrative-driven RPG that transitions into an FPS combat experience. You arrive as a new ranch worker and are given increasingly strange tasks by your boss. Over the course of three main quests, you’re introduced to:
Gameplay video: Watch on YouTube
Source code: GitHub: VulnerabilityVigilante/Cowpocalypse
Play Now: Download Link
Cowpocalypse has a custom quest framework that supports:
The QuestManager tracks quests, progress goals, and completion logic. It also exposes events like OnQuestStarted and OnQuestCompleted for other systems (like spawners) to subscribe to.
The QuestGiver sits on the NPC and:
CurrencyManager This logic is handled in QuestGiver, including helper methods like GetNextQuestID, TryGiveQuestReward, and AllQuestsComplete.
On top of that, progress for the combat quest (ShootCowsQuest) is carefully reset when the quest is restarted so you can’t carry over previous kill counts into a new attempt.
The ranch boss isn’t just a quest vending machine — he has context-aware dialogue. The DialogueTrigger component:
QuestManager The system uses a DialogueUI reference to render text and also passes callbacks for Accept/Decline choices when a new quest is offered.
Cowpocalypse uses a custom text save file stored in your Documents folder:
Documents\CowpocalypseSave\save.txt The QuestFileSaveSystem centralizes all saving and loading:
On save, it writes everything out to a human-readable text file and ensures the folder exists. On load, it restores quest states, reward flags, coins, and consumables, then triggers a UI refresh for healing items.
The CurrencyManager integrates with this system by:
save.txt file on startupAddCoins, SpendCoins, and SetCoinsFromLoad It uses a singleton pattern plus DontDestroyOnLoad to persist across scenes.
The DeathScreenController ties it all together: when you die and press restart, it saves the full state via QuestFileSaveSystem.SaveAll(), reloads the scene, and correctly restores mouse lock and player controls.
The game includes an inventory-driven healing system using:
The HealingItemUse script listens for keypresses (1 and 2), checks the Inventory singleton to see if items are available, and then:
Random.Range(0.7f, 1.4f)) to keep it feeling crunchy and dynamic This is all packaged in a self-contained AudioSource that’s created at runtime, keeping the system modular and easy to drop into other scenes.
On the combat side, Cowpocalypse features:
The rifle’s skin uses a custom camo shader inspired by Phantom Forces. To support this, the GunCamoStaticMatrixBinder script:
_StaticRow0 through _StaticRow3)This keeps the scrolling camo effect locked in a static space, independent of player movement and world transforms.
Enemy cows:
During the ShootCowsQuest, cows spawn in waves and each kill increments the quest progress until the target count is reached, at which point the quest completes and a reward can be granted. The system also accounts for players who start the game mid-quest and ensures the wave spawner activates correctly when loading a saved state.
Pressing F12 triggers:
PlayOneShot)This makes it easy to capture the low-poly horror vibes and share moments from the ranch.
At one point, restarting from the death screen or reloading the game could desync coins, consumables, and quest states. Sometimes I’d come back with the wrong number of items or quests in the wrong state.
To fix this, I centralized all game persistence into QuestFileSaveSystem.SaveAll() and QuestFileSaveSystem.LoadAll(). Now:
This made the entire game feel much more stable and predictable.
I ran into multiple edge cases where:
The DeathScreenController now:
PlayerController, PlayerLook, and Quest3_PlayerGun when a scene is loadedCombined with extra guards in the gun logic to not fire when the cursor is unlocked, this cleaned up the UX significantly.
Early on, cows would rotate to face the player but stay rooted in place. A lot of this came from trying to mix a CharacterController with simple forward motion.
The solution was to simplify things: since my game takes place on flat terrain, I rewrote cow movement to be fully code-driven and not dependent on CharacterController for vertical behavior. This gave me predictable, steady stampede behavior without strange physics edge cases.
The scrolling camo shader originally moved in the wrong direction and axis. By introducing a static matrix binder (GunCamoStaticMatrixBinder) that writes an identity matrix into shader rows, I could precisely control how the shader interprets “static” versus “world” directions and fix the scrolling behavior.
Cowpocalypse uses a mix of:
The game starts off feeling goofy and light, but as you progress through the quests and see how the animals behave, the tone shifts into something much creepier.
From the bounty system, I completed an estimated 41–67 points worth of optional features, including:
A fellow student playtested Cowpocalypse and commented on:
They also pointed out areas to improve, like adding a sound effect when the player takes damage, providing an in-game way to reset progress, and letting the player keep the gun after finishing the game to mess around more.
Cowpocalypse v1 is just the starting point. Here’s what I want to build next:
QuestManager + QuestGiver architecture to support multi-step arcs and more complex dependenciesI plan to keep iterating on this project post-semester and eventually package a “Cowpocalypse v2” with expanded content, bosses, and a much more dynamic world.
Cowpocalypse v1 represents my first real dive into Unity, C#, shaders, AI, save systems, and overall game architecture. I’m proud of how much I managed to build in a single semester and excited to keep growing this weird, low-poly ranch into a full-on cursed open world.
If you’ve read this far — thanks for checking out Cowpocalypse. And remember:
The cows are watching. 🐄👁️