The subdomain proxies to the same folder, but the build had the path /feuerwerk/ baked in. On feuerwerk.nockal.com the page loaded its assets, the API and the data URLs from /feuerwerk/... and got 404. The session cookie had Path=/feuerwerk/, so the browser would never have sent it to /api/ there either. - site.ts takes the base path from the folder of the open page: /feuerwerk/ on nockal.com, / on the subdomain. Release links point at the address you are working on. - vite.config.ts builds with a relative base. The copy plugin rewrites the pages to ./dist/assets/ and stops the build if it finds nothing to rewrite. The dev server now runs at http://localhost:5175/. - Auth.php sets the cookie without a Path, so it belongs to the API folder the browser sees. Sign-in and sign-out also clear the old /feuerwerk/ cookie, otherwise it would keep signing in after a logout. Existing sessions stay valid. - README: the new dev server address. Tests: - curl on both addresses: pages, JS, CSS and API 200 - sign-in, session, sign-out on both addresses - e2e 70 against both addresses: 13/13 each, no CSP violation - tsc, lint, prettier clean, site and releases tests 14/14 - PHP tests 7 of 8 files green, videos.test.php fails only because the web-php-fpm container has no ffmpeg Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
102 lines
7.8 KiB
Markdown
102 lines
7.8 KiB
Markdown
# Feuerwerk
|
|
|
|
[](https://git.nockal.com/meleki/feuerwerk/actions?workflow=ci.yml)
|
|
|
|
A browser-based tool "one step before a game engine": create **assets** (scenes, cameras,
|
|
sprites), place them into scenes, tweak their properties in an inspector and press **Play**,
|
|
all in one program, all drawn inside a single WebGL canvas.
|
|
|
|

|
|
|
|
Live: <https://nockal.com/feuerwerk/> · Widget playground: <https://nockal.com/feuerwerk/?playground>
|
|
|
|
**The documentation is the wiki:** <https://git.nockal.com/meleki/feuerwerk/wiki>: every concept,
|
|
node, tab and shortcut, plus the architecture and the development workflow. This file is the short
|
|
way in.
|
|
|
|
## In one screen
|
|
|
|
- An **asset** is a named, typed thing (scene, camera, sprite, text, behavior, variables, struct,
|
|
collider, rigidbody, joint, container, clip area, texture, vector art, pixel art, palette,
|
|
animation, curve, tile, tilemap, state machine, shader, shader function, font, sound, sound FX,
|
|
instrument, pattern, song, bus, video, composition, particles) with properties and no position.
|
|
- A **scene object** places an asset: position, sparse **overrides** of its properties, an optional
|
|
parent. Only what differs from the asset is stored; the inspector paints it gold and offers ↺ / ↑.
|
|
- A **container** is a reusable group edited once and placed many times; its content is resolved
|
|
from the template on every read. A **screen** is a container switched on and off.
|
|
- A **behavior** is logic as a node graph, placed like anything else and parented to the object it
|
|
acts on. Play has no built-in behaviour: everything that happens is a graph.
|
|
- An **account** owns projects: the editor asks for a user name and a password first, and each
|
|
account sees only its own projects. The Account menu at the far right of the toolbar changes
|
|
the password and signs out.
|
|
- **Play** runs a throwaway copy of the project; every panel stays usable and Stop brings back
|
|
exactly what was saved. **Release…** shares a link that plays the saved game on its own, without
|
|
the editor and without signing in.
|
|
|
|
## Quick start
|
|
|
|
Node 22 is required.
|
|
|
|
```bash
|
|
npm install
|
|
npm run dev # http://localhost:5175/; API and data calls are proxied to production
|
|
npm run check # typecheck + lint + format:check + unit tests; the gate CI runs too
|
|
npm run build # writes dist/ and regenerates index.html; the folder is what nginx serves
|
|
```
|
|
|
|
The browser suite and the three example games need a machine with a GPU:
|
|
|
|
```bash
|
|
node tools/seed-e2e.mjs && node tools/e2e.mjs # the editor, 2090 checks (GM_STEPS=20 for one step)
|
|
# every tool signs in first; see the Accounts page
|
|
node tools/seed-jumprun.mjs && node tools/smoke-jumprun.mjs
|
|
node tools/seed-tetris.mjs && node tools/smoke-tetris.mjs
|
|
node tools/seed-actor.mjs && node tools/smoke-actor.mjs
|
|
```
|
|
|
|
Every push runs all of it on the Gitea runners: the gate as one job, build and suite as another
|
|
beside it. So locally take the gate plus the step your change touches and leave the full run to
|
|
CI. Details, the GPU requirement and the detached runner are in
|
|
[Development](https://git.nockal.com/meleki/feuerwerk/wiki/Development).
|
|
|
|
## Documentation
|
|
|
|
| Page | What it covers |
|
|
|---|---|
|
|
| [Concepts](https://git.nockal.com/meleki/feuerwerk/wiki/Concepts) | Assets, scene objects, overrides, play mode, the camera, the console |
|
|
| [Accounts](https://git.nockal.com/meleki/feuerwerk/wiki/Accounts) | Signing in and out, the accounts, who a project belongs to, what the check tools need |
|
|
| [Scenes](https://git.nockal.com/meleki/feuerwerk/wiki/Scenes) | The edited scene, the start scene, and switching scenes from a graph |
|
|
| [Scene editing](https://git.nockal.com/meleki/feuerwerk/wiki/Scene-editing) | Placing, z-order, hierarchy, the editor offset |
|
|
| [Behaviors](https://git.nockal.com/meleki/feuerwerk/wiki/Behaviors) | Node graphs: variables, the node set, structs and lists, loops, nesting, editing |
|
|
| [Structs](https://git.nockal.com/meleki/feuerwerk/wiki/Structs) | Struct assets: a named shape that struct variables, fields and `Pack`/`Expand` follow |
|
|
| [Colliders](https://git.nockal.com/meleki/feuerwerk/wiki/Colliders) | Shapes (box, circle, capsule, polygon), collision events, blocking movement, one-way colliders and raycasts |
|
|
| [Physics](https://git.nockal.com/meleki/feuerwerk/wiki/Physics) | Rigidbodies, the collider material, gravity, the fixed step, joints |
|
|
| [Textures](https://git.nockal.com/meleki/feuerwerk/wiki/Textures) | Images, frames, nine-slice, the filter, upload limits |
|
|
| [Vector art](https://git.nockal.com/meleki/feuerwerk/wiki/Vector-Art) | Pictures drawn from shapes: the pen, curves, gradients and texture fills, combining shapes |
|
|
| [Pixel art](https://git.nockal.com/meleki/feuerwerk/wiki/Pixel-Art) | Pictures painted pixel by pixel: the palette, the tools, layers and frames |
|
|
| [Fonts](https://git.nockal.com/meleki/feuerwerk/wiki/Fonts) | Font assets, the picker, what a text falls back to |
|
|
| [Sounds](https://git.nockal.com/meleki/feuerwerk/wiki/Sounds) | Sound assets and clips, `Play sound`, buses and the Master routing, sound FX |
|
|
| [Instruments](https://git.nockal.com/meleki/feuerwerk/wiki/Instruments) | Instruments as node graphs, Chips and presets, the keys of the Instrument tab, `Play note` |
|
|
| [Patterns](https://git.nockal.com/meleki/feuerwerk/wiki/Patterns) | Patterns and the piano roll, playing one in a loop or from a game |
|
|
| [Songs](https://git.nockal.com/meleki/feuerwerk/wiki/Songs) | Songs, their tracks and items, routing, recording, playing one from a game |
|
|
| [Videos](https://git.nockal.com/meleki/feuerwerk/wiki/Videos) | Video assets and clips, wearing one on a sprite, recording the game view or the editor |
|
|
| [Animations](https://git.nockal.com/meleki/feuerwerk/wiki/Animations) | Animation assets and the Animation tab |
|
|
| [Curves](https://git.nockal.com/meleki/feuerwerk/wiki/Curves) | Easings drawn by hand, the Curve tab, using one on a key or a `Lerp` |
|
|
| [Shaders](https://git.nockal.com/meleki/feuerwerk/wiki/Shaders) | Shader graphs that sprites, texts, particle fields and cameras wear, their node set, passes, shader functions |
|
|
| [Particles](https://git.nockal.com/meleki/feuerwerk/wiki/Particles) | Particle graphs: a particle as a function of its age |
|
|
| [State machines](https://git.nockal.com/meleki/feuerwerk/wiki/State-machines) | The asset, named transitions, `State branch`, `Set state` and `State transition` |
|
|
| [Containers](https://git.nockal.com/meleki/feuerwerk/wiki/Containers) | Templates, instances, screens |
|
|
| [Compositions](https://git.nockal.com/meleki/feuerwerk/wiki/Compositions) | Objects, videos and sounds laid out in time, the Composition tab, playing one in a game |
|
|
| [Tiles](https://git.nockal.com/meleki/feuerwerk/wiki/Tiles) | The tile asset, plain tiles and the two autotile kinds, the pictures as animation steps, the Tile tab |
|
|
| [Tilemaps](https://git.nockal.com/meleki/feuerwerk/wiki/Tilemaps) | The tilemap asset, painting in the scene view, layers, what it looks like in the game |
|
|
| [Plugins](https://git.nockal.com/meleki/feuerwerk/wiki/Plugins) | Extending the editor: the plugin file, how it is loaded, switching one on and off, API v1 |
|
|
| [Keyboard](https://git.nockal.com/meleki/feuerwerk/wiki/Keyboard) | Every shortcut |
|
|
| [Architecture](https://git.nockal.com/meleki/feuerwerk/wiki/Architecture) | Stack, source layout, the rules that keep it organised |
|
|
| [Development](https://git.nockal.com/meleki/feuerwerk/wiki/Development) | Commands, the e2e suite, the example games, CI |
|
|
| [API](https://git.nockal.com/meleki/feuerwerk/wiki/API) | The PHP JSON API and the project document |
|
|
|
|
## Ideas, gaps and bugs
|
|
|
|
They live in the issue tracker: <https://git.nockal.com/meleki/feuerwerk/issues>. What is not
|
|
there yet is listed on the wiki's [Home](https://git.nockal.com/meleki/feuerwerk/wiki) page.
|