Tiradas de rareza
Lección 10 de 20 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
IntermedioDetermina qué mascota sale del huevo según la probabilidad de cada mascota.
- Crea
petInfo:Settings.Petsindexado por Name. - En
givePet, establece los atributosRarityyPowera partir depetInfo[name]. - Escribe
rollPet(), la selección ponderada, y haz que salga del huevorollPet()en lugar de un Cat; la impresión indica qué mascota salió del huevo.
Pulsa «Jugar» y haz que salgan unas cuantas mascotas del huevo: de vez en cuando, Output muestra el nombre de una mascota diferente. Después, pulsa «Comprobar».
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 montón -> el lugar en el que 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)
-- Un montón 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 un montón;
-- al llegar a 0, el montón 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()
-- un montón nuevo en el mismo lugar, unos segundos después
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- Un montón en cada lugar de Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
-- El cliente solicita golpear un montón. Nunca confíes en el cliente: cualquiera puede activar
-- este evento remoto con cualquier cosa, desde cualquier lugar, 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)
-- Lección 10: aquí va Rarity Rolls
-- Eclosión: la interacción del 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)
Todas las lecciones de Juego de Roblox: Simulador de mascotas
3Huevos y mascotas
Incuba un huevoPractica por tu cuenta: Playground de Roblox