Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/mbeckham4-hub/Rudi-Foodi/llms.txt

Use this file to discover all available pages before exploring further.

Rudi Foodi is fully open source. Because the entire game is a single HTML file with no build toolchain, the contribution workflow is unusually simple — fork, edit the file, test in browser, open a pull request. There are no dependencies to install, no bundlers to configure, and no CI pipeline to fight. If you can open a file in a text editor and reload a browser tab, you can contribute.

Getting the Code

1

Fork the repository

Head to github.com/mbeckham4-hub/Rudi-Foodi and click Fork to create your own copy of the repo.
2

Clone your fork

git clone https://github.com/YOUR_USERNAME/Rudi-Foodi.git
cd Rudi-Foodi
3

Verify the game works

Open rudi_low_poly_3_d_game 6.html directly in your browser (no server needed). You should see the Rudi Foodi title screen. Click to start and confirm audio initializes and the first level loads.
4

Edit the file

Open rudi_low_poly_3_d_game 6.html in any text editor. The entire game — HTML structure, CSS styles, and JavaScript logic — lives inside this one file.
5

Reload to test

Save your changes, then reload the browser tab. Because there is no build step, your changes are live immediately on every reload.
6

Commit, push, and open a pull request

git add "rudi_low_poly_3_d_game 6.html"
git commit -m "describe your change"
git push origin main
Then open a pull request against the upstream mbeckham4-hub/Rudi-Foodi repository from GitHub.
Because there is no build step, there is nothing to install or compile. The full development loop is: edit the file → reload the browser. No Node, no npm, no bundler, no transpiler.

What to Contribute

Add a new object to the levelThemes[] array with your own color palette and a unique map identifier. You’ll also need a corresponding geometry block inside makeRoom(). See the Adding Levels guide for the full walkthrough.
Add a new entry to the musicThemes[] array. Each entry defines a chords array of frequency triplets (bass, pad1, pad2), a melody array of frequencies, and a speed in milliseconds per beat. The existing 10 entries cycle across 20 levels via modulo, and any new entry you add is picked up automatically.
Power-ups have two parts. First, add an if block for your new type string inside applyPowerUp(type) — this is where the actual effect logic lives (speed, size, clone creation, etc.). Second, add a [color, 'yourtype'] entry to powerTypes[]. The spawnLevel() function already iterates powerTypes[] and calls makePowerUp() for each entry automatically, so the orb will appear on the map with no further changes needed.
Add a new if (theme.map === 'yourmap') block inside makeRoom(level). Use addRoomMesh() to place THREE.BoxGeometry, THREE.CylinderGeometry, THREE.ConeGeometry, and THREE.SphereGeometry objects. All geometry placed through addRoomMesh() automatically receives shadow casting/receiving and is registered in roomObjects[] for cleanup on level transition.
Performance-sensitive areas include the animation loop, clone AI movement, power-up collection checks, and debris particle cleanup. If you spot an O(n²) loop or an uncleared setInterval, fixes are very welcome.
Rudi Foodi has touch joystick controls and camera dragging built in via the Pointer Events API. Improvements to virtual joystick feel, HUD button sizing, or mobile viewport handling are great contributions — test on a real device or browser devtools mobile emulation.

Code Style

The codebase uses plain ES6+ JavaScript with no linter, formatter, or type checker. Follow these conventions when writing new code:
  • Use const for object references that won’t be reassigned, and let for mutable state variables.
  • Instantiate Three.js objects with new THREE.* constructors (e.g. new THREE.BoxGeometry(...), new THREE.Mesh(...)).
  • Define helper functions with function declarations at the top of the <script> block, not as arrow function variables.
  • Do not add external dependencies. Three.js is the only library, and it is loaded from CDN. Keep it that way.

Testing

There is no automated test suite. Before opening a pull request, manually verify the following in at least Chrome and Firefox:
  • The title screen renders and the game starts on click.
  • Audio initializes without errors in the browser console (the Web Audio API requires a user gesture, which the click provides).
  • All five power-up types work: speed stack (blue), big (yellow), small (red), three clones (rainbow/pink), one clone (flashing cyan/blue).
  • Level transitions trigger correctly when the treat goal is reached, and the new level’s geometry, colors, and music all update.
  • The leaderboard saves to localStorage and persists across page reloads.

Build docs developers (and LLMs) love