Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions apps/game/public/assets/PROVENANCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,6 @@ material-slot or `COL_` conventions the generated props use;

| File | Source | Licence |
| ------------------------------ | ----------------------------------------------------------- | ------------------------------- |
| `models/fighter_insurgent.glb` | Synty POLYGON Military — `SK_Chr_Insurgent_Male_01` | Synty Store licence (purchased) |
| `models/fighter_soldier.glb` | Synty POLYGON Military — `SK_Chr_Soldier_Male_01` | Synty Store licence (purchased) |
| `models/veh_armored_car.glb` | Synty POLYGON Military — `SM_Veh_Light_Armored_Car_01` | Synty Store licence (purchased) |
| `models/veh_technical.glb` | Synty POLYGON Military — `SM_Veh_Pickup_Technical_01` | Synty Store licence (purchased) |
| `models/prop_barrel.glb` | Synty POLYGON Military — `SM_Prop_Barrel_01` | Synty Store licence (purchased) |
Expand All @@ -125,6 +123,13 @@ royalty-free commercial use in unlimited titles and permits modification; it
does **not** permit reselling the assets as assets. Not copyright ownership,
which only a work-for-hire commission gives.

The two Synty **characters** are converted by
`tools/art/blender/import_synty.py` but are **not shipped**: neither route to
animating them works yet (docs/HANDOFF-synty.md), and carrying two models
nothing draws cost 1.24 MB of the shell download at every boot. The converters
and the licence record stay; the GLBs are regenerated on demand with
`node tools/art/import-synty.mjs --with-characters`.

Source files are **not** committed — the pack is 406 MB unpacked and lives
outside the repo. Only the converted GLBs and the shared atlases ship.

