--added this little bit up top here so steph can easily change around various things if he wishes
local maimydashcolor = SKINCOLOR_VAPOR
local maimychargesound = sfx_cdfm66
local maimyblastoff = sfx_cdfm62
freeslot(
"SPR2_CHRG",
"S_MAIMY_CHARGE"
)
local function miamicircle(mobj, mobjtype, ns, vertical, vertangle)
	local i = 0	while i < 20
		local fa = (i*(ANGLE_180/10))
		local mo = P_SpawnMobjFromMobj(mobj, P_ReturnThrustX(mobj, fa, -60*FRACUNIT), P_ReturnThrustY(mobj, fa, 60*FRACUNIT), 0*FRACUNIT, mobjtype)
		if mo and mo.valid
			if mobjtype == MT_MSGATHER
				mo.target = mobj
				mo.scale = 1*FRACUNIT/3
				mo.fuse = 11
				mo.colorized = true
				mo.maimyhome = true
				mo.storefa = fa
				mo.color = SKINCOLOR_NEON
				P_InstaThrust(mo, R_PointToAngle2(mo.x, mo.y, mobj.x, mobj.y), 5*FRACUNIT)
				--mo.destscale = 1*FRACUNIT + 1*FRACUNIT/3
				--if mobj.player.powers[pw_super]
				--	mo.color = mobj.color
				--	mo.colorized = true
				--end
			end
			if vertical
				mo.momz = FixedMul(sin(fa),ns)/2
				P_InstaThrust(mo, vertangle+ANGLE_90,
				FixedMul(cos(fa),ns)/2)
			else
				--mo.momx = mo.target.momx+FixedMul(sin(fa),ns)/2*-1
				--mo.momy = mo.target.momy+FixedMul(cos(fa),ns)/2*-1
			end
		end
		i = $+1
	end
