--#==============================================================================#
--If GFX are primarily dedicated to the Ring Burst, then they'll probably be here!
--#==============================================================================#
local XSon = XSon
local function P_MobjFlip(s) if s and s.valid and ((s.eflags&MFE_VERTICALFLIP) or (s.flags2&MF2_OBJECTFLIP)) return -1 end return 1 end

--Spawn clouds that attach to nearby surfaces.
rawset(_G, "XS_RingBurstDust", function(p, s, xs, DIST, DUSTCLOUD)
	if DIST != "manual"
		DIST = DIST or 150*s.scale
		if (s.eflags & MFE_VERTICALFLIP)
			if (abs(s.z-s.ceilingz) < DIST)
				DUSTCLOUD = s.ceilingz
			end
		elseif (abs(s.z-s.floorz) < DIST)
			DUSTCLOUD = s.floorz
		end	
		if DUSTCLOUD == nil return end --
	end
	local ghs = XS_CircleWave(s, nil, nil, 9)
	ghs.frame = O|FF_TRANS50
	ghs.flags = $ & ~(MF_NOGRAVITY|MF_NOCLIPHEIGHT)
	ghs.z = DUSTCLOUD
	ghs.spriteyscale = FRACUNIT/4
	ghs.sttspeed = 2
	ghs.sttfinalframe = Q
	return ghs --
end)

--Spinning glow coming from Sonic.
rawset(_G, "XS_RingBurstShine", function(p, s, xs, FORCEHAND)		
	local ghs = XSon.ElectricBody(s, 8, SKINCOLOR_GOLDENROD) --Golden Rod best new skincolor
	ghs.sprite = SPR_XSG1
	ghs.frame = S|FF_TRANS20
	ghs.blendmode = AST_ADD
	ghs.sttfade = 7
	ghs.scalespeed = FRACUNIT/7
	ghs.destscale = 99<<16
	if xs.darkphase
		ghs.color = XSon.DarkAura(0)
	else
		ghs.colorized = false
	end
	ghs.sttspeed = 4
	ghs.sttfirstframe = S
	ghs.sttlastframe = T
	ghs.dispoffset = 10
	
	if FORCEHAND or not (xs.supersonic)
		ghs.tracer = nil
		ghs.momz = $+(s.momz*2/3)
		ghs.momx = $+s.momx ghs.momy = $+s.momy	
		P_SetOrigin(ghs, s.x+FixedMul(-39*s.scale, cos(p.drawangle+(ANG1*15))), s.y+FixedMul(-39*s.scale, sin(p.drawangle+(ANG1*15))), ghs.z+(FORCEHAND and (s.height*3/4) or s.height/4))	
		if FORCEHAND
			P_Thrust(ghs, p.drawangle-(ANG1*6), -8*s.scale)	
		--	ghs.sttroll = ANG1*31
			return ghs --
		else
			ghs.spritexscale = FRACUNIT-21000
			ghs.spriteyscale = FRACUNIT-21000
			if XSLocalRNG(5,6,ghs) == 6
				ghs.frame = $|FF_VERTICALFLIP
				ghs.z = $+(20*s.scale*P_MobjFlip(s))
			end
	--		ghs.sttroll = ANG20
		end
	elseif XSLocalRNG(9,8,ghs) == 8
		ghs.frame = $|FF_HORIZONTALFLIP|FF_VERTICALFLIP
	end
	if p.panim == PA_FALL or ((s.sprite2 & ~FF_SPR2SUPER) == SPR2_GLID)	
		ghs.spriteyoffset = 28<<16
	else
		ghs.spriteyoffset = (p.panim != PA_SPRING) and 8<<16 or 17<<16
	end
	return ghs --
end)

