
local luastuffrelatingtothisspecfically = 0

//Shield Actions by Endless (Elemental Shield Enhancements by Golden Fireball)

COM_AddCommand("HRshieldactions", function(player, arg1)	

	if arg1=="off" or arg1=="1" then
	CONS_Printf(player, "\x83"+"Shield Actions removed, reverted to base srb2... Good luck\x82 ")
	luastuffrelatingtothisspecfically = 1
	end
	
	if arg1=="on" or arg1=="0" then
	CONS_Printf(player, "\x83"+"Shield Actions reactivated.\x82 ")
	luastuffrelatingtothisspecfically = 0
	end
	
	if arg1=="21" then
	CONS_Printf(player, "\x83"+"Expected an easter egg like for abilities?")
	end
	
	if arg1==nil then
	CONS_Printf(player, "\x83"+"This affects every new/altered shield sbility in History Reimagined.")
	CONS_Printf(player, " ")
	CONS_Printf(player, "\x83"+"NOT RECOMMENDED TO CHANGE TO BASE SRB2, HR RELIES ON THESE NEW ABILITIES.\x82 ")
	end
end)

freeslot(
	"MT_SHIELDBUBBLE",
	"S_SHIELDBUBBLE",
	"S_SHIELDBUBBLE1",
	"S_SHIELDBUBBLE2",
	"S_SHIELDBUBBLE3",
	"S_SHIELDBUBBLE4",
	"S_SHIELDBUBBLEDIE",
	"MT_DEADLYSHIELDBUBBLE",
	"S_DEADLYSHIELDBUBBLE",
	"S_DEADLYSHIELDBUBBLE1",
	"S_DEADLYSHIELDBUBBLE2",
	"S_DEADLYSHIELDBUBBLE3",
	"S_DEADLYSHIELDBUBBLE4",
	"S_DEADLYSHIELDBUBBLEDIE",
	"MT_LEAF",
	"S_LEAF",
	"S_LEAF1",
	"S_LEAF2",
	"SPR_LEAF",
	"MT_ELEMENTALUP",
	"S_ELEMENTALHITHERE",
	"S_ELEMENTALUP",
	"SPR_ELUP",
	"MT_SHIELDSPRING",
	"S_SHIELDSPRING",
	"SPR_FIRS"
)

mobjinfo[MT_ELEMENTALUP] = {
	spawnstate = S_ELEMENTALHITHERE,
	spawnhealth = 1,
	seestate = S_ELEMENTALHITHERE,
	reactiontime = 999999,
	painchance = 0,
	speed = 15*FRACUNIT,
	mass = 16*FRACUNIT,
	dispoffset = 2,
	radius = 64*FRACUNIT,
	height = 64*FRACUNIT,
	flags = MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOCLIP|MF_NOGRAVITY|MF_FLOAT
}

states[S_ELEMENTALHITHERE] =	{SPR_ELUP,	FF_FULLBRIGHT|A,	1,	A_None, 	0, 0, S_ELEMENTALUP}
states[S_ELEMENTALUP] =			{SPR_ELUP,	FF_FULLBRIGHT|A,	15,	A_Chase, 	0, 0, S_NULL}

mobjinfo[MT_SHIELDSPRING] = {
	spawnstate = S_SHIELDSPRING,
	spawnhealth = 1,
	seestate = S_SHIELDSPRING,
	raisestate = S_SHIELDSPRING,
	reactiontime = 0,
	painchance = 0,
	speed = 0,
	mass = 16*FRACUNIT,
	radius = 64*FRACUNIT,
	height = 64*FRACUNIT,
	flags = MF_SPRING
}

states[S_SHIELDSPRING] =	{SPR_NULL,	A,	1,	A_None,	0,	0,	S_NULL}

mobjinfo[MT_SHIELDBUBBLE] = {
	spawnstate = S_SHIELDBUBBLE,
	spawnhealth = 100,
	seestate = S_SHIELDBUBBLE,
	reactiontime = 32,
	painchance = 1,
	speed = 3,
	radius = 31*FRACUNIT,
	height = 31*FRACUNIT,
	flags = MF_NOCLIP|MF_NOGRAVITY
}

