diff --git a/src/dehacked.c b/src/dehacked.c index 9ef048e24..6d70d3270 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7017,6 +7017,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_BOMBEXPLOSIONSOUND", "MT_SMOLDERING", // New explosion + "MT_BOOMEXPLODE", "MT_BOOMPARTICLE", "MT_BLUELIGHTNING", // Lightning stuff diff --git a/src/info.c b/src/info.c index 7d1a9bb00..96d34dbfc 100644 --- a/src/info.c +++ b/src/info.c @@ -15056,6 +15056,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BOOMEXPLODE + -1, // doomednum + S_SLOWBOOM1, // 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 + 1, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY|MF_BOUNCE|MF_SCENERY, // flags + S_NULL // raisestate + }, + { // MT_BOOMPARTICLE -1, // doomednum S_INVISIBLE, // spawnstate diff --git a/src/info.h b/src/info.h index fa751c7a5..d7ec70b57 100644 --- a/src/info.h +++ b/src/info.h @@ -3999,6 +3999,7 @@ typedef enum mobj_type MT_BOMBEXPLOSIONSOUND, MT_SMOLDERING, // New explosion + MT_BOOMEXPLODE, MT_BOOMPARTICLE, MT_BLUELIGHTNING, // Lightning stuff diff --git a/src/k_kart.c b/src/k_kart.c index 4f36b3cc7..daddb0c0c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1712,7 +1712,7 @@ void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 } // Spawns the purely visual explosion -void K_SpawnBobombExplosion(mobj_t *source) +void K_SpawnBobombExplosion(mobj_t *source, UINT8 color) { INT32 i, radius, height; mobj_t *smoldering = P_SpawnMobj(source->x, source->y, source->z, MT_SMOLDERING); @@ -1724,6 +1724,9 @@ void K_SpawnBobombExplosion(mobj_t *source) radius = source->radius>>FRACBITS; height = source->height>>FRACBITS; + if (!color) + color = SKINCOLOR_RED; + for (i = 0; i < 32; i++) { dust = P_SpawnMobj(source->x, source->y, source->z, MT_SMOKE); @@ -1734,15 +1737,15 @@ void K_SpawnBobombExplosion(mobj_t *source) truc = P_SpawnMobj(source->x + P_RandomRange(-radius, radius)*FRACUNIT, source->y + P_RandomRange(-radius, radius)*FRACUNIT, - source->z + P_RandomRange(0, height)*FRACUNIT, MT_BOSSEXPLODE); + source->z + P_RandomRange(0, height)*FRACUNIT, MT_BOOMEXPLODE); truc->scale = source->scale*2; truc->destscale = source->scale*6; - P_SetMobjState(truc, S_SLOWBOOM1); speed = FixedMul(10*FRACUNIT, source->scale)>>FRACBITS; truc->momx = P_RandomRange(-speed, speed)*FRACUNIT; truc->momy = P_RandomRange(-speed, speed)*FRACUNIT; speed = FixedMul(20*FRACUNIT, source->scale)>>FRACBITS; truc->momz = P_RandomRange(-speed, speed)*FRACUNIT; + truc->color = color; } for (i = 0; i < 16; i++) @@ -1769,6 +1772,7 @@ void K_SpawnBobombExplosion(mobj_t *source) if (P_RandomChance(FRACUNIT/2)) truc->momz = -truc->momz; truc->tics = TICRATE*2; + truc->color = color; } } diff --git a/src/k_kart.h b/src/k_kart.h index 9d1cf08f3..3ebd418ff 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -28,7 +28,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source); void K_ExplodePlayer(player_t *player, mobj_t *source); void K_StealBalloon(player_t *player, player_t *victim, boolean force); void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit, mobj_t *source); -void K_SpawnBobombExplosion(mobj_t *source); +void K_SpawnBobombExplosion(mobj_t *source, UINT8 color); void K_SpawnDriftTrail(player_t *player); void K_DoMushroom(player_t *player, boolean doPFlag, boolean startboost); void K_DoBouncePad(mobj_t *mo, fixed_t vertispeed); diff --git a/src/p_enemy.c b/src/p_enemy.c index 81ce35eca..380e60a39 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8270,7 +8270,10 @@ void A_BobombExplode(mobj_t *actor) for (d = 0; d < 16; d++) K_SpawnKartExplosion(actor->x, actor->y, actor->z, actor->info->painchance + 32*FRACUNIT, 32, type, d*(ANGLE_45/4), true, false, actor->target); // 32 <-> 64 - K_SpawnBobombExplosion(actor); + if (actor->target->player) + K_SpawnBobombExplosion(actor, actor->target->player->skincolor); + else + K_SpawnBobombExplosion(actor, SKINCOLOR_RED); P_SpawnMobj(actor->x, actor->y, actor->z, MT_BOMBEXPLOSIONSOUND); diff --git a/src/p_mobj.c b/src/p_mobj.c index d1311a546..bd10d8983 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3039,11 +3039,22 @@ static boolean P_SceneryZMovement(mobj_t *mo) switch (mo->type) { + case MT_BOOMEXPLODE: case MT_BOOMPARTICLE: if ((mo->flags & MF_BOUNCE) && (mo->z <= mo->floorz || mo->z+mo->height >= mo->ceilingz)) { + // set standingslope + P_TryMove(mo, mo->x, mo->y, true); mo->momz = -mo->momz; - mo->z += mo->momz; +#ifdef ESLOPE + if (mo->standingslope) + { + if (mo->flags & MF_NOCLIPHEIGHT) + mo->standingslope = NULL; + else if (!P_IsObjectOnGround(mo)) + P_SlopeLaunch(mo); + } +#endif S_StartSound(mo, mo->info->activesound); } break; @@ -6728,6 +6739,7 @@ void P_MobjThinker(mobj_t *mobj) P_SetMobjState(smoke, S_QUICKBOOM1); smoke->scale = mobj->scale/2; smoke->destscale = mobj->scale; + smoke->color = mobj->color; } else {