Imagine that you're the owner of a MAJORLY POPULAR Casino.
You're so rich that everyone wants to steal from you.
TODAY is your lucky day! You just managed to catch a cheater try to embezzle YOUR Casino out of **10 million dollars**.
Now they have to play you in a game of life or death.
__This is The Final Draw!__We implemented a quick 2-D Card Battle Game. The game is relatively simple: kill your opponent before they kill your first! The mechanics will be explained later, but for the moment just know that it's a really quick and fun game that we wanted to implement along with motion sensing.
The reason why we wanted to make a game like this comes from our group's mutual love for tabletop games, board games, and card games. A couple of our team members were inspired by Balatro and Spit. We also thoroughly discussed adding an interesting theme for said card game since there are always an endless amount of new card games to be made.
We wanted to integrate the hardware because three of us have embedded experience, so we wanted to implement that into the game in some capacity. We used the Raspberry Pi Pico RP2040 to implement our motion sensing. This would give us a great reason to utilize the embedded skills that we have cultived over the past few years.
- STEP 1: Flash code into Raspberry Pi Pico in WSL
- Clone the Raspberry Pi Pico-SDK into WSL
- Set ENV var to the Pico-SDK
- Build Commands to create .uf2
cmake -S . -B buildcmake --build build
- Hold down Bootsel and plug Pico into device to enter Boot Drive
- Drag the .uf2 file from WSL to Pico Boot Drive to flash
- STEP 2: Run game in Godot
- STEP 3: Run udp.py in Windows
- Use Python command below to run udp.py
py -3.xx udp.py- Note:
xxrefers to the version of python you have installed, so if you have python 3.14,xx = 14
- Note:
- Use command above to run the udp.py
- Change interpreter based on installed interpreter in PATH
- Use Python command below to run udp.py
This game relies on IRL player movement while holding a card to perform various game mechanics. The player has to imitate that action of throwing a card and it will lead to their avatar throwing that card at the enemy. This proves consistent with the rest of the actions as they will raise their arm and tilt the card upward to defend or set the card on a level surface to heal in the game. There is also a default normal state that the player is in whenever they are not explicitly aiming to _attack, defend, or heal.
These mechanics are also linked to the special cards in the game whose attributes are shown in the table below:
| Card | Pros | Cons | Attack Stat | Defense Stat | Health State |
|---|---|---|---|---|---|
| Red Card - Attack Card | Continuous Damage | Cannot Defend | 2 Hearts | 0 Defense (Stuck for 2 Seconds) | Wait 3 Seconds per Heart |
| Blue Card - Defense Card | Impenetrable Defense | Unable to do more than 1 move | 1 Heart | Nulls all Incoming Damage | Wait 4 seconds per heart |
| Green Card - Health Card | Restore Health | Bad at defending while mediocre at attack | ½ Hearts | ½ of incoming damage | Wait 2 seconds per heart |
In normal mode all of the stats are normalized to an average of each of the conditions. For example, the attack damage averages out to roughly 1.5 but we rounded it to 1 to keep the spirit of discrete health! The opponent will also have the same cards available to use and the player will be able to see the one that will be used by the opponent each time before they use it. Therefore, a lot of the game's strategy relies on timing and ability to read the opponent's move.
If you would like to see our development process:
- GDD
- Video Demo
- Devpost
Please look at the links below!