
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
local redaimstyle = 1
local homingtoggle = false
player.homingtoggle = false
end)

COM_AddCommand("abaimtype", function(player, value)
if player
if value == "1"
or value == "true"
or value == "yes"
or value == "on"
player.redaimstyle = 1
CONS_Printf(player, "Red now aims using C1 for up, C2 for down.")
elseif value == "0"
or value == "false"
or value == "no"
or value == "off"
player.redaimstyle = 0
CONS_Printf(player, "Red now aims using the camera's view angle")
else
CONS_Printf(player, "abaimtype: changes red's controls")
end
else
print("Use this in-game!")
end
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
player.homingtoggle = $ or false
player.redaimstyle = $ or 0
//print(player.redaimstyle)

if (player.mo.skin == "redbird")// is the red cardinal

if (player.homingtoggle == false)
player.charability = skins["redbird"].ability
else
player.charability = CA_HOMINGTHOK
end

if player.charability == CA_HOMINGTHOK
if (leveltime % 2) == 1
local thing = P_SpawnGhostMobj(player.mo)
thing.state = S_THOK
thing.destscale = FRACUNIT*2
if (leveltime % 15) < 7
thing.fuse = 5
else
thing.fuse = 10
end
end
end

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.sprite = SPR_RMFR
why.rollangle = P_RandomRange(0,360)*ANG1
why.scale = player.mo.scale
why.momx = 0
why.momy = 0
why.tics = -1
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)// the 2dmode flight
if player.mo
if (player.mo.skin == "redbird") and
(((player.mo.flags2 & MF2_TWOD) or (twodlevel)) or player.redaimstyle == 1)
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("AbilitySpecial", function(player) //fly, kinda
if player.mo
if (player.mo.skin == "redbird")
and not (player.mo.flags2 & MF2_TWOD)
and not (twodlevel)
and player.redaimstyle != 1
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)
if player.mo
if (player.mo.skin == "redbird")
and not(player.exiting)
if (player.cmd.buttons & BT_CUSTOM3) and not(player.lastbuttons & BT_CUSTOM3)
S_StartSound(player.mo, sfx_cdfm21, player)

if player.homingtoggle == false
player.homingtoggle = true
else
player.homingtoggle = false
end

end
end
end
end)

addHook("PlayerThink", function(player)// aiming in 2d mode!
if player.mo
//print(player.twodaim)
and (player.mo.skin == "redbird")
and not(player.exiting)
if (((player.mo.flags2 & MF2_TWOD) or (twodlevel)) or player.redaimstyle == 1)
local annoy = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_THOK)
P_SetOrigin(annoy,
player.mo.x - FixedMul(cos(player.drawangle + ANGLE_180), 65*FRACUNIT),
player.mo.y - FixedMul(sin(player.drawangle + ANGLE_180), 65*FRACUNIT),
player.mo.z - FixedMul(tan(player.twodaim * ANG1 * -1), 65*FRACUNIT))
annoy.tics = 2
annoy.color = player.mo.color
annoy.frame = A|FF_FULLBRIGHT|FF_TRANS10
annoy.drawonlyforplayer = player
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.redaimstyle == 1
if (player.cmd.buttons & BT_CUSTOM1)
if (player.twodaim < 40)
player.twodaim = $ + 10
end
elseif (player.cmd.buttons & BT_CUSTOM2)
if (player.twodaim > -40)
player.twodaim = $ - 10
end
end

else
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
end

elseif player.aimingtarget == 1
player.aimingtarget = 0
end
else
end
end)

addHook("MobjThinker", function(mobj)// mighty feathers
if not mobj.target
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
or mobj.target.player.mo.eflags & MFE_VERTICALFLIP
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 not (twodlevel)
or player.redaimstyle == 1
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
or mobj.target.player.mo.eflags & MFE_VERTICALFLIP
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 //is not alive :(
or mobj.target.player.mo.sprite2 == SPR2_DRWN
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("MobjThinker", function(mobj)// redical follow
if mobj.valid and mobj.target.player.valid
if mobj.target == nil or mobj.target.player.mo == nil or mobj == nil
return end
if mobj.target.eflags & MFE_VERTICALFLIP
mobj.eflags = $|MFE_VERTICALFLIP
elseif mobj.target.eflags & ~MFE_VERTICALFLIP
mobj.eflags = $ & ~MFE_VERTICALFLIP
end
end
end, MT_RED_TWODAIM)

addHook("SpinSpecial", function(player)//ab2 red's ability: YELL
if player.mo
if (player.mo.skin == "redbird") and not(player.exiting)
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 // cancel the homing attack
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
if mobj.valid
mobj.scale = $ + (FRACUNIT/4) - mobj.tics
mobj.rollangle = $ + 5*ANG1 //make it look nice
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
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)