states[S_SHIELDBUBBLE] =	{SPR_BUBL,	FF_ADD|D,	1,	A_BubbleRise,	0,	6*FRACUNIT/5,	S_SHIELDBUBBLE1}
states[S_SHIELDBUBBLE1] =	{SPR_BUBL,	FF_ADD|D,	23,	A_BubbleRise,	0,	6*FRACUNIT/5,	S_SHIELDBUBBLE2}
states[S_SHIELDBUBBLE2] =	{SPR_BUBL,	FF_ADD|C,	23,	A_BubbleRise,	0,	6*FRACUNIT/5,	S_SHIELDBUBBLE3}
states[S_SHIELDBUBBLE3] =	{SPR_BUBL,	FF_ADD|B,	23,	A_BubbleRise,	0,	6*FRACUNIT/5,	S_SHIELDBUBBLE4}
states[S_SHIELDBUBBLE4] =	{SPR_BUBL,	FF_ADD|A,	23,	A_BubbleRise,	0,	6*FRACUNIT/5,	S_SHIELDBUBBLEDIE}
states[S_SHIELDBUBBLEDIE] =	{SPR_NULL,	FF_ADD|A,	23,	A_None,			0,	0,				S_NULL}

mobjinfo[MT_DEADLYSHIELDBUBBLE] = {
	spawnstate = S_DEADLYSHIELDBUBBLE,
	spawnhealth = 100,
	seestate = S_DEADLYSHIELDBUBBLE,
	reactiontime = 32,
	painchance = 1,
	speed = 3,
	radius = 31*FRACUNIT,
	height = 31*FRACUNIT,
	flags = MF_NOGRAVITY|MF_MISSILE
}

states[S_DEADLYSHIELDBUBBLE] =	{SPR_BUBL,	FF_ADD|D,	1,	A_BubbleRise,	0,	6*FRACUNIT/5,	S_DEADLYSHIELDBUBBLE1}
states[S_DEADLYSHIELDBUBBLE1] =	{SPR_BUBL,	FF_ADD|D,	23,	A_BubbleRise,	0,	6*FRACUNIT/5,	S_DEADLYSHIELDBUBBLE2}
states[S_DEADLYSHIELDBUBBLE2] =	{SPR_BUBL,	FF_ADD|C,	23,	A_BubbleRise,	0,	6*FRACUNIT/5,	S_DEADLYSHIELDBUBBLE3}
states[S_DEADLYSHIELDBUBBLE3] =	{SPR_BUBL,	FF_ADD|B,	23,	A_BubbleRise,	0,	6*FRACUNIT/5,	S_DEADLYSHIELDBUBBLE4}
states[S_DEADLYSHIELDBUBBLE4] =	{SPR_BUBL,	FF_ADD|A,	23,	A_BubbleRise,	0,	6*FRACUNIT/5,	S_DEADLYSHIELDBUBBLEDIE}
states[S_DEADLYSHIELDBUBBLEDIE] =	{SPR_NULL,	FF_ADD|A,	23,	A_None,			0,	0,				S_NULL}

addHook("MapThingSpawn", function(mo, mthing)
	if not (mo and mo.valid
	and mthing and mthing.valid)
		return
	end
	
	if mo and mo.valid then
		mo.rollangle = $ + P_RandomRange(1, 359)
	end
end, MT_LEAF)

addHook("MobjThinker", function(mo)
	if mo and mo.valid then
		mo.rollangle = $ + ANGLE_22h
	end
end, MT_LEAF)

mobjinfo[MT_LEAF] = {
	spawnstate = S_LEAF,
	spawnhealth = 99,
	seestate = S_LEAF,
	reactiontime = 32,
	painchance = 200,
	raisestate = S_NULL,
	meleestate = S_NULL,
	deathstate = S_NULL,
	deathsound = NULL,
	speed = 8,
	radius = 8*FRACUNIT,
	height = 20*FRACUNIT,
	mass = 16*FRACUNIT,
	flags = MF_NOCLIPTHING
}

