§ How to · with Picoo

How to make a Roblox tycoon (with AI)

By Sametcan Tasgiran, Founder & Developer·Published ·Updated

A Roblox tycoon needs a lot of systems wired together: plots players can claim, droppers and conveyor belts, a collector that pays out, buy pads with an unlock order, rebirth, and saves that survive a server restart. Ask Picoo for a tycoon and it applies its tycoon kit (the tycoon_starter recipe), which builds a complete six-player factory tycoon in one recipe call.

19 files · 5,513 lines, 2,268 of them the vendored ProfileStore module · one recipe call. Plot1 is built in Edit mode; plots 2-6 are copies of it made when the server starts.

Droppers and conveyor belts

Droppers spawn cubes on a timer. Belts are anchored parts moved by AssemblyLinearVelocity, and cubes collide only with belts and rails, never with each other or with players, so lines do not jam and nobody can knock a drop away. Turbo Belts speed a floor up.

Collectors paid by the server

Cubes are server-owned parts that carry their value in an attribute. Money moves only when a cube touches its own plot's collector intake on the server; upgraders on the line multiply a cube's value as it passes, and furnaces multiply the payout.

Six plots, 42 purchases

Each joining player gets a free plot and the camera glides to it. Every plot has 42 buy pads over three floors: 13 droppers, 6 upgraders, 3 furnaces, 2 turbo belts, 2 vaults, 7 decorations, 6 walls, 2 floors and a roof with a neon sign. Walk onto a pad to buy it; a light beam points to the next one you can afford.

Rebirth: +50% income each time

Finish the roof to unlock the rebirth pad. On the default settings rebirth costs $3.2M, clears every purchase, resets cash to $15 and multiplies all income by 1 + 0.5 × rebirths.

ProfileStore saves + offline earnings

Cash, rebirths and purchases save through ProfileStore: session-locked, auto-saving, flushed on shutdown, and kept in its in-memory Mock while you test in Studio. Returning players get 25% of their income rate for the time they were away, up to 8 hours.

Themes and pacing by prompt

Ask for a candy or space tycoon, a faster or longer game, or your own item and currency names. The kit reads theme (factory, candy, space), pace, length, archetype (conveyor, idle, upgrader), title and cash name, and a later settings change rebuilds only the kit's own parts, keeps player saves, and asks first if you have edited the kit.

Files Picoo ships for this prompt

19 files · 5513 lines · one recipe call

ServerScriptService/FactoryTycoon/Main.lua

Boots the tycoon; lets the kit's own Lighting effects win over the place's defaults

28 lines

ServerScriptService/FactoryTycoon/TycoonService.lua

Plots, ownership, buy pads, purchases, rebirth, income, offline earnings

876 lines

ServerScriptService/FactoryTycoon/DropService.lua

Dropper scheduler, belts, scanners and collector intakes

309 lines

ServerScriptService/FactoryTycoon/DataService.lua

ProfileStore sessions: load, release, Studio save round-trip

134 lines

ServerScriptService/FactoryTycoon/ProfileStore.lua

Vendored ProfileStore v1.0.3 (MadStudioRoblox, Apache 2.0)

2268 lines

ServerScriptService/FactoryTycoon/ProfileStore_LICENSE.lua

ProfileStore's Apache 2.0 license text

207 lines

ServerScriptService/FactoryTycoon/PlotCloner.lua

Copies Plot1 into plots 2-6 when the server starts

99 lines

ServerScriptService/FactoryTycoon/MeshDresser.lua

Keeps the CC0 Kenney models Edit mode already shows; a stand-in comes back where a model fails to load

269 lines

ServerScriptService/FactoryTycoon/Fx.lua

Build-in tweens, particle bursts, positional sounds

215 lines

ServerScriptService/FactoryTycoon/SelfTest.lua

Studio-only check that prints one TYCOON_SELFTEST line after 60 s

292 lines

ServerScriptService/FactoryTycoon/PicooKit.lua

Marker that lets Picoo change the kit's settings later

5 lines

ReplicatedStorage/FactoryTycoon/Config.lua

Generated prices, items and settings

127 lines

ReplicatedStorage/FactoryTycoon/Shared.lua

Economy math and number formatting shared by server and client

150 lines

StarterPlayer/StarterPlayerScripts/FactoryTycoonClient.lua

HUD, camera glide, guide beam, popups, toasts, music

534 lines

ReplicatedStorage/FactoryTycoon/Remotes

TycoonEvent (server notices to the client) and RequestRebirth

instance

Workspace/FactoryTycoon

The plaza and map, 484 instances

instance

Workspace/FactoryTycoon/Plots/Plot1

The template plot, 972 instances: base, belts, collectors, buy pads and the 42 items

instance

StarterGui/TycoonHUD

The HUD ScreenGui, 50 instances

instance

Lighting/FactoryTycoon* + Workspace/Terrain/FactoryTycoonClouds

Atmosphere, Sky, Bloom, SunRays, ColorCorrection and Clouds for the kit's look

instance

Sample output: ServerScriptService/FactoryTycoon/DropService.lua

--!strict
-- Droppers, belts, scanners, collectors. Server-authoritative end to end:
-- cubes are server-owned physics parts (SetNetworkOwner(nil)), the value
-- lives in an attribute the client never writes, and money moves only when a
-- cube touches a collector intake on the server.
--
-- Jam-proofing: cubes collide with the belt and rails only. They do NOT
-- collide with each other (no pile-ups) or with players (no blocking or
-- stealing), there is a per-plot cap, and every cube expires.

-- (excerpt: the collector intake, where money is made)

local function isOurCube(plot: PlotLike, hit: BasePart): boolean
	return hit.Name == "Drop" and hit:GetAttribute("Plot") == plot.index and hit:GetAttribute("Paid") ~= true
end

local function furnaceMult(owned: { [string]: boolean }, floor: number): number
	local m = 1
	for _, item in Config.Items do
		if owned[item.Id] and item.Floor == floor and item.Kind == "furnace" then
			m *= item.LineMult
		end
	end
	return m
end

local function wireIntake(plot: PlotLike, floor: number, intake: BasePart)
	intake.Touched:Connect(function(hit: BasePart)
		if not isOurCube(plot, hit) then
			return
		end
		hit:SetAttribute("Paid", true)
		local owned = plot.owned()
		local value = (hit:GetAttribute("Value") :: number?) or 0
		local amount = value * furnaceMult(owned, floor) * Shared.globalMult(owned) * Shared.rebirthMult(plot.rebirths())
		local probe = probes[hit]
		if probe then
			probes[hit] = nil
			local born = hit:GetAttribute("Born")
			probe(os.clock() - (if type(born) == "number" then born else os.clock()))
		end
		if plot.active() then
			onCollect(plot, amount, hit)
		end
		-- pop + sparkle; the "cha-ching" is throttled per plot so a busy belt hums instead of spamming
		local now = os.clock()
		if now - plot.lastCollectFx > 0.22 then
			plot.lastCollectFx = now
			Fx.sound(Config.Sounds.Collect, intake, 0.35, 0.95 + math.random() * 0.2)
			Fx.burst(hit.Position, hit.Color, 8, 10)
		end
		hit.CanTouch = false
		hit.Anchored = true
		TweenService:Create(hit, TweenInfo.new(0.15), { Size = CUBE_SIZE * 0.1, Transparency = 1 }):Play()
		Debris:AddItem(hit, 0.2)
	end)
end

Building a Roblox tycoon

Tycoons are one of the biggest genres on Roblox, and one of the most fragile to ship. The two failure modes that sink tycoons in their first week: an economy where the next purchase is either instant or out of reach, and a save flow that drops progress. Picoo's tycoon kit is built around both.

Prices are not hand-typed. The kit generates them from its settings (pace, length and archetype) and simulates the economy, so on the defaults the first purchase comes about 6 seconds in (the $15 Starter Dropper) and the first rebirth around 20 minutes. Rebirth adds a flat 50% to income each time (1 + 0.5 × rebirths), costs $3.2M on the default settings, and needs the roof first. To retune, ask for a faster, slower, shorter or longer tycoon; the Config header says the same thing: change the knobs, not the numbers.

Saves go through ProfileStore, vendored into the kit: each player's profile is session-locked to one server, auto-saved, and flushed when the server shuts down. If the profile is opened on another server, the player is asked to rejoin instead of two servers writing the same data. In Studio the kit uses ProfileStore's Mock store, so pressing Play never touches live data, and a Studio-only self-test drives a spare plot through purchases, income and a rebirth, checks the save round-trip, and prints one TYCOON_SELFTEST line after 60 seconds.

Plots are copies of one template. Plot1 is built in Edit mode where you can see and change it, and PlotCloner copies it into plots 2 to 6 around the plaza when the server starts. Cubes are server-owned physics parts tagged with their plot, so a collector only pays the plot that made them, and they pass through players and each other. Because the tycoon is a whole game with its own map, economy and saves, Picoo builds it in an empty place; on a place that already holds a game it offers a new place or asks which single mechanic you want there instead.

See more on the Luau generator, the AI Luau script writer, the 3D model generator and the game builder, read how Picoo compares with ChatGPT, or browse the full blog.

Frequently asked

Does each player get their own plot?+

Yes. The map has six plots around a central plaza. A joining player is given the first free plot, the camera glides to it, and its sign shows the owner's name. Plot1 is the one built in Edit mode; plots 2-6 are copies of it made when the server starts, so editing Plot1 changes every plot. On a full server a player waits, with a message, until a plot frees up.

Does the tycoon save progress?+

Yes. DataService saves cash, rebirths, owned items and total earned through ProfileStore, which locks each profile to one server, auto-saves and flushes on shutdown. In Studio it uses ProfileStore's in-memory Mock, so testing never touches your live DataStore. Returning players also collect offline earnings: 25% of their income rate for up to 8 hours away.

Can I add gamepass perks?+

Ask for them in a follow-up prompt, for example 'add a 2x cash gamepass'. Cube payouts and vault income both pass through TycoonService.credit, which is where a gamepass multiplier hooks in.

How does rebirth math work?+

Finish the roof to unlock the rebirth pad. On the default settings rebirth costs $3.2M; it clears every purchase, resets cash to $15 and sets your income multiplier to 1 + 0.5 × rebirths, so the first rebirth gives +50% and the second +100%. The kit generates prices from its settings and simulates the economy: the first rebirth lands around 20 minutes on the default length, about 13 on short and 27 on long.

Can I add upgrade buttons (faster dropper, better drops)?+

The kit already has them as buy pads: upgraders (scanners, polishers, cutters, presses) multiply each cube's value as it passes, furnaces multiply what the collector pays, Turbo Belts speed up a floor's belt and droppers, and vaults pay passive income every second. For different upgrades, ask in a follow-up prompt.

Related Picoo prompts