--apparently this makes shit faster? wtf?
local TICRATE = TICRATE
local FRACUNIT = FRACUNIT
local MAXSKINCOLORS = MAXSKINCOLORS
local ANG1 = ANG1
local k_sneakertimer = k_sneakertimer
local k_spinouttimer = k_spinouttimer
local k_wipeoutslow = k_wipeoutslow
local k_driftboost = k_driftboost
local k_floorboost = k_floorboost
local k_startboost = k_startboost
local k_itemamount = k_itemamount
local k_itemtype = k_itemtype
local k_rocketsneakertimer = k_rocketsneakertimer
local k_hyudorotimer = k_hyudorotimer
local k_drift = k_drift
local k_speedboost = k_speedboost
local k_accelboost = k_accelboost
local k_invincibilitytimer = k_invincibilitytimer
local k_growshrinktimer = k_growshrinktimer
local k_aizdriftstrat = k_aizdriftstrat

local function K_MatchGenericExtraFlags(mo, master)
	--flipping
	--handle z shifting from there too. This is here since there's no reason not to flip us if needed when we do this anyway;
	mo.eflags = (mo.eflags & ~MFE_VERTICALFLIP)|(master.eflags & MFE_VERTICALFLIP)
	mo.flags2 = (mo.flags2 & ~MF2_OBJECTFLIP)|(master.flags2 & MF2_OBJECTFLIP)

	if (mo.eflags & MFE_VERTICALFLIP)
		mo.z = $ + master.height - FixedMul(master.scale, mo.height)
	end
	
	--visibility (usually for hyudoro)
	mo.flags2 = (mo.flags2 & ~MF2_DONTDRAW)|(master.flags2 & MF2_DONTDRAW)
	mo.eflags = (mo.eflags & ~MFE_DRAWONLYFORP1)|(master.eflags & MFE_DRAWONLYFORP1)
	mo.eflags = (mo.eflags & ~MFE_DRAWONLYFORP2)|(master.eflags & MFE_DRAWONLYFORP2)
	mo.eflags = (mo.eflags & ~MFE_DRAWONLYFORP3)|(master.eflags & MFE_DRAWONLYFORP3)
	mo.eflags = (mo.eflags & ~MFE_DRAWONLYFORP4)|(master.eflags & MFE_DRAWONLYFORP4)
end

local function spawnSwordWater(p)
	local newx, newy, spark, travelangle

	if not (p.mo and p.mo.valid) then return end

	if (leveltime % 2 == 1) then
		return
	end

	if (not P_IsObjectOnGround(p.mo)) then
		return
	end

	--travelangle = R_PointToAngle2(0, 0, p.mo.momx, p.mo.momy)
	travelangle = p.mo.angle
	--S_StartSound(p.mo, sfx_s3k47)


	newx = p.mo.x + P_ReturnThrustX(p.mo, travelangle - (-135*ANG1), FixedMul(24*FRACUNIT, p.mo.scale))
	newy = p.mo.y + P_ReturnThrustY(p.mo, travelangle - (-135*ANG1), FixedMul(24*FRACUNIT, p.mo.scale))
	spark = P_SpawnMobj(newx, newy, p.mo.z, MT_AIZDRIFTSTRAT)

	spark.angle = travelangle + (-25*ANG1)
	spark.scale = FixedMul((1*p.mo.scale)/5, FixedDiv(p.speed, 45*FRACUNIT))
	spark.destscale = spark.scale + FixedMul(FixedMul((1*p.mo.scale)/5, FRACUNIT*abs(p.cmd.driftturn-800)/400), FixedDiv(p.speed, 40*FRACUNIT))
	
	if abs(p.kartstuff[k_drift]) > 3 then
		spark.momx = (6*p.mo.momx)/5
		spark.momy = (6*p.mo.momy)/5
	else
		spark.momx = (3*p.mo.momx)/5
		spark.momy = (3*p.mo.momy)/5
	end
	
	spark.color = SKINCOLOR_AQUA
	spark.colorized = true
	
	K_MatchGenericExtraFlags(spark, p.mo)
	
	--wet code I know
	newx = p.mo.x + P_ReturnThrustX(p.mo, travelangle - (135*ANG1), FixedMul(24*FRACUNIT, p.mo.scale))
	newy = p.mo.y + P_ReturnThrustY(p.mo, travelangle - (135*ANG1), FixedMul(24*FRACUNIT, p.mo.scale))
	spark = P_SpawnMobj(newx, newy, p.mo.z, MT_AIZDRIFTSTRAT)

	spark.angle = travelangle + (25*ANG1)
	spark.scale = FixedMul((1*p.mo.scale)/5, FixedDiv(p.speed, 45*FRACUNIT))
	spark.destscale = spark.scale + FixedMul(FixedMul((1*p.mo.scale)/5, FRACUNIT*(p.cmd.driftturn+800)/400), FixedDiv(p.speed, 40*FRACUNIT))

	if abs(p.kartstuff[k_drift]) > 3 then
		spark.momx = (6*p.mo.momx)/5
		spark.momy = (6*p.mo.momy)/5
	else
		spark.momx = (3*p.mo.momx)/5
		spark.momy = (3*p.mo.momy)/5
	end
	
	spark.color = SKINCOLOR_AQUA
	spark.colorized = true

	K_MatchGenericExtraFlags(spark, p.mo)
end

addHook("ThinkFrame", do
	for p in players.iterate do
		if not (p and p.mo) continue end
		if not p.mo.skin == "maha" then continue end
		if p.speed >= 5*FRACUNIT and p.mo.skin == "maha" then
			spawnSwordWater(p)
		end
	end
end)