//lua by ThyEnden709 (TreyBWN) Edited By BlueTorch

freeslot("sfx_boom", "sfx_drexpl")

addHook("PlayerSpawn", function(p)
	if p and p.mo and p.mo.valid
		p.clonebattery = 100
		p.clonedie = false
	end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "clonemetal"
		p.powers[pw_underwater] = 100*TICRATE
		p.powers[pw_spacetime] = 100*TICRATE
		
		if p.clonebattery == nil
			p.clonebattery = 100
		end
		
		if not (p.cmd.buttons & BT_SPIN) then -- Begin new lines
			p.spintapready = true
			p.spintapping = false
		elseif p.spintapready then
			p.spintapping = true
			p.spintapready = false
		else
			p.spintapping = false
		end -- End new lines
		
		if p.speed < 50*FRACUNIT
			p.cmetalpealcont = false
		end
		
		if (p.mo.state == S_PLAY_SPINDASH)
			p.cmetalpealstart = true
		end
		
		if (p.mo.state == S_PLAY_ROLL)
		and p.cmetalpealstart == true
			p.pflags = $1 & ~PF_SPINNING
			p.cmetalpealstart = false
			p.cmetalpealcont = true
			p.mo.state = S_PLAY_WALK
		end
		
		if p.cmetalpeal == true
			and not P_IsObjectOnGround(p.mo)
			p.cmetalpealstart = false
		end
		
		if p.dashspeed == p.maxdash
			S_StartSound(p.mo, sfx_drexpl)
			S_StartSound(p.mo, sfx_boom)
			for fof in p.mo.subsector.sector.ffloors() do
				if (fof.flags & FF_BUSTUP) and (fof.flags & FF_EXISTS)
					EV_CrumbleChain(fof)
				end
			end
			p.kaboom = P_SpawnMobjFromMobj(p.mo, 0, 0, 0, MT_TNTBARREL)
			P_KillMobj(p.kaboom, p.mo, p.mo)
			p.kaboom.scale = p.mo.scale
			p.mo.state = S_PLAY_PAIN
			p.pflags = $1 & ~PF_SPINNING
			P_SetObjectMomZ(p.mo, 25*FRACUNIT)
		end
		
		if p.clonebattery == 0 and p.playerstate != PST_DEAD and p.clonedie == false
			if p.powers[pw_super]
				P_KillMobj(p.mo, p.mo, p.mo) -- Kill yourself
				S_StartSound(p.mo, sfx_drexpl)
				S_StartSound(p.mo, sfx_boom)
				for fof in p.mo.subsector.sector.ffloors() do
					if (fof.flags & FF_BUSTUP) and (fof.flags & FF_EXISTS)
						EV_CrumbleChain(fof)
					end
				end
				p.kaboom = P_SpawnMobjFromMobj(p.mo, 0, 0, 0, MT_TNTBARREL)
				P_KillMobj(p.kaboom, p.mo, p.mo)
				p.kaboom.scale = p.mo.scale
				p.pflags = $1 & ~PF_SPINNING
				p.mo.flags2 = $|MF2_DONTDRAW
				for i = 1, 32 do
					local badnick = P_SpawnMobjFromMobj(p.mo, 0, 0, 0, MT_BROKENROBOT)
					P_Thrust(badnick, p.mo.angle+(ANGLE_22h*i), 15*FRACUNIT)
					P_SetObjectMomZ(p.mo, 15*FRACUNIT)
				end
			else
				P_KillMobj(p.mo, p.mo, p.mo) -- Kill yourself
			end
			p.clonebattery = 0
			p.clonedie = true -- Dead
		end
		
		if p.powers[pw_super] and p.playerstate != PST_DEAD
			if (leveltime % TICRATE) == 1
				p.clonebattery = max($-1, 0)
			end
		end
		
		if (p.pflags&PF_THOKKED and p.pflags&PF_JUMPDOWN) and p.playerstate != PST_DEAD
			if (leveltime % TICRATE) == 1
				p.clonebattery = max($-2, 0)
			end
			p.mo.momz = 0
		end
		
		if (p.pflags&PF_STARTDASH)
			if (leveltime % TICRATE) == 1
				p.clonebattery = max($-3, 0)
			end
		end
		
		if p.normalspeed <= p.speed and p.cmetalpealcont == true
			p.normalspeed = p.speed
		end
		
		if p.mo.state == S_PLAY_CLONEPAIN
			P_InstaThrust(p.mo, p.mo.angle, -20*FRACUNIT)
			local dashimage = P_SpawnGhostMobj(p.mo)
			dashimage.fuse = 10
			p.pflags = $|PF_FULLSTASIS
			
			if p.mo.momz < 1*FRACUNIT
				P_SetObjectMomZ(p.mo, 0*FRACUNIT)
				p.pflags = $|PF_FULLSTASIS
			end
		end
		
		if p.misslemetal
		and p.misslemetal.valid
			p.misslemetal.state = S_ENERGYBALL2
		end
		
		if p.speed > 50*FRACUNIT
			and not p.clonedash == true
			p.dashmode = 110
			S_StartSound(p.mo, sfx_kc4d)
			p.cmetaldash = true
			p.clonedash = true
		end
		
		if p.dashmode < 3*TICRATE
			p.clonedash = false
		end
		
		if p.playerstate != PST_DEAD
			--lmao
			p.charability2 = CA2_SPINDASH
			--setting up the targeting
			if p.spintapping == true
				p.popguntarget = P_LookForEnemies(p, false, true)
			end
			if (p.popguntarget 
			and p.popguntarget.valid 
			and p.popguntarget.health)
				
				p.popgunangle = R_PointToAngle2(p.mo.x, p.mo.y, p.popguntarget.x, p.popguntarget.y)
				P_SpawnLockOn(p, p.popguntarget, S_LOCKON1)
			end
			if p.spintapping == true
				if p.popguntarget and p.popguntarget.valid
					p.misslemetal = P_SpawnMissile(p.mo, p.popguntarget, MT_CLONEMETALBALL)
					p.misslemetal.tracer = p.mo
					p.clonebattery = max($-4, 0)
				end
			end
		end
	end
end)

