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

local function LightupArea(mobj, brightness)
		if mobj.subsector.sector.lightlevel < brightness
			P_SpawnLightningFlash(mobj.subsector.sector)
			mobj.subsector.sector.lightlevel = brightness
		end
		for f in mobj.subsector.sector.ffloors()
			if f.valid and (f.flags & FF_EXISTS)
			and (f.bottomheight >= mobj.z
			or (mobj.z < f.topheight
			and mobj.z+mobj.height > f.bottomheight))
			and f.sector.valid and f.sector.lightlevel <  brightness
			P_SpawnLightningFlash(f.sector)
			f.sector.lightlevel = brightness
			end
			end
end
			
addHook("PlayerThink", function(player)
//print(player.explodetime)
if player.mo and (player.mo.skin == "bombbird")//stuff
player.explodetime = $ or 0

if (leveltime%63 <= 18) 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+2)/2)%9) | FF_FULLBRIGHT | FF_TRANS50
// 2 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
LightupArea(player.realmo, 190)
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)
if not player.powers[pw_super]
player.mo.color = player.skincolor
else
player.mo.color = SKINCOLOR_SUPERCARBON
end
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)
if shock == false
local explode = P_SpawnMobjFromMobj(where, 0, 0, 0, MT_FBOMB)
P_KillMobj(explode, explode, explode, 127)
end
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.target = player.mo
boom.scale = player.mo.scale
boom.flags = $|MF_MISSILE
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.target = player.mo
boom.scale = player.mo.scale
boom.flags = $|MF_MISSILE
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.target = player.mo
boom.scale = player.mo.scale
boom.flags = $|MF_MISSILE
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
LightupArea(player.mo, 255)
if shock == true
P_RadiusAttack(player.mo, player.mo, 128*FRACUNIT, DMG_ELECTRIC, true)
S_StartSound(where, sfx_bmsw, player)
else
P_RadiusAttack(player.mo, player.mo, 128*FRACUNIT, DMG_FIRE, true)
S_StartSound(where, sfx_bmep, player)
end
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.exiting)
and not (player.pflags & PF_JUMPSTASIS or player.pflags & PF_STASIS or player.pflags & PF_FULLSTASIS) 
FeatherSpawn(player.mo, 15, player.mo)
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.exiting)
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

FeatherSpawn(player.mo, 15, player.mo)

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

local function FindShockTarget(mobj)
if (mobj.flags & MF_SPRING) or (mobj.type == MT_PLAYER) or (mobj.flags & MF_PUSHABLE)
or (mobj.flags & MF_NOCLIP) or (mobj.flags & MF_NOCLIPTHING) or (mobj.flags & MF_MONITOR)
or (mobj.flags & MF_SCENERY) 
        return false
elseif (mobj.flags & MF_ENEMY) or (mobj.flags & MF_BOSS) or (mobj.flags & MF_SHOOTABLE)
        return true
    else
        return false
end
end

	
// "projectiles"
addHook("MobjThinker", function(mobj)
LightupArea(mobj, 128)
if mobj.sprite == SPR_THOK
searchBlockmap("objects", function(ref, found) //it finds enemies and tries to end them
if FindShockTarget(found) then
if P_CheckSight(mobj, found) and R_PointToDist2(mobj.x, mobj.y, found.x, found.y) <= 1505*FRACUNIT then
if found.extravalue1 != 1//extravalue1 moment
mobj.tracer = found
mobj.tics = 70
found.extravalue1 = 1
mobj.color = SKINCOLOR_CYAN
elseif mobj.tracer != nil//found something, rush to it.
P_HomingAttack(mobj, mobj.tracer)
else
found.extravalue1 = 0
mobj.color = SKINCOLOR_BLUE
end
return true
end
end
end, mobj, mobj.x-1505*FRACUNIT, mobj.x+1505*FRACUNIT, mobj.y-1505*FRACUNIT, mobj.y+1505*FRACUNIT)
end
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)
if mobj.sprite == SPR_THOK
P_DamageMobj(hit, mobj, mobj.target, DMG_ELECTRIC)
else
P_DamageMobj(hit, mobj, mobj.target, 1)
end
end
elseif hit.flags & MF_ENEMY or hit.flags & MF_BOSS or hit.flags & MF_SHOOTABLE or hit.flags & MF_MONITOR// just break'em
if mobj.sprite == SPR_THOK
mobj.tracer = nil
mobj.color = SKINCOLOR_BLUE
end
P_DamageMobj(hit, mobj, mobj.target, 1)
end
end
end, MT_BOMB_BOOM)

	
	
