class_name ShotgunShooting extends Node @export var ejectionManager_player : ShellEjectManager @export var cursorManager : CursorManager @export var shotgunIndicator : PickupIndicator @export var roundManager : RoundManager @export var shellSpawner : ShellSpawner @export var collider_shotgun : StaticBody3D @export var decisionText : DecisionTextManager @export var shotgunshaker : ObjectShaker @export var perm : PermissionManager @export var animator_shotgun : AnimationPlayer @export var camera : CameraManager @export var speaker_live : AudioStreamPlayer2D @export var speaker_blank : AudioStreamPlayer2D @export var healthCounter : HealthCounter @export var animator_muzzleFlash : AnimationPlayer @export var animator_muzzleFlash_model : AnimationPlayer @export var cameraShaker : CameraShaker @export var death : DeathManager @export var smoke : SmokeController @export var speakerArray_pitchShift : Array[SpeakerController] @export var speakerArray_pitchShift3D : Array[SpeakerController3D] @export var timescale : TimeScaleManager @export var splatters : Array[CompressedTexture2D] @export var mat_splatter : GeometryInstance3D @export var speaker_splatter : AudioStreamPlayer2D @export var anim_splatter : AnimationPlayer @export var ach : Achievement var playerCanGoAgain @export var btnParent_shootingChoice : Control @export var btn_you : Control @export var controller : ControllerManager func GrabShotgun(): roundManager.ClearDeskUI(true) perm.SetIndicators(false) perm.SetInteractionPermissions(false) perm.RevertDescriptionUI() ShotgunCollider(false) animator_shotgun.play("player grab shotgun") shotgunshaker.StartShaking() decisionText.SetUI(true) btnParent_shootingChoice.visible = true if (cursorManager.controller_active): btn_you.grab_focus() controller.previousFocus = btn_you await get_tree().create_timer(.5, false).timeout var disablingDelayShit = false var dealerShotTrue = false func MainSlowDownRoutine(whoCopy : String, fromDealer : bool): var who = whoCopy var currentRoundInChamber = shellSpawner.sequenceArray[0] var healthAfterShot = 1 if (!fromDealer): healthAfterShot = roundManager.health_opponent - roundManager.currentShotgunDamage if (healthAfterShot < 0): healthAfterShot = 0 else: if(roundManager.health_opponent == 0): healthAfterShot = 0 if (currentRoundInChamber == "live" && who == "dealer" && healthAfterShot == 0): #TIME SCALE SHIFT for i in range(speakerArray_pitchShift.size()): speakerArray_pitchShift[i].fadeDuration_pitch = timescale.pitchShiftDuration speakerArray_pitchShift[i].BeginPitchShift(speakerArray_pitchShift[i].lowestPitchValue, speakerArray_pitchShift[i].originalPitch) for i in range(speakerArray_pitchShift3D.size()): speakerArray_pitchShift3D[i].fadeDuration_pitch = timescale.pitchShiftDuration speakerArray_pitchShift3D[i].BeginPitchShift(speakerArray_pitchShift3D[i].lowestPitchValue, speakerArray_pitchShift3D[i].originalPitch) timescale.BeginTimeScaleLerp(.2, 1.0) BloodSplatter() func BloodSplatter(): await get_tree().create_timer(.17, false).timeout speaker_splatter.pitch_scale = randf_range(.3, .5) speaker_splatter.play() anim_splatter.play("fade out") mat_splatter.material_override.set("albedo_texture", splatters[0]) await get_tree().create_timer(.08, false).timeout mat_splatter.material_override.set("albedo_texture", splatters[1]) await get_tree().create_timer(.08, false).timeout mat_splatter.material_override.set("albedo_texture", splatters[2]) await get_tree().create_timer(.08, false).timeout mat_splatter.material_override.set("albedo_texture", splatters[3]) pass func Shoot(who : String): dealerShotTrue = false disablingDelayShit = false playerCanGoAgain = false var playerDied = false var dealerShot = false ejectionManager_player.FadeOutShell() cursorManager.SetCursor(false, false) #CAMERA CONTROLS & ANIMATION DEPENDING ON WHO IS SHOT match(who): "self": await get_tree().create_timer(.25, false).timeout animator_shotgun.play("player shoot self") await get_tree().create_timer(.5, false).timeout camera.BeginLerp("enemy") "dealer": await get_tree().create_timer(.25, false).timeout animator_shotgun.play("player shoot dealer") await get_tree().create_timer(.5, false).timeout camera.BeginLerp("enemy") #PLAY CORRECT SOUND. ASSIGN CURRENT ROUND IN CHAMBER await get_tree().create_timer(2, false).timeout var currentRoundInChamber = shellSpawner.sequenceArray[0] MainSlowDownRoutine(who, false) if (who == "self"): whoshot = "player" else: whoshot = "dealer" PlayShootingSound() #SHAKE CAMERA if (currentRoundInChamber == "live"): smoke.SpawnSmoke("barrel") cameraShaker.Shake() #SUBTRACT HEALTH. ASSIGN PLAYER CAN GO AGAIN. RETURN IF DEAD if (currentRoundInChamber == "live" && who == "dealer"): roundManager.health_opponent -= roundManager.currentShotgunDamage if (roundManager.health_opponent < 0): roundManager.health_opponent = 0 if (currentRoundInChamber == "live" && who == "self"): CheckAchievement_why() CheckAchievement_style() roundManager.waitingForHealthCheck2 = true if (shellSpawner.sequenceArray.size() == 1): whatTheFuck = true roundManager.waitingForDealerReturn = true healthCounter.playerShotSelf = true playerDied = true roundManager.health_player -= roundManager.currentShotgunDamage if (roundManager.health_player < 0): roundManager.health_player = 0 playerCanGoAgain = false healthCounter.checkingPlayer = true await(death.Kill("player", false, true)) if (currentRoundInChamber == "blank" && who == "self"): playerCanGoAgain = true CheckAchievement_coinflip() if (currentRoundInChamber == "live" && who == "dealer"): playerCanGoAgain = false dealerShot = true dealerShotTrue = true await(death.Kill("dealer", false, false)) if (playerDied): return if (dealerShot): return await get_tree().create_timer(.3, false).timeout #EJECTING SHELLS if (currentRoundInChamber == "blank" && who == "self"): animator_shotgun.play("player eject shell") await get_tree().create_timer(.85, false).timeout camera.BeginLerp("home") await get_tree().create_timer(1.35, false).timeout FinalizeShooting(playerCanGoAgain, true, false, false) return if (currentRoundInChamber == "blank" && who == "dealer"): disablingDelayShit = true ShootingDealerEjection(currentRoundInChamber, who, false) func ShootingDealerEjection(currentRoundInChamberCopy : String, whoCopy : String, hasDelay : bool): if ((currentRoundInChamberCopy == "blank" or currentRoundInChamberCopy == "live") && whoCopy == "dealer"): animator_shotgun.play("player eject shell2") await get_tree().create_timer(2, false).timeout if (hasDelay): await get_tree().create_timer(2.5, false).timeout if (!disablingDelayShit): FinalizeShooting(playerCanGoAgain, true, true, false) else: FinalizeShooting(playerCanGoAgain, true, false, false) var whatTheFuck = false var delaying = false var isPlayerSide = false func FinalizeShooting(playerCanGoAgain : bool, placeShotgunOnTable : bool, waitForRevival : bool, addDelay : bool): if(placeShotgunOnTable): animator_shotgun.play("player place on table after eject") shotgunshaker.StopShaking() #shellSpawner.sequenceArray.remove_at(0) await get_tree().create_timer(.6, false).timeout shotgunIndicator.Revert() ShotgunCollider(true) if (death.shitIsFuckedUp): await get_tree().create_timer(3, false).timeout if (waitForRevival): await get_tree().create_timer(2, false).timeout if (addDelay): await get_tree().create_timer(3, false).timeout if (delaying): await get_tree().create_timer(4, false).timeout if (whatTheFuck): await get_tree().create_timer(2, false).timeout whatTheFuck = false #delaying = false if (roundManager.shellSpawner.sequenceArray.size() == 0 && dealerShotTrue): await get_tree().create_timer(2, false).timeout #abc if ((roundManager.health_opponent <= 2 or roundManager.health_player <= 2) && roundManager.playerData.currentBatchIndex == 2 && !roundManager.endless): if (roundManager.health_opponent <= 2 && !roundManager.wireIsCut_dealer): await get_tree().create_timer(2, false).timeout if (roundManager.health_player <= 2 && !roundManager.wireIsCut_player): await get_tree().create_timer(2, false).timeout if(roundManager.health_opponent != 0): roundManager.EndTurn(playerCanGoAgain) func CheckAchievement_coinflip(): var setting = false if ("magnifying glass" not in roundManager.playerCurrentTurnItemArray and "burner phone" not in roundManager.playerCurrentTurnItemArray): setting = true if ((shellSpawner.sequenceArray.count("live") == shellSpawner.sequenceArray.count("blank")) && setting): ach.UnlockAchievement("ach8") func CheckAchievement_why(): if ("magnifying glass" in roundManager.playerCurrentTurnItemArray): ach.UnlockAchievement("ach13") func CheckAchievement_style(): if ("handsaw" in roundManager.playerCurrentTurnItemArray): ach.UnlockAchievement("ach15") func PlayShootingSound(): var currentRoundInChamber = shellSpawner.sequenceArray[0] if (currentRoundInChamber == "live"): CheckIfFinalShot() speaker_live.play() roundManager.playerData.stat_shotsFired += 1 animator_muzzleFlash.play("muzzle flash fire") animator_muzzleFlash_model.play("fire") else: speaker_blank.play() pass var fired = false var temphealth_dealer var temphealth_player var whoshot = "" func CheckIfFinalShot(): temphealth_dealer = roundManager.health_opponent - roundManager.currentShotgunDamage temphealth_player = roundManager.health_player - roundManager.currentShotgunDamage if (!fired && roundManager.playerData.currentBatchIndex == 2 && !roundManager.endless): if (temphealth_player <= 2 && whoshot == "player"): roundManager.musicManager.EndTrack() fired = true if (temphealth_dealer <= 2 && whoshot == "dealer"): roundManager.musicManager.EndTrack() fired = true func ShotgunCollider(isEnabled : bool): if (isEnabled): collider_shotgun.collision_layer = 1 collider_shotgun.collision_mask = 1 else: collider_shotgun.collision_layer = 0 collider_shotgun.collision_mask = 0