About Me

Hi! I’m Ann Weaver, a game designer, programmer, and director, and the founder of Harvest Studios. I’ve been creating games since I was 12 and have always been fascinated by how gameplay, visuals, and sound can work together to tell a story. I received a $5,000 grant to support my current project, Harvestville: Song of the Ancestress, a narrative-driven farming horror game that combines traditional gameplay with cinematic FMV sequences I directed and filmed myself.I earned my Bachelor’s degree in Media Arts and Game Design from Wichita State University, where I developed a strong foundation in game design, programming, UI/UX development, and multimedia production. My work blends technical implementation with creative direction, from scripting gameplay systems and refining level flow to designing interfaces that feel natural and expressive.Here you can explore some of the games I’ve designed, coded, and produced, each built around the goal of creating experiences that surprise and delight players.


Highlighted Project

Harvestville: Song of the Ancestress

Roles and responsibilities:Game Director
- Worked alongside animators, music composers, 2D/3D artists, and filmmakers
- Secured grant funding from Wichita State University
- Recruited nearly 50 team members over the course of 3 years
Lead Game Designer & Programmer
- Roughly 95% of the coding was done by me
- All design documents
Sound Design
- 194 unique SFX
- Recorded/produced several SFX and music tracks
- Created dynamic sounds through Wwise.

Watch the trailer here

Highlighted Project

Harvestville: Song of the Ancestress

Roles and responsibilities:Game Director
- Worked alongside animators, music composers, 2D/3D artists, and filmmakers
- Secured grant funding from Wichita State University
- Recruited nearly 50 team members over the course of 3 years
Lead Game Designer & Programmer
- Roughly 95% of the coding was done by me
- All design documents
Sound Design
- 194 unique SFX
- Recorded/produced several SFX and music tracks
- Created dynamic sounds through Wwise.

Watch the trailer here

Other Games I've Worked On:

Robottack

Evil robots have taken over a giant spaceship and it’s up to the player to save the day. Hunt down each robot on the ship and destroy them with lasers!Created as part of my Level Design class over the course of an entire semester.

Robottack Gameplay Video


Harvestville: Song of the Ancestress

Project Type Video Game / Multimedia
Software Used Unity Engine, Wwise
Coding Language C#
Primary Role(s) Game Director, Lead Designer, Lead Programmer, Sound Designer

Watch the trailer here
Fullscreen Screenshot
let currentIndex = 0; const images = document.querySelectorAll('.carousel-image'); const fullscreenOverlay = document.getElementById('fullscreenOverlay'); const fullscreenImage = document.getElementById('fullscreenImage'); function showImage(index) { images.forEach(img => img.classList.remove('active')); images[index].classList.add('active'); if (fullscreenOverlay.classList.contains('active')) { fullscreenImage.src = images[index].src; } } function nextImage() { currentIndex = (currentIndex + 1) % images.length; showImage(currentIndex); } function prevImage() { currentIndex = (currentIndex - 1 + images.length) % images.length; showImage(currentIndex); } function openFullscreen() { fullscreenOverlay.classList.add('active'); fullscreenImage.src = images[currentIndex].src; } function closeFullscreen() { fullscreenOverlay.classList.remove('active'); } // Allow closing fullscreen with Escape key document.addEventListener('keydown', function(e) { if (e.key === 'Escape' && fullscreenOverlay.classList.contains('active')) { closeFullscreen(); } });

Download the Demo Here!

Harvestville: Song of the Ancestress is the biggest, most ambitious game project I've worked on so far. It's a farming life sim game with a folk horror twist. The game includes a multiple FMVs which were filmed by me. it also features several original music tracks, many of which were recorded with real musicians. Over the course of 3 years, nearly 50 people contributed to the game's development, most of which were artists and animators. I was responsible for ~95% of the coding, as well as sound design, writing, and filmmaking.Click the drop-down menus below to read about some of my contributions in more detail:

  • Game Director
    • Worked alongside animators, music composers, 2D/3D artists, and filmmakers
    • Secured grant funding from Wichita State University
    • Recruited nearly 50 team members over the course of 3 years
  • Lead Game Designer & Programmer
    • Roughly 95% of the coding was done by me
    • All design documents
  • Sound Design
    • 194 unique SFX
    • Recorded/produced several SFX and music tracks
    • Created dynamic sounds through Wwise
  •  
  •  
(function() { const button = document.currentScript.previousElementSibling.previousElementSibling; const panel = button.nextElementSibling; button.addEventListener("click", () => { button.classList.toggle("active"); if (panel.style.display === "block") { panel.style.display = "none"; panel.style.maxHeight = "0"; panel.style.padding = "0 18px 0 18px"; } else { panel.style.display = "block"; panel.style.maxHeight = panel.scrollHeight + "px"; panel.style.padding = "10px 18px 20px 18px"; } }); })();

