§ 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)
endBuilding 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
Roblox simulator
5 files · 1,158 lines · one recipe call. Collect orbs, buy upgrades, rebirth for a bigger multiplier.
Roblox shop system
8 files · 1,259 lines, 852 of them the shared PicooFeedback module · one recipe call. Three starter items by default; name your own items and prices in the prompt.
How to use Roblox DataStore the right way
1 file · 155 lines · one recipe call. Saves one number per player; name the stat, its starting value and the autosave interval in the prompt.