states[S_LEAF]	 =	{SPR_LEAF,	A,						21,	nil,	0,	0,	S_LEAF1}
states[S_LEAF1]	 =	{SPR_LEAF,	FF_ADD|FF_TRANS40|A,	5,	nil,	0,	0,	S_LEAF2}
states[S_LEAF2]	 =	{SPR_LEAF,	FF_ADD|FF_TRANS70|A,	5,	nil,	0,	0,	S_NULL}

addHook("PlayerThink", function(player)
	if player.thoktimer == nil
    	player.thoktimer = 32
	end

	if player.thoktimer > 32
		player.thoktimer = $ + 1
	end

	if (P_IsObjectOnGround(player.mo)) or (player.mo.eflags & MFE_JUSTHITFLOOR) then
		player.thoktimer = 32
	end
	
	if player.hrspeed == nil then player.hrspeed = 0 return end
	if player.mo
	and player.mo.valid

	player.hrspeed = FixedMul(player.speed, player.mo.scale)
	end
	
	if player.storedspeed == nil then player.storedspeed = 0 return end
	if player.mo and player.mo.valid and player.speed != 0 and not (player.pflags & PF_SHIELDABILITY) then
		player.storedspeed = player.speeed
	end
	
	if player.shieldmove == nil then player.shieldmove = 0 end

	if ((player.powers[pw_shield] & SH_NOSTACK) == nil) or player.playerstate ~= PST_LIVE then
		player.shieldmove = 0
	end
end)

addHook("ShouldDamage", function(target, inflictor)
	if not (target and target.valid) then return end
	if not (inflictor and inflictor.valid) then return end
	if inflictor.type ~= MT_DEADLYSHIELDBUBBLE then return end
	if target.flags & (MF_ENEMY|MF_BOSS) then return end
	
	if target.flags & (MF_MONITOR|MF_SPRING)then
		target = target.flags & (MF_MONITOR|MF_SPRING)
	end
	return false
end)

