From 441aceb116e1cff142d15ee16b6f3dbc2ec4f610 Mon Sep 17 00:00:00 2001 From: lachwright Date: Mon, 21 Oct 2019 04:37:56 +0800 Subject: [PATCH 1/7] Add new dashmode colormap --- src/dehacked.c | 1 + src/r_draw.c | 38 +++++++++++++++++++++++++++++++++++++- src/r_draw.h | 1 + src/r_things.c | 12 ++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/dehacked.c b/src/dehacked.c index 8d240326d..7e4c0e357 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9081,6 +9081,7 @@ struct { {"TC_ALLWHITE",TC_ALLWHITE}, {"TC_RAINBOW",TC_RAINBOW}, {"TC_BLINK",TC_BLINK}, + {"TC_DASHMODE",TC_DASHMODE}, #endif {NULL,0} diff --git a/src/r_draw.c b/src/r_draw.c index 1754403c4..bb70a319f 100644 --- a/src/r_draw.c +++ b/src/r_draw.c @@ -130,10 +130,11 @@ UINT32 nflatxshift, nflatyshift, nflatshiftup, nflatmask; #define ALLWHITE_TT_CACHE_INDEX (MAXSKINS + 3) #define RAINBOW_TT_CACHE_INDEX (MAXSKINS + 4) #define BLINK_TT_CACHE_INDEX (MAXSKINS + 5) +#define DASHMODE_TT_CACHE_INDEX (MAXSKINS + 6) #define DEFAULT_STARTTRANSCOLOR 96 #define NUM_PALETTE_ENTRIES 256 -static UINT8** translationtablecache[MAXSKINS + 6] = {NULL}; +static UINT8** translationtablecache[MAXSKINS + 7] = {NULL}; const UINT8 Color_Index[MAXTRANSLATIONS-1][16] = { // {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // SKINCOLOR_NONE @@ -569,6 +570,40 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U dest_colormap[Color_Index[SKINCOLOR_BLUE-1][12-i]] = Color_Index[SKINCOLOR_BLUE-1][i]; dest_colormap[159] = dest_colormap[253] = dest_colormap[254] = 0; } + else if (skinnum == TC_DASHMODE) // This is a long one, because MotorRoach basically hand-picked the indices + { + // greens -> ketchups + dest_colormap[96] = dest_colormap[97] = 48; + dest_colormap[98] = 49; + dest_colormap[99] = 51; + dest_colormap[100] = 52; + dest_colormap[101] = dest_colormap[102] = 54; + dest_colormap[103] = 34; + dest_colormap[104] = 37; + dest_colormap[105] = 39; + dest_colormap[106] = 41; + for (i = 0; i < 5; i++) + dest_colormap[107 + i] = 43 + i; + + // reds -> steel blues + dest_colormap[32] = 146; + dest_colormap[33] = 147; + dest_colormap[34] = dest_colormap[35] = 170; + dest_colormap[36] = 171; + dest_colormap[37] = dest_colormap[38] = 172; + dest_colormap[39] = dest_colormap[40] = dest_colormap[41] = 173; + dest_colormap[42] = dest_colormap[43] = dest_colormap[44] = 174; + dest_colormap[45] = dest_colormap[46] = dest_colormap[47] = 175; + dest_colormap[71] = 139; + + // steel blues -> oranges + dest_colormap[170] = 52; + dest_colormap[171] = 54; + dest_colormap[172] = 56; + dest_colormap[173] = 42; + dest_colormap[174] = 45; + dest_colormap[175] = 47; + } return; } else if (color == SKINCOLOR_NONE) @@ -628,6 +663,7 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags) case TC_ALLWHITE: skintableindex = ALLWHITE_TT_CACHE_INDEX; break; case TC_RAINBOW: skintableindex = RAINBOW_TT_CACHE_INDEX; break; case TC_BLINK: skintableindex = BLINK_TT_CACHE_INDEX; break; + case TC_DASHMODE: skintableindex = DASHMODE_TT_CACHE_INDEX; break; default: skintableindex = skinnum; break; } diff --git a/src/r_draw.h b/src/r_draw.h index 3c1429722..a0ab74848 100644 --- a/src/r_draw.h +++ b/src/r_draw.h @@ -109,6 +109,7 @@ extern lumpnum_t viewborderlump[8]; #define TC_ALLWHITE -4 // For Cy-Brak-demon #define TC_RAINBOW -5 // For single colour #define TC_BLINK -6 // For item blinking, according to kart +#define TC_DASHMODE -7 // For Metal Sonic's dashmode // Initialize color translation tables, for player rendering etc. void R_InitTranslationTables(void); diff --git a/src/r_things.c b/src/r_things.c index 5c99edcec..3233e9650 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -753,6 +753,12 @@ static void R_DrawVisSprite(vissprite_t *vis) dc_transmap = vis->transmap; if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized) dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE); + else if (!(vis->cut & SC_PRECIP) + && vis->mobj->player && vis->mobj->player->dashmode >= 108 && vis->mobj->player->charflags & SF_MACHINE + &&((leveltime/2) & 1)) + { + dc_translation = R_GetTranslationColormap(TC_DASHMODE, 0, GTC_CACHE); + } else if (!(vis->cut & SC_PRECIP) && vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // MT_GHOST LOOKS LIKE A PLAYER SO USE THE PLAYER TRANSLATION TABLES. >_> { size_t skinnum = (skin_t*)vis->mobj->skin-skins; @@ -774,6 +780,12 @@ static void R_DrawVisSprite(vissprite_t *vis) // New colormap stuff for skins Tails 06-07-2002 if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized) dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE); + else if (!(vis->cut & SC_PRECIP) + && vis->mobj->player && vis->mobj->player->dashmode >= 108 && vis->mobj->player->charflags & SF_MACHINE + &&((leveltime/2) & 1)) + { + dc_translation = R_GetTranslationColormap(TC_DASHMODE, 0, GTC_CACHE); + } else if (!(vis->cut & SC_PRECIP) && vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // This thing is a player! { size_t skinnum = (skin_t*)vis->mobj->skin-skins; From c201879d6905b76061e1c96fa32704fbc020c4e2 Mon Sep 17 00:00:00 2001 From: lachwright Date: Wed, 23 Oct 2019 12:35:17 +0800 Subject: [PATCH 2/7] Add Metal's jet fume --- src/dehacked.c | 4 ++ src/info.c | 30 ++++++++++ src/info.h | 4 ++ src/p_user.c | 154 +++++++++++++++++++++++++++++++++++++++++++++---- 4 files changed, 180 insertions(+), 12 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 7e4c0e357..392c5f5ab 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -4292,6 +4292,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_TAILSOVERLAY_GASP", "S_TAILSOVERLAY_EDGE", + // [: + "S_JETFUMEFLASH", + // Blue Crawla "S_POSS_STND", "S_POSS_RUN1", @@ -7294,6 +7297,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_THOK", // Thok! mobj "MT_PLAYER", "MT_TAILSOVERLAY", // c: + "MT_METALJETFUME", // [: // Enemies "MT_BLUECRAWLA", // Crawla (Blue) diff --git a/src/info.c b/src/info.c index dd5338ef0..c83a7de11 100644 --- a/src/info.c +++ b/src/info.c @@ -858,6 +858,9 @@ state_t states[NUMSTATES] = {SPR_PLAY, SPR2_TALA|FF_SPR2MIDSTART, 35, {NULL}, 0, 0, S_TAILSOVERLAY_GASP}, // S_TAILSOVERLAY_GASP {SPR_PLAY, SPR2_TALB , 35, {NULL}, 0, 0, S_TAILSOVERLAY_EDGE}, // S_TAILSOVERLAY_EDGE + // [: + {SPR_JETF, 3|FF_ANIMATE|FF_FULLBRIGHT, 2, {NULL}, 1, 1, S_JETFUME1}, // S_JETFUMEFLASH + // Blue Crawla {SPR_POSS, 0, 5, {A_Look}, 0, 0, S_POSS_STND}, // S_POSS_STND {SPR_POSS, 0, 3, {A_Chase}, 0, 0, S_POSS_RUN2}, // S_POSS_RUN1 @@ -4089,6 +4092,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_METALJETFUME + -1, // doomednum + S_INVISIBLE, // spawnstate + 1000, // spawnhealth + S_JETFUMEFLASH, // 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 + 8, // speed + 8*FRACUNIT, // radius + 16*FRACUNIT, // height + 2, // display offset + 16, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags + S_JETFUME1 // raisestate + }, + { // MT_BLUECRAWLA 100, // doomednum S_POSS_STND, // spawnstate diff --git a/src/info.h b/src/info.h index 0502fd095..3336c4cc9 100644 --- a/src/info.h +++ b/src/info.h @@ -1016,6 +1016,9 @@ typedef enum state S_TAILSOVERLAY_GASP, S_TAILSOVERLAY_EDGE, + // [: + S_JETFUMEFLASH, + // Blue Crawla S_POSS_STND, S_POSS_RUN1, @@ -4040,6 +4043,7 @@ typedef enum mobj_type MT_THOK, // Thok! mobj MT_PLAYER, MT_TAILSOVERLAY, // c: + MT_METALJETFUME, // Enemies MT_BLUECRAWLA, // Crawla (Blue) diff --git a/src/p_user.c b/src/p_user.c index 33f84e2db..bef3a18c3 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1990,7 +1990,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) mobj_t *ghost2 = P_SpawnGhostMobj(mobj->player->followmobj); P_SetTarget(&ghost2->tracer, ghost); P_SetTarget(&ghost->tracer, ghost2); - ghost2->flags2 |= MF2_LINKDRAW; + ghost2->flags2 |= (mobj->player->followmobj->flags2 & MF2_LINKDRAW); } return ghost; @@ -2204,6 +2204,9 @@ boolean P_InSpaceSector(mobj_t *mo) // Returns true if you are in space return false; // No vacuum here, Captain! } +#define DASHMODE_THRESHOLD (3*TICRATE) +#define DASHMODE_MAX (DASHMODE_THRESHOLD + 3) + // // P_PlayerHitFloor // @@ -2312,7 +2315,7 @@ boolean P_PlayerHitFloor(player_t *player, boolean dorollstuff) { if (player->cmomx || player->cmomy) { - if (player->charflags & SF_DASHMODE && player->dashmode >= 3*TICRATE && player->panim != PA_DASH) + if (player->charflags & SF_DASHMODE && player->dashmode >= DASHMODE_THRESHOLD && player->panim != PA_DASH) P_SetPlayerMobjState(player->mo, S_PLAY_DASH); else if (player->speed >= FixedMul(player->runspeed, player->mo->scale) && (player->panim != PA_RUN || player->mo->state-states == S_PLAY_FLOAT_RUN)) @@ -2325,7 +2328,7 @@ boolean P_PlayerHitFloor(player_t *player, boolean dorollstuff) } else { - if (player->charflags & SF_DASHMODE && player->dashmode >= 3*TICRATE && player->panim != PA_DASH) + if (player->charflags & SF_DASHMODE && player->dashmode >= DASHMODE_THRESHOLD && player->panim != PA_DASH) P_SetPlayerMobjState(player->mo, S_PLAY_DASH); else if (player->speed >= FixedMul(player->runspeed, player->mo->scale) && (player->panim != PA_RUN || player->mo->state-states == S_PLAY_FLOAT_RUN)) @@ -2474,7 +2477,7 @@ static void P_CheckBustableBlocks(player_t *player) && !(player->powers[pw_super]) && !(player->charability == CA_GLIDEANDCLIMB) && !(player->pflags & PF_BOUNCING) - && !((player->charflags & SF_DASHMODE) && (player->dashmode >= 3*TICRATE)) + && !((player->charflags & SF_DASHMODE) && (player->dashmode >= DASHMODE_THRESHOLD)) && !((player->charability == CA_TWINSPIN) && (player->panim == PA_ABILITY)) && !(player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2) && !(player->pflags & PF_DRILLING) @@ -5291,7 +5294,7 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd) case CA_SLOWFALL: // Slow descent hover if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY) { - if (player->charflags & SF_DASHMODE && player->dashmode >= 3*TICRATE) + if (player->charflags & SF_DASHMODE && player->dashmode >= DASHMODE_THRESHOLD) P_SetPlayerMobjState(player->mo, S_PLAY_DASH); else if (player->speed >= FixedMul(player->runspeed, player->mo->scale)) P_SetPlayerMobjState(player->mo, S_PLAY_FLOAT_RUN); @@ -7936,7 +7939,7 @@ static void P_MovePlayer(player_t *player) if ((cmd->forwardmove != 0 || cmd->sidemove != 0) || (player->powers[pw_super] && !onground)) { // If the player is in dashmode, here's their peelout. - if (player->charflags & SF_DASHMODE && player->dashmode >= 3*TICRATE && player->panim == PA_RUN && !player->skidtime && (onground || ((player->charability == CA_FLOAT || player->charability == CA_SLOWFALL) && player->secondjump == 1) || player->powers[pw_super])) + if (player->charflags & SF_DASHMODE && player->dashmode >= DASHMODE_THRESHOLD && player->panim == PA_RUN && !player->skidtime && (onground || ((player->charability == CA_FLOAT || player->charability == CA_SLOWFALL) && player->secondjump == 1) || player->powers[pw_super])) P_SetPlayerMobjState (player->mo, S_PLAY_DASH); // If the player is moving fast enough, // break into a run! @@ -7960,7 +7963,7 @@ static void P_MovePlayer(player_t *player) // If your peelout animation is playing, and you're // going too slow, switch back to the run. - if (player->charflags & SF_DASHMODE && player->panim == PA_DASH && player->dashmode < 3*TICRATE) + if (player->charflags & SF_DASHMODE && player->panim == PA_DASH && player->dashmode < DASHMODE_THRESHOLD) P_SetPlayerMobjState(player->mo, S_PLAY_RUN); // If your running animation is playing, and you're @@ -10883,6 +10886,122 @@ static void P_DoTailsOverlay(player_t *player, mobj_t *tails) P_SetThingPosition(tails); } +// Metal Sonic's jet fume +static void P_DoMetalJetFume(player_t *player, mobj_t *fume) +{ + static const UINT8 FUME_SKINCOLORS[] = + { + SKINCOLOR_ICY, + SKINCOLOR_SKY, + SKINCOLOR_CYAN, + SKINCOLOR_WAVE, + SKINCOLOR_TEAL, + SKINCOLOR_AQUA, + SKINCOLOR_SEAFOAM, + SKINCOLOR_MINT, + SKINCOLOR_PERIDOT, + SKINCOLOR_LIME, + SKINCOLOR_YELLOW, + SKINCOLOR_SANDY, + SKINCOLOR_GOLD, + SKINCOLOR_APRICOT, + SKINCOLOR_SUNSET + }; + mobj_t *mo = player->mo; + angle_t angle = player->drawangle; + fixed_t dist; + panim_t panim = player->panim; + tic_t dashmode = player->dashmode; + boolean underwater = mo->eflags & MFE_UNDERWATER; + + if (panim != PA_WALK && panim != PA_RUN && panim != PA_DASH) // turn invisible when not in a coherent movement state + { + if (fume->state-states != fume->info->spawnstate) + P_SetMobjState(fume, S_SPAWNSTATE); + return; + } + + if (underwater) // No fume underwater; spawn bubbles instead! + { + fume->movedir += FixedAngle(FixedDiv(2 * player->speed, 3 * mo->scale)); + fume->movefactor += player->speed; + + if (fume->movefactor > FixedDiv(2 * player->normalspeed, 3 * mo->scale)) + { + INT16 i; + fixed_t radiusV = 4*FRACUNIT; + fixed_t radiusX = P_ReturnThrustX(mo, angle, -mo->radius >> (panim == PA_WALK ? 1 : 0)); + fixed_t radiusY = P_ReturnThrustY(mo, angle, -mo->radius >> (panim == PA_WALK ? 1 : 0)); + fixed_t factorX = P_ReturnThrustX(mo, angle + ANGLE_90, mo->scale); + fixed_t factorY = P_ReturnThrustY(mo, angle + ANGLE_90, mo->scale); + fixed_t offsetH, offsetV, x, y, z; + + for (i = -1; i < 2; i += 2) + { + offsetH = i*P_ReturnThrustX(fume, fume->movedir, radiusV); + offsetV = i*P_ReturnThrustY(fume, fume->movedir, radiusV); + x = mo->x + radiusX + FixedMul(offsetH, factorX); + y = mo->y + radiusY + FixedMul(offsetH, factorY); + z = mo->z + (mo->height >> 1) + offsetV; + P_SpawnMobj(x, y, z, MT_SMALLBUBBLE)->scale = mo->scale >> 1; + } + + fume->movefactor = 0; + } + + if (panim == PA_WALK) + { + if (fume->state-states != fume->info->spawnstate) + P_SetMobjState(fume, S_SPAWNSTATE); + return; + } + } + + if (fume->state-states == fume->info->spawnstate) // If currently inivisble, activate! + { + P_SetMobjState(fume, S_SEESTATE); + P_SetScale(fume, mo->scale); + } + + if (dashmode > DASHMODE_THRESHOLD && fume->state-states != fume->info->seestate) // If in dashmode, grow really big and flash + { + fume->destscale = mo->scale; + fume->flags2 ^= MF2_DONTDRAW; + fume->flags2 |= mo->flags2 & MF2_DONTDRAW; + } + else // Otherwise, pick a size and color depending on speed and proximity to dashmode + { + if (dashmode == DASHMODE_THRESHOLD && dashmode > fume->movecount) // If just about to enter dashmode, play the startup animation again + { + P_SetMobjState(fume, S_SEESTATE); + P_SetScale(fume, mo->scale << 1); + } + fume->flags2 = (fume->flags2 & ~MF2_DONTDRAW) | (mo->flags2 & MF2_DONTDRAW); + fume->destscale = (mo->scale + FixedDiv(player->speed, player->normalspeed)) / (underwater ? 6 : 3); + fume->color = FUME_SKINCOLORS[(dashmode * sizeof(FUME_SKINCOLORS)) / (DASHMODE_MAX + 1)]; + + if (underwater) + { + fume->frame = (fume->frame & FF_FRAMEMASK) | FF_ANIMATE | (P_RandomRange(0, 9) * FF_TRANS10); + } + } + + fume->movecount = dashmode; // keeps track of previous dashmode value so we know whether Metal is entering or leaving it + fume->eflags = (fume->eflags & ~MFE_VERTICALFLIP) | (mo->eflags & MFE_VERTICALFLIP); // Make sure to flip in reverse gravity! + + // Finally, set its position + dist = -mo->radius - FixedMul(fume->info->radius, fume->destscale - mo->scale/3); + + P_UnsetThingPosition(fume); + fume->x = mo->x + P_ReturnThrustX(fume, angle, dist); + fume->y = mo->y + P_ReturnThrustY(fume, angle, dist); + if (fume->eflags & MFE_VERTICALFLIP) + fume->z = mo->z + ((mo->height + fume->height) >> 1); + else + fume->z = mo->z + ((mo->height - fume->height) >> 1); + P_SetThingPosition(fume); +} + // // P_PlayerThink // @@ -11611,9 +11730,9 @@ void P_PlayerThink(player_t *player) if ((totallyradical && !floating) || (player->pflags & PF_STARTDASH)) { - if (dashmode < 3*TICRATE + 3) + if (dashmode < DASHMODE_MAX) dashmode++; // Counter. Adds 1 to dash mode per tic in top speed. - if (dashmode == 3*TICRATE) // This isn't in the ">=" equation because it'd cause the sound to play infinitely. + if (dashmode == DASHMODE_THRESHOLD) // This isn't in the ">=" equation because it'd cause the sound to play infinitely. S_StartSound(player->mo, sfx_s3ka2); // If the player enters dashmode, play this sound on the the tic it starts. } else if ((!totallyradical || !floating) && !(player->pflags & PF_SPINNING)) @@ -11624,7 +11743,7 @@ void P_PlayerThink(player_t *player) dashmode = 0; } - if (dashmode < 3*TICRATE) // Exits Dash Mode if you drop below speed/dash counter tics. Not in the above block so it doesn't keep disabling in midair. + if (dashmode < DASHMODE_THRESHOLD) // Exits Dash Mode if you drop below speed/dash counter tics. Not in the above block so it doesn't keep disabling in midair. { player->normalspeed = skins[player->skin].normalspeed; // Reset to default if not capable of entering dash mode. player->jumpfactor = skins[player->skin].jumpfactor; @@ -11646,7 +11765,7 @@ void P_PlayerThink(player_t *player) } else if (dashmode) { - if (dashmode >= 3*TICRATE) // catch getting the flag! + if (dashmode >= DASHMODE_THRESHOLD) // catch getting the flag! { player->normalspeed = skins[player->skin].normalspeed; player->jumpfactor = skins[player->skin].jumpfactor; @@ -12192,7 +12311,15 @@ void P_PlayerAfterThink(player_t *player) { P_SetTarget(&player->followmobj, P_SpawnMobjFromMobj(player->mo, 0, 0, 0, player->followitem)); P_SetTarget(&player->followmobj->tracer, player->mo); - player->followmobj->flags2 |= MF2_LINKDRAW; + switch (player->followmobj->type) + { + case MT_METALJETFUME: + player->followmobj->colorized = true; + break; + default: + player->followmobj->flags2 |= MF2_LINKDRAW; + break; + } } if (player->followmobj) @@ -12208,6 +12335,9 @@ void P_PlayerAfterThink(player_t *player) case MT_TAILSOVERLAY: // c: P_DoTailsOverlay(player, player->followmobj); break; + case MT_METALJETFUME: + P_DoMetalJetFume(player, player->followmobj); + break; default: var1 = 1; var2 = 0; From 6d498fe357b9a381dcba023386113e88326cd254 Mon Sep 17 00:00:00 2001 From: lachwright Date: Wed, 23 Oct 2019 13:41:32 +0800 Subject: [PATCH 3/7] Allow machine skins to damage objects in dashmode --- src/d_player.h | 4 ++++ src/p_user.c | 8 ++++---- src/r_things.c | 10 ++++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index ff8c31203..9e83cecaf 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -511,6 +511,10 @@ typedef struct player_s #endif } player_t; +// Values for dashmode +#define DASHMODE_THRESHOLD (3*TICRATE) +#define DASHMODE_MAX (DASHMODE_THRESHOLD + 3) + // Value for infinite lives #define INFLIVES 0x7F diff --git a/src/p_user.c b/src/p_user.c index bef3a18c3..e2101d6af 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1096,6 +1096,9 @@ boolean P_PlayerCanDamage(player_t *player, mobj_t *thing) // Spinning. if (player->pflags & PF_SPINNING) return true; + + if (player->dashmode >= DASHMODE_THRESHOLD && player->charflags & (SF_DASHMODE|SF_MACHINE) == (SF_DASHMODE|SF_MACHINE)) + return true; // From the front. if (((player->pflags & PF_GLIDING) || (player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2)) @@ -2204,9 +2207,6 @@ boolean P_InSpaceSector(mobj_t *mo) // Returns true if you are in space return false; // No vacuum here, Captain! } -#define DASHMODE_THRESHOLD (3*TICRATE) -#define DASHMODE_MAX (DASHMODE_THRESHOLD + 3) - // // P_PlayerHitFloor // @@ -2477,7 +2477,7 @@ static void P_CheckBustableBlocks(player_t *player) && !(player->powers[pw_super]) && !(player->charability == CA_GLIDEANDCLIMB) && !(player->pflags & PF_BOUNCING) - && !((player->charflags & SF_DASHMODE) && (player->dashmode >= DASHMODE_THRESHOLD)) + && !((player->charflags & (SF_DASHMODE|SF_MACHINE) == (SF_DASHMODE|SF_MACHINE)) && (player->dashmode >= DASHMODE_THRESHOLD)) && !((player->charability == CA_TWINSPIN) && (player->panim == PA_ABILITY)) && !(player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2) && !(player->pflags & PF_DRILLING) diff --git a/src/r_things.c b/src/r_things.c index 3233e9650..5fa97844a 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -754,8 +754,9 @@ static void R_DrawVisSprite(vissprite_t *vis) if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized) dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE); else if (!(vis->cut & SC_PRECIP) - && vis->mobj->player && vis->mobj->player->dashmode >= 108 && vis->mobj->player->charflags & SF_MACHINE - &&((leveltime/2) & 1)) + && vis->mobj->player && vis->mobj->player->dashmode >= DASHMODE_THRESHOLD + && vis->mobj->player->charflags & (SF_DASHMODE|SF_MACHINE) == (SF_DASHMODE|SF_MACHINE) + && ((leveltime/2) & 1)) { dc_translation = R_GetTranslationColormap(TC_DASHMODE, 0, GTC_CACHE); } @@ -781,8 +782,9 @@ static void R_DrawVisSprite(vissprite_t *vis) if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized) dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE); else if (!(vis->cut & SC_PRECIP) - && vis->mobj->player && vis->mobj->player->dashmode >= 108 && vis->mobj->player->charflags & SF_MACHINE - &&((leveltime/2) & 1)) + && vis->mobj->player && vis->mobj->player->dashmode >= DASHMODE_THRESHOLD + && vis->mobj->player->charflags & (SF_DASHMODE|SF_MACHINE) == (SF_DASHMODE|SF_MACHINE) + && ((leveltime/2) & 1)) { dc_translation = R_GetTranslationColormap(TC_DASHMODE, 0, GTC_CACHE); } From 7be046e16c9596de0f386cd39b0fd0d2f4890655 Mon Sep 17 00:00:00 2001 From: lachwright Date: Wed, 23 Oct 2019 13:46:30 +0800 Subject: [PATCH 4/7] Fix compile warnings --- src/p_user.c | 4 ++-- src/r_things.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index e2101d6af..e666386f2 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1097,7 +1097,7 @@ boolean P_PlayerCanDamage(player_t *player, mobj_t *thing) if (player->pflags & PF_SPINNING) return true; - if (player->dashmode >= DASHMODE_THRESHOLD && player->charflags & (SF_DASHMODE|SF_MACHINE) == (SF_DASHMODE|SF_MACHINE)) + if (player->dashmode >= DASHMODE_THRESHOLD && (player->charflags & (SF_DASHMODE|SF_MACHINE)) == (SF_DASHMODE|SF_MACHINE)) return true; // From the front. @@ -2477,7 +2477,7 @@ static void P_CheckBustableBlocks(player_t *player) && !(player->powers[pw_super]) && !(player->charability == CA_GLIDEANDCLIMB) && !(player->pflags & PF_BOUNCING) - && !((player->charflags & (SF_DASHMODE|SF_MACHINE) == (SF_DASHMODE|SF_MACHINE)) && (player->dashmode >= DASHMODE_THRESHOLD)) + && !(((player->charflags & (SF_DASHMODE|SF_MACHINE)) == (SF_DASHMODE|SF_MACHINE)) && (player->dashmode >= DASHMODE_THRESHOLD)) && !((player->charability == CA_TWINSPIN) && (player->panim == PA_ABILITY)) && !(player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2) && !(player->pflags & PF_DRILLING) diff --git a/src/r_things.c b/src/r_things.c index 5fa97844a..00eaae1c2 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -755,7 +755,7 @@ static void R_DrawVisSprite(vissprite_t *vis) dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE); else if (!(vis->cut & SC_PRECIP) && vis->mobj->player && vis->mobj->player->dashmode >= DASHMODE_THRESHOLD - && vis->mobj->player->charflags & (SF_DASHMODE|SF_MACHINE) == (SF_DASHMODE|SF_MACHINE) + && (vis->mobj->player->charflags & (SF_DASHMODE|SF_MACHINE)) == (SF_DASHMODE|SF_MACHINE) && ((leveltime/2) & 1)) { dc_translation = R_GetTranslationColormap(TC_DASHMODE, 0, GTC_CACHE); @@ -783,7 +783,7 @@ static void R_DrawVisSprite(vissprite_t *vis) dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE); else if (!(vis->cut & SC_PRECIP) && vis->mobj->player && vis->mobj->player->dashmode >= DASHMODE_THRESHOLD - && vis->mobj->player->charflags & (SF_DASHMODE|SF_MACHINE) == (SF_DASHMODE|SF_MACHINE) + && (vis->mobj->player->charflags & (SF_DASHMODE|SF_MACHINE)) == (SF_DASHMODE|SF_MACHINE) && ((leveltime/2) & 1)) { dc_translation = R_GetTranslationColormap(TC_DASHMODE, 0, GTC_CACHE); From 06bbbb5cf87269911c1f9ef5003020b6f3424be5 Mon Sep 17 00:00:00 2001 From: lachwright Date: Wed, 23 Oct 2019 13:54:15 +0800 Subject: [PATCH 5/7] Put dashmode players in pain state when damaging enemy with >1HP --- src/p_inter.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/p_inter.c b/src/p_inter.c index cce9df91b..b5b9ebbbf 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -477,6 +477,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) toucher->momy = -toucher->momy; if (player->charability == CA_FLY && player->panim == PA_ABILITY) toucher->momz = -toucher->momz/2; + if (player->dashmode >= DASHMODE_THRESHOLD && (player->charflags & (SF_DASHMODE|SF_MACHINE)) == (SF_DASHMODE|SF_MACHINE) + && player->panim == PA_DASH) + P_DoPlayerPain(player, special, special); } P_DamageMobj(special, toucher, toucher, 1, 0); if (player->charability == CA_TWINSPIN && player->panim == PA_ABILITY) From aa34f74f751966bf2e19e3f4ecf0de117bb853ed Mon Sep 17 00:00:00 2001 From: lachwright Date: Sat, 26 Oct 2019 08:32:36 +0800 Subject: [PATCH 6/7] Remove imtermediary state transitions --- src/p_user.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 383ca8966..a0a55e7c4 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -10930,7 +10930,7 @@ static void P_DoMetalJetFume(player_t *player, mobj_t *fume) if (panim != PA_WALK && panim != PA_RUN && panim != PA_DASH) // turn invisible when not in a coherent movement state { if (fume->state-states != fume->info->spawnstate) - P_SetMobjState(fume, S_SPAWNSTATE); + P_SetMobjState(fume, fume->info->spawnstate); return; } @@ -10965,14 +10965,14 @@ static void P_DoMetalJetFume(player_t *player, mobj_t *fume) if (panim == PA_WALK) { if (fume->state-states != fume->info->spawnstate) - P_SetMobjState(fume, S_SPAWNSTATE); + P_SetMobjState(fume, fume->info->spawnstate); return; } } if (fume->state-states == fume->info->spawnstate) // If currently inivisble, activate! { - P_SetMobjState(fume, S_SEESTATE); + P_SetMobjState(fume, fume->info->seestate); P_SetScale(fume, mo->scale); } @@ -10986,7 +10986,7 @@ static void P_DoMetalJetFume(player_t *player, mobj_t *fume) { if (dashmode == DASHMODE_THRESHOLD && dashmode > fume->movecount) // If just about to enter dashmode, play the startup animation again { - P_SetMobjState(fume, S_SEESTATE); + P_SetMobjState(fume, fume->seestate); P_SetScale(fume, mo->scale << 1); } fume->flags2 = (fume->flags2 & ~MF2_DONTDRAW) | (mo->flags2 & MF2_DONTDRAW); From 6c9ad67c8415fe11c8c84e1f9cf185fc7a1bbb23 Mon Sep 17 00:00:00 2001 From: lachwright Date: Sat, 26 Oct 2019 08:34:38 +0800 Subject: [PATCH 7/7] Fix pointer typo (whoops) --- src/p_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index a0a55e7c4..c9e904841 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -10986,7 +10986,7 @@ static void P_DoMetalJetFume(player_t *player, mobj_t *fume) { if (dashmode == DASHMODE_THRESHOLD && dashmode > fume->movecount) // If just about to enter dashmode, play the startup animation again { - P_SetMobjState(fume, fume->seestate); + P_SetMobjState(fume, fume->info->seestate); P_SetScale(fume, mo->scale << 1); } fume->flags2 = (fume->flags2 & ~MF2_DONTDRAW) | (mo->flags2 & MF2_DONTDRAW);