mirror of
				https://github.com/KartKrewDev/RingRacers.git
				synced 2025-10-30 08:01:28 +00:00 
			
		
		
		
	Merge branch '2122-version' into execversion-filtercontrols
This commit is contained in:
		
						commit
						98b59f3f9d
					
				
					 64 changed files with 796 additions and 1615 deletions
				
			
		| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
cmake_minimum_required(VERSION 3.0)
 | 
			
		||||
project(SRB2
 | 
			
		||||
	VERSION 2.1.21
 | 
			
		||||
	VERSION 2.1.22
 | 
			
		||||
	LANGUAGES C)
 | 
			
		||||
 | 
			
		||||
if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
version: 2.1.21.{branch}-{build}
 | 
			
		||||
version: 2.1.22.{branch}-{build}
 | 
			
		||||
os: MinGW
 | 
			
		||||
 | 
			
		||||
environment:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										4
									
								
								debian/changelog
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								debian/changelog
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
srb2 (2.1.21~9) trusty; urgency=high
 | 
			
		||||
srb2 (2.1.22~9) trusty; urgency=high
 | 
			
		||||
 | 
			
		||||
  * SRB2 v2.1.21 release
 | 
			
		||||
  * SRB2 v2.1.22 release
 | 
			
		||||
 | 
			
		||||
 -- Marco Zafra <marco.a.zafra@gmail.com>  Mon, 27 Nov 2018 16:45:00 -0500
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										4
									
								
								debian/control
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								debian/control
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -18,7 +18,7 @@ Homepage: http://www.srb2.org
 | 
			
		|||
 | 
			
		||||
Package: srb2
 | 
			
		||||
Architecture: any
 | 
			
		||||
Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (>= 2.1.15), srb2-data (<= 2.1.21)
 | 
			
		||||
Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (>= 2.1.15), srb2-data (<= 2.1.22)
 | 
			
		||||
Description: A cross-platform 3D Sonic fangame
 | 
			
		||||
 Sonic Robo Blast 2 is a 3D open-source Sonic the Hedgehog
 | 
			
		||||
 fangame built using a modified version of the Doom Legacy
 | 
			
		||||
| 
						 | 
				
			
			@ -31,7 +31,7 @@ Description: A cross-platform 3D Sonic fangame
 | 
			
		|||
Package: srb2-dbg
 | 
			
		||||
Architecture: any
 | 
			
		||||
# FIXME: should be Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.14), srb2 but dh_shlibdeps is being an asshat
 | 
			
		||||
Depends: libc6, ${misc:Depends}, srb2-data (>= 2.1.15), srb2-data (<= 2.1.21), srb2
 | 
			
		||||
Depends: libc6, ${misc:Depends}, srb2-data (>= 2.1.15), srb2-data (<= 2.1.22), srb2
 | 
			
		||||
Description: A cross-platform 3D Sonic fangame
 | 
			
		||||
 Sonic Robo Blast 2 is a 3D open-source Sonic the Hedgehog
 | 
			
		||||
 fangame built using a modified version of the Doom Legacy
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								debian/rules
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								debian/rules
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -59,6 +59,7 @@ DBGNAME	= debug/$(EXENAME)
 | 
			
		|||
 | 
			
		||||
PKGDIR	= usr/games/SRB2
 | 
			
		||||
DBGDIR	= usr/lib/debug/$(PKGDIR)
 | 
			
		||||
LINKDIR = usr/games
 | 
			
		||||
PIXMAPS_DIR = usr/share/pixmaps
 | 
			
		||||
DESKTOP_DIR = usr/share/applications
 | 
			
		||||
PREFIX	= $(shell test "$(CROSS_COMPILE_BUILD)" != "$(CROSS_COMPILE_HOST)" && echo "PREFIX=$(CROSS_COMPILE_HOST)")
 | 
			
		||||
| 
						 | 
				
			
			@ -133,7 +134,7 @@ binary-arch:
 | 
			
		|||
	# dh_installcron
 | 
			
		||||
	# dh_installinfo
 | 
			
		||||
	# dh_installman
 | 
			
		||||
	# dh_link
 | 
			
		||||
	dh_link $(PKGDIR)/$(EXENAME) $(LINKDIR)/$(EXENAME)
 | 
			
		||||
	dh_compress
 | 
			
		||||
	dh_fixperms
 | 
			
		||||
	# dh_perl
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -112,9 +112,7 @@ ifndef GCC295
 | 
			
		|||
 WFLAGS+=-Wno-div-by-zero
 | 
			
		||||
endif
 | 
			
		||||
#WFLAGS+=-Wsystem-headers
 | 
			
		||||
ifndef ERRORMODE
 | 
			
		||||
#WFLAGS+=-Wfloat-equal
 | 
			
		||||
endif
 | 
			
		||||
WFLAGS+=-Wfloat-equal
 | 
			
		||||
#WFLAGS+=-Wtraditional
 | 
			
		||||
ifdef VCHELP
 | 
			
		||||
 WFLAGS+=-Wdeclaration-after-statement
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										348
									
								
								src/am_map.c
									
										
									
									
									
								
							
							
						
						
									
										348
									
								
								src/am_map.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -11,8 +11,8 @@
 | 
			
		|||
/// \file  am_map.c
 | 
			
		||||
/// \brief Code for the 'automap', former Doom feature used for DEVMODE testing
 | 
			
		||||
 | 
			
		||||
#include "g_game.h"
 | 
			
		||||
#include "am_map.h"
 | 
			
		||||
#include "g_game.h"
 | 
			
		||||
#include "g_input.h"
 | 
			
		||||
#include "p_local.h"
 | 
			
		||||
#include "p_slopes.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +33,6 @@ static const UINT8 GRAYSRANGE  = 16;
 | 
			
		|||
static const UINT8 BROWNS      = (3*16);
 | 
			
		||||
static const UINT8 YELLOWS     = (7*16);
 | 
			
		||||
static const UINT8 GREENS      = (10*16);
 | 
			
		||||
static const UINT8 GREENRANGE  = 16;
 | 
			
		||||
static const UINT8 DBLACK      = 31;
 | 
			
		||||
static const UINT8 DWHITE      = 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -50,8 +49,6 @@ static const UINT8 NOCLIMBYELLOWS     = (11*16);
 | 
			
		|||
 | 
			
		||||
// Automap colors
 | 
			
		||||
#define BACKGROUND            DBLACK
 | 
			
		||||
#define YOURCOLORS            DWHITE
 | 
			
		||||
#define YOURRANGE             0
 | 
			
		||||
#define WALLCOLORS            (REDS + REDRANGE/2)
 | 
			
		||||
#define WALLRANGE             (REDRANGE/2)
 | 
			
		||||
#define NOCLIMBWALLCOLORS     (NOCLIMBREDS + NOCLIMBREDRANGE/2)
 | 
			
		||||
| 
						 | 
				
			
			@ -68,31 +65,23 @@ static const UINT8 NOCLIMBYELLOWS     = (11*16);
 | 
			
		|||
#define CDWALLCOLORS          YELLOWS
 | 
			
		||||
#define NOCLIMBCDWALLCOLORS   NOCLIMBYELLOWS
 | 
			
		||||
#define THINGCOLORS           GREENS
 | 
			
		||||
#define THINGRANGE            GREENRANGE
 | 
			
		||||
#define SECRETWALLCOLORS      WALLCOLORS
 | 
			
		||||
#define SECRETWALLRANGE       WALLRANGE
 | 
			
		||||
#define GRIDCOLORS            (GRAYS + GRAYSRANGE/2)
 | 
			
		||||
#define GRIDRANGE             0
 | 
			
		||||
#define XHAIRCOLORS           GRAYS
 | 
			
		||||
 | 
			
		||||
// drawing stuff
 | 
			
		||||
#define FB 0
 | 
			
		||||
 | 
			
		||||
#define AM_PANDOWNKEY   KEY_DOWNARROW
 | 
			
		||||
// controls
 | 
			
		||||
#define AM_PANUPKEY     KEY_UPARROW
 | 
			
		||||
#define AM_PANRIGHTKEY  KEY_RIGHTARROW
 | 
			
		||||
#define AM_PANDOWNKEY   KEY_DOWNARROW
 | 
			
		||||
#define AM_PANLEFTKEY   KEY_LEFTARROW
 | 
			
		||||
#define AM_PANRIGHTKEY  KEY_RIGHTARROW
 | 
			
		||||
 | 
			
		||||
#define AM_ZOOMINKEY    '='
 | 
			
		||||
#define AM_ZOOMOUTKEY   '-'
 | 
			
		||||
#define AM_STARTKEY     KEY_TAB
 | 
			
		||||
#define AM_ENDKEY       KEY_TAB
 | 
			
		||||
#define AM_GOBIGKEY     '0'
 | 
			
		||||
 | 
			
		||||
#define AM_FOLLOWKEY    'f'
 | 
			
		||||
#define AM_GRIDKEY      'g'
 | 
			
		||||
#define AM_MARKKEY      'm'
 | 
			
		||||
#define AM_CLEARMARKKEY 'c'
 | 
			
		||||
 | 
			
		||||
#define AM_NUMMARKPOINTS 10
 | 
			
		||||
#define AM_TOGGLEKEY    KEY_TAB
 | 
			
		||||
 | 
			
		||||
// scale on entry
 | 
			
		||||
#define INITSCALEMTOF (FRACUNIT/5)
 | 
			
		||||
| 
						 | 
				
			
			@ -113,6 +102,9 @@ static const UINT8 NOCLIMBYELLOWS     = (11*16);
 | 
			
		|||
#define CXMTOF(x) (f_x + MTOF((x)-m_x))
 | 
			
		||||
#define CYMTOF(y) (f_y + (f_h - MTOF((y)-m_y)))
 | 
			
		||||
 | 
			
		||||
#define MAPBITS (FRACBITS-4)
 | 
			
		||||
#define FRACTOMAPBITS (FRACBITS-MAPBITS)
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	fixed_t x, y;
 | 
			
		||||
| 
						 | 
				
			
			@ -133,7 +125,10 @@ typedef struct
 | 
			
		|||
// A line drawing of the player pointing right,
 | 
			
		||||
//   starting from the middle.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#define PLAYERRADIUS (16*(1<<MAPBITS))
 | 
			
		||||
#define R ((8*PLAYERRADIUS)/7)
 | 
			
		||||
 | 
			
		||||
