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

actor SearchSnakeBoss : BaseMM8BDMWep_CBM
{
tag "$TAGC_3F"
dropitem "SearchSnakeWepCDropped"
Weapon.AmmoUse 2
Weapon.AmmoGive 28
Weapon.AmmoUse2 28
Weapon.AmmoGive2 15
Obituary "$OB_SEARCHSNAKE"
weapon.ammotype "TastySnakeAmmo"
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("TastySnakeAmmo",2,"Ready2")
SNAB A 0 A_JumpIfInventory("SnakeCommandAmmo",28,"Ready3")
SNAB A 5 A_WeaponReady(12)
SNAB A 0 A_GiveInventory("TastySnakeAmmo",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("TastySnakeAmmo",2)
SNAB A 0 A_GiveInventory("SnakeCommandAmmo",1)
loop
Ready3:
SNAB A 0 A_JumpIfInventory("TastySnakeAmmo",2,"Ready4")
SNAB A 5 A_WeaponReady(4)
SNAB A 0 A_GiveInventory("TastySnakeAmmo",2)
SNAB A 0 A_GiveInventory("SnakeCommandAmmo",1)
loop
Ready4:
SNAB A 5 A_WeaponReady
SNAB A 0 A_GiveInventory("TastySnakeAmmo",2)
SNAB A 0 A_GiveInventory("SnakeCommandAmmo",1)
loop

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

Fire:
SNAB A 0 A_PlaySoundEx("weapon/mbuster","Weapon")
SNAB A 0 A_GiveInventory("SnakemanMain_CI",1)
SNAB B 3
SNAB C 2
SNAB C 1 A_GiveInventory("SnakeCommandAmmo",1)
SNAB A 4
SNAB A 0 A_GiveInventory("SnakeCommandAmmo",1)
Goto Ready1
AltFire:
SNAB D 0 A_GiveInventory("CBM_TargetMarker")
SNAB D 1 A_GiveInventory("SearchSnakeCommand",1)
SNAB EFG 1
SNAB G 0 A_PlaySoundEx("weapon/Snakecommand","Body")
SNAB G 6 A_FireCustomMissile("SnakemanMeleePoke",0,1,0,0)
SNAB FED 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
}
}

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

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

actor SnakeClamberAmmo : Ammo
{
inventory.amount 1
inventory.maxamount 500
+INVENTORY.IGNORESKILL
}

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

actor SnakeOnWall : PowerUp
{
Powerup.Duration 2
}

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

