addHook("MobjThinker",function(minecart)
if not minecart or not minecart.valid or not minecart.target
return end
local mt = minecart.target
if ((minecart.target) and (minecart.target.valid))
and ActiveMint(mt)
minecart.angle = mt.angle
local p = minecart.target.player local mint = p.minttable
if p.playerstate==PST_DEAD return end

if (p.cmd.buttons&BT_CUSTOM3)
and (p.powers[pw_carry]==CR_MINECART)
p.powers[pw_carry] = CR_NONE
minecart.momx,minecart.momy = minecart.momx,minecart.momy
p.pflags = $|PF_JUMPED &~PF_THOKKED
P_DoJump(p,true)
minecart.target = nil
P_InstaThrust(mt, mt.angle, 20*FU)
end;end;end,MT_MINECART)

addHook("MobjThinker",function(light)
if light and light.valid
P_SetObjectMomZ(light,0*FU,false)
end
end,MT_MINTLIGHTNING)
addHook("MobjThinker",function(atk)
if atk and atk.valid
P_SetObjectMomZ(atk,0*FU,false)
end
end,MT_MINTATK)

addHook("MobjThinker",function(fang)
if fang and fang.valid and (fang.state==S_FANG_FIRESTART1 or fang.state==S_FANG_FIRESTART2)
and fang.target and ActiveMint(fang.target)
fang.state = S_FANG_LOBSHOT0
end
end,MT_FANG)

addHook("MobjThinker",function(s,so) local xy = 100*FU
if s and s.health
PerfectSpinTrail(s, 15,AST_ADD,s.scale/10,SKINCOLOR_PEPPER)
searchBlockmap("objects", function(m, so) local SCALE = max(1<<15, max(so.scale, s.scale))
if so and so.health and (so.flags&MF_ENEMY|MF_BOSS) and not (so.type==MT_PLAYER)
P_HomingAttack(s, so)
P_InstaThrust(s, R_PointToAngle2(s.x, s.y, so.x, so.y), 20*FU)
P_SetObjectMomZ(s, FixedMul(FixedMul(R_PointToDist2(s.x, s.y, so.x, so.y), sin(R_PointToAngle2(0, (s.z - (s.height/2)), P_AproxDistance(s.x - so.x, s.y - so.y), so.z))) - s.momz, FU/2), true)
end
if not (FixedHypot(FixedHypot(so.x-s.x, so.y-s.y), so.z-s.z) > 75*SCALE)
S_StartSound(s, sfx_mboom)
S_StartSound(s, sfx_kc3b)
S_StartSound(s, sfx_bkpoof)
S_StartSound(s, sfx_s3k4e)
for a=1,64 do
local explode = P_SpawnMobj(s.x, s.y, s.z, MT_BOSSEXPLODE)
explode.momx = P_RandomRange(-32768, 32767) * 64
explode.momy = P_RandomRange(-32768, 32767) * 64
explode.momz = P_RandomFixed() * 32
end
P_DamageMobj(so,s)
P_KillMobj(s,so,so)
P_StartQuake(50<<16, 10)
if (so.health >= 3)
so.health = $-1
end
end
end, s, s.x-xy,s.x+xy, s.y-xy, s.y+xy)
end
end,MT_MBOMB)

