
// HELLMINE
//"HELLMINES. Offically worse than chronomines and indeterministic crushers combined." - Edward850, 2015
//"NOTE TO FUTURE YHOLL: REMEMBER THAT A_FACETARGET IS BORKED BEYOND BELIEF, STOP TRYING TO USE IT" - Yholl, 2018

ACTOR RLCyberneticLostSoul : RLLostSoulBase 16541
{
  Health 1
  Radius 16
  Height 24
  Speed 1
  
  DamageFactor "Radiation", 0
  DamageFactor "Neutron", 0.0 // Final Doomer Damagetype
  DamageFactor "Tachyon", 0.25 // Final Doomer Damagetype
  RenderStyle Normal
  
  AttackSound ""
  PainSound "hellmine/pain"
  DeathSound "rlmonsters/missilehit"
  ActiveSound ""
  
  -COUNTKILL
  +LOOKALLAROUND
  +DONTHARMSPECIES
  +THRUSPECIES
  +NOFEAR
  +SPAWNFLOAT
  +DONTSPLASH
  +SLIDESONWALLS
  
  Obituary "%o got too close to a Hellmine."
  Species "RLHellmine"
  Tag "Hellmine"
    //$category "MP Technophobia"
  
	// Guncaster compatibility
  
  var int user_hellminetimer;
  var int user_hellminespeedscale;
  States
  {
  Spawn:
    TNT1 A 0
    TNT1 A 0 A_PlaySound("hellmine/hum", 6, 0.4, 1, 10)
    TNT1 A 0 A_Wander
    TNT1 A 0 A_SpawnItemEx ("RLHellmineTrail", 0, 0, -2, 0, 0, -1, 0, SXF_NOCHECKPOSITION)
    TNT1 A 0 A_Weave (1, 1, 0.4, 0.4)
    TNT1 A 0 A_JumpIfInventory ("RLHellmineArmed", 1, 2)
    CSOL A 4 A_LookEx (LOF_NOSEESOUND, 0, 768, 0, 360, "TimerStart")
    Loop
    CSOL A 4 A_LookEx (LOF_NOSEESOUND, 0, 0, 0, 360, "TimerStart")
    Loop
	
  TimerStart:
    TNT1 A 0 A_SetUserVar("user_hellminetimer", 10)
	Goto See
	
  ClearTarget:
    TNT1 A 0 A_PlaySound("hellmine/losetarget", 7)
    TNT1 A 0 A_ClearTarget
	Goto Spawn
	
  See:
    TNT1 A 0 A_PlaySound("hellmine/hum", 6, 0.4, 1, 10)
    TNT1 A 0 A_JumpIfInventory ("PowerRLHellmineChargeCooldown", 1, 4)
    TNT1 A 0 A_JumpIfInventory ("RLHellmineArmed", 1, "StartCharge")
    TNT1 A 0 A_JumpIfCloser (768, 1)
	Goto Wandering
    TNT1 A 0 A_JumpIfTargetInLOS ("StartCharge", 0, JLOSF_DEADNOJUMP)
  Wandering:
    TNT1 A 0 A_Wander
    TNT1 A 0 A_SpawnItemEx ("RLHellmineTrail", 0,0,-2, 0,0,-1, 0, SXF_NOCHECKPOSITION)
    TNT1 A 0 A_Weave (1, 1, 0.4, 0.4)
    CSOL A 1 A_FaceTarget
    TNT1 A 0 A_JumpIfTargetInLOS ("TargetConfirmation", 0, JLOSF_DEADNOJUMP)
    TNT1 A 0 A_SetUserVar("user_hellminetimer", user_hellminetimer - 1)
    TNT1 A 0 A_JumpIf (user_hellminetimer <= 0, "ClearTarget")
    Goto TargetConfirmation
  TargetConfirmation:
    TNT1 A 0 A_JumpIf(CheckClass("PlayerPawn", AAPTR_TARGET, TRUE), "See")
	Goto ClearTarget
	
  StartCharge:
//    TNT1 A 0 A_Log ("gonna charge")
    TNT1 A 0 A_JumpIf(CheckClass("DoomRLDemolitionist", AAPTR_TARGET, TRUE), 3)
    TNT1 A 0 A_JumpIfInventory ("RLTacticalSetBonusActive", 1, 2, AAPTR_TARGET)
    TNT1 A 0 A_JumpIfCloser (100, "Missile") // Activates the arming sequence if it gets close enough to you
    TNT1 A 0 A_JumpIfTargetInLOS (1, 0, JLOSF_DEADNOJUMP)
	Goto Wandering
    TNT1 A 0 A_GiveInventory ("PowerRLHellmineChargeCooldown", 1)
    TNT1 A 0 A_PlaySound("heavyrevenant/boost", CHAN_ITEM, 1, 0, 0.8)
    TNT1 A 0 A_SpawnItemEx ("RLHellmineWhooshTrail", 0,0,0, 0,0,0, 0, SXF_NOCHECKPOSITION)
	Goto Charge
  Charge:
    TNT1 A 0 A_JumpIfInventory ("RLHellmineArmed", 1, "Charge2") // Overrides distance check if other mines blew up
    TNT1 A 0 A_JumpIfCloser (768, 1)
	Goto StopCharge
  Charge2:
    TNT1 A 0 A_JumpIfTargetInLOS (2, 0, JLOSF_DEADNOJUMP)
    TNT1 A 0 A_TakeInventory ("RLHellmineArmed", 1)
	Goto StopCharge
    TNT1 A 0 A_FaceTarget
//    TNT1 A 0 A_Log ("dodgery")
    TNT1 A 0 A_SetUserVar("user_hellminespeedscale", 20)
    TNT1 A 0 ThrustThing(angle*256/360+random(0,359), random(10,20), 0, 0)
    TNT1 A 0 ThrustThingZ(0, random(1,10), random(0,1), 1)
  DodgeLoop:
    TNT1 A 0 A_ScaleVelocity (0.92)
    CSOL A 1 A_SpawnItemEx ("RLHellmineTrail", 0,0,-2, 0,0,-1, 0, SXF_NOCHECKPOSITION)
    TNT1 A 0 A_SetUserVar("user_hellminespeedscale", user_hellminespeedscale - 1)
    TNT1 A 0 A_JumpIf (user_hellminespeedscale <= 0, "ChargeAttack")
	Goto DodgeLoop
	
  ChargeAttack:
//    TNT1 A 0 A_Log ("chargin")
    TNT1 A 0 A_PlaySound("heavyrevenant/boost", CHAN_ITEM, 1, 0, 0.8)
    TNT1 A 0 A_SpawnItemEx ("RLHellmineWhooshTrail", 0,0,0, 0,0,0, 0, SXF_NOCHECKPOSITION)
    TNT1 A 0 A_FaceTarget
    TNT1 A 0 A_SkullAttack (25)
  ChargeLoop:
    TNT1 A 0 A_JumpIf(CheckClass("DoomRLDemolitionist", AAPTR_TARGET, TRUE), 3)
    TNT1 A 0 A_JumpIfInventory ("RLTacticalSetBonusActive", 1, 2, AAPTR_TARGET)
    TNT1 A 0 A_JumpIfCloser (100, "Missile") // Activates the arming sequence if it gets close enough to you
    TNT1 A 0 A_Weave (8, 8, 0.4, 0.4)
    CSOL A 1 A_SpawnItemEx ("RLHellmineTrail", 0,0,-2, 0,0,-1, 0, SXF_NOCHECKPOSITION)
    TNT1 A 0 A_JumpIfTargetInLOS ("ChargeLoop", 200, JLOSF_DEADNOJUMP)
    Goto StopCharge
  StopCharge:
//    TNT1 A 0 A_Log ("dun wanna charge")
    TNT1 A 0 A_Stop
    Goto See
	
//	Arming sequence
  MissileProper:
//    TNT1 A 0 A_Log ("arming boomery")
	TNT1 A 0 A_ChangeFlag ("SKULLFLY", 0)
    TNT1 A 0 A_Stop
    TNT1 A 0 A_PlaySound("hellmine/arm", 7)
    CSOL B 3 Bright A_FaceTarget
    CSOL A 2 A_FaceTarget
//    TNT1 A 0 A_Log ("beep 1")
    CSOL B 3 Bright A_FaceTarget
    CSOL A 2 A_FaceTarget
//    TNT1 A 0 A_Log ("beep 2")
    CSOL B 3 Bright A_FaceTarget
    CSOL A 2 A_FaceTarget
//    TNT1 A 0 A_Log ("beep 3")
    TNT1 A 0 A_RadiusGive ("RLHellmineArmed", 4096, RGF_MONSTERS, 1)
    Goto Detonate
	
  Pain:
    TNT1 A 0 A_Pain
    Goto See

  //Fire
  Pain.Meteorfist:
	"####" "#" 0 A_FaceTarget
	"####" "#" 0 A_ChangeVelocity(frandom(-13.0,-17.0),0,frandom(9.0,11.0),CVF_RELATIVE)
	"####" "#" 0 A_Jump(256,"Pain")
	Goto Pain
  Pain.Fire:
	"####" "#" 0 A_Jump(256,"Pain")
	Goto Pain
	
  DeathMain:
    TNT1 A 0 A_JumpIf(CallACS("DRPGCheck"), "DeathAura")
  DeathAuraCheck:
    CSOL B 1 Bright
//    TNT1 A 0 A_Log ("death")
    TNT1 A 0 A_GiveInventory ("RLCyberneticLostSoulKillIncrementer", 1, AAPTR_PLAYER1) // Used for tallying total kills and bestiary info
    TNT1 A 0 A_StopSound(6)
    TNT1 A 0 A_Stop
    TNT1 A 0 A_SetTranslucent (0.95, 1)
    TNT1 A 0 A_JumpIfInventory("DRPGShadowAuraToken", 1, "SelfDestruct")		// DRPG Shadow Aura
    TNT1 A 0 A_JumpIfInventory("LDLegendaryMonsterTransformed", 1, "SelfDestruct")	// LegenDoom legendary monster
  StandardExplosion:
	TNT1 A 0 A_JumpIf(CallACS("DRLA_MonsterQuake") == 0, 3)
    TNT1 A 0 A_Quake(1, 18, 0, 512, "")
    TNT1 A 0 A_Quake(5, 12, 0, 256, "")
    TNT1 A 0 A_CustomMissile("RLHellmineExplosion",12,0)
	TNT1 A 0 A_JumpIf(CallACS("GnuCustardCheck"), "GuncasterImpact")
	TNT1 A 0 A_JumpIf(CallACS("DRLAMonsterOnlyCheck"), 1)
	Goto MineExplosionAnimation
	TNT1 A 0 A_JumpIf(CallACS("DRLA_specialstarts") == 2, "Death.RigelBlast")
  MineExplosionAnimation:
//    TNT1 A 0 A_Log ("kaboom")
    CSOL C 6 Bright A_Scream
    CSOL D 6 Bright A_NoBlocking
    CSOL E 6 Bright
    TNT1 A 0
    "####" "#" 0 A_Jump(256, "DestroyedEnd")
    Goto DestroyedEnd
    Stop
  Detonate:
//    TNT1 A 0 A_Log ("detonate")
    TNT1 A 0 A_Die
    Goto Death
  DeathFrame:
    TNT1 A 0
    "####" "#" 0 A_Jump(256, "DeathEnd")
    Goto DeathEnd
	
  //Fire
  Death.Meteorfist:
  Death.Lightning:
  Death.LightningBlue:
  Death.Fire:
	"####" "#" 0 A_Jump(256,"Death")
	Goto Death
	
	//Ice
  GenericFreezeDeath:
	"####" "#" 0 A_GiveInventory ("RLCyberneticLostSoulKillIncrementer", 1, AAPTR_PLAYER1) // Used for tallying total kills and bestiary info
    "####" "#" 0 A_Jump(256, "GenericFreezeMana")
    Goto GenericFreezeMana
//==============================================================================
//					--	DOOMRL ARSENAL STUFF  --
//==============================================================================
  Death.NeuralStun:
    TNT1 A 0
    Goto Death
  XDeath.RigelBlast:
  Death.RigelBlast:
    TNT1 A 0 A_GiveInventory ("RLCyberneticLostSoulKillIncrementer", 1, AAPTR_PLAYER1) // Used for tallying total kills and bestiary info
    TNT1 A 0 A_PlaySound("weapons/dn2gunexplosion", CHAN_BODY)
    TNT1 A 0 A_NoBlocking
    TNT1 A 0 A_SpawnItemEx ("RLDuke2MediumExplosion", 0,0,16, 0,0,0, 0, SXF_NOCHECKPOSITION)
    TNT1 A 35
    Stop
	
//==============================================================================
//					--	Special Monster Attacks  --
//==============================================================================
  DeathAura:
    TNT1 A 0 ACS_NamedExecuteAlways("GetAuraTokens", 0)
	Goto DeathAuraCheck
	
  SelfDestruct:
	TNT1 A 0 A_JumpIf(CallACS("DRLA_MonsterQuake") == 0, 3)
    TNT1 A 0 A_Quake(1, 18, 0, 1024, "")
    TNT1 A 0 A_Quake(5, 12, 0, 512, "")
    TNT1 A 0 A_CustomMissile("RLHellmineSuperExplosion",12,0)
    TNT1 A 0 A_SetScale (scalex * 2.0)
	TNT1 A 0 A_JumpIf(CallACS("DRLAMonsterOnlyCheck"), 1)
	Goto MineExplosionAnimation
	TNT1 A 0 A_JumpIf(CallACS("DRLA_specialstarts") == 2, "Death.RigelBlast")
	Goto MineExplosionAnimation

//==============================================================================
//					--	Final Doomer Compatibility Stuff  --
//==============================================================================
  DeathXSparkFrame:
    "####" "#" 0 A_JumpIfInTargetInventory("Mana",0,2)
    "####" "#" 0 A_DropItem("MinorManaPod",-1,54)
    CSOL A 0
    "####" "#" 0 A_Jump(256, "DeathXSpark")
	Goto DeathXSpark
	
//==============================================================================
//					--	Guncaster Compatibility Stuff  --
//==============================================================================
	MidasFrame1:
		CSOL A 0 A_SpawnItemEx("Midas_Statue_LostSoul", 0,0,0, 0,0,0, 0,SXF_TRANSFERPOINTERS|SXF_TRANSFERSPRITEFRAME)
		TNT1 A 0 A_JumpIf(1, "DestroyedEnd")
		Goto DestroyedEnd
	MidasFrame2:
		CSOL A 0 A_SpawnItemEx("Midas_Statue_LostSoul", 0,0,0, frandom(-10.0,-12.0),0,frandom(1.0,3.0), 0,SXF_TRANSFERPOINTERS|SXF_SETMASTER|SXF_TRANSFERSPRITEFRAME)
		TNT1 A 10 A_KillChildren
		TNT1 A 0 A_JumpIf(1, "DestroyedEnd")
		Goto DestroyedEnd
	MidasFrame3:
		CSOL A 0 A_SpawnItemEx("Midas_Statue_LostSoul", 0,0,0, frandom(-15.0,-20.0),0,frandom(10.0,15.0), 0,SXF_TRANSFERPOINTERS|SXF_SETMASTER|SXF_TRANSFERSPRITEFRAME)
		TNT1 A 10 A_KillChildren
		TNT1 A 0 A_JumpIf(1, "DestroyedEnd")
		Goto DestroyedEnd
		
	//Gumpop
    Death.Acid:    //So I did mention about meltdown death once...
        "####" "#" 0 A_JumpIfInTargetInventory("Mana",0,2)
        "####" "#" 0 A_DropItem("MinorManaPod",-1,24)
        "####" "#" 0 ACS_NamedExecuteAlways("Toxic Avenger")
        "####" "#" 0 A_NoBlocking
        "####" "#" 0 A_Scream
    AcidDeathLoop:
        "####" "#" 0 A_JumpIf(ScaleY <= 0, "DestroyedEnd")
        "####" "#" 0 A_FadeOut(0.03)
        CSOL A 1 A_SetScale(ScaleX + 0.03, ScaleY - 0.03)
        Loop
		
	//Thunderstruck
	Pain.Lightning:
		"####" "#" 0 A_Jump(164,1)
		Goto Pain
		CSOL A 0 A_ChangeFlag("NOPAIN",1)
		"####" "#" 0 A_SetUserVar("User_LightningLock", User_LightningLock + 10)
		"####" "#" 0 A_Jump(256,"LightningLock")
		Goto LightningLock
		
	//Cauterizer
	Pain.LightningBlue:
		"####" "#" 0 A_Jump(48,1)
		Goto Pain
		CSOL A 0 A_ChangeFlag("NOPAIN",1)
		"####" "#" 0 A_SetUserVar("User_LightningLock", User_LightningLock + 10)
		"####" "#" 0 A_Jump(256,"BlueLightningLock")
		Goto BlueLightningLock
		
		// Overwrite these for monsters that do not leave corpses behind
	//Dreadful
	Death.Tiberium:
		"####" "#" 0 A_Jump(256, "Death")
		Goto Death
	Death.BlueTiberium:
		"####" "#" 0 A_Jump(256, "Death")
		Goto Death
	//Fire and Lightning
	Death.Fire:
		"####" "#" 0 A_Jump(256,"Death")
		Goto Death
		
	  
  GuncasterImpact:
    TNT1 A 0 A_PlaySound("Matriarch/Hit", 5, 0.8)
    TNT1 A 0 A_PlaySound("Matriarch/Exp", 6, 1.0)
    TNT1 A 0 A_PlaySound("Matriarch/Exp", CHAN_ITEM, 0.05, 0, 0.05)
    TNT1 A 0 A_SpawnItemEx("RLGuncasterMonsterExplosion", 0,0,0, 0,0,0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION)
    Stop
  }
}

