buckshotroulette-decomp/ShotgunShooting.gd

239 lines
9.8 KiB
GDScript

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