
freeslot("SPR_RMFR",
"MT_RED_SCREECH", "S_RED_YELL", "MT_RED_TWODAIM",
"sfx_rdyel1" ,"sfx_rdyel2", "sfx_rdyel3",
"sfx_rdyel4" ,"sfx_rdyel5", "sfx_rdyel6", "sfx_rdyels")

sfxinfo[sfx_rdyel1].caption = "CAAAA!"
sfxinfo[sfx_rdyel2].caption = "CA-CAWWW!"
sfxinfo[sfx_rdyel3].caption = "CA-CAWWWK!"
sfxinfo[sfx_rdyel4].caption = "YAAAAAA!"
sfxinfo[sfx_rdyel5].caption = "YAAAaa!"
sfxinfo[sfx_rdyel6].caption = "YAaaaa!"
sfxinfo[sfx_rdyels].caption = "WOA-HAaa!"
//excesive? yes, cool or neat? maybe.

local function L_ChooseRandom(...)
	local args = {...}
	local choice = P_RandomRange(1,#args)
	return args[choice]
end

addHook("PlayerSpawn", function(player) //feathers!
local feathertime = 0
player.feathertime = 0
local redscreamtime = 0
player.redscreamtime = 0
local featherfunction = 0
player.featherfunction = 0
local twodaim = 0
player.twodaim = 0
local aimingtarget = 0
player.aimingtarget = 0
end)

addHook("PlayerThink", function(player) //wait, feathers!?
if player.mo
player.feathertime = $ or 0
player.redscreamtime = $ or 0
player.featherfunction = $ or 0
player.twodaim = $ or 0
player.aimingtarget = $ or 0
if (player.mo.skin == "redbird")// is the red cardinal
if player.redscreamtime > 0
if player.redscreamtime < 2
S_StartSound(player.mo, sfx_s257, player)
P_SpawnParaloop(player.mo.x, player.mo.y, player.mo.z + (player.mo.height/2),
10*FRACUNIT, 16, MT_NIGHTSPARKLE, 180*ANGLE_22h, MT_NULL, false)
end
player.redscreamtime = $ - 1
end
if player.feathertime != 0 and not(player.pflags & PF_THOKKED)
player.feathertime = $1 - 1
end
if not player.powers[pw_super] and (player.featherfunction == 1)
player.featherfunction = 0
end
if (player.pflags & PF_THOKKED)
if (player.feathertime == 0) and (player.featherfunction == 0)
for i = 1,6 do
local why = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_THOK)
why.color = player.mo.color
why.angle = FixedAngle((60*i)*FRACUNIT)
why.state = S_MIGHTYFEATHERS
why.sprite = SPR_RMFR
why.rollangle = P_RandomRange(0,360)*ANG1
why.scale = player.mo.scale
why.momx = 0
why.momy = 0
why.frame = A
why.target = player.mo
why.flags = $|MF_NOGRAVITY
end
player.feathertime = 30
if player.powers[pw_super]
player.featherfunction = 1
else
player.featherfunction = 0
end
end
end
end
end
end)

addHook("MobjDamage", function(mobj) 
if (mobj.player.mo.skin == "redbird")
mobj.player.feathertime = 0
end
end, MT_PLAYER)

addHook("AbilitySpecial", function(player) //fly, kinda
if player.mo
if (player.mo.skin == "redbird")
and not (player.mo.flags2 & MF2_TWOD)
and not (twodlevel)
if (player.feathertime != 0)
player.feathertime = 30
elseif (player.pflags & PF_THOKKED)
if (player.aiming/ANG2) > 40
player.mo.momz = 40*FRACUNIT
elseif (player.aiming/ANG2) < -40
player.mo.momz = -40*FRACUNIT
end
else
player.mo.momz = (player.aiming/ANG2)*FRACUNIT
end
end
end
end)

addHook("PlayerThink", function(player)// aiming in 2d mode!
if player.mo
//print(player.twodaim)
and (player.mo.skin == "redbird")
if ((player.mo.flags2 & MF2_TWOD) or (twodlevel))
if player.aimingtarget == 0
player.aimingtarget = 1
local redical = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_RED_TWODAIM)
redical.target = player.mo
end
if (player.cmd.forwardmove > 0)
if (player.twodaim < 40)
player.twodaim = $ + 10
end
elseif (player.cmd.forwardmove < 0)
if (player.twodaim > -40)
player.twodaim = $ - 10
end
end
elseif player.aimingtarget == 1
player.aimingtarget = 0
end
else
end
end)

addHook("AbilitySpecial", function(player)// the 2dmode flight
if player.mo
if (player.mo.skin == "redbird") and ((player.mo.flags2 & MF2_TWOD) or (twodlevel))
if (player.feathertime != 0)
player.feathertime = 30
elseif (player.pflags & PF_THOKKED)
if (player.twodaim/ANG2) > 40
player.mo.momz = 40*FRACUNIT
elseif (player.twodaim/ANG2) < -40
player.mo.momz = -40*FRACUNIT
end
else
player.mo.momz = (player.twodaim)*FRACUNIT
end
end
end
end)


addHook("MobjThinker", function(mobj)// mighty feathers
if mobj.target == nil or mobj.target.player.mo == nil
return end
if mobj.valid and mobj.target.player.valid
if mobj.sprite == SPR_RMFR and mobj.health != 2 and mobj.target.player.valid
if (mobj.target.player.feathertime != 0 or mobj.target.player.powers[pw_super]) 
and mobj.target.player.valid
if (leveltime%6)
mobj.rollangle = $1 + ANG10
mobj.angle = $1 + ANG10+(ANG1*(mobj.target.player.feathertime/4))
end
if mobj.target.player.mo.flags2 & MF2_OBJECTFLIP
P_MoveOrigin(mobj,
mobj.target.x - FixedMul(cos(mobj.angle), (65-mobj.target.player.feathertime)*FRACUNIT),
mobj.target.y - FixedMul(sin(mobj.angle), (65-mobj.target.player.feathertime)*FRACUNIT),
mobj.target.z - 35*FRACUNIT)
else
P_MoveOrigin(mobj,
mobj.target.x - FixedMul(cos(mobj.angle), (65-mobj.target.player.feathertime)*FRACUNIT),
mobj.target.y - FixedMul(sin(mobj.angle), (65-mobj.target.player.feathertime)*FRACUNIT),
mobj.target.z + 5*FRACUNIT)
end
else
mobj.state = S_THOK
mobj.sprite = SPR_RMFR
mobj.health = 2
mobj.rollangle = P_RandomRange(ANGLE_90,ANGLE_270)
mobj.momx = P_RandomRange(-10, 10)*FRACUNIT
mobj.momy = P_RandomRange(-10, 10)*FRACUNIT
mobj.momz = P_RandomRange(-10, 10)*FRACUNIT
mobj.flags = $ & ~MF_NOGRAVITY
end			
end
end
end, MT_THOK)

addHook("MobjThinker", function(mobj)// redicle movement
if mobj.target.player.valid
if (mobj.target.player.mo.sprite2 == SPR2_DEAD)
or not ((mobj.target.player.mo.flags2 & MF2_TWOD) or (twodlevel))
or (mobj.target.player.mo.skin != "redbird")
P_RemoveMobj(mobj)
else
if mobj.valid
and (mobj.target.player.mo.skin == "redbird")
mobj.color = mobj.target.color
if mobj.target.player.mo.flags2 & MF2_OBJECTFLIP
P_MoveOrigin(mobj,
mobj.target.x - FixedMul(cos(mobj.target.angle + ANGLE_180), 65*FRACUNIT),
mobj.target.y - FixedMul(sin(mobj.target.angle + ANGLE_180), 65*FRACUNIT),
mobj.target.z - FixedMul(tan(mobj.target.player.twodaim * ANG1), 65*FRACUNIT))//(mobj.target.player.twodaim*FRACUNIT))
else
P_MoveOrigin(mobj,
mobj.target.x - FixedMul(cos(mobj.target.angle + ANGLE_180), 65*FRACUNIT),
mobj.target.y - FixedMul(sin(mobj.target.angle + ANGLE_180), 65*FRACUNIT),
mobj.target.z + FixedMul(tan(mobj.target.player.twodaim * ANG1), 65*FRACUNIT))//(mobj.target.player.twodaim*FRACUNIT))
end
end
end
end
end, MT_RED_TWODAIM)