Game Design:

I was responsible for creating all of the design docs for the game. Since most people on the team only had 1-2 roles on the project, it was more beneficial to make several shorter design docs for different aspects of the project, rather than one master doc. In addition, the design changed drastically during development as we altered the story and scope of the game, so some details may not be accurate to the final product.

(function() { const button = document.currentScript.previousElementSibling.previousElementSibling; const panel = button.nextElementSibling; button.addEventListener("click", () => { button.classList.toggle("active"); if (panel.style.display === "block") { panel.style.display = "none"; panel.style.maxHeight = "0"; panel.style.padding = "0 18px"; } else { panel.style.display = "block"; panel.style.maxHeight = panel.scrollHeight + "px"; panel.style.padding = "10px 18px"; } }); })();
  • MY ROLE:
  • Designer, writer, programmer, sound design, audio production, shaders, acting.
  • GOAL:
  • I wanted to make a dark, theatrical introduction that would set up the world of Harvestville and introduce Father Winslow, as well as the mystery of the Ancestress while offering a sample of the game's horror vibes.
  • I also wanted to establish tone of the game, where moments of darkness or uncertainty are contrasted with moments of bliss and familiarity. This dark monologue in the intro is quickly interrupted by bright and happy music as the player begins a new day.
  • EVENTS:
  • There are 14 separately-timed cues throughout the intro, which are triggered by dialogue tags.
  • Each tag starts a coroutine that enables/disables objects or cameras, or triggers SFX or character animations.
  • Screenshot 1
  • CORPSE STAGELIGHTS:
  • The corpse stagelights are activated based on their order in the hierarchy.
  • The delay between activations decreases 0.1 seconds each time, down to a minimum of 0.1 seconds.
  • Each time one is activated, it picks a random SFX to play from an array.
  • Screenshot 2
  • Gif 1
  • SCENE TRANSITION:
  • Since the cutscene instantly cuts to the player's house, the cutscene has to be loaded into the same scene as the player's house to ensure there's no delay for loading.
    • The lighting/camera immediately change to give the illusion of being in a different place.
    • The cutscene's objects, scripts, and cameras are instantiated as a prefab, then destroyed after the cutscene for optimization.
  • FMV FOOTAGE:
  • The hands FMV uses a custom shader that uses chroma keying to remove the green background. The chroma keyed footage also reacts to light and emissives.
  • The glowing orb is just a default sphere, but the camera's bloom effect is turned up to give it a glowing appearance, which reacts more realistically with the FMV footage.
  • Gif 2
  • MUSIC:
  • I produced and integrated the music for the cutscene. Made with real recordings!
  • The scary string sounds were also made by our team.
(function() { const button = document.currentScript.previousElementSibling.previousElementSibling; const panel = button.nextElementSibling; button.addEventListener("click", () => { button.classList.toggle("active"); if (panel.style.display === "block") { panel.style.display = "none"; panel.style.maxHeight = "0"; panel.style.padding = "0 18px"; } else { panel.style.display = "block"; panel.style.maxHeight = panel.scrollHeight + "px"; panel.style.padding = "10px 18px"; } }); })();

C# Programming:

  • PlayerFootsteps
    I designed a surprisingly-complex system to handle the player footstep SFX. Here's a full breakdown of the system.
  • THE BASICS:
    • Each time the player takes a step, an animation event triggers this function, which checks:
      • The footstep cooldown (prevents unintended audio in fringe cases)
      • The player's Movement State (determines the sound array & which animation events to listen for)
      • The player's Velocity (determines SFX volume)
      • The Floor Material the player is stepping on
      • The previous footstep SFX played (avoids playing the same SFX twice in a row)
    • Afterwards, it picks a random footstep from the selected sound array and plays the SFX from the player's position.
    • Screenshot 1
  • FLOOR MATERIAL:
    • Each ground object has a script attached to it called FloorMaterial.cs
      • Outdoor terrain has an additional script called FloorMaterialTerrain.cs
    • We needed a system that allowed different SFX based on the material the player steps on, accounting for layered objects (like a rug on wood).
    • Objects with FloorMaterial scripts are prioritized:
      • Trigger colliders (rugs, leaf piles, etc.)
      • Non-trigger colliders (floors, bridges, staircases, etc.)
      • Objects with Terrain components
    • If a player walks on wood but steps on a rug, it will play the rug's SFX.
    • Screenshot 2
  • TERRAIN MATERIALS:
    • Terrain objects were trickier due to multiple texture layers painted by environment artists.
    • I created a script that uses the Terrain Data splat map to determine the dominant Terrain Layer underneath the player in real time.
    • Screenshot 3
    • This creates dynamic, accurate footstep sounds that are also efficient and easy for level designers to use.
  • WWISE INTEGRATION:
    • All footsteps sounds are played via Wwise events.
    • Events are sorted into sound arrays.
    • Screenshot 4
    • Screenshot 5
    • Separate arrays exist per Floor Material and walk/run state.
    • Random SFX is chosen per array but never repeats consecutively.
    • RTPC controls footstep volume based on player speed.
    • 3D panning uses player position + orientation.
    • Each event is stored in Footsteps soundbank for optimization.
    • Screenshot 6
  • ADDITIONAL FOOTSTEPS:
    • Non-movement animations sometimes require footstep SFX (like stomps or balance loss).
    • Added functions called by animation events, allowing manual volume control per event.
    • These functions still check floor material/terrain for accuracy.
    • Unity animation events accept only 1 parameter, so walking/running sounds were split.
    • Screenshot 7
