const int SNAKE_DMG = 16; // Snake Damage
const int SNAKE_SPEED = 18; // Snake speed
const int SNAKE_CSPEED = 25; // Commanded snake speed

actor SearchSnakeBoss : BaseMM8BDMWep_CBM
{
tag "$TAGC_3F"
dropitem "SearchSnakeWepCDropped"
Weapon.AmmoUse 0
Weapon.AmmoGive 28
Weapon.AmmoGive2 15
Obituary "$OB_SEARCHSNAKE"
weapon.ammotype "SnakeManAmmo"
weapon.ammotype2 "SnakeCommandAmmo"
States
{
Spawn:
C_03 F 1
loop
Ready:
SNAB A 0 ACS_ExecuteAlways(998,0,DYE_SNAKEMAN)
SNAB A 0
SNAB A 0 A_GunFlash("Flash")
goto Ready1
Ready1:
SNAB A 0 A_JumpIfInventory("SnakeManAmmo",2,"Ready2")
SNAB A 0 A_JumpIfInventory("SnakeCommandAmmo",28,"Ready3")
SNAB A 5 A_WeaponReady(12)
SNAB A 0 A_GiveInventory("SnakeManAmmo",2)
SNAB A 0 A_GiveInventory("SnakeCommandAmmo",1)
loop
Ready2:
SNAB A 0 A_JumpIfInventory("SnakeCommandAmmo",28,"Ready4")
SNAB A 5 A_WeaponReady(8)
SNAB A 0 A_GiveInventory("SnakeManAmmo",2)
SNAB A 0 A_GiveInventory("SnakeCommandAmmo",1)
loop
Ready3:
SNAB A 0 A_JumpIfInventory("SnakeManAmmo",2,"Ready4")
SNAB A 5 A_WeaponReady(4)
SNAB A 0 A_GiveInventory("SnakeManAmmo",2)
SNAB A 0 A_GiveInventory("SnakeCommandAmmo",1)
loop
Ready4:
SNAB A 5 A_WeaponReady
SNAB A 0 A_GiveInventory("SnakeManAmmo",2)
SNAB A 0 A_GiveInventory("SnakeCommandAmmo",1)
loop

Deselect:
TNT1 AAAAAAAAAAAAAAAAAAAAAA 0 A_Lower
SNAB A 1 A_Lower
Loop
Select:
TNT1 AAAAAAAAAAAAAAAAAAAAAA 0 A_Raise
SNAB A 1 A_Raise
Loop

Fire:
SNAB A 0 A_PlaySoundEx("weapon/snakeshot","Weapon")
SNAB A 0 A_GiveInventory("SnakemanMain_CI",1)
SNAB B 1 Offset(-5, 41)
SNAB B 1 Offset(-9, 45)
SNAB B 1 Offset(-10, 46)
SNAB B 1 Offset(-9, 45)
SNAB B 1 Offset(-5, 41) A_GiveInventory("SnakeCommandAmmo",1) 
SNAB B 1 Offset(-2, 37)
//SNAB BC 2
//SNAB C 1
//SNAB B 1
SNAB A 4 A_WeaponReady(14)
SNAB A 0 A_GiveInventory("SnakeCommandAmmo",1)
Goto Ready1
AltFire:
SNAB A 0 A_GunFlash("Flash_Altfire")
SNAB D 0 A_GiveInventory("CBM_TargetMarker")
SNAB A 1 A_GiveInventory("SearchSnakeCommand",1)
SNAB A 0 A_PlaySoundEx("weapon/Snakecommand","Body")
SNAB AAA 1 A_TakeInventory("SnakeCommandAmmo",999)
SNAB A 6 A_FireCustomMissile("SnakemanMeleePoke",0,0,0,0)
SNAB AAA 3
SNAB A 2 A_TakeInventory("SearchSnakeCommand",1)
Goto Ready1

Flash:
TNT1 A 0 A_JumpIfInventory("IsDead",1,"NoFlash")
TNT1 A 1 A_GiveInventory("SnakemanFlashClimb_P",1)
loop
Flash_Altfire:
SNAB DEF 1 A_GiveInventory("SnakemanFlashClimb_P",1)
SNAB GHGHGHGHGHGHGH 1 A_GiveInventory("SnakemanFlashClimb_P",1)
SNAB FFED 1 A_GiveInventory("SnakemanFlashClimb_P",1)
Goto Flash
}
}