ACTOR RLHellmineTrail
{
   Projectile
   Radius 8
   Height 8
   Speed 1
   Scale 0.4
   Damage 0
   RENDERSTYLE ADD
   Alpha 0.15
   +NOCLIP
   +NOINTERACTION
   +NOTONAUTOMAP
   States
   {
   Spawn:
   CRES ABCDE 3 A_SetScale (ScaleX+0.2)
   Stop
   }
}

ACTOR RLHellmineWhooshTrail : RLHellmineTrail
{
   Scale 1.1
   Alpha 0.95
   States
   {
   Spawn:
   CRES ABCDE 3 A_SetScale (ScaleX+0.5)
   Stop
   }
}

ACTOR RLHellmineExplosion : Rocket
{
   Radius 1
   Height 1
   +THRUGHOST
   +BLOODSPLATTER
   -RANDOMIZE
   -DEHEXPLOSION
   -ROCKETTRAIL
   DamageType "Fire"
   PainType "Explosion"
   DeathType "Explosion"
   Speed 0
   Damage 0
   SeeSound ""
   DeathSound ""
   Obituary "%o got too close to a Hellmine."
  States
  {
  Spawn:
    TNT1 A 0 NoDelay A_Explode (48, 128)
    TNT1 A 8
    Stop
  }
}

