81 lines
3.3 KiB
Markdown
81 lines
3.3 KiB
Markdown
# Jajce Resource States 05
|
||
|
||
Captured: 2026-07-17
|
||
|
||
## Files
|
||
|
||
- [full resources](jajce_resource_states_05_full.png)
|
||
- [low resources](jajce_resource_states_05_low.png)
|
||
- [depleted resources](jajce_resource_states_05_depleted.png)
|
||
- `world/resource_nodes/ResourceAmountVisual.gd`
|
||
- `world/jajce/HarvestableTreePresentation.tscn`
|
||
- `tests/jajce_resource_presentation_state_test.gd`
|
||
|
||
The three images use the same 1280×720 cross-river camera, daylight value,
|
||
warmup, and Metal renderer. Debug labels are hidden. The lower-left berry patch
|
||
and right-hand harvestable tree are shown at their authored full amounts, at
|
||
40%/50% respectively, and at zero.
|
||
|
||
## Amount-derived visual language
|
||
|
||
`ResourceAmountVisual` finds its owning `ResourceNode` and derives one of three
|
||
tiers from `amount_remaining / initial_amount`:
|
||
|
||
- full keeps all five berry leaf clumps, eight berries, and four tree canopies;
|
||
- low keeps three leaf clumps, four berries, and two tree canopies; and
|
||
- depleted keeps a two-leaf fruitless remnant and replaces the tree with a
|
||
low-poly stump and warm cut face.
|
||
|
||
The threshold is deliberately simple and readable: a positive source at or
|
||
below half amount is low. The berry keeps using two bounded MultiMeshes, so
|
||
thinning changes only `visible_instance_count`; it does not create or destroy
|
||
nodes during play. The tree wrapper reuses the existing wind-reactive standing
|
||
tree and toggles authored crown/stump parts.
|
||
|
||
## Authority and restore proof
|
||
|
||
`ResourceStateRecord` remains the only amount authority. `ResourceNode` now
|
||
emits its existing `amount_changed` presentation signal when authoritative
|
||
state is rebound, including restore. The visual contract listens to that signal
|
||
and also refreshes once after scene readiness, covering either bind order.
|
||
|
||
The focused scenario performs two real player harvests on
|
||
`berry_bush_river_02` and two real NPC gather completions on
|
||
`tree_river_resource_01`, checks the low presentation and NPC wood inventory,
|
||
then fully depletes both through those same production paths. It restores low
|
||
and depleted snapshots in turn and verifies the presentation is reconstructed.
|
||
The resource records contain no visual, visibility, tier, or stump fields.
|
||
|
||
The capture tool's optional amount overrides also construct and bind ordinary
|
||
`ResourceStateRecord`s. They do not directly manipulate visual children, so
|
||
the review images exercise the same runtime contract as gameplay.
|
||
|
||
## Next slice
|
||
|
||
Apply this contract to the existing `tree_forest_grove_01` and
|
||
`tree_forest_grove_02` stable IDs in one bounded forest-edge cluster. Decorative
|
||
canopy and understory should stay presentation-only while the two finite trees
|
||
remain reachable, discoverable, depletable, and restore correctly.
|
||
|
||
## Capture commands
|
||
|
||
```bash
|
||
HOME="$PWD/logs/quality/godot_profile" \
|
||
APPDATA="$PWD/logs/quality/godot_profile" \
|
||
LOCALAPPDATA="$PWD/logs/quality/godot_profile" \
|
||
/Applications/Godot.app/Contents/MacOS/Godot \
|
||
--path "$PWD" --script res://tools/capture_jajce_lookdev.gd -- \
|
||
--scene=res://world/jajce/JajceResourceStateLookdev.tscn \
|
||
--output=res://docs/baselines/jajce_resource_states_05_full.png \
|
||
--hide-resource-labels
|
||
```
|
||
|
||
For the low frame, append:
|
||
|
||
```text
|
||
--resource-amount=berry_bush_river_02:2
|
||
--resource-amount=tree_river_resource_01:4
|
||
```
|
||
|
||
For the depleted frame, use the same arguments with both amounts set to `0`.
|