Expand Down
8 changes: 3 additions & 5 deletions apps/game/public/assets/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"generator": "tools/art/build-assets.mjs",
"blender": "Blender 4.5.12 LTS",
"commit": "8fb62aa99ff07aa4cc32ff0fea2ec71adb09fbb2",
"commit": "89ecfe33b694d24f41f3ec9bd585e7fdb24f68c1",
"license": "Original work, © NIGHTCELL 7. No third-party assets.",
"source": "Generated procedurally from the scripts in tools/art. No asset is downloaded, photographed, traced, or derived from another game.",
"textureSize": 1024,
Expand All @@ -11,8 +11,6 @@
"character.glb",
"container.glb",
"deck.glb",
"fighter_insurgent.glb",
"fighter_soldier.glb",
"hardpoint.glb",
"lamp_mast.glb",
"pipe_rack.glb",
Expand Down Expand Up @@ -94,9 +92,9 @@
"throngva/the-wolf-called-want.mp3"
],
"bytes": {
"models": 4722360,
"models": 3422320,
"textures": 2447388,
"audio": 402789,
"total": 7572537
"total": 6272497
}
}
Binary file not shown.
Binary file removed apps/game/public/assets/models/fighter_soldier.glb
Binary file not shown.
2 changes: 0 additions & 2 deletions apps/game/src/assets.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,6 @@ describe("generated models", () => {
* a generator script.
*/
const LICENSED = new Set([
"fighter_insurgent",
"fighter_soldier",
// Synty POLYGON Military static meshes: licensed, and bound by their own
// atlas slots (`synty_vehicles` / `synty_atlas`) rather than the generated
// material set. Their provenance is the Synty licence in PROVENANCE.md, and
Expand Down
14 changes: 9 additions & 5 deletions apps/game/src/assets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,15 @@ export const MODELS = [
"lamp_mast",
"character",
"carbine",
// Licensed CC0 characters (Quaternius). These carry their own rig,
// animations and materials, so they bypass the material-slot convention the
// generated props follow — see apps/game/public/assets/PROVENANCE.md.
"fighter_insurgent",
"fighter_soldier",
// The licensed Synty characters are deliberately NOT here.
//
// They convert, load and texture correctly, but neither route to animating
// them works yet — retargeting our clips onto Synty's skeleton leaves the
// arms in its T-pose, and skinning the mesh to our rig loses the arms in the
// bind (docs/HANDOFF-synty.md). Listing them anyway cost 1.24 MB of the shell
// download, fetched and parsed at every boot, for two models nothing drew.
// They are regenerated on demand by `tools/art/import-synty.mjs
// --with-characters` when there is something to ship.
// Licensed Synty POLYGON Military static meshes. Vehicles bind the shared
// `synty_vehicles` atlas; props reuse the character atlas (`synty_atlas`),
// since both were authored against Synty's Texture_01_A. No new texture ships
Expand Down
20 changes: 5 additions & 15 deletions apps/game/src/opponents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,22 +138,12 @@ export class Opponents {
// One model per faction.
//
// Nightcell are irregulars: olive drab, boots, a pack — someone fighting
// with what they own. The first attempt used the pack's `Worker`, which is
// a hi-vis construction labourer and read exactly like one. That difference is
// the fastest target ID a player gets, and it is carried by the whole
// silhouette rather than by a colour swatch.
// Back on the generated character for now.
// Both sides use the generated character.
//
// The licensed Quaternius models are committed and load fine, but they
// render as glowing white figures in this scene and three attempts did not
// fix it: scaling albedo to the yard's actual exposure budget (0.42, then
// 0.18), clearing emissive unconditionally, and excluding them from the
// GlowLayer all left them blown out. Something else in their imported
// material setup is driving it and I have not identified what.
//
// The generated character renders correctly, so the bots use it until the
// licensed ones are diagnosed. Swapping back is a one-line change:
// assets.models.get("fighter_soldier") / ("fighter_worker")
// The licensed Synty characters would be a clear upgrade and are not ready:
// see docs/HANDOFF-synty.md for the two attempts and where each stops. They
// are told apart by team colour and weapon instead, which is what
// `brightenCharacter` and `weaponFor` below are for.
const enemyModel = assets.models.get("character");
const friendlyModel = assets.models.get("character");
const character = enemyModel;
Expand Down
20 changes: 10 additions & 10 deletions docs/HANDOFF-synty.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,16 @@ oversight.
The Synty characters are committed, load fine, are textured, and are **not
shipped**, because their animation retarget is broken.

| Thing | State |
| ----------------------------------------------------- | ----------------------------------------------- |
| `models/fighter_insurgent.glb`, `fighter_soldier.glb` | committed, load, textured, animation wrong |
| `textures/synty_atlas.webp` | working, 388 KB, shared by characters + props |
| `tools/art/blender/import_synty.py` | character converter; maths fixed, export broken |
| `tools/art/blender/import_synty_prop.py` | static-mesh converter; **working, shipped** |
| 2 vehicles + 5 props (`veh_*`, `prop_*`) | **integrated** — converted, textured, placed |
| `textures/synty_vehicles.webp` | working, 76 KB, shared by all vehicles |
| 3 weapons (`wep_*`) + `synty_weapons.webp` | **integrated** — player viewmodel and bot hands |
| Shell budget | 7.13 MB against a 9 MB guard |
| Thing | State |
| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| `models/fighter_insurgent.glb`, `fighter_soldier.glb` | **not shipped** — convert and load, animation unsolved; regenerate with `import-synty.mjs --with-characters` |
| `textures/synty_atlas.webp` | working, 388 KB, shared by characters + props |
| `tools/art/blender/import_synty.py` | character converter; maths fixed, export broken |
| `tools/art/blender/import_synty_prop.py` | static-mesh converter; **working, shipped** |
| 2 vehicles + 5 props (`veh_*`, `prop_*`) | **integrated** — converted, textured, placed |
| `textures/synty_vehicles.webp` | working, 76 KB, shared by all vehicles |
| 3 weapons (`wep_*`) + `synty_weapons.webp` | **integrated** — player viewmodel and bot hands |
| Shell budget | 5.98 MB against a 9 MB guard |

Source pack is at `~/src/nightcell7-assets/SourceFiles/` (406 MB, outside the
repo, not committed).
Expand Down
Loading