addHook("MobjThinker",function(amy)
local atr = amy.target
if not (amy and amy.valid and amy.health and atr and atr.health and atr.player and atr.player.minttable and ActiveMint(atr)) return end
local SCALE = max(1<<15, max(amy.scale, atr.scale))
if (amy.state == S_ROSY_WALK or amy.state == S_ROSY_JUMP)
and not (FixedHypot(FixedHypot(amy.x-atr.x, amy.y-atr.y), amy.z-atr.z) > 1000*SCALE)
and not (amy.hits and amy.hits >= 30)
P_InstaThrust(amy, R_PointToAngle2(amy.x, amy.y, atr.x, atr.y), 50*FU)
PerfectSpinTrail(amy, 15,AST_ADD,nil,SKINCOLOR_PURPLE)
if amy.state == S_ROSY_JUMP
P_SetObjectMomZ(amy, FixedMul(FixedMul(R_PointToDist2(amy.x, amy.y, atr.x, atr.y), sin(R_PointToAngle2(0, (amy.z - (amy.height/2)), P_AproxDistance(amy.x - atr.x, amy.y - atr.y), atr.z))) - amy.momz, FU/2), true)
end;end
if (amy.state == S_ROSY_HUG or amy.state == S_ROSY_JUMP)
and not (FixedHypot(FixedHypot(amy.x-atr.x, amy.y-atr.y), amy.z-atr.z) > 60*SCALE)
and not (atr.state==S_PLAY_PAIN)
and not (atr.player.minttable.homing)
and not (atr.player.minttable.burststomp)
and not (amy.hits and amy.hits >= 30)
or (amy.state == S_ROSY_WALK) and P_IsObjectOnGround(atr)
and not (FixedHypot(FixedHypot(amy.x-atr.x, amy.y-atr.y), amy.z-atr.z) > 60*SCALE)
and not (amy.hits and amy.hits >= 30)
if (atr.player.pflags&PF_SPINNING) or (atr.state==S_PLAY_SKID)
S_StartSound(atr, sfx_s3k49)
P_InstaThrust(atr, atr.angle, -20*FU)
P_SetObjectMomZ(atr, 8*FU)
atr.player.minttable.realcharge = 0
atr.state = S_PLAY_SPRING
atr.player.pflags = $|PF_JUMPED &~PF_THOKKED
atr.player.pflags = $&~PF_SPINNING
else
amy.state = S_ROSY_PAIN
Mint.CombatSFX(atr.player,atr,atr.player.minttable)
P_DoMintEffect4(atr)
S_StopSoundByID(amy, sfx_cdpcm6)
S_StopSoundByID(amy, sfx_cdpcm7)
P_InstaThrust(amy, R_PointToAngle2(amy.x,amy.y,atr.x,atr.y), -15<<16)
P_DamageMobj(atr, amy, amy)
P_SetObjectMomZ(amy,5<<16)
if atr.health
P_DoPlayerPain(atr.player)
end;end;end
if (amy.state == S_ROSY_UNHAPPY) and not (amy.hits and amy.hits >= 30)
S_StartSound(amy, sfx_zoom)
amy.state = S_ROSY_WALK
end

if (atr.player.minttable.homing or atr.player.minttable.burststomp)
if not (FixedHypot(FixedHypot(amy.x-atr.x, amy.y-atr.y), amy.z-atr.z) > 60*SCALE)
P_SetObjectMomZ(amy,5<<16)
P_InstaThrust(amy, R_PointToAngle2(amy.x,amy.y,atr.x,atr.y), -15<<16)
S_StopSoundByID(amy, sfx_cdpcm6)
Mint.CombatSFX(atr.player,amy,atr.player.minttable)
P_DoMintEffect4(amy)
P_SetObjectMomZ(atr, 15*FU)
P_InstaThrust(atr,atr.angle,0*FU)
atr.player.minttable.homing = 0
atr.player.minttable.zoomout = 1
atr.player.minttable.a = 0
atr.player.minttable.twirl = 27
atr.player.minttable.trick = 27
atr.player.minttable.burststomp = false
atr.player.minttable.sbs = false
atr.player.minttable.combo = 0
atr.player.pflags = $|PF_JUMPED &~PF_THOKKED
atr.player.powers[pw_strong] = $&~ STR_SPRING
atr.player.powers[pw_strong] = $&~ STR_FLOOR
atr.player.powers[pw_strong] = $&~ STR_BUST
if (leveltime%2==0)
for i = 1,30
local dust = P_SpawnMobj(amy.x, amy.y, amy.z, MT_WATERDROP)
dust.renderflags = RF_NOCOLORMAPS
dust.flags = $|MF_NOBLOCKMAP|MF_NOCLIPTHING
dust.blendmode = AST_ADD
dust.colorized = true
dust.angle = ANG60*i
dust.color = SKINCOLOR_CRIMSON -- b l o o d
dust.momx = P_RandomRange(-12768, 12767) * 5
dust.momy = P_RandomRange(-12768, 12767) * 4
dust.momz = P_RandomRange(-12768, 12767) * 3
P_SetObjectMomZ(dust, 7*FU)
end
end
if (leveltime%4==0) and not (amy.hits and amy.hits >= 30)
S_StartSound(amy, sfx_s1c6)
S_StartSound(amy, sfx_cdpcm7)
for i = 1,6
local dust = P_SpawnMobj(amy.x, amy.y, amy.z, MT_FLINGRING)
dust.angle = ANG60*i
dust.blendmode = AST_ADD
dust.fuse,dust.tics = 200,40
P_InstaThrust(dust, dust.angle, 2*FU)
P_SetObjectMomZ(dust, 5*FU)
end;end
if not (amy.state == S_ROSY_PAIN) and not (amy.hits and amy.hits >= 30)
amy.state = S_ROSY_PAIN
end
if not amy.hits
amy.hits = 1
else amy.hits = $+1
end
if (amy.hits >= 30)
S_StartSound(amy, sfx_mkick)
S_StartSoundAtVolume(amy, sfx_mtelep, 255)
P_StartQuake(20*FU, 3*TICRATE*1/2)
P_FlashPal(atr.player, PAL_NUKE, 4)
end
end
end
end,MT_ROSY)

