[{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/952/original/screenshot-title.jpg?1757438608","metadata":{}},{"element_type":"text","content":"\n  \n        \u003ch2\u003eOverview\u003c/h2\u003e\n\u003cp\u003eTired of all the action and puzzle games on the\u0026nbsp;\u003cstrong\u003eAdafruit Fruit Jam\u003c/strong\u003e? Want to try something new? Well, you've got a treat in store for you with the new game, \u003cstrong\u003eSsspeed Dating\u003c/strong\u003e. Dive into a world full of fun snakes looking to spice up their lives by meeting someone new. Chat with 6 unique characters during quick-fire speed dating rounds hosted by the familiar CircuitPython mascot, \u003cem\u003eBlinka\u003c/em\u003e, and do your best to charm the snake of your dreams.\u003c/p\u003e\n      \n","metadata":{}},{"element_type":"user_image","content":"https://cdn-learn.adafruit.com/user_assets/assets/000/001/953/original/screenshot-ellis.jpg?1757438650","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n        \u003cp\u003e\u003cstrong\u003eSsspeed Dating\u003c/strong\u003e has the following major features:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSimple branching dialogue for 6 characters with different personalities and traits\u003c/li\u003e\n\u003cli\u003e6 unique endings depending on the character your match best with\u003c/li\u003e\n\u003cli\u003e320x240 HDMI video output\u003c/li\u003e\n\u003cli\u003ePre-recorded 11025hz 8-bit mono music, voice acting, and sound effects\u003c/li\u003e\n\u003cli\u003eUSB keyboard, USB mouse, and hardware buttons input\u003c/li\u003e\n\u003cli\u003eEasy customization to support user-created content using JSON and BMP assets\u003c/li\u003e\n\u003c/ul\u003e\n      \n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003eControls\u003c/h2\u003e\n\u003ch3\u003eMouse\u003c/h3\u003e\n\u003cp\u003eYou can control all aspects of this application using a USB mouse to control the on-screen cursor. All actions are completed with a left click. Some events require that an object be hovered over and then clicked while others you can click anywhere on the screen to proceed.\u003c/p\u003e\n\u003cp\u003eIn order to exit while playing the game, click the door icon in the top right corner. This will bring up a confirmation prompt which will return you back to the title screen. At this point, you can reload the device by clicking the \"Quit\" option on the title screen. If the application is installed within \u003ca href=\"https://github.com/adafruit/Fruit-Jam-OS\"\u003eFruit Jam OS\u003c/a\u003e, it will return to the main menu of the operating system.\u003c/p\u003e\n\u003ch3\u003eKeyboard\u003c/h3\u003e\n\u003cp\u003eA standard USB keyboard or REPL prompt can be used to control all aspects of this application.\u003c/p\u003e\n\u003ctable\u003e\n\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003c/tbody\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eArrow keys\u003c/td\u003e\n\u003ctd\u003eNavigate menus and dialog options\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEnter or space\u003c/td\u003e\n\u003ctd\u003eSelect highlighted item or continue to next dialog\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEscape\u003c/td\u003e\n\u003ctd\u003eOpen exit prompt to return to title screen\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLetter keys (upper/lower)\u003c/td\u003e\n\u003ctd\u003eIf on-screen keyboard is active, appends character to input\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBackspace\u003c/td\u003e\n\u003ctd\u003eIf on-screen keyboard is active, remove last character from input\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3\u003eButtons\u003c/h3\u003e\n\u003cp\u003eThe 3 buttons on the Fruit Jam device can be used for basic control of this application.\u003c/p\u003e\n\u003ctable\u003e\n\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eButton\u003c/th\u003e\n\u003cth\u003eAction\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003c/tbody\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eButton #1\u003c/td\u003e\n\u003ctd\u003eSelect highlighted item or continue to next dialog\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eButton #2\u003c/td\u003e\n\u003ctd\u003eNavigate down menus and dialog options\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eButton #3\u003c/td\u003e\n\u003ctd\u003eNavigate up menus and dialog options\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3\u003eGamepad\u003c/h3\u003e\n\u003cp\u003e\u003cem\u003eUSB gamepads are currently not supported but planned to be added in a future release.\u003c/em\u003e\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003eParts\u003c/h2\u003e\n\u003cp\u003eI am using a production revision D Fruit Jam board. Most additional components can likely be found around the house such as HDMI cable \u0026amp; display, headphones, power supply, etc.\u003c/p\u003e\n\u003cp\u003eThe USB keyboard system uses the CircuitPython core\u0026nbsp;\u003ccode\u003esys.stdin\u003c/code\u003e module (\u003ca href=\"https://docs.circuitpython.org/en/latest/docs/library/sys.html#sys.stdin\"\u003elearn more\u003c/a\u003e), so most boot keyboard compatible devices should work.\u003c/p\u003e\n\u003cp\u003eThe USB mouse system uses the library, \u003ca href=\"https://github.com/adafruit/Adafruit_CircuitPython_USB_Host_Mouse\"\u003eAdafruit_CircuitPython_USB_Host_Mouse\u003c/a\u003e which supports most boot mouse compatible devices.\u003c/p\u003e\n\u003cp\u003eIt is possible to use a Metro RP2350 which is discussed in learn guides such as\u0026nbsp;\u003ca href=\"https://learn.adafruit.com/larsio-paint-music\"\u003eLarsio Paint Music\u003c/a\u003e., but this guide will not discuss that procedure nor has the software been tested within that environment.\u003c/p\u003e\n\u003ch3\u003eFrom the Adafruit Shop\u003c/h3\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/6200","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/2025","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/1736","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/1966","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/1363","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/608","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/5802","metadata":{}},{"element_type":"product","content":"https://www.adafruit.com/product/1667","metadata":{}},{"element_type":"text","content":"\n        \u003ch2\u003eInstallation\u003c/h2\u003e\n\u003ch3\u003eUpdating CircuitPython\u003c/h3\u003e\n\u003cp\u003eAt this time (August 13th, 2025), CircuitPython 10.0.0-beta.3 is the most recent build for Fruit Jam. It is recommended but not necessary to use the \u003ca href=\"https://adafruit-circuit-python.s3.amazonaws.com/index.html?prefix=bin/adafruit_fruit_jam/\" target=\"_blank\"\u003eabsolute newest firmware version for Fruit Jam\u003c/a\u003e to ensure all application features are supported. This application has not yet been tested with CircuitPython version 9.x.x, but the project bundle includes a 9.x package in case that is desired.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca href=\"https://circuitpython.org/board/adafruit_fruit_jam/\" target=\"_blank\"\u003eFruit Jam CircuitPython Download\u003c/a\u003e page\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTo install the UF2 File:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eConnect your board to a computer with a USB data cable \u003cem\u003e(charge-only cables won't work!)\u003c/em\u003e\n\u003c/li\u003e\n\u003cli\u003ePress and hold the board's boot button (Button #1 on Fruit Jam)\u003c/li\u003e\n\u003cli\u003ePress and release the reset button\u003c/li\u003e\n\u003cli\u003eRelease the boot button\u003c/li\u003e\n\u003cli\u003eWhen the removable drive named \u003cstrong\u003eRP2350\u003c/strong\u003e appears, copy the UF2 file onto it. After the copy finishes, you should see the \u003cstrong\u003eRP2350\u003c/strong\u003e drive disappear and soon after that a new \u003cstrong\u003eCIRCUITPY\u003c/strong\u003e drive should appear.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3\u003eInstall Project Bundle\u003c/h3\u003e\n\u003cp\u003eYou can view the code on the \u003ca href=\"https://github.com/relic-se/Fruit_Jam_Ssspeed_Dating\" target=\"_blank\"\u003erelic-se/Fruit_Jam_Ssspeed_Dating\u003c/a\u003e code repository on GitHub. It is recommended to download the \u003cstrong\u003eFruit_Jam_Ssspeed_Dating.zip\u003c/strong\u003e asset from the most recent project release to obtain a pre-packaged version of the program with all library dependencies.\u003c/p\u003e\n      ","metadata":{}},{"element_type":"button","content":"https://github.com/relic-se/Fruit_Jam_Ssspeed_Dating/releases","metadata":{"class":"btn btn-large btn-block btn-primary","button_type":"primary","target":"_self","zip_folder":"false"}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eTo copy the project bundle files to your \u003cstrong\u003eCIRCUITPY\u003c/strong\u003e drive:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eVisit the project releases page and download the latest release's \u003cstrong\u003eFruit_Jam_Ssspeed_Dating.zip\u003c/strong\u003e file using the \"Download Project Bundle\" button above.\u003c/li\u003e\n\u003cli\u003eExpand the zip file by opening it, or use unzip in a Terminal. The zip archive should expand to a folder. When you open the folder, it should contain subfolders for the supported versions of CircuitPython. Open the desired version subfolder which should contain a \u003cstrong\u003ecode.py\u003c/strong\u003e file and a handful of other files and folders.\u003c/li\u003e\n\u003cli\u003eCopy all of this folder's contents to your \u003cstrong\u003eCIRCUITPY\u003c/strong\u003e drive so that \u003cstrong\u003ecode.py\u003c/strong\u003e is in the root folder.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp class=\"p2\"\u003e\u003cspan class=\"s1\"\u003eTo learn more about copying libraries to your\u003cspan\u003e\u0026nbsp;\u003c/span\u003e\u003cstrong\u003eCIRCUITPY\u003c/strong\u003e\u003cspan\u003e\u0026nbsp;\u003c/span\u003edrive, check out the\u0026nbsp;\u003ca href=\"https://learn.adafruit.com/welcome-to-circuitpython/circuitpython-libraries\" target=\"_blank\"\u003e\u003cspan class=\"s2\"\u003eCircuitPython Libraries\u003c/span\u003e\u003c/a\u003e\u0026nbsp;section of the\u0026nbsp;\u003ca href=\"https://learn.adafruit.com/welcome-to-circuitpython\" target=\"_blank\"\u003e\u003cspan class=\"s2\"\u003eWelcome to CircuitPython!\u003c/span\u003e\u003c/a\u003e\u0026nbsp;learn guide.\u003c/span\u003e\u003c/p\u003e\n\u003ch4 class=\"p2\"\u003e\u003cspan class=\"s1\"\u003eAlternate Installation: Fruit Jam OS\u003c/span\u003e\u003c/h4\u003e\n\u003cp\u003e\u003cspan class=\"s1\"\u003e\u003cem\u003e\u003cstrong\u003eSsspeed Dating\u003c/strong\u003e\u003c/em\u003e is compatible with \u003cem\u003e\u003cstrong\u003eFruit Jam OS\u003c/strong\u003e\u003c/em\u003e and will show up as a valid application to load into and back out of. If you are using\u0026nbsp;\u003ca href=\"https://github.com/adafruit/Fruit-Jam-OS\" target=\"_blank\"\u003eFruit Jam OS\u003c/a\u003e on your device, follow the above installation instructions but instead of copying the program assets into the root folder in step #3, do the following:\u003c/span\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cspan class=\"s1\"\u003eCreate a new folder within \u003cstrong\u003eapps\u003c/strong\u003e called \u003cem\u003eFruit_Jam_Ssspeed_Dating\u003c/em\u003e so that your folder path is \u003cstrong\u003eCIRCUITPY/apps/Fruit_Jam_Ssspeed_Dating/\u003c/strong\u003e.\u003c/span\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cspan class=\"s1\"\u003eCopy all files (including the \u003cstrong\u003elib\u003c/strong\u003e folder) into that location.\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u003c/span\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ch2\u003eCircuitPython Code\u003c/h2\u003e\n\u003cp\u003eThe game logic is split into multiple python files which handle various tasks:\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003ctable\u003e\n\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eModule\u003c/th\u003e\n\u003cth\u003eUse\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003c/tbody\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eboot.py\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDisable auto-reload to improve stability\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecode.py\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMain application entry point, contains control loops\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehardware.py\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInitialize device peripherals and setup audio mixer\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esound.py\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLoad sound files and handle basic playback tasks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egraphics.py\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConfigure display, load graphics assets, handle mouse cursor, and provide display entity classes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eengine.py\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHandle multiple\u0026nbsp;\u003cem\u003eevent\u003c/em\u003e objects, provide interactive entities classes, and connect with player actions\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003escene.py\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eManage gameplay \u003cem\u003escenes\u003c/em\u003e which control the execution and stream of \u003cem\u003eevents\u003c/em\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}},{"element_type":"text","content":"\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n        \u003cp\u003eIf you would like to experiment with aspects of the game engine and controls, a number of scripts are available within \u003ccode\u003e/tests/\u003c/code\u003e (\u003ca href=\"https://github.com/relic-se/Fruit_Jam_Ssspeed_Dating/tree/main/tests\" target=\"_blank\"\u003eview on GitHub\u003c/a\u003e) which run individual components of the system.\u003c/p\u003e\n      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","metadata":{}}]