--apparently this makes shit faster? wtf?
local TICRATE = TICRATE
local FRACUNIT = FRACUNIT
local MAXSKINCOLORS = MAXSKINCOLORS
local ANG1 = ANG1
local k_sneakertimer = k_sneakertimer
local k_spinouttimer = k_spinouttimer
local k_wipeoutslow = k_wipeoutslow
local k_driftboost = k_driftboost
local k_floorboost = k_floorboost
local k_startboost = k_startboost
local k_itemamount = k_itemamount
local k_itemtype = k_itemtype
local k_rocketsneakertimer = k_rocketsneakertimer
local k_hyudorotimer = k_hyudorotimer
local k_drift = k_drift
local k_speedboost = k_speedboost
local k_accelboost = k_accelboost
local k_invincibilitytimer = k_invincibilitytimer
local k_growshrinktimer = k_growshrinktimer
local k_throwdir = k_throwdir

freeslot(
"MT_BOMBLIDA",
"MT_BOMBLIDAGLOW",
"MT_BOMBLIDADROP",
"MT_BOMBLIDABALL",
"MT_BOMBLIDALIGHT",
"MT_BOMBLIDASFX",

"MT_SUPERLAZER",
"MT_SUPERLAZERSFX",
"MT_SUPERLAZERBEAM",
"MT_SUPERLAZERBEAMWARN",
"MT_SUPERLAZERBEAMCORE",
"MT_SUPERLAZERBEAMRETICLE",

"SPR_DEBL",
"SPR_DEBE",
"SPR_DEPL",
"SPR_DEBB",
"SPR_DEDR",
"SPR_DEBG",
"SPR_DELL",

"SPR_DESL",
"SPR_DELB",

"S_BOMBLIDALAND",
"S_BOMBLIDAWAIT",
"S_BOMBLIDAEXPLODE",

"S_BOMBLIDALIGHT",

"S_BOMBLIDADROP1",
"S_BOMBLIDADROP2",

"S_BOMBLIDASPLAT1",

"S_BOMBLIDAGLOW",
"S_BOMBLIDABALL",

"S_BOMBLIDASFX",

"S_SUPERLAZERS",
"S_SUPERLAZERSPAWN1",
"S_SUPERLAZERSPAWN2",
"S_SUPERLAZERIDLE",
"S_SUPERLAZERFIRE1",
"S_SUPERLAZERFIRE2",
"S_SUPERLAZERFIRE3",
"S_SUPERLAZERFIRE4",

"S_SUPERLAZERBEAM1",
"S_SUPERLAZERBEAM2",
"S_SUPERLAZERBEAM3",
"S_SUPERLAZERBEAM4",
"S_SUPERLAZERBEAMW",
"S_SUPERLAZERBEAMC",

"sfx_liboex",
"sfx_libola",
"sfx_libfly",
"sfx_liboon",
"sfx_libhit",
"sfx_libpr1",
"sfx_libpr2",

"sfx_scplul",
"sfx_scplur",

"sfx_scprep",
"sfx_scpron",
"sfx_scmaaa"
)

mobjinfo[MT_BOMBLIDA] = {
        doomednum = -1,
        spawnstate = S_BOMBLIDAWAIT,
		deathstate = S_BOMBLIDAEXPLODE,
        spawnhealth = 10000,
        radius = 28*FRACUNIT,
        height = 48*FRACUNIT,
        flags = MF_NOGRAVITY|MF_SOLID--|MF_SHOOTABLE--|MF_SPECIAL
}

mobjinfo[MT_BOMBLIDAGLOW] = {
        doomednum = -1,
        spawnstate = S_BOMBLIDAGLOW,
        spawnhealth = 9999,
        radius = 41*FRACUNIT,
        height = 81*FRACUNIT,
        flags = MF_NOGRAVITY|MF_SCENERY
}

mobjinfo[MT_BOMBLIDADROP] = {
        doomednum = -1,
        spawnstate = S_BOMBLIDADROP1,
        spawnhealth = 9999,
        radius = 16*FRACUNIT,
        height = 8*FRACUNIT,
        flags = MF_SCENERY
}

mobjinfo[MT_BOMBLIDABALL] = {
        doomednum = -1,
        spawnstate = S_BOMBLIDABALL,
        spawnhealth = 9999,
        radius = 134*FRACUNIT,
        height = 128*FRACUNIT,
        flags = MF_NOGRAVITY|MF_SCENERY
}

states[S_BOMBLIDAWAIT] = {
        sprite = SPR_DEBL,
        frame = FF_ANIMATE|A,
        tics = 84,
        nextstate = S_BOMBLIDAWAIT,
		var1 = 21,
		var2 = 4
}

mobjinfo[MT_BOMBLIDASFX] = {
        doomednum = -1,
        spawnstate = S_BOMBLIDASFX,
        spawnhealth = 9000,
        radius = 64*FRACUNIT,
        height = 64*FRACUNIT,
        flags = MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY
}

states[S_BOMBLIDAEXPLODE] = {
        sprite = SPR_DEBE,
        frame = FF_ANIMATE|A,
        tics = 18,
        nextstate = S_NULL,
		var1 = 9,
		var2 = 2
}

states[S_BOMBLIDALAND] = {
        sprite = SPR_DEBL,
        frame = FF_ANIMATE|A,
        tics = 84,
        nextstate = S_BOMBLIDAWAIT,
		var1 = 21,
		var2 = 1
}

states[S_BOMBLIDAGLOW] = {
        sprite = SPR_DEBG,
        frame = FF_FULLBRIGHT|TR_TRANS50|A,
        tics = 9,
        nextstate = S_NULL
}

states[S_BOMBLIDABALL] = {
        sprite = SPR_DEBB,
        frame = FF_ANIMATE|A,
        tics = 9,
        nextstate = S_NULL,
		var1 = 2,
		var2 = 3
}

states[S_BOMBLIDADROP1] = {
        sprite = SPR_DEDR,
        frame = FF_PAPERSPRITE|A,
        tics = -1,
        nextstate = S_BOMBLIDADROP1
}

states[S_BOMBLIDADROP2] = {
        sprite = SPR_DEDR,
        frame = FF_PAPERSPRITE|B,
        tics = -1,
        nextstate = S_BOMBLIDADROP2
}

states[S_BOMBLIDASPLAT1] = {
        sprite = SPR_DEDR,
        frame = FF_PAPERSPRITE|C,
        tics = 75*TICRATE,
        nextstate = S_NULL
}

states[S_BOMBLIDALIGHT] = {
        sprite = SPR_DELL,
        frame = TR_TRANS60|A,
        tics = -1,
        nextstate = S_BOMBLIDALIGHT
}

states[S_BOMBLIDASFX] = {
        sprite = SPR_NULL,
        frame = A,
        tics = TICRATE*8,
        nextstate = S_NULL
}

mobjinfo[MT_SUPERLAZER] = {
        doomednum = -1,
        spawnstate = S_SUPERLAZERSPAWN1,
        spawnhealth = 9000,
        radius = 40*FRACUNIT,
        height = 80*FRACUNIT,
        flags = MF_NOCLIP|MF_NOGRAVITY
}

mobjinfo[MT_SUPERLAZERBEAM] = {
        doomednum = -1,
        spawnstate = S_SUPERLAZERBEAM1,
        spawnhealth = 9000,
        radius = 64*FRACUNIT,
        height = 64*FRACUNIT,
        flags = MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY		--collision is not done via the mobjs anyways
}

mobjinfo[MT_SUPERLAZERBEAMWARN] = {
        doomednum = -1,
        spawnstate = S_SUPERLAZERBEAMW,
        spawnhealth = 9000,
        radius = 64*FRACUNIT,
        height = 64*FRACUNIT,
        flags = MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY		--collision is not done via the mobjs anyways
}


