Santhosh Ratnam
Menu Close
Back to Portfolio
Systems Design
Economy & Progression
Unreal Engine 5

Verdant

Crafting Economy & Restoration Progression: a gameplay design prototype

Role: Game Designer, Systems & Economy (solo) Type: Design prototype Engine: Unreal Engine 5.8 Year: 2026

The design question

Spend your resources on the world instead of on yourself, and watch the world pay you back

72 seconds, captured in engine. Gather, refine, restore, and the grove pays it back.

The fantasy

You arrive at a river bend that used to be farmland. The reeds have taken it back, there is rusted machinery in the silt, and the soil is dead. Nobody is going to fix it. You are going to fix it.

Most crafting games spend your resources on you. You gather, you craft, you get a better axe, you gather faster. The loop is a staircase and the world is scenery you climb past. Verdant spends your resources on the place. You hand everything you own to the grove, and the grove answers: plants come back thicker, new things grow that were not there before, the route you walked yesterday is greener today.

The question this prototype was built to answer is not whether the economy balances. It is does spending resources on a place instead of on yourself still feel like progress? It does. But the first version felt like a chore, for a reason I did not predict.

The core loop

   ┌─────────────────────────────────────────────┐
   ▼                                                  │
GATHER ──► REFINERY ──► RESTORE ──► VITALITY ─┘
 raw        runs by      hold E at     rises
 nodes      itself       a project       │
                                                 ▼
                                    denser nodes · richer nodes
                                    new recipes · new node types

Vitality (0 to 100) is the only meta-stat in the game. No player XP, no levels, no skill tree. Restoring the zone is the progression system. Each restored project wakes a new node type and unlocks a recipe, and crossing a tier threshold raises node density, node richness and respawn rate. Density leads on purpose: it is the lever the player reads as the grove coming back, rather than as the numbers getting bigger.

The economy

Three raw resources feed a two-step refine chain into four gated restoration projects. Read in raw material, which is the only honest way to read a crafting economy:

Restoration project Fiber Loam Scrap Total raw vs. first
Reed Filter36016521.0×
Compost Yard28300581.1×
Solar Trellis4836321162.2×
Grove Heart11284322284.4×

Derived from the data tables by script, not typed by hand. Mine were wrong twice before I automated it, which is the argument for automating it.

The one input doing the most work is the Fiber in Compost. It makes Fiber contested by two separate chains, so Fiber becomes the thing the player actually feels short of. Everything follows from that: why the reeds stay worth walking past, why the Sporebloom unlock reads as relief instead of as a bigger number, why the player prefers one route over another. One extra input in one recipe. Contention is cheaper to author than complexity.

What tuning it taught me

The economy runs in a simulation that reads the same CSV tables the game imports, so the model and the build cannot drift apart. Five seeds, restoration-first play.

First pass looked healthy. Full restoration in 39 minutes, tight across seeds, final project 4.2× the first, matching the 4.4× cost curve. Then I looked at where the time actually went.

38.9% of the session was the player standing at a bench watching a progress bar.
The final project alone carries nine minutes of queued crafting. Not gathering, not exploring, not deciding. Standing.

The diagnosis. This is not a cost problem, it is a throughput problem. It appears the moment the chain grows a second refine step, because every craft serializes behind the last one. It is invisible in a cost spreadsheet, because the costs are fine. Shipped, it would have been reported as the late game dragging, and the late game is not what was wrong.

The fix that does not work: raise yields. Worth showing why, because it fails in a way that looks like success.

Session Gathering Standing still
Baseline39.0 min54.1%38.9%
Yields ×1.532.7 min44.9%46.6%
Yields ×2.028.6 min37.6%52.9%

The session gets shorter, so by the usual measure it worked. But bench time stays at exactly 15.2 minutes in all three rows, because the player still crafts the same number of items. Only the gathering shrinks, so the standing-still share climbs. Double the yields and the player spends more than half the game watching a progress bar, while every number on the balance sheet improves. The fix that works: make the bench passive. Three background refine slots that run while the player keeps gathering. No cost, yield or craft timer changed.

Blocking bench Passive refinery
Time to full restoration39.0 min24.3 min
Time gathering54.1%86.3%
Time standing still38.9%2.5%
Final project vs. first4.2×3.2×

The session got 37% shorter and the progression curve flattened, without touching a single balance number. The 4.2× to 3.2× drop is the interesting half: some of what read as the last project being expensive was never cost. It was queue depth pretending to be cost.

What I would carry into a real production: measure the player's time, not their inventory. Two economies with identical costs can feel completely different depending on what the player is doing while those costs are being paid. A spreadsheet cannot see the difference. A stopwatch can.

The second finding: it worked, and nobody could play it

The loop closed in engine. Gather, refine, restore, the barrel grew, vitality went up. Then I sat down to play it and could not tell what to do next. If the designer cannot read the system, the system is not designed yet. So I tore down how six cozy games teach the same loop: Stardew Valley, Animal Crossing, Terra Nil, Spiritfarer, My Time at Portia, Dinkum. Every one of them does three things Verdant did not.

