Acceleration Kickstart, my little hobby project.

It's no secret that holding down a button a lot can fuck with your wrists and fingers. It's too late for me to be damageless, but I can at least create an option to reduce further harm.

This accessibility feature, when enabled (kickstartaccel and kickstartaccel2/3/4 in the console) behaves with the following properties:
* Hold accelerate for 1 second to lock it down.
* Press again to release.
* Short holds/presses do nothing (good for POSITION).
* Continue holding it during the releasing press to re-lock it.
* A small triangular UI element is added next to the speedometer sticker, which displays the current state of the acceleration kickstart for visual feedback. (NO SPLITS SUPPORT YET)

In addition:
* Add PF_ACCELDOWN and PF_BRAKEDOWN, and BT_REALACCELERATE (which ACCELDOWN tracks). Even if this feature never gets merged, BT_REALACCELERATE is required because sneakers and boosters force it on too (extending this is how I implemented it).
* Fix the dehacked playerflag list being out of shape.
* I replaced some existing flags during development of this branch, so their old uses have been whittled away.
This commit is contained in:
toaster 2021-02-20 23:10:18 +00:00
parent 5ee4680c04
commit 08d087c6b5
13 changed files with 168 additions and 128 deletions

View file

@ -939,6 +939,7 @@ void D_RegisterClientCommands(void)
// g_input.c // g_input.c
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
{ {
CV_RegisterVar(&cv_kickstartaccel[i]);
CV_RegisterVar(&cv_turnaxis[i]); CV_RegisterVar(&cv_turnaxis[i]);
CV_RegisterVar(&cv_moveaxis[i]); CV_RegisterVar(&cv_moveaxis[i]);
CV_RegisterVar(&cv_brakeaxis[i]); CV_RegisterVar(&cv_brakeaxis[i]);
@ -1627,6 +1628,8 @@ void SendWeaponPref(UINT8 n)
buf[0] = 0; buf[0] = 0;
// Player option cvars that need to be synched go HERE // Player option cvars that need to be synched go HERE
if (cv_kickstartaccel[n].value)
buf[0] |= 1;
SendNetXCmdForPlayer(n, XD_WEAPONPREF, buf, 1); SendNetXCmdForPlayer(n, XD_WEAPONPREF, buf, 1);
} }
@ -1635,11 +1638,10 @@ static void Got_WeaponPref(UINT8 **cp,INT32 playernum)
{ {
UINT8 prefs = READUINT8(*cp); UINT8 prefs = READUINT8(*cp);
(void)prefs;
(void)playernum;
//players[playernum].pflags &= ~(PF_FLIPCAM);
// Player option cvars that need to be synched go HERE // Player option cvars that need to be synched go HERE
players[playernum].pflags &= ~(PF_KICKSTARTACCEL);
if (prefs & 1)
players[playernum].pflags |= PF_KICKSTARTACCEL;
} }
static void Got_PowerLevel(UINT8 **cp,INT32 playernum) static void Got_PowerLevel(UINT8 **cp,INT32 playernum)

View file

