//Q: Why the hell does all the code look like SA/X-Sonic's
//A: MONTHS of work on XS Tweaks.

local Mint = Mint

Mint.Story = function(p,s)
local map = mapheaderinfo[gamemap]
local chapter1
local chapter2
local chapter3
local chapter4
local chapter5

if (gamemap==03 and map.lvlttl == "Greenflower")
chapter1 = {
[1] = {
name = "eggman",
portrait = {"EG_CONT"},
text = "Hm?|pau08 Another one of that hedgehog's |esc\x85|wavridiculous|esc\x80|rst friends?",
delay = 2*TICRATE,
next = 2
},
[2] = {
name = "mint",
portrait = {"MN_SHOCK"},
text = "...",
delay = 1*TICRATE,
next = 3
},
[3] = {
name = "mint",
portrait = {"MN_CONC"},
text = "Excuse me?",
delay = 2*TICRATE,
next = 4
},
[4] = {
name = "eggman",
portrait = {"EG_ANGRY"},
text = "No matter.|pau08 Leave,|pau08 you weakling.",
delay = 1*TICRATE,
next = 5
},
[5] = {
name = "mint",
portrait = {"MN_BORE"},
text = "That's it.",
delay = 1*TICRATE,
next = 0
},
}
MintStory:DisplayBox(p, chapter1, true)
end;end

Mint.Vocals = function(p,s,mint, sfx,volume)
local mint = p.minttable
local sv = p.realmo.valid
if s and sv and ActiveMint(s) and mint and p.mintvoice==2 and not mint.vocalcd
if (s.eflags&MFE_UNDERWATER)
and not (p.powers[pw_shield]&SH_PROTECTWATER)
S_StartSound(s, sfx_s3k7d)
for a=1,8 do
local bub = P_SpawnMobj(s.x,s.y,s.z, MT_MEDIUMBUBBLE)
bub.angle = p.drawangle
P_InstaThrust(bub, bub.angle, 3*FU)
P_SetObjectMomZ(bub, 0*FU)
end
if not (p==consoleplayer and p.mintvoice)
volume = 2
end
elseif volume==nil
S_StartSound(s,sfx)
mint.vocalcd = 60
else
S_StartSoundAtVolume(s,sfx,volume)
mint.vocalcd = 60
end;end;end