actor SnakeCommandAmmo : Ammo
{
inventory.amount 1
inventory.maxamount 28
+INVENTORY.IGNORESKILL
}

actor SnakeManAmmo : Ammo
{
inventory.amount 1
inventory.maxamount 28
+INVENTORY.IGNORESKILL
}

actor SearchSnakeCommand : OnceC {}
actor Climbing : OnceC {}
actor SnakeClimbing : OnceC {}

actor SnakeOnWall : PowerUp
{
Powerup.Duration 2
}

actor PowerSnakeSlowSpeed : PowerSpeed
{
powerup.duration 3
Speed 0.8
+POWERSPEED.NOTRAIL
}

actor SnakemanClimbingItem : CustomInventory
{
inventory.amount 1
inventory.maxamount 1
inventory.icon "SNAAZ"
Tag "$TAGC_CLIMBTOGGLE"
inventory.pickupmessage "Metal Gear Sssssolid?!"
scale 2.0
+INVBAR
states
{
Spawn:
SNAA Z 1
loop
Use:
TNT1 A 0 A_PlaySoundEx("item/ItemUseMM9","SoundSlot6")
TNT1 A 0 A_JumpIfInventory("SnakeClimbing",1,"Use2")
TNT1 A 0 A_GiveInventory("SnakeClimbing",1)
TNT1 A 0 A_TakeInventory("StaminaFlag",10)
fail
Use2:
TNT1 A 0 A_TakeInventory("SnakeClimbing",1)
TNT1 A 0 A_TakeInventory("StaminaFlag",10)
fail
}
}

actor SnakemanFlashClimb_P : CustomInventory
{
states
{
Pickup:
TNT1 A 0 A_JumpIfInventory("SnakeClimbing",1,"Pickup2")
goto PickupAmmo
Pickup2:
TNT1 A 0 A_GiveInventory("SnakeClimbCheckPickup",1)
goto PickupAmmo

PickupAmmo:
TNT1 A 0 A_JumpIf(z-floorz<1,"PickupAmmoYes")
goto PickupClimb
PickupAmmoYes:
TNT1 A 0 A_JumpIfInventory("StaminaFlag",500,"PickupClimb")
TNT1 A 0 A_GiveInventory("StaminaFlag",4)
goto PickupClimb

PickupClimb:
TNT1 A 0 A_JumpIfInventory("SnakeOnWall",1,"PickupClimbYes")
TNT1 A 0 SetPlayerProperty(0,0,3)
TNT1 A 0 A_TakeInventory("PowerSnakeSlowSpeed",1)
stop
PickupClimbYes:
TNT1 A 0 A_JumpIfInventory("FlightDisableFlag",1,2)
TNT1 A 0 SetPlayerProperty(0,1,3)
TNT1 A 0 A_GiveInventory("PowerSnakeSlowSpeed",1)
stop
}
}

actor SnakeClimbCheckPickup : CustomInventory
{
states
{
Pickup:
TNT1 A 0 A_JumpIfInventory("StaminaFlag",1,"Success")
stop
Success:
TNT1 A 0 A_SpawnItemEx("SnakeClimbCheck",0,0,16,0,0,34)
TNT1 A 0 //A_FireCustomMissile("SnakeClimbCheck",0,0,0,-12)
stop
}
}

actor SnakeClimbCheck
{
PROJECTILE
+DONTBLAST
+DONTSPLASH
+SKYEXPLODE
+THRUACTORS
+DONTREFLECT
Damage (0)
//radius 16
//height 56
radius 48//44
height 16
//height 88//112
speed 0
States
{
Spawn:
TNT1 A 0
TNT1 A 0 //A_CheckFloor("Death")
TNT1 A 1
stop
Death:
//TNT1 A 0 A_CheckFloor("Death2")
TNT1 A 0 //A_JumpIf(floorz==z,"Death2")
TNT1 A 0 A_TakeFromTarget("StaminaFlag",2)
TNT1 A 0 A_GiveToTarget("SnakeOnWall",1)
TNT1 A 1
stop
Death2:
TNT1 A 0
stop
}
}


