Skip to content

joyrider3774/crisp-game-lib-portable-fruitjam

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Adafruit's fruitjam Version of crisp-game-lib-portable

DownloadCountTotal DownloadCountLatest LatestVersion License

This is a repo containing the adafruit's fruitjam port of the crisp games library which is a Minimal C-lang library for creating classic arcade-like mini-games running on devices and browsers. Re-implemented version of crisp-game-lib for smaller devices. You can play sample games in your browser.

Fruitjam Controls:

  • Button 1: A Button / move purple mouse cursor left in mouse games
  • Button 2: Return to game selection menu
  • Button 3: B Button / move purple mouse cursor right in mouse games

Keyboard Controls:

  • X or space: A Button
  • C: B Button
  • ESC: Return to game Selection menu
  • F1: Lower volume
  • F2: Increase volume
  • Arrow keys: control (purple) mouse cursor in mouse games or act as A Button in other games

Mouse

  • Movement: Move (Purple mouse cursor in mouse games
  • Left Button: A Button
  • Right Button: B Button / Return to game Selection menu

Adafruit's snes gamepad controls:

  • A: A Button
  • B: B Button / Return to game Selection menu
  • Left Shoulder: Lower volume
  • Right Shoulder: Increase volume
  • D-Pad: control (purple) mouse cursor in mouse games or act as A Button in other games

Libraries / tools used or required

  • Arduino IDE: for compiling
  • Adafruit_dvhstx: for video output
  • Adafruit_TinyUSB: for usbhost mode for keyboard, joypad and mouse input
  • Adafruit_TLV320DAC3100: for I2S sound output
  • PICO PIO USB: for usbhost stuff

Credits

  • Crisp games library portable and it's games are made by user abagames
  • This fruitjam port by joyrider3774
  • Extra games ported by joyrider3774, from SDL port
  • I2sTones.cpp: I2S tones library mainly made with the help of claude.ai
  • glcdfont.h: Adafruit_GFX font mainly used internally to display debug information on an internal buffer

Notes

  • There are 20 volume levels, the default is set to a low value (being 3) out of safety just in case people use headphones immediatly. you can change the default on this line if you want higher volume
  • Adafruit snes gamepad input controls should work now, a bug preventing it from working has been fixed and it has been tested by Lord Rybec from adafruit discord, Thanks for that and providing helpfull debug information
  • Please use arduino-pico 5.5.0 or newer board setup, it seems to have fixed usbhost disconnects

ORIGINAL README.MD


Target devices

Sample game codes and reference

How to write your own game

  1. Copy game_Template.c to game[your game name].c

  2. Comment out other games in menuGameList.c and add void addGame[your game name](); and addGame[your game name]()

    ...(snip)...
    void addGameReflector();
    void addGame[your game name]();
    
    void addGames() {
      /*addGameThunder();
      ...(snip)...
      addGameReflector();*/
      addGame[your game name]();
    }
    
  3. Write your own game in game[your game name].c and rename void addGame_Template() { to void addGame[your game name]() {

  4. Build for browser and debug

  5. Once the game is complete, revert other games that were commented out in menuGameList.c and build it for other devices

Build for [target device]

M5StickCPlus, M5Stack, PyBadge

  1. Install LovyanGFX library

  2. Create cglp[target device]/ directory (e.g. cglpM5StickCPlus/)

  3. Copy cglp[target device].ino, ./src/lib/* and ./src/games/* files to the directory

  4. Verify and upload cglp[target device].ino with Arduino IDE

Playdate

  1. Copy ./src/cglpPlaydate directory

  2. Create cglpPlaydate/build directory

  3. Move to cglpPlaydate/build directory and cmake ..

  4. Open crisp-game-lib-portable.sln with Visual Studio

  5. Build the solution (see Building for the Simulator using Visual Studio)

  6. See also Building for the Playdate using NMake

Arduboy

Note: Some features are limited due to device resource limitations.

ESP32-2432S028R

ESPboy

Funkey or RG-Nano

Any Device supporting SDL1, SDL2 or SDL3

  1. (Cross)compile using provided Makefile by running make -f ./src/cglpSDL2/Makefile or make -f ./src/cglpSDL1/Makefile in rootfolder of this repo or use the CMake with the provided src/cglpSDL2/CMakelists or src/cglpSDL3/CMakelists file

  2. Checkout binary --help for information on commandline parameters

  • SDL2 & 3 port supports game controllers SDL1 port only keyboard

  • ported by Joyrider3774

Browser

  1. Install Emscripten

  2. Run dev npm script to start the dev server and watch js files

  3. Run dev_c npm script to watch c files and build wasm files

How to operate

Back to the game selection menu

  • Hold down the A button and press the B button (M5StickCPlus, M5Stack)
  • Press the SELECT button (PyBadge)
  • Press A, B, Up and Right buttons simultaneously (Playdate)
  • Press the X key while holding down the up and down arrow keys (Browser)
  • Press ESC on SDL Ports

Toggle sound on/off

  • Press the B button (M5StickCPlus)
  • Press the C Button (M5Stack)
  • Press the START button (PyBadge)
  • Press the Z key while holding down the up and down arrow keys (Browser)

Key assignment on SDL Ports

  • (A) X key, (B) C key, (left/right/up/down) arrow keys

Key assignment on browser

  • (A) X key, (B) Z key, (left/right/up/down) arrow keys

How to port the library to other devices

The source codes for library and games are written device-independent. Besides, you need to implement device-dependent code for the following functions:

  • Device initialization function (e.g. setup() in Arduino) that calls initGame()

  • Frame update function (e.g. loop() in Arduino) that calls setButtonState() and updateFrame()

    • The state of the button press must be notified to the library with the setButtonState()
  • Drawing and audio processing functions that are defined in machineDependent.h

    • md_getAudioTime() function should return the audio timer value in seconds
    • md_playTone(float freq, float duration, float when) function should play a tone with freq frequency, duration length (in seconds) and staring from when seconds on the audio timer
    • md_drawCharacter(unsigned char grid[CHARACTER_HEIGHT][CHARACTER_WIDTH][3], float x, float y, int hash) function should draw the pixel art defined by grid[y][x][r, g, b] at position (x, y). Since hash will be the same for the same pixel art, you can cache pixel art images using hash as an index and avoid redrawing the same image

Sample device-dependent codes are cglpM5StickCPlus.ino and cglpPyBadge.ino.

Porting games from crisp-game-lib using an AI chatbot

You can use an AI chatbot to port game source code for crisp-game-lib to crisp-game-lib-portable. By providing the prompt and set of files to the chatbot, you can obtain the code ported to the C language. I have tried this using Claude 3 Opus, but it is expected to work to some extent with other LLMs as well. The ported code is not perfect, so it needs to be manually checked and corrected.