I’m making the room to always spawn in the 1000th room (Just like Doors would).
But I don’t know how.
Here is the script.
Server:
local room = require(script.Room)
local door = require(script.Room.Door)
local prevRoom = workspace.StartRoom
local firstDoor = door.New(prevRoom, 0)
for i = 1, 1000 do
prevRoom = room.Generate(prevRoom, i)
end
Here are the module scripts.
Room:
local door = require(script.Door)
local room = {}
room.info = require(script.RoomInfo)
room.lastTurnDirection = nil
room.random = Random.new()
function room.GetRandom(prevRoom)
local totalRarity = 0
for i, info in pairs(room.info) do
totalRarity += info.Rarity
end
local randomRarity = room.random:NextNumber(0, totalRarity)
local currentRarity = 0
local randomRoom = nil
for i, info in pairs(room.info) do
currentRarity += info.Rarity
if randomRarity <= currentRarity then
randomRoom = workspace.Rooms[i]
break
end
end
local direction = room.info[randomRoom.Name]["Direction"]
if (prevRoom.Name == randomRoom.Name)
or (direction and direction == room.lastTurnDirection)
then
return room.GetRandom(prevRoom)
else
if direction then
room.lastTurnDirection = direction
end
return randomRoom
end
end
function room.Generate(prevRoom, number)
local randomRoom = room.GetRandom(prevRoom)
local newRoom = randomRoom:Clone()
newRoom.PrimaryPart = newRoom.Entrance
newRoom:PivotTo(prevRoom.Exit.CFrame)
local newDoor = door.New(newRoom, number)
newRoom.Parent = workspace.GeneratedRooms
return newRoom
end
return room
RoomInfo:
local roomInfo = {
["StartRoom"] = {
["Rarity"] = 0
},
["Room"] = {
["Rarity"] = 20
},
["Hallway"] = {
["Rarity"] = 20
},
["LongHallway"] = {
["Rarity"] = 10
},
["LeftTurnHallway"] = {
["Direction"] = "Left",
["Rarity"] = 10
},
["RightTurnHallway"] = {
["Direction"] = "Right",
["Rarity"] = 9
},
["RoomWithActiveWindow"] = {
["Rarity"] = 1
},
["RoomWithInactiveWindow"] = {
["Rarity"] = 10
},
["RightTurnRoom"] = {
["Direction"] = "Right",
["Rarity"] = 10
},
["LeftTurnRoom"] = {
["Direction"] = "Left",
["Rarity"] = 10
},
}
return roomInfo
Door:
local TweenService = game:GetService("TweenService")
local door = {}
function door.Open(doorModel)
doorModel:SetAttribute("Open", true)
local opencframe = doorModel.Hinge.CFrame * CFrame.Angles(0, math.rad(100), 0)
local doorTween = TweenService:Create(doorModel.Hinge, TweenInfo.new(0.5), {CFrame = opencframe})
doorTween:Play()
doorModel.Door.Open:Play()
end
function door.New(roomModel, number)
local doorModel = game.ReplicatedStorage.Door:Clone()
doorModel:PivotTo(roomModel.Exit.CFrame)
doorModel:SetAttribute("Open", false)
doorModel.Sign.SurfaceGui.TextLabel.Text = "Funroom "..number
doorModel.Sensor.Touched:Connect(function(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid and not doorModel:GetAttribute("Open") then
door.Open(doorModel)
end
end)
doorModel.Parent = roomModel
return doorModel
end
return door
Any help is appreciated, thanks.