//A chunk of metal cannot feel pain
addHook("MobjDamage", function(target, inflictor, source, damage, damagetype)
	if inflictor == target.player.kaboom
		return true
	end
	if target.player and target.skin == "clonemetal" 
	and target.player.powers[pw_shield] == SH_NONE
	and not (damagetype&DMG_DEATHMASK)
		P_DoPlayerPain(target.player, source, inflictor)
		P_PlayDeathSound(target)
		P_PlayerFlagBurst(target.player)
		target.state = S_PLAY_CLONEPAIN
		return true
	end
end, MT_PLAYER)

local function energyrefresh (target, inflictor)
	if not inflictor or not inflictor.valid
	or not inflictor.player or not inflictor.player.valid then
		return
	end
	if inflictor.player.mo.skin == "clonemetal" and inflictor.player.playerstate != PST_DEAD then
		inflictor.player.clonebattery = min($+1, 100)
	end
end

addHook("MobjDamage", energyrefresh)
addHook("MobjDeath", energyrefresh)

local function energytracerrefresh (target, inflictor)
	if not inflictor or not inflictor.valid then
		return
	end
	if inflictor.tracer.skin == "clonemetal" and inflictor.tracer.player.playerstate != PST_DEAD then
		inflictor.tracer.player.clonebattery = min($+1, 100)
	end
end

addHook("MobjDamage", energytracerrefresh)
addHook("MobjDeath", energytracerrefresh)

addHook("HUD", function(v, p, c)
	if not (p and p.valid)
		return
	end
	
	if not (p.mo and p.mo.valid)
		return
	end
	
	if not (p.mo.skin == "clonemetal")
		return
	end
	
	local battery = v.cachePatch("CLONEHUD_BATTERY")
	
	v.drawScaled(20*FRACUNIT, 128*FRACUNIT, FRACUNIT, battery, V_PERPLAYER|V_HUDTRANS|V_SNAPTOBOTTOM|V_SNAPTOLEFT)
	v.drawString(20, 128, p.clonebattery.."%", V_PERPLAYER|V_HUDTRANS|V_SNAPTOBOTTOM|V_SNAPTOLEFT, "center")
end)