← All side projects
Game2026 · In progress

Zumbi Harvest

A Roblox game in Luau with a day cycle, economy, upgrades and zombie AI.

Zumbi Harvest: project cover image
TypeGame
StatusIn progress
Year2026
Stackluau, roblox, rojo
made at Estúdio Crivy

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_coletivo and horda.
  • 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

  1. Install the Rojo version pinned in rokit.toml (run rokit install if you have Rokit, or install Rojo 7.7.0 manually).
  2. Start the Rojo server from default.project.json:
    rojo serve
  3. 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