diff --git a/src/dehacked.c b/src/dehacked.c index e488d3ee6..998b299d3 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6395,6 +6395,10 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_SHADOW", "S_WHITESHADOW", + "S_BUMP1", + "S_BUMP2", + "S_BUMP3", + #ifdef SEENAMES "S_NAMECHECK", #endif @@ -6958,6 +6962,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_WAYPOINT", "MT_SHADOW", + "MT_BUMP", + #ifdef SEENAMES "MT_NAMECHECK", #endif diff --git a/src/info.c b/src/info.c index 71711b681..2d558168a 100644 --- a/src/info.c +++ b/src/info.c @@ -58,7 +58,7 @@ char sprnames[NUMSPRITES + 1][5] = "SPRG","BSPR","RNDM","RPOP","KFRE","DRIF","DSMO","FITM","DFAK","BANA", "DBAN","GSHE","GSTR","DGSH","RSHE","RSTR","DRSH","BOMB","BLIG","LIGH", "SINK","SITR","LAKI","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS", - "BUZB","CHOM","SACO","CRAB", "SHAD" + "BUZB","CHOM","SACO","CRAB", "SHAD", "BUMP" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -2851,6 +2851,10 @@ state_t states[NUMSTATES] = {SPR_SHAD, FF_TRANS50, -1, {NULL}, 0, 0, S_NULL}, // S_SHADOW {SPR_SHAD, FF_FULLBRIGHT|FF_TRANS50|1, -1, {NULL}, 0, 0, S_NULL}, // S_WHITESHADOW + {SPR_BUMP, 0, 5, {NULL}, 0, 0, S_BUMP2}, // S_BUMP1 + {SPR_BUMP, 1, 5, {NULL}, 0, 0, S_BUMP3}, // S_BUMP2 + {SPR_BUMP, 2, 5, {NULL}, 0, 0, S_NULL}, // S_BUMP3 + #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK #endif @@ -16510,6 +16514,32 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BUMP + -1, // doomednum + S_BUMP1, // spawnstate + 1000, // 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 + 32*FRACUNIT, // radius + 64*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_SCENERY|MF_NOCLIP|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, // ============================================================================================================================// #ifdef SEENAMES diff --git a/src/info.h b/src/info.h index c6c448f01..1e4bde5c3 100644 --- a/src/info.h +++ b/src/info.h @@ -617,6 +617,8 @@ typedef enum sprite SPR_CRAB, // Crystal Abyss mobs SPR_SHAD, // TD shadows + SPR_BUMP, // Player/shell bump + SPR_FIRSTFREESLOT, SPR_LASTFREESLOT = SPR_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1, NUMSPRITES @@ -3364,6 +3366,10 @@ typedef enum state S_SHADOW, S_WHITESHADOW, + S_BUMP1, + S_BUMP2, + S_BUMP3, + #ifdef SEENAMES S_NAMECHECK, #endif @@ -4001,6 +4007,8 @@ typedef enum mobj_type MT_MOSSYTREE, MT_SHADOW, + MT_BUMP, + #ifdef SEENAMES MT_NAMECHECK, #endif diff --git a/src/k_kart.c b/src/k_kart.c index 94cf06079..efc931ed9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1048,8 +1048,8 @@ boolean K_IsTouching(mobj_t *mobj1, mobj_t *mobj2) void K_SwapMomentum(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) { - fixed_t newx; - fixed_t newy; + fixed_t newx, newy; + mobj_t *fx; if (mobj1 == NULL || mobj2 == NULL) return; @@ -1064,6 +1064,14 @@ void K_SwapMomentum(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) S_StartSound(mobj1, cv_collidesoundnum.value); //S_StartSound(mobj2, cv_collidesoundnum.value); } + + fx = P_SpawnMobj((mobj1->x + mobj2->x)/2, (mobj1->y + mobj2->y)/2, (mobj1->z + mobj2->z)/2, MT_BUMP); + if (mobj1->eflags & MFE_VERTICALFLIP) + fx->eflags |= MFE_VERTICALFLIP; + else + fx->eflags &= ~MFE_VERTICALFLIP; + fx->scale = mobj1->scale; + if (deltaV1 < (cv_collideminimum.value * FRACUNIT / 2)) { fixed_t a = 0; diff --git a/src/p_mobj.c b/src/p_mobj.c index 52c52fbc9..e27bb1463 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1737,11 +1737,18 @@ void P_XYMovement(mobj_t *mo) //{ SRB2kart - Green Shell, Fireball if (mo->type == MT_GREENITEM) { + mobj_t *fx; + fx = P_SpawnMobj(mo->x, mo->y, mo->z, MT_BUMP); + if (mo->eflags & MFE_VERTICALFLIP) + fx->eflags |= MFE_VERTICALFLIP; + else + fx->eflags &= ~MFE_VERTICALFLIP; + fx->scale = mo->scale; if (mo->health > 1) { - S_StartSound(mo, mo->info->attacksound); - mo->health--; - mo->threshold = 0; + S_StartSound(mo, mo->info->attacksound); + mo->health--; + mo->threshold = 0; } else if (mo->health == 1) {