Compare commits
68
Commits
v9.2
...
vidmodestuff
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
467ecf8224 | ||
|
|
2077315f24 | ||
|
|
67e74b5874 | ||
|
|
9bea6eddbd | ||
|
|
f4e5f7249c | ||
|
|
9639ace28a | ||
|
|
a2616778cc | ||
|
|
495c34dd40 | ||
|
|
b0bf588c27 | ||
|
|
35e4f35f6e | ||
|
|
7866b769cc | ||
|
|
1af1e42dab | ||
|
|
40bd3e5e19 | ||
|
|
25dd3b4976 | ||
|
|
0fe3086a5a | ||
|
|
c9afd4a2cd | ||
|
|
7518a6f181 | ||
|
|
2bf4c44259 | ||
|
|
1c95e5f40e | ||
|
|
7c848f4be5 | ||
|
|
a4af254643 | ||
|
|
860dc37fe4 | ||
|
|
8b3d55fbc8 | ||
|
|
0540b5656a | ||
|
|
6c98440f27 | ||
|
|
3828a9f8e0 | ||
|
|
2c7c9ec32a | ||
|
|
1ccd3e37bc | ||
|
|
6ad344f65d | ||
|
|
1c289d73ca | ||
|
|
44ba69cf53 | ||
|
|
4cea0c1414 | ||
|
|
4ee468f5c6 | ||
|
|
9a58eb3010 | ||
|
|
59ff5e61bf | ||
|
|
821c061f82 | ||
|
|
eb4d9bbdd5 | ||
|
|
c19c80d797 | ||
|
|
a2feaa7fde | ||
|
|
3cb4e86b48 | ||
|
|
ed758fc921 | ||
|
|
a191c8b71e | ||
|
|
3f2e0bd349 | ||
|
|
3bdc745bd1 | ||
|
|
a05413d925 | ||
|
|
8a8cbffd12 | ||
|
|
1fb6c63097 | ||
|
|
c312380944 | ||
|
|
b5bb2b42bf | ||
|
|
d074f375ca | ||
|
|
6fd14f0a80 | ||
|
|
d6bbb2c1b3 | ||
|
|
fa66b87965 | ||
|
|
c59d5db03e | ||
|
|
b6edc90553 | ||
|
|
23735121ff | ||
|
|
20950b698f | ||
|
|
44df85d6a4 | ||
|
|
42d53f1f6f | ||
|
|
48f2d0ff83 | ||
|
|
517723f9c1 | ||
|
|
6915077e0f | ||
|
|
406dbf333d | ||
|
|
a730dfd212 | ||
|
|
3058d365f3 | ||
|
|
ccc453e0b0 | ||
|
|
c3d02090e4 | ||
|
|
20cd7621c3 |
No files matched your search
@@ -64,7 +64,7 @@ endif
|
||||
|
||||
# This must have high to low order.
|
||||
gcc_versions:=\
|
||||
151 150 15\
|
||||
152 151 150 15\
|
||||
142 141 140 14\
|
||||
132 131 130 13\
|
||||
123 122 121 120 12\
|
||||
@@ -77,7 +77,7 @@ gcc_versions:=\
|
||||
55 54 53 52 51 50\
|
||||
49 48 47 46 45 44 43 42 41 40
|
||||
|
||||
latest_gcc_version:=15.1.1
|
||||
latest_gcc_version:=15.2
|
||||
|
||||
# Automatically set version flag, but not if one was
|
||||
# manually set. And don't bother if this is a clean only
|
||||
|
||||
@@ -20,7 +20,7 @@ $(foreach v,$(join $(wordlist 2,$(_n),- $(gcc_versions)),\
|
||||
CXXFLAGS+= -Wno-aggregate-return
|
||||
|
||||
# -W -Wno-unused
|
||||
WFLAGS:=-Wall -Wno-trigraphs
|
||||
WFLAGS:=-Wall -Wno-trigraphs -Wnull-dereference
|
||||
ifndef GCC295
|
||||
#WFLAGS+=-Wno-packed
|
||||
endif
|
||||
|
||||
@@ -226,10 +226,6 @@ const char *I_LocateWad(void)
|
||||
return "/sdcard/srb2";
|
||||
}
|
||||
|
||||
void I_GetJoystickEvents(void){}
|
||||
|
||||
void I_GetJoystick2Events(void){}
|
||||
|
||||
char *I_GetEnv(const char *name)
|
||||
{
|
||||
LOGW("I_GetEnv() called?!");
|
||||
|
||||
+7
-4
@@ -237,10 +237,13 @@ void COM_ImmedExecute(const char *ptext)
|
||||
char line[1024] = "";
|
||||
INT32 quotes;
|
||||
|
||||
while (i < strlen(ptext))
|
||||
const size_t txtlength = strlen(ptext);
|
||||
|
||||
while (i < txtlength)
|
||||
{
|
||||
quotes = 0;
|
||||
for (j = 0; i < strlen(ptext); i++,j++)
|
||||
|
||||
for (j = 0; i < txtlength; i++,j++)
|
||||
{
|
||||
if (ptext[i] == '\"' && !quotes && i > 0 && ptext[i-1] != ' ') // Malformed command
|
||||
return;
|
||||
@@ -652,7 +655,7 @@ static void COM_Alias_f(void)
|
||||
CONS_Printf(M_GetText("All aliases that start with \x87'%s'\x80 are:\n"), begin);
|
||||
|
||||
int count = 0;
|
||||
for (cmdalias_t *head = com_alias; head->next != NULL; head = head->next)
|
||||
for (cmdalias_t *head = com_alias; head != NULL; head = head->next)
|
||||
{
|
||||
if (strncmp(begin, head->name, szBegin) == 0)
|
||||
{
|
||||
@@ -673,7 +676,7 @@ static void COM_Alias_f(void)
|
||||
/* Display alias subtext, show all aliases. */
|
||||
CONS_Printf(M_GetText("alias <name> <command>: create a shortcut command that executes other command(s)\n"));
|
||||
|
||||
for (cmdalias_t *head = com_alias; head->next != NULL; head = head->next)
|
||||
for (cmdalias_t *head = com_alias; head != NULL; head = head->next)
|
||||
{
|
||||
CONS_Printf(alias_format, head->name, head->value);
|
||||
}
|
||||
|
||||
+13
-2
@@ -1457,12 +1457,14 @@ static inline void CL_DrawConnectionStatus(void)
|
||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, dldlength, 8, 160);
|
||||
|
||||
memset(tempname, 0, sizeof(tempname));
|
||||
|
||||
// offset filename to just the name only part
|
||||
filename += strlen(filename) - nameonlylength(filename);
|
||||
const size_t filenamelength = strlen(filename);
|
||||
|
||||
if (strlen(filename) > sizeof(tempname)-1) // too long to display fully
|
||||
if (filenamelength > sizeof(tempname)-1) // too long to display fully
|
||||
{
|
||||
size_t endhalfpos = strlen(filename)-10;
|
||||
size_t endhalfpos = filenamelength-10;
|
||||
// display as first 14 chars + ... + last 10 chars
|
||||
// which should add up to 27 if our math(s) is correct
|
||||
snprintf(tempname, sizeof(tempname), "%.14s...%.10s", filename, filename+endhalfpos);
|
||||
@@ -1775,6 +1777,9 @@ static void SV_SendPlayerInfo(INT32 node)
|
||||
|
||||
static void SV_SendMapIcon(INT32 node)
|
||||
{
|
||||
if (node == 0)
|
||||
return;
|
||||
|
||||
doomdata_t *netbuffer = DOOMCOM_DATA(doomcom);
|
||||
|
||||
const char *map = va("%sP", G_BuildMapName(gamemap));
|
||||
@@ -3472,6 +3477,9 @@ void CL_Reset(void)
|
||||
|
||||
memset(player_muted, 0, sizeof(player_muted));
|
||||
|
||||
for (INT32 i = 0; i < MAXPLAYERS; ++i)
|
||||
playerinfo[i].node = 255;
|
||||
|
||||
// D_StartTitle should get done now, but the calling function will handle it
|
||||
}
|
||||
|
||||
@@ -4260,6 +4268,9 @@ void D_ClientServerInit(void)
|
||||
#endif
|
||||
D_LoadBan(false);
|
||||
|
||||
for (INT32 i = 0; i < MAXPLAYERS; ++i)
|
||||
playerinfo[i].node = 255;
|
||||
|
||||
gametic = 0;
|
||||
localgametic = 0;
|
||||
|
||||
|
||||
+2
-2
@@ -997,6 +997,8 @@ void D_RegisterClientCommands(void)
|
||||
|
||||
CV_RegisterVar(&cv_litesteer[i]);
|
||||
|
||||
CV_RegisterVar(&cv_autoaccel[i]);
|
||||
|
||||
CV_RegisterVar(&cv_usejoystick[i]);
|
||||
CV_RegisterVar(&cv_joyscale[i]);
|
||||
CV_RegisterVar(&cv_rumble[i]);
|
||||
@@ -4749,8 +4751,6 @@ static void Command_LocateLump_f(void)
|
||||
}
|
||||
}
|
||||
|
||||
#define MAXDOOMEDNUM 4095
|
||||
|
||||
static void Command_ListDoomednums_f(void)
|
||||
{
|
||||
INT16 i, j, k = 0, l = 0;
|
||||
|
||||
+12
-7
@@ -1079,12 +1079,14 @@ void CloseNetFile(void)
|
||||
|
||||
// Receiving a file?
|
||||
for (i = 0; i < MAX_WADFILES; i++)
|
||||
{
|
||||
if (fileneeded[i].status == FS_DOWNLOADING && fileneeded[i].file)
|
||||
{
|
||||
fclose(fileneeded[i].file);
|
||||
// File is not complete delete it
|
||||
remove(fileneeded[i].filename);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove PT_FILEFRAGMENT from acknowledge list
|
||||
Net_AbortPacketType(PT_FILEFRAGMENT);
|
||||
@@ -1098,17 +1100,16 @@ void nameonly(char *s)
|
||||
void *ns;
|
||||
|
||||
for (j = strlen(s); j != (size_t)-1; j--)
|
||||
{
|
||||
if ((s[j] == '\\') || (s[j] == ':') || (s[j] == '/'))
|
||||
{
|
||||
ns = &(s[j+1]);
|
||||
len = strlen(ns);
|
||||
#if 0
|
||||
memcpy(s, ns, len+1);
|
||||
#else
|
||||
memmove(s, ns, len+1);
|
||||
#endif
|
||||
memmove(s, ns, len+1);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the length in characters of the last element of a path.
|
||||
@@ -1162,8 +1163,12 @@ filestatus_t findfile(char *filename, const UINT8 *wantedmd5sum, boolean complet
|
||||
filestatus_t homecheck; // store result of last file search
|
||||
boolean badmd5 = false; // store whether md5 was bad from either of the first two searches (if nothing was found in the third)
|
||||
|
||||
// skip for startup, our mainwads wont be in there
|
||||
if (loaded_config)
|
||||
// see IdentifyVersion
|
||||
// Iwads skip findfile due to passing fullpath to W_OpenWadFile
|
||||
#if 0
|
||||
// skip for Iwads, as they wont be in there
|
||||
if (!startupiwadcount)
|
||||
#endif
|
||||
{
|
||||
if (cv_addons_option.value == 3 && *cv_addons_folder.string != '\0')
|
||||
{
|
||||
|
||||
@@ -167,6 +167,8 @@ static char returnWadPath[256];
|
||||
#include "../i_video.h"
|
||||
#include "../i_sound.h"
|
||||
#include "../i_system.h"
|
||||
#include "../i_time.h"
|
||||
#include "../i_net.h"
|
||||
#include "../screen.h" //vid.WndParent
|
||||
#include "../d_net.h"
|
||||
#include "../g_game.h"
|
||||
@@ -196,8 +198,6 @@ UINT8 keyboard_started = false;
|
||||
|
||||
#ifdef HAVE_TERMIOS
|
||||
// TERMIOS console code from Quake3: thank you!
|
||||
boolean stdin_active = true;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
size_t cursor;
|
||||
@@ -699,11 +699,7 @@ void I_JoyScale4(void)
|
||||
|
||||
|
||||
*/
|
||||
void I_ShutdownJoystick(void)
|
||||
{
|
||||
}
|
||||
|
||||
void I_GetJoystickEvents(UINT8 index)
|
||||
void I_ShutdownJoystick(UINT8 index)
|
||||
{
|
||||
(void)index;
|
||||
}
|
||||
|
||||
@@ -115,6 +115,10 @@ INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
||||
return -1;
|
||||
}
|
||||
|
||||
void VID_RefreshModeList(void)
|
||||
{
|
||||
}
|
||||
|
||||
void VID_PrepareModeList(void)
|
||||
{
|
||||
}
|
||||
@@ -125,6 +129,13 @@ INT32 VID_SetMode(INT32 modeNum)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height)
|
||||
{
|
||||
(void)width;
|
||||
(void)height;
|
||||
return false;
|
||||
}
|
||||
|
||||
void I_StartupGraphics(void)
|
||||
{
|
||||
}
|
||||
|
||||
+2
-2
@@ -10,7 +10,7 @@ FUNCINLINE static ATTRINLINE boolean fasticmp(const char *s, const char *c)
|
||||
}
|
||||
|
||||
// case-sensitive of the above
|
||||
FUNCINLINE static ATTRINLINE boolean fastcmp(const char *s, const char *c)
|
||||
FUNCINLINE static ATTRINLINE PUREFUNC boolean fastcmp(const char *s, const char *c)
|
||||
{
|
||||
for (; *s && *s == *c; s++, c++) ;
|
||||
return (*s == *c); // make sure both strings ended
|
||||
@@ -18,7 +18,7 @@ FUNCINLINE static ATTRINLINE boolean fastcmp(const char *s, const char *c)
|
||||
|
||||
// length-limited of the above
|
||||
// only true if both strings are at least l characters long AND match, case-sensitively!
|
||||
FUNCINLINE static ATTRINLINE boolean fastncmp(const char *s, const char *c, UINT16 l)
|
||||
FUNCINLINE static ATTRINLINE PUREFUNC boolean fastncmp(const char *s, const char *c, UINT16 l)
|
||||
{
|
||||
for (; *s && *s == *c && --l; s++, c++) ;
|
||||
return !l; // make sure you reached the end
|
||||
|
||||
+72
-33
@@ -55,6 +55,8 @@
|
||||
#include "k_stats.h" // SRB2kart
|
||||
#include "r_fps.h" // frame interpolation/uncapped
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef HAVE_DISCORDRPC
|
||||
#include "discord.h"
|
||||
#endif
|
||||
@@ -2401,49 +2403,69 @@ static long G_GetCreationTime(char *filepath)
|
||||
|
||||
static char *G_GetDemoDate(menudemo_t *pdemo)
|
||||
{
|
||||
char *datetime;
|
||||
datetime = malloc(sizeof(pdemo->date)); // mallocma balls
|
||||
|
||||
// no mallocma balls... :c
|
||||
if (!datetime)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *endPos = NULL;
|
||||
static char datetime[11];
|
||||
time_t file_time = 0;
|
||||
const char *format = NULL;
|
||||
struct tm *tm_buf = NULL;
|
||||
CLEANUP(pfree) char *filename = NULL;
|
||||
|
||||
// get le filepath
|
||||
char *filename;
|
||||
filename = strdup(pdemo->filepath);
|
||||
|
||||
#if defined (_WIN32)
|
||||
if (!filename)
|
||||
{
|
||||
// if we cant get a filename try just getting the file create time
|
||||
#if defined (_WIN32)
|
||||
// if we cant get a filename try just getting the file creation time
|
||||
file_time = G_GetCreationTime(pdemo->filepath);
|
||||
goto skipfilenametime;
|
||||
}
|
||||
#else
|
||||
if (!filename)
|
||||
{
|
||||
free(datetime);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// get the actual filename Zzz...
|
||||
nameonly(filename);
|
||||
|
||||
// convert it to long Zzz....
|
||||
file_time = strtol(filename, NULL, 10);
|
||||
free(filename); // dont need this anymore a
|
||||
// the first 10 characters of a replay name usually is a unix timestamp
|
||||
|
||||
// not long enough to contain a valid timestamp
|
||||
if (strlen(filename) < 10)
|
||||
{
|
||||
#if defined (_WIN32)
|
||||
// try to get file creation time
|
||||
file_time = G_GetCreationTime(pdemo->filepath);
|
||||
goto skipfilenametime;
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef AVOID_ERRNO
|
||||
errno = 0;
|
||||
#endif
|
||||
// get the timestamp as actual numbers lul
|
||||
file_time = strtol(filename, &endPos, 10);
|
||||
|
||||
if (endPos == filename // Empty string
|
||||
#ifndef AVOID_ERRNO
|
||||
|| errno == ERANGE // Number out-of-range
|
||||
#endif
|
||||
|| file_time < 0) // Number is not positive
|
||||
{
|
||||
#if defined (_WIN32)
|
||||
// just try and get the creation time then
|
||||
file_time = G_GetCreationTime(pdemo->filepath);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined (_WIN32)
|
||||
skipfilenametime:
|
||||
#endif
|
||||
|
||||
// then throw it into localtime to get an actual human readable format lmao
|
||||
struct tm *tm_buf = NULL;
|
||||
tm_buf = localtime(&file_time);
|
||||
|
||||
// cant believe we ended up in 1970
|
||||
@@ -2456,14 +2478,10 @@ skipfilenametime:
|
||||
tm_buf = localtime(&file_time);
|
||||
|
||||
if (tm_buf == NULL || tm_buf->tm_year <= 110)
|
||||
{
|
||||
free(datetime);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
goto gotcreationtime;
|
||||
#else
|
||||
free(datetime);
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
@@ -2472,17 +2490,27 @@ skipfilenametime:
|
||||
gotcreationtime:
|
||||
#endif
|
||||
|
||||
const char *format;
|
||||
|
||||
// US ppl are special (:
|
||||
if (cv_demodateformat.value == 2)
|
||||
format = "%m.%d.%Y";
|
||||
else if (cv_demodateformat.value == 1)
|
||||
format = "%d.%m.%Y";
|
||||
else
|
||||
format = strstr(setlocale(LC_TIME, NULL), "en_US") ? "%m.%d.%Y" : "%d.%m.%Y";
|
||||
{
|
||||
const char *locale = setlocale(LC_TIME, NULL);
|
||||
|
||||
strftime(datetime, sizeof(pdemo->date), format, tm_buf);
|
||||
if (locale == NULL)
|
||||
format = "%d.%m.%Y"; // fallback to non US format
|
||||
else if (strstr(locale, "en_US"))
|
||||
format = "%m.%d.%Y";
|
||||
else
|
||||
format = "%d.%m.%Y";
|
||||
}
|
||||
|
||||
if (strftime(datetime, sizeof(datetime), format, tm_buf) == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return datetime;
|
||||
}
|
||||
@@ -2491,6 +2519,7 @@ void G_LoadDemoTitle(menudemo_t *pdemo)
|
||||
{
|
||||
UINT8 infobuffer[96], *info_p;
|
||||
UINT16 pdemoversion;
|
||||
char *demodate = NULL;
|
||||
size_t count;
|
||||
|
||||
FILE *handle = fopen(pdemo->filepath, "rb");
|
||||
@@ -2529,13 +2558,13 @@ void G_LoadDemoTitle(menudemo_t *pdemo)
|
||||
memcpy(pdemo->title, info_p, 64);
|
||||
|
||||
// demo date
|
||||
char *demodate;
|
||||
demodate = G_GetDemoDate(pdemo);
|
||||
|
||||
if (demodate)
|
||||
strncpy(pdemo->date, demodate, sizeof(pdemo->date));
|
||||
{
|
||||
strlcpy(pdemo->date, demodate, sizeof(pdemo->date));
|
||||
}
|
||||
|
||||
free(demodate);
|
||||
break;
|
||||
#ifdef DEMO_COMPAT_100
|
||||
case 0x0001:
|
||||
@@ -2795,7 +2824,7 @@ void G_DoPlayDemo(char *defdemoname)
|
||||
demobuf.p += 4; // Extrainfo location
|
||||
|
||||
// ...*map* not loaded?
|
||||
if (!gamemap || (gamemap > NUMMAPS) || !mapheaderinfo[gamemap-1] || !(mapheaderinfo[gamemap-1]->menuflags & LF2_EXISTSHACK))
|
||||
if (!gamemap || (gamemap > NUMMAPS) || (W_CheckNumForName(G_BuildMapName(gamemap)) == LUMPERROR))
|
||||
{
|
||||
snprintf(msg, 1024, M_GetText("%s features a course that is not currently loaded.\n"), pdemoname);
|
||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||
@@ -2836,6 +2865,16 @@ void G_DoPlayDemo(char *defdemoname)
|
||||
return;
|
||||
}
|
||||
|
||||
// ...*map* not loaded?
|
||||
if (!gamemap || (gamemap > NUMMAPS) || !mapheaderinfo[gamemap-1] || !(mapheaderinfo[gamemap-1]->menuflags & LF2_EXISTSHACK))
|
||||
{
|
||||
snprintf(msg, 1024, M_GetText("%s features a course that is not currently loaded.\n"), pdemoname);
|
||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||
G_ResetDemoPlayback();
|
||||
return;
|
||||
}
|
||||
|
||||
// Set color
|
||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
||||
{
|
||||
|
||||
+74
-8
@@ -454,6 +454,14 @@ consvar_t cv_litesteer[MAXSPLITSCREENPLAYERS] = {
|
||||
{"litesteer4", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}
|
||||
};
|
||||
|
||||
//static CV_PossibleValue_t autoaccelcons_t[] = {{0, "Off"}, {1, "Manual"}, {2, "Automatic"}, {0, NULL}};
|
||||
consvar_t cv_autoaccel[MAXSPLITSCREENPLAYERS] = {
|
||||
{"autoaccel", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},
|
||||
{"autoaccel2", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},
|
||||
{"autoaccel3", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},
|
||||
{"autoaccel4", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}
|
||||
};
|
||||
|
||||
static CV_PossibleValue_t driftsparkpulse_t[] = {{0, "MIN"}, {FRACUNIT*3, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_driftsparkpulse = {"driftsparkpulse", "1.4", CV_FLOAT | CV_SAVE, driftsparkpulse_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
@@ -800,6 +808,10 @@ static fixed_t forwardmove[2] = {25<<FRACBITS>>16, 50<<FRACBITS>>16};
|
||||
static fixed_t sidemove[2] = {2<<FRACBITS>>16, 4<<FRACBITS>>16};
|
||||
static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn
|
||||
|
||||
//
|
||||
// G_HandleLocalDriftturn
|
||||
// Hack for Lua menus that check directional inputs with driftturn
|
||||
//
|
||||
static void G_HandleLocalDriftturn(ticcmd_t *cmd, UINT8 ssplayer)
|
||||
{
|
||||
INT32 axis = 0;
|
||||
@@ -862,9 +874,8 @@ static void G_HandleLocalDriftturn(ticcmd_t *cmd, UINT8 ssplayer)
|
||||
//
|
||||
static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam)
|
||||
{
|
||||
boolean moveinput = false;
|
||||
INT32 axis = 0;
|
||||
const boolean usejoystick = (cv_usejoystick[(ssplayer-1)].value);
|
||||
const boolean usejoystick = cv_usejoystick[(ssplayer-1)].value;
|
||||
|
||||
// check for inputs and return button commands
|
||||
// for stuff like joining with item button, saltyhop, honking, etc.
|
||||
@@ -899,15 +910,11 @@ static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam)
|
||||
|
||||
#undef CHECKINPUT
|
||||
|
||||
moveinput = (InputDown(gc_turnleft, ssplayer) || InputDown(gc_turnright, ssplayer)
|
||||
|| InputDown(gc_aimforward, ssplayer) || InputDown(gc_aimbackward, ssplayer) ||
|
||||
(usejoystick && JoyAxis(AXISAIM, ssplayer) != 0) || (usejoystick && JoyAxis(AXISTURN, ssplayer) != 0));
|
||||
|
||||
axis = JoyAxis(AXISLOOKBACK, ssplayer);
|
||||
camspin[ssplayer-1] = (InputDown(gc_lookback, ssplayer) || (usejoystick && axis > 0));
|
||||
|
||||
// Reset to our spec player if we watch someone else.
|
||||
if ((moveinput || cmd->buttons)
|
||||
if ((cmd->driftturn || cmd->buttons)
|
||||
&& displayplayers[0] != consoleplayer && ssplayer == 1)
|
||||
{
|
||||
if (cv_director.value)
|
||||
@@ -919,6 +926,63 @@ static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam)
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// G_HandleAutoAcceleration
|
||||
//
|
||||
static void G_HandleAutoAcceleration(ticcmd_t *cmd, player_t *player, UINT8 forplayer)
|
||||
{
|
||||
if (!cv_autoaccel[forplayer].value)
|
||||
return;
|
||||
|
||||
if (gamestate != GS_LEVEL)
|
||||
return;
|
||||
|
||||
// dont accel before and during countdown
|
||||
if (leveltime <= starttime)
|
||||
return;
|
||||
|
||||
// dont do this in menus or when console is onscreen
|
||||
if (menuactive || CON_Ready())
|
||||
return;
|
||||
|
||||
// gotta have a player that aint respawning
|
||||
if (!player->mo || player->kartstuff[k_respawn])
|
||||
return;
|
||||
|
||||
// dont need for "finished" players
|
||||
if (player->exiting || (player->pflags & PF_TIMEOVER))
|
||||
return;
|
||||
|
||||
// dont do during spinout
|
||||
if (player->kartstuff[k_spinouttimer])
|
||||
return;
|
||||
|
||||
// spectators and freecam dont need special handling, see G_BuildTiccmd
|
||||
|
||||
if (cmd->buttons & BT_BRAKE)
|
||||
{
|
||||
if (cmd->buttons & BT_DRIFT ||
|
||||
player->kartstuff[k_sneakertimer] ||
|
||||
player->kartstuff[k_squishedtimer])
|
||||
{
|
||||
cmd->forwardmove = (SINT8)forwardmove[0];
|
||||
cmd->buttons |= BT_ACCELERATE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// allows us to drive backwards if we need to
|
||||
if (cmd->forwardmove > 0)
|
||||
cmd->forwardmove = 0;
|
||||
cmd->buttons &= ~BT_ACCELERATE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd->forwardmove = (SINT8)forwardmove[1];
|
||||
cmd->buttons |= BT_ACCELERATE;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// G_BuildTiccmd
|
||||
// Builds a ticcmd from all of the available inputs
|
||||
@@ -1066,7 +1130,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||
if (InputDown(gc_accelerate, ssplayer) || (gamepadjoystickmove && axis > 0) || player->kartstuff[k_sneakertimer])
|
||||
{
|
||||
cmd->buttons |= BT_ACCELERATE;
|
||||
forward = forwardmove[1]; // 50
|
||||
forward = forwardmove[1]; // 50
|
||||
}
|
||||
else if (analogjoystickmove && axis > 0)
|
||||
{
|
||||
@@ -1147,6 +1211,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||
cmd->sidemove = (SINT8)(cmd->sidemove + side);
|
||||
}
|
||||
|
||||
G_HandleAutoAcceleration(cmd, player, forplayer);
|
||||
|
||||
//{ SRB2kart - Drift support
|
||||
// Not grouped with the rest of turn stuff because it needs to know what buttons you're pressing for rubber-burn turn
|
||||
// limit turning to angleturn[1] to stop mouselook letting you look too fast
|
||||
|
||||
@@ -74,6 +74,8 @@ extern consvar_t cv_ydeadzone[MAXSPLITSCREENPLAYERS];
|
||||
|
||||
extern consvar_t cv_litesteer[MAXSPLITSCREENPLAYERS];
|
||||
|
||||
extern consvar_t cv_autoaccel[MAXSPLITSCREENPLAYERS];
|
||||
|
||||
extern consvar_t cv_ghost_besttime, cv_ghost_bestlap, cv_ghost_last, cv_ghost_guest, cv_ghost_staff;
|
||||
|
||||
// Hud offsets
|
||||
|
||||
@@ -619,7 +619,6 @@ static void HWR_PrecacheLevelFlats(void)
|
||||
// lookup for flats that may´ve been already loaded
|
||||
// too lazy to make a hashtable or smth so unordered set will do :carbuncle:
|
||||
std::unordered_set<UINT32> flatpresent;
|
||||
lumpnum_t lump;
|
||||
size_t i, j;
|
||||
INT32 k;
|
||||
|
||||
@@ -649,9 +648,8 @@ static void HWR_PrecacheLevelFlats(void)
|
||||
const INT32 pic = ceiling ? sec->ceilingpic : sec->floorpic;
|
||||
|
||||
const levelflat_t *levelflat = &levelflats[pic];
|
||||
lump = levelflat->lumpnum;
|
||||
|
||||
load_flat(lump, R_NoEncore(sec, ceiling));
|
||||
load_flat(levelflat->lumpnum, R_NoEncore(sec, ceiling));
|
||||
|
||||
if (levelflat->speed) // is it an animated flat ?
|
||||
{
|
||||
@@ -672,9 +670,8 @@ static void HWR_PrecacheLevelFlats(void)
|
||||
for (i = 0; i < numlevelflats; i++)
|
||||
{
|
||||
const levelflat_t *levelflat = &levelflats[i];
|
||||
lump = levelflat->lumpnum;
|
||||
|
||||
load_flat(lump, false);
|
||||
load_flat(levelflat->lumpnum, false);
|
||||
|
||||
if (levelflat->speed) // is it an animated flat ?
|
||||
{
|
||||
|
||||
+104
-57
@@ -14,6 +14,7 @@
|
||||
#ifdef HWRENDER
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
#include "../doomstat.h"
|
||||
#include "../doomdef.h"
|
||||
@@ -1880,6 +1881,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
|
||||
// Used for height comparisons and etc across FOFs and slopes
|
||||
fixed_t high1, highslope1, low1, lowslope1;
|
||||
fixed_t high2, highslope2, low2, lowslope2;
|
||||
|
||||
INT32 texnum;
|
||||
|
||||
@@ -1892,19 +1894,6 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
{
|
||||
for (rover = gl_backsector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
boolean bothsides = false;
|
||||
// Skip if it exists on both sectors.
|
||||
ffloor_t * r2;
|
||||
for (r2 = gl_frontsector->ffloors; r2; r2 = r2->next)
|
||||
if (rover->master == r2->master)
|
||||
{
|
||||
bothsides = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (bothsides)
|
||||
continue;
|
||||
|
||||
const ffloortype_e roverflags = rover->flags;
|
||||
|
||||
if (!(roverflags & FF_EXISTS) || !(roverflags & FF_RENDERSIDES) || (roverflags & FF_INVERTSIDES))
|
||||
@@ -1916,6 +1905,45 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
if ((high1 < lowcut || highslope1 < lowcutslope) || (low1 > highcut || lowslope1 > highcutslope))
|
||||
continue;
|
||||
|
||||
ffloor_t * r2;
|
||||
for (r2 = gl_frontsector->ffloors; r2; r2 = r2->next)
|
||||
{
|
||||
if (r2->master == rover->master) // Skip if same control line.
|
||||
break;
|
||||
|
||||
const ffloortype_e r2flags = r2->flags;
|
||||
|
||||
if (!(r2flags & FF_EXISTS) || !(r2flags & FF_RENDERSIDES))
|
||||
continue;
|
||||
|
||||
if (rover->flags & FF_EXTRA)
|
||||
{
|
||||
if (!(r2flags & FF_CUTEXTRA))
|
||||
continue;
|
||||
|
||||
if (r2flags & FF_EXTRA && (r2flags & (FF_TRANSLUCENT|FF_FOG)) != (rover->flags & (FF_TRANSLUCENT|FF_FOG)))
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(r2flags & FF_CUTSOLIDS))
|
||||
continue;
|
||||
}
|
||||
|
||||
SLOPEPARAMS(*r2->t_slope, high2, highslope2, *r2->topheight)
|
||||
SLOPEPARAMS(*r2->b_slope, low2, lowslope2, *r2->bottomheight)
|
||||
|
||||
if ((high2 < lowcut || highslope2 < lowcutslope) || (low2 > highcut || lowslope2 > highcutslope))
|
||||
continue;
|
||||
if ((high1 > high2 || highslope1 > highslope2) || (low1 < low2 || lowslope1 < lowslope2))
|
||||
continue;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (r2)
|
||||
continue;
|
||||
|
||||
side_t *side = R_GetFFloorSide(gl_curline->linedef, rover, gl_backsector);
|
||||
|
||||
boolean do_texture_skew;
|
||||
@@ -2052,19 +2080,6 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
{
|
||||
for (rover = gl_frontsector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
boolean bothsides = false;
|
||||
// Skip if it exists on both sectors.
|
||||
ffloor_t * r2;
|
||||
for (r2 = gl_backsector->ffloors; r2; r2 = r2->next)
|
||||
if (rover->master == r2->master)
|
||||
{
|
||||
bothsides = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (bothsides)
|
||||
continue;
|
||||
|
||||
const ffloortype_e roverflags = rover->flags;
|
||||
|
||||
if (!(roverflags & FF_EXISTS) || !(roverflags & FF_RENDERSIDES) || !(roverflags & FF_ALLSIDES))
|
||||
@@ -2076,6 +2091,44 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
if ((high1 < lowcut || highslope1 < lowcutslope) || (low1 > highcut || lowslope1 > highcutslope))
|
||||
continue;
|
||||
|
||||
ffloor_t * r2;
|
||||
for (r2 = gl_backsector->ffloors; r2; r2 = r2->next)
|
||||
{
|
||||
if (r2->master == rover->master) // Skip if same control line.
|
||||
break;
|
||||
|
||||
const ffloortype_e r2flags = r2->flags;
|
||||
|
||||
if (!(r2flags & FF_EXISTS) || !(r2flags & FF_RENDERSIDES))
|
||||
continue;
|
||||
|
||||
if (rover->flags & FF_EXTRA)
|
||||
{
|
||||
if (!(r2flags & FF_CUTEXTRA))
|
||||
continue;
|
||||
|
||||
if (r2flags & FF_EXTRA && (r2flags & (FF_TRANSLUCENT|FF_FOG)) != (rover->flags & (FF_TRANSLUCENT|FF_FOG)))
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(r2flags & FF_CUTSOLIDS))
|
||||
continue;
|
||||
}
|
||||
|
||||
SLOPEPARAMS(*r2->t_slope, high2, highslope2, *r2->topheight)
|
||||
SLOPEPARAMS(*r2->b_slope, low2, lowslope2, *r2->bottomheight)
|
||||
|
||||
if ((high2 < lowcut || highslope2 < lowcutslope) || (low2 > highcut || lowslope2 > highcutslope))
|
||||
continue;
|
||||
if ((high1 > high2 || highslope1 > highslope2) || (low1 < low2 || lowslope1 < lowslope2))
|
||||
continue;
|
||||
|
||||
break;
|
||||
}
|
||||
if (r2)
|
||||
continue;
|
||||
|
||||
side_t *side = R_GetFFloorSide(gl_curline->linedef, rover, gl_backsector);
|
||||
|
||||
boolean do_texture_skew;
|
||||
@@ -4174,6 +4227,7 @@ static int CompareVisSprites(const void *p1, const void *p2)
|
||||
static void HWR_SortVisSprites(void)
|
||||
{
|
||||
UINT32 i;
|
||||
|
||||
for (i = 0; i < gl_visspritecount; i++)
|
||||
{
|
||||
gl_vsprorder[i] = HWR_GetVisSprite(i);
|
||||
@@ -4242,38 +4296,29 @@ typedef struct
|
||||
|
||||
// initial size of drawnode array
|
||||
#define DRAWNODES_INIT_SIZE 64
|
||||
gl_drawnode_t *drawnodes = NULL;
|
||||
INT32 numdrawnodes = 0;
|
||||
INT32 alloceddrawnodes = 0;
|
||||
// no reason to waste all the allocations since every map will have atleast one translucent thing
|
||||
static std::vector<gl_drawnode_t> drawnodes;
|
||||
|
||||
static void *HWR_CreateDrawNode(gl_drawnode_type_t type)
|
||||
{
|
||||
gl_drawnode_t *drawnode;
|
||||
// if we didnt alloc anything yet, reserve atleast 64 nodes
|
||||
// dont declare with it as we want our size to be 0!
|
||||
drawnodes.reserve(DRAWNODES_INIT_SIZE);
|
||||
|
||||
if (!drawnodes)
|
||||
{
|
||||
alloceddrawnodes = DRAWNODES_INIT_SIZE;
|
||||
drawnodes = static_cast<gl_drawnode_t*>(Z_Malloc(alloceddrawnodes * sizeof(gl_drawnode_t), PU_LEVEL, &drawnodes));
|
||||
}
|
||||
else if (numdrawnodes >= alloceddrawnodes)
|
||||
{
|
||||
alloceddrawnodes *= 2;
|
||||
Z_Realloc(drawnodes, alloceddrawnodes * sizeof(gl_drawnode_t), PU_LEVEL, &drawnodes);
|
||||
}
|
||||
|
||||
drawnode = &drawnodes[numdrawnodes++];
|
||||
drawnode->type = type;
|
||||
drawnodes.emplace_back();
|
||||
drawnodes.back().type = type;
|
||||
|
||||
// not sure if returning different pointers to a union is necessary
|
||||
switch (type)
|
||||
{
|
||||
case DRAWNODE_PLANE:
|
||||
return &drawnode->u.plane;
|
||||
return &drawnodes.back().u.plane;
|
||||
case DRAWNODE_POLYOBJECT_PLANE:
|
||||
return &drawnode->u.polyplane;
|
||||
return &drawnodes.back().u.polyplane;
|
||||
case DRAWNODE_WALL:
|
||||
return &drawnode->u.wall;
|
||||
return &drawnodes.back().u.wall;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -4337,11 +4382,15 @@ static int CompareDrawNodePlanes(const void *p1, const void *p2)
|
||||
// Sorts and renders the list of drawnodes for the scene being rendered.
|
||||
static void HWR_RenderDrawNodes(void)
|
||||
{
|
||||
INT32 i = 0, run_start = 0;
|
||||
size_t i = 0, run_start = 0;
|
||||
static std::vector<INT32> sortindex;
|
||||
|
||||
sortindex.reserve(DRAWNODES_INIT_SIZE);
|
||||
|
||||
// Array for storing the rendering order.
|
||||
// A list of indices into the drawnodes array.
|
||||
INT32 *sortindex;
|
||||
|
||||
const size_t numdrawnodes = drawnodes.size();
|
||||
|
||||
if (!numdrawnodes)
|
||||
return;
|
||||
@@ -4350,7 +4399,7 @@ static void HWR_RenderDrawNodes(void)
|
||||
|
||||
PS_START_TIMING(ps_hw_nodesorttime);
|
||||
|
||||
sortindex = static_cast<INT32*>(Z_Malloc(sizeof(INT32) * numdrawnodes, PU_STATIC, NULL));
|
||||
sortindex.resize(numdrawnodes);
|
||||
|
||||
// Reversed order
|
||||
for (i = 0; i < numdrawnodes; i++)
|
||||
@@ -4366,7 +4415,7 @@ static void HWR_RenderDrawNodes(void)
|
||||
if (drawnodes[sortindex[run_start]].type == DRAWNODE_PLANE)
|
||||
{
|
||||
// found it, now look for run end
|
||||
INT32 run_end; // (inclusive)
|
||||
size_t run_end; // (inclusive)
|
||||
|
||||
for (i = run_start+1; i < numdrawnodes; i++)
|
||||
{
|
||||
@@ -4379,7 +4428,7 @@ static void HWR_RenderDrawNodes(void)
|
||||
if (run_end > run_start) // if there are multiple consecutive planes, not just one
|
||||
{
|
||||
// consecutive run of planes found, now sort it
|
||||
qs22j(sortindex + run_start, run_end - run_start + 1, sizeof(INT32), CompareDrawNodePlanes);
|
||||
qs22j(sortindex.data() + run_start, run_end - run_start + 1, sizeof(INT32), CompareDrawNodePlanes);
|
||||
}
|
||||
|
||||
run_start = run_end + 1; // continue looking for runs coming right after this one
|
||||
@@ -4451,9 +4500,7 @@ static void HWR_RenderDrawNodes(void)
|
||||
|
||||
PS_STOP_TIMING(ps_hw_nodedrawtime);
|
||||
|
||||
numdrawnodes = 0;
|
||||
|
||||
Z_Free(sortindex);
|
||||
drawnodes.clear(); // clear so our size is 0 again!
|
||||
}
|
||||
|
||||
|
||||
@@ -5491,7 +5538,7 @@ static void HWR_RenderViewpoint(gl_portal_t *rootportal, int stencil_level, bool
|
||||
player_t *viewplayer = &players[displayplayers[viewssnum]];
|
||||
const float fpov = FixedToFloat(R_GetPlayerFov(viewplayer));
|
||||
|
||||
auto reset_viewstate = [&](const float fpov)
|
||||
auto reset_viewstate = [&]()
|
||||
{
|
||||
HWR_SetTransform(fpov);
|
||||
HWR_ClearSprites();
|
||||
@@ -5511,7 +5558,7 @@ static void HWR_RenderViewpoint(gl_portal_t *rootportal, int stencil_level, bool
|
||||
currentportallist = &portallist;
|
||||
HWR_SetPortalState(GLPORTAL_SEARCH);
|
||||
|
||||
reset_viewstate(fpov);
|
||||
reset_viewstate();
|
||||
|
||||
if (rootportal)
|
||||
{
|
||||
@@ -5537,7 +5584,7 @@ static void HWR_RenderViewpoint(gl_portal_t *rootportal, int stencil_level, bool
|
||||
// draw normal things in current frame in current incremented stencil buffer area
|
||||
HWR_SetStencilState(HWR_STENCIL_NORMAL, stencil_level);
|
||||
|
||||
reset_viewstate(fpov);
|
||||
reset_viewstate();
|
||||
|
||||
if constexpr (Type == RenderViewpointType::kPortal)
|
||||
{
|
||||
|
||||
+24
-17
@@ -596,12 +596,12 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
||||
}
|
||||
|
||||
// Only servers/admins can CSAY.
|
||||
if(!server && !(IsPlayerAdmin(consoleplayer)))
|
||||
if (!server && !(IsPlayerAdmin(consoleplayer)))
|
||||
flags &= ~HU_CSAY;
|
||||
|
||||
// We handle HU_SERVER_SAY, not the caller.
|
||||
flags &= ~HU_SERVER_SAY;
|
||||
if(dedicated && !(flags & HU_CSAY))
|
||||
if (dedicated && !(flags & HU_CSAY))
|
||||
flags |= HU_SERVER_SAY;
|
||||
|
||||
buf[0] = target;
|
||||
@@ -615,17 +615,20 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
||||
strlcat(msg, COM_Argv(ix + usedargs), msgspace);
|
||||
}
|
||||
|
||||
if (strlen(msg) > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
|
||||
const size_t msglength = strlen(msg);
|
||||
|
||||
if (msglength > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
|
||||
{
|
||||
// what we're gonna do now is check if the node exists
|
||||
// with that logic, characters 4 and 5 are our numbers:
|
||||
const char *newmsg;
|
||||
INT32 spc = 1; // used if nodenum[1] is a space.
|
||||
char *nodenum = (char*) malloc(3);
|
||||
CLEANUP(pfree) char *nodenum = (char*) malloc(3);
|
||||
memcpy(nodenum, msg+3, 2);
|
||||
nodenum[2] = '\0';
|
||||
|
||||
// check for undesirable characters in our "number"
|
||||
if (((nodenum[0] < '0') || (nodenum[0] > '9')) || ((nodenum[1] < '0') || (nodenum[1] > '9')))
|
||||
if (((nodenum[0] < '0') || (nodenum[0] > '9')) || ((nodenum[1] < '0') || (nodenum[1] > '9')))
|
||||
{
|
||||
// check if nodenum[1] is a space
|
||||
if (nodenum[1] == ' ')
|
||||
@@ -634,23 +637,21 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
||||
else
|
||||
{
|
||||
HU_AddChatText("\x82NOTICE: \x80Invalid command format. Correct format is \'/pm<node> \'.", false);
|
||||
free(nodenum);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// I'm very bad at C, I swear I am, additional checks eww!
|
||||
if (spc != 0)
|
||||
{
|
||||
if (msg[5] != ' ')
|
||||
{
|
||||
HU_AddChatText("\x82NOTICE: \x80Invalid command format. Correct format is \'/pm<node> \'.", false);
|
||||
free(nodenum);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
target = atoi((const char*) nodenum); // turn that into a number
|
||||
free(nodenum);
|
||||
//CONS_Printf("%d\n", target);
|
||||
|
||||
// check for target player, if it doesn't exist then we can't send the message!
|
||||
@@ -661,12 +662,13 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
||||
HU_AddChatText(va("\x82NOTICE: \x80Player %d does not exist.", target), false); // same
|
||||
return;
|
||||
}
|
||||
|
||||
buf[0] = target;
|
||||
newmsg = msg+5+spc;
|
||||
strlcpy(msg, newmsg, HU_MAXMSGLEN + 1);
|
||||
}
|
||||
|
||||
SendNetXCmd(XD_SAY, buf, strlen(msg) + 1 + msg-buf);
|
||||
SendNetXCmd(XD_SAY, buf, msglength + 1 + msg-buf);
|
||||
}
|
||||
|
||||
/** Send a message to everyone.
|
||||
@@ -917,10 +919,12 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
|
||||
return;
|
||||
}
|
||||
|
||||
const size_t msglength = strlen(msg);
|
||||
|
||||
//check for invalid characters (0x80 or above)
|
||||
{
|
||||
size_t i;
|
||||
const size_t j = strlen(msg);
|
||||
const size_t j = msglength;
|
||||
for (i = 0; i < j; i++)
|
||||
{
|
||||
if (msg[i] & 0x80)
|
||||
@@ -967,7 +971,7 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
|
||||
}
|
||||
|
||||
// Handle "/me" actions, but only in messages to everyone.
|
||||
if (target == 0 && strlen(msg) > 4 && strnicmp(msg, "/me ", 4) == 0)
|
||||
if (target == 0 && msglength > 4 && strnicmp(msg, "/me ", 4) == 0)
|
||||
{
|
||||
msg += 4;
|
||||
action = true;
|
||||
@@ -1149,10 +1153,12 @@ static boolean HU_clearChatSpaces(void)
|
||||
size_t i = 0; // Used to just check our message
|
||||
char c; // current character we're iterating.
|
||||
boolean nothingbutspaces = true;
|
||||
const size_t chatlength = strlen(w_chat_buf);
|
||||
|
||||
for (; i < strlen(w_chat_buf); i++) // iterate through message and eradicate all spaces that don't belong.
|
||||
for (; i < chatlength; i++) // iterate through message and eradicate all spaces that don't belong.
|
||||
{
|
||||
c = w_chat_buf[i];
|
||||
|
||||
if (!c)
|
||||
break; // if there's nothing, it's safe to assume our message has ended, so let's not waste any more time here.
|
||||
|
||||
@@ -1161,6 +1167,7 @@ static boolean HU_clearChatSpaces(void)
|
||||
nothingbutspaces = false;
|
||||
}
|
||||
}
|
||||
|
||||
return nothingbutspaces;
|
||||
}
|
||||
|
||||
@@ -1207,11 +1214,11 @@ static void HU_SendChatMessage(void)
|
||||
return;
|
||||
}
|
||||
|
||||
size_t len = strlen(msg);
|
||||
const size_t msglength = strlen(msg);
|
||||
|
||||
if (len >= 5 && strnicmp(msg, "/mute", 5) == 0) // Used /mute
|
||||
if (msglength >= 5 && strnicmp(msg, "/mute", 5) == 0) // Used /mute
|
||||
{
|
||||
if (len > 6)
|
||||
if (msglength > 6)
|
||||
DoMute(msg+6);
|
||||
else
|
||||
HU_AddChatText("\x82NOTICE: \x80Usage: /mute <name|node>", false);
|
||||
@@ -1219,7 +1226,7 @@ static void HU_SendChatMessage(void)
|
||||
return;
|
||||
}
|
||||
|
||||
if (len > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
|
||||
if (msglength > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
|
||||
{
|
||||
INT32 spc = 1; // used if nodenum[1] is a space.
|
||||
const char *newmsg;
|
||||
@@ -1991,7 +1998,7 @@ static void HU_DrawChat(void)
|
||||
longest_name_length = max(longest_name_length, strlen(player_names[i]));
|
||||
}
|
||||
|
||||
for(i = 0; i < MAXPLAYERS; i++)
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (!playeringame[i])
|
||||
continue;
|
||||
|
||||
@@ -29,6 +29,10 @@ extern "C" {
|
||||
*/
|
||||
#define MAX_QUIT_FUNCS 16
|
||||
|
||||
void I_GetConsoleEvents(void);
|
||||
|
||||
extern boolean consolevent;
|
||||
extern boolean framebuffer;
|
||||
|
||||
/** \brief Graphic system had started up
|
||||
*/
|
||||
|
||||
+11
-2
@@ -95,6 +95,7 @@ INT32 VID_SetMode(INT32 modenum);
|
||||
*/
|
||||
const char *VID_GetModeName(INT32 modenum);
|
||||
|
||||
void VID_RefreshModeList(void);
|
||||
void VID_PrepareModeList(void);
|
||||
|
||||
/** \brief can video system do fullscreen
|
||||
@@ -121,12 +122,11 @@ void I_ReadScreen(UINT8 * restrict scr, INT32 scale);
|
||||
|
||||
UINT32 I_GetRefreshRate(void);
|
||||
|
||||
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height);
|
||||
boolean I_CheckNativeRes(void);
|
||||
|
||||
void I_SetBorderlessWindow(void);
|
||||
|
||||
void I_HandleControllerHatRepeat(void);
|
||||
|
||||
#ifdef USE_FBO_OGL
|
||||
|
||||
void RefreshOGLSDLSurface(void);
|
||||
@@ -135,6 +135,15 @@ boolean UseScreenFBO(void);
|
||||
extern boolean downsample;
|
||||
#endif
|
||||
|
||||
// So we can call this from i_video event loop
|
||||
void I_ShutdownJoystick(UINT8 index);
|
||||
|
||||
// Quick thing to make SDL_JOYDEVICEADDED events less of an abomination
|
||||
void I_UpdateJoystickDeviceIndex(UINT8 player);
|
||||
void I_UpdateJoystickDeviceIndices(UINT8 excludePlayer);
|
||||
|
||||
void I_HandleControllerHatRepeat(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
#include "sounds.h"
|
||||
#include "m_fixed.h"
|
||||
|
||||
#define MAXDOOMEDNUM 4095
|
||||
|
||||
// dehacked.c now has lists for the more named enums! PLEASE keep them up to date!
|
||||
// For great modding!!
|
||||
|
||||
|
||||
+3
-1
@@ -4468,7 +4468,9 @@ static void K_drawLapStartAnim(void)
|
||||
V_DrawFixedPatch(leftx, y, FRACUNIT, vflags, kp_lapanim_lap[min(progress/2, 6)], NULL);
|
||||
|
||||
char *lapnum = va("%02d", stplyr->laps + 1);
|
||||
for (int i = 0; i < (int)strlen(lapnum); i++)
|
||||
const size_t laplength = strlen(lapnum);
|
||||
|
||||
for (int i = 0; i < (int)laplength; i++)
|
||||
{
|
||||
int digit = lapnum[i] - '0';
|
||||
int frame = min(2, progress/2 - 8 - (i*2));
|
||||
|
||||
+20
-17
@@ -1064,9 +1064,13 @@ static void ArchiveTables(UINT8 **p)
|
||||
{
|
||||
// Write key
|
||||
e = ArchiveValue(p, TABLESINDEX, -2); // key should be either a number or a string, ArchiveValue can handle this.
|
||||
if (e == 2) // invalid key type (function, thread, lightuserdata, or anything we don't recognise)
|
||||
if (e == 1)
|
||||
n++; // the table contained a new table we'll have to archive. :(
|
||||
else if (e == 2) // invalid key type (function, thread, lightuserdata, or anything we don't recognise)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -2), luaL_typename(gL, -2), i);
|
||||
lua_pop(gL, 1);
|
||||
continue;
|
||||
}
|
||||
else if (e == 3) // nil key due to invalid userdata. NOT an error.
|
||||
{
|
||||
@@ -1077,15 +1081,12 @@ static void ArchiveTables(UINT8 **p)
|
||||
// Write value
|
||||
e = ArchiveValue(p, TABLESINDEX, -1);
|
||||
if (e == 1)
|
||||
{
|
||||
n++; // the table contained a new table we'll have to archive. :(
|
||||
}
|
||||
else if (e == 2) // invalid value type
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -2), luaL_typename(gL, -1));
|
||||
}
|
||||
|
||||
lua_pop(gL, 1);
|
||||
|
||||
}
|
||||
lua_pop(gL, 1);
|
||||
WRITEUINT8(*p, ARCH_TEND);
|
||||
@@ -1276,13 +1277,21 @@ static void UnArchiveTables(UINT8 **p, boolean network)
|
||||
UINT8 ret;
|
||||
|
||||
ret = UnArchiveValue(p, TABLESINDEX, network);
|
||||
if (ret == 3)
|
||||
if (ret == 1) // End of table
|
||||
break;
|
||||
else if (ret == 2) // Key contains a new table
|
||||
n++;
|
||||
else if (ret == 3)
|
||||
{
|
||||
//CONS_Alert(CONS_WARNING,"Couldn't read mobj_t\n");
|
||||
lua_pushnil(gL);
|
||||
}
|
||||
else if (ret == 1) // read key
|
||||
break;
|
||||
|
||||
if (lua_isnil(gL, -1)) // If key is nil, skip this entry
|
||||
{
|
||||
lua_pop(gL, 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
ret = UnArchiveValue(p, TABLESINDEX, network);
|
||||
if (ret == 1)
|
||||
@@ -1291,21 +1300,15 @@ static void UnArchiveTables(UINT8 **p, boolean network)
|
||||
lua_pop(gL, 1); // Pop key
|
||||
break;
|
||||
}
|
||||
else if (ret == 2) // read value
|
||||
n++;
|
||||
else if (ret == 3)
|
||||
{
|
||||
//CONS_Alert(CONS_WARNING,"Couldn't read mobj_t\n");
|
||||
lua_pushnil(gL);
|
||||
}
|
||||
else if (ret == 2) // read value
|
||||
n++;
|
||||
|
||||
if (lua_isnil(gL, -2)) // if key is nil (if a function etc was accidentally saved)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "A nil key in table %d was found! (Invalid key type or corrupted save?)\n", i);
|
||||
lua_pop(gL, 2); // pop key and value instead of setting them in the table, to prevent Lua panic errors
|
||||
}
|
||||
else
|
||||
lua_rawset(gL, -3);
|
||||
lua_rawset(gL, -3);
|
||||
}
|
||||
|
||||
lua_pop(gL, 1);
|
||||
|
||||
+6
-4
@@ -49,17 +49,19 @@ aatree_t *M_AATreeAlloc(UINT32 flags)
|
||||
return aatree;
|
||||
}
|
||||
|
||||
static void M_AATreeFree_Node(aatree_node_t *node)
|
||||
static void M_AATreeFree_Node(aatree_node_t *node, bool is_string)
|
||||
{
|
||||
if (node->left) M_AATreeFree_Node(node->left);
|
||||
if (node->right) M_AATreeFree_Node(node->right);
|
||||
if (node->left) M_AATreeFree_Node(node->left, is_string);
|
||||
if (node->right) M_AATreeFree_Node(node->right, is_string);
|
||||
if (is_string)
|
||||
Z_Free(node->value);
|
||||
Z_Free(node);
|
||||
}
|
||||
|
||||
void M_AATreeFree(aatree_t *aatree)
|
||||
{
|
||||
if (aatree->root)
|
||||
M_AATreeFree_Node(aatree->root);
|
||||
M_AATreeFree_Node(aatree->root, (aatree->flags & AATREE_STRING) == AATREE_STRING);
|
||||
|
||||
Z_Free(aatree);
|
||||
}
|
||||
|
||||
+88
-68
@@ -306,7 +306,6 @@ static void M_SetupMultiHandler(INT32 choice);
|
||||
|
||||
// Options
|
||||
// Split into multiple parts due to size
|
||||
static void M_VideoModeMenu(INT32 choice);
|
||||
static void M_Setup1PControlsMenu(void);
|
||||
static void M_Setup2PControlsMenu(void);
|
||||
static void M_Setup3PControlsMenu(void);
|
||||
@@ -2868,8 +2867,9 @@ static void M_DrawCenteredMenu(void)
|
||||
static inline size_t M_StringHeight(const char *string)
|
||||
{
|
||||
size_t h = 8, i;
|
||||
const size_t strlength = strlen(string);
|
||||
|
||||
for (i = 0; i < strlen(string); i++)
|
||||
for (i = 0; i < strlength; i++)
|
||||
if (string[i] == '\n')
|
||||
h += 8;
|
||||
|
||||
@@ -9358,29 +9358,32 @@ static void M_SetupControlsMenu(UINT8 pnum)
|
||||
break;
|
||||
}
|
||||
|
||||
OP_AllControlsMenu[4].itemaction = &cv_litesteer[pnum];
|
||||
OP_AllControlsMenu[5].itemaction = &cv_turnsmooth[pnum];
|
||||
|
||||
if (pnum > 0)
|
||||
{
|
||||
// Hide P1-only controls
|
||||
OP_AllControlsMenu[15].status = IT_GRAYEDOUT2; // Chat
|
||||
OP_AllControlsMenu[16].status = IT_GRAYEDOUT2; // Rankings
|
||||
OP_AllControlsMenu[17].status = IT_GRAYEDOUT2; // Pause
|
||||
OP_AllControlsMenu[18].status = IT_GRAYEDOUT2; // Screenshot
|
||||
OP_AllControlsMenu[19].status = IT_GRAYEDOUT2; // GIF
|
||||
OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // System Menu
|
||||
OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Console
|
||||
OP_AllControlsMenu[37].status = IT_GRAYEDOUT2; // Director
|
||||
OP_AllControlsMenu[19].status = IT_GRAYEDOUT2; // Chat
|
||||
OP_AllControlsMenu[10].status = IT_GRAYEDOUT2; // Rankings
|
||||
OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Pause
|
||||
OP_AllControlsMenu[22].status = IT_GRAYEDOUT2; // Screenshot
|
||||
OP_AllControlsMenu[23].status = IT_GRAYEDOUT2; // GIF
|
||||
OP_AllControlsMenu[24].status = IT_GRAYEDOUT2; // System Menu
|
||||
OP_AllControlsMenu[25].status = IT_GRAYEDOUT2; // Console
|
||||
OP_AllControlsMenu[41].status = IT_GRAYEDOUT2; // Director
|
||||
}
|
||||
else
|
||||
{
|
||||
// Unhide P1-only controls
|
||||
OP_AllControlsMenu[15].status = IT_CONTROL; // Chat
|
||||
OP_AllControlsMenu[16].status = IT_CONTROL; // Rankings
|
||||
OP_AllControlsMenu[17].status = IT_CONTROL; // Pause
|
||||
OP_AllControlsMenu[18].status = IT_CONTROL; // Screenshot
|
||||
OP_AllControlsMenu[19].status = IT_CONTROL; // GIF
|
||||
OP_AllControlsMenu[20].status = IT_CONTROL; // System Menu
|
||||
OP_AllControlsMenu[21].status = IT_CONTROL; // Console
|
||||
OP_AllControlsMenu[37].status = IT_CONTROL; // Director
|
||||
OP_AllControlsMenu[19].status = IT_CONTROL; // Chat
|
||||
OP_AllControlsMenu[10].status = IT_CONTROL; // Rankings
|
||||
OP_AllControlsMenu[21].status = IT_CONTROL; // Pause
|
||||
OP_AllControlsMenu[22].status = IT_CONTROL; // Screenshot
|
||||
OP_AllControlsMenu[23].status = IT_CONTROL; // GIF
|
||||
OP_AllControlsMenu[24].status = IT_CONTROL; // System Menu
|
||||
OP_AllControlsMenu[25].status = IT_CONTROL; // Console
|
||||
OP_AllControlsMenu[41].status = IT_CONTROL; // Director
|
||||
}
|
||||
|
||||
M_SetupNextMenu(&OP_AllControlsDef);
|
||||
@@ -9494,12 +9497,36 @@ static void M_DrawControl(void)
|
||||
else if ((currentMenu->menuitems[i].status == IT_HEADER) && (i != max-1))
|
||||
V_DrawString(19, y+6, highlightflags|V_ALLOWLOWERCASE, currentMenu->menuitems[i].text);
|
||||
else if (currentMenu->menuitems[i].status & IT_STRING)
|
||||
{
|
||||
V_DrawString(x, y, ((i == itemOn) ? highlightflags|V_ALLOWLOWERCASE : V_ALLOWLOWERCASE), currentMenu->menuitems[i].text);
|
||||
|
||||
if (currentMenu->menuitems[i].status & IT_CVAR)
|
||||
{
|
||||
consvar_t *cv = (consvar_t *)currentMenu->menuitems[i].itemaction;
|
||||
|
||||
// IT_HEADER matches IT_CVAR, for some reason...
|
||||
if (cv)
|
||||
{
|
||||
INT32 w = V_StringWidth(cv->string, 0);
|
||||
V_DrawString(BASEVIDWIDTH - x - w, y,
|
||||
((cv->flags & CV_CHEAT) && !CV_IsSetToDefault(cv) ? warningflags : highlightflags)|MENUCAPS, cv->string);
|
||||
if (i == itemOn)
|
||||
{
|
||||
V_DrawCharacter(BASEVIDWIDTH - x - 10 - w - (skullAnimCounter/5), y,
|
||||
'\x1C' | highlightflags, false); // left arrow
|
||||
V_DrawCharacter(BASEVIDWIDTH - x + 2 + (skullAnimCounter/5), y,
|
||||
'\x1D' | highlightflags, false); // right arrow
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
y += SMALLLINEHEIGHT;
|
||||
}
|
||||
|
||||
V_DrawScaledPatch(currentMenu->x - 20, cursory, 0, (patch_t *)W_CachePatchName("M_CURSOR", PU_PATCH));
|
||||
|
||||
M_DoToolTips(currentMenu);
|
||||
}
|
||||
|
||||
#undef controlheight
|
||||
@@ -9685,14 +9712,11 @@ static void M_ResetControls(INT32 choice)
|
||||
// ===============
|
||||
|
||||
//added : 30-01-98:
|
||||
#define MAXCOLUMNMODES 12 //max modes displayed in one column
|
||||
#define MAXMODEDESCS (MAXCOLUMNMODES*3)
|
||||
|
||||
static modedesc_t modedescs[MAXMODEDESCS];
|
||||
|
||||
static void M_VideoModeMenu(INT32 choice)
|
||||
void M_VideoModeMenu(INT32 choice)
|
||||
{
|
||||
INT32 i, j, vdup, nummodes, width, height;
|
||||
INT32 i, nummodes, width, height;
|
||||
const char *desc;
|
||||
|
||||
(void)choice;
|
||||
@@ -9706,54 +9730,30 @@ static void M_VideoModeMenu(INT32 choice)
|
||||
nummodes = VID_NumModes();
|
||||
|
||||
// DOS does not skip mode 0, because mode 0 is ALWAYS present
|
||||
i = 0;
|
||||
for (; i < nummodes && vidm_nummodes < MAXMODEDESCS; i++)
|
||||
for (i = 0; i < nummodes && vidm_nummodes < MAXMODEDESCS; i++)
|
||||
{
|
||||
desc = VID_GetModeName(i);
|
||||
if (desc)
|
||||
{
|
||||
vdup = 0;
|
||||
|
||||
// when a resolution exists both under VGA and VESA, keep the
|
||||
// VESA mode, which is always a higher modenum
|
||||
for (j = 0; j < vidm_nummodes; j++)
|
||||
{
|
||||
if (fastcmp(modedescs[j].desc, desc))
|
||||
{
|
||||
// mode(0): 320x200 is always standard VGA, not vesa
|
||||
if (modedescs[j].modenum)
|
||||
{
|
||||
modedescs[j].modenum = i;
|
||||
vdup = 1;
|
||||
if (!desc)
|
||||
continue;
|
||||
|
||||
if (i == vid.modenum)
|
||||
vidm_selected = j;
|
||||
}
|
||||
else
|
||||
vdup = 1;
|
||||
modedescs[vidm_nummodes].modenum = i;
|
||||
modedescs[vidm_nummodes].desc = desc;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == vid.modenum)
|
||||
vidm_selected = vidm_nummodes;
|
||||
|
||||
if (!vdup)
|
||||
{
|
||||
modedescs[vidm_nummodes].modenum = i;
|
||||
modedescs[vidm_nummodes].desc = desc;
|
||||
// Pull out the width and height
|
||||
sscanf(desc, "%u%*c%u", &width, &height);
|
||||
|
||||
if (i == vid.modenum)
|
||||
vidm_selected = vidm_nummodes;
|
||||
// Show resolutions above desktop res as red.
|
||||
if (I_CheckAboveDesktopRes(width, height))
|
||||
modedescs[vidm_nummodes].goodratio = 2;
|
||||
// Show multiples of 320x200 as green.
|
||||
else if (SCR_IsAspectCorrect(width, height))
|
||||
modedescs[vidm_nummodes].goodratio = 1;
|
||||
|
||||
// Pull out the width and height
|
||||
sscanf(desc, "%u%*c%u", &width, &height);
|
||||
|
||||
// Show multiples of 320x200 as green.
|
||||
if (SCR_IsAspectCorrect(width, height))
|
||||
modedescs[vidm_nummodes].goodratio = 1;
|
||||
|
||||
vidm_nummodes++;
|
||||
}
|
||||
}
|
||||
vidm_nummodes++;
|
||||
}
|
||||
|
||||
vidm_column_size = (vidm_nummodes+2) / 3;
|
||||
@@ -9949,7 +9949,11 @@ static void M_DrawVideoMode(void)
|
||||
V_DrawString(row, col, highlightflags|MENUCAPS, modedescs[i].desc);
|
||||
// Show multiples of 320x200 as green.
|
||||
else
|
||||
V_DrawString(row, col, ((modedescs[i].goodratio) ? recommendedflags : 0)|MENUCAPS, modedescs[i].desc);
|
||||
{
|
||||
const UINT8 goodratio = modedescs[i].goodratio;
|
||||
const INT32 goodflag = ((goodratio == 2) ? warningflags : (goodratio == 1) ? recommendedflags : 0);
|
||||
V_DrawString(row, col, goodflag|MENUCAPS, modedescs[i].desc);
|
||||
}
|
||||
|
||||
col += 8;
|
||||
if ((i % vidm_column_size) == (vidm_column_size-1))
|
||||
@@ -9973,7 +9977,6 @@ static void M_DrawVideoMode(void)
|
||||
va("Wait %d second%s", testtime, (testtime > 1) ? "s" : ""));
|
||||
M_CentreText(OP_VideoModeDef.y + 158,
|
||||
"or press ESC to return");
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -9989,9 +9992,26 @@ static void M_DrawVideoMode(void)
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 138,
|
||||
recommendedflags|MENUCAPS, "Marked modes are recommended.");
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 146,
|
||||
highlightflags|MENUCAPS, "Other modes may have visual errors.");
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 158,
|
||||
highlightflags|MENUCAPS, "Larger modes may have performance issues.");
|
||||
warningflags|MENUCAPS, "Marked modes are above Desktop resolution");
|
||||
|
||||
if (rendermode == render_opengl)
|
||||
{
|
||||
#ifdef USE_FBO_OGL
|
||||
if (!cv_glframebuffer.value)
|
||||
#endif
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 154,
|
||||
warningflags|MENUCAPS, "and will have visual errors in OpenGL mode.");
|
||||
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 166,
|
||||
highlightflags|MENUCAPS, "Other modes may have visual errors.");
|
||||
}
|
||||
else
|
||||
{
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 154,
|
||||
highlightflags|MENUCAPS, "Other modes may have visual errors.");
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 166,
|
||||
highlightflags|MENUCAPS, "Larger modes may have performance issues.");
|
||||
}
|
||||
}
|
||||
|
||||
// Draw the cursor for the VidMode menu
|
||||
|
||||
+7
-2
@@ -223,6 +223,11 @@ extern menu_t *currentMenu;
|
||||
extern menu_t MainDef;
|
||||
extern menu_t SP_LoadDef;
|
||||
|
||||
#define MAXCOLUMNMODES 12 //max modes displayed in one column
|
||||
#define MAXMODEDESCS (MAXCOLUMNMODES*3)
|
||||
extern menu_t OP_VideoModeDef;
|
||||
void M_VideoModeMenu(INT32 choice);
|
||||
|
||||
// Call upon joystick hotplug
|
||||
void M_SetupJoystickMenu(INT32 choice);
|
||||
extern menu_t OP_JoystickSetDef;
|
||||
@@ -398,7 +403,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
|
||||
NULL\
|
||||
}
|
||||
|
||||
#define CONTROLMENUSTYLE(source, prev)\
|
||||
#define CONTROLMENUSTYLE(source, prev, tooltip)\
|
||||
{\
|
||||
"M_CONTRO",\
|
||||
sizeof (source)/sizeof (menuitem_t),\
|
||||
@@ -409,7 +414,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
|
||||
26, 40,\
|
||||
0,\
|
||||
NULL,\
|
||||
NULL\
|
||||
tooltip\
|
||||
}
|
||||
|
||||
#define IMAGEDEF(source)\
|
||||
|
||||
+38
-25
@@ -648,17 +648,6 @@ static menuitem_t OP_ControlsMenu[] =
|
||||
{IT_SUBMENU | IT_STRING, NULL, "Mouse Options...", &OP_MouseOptionsDef, 55},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Controls per key", &cv_controlperkey, 75},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Digital turn easing (P1)", &cv_turnsmooth[0], 85},
|
||||
{IT_STRING | IT_CVAR, NULL, "Digital turn easing (P2)", &cv_turnsmooth[1], 95},
|
||||
{IT_STRING | IT_CVAR, NULL, "Digital turn easing (P3)", &cv_turnsmooth[2], 105},
|
||||
{IT_STRING | IT_CVAR, NULL, "Digital turn easing (P4)", &cv_turnsmooth[3], 115},
|
||||
|
||||
// i hate our menus sincerly
|
||||
{IT_STRING | IT_CVAR, NULL, "Lite Steer (P1)", &cv_litesteer[0], 135},
|
||||
{IT_STRING | IT_CVAR, NULL, "Lite Steer (P2)", &cv_litesteer[1], 145},
|
||||
{IT_STRING | IT_CVAR, NULL, "Lite Steer (P3)", &cv_litesteer[2], 155},
|
||||
{IT_STRING | IT_CVAR, NULL, "Lite Steer (P4)", &cv_litesteer[3], 165},
|
||||
};
|
||||
|
||||
static const char* OP_ControlsTooltips[] =
|
||||
@@ -669,15 +658,6 @@ static const char* OP_ControlsTooltips[] =
|
||||
"Setup player 4 controls.",
|
||||
"Options for mouse control.",
|
||||
"Allowed amount of controls per key.",
|
||||
"Turn smoothing for non-analog turning (Player 1).",
|
||||
"Turn smoothing for non-analog turning (Player 2).",
|
||||
"Turn smoothing for non-analog turning (Player 3).",
|
||||
"Turn smoothing for non-analog turning (Player 4).",
|
||||
|
||||
"Hold DOWN on d-pad/keyboard for shallow turns (Player 1).",
|
||||
"Hold DOWN on d-pad/keyboard for shallow turns (Player 2).",
|
||||
"Hold DOWN on d-pad/keyboard for shallow turns (Player 3).",
|
||||
"Hold DOWN on d-pad/keyboard for shallow turns (Player 4).",
|
||||
};
|
||||
|
||||
static menuitem_t OP_AllControlsMenu[] =
|
||||
@@ -685,6 +665,13 @@ static menuitem_t OP_AllControlsMenu[] =
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Gamepad Options...", &OP_Joystick1Def, 0},
|
||||
{IT_CALL|IT_STRING, NULL, "Reset to defaults", M_ResetControls, 8},
|
||||
|
||||
{IT_HEADER, NULL, "Control Options", NULL, 0},
|
||||
{IT_SPACE, NULL, NULL, NULL, 0},
|
||||
|
||||
// Cvars are set in M_SetupControlsMenu
|
||||
{IT_STRING|IT_CVAR, NULL, "Lite Steer", &cv_litesteer[0], 18},
|
||||
{IT_STRING|IT_CVAR, NULL, "Digital turn easing", &cv_turnsmooth[0], 26},
|
||||
|
||||
//{IT_SPACE, NULL, NULL, NULL, 0},
|
||||
{IT_HEADER, NULL, "Gameplay Controls", NULL, 0},
|
||||
{IT_SPACE, NULL, NULL, NULL, 0},
|
||||
@@ -733,6 +720,17 @@ static menuitem_t OP_AllControlsMenu[] =
|
||||
{IT_CONTROL, NULL, "Custom Action 3", M_ChangeControl, gc_custom3 },
|
||||
};
|
||||
|
||||
// Has to be same length as OP_AllControlsMenu, but otherwise its mostly empty
|
||||
static const char* OP_AllControlsTooltips[sizeof(OP_AllControlsMenu)/sizeof(OP_AllControlsMenu[0])] = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
"Hold DOWN on d-pad/keyboard for shallow turns.",
|
||||
"Turn smoothing for non-analog turning.",
|
||||
// The rest is null, for now
|
||||
};
|
||||
|
||||
#define OP_JOYMENU(pnum) \
|
||||
{IT_HEADER, NULL, "Gameplay Controls", NULL, 7}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[pnum] , 15}, \
|
||||
@@ -1341,16 +1339,19 @@ static menuitem_t OP_CamOptionsMenu[] =
|
||||
|
||||
{IT_STRING | IT_CVAR | IT_CV_BIGFLOAT, NULL, "Field of View",&cv_fov, 30},
|
||||
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Player 1 Camera options...", &OP_Player1CamOptionsDef, 50},
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Player 2 Camera options...", &OP_Player2CamOptionsDef, 60},
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Player 3 Camera options...", &OP_Player3CamOptionsDef, 70},
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Player 4 Camera options...", &OP_Player4CamOptionsDef, 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Flipcam Mode", &cv_flipcammode, 40},
|
||||
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Player 1 Camera options...", &OP_Player1CamOptionsDef, 60},
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Player 2 Camera options...", &OP_Player2CamOptionsDef, 70},
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Player 3 Camera options...", &OP_Player3CamOptionsDef, 80},
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Player 4 Camera options...", &OP_Player4CamOptionsDef, 90},
|
||||
};
|
||||
|
||||
static const char* OP_CamOptionsTooltips[] =
|
||||
{
|
||||
NULL,
|
||||
"Player field of view.",
|
||||
"Change flipcam mode.\nDisplayplayer - use currently viewed player option.\nLocal - use local flipcam toggle option.",
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
@@ -1652,6 +1653,13 @@ static menuitem_t OP_AccessibilityMenu[] =
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Reverse L/R Channels", &stereoreverse, 85},
|
||||
{IT_STRING|IT_CVAR, NULL, "Same Sound Limit", &cv_samesoundlimit, 90},
|
||||
|
||||
{IT_HEADER, NULL, "Controls", NULL, 100},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P1)", &cv_autoaccel[0], 110},
|
||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P2)", &cv_autoaccel[1], 115},
|
||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P3)", &cv_autoaccel[2], 120},
|
||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P4)", &cv_autoaccel[3], 125},
|
||||
};
|
||||
|
||||
static const char* OP_AccessibilityTooltips[] =
|
||||
@@ -1673,6 +1681,11 @@ static const char* OP_AccessibilityTooltips[] =
|
||||
NULL,
|
||||
"Reverse left and right channels of audio.",
|
||||
"Change how often the same Sound is allowed to play at once.",
|
||||
NULL,
|
||||
"Automatically hold acceleration button (Player 1).",
|
||||
"Automatically hold acceleration button (Player 2).",
|
||||
"Automatically hold acceleration button (Player 3).",
|
||||
"Automatically hold acceleration button (Player 4).",
|
||||
};
|
||||
|
||||
static menuitem_t OP_SaturnMenu[] =
|
||||
@@ -2480,7 +2493,7 @@ menu_t OP_MainDef =
|
||||
menu_t OP_ControlsDef = DEFAULTMENUSTYLE("M_CONTRO", OP_ControlsMenu, &OP_MainDef, 40, 15, OP_ControlsTooltips);
|
||||
//WTF
|
||||
menu_t OP_MouseOptionsDef = DEFAULTMENUSTYLE("M_CONTRO", OP_MouseOptionsMenu, &OP_ControlsDef, 60, 30, OP_MouseTooltips);
|
||||
menu_t OP_AllControlsDef = CONTROLMENUSTYLE(OP_AllControlsMenu, &OP_ControlsDef);
|
||||
menu_t OP_AllControlsDef = CONTROLMENUSTYLE(OP_AllControlsMenu, &OP_ControlsDef, OP_AllControlsTooltips);
|
||||
menu_t OP_Joystick1Def = DEFAULTSCROLLSTYLE("M_CONTRO", OP_Joystick1Menu, &OP_AllControlsDef, 30, 36, NULL);
|
||||
menu_t OP_Joystick2Def = DEFAULTSCROLLSTYLE("M_CONTRO", OP_Joystick2Menu, &OP_AllControlsDef, 30, 36, NULL);
|
||||
menu_t OP_Joystick3Def = DEFAULTSCROLLSTYLE("M_CONTRO", OP_Joystick3Menu, &OP_AllControlsDef, 30, 36, NULL);
|
||||
|
||||
+12
-10
@@ -1346,14 +1346,15 @@ void M_MinimapGenerate(void)
|
||||
minigen = AM_MinimapGenerate(mul);
|
||||
|
||||
if (minigen == NULL || minigen->buf == NULL)
|
||||
goto failure;
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("Couldn't create %s\n"), filepath);
|
||||
return;
|
||||
}
|
||||
|
||||
M_CreateScreenShotPalette();
|
||||
ret = M_SavePNG(filepath, minigen->buf, minigen->w, minigen->h, screenshot_palette);
|
||||
|
||||
failure:
|
||||
if (minigen->buf != NULL)
|
||||
free(minigen->buf);
|
||||
free(minigen->buf);
|
||||
|
||||
if (ret)
|
||||
{
|
||||
@@ -1693,22 +1694,23 @@ char *M_GetToken(const char *inputString)
|
||||
}
|
||||
|
||||
|
||||
const char * M_Ftrim (double f)
|
||||
const char * M_Ftrim(double f)
|
||||
{
|
||||
static char dig[9];/* "0." + 6 digits (6 is printf's default) */
|
||||
int i;
|
||||
|
||||
/* I know I said it's the default, but just in case... */
|
||||
sprintf(dig, "%.6f", fabs(modf(f, &f)));
|
||||
|
||||
/* trim trailing zeroes */
|
||||
for (i = strlen(dig)-1; dig[i] == '0'; --i)
|
||||
;
|
||||
|
||||
if (dig[i] == '.')/* :NOTHING: */
|
||||
return "";
|
||||
else
|
||||
{
|
||||
dig[i + 1] = '\0';
|
||||
return &dig[1];/* skip the 0 */
|
||||
}
|
||||
|
||||
dig[i + 1] = '\0';
|
||||
return &dig[1];/* skip the 0 */
|
||||
}
|
||||
|
||||
/** Count bits in a number.
|
||||
|
||||
@@ -272,6 +272,9 @@ extern consvar_t cv_gravity;
|
||||
|
||||
void P_RespawnSpecials(void);
|
||||
|
||||
extern mobjtype_t g_doomednum_to_mobjtype[MAXDOOMEDNUM+1];
|
||||
void CalculateDoomednumToMobjtype(void);
|
||||
|
||||
mobj_t *P_AllocateMobj(void);
|
||||
mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type);
|
||||
|
||||
|
||||
+60
-35
@@ -3237,7 +3237,22 @@ void P_DestroyRobots(void)
|
||||
// the below is chasecam only, if you're curious. check out P_CalcPostImg in p_user.c for first person
|
||||
void P_CalcChasePostImg(player_t *player, camera_t *thiscam)
|
||||
{
|
||||
const boolean flipcam = (player->pflags & PF_FLIPCAM && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP);
|
||||
boolean player_flipcam = false;
|
||||
|
||||
if (cv_flipcammode.value == 0)
|
||||
player_flipcam = player->pflags & PF_FLIPCAM;
|
||||
else
|
||||
{
|
||||
INT32 pnum = P_GetLocalPlayerNumForPlayer(player);
|
||||
|
||||
// Shouldn't happen but just in case
|
||||
if (pnum == -1)
|
||||
pnum = 0;
|
||||
|
||||
player_flipcam = cv_flipcam[pnum].value;
|
||||
}
|
||||
|
||||
const boolean flipcam = (player_flipcam && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP);
|
||||
UINT8 postimgtype = 0;
|
||||
|
||||
if (encoremode)
|
||||
@@ -10448,6 +10463,24 @@ void P_PrecipitationEffects(void)
|
||||
}
|
||||
}
|
||||
|
||||
mobjtype_t g_doomednum_to_mobjtype[MAXDOOMEDNUM+1] = {};
|
||||
|
||||
void CalculateDoomednumToMobjtype(void)
|
||||
{
|
||||
memset(g_doomednum_to_mobjtype, MT_NULL, sizeof(g_doomednum_to_mobjtype));
|
||||
|
||||
for (size_t i = 0; i < NUMMOBJTYPES; i++)
|
||||
{
|
||||
const INT32 doomednum = mobjinfo[i].doomednum;
|
||||
|
||||
if (doomednum > 0 && doomednum <= MAXDOOMEDNUM)
|
||||
{
|
||||
if (g_doomednum_to_mobjtype[doomednum] == MT_NULL)
|
||||
g_doomednum_to_mobjtype[doomednum] = (mobjtype_t)i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// P_RespawnSpecials
|
||||
//
|
||||
@@ -10521,17 +10554,15 @@ void P_RespawnSpecials(void)
|
||||
|
||||
if (mthing)
|
||||
{
|
||||
mobjtype_t i;
|
||||
mobjtype_t i = MT_NULL;
|
||||
x = mthing->x << FRACBITS;
|
||||
y = mthing->y << FRACBITS;
|
||||
ss = R_PointInSubsector(x, y);
|
||||
|
||||
// find which type to spawn
|
||||
for (i = 0; i < NUMMOBJTYPES; i++)
|
||||
if (mthing->type == mobjinfo[i].doomednum)
|
||||
break;
|
||||
i = g_doomednum_to_mobjtype[mthing->type];
|
||||
|
||||
if (i == NUMMOBJTYPES) // prevent creation of objects with this type -- Monster Iestyn 17/12/17
|
||||
if (i <= MT_NULL || i >= NUMMOBJTYPES) // prevent creation of objects with this type -- Monster Iestyn 17/12/17
|
||||
{
|
||||
// 3D Mode start Thing is unlikely to be added to the que,
|
||||
// so don't bother checking for that specific type
|
||||
@@ -10959,7 +10990,7 @@ INT32 numhuntemeralds = 0;
|
||||
//
|
||||
void P_SpawnMapThing(mapthing_t *mthing)
|
||||
{
|
||||
mobjtype_t i;
|
||||
mobjtype_t i = MT_NULL;
|
||||
mobj_t *mobj;
|
||||
fixed_t x, y, z;
|
||||
subsector_t *ss;
|
||||
@@ -10972,11 +11003,9 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
||||
if (objectplacing)
|
||||
{
|
||||
// find which type to spawn
|
||||
for (i = 0; i < NUMMOBJTYPES; i++)
|
||||
if (mthing->type == mobjinfo[i].doomednum)
|
||||
break;
|
||||
i = g_doomednum_to_mobjtype[mthing->type];
|
||||
|
||||
if (i == NUMMOBJTYPES)
|
||||
if (i <= MT_NULL || i >= NUMMOBJTYPES)
|
||||
{
|
||||
if (mthing->type == 3328) // 3D Mode start Thing
|
||||
return;
|
||||
@@ -11044,13 +11073,9 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
||||
}
|
||||
|
||||
// find which type to spawn
|
||||
for (i = 0; i < NUMMOBJTYPES; i++)
|
||||
{
|
||||
if (mthing->type == mobjinfo[i].doomednum)
|
||||
break;
|
||||
}
|
||||
i = g_doomednum_to_mobjtype[mthing->type];
|
||||
|
||||
if (i == NUMMOBJTYPES)
|
||||
if (i <= MT_NULL || i >= NUMMOBJTYPES)
|
||||
{
|
||||
if (mthing->type == 3328) // 3D Mode start Thing
|
||||
return;
|
||||
@@ -11743,32 +11768,32 @@ ML_NOCLIMB : Direction not controllable
|
||||
if (mobj->flags & MF_MONITOR)
|
||||
{
|
||||
// flag for strong/weak random boxes
|
||||
if (mthing->type == mobjinfo[MT_SUPERRINGBOX].doomednum || mthing->type == mobjinfo[MT_PRUP].doomednum ||
|
||||
mthing->type == mobjinfo[MT_SNEAKERTV].doomednum || mthing->type == mobjinfo[MT_INV].doomednum ||
|
||||
mthing->type == mobjinfo[MT_WHITETV].doomednum || mthing->type == mobjinfo[MT_GREENTV].doomednum ||
|
||||
mthing->type == mobjinfo[MT_YELLOWTV].doomednum || mthing->type == mobjinfo[MT_BLUETV].doomednum ||
|
||||
mthing->type == mobjinfo[MT_BLACKTV].doomednum || mthing->type == mobjinfo[MT_PITYTV].doomednum ||
|
||||
mthing->type == mobjinfo[MT_RECYCLETV].doomednum || mthing->type == mobjinfo[MT_MIXUPBOX].doomednum)
|
||||
if (i == MT_SUPERRINGBOX || i == MT_PRUP ||
|
||||
i == MT_SNEAKERTV || i == MT_INV ||
|
||||
i == MT_WHITETV || i == MT_GREENTV ||
|
||||
i == MT_YELLOWTV || i == MT_BLUETV ||
|
||||
i == MT_BLACKTV || i == MT_PITYTV ||
|
||||
i == MT_RECYCLETV || i == MT_MIXUPBOX)
|
||||
mobj->flags2 |= MF2_AMBUSH;
|
||||
}
|
||||
|
||||
else if (mthing->type != mobjinfo[MT_AXIS].doomednum &&
|
||||
mthing->type != mobjinfo[MT_AXISTRANSFER].doomednum &&
|
||||
mthing->type != mobjinfo[MT_AXISTRANSFERLINE].doomednum &&
|
||||
mthing->type != mobjinfo[MT_NIGHTSBUMPER].doomednum &&
|
||||
mthing->type != mobjinfo[MT_STARPOST].doomednum)
|
||||
else if (
|
||||
i != MT_AXIS &&
|
||||
i != MT_AXISTRANSFER &&
|
||||
i != MT_AXISTRANSFERLINE &&
|
||||
i != MT_NIGHTSBUMPER &&
|
||||
i != MT_STARPOST)
|
||||
mobj->flags2 |= MF2_AMBUSH;
|
||||
}
|
||||
|
||||
if (mthing->options & MTF_OBJECTSPECIAL)
|
||||
{
|
||||
// flag for strong/weak random boxes
|
||||
if (mthing->type == mobjinfo[MT_SUPERRINGBOX].doomednum || mthing->type == mobjinfo[MT_PRUP].doomednum ||
|
||||
mthing->type == mobjinfo[MT_SNEAKERTV].doomednum || mthing->type == mobjinfo[MT_INV].doomednum ||
|
||||
mthing->type == mobjinfo[MT_WHITETV].doomednum || mthing->type == mobjinfo[MT_GREENTV].doomednum ||
|
||||
mthing->type == mobjinfo[MT_YELLOWTV].doomednum || mthing->type == mobjinfo[MT_BLUETV].doomednum ||
|
||||
mthing->type == mobjinfo[MT_BLACKTV].doomednum || mthing->type == mobjinfo[MT_PITYTV].doomednum ||
|
||||
mthing->type == mobjinfo[MT_RECYCLETV].doomednum || mthing->type == mobjinfo[MT_MIXUPBOX].doomednum)
|
||||
if (i == MT_SUPERRINGBOX || i == MT_PRUP ||
|
||||
i == MT_SNEAKERTV || i == MT_INV ||
|
||||
i == MT_WHITETV || i == MT_GREENTV ||
|
||||
i == MT_YELLOWTV || i == MT_BLUETV ||
|
||||
i == MT_BLACKTV || i == MT_PITYTV ||
|
||||
i == MT_RECYCLETV || i == MT_MIXUPBOX)
|
||||
mobj->flags2 |= MF2_STRONGBOX;
|
||||
|
||||
// Requires you to be in bonus time to activate
|
||||
|
||||
+1
-2
@@ -1385,8 +1385,7 @@ static void Polyobj_rotateThings(polyobj_t *po, vector2_t origin, angle_t delta,
|
||||
|
||||
if (mo->player)
|
||||
{
|
||||
angle_t localangle = P_GetLocalAngle(mo->player);
|
||||
P_ForceLocalAngle(mo->player, localangle + delta);
|
||||
P_ForceLocalAngle(mo->player, P_GetLocalAngle(mo->player) + delta);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1965,21 +1965,6 @@ FUNCINLINE static ATTRINLINE player_t *LoadPlayer(UINT32 player)
|
||||
// Loads a mobj_t from a save game
|
||||
//
|
||||
|
||||
static mobjtype_t g_doomednum_to_mobjtype[UINT16_MAX];
|
||||
|
||||
static void CalculateDoomednumToMobjtype(void)
|
||||
{
|
||||
memset(g_doomednum_to_mobjtype, MT_NULL, sizeof(g_doomednum_to_mobjtype));
|
||||
|
||||
for (size_t i = MT_NULL+1; i < NUMMOBJTYPES; i++)
|
||||
{
|
||||
if (mobjinfo[i].doomednum > 0 && mobjinfo[i].doomednum <= UINT16_MAX)
|
||||
{
|
||||
g_doomednum_to_mobjtype[ mobjinfo[i].doomednum ] = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
|
||||
{
|
||||
mobj_t *mobj;
|
||||
@@ -2879,10 +2864,6 @@ static void P_NetUnArchiveThinkers(savebuffer_t *save)
|
||||
if (READUINT32(save->p) != ARCHIVEBLOCK_THINKERS)
|
||||
I_Error("Bad $$$.sav at archive block Thinkers");
|
||||
|
||||
// Pre-calculate this lookup, because it was wasting
|
||||
// a shit ton of time loading mobj thinkers.
|
||||
CalculateDoomednumToMobjtype();
|
||||
|
||||
// remove all the current thinkers
|
||||
for (currentthinker = thinkercap.next; currentthinker != &thinkercap; currentthinker = next)
|
||||
{
|
||||
|
||||
@@ -2861,6 +2861,10 @@ boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate)
|
||||
|
||||
P_ResetDynamicSlopes();
|
||||
|
||||
// Pre-calculate this lookup, because it was wasting
|
||||
// a shit ton of time loading mobj thinkers.
|
||||
CalculateDoomednumToMobjtype();
|
||||
|
||||
P_SpawnMapThings();
|
||||
|
||||
P_SpawnEmblems(!fromnetsave);
|
||||
|
||||
@@ -182,6 +182,9 @@ consvar_t cv_flipcam[MAXSPLITSCREENPLAYERS] = {
|
||||
{"flipcam4", "No", CV_SAVE|CV_CALL|CV_NOINIT, CV_YesNo, FlipCam4_OnChange, 0, NULL, NULL, 0, 0, NULL}
|
||||
};
|
||||
|
||||
static CV_PossibleValue_t flipcammode_cons_t[] = {{0, "Displayplayer"}, {1, "Local"}, {0, NULL}};
|
||||
consvar_t cv_flipcammode = {"flipcammode", "Displayplayer", CV_SAVE, flipcammode_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_shadow = {"shadow", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_shadowoffs = {"offsetshadows", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_skybox = {"skybox", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
@@ -1546,6 +1549,8 @@ void R_RegisterEngineStuff(void)
|
||||
CV_RegisterVar(&cv_flipcam[i]);
|
||||
}
|
||||
|
||||
CV_RegisterVar(&cv_flipcammode);
|
||||
|
||||
// Enough for dedicated server
|
||||
if (dedicated)
|
||||
return;
|
||||
|
||||
@@ -205,6 +205,7 @@ extern consvar_t cv_showhud, cv_translucenthud, cv_uncappedhud;
|
||||
extern consvar_t cv_homremoval;
|
||||
extern consvar_t cv_chasecam[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_flipcam[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_flipcammode;
|
||||
extern consvar_t cv_shadow, cv_shadowoffs;
|
||||
extern consvar_t cv_ffloorclip, cv_spriteclip;
|
||||
extern consvar_t cv_softcyancut;
|
||||
|
||||
+5
-5
@@ -2229,12 +2229,12 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||
lowcutslope = std::max(worldbottomslope, worldlowslope) + viewz;
|
||||
highcutslope = std::min(worldtopslope, worldhighslope) + viewz;
|
||||
|
||||
auto check_fof_offscreen = [&](ffloor_t* rover, INT32 bottom, INT32 bottomslope, INT32 top, INT32 topslope)
|
||||
auto check_fof_offscreen = [&](ffloor_t* rrover, INT32 bottom, INT32 bottomslope, INT32 top, INT32 topslope)
|
||||
{
|
||||
return ((P_GetFFloorTopZAt (rover, segleft .x, segleft .y) <= bottom + viewz
|
||||
&& P_GetFFloorTopZAt (rover, segright.x, segright.y) <= bottomslope + viewz)
|
||||
|| ( P_GetFFloorBottomZAt (rover, segleft .x, segleft .y) >= top + viewz
|
||||
&& P_GetFFloorBottomZAt (rover, segright.x, segright.y) >= topslope + viewz));
|
||||
return ((P_GetFFloorTopZAt (rrover, segleft .x, segleft .y) <= bottom + viewz
|
||||
&& P_GetFFloorTopZAt (rrover, segright.x, segright.y) <= bottomslope + viewz)
|
||||
|| ( P_GetFFloorBottomZAt (rrover, segleft .x, segleft .y) >= top + viewz
|
||||
&& P_GetFFloorBottomZAt (rrover, segright.x, segright.y) >= topslope + viewz));
|
||||
};
|
||||
|
||||
if (frontsector->ffloors && backsector->ffloors)
|
||||
|
||||
+1
-1
@@ -1577,7 +1577,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||
else
|
||||
blendmode = thing->blendmode;
|
||||
|
||||
if (thing->flags2 & MF2_SHADOW || thing->flags2 & MF2_SHADOW) // actually only the player should use this (temporary invisibility)
|
||||
if (thing->flags2 & MF2_SHADOW) // actually only the player should use this (temporary invisibility)
|
||||
trans = tr_trans80; // because now the translucency is set through FF_TRANSMASK
|
||||
else if (thing->frame & FF_TRANSMASK)
|
||||
{
|
||||
|
||||
@@ -1491,6 +1491,9 @@ musicdef_t *S_FindMusicCredit(const char *musname)
|
||||
{
|
||||
def = S_GetMusicCredit(i);
|
||||
|
||||
if (!def)
|
||||
continue;
|
||||
|
||||
if (hash != def->hash)
|
||||
continue;
|
||||
|
||||
|
||||
+5
-4
@@ -42,8 +42,8 @@ INT32 setmodeneeded = 0; // video mode change needed if > 0 (the mode number to
|
||||
static CV_PossibleValue_t shittyscreen_cons_t[] = {{0, "Okay"}, {1, "Shitty"}, {2, "Extra Shitty"}, {0, NULL}};
|
||||
|
||||
//added : 03-02-98: default screen mode, as loaded/saved in config
|
||||
consvar_t cv_scr_width = {"scr_width", "1280", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_scr_width = {"scr_width", "1280", CV_SAVE|CV_CALL, CV_Unsigned, VID_RefreshModeList, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE|CV_CALL, CV_Unsigned, VID_RefreshModeList, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_renderview = {"renderview", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_frameskip = {"frameskip", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
@@ -315,8 +315,9 @@ void SCR_CheckDefaultMode(void)
|
||||
void SCR_SetDefaultMode(void)
|
||||
{
|
||||
// remember the default screen size
|
||||
CV_SetValue(&cv_scr_width, vid.width);
|
||||
CV_SetValue(&cv_scr_height, vid.height);
|
||||
CV_StealthSetValue(&cv_scr_width, vid.width);
|
||||
CV_StealthSetValue(&cv_scr_height, vid.height);
|
||||
VID_RefreshModeList(); // probably not needed but justin käs
|
||||
}
|
||||
|
||||
// Change fullscreen on/off according to cv_fullscreen
|
||||
|
||||
+23
-17
@@ -213,14 +213,12 @@ static char returnWadPath[256];
|
||||
#include "../byteptr.h"
|
||||
#endif
|
||||
|
||||
SDL_bool consolevent = SDL_FALSE;
|
||||
SDL_bool framebuffer = SDL_FALSE;
|
||||
boolean consolevent = false;
|
||||
boolean framebuffer = false;
|
||||
UINT8 keyboard_started = false;
|
||||
|
||||
#ifdef HAVE_TERMIOS
|
||||
// TERMIOS console code from Quake3: thank you!
|
||||
SDL_bool stdin_active = SDL_TRUE;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
size_t cursor;
|
||||
@@ -282,7 +280,7 @@ static void I_ShutdownConsole(void)
|
||||
if (consolevent)
|
||||
{
|
||||
I_OutputMsg("Shutdown tty console\n");
|
||||
consolevent = SDL_FALSE;
|
||||
consolevent = false;
|
||||
tcsetattr(STDIN_FILENO, TCSADRAIN, &tty_tc);
|
||||
}
|
||||
}
|
||||
@@ -301,7 +299,7 @@ static void I_StartupConsole(void)
|
||||
framebuffer = static_cast<SDL_bool>( M_CheckParm("-framebuffer"));
|
||||
|
||||
if (framebuffer)
|
||||
consolevent = SDL_FALSE;
|
||||
consolevent = false;
|
||||
|
||||
if (!consolevent)
|
||||
return;
|
||||
@@ -309,7 +307,7 @@ static void I_StartupConsole(void)
|
||||
if (isatty(STDIN_FILENO)!=1)
|
||||
{
|
||||
I_OutputMsg("stdin is not a tty, tty console mode failed\n");
|
||||
consolevent = SDL_FALSE;
|
||||
consolevent = false;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -511,7 +509,7 @@ static void I_StartupConsole(void)
|
||||
if (gotConsole)
|
||||
{
|
||||
SetConsoleTitleA("SRB2Kart Console");
|
||||
consolevent = SDL_TRUE;
|
||||
consolevent = true;
|
||||
}
|
||||
|
||||
//Let get the real console HANDLE, because Mingw's Bash is bad!
|
||||
@@ -544,7 +542,7 @@ static inline void I_StartupConsole(void)
|
||||
framebuffer = M_CheckParm("-framebuffer");
|
||||
|
||||
if (framebuffer)
|
||||
consolevent = SDL_FALSE;
|
||||
consolevent = false;
|
||||
}
|
||||
static inline void I_ShutdownConsole(void){}
|
||||
#endif
|
||||
@@ -765,7 +763,7 @@ void I_JoyScale4(void)
|
||||
}
|
||||
|
||||
// Cheat to get the device index for a joystick handle
|
||||
INT32 I_GetJoystickDeviceIndex(SDL_GameController *dev)
|
||||
static INT32 I_GetJoystickDeviceIndex(SDL_GameController *dev)
|
||||
{
|
||||
SDL_Joystick *joystick = NULL;
|
||||
|
||||
@@ -1851,17 +1849,20 @@ INT32 I_StartupSystem(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
boolean is_quitting = false;
|
||||
|
||||
//
|
||||
// I_Quit
|
||||
//
|
||||
FUNCNORETURN void ATTRNORETURN I_Quit(void)
|
||||
{
|
||||
static SDL_bool quiting = SDL_FALSE;
|
||||
|
||||
/* prevent recursive I_Quit() */
|
||||
if (quiting) goto death;
|
||||
if (is_quitting)
|
||||
abort();
|
||||
|
||||
is_quitting = true;
|
||||
SDL_ShowCursor(SDL_TRUE);
|
||||
quiting = SDL_FALSE;
|
||||
|
||||
I_ShutdownConsole();
|
||||
M_SaveConfig(NULL); //save game config, cvars..
|
||||
D_SaveBan(); // save the ban list
|
||||
@@ -1888,7 +1889,7 @@ FUNCNORETURN void ATTRNORETURN I_Quit(void)
|
||||
}
|
||||
if (myargmalloc)
|
||||
free(myargv); // Deallocate allocated memory
|
||||
death:
|
||||
|
||||
W_Shutdown();
|
||||
exit(0);
|
||||
}
|
||||
@@ -2314,12 +2315,17 @@ static void pathonly(char *s)
|
||||
size_t j;
|
||||
|
||||
for (j = strlen(s); j != (size_t)-1; j--)
|
||||
{
|
||||
if ((s[j] == '\\') || (s[j] == ':') || (s[j] == '/'))
|
||||
{
|
||||
if (s[j] == ':') s[j+1] = 0;
|
||||
else s[j] = 0;
|
||||
if (s[j] == ':')
|
||||
s[j+1] = 0;
|
||||
else
|
||||
s[j] = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief search for srb2.srb in the given path
|
||||
|
||||
+266
-93
@@ -84,15 +84,20 @@
|
||||
#endif
|
||||
|
||||
// maximum number of windowed modes (see windowedModes[][])
|
||||
#define MAXWINMODES (22)
|
||||
#define MAXWINMODES (128)
|
||||
|
||||
/** \brief
|
||||
*/
|
||||
static INT32 numVidModes = -1;
|
||||
static void I_FillScreenResolutionsList(boolean force);
|
||||
|
||||
/** \brief
|
||||
*/
|
||||
static char vidModeName[33][32]; // allow 33 different modes
|
||||
typedef struct
|
||||
{
|
||||
char name[10];
|
||||
INT32 w;
|
||||
INT32 h;
|
||||
} video_mode_t;
|
||||
|
||||
static video_mode_t windowedModes[MAXWINMODES] = {{"320x200", 320, 200}}; // make sure the default mode exists
|
||||
static const char *fallback_resolution_name = "Fallback";
|
||||
static int vid_nummodes = 1;
|
||||
|
||||
rendermode_t rendermode = render_none;
|
||||
|
||||
@@ -139,9 +144,6 @@ static SDL_bool disable_mouse = SDL_FALSE;
|
||||
#define MOUSE_MENU false //(!disable_mouse && cv_usemouse.value && menuactive && !USE_FULLSCREEN)
|
||||
#define MOUSEBUTTONS_MAX MOUSEBUTTONS
|
||||
|
||||
// first entry in the modelist which is not bigger than MAXVIDWIDTHxMAXVIDHEIGHT
|
||||
static INT32 firstEntry = 0;
|
||||
|
||||
// Total mouse motion X/Y offsets
|
||||
static INT32 mousemovex = 0, mousemovey = 0;
|
||||
|
||||
@@ -155,42 +157,13 @@ static SDL_bool usesdl2soft = SDL_FALSE;
|
||||
static SDL_bool borderlesswindow = SDL_FALSE;
|
||||
|
||||
// SDL2 vars
|
||||
SDL_Window *window = NULL;
|
||||
SDL_Renderer *renderer = NULL;
|
||||
static SDL_Window *window = NULL;
|
||||
static SDL_Renderer *renderer = NULL;
|
||||
static SDL_Texture *texture = NULL;
|
||||
#ifdef HWRENDER
|
||||
static SDL_GLContext sdlglcontext = NULL;
|
||||
#endif
|
||||
static SDL_bool havefocus = SDL_TRUE;
|
||||
static const char *fallback_resolution_name = "Fallback";
|
||||
|
||||
// windowed video modes from which to choose from.
|
||||
static INT32 windowedModes[MAXWINMODES][2] =
|
||||
{
|
||||
{2560,1440}, // 1.66
|
||||
{1920,1200}, // 1.60,6.00
|
||||
{1920,1080}, // 1.66
|
||||
{1680,1050}, // 1.60,5.25
|
||||
{1600,1200}, // 1.33
|
||||
{1600, 900}, // 1.66
|
||||
{1366, 768}, // 1.66
|
||||
{1440, 900}, // 1.60,4.50
|
||||
{1280,1024}, // 1.33?
|
||||
{1280, 960}, // 1.33,4.00
|
||||
{1280, 800}, // 1.60,4.00
|
||||
{1280, 720}, // 1.66
|
||||
{1152, 864}, // 1.33,3.60
|
||||
{1024, 768}, // 1.33,3.20
|
||||
{ 960, 600}, // 1.33,3.20
|
||||
{ 800, 600}, // 1.33,2.50
|
||||
{ 735, 415}, // 1.33,2.50
|
||||
{ 640, 480}, // 1.33,2.00
|
||||
{ 640, 400}, // 1.60,2.00
|
||||
{ 500, 300}, // 1.33
|
||||
{ 320, 240}, // 1.33,1.00
|
||||
{ 320, 200}, // 1.60,1.00
|
||||
};
|
||||
|
||||
#define CUSTOMMODENUM 9999
|
||||
static INT32 custom_width = 0;
|
||||
static INT32 custom_height = 0;
|
||||
|
||||
static SDL_bool Impl_CreateWindow(SDL_bool fullscreen);
|
||||
static void Impl_SetWindowIcon(void);
|
||||
@@ -516,11 +489,20 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
|
||||
return;
|
||||
}
|
||||
|
||||
if (windowmoved && rendermode == render_opengl)
|
||||
if (windowmoved)
|
||||
{
|
||||
I_CheckDesktopRes();
|
||||
|
||||
// if we say moved our game window to a different screen
|
||||
// refetch our resolutions
|
||||
I_FillScreenResolutionsList(false);
|
||||
#ifdef HWRENDER
|
||||
#ifdef USE_FBO_OGL
|
||||
I_DownSample();
|
||||
if (rendermode == render_opengl)
|
||||
{
|
||||
I_DownSample();
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
windowmoved = SDL_FALSE;
|
||||
}
|
||||
@@ -537,7 +519,8 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
|
||||
|
||||
if (!firsttimeonmouse)
|
||||
{
|
||||
if (cv_usemouse.value) I_StartupMouse();
|
||||
if (cv_usemouse.value)
|
||||
I_StartupMouse();
|
||||
}
|
||||
}
|
||||
else if (!mousefocus && !kbfocus)
|
||||
@@ -1219,9 +1202,9 @@ static void VID_Command_ModeList_f(void)
|
||||
"Under opengl, fullscreen only supports native desktop resolution.\n"
|
||||
"Under software, the mode is stretched up to desktop resolution.\n");
|
||||
|
||||
for (i = 0; i < MAXWINMODES; i++)
|
||||
for (i = 0; i < vid_nummodes; i++)
|
||||
{
|
||||
CONS_Printf("%2d: %dx%d\n", i, windowedModes[i][0], windowedModes[i][1]);
|
||||
CONS_Printf("%2d: %dx%d\n", i, windowedModes[i].w, windowedModes[i].h);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1260,7 +1243,7 @@ static void I_CheckDesktopRes(void)
|
||||
return;
|
||||
}
|
||||
|
||||
if (SDL_GetDesktopDisplayMode(currentDisplayIndex, &curmode) != 0)
|
||||
if (SDL_GetCurrentDisplayMode(currentDisplayIndex, &curmode) != 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -1275,6 +1258,11 @@ boolean I_CheckNativeRes(void)
|
||||
return (vid.width == desktopwidth && vid.height == desktopheight);
|
||||
}
|
||||
|
||||
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height)
|
||||
{
|
||||
return (width > desktopwidth || height > desktopheight);
|
||||
}
|
||||
|
||||
#ifdef USE_FBO_OGL
|
||||
|
||||
void RefreshOGLSDLSurface(void)
|
||||
@@ -1426,7 +1414,7 @@ void I_FinishUpdate(void)
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
{
|
||||
OglSdlFinishUpdate(cv_vidwait.value);
|
||||
OglSdlFinishUpdate(window);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
@@ -1505,13 +1493,207 @@ void I_SetPalette(RGBA_t *palette)
|
||||
}
|
||||
}
|
||||
|
||||
// make sure the canonical resolutions are always available
|
||||
static const struct {
|
||||
const int w, h;
|
||||
} canonicals[] = {
|
||||
{1920, 1200}, // 16:10
|
||||
{1280, 800}, // 16:10
|
||||
{ 960, 600}, // 16:10
|
||||
{ 640, 400}, // 16:10
|
||||
{ 320, 200}, // Vanilla Doom
|
||||
};
|
||||
static const int num_canonicals = sizeof(canonicals)/sizeof(*canonicals);
|
||||
|
||||
// [FG] sort resolutions by width first and height second
|
||||
static int cmp_resolutions(const void *a, const void *b)
|
||||
{
|
||||
const video_mode_t *ma = (const video_mode_t *) a;
|
||||
const video_mode_t *mb = (const video_mode_t *) b;
|
||||
|
||||
return (ma->w == mb->w) ? mb->h - ma->h : mb->w - ma->w;
|
||||
}
|
||||
|
||||
static void I_AppendResolution(SDL_DisplayMode *mode, int *list_size)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < *list_size; i++)
|
||||
if (windowedModes[i].w == mode->w
|
||||
&& windowedModes[i].h == mode->h)
|
||||
return;
|
||||
|
||||
snprintf(windowedModes[*list_size].name,
|
||||
sizeof(windowedModes[*list_size].name),
|
||||
"%dx%d", mode->w, mode->h);
|
||||
windowedModes[*list_size].w = mode->w;
|
||||
windowedModes[*list_size].h = mode->h;
|
||||
|
||||
(*list_size)++;
|
||||
}
|
||||
|
||||
// small helper to check if a video mode is canonical
|
||||
static boolean IsModeCanonical(int w, int h)
|
||||
{
|
||||
for (int i = 0; i < num_canonicals; i++)
|
||||
{
|
||||
if (canonicals[i].w == w && canonicals[i].h == h)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// check if our desired resolution already is in the videomode list
|
||||
static int IsCustomResolutionInList(int list_size)
|
||||
{
|
||||
INT32 custom_w = cv_scr_width.value;
|
||||
INT32 custom_h = cv_scr_height.value;
|
||||
|
||||
// startup
|
||||
if (!custom_w || !custom_h)
|
||||
return -2;
|
||||
|
||||
// invalid resolution
|
||||
// dont even attempt to add it
|
||||
if (custom_w < BASEVIDWIDTH || custom_w > MAXVIDWIDTH
|
||||
|| custom_h < BASEVIDHEIGHT || custom_h > MAXVIDHEIGHT)
|
||||
return -1;
|
||||
|
||||
for (int i = 0; i < list_size; i++)
|
||||
{
|
||||
if (windowedModes[i].w == custom_w && windowedModes[i].h == custom_h)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
// I_FillScreenResolutionsList
|
||||
// Get all the supported screen resolutions
|
||||
// and fill the list with them
|
||||
//
|
||||
static void I_FillScreenResolutionsList(boolean force)
|
||||
{
|
||||
int currentDisplayIndex = -1;
|
||||
static int oldDisplayIndex = -1;
|
||||
SDL_DisplayMode mode;
|
||||
int i = 0, list_size = 0;
|
||||
int count = 0;
|
||||
char custom_resolution[10];
|
||||
|
||||
currentDisplayIndex = SDL_GetWindowDisplayIndex(window);
|
||||
|
||||
// No valid index
|
||||
if (currentDisplayIndex < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// didnt change screen, no need to redo the list
|
||||
if (!force && currentDisplayIndex == oldDisplayIndex)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
oldDisplayIndex = currentDisplayIndex;
|
||||
|
||||
// Don't call SDL_ListModes if SDL has not been initialized
|
||||
count = SDL_GetNumDisplayModes(currentDisplayIndex);
|
||||
|
||||
list_size = 0;
|
||||
|
||||
// on success, SDL_GetNumDisplayModes() always returns at least 1
|
||||
if (count > 0)
|
||||
{
|
||||
// -2 for the desired resolution and for NULL
|
||||
count = min(count, MAXWINMODES - 2 - num_canonicals);
|
||||
|
||||
for (i = count - 1 + num_canonicals; i >= 0; i--)
|
||||
{
|
||||
// make sure the canonical resolutions are always available
|
||||
if (i > count - 1)
|
||||
{
|
||||
mode.w = canonicals[i - count].w;
|
||||
mode.h = canonicals[i - count].h;
|
||||
}
|
||||
else
|
||||
{
|
||||
SDL_GetDisplayMode(currentDisplayIndex, i, &mode);
|
||||
}
|
||||
|
||||
I_AppendResolution(&mode, &list_size);
|
||||
}
|
||||
|
||||
windowedModes[list_size].name[0] = '\0';
|
||||
}
|
||||
|
||||
const int customresinlist = IsCustomResolutionInList(list_size);
|
||||
|
||||
if (customresinlist == 0)
|
||||
{
|
||||
// did not find mode from list, make custom resolution if the values somewhat make sense
|
||||
if (list_size < MAXWINMODES)
|
||||
{
|
||||
snprintf(custom_resolution, sizeof(custom_resolution), "%dx%d", cv_scr_width.value, cv_scr_height.value);
|
||||
|
||||
// [FG] if the desired resolution not in the list, append it
|
||||
snprintf(windowedModes[list_size].name,
|
||||
sizeof(windowedModes[list_size].name),
|
||||
"%dx%d", cv_scr_width.value, cv_scr_height.value);
|
||||
windowedModes[list_size].w = cv_scr_width.value;
|
||||
windowedModes[list_size].h = cv_scr_height.value;
|
||||
list_size++;
|
||||
}
|
||||
else
|
||||
CONS_Alert(CONS_ERROR, "Could not set custom resolution!\n");
|
||||
}
|
||||
else if (customresinlist == -1)
|
||||
CONS_Alert(CONS_ERROR, "Could not set custom resolution!\n");
|
||||
|
||||
// [FG] sort the list
|
||||
SDL_qsort(windowedModes, list_size, sizeof(*windowedModes), cmp_resolutions);
|
||||
|
||||
// if we have more video modes than we can list
|
||||
// try to shrink the list, lowest resolutions first
|
||||
// whilst keeping the canonicals
|
||||
if (list_size > MAXMODEDESCS)
|
||||
{
|
||||
// list is sorted from largest to smallest, so start at the end
|
||||
for (i = list_size - 1; i >= 0 && list_size > MAXMODEDESCS; i--)
|
||||
{
|
||||
if (IsModeCanonical(windowedModes[i].w, windowedModes[i].h))
|
||||
continue;
|
||||
|
||||
// Should we like, instead prioritize checking for non aspect correct resolutions to remove?
|
||||
|
||||
// we gotta shift everything
|
||||
// due to canonicals we cant just shrink the list
|
||||
for (int k = i; k < list_size - 1; k++)
|
||||
{
|
||||
windowedModes[k] = windowedModes[k + 1];
|
||||
}
|
||||
|
||||
list_size--;
|
||||
}
|
||||
}
|
||||
|
||||
windowedModes[list_size].name[0] = '\0';
|
||||
vid_nummodes = list_size;
|
||||
|
||||
// be sure to update the video menu
|
||||
if (menuactive &&
|
||||
currentMenu == &OP_VideoModeDef)
|
||||
M_VideoModeMenu(0);
|
||||
}
|
||||
|
||||
// return number of fullscreen + X11 modes
|
||||
INT32 VID_NumModes(void)
|
||||
{
|
||||
if (USE_FULLSCREEN && numVidModes != -1)
|
||||
return numVidModes - firstEntry;
|
||||
else
|
||||
return MAXWINMODES;
|
||||
return vid_nummodes;
|
||||
}
|
||||
|
||||
const char *VID_GetModeName(INT32 modeNum)
|
||||
@@ -1521,42 +1703,34 @@ const char *VID_GetModeName(INT32 modeNum)
|
||||
return fallback_resolution_name;
|
||||
}
|
||||
|
||||
if (modeNum > MAXWINMODES)
|
||||
if (modeNum > vid_nummodes)
|
||||
return NULL;
|
||||
|
||||
sprintf(&vidModeName[modeNum][0], "%dx%d",
|
||||
windowedModes[modeNum][0],
|
||||
windowedModes[modeNum][1]);
|
||||
|
||||
return &vidModeName[modeNum][0];
|
||||
return windowedModes[modeNum].name;
|
||||
}
|
||||
|
||||
INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAXWINMODES; i++)
|
||||
for (i = 0; i < vid_nummodes; i++)
|
||||
{
|
||||
if (windowedModes[i][0] == w && windowedModes[i][1] == h)
|
||||
if (windowedModes[i].w == w && windowedModes[i].h == h)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
// did not find mode from list, make custom resolution if the values somewhat make sense
|
||||
// opengl mode does not mind about max resolution defined in screen.h
|
||||
// if not using opengl, check against the maximum as well
|
||||
if ((w >= BASEVIDWIDTH && h >= BASEVIDHEIGHT) &&
|
||||
(rendermode == render_opengl || (w <= MAXVIDWIDTH && h <= MAXVIDHEIGHT)))
|
||||
{
|
||||
custom_width = w;
|
||||
custom_height = h;
|
||||
return CUSTOMMODENUM;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void VID_RefreshModeList(void)
|
||||
{
|
||||
// check if we even need to rebuild the list
|
||||
if (IsCustomResolutionInList(vid_nummodes) == 0)
|
||||
I_FillScreenResolutionsList(true);
|
||||
}
|
||||
|
||||
void VID_PrepareModeList(void)
|
||||
{
|
||||
// Under SDL2, we just use the windowed modes list, and scale in windowed fullscreen.
|
||||
@@ -1588,17 +1762,10 @@ INT32 VID_SetMode(INT32 modeNum)
|
||||
{
|
||||
vid.recalc = true;
|
||||
|
||||
if (modeNum >= 0 && modeNum < MAXWINMODES)
|
||||
if (modeNum >= 0 && modeNum < vid_nummodes)
|
||||
{
|
||||
vid.width = windowedModes[modeNum][0];
|
||||
vid.height = windowedModes[modeNum][1];
|
||||
vid.modenum = modeNum;
|
||||
}
|
||||
else if (modeNum == CUSTOMMODENUM && custom_width && custom_height)
|
||||
{
|
||||
// at this point these values are assumed to be okay
|
||||
vid.width = custom_width;
|
||||
vid.height = custom_height;
|
||||
vid.width = windowedModes[modeNum].w;
|
||||
vid.height = windowedModes[modeNum].h;
|
||||
vid.modenum = modeNum;
|
||||
}
|
||||
else
|
||||
@@ -1631,7 +1798,6 @@ INT32 VID_SetMode(INT32 modeNum)
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
static SDL_bool Impl_CreateContext(void)
|
||||
{
|
||||
// Renderer-specific stuff
|
||||
@@ -1654,6 +1820,9 @@ static SDL_bool Impl_CreateContext(void)
|
||||
I_Error("Failed to set up GL context: %s\n", SDL_GetError());
|
||||
}
|
||||
|
||||
// be sure to fill the resolution list the moment we have a window
|
||||
I_FillScreenResolutionsList(false);
|
||||
|
||||
return SDL_TRUE;
|
||||
}
|
||||
#endif
|
||||
@@ -1695,6 +1864,9 @@ static SDL_bool Impl_CreateContext(void)
|
||||
|
||||
SDL_RenderSetLogicalSize(renderer, BASEVIDWIDTH, BASEVIDHEIGHT);
|
||||
|
||||
// be sure to fill the resolution list the moment we have a window
|
||||
I_FillScreenResolutionsList(false);
|
||||
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
@@ -1932,8 +2104,6 @@ void I_StartupGraphics(void)
|
||||
usesdl2soft = M_CheckParm("-softblit");
|
||||
borderlesswindow = M_CheckParm("-borderless");
|
||||
|
||||
VID_Command_ModeList_f();
|
||||
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
{
|
||||
@@ -1957,6 +2127,9 @@ void I_StartupGraphics(void)
|
||||
vid.height = BASEVIDHEIGHT; // BitsPerPixel is the SDL interface's
|
||||
vid.recalc = true; // Set up the console stufff
|
||||
|
||||
// be sure to print AFTER window creation
|
||||
VID_Command_ModeList_f();
|
||||
|
||||
#ifdef HAVE_TTF
|
||||
I_ShutdownTTF();
|
||||
#endif
|
||||
@@ -2028,17 +2201,17 @@ UINT32 I_GetRefreshRate(void)
|
||||
|
||||
static void Impl_SetVsync(void)
|
||||
{
|
||||
#if SDL_VERSION_ATLEAST(2,0,18)
|
||||
if (renderer)
|
||||
SDL_RenderSetVSync(renderer, cv_vidwait.value);
|
||||
#endif
|
||||
#ifdef HWRENDER
|
||||
if (!renderer && rendermode == render_opengl &&
|
||||
sdlglcontext != NULL && SDL_GL_GetCurrentContext() == sdlglcontext)
|
||||
if (rendermode == render_opengl &&
|
||||
sdlglcontext != NULL && SDL_GL_GetCurrentContext() == sdlglcontext)
|
||||
{
|
||||
SDL_GL_SetSwapInterval(cv_vidwait.value ? 1 : 0);
|
||||
}
|
||||
#endif
|
||||
#if SDL_VERSION_ATLEAST(2,0,18)
|
||||
if (renderer)
|
||||
SDL_RenderSetVSync(renderer, cv_vidwait.value);
|
||||
#endif
|
||||
}
|
||||
|
||||
void I_SetBorderlessWindow(void)
|
||||
|
||||
@@ -461,7 +461,7 @@ void *I_GetSfx(sfxinfo_t *sfx)
|
||||
gme_track_info(emu, &info, 0);
|
||||
|
||||
len = (info->play_length * 441 / 10) << 2;
|
||||
mem = Z_Malloc(len, PU_SOUND, 0);
|
||||
mem = Z_Malloc(len, PU_SOUND, NULL);
|
||||
|
||||
gme_play(emu, len >> 1, mem);
|
||||
gme_free_info(info);
|
||||
@@ -499,7 +499,7 @@ void *I_GetSfx(sfxinfo_t *sfx)
|
||||
gme_track_info(emu, &info, 0);
|
||||
|
||||
len = (info->play_length * 441 / 10) << 2;
|
||||
mem = Z_Malloc(len, PU_SOUND, 0);
|
||||
mem = Z_Malloc(len, PU_SOUND, NULL);
|
||||
|
||||
gme_play(emu, len >> 1, mem);
|
||||
gme_free_info(info);
|
||||
|
||||
+2
-38
@@ -63,25 +63,15 @@ PFNglGetString pglGetString;
|
||||
#endif
|
||||
|
||||
#ifdef USE_FBO_OGL
|
||||
|
||||
#if defined (__unix__)
|
||||
static boolean xwaylandcrap = false;
|
||||
#endif
|
||||
|
||||
boolean UseScreenFBO(void)
|
||||
{
|
||||
return ((supportFBO && cv_glframebuffer.value && downsample)
|
||||
#if defined (__unix__)
|
||||
|| (supportFBO && xwaylandcrap)
|
||||
#endif
|
||||
);
|
||||
return (supportFBO && cv_glframebuffer.value && downsample);
|
||||
}
|
||||
#endif
|
||||
|
||||
/** \brief SDL video display surface
|
||||
*/
|
||||
INT32 oglflags = 0;
|
||||
SDL_GLContext sdlglcontext = NULL;
|
||||
|
||||
void *GetGLFunc(const char *proc)
|
||||
{
|
||||
@@ -201,17 +191,6 @@ boolean OglSdlSurface(INT32 w, INT32 h)
|
||||
supportNPO2tex = true;
|
||||
|
||||
glanisotropicmode_cons_t[1].value = maximumAnisotropy;
|
||||
|
||||
#if defined (__unix__)
|
||||
#ifdef USE_FBO_OGL
|
||||
// TODO: delet this since nvidia fixed their shit on 575
|
||||
char videodriver[4] = {'S','D','L',0};
|
||||
if (supportFBO && strstr((const char*)gl_renderer, "NVIDIA")
|
||||
&& (*strncpy(videodriver, SDL_GetCurrentVideoDriver(), sizeof(videodriver)-1) != '\0')
|
||||
&& (strncasecmp("x11", videodriver, 4) == 0))
|
||||
xwaylandcrap = true;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
SDL_GL_SetSwapInterval(cv_vidwait.value ? 1 : 0);
|
||||
@@ -241,22 +220,14 @@ boolean OglSdlSurface(INT32 w, INT32 h)
|
||||
|
||||
\return void
|
||||
*/
|
||||
void OglSdlFinishUpdate(boolean waitvbl)
|
||||
void OglSdlFinishUpdate(SDL_Window *window)
|
||||
{
|
||||
static boolean oldwaitvbl = false;
|
||||
int sdlw, sdlh;
|
||||
|
||||
#ifdef USE_FBO_OGL
|
||||
const boolean usefbo = UseScreenFBO();
|
||||
#endif
|
||||
|
||||
if (oldwaitvbl != waitvbl)
|
||||
{
|
||||
SDL_GL_SetSwapInterval(waitvbl ? 1 : 0);
|
||||
}
|
||||
|
||||
oldwaitvbl = waitvbl;
|
||||
|
||||
SDL_GetWindowSize(window, &sdlw, &sdlh);
|
||||
HWR_MakeScreenFinalTexture();
|
||||
|
||||
@@ -289,13 +260,6 @@ void OglSdlFinishUpdate(boolean waitvbl)
|
||||
if (!I_CheckNativeRes() || WipeInAction)
|
||||
#endif
|
||||
HWR_DrawScreenFinalTexture(realwidth, realheight, false);
|
||||
|
||||
#if defined (__unix__)
|
||||
#ifdef USE_FBO_OGL
|
||||
if (loaded_config)
|
||||
xwaylandcrap = false;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif //HWRENDER
|
||||
|
||||
+1
-3
@@ -20,11 +20,9 @@
|
||||
|
||||
boolean OglSdlSurface(INT32 w, INT32 h);
|
||||
|
||||
void OglSdlFinishUpdate(boolean vidwait);
|
||||
void OglSdlFinishUpdate(SDL_Window *window);
|
||||
boolean VID_LoadOGLAPI(void);
|
||||
|
||||
extern SDL_Renderer *renderer;
|
||||
extern SDL_GLContext sdlglcontext;
|
||||
extern Uint16 realwidth;
|
||||
extern Uint16 realheight;
|
||||
|
||||
@@ -23,9 +23,6 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern SDL_bool consolevent;
|
||||
extern SDL_bool framebuffer;
|
||||
|
||||
#include "../m_fixed.h"
|
||||
|
||||
// SDL2 stub macro
|
||||
@@ -67,21 +64,6 @@ extern SDLJoyInfo_t JoyInfo[4]; //MAXSPLITSCREENPLAYERS
|
||||
#define SDL_JDEADZONE 153
|
||||
#undef SDL_JDEADZONE
|
||||
|
||||
// So we can call this from i_video event loop
|
||||
void I_ShutdownJoystick(UINT8 index);
|
||||
|
||||
// Cheat to get the device index for a game controller handle
|
||||
INT32 I_GetJoystickDeviceIndex(SDL_GameController *dev);
|
||||
|
||||
// Quick thing to make SDL_JOYDEVICEADDED events less of an abomination
|
||||
void I_UpdateJoystickDeviceIndex(UINT8 player);
|
||||
void I_UpdateJoystickDeviceIndices(UINT8 excludePlayer);
|
||||
|
||||
void I_GetConsoleEvents(void);
|
||||
|
||||
// Needed for some WIN32 functions
|
||||
extern SDL_Window *window;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
+9
-3
@@ -2992,7 +2992,9 @@ INT32 V_CreditStringWidth(const char *string)
|
||||
if (!string)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < strlen(string); i++)
|
||||
const size_t strlength = strlen(string);
|
||||
|
||||
for (i = 0; i < strlength; i++)
|
||||
{
|
||||
c = toupper(string[i]) - CRED_FONTSTART;
|
||||
if (c < 0 || c >= CRED_FONTSIZE)
|
||||
@@ -3070,7 +3072,9 @@ INT32 V_LevelNameWidth(const char *string)
|
||||
INT32 c, w = 0;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < strlen(string); i++)
|
||||
const size_t strlength = strlen(string);
|
||||
|
||||
for (i = 0; i < strlength; i++)
|
||||
{
|
||||
c = toupper(string[i]) - LT_FONTSTART;
|
||||
if (c < 0 || c >= LT_FONTSIZE || !lt_font[c])
|
||||
@@ -3089,7 +3093,9 @@ INT32 V_LevelNameHeight(const char *string)
|
||||
INT32 c, w = 0;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < strlen(string); i++)
|
||||
const size_t strlength = strlen(string);
|
||||
|
||||
for (i = 0; i < strlength; i++)
|
||||
{
|
||||
c = toupper(string[i]) - LT_FONTSTART;
|
||||
if (c < 0 || c >= LT_FONTSIZE || !lt_font[c])
|
||||
|
||||
+20
-1
@@ -1997,11 +1997,16 @@ void *W_CachePatchNameRotated(const char *name, INT32 rotationangle, INT32 tag)
|
||||
|
||||
rspr = (rotsprite_t *)W_GetCachedRotPatchPwad(WADFILENUM(num),LUMPNUM(num));
|
||||
|
||||
if (rspr == NULL)
|
||||
return W_CachePatchNum(W_GetNumForName("MISSING"), tag);
|
||||
|
||||
if (rspr->patches[idx] == NULL)
|
||||
{
|
||||
INT32 xpivot = 0, ypivot = 0;
|
||||
|
||||
ptr = (patch_t *)W_CachePatchNum(num, PU_PATCH);
|
||||
if (ptr == NULL)
|
||||
return W_CachePatchNum(W_GetNumForName("MISSING"), tag);
|
||||
|
||||
// >y pivot centered
|
||||
// >x pivot not centered
|
||||
@@ -2612,6 +2617,9 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
|
||||
|
||||
// Remember that we're assuming that the WAD will have a specific set of lumps in a specific order.
|
||||
UINT8 *wadData = (UINT8*)(W_CacheLumpNum(lumpnum, PU_LEVEL));
|
||||
if (wadData == NULL)
|
||||
I_Error("vres_GetMap: Invalid WadData!\n");
|
||||
|
||||
filelump_t *fileinfo = (filelump_t *)(wadData + LONG(((wadinfo_t *)wadData)->infotableofs));
|
||||
|
||||
i = LONG(((wadinfo_t *)wadData)->numlumps);
|
||||
@@ -2628,6 +2636,8 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
|
||||
}
|
||||
|
||||
vlumps = (virtlump_t*)(Z_Malloc(sizeof(virtlump_t)*numlumps, PU_LEVEL, NULL));
|
||||
if (vlumps == NULL)
|
||||
I_Error("vres_GetMap: Out of memory!\n");
|
||||
|
||||
// Build the lumps, skipping over empty entries.
|
||||
for (i = 0, realentry = 0; i < numlumps; realentry++)
|
||||
@@ -2663,7 +2673,11 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
|
||||
lumpnum_t lumppos = lumpnum + 1;
|
||||
for (i = LUMPNUM(lumppos); i < wadfiles[WADFILENUM(lumpnum)]->numlumps; i++, lumppos++, numlumps++)
|
||||
{
|
||||
if (memcmp(W_CheckNameForNum(lumppos), "MAP", 3) == 0 || W_LumpLength(lumppos) == 0)
|
||||
const char *name = W_CheckNameForNum(lumppos);
|
||||
if (name == NULL)
|
||||
continue;
|
||||
|
||||
if (memcmp(name, "MAP", 3) == 0 || W_LumpLength(lumppos) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -2671,10 +2685,15 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
|
||||
numlumps++;
|
||||
|
||||
vlumps = (virtlump_t*)(Z_Malloc(sizeof(virtlump_t)*numlumps, PU_LEVEL, NULL));
|
||||
if (vlumps == NULL)
|
||||
I_Error("vres_GetMap: Out of memory!\n");
|
||||
|
||||
for (i = 0; i < numlumps; i++, lumpnum++)
|
||||
{
|
||||
// Check if it is map marker. It is not always first lump sadly, so we need to expect it anywhere
|
||||
const char *name = W_CheckNameForNum(lumpnum);
|
||||
if (name == NULL)
|
||||
continue;
|
||||
|
||||
if (strlen(name) == 5 && memcmp(name, "MAP", 3) == 0)
|
||||
{
|
||||
|
||||
@@ -651,9 +651,6 @@ void Z_ChangeTag(void *ptr, INT32 tag)
|
||||
I_Error("Internal memory management error: "
|
||||
"tried to make block purgable but it has no owner");
|
||||
|
||||
// No, please, don't make my PU_STATIC patch NULL! It supposed to be always valid!
|
||||
if (block->tag < 10) return;
|
||||
|
||||
block->tag = tag;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user