War charge icons
New War Charge icons (Spear Rush, Blood Rush, Grave Leap) beside their neighbours at 48 and 32 px.
Hero trophy models and new research icons. Newest first.
New War Charge icons (Spear Rush, Blood Rush, Grave Leap) beside their neighbours at 48 and 32 px.
Raptor Claw trophy rework: the claw lies on its side so it no longer reads as a feather bundle.
WAR CHARGE ICONS + RAPTOR CLAW TROPHY FIX - 2026-11-10 (staged only; nothing written to the mirror, E:, F:) JOB 1 - WAR CHARGE RESEARCH ICONS (three) What the game has now: Spear Rush borrows research_flint, Blood Rush research_berserker_rage, Grave Leap research_ghoul_frenzy (war_charge REPORT "ICONS OWED"; DisplayCatalog.Tribe/Orc/Undead.cs, 5th Info argument). How the neighbours are made: 256x256 opaque PNG, no border/frame, painted (image-generator look), one object on a near-black backdrop (RGB ~15-20), usually on a small rock ledge; tiers shown by gold nuggets / purple diamonds. How these were made: composed in Blender's Python (numpy) from the game's OWN painted icon pixels, so the brushwork matches exactly: the faction weapon from its neighbour icon, turned to drive forward/up-right, with a motion smear, speed streaks and a faint glow in the faction colour, dust kicked off the ground ledge. No image service used. local file: research_spear_rush.png Tribe flint spear (from research_flint), teal trail local file: research_blood_rush.png Orc iron axe (from research_orcish_steel), blood-red trail local file: research_grave_leap.png Undead crystal talons (from research_ghoul_frenzy), violet trail 256x256, RGBA (opaque), same as research_flint.png. "Tiers": these are three single-level researches (one per faction), not tiers of one upgrade, so they are told apart by weapon silhouette and trail colour; no nugget/diamond tier marks were added. Checked at 48 px and 32 px (war_charge_icons.jpg, beside six neighbours): weapon + coloured streak still read. Weak point: the Spear Rush spearhead is the same art as Flint Spearheads (turned flat and streaked), and both can show on the Tribe player's screen; it is distinguishable by angle and teal trail, not by a new object. INSTALL (needs a small code change, three lines, plus Primeval > Build UI Art so UiArt.asset lists the new keys): local file: research_spear_rush.png -> local file: research_spear_rush.png local file: research_blood_rush.png -> local file: research_blood_rush.png local file: research_grave_leap.png -> local file: research_grave_leap.png local file: DisplayCatalog.Tribe.cs line 79 (Spear Rush) "research_flint" -> "research_spear_rush" local file: DisplayCatalog.Orc.cs line 125 (Blood Rush) "research_berserker_rage" -> "research_blood_rush" local file: DisplayCatalog.Undead.cs line 115 (Grave Leap) "research_ghoul_frenzy" -> "research_grave_leap" (Change only those three lines; line 89 Flint Spearheads and the Berserker Rage / Ghoul Frenzy lines keep theirs.) Then run Primeval > Build UI Art (UiArtBuilder sets the importer settings and registers the keys). The .meta files will be created by Unity on import. JOB 2 - RAPTOR CLAW TROPHY Problem: the big claw curved UP (rolled ~62 deg), so from the steep game camera it showed as thin strands fanned from a binding, with a long thong and feather: a "feather bundle". Rework (built on the staged model's own builder, trophies_build.py, loaded read-only; same Builder, same cells): - the sickle claw now lies on its side: its whole curve is in the ground plane, 150 deg arc, ~1.0 m along the curve, 0.15 m wide at the root (was 0.09), flattened top-to-bottom; the atlas claw cell gives the ivory root to near-black point (UV run stops at 0.9 so the pale worn point does not grey the tip). - the two toe claws kept but small (0.22 / 0.25 m), sticking out of the binding. - binding smaller; long leather thong removed; teal bead kept beside the binding; one rust feather 18 cm (was 30). - the small rock removed (budget went to the claw). Numbers: 396 triangles (before 408; siblings 244-440). Footprint 0.87 x 0.93 m, height 0.19 m (before 0.98 x 0.72, 0.29 m). Pivot unchanged in kind: origin on the ground (lowest point z -0.008 m), bounds centre within ~0.1 m of the old one. Texture: the same trophies_atlas.png (512, 4x4 cells), NOT changed and not re-delivered; UVs only use the claw, cord, teal-bead and rust-feather cells. One material slot (M_Trophies), node "Body", same FBX export settings as the siblings (axis -Z forward / Y up, bake space transform, FBX_SCALE_ALL, x1.5 SCALE). Re-import check: 396 tris, same bounds. The staged original rebuilt by its own script matched the staged FBX exactly (408 tris, same bounds). INSTALL local file: trophy_raptor_claw.fbx -> local file: trophy_raptor_claw.fbx (replace; keep the existing .meta so the GUID stays) and, for the staged set, the same file can replace local file: trophy_raptor_claw.fbx (move the old one aside first). Then run Primeval > Build hero trophy models (TrophyModelsBuilder.Build) to re-bake Art/Trophies/trophy_raptor_claw.asset. Atlas, material, rig.json: unchanged. FILES local file: *.png, local file: trophy_raptor_claw.fbx, war_charge_icons.jpg, raptor_claw_before_after.jpg scripts (compose_icons.py, imgio.py, icon_sheet.ps1, raptor_claw_v2.py, claw_sheet.ps1), work (renders, stats) Copies of the two jpgs in local file: hero_trophies NOT CHECKED - Nothing opened in Unity or the game: icons not seen on the real command card, the FBX not imported by Unity, TrophyModelsBuilder not run, HeroTrophyModelsTests (which check "the NOTES size") not run - the new size differs from the old NOTES numbers, so that test's expected size for Raptor Claw may need updating. - The glow disc centre: if TrophyRenderer computes it from mesh bounds it follows; not read in detail. - Game-camera views are a Blender stand-in (sun, noise grass, flat snow tint, no glow disc, no grass tufts), not an in-game capture; the snow stand-in is brighter than Rimeheart may be. 1920x1080 assumed. - The UiArtCoverage test with the new keys; the icons at the HUD's real button size (48/32 assumed).
In the test build: the old gold shapes vs the new models on a lavender glow.
HERO TROPHIES INSTALLED (presentation only) - 2026-11-10, local file: PrimevalMirror, nothing committed. RulesRevision stays 121; no net, save or sim change. Trophy rules (drops, 4 min on the ground, effects) untouched. WHAT A PLAYER SEES - Each of the six hero trophies (Rex Tooth, Horn Plate, Raptor Claw, Frill Charm, Spirit Bone, Storm Feather) is now its approved model lying still on the ground where it fell (no float, no bob, no spin), each turned its own fixed way. - Under it a soft lavender disc with a brighter rim, breathing slowly (1.00-1.08 over 2.5 s); a small white-lavender twinkle every 3 s, each trophy on its own beat. In its last 30 s on the ground the disc breathes faster (0.8 s), is a little stronger, and twinkles every second. - Cursor over a trophy (within the existing 1.6 m pickup reach, in sight): a one-line label above it on the HUD glass panel, name in pale lavender, effect in the tooltip cream, e.g. "Frill Charm +20% hero maximum health." (DisplayCatalog text). Works with or without a selection. Right-click pickup with a hero is the same code as before (IssueSmartCommand untouched). - Fog of war: drawn only where the old trophies were (same IsVisible test); the label uses the same test. - Creep loot, ruin loot piles, chests, T-Rex eggs and nests, shrines: exactly as before (their code is unchanged; a kind without a model, or -trophyModels classic, takes the old gold primitive path line for line). HOW THE MODELS ARE LOADED (Build Rigs NOT run; no RigBuilder, ProjectSetup or DetailedUnitBuilder) - Copied the six FBX + trophies_atlas.png from local file: Trophies to a NEW folder Assets/_Primeval/Art/Trophies/ (not Art/Rigs, so a later Build Rigs never sees them; the .rig.json files were not copied). - New editor step Primeval > Build hero trophy models (TrophyModelsBuilder.Build, run in batch with -executeMethod) bakes one mesh per trophy (FBX nodes combined, kept on the ground as modelled) into Art/Trophies/*.asset, makes ONE new URP Lit material Art/Trophies/M_HeroTrophies.mat on the atlas (white, smoothness 0.15, instanced), and writes Resources/TrophyModels.asset (TrophyModelLibrary). TrophyRenderer loads it with Resources.Load. It touches no existing asset. - Import check (log b02_import): tris 374/244/408/368/440/296; sizes match NOTES.txt; Spirit Bone's foot 8 cm under ground under its cairn as the art worker made it; cairn stones bedded 1-2 cm. GLOW COLOUR: lavender (0.72, 0.58, 1.0) additive, over a deeper lavender (0.55, 0.40, 0.95) alpha-blended disc. - The art worker's violet (0.62, 0.45, 1.0) is only 23 CIELAB units from player Blue and 24 from Purple (the palette's own "distinct" bar is 24). Lavender is at least 38.8 from every player colour (classic 15 and colour-blind 8) and far from gold ore, food red, wood brown and iron grey (local file: glow_colour.ps1). - First pass was additive only: on the snow map it vanished (white + lavender = white). The alpha-blended under-disc fixes that: it tints bright ground and only softens on grass. The deeper under-disc colour alone is nearer Purple, but it is a half-transparent ground tint under the additive light, not a flat patch. TINT CHECK: the trophy material is never passed to BiomeLook or TeamPalette (they only touch materials handed to them; no global tint reaches URP Lit). Test proves: plain URP Lit, _BaseColor white, no foliage tag, no frost map, and the renderer draws the library's own material instance. In game: grass (Riverbend) and snow (Rimeheart, the biome BiomeLook tints most) close-ups show identical model colours. FILES CHANGED (changes.diff) Presentation/TrophyRenderer.cs models, glow, twinkle, ModelsEnabled switch; old path kept as fallback Presentation/EffectPools.cs new EffectKind.TrophyGlint (appended last) Presentation/TrophyModelLibrary.cs NEW ScriptableObject Editor/TrophyModelsBuilder.cs NEW import step (only Art/Trophies + Resources/TrophyModels.asset) Client/Hud/TrophyLabel.cs NEW one-line label (cached strings/contents/sizes, no per-frame allocation) Client/SelectionController.cs hover lookup 20x/s + draw call in OnGUI; ShowcaseHoverTrophyId (showcase only) Bootstrap/GameBootstrap.cs -trophyModels classic, -trophyHover N Bootstrap/ShowcaseDirector.cs two hook lines Bootstrap/ShowcaseDirector.Trophies.cs NEW showcase target "trophies" (showcase only): six in two rows + one creep gold loot Tests/EditMode/HeroTrophyModelsTests.cs NEW, 6 tests Assets: Art/Trophies/ (6 fbx, atlas, 6 mesh .asset, M_HeroTrophies.mat, metas), Resources/TrophyModels.asset. CatapultInstallTemp.cs left in place. Settings/material hash check after all editor runs: only the new M_HeroTrophies.mat differs from the start (no ProjectSettings, Quality, Graphics or unit .mat noise). git status was not used (the mirror is a worktree whose git dir is on local file: .git and its LFS filter writes there). TESTS Run with the batch runner local file: unity.ps1 (local file: *.log, *.xml), EditMode, named groups only. t01 (11 groups: HeroTrophyModels, Trophy, GoldOreV3, ResourceProps, PlayerColourPalette, PlayerColourMarker, ClassicPresentationLifetime, ReplayPresentationReset, HeroSlot, UiArtCoverage, ArtPass): 75/75 passed. t02 (10 groups: CreepCamp, RexNest, BugHunt4, ClientLifetimeQuery, ConiferFamily, TropicalTree, EliteCreature, TeamCloth, BuildingDamageLook, SurvivalMode): 65/66. FAIL BugHunt4Tests.TheApplyScriptTakesOnlyTheModelTheEditWasMadeOn ("source identity": the villager model's FBX sha256 differs from the one its edit was made on). Villager art, not touched here; I believe it is the known villager re-review drift, but it is not on the brief's known list, so flagged. t03 after the snow fix: 1 failure in my own new test (exact Color compare off by float rounding) - fixed to a tolerance. t04 final code (HeroTrophyModels, Trophy, ClassicPresentationLifetime, ReplayPresentationReset, GoldOreV3): 43/43 passed. HeroTrophyModelsTests (6): every kind resolves its model, on the ground, at the NOTES size; missing model / no material / no library / -trophyModels classic fall back to the primitive, eggs and loot never take a model; label = catalog name + " " + effect (cached); material plain URP Lit white, no foliage tag/frost, renderer uses the library instance; glow lavender, own copies of SpellGlow / SpellGround (originals stay white); fixed varied yaw. They fail on the old code (no library). Not run this time: the brief's known-failing sets (re-review guards, SavedCombatFixture, PersonHit, BlowsTaken, Wariness/Migration/FreezeScan) - not in the groups I ran. FILMED (test player local file: CatapultTest via CatapultInstallTemp.Build, owner-game gate before every window, own PIDs only) New showcase target "trophies" (+ showcase-only args -trophyHover N and -trophyModels classic for the before shots). Riverbend (grass) and Rimeheart (snow): each trophy close (2.8 m, pitch 42) and the group at the game camera 55 m, before (classic) | after; grass also at the game's start zoom 34 m; hover label at 34 m and 55 m. local file: trophies_in_game_before_after.jpg (copied to local file: hero_trophies), local file: *_close_*.jpg, *_game55_full.jpg, grass_game34_after.jpg, hover_label_34m.jpg, hover_label_55m.jpg; raw frames in local file: showcase_NN.png. WHAT I SAW / WHAT FALLS SHORT - Close up every trophy reads as its object; colours identical on grass and snow (no tint). Nothing sunk or floating. Raptor Claw is the weakest read (it looks like a feather bundle), as the art worker said. - Grass, 55 m: the models are ~15-25 px and do not read on their own; the discs find them clearly. With the under-disc the grass glow is a fairly saturated purple-lavender: findable without shouting, but stronger than "subtle"; easy to tone down (TintAlpha 0.5 in TrophyRenderer) if the owner thinks it is too much. - Snow, 55 m: the weak case. The glow is only a faint pink-lavender halo and pale bone on white snow is low contrast; findable when you look, easy to miss. Additive-only (first pass) was invisible there; not solved further. - The game's grass tufts cover parts of the low models at close zoom (as they cover everything low). - The label sits on the trophy's spot and can overlap the neighbours when trophies lie close together (only in the staged group; drops are normally apart). The "hero selected nearby shows the label" idea from the mock-up was not done: hover only. - Not verified: a real T-Rex drop in a played match (staged entries only), fog edge behaviour on screen (same test as before, not filmed), the last-30-s hurry (coded, not filmed), the twinkle in motion (seen once in a still), colour-blind palette in game (checked by numbers only), desert maps, performance (a handful of DrawMesh calls; no profiling done). - Trophy spawn 1 m out from the carcass (art worker's suggestion) not done: that is a sim change.
The six trophy models: Rex Tooth, Horn Plate, Raptor Claw, Frill Charm, Spirit Bone, Storm Feather.
Mock-up: a trophy on the ground with its glow and name label.
HERO TROPHIES - new models, preview only (2026-11-10). Nothing installed, no game files touched.
WHAT THEY ARE
When certain WILD animals die (not creep-camp guards, not elites unless a Survival boss), TrophySystem.RollDrop may
drop a hero trophy at the death point. It lies there 4 minutes (GroundLifetimeSeconds). A hero picks it up (max 3).
Trophy shrines also spawn one every 6 minutes (65% Storm Feather, 35% Spirit Bone).
Name Effect (DisplayCatalog text) Drops from (chance per kill)
Rex Tooth +15% hero damage. T-Rex 50%, Spinosaurus 50%, Allosaurus 14%; boss Thunderjaw 100%
Horn Plate +2 hero armour. Triceratops 30%, Stegosaurus 55%, Ankylosaurus 49%, Brachiosaurus 40%
Raptor Claw +12% hero attack speed. Raptor 10%, Allosaurus 21%; boss Razorback 100%
Frill Charm +20% hero maximum health. Triceratops 30%, Parasaurolophus 25%, Protoceratops 25%, Pachycephalosaurus 25%
Spirit Bone +1 hero health every 2 seconds. Mythic. T-Rex 50%, Spinosaurus 50%, Brachiosaurus 60%, Ankylosaurus 16%, Quetzalcoatlus 12%; shrines 35%
Storm Feather +1 m aura radius and -10% active cooldowns. Pteranodon 20%, Quetzalcoatlus 28%; shrines 65%
(Chances worked out from RollDrop's nested rolls, e.g. Triceratops: 60% drop x 50% each kind = 30%.)
TODAY: TrophyRenderer.Shape draws one primitive in M_Debug_GoldOre gold (0.95,0.75,0.2), floating with a bob at
0.22-0.38 m, over a 0.8 m white additive SpellGlow disc. Rex Tooth = upside-down cone (its point goes 0.35 m under the
ground), Frill Charm = a 6-sided disc standing on edge, Spirit Bone = egg-shaped ball, Storm Feather = thin tilted box.
NEW MODELS (1.5x life size, origin on the ground at the centre, Z/Y up handled by export)
Rex Tooth huge curved serrated tooth, root bound in red leather, resting on a 3-stone cairn, red necklace cord + bead.
1.04 x 0.42 m, 0.20 m high, 374 tris.
Horn Plate cracked bony plate with a brow horn rising out of it, two leather armour straps.
0.88 x 0.51 m, 0.51 m high, 244 tris.
Raptor Claw three sickle claws (ivory base, black points) fanned from a cord binding; leather thong to a red feather.
0.98 x 0.72 m, 0.29 m high, 408 tris.
Frill Charm knobbed piece of horned frill bone (red-ochre painted edge, teal tribe chevron) with a notch; braided cord
through the notch, a teal bead, a rust and a cream feather. Frill 0.8 m; with cord 1.42 x 0.85 m, 0.17 m high, 368 tris.
Spirit Bone great limb bone painted with pale-blue spirit spirals, planted slanting in a 6-stone cairn, cord wrap,
hanging bead and feather. 0.93 x 0.44 m, 0.88 m high, 440 tris (base sinks 8 cm into the cairn, on purpose).
Storm Feather storm-torn slate-blue plume with a white lightning zig-zag and rust tip, a cream feather beside it,
quills bound in red cord with a bead, resting on a small stone. 1.31 x 0.45 m, 0.18 m high, 296 tris.
All six share one 512x512 hand-painted atlas (16 cells: bone, plate bone, tooth, horn, claw, leather, cord, red cord,
3 feathers, 2 beads, stone, spirit glyph bone, frill). No photo textures.
Gold/wood/food/iron/chest loot already use Blender models (Art/Rigs/loot_*.fbx); not redone.
READABILITY (what the sheet shows)
- 15 m (closest zoom): each reads as its object; Frill Charm, Rex Tooth, Spirit Bone and Storm Feather clearest;
Raptor Claw is the weakest (dark points read, the fan less so).
- 55 m (default zoom): every model is only ~15-25 px and does NOT read on its own. The violet glow is what
finds it there. So the glow is needed, not optional.
FILES
local file: Trophies trophy_<name>.fbx + .rig.json (one "Body" part, like loot_gold) + trophies_atlas.png
local file: trophies_build.py (Blender, builds everything) + compose.ps1 (sheets)
local file: hero_trophies_work.blend, renders, stats.json
GAME SIDE (later job; short)
1. Copy local file: Trophies to Assets/_Primeval/Art/Rigs/Trophies/ and run Primeval > Build Rigs. RigBuilder gives a
folder with exactly one *_atlas.png one shared URP Lit material (SharedAtlasMaterial). FBX export settings match
primeval_models.py (-Z forward, Y up, baked transform).
2. TrophyRenderer.cs: like LootKeys, look up rigs "trophy_rex_tooth" ... "trophy_storm_feather" (the same keys as the
icons in DisplayCatalog.Trophy). When a rig is found, draw it at (x, 0, z), yaw = Id*37 deg, scale 1, no bob,
instead of Shape(); keep Shape() as the fallback.
3. Glow: replace the white 0.8 m disc with a flat violet disc (about (0.62,0.45,1.0), additive, soft edge, brighter rim),
radius about 0.6 x the model's longest side (0.55-0.95 m), breathing 1.00-1.08 over 2.5 s. Sparkle: EffectPools burst
every 3 s (small, white-violet). Blink faster in the last 30 s.
4. Hover label: one line, "<Name> <Effect>" from DisplayCatalog.Trophy (list in the mock-up), shown on hover or when a
hero is selected nearby. SelectionController.TryFindTrophy already finds the trophy under the cursor (1.6 m).
5. Suggest: spawn the trophy ~1 m out from the death point, so it is not hidden under the carcass.
UNSURE
- SharedAtlasMaterial marks the right three quarters of an atlas as "foliage" for BiomeLook recolouring. If BiomeLook
touches every atlas material, trophies could get tinted per biome; check, or give them a TexturedMaterial instead
(rename the atlas to <key>_albedo.png per model).
- Violet may clash with a violet/purple player colour among the 15 team colours. The glow is on the ground, team colours
are on units, but worth a look.
- Spirit Bone's ends look a bit like a trumpet/mushroom from close up; a two-knob end would read more like a bone.
- 1.5x life size is my choice; the Frill Charm's cord and feathers make it 1.4 m long. Shrink the cord if too big.
- Spirit glyphs are only painted; a small emission mask would make "Mythic" glow (not made).
- Not seen in Unity: shading, import, scale and the glow are only checked in Blender renders.