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:
commit
51ccb74a12
15 changed files with 132 additions and 21 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
15
src/g_game.c
15
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;
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
26
src/k_kart.c
26
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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -313,6 +313,9 @@ struct mobj_t
|
|||
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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
10
src/p_user.c
10
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
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ vector2_t* R_RotateSpriteOffsetsByPitchRoll(
|
|||
mobj_t* mobj,
|
||||
boolean vflip,
|
||||
boolean hflip,
|
||||
interpmobjstate_t *interp,
|
||||
vector2_t* out);
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue