mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-23 19:31:05 +00:00
Hardcoded the Pyre Fly
This commit is contained in:
parent
2933ec3e9c
commit
806b106905
6 changed files with 198 additions and 0 deletions
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
60
src/info.c
60
src/info.c
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
98
src/p_mobj.c
98
src/p_mobj.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue