CCL4PotionWitch

WitchsBrew

CCL4

Course: CCL4 SS 2025 (5 ECTS, 3 SWS)
Student ID: cc231036, cc231032, cc231043, cc231045
BCC Group: B and C
Witch’s Brew
by Sara Beslic, Corinna Huber, Helene Urban, Nicoleta Dublea

Roles

Sara Beslic
Coding, Game Logic
Corinna Huber
3D Modeling, Documentation, Story and Game Design, Organisation
Helene Urban
3D Modeling, Game Trailer
Nicoleta Dublea
UI Design, Game Audio


Witch’s Brew is a dark, low-poly 3D adventure game set in a haunted forest. You play as Raven, a young witch who must collect ingredients, brew magical potions, and banish ghostly enemies that spawn from an ancient graveyard. Guided by Wisp, a mysterious moth-like creature, players explore a small open world filled with spooky atmosphere and magical danger. This project was created to apply and combine skills in 3D modeling, animation, Unity programming, and game audio. It represents our first complete game developed as a team.


Important Links

Github Repository

https://github.com/corinnahuber/CCL4PotionWitch

Documentation

https://corinnahuber.github.io/CCL4PotionWitch/

Tasks and Task Distribution

📊 View Task Distribution Sheet

Miro board

https://miro.com/app/board/uXjVINxA_V0=/?share_link_id=535119272679

User guideline

Connect Repository to Unity
either play the game directly in Unity (run Main Menu Scene)
or Build the project and play the built version
Note: Project is built with Universal 3D in Unity

Story

In the twilight-drenched forest of Black Hollow, a young witch named Raven stirs her cauldron, desperate to cleanse her haunted home. Once a place of peace, the forest is now stalked by restless ghosts, echoes of an ancient curse. These spirits feed on fear, growing stronger in the dark old woods. 
Armed only with her cunning and her potions, Raven must face each ghost and banish them all to restore the forest’s peace — or be consumed by the spirits that hunger in the shadows.

Ending

With the last ghost banished, a calm silence returns to the forest. Raven’s potions have driven away the darkness, and the woods can finally breathe again. She stands among the whispering trees, knowing that peace has been restored — at least, for now.

Characters

Main Character
(Witch, human)
Name: Raven

Side Character
(Moth)
Name: Wisp

Enemies
Ghosts

Goal

The player’s ultimate goal is to cleanse the forest by defeating all the ghosts haunting the world. To do this, they can craft up to five unique potions, each with its own effect. Ingredients are scattered throughout the world and must be gathered to brew potions at the cauldron outside the witch’s home. When a ghost appears, the player must quickly choose the right potion and throw it at the ghost to kill it. But beware — if the ghosts get too close and deals too much damage, it’s game over!

System Design

Player role:
The player takes on the role of a witch in a third-person perspective. To cleanse her haunted forest of ghosts, she must brew potions using ingredients found in the woods. However, she must remain cautious - ghosts lurk in the shadows.
The witch’s Book:
Her ancient book contains recipes for potions, listing all the necessary ingredients she must gather. Each potion has a unique effect, essential for battling the ghosts.
The ghosts:
Ghost health depletes based on the potion used (Burn = fast damage etc.). Their movement and attack patterns will be polished later to align with the rest of the game visuals and logic.

image

Key Features and Implementation Detail

Implementation Logic Explained

Each potion and their effect on the player or the ghost is written in the PotionEffects and then called every tine when a player uses the potion on themselves or on the ghost. Again the use of potion triggers updating of the potion inventory ( bottom bar). Ghosts are randomly placed around the world using setDestinantion on a navMesh and they roam around the place until they spot a player. If in the given range they start to chase us and the fighting icon appears- the time when we can fight the ghosts. When the icon is gone potion has no effect and cant be used. If hit by a ghost, ghost goes into cooldown to give us a chance to escape. Every time we are hit the update method checks if we are out of hearts and ends the game if we are dead.

System Infrastructure

ClassDiagram

Update

ClassDiagram


WitchsBrewLogo


Achievements

Major Challenges and Solutions

Minor Challenges and Solutions

Reflections on the Project

3D Models

RavenSideView

WispFrontView WispSideView

GhostFrontView GhostSideView

PotionBottleHeal PotionBottleDamage PotionBottleBlast PotionBottleStun PotionBottleSwift

Cauldron

WitchHouse01 WitchHouse02

Collectables

PineTrees Pumpkin






In-Game

Scene01 Scene02

Scene03 Scene04 Scene05






WitchsBrewLogo