Hardcoded DSZ3 shockwave

This commit is contained in:
lachwright 2019-09-26 05:27:51 +08:00
parent 73146a8338
commit 0cd3e4fd62
6 changed files with 105 additions and 21 deletions

View File

@ -4742,6 +4742,11 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_BOSSSEBH1",
"S_BOSSSEBH2",
// Boss 3 Shockwave
"S_SHOCKWAVE1",
"S_SHOCKWAVE2",
// Boss 4
"S_EGGMOBILE4_STND",
"S_EGGMOBILE4_LATK1",
@ -7253,7 +7258,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
// Boss 3
"MT_EGGMOBILE3",
"MT_FAKEMOBILE",
"MT_SHOCK",
"MT_SHOCKWAVE",
// Boss 4
"MT_EGGMOBILE4",

View File

@ -85,6 +85,7 @@ char sprnames[NUMSPRITES + 1][5] =
"EGGO", // Boss 3
"SEBH", // Boss 3 Junk
"FAKE", // Boss 3 Fakemobile
"SHCK", // Boss 3 Shockwave
// Boss 4 (Castle Eggman)
"EGGP",
@ -1306,6 +1307,11 @@ state_t states[NUMSTATES] =
{SPR_SEBH, 0, 35, {NULL}, 0, 0, S_NULL}, // S_BOSSSEBH1
{SPR_SEBH, 1, 35, {NULL}, 0, 0, S_NULL}, // S_BOSSSEBH2
// Boss 3 Shockwave
{SPR_SHCK, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, 8, {A_Boss3ShockThink}, 4, 2, S_SHOCKWAVE2}, // S_SHOCKWAVE1
{SPR_SHCK, 3|FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, 8, {A_Boss3ShockThink}, 4, 2, S_SHOCKWAVE1}, // S_SHOCKWAVE2
// Boss 4
{SPR_EGGP, 0, -1, {NULL}, 0, 0, S_NULL}, // S_EGGMOBILE4_STND
{SPR_EGGP, 1, 3, {NULL}, 0, 0, S_EGGMOBILE4_LATK2}, // S_EGGMOBILE4_LATK1
@ -5461,30 +5467,30 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_SHOCK
{ // MT_SHOCKWAVE
-1, // doomednum
S_THUNDERCOIN_SPARK, // spawnstate
S_SHOCKWAVE1, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
sfx_s3k5e, // seesound
0, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
8*TICRATE, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_SPRK1, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
10*FRACUNIT, // speed
16*FRACUNIT, // radius
35*FRACUNIT, // height
16*FRACUNIT, // speed
48*FRACUNIT, // radius
8*FRACUNIT, // height
0, // display offset
DMG_ELECTRIC|(sfx_buzz2<<8), // mass
20, // damage
3, // damage
sfx_None, // activesound
MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY, // flags
MF_NOBLOCKMAP|MF_MISSILE|MF_PAIN|MF_NOGRAVITY|MF_PAPERCOLLISION, // flags
S_NULL // raisestate
},

View File

@ -138,6 +138,7 @@ void A_SetReactionTime();
void A_Boss1Spikeballs();
void A_Boss3TakeDamage();
void A_Boss3Path();
void A_Boss3ShockThink();
void A_LinedefExecute();
void A_PlaySeeSound();
void A_PlayAttackSound();
@ -331,6 +332,7 @@ typedef enum sprite
SPR_EGGO, // Boss 3
SPR_SEBH, // Boss 3 Junk
SPR_FAKE, // Boss 3 Fakemobile
SPR_SHCK, // Boss 3 Shockwave
// Boss 4 (Castle Eggman)
SPR_EGGP,
@ -1453,6 +1455,10 @@ typedef enum state
S_BOSSSEBH1,
S_BOSSSEBH2,
// Boss 3 Shockwave
S_SHOCKWAVE1,
S_SHOCKWAVE2,
// Boss 4
S_EGGMOBILE4_STND,
S_EGGMOBILE4_LATK1,
@ -3986,7 +3992,7 @@ typedef enum mobj_type
// Boss 3
MT_EGGMOBILE3,
MT_FAKEMOBILE,
MT_SHOCK,
MT_SHOCKWAVE,
// Boss 4
MT_EGGMOBILE4,
@ -4195,7 +4201,7 @@ typedef enum mobj_type
MT_SEAWEED, // DSZ Seaweed
MT_WATERDRIP, // Dripping Water source
MT_WATERDROP, // Water drop from dripping water
MT_CORAL1, // Coral
MT_CORAL1, // Coral
MT_CORAL2,
MT_CORAL3,
MT_CORAL4,

