---
title: "Features"
---

## Compositor-Driven Rendering

Prosperon separates *what to draw* from *how to draw it*. Your game registers sprites, shapes, text, tilemaps, and particles with `film2d`. At render time, the **compositor** queries these drawables, organizes them into planes and layers, applies effects, and produces a command list that the GPU backend executes.

This means:
- **Automatic batching** — sprites sharing a texture and material are drawn together
- **Layer sorting** — explicit ordering, y-sorting, or engine-optimized ordering per layer
- **Effects pipeline** — bloom (threshold + multi-pass blur), masks, custom shader passes
- **Presentation modes** — letterbox, integer scale, or stretch to window
- **Inspectable** — the render plan is plain data you can log and debug

## Duck-Typed Everything

Prosperon's API uses duck typing throughout. If an object has `type: 'sprite'`, a position, and an image, it's a valid sprite. No base classes to inherit from, no interfaces to implement.

This extends to the entire engine: anything that "looks like" a camera can be used as one. Anything with an `on_input` method can be possessed by a player. This makes prototyping extremely fast — you can test ideas with plain objects before committing to any structure.

## Actor-Based Game Logic

Games are written in [Pit](https://crumbpit.org), an actor language where:
- Each **program** (`.ce`) runs as an actor with its own heap
- Actors communicate via **message passing** (`send`, `$receiver`)
- Work is scheduled with `$delay` (one-shot) and `$clock` (periodic)
- Actors spawn children with `$start` and terminate with `$stop`
- **Modules** (`.cm`) return frozen values — shared, immutable APIs

This gives you concurrency without threads, isolation without overhead, and a natural way to structure game systems.

## Multi-Device Input

The input system normalizes keyboard, mouse, gamepad, and touch into **named actions**. A default action map handles common UI actions (up/down/confirm/cancel), and you define game-specific actions on top.

Features:
- **User pairing** — automatically pair devices to players, or explicit assignment
- **Control stacks** — possess entities, push/pop UI layers, block input propagation
- **Emacs-style keybindings** — `C-a` for ctrl+a, `M-x` for alt+x
- **Gesture recognition** — swipe detection on touch devices
- **Device-aware icons** — show the right button prompts for the current input device

## Asset Management

Prosperon finds and loads assets by name. Ask for `"slime"` and it searches the path for `slime.png`, `slime.qoi`, `slime.ase`, etc. Supported formats:

| Category | Formats |
|----------|---------|
| Images | PNG, QOI, GIF, JPG, Aseprite |
| Audio | WAV, FLAC, MP3, QOA |
| Fonts | TTF |

Assets are cached after first load. The virtual filesystem (PhysFS) supports mounting ZIP archives for mods and DLC.

## Audio

Simple audio playback with PCM caching and voice mixing:

```javascript
var audio = use('sound')
var voice = audio.play("explosion.wav")
voice.vol = 0.5
voice.loop = true
voice.stopped = true  // stop it
```

Decodes to a uniform sample rate on load. Multiple voices mix independently.

## Text-Based Everything

Prosperon projects are entirely text:
- Game logic: `.cm` and `.ce` script files
- Config: plain JavaScript objects
- No binary scene files until you ship

This means git diffs are readable, merges are clean, and AI tools can understand your entire project.

## Tiny Footprint

Prosperon is a single executable. No installer, no SDK, no 2GB download. Drop it in your project folder and run. Version it alongside your code. Build on any machine with the same binary.
