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_BOSSSEBH1",
"S_BOSSSEBH2", "S_BOSSSEBH2",
// Boss 3 Shockwave
"S_SHOCKWAVE1",
"S_SHOCKWAVE2",
// Boss 4 // Boss 4
"S_EGGMOBILE4_STND", "S_EGGMOBILE4_STND",
"S_EGGMOBILE4_LATK1", "S_EGGMOBILE4_LATK1",
@ -7253,7 +7258,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
// Boss 3 // Boss 3
"MT_EGGMOBILE3", "MT_EGGMOBILE3",
"MT_FAKEMOBILE", "MT_FAKEMOBILE",
"MT_SHOCK", "MT_SHOCKWAVE",
// Boss 4 // Boss 4
"MT_EGGMOBILE4", "MT_EGGMOBILE4",

View File

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

View File

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

View File

@ -170,6 +170,7 @@ void A_SetReactionTime(mobj_t *actor);
void A_Boss1Spikeballs(mobj_t *actor); void A_Boss1Spikeballs(mobj_t *actor);
void A_Boss3TakeDamage(mobj_t *actor); void A_Boss3TakeDamage(mobj_t *actor);
void A_Boss3Path(mobj_t *actor); void A_Boss3Path(mobj_t *actor);
void A_Boss3ShockThink(mobj_t *actor);
void A_LinedefExecute(mobj_t *actor); void A_LinedefExecute(mobj_t *actor);
void A_PlaySeeSound(mobj_t *actor); void A_PlaySeeSound(mobj_t *actor);
void A_PlayAttackSound(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 // 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. // 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 if (!mobj->movefactor) // to firing mode
{ {
UINT8 i; UINT8 i, numtospawn = 24;
angle_t ang = 0; angle_t ang = 0, interval = FixedAngle((360 << FRACBITS) / numtospawn);
mobj_t *shock, *sfirst, *sprev;
mobj->movecount = mobj->health+1; mobj->movecount = mobj->health+1;
mobj->movefactor = -512*FRACUNIT; mobj->movefactor = -512*FRACUNIT;
// shock the water! // 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_SetTarget(&shock->target, mobj);
P_InstaThrust(shock, ang, shock->info->speed); shock->fuse = shock->info->painchance;
P_CheckMissileSpawn(shock);
ang += (ANGLE_MAX/64); 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 // look for a new target
P_BossTargetPlayer(mobj, false); 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"}, {"s3k5b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Menu beep"},
{"s3k5c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Electric spark"}, {"s3k5c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Electric spark"},
{"s3k5d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Heavy hit"}, {"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"}, {"s3k5f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Crusher stomp"},
{"s3k60", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Accelerating"}, {"s3k60", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Accelerating"},
{"s3k61", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Drilling"}, {"s3k61", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Drilling"},