freeslot(
	"S_PLAY_DRILLDOWN",
	"S_PLAY_DRILLUP",
	"MT_DIGROCKS"
)

states[S_PLAY_DRILLDOWN] = {
	sprite = SPR_PLAY,
	frame = SPR2_FLY_,
	tics = 1,
	nextstate = S_PLAY_DRILLDOWN
}

states[S_PLAY_DRILLUP] = {
	sprite = SPR_PLAY,
	frame = SPR2_TIRE,
	tics = 2,
	nextstate = S_PLAY_DRILLUP
}

mobjinfo[MT_DIGROCKS] = {
	spawnstate = S_ROCKCRUMBLEA,
	spawnhealth = 1000,
	radius = 8*FRACUNIT,
	height = 16*FRACUNIT,
	flags = MF_MISSILE|MF_BOUNCE|MF_GRENADEBOUNCE
}

local function resetdig(p)
	p.drilling = false
	p.digging = false
	p.height = skins[p.mo.skin].height
	p.mo.flags = $ & ~(PF_INVIS|PF_THOKKED)
	p.charflags = $ & ~SF_NOSKID
	p.shieldscale = skins[p.mo.skin].shieldscale
	p.charability2 = skins[p.mo.skin].ability2
	p.mo.flags = $ & ~MF_NOCLIPTHING
	p.mo.flags2 = $ & ~MF2_DONTDRAW
end

//You already know what time it is
addHook("PlayerThink", function(p)
	if p.c1tics == nil
		p.c1tics = 0
		p.drilling = false
		p.digging = false
		p.digtime = 162
		p.waitforregain = 0
	end
end)

addHook("PlayerThink", function(p)
	if (p.cmd.buttons & BT_CUSTOM1)
		p.c1tics = $1+1
	else
		p.c1tics = 0
	end
end)

local function drillstate(p)
	if p.mo.state ~= S_PLAY_DRILLDOWN
		p.mo.state = S_PLAY_DRILLDOWN
	end
end

local function setmomz(p)
	if not (p.mo.eflags & MFE_SPRUNG)
		P_SetObjectMomZ(p.mo, -29*FU)
	end
end

local function gooandspring(p)
	if (p.mo.eflags & MFE_GOOWATER)
		p.mo.state = S_PLAY_FALL
	end
	if (p.mo.eflags & MFE_SPRUNG)
		p.mo.state = S_PLAY_SPRING
	end
end

local function digdirt(p)
	if leveltime%4 == 0
	and p.speed >= 6*FU
		local rxy = P_RandomRange(-10, 10)*FRACUNIT
		local ground = P_SpawnMobj(p.mo.x+rxy, p.mo.y+rxy, p.mo.z, MT_MINUSDIRT)
		if not S_SoundPlaying(p.mo, sfx_s3kd3l)
			S_StartSound(p.mo, sfx_s3kd3l)
		end	
		if p.mo.eflags & MFE_VERTICALFLIP
			ground.eflags = $|MFE_VERTICALFLIP
			ground.flags2 = $|MF2_OBJECTFLIP
		else
			ground.eflags = $ & ~MFE_VERTICALFLIP
			ground.flags2 = $ & ~MF2_OBJECTFLIP
		end
	end
end

local function digstuff(p)
	p.height = P_GetPlayerSpinHeight(p)
	p.pflags = $|PF_INVIS
	p.pflags = $|PF_THOKKED
	p.pflags = $|PF_GODMODE
	p.pflags = $ & ~PF_SPINNING
	p.charability2 = CA2_NONE
	p.charflags = $|SF_NOSKID
	p.mo.flags2 = $|MF2_DONTDRAW
	p.mo.flags = $|MF_NOCLIPTHING
	p.shieldscale = 0
end

local function momzcheck(p)
	if not (p.mo.eflags & MFE_VERTICALFLIP)
	and p.mo.momz <= 0
	or (p.mo.eflags & MFE_VERTICALFLIP)
	and p.mo.momz >= 0
		return true
	else
		return false
	end
end

local function rockblast(p) --Kinda based off the og rock blast, with some changes
	for i = 1, 17
		local rock = P_SpawnPlayerMissile(p.mo, MT_DIGROCKS, MF2_SCATTER)
		if rock and rock.valid
			rock.tics = 100
			P_InstaThrust(rock, i*ANGLE_22h, p.mo.scale*5)
			rock.momz = 16*P_MobjFlip(p.mo)*p.mo.scale
			if (p.mo.eflags & MFE_VERTICALFLIP)
				rock.eflags = $|MFE_VERTICALFLIP
			end
		end
	end
end

//Completely original recode of the dig!
addHook("ThinkFrame", do
	for p in players.iterate
		if p.mo and p.mo.valid
		and p.mo.skin == "knuckles"
		and not P_IsObjectOnGround(p.mo)
		and p.climbing < 1
		and not p.drilling
		and not (p.pflags & PF_SLIDING)
		and not p.powers[pw_carry]
		and p.mo.state ~= S_PLAY_DRILLUP
		and p.c1tics == 1
			p.drilling = true
			S_StartSound(mo, sfx_zoom)
		end
		if p.drilling
			drillstate(p)
			P_SpawnGhostMobj(p.mo)
			P_InstaThrust(p.mo, p.mo.angle, 0*FU)
			p.pflags = $ & ~(PF_GLIDING|PF_THOKKED)
			p.pflags = $|PF_JUMPED
			setmomz(p)
			p.powers[pw_strong] = STR_FLOOR|STR_SPIKE|STR_SPRING|STR_ANIM
		end
		if p.drilling
		and (P_PlayerInPain(p) or p.powers[pw_carry] or p.playerstate == PST_DEAD or p.mo.eflags & MFE_SPRUNG or p.mo.eflags & MFE_GOOWATER)
			p.drilling = false
			gooandspring(p)
		end
		if p.drilling
		and P_IsObjectOnGround(p.mo)
		and not (p.cmd.buttons & BT_JUMP)
			p.drilling = false
			p.digging = true
			S_StartSound(mo, sfx_s3k4c)
		end
		if p.drilling
		and P_IsObjectOnGround(p.mo)
		and (p.cmd.buttons & BT_JUMP)
			p.drilling = false
			P_SetObjectMomZ(p.mo, 6*FU)
			p.mo.state = S_PLAY_SPRING
			P_StartQuake(11, 11)
			S_StartSound(p.mo, sfx_s3k5f)
		end
		if p.digging
			p.digtime = $-1
			digstuff(p)
			digdirt(p)
		end
		if p.digging
		and not P_IsObjectOnGround(p.mo)
			p.digging = false
			p.mo.state = S_PLAY_FALL
			resetdig(p)
			p.pflags = $|PF_JUMPED
			S_StartSound(p.mo, sfx_s3k51)
		end
		if p.digging
		and (P_PlayerInPain(p) or p.powers[pw_carry] or p.playerstate == PST_DEAD)
			resetdig(p)
			p.waitforregain = 1
		end
		if p.digtime <= 0
		and p.digging
			p.waitforregain = 1
			P_SetObjectMomZ(p.mo, 7*FRACUNIT)
			p.mo.state = S_PLAY_FALL
			resetdig(p)
			S_StartSound(p.mo, sfx_s3k51)
		end
		if S_SoundPlaying(p.mo, sfx_s3kd3l)
		and not p.digging 
		or S_SoundPlaying(p.mo, sfx_s3kd3l) 
		and p.speed < 6*FRACUNIT
			S_StopSoundByID(p.mo, sfx_s3kd3l)
		end
		if (p.exiting)
		and p.digging
			p.diging = false
			S_StartSound(p.mo, sfx_jump)
			P_SetObjectMomZ(p.mo, 7*FRACUNIT)
			resetdig(p)
			p.mo.state = S_PLAY_SPRING
		end
		if p.digging
		and p.c1tics == 1
			P_SetObjectMomZ(p.mo, 22*FRACUNIT)
			S_StartSound(p.mo, sfx_crumbl)
			p.mo.state = S_PLAY_DRILLUP
			resetdig(p)
			p.pflags = $|PF_JUMPED
			p.pflags = $ & ~PF_THOKKED
			S_StopSoundByID(p.mo, sfx_jump)
			p.waitforregain = 1
			rockblast(p)
		end
		if p.mo.state == S_PLAY_DRILLUP
		and momzcheck(p)
			p.mo.state = S_PLAY_FALL
		end
		if p.waitforregain >= 1
			p.waitforregain = $+1
		end
		if not p.digging
		and p.digtime < 162
		and p.waitforregain >= 50
			p.digtime = $+1
		end
	end
end)

addHook("AbilitySpecial", function(p)
	if p.mo and p.mo.valid
	and p.drilling
	and not (p.pflags & PF_JUMPDOWN)
		p.drilling = false
		P_SetObjectMomZ(p.mo, 0*FU)
		return false
	end
end)

addHook("JumpSpecial", function(p)
	if p.digging
	and p.mo and p.mo.valid
	and not (p.pflags & PF_JUMPDOWN)
		p.digging = false
		resetdig(p)
		P_DoJump(p)
		P_SpawnGhostMobj(p.mo)
		p.waitforregain = 1
		S_StartSound(p.mo, sfx_s3k51)
		if S_SoundPlaying(p.mo, sfx_jump)
			S_StopSoundByID(p.mo, sfx_jump)
		end
	end
end)

addHook("PlayerCanDamage", function(p)
	if p.mo.state >= S_PLAY_DRILLUP
		return true
	end
end)

addHook("PlayerSpawn", function(p)
	p.digtime = 162
end)

//Meter by Kirb
local pos = hudinfo[HUD_LIVES].y +5
local po = hudinfo[HUD_LIVES].y 
local pox = hudinfo[HUD_LIVES].y 
local function dighud(v, player)
	if displayplayer.mo.skin ~= "knuckles" then return end
	
	if player.mo.valid
		v.drawFill(150,pos - 1, 164, 12, 31)
		v.drawFill(151,pos, player.digtime, 10, skincolors[player.skincolor].ramp[5]) 
		v.drawString(220,pos +1,player.digtime,YELLOWMAP,"left")
		v.drawString(185,pos +1,"DIG TIME:",YELLOWMAP,"center")
	end
end
hud.add(dighud, "game")	