Bonificación de renacimiento
Lección 16 de 18 del curso Juego de Roblox: Magnate de fábrica de Coddy.
Un renacimiento solo vale la pena si resulta rentable. Cada renacimiento suma Settings.RebirthBonus (0.5) a un multiplicador aplicado a todo lo que paga el recolector: 1 renacimiento permite ganar 1.5 veces más, y 2 renacimientos, el doble.
value = math.floor(value * (1 + rebirths * Settings.RebirthBonus))math.floor mantiene Cash como un número entero: de todos modos, un IntValue solo almacena números enteros, y redondear hacia abajo a propósito significa que tú eliges cómo hacerlo, en lugar de dejar que lo elija el IntValue.
Desafío
DifícilEn el colector, antes de pagar al propietario, multiplica el valor del mineral por 1 + Rebirths * Settings.RebirthBonus (los Rebirths del propietario), redondeado hacia abajo con math.floor.
Pulsa Play, renace y observa cómo cada mineral paga más. Después, pulsa Check.
Pruébalo tú mismo
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local TweenService = game:GetService("TweenService")
local Debris = game:GetService("Debris")
local Settings = require(game.ReplicatedStorage.Settings)
local tycoon = workspace.Tycoon
local items = ServerStorage.TycoonItems
local rebirthPad = ServerStorage.RebirthPad
local owner = nil
local headline = "Step on the green pad to claim this factory"
local earned = 0
print("Ore is worth " .. Settings.OreValue .. " Cash")
-- Cada jugador recibe Cash y Rebirths en la tabla de clasificación
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local cash = Instance.new("IntValue")
cash.Name = "Cash"
cash.Parent = leaderstats
local rebirths = Instance.new("IntValue")
rebirths.Name = "Rebirths"
rebirths.Parent = leaderstats
end)
-- El letrero sobre la fábrica
local gui = Instance.new("SurfaceGui")
gui.Parent = tycoon.Sign
local signLabel = Instance.new("TextLabel")
signLabel.Name = "Status"
signLabel.Size = UDim2.fromScale(1, 1)
signLabel.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
signLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
signLabel.TextScaled = true
signLabel.Text = "Step on the green pad to claim this factory"
signLabel.Parent = gui
local function setSign(text)
signLabel.Text = text
end
-- Ore: una pieza pequeña que vale Cash y cae debajo de un dispensador
local function dropOre(dropper)
local ore = Instance.new("Part")
ore.Name = "Ore"
ore.Size = Vector3.new(1, 1, 1)
ore.Color = Color3.fromRGB(150, 150, 160)
ore.Position = dropper.Position - Vector3.new(0, 2.5, 0)
ore:SetAttribute("Value", Settings.OreValue)
if math.random() < Settings.GoldChance then
ore.Color = Color3.fromRGB(255, 200, 40)
ore.Material = Enum.Material.Neon
ore:SetAttribute("Value", Settings.OreValue * 5)
end
ore.Parent = workspace
Debris:AddItem(ore, 20)
end
-- Un dispensador ejecuta un solo bucle, sin importar cuántas veces se inicie
local function startDropper(dropper)
if dropper:GetAttribute("Running") then
return
end
dropper:SetAttribute("Running", true)
task.spawn(function()
while dropper:IsDescendantOf(workspace) do
dropOre(dropper)
task.wait(Settings.DropInterval)
end
dropper:SetAttribute("Running", nil)
end)
end
-- La cinta transportadora mueve todo lo que se apoye sobre ella
tycoon.Conveyor.AssemblyLinearVelocity = Vector3.new(Settings.BeltSpeed, 0, 0)
-- El recolector convierte Ore en Cash
tycoon.Collector.Touched:Connect(function(hit)
if hit.Name == "Ore" then
local value = hit:GetAttribute("Value")
hit:Destroy()
if owner then
owner.leaderstats.Cash.Value += value
earned += value
end
end
end)
-- El mejorador duplica el valor de cada Ore que pasa por él, una sola vez
items.Upgrader.Touched:Connect(function(hit)
if hit.Name == "Ore" and not hit:GetAttribute("Upgraded") then
hit:SetAttribute("Upgraded", true)
hit:SetAttribute("Value", hit:GetAttribute("Value") * 2)
hit.Color = Color3.fromRGB(155, 89, 182)
end
end)
-- Plataformas que esperan a que se construya primero un objeto
local waiting = Instance.new("Folder")
waiting.Name = "WaitingPads"
waiting.Parent = ServerStorage
-- Plataformas ya compradas, guardadas para el próximo renacimiento
local bought = Instance.new("Folder")
bought.Name = "BoughtPads"
bought.Parent = ServerStorage
-- Una pieza nueva asciende hasta su lugar
local function riseIn(part)
local goal = part.Position
local transparency = part.Transparency
part.Position = goal - Vector3.new(0, 8, 0)
part.Transparency = 1
TweenService:Create(part, TweenInfo.new(1), { Position = goal, Transparency = transparency }):Play()
end
local function checkComplete()
if #tycoon.Buttons:GetChildren() == 0 and #waiting:GetChildren() == 0 then
headline = "Factory complete! Step on the purple pad to rebirth"
setSign(headline)
rebirthPad.Parent = tycoon
end
end
-- Coloca un objeto comprado en la fábrica
local function build(item)
item.Parent = tycoon.Built
if item:IsA("BasePart") then
riseIn(item)
end
for _, part in item:GetDescendants() do
if part:IsA("BasePart") then
riseIn(part)
end
end
if item:HasTag("Dropper") then
-- empieza a soltar Ore una vez que esté en su lugar
task.delay(1, startDropper, item)
end
for _, pad in waiting:GetChildren() do
if pad:GetAttribute("After") == item.Name then
pad.Parent = tycoon.Buttons
end
end
checkComplete()
end
-- Compra: la plataforma desaparece y se construye su objeto
local function buy(pad, player)
if player ~= owner or pad.Parent ~= tycoon.Buttons then
return
end
local cash = player.leaderstats.Cash
local price = pad:GetAttribute("Price")
if cash.Value < price then
return
end
cash.Value -= price
pad.Parent = bought
build(items:FindFirstChild(pad:GetAttribute("Item")))
end
for _, pad in tycoon.Buttons:GetChildren() do
pad.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player then
buy(pad, player)
end
end)
end
-- Una etiqueta de precio flota sobre cada plataforma
for _, pad in tycoon.Buttons:GetChildren() do
local tag = Instance.new("BillboardGui")
tag.Name = "PriceTag"
tag.Size = UDim2.fromOffset(160, 40)
tag.StudsOffset = Vector3.new(0, 3, 0)
tag.Parent = pad
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
label.BackgroundTransparency = 0.2
label.TextColor3 = Color3.fromRGB(255, 255, 255)
label.TextScaled = true
label.Text = pad:GetAttribute("Label") .. ": $" .. pad:GetAttribute("Price")
label.Parent = tag
end
-- Al principio solo se muestran las primeras plataformas
for _, pad in tycoon.Buttons:GetChildren() do
if pad:GetAttribute("After") then
pad.Parent = waiting
end
end
-- Vuelta a una fábrica vacía: los objetos vuelven al almacén y las plataformas a su posición inicial
local function resetFactory()
rebirthPad.Parent = ServerStorage
for _, item in tycoon.Built:GetChildren() do
item.Parent = items
end
for _, pad in bought:GetChildren() do
if pad:GetAttribute("After") then
pad.Parent = waiting
else
pad.Parent = tycoon.Buttons
end
end
end
rebirthPad.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player and player == owner and rebirthPad.Parent == tycoon then
resetFactory()
player.leaderstats.Rebirths.Value += 1
player.leaderstats.Cash.Value = 0
headline = player.Name .. "'s Factory"
setSign(headline)
end
end)
-- El letrero muestra los ingresos del propietario cada 5 segundos
task.spawn(function()
while true do
task.wait(5)
if owner then
setSign(headline .. "\n$" .. math.floor(earned / 5) .. " a second")
end
earned = 0
end
end)
-- Reclamación: el primer jugador que pisa la plataforma se convierte en dueño de la fábrica
local claimPad = tycoon.ClaimPad
claimPad.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player and not owner then
owner = player
claimPad.Color = Color3.fromRGB(120, 120, 120)
claimPad.Material = Enum.Material.SmoothPlastic
headline = player.Name .. "'s Factory"
setSign(headline)
for _, dropper in CollectionService:GetTagged("Dropper") do
if dropper:IsDescendantOf(workspace) then
startDropper(dropper)
end
end
end
end)
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Juego de Roblox: Magnate de fábrica
4Conviértelo en un juego
Fábrica completada