addHook("MobjThinker", function(mobj)// if bird is fliped, flip along
if mobj.target == nil or mobj.target.player.mo == nil
return end
if mobj.valid and mobj.target.player.valid
if mobj.sprite == SPR_RMFR
if mobj.target.player.mo.sprite2 == SPR2_DEAD
P_RemoveMobj(mobj)
else
mobj.color = mobj.target.player.mo.color
if mobj.target.eflags & MFE_VERTICALFLIP
mobj.eflags = $|MFE_VERTICALFLIP
elseif mobj.target.eflags & ~MFE_VERTICALFLIP
mobj.eflags = $ & ~MFE_VERTICALFLIP
end
end
else
return end
end
end, MT_THOK)

addHook("SpinSpecial", function(player)//ab2 red's ability: YELL
if player.mo
if (player.mo.skin == "redbird")
if player.redscreamtime == 0 and player.powers[pw_nocontrol] == 0
and not (player.pflags & PF_JUMPSTASIS or player.pflags & PF_STASIS or player.pflags & PF_FULLSTASIS) 
player.redscreamtime = 70
player.homing = 0
player.mo.state = S_RED_YELL
if player.powers[pw_super]
S_StartSound(player.mo, sfx_rdyels, player) //AAAAAAAAAAa
else
S_StartSound(player.mo, L_ChooseRandom(sfx_rdyel1, sfx_rdyel2, sfx_rdyel3, 
sfx_rdyel4, sfx_rdyel5, sfx_rdyel6), player) //AAAAAAAAAAa
end
for i = 1,3 do
local scree = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_RED_SCREECH)
scree.angle = player.drawangle + ANGLE_90
scree.tics = 30 - i*5
scree.target = player.mo
scree.scale = player.mo.scale - FRACUNIT*(4-i)
//scree.renderflags = $ + RF_ABSOLUTEOFFSETS //change the offset!
//scree.spritexoffset = 45*FRACUNIT
//scree.spriteyoffset = -44*FRACUNIT
scree.spritexscale = FRACUNIT/2
scree.spriteyscale = FRACUNIT/2
scree.colorized = true
scree.color = player.mo.color
P_InstaThrust(scree, player.drawangle, player.speed+15+(i*5)*FRACUNIT)
end
end
end
end
end)

addHook("MobjThinker", function(mobj)// vfx for yelling
mobj.scale = $ + (FRACUNIT/4) - mobj.tics
if mobj.tics < 30 and mobj.tics > 20
mobj.frame = B|FF_TRANS30|FF_PAPERSPRITE
elseif mobj.tics < 20 and mobj.tics > 10
mobj.frame = B|FF_TRANS40|FF_PAPERSPRITE
elseif mobj.tics < 10 and mobj.tics > 0
mobj.frame = B|FF_TRANS70|FF_PAPERSPRITE
else
mobj.frame = B|FF_PAPERSPRITE
end
end, MT_RED_SCREECH)

// for the battle cry thingy
addHook("MobjMoveCollide", function(mobj, hit)
if(mobj.z+mobj.height >= hit.z) //height
 and(mobj.z <= hit.z+hit.height)
if hit.flags & MF_ENEMY or hit.flags & MF_PUSHABLE //push enemies and pushables
if hit.flags & MF_ENEMY and hit.health > 1
P_DamageMobj(hit, mobj, mobj.target, 1)
end
P_InstaThrust(hit, mobj.angle - ANGLE_90, 20*FRACUNIT)
elseif hit.type == MT_PLAYER and hit.player.mo != mobj.target.player.mo // and players
P_InstaThrust(hit, mobj.angle - ANGLE_90, 25*FRACUNIT)
if (gametyperules & GTR_FRIENDLY)// if they're friendly
hit.player.powers[pw_flashing] = 2*TICRATE //careful pushing me!
end
elseif 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_RED_SCREECH)