actor SnakemanMeleePoke
{
PROJECTILE
Damagetype "SnakeM_Poke"//damagetype "Snake"
Obituary "$OB_SNAKEPOKE"
reactiontime 3
damage (10)
Radius 7
Height 7
speed 45
scale 2.5
States
{
Spawn:
TNT1 A 0
TNT1 A 1 A_CountDown
wait
Death:
TNT1 A 0 A_Explode(10,52,0)
goto XDeath
XDeath:
TNT1 A 0 A_Stop
TNT1 A 2
stop
}
}


actor SearchSnakeStartB : SearchSnakeStart
{
translation "192:192=4:4","198:198=104:104","250:250=106:106","249:249=132:132"
damage (12)
speed 27
damagetype "DMGNoHitstun"
States
{
Spawn:
TNT1 A 0
TNT1 A 0 ACS_NamedExecuteAlways("BULL_Tidifier", 0)
TNT1 A 0 A_ChangeVelocity(0,0,(momz/2))
SpawnLOOP:
X_3F A 4
loop
Death:
TNT1 A 0 A_JumpIf(ceilingz-z < 48, "XDeath")
TNT1 A 0 A_JumpIf(z-floorz!=0,"Air")
TNT1 A 0 A_SpawnItemEx("SearchSnakeB",0,0,0,SNAKE_SPEED,0,0,0,1,0,tid)
stop
Air:
TNT1 A 0 A_SpawnItemEx("UpSnake0B",-1,0,16,0,0,1,0,1)
stop
}
}


actor SearchSnakeStartBB : SearchSnakeStartB{Translation "192:192=205:205","198:198=74:74","250:250=196:196","249:249=199:199"}
actor SearchSnakeStartBR : SearchSnakeStartB{Translation "192:192=171:171","198:198=41:41","250:250=170:170","249:249=43:43"}
actor SearchSnakeStartBO : SearchSnakeStartB{Translation "192:192=104:104","198:198=128:128","250:250=138:138","249:249=131:131"}
actor SearchSnakeStartBP : SearchSnakeStartB{Translation "192:192=229:229","198:198=232:232","250:250=214:214","249:249=223:223"}


actor SearchSnakeCommandedStartB : SearchSnakeStartB
{
states
{
Spawn:
TNT1 A 0
TNT1 A 0 ACS_NamedExecuteAlways("BULL_Tidifier", 0)
SpawnLOOP:
W_3F A 4
loop
Death:
TNT1 A 0 A_JumpIf(ceilingz-z < 48, "XDeath")
TNT1 A 0 A_JumpIf(z-floorz!=0,"Air")
TNT1 A 0 A_SpawnItemEx("SearchSnakeCommandedB",0,0,0,SNAKE_CSPEED,0,0,0,1,0,tid)
stop
Air:
TNT1 A 0 A_SpawnItemEx("UpSnake0CommandedB",-1,0,16,0,0,1,0,1)
stop
}
}


