Hardcoded the Pyre Fly

This commit is contained in:
MascaraSnake 2019-08-30 08:17:25 +02:00
parent 2933ec3e9c
commit 806b106905
6 changed files with 198 additions and 0 deletions

View File

@ -2434,6 +2434,7 @@ static actionpointer_t actionpointers[] =
{{A_LavafallRocks}, "A_LAVAFALLROCKS"},
{{A_LavafallLava}, "A_LAVAFALLLAVA"},
{{A_FallingLavaCheck}, "A_FALLINGLAVACHECK"},
{{A_FireShrink}, "A_FIRESHRINK"},
{{NULL}, "NONE"},
// This NULL entry must be the last in the list
@ -4576,6 +4577,11 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_CANARIVOREGAS_7",
"S_CANARIVOREGAS_8",
// Pyre Fly
"S_PYREFLY_FLY",
"S_PYREFIRE1",
"S_PYREFIRE2",
// Boss Explosion
"S_BOSSEXPLODE",
@ -7224,6 +7230,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_UNIBALL", // Unidus Ball
"MT_CANARIVORE", // Canarivore
"MT_CANARIVORE_GAS", // Canarivore gas
"MT_PYREFLY", // Pyre Fly
"MT_PYREFLY_FIRE", // Pyre Fly fire
// Generic Boss Items
"MT_BOSSEXPLODE",

View File

@ -180,6 +180,7 @@ light_t *t_lspr[NUMSPRITES] =
&lspr[NOLIGHT], // SPR_UNID
&lspr[NOLIGHT], // SPR_CANA
&lspr[NOLIGHT], // SPR_CANG
&lspr[NOLIGHT], // SPR_PYRE
// Generic Boos Items
&lspr[JETLIGHT_L], // SPR_JETF // Boss jet fumes

View File

