local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local TweenService = game:GetService("TweenService") local Lighting = game:GetService("Lighting") local SoundService = game:GetService("SoundService") local player = Players.LocalPlayer local camera = workspace.CurrentCamera local IDLE_FOV = 90 local INTRO_FOV = 20 local SPRINT_FOV_BOOST = 9 local DASH_FOV_BOOST = 20 local HIT_FOV_DROP = 95 local FOV_TWEEN_TIME = 1.5 local INTRO_WAIT_TIME = 1 local AUDIO_ID = "rbxassetid://139488665764275" local HIT_SOUND_ID = "rbxassetid://138651783706047" local DASH_ANIM_ID = "rbxassetid://73053491533472" local DASH_DURATION = 0.6 local DASH_SPEED = 85 local DELAY_BEFORE_DASH = 0.5 local DASH_HITBOX_RADIUS = 6 local SKYBOX = { Bk = "rbxassetid://108929045660200", Dn = "rbxassetid://78646480540009", Ft = "rbxassetid://90546017435179", Lf = "rbxassetid://109838453114563", Rt = "rbxassetid://94190734796082", Up = "rbxassetid://126944775797063" } local isSprinting = false local currentFOV = INTRO_FOV local character, humanoid, rootPart, animator local idleTrack, forwardTrack, backwardTrack, sprintTrack, currentTrack, dashTrack local heartbeatConn, speedLoopTask, dashHitConnection local isDashing = false local hitDebounce = {} local redFire = nil local originalCollisionGroup local function createBlackScreen() local gui = Instance.new("ScreenGui") gui.Name = "IntroBlackScreen" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.Parent = player:WaitForChild("PlayerGui") local frame = Instance.new("Frame") frame.Size = UDim2.new(1, 0, 1, 0) frame.BackgroundColor3 = Color3.new(0, 0, 0) frame.BorderSizePixel = 0 frame.ZIndex = 100 frame.Parent = gui return gui, frame end local function createVignette() local gui = Instance.new("ScreenGui") gui.Name = "VignetteGui" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.Parent = player:WaitForChild("PlayerGui") local vignette = Instance.new("ImageLabel") vignette.Size = UDim2.new(1, 0, 1, 0) vignette.BackgroundTransparency = 1 vignette.Image = "rbxassetid://4576475446" vignette.ImageTransparency = 0.15 vignette.ImageColor3 = Color3.new(0, 0, 0) vignette.ZIndex = 50 vignette.Parent = gui return vignette end local function createRedAtmosphere() for _, v in ipairs(Lighting:GetChildren()) do if v:IsA("Atmosphere") then v:Destroy() end end local atmosphere = Instance.new("Atmosphere") atmosphere.Name = "RedHellAtmosphere" atmosphere.Density = 0.45 atmosphere.Offset = 0.25 atmosphere.Color = Color3.fromRGB(255, 40, 40) atmosphere.Decay = Color3.fromRGB(180, 20, 20) atmosphere.Glare = 0.8 atmosphere.Haze = 1.2 atmosphere.Parent = Lighting end local function setupCharacterVisuals(char) local head = char:WaitForChild("Head", 5) local leftHand = char:FindFirstChild("LeftHand") if head then local titleModel = game:GetService("ReplicatedStorage"):FindFirstChild("JohnDoeTitle") if titleModel then local clone = titleModel:Clone() clone.Parent = char local billboard = clone:FindFirstChildOfClass("BillboardGui") if billboard then billboard.Adornee = head billboard.StudsOffset = Vector3.new(0, 3.8, 0) end end end if leftHand then redFire = Instance.new("Fire") redFire.Name = "RedHellFire" redFire.Color = Color3.fromRGB(255, 40, 0) redFire.SecondaryColor = Color3.fromRGB(255, 100, 0) redFire.Size = 4.5 redFire.Heat = 12 redFire.Enabled = false redFire.Parent = leftHand end end local function tweenFOV(target, duration, easingStyle, easingDirection) duration = duration or FOV_TWEEN_TIME easingStyle = easingStyle or Enum.EasingStyle.Sine easingDirection = easingDirection or Enum.EasingDirection.Out TweenService:Create(camera, TweenInfo.new(duration, easingStyle, easingDirection), {FieldOfView = target}):Play() end local function onHitDuringDash(hitCharacter) if not isDashing then return end if hitDebounce[hitCharacter] then return end hitDebounce[hitCharacter] = true local current = camera.FieldOfView tweenFOV(current - HIT_FOV_DROP, 2, Enum.EasingStyle.Cubic, Enum.EasingDirection.Out) local hitSound = Instance.new("Sound") hitSound.SoundId = HIT_SOUND_ID hitSound.Volume = 0.7 hitSound.Pitch = 1 hitSound.Parent = SoundService hitSound:Play() hitSound.Ended:Connect(function() hitSound:Destroy() end) task.delay(0.8, function() if isDashing then tweenFOV(IDLE_FOV + DASH_FOV_BOOST, 0.6, Enum.EasingStyle.Cubic, Enum.EasingDirection.Out) elseif isSprinting then tweenFOV(IDLE_FOV + SPRINT_FOV_BOOST, 0.6) else tweenFOV(IDLE_FOV, 0.6) end hitDebounce[hitCharacter] = nil end) end local function playIntroSequence() local blackGui, blackFrame = createBlackScreen() local sky = Instance.new("Sky") sky.SkyboxBk = SKYBOX.Bk sky.SkyboxDn = SKYBOX.Dn sky.SkyboxFt = SKYBOX.Ft sky.SkyboxLf = SKYBOX.Lf sky.SkyboxRt = SKYBOX.Rt sky.SkyboxUp = SKYBOX.Up sky.Parent = Lighting createRedAtmosphere() local audio = Instance.new("Sound") audio.SoundId = AUDIO_ID audio.Volume = 0.2 audio.Pitch = 1 audio.Looped = true audio.Parent = SoundService audio:Play() camera.FieldOfView = INTRO_FOV task.wait(INTRO_WAIT_TIME) local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.Out) TweenService:Create(camera, tweenInfo, {FieldOfView = IDLE_FOV}):Play() TweenService:Create(blackFrame, tweenInfo, {BackgroundTransparency = 1}):Play() task.delay(2.5, function() blackGui:Destroy() end) task.delay(1, createVignette) end local function stopTrack(track, fadeTime) if track and track.IsPlaying then track:Stop(fadeTime or 0.1) end end local function playOnly(track, speedOverride) if not track then return end if currentTrack == track then if not track.IsPlaying then track:Play(0.1) end if speedOverride then track:AdjustSpeed(speedOverride) end return end if currentTrack then currentTrack:Stop(0.1) end currentTrack = track track:Play(0.1, 1, speedOverride or 1) end local function makeTrack(id, priority, looped) local anim = Instance.new("Animation") anim.AnimationId = id local track = animator:LoadAnimation(anim) track.Priority = priority track.Looped = looped or false return track end local function cleanup() if heartbeatConn then heartbeatConn:Disconnect() end if dashHitConnection then dashHitConnection:Disconnect() end stopTrack(idleTrack) stopTrack(forwardTrack) stopTrack(backwardTrack) stopTrack(sprintTrack) stopTrack(dashTrack) hitDebounce = {} if character and originalCollisionGroup then for _, part in ipairs(character:GetDescendants()) do if part:IsA("BasePart") then part.CollisionGroup = originalCollisionGroup part.CanCollide = true end end end end local function applyWalkSpeed() if not humanoid then return end local md = humanoid.MoveDirection local moving = md.Magnitude > 0.1 if not moving then humanoid.WalkSpeed = isSprinting and 24 or 8 return end local dot = md:Dot(rootPart.CFrame.LookVector) humanoid.WalkSpeed = (dot < -0.2) and 6 or (isSprinting and 24 or 8) end local function updateAnimations() if not humanoid or not rootPart then return end local md = humanoid.MoveDirection local moving = md.Magnitude > 0.1 if not moving then playOnly(idleTrack) elseif md:Dot(rootPart.CFrame.LookVector) < -0.2 then playOnly(backwardTrack) elseif isSprinting then playOnly(sprintTrack, 2.5) else playOnly(forwardTrack) end end local function dash() if not character or not rootPart or not humanoid or isDashing then return end isDashing = true isSprinting = false hitDebounce = {} if redFire then redFire.Enabled = true end originalCollisionGroup = rootPart.CollisionGroup for _, part in ipairs(character:GetDescendants()) do if part:IsA("BasePart") then part.CollisionGroup = "Default" part.CanCollide = false end end tweenFOV(IDLE_FOV + DASH_FOV_BOOST) if animator then local anim = Instance.new("Animation") anim.AnimationId = DASH_ANIM_ID dashTrack = animator:LoadAnimation(anim) dashTrack.Priority = Enum.AnimationPriority.Action3 dashTrack.Looped = false dashTrack:Play() end task.wait(DELAY_BEFORE_DASH) if not rootPart or not rootPart.Parent then isDashing = false return end humanoid.AutoRotate = false local forwardDir = rootPart.CFrame.LookVector local currentVel = rootPart.AssemblyLinearVelocity local dashTween = TweenService:Create(rootPart, TweenInfo.new(DASH_DURATION, Enum.EasingStyle.Cubic, Enum.EasingDirection.Out), { AssemblyLinearVelocity = forwardDir * DASH_SPEED + Vector3.new(0, currentVel.Y, 0) }) dashTween:Play() dashTween.Completed:Connect(function() humanoid.AutoRotate = true isDashing = false tweenFOV(isSprinting and IDLE_FOV + SPRINT_FOV_BOOST or IDLE_FOV) end) task.delay(5, function() if redFire and redFire.Parent then local tween = TweenService:Create(redFire, TweenInfo.new(1.5, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), { Heat = 0, Size = 0.5 }) tween:Play() tween.Completed:Connect(function() if redFire then redFire.Enabled = false end end) end end) task.delay(DASH_DURATION + 0.5, function() isDashing = false humanoid.AutoRotate = true end) end local function setupDashHitDetection() if dashHitConnection then dashHitConnection:Disconnect() end dashHitConnection = RunService.Heartbeat:Connect(function() if not isDashing or not rootPart then return end local rootPos = rootPart.Position local parts = workspace:GetPartBoundsInRadius(rootPos, DASH_HITBOX_RADIUS) for _, part in ipairs(parts) do local hitChar = part.Parent if hitChar and hitChar:FindFirstChild("Humanoid") and hitChar ~= character then onHitDuringDash(hitChar) end end end) end local function setupCharacter(char) cleanup() character = char task.wait(0.3) humanoid = character:WaitForChild("Humanoid", 5) rootPart = character:WaitForChild("HumanoidRootPart", 5) if not humanoid or not rootPart then return end animator = humanoid:FindFirstChildOfClass("Animator") or Instance.new("Animator", humanoid) local animate = character:FindFirstChild("Animate") if animate then animate.Enabled = false end idleTrack = makeTrack("rbxassetid://111792319821341", Enum.AnimationPriority.Action, true) forwardTrack = makeTrack("rbxassetid://138795419712161", Enum.AnimationPriority.Action, true) backwardTrack = makeTrack("rbxassetid://95970874156673", Enum.AnimationPriority.Action, true) sprintTrack = makeTrack("rbxassetid://94467125495426", Enum.AnimationPriority.Action4, true) applyWalkSpeed() updateAnimations() setupCharacterVisuals(character) setupDashHitDetection() speedLoopTask = task.spawn(function() while character and character.Parent do applyWalkSpeed() task.wait(0.1) end end) heartbeatConn = RunService.Heartbeat:Connect(function() if isSprinting and sprintTrack and sprintTrack.IsPlaying then sprintTrack:AdjustSpeed(2.5) end updateAnimations() end) end UserInputService.InputBegan:Connect(function(input, gp) if gp then return end if input.KeyCode == Enum.KeyCode.X then if not isDashing then isSprinting = not isSprinting tweenFOV(isSprinting and IDLE_FOV + SPRINT_FOV_BOOST or IDLE_FOV) end elseif input.KeyCode == Enum.KeyCode.Q then dash() end applyWalkSpeed() updateAnimations() end) player.CharacterAdded:Connect(setupCharacter) player.CharacterRemoving:Connect(cleanup) if player.Character then task.spawn(setupCharacter, player.Character) end playIntroSequence()