addHook("MobjThinker",function(amy)
if amy and amy.hits and (amy.hits >= 30) and not (amy.state == S_ROSY_UNHAPPY)
amy.state = S_ROSY_UNHAPPY
P_InstaThrust(amy,amy.angle, 0*FU)
end;end,MT_ROSY)

addHook("MobjThinker",function(t,i,so)
if (so and t and t.valid and t.target and t.target.type == MT_THOK and t.target.mintshyperbeam)
local i = (t.target)
local SCALE = max(1<<15, max(so.scale, t.scale))
if not (FixedHypot(FixedHypot(so.x-s.x, so.y-s.y), so.z-s.z) > 75*SCALE)
if not t.gettingcookedbymintbeam
S_StartSound(t, sfx_mbstr2)
t.gettingcookedbymintbeam = 1
t.hits = 0
else
t.gettingcookedbymintbeam = $+1
t.state = S_ROSY_PAIN
if t.gettingcookedbymintbeam >= 78
S_StartSound(t, sfx_mboom)
S_StartSound(t, sfx_kc3b)
S_StartSound(t, sfx_bkpoof)
S_StartSound(t, sfx_s3k4e)
P_StartQuake(30*FU, 3*TICRATE*1/2)
for a=1,64 do
local explode = P_SpawnMobj(t.x, t.y, t.z, MT_BOSSEXPLODE)
explode.momx = P_RandomRange(-32768, 32767) * 64
explode.momy = P_RandomRange(-32768, 32767) * 64
explode.momz = P_RandomFixed() * 32
end
P_KillMobj(t, i, so, DMG_NUKE)
t.gettingcookedbymintbeam = 39
if not t.health and so and so.player
P_FlashPal(so.player, PAL_NUKE, 3)
so.player.powers[pw_shield] = 0
//so.player.minttable.b = 0
end;end;end;end;end;end,MT_ROSY)

addHook("MobjThinker", function(s) if not s.valid return end
local t = s.target
if s and t and ActiveMint(t)
local tp = t.player
if tp //and (s.tics >= 15)
P_RemoveMobj(s, t)
tp.powers[pw_invulnerability] = tp.powers[pw_invulnerability]+invulntics+1
//S_ChangeMusic("_MINV", true, tp)
end;end;end,MT_INVULN_ICON)