(function() { const button = document.currentScript.previousElementSibling.previousElementSibling; const panel = button.nextElementSibling; button.addEventListener("click", () => { button.classList.toggle("active"); if (panel.style.display === "block") { panel.style.display = "none"; panel.style.maxHeight = "0"; panel.style.padding = "0 18px"; } else { panel.style.display = "block"; panel.style.maxHeight = panel.scrollHeight + "px"; panel.style.padding = "10px 18px"; } }); })();
  • THE BASICS:
  • This system allows the player to interact with various props in a modular and flexible way.
  • Currently, there are three main types of interactions:
    • Instant — triggers a function immediately.
    • Inspect — shows descriptive dialogue about the object.
    • Choice — gives the player options for how to interact.
  • Each prop displays a unique button prompt (e.g., "Press A to Turn On TV").
  • Screenshot 8
  • This simple script supports many different interaction possibilities, while still allowing programmers to add custom behavior for unique props.
  • Gif2 Placeholder
  • HIGHLIGHT: THE GRAMOPHONE
  • When the player interacts with it while inactive, it plays an animation where the lever winds, the record spins, and the needle lowers onto the record.
  • While a song is playing, leaving and re-entering the area resumes playback from where it left off.
  • If interacted with again, the player can stop the music.
  • When stopped, the pitch gradually lowers and ends with a record scratch sound.
  • The gramophone animation resets when the track ends or when stopped early.


(function() { const button = document.currentScript.previousElementSibling.previousElementSibling; const panel = button.nextElementSibling; button.addEventListener("click", () => { button.classList.toggle("active"); if (panel.style.display === "block") { panel.style.display = "none"; panel.style.maxHeight = "0"; panel.style.padding = "0 18px"; } else { panel.style.display = "block"; panel.style.maxHeight = panel.scrollHeight + "px"; panel.style.padding = "10px 18px"; } }); })();

Filmmaking:

  • I was the writer, director, and photographer for a short film called 'In My Darkest Hour', which was made for the TVs in Harvestville.
  • SUMMARY:
    • The film is in-universe and is implied to have been produced by men within the Harvestville Church ministry to play on their TV broadcasts.
    • A woman narrates her story where, in her hour of need, the Lord of the Harvest spoke to her and offered her 'words of wisdom'
    • The Lord reminds her that people who are oppressed are championed in the Harvest Above (essentially 'heaven') after death, and her oppressors shall be punished.
    • Given the greater context of the game, this film is meant to be seen as satirical, criticizing forms of spirituality that support 'slave morality', as Nietzsche would call it
  • GOAL:
    • Add to the game's world building:
      • It needed to feel like propaganda made by the Harvestville church
      • Establishes how the women of Harvestville are taught to view power imbalances
    • Set up the game's themes, as well as its satire:
      • I wanted to explore the ways in which media affects how we view the world, and how we develop our sense of self
      • Harvestville: SOTA is a game that's obsessed with morality, and this film needed to reinforce this obsession
    • Foreshadow later events in the game's story
      • (Without spoilers) Later on, an important character's desire for cosmological justice tragically backfires and leads to their downfall
  • INSPIRATIONS:
    • 'Mirror' by Andrei Tarkovsky
      • The film is both breathtakingly beautiful and difficult to describe. It's filled with visual poetry and gorgeous shots of green fields and trees
      • Similar to the film, I aimed for a dream-like quality, something that feels like it takes place somewhere that's both familiar and unknown
      • insert 'scroll through screenshots 2' here
    • 'On the Genealogy of Morals' and 'Beyond Good and Evil' by Fredrich Nietzsche
      • Though I have mixed feelings about the man himself, I found Nietzsche's writing incredibly useful and would regularly re-read sections of his books while writing the screenplay.
      • Nietzsche describes his concept of 'slave morality', a value system that glorifies weakness by reframing it as moral virtue.
        • This allowed me to understand the type of message the Harvestville church might want to enforce in their film to teach women not to rebel against their patriarchal system.
    • FILMING PROCESS:
      • The filming took 6 days over the course of 2 weeks.
      • Since it was filmed outside, we had to film right after sunset to avoid any shadows. This meant we would only have about 30 minutes to film at any given time, which was challenging.
      • We had 2 days strictly committed to shooting B-roll for all the nature/insect scenes. (Most of the animal shots are stock footage, but I did film the butterflies and cricket).
      • There were lots of mosquitos and ticks, so that was fun!
      • Video editing and voice-over were both done by me. Since the actors almost never speak, this made it easier to edit the script without having to re-shoot anything.
      • David Browne composed the music in a single day.
