From 35be353de4d184295480184792188a0f814723ee Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 22 Aug 2019 15:18:14 -0700 Subject: [PATCH 01/21] Save bans when cleared too (Why doesn't it work for I_Quit?) --- src/d_clisrv.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 213f5dde0..9a2d18772 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2465,6 +2465,7 @@ static void Command_ClearBans(void) return; I_ClearBans(); + D_SaveBan(); reasontail = NULL; while (reasonhead) { From c1949211421b3dff90974600a77de2bda9a77e94 Mon Sep 17 00:00:00 2001 From: filpAM Date: Fri, 13 Sep 2019 13:20:44 -0400 Subject: [PATCH 02/21] Fix "NOMIXER" flag compiling --- src/sdl/sdl_sound.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sdl/sdl_sound.c b/src/sdl/sdl_sound.c index d9967ae03..4bb1b5676 100644 --- a/src/sdl/sdl_sound.c +++ b/src/sdl/sdl_sound.c @@ -1173,7 +1173,10 @@ void I_StartupSound(void) const char *sdrv_name = NULL; #endif #ifndef HAVE_MIXER - midi_disabled = digital_disabled = true; +#ifndef NO_MIDI + midi_disabled = +#endif + digital_disabled = true; #endif memset(channels, 0, sizeof (channels)); //Alam: Clean it From 7a70f882b12ecb993370b19bbe4f6e80ae8f323e Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 15 Sep 2019 00:32:01 -0700 Subject: [PATCH 03/21] Let first person camera work in demos --- src/r_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_main.c b/src/r_main.c index 358a24bb8..faf03c4ba 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1143,7 +1143,7 @@ void R_SetupFrame(player_t *player, boolean skybox) aimingangle = player->aiming; viewangle = viewmobj->angle; - if (/*!demo.playback && */player->playerstate != PST_DEAD) + if (!demo.playback && player->playerstate != PST_DEAD) { if (player == &players[consoleplayer]) { From 43422eb67006e274e54dc2269c1634c134cbd241 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 7 Oct 2019 17:55:31 -0700 Subject: [PATCH 04/21] ferror does not return errno, are you stupid? Use M_FileError to return the proper error description, or "end-of-file". --- src/d_netfil.c | 4 ++-- src/m_argv.c | 2 +- src/m_misc.c | 10 ++++++++++ src/m_misc.h | 2 ++ src/sdl12/sdl_sound.c | 2 +- src/w_wad.c | 12 ++++++------ 6 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/d_netfil.c b/src/d_netfil.c index 76b66836b..b72d9c552 100644 --- a/src/d_netfil.c +++ b/src/d_netfil.c @@ -743,7 +743,7 @@ void SV_FileSendTicker(void) if (ram) M_Memcpy(p->data, &f->id.ram[transfer[i].position], size); else if (fread(p->data, 1, size, transfer[i].currentfile) != size) - I_Error("SV_FileSendTicker: can't read %s byte on %s at %d because %s", sizeu1(size), f->id.filename, transfer[i].position, strerror(ferror(transfer[i].currentfile))); + I_Error("SV_FileSendTicker: can't read %s byte on %s at %d because %s", sizeu1(size), f->id.filename, transfer[i].position, M_FileError(transfer[i].currentfile)); p->position = LONG(transfer[i].position); // Put flag so receiver knows the total size if (transfer[i].position + size == f->size) @@ -822,7 +822,7 @@ void Got_Filetxpak(void) // We can receive packet in the wrong order, anyway all os support gaped file fseek(file->file, pos, SEEK_SET); if (fwrite(netbuffer->u.filetxpak.data,size,1,file->file) != 1) - I_Error("Can't write to %s: %s\n",filename, strerror(ferror(file->file))); + I_Error("Can't write to %s: %s\n",filename, M_FileError(file->file)); file->currentsize += size; // Finished? diff --git a/src/m_argv.c b/src/m_argv.c index e8bfdd3db..a23f938a8 100644 --- a/src/m_argv.c +++ b/src/m_argv.c @@ -166,7 +166,7 @@ void M_FindResponseFile(void) if (!file) I_Error("No more free memory for the response file"); if (fread(file, size, 1, handle) != 1) - I_Error("Couldn't read response file because %s", strerror(ferror(handle))); + I_Error("Couldn't read response file because %s", M_FileError(handle)); fclose(handle); // keep all the command line arguments following @responsefile diff --git a/src/m_misc.c b/src/m_misc.c index f4a4ec291..b83d4034e 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -2355,3 +2355,13 @@ void M_SetupMemcpy(void) M_Memcpy = cpu_cpy; #endif } + +/** Return the appropriate message for a file error or end of file. +*/ +const char *M_FileError(FILE *fp) +{ + if (ferror(fp)) + return strerror(errno); + else + return "end-of-file"; +} diff --git a/src/m_misc.h b/src/m_misc.h index 658028b44..1e7befb1e 100644 --- a/src/m_misc.h +++ b/src/m_misc.h @@ -100,6 +100,8 @@ void strcatbf(char *s1, const char *s2, const char *s3); void M_SetupMemcpy(void); +const char *M_FileError(FILE *handle); + // counting bits, for weapon ammo code, usually FUNCMATH UINT8 M_CountBits(UINT32 num, UINT8 size); diff --git a/src/sdl12/sdl_sound.c b/src/sdl12/sdl_sound.c index ed1afd8e2..1a7525fee 100644 --- a/src/sdl12/sdl_sound.c +++ b/src/sdl12/sdl_sound.c @@ -1435,7 +1435,7 @@ static boolean LoadSong(void *data, size_t lumplength, size_t selectpos) if (fwrite(data, lumplength, 1, midfile) == 0) { - CONS_Printf(M_GetText("Couldn't write music into file %s because %s\n"), tempname, strerror(ferror(midfile))); + CONS_Printf(M_GetText("Couldn't write music into file %s because %s\n"), tempname, M_FileError(midfile)); Z_Free(data); fclose(midfile); return false; diff --git a/src/w_wad.c b/src/w_wad.c index da82a276d..734308956 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -366,7 +366,7 @@ static lumpinfo_t* ResGetLumpsWad (FILE* handle, UINT16* nlmp, const char* filen // read the header if (fread(&header, 1, sizeof header, handle) < sizeof header) { - CONS_Alert(CONS_ERROR, M_GetText("Can't read wad header because %s\n"), strerror(ferror(handle))); + CONS_Alert(CONS_ERROR, M_GetText("Can't read wad header because %s\n"), M_FileError(handle)); return NULL; } @@ -389,7 +389,7 @@ static lumpinfo_t* ResGetLumpsWad (FILE* handle, UINT16* nlmp, const char* filen if (fseek(handle, header.infotableofs, SEEK_SET) == -1 || fread(fileinfo, 1, i, handle) < i) { - CONS_Alert(CONS_ERROR, M_GetText("Corrupt wadfile directory (%s)\n"), strerror(ferror(handle))); + CONS_Alert(CONS_ERROR, M_GetText("Corrupt wadfile directory (%s)\n"), M_FileError(handle)); free(fileinfov); return NULL; } @@ -410,7 +410,7 @@ static lumpinfo_t* ResGetLumpsWad (FILE* handle, UINT16* nlmp, const char* filen handle) < sizeof realsize) { I_Error("corrupt compressed file: %s; maybe %s", /// \todo Avoid the bailout? - filename, strerror(ferror(handle))); + filename, M_FileError(handle)); } realsize = LONG(realsize); if (realsize != 0) @@ -548,7 +548,7 @@ static lumpinfo_t* ResGetLumpsZip (FILE* handle, UINT16* nlmp) fseek(handle, -4, SEEK_CUR); if (fread(&zend, 1, sizeof zend, handle) < sizeof zend) { - CONS_Alert(CONS_ERROR, "Corrupt central directory (%s)\n", strerror(ferror(handle))); + CONS_Alert(CONS_ERROR, "Corrupt central directory (%s)\n", M_FileError(handle)); return NULL; } numlumps = zend.entries; @@ -565,7 +565,7 @@ static lumpinfo_t* ResGetLumpsZip (FILE* handle, UINT16* nlmp) if (fread(zentry, 1, sizeof(zentry_t), handle) < sizeof(zentry_t)) { - CONS_Alert(CONS_ERROR, "Failed to read central directory (%s)\n", strerror(ferror(handle))); + CONS_Alert(CONS_ERROR, "Failed to read central directory (%s)\n", M_FileError(handle)); Z_Free(lumpinfo); free(zentry); return NULL; @@ -585,7 +585,7 @@ static lumpinfo_t* ResGetLumpsZip (FILE* handle, UINT16* nlmp) fullname = malloc(zentry->namelen + 1); if (fgets(fullname, zentry->namelen + 1, handle) != fullname) { - CONS_Alert(CONS_ERROR, "Unable to read lumpname (%s)\n", strerror(ferror(handle))); + CONS_Alert(CONS_ERROR, "Unable to read lumpname (%s)\n", M_FileError(handle)); Z_Free(lumpinfo); free(zentry); free(fullname); From f5390b26a8f83c223b3e17c9958b91d98ab9050d Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 7 Oct 2019 18:10:33 -0700 Subject: [PATCH 05/21] Forgot includes --- src/m_argv.c | 1 + src/m_misc.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/m_argv.c b/src/m_argv.c index a23f938a8..e1046f8a7 100644 --- a/src/m_argv.c +++ b/src/m_argv.c @@ -16,6 +16,7 @@ #include "doomdef.h" #include "command.h" #include "m_argv.h" +#include "m_misc.h" /** \brief number of arg */ diff --git a/src/m_misc.c b/src/m_misc.c index b83d4034e..a8c55be54 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -23,6 +23,8 @@ #include #endif +#include + // Extended map support. #include From 90b0b7f498372bf05342168eec166e0cc12c6ecc Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 19 Oct 2019 14:11:24 -0700 Subject: [PATCH 06/21] Don't hide HUD with hu_showscores in single player/Record Attack This also makes Lua game HUD consistent with the Kart HUD. --- src/st_stuff.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/st_stuff.c b/src/st_stuff.c index 50bac3eef..77308b338 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -1799,10 +1799,12 @@ static void ST_doItemFinderIconsAndSound(void) // SRB2kart - unused. // static void ST_overlayDrawer(void) { - /* SRB2kart doesn't need this stuff //hu_showscores = auto hide score/time/rings when tab rankings are shown if (!(hu_showscores && (netgame || multiplayer))) { + K_drawKartHUD(); + + /* SRB2kart doesn't need this stuff if (maptol & TOL_NIGHTS) ST_drawNiGHTSHUD(); else @@ -1826,8 +1828,8 @@ static void ST_overlayDrawer(void) ) ST_drawLives(); } - } */ + } // GAME OVER pic /*if (G_GametypeUsesLives() && stplyr->lives <= 0 && !(hu_showscores && (netgame || multiplayer))) @@ -1847,8 +1849,6 @@ static void ST_overlayDrawer(void) // Countdown timer for Race Mode // ...moved to k_kart.c so we can take advantage of the LAPS_Y value - K_drawKartHUD(); - /* SRB2kart doesn't need this stuff, I think // If you are in overtime, put a big honkin' flashin' message on the screen. if (G_BattleGametype() && cv_overtime.value From 9ea37836e2a510e935298850c54a2c97a4ed6970 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 8 May 2020 17:26:27 -0400 Subject: [PATCH 07/21] New kart animations! - Add unique frames for inward and outward drifting. - Increase the speed threshold required to reach your "fast driving" frames. - Use slow driving frames when you're slowing down, even if you're techincally above the fast speed threshold. - Use frameangle to smooth out the transition into drifting, instead of having "pre-turned" drift frames. --- src/b_bot.c | 2 +- src/d_player.h | 1 + src/dehacked.c | 114 ++++++++++++++-------------------------- src/g_game.c | 2 +- src/info.c | 125 ++++++++++++++------------------------------ src/info.h | 114 ++++++++++++++-------------------------- src/k_kart.c | 138 ++++++++++++++++++++++++++++++++++++++----------- src/m_cheat.c | 2 +- src/p_inter.c | 8 +-- src/p_mobj.c | 14 ++--- src/p_spec.c | 12 ++--- src/p_telept.c | 4 +- src/p_user.c | 30 +++++++---- 13 files changed, 270 insertions(+), 296 deletions(-) diff --git a/src/b_bot.c b/src/b_bot.c index c16976b07..667d18be5 100644 --- a/src/b_bot.c +++ b/src/b_bot.c @@ -271,7 +271,7 @@ void B_RespawnBot(INT32 playernum) player->powers[pw_nocontrol] = sonic->player->powers[pw_nocontrol]; P_TeleportMove(tails, x, y, z); - P_SetPlayerMobjState(tails, S_KART_STND1); // SRB2kart - was S_PLAY_FALL1 + P_SetPlayerMobjState(tails, S_KART_STILL1); // SRB2kart - was S_PLAY_FALL1 P_SetScale(tails, sonic->scale); tails->destscale = sonic->destscale; } diff --git a/src/d_player.h b/src/d_player.h index 18874b7b7..2a8ec9046 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -501,6 +501,7 @@ typedef struct player_s UINT8 gotcontinue; // Got continue from this stage? fixed_t speed; // Player's speed (distance formula of MOMX and MOMY values) + fixed_t lastspeed; UINT8 jumping; // Jump counter UINT8 secondjump; diff --git a/src/dehacked.c b/src/dehacked.c index db94c5227..23bac2689 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -3927,88 +3927,52 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_THOK", // SRB2kart Frames - "S_KART_STND1", - "S_KART_STND2", - "S_KART_STND1_L", - "S_KART_STND2_L", - "S_KART_STND1_R", - "S_KART_STND2_R", - "S_KART_WALK1", - "S_KART_WALK2", - "S_KART_WALK1_L", - "S_KART_WALK2_L", - "S_KART_WALK1_R", - "S_KART_WALK2_R", - "S_KART_RUN1", - "S_KART_RUN2", - "S_KART_RUN1_L", - "S_KART_RUN2_L", - "S_KART_RUN1_R", - "S_KART_RUN2_R", + "S_KART_STILL1", + "S_KART_STILL2", + "S_KART_STILL1_L", + "S_KART_STILL2_L", + "S_KART_STILL1_R", + "S_KART_STILL2_R", + + "S_KART_SLOW1", + "S_KART_SLOW2", + "S_KART_SLOW1_L", + "S_KART_SLOW2_L", + "S_KART_SLOW1_R", + "S_KART_SLOW2_R", + + "S_KART_FAST1", + "S_KART_FAST2", + "S_KART_FAST1_L", + "S_KART_FAST2_L", + "S_KART_FAST1_R", + "S_KART_FAST2_R", + "S_KART_DRIFT1_L", "S_KART_DRIFT2_L", + + "S_KART_DRIFT1_L_OUT", + "S_KART_DRIFT2_L_OUT", + + "S_KART_DRIFT1_L_IN", + "S_KART_DRIFT2_L_IN", + "S_KART_DRIFT3_L_IN", + "S_KART_DRIFT4_L_IN", + "S_KART_DRIFT1_R", "S_KART_DRIFT2_R", + + "S_KART_DRIFT1_R_OUT", + "S_KART_DRIFT2_R_OUT", + + "S_KART_DRIFT1_R_IN", + "S_KART_DRIFT2_R_IN", + "S_KART_DRIFT3_R_IN", + "S_KART_DRIFT4_R_IN", + "S_KART_SPIN", "S_KART_PAIN", "S_KART_SQUISH", - /* - "S_PLAY_STND", - "S_PLAY_TAP1", - "S_PLAY_TAP2", - "S_PLAY_RUN1", - "S_PLAY_RUN2", - "S_PLAY_RUN3", - "S_PLAY_RUN4", - "S_PLAY_RUN5", - "S_PLAY_RUN6", - "S_PLAY_RUN7", - "S_PLAY_RUN8", - "S_PLAY_SPD1", - "S_PLAY_SPD2", - "S_PLAY_SPD3", - "S_PLAY_SPD4", - "S_PLAY_ATK1", - "S_PLAY_ATK2", - "S_PLAY_ATK3", - "S_PLAY_ATK4", - "S_PLAY_SPRING", - "S_PLAY_FALL1", - "S_PLAY_FALL2", - "S_PLAY_ABL1", - "S_PLAY_ABL2", - "S_PLAY_SPC1", - "S_PLAY_SPC2", - "S_PLAY_SPC3", - "S_PLAY_SPC4", - "S_PLAY_CLIMB1", - "S_PLAY_CLIMB2", - "S_PLAY_CLIMB3", - "S_PLAY_CLIMB4", - "S_PLAY_CLIMB5", - "S_PLAY_GASP", - "S_PLAY_PAIN", - "S_PLAY_DIE", - "S_PLAY_TEETER1", - "S_PLAY_TEETER2", - "S_PLAY_CARRY", - "S_PLAY_SUPERSTAND", - "S_PLAY_SUPERWALK1", - "S_PLAY_SUPERWALK2", - "S_PLAY_SUPERFLY1", - "S_PLAY_SUPERFLY2", - "S_PLAY_SUPERTEETER", - "S_PLAY_SUPERHIT", - "S_PLAY_SUPERTRANS1", - "S_PLAY_SUPERTRANS2", - "S_PLAY_SUPERTRANS3", - "S_PLAY_SUPERTRANS4", - "S_PLAY_SUPERTRANS5", - "S_PLAY_SUPERTRANS6", - "S_PLAY_SUPERTRANS7", - "S_PLAY_SUPERTRANS8", - "S_PLAY_SUPERTRANS9", // This has special significance in the code. If you add more frames, search for it and make the appropriate changes. - */ // technically the player goes here but it's an infinite tic state "S_OBJPLACE_DUMMY", diff --git a/src/g_game.c b/src/g_game.c index a97143d21..30920108f 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -7648,7 +7648,7 @@ void G_AddGhost(char *defdemoname) } gh->mo->z = z; } - gh->mo->state = states+S_KART_STND1; // SRB2kart - was S_PLAY_STND + gh->mo->state = states+S_KART_STILL1; // SRB2kart - was S_PLAY_STND gh->mo->sprite = gh->mo->state->sprite; gh->mo->frame = (gh->mo->state->frame & FF_FRAMEMASK) | tr_trans20<mo->tics = -1; diff --git a/src/info.c b/src/info.c index 7bed0a78d..18759d757 100644 --- a/src/info.c +++ b/src/info.c @@ -101,88 +101,43 @@ state_t states[NUMSTATES] = {SPR_THOK, FF_TRANS50, 8, {NULL}, 0, 0, S_NULL}, // S_THOK // Player // SRB2kart - {SPR_PLAY, 0, 1, {NULL}, 0, 0, S_KART_STND2}, // S_KART_STND1 A - {SPR_PLAY, 1, 1, {NULL}, 0, 0, S_KART_STND1}, // S_KART_STND2 B - {SPR_PLAY, 2, 1, {NULL}, 0, 0, S_KART_STND2_L}, // S_KART_STND1_L C - {SPR_PLAY, 3, 1, {NULL}, 0, 0, S_KART_STND1_L}, // S_KART_STND2_L D - {SPR_PLAY, 4, 1, {NULL}, 0, 0, S_KART_STND2_R}, // S_KART_STND1_R E - {SPR_PLAY, 5, 1, {NULL}, 0, 0, S_KART_STND1_R}, // S_KART_STND2_R F - {SPR_PLAY, 9, 1, {NULL}, 0, 0, S_KART_WALK2}, // S_KART_WALK1 J - {SPR_PLAY, 6, 1, {NULL}, 0, 0, S_KART_WALK1}, // S_KART_WALK2 G - {SPR_PLAY, 10, 1, {NULL}, 0, 0, S_KART_WALK2_L}, // S_KART_WALK1_L K - {SPR_PLAY, 7, 1, {NULL}, 0, 0, S_KART_WALK1_L}, // S_KART_WALK2_L H - {SPR_PLAY, 11, 1, {NULL}, 0, 0, S_KART_WALK2_R}, // S_KART_WALK1_R L - {SPR_PLAY, 8, 1, {NULL}, 0, 0, S_KART_WALK1_R}, // S_KART_WALK2_R I - {SPR_PLAY, 0, 1, {NULL}, 0, 0, S_KART_RUN2}, // S_KART_RUN1 A - {SPR_PLAY, 9, 1, {NULL}, 0, 0, S_KART_RUN1}, // S_KART_RUN2 J - {SPR_PLAY, 2, 1, {NULL}, 0, 0, S_KART_RUN2_L}, // S_KART_RUN1_L C - {SPR_PLAY, 10, 1, {NULL}, 0, 0, S_KART_RUN1_L}, // S_KART_RUN2_L K - {SPR_PLAY, 4, 1, {NULL}, 0, 0, S_KART_RUN2_R}, // S_KART_RUN1_R E - {SPR_PLAY, 11, 1, {NULL}, 0, 0, S_KART_RUN1_R}, // S_KART_RUN2_R L - {SPR_PLAY, 12, 1, {NULL}, 0, 0, S_KART_DRIFT2_L}, // S_KART_DRIFT1_L M - {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_KART_DRIFT1_L}, // S_KART_DRIFT2_L N - {SPR_PLAY, 14, 1, {NULL}, 0, 0, S_KART_DRIFT2_R}, // S_KART_DRIFT1_R O - {SPR_PLAY, 15, 1, {NULL}, 0, 0, S_KART_DRIFT1_R}, // S_KART_DRIFT2_R P - {SPR_PLAY, 16, -1, {NULL}, 0, 0, S_KART_SPIN}, // S_KART_SPIN Q - {SPR_PLAY, 16, 350, {NULL}, 0, 0, S_KART_STND1}, // S_KART_PAIN Q - {SPR_PLAY, 17, 350, {NULL}, 0, 0, S_KART_STND1}, // S_KART_SQUISH R - /* - {SPR_PLAY, 0, 105, {NULL}, 0, 0, S_PLAY_TAP1}, // S_PLAY_STND - {SPR_PLAY, 1, 16, {NULL}, 0, 0, S_PLAY_TAP2}, // S_PLAY_TAP1 - {SPR_PLAY, 2, 16, {NULL}, 0, 0, S_PLAY_TAP1}, // S_PLAY_TAP2 - {SPR_PLAY, 3, 4, {NULL}, 0, 0, S_PLAY_RUN2}, // S_PLAY_RUN1 - {SPR_PLAY, 4, 4, {NULL}, 0, 0, S_PLAY_RUN3}, // S_PLAY_RUN2 - {SPR_PLAY, 5, 4, {NULL}, 0, 0, S_PLAY_RUN4}, // S_PLAY_RUN3 - {SPR_PLAY, 6, 4, {NULL}, 0, 0, S_PLAY_RUN5}, // S_PLAY_RUN4 - {SPR_PLAY, 7, 4, {NULL}, 0, 0, S_PLAY_RUN6}, // S_PLAY_RUN5 - {SPR_PLAY, 8, 4, {NULL}, 0, 0, S_PLAY_RUN7}, // S_PLAY_RUN6 - {SPR_PLAY, 9, 4, {NULL}, 0, 0, S_PLAY_RUN8}, // S_PLAY_RUN7 - {SPR_PLAY, 10, 4, {NULL}, 0, 0, S_PLAY_RUN1}, // S_PLAY_RUN8 - {SPR_PLAY, 16, 2, {NULL}, 0, 0, S_PLAY_SPD2}, // S_PLAY_SPD1 - {SPR_PLAY, 17, 2, {NULL}, 0, 0, S_PLAY_SPD3}, // S_PLAY_SPD2 - {SPR_PLAY, 18, 2, {NULL}, 0, 0, S_PLAY_SPD4}, // S_PLAY_SPD3 - {SPR_PLAY, 19, 2, {NULL}, 0, 0, S_PLAY_SPD1}, // S_PLAY_SPD4 - {SPR_PLAY, 11, 1, {NULL}, 0, 0, S_PLAY_ATK2}, // S_PLAY_ATK1 - {SPR_PLAY, 12, 1, {NULL}, 0, 0, S_PLAY_ATK3}, // S_PLAY_ATK2 - {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_PLAY_ATK4}, // S_PLAY_ATK3 - {SPR_PLAY, 14, 1, {NULL}, 0, 0, S_PLAY_ATK1}, // S_PLAY_ATK4 - {SPR_PLAY, 15, -1, {NULL}, 0, 0, S_PLAY_FALL1}, // S_PLAY_SPRING - {SPR_PLAY, 31, 2, {NULL}, 0, 0, S_PLAY_FALL2}, // S_PLAY_FALL1 - {SPR_PLAY, 32, 2, {NULL}, 0, 0, S_PLAY_FALL1}, // S_PLAY_FALL2 - {SPR_PLAY, 20, 2, {NULL}, 0, 0, S_PLAY_ABL2}, // S_PLAY_ABL1 - {SPR_PLAY, 21, 2, {NULL}, 0, 0, S_PLAY_ABL1}, // S_PLAY_ABL2 - {SPR_PLAY, 22, 6, {NULL}, 0, 0, S_PLAY_SPC2}, // S_PLAY_SPC1 - {SPR_PLAY, 23, 6, {NULL}, 0, 0, S_PLAY_SPC3}, // S_PLAY_SPC2 - {SPR_PLAY, 24, 6, {NULL}, 0, 0, S_PLAY_SPC4}, // S_PLAY_SPC3 - {SPR_PLAY, 25, 6, {NULL}, 0, 0, S_PLAY_SPC1}, // S_PLAY_SPC4 - {SPR_PLAY, 22, -1, {NULL}, 0, 0, S_NULL}, // S_PLAY_CLIMB1 - {SPR_PLAY, 23, 5, {NULL}, 0, 0, S_PLAY_CLIMB3}, // S_PLAY_CLIMB2 - {SPR_PLAY, 24, 5, {NULL}, 0, 0, S_PLAY_CLIMB4}, // S_PLAY_CLIMB3 - {SPR_PLAY, 25, 5, {NULL}, 0, 0, S_PLAY_CLIMB5}, // S_PLAY_CLIMB4 - {SPR_PLAY, 24, 5, {NULL}, 0, 0, S_PLAY_CLIMB2}, // S_PLAY_CLIMB5 - {SPR_PLAY, 26, 14, {NULL}, 0, 0, S_PLAY_RUN1}, // S_PLAY_GASP - {SPR_PLAY, 27, 350, {NULL}, 0, 0, S_PLAY_FALL1}, // S_PLAY_PAIN - {SPR_PLAY, 28, -1, {A_Fall}, 0, 0, S_NULL}, // S_PLAY_DIE - {SPR_PLAY, 29, 12, {NULL}, 0, 0, S_PLAY_TEETER2}, // S_PLAY_TEETER1 - {SPR_PLAY, 30, 12, {NULL}, 0, 0, S_PLAY_TEETER1}, // S_PLAY_TEETER2 - {SPR_PLAY, 33, -1, {NULL}, 0, 0, S_NULL}, // S_PLAY_CARRY - {SPR_PLAY, 20, -1, {NULL}, 0, 0, S_PLAY_SUPERSTAND}, // S_PLAY_SUPERSTAND - {SPR_PLAY, 20, 7, {NULL}, 0, 0, S_PLAY_SUPERWALK2}, // S_PLAY_SUPERWALK1 - {SPR_PLAY, 21, 7, {NULL}, 0, 0, S_PLAY_SUPERWALK1}, // S_PLAY_SUPERWALK2 - {SPR_PLAY, 22, 7, {NULL}, 0, 0, S_PLAY_SUPERFLY2}, // S_PLAY_SUPERFLY1 - {SPR_PLAY, 23, 7, {NULL}, 0, 0, S_PLAY_SUPERFLY1}, // S_PLAY_SUPERFLY2 - {SPR_PLAY, 24, 12, {NULL}, 0, 0, S_PLAY_SUPERTEETER}, // S_PLAY_SUPERTEETER - {SPR_PLAY, 25, -1, {NULL}, 0, 0, S_PLAY_SUPERSTAND}, // S_PLAY_SUPERHIT - {SPR_PLAY, 36, 4, {NULL}, 0, 0, S_PLAY_SUPERTRANS2}, // S_PLAY_SUPERTRANS1 - {SPR_PLAY, 37, 4, {NULL}, 0, 0, S_PLAY_SUPERTRANS3}, // S_PLAY_SUPERTRANS2 - {SPR_PLAY, 32806, 4, {NULL}, 0, 0, S_PLAY_SUPERTRANS4}, // S_PLAY_SUPERTRANS3 - {SPR_PLAY, 39, 3, {NULL}, 0, 0, S_PLAY_SUPERTRANS5}, // S_PLAY_SUPERTRANS4 - {SPR_PLAY, 40, 3, {NULL}, 0, 0, S_PLAY_SUPERTRANS6}, // S_PLAY_SUPERTRANS5 - {SPR_PLAY, 41, 3, {NULL}, 0, 0, S_PLAY_SUPERTRANS7}, // S_PLAY_SUPERTRANS6 - {SPR_PLAY, 42, 3, {NULL}, 0, 0, S_PLAY_SUPERTRANS8}, // S_PLAY_SUPERTRANS7 - {SPR_PLAY, 43, 3, {NULL}, 0, 0, S_PLAY_SUPERTRANS9}, // S_PLAY_SUPERTRANS8 - {SPR_PLAY, 44, 16, {NULL}, 0, 0, S_PLAY_RUN1}, // S_PLAY_SUPERTRANS9 - */ + {SPR_PLAY, 0, 1, {NULL}, 0, 0, S_KART_STILL2}, // S_KART_STILL1 A + {SPR_PLAY, 1, 1, {NULL}, 0, 0, S_KART_STILL1}, // S_KART_STILL2 B + {SPR_PLAY, 2, 1, {NULL}, 0, 0, S_KART_STILL2_L}, // S_KART_STILL1_L C + {SPR_PLAY, 3, 1, {NULL}, 0, 0, S_KART_STILL1_L}, // S_KART_STILL2_L D + {SPR_PLAY, 4, 1, {NULL}, 0, 0, S_KART_STILL2_R}, // S_KART_STILL1_R E + {SPR_PLAY, 5, 1, {NULL}, 0, 0, S_KART_STILL1_R}, // S_KART_STILL2_R F + {SPR_PLAY, 9, 1, {NULL}, 0, 0, S_KART_SLOW2}, // S_KART_SLOW1 J + {SPR_PLAY, 6, 1, {NULL}, 0, 0, S_KART_SLOW1}, // S_KART_SLOW2 G + {SPR_PLAY, 10, 1, {NULL}, 0, 0, S_KART_SLOW2_L}, // S_KART_SLOW1_L K + {SPR_PLAY, 7, 1, {NULL}, 0, 0, S_KART_SLOW1_L}, // S_KART_SLOW2_L H + {SPR_PLAY, 11, 1, {NULL}, 0, 0, S_KART_SLOW2_R}, // S_KART_SLOW1_R L + {SPR_PLAY, 8, 1, {NULL}, 0, 0, S_KART_SLOW1_R}, // S_KART_SLOW1_R I + {SPR_PLAY, 0, 1, {NULL}, 0, 0, S_KART_FAST2}, // S_KART_FAST1 A + {SPR_PLAY, 9, 1, {NULL}, 0, 0, S_KART_FAST1}, // S_KART_FAST2 J + {SPR_PLAY, 2, 1, {NULL}, 0, 0, S_KART_FAST2_L}, // S_KART_FAST1_L C + {SPR_PLAY, 10, 1, {NULL}, 0, 0, S_KART_FAST1_L}, // S_KART_FAST2_L K + {SPR_PLAY, 4, 1, {NULL}, 0, 0, S_KART_FAST2_R}, // S_KART_FAST1_R E + {SPR_PLAY, 11, 1, {NULL}, 0, 0, S_KART_FAST1_R}, // S_KART_FAST2_R L + {SPR_PLAY, 12, 1, {NULL}, 0, 0, S_KART_DRIFT2_L}, // S_KART_DRIFT1_L M + {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_KART_DRIFT1_L}, // S_KART_DRIFT2_L N + {SPR_PLAY, 12, 1, {NULL}, 0, 0, S_KART_DRIFT2_L_OUT}, // S_KART_DRIFT1_L_OUT M + {SPR_PLAY, 14, 1, {NULL}, 0, 0, S_KART_DRIFT1_L_OUT}, // S_KART_DRIFT2_L_OUT O + {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_KART_DRIFT2_L_IN}, // S_KART_DRIFT1_L_IN N + {SPR_PLAY, 15, 1, {NULL}, 0, 0, S_KART_DRIFT3_L_IN}, // S_KART_DRIFT2_L_IN P + {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_KART_DRIFT4_L_IN}, // S_KART_DRIFT3_L_IN N + {SPR_PLAY, 16, 1, {NULL}, 0, 0, S_KART_DRIFT1_L_IN}, // S_KART_DRIFT4_L_IN Q + {SPR_PLAY, 17, 1, {NULL}, 0, 0, S_KART_DRIFT2_R}, // S_KART_DRIFT1_R R + {SPR_PLAY, 18, 1, {NULL}, 0, 0, S_KART_DRIFT1_R}, // S_KART_DRIFT2_R S + {SPR_PLAY, 17, 1, {NULL}, 0, 0, S_KART_DRIFT2_R_OUT}, // S_KART_DRIFT1_R_OUT R + {SPR_PLAY, 19, 1, {NULL}, 0, 0, S_KART_DRIFT1_R_OUT}, // S_KART_DRIFT2_R_OUT T + {SPR_PLAY, 18, 1, {NULL}, 0, 0, S_KART_DRIFT2_R_IN}, // S_KART_DRIFT1_R_IN S + {SPR_PLAY, 20, 1, {NULL}, 0, 0, S_KART_DRIFT3_R_IN}, // S_KART_DRIFT2_R_IN U + {SPR_PLAY, 18, 1, {NULL}, 0, 0, S_KART_DRIFT4_R_IN}, // S_KART_DRIFT3_R_IN S + {SPR_PLAY, 21, 1, {NULL}, 0, 0, S_KART_DRIFT1_R_IN}, // S_KART_DRIFT4_R_IN V + {SPR_PLAY, 22, -1, {NULL}, 0, 0, S_KART_SPIN}, // S_KART_SPIN W + {SPR_PLAY, 22, 350, {NULL}, 0, 0, S_KART_STILL1}, // S_KART_PAIN W + {SPR_PLAY, 23, 350, {NULL}, 0, 0, S_KART_STILL1}, // S_KART_SQUISH X {SPR_NULL, 0, -1, {NULL}, 0, 0, S_OBJPLACE_DUMMY}, //S_OBJPLACE_DUMMY @@ -195,7 +150,7 @@ state_t states[NUMSTATES] = {SPR_NULL, 0, 18, {NULL}, 0, 4, S_NULL}, // S_PLAY_ICON3 // Level end sign (uses player sprite) - {SPR_PLAY, 18|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_PLAY_SIGN}, // S_PLAY_SIGN + {SPR_PLAY, 24|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_PLAY_SIGN}, // S_PLAY_SIGN // Blue Crawla {SPR_POSS, 0, 5, {A_Look}, 0, 0, S_POSS_STND}, // S_POSS_STND @@ -3635,9 +3590,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { // MT_PLAYER -1, // doomednum - S_KART_STND1, // spawnstate + S_KART_STILL1, // spawnstate 1, // spawnhealth - S_KART_WALK1, // seestate + S_KART_FAST1, // seestate sfx_None, // seesound 0, // reactiontime sfx_thok, // attacksound diff --git a/src/info.h b/src/info.h index f86fed973..6fc67e354 100644 --- a/src/info.h +++ b/src/info.h @@ -826,88 +826,52 @@ typedef enum state S_THOK, // SRB2kart Frames - S_KART_STND1, - S_KART_STND2, - S_KART_STND1_L, - S_KART_STND2_L, - S_KART_STND1_R, - S_KART_STND2_R, - S_KART_WALK1, - S_KART_WALK2, - S_KART_WALK1_L, - S_KART_WALK2_L, - S_KART_WALK1_R, - S_KART_WALK2_R, - S_KART_RUN1, - S_KART_RUN2, - S_KART_RUN1_L, - S_KART_RUN2_L, - S_KART_RUN1_R, - S_KART_RUN2_R, + S_KART_STILL1, + S_KART_STILL2, + S_KART_STILL1_L, + S_KART_STILL2_L, + S_KART_STILL1_R, + S_KART_STILL2_R, + + S_KART_SLOW1, + S_KART_SLOW2, + S_KART_SLOW1_L, + S_KART_SLOW2_L, + S_KART_SLOW1_R, + S_KART_SLOW2_R, + + S_KART_FAST1, + S_KART_FAST2, + S_KART_FAST1_L, + S_KART_FAST2_L, + S_KART_FAST1_R, + S_KART_FAST2_R, + S_KART_DRIFT1_L, S_KART_DRIFT2_L, + + S_KART_DRIFT1_L_OUT, + S_KART_DRIFT2_L_OUT, + + S_KART_DRIFT1_L_IN, + S_KART_DRIFT2_L_IN, + S_KART_DRIFT3_L_IN, + S_KART_DRIFT4_L_IN, + S_KART_DRIFT1_R, S_KART_DRIFT2_R, + + S_KART_DRIFT1_R_OUT, + S_KART_DRIFT2_R_OUT, + + S_KART_DRIFT1_R_IN, + S_KART_DRIFT2_R_IN, + S_KART_DRIFT3_R_IN, + S_KART_DRIFT4_R_IN, + S_KART_SPIN, S_KART_PAIN, S_KART_SQUISH, - /* - S_PLAY_STND, - S_PLAY_TAP1, - S_PLAY_TAP2, - S_PLAY_RUN1, - S_PLAY_RUN2, - S_PLAY_RUN3, - S_PLAY_RUN4, - S_PLAY_RUN5, - S_PLAY_RUN6, - S_PLAY_RUN7, - S_PLAY_RUN8, - S_PLAY_SPD1, - S_PLAY_SPD2, - S_PLAY_SPD3, - S_PLAY_SPD4, - S_PLAY_ATK1, - S_PLAY_ATK2, - S_PLAY_ATK3, - S_PLAY_ATK4, - S_PLAY_SPRING, - S_PLAY_FALL1, - S_PLAY_FALL2, - S_PLAY_ABL1, - S_PLAY_ABL2, - S_PLAY_SPC1, - S_PLAY_SPC2, - S_PLAY_SPC3, - S_PLAY_SPC4, - S_PLAY_CLIMB1, - S_PLAY_CLIMB2, - S_PLAY_CLIMB3, - S_PLAY_CLIMB4, - S_PLAY_CLIMB5, - S_PLAY_GASP, - S_PLAY_PAIN, - S_PLAY_DIE, - S_PLAY_TEETER1, - S_PLAY_TEETER2, - S_PLAY_CARRY, - S_PLAY_SUPERSTAND, - S_PLAY_SUPERWALK1, - S_PLAY_SUPERWALK2, - S_PLAY_SUPERFLY1, - S_PLAY_SUPERFLY2, - S_PLAY_SUPERTEETER, - S_PLAY_SUPERHIT, - S_PLAY_SUPERTRANS1, - S_PLAY_SUPERTRANS2, - S_PLAY_SUPERTRANS3, - S_PLAY_SUPERTRANS4, - S_PLAY_SUPERTRANS5, - S_PLAY_SUPERTRANS6, - S_PLAY_SUPERTRANS7, - S_PLAY_SUPERTRANS8, - S_PLAY_SUPERTRANS9, // This has special significance in the code. If you add more frames, search for it and make the appropriate changes. - */ // technically the player goes here but it's an infinite tic state S_OBJPLACE_DUMMY, diff --git a/src/k_kart.c b/src/k_kart.c index 2a672af13..0919b0552 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2403,49 +2403,129 @@ void K_RespawnChecker(player_t *player) */ void K_KartMoveAnimation(player_t *player) { + const INT16 minturn = KART_FULLTURN/8; + const fixed_t fastspeed = (K_GetKartSpeed(player, false) * 17) / 20; // 85% + const fixed_t speedthreshold = player->mo->scale / 8; + const boolean onground = P_IsObjectOnGround(player->mo); ticcmd_t *cmd = &player->cmd; - // Standing frames - S_KART_STND1 S_KART_STND1_L S_KART_STND1_R + SINT8 turndir = 0; + + if (cmd->driftturn < -minturn) + { + turndir = -1; + } + else if (cmd->driftturn > minturn) + { + turndir = 1; + } + if (player->speed == 0) { - if (cmd->driftturn < 0 && !(player->mo->state >= &states[S_KART_STND1_R] && player->mo->state <= &states[S_KART_STND2_R])) - P_SetPlayerMobjState(player->mo, S_KART_STND1_R); - else if (cmd->driftturn > 0 && !(player->mo->state >= &states[S_KART_STND1_L] && player->mo->state <= &states[S_KART_STND2_L])) - P_SetPlayerMobjState(player->mo, S_KART_STND1_L); - else if (cmd->driftturn == 0 && !(player->mo->state >= &states[S_KART_STND1] && player->mo->state <= &states[S_KART_STND2])) - P_SetPlayerMobjState(player->mo, S_KART_STND1); + // Completely still. + + if ((turndir == -1) + && !(player->mo->state >= &states[S_KART_STILL1_R] && player->mo->state <= &states[S_KART_STILL2_R])) + { + P_SetPlayerMobjState(player->mo, S_KART_STILL1_R); + } + else if ((turndir == 1) + && !(player->mo->state >= &states[S_KART_STILL1_L] && player->mo->state <= &states[S_KART_STILL2_L])) + { + P_SetPlayerMobjState(player->mo, S_KART_STILL1_L); + } + else if ((turndir == 0) + && !(player->mo->state >= &states[S_KART_STILL1] && player->mo->state <= &states[S_KART_STILL2])) + { + P_SetPlayerMobjState(player->mo, S_KART_STILL1); + } } - // Drifting Left - S_KART_DRIFT1_L - else if (player->kartstuff[k_drift] > 0 && P_IsObjectOnGround(player->mo)) + else if (player->kartstuff[k_drift] > 0 && onground) { - if (!(player->mo->state >= &states[S_KART_DRIFT1_L] && player->mo->state <= &states[S_KART_DRIFT2_L])) + // Drifting LEFT! + + if ((turndir == -1) + && !(player->mo->state >= &states[S_KART_DRIFT1_L_OUT] && player->mo->state <= &states[S_KART_DRIFT2_L_OUT])) + { + // Right -- outwards drift + P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_L_OUT); + } + else if ((turndir == 1) + && !(player->mo->state >= &states[S_KART_DRIFT1_L_IN] && player->mo->state <= &states[S_KART_DRIFT4_L_IN])) + { + // Left -- inwards drift + P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_L_IN); + } + else if ((turndir == 0) + && !(player->mo->state >= &states[S_KART_DRIFT1_L] && player->mo->state <= &states[S_KART_DRIFT2_L])) + { + // Neutral drift P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_L); + } } - // Drifting Right - S_KART_DRIFT1_R - else if (player->kartstuff[k_drift] < 0 && P_IsObjectOnGround(player->mo)) + else if (player->kartstuff[k_drift] < 0 && onground) { - if (!(player->mo->state >= &states[S_KART_DRIFT1_R] && player->mo->state <= &states[S_KART_DRIFT2_R])) + // Drifting RIGHT! + + if ((turndir == -1) + && !(player->mo->state >= &states[S_KART_DRIFT1_R_IN] && player->mo->state <= &states[S_KART_DRIFT4_R_IN])) + { + // Right -- inwards drift + P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_R_IN); + } + else if ((turndir == 1) + && !(player->mo->state >= &states[S_KART_DRIFT1_R_OUT] && player->mo->state <= &states[S_KART_DRIFT2_R_OUT])) + { + // Left -- outwards drift + P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_R_OUT); + } + else if ((turndir == 0) + && !(player->mo->state >= &states[S_KART_DRIFT1_R] && player->mo->state <= &states[S_KART_DRIFT2_R])) + { + // Neutral drift P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_R); + } } - // Run frames - S_KART_RUN1 S_KART_RUN1_L S_KART_RUN1_R - else if (player->speed > (20*player->mo->scale)) + else if (player->speed >= fastspeed && (!onground || player->speed >= (player->lastspeed - speedthreshold))) { - if (cmd->driftturn < 0 && !(player->mo->state >= &states[S_KART_RUN1_R] && player->mo->state <= &states[S_KART_RUN2_R])) - P_SetPlayerMobjState(player->mo, S_KART_RUN1_R); - else if (cmd->driftturn > 0 && !(player->mo->state >= &states[S_KART_RUN1_L] && player->mo->state <= &states[S_KART_RUN2_L])) - P_SetPlayerMobjState(player->mo, S_KART_RUN1_L); - else if (cmd->driftturn == 0 && !(player->mo->state >= &states[S_KART_RUN1] && player->mo->state <= &states[S_KART_RUN2])) - P_SetPlayerMobjState(player->mo, S_KART_RUN1); + // Going REAL fast! + if ((turndir == -1) + && !(player->mo->state >= &states[S_KART_FAST1_R] && player->mo->state <= &states[S_KART_FAST2_R])) + { + P_SetPlayerMobjState(player->mo, S_KART_FAST1_R); + } + else if ((turndir == 1) + && !(player->mo->state >= &states[S_KART_FAST1_L] && player->mo->state <= &states[S_KART_FAST2_L])) + { + P_SetPlayerMobjState(player->mo, S_KART_FAST1_L); + } + else if ((turndir == 0) + && !(player->mo->state >= &states[S_KART_FAST1] && player->mo->state <= &states[S_KART_FAST2])) + { + P_SetPlayerMobjState(player->mo, S_KART_FAST1); + } } - // Walk frames - S_KART_WALK1 S_KART_WALK1_L S_KART_WALK1_R - else if (player->speed <= (20*player->mo->scale)) + else { - if (cmd->driftturn < 0 && !(player->mo->state >= &states[S_KART_WALK1_R] && player->mo->state <= &states[S_KART_WALK2_R])) - P_SetPlayerMobjState(player->mo, S_KART_WALK1_R); - else if (cmd->driftturn > 0 && !(player->mo->state >= &states[S_KART_WALK1_L] && player->mo->state <= &states[S_KART_WALK2_L])) - P_SetPlayerMobjState(player->mo, S_KART_WALK1_L); - else if (cmd->driftturn == 0 && !(player->mo->state >= &states[S_KART_WALK1] && player->mo->state <= &states[S_KART_WALK2])) - P_SetPlayerMobjState(player->mo, S_KART_WALK1); + // Slowing down... + if ((turndir == -1) + && !(player->mo->state >= &states[S_KART_SLOW1_R] && player->mo->state <= &states[S_KART_SLOW2_R])) + { + P_SetPlayerMobjState(player->mo, S_KART_SLOW1_R); + } + else if ((turndir == 1) + && !(player->mo->state >= &states[S_KART_SLOW1_L] && player->mo->state <= &states[S_KART_SLOW2_L])) + { + P_SetPlayerMobjState(player->mo, S_KART_SLOW1_L); + } + else if ((turndir == 0) + && !(player->mo->state >= &states[S_KART_SLOW1] && player->mo->state <= &states[S_KART_SLOW2])) + { + P_SetPlayerMobjState(player->mo, S_KART_SLOW1); + } } + + // Update lastspeed value -- we use to display slow driving frames instead of fast driving when slowing down. + player->lastspeed = player->speed; } static void K_TauntVoiceTimers(player_t *player) diff --git a/src/m_cheat.c b/src/m_cheat.c index d61d22cd0..894633eff 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -1308,7 +1308,7 @@ void Command_ObjectPlace_f(void) op_oldmomy = players[0].mo->momy; op_oldmomz = players[0].mo->momz; op_oldheight = players[0].mo->height; - op_oldstate = S_KART_STND1; // SRB2kart - was S_PLAY_STND + op_oldstate = S_KART_STILL1; // SRB2kart - was S_PLAY_STND op_oldcolor = players[0].mo->color; // save color too in case of super/fireflower // Remove ALL flags and motion. diff --git a/src/p_inter.c b/src/p_inter.c index 1451e4b6d..fe84b87b5 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1176,7 +1176,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) P_ResetPlayer(player); - P_SetPlayerMobjState(toucher, S_KART_STND1); // SRB2kart - was S_PLAY_FALL1 + P_SetPlayerMobjState(toucher, S_KART_STILL1); // SRB2kart - was S_PLAY_FALL1 } } return; @@ -1482,7 +1482,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (player->pflags & PF_GLIDING) { player->pflags &= ~(PF_GLIDING|PF_JUMPED); - P_SetPlayerMobjState(toucher, S_KART_STND1); // SRB2kart - was S_PLAY_FALL1 + P_SetPlayerMobjState(toucher, S_KART_STILL1); // SRB2kart - was S_PLAY_FALL1 } // Play a bounce sound? @@ -1549,7 +1549,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (player->pflags & PF_GLIDING) { player->pflags &= ~(PF_GLIDING|PF_JUMPED); - P_SetPlayerMobjState(toucher, S_KART_STND1); // SRB2kart - was S_PLAY_FALL1 + P_SetPlayerMobjState(toucher, S_KART_STILL1); // SRB2kart - was S_PLAY_FALL1 } // Play a bounce sound? @@ -1605,7 +1605,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) { player->pflags |= PF_MACESPIN; S_StartSound(toucher, sfx_spin); - P_SetPlayerMobjState(toucher, S_KART_STND1); // SRB2kart - was S_PLAY_ATK1 + P_SetPlayerMobjState(toucher, S_KART_STILL1); // SRB2kart - was S_PLAY_ATK1 } else player->pflags |= PF_ITEMHANG; diff --git a/src/p_mobj.c b/src/p_mobj.c index 1a7c562a7..aa04ccac9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -211,11 +211,11 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) // Set animation state // The pflags version of this was just as convoluted. // Rewriten for SRB2kart ... though I don't know what this is. - if ((state >= S_KART_STND1 && state <= S_KART_STND2_R) || state == S_KART_SQUISH || state == S_KART_SPIN) + if ((state >= S_KART_STILL1 && state <= S_KART_STILL2_R) || state == S_KART_SQUISH || state == S_KART_SPIN) player->panim = PA_IDLE; - else if (state >= S_KART_WALK1 && state <= S_KART_WALK2_R) + else if (state >= S_KART_SLOW1 && state <= S_KART_SLOW2_R) player->panim = PA_WALK; - else if (state >= S_KART_RUN1 && state <= S_KART_DRIFT2_R) + else if (state >= S_KART_FAST1 && state <= S_KART_DRIFT2_R) player->panim = PA_RUN; //else if (state >= S_PLAY_ATK1 && state <= S_PLAY_ATK4) // player->panim = PA_ROLL; @@ -1445,7 +1445,7 @@ static void P_XYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy) { // if in a walking frame, stop moving if (player->panim == PA_WALK && player->kartstuff[k_spinouttimer] == 0) - P_SetPlayerMobjState(mo, S_KART_STND1); // SRB2kart - was S_PLAY_STND + P_SetPlayerMobjState(mo, S_KART_STILL1); // SRB2kart - was S_PLAY_STND mo->momx = player->cmomx; mo->momy = player->cmomy; } @@ -2739,7 +2739,7 @@ static void P_PlayerZMovement(mobj_t *mo) // Get up if you fell. if ((mo->state == &states[mo->info->painstate] || mo->state == &states[S_KART_SPIN]) && mo->player->kartstuff[k_spinouttimer] == 0 && mo->player->kartstuff[k_squishedtimer] == 0) // SRB2kart - P_SetPlayerMobjState(mo, S_KART_STND1); + P_SetPlayerMobjState(mo, S_KART_STILL1); #ifdef ESLOPE if (!mo->standingslope && (mo->eflags & MFE_VERTICALFLIP ? tmceilingslope : tmfloorslope)) { @@ -3852,7 +3852,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj) { mobj->player->secondjump = 0; mobj->player->powers[pw_tailsfly] = 0; - P_SetPlayerMobjState(mobj, S_KART_WALK1); // SRB2kart - was S_PLAY_RUN1 + P_SetPlayerMobjState(mobj, S_KART_SLOW1); // SRB2kart - was S_PLAY_RUN1 } mobj->eflags &= ~MFE_JUSTHITFLOOR; } @@ -11927,7 +11927,7 @@ void P_AfterPlayerSpawn(INT32 playernum) else p->viewz = p->mo->z + p->viewheight; - P_SetPlayerMobjState(p->mo, S_KART_STND1); // SRB2kart - was S_PLAY_STND + P_SetPlayerMobjState(p->mo, S_KART_STILL1); // SRB2kart - was S_PLAY_STND p->pflags &= ~PF_SPINNING; if (playernum == consoleplayer) diff --git a/src/p_spec.c b/src/p_spec.c index a3ed2ad57..576e48afa 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2882,7 +2882,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) mo->player->rmomx = mo->player->rmomy = 1; mo->player->cmomx = mo->player->cmomy = 0; P_ResetPlayer(mo->player); - P_SetPlayerMobjState(mo, S_KART_STND1); // SRB2kart - was S_PLAY_STND + P_SetPlayerMobjState(mo, S_KART_STILL1); // SRB2kart - was S_PLAY_STND // Reset bot too. if (bot) { @@ -2893,7 +2893,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) bot->player->rmomx = bot->player->rmomy = 1; bot->player->cmomx = bot->player->cmomy = 0; P_ResetPlayer(bot->player); - P_SetPlayerMobjState(bot, S_KART_STND1); // SRB2kart - was S_PLAY_STND + P_SetPlayerMobjState(bot, S_KART_STILL1); // SRB2kart - was S_PLAY_STND } } break; @@ -4349,8 +4349,8 @@ DoneSection2: player->pflags &= ~PF_GLIDING; player->climbing = 0; - if (!(player->mo->state >= &states[S_KART_RUN1] && player->mo->state <= &states[S_KART_RUN2])) - P_SetPlayerMobjState(player->mo, S_KART_RUN1); + if (!(player->mo->state >= &states[S_KART_FAST1] && player->mo->state <= &states[S_KART_FAST2])) + P_SetPlayerMobjState(player->mo, S_KART_FAST1); //if (!(player->mo->state >= &states[S_PLAY_ATK1] && player->mo->state <= &states[S_PLAY_ATK4])) // SRB2kart //{ @@ -4424,8 +4424,8 @@ DoneSection2: player->pflags &= ~PF_SPINNING; // SRB2kart 200117 player->pflags &= ~PF_JUMPED; - if (!(player->mo->state >= &states[S_KART_RUN1] && player->mo->state <= &states[S_KART_RUN2])) - P_SetPlayerMobjState(player->mo, S_KART_RUN1); + if (!(player->mo->state >= &states[S_KART_FAST1] && player->mo->state <= &states[S_KART_FAST2])) + P_SetPlayerMobjState(player->mo, S_KART_FAST1); //if (!(player->mo->state >= &states[S_PLAY_ATK1] && player->mo->state <= &states[S_PLAY_ATK4])) // SRB2kart //{ diff --git a/src/p_telept.c b/src/p_telept.c index 8c2f8ed70..dcfbe3a0b 100644 --- a/src/p_telept.c +++ b/src/p_telept.c @@ -100,7 +100,7 @@ void P_MixUp(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle, thing->player->starpostnum = starpostnum; P_ResetPlayer(thing->player); - P_SetPlayerMobjState(thing, S_KART_STND1); // SRB2kart - was S_PLAY_STND + P_SetPlayerMobjState(thing, S_KART_STILL1); // SRB2kart - was S_PLAY_STND P_FlashPal(thing->player, PAL_MIXUP, 10); } @@ -185,7 +185,7 @@ boolean P_Teleport(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle thing->player->rmomx = thing->player->rmomy = 0; thing->player->speed = 0; P_ResetPlayer(thing->player); - P_SetPlayerMobjState(thing, S_KART_STND1); // SRB2kart - was S_PLAY_STND + P_SetPlayerMobjState(thing, S_KART_STILL1); // SRB2kart - was S_PLAY_STND } if (flash) diff --git a/src/p_user.c b/src/p_user.c index 54e2350b6..0378a24fa 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2934,7 +2934,7 @@ static void P_DoClimbing(player_t *player) // SRB2kart - unused if (player->climbing && P_IsObjectOnGround(player->mo)) { P_ResetPlayer(player); - P_SetPlayerMobjState(player->mo, S_KART_STND1); // SRB2kart + P_SetPlayerMobjState(player->mo, S_KART_STILL1); // SRB2kart } } @@ -3640,7 +3640,7 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd) // SRB2kart - unused. { player->skidtime = 0; player->pflags &= ~PF_SPINNING; - P_SetPlayerMobjState(player->mo, S_KART_STND1); + P_SetPlayerMobjState(player->mo, S_KART_STILL1); player->mo->momx = player->cmomx; player->mo->momy = player->cmomy; } @@ -3836,14 +3836,14 @@ static void P_2dMovement(player_t *player) else if (player->exiting) { player->pflags &= ~PF_GLIDING; - P_SetPlayerMobjState(player->mo, S_KART_WALK1); // SRB2kart - was S_PLAY_RUN1 + P_SetPlayerMobjState(player->mo, S_KART_SLOW1); // SRB2kart - was S_PLAY_RUN1 player->skidtime = 0; } } if (player->pflags & PF_SPINNING && !player->exiting) { player->pflags &= ~PF_SPINNING; - P_SetPlayerMobjState(player->mo, S_KART_STND1); // SRB2kart - was S_PLAY_STND + P_SetPlayerMobjState(player->mo, S_KART_STILL1); // SRB2kart - was S_PLAY_STND } } @@ -5830,18 +5830,18 @@ static void P_MovePlayer(player_t *player) // If the player is moving fast enough, // break into a run! if (player->speed >= runspd && player->panim == PA_WALK && !player->skidtime && (onground || player->powers[pw_super])) - P_SetPlayerMobjState (player->mo, S_KART_RUN1); // SRB2kart - was S_PLAY_SPD1 + P_SetPlayerMobjState (player->mo, S_KART_FAST1); // SRB2kart - was S_PLAY_SPD1 // Otherwise, just walk. else if ((player->rmomx || player->rmomy) && player->panim == PA_IDLE) - P_SetPlayerMobjState (player->mo, S_KART_WALK1); // SRB2kart - was S_PLAY_RUN1 + P_SetPlayerMobjState (player->mo, S_KART_SLOW1); // SRB2kart - was S_PLAY_RUN1 } */ // If your running animation is playing, and you're // going too slow, switch back to the walking frames. //if (player->panim == PA_RUN && player->speed < runspd && player->kartstuff[k_spinouttimer] == 0) - //P_SetPlayerMobjState(player->mo, S_KART_WALK1); // SRB2kart - was S_PLAY_RUN1 + //P_SetPlayerMobjState(player->mo, S_KART_SLOW1); // SRB2kart - was S_PLAY_RUN1 // If Springing, but travelling DOWNWARD, change back! //if (player->mo->state == &states[S_PLAY_SPRING] && P_MobjFlip(player->mo)*player->mo->momz < 0) @@ -5889,16 +5889,26 @@ static void P_MovePlayer(player_t *player) K_KartMoveAnimation(player); if (player->kartstuff[k_pogospring]) + { player->frameangle += ANGLE_22h; + } else + { player->frameangle = player->mo->angle; + + if (player->kartstuff[k_drift] != 0) + { + INT32 a = (ANGLE_45 / 5) * player->kartstuff[k_drift]; + player->frameangle += a; + } + } } player->mo->movefactor = FRACUNIT; // We're not going to do any more with this, so let's change it back for the next frame. // If you are stopped and are still walking, stand still! if (!player->mo->momx && !player->mo->momy && !player->mo->momz && player->panim == PA_WALK) - P_SetPlayerMobjState(player->mo, S_KART_STND1); // SRB2kart - was S_PLAY_STND + P_SetPlayerMobjState(player->mo, S_KART_STILL1); // SRB2kart - was S_PLAY_STND //{ SRB2kart @@ -5929,7 +5939,7 @@ static void P_MovePlayer(player_t *player) player->jumping = 0; player->secondjump = 0; player->pflags &= ~PF_THOKKED; - P_SetPlayerMobjState(player->mo, S_KART_STND1); // SRB2kart - was S_PLAY_STND + P_SetPlayerMobjState(player->mo, S_KART_STILL1); // SRB2kart - was S_PLAY_STND } if (/*!(player->charability == CA_GLIDEANDCLIMB) ||*/ player->gotflag) // If you can't glide, then why the heck would you be gliding? @@ -8498,7 +8508,7 @@ void P_PlayerThink(player_t *player) if (player->powers[pw_ingoop]) { - if (player->mo->state == &states[S_KART_STND1]) // SRB2kart - was S_PLAY_STND + if (player->mo->state == &states[S_KART_STILL1]) // SRB2kart - was S_PLAY_STND player->mo->tics = 2; player->powers[pw_ingoop]--; From c2b18a989c6955c190dd6b97e4e93326efa94420 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 8 May 2020 18:27:51 -0400 Subject: [PATCH 08/21] More logic to spinning your wheels Use "tire spinning" animations when you're moving on the ground and/or holding accelerate! The two cases that are changed are: - If you're in the air and not pressing accelerate, your tires won't spin anymore. - If you're on the ground, but not moving, but you're still pressing accelerate, they will spin in place. (right now only happens for start boosting, later it will be for spindashing) Isn't really a tell for anything, just thought it'd be fun attention to detail :) Additionally, we can use drift frames in the air. Just makes sense because we have air sparks now. --- src/k_kart.c | 228 +++++++++++++++++++++++++++++++-------------------- src/p_user.c | 4 - 2 files changed, 141 insertions(+), 91 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 0919b0552..997e48bc7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2404,11 +2404,15 @@ void K_RespawnChecker(player_t *player) void K_KartMoveAnimation(player_t *player) { const INT16 minturn = KART_FULLTURN/8; + SINT8 turndir = 0; + const fixed_t fastspeed = (K_GetKartSpeed(player, false) * 17) / 20; // 85% const fixed_t speedthreshold = player->mo->scale / 8; + const boolean onground = P_IsObjectOnGround(player->mo); + ticcmd_t *cmd = &player->cmd; - SINT8 turndir = 0; + const boolean spinningwheels = ((cmd->buttons & BT_ACCELERATE) || (onground && player->speed > 0)); if (cmd->driftturn < -minturn) { @@ -2419,108 +2423,158 @@ void K_KartMoveAnimation(player_t *player) turndir = 1; } - if (player->speed == 0) + if (!onground) { - // Completely still. + // Only use certain frames in the air, to make it look like your tires are spinning fruitlessly! - if ((turndir == -1) - && !(player->mo->state >= &states[S_KART_STILL1_R] && player->mo->state <= &states[S_KART_STILL2_R])) + if (player->kartstuff[k_drift] > 0) { - P_SetPlayerMobjState(player->mo, S_KART_STILL1_R); + if (!spinningwheels || !(player->mo->state >= &states[S_KART_DRIFT1_L] && player->mo->state <= &states[S_KART_DRIFT2_L])) + { + // Neutral drift + P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_L); + } } - else if ((turndir == 1) - && !(player->mo->state >= &states[S_KART_STILL1_L] && player->mo->state <= &states[S_KART_STILL2_L])) + else if (player->kartstuff[k_drift] > 0) { - P_SetPlayerMobjState(player->mo, S_KART_STILL1_L); + if (!spinningwheels || !(player->mo->state >= &states[S_KART_DRIFT1_R] && player->mo->state <= &states[S_KART_DRIFT2_R])) + { + // Neutral drift + P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_R); + } } - else if ((turndir == 0) - && !(player->mo->state >= &states[S_KART_STILL1] && player->mo->state <= &states[S_KART_STILL2])) + else { - P_SetPlayerMobjState(player->mo, S_KART_STILL1); - } - } - else if (player->kartstuff[k_drift] > 0 && onground) - { - // Drifting LEFT! - - if ((turndir == -1) - && !(player->mo->state >= &states[S_KART_DRIFT1_L_OUT] && player->mo->state <= &states[S_KART_DRIFT2_L_OUT])) - { - // Right -- outwards drift - P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_L_OUT); - } - else if ((turndir == 1) - && !(player->mo->state >= &states[S_KART_DRIFT1_L_IN] && player->mo->state <= &states[S_KART_DRIFT4_L_IN])) - { - // Left -- inwards drift - P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_L_IN); - } - else if ((turndir == 0) - && !(player->mo->state >= &states[S_KART_DRIFT1_L] && player->mo->state <= &states[S_KART_DRIFT2_L])) - { - // Neutral drift - P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_L); - } - } - else if (player->kartstuff[k_drift] < 0 && onground) - { - // Drifting RIGHT! - - if ((turndir == -1) - && !(player->mo->state >= &states[S_KART_DRIFT1_R_IN] && player->mo->state <= &states[S_KART_DRIFT4_R_IN])) - { - // Right -- inwards drift - P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_R_IN); - } - else if ((turndir == 1) - && !(player->mo->state >= &states[S_KART_DRIFT1_R_OUT] && player->mo->state <= &states[S_KART_DRIFT2_R_OUT])) - { - // Left -- outwards drift - P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_R_OUT); - } - else if ((turndir == 0) - && !(player->mo->state >= &states[S_KART_DRIFT1_R] && player->mo->state <= &states[S_KART_DRIFT2_R])) - { - // Neutral drift - P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_R); - } - } - else if (player->speed >= fastspeed && (!onground || player->speed >= (player->lastspeed - speedthreshold))) - { - // Going REAL fast! - if ((turndir == -1) - && !(player->mo->state >= &states[S_KART_FAST1_R] && player->mo->state <= &states[S_KART_FAST2_R])) - { - P_SetPlayerMobjState(player->mo, S_KART_FAST1_R); - } - else if ((turndir == 1) - && !(player->mo->state >= &states[S_KART_FAST1_L] && player->mo->state <= &states[S_KART_FAST2_L])) - { - P_SetPlayerMobjState(player->mo, S_KART_FAST1_L); - } - else if ((turndir == 0) - && !(player->mo->state >= &states[S_KART_FAST1] && player->mo->state <= &states[S_KART_FAST2])) - { - P_SetPlayerMobjState(player->mo, S_KART_FAST1); + if ((turndir == -1) + && (!spinningwheels || !(player->mo->state >= &states[S_KART_FAST1_R] && player->mo->state <= &states[S_KART_FAST2_R]))) + { + P_SetPlayerMobjState(player->mo, S_KART_FAST2_R); + } + else if ((turndir == 1) + && (!spinningwheels || !(player->mo->state >= &states[S_KART_FAST1_L] && player->mo->state <= &states[S_KART_FAST2_L]))) + { + P_SetPlayerMobjState(player->mo, S_KART_FAST2_L); + } + else if ((turndir == 0) + && (!spinningwheels || !(player->mo->state >= &states[S_KART_FAST1] && player->mo->state <= &states[S_KART_FAST2]))) + { + P_SetPlayerMobjState(player->mo, S_KART_FAST2); + } } } else { - // Slowing down... - if ((turndir == -1) - && !(player->mo->state >= &states[S_KART_SLOW1_R] && player->mo->state <= &states[S_KART_SLOW2_R])) + if (player->kartstuff[k_drift] > 0) { - P_SetPlayerMobjState(player->mo, S_KART_SLOW1_R); + // Drifting LEFT! + + if ((turndir == -1) + && !(player->mo->state >= &states[S_KART_DRIFT1_L_OUT] && player->mo->state <= &states[S_KART_DRIFT2_L_OUT])) + { + // Right -- outwards drift + P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_L_OUT); + } + else if ((turndir == 1) + && !(player->mo->state >= &states[S_KART_DRIFT1_L_IN] && player->mo->state <= &states[S_KART_DRIFT4_L_IN])) + { + // Left -- inwards drift + P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_L_IN); + } + else if ((turndir == 0) + && !(player->mo->state >= &states[S_KART_DRIFT1_L] && player->mo->state <= &states[S_KART_DRIFT2_L])) + { + // Neutral drift + P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_L); + } } - else if ((turndir == 1) - && !(player->mo->state >= &states[S_KART_SLOW1_L] && player->mo->state <= &states[S_KART_SLOW2_L])) + else if (player->kartstuff[k_drift] < 0) { - P_SetPlayerMobjState(player->mo, S_KART_SLOW1_L); + // Drifting RIGHT! + + if ((turndir == -1) + && !(player->mo->state >= &states[S_KART_DRIFT1_R_IN] && player->mo->state <= &states[S_KART_DRIFT4_R_IN])) + { + // Right -- inwards drift + P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_R_IN); + } + else if ((turndir == 1) + && !(player->mo->state >= &states[S_KART_DRIFT1_R_OUT] && player->mo->state <= &states[S_KART_DRIFT2_R_OUT])) + { + // Left -- outwards drift + P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_R_OUT); + } + else if ((turndir == 0) + && !(player->mo->state >= &states[S_KART_DRIFT1_R] && player->mo->state <= &states[S_KART_DRIFT2_R])) + { + // Neutral drift + P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_R); + } } - else if ((turndir == 0) - && !(player->mo->state >= &states[S_KART_SLOW1] && player->mo->state <= &states[S_KART_SLOW2])) + else { - P_SetPlayerMobjState(player->mo, S_KART_SLOW1); + if (player->speed >= fastspeed && player->speed >= (player->lastspeed - speedthreshold)) + { + // Going REAL fast! + + if ((turndir == -1) + && !(player->mo->state >= &states[S_KART_FAST1_R] && player->mo->state <= &states[S_KART_FAST2_R])) + { + P_SetPlayerMobjState(player->mo, S_KART_FAST1_R); + } + else if ((turndir == 1) + && !(player->mo->state >= &states[S_KART_FAST1_L] && player->mo->state <= &states[S_KART_FAST2_L])) + { + P_SetPlayerMobjState(player->mo, S_KART_FAST1_L); + } + else if ((turndir == 0) + && !(player->mo->state >= &states[S_KART_FAST1] && player->mo->state <= &states[S_KART_FAST2])) + { + P_SetPlayerMobjState(player->mo, S_KART_FAST1); + } + } + else + { + if (spinningwheels) + { + // Drivin' slow. + + if ((turndir == -1) + && !(player->mo->state >= &states[S_KART_SLOW1_R] && player->mo->state <= &states[S_KART_SLOW2_R])) + { + P_SetPlayerMobjState(player->mo, S_KART_SLOW1_R); + } + else if ((turndir == 1) + && !(player->mo->state >= &states[S_KART_SLOW1_L] && player->mo->state <= &states[S_KART_SLOW2_L])) + { + P_SetPlayerMobjState(player->mo, S_KART_SLOW1_L); + } + else if ((turndir == 0) + && !(player->mo->state >= &states[S_KART_SLOW1] && player->mo->state <= &states[S_KART_SLOW2])) + { + P_SetPlayerMobjState(player->mo, S_KART_SLOW1); + } + } + else + { + // Completely still. + + if ((turndir == -1) + && !(player->mo->state >= &states[S_KART_STILL1_R] && player->mo->state <= &states[S_KART_STILL2_R])) + { + P_SetPlayerMobjState(player->mo, S_KART_STILL1_R); + } + else if ((turndir == 1) + && !(player->mo->state >= &states[S_KART_STILL1_L] && player->mo->state <= &states[S_KART_STILL2_L])) + { + P_SetPlayerMobjState(player->mo, S_KART_STILL1_L); + } + else if ((turndir == 0) + && !(player->mo->state >= &states[S_KART_STILL1] && player->mo->state <= &states[S_KART_STILL2])) + { + P_SetPlayerMobjState(player->mo, S_KART_STILL1); + } + } + } } } diff --git a/src/p_user.c b/src/p_user.c index 0378a24fa..6a6125990 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -5906,10 +5906,6 @@ static void P_MovePlayer(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. - // If you are stopped and are still walking, stand still! - if (!player->mo->momx && !player->mo->momy && !player->mo->momz && player->panim == PA_WALK) - P_SetPlayerMobjState(player->mo, S_KART_STILL1); // SRB2kart - was S_PLAY_STND - //{ SRB2kart // Drifting sound From 4941d0ce0e0f01a3d97066c7970cf2123f741252 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 8 May 2020 21:43:19 -0400 Subject: [PATCH 09/21] Typo in comment --- src/info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index 18759d757..233bc4a0c 100644 --- a/src/info.c +++ b/src/info.c @@ -112,7 +112,7 @@ state_t states[NUMSTATES] = {SPR_PLAY, 10, 1, {NULL}, 0, 0, S_KART_SLOW2_L}, // S_KART_SLOW1_L K {SPR_PLAY, 7, 1, {NULL}, 0, 0, S_KART_SLOW1_L}, // S_KART_SLOW2_L H {SPR_PLAY, 11, 1, {NULL}, 0, 0, S_KART_SLOW2_R}, // S_KART_SLOW1_R L - {SPR_PLAY, 8, 1, {NULL}, 0, 0, S_KART_SLOW1_R}, // S_KART_SLOW1_R I + {SPR_PLAY, 8, 1, {NULL}, 0, 0, S_KART_SLOW1_R}, // S_KART_SLOW2_R I {SPR_PLAY, 0, 1, {NULL}, 0, 0, S_KART_FAST2}, // S_KART_FAST1 A {SPR_PLAY, 9, 1, {NULL}, 0, 0, S_KART_FAST1}, // S_KART_FAST2 J {SPR_PLAY, 2, 1, {NULL}, 0, 0, S_KART_FAST2_L}, // S_KART_FAST1_L C From 347b9bfc5c7bb765df977fe982aeea29a5e94662 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 10 May 2020 02:41:35 -0400 Subject: [PATCH 10/21] Low water gravity only applies going up --- src/p_mobj.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 1a7c562a7..676709e32 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1248,29 +1248,38 @@ fixed_t P_GetMobjGravity(mobj_t *mo) } // Less gravity underwater. - if (mo->eflags & MFE_UNDERWATER && !goopgravity) + if ((mo->eflags & MFE_UNDERWATER) && !goopgravity && mo->momz > 0) + { gravityadd = gravityadd/3; + } if (mo->player) { - //if ((mo->player->pflags & PF_GLIDING) - //|| (mo->player->charability == CA_FLY && (mo->player->powers[pw_tailsfly] - // || (mo->state >= &states[S_PLAY_SPC1] && mo->state <= &states[S_PLAY_SPC4])))) - // gravityadd = gravityadd/3; // less gravity while flying/gliding if (mo->player->climbing || (mo->player->pflags & PF_NIGHTSMODE)) + { return 0; + } if (!(mo->flags2 & MF2_OBJECTFLIP) != !(mo->player->powers[pw_gravityboots])) // negated to turn numeric into bool - would be double negated, but not needed if both would be { gravityadd = -gravityadd; mo->eflags ^= MFE_VERTICALFLIP; } + if (wasflip == !(mo->eflags & MFE_VERTICALFLIP)) // note!! == ! is not equivalent to != here - turns numeric into bool this way + { P_PlayerFlip(mo); + } + if (mo->player->kartstuff[k_pogospring]) + { gravityadd = (5*gravityadd)/2; + } + if (mo->player->kartstuff[k_waterskip]) + { gravityadd = (4*gravityadd)/3; + } } else { @@ -1278,10 +1287,15 @@ fixed_t P_GetMobjGravity(mobj_t *mo) if (mo->flags2 & MF2_OBJECTFLIP) { mo->eflags |= MFE_VERTICALFLIP; + if (mo->z + mo->height >= mo->ceilingz) + { gravityadd = 0; + } else if (gravityadd < 0) // Don't sink, only rise up - gravityadd *= -1; + { + gravityadd = -gravityadd; + } } else //Otherwise, sort through the other exceptions. { @@ -1316,7 +1330,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) } break; case MT_WATERDROP: - gravityadd >>= 1; + gravityadd /= 2; break; case MT_BANANA: case MT_EGGMANITEM: @@ -1341,7 +1355,9 @@ fixed_t P_GetMobjGravity(mobj_t *mo) // Goop has slower, reversed gravity if (goopgravity) + { gravityadd = -gravityadd/5; + } gravityadd = FixedMul(gravityadd, mo->scale); From 2d7113ac2cd34073e80dd06c822fc59a23f2cba2 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 10 May 2020 02:42:05 -0400 Subject: [PATCH 11/21] Ice physics when touching/underwater --- src/k_kart.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 2a672af13..b4fdc4fef 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7900,6 +7900,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) player->mo->friction += 1228; + if (player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER)) + player->mo->friction += 614; + // Wipeout slowdown if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow]) { From f11751bf8f32037af6927e0808678992096409e6 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 10 May 2020 03:18:41 -0400 Subject: [PATCH 12/21] Stronger turning while underwater --- src/k_kart.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index b4fdc4fef..63eedd917 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6745,6 +6745,11 @@ static INT16 K_GetKartDriftValue(player_t *player, fixed_t countersteer) basedrift += (basedrift / greasetics) * player->kartstuff[k_tiregrease]; } + if (player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER)) + { + countersteer = 3*countersteer/2; + } + return basedrift + (FixedMul(driftadjust * FRACUNIT, countersteer) / FRACUNIT); } @@ -6780,6 +6785,11 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) turnvalue = 5*turnvalue/4; } + if (player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER)) + { + turnvalue = 3*turnvalue/2; + } + turnvalue = FixedMul(turnvalue * FRACUNIT, weightadjust) / FRACUNIT; // Weight has a small effect on turning return turnvalue; From 393c63795402350a7b26dd080fab592a59e394c1 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 10 May 2020 03:19:21 -0400 Subject: [PATCH 13/21] Gravity is higher underwater when going down --- src/p_mobj.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 676709e32..a13112ae5 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1248,9 +1248,16 @@ fixed_t P_GetMobjGravity(mobj_t *mo) } // Less gravity underwater. - if ((mo->eflags & MFE_UNDERWATER) && !goopgravity && mo->momz > 0) + if ((mo->eflags & MFE_UNDERWATER) && !goopgravity) { - gravityadd = gravityadd/3; + if (mo->momz <= 0) + { + gravityadd = 4*gravityadd/3; + } + else + { + gravityadd = gravityadd/3; + } } if (mo->player) From 7f04e58665af4a09d97b79dbb1738ee3c07deb25 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 10 May 2020 19:28:36 -0400 Subject: [PATCH 14/21] Use shiny frame as outwards drift 1 --- src/info.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/info.c b/src/info.c index 233bc4a0c..803033237 100644 --- a/src/info.c +++ b/src/info.c @@ -121,7 +121,7 @@ state_t states[NUMSTATES] = {SPR_PLAY, 11, 1, {NULL}, 0, 0, S_KART_FAST1_R}, // S_KART_FAST2_R L {SPR_PLAY, 12, 1, {NULL}, 0, 0, S_KART_DRIFT2_L}, // S_KART_DRIFT1_L M {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_KART_DRIFT1_L}, // S_KART_DRIFT2_L N - {SPR_PLAY, 12, 1, {NULL}, 0, 0, S_KART_DRIFT2_L_OUT}, // S_KART_DRIFT1_L_OUT M + {SPR_PLAY, 12, 1, {NULL}, 0, 0, S_KART_DRIFT2_L_OUT}, // S_KART_DRIFT1_L_OUT N {SPR_PLAY, 14, 1, {NULL}, 0, 0, S_KART_DRIFT1_L_OUT}, // S_KART_DRIFT2_L_OUT O {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_KART_DRIFT2_L_IN}, // S_KART_DRIFT1_L_IN N {SPR_PLAY, 15, 1, {NULL}, 0, 0, S_KART_DRIFT3_L_IN}, // S_KART_DRIFT2_L_IN P @@ -129,7 +129,7 @@ state_t states[NUMSTATES] = {SPR_PLAY, 16, 1, {NULL}, 0, 0, S_KART_DRIFT1_L_IN}, // S_KART_DRIFT4_L_IN Q {SPR_PLAY, 17, 1, {NULL}, 0, 0, S_KART_DRIFT2_R}, // S_KART_DRIFT1_R R {SPR_PLAY, 18, 1, {NULL}, 0, 0, S_KART_DRIFT1_R}, // S_KART_DRIFT2_R S - {SPR_PLAY, 17, 1, {NULL}, 0, 0, S_KART_DRIFT2_R_OUT}, // S_KART_DRIFT1_R_OUT R + {SPR_PLAY, 17, 1, {NULL}, 0, 0, S_KART_DRIFT2_R_OUT}, // S_KART_DRIFT1_R_OUT S {SPR_PLAY, 19, 1, {NULL}, 0, 0, S_KART_DRIFT1_R_OUT}, // S_KART_DRIFT2_R_OUT T {SPR_PLAY, 18, 1, {NULL}, 0, 0, S_KART_DRIFT2_R_IN}, // S_KART_DRIFT1_R_IN S {SPR_PLAY, 20, 1, {NULL}, 0, 0, S_KART_DRIFT3_R_IN}, // S_KART_DRIFT2_R_IN U From ccc2d178170a8aea0090923a360d89e81d2dfaa9 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 10 May 2020 19:43:41 -0400 Subject: [PATCH 15/21] Actually do what the last commit said it would do :facepalm: --- src/info.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/info.c b/src/info.c index 803033237..989b1aa27 100644 --- a/src/info.c +++ b/src/info.c @@ -121,7 +121,7 @@ state_t states[NUMSTATES] = {SPR_PLAY, 11, 1, {NULL}, 0, 0, S_KART_FAST1_R}, // S_KART_FAST2_R L {SPR_PLAY, 12, 1, {NULL}, 0, 0, S_KART_DRIFT2_L}, // S_KART_DRIFT1_L M {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_KART_DRIFT1_L}, // S_KART_DRIFT2_L N - {SPR_PLAY, 12, 1, {NULL}, 0, 0, S_KART_DRIFT2_L_OUT}, // S_KART_DRIFT1_L_OUT N + {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_KART_DRIFT2_L_OUT}, // S_KART_DRIFT1_L_OUT N {SPR_PLAY, 14, 1, {NULL}, 0, 0, S_KART_DRIFT1_L_OUT}, // S_KART_DRIFT2_L_OUT O {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_KART_DRIFT2_L_IN}, // S_KART_DRIFT1_L_IN N {SPR_PLAY, 15, 1, {NULL}, 0, 0, S_KART_DRIFT3_L_IN}, // S_KART_DRIFT2_L_IN P @@ -129,7 +129,7 @@ state_t states[NUMSTATES] = {SPR_PLAY, 16, 1, {NULL}, 0, 0, S_KART_DRIFT1_L_IN}, // S_KART_DRIFT4_L_IN Q {SPR_PLAY, 17, 1, {NULL}, 0, 0, S_KART_DRIFT2_R}, // S_KART_DRIFT1_R R {SPR_PLAY, 18, 1, {NULL}, 0, 0, S_KART_DRIFT1_R}, // S_KART_DRIFT2_R S - {SPR_PLAY, 17, 1, {NULL}, 0, 0, S_KART_DRIFT2_R_OUT}, // S_KART_DRIFT1_R_OUT S + {SPR_PLAY, 18, 1, {NULL}, 0, 0, S_KART_DRIFT2_R_OUT}, // S_KART_DRIFT1_R_OUT S {SPR_PLAY, 19, 1, {NULL}, 0, 0, S_KART_DRIFT1_R_OUT}, // S_KART_DRIFT2_R_OUT T {SPR_PLAY, 18, 1, {NULL}, 0, 0, S_KART_DRIFT2_R_IN}, // S_KART_DRIFT1_R_IN S {SPR_PLAY, 20, 1, {NULL}, 0, 0, S_KART_DRIFT3_R_IN}, // S_KART_DRIFT2_R_IN U From 49ff331ac0f6b633fb923ca3ed16cbd20c12b12e Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sun, 14 Apr 2019 16:39:14 +0100 Subject: [PATCH 16/21] Detect infinite alias self-recursion mixed with other commands, such as in the case of `alias a "echo test; a"; a`. (Unfortunately, this does not work if "wait" is used instead of "echo", but oh well) (cherry picked from commit e501d9c6af6bb2feb381bcfc8956bcc5d6d2c608) --- src/command.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/command.c b/src/command.c index bd3a22432..95fd5ef46 100644 --- a/src/command.c +++ b/src/command.c @@ -543,10 +543,7 @@ static void COM_ExecuteString(char *ptext) if (!stricmp(com_argv[0], a->name)) { if (recursion > MAX_ALIAS_RECURSION) - { CONS_Alert(CONS_WARNING, M_GetText("Alias recursion cycle detected!\n")); - recursion = 0; - } else { char buf[1024]; @@ -578,8 +575,10 @@ static void COM_ExecuteString(char *ptext) } WRITESTRING(write, read); + // Monster Iestyn: keep track of how many levels of recursion we're in recursion++; COM_BufInsertText(buf); + recursion--; } return; } From 6e3a92ed52512622c177e4dc4a4205dbe311fbda Mon Sep 17 00:00:00 2001 From: James R Date: Wed, 13 May 2020 16:17:40 -0700 Subject: [PATCH 17/21] player.ping for the ping in milliseconds of the player --- src/lua_playerlib.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index d9766513b..356cdd329 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -17,6 +17,7 @@ #include "d_player.h" #include "g_game.h" #include "p_local.h" +#include "d_clisrv.h" #include "lua_script.h" #include "lua_libs.h" @@ -385,6 +386,8 @@ static int player_get(lua_State *L) else if (fastcmp(field,"fovadd")) lua_pushfixed(L, plr->fovadd); #endif + else if (fastcmp(field,"ping")) + lua_pushinteger(L, playerpingtable[( plr - players )]); else { lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); From e502397a98077ca975cc10693efe5c30563ad34b Mon Sep 17 00:00:00 2001 From: Snu Date: Thu, 14 May 2020 03:13:00 +0100 Subject: [PATCH 18/21] add targets to MT_FASTLINEs spawned to tell what they're spawned from --- src/k_kart.c | 1 + src/p_enemy.c | 1 + 2 files changed, 2 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index cc5504bb4..02f34ce4e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4486,6 +4486,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->mo->y + (P_RandomRange(-36,36) * player->mo->scale), player->mo->z + (player->mo->height/2) + (P_RandomRange(-20,20) * player->mo->scale), MT_FASTLINE); + fast->target = player.mo; // makes it easier to link it back to afterwards fast->angle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); fast->momx = 3*player->mo->momx/4; fast->momy = 3*player->mo->momy/4; diff --git a/src/p_enemy.c b/src/p_enemy.c index a3bf5491b..e34686be3 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8511,6 +8511,7 @@ void A_SPBChase(mobj_t *actor) actor->y + (P_RandomRange(-24,24) * actor->scale), actor->z + (actor->height/2) + (P_RandomRange(-24,24) * actor->scale), MT_FASTLINE); + fast->target = actor; // makes it easier to link it back to afterwards fast->angle = R_PointToAngle2(0, 0, actor->momx, actor->momy); //fast->momx = (3*actor->momx)/4; //fast->momy = (3*actor->momy)/4; From d40b5dd73ee517ffe9a6c2fef437b061e2c3afa5 Mon Sep 17 00:00:00 2001 From: Snu Date: Thu, 14 May 2020 03:23:28 +0100 Subject: [PATCH 19/21] god damnit --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 02f34ce4e..e90092a9c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4486,7 +4486,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->mo->y + (P_RandomRange(-36,36) * player->mo->scale), player->mo->z + (player->mo->height/2) + (P_RandomRange(-20,20) * player->mo->scale), MT_FASTLINE); - fast->target = player.mo; // makes it easier to link it back to afterwards + fast->target = player->mo; // makes it easier to link it back to afterwards fast->angle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); fast->momx = 3*player->mo->momx/4; fast->momy = 3*player->mo->momy/4; From 9dda3a2edf4e849dfb8f67cc56212be88e1eb6b4 Mon Sep 17 00:00:00 2001 From: Snu Date: Thu, 14 May 2020 04:17:24 +0100 Subject: [PATCH 20/21] Use P_SetTarget instead of fast->target --- src/k_kart.c | 2 +- src/p_enemy.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index e90092a9c..7ac35cd31 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4486,11 +4486,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->mo->y + (P_RandomRange(-36,36) * player->mo->scale), player->mo->z + (player->mo->height/2) + (P_RandomRange(-20,20) * player->mo->scale), MT_FASTLINE); - fast->target = player->mo; // makes it easier to link it back to afterwards fast->angle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); fast->momx = 3*player->mo->momx/4; fast->momy = 3*player->mo->momy/4; fast->momz = 3*player->mo->momz/4; + P_SetTarget(&fast->target, player->mo); // easier lua access K_MatchGenericExtraFlags(fast, player->mo); } diff --git a/src/p_enemy.c b/src/p_enemy.c index e34686be3..2693c8ccb 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8511,13 +8511,13 @@ void A_SPBChase(mobj_t *actor) actor->y + (P_RandomRange(-24,24) * actor->scale), actor->z + (actor->height/2) + (P_RandomRange(-24,24) * actor->scale), MT_FASTLINE); - fast->target = actor; // makes it easier to link it back to afterwards fast->angle = R_PointToAngle2(0, 0, actor->momx, actor->momy); //fast->momx = (3*actor->momx)/4; //fast->momy = (3*actor->momy)/4; //fast->momz = (3*actor->momz)/4; fast->color = SKINCOLOR_RED; fast->colorized = true; + P_SetTarget(&fast->target, actor); // easier lua access K_MatchGenericExtraFlags(fast, actor); } From b51f206c1cb5fb3c0d5f9d93684cebc68502197a Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Thu, 14 May 2020 18:45:54 -0400 Subject: [PATCH 21/21] Support antigrav --- src/p_mobj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index a13112ae5..03875975f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1250,7 +1250,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) // Less gravity underwater. if ((mo->eflags & MFE_UNDERWATER) && !goopgravity) { - if (mo->momz <= 0) + if (mo->momz * P_MobjFlip(mo) <= 0) { gravityadd = 4*gravityadd/3; }