The base ratePerSecond is a constant drift per stat — fine for hunger creeping
up, but it can't express event-driven, per-player behaviour: poison ticking
until cured, bleeding until clotted, sprint draining energy until you stop.
(That's why Poison/Blood ship at rate 0 and Energy is display-only.)
Adds a server-side modifier layer on top of the baseline, surfaced on
SurvivorCore.Stats once start() has run:
- adjust(player, name, delta) one-time signed delta, clamped to 0..max
- addModifier(player, name, spec) named rate modifier {ratePerSecond, source, duration?}
- removeModifier(player, name, src) remove by source key
- getValue(player, name) read current value
The tick now applies base + Σ(active modifiers) per player; timed modifiers
expire on their own; a leaver's modifiers are dropped (no leak). Same-source
re-add replaces (no implicit stacking). Server-only / authoritative.
Verified: gate green (stylua/selene/luau-lsp/build); algorithm exercised in
Studio (adjust→clamp, poison modifier ticks up, cure stops it, timed expiry,
negative bleed). Foundation for sprint/jump energy + poison/bleed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.rbxmfrom a Release (auto-built from source viarojo build), drop it intoReplicatedStorage, and add a short bootstrap script thatrequires it and calls.start(). - Tuning, no code — owners can adjust the survival stats from a Studio form with the Survival Stats admin plugin. It's editor tooling, so it installs separately from the engine (built once into your Studio plugins folder).
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