static const mline_t player_arrow[] = {
 | 
			
		||||
	{ { -R+R/8, 0 }, { R, 0 } }, // -----
 | 
			
		||||
	{ { R, 0 }, { R-R/2, R/4 } }, // ----->
 | 
			
		||||
| 
						 | 
				
			
			@ -166,27 +161,15 @@ static const mline_t thintriangle_guy[] = {
 | 
			
		|||
#undef R
 | 
			
		||||
#define NUMTHINTRIANGLEGUYLINES (sizeof (thintriangle_guy)/sizeof (mline_t))
 | 
			
		||||
 | 
			
		||||
static INT32 bigstate; //added : 24-01-98 : moved here, toggle between
 | 
			
		||||
                     // user view and large view (full map view)
 | 
			
		||||
 | 
			
		||||
static INT32 grid = 0;
 | 
			
		||||
 | 
			
		||||
static INT32 leveljuststarted = 1; // kluge until AM_LevelInit() is called
 | 
			
		||||
static boolean bigstate;	// user view and large view (full map view)
 | 
			
		||||
static boolean draw_grid = false;
 | 
			
		||||
 | 
			
		||||
boolean automapactive = false;
 | 
			
		||||
boolean am_recalc = false; //added : 05-02-98 : true when screen size changes
 | 
			
		||||
static boolean am_stopped = true;
 | 
			
		||||
 | 
			
		||||
// location of window on screen
 | 
			
		||||
static INT32 f_x;
 | 
			
		||||
static INT32 f_y;
 | 
			
		||||
 | 
			
		||||
// size of window on screen
 | 
			
		||||
static INT32 f_w;
 | 
			
		||||
static INT32 f_h;
 | 
			
		||||
 | 
			
		||||
static INT32 lightlev; // used for funky strobing effect
 | 
			
		||||
static UINT8 *fb; // pseudo-frame buffer
 | 
			
		||||
static INT32 amclock;
 | 
			
		||||
static INT32 f_x, f_y;	// location of window on screen (always zero for both)
 | 
			
		||||
static INT32 f_w, f_h;	// size of window on screen (always the screen width and height respectively)
 | 
			
		||||
 | 
			
		||||
static mpoint_t m_paninc; // how far the window pans each tic (map coords)
 | 
			
		||||
static fixed_t mtof_zoommul; // how far the window zooms in each tic (map coords)
 | 
			
		||||
| 
						 | 
				
			
			@ -210,11 +193,6 @@ static fixed_t max_y;
 | 
			
		|||
static fixed_t max_w; // max_x-min_x,
 | 
			
		||||
static fixed_t max_h; // max_y-min_y
 | 
			
		||||
 | 
			
		||||
// based on player size
 | 
			
		||||
static fixed_t min_w;
 | 
			
		||||
static fixed_t min_h;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static fixed_t min_scale_mtof; // used to tell when to stop zooming out
 | 
			
		||||
static fixed_t max_scale_mtof; // used to tell when to stop zooming in
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -232,13 +210,7 @@ static fixed_t scale_ftom;
 | 
			
		|||
 | 
			
		||||
static player_t *plr; // the player represented by an arrow
 | 
			
		||||
 | 
			
		||||
static patch_t *marknums[10];                   // numbers used for marking by the automap
 | 
			
		||||
static mpoint_t markpoints[AM_NUMMARKPOINTS];   // where the points are
 | 
			
		||||
static INT32 markpointnum = 0;                    // next point to be assigned
 | 
			
		||||
 | 
			
		||||
static INT32 followplayer = 1; // specifies whether to follow the player around
 | 
			
		||||
 | 
			
		||||
static boolean stopped = true;
 | 
			
		||||
static INT32 followplayer = true; // specifies whether to follow the player around
 | 
			
		||||
 | 
			
		||||
// function for drawing lines, depends on rendermode
 | 
			
		||||
typedef void (*AMDRAWFLINEFUNC) (const fline_t *fl, INT32 color);
 | 
			
		||||
| 
						 | 
				
			
			@ -277,8 +249,8 @@ static inline void AM_restoreScaleAndLoc(void)
 | 
			
		|||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		m_x = plr->mo->x - m_w/2;
 | 
			
		||||
		m_y = plr->mo->y - m_h/2;
 | 
			
		||||
		m_x = (plr->mo->x >> FRACTOMAPBITS) - m_w/2;
 | 
			
		||||
		m_y = (plr->mo->y >> FRACTOMAPBITS) - m_h/2;
 | 
			
		||||
	}
 | 
			
		||||
	m_x2 = m_x + m_w;
 | 
			
		||||
	m_y2 = m_y + m_h;
 | 
			
		||||
| 
						 | 
				
			
			@ -288,15 +260,6 @@ static inline void AM_restoreScaleAndLoc(void)
 | 
			
		|||
	scale_ftom = FixedDiv(FRACUNIT, scale_mtof);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Adds a marker at the current location.
 | 
			
		||||
  */
 | 
			
		||||
static inline void AM_addMark(void)
 | 
			
		||||
{
 | 
			
		||||
	markpoints[markpointnum].x = m_x + m_w/2;
 | 
			
		||||
	markpoints[markpointnum].y = m_y + m_h/2;
 | 
			
		||||
	markpointnum = (markpointnum + 1) % AM_NUMMARKPOINTS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Determines the bounding box around all vertices.
 | 
			
		||||
  * This is used to set global variables controlling the zoom range.
 | 
			
		||||
  */
 | 
			
		||||
| 
						 | 
				
			
			@ -322,11 +285,8 @@ static void AM_findMinMaxBoundaries(void)
 | 
			
		|||
			max_y = vertexes[i].y;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	max_w = max_x - min_x;
 | 
			
		||||
	max_h = max_y - min_y;
 | 
			
		||||
 | 
			
		||||
	min_w = 2*PLAYERRADIUS; // const? never changed?
 | 
			
		||||
	min_h = 2*PLAYERRADIUS;
 | 
			
		||||
	max_w = (max_x >>= FRACTOMAPBITS) - (min_x >>= FRACTOMAPBITS);
 | 
			
		||||
	max_h = (max_y >>= FRACTOMAPBITS) - (min_y >>= FRACTOMAPBITS);
 | 
			
		||||
 | 
			
		||||
	a = FixedDiv(f_w<<FRACBITS, max_w);
 | 
			
		||||
	b = FixedDiv(f_h<<FRACBITS, max_h);
 | 
			
		||||
| 
						 | 
				
			
			@ -339,7 +299,7 @@ static void AM_changeWindowLoc(void)
 | 
			
		|||
{
 | 
			
		||||
	if (m_paninc.x || m_paninc.y)
 | 
			
		||||
	{
 | 
			
		||||
		followplayer = 0;
 | 
			
		||||
		followplayer = false;
 | 
			
		||||
		f_oldloc.x = INT32_MAX;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -365,11 +325,7 @@ static void AM_initVariables(void)
 | 
			
		|||
	INT32 pnum;
 | 
			
		||||
 | 
			
		||||
	automapactive = true;
 | 
			
		||||
	fb = screens[0];
 | 
			
		||||
 | 
			
		||||
	f_oldloc.x = INT32_MAX;
 | 
			
		||||
	amclock = 0;
 | 
			
		||||
	lightlev = 0;
 | 
			
		||||
 | 
			
		||||
	m_paninc.x = m_paninc.y = 0;
 | 
			
		||||
	ftom_zoommul = FRACUNIT;
 | 
			
		||||
| 
						 | 
				
			
			@ -385,8 +341,11 @@ static void AM_initVariables(void)
 | 
			
		|||
				break;
 | 
			
		||||
 | 
			
		||||
	plr = &players[pnum];
 | 
			
		||||
	m_x = plr->mo->x - m_w/2;
 | 
			
		||||
	m_y = plr->mo->y - m_h/2;
 | 
			
		||||
	if (plr != NULL && plr->mo != NULL)
 | 
			
		||||
	{
 | 
			
		||||
		m_x = (plr->mo->x >> FRACTOMAPBITS) - m_w/2;
 | 
			
		||||
		m_y = (plr->mo->y >> FRACTOMAPBITS) - m_h/2;
 | 
			
		||||
	}
 | 
			
		||||
	AM_changeWindowLoc();
 | 
			
		||||
 | 
			
		||||
	// for saving & restoring
 | 
			
		||||
| 
						 | 
				
			
			@ -396,41 +355,21 @@ static void AM_initVariables(void)
 | 
			
		|||
	old_m_h = m_h;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const UINT8 *maplump; // pointer to the raw data for the automap background.
 | 
			
		||||
 | 
			
		||||
/** Clears all map markers.
 | 
			
		||||
  */
 | 
			
		||||
static void AM_clearMarks(void)
 | 
			
		||||
{
 | 
			
		||||
	INT32 i;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < AM_NUMMARKPOINTS; i++)
 | 
			
		||||
		markpoints[i].x = -1; // means empty
 | 
			
		||||
	markpointnum = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// should be called at the start of every level
 | 
			
		||||
// right now, i figure it out myself
 | 
			
		||||
//
 | 
			
		||||
static void AM_LevelInit(void)
 | 
			
		||||
{
 | 
			
		||||
	leveljuststarted = 0;
 | 
			
		||||
 | 
			
		||||
	f_x = f_y = 0;
 | 
			
		||||
	f_w = vid.width;
 | 
			
		||||
	f_h = vid.height;
 | 
			
		||||
 | 
			
		||||
	if (rendermode == render_soft)
 | 
			
		||||
		AM_drawFline = AM_drawFline_soft;
 | 
			
		||||
#ifdef HWRENDER // not win32 only 19990829 by Kin
 | 
			
		||||
	else if (rendermode != render_none)
 | 
			
		||||
	AM_drawFline = AM_drawFline_soft;
 | 
			
		||||
#ifdef HWRENDER
 | 
			
		||||
	if (rendermode == render_opengl)
 | 
			
		||||
		AM_drawFline = HWR_drawAMline;
 | 
			
		||||
#endif
 | 
			
		||||
	else
 | 
			
		||||
		I_Error("Automap can't run without a render system");
 | 
			
		||||
 | 
			
		||||
	AM_clearMarks();
 | 
			
		||||
 | 
			
		||||
	AM_findMinMaxBoundaries();
 | 
			
		||||
	scale_mtof = FixedDiv(min_scale_mtof*10, 7*FRACUNIT);
 | 
			
		||||
| 
						 | 
				
			
			@ -446,7 +385,7 @@ static void AM_LevelInit(void)
 | 
			
		|||
void AM_Stop(void)
 | 
			
		||||
{
 | 
			
		||||
	automapactive = false;
 | 
			
		||||
	stopped = true;
 | 
			
		||||
	am_stopped = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Enables automap.
 | 
			
		||||
| 
						 | 
				
			
			@ -457,15 +396,14 @@ static inline void AM_Start(void)
 | 
			
		|||
{
 | 
			
		||||
	static INT32 lastlevel = -1;
 | 
			
		||||
 | 
			
		||||
	if (!stopped)
 | 
			
		||||
	if (!am_stopped)
 | 
			
		||||
		AM_Stop();
 | 
			
		||||
	stopped = false;
 | 
			
		||||
	am_stopped = false;
 | 
			
		||||
	if (lastlevel != gamemap || am_recalc) // screen size changed
 | 
			
		||||
	{
 | 
			
		||||
		am_recalc = false;
 | 
			
		||||
 | 
			
		||||
		AM_LevelInit();
 | 
			
		||||
		lastlevel = gamemap;
 | 
			
		||||
		am_recalc = false;
 | 
			
		||||
	}
 | 
			
		||||
	AM_initVariables();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -503,7 +441,7 @@ boolean AM_Responder(event_t *ev)
 | 
			
		|||
	{
 | 
			
		||||
		if (!automapactive)
 | 
			
		||||
		{
 | 
			
		||||
			if (ev->type == ev_keydown && ev->data1 == AM_STARTKEY)
 | 
			
		||||
			if (ev->type == ev_keydown && ev->data1 == AM_TOGGLEKEY)
 | 
			
		||||
			{
 | 
			
		||||
				//faB: prevent alt-tab in win32 version to activate automap just before
 | 
			
		||||
				//     minimizing the app; doesn't do any harm to the DOS version
 | 
			
		||||
| 
						 | 
				
			
			@ -515,10 +453,8 @@ boolean AM_Responder(event_t *ev)
 | 
			
		|||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		else if (ev->type == ev_keydown)
 | 
			
		||||
		{
 | 
			
		||||
 | 
			
		||||
			rc = true;
 | 
			
		||||
			switch (ev->data1)
 | 
			
		||||
			{
 | 
			
		||||
| 
						 | 
				
			
			@ -554,7 +490,7 @@ boolean AM_Responder(event_t *ev)
 | 
			
		|||
					mtof_zoommul = M_ZOOMIN;
 | 
			
		||||
					ftom_zoommul = M_ZOOMOUT;
 | 
			
		||||
					break;
 | 
			
		||||
				case AM_ENDKEY:
 | 
			
		||||
				case AM_TOGGLEKEY:
 | 
			
		||||
					AM_Stop();
 | 
			
		||||
					break;
 | 
			
		||||
				case AM_GOBIGKEY:
 | 
			
		||||
| 
						 | 
				
			
			@ -572,13 +508,7 @@ boolean AM_Responder(event_t *ev)
 | 
			
		|||
					f_oldloc.x = INT32_MAX;
 | 
			
		||||
					break;
 | 
			
		||||
				case AM_GRIDKEY:
 | 
			
		||||
					grid = !grid;
 | 
			
		||||
					break;
 | 
			
		||||
				case AM_MARKKEY:
 | 
			
		||||
					AM_addMark();
 | 
			
		||||
					break;
 | 
			
		||||
				case AM_CLEARMARKKEY:
 | 
			
		||||
					AM_clearMarks();
 | 
			
		||||
					draw_grid = !draw_grid;
 | 
			
		||||
					break;
 | 
			
		||||
				default:
 | 
			
		||||
					rc = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -632,8 +562,8 @@ static inline void AM_doFollowPlayer(void)
 | 
			
		|||
{
 | 
			
		||||
	if (f_oldloc.x != plr->mo->x || f_oldloc.y != plr->mo->y)
 | 
			
		||||
	{
 | 
			
		||||
		m_x = FTOM(MTOF(plr->mo->x)) - m_w/2;
 | 
			
		||||
		m_y = FTOM(MTOF(plr->mo->y)) - m_h/2;
 | 
			
		||||
		m_x = FTOM(MTOF(plr->mo->x >> FRACTOMAPBITS)) - m_w/2;
 | 
			
		||||
		m_y = FTOM(MTOF(plr->mo->y >> FRACTOMAPBITS)) - m_h/2;
 | 
			
		||||
		m_x2 = m_x + m_w;
 | 
			
		||||
		m_y2 = m_y + m_h;
 | 
			
		||||
		f_oldloc.x = plr->mo->x;
 | 
			
		||||
| 
						 | 
				
			
			@ -651,8 +581,6 @@ void AM_Ticker(void)
 | 
			
		|||
	if (dedicated || !automapactive)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	amclock++;
 | 
			
		||||
 | 
			
		||||
	if (followplayer)
 | 
			
		||||
		AM_doFollowPlayer();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -671,72 +599,7 @@ void AM_Ticker(void)
 | 
			
		|||
  */
 | 
			
		||||
static void AM_clearFB(INT32 color)
 | 
			
		||||
{
 | 
			
		||||
#ifdef HWRENDER
 | 
			
		||||
	if (rendermode != render_soft && rendermode != render_none)
 | 
			
		||||
	{
 | 
			
		||||
		HWR_clearAutomap();
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if (!maplump)
 | 
			
		||||
		memset(fb, color, f_w*f_h*vid.bpp);
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		INT32 dmapx, dmapy, i, y;
 | 
			
		||||
		static INT32 mapxstart, mapystart;
 | 
			
		||||
		UINT8 *dest = screens[0];
 | 
			
		||||
		const UINT8 *src;
 | 
			
		||||
#define MAPLUMPHEIGHT (200 - 42)
 | 
			
		||||
 | 
			
		||||
		if (followplayer)
 | 
			
		||||
		{
 | 
			
		||||
			static vertex_t oldplr;
 | 
			
		||||
 | 
			
		||||
			dmapx = MTOF(plr->mo->x) - MTOF(oldplr.x); //fixed point
 | 
			
		||||
			dmapy = MTOF(oldplr.y) - MTOF(plr->mo->y);
 | 
			
		||||
 | 
			
		||||
			oldplr.x = plr->mo->x;
 | 
			
		||||
			oldplr.y = plr->mo->y;
 | 
			
		||||
			mapxstart += dmapx>>1;
 | 
			
		||||
			mapystart += dmapy>>1;
 | 
			
		||||
 | 
			
		||||
			while (mapxstart >= BASEVIDWIDTH)
 | 
			
		||||
				mapxstart -= BASEVIDWIDTH;
 | 
			
		||||
			while (mapxstart < 0)
 | 
			
		||||
				mapxstart += BASEVIDWIDTH;
 | 
			
		||||
			while (mapystart >= MAPLUMPHEIGHT)
 | 
			
		||||
				mapystart -= MAPLUMPHEIGHT;
 | 
			
		||||
			while (mapystart < 0)
 | 
			
		||||
				mapystart += MAPLUMPHEIGHT;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			mapxstart += (MTOF(m_paninc.x)>>1);
 | 
			
		||||
			mapystart -= (MTOF(m_paninc.y)>>1);
 | 
			
		||||
			if (mapxstart >= BASEVIDWIDTH)
 | 
			
		||||
				mapxstart -= BASEVIDWIDTH;
 | 
			
		||||
			if (mapxstart < 0)
 | 
			
		||||
				mapxstart += BASEVIDWIDTH;
 | 
			
		||||
			if (mapystart >= MAPLUMPHEIGHT)
 | 
			
		||||
				mapystart -= MAPLUMPHEIGHT;
 | 
			
		||||
			if (mapystart < 0)
 | 
			
		||||
				mapystart += MAPLUMPHEIGHT;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		//blit the automap background to the screen.
 | 
			
		||||
		for (y = 0; y < f_h; y++)
 | 
			
		||||
		{
 | 
			
		||||
			src = maplump + mapxstart + (y + mapystart)*BASEVIDWIDTH;
 | 
			
		||||
			for (i = 0; i < BASEVIDWIDTH*vid.dupx; i++)
 | 
			
		||||
			{
 | 
			
		||||
				while (src > maplump + BASEVIDWIDTH*MAPLUMPHEIGHT)
 | 
			
		||||
					src -= BASEVIDWIDTH*MAPLUMPHEIGHT;
 | 
			
		||||
				*dest++ = *src++;
 | 
			
		||||
			}
 | 
			
		||||
			dest += vid.width - vid.dupx*BASEVIDWIDTH;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	V_DrawFill(f_x, f_y, f_w, f_h, color|V_NOSCALESTART);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Performs automap clipping of lines.
 | 
			
		||||
| 
						 | 
				
			
			@ -871,7 +734,7 @@ static boolean AM_clipMline(const mline_t *ml, fline_t *fl)
 | 
			
		|||
//
 | 
			
		||||
static void AM_drawFline_soft(const fline_t *fl, INT32 color)
 | 
			
		||||
{
 | 
			
		||||
	register INT32 x, y, dx, dy, sx, sy, ax, ay, d;
 | 
			
		||||
	INT32 x, y, dx, dy, sx, sy, ax, ay, d;
 | 
			
		||||
 | 
			
		||||
#ifdef _DEBUG
 | 
			
		||||
	static INT32 num = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -887,7 +750,7 @@ static void AM_drawFline_soft(const fline_t *fl, INT32 color)
 | 
			
		|||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define PUTDOT(xx,yy,cc) fb[(yy)*f_w + (xx)]=(UINT8)(cc)
 | 
			
		||||
	#define PUTDOT(xx,yy,cc) V_DrawFill(xx,yy,1,1,cc|V_NOSCALESTART);
 | 
			
		||||
 | 
			
		||||
	dx = fl->b.x - fl->a.x;
 | 
			
		||||
	ax = 2 * (dx < 0 ? -dx : dx);
 | 
			
		||||
| 
						 | 
				
			
			@ -905,7 +768,7 @@ static void AM_drawFline_soft(const fline_t *fl, INT32 color)
 | 
			
		|||
		d = ay - ax/2;
 | 
			
		||||
		for (;;)
 | 
			
		||||
		{
 | 
			
		||||
			PUTDOT(x, y, color);
 | 
			
		||||
			PUTDOT(x, y, color)
 | 
			
		||||
			if (x == fl->b.x)
 | 
			
		||||
				return;
 | 
			
		||||
			if (d >= 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -922,7 +785,7 @@ static void AM_drawFline_soft(const fline_t *fl, INT32 color)
 | 
			
		|||
		d = ax - ay/2;
 | 
			
		||||
		for (;;)
 | 
			
		||||
		{
 | 
			
		||||
			PUTDOT(x, y, color);
 | 
			
		||||
			PUTDOT(x, y, color)
 | 
			
		||||
			if (y == fl->b.y)
 | 
			
		||||
				return;
 | 
			
		||||
			if (d >= 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -934,6 +797,8 @@ static void AM_drawFline_soft(const fline_t *fl, INT32 color)
 | 
			
		|||
			d += ax;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	#undef PUTDOT
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
| 
						 | 
				
			
			@ -1004,15 +869,15 @@ static inline void AM_drawWalls(void)
 | 
			
		|||
 | 
			
		||||
	for (i = 0; i < numlines; i++)
 | 
			
		||||
	{
 | 
			
		||||
		l.a.x = lines[i].v1->x;
 | 
			
		||||
		l.a.y = lines[i].v1->y;
 | 
			
		||||
		l.b.x = lines[i].v2->x;
 | 
			
		||||
		l.b.y = lines[i].v2->y;
 | 
			
		||||
		l.a.x = lines[i].v1->x >> FRACTOMAPBITS;
 | 
			
		||||
		l.a.y = lines[i].v1->y >> FRACTOMAPBITS;
 | 
			
		||||
		l.b.x = lines[i].v2->x >> FRACTOMAPBITS;
 | 
			
		||||
		l.b.y = lines[i].v2->y >> FRACTOMAPBITS;
 | 
			
		||||
#ifdef ESLOPE
 | 
			
		||||
#define SLOPEPARAMS(slope, end1, end2, normalheight) \
 | 
			
		||||
		if (slope) { \
 | 
			
		||||
			end1 = P_GetZAt(slope, l.a.x, l.a.y); \
 | 
			
		||||
			end2 = P_GetZAt(slope, l.b.x, l.b.y); \
 | 
			
		||||
			end1 = P_GetZAt(slope, lines[i].v1->x, lines[i].v1->y); \
 | 
			
		||||
			end2 = P_GetZAt(slope, lines[i].v2->x, lines[i].v2->y); \
 | 
			
		||||
		} else \
 | 
			
		||||
			end1 = end2 = normalheight;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1025,17 +890,12 @@ static inline void AM_drawWalls(void)
 | 
			
		|||
#undef SLOPEPARAMS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//		AM_drawMline(&l, GRAYS + 3); // Old, everything-is-gray automap
 | 
			
		||||
		if (!lines[i].backsector) // 1-sided
 | 
			
		||||
		{
 | 
			
		||||
			if (lines[i].flags & ML_NOCLIMB)
 | 
			
		||||
			{
 | 
			
		||||
				AM_drawMline(&l, NOCLIMBWALLCOLORS+lightlev);
 | 
			
		||||
			}
 | 
			
		||||
				AM_drawMline(&l, NOCLIMBWALLCOLORS);
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				AM_drawMline(&l, WALLCOLORS+lightlev);
 | 
			
		||||
			}
 | 
			
		||||
				AM_drawMline(&l, WALLCOLORS);
 | 
			
		||||
		}
 | 
			
		||||
#ifdef ESLOPE
 | 
			
		||||
		else if ((backf1 == backc1 && backf2 == backc2) // Back is thok barrier
 | 
			
		||||
| 
						 | 
				
			
			@ -1052,24 +912,16 @@ static inline void AM_drawWalls(void)
 | 
			
		|||
#endif
 | 
			
		||||
			{
 | 
			
		||||
				if (lines[i].flags & ML_NOCLIMB)
 | 
			
		||||
				{
 | 
			
		||||
					AM_drawMline(&l, NOCLIMBTSWALLCOLORS+lightlev);
 | 
			
		||||
				}
 | 
			
		||||
					AM_drawMline(&l, NOCLIMBTSWALLCOLORS);
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					AM_drawMline(&l, TSWALLCOLORS+lightlev);
 | 
			
		||||
				}
 | 
			
		||||
					AM_drawMline(&l, TSWALLCOLORS);
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				if (lines[i].flags & ML_NOCLIMB)
 | 
			
		||||
				{
 | 
			
		||||
					AM_drawMline(&l, NOCLIMBTHOKWALLCOLORS+lightlev);
 | 
			
		||||
				}
 | 
			
		||||
					AM_drawMline(&l, NOCLIMBTHOKWALLCOLORS);
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					AM_drawMline(&l, THOKWALLCOLORS+lightlev);
 | 
			
		||||
				}
 | 
			
		||||
					AM_drawMline(&l, THOKWALLCOLORS);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
| 
						 | 
				
			
			@ -1081,7 +933,7 @@ static inline void AM_drawWalls(void)
 | 
			
		|||
				if (lines[i].backsector->floorheight
 | 
			
		||||
						!= lines[i].frontsector->floorheight) {
 | 
			
		||||
#endif
 | 
			
		||||
					AM_drawMline(&l, NOCLIMBFDWALLCOLORS + lightlev); // floor level change
 | 
			
		||||
					AM_drawMline(&l, NOCLIMBFDWALLCOLORS); // floor level change
 | 
			
		||||
				}
 | 
			
		||||
#ifdef ESLOPE
 | 
			
		||||
				else if (backc1 != frontc1 || backc2 != frontc2) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1089,11 +941,10 @@ static inline void AM_drawWalls(void)
 | 
			
		|||
				else if (lines[i].backsector->ceilingheight
 | 
			
		||||
						!= lines[i].frontsector->ceilingheight) {
 | 
			
		||||
#endif
 | 
			
		||||
					AM_drawMline(&l, NOCLIMBCDWALLCOLORS+lightlev); // ceiling level change
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					AM_drawMline(&l, NOCLIMBTSWALLCOLORS+lightlev);
 | 
			
		||||
					AM_drawMline(&l, NOCLIMBCDWALLCOLORS); // ceiling level change
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
					AM_drawMline(&l, NOCLIMBTSWALLCOLORS);
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
| 
						 | 
				
			
			@ -1103,7 +954,7 @@ static inline void AM_drawWalls(void)
 | 
			
		|||
				if (lines[i].backsector->floorheight
 | 
			
		||||
						!= lines[i].frontsector->floorheight) {
 | 
			
		||||
#endif
 | 
			
		||||
					AM_drawMline(&l, FDWALLCOLORS + lightlev); // floor level change
 | 
			
		||||
					AM_drawMline(&l, FDWALLCOLORS); // floor level change
 | 
			
		||||
				}
 | 
			
		||||
#ifdef ESLOPE
 | 
			
		||||
				else if (backc1 != frontc1 || backc2 != frontc2) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1111,11 +962,10 @@ static inline void AM_drawWalls(void)
 | 
			
		|||
				else if (lines[i].backsector->ceilingheight
 | 
			
		||||
						!= lines[i].frontsector->ceilingheight) {
 | 
			
		||||
#endif
 | 
			
		||||
					AM_drawMline(&l, CDWALLCOLORS+lightlev); // ceiling level change
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					AM_drawMline(&l, TSWALLCOLORS+lightlev);
 | 
			
		||||
					AM_drawMline(&l, CDWALLCOLORS); // ceiling level change
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
					AM_drawMline(&l, TSWALLCOLORS);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1176,6 +1026,11 @@ static void AM_drawLineCharacter(const mline_t *lineguy, size_t lineguylines, fi
 | 
			
		|||
		l.b.x += x;
 | 
			
		||||
		l.b.y += y;
 | 
			
		||||
 | 
			
		||||
		l.a.x >>= FRACTOMAPBITS;
 | 
			
		||||
		l.a.y >>= FRACTOMAPBITS;
 | 
			
		||||
		l.b.x >>= FRACTOMAPBITS;
 | 
			
		||||
		l.b.y >>= FRACTOMAPBITS;
 | 
			
		||||
 | 
			
		||||
		AM_drawMline(&l, color);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1184,83 +1039,51 @@ static inline void AM_drawPlayers(void)
 | 
			
		|||
{
 | 
			
		||||
	INT32 i;
 | 
			
		||||
	player_t *p;
 | 
			
		||||
	INT32 color;
 | 
			
		||||
	INT32 color = GREENS;
 | 
			
		||||
 | 
			
		||||
	if (!multiplayer)
 | 
			
		||||
	{
 | 
			
		||||
		AM_drawLineCharacter(player_arrow, NUMPLYRLINES, 0,
 | 
			
		||||
			plr->mo->angle, DWHITE, plr->mo->x, plr->mo->y);
 | 
			
		||||
		AM_drawLineCharacter(player_arrow, NUMPLYRLINES, 0, plr->mo->angle, DWHITE, plr->mo->x, plr->mo->y);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// multiplayer
 | 
			
		||||
	// multiplayer (how??)
 | 
			
		||||
	for (i = 0; i < MAXPLAYERS; i++)
 | 
			
		||||
	{
 | 
			
		||||
		if (!playeringame[i] || players[i].spectator)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		p = &players[i];
 | 
			
		||||
		if (p->skincolor == 0)
 | 
			
		||||
			color = GREENS;
 | 
			
		||||
		else
 | 
			
		||||
		if (p->skincolor > 0)
 | 
			
		||||
			color = R_GetTranslationColormap(TC_DEFAULT, p->skincolor, GTC_CACHE)[GREENS + 8];
 | 
			
		||||
 | 
			
		||||
		AM_drawLineCharacter(player_arrow, NUMPLYRLINES, 0, p->mo->angle,
 | 
			
		||||
			color, p->mo->x, p->mo->y);
 | 
			
		||||
		AM_drawLineCharacter(player_arrow, NUMPLYRLINES, 0, p->mo->angle, color, p->mo->x, p->mo->y);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void AM_drawThings(INT32 colors, INT32 colorrange)
 | 
			
		||||
static inline void AM_drawThings(UINT8 colors)
 | 
			
		||||
{
 | 
			
		||||
	size_t i;
 | 
			
		||||
	mobj_t *t;
 | 
			
		||||
 | 
			
		||||
	(void)colorrange;
 | 
			
		||||
	for (i = 0; i < numsectors; i++)
 | 
			
		||||
	{
 | 
			
		||||
		t = sectors[i].thinglist;
 | 
			
		||||
		while (t)
 | 
			
		||||
		{
 | 
			
		||||
			AM_drawLineCharacter(thintriangle_guy, NUMTHINTRIANGLEGUYLINES,
 | 
			
		||||
				16<<FRACBITS, t->angle, colors + lightlev, t->x, t->y);
 | 
			
		||||
			AM_drawLineCharacter(thintriangle_guy, NUMTHINTRIANGLEGUYLINES, 16<<FRACBITS, t->angle, colors, t->x, t->y);
 | 
			
		||||
			t = t->snext;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void AM_drawMarks(void)
 | 
			
		||||
{
 | 
			
		||||
	INT32 i, fx, fy, w, h;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < AM_NUMMARKPOINTS; i++)
 | 
			
		||||
	{
 | 
			
		||||
		if (markpoints[i].x != -1 && marknums[i])
 | 
			
		||||
		{
 | 
			
		||||
			// w = SHORT(marknums[i]->width);
 | 
			
		||||
			// h = SHORT(marknums[i]->height);
 | 
			
		||||
			w = 5; // because something's wrong with the wad, i guess
 | 
			
		||||
			h = 6; // because something's wrong with the wad, i guess
 | 
			
		||||
			fx = CXMTOF(markpoints[i].x);
 | 
			
		||||
			fy = CYMTOF(markpoints[i].y);
 | 
			
		||||
			if (fx >= f_x && fx <= f_w - w && fy >= f_y && fy <= f_h - h)
 | 
			
		||||
				V_DrawPatch(fx, fy, FB, marknums[i]);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Draws the crosshair, actually just a dot in software mode.
 | 
			
		||||
  *
 | 
			
		||||
  * \param color Color for the crosshair.
 | 
			
		||||
  */
 | 
			
		||||
static inline void AM_drawCrosshair(INT32 color)
 | 
			
		||||
static inline void AM_drawCrosshair(UINT8 color)
 | 
			
		||||
{
 | 
			
		||||
	if (rendermode != render_soft)
 | 
			
		||||
		return; // BP: should be putpixel here
 | 
			
		||||
 | 
			
		||||
	if (scr_bpp == 1)
 | 
			
		||||
		fb[(f_w*(f_h + 1))/2] = (UINT8)color; // single point for now
 | 
			
		||||
	else
 | 
			
		||||
		*((INT16 *)(void *)fb + (f_w*(f_h + 1))/2) = (INT16)color;
 | 
			
		||||
	V_DrawFill(f_w/2 + f_x, f_h/2 + f_y, 1, 1, color|V_NOSCALESTART);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Draws the automap.
 | 
			
		||||
| 
						 | 
				
			
			@ -1271,13 +1094,10 @@ void AM_Drawer(void)
 | 
			
		|||
		return;
 | 
			
		||||
 | 
			
		||||
	AM_clearFB(BACKGROUND);
 | 
			
		||||
	if (grid)
 | 
			
		||||
		AM_drawGrid(GRIDCOLORS);
 | 
			
		||||
	if (draw_grid) AM_drawGrid(GRIDCOLORS);
 | 
			
		||||
	AM_drawWalls();
 | 
			
		||||
	AM_drawPlayers();
 | 
			
		||||
	AM_drawThings(THINGCOLORS, THINGRANGE);
 | 
			
		||||
	AM_drawThings(THINGCOLORS);
 | 
			
		||||
 | 
			
		||||
	AM_drawCrosshair(XHAIRCOLORS);
 | 
			
		||||
 | 
			
		||||
	AM_drawMarks();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,7 @@
 | 
			
		|||
#include "hu_stuff.h"
 | 
			
		||||
#include "p_setup.h"
 | 
			
		||||
#include "lua_script.h"
 | 
			
		||||
#include "d_netfil.h" // findfile
 | 
			
		||||
 | 
			
		||||
//========
 | 
			
		||||
// protos.
 | 
			
		||||
| 
						 | 
				
			
			@ -49,6 +50,7 @@ static void COM_Wait_f(void);
 | 
			
		|||
static void COM_Help_f(void);
 | 
			
		||||
static void COM_Toggle_f(void);
 | 
			
		||||
 | 
			
		||||
static void CV_EnforceExecVersion(void);
 | 
			
		||||
static boolean CV_FilterVarByVersion(consvar_t *v, const char *valstr);
 | 
			
		||||
static boolean CV_Command(void);
 | 
			
		||||
static consvar_t *CV_FindVar(const char *name);
 | 
			
		||||
| 
						 | 
				
			
			@ -66,7 +68,8 @@ CV_PossibleValue_t CV_Natural[] = {{1, "MIN"}, {999999999, "MAX"}, {0, NULL}};
 | 
			
		|||
// Filter consvars by EXECVERSION
 | 
			
		||||
// First implementation is 26 (2.1.21), so earlier configs default at 25 (2.1.20)
 | 
			
		||||
// Also set CV_HIDEN during runtime, after config is loaded
 | 
			
		||||
consvar_t cv_execversion = {"execversion","25",0,CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
static boolean execversion_enabled = false;
 | 
			
		||||
consvar_t cv_execversion = {"execversion","25",CV_CALL,CV_Unsigned, CV_EnforceExecVersion, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
 | 
			
		||||
// for default joyaxis detection
 | 
			
		||||
static boolean joyaxis_default = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -641,6 +644,7 @@ static void COM_CEchoDuration_f(void)
 | 
			
		|||
static void COM_Exec_f(void)
 | 
			
		||||
{
 | 
			
		||||
	UINT8 *buf = NULL;
 | 
			
		||||
	char filename[256];
 | 
			
		||||
 | 
			
		||||
	if (COM_Argc() < 2 || COM_Argc() > 3)
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -649,13 +653,23 @@ static void COM_Exec_f(void)
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// load file
 | 
			
		||||
	// Try with Argv passed verbatim first, for back compat
 | 
			
		||||
	FIL_ReadFile(COM_Argv(1), &buf);
 | 
			
		||||
 | 
			
		||||
	if (!buf)
 | 
			
		||||
	{
 | 
			
		||||
		if (!COM_CheckParm("-noerror"))
 | 
			
		||||
			CONS_Printf(M_GetText("couldn't execute file %s\n"), COM_Argv(1));
 | 
			
		||||
		return;
 | 
			
		||||
		// Now try by searching the file path
 | 
			
		||||
		// filename is modified with the full found path
 | 
			
		||||
		strcpy(filename, COM_Argv(1));
 | 
			
		||||
		if (findfile(filename, NULL, true) != FS_NOTFOUND)
 | 
			
		||||
			FIL_ReadFile(filename, &buf);
 | 
			
		||||
 | 
			
		||||
		if (!buf)
 | 
			
		||||
		{
 | 
			
		||||
			if (!COM_CheckParm("-noerror"))
 | 
			
		||||
				CONS_Printf(M_GetText("couldn't execute file %s\n"), COM_Argv(1));
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!COM_CheckParm("-silent"))
 | 
			
		||||
| 
						 | 
				
			
			@ -1090,7 +1104,7 @@ static void Setvalue(consvar_t *var, const char *valstr, boolean stealth)
 | 
			
		|||
		if (var->flags & CV_FLOAT)
 | 
			
		||||
		{
 | 
			
		||||
			double d = atof(valstr);
 | 
			
		||||
			if (!d && valstr[0] != '0')
 | 
			
		||||
			if (fpclassify(d) == FP_ZERO && valstr[0] != '0')
 | 
			
		||||
				v = INT32_MIN;
 | 
			
		||||
			else
 | 
			
		||||
				v = (INT32)(d * FRACUNIT);
 | 
			
		||||
| 
						 | 
				
			
			@ -1586,6 +1600,17 @@ void CV_InitFilterVar(void)
 | 
			
		|||
	joyaxis_count = joyaxis2_count = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CV_ToggleExecVersion(boolean enable)
 | 
			
		||||
{
 | 
			
		||||
	execversion_enabled = enable;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void CV_EnforceExecVersion(void)
 | 
			
		||||
{
 | 
			
		||||
	if (!execversion_enabled)
 | 
			
		||||
		CV_StealthSetValue(&cv_execversion, EXECVERSION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static boolean CV_FilterJoyAxisVars(consvar_t *v, const char *valstr)
 | 
			
		||||
{
 | 
			
		||||
	// If ALL axis settings are previous defaults, set them to the new defaults
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -130,6 +130,7 @@ extern CV_PossibleValue_t CV_Natural[];
 | 
			
		|||
extern consvar_t cv_execversion;
 | 
			
		||||
 | 
			
		||||
void CV_InitFilterVar(void);
 | 
			
		||||
void CV_ToggleExecVersion(boolean enable);
 | 
			
		||||
 | 
			
		||||
// register a variable for use at the console
 | 
			
		||||
void CV_RegisterVar(consvar_t *variable);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,10 +58,7 @@ static boolean consoleready;  // console prompt is ready
 | 
			
		|||
       INT32 con_destlines; // vid lines used by console at final position
 | 
			
		||||
static INT32 con_curlines;  // vid lines currently used by console
 | 
			
		||||
 | 
			
		||||
       INT32 con_clipviewtop; // clip value for planes & sprites, so that the
 | 
			
		||||
                            // part of the view covered by the console is not
 | 
			
		||||
                            // drawn when not needed, this must be -1 when
 | 
			
		||||
                            // console is off
 | 
			
		||||
       INT32 con_clipviewtop; // (useless)
 | 
			
		||||
 | 
			
		||||
static INT32 con_hudlines;        // number of console heads up message lines
 | 
			
		||||
static INT32 con_hudtime[MAXHUDLINES];      // remaining time of display for hud msg lines
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -429,9 +429,9 @@ extern doomdata_t *netbuffer;
 | 
			
		|||
 | 
			
		||||
extern consvar_t cv_playbackspeed;
 | 
			
		||||
 | 
			
		||||
#define BASEPACKETSIZE ((size_t)&(((doomdata_t *)0)->u))
 | 
			
		||||
#define FILETXHEADER ((size_t)((filetx_pak *)0)->data)
 | 
			
		||||
#define BASESERVERTICSSIZE ((size_t)&(((doomdata_t *)0)->u.serverpak.cmds[0]))
 | 
			
		||||
#define BASEPACKETSIZE      offsetof(doomdata_t, u)
 | 
			
		||||
#define FILETXHEADER        offsetof(filetx_pak, data)
 | 
			
		||||
#define BASESERVERTICSSIZE  offsetof(doomdata_t, u.serverpak.cmds[0])
 | 
			
		||||
 | 
			
		||||
#define KICK_MSG_GO_AWAY     1
 | 
			
		||||
#define KICK_MSG_CON_FAIL    2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -319,8 +319,7 @@ static void D_Display(void)
 | 
			
		|||
			if (!gametic)
 | 
			
		||||
				break;
 | 
			
		||||
			HU_Erase();
 | 
			
		||||
			if (automapactive)
 | 
			
		||||
				AM_Drawer();
 | 
			
		||||
			AM_Drawer();
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case GS_INTERMISSION:
 | 
			
		||||
| 
						 | 
				
			
			@ -374,12 +373,10 @@ static void D_Display(void)
 | 
			
		|||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// clean up border stuff
 | 
			
		||||
	// see if the border needs to be initially drawn
 | 
			
		||||
	if (gamestate == GS_LEVEL)
 | 
			
		||||
	{
 | 
			
		||||
		// draw the view directly
 | 
			
		||||
		if (!automapactive && !dedicated && cv_renderview.value)
 | 
			
		||||
		if (cv_renderview.value && !automapactive)
 | 
			
		||||
		{
 | 
			
		||||
			if (players[displayplayer].mo || players[displayplayer].playerstate == PST_DEAD)
 | 
			
		||||
			{
 | 
			
		||||
| 
						 | 
				
			
			@ -437,7 +434,6 @@ static void D_Display(void)
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		ST_Drawer();
 | 
			
		||||
 | 
			
		||||
		HU_Drawer();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,6 +27,7 @@
 | 
			
		|||
#include "d_clisrv.h"
 | 
			
		||||
#include "z_zone.h"
 | 
			
		||||
#include "i_tcp.h"
 | 
			
		||||
#include "d_main.h" // srb2home
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// NETWORKING
 | 
			
		||||
| 
						 | 
				
			
			@ -1374,12 +1375,12 @@ boolean D_CheckNetGame(void)
 | 
			
		|||
		{
 | 
			
		||||
			k++;
 | 
			
		||||
			sprintf(filename, "debug%d.txt", k);
 | 
			
		||||
			debugfile = fopen(filename, "w");
 | 
			
		||||
			debugfile = fopen(va("%s" PATHSEP "%s", srb2home, filename), "w");
 | 
			
		||||
		}
 | 
			
		||||
		if (debugfile)
 | 
			
		||||
			CONS_Printf(M_GetText("debug output to: %s\n"), filename);
 | 
			
		||||
			CONS_Printf(M_GetText("debug output to: %s\n"), va("%s" PATHSEP "%s", srb2home, filename));
 | 
			
		||||
		else
 | 
			
		||||
			CONS_Alert(CONS_WARNING, M_GetText("cannot debug output to file %s!\n"), filename);
 | 
			
		||||
			CONS_Alert(CONS_WARNING, M_GetText("cannot debug output to file %s!\n"), va("%s" PATHSEP "%s", srb2home, filename));
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -689,6 +689,10 @@ void D_RegisterClientCommands(void)
 | 
			
		|||
	CV_RegisterVar(&cv_moveaxis2);
 | 
			
		||||
	CV_RegisterVar(&cv_lookaxis);
 | 
			
		||||
	CV_RegisterVar(&cv_lookaxis2);
 | 
			
		||||
	CV_RegisterVar(&cv_jumpaxis);
 | 
			
		||||
	CV_RegisterVar(&cv_jumpaxis2);
 | 
			
		||||
	CV_RegisterVar(&cv_spinaxis);
 | 
			
		||||
	CV_RegisterVar(&cv_spinaxis2);
 | 
			
		||||
	CV_RegisterVar(&cv_fireaxis);
 | 
			
		||||
	CV_RegisterVar(&cv_fireaxis2);
 | 
			
		||||
	CV_RegisterVar(&cv_firenaxis);
 | 
			
		||||
| 
						 | 
				
			
			@ -3440,7 +3444,7 @@ static void Command_Version_f(void)
 | 
			
		|||
#elif defined(__linux__)
 | 
			
		||||
	CONS_Printf("Linux ");
 | 
			
		||||
#elif defined(MACOSX)
 | 
			
		||||
	CONS_Printf("macOS" );
 | 
			
		||||
	CONS_Printf("macOS ");
 | 
			
		||||
#elif defined(UNIXCOMMON)
 | 
			
		||||
	CONS_Printf("Unix (Common) ");
 | 
			
		||||
#else
 | 
			
		||||
| 
						 | 
				
			
			@ -3465,6 +3469,11 @@ static void Command_Version_f(void)
 | 
			
		|||
	CONS_Printf("\x85" "DEBUG " "\x80");
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	// DEVELOP build
 | 
			
		||||
#ifdef DEVELOP
 | 
			
		||||
	CONS_Printf("\x87" "DEVELOP " "\x80");
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	CONS_Printf("\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1248,6 +1248,18 @@ static void readlevelheader(MYFILE *f, INT32 num)
 | 
			
		|||
					deh_warning("Level header %d: invalid bonus type number %d", num, i);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			else if (fastcmp(word, "SAVEOVERRIDE"))
 | 
			
		||||
			{
 | 
			
		||||
				if      (fastcmp(word2, "DEFAULT")) i = SAVE_DEFAULT;
 | 
			
		||||
				else if (fastcmp(word2, "ALWAYS"))  i = SAVE_ALWAYS;
 | 
			
		||||
				else if (fastcmp(word2, "NEVER"))   i = SAVE_NEVER;
 | 
			
		||||
 | 
			
		||||
				if (i >= SAVE_NEVER && i <= SAVE_ALWAYS)
 | 
			
		||||
					mapheaderinfo[num-1]->saveoverride = (SINT8)i;
 | 
			
		||||
				else
 | 
			
		||||
					deh_warning("Level header %d: invalid save override number %d", num, i);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			else if (fastcmp(word, "LEVELFLAGS"))
 | 
			
		||||
				mapheaderinfo[num-1]->levelflags = (UINT8)i;
 | 
			
		||||
			else if (fastcmp(word, "MENUFLAGS"))
 | 
			
		||||
| 
						 | 
				
			
			@ -3080,7 +3092,7 @@ static void readmaincfg(MYFILE *f)
 | 
			
		|||
				strncpy(timeattackfolder, gamedatafilename, min(filenamelen, sizeof (timeattackfolder)));
 | 
			
		||||
				timeattackfolder[min(filenamelen, sizeof (timeattackfolder) - 1)] = '\0';
 | 
			
		||||
 | 
			
		||||
				strncpy(savegamename, timeattackfolder, strlen(timeattackfolder));
 | 
			
		||||
				strcpy(savegamename, timeattackfolder);
 | 
			
		||||
				strlcat(savegamename, "%u.ssg", sizeof(savegamename));
 | 
			
		||||
				// can't use sprintf since there is %u in savegamename
 | 
			
		||||
				strcatbf(savegamename, srb2home, PATHSEP);
 | 
			
		||||
| 
						 | 
				
			
			@ -7074,6 +7086,11 @@ struct {
 | 
			
		|||
	{"LF2_NIGHTSATTACK",LF2_NIGHTSATTACK},
 | 
			
		||||
	{"LF2_NOVISITNEEDED",LF2_NOVISITNEEDED},
 | 
			
		||||
 | 
			
		||||
	// Save override
 | 
			
		||||
	{"SAVE_NEVER",SAVE_NEVER},
 | 
			
		||||
	{"SAVE_DEFAULT",SAVE_DEFAULT},
 | 
			
		||||
	{"SAVE_ALWAYS",SAVE_ALWAYS},
 | 
			
		||||
 | 
			
		||||
	// NiGHTS grades
 | 
			
		||||
	{"GRADE_F",GRADE_F},
 | 
			
		||||
	{"GRADE_E",GRADE_E},
 | 
			
		||||
| 
						 | 
				
			
			@ -8303,6 +8320,7 @@ static inline int lib_getenum(lua_State *L)
 | 
			
		|||
		LUA_PushUserdata(L, &players[serverplayer], META_PLAYER);
 | 
			
		||||
		return 1;
 | 
			
		||||
	} else if (fastcmp(word,"admin")) { // BACKWARDS COMPATIBILITY HACK: This was replaced with IsPlayerAdmin(), but some 2.1 Lua scripts still use the admin variable. It now points to the first admin player in the array.
 | 
			
		||||
		LUA_Deprecated(L, "admin", "IsPlayerAdmin(player)");
 | 
			
		||||
		if (!playeringame[adminplayers[0]] || IsPlayerAdmin(serverplayer))
 | 
			
		||||
			return 0;
 | 
			
		||||
		LUA_PushUserdata(L, &players[adminplayers[0]], META_PLAYER);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -150,9 +150,9 @@ extern FILE *logstream;
 | 
			
		|||
// we use comprevision and compbranch instead.
 | 
			
		||||
#else
 | 
			
		||||
#define VERSION    201 // Game version
 | 
			
		||||
#define SUBVERSION 21  // more precise version number
 | 
			
		||||
#define VERSIONSTRING "v2.1.21"
 | 
			
		||||
#define VERSIONSTRINGW L"v2.1.21"
 | 
			
		||||
#define SUBVERSION 22  // more precise version number
 | 
			
		||||
#define VERSIONSTRING "v2.1.22"
 | 
			
		||||
#define VERSIONSTRINGW L"v2.1.22"
 | 
			
		||||
// Hey! If you change this, add 1 to the MODVERSION below!
 | 
			
		||||
// Otherwise we can't force updates!
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -216,13 +216,13 @@ extern FILE *logstream;
 | 
			
		|||
// Note that we use this to help keep internal testing in check; this is why v2.1.0 is not version "1".
 | 
			
		||||
#define MODVERSION 27
 | 
			
		||||
 | 
			
		||||
// To version config.cfg, set MAJOREXECVERSION equal to MODVERSION
 | 
			
		||||
// and increment SUBEXECVERSION whenever a config change is needed
 | 
			
		||||
// that does not correspond to an increment in MODVERSION.
 | 
			
		||||
// If MAJOREXECVERSION increases, set MINOREXECVERSION to 0.
 | 
			
		||||
#define MAJOREXECVERSION 27
 | 
			
		||||
// To version config.cfg, MAJOREXECVERSION is set equal to MODVERSION automatically.
 | 
			
		||||
// Increment MINOREXECVERSION whenever a config change is needed that does not correspond
 | 
			
		||||
// to an increment in MODVERSION. This might never happen in practice.
 | 
			
		||||
// If MODVERSION increases, set MINOREXECVERSION to 0.
 | 
			
		||||
#define MAJOREXECVERSION MODVERSION
 | 
			
		||||
#define MINOREXECVERSION 0
 | 
			
		||||
// (It would have been nice to use VERSION and SUBVERSION but those are different for DEVELOP builds)
 | 
			
		||||
// (It would have been nice to use VERSION and SUBVERSION but those are zero'd out for DEVELOP builds)
 | 
			
		||||
 | 
			
		||||
// Macros
 | 
			
		||||
#define GETMAJOREXECVERSION(v) (v & 0xFFFF)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -234,6 +234,7 @@ typedef struct
 | 
			
		|||
	SINT8 unlockrequired; ///< Is an unlockable required to play this level? -1 if no.
 | 
			
		||||
	UINT8 levelselect;    ///< Is this map available in the level select? If so, which map list is it available in?
 | 
			
		||||
	SINT8 bonustype;      ///< What type of bonus does this level have? (-1 for null.)
 | 
			
		||||
	SINT8 saveoverride;   ///< Set how the game is allowed to save (1 for always, -1 for never, 0 is 2.1 default)
 | 
			
		||||
 | 
			
		||||
	UINT8 levelflags;     ///< LF_flags:  merged eight booleans into one UINT8 for space, see below
 | 
			
		||||
	UINT8 menuflags;      ///< LF2_flags: options that affect record attack / nights mode menus
 | 
			
		||||
| 
						 | 
				
			
			@ -261,6 +262,11 @@ typedef struct
 | 
			
		|||
#define LF2_NIGHTSATTACK   8 ///< Show this map in NiGHTS mode menu
 | 
			
		||||
#define LF2_NOVISITNEEDED 16 ///< Available in time attack/nights mode without visiting the level
 | 
			
		||||
 | 
			
		||||
// Save override
 | 
			
		||||
#define SAVE_NEVER   -1
 | 
			
		||||
#define SAVE_DEFAULT  0
 | 
			
		||||
#define SAVE_ALWAYS   1
 | 
			
		||||
 | 
			
		||||
extern mapheader_t* mapheaderinfo[NUMMAPS];
 | 
			
		||||
 | 
			
		||||
enum TypeOfLevel
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1082,11 +1082,14 @@ static const char *credits[] = {
 | 
			
		|||
	"Bill \"Tets\" Reed",
 | 
			
		||||
	"",
 | 
			
		||||
	"\1Special Thanks",
 | 
			
		||||
	"Doom Legacy Project",
 | 
			
		||||
	"iD Software",
 | 
			
		||||
	"Alex \"MistaED\" Fuller",
 | 
			
		||||
	"Doom Legacy Project",
 | 
			
		||||
	"FreeDoom Project", // Used some of the mancubus and rocket launcher sprites for Brak
 | 
			
		||||
	"Alex \"MistaED\" Fuller",
 | 
			
		||||
	"Pascal \"CodeImp\" vd Heiden", // Doom Builder developer
 | 
			
		||||
	"Randi Heit (<!>)", // For their MSPaint <!> sprite that we nicked
 | 
			
		||||
	"Simon \"sirjuddington\" Judd", // SLADE developer
 | 
			
		||||
 | 
			
		||||
	"",
 | 
			
		||||
	"\1Produced By",
 | 
			
		||||
	"Sonic Team Junior",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										44
									
								
								src/g_game.c
									
										
									
									
									
								
							
							
						
						
									
										44
									
								
								src/g_game.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -375,6 +375,8 @@ typedef enum
 | 
			
		|||
	AXISLOOK,
 | 
			
		||||
	AXISSTRAFE,
 | 
			
		||||
	AXISDEAD, //Axises that don't want deadzones
 | 
			
		||||
	AXISJUMP,
 | 
			
		||||
	AXISSPIN,
 | 
			
		||||
	AXISFIRE,
 | 
			
		||||
	AXISFIRENORMAL,
 | 
			
		||||
} axis_input_e;
 | 
			
		||||
| 
						 | 
				
			
			@ -384,6 +386,8 @@ consvar_t cv_turnaxis = {"joyaxis_turn", "LStick.X", CV_SAVE, joyaxis_cons_t, NU
 | 
			
		|||
consvar_t cv_moveaxis = {"joyaxis_move", "LStick.Y", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_sideaxis = {"joyaxis_side", "RStick.X", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_lookaxis = {"joyaxis_look", "RStick.Y", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_jumpaxis = {"joyaxis_jump", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_spinaxis = {"joyaxis_spin", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_fireaxis = {"joyaxis_fire", "LAnalog", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_firenaxis = {"joyaxis_firenormal", "RAnalog", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
#else
 | 
			
		||||
| 
						 | 
				
			
			@ -410,6 +414,8 @@ consvar_t cv_lookaxis = {"joyaxis_look", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL
 | 
			
		|||
consvar_t cv_lookaxis = {"joyaxis_look", "Y-Rudder-", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
consvar_t cv_jumpaxis = {"joyaxis_jump", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_spinaxis = {"joyaxis_spin", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_fireaxis = {"joyaxis_fire", "Z-Axis-", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_firenaxis = {"joyaxis_firenormal", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -419,6 +425,8 @@ consvar_t cv_turnaxis2 = {"joyaxis2_turn", "LStick.X", CV_SAVE, joyaxis_cons_t,
 | 
			
		|||
consvar_t cv_moveaxis2 = {"joyaxis2_move", "LStick.Y", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_sideaxis2 = {"joyaxis2_side", "RStick.X", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_lookaxis2 = {"joyaxis2_look", "RStick.Y", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_jumpaxis2 = {"joyaxis2_jump", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_spinaxis2 = {"joyaxis2_spin", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_fireaxis2 = {"joyaxis2_fire", "LAnalog", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_firenaxis2 = {"joyaxis2_firenormal", "RAnalog", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
#else
 | 
			
		||||
| 
						 | 
				
			
			@ -437,6 +445,8 @@ consvar_t cv_sideaxis2 = {"joyaxis2_side", "X-Axis", CV_SAVE, joyaxis_cons_t, NU
 | 
			
		|||
#ifndef _XBOX
 | 
			
		||||
consvar_t cv_lookaxis2 = {"joyaxis2_look", "Y-Rudder-", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
#endif
 | 
			
		||||
consvar_t cv_jumpaxis2 = {"joyaxis2_jump", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_spinaxis2 = {"joyaxis2_spin", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_fireaxis2 = {"joyaxis2_fire", "Z-Axis-", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_firenaxis2 = {"joyaxis2_firenormal", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -804,6 +814,12 @@ static INT32 JoyAxis(axis_input_e axissel)
 | 
			
		|||
		case AXISSTRAFE:
 | 
			
		||||
			axisval = cv_sideaxis.value;
 | 
			
		||||
			break;
 | 
			
		||||
		case AXISJUMP:
 | 
			
		||||
			axisval = cv_jumpaxis.value;
 | 
			
		||||
			break;
 | 
			
		||||
		case AXISSPIN:
 | 
			
		||||
			axisval = cv_spinaxis.value;
 | 
			
		||||
			break;
 | 
			
		||||
		case AXISFIRE:
 | 
			
		||||
			axisval = cv_fireaxis.value;
 | 
			
		||||
			break;
 | 
			
		||||
| 
						 | 
				
			
			@ -881,6 +897,12 @@ static INT32 Joy2Axis(axis_input_e axissel)
 | 
			
		|||
		case AXISSTRAFE:
 | 
			
		||||
			axisval = cv_sideaxis2.value;
 | 
			
		||||
			break;
 | 
			
		||||
		case AXISJUMP:
 | 
			
		||||
			axisval = cv_jumpaxis2.value;
 | 
			
		||||
			break;
 | 
			
		||||
		case AXISSPIN:
 | 
			
		||||
			axisval = cv_spinaxis2.value;
 | 
			
		||||
			break;
 | 
			
		||||
		case AXISFIRE:
 | 
			
		||||
			axisval = cv_fireaxis2.value;
 | 
			
		||||
			break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1126,7 +1148,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics)
 | 
			
		|||
		cmd->buttons |= BT_CUSTOM3;
 | 
			
		||||
 | 
			
		||||
	// use with any button/key
 | 
			
		||||
	if (PLAYER1INPUTDOWN(gc_use))
 | 
			
		||||
	axis = JoyAxis(AXISSPIN);
 | 
			
		||||
	if (PLAYER1INPUTDOWN(gc_use) || (cv_usejoystick.value && axis > 0))
 | 
			
		||||
		cmd->buttons |= BT_USE;
 | 
			
		||||
 | 
			
		||||
	// Camera Controls
 | 
			
		||||
| 
						 | 
				
			
			@ -1148,7 +1171,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics)
 | 
			
		|||
		resetdown = false;
 | 
			
		||||
 | 
			
		||||
	// jump button
 | 
			
		||||
	if (PLAYER1INPUTDOWN(gc_jump))
 | 
			
		||||
	axis = JoyAxis(AXISJUMP);
 | 
			
		||||
	if (PLAYER1INPUTDOWN(gc_jump) || (cv_usejoystick.value && axis > 0))
 | 
			
		||||
		cmd->buttons |= BT_JUMP;
 | 
			
		||||
 | 
			
		||||
	// player aiming shit, ahhhh...
 | 
			
		||||
| 
						 | 
				
			
			@ -1423,7 +1447,8 @@ void G_BuildTiccmd2(ticcmd_t *cmd, INT32 realtics)
 | 
			
		|||
		cmd->buttons |= BT_CUSTOM3;
 | 
			
		||||
 | 
			
		||||
	// use with any button/key
 | 
			
		||||
	if (PLAYER2INPUTDOWN(gc_use))
 | 
			
		||||
	axis = Joy2Axis(AXISSPIN);
 | 
			
		||||
	if (PLAYER2INPUTDOWN(gc_use) || (cv_usejoystick2.value && axis > 0))
 | 
			
		||||
		cmd->buttons |= BT_USE;
 | 
			
		||||
 | 
			
		||||
	// Camera Controls
 | 
			
		||||
| 
						 | 
				
			
			@ -1445,7 +1470,8 @@ void G_BuildTiccmd2(ticcmd_t *cmd, INT32 realtics)
 | 
			
		|||
		resetdown = false;
 | 
			
		||||
 | 
			
		||||
	// jump button
 | 
			
		||||
	if (PLAYER2INPUTDOWN(gc_jump))
 | 
			
		||||
	axis = Joy2Axis(AXISJUMP);
 | 
			
		||||
	if (PLAYER2INPUTDOWN(gc_jump) || (cv_usejoystick2.value && axis > 0))
 | 
			
		||||
		cmd->buttons |= BT_JUMP;
 | 
			
		||||
 | 
			
		||||
	// player aiming shit, ahhhh...
 | 
			
		||||
| 
						 | 
				
			
			@ -1585,11 +1611,6 @@ static void Analog_OnChange(void)
 | 
			
		|||
 | 
			
		||||
	// cameras are not initialized at this point
 | 
			
		||||
 | 
			
		||||
	if (leveltime > 1)
 | 
			
		||||
		CV_SetValue(&cv_cam_dist, 128);
 | 
			
		||||
	if (cv_analog.value || demoplayback)
 | 
			
		||||
		CV_SetValue(&cv_cam_dist, 192);
 | 
			
		||||
 | 
			
		||||
	if (!cv_chasecam.value && cv_analog.value) {
 | 
			
		||||
		CV_SetValue(&cv_analog, 0);
 | 
			
		||||
		return;
 | 
			
		||||
| 
						 | 
				
			
			@ -1605,11 +1626,6 @@ static void Analog2_OnChange(void)
 | 
			
		|||
 | 
			
		||||
	// cameras are not initialized at this point
 | 
			
		||||
 | 
			
		||||
	if (leveltime > 1)
 | 
			
		||||
		CV_SetValue(&cv_cam2_dist, 128);
 | 
			
		||||
	if (cv_analog2.value)
 | 
			
		||||
		CV_SetValue(&cv_cam2_dist, 192);
 | 
			
		||||
 | 
			
		||||
	if (!cv_chasecam2.value && cv_analog2.value) {
 | 
			
		||||
		CV_SetValue(&cv_analog2, 0);
 | 
			
		||||
		return;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,8 +59,8 @@ extern consvar_t cv_invertmouse, cv_alwaysfreelook, cv_chasefreelook, cv_mousemo
 | 
			
		|||
extern consvar_t cv_invertmouse2, cv_alwaysfreelook2, cv_chasefreelook2, cv_mousemove2;
 | 
			
		||||
extern consvar_t cv_useranalog, cv_useranalog2;
 | 
			
		||||
extern consvar_t cv_analog, cv_analog2;
 | 
			
		||||
extern consvar_t cv_sideaxis,cv_turnaxis,cv_moveaxis,cv_lookaxis,cv_fireaxis,cv_firenaxis;
 | 
			
		||||
extern consvar_t cv_sideaxis2,cv_turnaxis2,cv_moveaxis2,cv_lookaxis2,cv_fireaxis2,cv_firenaxis2;
 | 
			
		||||
extern consvar_t cv_sideaxis,cv_turnaxis,cv_moveaxis,cv_lookaxis,cv_jumpaxis,cv_spinaxis,cv_fireaxis,cv_firenaxis;
 | 
			
		||||
extern consvar_t cv_sideaxis2,cv_turnaxis2,cv_moveaxis2,cv_lookaxis2,cv_jumpaxis2,cv_spinaxis2,cv_fireaxis2,cv_firenaxis2;
 | 
			
		||||
extern consvar_t cv_ghost_bestscore, cv_ghost_besttime, cv_ghost_bestrings, cv_ghost_last, cv_ghost_guest;
 | 
			
		||||
 | 
			
		||||
// mouseaiming (looking up/down with the mouse or keyboard)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1165,7 +1165,9 @@ void G_Controldefault(void)
 | 
			
		|||
	gamecontrol[gc_turnleft   ][0] = KEY_LEFTARROW;
 | 
			
		||||
	gamecontrol[gc_turnright  ][0] = KEY_RIGHTARROW;
 | 
			
		||||
	gamecontrol[gc_weaponnext ][0] = 'e';
 | 
			
		||||
	gamecontrol[gc_weaponnext ][1] = KEY_JOY1+1; // B
 | 
			
		||||
	gamecontrol[gc_weaponprev ][0] = 'q';
 | 
			
		||||
	gamecontrol[gc_weaponprev ][1] = KEY_JOY1+2; // X
 | 
			
		||||
	gamecontrol[gc_wepslot1   ][0] = '1';
 | 
			
		||||
	gamecontrol[gc_wepslot2   ][0] = '2';
 | 
			
		||||
	gamecontrol[gc_wepslot3   ][0] = '3';
 | 
			
		||||
| 
						 | 
				
			
			@ -1180,22 +1182,31 @@ void G_Controldefault(void)
 | 
			
		|||
	gamecontrol[gc_fire       ][1] = KEY_MOUSE1+0;
 | 
			
		||||
	gamecontrol[gc_firenormal ][0] = 'c';
 | 
			
		||||
	gamecontrol[gc_tossflag   ][0] = '\'';
 | 
			
		||||
	gamecontrol[gc_tossflag   ][1] = KEY_JOY1+0; // A
 | 
			
		||||
	gamecontrol[gc_use        ][0] = KEY_LSHIFT;
 | 
			
		||||
	gamecontrol[gc_use        ][1] = KEY_JOY1+4; // LB
 | 
			
		||||
	gamecontrol[gc_camtoggle  ][0] = 'v';
 | 
			
		||||
	gamecontrol[gc_camtoggle  ][1] = KEY_HAT1+0; // D-Pad Up
 | 
			
		||||
	gamecontrol[gc_camleft    ][0] = '[';
 | 
			
		||||
	gamecontrol[gc_camright   ][0] = ']';
 | 
			
		||||
	gamecontrol[gc_camreset   ][0] = 'r';
 | 
			
		||||
	gamecontrol[gc_camreset   ][1] = KEY_JOY1+3; // Y
 | 
			
		||||
	gamecontrol[gc_lookup     ][0] = KEY_UPARROW;
 | 
			
		||||
	gamecontrol[gc_lookdown   ][0] = KEY_DOWNARROW;
 | 
			
		||||
	gamecontrol[gc_centerview ][0] = KEY_END;
 | 
			
		||||
	gamecontrol[gc_centerview ][1] = KEY_JOY1+9; // Right Stick
 | 
			
		||||
	gamecontrol[gc_talkkey    ][0] = 't';
 | 
			
		||||
	gamecontrol[gc_talkkey    ][1] = KEY_HAT1+2; // D-Pad Left
 | 
			
		||||
	gamecontrol[gc_teamkey    ][0] = 'y';
 | 
			
		||||
	gamecontrol[gc_scores     ][0] = KEY_TAB;
 | 
			
		||||
	gamecontrol[gc_scores     ][1] = KEY_HAT1+3; // D-Pad Right
 | 
			
		||||
	gamecontrol[gc_jump       ][0] = KEY_SPACE;
 | 
			
		||||
	gamecontrol[gc_jump       ][1] = KEY_JOY1+5; // RB
 | 
			
		||||
	gamecontrol[gc_console    ][0] = KEY_CONSOLE;
 | 
			
		||||
	gamecontrol[gc_pause      ][0] = 'p';
 | 
			
		||||
	gamecontrol[gc_pause      ][1] = KEY_JOY1+6; // Back
 | 
			
		||||
	gamecontrol[gc_screenshot ][0] = KEY_F8;
 | 
			
		||||
	gamecontrol[gc_screenshot ][1] = KEY_HAT1+1; // D-Pad Down
 | 
			
		||||
	gamecontrol[gc_recordgif  ][0] = KEY_F9;
 | 
			
		||||
	gamecontrol[gc_viewpoint  ][0] = KEY_F12;
 | 
			
		||||
	gamecontrol[gc_systemmenu ][0] = KEY_JOY1+7; // Start
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -193,14 +193,14 @@ static polyvertex_t *fracdivline(fdivline_t *bsp, polyvertex_t *v1,
 | 
			
		|||
	v2dy = bsp->dy;
 | 
			
		||||
 | 
			
		||||
	den = v2dy*v1dx - v2dx*v1dy;
 | 
			
		||||
	if (den == 0)
 | 
			
		||||
	if (fabsf((float)den) < 1.0E-36f) // avoid checking exactly for 0.0
 | 
			
		||||
		return NULL;       // parallel
 | 
			
		||||
 | 
			
		||||
	// first check the frac along the polygon segment,
 | 
			
		||||
	// (do not accept hit with the extensions)
 | 
			
		||||
	num = (v2x - v1x)*v2dy + (v1y - v2y)*v2dx;
 | 
			
		||||
	frac = num / den;
 | 
			
		||||
	if (frac < 0 || frac > 1)
 | 
			
		||||
	if (frac < 0.0 || frac > 1.0)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	// now get the frac along the BSP line
 | 
			
		||||
| 
						 | 
				
			
			@ -217,29 +217,6 @@ static polyvertex_t *fracdivline(fdivline_t *bsp, polyvertex_t *v1,
 | 
			
		|||
	return &pt;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
//Hurdler: it's not used anymore
 | 
			
		||||
static boolean NearVertice (polyvertex_t *p1, polyvertex_t *p2)
 | 
			
		||||
{
 | 
			
		||||
#if 1
 | 
			
		||||
	float diff;
 | 
			
		||||
	diff = p2->x - p1->x;
 | 
			
		||||
	if (diff < -1.5f || diff > 1.5f)
 | 
			
		||||
		return false;
 | 
			
		||||
	diff = p2->y - p1->y;
 | 
			
		||||
	if (diff < -1.5f || diff > 1.5f)
 | 
			
		||||
		return false;
 | 
			
		||||
#else
 | 
			
		||||
	if (p1->x != p2->x)
 | 
			
		||||
		return false;
 | 
			
		||||
	if (p1->y != p2->y)
 | 
			
		||||
		return false;
 | 
			
		||||
#endif
 | 
			
		||||
	// p1 and p2 are considered the same vertex
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// if two vertice coords have a x and/or y difference
 | 
			
		||||
// of less or equal than 1 FRACUNIT, they are considered the same
 | 
			
		||||
// point. Note: hardcoded value, 1.0f could be anything else.
 | 
			
		||||
| 
						 | 
				
			
			@ -253,11 +230,23 @@ static boolean SameVertice (polyvertex_t *p1, polyvertex_t *p2)
 | 
			
		|||
	diff = p2->y - p1->y;
 | 
			
		||||
	if (diff < -1.5f || diff > 1.5f)
 | 
			
		||||
		return false;
 | 
			
		||||
#else
 | 
			
		||||
#elif 0
 | 
			
		||||
	if (p1->x != p2->x)
 | 
			
		||||
		return false;
 | 
			
		||||
	if (p1->y != p2->y)
 | 
			
		||||
		return false;
 | 
			
		||||
#elif 0
 | 
			
		||||
	if (fabsf( p2->x - p1->x ) > 1.0E-36f )
 | 
			
		||||
		return false;
 | 
			
		||||
	if (fabsf( p2->y - p1->y ) > 1.0E-36f )
 | 
			
		||||
		return false;
 | 
			
		||||
#else
 | 
			
		||||
#define  DIVLINE_VERTEX_DIFF   0.45f
 | 
			
		||||
	float ep = DIVLINE_VERTEX_DIFF;
 | 
			
		||||
	if (fabsf( p2->x - p1->x ) > ep )
 | 
			
		||||
		return false;
 | 
			
		||||
	if (fabsf( p2->y - p1->y ) > ep )
 | 
			
		||||
		return false;
 | 
			
		||||
#endif
 | 
			
		||||
	// p1 and p2 are considered the same vertex
 | 
			
		||||
	return true;
 | 
			
		||||
| 
						 | 
				
			
			@ -294,57 +283,57 @@ static void SplitPoly (fdivline_t *bsp,         //splitting parametric line
 | 
			
		|||
		// start & end points
 | 
			
		||||
		pv = fracdivline(bsp, &poly->pts[i], &poly->pts[j]);
 | 
			
		||||
 | 
			
		||||
		if (pv)
 | 
			
		||||
		if (pv == NULL)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		if (ps < 0)
 | 
			
		||||
		{
 | 
			
		||||
			if (ps < 0)
 | 
			
		||||
			// first point
 | 
			
		||||
			ps = i;
 | 
			
		||||
			vs = *pv;
 | 
			
		||||
			fracs = bspfrac;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			//the partition line traverse a junction between two segments
 | 
			
		||||
			// or the two points are so close, they can be considered as one
 | 
			
		||||
			// thus, don't accept, since split 2 must be another vertex
 | 
			
		||||
			if (SameVertice(pv, &lastpv))
 | 
			
		||||
			{
 | 
			
		||||
				// first point
 | 
			
		||||
				ps = i;
 | 
			
		||||
				vs = *pv;
 | 
			
		||||
				fracs = bspfrac;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				//the partition line traverse a junction between two segments
 | 
			
		||||
				// or the two points are so close, they can be considered as one
 | 
			
		||||
				// thus, don't accept, since split 2 must be another vertex
 | 
			
		||||
				if (SameVertice(pv, &lastpv))
 | 
			
		||||
				if (pe < 0)
 | 
			
		||||
				{
 | 
			
		||||
					if (pe < 0)
 | 
			
		||||
					{
 | 
			
		||||
						ps = i;
 | 
			
		||||
						psonline = 1;
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						pe = i;
 | 
			
		||||
						peonline = 1;
 | 
			
		||||
					}
 | 
			
		||||
					ps = i;
 | 
			
		||||
					psonline = 1;
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					if (pe < 0)
 | 
			
		||||
					{
 | 
			
		||||
						pe = i;
 | 
			
		||||
						ve = *pv;
 | 
			
		||||
						frace = bspfrac;
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
					// a frac, not same vertice as last one
 | 
			
		||||
					// we already got pt2 so pt 2 is not on the line,
 | 
			
		||||
					// so we probably got back to the start point
 | 
			
		||||
					// which is on the line
 | 
			
		||||
						if (SameVertice(pv, &vs))
 | 
			
		||||
							psonline = 1;
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					pe = i;
 | 
			
		||||
					peonline = 1;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				if (pe < 0)
 | 
			
		||||
				{
 | 
			
		||||
					pe = i;
 | 
			
		||||
					ve = *pv;
 | 
			
		||||
					frace = bspfrac;
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
				// a frac, not same vertice as last one
 | 
			
		||||
				// we already got pt2 so pt 2 is not on the line,
 | 
			
		||||
				// so we probably got back to the start point
 | 
			
		||||
				// which is on the line
 | 
			
		||||
					if (SameVertice(pv, &vs))
 | 
			
		||||
						psonline = 1;
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// remember last point intercept to detect identical points
 | 
			
		||||
			lastpv = *pv;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// remember last point intercept to detect identical points
 | 
			
		||||
		lastpv = *pv;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// no split: the partition line is either parallel and
 | 
			
		||||
| 
						 | 
				
			
			@ -368,7 +357,7 @@ static void SplitPoly (fdivline_t *bsp,         //splitting parametric line
 | 
			
		|||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ps >= 0 && pe < 0)
 | 
			
		||||
	if (pe < 0)
 | 
			
		||||
	{
 | 
			
		||||
		//I_Error("SplitPoly: only one point for split line (%d %d)", ps, pe);
 | 
			
		||||
		*frontpoly = poly;
 | 
			
		||||
| 
						 | 
				
			
			@ -387,7 +376,7 @@ static void SplitPoly (fdivline_t *bsp,         //splitting parametric line
 | 
			
		|||
		*backpoly = HWR_AllocPoly(2 + nptback);
 | 
			
		||||
	else
 | 
			
		||||
		*backpoly = NULL;
 | 
			
		||||
	if (nptfront)
 | 
			
		||||
	if (nptfront > 0)
 | 
			
		||||
		*frontpoly = HWR_AllocPoly(2 + nptfront);
 | 
			
		||||
	else
 | 
			
		||||
		*frontpoly = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -482,42 +471,42 @@ static poly_t *CutOutSubsecPoly(seg_t *lseg, INT32 count, poly_t *poly)
 | 
			
		|||
 | 
			
		||||
			pv = fracdivline(&cutseg, &poly->pts[i], &poly->pts[j]);
 | 
			
		||||
 | 
			
		||||
			if (pv)
 | 
			
		||||
			if (pv == NULL)
 | 
			
		||||
				continue;
 | 
			
		||||
 | 
			
		||||
			if (ps < 0)
 | 
			
		||||
			{
 | 
			
		||||
				if (ps < 0)
 | 
			
		||||
				ps = i;
 | 
			
		||||
				vs = *pv;
 | 
			
		||||
				fracs = bspfrac;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				//frac 1 on previous segment,
 | 
			
		||||
				//     0 on the next,
 | 
			
		||||
				//the split line goes through one of the convex poly
 | 
			
		||||
				// vertices, happens quite often since the convex
 | 
			
		||||
				// poly is already adjacent to the subsector segs
 | 
			
		||||
				// on most borders
 | 
			
		||||
				if (SameVertice(pv, &vs))
 | 
			
		||||
					continue;
 | 
			
		||||
 | 
			
		||||
				if (fracs <= bspfrac)
 | 
			
		||||
				{
 | 
			
		||||
					nump = 2 + poly->numpts - (i-ps);
 | 
			
		||||
					pe = ps;
 | 
			
		||||
					ps = i;
 | 
			
		||||
					vs = *pv;
 | 
			
		||||
					fracs = bspfrac;
 | 
			
		||||
					ve = *pv;
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					//frac 1 on previous segment,
 | 
			
		||||
					//     0 on the next,
 | 
			
		||||
					//the split line goes through one of the convex poly
 | 
			
		||||
					// vertices, happens quite often since the convex
 | 
			
		||||
					// poly is already adjacent to the subsector segs
 | 
			
		||||
					// on most borders
 | 
			
		||||
					if (SameVertice(pv, &vs))
 | 
			
		||||
						continue;
 | 
			
		||||
 | 
			
		||||
					if (fracs <= bspfrac)
 | 
			
		||||
					{
 | 
			
		||||
						nump = 2 + poly->numpts - (i-ps);
 | 
			
		||||
						pe = ps;
 | 
			
		||||
						ps = i;
 | 
			
		||||
						ve = *pv;
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						nump = 2 + (i-ps);
 | 
			
		||||
						pe = i;
 | 
			
		||||
						ve = vs;
 | 
			
		||||
						vs = *pv;
 | 
			
		||||
					}
 | 
			
		||||
					//found 2nd point
 | 
			
		||||
					break;
 | 
			
		||||
					nump = 2 + (i-ps);
 | 
			
		||||
					pe = i;
 | 
			
		||||
					ve = vs;
 | 
			
		||||
					vs = *pv;
 | 
			
		||||
				}
 | 
			
		||||
				//found 2nd point
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -581,18 +570,42 @@ static inline void HWR_SubsecPoly(INT32 num, poly_t *poly)
 | 
			
		|||
// search for the segs source of this divline
 | 
			
		||||
static inline void SearchDivline(node_t *bsp, fdivline_t *divline)
 | 
			
		||||
{
 | 
			
		||||
#if 0 // MAR - If you don't use the same partition line that the BSP uses, the front/back polys won't match the subsectors in the BSP!
 | 
			
		||||
#endif
 | 
			
		||||
	divline->x = FIXED_TO_FLOAT(bsp->x);
 | 
			
		||||
	divline->y = FIXED_TO_FLOAT(bsp->y);
 | 
			
		||||
	divline->dx = FIXED_TO_FLOAT(bsp->dx);
 | 
			
		||||
	divline->dy = FIXED_TO_FLOAT(bsp->dy);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef HWR_LOADING_SCREEN
 | 
			
		||||
//Hurdler: implement a loading status
 | 
			
		||||
static size_t ls_count = 0;
 | 
			
		||||
static UINT8 ls_percent = 0;
 | 
			
		||||
 | 
			
		||||
static void loading_status(void)
 | 
			
		||||
{
 | 
			
		||||
	char s[16];
 | 
			
		||||
	int x, y;
 | 
			
		||||
 | 
			
		||||
	I_OsPolling();
 | 
			
		||||
	CON_Drawer();
 | 
			
		||||
	sprintf(s, "%d%%", (++ls_percent)<<1);
 | 
			
		||||
	x = BASEVIDWIDTH/2;
 | 
			
		||||
	y = BASEVIDHEIGHT/2;
 | 
			
		||||
	V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); // Black background to match fade in effect
 | 
			
		||||
	//V_DrawPatchFill(W_CachePatchName("SRB2BACK",PU_CACHE)); // SRB2 background, ehhh too bright.
 | 
			
		||||
	M_DrawTextBox(x-58, y-8, 13, 1);
 | 
			
		||||
	V_DrawString(x-50, y, V_YELLOWMAP, "Loading...");
 | 
			
		||||
	V_DrawRightAlignedString(x+50, y, V_YELLOWMAP, s);
 | 
			
		||||
 | 
			
		||||
	// Is this really necessary at this point..?
 | 
			
		||||
	V_DrawCenteredString(BASEVIDWIDTH/2, 40, V_YELLOWMAP, "OPENGL MODE IS INCOMPLETE AND MAY");
 | 
			
		||||
	V_DrawCenteredString(BASEVIDWIDTH/2, 50, V_YELLOWMAP, "NOT DISPLAY SOME SURFACES.");
 | 
			
		||||
	V_DrawCenteredString(BASEVIDWIDTH/2, 70, V_YELLOWMAP, "USE AT SONIC'S RISK.");
 | 
			
		||||
 | 
			
		||||
	I_UpdateNoVsync();
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// poly : the convex polygon that encloses all child subsectors
 | 
			
		||||
static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *bbox)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -630,38 +643,19 @@ static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *b
 | 
			
		|||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			HWR_SubsecPoly(bspnum&(~NF_SUBSECTOR), poly);
 | 
			
		||||
			//Hurdler: implement a loading status
 | 
			
		||||
			HWR_SubsecPoly(bspnum & ~NF_SUBSECTOR, poly);
 | 
			
		||||
 | 
			
		||||
			//Hurdler: implement a loading status
 | 
			
		||||
#ifdef HWR_LOADING_SCREEN
 | 
			
		||||
			if (ls_count-- <= 0)
 | 
			
		||||
			{
 | 
			
		||||
				char s[16];
 | 
			
		||||
				int x, y;
 | 
			
		||||
 | 
			
		||||
				I_OsPolling();
 | 
			
		||||
				ls_count = numsubsectors/50;
 | 
			
		||||
				CON_Drawer();
 | 
			
		||||
				sprintf(s, "%d%%", (++ls_percent)<<1);
 | 
			
		||||
				x = BASEVIDWIDTH/2;
 | 
			
		||||
				y = BASEVIDHEIGHT/2;
 | 
			
		||||
				V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); // Black background to match fade in effect
 | 
			
		||||
				//V_DrawPatchFill(W_CachePatchName("SRB2BACK",PU_CACHE)); // SRB2 background, ehhh too bright.
 | 
			
		||||
				M_DrawTextBox(x-58, y-8, 13, 1);
 | 
			
		||||
				V_DrawString(x-50, y, V_YELLOWMAP, "Loading...");
 | 
			
		||||
				V_DrawRightAlignedString(x+50, y, V_YELLOWMAP, s);
 | 
			
		||||
 | 
			
		||||
				// Is this really necessary at this point..?
 | 
			
		||||
				V_DrawCenteredString(BASEVIDWIDTH/2, 40, V_YELLOWMAP, "OPENGL MODE IS INCOMPLETE AND MAY");
 | 
			
		||||
				V_DrawCenteredString(BASEVIDWIDTH/2, 50, V_YELLOWMAP, "NOT DISPLAY SOME SURFACES.");
 | 
			
		||||
				V_DrawCenteredString(BASEVIDWIDTH/2, 70, V_YELLOWMAP, "USE AT SONIC'S RISK.");
 | 
			
		||||
 | 
			
		||||
				I_UpdateNoVsync();
 | 
			
		||||
				loading_status();
 | 
			
		||||
			}
 | 
			
		||||
#endif
 | 
			
		||||
		}
 | 
			
		||||
		M_ClearBox(bbox);
 | 
			
		||||
		poly = extrasubsectors[bspnum&~NF_SUBSECTOR].planepoly;
 | 
			
		||||
		poly = extrasubsectors[bspnum & ~NF_SUBSECTOR].planepoly;
 | 
			
		||||
 | 
			
		||||
		for (i = 0, pt = poly->pts; i < poly->numpts; i++,pt++)
 | 
			
		||||
			M_AddToBox(bbox, FLOAT_TO_FIXED(pt->x), FLOAT_TO_FIXED(pt->y));
 | 
			
		||||
| 
						 | 
				
			
			@ -693,14 +687,13 @@ static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *b
 | 
			
		|||
	if (backpoly)
 | 
			
		||||
	{
 | 
			
		||||
		// Correct back bbox to include floor/ceiling convex polygon
 | 
			
		||||
		WalkBSPNode(bsp->children[1], backpoly, &bsp->children[1],
 | 
			
		||||
			bsp->bbox[1]);
 | 
			
		||||
		WalkBSPNode(bsp->children[1], backpoly, &bsp->children[1], bsp->bbox[1]);
 | 
			
		||||
 | 
			
		||||
		// enlarge bbox with seconde child
 | 
			
		||||
		// enlarge bbox with second child
 | 
			
		||||
		M_AddToBox(bbox, bsp->bbox[1][BOXLEFT  ],
 | 
			
		||||
			bsp->bbox[1][BOXTOP   ]);
 | 
			
		||||
		                 bsp->bbox[1][BOXTOP   ]);
 | 
			
		||||
		M_AddToBox(bbox, bsp->bbox[1][BOXRIGHT ],
 | 
			
		||||
			bsp->bbox[1][BOXBOTTOM]);
 | 
			
		||||
		                 bsp->bbox[1][BOXBOTTOM]);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -780,9 +773,9 @@ static void SearchSegInBSP(INT32 bspnum,polyvertex_t *p,poly_t *poly)
 | 
			
		|||
 | 
			
		||||
	if (bspnum & NF_SUBSECTOR)
 | 
			
		||||
	{
 | 
			
		||||
		if (bspnum!=-1)
 | 
			
		||||
		if (bspnum != -1)
 | 
			
		||||
		{
 | 
			
		||||
			bspnum&=~NF_SUBSECTOR;
 | 
			
		||||
			bspnum &= ~NF_SUBSECTOR;
 | 
			
		||||
			q = extrasubsectors[bspnum].planepoly;
 | 
			
		||||
			if (poly == q || !q)
 | 
			
		||||
				return;
 | 
			
		||||
| 
						 | 
				
			
			@ -968,7 +961,9 @@ void HWR_CreatePlanePolygons(INT32 bspnum)
 | 
			
		|||
	fixed_t rootbbox[4];
 | 
			
		||||
 | 
			
		||||
	CONS_Debug(DBG_RENDER, "Creating polygons, please wait...\n");
 | 
			
		||||
#ifdef HWR_LOADING_SCREEN
 | 
			
		||||
	ls_count = ls_percent = 0; // reset the loading status
 | 
			
		||||
#endif
 | 
			
		||||
	CON_Drawer(); //let the user know what we are doing
 | 
			
		||||
	I_FinishUpdate(); // page flip or blit buffer
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -227,14 +227,14 @@ void HWR_DrawFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
 | 
			
		|||
				Z_Free(realpatch);
 | 
			
		||||
			}
 | 
			
		||||
			// centre screen
 | 
			
		||||
			if ((float)vid.width != (float)BASEVIDWIDTH * dupx)
 | 
			
		||||
			if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f)
 | 
			
		||||
			{
 | 
			
		||||
				if (option & V_SNAPTORIGHT)
 | 
			
		||||
					cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx));
 | 
			
		||||
				else if (!(option & V_SNAPTOLEFT))
 | 
			
		||||
					cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/2;
 | 
			
		||||
			}
 | 
			
		||||
			if ((float)vid.height != (float)BASEVIDHEIGHT * dupy)
 | 
			
		||||
			if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f)
 | 
			
		||||
			{
 | 
			
		||||
				if ((option & (V_SPLITSCREEN|V_SNAPTOBOTTOM)) == (V_SPLITSCREEN|V_SNAPTOBOTTOM))
 | 
			
		||||
					cy += ((float)vid.height/2 - ((float)BASEVIDHEIGHT/2 * dupy));
 | 
			
		||||
| 
						 | 
				
			
			@ -375,14 +375,14 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal
 | 
			
		|||
				Z_Free(realpatch);
 | 
			
		||||
			}
 | 
			
		||||
			// centre screen
 | 
			
		||||
			if ((float)vid.width != (float)BASEVIDWIDTH * dupx)
 | 
			
		||||
			if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f)
 | 
			
		||||
			{
 | 
			
		||||
				if (option & V_SNAPTORIGHT)
 | 
			
		||||
					cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx));
 | 
			
		||||
				else if (!(option & V_SNAPTOLEFT))
 | 
			
		||||
					cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/2;
 | 
			
		||||
			}
 | 
			
		||||
			if ((float)vid.height != (float)BASEVIDHEIGHT * dupy)
 | 
			
		||||
			if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f)
 | 
			
		||||
			{
 | 
			
		||||
				if ((option & (V_SPLITSCREEN|V_SNAPTOBOTTOM)) == (V_SPLITSCREEN|V_SNAPTOBOTTOM))
 | 
			
		||||
					cy += ((float)vid.height/2 - ((float)BASEVIDHEIGHT/2 * dupy));
 | 
			
		||||
| 
						 | 
				
			
			@ -770,18 +770,6 @@ void HWR_DrawViewBorder(INT32 clearlines)
 | 
			
		|||
//                                                     AM_MAP.C DRAWING STUFF
 | 
			
		||||
// ==========================================================================
 | 
			
		||||
 | 
			
		||||
// Clear the automap part of the screen
 | 
			
		||||
void HWR_clearAutomap(void)
 | 
			
		||||
{
 | 
			
		||||
	FRGBAFloat fColor = {0, 0, 0, 1};
 | 
			
		||||
 | 
			
		||||
	// minx,miny,maxx,maxy
 | 
			
		||||
	HWD.pfnGClipRect(0, 0, vid.width, vid.height, NZCLIP_PLANE);
 | 
			
		||||
	HWD.pfnClearBuffer(true, true, &fColor);
 | 
			
		||||
	HWD.pfnGClipRect(0, 0, vid.width, vid.height, NZCLIP_PLANE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// -----------------+
 | 
			
		||||
// HWR_drawAMline   : draw a line of the automap (the clipping is already done in automap code)
 | 
			
		||||
// Arg              : color is a RGB 888 value
 | 
			
		||||
| 
						 | 
				
			
			@ -846,14 +834,14 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
 | 
			
		|||
		fw *= dupx;
 | 
			
		||||
		fh *= dupy;
 | 
			
		||||
 | 
			
		||||
		if ((float)vid.width != (float)BASEVIDWIDTH * dupx)
 | 
			
		||||
		if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f)
 | 
			
		||||
		{
 | 
			
		||||
			if (color & V_SNAPTORIGHT)
 | 
			
		||||
				fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx));
 | 
			
		||||
			else if (!(color & V_SNAPTOLEFT))
 | 
			
		||||
				fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2;
 | 
			
		||||
		}
 | 
			
		||||
		if ((float)vid.height != (float)BASEVIDHEIGHT * dupy)
 | 
			
		||||
		if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f)
 | 
			
		||||
		{
 | 
			
		||||
			// same thing here
 | 
			
		||||
			if (color & V_SNAPTOBOTTOM)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4137,7 +4137,7 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t
 | 
			
		|||
	swallVerts[0].z = swallVerts[3].z = spr->z1;
 | 
			
		||||
	swallVerts[2].z = swallVerts[1].z = spr->z2;
 | 
			
		||||
 | 
			
		||||
	if (spr->mobj && this_scale != 1.0f)
 | 
			
		||||
	if (spr->mobj && fabsf(this_scale - 1.0f) > 1.0E-36f)
 | 
			
		||||
	{
 | 
			
		||||
		// Always a pixel above the floor, perfectly flat.
 | 
			
		||||
		swallVerts[0].y = swallVerts[1].y = swallVerts[2].y = swallVerts[3].y = spr->ty - gpatch->topoffset * this_scale - (floorheight+3);
 | 
			
		||||
| 
						 | 
				
			
			@ -4305,7 +4305,7 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
 | 
			
		|||
	wallVerts[1].z = wallVerts[2].z = spr->z2;
 | 
			
		||||
 | 
			
		||||
	wallVerts[2].y = wallVerts[3].y = spr->ty;
 | 
			
		||||
	if (spr->mobj && this_scale != 1.0f)
 | 
			
		||||
	if (spr->mobj && fabsf(this_scale - 1.0f) > 1.0E-36f)
 | 
			
		||||
		wallVerts[0].y = wallVerts[1].y = spr->ty - gpatch->height * this_scale;
 | 
			
		||||
	else
 | 
			
		||||
		wallVerts[0].y = wallVerts[1].y = spr->ty - gpatch->height;
 | 
			
		||||
| 
						 | 
				
			
			@ -4334,6 +4334,16 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
 | 
			
		|||
		wallVerts[0].tow = wallVerts[1].tow = gpatch->max_t;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if it has a dispoffset, push it a little towards the camera
 | 
			
		||||
	if (spr->dispoffset) {
 | 
			
		||||
		float co = -gr_viewcos*(0.05f*spr->dispoffset);
 | 
			
		||||
		float si = -gr_viewsin*(0.05f*spr->dispoffset);
 | 
			
		||||
		wallVerts[0].z = wallVerts[3].z = wallVerts[0].z+si;
 | 
			
		||||
		wallVerts[1].z = wallVerts[2].z = wallVerts[1].z+si;
 | 
			
		||||
		wallVerts[0].x = wallVerts[3].x = wallVerts[0].x+co;
 | 
			
		||||
		wallVerts[1].x = wallVerts[2].x = wallVerts[1].x+co;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	realtop = top = wallVerts[3].y;
 | 
			
		||||
	realbot = bot = wallVerts[0].y;
 | 
			
		||||
	towtop = wallVerts[3].tow;
 | 
			
		||||
| 
						 | 
				
			
			@ -4585,7 +4595,7 @@ static void HWR_DrawSprite(gr_vissprite_t *spr)
 | 
			
		|||
	wallVerts[0].x = wallVerts[3].x = spr->x1;
 | 
			
		||||
	wallVerts[2].x = wallVerts[1].x = spr->x2;
 | 
			
		||||
	wallVerts[2].y = wallVerts[3].y = spr->ty;
 | 
			
		||||
	if (spr->mobj && this_scale != 1.0f)
 | 
			
		||||
	if (spr->mobj && fabsf(this_scale - 1.0f) > 1.0E-36f)
 | 
			
		||||
		wallVerts[0].y = wallVerts[1].y = spr->ty - gpatch->height * this_scale;
 | 
			
		||||
	else
 | 
			
		||||
		wallVerts[0].y = wallVerts[1].y = spr->ty - gpatch->height;
 | 
			
		||||
| 
						 | 
				
			
			@ -4635,6 +4645,16 @@ static void HWR_DrawSprite(gr_vissprite_t *spr)
 | 
			
		|||
		HWR_DrawSpriteShadow(spr, gpatch, this_scale);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if it has a dispoffset, push it a little towards the camera
 | 
			
		||||
	if (spr->dispoffset) {
 | 
			
		||||
		float co = -gr_viewcos*(0.05f*spr->dispoffset);
 | 
			
		||||
		float si = -gr_viewsin*(0.05f*spr->dispoffset);
 | 
			
		||||
		wallVerts[0].z = wallVerts[3].z = wallVerts[0].z+si;
 | 
			
		||||
		wallVerts[1].z = wallVerts[2].z = wallVerts[1].z+si;
 | 
			
		||||
		wallVerts[0].x = wallVerts[3].x = wallVerts[0].x+co;
 | 
			
		||||
		wallVerts[1].x = wallVerts[2].x = wallVerts[1].x+co;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// This needs to be AFTER the shadows so that the regular sprites aren't drawn completely black.
 | 
			
		||||
	// sprite lighting by modulating the RGB components
 | 
			
		||||
	/// \todo coloured
 | 
			
		||||
| 
						 | 
				
			
			@ -4831,7 +4851,7 @@ static void HWR_SortVisSprites(void)
 | 
			
		|||
				best = ds;
 | 
			
		||||
			}
 | 
			
		||||
			// order visprites of same scale by dispoffset, smallest first
 | 
			
		||||
			else if (ds->tz == bestdist && ds->dispoffset < bestdispoffset)
 | 
			
		||||
			else if (fabsf(ds->tz - bestdist) < 1.0E-36f && ds->dispoffset < bestdispoffset)
 | 
			
		||||
			{
 | 
			
		||||
				bestdispoffset = ds->dispoffset;
 | 
			
		||||
				best = ds;
 | 
			
		||||
| 
						 | 
				
			
			@ -5752,7 +5772,7 @@ void HWR_SetViewSize(void)
 | 
			
		|||
 | 
			
		||||
	gr_viewwindowx = (vid.width - gr_viewwidth) / 2;
 | 
			
		||||
	gr_windowcenterx = (float)(vid.width / 2);
 | 
			
		||||
	if (gr_viewwidth == vid.width)
 | 
			
		||||
	if (fabsf(gr_viewwidth - vid.width) < 1.0E-36f)
 | 
			
		||||
	{
 | 
			
		||||
		gr_baseviewwindowy = 0;
 | 
			
		||||
		gr_basewindowcentery = gr_viewheight / 2;               // window top left corner at 0,0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,6 @@
 | 
			
		|||
void HWR_Startup(void);
 | 
			
		||||
void HWR_Shutdown(void);
 | 
			
		||||
 | 
			
		||||
void HWR_clearAutomap(void);
 | 
			
		||||
void HWR_drawAMline(const fline_t *fl, INT32 color);
 | 
			
		||||
void HWR_FadeScreenMenuBack(UINT32 color, INT32 height);
 | 
			
		||||
void HWR_DrawConsoleBack(UINT32 color, INT32 height);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -602,7 +602,8 @@ static void GLPerspective(GLdouble fovy, GLdouble aspect)
 | 
			
		|||
	const GLdouble deltaZ = zFar - zNear;
 | 
			
		||||
	GLdouble cotangent;
 | 
			
		||||
 | 
			
		||||
	if ((deltaZ == 0.0f) || (sine == 0.0f) || (aspect == 0.0f)) {
 | 
			
		||||
	if ((fabsf((float)deltaZ) < 1.0E-36f) || fpclassify(sine) == FP_ZERO || fpclassify(aspect) == FP_ZERO)
 | 
			
		||||
	{
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	cotangent = cos(radians) / sine;
 | 
			
		||||
| 
						 | 
				
			
			@ -641,7 +642,7 @@ static void GLProject(GLdouble objX, GLdouble objY, GLdouble objZ,
 | 
			
		|||
			out[2] * projMatrix[2*4+i] +
 | 
			
		||||
			out[3] * projMatrix[3*4+i];
 | 
			
		||||
	}
 | 
			
		||||
	if (in[3] == 0.0f) return;
 | 
			
		||||
	if (fpclassify(in[3]) == FP_ZERO) return;
 | 
			
		||||
	in[0] /= in[3];
 | 
			
		||||
	in[1] /= in[3];
 | 
			
		||||
	in[2] /= in[3];
 | 
			
		||||
| 
						 | 
				
			
			@ -1986,7 +1987,7 @@ static  void DrawMD2Ex(INT32 *gl_cmd_buffer, md2_frame_t *frame, INT32 duration,
 | 
			
		|||
 | 
			
		||||
			pglTexCoord2f(s, t);
 | 
			
		||||
 | 
			
		||||
			if (!nextframe || pol == 0.0f)
 | 
			
		||||
			if (!nextframe || fpclassify(pol) == FP_ZERO)
 | 
			
		||||
			{
 | 
			
		||||
				pglNormal3f(frame->vertices[pindex].normal[0],
 | 
			
		||||
				            frame->vertices[pindex].normal[1],
 | 
			
		||||
| 
						 | 
				
			
			@ -2055,6 +2056,7 @@ EXPORT void HWRAPI(SetTransform) (FTransform *stransform)
 | 
			
		|||
	pglLoadIdentity();
 | 
			
		||||
	if (stransform)
 | 
			
		||||
	{
 | 
			
		||||
		boolean fovx90;
 | 
			
		||||
		// keep a trace of the transformation for md2
 | 
			
		||||
		memcpy(&md2_transform, stransform, sizeof (md2_transform));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2069,7 +2071,8 @@ EXPORT void HWRAPI(SetTransform) (FTransform *stransform)
 | 
			
		|||
 | 
			
		||||
		pglMatrixMode(GL_PROJECTION);
 | 
			
		||||
		pglLoadIdentity();
 | 
			
		||||
		special_splitscreen = (stransform->splitscreen && stransform->fovxangle == 90.0f);
 | 
			
		||||
		fovx90 = stransform->fovxangle > 0.0f && fabsf(stransform->fovxangle - 90.0f) < 0.5f;
 | 
			
		||||
		special_splitscreen = (stransform->splitscreen && fovx90);
 | 
			
		||||
		if (special_splitscreen)
 | 
			
		||||
			GLPerspective(53.13l, 2*ASPECT_RATIO);  // 53.13 = 2*atan(0.5)
 | 
			
		||||
		else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1682,6 +1682,25 @@ static int lib_rSetPlayerSkin(lua_State *L)
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// R_DATA
 | 
			
		||||
////////////
 | 
			
		||||
 | 
			
		||||
static int lib_rCheckTextureNumForName(lua_State *L)
 | 
			
		||||
{
 | 
			
		||||
	const char *name = luaL_checkstring(L, 1);
 | 
			
		||||
	//HUDSAFE
 | 
			
		||||
	lua_pushinteger(L, R_CheckTextureNumForName(name));
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int lib_rTextureNumForName(lua_State *L)
 | 
			
		||||
{
 | 
			
		||||
	const char *name = luaL_checkstring(L, 1);
 | 
			
		||||
	//HUDSAFE
 | 
			
		||||
	lua_pushinteger(L, R_TextureNumForName(name));
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// S_SOUND
 | 
			
		||||
////////////
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1897,28 +1916,45 @@ static int lib_gDoReborn(lua_State *L)
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int lib_gExitLevel(lua_State *L)
 | 
			
		||||
// Another Lua function that doesn't actually exist!
 | 
			
		||||
// Sets nextmapoverride & skipstats without instantly ending the level, for instances where other sources should be exiting the level, like normal signposts.
 | 
			
		||||
static int lib_gSetCustomExitVars(lua_State *L)
 | 
			
		||||
{
 | 
			
		||||
	int n = lua_gettop(L); // Num arguments
 | 
			
		||||
	NOHUD
 | 
			
		||||
 | 
			
		||||
	// LUA EXTENSION: Custom exit like support
 | 
			
		||||
	// Supported:
 | 
			
		||||
	//	G_ExitLevel();			[no modifications]
 | 
			
		||||
	//	G_ExitLevel(int)		[nextmap override only]
 | 
			
		||||
	//	G_ExitLevel(bool)		[skipstats only]
 | 
			
		||||
	//	G_ExitLevel(int, bool)	[both of the above]
 | 
			
		||||
	//	G_SetCustomExitVars();			[reset to defaults]
 | 
			
		||||
	//	G_SetCustomExitVars(int)		[nextmap override only]
 | 
			
		||||
	//	G_SetCustomExitVars(bool)		[skipstats only]
 | 
			
		||||
	//	G_SetCustomExitVars(int, bool)	[both of the above]
 | 
			
		||||
	if (n >= 1)
 | 
			
		||||
	{
 | 
			
		||||
		if (lua_isnumber(L, 1) || n >= 2)
 | 
			
		||||
		{
 | 
			
		||||
			nextmapoverride = (INT16)luaL_checknumber(L, 1);
 | 
			
		||||
			lua_pop(L, 1); // pop nextmapoverride; skipstats now 1 if available
 | 
			
		||||
			lua_remove(L, 1); // remove nextmapoverride; skipstats now 1 if available
 | 
			
		||||
		}
 | 
			
		||||
		skipstats = lua_optboolean(L, 1);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		nextmapoverride = 0;
 | 
			
		||||
		skipstats = false;
 | 
			
		||||
	}
 | 
			
		||||
	// ---
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int lib_gExitLevel(lua_State *L)
 | 
			
		||||
{
 | 
			
		||||
	int n = lua_gettop(L); // Num arguments
 | 
			
		||||
	NOHUD
 | 
			
		||||
	// Moved this bit to G_SetCustomExitVars
 | 
			
		||||
	if (n >= 1) // Don't run the reset to defaults option
 | 
			
		||||
		lib_gSetCustomExitVars(L);
 | 
			
		||||
	G_ExitLevel();
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -2165,6 +2201,10 @@ static luaL_Reg lib[] = {
 | 
			
		|||
	{"R_Frame2Char",lib_rFrame2Char},
 | 
			
		||||
	{"R_SetPlayerSkin",lib_rSetPlayerSkin},
 | 
			
		||||
 | 
			
		||||
	// r_data
 | 
			
		||||
	{"R_CheckTextureNumForName",lib_rCheckTextureNumForName},
 | 
			
		||||
	{"R_TextureNumForName",lib_rTextureNumForName},
 | 
			
		||||
 | 
			
		||||
	// s_sound
 | 
			
		||||
	{"S_StartSound",lib_sStartSound},
 | 
			
		||||
	{"S_StartSoundAtVolume",lib_sStartSoundAtVolume},
 | 
			
		||||
| 
						 | 
				
			
			@ -2179,6 +2219,7 @@ static luaL_Reg lib[] = {
 | 
			
		|||
	// g_game
 | 
			
		||||
	{"G_BuildMapName",lib_gBuildMapName},
 | 
			
		||||
	{"G_DoReborn",lib_gDoReborn},
 | 
			
		||||
	{"G_SetCustomExitVars",lib_gSetCustomExitVars},
 | 
			
		||||
	{"G_ExitLevel",lib_gExitLevel},
 | 
			
		||||
	{"G_IsSpecialStage",lib_gIsSpecialStage},
 | 
			
		||||
	{"G_GametypeUsesLives",lib_gGametypeUsesLives},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -795,16 +795,16 @@ static int side_set(lua_State *L)
 | 
			
		|||
		side->rowoffset = luaL_checkfixed(L, 3);
 | 
			
		||||
		break;
 | 
			
		||||
	case side_toptexture:
 | 
			
		||||
        side->toptexture = luaL_checkinteger(L, 3);
 | 
			
		||||
		side->toptexture = luaL_checkinteger(L, 3);
 | 
			
		||||
		break;
 | 
			
		||||
	case side_bottomtexture:
 | 
			
		||||
        side->bottomtexture = luaL_checkinteger(L, 3);
 | 
			
		||||
		side->bottomtexture = luaL_checkinteger(L, 3);
 | 
			
		||||
		break;
 | 
			
		||||
	case side_midtexture:
 | 
			
		||||
        side->midtexture = luaL_checkinteger(L, 3);
 | 
			
		||||
		side->midtexture = luaL_checkinteger(L, 3);
 | 
			
		||||
		break;
 | 
			
		||||
	case side_repeatcnt:
 | 
			
		||||
        side->repeatcnt = luaL_checkinteger(L, 3);
 | 
			
		||||
		side->repeatcnt = luaL_checkinteger(L, 3);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -1090,6 +1090,7 @@ static int ffloor_get(lua_State *L)
 | 
			
		|||
{
 | 
			
		||||
	ffloor_t *ffloor = *((ffloor_t **)luaL_checkudata(L, 1, META_FFLOOR));
 | 
			
		||||
	enum ffloor_e field = luaL_checkoption(L, 2, ffloor_opt[0], ffloor_opt);
 | 
			
		||||
	INT16 i;
 | 
			
		||||
 | 
			
		||||
	if (!ffloor)
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -1109,11 +1110,11 @@ static int ffloor_get(lua_State *L)
 | 
			
		|||
		lua_pushfixed(L, *ffloor->topheight);
 | 
			
		||||
		return 1;
 | 
			
		||||
	case ffloor_toppic: { // toppic
 | 
			
		||||
		levelflat_t *levelflat;
 | 
			
		||||
		INT16 i;
 | 
			
		||||
		for (i = 0, levelflat = levelflats; i != *ffloor->toppic; i++, levelflat++)
 | 
			
		||||
			;
 | 
			
		||||
		lua_pushlstring(L, levelflat->name, 8);
 | 
			
		||||
		levelflat_t *levelflat = &levelflats[*ffloor->toppic];
 | 
			
		||||
		for (i = 0; i < 8; i++)
 | 
			
		||||
			if (!levelflat->name[i])
 | 
			
		||||
				break;
 | 
			
		||||
		lua_pushlstring(L, levelflat->name, i);
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
	case ffloor_toplightlevel:
 | 
			
		||||
| 
						 | 
				
			
			@ -1123,11 +1124,11 @@ static int ffloor_get(lua_State *L)
 | 
			
		|||
		lua_pushfixed(L, *ffloor->bottomheight);
 | 
			
		||||
		return 1;
 | 
			
		||||
	case ffloor_bottompic: { // bottompic
 | 
			
		||||
		levelflat_t *levelflat;
 | 
			
		||||
		INT16 i;
 | 
			
		||||
		for (i = 0, levelflat = levelflats; i != *ffloor->bottompic; i++, levelflat++)
 | 
			
		||||
			;
 | 
			
		||||
		lua_pushlstring(L, levelflat->name, 8);
 | 
			
		||||
		levelflat_t *levelflat = &levelflats[*ffloor->bottompic];
 | 
			
		||||
		for (i = 0; i < 8; i++)
 | 
			
		||||
			if (!levelflat->name[i])
 | 
			
		||||
				break;
 | 
			
		||||
		lua_pushlstring(L, levelflat->name, i);
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
#ifdef ESLOPE
 | 
			
		||||
| 
						 | 
				
			
			@ -1504,6 +1505,8 @@ static int mapheaderinfo_get(lua_State *L)
 | 
			
		|||
		lua_pushinteger(L, header->levelselect);
 | 
			
		||||
	else if (fastcmp(field,"bonustype"))
 | 
			
		||||
		lua_pushinteger(L, header->bonustype);
 | 
			
		||||
	else if (fastcmp(field,"saveoverride"))
 | 
			
		||||
		lua_pushinteger(L, header->saveoverride);
 | 
			
		||||
	else if (fastcmp(field,"levelflags"))
 | 
			
		||||
		lua_pushinteger(L, header->levelflags);
 | 
			
		||||
	else if (fastcmp(field,"menuflags"))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										35
									
								
								src/m_menu.c
									
										
									
									
									
								
							
							
						
						
									
										35
									
								
								src/m_menu.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1089,25 +1089,29 @@ static menuitem_t OP_Joystick1Menu[] =
 | 
			
		|||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Moving"   , &cv_moveaxis         ,  40},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Strafe"   , &cv_sideaxis         ,  50},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Looking"  , &cv_lookaxis         ,  60},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Firing"   , &cv_fireaxis         ,  70},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For NFiring"  , &cv_firenaxis        ,  80},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Jumping"  , &cv_jumpaxis         ,  70},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Spinning" , &cv_spinaxis         ,  80},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Firing"   , &cv_fireaxis         ,  90},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For NFiring"  , &cv_firenaxis        , 100},
 | 
			
		||||
 | 
			
		||||
	{IT_STRING | IT_CVAR, NULL, "First-Person Vert-Look", &cv_alwaysfreelook,   100},
 | 
			
		||||
	{IT_STRING | IT_CVAR, NULL, "Third-Person Vert-Look", &cv_chasefreelook,   110},
 | 
			
		||||
	{IT_STRING | IT_CVAR, NULL, "First-Person Vert-Look", &cv_alwaysfreelook, 120},
 | 
			
		||||
	{IT_STRING | IT_CVAR, NULL, "Third-Person Vert-Look", &cv_chasefreelook,  130},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static menuitem_t OP_Joystick2Menu[] =
 | 
			
		||||
{
 | 
			
		||||
	{IT_STRING | IT_CALL,  NULL, "Select Joystick...", M_Setup2PJoystickMenu, 10},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Turning"  , &cv_turnaxis2        , 30},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Moving"   , &cv_moveaxis2        , 40},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Strafe"   , &cv_sideaxis2        , 50},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Looking"  , &cv_lookaxis2        , 60},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Firing"   , &cv_fireaxis2        , 70},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For NFiring"  , &cv_firenaxis2       , 80},
 | 
			
		||||
	{IT_STRING | IT_CALL,  NULL, "Select Joystick...", M_Setup2PJoystickMenu,  10},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Turning"  , &cv_turnaxis2        ,  30},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Moving"   , &cv_moveaxis2        ,  40},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Strafe"   , &cv_sideaxis2        ,  50},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Looking"  , &cv_lookaxis2        ,  60},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Jumping"  , &cv_jumpaxis2        ,  70},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Spinning" , &cv_spinaxis2        ,  80},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For Firing"   , &cv_fireaxis2        ,  90},
 | 
			
		||||
	{IT_STRING | IT_CVAR,  NULL, "Axis For NFiring"  , &cv_firenaxis2       , 100},
 | 
			
		||||
 | 
			
		||||
	{IT_STRING | IT_CVAR, NULL, "First-Person Vert-Look", &cv_alwaysfreelook2,   100},
 | 
			
		||||
	{IT_STRING | IT_CVAR, NULL, "Third-Person Vert-Look", &cv_chasefreelook2,   110},
 | 
			
		||||
	{IT_STRING | IT_CVAR, NULL, "First-Person Vert-Look", &cv_alwaysfreelook2,120},
 | 
			
		||||
	{IT_STRING | IT_CVAR, NULL, "Third-Person Vert-Look", &cv_chasefreelook2, 130},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static menuitem_t OP_JoystickSetMenu[] =
 | 
			
		||||
| 
						 | 
				
			
			@ -6837,9 +6841,10 @@ static void M_Setup2PControlsMenu(INT32 choice)
 | 
			
		|||
	OP_MPControlsMenu[0].status = IT_GRAYEDOUT2;
 | 
			
		||||
	OP_MPControlsMenu[1].status = IT_GRAYEDOUT2;
 | 
			
		||||
	OP_MPControlsMenu[2].status = IT_GRAYEDOUT2;
 | 
			
		||||
	// Hide the pause/console controls too
 | 
			
		||||
	// Hide the pause/console and system menu controls too
 | 
			
		||||
	OP_MiscControlsMenu[3].status = IT_GRAYEDOUT2;
 | 
			
		||||
	OP_MiscControlsMenu[4].status = IT_GRAYEDOUT2;
 | 
			
		||||
	OP_MiscControlsMenu[6].status = IT_GRAYEDOUT2;
 | 
			
		||||
	OP_MiscControlsMenu[8].status = IT_GRAYEDOUT2;
 | 
			
		||||
 | 
			
		||||
	OP_ControlListDef.prevMenu = &OP_P2ControlsDef;
 | 
			
		||||
	M_SetupNextMenu(&OP_ControlListDef);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										22
									
								
								src/m_misc.c
									
										
									
									
									
								
							
							
						
						
									
										22
									
								
								src/m_misc.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -443,7 +443,7 @@ void Command_LoadConfig_f(void)
 | 
			
		|||
	FIL_ForceExtension(configfile, ".cfg");
 | 
			
		||||
 | 
			
		||||
	// temporarily reset execversion to default
 | 
			
		||||
	cv_execversion.flags = 0;
 | 
			
		||||
	CV_ToggleExecVersion(true);
 | 
			
		||||
	COM_BufInsertText(va("%s \"%s\"\n", cv_execversion.name, cv_execversion.defaultvalue));
 | 
			
		||||
	CV_InitFilterVar();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -452,7 +452,7 @@ void Command_LoadConfig_f(void)
 | 
			
		|||
 | 
			
		||||
	// don't filter anymore vars and don't let this convsvar be changed
 | 
			
		||||
	COM_BufInsertText(va("%s \"%d\"\n", cv_execversion.name, EXECVERSION));
 | 
			
		||||
	cv_execversion.flags = CV_HIDEN;
 | 
			
		||||
	CV_ToggleExecVersion(false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Saves the current configuration and loads another.
 | 
			
		||||
| 
						 | 
				
			
			@ -494,7 +494,7 @@ void M_FirstLoadConfig(void)
 | 
			
		|||
 | 
			
		||||
	// temporarily reset execversion to default
 | 
			
		||||
	// we shouldn't need to do this, but JUST in case...
 | 
			
		||||
	cv_execversion.flags = 0;
 | 
			
		||||
	CV_ToggleExecVersion(true);
 | 
			
		||||
	COM_BufInsertText(va("%s \"%s\"\n", cv_execversion.name, cv_execversion.defaultvalue));
 | 
			
		||||
	CV_InitFilterVar();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -504,7 +504,7 @@ void M_FirstLoadConfig(void)
 | 
			
		|||
 | 
			
		||||
	// don't filter anymore vars and don't let this convsvar be changed
 | 
			
		||||
	COM_BufInsertText(va("%s \"%d\"\n", cv_execversion.name, EXECVERSION));
 | 
			
		||||
	cv_execversion.flags = CV_HIDEN;
 | 
			
		||||
	CV_ToggleExecVersion(false);
 | 
			
		||||
 | 
			
		||||
	// make sure I_Quit() will write back the correct config
 | 
			
		||||
	// (do not write back the config if it crash before)
 | 
			
		||||
| 
						 | 
				
			
			@ -518,6 +518,7 @@ void M_FirstLoadConfig(void)
 | 
			
		|||
void M_SaveConfig(const char *filename)
 | 
			
		||||
{
 | 
			
		||||
	FILE *f;
 | 
			
		||||
	char *filepath;
 | 
			
		||||
 | 
			
		||||
	// make sure not to write back the config until it's been correctly loaded
 | 
			
		||||
	if (!gameconfig_loaded)
 | 
			
		||||
| 
						 | 
				
			
			@ -532,13 +533,20 @@ void M_SaveConfig(const char *filename)
 | 
			
		|||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		f = fopen(filename, "w");
 | 
			
		||||
		// append srb2home to beginning of filename
 | 
			
		||||
		// but check if srb2home isn't already there, first
 | 
			
		||||
		if (!strstr(filename, srb2home))
 | 
			
		||||
			filepath = va(pandf,srb2home, filename);
 | 
			
		||||
		else
 | 
			
		||||
			filepath = Z_StrDup(filename);
 | 
			
		||||
 | 
			
		||||
		f = fopen(filepath, "w");
 | 
			
		||||
		// change it only if valid
 | 
			
		||||
		if (f)
 | 
			
		||||
			strcpy(configfile, filename);
 | 
			
		||||
			strcpy(configfile, filepath);
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			CONS_Alert(CONS_ERROR, M_GetText("Couldn't save game config file %s\n"), filename);
 | 
			
		||||
			CONS_Alert(CONS_ERROR, M_GetText("Couldn't save game config file %s\n"), filepath);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,9 +41,6 @@
 | 
			
		|||
// Convenience macro to fix issue with collision along bottom/left edges of blockmap -Red
 | 
			
		||||
#define BMBOUNDFIX(xl, xh, yl, yh) {if (xl > xh) xl = 0; if (yl > yh) yl = 0;}
 | 
			
		||||
 | 
			
		||||
// player radius used only in am_map.c
 | 
			
		||||
#define PLAYERRADIUS (16*FRACUNIT)
 | 
			
		||||
 | 
			
		||||
// MAXRADIUS is for precalculated sector block boxes
 | 
			
		||||
// the spider demon is larger,
 | 
			
		||||
// but we do not have any moving sectors nearby
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3506,7 +3506,7 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled
 | 
			
		|||
 | 
			
		||||
	if (player->pflags & PF_FLIPCAM && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP)
 | 
			
		||||
		postimg = postimg_flip;
 | 
			
		||||
	else if (player->awayviewtics && player->awayviewmobj != NULL)	// Camera must obviously exist
 | 
			
		||||
	else if (player->awayviewtics && player->awayviewmobj && !P_MobjWasRemoved(player->awayviewmobj)) // Camera must obviously exist
 | 
			
		||||
	{
 | 
			
		||||
		camera_t dummycam;
 | 
			
		||||
		dummycam.subsector = player->awayviewmobj->subsector;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -219,6 +219,8 @@ static void P_ClearSingleMapHeaderInfo(INT16 i)
 | 
			
		|||
	mapheaderinfo[num]->levelselect = 0;
 | 
			
		||||
	DEH_WriteUndoline("BONUSTYPE", va("%d", mapheaderinfo[num]->bonustype), UNDO_NONE);
 | 
			
		||||
	mapheaderinfo[num]->bonustype = 0;
 | 
			
		||||
	DEH_WriteUndoline("SAVEOVERRIDE", va("%d", mapheaderinfo[num]->saveoverride), UNDO_NONE);
 | 
			
		||||
	mapheaderinfo[num]->saveoverride = SAVE_DEFAULT;
 | 
			
		||||
	DEH_WriteUndoline("LEVELFLAGS", va("%d", mapheaderinfo[num]->levelflags), UNDO_NONE);
 | 
			
		||||
	mapheaderinfo[num]->levelflags = 0;
 | 
			
		||||
	DEH_WriteUndoline("MENUFLAGS", va("%d", mapheaderinfo[num]->menuflags), UNDO_NONE);
 | 
			
		||||
| 
						 | 
				
			
			@ -2000,7 +2002,7 @@ static boolean P_LoadRawBlockMap(UINT8 *data, size_t count, const char *lumpname
 | 
			
		|||
	if (!count || count >= 0x20000)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	CONS_Printf("Reading blockmap lump for pk3...\n");
 | 
			
		||||
	//CONS_Printf("Reading blockmap lump for pk3...\n");
 | 
			
		||||
 | 
			
		||||
	// no need to malloc anything, assume the data is uncompressed for now
 | 
			
		||||
	count /= 2;
 | 
			
		||||
| 
						 | 
				
			
			@ -2626,6 +2628,28 @@ static void P_SetupCamera(void)
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static boolean P_CanSave(void)
 | 
			
		||||
{
 | 
			
		||||
	// Saving is completely ignored under these conditions:
 | 
			
		||||
	if ((cursaveslot < 0) // Playing without saving
 | 
			
		||||
		|| (!modifiedgame || savemoddata) // Game is modified 
 | 
			
		||||
		|| (netgame || multiplayer) // Not in single-player
 | 
			
		||||
		|| (demoplayback || demorecording || metalrecording) // Currently in demo
 | 
			
		||||
		|| (players[consoleplayer].lives <= 0) // Completely dead
 | 
			
		||||
		|| (modeattacking || ultimatemode || G_IsSpecialStage(gamemap))) // Specialized instances
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	if (mapheaderinfo[gamemap-1]->saveoverride == SAVE_ALWAYS)
 | 
			
		||||
		return true; // Saving should ALWAYS happen!
 | 
			
		||||
	else if (mapheaderinfo[gamemap-1]->saveoverride == SAVE_NEVER)
 | 
			
		||||
		return false; // Saving should NEVER happen!
 | 
			
		||||
	
 | 
			
		||||
	// Default condition: In a non-hidden map, at the beginning of a zone or on a completed save-file, and not on save reload.
 | 
			
		||||
	return (!(mapheaderinfo[gamemap-1]->menuflags & LF2_HIDEINMENU)
 | 
			
		||||
			&& (mapheaderinfo[gamemap-1]->actnum < 2 || gamecomplete)
 | 
			
		||||
			&& (gamemap != lastmapsaved));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Loads a level from a lump or external wad.
 | 
			
		||||
  *
 | 
			
		||||
  * \param skipprecip If true, don't spawn precipitation.
 | 
			
		||||
| 
						 | 
				
			
			@ -2689,8 +2713,9 @@ boolean P_SetupLevel(boolean skipprecip)
 | 
			
		|||
 | 
			
		||||
	if (!dedicated)
 | 
			
		||||
	{
 | 
			
		||||
		if (!cv_cam_speed.changed)
 | 
			
		||||
			CV_Set(&cv_cam_speed, cv_cam_speed.defaultvalue);
 | 
			
		||||
		// Salt: CV_ClearChangedFlags() messes with your settings :(
 | 
			
		||||
		/*if (!cv_cam_speed.changed)
 | 
			
		||||
			CV_Set(&cv_cam_speed, cv_cam_speed.defaultvalue);*/
 | 
			
		||||
 | 
			
		||||
		if (!cv_chasecam.changed)
 | 
			
		||||
			CV_SetValue(&cv_chasecam, chase);
 | 
			
		||||
| 
						 | 
				
			
			@ -3025,20 +3050,22 @@ boolean P_SetupLevel(boolean skipprecip)
 | 
			
		|||
	{
 | 
			
		||||
		P_SetupCamera();
 | 
			
		||||
 | 
			
		||||
		if (!cv_cam_height.changed)
 | 
			
		||||
		// Salt: CV_ClearChangedFlags() messes with your settings :(
 | 
			
		||||
		/*if (!cv_cam_height.changed)
 | 
			
		||||
			CV_Set(&cv_cam_height, cv_cam_height.defaultvalue);
 | 
			
		||||
 | 
			
		||||
		if (!cv_cam_dist.changed)
 | 
			
		||||
			CV_Set(&cv_cam_dist, cv_cam_dist.defaultvalue);
 | 
			
		||||
 | 
			
		||||
		if (!cv_cam_rotate.changed)
 | 
			
		||||
			CV_Set(&cv_cam_rotate, cv_cam_rotate.defaultvalue);
 | 
			
		||||
 | 
			
		||||
		if (!cv_cam2_height.changed)
 | 
			
		||||
			CV_Set(&cv_cam2_height, cv_cam2_height.defaultvalue);
 | 
			
		||||
 | 
			
		||||
		if (!cv_cam2_dist.changed)
 | 
			
		||||
			CV_Set(&cv_cam2_dist, cv_cam2_dist.defaultvalue);
 | 
			
		||||
			CV_Set(&cv_cam2_dist, cv_cam2_dist.defaultvalue);*/
 | 
			
		||||
 | 
			
		||||
		// Though, I don't think anyone would care about cam_rotate being reset back to the only value that makes sense :P
 | 
			
		||||
		if (!cv_cam_rotate.changed)
 | 
			
		||||
			CV_Set(&cv_cam_rotate, cv_cam_rotate.defaultvalue);
 | 
			
		||||
 | 
			
		||||
		if (!cv_cam2_rotate.changed)
 | 
			
		||||
			CV_Set(&cv_cam2_rotate, cv_cam2_rotate.defaultvalue);
 | 
			
		||||
| 
						 | 
				
			
			@ -3103,10 +3130,7 @@ boolean P_SetupLevel(boolean skipprecip)
 | 
			
		|||
 | 
			
		||||
	P_RunCachedActions();
 | 
			
		||||
 | 
			
		||||
	if (!(netgame || multiplayer || demoplayback || demorecording || metalrecording || modeattacking || players[consoleplayer].lives <= 0)
 | 
			
		||||
		&& (!modifiedgame || savemoddata) && cursaveslot >= 0 && !ultimatemode
 | 
			
		||||
		&& !(mapheaderinfo[gamemap-1]->menuflags & LF2_HIDEINMENU)
 | 
			
		||||
		&& (!G_IsSpecialStage(gamemap)) && gamemap != lastmapsaved && (mapheaderinfo[gamemap-1]->actnum < 2 || gamecomplete))
 | 
			
		||||
	if (P_CanSave())
 | 
			
		||||
		G_SaveGame((UINT32)cursaveslot);
 | 
			
		||||
 | 
			
		||||
	if (savedata.lives > 0)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										56
									
								
								src/p_user.c
									
										
									
									
									
								
							
							
						
						
									
										56
									
								
								src/p_user.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -7781,18 +7781,18 @@ static CV_PossibleValue_t CV_CamSpeed[] = {{0, "MIN"}, {1*FRACUNIT, "MAX"}, {0,
 | 
			
		|||
static CV_PossibleValue_t rotation_cons_t[] = {{1, "MIN"}, {45, "MAX"}, {0, NULL}};
 | 
			
		||||
static CV_PossibleValue_t CV_CamRotate[] = {{-720, "MIN"}, {720, "MAX"}, {0, NULL}};
 | 
			
		||||
 | 
			
		||||
consvar_t cv_cam_dist = {"cam_dist", "128", CV_FLOAT, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam_height = {"cam_height", "20", CV_FLOAT, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam_dist = {"cam_dist", "160", CV_FLOAT|CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam_height = {"cam_height", "25", CV_FLOAT|CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam_still = {"cam_still", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam_speed = {"cam_speed", "0.25", CV_FLOAT, CV_CamSpeed, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam_speed = {"cam_speed", "0.3", CV_FLOAT|CV_SAVE, CV_CamSpeed, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam_rotate = {"cam_rotate", "0", CV_CALL|CV_NOINIT, CV_CamRotate, CV_CamRotate_OnChange, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam_rotspeed = {"cam_rotspeed", "10", 0, rotation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam2_dist = {"cam2_dist", "128", CV_FLOAT, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam2_height = {"cam2_height", "20", CV_FLOAT, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam_rotspeed = {"cam_rotspeed", "10", CV_SAVE, rotation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam2_dist = {"cam2_dist", "160", CV_FLOAT|CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam2_height = {"cam2_height", "25", CV_FLOAT|CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam2_still = {"cam2_still", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam2_speed = {"cam2_speed", "0.25", CV_FLOAT, CV_CamSpeed, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam2_speed = {"cam2_speed", "0.3", CV_FLOAT|CV_SAVE, CV_CamSpeed, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam2_rotate = {"cam2_rotate", "0", CV_CALL|CV_NOINIT, CV_CamRotate, CV_CamRotate2_OnChange, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam2_rotspeed = {"cam2_rotspeed", "10", 0, rotation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
consvar_t cv_cam2_rotspeed = {"cam2_rotspeed", "10", CV_SAVE, rotation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 | 
			
		||||
 | 
			
		||||
fixed_t t_cam_dist = -42;
 | 
			
		||||
fixed_t t_cam_height = -42;
 | 
			
		||||
| 
						 | 
				
			
			@ -8048,6 +8048,20 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
 | 
			
		|||
	{
 | 
			
		||||
		dist = camdist;
 | 
			
		||||
 | 
			
		||||
		// x1.5 dist for splitscreen
 | 
			
		||||
		if (splitscreen)
 | 
			
		||||
		{
 | 
			
		||||
			dist = FixedMul(dist, 3*FRACUNIT/2);
 | 
			
		||||
			camheight = FixedMul(camheight, 3*FRACUNIT/2);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// x1.2 dist for analog
 | 
			
		||||
		if (P_AnalogMove(player))
 | 
			
		||||
		{
 | 
			
		||||
			dist = FixedMul(dist, 6*FRACUNIT/5);
 | 
			
		||||
			camheight = FixedMul(camheight, 6*FRACUNIT/5);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (player->climbing || player->exiting || player->playerstate == PST_DEAD || (player->pflags & (PF_MACESPIN|PF_ITEMHANG|PF_ROPEHANG)))
 | 
			
		||||
			dist <<= 1;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -8372,7 +8386,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
 | 
			
		|||
	if (!(multiplayer || netgame) && !splitscreen)
 | 
			
		||||
	{
 | 
			
		||||
		fixed_t vx = thiscam->x, vy = thiscam->y;
 | 
			
		||||
		if (player->awayviewtics && player->awayviewmobj != NULL)		// Camera must obviously exist
 | 
			
		||||
		if (player->awayviewtics && player->awayviewmobj != NULL && !P_MobjWasRemoved(player->awayviewmobj))		// Camera must obviously exist
 | 
			
		||||
		{
 | 
			
		||||
			vx = player->awayviewmobj->x;
 | 
			
		||||
			vy = player->awayviewmobj->y;
 | 
			
		||||
| 
						 | 
				
			
			@ -8534,7 +8548,7 @@ static void P_CalcPostImg(player_t *player)
 | 
			
		|||
	else
 | 
			
		||||
		pviewheight = player->mo->z + player->viewheight;
 | 
			
		||||
 | 
			
		||||
	if (player->awayviewtics)
 | 
			
		||||
	if (player->awayviewtics && player->awayviewmobj && !P_MobjWasRemoved(player->awayviewmobj))
 | 
			
		||||
	{
 | 
			
		||||
		sector = player->awayviewmobj->subsector->sector;
 | 
			
		||||
		pviewheight = player->awayviewmobj->z + 20*FRACUNIT;
 | 
			
		||||
| 
						 | 
				
			
			@ -8701,6 +8715,13 @@ void P_PlayerThink(player_t *player)
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if (player->awayviewmobj && P_MobjWasRemoved(player->awayviewmobj))
 | 
			
		||||
	{
 | 
			
		||||
		P_SetTarget(&player->awayviewmobj, NULL); // remove awayviewmobj asap if invalid
 | 
			
		||||
		player->awayviewtics = 0; // reset to zero
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (player->pflags & PF_GLIDING)
 | 
			
		||||
	{
 | 
			
		||||
		if (player->panim != PA_ABILITY)
 | 
			
		||||
| 
						 | 
				
			
			@ -8712,9 +8733,14 @@ void P_PlayerThink(player_t *player)
 | 
			
		|||
	if (player->flashcount)
 | 
			
		||||
		player->flashcount--;
 | 
			
		||||
 | 
			
		||||
	// By the time P_MoveChaseCamera is called, this might be zero. Do not do it here.
 | 
			
		||||
	//if (player->awayviewtics)
 | 
			
		||||
	//	player->awayviewtics--;
 | 
			
		||||
	// Re-fixed by Jimita (11-12-2018)
 | 
			
		||||
	if (player->awayviewtics)
 | 
			
		||||
	{
 | 
			
		||||
		player->awayviewtics--;
 | 
			
		||||
		if (!player->awayviewtics)
 | 
			
		||||
			player->awayviewtics = -1;
 | 
			
		||||
		// The timer might've reached zero, but we'll run the remote view camera anyway by setting it to -1.
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/// \note do this in the cheat code
 | 
			
		||||
	if (player->pflags & PF_NOCLIP)
 | 
			
		||||
| 
						 | 
				
			
			@ -9492,8 +9518,8 @@ void P_PlayerAfterThink(player_t *player)
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (player->awayviewtics)
 | 
			
		||||
		player->awayviewtics--;
 | 
			
		||||
	if (player->awayviewtics < 0)
 | 
			
		||||
		player->awayviewtics = 0;
 | 
			
		||||
 | 
			
		||||
	// spectator invisibility and nogravity.
 | 
			
		||||
	if ((netgame || multiplayer) && player->spectator)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1119,7 +1119,6 @@ static void R_Subsector(size_t num)
 | 
			
		|||
				}
 | 
			
		||||
 | 
			
		||||
				light = R_GetPlaneLight(frontsector, polysec->floorheight, viewz < polysec->floorheight);
 | 
			
		||||
				light = 0;
 | 
			
		||||
				ffloor[numffloors].plane = R_FindPlane(polysec->floorheight, polysec->floorpic,
 | 
			
		||||
						polysec->lightlevel, xoff, yoff,
 | 
			
		||||
						polysec->floorpic_angle-po->angle,
 | 
			
		||||
| 
						 | 
				
			
			@ -1167,7 +1166,6 @@ static void R_Subsector(size_t num)
 | 
			
		|||
				}
 | 
			
		||||
 | 
			
		||||
				light = R_GetPlaneLight(frontsector, polysec->ceilingheight, viewz < polysec->ceilingheight);
 | 
			
		||||
				light = 0;
 | 
			
		||||
				ffloor[numffloors].plane = R_FindPlane(polysec->ceilingheight, polysec->ceilingpic,
 | 
			
		||||
					polysec->lightlevel, xoff, yoff, polysec->ceilingpic_angle-po->angle,
 | 
			
		||||
					NULL, NULL
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1220,7 +1220,7 @@ INT32 R_CreateColormap(char *p1, char *p2, char *p3)
 | 
			
		|||
			continue;
 | 
			
		||||
		if (maskcolor == extra_colormaps[i].maskcolor
 | 
			
		||||
			&& fadecolor == extra_colormaps[i].fadecolor
 | 
			
		||||
			&& (float)maskamt == (float)extra_colormaps[i].maskamt
 | 
			
		||||
			&& fabsf((float)(maskamt - extra_colormaps[i].maskamt)) < 1.0E-36f
 | 
			
		||||
			&& fadestart == extra_colormaps[i].fadestart
 | 
			
		||||
			&& fadeend == extra_colormaps[i].fadeend
 | 
			
		||||
			&& fog == extra_colormaps[i].fog)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										289
									
								
								src/r_main.c
									
										
									
									
									
								
							
							
						
						
									
										289
									
								
								src/r_main.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -551,13 +551,11 @@ void R_SetViewSize(void)
 | 
			
		|||
//
 | 
			
		||||
void R_ExecuteSetViewSize(void)
 | 
			
		||||
{
 | 
			
		||||
	fixed_t cosadj;
 | 
			
		||||
	fixed_t dy;
 | 
			
		||||
	INT32 i;
 | 
			
		||||
	INT32 j;
 | 
			
		||||
	INT32 level;
 | 
			
		||||
	INT32 startmapl;
 | 
			
		||||
	INT32 aspectx;  //added : 02-02-98 : for aspect ratio calc. below...
 | 
			
		||||
 | 
			
		||||
	setsizeneeded = false;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -597,31 +595,22 @@ void R_ExecuteSetViewSize(void)
 | 
			
		|||
	for (i = 0; i < viewwidth; i++)
 | 
			
		||||
		screenheightarray[i] = (INT16)viewheight;
 | 
			
		||||
 | 
			
		||||
	// setup sky scaling (uses pspriteyscale)
 | 
			
		||||
	// setup sky scaling
 | 
			
		||||
	R_SetSkyScale();
 | 
			
		||||
 | 
			
		||||
	// planes
 | 
			
		||||
	//aspectx = (((vid.height*centerx*BASEVIDWIDTH)/BASEVIDHEIGHT)/vid.width);
 | 
			
		||||
	aspectx = centerx;
 | 
			
		||||
 | 
			
		||||
	if (rendermode == render_soft)
 | 
			
		||||
	{
 | 
			
		||||
		// this is only used for planes rendering in software mode
 | 
			
		||||
		j = viewheight*8;
 | 
			
		||||
		j = viewheight*16;
 | 
			
		||||
		for (i = 0; i < j; i++)
 | 
			
		||||
		{
 | 
			
		||||
			dy = ((i - viewheight*2)<<FRACBITS) + FRACUNIT/2;
 | 
			
		||||
			dy = ((i - viewheight*8)<<FRACBITS) + FRACUNIT/2;
 | 
			
		||||
			dy = abs(dy);
 | 
			
		||||
			yslopetab[i] = FixedDiv(aspectx*FRACUNIT, dy);
 | 
			
		||||
			yslopetab[i] = FixedDiv(centerx*FRACUNIT, dy);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < viewwidth; i++)
 | 
			
		||||
	{
 | 
			
		||||
		cosadj = abs(FINECOSINE(xtoviewangle[i]>>ANGLETOFINESHIFT));
 | 
			
		||||
		distscale[i] = FixedDiv(FRACUNIT, cosadj);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	memset(scalelight, 0xFF, sizeof(scalelight));
 | 
			
		||||
 | 
			
		||||
	// Calculate the light levels to use for each level/scale combination.
 | 
			
		||||
| 
						 | 
				
			
			@ -734,9 +723,136 @@ static mobj_t *viewmobj;
 | 
			
		|||
// WARNING: a should be unsigned but to add with 2048, it isn't!
 | 
			
		||||
#define AIMINGTODY(a) ((FINETANGENT((2048+(((INT32)a)>>ANGLETOFINESHIFT)) & FINEMASK)*160)>>FRACBITS)
 | 
			
		||||
 | 
			
		||||
void R_SkyboxFrame(player_t *player)
 | 
			
		||||
// recalc necessary stuff for mouseaiming
 | 
			
		||||
// slopes are already calculated for the full possible view (which is 4*viewheight).
 | 
			
		||||
// 18/08/18: (No it's actually 16*viewheight, thanks Jimita for finding this out)
 | 
			
		||||
static void R_SetupFreelook(void)
 | 
			
		||||
{
 | 
			
		||||
	INT32 dy = 0;
 | 
			
		||||
	if (rendermode == render_soft)
 | 
			
		||||
	{
 | 
			
		||||
		// clip it in the case we are looking a hardware 90 degrees full aiming
 | 
			
		||||
		// (lmps, network and use F12...)
 | 
			
		||||
		G_SoftwareClipAimingPitch((INT32 *)&aimingangle);
 | 
			
		||||
		dy = AIMINGTODY(aimingangle) * viewwidth/BASEVIDWIDTH;
 | 
			
		||||
		yslope = &yslopetab[viewheight*8 - (viewheight/2 + dy)];
 | 
			
		||||
	}
 | 
			
		||||
	centery = (viewheight/2) + dy;
 | 
			
		||||
	centeryfrac = centery<<FRACBITS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef AIMINGTODY
 | 
			
		||||
 | 
			
		||||
void R_SetupFrame(player_t *player, boolean skybox)
 | 
			
		||||
{
 | 
			
		||||
	camera_t *thiscam;
 | 
			
		||||
	boolean chasecam = false;
 | 
			
		||||
 | 
			
		||||
	if (splitscreen && player == &players[secondarydisplayplayer]
 | 
			
		||||
		&& player != &players[consoleplayer])
 | 
			
		||||
	{
 | 
			
		||||
		thiscam = &camera2;
 | 
			
		||||
		chasecam = (cv_chasecam2.value != 0);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		thiscam = &camera;
 | 
			
		||||
		chasecam = (cv_chasecam.value != 0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (player->climbing || (player->pflags & PF_NIGHTSMODE) || player->playerstate == PST_DEAD)
 | 
			
		||||
		chasecam = true; // force chasecam on
 | 
			
		||||
	else if (player->spectator) // no spectator chasecam
 | 
			
		||||
		chasecam = false; // force chasecam off
 | 
			
		||||
 | 
			
		||||
	if (chasecam && !thiscam->chase)
 | 
			
		||||
	{
 | 
			
		||||
		P_ResetCamera(player, thiscam);
 | 
			
		||||
		thiscam->chase = true;
 | 
			
		||||
	}
 | 
			
		||||
	else if (!chasecam)
 | 
			
		||||
		thiscam->chase = false;
 | 
			
		||||
 | 
			
		||||
	viewsky = !skybox;
 | 
			
		||||
	if (player->awayviewtics)
 | 
			
		||||
	{
 | 
			
		||||
		// cut-away view stuff
 | 
			
		||||
		viewmobj = player->awayviewmobj; // should be a MT_ALTVIEWMAN
 | 
			
		||||
		I_Assert(viewmobj != NULL);
 | 
			
		||||
		viewz = viewmobj->z + 20*FRACUNIT;
 | 
			
		||||
		aimingangle = player->awayviewaiming;
 | 
			
		||||
		viewangle = viewmobj->angle;
 | 
			
		||||
	}
 | 
			
		||||
	else if (!player->spectator && chasecam)
 | 
			
		||||
	// use outside cam view
 | 
			
		||||
	{
 | 
			
		||||
		viewmobj = NULL;
 | 
			
		||||
		viewz = thiscam->z + (thiscam->height>>1);
 | 
			
		||||
		aimingangle = thiscam->aiming;
 | 
			
		||||
		viewangle = thiscam->angle;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	// use the player's eyes view
 | 
			
		||||
	{
 | 
			
		||||
		viewz = player->viewz;
 | 
			
		||||
 | 
			
		||||
		viewmobj = player->mo;
 | 
			
		||||
		I_Assert(viewmobj != NULL);
 | 
			
		||||
 | 
			
		||||
		aimingangle = player->aiming;
 | 
			
		||||
		viewangle = viewmobj->angle;
 | 
			
		||||
 | 
			
		||||
		if (!demoplayback && player->playerstate != PST_DEAD)
 | 
			
		||||
		{
 | 
			
		||||
			if (player == &players[consoleplayer])
 | 
			
		||||
			{
 | 
			
		||||
				viewangle = localangle; // WARNING: camera uses this
 | 
			
		||||
				aimingangle = localaiming;
 | 
			
		||||
			}
 | 
			
		||||
			else if (player == &players[secondarydisplayplayer])
 | 
			
		||||
			{
 | 
			
		||||
				viewangle = localangle2;
 | 
			
		||||
				aimingangle = localaiming2;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	viewz += quake.z;
 | 
			
		||||
 | 
			
		||||
	viewplayer = player;
 | 
			
		||||
 | 
			
		||||
	if (chasecam && !player->awayviewtics && !player->spectator)
 | 
			
		||||
	{
 | 
			
		||||
		viewx = thiscam->x;
 | 
			
		||||
		viewy = thiscam->y;
 | 
			
		||||
		viewx += quake.x;
 | 
			
		||||
		viewy += quake.y;
 | 
			
		||||
 | 
			
		||||
		if (thiscam->subsector)
 | 
			
		||||
			viewsector = thiscam->subsector->sector;
 | 
			
		||||
		else
 | 
			
		||||
			viewsector = R_PointInSubsector(viewx, viewy)->sector;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		viewx = viewmobj->x;
 | 
			
		||||
		viewy = viewmobj->y;
 | 
			
		||||
		viewx += quake.x;
 | 
			
		||||
		viewy += quake.y;
 | 
			
		||||
 | 
			
		||||
		if (viewmobj->subsector)
 | 
			
		||||
			viewsector = viewmobj->subsector->sector;
 | 
			
		||||
		else
 | 
			
		||||
			viewsector = R_PointInSubsector(viewx, viewy)->sector;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
 | 
			
		||||
	viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
 | 
			
		||||
 | 
			
		||||
	R_SetupFreelook();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void R_SkyboxFrame(player_t *player)
 | 
			
		||||
{
 | 
			
		||||
	camera_t *thiscam;
 | 
			
		||||
 | 
			
		||||
	if (splitscreen && player == &players[secondarydisplayplayer]
 | 
			
		||||
| 
						 | 
				
			
			@ -950,146 +1066,7 @@ void R_SkyboxFrame(player_t *player)
 | 
			
		|||
	viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
 | 
			
		||||
	viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
 | 
			
		||||
 | 
			
		||||
	// recalc necessary stuff for mouseaiming
 | 
			
		||||
	// slopes are already calculated for the full possible view (which is 4*viewheight).
 | 
			
		||||
	// 18/08/18: (No it's actually 8*viewheight, thanks MPC aka Jimita for finding this out)
 | 
			
		||||
 | 
			
		||||
	if (rendermode == render_soft)
 | 
			
		||||
	{
 | 
			
		||||
		// clip it in the case we are looking a hardware 90 degrees full aiming
 | 
			
		||||
		// (lmps, network and use F12...)
 | 
			
		||||
		G_SoftwareClipAimingPitch((INT32 *)&aimingangle);
 | 
			
		||||
 | 
			
		||||
		dy = AIMINGTODY(aimingangle) * viewwidth/BASEVIDWIDTH;
 | 
			
		||||
 | 
			
		||||
		yslope = &yslopetab[(3*viewheight/2) - dy];
 | 
			
		||||
	}
 | 
			
		||||
	centery = (viewheight/2) + dy;
 | 
			
		||||
	centeryfrac = centery<<FRACBITS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void R_SetupFrame(player_t *player, boolean skybox)
 | 
			
		||||
{
 | 
			
		||||
	INT32 dy = 0;
 | 
			
		||||
	camera_t *thiscam;
 | 
			
		||||
	boolean chasecam = false;
 | 
			
		||||
 | 
			
		||||
	if (splitscreen && player == &players[secondarydisplayplayer]
 | 
			
		||||
		&& player != &players[consoleplayer])
 | 
			
		||||
	{
 | 
			
		||||
		thiscam = &camera2;
 | 
			
		||||
		chasecam = (cv_chasecam2.value != 0);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		thiscam = &camera;
 | 
			
		||||
		chasecam = (cv_chasecam.value != 0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (player->climbing || (player->pflags & PF_NIGHTSMODE) || player->playerstate == PST_DEAD)
 | 
			
		||||
		chasecam = true; // force chasecam on
 | 
			
		||||
	else if (player->spectator) // no spectator chasecam
 | 
			
		||||
		chasecam = false; // force chasecam off
 | 
			
		||||
 | 
			
		||||
	if (chasecam && !thiscam->chase)
 | 
			
		||||
	{
 | 
			
		||||
		P_ResetCamera(player, thiscam);
 | 
			
		||||
		thiscam->chase = true;
 | 
			
		||||
	}
 | 
			
		||||
	else if (!chasecam)
 | 
			
		||||
		thiscam->chase = false;
 | 
			
		||||
 | 
			
		||||
	viewsky = !skybox;
 | 
			
		||||
	if (player->awayviewtics)
 | 
			
		||||
	{
 | 
			
		||||
		// cut-away view stuff
 | 
			
		||||
		viewmobj = player->awayviewmobj; // should be a MT_ALTVIEWMAN
 | 
			
		||||
		I_Assert(viewmobj != NULL);
 | 
			
		||||
		viewz = viewmobj->z + 20*FRACUNIT;
 | 
			
		||||
		aimingangle = player->awayviewaiming;
 | 
			
		||||
		viewangle = viewmobj->angle;
 | 
			
		||||
	}
 | 
			
		||||
	else if (!player->spectator && chasecam)
 | 
			
		||||
	// use outside cam view
 | 
			
		||||
	{
 | 
			
		||||
		viewmobj = NULL;
 | 
			
		||||
		viewz = thiscam->z + (thiscam->height>>1);
 | 
			
		||||
		aimingangle = thiscam->aiming;
 | 
			
		||||
		viewangle = thiscam->angle;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	// use the player's eyes view
 | 
			
		||||
	{
 | 
			
		||||
		viewz = player->viewz;
 | 
			
		||||
 | 
			
		||||
		viewmobj = player->mo;
 | 
			
		||||
		I_Assert(viewmobj != NULL);
 | 
			
		||||
 | 
			
		||||
		aimingangle = player->aiming;
 | 
			
		||||
		viewangle = viewmobj->angle;
 | 
			
		||||
 | 
			
		||||
		if (!demoplayback && player->playerstate != PST_DEAD)
 | 
			
		||||
		{
 | 
			
		||||
			if (player == &players[consoleplayer])
 | 
			
		||||
			{
 | 
			
		||||
				viewangle = localangle; // WARNING: camera uses this
 | 
			
		||||
				aimingangle = localaiming;
 | 
			
		||||
			}
 | 
			
		||||
			else if (player == &players[secondarydisplayplayer])
 | 
			
		||||
			{
 | 
			
		||||
				viewangle = localangle2;
 | 
			
		||||
				aimingangle = localaiming2;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	viewz += quake.z;
 | 
			
		||||
 | 
			
		||||
	viewplayer = player;
 | 
			
		||||
 | 
			
		||||
	if (chasecam && !player->awayviewtics && !player->spectator)
 | 
			
		||||
	{
 | 
			
		||||
		viewx = thiscam->x;
 | 
			
		||||
		viewy = thiscam->y;
 | 
			
		||||
		viewx += quake.x;
 | 
			
		||||
		viewy += quake.y;
 | 
			
		||||
 | 
			
		||||
		if (thiscam->subsector)
 | 
			
		||||
			viewsector = thiscam->subsector->sector;
 | 
			
		||||
		else
 | 
			
		||||
			viewsector = R_PointInSubsector(viewx, viewy)->sector;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		viewx = viewmobj->x;
 | 
			
		||||
		viewy = viewmobj->y;
 | 
			
		||||
		viewx += quake.x;
 | 
			
		||||
		viewy += quake.y;
 | 
			
		||||
 | 
			
		||||
		if (viewmobj->subsector)
 | 
			
		||||
			viewsector = viewmobj->subsector->sector;
 | 
			
		||||
		else
 | 
			
		||||
			viewsector = R_PointInSubsector(viewx, viewy)->sector;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
 | 
			
		||||
	viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
 | 
			
		||||
 | 
			
		||||
	// recalc necessary stuff for mouseaiming
 | 
			
		||||
	// slopes are already calculated for the full possible view (which is 4*viewheight).
 | 
			
		||||
	// 18/08/18: (No it's actually 8*viewheight, thanks MPC aka Jimita for finding this out)
 | 
			
		||||
 | 
			
		||||
	if (rendermode == render_soft)
 | 
			
		||||
	{
 | 
			
		||||
		// clip it in the case we are looking a hardware 90 degrees full aiming
 | 
			
		||||
		// (lmps, network and use F12...)
 | 
			
		||||
		G_SoftwareClipAimingPitch((INT32 *)&aimingangle);
 | 
			
		||||
 | 
			
		||||
		dy = AIMINGTODY(aimingangle) * viewwidth/BASEVIDWIDTH;
 | 
			
		||||
 | 
			
		||||
		yslope = &yslopetab[(3*viewheight/2) - dy];
 | 
			
		||||
	}
 | 
			
		||||
	centery = (viewheight/2) + dy;
 | 
			
		||||
	centeryfrac = centery<<FRACBITS;
 | 
			
		||||
	R_SetupFreelook();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define ANGLED_PORTALS
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,8 @@
 | 
			
		|||
#include "doomdef.h"
 | 
			
		||||
#include "console.h"
 | 
			
		||||
#include "g_game.h"
 | 
			
		||||
#include "p_setup.h" // levelflats
 | 
			
		||||
#include "p_slopes.h"
 | 
			
		||||
#include "r_data.h"
 | 
			
		||||
#include "r_local.h"
 | 
			
		||||
#include "r_state.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -26,9 +28,12 @@
 | 
			
		|||
#include "z_zone.h"
 | 
			
		||||
#include "p_tick.h"
 | 
			
		||||
 | 
			
		||||
#include "p_setup.h" // levelflats
 | 
			
		||||
 | 
			
		||||
#include "p_slopes.h"
 | 
			
		||||
#ifdef TIMING
 | 
			
		||||
#include "p5prof.h"
 | 
			
		||||
	INT64 mycount;
 | 
			
		||||
	INT64 mytotal = 0;
 | 
			
		||||
	UINT32 nombre = 100000;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// opening
 | 
			
		||||
| 
						 | 
				
			
			@ -51,7 +56,7 @@ visplane_t *floorplane;
 | 
			
		|||
visplane_t *ceilingplane;
 | 
			
		||||
static visplane_t *currentplane;
 | 
			
		||||
 | 
			
		||||
planemgr_t ffloor[MAXFFLOORS];
 | 
			
		||||
visffloor_t ffloor[MAXFFLOORS];
 | 
			
		||||
INT32 numffloors;
 | 
			
		||||
 | 
			
		||||
//SoM: 3/23/2000: Boom visplane hashing routine.
 | 
			
		||||
| 
						 | 
				
			
			@ -89,10 +94,9 @@ static fixed_t planeheight;
 | 
			
		|||
//                (this is to calculate yslopes only when really needed)
 | 
			
		||||
//                (when mouselookin', yslope is moving into yslopetab)
 | 
			
		||||
//                Check R_SetupFrame, R_SetViewSize for more...
 | 
			
		||||
fixed_t yslopetab[MAXVIDHEIGHT*8];
 | 
			
		||||
fixed_t yslopetab[MAXVIDHEIGHT*16];
 | 
			
		||||
fixed_t *yslope;
 | 
			
		||||
 | 
			
		||||
fixed_t distscale[MAXVIDWIDTH];
 | 
			
		||||
fixed_t basexscale, baseyscale;
 | 
			
		||||
 | 
			
		||||
fixed_t cachedheight[MAXVIDHEIGHT];
 | 
			
		||||
| 
						 | 
				
			
			@ -155,34 +159,19 @@ void R_PortalRestoreClipValues(INT32 start, INT32 end, INT16 *ceil, INT16 *floor
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//profile stuff ---------------------------------------------------------
 | 
			
		||||
//#define TIMING
 | 
			
		||||
#ifdef TIMING
 | 
			
		||||
#include "p5prof.h"
 | 
			
		||||
         INT64 mycount;
 | 
			
		||||
         INT64 mytotal = 0;
 | 
			
		||||
         UINT32 nombre = 100000;
 | 
			
		||||
#endif
 | 
			
		||||
//profile stuff ---------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// R_MapPlane
 | 
			
		||||
//
 | 
			
		||||
// Uses global vars:
 | 
			
		||||
//  planeheight
 | 
			
		||||
//  ds_source
 | 
			
		||||
//  basexscale
 | 
			
		||||
//  baseyscale
 | 
			
		||||
//  centerx
 | 
			
		||||
//  viewx
 | 
			
		||||
//  viewy
 | 
			
		||||
//  xoffs
 | 
			
		||||
//  yoffs
 | 
			
		||||
//  planeangle
 | 
			
		||||
//
 | 
			
		||||
// BASIC PRIMITIVE
 | 
			
		||||
//
 | 
			
		||||
//  viewsin
 | 
			
		||||
//  viewcos
 | 
			
		||||
//  viewheight
 | 
			
		||||
 | 
			
		||||
#ifndef NOWATER
 | 
			
		||||
static INT32 bgofs;
 | 
			
		||||
static INT32 wtofs=0;
 | 
			
		||||
| 
						 | 
				
			
			@ -190,10 +179,6 @@ static INT32 waterofs;
 | 
			
		|||
static boolean itswater;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __mips__
 | 
			
		||||
//#define NOWATER
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef NOWATER
 | 
			
		||||
static void R_DrawTranslucentWaterSpan_8(void)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -275,8 +260,8 @@ static void R_DrawTranslucentWaterSpan_8(void)
 | 
			
		|||
 | 
			
		||||
void R_MapPlane(INT32 y, INT32 x1, INT32 x2)
 | 
			
		||||
{
 | 
			
		||||
	angle_t angle;
 | 
			
		||||
	fixed_t distance, length;
 | 
			
		||||
	angle_t angle, planecos, planesin;
 | 
			
		||||
	fixed_t distance, span;
 | 
			
		||||
	size_t pindex;
 | 
			
		||||
 | 
			
		||||
#ifdef RANGECHECK
 | 
			
		||||
| 
						 | 
				
			
			@ -287,12 +272,22 @@ void R_MapPlane(INT32 y, INT32 x1, INT32 x2)
 | 
			
		|||
	// from r_splats's R_RenderFloorSplat
 | 
			
		||||
	if (x1 >= vid.width) x1 = vid.width - 1;
 | 
			
		||||
 | 
			
		||||
	angle = (currentplane->viewangle + currentplane->plangle)>>ANGLETOFINESHIFT;
 | 
			
		||||
	planecos = FINECOSINE(angle);
 | 
			
		||||
	planesin = FINESINE(angle);
 | 
			
		||||
 | 
			
		||||
	if (planeheight != cachedheight[y])
 | 
			
		||||
	{
 | 
			
		||||
		cachedheight[y] = planeheight;
 | 
			
		||||
		distance = cacheddistance[y] = FixedMul(planeheight, yslope[y]);
 | 
			
		||||
		ds_xstep = cachedxstep[y] = FixedMul(distance, basexscale);
 | 
			
		||||
		ds_ystep = cachedystep[y] = FixedMul(distance, baseyscale);
 | 
			
		||||
 | 
			
		||||
		if ((span = abs(centery-y)))
 | 
			
		||||
		{
 | 
			
		||||
			ds_xstep = cachedxstep[y] = FixedMul(planesin, planeheight) / span;
 | 
			
		||||
			ds_ystep = cachedystep[y] = FixedMul(planecos, planeheight) / span;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -301,13 +296,8 @@ void R_MapPlane(INT32 y, INT32 x1, INT32 x2)
 | 
			
		|||
		ds_ystep = cachedystep[y];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	length = FixedMul (distance,distscale[x1]);
 | 
			
		||||
	angle = (currentplane->viewangle + currentplane->plangle + xtoviewangle[x1])>>ANGLETOFINESHIFT;
 | 
			
		||||
	/// \note Wouldn't it be faster just to add viewx and viewy
 | 
			
		||||
	// to the plane's x/yoffs anyway??
 | 
			
		||||
 | 
			
		||||
	ds_xfrac = FixedMul(FINECOSINE(angle), length) + xoffs;
 | 
			
		||||
	ds_yfrac = yoffs - FixedMul(FINESINE(angle), length);
 | 
			
		||||
	ds_xfrac = xoffs + FixedMul(planecos, distance) + (x1 - centerx) * ds_xstep;
 | 
			
		||||
	ds_yfrac = yoffs - FixedMul(planesin, distance) + (x1 - centerx) * ds_ystep;
 | 
			
		||||
 | 
			
		||||
#ifndef NOWATER
 | 
			
		||||
	if (itswater)
 | 
			
		||||
| 
						 | 
				
			
			@ -315,8 +305,9 @@ void R_MapPlane(INT32 y, INT32 x1, INT32 x2)
 | 
			
		|||
		const INT32 yay = (wtofs + (distance>>9) ) & 8191;
 | 
			
		||||
		// ripples da water texture
 | 
			
		||||
		bgofs = FixedDiv(FINESINE(yay), (1<<12) + (distance>>11))>>FRACBITS;
 | 
			
		||||
		angle = (currentplane->viewangle + currentplane->plangle + xtoviewangle[x1])>>ANGLETOFINESHIFT;
 | 
			
		||||
 | 
			
		||||
		angle = (angle + 2048) & 8191;  //90<EFBFBD>
 | 
			
		||||
		angle = (angle + 2048) & 8191;  // 90 degrees
 | 
			
		||||
		ds_xfrac += FixedMul(FINECOSINE(angle), (bgofs<<FRACBITS));
 | 
			
		||||
		ds_yfrac += FixedMul(FINESINE(angle), (bgofs<<FRACBITS));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -328,7 +319,6 @@ void R_MapPlane(INT32 y, INT32 x1, INT32 x2)
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
	pindex = distance >> LIGHTZSHIFT;
 | 
			
		||||
 | 
			
		||||
	if (pindex >= MAXLIGHTZ)
 | 
			
		||||
		pindex = MAXLIGHTZ - 1;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -365,8 +355,6 @@ void R_MapPlane(INT32 y, INT32 x1, INT32 x2)
 | 
			
		|||
// R_ClearPlanes
 | 
			
		||||
// At begining of frame.
 | 
			
		||||
//
 | 
			
		||||
// NOTE: Uses con_clipviewtop, so that when console is on,
 | 
			
		||||
//       we don't draw the part of the view hidden under the console.
 | 
			
		||||
void R_ClearPlanes(void)
 | 
			
		||||
{
 | 
			
		||||
	INT32 i, p;
 | 
			
		||||
| 
						 | 
				
			
			@ -376,12 +364,12 @@ void R_ClearPlanes(void)
 | 
			
		|||
	for (i = 0; i < viewwidth; i++)
 | 
			
		||||
	{
 | 
			
		||||
		floorclip[i] = (INT16)viewheight;
 | 
			
		||||
		ceilingclip[i] = (INT16)con_clipviewtop;
 | 
			
		||||
		ceilingclip[i] = -1;
 | 
			
		||||
		frontscale[i] = INT32_MAX;
 | 
			
		||||
		for (p = 0; p < MAXFFLOORS; p++)
 | 
			
		||||
		{
 | 
			
		||||
			ffloor[p].f_clip[i] = (INT16)viewheight;
 | 
			
		||||
			ffloor[p].c_clip[i] = (INT16)con_clipviewtop;
 | 
			
		||||
			ffloor[p].c_clip[i] = -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,6 @@
 | 
			
		|||
//
 | 
			
		||||
// Now what is a visplane, anyway?
 | 
			
		||||
// Simple: kinda floor/ceiling polygon optimised for SRB2 rendering.
 | 
			
		||||
// 7764 bytes! (for win32, anyway)
 | 
			
		||||
//
 | 
			
		||||
typedef struct visplane_s
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -39,25 +38,12 @@ typedef struct visplane_s
 | 
			
		|||
	extracolormap_t *extra_colormap;
 | 
			
		||||
 | 
			
		||||
	// leave pads for [minx-1]/[maxx+1]
 | 
			
		||||
 | 
			
		||||
	// words sucks .. should get rid of that.. but eats memory
 | 
			
		||||
	// THIS IS UNSIGNED! VERY IMPORTANT!!
 | 
			
		||||
	UINT16 pad1;
 | 
			
		||||
	UINT16 top[MAXVIDWIDTH];
 | 
			
		||||
	UINT16 pad2;
 | 
			
		||||
	UINT16 pad3;
 | 
			
		||||
	UINT16 bottom[MAXVIDWIDTH];
 | 
			
		||||
	UINT16 pad4;
 | 
			
		||||
 | 
			
		||||
	UINT16 padtopstart, top[MAXVIDWIDTH], padtopend;
 | 
			
		||||
	UINT16 padbottomstart, bottom[MAXVIDWIDTH], padbottomend;
 | 
			
		||||
	INT32 high, low; // R_PlaneBounds should set these.
 | 
			
		||||
 | 
			
		||||
	fixed_t xoffs, yoffs; // Scrolling flats.
 | 
			
		||||
 | 
			
		||||
	// SoM: frontscale should be stored in the first seg of the subsector
 | 
			
		||||
	// where the planes themselves are stored. I'm doing this now because
 | 
			
		||||
	// the old way caused trouble with the drawseg array was re-sized.
 | 
			
		||||
	INT32 scaleseg;
 | 
			
		||||
 | 
			
		||||
	struct ffloor_s *ffloor;
 | 
			
		||||
#ifdef POLYOBJECTS_PLANES
 | 
			
		||||
	polyobj_t *polyobj;
 | 
			
		||||
| 
						 | 
				
			
			@ -75,17 +61,15 @@ extern INT16 *lastopening, *openings;
 | 
			
		|||
extern size_t maxopenings;
 | 
			
		||||
 | 
			
		||||
extern INT16 floorclip[MAXVIDWIDTH], ceilingclip[MAXVIDWIDTH];
 | 
			
		||||
extern fixed_t frontscale[MAXVIDWIDTH], yslopetab[MAXVIDHEIGHT*8];
 | 
			
		||||
extern fixed_t frontscale[MAXVIDWIDTH], yslopetab[MAXVIDHEIGHT*16];
 | 
			
		||||
extern fixed_t cachedheight[MAXVIDHEIGHT];
 | 
			
		||||
extern fixed_t cacheddistance[MAXVIDHEIGHT];
 | 
			
		||||
extern fixed_t cachedxstep[MAXVIDHEIGHT];
 | 
			
		||||
extern fixed_t cachedystep[MAXVIDHEIGHT];
 | 
			
		||||
extern fixed_t basexscale, baseyscale;
 | 
			
		||||
 | 
			
		||||
extern lighttable_t **planezlight;
 | 
			
		||||
 | 
			
		||||
extern fixed_t *yslope;
 | 
			
		||||
extern fixed_t distscale[MAXVIDWIDTH];
 | 
			
		||||
extern lighttable_t **planezlight;
 | 
			
		||||
 | 
			
		||||
void R_InitPlanes(void);
 | 
			
		||||
void R_PortalStoreClipValues(INT32 start, INT32 end, INT16 *ceil, INT16 *floor, fixed_t *scale);
 | 
			
		||||
| 
						 | 
				
			
			@ -134,8 +118,8 @@ typedef struct planemgr_s
 | 
			
		|||
#ifdef POLYOBJECTS_PLANES
 | 
			
		||||
	polyobj_t *polyobj;
 | 
			
		||||
#endif
 | 
			
		||||
} planemgr_t;
 | 
			
		||||
} visffloor_t;
 | 
			
		||||
 | 
			
		||||
extern planemgr_t ffloor[MAXFFLOORS];
 | 
			
		||||
extern visffloor_t ffloor[MAXFFLOORS];
 | 
			
		||||
extern INT32 numffloors;
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										48
									
								
								src/r_segs.c
									
										
									
									
									
								
							
							
						
						
									
										48
									
								
								src/r_segs.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1344,24 +1344,12 @@ static void R_RenderSegLoop (void)
 | 
			
		|||
 | 
			
		||||
		if (markfloor)
 | 
			
		||||
		{
 | 
			
		||||
#if 0 // Old Doom Legacy code
 | 
			
		||||
			bottom = floorclip[rw_x]-1;
 | 
			
		||||
			if (top <= ceilingclip[rw_x])
 | 
			
		||||
				top = ceilingclip[rw_x]+1;
 | 
			
		||||
			if (top <= bottom && floorplane)
 | 
			
		||||
			{
 | 
			
		||||
				floorplane->top[rw_x] = (INT16)top;
 | 
			
		||||
				floorplane->bottom[rw_x] = (INT16)bottom;
 | 
			
		||||
			}
 | 
			
		||||
#else // Spiffy new PRBoom code
 | 
			
		||||
			top  = yh < ceilingclip[rw_x] ? ceilingclip[rw_x] : yh;
 | 
			
		||||
 | 
			
		||||
			top = yh < ceilingclip[rw_x] ? ceilingclip[rw_x] : yh;
 | 
			
		||||
			if (++top <= bottom && floorplane)
 | 
			
		||||
			{
 | 
			
		||||
				floorplane->top[rw_x] = (INT16)top;
 | 
			
		||||
				floorplane->bottom[rw_x] = (INT16)bottom;
 | 
			
		||||
			}
 | 
			
		||||
#endif
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (numffloors)
 | 
			
		||||
| 
						 | 
				
			
			@ -1645,26 +1633,11 @@ static void R_RenderSegLoop (void)
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		for (i = 0; i < numffloors; i++)
 | 
			
		||||
		{
 | 
			
		||||
#ifdef POLYOBJECTS_PLANES
 | 
			
		||||
			if (ffloor[i].polyobj && (!curline->polyseg || ffloor[i].polyobj != curline->polyseg))
 | 
			
		||||
				continue;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
			ffloor[i].f_frac += ffloor[i].f_step;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for (i = 0; i < numbackffloors; i++)
 | 
			
		||||
		{
 | 
			
		||||
			INT32 y_w;
 | 
			
		||||
 | 
			
		||||
#ifdef POLYOBJECTS_PLANES
 | 
			
		||||
			if (ffloor[i].polyobj && (!curline->polyseg || ffloor[i].polyobj != curline->polyseg))
 | 
			
		||||
				continue;
 | 
			
		||||
#endif
 | 
			
		||||
			y_w = ffloor[i].b_frac >> HEIGHTBITS;
 | 
			
		||||
 | 
			
		||||
			ffloor[i].f_clip[rw_x] = ffloor[i].c_clip[rw_x] = (INT16)(y_w & 0xFFFF);
 | 
			
		||||
			ffloor[i].f_clip[rw_x] = ffloor[i].c_clip[rw_x] = (INT16)((ffloor[i].b_frac >> HEIGHTBITS) & 0xFFFF);
 | 
			
		||||
			ffloor[i].b_frac += ffloor[i].b_step;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2775,11 +2748,6 @@ void R_StoreWallRange(INT32 start, INT32 stop)
 | 
			
		|||
	{
 | 
			
		||||
		for (i = 0; i < numffloors; i++)
 | 
			
		||||
		{
 | 
			
		||||
#ifdef POLYOBJECTS_PLANES
 | 
			
		||||
			if (ffloor[i].polyobj && (!curline->polyseg || ffloor[i].polyobj != curline->polyseg))
 | 
			
		||||
				continue;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
			ffloor[i].f_pos >>= 4;
 | 
			
		||||
#ifdef ESLOPE
 | 
			
		||||
			ffloor[i].f_pos_slope >>= 4;
 | 
			
		||||
| 
						 | 
				
			
			@ -3060,7 +3028,11 @@ void R_StoreWallRange(INT32 start, INT32 stop)
 | 
			
		|||
		if (ceilingplane) //SoM: 3/29/2000: Check for null ceiling planes
 | 
			
		||||
			ceilingplane = R_CheckPlane (ceilingplane, rw_x, rw_stopx-1);
 | 
			
		||||
		else
 | 
			
		||||
			markceiling = 0;
 | 
			
		||||
			markceiling = false;
 | 
			
		||||
 | 
			
		||||
		// Don't render the ceiling again when rendering polyobjects
 | 
			
		||||
		if (curline->polyseg)
 | 
			
		||||
			markceiling = false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// get a new or use the same visplane
 | 
			
		||||
| 
						 | 
				
			
			@ -3069,7 +3041,11 @@ void R_StoreWallRange(INT32 start, INT32 stop)
 | 
			
		|||
		if (floorplane) //SoM: 3/29/2000: Check for null planes
 | 
			
		||||
			floorplane = R_CheckPlane (floorplane, rw_x, rw_stopx-1);
 | 
			
		||||
		else
 | 
			
		||||
			markfloor = 0;
 | 
			
		||||
			markfloor = false;
 | 
			
		||||
 | 
			
		||||
		// Don't render the floor again when rendering polyobjects
 | 
			
		||||
		if (curline->polyseg)
 | 
			
		||||
			markfloor = false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ds_p->numffloorplanes = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -365,9 +365,8 @@ static void R_RenderFloorSplat(floorsplat_t *pSplat, vertex_t *verts, UINT8 *pTe
 | 
			
		|||
#else
 | 
			
		||||
	lighttable_t **planezlight;
 | 
			
		||||
	fixed_t planeheight;
 | 
			
		||||
	angle_t angle;
 | 
			
		||||
	fixed_t distance;
 | 
			
		||||
	fixed_t length;
 | 
			
		||||
	angle_t angle, planecos, planesin;
 | 
			
		||||
	fixed_t distance, span;
 | 
			
		||||
	size_t indexr;
 | 
			
		||||
	INT32 light;
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -473,12 +472,22 @@ static void R_RenderFloorSplat(floorsplat_t *pSplat, vertex_t *verts, UINT8 *pTe
 | 
			
		|||
		if (x2 >= vid.width)
 | 
			
		||||
			x2 = vid.width - 1;
 | 
			
		||||
 | 
			
		||||
		angle = (currentplane->viewangle + currentplane->plangle)>>ANGLETOFINESHIFT;
 | 
			
		||||
		planecos = FINECOSINE(angle);
 | 
			
		||||
		planesin = FINESINE(angle);
 | 
			
		||||
 | 
			
		||||
		if (planeheight != cachedheight[y])
 | 
			
		||||
		{
 | 
			
		||||
			cachedheight[y] = planeheight;
 | 
			
		||||
			distance = cacheddistance[y] = FixedMul(planeheight, yslope[y]);
 | 
			
		||||
			ds_xstep = cachedxstep[y] = FixedMul(distance,basexscale);
 | 
			
		||||
			ds_ystep = cachedystep[y] = FixedMul(distance,baseyscale);
 | 
			
		||||
 | 
			
		||||
			if ((span = abs(centery-y)))
 | 
			
		||||
			{
 | 
			
		||||
				ds_xstep = cachedxstep[y] = FixedMul(planesin, planeheight) / span;
 | 
			
		||||
				ds_ystep = cachedystep[y] = FixedMul(planecos, planeheight) / span;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -486,10 +495,9 @@ static void R_RenderFloorSplat(floorsplat_t *pSplat, vertex_t *verts, UINT8 *pTe
 | 
			
		|||
			ds_xstep = cachedxstep[y];
 | 
			
		||||
			ds_ystep = cachedystep[y];
 | 
			
		||||
		}
 | 
			
		||||
		length = FixedMul(distance, distscale[x1]);
 | 
			
		||||
		angle = (viewangle + xtoviewangle[x1])>>ANGLETOFINESHIFT;
 | 
			
		||||
		ds_xfrac = viewx + FixedMul(FINECOSINE(angle), length);
 | 
			
		||||
		ds_yfrac = -viewy - FixedMul(FINESINE(angle), length);
 | 
			
		||||
 | 
			
		||||
		ds_xfrac = xoffs + FixedMul(planecos, distance) + (x1 - centerx) * ds_xstep;
 | 
			
		||||
		ds_yfrac = yoffs - FixedMul(planesin, distance) + (x1 - centerx) * ds_ystep;
 | 
			
		||||
		ds_xfrac -= offsetx;
 | 
			
		||||
		ds_yfrac += offsety;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1733,7 +1733,7 @@ static void R_CreateDrawNodes(void)
 | 
			
		|||
			plane = ds->curline->polyseg->visplane;
 | 
			
		||||
			R_PlaneBounds(plane);
 | 
			
		||||
 | 
			
		||||
			if (plane->low < con_clipviewtop || plane->high > vid.height || plane->high > plane->low)
 | 
			
		||||
			if (plane->low < 0 || plane->high > vid.height || plane->high > plane->low)
 | 
			
		||||
				;
 | 
			
		||||
			else {
 | 
			
		||||
				// Put it in!
 | 
			
		||||
| 
						 | 
				
			
			@ -1762,7 +1762,7 @@ static void R_CreateDrawNodes(void)
 | 
			
		|||
					plane = ds->ffloorplanes[p];
 | 
			
		||||
					R_PlaneBounds(plane);
 | 
			
		||||
 | 
			
		||||
					if (plane->low < con_clipviewtop || plane->high > vid.height || plane->high > plane->low || plane->polyobj)
 | 
			
		||||
					if (plane->low < 0 || plane->high > vid.height || plane->high > plane->low || plane->polyobj)
 | 
			
		||||
					{
 | 
			
		||||
						ds->ffloorplanes[p] = NULL;
 | 
			
		||||
						continue;
 | 
			
		||||
| 
						 | 
				
			
			@ -1799,7 +1799,7 @@ static void R_CreateDrawNodes(void)
 | 
			
		|||
		plane = PolyObjects[i].visplane;
 | 
			
		||||
		R_PlaneBounds(plane);
 | 
			
		||||
 | 
			
		||||
		if (plane->low < con_clipviewtop || plane->high > vid.height || plane->high > plane->low)
 | 
			
		||||
		if (plane->low < 0 || plane->high > vid.height || plane->high > plane->low)
 | 
			
		||||
		{
 | 
			
		||||
			PolyObjects[i].visplane = NULL;
 | 
			
		||||
			continue;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -219,6 +219,7 @@ FUNCMATH FUNCINLINE static ATTRINLINE char R_Frame2Char(UINT8 frame)
 | 
			
		|||
FUNCMATH FUNCINLINE static ATTRINLINE UINT8 R_Char2Frame(char cn)
 | 
			
		||||
{
 | 
			
		||||
#if 1 // 2.1 compat
 | 
			
		||||
	if (cn == '+') return '\\' - 'A'; // PK3 can't use backslash, so use + instead
 | 
			
		||||
	return cn - 'A';
 | 
			
		||||
#else
 | 
			
		||||
	if (cn >= 'A' && cn <= 'Z') return cn - 'A';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -309,14 +309,6 @@ void SCR_Recalc(void)
 | 
			
		|||
	if (automapactive)
 | 
			
		||||
		AM_Stop();
 | 
			
		||||
 | 
			
		||||
	// r_plane stuff: visplanes, openings, floorclip, ceilingclip, spanstart,
 | 
			
		||||
	//                spanstop, yslope, distscale, cachedheight, cacheddistance,
 | 
			
		||||
	//                cachedxstep, cachedystep
 | 
			
		||||
	//             -> allocated at the maximum vidsize, static.
 | 
			
		||||
 | 
			
		||||
	// r_main: xtoviewangle, allocated at the maximum size.
 | 
			
		||||
	// r_things: negonearray, screenheightarray allocated max. size.
 | 
			
		||||
 | 
			
		||||
	// set the screen[x] ptrs on the new vidbuffers
 | 
			
		||||
	V_Init();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -278,13 +278,13 @@ if(${SDL2_FOUND})
 | 
			
		|||
				if (${CMAKE_GENERATOR} STREQUAL "MinGW Makefiles")
 | 
			
		||||
					if(${SRB2_SYSTEM_BITS} EQUAL 64)
 | 
			
		||||
						find_library(SRB2_SDL2_DLL_${dllname} "${defaultname}"
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/Bin/Resources/x86_64
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/libs/dll-binaries/x86_64
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2/x86_64-w64-mingw32/bin
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2_mixer/x86_64-w64-mingw32/bin
 | 
			
		||||
						)
 | 
			
		||||
					else()
 | 
			
		||||
						find_library(SRB2_SDL2_DLL_${dllname} "${defaultname}"
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/Bin/Resources/i686
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/libs/dll-binaries/i686
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2/i686-w64-mingw32/bin
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2_mixer/i686-w64-mingw32/bin
 | 
			
		||||
						)
 | 
			
		||||
| 
						 | 
				
			
			@ -292,13 +292,13 @@ if(${SDL2_FOUND})
 | 
			
		|||
				else()
 | 
			
		||||
					if(${SRB2_SYSTEM_BITS} EQUAL 64)
 | 
			
		||||
						find_library(SRB2_SDL2_DLL_${dllname} "${defaultname}"
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/Bin/Resources/x86_64
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/libs/dll-binaries/x86_64
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2/lib/x64
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2_mixer/lib/x64
 | 
			
		||||
						)
 | 
			
		||||
					else()
 | 
			
		||||
						find_library(SRB2_SDL2_DLL_${dllname} "${defaultname}"
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/Bin/Resources/i686
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/libs/dll-binaries/i686
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2/lib/x86
 | 
			
		||||
							HINTS ${CMAKE_SOURCE_DIR}/libs/SDL2_mixer/lib/x86
 | 
			
		||||
						)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1214,7 +1214,7 @@
 | 
			
		|||
		C01FCF4B08A954540054247B /* Debug */ = {
 | 
			
		||||
			isa = XCBuildConfiguration;
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 2.1.21;
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 2.1.22;
 | 
			
		||||
				GCC_PREPROCESSOR_DEFINITIONS = (
 | 
			
		||||
					"$(inherited)",
 | 
			
		||||
					NORMALSRB2,
 | 
			
		||||
| 
						 | 
				
			
			@ -1226,7 +1226,7 @@
 | 
			
		|||
		C01FCF4C08A954540054247B /* Release */ = {
 | 
			
		||||
			isa = XCBuildConfiguration;
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 2.1.21;
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 2.1.22;
 | 
			
		||||
				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 | 
			
		||||
				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
 | 
			
		||||
				GCC_PREPROCESSOR_DEFINITIONS = (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -92,6 +92,12 @@ void I_StartupSound(void)
 | 
			
		|||
{
 | 
			
		||||
	I_Assert(!sound_started);
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
	// Force DirectSound instead of WASAPI
 | 
			
		||||
	// SDL 2.0.6+ defaults to the latter and it screws up our sound effects
 | 
			
		||||
	SDL_setenv("SDL_AUDIODRIVER", "directsound", 1);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	// EE inits audio first so we're following along.
 | 
			
		||||
	if (SDL_WasInit(SDL_INIT_AUDIO) == SDL_INIT_AUDIO)
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -759,6 +765,7 @@ void I_UnloadSong(void)
 | 
			
		|||
 | 
			
		||||
boolean I_PlaySong(boolean looping)
 | 
			
		||||
{
 | 
			
		||||
	boolean lpz = fpclassify(loop_point) == FP_ZERO;
 | 
			
		||||
#ifdef HAVE_LIBGME
 | 
			
		||||
	if (gme)
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -772,14 +779,15 @@ boolean I_PlaySong(boolean looping)
 | 
			
		|||
	if (!music)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	if (Mix_PlayMusic(music, looping && loop_point == 0.0f ? -1 : 0) == -1)
 | 
			
		||||
 | 
			
		||||
	if (Mix_PlayMusic(music, looping && lpz ? -1 : 0) == -1)
 | 
			
		||||
	{
 | 
			
		||||
		CONS_Alert(CONS_ERROR, "Mix_PlayMusic: %s\n", Mix_GetError());
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	Mix_VolumeMusic((UINT32)music_volume*128/31);
 | 
			
		||||
 | 
			
		||||
	if (loop_point != 0.0f)
 | 
			
		||||
	if (!lpz)
 | 
			
		||||
		Mix_HookMusicFinished(music_loop);
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1186,6 +1186,12 @@ void I_StartupSound(void)
 | 
			
		|||
	// Configure sound device
 | 
			
		||||
	CONS_Printf("I_StartupSound:\n");
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
	// Force DirectSound instead of WASAPI
 | 
			
		||||
	// SDL 2.0.6+ defaults to the latter and it screws up our sound effects
 | 
			
		||||
	SDL_setenv("SDL_AUDIODRIVER", "directsound", 1);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	// EE inits audio first so we're following along.
 | 
			
		||||
	if (SDL_WasInit(SDL_INIT_AUDIO) == SDL_INIT_AUDIO)
 | 
			
		||||
		CONS_Printf("SDL Audio already started\n");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1214,7 +1214,7 @@
 | 
			
		|||
		C01FCF4B08A954540054247B /* Debug */ = {
 | 
			
		||||
			isa = XCBuildConfiguration;
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 2.1.21;
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 2.1.22;
 | 
			
		||||
				GCC_PREPROCESSOR_DEFINITIONS = (
 | 
			
		||||
					"$(inherited)",
 | 
			
		||||
					NORMALSRB2,
 | 
			
		||||
| 
						 | 
				
			
			@ -1226,7 +1226,7 @@
 | 
			
		|||
		C01FCF4C08A954540054247B /* Release */ = {
 | 
			
		||||
			isa = XCBuildConfiguration;
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 2.1.21;
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 2.1.22;
 | 
			
		||||
				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 | 
			
		||||
				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
 | 
			
		||||
				GCC_PREPROCESSOR_DEFINITIONS = (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -996,7 +996,7 @@ static INT32 WINAPI VID_SetDirectDrawMode(viddef_t *lvid, vmode_t *currentmode)
 | 
			
		|||
	// but rather render to memory bitmap buffer
 | 
			
		||||
	lvid->direct = NULL;
 | 
			
		||||
 | 
			
		||||
	if (!cv_stretch.value && (float)vid.width/vid.height != ((float)BASEVIDWIDTH/BASEVIDHEIGHT))
 | 
			
		||||
	if (!cv_stretch.value && fabsf((float)vid.width/vid.height - ((float)BASEVIDWIDTH/BASEVIDHEIGHT)) > 1.0E-36f)
 | 
			
		||||
		vid.height = (int)(vid.width * ((float)BASEVIDHEIGHT/BASEVIDWIDTH));// Adjust the height to match
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								windows-installer/.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								windows-installer/.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,10 +0,0 @@
 | 
			
		|||
*
 | 
			
		||||
*.*
 | 
			
		||||
!staging
 | 
			
		||||
!sfx
 | 
			
		||||
!uninstaller
 | 
			
		||||
!! MAKE SURE FILES ARE IN new-install ARCHIVE FOLDER !.txt
 | 
			
		||||
!BuildInstaller.bat
 | 
			
		||||
!README.txt
 | 
			
		||||
!VersionFileName.txt
 | 
			
		||||
!.gitignore
 | 
			
		||||
| 
						 | 
				
			
			@ -1,76 +0,0 @@
 | 
			
		|||
@echo off
 | 
			
		||||
 | 
			
		||||
set "SCRIPTDIR=%~dp0"
 | 
			
		||||
set "SCRIPTDIR=%SCRIPTDIR:~0,-1%"
 | 
			
		||||
 | 
			
		||||
IF [%SRB2VERSIONNAME%] == [] set /p SRB2VERSIONNAME=<"%SCRIPTDIR%\VersionFileName.txt"
 | 
			
		||||
 | 
			
		||||
:: Find 7z
 | 
			
		||||
 | 
			
		||||
set SVZIP=
 | 
			
		||||
 | 
			
		||||
if NOT [%1] == [] (
 | 
			
		||||
	echo.%~1 | findstr /C:"7z" 1>nul
 | 
			
		||||
	if NOT errorlevel 1 (
 | 
			
		||||
		if exist "%~1" set "SVZIP=%~1"
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if ["%SVZIP%"] == [""] (
 | 
			
		||||
	if exist "%ProgramFiles(x86)%\7-Zip\7z.exe" set "SVZIP=%ProgramFiles(x86)%\7-Zip\7z.exe"
 | 
			
		||||
	if exist "%ProgramFiles%\7-Zip\7z.exe" set "SVZIP=%ProgramFiles%\7-Zip\7z.exe"
 | 
			
		||||
	if exist "%ProgramW6432%\7-Zip\7z.exe" set "SVZIP=%ProgramW6432%\7-Zip\7z.exe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
:: Is it in PATH?
 | 
			
		||||
 | 
			
		||||
if ["%SVZIP%"] == [""] (
 | 
			
		||||
	"7z.exe" --help > NUL 2> NUL
 | 
			
		||||
	if NOT errorlevel 1 (
 | 
			
		||||
		set "SVZIP=7z.exe"
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
:: Create the uninstaller
 | 
			
		||||
 | 
			
		||||
if NOT ["%SVZIP%"] == [""] (
 | 
			
		||||
	del /f /q "%SCRIPTDIR%\Uninstaller.7z" 2> NUL
 | 
			
		||||
	"%SVZIP%" a -t7z "%SCRIPTDIR%\Uninstaller.7z" "%SCRIPTDIR%\uninstaller\*" -m5=LZMA2
 | 
			
		||||
	copy /y /b "%SCRIPTDIR%\sfx\7zsd_LZMA2.sfx" + "%SCRIPTDIR%\sfx\config-uninstaller.txt" + "%SCRIPTDIR%\Uninstaller.7z" "%SCRIPTDIR%\staging\new-install\uninstall.exe"
 | 
			
		||||
	del /f /q "%SCRIPTDIR%\uninstaller.7z"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
:: Operate on install archives
 | 
			
		||||
 | 
			
		||||
type NUL > "%SCRIPTDIR%\staging\new-install\staging.txt"
 | 
			
		||||
 | 
			
		||||
if exist "%SCRIPTDIR%\Installer.7z" (
 | 
			
		||||
	if NOT ["%SVZIP%"] == [""] (
 | 
			
		||||
		"%SVZIP%" a "%SCRIPTDIR%\Installer.7z" "%SCRIPTDIR%\staging\*"
 | 
			
		||||
	)
 | 
			
		||||
	copy /y /b "%SCRIPTDIR%\sfx\7zsd_LZMA2.sfx" + "%SCRIPTDIR%\sfx\config-installer.txt" + "%SCRIPTDIR%\Installer.7z" "%SCRIPTDIR%\SRB2-%SRB2VERSIONNAME%-Installer.exe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if exist "%SCRIPTDIR%\Patch.7z" (
 | 
			
		||||
	if NOT ["%SVZIP%"] == [""] (
 | 
			
		||||
		"%SVZIP%" a "%SCRIPTDIR%\Patch.7z" "%SCRIPTDIR%\staging\*"
 | 
			
		||||
	)
 | 
			
		||||
	copy /y /b "%SCRIPTDIR%\sfx\7zsd_LZMA2.sfx" + "%SCRIPTDIR%\sfx\config-patch.txt" + "%SCRIPTDIR%\Patch.7z" "%SCRIPTDIR%\SRB2-%SRB2VERSIONNAME%-Patch.exe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if exist "%SCRIPTDIR%\Installer_x64.7z" (
 | 
			
		||||
	if NOT ["%SVZIP%"] == [""] (
 | 
			
		||||
		"%SVZIP%" a "%SCRIPTDIR%\Installer_x64.7z" "%SCRIPTDIR%\staging\*"
 | 
			
		||||
	)
 | 
			
		||||
	copy /y /b "%SCRIPTDIR%\sfx\7zsd_LZMA2_x64.sfx" + "%SCRIPTDIR%\sfx\config-installer.txt" + "%SCRIPTDIR%\Installer_x64.7z" "%SCRIPTDIR%\SRB2-%SRB2VERSIONNAME%-x64-Installer.exe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if exist "%SCRIPTDIR%\Patch_x64.7z" (
 | 
			
		||||
	if NOT ["%SVZIP%"] == [""] (
 | 
			
		||||
		"%SVZIP%" a "%SCRIPTDIR%\Patch_x64.7z" "%SCRIPTDIR%\staging\*"
 | 
			
		||||
	)
 | 
			
		||||
	copy /y /b "%SCRIPTDIR%\sfx\7zsd_LZMA2_x64.sfx" + "%SCRIPTDIR%\sfx\config-patch.txt" + "%SCRIPTDIR%\Patch_x64.7z" "%SCRIPTDIR%\SRB2-%SRB2VERSIONNAME%-x64-Patch.exe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
del /f /q "%SCRIPTDIR%\staging\new-install\staging.txt"
 | 
			
		||||
del /f /q "%SCRIPTDIR%\staging\new-install\uninstall.exe"
 | 
			
		||||
| 
						 | 
				
			
			@ -1,48 +0,0 @@
 | 
			
		|||
Windows Install Builder
 | 
			
		||||
for SRB2
 | 
			
		||||
 | 
			
		||||
This installer is much like the 7-Zip self-extracting archive, except
 | 
			
		||||
this allows for scripting the post-install step.
 | 
			
		||||
 | 
			
		||||
This also allows for some light customization, including dialog messages
 | 
			
		||||
and program shortcuts.
 | 
			
		||||
 | 
			
		||||
The included install scripts manage the game data location depending on the
 | 
			
		||||
install location -- if installed in Program Files or AppData\Local, the
 | 
			
		||||
game data location is set to %UserProfile%\SRB2.
 | 
			
		||||
 | 
			
		||||
Program shortcuts are also added, as well as an uninstaller that
 | 
			
		||||
will remove the icons and also selectively uninstall the core game files.
 | 
			
		||||
The uninstaller gives you the option to preserve your game data and mods.
 | 
			
		||||
 | 
			
		||||
How to Use
 | 
			
		||||
----------
 | 
			
		||||
 | 
			
		||||
1. Zip up the install contents in 7z format.
 | 
			
		||||
    * ALL FILES MUST BE IN THE `new-install/` ARCHIVE SUBFOLDER, OR THE
 | 
			
		||||
      POST-INSTALL SCRIPT WILL NOT WORK!
 | 
			
		||||
    * Make sure you are using the LZMA2 algorithm, which is 7-Zip's default.
 | 
			
		||||
 | 
			
		||||
2. Copy the 7z archive to this folder using the following names:
 | 
			
		||||
    * Installer.7z     - 32-bit full installer
 | 
			
		||||
    * Patch.7z         - 32-bit patch
 | 
			
		||||
    * Installer_x64.7z - 64-bit full installer
 | 
			
		||||
    * Patch_x64.7z     - 64-bit patch
 | 
			
		||||
 | 
			
		||||
3. Set the text in VersionFilename.txt to the version identifier for the
 | 
			
		||||
   installer's filename.
 | 
			
		||||
    * e.g., v2121 for v2.1.21, from "SRB2-v2121-Installer.exe"
 | 
			
		||||
    * Also look through sfx/config-installer.txt and sfx/config-patch.txt
 | 
			
		||||
      and update the version strings. Templating is TODO.
 | 
			
		||||
 | 
			
		||||
4. Run BuildInstaller.bat [7z.exe install path]
 | 
			
		||||
    * First argument is the path to 7z.exe. If this is not specified, the
 | 
			
		||||
      script will try to look for it in C:\Program Files [(x86)]
 | 
			
		||||
    * This script will automatically add the install scripts to each
 | 
			
		||||
      installer.
 | 
			
		||||
 | 
			
		||||
Credit
 | 
			
		||||
------
 | 
			
		||||
 | 
			
		||||
OlegScherbakov/7zSFX
 | 
			
		||||
https://github.com/OlegScherbakov/7zSFX
 | 
			
		||||
| 
						 | 
				
			
			@ -1 +0,0 @@
 | 
			
		|||
v2121
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -1,24 +0,0 @@
 | 
			
		|||
;!@Install@!UTF-8!
 | 
			
		||||
 | 
			
		||||
GUIFlags="8+32+64+4096"
 | 
			
		||||
GUIMode="1"
 | 
			
		||||
 | 
			
		||||
Title="Sonic Robo Blast 2 v2.1.21"
 | 
			
		||||
BeginPrompt="Sonic Robo Blast 2 v2.1.21\nFull Installer\n\nSelect a folder to install SRB2 in.\n\nIf you install in \"AppData\\Local\" or \"Program Files\", your game data will be saved to:\n%UserProfile%\\SRB2\n\nOtherwise, your game data will be in the installation folder.\n\nShortcuts will be created in your Start Menu."
 | 
			
		||||
 | 
			
		||||
ExtractPathText="Installation folder: (no exclamation points, please!)"
 | 
			
		||||
InstallPath="%LocalAppData%\\SRB2"
 | 
			
		||||
ExtractTitle="Installing..."
 | 
			
		||||
ExtractDialogText="Installing SRB2 v2.1.21...\n\nCheck out our modding community!\nWe make levels, characters, and much more!\n\nVisit http://www.srb2.org/mods"
 | 
			
		||||
 | 
			
		||||
Shortcut="Pu,{%%T\\srb2win.exe},{},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{SRB2},{%%T\\},{%%T\\srb2win.exe},{0}"
 | 
			
		||||
Shortcut="Pu,{%%T\\srb2win.exe},{-win},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{SRB2 (Windowed)},{%%T\\},{%%T\\srb2win.exe},{0}"
 | 
			
		||||
Shortcut="Pu,{%%T\\srb2win.exe},{-opengl},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{SRB2 (OpenGL)},{%%T\\},{%%T\\srb2win.exe},{0}"
 | 
			
		||||
Shortcut="Pu,{%%T\\srb2win.exe},{-opengl -win},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{SRB2 (OpenGL, Windowed)},{%%T\\},{%%T\\srb2win.exe},{0}"
 | 
			
		||||
Shortcut="Pu,{%%T\\srb2dd.exe},{},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{SRB2 (DirectDraw)},{%%T\\},{%%T\\srb2dd.exe},{0}"
 | 
			
		||||
Shortcut="Pu,{%%T\\srb2dd.exe},{-win},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{SRB2 (DirectDraw, Windowed)},{%%T\\},{%%T\\srb2dd.exe},{0}"
 | 
			
		||||
Shortcut="Pu,{%%T\\uninstall.exe},{},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{Uninstall SRB2},{%%T\\},{shell32.dll},{31}"
 | 
			
		||||
 | 
			
		||||
RunProgram="nowait:\"%%T\\new-install\\staging.bat\""
 | 
			
		||||
 | 
			
		||||
;!@InstallEnd@!
 | 
			
		||||
| 
						 | 
				
			
			@ -1,24 +0,0 @@
 | 
			
		|||
;!@Install@!UTF-8!
 | 
			
		||||
 | 
			
		||||
GUIFlags="8+32+64+4096"
 | 
			
		||||
GUIMode="1"
 | 
			
		||||
 | 
			
		||||
Title="Sonic Robo Blast 2 v2.1.21"
 | 
			
		||||
BeginPrompt="Sonic Robo Blast 2 v2.1.21\nPatch Installer\n\nYou must have at least v2.1.15 to use this patch.\n\nSelect your current SRB2 folder.\n\nShortcuts will be created in your Start Menu."
 | 
			
		||||
 | 
			
		||||
ExtractPathText="Current SRB2 folder: (no exclamation points, please!)"
 | 
			
		||||
InstallPath="%LocalAppData%\\SRB2"
 | 
			
		||||
ExtractTitle="Installing..."
 | 
			
		||||
ExtractDialogText="Installing SRB2 v2.1.21...\n\nCheck out our modding community!\nWe make levels, characters, and much more!\n\nVisit http://www.srb2.org/mods"
 | 
			
		||||
 | 
			
		||||
Shortcut="Pu,{%%T\\srb2win.exe},{},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{SRB2},{%%T\\},{%%T\\srb2win.exe},{0}"
 | 
			
		||||
Shortcut="Pu,{%%T\\srb2win.exe},{-win},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{SRB2 (Windowed)},{%%T\\},{%%T\\srb2win.exe},{0}"
 | 
			
		||||
Shortcut="Pu,{%%T\\srb2win.exe},{-opengl},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{SRB2 (OpenGL)},{%%T\\},{%%T\\srb2win.exe},{0}"
 | 
			
		||||
Shortcut="Pu,{%%T\\srb2win.exe},{-opengl -win},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{SRB2 (OpenGL, Windowed)},{%%T\\},{%%T\\srb2win.exe},{0}"
 | 
			
		||||
Shortcut="Pu,{%%T\\srb2dd.exe},{},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{SRB2 (DirectDraw)},{%%T\\},{%%T\\srb2dd.exe},{0}"
 | 
			
		||||
Shortcut="Pu,{%%T\\srb2dd.exe},{-win},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{SRB2 (DirectDraw, Windowed)},{%%T\\},{%%T\\srb2dd.exe},{0}"
 | 
			
		||||
Shortcut="Pu,{%%T\\uninstall.exe},{},{Sonic Robo Blast 2},{Sonic Robo Blast 2 (SRB2), a 3D Sonic the Hedgehog fangame.},{Uninstall SRB2},{%%T\\},{shell32.dll},{31}"
 | 
			
		||||
 | 
			
		||||
RunProgram="nowait:\"%%T\\new-install\\staging.bat\""
 | 
			
		||||
 | 
			
		||||
;!@InstallEnd@!
 | 
			
		||||
| 
						 | 
				
			
			@ -1,13 +0,0 @@
 | 
			
		|||
;!@Install@!UTF-8!
 | 
			
		||||
 | 
			
		||||
GUIFlags="1+2+8"
 | 
			
		||||
GUIMode="2"
 | 
			
		||||
 | 
			
		||||
Title="Uninstall SRB2"
 | 
			
		||||
BeginPrompt="Are you sure you want to uninstall Sonic Robo Blast 2?\n\nYour game data and mods will be preserved, as well as\nany extra files in your install folder."
 | 
			
		||||
 | 
			
		||||
InstallPath="%%S"
 | 
			
		||||
 | 
			
		||||
RunProgram="nowait:\"%%S\\uninstall.bat\" /y"
 | 
			
		||||
 | 
			
		||||
;!@InstallEnd@!
 | 
			
		||||
| 
						 | 
				
			
			@ -1,11 +0,0 @@
 | 
			
		|||
SRB2 Install Instructions
 | 
			
		||||
 | 
			
		||||
1. Move every file from the "new-install" folder to this main install folder.
 | 
			
		||||
 | 
			
		||||
2. DELETE "staging.bat" and "staging.txt"! These can mess up your installation if run by accident!
 | 
			
		||||
 | 
			
		||||
3. Optionally, create a folder in your user profile named "SRB2". This is where your game data and addons may live. For example,
 | 
			
		||||
 | 
			
		||||
	C:\Users\[User]\SRB2
 | 
			
		||||
 | 
			
		||||
4. Run the game! Double-click srb2win.exe -- or see if you have Start Menu icons under "Sonic Robo Blast 2".
 | 
			
		||||
| 
						 | 
				
			
			@ -1,15 +0,0 @@
 | 
			
		|||
exchndl.dll
 | 
			
		||||
fmodex.dll
 | 
			
		||||
libFLAC-8.dll
 | 
			
		||||
libgme.dll
 | 
			
		||||
libintl-8.dll
 | 
			
		||||
libmikmod-2.dll
 | 
			
		||||
libogg-0.dll
 | 
			
		||||
libvorbis-0.dll
 | 
			
		||||
libvorbisfile-3.dll
 | 
			
		||||
r_opengl.dll
 | 
			
		||||
SDL2.dll
 | 
			
		||||
SDL2_mixer.dll
 | 
			
		||||
smpeg2.dll
 | 
			
		||||
srb2dd.exe
 | 
			
		||||
srb2win.exe
 | 
			
		||||
| 
						 | 
				
			
			@ -1,363 +0,0 @@
 | 
			
		|||
@echo off
 | 
			
		||||
 | 
			
		||||
setlocal enabledelayedexpansion
 | 
			
		||||
 | 
			
		||||
cls
 | 
			
		||||
 | 
			
		||||
:: SRB2 Install Staging
 | 
			
		||||
::
 | 
			
		||||
:: This accomplishes the following tasks:
 | 
			
		||||
::
 | 
			
		||||
:: 1. Creates a user profile folder if SRB2 is installed in AppData or Program Files, and config.cfg is not already in the install folder
 | 
			
		||||
::
 | 
			
		||||
:: 2. Moves old installation files into old-install
 | 
			
		||||
::
 | 
			
		||||
:: 3. Moves new installaton files into install folder
 | 
			
		||||
::
 | 
			
		||||
 | 
			
		||||
:: Get Parent folder (the SRB2 install folder)
 | 
			
		||||
::
 | 
			
		||||
:: https://wiert.me/2011/08/30/batch-file-to-get-parent-directory-not-the-directory-of-the-batch-file-but-the-parent-of-that-directory/
 | 
			
		||||
 | 
			
		||||
set "STAGINGDIR=%~dp0"
 | 
			
		||||
:: strip trailing backslash
 | 
			
		||||
set "STAGINGDIR=!STAGINGDIR:~0,-1!"
 | 
			
		||||
::  ~dp only works for batch file parameters and loop indexes
 | 
			
		||||
for %%d in ("!STAGINGDIR!") do set "INSTALLDIR=%%~dpd"
 | 
			
		||||
set "INSTALLDIR=!INSTALLDIR:~0,-1!"
 | 
			
		||||
 | 
			
		||||
:: Find 7z
 | 
			
		||||
 | 
			
		||||
set SVZIP=
 | 
			
		||||
if ["%SVZIP%"] == [""] (
 | 
			
		||||
	if exist "!ProgramFiles(x86)!\7-Zip\7z.exe" set "SVZIP=!ProgramFiles(x86)!\7-Zip\7z.exe"
 | 
			
		||||
	if exist "!ProgramFiles!\7-Zip\7z.exe" set "SVZIP=!ProgramFiles!\7-Zip\7z.exe"
 | 
			
		||||
	if exist "!ProgramW6432!\7-Zip\7z.exe" set "SVZIP=!ProgramW6432!\7-Zip\7z.exe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
:: Is it in PATH?
 | 
			
		||||
 | 
			
		||||
if ["%SVZIP%"] == [""] (
 | 
			
		||||
	"7z.exe" --help > NUL 2> NUL
 | 
			
		||||
	if NOT errorlevel 1 (
 | 
			
		||||
		set "SVZIP=7z.exe"
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
:: FAILSAFE: Check if staging.txt exists in the directory
 | 
			
		||||
:: If not, exit, so we don't mess up anything by accident.
 | 
			
		||||
 | 
			
		||||
if NOT exist "!STAGINGDIR!\staging.txt" (
 | 
			
		||||
	exit
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
: CheckPermissionsInstall
 | 
			
		||||
 | 
			
		||||
:: Write a dummy file and check for an error. If error, we need administrator rights
 | 
			
		||||
 | 
			
		||||
:: NOTE: We should never have to deal with this because the main installer should
 | 
			
		||||
:: already have the rights.
 | 
			
		||||
 | 
			
		||||
mkdir "!INSTALLDIR!\install-dummy"
 | 
			
		||||
 | 
			
		||||
:: TODO elevate automatically
 | 
			
		||||
if errorlevel 1 (
 | 
			
		||||
	echo Finish installing SRB2 with these steps:
 | 
			
		||||
	echo.
 | 
			
		||||
	echo 1. Go to your SRB2 install folder
 | 
			
		||||
	echo.
 | 
			
		||||
	echo     !INSTALLDIR!
 | 
			
		||||
	echo.
 | 
			
		||||
	echo 2. Copy all files from the "new-install" subfolder into the main folder
 | 
			
		||||
	echo    and DELETE staging.bat and staging.txt!!!
 | 
			
		||||
	echo.
 | 
			
		||||
	echo 3. Optionally, create a folder in your user profile named "SRB2".
 | 
			
		||||
	echo    This is where your game data and addons may live.
 | 
			
		||||
	echo    To create the folder, go here:
 | 
			
		||||
	echo.
 | 
			
		||||
	echo     !USERPROFILE!
 | 
			
		||||
	echo.
 | 
			
		||||
	echo If anything fails, you may delete the files and try to run the installer
 | 
			
		||||
	echo again with Administrator Rights: Right-click on the icon and click
 | 
			
		||||
	echo "Run as administrator."
 | 
			
		||||
	echo.
 | 
			
		||||
	"!SystemRoot!\explorer.exe" "!INSTALLDIR!"
 | 
			
		||||
	set /p ADMINFINAL="Press Enter key to exit. "
 | 
			
		||||
 | 
			
		||||
	exit
 | 
			
		||||
) else (
 | 
			
		||||
	rmdir /s /q "!INSTALLDIR!\install-dummy"
 | 
			
		||||
	goto CheckUserDir
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
: CheckUserDir
 | 
			
		||||
 | 
			
		||||
:: Check if we need to create !userprofile!\SRB2
 | 
			
		||||
 | 
			
		||||
set "USERDIR=!INSTALLDIR!"
 | 
			
		||||
 | 
			
		||||
:: Is config.cfg in our install dir?
 | 
			
		||||
if exist "!INSTALLDIR!\config.cfg" goto MoveOldInstall
 | 
			
		||||
 | 
			
		||||
:: Are we in AppData?
 | 
			
		||||
echo.!STAGINGDIR! | findstr /C:"!LocalAppData!" 1>nul
 | 
			
		||||
if errorlevel 1 (
 | 
			
		||||
	echo.
 | 
			
		||||
) else (
 | 
			
		||||
	goto SetUserDir
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
: Are we in Program Files?
 | 
			
		||||
echo.!STAGINGDIR! | findstr /C:"!ProgramFiles!" 1>nul
 | 
			
		||||
if NOT errorlevel 1 (
 | 
			
		||||
	goto SetUserDir
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
:: Are we in Program Files (x86)?
 | 
			
		||||
echo.!STAGINGDIR! | findstr /C:"!ProgramFiles(X86)!" 1>nul
 | 
			
		||||
if NOT errorlevel 1 (
 | 
			
		||||
	goto SetUserDir
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
:: Are we 32-bit and actually in Program Files?
 | 
			
		||||
echo.!STAGINGDIR! | findstr /C:"!ProgramW6432!" 1>nul
 | 
			
		||||
if NOT errorlevel 1 (
 | 
			
		||||
	goto SetUserDir
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
goto MoveOldInstall
 | 
			
		||||
 | 
			
		||||
: SetUserDir
 | 
			
		||||
: CheckPermissionsUserDir
 | 
			
		||||
 | 
			
		||||
set "USERDIR=!UserProfile!\SRB2"
 | 
			
		||||
 | 
			
		||||
:: Check for permissions and create the folder
 | 
			
		||||
if exist "!USERDIR!\*" (
 | 
			
		||||
 	mkdir "!USERDIR!\install-dummy"
 | 
			
		||||
 | 
			
		||||
	if errorlevel 1 (
 | 
			
		||||
		echo User profile folder exists, but we won't operate on it.
 | 
			
		||||
		echo.
 | 
			
		||||
		goto MoveOldInstall
 | 
			
		||||
	) else (
 | 
			
		||||
		rmdir /s /q "!USERDIR!\install-dummy"
 | 
			
		||||
	)
 | 
			
		||||
) else (
 | 
			
		||||
	mkdir "!USERDIR!"
 | 
			
		||||
 | 
			
		||||
	if errorlevel 1 (
 | 
			
		||||
		echo Could not create user profile folder
 | 
			
		||||
		echo Defaulting to install dir: "!INSTALLDIR!"
 | 
			
		||||
		echo.
 | 
			
		||||
		set "USERDIR=!INSTALLDIR!"
 | 
			
		||||
		goto MoveOldInstall
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
:: Now copy READMEs
 | 
			
		||||
:: echo f answers xcopy's prompt as to whether the destination is a file or a folder
 | 
			
		||||
echo f | xcopy /y "!STAGINGDIR!\README.txt" "!USERDIR!\README.txt"
 | 
			
		||||
echo f | xcopy /y "!STAGINGDIR!\LICENSE.txt" "!USERDIR!\LICENSE.txt"
 | 
			
		||||
echo f | xcopy /y "!STAGINGDIR!\LICENSE-3RD-PARTY.txt" "!USERDIR!\LICENSE-3RD-PARTY.txt"
 | 
			
		||||
echo Your game data and mods folder is: > "!USERDIR!\^! Data and Mods Go Here ^!.txt"
 | 
			
		||||
echo. >> "!USERDIR!\^! Data and Mods Go Here ^!.txt"
 | 
			
		||||
echo     !USERDIR! >> "!USERDIR!\^! Data and Mods Go Here ^!.txt"
 | 
			
		||||
echo. >> "!USERDIR!\^! Data and Mods Go Here ^!.txt"
 | 
			
		||||
echo Your install folder is: >> "!USERDIR!\^! Data and Mods Go Here ^!.txt"
 | 
			
		||||
echo. >> "!USERDIR!\^! Data and Mods Go Here ^!.txt"
 | 
			
		||||
echo     !INSTALLDIR! >> "!USERDIR!\^! Data and Mods Go Here ^!.txt"
 | 
			
		||||
echo. >> "!USERDIR!\^! Data and Mods Go Here ^!.txt"
 | 
			
		||||
echo To run SRB2, go to: >> "!USERDIR!\^! Data and Mods Go Here ^!.txt"
 | 
			
		||||
echo. >> "!USERDIR!\^! Data and Mods Go Here ^!.txt"
 | 
			
		||||
echo     Start Menu ^> Programs ^> Sonic Robo Blast 2 >> "!USERDIR!\^! Data and Mods Go Here ^!.txt"
 | 
			
		||||
 | 
			
		||||
:: Copy path to install folder
 | 
			
		||||
 | 
			
		||||
set "SCRIPT=!TEMP!\!RANDOM!-!RANDOM!-!RANDOM!-!RANDOM!.vbs"
 | 
			
		||||
echo Set oWS = WScript.CreateObject("WScript.Shell") >> "!SCRIPT!"
 | 
			
		||||
echo sLinkFile = "!USERDIR!\^! SRB2 Install Folder ^!.lnk" >> "!SCRIPT!"
 | 
			
		||||
echo Set oLink = oWS.CreateShortcut(sLinkFile) >> "!SCRIPT!"
 | 
			
		||||
echo oLink.TargetPath = "!INSTALLDIR!" >> "!SCRIPT!"
 | 
			
		||||
echo oLink.WorkingDirectory = "!INSTALLDIR!" >> "!SCRIPT!"
 | 
			
		||||
echo oLink.Arguments = "" >> "!SCRIPT!"
 | 
			
		||||
echo oLink.IconLocation = "!INSTALLDIR!\srb2win.exe,0" >> "!SCRIPT!"
 | 
			
		||||
echo oLink.Save >> "!SCRIPT!"
 | 
			
		||||
cscript /nologo "!SCRIPT!"
 | 
			
		||||
del "!SCRIPT!"
 | 
			
		||||
 | 
			
		||||
:: Also do it the other way around
 | 
			
		||||
 | 
			
		||||
set "SCRIPT=!TEMP!\!RANDOM!-!RANDOM!-!RANDOM!-!RANDOM!.vbs"
 | 
			
		||||
echo Set oWS = WScript.CreateObject("WScript.Shell") >> "!SCRIPT!"
 | 
			
		||||
echo sLinkFile = "!INSTALLDIR!\^! SRB2 Data Folder ^!.lnk" >> "!SCRIPT!"
 | 
			
		||||
echo Set oLink = oWS.CreateShortcut(sLinkFile) >> "!SCRIPT!"
 | 
			
		||||
echo oLink.TargetPath = "!USERDIR!" >> "!SCRIPT!"
 | 
			
		||||
echo oLink.WorkingDirectory = "!USERDIR!" >> "!SCRIPT!"
 | 
			
		||||
echo oLink.Arguments = "" >> "!SCRIPT!"
 | 
			
		||||
echo oLink.IconLocation = "!INSTALLDIR!\srb2win.exe,0" >> "!SCRIPT!"
 | 
			
		||||
echo oLink.Save >> "!SCRIPT!"
 | 
			
		||||
cscript /nologo "!SCRIPT!"
 | 
			
		||||
del "!SCRIPT!"
 | 
			
		||||
 | 
			
		||||
: MoveOldInstall
 | 
			
		||||
 | 
			
		||||
if exist "!INSTALLDIR!\old-install\*" (
 | 
			
		||||
	set "OLDINSTALLDIR=!INSTALLDIR!\old-install-!RANDOM!"
 | 
			
		||||
) else (
 | 
			
		||||
	set "OLDINSTALLDIR=!INSTALLDIR!\old-install"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
mkdir "!OLDINSTALLDIR!"
 | 
			
		||||
 | 
			
		||||
::
 | 
			
		||||
:: Move all old install files
 | 
			
		||||
:: We support a list of explicit files to copy to old-install
 | 
			
		||||
:: And later, we also loop through our staging files, look for the pre-existing copy in
 | 
			
		||||
:: install root, then copy that also to old-install
 | 
			
		||||
::
 | 
			
		||||
 | 
			
		||||
:: Extract the uninstall-list.txt and uninstall-userdir.txt files from uninstaller.exe
 | 
			
		||||
:: if it exists
 | 
			
		||||
 | 
			
		||||
if exist "!INSTALLDIR!\uninstall.exe" (
 | 
			
		||||
	if NOT ["!SVZIP!"] == [""] (
 | 
			
		||||
		"!SVZIP!" x "!INSTALLDIR!\uninstall.exe" "uninstall-list.txt" -o"!INSTALLDIR!"
 | 
			
		||||
		"!SVZIP!" x "!INSTALLDIR!\uninstall.exe" "uninstall-userdir.txt" -o"!INSTALLDIR!"
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set OLDINSTALLCHANGED=
 | 
			
		||||
 | 
			
		||||
if exist "!STAGINGDIR!\old-install-list.txt" (
 | 
			
		||||
	goto MoveOldInstallOldFiles
 | 
			
		||||
) else (
 | 
			
		||||
	goto MoveOldInstallNewFiles
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
: MoveOldInstallOldFiles
 | 
			
		||||
 | 
			
		||||
set "TESTFILE=!TEMP!\!RANDOM!.txt"
 | 
			
		||||
 | 
			
		||||
:: Do our failsafes before copying the file in the list
 | 
			
		||||
:: See uninstall.bat for details
 | 
			
		||||
for /F "usebackq tokens=*" %%A in ("!STAGINGDIR!\old-install-list.txt") do (
 | 
			
		||||
	if exist "!INSTALLDIR!\%%A" (
 | 
			
		||||
		if NOT ["%%A"] == [""] (
 | 
			
		||||
			if NOT ["%%A"] == ["%~nx0"] (
 | 
			
		||||
				echo %%A> "!TESTFILE!"
 | 
			
		||||
				findstr /r ".*[<>:\"\"/\\|?*%%].*" "!TESTFILE!" >nul
 | 
			
		||||
				if !errorlevel! equ 0 (
 | 
			
		||||
					echo %%A has invalid characters, skipping...
 | 
			
		||||
				) else (
 | 
			
		||||
					if exist "!INSTALLDIR!\%%A\*" (
 | 
			
		||||
						echo %%A is a folder, skipping...
 | 
			
		||||
					) else (
 | 
			
		||||
						echo Moving !INSTALLDIR!\%%A to "old-install" folder
 | 
			
		||||
						echo f | xcopy /y /v "!INSTALLDIR!\%%A" "!OLDINSTALLDIR!\%%A"
 | 
			
		||||
						if errorlevel 0 del /f /q "!INSTALLDIR!\%%A"
 | 
			
		||||
					)
 | 
			
		||||
				)
 | 
			
		||||
			)
 | 
			
		||||
		)
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
del /q /f "!STAGINGDIR!\old-install-list.txt"
 | 
			
		||||
 | 
			
		||||
for %%F in ("!OLDINSTALLDIR!\*") DO (
 | 
			
		||||
	set OLDINSTALLCHANGED=1
 | 
			
		||||
	goto MoveOldInstallNewFiles
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
: MoveOldInstallNewFiles
 | 
			
		||||
 | 
			
		||||
:: Save a list of standard files
 | 
			
		||||
:: So the uninstall script will know what to remove
 | 
			
		||||
:: Append to any existing file, in case we are a patch
 | 
			
		||||
 | 
			
		||||
dir /b /a-d "!STAGINGDIR!" >> "!INSTALLDIR!\uninstall-list.txt"
 | 
			
		||||
 | 
			
		||||
:: Overwrite the last known gamedata folder
 | 
			
		||||
 | 
			
		||||
echo !USERDIR! > "!INSTALLDIR!\uninstall-userdir.txt"
 | 
			
		||||
 | 
			
		||||
:: Add the install-generated to the uninstall list
 | 
			
		||||
:: NO FOLLOWING SPACES AFTER THE FILENAME!!!
 | 
			
		||||
 | 
			
		||||
echo uninstall.bat>> "!INSTALLDIR!\uninstall-list.txt"
 | 
			
		||||
echo uninstall-list.txt>> "!INSTALLDIR!\uninstall-list.txt"
 | 
			
		||||
echo uninstall-userdir.txt>> "!INSTALLDIR!\uninstall-list.txt"
 | 
			
		||||
:: *ahem* Prints as ^! SRB2 Data Folder ^!.lnk
 | 
			
		||||
:: We need to escape the exclamations (^^!) and the carets themselves (^^^^)
 | 
			
		||||
echo ^^^^^^! SRB2 Data Folder ^^^^^^!.lnk>> "!INSTALLDIR!\uninstall-list.txt"
 | 
			
		||||
 | 
			
		||||
:: Add the uninstall list files to the uninstall EXE
 | 
			
		||||
 | 
			
		||||
if NOT ["!SVZIP!"] == [""] (
 | 
			
		||||
	if exist "!INSTALLDIR!\new-install\uninstall.exe" (
 | 
			
		||||
		"!SVZIP!" a "!INSTALLDIR!\new-install\uninstall.exe" "!INSTALLDIR!\uninstall-list.txt" -sdel
 | 
			
		||||
		"!SVZIP!" a "!INSTALLDIR!\new-install\uninstall.exe" "!INSTALLDIR!\uninstall-userdir.txt" -sdel
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
:: Start moving files
 | 
			
		||||
 | 
			
		||||
for %%F in ("!STAGINGDIR!\*") DO (
 | 
			
		||||
	if exist "!INSTALLDIR!\%%~nxF" (
 | 
			
		||||
		set OLDINSTALLCHANGED=1
 | 
			
		||||
		move "!INSTALLDIR!\%%~nxF" "!OLDINSTALLDIR!\%%~nxF"
 | 
			
		||||
	)
 | 
			
		||||
	if NOT ["%%~nxF"] == ["staging.bat"] (
 | 
			
		||||
		if NOT ["%%~nxF"] == ["staging.txt"] (
 | 
			
		||||
			move "!STAGINGDIR!\%%~nxF" "!INSTALLDIR!\%%~nxF"
 | 
			
		||||
		)
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
: Finished
 | 
			
		||||
 | 
			
		||||
del /q /f "!INSTALLDIR!\^! SRB2 INSTALL INSTRUCTIONS ^!.txt"
 | 
			
		||||
 | 
			
		||||
set MSGEXE=
 | 
			
		||||
if exist "!SystemRoot!\System32\msg.exe" (
 | 
			
		||||
	set MSGEXE=!SystemRoot!\System32\msg.exe
 | 
			
		||||
) else (
 | 
			
		||||
	if exist "!SystemRoot!\Sysnative\msg.exe" (
 | 
			
		||||
		set MSGEXE=!SystemRoot!\Sysnative\msg.exe
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if ["!OLDINSTALLCHANGED!"] == ["1"] (
 | 
			
		||||
	"!systemroot!\explorer.exe" /select, "!OLDINSTALLDIR!"
 | 
			
		||||
	echo Finished^^! Some of your old installation files were moved to the "old-install" folder. > !TEMP!\srb2msgprompt.txt
 | 
			
		||||
	echo. >> !TEMP!\srb2msgprompt.txt
 | 
			
		||||
	echo If you no longer need these files, you may delete the folder safely. >> !TEMP!\srb2msgprompt.txt
 | 
			
		||||
	echo. >> !TEMP!\srb2msgprompt.txt
 | 
			
		||||
	echo To run SRB2, go to: Start Menu ^> Programs ^> Sonic Robo Blast 2. >> !TEMP!\srb2msgprompt.txt
 | 
			
		||||
	!MSGEXE! "!username!" < !TEMP!\srb2msgprompt.txt
 | 
			
		||||
	del !TEMP!\srb2msgprompt.txt
 | 
			
		||||
) else (
 | 
			
		||||
	if /I ["!USERDIR!"] == ["!INSTALLDIR!"] (
 | 
			
		||||
		"!systemroot!\explorer.exe" "!INSTALLDIR!"
 | 
			
		||||
		echo Finished^^! > !TEMP!\srb2msgprompt.txt
 | 
			
		||||
		echo. >> !TEMP!\srb2msgprompt.txt
 | 
			
		||||
		echo To run SRB2, go to: Start Menu ^> Programs ^> Sonic Robo Blast 2. >> !TEMP!\srb2msgprompt.txt
 | 
			
		||||
		!MSGEXE! "!username!" < !TEMP!\srb2msgprompt.txt
 | 
			
		||||
		del !TEMP!\srb2msgprompt.txt
 | 
			
		||||
	) else (
 | 
			
		||||
		"!systemroot!\explorer.exe" "!USERDIR!"
 | 
			
		||||
		echo Finished^^! You may find your game data in this folder: > !TEMP!\srb2msgprompt.txt
 | 
			
		||||
		echo. >> !TEMP!\srb2msgprompt.txt
 | 
			
		||||
		echo     !USERDIR! >> !TEMP!\srb2msgprompt.txt
 | 
			
		||||
		echo. >> !TEMP!\srb2msgprompt.txt
 | 
			
		||||
		echo To run SRB2, go to: Start Menu ^> Programs ^> Sonic Robo Blast 2. >> !TEMP!\srb2msgprompt.txt
 | 
			
		||||
		!MSGEXE! "!username!" < !TEMP!\srb2msgprompt.txt
 | 
			
		||||
		del !TEMP!\srb2msgprompt.txt
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
: Attempt to remove OLDINSTALLDIR, in case it's empty
 | 
			
		||||
rmdir /q "!OLDINSTALLDIR!"
 | 
			
		||||
cd \
 | 
			
		||||
start "" /b "cmd" /s /c " del /f /q "%STAGINGDIR%\*"&rmdir /s /q "%STAGINGDIR%"&exit /b "
 | 
			
		||||
| 
						 | 
				
			
			@ -1,183 +0,0 @@
 | 
			
		|||
@echo off
 | 
			
		||||
 | 
			
		||||
setlocal enabledelayedexpansion
 | 
			
		||||
 | 
			
		||||
cls
 | 
			
		||||
 | 
			
		||||
set "INSTALLDIR=%~dp0"
 | 
			
		||||
set "INSTALLDIR=!INSTALLDIR:~0,-1!"
 | 
			
		||||
set /p USERDIR=<"!INSTALLDIR!\uninstall-userdir.txt"
 | 
			
		||||
set "USERDIR=!USERDIR:~0,-1!"
 | 
			
		||||
 | 
			
		||||
: ProceedPrompt
 | 
			
		||||
 | 
			
		||||
if ["%1"] == ["/y"] (
 | 
			
		||||
	set "PROCEED=1"
 | 
			
		||||
) else (
 | 
			
		||||
	set PROCEED=
 | 
			
		||||
	set /p PROCEED="Are you sure you want to uninstall SRB2? [yes/no] "
 | 
			
		||||
 | 
			
		||||
	if /I ["!PROCEED:~0,1!"] == ["n"] exit
 | 
			
		||||
	if /I ["!PROCEED!"] == ["y"] (
 | 
			
		||||
		echo Type Yes or No
 | 
			
		||||
		echo.
 | 
			
		||||
		goto ProceedPrompt
 | 
			
		||||
	) else (
 | 
			
		||||
		if /I ["!PROCEED!"] == ["yes"] (
 | 
			
		||||
			set PROCEED=1
 | 
			
		||||
		) else (
 | 
			
		||||
			echo.
 | 
			
		||||
			goto ProceedPrompt
 | 
			
		||||
		)
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
:: Failsafe, in case we Ctrl+C and decline "Terminate batch file?"
 | 
			
		||||
 | 
			
		||||
if NOT ["!PROCEED!"] == ["1"] (
 | 
			
		||||
	exit
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
: CheckPermissions
 | 
			
		||||
 | 
			
		||||
:: Write a dummy file and check for an error. If error, we need administrator rights
 | 
			
		||||
 | 
			
		||||
mkdir "!INSTALLDIR!\uninstall-dummy"
 | 
			
		||||
 | 
			
		||||
:: TODO elevate automatically
 | 
			
		||||
if errorlevel 1 (
 | 
			
		||||
	echo We need Administrator Rights to uninstall SRB2.
 | 
			
		||||
	echo.
 | 
			
		||||
	echo Try running this uninstaller by right-clicking on the icon
 | 
			
		||||
	echo and click "Run as administrator"
 | 
			
		||||
	echo.
 | 
			
		||||
	set /p ADMINFINAL="Press Enter key to exit. "
 | 
			
		||||
	exit
 | 
			
		||||
) else (
 | 
			
		||||
	rmdir /s /q "!INSTALLDIR!\uninstall-dummy"
 | 
			
		||||
	goto DeleteFiles
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
: DeleteFiles
 | 
			
		||||
 | 
			
		||||
:: Our deletion list is a list of filenames, no paths, in the current folder
 | 
			
		||||
::
 | 
			
		||||
:: We apply the following failsafes:
 | 
			
		||||
:: 1. Is filename the script itself?
 | 
			
		||||
:: 2. Does filename have illegal characters? https://stackoverflow.com/a/33625339/241046
 | 
			
		||||
:: 3. Is filename a directory?
 | 
			
		||||
::
 | 
			
		||||
:: TODO hack this to support .\file.txt relative paths
 | 
			
		||||
:: Can %%A be substring'd to get only the filename and extension?
 | 
			
		||||
:: If so, print that to the temp file instead of the whole line
 | 
			
		||||
:: And possibly do the folder check before the invalid char check.
 | 
			
		||||
:: ALSO: Don't honor upward relative paths! (..\)
 | 
			
		||||
::
 | 
			
		||||
set "TESTFILE=!TEMP!\!RANDOM!.txt"
 | 
			
		||||
 | 
			
		||||
for /F "usebackq tokens=*" %%A in ("!INSTALLDIR!\uninstall-list.txt") do (
 | 
			
		||||
	if exist "!INSTALLDIR!\%%A" (
 | 
			
		||||
		if NOT ["%%A"] == [""] (
 | 
			
		||||
			if NOT ["%%A"] == ["%~nx0"] (
 | 
			
		||||
				echo %%A> "!TESTFILE!"
 | 
			
		||||
				findstr /r ".*[<>:\"\"/\\|?*%%].*" "!TESTFILE!" >nul
 | 
			
		||||
				if !errorlevel! equ 0 (
 | 
			
		||||
					echo %%A has invalid characters, skipping...
 | 
			
		||||
				) else (
 | 
			
		||||
					if exist "!INSTALLDIR!\%%A\*" (
 | 
			
		||||
						echo %%A is a folder, skipping...
 | 
			
		||||
					) else (
 | 
			
		||||
						echo Deleting !INSTALLDIR!\%%A
 | 
			
		||||
						del /q /f "!INSTALLDIR!\%%A"
 | 
			
		||||
					)
 | 
			
		||||
				)
 | 
			
		||||
			)
 | 
			
		||||
		)
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
del /q /f "!TESTFILE!"
 | 
			
		||||
 | 
			
		||||
: AllDone
 | 
			
		||||
 | 
			
		||||
:: Delete the program icons
 | 
			
		||||
echo Deleting your program icons...
 | 
			
		||||
echo.
 | 
			
		||||
 | 
			
		||||
cd \
 | 
			
		||||
rmdir /s /q "!AppData!\Microsoft\Windows\Start Menu\Programs\Sonic Robo Blast 2"
 | 
			
		||||
 | 
			
		||||
:: Check if our install folder is non-empty
 | 
			
		||||
 | 
			
		||||
set USERDIRFILLED=
 | 
			
		||||
set INSTALLDIRFILLED=
 | 
			
		||||
for /F %%i in ('dir /b /a "!USERDIR!\*"') do (
 | 
			
		||||
    if NOT ["%%i"] == ["%~nx0"] (
 | 
			
		||||
		set USERDIRFILLED=1
 | 
			
		||||
		goto InstallFilledCheck
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
: InstallFilledCheck
 | 
			
		||||
 | 
			
		||||
if /I NOT ["!USERDIR!"] == ["!INSTALLDIR!"] (
 | 
			
		||||
	for /F %%i in ('dir /b /a "!INSTALLDIR!\*"') do (
 | 
			
		||||
		if ["%%i"] == ["%~nx0"] (
 | 
			
		||||
			echo.
 | 
			
		||||
		) else (
 | 
			
		||||
			set INSTALLDIRFILLED=1
 | 
			
		||||
			goto Final
 | 
			
		||||
		)
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
: Final
 | 
			
		||||
 | 
			
		||||
echo All done^^! Visit http://www.srb2.org if you want to play SRB2 again^^!
 | 
			
		||||
echo.
 | 
			
		||||
 | 
			
		||||
set "FINALPROMPT=Press Enter key to exit."
 | 
			
		||||
if ["!USERDIRFILLED!"] == ["1"] (
 | 
			
		||||
	echo We left your game data and mods alone, so you may delete those manually.
 | 
			
		||||
	echo.
 | 
			
		||||
	echo    !USERDIR!
 | 
			
		||||
	echo.
 | 
			
		||||
	set "FINALPROMPT=Do you want to view your data? [yes/no]"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if ["!INSTALLDIRFILLED!"] == ["1"] (
 | 
			
		||||
	echo We left some extra files alone in your install folder.
 | 
			
		||||
	echo.
 | 
			
		||||
	echo    !INSTALLDIR!
 | 
			
		||||
	echo.
 | 
			
		||||
	set "FINALPROMPT=Do you want to view your data? [yes/no]"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set FINALRESPONSE=
 | 
			
		||||
set /p FINALRESPONSE="!FINALPROMPT! "
 | 
			
		||||
 | 
			
		||||
if NOT ["!FINALPROMPT!"] == ["Press Enter key to exit."] (
 | 
			
		||||
	if /I ["!FINALRESPONSE:~0,1!"] == ["y"] (
 | 
			
		||||
		if ["!USERDIRFILLED!"] == ["1"] (
 | 
			
		||||
			"!SystemRoot!\explorer.exe" "!USERDIR!"
 | 
			
		||||
		)
 | 
			
		||||
		if ["!INSTALLDIRFILLED!"] == ["1"] (
 | 
			
		||||
			"!SystemRoot!\explorer.exe" "!INSTALLDIR!"
 | 
			
		||||
		)
 | 
			
		||||
	) else (
 | 
			
		||||
		if ["!FINALRESPONSE!"] == [""] (
 | 
			
		||||
			if ["!USERDIRFILLED!"] == ["1"] (
 | 
			
		||||
				"!SystemRoot!\explorer.exe" "!USERDIR!"
 | 
			
		||||
			)
 | 
			
		||||
			if ["!INSTALLDIRFILLED!"] == ["1"] (
 | 
			
		||||
				"!SystemRoot!\explorer.exe" "!INSTALLDIR!"
 | 
			
		||||
			)
 | 
			
		||||
		)
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
: DeferredDelete
 | 
			
		||||
 | 
			
		||||
:: Now let's delete our installation folder!
 | 
			
		||||
cd \
 | 
			
		||||
start "" /b "cmd" /s /c " del /q /f "%INSTALLDIR%\uninstall.bat"&timeout /t 2 > NUL&rmdir "%INSTALLDIR%"&exit /b "
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue