freeslot("S_PLAY_MACH3JUMP1","S_PLAY_MACH3JUMP2","S_PLAY_MACH3JUMP3","S_PLAY_MACH3JUMP4","S_PLAY_MACH3JUMP5","SPR_MA3J","S_PLAY_MACHJUMPSTART","SPR2_MAJS")

states[S_PLAY_MACH3JUMP1] = {
	sprite = SPR_MA3J,
	frame = A|FF_ANIMATE,
	tics = 2,
	nextstate = S_PLAY_MACH3JUMP2
}

states[S_PLAY_MACH3JUMP2] = {
	sprite = SPR_MA3J,
	frame = B|FF_ANIMATE,
	tics = 2,
	nextstate = S_PLAY_MACH3JUMP3
}

states[S_PLAY_MACH3JUMP3] = {
	sprite = SPR_MA3J,
	frame = C|FF_ANIMATE,
	tics = 2,
	nextstate = S_PLAY_MACH3JUMP4
}


states[S_PLAY_MACH3JUMP4] = {
	sprite = SPR_MA3J,
	frame = D|FF_ANIMATE,
	tics = 2,
	nextstate = S_PLAY_MACH3JUMP5
}


states[S_PLAY_MACH3JUMP5] = {
	sprite = SPR_MA3J,
	frame = E|FF_ANIMATE,
	tics = 2,
	nextstate = S_PLAY_PP_MACH3
}

states[S_PLAY_MACHJUMPSTART] = {
	sprite = SPR_PLAY,
	frame = SPR2_MAJS|FF_ANIMATE,
	tics = 8,
	var1 = 1,
	var2 = 1,
	nextstate = S_PLAY_PP_MACHJUMP
}

freeslot("S_SLOWJUMPCLOUD","SPR_SJCL","S_FASTJUMPCLOUD","SPR_FJCL")

states[S_SLOWJUMPCLOUD] = {
	sprite = SPR_SJCL,
	frame = A|FF_ANIMATE,
	tics = 14,
	var1 = 7,
	var2 = 2,
}

states[S_FASTJUMPCLOUD] = {
	sprite = SPR_FJCL,
	frame = A|FF_ANIMATE|FF_PAPERSPRITE,
	tics = 12,
	var1 = 6,
	var2 = 2,
}


addHook("PlayerThink", function(p)
	local mo = p.mo
	if p.mo.state == S_PLAY_JUMP
	and p.mo.skin == "prpeppino"
	and p.machspeed == 2
		p.mo.state = S_PLAY_MACHJUMPSTART
		for i = -1, 1, 2
			local ang = i * ANG10
			local factor = FixedMul(4*mo.scale, cos(ang))
			local x = P_ReturnThrustX(mo, p.drawangle + ANGLE_180 + ang, 24*mo.scale)
			local y = P_ReturnThrustY(mo, p.drawangle + ANGLE_180 + ang, 24*mo.scale)
			local dust = P_SpawnMobjFromMobj(mo, x, y, 0, MT_THOK)
			dust.scale = mo.scale
			dust.angle = R_PointToAngle2(dust.x, dust.y, mo.x, mo.y)
			dust.state = S_FASTJUMPCLOUD
			dust.momx = FixedMul(factor, cos(dust.angle - i*ANGLE_90))
			dust.momy = FixedMul(factor, sin(dust.angle - i*ANGLE_90))
			if (mo.eflags & MFE_VERTICALFLIP)
				dust.flags2 = $|MF2_OBJECTFLIP
				dust.eflags = $|MFE_VERTICALFLIP
			end
		end
	end
end)

addHook("PlayerThink", function(p)
	if (p.mo.state == S_PLAY_FALL)
	and p.mo.skin == "prpeppino"
	and p.machspeed == 2
		p.mo.state = S_PLAY_MACHJUMPSTART
	end
end)


addHook("PlayerThink", function(p)
	local mo = p.mo
	if p.machspeed == 4
	and p.mo.skin == "prpeppino"
	and p.mo.state == S_PLAY_JUMP
		p.mo.state = S_PLAY_PP_MACH4
		for i = -1, 1, 2
			local ang = i * ANG10
			local factor = FixedMul(4*mo.scale, cos(ang))
			local x = P_ReturnThrustX(mo, p.drawangle + ANGLE_180 + ang, 24*mo.scale)
			local y = P_ReturnThrustY(mo, p.drawangle + ANGLE_180 + ang, 24*mo.scale)
			local dust = P_SpawnMobjFromMobj(mo, x, y, 0, MT_THOK)
			dust.scale = mo.scale
			dust.angle = R_PointToAngle2(dust.x, dust.y, mo.x, mo.y)
			dust.state = S_FASTJUMPCLOUD
			dust.momx = FixedMul(factor, cos(dust.angle - i*ANGLE_90))
			dust.momy = FixedMul(factor, sin(dust.angle - i*ANGLE_90))
			if (mo.eflags & MFE_VERTICALFLIP)
				dust.flags2 = $|MF2_OBJECTFLIP
				dust.eflags = $|MFE_VERTICALFLIP
			end
		end
	end
end)

addHook("PlayerThink", function(p)
	local mo = p.mo
	if p.machspeed == 3
	and p.mo.skin == "prpeppino"
	and p.mo.state == S_PLAY_JUMP
		p.mo.state = S_PLAY_MACH3JUMP1
		for i = -1, 1, 2
			local ang = i * ANG10
			local factor = FixedMul(4*mo.scale, cos(ang))
			local x = P_ReturnThrustX(mo, p.drawangle + ANGLE_180 + ang, 24*mo.scale)
			local y = P_ReturnThrustY(mo, p.drawangle + ANGLE_180 + ang, 24*mo.scale)
			local dust = P_SpawnMobjFromMobj(mo, x, y, 0, MT_THOK)
			dust.scale = mo.scale
			dust.angle = R_PointToAngle2(dust.x, dust.y, mo.x, mo.y)
			dust.state = S_FASTJUMPCLOUD
			dust.momx = FixedMul(factor, cos(dust.angle - i*ANGLE_90))
			dust.momy = FixedMul(factor, sin(dust.angle - i*ANGLE_90))
			if (mo.eflags & MFE_VERTICALFLIP)
				dust.flags2 = $|MF2_OBJECTFLIP
				dust.eflags = $|MFE_VERTICALFLIP
			end
		end
	end
end)

freeslot("S_PLAY_JUMPSTART","SPR2_JUMS")

states[S_PLAY_JUMPSTART] = {
	sprite = SPR_PLAY,
	frame = SPR2_JUMS|FF_ANIMATE,
	tics = 24,
	var1 = 2,
	var2 = 2,
	nextstate = S_PLAY_FALL
}

addHook("PlayerThink", function(p)
	if p.machspeed < 2
	and p.mo.skin == "prpeppino"
	and p.mo.state == S_PLAY_JUMP
		p.mo.state = S_PLAY_JUMPSTART
		local jump = P_SpawnMobj(p.mo.x,p.mo.y,p.mo.z,MT_THOK)
		jump.state = S_SLOWJUMPCLOUD
		if (p.mo.eflags & MFE_VERTICALFLIP)
			jump.flags2 = $|MF2_OBJECTFLIP
			jump.eflags = $|MFE_VERTICALFLIP
		end
	end
end)