addHook("MobjThinker", function(s) if not s.valid return end
local t = s.target
if s and t and ActiveMint(t)
local tp = t.player
if tp //and (s.tics >= 15)
P_RemoveMobj(s, t)
tp.powers[pw_sneakers] = tp.powers[pw_sneakers]+sneakertics+1
//S_ChangeMusic("MSHOES", true, tp)
end;end;end,MT_SNEAKERS_ICON)

//Burst Stomp training
addHook("TouchSpecial", function(spst,atr)
if spst and spst.valid and atr and atr.health and ActiveMint(atr) and atr.player and atr.player.minttable
if atr.player.minttable.burststomp
and not (spst.z > atr.z + atr.height or atr.z > spst.z + spst.height)
Mint.CombatSFX(atr.player,spst,atr.player.minttable)
P_DoMintEffect4(spst)
P_SetObjectMomZ(atr, 15*FU)
atr.player.minttable.burststomp = false
atr.player.minttable.sbs = false
atr.player.minttable.combo = 0
atr.player.pflags = $|PF_JUMPED &~PF_THOKKED
spst.state = S_STARPOST_STARTSPIN
atr.player.minttable.twirl = 27
atr.player.minttable.trick = 27
atr.player.powers[pw_strong] = $&~ STR_SPRING
atr.player.powers[pw_strong] = $&~ STR_FLOOR
atr.player.powers[pw_strong] = $&~ STR_BUST
if atr.player.minttable.a
P_InstaThrust(atr,atr.angle,0*FU)
end
end
end
end,MT_STARPOST)

//Mint VS 2011x
addHook("TouchSpecial", function(exe,atr)
if not (activeexe) return end
if exe and exe.valid and (exe.state==S_EXEGOTCHA or exe.state==S_EXELIE or exe.state==S_EXEPAIN)
and atr and atr.health and ActiveMint(atr) and atr.player and atr.player.minttable
if atr.player.minttable.burststomp
and not (exe.z > atr.z + atr.height or atr.z > exe.z + exe.height)
Mint.CombatSFX(atr.player,exe,atr.player.minttable)
P_DoMintEffect4(exe)
P_SetObjectMomZ(atr, 15*FU)
atr.player.minttable.burststomp = false
atr.player.minttable.sbs = false
atr.player.minttable.combo = 0
atr.player.pflags = $|PF_JUMPED &~PF_THOKKED
exe.state = S_EXEPAIN
atr.player.minttable.twirl = 27
atr.player.minttable.trick = 27
atr.player.powers[pw_strong] = $&~ STR_SPRING
atr.player.powers[pw_strong] = $&~ STR_FLOOR
atr.player.powers[pw_strong] = $&~ STR_BUST
P_InstaThrust(exe,exe.angle,-3*FU)
P_SetObjectMomZ(exe,12*FU,false)
//P_MoveOrigin(exe,exe.x,exe.y,exe.z+(12*FU*P_MobjFlip(exe)))
P_StartQuake(20*FU, 1*TICRATE*1/2)
exe.angle = atr.angle
exe.flashing = 3*TICRATE
exe.target = nil
if (leveltime%2==0)
for i = 1,30
local dust = P_SpawnMobj(exe.x, exe.y, exe.z, MT_WATERDROP)
dust.renderflags = RF_NOCOLORMAPS
dust.flags = $|MF_NOBLOCKMAP|MF_NOCLIPTHING
dust.blendmode = AST_ADD
dust.colorized = true
dust.angle = ANG60*i
dust.color = SKINCOLOR_CRIMSON -- b l o o d
dust.momx = P_RandomRange(-12768, 12767) * 5
dust.momy = P_RandomRange(-12768, 12767) * 4
dust.momz = P_RandomRange(-12768, 12767) * 3
P_SetObjectMomZ(dust, 7*FU)
end
end
if exe.stuns
exe.stuns = $+1
end
if atr.player.minttable.a
P_InstaThrust(atr,atr.angle,0*FU)
end
end
end
end,MT_SONICEXE)