
--[[well then, hello there.				      /*    @&#(#(/(%@@    #
i see youre looking at my script, eh?	 (,, *#(,.               ,/%/(/,
whatever you do, don't steal my		   & @%,    .,,,,,,,,,,,,,,,,.   .(@ /
shit lol, thanks				   (* /#.   .,,,,,,,,,,,,,,,,,,,,,,,,.  ,%(*(
- Bloops						 @%@&*   ,,,,,,,,,,,,.  .*///*.  ,,,,,,.  *& %     @%(%%@
also thanks to Mellowjacket,   ,*(#,  .,,,,,,,,,,../%@@@@@@@%%@@@&(..,,,,.  #%/,%##((//(##&/(/*
who did his best to keep the  / #.  .,,,,,,,,,,..&@@@%/#&@@%,,,*#@@@&..,,,.         ....     /& %
stupid-ass boss in place    /,%,  .,,,,,,,,,,, /@@@@@*,,,,**,*(/,,*/%%.    ..,,,,,,,,,,,,,,,.  ,%(&(
while i tried to take     (/@*  .,,,,,,,,,,,,..@@@@@#,,,(@&#/(@@@%.    .,,,,,,,,,,,,,,,,,,,,,,. .#
the level select picture &(&,  .,,,,,,,,,,,,,, %@@@&*,,,#@@@@@#,   .,,,,,,,,,..,,,,,,,,,,,,,,,,  ,
                        *@(.  ,,,,,,,,,,,,,,,,. %@@(,**,#@@(    ,,,,,,,,,,. .,,,,,,,,,,,,,,,,,,  .
also for helping with  #.#.  ,,,,,,,,,,,,,,,,,,,.,%@@@@&/.  .,,,,,,,,,,. .,,,,,,,,,,,,,,,,,,,,,  *
ideas for the level   # #,  ,,,,,,,,,,,,,,,,,,,,,,. /#.  .,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,. .%
name, goes to show   ((&,  ,,,,,,,,,,,,,,,,,,,,,,,,    ,,,,,,,,,,,. .,,,,,,,,.    .,,,,,,,,,,.  (@,*
that bees are indeed@/@*  ,,,,,,,,,,,,,,,,,,,,,,.        .,,,,,.                    ,,,,,,,,.  *&@&
cool, thanks man.  #(##. .,,,,,,,,,,,,,,,,,,,,.               .(####%%%%%&* .(%%%(  .,,,,,,.  /@*.
               ....@.@* .,,,,,,,,,,,,,,,,,,,        .,,,,,. ,#*,%&&&&&&&&%(&&&&&&&%.  ,,,,.  (&#
           # *, #####%  ,,,,,,,,,,,,,,,,,,   .,,.  ,,,,. .(&&&&&&&&&&&&&&&&&&&&&&&&&,  ,,  ,%*%
        ./.@/,.        .,,,,,,,,,,,,,,,,   .,,,,,.,,,  ,%&&#((#%&&&&&&&&&&&#.*#%(,,#&*    /& &
      *.#(.  .,,,,,,,  ,,,,,,,,,,,,,,,.   ,,,,,,,.  ,(&%,,#&@@@%(,/&&&&&&&(.&@@#*,, *&*  /*(*
/ .... %,  ,,,,,,,,,, .,,,,,,,,,,,,,.  ,#,      ./%&&&# %@@@%*....  #&&&&&,/@@*.#*,. /&, .#... /#&
/,..      ,,,,,,,,,,,.,,,,,,,,,,,,.   #&&&&&&&&&&&&&&&,/@@@,,(((*.,..%&&&@/,@@,,(.%@..(*   .,,,*(*( **
,/#&@@@, .,,,,,,,,,,,,,,,,,,,,,,,   ..  *#&&&&&&&&&&&&,/@@# ((( /@@, (&&&&&./@( *.     ..**///*.    *%.#.
@@@@@@@*  ,,,,,,,,,,,,,,,,,,,,,.  .*****,.  ,(&&&&&&&@(.&@# /((. *,  *@&&&&%..   .*#%&&&&&&&&&&&&&#,  ,%.#
@@%*,...   ,,,,,,,,,,,,,,,,,,.   ,**********,. *&&&&&&&./@@/.((/     *&&&&(   /%&&&&&&&&&&&&&&&&&&&&%  .#&%
@@@@@@@&#.  .,,,,,..           ,**************. (@&&&&&&*,&@%.,/((/,.%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(  /@ &
@@@@@@@@@@#.  .   .,(%%&&&&&&%. ,***********,  /&&&&&&&&&&*./#&#*  /&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#  *@ &
@@@@@@@@@@@@(  .#&&&&&&&&&&&&&&(  ,**********. /&&&&&&&%&&&&&&%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%. .# #
/&@@@@@@@@@/  (&&&&&&&&&&&&&&&&&&#. .,*******, ,&&&&%,   ,#&&&&&&&&&&((&&&&&&&&&&&&&&&&&&&&&&&&&&&&(  .#%(
, /@@@@@@@%  *@&&&&&&&%%&&&&&&&&&&&&(,   ..   /&&&&*        .,/#%%%%,   *%&&&&&&&&&&&&&&&&&&&&&&&*   *.,.
@/ .&@@@@@#  (&&&&&&&&&&(, ./%&&&&&&&&&&&%%&&&&&&&%.                       ,#&&&&&&&&&&&&&&&&#*      .# %
@@/ ,@@@@@%  *@&&&&&&&&&&&&&/  /&&&&&&&&&&&&&&&&&&&&/.                         ..,/((((/,..           / *
@@&, #@@@@@*  #&&&&&&&&&%/////. ,&&&&&&&&&&&&&&&&&&&&&&&&#                                           ,( (
@@@# *@@@@@@,  #&&&&&&&&&&&&&&%* #&&&&&&&&&&&&&&&&&&&(..%&&*                                   ...  /@*%##%
%@@& ,@@@@@@@/  *&&&&&&&&&&&&&@( %&&&&&&&&&&&&&&&&&&&/#/./%&&&%((/(#/           .,           ,%&&&, .,*(#& .,,,, /% .,
/@@@,.@@@@@@@@&,  *%&&&&&&&&&&&*#&&&&&&&&&&&&&&&&&&&&&&&&&(*.*#%&&&&&&&#////(%&&&&&&#(///(#&&&&&&*  ...        ..*(/#% .,(
.&@@/.&@@@@@@@@@&/   *#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#/*,,,,,,,,,,,,(&&&&&&&&&&&&&&&&(   ,,,,,,,. .,,,..     ,*(&.,( .
.%@@%(@@@@@@@@@@@@@/     .,*//(//*,.   .#&&&&&&&&&&&&&%%%&&&&&&&&&&&&&&&&&&&&&&&&#/*..              ..,,,,,.  ,,,,,,,,,,.    *##
 %@@@@@@@@@@@@@@@@&. #@@&,   ......,**,   /%&%(*.              ,*#%&&&&&&&&%/,  .,/#&@@@@@@@@@@@@@&%#/.   .,. .,,,,,,,,,,,,,.
 #@@@@@@@@@@@@@@@@/ %@@&,  **************.     .,,,,,,,,,,,,,,,..    ,(%*  ./&@@@@@@@@@@@@@@@@@@@@@@@@@@#      .,,,,,,,,,,,,,,,,
 #@@@#(@@@@@@@@@@&%@@@@#   ,*****,,****,              ..,,,,,,,,,,,,.   *%@@@@@@@@@@@@@@%/.       .,/#%%#. .*.   .,..     .,,,,,
%.(@@@,*@@@@@@@@@@@@@@@@%.        ,**,   .,,,,,,,,,,,,,,.   .,,,,,.  *&@@@&(#@@@@@@@@@&.  ,%&@@@@@@@@%(((%@@@@@@&#.  #&@&%,   ,,
@%.(@@&,/@@@@@@@@@@@@@(,%@@@@@@@(.     .,,,,,,,,,,,,,,,,,,,,.  .  ,%@@@@%    *@@@@@@@@*  %@@@@@@@@@@@@@@@@@@@@@@@@@@#.,&@@@@(  .
@@%.#@@&.(@@@@@@@@@@@@@/ /,*#@@@@@&,  ,,,,,,,,,,,,,,,,,.        ,@@@@@@&..#&@@@@#/(@@@#  ,&@@@@@@@@&%(/***/(%&@@@@@@@@&.(@@@@&.
@@@#.%@@% #@@@@@@@@@@@@, #@&/ (@@&.  ,,,,,,,,,,,,,,,,   ,#%&&&%#/,*&@@@@@@@@@#.    /@@@&*    ...  .,(#%%%%#(*.  /&@@@@@@(*@@@@@,
@@@@/,@@@(.&@@@@@@@@@@( .%@@@,.&@*  ,,,,,,,,,,,,,,,,   %@@@@@@@@@@@@@@@@@@@@/.,,/%@@@@@@@@@@@&@@@@@@@@@@@@@@@@@#  *@@@@@@@@@@@@@
@@@@&.(@@@,*@@@@@@@@@@&%*. /* (@#  .,,,,,,,,,,,,,,,,   %&#. .,/#&@@@@@@@@@@@@@@@@@@&%(//%@@@@@@@@@@@@@@@@@@@@@@@,  /@@@@@@@@@@@@
@@@@@(.&@@% #@@@@@@@@@@@@@%..&@@*  ,,,,,,,,,,,,,,,..       ..,.   *&@@@@@@@@@@@@@,      ,@@@@@#*.     .*#%%%%(,    #@@@@@@@@@@@@
@@@@@&.(@@@/.&@@@@@@@@@@@@@@/#@&.  ,,,,,,,,,,,,    ..,,,,,,,,,,,,.  .%@@@@@@@@@@@@@&%%&@@@@(. ./#%&@@@@@%(*,...,*#@@@@@@@@@@@@@@
@@@@@@*,@@@@./@@@@@@@@@@@@@@@@@&. .,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.  ,@@@@@@@@@@@@@@@@@@@, ,&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.....................,**//((#%%%.  ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,   %@@@@@@@@@@@@@@@@%  ,&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%(@]]

freeslot(
	"MT_THOKBOSS",
	"MT_THOKEYE",
	"S_THOKPART",
	"S_THOKBOSS_SPAWN",
	"S_THOKBOSS_HIT",
	"S_THOKBOSS_ATTACK",
	"S_THOKBOSS_ANTICIPATE",
	"S_THOKBOSS_BOUNCE1",
	"S_THOKBOSS_BOUNCE2",
	"S_THOKBOSS_BOUNCE3",
	"S_THOKBOSS_DIE",
	"S_THOKBOSS_NEUTRAL",
	"S_THOKBOSS_END"
)

states[S_THOKBOSS_SPAWN] = {SPR_THOK, A, 105, nil, 0, 0, S_THOKBOSS_NEUTRAL}
states[S_THOKBOSS_HIT] = {SPR_THOK, A, -1, A_Pain, 0, 0, S_NULL}
states[S_THOKBOSS_ATTACK] = {SPR_THOK, A, TICRATE, nil, 0, 0, S_THOKBOSS_NEUTRAL}
states[S_THOKBOSS_ANTICIPATE] = {SPR_THOK, A, -1, nil, 0, 0, S_NULL}
states[S_THOKBOSS_NEUTRAL] = {SPR_THOK, A, -1, nil, 0, 0, S_NULL}
states[S_THOKBOSS_END] = {SPR_THOK, A, -1, nil, 0, 0, S_NULL}
states[S_THOKBOSS_DIE] = {SPR_THOK, A, 70, nil, 0, 0, S_THOKBOSS_END}
states[S_THOKBOSS_BOUNCE1] = {SPR_THOK, A, 15, nil, 0, 0, S_THOKBOSS_BOUNCE2}
states[S_THOKBOSS_BOUNCE2] = {SPR_THOK, A, -1, nil, 0, 0, S_NULL}
states[S_THOKBOSS_BOUNCE3] = {SPR_THOK, A, -1, nil, 0, 0, S_NULL}
states[S_THOKPART] = {SPR_THOK, A|FF_FULLBRIGHT, -1, nil, 0, 0, S_NULL}


mobjinfo[MT_THOKBOSS] = {
	doomednum = 2563,
	spawnstate = S_THOKBOSS_SPAWN,
	spawnhealth	= 13,
	damage = 7,
	painsound = sfx_s3k4c,
	painstate = S_THOKBOSS_HIT,
	meleestate = S_THOKBOSS_ANTICIPATE,
	deathstate = S_THOKBOSS_DIE,
	raisestate = S_THOKBOSS_ATTACK,
	radius = 20*FRACUNIT,
	height = 40*FRACUNIT,
	flags = MF_SLIDEME
}

mobjinfo[MT_THOKEYE] = {
	spawnstate = S_THOKPART,
	radius = 20*FRACUNIT,
	height = 40*FRACUNIT,
	flags = MF_SCENERY|MF_NOCLIP|MF_NOGRAVITY|MF_NOCLIPHEIGHT
}


addHook("MobjThinker", function(mo)
	if mo and mo.valid
		if not ultimatemode
			if mo.state != S_THOKBOSS_END
			and mo.state != S_THOKBOSS_SPAWN
			and mo.state != S_THOKBOSS_ATTACK
			and mo.state != S_THOKBOSS_ANTICIPATE
				if not mo.pinch2
					mo.color = SKINCOLOR_LIME
				elseif mo.pinch2
					mo.color = SKINCOLOR_VAPOR
				end
			end
		else
			mo.color = SKINCOLOR_YELLOW
		end
		if not (mo.state == S_THOKBOSS_NEUTRAL
		or mo.state == S_THOKBOSS_BOUNCE3)
			if ultimatemode
				if mo.pinch2
					mo.reactiontime = 7
				else
					if mo.pinch
						mo.reactiontime = 10
					else
						mo.reactiontime = 15
					end
				end
			else
				if mo.pinch2
					mo.reactiontime = 10
				else
					if mo.pinch
						mo.reactiontime = 15
					else
						mo.reactiontime = 30
					end
				end
			end
		end
		if mo.state == S_THOKBOSS_SPAWN
			if mo.tics == states[mo.state].tics
				if ultimatemode
					S_StopMusic()
				end
			elseif mo.tics == 40
				P_SetObjectMomZ(mo, 13*FRACUNIT, false)
			elseif mo.tics == 35
				mo.destscale = FRACUNIT*4
				if not ultimatemode
					mo.color = SKINCOLOR_LIME
					mo.reactiontime = 30
					mo.anticipate = TICRATE
				else
					mo.reactiontime = 15
					mo.anticipate = 10
				end
				if ultimatemode
					S_ChangeMusic("TBOSS2", true, nil, 0, 0, 500, 0)
				end
			elseif mo.tics == 7
				P_StartQuake(50*FRACUNIT, (TICRATE/4))
				S_StartSound(mo,sfx_pstop)
				P_SpawnParaloop(mo.x, mo.y, mo.z + (mo.height/6), mo.radius*2, 16, MT_DUST, ANGLE_90, S_NULL, true)
			elseif mo.tics == 1
				mo.flags = $ | (MF_SHOOTABLE|MF_SPECIAL|MF_BOSS)
				for i = 1, 2
					local eyeangle = mo.angle + ANGLE_45
					if i == 2
						eyeangle = mo.angle - ANGLE_45
					end
					mo.eye = P_SpawnMobj(mo.x + (mo.radius/FRACUNIT)*cos(eyeangle), mo.y + (mo.radius/FRACUNIT)*sin(eyeangle), mo.z+(mo.height/2), MT_THOKEYE)
					mo.eye.scale = 0
					mo.eye.destscale = FRACUNIT
					mo.eye.target = mo
					mo.eye.eye = i
				end
			end
		end
		if mo.state == S_THOKBOSS_NEUTRAL
			mo.flags2 = $ & ~ MF2_FRET
			if not mo.bouncecounter
				if ultimatemode
					mo.bouncecounter = 2
				else
					mo.bouncecounter = 3
				end
			end
			if mo.pinch2
				if mo.pinchcounter > 1
					mo.state = S_THOKBOSS_ANTICIPATE
					mo.pinchcounter = $ - 1
				elseif mo.pinchcounter == 1
					mo.pinchcounter = 0
				end
			end
			if mo.reactiontime
				mo.reactiontime = $ - 1
			else
				mo.state = S_THOKBOSS_BOUNCE1
			end
		end
		if mo.state == S_THOKBOSS_BOUNCE1
			if mo.tics == states[mo.state].tics
				if ultimatemode
					mo.state = S_THOKBOSS_BOUNCE2
				end
				P_LookForPlayers(mo, 0, true, false)
				if mo.target and mo.target.valid
					local ang = R_PointToAngle2(mo.x, mo.y, mo.target.x, mo.target.y)
					if mo.pinch2
						local dist = R_PointToDist2(mo.x, mo.y, mo.target.x, mo.target.y)
						mo.angle = ang
						mo.dist = dist/26
						mo.state = S_THOKBOSS_BOUNCE2
					else
						mo.angle = ang + FixedAngle(P_RandomRange(-45, 45)*FRACUNIT)
					end
				end
			end
		end
		if mo.state == S_THOKBOSS_BOUNCE2
			if not mo.jumped
				mo.momz = 26*FRACUNIT
				if mo.pinch2
					P_InstaThrust(mo, mo.angle, mo.dist)
				else
					P_InstaThrust(mo, mo.angle, 20*FRACUNIT)
				end
				mo.jumped = true
			else
				if P_IsObjectOnGround(mo)
					mo.jumped = false
					mo.state = S_THOKBOSS_BOUNCE3
				end
			end
		else
			mo.jumped = false
		end
		if mo.state == S_THOKBOSS_BOUNCE3
			if not mo.bounced
				mo.momx = 0
				mo.momy = 0
				P_StartQuake(50*FRACUNIT, (TICRATE/4))
				S_StartSound(mo,sfx_pstop)
				P_SpawnParaloop(mo.x, mo.y, mo.z + (mo.height/8), mo.radius*2, 16, MT_DUST, ANGLE_90, S_NULL, true)
				mo.bounced = true
			end
			if mo.bouncecounter > 1
				mo.state = S_THOKBOSS_NEUTRAL
				mo.bouncecounter = $ - 1
			elseif mo.bouncecounter == 1
				if mo.reactiontime
					mo.reactiontime = $ - 1
				else
					mo.bouncecounter = 0
					mo.state = S_THOKBOSS_ANTICIPATE
				end
			end
		else
			mo.bounced = false
		end
		if mo.state == S_THOKBOSS_ANTICIPATE
			mo.flags2 = $ & ~ MF2_FRET
			if mo.anticipate % 2 == 0
				mo.color = SKINCOLOR_CRIMSON
			else
				mo.color = SKINCOLOR_RED
			end
			if not ultimatemode
				if mo.anticipate
					if mo.pinch2
						if not mo.pinchcounter
							mo.pinchcounter = 3
						end
						if mo.anticipate == TICRATE
							mo.anticipate = 20
						end
					end
					if mo.pinch
						if mo.anticipate == TICRATE
							mo.anticipate = 14
						end
					end
					mo.anticipate = $ - 1
				else
					mo.state = S_THOKBOSS_ATTACK
					mo.anticipate = TICRATE
				end
			else
				if mo.anticipate
					if mo.pinch2
						if not mo.pinchcounter
							mo.pinchcounter = 4
						end
					end
					mo.anticipate = $ - 1
				else
					mo.state = S_THOKBOSS_ATTACK
					mo.anticipate = 10
				end
			end
			if mo.anticipate % 10 == 0
				S_StartSound(mo, sfx_spin)
				P_SpawnParaloop(mo.x, mo.y, mo.z + 20*FRACUNIT, mo.radius*3, 16, MT_THOK, (leveltime/3)*(ANGLE_22h), S_NULL, false)
				P_SpawnParaloop(mo.x, mo.y, mo.z + 20*FRACUNIT, mo.radius*3, 16, MT_THOK, (leveltime/2)*(ANGLE_22h), S_NULL, true)
			end
		end
		if mo.state == S_THOKBOSS_ATTACK
			if mo.tics == states[mo.state].tics
				S_StartSound(mo, sfx_thok)
				if not mo.pinch2
					if mo.pinch
						P_InstaThrust(mo, mo.angle, 140*FRACUNIT)
						mo.tics = 10
					else
						P_InstaThrust(mo, mo.angle, 80*FRACUNIT)
					end
				else
					P_InstaThrust(mo, mo.angle, 100*FRACUNIT)
					mo.tics = 7
				end
				mo.momz = 5*FRACUNIT
			end
		end
		if mo.state == S_THOKBOSS_HIT
			if P_IsObjectOnGround(mo)
				if not mo.paintimer
					mo.paintimer = TICRATE
				elseif mo.paintimer == TICRATE
					if ultimatemode
						mo.bouncecounter = 2
					else
						mo.bouncecounter = 3
					end
					mo.paintimer = $ - 1
					P_SpawnParaloop(mo.x, mo.y, mo.z + (mo.height/2), mo.radius*3, 16, MT_THOK, ANGLE_90, S_NULL, true)
					if mo.health == 1
						if not mo.pinch2
							if not mo.playerhurt
								mo.pinch2 = true
								mo.paintimer = TICRATE*3
								if ultimatemode
									S_ChangeMusic("TBOSS3", true, nil, 0, 0, 0, 0)
								end
								mo.health = 12
								mo.pinch = false
							else
								P_KillMobj(mo)
								for p in players.iterate
									P_AddPlayerScore(p, 1000)
								end
							end
						end
					end
					if mo.pinch
						mo.paintimer = 10
					end
				elseif mo.paintimer == 1
					mo.state = S_THOKBOSS_ANTICIPATE
					if mo.info.damage == mo.health
					and not mo.pinch
					and not mo.pinch2
						mo.pinch = true
						for i = 1, 16 do
							P_SpawnParaloop(mo.x, mo.y, mo.z + (mo.height/2), mo.radius*3, 16, MT_MSGATHER, i*(ANGLE_22h), S_NULL, false)
						end
						S_StartSound(mo, sfx_buzz2)
					end
					mo.paintimer = TICRATE
				else
					mo.paintimer = $ - 1
					if mo.pinch2
					and mo.health == 12
					and leveltime % 3 == 0
						P_SpawnParaloop(mo.x, mo.y, mo.z + 20*FRACUNIT, mo.radius*3, 16, MT_THOK, (leveltime/2)*(ANGLE_22h), S_NULL, true)
					end
				end
			end
		end
		if mo.state == S_THOKBOSS_DIE
			for p in players.iterate
				if leveltime % 5 == 0
					P_SpawnParaloop(mo.x, mo.y, P_RandomRange((mo.z/FRACUNIT), ((mo.z+mo.height)/FRACUNIT))*FRACUNIT, mo.radius*3, 16, MT_BOSSEXPLODE, (leveltime/3)*(ANGLE_22h), S_NULL, true)
					P_SpawnParaloop(mo.x, mo.y, P_RandomRange((mo.z/FRACUNIT), ((mo.z+mo.height)/FRACUNIT))*FRACUNIT, mo.radius*4, 16, MT_DUST, (leveltime/2)*(ANGLE_22h), S_NULL, true)
					P_SpawnParaloop(mo.x, mo.y, P_RandomRange((mo.z/FRACUNIT), ((mo.z+mo.height)/FRACUNIT))*FRACUNIT, mo.radius*2, 16, MT_BOSSEXPLODE, (leveltime/4)*(ANGLE_22h), S_NULL, false)
					S_StartSound(mo, sfx_pop)
					if mo.pinch2
						P_AddPlayerScore(p, 1000)
					end
				end
			end
		end
		if mo.state == S_THOKBOSS_END
			mo.color = SKINCOLOR_RED
			mo.destscale = 0
			if not mo.deadtimer
				mo.deadtimer = TICRATE*2
			elseif mo.deadtimer == 1
				G_ExitLevel()
			else
				mo.deadtimer = $ - 1
			end
		end
	end
end, MT_THOKBOSS)

addHook("ShouldDamage", function(mo, stupid)
	if mo and mo.valid
		if mo.state == S_THOKBOSS_ATTACK
		or mo.state == S_THOKBOSS_ANTICIPATE
			P_DamageMobj(stupid, mo)
			if stupid.player and stupid.player.valid
			and stupid.player.playerstate == PST_LIVE
				P_Thrust(stupid, R_PointToAngle2(mo.x, mo.y, stupid.x, stupid.y), 20*FRACUNIT)
			end
			return false
		end
	end
end, MT_THOKBOSS)

addHook("MobjThinker", function(mo)
	if mo and mo.valid
		local thok = mo.target
		if thok.health
			mo.angle = thok.angle
			local function eyeangle(mo, ang)
				if mo.eye == 1
					return thok.angle + ang
				elseif mo.eye == 2
					return thok.angle - ang
				end
			end
			P_TeleportMove(mo, thok.x + (thok.radius/FRACUNIT)*cos(eyeangle(mo, ANGLE_45)), thok.y + (thok.radius/FRACUNIT)*sin(eyeangle(mo, ANGLE_45)), thok.z+(thok.height/2))
		else
			if thok.state == S_THOKBOSS_DIE
				if mo.flags & MF_NOGRAVITY
					mo.flags = $ & ~ (MF_NOGRAVITY|MF_NOCLIPHEIGHT)
				end
			elseif thok.state == S_THOKBOSS_END
				mo.destscale = 0
			end
		end
		if mo.state != S_THOKBOSS_DIE
			if not thok.pinch2
				if not thok.pinch
				and thok.health
					if thok.state == S_THOKBOSS_NEUTRAL
						mo.color = SKINCOLOR_MAGENTA
					elseif thok.state == S_THOKBOSS_HIT
						mo.color = SKINCOLOR_AQUA
					elseif thok.state == S_THOKBOSS_ANTICIPATE
						mo.color = SKINCOLOR_RED
					end
				else
					mo.color = SKINCOLOR_CRIMSON
				end
			else
				mo.color = SKINCOLOR_RED
			end
		else
			mo.color = SKINCOLOR_BLACK
		end
	end
end, MT_THOKEYE)

addHook("MobjDamage", function(stupid, thok)
	if stupid and stupid.valid
	and stupid.player and stupid.player.valid
		if thok and thok.valid
		and thok.type == MT_THOKBOSS
			thok.playerhurt = true
		end
	end
end, MT_PLAYER)