
freeslot("sfx_bmep", "sfx_bmsw", "MT_BOMB_BOOM", "SPR_BMSW", "SPR_BMSC")

sfxinfo[sfx_bmep].caption = "Explode"
sfxinfo[sfx_bmsw].caption = "Shockwave"

addHook("PlayerSpawn", function(player)// bom
local explodetime = 0
player.explodetime = 0
end)

addHook("PlayerThink", function(player)
//print(player.explodetime)
if player.mo and (player.mo.skin == "bombbird")//stuff
player.explodetime = $ or 0

if (leveltime%70 <= 35) and player.powers[pw_shield] & SH_PROTECTELECTRIC
local light = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_THOK)
light.sprite = SPR_BMSW
light.tics = 2
light.frame = (((leveltime+1)/3)%9) | FF_FULLBRIGHT | FF_TRANS50
// 3 is "delay", and 9 is frame amounts
light.color = SKINCOLOR_BLUE
end

if (player.explodetime < 0)
player.explodetime = 0
end
if (player.explodetime > 0)
if player.powers[pw_super]
player.explodetime = $ - 4
else
player.explodetime = $ - 2
end // the smoke effect
local smoky = P_SpawnMobjFromMobj(player.mo, 0, 0, 50*FRACUNIT, MT_SMOKE)
smoky.momx = P_RandomRange(-1, 1)*FRACUNIT
smoky.momy = P_RandomRange(-1, 1)*FRACUNIT
smoky.momz = P_RandomRange(-1, 1)*FRACUNIT
end
if (player.explodetime > 150) or (player.explodetime <= 0)
player.mo.color = player.skincolor
else
if	not	(player.powers[pw_shield] & SH_PROTECTELECTRIC)
if (player.explodetime > 100)// getting explodsive
player.mo.color = SKINCOLOR_BROWN
elseif (player.explodetime > 50) and (player.explodetime < 100)
player.mo.color = SKINCOLOR_RED
elseif (player.explodetime < 50)
player.mo.color = SKINCOLOR_ORANGE
end
else
if (player.explodetime > 100)// the power of electricity
player.mo.color = SKINCOLOR_DUSK
elseif (player.explodetime > 50) and (player.explodetime < 100)
player.mo.color = SKINCOLOR_BLUE
elseif (player.explodetime < 50)
player.mo.color = SKINCOLOR_CYAN
end
end

end
end
end)

local function BombBirdExplodeFX(player, where, shock)
for n = -1,1 do
for i = 0,16 do
local boom = P_SpawnMobjFromMobj(where, 0, 0, (n*15)*FRACUNIT, MT_BOMB_BOOM)
boom.momz = (n*15)*FRACUNIT
boom.angle = (i*22)*ANG1
boom.tics = 6
boom.flags = $|MF_MISSILE
boom.target = player.mo
boom.scale = player.mo.scale
P_InstaThrust(boom, (i*22)*ANG1, 15*FRACUNIT)
if shock == true
boom.sprite = SPR_THOK
boom.frame = A|FF_TRANS50
boom.color = SKINCOLOR_BLUE
boom.tics = 35
else
boom.sprite = SPR_ADST
boom.frame = D|FF_TRANS30
end

local boom = P_SpawnMobjFromMobj(where, 0, 0, (n*10)*FRACUNIT, MT_BOMB_BOOM)
boom.momz = (n*10)*FRACUNIT
boom.angle = (i*22)*ANG1
boom.tics = 6
boom.flags = $|MF_MISSILE
boom.target = player.mo
boom.scale = player.mo.scale
P_InstaThrust(boom, (i*22)*ANG1, 30*FRACUNIT)
if shock == true
boom.sprite = SPR_THOK
boom.frame = A|FF_TRANS50
boom.color = SKINCOLOR_BLUE
boom.tics = 35
else
boom.sprite = SPR_ADST
boom.frame = D|FF_TRANS30
end
end

local boom = P_SpawnMobjFromMobj(where, 0, 0, (n*-15)*FRACUNIT, MT_BOMB_BOOM)
boom.momz = (n*15)*FRACUNIT
boom.angle = (i*22)*ANG1
boom.tics = 6
boom.flags = $|MF_MISSILE
boom.target = player.mo
boom.scale = player.mo.scale
P_InstaThrust(boom, (i*22)*ANG1, 15*FRACUNIT)
if shock == true
boom.sprite = SPR_THOK
boom.frame = A|FF_TRANS50
boom.color = SKINCOLOR_BLUE
boom.tics = 35
else
boom.sprite = SPR_ADST
boom.frame = D|FF_TRANS30
end
end




