freeslot(
"SFX_SHOWTM",
"SFX_MALG",
"SFX_LUOK",
"SFX_BOPS",
"SFX_BOPE",
"SFX_BODED",
"SFX_BOPA1",
"SFX_BOPA2", 
"SFX_BOSTMP",
"SFX_BOSPN",
"SFX_BGAA",
"SFX_BOWOSH",
"SFX_BOCRSH",
"SFX_BSTMP",
"SFX_TSTRT",
"SPR2_TANT",
"S_PLAY_BOWSER_MELEE",
"S_PLAY_BOWSER_STOMP",
"S_PLAY_BOWSER_TAUNT",
"MT_BOWSER_FLING",
"MT_BOWSER_DEADFLING",
"S_PLAY_BOWSER_STOMP_END"
)
mobjinfo[MT_BOWSER_FLING] = {
	doomednum = -1,
	spawnstate = S_PLAY_STND,
	flags = MF_NOCLIPHEIGHT,
	radius = 5*FRACUNIT,
	deathstate = S_XPLD1,
	height = 5*FRACUNIT
}
mobjinfo[MT_BOWSER_DEADFLING] = {
	doomednum = -1,
	spawnstate = S_PLAY_STND,
	flags = MF_NOCLIPHEIGHT,
	radius = 5*FRACUNIT,
	deathstate = S_NULL,
	height = 5*FRACUNIT
}
sfxinfo[sfx_showtm].caption = "Showtime!"
sfxinfo[sfx_boded].caption = "Uh-oh..."
sfxinfo[sfx_bospn].caption = "Fwoh!"
sfxinfo[sfx_bope].caption = "Dah!"
sfxinfo[sfx_bops].caption = "Hmph!"
sfxinfo[sfx_bopa1].caption = "Oy!"
sfxinfo[sfx_bopa2].caption = "Nooo!"
sfxinfo[sfx_bostmp].caption = "Hrawh!"
sfxinfo[sfx_bstmp].caption = "Stomping"
sfxinfo[sfx_tstrt].caption = "Heavy Stomp"
sfxinfo[sfx_bgaa].caption = "Roaring"
sfxinfo[sfx_bowosh].caption = "Wooshing"
sfxinfo[sfx_bocrsh].caption = "Crashing"
sfxinfo[sfx_malg].caption = "Lets'a go!"
sfxinfo[sfx_luok].caption = "Okie-dokie!"
local maxcharge = 10
addHook("PreThinkFrame", function(j)
	for p in players.iterate
		if not p.bowser
			local bowser = {
				wasspinning = false,
				spin = 0,
				c1down = false,
				isscaled = false,
				punchangle = 0,
				punching = 0,
				punchstyle = 0,
				holdmove = false,
				punched = false,
				stomped = false,
				Bitch = false,
				igiveupjustdoitlateorsomeshitidontcarefuckthisgame = false,
				preventspin = false,
				lastframe = 0,
			}

			if p.mo and p.mo.valid and p.mo.skin == "bowser"
				p.bowser = bowser
			else
				p.bowser = nil
			end
		end
	end
end)
addHook("PlayerSpawn", function(p)
	local b = p.bowser
	if b
		b.wasspinning = false
		b.c1down = false
		b.isscaled = false
		b.punching = 0
		if (p.mo)
			p.normalspeed = skins[p.mo.skin].normalspeed
		end
	end
end)
addHook("ThinkFrame", function(j)
	for p in players.iterate
		if p.mo and p.mo.valid and p.mo.health and p.mo.skin == "bowser"
			if (p.mo.eflags & MFE_JUSTHITFLOOR) and (p.bowser.wasspinning)
				p.pflags = $ | PF_SPINNING
				p.mo.state = S_PLAY_ROLL
				p.panim = PA_DASH
			end
			p.bowser.wasspinning = (p.pflags & PF_SPINNING)
		end
	end
end)
addHook("PlayerThink", function(p)
	if not (p.mo and p.mo.valid) return end
	if p.mo.skin == "bowser"
		--p.pflags = $ & ~ PF_THOKKED
		--if S_MusicName == "VSBOSS"
			--S_ChangeMusic("BOWBOS", true, p)
		--end
		if p.playerstate == PST_DEAD
			if (p.mo.z > p.mo.floorz)
				p.mo.momz = min(-1*FRACUNIT, $)
			else
				p.mo.momz = FRACUNIT - FRACUNIT/3
			end
			p.mo.fuse = 25
			--P_TeleportMove(p.mo, p.mo.subsector.sector.floorz)
			if p.mo.frame & FF_FRAMEMASK == 13
				if not S_SoundPlaying(p.mo, sfx_pstop)
					S_StartSound(p.mo, sfx_pstop)
					if p == displayplayer
						P_StartQuake(10*FRACUNIT, 6)
					end
				end
			end
			p.mo.flags = $ & ~MF_NOCLIP
			p.mo.flags = $ & ~MF_NOCLIPHEIGHT
			if p.mo.frame & FF_FRAMEMASK == 15
				p.mo.anim_duration = -1
			elseif leveltime % 3 == 0
				p.mo.state = $
			end
		end
		if not (p.mo.health) return end
		if (p.exiting)
			if (leveltime % 3 == 0)
				p.exiting = $+1
			end
		end
		if (p.exiting) and p.speed > 0
			P_Thrust(p.mo, R_PointToAngle2(p.mo.x+p.mo.momx, p.mo.y+p.mo.momy, p.mo.x, p.mo.y), p.speed/4)
		end
		if ((p.cmd.buttons & BT_TOSSFLAG) and (p.cmd.buttons & BT_CUSTOM2) or (p.exiting)) and p.speed == 0  and P_IsObjectOnGround(p.mo)
			if p.mo.state != S_PLAY_BOWSER_TAUNT
				p.mo.state = S_PLAY_BOWSER_TAUNT
				--S_StartSound(p.mo, sfx_tstrt)
			end
		end
		if p.mo.state == S_PLAY_BOWSER_TAUNT
			if (p.mo.frame & FF_FRAMEMASK) == U
				p.mo.anim_duration = -1
			end
			if (p.mo.frame & FF_FRAMEMASK) == B
				if not (S_SoundPlaying(p.mo, sfx_bops))
					S_StartSound(p.mo, sfx_bops)
				end
			end
			local csound = sfx_tstrt
			if (p.mo.frame & FF_FRAMEMASK) == L
				if not (S_SoundPlaying(p.mo, csound))
					S_StartSound(p.mo, csound)
					S_StartSound(p.mo, sfx_bstmp)
					--S_StartSound(p.mo, sfx_pstop)
				end
				if consoleplayer and consoleplayer.mo and R_PointToDist2(p.mo.x, p.mo.y, consoleplayer.mo.x, consoleplayer.mo.y) <= 3500*FRACUNIT then 
					P_StartQuake(8*FRACUNIT, 14) 
				end
			end
			if p.mo.frame & FF_FRAMEMASK == Q
				if not (S_SoundPlaying(p.mo, sfx_bgaa))
					S_StartSound(p.mo, sfx_bgaa)
				end
			end
			if (p.cmd.forwardmove != 0 or p.cmd.sidemove != 0)
				p.mo.state = S_PLAY_WALK
				S_StopSound(p.mo)
			end
		end
		if p.pflags & PF_SPINNING and (FixedHypot(p.mo.momx, p.mo.momy) < 35*p.mo.scale and not p.bowser.isscaled or p.bowser.isscaled == true and FixedHypot(p.mo.momx, p.mo.momy) < 35/2*p.mo.scale)
			if not p.bowser.isscaled
				P_InstaThrust(p.mo, R_PointToAngle2(p.mo.x, p.mo.y, p.mo.x+p.mo.momx, p.mo.y+p.mo.momy), 38*p.mo.scale)
			else
				P_InstaThrust(p.mo, R_PointToAngle2(p.mo.x, p.mo.y, p.mo.x+p.mo.momx, p.mo.y+p.mo.momy), 38/2*p.mo.scale)
			end
		end
		
		if p.mo.sprite2 == SPR2_WALK and P_IsObjectOnGround(p.mo)
			if p.mo.frame & FF_FRAMEMASK == E or p.mo.frame & FF_FRAMEMASK == M
				if p == displayplayer
					P_StartQuake(FRACUNIT*2, 4)
					local sound = sfx_bstmp
					if p.mo.frame != p.bowser.lastframe
						S_StartSound(p.mo, sound)
					end
				end
			end
		end
		if (p.mo.eflags & MFE_JUSTHITFLOOR) and (p.mo.health)
			if p == displayplayer
				P_StartQuake(FRACUNIT*2, 4)
				local sound = sfx_bstmp
				S_StartSound(p.mo, sound)
			end
		end
		p.bowser.lastframe = p.mo.frame
		if not (p.cmd.buttons & BT_SPIN) and p.bowser.spin > 0 and p.mo.state != S_PLAY_BOWSER_MELEE and not (p.pflags & PF_SPINNING)
			--if P_IsObjectOnGround(p.mo)
				if p.bowser.spin < maxcharge and not (p.mo.state == S_PLAY_BOWSER_STOMP_END)
					p.mo.state = S_PLAY_BOWSER_MELEE
					p.pflags = $ & ~ PF_SPINNING
					if (p.mo.colorized)
						p.mo.colorized = false
						p.mo.color = p.skincolor
					end
					p.panim = PA_DASH
					p.bowser.punching = 1
					p.bowser.punched = true
					p.bowser.punchstyle = 1
					S_StartSound(p.mo, sfx_bops)
					--S_StartSound(p.mo, sfx_bowosh)
				elseif not (p.bowser.stomped)
					--p.panim = PA_DASH
					p.mo.state = S_PLAY_ROLL
					--p.panim = PA_DASH
					p.pflags = $ | PF_SPINNING
					if (p.mo.colorized)
						p.mo.colorized = false
						p.mo.color = p.skincolor
					end
					S_StartSound(p.mo, sfx_bospn)
					if p.speed <= 20*p.mo.scale
						P_InstaThrust(p.mo, p.mo.angle, 20*p.mo.scale)
					end
				end
			--end
			p.bowser.spin = 0
		end
		if p.bowser.igiveupjustdoitlateorsomeshitidontcarefuckthisgame == true
			p.bowser.igiveupjustdoitlateorsomeshitidontcarefuckthisgame = false
			if not (p.bowser.stomped)
				if p.speed <= 20*p.mo.scale
					P_InstaThrust(p.mo, p.mo.angle, 20*p.mo.scale)
					--print("test")
					P_TeleportMove(p.mo, p.mo.x, p.mo.y, p.mo.z+FRACUNIT)
				end
				p.pflags = $ | PF_SPINNING
				p.mo.state = S_PLAY_ROLL
				p.panim = PA_DASH
				p.bowser.wasspinning = true
				p.bowser.Bitch = true
				S_StartSound(p.mo, sfx_bospn)
			end
		end
		if p.bowser.spin == maxcharge
			p.mo.color = SKINCOLOR_RED
			p.mo.colorized = true
			p.bowser.spin = $+1
			S_StartSound(p.mo, sfx_kc55)
		elseif p.bowser.spin == maxcharge+1
			p.mo.colorized = false
			p.mo.color = p.skincolor
		end
		if (p.pflags & PF_SPINNING) and (p.cmd.buttons & BT_SPIN) and not (p.bowser.Bitch)
			p.pflags = $ & ~ PF_SPINNING
			p.mo.state = S_PLAY_FALL
			p.bowser.spin = 0
			p.bowser.preventspin = true
			--print("j")
		end
		if not (p.cmd.buttons & BT_SPIN)
			p.bowser.Bitch = false
		end
		/*if (p.cmd.buttons & BT_CUSTOM1) and not p.bowser.c1down
			p.mo.scale = $*3
			p.normalspeed = $/2
			p.mo.spritexscale = FRACUNIT+FRACUNIT/2
			p.mo.spriteyscale = FRACUNIT+FRACUNIT/2
			p.bowser.isscaled = true
		end*/
		if p.mo.state == S_PLAY_BOWSER_STOMP
			p.mo.momz = 0
			p.mo.momx = $ - $/10
			p.mo.momy = $ - $/10
		end
		if P_IsObjectInGoop(p.mo) and p.mo.state == S_PLAY_BOWSER_STOMP_END
			p.mo.state = S_PLAY_FALL
		end
		if p.mo.state == S_PLAY_BOWSER_STOMP_END
			p.panim = PA_DASH
			if not P_IsObjectOnGround(p.mo)
				P_SetObjectMomZ(p.mo, min(p.mo.momz*P_MobjFlip(p.mo)-p.mo.scale, -22*p.mo.scale), false)
				p.mo.momx = $ - $/10
				p.mo.momy = $ - $/10
				p.bowser.punchangle = p.drawangle
			else
				if not (p.pflags & PF_SPINNING)
					if (p.mo.eflags & MFE_JUSTHITFLOOR)
						if displayplayer == p
							P_StartQuake(10*FRACUNIT, 6)
						end
						S_StartSound(p.mo, sfx_bocrsh)
					end
					p.mo.momx = 0
					p.mo.momy = 0
					p.drawangle = p.bowser.punchangle
					if (p.cmd.sidemove != 0 or p.cmd.forwardmove != 0) and not (p.bowser.holdmove)
						p.mo.state = S_PLAY_WALK
					end
				end
			end
		end
		if (p.cmd.buttons & BT_CUSTOM1) and not (p.bowser.punched) and not (p.bowser.c1down) and p.bowsercontrolstyle == 2 and (P_IsObjectOnGround(p.mo) or (p.pflags & PF_JUMPED))
			p.mo.state = S_PLAY_BOWSER_MELEE
			p.panim = PA_DASH
			p.bowser.punching = 1
			p.bowser.punched = true
			p.bowser.punchstyle = 1
			p.pflags = $ & ~ PF_SPINNING
			S_StartSound(p.mo, sfx_bops)
			--S_StartSound(p.mo, sfx_bowosh)
		end
		if (p.mo.eflags & MFE_SPRUNG) and p.bowser.stomped
			p.mo.momz = $*5/4
			p.mo.momx = $*5/4
			p.mo.momy = $*5/4
			S_StartSound(p.mo, sfx_sprong)
		end
		if (P_IsObjectOnGround(p.mo) or (p.mo.eflags & MFE_JUSTHITFLOOR) or (p.powers[pw_carry])) and p.mo.state != S_PLAY_BOWSER_MELEE
			p.bowser.punched = false
			p.bowser.stomped = false
		end
		if p.mo.state == S_PLAY_RUN and leveltime % 3 == 0
			p.mo.state = $
		end
		if (p.cmd.buttons & BT_CUSTOM2) and not (p.mo.state == S_PLAY_MELEE)
			--p.mo.state = S_PLAY_MELEE
		end
		if (p.mo.eflags & MFE_SPRUNG)
			p.bowser.punching = 0
			if (p.mo.state == S_PLAY_BOWSER_MELEE)
				p.mo.state = S_PLAY_FALL
			end
		end
		if p.bowser.punching >= 1
			if (p.mo.frame & FF_FRAMEMASK) == 10
				p.mo.anim_duration = -1
			end
			p.bowser.punching = $ + 1
			if p.bowser.punching <= 17
				p.mo.momz = 0
				p.mo.momx = $ - $/8
				p.mo.momy = $ - $/8
				p.drawangle = p.mo.angle
				if p.bowser.punching == 17
					p.bowser.punchangle = p.mo.angle
				end
			elseif p.bowser.punching >= 18
				if p.bowser.punching == 18
					S_StartSound(p.mo, sfx_bope)
				end
				P_InstaThrust(p.mo, p.bowser.punchangle, 45*FRACUNIT)
				p.mo.momz = 0
				p.drawangle = p.bowser.punchangle
				if p.bowser.punching >= 44
					p.bowser.punching = 0
					p.mo.state = S_PLAY_FALL
				end
			end
			if p.mo.state != S_PLAY_BOWSER_MELEE
				p.bowser.punching = 0
			end
		end
		
		p.bowser.c1down = (p.cmd.buttons & BT_CUSTOM1)
		if (p.cmd.forwardmove != 0 or p.cmd.sidemove != 0)
			p.bowser.holdmove = true
		else
			p.bowser.holdmove = false
		end
		if p.bowser.preventspin == true and not (p.cmd.buttons & BT_SPIN)
			p.bowser.preventspin = false
		end
		--if p.mo.state == S_PLAY_RUN and p.speed > 30*p.mo.scale
		--	p.mo.state = $
		--end
		/*if (p.mo.eflags & MFE_JUSTHITFLOOR) and (p.bowser.wasspinning)
			p.pflags = $ | PF_SPINNING
			p.mo.state = S_PLAY_ROLL
		end
		if (p.pflags & PF_SPINNING)
			p.bowser.wasspinning = true
		end*/
	end
end)
addHook("ShouldDamage", function(trg, inf, src)
	if trg and trg.valid and trg.health and trg.player and trg.skin == "bowser" and (trg.state == S_PLAY_BOWSER_STOMP or trg.state == S_PLAY_BOWSER_STOMP_END or (trg.player.pflags & PF_SPINNING))
		if src and src.valid-- and src.type == MT_GSNAPPER
			if (gametyperules & GTR_FRIENDLY)
				return false
			end
		end
	end
end, MT_PLAYER)
addHook("SpinSpecial", function(p)
	if p.mo and p.mo.valid and p.mo.health and p.mo.skin == "bowser" and not (p.bowser.preventspin) and (P_IsObjectOnGround(p.mo) or (p.pflags & PF_JUMPED))
		--if P_IsObjectOnGround(p.mo) or p.bowser.spin > 0
		if p.bowsercontrolstyle == 1
			if p.bowser.spin <= maxcharge and not (p.bowser.punching)
				if not (p.bowser.punched)
					p.bowser.spin = min($+1, maxcharge)
				elseif not (p.pflags & PF_SPINNING) and not (p.pflags & PF_SPINDOWN)
					p.bowser.igiveupjustdoitlateorsomeshitidontcarefuckthisgame = true
				end
			end
		elseif not (p.pflags & PF_SPINNING) and not (p.pflags & PF_SPINDOWN)
			p.bowser.igiveupjustdoitlateorsomeshitidontcarefuckthisgame = true
		end
		--end
		--print(p.bowser.spin)
	end
end)

