UNO HGSS
Main Developer
(January 2025 - February 2025)
Download link: [coming soon]
Programming responsibilities: Action list implementation, UNO card @tool implementation, Bezier curves implementation, telemetry programming, systems programming, technical design
Team Size: Solo
Misc. responsibilities: Pixel art, UI design, game feel
This small project (made in Godot 4.3) makes use of an “action list” implementation for UI animation and changing the game state. It recreates Hasbro’s UNO card game and includes the ability to change settings about the game like initial card hand sizes and number of players, records telemetry about actions and player moves, and makes use of Godot’s support for multiple windows to display debug information.
Development history and retrospective
Over the course of November and December 2024, I played a significant amount of Hasbro’s UNO card game with my friends and family. The premise and rules behind the game are simple yet engaging, and plenty of addons and variations exist to make each game one to be remembered. Upon entering my technical design class in the spring, the first project we were tasked with was creating a card game using the concept of action lists; despite the default choice being poker, I knew what I was going to do for the project the moment it was announced.
Given I decided to use the Godot engine once again for a design project, I wanted to further expand upon its capabilities with what I implemented for the card game. Godot has a special keyword called “@tool” that allows for code to be run in-editor; with this, it allowed me to create UNO cards whose colors, numbers, and facing direction could be modified and visually updated in-editor. Not only that, but making use of enumerators, separated sprites, and shaders, different types and colors of cards can be easily created by expanding a set of sprite sheets and color palettes to adapt to the new additions.
Another useful function included within Godot are “set” and “get” functions, not to be confused with the built-in setter and getter functionality which I made extensive use of as well. The way the action lists were meant to work was to create a generic “action” to procedurally modify the position, rotation, scale, transparency, and other properties of an object instead of having the object handle all that behavior itself. Usually, this kind of implementation would require having a base “action” class that could interpolate the values, and would require inheriting that base class for different properties. With Godot’s “set” functions, I circumvented having to create multiple children to the base class, as I could simply insert the name of the property I wanted to change as a string. Given GDScript is a dynamically typed language and has the ability to linearly interpolate between most types, my implementation of actions uses an array of values to interpolate through to modify the inserted property. Alongside Bezier curve implementation and Godot’s built-in easing functions, my cards now move, rotate, flip over, and scale cleanly and smoothly; I can make subtle changes to the movements and timing without having to delve deep into code.
Actions weren’t only used to manipulate variables, they could also call a varying number of functions upon an action’s activation or completion. Godot’s ability to use callbacks allowed the system to call functions with a delay or at a certain point along an action. I used this feature alongside Godot’s signals in order to implement the pause menu, resetting the game, and game progression in general; for example, when a player plays a valid card and after it reaches its destination, a function gets called to begin the next player’s turn. All of these actions can be viewed in detail, paused, and time-scaled in a debug panel implemented into the program.
As a gameplay programmer and technical designer, I want to be able to program something that is easy for designers to work with while being capable for programmers to make use of and iterate upon. Once I familiarized myself more intimately with Godot and its various built-in tools, I was able to design around its capabilities in a way I believe is efficient, easy to use, easy to expand, and unique. Overall, this is a project I’m significantly proud of; it’s UNO, and it looks and plays well!