actor SnakemanClimbingItem : BasicClassItem
{
inventory.icon "SnakIcon"
inventory.pickupmessage "Metal Gear Sssssolid?!"
Tag "Snake Climb Toggle"
states
{
Spawn:
SNAB Z 1
loop
Use:
TNT1 A 0 A_PlaySoundEx("item/ItemUseMM9","SoundSlot7")
TNT1 A 0 A_JumpIfInventory("SnakeClimbing",1,"Use2")
TNT1 A 0 A_GiveInventory("SnakeClimbing",1)
fail
Use2:
TNT1 A 0 A_TakeInventory("SnakeClimbing",1)
TNT1 A 0 A_TakeInventory("SnakeClamberAmmo",1)
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("SnakeClamberAmmo",500,"PickupClimb")
TNT1 A 0 A_GiveInventory("SnakeClamberAmmo",3)
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("SnakeClamberAmmo",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
+EXPLODEONWATER
+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("SnakeClamberAmmo",1,1)
TNT1 A 0 A_GiveToTarget("SnakeOnWall",1)
TNT1 A 1
stop
Death2:
TNT1 A 0
stop
}
}


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


actor SnakeM_SnakeStart
{
Translation "192:192=4:4","198:198=104:104","250:250=106:106","249:249=132:132"
PROJECTILE
damagetype "SnakeM_Snake"
Obituary "$OB_SEARCHSNAKE"
-NOGRAVITY
damage (180)
Radius 6
Height 5
speed 24
Scale 2.5
States
{
Spawn:
X_3F A 4
loop
Death:
TNT1 A 0 //A_LOGINT(ceilingz-z)
TNT1 A 0 A_JumpIf(ceilingz-z < 48, "XDeath")
TNT1 A 0 A_JumpIf(z-floorz!=0,"Air")
TNT1 A 0 A_SpawnItemEx("SnakeM_SnakeFloor",0,0,0,SNAKE_SPEED,0,0,0,1)
stop
Air:
TNT1 A 0 A_SpawnItemEx("SnakeM_SnakeUp0",-1,0,16,0,0,1,0,1)
stop
XDeath:
Crash:
TNT1 A 0
stop
}
}


actor SnakeM_SnakeStartB : SnakeM_SnakeStart{Translation "192:192=205:205","198:198=74:74","250:250=196:196","249:249=199:199"}
actor SnakeM_SnakeStartR : SnakeM_SnakeStart{Translation "192:192=171:171","198:198=41:41","250:250=170:170","249:249=43:43"}
actor SnakeM_SnakeStartO : SnakeM_SnakeStart{Translation "192:192=104:104","198:198=128:128","250:250=138:138","249:249=131:131"}
actor SnakeM_SnakeStartP : SnakeM_SnakeStart{Translation "192:192=229:229","198:198=232:232","250:250=214:214","249:249=223:223"}


actor SnakeM_FiatSnakeStart : SnakeM_SnakeStart
{
damagetype "SnakeM_Snake2"
states
{
Spawn:
V_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("SnakeM_FiatSnakeFloor",0,0,0,SNAKE_CSPEED,0,0,0,1)
stop
Air:
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeUp0",-1,0,16,0,0,1,0,1)
stop
}
}

actor SnakeM_SnakeFloor
{
PROJECTILE
damagetype "SnakeM_Snake"
Obituary "$OB_SEARCHSNAKE"
+STEPMISSILE
maxstepheight 17
damage (180)
Radius 6
Height 5
Speed 23
Scale 2.5
States
{
Spawn:
X_3F B 2
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 Spawn+1
Command:
"----" # 1
"----" # 1 ACS_ExecuteAlways(989,0,ACS_ExecuteWithResult(257)+100)
"----" # 0 A_SpawnItemEx("SnakeM_FiatSnakeStart",0,0,0,SNAKE_CSPEED,0,8,0,1) 
stop
Down:
TNT1 A 0 A_SpawnItemEx("SnakeM_SnakeDown",0,0,0,0,0,-SNAKE_SPEED,0,1)
stop
XDeath:
Crash:
TNT1 A 0
stop
Death:
TNT1 A 0 A_SpawnItemEx("SnakeM_SnakeUp0",-1,0,16,0,0,1,0,1)
stop
}
}

actor SnakeM_FiatSnakeFloor : SnakeM_SnakeFloor
{
damagetype "SnakeM_Snake2"
states
{
Spawn:
V_3F B 2
V_3F B 0
V_3F AABBBBAA 1 A_JumpIf(z-floorz>8,"Down")
V_3F A 0 A_ChangeVelocity(SNAKE_CSPEED,0,0,3)
Goto Spawn+1
Down:
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeDown",0,0,0,0,0,-SNAKE_CSPEED,0,1)
stop
Death:
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeUp0",-1,0,16,0,0,1,0,1)
stop
}
}


actor SnakeM_SnakeUp0 : SnakeM_SnakeFloor
{
+NOGRAVITY
+STEPMISSILE
maxstepheight 17
States
{
Spawn:
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("SnakeM_SnakeFloor",0,0,0,SNAKE_SPEED,0,0,0,1)
stop
Command:
"----" # 1
"----" # 1 ACS_ExecuteAlways(989,0,ACS_ExecuteWithResult(257)+100)
"----" # 0 A_SpawnItemEx("SnakeM_FiatSnakeStart",0,0,0,SNAKE_CSPEED,0,-3,0,1) 
stop
SpawnFloor:
X_3F C 0 A_SpawnItemEx("SnakeM_SnakeFloor",0,0,-(z-floorz),SNAKE_SPEED,0,0,0,1)
stop
Death:
TNT1 A 0 A_JumpIf(ceilingz-z > 48, "Continue")
TNT1 A 0
stop
Continue:
TNT1 A 0 A_SpawnItemEx("SnakeM_SnakeUp1",0,0,4,0,0,SNAKE_SPEED,0,1)
stop
}
}

actor SnakeM_FiatSnakeUp0 : SnakeM_SnakeUp0
{
damagetype "SnakeM_Snake2"
States
{
Spawn:
V_3F C 0
V_3F C 0 A_ChangeVelocity(SNAKE_CSPEED,0,0,3)
V_3F C 1
TNT1 A 0 A_JumpIf(z-floorz < 48, "SpawnFloor")
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeFloor",0,0,0,SNAKE_CSPEED,0,0,0,1)
stop
SpawnFloor:
V_3F C 0 A_SpawnItemEx("SnakeM_FiatSnakeFloor",0,0,-(z-floorz),SNAKE_CSPEED,0,0,0,1)
stop
Continue:
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeUp1",0,0,4,0,0,SNAKE_CSPEED,0,1)
stop
}
}


actor SnakeM_SnakeUp1 : SnakeM_SnakeUp0
{
States
{
Spawn:
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("SnakeM_SnakeFloor",0,0,0,SNAKE_SPEED,0,0,0,1)
stop
Command:
"----" # 1
"----" # 1 ACS_ExecuteAlways(989,0,ACS_ExecuteWithResult(257)+100)
"----" # 0 A_SpawnItemEx("SnakeM_FiatSnakeStart",0,0,0,SNAKE_CSPEED,0,-3,0,1) 
stop
SpawnFloor:
TNT1 A 0 A_SpawnItemEx("SnakeM_SnakeFloor",0,0,-(z-floorz),SNAKE_SPEED,0,0,0,1)
stop
Continue:
TNT1 A 0 A_SpawnItemEx("SnakeM_SnakeUp2",0,0,4,0,0,SNAKE_SPEED,0,1)
stop
}
}

actor SnakeM_FiatSnakeUp1 : SnakeM_SnakeUp1
{
damagetype "SnakeM_Snake2"
States
{
Spawn:
V_3F C 2
TNT1 A 0 A_Stop
TNT1 A 0 A_ChangeVelocity(SNAKE_CSPEED,0,0,3)
V_3F C 1
TNT1 A 0 A_JumpIf(z-floorz < 48, "SpawnFloor")
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeFloor",0,0,0,SNAKE_CSPEED,0,0,0,1)
stop
SpawnFloor:
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeFloor",0,0,-(z-floorz),SNAKE_CSPEED,0,0,0,1)
stop
Continue:
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeUp2",0,0,4,0,0,SNAKE_CSPEED,0,1)
stop
}
}

actor SnakeM_SnakeUp2 : SnakeM_SnakeUp1
{
States
{
Continue:
TNT1 A 0 A_SpawnItemEx("SnakeM_SnakeUp3",0,0,4,0,0,SNAKE_SPEED,0,1)
stop
}
}

actor SnakeM_FiatSnakeUp2 : SnakeM_FiatSnakeUp1
{
damagetype "SnakeM_Snake2"
States
{
Continue:
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeUp3",0,0,4,0,0,SNAKE_CSPEED,0,1)
stop
}
}

actor SnakeM_SnakeUp3 : SnakeM_SnakeUp1
{
States
{
Spawn:
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("SnakeM_SnakeFloor",0,0,0,SNAKE_SPEED,0,0,0,1)
stop
Command:
"----" # 1
"----" # 1 ACS_ExecuteAlways(989,0,ACS_ExecuteWithResult(257)+100)
"----" # 0 A_SpawnItemEx("SnakeM_FiatSnakeStart",0,0,0,SNAKE_CSPEED,0,-3,0,1) 
stop
SpawnFloor:
TNT1 A 0 A_SpawnItemEx("SnakeM_SnakeFloor",0,0,-(z-floorz),SNAKE_SPEED,0,0,0,1)
stop
Continue:
TNT1 A 0 A_SpawnItemEx("SnakeM_SnakeUp4",0,0,4,0,0,SNAKE_SPEED,0,1)
stop
}
}

actor SnakeM_FiatSnakeUp3 : SnakeM_SnakeUp1
{
damagetype "SnakeM_Snake2"
States
{
Spawn:
V_3F D 0
V_3F D 2
TNT1 A 0 A_Stop
TNT1 A 0 A_ChangeVelocity(SNAKE_CSPEED,0,0,3)
V_3F D 1
TNT1 A 0 A_JumpIf(z-floorz < 48, "SpawnFloor")
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeFloor",0,0,0,SNAKE_CSPEED,0,0,0,1)
stop
SpawnFloor:
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeFloor",0,0,-(z-floorz),SNAKE_CSPEED,0,0,0,1)
stop
Continue:
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeUp4",0,0,4,0,0,SNAKE_CSPEED,0,1)
stop
}
}


actor SnakeM_SnakeUp4 : SnakeM_SnakeUp3
{
States
{
Continue:
TNT1 A 0 A_SpawnItemEx("SnakeM_SnakeUp1",0,0,4,0,0,SNAKE_SPEED,0,1)
stop
}
}

actor SnakeM_FiatSnakeUp4 : SnakeM_FiatSnakeUp3
{
damagetype "SnakeM_Snake2"
States
{
Continue:
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeUp1",0,0,4,0,0,SNAKE_CSPEED,0,1)
stop
}
}


actor SnakeM_SnakeDown : SnakeM_SnakeFloor
{
+NOGRAVITY
-NOEXPLODEFLOOR
States
{
Spawn:
X_3F C 0
X_3F C 0
X_3F EEEEFFFF 1 A_JumpIfInTargetInventory("SearchSnakeCommand",1,"Command")
Goto Spawn+2
Command:
"----" # 1
"----" # 1 ACS_ExecuteAlways(989,0,ACS_ExecuteWithResult(257)+100)
"----" # 0 A_SpawnItemEx("SnakeM_FiatSnakeStart",0,0,0,SNAKE_CSPEED,0,-3,0,1) 
stop
Death:
TNT1 A 0 A_SpawnItemEx("SnakeM_SnakeFloor",0,0,0,SNAKE_SPEED,0,0,0,1)
stop
}
}

actor SnakeM_FiatSnakeDown : SnakeM_SnakeDown
{
damagetype "SnakeM_Snake2"
States
{
Spawn:
V_3F EF 4
loop
Death:
TNT1 A 0 A_SpawnItemEx("SnakeM_FiatSnakeFloor",0,0,0,SNAKE_CSPEED,0,0,0,1)
stop
}
}


actor SnakemanMain_CI : TeamColor_CI
{
states
{
FireX:
TNT1 A 0 A_FireCustomMissile("SnakeM_SnakeStart",0,1,-8,0)
goto Done
FireB:
TNT1 A 0 A_FireCustomMissile("SnakeM_SnakeStartB",0,1,-8,0)
goto Done
FireR:
TNT1 A 0 A_FireCustomMissile("SnakeM_SnakeStartR",0,1,-8,0)
goto Done
FireO:
TNT1 A 0 A_FireCustomMissile("SnakeM_SnakeStartO",0,1,-8,0)
goto Done
FireP:
TNT1 A 0 A_FireCustomMissile("SnakeM_SnakeStartP",0,1,-8,0)
goto Done
}
}