addHook("MapLoad", function(j)
	for p in players.iterate
		if mapheaderinfo[gamemap].bonustype == 1 and p and p.mo and p.mo.valid
			if p.mo.skin == "bowser"
				S_StartSound(p.mo, sfx_showtm)
			elseif p.mo.skin == "mario" --futureproofing incase marco/loogie wads come out
				S_StartSound(p.mo, sfx_malg)
			elseif p.mo.skin == "luigi"
				S_StartSound(p.mo, sfx_luok)
			end
		end
	end
end)
addHook("MobjDeath", function(mo)
	if mo and mo.valid and mo.skin == "bowser"
		S_StartSound(mo, sfx_boded)
	end
end, MT_PLAYER)
addHook("MobjDamage", function(mo)
	if mo and mo.valid and mo.skin == "bowser" and mo.player and mo.player.rings > 0
		if P_RandomRange(1, 2) == 1
			S_StartSound(mo, sfx_bopa1)
		else
			S_StartSound(mo, sfx_bopa2)
		end
	end
end, MT_PLAYER)
addHook("MusicChange", function(oldname, newname)
	if consoleplayer
		local character = skins[consoleplayer.skin].name
		if character == "bowser" or character == "mario" or character == "luigi" //skin to use custom themes
			if newname == "VSBOSS" //intercept and override jingles
				return "BOWBOS"
			elseif newname == "VSMETL"
				return "BOWBS2"
			elseif newname == "VSBRAK"
				return "BOWBS3"
			end
		end
	end
end)

