Wire the demo video (makertube uSGJ2MHEFjSSKxMiJBJ6Y5) into quests.md,
achievements.md, content-authoring.md and admin-plugin.md, and feature it in
the landing page's video grid (replacing the oldest embed; that video stays
linked from docs/inventory.md).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Promote CHANGELOG Unreleased → 0.6.0 and bump wally.toml. (SurvivorCore.VERSION
is already 0.6.0 in src/init.luau.)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Quests (#10): a Quests registry + server runtime — objectives (gather/craft/
kill/use × count, blank target = any) and rewards, autoStart + requires chains
(completing a prerequisite auto-starts dependents), optional turn-in at a
tagged QuestGiver (component + prompt). Rewards are never lost: a full
inventory parks the quest as ready and the grant retries on inventory change.
Quests menu tab (L) with per-objective progress bars; QuestLog JSON attribute
replicates state; quest:started/progress/completed/blocked via Hooks + bus.
Achievements: an always-on runtime for the existing registry, ported
architecturally from TCE. A shared Progression layer translates bus events
into auto-derived counters (gathers_reed, crafts_total, kills_husk, …) so a
def is just { key, name, counter, threshold } — flat in code and no-code.
Unlock-once + toast + Achievements tab (J) with progress bars.
Toasts: themed top-right notification queue (Notify remote + Toasts.show).
No-code: admin plugin gains Quests (single-objective + "+ Quest giver" drop)
and Achievements (counter/threshold) editors; the engine loads both from
SurvivorCoreContent. Demo: a 3-quest chain + 4 achievements + a giver post.
Fixed: registerPanel now ADOPTS a template-scaffolded tab (hides the
placeholder, builds into the authored frame) instead of silently no-opping —
this replaces the Quests/Achievements "coming soon" placeholders.
EventBridge parity: gather:*, craft:* and item:use now also cross the bus.
Changed: rojo 7.6.1 → 7.7.0 (rokit pin; CI follows; gate verified).
Docs: quests.md + achievements.md (new), content-authoring/admin-plugin/
extending/README updated, CHANGELOG Unreleased, site feature card.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- "See it in action": wire in the in-game UI screenshot (HUD + tabbed menu +
hotbar), AI-relit with an atmospheric dusk backdrop so it suits the dark page.
- Fix the Get Started "Boot it" panel overflowing the viewport — the grid items
now `min-width: 0` so the code block scrolls internally instead of pushing wide.
- Add a GitHub Sponsors link (nav button + footer).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A static landing page (site/) deployed to GitHub Pages via Actions:
- AI-generated brand: the survival-shield logo (favicon → 1024 + .ico) and an
atmospheric campfire hero, on the docs/design-language palette.
- Sections: hero, value props, feature grid (stats, inventory/crafting, gathering,
combat, mobs & AI, no-code admin), an "in action" showcase with the demo videos,
and a get-started/install panel. Dark translucent theme, responsive, self-contained.
- README refreshed to v0.5.0 with the full feature set, badges, and the site link.
The "See it in action" screenshot (site/assets/img/ui-showcase.png) drops in next.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Promote CHANGELOG Unreleased → 0.5.0 and bump wally.toml. (SurvivorCore.VERSION
is already 0.5.0 in src/init.luau.)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Mob & AI engine (#17): a `Mob` component + a `Mobs` FSM runtime
(idle/wander/chase/attack/flee/leash/death), faction-driven profiles
(hostile/passive/neutral), Humanoid-based mobs so combat/health/death share one
path, per-mob-type reactions, and a `Mobs` Config section.
Combat (#12, #14): server-authoritative melee + ranged reusing the v0.4.0 swing
pipeline; the `combat:hit`/`combat:kill` kill-event schema designed once. Bows use
a TCE-style aim (hold RMB to aim with an over-the-shoulder camera + crosshair and
charge ring, hold LMB to draw, release to fire); the server simulates the gravity
arc and sends the path so the client flies a cosmetic arrow along the real curve.
Arrows are their own configurable ammo item (weight/damage/curve/range/speed).
No-code: admin plugin gains Mob, Weapon and Arrow editors (+ "Add to World" /
"Tool model" drops); the engine loads Weapons/Arrows/Mobs from SurvivorCoreContent.
Fix: scope the orphan hotbar-pin sweep to the removed/consumed item, so consuming
one item never clears an unrelated hotbar-pinned weapon.
Docs: combat.md + mobs.md (with demo video); CHANGELOG Unreleased entry.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Closes the gather → craft loop and lays the no-code content layer.
- Tool-swing harvesting (#1): equip a hotbar tool (a real Tool via the new
ToolEquip bridge), click a node, server-validated hit (range / line-of-sight
/ equipped tool / cooldown) granting a per-hit random yield, blocking the hit
when the inventory is full. Bare-hand hold-E kept. The engine's first
client-input → RemoteEvent → server-validation pipeline (combat reuses it).
A floating HP bar shows a node's remaining hits.
- Hand crafting (#4): server-authoritative consume → produce with a
complexity-scaled craft channel + a progress bar above the crafter; a
Crafting tab lists hand recipes and gates each on what you carry.
- No-code content (#11, Builder first slice): a Resources registry + a
content-from-instances loader (Registry.loadFromFolder reads a
SurvivorCoreContent folder at start), Gatherable binds to a named Resource,
and a per-resource-type reaction API (reed sways, tree fells + leaves a
stump). The admin plugin becomes one widget with Stats + Content tabs to
create/edit items + gatherables, including "Add to World".
New hooks: gather:blocked, craft:start / craft:end / craft:blocked. Docs +
CHANGELOG. Engine stays content-free; the demo supplies the sample content.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Both the authored template and the built-in fallback name their ScreenGui
"SurvivalHud", and the fallback fires on a 1s timer if no bars have bound
yet. The dedupe ran only once at startup, so a fallback that raced the
template (more likely now startClient does more before the template copies
in) left two HUDs on screen — a restart usually shuffled the timing enough
to hide it, until it didn't.
Tag the fallback, make the dedupe continuous (re-runs whenever another HUD
appears) and always prefer the authored HUD, and don't build the fallback
when a HUD ScreenGui already exists. Also link the inventory/hotbar demo
video in docs/inventory.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>
Promote the Unreleased #20 fix to 0.2.1 and bump SurvivorCore.VERSION + wally.toml.
Promotes WITHOUT re-adding an empty `## Unreleased` section, so the released
changelog on `main` doesn't carry a confusing dangling heading (a fresh
`## Unreleased` reappears when the next change adds an entry).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A stat's value lives on the player under its `attribute` (which defaults to the
name but a game can override via Config.override("SurvivalStats", {Stat={attribute=...}})).
The client read the stat NAME instead, so any custom attribute override silently
froze the bar. Fixed in all three spots that hardcoded the name:
- src/client/Hud.luau — the bar binder now resolves def.attribute and reads +
listens on it (was GetAttribute(statName) / GetAttributeChangedSignal(statName)).
- src/systems/SurvivalConsequences.luau — the Health<->Humanoid sync writes the
resolved Health attribute (was hardcoded "Health").
- src/client/MovementFeedback.luau — the energy vignette/breathing reads the
resolved Energy attribute (was hardcoded "Energy").
Default behaviour (attribute = name) is unchanged. Verified in Studio: with
Health.attribute="HP" / Energy.attribute="EP", resolve() yields HP/EP and the
fixed code reads/writes there; un-overridden stats still default to the name.
Gate green.
Closes#20
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Promote the Unreleased survival-stats + HUD milestone to 0.2.0 (start a fresh
Unreleased section) and bump SurvivorCore.VERSION + wally.toml to 0.2.0.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Blood reaching 0 now kills INSTANTLY (humanoid.Health = 0), not a per-second
drain. Removed the BledOut drain rate from the Consequences config.
- Add the HUD/stats/plugin demo video to the survival-stats + admin-plugin docs.
Gate green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Tuning + fixes from playtest feedback:
- Poison drains health ONLY at 100% (was scaled from any level) — no more health
ticking down from leftover/partial poison.
- Hide Roblox's built-in top-right health GUI (CoreGuiType.Health); the engine ships
its own Health bar. (Retries a few frames since CoreGui can refuse it at session start.)
- Realistic default drift (all in config): Hunger/Thirst ~8h to max, Fatigue ~24h.
Starving/dehydrated each take ~8h to kill (stack → ~4h when both). Default bleed/poison
SOURCE rates ~1h (Consequences.Affliction) for real gameplay.
- Poison-at-max health drain 1.0/s and bled-out 3.0/s kept as sensible defaults (tunable).
Demo test station uses EXAGGERATED bleed/poison rates (visible in seconds) and gains
STARVE/DEHYDRATE cubes (jump the need to max) so the slow real-world consequences are
testable without waiting hours.
Gate green (stylua/selene/luau-lsp/build).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Mirrors Movement's per-character connection hygiene (store HealthChanged/Died and
disconnect on re-setup + player leave). Defensive/consistency only — Roblox already
auto-disconnects on character destroy, so no behaviour change. Follow-up from the
consequence-system adversarial review (which confirmed no real bugs).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Make the survival stats matter, end to end (server-authoritative, tunable via the
new "Consequences" Config section):
- Starving (Hunger maxed) and dehydrated (Thirst maxed) drain health.
- Poison drains health scaled by its level (full rate at 100%).
- Blood at 0 → bleed out → death (fast health drain).
- Drains STACK and reduce the character's real Humanoid health, so death + Roblox
respawn happen for free.
- Energy stops regenerating while starving, dehydrated, or fully fatigued — overriding
the post-sprint regen, so a depleted player stays depleted until they fix the cause.
Supporting engine work:
- SurvivalConsequences system: the drain tick + keeps the "Health" stat attribute in
lockstep with the Humanoid (HUD Health bar now reflects real damage) + resets all
stats and clears modifiers on every (re)spawn — a fresh body, no death-loop.
- SurvivalStats: getDefinition() (read a stat's max) + resetPlayer().
- Movement: energy-regen gate reads Hunger/Thirst/Fatigue.
- Demo test station drops its hand-rolled health mirror (the engine does it now).
Verified: gate green (stylua/selene/luau-lsp/build); drain math checked (stacked = 6.5/s,
poison scales, regen gates). Tuning + behaviour ported from TheCounterEarth's StatsConfig.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A row of ProximityPrompt parts in the demo to exercise the survival systems by
hand: DAMAGE (real Humanoid damage → death/respawn), FEED/DRINK (Hunger/Thirst
down), POISON/ANTIDOTE and BLEED/BANDAGE (start/stop rate modifiers) — each a live
call into the SurvivorCore stat-effects API, so it doubles as usage documentation.
Also mirrors the character Humanoid health into the "Health" stat attribute so the
HUD Health bar tracks damage + resets on respawn (demo scaffolding; the engine-level
Health<->Humanoid sync is tracked in the respawn/loot issue).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>