A Katamari Damacy-inspired 2D game where you roll up seasonal objects, growing ever larger. Built for the RCade arcade cabinet.
Roll across a procedurally generated island through 10 seasons, collecting objects smaller than you. As you grow, you'll develop gravitational pull that sucks in nearby collectibles. Grow large enough and you'll consume the entire planet!
Features:
- Procedurally generated island with 9 distinct biomes
- 10 seasons of gameplay (Spring → Summer → Fall → Winter, repeated 2.5 times)
- Momentum-based physics with terrain speed modifiers
- Gravitational attraction that increases as you grow
- Special golden effects when collecting rare items
- Spherical terrain distortion at massive sizes
This game is built for RCade, a custom arcade cabinet at The Recurse Center. Learn more about the project at github.com/fcjr/RCade.
Install dependencies:
npm installStart the development server:
npm run devThis launches Vite on port 5173 and connects to the RCade cabinet emulator.
npm run buildThis regenerates the game documentation and builds to dist/.
├── public/ # Static assets (manual.html, etc.)
├── scripts/ # Build scripts (generate-docs.js)
├── src/
│ ├── sketch.js # Main game loop, state management, rendering
│ ├── player.js # Player ball with momentum physics
│ ├── gameObject.js # Collectible/obstacle class with gravity
│ ├── world.js # World class, BiomeMap, terrain distortion
│ ├── biomes.js # 9 biome definitions
│ ├── camera.js # Smooth-follow camera with dynamic zoom
│ ├── noise.js # Seeded simplex noise
│ ├── sprites.js # Emoji sprite rendering
│ └── style.css # Styles
├── index.html # HTML entry
├── vite.config.js # Vite configuration
└── package.json
Imported assets (recommended) - Place in src/ and import them. Vite bundles these with hashed filenames for cache busting:
import spriteUrl from './sprite.png';
let sprite;
p.preload = () => {
sprite = p.loadImage(spriteUrl);
};
p.draw = () => {
p.image(sprite, x, y);
};Static assets - Place in public/ for files copied as-is. Access via root path (/sprite.png).
The template uses p5.js in instance mode:
import p5 from "p5";
const sketch = (p) => {
p.setup = () => {
p.createCanvas(336, 262); // RCade dimensions
};
p.draw = () => {
p.background(26, 26, 46);
p.fill(255);
p.ellipse(p.width / 2, p.height / 2, 50, 50);
};
};
new p5(sketch, document.getElementById("sketch"));This template uses @rcade/plugin-input-classic for arcade input:
import { PLAYER_1, SYSTEM } from '@rcade/plugin-input-classic'
// D-pad
if (PLAYER_1.DPAD.up) { /* ... */ }
if (PLAYER_1.DPAD.down) { /* ... */ }
if (PLAYER_1.DPAD.left) { /* ... */ }
if (PLAYER_1.DPAD.right) { /* ... */ }
// Buttons
if (PLAYER_1.A) { /* ... */ }
if (PLAYER_1.B) { /* ... */ }
// System
if (SYSTEM.ONE_PLAYER) { /* Start game */ }The RCade cabinet uses a 336x262 pixel display. The template is pre-configured with these dimensions.
First, create a new repository on GitHub:
- Go to github.com/new
- Create a new repository (can be public or private)
- Don't initialize it with a README, .gitignore, or license
Then connect your local project and push:
git remote add origin git@github.com:YOUR_USERNAME/YOUR_REPO.git
git push -u origin mainThe included GitHub Actions workflow will automatically deploy to RCade.
Made with <3 at The Recurse Center