Merge pull request 'Option for Ring Racers skins to imitate SRB2Kart drifts' (#108) from v1driftjitter into blankart-dev

Reviewed-on: https://codeberg.org/NepDisk/blankart/pulls/108
This commit is contained in:
NepDisk 2025-09-12 23:16:31 +02:00
commit 51ccb74a12
15 changed files with 132 additions and 21 deletions

View file

@ -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

View file

@ -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 <graue@oceanbase.org>

View file

@ -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;

View file

@ -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;

View file

@ -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];

View file

@ -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

View file

@ -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)
));

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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)
{

View file

@ -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

View file

@ -54,6 +54,7 @@ vector2_t* R_RotateSpriteOffsetsByPitchRoll(
mobj_t* mobj,
boolean vflip,
boolean hflip,
interpmobjstate_t *interp,
vector2_t* out);
#endif

View file

@ -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);

View file

@ -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