Tirages de rareté
Leçon 10 sur 18 du cours Jeu Roblox : Simulateur d’animaux de Coddy.
Un œuf ne devrait pas toujours donner un Cat. Settings.Pets répertorie tous les animaux avec une Chance sur 100 (Cat 45, Dog 30, Bunny 15, Fox 8, Dragon 2), une rareté et une puissance.
Un tirage pondéré : choisis un nombre entre 0 et 100, puis parcours la liste en soustrayant la chance de chaque animal. L’animal qui fait descendre le résultat à 0 ou moins gagne, ainsi un animal avec une chance de 45 gagne en moyenne 45 tirages sur 100 :
local roll = math.random() * 100
for _, info in Settings.Pets do
roll -= info.Chance
if roll <= 0 then
return info.Name
end
endL’animal éclos porte également sa Rarity et sa Power sous forme d’attributs. Une table des animaux par nom (petInfo["Fox"]) permet de les trouver rapidement.
Défi
Moyen- Construis
petInfo, avecSettings.Petsindexé par Name. - Dans
givePet, définis les attributsRarityetPowerde l’animal à partir depetInfo. - Écris
rollPet(), le tirage pondéré, et fais éclore le résultat derollPet()au lieu d’un Cat (l’instruction print affiche le nom de l’animal éclos).
Appuie sur Play et fais éclore quelques animaux. Puis Check : les vérifications modifient les chances pour s’assurer que ton tirage les respecte.
Essayez vous-même
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 = {} -- chaque pile -> l’emplacement où elle se trouve
local lastHit = {} -- chaque joueur -> le moment de son dernier coup
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- Un animal de compagnie : un StringValue dans le dossier Pets du joueur qui contient son nom
local function givePet(player, name)
local pet = Instance.new("StringValue")
pet.Name = "Pet"
pet.Value = name
pet.Parent = player.Pets
return pet
end
-- Chaque joueur reçoit Coins dans le classement
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
-- les animaux de compagnie qu’ils possèdent
local pets = Instance.new("Folder")
pets.Name = "Pets"
pets.Parent = player
end)
-- Une pile de pièces sur un emplacement : une copie de ServerStorage.CoinPile avec sa santé
-- et sa valeur comme attributs
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 coup retire 1 point de santé à une pile ;
-- à 0, la pile se brise et rapporte sa valeur
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()
-- une nouvelle pile au même emplacement, quelques secondes plus tard
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- Une pile sur chaque emplacement de Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
-- Le client demande à frapper une pile. Ne faites jamais confiance au client : n’importe qui peut déclencher
-- cet événement distant avec n’importe quelle donnée, depuis n’importe où, aussi vite qu’il le souhaite.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
-- un vrai tas
if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
return
end
-- à portée
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
-- pas trop vite
local now = time()
if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
return
end
lastHit[player] = now
hitPile(player, pile)
end)
-- Éclosion : l’invite de l’œuf, payée en pièces
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)
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Jeu Roblox : Simulateur d’animaux
3Œufs et familiers
Faire éclore un œuf