diff --git a/src/dehacked.c b/src/dehacked.c index 239e1fe42..8c6147424 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -5497,6 +5497,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_ZAPSB10", "S_ZAPSB11", // blank frame + // Thunder spark + "S_THUNDERCOIN_SPARK", + // Invincibility Sparkles "S_IVSP", @@ -6523,7 +6526,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_FLAMEAURA_ORB", // Flame shield mobj "MT_BUBBLEWRAP_ORB", // Bubble shield mobj "MT_THUNDERCOIN_ORB", // Thunder shield mobj - "MT_IVSP", // invincibility sparkles + "MT_THUNDERCOIN_SPARK", // Thunder spark + "MT_IVSP", // Invincibility sparkles "MT_SUPERSPARK", // Super Sonic Spark // Freed Animals diff --git a/src/info.c b/src/info.c index b563c71fd..85630766a 100644 --- a/src/info.c +++ b/src/info.c @@ -2227,6 +2227,9 @@ state_t states[NUMSTATES] = {SPR_ZAPS, FF_FULLBRIGHT|FF_TRANS20 , 2, {NULL}, 0, 0, S_ZAPSB11}, // S_ZAPSB10 {SPR_NULL, 0, 15*2, {NULL}, 0, 0, S_ZAPSB2 }, // S_ZAPSB11 + // Thunder spark + {SPR_SSPK, FF_ANIMATE, 18, {NULL}, 1, 2, S_NULL}, // S_THUNDERCOIN_SPARK + // Invincibility Sparkles {SPR_IVSP, FF_ANIMATE, 32, {NULL}, 31, 1, S_NULL}, // S_IVSP @@ -11007,6 +11010,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_ZAPS14 // raisestate }, + { // MT_THUNDERCOIN_SPARK + -1, // doomednum + S_THUNDERCOIN_SPARK, // spawnstate + 1, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // 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 + 4*FRACUNIT, // radius + 4*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + { // MT_IVSP -1, // doomednum S_IVSP, // spawnstate diff --git a/src/info.h b/src/info.h index 2ae93f4c1..618e848c5 100644 --- a/src/info.h +++ b/src/info.h @@ -2411,6 +2411,9 @@ typedef enum state S_ZAPSB10, S_ZAPSB11, // blank frame + //Thunder spark + S_THUNDERCOIN_SPARK, + // Invincibility Sparkles S_IVSP, @@ -3456,7 +3459,8 @@ typedef enum mobj_type MT_FLAMEAURA_ORB, // Flame shield mobj MT_BUBBLEWRAP_ORB, // Bubble shield mobj MT_THUNDERCOIN_ORB, // Thunder shield mobj - MT_IVSP, // invincibility sparkles + MT_THUNDERCOIN_SPARK, // Thunder spark + MT_IVSP, // Invincibility sparkles MT_SUPERSPARK, // Super Sonic Spark // Freed Animals diff --git a/src/p_user.c b/src/p_user.c index 28ddd364b..2deda6d60 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3941,6 +3941,20 @@ void P_DoJumpShield(player_t *player) player->pflags &= ~PF_SPINNING; if (electric) { + mobj_t *spark; + INT32 i; +#define numangles 6 +#define limitangle (360/numangles) + angle_t travelangle = player->mo->angle + P_RandomRange(-limitangle, limitangle)*ANG1; + for (i = 0; i < numangles; i++) + { + spark = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_THUNDERCOIN_SPARK); + P_InstaThrust(spark, travelangle + i*(ANGLE_MAX/numangles), FixedMul(4*FRACUNIT, spark->scale)); + if (i % 2) + P_SetObjectMomZ(spark, -4*FRACUNIT, false); + } +#undef limitangle +#undef numangles S_StartSound(player->mo, sfx_s3k45); } else @@ -6304,8 +6318,9 @@ void P_ElementalFire(player_t *player, boolean cropcircle) if (cropcircle) { - travelangle = player->mo->angle + P_RandomRange(-ANGLE_45, ANGLE_45); #define numangles 8 +#define limitangle (180/numangles) + travelangle = player->mo->angle + P_RandomRange(-limitangle, limitangle)*ANG1; for (i = 0; i < numangles; i++) { flame = P_SpawnMobj(player->mo->x, player->mo->y, ground, MT_SPINFIRE); @@ -6319,6 +6334,7 @@ void P_ElementalFire(player_t *player, boolean cropcircle) P_InstaThrust(flame, flame->angle, FixedMul(3*FRACUNIT, flame->scale)); P_SetObjectMomZ(flame, 3*FRACUNIT, false); } +#undef limitangle #undef numangles } else