(function() { const button = document.currentScript.previousElementSibling.previousElementSibling; const panel = button.nextElementSibling; button.addEventListener("click", () => { button.classList.toggle("active"); if (panel.style.display === "block") { panel.style.display = "none"; panel.style.maxHeight = "0"; panel.style.padding = "0 18px"; } else { panel.style.display = "block"; panel.style.maxHeight = panel.scrollHeight + "px"; panel.style.padding = "10px 18px"; } }); })();
  • NOTE: My contract prevents me from showing all of the scenes we've filmed, currently. More will be added at a later date.
  • The Ancestress is our game's antagonist, a mysterious deity who causes mayhem among the villagers of Harvestville.
  • We needed her to appear as angry and threatening, but also feminine.
    • I took inspiration from photography, specifically Judy Chicago's 'Goddess with Flares' from the portfolio "On Fire".
    • Smoke and pyrotechnics are a great way to transform a large space without destroying it, in a way that appears more feminine in nature.
    • In Judy's own words, her use of smoke and flares is "never to dominate but rather to transform — not to overpower, but to change..."
  • FILMING:
  • We used 2 red smoke grenades per shot, along with 2 red safety flares. Our film crew would quickly move the smoke grenades to account for wind changes.
  • This was filmed in a Kansas field in 40° weather at 1 AM. Yippee!
  • The safety flares provided excellent lighting, and even gave the smoke clouds a thunderous, supernatural appearance.
  • COSTUME:
  • It was super important for us to design a great costume for the Ancestress.
  • I played the role of the Ancestress and did the makeup.
  • Using sclera eye contacts, face paint, and a ton of eye shadow and teeth paint, I was able to create this look.
  • Here's what the Ancestress costume looks like up-close:
  • Ancestress Costume Close-up 1
  • Ancestress Costume Close-up 2
(function() { const button = document.currentScript.previousElementSibling.previousElementSibling; const panel = button.nextElementSibling; button.addEventListener("click", () => { button.classList.toggle("active"); if (panel.style.display === "block") { panel.style.display = "none"; panel.style.maxHeight = "0"; panel.style.padding = "0 18px"; } else { panel.style.display = "block"; panel.style.maxHeight = panel.scrollHeight + "px"; panel.style.padding = "10px 18px"; } }); })();



Robottack

Project Type Video Game
Software Used Unity Engine
Coding Language C#
Primary Role(s) Level Designer, Game Designer

Evil robots have taken over a giant spaceship and it’s up to the player to save the day. Hunt down each robot on the ship and destroy them with lasers!This was a solo project I worked on as part of my Level Design class. It was created over the course of the semester under the instruction of Zachary Sewell, a Level Designer at Studio Sirens - Snail Games USA.

Robottack Gameplay Video
  • Challenge: The level was made inside of a Unity template project with poorly-designed mechanics.
  • Solution: Embrace the design and try to make it fun and interesting purely through level design.
  • Challenge: When entering combat, players would just walk backwards into a different room and wait for enemies to ambush them.
  • Solution: Added walls and cover all over the map so as soon as the player aggros an enemy, they can take cover to recharge their weapons.
  • Challenge: One critique from playtesters was that there wasn’t enough verticality to the level.
  • Solution: I expanded it and added more ramps, and I also changed the original areas so they get a bit more use out of verticality.
  • Challenge: Larger enemy turrets expand when aggro’d by the player, meaning that walls which once blocked their vision will no longer prevent them from shooting the player at inappropriate times.
  • Solution: Make walls TALL so they don’t shoot over them.
(function() { const button = document.currentScript.previousElementSibling.previousElementSibling; const panel = button.nextElementSibling; button.addEventListener("click", () => { button.classList.toggle("active"); if (panel.style.display === "block") { panel.style.display = "none"; panel.style.maxHeight = "0"; panel.style.padding = "0 18px"; } else { panel.style.display = "block"; panel.style.maxHeight = panel.scrollHeight + "px"; panel.style.padding = "10px 18px"; } }); })();

Contact Me

Feel free to send me an email here: [email protected].
You can also follow me on social media.