if shock == true
S_StartSound(where, sfx_bmsw, player)
else
S_StartSound(where, sfx_bmep, player)
end
end
/*/
if player.powers[pw_shield] & SH_PROTECTELECTRIC
end
/*/

addHook("SpinSpecial", function(player)
if player.mo and (player.mo.skin == "bombbird")// KABOOM!
if player.explodetime == 0 and player.powers[pw_nocontrol] == 0
and not (player.pflags & PF_JUMPSTASIS or player.pflags & PF_STASIS or player.pflags & PF_FULLSTASIS) 
if player.powers[pw_shield] & SH_PROTECTELECTRIC
BombBirdExplodeFX(player, player.mo, true)
else
BombBirdExplodeFX(player, player.mo, false)
end

if player.powers[pw_shield] & SH_PROTECTELECTRIC
local light = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_THOK)
light.sprite = SPR_BMSC
light.rollangle = P_RandomRange(0, 360)*ANG1
light.tics = 32
light.frame = P_RandomRange(0, 3) | FF_FULLBRIGHT | FF_TRANS20
light.color = SKINCOLOR_BLUE
end

player.powers[pw_flashing] = 20
if player.speed > 5*FRACUNIT
P_Thrust(player.mo, player.drawangle, player.speed+20*FRACUNIT)
end
player.explodetime = 160
end
end
end)

addHook("AbilitySpecial", function(player)
if player.mo and (player.mo.skin == "bombbird")// KABOOM!
if player.explodetime == 0 and player.powers[pw_nocontrol] == 0
and not (player.pflags & PF_JUMPSTASIS or player.pflags & PF_STASIS or player.pflags & PF_FULLSTASIS) 
if player.powers[pw_shield] & SH_PROTECTELECTRIC
BombBirdExplodeFX(player, player.mo, true)
else
BombBirdExplodeFX(player, player.mo, false)
end

if player.powers[pw_shield] & SH_PROTECTELECTRIC
local light = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_THOK)
light.sprite = SPR_BMSC
light.rollangle = P_RandomRange(0, 360)*ANG1
light.tics = 32
light.frame = P_RandomRange(0, 3) | FF_FULLBRIGHT | FF_TRANS20
light.color = SKINCOLOR_BLUE
end

for i = 0, 15 do
local minefs = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_THOK)
minefs.sprite = SPR_FETR
minefs.tics = 10
minefs.color = player.mo.color
minefs.frame = P_RandomRange(A,F)
minefs.target = player.mo
minefs.rollangle = P_RandomRange(0, 360)*ANG1
minefs.momx = P_RandomRange(-2, 2)*FRACUNIT
minefs.momy = P_RandomRange(-2, 2)*FRACUNIT
minefs.momz = P_RandomRange(-2, 2)*FRACUNIT
end

player.powers[pw_flashing] = 20
P_Thrust(player.mo, player.drawangle, 10*FRACUNIT)
P_SetObjectMomZ(player.mo, 20*FRACUNIT, false)
player.explodetime = 160
end
end
end)

/*/
this crashed battlemod when parrying

addHook("MobjDamage", function(mobj)
if mobj.player.mo and (mobj.player.mo.skin == "bombbird")//"I will wipe that grin off their stupid faces or my name isn't...DA BOMB!"
for n = -1,1 do
for i = 0,16 do//spawn fx into a ball
local woosh = P_SpawnMobj(mobj.player.mo.x, mobj.player.mo.y, mobj.player.mo.z, MT_BOMBIRFX)
woosh.angle = (i*22)*ANG1
woosh.momz = (n*10)*FRACUNIT
woosh.scale = mobj.player.mo.scale
P_InstaThrust(woosh, (i*40)*ANG1, 15*FRACUNIT)
local boom = P_SpawnMobj(mobj.player.mo.x, mobj.player.mo.y, mobj.player.mo.z, MT_BOMB_BOOM)
boom.momz = (n*10)*FRACUNIT
boom.angle = (i*22)*ANG1
boom.tics = 6
boom.target = mobj.player.mo
boom.scale = mobj.player.mo.scale
P_InstaThrust(boom, (i*22)*ANG1, 30*FRACUNIT)
end
local woosh = P_SpawnMobj(mobj.player.mo.x, mobj.player.mo.y, mobj.player.mo.z, MT_BOMBIRFX)
woosh.angle = P_RandomRange(0, 360)*ANG1
woosh.momz = (n*30)*FRACUNIT
woosh.scale = mobj.player.mo.scale
end //now spawn the real bomb
S_StartSound(mobj.player.mo, sfx_bmep, mobj.player)
P_RadiusAttack(mobj.player.mo, mobj.player.mo, 128*FRACUNIT, DMG_FIRE, true)
mobj.player.explodetime = 150
end
end, MT_PLAYER)
//
addHook("MobjDamage", function(mobj) //boom
if (mobj.player.mo.skin == "bombbird")
mobj.player.explodetime = 0
end
end, MT_PLAYER)
/*/