end
addHook("PlayerThink", function(p)
	if not p.maimy
		local maimy = {
			rocketcharge = 0,
			rocketstart = false,
			rocketfall = 0,
			blastoff = false,
			wasdashing = false,
			djstage = 0,
			removecolorize = false
		}

		if p.mo and p.mo.valid and p.mo.skin == "maimy"
			p.maimy = maimy
		else
			p.maimy = nil
		end
	end
	/*if (p.cmd.buttons & BT_CUSTOM1)
		print(p.maimy.rocketcharge.. " rocketcharge")
		print(p.maimy.rocketstart.. " rocketsttart")
		--print(p.maimy.blastoff.. " blastoff")
		print(p.maimy.djstage.. " djstage")
	end*/
	if p.mo and p.mo.valid and p.mo.health and p.mo.skin == "maimy"
		if (p.maimy.djstage == 1 or p.maimy.djstage >= 1 and p.powers[pw_super]) and p.cmd.buttons & BT_JUMP
			if p.maimy.rocketcharge < 70
				if p.maimy.rocketcharge + 2 >= 70
					S_StartSound(p.mo, maimychargesound)
				end
				p.maimy.rocketcharge = $ + 2
			end
			if p.maimy.rocketcharge > 0 and (p.mo.state == S_PLAY_FALL or p.mo.state == S_PLAY_SPRING)
				p.mo.state = S_MAIMY_CHARGE
			end
			if leveltime % 10 == 0
				miamicircle(p.mo, MT_MSGATHER, 5 << FRACBITS, false, 0)
				--energy.destscale = FRACUNIT/10
			end
			if p.mo.momz*P_MobjFlip(p.mo) < p.maimy.rocketfall*P_MobjFlip(p.mo)
				P_SetObjectMomZ(p.mo, p.maimy.rocketfall)
			end
			p.maimy.rocketfall = $ - FRACUNIT/5
		end
		if p.maimy.rocketcharge > 0 and not (p.cmd.buttons & BT_JUMP)
			p.pflags = $ & ~ PF_STARTJUMP
			if not (p.mo.eflags & MFE_UNDERWATER)
				P_SetObjectMomZ(p.mo, p.maimy.rocketcharge*(FRACUNIT/2 + FRACUNIT/5)/2, false)
			else
				P_SetObjectMomZ(p.mo, p.maimy.rocketcharge/2*(FRACUNIT/2 + FRACUNIT/5)/2, false)
			end
			S_StartSound(p.mo, maimyblastoff)
			p.maimy.rocketcharge = 0
			p.maimy.blastoff = true
			p.mo.state = S_PLAY_JUMP
		end
		if p.maimy.blastoff == true
			if p.mo.momz*P_MobjFlip(p.mo) < 0 
				p.maimy.blastoff = false
			else
				if leveltime % 3 == 0
					local rocket = P_SpawnMobjFromMobj(p.mo, P_ReturnThrustX(p.mo, p.drawangle, -15*FRACUNIT), P_ReturnThrustY(p.mo, p.drawangle, -15*FRACUNIT), 0, MT_MSGATHER)
					rocket.fuse = 10
					rocket.color = SKINCOLOR_ORANGE
					rocket.scale = FRACUNIT - FRACUNIT/3
					rocket.target = p.mo
					rocket.destscale = FRACUNIT/10
				end
			end
		end
		if p.dashmode >= 3*TICRATE
			-- reverbal: indicate dashmode is on
			if not p.maimy.wasdashing then p.maimy.wasdashing = true end
			if (((leveltime-3)/2) & 1)
				p.mo.colorized = true
				p.mo.color = maimydashcolor
			else
				if not p.powers[pw_super]
					p.mo.color = p.skincolor
				else
					p.mo.color = SKINCOLOR_SUPERPURPLE1
				end
				p.mo.colorized = false
			end
		-- reverbal: uncolorize if not in dashmode
		elseif p.dashmode < 3*TICRATE and p.maimy.wasdashing then
			p.mo.colorized = false
			p.mo.color = p.skincolor
			p.maimy.wasdashing = false
		end
		
		if not p.isxmomentum
			--if p.powers[pw_carry]
			--or p.mo.state == S_PLAY_PAIN
			--or p.playerstate == PST_DEAD
			--or p.exiting
				--p.maimy.wasdashing = false
			--end
			if not P_IsObjectOnGround(p.mo)
				if p.maimy.wasdashing == true and p.powers[pw_carry] != CR_DUSTDEVIL and p.playertate != PST_DEAD and not P_PlayerInPain(p)
					--print("FUCK")
					p.dashmode = max(p.dashmode, 3*36)
				end
			end
		end
		-- reverbal: disabling dashmode color stuff (?)
		/*
		if p.maimy.wasdashing == true and p.dashmode < 3*TICRATE then -- <= 3*TICRATE
			if not p.powers[pw_super]
				p.mo.color = p.skincolor
			else
				p.mo.color = SKINCOLOR_SUPERPURPLE1
			end
			p.mo.colorized = false
		end
		*/
		
		--if p.powers[pw_super]
			--p.maimy.djstage = 1
		--end
		--print(p.maimy.blastoff)
		--if not (p.pflags & PF_THOKKED)
		--if p.cmd.buttons & BT_CUSTOM1
		--	print(p.maimy.wasdashing)
		--end
		if (p.mo.eflags & MFE_SPRUNG) and p.mo.state == S_MAIMY_CHARGE
			p.mo.state = S_PLAY_SPRING
		end
		-- reverbal: disabling dashmode preservation
		/*
		if p.dashmode > 3*TICRATE 
			p.maimy.wasdashing = true
		else
			p.maimy.wasdashing = false
		end
		*/
		
		if p.powers[pw_carry]
			p.dashmode = 0
			p.maimy.wasdashing = false
			p.maimy.removecolorize = true
		end
		if p.maimy.removecolorize
			p.mo.color = p.skincolor
			p.mo.colorized = false
			p.maimy.removecolorize = false
		end
		-- reverbal: add p.gotflagdebuff and p.gotflag checks
		if p.gotflagdebuff or p.gotflag or P_IsObjectOnGround(p.mo) or (p.mo.eflags & MFE_JUSTHITFLOOR) or p.powers[pw_carry] or P_PlayerInPain(p) or not P_IsObjectOnGround(p.mo) and not (p.pflags & PF_JUMPED)
			p.maimy.djstage = 0
			p.maimy.rocketfall = 0
			p.maimy.rocketstart = 0
			p.maimy.rocketcharge = 0
		end
		
		-- reverbal: Charge sfx
		if p.maimy.djstage and p.mo.state == S_MAIMY_CHARGE then
			if not(leveltime%7) then S_StartSound(p.mo, sfx_s3k5c) end
		end
	end
end)
addHook("AbilitySpecial", function(p)
	if p.mo and p.mo.valid and p.mo.health and p.mo.skin == "maimy"
		--if not (p.pflags & PF_JUMPDOWN) 
			--p.maimy.timesjumped = $ + 1
		--end
		if p.pflags & PF_JUMPED and not P_PlayerInPain(p)
			if p.maimy.djstage <= 1 and not (p.pflags & PF_JUMPDOWN)
				--p.maimy.rocketcharge = $ + 1
				
				if p.maimy.djstage == 0 --or p.powers[pw_super]
					p.mo.state = S_MAIMY_CHARGE
				end
				--if not p.powers[pw_super]
				p.maimy.djstage = $ + 1
				--end
			else
				--p.mo.momz = 0 - 1*FRACUNIT
			end
			if p.powers[pw_super] and not (p.pflags & PF_JUMPDOWN)
				p.mo.state = S_MAIMY_CHARGE
			end
		end
	end
end)
addHook("MobjThinker", function(mo)
	if mo and mo.valid and mo.target and mo.target.valid and mo.target.player and mo.target.health and mo.target.skin == "maimy" and mo.maimyhome
		mo.lifetime = $ or 0
		--mo.x = mo.target.x + mo.lifetime * mo.momx
		--mo.y = mo.target.y + mo.lifetime * mo.momy
		--mo.z = mo.target.z + mo.lifetime * mo.momz
		P_TeleportMove(mo, (mo.target.x+P_ReturnThrustX(mo.target, mo.storefa, -45*FRACUNIT)) + mo.lifetime * mo.momx, (mo.target.y+P_ReturnThrustY(mo.target, mo.storefa, 45*FRACUNIT)) + mo.lifetime * mo.momy, mo.target.z + 17*FRACUNIT + mo.lifetime * mo.momz)
		mo.lifetime = $ + 1
	end
end, MT_MSGATHER)
--P_ReturnThrustX(mobj, fa, -45*FRACUNIT), P_ReturnThrustY(mobj, fa, 45*FRACUNIT)

/*addHook("MobjCollide", function(tmthing, thing)
	if thing and thing.valid and thing.target and tmthing and tmthing.player and tmthing.health and tmthing.skin == "maimy" and thing.maimyhome
		P_RemoveMobj(thing)
		print("frick")
	end
end, MT_MSGATHER)*/