// An attempt to make a tornado.

// Tornado Freeslots
freeslot("MT_TORNADO", "S_TORNADO", "MT_TORNADOPARTICLE", "S_TORNADOPARTICLE", "SPR_TRND")

mobjinfo[MT_TORNADO] = {
    spawnstate = S_TORNADO,
    radius = 60*FRACUNIT,
    height = 300*FRACUNIT,
    flags = MF_SCENERY
}

states[S_TORNADO] = {SPR_NULL, A, 1, A_SomeSortOfDustDevilBootlegLOL, 0, 0, S_TORNADO}

mobjinfo[MT_TORNADOPARTICLE] = {
    spawnstate = S_TORNADOPARTICLE,
    radius = 1*FRACUNIT,
    height = 1*FRACUNIT,
	flags = MF_NOGRAVITY|MF_FLOAT
}

states[S_TORNADOPARTICLE] = {SPR_TRND, FF_PAPERSPRITE|A, TICRATE, A_TornadoParticle, 0, 0, S_NULL}

// MobjCollides
addHook("MobjCollide", function(mo, mo2)
	if (mo.valid and mo2.valid)
		if mo2.type == MT_TORNADO
		and mo2.z <= mo.z + P_GetPlayerHeight(mo.player)
			mo.momz = 10*FRACUNIT
			P_Thrust(mo, P_RandomRange(0, 360)*FRACUNIT, 5*FRACUNIT)
			mo.player.kartstuff[k_spinouttimer] = TICRATE
		end
	end
end, MT_PLAYER)

// MobjThinkers
addHook("MobjThinker", function(mo)
	if (leveltime % 3 == 0)
		local tornado = P_SpawnMobj(mo.x + (mo.radius - P_RandomRange(0, mo.radius/FRACUNIT)*FRACUNIT), mo.y + (mo.radius - P_RandomRange(0, mo.radius/FRACUNIT)*FRACUNIT), mo.z, MT_TORNADOPARTICLE)
		tornado.scale = mo.scale
		tornado.angle = P_RandomRange(0, 360)*ANG1
		tornado.tracer = mo
		tornado.fuse = 2*TICRATE
		tornado.momz = $ + 10*FRACUNIT
	end

	if not S_SoundPlaying(mo, sfx_s3kcel) then S_StartSound(mo, sfx_s3kcel) end

	if not mo.target then A_FindTarget(mo, MT_PLAYER) end

	for p in players.iterate do
		if (p and p.valid and p.mo and p.mo.valid)
			if P_CheckSight(mo, p.mo) and mo.nopull ~= true
				local ang = R_PointToAngle2(mo.x, mo.y, p.mo.x, p.mo.y)
				p.mo.momx = $ - cos(ang) / 6
				p.mo.momy = $ - sin(ang) / 6
				if (p.mo == mo.target)
					mo.momx = 3 * cos(ang)
					mo.momy = 3 * sin(ang)
				end
			end
		end
	end
end, MT_TORNADO)

addHook("MobjThinker", function(mo)
	mo.angle = $1 + 5*ANG2
	P_InstaThrust(mo, mo.angle+ANGLE_90, 10*FRACUNIT)
end, MT_TORNADOPARTICLE)