--Flashy RingBurst sparkles!
rawset(_G, "XS_RingBurstSparkles", function(s, FUSE, COLOR, RANGE)	
	local HIDE,DARK = false, 0
	local p = s.player
	if p
		if p.xsonictable
			DARK = p.xsonictable.darkphase
		end
		if (p!=displayplayer) and (netgame==true)
			if (leveltime%3!=0) and ((CV_FindVar("renderer").value)!=2)
				HIDE = true
			end
		elseif p==displayplayer
			if not (p.awayviewtics) and CV_FindVar("chasecam").value
				HIDE = true
			end
		end
	end
	
	RANGE = (RANGE) or 240
	local RNG1 = XSLocalRNG(1,360,s)
	local RNG2 = XSLocalRNG(-45,120,s)
	local RNG3 = XSLocalRNG(RANGE, RANGE*-1, s)	
	
	local ghs = P_SpawnMobjFromMobj(s,
	0, --FixedMul(RNG3*s.scale, cos(s.angle +((leveltime%2) and ANG60 or -ANG60)) ),
	0, --FixedMul(RNG3*s.scale, cos(s.angle +((leveltime%2) and ANG60 or -ANG60)) ), 
	0, --RNG2*s.scale,
	MT_XSAUTOFRAME)
	
	ghs.sprite = SPR_XSG9
	ghs.renderflags = RF_FULLBRIGHT|RF_NOCOLORMAPS
	ghs.frame = A|FF_TRANS30
	ghs.sttspeed = 1
	ghs.sttfirstframe = A
	ghs.sttfinalframe = R
	ghs.blendmode = AST_ADD
	ghs.fuse = (FUSE) or 16
	ghs.sttfade = 14
--	ghs.rollangle = RNG1*ANG1
--	ghs.sttroll = RNG1*(ANG1/11)
	ghs.scale = $/8
	ghs.destscale = 3<<16
	
	ghs.momz = XSLocalRNG(12,9,ghs)*s.scale*P_MobjFlip(s)
	ghs.spriteyoffset = $+P_RandomRange(-RANGE,RANGE/2)<<16
	ghs.spritexoffset = $+XSLocalRNG(-RANGE,RANGE,s)<<16
	
	if (DARK)
		ghs.color = XSon.DarkAura(0)
	elseif COLOR != nil
		ghs.color = COLOR
	else
		ghs.color = (XSLocalRNG(12,13,s) == 12) and XSLocalRNG(SKINCOLOR_SUPERSKY1, SKINCOLOR_SUPERSKY5,s)
		or XSLocalRNG(SKINCOLOR_SUPERSILVER3, SKINCOLOR_SUPERORANGE5,s)	
	end	
	if (HIDE==true)
		ghs.flags2 = $|MF2_DONTDRAW
	end
	return ghs --
end)

--The large iconic waves emmitting from Sonic's Ring Burst!
rawset(_G, "XS_RingBurstWave", function(s, FUSE, COLOR, FRAME, ROLL)
	local ghs = P_SpawnMobjFromMobj(s, s.momx, s.momy, 0, MT_XSAUTOFRAME)	
	ghs.sprite = SPR_XSG1
	ghs.renderflags = RF_FULLBRIGHT|RF_NOCOLORMAPS|RF_PAPERSPRITE
	ghs.frame = (FRAME) or R|FF_TRANS10
	ghs.blendmode = AST_ADD
	ghs.fuse = (FUSE) or 38
	ghs.sttfade = 14
	if s.player and s.player.xsonictable and s.player.xsonictable.darkphase
		ghs.color = XSon.DarkAura()
		ghs.colorized = true
	elseif (COLOR)
		ghs.color = COLOR
		ghs.colorized = true
	end
	ghs.scale = $/2
	ghs.destscale = 99<<16
	ghs.scalespeed = FRACUNIT/5
--	ghs.sttroll = (ROLL) or (leveltime%2) and -ANG2 or ANG2	
	ghs.tracer = s
	ghs.ditchtracer = 2
	ghs.momx,ghs.momy,ghs.momz = s.momx/2,s.momy/2,s.momz/2
	return ghs --
end)

--Leave a trail of ring burst-style stripes.
rawset(_G, "XS_RingBurstStripes", function(s, COLOR, BLENDMODE, YOFFSET, TRACER, ANGLE)
	local p = s.player local xs = p and p.xsonictable
	local FRAME = W|FF_TRANS20
	if xs
		if xs.darkphase
			FRAME = W|FF_TRANS80
			COLOR = SKINCOLOR_XSSUPERAURA -- XSon.DarkAura(0)
			BLENDMODE = AST_REVERSESUBTRACT
		elseif not COLOR
			COLOR = xs.supersonic and SKINCOLOR_GOLDENROD or SKINCOLOR_SKY
		end
	elseif not COLOR
		COLOR = s.color
	end
	ANGLE = (ANGLE) or R_PointToAngle2(s.x, s.y, s.x+s.momx, s.y+s.momy)
	
	local ths,ghs
	for i = -1,1,2
		ghs = P_SpawnMobjFromMobj(s, FixedMul(36*s.scale, cos(ANGLE+(ANGLE_90*i))), FixedMul(36*s.scale, sin(ANGLE+(ANGLE_90*i))), 0, MT_XSAUTOFRAME)	
		ghs.sprite = SPR_XSG1
		ghs.renderflags = RF_PAPERSPRITE|RF_SEMIBRIGHT
		ghs.angle = ANGLE-(ANG1*12*i)
		ghs.frame = (i != 1) and FRAME or FRAME|FF_HORIZONTALFLIP	
		ghs.scale = s.scale/2
--		ghs.scalespeed = $*4
--		ghs.destscale = 99<<16
		ghs.sttfade = true
		ghs.sttspeed = 1
		ghs.sttfirstframe = W
		ghs.sttfinalframe = Z
		ghs.spriteyoffset = YOFFSET or $
		ghs.blendmode = BLENDMODE or AST_ADD
		ghs.color = COLOR
		if TRACER
			ghs.tracer = TRACER
		else
			P_Thrust(ghs, ANGLE+(ANG1*12*i), 5*s.scale) 		
		end
		ghs.fuse = TRACER and 6 or 8
		if i == -1 ths = ghs end
	end return ths,ghs --
end)

