Back to Outbreak: Soycoon City
SOURCE / PINNED RELEASE

Made of little things.

Outbreak: Soycoon City

Release
db7750b1d009…
Author-recorded commit
3ee3f5fd27a6…
License
LICENSE
Author’s source reference
nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-b87c04571a9

Archive hash verified: dbebdc772b142a1c…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

models/README.md
# Editable character assets

Use `.blend` as the editable source and binary glTF 2.0 (`.glb`) as the game asset.
Both formats are checked in: `models/soybert.blend`, `models/zombie.blend`, and
`src/models/*.glb`. These original low-poly characters were authored in Blender
5.1.1; the native files contain meshes, vertex groups, armatures, editable Actions
and a studio camera/light setup. No proprietary model files or external textures
are needed. Blender's glTF exporter supports meshes, skinning and animation:
https://docs.blender.org/manual/en/4.2/addons/import_export/scene_gltf2.html

Open a `.blend`, select its armature, and choose a named Action in the Action
Editor. Soybert is approximately 1.78 m tall; zombies are 1.90 m. Blender uses Z
up and faces negative Y; export converts to the game's Y-up, positive-Z facing.
Meters match level JSON. Keep object and bone names unique. `HeadMesh` is the
zombie's removable head; `Weapon` carries the shotgun and `Muzzle` is its flash
socket. Preserve those names and the named clips listed in `manifest.json`.
Soybert's arm grips are baked into FK keys, so runtime IK is unnecessary.

After saving artist edits, export without overwriting the native sources:

```sh
blender --background --factory-startup --python-exit-code 1 --python scripts/export-characters.py
pnpm test:polish
pnpm build
```

On macOS the executable can be `/Applications/Blender.app/Contents/MacOS/Blender`.
The export script opens each source in a separate background Blender process,
exports only rigged meshes plus their armature, and refreshes runtime hashes/sizes.
It does not save or regenerate the `.blend`. Commit source, GLB and manifest
together. If adding/removing clips intentionally, update the manifest and actor
state selection together. Do not include the studio camera/lights in the export.

`scripts/build-characters.py` rebuilds the original procedural baseline and
**replaces both native sources**; use it only deliberately. It is not the export
command for artist-edited files. No Blender MCP is connected in
this workspace; these standard native files can also be edited through one later.

The game embeds both GLBs into its single HTML. Its small offline reader supports
triangle meshes, positions/normals/UVs, joints/weights, inverse bind matrices,
material color factors and LINEAR/STEP translation/rotation/scale clips. Use baked
animation and factor-only rough materials. External URLs/buffers, image textures,
Draco, required extensions, shape keys and cubic-spline tracks are deliberately
unsupported. Ordinary Blender/glTF tools can still work with these standard assets;
the reader has no network loader. Geometry/materials are shared between instances;
each actor owns its own cloned skeleton and AnimationMixer.

The source models are flat shaded and render at the game's selected pixel
resolution. Camera cuts retain world orientation. Recoil and upward shooting
animate the weapon and body; reload animates the support arm. Death actions finish
and clamp, and pause freezes the simulation/pose clock.