mirror of
https://github.com/TemujinCalidius/SurvivorCore.git
synced 2026-08-14 00:58:01 +00:00
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>
11 KiB
11 KiB
Changelog
All notable changes to SurvivorCore are recorded here. The format follows
Keep a Changelog; this project aims to follow
Semantic Versioning. At release time, ## Unreleased
is promoted to the new version and main is tagged vX.Y.Z.
Unreleased
Added
- Inventory, hotbar & tabbed menu UI (#7, #9, #3) — a server-authoritative inventory with a
slots + carry-weight model, a 9-slot quick-use hotbar (keys 1-9), equipment slots
(head/top/pants/shoes/back/quiver), and a restyleable tabbed menu (functional Inventory +
Character Sheet; Codex/Achievements/Quests scaffolded). Built the engine's way — authored
ScreenGui templates (
SurvivalMenu,SurvivalHotbar) driven by attribute-discovering binders, so world creators restyle everything in Studio with zero code (and a zero-setup fallback guarantees the UI always appears). Items stack and have weight; equipping a backpack raises both slot count and weight limit. Consumables apply theironConsumeeffects through the stat-effects layer (e.g. food lowers Hunger) and fire anitem:usehook; every change firesinventory:changed. Full drag-and-drop (move/merge/swap, pin to hotbar), pickups auto-assign to the smallest free hotbar slot, and gathering a node now grants its yield straight into the inventory. New public API:SurvivorCore.Inventory.*(add/remove/move/split/equip/unequip/setHotbar/swapHotbar/useSlot/…) andSurvivorCore.UI.registerPanel/open/close/togglefor code-added tabs. Item display data (name/icon/stack/…) replicates to clients automatically, so games register items once (server-side) and the UI just works; item icons resolve via theItemIconsAssets category or an inlineiconfield. Tunable via the newInventoryandUIConfig sections. The engine still ships zero items — the demo registers a sample set and seeds a starter inventory. Opening the menu defaults to Tab — the engine frees it by disabling Roblox's player roster (which otherwise swallows the key), and moves the chat window to the bottom-left so it clears the top-left HUD; both are opt-out via theUIConfig section (ReclaimCoreKeys,Chat). See docs/inventory.md.
0.2.1 — 2026-06-22
Fixed
- Custom stat
attributeoverrides now work end to end (#20) — the HUD bound stat bars by the stat name, but the engine stores each value under the stat's backingattribute(overridable viaConfig.override("SurvivalStats", { Stat = { attribute = "…" } })), so an override silently froze the bar. The binder now reads + listens on the resolvedattribute; the same hardcoded-name slip in the Health↔Humanoid sync and the energy (vignette/breathing) feedback is fixed too. Default behaviour (attribute defaults to the name) is unchanged.
0.2.0 — 2026-06-20
Added
- Survival consequences — stats now bite back (server-authoritative, all tunable via the
ConsequencesConfig section): starving (Hunger maxed) and dehydrated (Thirst maxed) drain health; poison drains health at 100%; Blood at 0 → bleed out (instant death). Health drains stack and reduce real character health, so death + respawn happen naturally. Energy stops regenerating while starving, dehydrated, or fully fatigued (even after the post-sprint delay). The engine now syncs the Health stat to the character Humanoid (the HUD bar reflects real damage), hides Roblox's built-in health GUI in favour of the HUD bar, and resets all stats + clears modifiers on respawn (no death-loop). Default drift is slow and realistic — Hunger/Thirst ~8 h, Fatigue ~24 h, and ~8 h more to die of starvation/dehydration. - Sprinting, jumping & energy — hold Shift to sprint (server-authoritative): it drains
the Energy stat, speeds you up, and forces an exhausted crawl at 0 energy; energy regenerates
after a short idle delay. Jumps cost energy and are blocked below a threshold. Ships a low-stat
feedback layer too — a screen vignette + breathing loop that intensify as energy drops, and
a heartbeat loop below 40% health. Adds the engine's first RemoteEvent (
SprintIntent) and aMovementConfig section (Config.override("Movement", …)). Logic + tuning + free default art ported from The Counter Earth. See docs/survival-stats.md. - Dynamic stat effects — a per-player, server-side modifier layer over the base rates, so
stats can be driven by events instead of only a constant drift.
SurvivorCore.Stats.adjust(one-time clamped delta),addModifier/removeModifier(named, optionally-timed rate modifiers; effective rate = base + Σ active), andgetValue. This is the foundation for poison ticking until cured, bleeding until clotted, and sprint draining energy. Modifiers are dropped when a player leaves. See docs/survival-stats.md. - Survival-stats engine + built-in HUD (#8, #2) — a server tick simulates per-stat
drain/regen, stored as auto-replicating Player Attributes, and a reactive top-left HUD
renders them (no RemoteEvents). The HUD is a real, designer-editable
SurvivalHudScreenGui in StarterGui — restyle it in Studio with zero code; bars bind by aStatattribute and aFillchild. It's a translucent panel that shows Health + Energy by default and expands to the full roster, with per-bar numeric readouts (99/100/%, configurable) and per-stat icons — the engine ships a free default icon set (baked intoStatDefs+ the HUD template), so the HUD is iconed out of the box and the icons even show in Studio's Edit view, no Play needed. Afflictions (Hunger/Thirst/Fatigue/Poison) read as empty-when-safe and fill up as they worsen (dangerHigh), and the header carries a credits readout (a bar-lessCounterbound to a Player attribute). HUD icons resolve per bar/counter and update live — a game can swap art at runtime by setting theIconattribute, or override the shipped defaults per stat (config / admin plugin /Assets). Ships with seven default stats (health/energy/hunger/thirst/fatigue/blood/ poison), tunable without code via aSurvivalStatsConfigConfiguration instance (or, for developers,Config.override("SurvivalStats", …)/Stats.defineStat). Works out of the box for every distribution — the demo/Rojo source mount it, the drop-in.rbxmauto-installs it onstart(), and a runtime fallback guarantees a HUD always appears. Adds the engine's first client layer (SurvivorCore.startClient()). See docs/survival-stats.md. - Survival Stats admin plugin (#11, first slice) — a Studio dock widget to tune the survival
stats from a validated form instead of hand-editing Attributes. It writes deltas only (an
attribute only when a field differs from the engine default; removed on reset / edit-back), so
owner tuning survives engine updates while untouched fields keep following improvable defaults,
and a hard guardrail makes the engine-owned
Invert/DangerHighsemantics impossible to write. Built as a separateplugin.project.jsonRojo target (install viarojo build plugin.project.json --plugin …); CI lints and builds it too. Includes a reversible edit-mode HUD preview (Preview / Clear) that paints resolved icons + sample fills onto the StarterGui HUD, so owners see play-time styling without pressing Play. See docs/admin-plugin.md. - Continuous integration (
.github/workflows/ci.yml) — every push tomain/devand every PR runsstylua --check,selene,luau-lsp analyze(against a Rojo sourcemap + Roblox type defs), then builds all three Rojo targets —default.project.json(the drop-in engine model),demo.project.json(the runnable demo place), andplugin.project.json(the admin plugin) — to prove they compile. - Changelog enforcement (
.github/workflows/changelog.yml) — PRs must updateCHANGELOG.mdunless they carry theskip-changeloglabel. - Contributor guide (
CONTRIBUTING.md) — prerequisites, local dev setup, code style, thedev/mainbranching model, PR flow, and the engine conventions (no hardcoded asset IDs, content viaregister()/components, content-free core). - Issue & PR templates — bug-report and feature-request issue forms (Studio / Rojo plugin versions, repro), a PR template (changelog, CI, no secrets, no hardcoded asset IDs), and a Discussions link for questions.
- Toolchain pins for
stylua,selene, andluau-lspadded torokit.toml, plusstylua.toml,selene.toml, and.luaurcso local dev and CI lint/format/analyze identically. - Docs — a getting-started/install guide (Rojo + Wally and the drop-in
.rbxm) and an "Extending SurvivorCore" guide (theregister()API, the component/attribute model, Hooks). - README — a "See it live" pointer to The Counter Earth (the engine's closed-Alpha showcase) and a GitHub Sponsors section.
Changed
- The release workflow now cross-posts each tagged release to Discussions → Announcements
(
discussion_category_name+discussions: write).
Fixed
Componentsattribute reading (src/components/init.luau) no longer iterates an optional union; it guards the optional first. Behavior is unchanged — this clears aluau-lsptype-analysis error so CI starts green.
0.1.0 (2026-06-18)
Added
- Foundation scaffold. The core plumbing every layer builds on:
Config— engine-default tuning sections that games override via deep merge.Assets— a typed asset-id registry; the engine never hardcodes IDs.EventBridge— a semantic event bus (fire/onFire) that decouples subscribers from sources.Hooks— lifecycle extension points (Hooks.on("gather:depleted", …)) so game-specific flourish stays out of the engine.Registry— the shared register/validate/index/query lifecycle behind every registry.
- Content registries — empty
Items,Recipes(crafting + cooking, routed bystation),Stats,Achievements,Codex,Appearance, andMobsregistries the game populates at startup. The engine ships zero concrete content. - Component layer — the creator-facing
Gatherablecomponent (tag your own mesh, setItemId/Yield/HPattributes) over a genericComponents.define/scanframework. - Public API —
SurvivorCore.start()and the dot-callable surface (SurvivorCore.Items.register{…},SurvivorCore.Hooks.on(…), …). - Runnable demo (
demo/) and ademo.project.jsonRojo target that mounts the engine underReplicatedStorage.SurvivorCoreand exercises both extension layers. - Release pipeline (
.github/workflows/release.yml) — buildsSurvivorCore.rbxmfrom source and attaches it to eachv*tag's GitHub Release. - Docs & project setup —
README.md,docs/architecture.md, MITLICENSE,rokit.toml(rojo + wally pins), andwally.tomlpackage metadata.