Compare commits
77
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f7de828fc4 | ||
|
|
6eca90da4a | ||
|
|
9334b86f6e | ||
|
|
6022966d69 | ||
|
|
6c7db705c7 | ||
|
|
ce3d17de68 | ||
|
|
404d88a536 | ||
|
|
4f28f574bb | ||
|
|
654895dcff | ||
|
|
8af43a55c9 | ||
|
|
0d20ebb01f | ||
|
|
1c74b37026 | ||
|
|
6721f534cc | ||
|
|
bb3414d603 | ||
|
|
e13cb1ca92 | ||
|
|
a0dffd0670 | ||
|
|
9087fd8377 | ||
|
|
1aa37be676 | ||
|
|
04f63b23ff | ||
|
|
d6ed923f83 | ||
|
|
c7845118c0 | ||
|
|
ffc6adde4c | ||
|
|
3cf3c1bb99 | ||
|
|
2c170f1956 | ||
|
|
98da654e02 | ||
|
|
af84105e40 | ||
|
|
a1666704e5 | ||
|
|
7b408a33d7 | ||
|
|
9ee535066e | ||
|
|
6430150b63 | ||
|
|
16cf4ede89 | ||
|
|
efe8732188 | ||
|
|
07fc0eb03a | ||
|
|
f2b46fd148 | ||
|
|
8247133966 | ||
|
|
397fb071e5 | ||
|
|
1a9fa94cbd | ||
|
|
e8c7cc6a9b | ||
|
|
5ca3ab5966 | ||
|
|
1cf04514b3 | ||
|
|
5577ba4c7a | ||
|
|
6ff1cbf4b0 | ||
|
|
db4cd73912 | ||
|
|
1ec29c1c94 | ||
|
|
1e51365cad | ||
|
|
94026e4331 | ||
|
|
2084cdc6d5 | ||
|
|
1b22c3af19 | ||
|
|
3e327263c9 | ||
|
|
7c24d92613 | ||
|
|
3204b5c3b4 | ||
|
|
cd02242a01 | ||
|
|
00bc8bc149 | ||
|
|
f12b55f63b | ||
|
|
3e476d7658 | ||
|
|
6cbb8a36cf | ||
|
|
bf1aa47854 | ||
|
|
be423b2910 | ||
|
|
3bf3bdf641 | ||
|
|
e923777eb6 | ||
|
|
cf6eb0010e | ||
|
|
5184115216 | ||
|
|
39a46e8f79 | ||
|
|
d9712cf85e | ||
|
|
0691e2d9e2 | ||
|
|
08864e27b2 | ||
|
|
4a3c9ccfbb | ||
|
|
cedd789a27 | ||
|
|
8f91707164 | ||
|
|
37eba186f5 | ||
|
|
7eb2ad1e35 | ||
|
|
f49e57a38c | ||
|
|
265f4a50ef | ||
|
|
e83e2659a7 | ||
|
|
c680dd3222 | ||
|
|
96aaaf5261 | ||
|
|
efb29e6be5 |
No files matched your search
+3
-3
@@ -269,13 +269,13 @@ endif
|
||||
|
||||
ifdef USEASAN
|
||||
# compile with asan
|
||||
opts+=-fsanitize=address
|
||||
opts+=-O1 -fsanitize=address -fno-omit-frame-pointer -fno-common
|
||||
libs+=-fsanitize=address
|
||||
endif
|
||||
|
||||
ifdef USEUBSAN
|
||||
# compile with asan
|
||||
opts+=-fsanitize=undefined
|
||||
# compile with ubsan
|
||||
opts+=-O1 -fsanitize=undefined -fno-omit-frame-pointer
|
||||
libs+=-fsanitize=undefined
|
||||
endif
|
||||
|
||||
|
||||
+13
-12
@@ -20,7 +20,8 @@ $(foreach v,$(join $(wordlist 2,$(_n),- $(gcc_versions)),\
|
||||
CXXFLAGS+= -Wno-aggregate-return
|
||||
|
||||
# -W -Wno-unused
|
||||
WFLAGS:=-Wall -Wno-trigraphs -Wnull-dereference
|
||||
WFLAGS:=-Wall -Wnull-dereference
|
||||
#WFLAGS+=-Wno-trigraphs
|
||||
ifdef GCC152
|
||||
WFLAGS+=-Wzero-as-null-pointer-constant
|
||||
endif
|
||||
@@ -31,7 +32,7 @@ ifndef RELAXWARNINGS
|
||||
WFLAGS+=-W
|
||||
#WFLAGS+=-Wno-sign-compare
|
||||
ifndef GCC295
|
||||
WFLAGS+=-Wno-div-by-zero
|
||||
# WFLAGS+=-Wno-div-by-zero
|
||||
endif
|
||||
#WFLAGS+=-Wsystem-headers
|
||||
WFLAGS+=-Wfloat-equal
|
||||
@@ -62,7 +63,7 @@ endif
|
||||
endif
|
||||
WFLAGS+=-Wsign-compare
|
||||
ifdef GCC91
|
||||
WFLAGS+=-Wno-error=address-of-packed-member
|
||||
# WFLAGS+=-Wno-error=address-of-packed-member
|
||||
endif
|
||||
ifdef GCC45
|
||||
WFLAGS+=-Wlogical-op
|
||||
@@ -105,14 +106,14 @@ endif
|
||||
endif
|
||||
WFLAGS+=-Wformat-y2k
|
||||
ifdef GCC71
|
||||
WFLAGS+=-Wno-error=format-overflow=2
|
||||
#WFLAGS+=-Wno-error=format-overflow=2
|
||||
endif
|
||||
WFLAGS+=-Wformat-security
|
||||
ifndef GCC29
|
||||
#WFLAGS+=-Winit-self
|
||||
endif
|
||||
ifdef GCC46
|
||||
WFLAGS+=-Wno-suggest-attribute=noreturn
|
||||
#WFLAGS+=-Wno-suggest-attribute=noreturn
|
||||
endif
|
||||
|
||||
ifdef NOLDWARNING
|
||||
@@ -130,21 +131,21 @@ ifdef GCC44
|
||||
#WFLAGS+=-Wno-error=array-bounds
|
||||
endif
|
||||
ifdef GCC46
|
||||
WFLAGS+=-Wno-error=suggest-attribute=noreturn
|
||||
# WFLAGS+=-Wno-error=suggest-attribute=noreturn
|
||||
endif
|
||||
ifdef GCC54
|
||||
WFLAGS+=-Wno-logical-op -Wno-error=logical-op
|
||||
# WFLAGS+=-Wno-logical-op -Wno-error=logical-op
|
||||
endif
|
||||
ifdef GCC61
|
||||
WFLAGS+=-Wno-tautological-compare -Wno-error=tautological-compare
|
||||
# WFLAGS+=-Wno-tautological-compare -Wno-error=tautological-compare
|
||||
endif
|
||||
ifdef GCC71
|
||||
WFLAGS+=-Wimplicit-fallthrough=4
|
||||
endif
|
||||
ifdef GCC81
|
||||
WFLAGS+=-Wno-error=format-overflow
|
||||
WFLAGS+=-Wno-format-overflow
|
||||
WFLAGS+=-Wno-error=multistatement-macros
|
||||
# WFLAGS+=-Wno-error=format-overflow
|
||||
# WFLAGS+=-Wno-format-overflow
|
||||
# WFLAGS+=-Wno-error=multistatement-macros
|
||||
endif
|
||||
|
||||
ifneq (,$(filter $(CC) $(CXX),clang clang++))
|
||||
@@ -183,6 +184,6 @@ endif
|
||||
# Lua
|
||||
ifdef GCC43
|
||||
ifndef GCC44
|
||||
WFLAGS+=-Wno-logical-op
|
||||
#WFLAGS+=-Wno-logical-op
|
||||
endif
|
||||
endif
|
||||
+26
-64
@@ -638,68 +638,28 @@ INT32 CON_ShiftChar(INT32 ch)
|
||||
if (I_UseNativeKeyboard())
|
||||
return ch;
|
||||
|
||||
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
|
||||
{
|
||||
if (cv_keyboardlayout.value == 3)
|
||||
{
|
||||
if (shiftdown ^ capslock)
|
||||
ch = shiftxform[ch];
|
||||
else if (altdown & 0x2)
|
||||
ch = french_altgrxform[ch];
|
||||
else
|
||||
ch = HU_FallBackFrSpecialLetter(ch);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (shiftdown ^ capslock)
|
||||
ch = shiftxform[ch];
|
||||
}
|
||||
}
|
||||
else // if we're holding shift we should still shift non letter symbols
|
||||
{
|
||||
if (cv_keyboardlayout.value == 3)
|
||||
{
|
||||
if (shiftdown)
|
||||
ch = shiftxform[ch];
|
||||
else if (altdown & 0x2)
|
||||
ch = french_altgrxform[ch];
|
||||
else
|
||||
ch = HU_FallBackFrSpecialLetter(ch);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (shiftdown)
|
||||
ch = shiftxform[ch];
|
||||
}
|
||||
}
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
INT32 CON_ShitAndAltGrChar(INT32 ch)
|
||||
{
|
||||
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
|
||||
{
|
||||
if (shiftdown ^ capslock)
|
||||
ch = shiftxform[ch];
|
||||
}
|
||||
else // if we're holding shift we should still shift non letter symbols
|
||||
else // if we're holding shift we should still shift non letter symbols
|
||||
{
|
||||
if (shiftdown)
|
||||
ch = shiftxform[ch];
|
||||
else if (altdown & 0x2)
|
||||
else if (cv_keyboardlayout.value == 3)
|
||||
{
|
||||
ch = french_altgrxform[ch];
|
||||
}
|
||||
else
|
||||
{
|
||||
ch = HU_FallBackFrSpecialLetter(ch);
|
||||
if (altdown & 0x2)
|
||||
ch = french_altgrxform[ch];
|
||||
else
|
||||
ch = HU_FallBackFrSpecialLetter(ch);
|
||||
}
|
||||
}
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
|
||||
// Clear time of console heads up messages
|
||||
//
|
||||
void CON_ClearHUD(void)
|
||||
@@ -892,7 +852,7 @@ boolean CON_Responder(event_t *ev)
|
||||
return true;
|
||||
|
||||
// ctrl modifier -- changes behavior, adds shortcuts
|
||||
if ((cv_keyboardlayout.value != 3 && ctrldown) || (cv_keyboardlayout.value == 3 && ctrldown && !altdown))
|
||||
if (ctrldown && (cv_keyboardlayout.value != 3 || (cv_keyboardlayout.value == 3 && !altdown)))
|
||||
{
|
||||
// show all cvars/commands that match what we have inputted
|
||||
if (key == KEY_TAB)
|
||||
@@ -1222,19 +1182,10 @@ void CON_LogMessage(const char *msg)
|
||||
// Console print! Wahooo! Lots o fun!
|
||||
//
|
||||
|
||||
void CONS_Printf(const char *fmt, ...)
|
||||
static inline void CONS_PrintMsg(char *txt)
|
||||
{
|
||||
va_list argptr;
|
||||
static char *txt = NULL;
|
||||
boolean startup;
|
||||
|
||||
if (txt == NULL)
|
||||
txt = malloc(8192);
|
||||
|
||||
va_start(argptr, fmt);
|
||||
vsnprintf(txt, 8192, fmt, argptr);
|
||||
va_end(argptr);
|
||||
|
||||
// echo console prints to log file
|
||||
DEBFILE(txt);
|
||||
|
||||
@@ -1260,6 +1211,21 @@ void CONS_Printf(const char *fmt, ...)
|
||||
}
|
||||
}
|
||||
|
||||
void CONS_Printf(const char *fmt, ...)
|
||||
{
|
||||
va_list argptr;
|
||||
static char *txt = NULL;
|
||||
|
||||
if (txt == NULL)
|
||||
txt = malloc(8192);
|
||||
|
||||
va_start(argptr, fmt);
|
||||
vsnprintf(txt, 8192, fmt, argptr);
|
||||
va_end(argptr);
|
||||
|
||||
CONS_PrintMsg(txt);
|
||||
}
|
||||
|
||||
void CONS_Alert(alerttype_t level, const char *fmt, ...)
|
||||
{
|
||||
va_list argptr;
|
||||
@@ -1288,9 +1254,7 @@ void CONS_Alert(alerttype_t level, const char *fmt, ...)
|
||||
break;
|
||||
}
|
||||
|
||||
// I am lazy and I feel like just letting CONS_Printf take care of things.
|
||||
// Is that okay?
|
||||
CONS_Printf("%s", txt);
|
||||
CONS_PrintMsg(txt);
|
||||
}
|
||||
|
||||
void CONS_Debug(INT32 debugflags, const char *fmt, ...)
|
||||
@@ -1308,11 +1272,9 @@ void CONS_Debug(INT32 debugflags, const char *fmt, ...)
|
||||
vsnprintf(txt, 8192, fmt, argptr);
|
||||
va_end(argptr);
|
||||
|
||||
// Again I am lazy, oh well
|
||||
CONS_Printf("%s", txt);
|
||||
CONS_PrintMsg(txt);
|
||||
}
|
||||
|
||||
|
||||
// Print an error message, and wait for ENTER key to continue.
|
||||
// To make sure the user has seen the message
|
||||
//
|
||||
|
||||
@@ -49,7 +49,6 @@ extern UINT8 *yellowmap, *purplemap, *greenmap, *bluemap, *graymap, *redmap, *or
|
||||
extern UINT8 *consolebgmap;
|
||||
|
||||
INT32 CON_ShiftChar(INT32 ch);
|
||||
INT32 CON_ShitAndAltGrChar(INT32 ch);
|
||||
|
||||
void CON_SetupBackColormap(void);
|
||||
void CON_ClearHUD(void); // clear heads up messages
|
||||
|
||||
+389
-336
File diff suppressed because it is too large.
Load diff
+5
-3
@@ -654,15 +654,17 @@ void D_ResetTiccmds(void);
|
||||
|
||||
tic_t GetLag(INT32 node);
|
||||
|
||||
extern UINT8 hu_resynching;
|
||||
extern boolean hu_resynching;
|
||||
#ifdef SATURNPAK
|
||||
extern UINT8 hu_redownloadinggamestate;
|
||||
extern boolean hu_redownloadinggamestate;
|
||||
#endif
|
||||
extern boolean hu_stopped; // kart, true when the game is stopped for players due to a disconnecting or connecting player
|
||||
|
||||
#define SAVEGAMESIZE (768*1024)
|
||||
|
||||
typedef struct rewind_s
|
||||
{
|
||||
UINT8 savebuffer[(768*1024)];
|
||||
UINT8 savebuffer[SAVEGAMESIZE];
|
||||
tic_t leveltime;
|
||||
size_t demopos;
|
||||
|
||||
|
||||
+40
-20
@@ -130,8 +130,8 @@ static size_t startuppwadcount = 0;
|
||||
// autoloading
|
||||
static char *autoloadwadfiles[MAX_WADFILES];
|
||||
static char *autoloadwadfilespost[MAX_WADFILES];
|
||||
static size_t autoloadcount = 0;
|
||||
static size_t postloadcount = 0;
|
||||
static size_t autoloadwadcount = 0;
|
||||
static size_t postloadwadcount = 0;
|
||||
//
|
||||
|
||||
boolean devparm = false; // started game with -devparm
|
||||
@@ -1037,25 +1037,38 @@ static INT32 D_DetectFileType(const char* filename)
|
||||
}
|
||||
|
||||
// autoload that shit
|
||||
static void D_AutoloadFile(const char *file, char **filearray, size_t index)
|
||||
static void D_AutoloadFile(const char *file, char **filearray, size_t *index)
|
||||
{
|
||||
char *newfile;
|
||||
INT32 fileType = D_DetectFileType(file);
|
||||
|
||||
if (*index >= MAX_WADFILES)
|
||||
{
|
||||
CONS_Printf("D_AutoloadFile: Failed to add file %s! Too many autoloaded files\n", file);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!fileType)
|
||||
{
|
||||
CONS_Printf("D_AutoloadFile: File %s is unknown or invalid\n", file);
|
||||
return;
|
||||
}
|
||||
|
||||
if (fileType == 1)
|
||||
{
|
||||
CONS_Printf("D_AutoloadFile: File %s is a directory\n", file);
|
||||
return;
|
||||
}
|
||||
|
||||
if (fileType <= 6)
|
||||
{
|
||||
newfile = malloc(strlen(file) + 1);
|
||||
if (!newfile)
|
||||
I_Error("No more free memory to AutoloadFile %s",file);
|
||||
I_Error("D_AutoloadFile: No more free memory to autoload file %s", file);
|
||||
|
||||
strcpy(newfile, file);
|
||||
filearray[index] = newfile;
|
||||
filearray[*index] = newfile;
|
||||
(*index)++;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1098,7 +1111,7 @@ static void D_FindAddonsToAutoload(void)
|
||||
// If the file is found, run our shit
|
||||
if (!autoloadconfigfile) // nope outta here
|
||||
{
|
||||
autoloadcount = postloadcount = 0; // so D_AddAutoloadFiles can skip everything since nothings there to autoload
|
||||
autoloadwadcount = postloadwadcount = 0; // so D_AddAutoloadFiles can skip everything since nothings there to autoload
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1124,27 +1137,34 @@ static void D_FindAddonsToAutoload(void)
|
||||
if (newline)
|
||||
*newline = '\0';
|
||||
|
||||
// ok so theres still issues with players adding stuff to autoload by accident
|
||||
// sometimes this stuff contains maps
|
||||
// you can probably imagine how that goes in a netgame....
|
||||
if (W_CheckAutoLoadContainsMap(wadsToAutoload))
|
||||
{
|
||||
CONS_Printf("Autoload: file %s contains map data! skipping...", wadsToAutoload);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!postload && W_CheckPostLoadList(wadsToAutoload))
|
||||
{
|
||||
CONS_Printf("forcing postload for file %s\n", wadsToAutoload);
|
||||
CONS_Printf("Autoload: forcing postload for file %s\n", wadsToAutoload);
|
||||
postload = true;
|
||||
}
|
||||
|
||||
// LOAD IT
|
||||
if (!postload)
|
||||
{
|
||||
D_AutoloadFile(wadsToAutoload, autoloadwadfiles, autoloadcount);
|
||||
autoloadcount++;
|
||||
D_AutoloadFile(wadsToAutoload, autoloadwadfiles, &autoloadwadcount);
|
||||
}
|
||||
else
|
||||
{
|
||||
D_AutoloadFile(wadsToAutoload, autoloadwadfilespost, postloadcount);
|
||||
postloadcount++;
|
||||
D_AutoloadFile(wadsToAutoload, autoloadwadfilespost, &postloadwadcount);
|
||||
}
|
||||
}
|
||||
|
||||
autoloadwadfiles[autoloadcount] = NULL;
|
||||
autoloadwadfilespost[postloadcount] = NULL;
|
||||
autoloadwadfiles[autoloadwadcount] = NULL;
|
||||
autoloadwadfilespost[postloadwadcount] = NULL;
|
||||
|
||||
// we dont want memory leaks around here do we?
|
||||
fclose(autoloadconfigfile);
|
||||
@@ -1153,7 +1173,7 @@ static void D_FindAddonsToAutoload(void)
|
||||
static void D_AddAutoloadFiles(void)
|
||||
{
|
||||
// nothing to autoload
|
||||
if (autoloadcount == 0)
|
||||
if (autoloadwadcount == 0)
|
||||
return;
|
||||
|
||||
CONS_Printf("D_AutoloadFile(): Loading autoloaded addons...\n");
|
||||
@@ -1161,15 +1181,15 @@ static void D_AddAutoloadFiles(void)
|
||||
if (W_AddAutoloadedLocalFiles(autoloadwadfiles) == 0)
|
||||
CONS_Printf("D_AutoloadFile(): Are you sure you put in valid files or what?\n");
|
||||
|
||||
D_CleanFile(autoloadwadfiles, autoloadcount);
|
||||
D_CleanFile(autoloadwadfiles, autoloadwadcount);
|
||||
|
||||
autoloadcount = 0;
|
||||
autoloadwadcount = 0;
|
||||
}
|
||||
|
||||
void D_AddPostloadFiles(void)
|
||||
{
|
||||
// nothing to postload
|
||||
if (postloadcount == 0 || !netgame)
|
||||
if (postloadwadcount == 0 || !netgame)
|
||||
return;
|
||||
|
||||
CONS_Printf("D_AddPostloadFiles(): Loading postloaded addons...\n");
|
||||
@@ -1177,9 +1197,9 @@ void D_AddPostloadFiles(void)
|
||||
if (W_AddAutoloadedLocalFiles(autoloadwadfilespost) == 0)
|
||||
CONS_Printf("D_AddPostloadFiles(): Are you sure you put in valid files or what?\n");
|
||||
|
||||
D_CleanFile(autoloadwadfilespost, postloadcount);
|
||||
D_CleanFile(autoloadwadfilespost, postloadwadcount);
|
||||
|
||||
postloadcount = 0;
|
||||
postloadwadcount = 0;
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
@@ -1188,7 +1208,7 @@ void D_AddPostloadFiles(void)
|
||||
|
||||
static boolean AddIWAD(const char * file, const char *dir)
|
||||
{
|
||||
char * path = va(pandf, dir, file);
|
||||
char *path = va(pandf, dir, file);
|
||||
|
||||
if (FIL_ReadFileOK(path))
|
||||
{
|
||||
|
||||
+1
-5
@@ -612,12 +612,8 @@ void Net_WaitAllAckReceived(UINT32 timeout)
|
||||
|
||||
static void InitNode(node_t *node)
|
||||
{
|
||||
node->acktosend_head = node->acktosend_tail = 0;
|
||||
memset(node->acktosend, 0, sizeof(node->acktosend));
|
||||
node->firstacktosend = 0;
|
||||
memset(node, 0, sizeof(node_t));
|
||||
node->nextacknum = 1;
|
||||
node->remotefirstack = 0;
|
||||
node->flags = 0;
|
||||
}
|
||||
|
||||
static void InitAck(void)
|
||||
|
||||
+144
-482
@@ -1208,11 +1208,11 @@ static boolean AllowedPlayerNameChar(char ch)
|
||||
|
||||
static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
|
||||
{
|
||||
INT32 ix;
|
||||
size_t ix, len = strlen(name);
|
||||
|
||||
if (strlen(name) == 0 || strlen(name) > MAXPLAYERNAME)
|
||||
if (len == 0 || len > MAXPLAYERNAME)
|
||||
return false; // Empty or too long.
|
||||
if (name[0] == ' ' || name[strlen(name)-1] == ' ')
|
||||
if (name[0] == ' ' || name[len-1] == ' ')
|
||||
return false; // Starts or ends with a space.
|
||||
if (isdigit(name[0]))
|
||||
return false; // Starts with a digit.
|
||||
@@ -1226,20 +1226,19 @@ static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
|
||||
|
||||
// Also, anything over 0x80 is disallowed too, since compilers love to
|
||||
// differ on whether they're printable characters or not.
|
||||
for (ix = 0; name[ix] != '\0'; ix++)
|
||||
for (ix = 0; ix < len; ix++)
|
||||
if (!AllowedPlayerNameChar(name[ix]))
|
||||
return false;
|
||||
|
||||
// Check if a player is currently using the name, case-insensitively.
|
||||
for (ix = 0; ix < MAXPLAYERS; ix++)
|
||||
{
|
||||
if (ix != playernum && playeringame[ix]
|
||||
if (ix != (size_t)playernum && playeringame[ix]
|
||||
&& fasticmp(name, player_names[ix]))
|
||||
{
|
||||
// We shouldn't kick people out just because
|
||||
// they joined the game with the same name
|
||||
// as someone else -- modify the name instead.
|
||||
size_t len = strlen(name);
|
||||
|
||||
// Recursion!
|
||||
// Slowly strip characters off the end of the
|
||||
@@ -1458,7 +1457,9 @@ UINT8 CanChangeSkin(INT32 playernum)
|
||||
return true;
|
||||
}
|
||||
|
||||
if (players[playernum].spectator || players[playernum].playerstate == PST_DEAD || players[playernum].playerstate == PST_REBORN)
|
||||
if (players[playernum].spectator ||
|
||||
players[playernum].playerstate == PST_DEAD ||
|
||||
players[playernum].playerstate == PST_REBORN)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@@ -1492,445 +1493,144 @@ static void ForceAllSkins(INT32 forcedskin)
|
||||
}
|
||||
}
|
||||
|
||||
static INT32 snacpending = 0, snac2pending = 0, snac3pending = 0, snac4pending = 0, chmappending = 0;
|
||||
static INT32 chmappending;
|
||||
static INT32 snacpending[MAXSPLITSCREENPLAYERS];
|
||||
|
||||
// wonky compat, idk if anything uses this....
|
||||
#define playerisbot (splitplayer == 1 && botingame)
|
||||
|
||||
// name, color, or skin has changed
|
||||
//
|
||||
static void SendNameAndColor(void)
|
||||
static void SendNameAndColor(UINT8 splitplayer)
|
||||
{
|
||||
char buf[MAXPLAYERNAME+2];
|
||||
char *p;
|
||||
|
||||
p = buf;
|
||||
|
||||
// splitscreen
|
||||
if (splitscreen < splitplayer && !playerisbot)
|
||||
return;
|
||||
|
||||
const INT32 pnum = P_GetLocalPlayerNumForNum(splitplayer);
|
||||
|
||||
player_t *player = &players[pnum];
|
||||
|
||||
// TODO: make those cvars arrays
|
||||
consvar_t *playercolor, *playername, *playerskin;
|
||||
consvar_t *colorvars[] = {&cv_playercolor, &cv_playercolor2, &cv_playercolor3, &cv_playercolor4};
|
||||
consvar_t *namevars[] = {&cv_playername, &cv_playername2, &cv_playername3, &cv_playername4};
|
||||
consvar_t *skinvars[] = {&cv_skin, &cv_skin2, &cv_skin3, &cv_skin4};
|
||||
|
||||
playercolor = colorvars[splitplayer];
|
||||
playername = namevars[splitplayer];
|
||||
playerskin = skinvars[splitplayer];
|
||||
|
||||
// normal player colors
|
||||
if (G_GametypeHasTeams())
|
||||
{
|
||||
if (players[consoleplayer].ctfteam == 1 && cv_playercolor.value != skincolor_redteam)
|
||||
CV_StealthSetValue(&cv_playercolor, skincolor_redteam);
|
||||
else if (players[consoleplayer].ctfteam == 2 && cv_playercolor.value != skincolor_blueteam)
|
||||
CV_StealthSetValue(&cv_playercolor, skincolor_blueteam);
|
||||
if (player->ctfteam == 1 && playercolor->value != skincolor_redteam)
|
||||
CV_StealthSetValue(playercolor, skincolor_redteam);
|
||||
else if (player->ctfteam == 2 && playercolor->value != skincolor_blueteam)
|
||||
CV_StealthSetValue(playercolor, skincolor_blueteam);
|
||||
}
|
||||
|
||||
// never allow the color "none"
|
||||
if (!cv_playercolor.value)
|
||||
if (!playercolor->value)
|
||||
{
|
||||
if (players[consoleplayer].skincolor)
|
||||
CV_StealthSetValue(&cv_playercolor, players[consoleplayer].skincolor);
|
||||
else if (skins[players[consoleplayer].skin].prefcolor)
|
||||
CV_StealthSetValue(&cv_playercolor, skins[players[consoleplayer].skin].prefcolor);
|
||||
if (player->skincolor)
|
||||
CV_StealthSetValue(playercolor, player->skincolor);
|
||||
else if (skins[player->skin].prefcolor)
|
||||
CV_StealthSetValue(playercolor, skins[player->skin].prefcolor);
|
||||
else
|
||||
CV_StealthSet(&cv_playercolor, cv_playercolor.defaultvalue);
|
||||
CV_StealthSet(playercolor, playercolor->defaultvalue);
|
||||
}
|
||||
|
||||
if (fastcmp(cv_playername.string, player_names[consoleplayer])
|
||||
&& cv_playercolor.value == players[consoleplayer].skincolor
|
||||
&& fastcmp(cv_skin.string, skins[players[consoleplayer].skin].name))
|
||||
return;
|
||||
|
||||
// We'll handle it later if we're not playing.
|
||||
if (!Playing())
|
||||
return;
|
||||
|
||||
if (fastcmp(playername->string, player_names[pnum])
|
||||
&& playercolor->value == player->skincolor
|
||||
&& fastcmp(playerskin->string, skins[player->skin].name))
|
||||
return;
|
||||
|
||||
if (playerisbot)
|
||||
{
|
||||
players[pnum].skincolor = botcolor;
|
||||
if (players[pnum].mo)
|
||||
players[pnum].mo->color = players[pnum].skincolor;
|
||||
SetPlayerSkinByNum(pnum, botskin-1);
|
||||
return;
|
||||
}
|
||||
|
||||
// If you're not in a netgame, merely update the skin, color, and name.
|
||||
if (!netgame)
|
||||
{
|
||||
INT32 foundskin;
|
||||
|
||||
CleanupPlayerName(consoleplayer, cv_playername.zstring);
|
||||
strcpy(player_names[consoleplayer], cv_playername.zstring);
|
||||
CleanupPlayerName(pnum, playername->zstring);
|
||||
strcpy(player_names[pnum], playername->zstring);
|
||||
|
||||
players[consoleplayer].skincolor = cv_playercolor.value;
|
||||
player->skincolor = playercolor->value;
|
||||
|
||||
if (players[consoleplayer].mo)
|
||||
players[consoleplayer].mo->color = players[consoleplayer].skincolor;
|
||||
if (player->mo)
|
||||
player->mo->color = player->skincolor;
|
||||
|
||||
if ((foundskin = R_SkinAvailable(cv_skin.string)) != -1)
|
||||
if ((foundskin = R_SkinAvailable(playerskin->string)) != -1)
|
||||
{
|
||||
cv_skin.value = foundskin;
|
||||
SetPlayerSkin(consoleplayer, cv_skin.string);
|
||||
CV_StealthSet(&cv_skin, skins[cv_skin.value].name);
|
||||
playerskin->value = foundskin;
|
||||
SetPlayerSkin(pnum, playerskin->string);
|
||||
CV_StealthSet(playerskin, skins[playerskin->value].name);
|
||||
}
|
||||
else
|
||||
{
|
||||
cv_skin.value = players[consoleplayer].skin;
|
||||
CV_StealthSet(&cv_skin, skins[players[consoleplayer].skin].name);
|
||||
playerskin->value = player->skin;
|
||||
CV_StealthSet(playerskin, skins[player->skin].name);
|
||||
// will always be same as current
|
||||
SetPlayerSkin(consoleplayer, cv_skin.string);
|
||||
SetPlayerSkin(pnum, playerskin->string);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
snacpending++;
|
||||
snacpending[splitplayer]++;
|
||||
|
||||
// Don't change name if muted
|
||||
if (player_name_changes[consoleplayer] >= MAXNAMECHANGES)
|
||||
if (player_name_changes[pnum] >= MAXNAMECHANGES)
|
||||
{
|
||||
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
|
||||
CV_StealthSet(playername, player_names[pnum]);
|
||||
HU_AddChatText("\x85*You must wait to change your name again", false);
|
||||
}
|
||||
else if (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer)))
|
||||
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
|
||||
else if (cv_mute.value && !(server || IsPlayerAdmin(pnum)))
|
||||
CV_StealthSet(playername, player_names[pnum]);
|
||||
else // Cleanup name if changing it
|
||||
CleanupPlayerName(consoleplayer, cv_playername.zstring);
|
||||
CleanupPlayerName(pnum, playername->zstring);
|
||||
|
||||
// Don't change skin if the server doesn't want you to.
|
||||
if (!CanChangeSkin(consoleplayer))
|
||||
CV_StealthSet(&cv_skin, skins[players[consoleplayer].skin].name);
|
||||
if (!CanChangeSkin(pnum))
|
||||
CV_StealthSet(playerskin, skins[player->skin].name);
|
||||
|
||||
// check if player has the skin loaded (cv_skin may have
|
||||
// the name of a skin that was available in the previous game)
|
||||
cv_skin.value = R_SkinAvailable(cv_skin.string);
|
||||
if (cv_skin.value < 0)
|
||||
playerskin->value = R_SkinAvailable(playerskin->string);
|
||||
if (playerskin->value < 0)
|
||||
{
|
||||
INT32 skinnum = players[consoleplayer].skin;
|
||||
CV_StealthSet(&cv_skin, skins[skinnum].name);
|
||||
cv_skin.value = skinnum;
|
||||
INT32 skinnum = player->skin;
|
||||
CV_StealthSet(playerskin, skins[skinnum].name);
|
||||
playerskin->value = skinnum;
|
||||
}
|
||||
|
||||
// Finally write out the complete packet and send it off.
|
||||
WRITESTRINGN(p, cv_playername.zstring, MAXPLAYERNAME);
|
||||
WRITEUINT8(p, (UINT8)cv_playercolor.value);
|
||||
WRITEUINT8(p, (UINT8)cv_skin.value);
|
||||
SendNetXCmdForPlayer(0, XD_NAMEANDCOLOR, buf, p - buf);
|
||||
}
|
||||
|
||||
// splitscreen
|
||||
static void SendNameAndColor2(void)
|
||||
{
|
||||
INT32 secondplaya = -1;
|
||||
char buf[MAXPLAYERNAME+2];
|
||||
char *p;
|
||||
|
||||
if (splitscreen < 1 && !botingame)
|
||||
return; // can happen if skin2/color2/name2 changed
|
||||
|
||||
if (displayplayers[1] != consoleplayer)
|
||||
secondplaya = displayplayers[1];
|
||||
else if (!netgame) // HACK
|
||||
secondplaya = 1;
|
||||
|
||||
if (secondplaya == -1)
|
||||
return;
|
||||
|
||||
p = buf;
|
||||
|
||||
// normal player colors
|
||||
if (G_GametypeHasTeams())
|
||||
{
|
||||
if (players[secondplaya].ctfteam == 1 && cv_playercolor2.value != skincolor_redteam)
|
||||
CV_StealthSetValue(&cv_playercolor2, skincolor_redteam);
|
||||
else if (players[secondplaya].ctfteam == 2 && cv_playercolor2.value != skincolor_blueteam)
|
||||
CV_StealthSetValue(&cv_playercolor2, skincolor_blueteam);
|
||||
}
|
||||
|
||||
// never allow the color "none"
|
||||
if (!cv_playercolor2.value)
|
||||
{
|
||||
if (players[secondplaya].skincolor)
|
||||
CV_StealthSetValue(&cv_playercolor2, players[secondplaya].skincolor);
|
||||
else if (skins[players[secondplaya].skin].prefcolor)
|
||||
CV_StealthSetValue(&cv_playercolor2, skins[players[secondplaya].skin].prefcolor);
|
||||
else
|
||||
CV_StealthSet(&cv_playercolor2, cv_playercolor2.defaultvalue);
|
||||
}
|
||||
|
||||
// We'll handle it later if we're not playing.
|
||||
if (!Playing())
|
||||
return;
|
||||
|
||||
// If you're not in a netgame, merely update the skin, color, and name.
|
||||
if (botingame)
|
||||
{
|
||||
players[secondplaya].skincolor = botcolor;
|
||||
if (players[secondplaya].mo)
|
||||
players[secondplaya].mo->color = players[secondplaya].skincolor;
|
||||
SetPlayerSkinByNum(secondplaya, botskin-1);
|
||||
return;
|
||||
}
|
||||
else if (!netgame)
|
||||
{
|
||||
INT32 foundskin;
|
||||
|
||||
CleanupPlayerName(secondplaya, cv_playername2.zstring);
|
||||
strcpy(player_names[secondplaya], cv_playername2.zstring);
|
||||
|
||||
// don't use displayplayers[1]: the second player must be 1
|
||||
players[secondplaya].skincolor = cv_playercolor2.value;
|
||||
if (players[secondplaya].mo)
|
||||
players[secondplaya].mo->color = players[secondplaya].skincolor;
|
||||
|
||||
if ((foundskin = R_SkinAvailable(cv_skin2.string)) != -1)
|
||||
{
|
||||
cv_skin2.value = foundskin;
|
||||
SetPlayerSkin(secondplaya, cv_skin2.string);
|
||||
}
|
||||
else
|
||||
{
|
||||
cv_skin2.value = players[secondplaya].skin;
|
||||
CV_StealthSet(&cv_skin2, skins[players[secondplaya].skin].name);
|
||||
// will always be same as current
|
||||
SetPlayerSkin(secondplaya, cv_skin2.string);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
snac2pending++;
|
||||
|
||||
// Don't change name if muted
|
||||
if (player_name_changes[displayplayers[1]] >= MAXNAMECHANGES)
|
||||
{
|
||||
CV_StealthSet(&cv_playername2, player_names[displayplayers[1]]);
|
||||
HU_AddChatText("\x85*You must wait to change your name again", false);
|
||||
}
|
||||
else if (cv_mute.value && !(server || IsPlayerAdmin(displayplayers[1])))
|
||||
CV_StealthSet(&cv_playername2, player_names[displayplayers[1]]);
|
||||
else // Cleanup name if changing it
|
||||
CleanupPlayerName(displayplayers[1], cv_playername2.zstring);
|
||||
|
||||
// Don't change skin if the server doesn't want you to.
|
||||
if (!CanChangeSkin(displayplayers[1]))
|
||||
CV_StealthSet(&cv_skin2, skins[players[displayplayers[1]].skin].name);
|
||||
|
||||
// check if player has the skin loaded (cv_skin2 may have
|
||||
// the name of a skin that was available in the previous game)
|
||||
cv_skin2.value = R_SkinAvailable(cv_skin2.string);
|
||||
if (cv_skin2.value < 0)
|
||||
{
|
||||
INT32 skinnum = players[displayplayers[1]].skin;
|
||||
CV_StealthSet(&cv_skin2, skins[skinnum].name);
|
||||
cv_skin2.value = skinnum;
|
||||
}
|
||||
|
||||
// Finally write out the complete packet and send it off.
|
||||
WRITESTRINGN(p, cv_playername2.zstring, MAXPLAYERNAME);
|
||||
WRITEUINT8(p, (UINT8)cv_playercolor2.value);
|
||||
WRITEUINT8(p, (UINT8)cv_skin2.value);
|
||||
SendNetXCmdForPlayer(1, XD_NAMEANDCOLOR, buf, p - buf);
|
||||
}
|
||||
|
||||
static void SendNameAndColor3(void)
|
||||
{
|
||||
INT32 thirdplaya = -1;
|
||||
char buf[MAXPLAYERNAME+2];
|
||||
char *p;
|
||||
|
||||
if (splitscreen < 2)
|
||||
return; // can happen if skin3/color3/name3 changed
|
||||
|
||||
if (displayplayers[2] != consoleplayer)
|
||||
thirdplaya = displayplayers[2];
|
||||
else if (!netgame) // HACK
|
||||
thirdplaya = 2;
|
||||
|
||||
if (thirdplaya == -1)
|
||||
return;
|
||||
|
||||
p = buf;
|
||||
|
||||
// normal player colors
|
||||
if (G_GametypeHasTeams())
|
||||
{
|
||||
if (players[thirdplaya].ctfteam == 1 && cv_playercolor3.value != skincolor_redteam)
|
||||
CV_StealthSetValue(&cv_playercolor3, skincolor_redteam);
|
||||
else if (players[thirdplaya].ctfteam == 2 && cv_playercolor3.value != skincolor_blueteam)
|
||||
CV_StealthSetValue(&cv_playercolor3, skincolor_blueteam);
|
||||
}
|
||||
|
||||
// never allow the color "none"
|
||||
if (!cv_playercolor3.value)
|
||||
{
|
||||
if (players[thirdplaya].skincolor)
|
||||
CV_StealthSetValue(&cv_playercolor3, players[thirdplaya].skincolor);
|
||||
else if (skins[players[thirdplaya].skin].prefcolor)
|
||||
CV_StealthSetValue(&cv_playercolor3, skins[players[thirdplaya].skin].prefcolor);
|
||||
else
|
||||
CV_StealthSet(&cv_playercolor3, cv_playercolor3.defaultvalue);
|
||||
}
|
||||
|
||||
// We'll handle it later if we're not playing.
|
||||
if (!Playing())
|
||||
return;
|
||||
|
||||
// If you're not in a netgame, merely update the skin, color, and name.
|
||||
if (!netgame)
|
||||
{
|
||||
INT32 foundskin;
|
||||
|
||||
CleanupPlayerName(thirdplaya, cv_playername3.zstring);
|
||||
strcpy(player_names[thirdplaya], cv_playername3.zstring);
|
||||
|
||||
// don't use displayplayers[2]: the third player must be 2
|
||||
players[thirdplaya].skincolor = cv_playercolor3.value;
|
||||
if (players[thirdplaya].mo)
|
||||
players[thirdplaya].mo->color = players[thirdplaya].skincolor;
|
||||
|
||||
if ((foundskin = R_SkinAvailable(cv_skin3.string)) != -1)
|
||||
{
|
||||
cv_skin3.value = foundskin;
|
||||
SetPlayerSkin(thirdplaya, cv_skin3.string);
|
||||
}
|
||||
else
|
||||
{
|
||||
cv_skin3.value = players[thirdplaya].skin;
|
||||
CV_StealthSet(&cv_skin3, skins[players[thirdplaya].skin].name);
|
||||
// will always be same as current
|
||||
SetPlayerSkin(thirdplaya, cv_skin3.string);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
snac3pending++;
|
||||
|
||||
// Don't change name if muted
|
||||
if (player_name_changes[displayplayers[2]] >= MAXNAMECHANGES)
|
||||
{
|
||||
CV_StealthSet(&cv_playername3, player_names[displayplayers[2]]);
|
||||
HU_AddChatText("\x85*You must wait to change your name again", false);
|
||||
}
|
||||
else if (cv_mute.value && !(server || IsPlayerAdmin(displayplayers[2])))
|
||||
CV_StealthSet(&cv_playername3, player_names[displayplayers[2]]);
|
||||
else // Cleanup name if changing it
|
||||
CleanupPlayerName(displayplayers[2], cv_playername3.zstring);
|
||||
|
||||
// Don't change skin if the server doesn't want you to.
|
||||
if (!CanChangeSkin(displayplayers[2]))
|
||||
CV_StealthSet(&cv_skin3, skins[players[displayplayers[2]].skin].name);
|
||||
|
||||
// check if player has the skin loaded (cv_skin3 may have
|
||||
// the name of a skin that was available in the previous game)
|
||||
cv_skin3.value = R_SkinAvailable(cv_skin3.string);
|
||||
if (cv_skin3.value < 0)
|
||||
{
|
||||
INT32 skinnum = players[displayplayers[2]].skin;
|
||||
CV_StealthSet(&cv_skin3, skins[skinnum].name);
|
||||
cv_skin3.value = skinnum;
|
||||
}
|
||||
|
||||
// Finally write out the complete packet and send it off.
|
||||
WRITESTRINGN(p, cv_playername3.zstring, MAXPLAYERNAME);
|
||||
WRITEUINT8(p, (UINT8)cv_playercolor3.value);
|
||||
WRITEUINT8(p, (UINT8)cv_skin3.value);
|
||||
SendNetXCmdForPlayer(2, XD_NAMEANDCOLOR, buf, p - buf);
|
||||
}
|
||||
|
||||
static void SendNameAndColor4(void)
|
||||
{
|
||||
INT32 fourthplaya = -1;
|
||||
char buf[MAXPLAYERNAME+2];
|
||||
char *p;
|
||||
|
||||
if (splitscreen < 3)
|
||||
return; // can happen if skin4/color4/name4 changed
|
||||
|
||||
if (displayplayers[3] != consoleplayer)
|
||||
fourthplaya = displayplayers[3];
|
||||
else if (!netgame) // HACK
|
||||
fourthplaya = 3;
|
||||
|
||||
if (fourthplaya == -1)
|
||||
return;
|
||||
|
||||
p = buf;
|
||||
|
||||
// normal player colors
|
||||
if (G_GametypeHasTeams())
|
||||
{
|
||||
if (players[fourthplaya].ctfteam == 1 && cv_playercolor4.value != skincolor_redteam)
|
||||
CV_StealthSetValue(&cv_playercolor4, skincolor_redteam);
|
||||
else if (players[fourthplaya].ctfteam == 2 && cv_playercolor4.value != skincolor_blueteam)
|
||||
CV_StealthSetValue(&cv_playercolor4, skincolor_blueteam);
|
||||
}
|
||||
|
||||
// never allow the color "none"
|
||||
if (!cv_playercolor4.value)
|
||||
{
|
||||
if (players[fourthplaya].skincolor)
|
||||
CV_StealthSetValue(&cv_playercolor4, players[fourthplaya].skincolor);
|
||||
else if (skins[players[fourthplaya].skin].prefcolor)
|
||||
CV_StealthSetValue(&cv_playercolor4, skins[players[fourthplaya].skin].prefcolor);
|
||||
else
|
||||
CV_StealthSet(&cv_playercolor4, cv_playercolor4.defaultvalue);
|
||||
}
|
||||
|
||||
// We'll handle it later if we're not playing.
|
||||
if (!Playing())
|
||||
return;
|
||||
|
||||
// If you're not in a netgame, merely update the skin, color, and name.
|
||||
if (botingame)
|
||||
{
|
||||
players[fourthplaya].skincolor = botcolor;
|
||||
if (players[fourthplaya].mo)
|
||||
players[fourthplaya].mo->color = players[fourthplaya].skincolor;
|
||||
SetPlayerSkinByNum(fourthplaya, botskin-1);
|
||||
return;
|
||||
}
|
||||
else if (!netgame)
|
||||
{
|
||||
INT32 foundskin;
|
||||
|
||||
CleanupPlayerName(fourthplaya, cv_playername4.zstring);
|
||||
strcpy(player_names[fourthplaya], cv_playername4.zstring);
|
||||
|
||||
// don't use displayplayers[3]: the second player must be 4
|
||||
players[fourthplaya].skincolor = cv_playercolor4.value;
|
||||
if (players[fourthplaya].mo)
|
||||
players[fourthplaya].mo->color = players[fourthplaya].skincolor;
|
||||
|
||||
if ((foundskin = R_SkinAvailable(cv_skin4.string)) != -1)
|
||||
{
|
||||
cv_skin4.value = foundskin;
|
||||
SetPlayerSkin(fourthplaya, cv_skin4.string);
|
||||
}
|
||||
else
|
||||
{
|
||||
cv_skin4.value = players[fourthplaya].skin;
|
||||
CV_StealthSet(&cv_skin4, skins[players[fourthplaya].skin].name);
|
||||
// will always be same as current
|
||||
SetPlayerSkin(fourthplaya, cv_skin4.string);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
snac4pending++;
|
||||
|
||||
// Don't change name if muted
|
||||
if (player_name_changes[displayplayers[3]] >= MAXNAMECHANGES)
|
||||
{
|
||||
CV_StealthSet(&cv_playername4, player_names[displayplayers[3]]);
|
||||
HU_AddChatText("\x85*You must wait to change your name again", false);
|
||||
}
|
||||
else if (cv_mute.value && !(server || IsPlayerAdmin(displayplayers[3])))
|
||||
CV_StealthSet(&cv_playername4, player_names[displayplayers[3]]);
|
||||
else // Cleanup name if changing it
|
||||
CleanupPlayerName(displayplayers[3], cv_playername4.zstring);
|
||||
|
||||
// Don't change skin if the server doesn't want you to.
|
||||
if (!CanChangeSkin(displayplayers[3]))
|
||||
CV_StealthSet(&cv_skin4, skins[players[displayplayers[3]].skin].name);
|
||||
|
||||
// check if player has the skin loaded (cv_skin4 may have
|
||||
// the name of a skin that was available in the previous game)
|
||||
cv_skin4.value = R_SkinAvailable(cv_skin4.string);
|
||||
if (cv_skin4.value < 0)
|
||||
{
|
||||
INT32 skinnum = players[displayplayers[3]].skin;
|
||||
CV_StealthSet(&cv_skin4, skins[skinnum].name);
|
||||
cv_skin4.value = skinnum;
|
||||
}
|
||||
|
||||
// Finally write out the complete packet and send it off.
|
||||
WRITESTRINGN(p, cv_playername4.zstring, MAXPLAYERNAME);
|
||||
WRITEUINT8(p, (UINT8)cv_playercolor4.value);
|
||||
WRITEUINT8(p, (UINT8)cv_skin4.value);
|
||||
SendNetXCmdForPlayer(3, XD_NAMEANDCOLOR, buf, p - buf);
|
||||
WRITESTRINGN(p, playername->zstring, MAXPLAYERNAME);
|
||||
WRITEUINT8(p, (UINT8)playercolor->value);
|
||||
WRITEUINT8(p, (UINT8)playerskin->value);
|
||||
SendNetXCmdForPlayer(splitplayer, XD_NAMEANDCOLOR, buf, p - buf);
|
||||
}
|
||||
|
||||
static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
||||
{
|
||||
player_t *p = &players[playernum];
|
||||
player_t *player = &players[playernum];
|
||||
char name[MAXPLAYERNAME+1];
|
||||
UINT8 color, skin;
|
||||
|
||||
@@ -1939,19 +1639,14 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
||||
I_Error("There is no player %d!", playernum);
|
||||
#endif
|
||||
|
||||
if (playernum == consoleplayer)
|
||||
snacpending--; // TODO: make snacpending an array instead of 4 separate vars?
|
||||
else if (playernum == displayplayers[1])
|
||||
snac2pending--;
|
||||
else if (playernum == displayplayers[2])
|
||||
snac3pending--;
|
||||
else if (playernum == displayplayers[3])
|
||||
snac4pending--;
|
||||
|
||||
if (P_IsLocalPlayer(player))
|
||||
{
|
||||
snacpending[playernum]--;
|
||||
#ifdef PARANOIA
|
||||
if (snacpending < 0 || snac2pending < 0 || snac3pending < 0 || snac4pending < 0)
|
||||
I_Error("snacpending negative!");
|
||||
if (snacpending[playernum] < 0)
|
||||
I_Error("snacpending negative!");
|
||||
#endif
|
||||
}
|
||||
|
||||
READSTRINGN(*cp, name, MAXPLAYERNAME);
|
||||
color = READUINT8(*cp);
|
||||
@@ -1965,33 +1660,32 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
||||
}
|
||||
|
||||
// set color
|
||||
p->skincolor = color % MAXSKINCOLORS;
|
||||
if (p->mo)
|
||||
p->mo->color = (UINT8)p->skincolor;
|
||||
player->skincolor = color % MAXSKINCOLORS;
|
||||
if (player->mo)
|
||||
player->mo->color = (UINT8)player->skincolor;
|
||||
demo_extradata[playernum] |= DXD_COLOR;
|
||||
|
||||
// normal player colors
|
||||
if (server && (p != &players[consoleplayer] && p != &players[displayplayers[1]]
|
||||
&& p != &players[displayplayers[2]] && p != &players[displayplayers[3]]))
|
||||
if (server && !P_IsLocalPlayer(player))
|
||||
{
|
||||
boolean kick = false;
|
||||
|
||||
// team colors
|
||||
if (G_GametypeHasTeams())
|
||||
{
|
||||
if (p->ctfteam == 1 && p->skincolor != skincolor_redteam)
|
||||
if (player->ctfteam == 1 && player->skincolor != skincolor_redteam)
|
||||
kick = true;
|
||||
else if (p->ctfteam == 2 && p->skincolor != skincolor_blueteam)
|
||||
else if (player->ctfteam == 2 && player->skincolor != skincolor_blueteam)
|
||||
kick = true;
|
||||
}
|
||||
|
||||
// don't allow color "none"
|
||||
if (!p->skincolor)
|
||||
if (!player->skincolor)
|
||||
kick = true;
|
||||
|
||||
if (kick)
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Illegal color change received from %s (team: %d), color: %d)\n"), player_names[playernum], p->ctfteam, p->skincolor);
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Illegal color change received from %s (team: %d), color: %d)\n"), player_names[playernum], player->ctfteam, player->skincolor);
|
||||
SendKick(playernum, KICK_MSG_CON_FAIL);
|
||||
return;
|
||||
}
|
||||
@@ -2003,6 +1697,7 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
||||
const INT32 forcedskin = cv_forceskin.value;
|
||||
SetPlayerSkinByNum(playernum, forcedskin);
|
||||
|
||||
// TODO: make cv_skin an array
|
||||
if (playernum == consoleplayer)
|
||||
CV_StealthSet(&cv_skin, skins[forcedskin].name);
|
||||
else if (playernum == displayplayers[1])
|
||||
@@ -2016,44 +1711,16 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
||||
SetPlayerSkinByNum(playernum, skin);
|
||||
}
|
||||
|
||||
void SendWeaponPref(void)
|
||||
void SendWeaponPref(UINT8 splitplayer)
|
||||
{
|
||||
UINT8 buf[1];
|
||||
|
||||
buf[0] = 0;
|
||||
if (cv_flipcam[0].value)
|
||||
|
||||
if (cv_flipcam[splitplayer].value)
|
||||
buf[0] |= 1;
|
||||
SendNetXCmdForPlayer(0, XD_WEAPONPREF, buf, 1);
|
||||
}
|
||||
|
||||
void SendWeaponPref2(void)
|
||||
{
|
||||
UINT8 buf[1];
|
||||
|
||||
buf[0] = 0;
|
||||
if (cv_flipcam[1].value)
|
||||
buf[0] |= 1;
|
||||
SendNetXCmdForPlayer(1, XD_WEAPONPREF, buf, 1);
|
||||
}
|
||||
|
||||
void SendWeaponPref3(void)
|
||||
{
|
||||
UINT8 buf[1];
|
||||
|
||||
buf[0] = 0;
|
||||
if (cv_flipcam[2].value)
|
||||
buf[0] |= 1;
|
||||
SendNetXCmdForPlayer(2, XD_WEAPONPREF, buf, 1);
|
||||
}
|
||||
|
||||
void SendWeaponPref4(void)
|
||||
{
|
||||
UINT8 buf[1];
|
||||
|
||||
buf[0] = 0;
|
||||
if (cv_flipcam[3].value)
|
||||
buf[0] |= 1;
|
||||
SendNetXCmdForPlayer(3, XD_WEAPONPREF, buf, 1);
|
||||
SendNetXCmdForPlayer(splitplayer, XD_WEAPONPREF, buf, 1);
|
||||
}
|
||||
|
||||
static void Got_WeaponPref(const UINT8 **cp, INT32 playernum)
|
||||
@@ -2069,23 +1736,10 @@ static void Got_WeaponPref(const UINT8 **cp, INT32 playernum)
|
||||
player->pflags |= PF_ANALOGMODE;
|
||||
}
|
||||
|
||||
void D_SendPlayerConfig(void)
|
||||
void D_SendPlayerConfig(UINT8 splitplayer)
|
||||
{
|
||||
SendNameAndColor();
|
||||
if (splitscreen || botingame)
|
||||
SendNameAndColor2();
|
||||
if (splitscreen > 1)
|
||||
SendNameAndColor3();
|
||||
if (splitscreen > 2)
|
||||
SendNameAndColor4();
|
||||
|
||||
SendWeaponPref();
|
||||
if (splitscreen)
|
||||
SendWeaponPref2();
|
||||
if (splitscreen > 1)
|
||||
SendWeaponPref3();
|
||||
if (splitscreen > 2)
|
||||
SendWeaponPref4();
|
||||
SendNameAndColor(splitplayer);
|
||||
SendWeaponPref(splitplayer);
|
||||
}
|
||||
|
||||
// Only works for displayplayer, sorry!
|
||||
@@ -2108,10 +1762,12 @@ INT32 D_LookupPlayer(const char *s)
|
||||
return playernum;
|
||||
}
|
||||
|
||||
const size_t len = strlen(s);
|
||||
|
||||
for (playernum = 0; playernum < MAXPLAYERS; ++playernum)
|
||||
{
|
||||
/* Match name case-insensitively: fully, or partially the start. */
|
||||
if (playeringame[playernum] && (strnicmp(player_names[playernum], s, strlen(s)) == 0))
|
||||
if (playeringame[playernum] && (strnicmp(player_names[playernum], s, len) == 0))
|
||||
{
|
||||
return playernum;
|
||||
}
|
||||
@@ -2151,13 +1807,15 @@ static void GetViewablePlayerPlaceRange(INT32 *first, INT32 *last)
|
||||
(*last) = 0;
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; ++i)
|
||||
if (G_CouldView(i))
|
||||
{
|
||||
place = players[i].kartstuff[k_position];
|
||||
if (place < (*first))
|
||||
(*first) = place;
|
||||
if (place > (*last))
|
||||
(*last) = place;
|
||||
if (G_CouldView(i))
|
||||
{
|
||||
place = players[i].kartstuff[k_position];
|
||||
if (place < (*first))
|
||||
(*first) = place;
|
||||
if (place > (*last))
|
||||
(*last) = place;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2491,7 +2149,7 @@ void D_MapChange(INT32 mapnum, INT32 newgametype, boolean pencoremode, boolean r
|
||||
displayplayers[1] = 1;
|
||||
playeringame[1] = true;
|
||||
players[1].bot = 1;
|
||||
SendNameAndColor2();
|
||||
SendNameAndColor(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5768,50 +5426,54 @@ static void ForceSkin_OnChange(void)
|
||||
}
|
||||
}
|
||||
|
||||
//Allows the player's name to be changed if cv_mute is off.
|
||||
// Allows the player's name to be changed if cv_mute is off.
|
||||
static void Name_OnChange(void)
|
||||
{
|
||||
if (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer)))
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
|
||||
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
|
||||
return;
|
||||
}
|
||||
else
|
||||
SendNameAndColor();
|
||||
|
||||
SendNameAndColor(0);
|
||||
|
||||
}
|
||||
|
||||
static void Name2_OnChange(void)
|
||||
{
|
||||
if (cv_mute.value) //Secondary player can't be admin.
|
||||
if (cv_mute.value) // Secondary player can't be admin.
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
|
||||
CV_StealthSet(&cv_playername2, player_names[displayplayers[1]]);
|
||||
return;
|
||||
}
|
||||
else
|
||||
SendNameAndColor2();
|
||||
|
||||
SendNameAndColor(1);
|
||||
}
|
||||
|
||||
static void Name3_OnChange(void)
|
||||
{
|
||||
if (cv_mute.value) //Third player can't be admin.
|
||||
if (cv_mute.value) // Third player can't be admin.
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
|
||||
CV_StealthSet(&cv_playername3, player_names[displayplayers[2]]);
|
||||
return;
|
||||
}
|
||||
else
|
||||
SendNameAndColor3();
|
||||
|
||||
SendNameAndColor(2);
|
||||
}
|
||||
|
||||
static void Name4_OnChange(void)
|
||||
{
|
||||
if (cv_mute.value) //Secondary player can't be admin.
|
||||
if (cv_mute.value) // Secondary player can't be admin.
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
|
||||
CV_StealthSet(&cv_playername4, player_names[displayplayers[3]]);
|
||||
return;
|
||||
}
|
||||
else
|
||||
SendNameAndColor4();
|
||||
|
||||
SendNameAndColor(3);
|
||||
}
|
||||
|
||||
/** Sends a skin change for the console player, unless that player is moving.
|
||||
@@ -5833,7 +5495,7 @@ static void Skin_OnChange(void)
|
||||
}
|
||||
|
||||
if (CanChangeSkin(consoleplayer) && !P_PlayerMoving(consoleplayer))
|
||||
SendNameAndColor();
|
||||
SendNameAndColor(0);
|
||||
else
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
|
||||
@@ -5854,7 +5516,7 @@ static void Skin2_OnChange(void)
|
||||
return; // do whatever you want
|
||||
|
||||
if (CanChangeSkin(displayplayers[1]) && !P_PlayerMoving(displayplayers[1]))
|
||||
SendNameAndColor2();
|
||||
SendNameAndColor(1);
|
||||
else
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
|
||||
@@ -5870,7 +5532,7 @@ static void Skin3_OnChange(void)
|
||||
return; // do whatever you want
|
||||
|
||||
if (CanChangeSkin(displayplayers[2]) && !P_PlayerMoving(displayplayers[2]))
|
||||
SendNameAndColor3();
|
||||
SendNameAndColor(2);
|
||||
else
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
|
||||
@@ -5886,7 +5548,7 @@ static void Skin4_OnChange(void)
|
||||
return; // do whatever you want
|
||||
|
||||
if (CanChangeSkin(displayplayers[3]) && !P_PlayerMoving(displayplayers[3]))
|
||||
SendNameAndColor4();
|
||||
SendNameAndColor(3);
|
||||
else
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
|
||||
@@ -5999,7 +5661,7 @@ static void Color_OnChange(void)
|
||||
if (!P_PlayerMoving(consoleplayer))
|
||||
{
|
||||
// Color change menu scrolling fix is no longer necessary
|
||||
SendNameAndColor();
|
||||
SendNameAndColor(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -6021,7 +5683,7 @@ static void Color2_OnChange(void)
|
||||
if (!P_PlayerMoving(displayplayers[1]))
|
||||
{
|
||||
// Color change menu scrolling fix is no longer necessary
|
||||
SendNameAndColor2();
|
||||
SendNameAndColor(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -6038,7 +5700,7 @@ static void Color3_OnChange(void)
|
||||
if (!P_PlayerMoving(displayplayers[2]))
|
||||
{
|
||||
// Color change menu scrolling fix is no longer necessary
|
||||
SendNameAndColor3();
|
||||
SendNameAndColor(2);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -6055,7 +5717,7 @@ static void Color4_OnChange(void)
|
||||
if (!P_PlayerMoving(displayplayers[3]))
|
||||
{
|
||||
// Color change menu scrolling fix is no longer necessary
|
||||
SendNameAndColor4();
|
||||
SendNameAndColor(3);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+2
-5
@@ -21,10 +21,7 @@ extern "C" {
|
||||
|
||||
#include "command.h"
|
||||
|
||||
void SendWeaponPref(void);
|
||||
void SendWeaponPref2(void);
|
||||
void SendWeaponPref3(void);
|
||||
void SendWeaponPref4(void);
|
||||
void SendWeaponPref(UINT8 splitplayer);
|
||||
|
||||
// console vars
|
||||
extern consvar_t cv_playername;
|
||||
@@ -295,7 +292,7 @@ typedef union {
|
||||
// add game commands, needs cleanup
|
||||
void D_RegisterServerCommands(void);
|
||||
void D_RegisterClientCommands(void);
|
||||
void D_SendPlayerConfig(void);
|
||||
void D_SendPlayerConfig(UINT8 splitplayer);
|
||||
void Command_ExitGame_f(void);
|
||||
void Command_Retry_f(void);
|
||||
void D_GameTypeChanged(INT32 lastgametype); // not a real _OnChange function anymore
|
||||
|
||||
+16
-16
@@ -960,7 +960,7 @@ void Got_Filetxpak(void)
|
||||
|| fastcmp(filename, "music.kart")
|
||||
|| fastcmp(filename, "patch.kart")
|
||||
))
|
||||
I_Error("Tried to download \"%s\"", filename);
|
||||
I_Error("Tried to download base-game file: \"%s\"", filename);
|
||||
|
||||
if (filenum >= fileneedednum)
|
||||
{
|
||||
@@ -1019,21 +1019,21 @@ void Got_Filetxpak(void)
|
||||
|
||||
switch(file->status)
|
||||
{
|
||||
case FS_NOTFOUND:
|
||||
s = "FS_NOTFOUND";
|
||||
break;
|
||||
case FS_FOUND:
|
||||
s = "FS_FOUND";
|
||||
break;
|
||||
case FS_OPEN:
|
||||
s = "FS_OPEN";
|
||||
break;
|
||||
case FS_MD5SUMBAD:
|
||||
s = "FS_MD5SUMBAD";
|
||||
break;
|
||||
default:
|
||||
s = "unknown";
|
||||
break;
|
||||
case FS_NOTFOUND:
|
||||
s = "FS_NOTFOUND";
|
||||
break;
|
||||
case FS_FOUND:
|
||||
s = "FS_FOUND";
|
||||
break;
|
||||
case FS_OPEN:
|
||||
s = "FS_OPEN";
|
||||
break;
|
||||
case FS_MD5SUMBAD:
|
||||
s = "FS_MD5SUMBAD";
|
||||
break;
|
||||
default:
|
||||
s = "unknown";
|
||||
break;
|
||||
}
|
||||
|
||||
I_Error("Received a file not requested (file id: %d, file status: %s)\n", filenum, s);
|
||||
|
||||
+46
-79
@@ -115,20 +115,25 @@ char *myfgets(char *buf, size_t bufsize, MYFILE *f)
|
||||
size_t i = 0;
|
||||
if (myfeof(f))
|
||||
return NULL;
|
||||
|
||||
// we need one byte for a null terminated string
|
||||
bufsize--;
|
||||
|
||||
while (i < bufsize && !myfeof(f))
|
||||
{
|
||||
char c = *f->curpos++;
|
||||
|
||||
if (c == '^')
|
||||
buf[i++] = myfget_color(f);
|
||||
else if (c == '\\')
|
||||
buf[i++] = myfget_hex(f);
|
||||
else if (c != '\r')
|
||||
buf[i++] = c;
|
||||
|
||||
if (c == '\n')
|
||||
break;
|
||||
}
|
||||
|
||||
buf[i] = '\0';
|
||||
|
||||
dbg_line++;
|
||||
@@ -138,25 +143,31 @@ char *myfgets(char *buf, size_t bufsize, MYFILE *f)
|
||||
static char *myhashfgets(char *buf, size_t bufsize, MYFILE *f)
|
||||
{
|
||||
size_t i = 0;
|
||||
|
||||
if (myfeof(f))
|
||||
return NULL;
|
||||
|
||||
// we need one byte for a null terminated string
|
||||
bufsize--;
|
||||
|
||||
while (i < bufsize && !myfeof(f))
|
||||
{
|
||||
char c = *f->curpos++;
|
||||
|
||||
if (c == '^')
|
||||
buf[i++] = myfget_color(f);
|
||||
else if (c == '\\')
|
||||
buf[i++] = myfget_hex(f);
|
||||
else if (c != '\r')
|
||||
buf[i++] = c;
|
||||
|
||||
if (c == '\n') // Ensure debug line is right...
|
||||
dbg_line++;
|
||||
|
||||
if (c == '#')
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
|
||||
buf[i] = '\0';
|
||||
|
||||
return buf;
|
||||
@@ -261,7 +272,6 @@ static void clear_levels(void)
|
||||
// (no need to set num to 0, we're freeing the entire header shortly)
|
||||
Z_Free(mapheaderinfo[i]->customopts);
|
||||
|
||||
P_DeleteGrades(i);
|
||||
Z_Free(mapheaderinfo[i]);
|
||||
mapheaderinfo[i] = NULL;
|
||||
}
|
||||
@@ -315,7 +325,10 @@ static void readPlayer(MYFILE *f, INT32 num)
|
||||
goto done;
|
||||
PlayerMenu[num].status = IT_CALL;
|
||||
|
||||
for (i = 0; i < MAXLINELEN-3; i++)
|
||||
// A friendly neighborhood alias for brevity's sake
|
||||
const size_t note_size = sizeof(description[num].notes);
|
||||
|
||||
for (i = 0; i < (INT32)(MAXLINELEN-note_size-3); i++)
|
||||
{
|
||||
if (s[i] == '=')
|
||||
{
|
||||
@@ -323,10 +336,12 @@ static void readPlayer(MYFILE *f, INT32 num)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (playertext)
|
||||
{
|
||||
strcpy(description[num].notes, playertext);
|
||||
strcat(description[num].notes, myhashfgets(playertext, sizeof (description[num].notes), f));
|
||||
strlcpy(description[num].notes, playertext, note_size);
|
||||
strlcat(description[num].notes,
|
||||
myhashfgets(playertext, note_size, f), note_size);
|
||||
}
|
||||
else
|
||||
strcpy(description[num].notes, "");
|
||||
@@ -335,7 +350,7 @@ static void readPlayer(MYFILE *f, INT32 num)
|
||||
// It works down here, though.
|
||||
{
|
||||
INT32 numline = 0;
|
||||
for (i = 0; (size_t)i < sizeof(description[num].notes)-1; i++)
|
||||
for (i = 0; (size_t)i < note_size-1; i++)
|
||||
{
|
||||
if (numline < 20 && description[num].notes[i] == '\n')
|
||||
numline++;
|
||||
@@ -344,6 +359,7 @@ static void readPlayer(MYFILE *f, INT32 num)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
description[num].notes[strlen(description[num].notes)-1] = '\0';
|
||||
description[num].notes[i] = '\0';
|
||||
continue;
|
||||
@@ -819,22 +835,8 @@ static void readlevelheader(MYFILE *f, INT32 num, INT32 wadnum)
|
||||
// Now go to uppercase
|
||||
strupr(word2);
|
||||
|
||||
// NiGHTS grades
|
||||
if (fastncmp(word, "GRADES", 6))
|
||||
{
|
||||
UINT8 mare = (UINT8)atoi(word + 6);
|
||||
|
||||
if (mare <= 0 || mare > 8)
|
||||
{
|
||||
deh_warning("Level header %d: unknown word '%s'", num, word);
|
||||
continue;
|
||||
}
|
||||
|
||||
P_AddGradesForMare((INT16)(num-1), mare-1, word2);
|
||||
}
|
||||
|
||||
// Strings that can be truncated
|
||||
else if (fastcmp(word, "SCRIPTNAME"))
|
||||
if (fastcmp(word, "SCRIPTNAME"))
|
||||
{
|
||||
deh_strlcpy(mapheaderinfo[num-1]->scriptname, word2,
|
||||
sizeof(mapheaderinfo[num-1]->scriptname), va("Level header %d: scriptname", num));
|
||||
@@ -846,10 +848,6 @@ static void readlevelheader(MYFILE *f, INT32 num, INT32 wadnum)
|
||||
}
|
||||
else if (fastcmp(word, "ACT"))
|
||||
{
|
||||
/*if (i >= 0 && i < 20) // 0 for no act number, TTL1 through TTL19
|
||||
mapheaderinfo[num-1]->actnum = (UINT8)i;
|
||||
else
|
||||
deh_warning("Level header %d: invalid act number %d", num, i);*/
|
||||
deh_strlcpy(mapheaderinfo[num-1]->actnum, word2,
|
||||
sizeof(mapheaderinfo[num-1]->actnum), va("Level header %d: actnum", num));
|
||||
}
|
||||
@@ -914,11 +912,7 @@ static void readlevelheader(MYFILE *f, INT32 num, INT32 wadnum)
|
||||
mapheaderinfo[num-1]->mustrack = ((UINT16)i - 1);
|
||||
else if (fastcmp(word, "MUSICPOS"))
|
||||
mapheaderinfo[num-1]->muspos = (UINT32)get_number(word2);
|
||||
else if (fastcmp(word, "MUSICINTERFADEOUT"))
|
||||
mapheaderinfo[num-1]->musinterfadeout = (UINT32)get_number(word2);
|
||||
else if (fastcmp(word, "MUSICINTER"))
|
||||
deh_strlcpy(mapheaderinfo[num-1]->musintername, word2,
|
||||
sizeof(mapheaderinfo[num-1]->musintername), va("Level header %d: intermission music", num));
|
||||
|
||||
else if (fastcmp(word, "FORCECHARACTER"))
|
||||
{
|
||||
strlcpy(mapheaderinfo[num-1]->forcecharacter, word2, SKINNAMESIZE+1);
|
||||
@@ -960,44 +954,12 @@ static void readlevelheader(MYFILE *f, INT32 num, INT32 wadnum)
|
||||
else if (fastcmp(word, "SKYBOXSCALEZ"))
|
||||
mapheaderinfo[num-1]->skybox_scalez = (INT16)i;
|
||||
|
||||
else if (fastcmp(word, "BONUSTYPE"))
|
||||
{
|
||||
if (fastcmp(word2, "NONE")) i = -1;
|
||||
else if (fastcmp(word2, "NORMAL")) i = 0;
|
||||
else if (fastcmp(word2, "BOSS")) i = 1;
|
||||
else if (fastcmp(word2, "ERZ3")) i = 2;
|
||||
|
||||
if (i >= -1 && i <= 2) // -1 for no bonus. Max is 2.
|
||||
mapheaderinfo[num-1]->bonustype = (SINT8)i;
|
||||
else
|
||||
deh_warning("Level header %d: invalid bonus type number %d", num, i);
|
||||
}
|
||||
|
||||
else if (fastcmp(word, "SAVEOVERRIDE"))
|
||||
{
|
||||
if (fastcmp(word2, "DEFAULT")) i = SAVE_DEFAULT;
|
||||
else if (fastcmp(word2, "ALWAYS")) i = SAVE_ALWAYS;
|
||||
else if (fastcmp(word2, "NEVER")) i = SAVE_NEVER;
|
||||
|
||||
if (i >= SAVE_NEVER && i <= SAVE_ALWAYS)
|
||||
mapheaderinfo[num-1]->saveoverride = (SINT8)i;
|
||||
else
|
||||
deh_warning("Level header %d: invalid save override number %d", num, i);
|
||||
}
|
||||
|
||||
else if (fastcmp(word, "LEVELFLAGS"))
|
||||
mapheaderinfo[num-1]->levelflags = get_number(word2);
|
||||
else if (fastcmp(word, "MENUFLAGS"))
|
||||
mapheaderinfo[num-1]->menuflags = get_number(word2);
|
||||
|
||||
// SRB2Kart
|
||||
/*else if (fastcmp(word, "AUTOMAP"))
|
||||
{
|
||||
if (i || word2[0] == 'T' || word2[0] == 'Y')
|
||||
mapheaderinfo[num-1]->automap = true;
|
||||
else
|
||||
mapheaderinfo[num-1]->automap = false;
|
||||
}*/
|
||||
else if (fastcmp(word, "MOBJSCALE"))
|
||||
mapheaderinfo[num-1]->mobj_scale = get_number(word2);
|
||||
else if (fastcmp(word, "LIGHTCONTRAST") || fastcmp(word, "ENCORELIGHTCONTRAST"))
|
||||
@@ -1110,6 +1072,26 @@ static void readlevelheader(MYFILE *f, INT32 num, INT32 wadnum)
|
||||
else
|
||||
mapheaderinfo[num-1]->menuflags &= ~LF2_NOVISITNEEDED;
|
||||
}
|
||||
else if (fastcmp(word, "MUSICINTERFADEOUT"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "MUSICINTER"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "BONUSTYPE"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "SAVEOVERRIDE"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastncmp(word, "GRADES", 6)) // NiGHTS grades
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else
|
||||
deh_warning("Level header %d: unknown word '%s'", num, word);
|
||||
}
|
||||
@@ -1200,7 +1182,6 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
|
||||
i = atoi(word2);
|
||||
usi = (UINT16)i;
|
||||
|
||||
|
||||
if (fastcmp(word, "NUMBEROFPICS"))
|
||||
{
|
||||
cutscenes[num]->scene[scenenum].numpics = (UINT8)i;
|
||||
@@ -1881,16 +1862,8 @@ static void reademblemdata(MYFILE *f, INT32 num)
|
||||
emblemlocations[num-1].type = ET_GLOBAL;
|
||||
else if (fastcmp(word2, "SKIN"))
|
||||
emblemlocations[num-1].type = ET_SKIN;
|
||||
/*else if (fastcmp(word2, "SCORE"))
|
||||
emblemlocations[num-1].type = ET_SCORE;*/
|
||||
else if (fastcmp(word2, "TIME"))
|
||||
emblemlocations[num-1].type = ET_TIME;
|
||||
/*else if (fastcmp(word2, "RINGS"))
|
||||
emblemlocations[num-1].type = ET_RINGS;
|
||||
else if (fastcmp(word2, "NGRADE"))
|
||||
emblemlocations[num-1].type = ET_NGRADE;
|
||||
else if (fastcmp(word2, "NTIME"))
|
||||
emblemlocations[num-1].type = ET_NTIME;*/
|
||||
else
|
||||
emblemlocations[num-1].type = (UINT8)value;
|
||||
}
|
||||
@@ -2179,14 +2152,11 @@ static void readcondition(UINT8 set, UINT32 id, char *word2)
|
||||
}
|
||||
else if ((offset=0) || fastcmp(params[0], "GAMECLEAR")
|
||||
|| (++offset && fastcmp(params[0], "ALLEMERALDS")))
|
||||
//|| (++offset && fastcmp(params[0], "ULTIMATECLEAR")))
|
||||
{
|
||||
ty = UC_GAMECLEAR + offset;
|
||||
re = (params[1]) ? atoi(params[1]) : 1;
|
||||
}
|
||||
else if ((offset=0) || fastcmp(params[0], "OVERALLTIME"))
|
||||
//|| (++offset && fastcmp(params[0], "OVERALLSCORE"))
|
||||
//|| (++offset && fastcmp(params[0], "OVERALLRINGS")))
|
||||
{
|
||||
PARAMCHECK(1);
|
||||
ty = UC_OVERALLTIME + offset;
|
||||
@@ -2195,8 +2165,6 @@ static void readcondition(UINT8 set, UINT32 id, char *word2)
|
||||
else if ((offset=0) || fastcmp(params[0], "MAPVISITED")
|
||||
|| (++offset && fastcmp(params[0], "MAPBEATEN"))
|
||||
|| (++offset && fastcmp(params[0], "MAPALLEMERALDS")))
|
||||
//|| (++offset && fastcmp(params[0], "MAPULTIMATE"))
|
||||
//|| (++offset && fastcmp(params[0], "MAPPERFECT")))
|
||||
{
|
||||
PARAMCHECK(1);
|
||||
ty = UC_MAPVISITED + offset;
|
||||
@@ -2214,8 +2182,6 @@ static void readcondition(UINT8 set, UINT32 id, char *word2)
|
||||
}
|
||||
}
|
||||
else if ((offset=0) || fastcmp(params[0], "MAPTIME"))
|
||||
//|| (++offset && fastcmp(params[0], "MAPSCORE"))
|
||||
//|| (++offset && fastcmp(params[0], "MAPRINGS")))
|
||||
{
|
||||
PARAMCHECK(2);
|
||||
ty = UC_MAPTIME + offset;
|
||||
@@ -2598,7 +2564,7 @@ static void readmaincfg(MYFILE *f)
|
||||
}
|
||||
else if (fastcmp(word, "MAXXTRALIFE"))
|
||||
{
|
||||
maxXtraLife = (UINT8)get_number(word2);
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "GAMEDATA"))
|
||||
{
|
||||
@@ -2628,6 +2594,7 @@ static void readmaincfg(MYFILE *f)
|
||||
strcatbf(savegamename, srb2home, PATHSEP);
|
||||
|
||||
refreshdirmenu |= REFRESHDIR_GAMEDATA;*/
|
||||
continue;
|
||||
}
|
||||
else if (fastcmp(word, "RESETDATA"))
|
||||
{
|
||||
|
||||
+3
-39
@@ -205,12 +205,6 @@ extern struct quake
|
||||
fixed_t radius, intensity;
|
||||
} quake;
|
||||
|
||||
// NiGHTS grades
|
||||
typedef struct
|
||||
{
|
||||
UINT32 grade[6]; // D, C, B, A, S, X (F: failed to reach any of these)
|
||||
} nightsgrades_t;
|
||||
|
||||
// Custom Lua values
|
||||
// (This is not ifdeffed so the map header structure can stay identical, just in case.)
|
||||
typedef struct
|
||||
@@ -261,28 +255,16 @@ typedef struct
|
||||
UINT8 numlaps; ///< Number of laps in circuit mode, unless overridden.
|
||||
SINT8 unlockrequired; ///< Is an unlockable required to play this level? -1 if no.
|
||||
UINT8 levelselect; ///< Is this map available in the level select? If so, which map list is it available in?
|
||||
SINT8 bonustype; ///< What type of bonus does this level have? (-1 for null.)
|
||||
SINT8 saveoverride; ///< Set how the game is allowed to save (1 for always, -1 for never, 0 is 2.1 default)
|
||||
|
||||
UINT8 levelflags; ///< LF_flags: merged eight booleans into one UINT8 for space, see below
|
||||
UINT8 menuflags; ///< LF2_flags: options that affect record attack / nights mode menus
|
||||
|
||||
// NiGHTS stuff.
|
||||
UINT8 numGradedMares; ///< Internal. For grade support.
|
||||
nightsgrades_t *grades; ///< NiGHTS grades. Allocated dynamically for space reasons. Be careful.
|
||||
|
||||
// SRB2kart
|
||||
//boolean automap; ///< Displays a level's white map outline in modified games
|
||||
fixed_t mobj_scale; ///< Replacement for TOL_ERZ3
|
||||
|
||||
mapheader_lighting_t lighting; ///< Wall and sprite lighting
|
||||
mapheader_lighting_t lighting_encore; ///< Alternative lighting for Encore mode
|
||||
boolean use_encore_lighting; ///< Whether to use separate Encore lighting
|
||||
|
||||
// Music stuff.
|
||||
UINT32 musinterfadeout; ///< Fade out level music on intermission screen in milliseconds
|
||||
char musintername[7]; ///< Intermission screen music.
|
||||
|
||||
// Lua stuff.
|
||||
// (This is not ifdeffed so the map header structure can stay identical, just in case.)
|
||||
UINT8 numCustomOptions; ///< Internal. For Lua custom value support.
|
||||
@@ -379,8 +361,6 @@ typedef struct
|
||||
{
|
||||
tic_t time; ///< Time in which the level was finished.
|
||||
tic_t lap; ///< Best lap time for this level.
|
||||
//UINT32 score; ///< Score when the level was finished.
|
||||
//UINT16 rings; ///< Rings when the level was finished.
|
||||
} recorddata_t;
|
||||
|
||||
/** Setup for one NiGHTS map.
|
||||
@@ -394,34 +374,19 @@ typedef struct
|
||||
#define GRADE_A 5
|
||||
#define GRADE_S 6
|
||||
|
||||
/*typedef struct
|
||||
{
|
||||
// 8 mares, 1 overall (0)
|
||||
UINT8 nummares;
|
||||
UINT32 score[9];
|
||||
UINT8 grade[9];
|
||||
tic_t time[9];
|
||||
} nightsdata_t;*/
|
||||
|
||||
//extern nightsdata_t *nightsrecords[NUMMAPS];
|
||||
extern recorddata_t *mainrecords[NUMMAPS];
|
||||
|
||||
// mapvisited is now a set of flags that says what we've done in the map.
|
||||
#define MV_VISITED 1
|
||||
#define MV_BEATEN 2
|
||||
#define MV_ALLEMERALDS 4
|
||||
//#define MV_ULTIMATE 8
|
||||
//#define MV_PERFECT 16
|
||||
#define MV_MAX 7 // used in gamedata check
|
||||
extern UINT8 mapvisited[NUMMAPS];
|
||||
|
||||
// Temporary holding place for nights data for the current map
|
||||
//nightsdata_t ntemprecords;
|
||||
|
||||
extern UINT32 token; ///< Number of tokens collected in a level
|
||||
extern UINT32 token; ///< Number of tokens collected in a level
|
||||
extern UINT32 tokenlist; ///< List of tokens collected
|
||||
extern INT32 tokenbits; ///< Used for setting token bits
|
||||
extern INT32 sstimer; ///< Time allotted in the special stage
|
||||
extern INT32 tokenbits; ///< Used for setting token bits
|
||||
extern INT32 sstimer; ///< Time allotted in the special stage
|
||||
extern UINT32 bluescore; ///< Blue Team Scores
|
||||
extern UINT32 redscore; ///< Red Team Scores
|
||||
|
||||
@@ -461,7 +426,6 @@ extern UINT8 introtoplay;
|
||||
extern UINT8 creditscutscene;
|
||||
|
||||
extern UINT8 use1upSound;
|
||||
extern UINT8 maxXtraLife; // Max extra lives from rings
|
||||
|
||||
extern mobj_t *hunt1, *hunt2, *hunt3; // Emerald hunt locations
|
||||
|
||||
|
||||
+5
-2
@@ -2616,7 +2616,7 @@ void G_DoPlayDemo(char *defdemoname)
|
||||
if (defdemoname == NULL)
|
||||
{
|
||||
demobuf.p = demobuf.buffer;
|
||||
pdemoname = ZZ_Alloc(1); // Easier than adding checks for this everywhere it's freed
|
||||
pdemoname = ZZ_Calloc(1); // Easier than adding checks for this everywhere it's freed
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2628,7 +2628,7 @@ void G_DoPlayDemo(char *defdemoname)
|
||||
n++;
|
||||
|
||||
pdemoname = ZZ_Alloc(strlen(n)+1);
|
||||
strcpy(pdemoname,n);
|
||||
strcpy(pdemoname, n);
|
||||
|
||||
M_SetPlaybackMenuPointer();
|
||||
|
||||
@@ -3090,6 +3090,9 @@ post_compat:
|
||||
if (cv_director.value)
|
||||
CV_SetValue(&cv_director, 0);
|
||||
|
||||
if (demo.timing)
|
||||
G_DoneLevelLoad();
|
||||
|
||||
demo.deferstart = true;
|
||||
}
|
||||
#undef SKIPERRORS
|
||||
|
||||
+1
-6
@@ -69,9 +69,6 @@ UINT8 botcolor = 0;
|
||||
|
||||
JoyType_t Joystick[MAXSPLITSCREENPLAYERS] = {};
|
||||
|
||||
// 1024 bytes is plenty for a savegame
|
||||
#define SAVEGAMESIZE (1024)
|
||||
|
||||
// SRB2kart
|
||||
char gamedatafilename[64] = "kartdata.dat";
|
||||
char timeattackfolder[64] = "kart";
|
||||
@@ -100,7 +97,6 @@ boolean savemoddata = false;
|
||||
UINT8 paused = 0;
|
||||
UINT8 modeattacking = ATTACKING_NONE;
|
||||
boolean imcontinuing = false;
|
||||
boolean runemeraldmanager = false;
|
||||
|
||||
boolean netgame = false; // only true if packets are broadcast
|
||||
boolean multiplayer = false;
|
||||
@@ -213,7 +209,6 @@ const INT32 wantedfrequency = 10*TICRATE;
|
||||
INT32 gameovertics = 15*TICRATE;
|
||||
|
||||
UINT8 use1upSound = 0;
|
||||
UINT8 maxXtraLife = 2; // Max extra lives from rings
|
||||
|
||||
UINT8 introtoplay = 0;
|
||||
UINT8 creditscutscene = 0;
|
||||
@@ -3902,7 +3897,7 @@ void G_SaveGame(UINT32 savegameslot)
|
||||
char name[VERSIONSIZE];
|
||||
size_t length;
|
||||
|
||||
save.p = save.buffer = (UINT8 *)Z_Malloc(SAVEGAMESIZE, PU_STATIC, NULL);
|
||||
save.p = save.buffer = (UINT8 *)Z_Malloc(1024, PU_STATIC, NULL); // 1024 bytes is plenty for a savegame
|
||||
if (!save.p)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n"));
|
||||
|
||||
+2422
-545
File diff suppressed because it is too large.
Load diff
@@ -110,7 +110,7 @@ typedef struct
|
||||
typedef struct
|
||||
{
|
||||
poly_t *planepoly; // the generated convex polygon
|
||||
} extrasubsector_t;
|
||||
} poly_subsector_t;
|
||||
|
||||
// Vanilla features
|
||||
//#define USE_MODEL_NEXTFRAME
|
||||
|
||||
@@ -222,7 +222,7 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
|
||||
|
||||
if (alphalevel)
|
||||
{
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff;
|
||||
|
||||
switch (alphalevel)
|
||||
@@ -385,7 +385,7 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
||||
// clip it since it is used for bunny scroll in doom I
|
||||
if (alphalevel)
|
||||
{
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff;
|
||||
|
||||
switch (alphalevel)
|
||||
@@ -490,7 +490,7 @@ void HWR_DrawFlatFill(INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatlumpnum)
|
||||
void HWR_FadeScreenMenuBack(UINT16 color, UINT8 strength)
|
||||
{
|
||||
FOutVector v[4];
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
FBITFIELD poly_flags = PF_NoTexture|PF_Modulated|PF_NoDepthTest;
|
||||
|
||||
v[0].x = v[3].x = -1.0f;
|
||||
@@ -543,7 +543,7 @@ void HWR_FadeScreenMenuBack(UINT16 color, UINT8 strength)
|
||||
void HWR_DrawConsoleBack(UINT32 color, INT32 height)
|
||||
{
|
||||
FOutVector v[4];
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
|
||||
// setup some neat-o translucency effect
|
||||
if (!height) //cool hack 0 height is full height
|
||||
@@ -598,7 +598,7 @@ void HWR_drawAMline(const fline_t *fl, INT32 color)
|
||||
void HWR_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 color)
|
||||
{
|
||||
FOutVector v[4];
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
float fx, fy, fw, fh, fwait = 0;
|
||||
RGBA_t *palette;
|
||||
|
||||
@@ -702,7 +702,7 @@ void HWR_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 color)
|
||||
void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32 options)
|
||||
{
|
||||
FOutVector v[4];
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
float fx, fy, fw, fh;
|
||||
|
||||
if (w < 0 || h < 0)
|
||||
@@ -820,7 +820,7 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32
|
||||
void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
|
||||
{
|
||||
FOutVector v[4];
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
float fx, fy, fw, fh;
|
||||
|
||||
if (w < 0 || h < 0)
|
||||
|
||||
@@ -52,12 +52,12 @@ void HWR_ObjectLightLevelPost(gl_vissprite_t *spr, const sector_t *sector, INT32
|
||||
// --------
|
||||
// hw_bsp.c
|
||||
// --------
|
||||
extern extrasubsector_t *extrasubsectors;
|
||||
extern poly_subsector_t *poly_subsectors;
|
||||
#ifdef PARANOIA
|
||||
extern size_t addsubsector;
|
||||
extern size_t num_poly_subsector;
|
||||
#endif
|
||||
|
||||
void HWR_FreeExtraSubsectors(void);
|
||||
void HWR_InitPolyPool(void);
|
||||
void HWR_FreePolyPool(void);
|
||||
|
||||
// --------
|
||||
// hw_cache.c
|
||||
|
||||
+50
-40
@@ -125,7 +125,7 @@ ps_metric_t ps_hw_batchdrawtime = {};
|
||||
static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, boolean noencore, FSurfaceInfo* Surf, INT32 cutflag, ffloor_t *pfloor, FBITFIELD polyflags);
|
||||
static void HWR_RenderWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, FBITFIELD blend, boolean fogwall, INT32 lightlevel, extracolormap_t *wallcolormap);
|
||||
|
||||
static void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap);
|
||||
static void HWR_AddTransparentFloor(lumpnum_t lumpnum, poly_subsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap);
|
||||
static void HWR_AddTransparentWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, INT32 texnum, boolean noencore, FBITFIELD blend, boolean fogwall, INT32 lightlevel, extracolormap_t *wallcolormap);
|
||||
static void HWR_AddTransparentPolyobjectFloor(lumpnum_t lumpnum, polyobj_t *polysector, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, extracolormap_t *planecolormap);
|
||||
|
||||
@@ -231,6 +231,17 @@ consvar_t cv_glanisotropicmode = {"gr_anisotropicmode", "1", CV_CALL|CV_SAVE, gl
|
||||
|
||||
consvar_t cv_glsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_glpolytile = {"gr_polytile", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
CV_PossibleValue_t grpolyshape_cons_t[] = {
|
||||
{0, "Subsector"},
|
||||
{1, "Fat"},
|
||||
{2, "Trim"},
|
||||
{3, "NotConvex"},
|
||||
{0, NULL}
|
||||
};
|
||||
consvar_t cv_glpolyshape = {"gr_polygon_shape", "Trim", CV_SAVE, grpolyshape_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_glbatching = {"gr_batching", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_glwireframe = {"gr_wireframe", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
@@ -242,7 +253,6 @@ consvar_t cv_glportals = {"gr_portals", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL,
|
||||
|
||||
consvar_t cv_glpaletterendering = {"gr_paletteshader", "Off", CV_CALL|CV_SAVE, CV_OnOff, CV_glpaletterendering_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_glpalettedepth = {"gr_palettedepth", "16 bits", CV_SAVE|CV_CALL, glpalettedepth_cons_t, CV_glpalettedepth_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_glflashpal = {"gr_flashpal", "On", CV_CALL|CV_SAVE, CV_OnOff, CV_glpaletterendering_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_gltexturedepth = {"gr_texturedepth", "32 bits", CV_CALL|CV_SAVE, gltexdepth_cons_t, CV_gltextureformat_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
@@ -549,9 +559,9 @@ static FUINT HWR_CalcSlopeLight(FUINT lightnum, pslope_t *slope, const sector_t
|
||||
|
||||
// HWR_RenderPlane
|
||||
// Render a floor or ceiling convex polygon
|
||||
static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, FBITFIELD PolyFlags, INT32 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector, UINT8 alpha, extracolormap_t *planecolormap)
|
||||
static void HWR_RenderPlane(subsector_t *subsector, poly_subsector_t *xsub, boolean isceiling, fixed_t fixedheight, FBITFIELD PolyFlags, INT32 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector, UINT8 alpha, extracolormap_t *planecolormap)
|
||||
{
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
FOutVector *v3d;
|
||||
polyvertex_t *pv;
|
||||
pslope_t *slope = NULL;
|
||||
@@ -1376,7 +1386,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
extracolormap_t *colormap = gl_frontsector->extra_colormap;
|
||||
lightnum = HWR_CalcWallLight(lightnum, gl_curline, colormap);
|
||||
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
|
||||
Surf.PolyColor.s.alpha = 255;
|
||||
|
||||
@@ -2675,7 +2685,7 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling,
|
||||
float scrollx = 0.0f, scrolly = 0.0f;
|
||||
float anglef = 0.0f, cosangf = 0.0f, sinangf = 0.0f;
|
||||
angle_t angle = 0;
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
fixed_t tempxsow, tempytow;
|
||||
size_t nrPlaneVerts;
|
||||
|
||||
@@ -2822,7 +2832,7 @@ static void HWR_AddPolyObjectPlanes(void)
|
||||
sector_t *polyobjsector;
|
||||
INT32 light = 0;
|
||||
|
||||
// Polyobject Planes need their own function for drawing because they don't have extrasubsectors by themselves
|
||||
// Polyobject Planes need their own function for drawing because they don't have poly_subsectors by themselves
|
||||
// It should be okay because polyobjects should always be convex anyway
|
||||
|
||||
for (i = 0; i < numpolys; i++)
|
||||
@@ -2842,9 +2852,8 @@ static void HWR_AddPolyObjectPlanes(void)
|
||||
light = R_GetPlaneLight(gl_frontsector, polyobjsector->floorheight, true);
|
||||
if (po_ptrs[i]->translucency > 0)
|
||||
{
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
FBITFIELD blendmode;
|
||||
memset(&Surf, 0x00, sizeof(Surf));
|
||||
blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf);
|
||||
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->floorpic].lumpnum, po_ptrs[i], false, polyobjsector->floorheight,
|
||||
(light == -1 ? gl_frontsector->lightlevel : *gl_frontsector->lightlist[light].lightlevel), Surf.PolyColor.s.alpha, polyobjsector, blendmode, (light == -1 ? gl_frontsector->extra_colormap : gl_frontsector->lightlist[light].extra_colormap));
|
||||
@@ -2865,9 +2874,8 @@ static void HWR_AddPolyObjectPlanes(void)
|
||||
light = R_GetPlaneLight(gl_frontsector, polyobjsector->ceilingheight, true);
|
||||
if (po_ptrs[i]->translucency > 0)
|
||||
{
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
FBITFIELD blendmode;
|
||||
memset(&Surf, 0x00, sizeof(Surf));
|
||||
blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf);
|
||||
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->ceilingpic].lumpnum, po_ptrs[i], true, polyobjsector->ceilingheight,
|
||||
(light == -1 ? gl_frontsector->lightlevel : *gl_frontsector->lightlist[light].lightlevel), Surf.PolyColor.s.alpha, polyobjsector, blendmode, (light == -1 ? gl_frontsector->extra_colormap : gl_frontsector->lightlist[light].extra_colormap));
|
||||
@@ -2952,9 +2960,9 @@ static void HWR_Subsector(size_t num)
|
||||
ffloor_t *rover;
|
||||
|
||||
#ifdef PARANOIA // no risk while developing, enough debugging nights!
|
||||
if (num >= addsubsector)
|
||||
if (num >= num_poly_subsector)
|
||||
I_Error("HWR_Subsector: ss %s with numss = %s, addss = %s\n",
|
||||
sizeu1(num), sizeu2(numsubsectors), sizeu3(addsubsector));
|
||||
sizeu1(num), sizeu2(numsubsectors), sizeu3(num_poly_subsector));
|
||||
#endif
|
||||
|
||||
if (num < numsubsectors)
|
||||
@@ -3049,7 +3057,7 @@ static void HWR_Subsector(size_t num)
|
||||
if (sub->validcount != validcount)
|
||||
{
|
||||
HWR_GetFlat(levelflats[gl_frontsector->floorpic].lumpnum, R_NoEncore(gl_frontsector, false));
|
||||
HWR_RenderPlane(sub, &extrasubsectors[num], false,
|
||||
HWR_RenderPlane(sub, &poly_subsectors[num], false,
|
||||
gl_frontsector->floorheight,
|
||||
// We now return you to your regularly scheduled rendering.
|
||||
PF_Occlude, floorlightlevel, levelflats[gl_frontsector->floorpic].lumpnum, NULL, 255, floorcolormap);
|
||||
@@ -3064,7 +3072,7 @@ static void HWR_Subsector(size_t num)
|
||||
if (sub->validcount != validcount)
|
||||
{
|
||||
HWR_GetFlat(levelflats[gl_frontsector->ceilingpic].lumpnum, R_NoEncore(gl_frontsector, true));
|
||||
HWR_RenderPlane(sub, &extrasubsectors[num], true,
|
||||
HWR_RenderPlane(sub, &poly_subsectors[num], true,
|
||||
gl_frontsector->ceilingheight,
|
||||
// We now return you to your regularly scheduled rendering.
|
||||
PF_Occlude, ceilinglightlevel, levelflats[gl_frontsector->ceilingpic].lumpnum, NULL, 255, ceilingcolormap);
|
||||
@@ -3111,7 +3119,7 @@ static void HWR_Subsector(size_t num)
|
||||
alpha = HWR_FogBlockAlpha(*gl_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap);
|
||||
|
||||
HWR_AddTransparentFloor(0,
|
||||
&extrasubsectors[num],
|
||||
&poly_subsectors[num],
|
||||
false,
|
||||
*rover->bottomheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
@@ -3123,7 +3131,7 @@ static void HWR_Subsector(size_t num)
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < bottomCullHeight));
|
||||
|
||||
HWR_AddTransparentFloor(levelflats[*rover->bottompic].lumpnum,
|
||||
&extrasubsectors[num],
|
||||
&poly_subsectors[num],
|
||||
false,
|
||||
*rover->bottomheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
@@ -3135,7 +3143,7 @@ static void HWR_Subsector(size_t num)
|
||||
HWR_GetFlat(levelflats[*rover->bottompic].lumpnum, R_NoEncore(gl_frontsector, false));
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < bottomCullHeight));
|
||||
|
||||
HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->bottompic].lumpnum,
|
||||
HWR_RenderPlane(sub, &poly_subsectors[num], false, *rover->bottomheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->bottompic].lumpnum,
|
||||
rover->master->frontsector, 255, gl_frontsector->lightlist[light].extra_colormap);
|
||||
}
|
||||
}
|
||||
@@ -3157,7 +3165,7 @@ static void HWR_Subsector(size_t num)
|
||||
alpha = HWR_FogBlockAlpha(*gl_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap);
|
||||
|
||||
HWR_AddTransparentFloor(0,
|
||||
&extrasubsectors[num],
|
||||
&poly_subsectors[num],
|
||||
true,
|
||||
*rover->topheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
@@ -3169,7 +3177,7 @@ static void HWR_Subsector(size_t num)
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < topCullHeight));
|
||||
|
||||
HWR_AddTransparentFloor(levelflats[*rover->toppic].lumpnum,
|
||||
&extrasubsectors[num],
|
||||
&poly_subsectors[num],
|
||||
true,
|
||||
*rover->topheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
@@ -3181,7 +3189,7 @@ static void HWR_Subsector(size_t num)
|
||||
HWR_GetFlat(levelflats[*rover->toppic].lumpnum, R_NoEncore(gl_frontsector, true));
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < topCullHeight));
|
||||
|
||||
HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->toppic].lumpnum,
|
||||
HWR_RenderPlane(sub, &poly_subsectors[num], true, *rover->topheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->toppic].lumpnum,
|
||||
rover->master->frontsector, 255, gl_frontsector->lightlist[light].extra_colormap);
|
||||
}
|
||||
}
|
||||
@@ -3419,7 +3427,7 @@ static void HWR_DrawSpriteShadow(gl_vissprite_t *spr, patch_t *gpatch, GLPatch_t
|
||||
{
|
||||
float this_scale = 1.0f;
|
||||
FOutVector swallVerts[4];
|
||||
FSurfaceInfo sSurf;
|
||||
FSurfaceInfo sSurf = {};
|
||||
FBITFIELD blendmode = 0;
|
||||
fixed_t floorheight, mobjfloor;
|
||||
pslope_t *floorslope;
|
||||
@@ -3655,7 +3663,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite)
|
||||
FOutVector baseWallVerts[4]; // This is what the verts should end up as
|
||||
patch_t *gpatch;
|
||||
GLPatch_t *hwrpatch;
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
extracolormap_t *colormap;
|
||||
INT32 lightlevel;
|
||||
boolean lightset = true;
|
||||
@@ -3684,7 +3692,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite)
|
||||
//Hurdler: 25/04/2000: now support colormap in hardware mode
|
||||
HWR_GetMappedPatch(gpatch, spr->colormap);
|
||||
|
||||
hwrpatch = ((GLPatch_t *)gpatch->hardware);
|
||||
hwrpatch = static_cast<GLPatch_t *>(gpatch->hardware);
|
||||
|
||||
// Draw shadow BEFORE sprite
|
||||
if (UNLIKELY(cv_shadow.value // Shadows enabled
|
||||
@@ -3786,10 +3794,10 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite)
|
||||
{
|
||||
// make hyu´d players translucent with reducevfx, could be done better, but im lazy as crap
|
||||
if (cv_reducevfx.value && sprmo->player->kartstuff[k_hyudorotimer] > 0)
|
||||
Surf.PolyColor.s.alpha = FixedMul(FRACUNIT/2, Surf.PolyColor.s.alpha);
|
||||
Surf.PolyColor.s.alpha = static_cast<UINT8>(FixedMul(FRACUNIT/2, static_cast<fixed_t>(Surf.PolyColor.s.alpha)));
|
||||
|
||||
if (cv_playerfade.value)
|
||||
Surf.PolyColor.s.alpha = FixedMul(R_DoPlayerFade(sprmo), Surf.PolyColor.s.alpha);
|
||||
Surf.PolyColor.s.alpha = static_cast<UINT8>(FixedMul(R_DoPlayerFade(sprmo), static_cast<fixed_t>(Surf.PolyColor.s.alpha)));
|
||||
}
|
||||
|
||||
if (HWR_UseShader())
|
||||
@@ -3940,7 +3948,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
|
||||
FOutVector wallVerts[4];
|
||||
patch_t *gpatch; // sprite patch converted to hardware
|
||||
GLPatch_t *hwrpatch;
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
FBITFIELD blend = 0;
|
||||
|
||||
INT32 shader = SHADER_NONE;
|
||||
@@ -3972,7 +3980,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
|
||||
//Hurdler: 25/04/2000: now support colormap in hardware mode
|
||||
HWR_GetMappedPatch(gpatch, spr->colormap);
|
||||
|
||||
hwrpatch = ((GLPatch_t *)gpatch->hardware);
|
||||
hwrpatch = static_cast<GLPatch_t *>(gpatch->hardware);
|
||||
|
||||
// create the sprite billboard
|
||||
//
|
||||
@@ -4083,10 +4091,10 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
|
||||
{
|
||||
// make hyu´d players translucent with reducevfx, could be done better, but im lazy as crap
|
||||
if (cv_reducevfx.value && sprmo->player->kartstuff[k_hyudorotimer] > 0)
|
||||
Surf.PolyColor.s.alpha = FixedMul(FRACUNIT/2, Surf.PolyColor.s.alpha);
|
||||
Surf.PolyColor.s.alpha = static_cast<UINT8>(FixedMul(FRACUNIT/2, static_cast<fixed_t>(Surf.PolyColor.s.alpha)));
|
||||
|
||||
if (cv_playerfade.value)
|
||||
Surf.PolyColor.s.alpha = FixedMul(R_DoPlayerFade(sprmo), Surf.PolyColor.s.alpha);
|
||||
Surf.PolyColor.s.alpha = static_cast<UINT8>(FixedMul(R_DoPlayerFade(sprmo), static_cast<fixed_t>(Surf.PolyColor.s.alpha)));
|
||||
}
|
||||
|
||||
if (HWR_UseShader())
|
||||
@@ -4105,7 +4113,7 @@ static void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr)
|
||||
FOutVector wallVerts[4];
|
||||
patch_t *gpatch; // sprite patch converted to hardware
|
||||
GLPatch_t *hwrpatch;
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
|
||||
INT32 shader = SHADER_NONE;
|
||||
|
||||
@@ -4122,7 +4130,7 @@ static void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr)
|
||||
//Hurdler: 25/04/2000: now support colormap in hardware mode
|
||||
HWR_GetMappedPatch(gpatch, spr->colormap);
|
||||
|
||||
hwrpatch = ((GLPatch_t *)gpatch->hardware);
|
||||
hwrpatch = static_cast<GLPatch_t *>(gpatch->hardware);
|
||||
|
||||
// create the sprite billboard
|
||||
//
|
||||
@@ -4262,7 +4270,7 @@ typedef struct
|
||||
|
||||
typedef struct
|
||||
{
|
||||
extrasubsector_t *xsub;
|
||||
poly_subsector_t *xsub;
|
||||
boolean isceiling;
|
||||
fixed_t fixedheight;
|
||||
INT32 lightlevel;
|
||||
@@ -4346,7 +4354,7 @@ static void HWR_AddTransparentWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, I
|
||||
wallinfo->wallcolormap = wallcolormap;
|
||||
}
|
||||
|
||||
static void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap)
|
||||
static void HWR_AddTransparentFloor(lumpnum_t lumpnum, poly_subsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap)
|
||||
{
|
||||
planeinfo_t *planeinfo = static_cast<planeinfo_t*>(HWR_CreateDrawNode(DRAWNODE_PLANE));
|
||||
|
||||
@@ -4513,7 +4521,6 @@ static void HWR_RenderDrawNodes(void)
|
||||
drawnodes.clear(); // clear so our size is 0 again!
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Draw all vissprites
|
||||
// --------------------------------------------------------------------------
|
||||
@@ -4850,7 +4857,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||
flip = sprframe->flip; // Will only be 0x00 or 0xFF
|
||||
|
||||
if (papersprite && ang < ANGLE_180)
|
||||
flip ^= 0xFFFF;
|
||||
flip ^= 0xFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -5817,6 +5824,7 @@ void HWR_RenderPlayerView(void)
|
||||
|
||||
void HWR_LoadLevel(void)
|
||||
{
|
||||
HWR_FreePolyPool();
|
||||
HWR_CreatePlanePolygons((INT32)numnodes - 1);
|
||||
|
||||
// Build the sky dome
|
||||
@@ -5901,6 +5909,8 @@ void HWR_AddCommands(void)
|
||||
CV_RegisterVar(&cv_glanisotropicmode);
|
||||
|
||||
CV_RegisterVar(&cv_glsolvetjoin);
|
||||
CV_RegisterVar(&cv_glpolytile);
|
||||
CV_RegisterVar(&cv_glpolyshape);
|
||||
|
||||
CV_RegisterVar(&cv_glbatching);
|
||||
|
||||
@@ -5913,7 +5923,6 @@ void HWR_AddCommands(void)
|
||||
|
||||
CV_RegisterVar(&cv_glpaletterendering);
|
||||
CV_RegisterVar(&cv_glpalettedepth);
|
||||
CV_RegisterVar(&cv_glflashpal);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
@@ -5929,6 +5938,7 @@ void HWR_Startup(void)
|
||||
CONS_Printf("HWR_Startup()...\n");
|
||||
textureformat = patchformat = GL_TEXFMT_RGBA;
|
||||
|
||||
HWR_InitPolyPool();
|
||||
HWR_InitMapTextures();
|
||||
HWR_InitMD2();
|
||||
|
||||
@@ -6020,7 +6030,7 @@ static void COM_HWR_glinfo(void)
|
||||
void HWR_Shutdown(void)
|
||||
{
|
||||
CONS_Printf("HWR_Shutdown()\n");
|
||||
HWR_FreeExtraSubsectors();
|
||||
HWR_FreePolyPool();
|
||||
HWR_FreeMapTextures();
|
||||
GL_FlushScreenTextures();
|
||||
HWR_ClearAllTextures();
|
||||
@@ -6070,7 +6080,7 @@ static void HWR_DoPostProcessor(void)
|
||||
{
|
||||
// Armageddon Blast Flash!
|
||||
// Could this even be considered postprocessor?
|
||||
if (!HWR_PalRenderFlashpal())
|
||||
if (!HWR_ShouldUsePaletteRendering())
|
||||
{
|
||||
const player_t *player = &players[displayplayers[viewssnum]];
|
||||
|
||||
@@ -6083,7 +6093,7 @@ static void HWR_DoPostProcessor(void)
|
||||
{-4.0f, -4.0f, 4.0f, 0.0f, 0.0f}
|
||||
};
|
||||
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
|
||||
// This won't change if the flash palettes are changed unfortunately, but it works for its purpose
|
||||
if (player->flashpal == PAL_NUKE)
|
||||
|
||||
@@ -195,7 +195,7 @@ extern consvar_t cv_gllightdither;
|
||||
extern consvar_t cv_glfiltermode;
|
||||
extern consvar_t cv_glanisotropicmode;
|
||||
|
||||
extern consvar_t cv_glsolvetjoin;
|
||||
extern consvar_t cv_glsolvetjoin, cv_glpolytile, cv_glpolyshape;
|
||||
|
||||
extern consvar_t cv_glbatching;
|
||||
|
||||
@@ -208,7 +208,6 @@ extern consvar_t cv_glportals;
|
||||
|
||||
extern consvar_t cv_glpaletterendering;
|
||||
extern consvar_t cv_glpalettedepth;
|
||||
extern consvar_t cv_glflashpal;
|
||||
|
||||
FUNCINLINE static ATTRINLINE boolean HWR_UseShader(void)
|
||||
{
|
||||
@@ -220,11 +219,6 @@ FUNCINLINE static ATTRINLINE boolean HWR_ShouldUsePaletteRendering(void)
|
||||
return (cv_glpaletterendering.value && (pLocalPalette != NULL) && HWR_UseShader());
|
||||
}
|
||||
|
||||
FUNCINLINE static ATTRINLINE boolean HWR_PalRenderFlashpal(void)
|
||||
{
|
||||
return (cv_glflashpal.value && HWR_ShouldUsePaletteRendering());
|
||||
}
|
||||
|
||||
// Returns a pointer to the palette which should be used for caching textures.
|
||||
FUNCINLINE static ATTRINLINE RGBA_t *HWR_GetTexturePalette(void)
|
||||
{
|
||||
|
||||
@@ -1099,7 +1099,7 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
|
||||
INT32 frame = 0;
|
||||
INT32 nextFrame = -1;
|
||||
FTransform p;
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
|
||||
if (!cv_glmdls.value || spr->precip)
|
||||
return;
|
||||
@@ -1336,8 +1336,8 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
|
||||
if (spr->mobj->frame & FF_ANIMATE)
|
||||
{
|
||||
// set duration and tics to be the correct values for FF_ANIMATE states
|
||||
durs = (float)spr->mobj->state->var2;
|
||||
tics = (float)spr->mobj->anim_duration;
|
||||
durs = spr->mobj->state->var2;
|
||||
tics = (INT32)spr->mobj->anim_duration;
|
||||
}
|
||||
|
||||
//FIXME: this is not yet correct
|
||||
@@ -1475,7 +1475,7 @@ void HWR_Draw2DModel(md2_t *md2, INT32 x, INT32 y, INT32 skinnum, skincolors_t c
|
||||
patch_t *gpatch, *blendgpatch;
|
||||
GLPatch_t *hwrPatch = NULL, *hwrBlendPatch = NULL;
|
||||
FTransform p;
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
|
||||
if (!md2->model)
|
||||
{
|
||||
@@ -1526,7 +1526,6 @@ void HWR_Draw2DModel(md2_t *md2, INT32 x, INT32 y, INT32 skinnum, skincolors_t c
|
||||
if (blendgpatch)
|
||||
hwrBlendPatch = ((GLPatch_t *)blendgpatch->hardware);
|
||||
|
||||
memset(&Surf, 0x00, sizeof(FSurfaceInfo));
|
||||
Surf.PolyColor.rgba = 0xFFFFFFFF;
|
||||
Surf.PolyFlags = PF_Occlude | PF_Modulated;
|
||||
|
||||
|
||||
+67
-61
@@ -97,7 +97,6 @@ static textinput_t w_chat;
|
||||
static boolean headsupactive = false;
|
||||
boolean hu_showscores = false; // draw rankings
|
||||
static char hu_tick;
|
||||
static tic_t hu_emoteanim = 0;
|
||||
emote_autocomplete_t emote_autocomplete = {0};
|
||||
|
||||
static huddrawlist_h luahuddrawlist_scores = NULL;
|
||||
@@ -907,7 +906,7 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
|
||||
target = READSINT8(*p);
|
||||
flags = READUINT8(*p);
|
||||
msg = buf;
|
||||
READSTRINGL(*p, msg, HU_MAXMSGLEN + 1);
|
||||
READSTRINGN(*p, msg, HU_MAXMSGLEN + 1);
|
||||
|
||||
if ((cv_mute.value || flags & (HU_CSAY|HU_SERVER_SAY)) && playernum != serverplayer && !(IsPlayerAdmin(playernum)))
|
||||
{
|
||||
@@ -1095,7 +1094,6 @@ void HU_Ticker(void)
|
||||
return;
|
||||
|
||||
hu_tick++;
|
||||
hu_emoteanim++;
|
||||
hu_tick &= 7; // currently only to blink chat input cursor
|
||||
|
||||
if (PLAYER1INPUTDOWN(gc_scores))
|
||||
@@ -1810,6 +1808,7 @@ static void HU_DrawChat(void)
|
||||
INT32 t = 0, c = 0, y = chaty - (typelines*charheight);
|
||||
UINT32 i = 0, saylen = strlen(w_chat_buf); // You learn new things everyday!
|
||||
INT32 cflag = 0;
|
||||
INT32 pm_offset = 0; // for cases when you type emote while also doing /pm
|
||||
size_t select_start = 0, select_end = 0;
|
||||
const char *ntalk = "Say: ", *ttalk = "Team: ";
|
||||
const char *talk = ntalk;
|
||||
@@ -1921,64 +1920,6 @@ static void HU_DrawChat(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (emote_autocomplete.emotestart != -1 && (emote_autocomplete.complete[0] || (w_chat.cursor - emote_autocomplete.emotestart) > 1))
|
||||
{
|
||||
emote_t *suggest;
|
||||
int skip = 0;
|
||||
|
||||
const char *complete;
|
||||
int complete_len;
|
||||
|
||||
if (emote_autocomplete.complete[0])
|
||||
{
|
||||
complete = emote_autocomplete.complete;
|
||||
complete_len = strlen(complete);
|
||||
}
|
||||
else
|
||||
{
|
||||
complete = &w_chat_buf[emote_autocomplete.emotestart];
|
||||
complete_len = w_chat.cursor - emote_autocomplete.emotestart;
|
||||
}
|
||||
|
||||
// A bit of copy-paste from /pm code :p
|
||||
INT32 suggesty = chaty - charheight - 1;
|
||||
size_t longest_suggestion_length = 0;
|
||||
|
||||
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
||||
{
|
||||
longest_suggestion_length = max(longest_suggestion_length, strlen(suggest->name));
|
||||
++skip;
|
||||
}
|
||||
|
||||
skip = 0;
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
suggesty -= BASEVIDHEIGHT/2;
|
||||
if (splitscreen > 1)
|
||||
suggesty += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
suggesty -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
||||
{
|
||||
V_DrawFillConsoleMap(chatx + boxw + 2, suggesty - (7*skip), (longest_suggestion_length+2)*4 + EMOTEWIDTH, 6, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||
|
||||
// Highlight currently suggested emote
|
||||
int hlflag = 0;
|
||||
if (skip == emote_autocomplete.skip && emote_autocomplete.complete[0])
|
||||
hlflag = V_YELLOWMAP;
|
||||
|
||||
V_DrawSmallString(chatx + boxw + 4 + EMOTEWIDTH, suggesty - (7*skip), hlflag|V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, va(":%s:", suggest->name));
|
||||
M_DrawEmote(chatx + boxw + 2, suggesty - skip*7, suggest, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||
|
||||
++skip;
|
||||
}
|
||||
}
|
||||
|
||||
// handle /pm list. It's messy, horrible and I don't care.
|
||||
if (strnicmp(w_chat_buf, "/pm", 3) == 0 && vid.width >= 400 && !teamtalk) // 320x200 unsupported kthxbai
|
||||
{
|
||||
@@ -2059,9 +2000,74 @@ static void HU_DrawChat(void)
|
||||
|
||||
if (count == 0) // no results.
|
||||
{
|
||||
pm_offset = 48 + 2;
|
||||
V_DrawFillConsoleMap(chatx + boxw + 2, p_dispy - (6*count), 48, 6, 239 | V_SNAPTOBOTTOM | V_SNAPTOLEFT); // fill it like the chat so the text doesn't become hard to read because of the hud.
|
||||
V_DrawSmallString(chatx + boxw + 4, p_dispy - (6*count), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, "NO RESULT.");
|
||||
}
|
||||
else
|
||||
{
|
||||
pm_offset = (longest_name_length+4)*4 + 2;
|
||||
}
|
||||
}
|
||||
|
||||
if (emote_autocomplete.emotestart != -1 && (emote_autocomplete.complete[0] || (w_chat.cursor - emote_autocomplete.emotestart) > 1))
|
||||
{
|
||||
emote_t *suggest;
|
||||
int skip = 0;
|
||||
|
||||
const char *complete;
|
||||
int complete_len;
|
||||
|
||||
if (emote_autocomplete.complete[0])
|
||||
{
|
||||
complete = emote_autocomplete.complete;
|
||||
complete_len = strlen(complete);
|
||||
}
|
||||
else
|
||||
{
|
||||
complete = &w_chat_buf[emote_autocomplete.emotestart];
|
||||
complete_len = w_chat.cursor - emote_autocomplete.emotestart;
|
||||
}
|
||||
|
||||
// A bit of copy-paste from /pm code :p
|
||||
INT32 suggesty = chaty - charheight - 1;
|
||||
size_t longest_suggestion_length = 0;
|
||||
|
||||
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
||||
{
|
||||
longest_suggestion_length = max(longest_suggestion_length, strlen(suggest->name));
|
||||
++skip;
|
||||
}
|
||||
|
||||
INT32 emote_suggest_boxw = (longest_suggestion_length+2)*4 + EMOTEWIDTH;
|
||||
|
||||
skip = 0;
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
suggesty -= BASEVIDHEIGHT/2;
|
||||
if (splitscreen > 1)
|
||||
suggesty += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
suggesty -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
||||
{
|
||||
V_DrawFillConsoleMap(chatx + boxw + pm_offset + 2, suggesty - (7*skip), emote_suggest_boxw, 6, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||
|
||||
// Highlight currently suggested emote
|
||||
int hlflag = 0;
|
||||
if (skip == emote_autocomplete.skip && emote_autocomplete.complete[0])
|
||||
hlflag = V_YELLOWMAP;
|
||||
|
||||
V_DrawSmallString(chatx + boxw + pm_offset + 4 + EMOTEWIDTH, suggesty - (7*skip), hlflag|V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, va(":%s:", suggest->name));
|
||||
M_DrawEmote(chatx + boxw + pm_offset + 2, suggesty - skip*7, suggest, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||
|
||||
++skip;
|
||||
}
|
||||
}
|
||||
|
||||
HU_drawChatLog(typelines - 1); // typelines is the # of lines we're typing. If there's more than 1 then the log should scroll up to give us more space.
|
||||
|
||||
+9
-7
@@ -496,8 +496,10 @@ static void cleanupnodes(void)
|
||||
|
||||
// Why can't I start at zero?
|
||||
for (j = 1; j < MAXNETNODES; j++)
|
||||
{
|
||||
if (!(nodeingame[j] || SV_SendingFile(j)))
|
||||
nodeconnected[j] = false;
|
||||
}
|
||||
}
|
||||
|
||||
static SINT8 getfreenode(void)
|
||||
@@ -507,11 +509,13 @@ static SINT8 getfreenode(void)
|
||||
cleanupnodes();
|
||||
|
||||
for (j = 0; j < MAXNETNODES; j++)
|
||||
{
|
||||
if (!nodeconnected[j])
|
||||
{
|
||||
nodeconnected[j] = true;
|
||||
return j;
|
||||
}
|
||||
}
|
||||
|
||||
/** \warning No free node? Just in case a node might not have been freed properly,
|
||||
* look if there are connected nodes that aren't in game, and forget them.
|
||||
@@ -812,7 +816,7 @@ static void SOCK_Send(void)
|
||||
static void SOCK_FreeNodenum(INT32 numnode)
|
||||
{
|
||||
// can't disconnect from self :)
|
||||
if (!numnode || numnode > MAXNETNODES)
|
||||
if (numnode <= 0 || numnode > MAXNETNODES)
|
||||
return;
|
||||
|
||||
DEBFILE(va("Free node %d (%s)\n", numnode, SOCK_GetNodeAddress(numnode)));
|
||||
@@ -1432,14 +1436,12 @@ static void SOCK_RegisterHolePunch(void)
|
||||
|
||||
static boolean SOCK_OpenSocket(void)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
memset(clientaddress, 0, sizeof (clientaddress));
|
||||
memset(clientaddress, 0, sizeof(clientaddress));
|
||||
|
||||
memset(nodeconnected, false, sizeof(nodeconnected));
|
||||
nodeconnected[0] = true; // always connected to self
|
||||
for (i = 1; i < MAXNETNODES; i++)
|
||||
nodeconnected[i] = false;
|
||||
nodeconnected[BROADCASTADDR] = true;
|
||||
|
||||
I_NetSend = SOCK_Send;
|
||||
I_NetGet = SOCK_Get;
|
||||
I_NetCloseSocket = SOCK_CloseSocket;
|
||||
@@ -1479,7 +1481,7 @@ static boolean SOCK_Ban(INT32 node)
|
||||
{
|
||||
INT32 ban;
|
||||
|
||||
if (node > MAXNETNODES)
|
||||
if (node < 0 || node > MAXNETNODES)
|
||||
return false;
|
||||
|
||||
ban = numbans;
|
||||
|
||||
+17
-2
@@ -2159,7 +2159,13 @@ static void K_GetKartBoostPower(player_t *player)
|
||||
&& player->speed > 0
|
||||
&& !player->spectator)
|
||||
{
|
||||
K_SpawnWipeoutTrail(player->mo, true);
|
||||
mobj_t *dust = K_SpawnWipeoutTrail(player->mo, true);
|
||||
|
||||
// Technically, all mobjs that think can cause desynchs if they are spawned conditionally, so best we can do
|
||||
// is to hide them if you are in saltyhop jump
|
||||
if (dust && player->mo->salty.jump)
|
||||
dust->flags2 |= MF2_DONTDRAW;
|
||||
|
||||
if (leveltime % 6 == 0)
|
||||
S_StartSound(player->mo, sfx_cdfm70);
|
||||
}
|
||||
@@ -3634,7 +3640,7 @@ void K_SpawnSparkleTrail(mobj_t *mo)
|
||||
P_SetMobjState(sparkle, S_KARTINVULN_LARGE1);
|
||||
}
|
||||
|
||||
void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
|
||||
mobj_t *K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
|
||||
{
|
||||
mobj_t *dust;
|
||||
angle_t aoff;
|
||||
@@ -3675,6 +3681,8 @@ void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
|
||||
|
||||
if (translucent)
|
||||
dust->flags2 |= MF2_SHADOW;
|
||||
|
||||
return dust;
|
||||
}
|
||||
|
||||
// K_DriftDustHandling
|
||||
@@ -6175,6 +6183,13 @@ void K_KartUpdatePosition(player_t *player)
|
||||
}
|
||||
}
|
||||
|
||||
// the player should NOT be checked against themselves! lol
|
||||
// otherwise prevcheck will effectively be halved
|
||||
// sadly this stuff is exposed to lua and atleast one script uses those so we cant fix it
|
||||
// oh well
|
||||
//if (player == &players[i])
|
||||
//continue;
|
||||
|
||||
const boolean isprevcheckpointi = mo->health == players[i].starpostnum;
|
||||
const boolean isnextcheckpointi = mo->health == (players[i].starpostnum + 1);
|
||||
|
||||
|
||||
+1
-1
@@ -57,7 +57,7 @@ boolean K_ShouldSlopeRoll(mobj_t *mobj);
|
||||
void K_RollMobjBySlopes(mobj_t *mo, pslope_t *slope);
|
||||
void K_SpawnBoostTrail(player_t *player);
|
||||
void K_SpawnSparkleTrail(mobj_t *mo);
|
||||
void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent);
|
||||
mobj_t *K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent);
|
||||
void K_DriftDustHandling(mobj_t *spawner);
|
||||
void K_PuntMine(mobj_t *mine, mobj_t *punter);
|
||||
void K_DoSneaker(player_t *player, INT32 type);
|
||||
|
||||
+7
-17
@@ -199,7 +199,7 @@ FUNCINLINE static ATTRINLINE void add_hook(hook_t *map)
|
||||
|
||||
FUNCINLINE static ATTRINLINE void add_mobj_hook(lua_State *L, int hook_type)
|
||||
{
|
||||
mobjtype_t mobj_type = luaL_optnumber(L, 3, MT_NULL);
|
||||
mobjtype_t mobj_type = luaL_optnumber(L, 3, MT_NULL);
|
||||
|
||||
luaL_argcheck(L, mobj_type < NUMMOBJTYPES, 3, "invalid mobjtype_t");
|
||||
|
||||
@@ -296,8 +296,7 @@ struct Hook_State {
|
||||
INT32 status;/* return status to calling function */
|
||||
void * userdata;
|
||||
int hook_type;
|
||||
mobjtype_t mobj_type;/* >0 if mobj hook */
|
||||
boolean force_mobj;// allows mobj_type equal 0
|
||||
mobjtype_t mobj_type;/* <NUMMOBJTYPES if mobj hook */
|
||||
const char * string;/* used to fetch table, ran first if set */
|
||||
int top;/* index of last argument passed to hook */
|
||||
int id;/* id to fetch ref */
|
||||
@@ -364,10 +363,8 @@ FUNCINLINE static ATTRINLINE boolean prepare_hook
|
||||
int default_status,
|
||||
int hook_type
|
||||
){
|
||||
hook->force_mobj = false;
|
||||
|
||||
return init_hook_type(hook, default_status,
|
||||
hook_type, 0, NULL,
|
||||
hook_type, NUMMOBJTYPES, NULL,
|
||||
hookIds[hook_type].numHooks);
|
||||
}
|
||||
|
||||
@@ -381,8 +378,6 @@ FUNCINLINE static ATTRINLINE boolean prepare_mobj_hook
|
||||
const mobjtype_t mobj_type =
|
||||
primary_mobj ? primary_mobj->type : NUMMOBJTYPES;
|
||||
|
||||
hook->force_mobj = true;
|
||||
|
||||
return init_hook_type(hook, default_status,
|
||||
hook_type, mobj_type, NULL,
|
||||
mobj_hook_available(hook_type, mobj_type));
|
||||
@@ -395,10 +390,8 @@ FUNCINLINE static ATTRINLINE boolean prepare_string_hook
|
||||
int hook_type,
|
||||
const char * string
|
||||
){
|
||||
hook->force_mobj = false;
|
||||
|
||||
if (init_hook_type(hook, default_status,
|
||||
hook_type, 0, string,
|
||||
hook_type, NUMMOBJTYPES, string,
|
||||
stringHooks[hook_type].ref))
|
||||
{
|
||||
lua_pushstring(gL, string);
|
||||
@@ -414,7 +407,7 @@ FUNCINLINE static ATTRINLINE boolean prepare_hud_hook
|
||||
int hook_type
|
||||
){
|
||||
return init_hook_type(hook, 0,
|
||||
hook_type, 0, NULL,
|
||||
hook_type, NUMMOBJTYPES, NULL,
|
||||
hudHookIds[hook_type].numHooks);
|
||||
}
|
||||
|
||||
@@ -554,14 +547,11 @@ static int call_hooks
|
||||
{
|
||||
calls += call_string_hooks(hook);
|
||||
}
|
||||
else if (hook->force_mobj)
|
||||
else if (hook->mobj_type < NUMMOBJTYPES)
|
||||
{
|
||||
/* call generic mobj hooks first */
|
||||
calls += call_mobj_type_hooks(hook, MT_NULL);
|
||||
|
||||
if (hook->mobj_type < NUMMOBJTYPES)
|
||||
calls += call_mobj_type_hooks(hook, hook->mobj_type);
|
||||
|
||||
calls += call_mobj_type_hooks(hook, hook->mobj_type);
|
||||
ps_lua_mobjhooks.value.i += calls;
|
||||
}
|
||||
else
|
||||
|
||||
+5
-10
@@ -1506,7 +1506,6 @@ enum mapheaderinfo_e
|
||||
mapheaderinfo_saveoverride,
|
||||
mapheaderinfo_levelflags,
|
||||
mapheaderinfo_menuflags,
|
||||
//mapheaderinfo_automap,
|
||||
mapheaderinfo_mobj_scale,
|
||||
};
|
||||
|
||||
@@ -1542,7 +1541,6 @@ static const char *const mapheaderinfo_opt[] = {
|
||||
"saveoverride",
|
||||
"levelflags",
|
||||
"menuflags",
|
||||
//"automap",
|
||||
"mobj_scale",
|
||||
NULL,
|
||||
};
|
||||
@@ -1584,10 +1582,11 @@ static int mapheaderinfo_get(lua_State *L)
|
||||
lua_pushinteger(L, header->muspos);
|
||||
break;
|
||||
case mapheaderinfo_musinterfadeout:
|
||||
lua_pushinteger(L, header->musinterfadeout);
|
||||
lua_pushinteger(L, 0); // unused
|
||||
break;
|
||||
case mapheaderinfo_musintername:
|
||||
lua_pushstring(L, header->musintername);
|
||||
// uhh psure its fine to just push nil instead of empty string?
|
||||
lua_pushstring(L, NULL);
|
||||
break;
|
||||
case mapheaderinfo_forcecharacter:
|
||||
lua_pushstring(L, header->forcecharacter);
|
||||
@@ -1641,10 +1640,10 @@ static int mapheaderinfo_get(lua_State *L)
|
||||
lua_pushinteger(L, header->levelselect);
|
||||
break;
|
||||
case mapheaderinfo_bonustype:
|
||||
lua_pushinteger(L, header->bonustype);
|
||||
lua_pushinteger(L, 0); // unused
|
||||
break;
|
||||
case mapheaderinfo_saveoverride:
|
||||
lua_pushinteger(L, header->saveoverride);
|
||||
lua_pushinteger(L, SAVE_DEFAULT); // unused
|
||||
break;
|
||||
case mapheaderinfo_levelflags:
|
||||
lua_pushinteger(L, header->levelflags);
|
||||
@@ -1652,13 +1651,9 @@ static int mapheaderinfo_get(lua_State *L)
|
||||
case mapheaderinfo_menuflags:
|
||||
lua_pushinteger(L, header->menuflags);
|
||||
break;
|
||||
/*case mapheaderinfo_automap:
|
||||
lua_pushstring(L, header->selectheading);
|
||||
break;*/
|
||||
case mapheaderinfo_mobj_scale:
|
||||
lua_pushfixed(L, header->mobj_scale);
|
||||
break;
|
||||
// TODO add support for reading numGradedMares and grades
|
||||
default:
|
||||
{
|
||||
// Read custom vars now
|
||||
|
||||
+3
-22
@@ -479,32 +479,13 @@ UINT8 M_CheckLevelEmblems(void)
|
||||
// Update Score, Time, Rings emblems
|
||||
for (i = 0; i < numemblems; ++i)
|
||||
{
|
||||
if (emblemlocations[i].type <= ET_SKIN || emblemlocations[i].collected)
|
||||
// Requires time on map <= x
|
||||
if (emblemlocations[i].type != ET_TIME || emblemlocations[i].collected)
|
||||
continue;
|
||||
|
||||
levelnum = emblemlocations[i].level;
|
||||
valToReach = emblemlocations[i].var;
|
||||
|
||||
switch (emblemlocations[i].type)
|
||||
{
|
||||
/*case ET_SCORE: // Requires score on map >= x
|
||||
res = (G_GetBestScore(levelnum) >= (unsigned)valToReach);
|
||||
break;*/
|
||||
case ET_TIME: // Requires time on map <= x
|
||||
res = (G_GetBestTime(levelnum) <= (unsigned)valToReach);
|
||||
break;
|
||||
/*case ET_RINGS: // Requires rings on map >= x
|
||||
res = (G_GetBestRings(levelnum) >= valToReach);
|
||||
break;
|
||||
case ET_NGRADE: // Requires NiGHTS grade on map >= x
|
||||
res = (G_GetBestNightsGrade(levelnum, 0) >= valToReach);
|
||||
break;
|
||||
case ET_NTIME: // Requires NiGHTS time on map <= x
|
||||
res = (G_GetBestNightsTime(levelnum, 0) <= (unsigned)valToReach);
|
||||
break;*/
|
||||
default: // unreachable but shuts the compiler up.
|
||||
continue;
|
||||
}
|
||||
res = (G_GetBestTime(levelnum) <= (unsigned)valToReach);
|
||||
|
||||
emblemlocations[i].collected = res;
|
||||
if (res)
|
||||
|
||||
@@ -27,21 +27,11 @@ typedef enum
|
||||
UC_MATCHESPLAYED, // SRB2Kart: MATCHESPLAYED [x played]
|
||||
UC_GAMECLEAR, // GAMECLEAR <x times>
|
||||
UC_ALLEMERALDS, // ALLEMERALDS <x times>
|
||||
//UC_ULTIMATECLEAR, // ULTIMATECLEAR <x times>
|
||||
//UC_OVERALLSCORE, // OVERALLSCORE [score to beat]
|
||||
UC_OVERALLTIME, // OVERALLTIME [time to beat, tics]
|
||||
//UC_OVERALLRINGS, // OVERALLRINGS [rings to beat]
|
||||
UC_MAPVISITED, // MAPVISITED [map number]
|
||||
UC_MAPBEATEN, // MAPBEATEN [map number]
|
||||
UC_MAPALLEMERALDS, // MAPALLEMERALDS [map number]
|
||||
//UC_MAPULTIMATE, // MAPULTIMATE [map number]
|
||||
//UC_MAPPERFECT, // MAPPERFECT [map number]
|
||||
//UC_MAPSCORE, // MAPSCORE [map number] [score to beat]
|
||||
UC_MAPTIME, // MAPTIME [map number] [time to beat, tics]
|
||||
//UC_MAPRINGS, // MAPRINGS [map number] [rings to beat]
|
||||
//UC_NIGHTSSCORE, // NIGHTSSCORE [map number] <mare, omit or "0" for overall> [score to beat]
|
||||
//UC_NIGHTSTIME, // NIGHTSTIME [map number] <mare, omit "0" overall> [time to beat, tics]
|
||||
//UC_NIGHTSGRADE, // NIGHTSGRADE [map number] <mare, omit "0" overall> [grade]
|
||||
UC_TRIGGER, // TRIGGER [trigger number]
|
||||
UC_TOTALEMBLEMS, // TOTALEMBLEMS [number of emblems]
|
||||
UC_EMBLEM, // EMBLEM [emblem number]
|
||||
|
||||
+1
-1
@@ -278,7 +278,7 @@ void M_DrawScaledEmote(fixed_t x, fixed_t y, fixed_t scale, emote_t *emote, INT3
|
||||
static void Command_ListEmotes_f(void)
|
||||
{
|
||||
const int EMOTES_PER_PAGE = 24;
|
||||
const int NUMPAGES = std::max<int>(emotes.size()/EMOTES_PER_PAGE, 1);
|
||||
const int NUMPAGES = emotes.size()/EMOTES_PER_PAGE + (emotes.size() % EMOTES_PER_PAGE != 0 ? 1 : 0);
|
||||
int page = 1;
|
||||
|
||||
if (COM_Argc() > 1)
|
||||
|
||||
+33
-18
@@ -186,8 +186,8 @@ static INT16 itemOn = 1; // menu item skull is on, Hack by Tails 09-18-2002
|
||||
static INT16 skullAnimCounter = 10; // skull animation counter
|
||||
static boolean interpTimerHackAllow = 0;
|
||||
|
||||
static UINT8 setupcontrolplayer;
|
||||
static INT32 (*setupcontrols)[2]; // pointer to the gamecontrols of the player being edited
|
||||
static UINT8 setupcontrolplayer;
|
||||
static INT32 (*setupcontrols)[2]; // pointer to the gamecontrols of the player being edited
|
||||
|
||||
// shhh... what am I doing... nooooo!
|
||||
static INT32 vidm_testingmode = 0;
|
||||
@@ -201,8 +201,8 @@ static char setupm_ip[64];
|
||||
static textinput_t setupm_input_ip;
|
||||
|
||||
|
||||
static fixed_t multi_tics;
|
||||
static state_t *multi_state;
|
||||
static fixed_t multi_tics;
|
||||
static state_t *multi_state;
|
||||
|
||||
// this is set before entering the MultiPlayer setup menu,
|
||||
// for either player 1 or 2
|
||||
@@ -1024,9 +1024,9 @@ boolean M_Responder(event_t *ev)
|
||||
//case KEY_JOY1 + 2:
|
||||
ch = KEY_ENTER;
|
||||
break;
|
||||
/*case KEY_JOY1 + 3: // Brake can function as 'n' for message boxes now.
|
||||
ch = 'n';
|
||||
break;*/
|
||||
/*case KEY_JOY1 + 3: // Brake can function as 'n' for message boxes now.
|
||||
ch = 'n';
|
||||
break;*/
|
||||
case KEY_MOUSE1 + 1:
|
||||
//case KEY_JOY1 + 1:
|
||||
ch = KEY_BACKSPACE;
|
||||
@@ -1305,12 +1305,21 @@ boolean M_Responder(event_t *ev)
|
||||
{
|
||||
playback_last_menu_interaction_leveltime = leveltime;
|
||||
// Flip left/right with up/down for the playback menu, since it's a horizontal icon row.
|
||||
|
||||
switch (ch)
|
||||
{
|
||||
case KEY_LEFTARROW: ch = KEY_UPARROW; break;
|
||||
case KEY_UPARROW: ch = KEY_RIGHTARROW; break;
|
||||
case KEY_RIGHTARROW: ch = KEY_DOWNARROW; break;
|
||||
case KEY_DOWNARROW: ch = KEY_LEFTARROW; break;
|
||||
case KEY_LEFTARROW:
|
||||
ch = KEY_UPARROW;
|
||||
break;
|
||||
case KEY_UPARROW:
|
||||
ch = KEY_RIGHTARROW;
|
||||
break;
|
||||
case KEY_RIGHTARROW:
|
||||
ch = KEY_DOWNARROW;
|
||||
break;
|
||||
case KEY_DOWNARROW:
|
||||
ch = KEY_LEFTARROW;
|
||||
break;
|
||||
|
||||
// arbitrary keyboard shortcuts because fuck you
|
||||
|
||||
@@ -1361,7 +1370,8 @@ boolean M_Responder(event_t *ev)
|
||||
G_AdjustView(4, 1, true);
|
||||
break;
|
||||
|
||||
default: break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1486,6 +1496,7 @@ boolean M_Responder(event_t *ev)
|
||||
}
|
||||
|
||||
return false;
|
||||
break;
|
||||
|
||||
default:
|
||||
CON_Responder(ev);
|
||||
@@ -2064,7 +2075,6 @@ void M_Init(void)
|
||||
OP_OpenGLOptionsMenu[op_gl_shader].status = IT_GRAYEDOUT;
|
||||
OP_OpenGLOptionsMenu[op_gl_lightdither].status = IT_GRAYEDOUT;
|
||||
OP_OpenGLOptionsMenu[op_gl_palrender].status = IT_GRAYEDOUT;
|
||||
OP_OpenGLOptionsMenu[op_gl_flashpal].status = IT_GRAYEDOUT;
|
||||
|
||||
OP_ExpOptionsMenu[op_exp_paldepth].status = IT_GRAYEDOUT;
|
||||
}
|
||||
@@ -4113,6 +4123,9 @@ static void AddCheckedReplay(void)
|
||||
// Check up to maxnum replays if they match with query
|
||||
static void M_HutCheckReplays(size_t maxnum)
|
||||
{
|
||||
// Stripped of color codes
|
||||
char demo_title[sizeof(demolist_all[0].title)];
|
||||
|
||||
if (!replaynamesloaded)
|
||||
return;
|
||||
|
||||
@@ -4145,7 +4158,9 @@ static void M_HutCheckReplays(size_t maxnum)
|
||||
case MD_NOTLOADED:
|
||||
case MD_OUTDATED:
|
||||
case MD_LOADED:
|
||||
if (demolist_all[replayquerycheck].title[0] && strcasestr(demolist_all[replayquerycheck].title, replayqueryinput.buffer) != NULL)
|
||||
StripColors(demo_title, demolist_all[replayquerycheck].title, sizeof(demo_title));
|
||||
|
||||
if (demolist_all[replayquerycheck].title[0] && strcasestr(demo_title, replayqueryinput.buffer) != NULL)
|
||||
AddCheckedReplay(); // It matches, add it!
|
||||
else
|
||||
replayquerycheck++; // Doesn't match, moving on...
|
||||
@@ -4905,6 +4920,7 @@ static void M_HutStartReplay(INT32 choice)
|
||||
demo.loadfiles = (itemOn == 0);
|
||||
demo.ignorefiles = (itemOn != 0);
|
||||
|
||||
CONS_Printf(M_GetText("Playing back demo '%s'.\n"), demolist[dir_on[menudepthleft]].filepath);
|
||||
G_DoPlayDemo(demolist[dir_on[menudepthleft]].filepath);
|
||||
}
|
||||
|
||||
@@ -6466,7 +6482,7 @@ static void M_ChooseTimeAttack(INT32 choice)
|
||||
static void M_HandleStaffReplay(INT32 choice)
|
||||
{
|
||||
boolean exitmenu = false; // exit to previous menu
|
||||
lumpnum_t l = W_CheckNumForName(va("%sS%02u",G_BuildMapName(cv_nextmap.value),cv_dummystaff.value));
|
||||
lumpnum_t l = W_CheckNumForName(va("%sS%02u", G_BuildMapName(cv_nextmap.value), cv_dummystaff.value));
|
||||
|
||||
switch (choice)
|
||||
{
|
||||
@@ -6496,7 +6512,7 @@ static void M_HandleStaffReplay(INT32 choice)
|
||||
M_ClearMenus(true);
|
||||
modeattacking = ATTACKING_RECORD;
|
||||
demo.loadfiles = false; demo.ignorefiles = true; // Just assume that record attack replays have the files needed
|
||||
G_DoPlayDemo(va("%sS%02u",G_BuildMapName(cv_nextmap.value),cv_dummystaff.value));
|
||||
G_DoPlayDemo(va("%sS%02u", G_BuildMapName(cv_nextmap.value), cv_dummystaff.value));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -7940,7 +7956,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
patch_t *statbg = (patch_t *)W_CachePatchName("K_STATBG", PU_PATCH);
|
||||
patch_t *statlr = (patch_t *)W_CachePatchName("K_STATLR", PU_PATCH);
|
||||
patch_t *statud = (patch_t *)W_CachePatchName("K_STATUD", PU_PATCH);
|
||||
patch_t *statdot = (patch_t *)W_CachePatchName("K_SDOT0", PU_PATCH);
|
||||
patch_t *statdot = (patch_t *)W_CachePatchName("K_SDOT0" , PU_PATCH);
|
||||
patch_t *patch;
|
||||
UINT8 frame;
|
||||
UINT8 speed;
|
||||
@@ -10041,7 +10057,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
|
||||
{
|
||||
|
||||
@@ -1023,8 +1023,6 @@ static menuitem_t OP_OpenGLOptionsMenu[] =
|
||||
{IT_STRING | IT_CVAR, NULL, "Fallback Player 3D Model", &cv_glfallbackplayermodel, 20},
|
||||
{IT_STRING | IT_CVAR, NULL, "Shaders", &cv_glshaders, 25},
|
||||
{IT_STRING | IT_CVAR, NULL, "Palette Rendering", &cv_glpaletterendering, 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Palette Rendering Flashpals",&cv_glflashpal, 35},
|
||||
//{IT_STRING | IT_CVAR, NULL, "Min Shader Brightness", &cv_glsecbright, 40},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Texture Quality", &cv_gltexturedepth, 45},
|
||||
{IT_STRING | IT_CVAR, NULL, "Texture Filter", &cv_glfiltermode, 50},
|
||||
@@ -1045,7 +1043,6 @@ static const char* OP_OpenGLTooltips[] =
|
||||
"Fallback 3D model for characters that don't have any.",
|
||||
"Graphical Shaders.",
|
||||
"Recreates the look of software mode.",
|
||||
"Flash palettes for palette rendering.",
|
||||
"Bit-depth of textures.",
|
||||
"Filter to use on textures.",
|
||||
"Anisotropic filtering.",
|
||||
@@ -1064,7 +1061,6 @@ enum
|
||||
op_gl_falbckmdls,
|
||||
op_gl_shader,
|
||||
op_gl_palrender,
|
||||
op_gl_flashpal,
|
||||
op_gl_scrdepth,
|
||||
op_gl_filter,
|
||||
op_gl_anis,
|
||||
@@ -2774,6 +2770,5 @@ void M_UpdateOGLMenu(void)
|
||||
OP_OpenGLOptionsMenu[op_gl_lightdither].status = (!HWR_UseShader()) ? IT_GRAYEDOUT : IT_STRING | IT_CVAR;
|
||||
|
||||
OP_OpenGLOptionsMenu[op_gl_palrender].status = (cv_glscreentextures.value != 2 || !HWR_UseShader()) ? IT_GRAYEDOUT : IT_STRING | IT_CVAR;
|
||||
OP_OpenGLOptionsMenu[op_gl_flashpal].status = (!HWR_ShouldUsePaletteRendering()) ? IT_GRAYEDOUT : IT_STRING | IT_CVAR;
|
||||
}
|
||||
#endif
|
||||
+20
-7
@@ -788,10 +788,10 @@ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png
|
||||
else
|
||||
snprintf(locationtxt, 40, "Unknown");
|
||||
|
||||
memset(png_infotext,0x00,sizeof (png_infotext));
|
||||
memset(png_infotext, 0x00, sizeof(png_infotext));
|
||||
|
||||
for (i = 0; i < SRB2PNGTXT; i++)
|
||||
png_infotext[i].key = keytxt[i];
|
||||
png_infotext[i].key = keytxt[i];
|
||||
|
||||
png_infotext[0].text = titletxt;
|
||||
if (movie)
|
||||
@@ -804,9 +804,15 @@ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png
|
||||
png_infotext[5].text = locationtxt;
|
||||
png_infotext[6].text = interfacetxt;
|
||||
png_infotext[7].text = rendermodetxt;
|
||||
png_infotext[8].text = strncpy(ctrevision, comprevision, sizeof(ctrevision)-1);
|
||||
png_infotext[9].text = strncpy(ctdate, compdate, sizeof(ctdate)-1);
|
||||
png_infotext[10].text = strncpy(cttime, comptime, sizeof(cttime)-1);
|
||||
strncpy(ctrevision, comprevision, sizeof(ctrevision)-1);
|
||||
ctrevision[sizeof(ctrevision)-1] = '\0';
|
||||
png_infotext[8].text = ctrevision;
|
||||
strncpy(ctdate, compdate, sizeof(ctdate)-1);
|
||||
ctdate[sizeof(ctdate)-1] = '\0';
|
||||
png_infotext[9].text = ctdate;
|
||||
strncpy(cttime, comptime, sizeof(cttime)-1);
|
||||
cttime[sizeof(cttime)-1] = '\0';
|
||||
png_infotext[10].text = cttime;
|
||||
|
||||
png_set_text(png_ptr, png_info_ptr, png_infotext, SRB2PNGTXT);
|
||||
#undef SRB2PNGTXT
|
||||
@@ -1564,6 +1570,7 @@ char *M_GetToken(const char *inputString)
|
||||
{
|
||||
startPos = endPos;
|
||||
}
|
||||
|
||||
if (stringToUse == NULL)
|
||||
return NULL;
|
||||
|
||||
@@ -1634,7 +1641,8 @@ char *M_GetToken(const char *inputString)
|
||||
}
|
||||
|
||||
// If the end of the string is reached, no token is to be read
|
||||
if (startPos == stringLength) {
|
||||
if (startPos == stringLength)
|
||||
{
|
||||
endPos = stringLength;
|
||||
return NULL;
|
||||
}
|
||||
@@ -1644,7 +1652,7 @@ char *M_GetToken(const char *inputString)
|
||||
|| stringToUse[startPos] == '}')
|
||||
{
|
||||
endPos = startPos + 1;
|
||||
texturesToken = (char *)Z_Malloc(2*sizeof(char),PU_STATIC,NULL);
|
||||
texturesToken = (char *)Z_Malloc(2*sizeof(char), PU_STATIC, NULL);
|
||||
texturesToken[0] = stringToUse[startPos];
|
||||
texturesToken[1] = '\0';
|
||||
return texturesToken;
|
||||
@@ -1855,8 +1863,10 @@ int M_PathParts(const char *path)
|
||||
int n;
|
||||
const char *p;
|
||||
const char *t;
|
||||
|
||||
if (path == NULL)
|
||||
return 0;
|
||||
|
||||
for (n = 0, p = path ;; ++n)
|
||||
{
|
||||
t = p;
|
||||
@@ -1869,6 +1879,7 @@ int M_PathParts(const char *path)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
@@ -1911,7 +1922,9 @@ void M_MkdirEachUntil(const char *cpath, int start, int end, int mode)
|
||||
if (!( p = strchr(p, PATHSEP[0]) ))
|
||||
return;
|
||||
}
|
||||
|
||||
p += strspn(p, PATHSEP);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (end > 0 && !--end)
|
||||
|
||||
+2
-2
@@ -256,7 +256,7 @@ static boolean M_TextInputHandleBase(textinput_t *input, INT32 key, boolean emot
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((cv_keyboardlayout.value != 3 && ctrldown) || (cv_keyboardlayout.value == 3 && ctrldown && !altdown))
|
||||
if (ctrldown && (cv_keyboardlayout.value != 3 || (cv_keyboardlayout.value == 3 && !altdown)))
|
||||
{
|
||||
if (key == 'x' || key == 'X')
|
||||
{
|
||||
@@ -392,7 +392,7 @@ static boolean M_TextInputHandleBase(textinput_t *input, INT32 key, boolean emot
|
||||
key = '/';
|
||||
|
||||
// same capslock code as hu_stuff.c's HU_responder. Check there for details.
|
||||
key = cv_keyboardlayout.value == 3 ? CON_ShitAndAltGrChar(key) : CON_ShiftChar(key);
|
||||
key = CON_ShiftChar(key);
|
||||
|
||||
// enter a char into the command prompt
|
||||
if (key < 32 || key > 127)
|
||||
|
||||
+9
-59
@@ -122,27 +122,6 @@ static void P_CycleMobjState(mobj_t *mobj)
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// P_CycleMobjState for players.
|
||||
//
|
||||
static void P_CyclePlayerMobjState(mobj_t *mobj)
|
||||
{
|
||||
// state animations
|
||||
P_CycleStateAnimation(mobj);
|
||||
|
||||
// cycle through states,
|
||||
// calling action functions at transitions
|
||||
if (mobj->tics != -1)
|
||||
{
|
||||
mobj->tics--;
|
||||
|
||||
// you can cycle through multiple states in a tic
|
||||
if (!mobj->tics && mobj->state)
|
||||
if (!P_SetPlayerMobjState(mobj, mobj->state->nextstate))
|
||||
return; // freed itself
|
||||
}
|
||||
}
|
||||
|
||||
#define MAX_RECURSION 20
|
||||
|
||||
//
|
||||
@@ -1670,6 +1649,14 @@ void P_XYMovement(mobj_t *mo)
|
||||
if (mo->flags & MF_NOCLIPHEIGHT)
|
||||
return; // no frictions for objects that can pass through floors
|
||||
|
||||
//{ SRB2kart stuff
|
||||
if (mo->type == MT_ORBINAUT || mo->type == MT_JAWZ_DUD || mo->type == MT_JAWZ || mo->type == MT_BALLHOG) //(mo->type == MT_JAWZ && !mo->tracer))
|
||||
return;
|
||||
|
||||
if (mo->player && (mo->player->kartstuff[k_spinouttimer] && !mo->player->kartstuff[k_wipeoutslow]) && mo->player->speed <= K_GetKartSpeed(mo->player, false)/2)
|
||||
return;
|
||||
//}
|
||||
|
||||
if (mo->flags & MF_MISSILE || mo->flags2 & MF2_SKULLFLY || mo->type == MT_SHELL || mo->type == MT_VULTURE)
|
||||
return; // no friction for missiles ever
|
||||
|
||||
@@ -1683,14 +1670,6 @@ void P_XYMovement(mobj_t *mo)
|
||||
&& (mo->standingslope && abs(mo->standingslope->zdelta) > FRACUNIT>>8)) // Special exception for tumbleweeds on slopes
|
||||
return;
|
||||
|
||||
//{ SRB2kart stuff
|
||||
if (mo->type == MT_ORBINAUT || mo->type == MT_JAWZ_DUD || mo->type == MT_JAWZ || mo->type == MT_BALLHOG) //(mo->type == MT_JAWZ && !mo->tracer))
|
||||
return;
|
||||
|
||||
if (mo->player && (mo->player->kartstuff[k_spinouttimer] && !mo->player->kartstuff[k_wipeoutslow]) && mo->player->speed <= K_GetKartSpeed(mo->player, false)/2)
|
||||
return;
|
||||
//}
|
||||
|
||||
if (((!(mo->eflags & MFE_VERTICALFLIP) && mo->z > mo->floorz) || (mo->eflags & MFE_VERTICALFLIP && mo->z+mo->height < mo->ceilingz))
|
||||
&& !(player && player->pflags & PF_SLIDING))
|
||||
return; // no friction when airborne
|
||||
@@ -3210,30 +3189,6 @@ static boolean P_CameraCheckWater(camera_t *thiscam)
|
||||
return false;
|
||||
}
|
||||
|
||||
void P_DestroyRobots(void)
|
||||
{
|
||||
// Search through all the thinkers for enemies.
|
||||
mobj_t *mo;
|
||||
thinker_t *think;
|
||||
|
||||
for (think = thinkercap.next; think != &thinkercap; think = think->next)
|
||||
{
|
||||
if (think->function != (actionf_p1)P_MobjThinker)
|
||||
continue; // not a mobj thinker
|
||||
|
||||
mo = (mobj_t *)think;
|
||||
|
||||
if (mo->health <= 0 || !(mo->flags & MF_ENEMY || mo->flags & MF_BOSS))
|
||||
continue; // not a valid enemy
|
||||
|
||||
if (mo->type == MT_PLAYER) // Don't chase after other players!
|
||||
continue;
|
||||
|
||||
// Found a target enemy
|
||||
P_KillMobj(mo, players[consoleplayer].mo, players[consoleplayer].mo);
|
||||
}
|
||||
}
|
||||
|
||||
// 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)
|
||||
{
|
||||
@@ -9221,10 +9176,7 @@ void P_MobjThinker(mobj_t *mobj)
|
||||
}
|
||||
|
||||
// Can end up here if a player dies.
|
||||
if (mobj->player)
|
||||
P_CyclePlayerMobjState(mobj);
|
||||
else
|
||||
P_CycleMobjState(mobj);
|
||||
P_CycleMobjState(mobj);
|
||||
|
||||
if (P_MobjWasRemoved(mobj))
|
||||
return;
|
||||
@@ -11118,8 +11070,6 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
||||
{
|
||||
if (!cv_powerstones.value || !G_BattleGametype())
|
||||
return;
|
||||
|
||||
runemeraldmanager = true;
|
||||
}
|
||||
|
||||
if (!G_RaceGametype()) // No enemies in match or CTF modes
|
||||
|
||||
@@ -499,7 +499,6 @@ void P_SpawnPrecipitation(void);
|
||||
void P_SpawnParaloop(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, statenum_t nstate, angle_t rotangle, boolean spawncenter);
|
||||
boolean P_BossTargetPlayer(mobj_t *actor, boolean closest);
|
||||
boolean P_SupermanLook4Players(mobj_t *actor);
|
||||
void P_DestroyRobots(void);
|
||||
boolean P_PrecipThinker(precipmobj_t *mobj);
|
||||
void P_NullPrecipThinker(precipmobj_t *mobj);
|
||||
void P_FreePrecipMobj(precipmobj_t *mobj);
|
||||
@@ -510,7 +509,6 @@ void P_EmeraldManager(void);
|
||||
#define MAXHUNTEMERALDS 64
|
||||
extern mapthing_t *huntemeralds[MAXHUNTEMERALDS];
|
||||
extern INT32 numhuntemeralds;
|
||||
extern boolean runemeraldmanager;
|
||||
extern INT32 numstarposts;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
+10
-115
@@ -218,8 +218,6 @@ static void P_ClearSingleMapHeaderInfo(INT16 i)
|
||||
mapheaderinfo[num]->musname[6] = 0;
|
||||
mapheaderinfo[num]->mustrack = 0;
|
||||
mapheaderinfo[num]->muspos = 0;
|
||||
mapheaderinfo[num]->musinterfadeout = 0;
|
||||
mapheaderinfo[num]->musintername[0] = '\0';
|
||||
mapheaderinfo[num]->forcecharacter[0] = '\0';
|
||||
mapheaderinfo[num]->weather = 0;
|
||||
mapheaderinfo[num]->skynum = 1;
|
||||
@@ -237,16 +235,10 @@ static void P_ClearSingleMapHeaderInfo(INT16 i)
|
||||
mapheaderinfo[num]->numlaps = NUMLAPS_DEFAULT;
|
||||
mapheaderinfo[num]->unlockrequired = -1;
|
||||
mapheaderinfo[num]->levelselect = 0;
|
||||
mapheaderinfo[num]->bonustype = 0;
|
||||
mapheaderinfo[num]->saveoverride = SAVE_DEFAULT;
|
||||
mapheaderinfo[num]->levelflags = 0;
|
||||
mapheaderinfo[num]->menuflags = (mainwads ? 0 : LF2_EXISTSHACK); // see p_setup.c - prevents replacing maps in addons with easier versions
|
||||
|
||||
// TODO grades support for delfile (pfft yeah right)
|
||||
P_DeleteGrades(num);
|
||||
|
||||
// SRB2Kart
|
||||
//mapheaderinfo[num]->automap = false;
|
||||
mapheaderinfo[num]->mobj_scale = FRACUNIT;
|
||||
|
||||
mapheaderinfo[num]->customopts = NULL;
|
||||
@@ -266,107 +258,11 @@ void P_AllocMapHeader(INT16 i)
|
||||
if (!mapheaderinfo[i])
|
||||
{
|
||||
mapheaderinfo[i] = Z_Malloc(sizeof(mapheader_t), PU_STATIC, NULL);
|
||||
mapheaderinfo[i]->grades = NULL;
|
||||
}
|
||||
|
||||
P_ClearSingleMapHeaderInfo(i + 1);
|
||||
}
|
||||
|
||||
/** NiGHTS Grades are a special structure,
|
||||
* we initialize them here.
|
||||
*
|
||||
* \param i Index of header to allocate grades for
|
||||
* \param mare The mare we're adding grades for
|
||||
* \param grades the string from DeHackEd, we work with it ourselves
|
||||
*/
|
||||
void P_AddGradesForMare(INT16 i, UINT8 mare, char *gtext)
|
||||
{
|
||||
INT32 g;
|
||||
char *spos = gtext;
|
||||
|
||||
CONS_Debug(DBG_SETUP, "Map %d Mare %d: ", i+1, (UINT16)mare+1);
|
||||
|
||||
if (mapheaderinfo[i]->numGradedMares < mare+1)
|
||||
{
|
||||
mapheaderinfo[i]->numGradedMares = mare+1;
|
||||
mapheaderinfo[i]->grades = Z_Realloc(mapheaderinfo[i]->grades, sizeof(nightsgrades_t) * mapheaderinfo[i]->numGradedMares, PU_STATIC, NULL);
|
||||
}
|
||||
|
||||
for (g = 0; g < 6; ++g)
|
||||
{
|
||||
// Allow "partial" grading systems
|
||||
if (spos != NULL)
|
||||
{
|
||||
mapheaderinfo[i]->grades[mare].grade[g] = atoi(spos);
|
||||
CONS_Debug(DBG_SETUP, "%u ", atoi(spos));
|
||||
// Grab next comma
|
||||
spos = strchr(spos, ',');
|
||||
if (spos)
|
||||
++spos;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Grade not reachable
|
||||
mapheaderinfo[i]->grades[mare].grade[g] = UINT32_MAX;
|
||||
}
|
||||
}
|
||||
|
||||
CONS_Debug(DBG_SETUP, "\n");
|
||||
}
|
||||
|
||||
/** And this removes the grades safely.
|
||||
*
|
||||
* \param i The header to remove grades from
|
||||
*/
|
||||
void P_DeleteGrades(INT16 i)
|
||||
{
|
||||
Z_Free(mapheaderinfo[i]->grades);
|
||||
mapheaderinfo[i]->grades = NULL;
|
||||
mapheaderinfo[i]->numGradedMares = 0;
|
||||
}
|
||||
|
||||
/** And this fetches the grades
|
||||
*
|
||||
* \param pscore The player's score.
|
||||
* \param map The game map.
|
||||
* \param mare The mare to test.
|
||||
*/
|
||||
UINT8 P_GetGrade(UINT32 pscore, INT16 map, UINT8 mare)
|
||||
{
|
||||
INT32 i;
|
||||
|
||||
// Determining the grade
|
||||
if (mapheaderinfo[map-1] && mapheaderinfo[map-1]->grades && mapheaderinfo[map-1]->numGradedMares >= mare + 1)
|
||||
{
|
||||
INT32 pgrade = 0;
|
||||
for (i = 0; i < 6; ++i)
|
||||
{
|
||||
if (pscore >= mapheaderinfo[map-1]->grades[mare].grade[i])
|
||||
++pgrade;
|
||||
}
|
||||
|
||||
return (UINT8)pgrade;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
UINT8 P_HasGrades(INT16 map, UINT8 mare)
|
||||
{
|
||||
// Determining the grade
|
||||
// Mare 0 is treated as overall and is true if ANY grades exist
|
||||
return (mapheaderinfo[map-1] && mapheaderinfo[map-1]->grades
|
||||
&& (mare == 0 || mapheaderinfo[map-1]->numGradedMares >= mare));
|
||||
}
|
||||
|
||||
UINT32 P_GetScoreForGrade(INT16 map, UINT8 mare, UINT8 grade)
|
||||
{
|
||||
// Get the score for the grade... if it exists
|
||||
if (grade == GRADE_F || grade > GRADE_S || !P_HasGrades(map, mare)) return 0;
|
||||
|
||||
return mapheaderinfo[map-1]->grades[mare].grade[grade-1];
|
||||
}
|
||||
|
||||
// Loads the vertexes for a level.
|
||||
FUNCINLINE static ATTRINLINE void P_LoadVertices(UINT8 *data)
|
||||
{
|
||||
@@ -414,7 +310,7 @@ void P_UpdateSegLightOffset(seg_t *li)
|
||||
angle_t liAngle = R_PointToAngle2(0, 0, (li->v1->x - li->v2->x), (li->v1->y - li->v2->y)) - ANGLE_90;
|
||||
|
||||
light = FixedMul(FINECOSINE(liAngle >> ANGLETOFINESHIFT), FINECOSINE(maplighting.angle >> ANGLETOFINESHIFT))
|
||||
+ FixedMul(FINESINE(liAngle >> ANGLETOFINESHIFT), FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
|
||||
+ FixedMul(FINESINE(liAngle >> ANGLETOFINESHIFT), FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
|
||||
light = (light + FRACUNIT) / 2;
|
||||
}
|
||||
else
|
||||
@@ -1914,7 +1810,7 @@ static void P_LoadMapBSP(const virtres_t* virt)
|
||||
if (numsubsectors <= 0)
|
||||
I_Error("Level has no subsectors (did you forget to run it through a nodesbuilder?)");
|
||||
if (numnodes <= 0)
|
||||
I_Error("Level has no nodes");
|
||||
I_Error("Level has no nodes (does your map have at least 2 sectors?)");
|
||||
if (numsegs <= 0)
|
||||
I_Error("Level has no segs");
|
||||
|
||||
@@ -2047,7 +1943,6 @@ static void P_LevelInitStuff(boolean reloadinggamestate)
|
||||
|
||||
// special stage tokens, emeralds, and ring total
|
||||
tokenbits = 0;
|
||||
runemeraldmanager = false;
|
||||
nummaprings = nummapboxes = numgotboxes = 0;
|
||||
|
||||
// emerald hunt
|
||||
@@ -2077,10 +1972,10 @@ static void P_LevelInitStuff(boolean reloadinggamestate)
|
||||
stagefailed = false;
|
||||
|
||||
// earthquake camera
|
||||
memset(&quake,0,sizeof(struct quake));
|
||||
memset(&quake, 0, sizeof(struct quake));
|
||||
|
||||
// song credit init
|
||||
memset(&cursongcredit,0,sizeof(struct cursongcredit));
|
||||
memset(&cursongcredit, 0, sizeof(struct cursongcredit));
|
||||
cursongcredit.trans = NUMTRANSMAPS;
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
@@ -2174,14 +2069,14 @@ static INT32 P_MakeBufferMD5(const char *buffer, size_t len, void *resblock)
|
||||
memset(resblock, 0x00, 16);
|
||||
return 1;
|
||||
#else
|
||||
tic_t t = I_GetTime();
|
||||
precise_t t = I_GetPreciseTime();
|
||||
|
||||
CONS_Debug(DBG_SETUP, "Making MD5\n");
|
||||
|
||||
if (md5_buffer(buffer, len, resblock) == NULL)
|
||||
return 1;
|
||||
|
||||
CONS_Debug(DBG_SETUP, "MD5 calc took %f seconds\n", (float)(I_GetTime() - t)/NEWTICRATE);
|
||||
CONS_Debug(DBG_SETUP, "MD5 calc took %f seconds\n", (float)(I_GetPreciseTime() - t)/I_GetPrecisePrecision());
|
||||
|
||||
return 0;
|
||||
#endif
|
||||
@@ -2203,10 +2098,10 @@ static void P_MakeMapMD5(virtres_t *virt, void *dest)
|
||||
virtlump_t* virtmthings = vres_Find(virt, "THINGS");
|
||||
virtlump_t* virtsides = vres_Find(virt, "SIDEDEFS");
|
||||
|
||||
P_MakeBufferMD5((char*)virtlines->data, virtlines->size, linemd5);
|
||||
P_MakeBufferMD5((char*)virtsectors->data, virtsectors->size, sectormd5);
|
||||
P_MakeBufferMD5((char*)virtmthings->data, virtmthings->size, thingmd5);
|
||||
P_MakeBufferMD5((char*)virtsides->data, virtsides->size, sidedefmd5);
|
||||
P_MakeBufferMD5((char*)virtlines->data, virtlines->size, linemd5);
|
||||
P_MakeBufferMD5((char*)virtsectors->data, virtsectors->size, sectormd5);
|
||||
P_MakeBufferMD5((char*)virtmthings->data, virtmthings->size, thingmd5);
|
||||
P_MakeBufferMD5((char*)virtsides->data, virtsides->size, sidedefmd5);
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
resmd5[i] = (linemd5[i] + sectormd5[i] + thingmd5[i] + sidedefmd5[i]) & 0xFF;
|
||||
|
||||
@@ -114,13 +114,6 @@ size_t P_PrecacheLevelFlats(void);
|
||||
|
||||
void P_AllocMapHeader(INT16 i);
|
||||
|
||||
// Needed for NiGHTS
|
||||
void P_DeleteGrades(INT16 i);
|
||||
void P_AddGradesForMare(INT16 i, UINT8 mare, char *gtext);
|
||||
UINT8 P_GetGrade(UINT32 pscore, INT16 map, UINT8 mare);
|
||||
UINT8 P_HasGrades(INT16 map, UINT8 mare);
|
||||
UINT32 P_GetScoreForGrade(INT16 map, UINT8 mare, UINT8 grade);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
+2
-2
@@ -76,8 +76,8 @@ static void P_UpdateSlopeLightOffset(pslope_t *slope)
|
||||
*/
|
||||
|
||||
light = FixedMul(nX, FINECOSINE(maplighting.angle >> ANGLETOFINESHIFT))
|
||||
+ FixedMul(nY, FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
|
||||
light = (light + FRACUNIT) / 2;
|
||||
+ FixedMul(nY, FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
|
||||
light = (light + FRACUNIT) / 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+14
-10
@@ -1992,20 +1992,23 @@ static void P_3dMovement(player_t *player)
|
||||
K_MomentumToFacing(player);
|
||||
}
|
||||
|
||||
const fixed_t kartspd = K_GetKartSpeed(player, true);
|
||||
|
||||
// Sideways movement
|
||||
if (cmd->sidemove != 0 && !((player->exiting || mapreset) || player->kartstuff[k_spinouttimer]))
|
||||
{
|
||||
if (cmd->sidemove > 0)
|
||||
movepushside = (cmd->sidemove * FRACUNIT/128) + FixedDiv(player->speed, K_GetKartSpeed(player, true));
|
||||
movepushside = (cmd->sidemove * FRACUNIT/128) + FixedDiv(player->speed, kartspd);
|
||||
else
|
||||
movepushside = (cmd->sidemove * FRACUNIT/128) - FixedDiv(player->speed, K_GetKartSpeed(player, true));
|
||||
movepushside = (cmd->sidemove * FRACUNIT/128) - FixedDiv(player->speed, kartspd);
|
||||
|
||||
totalthrust.x += P_ReturnThrustX(player->mo, movepushsideangle, movepushside);
|
||||
totalthrust.y += P_ReturnThrustY(player->mo, movepushsideangle, movepushside);
|
||||
}
|
||||
|
||||
if ((totalthrust.x || totalthrust.y)
|
||||
&& player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)) && abs(player->mo->standingslope->zdelta) > FRACUNIT/2) {
|
||||
&& player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)) && abs(player->mo->standingslope->zdelta) > FRACUNIT/2)
|
||||
{
|
||||
// Factor thrust to slope, but only for the part pushing up it!
|
||||
// The rest is unaffected.
|
||||
angle_t thrustangle = R_PointToAngle2(0, 0, totalthrust.x, totalthrust.y)-player->mo->standingslope->xydirection;
|
||||
@@ -2041,11 +2044,11 @@ static void P_3dMovement(player_t *player)
|
||||
// -Shadow Hog
|
||||
newMagnitude = R_PointToDist2(player->mo->momx - player->cmomx, player->mo->momy - player->cmomy, 0, 0);
|
||||
|
||||
if (newMagnitude > K_GetKartSpeed(player, true)) //topspeed)
|
||||
if (newMagnitude > kartspd) //topspeed)
|
||||
{
|
||||
fixed_t tempmomx, tempmomy;
|
||||
|
||||
if (oldMagnitude > K_GetKartSpeed(player, true) && onground) // SRB2Kart: onground check for air speed cap
|
||||
if (oldMagnitude > kartspd && onground) // SRB2Kart: onground check for air speed cap
|
||||
{
|
||||
if (newMagnitude > oldMagnitude)
|
||||
{
|
||||
@@ -2058,8 +2061,8 @@ static void P_3dMovement(player_t *player)
|
||||
}
|
||||
else
|
||||
{
|
||||
tempmomx = FixedMul(FixedDiv(player->mo->momx - player->cmomx, newMagnitude), K_GetKartSpeed(player, true)); //topspeed)
|
||||
tempmomy = FixedMul(FixedDiv(player->mo->momy - player->cmomy, newMagnitude), K_GetKartSpeed(player, true)); //topspeed)
|
||||
tempmomx = FixedMul(FixedDiv(player->mo->momx - player->cmomx, newMagnitude), kartspd); //topspeed)
|
||||
tempmomy = FixedMul(FixedDiv(player->mo->momy - player->cmomy, newMagnitude), kartspd); //topspeed)
|
||||
player->mo->momx = tempmomx + player->cmomx;
|
||||
player->mo->momy = tempmomy + player->cmomy;
|
||||
}
|
||||
@@ -2474,9 +2477,10 @@ static void P_MovePlayer(player_t *player)
|
||||
const fixed_t runnyspeed = 20*FRACUNIT;
|
||||
|
||||
speed = R_PointToDist2(player->rmomx, player->rmomy, 0, 0);
|
||||
const fixed_t kartspd = K_GetKartSpeed(player, false);
|
||||
|
||||
if (speed > K_GetKartSpeed(player, false)-(5<<FRACBITS))
|
||||
speed = K_GetKartSpeed(player, false)-(5<<FRACBITS);
|
||||
if (speed > kartspd-(5<<FRACBITS))
|
||||
speed = kartspd-(5<<FRACBITS);
|
||||
|
||||
if (speed >= runnyspeed)
|
||||
player->fovadd = speed-runnyspeed;
|
||||
@@ -4584,7 +4588,7 @@ void P_PlayerThink(player_t *player)
|
||||
}
|
||||
|
||||
#ifdef SEENAMES
|
||||
if (netgame && player == &players[displayplayers[0]] && !(leveltime % (TICRATE/5)) && !splitscreen)
|
||||
if (netgame && !splitscreen && player == &players[displayplayers[0]] && !(leveltime % (TICRATE/5)))
|
||||
{
|
||||
seenplayer = NULL;
|
||||
|
||||
|
||||
+1
-1
@@ -400,7 +400,7 @@ static UINT8* RGetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 f
|
||||
case TC_ALLWHITE: skintableindex = ALLWHITE_TT_CACHE_INDEX; break;
|
||||
case TC_RAINBOW: skintableindex = RAINBOW_TT_CACHE_INDEX; break;
|
||||
case TC_BLINK: skintableindex = BLINK_TT_CACHE_INDEX; break;
|
||||
default: skintableindex = skinnum; break;
|
||||
default: skintableindex = skinnum; break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -280,22 +280,22 @@ static void Fov_OnChange(void)
|
||||
|
||||
static void FlipCam_OnChange(void)
|
||||
{
|
||||
SendWeaponPref();
|
||||
SendWeaponPref(0);
|
||||
}
|
||||
|
||||
static void FlipCam2_OnChange(void)
|
||||
{
|
||||
SendWeaponPref2();
|
||||
SendWeaponPref(1);
|
||||
}
|
||||
|
||||
static void FlipCam3_OnChange(void)
|
||||
{
|
||||
SendWeaponPref3();
|
||||
SendWeaponPref(2);
|
||||
}
|
||||
|
||||
static void FlipCam4_OnChange(void)
|
||||
{
|
||||
SendWeaponPref4();
|
||||
SendWeaponPref(3);
|
||||
}
|
||||
|
||||
static void Precipstuff_OnChange(void)
|
||||
|
||||
@@ -1222,6 +1222,15 @@ static void R_RenderSegLoop(drawcolumndata_t* dc)
|
||||
if (yl < top)
|
||||
yl = top;
|
||||
|
||||
// insanely shitty hack to fix flickering on some maps
|
||||
// for god knows why, on secret slide the renderer assumes some double sided linedefs have insanely tall walls
|
||||
// since such tall walls are effectively nonsense in any case
|
||||
// just skip them
|
||||
if (yl > FRACUNIT*3)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (markceiling)
|
||||
{
|
||||
bottom = yl > floorclip[rw_x] ? floorclip[rw_x] : yl;
|
||||
|
||||
+10
-7
@@ -1662,7 +1662,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||
|
||||
if (thing->frame & FF_ABSOLUTELIGHTLEVEL)
|
||||
{
|
||||
const UINT8 n = R_ThingLightLevel(thing);
|
||||
const UINT8 n = static_cast<UINT8>(R_ThingLightLevel(thing));
|
||||
// n = uint8 aka 0 - 255, so the shift will always be 0 - LIGHTLEVELS - 1
|
||||
lights_array = scalelight[n >> LIGHTSEGSHIFT];
|
||||
}
|
||||
@@ -2963,18 +2963,21 @@ fixed_t R_DoPlayerFade(mobj_t *thing)
|
||||
if (thing->player == viewplayer || viewplayer->exiting || viewplayer->spectator || camera[R_GetViewNumber()].freecam || leveltime < countdownstarttime)
|
||||
return fadealpha;
|
||||
|
||||
const INT32 playerdist = (FixedMul((thing->x - viewx), viewcos) + FixedMul((thing->y - viewy), viewsin)) >> FRACBITS;
|
||||
const INT32 viewplayerdist = (FixedMul((viewplayer->mo->x - viewx), viewcos) + FixedMul((viewplayer->mo->y - viewy), viewsin)) >> FRACBITS;
|
||||
const INT32 otherplayerdist = (FixedMul((thing->x - viewx), viewcos) + FixedMul((thing->y - viewy), viewsin)) >> FRACBITS;
|
||||
const INT32 viewplayerdist = (FixedMul((viewplayer->mo->x - viewx), viewcos) + FixedMul((viewplayer->mo->y - viewy), viewsin)) >> FRACBITS;
|
||||
|
||||
if (playerdist < viewplayerdist)
|
||||
if (viewplayerdist < 2)
|
||||
return fadealpha; // avoid zero division
|
||||
|
||||
if (otherplayerdist < viewplayerdist)
|
||||
{
|
||||
if (playerdist < viewplayerdist / 2) // stronger fade when very close
|
||||
if (otherplayerdist < viewplayerdist / 2) // stronger fade when very close
|
||||
{
|
||||
fadealpha = (playerdist * FRACUNIT) / (viewplayerdist / 2) / 3;
|
||||
fadealpha = (otherplayerdist * FRACUNIT) / (viewplayerdist / 2) / 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
fadealpha = (playerdist * FRACUNIT) / viewplayerdist;
|
||||
fadealpha = (otherplayerdist * FRACUNIT) / viewplayerdist;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-26
@@ -116,9 +116,7 @@ consvar_t cv_skipintromusic = {"skipintromusic", "No", CV_SAVE, CV_YesNo, NULL,
|
||||
|
||||
boolean keepmapmusic = false; // keep the current music on map restart
|
||||
boolean skipintromus = false; // skip the intro fanfare
|
||||
static boolean resumekeepmusic = false;
|
||||
static music_t keepmusic;
|
||||
static void S_SetKeepMusResume(void);
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
openmpt_module *openmpt_mhandle = NULL;
|
||||
@@ -1438,7 +1436,7 @@ void S_LoadMusicDefs(UINT16 wadnum)
|
||||
stoken = strtok(stoken, " ");
|
||||
if (stoken)
|
||||
{
|
||||
if (! ReadMusicDefFields(wadnum, line, stoken, &def))
|
||||
if (!ReadMusicDefFields(wadnum, line, stoken, &def))
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1848,8 +1846,6 @@ void S_StopMusic(void)
|
||||
|
||||
mapmusic.resume = (cv_resume.value && fasticmp(music.name, mapmusic.name)) ? I_GetSongPosition() : 0;
|
||||
|
||||
S_SetKeepMusResume();
|
||||
|
||||
if (I_SongPaused())
|
||||
I_ResumeSong();
|
||||
|
||||
@@ -1976,17 +1972,6 @@ void S_ResetKeepAndSpecialMus(void)
|
||||
keepmapmusic = skipintromus = false;
|
||||
}
|
||||
|
||||
// saves the current song position everytime a song stops
|
||||
// so we can resume it in some cases
|
||||
static void S_SetKeepMusResume(void)
|
||||
{
|
||||
keepmusic.resume = 0;
|
||||
|
||||
if (fasticmp(music.name, mapmusic.name))
|
||||
{
|
||||
keepmusic.resume = I_GetSongPosition();
|
||||
}
|
||||
}
|
||||
|
||||
// determine if we should keep the music on a map restart
|
||||
// this gets called BEFORE the level gets loaded in G_DoLoadLevel
|
||||
@@ -1995,7 +1980,7 @@ void S_KeepMusic(void)
|
||||
static INT16 oldmap = -1;
|
||||
static boolean oldencore = false;
|
||||
|
||||
keepmapmusic = resumekeepmusic = false;
|
||||
keepmapmusic = false;
|
||||
|
||||
if (!cv_keepmusic.value)
|
||||
{
|
||||
@@ -2009,9 +1994,7 @@ void S_KeepMusic(void)
|
||||
|
||||
if (oldmap == gamemap && oldencore == encoremode)
|
||||
{
|
||||
const boolean musicchanged = S_CheckMusicException();
|
||||
resumekeepmusic = (musicchanged && keepmusic.resume);
|
||||
keepmapmusic = (!musicchanged || resumekeepmusic);
|
||||
keepmapmusic = (S_CheckMusicException() == false);
|
||||
}
|
||||
|
||||
oldencore = encoremode;
|
||||
@@ -2072,12 +2055,6 @@ void S_InitMapMusic(void)
|
||||
|
||||
if (keepmapmusic)
|
||||
{
|
||||
// this is kinda silly, but we can use it to fade back into the map song at the saved point, should the current music be different from the map music
|
||||
if (resumekeepmusic)
|
||||
{
|
||||
S_ChangeMusicEx(mapmusic.name, mapmusic.flags, true, keepmusic.resume, 0, 500);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -216,8 +216,13 @@ void I_StartupSound(void)
|
||||
SDLmixlinked->major, SDLmixlinked->minor, SDLmixlinked->patch);
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
I_OutputMsg("libopenmpt version: %s\n", openmpt_get_string("library_version"));
|
||||
I_OutputMsg("libopenmpt build date: %s\n", openmpt_get_string("build"));
|
||||
const char *openmptstr;
|
||||
openmptstr = openmpt_get_string("library_version");
|
||||
I_OutputMsg("libopenmpt version: %s\n", openmptstr);
|
||||
openmpt_free_string(openmptstr);
|
||||
openmptstr = openmpt_get_string("build");
|
||||
I_OutputMsg("libopenmpt build date: %s\n", openmptstr);
|
||||
openmpt_free_string(openmptstr);
|
||||
#endif
|
||||
|
||||
sound_started = true;
|
||||
|
||||
+1
-1
@@ -180,7 +180,7 @@ static void ST_doPaletteStuff(void)
|
||||
INT32 palette = 0;
|
||||
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl && !HWR_PalRenderFlashpal())
|
||||
if (rendermode == render_opengl && !HWR_ShouldUsePaletteRendering())
|
||||
return;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -0,0 +1,525 @@
|
||||
#ifndef H_PALDELTA
|
||||
#define H_PALDELTA
|
||||
|
||||
// those are the differences in palette indices between the main srb2 playpal and its white and nuke subpalettes
|
||||
// this is probably not the best way of doing any of this, but it works lol
|
||||
|
||||
static const INT16 pPaletteDeltaFlash[256][3] = {
|
||||
{ 6, 6, 6},
|
||||
{ 12, 12, 12},
|
||||
{ 18, 18, 18},
|
||||
{ 24, 24, 24},
|
||||
{ 30, 30, 30},
|
||||
{ 36, 36, 36},
|
||||
{ 42, 42, 42},
|
||||
{ 48, 48, 48},
|
||||
{ 54, 54, 54},
|
||||
{ 60, 60, 60},
|
||||
{ 66, 66, 66},
|
||||
{ 72, 72, 72},
|
||||
{ 78, 78, 78},
|
||||
{ 84, 84, 84},
|
||||
{ 90, 90, 90},
|
||||
{ 95, 95, 95},
|
||||
{ 101, 101, 101},
|
||||
{ 107, 107, 107},
|
||||
{ 113, 113, 113},
|
||||
{ 119, 119, 119},
|
||||
{ 125, 125, 125},
|
||||
{ 131, 131, 131},
|
||||
{ 137, 137, 137},
|
||||
{ 143, 143, 143},
|
||||
{ 149, 149, 149},
|
||||
{ 155, 155, 155},
|
||||
{ 161, 161, 161},
|
||||
{ 167, 167, 167},
|
||||
{ 173, 173, 173},
|
||||
{ 179, 179, 179},
|
||||
{ 185, 185, 185},
|
||||
{ 191, 191, 191},
|
||||
{ 48, 66, 84},
|
||||
{ 54, 71, 89},
|
||||
{ 60, 77, 95},
|
||||
{ 66, 83, 100},
|
||||
{ 72, 88, 105},
|
||||
{ 79, 94, 111},
|
||||
{ 85, 99, 117},
|
||||
{ 91, 105, 123},
|
||||
{ 96, 111, 129},
|
||||
{ 102, 117, 135},
|
||||
{ 108, 123, 141},
|
||||
{ 114, 128, 146},
|
||||
{ 120, 134, 152},
|
||||
{ 127, 140, 158},
|
||||
{ 133, 145, 163},
|
||||
{ 140, 152, 170},
|
||||
{ 48, 98, 134},
|
||||
{ 57, 104, 137},
|
||||
{ 63, 107, 140},
|
||||
{ 69, 110, 143},
|
||||
{ 75, 116, 146},
|
||||
{ 84, 119, 149},
|
||||
{ 90, 125, 152},
|
||||
{ 95, 128, 155},
|
||||
{ 101, 131, 158},
|
||||
{ 110, 137, 161},
|
||||
{ 119, 140, 164},
|
||||
{ 128, 143, 167},
|
||||
{ 134, 149, 170},
|
||||
{ 143, 155, 173},
|
||||
{ 152, 158, 176},
|
||||
{ 158, 164, 179},
|
||||
{ 0, 15, 24},
|
||||
{ 0, 21, 33},
|
||||
{ 0, 27, 42},
|
||||
{ 0, 33, 51},
|
||||
{ 0, 36, 57},
|
||||
{ 0, 42, 66},
|
||||
{ 0, 48, 75},
|
||||
{ 0, 51, 81},
|
||||
{ 0, 57, 93},
|
||||
{ 6, 63, 98},
|
||||
{ 12, 69, 104},
|
||||
{ 18, 75, 110},
|
||||
{ 24, 81, 116},
|
||||
{ 30, 87, 122},
|
||||
{ 36, 93, 128},
|
||||
{ 39, 95, 131},
|
||||
{ 0, 12, 26},
|
||||
{ 0, 26, 52},
|
||||
{ 0, 39, 78},
|
||||
{ 0, 52, 102},
|
||||
{ 0, 65, 127},
|
||||
{ 0, 78, 150},
|
||||
{ 0, 91, 172},
|
||||
{ 0, 102, 191},
|
||||
{ 9, 108, 191},
|
||||
{ 19, 114, 191},
|
||||
{ 29, 120, 191},
|
||||
{ 39, 127, 191},
|
||||
{ 48, 133, 191},
|
||||
{ 58, 139, 191},
|
||||
{ 68, 145, 191},
|
||||
{ 78, 150, 191},
|
||||
{ 0, 0, 12},
|
||||
{ 0, 0, 36},
|
||||
{ 0, 0, 60},
|
||||
{ 0, 0, 84},
|
||||
{ 0, 0, 107},
|
||||
{ 0, 0, 131},
|
||||
{ 0, 0, 155},
|
||||
{ 0, 0, 179},
|
||||
{ 0, 0, 191},
|
||||
{ 36, 36, 191},
|
||||
{ 60, 60, 191},
|
||||
{ 84, 84, 191},
|
||||
{ 107, 107, 191},
|
||||
{ 131, 131, 191},
|
||||
{ 155, 155, 191},
|
||||
{ 179, 179, 191},
|
||||
{ 0, 0, 104},
|
||||
{ 15, 27, 125},
|
||||
{ 30, 51, 140},
|
||||
{ 45, 75, 155},
|
||||
{ 60, 98, 167},
|
||||
{ 75, 122, 176},
|
||||
{ 90, 140, 185},
|
||||
{ 104, 158, 191},
|
||||
{ 0, 0, 0},
|
||||
{ 0, 24, 24},
|
||||
{ 0, 48, 48},
|
||||
{ 0, 72, 72},
|
||||
{ 0, 95, 95},
|
||||
{ 0, 119, 119},
|
||||
{ 0, 143, 143},
|
||||
{ 0, 167, 167},
|
||||
{ 0, 191, 191},
|
||||
{ 12, 191, 191},
|
||||
{ 24, 191, 191},
|
||||
{ 36, 191, 191},
|
||||
{ 48, 191, 191},
|
||||
{ 60, 191, 191},
|
||||
{ 72, 191, 191},
|
||||
{ 84, 191, 191},
|
||||
{ 95, 191, 191},
|
||||
{ 107, 191, 191},
|
||||
{ 119, 191, 191},
|
||||
{ 131, 191, 191},
|
||||
{ 143, 191, 191},
|
||||
{ 155, 191, 191},
|
||||
{ 167, 191, 191},
|
||||
{ 179, 191, 191},
|
||||
{ 0, 54, 54},
|
||||
{ 9, 69, 69},
|
||||
{ 18, 84, 84},
|
||||
{ 27, 98, 98},
|
||||
{ 39, 110, 110},
|
||||
{ 48, 122, 122},
|
||||
{ 57, 131, 131},
|
||||
{ 66, 143, 143},
|
||||
{ 85, 156, 191},
|
||||
{ 91, 161, 191},
|
||||
{ 96, 166, 191},
|
||||
{ 102, 172, 191},
|
||||
{ 108, 177, 191},
|
||||
{ 114, 182, 191},
|
||||
{ 120, 187, 191},
|
||||
{ 127, 191, 191},
|
||||
{ 101, 0, 131},
|
||||
{ 106, 11, 134},
|
||||
{ 111, 23, 138},
|
||||
{ 117, 35, 142},
|
||||
{ 123, 47, 145},
|
||||
{ 129, 59, 149},
|
||||
{ 134, 71, 153},
|
||||
{ 140, 83, 157},
|
||||
{ 145, 95, 160},
|
||||
{ 151, 106, 164},
|
||||
{ 157, 118, 168},
|
||||
{ 162, 130, 172},
|
||||
{ 168, 142, 175},
|
||||
{ 173, 154, 179},
|
||||
{ 179, 166, 183},
|
||||
{ 185, 179, 187},
|
||||
{ 24, 0, 65},
|
||||
{ 42, 20, 80},
|
||||
{ 61, 41, 95},
|
||||
{ 79, 61, 110},
|
||||
{ 97, 82, 124},
|
||||
{ 115, 101, 139},
|
||||
{ 135, 123, 154},
|
||||
{ 153, 143, 169},
|
||||
{ 191, 0, 191},
|
||||
{ 191, 24, 191},
|
||||
{ 191, 48, 191},
|
||||
{ 191, 72, 191},
|
||||
{ 191, 95, 191},
|
||||
{ 191, 119, 191},
|
||||
{ 191, 143, 191},
|
||||
{ 191, 167, 191},
|
||||
{ 0, 107, 0},
|
||||
{ 0, 191, 0},
|
||||
{ 24, 191, 24},
|
||||
{ 48, 191, 48},
|
||||
{ 72, 191, 72},
|
||||
{ 95, 191, 95},
|
||||
{ 119, 191, 119},
|
||||
{ 143, 191, 143},
|
||||
{ 16, 16, 9},
|
||||
{ 44, 44, 22},
|
||||
{ 73, 73, 36},
|
||||
{ 101, 101, 51},
|
||||
{ 127, 127, 66},
|
||||
{ 142, 142, 93},
|
||||
{ 156, 156, 121},
|
||||
{ 170, 170, 151},
|
||||
{ 31, 10, 0},
|
||||
{ 48, 15, 0},
|
||||
{ 64, 21, 0},
|
||||
{ 79, 25, 0},
|
||||
{ 95, 30, 0},
|
||||
{ 111, 36, 0},
|
||||
{ 127, 41, 0},
|
||||
{ 143, 48, 0},
|
||||
{ 149, 73, 24},
|
||||
{ 155, 84, 48},
|
||||
{ 161, 101, 72},
|
||||
{ 167, 119, 95},
|
||||
{ 191, 48, 48},
|
||||
{ 191, 95, 95},
|
||||
{ 191, 119, 119},
|
||||
{ 191, 143, 143},
|
||||
{ 18, 18, 0},
|
||||
{ 42, 42, 0},
|
||||
{ 61, 61, 0},
|
||||
{ 86, 86, 0},
|
||||
{ 104, 104, 0},
|
||||
{ 129, 129, 0},
|
||||
{ 154, 154, 0},
|
||||
{ 172, 172, 0},
|
||||
{ 191, 191, 0},
|
||||
{ 191, 191, 18},
|
||||
{ 191, 191, 36},
|
||||
{ 191, 191, 55},
|
||||
{ 191, 191, 74},
|
||||
{ 191, 191, 92},
|
||||
{ 191, 191, 110},
|
||||
{ 191, 191, 129},
|
||||
{ 191, 191, 131},
|
||||
{ 191, 191, 143},
|
||||
{ 191, 191, 149},
|
||||
{ 191, 191, 161},
|
||||
{ 191, 191, 167},
|
||||
{ 191, 191, 179},
|
||||
{ 191, 191, 185},
|
||||
{ 191, 0, 0},
|
||||
{ 36, 95, 36},
|
||||
{ 54, 107, 54},
|
||||
{ 72, 119, 72},
|
||||
{ 90, 131, 90},
|
||||
{ 107, 143, 107},
|
||||
{ 125, 155, 125},
|
||||
{ 143, 167, 143},
|
||||
{ 161, 179, 161}
|
||||
};
|
||||
|
||||
static const INT16 pPaletteDeltaNuke[256][3] = {
|
||||
{ 6,-133,-133},
|
||||
{ 12,-125,-125},
|
||||
{ 18,-117,-117},
|
||||
{ 24,-109,-109},
|
||||
{ 30,-101,-101},
|
||||
{ 36, -93, -93},
|
||||
{ 42, -85, -85},
|
||||
{ 48, -77, -77},
|
||||
{ 54, -69, -69},
|
||||
{ 60, -61, -61},
|
||||
{ 66, -53, -53},
|
||||
{ 72, -45, -45},
|
||||
{ 78, -37, -37},
|
||||
{ 84, -29, -29},
|
||||
{ 90, -21, -21},
|
||||
{ 95, -14, -14},
|
||||
{ 101, -6, -6},
|
||||
{ 107, 2, 2},
|
||||
{ 113, 10, 10},
|
||||
{ 119, 18, 18},
|
||||
{ 125, 26, 26},
|
||||
{ 131, 34, 34},
|
||||
{ 137, 42, 42},
|
||||
{ 143, 50, 50},
|
||||
{ 149, 58, 58},
|
||||
{ 155, 66, 66},
|
||||
{ 161, 74, 74},
|
||||
{ 167, 82, 82},
|
||||
{ 173, 90, 90},
|
||||
{ 179, 98, 98},
|
||||
{ 185, 106, 106},
|
||||
{ 191, 113, 113},
|
||||
{ 48, -53, -29},
|
||||
{ 54, -46, -22},
|
||||
{ 60, -38, -14},
|
||||
{ 66, -30, -7},
|
||||
{ 72, -23, 0},
|
||||
{ 79, -15, 8},
|
||||
{ 85, -8, 16},
|
||||
{ 91, -1, 23},
|
||||
{ 96, 7, 31},
|
||||
{ 102, 15, 39},
|
||||
{ 108, 23, 47},
|
||||
{ 114, 30, 54},
|
||||
{ 120, 38, 62},
|
||||
{ 127, 46, 70},
|
||||
{ 133, 53, 77},
|
||||
{ 140, 62, 86},
|
||||
{ 48, -10, 38},
|
||||
{ 57, -2, 42},
|
||||
{ 63, 2, 46},
|
||||
{ 69, 6, 50},
|
||||
{ 75, 14, 54},
|
||||
{ 84, 18, 58},
|
||||
{ 90, 26, 62},
|
||||
{ 95, 30, 66},
|
||||
{ 101, 34, 70},
|
||||
{ 110, 42, 74},
|
||||
{ 119, 46, 78},
|
||||
{ 128, 50, 82},
|
||||
{ 134, 58, 86},
|
||||
{ 143, 66, 90},
|
||||
{ 152, 70, 94},
|
||||
{ 158, 78, 98},
|
||||
{ 0,-121,-109},
|
||||
{ 0,-113, -97},
|
||||
{ 0,-105, -85},
|
||||
{ 0, -97, -73},
|
||||
{ 0, -93, -65},
|
||||
{ 0, -85, -53},
|
||||
{ 0, -77, -41},
|
||||
{ 0, -73, -33},
|
||||
{ 0, -65, -17},
|
||||
{ 6, -57, -10},
|
||||
{ 12, -49, -2},
|
||||
{ 18, -41, 6},
|
||||
{ 24, -33, 14},
|
||||
{ 30, -25, 22},
|
||||
{ 36, -17, 30},
|
||||
{ 39, -14, 34},
|
||||
{ 0,-124,-106},
|
||||
{ 0,-106, -71},
|
||||
{ 0, -89, -37},
|
||||
{ 0, -71, -4},
|
||||
{ 0, -54, 28},
|
||||
{ 0, -37, 59},
|
||||
{ 0, -20, 88},
|
||||
{ 0, -4, 113},
|
||||
{ 9, 4, 113},
|
||||
{ 19, 12, 113},
|
||||
{ 29, 20, 113},
|
||||
{ 39, 28, 113},
|
||||
{ 48, 36, 113},
|
||||
{ 58, 44, 113},
|
||||
{ 68, 52, 113},
|
||||
{ 78, 59, 113},
|
||||
{ 0,-141,-125},
|
||||
{ 0,-141, -93},
|
||||
{ 0,-141, -61},
|
||||
{ 0,-141, -29},
|
||||
{ 0,-141, 2},
|
||||
{ 0,-141, 34},
|
||||
{ 0,-141, 66},
|
||||
{ 0,-141, 98},
|
||||
{ 0,-141, 113},
|
||||
{ 36, -93, 113},
|
||||
{ 60, -61, 113},
|
||||
{ 84, -29, 113},
|
||||
{ 107, 2, 113},
|
||||
{ 131, 34, 113},
|
||||
{ 155, 66, 113},
|
||||
{ 179, 98, 113},
|
||||
{ 0,-141, -2},
|
||||
{ 15,-105, 26},
|
||||
{ 30, -73, 46},
|
||||
{ 45, -41, 66},
|
||||
{ 60, -10, 82},
|
||||
{ 75, 22, 94},
|
||||
{ 90, 46, 106},
|
||||
{ 104, 70, 113},
|
||||
{ 0,-141,-141},
|
||||
{ 0,-109,-109},
|
||||
{ 0, -77, -77},
|
||||
{ 0, -45, -45},
|
||||
{ 0, -14, -14},
|
||||
{ 0, 18, 18},
|
||||
{ 0, 50, 50},
|
||||
{ 0, 82, 82},
|
||||
{ 0, 113, 113},
|
||||
{ 12, 113, 113},
|
||||
{ 24, 113, 113},
|
||||
{ 36, 113, 113},
|
||||
{ 48, 113, 113},
|
||||
{ 60, 113, 113},
|
||||
{ 72, 113, 113},
|
||||
{ 84, 113, 113},
|
||||
{ 95, 113, 113},
|
||||
{ 107, 113, 113},
|
||||
{ 119, 113, 113},
|
||||
{ 131, 113, 113},
|
||||
{ 143, 113, 113},
|
||||
{ 155, 113, 113},
|
||||
{ 167, 113, 113},
|
||||
{ 179, 113, 113},
|
||||
{ 0, -69, -69},
|
||||
{ 9, -49, -49},
|
||||
{ 18, -29, -29},
|
||||
{ 27, -10, -10},
|
||||
{ 39, 6, 6},
|
||||
{ 48, 22, 22},
|
||||
{ 57, 34, 34},
|
||||
{ 66, 50, 50},
|
||||
{ 85, 67, 113},
|
||||
{ 91, 74, 113},
|
||||
{ 96, 81, 113},
|
||||
{ 102, 88, 113},
|
||||
{ 108, 95, 113},
|
||||
{ 114, 102, 113},
|
||||
{ 120, 108, 113},
|
||||
{ 127, 113, 113},
|
||||
{ 101,-141, 34},
|
||||
{ 106,-126, 38},
|
||||
{ 111,-110, 43},
|
||||
{ 117, -94, 48},
|
||||
{ 123, -78, 53},
|
||||
{ 129, -62, 58},
|
||||
{ 134, -46, 63},
|
||||
{ 140, -30, 68},
|
||||
{ 145, -14, 73},
|
||||
{ 151, 1, 78},
|
||||
{ 157, 17, 83},
|
||||
{ 162, 33, 88},
|
||||
{ 168, 49, 93},
|
||||
{ 173, 65, 98},
|
||||
{ 179, 81, 103},
|
||||
{ 185, 98, 109},
|
||||
{ 24,-141, -54},
|
||||
{ 42,-114, -34},
|
||||
{ 61, -86, -14},
|
||||
{ 79, -59, 6},
|
||||
{ 97, -32, 25},
|
||||
{ 115, -6, 45},
|
||||
{ 135, 23, 65},
|
||||
{ 153, 50, 84},
|
||||
{ 191,-141, 113},
|
||||
{ 191,-109, 113},
|
||||
{ 191, -77, 113},
|
||||
{ 191, -45, 113},
|
||||
{ 191, -14, 113},
|
||||
{ 191, 18, 113},
|
||||
{ 191, 50, 113},
|
||||
{ 191, 82, 113},
|
||||
{ 0, 2,-141},
|
||||
{ 0, 113,-141},
|
||||
{ 24, 113,-109},
|
||||
{ 48, 113, -77},
|
||||
{ 72, 113, -45},
|
||||
{ 95, 113, -14},
|
||||
{ 119, 113, 18},
|
||||
{ 143, 113, 50},
|
||||
{ 16,-119,-129},
|
||||
{ 44, -82,-111},
|
||||
{ 73, -43, -92},
|
||||
{ 101, -6, -73},
|
||||
{ 127, 29, -53},
|
||||
{ 142, 48, -17},
|
||||
{ 156, 67, 21},
|
||||
{ 170, 86, 61},
|
||||
{ 31,-127,-141},
|
||||
{ 48,-121,-141},
|
||||
{ 64,-113,-141},
|
||||
{ 79,-107,-141},
|
||||
{ 95,-100,-141},
|
||||
{ 111, -93,-141},
|
||||
{ 127, -86,-141},
|
||||
{ 143, -77,-141},
|
||||
{ 149, -43,-109},
|
||||
{ 155, -29, -77},
|
||||
{ 161, -6, -45},
|
||||
{ 167, 18, -14},
|
||||
{ 191, -77, -77},
|
||||
{ 191, -14, -14},
|
||||
{ 191, 18, 18},
|
||||
{ 191, 50, 50},
|
||||
{ 18,-117,-141},
|
||||
{ 42, -84,-141},
|
||||
{ 61, -59,-141},
|
||||
{ 86, -26,-141},
|
||||
{ 104, -2,-141},
|
||||
{ 129, 31,-141},
|
||||
{ 154, 64,-141},
|
||||
{ 172, 89,-141},
|
||||
{ 191, 113,-141},
|
||||
{ 191, 113,-117},
|
||||
{ 191, 113, -92},
|
||||
{ 191, 113, -67},
|
||||
{ 191, 113, -42},
|
||||
{ 191, 113, -18},
|
||||
{ 191, 113, 6},
|
||||
{ 191, 113, 31},
|
||||
{ 191, 113, 34},
|
||||
{ 191, 113, 50},
|
||||
{ 191, 113, 58},
|
||||
{ 191, 113, 74},
|
||||
{ 191, 113, 82},
|
||||
{ 191, 113, 98},
|
||||
{ 191, 113, 106},
|
||||
{ 191,-141,-141},
|
||||
{ 36, -14, -93},
|
||||
{ 54, 2, -69},
|
||||
{ 72, 18, -45},
|
||||
{ 90, 34, -21},
|
||||
{ 107, 50, 2},
|
||||
{ 125, 66, 26},
|
||||
{ 143, 82, 50},
|
||||
{ 161, 98, 74}
|
||||
};
|
||||
|
||||
#endif
|
||||
+98
-173
@@ -91,6 +91,7 @@ consvar_t cv_menucaps = {"menucaps", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NUL
|
||||
// local copy of the palette for V_GetColor()
|
||||
RGBA_t *pLocalPalette = NULL;
|
||||
RGBA_t *pGammaCorrectedPalette = NULL;
|
||||
static RGBA_t *pFallbackFlashPal = NULL;
|
||||
|
||||
static size_t currentPaletteSize;
|
||||
|
||||
@@ -409,6 +410,58 @@ UINT32 V_GammaCorrect(UINT32 input, double power)
|
||||
return result.rgba;
|
||||
}
|
||||
|
||||
#include "v_paldeltas.h"
|
||||
// remaps a palette with given "deltas"
|
||||
// this is used with premade deltas between the srb2 palette and its both flashpals
|
||||
// so we may approximate generate our own, should the current palette miss them
|
||||
static void ApplyPaletteDelta(const RGBA_t *pal_in, RGBA_t *pal_out, const INT16 pal_delta[][3])
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
INT16 r = (INT16)pal_in[i].s.red + pal_delta[i][0];
|
||||
INT16 g = (INT16)pal_in[i].s.green + pal_delta[i][1];
|
||||
INT16 b = (INT16)pal_in[i].s.blue + pal_delta[i][2];
|
||||
pal_out[i].s.red = (UINT8)CLAMP(r, 0 , 255);
|
||||
pal_out[i].s.green = (UINT8)CLAMP(g, 0 , 255);
|
||||
pal_out[i].s.blue = (UINT8)CLAMP(b, 0 , 255);
|
||||
pal_out[i].s.alpha = 0xFF; // pal_in[i].s.alpha
|
||||
}
|
||||
}
|
||||
|
||||
static void GenerateFlashPalettes(void)
|
||||
{
|
||||
size_t i, palsize;
|
||||
RGBA_t *pFlashPalGammaCorrectedPalette = NULL;
|
||||
|
||||
// generate flashpalettes if the current palette does not provide any subpalettes
|
||||
if (currentPaletteSize >= (14 * (256 * 3))) // 14 palettes are in playpal
|
||||
return;
|
||||
|
||||
palsize = (2*256);
|
||||
|
||||
pFallbackFlashPal = Z_Malloc(sizeof(*pFallbackFlashPal)*palsize, PU_STATIC, NULL);
|
||||
pFlashPalGammaCorrectedPalette = Z_Malloc(sizeof (*pFlashPalGammaCorrectedPalette)*palsize, PU_STATIC, NULL);
|
||||
|
||||
// apply our deltas to the palettes to get the white and red "flashes"
|
||||
ApplyPaletteDelta(pLocalPalette, pFallbackFlashPal, pPaletteDeltaFlash);
|
||||
ApplyPaletteDelta(pLocalPalette, pFallbackFlashPal+256, pPaletteDeltaNuke);
|
||||
|
||||
// apply colour and gamma correction if needed
|
||||
if (Cubeapply)
|
||||
{
|
||||
for (i = 0; i < palsize; i++)
|
||||
{
|
||||
pFlashPalGammaCorrectedPalette[i].rgba = V_GammaDecode(pFallbackFlashPal[i].rgba);
|
||||
V_CubeApply(&pFlashPalGammaCorrectedPalette[i]);
|
||||
pFallbackFlashPal[i].rgba = V_GammaEncode(pFlashPalGammaCorrectedPalette[i].rgba);
|
||||
}
|
||||
}
|
||||
|
||||
Z_Free(pFlashPalGammaCorrectedPalette);
|
||||
}
|
||||
|
||||
// keep a copy of the palette so that we can get the RGB value for a color index at any time.
|
||||
static void LoadPalette(const char *lumpname)
|
||||
{
|
||||
@@ -428,6 +481,8 @@ static void LoadPalette(const char *lumpname)
|
||||
|
||||
Z_Free(pLocalPalette);
|
||||
Z_Free(pGammaCorrectedPalette);
|
||||
Z_Free(pFallbackFlashPal);
|
||||
pFallbackFlashPal = NULL;
|
||||
|
||||
pLocalPalette = Z_Malloc(sizeof (*pLocalPalette)*palsize, PU_STATIC, NULL);
|
||||
pGammaCorrectedPalette = Z_Malloc(sizeof (*pGammaCorrectedPalette)*palsize, PU_STATIC, NULL);
|
||||
@@ -447,12 +502,19 @@ static void LoadPalette(const char *lumpname)
|
||||
pLocalPalette[i].s.alpha = 0xFF;
|
||||
|
||||
pGammaCorrectedPalette[i].rgba = V_GammaDecode(pLocalPalette[i].rgba);
|
||||
}
|
||||
|
||||
if (!Cubeapply)
|
||||
continue;
|
||||
GenerateFlashPalettes();
|
||||
|
||||
V_CubeApply(&pGammaCorrectedPalette[i]);
|
||||
pLocalPalette[i].rgba = V_GammaEncode(pGammaCorrectedPalette[i].rgba);
|
||||
// gotta apply any colour and gamma adjustments afterwards
|
||||
// so we dont double apply it to the generated flashpals
|
||||
if (Cubeapply)
|
||||
{
|
||||
for (i = 0; i < palsize; i++)
|
||||
{
|
||||
V_CubeApply(&pGammaCorrectedPalette[i]);
|
||||
pLocalPalette[i].rgba = V_GammaEncode(pGammaCorrectedPalette[i].rgba);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -543,6 +605,7 @@ void V_ReloadPalette(void)
|
||||
// -------------+
|
||||
void V_SetPalette(INT32 palettenum)
|
||||
{
|
||||
RGBA_t *pal = NULL;
|
||||
if (!pLocalPalette)
|
||||
V_ReloadPalette();
|
||||
|
||||
@@ -554,24 +617,47 @@ void V_SetPalette(INT32 palettenum)
|
||||
if (palettenum == 0)
|
||||
{
|
||||
palettenum = cv_palettenum.value;
|
||||
|
||||
if (palettenum * 256U > currentPaletteSize - 256)
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, "cv_palettenum %d out of range\n", palettenum);
|
||||
palettenum = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// in many cases custom palettes do not provide the needed subpalettes for flashpals to work
|
||||
// before this would mean the renderer gets passed random data out of allocated memory bounds
|
||||
// which was not very cool :chonkbuncle:
|
||||
// gladly 2.1 only actually has 2 different subpalettes
|
||||
// one for "white flash" and one red/pinkish one for nuke
|
||||
// since we checked the palette earlier we should have generated those ourselves
|
||||
if (((size_t)palettenum >= currentPaletteSize / (256 * 3)))
|
||||
{
|
||||
CONS_Debug(DBG_RENDER, "palettenum %d out of range\n", palettenum);
|
||||
|
||||
// if for some reason we did not generate flashpals
|
||||
// just fall back to the main palette i guess?
|
||||
if (pFallbackFlashPal != NULL)
|
||||
{
|
||||
if (palettenum == PAL_NUKE)
|
||||
pal = &pFallbackFlashPal[256];
|
||||
else
|
||||
pal = pFallbackFlashPal;
|
||||
}
|
||||
else
|
||||
{
|
||||
pal = pLocalPalette;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pal = &pLocalPalette[palettenum*256];
|
||||
}
|
||||
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
HWR_SetPalette(&pLocalPalette[palettenum*256]);
|
||||
HWR_SetPalette(pal);
|
||||
#if defined (__unix__) || defined (UNIXCOMMON) || defined (HAVE_SDL)
|
||||
else
|
||||
#endif
|
||||
#endif
|
||||
if (rendermode != render_none)
|
||||
I_SetPalette(&pLocalPalette[palettenum*256]);
|
||||
I_SetPalette(pal);
|
||||
}
|
||||
|
||||
void V_SetPaletteLump(const char *pal)
|
||||
@@ -3309,167 +3395,6 @@ INT32 V_SubStringLengthToFit(const char *string, INT32 width, INT32 option)
|
||||
return max(i-1, 0);
|
||||
}
|
||||
|
||||
char V_GetSkincolorChar(INT32 color)
|
||||
{
|
||||
char cstart = 0x80;
|
||||
|
||||
switch (color)
|
||||
{
|
||||
case SKINCOLOR_WHITE:
|
||||
case SKINCOLOR_SILVER:
|
||||
case SKINCOLOR_SLATE:
|
||||
cstart = 0x80; // White
|
||||
break;
|
||||
|
||||
case SKINCOLOR_GREY:
|
||||
case SKINCOLOR_NICKEL:
|
||||
case SKINCOLOR_BLACK:
|
||||
case SKINCOLOR_SKUNK:
|
||||
case SKINCOLOR_JET:
|
||||
cstart = 0x86; // V_GRAYMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SEPIA:
|
||||
case SKINCOLOR_BEIGE:
|
||||
case SKINCOLOR_WALNUT:
|
||||
case SKINCOLOR_BROWN:
|
||||
case SKINCOLOR_LEATHER:
|
||||
case SKINCOLOR_RUST:
|
||||
case SKINCOLOR_WRISTWATCH:
|
||||
cstart = 0x8e; // V_BROWNMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_FAIRY:
|
||||
case SKINCOLOR_SALMON:
|
||||
case SKINCOLOR_PINK:
|
||||
case SKINCOLOR_ROSE:
|
||||
case SKINCOLOR_BRICK:
|
||||
case SKINCOLOR_LEMONADE:
|
||||
case SKINCOLOR_BUBBLEGUM:
|
||||
case SKINCOLOR_LILAC:
|
||||
cstart = 0x8d; // V_PINKMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_CINNAMON:
|
||||
case SKINCOLOR_RUBY:
|
||||
case SKINCOLOR_RASPBERRY:
|
||||
case SKINCOLOR_CHERRY:
|
||||
case SKINCOLOR_RED:
|
||||
case SKINCOLOR_CRIMSON:
|
||||
case SKINCOLOR_MAROON:
|
||||
case SKINCOLOR_FLAME:
|
||||
case SKINCOLOR_SCARLET:
|
||||
case SKINCOLOR_KETCHUP:
|
||||
cstart = 0x85; // V_REDMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_DAWN:
|
||||
case SKINCOLOR_SUNSET:
|
||||
case SKINCOLOR_CREAMSICLE:
|
||||
case SKINCOLOR_ORANGE:
|
||||
case SKINCOLOR_PUMPKIN:
|
||||
case SKINCOLOR_ROSEWOOD:
|
||||
case SKINCOLOR_BURGUNDY:
|
||||
case SKINCOLOR_TANGERINE:
|
||||
cstart = 0x87; // V_ORANGEMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_PEACH:
|
||||
case SKINCOLOR_CARAMEL:
|
||||
case SKINCOLOR_CREAM:
|
||||
cstart = 0x8f; // V_PEACHMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_GOLD:
|
||||
case SKINCOLOR_ROYAL:
|
||||
case SKINCOLOR_BRONZE:
|
||||
case SKINCOLOR_COPPER:
|
||||
case SKINCOLOR_THUNDER:
|
||||
cstart = 0x8a; // V_GOLDMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_POPCORN:
|
||||
case SKINCOLOR_QUARRY:
|
||||
case SKINCOLOR_YELLOW:
|
||||
case SKINCOLOR_MUSTARD:
|
||||
case SKINCOLOR_CROCODILE:
|
||||
case SKINCOLOR_OLIVE:
|
||||
cstart = 0x82; // V_YELLOWMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_ARTICHOKE:
|
||||
case SKINCOLOR_VOMIT:
|
||||
case SKINCOLOR_GARDEN:
|
||||
case SKINCOLOR_TEA:
|
||||
case SKINCOLOR_PISTACHIO:
|
||||
cstart = 0x8b; // V_TEAMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_LIME:
|
||||
case SKINCOLOR_HANDHELD:
|
||||
case SKINCOLOR_MOSS:
|
||||
case SKINCOLOR_CAMOUFLAGE:
|
||||
case SKINCOLOR_ROBOHOOD:
|
||||
case SKINCOLOR_MINT:
|
||||
case SKINCOLOR_GREEN:
|
||||
case SKINCOLOR_PINETREE:
|
||||
case SKINCOLOR_EMERALD:
|
||||
case SKINCOLOR_SWAMP:
|
||||
case SKINCOLOR_DREAM:
|
||||
case SKINCOLOR_PLAGUE:
|
||||
case SKINCOLOR_ALGAE:
|
||||
cstart = 0x83; // V_GREENMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_CARIBBEAN:
|
||||
case SKINCOLOR_AZURE:
|
||||
case SKINCOLOR_AQUA:
|
||||
case SKINCOLOR_TEAL:
|
||||
case SKINCOLOR_CYAN:
|
||||
case SKINCOLOR_JAWZ:
|
||||
case SKINCOLOR_CERULEAN:
|
||||
case SKINCOLOR_NAVY:
|
||||
case SKINCOLOR_SAPPHIRE:
|
||||
cstart = 0x88; // V_SKYMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_PIGEON:
|
||||
case SKINCOLOR_PLATINUM:
|
||||
case SKINCOLOR_STEEL:
|
||||
cstart = 0x8c; // V_STEELMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_PERIWINKLE:
|
||||
case SKINCOLOR_BLUE:
|
||||
case SKINCOLOR_BLUEBERRY:
|
||||
case SKINCOLOR_NOVA:
|
||||
cstart = 0x84; // V_BLUEMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_ULTRAVIOLET:
|
||||
case SKINCOLOR_PURPLE:
|
||||
case SKINCOLOR_FUCHSIA:
|
||||
cstart = 0x81; // V_PURPLEMAP
|
||||
break;
|
||||
|
||||
case SKINCOLOR_PASTEL:
|
||||
case SKINCOLOR_MOONSLAM:
|
||||
case SKINCOLOR_DUSK:
|
||||
case SKINCOLOR_TOXIC:
|
||||
case SKINCOLOR_MAUVE:
|
||||
case SKINCOLOR_LAVENDER:
|
||||
case SKINCOLOR_BYZANTIUM:
|
||||
case SKINCOLOR_POMEGRANATE:
|
||||
cstart = 0x89; // V_LAVENDERMAP
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return cstart;
|
||||
}
|
||||
|
||||
INT32 V_SkinColorToHighlightcolor(skincolors_t color)
|
||||
{
|
||||
switch (color)
|
||||
|
||||
@@ -287,8 +287,6 @@ INT32 V_ThinSubStringWidth(const char *string, INT32 length, INT32 option);
|
||||
// Find maximum length for substring taken from current string to fit into given width
|
||||
INT32 V_SubStringLengthToFit(const char *string, INT32 width, INT32 option);
|
||||
|
||||
char V_GetSkincolorChar(INT32 color);
|
||||
|
||||
INT32 V_SkinColorToHighlightcolor(skincolors_t color);
|
||||
|
||||
// this is pretty dumb, but has to be done like this, otherwise the fps counter just disappears sometimes for no reason lol
|
||||
|
||||
+16
-4
@@ -365,7 +365,7 @@ static inline INT32 W_MakeFileMD5(const char *filename, void *resblock)
|
||||
|
||||
if ((fhandle = fopen(filename, "rb")) != NULL)
|
||||
{
|
||||
tic_t t = I_GetTime();
|
||||
precise_t t = I_GetPreciseTime();
|
||||
|
||||
CONS_Debug(DBG_SETUP, "Making MD5 for %s\n",filename);
|
||||
|
||||
@@ -376,7 +376,7 @@ static inline INT32 W_MakeFileMD5(const char *filename, void *resblock)
|
||||
}
|
||||
|
||||
CONS_Debug(DBG_SETUP, "MD5 calc for %s took %f seconds\n",
|
||||
filename, (float)(I_GetTime() - t)/NEWTICRATE);
|
||||
filename, (float)(I_GetPreciseTime() - t)/I_GetPrecisePrecision());
|
||||
|
||||
fclose(fhandle);
|
||||
return 0;
|
||||
@@ -2589,6 +2589,18 @@ static int W_CheckFileContains(const char *filename, lumpchecklist_t *checklist)
|
||||
return contains;
|
||||
}
|
||||
|
||||
int W_CheckAutoLoadContainsMap(const char *filename)
|
||||
{
|
||||
// for now this checks for map marker
|
||||
static lumpchecklist_t autoloadblacklist[] =
|
||||
{
|
||||
{"MAP", 3},
|
||||
{NULL, 0},
|
||||
};
|
||||
|
||||
return W_CheckFileContains(filename, autoloadblacklist);
|
||||
}
|
||||
|
||||
int W_CheckPostLoadList(const char *filename)
|
||||
{
|
||||
static lumpchecklist_t postloadlist[] =
|
||||
@@ -2601,7 +2613,6 @@ int W_CheckPostLoadList(const char *filename)
|
||||
{"SOC_", 4},
|
||||
{"MAINCFG", 7},
|
||||
{"OBJCTCFG", 8},
|
||||
{"MAP", 3},
|
||||
|
||||
{NULL, 0},
|
||||
};
|
||||
@@ -2662,11 +2673,12 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
|
||||
{
|
||||
if (vsizecache[realentry] == 0)
|
||||
continue;
|
||||
|
||||
vlumps[i].size = vsizecache[realentry];
|
||||
|
||||
const char *name = (fileinfo + realentry)->name;
|
||||
|
||||
if (strlen(name) == 5 && memcmp(name, "MAP", 3) == 0)
|
||||
if (strnlen(name, 8) == 5 && memcmp(name, "MAP", 3) == 0)
|
||||
{
|
||||
numlumps--; // We skip map marker, so 1 of entries becomes empty
|
||||
continue; // This will skip i++ so we will write to same entry
|
||||
|
||||
@@ -241,6 +241,7 @@ void W_VerifyFileMD5(UINT16 wadfilenum, const char *matchmd5);
|
||||
|
||||
int W_VerifyNMUSlumps(const char *filename, FILE *handle, boolean exit_on_error);
|
||||
|
||||
int W_CheckAutoLoadContainsMap(const char *filename);
|
||||
int W_CheckPostLoadList(const char *filename);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
+10
-2
@@ -523,11 +523,19 @@ void Z_CheckHeap(INT32 tag)
|
||||
#ifdef VALGRIND_MEMPOOL_EXISTS
|
||||
if (!VALGRIND_MEMPOOL_EXISTS(block))
|
||||
{
|
||||
I_Error("Z_CheckHeap %d: block %u"
|
||||
I_Error("Z_CheckHeap :"
|
||||
#ifdef ZDEBUG
|
||||
" %s %d"
|
||||
#endif
|
||||
" block %u"
|
||||
#ifdef ZDEBUG
|
||||
" (owned by %s:%d)"
|
||||
#endif
|
||||
" should not exist", i, blocknumon
|
||||
" should not exist"
|
||||
#ifdef ZDEBUG
|
||||
, file, line
|
||||
#endif
|
||||
, blocknumon
|
||||
#ifdef ZDEBUG
|
||||
, block->ownerfile, block->ownerline
|
||||
#endif
|
||||
|
||||
Reference in new issue
Block a user