@ -68,6 +68,7 @@ char sprnames[NUMSPRITES + 1][5] =
"UNID", // Unidus
"CANA", // Canarivore
"CANG", // Canarivore gas
"PYRE", // Pyre Fly
// Generic Boss Items
"JETF", // Boss jet fumes
@ -1172,6 +1173,11 @@ state_t states[NUMSTATES] =
{SPR_CANG, 0|FF_TRANS80, 10, {NULL}, 0, 0, S_CANARIVOREGAS_8}, // S_CANARIVOREGAS_7
{SPR_CANG, 0|FF_TRANS90, 10, {NULL}, 0, 0, S_NULL}, // S_CANARIVOREGAS_8
// Pyre Fly
{SPR_PYRE, FF_ANIMATE, 8, {NULL}, 4, 2, S_PYREFLY_FLY}, // S_PYREFLY_FLY
{SPR_FLAM, FF_FULLBRIGHT, 10, {NULL}, 0, 0, S_PYREFIRE2}, // S_PYREFIRE1
{SPR_FLAM, 1|FF_FULLBRIGHT, 10, {A_FireShrink}, 0, 16, S_NULL}, // S_PYREFIRE2
// Boss Explosion
{SPR_BOM2, FF_FULLBRIGHT|FF_ANIMATE, (5*7), {NULL}, 6, 5, S_NULL}, // S_BOSSEXPLODE
@ -5004,6 +5010,60 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_PYREFLY
136, // doomednum
S_PYREFLY_FLY, // spawnstate
1, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
0, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_XPLD_FLICKY, // deathstate
S_NULL, // xdeathstate
sfx_pop, // deathsound
1, // speed
24*FRACUNIT, // radius
34*FRACUNIT, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_SPECIAL|MF_SHOOTABLE|MF_ENEMY|MF_SLIDEME, // flags
S_NULL // raisestate
},
{ // MT_PYREFLY_FIRE
-1, // doomednum
S_PYREFIRE1, // spawnstate
1, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
0, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
0, // speed
24*FRACUNIT, // radius
34*FRACUNIT, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_NOBLOCKMAP|MF_FIRE|MF_PAIN, // flags
S_NULL // raisestate
},
{ // MT_BOSSEXPLODE
-1, // doomednum
S_BOSSEXPLODE, // spawnstate

View File

@ -269,6 +269,7 @@ void A_ModuloToState();
void A_LavafallRocks();
void A_LavafallLava();
void A_FallingLavaCheck();
void A_FireShrink();
// ratio of states to sprites to mobj types is roughly 6 : 1 : 1
#define NUMMOBJFREESLOTS 512
@ -317,6 +318,7 @@ typedef enum sprite
SPR_UNID, // Unidus
SPR_CANA, // Canarivore
SPR_CANG, // Canarivore gas
SPR_PYRE, // Pyre Fly
// Generic Boss Items
SPR_JETF, // Boss jet fumes
@ -1328,6 +1330,11 @@ typedef enum state
S_CANARIVOREGAS_7,
S_CANARIVOREGAS_8,
// Pyre Fly
S_PYREFLY_FLY,
S_PYREFIRE1,
S_PYREFIRE2,
// Boss Explosion
S_BOSSEXPLODE,
@ -3998,6 +4005,8 @@ typedef enum mobj_type
MT_UNIBALL, // Unidus Ball
MT_CANARIVORE, // Canarivore
MT_CANARIVORE_GAS, // Canarivore gas
MT_PYREFLY, // Pyre Fly
MT_PYREFLY_FIRE, // Pyre Fly fire
// Generic Boss Items
MT_BOSSEXPLODE,

View File

@ -299,6 +299,7 @@ void A_ModuloToState(mobj_t *actor);
void A_LavafallRocks(mobj_t *actor);
void A_LavafallLava(mobj_t *actor);
void A_FallingLavaCheck(mobj_t *actor);
void A_FireShrink(mobj_t *actor);
//for p_enemy.c
@ -13816,4 +13817,25 @@ void A_FallingLavaCheck(mobj_t *actor)
actor->z = actor->watertop;
P_SetMobjState(actor, actor->info->deathstate);
}
}
// Function: A_FireShrink
//
// Description: Shrink the actor down to the specified scale at the specified speed.
//
// var1 = Scale to shrink to
// var2 = Shrinking speed
//
void A_FireShrink(mobj_t *actor)
{
INT32 locvar1 = var1;
INT32 locvar2 = var2;
#ifdef HAVE_BLUA
if (LUA_CallAction("A_FireShrink", actor))
return;
#endif
actor->destscale = locvar1;
actor->scalespeed = FRACUNIT/locvar2;
}

View File

@ -6986,6 +6986,16 @@ void P_HandleMinecartSegments(mobj_t *mobj)
P_UpdateMinecartSegments(mobj);
}
static void P_PyreFlyBurn(mobj_t *mobj, fixed_t hoffs, INT16 vrange, mobjtype_t mobjtype, fixed_t momz)
{
angle_t fa = (FixedAngle(P_RandomKey(360)*FRACUNIT) >> ANGLETOFINESHIFT) & FINEMASK;
fixed_t xoffs = FixedMul(FINECOSINE(fa), mobj->radius + hoffs);
fixed_t yoffs = FixedMul(FINESINE(fa), mobj->radius + hoffs);
fixed_t zoffs = P_RandomRange(-vrange, vrange)*FRACUNIT;
mobj_t *particle = P_SpawnMobjFromMobj(mobj, xoffs, yoffs, zoffs, mobjtype);
particle->momz = momz;
}
//
// P_MobjThinker
//
@ -9012,6 +9022,60 @@ void P_MobjThinker(mobj_t *mobj)
if (P_IsObjectOnGround(mobj))
P_RemoveMobj(mobj);
break;
case MT_PYREFLY:
{
fixed_t hdist;
mobj->extravalue1 = (mobj->extravalue1 + 3) % 360;
mobj->z += FINESINE(((mobj->extravalue1*ANG1) >> ANGLETOFINESHIFT) & FINEMASK);
if (mobj->extravalue2 == 1)
P_PyreFlyBurn(mobj, 0, 20, MT_SMOKE, 4*FRACUNIT);
else if (mobj->extravalue2 == 2)
{
INT32 fireradius = min(100 - mobj->fuse, 52);
mobj->frame |= FF_FULLBRIGHT;
P_PyreFlyBurn(mobj, P_RandomRange(0, fireradius)*FRACUNIT, 20, MT_FLAMEPARTICLE, 4*FRACUNIT);
P_PyreFlyBurn(mobj, fireradius*FRACUNIT, 40, MT_PYREFLY_FIRE, 0);
}
if (!(mobj->flags2 & MF2_AMBUSH))
P_LookForPlayers(mobj, true, false, 1500*FRACUNIT);
if (!mobj->target)
break;
hdist = R_PointToDist2(mobj->x, mobj->y, mobj->target->x, mobj->target->y);
if (!(mobj->flags2 & MF2_AMBUSH) && hdist <= 450*FRACUNIT)
mobj->flags2 |= MF2_AMBUSH;
if (!(mobj->flags2 & MF2_AMBUSH))
break;
if (hdist < 1000*FRACUNIT)
{
fixed_t dist = P_AproxDistance(hdist, mobj->target->z - mobj->z);
P_InstaThrust(mobj, R_PointToAngle2(mobj->x, mobj->y, mobj->target->x, mobj->target->y), 2*FRACUNIT);
//aim for player z position; if too close to floor, aim just above them
if (mobj->z - mobj->floorz >= 80*FRACUNIT)
mobj->momz = FixedMul(FixedDiv(mobj->target->z - mobj->z, dist), 2*FRACUNIT);
else
mobj->momz = FixedMul(FixedDiv((mobj->target->z + 70*FRACUNIT) - mobj->z, dist), 2*FRACUNIT);
}
else
{
mobj->momx = 0;
mobj->momy = 0;
mobj->momz = 0;
if (hdist >= 1500*FRACUNIT)
{
mobj->flags2 &= ~MF2_AMBUSH;
P_SetTarget(&mobj->target, NULL);
}
}
break;
}
case MT_SPINFIRE:
if (mobj->flags & MF_NOGRAVITY)
{
@ -9248,6 +9312,26 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s
S_StopSound(mobj);
}
return;
case MT_PYREFLY:
mobj->extravalue2 = (mobj->extravalue2 + 1) % 3;
if (mobj->extravalue2 == 0)
{
mobj->fuse = 100;
S_StopSound(mobj);
S_StartSound(mobj, sfx_s3k8c);
}
else if (mobj->extravalue2 == 1)
{
mobj->fuse = 50;
S_StartSound(mobj, sfx_s3ka3);
}
else
{
mobj->fuse = 100;
S_StopSound(mobj);
S_StartSound(mobj, sfx_s3kc2l);
}
return;
case MT_PLAYER:
break; // don't remove
default:
@ -9844,6 +9928,11 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
P_SetTarget(&mobj->target, fire);
break;
}
case MT_PYREFLY:
mobj->extravalue1 = (FixedHypot(mobj->x, mobj->y)/FRACUNIT) % 360;
mobj->extravalue2 = 0;
mobj->fuse = 100;
break;
default:
break;
}
@ -11864,6 +11953,15 @@ ML_EFFECT5 : Don't stop thinking when too far away
mobj->destscale = mobj->scale;
}
break;
case MT_PYREFLY:
//start on fire if Ambush flag is set, otherwise behave normally
if (mthing->options & MTF_AMBUSH)
{
mobj->extravalue2 = 2;
S_StartSound(mobj, sfx_s3kd3l);
mthing->options &= ~MTF_AMBUSH; //Prevent MF2_AMBUSH from being set, since we use it for chasing
}
break;
default:
break;
}