diff --git a/src/d_main.cpp b/src/d_main.cpp index 702f0eebe..e6f7a5231 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -90,8 +90,8 @@ #define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291 #define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b #define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9 -#define ASSET_HASH_MAIN_PK3 0x8fa63443716913fd -#define ASSET_HASH_MAPPATCH_PK3 0xf1c7678ded3a2d1b +#define ASSET_HASH_MAIN_PK3 0xb0693454f15fa8e3 +#define ASSET_HASH_MAPPATCH_PK3 0x01ca675676c950a1 #define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461 #ifdef USE_PATCH_FILE #define ASSET_HASH_PATCH_PK3 0x0000000000000000 diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 651fc0b0f..0454ce4f9 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -131,6 +131,11 @@ static void Skin2_OnChange(void); static void Skin3_OnChange(void); static void Skin4_OnChange(void); +static void Jitter_OnChange(void); +static void Jitter2_OnChange(void); +static void Jitter3_OnChange(void); +static void Jitter4_OnChange(void); + static void Follower_OnChange(void); static void Follower2_OnChange(void); static void Follower3_OnChange(void); @@ -1115,6 +1120,7 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_skin[i]); CV_RegisterVar(&cv_follower[i]); CV_RegisterVar(&cv_followercolor[i]); + CV_RegisterVar(&cv_jitterlegacy[i]); } // preferred number of players @@ -1932,6 +1938,7 @@ enum { WP_KICKSTARTACCEL = 1<<0, WP_SHRINKME = 1<<1, WP_FLIPCAM = 1<<2, + WP_LEGACYJITTER = 1<<3 }; void WeaponPref_Send(UINT8 ssplayer) @@ -1947,6 +1954,9 @@ void WeaponPref_Send(UINT8 ssplayer) if (cv_flipcam[ssplayer].value) prefs |= WP_FLIPCAM; + if (!(cv_jitterlegacy[ssplayer].value)) + prefs |= WP_LEGACYJITTER; + UINT8 buf[2]; buf[0] = prefs; buf[1] = cv_mindelay.value; @@ -1969,6 +1979,9 @@ void WeaponPref_Save(UINT8 **cp, INT32 playernum) if (player->pflags & PF_FLIPCAM) prefs |= WP_FLIPCAM; + if (player->jitterlegacy) + prefs |= WP_LEGACYJITTER; + WRITEUINT8(*cp, prefs); } @@ -1979,6 +1992,7 @@ void WeaponPref_Parse(UINT8 **cp, INT32 playernum) UINT8 prefs = READUINT8(*cp); player->pflags &= ~(PF_KICKSTARTACCEL|PF_SHRINKME|PF_FLIPCAM); + player->jitterlegacy = false; if (prefs & WP_KICKSTARTACCEL) player->pflags |= PF_KICKSTARTACCEL; @@ -1989,6 +2003,9 @@ void WeaponPref_Parse(UINT8 **cp, INT32 playernum) if (prefs & WP_FLIPCAM) player->pflags |= PF_FLIPCAM; + if (prefs & WP_LEGACYJITTER) + player->jitterlegacy = true; + if (leveltime < 2) { // BAD HACK: No other place I tried to slot this in @@ -6829,6 +6846,39 @@ static void Followercolor4_OnChange(void) } } +// Changes a player's jitter settings. +static void Jitter_OnChange(void) +{ + if (!Playing()) + return; // don't send anything there. + + SendNameAndColor(0); +} + +static void Jitter2_OnChange(void) +{ + if (!Playing()) + return; // don't send anything there. + + SendNameAndColor(1); +} + +static void Jitter3_OnChange(void) +{ + if (!Playing()) + return; // don't send anything there. + + SendNameAndColor(2); +} + +static void Jitter4_OnChange(void) +{ + if (!Playing()) + return; // don't send anything there. + + SendNameAndColor(3); +} + /** Sends a skin change for the console player, unless that player is moving. * \sa cv_skin, Skin2_OnChange, Color_OnChange * \author Graue diff --git a/src/d_player.h b/src/d_player.h index cc6687518..1f345a272 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -565,6 +565,8 @@ struct player_t // SRB2kart stuff INT32 kartstuff[NUMKARTSTUFF]; INT32 karthud[NUMKARTHUD]; + boolean jitterlegacy; // If true, makes Ring Racers characters jitter during drifts like + // SRB2Kart. // Basic gameplay things UINT8 position; // Used for Kart positions, mostly for deterministic stuff @@ -600,6 +602,7 @@ struct player_t fixed_t driftcharge; // Charge your drift so you can release a burst of speed UINT8 driftboost; // (0 to 125) - Boost you get from drifting tic_t driftsparkGrowTimer; + tic_t driftelapsed; // Elapsed time spent during a drift. SINT8 aizdriftstrat; // (-1 to 1) - Let go of your drift while boosting? Helper for the SICK STRATZ (sliptiding!) you have just unlocked INT32 aizdrifttilt; diff --git a/src/g_game.c b/src/g_game.c index a86c9c7df..de0da47e9 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -442,6 +442,17 @@ consvar_t cv_shrinkme[MAXSPLITSCREENPLAYERS] = { CVAR_INIT ("shrinkme4", "Off", CV_CALL, CV_OnOff, weaponPrefChange4) }; +// Jon's lament +static CV_PossibleValue_t driftjitter_cons_t[] = {{0, "SRB2Kart"}, {1, "Ring Racers"}, {0, NULL}}; + +// Drift jitter settings. +consvar_t cv_jitterlegacy[MAXSPLITSCREENPLAYERS] = { + CVAR_INIT ("driftjitter", "Ring Racers", CV_SAVE|CV_CALL|CV_NOINIT, driftjitter_cons_t, weaponPrefChange), + CVAR_INIT ("driftjitter2", "Ring Racers", CV_SAVE|CV_CALL|CV_NOINIT, driftjitter_cons_t, weaponPrefChange), + CVAR_INIT ("driftjitter3", "Ring Racers", CV_SAVE|CV_CALL|CV_NOINIT, driftjitter_cons_t, weaponPrefChange), + CVAR_INIT ("driftjitter4", "Ring Racers", CV_SAVE|CV_CALL|CV_NOINIT, driftjitter_cons_t, weaponPrefChange) +}; + static CV_PossibleValue_t zerotoone_cons_t[] = {{0, "MIN"}, {FRACUNIT, "MAX"}, {0, NULL}}; consvar_t cv_deadzone[MAXSPLITSCREENPLAYERS] = { CVAR_INIT ("deadzone", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL), @@ -2467,6 +2478,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) UINT8 lastsafelap; UINT8 lastsafestarpost; UINT16 bigwaypointgap; + boolean jitterlegacy = false; score = players[player].score; lives = players[player].lives; @@ -2490,6 +2502,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) followercolor = players[player].followercolor; followerskin = players[player].followerskin; + jitterlegacy = players[player].jitterlegacy; + availabilities = players[player].availabilities; charflags = players[player].charflags; @@ -2689,6 +2703,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) p->eggmanblame = -1; p->nocontrol = nocontrol; p->kickstartaccel = kickstartaccel; + p->jitterlegacy = jitterlegacy; p->ringvolume = 255; p->ringtransparency = 255; diff --git a/src/g_game.h b/src/g_game.h index a684f8a7e..fa8ca8763 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -78,6 +78,8 @@ extern consvar_t cv_invertmouse; extern consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_shrinkme[MAXSPLITSCREENPLAYERS]; +extern consvar_t cv_jitterlegacy[MAXSPLITSCREENPLAYERS]; + extern consvar_t cv_deadzone[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_deadzonestyle[MAXSPLITSCREENPLAYERS]; diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index e76545f4e..0d0b7431f 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4888,7 +4888,10 @@ static void HWR_ProjectSprite(mobj_t *thing) if (R_ThingIsUsingBakedOffsets(thing)) { R_RotateSpriteOffsetsByPitchRoll(thing, - vflip, hflip, &visoffs); + vflip, + hflip, + &interp, + &visoffs); } #endif diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 2c55669f6..f2914ba6f 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1806,7 +1806,7 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) // x offset xx = FIXED_TO_FLOAT(FixedMul(FixedMul( FixedMul(xoffs,spr->mobj->spritexscale), - hflipmul), + hflipmul), FINECOSINE(pitchR >> ANGLETOFINESHIFT) )); xy = FIXED_TO_FLOAT(FixedMul(FixedMul( @@ -1818,7 +1818,7 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) // y offset yx = FIXED_TO_FLOAT(FixedMul(FixedMul( FixedMul(yoffs,spr->mobj->spritexscale), - hflipmul), + hflipmul), FINECOSINE(rollR >> ANGLETOFINESHIFT) )); diff --git a/src/k_kart.c b/src/k_kart.c index 5e8876980..49fb56801 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1565,17 +1565,21 @@ void K_KartMoveAnimation(player_t *player) UINT16 buttons = K_GetKartButtons(player); const boolean spinningwheels = (player->speed > 0); const boolean lookback = ((buttons & BT_LOOKBACK) == BT_LOOKBACK); + const boolean skincompat = wadfiles[((skin_t *)player->mo->skin)->wadnum]->compatmode; SINT8 turndir = intsign(player->cmd.turning); SINT8 destGlanceDir = 0; SINT8 drift = player->drift; UINT8 spr2, glanceofs; + player->mo->rollingxoffset = 0; + player->mo->rollingyoffset = 0; + if (!lookback) player->pflags &= ~PF_GAINAX; // Sliptides: drift -> lookback frames - if (abs(player->aizdriftturn) >= ANGLE_90 && !wadfiles[((skin_t *)player->mo->skin)->wadnum]->compatmode) + if (abs(player->aizdriftturn) >= ANGLE_90 && !skincompat) { destGlanceDir = -(2*intsign(player->aizdriftturn)); player->glanceDir = destGlanceDir; @@ -1690,13 +1694,21 @@ void K_KartMoveAnimation(player_t *player) if (onground && drift) { - if (drift > 0) - turndir *= -1; + if ((player->jitterlegacy) && (!skincompat)) + { + // Make RR characters imitate legacy jitters. + player->mo->rollingxoffset = ((player->driftelapsed & 1) * 2) * -intsign(drift); + } + else + { + if (drift > 0) + turndir *= -1; - if (turndir == -1) - spr2 += 2; // Inwards drift - else if (turndir == 1) - spr2 += 1; // Outwards drift + if (turndir == -1) + spr2 += 2; // Inwards drift + else if (turndir == 1) + spr2 += 1; // Outwards drift + } } else if (glanceofs) spr2 += glanceofs+1; diff --git a/src/p_mobj.c b/src/p_mobj.c index 65b80a432..5abe6906a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6752,7 +6752,6 @@ void P_RunOverlays(void) mo->bakezpiv = mo->target->bakezpiv; } - if ((mo->flags & MF_DONTENCOREMAP) != (mo->target->flags & MF_DONTENCOREMAP)) mo->flags ^= MF_DONTENCOREMAP; diff --git a/src/p_mobj.h b/src/p_mobj.h index c514eb966..63bdedfc3 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -312,6 +312,9 @@ struct mobj_t fixed_t old_spritexscale2, old_spriteyscale2; fixed_t old_spritexoffset, old_spriteyoffset; fixed_t old_spritexoffset2, old_spriteyoffset2; + + // X and Y offsets that rotate alongside the sprite. + INT16 rollingxoffset, rollingyoffset; pslope_t *floorspriteslope; // The slope that the floorsprite is rotated by INT16 lightlevel; // Add to sector lightlevel, -255 - 255 diff --git a/src/p_saveg.c b/src/p_saveg.c index 260a31635..7deb2a17a 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2363,7 +2363,8 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 diff2 |= MD2_TID; if (mobj->spritexscale != FRACUNIT || mobj->spriteyscale != FRACUNIT) diff2 |= MD2_SPRITESCALE; - if (mobj->spritexoffset || mobj->spriteyoffset) + if (mobj->spritexoffset || mobj->spriteyoffset || + mobj->rollingxoffset || mobj->rollingyoffset) diff2 |= MD2_SPRITEOFFSET; if (mobj->sprxoff || mobj->spryoff || mobj->sprzoff) diff2 |= MD2_WORLDOFFSET; @@ -2605,6 +2606,8 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 { WRITEFIXED(save->p, mobj->spritexoffset); WRITEFIXED(save->p, mobj->spriteyoffset); + WRITEINT16(save->p, mobj->rollingxoffset); + WRITEINT16(save->p, mobj->rollingyoffset); } if (diff2 & MD2_WORLDOFFSET) { @@ -3872,10 +3875,13 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) { mobj->spritexoffset = READFIXED(save->p); mobj->spriteyoffset = READFIXED(save->p); + mobj->rollingxoffset = READINT16(save->p); + mobj->rollingyoffset = READINT16(save->p); } else { mobj->spritexoffset = mobj->spriteyoffset = 0; + mobj->rollingxoffset = mobj->rollingyoffset = 0; } if (diff2 & MD2_WORLDOFFSET) { diff --git a/src/p_user.c b/src/p_user.c index eb24e8f75..25a1a7211 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3839,6 +3839,16 @@ void P_PlayerThink(player_t *player) player->airtime++; } + // BlanKart: Track drifting time. + if (player->drift != 0) + { + player->driftelapsed++; + } + else + { + player->driftelapsed = 0; + } + cmd = &player->cmd; // SRB2kart diff --git a/src/r_patch.h b/src/r_patch.h index 89f3c27c2..555650c07 100644 --- a/src/r_patch.h +++ b/src/r_patch.h @@ -54,6 +54,7 @@ vector2_t* R_RotateSpriteOffsetsByPitchRoll( mobj_t* mobj, boolean vflip, boolean hflip, + interpmobjstate_t *interp, vector2_t* out); #endif diff --git a/src/r_patchrotation.c b/src/r_patchrotation.c index dcd74088a..ec7aeefdf 100644 --- a/src/r_patchrotation.c +++ b/src/r_patchrotation.c @@ -137,6 +137,7 @@ vector2_t* R_RotateSpriteOffsetsByPitchRoll( mobj_t* mobj, boolean vflip, boolean hflip, + interpmobjstate_t *interp, vector2_t* out) { fixed_t rotcos, rotsin, finx, finy; @@ -156,7 +157,7 @@ vector2_t* R_RotateSpriteOffsetsByPitchRoll( angle_t viewingAngle = R_PointToAngle(mobj->x, mobj->y); // rotate ourselves entirely by the sprite's own rotation angle - angle_t visrot = R_SpriteRotationAngle(mobj, NULL, NULL); + angle_t visrot = R_SpriteRotationAngle(mobj, NULL, interp); // xoffs = (-cos(xoff) + sin(yoff)) xoffs = @@ -191,8 +192,8 @@ vector2_t* R_RotateSpriteOffsetsByPitchRoll( vypiv = (INT16)(FixedMul((xpiv / FRACUNIT), pitchMul)); // rotate by rollangle - finx = (visx + visy); - finy = -visz; + finx = (visx + visy) + mobj->rollingxoffset; + finy = -visz + mobj->rollingyoffset; rotcos = FINECOSINE(visrollang >> ANGLETOFINESHIFT); rotsin = FINESINE(visrollang >> ANGLETOFINESHIFT); diff --git a/src/r_things.cpp b/src/r_things.cpp index fcd0f4c7a..b79019803 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -857,7 +857,8 @@ boolean R_ThingIsFlashing(mobj_t *thing) boolean R_ThingIsUsingBakedOffsets(mobj_t* thing) { return ((thing->bakexoff) || (thing->bakeyoff) || (thing->bakezoff) || - (thing->bakexpiv) || (thing->bakeypiv) || (thing->bakezpiv)); + (thing->bakexpiv) || (thing->bakeypiv) || (thing->bakezpiv) || + (thing->rollingxoffset) || (thing->rollingyoffset)); } UINT8 *R_GetSpriteTranslation(vissprite_t *vis) @@ -1940,7 +1941,10 @@ static void R_ProjectSprite(mobj_t *thing) if (R_ThingIsUsingBakedOffsets(thing)) { R_RotateSpriteOffsetsByPitchRoll(thing, - vflip, hflip, &visoffs); + vflip, + hflip, + &interp, + &visoffs); } #endif @@ -1948,7 +1952,8 @@ static void R_ProjectSprite(mobj_t *thing) { spr_offset = interp.spritexoffset; #ifdef ROTSPRITE - spr_topoffset = (interp.spriteyoffset + FixedDiv((visoffs.y * visoffymul), mapobjectscale)); + spr_topoffset = (interp.spriteyoffset + FixedDiv((visoffs.y * visoffymul), + mapobjectscale)); #else spr_topoffset = interp.spriteyoffset; #endif @@ -1963,7 +1968,8 @@ static void R_ProjectSprite(mobj_t *thing) spr_offset += (interp.spritexoffset) * flipoffset; #ifdef ROTSPRITE spr_topoffset += (interp.spriteyoffset + FixedDiv((visoffs.y * visoffymul), - mapobjectscale)) * flipoffset; + mapobjectscale)) + * flipoffset; #else spr_topoffset += interp.spriteyoffset * flipoffset; #endif