// the code, ironicly from pig by chargingturnip, originally for the drill
// really useful ngl
local function BreakTouchWall(mobj, sectorthing, destroy)
	for fof in sectorthing.ffloors()
		if fof.valid and (fof.flags & FF_BUSTUP) and (fof.flags & FF_EXISTS)
			local foffloor = fof.topheight
			local fofceiling = fof.bottomheight
			if fof.b_slope and fof.b_slope.valid
				fofceiling = P_GetZAt(fof.b_slope, mobj.x, mobj.y)
			end
			if fof.t_slope and fof.t_slope.valid
				foffloor = P_GetZAt(fof.t_slope, mobj.x, mobj.y)
			end
			if foffloor >= mobj.z and fofceiling <= mobj.z+mobj.height
				if destroy then // simply for checking if a wall if viable
					EV_CrumbleChain(nil, fof)
					if fof.master.flags & ML_EFFECT5
						P_LinedefExecute(P_AproxDistance(fof.master.dx, fof.master.dy)>>FRACBITS, mobj, sectorthing)
					end
				end
				return true
			end
		end	
	end
end
	
// "projectiles"
addHook("MobjThinker", function(mobj)
BreakTouchWall(mobj, mobj.subsector.sector, true)
end, MT_BOMB_BOOM)

addHook("MobjThinker", function(mobj) //dvwavecdvcsadaecs
if mobj.valid
if mobj.sprite == SPR_BMSC
mobj.rollangle = P_RandomRange(0, 360)*ANG1
mobj.frame = P_RandomRange(0, 3)
mobj.scale = $ + FRACUNIT/10
if mobj.tics < 30 and mobj.tics > 20
mobj.frame = $|FF_TRANS30|FF_FULLBRIGHT
elseif mobj.tics < 20 and mobj.tics > 10
mobj.frame = $|FF_TRANS40|FF_FULLBRIGHT
elseif mobj.tics < 10 and mobj.tics > 0
mobj.frame = $|FF_TRANS70|FF_FULLBRIGHT
else
mobj.frame = $|FF_FULLBRIGHT
end
end
end
end, MT_THOK)

addHook("MobjMoveCollide", function(mobj, hit)
if(mobj.z+mobj.height >= hit.z) //height
 and(mobj.z <= hit.z+hit.height)
if hit.flags & MF_PUSHABLE //push enemies and pushables
P_InstaThrust(hit, mobj.angle, 20*FRACUNIT)
elseif hit.type == MT_PLAYER and hit.player.mo != mobj.target.player.mo // and players
if (gametyperules & GTR_FRIENDLY)// if they're friendly
hit.player.powers[pw_flashing] = 2*TICRATE //be safer
P_InstaThrust(hit, mobj.angle, 5*FRACUNIT)
elseif hit.player.powers[pw_super] //nerf if super
P_InstaThrust(hit, mobj.angle, 1*FRACUNIT)
elseif hit.player.ctfteam != mobj.target.player.ctfteam //the same team?
P_DoPlayerPain(hit.player, mobj, mobj.target)//get out
P_InstaThrust(hit, mobj.angle, 25*FRACUNIT)
P_DamageMobj(hit, mobj, mobj.target, 1)
end
elseif hit.flags & MF_ENEMY or hit.flags & MF_BOSS or hit.flags & MF_SHOOTABLE or hit.flags & MF_MONITOR// just break'em
P_DamageMobj(hit, mobj, mobj.target, 1)
end
end
end, MT_BOMB_BOOM)

	
	
