Hardcoded the Canarivore

This commit is contained in:
MascaraSnake 2019-06-10 13:58:16 +02:00
parent 3a16a7d7d4
commit 98ea229680
8 changed files with 201 additions and 9 deletions

View File

@ -2398,6 +2398,7 @@ static actionpointer_t actionpointers[] =
{{A_DebrisRandom}, "A_DEBRISRANDOM"},
{{A_TrainCameo}, "A_TRAINCAMEO"},
{{A_TrainCameo2}, "A_TRAINCAMEO2"},
{{A_CanarivoreGas}, "A_CANARIVOREGAS"},
{{NULL}, "NONE"},
// This NULL entry must be the last in the list
@ -4498,6 +4499,28 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_UNIDUS_RUN",
"S_UNIDUS_BALL",
// Canarivore
"S_CANARIVORE_LOOK",
"S_CANARIVORE_AWAKEN1",
"S_CANARIVORE_AWAKEN2",
"S_CANARIVORE_AWAKEN3",
"S_CANARIVORE_GAS1",
"S_CANARIVORE_GAS2",
"S_CANARIVORE_GAS3",
"S_CANARIVORE_GAS4",
"S_CANARIVORE_GAS5",
"S_CANARIVORE_GASREPEAT",
"S_CANARIVORE_CLOSE1",
"S_CANARIVORE_CLOSE2",
"S_CANARIVOREGAS_1",
"S_CANARIVOREGAS_2",
"S_CANARIVOREGAS_3",
"S_CANARIVOREGAS_4",
"S_CANARIVOREGAS_5",
"S_CANARIVOREGAS_6",
"S_CANARIVOREGAS_7",
"S_CANARIVOREGAS_8",
// Boss Explosion
"S_BOSSEXPLODE",
@ -7140,6 +7163,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_YELLOWSHELL", // Spring Shell (yellow)
"MT_UNIDUS", // Unidus
"MT_UNIBALL", // Unidus Ball
"MT_CANARIVORE", // Canarivore
"MT_CANARIVORE_GAS", // Canarivore gas
// Generic Boss Items
"MT_BOSSEXPLODE",

View File

@ -175,6 +175,8 @@ light_t *t_lspr[NUMSPRITES] =
&lspr[NOLIGHT], // SPR_MNUS
&lspr[NOLIGHT], // SPR_SSHL
&lspr[NOLIGHT], // SPR_UNID
&lspr[NOLIGHT], // SPR_CANA
&lspr[NOLIGHT], // SPR_CANG
// Generic Boos Items
&lspr[JETLIGHT_L], // SPR_JETF // Boss jet fumes

View File

@ -63,6 +63,8 @@ char sprnames[NUMSPRITES + 1][5] =
"MNUS", // Minus
"SSHL", // Spring Shell
"UNID", // Unidus
"CANA", // Canarivore
"CANG", // Canarivore gas
// Generic Boss Items
"JETF", // Boss jet fumes
@ -1110,6 +1112,29 @@ state_t states[NUMSTATES] =
{SPR_UNID, 0, 1, {A_Chase}, 0, 0, S_UNIDUS_RUN }, // S_UNIDUS_RUN
{SPR_UNID, 1, 1, {A_UnidusBall}, 1, 0, S_UNIDUS_BALL}, // S_UNIDUS_BALL
// Canarivore
{SPR_CANA, 0, 5, {A_Look}, 1200*FRACUNIT+1, 1, S_CANARIVORE_LOOK}, // S_CANARIVORE_LOOK
{SPR_CANA, 0, 3, {A_PlaySound}, sfx_s3k76, 1, S_CANARIVORE_AWAKEN2}, // S_CANARIVORE_AWAKEN1
{SPR_CANA, 1, 5, {NULL}, 0, 0, S_CANARIVORE_AWAKEN3}, // S_CANARIVORE_AWAKEN2
{SPR_CANA, 2, 8, {NULL}, 0, 0, S_CANARIVORE_GAS1}, // S_CANARIVORE_AWAKEN3
{SPR_CANA, 2, 15, {A_PlaySound}, sfx_s3k93, 1, S_CANARIVORE_GAS2}, // S_CANARIVORE_GAS1
{SPR_CANA, 1, 4, {NULL}, 0, 0, S_CANARIVORE_GAS3}, // S_CANARIVORE_GAS2
{SPR_CANA, 2, 0, {A_PlaySound}, sfx_s3k97, 1, S_CANARIVORE_GAS4}, // S_CANARIVORE_GAS3
{SPR_CANA, 2, 5, {A_CanarivoreGas}, MT_CANARIVORE_GAS, 0, S_CANARIVORE_GAS5}, // S_CANARIVORE_GAS4
{SPR_CANA, 1, 5, {NULL}, 0, 0, S_CANARIVORE_GASREPEAT}, // S_CANARIVORE_GAS5
{SPR_CANA, 2, 0, {A_Repeat}, 6, S_CANARIVORE_GAS4, S_CANARIVORE_CLOSE1}, // S_CANARIVORE_GASREPEAT
{SPR_CANA, 1, 8, {NULL}, 0, 0, S_CANARIVORE_CLOSE2}, // S_CANARIVORE_CLOSE1
{SPR_CANA, 0, 90, {NULL}, sfx_s3k5d, 1, S_CANARIVORE_LOOK}, // S_CANARIVORE_CLOSE2
{SPR_CANG, 0|FF_TRANS90, 2, {NULL}, 0, 0, S_CANARIVOREGAS_2}, // S_CANARIVOREGAS_1
{SPR_CANG, 0|FF_TRANS30, 2*TICRATE, {A_SetRandomTics}, 2, TICRATE, S_CANARIVOREGAS_3}, // S_CANARIVOREGAS_2
{SPR_CANG, 0|FF_TRANS40, 10, {NULL}, 0, 0, S_CANARIVOREGAS_4}, // S_CANARIVOREGAS_3
{SPR_CANG, 0|FF_TRANS50, 10, {NULL}, 0, 0, S_CANARIVOREGAS_5}, // S_CANARIVOREGAS_4
{SPR_CANG, 0|FF_TRANS60, 10, {NULL}, 0, 0, S_CANARIVOREGAS_6}, // S_CANARIVOREGAS_5
{SPR_CANG, 0|FF_TRANS70, 10, {NULL}, 0, 0, S_CANARIVOREGAS_7}, // S_CANARIVOREGAS_6
{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
// Boss Explosion
{SPR_BOM2, FF_FULLBRIGHT|FF_ANIMATE, (5*7), {NULL}, 6, 5, S_NULL}, // S_BOSSEXPLODE
@ -4800,6 +4825,60 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_CANARIVORE
134, // doomednum
S_CANARIVORE_LOOK, // spawnstate
1, // spawnhealth
S_CANARIVORE_AWAKEN1, // 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
0, // speed
12*FRACUNIT, // radius
80*FRACUNIT, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_SPECIAL|MF_SHOOTABLE|MF_ENEMY|MF_SPAWNCEILING|MF_NOGRAVITY, // flags
S_NULL // raisestate
},
{ // MT_CANARIVORE_GAS
-1, // doomednum
S_CANARIVOREGAS_1, // 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_s3k5d, // deathsound
0, // speed
16*FRACUNIT, // radius
32*FRACUNIT, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOCLIP|MF_SPECIAL, // flags
S_NULL // raisestate
},
{ // MT_BOSSEXPLODE
-1, // doomednum
S_BOSSEXPLODE, // spawnstate

View File

@ -256,7 +256,7 @@ void A_TNTExplode();
void A_DebrisRandom();
void A_TrainCameo();
void A_TrainCameo2();
void A_CanarivoreGas();
// ratio of states to sprites to mobj types is roughly 6 : 1 : 1
#define NUMMOBJFREESLOTS 256
@ -300,6 +300,8 @@ typedef enum sprite
SPR_MNUS, // Minus
SPR_SSHL, // Spring Shell
SPR_UNID, // Unidus
SPR_CANA, // Canarivore
SPR_CANG, // Canarivore gas
// Generic Boss Items
SPR_JETF, // Boss jet fumes
@ -1255,6 +1257,28 @@ typedef enum state
S_UNIDUS_RUN,
S_UNIDUS_BALL,
// Canarivore
S_CANARIVORE_LOOK,
S_CANARIVORE_AWAKEN1,
S_CANARIVORE_AWAKEN2,
S_CANARIVORE_AWAKEN3,
S_CANARIVORE_GAS1,
S_CANARIVORE_GAS2,
S_CANARIVORE_GAS3,
S_CANARIVORE_GAS4,
S_CANARIVORE_GAS5,
S_CANARIVORE_GASREPEAT,
S_CANARIVORE_CLOSE1,
S_CANARIVORE_CLOSE2,
S_CANARIVOREGAS_1,
S_CANARIVOREGAS_2,
S_CANARIVOREGAS_3,
S_CANARIVOREGAS_4,
S_CANARIVOREGAS_5,
S_CANARIVOREGAS_6,
S_CANARIVOREGAS_7,
S_CANARIVOREGAS_8,
// Boss Explosion
S_BOSSEXPLODE,
@ -3917,6 +3941,8 @@ typedef enum mobj_type
MT_YELLOWSHELL, // Spring Shell (yellow)
MT_UNIDUS, // Unidus
MT_UNIBALL, // Unidus Ball
MT_CANARIVORE, // Canarivore
MT_CANARIVORE_GAS, // Canarivore gas
// Generic Boss Items
MT_BOSSEXPLODE,

View File

@ -285,6 +285,7 @@ void A_TNTExplode(mobj_t *actor);
void A_DebrisRandom(mobj_t *actor);
void A_TrainCameo(mobj_t *actor);
void A_TrainCameo2(mobj_t *actor);
void A_CanarivoreGas(mobj_t *actor);
//for p_enemy.c
//
@ -12457,9 +12458,10 @@ void A_LookForBetter(mobj_t *actor)
* \param z Center Z coordinates.
* \param radius Radius.
* \param speed Additional thrust on particles.
* \param scale Scale.
* \param initscale Initial scale when spawning.
* \param scale "Default" scale.
*/
static void P_DustRing(mobjtype_t mobjtype, UINT32 div, fixed_t x, fixed_t y, fixed_t z, fixed_t radius, fixed_t speed, fixed_t scale)
static void P_DustRing(mobjtype_t mobjtype, UINT32 div, fixed_t x, fixed_t y, fixed_t z, fixed_t radius, fixed_t speed, fixed_t initscale, fixed_t scale)
{
angle_t ang = FixedAngle(FixedDiv(360*FRACUNIT, div*FRACUNIT)); //(ANGLE_180/div)*2;
UINT32 i;
@ -12480,7 +12482,7 @@ static void P_DustRing(mobjtype_t mobjtype, UINT32 div, fixed_t x, fixed_t y, fi
);
dust->angle = ang*i + ANGLE_90;
P_SetScale(dust, scale);
P_SetScale(dust, FixedMul(initscale, scale));
dust->destscale = FixedMul(4*FRACUNIT + P_RandomFixed(), scale);
dust->scalespeed = scale/24;
P_Thrust(dust, ang*i, speed + FixedMul(P_RandomFixed(), scale));
@ -12513,8 +12515,8 @@ void A_Boss5BombExplode(mobj_t *actor)
if (actor->target)
P_RadiusAttack(actor, actor->target, 7*actor->radius, 0);
P_DustRing(locvar1, 4, actor->x, actor->y, actor->z+actor->height, 2*actor->radius, 0, actor->scale);
P_DustRing(locvar1, 6, actor->x, actor->y, actor->z+actor->height/2, 3*actor->radius, FRACUNIT, actor->scale);
P_DustRing(locvar1, 4, actor->x, actor->y, actor->z+actor->height, 2*actor->radius, 0, FRACUNIT, actor->scale);
P_DustRing(locvar1, 6, actor->x, actor->y, actor->z+actor->height/2, 3*actor->radius, FRACUNIT, FRACUNIT, actor->scale);
//P_StartQuake(9*actor->scale, TICRATE/6, {actor->x, actor->y, actor->z}, 20*actor->radius);
// the above does not exist, so we set the quake values directly instead
quake.intensity = 9*actor->scale;
@ -12776,8 +12778,8 @@ void A_TNTExplode(mobj_t *actor)
if (locvar1)
{
P_DustRing(locvar1, 4, actor->x, actor->y, actor->z+actor->height, 64, 0, actor->scale);
P_DustRing(locvar1, 6, actor->x, actor->y, actor->z+actor->height/2, 96, FRACUNIT, actor->scale);
P_DustRing(locvar1, 4, actor->x, actor->y, actor->z+actor->height, 64, 0, FRACUNIT, actor->scale);
P_DustRing(locvar1, 6, actor->x, actor->y, actor->z+actor->height/2, 96, FRACUNIT, FRACUNIT, actor->scale);
}
actor->destscale *= 4;
@ -12893,4 +12895,24 @@ void A_TrainCameo2(mobj_t *actor)
//Front and back.
P_TrainSeg(actor, x + len, y, z, ang + ANGLE_90, spr, 2);
P_TrainSeg(actor, x - len, y, z, ang + ANGLE_90, spr, 2);
}
// Function: A_CanarivoreGas
//
// Description: Releases gas clouds. Used by the Canarivore.
//
// var1 = Mobj type.
// var2 = Unused
//
void A_CanarivoreGas(mobj_t *actor)
{
INT32 locvar1 = var1;
#ifdef HAVE_BLUA
if (LUA_CallAction("A_CanarivoreGas", actor))
return;
#endif
P_DustRing(locvar1, 4, actor->x, actor->y, actor->z + actor->height / 5, 18, 0, FRACUNIT/10, actor->scale);
P_DustRing(locvar1, 6, actor->x, actor->y, actor->z + actor->height / 5, 28, FRACUNIT, FRACUNIT/10, actor->scale);
}

View File

@ -1699,6 +1699,16 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
}
return;
case MT_CANARIVORE_GAS:
// if player and gas touch, attach gas to player (overriding any gas that already attached) and apply slowdown effect
P_TeleportMove(special, toucher->x - toucher->momx / 2, toucher->y - toucher->momy / 2, toucher->z - toucher->momz / 2);
toucher->momx = FixedMul(toucher->momx, 50 * FRACUNIT / 51);
toucher->momy = FixedMul(toucher->momy, 50 * FRACUNIT / 51);
special->momx = toucher->momx;
special->momy = toucher->momy;
special->momz = toucher->momz;
return;
default: // SOC or script pickup
if (player->bot)
return;