mobjinfo[MT_SUPERLAZERBEAMCORE] = {
        doomednum = -1,
        spawnstate = S_SUPERLAZERBEAMC,
        spawnhealth = 9000,
        radius = 64*FRACUNIT,
        height = 64*FRACUNIT,
        flags = MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY		--collision is not done via the mobjs anyways
}

mobjinfo[MT_SUPERLAZERBEAMRETICLE] = {
        doomednum = -1,
        spawnstate = S_SUPERLAZERBEAMW,
        spawnhealth = 9000,
        radius = 64*FRACUNIT,
        height = 64*FRACUNIT,
        flags = MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY
}

mobjinfo[MT_SUPERLAZERSFX] = {
        doomednum = -1,
        spawnstate = S_SUPERLAZERS,
        spawnhealth = 9000,
        radius = 64*FRACUNIT,
        height = 64*FRACUNIT,
        flags = MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY
}


states[S_SUPERLAZERS] = {
        sprite = SPR_NULL,
        frame = A,
        tics = TICRATE*8,
        nextstate = S_NULL
}

states[S_SUPERLAZERSPAWN1] = {
        sprite = SPR_DESL,
        frame = E,
        tics = 1,
        nextstate = S_SUPERLAZERSPAWN2
}

states[S_SUPERLAZERSPAWN2] = {
        sprite = SPR_DESL,
        frame = D,
        tics = 2,
        nextstate = S_SUPERLAZERIDLE
}

states[S_SUPERLAZERIDLE] = {
        sprite = SPR_DESL,
        frame = A,
        tics = 1,
        nextstate = S_SUPERLAZERIDLE
}

states[S_SUPERLAZERFIRE1] = {
        sprite = SPR_DESL,
        frame = A,
        tics = 2,
        nextstate = S_SUPERLAZERFIRE2
}

states[S_SUPERLAZERFIRE2] = {
        sprite = SPR_DESL,
        frame = B,
        tics = 2,
        nextstate = S_SUPERLAZERFIRE3
}

states[S_SUPERLAZERFIRE3] = {
        sprite = SPR_DESL,
        frame = C,
        tics = 2,
        nextstate = S_SUPERLAZERFIRE4
}

states[S_SUPERLAZERFIRE4] = {
        sprite = SPR_DESL,
        frame = B,
        tics = 2,
        nextstate = S_SUPERLAZERFIRE1
}


states[S_SUPERLAZERBEAM1] = {
        sprite = SPR_DELB,
        frame = FF_FULLBRIGHT|FF_PAPERSPRITE|TR_TRANS50|B,
        tics = 2,
        nextstate = S_SUPERLAZERBEAM2,
		Action = A_GhostMe
}

states[S_SUPERLAZERBEAM2] = {
        sprite = SPR_DELB,
        frame = FF_FULLBRIGHT|FF_PAPERSPRITE|TR_TRANS20|C,
        tics = 2,
        nextstate = S_SUPERLAZERBEAM3,
		Action = A_GhostMe
}

states[S_SUPERLAZERBEAM3] = {
        sprite = SPR_DELB,
        frame = FF_FULLBRIGHT|FF_PAPERSPRITE|TR_TRANS30|D,
        tics = 2,
        nextstate = S_SUPERLAZERBEAM4,
		Action = A_GhostMe
}

states[S_SUPERLAZERBEAM4] = {
        sprite = SPR_DELB,
        frame = FF_FULLBRIGHT|FF_PAPERSPRITE|TR_TRANS40|E,
        tics = 2,
        nextstate = S_SUPERLAZERBEAM1,
		Action = A_GhostMe
}

states[S_SUPERLAZERBEAMW] = {
        sprite = SPR_DELB,
        frame = FF_FULLBRIGHT|FF_PAPERSPRITE|F,
        tics = -1,
        nextstate = S_SUPERLAZERBEAMW,
}

