Rooms Fangame Ideas

Please let me know if this is off topic.

You can write your topic however you want, but you need to answer these questions:

  1. What do you want to achieve? Keep it simple and clear!
    A rooms fangame with nice mechanics

  2. What is the issue? Include enough details if possible!
    I am out of ideas. I want hiding spot ideas, Entity ideas, Etc.

  3. What solutions have you thought of so far?
    Watching YouTube, of course that failed me.

After that, you should include more details if you have any. Try to make your topic as descriptive as possible, so that it’s easier for people to help you!
Here is a recording of my game so far (take note that i used the roblox default recorder):
robloxapp-20240201-1811034.wmv (7.8 MB)

3 Likes

Hey. I can’t watch your video since QuickTime can’t play the file type, is there a way you could attach it directly in the devforum?

I feel like the basic locker and table hiding spots are pretty good, so in order for them to stand out you need good sounds, animations, and especially models. In general good models will make your game stand out the most, so maybe try using blender if you haven’t. Other ideas could maybe be like a vent in some rooms, or a side room to block you from the entity. For the entities, give them all different mechanics. Basically quality over quantity. In my opinion, having only a few entities all with different, well-designed and non repetitive mechanics would be better than having a ton of them with the same basic mechanics that would get boring really fast. I myself don’t have any amazing ideas for the actual mechanics the entities, but just think about what a png image rushing through an abandoned office building would do I guess :rofl:. Again good sound design will make the entities fell that much scarier and well put together.

Also, I am also currently making a rooms fan game. I have also lost motivation and inspiration, but one thing I can say is make it different. There are so many rooms fan games out there and some of them are good, but most get boring really quickly because they are all pretty much the same, the mechanics are lame, and it doesn’t feel like the devs put all their effort into it. So you need to make yours stand out, you don’t want it to be like the rest of them. I don’t blame you for running out of ideas, since making actually good fan games can be pretty difficult.

Edit: I just used a .wmv player I found and the mechanics seem pretty decent so far. I especially like how the entity leaves a mark/imprint on the door. But before you start the building process, I would suggest improving your models with blender or something. It might feel difficult and complicated at first, but I promise it will pay off and can honestly be pretty fun to just mess around with (for example I model random crap on my desk when im bored).

i didn’t learn blender ;-;, but anyways i really did upgrade it! you can try it here if you want to see it so far and give better info: (EARLY ACCESS) Unhinged Rooms - Roblox

1 Like

So far, it seems pretty solid. Although it is a bit basic, everything is straight forward and it doesn’t take too long for the action to start. But there are three main things that could be improved in my opinion:

1. Interaction methods
All of the interaction methods were different. For example, the doors used click detectors, and everything else used proximity prompts. As for the prompts, all the key codes were different. You should stick to one method for interacting with objects (ie a prompt triggered by E)

2. Entities
I only played until I saw the first entity because I am in a hurry, but the problem I have is the roll-off distance of its sound. You could only hear it from a short distance, which makes it really hard to hide in time. Again, I only saw the first entity a single time so I don’t know it is different the second time around when there’s no special room for it telling you to hide. If it is the same, maybe consider adding a spawn sound or something?

3. Lighting
The last major improvement that could be made (in my opinion) is the lighting. You can kinda see the light through the corners and edges of the rooms, which can be changed with the enviornmentaldiffusescale and the enviornmentalspecularscale. Most rooms games don’t have physical lights, but I think that makes everything look dull, so you could add lights to expose the normal maps. I did it in my game, and it makes it look 10 times better.

Everything else is good, the only other thing I would suggest adding is more camera movement (camera bobbing/sway, screen shaking when entities go by) and material based footstep sounds. Besides that, good job.

1 Like

thank you! also i don’t want screen shake because it would not be realistic, seriously, is it really THAT loud?

Nevermind. I added screenshake and it seems much more like you are timed.

1 Like

I sort of agree. Most games do get it wrong, such as interminable rooms which shakes your screen so hard it goes out of the locker… Since the intensity does rely mainly on the sound, maybe adding a very mild one like in the rooms from doors would be good because it will make the entities feel larger and more dangerous. Also, it does feel like the entities would be pretty loud in real life, but I do agree about intense screen shaking being very unrealistic.

