From 81c73032e48c23188d50c080670f296f939f12b2 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Fri, 11 Jan 2019 20:45:59 -0600 Subject: [PATCH 01/59] Fix rendering gaps on polys with upper/lower textures --- src/r_segs.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/r_segs.c b/src/r_segs.c index 6d6ba1efd..748365264 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -3063,8 +3063,9 @@ void R_StoreWallRange(INT32 start, INT32 stop) else markceiling = false; - // Don't render the ceiling again when rendering polyobjects - if (curline->polyseg) + // Don't mark ceiling flat lines for polys unless this line has an upper texture, otherwise we get flat leakage pulling downward + // (If it DOES have an upper texture and we do this, the ceiling won't render at all) + if (curline->polyseg && !curline->sidedef->toptexture) markceiling = false; } @@ -3076,8 +3077,9 @@ void R_StoreWallRange(INT32 start, INT32 stop) else markfloor = false; - // Don't render the floor again when rendering polyobjects - if (curline->polyseg) + // Don't mark floor flat lines for polys unless this line has a lower texture, otherwise we get flat leakage pulling upward + // (If it DOES have a lower texture and we do this, the floor won't render at all) + if (curline->polyseg && !curline->sidedef->bottomtexture) markfloor = false; } From cd53f3da1fccf9f3199c3be6bcf8e8287ba4cf39 Mon Sep 17 00:00:00 2001 From: toaster Date: Wed, 6 Feb 2019 13:28:21 +0000 Subject: [PATCH 02/59] Fix off-by-one errors in item odds, and add a little assert to make an assumption in this function that was being violated more explicit. --- src/k_kart.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 49fd54e61..018519ca6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -616,7 +616,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) UINT8 pingame = 0, pexiting = 0, pinvin = 0; SINT8 first = -1, second = -1; INT32 secondist = 0; - boolean itemenabled[NUMKARTRESULTS] = { + boolean itemenabled[NUMKARTRESULTS-1] = { cv_sneaker.value, cv_rocketsneaker.value, cv_invincibility.value, @@ -640,7 +640,9 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) cv_dualjawz.value }; - if (!itemenabled[item] && !modeattacking) + I_Assert(item > KITEM_NONE); // too many off by one scenarioes. + + if (!itemenabled[item-1] && !modeattacking) return 0; if (G_BattleGametype()) @@ -761,7 +763,7 @@ static INT32 K_FindUseodds(player_t *player, fixed_t mashed, INT32 pingame, INT3 break; } - for (j = 0; j < NUMKARTRESULTS; j++) + for (j = 1; j < NUMKARTRESULTS; j++) { if (K_KartGetItemOdds(i, j, mashed) > 0) { From 66af5ce558b5f7257ace79959d0f7fb44c5ad834 Mon Sep 17 00:00:00 2001 From: james Date: Wed, 6 Feb 2019 17:24:13 -0800 Subject: [PATCH 03/59] Do not start sound system when disabled --- src/d_main.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 5cf95f4b8..28f89f4f0 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1325,10 +1325,6 @@ void D_SRB2Main(void) midi_disabled = true; #endif } - else - { - CONS_Printf("S_InitSfxChannels(): Setting up sound channels.\n"); - } if (M_CheckParm("-nosound")) sound_disabled = true; if (M_CheckParm("-nomusic")) // combines -nomidimusic and -nodigmusic @@ -1347,10 +1343,18 @@ void D_SRB2Main(void) if (M_CheckParm("-nodigmusic")) digital_disabled = true; // WARNING: DOS version initmusic in I_StartupSound } - I_StartupSound(); - I_InitMusic(); - S_InitSfxChannels(cv_soundvolume.value); - S_InitMusicDefs(); + if (!( sound_disabled && digital_disabled +#ifndef NO_MIDI + && midi_disabled +#endif + )) + { + CONS_Printf("S_InitSfxChannels(): Setting up sound channels.\n"); + I_StartupSound(); + I_InitMusic(); + S_InitSfxChannels(cv_soundvolume.value); + S_InitMusicDefs(); + } CONS_Printf("ST_Init(): Init status bar.\n"); ST_Init(); From f6381c6f00e70ff2c26e5f779f1f02c6d576493b Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 9 Feb 2019 09:58:48 +0000 Subject: [PATCH 04/59] Fix NONET. I thought I did this already during development, but I guess it got broken near the end. --- src/d_clisrv.c | 2 ++ src/m_menu.c | 17 +++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 961c1e594..7516df2e0 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2211,8 +2211,10 @@ static void CL_ConnectToServer(boolean viams) } while (!(cl_mode == CL_CONNECTED && (client || (server && nodewaited <= pnumnodes)))); +#ifndef NONET if (netgame) F_StartWaitingPlayers(); +#endif DEBFILE(va("Synchronisation Finished\n")); displayplayer = consoleplayer; diff --git a/src/m_menu.c b/src/m_menu.c index d8b1c2d7b..0e37765b2 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1830,7 +1830,6 @@ static menu_t SP_NightsGhostDef = NULL };*/ -#ifndef NONET // Multiplayer menu_t MP_MainDef = { @@ -1841,12 +1840,18 @@ menu_t MP_MainDef = M_DrawMPMainMenu, 42, 30, 0, - M_CancelConnect -}; -menu_t MP_ServerDef = MAPICONMENUSTYLE("M_MULTI", MP_ServerMenu, &MP_MainDef); -#endif -menu_t MP_OfflineServerDef = MAPICONMENUSTYLE("M_MULTI", MP_OfflineServerMenu, &MP_MainDef); #ifndef NONET + M_CancelConnect +#else + NULL +#endif +}; + +menu_t MP_OfflineServerDef = MAPICONMENUSTYLE("M_MULTI", MP_OfflineServerMenu, &MP_MainDef); + +#ifndef NONET +menu_t MP_ServerDef = MAPICONMENUSTYLE("M_MULTI", MP_ServerMenu, &MP_MainDef); + menu_t MP_ConnectDef = { "M_MULTI", From ae3bb592b96003efa9a95f2bac37440f87f2e642 Mon Sep 17 00:00:00 2001 From: james Date: Sat, 9 Feb 2019 18:10:54 -0800 Subject: [PATCH 05/59] Use less confusing player sorting key names --- src/m_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_menu.c b/src/m_menu.c index d8b1c2d7b..77bfb2c4c 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -438,7 +438,7 @@ static CV_PossibleValue_t serversort_cons_t[] = { {1,"Modified State"}, {2,"Most Players"}, {3,"Least Players"}, - {4,"Max Players"}, + {4,"Max Player Slots"}, {5,"Gametype"}, {0,NULL} }; From 87d749b43d9f00b4ba4991f5fcb97c7b194daad0 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Sun, 10 Feb 2019 22:55:27 -0600 Subject: [PATCH 06/59] Fix drift sparks not generating on offroad with Hyudoro, Invincibility, or sneaker boosts --- 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 49fd54e61..3c9b082b5 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4708,7 +4708,7 @@ static void K_KartDrift(player_t *player, boolean onground) } // Disable drift-sparks until you're going fast enough - if (player->kartstuff[k_getsparks] == 0 || player->kartstuff[k_offroad]) + if (player->kartstuff[k_getsparks] == 0 || (player->kartstuff[k_offroad] && !player->kartstuff[k_invincibilitytimer] && !player->kartstuff[k_hyudorotimer] && !player->kartstuff[k_sneakertimer])) driftadditive = 0; if (player->speed > minspeed*2) player->kartstuff[k_getsparks] = 1; From ad8e7d8c3c89988ca6e409aae3cdb7913999bc66 Mon Sep 17 00:00:00 2001 From: james Date: Sun, 10 Feb 2019 23:40:51 -0800 Subject: [PATCH 07/59] Support aPNG in new versions of libpng A known issue: iTXt cannot be written (yet). I may do something about that. For now, this is likely good enough. Who cares about the extra text anyway? --- src/Makefile | 2 + src/apng.c | 264 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/apng.h | 69 ++++++++++++++ src/m_misc.c | 123 +++++++++--------------- 4 files changed, 380 insertions(+), 78 deletions(-) create mode 100644 src/apng.c create mode 100644 src/apng.h diff --git a/src/Makefile b/src/Makefile index 6c686c2d9..b84a06a49 100644 --- a/src/Makefile +++ b/src/Makefile @@ -341,6 +341,8 @@ endif LIBS+=$(PNG_LDFLAGS) CFLAGS+=$(PNG_CFLAGS) + +OBJS+=$(OBJDIR)/apng.o endif ifdef HAVE_LIBGME diff --git a/src/apng.c b/src/apng.c new file mode 100644 index 000000000..742de77f6 --- /dev/null +++ b/src/apng.c @@ -0,0 +1,264 @@ +/* +Copyright 2018, James R. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include + +#include "apng.h" + +#define APNG_WROTE_acTL 0x10000U + +struct apng_info_def +{ + png_uint_32 mode; + png_uint_32 valid; + + png_uint_32 num_frames; + png_uint_32 num_plays; + + long start_acTL;/* acTL is written here */ + + png_flush_ptr output_flush_fn; + apng_seek_ptr output_seek_fn; + apng_tell_ptr output_tell_fn; + + apng_set_acTL_ptr set_acTL_fn; +}; + +/* PROTOS (FUCK COMPILER) */ +void apng_seek (png_structrp, apng_const_inforp, size_t); +size_t apng_tell (png_structrp, apng_const_inforp); +#ifdef PNG_WRITE_FLUSH_SUPPORTED +void apng_flush (png_structrp, apng_inforp); +#ifdef PNG_STDIO_SUPPORTED +void apng_default_flush (png_structrp); +#endif/* PNG_STDIO_SUPPORTED */ +#endif/* PNG_WRITE_FLUSH_SUPPORTED */ +#ifdef PNG_STDIO_SUPPORTED +void apng_default_seek (png_structrp, size_t); +size_t apng_default_tell (png_structrp); +#endif/* PNG_STDIO_SUPPORTED */ +void apng_write_IEND (png_structrp); +void apng_write_acTL (png_structrp, png_uint_32, png_uint_32); + +apng_infop +apng_create_info_struct (png_structrp pngp) +{ + apng_infop ainfop; + (void)pngp; + if (( ainfop = calloc(sizeof (apng_info),1) )) + { + apng_set_write_fn(pngp, ainfop, 0, 0, 0, 0, 0); + apng_set_set_acTL_fn(pngp, ainfop, 0); + } + return ainfop; +} + +void +apng_destroy_info_struct (png_structrp pngp, apng_infopp ainfopp) +{ + (void)pngp; + if (!( pngp && ainfopp )) + return; + + free((*ainfopp)); +} + +void +apng_seek (png_structrp pngp, apng_const_inforp ainfop, size_t l) +{ + (*(ainfop->output_seek_fn))(pngp, l); +} + +size_t +apng_tell (png_structrp pngp, apng_const_inforp ainfop) +{ + return (*(ainfop->output_tell_fn))(pngp); +} + +#ifdef PNG_WRITE_FLUSH_SUPPORTED +void +apng_flush (png_structrp pngp, apng_inforp ainfop) +{ + if (ainfop->output_flush_fn) + (*(ainfop->output_flush_fn))(pngp); +} + +#ifdef PNG_STDIO_SUPPORTED +void +apng_default_flush (png_structrp pngp) +{ + if (!( pngp )) + return; + + fflush((png_FILE_p)png_get_io_ptr); +} +#endif/* PNG_STDIO_SUPPORTED */ +#endif/* PNG_WRITE_FLUSH_SUPPORTED */ + +#ifdef PNG_STDIO_SUPPORTED +void +apng_default_seek (png_structrp pngp, size_t l) +{ + if (!( pngp )) + return; + + if (fseek((png_FILE_p)png_get_io_ptr(pngp), (long)l, SEEK_SET) == -1) + png_error(pngp, "Seek Error"); +} + +size_t +apng_default_tell (png_structrp pngp) +{ + long l; + + if (!( pngp )) + { + png_error(pngp, "Call to apng_default_tell with NULL pngp failed"); + } + + if (( l = ftell((png_FILE_p)png_get_io_ptr(pngp)) ) == -1) + png_error(pngp, "Tell Error"); + + return (size_t)l; +} +#endif/* PNG_STDIO_SUPPORTED */ + +void +apng_set_write_fn (png_structrp pngp, apng_inforp ainfop, png_voidp iop, + png_rw_ptr write_f, png_flush_ptr flush_f, + apng_seek_ptr seek_f, apng_tell_ptr tell_f) +{ + if (!( pngp && ainfop )) + return; + + png_set_write_fn(pngp, iop, write_f, flush_f); + +#ifdef PNG_WRITE_FLUSH_SUPPORTED +#ifdef PNG_STDIO_SUPPORTED + if (!flush_f) + ainfop->output_flush_fn = &apng_default_flush; + else +#endif/* PNG_STDIO_SUPPORTED */ + ainfop->output_flush_fn = flush_f; +#endif/* PNG_WRITE_FLUSH_SUPPORTED */ +#ifdef PNG_STDIO_SUPPORTED + if (!seek_f) + ainfop->output_seek_fn = &apng_default_seek; + else +#endif/* PNG_STDIO_SUPPORTED */ + ainfop->output_seek_fn = seek_f; +#ifdef PNG_STDIO_SUPPORTED + if (!seek_f) + ainfop->output_tell_fn = apng_default_tell; + else +#endif/* PNG_STDIO_SUPPORTED */ + ainfop->output_tell_fn = tell_f; +} + +void +apng_write_IEND (png_structrp pngp) +{ + png_write_chunk(pngp, (png_const_bytep)"IEND", 0, 0); +} + +void +apng_write_acTL (png_structrp pngp, png_uint_32 frames, png_uint_32 plays) +{ + png_byte buf[8]; + png_save_uint_32(buf, frames); + png_save_uint_32(buf + 4, plays); + png_write_chunk(pngp, (png_const_bytep)"acTL", buf, 8); +} + +png_uint_32 +apng_set_acTL (png_structp pngp, png_infop infop, apng_infop ainfop, + png_uint_32 frames, png_uint_32 plays) +{ + (void)pngp; + (void)infop; + if (!( pngp && infop && ainfop )) + return 0; + + ainfop->num_frames = frames; + ainfop->num_plays = plays; + + ainfop->valid |= PNG_INFO_acTL; + + return 1; +} + +void +apng_write_info_before_PLTE (png_structrp pngp, png_inforp infop, + apng_inforp ainfop) +{ + if (!( pngp && infop && ainfop )) + return; + + png_write_info_before_PLTE(pngp, infop); + + if (( ainfop->valid & PNG_INFO_acTL ) &&!( ainfop->mode & APNG_WROTE_acTL )) + { + ainfop->start_acTL = apng_tell(pngp, ainfop); + + apng_write_acTL(pngp, 0, 0); + /* modified for runtime dynamic linking */ + (*(ainfop->set_acTL_fn))(pngp, infop, PNG_UINT_31_MAX, 0); + + ainfop->mode |= APNG_WROTE_acTL; + } +} + +void +apng_write_info (png_structrp pngp, png_inforp infop, + apng_inforp ainfop) +{ + apng_write_info_before_PLTE(pngp, infop, ainfop); + png_write_info(pngp, infop); +} + +void +apng_write_end (png_structp pngp, png_inforp infop, apng_inforp ainfop) +{ + (void)infop; + apng_write_IEND(pngp); + apng_seek(pngp, ainfop, ainfop->start_acTL); + apng_write_acTL(pngp, ainfop->num_frames, ainfop->num_plays); + +#ifdef PNG_WRITE_FLUSH_SUPPORTED +#ifdef PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED + apng_flush(pngp, infop); +#endif/* PNG_WRITE_FLUSH_SUPPORTED */ +#endif/* PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED */ +} + +/* Dynamic runtime linking capable! (Hopefully.) */ +void +apng_set_set_acTL_fn (png_structrp pngp, apng_inforp ainfop, + apng_set_acTL_ptr set_acTL_f) +{ + (void)pngp; + if (!ainfop->set_acTL_fn) + ainfop->set_acTL_fn = &png_set_acTL; + else + ainfop->set_acTL_fn = set_acTL_f; +} diff --git a/src/apng.h b/src/apng.h new file mode 100644 index 000000000..b166c3cc3 --- /dev/null +++ b/src/apng.h @@ -0,0 +1,69 @@ +/* +Copyright 2018, James R. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef APNG_H +#define APNG_H + +#include + +typedef struct apng_info_def apng_info; +typedef apng_info * apng_infop; +typedef const apng_info * apng_const_infop; +typedef apng_info * * apng_infopp; + +typedef apng_info * PNG_RESTRICT apng_inforp; +typedef const apng_info * PNG_RESTRICT apng_const_inforp; + +typedef void (*apng_seek_ptr)(png_structrp, size_t); +typedef size_t (*apng_tell_ptr)(png_structrp); + +typedef png_uint_32 (*apng_set_acTL_ptr)(png_structrp, png_inforp, + png_uint_32, png_uint_32); + +apng_infop apng_create_info_struct (png_structrp png_ptr); + +void apng_destroy_info_struct (png_structrp png_ptr, + apng_infopp info_ptr_ptr); + +/* Call the following functions in place of the libpng counterparts. */ + +png_uint_32 apng_set_acTL (png_structp png_ptr, png_infop info_ptr, + apng_infop ainfo_ptr, + png_uint_32 num_frames, png_uint_32 num_plays); + +void apng_write_info_before_PLTE (png_structrp png_ptr, png_inforp info_ptr, + apng_inforp ainfo_ptr); +void apng_write_info (png_structrp png_ptr, png_inforp info_ptr, + apng_inforp ainfo_ptr); + +void apng_write_end (png_structrp png_ptr, png_inforp info_ptr, + apng_inforp ainfo_ptr); + +void apng_set_write_fn (png_structrp png_ptr, apng_inforp ainfo_ptr, + png_voidp io_ptr, + png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn, + apng_seek_ptr output_seek_fn, apng_tell_ptr output_tell_fn); + +void apng_set_set_acTL_fn (png_structrp png_ptr, apng_inforp ainfo_ptr, + apng_set_acTL_ptr set_acTL_fn); + +#endif/* APNG_H */ diff --git a/src/m_misc.c b/src/m_misc.c index 53b63e75f..c95aa392c 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -93,9 +93,8 @@ typedef off_t off64_t; #ifdef PNG_WRITE_SUPPORTED #define USE_PNG // Only actually use PNG if write is supported. #if defined (PNG_WRITE_APNG_SUPPORTED) //|| !defined(PNG_STATIC) - #if (PNG_LIBPNG_VER_MAJOR) == 1 && (PNG_LIBPNG_VER_MINOR <= 4) // Supposedly, the current APNG code can't work on newer versions as is + #include "apng.h" #define USE_APNG - #endif #endif // See hardware/hw_draw.c for a similar check to this one. #endif @@ -795,13 +794,13 @@ static inline void M_PNGImage(png_structp png_ptr, png_infop png_info_ptr, PNG_C #ifdef USE_APNG static png_structp apng_ptr = NULL; static png_infop apng_info_ptr = NULL; +static apng_infop apng_ainfo_ptr = NULL; static png_FILE_p apng_FILE = NULL; static png_uint_32 apng_frames = 0; -static png_byte acTL_cn[5] = { 97, 99, 84, 76, '\0'}; #ifdef PNG_STATIC // Win32 build have static libpng -#define apng_set_acTL png_set_acTL -#define apng_write_frame_head png_write_frame_head -#define apng_write_frame_tail png_write_frame_tail +#define aPNG_set_acTL png_set_acTL +#define aPNG_write_frame_head png_write_frame_head +#define aPNG_write_frame_tail png_write_frame_tail #else // outside libpng may not have apng support #ifndef PNG_WRITE_APNG_SUPPORTED // libpng header may not have apng patch @@ -838,20 +837,20 @@ static png_byte acTL_cn[5] = { 97, 99, 84, 76, '\0'}; #endif #endif -typedef PNG_EXPORT(png_uint_32, (*P_png_set_acTL)) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 num_frames, png_uint_32 num_plays)); -typedef PNG_EXPORT (void, (*P_png_write_frame_head)) PNGARG((png_structp png_ptr, +typedef png_uint_32 (*P_png_set_acTL) (png_structp png_ptr, + png_infop info_ptr, png_uint_32 num_frames, png_uint_32 num_plays); +typedef void (*P_png_write_frame_head) (png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers, png_uint_32 width, png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset, png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, - png_byte blend_op)); + png_byte blend_op); -typedef PNG_EXPORT (void, (*P_png_write_frame_tail)) PNGARG((png_structp png_ptr, - png_infop info_ptr)); -static P_png_set_acTL apng_set_acTL = NULL; -static P_png_write_frame_head apng_write_frame_head = NULL; -static P_png_write_frame_tail apng_write_frame_tail = NULL; +typedef void (*P_png_write_frame_tail) (png_structp png_ptr, + png_infop info_ptr); +static P_png_set_acTL aPNG_set_acTL = NULL; +static P_png_write_frame_head aPNG_write_frame_head = NULL; +static P_png_write_frame_tail aPNG_write_frame_tail = NULL; #endif static inline boolean M_PNGLib(void) @@ -860,7 +859,7 @@ static inline boolean M_PNGLib(void) return true; #else static void *pnglib = NULL; - if (apng_set_acTL && apng_write_frame_head && apng_write_frame_tail) + if (aPNG_set_acTL && aPNG_write_frame_head && aPNG_write_frame_tail) return true; if (pnglib) return false; @@ -880,16 +879,16 @@ static inline boolean M_PNGLib(void) if (!pnglib) return false; #ifdef HAVE_SDL - apng_set_acTL = hwSym("png_set_acTL", pnglib); - apng_write_frame_head = hwSym("png_write_frame_head", pnglib); - apng_write_frame_tail = hwSym("png_write_frame_tail", pnglib); + aPNG_set_acTL = hwSym("png_set_acTL", pnglib); + aPNG_write_frame_head = hwSym("png_write_frame_head", pnglib); + aPNG_write_frame_tail = hwSym("png_write_frame_tail", pnglib); #endif #ifdef _WIN32 - apng_set_acTL = GetProcAddress("png_set_acTL", pnglib); - apng_write_frame_head = GetProcAddress("png_write_frame_head", pnglib); - apng_write_frame_tail = GetProcAddress("png_write_frame_tail", pnglib); + aPNG_set_acTL = GetProcAddress("png_set_acTL", pnglib); + aPNG_write_frame_head = GetProcAddress("png_write_frame_head", pnglib); + aPNG_write_frame_tail = GetProcAddress("png_write_frame_tail", pnglib); #endif - return (apng_set_acTL && apng_write_frame_head && apng_write_frame_tail); + return (aPNG_set_acTL && aPNG_write_frame_head && aPNG_write_frame_tail); #endif } @@ -903,11 +902,6 @@ static void M_PNGFrame(png_structp png_ptr, png_infop png_info_ptr, png_bytep pn apng_frames++; -#ifndef PNG_STATIC - if (apng_set_acTL) -#endif - apng_set_acTL(apng_ptr, apng_info_ptr, apng_frames, 0); - for (y = 0; y < height; y++) { row_pointers[y] = png_buf; @@ -915,9 +909,9 @@ static void M_PNGFrame(png_structp png_ptr, png_infop png_info_ptr, png_bytep pn } #ifndef PNG_STATIC - if (apng_write_frame_head) + if (aPNG_write_frame_head) #endif - apng_write_frame_head(apng_ptr, apng_info_ptr, row_pointers, + aPNG_write_frame_head(apng_ptr, apng_info_ptr, row_pointers, vid.width, /* width */ height, /* height */ 0, /* x offset */ @@ -930,57 +924,21 @@ static void M_PNGFrame(png_structp png_ptr, png_infop png_info_ptr, png_bytep pn png_write_image(png_ptr, row_pointers); #ifndef PNG_STATIC - if (apng_write_frame_tail) + if (aPNG_write_frame_tail) #endif - apng_write_frame_tail(apng_ptr, apng_info_ptr); + aPNG_write_frame_tail(apng_ptr, apng_info_ptr); png_free(png_ptr, (png_voidp)row_pointers); } -static inline boolean M_PNGfind_acTL(void) +static void M_PNGfix_acTL(png_structp png_ptr, png_infop png_info_ptr, + apng_infop png_ainfo_ptr) { - png_byte cn[8]; // 4 bytes for len then 4 byes for name - long endpos = ftell(apng_FILE); // not the real end of file, just what of libpng wrote - for (fseek(apng_FILE, 0, SEEK_SET); // let go to the start of the file - ftell(apng_FILE)+12 < endpos; // let not go over the file bound - fseek(apng_FILE, 1, SEEK_CUR) // we went 8 steps back and now we go 1 step forward - ) - { - if (fread(cn, sizeof(cn), 1, apng_FILE) != 1) // read 8 bytes - return false; // failed to read data - if (fseek(apng_FILE, -8, SEEK_CUR) != 0) //rewind 8 bytes - return false; // failed to rewird - if (!png_memcmp(cn+4, acTL_cn, 4)) //cmp for chuck header - return true; // found it - } - return false; // acTL chuck not found -} - -static void M_PNGfix_acTL(png_structp png_ptr, png_infop png_info_ptr) -{ - png_byte data[16]; - long oldpos; - -#ifndef PNG_STATIC - if (apng_set_acTL) -#endif - apng_set_acTL(png_ptr, png_info_ptr, apng_frames, 0); + apng_set_acTL(png_ptr, png_info_ptr, png_ainfo_ptr, apng_frames, 0); #ifndef NO_PNG_DEBUG png_debug(1, "in png_write_acTL\n"); #endif - - png_ptr->num_frames_to_write = apng_frames; - - png_save_uint_32(data, apng_frames); - png_save_uint_32(data + 4, 0); - - oldpos = ftell(apng_FILE); - - if (M_PNGfind_acTL()) - png_write_chunk(png_ptr, (png_bytep)acTL_cn, data, (png_size_t)8); - - fseek(apng_FILE, oldpos, SEEK_SET); } static boolean M_SetupaPNG(png_const_charp filename, png_bytep pal) @@ -1012,6 +970,16 @@ static boolean M_SetupaPNG(png_const_charp filename, png_bytep pal) return false; } + apng_ainfo_ptr = apng_create_info_struct(apng_ptr); + if (!apng_ainfo_ptr) + { + CONS_Debug(DBG_RENDER, "M_StartMovie: Error on allocate for apng\n"); + png_destroy_write_struct(&apng_ptr, &apng_info_ptr); + fclose(apng_FILE); + remove(filename); + return false; + } + png_init_io(apng_ptr, apng_FILE); #ifdef PNG_SET_USER_LIMITS_SUPPORTED @@ -1029,12 +997,11 @@ static boolean M_SetupaPNG(png_const_charp filename, png_bytep pal) M_PNGText(apng_ptr, apng_info_ptr, true); -#ifndef PNG_STATIC - if (apng_set_acTL) -#endif - apng_set_acTL(apng_ptr, apng_info_ptr, PNG_UINT_31_MAX, 0); + apng_set_set_acTL_fn(apng_ptr, apng_ainfo_ptr, aPNG_set_acTL); - png_write_info(apng_ptr, apng_info_ptr); + apng_set_acTL(apng_ptr, apng_info_ptr, apng_ainfo_ptr, PNG_UINT_31_MAX, 0); + + apng_write_info(apng_ptr, apng_info_ptr, apng_ainfo_ptr); apng_frames = 0; @@ -1237,8 +1204,8 @@ void M_StopMovie(void) if (apng_frames) { - M_PNGfix_acTL(apng_ptr, apng_info_ptr); - png_write_end(apng_ptr, apng_info_ptr); + M_PNGfix_acTL(apng_ptr, apng_info_ptr, apng_ainfo_ptr); + apng_write_end(apng_ptr, apng_info_ptr, apng_ainfo_ptr); } png_destroy_write_struct(&apng_ptr, &apng_info_ptr); From b95d443c25e86240e58dbd107a5ad0d8f5955746 Mon Sep 17 00:00:00 2001 From: james Date: Mon, 11 Feb 2019 15:47:48 -0800 Subject: [PATCH 08/59] Support libpng versions prior to 1.6 and 1.5 Tested confirmed for... 1.5.30 1.4.22 1.2.59 --- src/apng.c | 56 ++++++++++++++++++++++++++++-------------------------- src/apng.h | 29 +++++++++++++--------------- 2 files changed, 42 insertions(+), 43 deletions(-) diff --git a/src/apng.c b/src/apng.c index 742de77f6..505f49031 100644 --- a/src/apng.c +++ b/src/apng.c @@ -45,23 +45,23 @@ struct apng_info_def }; /* PROTOS (FUCK COMPILER) */ -void apng_seek (png_structrp, apng_const_inforp, size_t); -size_t apng_tell (png_structrp, apng_const_inforp); +void apng_seek (png_structp, apng_const_infop, size_t); +size_t apng_tell (png_structp, apng_const_infop); #ifdef PNG_WRITE_FLUSH_SUPPORTED -void apng_flush (png_structrp, apng_inforp); +void apng_flush (png_structp, apng_infop); #ifdef PNG_STDIO_SUPPORTED -void apng_default_flush (png_structrp); +void apng_default_flush (png_structp); #endif/* PNG_STDIO_SUPPORTED */ #endif/* PNG_WRITE_FLUSH_SUPPORTED */ #ifdef PNG_STDIO_SUPPORTED -void apng_default_seek (png_structrp, size_t); -size_t apng_default_tell (png_structrp); +void apng_default_seek (png_structp, size_t); +size_t apng_default_tell (png_structp); #endif/* PNG_STDIO_SUPPORTED */ -void apng_write_IEND (png_structrp); -void apng_write_acTL (png_structrp, png_uint_32, png_uint_32); +void apng_write_IEND (png_structp); +void apng_write_acTL (png_structp, png_uint_32, png_uint_32); apng_infop -apng_create_info_struct (png_structrp pngp) +apng_create_info_struct (png_structp pngp) { apng_infop ainfop; (void)pngp; @@ -74,7 +74,7 @@ apng_create_info_struct (png_structrp pngp) } void -apng_destroy_info_struct (png_structrp pngp, apng_infopp ainfopp) +apng_destroy_info_struct (png_structp pngp, apng_infopp ainfopp) { (void)pngp; if (!( pngp && ainfopp )) @@ -84,20 +84,20 @@ apng_destroy_info_struct (png_structrp pngp, apng_infopp ainfopp) } void -apng_seek (png_structrp pngp, apng_const_inforp ainfop, size_t l) +apng_seek (png_structp pngp, apng_const_infop ainfop, size_t l) { (*(ainfop->output_seek_fn))(pngp, l); } size_t -apng_tell (png_structrp pngp, apng_const_inforp ainfop) +apng_tell (png_structp pngp, apng_const_infop ainfop) { return (*(ainfop->output_tell_fn))(pngp); } #ifdef PNG_WRITE_FLUSH_SUPPORTED void -apng_flush (png_structrp pngp, apng_inforp ainfop) +apng_flush (png_structp pngp, apng_infop ainfop) { if (ainfop->output_flush_fn) (*(ainfop->output_flush_fn))(pngp); @@ -105,7 +105,7 @@ apng_flush (png_structrp pngp, apng_inforp ainfop) #ifdef PNG_STDIO_SUPPORTED void -apng_default_flush (png_structrp pngp) +apng_default_flush (png_structp pngp) { if (!( pngp )) return; @@ -117,7 +117,7 @@ apng_default_flush (png_structrp pngp) #ifdef PNG_STDIO_SUPPORTED void -apng_default_seek (png_structrp pngp, size_t l) +apng_default_seek (png_structp pngp, size_t l) { if (!( pngp )) return; @@ -127,7 +127,7 @@ apng_default_seek (png_structrp pngp, size_t l) } size_t -apng_default_tell (png_structrp pngp) +apng_default_tell (png_structp pngp) { long l; @@ -144,7 +144,7 @@ apng_default_tell (png_structrp pngp) #endif/* PNG_STDIO_SUPPORTED */ void -apng_set_write_fn (png_structrp pngp, apng_inforp ainfop, png_voidp iop, +apng_set_write_fn (png_structp pngp, apng_infop ainfop, png_voidp iop, png_rw_ptr write_f, png_flush_ptr flush_f, apng_seek_ptr seek_f, apng_tell_ptr tell_f) { @@ -176,18 +176,20 @@ apng_set_write_fn (png_structrp pngp, apng_inforp ainfop, png_voidp iop, } void -apng_write_IEND (png_structrp pngp) +apng_write_IEND (png_structp pngp) { - png_write_chunk(pngp, (png_const_bytep)"IEND", 0, 0); + png_byte chunkc[] = "IEND"; + png_write_chunk(pngp, chunkc, 0, 0); } void -apng_write_acTL (png_structrp pngp, png_uint_32 frames, png_uint_32 plays) +apng_write_acTL (png_structp pngp, png_uint_32 frames, png_uint_32 plays) { + png_byte chunkc[] = "acTL"; png_byte buf[8]; png_save_uint_32(buf, frames); png_save_uint_32(buf + 4, plays); - png_write_chunk(pngp, (png_const_bytep)"acTL", buf, 8); + png_write_chunk(pngp, chunkc, buf, 8); } png_uint_32 @@ -208,8 +210,8 @@ apng_set_acTL (png_structp pngp, png_infop infop, apng_infop ainfop, } void -apng_write_info_before_PLTE (png_structrp pngp, png_inforp infop, - apng_inforp ainfop) +apng_write_info_before_PLTE (png_structp pngp, png_infop infop, + apng_infop ainfop) { if (!( pngp && infop && ainfop )) return; @@ -229,15 +231,15 @@ apng_write_info_before_PLTE (png_structrp pngp, png_inforp infop, } void -apng_write_info (png_structrp pngp, png_inforp infop, - apng_inforp ainfop) +apng_write_info (png_structp pngp, png_infop infop, + apng_infop ainfop) { apng_write_info_before_PLTE(pngp, infop, ainfop); png_write_info(pngp, infop); } void -apng_write_end (png_structp pngp, png_inforp infop, apng_inforp ainfop) +apng_write_end (png_structp pngp, png_infop infop, apng_infop ainfop) { (void)infop; apng_write_IEND(pngp); @@ -253,7 +255,7 @@ apng_write_end (png_structp pngp, png_inforp infop, apng_inforp ainfop) /* Dynamic runtime linking capable! (Hopefully.) */ void -apng_set_set_acTL_fn (png_structrp pngp, apng_inforp ainfop, +apng_set_set_acTL_fn (png_structp pngp, apng_infop ainfop, apng_set_acTL_ptr set_acTL_f) { (void)pngp; diff --git a/src/apng.h b/src/apng.h index b166c3cc3..633fb1c2d 100644 --- a/src/apng.h +++ b/src/apng.h @@ -30,18 +30,15 @@ typedef apng_info * apng_infop; typedef const apng_info * apng_const_infop; typedef apng_info * * apng_infopp; -typedef apng_info * PNG_RESTRICT apng_inforp; -typedef const apng_info * PNG_RESTRICT apng_const_inforp; +typedef void (*apng_seek_ptr)(png_structp, size_t); +typedef size_t (*apng_tell_ptr)(png_structp); -typedef void (*apng_seek_ptr)(png_structrp, size_t); -typedef size_t (*apng_tell_ptr)(png_structrp); - -typedef png_uint_32 (*apng_set_acTL_ptr)(png_structrp, png_inforp, +typedef png_uint_32 (*apng_set_acTL_ptr)(png_structp, png_infop, png_uint_32, png_uint_32); -apng_infop apng_create_info_struct (png_structrp png_ptr); +apng_infop apng_create_info_struct (png_structp png_ptr); -void apng_destroy_info_struct (png_structrp png_ptr, +void apng_destroy_info_struct (png_structp png_ptr, apng_infopp info_ptr_ptr); /* Call the following functions in place of the libpng counterparts. */ @@ -50,20 +47,20 @@ png_uint_32 apng_set_acTL (png_structp png_ptr, png_infop info_ptr, apng_infop ainfo_ptr, png_uint_32 num_frames, png_uint_32 num_plays); -void apng_write_info_before_PLTE (png_structrp png_ptr, png_inforp info_ptr, - apng_inforp ainfo_ptr); -void apng_write_info (png_structrp png_ptr, png_inforp info_ptr, - apng_inforp ainfo_ptr); +void apng_write_info_before_PLTE (png_structp png_ptr, png_infop info_ptr, + apng_infop ainfo_ptr); +void apng_write_info (png_structp png_ptr, png_infop info_ptr, + apng_infop ainfo_ptr); -void apng_write_end (png_structrp png_ptr, png_inforp info_ptr, - apng_inforp ainfo_ptr); +void apng_write_end (png_structp png_ptr, png_infop info_ptr, + apng_infop ainfo_ptr); -void apng_set_write_fn (png_structrp png_ptr, apng_inforp ainfo_ptr, +void apng_set_write_fn (png_structp png_ptr, apng_infop ainfo_ptr, png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn, apng_seek_ptr output_seek_fn, apng_tell_ptr output_tell_fn); -void apng_set_set_acTL_fn (png_structrp png_ptr, apng_inforp ainfo_ptr, +void apng_set_set_acTL_fn (png_structp png_ptr, apng_infop ainfo_ptr, apng_set_acTL_ptr set_acTL_fn); #endif/* APNG_H */ From fd28a1a6b72bc583c1870c37339429cf75ed142b Mon Sep 17 00:00:00 2001 From: james Date: Mon, 11 Feb 2019 16:01:02 -0800 Subject: [PATCH 09/59] Update copyright year --- src/apng.c | 2 +- src/apng.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apng.c b/src/apng.c index 505f49031..2109c0a07 100644 --- a/src/apng.c +++ b/src/apng.c @@ -1,5 +1,5 @@ /* -Copyright 2018, James R. +Copyright 2019, James R. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/src/apng.h b/src/apng.h index 633fb1c2d..eefd6aaa3 100644 --- a/src/apng.h +++ b/src/apng.h @@ -1,5 +1,5 @@ /* -Copyright 2018, James R. +Copyright 2019, James R. All rights reserved. Redistribution and use in source and binary forms, with or without From cb1429b59f5d142afdc15debabac834fb9d26311 Mon Sep 17 00:00:00 2001 From: james Date: Tue, 12 Feb 2019 17:01:27 -0800 Subject: [PATCH 10/59] Support CMake for apng --- src/CMakeLists.txt | 6 ++++++ src/sdl/CMakeLists.txt | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index faa860d44..e93777cbd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -379,6 +379,12 @@ if(${SRB2_CONFIG_HAVE_PNG} AND ${SRB2_CONFIG_HAVE_ZLIB}) set(SRB2_HAVE_PNG ON) add_definitions(-DHAVE_PNG) add_definitions(-D_LARGEFILE64_SOURCE) + set(SRB2_PNG_SOURCES apng.c) + set(SRB2_PNG_HEADERS apng.h) + prepend_sources(SRB2_PNG_SOURCES) + prepend_sources(SRB2_PNG_HEADERS) + source_group("Main" FILES ${SRB2_CORE_SOURCES} ${SRB2_CORE_HEADERS} + ${SRB2_PNG_SOURCES} ${SRB2_PNG_HEADERS}) else() message(WARNING "You have specified that PNG is available but it was not found. SRB2Kart may not compile correctly.") endif() diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index ec5d63ac7..de2157055 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -70,6 +70,8 @@ if(${SDL2_FOUND}) set(SRB2_SDL2_TOTAL_SOURCES ${SRB2_CORE_SOURCES} ${SRB2_CORE_HEADERS} + ${SRB2_PNG_SOURCES} + ${SRB2_PNG_HEADERS} ${SRB2_CORE_RENDER_SOURCES} ${SRB2_CORE_GAME_SOURCES} ${SRB2_LUA_SOURCES} @@ -80,7 +82,8 @@ if(${SDL2_FOUND}) ${SRB2_SDL2_HEADERS} ) - source_group("Main" FILES ${SRB2_CORE_SOURCES} ${SRB2_CORE_HEADERS}) + source_group("Main" FILES ${SRB2_CORE_SOURCES} ${SRB2_CORE_HEADERS} + ${SRB2_PNG_SOURCES} ${SRB2_PNG_HEADERS}) source_group("Renderer" FILES ${SRB2_CORE_RENDER_SOURCES}) source_group("Game" FILES ${SRB2_CORE_GAME_SOURCES}) source_group("Assembly" FILES ${SRB2_ASM_SOURCES} ${SRB2_NASM_SOURCES}) From 622402617dfa175f0e454d375b459d828e6c602c Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Wed, 13 Feb 2019 05:37:13 -0600 Subject: [PATCH 11/59] Add pogospring to itemenabled --- src/k_kart.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/k_kart.c b/src/k_kart.c index 018519ca6..8d2936d35 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -631,6 +631,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) cv_shrink.value, cv_thundershield.value, cv_hyudoro.value, + cv_pogospring.value, cv_kitchensink.value, cv_triplesneaker.value, cv_triplebanana.value, From dc433dee626d22024b2192078c73e4fb027c4417 Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Thu, 14 Feb 2019 20:59:07 -0500 Subject: [PATCH 12/59] Add missing ifdefs --- src/k_kart.c | 6 ++++++ src/w_wad.c | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 49fd54e61..3ac504853 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1891,8 +1891,10 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto } } +#ifdef HAVE_BLUA if (LUAh_PlayerSpin(player, inflictor, source)) // Let Lua do its thing or overwrite if it wants to. Make sure to let any possible instashield happen because we didn't get "damaged" in this case. return; +#endif if (source && source != player->mo && source->player) K_PlayHitEmSound(source); @@ -2022,8 +2024,10 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor) } } +#ifdef HAVE_BLUA if (LUAh_PlayerSquish(player, inflictor, source)) // Let Lua do its thing or overwrite if it wants to. Make sure to let any possible instashield happen because we didn't get "damaged" in this case. return; +#endif player->kartstuff[k_sneakertimer] = 0; player->kartstuff[k_driftboost] = 0; @@ -2136,8 +2140,10 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b } } +#ifdef HAVE_BLUA if (LUAh_PlayerExplode(player, inflictor, source)) // Same thing. Also make sure to let Instashield happen blah blah return; +#endif if (source && source != player->mo && source->player) K_PlayHitEmSound(source); diff --git a/src/w_wad.c b/src/w_wad.c index efa09ce43..29e1ba223 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -191,8 +191,10 @@ static inline void W_LoadDehackedLumpsPK3(UINT16 wadnum) { posEnd = W_CheckNumForFolderEndPK3("Lua/", wadnum, posStart); posStart++; +#ifdef HAVE_BLUA for (; posStart < posEnd; posStart++) LUA_LoadLump(wadnum, posStart); +#endif } posStart = W_CheckNumForFolderStartPK3("SOC/", wadnum, 0); if (posStart != INT16_MAX) @@ -794,7 +796,9 @@ UINT16 W_InitFile(const char *filename) DEH_LoadDehackedLumpPwad(numwadfiles - 1, 0); break; case RET_LUA: +#ifdef HAVE_BLUA LUA_LoadLump(numwadfiles - 1, 0); +#endif break; default: break; From 264adb7c7e5e351923890635f559592896c9f78d Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Thu, 14 Feb 2019 21:32:57 -0500 Subject: [PATCH 13/59] Update project files --- src/sdl/Srb2SDL-vc10.vcxproj | 2 + src/sdl/Srb2SDL-vc10.vcxproj.filters | 3 ++ src/sdl/Srb2SDL-vc9.vcproj | 44 +++++++++++++++++++ .../macosx/Srb2mac.xcodeproj/project.pbxproj | 5 +++ src/sdl12/Srb2SDL-vc10.vcxproj | 11 +++++ src/sdl12/Srb2SDL-vc9.vcproj | 44 +++++++++++++++++++ .../macosx/Srb2mac.pbproj/project.pbxproj | 14 ++++++ .../macosx/Srb2mac.xcodeproj/project.pbxproj | 5 +++ src/win32/Srb2win-vc10.vcxproj | 2 + src/win32/Srb2win-vc9.vcproj | 44 +++++++++++++++++++ 10 files changed, 174 insertions(+) diff --git a/src/sdl/Srb2SDL-vc10.vcxproj b/src/sdl/Srb2SDL-vc10.vcxproj index bd964259b..d2466bd5b 100644 --- a/src/sdl/Srb2SDL-vc10.vcxproj +++ b/src/sdl/Srb2SDL-vc10.vcxproj @@ -164,6 +164,7 @@ + @@ -317,6 +318,7 @@ + diff --git a/src/sdl/Srb2SDL-vc10.vcxproj.filters b/src/sdl/Srb2SDL-vc10.vcxproj.filters index 09287436d..daa13189f 100644 --- a/src/sdl/Srb2SDL-vc10.vcxproj.filters +++ b/src/sdl/Srb2SDL-vc10.vcxproj.filters @@ -294,6 +294,9 @@ LUA + + M_Misc + M_Misc diff --git a/src/sdl/Srb2SDL-vc9.vcproj b/src/sdl/Srb2SDL-vc9.vcproj index d2a268f8d..3898aeba4 100644 --- a/src/sdl/Srb2SDL-vc9.vcproj +++ b/src/sdl/Srb2SDL-vc9.vcproj @@ -2834,6 +2834,50 @@ RelativePath="..\m_argv.h" > + + + + + + + + + + + + + + + + diff --git a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj index 94a3fbb63..a8ecbf7f8 100644 --- a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj +++ b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj @@ -43,6 +43,7 @@ 1E44AF0D0B67CDE900BAD059 /* m_fixed.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEFE0B67CDE900BAD059 /* m_fixed.c */; }; 1E44AF0F0B67CDE900BAD059 /* m_menu.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF000B67CDE900BAD059 /* m_menu.c */; }; 1E44AF110B67CDE900BAD059 /* m_misc.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF020B67CDE900BAD059 /* m_misc.c */; }; + 1E44AF110B67CDE900BAD059 /* apng.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF020B67CDE900BAD059 /* apng.c */; }; 1E44AF130B67CDE900BAD059 /* m_random.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF040B67CDE900BAD059 /* m_random.c */; }; 1E44AF1A0B67CE2A00BAD059 /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF180B67CE2A00BAD059 /* info.c */; }; 1E44AF1E0B67CE3600BAD059 /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF1C0B67CE3600BAD059 /* md5.c */; }; @@ -253,7 +254,9 @@ 1E44AF000B67CDE900BAD059 /* m_menu.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = m_menu.c; path = ../../m_menu.c; sourceTree = SOURCE_ROOT; }; 1E44AF010B67CDE900BAD059 /* m_menu.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_menu.h; path = ../../m_menu.h; sourceTree = SOURCE_ROOT; }; 1E44AF020B67CDE900BAD059 /* m_misc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = m_misc.c; path = ../../m_misc.c; sourceTree = SOURCE_ROOT; }; + 1E44AF020B67CDE900BAD059 /* apng.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = apng.c; path = ../../m_misc.c; sourceTree = SOURCE_ROOT; }; 1E44AF030B67CDE900BAD059 /* m_misc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_misc.h; path = ../../m_misc.h; sourceTree = SOURCE_ROOT; }; + 1E44AF020B67CDE900BAD059 /* apng.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = apng.h; path = ../../m_misc.c; sourceTree = SOURCE_ROOT; }; 1E44AF040B67CDE900BAD059 /* m_random.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = m_random.c; path = ../../m_random.c; sourceTree = SOURCE_ROOT; }; 1E44AF050B67CDE900BAD059 /* m_random.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_random.h; path = ../../m_random.h; sourceTree = SOURCE_ROOT; }; 1E44AF060B67CDE900BAD059 /* m_swap.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_swap.h; path = ../../m_swap.h; sourceTree = SOURCE_ROOT; }; @@ -679,6 +682,8 @@ 1E44AEFF0B67CDE900BAD059 /* m_fixed.h */, 1E44AF020B67CDE900BAD059 /* m_misc.c */, 1E44AF030B67CDE900BAD059 /* m_misc.h */, + 1E44AF020B67CDE900BAD059 /* apng.c */, + 1E44AF030B67CDE900BAD059 /* apng.h */, 676BB51C0E0DE06100C95963 /* m_queue.c */, 676BB51D0E0DE06100C95963 /* m_queue.h */, 1E44AF040B67CDE900BAD059 /* m_random.c */, diff --git a/src/sdl12/Srb2SDL-vc10.vcxproj b/src/sdl12/Srb2SDL-vc10.vcxproj index 958cd7d02..99916f58d 100644 --- a/src/sdl12/Srb2SDL-vc10.vcxproj +++ b/src/sdl12/Srb2SDL-vc10.vcxproj @@ -835,6 +835,16 @@ %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) @@ -1293,6 +1303,7 @@ + diff --git a/src/sdl12/Srb2SDL-vc9.vcproj b/src/sdl12/Srb2SDL-vc9.vcproj index d2a268f8d..fa386e381 100644 --- a/src/sdl12/Srb2SDL-vc9.vcproj +++ b/src/sdl12/Srb2SDL-vc9.vcproj @@ -2790,6 +2790,50 @@ + + + + + + + + + + + + + + + + diff --git a/src/sdl12/macosx/Srb2mac.pbproj/project.pbxproj b/src/sdl12/macosx/Srb2mac.pbproj/project.pbxproj index de12201f5..1f8e3276a 100644 --- a/src/sdl12/macosx/Srb2mac.pbproj/project.pbxproj +++ b/src/sdl12/macosx/Srb2mac.pbproj/project.pbxproj @@ -1365,6 +1365,20 @@ path = ../../m_misc.h; refType = 2; }; + 84177764085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = apng.c; + path = ../../apng.c; + refType = 2; + }; + 84177765085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_misc.h; + path = ../../apng.h; + refType = 2; + }; 84177766085A10EB000C01D8 = { fileEncoding = 30; isa = PBXFileReference; diff --git a/src/sdl12/macosx/Srb2mac.xcodeproj/project.pbxproj b/src/sdl12/macosx/Srb2mac.xcodeproj/project.pbxproj index 0ab40c45e..69c544c56 100644 --- a/src/sdl12/macosx/Srb2mac.xcodeproj/project.pbxproj +++ b/src/sdl12/macosx/Srb2mac.xcodeproj/project.pbxproj @@ -43,6 +43,7 @@ 1E44AF0D0B67CDE900BAD059 /* m_fixed.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEFE0B67CDE900BAD059 /* m_fixed.c */; }; 1E44AF0F0B67CDE900BAD059 /* m_menu.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF000B67CDE900BAD059 /* m_menu.c */; }; 1E44AF110B67CDE900BAD059 /* m_misc.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF020B67CDE900BAD059 /* m_misc.c */; }; + 1E44AF110B67CDE900BAD059 /* apng.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF020B67CDE900BAD059 /* apng.c */; }; 1E44AF130B67CDE900BAD059 /* m_random.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF040B67CDE900BAD059 /* m_random.c */; }; 1E44AF1A0B67CE2A00BAD059 /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF180B67CE2A00BAD059 /* info.c */; }; 1E44AF1E0B67CE3600BAD059 /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF1C0B67CE3600BAD059 /* md5.c */; }; @@ -254,6 +255,8 @@ 1E44AF010B67CDE900BAD059 /* m_menu.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_menu.h; path = ../../m_menu.h; sourceTree = SOURCE_ROOT; }; 1E44AF020B67CDE900BAD059 /* m_misc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = m_misc.c; path = ../../m_misc.c; sourceTree = SOURCE_ROOT; }; 1E44AF030B67CDE900BAD059 /* m_misc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_misc.h; path = ../../m_misc.h; sourceTree = SOURCE_ROOT; }; + 1E44AF020B67CDE900BAD059 /* apng.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = apng.c; path = ../../m_misc.c; sourceTree = SOURCE_ROOT; }; + 1E44AF030B67CDE900BAD059 /* apng.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = apng.h; path = ../../m_misc.h; sourceTree = SOURCE_ROOT; }; 1E44AF040B67CDE900BAD059 /* m_random.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = m_random.c; path = ../../m_random.c; sourceTree = SOURCE_ROOT; }; 1E44AF050B67CDE900BAD059 /* m_random.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_random.h; path = ../../m_random.h; sourceTree = SOURCE_ROOT; }; 1E44AF060B67CDE900BAD059 /* m_swap.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_swap.h; path = ../../m_swap.h; sourceTree = SOURCE_ROOT; }; @@ -679,6 +682,8 @@ 1E44AEFF0B67CDE900BAD059 /* m_fixed.h */, 1E44AF020B67CDE900BAD059 /* m_misc.c */, 1E44AF030B67CDE900BAD059 /* m_misc.h */, + 1E44AF020B67CDE900BAD059 /* apng.c */, + 1E44AF030B67CDE900BAD059 /* apng.h */, 676BB51C0E0DE06100C95963 /* m_queue.c */, 676BB51D0E0DE06100C95963 /* m_queue.h */, 1E44AF040B67CDE900BAD059 /* m_random.c */, diff --git a/src/win32/Srb2win-vc10.vcxproj b/src/win32/Srb2win-vc10.vcxproj index ca73b1293..774ce5cbe 100644 --- a/src/win32/Srb2win-vc10.vcxproj +++ b/src/win32/Srb2win-vc10.vcxproj @@ -182,6 +182,7 @@ + @@ -330,6 +331,7 @@ + diff --git a/src/win32/Srb2win-vc9.vcproj b/src/win32/Srb2win-vc9.vcproj index 24235bc7b..a64b8638c 100644 --- a/src/win32/Srb2win-vc9.vcproj +++ b/src/win32/Srb2win-vc9.vcproj @@ -2851,6 +2851,50 @@ RelativePath="..\m_misc.h" > + + + + + + + + + + + + + + + + From da8253547566bf392dd982374ab4261c4f40fc9a Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Fri, 15 Feb 2019 20:51:44 -0600 Subject: [PATCH 14/59] Ping kick changes + other quality of life improvements [REDO] --- src/d_clisrv.c | 43 +++++++++++++++++++++++++++++++++++++------ src/d_clisrv.h | 1 + src/d_netcmd.c | 10 ++++++++++ src/d_netcmd.h | 2 ++ src/hu_stuff.c | 28 ++++++++++++++++++++++++++-- src/m_menu.c | 20 ++++++++++++-------- 6 files changed, 88 insertions(+), 16 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 961c1e594..04816fd11 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -93,6 +93,7 @@ static tic_t freezetimeout[MAXNETNODES]; // Until when can this node freeze the UINT16 pingmeasurecount = 1; UINT32 realpingtable[MAXPLAYERS]; //the base table of ping where an average will be sent to everyone. UINT32 playerpingtable[MAXPLAYERS]; //table of player latency values. +tic_t servermaxping = 800; // server's max ping. Defaults to 800 #endif SINT8 nodetoplayer[MAXNETNODES]; SINT8 nodetoplayer2[MAXNETNODES]; // say the numplayer for this node if any (splitscreen) @@ -4355,6 +4356,9 @@ FILESTAMP for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i]) playerpingtable[i] = (tic_t)netbuffer->u.pingtable[i]; + + servermaxping = (tic_t)netbuffer->u.pingtable[i++]; + CONS_Printf("got server maxping: %d\n", servermaxping); } break; @@ -4997,6 +5001,18 @@ void TryRunTics(tic_t realtics) } #ifdef NEWPING + +/* Ping Update except better: + We call this once per second and check for people's pings. If their ping happens to be too high, we increment some timer and kick them out. + If they're not lagging, decrement the timer by 1. Of course, reset all of this if they leave. + + Why do we do that? Well, I'm a person with unfortunately sometimes unstable internet and happen to keep getting kicked very unconveniently for very short high spikes. (700+ ms) + Because my spikes are so high, the average ping is exponentially higher too (700s really add up...!) which leads me to getting kicked for a short burst of spiking. + With this change here, this doesn't happen anymore as it checks if my ping has been CONSISTENTLY bad for long enough before killing me. +*/ + +static INT32 pingtimeout[MAXPLAYERS]; + static inline void PingUpdate(void) { INT32 i; @@ -5017,6 +5033,9 @@ static inline void PingUpdate(void) laggers[i] = true; numlaggers++; } + else + pingtimeout[i] = 0; + } //kick lagging players... unless everyone but the server's ping sucks. @@ -5027,12 +5046,21 @@ static inline void PingUpdate(void) { if (playeringame[i] && laggers[i]) { - XBOXSTATIC char buf[2]; + pingtimeout[i]++; + CONS_Printf("Player %d is lagging, incrementing timeout... %d/%d\n", i, pingtimeout[i], cv_pingtimeout.value); // debug print, don't forget to remove this... - buf[0] = (char)i; - buf[1] = KICK_MSG_PING_HIGH; - SendNetXCmd(XD_KICK, &buf, 2); + if (pingtimeout[i] > cv_pingtimeout.value) // ok your net has been bad for too long, you deserve to die. + { + pingtimeout[i] = 0; + XBOXSTATIC char buf[2]; + + buf[0] = (char)i; + buf[1] = KICK_MSG_PING_HIGH; + SendNetXCmd(XD_KICK, &buf, 2); + } } + else // you aren't lagging, but you aren't free yet. In case you'll keep spiking, we just make the timer go back down. (Very unstable net must still get kicked). + pingtimeout[i] = (pingtimeout[i] == 0 ? 0 : pingtimeout[i]-1); } } } @@ -5047,10 +5075,13 @@ static inline void PingUpdate(void) realpingtable[i] = 0; //Reset each as we go. } + // send the server's maxping as last element of our ping table. This is useful to let us know when we're about to get kicked. + netbuffer->u.pingtable[i++] = cv_maxping.value; + //send out our ping packets for (i = 0; i < MAXNETNODES; i++) if (nodeingame[i]) - HSendPacket(i, true, 0, sizeof(INT32) * MAXPLAYERS); + HSendPacket(i, true, 0, sizeof(INT32) * (MAXPLAYERS+1)); pingmeasurecount = 1; //Reset count } @@ -5064,7 +5095,7 @@ static void UpdatePingTable(void) INT32 i; if (server) { - if (netgame && !(gametime % 255)) + if (netgame && !(gametime % 35)) // update once per second. PingUpdate(); // update node latency values so we can take an average later. for (i = 0; i < MAXPLAYERS; i++) diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 62bd8bc17..04569198f 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -519,6 +519,7 @@ extern tic_t jointimeout; extern UINT16 pingmeasurecount; extern UINT32 realpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS]; +extern tic_t servermaxping; #endif extern consvar_t diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 438cdcd54..ce54960d0 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -435,6 +435,14 @@ consvar_t cv_jointimeout = {"jointimeout", "105", CV_CALL|CV_SAVE, nettimeout_co #ifdef NEWPING static CV_PossibleValue_t maxping_cons_t[] = {{0, "MIN"}, {1000, "MAX"}, {0, NULL}}; consvar_t cv_maxping = {"maxping", "800", CV_SAVE, maxping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; + +static CV_PossibleValue_t pingtimeout_cons_t[] = {{8, "MIN"}, {120, "MAX"}, {0, NULL}}; +consvar_t cv_pingtimeout = {"pingtimeout", "15", CV_SAVE, pingtimeout_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; + +// show your ping on the HUD next to framerate. Defaults to warning only (shows up if your ping is > maxping) +static CV_PossibleValue_t showping_cons_t[] = {{0, "Off"}, {1, "Always"}, {2, "Warning"}, {0, NULL}}; +consvar_t cv_showping = {"showping", "Warning", CV_SAVE, showping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; + #endif // Intermission time Tails 04-19-2002 static CV_PossibleValue_t inttime_cons_t[] = {{0, "MIN"}, {3600, "MAX"}, {0, NULL}}; @@ -664,6 +672,8 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_sleep); #ifdef NEWPING CV_RegisterVar(&cv_maxping); + CV_RegisterVar(&cv_pingtimeout); + CV_RegisterVar(&cv_showping); #endif #ifdef SEENAMES diff --git a/src/d_netcmd.h b/src/d_netcmd.h index c590eee65..54c00484e 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -145,6 +145,8 @@ extern consvar_t cv_specialrings, cv_powerstones, cv_matchboxes, cv_competitionb #ifdef NEWPING extern consvar_t cv_maxping; +extern consvar_t cv_pingtimeout; +extern consvar_t cv_showping; #endif extern consvar_t cv_skipmapcheck; diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 3d8f2383b..216d14b0a 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2178,6 +2178,22 @@ static void HU_DrawSongCredits(void) V_DrawRightAlignedThinString(cursongcredit.x, y, V_ALLOWLOWERCASE|V_6WIDTHSPACE|V_SNAPTOLEFT|(cursongcredit.trans< servermaxping)) // only show 2 (warning) if our ping is at a bad level + { + INT32 dispx = cv_ticrate.value ? 260 : 290; + HU_drawPing(dispx, 190, ping, false); + } +} + // Heads up displays drawer, call each frame // void HU_Drawer(void) @@ -2290,6 +2306,9 @@ void HU_Drawer(void) V_DrawCenteredString(BASEVIDWIDTH/2, 180, V_YELLOWMAP | V_ALLOWLOWERCASE, resynch_text); } + + // draw the ping if the user wishes to + HU_drawLocalPing(); } //====================================================================== @@ -2376,6 +2395,7 @@ void HU_drawPing(INT32 x, INT32 y, INT32 ping, boolean notext) SINT8 i = 0; SINT8 yoffset = 6; INT32 dx = x+1 - (V_SmallStringWidth(va("%dms", ping), V_ALLOWLOWERCASE)/2); + boolean highping = (servermaxping && ping > servermaxping) ? true : false; if (ping < 128) { @@ -2387,13 +2407,17 @@ void HU_drawPing(INT32 x, INT32 y, INT32 ping, boolean notext) numbars = 2; // Apparently ternaries w/ multiple statements don't look good in C so I decided against it. barcolor = 103; } + else if (highping) // yikes...! + { + numbars = 0; + } if (!notext || vid.width >= 640) // how sad, we're using a shit resolution. - V_DrawSmallString(dx, y+4, V_ALLOWLOWERCASE, va("%dms", ping)); + V_DrawSmallString(dx, y+4, V_ALLOWLOWERCASE|((highping && hu_tick < 4) ? V_REDMAP : 0), va("%dms", ping)); for (i=0; (i<3); i++) // Draw the ping bar { - V_DrawFill(x+2 *(i-1), y+yoffset-4, 2, 8-yoffset, 31); + V_DrawFill(x+2 *(i-1), y+yoffset-4, 2, 8-yoffset, (highping && hu_tick < 4) ? 128 : 31); if (i < numbars) V_DrawFill(x+2 *(i-1), y+yoffset-3, 1, 8-yoffset-1, barcolor); diff --git a/src/m_menu.c b/src/m_menu.c index d8b1c2d7b..966f4fa77 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1390,7 +1390,7 @@ static menuitem_t OP_HUDOptionsMenu[] = {IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "HUD Visibility", &cv_translucenthud, 20}, - {IT_STRING | IT_SUBMENU, NULL, "Online chat options...",&OP_ChatOptionsDef, 35}, + {IT_STRING | IT_SUBMENU, NULL, "Online HUD options...",&OP_ChatOptionsDef, 35}, {IT_STRING | IT_CVAR, NULL, "Background Glass", &cons_backcolor, 45}, {IT_STRING | IT_CVAR | IT_CV_SLIDER, @@ -1404,6 +1404,7 @@ static menuitem_t OP_HUDOptionsMenu[] = {IT_STRING | IT_CVAR, NULL, "Console Text Size", &cv_constextsize, 120}, }; +// Ok it's still called chatoptions but we'll put ping display in here to be clean static menuitem_t OP_ChatOptionsMenu[] = { // will ANYONE who doesn't know how to use the console want to touch this one? @@ -1417,6 +1418,8 @@ static menuitem_t OP_ChatOptionsMenu[] = {IT_STRING | IT_CVAR, NULL, "Chat Background Tint", &cv_chatbacktint, 50}, {IT_STRING | IT_CVAR, NULL, "Message Fadeout Time", &cv_chattime, 60}, {IT_STRING | IT_CVAR, NULL, "Spam Protection", &cv_chatspamprotection, 70}, + + {IT_STRING | IT_CVAR, NULL, "Local ping display", &cv_showping, 90}, // shows ping next to framerate if we want to. }; static menuitem_t OP_GameOptionsMenu[] = @@ -1469,15 +1472,16 @@ static menuitem_t OP_AdvServerOptionsMenu[] = {IT_STRING | IT_CVAR, NULL, "Attempts to resynchronise", &cv_resynchattempts, 40}, {IT_STRING | IT_CVAR, NULL, "Ping limit (ms)", &cv_maxping, 50}, - {IT_STRING | IT_CVAR, NULL, "Connection timeout (tics)", &cv_nettimeout, 60}, - {IT_STRING | IT_CVAR, NULL, "Join timeout (tics)", &cv_jointimeout, 70}, + {IT_STRING | IT_CVAR, NULL, "Ping timeout (s)", &cv_pingtimeout, 60}, + {IT_STRING | IT_CVAR, NULL, "Connection timeout (tics)", &cv_nettimeout, 70}, + {IT_STRING | IT_CVAR, NULL, "Join timeout (tics)", &cv_jointimeout, 80}, - {IT_STRING | IT_CVAR, NULL, "Max. file transfer send (KB)", &cv_maxsend, 90}, - {IT_STRING | IT_CVAR, NULL, "File transfer packet rate", &cv_downloadspeed, 100}, + {IT_STRING | IT_CVAR, NULL, "Max. file transfer send (KB)", &cv_maxsend, 100}, + {IT_STRING | IT_CVAR, NULL, "File transfer packet rate", &cv_downloadspeed, 110}, - {IT_STRING | IT_CVAR, NULL, "Log join addresses", &cv_showjoinaddress, 120}, - {IT_STRING | IT_CVAR, NULL, "Log resyncs", &cv_blamecfail, 130}, - {IT_STRING | IT_CVAR, NULL, "Log file transfers", &cv_noticedownload, 140}, + {IT_STRING | IT_CVAR, NULL, "Log join addresses", &cv_showjoinaddress, 130}, + {IT_STRING | IT_CVAR, NULL, "Log resyncs", &cv_blamecfail, 140}, + {IT_STRING | IT_CVAR, NULL, "Log file transfers", &cv_noticedownload, 150}, }; #endif From 22bb4ad246c1ac79c51fc81a08d421afee6abee2 Mon Sep 17 00:00:00 2001 From: Latapostrophe Date: Fri, 15 Feb 2019 03:12:08 +0100 Subject: [PATCH 15/59] forgot to remove this print --- src/d_clisrv.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 04816fd11..cb02bf83e 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -4358,7 +4358,6 @@ FILESTAMP playerpingtable[i] = (tic_t)netbuffer->u.pingtable[i]; servermaxping = (tic_t)netbuffer->u.pingtable[i++]; - CONS_Printf("got server maxping: %d\n", servermaxping); } break; From db280e64a1d35e5d5a8252c300ac4519db14d127 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Fri, 15 Feb 2019 21:08:08 -0600 Subject: [PATCH 16/59] New visuals for ping and fps display alike [REDO] --- src/d_main.c | 2 +- src/hu_stuff.c | 73 ++++++++++++++++++++++++++---------------------- src/hu_stuff.h | 6 +++- src/k_kart.c | 3 +- src/lua_hudlib.c | 19 +++++++++++++ src/screen.c | 20 +++++++++---- src/v_video.c | 22 +++++++++++++++ src/v_video.h | 4 +++ 8 files changed, 107 insertions(+), 42 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 5cf95f4b8..b35296aab 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -932,7 +932,7 @@ static void IdentifyVersion(void) D_AddFile(va(pandf,srb2waddir,"chars.kart")); D_AddFile(va(pandf,srb2waddir,"maps.kart")); #ifdef USE_PATCH_KART - D_AddFile(va(pandf,srb2waddir,"patch.kart")); + D_AddFile(va(pandf,srb2waddir,"patchping.kart")); // also don't forget to change that, this is to avoid conflicting with our regular patch.kart #endif #if !defined (HAVE_SDL) || defined (HAVE_MIXER) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 216d14b0a..7e9f703db 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -74,6 +74,14 @@ patch_t *nightsnum[10]; // 0-9 patch_t *lt_font[LT_FONTSIZE]; patch_t *cred_font[CRED_FONTSIZE]; +// ping font +// Note: I'd like to adress that at this point we might *REALLY* want to work towards a common drawString function that can take any font we want because this is really turning into a MESS. :V -Lat' +patch_t *pingnum[10]; +patch_t *pinggfx[5]; // small ping graphic + +patch_t *framecounter; +patch_t *frameslash; // framerate stuff. Used in screen.c + static player_t *plr; boolean chat_on; // entering a chat message? static char w_chat[HU_MAXMSGLEN]; @@ -263,6 +271,8 @@ void HU_LoadGraphics(void) tallnum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX); sprintf(buffer, "NGTNUM%d", i); nightsnum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + sprintf(buffer, "PINGN%d", i); + pingnum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); } // minus for negative tallnums @@ -295,6 +305,17 @@ void HU_LoadGraphics(void) tinyemeraldpics[6] = W_CachePatchName("TEMER7", PU_HUDGFX); songcreditbg = W_CachePatchName("K_SONGCR", PU_HUDGFX); + + // cache ping gfx: + for (i = 0; i < 5; i++) + { + sprintf(buffer, "PINGGFX%d", i+1); + pinggfx[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX); + } + + // fps stuff + framecounter = W_CachePatchName("FRAMER", PU_HUDGFX); + frameslash = W_CachePatchName("FRAMESL", PU_HUDGFX);; } // Initialise Heads up @@ -2183,14 +2204,14 @@ static void HU_DrawSongCredits(void) void HU_drawLocalPing(void) { - if (!cv_showping.value || !netgame || consoleplayer == serverplayer) // we don't want to see it or aren't in a netgame, or are the server + if (!cv_showping.value || !netgame || consoleplayer != serverplayer) // we don't want to see it or aren't in a netgame, or are the server return; INT32 ping = playerpingtable[consoleplayer]; // consoleplayer's ping is everyone's ping in a splitnetgame :P if (cv_showping.value == 1 || (cv_showping.value == 2 && ping > servermaxping)) // only show 2 (warning) if our ping is at a bad level { - INT32 dispx = cv_ticrate.value ? 260 : 290; - HU_drawPing(dispx, 190, ping, false); + INT32 dispy = cv_ticrate.value ? 160 : 181; + HU_drawPing(307, dispy, ping, V_SNAPTORIGHT|V_SNAPTOBOTTOM); } } @@ -2388,41 +2409,25 @@ void HU_Erase(void) // // HU_drawPing // -void HU_drawPing(INT32 x, INT32 y, INT32 ping, boolean notext) +void HU_drawPing(INT32 x, INT32 y, INT32 ping, INT32 flags) { - UINT8 numbars = 1; // how many ping bars do we draw? - UINT8 barcolor = 128; // color we use for the bars (green, yellow or red) - SINT8 i = 0; - SINT8 yoffset = 6; - INT32 dx = x+1 - (V_SmallStringWidth(va("%dms", ping), V_ALLOWLOWERCASE)/2); - boolean highping = (servermaxping && ping > servermaxping) ? true : false; + INT32 gfxnum = 4; // gfx to draw + UINT8 const *colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_SALMON, GTC_CACHE); - if (ping < 128) - { - numbars = 3; - barcolor = 184; - } + if (ping < 76) + gfxnum = 0; + else if (ping < 137) + gfxnum = 1; else if (ping < 256) - { - numbars = 2; // Apparently ternaries w/ multiple statements don't look good in C so I decided against it. - barcolor = 103; - } - else if (highping) // yikes...! - { - numbars = 0; - } + gfxnum = 2; + else if (ping < 500) + gfxnum = 3; - if (!notext || vid.width >= 640) // how sad, we're using a shit resolution. - V_DrawSmallString(dx, y+4, V_ALLOWLOWERCASE|((highping && hu_tick < 4) ? V_REDMAP : 0), va("%dms", ping)); - - for (i=0; (i<3); i++) // Draw the ping bar - { - V_DrawFill(x+2 *(i-1), y+yoffset-4, 2, 8-yoffset, (highping && hu_tick < 4) ? 128 : 31); - if (i < numbars) - V_DrawFill(x+2 *(i-1), y+yoffset-3, 1, 8-yoffset-1, barcolor); - - yoffset -= 2; - } + V_DrawScaledPatch(x, y, flags, pinggfx[gfxnum]); + if (servermaxping && ping > servermaxping && hu_tick < 4) // flash ping red if too high + V_DrawPingNum(x, y+9, flags, ping, colormap); + else + V_DrawPingNum(x, y+9, flags, ping, NULL); } // diff --git a/src/hu_stuff.h b/src/hu_stuff.h index f1ecb2ff1..0c94034d7 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -80,7 +80,11 @@ extern boolean chat_on; extern patch_t *hu_font[HU_FONTSIZE], *kart_font[KART_FONTSIZE], *tny_font[HU_FONTSIZE]; // SRB2kart extern patch_t *tallnum[10]; +extern patch_t *pingnum[10]; +extern patch_t *pinggfx[5]; extern patch_t *nightsnum[10]; +extern patch_t *framecounter; +extern patch_t *frameslash; extern patch_t *lt_font[LT_FONTSIZE]; extern patch_t *cred_font[CRED_FONTSIZE]; extern patch_t *emeraldpics[7]; @@ -109,7 +113,7 @@ void HU_Drawer(void); char HU_dequeueChatChar(void); void HU_Erase(void); void HU_clearChatChars(void); -void HU_drawPing(INT32 x, INT32 y, INT32 ping, boolean notext); // Lat': Ping drawer for scoreboard. +void HU_drawPing(INT32 x, INT32 y, INT32 ping, INT32 flags); // Lat': Ping drawer for scoreboard. //void HU_DrawTeamTabRankings(playersort_t *tab, INT32 whiteplayer); //void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer); void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol); diff --git a/src/k_kart.c b/src/k_kart.c index 8d2936d35..ad6da417e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4682,6 +4682,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_driftend] = 0; } + // Incease/decrease the drift value to continue drifting in that direction if (player->kartstuff[k_spinouttimer] == 0 && player->kartstuff[k_jmp] == 1 && onground && player->kartstuff[k_drift] != 0) { @@ -7168,7 +7169,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (netgame // don't draw it offline && tab[i].num != serverplayer) - HU_drawPing(x + ((i < 8) ? -19 : rightoffset + 13), y+2, playerpingtable[tab[i].num], false); + HU_drawPing(x + ((i < 8) ? -17 : rightoffset + 11), y-4, playerpingtable[tab[i].num], 0); STRBUFCPY(strtime, tab[i].name); diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index cd8e03923..fb6814b25 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -410,6 +410,24 @@ static int libd_drawPaddedNum(lua_State *L) return 0; } + +static int libd_drawPingNum(lua_State *L) +{ + INT32 x, y, flags, num; + const UINT8 *colormap = NULL; + HUDONLY + x = luaL_checkinteger(L, 1); + y = luaL_checkinteger(L, 2); + num = luaL_checkinteger(L, 3); + flags = luaL_optinteger(L, 4, 0); + flags &= ~V_PARAMMASK; // Don't let crashes happen. + if (!lua_isnoneornil(L, 5)) + colormap = *((UINT8 **)luaL_checkudata(L, 5, META_COLORMAP)); + + V_DrawPingNum(x, y, flags, num, colormap); + return 0; +} + static int libd_drawFill(lua_State *L) { INT32 x = luaL_optinteger(L, 1, 0); @@ -613,6 +631,7 @@ static luaL_Reg lib_draw[] = { {"drawScaled", libd_drawScaled}, {"drawNum", libd_drawNum}, {"drawPaddedNum", libd_drawPaddedNum}, + {"drawPingNum", libd_drawPingNum}, {"drawFill", libd_drawFill}, {"fadeScreen", libd_fadeScreen}, {"drawString", libd_drawString}, diff --git a/src/screen.c b/src/screen.c index af6aed03c..937d6caa3 100644 --- a/src/screen.c +++ b/src/screen.c @@ -403,7 +403,7 @@ void SCR_DisplayTicRate(void) tic_t i; tic_t ontic = I_GetTime(); tic_t totaltics = 0; - INT32 ticcntcolor = 0; + const UINT8 *ticcntcolor = NULL; for (i = lasttic + 1; i < TICRATE+lasttic && i < ontic; ++i) fpsgraph[i % TICRATE] = false; @@ -414,13 +414,23 @@ void SCR_DisplayTicRate(void) if (fpsgraph[i]) ++totaltics; - if (totaltics <= TICRATE/2) ticcntcolor = V_REDMAP; - else if (totaltics == TICRATE) ticcntcolor = V_GREENMAP; + if (totaltics <= TICRATE/2) ticcntcolor = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_SALMON, GTC_CACHE); + else if (totaltics == TICRATE) ticcntcolor = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_MINT, GTC_CACHE); - V_DrawString(vid.width-(24*vid.dupx), vid.height-(16*vid.dupy), + /*V_DrawString(vid.width-(24*vid.dupx), vid.height-(16*vid.dupy), V_YELLOWMAP|V_NOSCALESTART, "FPS"); V_DrawString(vid.width-(40*vid.dupx), vid.height-( 8*vid.dupy), - ticcntcolor|V_NOSCALESTART, va("%02d/%02u", totaltics, TICRATE)); + ticcntcolor|V_NOSCALESTART, va("%02d/%02u", totaltics, TICRATE));*/ + + // draw "FPS" + V_DrawFixedPatch(306<width); // this SHOULD always be 5 but I guess custom graphics exist. + + if (flags & V_NOSCALESTART) + w *= vid.dupx; + + if (num < 0) + num = -num; + + // draw the number + do + { + x -= (w-1); // Oni wanted their outline to intersect. + V_DrawFixedPatch(x< Date: Fri, 15 Feb 2019 22:30:13 +0100 Subject: [PATCH 17/59] Forgot to change this back from testing --- 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 7e9f703db..636737403 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2204,7 +2204,7 @@ static void HU_DrawSongCredits(void) void HU_drawLocalPing(void) { - if (!cv_showping.value || !netgame || consoleplayer != serverplayer) // we don't want to see it or aren't in a netgame, or are the server + if (!cv_showping.value || !netgame || consoleplayer == serverplayer) // we don't want to see it or aren't in a netgame, or are the server return; INT32 ping = playerpingtable[consoleplayer]; // consoleplayer's ping is everyone's ping in a splitnetgame :P From 542b8c4920a004ddab146c7afc9f6b90c9f60fd4 Mon Sep 17 00:00:00 2001 From: Latapostrophe Date: Sat, 16 Feb 2019 02:40:55 +0100 Subject: [PATCH 18/59] Remove debug stuff --- src/d_clisrv.c | 2 -- src/d_main.c | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index cb02bf83e..b5de68960 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5046,8 +5046,6 @@ static inline void PingUpdate(void) if (playeringame[i] && laggers[i]) { pingtimeout[i]++; - CONS_Printf("Player %d is lagging, incrementing timeout... %d/%d\n", i, pingtimeout[i], cv_pingtimeout.value); // debug print, don't forget to remove this... - if (pingtimeout[i] > cv_pingtimeout.value) // ok your net has been bad for too long, you deserve to die. { pingtimeout[i] = 0; diff --git a/src/d_main.c b/src/d_main.c index b35296aab..5cf95f4b8 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -932,7 +932,7 @@ static void IdentifyVersion(void) D_AddFile(va(pandf,srb2waddir,"chars.kart")); D_AddFile(va(pandf,srb2waddir,"maps.kart")); #ifdef USE_PATCH_KART - D_AddFile(va(pandf,srb2waddir,"patchping.kart")); // also don't forget to change that, this is to avoid conflicting with our regular patch.kart + D_AddFile(va(pandf,srb2waddir,"patch.kart")); #endif #if !defined (HAVE_SDL) || defined (HAVE_MIXER) From aeef900bc251185e7255ca124a968c70e443ec28 Mon Sep 17 00:00:00 2001 From: Latapostrophe Date: Sat, 16 Feb 2019 12:19:03 +0100 Subject: [PATCH 19/59] Lower default ping timeout + Fix chat arrows being missing while we're at it --- src/d_netcmd.c | 2 +- src/hu_stuff.c | 4 ++-- src/v_video.c | 10 ++++------ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index ce54960d0..53d88f2f7 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -437,7 +437,7 @@ static CV_PossibleValue_t maxping_cons_t[] = {{0, "MIN"}, {1000, "MAX"}, {0, NUL consvar_t cv_maxping = {"maxping", "800", CV_SAVE, maxping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t pingtimeout_cons_t[] = {{8, "MIN"}, {120, "MAX"}, {0, NULL}}; -consvar_t cv_pingtimeout = {"pingtimeout", "15", CV_SAVE, pingtimeout_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_pingtimeout = {"pingtimeout", "10", CV_SAVE, pingtimeout_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; // show your ping on the HUD next to framerate. Defaults to warning only (shows up if your ping is > maxping) static CV_PossibleValue_t showping_cons_t[] = {{0, "Off"}, {1, "Always"}, {2, "Warning"}, {0, NULL}}; diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 636737403..3bc28c17e 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -1633,9 +1633,9 @@ static void HU_drawChatLog(INT32 offset) // draw arrows to indicate that we can (or not) scroll. if (chat_scroll > 0) - V_DrawThinString(chatx-9, ((justscrolledup) ? (chat_topy-1) : (chat_topy)), V_SNAPTOBOTTOM | V_SNAPTOLEFT | highlight, "\x1A"); // up arrow + V_DrawCharacter(chatx-9, ((justscrolledup) ? (chat_topy-1) : (chat_topy)), V_SNAPTOBOTTOM | V_SNAPTOLEFT | highlight | '\x1A', false); // up arrow if (chat_scroll < chat_maxscroll) - V_DrawThinString(chatx-9, chat_bottomy-((justscrolleddown) ? 5 : 6), V_SNAPTOBOTTOM | V_SNAPTOLEFT | highlight, "\x1B"); // down arrow + V_DrawCharacter(chatx-9, chat_bottomy-((justscrolleddown) ? 5 : 6), V_SNAPTOBOTTOM | V_SNAPTOLEFT | highlight | '\x1B', false); // down arrow justscrolleddown = false; justscrolledup = false; diff --git a/src/v_video.c b/src/v_video.c index 7cbcd99ab..473adeedb 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -1342,8 +1342,8 @@ void V_DrawCharacter(INT32 x, INT32 y, INT32 c, boolean lowercaseallowed) V_DrawScaledPatch(x, y, flags, hu_font[c]); } -// Writes a single character for the chat. (draw WHITE if bit 7 set) -// Essentially the same as the above but it's small or big depending on what resolution you've chosen to huge.. +// Writes a single character for the chat (half scaled). (draw WHITE if bit 7 set) +// 16/02/19: Scratch the scaling thing, chat doesn't work anymore under 2x res -Lat' // void V_DrawChatCharacter(INT32 x, INT32 y, INT32 c, boolean lowercaseallowed, UINT8 *colormap) { @@ -1359,13 +1359,11 @@ void V_DrawChatCharacter(INT32 x, INT32 y, INT32 c, boolean lowercaseallowed, UI if (c < 0 || c >= HU_FONTSIZE || !hu_font[c]) return; - w = (vid.width < 640 ) ? (SHORT(hu_font[c]->width)/2) : (SHORT(hu_font[c]->width)); // use normal sized characters if we're using a terribly low resolution. + w = SHORT(hu_font[c]->width)/2; if (x + w > vid.width) return; - V_DrawFixedPatch(x*FRACUNIT, y*FRACUNIT, (vid.width < 640) ? (FRACUNIT) : (FRACUNIT/2), flags, hu_font[c], colormap); - - + V_DrawFixedPatch(x*FRACUNIT, y*FRACUNIT, FRACUNIT/2, flags, hu_font[c], colormap); } // Precompile a wordwrapped string to any given width. From b8dc9127d5163b4c5175a11b7ab6df57312a70a9 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Sat, 16 Feb 2019 06:37:09 -0600 Subject: [PATCH 20/59] Set flashing tics to 0 after boosting --- src/k_kart.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index a811cce44..684b20396 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3265,6 +3265,8 @@ void K_DoSneaker(player_t *player, INT32 type) player->pflags |= PF_ATTACKDOWN; K_PlayBoostTaunt(player->mo); } + + player->powers[pw_flashing] = 0; // Stop flashing after boosting } static void K_DoShrink(player_t *user) From 4129dae3af4ab50bd244e5475ce1144dc4d11888 Mon Sep 17 00:00:00 2001 From: Latapostrophe Date: Sat, 16 Feb 2019 13:38:50 +0100 Subject: [PATCH 21/59] Move ping display in i_video for consistency with showfps display --- src/djgppdos/i_video.c | 5 +++++ src/hu_stuff.c | 3 ++- src/sdl/i_video.c | 7 ++++++- src/sdl12/i_video.c | 5 +++++ src/win32/win_vid.c | 5 +++++ src/win32ce/win_vid.c | 5 +++++ 6 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/djgppdos/i_video.c b/src/djgppdos/i_video.c index 612c72215..69addfb04 100644 --- a/src/djgppdos/i_video.c +++ b/src/djgppdos/i_video.c @@ -41,6 +41,7 @@ #include "../m_argv.h" #include "vid_vesa.h" #include "../i_video.h" +#include "../hu_stuff.h" //dosstuff -newly added @@ -93,6 +94,10 @@ void I_FinishUpdate (void) // draw FPS if enabled if (cv_ticrate.value) SCR_DisplayTicRate(); + + // this is now handled here so that wipes and other things don't overlap it for the sake of consistency. + // no additional checks are needed here, this function does them all so no need to worry. :) + HU_drawLocalPing(); //blast it to the screen // this code sucks diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 3bc28c17e..404b45097 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2329,7 +2329,8 @@ void HU_Drawer(void) } // draw the ping if the user wishes to - HU_drawLocalPing(); + // THIS IS NOW HANDLED IN I_VIDEO + //HU_drawLocalPing(); } //====================================================================== diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 2a77604d2..9e5e4b601 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -64,9 +64,10 @@ #include "../m_menu.h" #include "../d_main.h" #include "../s_sound.h" -#include "../i_sound.h" // midi pause/unpause +#include "../i_sound.h" // midi pause/unpause #include "../i_joy.h" #include "../st_stuff.h" +#include "../hu_stuff.h" // ping drawer #include "../g_game.h" #include "../i_video.h" #include "../console.h" @@ -1360,6 +1361,10 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); + + // this is now handled here so that wipes and other things don't overlap it for the sake of consistency. + // no additional checks are needed here, this function does them all so no need to worry. :) + HU_drawLocalPing(); if (rendermode == render_soft && screens[0]) { diff --git a/src/sdl12/i_video.c b/src/sdl12/i_video.c index 69cf5ca9c..08e6bd947 100644 --- a/src/sdl12/i_video.c +++ b/src/sdl12/i_video.c @@ -99,6 +99,7 @@ #include "../i_sound.h" // midi pause/unpause #include "../i_joy.h" #include "../st_stuff.h" +#include "../hu_stuff.h" #include "../g_game.h" #include "../i_video.h" #include "../console.h" @@ -1342,6 +1343,10 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); + + // this is now handled here so that wipes and other things don't overlap it for the sake of consistency. + // no additional checks are needed here, this function does them all so no need to worry. :) + HU_drawLocalPing(); if (render_soft == rendermode && screens[0]) { diff --git a/src/win32/win_vid.c b/src/win32/win_vid.c index 9f3d13f8f..cba0c209d 100644 --- a/src/win32/win_vid.c +++ b/src/win32/win_vid.c @@ -28,6 +28,7 @@ #include "../m_argv.h" #include "../v_video.h" #include "../st_stuff.h" +#include "../hu_stuff.h" #include "../i_video.h" #include "../z_zone.h" #include "fabdxlib.h" @@ -365,6 +366,10 @@ void I_FinishUpdate(void) // display a graph of ticrate if (cv_ticrate.value) SCR_DisplayTicRate(); + + // this is now handled here so that wipes and other things don't overlap it for the sake of consistency. + // no additional checks are needed here, this function does them all so no need to worry. :) + HU_drawLocalPing(); // if (bDIBMode) diff --git a/src/win32ce/win_vid.c b/src/win32ce/win_vid.c index 5e8e7e1fb..c6610fa0e 100644 --- a/src/win32ce/win_vid.c +++ b/src/win32ce/win_vid.c @@ -26,6 +26,7 @@ #include "../m_argv.h" #include "../v_video.h" #include "../st_stuff.h" +#include "../hu_stuff.h" #include "../i_video.h" #include "../z_zone.h" #include "fabdxlib.h" @@ -198,6 +199,10 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); + // this is now handled here so that wipes and other things don't overlap it for the sake of consistency. + // no additional checks are needed here, this function does them all so no need to worry. :) + HU_drawLocalPing(); + // if (bDIBMode) { From f8da7f3d8b433b52ff28e80cd80729a4c684c544 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Sat, 16 Feb 2019 07:03:56 -0600 Subject: [PATCH 22/59] Don't kill flashing tics for floor boosts --- src/k_kart.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 684b20396..2b06e1d3f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3264,9 +3264,8 @@ void K_DoSneaker(player_t *player, INT32 type) { player->pflags |= PF_ATTACKDOWN; K_PlayBoostTaunt(player->mo); + player->powers[pw_flashing] = 0; // Stop flashing after boosting } - - player->powers[pw_flashing] = 0; // Stop flashing after boosting } static void K_DoShrink(player_t *user) From 5172deb345d9bf76373ad9e8997c4d97870bca6f Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Sat, 16 Feb 2019 08:29:48 -0600 Subject: [PATCH 23/59] Fix compiler warnings --- src/hu_stuff.c | 4 ++-- src/hu_stuff.h | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 404b45097..175c8bf33 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2207,7 +2207,7 @@ void HU_drawLocalPing(void) if (!cv_showping.value || !netgame || consoleplayer == serverplayer) // we don't want to see it or aren't in a netgame, or are the server return; - INT32 ping = playerpingtable[consoleplayer]; // consoleplayer's ping is everyone's ping in a splitnetgame :P + UINT32 ping = playerpingtable[consoleplayer]; // consoleplayer's ping is everyone's ping in a splitnetgame :P if (cv_showping.value == 1 || (cv_showping.value == 2 && ping > servermaxping)) // only show 2 (warning) if our ping is at a bad level { INT32 dispy = cv_ticrate.value ? 160 : 181; @@ -2410,7 +2410,7 @@ void HU_Erase(void) // // HU_drawPing // -void HU_drawPing(INT32 x, INT32 y, INT32 ping, INT32 flags) +void HU_drawPing(INT32 x, INT32 y, UINT32 ping, INT32 flags) { INT32 gfxnum = 4; // gfx to draw UINT8 const *colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_SALMON, GTC_CACHE); diff --git a/src/hu_stuff.h b/src/hu_stuff.h index 0c94034d7..6788c701a 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -109,11 +109,12 @@ void HU_Start(void); boolean HU_Responder(event_t *ev); void HU_Ticker(void); +void HU_drawLocalPing(void); void HU_Drawer(void); char HU_dequeueChatChar(void); void HU_Erase(void); void HU_clearChatChars(void); -void HU_drawPing(INT32 x, INT32 y, INT32 ping, INT32 flags); // Lat': Ping drawer for scoreboard. +void HU_drawPing(INT32 x, INT32 y, UINT32 ping, INT32 flags); // Lat': Ping drawer for scoreboard. //void HU_DrawTeamTabRankings(playersort_t *tab, INT32 whiteplayer); //void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer); void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol); From 4df98e6e1f4b095b8ccac9e1005869e39abfbec2 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Sat, 16 Feb 2019 10:33:18 -0600 Subject: [PATCH 24/59] Simulate fractional precision on item odds This notably prevents some items from disappearing completely above 8 players in netgames. --- src/k_kart.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index b006ae3bb..a398fa016 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -651,6 +651,9 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) else newodds = K_KartItemOddsRace[item-1][pos]; + // Base multiplication to ALL item odds to simulate fractional precision + newodds *= 4; + for (i = 0; i < MAXPLAYERS; i++) { if (!playeringame[i] || players[i].spectator) @@ -867,8 +870,8 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) UINT8 pingame = 0; UINT8 roulettestop; INT32 useodds = 0; - INT32 spawnchance[NUMKARTRESULTS * NUMKARTODDS]; - INT32 chance = 0, numchoices = 0; + INT32 spawnchance[NUMKARTRESULTS]; + INT32 totalspawnchance = 0; INT32 bestbumper = 0; fixed_t mashed = 0; boolean dontforcespb = false; @@ -965,24 +968,23 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) } // Initializes existing spawnchance values - for (i = 0; i < (NUMKARTRESULTS * NUMKARTODDS); i++) + for (i = 0; i < NUMKARTRESULTS; i++) spawnchance[i] = 0; // Split into another function for a debug function below useodds = K_FindUseodds(player, mashed, pingame, bestbumper, (spbplace != -1 && player->kartstuff[k_position] == spbplace+1), dontforcespb); -#define SETITEMRESULT(itemnum) \ - for (chance = 0; chance < K_KartGetItemOdds(useodds, itemnum, mashed); chance++) \ - spawnchance[numchoices++] = itemnum - for (i = 1; i < NUMKARTRESULTS; i++) - SETITEMRESULT(i); - -#undef SETITEMRESULT + spawnchance[i] = (totalspawnchance += K_KartGetItemOdds(useodds, i, mashed)); // Award the player whatever power is rolled - if (numchoices > 0) - K_KartGetItemResult(player, spawnchance[P_RandomKey(numchoices)]); + if (totalspawnchance > 0) + { + totalspawnchance = P_RandomKey(totalspawnchance); + for (i = 0; i < NUMKARTRESULTS && spawnchance[i] <= totalspawnchance; i++); + + K_KartGetItemResult(player, i); + } else { player->kartstuff[k_itemtype] = KITEM_SAD; From 488285e510fa41b3cce9b50b1725b1cfe2f79d41 Mon Sep 17 00:00:00 2001 From: james Date: Sat, 16 Feb 2019 14:20:55 -0800 Subject: [PATCH 25/59] Support libpng without the apng patch and fix mingw (?) compiler errors --- src/apng.c | 23 +++++++++++++++++++++-- src/apng.h | 16 ++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/apng.c b/src/apng.c index 2109c0a07..da8140e08 100644 --- a/src/apng.c +++ b/src/apng.c @@ -25,6 +25,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "apng.h" +#define APNG_INFO_acTL 0x20000U + #define APNG_WROTE_acTL 0x10000U struct apng_info_def @@ -59,6 +61,10 @@ size_t apng_default_tell (png_structp); #endif/* PNG_STDIO_SUPPORTED */ void apng_write_IEND (png_structp); void apng_write_acTL (png_structp, png_uint_32, png_uint_32); +#ifndef PNG_WRITE_APNG_SUPPORTED +void apng_set_acTL_dummy (png_structp, png_infop, apng_infop, + png_uint_32, png_uint_32); +#endif/* PNG_WRITE_APNG_SUPPORTED */ apng_infop apng_create_info_struct (png_structp pngp) @@ -204,7 +210,7 @@ apng_set_acTL (png_structp pngp, png_infop infop, apng_infop ainfop, ainfop->num_frames = frames; ainfop->num_plays = plays; - ainfop->valid |= PNG_INFO_acTL; + ainfop->valid |= APNG_INFO_acTL; return 1; } @@ -218,7 +224,7 @@ apng_write_info_before_PLTE (png_structp pngp, png_infop infop, png_write_info_before_PLTE(pngp, infop); - if (( ainfop->valid & PNG_INFO_acTL ) &&!( ainfop->mode & APNG_WROTE_acTL )) + if (( ainfop->valid & APNG_INFO_acTL )&&!( ainfop->mode & APNG_WROTE_acTL )) { ainfop->start_acTL = apng_tell(pngp, ainfop); @@ -253,6 +259,19 @@ apng_write_end (png_structp pngp, png_infop infop, apng_infop ainfop) #endif/* PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED */ } +#ifndef PNG_WRITE_APNG_SUPPORTED +void +apng_set_acTL_dummy (png_structp pngp, png_infop infop, apng_infop ainfop, + png_uint_32 frames, png_uint_32 plays) +{ + (void)pngp; + (void)infop; + (void)ainfop; + (void)frames; + (void)plays; +} +#endif/* PNG_WRITE_APNG_SUPPORTED */ + /* Dynamic runtime linking capable! (Hopefully.) */ void apng_set_set_acTL_fn (png_structp pngp, apng_infop ainfop, diff --git a/src/apng.h b/src/apng.h index eefd6aaa3..aa7fac3df 100644 --- a/src/apng.h +++ b/src/apng.h @@ -23,6 +23,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef APNG_H #define APNG_H +#ifndef _MSC_VER +#ifndef _WII +#ifndef _LARGEFILE64_SOURCE +#define _LARGEFILE64_SOURCE +#endif +#endif +#endif + +#ifndef _LFS64_LARGEFILE +#define _LFS64_LARGEFILE +#endif + +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 0 +#endif + #include typedef struct apng_info_def apng_info; From 5d3a657a41b003424ce6a8c403c6db0464209be3 Mon Sep 17 00:00:00 2001 From: james Date: Sat, 16 Feb 2019 14:39:33 -0800 Subject: [PATCH 26/59] Actually support no apng patch --- src/apng.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/apng.c b/src/apng.c index da8140e08..89cd300ae 100644 --- a/src/apng.c +++ b/src/apng.c @@ -279,7 +279,11 @@ apng_set_set_acTL_fn (png_structp pngp, apng_infop ainfop, { (void)pngp; if (!ainfop->set_acTL_fn) +#ifndef PNG_WRITE_APNG_SUPPORTED + ainfop->set_acTL_fn = &apng_set_acTL_dummy; +#else ainfop->set_acTL_fn = &png_set_acTL; +#endif/* PNG_WRITE_APNG_SUPPORTED */ else ainfop->set_acTL_fn = set_acTL_f; } From 76f2df2c40bb21d6e691da093ece8ab5aa5b3ee4 Mon Sep 17 00:00:00 2001 From: james Date: Sat, 16 Feb 2019 23:25:50 -0800 Subject: [PATCH 27/59] Expose splitscreenplayer (from Got_AddPlayer) as splitscreen in player_t --- src/d_clisrv.c | 6 ++++++ src/d_clisrv.h | 2 ++ src/d_player.h | 2 ++ src/g_game.c | 3 +++ src/lua_playerlib.c | 4 ++++ src/p_saveg.c | 4 ++++ 6 files changed, 21 insertions(+) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 7516df2e0..0aec7fd99 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -648,6 +648,8 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->jointime = (tic_t)LONG(players[i].jointime); + rsp->splitscreen = players[i].splitscreen; + rsp->hasmo = false; //Transfer important mo information if the player has a body. //This lets us resync players even if they are dead. @@ -783,6 +785,8 @@ static void resynch_read_player(resynch_pak *rsp) players[i].jointime = (tic_t)LONG(rsp->jointime); + players[i].splitscreen = rsp->splitscreen; + //We get a packet for each player in game. if (!playeringame[i]) return; @@ -3316,6 +3320,8 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum) addedtogame = true; } + players[newplayernum].splitscreen = splitscreenplayer; + if (netgame) { if (server && cv_showjoinaddress.value) diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 62bd8bc17..b628606d0 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -283,6 +283,8 @@ typedef struct tic_t jointime; + UINT8 splitscreen; + //player->mo stuff UINT8 hasmo; // Boolean diff --git a/src/d_player.h b/src/d_player.h index b430f20a4..baed9a721 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -571,6 +571,8 @@ typedef struct player_s UINT8 bot; tic_t jointime; // Timer when player joins game to change skin/color + + UINT8 splitscreen; #ifdef HWRENDER fixed_t fovadd; // adjust FOV for hw rendering #endif diff --git a/src/g_game.c b/src/g_game.c index f0d221ff6..eb0396c84 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2357,6 +2357,7 @@ void G_PlayerReborn(INT32 player) UINT8 skincolor; INT32 skin; tic_t jointime; + UINT8 psplitscreen; boolean spectator; INT16 bot; SINT8 pity; @@ -2380,6 +2381,7 @@ void G_PlayerReborn(INT32 player) ctfteam = players[player].ctfteam; exiting = players[player].exiting; jointime = players[player].jointime; + psplitscreen = players[player].splitscreen; spectator = players[player].spectator; pflags = (players[player].pflags & (PF_TIMEOVER|PF_FLIPCAM|PF_TAGIT|PF_TAGGED|PF_ANALOGMODE|PF_WANTSTOJOIN)); @@ -2476,6 +2478,7 @@ void G_PlayerReborn(INT32 player) p->pflags = pflags; p->ctfteam = ctfteam; p->jointime = jointime; + p->splitscreen = psplitscreen; p->spectator = spectator; // save player config truth reborn diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 5f136fc15..0bea1e7b9 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -325,6 +325,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->bot); else if (fastcmp(field,"jointime")) lua_pushinteger(L, plr->jointime); + else if (fastcmp(field,"splitscreen")) + lua_pushinteger(L, plr->splitscreen); #ifdef HWRENDER else if (fastcmp(field,"fovadd")) lua_pushfixed(L, plr->fovadd); @@ -613,6 +615,8 @@ static int player_set(lua_State *L) return NOSET; else if (fastcmp(field,"jointime")) plr->jointime = (tic_t)luaL_checkinteger(L, 3); + else if (fastcmp(field,"splitscreen")) + return NOSET; #ifdef HWRENDER else if (fastcmp(field,"fovadd")) plr->fovadd = luaL_checkfixed(L, 3); diff --git a/src/p_saveg.c b/src/p_saveg.c index 975a4a5d2..a2ae8f174 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -249,6 +249,8 @@ static void P_NetArchivePlayers(void) WRITEUINT32(save_p, players[i].jointime); + WRITEUINT8(save_p, players[i].splitscreen); + WRITEUINT16(save_p, flags); if (flags & CAPSULE) @@ -426,6 +428,8 @@ static void P_NetUnArchivePlayers(void) players[i].jointime = READUINT32(save_p); + players[i].splitscreen = READUINT8(save_p); + flags = READUINT16(save_p); if (flags & CAPSULE) From c689100e65c482e60517f618a133514842b8b5cd Mon Sep 17 00:00:00 2001 From: james Date: Sun, 17 Feb 2019 15:50:42 -0800 Subject: [PATCH 28/59] Create the correct dummy function --- src/apng.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apng.c b/src/apng.c index 89cd300ae..bcfccd337 100644 --- a/src/apng.c +++ b/src/apng.c @@ -62,7 +62,7 @@ size_t apng_default_tell (png_structp); void apng_write_IEND (png_structp); void apng_write_acTL (png_structp, png_uint_32, png_uint_32); #ifndef PNG_WRITE_APNG_SUPPORTED -void apng_set_acTL_dummy (png_structp, png_infop, apng_infop, +png_uint_32 apng_set_acTL_dummy (png_structp, png_infop, png_uint_32, png_uint_32); #endif/* PNG_WRITE_APNG_SUPPORTED */ @@ -260,15 +260,15 @@ apng_write_end (png_structp pngp, png_infop infop, apng_infop ainfop) } #ifndef PNG_WRITE_APNG_SUPPORTED -void -apng_set_acTL_dummy (png_structp pngp, png_infop infop, apng_infop ainfop, +png_uint_32 +apng_set_acTL_dummy (png_structp pngp, png_infop infop, png_uint_32 frames, png_uint_32 plays) { (void)pngp; (void)infop; - (void)ainfop; (void)frames; (void)plays; + return 0; } #endif/* PNG_WRITE_APNG_SUPPORTED */ From 60b952ea2ab3629936f30971674675f7b71170ec Mon Sep 17 00:00:00 2001 From: fickleheart Date: Sun, 17 Feb 2019 22:09:37 -0600 Subject: [PATCH 29/59] Add some P_MobjWasRemoved checks around code that shrink touches It's the only place in the vanilla game where K_DropItems is called that isn't from a direct collision with the player it's being called on. It's also a syncfail that doesn't happen anywhere else, and I saw my sync state appear to get slightly corrupted when it happened. Let's see if this fixes anything... --- src/k_kart.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index b006ae3bb..2c913e101 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1978,12 +1978,16 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto static void K_RemoveGrowShrink(player_t *player) { player->kartstuff[k_growshrinktimer] = 0; - if (player->kartstuff[k_invincibilitytimer] == 0) - player->mo->color = player->skincolor; - player->mo->scalespeed = mapobjectscale/TICRATE; - player->mo->destscale = mapobjectscale; - if (cv_kartdebugshrink.value && !modeattacking && !player->bot) - player->mo->destscale = (6*player->mo->destscale)/8; + + if (!P_MobjWasRemoved(player->mo)) + { + if (player->kartstuff[k_invincibilitytimer] == 0) + player->mo->color = player->skincolor; + player->mo->scalespeed = mapobjectscale/TICRATE; + player->mo->destscale = mapobjectscale; + if (cv_kartdebugshrink.value && !modeattacking && !player->bot) + player->mo->destscale = (6*player->mo->destscale)/8; + } P_RestoreMusic(player); } @@ -3290,11 +3294,15 @@ static void K_DoShrink(player_t *user) { // Start shrinking! K_DropItems(&players[i]); - players[i].mo->scalespeed = mapobjectscale/TICRATE; - players[i].mo->destscale = (6*mapobjectscale)/8; - if (cv_kartdebugshrink.value && !modeattacking && !players[i].bot) - players[i].mo->destscale = (6*players[i].mo->destscale)/8; - players[i].kartstuff[k_growshrinktimer] = -(200+(40*(MAXPLAYERS-players[i].kartstuff[k_position]))); + + if (!P_MobjWasRemoved(players[i].mo)) + { + players[i].mo->scalespeed = mapobjectscale/TICRATE; + players[i].mo->destscale = (6*mapobjectscale)/8; + if (cv_kartdebugshrink.value && !modeattacking && !players[i].bot) + players[i].mo->destscale = (6*players[i].mo->destscale)/8; + players[i].kartstuff[k_growshrinktimer] = -(200+(40*(MAXPLAYERS-players[i].kartstuff[k_position]))); + } } // Grow should get taken away. @@ -3419,7 +3427,7 @@ void K_DropHnextList(player_t *player) mobjtype_t type; boolean orbit, ponground, dropall = true; - if (!work) + if (!work || P_MobjWasRemoved(work)) return; flip = P_MobjFlip(player->mo); @@ -3556,7 +3564,7 @@ void K_DropItems(player_t *player) K_DropHnextList(player); - if (player->mo && player->kartstuff[k_itemamount]) + if (player->mo && !P_MobjWasRemoved(player->mo) && player->kartstuff[k_itemamount]) { mobj_t *drop = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_FLOATINGITEM); P_SetScale(drop, drop->scale>>4); From a1df64a365a5da80ddf9dd97dbdcd10a6fb7a753 Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Mon, 18 Feb 2019 00:58:08 -0500 Subject: [PATCH 30/59] Add command to ban an IP address. --- src/d_clisrv.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 7516df2e0..7be04682c 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2756,6 +2756,32 @@ static void Command_Ban(void) } +static void Command_BanIP(void) +{ + if (COM_Argc() < 2) + { + CONS_Printf(M_GetText("banip : ban an ip address\n")); + return; + } + + if (server) // Only the server can use this, otherwise does nothing. + { + const char *address = (COM_Argv(1)); + const char *reason = (COM_Argv(2)); + + if (I_SetBanAddress && I_SetBanAddress(address, NULL)) + { + CONS_Printf("Banned ip address for:%s\n", reason); + Ban_Add(reason); + D_SaveBan(); + } + else + { + return; + } + } +} + static void Command_Kick(void) { if (COM_Argc() < 2) @@ -3062,6 +3088,7 @@ void D_ClientServerInit(void) COM_AddCommand("getplayernum", Command_GetPlayerNum); COM_AddCommand("kick", Command_Kick); COM_AddCommand("ban", Command_Ban); + COM_AddCommand("banip", Command_BanIP); COM_AddCommand("clearbans", Command_ClearBans); COM_AddCommand("showbanlist", Command_ShowBan); COM_AddCommand("reloadbans", Command_ReloadBan); From 5e2cea39806e0bec4aabd0058066560a27ec92b5 Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Mon, 18 Feb 2019 01:03:39 -0500 Subject: [PATCH 31/59] Save ban list right after banning. --- src/d_clisrv.c | 3 +++ src/djgppdos/i_system.c | 3 --- src/sdl/i_system.c | 3 --- src/sdl12/i_system.c | 3 --- src/win32/win_sys.c | 3 --- 5 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 7be04682c..5ad2e92a3 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2725,7 +2725,10 @@ static void Command_Ban(void) else { if (server) // only the server is allowed to do this right now + { Ban_Add(COM_Argv(2)); + D_SaveBan(); // save the ban list + } if (COM_Argc() == 2) { diff --git a/src/djgppdos/i_system.c b/src/djgppdos/i_system.c index bc3c8b2bc..5970f5ae6 100644 --- a/src/djgppdos/i_system.c +++ b/src/djgppdos/i_system.c @@ -615,9 +615,6 @@ void I_Quit (void) //added:16-02-98: when recording a demo, should exit using 'q' key, // but sometimes we forget and use 'F10'.. so save here too. M_SaveConfig (NULL); //save game config, cvars.. -#ifndef NONET - D_SaveBan(); // save the ban list -#endif G_SaveGameData(); // Tails 12-08-2002 if (demorecording) G_CheckDemoStatus(); diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index f360072a0..6d72d9bba 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -3054,9 +3054,6 @@ void I_Quit(void) quiting = SDL_FALSE; I_ShutdownConsole(); M_SaveConfig(NULL); //save game config, cvars.. -#ifndef NONET - D_SaveBan(); // save the ban list -#endif G_SaveGameData(false); // Tails 12-08-2002 //added:16-02-98: when recording a demo, should exit using 'q' key, // but sometimes we forget and use 'F10'.. so save here too. diff --git a/src/sdl12/i_system.c b/src/sdl12/i_system.c index d055a4ca5..a841860fa 100644 --- a/src/sdl12/i_system.c +++ b/src/sdl12/i_system.c @@ -2975,9 +2975,6 @@ void I_Quit(void) quiting = SDL_FALSE; I_ShutdownConsole(); M_SaveConfig(NULL); //save game config, cvars.. -#ifndef NONET - D_SaveBan(); // save the ban list -#endif G_SaveGameData(); // Tails 12-08-2002 //added:16-02-98: when recording a demo, should exit using 'q' key, // but sometimes we forget and use 'F10'.. so save here too. diff --git a/src/win32/win_sys.c b/src/win32/win_sys.c index fa9d6d644..472503341 100644 --- a/src/win32/win_sys.c +++ b/src/win32/win_sys.c @@ -639,9 +639,6 @@ void I_Error(const char *error, ...) if (!errorcount) { M_SaveConfig(NULL); // save game config, cvars.. -#ifndef NONET - D_SaveBan(); // save the ban list -#endif G_SaveGameData(); } From 141338c7c109ccd287cc785e31e72f7cd5f55ae7 Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Mon, 18 Feb 2019 02:04:58 -0500 Subject: [PATCH 32/59] Save when quitting the game. Also use default reason if not custom reason is given. --- src/d_clisrv.c | 14 ++++++++++++-- src/djgppdos/i_system.c | 3 +++ src/sdl/i_system.c | 3 +++ src/sdl12/i_system.c | 3 +++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 5ad2e92a3..ea8077d6b 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2770,11 +2770,21 @@ static void Command_BanIP(void) if (server) // Only the server can use this, otherwise does nothing. { const char *address = (COM_Argv(1)); - const char *reason = (COM_Argv(2)); + const char *reason; + + if (COM_Argc() == 2) + reason = NULL; + else + reason = COM_Argv(2); + if (I_SetBanAddress && I_SetBanAddress(address, NULL)) { - CONS_Printf("Banned ip address for:%s\n", reason); + if (reason) + CONS_Printf("Banned ip address %s for: %s\n", address, reason); + else + CONS_Printf("Banned ip address %s\n", address); + Ban_Add(reason); D_SaveBan(); } diff --git a/src/djgppdos/i_system.c b/src/djgppdos/i_system.c index 5970f5ae6..bc3c8b2bc 100644 --- a/src/djgppdos/i_system.c +++ b/src/djgppdos/i_system.c @@ -615,6 +615,9 @@ void I_Quit (void) //added:16-02-98: when recording a demo, should exit using 'q' key, // but sometimes we forget and use 'F10'.. so save here too. M_SaveConfig (NULL); //save game config, cvars.. +#ifndef NONET + D_SaveBan(); // save the ban list +#endif G_SaveGameData(); // Tails 12-08-2002 if (demorecording) G_CheckDemoStatus(); diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 6d72d9bba..f360072a0 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -3054,6 +3054,9 @@ void I_Quit(void) quiting = SDL_FALSE; I_ShutdownConsole(); M_SaveConfig(NULL); //save game config, cvars.. +#ifndef NONET + D_SaveBan(); // save the ban list +#endif G_SaveGameData(false); // Tails 12-08-2002 //added:16-02-98: when recording a demo, should exit using 'q' key, // but sometimes we forget and use 'F10'.. so save here too. diff --git a/src/sdl12/i_system.c b/src/sdl12/i_system.c index a841860fa..d055a4ca5 100644 --- a/src/sdl12/i_system.c +++ b/src/sdl12/i_system.c @@ -2975,6 +2975,9 @@ void I_Quit(void) quiting = SDL_FALSE; I_ShutdownConsole(); M_SaveConfig(NULL); //save game config, cvars.. +#ifndef NONET + D_SaveBan(); // save the ban list +#endif G_SaveGameData(); // Tails 12-08-2002 //added:16-02-98: when recording a demo, should exit using 'q' key, // but sometimes we forget and use 'F10'.. so save here too. From fbc017165cefafb674171ffb7da1c536ea9edc43 Mon Sep 17 00:00:00 2001 From: james Date: Sun, 17 Feb 2019 23:09:52 -0800 Subject: [PATCH 33/59] Remove extra whitespace --- src/apng.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apng.c b/src/apng.c index bcfccd337..694b3d1e8 100644 --- a/src/apng.c +++ b/src/apng.c @@ -151,7 +151,7 @@ apng_default_tell (png_structp pngp) void apng_set_write_fn (png_structp pngp, apng_infop ainfop, png_voidp iop, - png_rw_ptr write_f, png_flush_ptr flush_f, + png_rw_ptr write_f, png_flush_ptr flush_f, apng_seek_ptr seek_f, apng_tell_ptr tell_f) { if (!( pngp && ainfop )) From 2b61d810113e804c0f6b95164e7fdcadc74b6ae4 Mon Sep 17 00:00:00 2001 From: Latapostrophe Date: Mon, 18 Feb 2019 22:19:28 +0100 Subject: [PATCH 34/59] Fix dedicated server extra lua variables not being synched for joiners --- src/lua_script.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lua_script.c b/src/lua_script.c index 1f87d33ee..28f02ca37 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -1020,7 +1020,7 @@ void LUA_Archive(void) for (i = 0; i < MAXPLAYERS; i++) { - if (!playeringame[i]) + if (!playeringame[i] && i > 0) // NEVER skip player 0, this is for dedi servs. continue; // all players in game will be archived, even if they just add a 0. ArchiveExtVars(&players[i], "player"); @@ -1056,7 +1056,7 @@ void LUA_UnArchive(void) for (i = 0; i < MAXPLAYERS; i++) { - if (!playeringame[i]) + if (!playeringame[i] && i > 0) // same here, this is to synch dediservs properly. continue; UnArchiveExtVars(&players[i]); } From 16269007a602c8c5aeb2663503dc2bba17694521 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Mon, 18 Feb 2019 21:08:11 -0600 Subject: [PATCH 35/59] Crash fix I think (CHERRY PICK INTO BASE) --- src/r_things.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_things.c b/src/r_things.c index 135ae6a29..52c92b028 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -651,7 +651,7 @@ void R_DrawMaskedColumn(column_t *column) basetexturemid = dc_texturemid; - for (; column->topdelta != 0xff ;) + for (; column && column->topdelta != 0xff ;) { // calculate unclipped screen coordinates // for post From 6821297bcec4f327cb63387d75ae839888fced8d Mon Sep 17 00:00:00 2001 From: fickleheart Date: Sat, 16 Feb 2019 11:52:35 -0600 Subject: [PATCH 36/59] Improve replay resyncing code Notably, it should no longer cause immediate desync warnings if a track starts on a slope. --- src/g_game.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index f0d221ff6..a7b9670c0 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4763,7 +4763,8 @@ void G_WriteGhostTic(mobj_t *ghost) // GZT_XYZ is only useful if you've moved 256 FRACUNITS or more in a single tic. if (abs(ghost->x-oldghost.x) > MAXMOM || abs(ghost->y-oldghost.y) > MAXMOM - || abs(ghost->z-oldghost.z) > MAXMOM) + || abs(ghost->z-oldghost.z) > MAXMOM + || leveltime & 255 == 1) // Hack to enable slightly nicer resyncing { oldghost.x = ghost->x; oldghost.y = ghost->y; @@ -4777,8 +4778,8 @@ void G_WriteGhostTic(mobj_t *ghost) { // For moving normally: // Store one full byte of movement, plus one byte of fractional movement. - INT16 momx = (INT16)((ghost->x-oldghost.x)>>8); - INT16 momy = (INT16)((ghost->y-oldghost.y)>>8); + INT16 momx = (INT16)((ghost->x-oldghost.x + (1<<4))>>8); + INT16 momy = (INT16)((ghost->y-oldghost.y + (1<<4))>>8); if (momx != oldghost.momx || momy != oldghost.momy) { @@ -4788,7 +4789,7 @@ void G_WriteGhostTic(mobj_t *ghost) WRITEINT16(demo_p,momx); WRITEINT16(demo_p,momy); } - momx = (INT16)((ghost->z-oldghost.z)>>8); + momx = (INT16)((ghost->z-oldghost.z + (1<<4))>>8); if (momx != oldghost.momz) { oldghost.momz = momx; @@ -4892,8 +4893,9 @@ void G_WriteGhostTic(mobj_t *ghost) void G_ConsGhostTic(void) { UINT8 ziptic; - UINT16 px,py,pz,gx,gy,gz; + UINT32 px,py,pz,gx,gy,gz; mobj_t *testmo; + UINT32 syncleeway; boolean nightsfail = false; if (!demo_p || !demo_start) @@ -4910,6 +4912,7 @@ void G_ConsGhostTic(void) oldghost.x = READFIXED(demo_p); oldghost.y = READFIXED(demo_p); oldghost.z = READFIXED(demo_p); + syncleeway = 0; } else { @@ -4923,6 +4926,7 @@ void G_ConsGhostTic(void) oldghost.x += oldghost.momx; oldghost.y += oldghost.momy; oldghost.z += oldghost.momz; + syncleeway = FRACUNIT; } if (ziptic & GZT_ANGLE) demo_p++; @@ -4988,14 +4992,14 @@ void G_ConsGhostTic(void) } // Re-synchronise - px = testmo->x>>FRACBITS; - py = testmo->y>>FRACBITS; - pz = testmo->z>>FRACBITS; - gx = oldghost.x>>FRACBITS; - gy = oldghost.y>>FRACBITS; - gz = oldghost.z>>FRACBITS; + px = testmo->x; + py = testmo->y; + pz = testmo->z; + gx = oldghost.x; + gy = oldghost.y; + gz = oldghost.z; - if (nightsfail || px != gx || py != gy || pz != gz) + if (nightsfail || abs(px-gx) > syncleeway || abs(py-gy) > syncleeway || abs(pz-gz) > syncleeway) { if (demosynced) CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced!\n")); From 4a3b192916e116fe686a6e37f4884ccfc58a18a3 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Mon, 18 Feb 2019 22:36:26 -0600 Subject: [PATCH 37/59] Fix bumps sometimes shooting off stupidly fast --- src/k_kart.c | 69 ++++++++++++++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index b006ae3bb..f8efff2bf 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1056,7 +1056,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) mobj_t *fx; fixed_t momdifx, momdify; fixed_t distx, disty; - fixed_t dot, p; + fixed_t dot, force; fixed_t mass1, mass2; if (!mobj1 || !mobj2) @@ -1114,6 +1114,35 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) momdifx = mobj1->momx - mobj2->momx; momdify = mobj1->momy - mobj2->momy; + // Adds the OTHER player's momentum, so that it reduces the chance of you being "inside" the other object + distx = (mobj1->x + mobj2->momx) - (mobj2->x + mobj1->momx); + disty = (mobj1->y + mobj2->momy) - (mobj2->y + mobj1->momy); + + if (distx == 0 && disty == 0) + // if there's no distance between the 2, they're directly on top of each other, don't run this + return; + + { // Normalize distance to the sum of the two objects' radii, since in a perfect world that would be the distance at the point of collision... + fixed_t dist = P_AproxDistance(distx, disty) ?: 1; + fixed_t nx = FixedDiv(distx, dist); + fixed_t ny = FixedDiv(disty, dist); + + distx = FixedMul(mobj1->radius+mobj2->radius, nx); + disty = FixedMul(mobj1->radius+mobj2->radius, ny); + + CONS_Printf("dist %f %f %d %d %d %d\n", + FIXED_TO_FLOAT(P_AproxDistance(distx, disty)), + FIXED_TO_FLOAT(P_AproxDistance(momdifx, momdify)), + mobj1->momx, mobj1->momy, mobj2->momx, mobj2->momy); + + if (momdifx == 0 && momdify == 0) + { + // If there's no momentum difference, they're moving at exactly the same rate. Pretend they moved into each other. + momdifx = -nx; + momdify = -ny; + } + } + // if the speed difference is less than this let's assume they're going proportionately faster from each other if (P_AproxDistance(momdifx, momdify) < (25*mapobjectscale)) { @@ -1124,34 +1153,6 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) momdify = FixedMul((25*mapobjectscale), normalisedy); } - // Adds the OTHER player's momentum, so that it reduces the chance of you being "inside" the other object - distx = (mobj1->x + mobj2->momx) - (mobj2->x + mobj1->momx); - disty = (mobj1->y + mobj2->momy) - (mobj2->y + mobj1->momy); - - { // Don't allow dist to get WAY too low, that it pushes you stupidly huge amounts, or backwards... - fixed_t dist = P_AproxDistance(distx, disty); - fixed_t nx = FixedDiv(distx, dist); - fixed_t ny = FixedDiv(disty, dist); - - if (P_AproxDistance(distx, disty) < (3*mobj1->radius)/4) - { - distx = FixedMul((3*mobj1->radius)/4, nx); - disty = FixedMul((3*mobj1->radius)/4, ny); - } - - if (P_AproxDistance(distx, disty) < (3*mobj2->radius)/4) - { - distx = FixedMul((3*mobj2->radius)/4, nx); - disty = FixedMul((3*mobj2->radius)/4, ny); - } - } - - if (distx == 0 && disty == 0) - { - // if there's no distance between the 2, they're directly on top of each other, don't run this - return; - } - dot = FixedMul(momdifx, distx) + FixedMul(momdify, disty); if (dot >= 0) @@ -1160,7 +1161,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) return; } - p = FixedDiv(dot, FixedMul(distx, distx)+FixedMul(disty, disty)); + force = FixedDiv(dot, FixedMul(distx, distx)+FixedMul(disty, disty)); if (bounce == true && mass2 > 0) // Perform a Goomba Bounce. mobj1->momz = -mobj1->momz; @@ -1175,14 +1176,14 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) if (mass2 > 0) { - mobj1->momx = mobj1->momx - FixedMul(FixedMul(FixedDiv(2*mass2, mass1 + mass2), p), distx); - mobj1->momy = mobj1->momy - FixedMul(FixedMul(FixedDiv(2*mass2, mass1 + mass2), p), disty); + mobj1->momx = mobj1->momx - FixedMul(FixedMul(FixedDiv(2*mass2, mass1 + mass2), force), distx); + mobj1->momy = mobj1->momy - FixedMul(FixedMul(FixedDiv(2*mass2, mass1 + mass2), force), disty); } if (mass1 > 0 && solid == false) { - mobj2->momx = mobj2->momx - FixedMul(FixedMul(FixedDiv(2*mass1, mass1 + mass2), p), -distx); - mobj2->momy = mobj2->momy - FixedMul(FixedMul(FixedDiv(2*mass1, mass1 + mass2), p), -disty); + mobj2->momx = mobj2->momx - FixedMul(FixedMul(FixedDiv(2*mass1, mass1 + mass2), force), -distx); + mobj2->momy = mobj2->momy - FixedMul(FixedMul(FixedDiv(2*mass1, mass1 + mass2), force), -disty); } // Do the bump fx when we've CONFIRMED we can bump. From 75c606764fc80476fcab5f97c1e68e5bd8ba6489 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Mon, 18 Feb 2019 23:35:01 -0600 Subject: [PATCH 38/59] Make extra sure we launch in the correct direction --- src/k_kart.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index f8efff2bf..807c9ce72 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1114,9 +1114,9 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) momdifx = mobj1->momx - mobj2->momx; momdify = mobj1->momy - mobj2->momy; - // Adds the OTHER player's momentum, so that it reduces the chance of you being "inside" the other object - distx = (mobj1->x + mobj2->momx) - (mobj2->x + mobj1->momx); - disty = (mobj1->y + mobj2->momy) - (mobj2->y + mobj1->momy); + // Adds the OTHER player's momentum times a bunch, for the best chance of getting the correct direction + distx = (mobj1->x + mobj2->momx*3) - (mobj2->x + mobj1->momx*3); + disty = (mobj1->y + mobj2->momy*3) - (mobj2->y + mobj1->momy*3); if (distx == 0 && disty == 0) // if there's no distance between the 2, they're directly on top of each other, don't run this From daca5c9ae25ac1e6e40bccbe027e53d9d76390c2 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Mon, 18 Feb 2019 23:35:24 -0600 Subject: [PATCH 39/59] Fix players sometimes snapping backwards on landing after spikeball hits --- 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 807c9ce72..9887318ac 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5476,7 +5476,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } // Wipeout slowdown - if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow]) + if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow] && player->mo->friction > FRACUNIT/2) { if (player->kartstuff[k_offroad]) player->mo->friction -= 4912; From 8348821f30cc6d1d39ced0398279995da758c619 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Mon, 18 Feb 2019 23:39:08 -0600 Subject: [PATCH 40/59] Remove debugging print --- src/k_kart.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9887318ac..fded8b1c3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1130,11 +1130,6 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) distx = FixedMul(mobj1->radius+mobj2->radius, nx); disty = FixedMul(mobj1->radius+mobj2->radius, ny); - CONS_Printf("dist %f %f %d %d %d %d\n", - FIXED_TO_FLOAT(P_AproxDistance(distx, disty)), - FIXED_TO_FLOAT(P_AproxDistance(momdifx, momdify)), - mobj1->momx, mobj1->momy, mobj2->momx, mobj2->momy); - if (momdifx == 0 && momdify == 0) { // If there's no momentum difference, they're moving at exactly the same rate. Pretend they moved into each other. From 9fac26c200254c36d6d7add5cd7937f331d9bd62 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Tue, 19 Feb 2019 08:05:35 -0600 Subject: [PATCH 41/59] Fix cmd latency occasionally jumping to max --- src/g_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index f0d221ff6..3944c02aa 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2162,7 +2162,7 @@ void G_Ticker(boolean run) G_CopyTiccmd(cmd, &netcmds[buf][i], 1); // Use the leveltime sent in the player's ticcmd to determine control lag - cmd->latency = modeattacking ? 0 : min((leveltime & 0xFF) - cmd->latency, MAXPREDICTTICS-1); //@TODO add a cvar to allow setting this max + cmd->latency = modeattacking ? 0 : min(((leveltime & 0xFF) - cmd->latency) & 0xFF, MAXPREDICTTICS-1); //@TODO add a cvar to allow setting this max } } From 5e8236c74f1792a474285723f00f16ea58050be1 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Tue, 19 Feb 2019 16:04:23 -0600 Subject: [PATCH 42/59] Add null check too --- 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 2c913e101..e67de72b3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1979,7 +1979,7 @@ static void K_RemoveGrowShrink(player_t *player) { player->kartstuff[k_growshrinktimer] = 0; - if (!P_MobjWasRemoved(player->mo)) + if (player->mo && !P_MobjWasRemoved(player->mo)) { if (player->kartstuff[k_invincibilitytimer] == 0) player->mo->color = player->skincolor; From 0183368a6ca4de3a6cc57793ae87c57649268b5b Mon Sep 17 00:00:00 2001 From: fickleheart Date: Tue, 19 Feb 2019 16:46:48 -0600 Subject: [PATCH 43/59] Only apply friction changes on the ground --- 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 fded8b1c3..d63591e79 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5471,7 +5471,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } // Wipeout slowdown - if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow] && player->mo->friction > FRACUNIT/2) + if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow] && P_IsObjectOnGround(player->mo)) { if (player->kartstuff[k_offroad]) player->mo->friction -= 4912; From 4619e8ad82de080c9b14fdfe54bc98037d15934f Mon Sep 17 00:00:00 2001 From: fickleheart Date: Tue, 19 Feb 2019 17:05:04 -0600 Subject: [PATCH 44/59] Add check to all of the friction stuff --- src/k_kart.c | 63 +++++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index d63591e79..39f2a7149 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5440,43 +5440,46 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } } - // Friction - if (!player->kartstuff[k_offroad]) + if (onground) { - if (player->speed > 0 && cmd->forwardmove == 0 && player->mo->friction == 59392) - player->mo->friction += 4608; - if (player->speed > 0 && cmd->forwardmove < 0 && player->mo->friction == 59392) - player->mo->friction += 1608; - } + // Friction + if (!player->kartstuff[k_offroad]) + { + if (player->speed > 0 && cmd->forwardmove == 0 && player->mo->friction == 59392) + player->mo->friction += 4608; + if (player->speed > 0 && cmd->forwardmove < 0 && player->mo->friction == 59392) + player->mo->friction += 1608; + } - // Karma ice physics - if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) - { - player->mo->friction += 1228; + // Karma ice physics + if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) + { + player->mo->friction += 1228; - if (player->mo->friction > FRACUNIT) - player->mo->friction = FRACUNIT; - if (player->mo->friction < 0) - player->mo->friction = 0; + if (player->mo->friction > FRACUNIT) + player->mo->friction = FRACUNIT; + if (player->mo->friction < 0) + player->mo->friction = 0; - player->mo->movefactor = FixedDiv(ORIG_FRICTION, player->mo->friction); + player->mo->movefactor = FixedDiv(ORIG_FRICTION, player->mo->friction); - if (player->mo->movefactor < FRACUNIT) - player->mo->movefactor = 19*player->mo->movefactor - 18*FRACUNIT; - else - player->mo->movefactor = FRACUNIT; //player->mo->movefactor = ((player->mo->friction - 0xDB34)*(0xA))/0x80; + if (player->mo->movefactor < FRACUNIT) + player->mo->movefactor = 19*player->mo->movefactor - 18*FRACUNIT; + else + player->mo->movefactor = FRACUNIT; //player->mo->movefactor = ((player->mo->friction - 0xDB34)*(0xA))/0x80; - if (player->mo->movefactor < 32) - player->mo->movefactor = 32; - } + if (player->mo->movefactor < 32) + player->mo->movefactor = 32; + } - // Wipeout slowdown - if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow] && P_IsObjectOnGround(player->mo)) - { - if (player->kartstuff[k_offroad]) - player->mo->friction -= 4912; - if (player->kartstuff[k_wipeoutslow] == 1) - player->mo->friction -= 9824; + // Wipeout slowdown + if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow]) + { + if (player->kartstuff[k_offroad]) + player->mo->friction -= 4912; + if (player->kartstuff[k_wipeoutslow] == 1) + player->mo->friction -= 9824; + } } K_KartDrift(player, onground); From 733c472e1f862bfb1271e935cf9ecd5e390a8ac3 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Tue, 19 Feb 2019 18:52:57 -0600 Subject: [PATCH 45/59] Reorganization + kill old interfaces --- src/djgppdos/i_video.c | 5 ----- src/hu_stuff.c | 15 --------------- src/hu_stuff.h | 1 - src/screen.c | 13 +++++++++++++ src/screen.h | 1 + src/sdl/i_video.c | 8 +++----- src/sdl12/i_video.c | 5 ----- src/win32/win_vid.c | 5 ----- src/win32ce/win_vid.c | 5 ----- 9 files changed, 17 insertions(+), 41 deletions(-) diff --git a/src/djgppdos/i_video.c b/src/djgppdos/i_video.c index 69addfb04..612c72215 100644 --- a/src/djgppdos/i_video.c +++ b/src/djgppdos/i_video.c @@ -41,7 +41,6 @@ #include "../m_argv.h" #include "vid_vesa.h" #include "../i_video.h" -#include "../hu_stuff.h" //dosstuff -newly added @@ -94,10 +93,6 @@ void I_FinishUpdate (void) // draw FPS if enabled if (cv_ticrate.value) SCR_DisplayTicRate(); - - // this is now handled here so that wipes and other things don't overlap it for the sake of consistency. - // no additional checks are needed here, this function does them all so no need to worry. :) - HU_drawLocalPing(); //blast it to the screen // this code sucks diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 175c8bf33..1ae488863 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2199,21 +2199,6 @@ static void HU_DrawSongCredits(void) V_DrawRightAlignedThinString(cursongcredit.x, y, V_ALLOWLOWERCASE|V_6WIDTHSPACE|V_SNAPTOLEFT|(cursongcredit.trans< servermaxping)) // only show 2 (warning) if our ping is at a bad level - { - INT32 dispy = cv_ticrate.value ? 160 : 181; - HU_drawPing(307, dispy, ping, V_SNAPTORIGHT|V_SNAPTOBOTTOM); - } -} // Heads up displays drawer, call each frame // diff --git a/src/hu_stuff.h b/src/hu_stuff.h index 6788c701a..0f316bc78 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -109,7 +109,6 @@ void HU_Start(void); boolean HU_Responder(event_t *ev); void HU_Ticker(void); -void HU_drawLocalPing(void); void HU_Drawer(void); char HU_dequeueChatChar(void); void HU_Erase(void); diff --git a/src/screen.c b/src/screen.c index 937d6caa3..4de2abd05 100644 --- a/src/screen.c +++ b/src/screen.c @@ -434,3 +434,16 @@ void SCR_DisplayTicRate(void) lasttic = ontic; } + +// SCR_DisplayLocalPing +// Used to draw the user's local ping next to the framerate for a quick check without having to hold TAB for instance. By default, it only shows up if your ping is too high and risks getting you kicked. + +void SCR_DisplayLocalPing(void) +{ + UINT32 ping = playerpingtable[consoleplayer]; // consoleplayer's ping is everyone's ping in a splitnetgame :P + if (cv_showping.value == 1 || (cv_showping.value == 2 && ping > servermaxping)) // only show 2 (warning) if our ping is at a bad level + { + INT32 dispy = cv_ticrate.value ? 160 : 181; + HU_drawPing(307, dispy, ping, V_SNAPTORIGHT | V_SNAPTOBOTTOM); + } +} diff --git a/src/screen.h b/src/screen.h index 9ad254d3f..5b4a8e583 100644 --- a/src/screen.h +++ b/src/screen.h @@ -180,5 +180,6 @@ FUNCMATH boolean SCR_IsAspectCorrect(INT32 width, INT32 height); // move out to main code for consistency void SCR_DisplayTicRate(void); +void SCR_DisplayLocalPing(void); #undef DNWH #endif //__SCREEN_H__ diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 9e5e4b601..39a2c5ef1 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -67,7 +67,6 @@ #include "../i_sound.h" // midi pause/unpause #include "../i_joy.h" #include "../st_stuff.h" -#include "../hu_stuff.h" // ping drawer #include "../g_game.h" #include "../i_video.h" #include "../console.h" @@ -1361,10 +1360,9 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); - - // this is now handled here so that wipes and other things don't overlap it for the sake of consistency. - // no additional checks are needed here, this function does them all so no need to worry. :) - HU_drawLocalPing(); + + if (cv_showping.value && netgame && consoleplayer != serverplayer) + SCR_DisplayLocalPing(); if (rendermode == render_soft && screens[0]) { diff --git a/src/sdl12/i_video.c b/src/sdl12/i_video.c index 08e6bd947..69cf5ca9c 100644 --- a/src/sdl12/i_video.c +++ b/src/sdl12/i_video.c @@ -99,7 +99,6 @@ #include "../i_sound.h" // midi pause/unpause #include "../i_joy.h" #include "../st_stuff.h" -#include "../hu_stuff.h" #include "../g_game.h" #include "../i_video.h" #include "../console.h" @@ -1343,10 +1342,6 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); - - // this is now handled here so that wipes and other things don't overlap it for the sake of consistency. - // no additional checks are needed here, this function does them all so no need to worry. :) - HU_drawLocalPing(); if (render_soft == rendermode && screens[0]) { diff --git a/src/win32/win_vid.c b/src/win32/win_vid.c index cba0c209d..9f3d13f8f 100644 --- a/src/win32/win_vid.c +++ b/src/win32/win_vid.c @@ -28,7 +28,6 @@ #include "../m_argv.h" #include "../v_video.h" #include "../st_stuff.h" -#include "../hu_stuff.h" #include "../i_video.h" #include "../z_zone.h" #include "fabdxlib.h" @@ -366,10 +365,6 @@ void I_FinishUpdate(void) // display a graph of ticrate if (cv_ticrate.value) SCR_DisplayTicRate(); - - // this is now handled here so that wipes and other things don't overlap it for the sake of consistency. - // no additional checks are needed here, this function does them all so no need to worry. :) - HU_drawLocalPing(); // if (bDIBMode) diff --git a/src/win32ce/win_vid.c b/src/win32ce/win_vid.c index c6610fa0e..5e8e7e1fb 100644 --- a/src/win32ce/win_vid.c +++ b/src/win32ce/win_vid.c @@ -26,7 +26,6 @@ #include "../m_argv.h" #include "../v_video.h" #include "../st_stuff.h" -#include "../hu_stuff.h" #include "../i_video.h" #include "../z_zone.h" #include "fabdxlib.h" @@ -199,10 +198,6 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); - // this is now handled here so that wipes and other things don't overlap it for the sake of consistency. - // no additional checks are needed here, this function does them all so no need to worry. :) - HU_drawLocalPing(); - // if (bDIBMode) { From 8f276f77915033e487cdb0540b9e6b0cb289f65d Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Tue, 19 Feb 2019 18:54:24 -0600 Subject: [PATCH 46/59] ...remove this forgotten comment too while I'm at it. --- src/hu_stuff.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 1ae488863..a9aa7c566 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2312,10 +2312,6 @@ void HU_Drawer(void) V_DrawCenteredString(BASEVIDWIDTH/2, 180, V_YELLOWMAP | V_ALLOWLOWERCASE, resynch_text); } - - // draw the ping if the user wishes to - // THIS IS NOW HANDLED IN I_VIDEO - //HU_drawLocalPing(); } //====================================================================== From 69faafc3757c9094146b380d6bfa79440d3377c2 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Tue, 19 Feb 2019 19:26:32 -0600 Subject: [PATCH 47/59] Maybe this is a better way to work around the DrawMasked crash... --- src/r_things.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/r_things.c b/src/r_things.c index 52c92b028..d94001c92 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -651,7 +651,7 @@ void R_DrawMaskedColumn(column_t *column) basetexturemid = dc_texturemid; - for (; column && column->topdelta != 0xff ;) + for (; column->topdelta != 0xff ;) { // calculate unclipped screen coordinates // for post @@ -925,6 +925,13 @@ static void R_DrawVisSprite(vissprite_t *vis) if (vis->x2 >= vid.width) vis->x2 = vid.width-1; +#if 1 + // Something is occasionally setting 1px-wide sprites whose frac is exactly the width of the sprite, causing crashes due to + // accessing invalid column info. Until the cause is found, let's try to correct those manually... + while (frac + vis->xiscale*(vis->x2-vis->x1) > SHORT(patch->width)<x2 >= vis->x1) + vis->x2--; +#endif + for (dc_x = vis->x1; dc_x <= vis->x2; dc_x++, frac += vis->xiscale) { if (vis->scalestep) // currently papersprites only From 8a3fa4ebedf7298801e60c01e8d4e6065940e51c Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Tue, 19 Feb 2019 21:22:35 -0500 Subject: [PATCH 48/59] Some small changes. --- src/d_clisrv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index ea8077d6b..2054d1661 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2781,9 +2781,9 @@ static void Command_BanIP(void) if (I_SetBanAddress && I_SetBanAddress(address, NULL)) { if (reason) - CONS_Printf("Banned ip address %s for: %s\n", address, reason); + CONS_Printf("Banned IP address %s for: %s\n", address, reason); else - CONS_Printf("Banned ip address %s\n", address); + CONS_Printf("Banned IP address %s\n", address); Ban_Add(reason); D_SaveBan(); From e1d2ddf3cedf3f1e9d054b592871d550104497ac Mon Sep 17 00:00:00 2001 From: James Date: Tue, 19 Feb 2019 23:01:19 -0500 Subject: [PATCH 49/59] Wipeout particles come from back wheels --- src/k_kart.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 468f54381..5ccc969b1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2771,11 +2771,24 @@ void K_SpawnSparkleTrail(mobj_t *mo) void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent) { mobj_t *dust; + angle_t aoff; I_Assert(mo != NULL); I_Assert(!P_MobjWasRemoved(mo)); - dust = P_SpawnMobj(mo->x + (P_RandomRange(-25,25) * mo->scale), mo->y + (P_RandomRange(-25,25) * mo->scale), mo->z, MT_WIPEOUTTRAIL); + if (mo->player) + aoff = (mo->player->frameangle + ANGLE_180); + else + aoff = (mo->angle + ANGLE_180); + + if ((leveltime / 2) & 1) + aoff -= ANGLE_45; + else + aoff += ANGLE_45; + + dust = P_SpawnMobj(mo->x + FixedMul(24*mo->scale, FINECOSINE(aoff>>ANGLETOFINESHIFT)) + (P_RandomRange(-8,8) << FRACBITS), + mo->y + FixedMul(24*mo->scale, FINESINE(aoff>>ANGLETOFINESHIFT)) + (P_RandomRange(-8,8) << FRACBITS), + mo->z, MT_WIPEOUTTRAIL); P_SetTarget(&dust->target, mo); dust->angle = R_PointToAngle2(0,0,mo->momx,mo->momy); From e23f1e66b4cc6579edcd46c7707dad09f8f2ab49 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Tue, 19 Feb 2019 22:21:07 -0600 Subject: [PATCH 50/59] Hold on, this works. --- src/r_things.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/r_things.c b/src/r_things.c index d94001c92..e4eaf4130 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -925,13 +925,6 @@ static void R_DrawVisSprite(vissprite_t *vis) if (vis->x2 >= vid.width) vis->x2 = vid.width-1; -#if 1 - // Something is occasionally setting 1px-wide sprites whose frac is exactly the width of the sprite, causing crashes due to - // accessing invalid column info. Until the cause is found, let's try to correct those manually... - while (frac + vis->xiscale*(vis->x2-vis->x1) > SHORT(patch->width)<x2 >= vis->x1) - vis->x2--; -#endif - for (dc_x = vis->x1; dc_x <= vis->x2; dc_x++, frac += vis->xiscale) { if (vis->scalestep) // currently papersprites only @@ -1321,7 +1314,7 @@ static void R_ProjectSprite(mobj_t *thing) if (max(tz, tz2) < FixedMul(MINZ, this_scale)) // non-papersprite clipping is handled earlier return; - scalestep = (yscale2 - yscale)/(x2 - x1); + scalestep = (yscale2 - yscale)/(x2 - x1) ?: 1; // The following two are alternate sorting methods which might be more applicable in some circumstances. TODO - maybe enable via MF2? // sortscale = max(yscale, yscale2); From 45e9e3f7f96727b54afa8b0046a80d074ad877e9 Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Thu, 21 Feb 2019 18:48:42 -0500 Subject: [PATCH 51/59] Disable multi statement macros errors. --- src/Makefile.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Makefile.cfg b/src/Makefile.cfg index 1238050b3..9e624cc76 100644 --- a/src/Makefile.cfg +++ b/src/Makefile.cfg @@ -228,6 +228,7 @@ ifdef GCC80 WFLAGS+=-Wno-format-overflow WFLAGS+=-Wno-stringop-truncation WFLAGS+=-Wno-stringop-overflow + WFLAGS+=-Wno-error=multistatement-macros endif From f8928300ec4e45553e7066e806be0569bea03772 Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 22 Feb 2019 15:57:44 -0800 Subject: [PATCH 52/59] Rename splitscreen member to something more meaningful --- src/d_clisrv.c | 6 +++--- src/d_clisrv.h | 2 +- src/d_player.h | 2 +- src/g_game.c | 6 +++--- src/lua_playerlib.c | 6 +++--- src/p_saveg.c | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 0aec7fd99..bf9c16950 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -648,7 +648,7 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->jointime = (tic_t)LONG(players[i].jointime); - rsp->splitscreen = players[i].splitscreen; + rsp->splitscreenindex = players[i].splitscreenindex; rsp->hasmo = false; //Transfer important mo information if the player has a body. @@ -785,7 +785,7 @@ static void resynch_read_player(resynch_pak *rsp) players[i].jointime = (tic_t)LONG(rsp->jointime); - players[i].splitscreen = rsp->splitscreen; + players[i].splitscreenindex = rsp->splitscreenindex; //We get a packet for each player in game. if (!playeringame[i]) @@ -3320,7 +3320,7 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum) addedtogame = true; } - players[newplayernum].splitscreen = splitscreenplayer; + players[newplayernum].splitscreenindex = splitscreenplayer; if (netgame) { diff --git a/src/d_clisrv.h b/src/d_clisrv.h index b628606d0..5dc487539 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -283,7 +283,7 @@ typedef struct tic_t jointime; - UINT8 splitscreen; + UINT8 splitscreenindex; //player->mo stuff UINT8 hasmo; // Boolean diff --git a/src/d_player.h b/src/d_player.h index baed9a721..a5d73ec70 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -572,7 +572,7 @@ typedef struct player_s tic_t jointime; // Timer when player joins game to change skin/color - UINT8 splitscreen; + UINT8 splitscreenindex; #ifdef HWRENDER fixed_t fovadd; // adjust FOV for hw rendering #endif diff --git a/src/g_game.c b/src/g_game.c index eb0396c84..d04bbf6bc 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2357,7 +2357,7 @@ void G_PlayerReborn(INT32 player) UINT8 skincolor; INT32 skin; tic_t jointime; - UINT8 psplitscreen; + UINT8 splitscreenindex; boolean spectator; INT16 bot; SINT8 pity; @@ -2381,7 +2381,7 @@ void G_PlayerReborn(INT32 player) ctfteam = players[player].ctfteam; exiting = players[player].exiting; jointime = players[player].jointime; - psplitscreen = players[player].splitscreen; + splitscreenindex = players[player].splitscreenindex; spectator = players[player].spectator; pflags = (players[player].pflags & (PF_TIMEOVER|PF_FLIPCAM|PF_TAGIT|PF_TAGGED|PF_ANALOGMODE|PF_WANTSTOJOIN)); @@ -2478,7 +2478,7 @@ void G_PlayerReborn(INT32 player) p->pflags = pflags; p->ctfteam = ctfteam; p->jointime = jointime; - p->splitscreen = psplitscreen; + p->splitscreenindex = splitscreenindex; p->spectator = spectator; // save player config truth reborn diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 0bea1e7b9..1c37f4c45 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -325,8 +325,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->bot); else if (fastcmp(field,"jointime")) lua_pushinteger(L, plr->jointime); - else if (fastcmp(field,"splitscreen")) - lua_pushinteger(L, plr->splitscreen); + else if (fastcmp(field,"splitscreenindex")) + lua_pushinteger(L, plr->splitscreenindex); #ifdef HWRENDER else if (fastcmp(field,"fovadd")) lua_pushfixed(L, plr->fovadd); @@ -615,7 +615,7 @@ static int player_set(lua_State *L) return NOSET; else if (fastcmp(field,"jointime")) plr->jointime = (tic_t)luaL_checkinteger(L, 3); - else if (fastcmp(field,"splitscreen")) + else if (fastcmp(field,"splitscreenindex")) return NOSET; #ifdef HWRENDER else if (fastcmp(field,"fovadd")) diff --git a/src/p_saveg.c b/src/p_saveg.c index a2ae8f174..5a43745b0 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -249,7 +249,7 @@ static void P_NetArchivePlayers(void) WRITEUINT32(save_p, players[i].jointime); - WRITEUINT8(save_p, players[i].splitscreen); + WRITEUINT8(save_p, players[i].splitscreenindex); WRITEUINT16(save_p, flags); @@ -428,7 +428,7 @@ static void P_NetUnArchivePlayers(void) players[i].jointime = READUINT32(save_p); - players[i].splitscreen = READUINT8(save_p); + players[i].splitscreenindex = READUINT8(save_p); flags = READUINT16(save_p); From a13d177a44379b18c37abbddb896f804b4f9e7fa Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Fri, 22 Feb 2019 19:07:54 -0500 Subject: [PATCH 53/59] Add parentheses --- src/g_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index e2a59969d..71906027c 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4767,7 +4767,7 @@ void G_WriteGhostTic(mobj_t *ghost) if (abs(ghost->x-oldghost.x) > MAXMOM || abs(ghost->y-oldghost.y) > MAXMOM || abs(ghost->z-oldghost.z) > MAXMOM - || leveltime & 255 == 1) // Hack to enable slightly nicer resyncing + || (leveltime & 255 == 1)) // Hack to enable slightly nicer resyncing { oldghost.x = ghost->x; oldghost.y = ghost->y; From c257c83ff1ff98e7fe07f88c4c2c050715188805 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Fri, 22 Feb 2019 19:11:50 -0500 Subject: [PATCH 54/59] Add parentheses 2: Move parentheses --- src/g_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 71906027c..0a19ec8f5 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4767,7 +4767,7 @@ void G_WriteGhostTic(mobj_t *ghost) if (abs(ghost->x-oldghost.x) > MAXMOM || abs(ghost->y-oldghost.y) > MAXMOM || abs(ghost->z-oldghost.z) > MAXMOM - || (leveltime & 255 == 1)) // Hack to enable slightly nicer resyncing + || (leveltime & 255) == 1) // Hack to enable slightly nicer resyncing { oldghost.x = ghost->x; oldghost.y = ghost->y; From 277216af2b767abca83ba6d7be8c4a410679eaf9 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Fri, 22 Feb 2019 18:13:22 -0600 Subject: [PATCH 55/59] I don't think these old interfaces even compile but let's not kill them off --- src/djgppdos/i_video.c | 3 +++ src/sdl12/i_video.c | 3 +++ src/win32/win_vid.c | 3 +++ src/win32ce/win_vid.c | 3 +++ 4 files changed, 12 insertions(+) diff --git a/src/djgppdos/i_video.c b/src/djgppdos/i_video.c index 612c72215..7829acbb9 100644 --- a/src/djgppdos/i_video.c +++ b/src/djgppdos/i_video.c @@ -94,6 +94,9 @@ void I_FinishUpdate (void) if (cv_ticrate.value) SCR_DisplayTicRate(); + if (cv_showping.value && netgame && consoleplayer != serverplayer) + SCR_DisplayLocalPing(); + //blast it to the screen // this code sucks //memcpy(dascreen,screens[0],screenwidth*screenheight); diff --git a/src/sdl12/i_video.c b/src/sdl12/i_video.c index 69cf5ca9c..a2a20c611 100644 --- a/src/sdl12/i_video.c +++ b/src/sdl12/i_video.c @@ -1343,6 +1343,9 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); + if (cv_showping.value && netgame && consoleplayer != serverplayer) + SCR_DisplayLocalPing(); + if (render_soft == rendermode && screens[0]) { SDL_Rect *dstrect = NULL; diff --git a/src/win32/win_vid.c b/src/win32/win_vid.c index 9f3d13f8f..45f96e9d4 100644 --- a/src/win32/win_vid.c +++ b/src/win32/win_vid.c @@ -366,6 +366,9 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); + if (cv_showping.value && netgame && consoleplayer != serverplayer) + SCR_DisplayLocalPing(); + // if (bDIBMode) { diff --git a/src/win32ce/win_vid.c b/src/win32ce/win_vid.c index 5e8e7e1fb..244dfaf3e 100644 --- a/src/win32ce/win_vid.c +++ b/src/win32ce/win_vid.c @@ -198,6 +198,9 @@ void I_FinishUpdate(void) if (cv_ticrate.value) SCR_DisplayTicRate(); + if (cv_showping.value && netgame && consoleplayer != serverplayer) + SCR_DisplayLocalPing(); + // if (bDIBMode) { From e741c3a0d62f6704adb167dd6532bd01e79124e8 Mon Sep 17 00:00:00 2001 From: Alam Arias Date: Fri, 22 Feb 2019 21:04:53 -0500 Subject: [PATCH 56/59] if you going to use abs(), you need to work in signed types --- src/g_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 0a19ec8f5..842ac1a76 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4896,7 +4896,7 @@ void G_WriteGhostTic(mobj_t *ghost) void G_ConsGhostTic(void) { UINT8 ziptic; - UINT32 px,py,pz,gx,gy,gz; + fixed_t px,py,pz,gx,gy,gz; mobj_t *testmo; UINT32 syncleeway; boolean nightsfail = false; From c170be005157fba5f83f3317a71738c3f0ae604e Mon Sep 17 00:00:00 2001 From: Alam Arias Date: Fri, 22 Feb 2019 21:13:00 -0500 Subject: [PATCH 57/59] signed and unsigned compare --- src/g_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 842ac1a76..003c11e94 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4898,7 +4898,7 @@ void G_ConsGhostTic(void) UINT8 ziptic; fixed_t px,py,pz,gx,gy,gz; mobj_t *testmo; - UINT32 syncleeway; + fixed_t syncleeway; boolean nightsfail = false; if (!demo_p || !demo_start) From a3c48d7c40cd326ce956f2c72298c1e3f8e06bef Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Fri, 22 Feb 2019 22:49:27 -0500 Subject: [PATCH 58/59] Update item table Not looking forward to testing... --- src/k_kart.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index c8c1e1e54..93ef33db3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -496,20 +496,20 @@ boolean K_IsPlayerWanted(player_t *player) static INT32 K_KartItemOddsRace[NUMKARTRESULTS][10] = { //P-Odds 0 1 2 3 4 5 6 7 8 9 - /*Sneaker*/ {20, 0, 0, 4, 6, 6, 0, 0, 0, 0 }, // Sneaker - /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 1, 3, 5, 3, 0 }, // Rocket Sneaker - /*Invincibility*/ { 0, 0, 0, 0, 0, 1, 4, 6,14, 0 }, // Invincibility - /*Banana*/ { 0,10, 4, 2, 1, 0, 0, 0, 0, 0 }, // Banana + /*Sneaker*/ {20, 0, 0, 4, 7, 7, 0, 0, 0, 0 }, // Sneaker + /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 1, 4, 5, 3, 0 }, // Rocket Sneaker + /*Invincibility*/ { 0, 0, 0, 0, 0, 1, 4, 6,10, 0 }, // Invincibility + /*Banana*/ { 0, 9, 4, 2, 1, 0, 0, 0, 0, 0 }, // Banana /*Eggman Monitor*/ { 0, 3, 2, 1, 0, 0, 0, 0, 0, 0 }, // Eggman Monitor - /*Orbinaut*/ { 0, 8, 6, 4, 2, 0, 0, 0, 0, 0 }, // Orbinaut + /*Orbinaut*/ { 0, 7, 6, 4, 2, 0, 0, 0, 0, 0 }, // Orbinaut /*Jawz*/ { 0, 0, 3, 2, 1, 1, 0, 0, 0, 0 }, // Jawz /*Mine*/ { 0, 0, 2, 2, 1, 0, 0, 0, 0, 0 }, // Mine /*Ballhog*/ { 0, 0, 0, 2, 1, 0, 0, 0, 0, 0 }, // Ballhog /*Self-Propelled Bomb*/ { 0, 0, 1, 2, 3, 4, 2, 2, 0,20 }, // Self-Propelled Bomb - /*Grow*/ { 0, 0, 0, 0, 0, 1, 3, 5, 3, 0 }, // Grow + /*Grow*/ { 0, 0, 0, 0, 0, 0, 2, 5, 7, 0 }, // Grow /*Shrink*/ { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, // Shrink /*Thunder Shield*/ { 0, 1, 2, 0, 0, 0, 0, 0, 0, 0 }, // Thunder Shield - /*Hyudoro*/ { 0, 0, 0, 0, 1, 2, 1, 0, 0, 0 }, // Hyudoro + /*Hyudoro*/ { 0, 0, 0, 0, 0, 2, 1, 0, 0, 0 }, // Hyudoro /*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring /*Kitchen Sink*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Kitchen Sink /*Sneaker x3*/ { 0, 0, 0, 0, 3, 7, 9, 2, 0, 0 }, // Sneaker x3 From de4eddb98e8e942d9d630ef39e151c9618241145 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Fri, 22 Feb 2019 22:50:13 -0500 Subject: [PATCH 59/59] Revert this minor change --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 93ef33db3..d49b4f4d9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -496,7 +496,7 @@ boolean K_IsPlayerWanted(player_t *player) static INT32 K_KartItemOddsRace[NUMKARTRESULTS][10] = { //P-Odds 0 1 2 3 4 5 6 7 8 9 - /*Sneaker*/ {20, 0, 0, 4, 7, 7, 0, 0, 0, 0 }, // Sneaker + /*Sneaker*/ {20, 0, 0, 4, 6, 7, 0, 0, 0, 0 }, // Sneaker /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 1, 4, 5, 3, 0 }, // Rocket Sneaker /*Invincibility*/ { 0, 0, 0, 0, 0, 1, 4, 6,10, 0 }, // Invincibility /*Banana*/ { 0, 9, 4, 2, 1, 0, 0, 0, 0, 0 }, // Banana @@ -509,7 +509,7 @@ static INT32 K_KartItemOddsRace[NUMKARTRESULTS][10] = /*Grow*/ { 0, 0, 0, 0, 0, 0, 2, 5, 7, 0 }, // Grow /*Shrink*/ { 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, // Shrink /*Thunder Shield*/ { 0, 1, 2, 0, 0, 0, 0, 0, 0, 0 }, // Thunder Shield - /*Hyudoro*/ { 0, 0, 0, 0, 0, 2, 1, 0, 0, 0 }, // Hyudoro + /*Hyudoro*/ { 0, 0, 0, 0, 1, 2, 1, 0, 0, 0 }, // Hyudoro /*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring /*Kitchen Sink*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Kitchen Sink /*Sneaker x3*/ { 0, 0, 0, 0, 3, 7, 9, 2, 0, 0 }, // Sneaker x3