states[S_SUPERLAZERBEAMC] = {
        sprite = SPR_DELB,
        frame = FF_FULLBRIGHT|TR_TRANS70|A,
        tics = -1,
        nextstate = S_SUPERLAZERBEAMC,
}

sfxinfo[sfx_libpr1] = {
        singular = false,
        flags = SF_X4AWAYSOUND
}

sfxinfo[sfx_libpr2] = {
        singular = false,
        flags = SF_X4AWAYSOUND
}

sfxinfo[sfx_libfly] = {
        singular = false,
        flags = SF_X2AWAYSOUND|SF_X4AWAYSOUND|SF_X8AWAYSOUND|SF_NOMULTIPLESOUND
}

sfxinfo[sfx_liboex] = {
        singular = false,
        flags = SF_X4AWAYSOUND
}

sfxinfo[sfx_scprep] = {
        singular = false,
        flags = SF_X4AWAYSOUND|SF_X8AWAYSOUND
}

sfxinfo[sfx_scpron] = {
        singular = false,
        priority = 64,
        flags = SF_X2AWAYSOUND|SF_X4AWAYSOUND|SF_X8AWAYSOUND|SF_NOMULTIPLESOUND
}

sfxinfo[sfx_scmaaa] = {
        singular = false,
        priority = 64,
        flags = SF_X2AWAYSOUND|SF_X4AWAYSOUND|SF_X8AWAYSOUND|SF_NOMULTIPLESOUND
}



rawset(_G, "deli_inkballexp", function(x, y, z, col)
	local sfx = P_SpawnMobj(x, y, z, MT_BOMBLIDASFX)
	S_StartSound(sfx, sfx_liboex)
	
	local glow = P_SpawnMobj(x, y, z, MT_BOMBLIDAGLOW)
	glow.scale = FRACUNIT
	glow.destscale = 0
	glow.color = col
	
	local ball = P_SpawnMobj(x, y, z, MT_BOMBLIDABALL)
	ball.scale = FRACUNIT
	ball.destscale = 3*FRACUNIT
	ball.scalespeed = 22*FRACUNIT/100
	ball.color = col
	
	for i = 1, 16
		local d = P_SpawnMobj(x, y, z+40*mapobjectscale, MT_BOMBLIDADROP)
		d.state = S_BOMBLIDADROP1
		d.angle = (ANG1*(360/16))*i + P_RandomRange(-4, 4)*ANG1
		P_InstaThrust(d, d.angle, P_RandomRange(8, 15)*(mapobjectscale))
		P_SetObjectMomZ(d, P_RandomRange(2, 5)*FRACUNIT)
		d.destscale = 2*FRACUNIT/3
		d.scalespeed = FRACUNIT/32
		d.color = col
	end
	
	for i = 1, 8
		local d = P_SpawnMobj(x, y, z+32*mapobjectscale, MT_BOMBLIDADROP)
		d.state = S_BOMBLIDADROP2
		d.angle = (ANG1*(360/8))*i + P_RandomRange(-5, 5)*ANG1
		P_InstaThrust(d, d.angle, P_RandomRange(6, 10)*(mapobjectscale))
		P_SetObjectMomZ(d, P_RandomRange(4, 10)*FRACUNIT)
		d.color = col
	end
	
	local d = P_SpawnMobj(x, y, z+32*mapobjectscale, MT_BOMBLIDADROP)
	d.state = S_BOMBLIDADROP2
	d.angle = P_RandomRange(0, 360)*ANG1
	d.scale = 3*mapobjectscale/2
	P_InstaThrust(d, d.angle, P_RandomRange(0, 2)*(mapobjectscale))
	P_SetObjectMomZ(d, P_RandomRange(4, 8)*FRACUNIT)
	d.color = col
end)

local waterPuddleNumIters = 8

