5 Commits
Author SHA1 Message Date
Samuel LisonandClaude Opus 4.8 e674772a45 docs: add SurvivorCore landing page + refresh README
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>
2026-07-01 09:18:20 +10:00
Samuel LisonandClaude Opus 4.8 4256edfd87 feat(plugin): add Survival Stats admin Studio plugin (deltas-only, locked tuning)
A Studio dock widget that lets the experience owner tune the survival stats
through a validated form instead of hand-editing Attributes on the
SurvivalStatsConfig instance — the first slice of the Builder/Admin plugin (#11).

The point is compatibility: edits are LOCKED against engine updates. StatAdmin
(the pure, headlessly-testable logic layer) writes deltas only — it sets an
attribute solely when the owner changes a field from the live engine default,
and removes it on reset / edit-back-to-default. So unset fields keep following
the (improvable) engine defaults across a SurvivorCore release, while explicit
overrides live on the owner's instance, which the engine only ever seeds and
never overwrites. Nothing tuned is lost; nothing left alone is frozen.

Hard guardrail: the plugin can read/write only the seven owner-tunable fields
(STUDIO_ATTR_MAP). A write() assert makes it impossible to ever set the
engine-owned semantics Invert / DangerHigh — re-freezing the affliction
fill-direction bug is structurally unreachable. Runtime-verified in Studio:
every write path exercised (including rejected Invert/DangerHigh attempts) left
zero banned attributes on the instance.

- plugin/StatAdmin.luau     — logic: roster, effective values, deltas-only writes
- plugin/StatAdminUi.luau   — the dock-widget form (per-field reset, override dots)
- plugin/init.server.luau   — toolbar/widget wiring + ChangeHistory undo steps
- plugin.project.json       — separate Rojo tree; build with --plugin to install
- CI: stylua + a plugin-sourcemap luau-lsp pass + a plugin build
- docs/admin-plugin.md + cross-links; fix stale Invert row in the no-code table

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 18:22:57 +10:00
Samuel LisonandClaude Opus 4.8 649ff0c192 Add survival-stats engine + designer-editable HUD
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>
2026-06-19 13:30:12 +10:00
Samuel LisonandClaude Opus 4.8 3d76332c38 Add StyLua/Selene/luau-lsp toolchain and make the scaffold lint-clean
Pin stylua, selene, and luau-lsp in rokit.toml so local dev and CI use the
same versions, and add their configs (stylua.toml, selene.toml, .luaurc).
Two behavior-preserving source touches make the existing scaffold pass:
guard the optional iteration in Components.readAttributes (clears a luau-lsp
type error) and normalize Gatherable.luau to StyLua's canonical form. Ignore
the CI-fetched globalTypes.d.luau.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 18:05:33 +10:00
Samuel LisonandClaude Opus 4.8 286e2f5f91 Scaffold SurvivorCore foundation (v0.1.0)
Foundation (Config/Assets/EventBridge/Hooks/Registry), content registry family, creator-owned component layer + Gatherable example, runnable demo place, Rojo/Wally/Rokit config, and release CI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 16:30:32 +10:00