Elland is an open-ended Roblox game world built for a young explorer. The whole world - terrain, river, hill, buildings, trees, and attractions - is generated by server code every time the server starts. Players spawn at the riverside Hub and can travel freely between zones, play a daily Wordle puzzle, shop at the Fashion Boutique, build with blocks, run an obby, play soccer, perform on stage, host talent shows, adopt a pet, bake family recipes, hunt for hidden music notes, practice algebra, graph equations, and sit on the swing at Ella's Lookout.
- By the River (Hub): The heart of Elland. A cobble plaza with a welcome sign, a bench, and a splashing fountain. Warm lampposts line the cobble paths that lead from here to everywhere else (they even bridge the river).
- Ella's Lookout: A big grassy hill topped by the wishing tree and a working rope swing - the best view in the world. (Psst... look around up here for a golden music note!)
- Ella's House: Home sweet home, with a gabled red roof. Right beside it is the picnic area: a checkered blanket, a basket, and seats for a family snack. On the path toward the Lookout there's a golden photo spot arch with an ELLAND sign - stand on the violet marker and smile!
- Pet Corner (between the Hub and the soccer pitch): A little fenced pen where you can adopt a pet - Puppy, Kitten, Bunny, or Axolotl. Your new friend floats along behind you everywhere you go! Open the Pet Corner again any time to switch which pet follows you, or call it home.
- Ella's Bake Shop (beside Ella's House): A cozy family-recipes shop with a striped awning and a display case of cupcakes. Pick a recipe - Cupcake, Cookies, Brownie, Cinnamon Roll, Pie, or the big Birthday Cake - then bake it yourself: click Stir!, Add sprinkles!, and Frost! right on time while the oven bar fills. Perfect timing earns a Coin bonus, and every recipe you bake goes into your recipe book forever.
- Music Note Hunt: 10 glowing golden music notes are hidden all over Elland - some easy to spot, some sneaky (has anyone checked behind the house? or past the obby's winner pad?). Each note you touch earns Coins, and finding all 10 earns a big reward with confetti! Your count shows in the corner of the screen.
- Algebra Academy (between the Hub and the Wordle Library): A little schoolhouse with a chalkboard and desks. Tap Practice! at the Linear Lab for a 5-question worksheet - solve for x, find slopes, plug numbers into y = mx + b, find y-intercepts - all multiple choice with a progress bar and a streak counter. Right answers earn Coins (and messages like "Slope superstar!"). Beside the schoolhouse stands the Graphing Easel: type any equation -
y=2x+1,y=-x+3, even curvy ones likey=x^2-4- and watch it draw itself on the graph paper, axes and all. Your first graph each visit earns Coins! - Wordle Library: Solve the daily 5-letter word puzzle (6 tries, 50 Coins).
- Fashion Boutique: A pink glass shop where Coins buy hats, capes, sneakers, and more.
- Building Area: Grab the Build Tool from the glowing prompt and click to place pastel blocks (they snap neatly to a grid). Press R or right-click to remove a block you placed, and use the red prompt to clear your plot and start over. Up to 200 blocks per player; builds reset when the server restarts (saving them forever is a future plan).
- Ella's Obby (near the Hub): A workout obstacle course! Hop across 12 platforms - some slide side to side, some blink in and out - and tag the green checkpoints so you never lose progress. Reach the gold winner pad for confetti and Coins (once every 5 minutes). Your best stage shows on the leaderboard.
- Soccer Pitch (near the Hub): Run into the ball to kick it where you're facing! Score in either goal to light up the scoreboard, burst confetti, and earn Coins (once a minute). Goals also count on the leaderboard.
- Ella's Stage (near the Hub): A concert stage with spotlights, a mic stand, and benches for the family. Use Perform! at the mic to take a bow: sparkles fly, your name goes up on the Now Performing board for 30 seconds, and you earn Coins (every 2 minutes). Feeling braver? Step onto the golden spot and Host a Talent Show! - you get 60 seconds in the spotlight while everyone else in the server showers you with Applause and Stars in the last 30 seconds. The more love you get, the more Coins you earn, confetti rains down, and your best audience reaction is remembered forever. Grown-ups: real songs can be enabled - see "Stage songs" below.
- Nutcracker Plaza (near the Hub): A snowy festive corner with a nutcracker soldier statue, candy-cane poles, and a decorated evergreen tree. Touch the tree for a twinkle and a little luck message. It snows here all year round - and even harder in winter!
- The Seasons: Elland celebrates real-world seasons! From December 1 to January 6 the whole world turns wintry: gentle snow falls everywhere, the lampposts wear strings of warm-white fairy lights, and the trees look dusted with snow. The rest of the year the world stays golden. (More seasons are easy to add - see "Seasons" below.)
The Algebra Academy was built for a student just starting algebra. The Linear Lab practices linear skills only - solving ax + b = c, slope from two points, evaluating y = mx + b, and finding y-intercepts - with clean integer answers and kid-friendly multiple choice (the wrong options are the classic mistakes: sign flips, off-by-one, swapping b and m). Questions and scoring live entirely on the server; coins are capped per worksheet with a 5-minute cooldown, so it rewards practice, not grinding. Sessions, correct answers, and best streaks are saved. The Graphing Easel is the open-ended sandbox: it happily graphs lines and quadratics (y=x^2-4 is a great first parabola), with friendly error messages for typos. There are no quadratics anywhere in the practice problems - by construction, the generator has no quadratic question type at all.
- Open-Ended Gameplay: All zones accessible from the start - no forced progression
- Procedurally Built World: Terrain, river, hill, structures, nature, and attractions are created by server builders on server start
- Golden-Hour Look: Warm ~5 PM lighting with soft haze, gentle bloom, sun rays, soft shadows, and drifting clouds
- Seasonal Overlays: Real-date-driven decorations (winter snow, fairy lights, tree tint) - see "Seasons" below
- Zones (see
Constants.ZONES): Hub, Ella's Lookout, Ella's House, Wordle Library, Fashion Boutique, Building Area - Pet Companions: Adopt one of four pets; it follows you everywhere with a gentle bob (client-smoothed, zero per-frame network cost). Ownership persists.
- Baking Minigame: Timed click-steps turn shopping into an activity; the server sanity-checks timing before granting the recipe
- Scavenger Hunt: 10 per-player music notes with persisted progress - collected notes stay collected forever
- Talent Shows: Server-managed 60-second voting events at the stage with audience Applause/Star buttons; hosted count and best applause persist
- Algebra Practice: Server-generated, server-validated linear-only worksheets with streaks and capped rewards; stats persist
- Graphing Easel: A real equation grapher (shared parser) rendering lines and parabolas on a graph-paper SurfaceGui
- Shared Economy: Coins persist across sessions via DataStores; all rewards are paid server-side with per-player cooldowns
- Leaderboards: "Obby Stage" and "Goals" leaderstats
- Zone Map: Press M to open the teleport menu
- Interactions: Glowing ProximityPrompts at the Wordle Library, Fashion Boutique, Pet Corner, Bake Shop, Build Tool / Clear Plot stations, the stage mic, the talent-show spot, the Linear Lab, the Graphing Easel, and the swing
- Rojo: File sync between filesystem and Roblox Studio (pinned via
aftman.toml) - Aftman: Toolchain manager for Rojo
- Luau: All game logic (Roblox's Lua dialect)
- ModuleScripts: Reusable, maintainable systems
Elland/
├── default.project.json # Rojo configuration
├── aftman.toml # Pins the Rojo toolchain
├── src/
│ ├── ServerScriptService/
│ │ ├── Init.server.lua # Main server initialization
│ │ ├── PlayerDataService.lua # DataStore persistence (raw DataStoreService)
│ │ ├── CurrencyManager.lua # Economy + purchases (server-side item catalog)
│ │ ├── ZoneManager.lua # Zone teleportation
│ │ ├── WordleManager.lua # Server-authoritative Wordle (API + fallback)
│ │ ├── WorldBuilder.lua # Generates terrain + core structures
│ │ ├── WorldUtils.lua # Shared river/path geometry helpers
│ │ ├── PolishBuilder.lua # Lighting, clouds, paths, lampposts, fountain
│ │ ├── NatureBuilder.lua # Seeded tree + flower scatter
│ │ ├── BuildingSandbox.lua # Build Tool block-placing sandbox
│ │ ├── ObbyManager.lua # Ella's Obby: course, checkpoints, rewards
│ │ ├── SoccerManager.lua # Soccer pitch: kicking, goals, scoreboard
│ │ ├── StageManager.lua # Ella's Stage: Perform! interaction
│ │ ├── TalentShowManager.lua # Talent Show: server-managed voting event
│ │ ├── NutcrackerBuilder.lua # Nutcracker Plaza: statue, tree, snow
│ │ ├── FamilyBuilder.lua # Picnic area + photo spot
│ │ ├── PetManager.lua # Pet Corner: adoption + follow pets
│ │ ├── BakeryManager.lua # Ella's Bake Shop: shop + baking validation
│ │ ├── HuntManager.lua # Music Note Hunt: notes, collection, rewards
│ │ ├── AlgebraManager.lua # Algebra Academy: Linear Lab + Graphing Easel
│ │ ├── SeasonManager.lua # Seasonal decoration overlays (real date)
│ │ └── InteractionManager.lua # ProximityPrompts for world objects
│ ├── ReplicatedStorage/
│ │ └── Shared/
│ │ ├── Constants.lua # Shared config: zones, words, shops, attractions
│ │ └── EquationParser.lua # Shared equation parser for the Graphing Easel
│ └── StarterPlayer/
│ └── StarterPlayerScripts/
│ ├── ClientController.client.lua # HUD + notifications + client bootstrap
│ ├── WordleUI.lua # Wordle game interface
│ ├── ZoneMenuUI.lua # Zone map / teleport menu (M key)
│ ├── FashionUI.lua # Fashion Boutique shop interface
│ ├── PetUI.lua # Pet Corner adoption interface
│ ├── BakeShopUI.lua # Bake shop menu + baking minigame
│ ├── TalentShowUI.lua # Talent Show audience voting panel
│ ├── AlgebraUI.lua # Linear Lab worksheet interface
│ ├── GraphUI.lua # Graphing Easel input + graph renderer
│ ├── PetFollow.client.lua # Smooth pet follow/bob loop
│ ├── HuntClient.client.lua # Note hiding + hunt progress HUD
│ └── BuildToolClient.client.lua # Build Tool input handling
└── README.md
-
Install Aftman, then install the pinned tools:
aftman install
(Or install Rojo manually from https://github.com/rojo-rbx/rojo/releases)
-
Install Roblox Studio from roblox.com/create
-
Install the Rojo plugin in Roblox Studio
-
Clone the repository
git clone https://github.com/cmc0619/Elland.git cd Elland -
Start the Rojo server
rojo serve
-
Open Roblox Studio
- Open a new Baseplate
- Click the Rojo plugin button, Connect to
localhost:34872, and Sync In
-
Play
- Press Play (F5). You should spawn at the Hub ("By the River").
- Check the Output window for initialization messages.
DataStores require Game Settings → Security → Enable Studio Access to API Services in Studio. Without it, the game falls back to default data in Studio. The same setting enables the Wordle daily-word API call; without it, Wordle uses its offline word list.
Roblox only plays audio that has been uploaded to (or licensed in) Roblox, so no song plays by default. To give Ella music at the stage:
- Upload the audio in Roblox Studio (Asset Manager) or pick a licensed track, and copy its asset ID.
- Paste the ID into
Constants.STAGE.CHOIR_SONGSinsrc/ReplicatedStorage/Shared/Constants.lua:CHOIR_SONGS = { "rbxassetid://1234567890", -- add more IDs here },
- When the list is non-empty, Perform! plays a random song from the stage and stops it when the performer's 30 seconds are up.
Seasons trigger automatically from the real calendar date (os.date, checked once when the server starts). Season definitions live in Constants.SEASONS as pure data:
Constants.SEASONS = {
ORDER = { "WINTER" }, -- checked in priority order; first match wins
LIST = {
WINTER = {
Name = "Winter",
StartMonth = 12, StartDay = 1, -- Dec 1
EndMonth = 1, EndDay = 6, -- through Jan 6 (wraps the new year)
MapSnowRate = 12,
NutcrackerSnowMultiplier = 2,
FairyLightColor = ...,
LamppostColor = ...,
TreeCanopyTint = ...,
},
},
}WINTER applies: gentle map-wide snowfall, warm-white fairy-light strings on every lamppost (plus warm-white lamp heads/lights), snow-dusted tree canopies, and a rate boost to Nutcracker Plaza's existing snow emitter (never a duplicate). If no season's window contains today, the world is left as-is.
Adding a new season (Halloween, Spring, ...) is data-only: add an entry to Constants.SEASONS.LIST with its date window and decoration fields, and add its ID to ORDER (first match wins, so order = priority). If the new season needs a new kind of decoration, teach SeasonManager one new apply-step that reads a new field.
WorldBuilder:BuildWorld() runs on every server start and builds terrain, the river, the hill/swing, zone structures, and spawn locations; it sets Workspace:GetAttribute("WorldBuilt") when done. Immediately after, the additional builders run in this order: PolishBuilder (lighting, clouds, paths, lampposts, fountain), NatureBuilder (seeded trees/flowers with keep-outs for the river, paths, hill, and structures), then the attraction modules (BuildingSandbox, ObbyManager, SoccerManager, StageManager, TalentShowManager, NutcrackerBuilder, FamilyBuilder, PetManager, BakeryManager, HuntManager, AlgebraManager), and finally SeasonManager (it decorates what the others built).
Player persistence using raw DataStoreService (retries, auto-save every 5 minutes, save on leave/shutdown). New players start with 100 Coins. Saved data is merged with defaults on load, so new fields (pets, bakery recipes, hunt progress, talent-show stats, algebra stats) are added safely for existing players.
Unified economy. All coin awards (obby winner pad, soccer goals, stage performances, talent shows, shop purchases, pet adoptions, bakes, hunt notes, algebra worksheets, graph bonuses) happen server-side with per-player cooldowns - clients never decide payouts.
The golden spot on the stage hosts a 60-second, server-managed show (one at a time, 10-minute server-wide cooldown). The host performs; during the last 30 seconds the server fires TalentShowEvent (phase = "voting") and every other client opens the TalentShowUI Applause/Star panel. Votes travel via TalentShowVote, rate-limited server-side to 1/second per player (performers can't self-vote). At the end the server tallies votes, pays the host min(floor(total/2), 25) Coins, bursts confetti, toasts the results to everyone, and persists TalentShowsHosted / BestApplause. A host leaving mid-show ends it gracefully.
The Linear Lab's AlgebraStartRequest -> AlgebraSession -> AlgebraAnswer -> AlgebraAnswerResult flow keeps question generation AND scoring on the server; the client only ever sends a choice index and never receives the correct index until after answering. The four generators (solve ax+b=c, slope from two points, evaluate y=mx+b, y-intercept through a point) are built from slope-intercept pieces - no quadratic generator exists, so practice is linear-only by construction. +2 Coins per correct answer (session cap 10, 5-minute per-player cooldown, 5-minute session timeout). AlgebraStats = { Sessions, Correct, BestStreak } persists.
Shared/EquationParser.lua tokenizes typed equations into {kind="linear"|"horizontal"|"vertical"|"quadratic", ...} - it handles decimals, simple fractions (3/4x), negatives, implicit coefficient 1 (y=x), and rejects everything else with a friendly message. GraphUI renders client-side onto the easel's SurfaceGui: integer grid with bold axes and -10..10 labels, one clipped rotated Frame for lines, and a 40-segment sampled polyline for parabolas. Rendering is local-only, so each interacting player sees their own graph. The first successful graph per session fires GraphBonusRequest; the server re-parses the same string with the shared module before paying +2 Coins (5-minute cooldown).
Detects the active season from os.date at server start (first match in Constants.SEASONS.ORDER whose inclusive date window contains today; windows may wrap the new year), then decorates into Workspace/SeasonDecorations and retints existing parts (lampposts, tree canopies, the plaza's snow rate). Runs after all builders; a no-op outside season windows.
Server-authoritative daily Wordle with the Random Words API and a deterministic offline fallback from the vendored word list.
Shop items live once in Constants.FASHION.ITEMS; the client sends only an item ID and the server validates price/ownership/funds, charges, grants, and replies via PurchaseResult.
Pets live once in Constants.PETS.LIST. Adoption uses its own remote pair (PetPurchaseRequest/PetPurchaseResult) with the same server-side validation pattern as the boutique; ownership saves to Pets and the single active follower to ActivePet. The server spawns an anchored blocky pet model in Workspace/Pets (tagged OwnerUserId); PetFollow.client.lua pivots every pet on Heartbeat toward a point behind its owner with a bob, so following is smooth with no per-frame network traffic. PetEquipRequest switches the active pet or dismisses it (no petId). Pets respawn with the character and are destroyed when the owner leaves.
Recipes live once in Constants.BAKERY.ITEMS. Baking is a two-step activity: BakeStartRequest validates recipe/ownership/funds and starts a server-side timer; the client plays a progress-bar minigame with timed Stir! / Add sprinkles! / Frost! clicks; BakeCompleteRequest is rejected if it arrives faster than MIN_COMPLETION_TIME, otherwise the server charges, saves the recipe to BakeryItems, and toasts "Fresh out of the oven!". Clicking every step in time pays a small bonus with a 2-minute per-player cooldown.
Ten note positions live in Constants.HUNT.NOTES (none underwater). Touching a note records its index in HuntNotes (persisted, once per player), pays Coins, and toasts progress. All 10 pays the big reward, bursts confetti at the player, and sets HuntCompleted. The server fires HuntNoteUpdate on join and after each pickup; HuntClient hides that player's collected notes locally and shows a small HUD counter.
The "Get Build Tool" prompt hands out a code-created Tool. BuildToolClient reports clicks (place) and R/right-clicks (delete); the server re-validates everything: plot bounds (the 80x80 platform), 2-stud grid snap, 200-block cap per player, and a placement rate limit. Blocks live in Workspace/PlayerBuilds/<UserId> and only their owner can delete them. Builds are session-only - persisting them via DataStore is future work.
12-platform course with zigzag jumps, two sine-driven moving platforms (Heartbeat loop), three blinking platforms (staggered timers), and checkpoint pads at stages 0/4/8. Checkpoints write a leaderstats "Obby Stage" value; on death the player respawns at their highest checkpoint (ZoneManager only force-teleports to the Hub on the first spawn). The winner pad pays Coins with a 5-minute cooldown and fires confetti.
Touching the ball punts it along the character's look direction (server-side, per-player debounce) and remembers the last kicker. Invisible goal detectors award that player a leaderboard goal, scoreboard credit, confetti, and Coins (1-minute payout cooldown). A watchdog loop resets the ball if it leaves the pitch area or falls out of the world.
"Perform!" pays Coins (2-minute cooldown), bursts sparkles, and shows the player on the Now Performing billboard for 30 seconds (token-guarded so overlapping performances don't clobber each other). Songs play only when Constants.STAGE.CHOIR_SONGS contains owner-provided audio IDs.
The plaza tree's touch handler twinkles the star light and fires the shared NotifyPlayer RemoteEvent; ClientController:ShowNotification renders the toast ("Break a leg, Ella!"), reusing the HUD notification style. PetManager, BakeryManager, HuntManager, TalentShowManager, and AlgebraManager reuse the same channel.
Teleportation between zones via Constants.ZONES[*].SpawnName. Players teleport to the Hub on first spawn only.
Creates the OpenWordleUI / OpenFashionUI RemoteEvents and the glowing prompts for the Wordle Library, Fashion Boutique, and the swing. (The Pet Corner, Bake Shop, Talent Show, and Algebra Academy own their prompts in their managers; the sandbox owns the Build Tool prompts.)
- Edit files in your editor (Rojo auto-detects changes when
rojo serveis running) - Sync into Studio and test (F5)
- Commit and push to
main
- No errors in Output on server start
- Player spawns at the Hub on solid ground; lighting looks warm; clouds visible
- HUD shows currency and zone name; M opens the zone map; teleporting works
- Wordle prompt opens the Wordle UI; boutique prompt opens the shop
- Pet Corner: adopt a pet (Coins charged), it follows and bobs; switch/dismiss works; it returns after respawn
- Bake Shop: bake a recipe (minigame bar + timed clicks), item lands in the recipe book, perfect bonus respects cooldown
- Music notes: touch pays Coins + toast; counter updates; collected notes stay hidden after rejoin; all 10 pays the big reward + confetti
- Build Tool places/deletes blocks only inside the plot; Clear My Plot works
- Obby checkpoints save stage; dying respawns at the checkpoint; winner pad pays (then respects cooldown)
- Soccer ball kicks toward facing direction; goals update scoreboard and pay (then cooldown)
- Stage Perform! pays, sparkles, and updates the billboard
- Talent Show: host prompt starts a show (toast to all), voting panel appears for others in the last 30s, votes are rate-limited, payout + confetti + results toast at the end, 10-min cooldown between shows
- Algebra Academy: Linear Lab serves 5 linear-only questions, correct answers pay +2 Coins (cap 10), wrong answers reveal the answer, cooldown enforced; stats persist after rejoin
- Graphing Easel:
y=2x+1draws a line,y=x^2-4draws a parabola,x=-2draws vertical, garbage shows the friendly error; first graph pays +2 Coins (then cooldown) - Nutcracker tree twinkles and shows the toast notification
- The swing still swings; no trees/grass inside the river water
- (In Dec 1-Jan 6, or with a tweaked test window) Winter: map-wide snow, fairy lights on lampposts, snow-tinted canopies, heavier plaza snow
- Applying purchased fashion items visually to the character
- Pet accessories / pet tricks
- Persisting Building Area builds across sessions
- Stage songs (needs owner-uploaded audio IDs in
Constants.STAGE.CHOIR_SONGS) - Zone icons in
Constants.ZONES(asset uploads pending) - More seasons (Halloween, Spring) - data-only additions to
Constants.SEASONS
MIT - see LICENSE.
cmc0619 - https://github.com/cmc0619/Elland
- Built with Rojo
- Daily Wordle words by the Random Words API
- Made for Ella