actor SearchSnakeB : SearchSnake
{
damagetype "SnakeM_Snake"
damage (SNAKE_DMG)
States
{
Spawn:
X_3F B 2
TNT1 A 0
TNT1 A 0 ACS_NamedExecuteAlways("BULL_Tidifier", 0)
SpawnLOOP:
X_3F B 0
"----" # 0 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
X_3F A 1 A_JumpIf(z-floorz>8,"Down")
"----" # 0 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
X_3F A 1 A_JumpIf(z-floorz>8,"Down")
"----" # 0 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
X_3F B 1 A_JumpIf(z-floorz>8,"Down")
"----" # 0 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
X_3F B 1 A_JumpIf(z-floorz>8,"Down")
"----" # 0 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
X_3F B 1 A_JumpIf(z-floorz>8,"Down")
"----" # 0 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
X_3F B 1 A_JumpIf(z-floorz>8,"Down")
"----" # 0 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
X_3F A 1 A_JumpIf(z-floorz>8,"Down")
"----" # 0 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
X_3F A 1 A_JumpIf(z-floorz>8,"Down")
X_3F A 0 A_ChangeVelocity(SNAKE_SPEED,0,0,3)
Goto SpawnLOOP
Command:
"----" # 1 A_GiveToTarget("CBM_TargetMarker",1)
"----" # 1 ACS_ExecuteAlways(989,0,ACS_ExecuteWithResult(257)+100)
"----" # 0 A_SpawnItemEx("SearchSnakeCommandedStartB",0,0,0,SNAKE_CSPEED,0,8,0,1,0,tid) 
stop
Down:
TNT1 A 0 A_SpawnItemEx("DownSnakeB",0,0,0,0,0,-SNAKE_SPEED,0,1)
stop
Death:
TNT1 A 0 A_SpawnItemEx("UpSnake0B",-1,0,16,0,0,1,0,1)
stop
}
}

actor SearchSnakeCommandedB : SearchSnakeB
{

states
{
Spawn:
TNT1 A 0
TNT1 A 0 ACS_NamedExecuteAlways("BULL_Tidifier", 0)
SpawnLOOP:
W_3F B 2
W_3F B 0
W_3F AABBBBAA 1 A_JumpIf(z-floorz>8,"Down")
W_3F A 0 A_ChangeVelocity(SNAKE_CSPEED,0,0,3)
Goto SpawnLOOP+1
Down:
TNT1 A 0 A_SpawnItemEx("DownSnakeCommandedB",0,0,0,0,0,-SNAKE_CSPEED,0,1)
stop
Death:
TNT1 A 0 A_SpawnItemEx("UpSnake0CommandedB",-1,0,16,0,0,1,0,1)
stop
}
}


actor UpSnake0B : UpSnake0
{
damagetype "SnakeM_Snake"
Damage (SNAKE_DMG)
States
{
Spawn:
TNT1 A 0
TNT1 A 0 ACS_NamedExecuteAlways("BULL_Tidifier", 0)
SpawnLOOP:
X_3F C 0
X_3F C 0
X_3F C 0 A_ChangeVelocity(SNAKE_SPEED,0,0,3)
X_3F C 1 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
TNT1 A 0 A_JumpIf(z-floorz < 48, "SpawnFloor")
TNT1 A 0 A_SpawnItemEx("SearchSnakeB",0,0,0,SNAKE_SPEED,0,0,0,1)
stop
Command:
"----" # 1 A_GiveToTarget("CBM_TargetMarker",1)
"----" # 1 ACS_ExecuteAlways(989,0,ACS_ExecuteWithResult(257)+100)
"----" # 0 A_SpawnItemEx("SearchSnakeCommandedStartB",0,0,0,SNAKE_CSPEED,0,-3,0,1) 
stop
SpawnFloor:
X_3F C 0 A_SpawnItemEx("SearchSnakeB",0,0,-(z-floorz),SNAKE_SPEED,0,0,0,1)
stop
Continue:
TNT1 A 0 A_SpawnItemEx("UpSnake1B",0,0,4,0,0,SNAKE_SPEED,0,1)
stop
}
}

actor UpSnake0CommandedB : UpSnake0B
{
States
{
Spawn:
TNT1 A 0
TNT1 A 0 ACS_NamedExecuteAlways("BULL_Tidifier", 0)
SpawnLOOP:
W_3F C 0
W_3F C 0 A_ChangeVelocity(SNAKE_CSPEED,0,0,3)
W_3F C 1
TNT1 A 0 A_JumpIf(z-floorz < 48, "SpawnFloor")
TNT1 A 0 A_SpawnItemEx("SearchSnakeCommandedB",0,0,0,SNAKE_CSPEED,0,0,0,1)
stop
SpawnFloor:
W_3F C 0 A_SpawnItemEx("SearchSnakeCommandedB",0,0,-(z-floorz),SNAKE_CSPEED,0,0,0,1)
stop
Continue:
TNT1 A 0 A_SpawnItemEx("UpSnake1CommandedB",0,0,4,0,0,SNAKE_CSPEED,0,1)
stop
}
}


