Samuel LisonandClaude Opus 4.8 30ee904840 Make stat fill-direction engine-owned (fix afflictions still filling wrong)
`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>
2026-06-19 15:15:46 +10:00

SurvivorCore

A batteries-included, creator-extensible survival game framework for Roblox.

⚠️ Status: early scaffold (v0.1.0). The foundation layer and architecture are in place; survival systems are being extracted from a production game (The Counter Earth) into this engine. APIs will change. Not yet production-ready.

What it is

SurvivorCore gives you the mechanics of a survival game — stats (energy/hunger/thirst…), inventory, crafting, cooking, harvesting, hostile mobs & combat, achievements, a codex, and player persistence — without dictating your content. You bring your own items, world, and art; the engine wires up the behavior.

See it live

SurvivorCore powers The Counter Earth — a full survival game built on this engine, and its live showcase. The Counter Earth is in closed Alpha (not yet open to beta testers), but SurvivorCore contributors and engine devs may get early access — a good reason to get involved. 👀

Two ways to extend it

1. Programmatic — register content from code:

local SurvivorCore = require(ReplicatedStorage.SurvivorCore)

SurvivorCore.Items.register({ id = "reed", name = "Reed", stack = 20 })
SurvivorCore.Recipes.register({
    id = "reed_basket", station = "hand",
    ingredients = { { item = "reed", count = 5 } },
    output = { item = "reed_basket", count = 1 },
})

SurvivorCore.start()

2. Creator-owned — attach behavior to your own objects:

Build any mesh, tag it Gatherable, and set attributes — no engine-side definition needed:

Attribute Meaning
ItemId what it yields
Yield amount per full harvest
HP hits to deplete

The same pattern extends to craftables, huntables, farmables, and more. For advanced, game-specific behavior (e.g. trees that physically fall and cut into pieces), hook into engine lifecycle events instead of forking the engine:

SurvivorCore.Hooks.on("gather:depleted", function(ctx)
    -- your custom drop / VFX / physics here
end)

Getting started

  • Developers — consume via Rojo (clone + rojo serve) or, once published, as a Wally package.
  • Drop-in — grab SurvivorCore.rbxm from a Release (auto-built from source via rojo build), drop it into ReplicatedStorage, and add a short bootstrap script that requires it and calls .start().

Project layout

src/
  init.luau            -- SurvivorCore root: .start() + the public API
  foundation/          -- Config, Assets, EventBridge, Hooks, Registry (the core plumbing)
  registries/          -- Items, Recipes, Stats, Achievements, Codex, Appearance, Mobs
  components/          -- creator-facing tag/attribute components (e.g. Gatherable)
demo/                  -- a runnable demo place that consumes the engine
docs/architecture.md   -- how the layers fit together

Sponsor

SurvivorCore is free and open source. If it's useful to you — or you just want to help the engine grow — you can support development via GitHub Sponsors. 💛

License

MIT © 2026 Samuel Lison

S
Description
No description provided
Readme MIT
3 MiB
Languages
Luau 96.1%
HTML 2.5%
CSS 1.4%