
class ZHeadshotTarget : Actor
{

	override int DamageMobj(Actor inflictor, Actor source, int damage, Name mod, int flags, double angle)
    	{
		if(master && source && source==master) return 0;

		if(inflictor && inflictor.GetClass() is 'Doom_ArchvileFireShield') damage = 0;

		if(!source && inflictor) source = inflictor;

		if(master && source && source!=master && master.health>0)
		{
		    bool mastertracerdeadbody = true;
		    if(master.tracer) {
			let inv = master.tracer.FindInventory("MonsterPossessed");
			if (inv!=null && inv.Amount>0) {
				let mt = ZBaseActor(master.tracer);
				if(mt.possessor && mt.possessor==master) {
					String st = master.tracer.GetClassName();
					if (st.IndexOf("Dead")<0) mastertracerdeadbody = false;
				}
			}
		    }

		    if(!master.tracer || (master.tracer && (master.tracer.health<1 || mastertracerdeadbody))) {
        		if(mod == 'Bullet' || mod == 'Chaingun')
        		{
				int damagebullet = damage*2;
				if(master.species=="Octabrains" || master.species=="Megabrains" || master.species=="OctabrainLames") {damagebullet=damage*1;}
				master.DamageMobj(inflictor, source, damagebullet, mod, flags, angle);
        		}
 		       	else if(mod == 'FireChaingun')
        		{
				int damagebullet = damage*2;
				int damagebulletflame = master.ApplyDamageFactor("BulletFlame", damage);
				if(master.species=="Octabrains" || master.species=="Megabrains" || master.species=="OctabrainLames") {damagebullet=damage*1; damagebulletflame=0;}
				damagebulletflame = damagebullet + damagebulletflame;
				master.DamageMobj(inflictor, source, 0, mod, flags, angle);
				master.DamageMobj(inflictor, source, damagebulletflame, "Headshot", flags, angle);
			}
 		       	else if(mod == 'Shotgun' || mod == 'SSG')
        		{
				int realdamage = master.ApplyDamageFactor(mod, damage);
				int damagebullet = realdamage*2;
				if(master.species=="Octabrains" || master.species=="Megabrains" || master.species=="OctabrainLames") {damagebullet=realdamage*1;}
				master.DamageMobj(inflictor, source, 0, mod, flags, angle);
				master.DamageMobj(inflictor, source, damagebullet, "Headshot", flags, angle);
	        	}
 		       	else if(mod == 'ExplosiveShotgun')
        		{
				if(master.bBOSS) {
					int realdamage = master.ApplyDamageFactor(mod, damage);
					int damagebullet = realdamage*2;
					int damagebulletexplosive = damagebullet + 3*master.ApplyDamageFactor("ShellExplosion", damage);
					master.DamageMobj(inflictor, source, 0, mod, flags, angle);
					master.DamageMobj(inflictor, source, damagebulletexplosive, "RocketHeadshot", flags, angle);
				} else {
					if (random[RIDMONSTERPROB](1,256)>213) {
						int realdamage = master.ApplyDamageFactor(mod, damage);
						int damagebullet = realdamage*2;
						int damagebulletexplosive = master.ApplyDamageFactor("ShellExplosion", damage);
						if(master.species=="Octabrains" || master.species=="Megabrains" || master.species=="OctabrainLames") {damagebullet=realdamage*1; damagebulletexplosive=damagebulletexplosive*3;}
						damagebulletexplosive = damagebullet + damagebulletexplosive;
						master.DamageMobj(inflictor, source, 0, mod, flags, angle);
						master.DamageMobj(inflictor, source, damagebulletexplosive, "Headshot", flags, angle);
					} else {
						int damagebullet = damage*2;
						int damagebulletexplosive = master.ApplyDamageFactor("ShellExplosion", damage);
						if(master.species=="Octabrains" || master.species=="Megabrains" || master.species=="OctabrainLames") {damagebullet=damage*1; damagebulletexplosive=damagebulletexplosive*3;}
						damagebulletexplosive = damagebullet + damagebulletexplosive;
						master.DamageMobj(inflictor, source, damagebulletexplosive, mod, flags, angle);
					}
				}
	        	}
	        	else if(mod == 'Shrinkerhit')
        		{
				master.DamageMobj(inflictor, source, damage, "Shrinker", flags, angle);
	        	}
			else if(mod == 'RocketExplosion')
        		{
				if(master.bBOSS) {
					int realdamage = master.ApplyDamageFactor(mod, damage);
					int damagerocket = realdamage*3;
					master.DamageMobj(inflictor, source, 0, mod, flags, angle);
					master.DamageMobj(inflictor, source, damagerocket, "RocketHeadshot", flags, angle);
				} else {
					int damagerocket = damage*1;
					if(master.species=="Octabrains" || master.species=="Megabrains" || master.species=="OctabrainLames") {damagerocket=damage*3;}
					master.DamageMobj(inflictor, source, damagerocket, mod, flags, angle);
				}
	        	}
        		else if(mod == 'Plasma')
        		{
				int realdamage = master.ApplyDamageFactor(mod, damage);
				int damageplasma = realdamage*1.5;
				if(master.bBOSS) {damageplasma=realdamage*2;}
				if(master.species=="Octabrains" || master.species=="Megabrains" || master.species=="OctabrainLames") {damageplasma=realdamage*1;}
				master.DamageMobj(inflictor, source, damageplasma, "PlasmaHeadshot", flags, angle);
	        	}
        		else if(mod == 'MightyBoot')
        		{
				int realdamage = master.ApplyDamageFactor(mod, damage);
				int damagekick = realdamage*1.25;
				if(master.species=="Octabrains" || master.species=="Megabrains" || master.species=="OctabrainLames") {damagekick=realdamage*1;}
				let invst = source.FindInventory("SteroidsActive");
				if(invst!=null && invst.Amount==1) {
					if ( (master.health-damagekick)<=0 ) {
						master.DamageMobj(inflictor, source, 0, mod, flags, angle);
						master.DamageMobj(inflictor, source, damagekick, "Headshot", flags, angle);
					} else {
						damagekick = damage*1.25;
						if(master.species=="Octabrains" || master.species=="Megabrains" || master.species=="OctabrainLames") {damagekick=damage*1;}
						master.DamageMobj(inflictor, source, damagekick, mod, flags, angle);
					}
				} else {
					damagekick = damage*1.25;
					if(master.species=="Octabrains" || master.species=="Megabrains" || master.species=="OctabrainLames") {damagekick=damage*1;}
					master.DamageMobj(inflictor, source, damagekick, mod, flags, angle);
				}
			}
			else
        		{
				master.DamageMobj(inflictor, source, damage, mod, flags, angle);
	        	}
		    } else {
	        	if(mod == 'Shrinkerhit')
        		{
				master.tracer.DamageMobj(inflictor, source, damage, "Shrinker", flags, angle);
	        	}
			else if(mod == 'ExplosiveShotgun')
			{
				int damagebulletexplosive = master.tracer.ApplyDamageFactor("ShellExplosion", damage);
				int damagepossessed = ((damage + damagebulletexplosive)/2.0)*1.5*1.5;
				master.tracer.DamageMobj(inflictor, source, damagepossessed, mod, flags, angle);
			}
			else if(mod == 'FireChaingun')
			{
				int damagebulletflame = master.tracer.ApplyDamageFactor("BulletFlame", damage);
				int damagepossessed = (damage + damagebulletflame)*1.5;
				master.tracer.DamageMobj(inflictor, source, damagepossessed, mod, flags, angle);
			}
			else
        		{
				int damagepossessed = damage*1.5;
				master.tracer.DamageMobj(inflictor, source, damagepossessed, mod, flags, angle);
	        	}
		    }
		}

        	return super.DamageMobj(inflictor, source, damage, mod, flags, angle);
	}

	override void Tick()
	{
		Super.Tick();

		if(!master) Destroy();

		if (master) {
			if(master.health < 1) Destroy();
			self.A_SetSize(master.radius+1, master.height/7.0);
			self.A_Warp(AAPTR_MASTER,0,0,master.height - self.height - master.Accuracy - (master.GetFloorTerrain().footclip*!master.bFLOAT),0,WARPF_INTERPOLATE|WARPF_COPYINTERPOLATION|WARPF_NOCHECKPOSITION|WARPF_BOB);
			if(!master.tracer || (master.tracer && master.tracer.health<1)) {
				if (master.health>0 && master.bINVULNERABLE==false) {
					self.bINVULNERABLE=0; self.bNODAMAGE=0; self.bNOPAIN=0; self.bTHRUACTORS=0; self.bGHOST=0; self.ThruBits=0;
				} else {
					self.bINVULNERABLE=1; self.bNODAMAGE=1; self.bNOPAIN=1; self.bTHRUACTORS=1; self.bGHOST=1; self.ThruBits=1;
				}
			}
		}
	}

}