actor UpSnake1B : UpSnake1
{
damagetype "SnakeM_Snake"
Damage (SNAKE_DMG)
States
{
Spawn:
TNT1 A 0
TNT1 A 0 ACS_NamedExecuteAlways("BULL_Tidifier", 0)
SpawnLOOP:
X_3F C 0
X_3F C 0
X_3F CC 1 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
TNT1 A 0 A_Stop
TNT1 A 0 A_ChangeVelocity(SNAKE_SPEED,0,0,3)
X_3F C 1 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
TNT1 A 0 A_JumpIf(z-floorz < 48, "SpawnFloor")
TNT1 A 0 A_SpawnItemEx("SearchSnakeB",0,0,0,SNAKE_SPEED,0,0,0,1)
stop
Command:
"----" # 1 A_GiveToTarget("CBM_TargetMarker",1)
"----" # 1 ACS_ExecuteAlways(989,0,ACS_ExecuteWithResult(257)+100)
"----" # 0 A_SpawnItemEx("SearchSnakeCommandedStartB",0,0,0,SNAKE_CSPEED,0,-3,0,1) 
stop
SpawnFloor:
TNT1 A 0 A_SpawnItemEx("SearchSnakeB",0,0,-(z-floorz),SNAKE_SPEED,0,0,0,1)
stop
Continue:
TNT1 A 0 A_SpawnItemEx("UpSnake2B",0,0,4,0,0,SNAKE_SPEED,0,1)
stop
}
}

actor UpSnake1CommandedB : UpSnake1B
{
States
{
Spawn:
TNT1 A 0
TNT1 A 0 ACS_NamedExecuteAlways("BULL_Tidifier", 0)
SpawnLOOP:
W_3F C 2
TNT1 A 0 A_Stop
TNT1 A 0 A_ChangeVelocity(SNAKE_CSPEED,0,0,3)
W_3F C 1
TNT1 A 0 A_JumpIf(z-floorz < 48, "SpawnFloor")
TNT1 A 0 A_SpawnItemEx("SearchSnakeCommandedB",0,0,0,SNAKE_CSPEED,0,0,0,1)
stop
SpawnFloor:
TNT1 A 0 A_SpawnItemEx("SearchSnakeCommandedB",0,0,-(z-floorz),SNAKE_CSPEED,0,0,0,1)
stop
Continue:
TNT1 A 0 A_SpawnItemEx("UpSnake2CommandedB",0,0,4,0,0,SNAKE_CSPEED,0,1)
stop
}
}

actor UpSnake2B : UpSnake1B
{
States
{
Continue:
TNT1 A 0 A_SpawnItemEx("UpSnake3B",0,0,4,0,0,SNAKE_SPEED,0,1)
stop
}
}

actor UpSnake2CommandedB : UpSnake1CommandedB
{
States
{
Continue:
TNT1 A 0 A_SpawnItemEx("UpSnake3CommandedB",0,0,4,0,0,SNAKE_CSPEED,0,1)
stop
}
}

actor UpSnake3B : UpSnake1B
{
States
{
Spawn:
TNT1 A 0
TNT1 A 0 ACS_NamedExecuteAlways("BULL_Tidifier", 0)
SpawnLOOP:
X_3F D 0
X_3F D 0
X_3F DD 1 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
TNT1 A 0 A_Stop
TNT1 A 0 A_ChangeVelocity(SNAKE_SPEED,0,0,3) //A_Recoil(-18)
X_3F D 1 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
TNT1 A 0 A_JumpIf(z-floorz < 48, "SpawnFloor")
TNT1 A 0 A_SpawnItemEx("SearchSnakeB",0,0,0,SNAKE_SPEED,0,0,0,1)
stop
Command:
"----" # 1 A_GiveToTarget("TargetMarker", 1)
"----" # 1 ACS_ExecuteAlways(989,0,ACS_ExecuteWithResult(257)+100)
"----" # 0 A_SpawnItemEx("SearchSnakeCommandedStartB",0,0,0,SNAKE_CSPEED,0,-3,0,1) 
stop
SpawnFloor:
TNT1 A 0 A_SpawnItemEx("SearchSnakeB",0,0,-(z-floorz),SNAKE_SPEED,0,0,0,1)
stop
Continue:
TNT1 A 0 A_SpawnItemEx("UpSnake4B",0,0,4,0,0,SNAKE_SPEED,0,1)
stop
}
}

actor UpSnake3CommandedB : UpSnake1B
{
States
{
Spawn:
TNT1 A 0
TNT1 A 0 ACS_NamedExecuteAlways("BULL_Tidifier", 0)
SpawnLOOP:
W_3F D 0
W_3F D 2
TNT1 A 0 A_Stop
TNT1 A 0 A_ChangeVelocity(SNAKE_CSPEED,0,0,3)
W_3F D 1
TNT1 A 0 A_JumpIf(z-floorz < 48, "SpawnFloor")
TNT1 A 0 A_SpawnItemEx("SearchSnakeCommandedB",0,0,0,SNAKE_CSPEED,0,0,0,1)
stop
SpawnFloor:
TNT1 A 0 A_SpawnItemEx("SearchSnakeCommandedB",0,0,-(z-floorz),SNAKE_CSPEED,0,0,0,1)
stop
Continue:
TNT1 A 0 A_SpawnItemEx("UpSnake4CommandedB",0,0,4,0,0,SNAKE_CSPEED,0,1)
stop
}
}


actor UpSnake4B : UpSnake3B
{
States
{
Continue:
TNT1 A 0 A_SpawnItemEx("UpSnake1B",0,0,4,0,0,SNAKE_SPEED,0,1)
stop
}
}

actor UpSnake4CommandedB : UpSnake3CommandedB
{
States
{
Continue:
TNT1 A 0 A_SpawnItemEx("UpSnake1CommandedB",0,0,4,0,0,SNAKE_CSPEED,0,1)
stop
}
}


actor DownSnakeB : DownSnake
{
damagetype "SnakeM_Snake"
translation "192:192=4:4","198:198=104:104"
Damage (SNAKE_DMG)
States
{
Spawn:
TNT1 A 0
TNT1 A 0 ACS_NamedExecuteAlways("BULL_Tidifier", 0)
SpawnLOOP:
X_3F C 0
X_3F C 0
X_3F EEEEFFFF 1 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
Goto Spawn+2
Command:
"----" # 1 A_GiveToTarget("CBM_TargetMarker",1)
"----" # 1 ACS_ExecuteAlways(989,0,ACS_ExecuteWithResult(257)+100)
"----" # 0 A_SpawnItemEx("SearchSnakeCommandedStartB",0,0,0,SNAKE_CSPEED,0,-3,0,1) 
stop
Death:
TNT1 A 0 A_SpawnItemEx("SearchSnakeB",0,0,0,SNAKE_SPEED,0,0,0,1)
stop
}
}

actor DownSnakeCommandedB : DownSnakeB
{
States
{
Spawn:
TNT1 A 0
TNT1 A 0 ACS_NamedExecuteAlways("BULL_Tidifier", 0)
SpawnLOOP:
W_3F EF 4
loop
Death:
TNT1 A 0 A_SpawnItemEx("SearchSnakeCommandedB",0,0,0,SNAKE_CSPEED,0,0,0,1)
stop
}
}



actor SnakemanMain_CI : TeamColor_CI
{
states
{
FireX:
TNT1 A 0 A_FireCustomMissile("SearchSnakeStartB",0,1,-8,0)
goto Done
FireB:
TNT1 A 0 A_FireCustomMissile("SearchSnakeStartBB",0,1,-8,0)
goto Done
FireR:
TNT1 A 0 A_FireCustomMissile("SearchSnakeStartBR",0,1,-8,0)
goto Done
FireO:
TNT1 A 0 A_FireCustomMissile("SearchSnakeStartBO",0,1,-8,0)
goto Done
FireP:
TNT1 A 0 A_FireCustomMissile("SearchSnakeStartBP",0,1,-8,0)
goto Done
Done:
TNT1 A 0 A_TakeInventory("SnakeManAmmo",2)
stop
}
}