2024-01-20 12:17:43 +00:00
class_name DealerIntelligence extends Node
#ALTHOUGH THE CLASS NAME SUGGESTS THAT THE DEALER HAS INTELLIGENCE, AND IT'S TRUE THERE ARE MANY INTELLIGENT DEALERS,
#CONTRARY TO THOSE THIS ONE IS NOT. HERE THERE IS NO INTELLIGENCE. ONLY LAYERS, HEAPS AND CLUMPS OF SPAGHETTI JUMBLE CODE.
2024-04-05 10:52:30 +01:00
@ export var medicine : Medicine
2024-01-20 12:17:43 +00:00
@ export var hands : HandManager
@ export var itemManager : ItemManager
@ export var shellSpawner : ShellSpawner
@ export var shellLoader : ShellLoader
@ export var shotgunShooting : ShotgunShooting
@ export var roundManager : RoundManager
@ export var animator_shotgun : AnimationPlayer
@ export var animator_dealerHands : AnimationPlayer
@ export var camera : CameraManager
@ export var ejectManager : ShellEjectManager
@ export var healthCounter : HealthCounter
@ export var death : DeathManager
@ export var cameraShaker : CameraShaker
@ export var smoke : SmokeController
@ export var shellEject_dealer : ShellEjectManager
@ export var speaker_dealerarrive : AudioStreamPlayer2D
@ export var speaker_handCrack : AudioStreamPlayer2D
@ export var soundArray_cracks : Array [ AudioStream ]
@ export var speaker_checkHandcuffs : AudioStreamPlayer2D
@ export var speaker_breakHandcuffs : AudioStreamPlayer2D
@ export var speaker_giveHandcuffs : AudioStreamPlayer2D
@ export var sound_dealerarrive : AudioStream
@ export var sound_dealerarriveCuffed : AudioStream
@ export var dealermesh_normal : VisualInstance3D
@ export var dealermesh_crushed : VisualInstance3D
2024-04-05 10:52:30 +01:00
@ export var sequenceArray_knownShell : Array [ bool ]
@ export var amounts : Amounts
2024-01-20 12:17:43 +00:00
var dealerItemStringArray : Array [ String ]
var dealerAboutToBreakFree = false
var dealerCanGoAgain = false
var dealerHoldingShotgun = false
func DealerCheckHandCuffs ( ) :
var brokeFree = false
camera . BeginLerp ( " enemy cuffs close " )
if ( ! dealerAboutToBreakFree ) :
await get_tree ( ) . create_timer ( . 3 , false ) . timeout
speaker_checkHandcuffs . play ( )
animator_dealerHands . play ( " dealer check handcuffs " )
await get_tree ( ) . create_timer ( . 7 , false ) . timeout
brokeFree = false
else :
await get_tree ( ) . create_timer ( . 3 , false ) . timeout
animator_dealerHands . play ( " dealer break cuffs " ) #replace with broke free anim
speaker_breakHandcuffs . play ( )
#await get_tree().create_timer(.7, false).timeout
brokeFree = true
roundManager . dealerCuffed = false
dealerAboutToBreakFree = false
dealerAboutToBreakFree = true
roundManager . ReturnFromCuffCheck ( brokeFree )
func Animator_CheckHandcuffs ( ) :
speaker_checkHandcuffs . play ( )
func Animator_GiveHandcuffs ( ) :
speaker_giveHandcuffs . play ( )
func BeginDealerTurn ( ) :
mainLoopFinished = false
usingHandsaw = false
2024-04-05 10:52:30 +01:00
usingMedicine = false
2024-01-20 12:17:43 +00:00
DealerChoice ( )
var dealerTarget = " "
var knownShell = " "
var dealerKnowsShell = false
var mainLoopFinished = false
var usingHandsaw = false
var dealerUsedItem = false
2024-04-05 10:52:30 +01:00
var usingMedicine = false
var adrenalineSetup = false
var stealing = false
var adrenaline_itemSlot = " "
var inv_playerside = [ ]
var inv_dealerside = [ ]
2024-01-20 12:17:43 +00:00
func DealerChoice ( ) :
var dealerWantsToUse = " "
var dealerFinishedUsingItems = false
var hasHandsaw = false
2024-04-05 10:52:30 +01:00
var hasCigs = false
2024-01-20 12:17:43 +00:00
if ( roundManager . requestedWireCut ) :
await ( roundManager . defibCutter . CutWire ( roundManager . wireToCut ) )
if ( shellSpawner . sequenceArray . size ( ) == 0 ) :
roundManager . StartRound ( true )
return
2024-04-05 10:52:30 +01:00
if ( roundManager . endless && ! dealerKnowsShell ) :
dealerKnowsShell = FigureOutShell ( )
if ( dealerKnowsShell ) :
if ( roundManager . shellSpawner . sequenceArray [ 0 ] == " blank " ) :
knownShell = " blank "
dealerTarget = " self "
else :
knownShell = " live "
dealerTarget = " player "
2024-01-20 12:17:43 +00:00
if ( roundManager . shellSpawner . sequenceArray . size ( ) == 1 ) :
knownShell = shellSpawner . sequenceArray [ 0 ]
if ( shellSpawner . sequenceArray [ 0 ] == " live " ) : knownShell = " live "
else : knownShell = " blank "
if ( knownShell == " live " ) : dealerTarget = " player "
else : dealerTarget = " self "
dealerKnowsShell = true
2024-04-05 10:52:30 +01:00
for i in range ( itemManager . itemArray_dealer . size ( ) ) :
if ( itemManager . itemArray_dealer [ i ] == " cigarettes " ) :
hasCigs = true
break
inv_playerside = [ ]
inv_dealerside = [ ]
itemManager . itemArray_dealer = [ ]
itemManager . itemArray_instances_dealer = [ ]
var usingAdrenaline = false
var ch = itemManager . itemSpawnParent . get_children ( )
for c in ch . size ( ) :
if ( ch [ c ] . get_child ( 0 ) is PickupIndicator ) :
var temp_interaction : InteractionBranch = ch [ c ] . get_child ( 1 )
if ( temp_interaction . itemName == " adrenaline " && ! temp_interaction . isPlayerSide ) :
usingAdrenaline = true
adrenalineSetup = true
for c in ch . size ( ) :
if ( ch [ c ] . get_child ( 0 ) is PickupIndicator ) :
var temp_indicator : PickupIndicator = ch [ c ] . get_child ( 0 )
var temp_interaction : InteractionBranch = ch [ c ] . get_child ( 1 )
if ( ch [ c ] . transform . origin . z > 0 ) : temp_indicator . whichSide = " right "
else : temp_indicator . whichSide = " left "
if ( ! temp_interaction . isPlayerSide ) :
inv_dealerside . append ( temp_interaction . itemName )
itemManager . itemArray_dealer . append ( temp_interaction . itemName )
itemManager . itemArray_instances_dealer . append ( ch [ c ] )
for c in ch . size ( ) :
if ( ch [ c ] . get_child ( 0 ) is PickupIndicator ) :
var temp_indicator : PickupIndicator = ch [ c ] . get_child ( 0 )
var temp_interaction : InteractionBranch = ch [ c ] . get_child ( 1 )
if ( ch [ c ] . transform . origin . z > 0 ) : temp_indicator . whichSide = " right "
else : temp_indicator . whichSide = " left "
if ( temp_interaction . isPlayerSide && usingAdrenaline ) :
itemManager . itemArray_dealer . append ( temp_interaction . itemName )
itemManager . itemArray_instances_dealer . append ( ch [ c ] )
inv_playerside . append ( temp_interaction . itemName )
2024-01-20 12:17:43 +00:00
for i in range ( itemManager . itemArray_dealer . size ( ) ) :
if ( itemManager . itemArray_dealer [ i ] == " magnifying glass " && ! dealerKnowsShell && shellSpawner . sequenceArray . size ( ) != 1 ) :
dealerWantsToUse = " magnifying glass "
if ( shellSpawner . sequenceArray [ 0 ] == " live " ) : knownShell = " live "
else : knownShell = " blank "
if ( knownShell == " live " ) : dealerTarget = " player "
else : dealerTarget = " self "
dealerKnowsShell = true
break
if ( itemManager . itemArray_dealer [ i ] == " cigarettes " ) :
if ( roundManager . health_opponent < roundManager . roundArray [ 0 ] . startingHealth ) :
dealerWantsToUse = " cigarettes "
2024-04-05 10:52:30 +01:00
hasCigs = false
break
if ( itemManager . itemArray_dealer [ i ] == " expired medicine " && roundManager . health_opponent < ( roundManager . roundArray [ 0 ] . startingHealth ) && ! hasCigs && ! usingMedicine ) :
if ( roundManager . health_opponent != 1 ) :
dealerWantsToUse = " expired medicine "
usingMedicine = true
break
2024-01-20 12:17:43 +00:00
if ( itemManager . itemArray_dealer [ i ] == " beer " && knownShell != " live " && shellSpawner . sequenceArray . size ( ) != 1 ) :
dealerWantsToUse = " beer "
shellEject_dealer . FadeOutShell ( )
2024-04-05 10:52:30 +01:00
if ( roundManager . endless ) :
dealerKnowsShell = false
knownShell = " "
2024-01-20 12:17:43 +00:00
break
if ( itemManager . itemArray_dealer [ i ] == " handcuffs " && roundManager . playerCuffed == false && shellSpawner . sequenceArray . size ( ) != 1 ) :
dealerWantsToUse = " handcuffs "
roundManager . playerCuffed = true
break
if ( itemManager . itemArray_dealer [ i ] == " handsaw " && ! roundManager . barrelSawedOff && knownShell == " live " ) :
dealerWantsToUse = " handsaw "
usingHandsaw = true
roundManager . barrelSawedOff = true
roundManager . currentShotgunDamage = 2
break
2024-04-05 10:52:30 +01:00
if ( itemManager . itemArray_dealer [ i ] == " burner phone " && roundManager . shellSpawner . sequenceArray . size ( ) > 2 ) :
var sequence = roundManager . shellSpawner . sequenceArray
var len = sequence . size ( )
var randindex = randi_range ( 1 , len - 1 )
if ( randindex == 8 ) : randindex -= 1
sequenceArray_knownShell [ randindex ] = true
dealerWantsToUse = " burner phone "
break
if ( itemManager . itemArray_dealer [ i ] == " inverter " && dealerKnowsShell && knownShell == " blank " ) :
dealerWantsToUse = " inverter "
knownShell = " live "
dealerKnowsShell = true
roundManager . shellSpawner . sequenceArray [ 0 ] = " live "
dealerTarget = " player "
break
2024-01-20 12:17:43 +00:00
if ( dealerWantsToUse == " " ) : mainLoopFinished = true
for i in range ( itemManager . itemArray_dealer . size ( ) ) :
if ( itemManager . itemArray_dealer [ i ] == " handsaw " ) : hasHandsaw = true
if ( mainLoopFinished && ! usingHandsaw && hasHandsaw && ! roundManager . barrelSawedOff && knownShell != " blank " ) :
var decision = CoinFlip ( )
if ( decision == 0 ) : dealerTarget = " self "
else :
dealerUsedItem = true
dealerTarget = " player "
dealerWantsToUse = " handsaw "
usingHandsaw = true
roundManager . barrelSawedOff = true
roundManager . currentShotgunDamage = 2
if ( dealerWantsToUse != " " ) :
if ( dealerHoldingShotgun ) :
animator_shotgun . play ( " enemy put down shotgun " )
shellLoader . DealerHandsDropShotgun ( )
dealerHoldingShotgun = false
await get_tree ( ) . create_timer ( . 45 , false ) . timeout
dealerUsedItem = true
if ( roundManager . waitingForDealerReturn ) :
await get_tree ( ) . create_timer ( 1.8 , false ) . timeout
roundManager . waitingForDealerReturn = false
2024-04-05 10:52:30 +01:00
var returning = false
if ( dealerWantsToUse == " expired medicine " ) :
var medicine_outcome = randf_range ( 0.0 , 1.0 )
var dying
2024-04-10 19:19:04 +01:00
if ( medicine_outcome < . 5 ) : dying = false
2024-04-05 10:52:30 +01:00
else : dying = true
medicine . dealerDying = dying
returning = true
var amountArray : Array [ AmountResource ] = amounts . array_amounts
for res in amountArray :
if ( dealerWantsToUse == res . itemName ) :
res . amount_dealer -= 1
break
var stealingFromPlayer = true
for i in range ( inv_dealerside . size ( ) ) :
if ( inv_dealerside [ i ] == dealerWantsToUse ) : stealingFromPlayer = false
var subtracting = true
var temp_stealing = false
for i in range ( itemManager . itemArray_instances_dealer . size ( ) ) :
if ( itemManager . itemArray_instances_dealer [ i ] . get_child ( 1 ) . itemName == dealerWantsToUse && itemManager . itemArray_instances_dealer [ i ] . get_child ( 1 ) . isPlayerSide && dealerWantsToUse != " adrenaline " && adrenalineSetup && stealingFromPlayer ) :
temp_stealing = true
await ( hands . PickupItemFromTable ( " adrenaline " ) )
itemManager . numberOfItemsGrabbed_enemy -= 1
subtracting = false
adrenalineSetup = false
break
if ( temp_stealing ) : hands . stealing = true
2024-01-20 12:17:43 +00:00
await ( hands . PickupItemFromTable ( dealerWantsToUse ) )
#if (dealerWantsToUse == "handcuffs"): await get_tree().create_timer(.8, false).timeout #additional delay for initial player handcuff check (continues outside animation)
if ( dealerWantsToUse == " cigarettes " ) : await get_tree ( ) . create_timer ( 1.1 , false ) . timeout #additional delay for health update routine (called in aninator. continues outside animation)
itemManager . itemArray_dealer . erase ( dealerWantsToUse )
2024-04-05 10:52:30 +01:00
if ( subtracting ) : itemManager . numberOfItemsGrabbed_enemy -= 1
if ( returning ) : return
2024-01-20 12:17:43 +00:00
DealerChoice ( )
return
if ( dealerWantsToUse == " " ) : dealerFinishedUsingItems = true
if ( roundManager . waitingForDealerReturn ) :
await get_tree ( ) . create_timer ( 1.8 , false ) . timeout
if ( ! dealerHoldingShotgun && dealerFinishedUsingItems ) :
GrabShotgun ( )
await get_tree ( ) . create_timer ( 1.4 + . 5 - 1 , false ) . timeout
await get_tree ( ) . create_timer ( 1 , false ) . timeout
if ( dealerTarget == " " ) : ChooseWhoToShootRandomly ( )
else : Shoot ( dealerTarget )
dealerTarget = " "
knownShell = " "
dealerKnowsShell = false
pass
2024-04-05 10:52:30 +01:00
func FigureOutShell ( ) :
if ( sequenceArray_knownShell [ 0 ] == true ) : return true
var seq = shellSpawner . sequenceArray
var mem = sequenceArray_knownShell
var c_live = 0
var c_blank = 0
for shell in seq :
if ( shell == " blank " ) : c_blank += 1
if ( shell == " live " ) : c_live += 1
if ( c_live == 0 ) : return true
if ( c_blank == 0 ) : return true
for c in mem . size ( ) :
if ( mem [ c ] == true ) :
if ( seq [ c ] == " live " ) : c_live -= 1
else : c_blank -= 1
if ( c_live == 0 ) : return true
if ( c_blank == 0 ) : return true
return false
2024-01-20 12:17:43 +00:00
func EndDealerTurn ( canDealerGoAgain : bool ) :
dealerCanGoAgain = canDealerGoAgain
#USINGITEMS: ASSIGN DEALER CAN GO AGAIN FROM ITEMS HERE
#CHECK IF OUT OF HEALTH
var outOfHealth_player = roundManager . health_player == 0
var outOfHealth_enemy = roundManager . health_opponent == 0
var outOfHealth = outOfHealth_player or outOfHealth_enemy
if ( outOfHealth ) :
#if (outOfHealth_player): roundManager.OutOfHealth("player")
if ( outOfHealth_enemy ) : roundManager . OutOfHealth ( " dealer " )
return
if ( ! dealerCanGoAgain ) :
EndTurnMain ( )
else :
if ( shellSpawner . sequenceArray . size ( ) ) :
BeginDealerTurn ( )
else :
EndTurnMain ( )
pass
func ChooseWhoToShootRandomly ( ) :
var decision = CoinFlip ( )
if ( decision == 0 ) : Shoot ( " self " )
else : Shoot ( " player " )
func GrabShotgun ( ) :
#await get_tree().create_timer(1, false).timeout
#camera.BeginLerp("enemy")
#await get_tree().create_timer(.8, false).timeout
await ( shellLoader . DealerHandsGrabShotgun ( ) )
await get_tree ( ) . create_timer ( . 2 , false ) . timeout
animator_shotgun . play ( " grab shotgun_pointing enemy " )
dealerHoldingShotgun = true
pass
func EndTurnMain ( ) :
await get_tree ( ) . create_timer ( . 5 , false ) . timeout
camera . BeginLerp ( " home " )
if ( dealerHoldingShotgun ) :
animator_shotgun . play ( " enemy put down shotgun " )
shellLoader . DealerHandsDropShotgun ( )
dealerHoldingShotgun = false
roundManager . EndTurn ( true )
func Shoot ( who : String ) :
var currentRoundInChamber = shellSpawner . sequenceArray [ 0 ]
dealerCanGoAgain = false
var playerDied = false
var dealerDied = false
ejectManager . FadeOutShell ( )
#ANIMATION DEPENDING ON WHO IS SHOT
match ( who ) :
" self " :
await get_tree ( ) . create_timer ( . 2 , false ) . timeout
animator_shotgun . play ( " enemy shoot self " )
await get_tree ( ) . create_timer ( 2 , false ) . timeout
shotgunShooting . whoshot = " dealer "
shotgunShooting . PlayShootingSound ( )
pass
" player " :
animator_shotgun . play ( " enemy shoot player " )
await get_tree ( ) . create_timer ( 2 , false ) . timeout
shotgunShooting . whoshot = " player "
shotgunShooting . PlayShootingSound ( )
pass
#SUBTRACT HEALTH. ASSIGN DEALER CAN GO AGAIN. RETURN IF DEAD
if ( currentRoundInChamber == " live " && who == " self " ) :
roundManager . health_opponent -= roundManager . currentShotgunDamage
if ( roundManager . health_opponent < 0 ) : roundManager . health_opponent = 0
smoke . SpawnSmoke ( " barrel " )
cameraShaker . Shake ( )
dealerCanGoAgain = false
death . Kill ( " dealer " , false , true )
return
if ( currentRoundInChamber == " live " && who == " player " ) :
roundManager . health_player -= roundManager . currentShotgunDamage
if ( roundManager . health_player < 0 ) : roundManager . health_player = 0
cameraShaker . Shake ( )
smoke . SpawnSmoke ( " barrel " )
await ( death . Kill ( " player " , false , false ) )
playerDied = true
if ( currentRoundInChamber == " blank " && who == " self " ) : dealerCanGoAgain = true
#EJECTING SHELLS
await get_tree ( ) . create_timer ( . 4 , false ) . timeout
if ( who == " player " ) : animator_shotgun . play ( " enemy eject shell_from player " )
if ( who == " self " ) : animator_shotgun . play ( " enemy eject shell_from self " )
await get_tree ( ) . create_timer ( 1.7 , false ) . timeout
#shellSpawner.sequenceArray.remove_at(0)
EndDealerTurn ( dealerCanGoAgain )
func Speaker_DealerArrive ( ) :
var p = randf_range ( . 9 , 1.0 )
speaker_dealerarrive . pitch_scale = p
speaker_dealerarrive . stream = sound_dealerarrive
speaker_dealerarrive . play ( )
func Speaker_DealerArrive_Cuffed ( ) :
var p = randf_range ( . 9 , 1.0 )
speaker_dealerarrive . pitch_scale = p
speaker_dealerarrive . stream = sound_dealerarriveCuffed
speaker_dealerarrive . play ( )
func Speaker_HandCrack ( ) :
var randindex = randi_range ( 0 , soundArray_cracks . size ( ) - 1 )
speaker_handCrack . stream = soundArray_cracks [ randindex ]
speaker_handCrack . play ( )
var swapped = false
func SwapDealerMesh ( ) :
if ( ! swapped ) :
dealermesh_normal . set_layer_mask_value ( 1 , false )
dealermesh_crushed . set_layer_mask_value ( 1 , true )
swapped = true
pass
func CoinFlip ( ) :
2024-04-05 10:52:30 +01:00
var result
if ( ! roundManager . endless ) :
result = randi_range ( 0 , 1 )
else :
var c_live = shellSpawner . sequenceArray . count ( " live " )
var c_blank = shellSpawner . sequenceArray . count ( " blank " )
if ( c_live == c_blank ) : result = randi_range ( 0 , 1 )
if ( c_live > c_blank ) : result = 1
if ( c_live < c_blank ) : result = 0
2024-01-20 12:17:43 +00:00
return result