--SPEEEEEEED
/*
rawset(_G, "XS_RingBurstSpeedTrail", function(s, FUSE, COLOR, FRAME, ROLL)
	local ghs = P_SpawnMobjFromMobj(s, s.momx, s.momy, s.height/2, MT_XSAUTOFRAME)	
	ghs.sprite = SPR_XSG1
	ghs.renderflags = RF_FULLBRIGHT|RF_NOCOLORMAPS|RF_PAPERSPRITE
	ghs.frame = (FRAME) or R|FF_TRANS70
	ghs.blendmode = AST_ADD
	ghs.fuse = (FUSE) or 26
	ghs.sttfade = true
	if (COLOR)
		ghs.color = COLOR
		ghs.colorized = true
	end
	ghs.scale = $/2
	ghs.destscale = 999<<16
	ghs.scalespeed = FRACUNIT/3
	ghs.sttroll = (ROLL) or (leveltime%2) and -ANG2 or ANG2	
	ghs.tracer = s
	ghs.ditchtracer = 5
	ghs.GSoffsetX = 32*s.scale
	ghs.GSoffsetY = 32*s.scale
	ghs.GSoffsetZ = s.height/2
	ghs.momx = s.momx
	ghs.momy = s.momy
	ghs.momz = s.momz
	return ghs --
end) */

--Initial start GFX for the Ring Burst.
XSon.RingBurstStartGFX = function(p,s,xs)
	S_StartSound(s, sfx_xssfxw)
	XS_RingBurstStripes(s, nil, AST_ADD, 11<<16, s)
	
	--Sonic ghost.
	local ghs = P_SpawnGhostMobj(s)
	ghs.scale = s.scale
	ghs.rollangle = 0
	ghs.colorized = true
	ghs.scalespeed = $*5
	ghs.destscale = 99<<16
	ghs.fuse,ghs.tics = 12,99
	
	for i = 1,2
		ghs = XS_CircleWave(s, 1)
		if i==1
			ghs.frame = E|FF_TRANS10
			ghs.fuse = 19
			ghs.spriteyoffset = -24<<16	
		else
			ghs.sprite = SPR_XSG2
			ghs.frame = 30|FF_TRANS60	
			ghs.fuse = 10
			ghs.scale = $*3/2
			ghs.scalespeed = $*2
			ghs.momx,ghs.momy,ghs.momz = -s.momx/3,-s.momy/3,-s.momz/6
		end
		ghs.ditchtracer = 8
		ghs.dispoffset = -7*i
	end
	
	--Big starting burst effect.
	ghs = P_SpawnMobjFromMobj(s, s.momx,s.momy,s.height/2, MT_THOK)
	ghs.blendmode = AST_ADD
	ghs.sprite = SPR_XSG1
	ghs.frame = R|FF_TRANS20
	ghs.flags = $|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIP
	ghs.renderflags = $|RF_SEMIBRIGHT|RF_PAPERSPRITE
	ghs.angle = s.angle+ANGLE_90
	P_SetObjectMomZ(ghs, -FRACUNIT, true)
	ghs.scale = s.scale/3
	ghs.destscale = 99<<16
	ghs.scalespeed = $*3
	ghs.fuse,ghs.tics = 25,99
	ghs.momx,ghs.momy = s.momx/3,s.momy/3
end

XSon.RingBurstAfterImages = function(p,s,xs, RB)
	local TIME = (RB) and RB.start or leveltime
	local ghs = P_SpawnGhostMobj(s)  --Afterimages!
	ghs.scale = s.scale
	ghs.rollangle = 0 --temporary until fix
	if (TIME%4==0)
		ghs.momx,ghs.momy,ghs.momz = s.momx/2,s.momy/2,s.momz/2
	--	if RB and not (XS_CRAPPYPRIORITIES==1)
	--		ghs.rollangle = RB.rollangle+(XSLocalRNG(-21, 21, s)*ANG1)
	--	end
	else
		ghs.momx,ghs.momy,ghs.momz = s.momx/3,s.momy/3,s.momz/3
	end
	ghs.fuse,ghs.tics = 34,99
	ghs.destscale = 1
	ghs.sprite2 = SPR2_BNCE | ((SUPER==3) and FF_SPR2SUPER or 0)
	ghs.frame = A|((xs.darkphase) and FF_TRANS20 or FF_TRANS40)
	ghs.blendmode = AST_ADD
	ghs.spritexoffset = XSLocalRNG(-6, 6, s)<<16 --Shake violently!
	ghs.spriteyoffset = XSLocalRNG(-68, -20, s)<<16
	if xs.darkphase
		ghs.color = XSon.DarkAura(0)
	elseif SUPER==3
		ghs.color = (TIME%4==0) and SKINCOLOR_SILVER or s.color 
	else
		ghs.color = (TIME%4==0) and SKINCOLOR_SILVER or SKINCOLOR_SKY
	end
	ghs.colorized = true	
	ghs.renderflags = $|RF_FULLBRIGHT|RF_NOCOLORMAPS
end