Mint.BattleVoice = function(p,s,mint)
local battlevoice
battlevoice = {sfx_mnvocb,sfx_mnvoc7,sfx_mnvocf,sfx_mnvocg,sfx_mnvoco}
local mrng = P_RandomRange(1, #battlevoice)
local battlevoice2 = battlevoice[mrng]
battlevoice2 = (mrng==#battlevoice) and battlevoice[1] or battlevoice[mrng+1]
Mint.Vocals(p,s,mint, battlevoice2)
end

Mint.WinnerVoice = function(p,s,mint)
local winnervoice
winnervoice = {sfx_mnvoc4,sfx_mnvoc5,sfx_mnvoc6,sfx_mnvoch}
local mrng = P_RandomRange(1, #winnervoice)
local winnervoice2 = winnervoice[mrng]
winnervoice2 = (mrng==#winnervoice) and winnervoice[1] or winnervoice[mrng+1]
Mint.Vocals(p,s,mint, winnervoice2)
end

Mint.AttackVoice = function(p,s,mint)
local attackvoice
attackvoice = {sfx_mnvocr,sfx_mnvocs}
local mrng = P_RandomRange(1, #attackvoice)
local attackvoice2 = attackvoice[mrng]
attackvoice2 = (mrng==#attackvoice) and attackvoice[1] or attackvoice[mrng+1]
Mint.Vocals(p,s,mint, attackvoice2, 255)
end

Mint.CombatSFX = function(p,s,mint)
local cbfx
cbfx = {sfx_mkick2,sfx_mkick3,sfx_mkick4,sfx_mkick5,sfx_mkick6}
local mrng = P_RandomRange(1, #cbfx)
local cbfx2 = cbfx[mrng]
cbfx2 = (mrng==#cbfx) and cbfx[1] or cbfx[mrng+1]
S_StartSoundAtVolume(s, cbfx2, 255)
if (leveltime%3==0)
S_StartSoundAtVolume(s, sfx_mtelep, 255)
end;end

Mint.STFU = function(p,s) local mint = p.minttable
S_StopSoundByID(s, sfx_mnvoc1)S_StopSoundByID(s, sfx_mnvoc2)
S_StopSoundByID(s, sfx_mnvoc3)S_StopSoundByID(s, sfx_mnvoc4)
S_StopSoundByID(s, sfx_mnvoc5)S_StopSoundByID(s, sfx_mnvoc6)
S_StopSoundByID(s, sfx_mnvoc7)S_StopSoundByID(s, sfx_mnvoc8)
S_StopSoundByID(s, sfx_mnvoc9)S_StopSoundByID(s, sfx_mnvoc0)
S_StopSoundByID(s, sfx_mnvoca)S_StopSoundByID(s, sfx_mnvocb)
S_StopSoundByID(s, sfx_mnvocc)S_StopSoundByID(s, sfx_mnvocd)
S_StopSoundByID(s, sfx_mnvoce)S_StopSoundByID(s, sfx_mnvocf)
S_StopSoundByID(s, sfx_mnvocg)S_StopSoundByID(s, sfx_mnvoch)
S_StopSoundByID(s, sfx_mnvoci)S_StopSoundByID(s, sfx_mnvocj)
S_StopSoundByID(s, sfx_mnvock)S_StopSoundByID(s, sfx_mnvocl)
S_StopSoundByID(s, sfx_mnvocm)S_StopSoundByID(s, sfx_mnvocn)
S_StopSoundByID(s, sfx_mnvoco)S_StopSoundByID(s, sfx_mnvocp)
S_StopSoundByID(s, sfx_mnvocq)
mint.vocalcd = 0
end

Mint.AirDash = function(p,s,mint) local mint = p.minttable
S_StopSoundByID(s,sfx_mspnd)
S_StopSoundByID(s,sfx_mbstop)
S_StartSound(s,sfx_thok)
p.pflags = $1&~PF_SPINNING
p.pflags = $1&~PF_JUMPED
P_DoMintEffect(p,s.color)
mint.spinlaunchcharge = false
mint.realcharge = 0
p.momangle2 = R_PointToAngle2(0,0,s.momx,s.momy)
p.drawangle = s.angle
s.state = S_PLAY_MINTDASH
mint.spintrail = 10
s.spritexscale = FU+28500
s.spriteyscale = FU-21000
mint.stretch = {timer = 8}
if mint.speedup and not mint.burststomp
P_InstaThrust(s, s.angle, 70*FU)
else P_InstaThrust(s, s.angle, 50*FU)
end;end

local speedup = {
"MSHOES",
"MSHOEB",
"MSHOEC"
}
Mint.Music = function(p,s,mint) local mint = p.minttable
if mint
if mint.speedup and not mint.nofear and not mint.gotthepower and not (maptol&TOL_NIGHTS)
S_ChangeMusic(speedup[P_RandomRange(1,3)], true, p)
end
mint.gotthepower = true
end
if mint.nofear and not mint.speedup and not (maptol&TOL_NIGHTS)
S_ChangeMusic("MINV", true, p)
end
if mint.nofear and mint.speedup and not (maptol&TOL_NIGHTS)
S_ChangeMusic("MNTS", true, p)
mint.gotthepower = false
end;end

Mint.LockOn = function(p,s,mint) local mint = p.minttable
local xy = 85*FU
searchBlockmap("objects", function(m, t) local tp = t.player
if mint and (t and t.valid and t.health and t.flags & MF_ENEMY or t.flags & MF_BOSS)
or tp and (not tp.ctfteam==p.ctfteam or t.flags2 & MF2_FRET or t == s)
and not t.type==MT_ROSY
//and not (t.hits >= 30)
if mint and mint.shield==SH_ATTRACT and (s.state==S_PLAY_MINTDASH)
or mint and mint.homing //and (mint.homing < 40)
mint.target,mint.target2 = t,t
if not P_IsObjectOnGround(s)
P_SpawnLockOn(p, t, S_LOCKON1)
end
if mint.b//==1
and not mint.homing
S_StartSoundAtVolume(s,sfx_mthok,141)
s.state = S_PLAY_ROLL
mint.homing = 39
end
if mint.homing and (mint.homing < 40)
p.powers[pw_nocontrol] = 1
P_HomingAttack(s, t)
P_InstaThrust(s, R_PointToAngle2(s.x, s.y, mint.target.x, mint.target.y), R_PointToDist2(s.x, s.y, mint.target.x, mint.target.y)/3)
P_SetObjectMomZ(s, FixedMul(FixedMul(R_PointToDist2(s.x, s.y, mint.target.x, mint.target.y)/2, sin(R_PointToAngle2(0, (s.z - (s.height/3)), P_AproxDistance(s.x - mint.target.x, s.y - mint.target.y), mint.target.z))) - s.momz, FU), true)
s.state = S_PLAY_ROLL
s.angle = R_PointToAngle2(s.x, s.y, t.x, t.y)
mint.spintrail = 1
mint.zoomout = 2
end
end
end
end, s, s.x-xy,s.x+xy, s.y-xy, s.y+xy)
end

Mint.Gift = function(p,s,mint) local xy = 200*FU if p.bot return end
searchBlockmap("objects", function(m, t) local tp = t.player
local mint = p.minttable

if ActiveMint(s) and p and p.valid and (p.rings >=5) and mint.c3==1
and t and t.valid and tp and tp.ctfteam==p.ctfteam
and not mint.giftcd
and not p.spectator
mint.giftcd = 90
S_StartSoundAtVolume(t,sfx_mgift,255)
P_GivePlayerRings(p, -5)

if mint.speedup or (XSon and IsXSonic(t) and mint.speedup)
and not (mint.shield==SH_ATTRACT)
local st = P_SpawnMobjFromMobj(t, 0,0,t.height*1, MT_SNEAKERS_ICON)
st.tracer,st.target = t,t
for i = 1, 6
local dust = P_SpawnMobj(st.x, st.y, st.z, MT_SPINDUST)
dust.angle = ANG60*i
P_InstaThrust(dust, dust.angle, 15*FU)
P_SetObjectMomZ(dust, 1*FU)
dust.renderflags = RF_PAPERSPRITE
p.powers[pw_sneakers] = 0
COM_BufInsertText(p, "tunes -default")
P_RestoreMusic(p)
end;end
if XSon and IsXSonic(t) and (mint.shield==SH_ATTRACT)
p.powers[pw_shield] = 0
local xs = tp.xsonictable
xs.PowerRing = 550
xs.PowerRing2 = 1 --UXS compat
xs.FirstPWring = 280
t.XS_pwringget = 12
elseif not mint.speedup
for e = 1,5
local st = P_SpawnMobjFromMobj(t, 0,0,t.height*3, MT_FLINGRING)
st.fuse = 250
P_SetObjectMomZ(st, -2*FU)
for i = 1, 6
local dust = P_SpawnMobj(st.x, st.y, st.z, MT_SPINDUST)
dust.angle = ANG60*i
P_InstaThrust(dust, dust.angle, 15*FU)
P_SetObjectMomZ(dust, 1*FU)
dust.renderflags = RF_PAPERSPRITE
end
end
end
end
end, s, s.x-xy,s.x+xy, s.y-xy, s.y+xy)
end

Mint.AirControl = function(p,s,mint) --Shoutouts to romoney5 for this one
local mint = p.minttable
local sv = p.realmo.valid
if s and sv and ActiveMint(s) and mint and p.mintphys==2

local grounded = P_IsObjectOnGround(s) or (s.eflags&MFE_JUSTHITFLOOR)
local disable = (s.flags2&MF2_TWOD) or (maptol&TOL_2D)
local amount = 6*FU/1

if not grounded and not disable and not p.exiting and not (p.pflags&PF_STASIS) and not p.powers[pw_nocontrol] and not P_PlayerInPain(p) and p.playerstate==PST_LIVE
local super = ((mint.speedup) and 2 or 1)
local thrustfactor = p.thrustfactor*super
local acceleration = p.accelstart/super + (FixedDiv(p.speed,s.scale)>>FRACBITS)
local normalspd = FixedMul(p.normalspeed,s.scale)
local topspeed = (normalspd or ((mint.speedup) and 5*normalspd/3 or normalspd))
if (s.eflags&(MFE_UNDERWATER|MFE_GOOWATER))
topspeed = $ >> 1
acceleration = 2*$/3
end
local om = R_PointToDist2(s.momx-p.cmomx,s.momy-p.cmomy,0,0)
local shift = 2
if (p.pflags&(PF_SPINNING|PF_THOKKED))==PF_SPINNING
shift = $ + 1
end
local controldirection = R_PointToAngle2(0,0,p.cmd.forwardmove*FU,-p.cmd.sidemove*FU) + (p.cmd.angleturn * FU)
s.momx = $ + P_ReturnThrustX(mo,controldirection,FixedMul((abs(p.cmd.forwardmove)+abs(p.cmd.sidemove))*(thrustfactor*acceleration),FixedMul(s.scale,amount)) >> shift)
s.momy = $ + P_ReturnThrustY(mo,controldirection,FixedMul((abs(p.cmd.forwardmove)+abs(p.cmd.sidemove))*(thrustfactor*acceleration),FixedMul(s.scale,amount)) >> shift)
local nm = R_PointToDist2(s.momx-p.cmomx,s.momy-p.cmomy,0,0)
if (nm > topspeed)
if (om > topspeed)
if (nm > om)
s.momx = FixedMul(FixedDiv($ - p.cmomx, nm), om) + p.cmomx
s.momy = FixedMul(FixedDiv($ - p.cmomy, nm), om) + p.cmomy
end
else
s.momx = FixedMul(FixedDiv($ - p.cmomx, nm), topspeed) + p.cmomx
s.momy = FixedMul(FixedDiv($ - p.cmomy, nm), topspeed) + p.cmomy
end;end;end;end
if not (p.cmd.forwardmove or p.cmd.sidemove) and not P_IsObjectOnGround(s)
s.momx = $*60/62
s.momy = $*60/62
end;end

rawset(_G, "PerfectSpinTrail", function(s, FUSE,BLENDMODE,TAPERTRAIL,COLOR)
if not s.prevz or not s.prevleveltime or (s.prevleveltime ~= leveltime - 1)
s.prevz = s.z
end
local rmomz = s.z - s.prevz
s.prevz = s.z
s.prevleveltime = leveltime

local SPC = FixedDiv(FixedMul(R_PointToDist2(0,0, R_PointToDist2(0,0,s.momx, s.momy),s.momz),FU),s.scale)
local FREQ = 8/1*FU
local DIST = (SPC/FREQ)
local RE,LA,BOR
if (s.eflags & MFE_VERTICALFLIP)
RE,LA,BOR = s.momx,s.momy,-rmomz
else
RE,LA,BOR = -s.momx,-s.momy,-rmomz
end
for i = DIST,1,-1 do
local sp = P_SpawnMobjFromMobj(s, (RE/DIST)*i, (LA/DIST)*i, (BOR/DIST)*i, MT_THETRAIL)
sp.tracer = s
sp.scale = s.scale
sp.frame = $|FF_TRANS50
sp.renderflags = $|RF_FULLBRIGHT
sp.tics = 12
//sp.eflags = s.eflags
sp.dispoffset = 1
sp.scalespeed = FU/16
sp.spritexscale,sp.spriteyscale = s.spritexscale,s.spriteyscale
if (s.player and s.player.minttable)
if s.color == SKINCOLOR_SWEETNAM and not s.player.minttable.speedup
or s.color == SKINCOLOR_ICY and not s.player.minttable.speedup
or s.color == SKINCOLOR_LEGACYMINT and not s.player.minttable.speedup
or s.color == SKINCOLOR_NEOBLUE and not s.player.minttable.speedup
or s.color == SKINCOLOR_VAPOR and not s.player.minttable.speedup
or s.color == SKINCOLOR_ARCTIC and not s.player.minttable.speedup
or s.color == SKINCOLOR_DREAM and not s.player.minttable.speedup
or s.color == SKINCOLOR_AQUAMARINE and not s.player.minttable.speedup
or s.color == SKINCOLOR_SKY and not s.player.minttable.speedup
or s.color == SKINCOLOR_BLUEBELL and not s.player.minttable.speedup
sp.color = SKINCOLOR_BLUE
elseif s.color == SKINCOLOR_ROYAL and not s.player.minttable.speedup
or s.color == SKINCOLOR_PINK and not s.player.minttable.speedup
or s.color == SKINCOLOR_LILAC and not s.player.minttable.speedup
or s.color == SKINCOLOR_MAUVE and not s.player.minttable.speedup
or s.color == SKINCOLOR_PLUM and not s.player.minttable.speedup
or s.color == SKINCOLOR_RASPBERRY and not s.player.minttable.speedup
or s.color == SKINCOLOR_TAFFY and not s.player.minttable.speedup
or s.color == SKINCOLOR_ROSY and not s.player.minttable.speedup
or s.color == SKINCOLOR_FANCY and not s.player.minttable.speedup
or s.color == SKINCOLOR_MAGENTA and not s.player.minttable.speedup
or s.color == SKINCOLOR_SIBERITE and not s.player.minttable.speedup
or s.color == SKINCOLOR_BUBBLEGUM and not s.player.minttable.speedup
or s.color == SKINCOLOR_FUCHSIA and not s.player.minttable.speedup
or s.color == SKINCOLOR_PASTEL and not s.player.minttable.speedup
sp.color = SKINCOLOR_PURPLE
elseif s.color == SKINCOLOR_BLACK and not s.player.minttable.speedup
or s.color == SKINCOLOR_JET and not s.player.minttable.speedup
or s.color == SKINCOLOR_CARBON and not s.player.minttable.speedup
sp.color = SKINCOLOR_GOLDENROD
elseif s.player.minttable.speedup
sp.color = SKINCOLOR_SCARLET
elseif not (COLOR)
sp.color = s.color
end;end
if FUSE
sp.fuse = FUSE
end
if BLENDMODE
sp.blendmode = BLENDMODE
end
if TAPERTRAIL
sp.destscale = TAPERTRAIL
end
if COLOR
sp.color = COLOR
end
if (i < 6/4)
sp.flags2 = $|MF2_DONTDRAW
end;end;end)

rawset(_G, "MintStretch", function(p,s) --Shoutouts to Golden Shine for this one 2 (SMS)
local mint = p.minttable
local sv = s.valid
if s and sv //and mint and ActiveMint(s)
local minty = (mint.stretch or s.stretch)

if not minty.timer or (s.spritexscale==FU and s.spriteyscale==FU)
or minty.air or s.air and not (s.momz*P_MobjFlip(s) > 0)
and ((s.eflags & MFE_JUSTHITFLOOR) or P_IsObjectOnGround(s))
or minty.ground and not (P_IsObjectOnGround(s) and s.momz*P_MobjFlip(s) <= 0)
mint.stretch,s.stretch,s.spriteyoffset,s.spritexoffset,s.spritexscale,s.spriteyscale = nil,nil,0,0,FU,FU
return false end

if minty.Xspeed==nil minty.Yspeed = 5000 minty.Xspeed = 5000 end
minty.timer = $-1
if s.spritexscale != FU
s.spritexscale = (s.spritexscale > FU) and max($-minty.Xspeed, FU)
or (s.eflags & MFE_VERTICALFLIP) and (s.spritexscale < FU) and max($-minty.Xspeed, FU) or min($+minty.Xspeed, FU)
or (s.eflags & MFE_VERTICALFLIP) and max($+minty.Xspeed, FU) or min($-minty.Xspeed, FU)
end
if s.spriteyscale != FU
s.spriteyscale = (s.spriteyscale > FU) and max($-minty.Xspeed, FU)
or (s.eflags & MFE_VERTICALFLIP) and (s.spriteyscale < FU) and max($-minty.Xspeed, FU) or min($+minty.Xspeed, FU)
or (s.eflags & MFE_VERTICALFLIP) and max($+minty.Xspeed, FU) or min($-minty.Xspeed, FU)
end
if s.spriteyoffset != 0
s.spriteyoffset = (s.spriteyoffset > 0) and max($-FU, 0) or min($+FU, 0)
if s.spritexoffset != 0
s.spritexoffset = (s.spriteyoffset > 0) and max($-2<<16, 0) or min($+2<<16, 0)
end;end return s end;end)

Mint.ShieldThinker = function(p,s,mint)
if mint and mint.shield==SH_ATTRACT and (s.state==S_PLAY_MINTDASH)
mint.target2 = P_LookForEnemies(p, true, true)
if mint.target2 and mint.target2.valid and mint.target2.health
P_SpawnLockOn(p, mint.target2, S_LOCKON3)
if mint.b==1 and mint.target2
S_StartSoundAtVolume(s,sfx_mthok,141)
s.state = S_PLAY_ROLL
mint.homing = 39
end;end;end
if p.pflags&PF_JUMPED and mint.shield and mint.c3==1
if (mint.shield==SH_WHIRLWIND or mint.shield==SH_WHIRLWIND|SH_FIREFLOWER)
P_DoJumpShield(p)
elseif (mint.shield==SH_ARMAGEDDON or mint.shield==SH_ARMAGEDDON|SH_FIREFLOWER)
s.state = S_PLAY_SUPER_TRANS1
S_StartSound(s, sfx_mboom)
P_StartQuake(21*FU, 1*TICRATE*1/2)
P_BlackOw(p)
P_NukeEnemies(s, s, 2000*FU)
mint.shield = 0
s.rollangle,mint.trick,mint.twirl,mint.burststomp = 0,0,0,false
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;end;end
if (mint.shield==SH_FORCE|1 or mint.shield==SH_FORCE or mint.shield==SH_FORCE|1|SH_FIREFLOWER or mint.shield==SH_FORCE|SH_FIREFLOWER)
and not (p.pflags&PF_SPINNING)
and not P_IsObjectOnGround(s)
and not mint.nofear
or (s.eflags&MFE_UNDERWATER)
and not (p.pflags&PF_SPINNING)
and not P_IsObjectOnGround(s)
s.momx = $*88/90
s.momy = $*88/90
end
if (p.pflags&PF_JUMPED) and (s.momz*P_MobjFlip(s) < 0*s.scale) and mint.shield==SH_WHIRLWIND and not P_IsObjectOnGround(s)
and not mint.burststomp
and not (p.pflags&PF_THOKKED)
or s.state==S_PLAY_MINTDASH and (s.momz*P_MobjFlip(s) < 0*s.scale) and not (s.eflags&MFE_UNDERWATER)
s.momz = $*15/17
end
if mint.shield==SH_FLAMEAURA and not (p.powers[pw_shield]&SH_FIREFLOWER)
and not (CBW_Battle or mint.matchgt)
S_StartSound(s, sfx_fire)
mint.flames = 1
P_SwitchShield(p, SH_FIREFLOWER)
end
if mint.homing and t
and not p.powers[pw_nocontrol]
or mint.homing //and mint.target2
and not p.powers[pw_nocontrol]
p.powers[pw_nocontrol] = 1
end
if mint and mint.shield==SH_THUNDERCOIN and P_IsObjectOnGround(s) and mint.b==1 and (p.speed >= 0*s.scale) and (p.speed < 10*s.scale)
and not (s.state==S_PLAY_MINTLAND)
and not (p.pflags&PF_SPINNING)
s.state = S_PLAY_MINTBEAM1
S_StartSoundAtVolume(s,sfx_mbstr1,255)
mint.hyperbeam = 1
s.spritexscale = FU-28500
s.spriteyscale = FU+21000
mint.stretch = {timer = 3}
end
if mint and mint.shield==SH_THUNDERCOIN and mint.c2==1
S_StartSound(s,sfx_s3k99)
P_SwitchShield(p, SH_ATTRACT)
local mfx = P_SpawnMobjFromMobj(s,0,0,0, MT_THOK)
mfx.scale = s.scale
mfx.destscale = s.scale*2
mfx.scalespeed = 1*FU
mfx.color = SKINCOLOR_YELLOW
mfx.fuse = 10
end
if mint and mint.shield==SH_THUNDERCOIN
local xy = 600*FU
searchBlockmap("objects", function(m, t) local tp = t.player
if (not t.valid) or t == s return end
if t and t.valid and t.health and (t.flags & MF_ENEMY or t.flags & MF_BOSS
or t.type==MT_ROSY or t.type==MT_PLAYER and tp and not tp.ctfteam==p.ctfteam) --LOL
and not P_IsObjectOnGround(s)
and (p.pflags&PF_JUMPED)
P_SpawnLockOn(p, t, S_LOCKON1)
end
if mint.c3==1 and (p.pflags&PF_JUMPED)
and t.health and (t.flags & MF_ENEMY or t.flags & MF_BOSS
or t.type==MT_ROSY or t.type==MT_PLAYER and tp and not tp.ctfteam==p.ctfteam) --LOL
mint.burststomp = false
S_StartSound(t, sfx_litng2)
S_StartSound(t, sfx_litng3)
S_StartSound(t, sfx_litng4)
P_FlashPal(p, PAL_WHITE, 3)
P_StartQuake(16*FU, 1*TICRATE*1/2)
P_DoMintEffect5(t)
t.health = 0
p.powers[pw_shield] = 0
p.pflags = $|PF_THOKKED
//p.pflags = $1&~PF_JUMPED
P_KillMobj(t,s,s)
end
end, s, s.x-xy,s.x+xy, s.y-xy, s.y+xy)
end
if mint and mint.shield==SH_ATTRACT and mint.c2==1
///and not mint.homing
S_StartSound(s,sfx_s3k99)
P_SwitchShield(p, SH_THUNDERCOIN)
local mfx = P_SpawnMobjFromMobj(s,0,0,0, MT_THOK)
mfx.scale = s.scale
mfx.destscale = s.scale*2
mfx.scalespeed = 1*FU
mfx.color = SKINCOLOR_WHITE
mfx.fuse = 10
end
if mint and mint.shield==SH_PINK
S_StartSound(s,sfx_cdpcm9)
S_StartSound(s,sfx_s259)
local fx = P_SpawnGhostMobj(s)
fx.scale = s.scale
fx.destscale = 87<<16
fx.scalespeed = s.scale/3
fx.sprite2 = SPR2_TRNS
fx.frame = C
fx.frame = FF_TRANS40
p.powers[pw_shield] = 0
end

/*
if (mint.shield==SH_WHIRLWIND or mint.shield==SH_WHIRLWIND|SH_FIREFLOWER)
and All7Emeralds(emeralds)
Mint.WhirlwindFreeFlight(p,s,mint)
end*/
end

Mint.NoFear = function(p,s,mint) --'Invincible..No Fear!'  ...LITERALLY LMFAO
local mint = p.minttable
local sv = p.realmo.valid
if s and sv and mint and ActiveMint(s) and p.playerstate==PST_LIVE
if mint.nofear
p.powers[pw_underwater] = 30*TICRATE
p.powers[pw_spacetime] = 30*TICRATE
p.charflags = $|SF_CANBUSTWALLS
if (p.powers[pw_invulnerability] < 2)
p.charflags = $&~SF_CANBUSTWALLS
end;end
if P_CheckDeathPitCollide(s, true) and mint.nofear
p.pflags = $|PF_THOKKED
p.pflags = $1&~PF_JUMPED
P_SetObjectMomZ(s,40*FU,false)
mint.burststomp = false
mint.sbs = false
end
if (p.didinvuln and p.didinvuln.valid)
P_MoveOrigin(p.didinvuln, s.x, s.y, s.z)
p.didinvuln.spritexscale,p.didinvuln.spriteyscale = s.spritexscale,s.spriteyscale
p.didinvuln.eflags = s.eflags
p.didinvuln.flags2 = s.flags2
end
if not p.didinvuln and p.powers[pw_invulnerability]
P_DoMintEffect3(p)
end
if (p.powers[pw_invulnerability] and maptol&TOL_MARIO) and (p.didinvuln and p.didinvuln.valid)
p.didinvuln.color = s.color
else
p.didinvuln.color = SKINCOLOR_CERULEAN
end;end;end

Mint.CrossMobj = function(p,s,mint, STATE,COLOR,SCALE,BLEND) local mint = p.minttable
for i = 1,5
local obj = P_SpawnMobjFromMobj(s, P_RandomRange(-20, 20)*FU,P_RandomRange(-20, 20)*FU,P_RandomRange(0, 50)*FU, MT_THOK)
obj.target,obj.tracer = s,s
obj.colorized = true
obj.flags = $|MF_NOBLOCKMAP|MF_NOCLIPTHING
obj.eflags = s.eflags
obj.destscale = 1*FU/4
obj.spriteyoffset,obj.spritexoffset = s.spriteyoffset,s.spriteyoffset
P_SetObjectMomZ(obj, 2*s.scale)
local Zflip = (s.eflags & MFE_VERTICALFLIP and MFE_VERTICALFLIP)
if Zflip
obj.eflags = $|Zflip
end
if STATE
obj.state = STATE
end
if SCALE
obj.scale = SCALE
end
if BLEND
obj.blendmode = BLEND
end
if COLOR
obj.color = COLOR
end
if mint.nofear
obj.color = SKINCOLOR_SWEETNAM
end;end;end

Mint.NotMint = function(p,s,mint)
local mint = p.minttable
mint.vocalcd = 0
mint.gotthepower = false
if YuSonic and (s.skin=="adventuresonic")
if p.powers[pw_invulnerability]
COM_BufInsertText(p, "tunes YUINV")
S_ChangeMusic("YUINV", false, p)
end
if p.powers[pw_sneakers]
COM_BufInsertText(p, "tunes YUSHOE")
S_ChangeMusic("YUSHOE", false, p)
end;end
if s.health
s.rollangle = 0
end;end

/*Mint.WhirlwindFreeFlight = function(p,s,mint)
local mint = p.minttable
local sv = p.realmo.valid
if s and sv and mint and ActiveMint(s) and p.playerstate==PST_LIVE
end
if mint and (mint.shield==SH_WHIRLWIND and p.pflags&PF_JUMPED)
and (p.cmd.forwardmove > 0 or p.cmd.sidemove > 0 or p.cmd.sidemove < 0)
and not P_PlayerInPain(p)
and not mint.twirl
and not mint.trick
and not mint.burststomp
and not (p.pflags&PF_STARTJUMP)
mint.FreeFlight = {s.momx, s.momy, s.momz, s.angle, max(FixedHypot(FixedHypot(s.momx,s.momy), 3*s.momz/2),s.scale*36), p.aiming}
p.camangle = p.cmd.angleturn<<16 + R_PointToAngle2(0, 0, p.cmd.forwardmove*FU, -p.cmd.sidemove<<16)
s.momz = FixedMul(11*mint.FreeFlight[5]/16, sin(p.aiming))
end;end*/

Mint.Chat = function(p,s,mint) local xy = 200*FU if p.bot return end
searchBlockmap("objects", function(m, t) local tp = t.player
local mint = p.minttable

if ActiveMint(s) and mint and p and p.valid
and t and t.valid and tp and not tp.ctfteam!=p.ctfteam
and not p.spectator

if not mint.banter and not mint.vocalcd and mint.tossflag and mint.c1==1 and P_IsObjectOnGround(s)
Mint.Vocals(p,s,mint, sfx_mnvocp, 200)
mint.banter = 60
mint.vocalcd = 0
s.spritexscale = FU-18500
s.spriteyscale = FU+11000
mint.stretch = {timer = 2}
end

if mint.banter and mint.banter==45

if XSon and IsXSonic(t)
local xs = tp.xsonictable
if xs and xs.voice
t.spritexscale = FU-18500
t.spriteyscale = FU+11000
xs.zipstretch = 2
local hey
hey = {sfx_xsvopi,sfx_xsvopj,sfx_xsvopk}
local mrng = P_RandomRange(1, #hey)
local hey2 = hey[mrng]
hey2 = (mrng==#hey) and hey[1] or hey[mrng+1]
XSVoice(tp, t, xs, hey2)
end;end
if (t.skin=="adventuresonic") and YuSonic
local yu = tp.yusonictable
if yu and yu.yuvoice
t.spritexscale = FU-18500
t.spriteyscale = FU+11000
t.YUSONICstretch = {timer = 2}
if yu.supersonic
t.state = S_PLAY_EDGE
if yu.yuvoice
S_StartSound(t,sfx_yuvoc9)
end
else
YuVoice(tp, t, yu, sfx_yuvocj)
/*if P_IsObjectOnGround(t) and not tp.speed
and not yu.tauntstate
and not (tp.pflags&PF_SPINNING)
t.state = S_PLAY_FLY
yu.tauntstate = 7
t.frame = R
end*/
end
end
end
if (t.skin=="echoes") and (Echoes)
S_StartSound(t, sfx_efun)
mint.respo = 25
if P_IsObjectOnGround(t)
t.state = S_PLAY_FIRE
end;end
if (t.skin=="kiryu")
S_StartSound(t,sfx_krpet)
tp.kiryusquish = -8
end
end
end
end, s, s.x-xy,s.x+xy, s.y-xy, s.y+xy)
end