Server-authoritative slots+weight inventory, a 9-slot hotbar (keys 1-9),
equipment slots, and a restyleable tabbed menu (functional Inventory +
Character Sheet; Codex/Achievements/Quests scaffolded), built the engine's
way: authored ScreenGui templates + attribute-discovering binders, with a
zero-setup fallback.
- Drag-and-drop is driven by a per-frame cursor poll (immune to the grid
ScrollingFrame that swallows InputChanged) with GUI-inset-corrected drop
hit-testing so releases land on the actual slot.
- Menu key defaults to Tab; the engine frees it by disabling the CoreGui
player roster (ReclaimCoreKeys) and moves the chat to bottom-left so it
clears the top-left HUD (Chat config). Toggle ignores focused TextBoxes.
- Consumables apply onConsume via the stat-effects layer + fire item:use;
gather yields flow into the inventory; pickups auto-pin to the hotbar.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Owner relaxed the asset side of the content-free rule — assets in this repo are
free to use — so the engine now ships its generated HUD icons as defaults instead
of leaving blank slots. Two wins: the HUD is iconed out of the box, and the icons
render in Studio's EDIT view (no Play needed), so you can author/tune the HUD and
see the real thing — or edit it straight from the Explorer.
- StatDefs.luau: each of the 7 stats carries an `icon` default. Putting it here
(not as a per-bar HUD attribute) keeps the admin-panel/config override working —
a per-bar attribute would shadow it. resolveIcon: per-bar attr > config/def.icon
(now the shipped id) > Assets > "".
- assets/hud/SurvivalHud.model.json: bake each bar's child `Icon` ImageLabel
(Image + Visible=true) so it shows in edit mode; the Credits counter (no StatDefs
entry) also gets a per-bar `Icon` attribute to drive its runtime resolution.
- Retire demo/client/HudIcons.client.luau (+ its demo.project.json mount): the
runtime icon-assigning script is now redundant.
- Relax the docs/PR-template "content-free" wording to "design-free": free default
ART may ship (overridable per stat); game-specific DESIGN (items/recipes/lore)
still never ships. Updated design-language, survival-stats, CONTRIBUTING.
- CHANGELOG: record default icons + add the missing admin-plugin entry; note CI
now builds all three Rojo targets.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
`invert` and `dangerHigh` are stat semantics, not owner tuning — but they were in
the SurvivalStatsConfig instance's override map, so a stale/place-saved instance
(carrying the old Invert=true) overrode the corrected engine default and kept
Poison/Hunger/Thirst filling the wrong way. Removed both from STUDIO_ATTR_MAP and
stopped shipping them on the config template, so the engine always owns them and a
stale instance can never freeze a bug across an update. Per-bar `Invert` attribute
remains for a deliberate one-off display flip.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The bar fill now shows the RAW stat value by default, so afflictions
(Hunger/Thirst/Fatigue/Poison) read empty when you're fine and fill UP as they
worsen — fixing Poison showing a full green bar at 0/100. A new `dangerHigh`
flag (true for those four) drives the warning color toward the correct end, so
warnings still fire near danger; `invert` remains an optional depleting-bar look.
Threaded dangerHigh through StatDefs/StatConfig + the SurvivalStatsConfig template.
Adds a bar-less "counter" to the binder (a GuiObject with a `Counter` attribute +
a `Value` label) and a Credits readout in the HUD header bound to a `Credits`
Player attribute (grouped like "1,234"); the demo seeds a sample value.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Wraps the bars in a dark translucent Panel and splits them into a Primary group
(Health, Energy — always shown) and a Collapsible group (the other five) toggled
by a chevron button, wired generically in the binder via name/attribute/tag so the
owner can re-group by drag-and-drop. Each bar gains an optional Value label
(configurable fraction/percent/value/none) and a blank, hidden Icon ImageLabel
(resolved from a per-bar attribute, the stat config, or Assets "StatIcons" — the
engine still ships zero asset ids). Sets IgnoreGuiInset=false so the HUD clears the
Roblox topbar. Adds icon/valueFormat fields through StatDefs/StatConfig + the config
template, and a silent Assets.tryGet for the icon hot path. The fallback HUD matches.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Server tick (src/systems/SurvivalStats) simulates per-stat drain/regen stored as
Player Attributes, which auto-replicate so the client HUD (src/client/Hud) binds
reactively via GetAttributeChangedSignal — no RemoteEvents. Stats are defined in
src/stats/StatDefs and resolved through three layers (defaults < Config.override <
a Studio SurvivalStatsConfig instance) by src/stats/StatConfig, so owners retune
rates with no code.
The HUD is a real, designer-editable ScreenGui in StarterGui, authored as
diff-friendly JSON (assets/hud/SurvivalHud.model.json); bars bind by a `Stat`
attribute + a `Fill` child, so re-texturing needs zero code. It ships for every
distribution: the demo/Rojo source mount it, the drop-in .rbxm bundles it under a
Templates folder and start()/installHud() deploys it, and HudFallback guarantees a
HUD always appears. Adds the engine's first client layer (startClient()).
Allow committing *.rbxmx/model templates (.gitignore) and skip the CI-fetched
globalTypes.d.luau in selene.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>