// ------------------------------------------
// Lua_Rocket
// This script is pretty much identical to
// how it was in 2.1, unlike the other two
// Though, it does have exploding bustable
// walls now!
// ------------------------------------------
local function ExplodeWalls(mobj)
	local oldx = mobj.x
	local oldy = mobj.y
	local oldz = mobj.z
	local maxdist = 300*mobj.scale
	local oldheight = mobj.height
	mobj.height = 600*mobj.scale
	local dists = 6
	local rots = 32
	local dnum = 0
	while(dnum < dists)
		local dist = (maxdist/dists)*(dnum+1)
		local rnum = 0
		while(rnum < rots)
			local rot = FixedAngle(((360*FRACUNIT)/rots)*rnum)
			P_TeleportMove(mobj, oldx+FixedMul(cos(rot), dist), oldy+FixedMul(sin(rot), dist), oldz-(mobj.height/2))
		//	if(mobj.tics == 23)
		//		P_SpawnMobj(mobj.x, mobj.y, mobj.z+(mobj.height/2), MT_PARTICLE)
		//	end
			// Check for floors
			for rover in mobj.subsector.sector.ffloors()
				if(rover.flags & FF_EXISTS)			// Needs to exist!
					and(rover.flags & FF_BUSTUP)	// And breakable!
					local oldflags = rover.flags
					rover.flags = $1 & !(FF_BLOCKPLAYER|FF_BLOCKOTHERS)		// Make it non solid so we can check if we're inside it!
					if(P_InsideANonSolidFFloor(mobj, rover))				// Inside it?
						rover.flags = oldflags								// Restore its solidity!
						EV_CrumbleChain(mobj.subsector.sector, rover)		// Bust it!
						// Run a linedef executor??
						if(rover.master.flags & ML_EFFECT5)
							P_LinedefExecute(P_AproxDistance(rover.master.dx, rover.master.dy)>>FRACBITS, mobj, mobj.subsector.sector)
						end
					else
						rover.flags = oldflags									// Restore its solidity!
					end
				end
			end
			rnum = $1 + 1
		end
		dnum = $1 + 1
	end
	P_TeleportMove(mobj, oldx, oldy, oldz)
	mobj.height = oldheight
end

addHook("MobjThinker", function(mo)
	
	// Start-up explosion variables
	if(mo.rocketjumped == nil)
		and(mo.state >= S_DOOMSPLODE1)
		and(mo.state <= S_DOOMSPLODE3)
		mo.rocketjumped = false	// So we don't rocket jump twice, making a bad jump
		S_StartSound(mo, sfx_dgrokb)	// Might as well play the sound here, since this should only happen on start
		mo.stockx = mo.x
		mo.stocky = mo.y
		mo.stockz = mo.z
		P_NukeEnemies(mo, mo.target, 300*mo.scale)	// Should change effect
	end
	
	if(mo.state == S_DOOMSPLODE1)
		ExplodeWalls(mo)
		local spikeobj = P_SpawnMobj(mo.x, mo.y, (mo.z+mo.height/2)-(FixedMul(mobjinfo[MT_ROCKETSPIKECOL].height, mo.scale)/2), MT_ROCKETSPIKECOL)
		spikeobj.scale = mo.scale
	end
	
	// Gotta get dat player
	for player in players.iterate do
		if(player.mo)
			and(mo.state >= S_DOOMSPLODE1)
			and(mo.state <= S_DOOMSPLODE3)
			if(P_AproxDistance(P_AproxDistance(player.mo.x - mo.x, player.mo.y - mo.y), player.mo.z - mo.z) <= 300*FRACUNIT)
				and(mo.rocketjumped == false)
				
				player.tgvars.rockethit = true	// Lets the hurt function know we got hit with the rocket
				if(mo.target == player.mo)	// It's our rocket?
					player.tgvars.myrockethit = true		// We dont want to spill our stuff then
				end
				P_DamageMobj(player.mo)	// We're hit!
				
				if(player.mo.health > 0)
					player.mo.state = S_PLAY_FALL	// So you can move, so long as you survived
				end
				
				S_StartSound(mo, sfx_ngskid) // Swooooosh
				
				// If we're on the ground, that's a problem.
				P_TeleportMove(player.mo, player.mo.x, player.mo.y, player.mo.z+FRACUNIT)
				
				local rocketangle1 = R_PointToAngle2(player.mo.x, player.mo.y, mo.x, mo.y)	// Find the angle
				local rocketdist = R_PointToDist2(player.mo.x, player.mo.y, mo.x, mo.y)
				
				if(rocketdist == 0)	// No distance?!
					rocketangle1 = 0	// Fixed!
				end
				
				local rocketangle2 = R_PointToAngle2(rocketdist, player.mo.z, 0, mo.z)		// Find the other angle
				
				if(player.mo.z == mo.z)	// Uh-oh, we're at the same height!
					rocketangle2 = 0	// So there's no angle. This fixes same-height rocket "jumping"
				end
				
				// Now that we have that, lets make tails guy fly!
				P_InstaThrust(player.mo, rocketangle1, cos(rocketangle2)*30)
				player.mo.momz = (-sin(rocketangle2)*30)
				
				if(player.mo.eflags & MFE_UNDERWATER)
					player.mo.momx = ($1*3)/5
					player.mo.momy = ($1*3)/5
					player.mo.momz = ($1*3)/5
				end
				
				mo.rocketjumped = true	// So we can't re-rocket jump
			end
		end
	end
	
end, MT_DOOMROCKET)

addHook("MobjMoveCollide", function(mobj, spike)
	if(spike and spike.valid)
		and(spike.type == MT_SPIKE or spike.type == MT_WALLSPIKE)
	//	and(mobj.z+mobj.height >= spike.z)
	//	and(mobj.z <= spike.z+spike.height)
		and(R_PointToDist2(0, mobj.z+(mobj.height/2), R_PointToDist2(mobj.x, mobj.y, spike.x, spike.y), spike.z+(spike.height/2)) < mobj.radius)
		P_KillMobj(spike)
	end
end, MT_ROCKETSPIKECOL)