ACTOR RLHellmineSuperExplosion : RLHellmineExplosion
{
  States
  {
  Spawn:
    TNT1 A 0 NoDelay A_Explode (128, 256)
    TNT1 A 8
    Stop
  }
}

Actor RLHellmineArmed : Inventory
{
inventory.maxamount 1
}

ACTOR PowerRLHellmineChargeCooldown : Powerup
{
	Powerup.Duration 60
}

ACTOR RLDRPGSummonedCyberneticLostSoul : RLCyberneticLostSoul
{
  -COUNTKILL
  +NOBLOCKMONST
  +NOTELESTOMP
  +NOFEAR
  +SEEINVISIBLE
  +DONTDRAIN
  +ALWAYSFAST
  +QUICKTORETALIATE
  +MISSILEMORE
  +THRUSPECIES
  Species "Player"
  States
  {
  Spawn:
	TNT1 A 0 NoDelay ACS_NamedExecuteAlways("MonsterInit", 0)
    TNT1 A 0 A_GiveInventory ("RLMonsterInitializerToken", 1)
    TNT1 A 0 A_GiveInventory ("DRPGDRLASummonedMonsterToken", 1)
	Goto Super::Spawn
	See:
	TNT1 A 0 ACS_NamedExecuteAlways("MonsterInit", 0)
    TNT1 A 0 A_GiveInventory ("RLMonsterInitializerToken", 1)
    TNT1 A 0 A_GiveInventory ("DRPGDRLASummonedMonsterToken", 1)
	Goto Super::See
  }
}

ACTOR RLTechnophobiaHellmine : RLCyberneticLostSoul
{
  Obituary "%o couldn't escape the Tech-Sinner's Hellmines."
  Species "RLIconOfSin"
}

ACTOR RLCCCyberneticLostSoul : RLCyberneticLostSoul
{
  +TOUCHY
  States
  {
  Spawn:
    CSOL A 10
    Loop
  See:
    CSOL A 10
    Loop
  Missile:
    CSOL B 3 Bright A_FaceTarget
    CSOL A 2 A_FaceTarget
    CSOL B 3 Bright A_FaceTarget
    CSOL A 2 A_FaceTarget
    CSOL B 3 Bright A_FaceTarget
    CSOL A 2 A_FaceTarget
    Goto See
  Melee:
    Stop
  Death:
    CSOL C 6 Bright A_Scream
    CSOL D 6 Bright A_NoBlocking
    CSOL E 6 Bright
    TNT1 A 15
    Stop
  }
}