--taken from elem's stuff
local function spawnPuddlePart(user, iter, scale, col)
	local base = (FixedDiv(iter*FRACUNIT, (waterPuddleNumIters)*FRACUNIT/2)-FRACUNIT)
	local sc = FixedMul(user.scale, scale) - FixedMul(base,base)
	local dist = 8*FRACUNIT
	
	local travelangle = R_PointToAngle2(0, 0, user.momx, user.momy)
	
	local newx = user.x + P_ReturnThrustX(user, travelangle + 180*ANG1, FixedMul((iter)*16*FRACUNIT/4, FixedMul(user.scale, scale))) + P_ReturnThrustX(user, travelangle + 90*ANG1, FixedMul(dist, sc))
	local newy = user.y + P_ReturnThrustY(user, travelangle + 180*ANG1, FixedMul((iter)*16*FRACUNIT/4, FixedMul(user.scale, scale))) + P_ReturnThrustY(user, travelangle + 90*ANG1, FixedMul(dist, sc))
	
	local work = P_SpawnMobj(newx, newy, user.z, MT_THOK)
	work.state = S_BOMBLIDASPLAT1
	work.angle = travelangle + 90*ANG1
	work.scale = sc
	work.color = col
	work.z = work.floorz
	
	newx = user.x + P_ReturnThrustX(user, travelangle + 180*ANG1, FixedMul((iter)*16*FRACUNIT/4, FixedMul(user.scale, scale))) + P_ReturnThrustX(user, travelangle + 90*ANG1, FixedMul(-dist, sc))
	newy = user.y + P_ReturnThrustY(user, travelangle + 180*ANG1, FixedMul((iter)*16*FRACUNIT/4, FixedMul(user.scale, scale))) + P_ReturnThrustY(user, travelangle + 90*ANG1, FixedMul(-dist, sc))
	
	work = P_SpawnMobj(newx, newy, user.z, MT_THOK)
	work.state = S_BOMBLIDASPLAT1
	work.angle = travelangle + (90+180)*ANG1
	work.scale = sc
	work.color = col
	work.z = work.floorz
end

local function spawnPuddle(user, scale, col)
	local i = 0
	while i < waterPuddleNumIters do
		spawnPuddlePart(user, i, scale, col)
		i = $ + 1
	end
end

addHook("MobjThinker", function(mo)
	if mo.eflags & MFE_JUSTHITFLOOR then
		spawnPuddle(mo, 3*mapobjectscale/2 + FixedMul(P_RandomFixed()*2, mapobjectscale), mo.color)
		mo.state = S_NULL
	end
end, MT_BOMBLIDADROP)

rawset(_G, "deli_lidabombs", {})

rawset(_G, "deli_createlidabomb", function(sx, sy, sz, col, ang, loc)
	if (not server.deli_lidabombs[loc]) then
		local b
		if loc <= 4 then		--TODO: set these positions to be the choppers'
			b = P_SpawnMobj(2816*FRACUNIT, -1472*FRACUNIT, 800*FRACUNIT, MT_BOMBLIDA)
			b.frompos = {x = 2816*FRACUNIT, y = -1472*FRACUNIT, z = 800*FRACUNIT}
			if (battleplus) and server.bp_teamgamemode == 0 then
				b.color = SKINCOLOR_RED
			else
				b.color = col
			end
		else
			b = P_SpawnMobj(-2816*FRACUNIT, 1472*FRACUNIT, 800*FRACUNIT, MT_BOMBLIDA)
			b.frompos = {x = -2816*FRACUNIT, y = 1472*FRACUNIT, z = 800*FRACUNIT}
			if (battleplus) and server.bp_teamgamemode == 0 then
				b.color = SKINCOLOR_BLUE
			else
				b.color = col
			end
		end
		b.spawntime = leveltime
		b.topostics = TICRATE*3
		b.toposticsD = 0
		b.topos = {x = sx, y = sy, z = sz}
		b.angle = ang
		server.deli_lidabombs[loc] = b		--position from mid to back, 1 - 4 = alpha, 5 - 8 = bravo
		b.id = loc
	end
end)

addHook("NetVars", function(net)
	server.deli_lidabombs = net(server.deli_lidabombs)
end)