View File

@ -170,6 +170,7 @@ void A_SetReactionTime(mobj_t *actor);
void A_Boss1Spikeballs(mobj_t *actor);
void A_Boss3TakeDamage(mobj_t *actor);
void A_Boss3Path(mobj_t *actor);
void A_Boss3ShockThink(mobj_t *actor);
void A_LinedefExecute(mobj_t *actor);
void A_PlaySeeSound(mobj_t *actor);
void A_PlayAttackSound(mobj_t *actor);
@ -8079,6 +8080,57 @@ void A_Boss3Path(mobj_t *actor)
}
}
// Function: A_Boss3ShockThink
//
// Description: Inserts new interstitial shockwave objects when the space between others spreads too much.
//
// var1 = unused
// var2 = unused
//
void A_Boss3ShockThink(mobj_t *actor)
{
#ifdef HAVE_BLUA
if (LUA_CallAction("A_Boss3ShockThink", actor))
return;
#endif
if (actor->momx || actor->momy)
actor->angle = R_PointToAngle2(0, 0, actor->momx, actor->momy) + ANGLE_90;
if (actor->hnext && !P_MobjWasRemoved(actor->hnext))
{
mobj_t *snext = actor->hnext;
mobj_t *snew;
fixed_t x0, y0, x1, y1;
// Break the link if movements are too different
if (FixedHypot(snext->momx - actor->momx, snext->momy - actor->momy) > 12*actor->scale)
{
actor->hnext = NULL;
return;
}
// Check distance between shockwave objects to determine whether interstitial ones should be spawned
x0 = actor->x;
y0 = actor->y;
x1 = snext->x;
y1 = snext->y;
if (FixedHypot(x1 - x0, y1 - y0) > 2*actor->radius)
{
snew = P_SpawnMobj((x0 + x1) >> 1, (y0 + y1) >> 1, (actor->z + snext->z) >> 1, actor->type);
snew->momx = (actor->momx + snext->momx) >> 1;
snew->momy = (actor->momy + snext->momy) >> 1;
snew->momz = (actor->momz + snext->momz) >> 1; // is this really needed?
snew->angle = (actor->angle + snext->angle) >> 1;
P_SetTarget(&snew->target, actor->target);
snew->fuse = actor->fuse;
actor->hnext = snew;
snew->hnext = snext;
}
}
}
// Function: A_LinedefExecute
//
// Description: Object's location is used to set the calling sector. The tag used is var1. Optionally, if var2 is set, the actor's angle (multiplied by var2) is added to the tag number as well.

View File

@ -4605,22 +4605,37 @@ static void P_Boss3Thinker(mobj_t *mobj)
if (!mobj->movefactor) // to firing mode
{
UINT8 i;
angle_t ang = 0;
UINT8 i, numtospawn = 24;
angle_t ang = 0, interval = FixedAngle((360 << FRACBITS) / numtospawn);
mobj_t *shock, *sfirst, *sprev;
mobj->movecount = mobj->health+1;
mobj->movefactor = -512*FRACUNIT;
// shock the water!
for (i = 0; i < 64; i++)
for (i = 0; i < numtospawn; i++)
{
mobj_t *shock = P_SpawnMobjFromMobj(mobj, 0, 0, 4*FRACUNIT, MT_SHOCK);
shock = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_SHOCKWAVE);
P_SetTarget(&shock->target, mobj);
P_InstaThrust(shock, ang, shock->info->speed);
P_CheckMissileSpawn(shock);
ang += (ANGLE_MAX/64);
shock->fuse = shock->info->painchance;
if (i % 2 == 0)
P_SetMobjState(shock, shock->state->nextstate);
if (i == 0)
sfirst = shock;
else
{
if (i == numtospawn - 1)
shock->hnext = sfirst;
sprev->hnext = shock;
}
P_Thrust(shock, ang, shock->info->speed);
ang += interval;
sprev = shock;
}
S_StartSound(mobj, sfx_fizzle);
S_StartSound(mobj, shock->info->seesound);
// look for a new target
P_BossTargetPlayer(mobj, false);

View File

@ -484,7 +484,7 @@ sfxinfo_t S_sfx[NUMSFX] =
{"s3k5b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Menu beep"},
{"s3k5c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Electric spark"},
{"s3k5d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Heavy hit"},
{"s3k5e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Firing laser"},
{"s3k5e", false, 127, 8, -1, NULL, 0, -1, -1, LUMPERROR, "Releasing charge"},
{"s3k5f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Crusher stomp"},
{"s3k60", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Accelerating"},
{"s3k61", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Drilling"},