View File

@ -8439,6 +8439,34 @@ void P_MobjThinker(mobj_t *mobj)
steam->momz = 2 * FRACUNIT;
}
break;
case MT_CANARIVORE_GAS:
{
fixed_t momz;
if (mobj->flags2 & MF2_AMBUSH)
{
mobj->momx = FixedMul(mobj->momx, 50 * FRACUNIT / 51);
mobj->momy = FixedMul(mobj->momy, 50 * FRACUNIT / 51);
break;
}
if (mobj->eflags & MFE_VERTICALFLIP)
{
if ((mobj->z + mobj->height + mobj->momz) <= mobj->ceilingz)
break;
}
else
{
if ((mobj->z + mobj->momz) >= mobj->floorz)
break;
}
momz = abs(mobj->momz);
if (R_PointToDist2(0, 0, mobj->momx, mobj->momy) < momz)
P_InstaThrust(mobj, R_PointToAngle2(0, 0, mobj->momx, mobj->momy), momz);
mobj->flags2 |= MF2_AMBUSH;
break;
}
case MT_SPINFIRE:
if (mobj->flags & MF_NOGRAVITY)
{

View File

@ -385,7 +385,7 @@ sfxinfo_t S_sfx[NUMSFX] =
{"s3k90", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Impact"},
{"s3k91", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Closed"},
{"s3k92", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Ghost"},
{"s3k93", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Rebuilding"},
{"s3k93", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Gas release"},
{"s3k94", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Spike"},
{"s3k95", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Lava burst"},
{"s3k96", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Falling object"},