--[GOLDEN SHINE}: Just some Lua to make the maps a bit more dynamic.
--Auto adds emeralds if XSonic is present, gives 9001 rings, has random weather/time conditions, and optimizes the audience.
freeslot("MT_THDM_XMPALM")

--On spawn, give rings, set lives to a minimum of 3, and give emeralds if the admin player is X Sonic.
addHook("PlayerSpawn", function(p)
	local MAP = mapheaderinfo[gamemap]
	if not (p and p.valid and MAP) return end --
	local SUBTITLE = "" 
	if MAP.subttl 
		SUBTITLE = string.upper(MAP.subttl)
	end
	if not (SUBTITLE=="SUPER SONIC TENKAICHI") and not (MAP.sstarena==1) return end --
	
	p.rings = 9001
	if (p.lives >= 0) 
		p.lives = max($,3)
	end
	
	if (splitscreen==true)
		if (leveltime < 22) --Auto switch players to X Sonic on splitscreen boot.
			R_SetPlayerSkin(p, "xsonic")
			if p.mo p.mo.skin = "xsonic" end
			emeralds = 127
		end
	elseif (p.jointime < 22) or p.mo and p.mo.skin == "xsonic"
		if (emeralds != 127) --Add emeralds if an admin is X SOnic.
			if (p==server) 
			or (IsPlayerAdmin(p))
			or not (netgame==true)
				emeralds = 127
			end
		end
	end
	--Instantly ready up for a fight in splitscreen.
	if (splitscreen==true) and p.mo and p.mo.skin == "xsonic" and p.xsonictable and (emeralds==127) 
		local s,xs = p.mo,p.xsonictable
		XSon.ResetAll(p,s,xs)
		xs.supersonic,s.xsonicspawned = true,false 
		p.powers[pw_super] = 50
		s.z = $+(280*s.scale*P_MobjFlip(s))
		if (p==players[1])
			P_SetObjectMomZ(s, 24<<16)
			P_TryMove(s, s.x+FixedMul(1400*s.scale, cos(s.angle)), s.y+FixedMul(1400*s.scale, sin(s.angle)), true) 
			if players[0] and players[0].mo --Face me, coward!
				p.drawangle = R_PointToAngle2(s.x, s.y, players[0].mo.x, players[0].mo.y)
			else
				p.drawangle = $+ANGLE_180
			end
			s.angle = p.drawangle
		end	
		--Lazily force table on them.
		xs.FreeFlight = {
		riseanimtimer = 0,tics = 6, maxtics = 6, xymult = 100, zmult = 100,landing = 0, startflames = 0,
		noXYcontrol = 0, noZcontrol = 0,
		SnapOverHeat = 0,recordtap = 0, tapped = 0,
		rocket = 0, rocketjump = 0, rocketspin = 0,
		jump = 0, spin = 0, truespin = 0, dualpress = 0, AutoAim = 0, DodgeFrames = 8,
		PvPHEALTH = 10000,
		minPVP = 2,
		CantCancel = 4,
		custom1 = (xs.custom1) or 0, custom2 = 99*FRACUNIT, custom3 = 99*FRACUNIT, attack = 99*FRACUNIT 
		}
	end
end)

--What's the first stage?
local function ReturnMap(MAP)
	local STARTMAP = spstage_start
	if STARTMAP==nil STARTMAP = 2 end
	G_SetCustomExitVars(STARTMAP) 
end

--Mess with the stage?
local function XRandomTime(MAP, DAY)
	DAY = (DAY) or P_RandomRange(1,8)
	if (DAY < 4) and MAP and (MAP.lvlttl != "SST Arena") 
		DAY = 4
	end
	
	if DAY == 1 --Clear day sky.
		for sec in sectors.iterate
			if (sec.lightlevel >= 192) 
				sec.lightlevel = 255
			else
				sec.lightlevel = min(255, $+16)
			end
		end			
		P_SetupLevelSky(1)
	elseif DAY==2 or DAY==3 --Snowy weather, day or night.
		local FROST = -1
		if (DAY==3)
			FROST = R_CheckTextureNumForName("FROST02")
			P_SetupLevelSky(17)
			for sec in sectors.iterate
				sec.lightlevel = min(255, $-16)
				if sec.floorpic=="DIRT" or sec.floorpic=="DIRT1F"
					sec.floorpic = "CESTONE"
				end					
			end
		else
			FROST = R_CheckTextureNumForName("FROST01")
			P_SetupLevelSky(30)
			P_SwitchWeather(PRECIP_SNOW)
			for sec in sectors.iterate
				if (sec.lightlevel >= 192) 
					sec.lightlevel = min(255, $+36)
				else
					sec.lightlevel = min(255, $+20)
				end
				if sec.floorpic=="DIRT" or sec.floorpic=="DIRT1F"
					sec.floorpic = "ICEFLR0"
				end
			end
		end
		local DIRT = R_CheckTextureNumForName("DIRT")
		if (FROST!=-1) and (DIRT!=-1)
			for side in sides.iterate
				if side and side.valid
					if (side.toptexture==DIRT)
						side.toptexture=FROST
					end
					if (side.bottomtexture==DIRT)
						side.bottomtexture=FROST
					end				
				end
			end
		end
	elseif DAY==4
		--Default sunset.
	elseif DAY==5 
		P_SwitchWeather(PRECIP_STORM_NORAIN)
		P_SetupLevelSky(12)--Thunderous skies
	elseif DAY==6 --Dangerous weather.
		P_SwitchWeather(PRECIP_STORM)
		P_SetupLevelSky(11)
	else --if DAY>=7
		for sec in sectors.iterate --Night-time
			sec.lightlevel = min(255, $-16)
		end
		if DAY==8
			P_SetupLevelSky(6) --Cloudy night sky
			P_SwitchWeather(PRECIP_STORM_NOSTRIKES)
		else
			P_SetupLevelSky(9) --Starry sky
		end
	end
end


--List of audience members. If it's listed multiple times, that means a higher chance to appear.
local AUDIENCE = {
MT_BIGGARGOYLE,
MT_GARGOYLE,
MT_EGGSTATUE2,
MT_FACESTABBER, MT_FACESTABBER, MT_FACESTABBER,
MT_GFZFISH, MT_GFZFISH, MT_GFZFISH,
MT_ROBOHOOD,
MT_GOLDBUZZ,
MT_REDBUZZ,
MT_REDCRAWLA,
MT_BLUECRAWLA, 
MT_SPRINGSHELL,
MT_PYREFLY,
MT_PENGUINATOR,
MT_POPHAT,
MT_HIVEELEMENTAL,
MT_SHLEEP,
MT_TOAD, MT_TOAD,
MT_GOOMBA,
MT_BLUEGOOMBA,
MT_FIREFLOWER
}
local SPAWNED = 0 --How many 1 of a kind items we've spawned in the audience.

addHook("MapLoad", function(gamemap)
	local MAP = mapheaderinfo[gamemap]
	SPAWNED = 0
	
	if not (MAP and MAP.lvlttl) return end --
	
	local TITLE = string.upper(MAP.lvlttl)
	
	if TITLE == "THORNDYKE MANSION"
		ReturnMap(MAP)
		local DAY = P_RandomRange(0,8)
		if (DAY >= 5)
			XRandomTime(MAP, DAY)
		end
		for m in mobjs.iterate(mobjs) --Remove leftover eggrobo jets, or optimize existing ones.
			if m and m.valid
				if (m.type == MT_LAMPPOST1)
					m.radius = $/7
					m.renderflags = $|RF_FULLBRIGHT
					m.spritexscale = $*8/11	
					if (m.x < -24000<<16)
						m.radius,m.height = 1,1
						m.flags = MF_NOTHINK|MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING
					end
				elseif (m.type==MT_PINETREE) or (m.type==MT_GFZCHERRYTREE)
					if (m.x < -24000<<16)
						m.radius,m.height = 1,1
						m.flags = MF_NOTHINK|MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING
					end
				elseif m.type==MT_THDM_PNBUSH
					m.spritexscale = $+P_RandomRange(9000,-9000)
					m.spriteyscale = $+P_RandomRange(6000,-6000)
					m.flags = $|MF_NOTHINK|MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING
				elseif m.flags==MF_SOLID and (m.info.doomednum==1128 or m.info.doomednum==1129)	
					m.flags = ($|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIP) & ~MF_SOLID	
				end
			end
		end
		return --
	end
	
	local SUBTITLE = ""
	if MAP.subttl
		SUBTITLE = string.upper(MAP.subttl)
	end	
	if (SUBTITLE!="SUPER SONIC TENKAICHI") return end --SST maps only from here on.
	
	ReturnMap(MAP)
	
	local DAY = P_RandomRange(1,8)
	XRandomTime(MAP, DAY)
	
	--Neuter the Egg Robo audience for performance's sake, and
	--vary things up a bit with different members! Create some free gaps to sit in too.
	for m in mobjs.iterate(mobjs) 
		if m and m.valid and (m.type == MT_EGGROBO1)
			local SPAWN = nil
			m.flags = MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_NOGRAVITY|MF_NOBLOCKMAP
			m.renderflags = $|RF_NOCOLORMAPS|RF_SEMIBRIGHT
			local RNG = P_RandomRange(0,12)
			if (RNG > 6) --Make modifications!
				if RNG == 7 --Spawn a 1 of a kind object!
					if not (SPAWNED) --Spawn Metal Sonic
						SPAWN = P_SpawnMobjFromMobj(m,0,0,0,MT_METALSONIC_BATTLE)
					elseif SPAWNED==1 --Spawn Eggman
						SPAWN = P_SpawnMobjFromMobj(m,0,0,0,(P_RandomRange(0,3)==1) and MT_CYBRAKDEMON or MT_EGGMOBILE)						
					elseif SPAWNED==2 --Spawn Rosy
						SPAWN = P_SpawnMobjFromMobj(m,0,0,0,MT_ROSY)
					elseif SPAWNED==3 --Spawn Bowser.
						SPAWN = P_SpawnMobjFromMobj(m,0,0,0,MT_KOOPA)
					elseif SPAWNED==4 --Spawn Lightning Box
						SPAWN = P_SpawnMobjFromMobj(m,0,0,0, MT_THUNDERCOIN_BOX)								
					end
					if SPAWN and SPAWN.valid
						SPAWNED = $+1
					end
					
				elseif RNG == 8 --Spawn a skin!
				
					local skinlist = {"tails", "knuckles", "fang", "amy"}
					local PICK = skinlist[P_RandomRange(1,4)]
					if PICK and skins[PICK]
						SPAWN = P_SpawnMobjFromMobj(m,0,0,0,MT_TOAD)
						SPAWN.skin = PICK
						SPAWN.state = S_PLAY_STND
						SPAWN.tics,SPAWN.anim_duration = -1,-1
						SPAWN.color = P_RandomRange(1, (#skincolors-1))
					end
				else --Otherwise, spawn something from a list of items.
					local OBJECT = AUDIENCE[P_RandomRange(1,#AUDIENCE)]
					if OBJECT
						SPAWN = P_SpawnMobjFromMobj(m,0,0,0, OBJECT)
					end
				end
				if SPAWN and SPAWN.valid 
					SPAWN.renderflags = $|RF_SEMIBRIGHT|RF_NOCOLORMAPS
					local type = SPAWN.type
					if (type==MT_GFZFISH) or (type==MT_FIREFLOWER) or (type==MT_ROSY) or (SPAWN.flags & MF_MONITOR)
						SPAWN.scale = FRACUNIT
						if (type!=MT_ROSY) and not (SPAWN.flags & MF_MONITOR)
							SPAWN.angle = ANG2*13
							SPAWN.spritexscale = m.spritexscale
							SPAWN.spriteyscale = m.spriteyscale
						end
					else
						local FLAGS = MF_NOCLIP|MF_NOCLIPTHING|MF_NOBLOCKMAP|MF_SCENERY
						if (SPAWN.flags & MF_PUSHABLE)
							FLAGS = SPAWN.flags --Retain ability to be stood on.
						elseif (SPAWN.flags & MF_NOGRAVITY)
							FLAGS = $|MF_NOGRAVITY --Retain this.	
						end
						SPAWN.angle = m.angle
						if SPAWN.skin
							SPAWN.scale = max($, m.scale*4/3)
							FLAGS = $|MF_NOTHINK
						else
							if type==MT_KOOPA --C'mon, King of the Koopas oughta be a lil' big.
								SPAWN.scale = max($,max(m.scale, 3<<16))
								FLAGS = $|MF_NOTHINK
							else
								SPAWN.scale = max(m.scale*4/3, $)
								if (SPAWN.flags & MF_ENEMY)
									S_StopSound(SPAWN)
									FLAGS = $|MF_NOTHINK
									SPAWN.target,SPAWN.tracer = nil,nil
								end
							end	
							SPAWN.spritexscale = max(m.spritexscale*2/3, $)
							SPAWN.spriteyscale = max(m.spriteyscale*2/3, $)
						end
						if not (FLAGS & MF_NOGRAVITY)
							local SEC = m.subsector and m.subsector.sector
							if SEC
								local FLOORZ = (m.eflags & MFE_VERTICALFLIP) and SEC.ceilingheight or SEC.floorheight
								if (abs(SPAWN.z-FLOORZ) < 128<<16)
									SPAWN.z = FLOORZ --Adjust to floorz!
								end
							end
						end
						SPAWN.flags = FLAGS
						SPAWN.momx,SPAWN.momy,SPAWN.momz = 0,0,0
						P_SetMobjStateNF(SPAWN, SPAWN.state)
						SPAWN.tics,SPAWN.anim_duration = -1,-1
					end
				end
			end
			if SPAWN and SPAWN.valid or (RNG < 5) --Remove the Egg Robo?
				if m.tracer and (m.tracer.type == MT_EGGROBO1JET) --Remove these jets too!
					P_RemoveMobj(m.tracer)
				elseif m.target and (m.target.type == MT_EGGROBO1JET)
					P_RemoveMobj(m.target)
				end
				P_RemoveMobj(m)				
			end
		end
	end	
	for m in mobjs.iterate(mobjs) --Remove leftover eggrobo jets, or optimize existing ones.
		if m and m.valid
			local type = m.type
			if (type == MT_EGGROBO1JET)
				if m.target and m.target.valid and (m.target.type == MT_EGGROBO1)
					m.flags = $|MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_NOBLOCKMAP
					m.renderflags = RF_NOCOLORMAPS|RF_SEMIBRIGHT
					m.spriteyoffset = $+22<<16
				else
					P_RemoveMobj(m)
				end		
			elseif type == MT_CEZPOLE1 or type==MT_CEZPOLE2
			or type == MT_CEZBANNER1 or type==MT_CEZBANNER2
				m.flags = ($|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIP|MF_NOTHINK) & ~MF_SOLID
			elseif m.flags==MF_SOLID and (m.info.doomednum==1128 or m.info.doomednum==1129)	
				m.flags = ($|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIP) & ~MF_SOLID	
			elseif (type == MT_EGGSTATUE) or (type==MT_BIGGARGOYLE)
				if (m.z > 777<<16)
					m.flags = ($ & ~MF_PUSHABLE)|MF_SOLID|MF_NOGRAVITY|MF_NOCLIPHEIGHT
					m.radius = $/2
					m.color= (m.x < -15000<<16) and SKINCOLOR_MOONSTONE or SKINCOLOR_ROSEWOOD
					m.colorized = true
				end
			elseif (type == MT_LAMPPOST1)
				m.radius = $/2
				m.renderflags = $|RF_FULLBRIGHT
				if (m.scale >= (2<<16)+39000)
					m.spritexscale = $*5/6
				end
				if DAY==2 or DAY==3
					m.sprite = SPR_XMS4
					m.frame = ($ & ~FF_FRAMEMASK)|B
				end
			elseif (m.type == MT_FLAME)
				m.flags = MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_NOBLOCKMAP|MF_SCENERY
			elseif (m.sprite == SPR_OILF)
				m.flags = MF_NOTHINK|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_NOCLIP|MF_NOGRAVITY|MF_NOBLOCKMAP
			elseif (m.type == MT_PINETREE)
				m.radius = min($, 16<<16) --Don't get in the way.
				m.flags = $|MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOGRAVITY	
			end
		end
	end
end)