One goal, with a price
Stardew's bundle note: greyed items, have/need, the reward drawn under it.
A machine with a body
Spiritfarer's oven counts down on the object and shows "done" outside.
The world changes when you spend
Terra Nil flips tiles within a second of paying.

The diagnosis had five lines. The only UI showed what you had, never what you needed. The refinery had no body, so Fiber went down and Cord appeared in a text line. Spending was silent when it failed and automatic when it worked, so there was no moment of choice. Everything was a number and nothing was a place. And the tier ladder was invisible.

The fix changed zero balance numbers. Every cost, yield and timer stayed in the tables. I drew the tables on the world instead: a commission card that always names the next project and its price in raw material, a label on every node saying what it gives and what that becomes, a refinery board with a row per slot and an amber "waiting for Fiber (Cord took 3)" when one recipe starves another, project cards that shake red with "need 2 more Cord" and then read "READY, hold E", and a restore beat: the mesh grows, the banner says what changed, reeds appear, a dormant node wakes. Only one project is open at a time. The rest say what unlocks them.

BeforeAfter
"Fiber: 12 | Cord: 3""REED FILTER. Cord 9/12. Ingot 4/4. = 36 Fiber (27) + 16 Scrap (16)"
Cord appears in a line"LOOM 3 Fiber -> Cord [===== ] 2.1s"
Walk into a project: nothing, or it builds itselfRed shake, "Not yet, 2 more Cord". Then "READY, hold E to restore"
Four projects, no orderOne open, three reading "Locked, needs Reed Filter"

The refinery board also turned a bug into a design lever. Recipes run in table order, Cord is row one, Compost is row three, and both eat Fiber. So Cord always wins and Compost starves. Before, that was a mystery in the output log. Now the board says it on screen, and the fix is a priority column, not a code change.

Everything is a knob

No balance value lives in Blueprint. The whole economy is six data tables plus a string table for every line of on-screen text, so a designer with no engine access can rebalance the game from spreadsheets and re-run the simulation to see what it did to session length, before the build is even opened.

DT_Resource
Display name, tier, stack size, base value
DT_Node
Yield range, gather time, respawn, and which project wakes it
DT_Recipe
Inputs, output, craft time, and the stock level it stops at
DT_Project
Costs, vitality gain, prerequisites, unlocks, and the lines it prints on screen
DT_Tool
Upgrade costs, yield and speed multipliers. Designed, not in this build
DT_VitalityTier
Thresholds, density / yield / respawn multipliers, tier banner text

In engine

Minute zero
Minute zero. One goal, its price in raw material, and every node labelled with what it becomes.
The shortfall, in things you can go and find
The shortfall, in things you can go and find. Walk close and the project card does the maths: 8 more Cord is 24 Fiber.
The refinery has a body
The refinery has a body. Three slots, a recipe and a timer per row, running while the player keeps walking.
Contention, on screen
Contention, on screen. Cord and Compost both eat Fiber. The board names who lost and what took it.
The spend is the reward
The spend is the reward. The filter is built, vitality moves, three reeds appear, and the next project opens.
Progress is a new resource
Progress is a new resource. The silt bank was grey since minute zero. Building the filter woke it.
The recipe, project and node data tables that drive the Verdant economy

Everything above comes from here. The same CSV files are imported as Unreal DataTables and read by the tuning simulation, so the model and the build cannot drift apart.

What is not in this build

This is a prototype, not a game, and the gaps are deliberate.

  • The tool sink is in the tables and not in the build. A second place to spend, with no purchase screen, is a decision the player cannot see.
  • Tier 3 is unreachable. The four projects total 80 Vitality against a 100 threshold. It is drawn on the bar in grey rather than quietly rebalanced, because the gap is real and worth naming.
  • No audio. Five sound hooks exist and are empty.
  • Node placement is hand authored. A seeded spawner was designed and cut. Density is pre placed and revealed per project, which is what the player reads as growth anyway.

What I'd do next

  • Update V1, the Keeper's Farm. Designed and costed: plots, water, a store, coins, land you buy and clear, a lodge you upgrade, day and night, rain and drought, birds and rats. Four sinks on one wallet, with the rule that coins buy comfort and only the forest buys progress. Building it in slices.
  • Validate the tool crossover. Tools and restoration draw on the same resources, so buying a sickle slows this project down to speed every future one up. That is the only place a player can actually be wrong. The simulation never buys one, so the crossover point is designed and unmeasured. If it lands after the final project, the tool tree is decoration and should be cut or made cheaper.
  • Resolve the flat second step. The cost curve runs 1.0, 1.1, 2.2, 4.4. Project two is nearly free. Either that is a deliberate teaching beat or the ramp stalls. Playtest decides.
  • A second zone with different weights. Does the same chain read differently when Scrap is the abundant resource instead of Fiber? If not, zones are wallpaper.
  • A depletion mechanic. Nodes that permanently exhaust unless restored, so a player can locally over-harvest. That turns restoration from a menu into a consequence, which is where the fantasy gets teeth.
  • Instrument a real playtest and compare against the simulation. Where the model is wrong is where the design is interesting.