1 Like

but how? my game does rely on clones, and if it relies on clones, it will not have one sound.

1 Like

Explain more, i don’t really know what you mean when you say clones.

i mean :Clone(), heres my script

local prevactive = false
local timesclicked = 0
script.Parent.MaxActivationDistance = 10
script.Parent.MouseClick:Connect(function(PlayerMain)
	if not PlayerMain.Character:FindFirstChildOfClass("Humanoid"):HasTag("Hidden") and not PlayerMain.Character:FindFirstChildOfClass("Humanoid"):HasTag("Died") and prevactive == false then
		prevactive = true
		timesclicked += 1
		if timesclicked == 2 then
			print("Error.")
		end
		script.Parent.MaxActivationDistance = 0
		local Rooms = workspace.Rooms:GetChildren()
		local RustedRooms = workspace.RustedRooms:GetChildren()
			Room = RustedRooms[math.random(1, #RustedRooms)]:Clone()
			game.Lighting.Offset.Brightness -= 0.001
		if workspace.RoomValue.Value <= 98 or math.random(1, 35) == 1 then
			Room = Rooms[math.random(1, #Rooms)]:Clone()
			game.Lighting.Offset.Brightness -= 0.001
			end
		if workspace.RoomValue.Value == 24 then
			Room = workspace["20throom"]:Clone()
		end
		if workspace.RoomValue.Value == 39 then
			Room = workspace["Room40"]:Clone()
		end
		workspace.RoomValue.Value += 1
		Room.PrimaryPart = Room:WaitForChild("Entrance")
		Room:SetPrimaryPartCFrame(workspace.Room.Value.Exit.CFrame)
		Room.Exit.Transparency = 1
		Room.Exit.CanCollide = false
		Room.Entrance.Transparency = 1
		Room.Entrance.CanCollide = false
		Room.Parent = workspace.CreatedRooms
		if Room:FindFirstChild("Label") then
			local Label = Room:FindFirstChild("Label")
			if Label:FindFirstChildOfClass("SurfaceGui") and Label:FindFirstChildOfClass("SurfaceGui"):FindFirstChildOfClass("TextLabel") then
				Label:FindFirstChildOfClass("SurfaceGui"):FindFirstChildOfClass("TextLabel").Text = "A/" .. workspace.RoomValue.Value + 1
			end
		end
		if workspace.RoomValue.Value == 1 then
			workspace.Music.Playing = true
		end
		if workspace.RoomValue.Value == 75 then
			workspace.PowerOut1:Play()
			wait(0.1)
			workspace.PowerOut2:Play()
			workspace.PowerOut3:Play()
			game.Lighting.Offset.Brightness -= 0.1
		end
		if workspace.RoomValue.Value == 25 then
			for i = 1, 10 do
				workspace.Music.Volume = 1 - (1 / 10)
			end
			workspace.Music.Playing = false
		end
		if workspace.RoomValue.Value == 300 then
			workspace.Complete.Playing = true
		end
		workspace.Room.Value = Room
		local MeClone = script.Parent.Parent.Parent:Clone()
		MeClone:PivotTo(workspace.Room.Value.Exit.CFrame)
		MeClone.Parent = workspace
		MeClone.Door.ClickDetector.MaxActivationDistance = 10
		wait(0.1)
		for i, decal in ipairs(MeClone.Door:GetChildren()) do
			if decal.ClassName == "Decal" then
				decal:Destroy()
			end
		end
		script.Parent.MaxActivationDistance = 0
		workspace.Start.SpawnLocation.Position = Room.WorldPivot.Position + Vector3.new(0, -2.5, 0)
		if workspace.RoomValue.Value == 1 then
			Tween = game:GetService("TweenService"):Create(script.Parent.Parent, TweenInfo.new(3, Enum.EasingStyle.Circular, Enum.EasingDirection.In, 0, false, 0), {["Position"] = script.Parent.Parent.Position + Vector3.new((script.Parent.Parent.Size.X / 2) - 0.5, 0, (script.Parent.Parent.Size.Z / 2) + 1), ["Orientation"] = script.Parent.Parent.Orientation + Vector3.new(0, 90, 0)})
			else
			Tween = game:GetService("TweenService"):Create(script.Parent.Parent, TweenInfo.new(0.5, Enum.EasingStyle.Circular, Enum.EasingDirection.In, 0, false, 0), {["Position"] = script.Parent.Parent.Position + Vector3.new((script.Parent.Parent.Size.X / 2) - 0.5, 0, (script.Parent.Parent.Size.Z / 2) + 1), ["Orientation"] = script.Parent.Parent.Orientation + Vector3.new(0, 90, 0)})
		end
		script.Parent.Parent.DoorStart:Play()
		if workspace.RoomValue.Value == 1 then
			script.Parent.Parent.DoorCreak.PlaybackSpeed = 0.5
			else
			script.Parent.Parent.DoorCreak.PlaybackSpeed = (math.random(-10000, 10000) / 100000) + 0.5
		end
		script.Parent.Parent.DoorMid:Play()
		Tween:Play()
		script.Parent.Parent.DoorCreak:Play()
		wait(Tween.TweenInfo.Time)
		script.Parent.Parent.DoorBang.PlaybackSpeed = (math.random(-500, 500) / 1000) + 0.5
		script.Parent.Parent.DoorBang:Play()

		local function A60Entity()
			local A60 = game.ReplicatedStorage.Script:Clone()
			A60.Parent = workspace
			A60["A-60"].Position = script.Parent.Parent.Position - Vector3.new(0, 0, 1000)
			A60["A-60"].Static.Playing = true
			A60["A-60"].Rumble.Playing = true
			local Tween60 = game:GetService("TweenService"):Create(A60["A-60"], TweenInfo.new(25, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0), {["Position"] = script.Parent.Parent.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			local Waypoints = workspace.Room.Value:FindFirstChild("Waypoints"):GetChildren()
			local SelectPoint = Waypoints[1]
			for i, way in pairs(Waypoints) do
				if SelectPoint:IsA("Part") then
					Tween60 = game:GetService("TweenService"):Create(A60["A-60"], TweenInfo.new(0.5, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0), {["Position"] = SelectPoint.Position})
					Tween60:Play()
					wait(Tween60.TweenInfo.Time)
					local SelectPoint = Waypoints[i + 1]
				end
			end
			Tween60 = game:GetService("TweenService"):Create(A60["A-60"], TweenInfo.new(0.5, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0), {["Position"] = MeClone.Door.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			for i, face in pairs(A60["A-60"].Art:GetChildren()) do
				if face:IsA("ImageLabel") and face.Visible == true then
					local Decal = Instance.new("Decal")
					Decal.Face = "Front"
					Decal.Texture = face.Image
					Decal.Parent = MeClone.Door
					Decal.Transparency = 0.75
					Decal.Color3 = Color3.fromRGB(0, 0, 0)
				end
			end
			A60:Destroy()
			workspace["A-60Imprint"]:Play()
		end
		
		local function A200Entity()
			for i, obj in pairs(Room:GetChildren()) do
				if (obj.Name == "Locker" and obj.ClassName == "Model") or (obj.Name == "SafeLocker" and obj.ClassName == "Model") or (obj.Name == "Fridge" and obj.ClassName == "Model") then
					obj:Destroy()
				end
				if (obj.Name == "Shelf" and obj.ClassName == "Model") then
					obj:Destroy()
				end
			end
			script.Parent.Parent.A200Cue:Play()
			game.Lighting.Filmic.Enabled = true
			wait(30)
			local A200 = game.ReplicatedStorage.A200:Clone()
			A200.Parent = workspace
			A200["A-200"].Position = workspace.Start.Exit.Position
			A200["A-200"].Static.Playing = true
			A200["A-200"].Grumble.Playing = true
			local Tween60 = game:GetService("TweenService"):Create(A200["A-200"], TweenInfo.new(3, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0), {["Position"] = script.Parent.Parent.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			Tween60 = game:GetService("TweenService"):Create(A200["A-200"], TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), {["Position"] = MeClone.Door.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			workspace["A-200Imprint"]:Play()
			wait(2.5)
			for i, face in pairs(A200["A-200"].Art:GetChildren()) do
				if face:IsA("ImageLabel") and face.Visible == true then
					local Decal = Instance.new("Decal")
					Decal.Face = "Front"
					Decal.Texture = face.Image
					Decal.Parent = MeClone.Door
					Decal.Transparency = 0.75
					Decal.Color3 = Color3.fromRGB(0, 0, 0)
				end
			end
			Tween60 = game:GetService("TweenService"):Create(A200["A-200"], TweenInfo.new(10, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), {["Position"] = workspace.Start.Exit.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			A200:Destroy()
			game.Lighting.Filmic.Enabled = false
		end
		
		local function M60Entity()
			game.Lighting.Filmic.Enabled = true
			local A60 = game.ReplicatedStorage.M60:Clone()
			workspace["M-60Spawn"]:Play()
			A60.Parent = workspace
			A60["A-60"].Position = script.Parent.Parent.Position - Vector3.new(0, 0, 1000)
			A60["A-60"].Static.Playing = true
			A60["A-60"].Rumble.Playing = true
			local Tween60 = game:GetService("TweenService"):Create(A60["A-60"], TweenInfo.new(15, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0), {["Position"] = script.Parent.Parent.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			local Waypoints = workspace.Room.Value:FindFirstChild("Waypoints"):GetChildren()
			local SelectPoint = Waypoints[1]
			for i, way in pairs(Waypoints) do
				if SelectPoint:IsA("Part") then
					Tween60 = game:GetService("TweenService"):Create(A60["A-60"], TweenInfo.new(1, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0), {["Position"] = SelectPoint.Position})
					Tween60:Play()
					wait(Tween60.TweenInfo.Time)
					local SelectPoint = Waypoints[i + 1]
				end
			end
			Tween60 = game:GetService("TweenService"):Create(A60["A-60"], TweenInfo.new(3, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0), {["Position"] = MeClone.Door.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			for i, face in pairs(A60["A-60"].Art:GetChildren()) do
				if face:IsA("ImageLabel") and face.Visible == true then
					local Decal = Instance.new("Decal")
					Decal.Face = "Front"
					Decal.Texture = face.Image
					Decal.Parent = MeClone.Door
					Decal.Transparency = 0.75
					Decal.Color3 = Color3.fromRGB(255, 255, 255)
				end
			end
			A60:Destroy()
			workspace["A-60Imprint"]:Play()
			game.Lighting.Filmic.Enabled = false
		end

		local function M200Entity()
			script.Parent.Parent.A200Cue:Play()
			game.Lighting.Filmic.Enabled = true
			wait(10)
			local A200 = game.ReplicatedStorage.M200:Clone()
			A200.Parent = workspace
			A200["A-200"].Position = workspace.Start.Exit.Position
			A200["A-200"].Static.Playing = true
			A200["A-200"].Grumble.Playing = true
			local Tween60 = game:GetService("TweenService"):Create(A200["A-200"], TweenInfo.new(3, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0), {["Position"] = script.Parent.Parent.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			Tween60 = game:GetService("TweenService"):Create(A200["A-200"], TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), {["Position"] = MeClone.Door.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			workspace["A-200Imprint"]:Play()
			wait(7)
			for i, face in pairs(A200["A-200"].Art:GetChildren()) do
				if face:IsA("ImageLabel") and face.Visible == true then
					local Decal = Instance.new("Decal")
					Decal.Face = "Front"
					Decal.Texture = face.Image
					Decal.Parent = MeClone.Door
					Decal.Transparency = 0.75
					Decal.Color3 = Color3.fromRGB(0, 0, 0)
				end
			end
			Tween60 = game:GetService("TweenService"):Create(A200["A-200"], TweenInfo.new(10, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), {["Position"] = workspace.Start.Exit.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			Tween60 = game:GetService("TweenService"):Create(A200["A-200"], TweenInfo.new(10, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), {["Position"] = workspace.Start.Exit.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			A200:Destroy()
			game.Lighting.Filmic.Enabled = false
		end
		
		local function A160Entity()
			workspace["A-160"]:Play()
			wait(10)
			local A200 = game.ReplicatedStorage.A160:Clone()
			A200.Parent = workspace
			A200["A-160"].Position = workspace.Start.Exit.Position
			A200["A-160"].Rumble.Playing = true
			A200["A-160"].Static.Playing = true
			local Tween60 = game:GetService("TweenService"):Create(A200["A-160"], TweenInfo.new(3, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0), {["Position"] = script.Parent.Parent.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			Tween60 = game:GetService("TweenService"):Create(A200["A-160"], TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), {["Position"] = MeClone.Door.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			Tween60 = game:GetService("TweenService"):Create(A200["A-160"], TweenInfo.new(3, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), {["Position"] = workspace.Start.Exit.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			Tween60 = game:GetService("TweenService"):Create(A200["A-160"], TweenInfo.new(3, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), {["Position"] = MeClone.Door.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			Tween60 = game:GetService("TweenService"):Create(A200["A-160"], TweenInfo.new(3, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), {["Position"] = workspace.Start.Exit.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			Tween60 = game:GetService("TweenService"):Create(A200["A-160"], TweenInfo.new(10, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), {["Position"] = MeClone.Door.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			wait(7)
			for i, face in pairs(A200["A-160"].Art:GetChildren()) do
				if face:IsA("ImageLabel") and face.Visible == true then
					local Decal = Instance.new("Decal")
					Decal.Face = "Front"
					Decal.Texture = face.Image
					Decal.Parent = MeClone.Door
					Decal.Transparency = 0
					Decal.Color3 = Color3.fromRGB(255, 0, 0)
					A200:Destroy()
					workspace["A-60Kill"]:Play()
					for i = 1, 70 do
						wait(0.1)
						Decal.Transparency = math.random(0, 100) / 100
					end
					Decal.Transparency = 0.75
				end
			end
			game.Lighting.Filmic.Enabled = false
		end
		
		local function A190Entity()
			local A200 = game.ReplicatedStorage.A190:Clone()
			A200.Parent = workspace
			script.Parent.Parent.A190Cue:Play()
			A200["A-160"].Position = workspace.Start.Entrance.Position + Vector3.new(0, 0, 1000)
			A200["A-160"].Rumble.Playing = true
			A200["A-160"].Static.Playing = true
			wait(15)
			local Tween60 = game:GetService("TweenService"):Create(A200["A-160"], TweenInfo.new(0.5, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0), {["Position"] = script.Parent.Parent.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			Tween60 = game:GetService("TweenService"):Create(A200["A-160"], TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), {["Position"] = MeClone.Door.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			Tween60 = game:GetService("TweenService"):Create(A200["A-160"], TweenInfo.new(15, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), {["Position"] = workspace.Start.Entrance.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			game.Lighting.Ritual.Enabled = true
			workspace["A-60Near"]:Play()
			for i, face in pairs(A200["A-160"].Art:GetChildren()) do
				if face:IsA("ImageLabel") and face.Visible == true then
					local Decal = Instance.new("Decal")
					Decal.Face = "Front"
					Decal.Texture = face.Image
					Decal.Parent = MeClone.Door
					Decal.Transparency = 0
					Decal.Color3 = Color3.fromRGB(255, 0, 0)
					A200:Destroy()
					for i = 1, 47 do
						wait(0.1)
						Decal.Transparency = math.random(0, 100) / 100
					end
					game.Lighting.Ritual.Enabled = false
					Decal:Destroy()
				end
			end
			if A200 then
				A200:Destroy()
			end
			game.Lighting.Filmic.Enabled = false
		end
		
		local function A300Entity()
			local A200 = game.ReplicatedStorage.A300:Clone()
			A200.Parent = workspace
			A200["A-160"].Position = workspace.Start.Entrance.Position + Vector3.new(0, 0, 1000)
			A200["A-160"].Rumble.Playing = true
			A200["A-160"].Static.Playing = true
			local Tween60 = game:GetService("TweenService"):Create(A200["A-160"], TweenInfo.new(0.5, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false, 0), {["Position"] = script.Parent.Parent.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			Tween60 = game:GetService("TweenService"):Create(A200["A-160"], TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.In, 0, false, 0), {["Position"] = MeClone.Door.Position})
			Tween60:Play()
			wait(Tween60.TweenInfo.Time)
			game.Lighting.Ritual.Enabled = true
			workspace["A-60Near"]:Play()
			for i, face in pairs(A200["A-160"].Art:GetChildren()) do
				if face:IsA("ImageLabel") and face.Visible == true then
					local Decal = Instance.new("Decal")
					Decal.Face = "Front"
					Decal.Texture = face.Image
					Decal.Parent = MeClone.Door
					Decal.Transparency = 0
					Decal.Color3 = Color3.fromRGB(255, 0, 0)
					A200:Destroy()
					for i = 1, 47 do
						wait(0.1)
						Decal.Transparency = math.random(0, 100) / 100
					end
					game.Lighting.Ritual.Enabled = false
					Decal:Destroy()
				end
			end
			if A200 then
				A200:Destroy()
			end
			game.Lighting.Filmic.Enabled = false
		end
		
		if workspace.RoomValue.Value == 100 then
			for i, plr in pairs(game.Players:GetPlayers()) do
				local char = plr.Character
				if char and not char:FindFirstChildOfClass("Humanoid"):HasTag("Died") then
					game:GetService("BadgeService"):AwardBadge(plr.UserId, 2862816869297626)
				end
			end
		end
		
		if workspace.RoomValue.Value == 200 then
			for i, plr in pairs(game.Players:GetPlayers()) do
				local char = plr.Character
				if char and not char:FindFirstChildOfClass("Humanoid"):HasTag("Died") then
					game:GetService("BadgeService"):AwardBadge(plr.UserId, 3143888930944135)
				end
			end
		end
		game.ReplicatedStorage.DoorTrigger:FireAllClients(workspace.RoomValue.Value)
		if workspace.RoomValue.Value == 300 then
			for i, plr in pairs(game.Players:GetPlayers()) do
				local char = plr.Character
				if char and not char:FindFirstChildOfClass("Humanoid"):HasTag("Died") then
					game:GetService("BadgeService"):AwardBadge(plr.UserId, 2956407365981642)
					wait(19)
					plr.Character:BreakJoints()
					A300Entity()
					plr.PlayerGui.ScreenGui.WinFrame.Visible = true
				end
			end
		end
		
		
		if (math.random(1, 30) == 1 and workspace.RoomValue.Value > 25) or workspace.RoomValue.Value == 25 then
			A60Entity()
		end
		if (math.random(1, 30) == 1 and workspace.RoomValue.Value > 50) or workspace.RoomValue.Value == 50 then
			A200Entity()
		end
		if (math.random(1, 40) == 1 and workspace.RoomValue.Value > 75) or workspace.RoomValue.Value == 75 then
			M60Entity()
		end
		if (math.random(1, 40) == 1 and workspace.RoomValue.Value > 100) or workspace.RoomValue.Value == 100 then
			M200Entity()
		end
		if (math.random(1, 40) == 1 and workspace.RoomValue.Value > 150) or workspace.RoomValue.Value == 150 then
			A160Entity()
		end
		if (math.random(1, 60) == 1 and workspace.RoomValue.Value > 200) or workspace.RoomValue.Value == 240 then
			A190Entity()
		end
		if (math.random(1, 60) == 1 and workspace.RoomValue.Value > 300) then
			A300Entity()
		end
		local Val = workspace.RoomValue.Value
		while Val >= workspace.RoomValue.Value - 2 do
			wait(1)
		end
		local TweenAlt = game:GetService("TweenService"):Create(script.Parent.Parent, TweenInfo.new(0.5, Enum.EasingStyle.Circular, Enum.EasingDirection.In, 0, false, 0), {["Position"] = script.Parent.Parent.Position - Vector3.new((script.Parent.Parent.Size.X / 2) - 0.5, 0, (script.Parent.Parent.Size.Z / 2) + 1), ["Orientation"] = script.Parent.Parent.Orientation - Vector3.new(0, 90, 0)})
		TweenAlt:Play()
		
		while Val >= workspace.RoomValue.Value - 4 do
			wait(1)
		end
		wait(TweenAlt.TweenInfo.Time)
		local GlowTween = game:GetService("TweenService"):Create(workspace.Glowyman, TweenInfo.new(1, Enum.EasingStyle.Circular, Enum.EasingDirection.In, 0, false, 0), {["Position"] = Room.Entrance.Position})
		GlowTween:Play()
		while Val >= workspace.RoomValue.Value - 6 do
			wait(1)
		end
		Room:Destroy()
		script.Parent.Parent.Parent:Destroy()
	end
end)
1 Like

Ok I thought you were talking about a mechanic for some reason… anyways i would parent your cloned/new entities to a folder called “spawned entities” or something. I gave all my entities separate screen shaking scripts and used the ez camera shake module, so basically I would check whenever something was added to the folder, check if the name was the entity in question, and have the screen shaking until the child was removed from the folder. so mine ended up looking something like this:

workspace.SpawnedEntities.ChildAdded:Connect(function()
	local entity = workspace.SpawnedEntities:FindFirstChild("entity") -- check if it is the right entity
	if entity then
		while task.wait() do
			if workspace.SpawnedEntities:FindFirstChild("entity") then -- check if the entity is still in the folder
			-- screen shake code goes here, this will repeat until the line above doesn't find the entity in the folder
			end
		end
	end
end)

You could do this a different way, but I think it works pretty well.

good idea! i will try it for A/60 and M/60.

1 Like

cant seem to work out how to get the distance.
hurry
hierarchy
sorry for the bad drawing skill, i am in a rush

1 Like

You should clean up the if statement nightmares in this script, which can be done with tables and iteration. It should make your script a lot cleaner.

I know this isn’t scripting support, but it is good to get into habits of shortening stuff like that.

Up to 7 entities can spawn at the same time with your script if you get really unlucky, but there is still that chance.

Edit: Also consider using elseif in situations like this:

ik, but its better if i know how to control it.

1 Like

I’m confused, what do you mean?

elseif is quite easy to understand.
Here is your if statement thing but using elseif.

if workspace.RoomValue.Value >= 25 then
	local rnd = math.random(1,30)
	if rnd == 1 then
		A60Entity()
	end
elseif workspace.RoomValue.Value >= 50 then
	local rnd = math.random(1,30)
	if rnd == 1 then
		A200Entity()
	end
end

etc.

It looks a lot nicer using elseif.

P.S. >= means larger than or equal to, <= means smaller than or equal to.

Edit: The way you were checking for larger than or equal to would spawn an entity every time you reach the floor you’re checking for.

Example: floor 200, entity spawns guaranteed.

This occurs because you used the parentheses in an incorrect manner, if you still refuse to use the >= method, you may do

if math.random(1,30) == 1 and (floor > 25 or floor == 25) then

end

to prevent this issue.

we want surprise not just 1 entity,
so i wont use it

and we do want them to spawn on that room

you are right, i will change it. but not for A/20
edit: heres the new section

		if (math.random(1, 30) == 1 and workspace.RoomValue.Value > 25) or workspace.RoomValue.Value == 25 then
			A60Entity()
		elseif (math.random(1, 30) == 1 and workspace.RoomValue.Value > 50) then
			A200Entity()
		elseif (math.random(1, 40) == 1 and workspace.RoomValue.Value > 75) then
			M60Entity()
		elseif (math.random(1, 40) == 1 and workspace.RoomValue.Value > 100) then
			M200Entity()
		elseif (math.random(1, 40) == 1 and workspace.RoomValue.Value > 150) then
			A160Entity()
		elseif (math.random(1, 60) == 1 and workspace.RoomValue.Value > 200) then
			A190Entity()
		elseif (math.random(1, 60) == 1 and workspace.RoomValue.Value > 300) then
			A300Entity()
		end

does it look good?

2 Likes

it does look a lot shorter, but I would still recommend using a table. As for the camera shaking, you could make your own shaking or use the ez camera shake module.

Either way finding the distance between the player and the character is pretty simple. You can use the distance from character function.

	local distance = game.Players.LocalPlayer:DistanceFromCharacter(workspace:FindFirstChild("Entity").PrimaryPart.Position)

However, if you do use the module, I don’t believe it comes with a built in distance based-shake, or at least you need to code part of it. So just let me know if you need help with that.

if you are using a free model, i wont use it.

Well it is very smooth with lots of customization, but I respect you wanting to make the screen shaking yourself

1 Like