A puzzle game based on a tragedy. Submitted for the 48-hour 2023 Winter Jam hosted by Uppsala University Campus Gotland.
GitHub Source CodeCore Challenges
- Time Limit: How to create a complete game within 48 hours?
- Designer-Friendly: Given the limited manpower, I cannot implement everything alone. How to make it easy for others to implement my script?
- Multiple Genres: As a puzzle game with visual novel elements, How to implement these genre features seamlessly?
Core Solutions
- Generic: Simple and generic scripts are fast to implement and highly reusable.
- Expandable with Interface: Have few core scripts, with few public variables for easy understanding of how to implement the scripts.
- UML Diagrams: Quickly sketch out class diagrams to understand the whole system before implementation.
Generic Code

For any interactable object in the current scene, it requires only three things:
- Whether the Player is near it →
is_in_range
- The trigger to interact with it →
trigger
- What to do on interact →
on_success
This script makes it easy for designers to make objects interactable with any keybind needed.
Dialogue System
Using six classes, the game had an expandable dialogue system that was user-friendly for designers.
![]() | ![]() |
---|
DialogueStructure
: A sentence may require a sprite, the name of the character talking, what they're saying, and a sound effectDialogue
: A dialogue consist of several sentences, that can be represented with aDialogueStructure
ChoiceStructure
: A choice consist of a description of what it is, and what it doesChoices
: Player may choose multiple choices, that can be represented with aChoiceStructure
DialogueManager
: To keep track of whether a dialogue is runningDialogueInterface
: To make a new dialogue, it references aDialogue
, and actions after a dialogue, which may be choices
Inventory System

InventoryManager
: simply manages a list of items the player owns.InventoryItemController
: Since some items were puzzle items that were meant to be dragged to the environment, each item owned by the player had anInventoryItemController
that made the items draggable, and store whether it interacted with a certain object in-scene.
What I've Learnt
- Code Architecture: Using UML diagrams to get a greater sensing of the code architecture and the actors in them.
- Code Interfaces: Make code highly readable by keeping it clean and using interfaces.
- Working under pressure: Successfully deliver a game with a team under a strict time limit.