@ -67,48 +67,45 @@ typedef enum
// True if button down last tic. // True if button down last tic.
PF_ATTACKDOWN = 1<<7, PF_ATTACKDOWN = 1<<7,
PF_SPINDOWN = 1<<8, PF_ACCELDOWN = 1<<8,
PF_JUMPDOWN = 1<<9, PF_BRAKEDOWN = 1<<9,
PF_WPNDOWN = 1<<10, PF_WPNDOWN = 1<<10, // unused
// Unmoving states // Unmoving states
PF_STASIS = 1<<11, // Player is not allowed to move PF_STASIS = 1<<11, // Player is not allowed to move
PF_JUMPSTASIS = 1<<12, // and that includes jumping. PF_JUMPSTASIS = 1<<12, // unused
PF_FULLSTASIS = PF_STASIS|PF_JUMPSTASIS,
// SRB2Kart: Spectator that wants to join // SRB2Kart: Spectator that wants to join
PF_WANTSTOJOIN = 1<<13, PF_WANTSTOJOIN = 1<<13,
// Character action status // Character action status
PF_STARTJUMP = 1<<14, PF_STARTJUMP = 1<<14, // unused
PF_JUMPED = 1<<15, PF_JUMPED = 1<<15, // unused
PF_NOJUMPDAMAGE = 1<<16, PF_NOJUMPDAMAGE = 1<<16, // unused
PF_SPINNING = 1<<17, // unused
PF_SPINNING = 1<<17, PF_STARTDASH = 1<<18, // unused
PF_STARTDASH = 1<<18, PF_THOKKED = 1<<19, // unused
PF_SHIELDABILITY = 1<<20, // unused
PF_THOKKED = 1<<19, PF_GLIDING = 1<<21, // unused
PF_SHIELDABILITY = 1<<20, PF_BOUNCING = 1<<22, // unused
PF_GLIDING = 1<<21,
PF_BOUNCING = 1<<22,
// Sliding (usually in water) like Labyrinth/Oil Ocean // Sliding (usually in water) like Labyrinth/Oil Ocean
PF_SLIDING = 1<<23, PF_SLIDING = 1<<23,
// NiGHTS stuff // NiGHTS stuff
PF_TRANSFERTOCLOSEST = 1<<24, PF_TRANSFERTOCLOSEST = 1<<24, // unused
PF_DRILLING = 1<<25, PF_DRILLING = 1<<25, // unused
// Gametype-specific stuff // Gametype-specific stuff
PF_GAMETYPEOVER = 1<<26, // Race time over, or H&S out-of-game PF_GAMETYPEOVER = 1<<26, // Race time over
PF_TAGIT = 1<<27, // The player is it! For Tag Mode PF_TAGIT = 1<<27, // unused
/*** misc ***/ /*** misc ***/
PF_FORCESTRAFE = 1<<28, // Turning inputs are translated into strafing inputs PF_KICKSTARTACCEL = 1<<28, // Accessibility feature - is accelerate in kickstart mode?
PF_CANCARRY = 1<<29, // Can carry another player? PF_CANCARRY = 1<<29, // unused
PF_HITFINISHLINE = 1<<30, // Already hit the finish line this tic PF_HITFINISHLINE = 1<<30, // Already hit the finish line this tic
// up to 1<<31 is free // up to 1<<31 is free, but try to hit unused stuff first
} pflags_t; } pflags_t;
typedef enum typedef enum
@ -298,6 +295,9 @@ typedef enum
#undef KSPIN_TYPE #undef KSPIN_TYPE
} kartspinoutflags_t; } kartspinoutflags_t;
// for k_kickstartaccel
#define ACCEL_KICKSTART 35
//{ SRB2kart - kartstuff //{ SRB2kart - kartstuff
typedef enum typedef enum
{ {
@ -398,6 +398,7 @@ typedef enum
k_springcolor, // Color of spring stars k_springcolor, // Color of spring stars
k_killfield, // How long have you been in the kill field, stay in too long and lose a bumper k_killfield, // How long have you been in the kill field, stay in too long and lose a bumper
k_wrongway, // Display WRONG WAY on screen k_wrongway, // Display WRONG WAY on screen
k_kickstartaccel, // how long you've been holding accel for, for PF_KICKSTARTACCEL
NUMKARTSTUFF NUMKARTSTUFF
} kartstufftype_t; } kartstufftype_t;

View file

