Samuel LisonandClaude Opus 4.8 29bd20a93f feat(builder): schema-driven Build page for world objects (#11)
Select a Part or Model in Studio, answer "what is this object?", fill a form —
it becomes a gatherable node, a mob or a quest giver. Closes the gap between
authoring a def and setting up a world object, which until now meant knowing to
tag a part and hand-typing PascalCase attributes in the property panel.

Engine — components can declare an attribute SCHEMA:
- src/components/Schema.luau (new): AttributeSpec/Display/ComponentSchema types,
  normalize/defaults/get/list, and the schemas for Gatherable, Mob, QuestGiver.
  Dependency-free ON PURPOSE: the plugin requires it live at edit time, and the
  component modules themselves can't be required there (Harvesting asserts
  IsServer; Remotes creates instances in ReplicatedStorage).
- Components.define now accepts EITHER the legacy `attr = default` map or a
  schema array, normalizing both to one ordered spec list; bind() reads the
  derived default map, so binding is byte-identical. Legacy maps are sorted, as
  `pairs` order is arbitrary and would make a UI jitter. New getSchema/
  listSchemas. The three shipped components pull name/tag/display/attributes
  from the schema; their onSetup bodies are untouched (defaults verified
  identical, all 23 attributes).

Plugin — the Build page:
- Field.luau (new): coerce/format/equalsDefault, lifted from ConfigAdmin (which
  now delegates), shared by every schema-driven editor.
- FieldRow.luau (new): the shared [○/●] label … control + help row, including a
  ⌄ picker that cycles authored ids for fields declaring `ref`.
- BuildAdmin.luau (new): live schema read with three distinct empty states,
  selection/eligibility/identify, deltas-only attribute writes, applyType
  (tag + clear any other component) and clear.
- BuildAdminUi.luau (new): chooser cards, grouped form, multi-select apply,
  stale-bind-marker warning, SelectionChanged-driven refresh.
- init.server.luau: record()-wrapped buildActions + the page.

Docs: docs/admin-plugin.md Build section + a 60-second walkthrough,
docs/extending.md schema guide, a CONTRIBUTING rule that new creator components
declare one, CHANGELOG.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-30 17:14:52 +10:00
2026-07-30 17:00:36 +10:00
2026-07-30 17:00:36 +10:00
2026-07-30 17:00:36 +10:00

SurvivorCore

SurvivorCore

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

Release CI License: MIT

🌐 Website · 📖 Docs · 📹 Demo · ⬇ Releases

Status: v0.9.0 — pre-release. The core survival loop is in and working; the engine is being grown toward v1.0 and APIs may still shift. Production-tested in The Counter Earth.

What it is

SurvivorCore gives you the mechanics of a survival game — without dictating your content. You bring the items, world and art; the engine wires up the behavior, the UI, and the no-code authoring tools. If you know Roblox Studio, you can build a survival game.

  • Survival stats & HUD — health, energy, hunger, thirst, fatigue, blood, poison; ticking, draining, and biting back, on a clean restyleable HUD.
  • Inventory, hotbar & crafting — slots + carry-weight, a 9-slot hotbar, equipment, and hand crafting in a tabbed, drag-and-drop menu — server-authoritative.
  • Gathering — tag any mesh Gatherable: hold-E or tool-swing, per-hit yields, and reaction hooks (a reed sways; a tree fells and leaves a stump).
  • Combat — melee & bow — click to swing, or aim a bow and loose arrows that arc under real weight. One server-validated combat:hit / combat:kill schema.
  • Mobs & AI — a shared FSM substrate: hostile mobs chase & attack, passive animals flee. Behavior is data — a mob's faction picks the profile.
  • Quests & achievements — event-driven goals: quest chains with objectives, rewards and quest-giver NPCs, plus milestone achievements with toasts — both tracked automatically from what players already do (gather, craft, fight).
  • Hunting & loot bags — slain animals leave butcherable carcasses (knife required, real yields); player death drops everything into a lootable bag with a countdown — get back to it before it's gone.
  • Player trading — walk up, offer items, both confirm: a server-authoritative, dupe-proof face-to-face swap (nothing moves until both agree, then atomically).
  • SurvivorCore Studio (no-code admin plugin) — one floating window with sidebar + search: tune every engine config section (movement, combat, mobs, loot bags, UI theme colors & fonts, …) as locked deltas that survive engine updates; create items, weapons, ammo, mobs, quests and achievements from forms; override code-registered content field-by-field; drop any of it into the world. No scripting.

Everything is content-free by design, server-authoritative, and restyleable — the UI is real Instances driven by attributes, and every default is overridable.

Quickstart

local SurvivorCore = require(ReplicatedStorage.SurvivorCore)

-- register content from code (or author it no-code in the admin plugin)
SurvivorCore.Items.register({ id = "berry", name = "Wild Berries", stack = 20 })
SurvivorCore.Mobs.register({ id = "husk", faction = "hostile", health = 60 })

SurvivorCore.start()  -- boots stats, inventory, gathering, crafting, combat, mobs…

The built-in HUD loader calls SurvivorCore.startClient() for you.

Install — drop SurvivorCore.rbxm from a Release into ReplicatedStorage, or add it via Wally:

# wally.toml
[dependencies]
SurvivorCore = "temujincalidius/survivorcore@0.9.0"

Working from source? Clone and rojo serve the demo.project.json place.

Creator-owned, no code

Build any mesh, tag it with a component, set attributes — no engine-side definition needed:

Tag Set It becomes
Gatherable Resource = "oak_tree" a harvestable node (item/HP/tool/yield from the def)
Mob MobType = "husk" a creature that runs the AI FSM

For game-specific flourish (a tree that physically fells, a custom death effect), hook the engine lifecycle instead of forking it:

SurvivorCore.Gather.onReaction("oak_tree", "depleted", function(ctx) fellTrunk(ctx.instance) end)
SurvivorCore.Hooks.on("combat:kill", function(ctx) awardXp(ctx.attacker) end)

The admin plugin turns all of this into Studio forms — see docs/admin-plugin.md and docs/content-authoring.md.

Docs

Architecture · Survival stats + HUD · Inventory · Harvesting · Crafting · Combat · Mobs & AI · Quests · Achievements · Loot bags · Player trading · Interact window · No-code content · Admin plugin · Design language · Extending

Project layout

src/
  init.luau          -- SurvivorCore root: .start() / .startClient() + the public API
  foundation/        -- Config, Assets, EventBridge, Hooks, Reactions, Registry
  registries/        -- Items, Recipes, Resources, Stats, Mobs, …
  components/         -- creator-facing tag/attribute components (Gatherable, Mob)
  systems/           -- Inventory, Harvesting, Crafting, Combat, Mobs, SurvivalStats…
  client/            -- HUD + UI binders, combat/harvest input
plugin/              -- the Studio admin plugin (separate Rojo tree)
demo/                -- a runnable demo place that consumes the engine
site/                -- the landing page (deployed to GitHub Pages)
docs/                -- documentation

Sponsor

SurvivorCore is free and open source. If it's useful — or you just want to help the engine grow — 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%