flipper-zero-tutorials/subghz/plugins/rock_paper_scissors
2023-07-11 17:52:49 -05:00
..
.flipcorg Updated flipc.org files 2023-04-13 19:13:12 -04:00
images Add images to rock paper scissors game. 2023-02-14 15:49:09 -05:00
prebuilt Add prebuilt for Release 0.80.1 2023-04-09 11:42:52 -04:00
application.fam version 1.2 of RPS 2023-07-11 17:38:16 -05:00
LICENSE Add license to RPS game 2023-07-11 17:41:58 -05:00
README.md Updated README 2023-07-11 17:52:49 -05:00
rock_paper_scissors.c Build with: ufbt update --channel=release 2023-07-11 17:11:55 -05:00
rock_paper_scissors.h Build with: ufbt update --channel=release 2023-07-11 17:11:55 -05:00
rock_paper_scissors.png Initial version of rock paper scissors. 2023-02-11 16:18:31 -05:00

Rock Papper Scissors

Flipper Zero Game

Working builds

This multi-player application relies on a SubGHz API that was recently changed. Older firmware will get a build error, due to not supporting the new API definitions.

It should build successfully on the following versions:

  • Official firmware - RC 33.0
  • Official firmware - Release 33.0
  • Official firmware - DEV 34.1
  • Unleashed firmware - DEV 34.0
  • RogueMaster firmware - DEV 34.1

If you get error unknown type name 'SubGhzDevice' trying to build, then you need a newer firmware version.

Introduction

This is a multi-player game of Rock, Paper, Scissors! In version 1.2, we use the Flipper Zero Sub-GHz radio to find other players, communicate moves, and exchange contact information.

Watch on YouTube.

Quick install directions for Flipper Zero running Official Firmware!

I recommend FlipC.org as the easiest way to install the game on your Flipper Zero.

Playing the game

These directions assume you are starting at the flipper desktop. If not, please press the back button until you are at the desktop.

  • On both Flippers, launch the "Rock Paper Scissors" application.

    • Press the OK button on the flipper to pull up the main menu.
    • Choose "Applications" from the menu.
    • Choose "Games" from the sub-menu.
    • Choose "Rock Paper Scissors"
  • On both Flippers, choose "Edit contact info".

    • Enter your Discord name, or Facebook name, or whatever you want to share with other players.
    • Hold the backspace button (top right) to clear the field.
    • Hold a letter button to choose lowercase letters.
    • Use the enter button (bottom right) to save your contact info.
  • On Flipper 1, choose "Host game".

    • select a valid frequency. (like "433.92" in US region)
    • choose a game number (like "042")
    • click OK button to start game.
  • On Flipper 2, choose "Join game".

    • select the same valid frequency as Flipper 1.
    • "game none" should change to show the game number from Flipper 1 & its name.
    • click OK button to join game.
  • Once two players are joined:

    • Press "OK" to send "1". The other player should also press "OK" to send "1" back - Press "OK" to send "2". The other player should also press "OK" to send "2" back - Press "UP" to send a "Rock", or "RIGHT" to send a "Paper", or "DOWN" to send a "Scissors".
    • Rules:
      • Rock beats Scissors.
      • Paper beats Rock.
      • Scissors beat Paper.
      • Two identical items tie.
  • Play again screen will show the results of the game.

    • Click "Right" to select "No".
    • Click "Left" to select "Yes" (the default).
    • Click "OK" to answer the prompt.
  • Short press the BACK button for the main menu.

  • Long press the BACK button to exit the game.

Status

V1 completed features:

  • The game logic is complete (two flippers can play against each other.)
  • UI to show Flipper images instead of just debug text.
  • Allow changing contact information (discord, Facebook, etc.)
  • Allow changing frequency, in case one Flipper is in a restricted region.
  • Allow changing game number, in case multiple games at a conference.
  • Show games found & let user pick the game to join.
  • Receiving a Join game does an ACK (to cause game on joiner to start).
  • A join ACK removes it from the list of available games.
  • Vibro on button press (valid move).
  • "Song" when win/loss/draw.
  • Log game results & contact info onto SD card.
  • Allow viewing past games/scores.
  • Relaxed timing, so Count 1/Count 2/RPS no longer have to be timed tightly.
  • Added a "Play again" screen.
  • Play again from one Flipper Zero auto-starts/exit other Flipper Zero.

Planed work for V2.0:

  • Wrap user content to two lines on Past Games screen.
  • Allow for replacement of keyboard layout/keys.
  • Refactor the code, so it has less duplication.
  • Write tutorial.

Future ideas:

  • Add game ending animations.
  • Create stand-alone hardware badges that can play the game too.
  • Uses Princeton signals for communication.
  • Instead of subghz, use GPIO.
  • Instead of subghz, use IR.

Installation Directions

This project is intended to be overlayed on top of an existing firmware repo.

  • Clone, Build & Deploy an existing flipper zero firmware repo. See this tutorial for updating firmware.
  • Copy the "rock_paper_scissors" folder to the \applications_user\rock_paper_scissors folder in your firmware.
  • Build & deploy the firmware. See this tutorial for updating firmware.
  • NOTE: You can also copy rock_paper_scissors.FAP from latest.extapps folder and use qFlipper to copy the file to the SD Card/apps/Misc folder.

HackRF One

  • If you do not have two Flipper Zero devices, you can use a HackRF One to record messages & broadcast those messages at a future date. I made a YouTube video demo of how to record and broadcast messages.

  • To record a message: (replace "flipper-chat.rf" with the file name you want to use, such as "select-rock.rf".)

sudo hackrf_transfer -r flipper-chat.rf -f 433920000 -s 8000000
  • To broadcast a message: (replace "flipper-chat.rf" with the saved file name.)
sudo hackrf_transfer -r flipper-chat.rf -f 433920000 -s 8000000 -x 47
  • What I typically do is:
    • Use the Flipper Zero to send a messasge that I record, then I play back that message at a later time when I want to pretend the other Flipper Zero is sending a message. You can use the chat app in https://lab.flipper.net/cli, like shown in the video to send a specific packet (or you can use your own code to create the packet.)
    • Use the HackRF One to record the message from my Flipper Zero. Then later I use the chat app in https://lab.flipper.net/cli, to see what the message was (or I replay the message to see how my application would respond.)

Details about the project files

  • application.fam

    • specifies the name of our application.
    • specifies the entry point for our application.
    • specifies we use the GUI.
    • specifies our icon is the rock_paper_scissors.png file.
    • specifies our application can be found in the "Game" category.
  • rock_paper_scissors.png

    • The icon for our application.
  • rock_paper_scissors.c

    • This is the game applcation (tutorial coming soon).

Example data

  • Beacon for game 042: Lumyphut: RPS:BA042

  • Not Beacon for game 042: Lumyphut: RPS:NA042

  • Join game 042: Lumyphut: RPS:JA042NYourNameHere

  • Join-ack for game 042: Lumyphut: RPS:AA042NYourNameHere

  • Count 1 for game 042: Lumyphut: RPS:MA0421

  • Count 2 for game 042: Lumyphut: RPS:MA0422

  • Rock for game 042: Lumyphut: RPS:MA042R

  • Paper for game 042: Lumyphut: RPS:MA042P

  • Scissors for game 042: Lumyphut: RPS:MA042S