addHook("PlayerThink", function(p)

		//Elemental Shield

	if (p.mo and (p.powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) and (p.pflags & PF_SHIELDABILITY) then
		A_BossScream(p.mo,0,MT_FIREBALLTRAIL)
		A_BossScream(p.mo,0,MT_MEDIUMBUBBLE)
		A_BossScream(p.mo,0,MT_SHIELDBUBBLE)
	end

		//Flame Shield
		
	if (p.mo and (p.powers[pw_shield] & SH_NOSTACK) == SH_FLAMEAURA) and (p.pflags & PF_SHIELDABILITY) then
		A_BossScream(p.mo,0,MT_FIREBALLTRAIL)
		p.powers[pw_strong] = STR_ANIM|STR_WALL
	end
	
		//Lightning Shield
	
	if (p.mo and (p.powers[pw_shield] & SH_NOSTACK) == SH_THUNDERCOIN) and (p.pflags & PF_SHIELDABILITY) then
		A_OldRingExplode(p.mo,MT_SUPERSPARK,0)
	end
	
		//Whirlwind Shield
	
	if (p.mo and (p.powers[pw_shield] & SH_NOSTACK) == SH_WHIRLWIND) and (p.pflags & PF_SHIELDABILITY) then
		A_BossScream(p.mo,0,MT_LEAF)
	end

		//Bubble Shield
	
	if (p.mo and (p.powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP) and (p.mo.eflags & MFE_JUSTHITFLOOR) then
		A_Shockwave(p.mo,MT_DUST,0)
		end
		
		//Attraction Shield changes
		
	if (p.mo and (p.powers[pw_shield] & SH_NOSTACK) == SH_ATTRACT) and (p.pflags & PF_THOKKED) then
		local lightningspark = P_SpawnMobj(p.mo.x + P_RandomRange(-10, 10) * FRACUNIT, p.mo.y + P_RandomRange(-10, 10) * FRACUNIT, p.mo.z, MT_SUPERSPARK)
		lightningspark.color, lightningspark.colorized = SKINCOLOR_GOLD, true
		lightningspark.scale = (FixedMul(1*FRACUNIT, p.mo.scale)) + P_RandomRange(1/5, 2)
	if (leveltime%3==0)
		lightningspark.color, lightningspark.colorized = SKINCOLOR_BLUE, true
		end
	end
end)

/* I don't like the current Elemental Shield so let's fix that. (Some stuff reused/edited from mrce)*/

addHook("ShieldSpecial", function(p)
	if not (p and p.mo and p.mo.valid) then return end
	if luastuffrelatingtothisspecfically ~= 0 then return end
	if p.playerstate ~= PST_LIVE then return end
	if ((p.powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) and not (p.mo.eflags & MFE_UNDERWATER) then
		p.shieldmove = 1
		S_StartSound(p.mo, sfx_s1b3)
		P_SetObjectMomZ(p.mo, -40*FRACUNIT, false)
		p.pflags = $|PF_THOKKED
		A_OldRingExplode(p.mo, MT_FIREBALLTRAIL)
		A_OldRingExplode(p.mo, MT_SMOKE)
		P_RadiusAttack(p.mo, p.mo, 192<<FRACBITS, DMG_FIRE, true)
		p.powers[pw_strong] = STR_ANIM|STR_SPRING
		return true
	end
	if ((p.powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) and (p.mo.eflags & MFE_UNDERWATER) then
		p.shieldmove = 1
		p.pflags = $|PF_THOKKED
		p.mo.state = $|S_PLAY_SPRING
		P_SetObjectMomZ(p.mo, 30*FRACUNIT, false)
		A_OldRingExplode(p.mo, MT_MEDIUMBUBBLE)
		p.powers[pw_strong] = STR_CEILING|STR_SPRING
		S_StartSound(p.mo, sfx_s3k57)
		return true
	end
end)

addHook("PlayerThink", function(p)

if luastuffrelatingtothisspecfically ~= 0 then return end

	if p.spawnedfire == nil then
		p.spawnedfire = 0
	end
		
	//Elemental Shield changes
	
    if p.mo.state == S_PLAY_MELEE_LANDING or p.mo.state == S_PLAY_BOUNCE_LANDING or (p.mo.state == S_PLAY_GLIDE_LANDING and p.mo.eflags & MFE_JUSTHITFLOOR) then
        if (p.powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL then
			if not (p.spawnedfire == 1) then
				P_ElementalFire(p, true)
				p.spawnedfire = 1
			end
        end
    end
	if (p.mo.state == S_PLAY_GLIDE and P_IsObjectOnGround(p.mo) or p.mo.state == S_PLAY_SKID) then
        if (p.powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL then
			if not (p.spawnedfire == 1) then
				P_ElementalFire(p, false)
				p.spawnedfire = 1
			end
        end
    end
	if (p.mo.state == S_PLAY_DASH and P_IsObjectOnGround(p.mo) or p.speed > (FixedMul(50*FRACUNIT, p.mo.scale)) and P_IsObjectOnGround(p.mo)) then
        if (p.powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL then
			if not (p.spawnedfire == 1) then
				P_ElementalFire(p, false)
			end
        end
	end
	if (p.powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL and P_IsObjectOnGround(p.mo) then
		if p.dashmode > 3*TICRATE then
		P_ElementalFire(p, false)
		end
	end
	if p.mo.state == S_PLAY_MELEE or p.mo.state == S_PLAY_BOUNCE or p.mo.state == S_PLAY_GLIDE or p.mo.state == S_PLAY_RUN then
		p.spawnedfire = 0
	end

	if (p.mo and (p.powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) and P_IsObjectOnGround(p.mo) or p.playerstate == PST_DEAD or p.mo.momz > 1 then
		p.mo.spriteyscale = 1*FRACUNIT
		p.camerascale = 1*FRACUNIT
	end

	if (p.mo and (p.powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) and p.shieldmove == 1 and (p.pflags & PF_THOKKED) and (p.cmd.buttons != BT_JUMP) and not (leveltime%2) and not (p.mo.eflags & MFE_UNDERWATER) then
		A_BossScream(p.mo,0,MT_FIREBALLTRAIL)
		A_BossScream(p.mo,0,MT_MEDIUMBUBBLE)
		A_BossScream(p.mo,0,MT_SHIELDBUBBLE)
		S_StartSound(p.mo, sfx_s3kcfs)
		p.powers[pw_strong] = STR_ANIM|STR_SPRING
	end
	if ((p.powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) and p.shieldmove == 1 and (p.cmd.buttons & BT_JUMP) and (p.pflags & PF_THOKKED) and not (p.mo.eflags & MFE_UNDERWATER) then
		P_SetObjectMomZ(p.mo, -4*FRACUNIT, true)
		p.mo.spriteyscale = 2*FRACUNIT
		p.camerascale = 2*FRACUNIT
		p.powers[pw_strong] = STR_ANIM|STR_FLOOR|STR_SPRING
	end
	if ((p.powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) and p.shieldmove == 1 and p.mo.momz > 0 then
		p.shieldmove = 0
		S_StopSoundByID(p.mo, sfx_s1b3)
		S_StopSoundByID(p.mo, sfx_s3kcfs)
		p.pflags = $ & ~PF_THOKKED
	end
	if ((p.powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) and p.shieldmove == 1 and (p.mo.eflags & (MFE_JUSTHITFLOOR))
		S_StartSound(p.mo, sfx_s3k47)
		P_ElementalFire(p, true)
	end
	if ((p.powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) and p.shieldmove == 1 and (p.mo.eflags & (MFE_JUSTHITFLOOR)) and (p.cmd.buttons & BT_SPIN) then
		p.mo.state = S_PLAY_ROLL
		p.pflags = $|PF_SPINNING
		S_StartSound(p.mo, sfx_s3k49)
	end
	
		//Flame Shield changes

	if (p.mo.skin == "sonic" and (p.powers[pw_shield] & SH_NOSTACK) == SH_FLAMEAURA)
		and (p.pflags & PF_THOKKED)
		and p.speed > (FixedMul(73*FRACUNIT, p.mo.scale)) then

		local flameshieldtrail = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_UNKNOWN)
		flameshieldtrail.angle = p.drawangle
		flameshieldtrail.fuse = 1
		flameshieldtrail.target = p.mo
		flameshieldtrail.sprite = SPR_FIRS
		flameshieldtrail.frame = S|FF_FULLBRIGHT|FF_TRANS40
		flameshieldtrail.blendmode = AST_TRANSLUCENT
		flameshieldtrail.scale = (FixedMul(p.shieldscale, p.mo.scale))
		P_Thrust(p.mo, p.mo.angle, FixedMul(12*FRACUNIT - 
		FixedSqrt(FixedDiv(p.speed, p.mo.scale)), p.mo.scale))
	end
	
		//Lightning Shield changes
	
	if (p.mo.skin == "sonic" and (p.powers[pw_shield] & SH_NOSTACK) == SH_THUNDERCOIN) 
	and p.thoktimer == 32 and (p.pflags & PF_THOKKED) and not (p.pflags & PF_SHIELDABILITY) then
		P_SetObjectMomZ(p.mo, 12*FRACUNIT, true)
		A_OldRingExplode(p.mo,MT_SUPERSPARK,0)
		S_StartSound(p.mo, sfx_s3k47)
		S_StartSound(p.mo, sfx_cdfm66)
		S_StartSound(p.mo, sfx_s3k45)
		p.thoktimer = 33
		end
	
		//Whirlwind Shield changes
	
	if (p.mo.skin == "tails" and (p.powers[pw_shield] & SH_NOSTACK) == SH_WHIRLWIND) 
	and (p.pflags & PF_THOKKED) and (p.mo.state == S_PLAY_FLY) then
		P_SetObjectMomZ(p.mo, 2*FRACUNIT/7, true)
		P_Thrust(p.mo, p.mo.angle, 2*FRACUNIT/7)
	end
	if (p.mo.skin == "sonic" and (p.powers[pw_shield] & SH_NOSTACK) == SH_WHIRLWIND) 
	and p.thoktimer == 32 and (p.pflags & PF_THOKKED) and not (p.pflags & PF_SHIELDABILITY) then
		P_SetObjectMomZ(p.mo, 14*FRACUNIT, true)
		S_StartSound(p.mo, sfx_kc68)
		S_StartSound(p.mo, sfx_kc55)
		S_StartSound(p.mo, sfx_s3k47)
		p.mo.state = S_PLAY_SPRING
		p.pflags = $|PF_NOJUMPDAMAGE
		p.thoktimer = 33
	end
	if (p.mo.skin == "sonic" and (p.powers[pw_shield] & SH_NOSTACK) == SH_WHIRLWIND) 
	and (p.pflags & PF_THOKKED) then
		A_BossScream(p.mo,0,MT_LEAF)
	end
		//Bubble Shield changes
	
	if (p.mo and (p.powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP)
	and (p.pflags & PF_SHIELDABILITY) and (p.cmd.buttons & BT_SPIN)
		P_SetObjectMomZ(p.mo, -50*FRACUNIT, false)
		p.mo.spritexscale = 2*FRACUNIT
		A_BossScream(p.mo,0,MT_MEDIUMBUBBLE)
		A_BossScream(p.mo,0,MT_SHIELDBUBBLE)
		end
	if (p.mo and (p.powers[pw_shield] & SH_NOSTACK) != SH_BUBBLEWRAP) or P_IsObjectOnGround(p.mo) 
		or p.playerstate & PST_DEAD or (p.mo.eflags & MFE_JUSTHITFLOOR) or (p.cmd.buttons != BT_SPIN)
		or p.mo.momz > 1 then
			p.mo.spritexscale = 1*FRACUNIT
		end
	if (p.mo and (p.powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP) 
	and (p.cmd.buttons & BT_SPIN) and p.pflags & PF_JUMPED 
	and (p.mo.eflags & MFE_JUSTHITFLOOR) then
		A_Shockwave(p.mo,MT_DUST,0)
		P_SetObjectMomZ(p.mo, 4*FRACUNIT, true)
		S_StartSound(p.mo, sfx_s1b8)
		p.pflags = $|PF_THOKKED
		p.powers[pw_strong] = STR_ANIM|STR_SPRING
						
		for i = 1, 12
	local bubblis = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_DEADLYSHIELDBUBBLE)
	bubblis.angle = ANG60*i
	bubblis.target = p.mo
	bubblis.scale = p.mo.scale
	P_InstaThrust(bubblis, bubblis.angle, 12*FRACUNIT)
	local bubblis2 = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_DEADLYSHIELDBUBBLE)
	bubblis2.angle = ANG30*i
	bubblis2.target = p.mo
	bubblis2.scale = p.mo.scale
	P_InstaThrust(bubblis2, bubblis2.angle, 12*FRACUNIT)
		end
	end
end)

addHook("ThinkFrame", do
	for player in players.iterate
	
if luastuffrelatingtothisspecfically ~= 0 then return end
	
	local p = player
	
if (p.powers[pw_shield] & SH_NOSTACK) == SH_FLAMEAURA and P_IsObjectOnGround(p.mo) 
and p.speed >= (FixedMul(80*FRACUNIT, player.mo.scale))
or (p.powers[pw_shield] & SH_NOSTACK) == SH_FLAMEAURA and P_IsObjectOnGround(p.mo) 
and p.dashmode > 3*TICRATE then
	A_BossScream(p.mo,0,MT_FIREBALLTRAIL)
	p.powers[pw_strong] = STR_ANIM|STR_WALL|STR_PUNCH|STR_UPPER|STR_GUARD|STR_SPIKE
	local speedburst = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_UNKNOWN)
	speedburst.angle = p.drawangle
	speedburst.fuse = 1
	speedburst.target = p.mo
	speedburst.sprite = SPR_FIRS
	speedburst.frame = S|FF_FULLBRIGHT|FF_TRANS40
	speedburst.blendmode = AST_TRANSLUCENT
	speedburst.scale = (FixedMul(p.shieldscale, p.mo.scale))
	P_ElementalFire(p, false)
	P_Thrust(p.mo, player.mo.angle, 
	FixedMul(12*FRACUNIT - FixedSqrt(FixedDiv(player.speed, player.mo.scale)), player.mo.scale)) //taken/edited from SRB2s code
	local flameline = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_EGGMOBILE_FIRE)
	flameline.angle = p.drawangle
	flameline.color, flameline.colorized = SKINCOLOR_RED, true
	flameline.scale = (FixedMul(FRACUNIT/2, p.mo.scale))
	if (leveltime%2==0)
	flameline.color, flameline.colorized = SKINCOLOR_LEMON, true
	flameline.scale = (FixedMul(FRACUNIT/4, p.mo.scale))
			end
		end
	end
end)

addHook("PlayerThink", function(player) //by enes2gamer edited by Endless

if luastuffrelatingtothisspecfically ~= 0 then return end

	local enemy = P_LookForEnemies(player, true)
	
	if player.potholehoming == nil -- don't mind the name, this was meant for something else
	   player.potholehoming = false
	end
	if enemy and enemy.valid and player.mo.skin == "sonic" and player.pflags & PF_JUMPED and player.powers[pw_shield] & SH_NOSTACK == SH_ATTRACT and player.potholehoming == false
	and (enemy.flags & (MF_ENEMY|MF_BOSS|MF_MONITOR)) and not (enemy.flags & (MF_SPRING))
		if lockon == nil //Could just use P_SpawnLockOn...
			local lockon = P_SpawnMobjFromMobj(enemy, 0, 0, enemy.height + 20*FRACUNIT, MT_LOCKON)
			lockon.target = enemy
		end
		if player.cmd.buttons & BT_JUMP and player.pflags & PF_THOKKED and player.jumphasbeenbeingpressed == false
		    player.potholehoming = true
		    player.mo.tracer = enemy
		end
	else
	    if player.potholehoming == true
	        if player.mo.skin == "sonic" and player.powers[pw_shield] & SH_NOSTACK == SH_ATTRACT and player.eflags == MFE_JUSTHITFLOOR 
			or player.mo.skin == "sonic" and player.powers[pw_shield] & SH_NOSTACK == SH_ATTRACT and player.homing == 0 then
			player.potholehoming = false end
				S_StopSoundByID(player.mo, sfx_thok)
				S_StartSound(player.mo, sfx_s3k40)
				S_StartSound(player.mo, sfx_s3k47)
				player.homing = 0
				//reset jump flags, could lead to cool stuff like chaining shield abilities
			if P_HomingAttack(player.mo, player.mo.tracer) == false --whenever the homing attack's succesful
				player.potholehoming = false
				player.mo.tracer = nil
				P_SetObjectMomZ(player.mo, 12*player.mo.scale)
				end
			end
		end
	if player.mo.skin == "sonic" and player.cmd.buttons & BT_JUMP
		player.jumphasbeenbeingpressed = true
	else
		player.jumphasbeenbeingpressed = false
	end
end)

addHook("ShouldDamage", function(player,sector)
	
	local p = player
	
	if (p.mo and (p.powers[pw_shield] & SH_NOSTACK) == SH_WHIRLWIND) and sector.damagetype == DMG_DEATHPIT end

	if (p.mo and (p.powers[pw_shield] & SH_NOSTACK) == SH_WHIRLWIND) and sector.damagetype == DMG_DEATHPIT then
		P_SetObjectMomZ(p.mo, 50*FRACUNIT, false)
			p.mo.state = S_PLAY_FALL
				P_ResetPlayer(p)
					p.pflags = $|PF_THOKKED|PF_NOJUMPDAMAGE
						p.mo.health = 1
						p.deadtimer = 0
					p.playerstate = $|PST_LIVE
				P_RestoreMusic(p)
	end
end)