addHook("MobjMoveBlocked", function(mobj)
    if not (mobj.player and mobj.skin == "bowser"
    and ((mobj.player.pflags & PF_SPINNING) or mobj.player.bowser.punching >= 18)) return end
	mobj.player.lastlinehit = -1
	mobj.player.lastsidehit = -1
    P_SlideMove(mobj)
    mobj.player.powers[pw_pushing] = 3
    local p = mobj.player
    local line = lines[mobj.player.lastlinehit]
	if line and line.valid
		if (line.frontsector)
			if (line.frontsector.ceilingheight == line.frontsector.floorheight) and (mobj.z > line.frontsector.ceilingheight)
				return
			end
		end
		if (line.backsector)
			if (line.backsector.ceilingheight == line.backsector.floorheight) and (mobj.z > line.backsector.ceilingheight)
				return
			end
		end
		--mobj.player.bowser.walltouch = 6
		if (p.pflags & PF_SPINNING)
			S_StartSound(mobj, sfx_mario1)
			P_Thrust(mobj, (R_PointToAngle2(mobj.x,mobj.y,P_ClosestPointOnLine(mobj.x,mobj.y,line))+FixedAngle(180*FRACUNIT)), mobj.player.speed-mobj.player.speed/6) 
		else
			P_Thrust(mobj, (R_PointToAngle2(mobj.x,mobj.y,P_ClosestPointOnLine(mobj.x,mobj.y,line))+FixedAngle(180*FRACUNIT)), 8*FRACUNIT) 
			P_SetObjectMomZ(mobj, 6*FRACUNIT, false)
			S_StartSound(mobj, sfx_wbreak)
			mobj.state = S_PLAY_FALL
			p.pflags = $&~PF_STARTJUMP
			mobj.player.bowser.punching = 0
		end
	end

    return true
end, MT_PLAYER)
addHook("PlayerCanDamage", function(p)
	if p.mo and p.mo.valid and p.mo.health and p.mo.skin == "bowser"
		if p.bowser.isscaled or p.bowser.punching > 0 or p.mo.state == S_PLAY_BOWSER_STOMP or p.mo.state == S_PLAY_BOWSER_STOMP_END
			return true
		end
	end
end)
/*addHook("JumpSpinSpecial", function(p)
	if p.mo and p.mo.valid and p.mo.health and p.mo.skin == "bowser" and p.bowser
		if not (p.pflags & PF_SPINDOWN) and not (p.bowser.punched)
			p.mo.state = S_PLAY_BOWSER_MELEE
			p.panim = PA_DASH
			p.bowser.punching = 1
			p.bowser.punched = true
			S_StartSound(p.mo, sfx_bops)
			p.bowser.punchstyle = 2
		end
	end
end)*/
addHook("AbilitySpecial", function(p)
	if p.mo and p.mo.health and p.mo.valid and p.mo.skin == "bowser"
		if not (p.bowser.stomped)
			p.mo.state = S_PLAY_BOWSER_STOMP
			p.pflags = $ & ~ PF_SPINNING
			p.panim = PA_DASH
			p.bowser.stomped = true
			p.bowser.punched = true
			S_StartSound(p.mo, sfx_bostmp)
		end
	end
end)
addHook("MobjDeath", function(trg, inf, src)
	if not (trg.flags & MF_ENEMY) return end
	if trg and trg.valid and inf and inf.valid and inf.health and inf.player and inf.skin == "bowser" and inf.state == S_PLAY_BOWSER_MELEE
		local p = inf.player
		
		S_StartSound(inf, sfx_s3k49)
		trg.flags2 = $|MF2_DONTDRAW
	//	mobjinfo[MT_BOWSER_FLING].spawnstate = trg.state --Copying it's spawnstate also copies that state's action , that's BEGGING for weird behaviour.
		local fling = P_SpawnMobjFromMobj(trg, 0, 0, 0, MT_BOWSER_FLING)
		if fling and fling.valid and trg and trg.valid --fucking errors for some reason if i dont do this shit
		
		--update: it still FUCKING DOES EVEN IF I DO ADD THESE CHECKS WHAT THE HELL AM I DOING WRONG FUCK
		
			trg.tics = -1
			fling.sprite = trg.sprite --Whatever sprite it's using now.
			fling.sprite2 = trg.sprite2 --just incase it's a player somehow.
			fling.frame = trg.frame --The frame it just used
			fling.angle = trg.angle --The angle it just used
			fling.color = trg.color
			fling.info.deathstate = S_CYBRAKDEMONVILEEXPLOSION1  --I'd recommend this, but for now, let's keep the deathstate behaviour, I guess!
			--fling.info.deathstate = trg.info.deathstate
			fling.nokilltimer = 3
			fling.info.deathsound = sfx_s3kb4
			S_StopSound(trg)
			--print("huhjnjdf")
			P_SetObjectMomZ(fling, 15*FRACUNIT, false)
			P_InstaThrust(fling, R_PointToAngle2(inf.x, inf.y, fling.x, fling.y), 43*FRACUNIT)
			--local storespawnhealth = trg.info.spawnhealth
			--trg.type = MT_BOWSER_DEADFLING
			--trg.info.spawnhealth = storespawnhealth
		end
	end
end)
addHook("MobjThinker", function(mo)
	if mo and mo.valid and mo.health
		if not (mo.secondphase)
			if mo.nokilltimer > 0
				mo.nokilltimer = $ - 1
			end
			--print(mo.info.deathstate)
			if P_IsObjectOnGround(mo) or (FixedHypot(mo.momx, mo.momy) == 0)
				--mo.rollangle = 0
				if mo.nokilltimer == 0
					mo.momx = 0
					mo.momy = 0
					mo.momz = 0
					mo.flags = $ | MF_NOGRAVITY
					local lmao = P_SpawnMobjFromMobj(mo, 0, 0, 0, MT_BOWSER_FLING)
					lmao.sprite = mo.sprite
					lmao.sprite2 = mo.sprite2
					lmao.color = mo.color
					lmao.target = mo
					lmao.secondphase = true
					lmao.rollangle = mo.rollangle
					lmao.angle = mo.angle
					P_KillMobj(mo)
					mo.rollangle = 0
				end
			else
				mo.rollangle = $ + FixedAngle(20*FRACUNIT)
			end
		else
			if not (mo.target and mo.target.valid)
				P_RemoveMobj(mo)
			else
				mo.momx = 0
				mo.momz = 0
				mo.momy = 0
				if leveltime % 2 == 0
					mo.flags2 = $|MF2_DONTDRAW
				else
					mo.flags2 = $&~MF2_DONTDRAW
				end
			end
		end
	end
end, MT_BOWSER_FLING)