@ -26,17 +26,18 @@
// Button/action code definitions. // Button/action code definitions.
typedef enum typedef enum
{ {
BT_ACCELERATE = 1, // Accelerate BT_ACCELERATE = 1, // Accelerate
BT_DRIFT = 1<<2, // Drift (direction is cmd->turning) BT_DRIFT = 1<<2, // Drift (direction is cmd->turning)
BT_BRAKE = 1<<3, // Brake BT_BRAKE = 1<<3, // Brake
BT_ATTACK = 1<<4, // Use Item BT_ATTACK = 1<<4, // Use Item
BT_FORWARD = 1<<5, // Aim Item Forward BT_FORWARD = 1<<5, // Aim Item Forward
BT_BACKWARD = 1<<6, // Aim Item Backward BT_BACKWARD = 1<<6, // Aim Item Backward
BT_LOOKBACK = 1<<7, // Look Backward BT_LOOKBACK = 1<<7, // Look Backward
BT_REALACCELERATE = 1<<8, // Accelerate but not influenced by boosting or kickstart
BT_EBRAKEMASK = (BT_ACCELERATE|BT_BRAKE), BT_EBRAKEMASK = (BT_ACCELERATE|BT_BRAKE),
// free: 1<<8 to 1<<12 // free: 1<<9 to 1<<12
// Lua garbage // Lua garbage
BT_CUSTOM1 = 1<<13, BT_CUSTOM1 = 1<<13,

View file

@ -10645,17 +10645,13 @@ static const char *const PLAYERFLAG_LIST[] = {
// True if button down last tic. // True if button down last tic.
"ATTACKDOWN", "ATTACKDOWN",
"SPINDOWN", "ACCELDOWN",
"JUMPDOWN", "BRAKEDOWN",
"WPNDOWN", "WPNDOWN",
// Unmoving states // Unmoving states
"STASIS", // Player is not allowed to move "STASIS", // Player is not allowed to move
"JUMPSTASIS", // and that includes jumping. "JUMPSTASIS", // and that includes jumping.
// (we don't include FULLSTASIS here I guess because it's just those two together...?)
// Did you get a time-over?
"TIMEOVER",
// SRB2Kart: spectator that wants to join // SRB2Kart: spectator that wants to join
"WANTSTOJOIN", "WANTSTOJOIN",
@ -10664,10 +10660,8 @@ static const char *const PLAYERFLAG_LIST[] = {
"STARTJUMP", "STARTJUMP",
"JUMPED", "JUMPED",
"NOJUMPDAMAGE", "NOJUMPDAMAGE",
"SPINNING", "SPINNING",
"STARTDASH", "STARTDASH",
"THOKKED", "THOKKED",
"SHIELDABILITY", "SHIELDABILITY",
"GLIDING", "GLIDING",
@ -10681,13 +10675,13 @@ static const char *const PLAYERFLAG_LIST[] = {
"DRILLING", "DRILLING",
// Gametype-specific stuff // Gametype-specific stuff
"GAMETYPEOVER", // Race time over, or H&S out-of-game "GAMETYPEOVER", // Race time over
"TAGIT", // The player is it! For Tag Mode "TAGIT",
/*** misc ***/ /*** misc ***/
"FORCESTRAFE", // Translate turn inputs into strafe inputs "FORCESTRAFE", // Accessibility feature - is accelerate in kickstart mode?
"CANCARRY",
"HITFINISHLINE", // Already hit the finish line this tic "HITFINISHLINE", // Already hit the finish line this tic
"FINISHED",
NULL // stop loop here. NULL // stop loop here.
}; };
@ -11054,7 +11048,8 @@ static const char *const KARTSTUFF_LIST[] = {
"SPRINGSTARS", "SPRINGSTARS",
"SPRINGCOLOR", "SPRINGCOLOR",
"KILLFIELD", "KILLFIELD",
"WRONGWAY" "WRONGWAY",
"KICKSTARTACCEL"
}; };
static const char *const KARTHUD_LIST[] = { static const char *const KARTHUD_LIST[] = {
@ -11655,6 +11650,7 @@ struct {
{"BT_ATTACK",BT_ATTACK}, {"BT_ATTACK",BT_ATTACK},
{"BT_FORWARD",BT_FORWARD}, {"BT_FORWARD",BT_FORWARD},
{"BT_BACKWARD",BT_BACKWARD}, {"BT_BACKWARD",BT_BACKWARD},
{"BT_REALACCELERATE",BT_REALACCELERATE},
{"BT_CUSTOM1",BT_CUSTOM1}, // Lua customizable {"BT_CUSTOM1",BT_CUSTOM1}, // Lua customizable
{"BT_CUSTOM2",BT_CUSTOM2}, // Lua customizable {"BT_CUSTOM2",BT_CUSTOM2}, // Lua customizable
{"BT_CUSTOM3",BT_CUSTOM3}, // Lua customizable {"BT_CUSTOM3",BT_CUSTOM3}, // Lua customizable
@ -12183,8 +12179,6 @@ static fixed_t find_const(const char **rword)
free(word); free(word);
return (1<<i); return (1<<i);
} }
if (fastcmp(p, "FULLSTASIS"))
return PF_FULLSTASIS;
// Not found error // Not found error
const_warning("player flag",word); const_warning("player flag",word);
@ -12602,16 +12596,6 @@ static inline int lib_getenum(lua_State *L)
lua_pushinteger(L, ((lua_Integer)1<<i)); lua_pushinteger(L, ((lua_Integer)1<<i));
return 1; return 1;
} }
if (fastcmp(p, "FULLSTASIS"))
{
lua_pushinteger(L, (lua_Integer)PF_FULLSTASIS);
return 1;
}
else if (fastcmp(p, "USEDOWN")) // Remove case when 2.3 nears release...
{
lua_pushinteger(L, (lua_Integer)PF_SPINDOWN);
return 1;
}
if (mathlib) return luaL_error(L, "playerflag '%s' could not be found.\n", word); if (mathlib) return luaL_error(L, "playerflag '%s' could not be found.\n", word);
return 0; return 0;
} }

