Hardcoded the Pyre Fly
This commit is contained in:
parent
2933ec3e9c
commit
806b106905
|
@ -2434,6 +2434,7 @@ static actionpointer_t actionpointers[] =
|
||||||
{{A_LavafallRocks}, "A_LAVAFALLROCKS"},
|
{{A_LavafallRocks}, "A_LAVAFALLROCKS"},
|
||||||
{{A_LavafallLava}, "A_LAVAFALLLAVA"},
|
{{A_LavafallLava}, "A_LAVAFALLLAVA"},
|
||||||
{{A_FallingLavaCheck}, "A_FALLINGLAVACHECK"},
|
{{A_FallingLavaCheck}, "A_FALLINGLAVACHECK"},
|
||||||
|
{{A_FireShrink}, "A_FIRESHRINK"},
|
||||||
{{NULL}, "NONE"},
|
{{NULL}, "NONE"},
|
||||||
|
|
||||||
// This NULL entry must be the last in the list
|
// 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_7",
|
||||||
"S_CANARIVOREGAS_8",
|
"S_CANARIVOREGAS_8",
|
||||||
|
|
||||||
|
// Pyre Fly
|
||||||
|
"S_PYREFLY_FLY",
|
||||||
|
"S_PYREFIRE1",
|
||||||
|
"S_PYREFIRE2",
|
||||||
|
|
||||||
// Boss Explosion
|
// Boss Explosion
|
||||||
"S_BOSSEXPLODE",
|
"S_BOSSEXPLODE",
|
||||||
|
|
||||||
|
@ -7224,6 +7230,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_UNIBALL", // Unidus Ball
|
"MT_UNIBALL", // Unidus Ball
|
||||||
"MT_CANARIVORE", // Canarivore
|
"MT_CANARIVORE", // Canarivore
|
||||||
"MT_CANARIVORE_GAS", // Canarivore gas
|
"MT_CANARIVORE_GAS", // Canarivore gas
|
||||||
|
"MT_PYREFLY", // Pyre Fly
|
||||||
|
"MT_PYREFLY_FIRE", // Pyre Fly fire
|
||||||
|
|
||||||
// Generic Boss Items
|
// Generic Boss Items
|
||||||
"MT_BOSSEXPLODE",
|
"MT_BOSSEXPLODE",
|
||||||
|
|
|
@ -180,6 +180,7 @@ light_t *t_lspr[NUMSPRITES] =
|
||||||
&lspr[NOLIGHT], // SPR_UNID
|
&lspr[NOLIGHT], // SPR_UNID
|
||||||
&lspr[NOLIGHT], // SPR_CANA
|
&lspr[NOLIGHT], // SPR_CANA
|
||||||
&lspr[NOLIGHT], // SPR_CANG
|
&lspr[NOLIGHT], // SPR_CANG
|
||||||
|
&lspr[NOLIGHT], // SPR_PYRE
|
||||||
|
|
||||||
// Generic Boos Items
|
// Generic Boos Items
|
||||||
&lspr[JETLIGHT_L], // SPR_JETF // Boss jet fumes
|
&lspr[JETLIGHT_L], // SPR_JETF // Boss jet fumes
|
||||||
|
|
60
src/info.c
60
src/info.c
|
@ -68,6 +68,7 @@ char sprnames[NUMSPRITES + 1][5] =
|
||||||
"UNID", // Unidus
|
"UNID", // Unidus
|
||||||
"CANA", // Canarivore
|
"CANA", // Canarivore
|
||||||
"CANG", // Canarivore gas
|
"CANG", // Canarivore gas
|
||||||
|
"PYRE", // Pyre Fly
|
||||||
|
|
||||||
// Generic Boss Items
|
// Generic Boss Items
|
||||||
"JETF", // Boss jet fumes
|
"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_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
|
{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
|
// Boss Explosion
|
||||||
{SPR_BOM2, FF_FULLBRIGHT|FF_ANIMATE, (5*7), {NULL}, 6, 5, S_NULL}, // S_BOSSEXPLODE
|
{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
|
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
|
{ // MT_BOSSEXPLODE
|
||||||
-1, // doomednum
|
-1, // doomednum
|
||||||
S_BOSSEXPLODE, // spawnstate
|
S_BOSSEXPLODE, // spawnstate
|
||||||
|
|
|
@ -269,6 +269,7 @@ void A_ModuloToState();
|
||||||
void A_LavafallRocks();
|
void A_LavafallRocks();
|
||||||
void A_LavafallLava();
|
void A_LavafallLava();
|
||||||
void A_FallingLavaCheck();
|
void A_FallingLavaCheck();
|
||||||
|
void A_FireShrink();
|
||||||
|
|
||||||
// ratio of states to sprites to mobj types is roughly 6 : 1 : 1
|
// ratio of states to sprites to mobj types is roughly 6 : 1 : 1
|
||||||
#define NUMMOBJFREESLOTS 512
|
#define NUMMOBJFREESLOTS 512
|
||||||
|
@ -317,6 +318,7 @@ typedef enum sprite
|
||||||
SPR_UNID, // Unidus
|
SPR_UNID, // Unidus
|
||||||
SPR_CANA, // Canarivore
|
SPR_CANA, // Canarivore
|
||||||
SPR_CANG, // Canarivore gas
|
SPR_CANG, // Canarivore gas
|
||||||
|
SPR_PYRE, // Pyre Fly
|
||||||
|
|
||||||
// Generic Boss Items
|
// Generic Boss Items
|
||||||
SPR_JETF, // Boss jet fumes
|
SPR_JETF, // Boss jet fumes
|
||||||
|
@ -1328,6 +1330,11 @@ typedef enum state
|
||||||
S_CANARIVOREGAS_7,
|
S_CANARIVOREGAS_7,
|
||||||
S_CANARIVOREGAS_8,
|
S_CANARIVOREGAS_8,
|
||||||
|
|
||||||
|
// Pyre Fly
|
||||||
|
S_PYREFLY_FLY,
|
||||||
|
S_PYREFIRE1,
|
||||||
|
S_PYREFIRE2,
|
||||||
|
|
||||||
// Boss Explosion
|
// Boss Explosion
|
||||||
S_BOSSEXPLODE,
|
S_BOSSEXPLODE,
|
||||||
|
|
||||||
|
@ -3998,6 +4005,8 @@ typedef enum mobj_type
|
||||||
MT_UNIBALL, // Unidus Ball
|
MT_UNIBALL, // Unidus Ball
|
||||||
MT_CANARIVORE, // Canarivore
|
MT_CANARIVORE, // Canarivore
|
||||||
MT_CANARIVORE_GAS, // Canarivore gas
|
MT_CANARIVORE_GAS, // Canarivore gas
|
||||||
|
MT_PYREFLY, // Pyre Fly
|
||||||
|
MT_PYREFLY_FIRE, // Pyre Fly fire
|
||||||
|
|
||||||
// Generic Boss Items
|
// Generic Boss Items
|
||||||
MT_BOSSEXPLODE,
|
MT_BOSSEXPLODE,
|
||||||
|
|
|
@ -299,6 +299,7 @@ void A_ModuloToState(mobj_t *actor);
|
||||||
void A_LavafallRocks(mobj_t *actor);
|
void A_LavafallRocks(mobj_t *actor);
|
||||||
void A_LavafallLava(mobj_t *actor);
|
void A_LavafallLava(mobj_t *actor);
|
||||||
void A_FallingLavaCheck(mobj_t *actor);
|
void A_FallingLavaCheck(mobj_t *actor);
|
||||||
|
void A_FireShrink(mobj_t *actor);
|
||||||
|
|
||||||
//for p_enemy.c
|
//for p_enemy.c
|
||||||
|
|
||||||
|
@ -13817,3 +13818,24 @@ void A_FallingLavaCheck(mobj_t *actor)
|
||||||
P_SetMobjState(actor, actor->info->deathstate);
|
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;
|
||||||
|
}
|
98
src/p_mobj.c
98
src/p_mobj.c
|
@ -6986,6 +6986,16 @@ void P_HandleMinecartSegments(mobj_t *mobj)
|
||||||
P_UpdateMinecartSegments(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
|
// P_MobjThinker
|
||||||
//
|
//
|
||||||
|
@ -9012,6 +9022,60 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
if (P_IsObjectOnGround(mobj))
|
if (P_IsObjectOnGround(mobj))
|
||||||
P_RemoveMobj(mobj);
|
P_RemoveMobj(mobj);
|
||||||
break;
|
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:
|
case MT_SPINFIRE:
|
||||||
if (mobj->flags & MF_NOGRAVITY)
|
if (mobj->flags & MF_NOGRAVITY)
|
||||||
{
|
{
|
||||||
|
@ -9248,6 +9312,26 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s
|
||||||
S_StopSound(mobj);
|
S_StopSound(mobj);
|
||||||
}
|
}
|
||||||
return;
|
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:
|
case MT_PLAYER:
|
||||||
break; // don't remove
|
break; // don't remove
|
||||||
default:
|
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);
|
P_SetTarget(&mobj->target, fire);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MT_PYREFLY:
|
||||||
|
mobj->extravalue1 = (FixedHypot(mobj->x, mobj->y)/FRACUNIT) % 360;
|
||||||
|
mobj->extravalue2 = 0;
|
||||||
|
mobj->fuse = 100;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -11864,6 +11953,15 @@ ML_EFFECT5 : Don't stop thinking when too far away
|
||||||
mobj->destscale = mobj->scale;
|
mobj->destscale = mobj->scale;
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue