Zumbi Harvest
A Roblox game in Luau with a day cycle, economy, upgrades and zombie AI.
Zumbi Harvest is a co-op wave-defense game for Roblox, built by Estúdio Crivy in strict Luau and synced to Roblox Studio with Rojo, in which up to 4 players defend a fenced fruit orchard from garden gnomes across a 15-day run with an in-run economy, weapon upgrades and persistent meta progression.
Roblox game · Luau · Rojo · wave defense · tower-defense-like · co-op · day cycle · upgrades · NPC AI · DataStore
The in-game theme is “Pomar Invadido” (Invaded Orchard). An earlier version used sugarcane and alligators; the current reskin replaced them with fruit trees and gnomes. The repository name kept “Zumbi Harvest”.
Features
- Orchard defense with 6 breaches. A farm with a fence, 6 lanes (
mata,cerca,estrada,horta,curral,plantacao) and 39 fruit trees in a 13x3 grid. - Two gnome roles. Each gnome rolls a role on spawn: an attacker hits the fence, a thief picks fruit from a tree and runs away with it. Gnome types:
gnomo,rapido,pesado,furioso. - Day cycle with bosses. Each day is a night of waves followed by a boss. Bosses alternate: Gnome King on odd days, Gnome Gardener on even days. Surviving the boss of day 15 wins the run (about 30 minutes).
- Kill vs. intercept. Intercepting a thief only returns the stolen fruit. Killing a gnome also drops Magic Essence, worth 3 fruit at the stand.
- Branching weapon tree. The Shotgun goes up to tier 2, then the player picks one line for the rest of the run: Rifle or Flamethrower (up to tier 4).
- Helpers. A dog (4 tiers) collects and delivers fruit and bites gnomes. A hired carpenter (4 tiers) repairs the fence during the night.
- Magic mushrooms. Four temporary blessings (Vigor = speed, Harvest = double sales, Fence = armored fence, Scarecrow = scares gnomes away). Picking the same one again resets its timer; different ones stack.
- Fruit stand customers. NPC buyers walk through the farm outside the night and pay a small extra income.
- Random night events, such as
surto_coletivoandhorda. - Meta progression. Run fruit never persists. At the end of a run it converts to Golden Seeds, spent in the Harvest Shop (starting fruit, starting dog tier, starting carpenter tier).
- Retention. Daily login streak, missions and a post-run ranking.
- Co-op scaling. Up to 4 players. Threat grows sublinearly: 1p = 1.0, 2p = 1.6, 3p = 2.2, 4p = 2.8.
- One place for lobby and match. The same place runs as a public lobby or a reserved co-op match (
src/shared/Modo.luau).
Tech stack
| Technology | Version | Use |
|---|---|---|
| Luau | --!strict (in modules that declare it) |
All code in src/ |
| Rojo | 7.7.0 (rokit.toml) |
Syncs src/ into Roblox Studio |
| Rokit | Manages the toolchain |
There is no wally.toml, so there are no declared third-party dependencies.
Getting started
- Install the Rojo version pinned in
rokit.toml(runrokit installif you have Rokit, or install Rojo 7.7.0 manually). - Start the Rojo server from
default.project.json:rojo serve - Connect the Rojo plugin in Roblox Studio and press Play.
In Studio the default mode is the match, not the lobby. To test the lobby, set the attribute ModoLobby = true on workspace (see src/shared/Modo.luau).
How it works
Day cycle. src/server/CycleManager.server.luau is the server-authoritative core. A state machine (src/shared/StateMachine.luau) runs Waiting -> Countdown -> Night -> BossFight -> NightEnd -> Waiting and broadcasts phase, time, day and fence health to clients. The client never counts down its own clock; it computes time from phaseStartTime. The script exits early in lobby mode, because the same code runs in the lobby place.
Content per day is data, not code. src/config/DaysConfig.luau hand-defines waves, lanes and attacker/thief chances for the first days. After that, DaysConfig.get(day) derives values by scaling. src/config/GameConfig.luau holds global constants (fence regen, phase length, aggro radius, co-op difficulty). Each value has its balancing math in a comment next to it, and key balance rules are locked by assert.
Gnome AI. src/server/GnomoAI.luau assigns the role on spawn and drives attackers and thieves. src/shared/Andar.luau provides locomotion without Humanoid (limited turning, acceleration and braking, gallop), reused by the dog (src/server/DogService.server.luau) and the stand customers (src/server/ClientesService.server.luau).
Economy and progression. Run fruit lives in src/server/PlayerState.luau and is never saved. Golden Seeds are saved in a versioned DataStore profile (src/server/DataService.luau). The profile holds seeds, daily streak, Harvest Shop levels (src/config/MetaConfig.luau) and mission progress (src/server/MissoesService.luau, src/config/MissoesConfig.luau). Old profiles are merged against the default schema instead of being migrated destructively.
Weapons and helpers. src/server/WeaponService.server.luau handles shooting and damage on the server. src/config/UpgradesConfig.luau defines the weapon tree, dog tiers and carpenter tiers. src/server/CarpenterService.server.luau runs the carpenter. src/server/RankingService.luau and src/server/EventService.server.luau cover the post-run ranking and random night events.
Icons. All icon asset IDs live in one table, src/shared/Icons.luau. Controllers must not hardcode rbxassetid:// values. Generated icon art is in assets/gerados/ (see assets/ICONS.md).
Project structure
src/
client/ HUD, shop, weapon, VFX, health bars, ranking, mushroom blessings, lighting
config/ GameConfig, DaysConfig, GnomosConfig, UpgradesConfig, MetaConfig, MissoesConfig, CogumelosConfig
server/ CycleManager, GnomoAI, Economy, Weapon, Carpenter, Dog, Clientes, Event,
Lobby, Meta, Missoes, Diario, Ranking, DataService, PlayerState
shared/ Modo, StateMachine, Andar, Easing, Icons
assets/ generated icons and audio, ICONS.md
default.project.json Rojo mapping
rokit.toml toolchain pin
MEGAPROMPT-*.md design prompts for the gnome-thief, lobby-retention and orchard features
default.project.json maps src/shared and src/config to ReplicatedStorage.Shared and ReplicatedStorage.Config, src/server to ServerScriptService.Server, and src/client to StarterPlayer.StarterPlayerScripts.
Status
Work in progress. The three MEGAPROMPT-*.md files at the root hold the design prompts used for the gnome-thief, lobby-retention and orchard-reskin features; check git log for what is actually implemented. There are no automated tests in the repo, and no .rbxl/.rbxlx place file, so the map side (for example workspace.Sitio.Lanes) is not versioned here.
License
All rights reserved. © Estúdio Crivy.
More side projects

Flood
A Roblox battle royale where the water rises and the last structure standing wins.

ZumbiPizza — Slice & Survive
A co-op pizza game with zombies built in Unity, with multiplayer via FishNet.

YouTube subtitle downloader
A script with a UI to download the subtitles of an entire channel at once.
