Tiradas de rareza
Lección 10 de 18 del curso Juego de Roblox: simulador de mascotas de Coddy.
Un huevo no debería dar siempre un Cat. Settings.Pets enumera todas las mascotas con una Chance sobre 100 (Cat 45, Dog 30, Bunny 15, Fox 8, Dragon 2), una rareza y un poder.
Una tirada ponderada: elige un número del 0 al 100 y después recorre la lista restando la probabilidad de cada mascota. Gana la mascota que hace que el resultado llegue a 0 o menos, así que una mascota con una probabilidad de 45 gana 45 tiradas de cada 100, en promedio:
local roll = math.random() * 100
for _, info in Settings.Pets do
roll -= info.Chance
if roll <= 0 then
return info.Name
end
endLa mascota que sale del huevo también lleva su Rarity y Power como atributos. Una tabla de las mascotas por nombre (petInfo["Fox"]) permite encontrarlas rápidamente.
Desafío
Intermedio- Crea
petInfo, conSettings.Petsindexado por Name. - En
givePet, establece los atributosRarityyPowerde la mascota a partir depetInfo. - Escribe
rollPet(), el sorteo ponderado, y haz que al eclosionar se userollPet()en lugar de Cat (el print muestra el nombre de lo que haya salido).
Pulsa Play y haz eclosionar unos cuantos. Después, Check: las comprobaciones cambian las probabilidades para asegurarse de que el resultado del sorteo las siga.
Pruébalo tú mismo
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local remotes = game.ReplicatedStorage.Remotes
local piles = workspace.Piles
local pileSpot = {} -- cada pila -> el lugar donde está
local lastHit = {} -- cada jugador -> cuándo golpeó por última vez
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- Una mascota: un StringValue en la carpeta Pets del jugador que contiene su nombre
local function givePet(player, name)
local pet = Instance.new("StringValue")
pet.Name = "Pet"
pet.Value = name
pet.Parent = player.Pets
return pet
end
-- Cada jugador recibe Coins en la tabla de clasificación
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Parent = leaderstats
-- las mascotas que poseen
local pets = Instance.new("Folder")
pets.Name = "Pets"
pets.Parent = player
end)
-- Una pila de monedas en un lugar: una copia de ServerStorage.CoinPile con su salud
-- y su valor como atributos
local function spawnPile(spot)
local pile = ServerStorage.CoinPile:Clone()
pile.Position = spot.Position
pile:SetAttribute("MaxHealth", Settings.PileHealth)
pile:SetAttribute("Health", Settings.PileHealth)
pile:SetAttribute("Value", Settings.PileValue)
pile.HealthGui.Label.Text = pile:GetAttribute("Health") .. "/" .. pile:GetAttribute("MaxHealth")
pileSpot[pile] = spot
pile.Parent = piles
return pile
end
-- Un golpe reduce en 1 la salud de una pila;
-- al llegar a 0, la pila se rompe y entrega su valor
local function hitPile(player, pile)
local health = pile:GetAttribute("Health") - 1
if health > 0 then
pile:SetAttribute("Health", health)
pile.HealthGui.Label.Text = health .. "/" .. pile:GetAttribute("MaxHealth")
return
end
player.leaderstats.Coins.Value += pile:GetAttribute("Value")
local spot = pileSpot[pile]
pileSpot[pile] = nil
pile:Destroy()
-- una nueva pila en el mismo lugar, unos segundos después
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- Una pila en cada lugar de Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
-- El cliente solicita golpear una pila. Nunca confíes en el cliente: cualquiera puede activar
-- este evento remoto con cualquier cosa, desde cualquier lugar y tan rápido como quieran.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
-- una pila real
if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
return
end
-- al alcance
local character = player.Character
local root = character and character:FindFirstChild("HumanoidRootPart")
if not root or (root.Position - pile.Position).Magnitude > Settings.Reach then
return
end
-- no demasiado rápido
local now = time()
if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
return
end
lastHit[player] = now
hitPile(player, pile)
end)
-- Eclosión: la interacción con el huevo se paga con monedas
workspace.Egg.ProximityPrompt.Triggered:Connect(function(player)
local coins = player.leaderstats.Coins
if coins.Value < Settings.EggPrice then
return
end
coins.Value -= Settings.EggPrice
local name = "Cat"
givePet(player, name)
print(player.Name .. " hatched a " .. name)
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: simulador de mascotas
3Huevos y mascotas
Incuba un huevo