View file

@ -119,6 +119,7 @@ demoghost *ghosts = NULL;
#define DF_MULTIPLAYER 0x80 // This demo was recorded in multiplayer mode! #define DF_MULTIPLAYER 0x80 // This demo was recorded in multiplayer mode!
#define DEMO_SPECTATOR 0x40 #define DEMO_SPECTATOR 0x40
#define DEMO_KICKSTART 0x20
// For demos // For demos
#define ZT_FWD 0x01 #define ZT_FWD 0x01
@ -1983,7 +1984,12 @@ void G_BeginRecording(void)
if (playeringame[p]) { if (playeringame[p]) {
player = &players[p]; player = &players[p];
WRITEUINT8(demo_p, p | (player->spectator ? DEMO_SPECTATOR : 0)); i = p;
if (player->pflags & PF_KICKSTARTACCEL)
i |= DEMO_KICKSTART;
if (player->spectator)
i |= DEMO_SPECTATOR;
WRITEUINT8(demo_p, i);
// Name // Name
memset(name, 0, 16); memset(name, 0, 16);
@ -2903,6 +2909,12 @@ void G_DoPlayDemo(char *defdemoname)
while (p != 0xFF) while (p != 0xFF)
{ {
players[p].pflags &= ~PF_KICKSTARTACCEL;
if (p & DEMO_KICKSTART)
{
players[p].pflags |= PF_KICKSTARTACCEL;
p &= ~DEMO_KICKSTART;
}
spectator = false; spectator = false;
if (p & DEMO_SPECTATOR) if (p & DEMO_SPECTATOR)
{ {
@ -3194,7 +3206,7 @@ void G_AddGhost(char *defdemoname)
return; return;
} }
if (READUINT8(p) != 0) if ((READUINT8(p) & ~DEMO_KICKSTART) != 0)
{ {
CONS_Alert(CONS_NOTICE, M_GetText("Failed to add ghost %s: Invalid player slot.\n"), pdemoname); CONS_Alert(CONS_NOTICE, M_GetText("Failed to add ghost %s: Invalid player slot.\n"), pdemoname);
Z_Free(pdemoname); Z_Free(pdemoname);

View file

@ -342,10 +342,11 @@ INT16 prevmap, nextmap;
static UINT8 *savebuffer; static UINT8 *savebuffer;
void SendWeaponPref(void); static void kickstartaccel_OnChange(void);
void SendWeaponPref2(void); static void kickstartaccel2_OnChange(void);
void SendWeaponPref3(void); static void kickstartaccel3_OnChange(void);
void SendWeaponPref4(void); static void kickstartaccel4_OnChange(void);
void SendWeaponPref(UINT8 n);
static CV_PossibleValue_t joyaxis_cons_t[] = {{0, "None"}, static CV_PossibleValue_t joyaxis_cons_t[] = {{0, "None"},
{1, "X-Axis"}, {2, "Y-Axis"}, {-1, "X-Axis-"}, {-2, "Y-Axis-"}, {1, "X-Axis"}, {2, "Y-Axis"}, {-1, "X-Axis-"}, {-2, "Y-Axis-"},
@ -405,6 +406,13 @@ consvar_t cv_resetspecialmusic = CVAR_INIT ("resetspecialmusic", "Yes", CV_SAVE,
consvar_t cv_resume = CVAR_INIT ("resume", "Yes", CV_SAVE, CV_YesNo, NULL); consvar_t cv_resume = CVAR_INIT ("resume", "Yes", CV_SAVE, CV_YesNo, NULL);
consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS] = {
CVAR_INIT ("kickstartaccel", "Off", CV_SAVE|CV_CALL, CV_OnOff, kickstartaccel_OnChange),
CVAR_INIT ("kickstartaccel2", "Off", CV_SAVE|CV_CALL, CV_OnOff, kickstartaccel2_OnChange),
CVAR_INIT ("kickstartaccel3", "Off", CV_SAVE|CV_CALL, CV_OnOff, kickstartaccel3_OnChange),
CVAR_INIT ("kickstartaccel4", "Off", CV_SAVE|CV_CALL, CV_OnOff, kickstartaccel4_OnChange)
};
consvar_t cv_turnaxis[MAXSPLITSCREENPLAYERS] = { consvar_t cv_turnaxis[MAXSPLITSCREENPLAYERS] = {
CVAR_INIT ("joyaxis_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL), CVAR_INIT ("joyaxis_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL),
CVAR_INIT ("joyaxis2_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL), CVAR_INIT ("joyaxis2_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL),
@ -1003,10 +1011,15 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
{ {
// forward with key or button // SRB2kart - we use an accel/brake instead of forward/backward. // forward with key or button // SRB2kart - we use an accel/brake instead of forward/backward.
axis = PlayerJoyAxis(ssplayer, AXISMOVE); axis = PlayerJoyAxis(ssplayer, AXISMOVE);
if (PlayerInputDown(ssplayer, gc_accelerate) || (gamepadjoystickmove && axis > 0) || player->kartstuff[k_sneakertimer]) if (PlayerInputDown(ssplayer, gc_accelerate) || (gamepadjoystickmove && axis > 0))
{
cmd->buttons |= (BT_ACCELERATE|BT_REALACCELERATE);
forward = MAXPLMOVE; // 50
}
else if ((gamestate == GS_LEVEL) && (player->kartstuff[k_sneakertimer] || (player->kartstuff[k_kickstartaccel] >= ACCEL_KICKSTART)))
{ {
cmd->buttons |= BT_ACCELERATE; cmd->buttons |= BT_ACCELERATE;
forward = MAXPLMOVE; // 50 forward = MAXPLMOVE;
} }
else if (analogjoystickmove && axis > 0) else if (analogjoystickmove && axis > 0)
{ {
@ -1184,6 +1197,26 @@ ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n)
return dest; return dest;
} }
static void kickstartaccel_OnChange(void)
{
SendWeaponPref(0);
}
static void kickstartaccel2_OnChange(void)
{
SendWeaponPref(1);
}
static void kickstartaccel3_OnChange(void)
{
SendWeaponPref(2);
}
static void kickstartaccel4_OnChange(void)
{
SendWeaponPref(3);
}
// //
// G_DoLoadLevel // G_DoLoadLevel
// //
@ -2108,6 +2141,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
boolean eliminated; boolean eliminated;
UINT16 nocontrol; UINT16 nocontrol;
INT32 khudfault; INT32 khudfault;
INT32 kickstartaccel;
score = players[player].score; score = players[player].score;
marescore = players[player].marescore; marescore = players[player].marescore;
@ -2123,7 +2157,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
splitscreenindex = players[player].splitscreenindex; splitscreenindex = players[player].splitscreenindex;
spectator = players[player].spectator; spectator = players[player].spectator;
pflags = (players[player].pflags & (PF_WANTSTOJOIN|PF_GAMETYPEOVER|PF_FAULT)); pflags = (players[player].pflags & (PF_WANTSTOJOIN|PF_GAMETYPEOVER|PF_FAULT|PF_KICKSTARTACCEL));
playerangleturn = players[player].angleturn; playerangleturn = players[player].angleturn;
// As long as we're not in multiplayer, carry over cheatcodes from map to map // As long as we're not in multiplayer, carry over cheatcodes from map to map
@ -2177,6 +2211,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
spheres = 0; spheres = 0;
eliminated = false; eliminated = false;
wanted = 0; wanted = 0;
kickstartaccel = 0;
} }
else else
{ {
@ -2205,6 +2240,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
spheres = players[player].spheres; spheres = players[player].spheres;
eliminated = players[player].eliminated; eliminated = players[player].eliminated;
wanted = players[player].kartstuff[k_wanted]; wanted = players[player].kartstuff[k_wanted];
kickstartaccel = players[player].kartstuff[k_kickstartaccel];
} }
if (!betweenmaps) if (!betweenmaps)
@ -2278,6 +2314,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
p->kartstuff[k_lastdraft] = -1; p->kartstuff[k_lastdraft] = -1;
p->karthud[khud_fault] = khudfault; p->karthud[khud_fault] = khudfault;
p->powers[pw_nocontrol] = nocontrol; p->powers[pw_nocontrol] = nocontrol;
players[player].kartstuff[k_kickstartaccel] = kickstartaccel;
memcpy(&p->respawn, &respawn, sizeof (p->respawn)); memcpy(&p->respawn, &respawn, sizeof (p->respawn));
@ -2292,9 +2329,9 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
// Don't do anything immediately // Don't do anything immediately
p->pflags |= PF_SPINDOWN; p->pflags |= PF_BRAKEDOWN;
p->pflags |= PF_ATTACKDOWN; p->pflags |= PF_ATTACKDOWN;
p->pflags |= PF_JUMPDOWN; p->pflags |= PF_ACCELDOWN;
p->playerstate = PST_LIVE; p->playerstate = PST_LIVE;
p->panim = PA_STILL; // standing animation p->panim = PA_STILL; // standing animation
@ -4446,7 +4483,7 @@ void G_InitNew(UINT8 pencoremode, const char *mapname, boolean resetplayer, bool
memset(&players[i].respawn, 0, sizeof (players[i].respawn)); memset(&players[i].respawn, 0, sizeof (players[i].respawn));
// The latter two should clear by themselves, but just in case // The latter two should clear by themselves, but just in case
players[i].pflags &= ~(PF_GAMETYPEOVER|PF_FULLSTASIS|PF_FAULT); players[i].pflags &= ~(PF_GAMETYPEOVER|PF_STASIS|PF_FAULT);
// Clear cheatcodes too, just in case. // Clear cheatcodes too, just in case.
players[i].pflags &= ~(PF_GODMODE|PF_NOCLIP|PF_INVIS); players[i].pflags &= ~(PF_GODMODE|PF_NOCLIP|PF_INVIS);

View file

@ -57,6 +57,7 @@ extern consvar_t cv_pauseifunfocused;
extern consvar_t cv_invertmouse; extern consvar_t cv_invertmouse;
extern consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_turnaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_turnaxis[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_moveaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_moveaxis[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_brakeaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_brakeaxis[MAXSPLITSCREENPLAYERS];

View file

@ -2249,6 +2249,36 @@ static void K_drawKartSpeedometer(void)
V_DrawScaledPatch(LAPS_X+13, LAPS_Y-25 + battleoffset, V_HUDTRANS|V_SLIDEIN|splitflags, kp_facenum[numbers[1]]); V_DrawScaledPatch(LAPS_X+13, LAPS_Y-25 + battleoffset, V_HUDTRANS|V_SLIDEIN|splitflags, kp_facenum[numbers[1]]);
V_DrawScaledPatch(LAPS_X+19, LAPS_Y-25 + battleoffset, V_HUDTRANS|V_SLIDEIN|splitflags, kp_facenum[numbers[2]]); V_DrawScaledPatch(LAPS_X+19, LAPS_Y-25 + battleoffset, V_HUDTRANS|V_SLIDEIN|splitflags, kp_facenum[numbers[2]]);
V_DrawScaledPatch(LAPS_X+29, LAPS_Y-25 + battleoffset, V_HUDTRANS|V_SLIDEIN|splitflags, kp_speedometerlabel[labeln]); V_DrawScaledPatch(LAPS_X+29, LAPS_Y-25 + battleoffset, V_HUDTRANS|V_SLIDEIN|splitflags, kp_speedometerlabel[labeln]);
if (stplyr->pflags & PF_KICKSTARTACCEL)
{
numbers[0] = 7-(stplyr->kartstuff[k_kickstartaccel]*7)/ACCEL_KICKSTART;
numbers[1] = 7;
numbers[2] = 0;
V_DrawFill(LAPS_X+61, LAPS_Y-26, 2, 1, 31|V_SLIDEIN|splitflags);
V_DrawFill(LAPS_X+61-4, (LAPS_Y-26)+8, 10, 1, 31|V_SLIDEIN|splitflags);
while (numbers[1]--)
{
numbers[2] = (numbers[1]/2)+1;
V_DrawFill(LAPS_X+61-numbers[2], (LAPS_Y-25)+numbers[1], 2+(numbers[2]*2), 1, 31|V_SLIDEIN|splitflags);
if (numbers[0])
{
if (numbers[1] < numbers[0])
labeln = 23;
else if (numbers[1] == numbers[0])
labeln = 3;
else
labeln = 5 + (numbers[1]-numbers[0])*2;
}
else if ((leveltime % 7) == numbers[1])
labeln = 0;
else
labeln = 3;
V_DrawFill(LAPS_X+62-numbers[2], (LAPS_Y-25)+numbers[1], (numbers[2]*2), 1, labeln|V_SLIDEIN|splitflags);
}
}
} }
static void K_drawBlueSphereMeter(void) static void K_drawBlueSphereMeter(void)
@ -3770,10 +3800,10 @@ static void K_drawInput(void)
V_DrawFill(x+(xoffs), y+offs, BUTTW-1, BUTTH, col);\ V_DrawFill(x+(xoffs), y+offs, BUTTW-1, BUTTH, col);\
V_DrawFixedPatch((x+1+(xoffs))<<FRACBITS, (y+offs+1)<<FRACBITS, FRACUNIT, splitflags, fontv[TINY_FONT].font[symb-HU_FONTSTART], NULL) V_DrawFixedPatch((x+1+(xoffs))<<FRACBITS, (y+offs+1)<<FRACBITS, FRACUNIT, splitflags, fontv[TINY_FONT].font[symb-HU_FONTSTART], NULL)
drawbutt(-2*BUTTW, BT_ACCELERATE, 'A'); drawbutt(-2*BUTTW, BT_REALACCELERATE, 'A');
drawbutt( -BUTTW, BT_BRAKE, 'B'); drawbutt( -BUTTW, BT_BRAKE, 'B');
drawbutt( 0, BT_DRIFT, 'D'); drawbutt( 0, BT_DRIFT, 'D');
drawbutt( BUTTW, BT_ATTACK, 'I'); drawbutt( BUTTW, BT_ATTACK, 'I');
#undef drawbutt #undef drawbutt

View file

@ -1491,17 +1491,6 @@ static int lib_pDoSpring(lua_State *L)
// P_INTER // P_INTER
//////////// ////////////
static int lib_pRemoveShield(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
NOHUD
INLEVEL
if (!player)
return LUA_ErrInvalid(L, "player_t");
P_RemoveShield(player);
return 0;
}
static int lib_pDamageMobj(lua_State *L) static int lib_pDamageMobj(lua_State *L)
{ {
mobj_t *target = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)), *inflictor = NULL, *source = NULL; mobj_t *target = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)), *inflictor = NULL, *source = NULL;
@ -3803,7 +3792,6 @@ static luaL_Reg lib[] = {
{"P_DoSpring",lib_pDoSpring}, {"P_DoSpring",lib_pDoSpring},
// p_inter // p_inter
{"P_RemoveShield",lib_pRemoveShield},
{"P_DamageMobj",lib_pDamageMobj}, {"P_DamageMobj",lib_pDamageMobj},
{"P_KillMobj",lib_pKillMobj}, {"P_KillMobj",lib_pKillMobj},
{"P_PlayerRingBurst",lib_pPlayerRingBurst}, {"P_PlayerRingBurst",lib_pPlayerRingBurst},

View file

@ -1803,35 +1803,6 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source,
return true; return true;
} }
void P_RemoveShield(player_t *player)
{
if (player->powers[pw_shield] & SH_FORCE)
{ // Multi-hit
if (player->powers[pw_shield] & SH_FORCEHP)
player->powers[pw_shield]--;
else
player->powers[pw_shield] &= SH_STACK;
}
else if (player->powers[pw_shield] & SH_NOSTACK)
{ // First layer shields
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_ARMAGEDDON) // Give them what's coming to them!
{
player->pflags |= PF_JUMPDOWN;
}
else
player->powers[pw_shield] &= SH_STACK;
}
else
{ // Second layer shields
if (((player->powers[pw_shield] & SH_STACK) == SH_FIREFLOWER) && !player->powers[pw_super])
{
player->mo->color = player->skincolor;
G_GhostAddColor((INT32) (player - players), GHC_NORMAL);
}
player->powers[pw_shield] = SH_NONE;
}
}
/** Damages an object, which may or may not be a player. /** Damages an object, which may or may not be a player.
* For melee attacks, source and inflictor are the same. * For melee attacks, source and inflictor are the same.
* *

View file

@ -486,7 +486,6 @@ typedef struct BasicFF_s
void P_ForceFeed(const player_t *player, INT32 attack, INT32 fade, tic_t duration, INT32 period); void P_ForceFeed(const player_t *player, INT32 attack, INT32 fade, tic_t duration, INT32 period);
void P_ForceConstant(const BasicFF_t *FFInfo); void P_ForceConstant(const BasicFF_t *FFInfo);
void P_RampConstant(const BasicFF_t *FFInfo, INT32 Start, INT32 End); void P_RampConstant(const BasicFF_t *FFInfo, INT32 Start, INT32 End);
void P_RemoveShield(player_t *player);
void P_SpecialStageDamage(player_t *player, mobj_t *inflictor, mobj_t *source); void P_SpecialStageDamage(player_t *player, mobj_t *inflictor, mobj_t *source);
boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype);
void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype); void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype);

View file

@ -8763,12 +8763,8 @@ void T_Pusher(pusher_t *p)
{ {
if (p->slider && thing->player) if (p->slider && thing->player)
{ {
pflags_t jumped = (thing->player->pflags & (PF_JUMPED|PF_NOJUMPDAMAGE));
P_ResetPlayer (thing->player); P_ResetPlayer (thing->player);
if (jumped)
thing->player->pflags |= jumped;
thing->player->pflags |= PF_SLIDING; thing->player->pflags |= PF_SLIDING;
thing->angle = R_PointToAngle2 (0, 0, xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR)); thing->angle = R_PointToAngle2 (0, 0, xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR));

View file

@ -4324,6 +4324,19 @@ void P_PlayerThink(player_t *player)
player->kartstuff[k_throwdir] = 0; player->kartstuff[k_throwdir] = 0;
} }
// Accessibility - kickstart your acceleration
if (!(player->pflags & PF_KICKSTARTACCEL))
player->kartstuff[k_kickstartaccel] = 0;
else if (cmd->buttons & BT_REALACCELERATE)
{
if (!(player->pflags & PF_ACCELDOWN))
player->kartstuff[k_kickstartaccel] = 0;
else if (player->kartstuff[k_kickstartaccel] < ACCEL_KICKSTART)
player->kartstuff[k_kickstartaccel]++;
}
else if (player->kartstuff[k_kickstartaccel] < ACCEL_KICKSTART)
player->kartstuff[k_kickstartaccel] = 0;
#ifdef PARANOIA #ifdef PARANOIA
if (player->playerstate == PST_REBORN) if (player->playerstate == PST_REBORN)
I_Error("player %s is in PST_REBORN\n", sizeu1(playeri)); I_Error("player %s is in PST_REBORN\n", sizeu1(playeri));
@ -4506,10 +4519,10 @@ void P_PlayerThink(player_t *player)
player->mo->movefactor = FRACUNIT; // We're not going to do any more with this, so let's change it back for the next frame. player->mo->movefactor = FRACUNIT; // We're not going to do any more with this, so let's change it back for the next frame.
// Unset statis flags after moving. // Unset statis flag after moving.
// In other words, if you manually set stasis via code, // In other words, if you manually set stasis via code,
// it lasts for one tic. // it lasts for one tic.
player->pflags &= ~PF_FULLSTASIS; player->pflags &= ~PF_STASIS;
if (player->onconveyor == 1) if (player->onconveyor == 1)
player->onconveyor = 3; player->onconveyor = 3;
@ -4555,11 +4568,16 @@ void P_PlayerThink(player_t *player)
} }
#endif #endif
// check for use // check for buttons
if (cmd->buttons & BT_BRAKE) if (cmd->buttons & BT_REALACCELERATE)
player->pflags |= PF_SPINDOWN; player->pflags |= PF_ACCELDOWN;
else else
player->pflags &= ~PF_SPINDOWN; player->pflags &= ~PF_ACCELDOWN;
if (cmd->buttons & BT_BRAKE)
player->pflags |= PF_BRAKEDOWN;
else
player->pflags &= ~PF_BRAKEDOWN;
// Counters, time dependent power ups. // Counters, time dependent power ups.
// Time Bonus & Ring Bonus count settings // Time Bonus & Ring Bonus count settings