diff --git a/src/dehacked.c b/src/dehacked.c index 9d0459ae..8ef36993 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6481,6 +6481,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit // The legend "S_SINK", + "S_SINK_SHIELD", "S_SINKTRAIL1", "S_SINKTRAIL2", "S_SINKTRAIL3", @@ -7249,6 +7250,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_THUNDERSHIELD", // Thunder Shield stuff "MT_SINK", // Kitchen Sink Stuff + "MT_SINK_SHIELD", "MT_SINKTRAIL", "MT_BATTLEBUMPER", // Battle Mode bumper diff --git a/src/info.c b/src/info.c index 76c535d7..60cac109 100644 --- a/src/info.c +++ b/src/info.c @@ -2795,10 +2795,11 @@ state_t states[NUMSTATES] = {SPR_THNS, 10, 2, {NULL}, 0, 0, S_THUNDERSHIELD24}, // S_THUNDERSHIELD23 {SPR_THNS, 11, 2, {NULL}, 0, 0, S_THUNDERSHIELD1}, // S_THUNDERSHIELD24 - {SPR_SINK, 0, 4, {A_SmokeTrailer}, MT_SINKTRAIL, 0, S_SINK}, // S_SINK - {SPR_SITR, 0, 1, {NULL}, 0, 0, S_SINKTRAIL2}, // S_SINKTRAIL1 - {SPR_SITR, 1, 5, {NULL}, 0, 0, S_SINKTRAIL3}, // S_SINKTRAIL2 - {SPR_SITR, 2, 3, {NULL}, 0, 0, S_NULL}, // S_SINKTRAIL3 + {SPR_SINK, 0, 4, {A_SmokeTrailer}, MT_SINKTRAIL, 0, S_SINK}, // S_SINK + {SPR_SINK, 0|FF_TRANS80|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_SINK_SHIELD}, // S_SINK_SHIELD + {SPR_SITR, 0, 1, {NULL}, 0, 0, S_SINKTRAIL2}, // S_SINKTRAIL1 + {SPR_SITR, 1, 5, {NULL}, 0, 0, S_SINKTRAIL3}, // S_SINKTRAIL2 + {SPR_SITR, 2, 3, {NULL}, 0, 0, S_NULL}, // S_SINKTRAIL3 {SPR_KBLN, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_BATTLEBUMPER1}, // S_BATTLEBUMPER1 {SPR_KBLN, FF_FULLBRIGHT|1, -1, {NULL}, 0, 0, S_BATTLEBUMPER2}, // S_BATTLEBUMPER2 @@ -15199,6 +15200,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_SINK_SHIELD + -1, // doomednum + S_SINK_SHIELD, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 100, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 24*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + { // MT_SINKTRAIL -1, // doomednum S_SINKTRAIL1, // spawnstate diff --git a/src/info.h b/src/info.h index 20209416..736fdfde 100644 --- a/src/info.h +++ b/src/info.h @@ -3326,6 +3326,7 @@ typedef enum state // The legend S_SINK, + S_SINK_SHIELD, S_SINKTRAIL1, S_SINKTRAIL2, S_SINKTRAIL3, @@ -4111,6 +4112,7 @@ typedef enum mobj_type MT_THUNDERSHIELD, // Thunder Shield stuff MT_SINK, // Kitchen Sink Stuff + MT_SINK_SHIELD, MT_SINKTRAIL, MT_BATTLEBUMPER, // Battle Mode bumpers diff --git a/src/k_kart.c b/src/k_kart.c index 1463ce03..8d5bb02e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2986,6 +2986,7 @@ static void K_MoveHeldObjects(player_t *player) case MT_BANANA_SHIELD: // Kart trailing items case MT_SSMINE_SHIELD: case MT_FAKESHIELD: + case MT_SINK_SHIELD: { mobj_t *cur = player->mo->hnext; mobj_t *targ = player->mo; @@ -4239,11 +4240,28 @@ void K_MoveKartPlayer(player_t *player, boolean onground) break; case KITEM_KITCHENSINK: if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) + { + mobj_t *mo; + player->kartstuff[k_itemheld] = 1; + S_StartSound(player->mo, sfx_s254); + mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_SINK_SHIELD); + if (mo) + { + mo->flags |= MF_NOCLIPTHING; + mo->threshold = 10; + mo->movecount = 1; + mo->movedir = 1; + P_SetTarget(&mo->target, player->mo); + P_SetTarget(&player->mo->hnext, mo); + } + } + else if (ATTACK_IS_DOWN && HOLDING_ITEM && player->kartstuff[k_itemheld]) // Sink thrown { K_ThrowKartItem(player, false, MT_SINK, 1, true); K_PlayTauntSound(player->mo); player->kartstuff[k_itemamount]--; player->kartstuff[k_itemheld] = 0; + K_CleanHnextList(player->mo); } break; case KITEM_SAD: diff --git a/src/p_inter.c b/src/p_inter.c index f980e70d..ca933069 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2219,7 +2219,8 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) if (target->target->player->kartstuff[k_itemheld]) { if ((target->type == MT_BANANA_SHIELD && target->target->player->kartstuff[k_itemtype] == KITEM_BANANA) // trail items - || (target->type == MT_SSMINE_SHIELD && target->target->player->kartstuff[k_itemtype] == KITEM_MINE)) + || (target->type == MT_SSMINE_SHIELD && target->target->player->kartstuff[k_itemtype] == KITEM_MINE) + || (target->type == MT_SINK_SHIELD && target->target->player->kartstuff[k_itemtype] == KITEM_KITCHENSINK)) { if (target->movedir != 0 && target->movedir < (UINT16)target->target->player->kartstuff[k_itemamount]) { diff --git a/src/p_mobj.c b/src/p_mobj.c index e1db00cc..d22ce3e7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6720,6 +6720,7 @@ void P_MobjThinker(mobj_t *mobj) case MT_BANANA_SHIELD: case MT_SSMINE_SHIELD: case MT_FAKESHIELD: + case MT_SINK_SHIELD: /*if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->health > 0 && !mobj->target->player->spectator) {