Playable at: https://joellegames.itch.io/rps999!
Playable at: https://joellegames.itch.io/rps999!
Purchase items to turn the odds in your favor in this tactical spin reimagination of the classic game. Reach a win streak of three to defeat the opponent and prove yourself as the RPS champion!
I served as the sole programmer and UI engineer for this project, designing systems to handle game states and various item effects within Godot.
The main appeal of RPS999 is the various items you can purchase (and destroy) between rounds as you search for an advantage against your opponent.
Item implementation revolves around Godot's Resource system, each instantiated from their own unique script inherited from an abstract Item class.
RPS999 was developed in roughly five weeks for UC Santa Cruz's ARTG 170 course, Game Design Studio I. This timeline forced me to be very efficient with my programming architecture while laying the groundwork for systems that could be easily adjusted for balancing purposes. By using a modular state machine, I was able to isolate complicated sections of the game loop, primarily the item selection and shop, and thread them together through a state controller without worrying about dependency.
One of my goals whenever I am programming is to make adjustments as easy as possible for designers. My system for item management allows anyone in-engine to edit the cost of items, their description, item type, and activation conditions without touching any code. Here is what an item object looks like in Godot's inspector!
Item effects rely on a global Game Manager class, allowing them to access the state machine and override values such as the round results and player inventories. If I were to code this project from the start again, I would like to add an extra level of variable protection here as this is not an ideal approach if other programmers were to join the project.
UI was implemented with a relatively straightforward system revolving around "control" panel nodes that each hold a Show and Hide position in the form of exposed Vector2's, and can be quickly tweened between each state from a UI controller. Data is also updated dynamically through calling relevant signals at the appropriate time and passing in general game data.