From 8742a55077faee7975881082e196e03ae1448516 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 3 Nov 2022 05:44:33 -0700 Subject: [PATCH 1/9] Add cv_palette and cv_palettenum Cheats; override the current palette --- src/d_netcmd.c | 3 +++ src/p_setup.c | 2 +- src/v_video.c | 54 +++++++++++++++++++++++++++++++++++++------------- src/v_video.h | 3 ++- 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 51d205931..a3213489b 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -986,6 +986,9 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_bsaturation); CV_RegisterVar(&cv_msaturation); + CV_RegisterVar(&cv_palette); + CV_RegisterVar(&cv_palettenum); + // k_menu.c //CV_RegisterVar(&cv_compactscoreboard); CV_RegisterVar(&cv_chatheight); diff --git a/src/p_setup.c b/src/p_setup.c index 3de23a0d1..5bbdb53ab 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -7350,7 +7350,7 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate) // Reset the palette now all fades have been done if (rendermode != render_none) - V_SetPaletteLump(GetPalette()); // Set the level palette + V_ReloadPalette(); // Set the level palette if (!(reloadinggamestate || titlemapinaction)) { diff --git a/src/v_video.c b/src/v_video.c index 0e85bf2fa..2636b9a6e 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -86,11 +86,16 @@ static CV_PossibleValue_t constextsize_cons_t[] = { static void CV_constextsize_OnChange(void); consvar_t cv_constextsize = CVAR_INIT ("con_textsize", "Medium", CV_SAVE|CV_CALL, constextsize_cons_t, CV_constextsize_OnChange); +consvar_t cv_palette = CVAR_INIT ("palette", "", CV_CHEAT|CV_CALL|CV_NOINIT, NULL, CV_palette_OnChange); +consvar_t cv_palettenum = CVAR_INIT ("palettenum", "0", CV_CHEAT|CV_CALL|CV_NOINIT, CV_Unsigned, CV_palette_OnChange); + // local copy of the palette for V_GetColor() RGBA_t *pLocalPalette = NULL; RGBA_t *pMasterPalette = NULL; RGBA_t *pGammaCorrectedPalette = NULL; +static size_t currentPaletteSize; + /* The following was an extremely helpful resource when developing my Colour Cube LUT. http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter24.html @@ -311,9 +316,12 @@ UINT32 V_GammaCorrect(UINT32 input, double power) static void LoadPalette(const char *lumpname) { lumpnum_t lumpnum = W_GetNumForName(lumpname); - size_t i, palsize = W_LumpLength(lumpnum)/3; + size_t i, palsize; UINT8 *pal; + currentPaletteSize = W_LumpLength(lumpnum); + palsize = currentPaletteSize / 3; + Cubeapply = InitCube(); if (pLocalPalette != pMasterPalette) @@ -400,8 +408,24 @@ const char *R_GetPalname(UINT16 num) const char *GetPalette(void) { + const char *user = cv_palette.string; + + if (user && user[0]) + { + if (W_CheckNumForName(user) == LUMPERROR) + { + CONS_Alert(CONS_WARNING, + "cv_palette %s lump does not exist\n", user); + } + else + { + return cv_palette.string; + } + } + if (gamestate == GS_LEVEL) return R_GetPalname((encoremode ? mapheaderinfo[gamemap-1]->encorepal : mapheaderinfo[gamemap-1]->palette)); + return "PLAYPAL"; } @@ -419,6 +443,19 @@ void V_SetPalette(INT32 palettenum) if (!pLocalPalette) V_ReloadPalette(); + if (palettenum == 0) + { + palettenum = cv_palettenum.value; + + if (palettenum * 256U > currentPaletteSize - 256) + { + CONS_Alert(CONS_WARNING, + "cv_palettenum %d out of range\n", + palettenum); + palettenum = 0; + } + } + #ifdef HWRENDER if (rendermode == render_opengl) HWR_SetPalette(&pLocalPalette[palettenum*256]); @@ -433,23 +470,12 @@ void V_SetPalette(INT32 palettenum) void V_SetPaletteLump(const char *pal) { LoadPalette(pal); -#ifdef HWRENDER - if (rendermode == render_opengl) - HWR_SetPalette(pLocalPalette); -#if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) - else -#endif -#endif - if (rendermode != render_none) - I_SetPalette(pLocalPalette); -#ifdef HASINVERT - R_MakeInvertmap(); -#endif + V_SetPalette(0); } static void CV_palette_OnChange(void) { - // reload palette + // recalculate Color Cube V_ReloadPalette(); V_SetPalette(0); } diff --git a/src/v_video.h b/src/v_video.h index 35be68b2f..34800e7b4 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -34,7 +34,8 @@ extern consvar_t cv_ticrate, cv_constextsize, cv_globalgamma, cv_globalsaturation, cv_rhue, cv_yhue, cv_ghue, cv_chue, cv_bhue, cv_mhue, cv_rgamma, cv_ygamma, cv_ggamma, cv_cgamma, cv_bgamma, cv_mgamma, -cv_rsaturation, cv_ysaturation, cv_gsaturation, cv_csaturation, cv_bsaturation, cv_msaturation; +cv_rsaturation, cv_ysaturation, cv_gsaturation, cv_csaturation, cv_bsaturation, cv_msaturation, +cv_palette, cv_palettenum; // Allocates buffer screens, call before R_Init. void V_Init(void); From a6e87ae82cdcb23ce604545cd4e3b7f045cb76ad Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 3 Nov 2022 05:46:22 -0700 Subject: [PATCH 2/9] Let toggle command multiple choice mode work on cvars lacking PossibleValue array --- src/command.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/command.c b/src/command.c index a66522186..eb1204108 100644 --- a/src/command.c +++ b/src/command.c @@ -1080,9 +1080,10 @@ static void COM_Toggle_f(void) for (i = 2; i < COM_Argc() - 1; ++i) { const char *str = COM_Argv(i); - INT32 val; + INT32 val = 0; - if (CV_CompleteValue(cvar, &str, &val)) + if (!cvar->PossibleValue || + CV_CompleteValue(cvar, &str, &val)) { if (str ? !stricmp(cvar->string, str) : cvar->value == val) From 7b2918ae634fd74be426dafe028e31a2691d6e76 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 3 Nov 2022 05:51:39 -0700 Subject: [PATCH 3/9] Add grayscale command, toggles GRAYPAL palette override --- src/d_netcmd.c | 1 + src/m_cheat.c | 7 +++++++ src/m_cheat.h | 1 + 3 files changed, 9 insertions(+) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index a3213489b..f19c0f2fc 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -1092,6 +1092,7 @@ void D_RegisterClientCommands(void) COM_AddCommand("rteleport", Command_RTeleport_f); COM_AddCommand("skynum", Command_Skynum_f); COM_AddCommand("weather", Command_Weather_f); + COM_AddCommand("grayscale", Command_Grayscale_f); #ifdef _DEBUG COM_AddCommand("causecfail", Command_CauseCfail_f); #endif diff --git a/src/m_cheat.c b/src/m_cheat.c index 9614c9b60..be4f231e1 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -762,6 +762,13 @@ void Command_Setlives_f(void) D_Cheat(consoleplayer, CHEAT_LIVES, atoi(COM_Argv(1))); } +void Command_Grayscale_f(void) +{ + REQUIRE_CHEATS; + + COM_ImmedExecute("toggle palette \"\" GRAYPAL"); +} + // // OBJECTPLACE (and related variables) // diff --git a/src/m_cheat.h b/src/m_cheat.h index 4d97cb8d9..c952721c3 100644 --- a/src/m_cheat.h +++ b/src/m_cheat.h @@ -75,6 +75,7 @@ void Command_Teleport_f(void); void Command_RTeleport_f(void); void Command_Skynum_f(void); void Command_Weather_f(void); +void Command_Grayscale_f(void); #ifdef _DEBUG void Command_CauseCfail_f(void); #endif From 8dbac697cad072b0d62a60068a737ec055dd2b95 Mon Sep 17 00:00:00 2001 From: SteelT Date: Thu, 3 Nov 2022 22:07:09 -0400 Subject: [PATCH 4/9] Add backdrop for paper items Capsules are unaffected as it has it's own object that shares the sprite of the items. --- src/deh_tables.c | 1 + src/info.c | 2 ++ src/info.h | 2 ++ src/k_kart.c | 7 ++++++- 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 2f68edf2c..383823833 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3271,6 +3271,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_ITEM_DEBRIS_CLOUD_SPAWNER2", "S_ITEMICON", + "S_ITEMBACKDROP", // Item capsules "S_ITEMCAPSULE", diff --git a/src/info.c b/src/info.c index b1f4bc1be..266787230 100644 --- a/src/info.c +++ b/src/info.c @@ -531,6 +531,7 @@ char sprnames[NUMSPRITES + 1][5] = "SBOX", // Sphere Box (for Battle) "RPOP", // Random Item Box Pop "ITRI", // Item Box Debris + "ITPA", // Paper item backdrop "SGNS", // Signpost sparkle "FAST", // Speed boost trail "DSHR", // Speed boost dust release @@ -3879,6 +3880,7 @@ state_t states[NUMSTATES] = {SPR_NULL, 0, 7, {A_SpawnItemDebrisCloud}, 20, 0, S_ITEM_DEBRIS_CLOUD_SPAWNER1}, // S_ITEM_DEBRIS_CLOUD_SPAWNER2 {SPR_NULL, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_ITEMICON + {SPR_ITPA, FF_FULLBRIGHT, -1, {NULL}, 1, 0, S_NULL}, // S_ITEMBACKDROP {SPR_ICAP, FF_ADD|0, -1, {NULL}, 0, 0, S_NULL}, // S_ITEMCAPSULE {SPR_ICAP, FF_PAPERSPRITE|1, -1, {NULL}, 0, 0, S_NULL}, // S_ITEMCAPSULE_TOP_SIDE diff --git a/src/info.h b/src/info.h index 176705a41..408d85832 100644 --- a/src/info.h +++ b/src/info.h @@ -1077,6 +1077,7 @@ typedef enum sprite SPR_SBOX, // Sphere Box (for Battle) SPR_RPOP, // Random Item Box Pop SPR_ITRI, // Item Box Debris + SPR_ITPA, // Paper item backdrop SPR_SGNS, // Signpost sparkle SPR_FAST, // Speed boost trail SPR_DSHR, // Speed boost dust release @@ -4282,6 +4283,7 @@ typedef enum state S_ITEM_DEBRIS_CLOUD_SPAWNER2, S_ITEMICON, + S_ITEMBACKDROP, // Item capsules S_ITEMCAPSULE, diff --git a/src/k_kart.c b/src/k_kart.c index dff8c406a..d41851144 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6924,9 +6924,14 @@ void K_DropHnextList(player_t *player, boolean keepshields) mobj_t *K_CreatePaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 flip, UINT8 type, UINT8 amount) { mobj_t *drop = P_SpawnMobj(x, y, z, MT_FLOATINGITEM); + mobj_t *backdrop = P_SpawnMobjFromMobj(drop, 0, 0, 0, MT_OVERLAY); + + P_SetTarget(&backdrop->target, drop); + P_SetMobjState(backdrop, S_ITEMBACKDROP); + P_SetScale(drop, drop->scale>>4); drop->destscale = (3*drop->destscale)/2; - + drop->angle = angle; P_Thrust(drop, FixedAngle(P_RandomFixed(PR_ITEM_ROULETTE) * 180) + angle, From 701b345f3981d957596d89c0267e4c4d198eb4cf Mon Sep 17 00:00:00 2001 From: SteelT Date: Thu, 3 Nov 2022 23:11:51 -0400 Subject: [PATCH 5/9] Fix sprite clipping in OpenGL --- src/k_kart.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index d41851144..583639b9c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7007,6 +7007,9 @@ mobj_t *K_CreatePaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 } drop->flags |= MF_NOCLIPTHING; + backdrop->dispoffset = 1; + P_SetTarget(&backdrop->tracer, drop); + backdrop->flags2 |= MF2_LINKDRAW; return drop; } From 8f628ccd7d66ca871844d29b8ca655c670bab02a Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Thu, 3 Nov 2022 22:01:11 -0700 Subject: [PATCH 6/9] Fix invinc, scale difference, and hyu not blocking explosions --- src/p_inter.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index da54636fb..8f439ff89 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1997,9 +1997,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da // Check if the player is allowed to be damaged! // If not, then spawn the instashield effect instead. - // NB: "allowcombo", "hardhit" and related checks are here to disallow HITLAG COMBOS, not loss-of-control combos - // DMG_EXPLODE bypasses this check to prevent blocking eggbox/SPB with spinout flashtics - if (!force && (type != DMG_EXPLODE)) + if (!force) { if (gametyperules & GTR_BUMPERS) { @@ -2039,7 +2037,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da allowcombo = false; } - if ((target->hitlag == 0 || allowcombo == false) && player->flashing > 0) + // DMG_EXPLODE excluded from flashtic checks to prevent dodging eggbox/SPB with weak spinout + if ((target->hitlag == 0 || allowcombo == false) && player->flashing > 0 && type != DMG_EXPLODE) { // Post-hit invincibility K_DoInstashield(player); From 84a5e28302529de30be4fc242f0dc7135280f28e Mon Sep 17 00:00:00 2001 From: SteelT Date: Fri, 4 Nov 2022 11:19:27 -0400 Subject: [PATCH 7/9] Don't match slope pitch and roll for MT_FLOATINGITEM (per VC discussion) --- src/p_mobj.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_mobj.c b/src/p_mobj.c index bdf0064f0..76c1de31a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6786,6 +6786,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) break; case MT_FLOATINGITEM: { + mobj->pitch = mobj->roll = 0; if (mobj->flags & MF_NOCLIPTHING) { if (P_CheckDeathPitCollide(mobj)) From 9a009cab1855a292f8fe033afa65ca915ec5676a Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 6 Nov 2022 15:23:18 -0500 Subject: [PATCH 8/9] Overlays use dispoffset instead of position hack --- src/p_mobj.c | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index c1de9d6ce..366be896d 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5257,27 +5257,8 @@ void P_RunOverlays(void) continue; } - if (!r_splitscreen /*&& rendermode != render_soft*/) - { - angle_t viewingangle; - - if (players[displayplayers[0]].awayviewtics) - viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, players[displayplayers[0]].awayviewmobj->x, players[displayplayers[0]].awayviewmobj->y); - else if (!camera[0].chase && players[displayplayers[0]].mo) - viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, players[displayplayers[0]].mo->x, players[displayplayers[0]].mo->y); - else - viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, camera[0].x, camera[0].y); - - if (!(mo->state->frame & FF_ANIMATE) && mo->state->var1) - viewingangle += ANGLE_180; - destx = mo->target->x + P_ReturnThrustX(mo->target, viewingangle, FixedMul(FRACUNIT/4, mo->scale)); - desty = mo->target->y + P_ReturnThrustY(mo->target, viewingangle, FixedMul(FRACUNIT/4, mo->scale)); - } - else - { - destx = mo->target->x; - desty = mo->target->y; - } + destx = mo->target->x; + desty = mo->target->y; mo->eflags = (mo->eflags & ~MFE_VERTICALFLIP) | (mo->target->eflags & MFE_VERTICALFLIP); mo->scale = mo->destscale = FixedMul(mo->target->scale, mo->movefactor); @@ -5289,12 +5270,27 @@ void P_RunOverlays(void) if ((mo->flags & MF_DONTENCOREMAP) != (mo->target->flags & MF_DONTENCOREMAP)) mo->flags ^= MF_DONTENCOREMAP; + mo->dispoffset = mo->target->dispoffset + mo->info->dispoffset; + if (!(mo->state->frame & FF_ANIMATE)) + { zoffs = FixedMul(((signed)mo->state->var2)*FRACUNIT, mo->scale); - // if you're using FF_ANIMATE on an overlay, - // then you're on your own. + + if (mo->state->var1) + { + mo->dispoffset--; + } + else + { + mo->dispoffset++; + } + } else + { + // if you're using FF_ANIMATE on an overlay, + // then you're on your own. zoffs = 0; + } P_UnsetThingPosition(mo); mo->x = destx; From c216cc6988386d31262c569696fd7394a5a0623d Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 7 Nov 2022 20:30:14 -0800 Subject: [PATCH 9/9] Fix buffer overflow when pasting into chat --- src/hu_stuff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 63d093ae1..5d73ecda6 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -1251,7 +1251,7 @@ boolean HU_Responder(event_t *ev) if (chatlen+pastelen > HU_MAXMSGLEN) return true; // we can't paste this!! - memmove(&w_chat[c_input + pastelen], &w_chat[c_input], pastelen); + memmove(&w_chat[c_input + pastelen], &w_chat[c_input], (chatlen - c_input) + 1); // +1 for '\0' memcpy(&w_chat[c_input], paste, pastelen); // copy all of that. c_input += pastelen; return true;