Compare commits
82
Commits
netstuff
...
optifindvar
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
15bb99d27d | ||
|
|
7fb21c35ba | ||
|
|
f6a0430a40 | ||
|
|
ab209448d1 | ||
|
|
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 | ||
|
|
3c70598aea | ||
|
|
1ec29c1c94 | ||
|
|
fedccd25b9 | ||
|
|
1e51365cad | ||
|
|
94026e4331 | ||
|
|
2084cdc6d5 | ||
|
|
1b22c3af19 | ||
|
|
3e327263c9 | ||
|
|
7c24d92613 | ||
|
|
ba808307e9 | ||
|
|
014a22e933 | ||
|
|
3f3ba9e993 | ||
|
|
2f684bba95 | ||
|
|
a287a6419f | ||
|
|
6f2aba7ee3 | ||
|
|
a9a0d4bed8 | ||
|
|
355c78e075 | ||
|
|
4623f8aff2 | ||
|
|
1265bbba2e | ||
|
|
fdccf868cc | ||
|
|
c84724da37 | ||
|
|
00bc8bc149 | ||
|
|
f12b55f63b | ||
|
|
3e476d7658 | ||
|
|
7dbb08315c | ||
|
|
b1ff1bb531 | ||
|
|
8eaf4a73f4 | ||
|
|
9ccd62b5cb | ||
|
|
8e67e0bace | ||
|
|
fd2c208612 | ||
|
|
8f3b7158e3 | ||
|
|
b76ce836a0 | ||
|
|
fd1e415731 | ||
|
|
41c887f2bf | ||
|
|
8091d825d5 | ||
|
|
699113fb25 | ||
|
|
3996abef36 |
No files matched your search
+1
-1
@@ -54,7 +54,7 @@ set(SRB2_CORE_SOURCES
|
||||
string.c
|
||||
tables.c
|
||||
v_video.c
|
||||
w_wad.c
|
||||
w_wad.cpp
|
||||
y_inter.c
|
||||
z_zone.cpp
|
||||
)
|
||||
|
||||
+4
-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
|
||||
|
||||
@@ -295,6 +295,7 @@ opts+=$(debug_opts)
|
||||
|
||||
opts+=$(foreach v,$(passthru_opts),$(if $($(v)),-D$(v)))
|
||||
|
||||
CWFLAGS+=-std=gnu17
|
||||
CXXFLAGS+=-std=c++17 # force c17 for c++ since most vpss run older ubuntu versions with old compilers
|
||||
|
||||
opts+=$(WFLAGS) $(CFLAGS)
|
||||
|
||||
+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
|
||||
+63
-1
@@ -1165,6 +1165,39 @@ void VS_Print(vsbuf_t *buf, const char *data)
|
||||
//
|
||||
// =========================================================================
|
||||
|
||||
#define NAME cvar_map_t
|
||||
#define KEY_TY const char *
|
||||
#define VAL_TY consvar_t *
|
||||
#define HASH_FN FNV1a_HashLowercaseString
|
||||
#define CMPR_FN vt_cmpr_casestring
|
||||
#include "verstable.h"
|
||||
|
||||
#define NAME netvar_map_t
|
||||
#define KEY_TY UINT16
|
||||
#define VAL_TY consvar_t *
|
||||
#define HASH_FN vt_hash_integer
|
||||
#define CMPR_FN vt_cmpr_integer
|
||||
#include "verstable.h"
|
||||
|
||||
static cvar_map_t cvar_map;
|
||||
static netvar_map_t netvar_map;
|
||||
|
||||
CONSTRUCTOR static void CV_InitMap(void)
|
||||
{
|
||||
// ensure the map is initialized
|
||||
cvar_map_t_init(&cvar_map);
|
||||
cvar_map_t_reserve(&cvar_map, 512);
|
||||
|
||||
netvar_map_t_init(&netvar_map);
|
||||
netvar_map_t_reserve(&netvar_map, 256);
|
||||
}
|
||||
|
||||
DESTRUCTOR static void CV_DestroyMap(void)
|
||||
{
|
||||
cvar_map_t_cleanup(&cvar_map);
|
||||
netvar_map_t_cleanup(&netvar_map);
|
||||
}
|
||||
|
||||
static const char *cv_null_string = "";
|
||||
|
||||
/** Searches if a variable has been registered.
|
||||
@@ -1175,11 +1208,17 @@ static const char *cv_null_string = "";
|
||||
*/
|
||||
consvar_t *CV_FindVar(const char *name)
|
||||
{
|
||||
consvar_t *cvar;
|
||||
cvar_map_t_itr it = cvar_map_t_get(&cvar_map, name);
|
||||
if (!cvar_map_t_is_end(it))
|
||||
return it.data->val;
|
||||
|
||||
// fallback linear search
|
||||
/*
|
||||
consvar_t *cvar;
|
||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||
if (fasticmp(name, cvar->name))
|
||||
return cvar;
|
||||
*/
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -1213,11 +1252,17 @@ static inline UINT16 CV_ComputeNetid(const char *s)
|
||||
*/
|
||||
static consvar_t *CV_FindNetVar(UINT16 netid)
|
||||
{
|
||||
netvar_map_t_itr it = netvar_map_t_get(&netvar_map, netid);
|
||||
if (!netvar_map_t_is_end(it))
|
||||
return it.data->val;
|
||||
|
||||
/*
|
||||
consvar_t *cvar;
|
||||
|
||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||
if (cvar->netid == netid)
|
||||
return cvar;
|
||||
*/
|
||||
|
||||
if (netid == 44542) // ouch this hack
|
||||
return &cv_karteliminatelast;
|
||||
@@ -1283,6 +1328,11 @@ void CV_RegisterVar(consvar_t *variable)
|
||||
|
||||
// the SetValue will set this bit
|
||||
variable->flags &= ~CV_MODIFIED;
|
||||
|
||||
cvar_map_t_insert(&cvar_map, variable->name, variable);
|
||||
|
||||
if (variable->flags & CV_NETVAR)
|
||||
netvar_map_t_insert(&netvar_map, variable->netid, variable);
|
||||
}
|
||||
|
||||
/** Finds the string value of a console variable.
|
||||
@@ -1588,9 +1638,21 @@ size_t CV_LoadNetVars(const UINT8 *bufstart)
|
||||
// prevent "invalid command received"
|
||||
serverloading = true;
|
||||
|
||||
// we can use our netvar map instead of going through all cvars each time
|
||||
netvar_map_t_itr it;
|
||||
for (it = netvar_map_t_first(&netvar_map);
|
||||
!netvar_map_t_is_end(it);
|
||||
it = netvar_map_t_next(it))
|
||||
{
|
||||
cvar = it.data->val;
|
||||
Setvalue(cvar, cvar->defaultvalue, true);
|
||||
}
|
||||
|
||||
/*
|
||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||
if (cvar->flags & CV_NETVAR)
|
||||
Setvalue(cvar, cvar->defaultvalue, true);
|
||||
*/
|
||||
|
||||
count = READUINT16(p);
|
||||
while (count--)
|
||||
|
||||
+28
-66
@@ -50,8 +50,8 @@ I_mutex con_mutex;
|
||||
// to avoid infinite SIGABRT recursion in the signal handler
|
||||
// due to poisoned locks or mach-o kernel not supporting locks in signals
|
||||
// or something like that. idk
|
||||
# define Lock_state() if (!I_In_Exiting_Signal_Handler()) { I_LockMutex(&con_mutex); }
|
||||
# define Unlock_state() if (!I_In_Exiting_Signal_Handler()) { I_UnlockMutex(con_mutex); }
|
||||
# define Lock_state() if (!I_In_Exiting_Signal_Handler()) { I_lock_mutex(&con_mutex); }
|
||||
# define Unlock_state() if (!I_In_Exiting_Signal_Handler()) { I_unlock_mutex(con_mutex); }
|
||||
#else /*HAVE_THREADS*/
|
||||
# define Lock_state()
|
||||
# define Unlock_state()
|
||||
@@ -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
|
||||
//
|
||||
|
||||
+8
-1
@@ -13,6 +13,10 @@
|
||||
#ifndef __CONSOLE__
|
||||
#define __CONSOLE__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "d_event.h"
|
||||
#include "command.h"
|
||||
#include "i_threads.h"
|
||||
@@ -45,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
|
||||
@@ -63,4 +66,8 @@ boolean CON_Ready(void);
|
||||
|
||||
void CON_LogMessage(const char *msg);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+51
-21
@@ -100,6 +100,10 @@ static int map_icon_request_count; // current count of icon requests sent
|
||||
static UINT8 *map_icon_data;
|
||||
static patch_t *map_icon;
|
||||
|
||||
// if true, signals the game to only load addons AND gamestate
|
||||
// instead of fully joining a server
|
||||
static boolean cl_addonsonly = false;
|
||||
|
||||
plrinfo playerinfo[MAXPLAYERS] = {};
|
||||
SINT8 joinnode = 0; // used for CL_VIEWSERVER
|
||||
|
||||
@@ -173,11 +177,11 @@ static UINT16 resynch_delay[MAXNETNODES]; // delay time before the player can be
|
||||
static UINT32 resynch_status[MAXNETNODES]; // 0 bit means synched for that player, 1 means possibly desynched
|
||||
static UINT8 resynch_sent[MAXNETNODES][MAXPLAYERS]; // what synch packets have we attempted to send to the player
|
||||
static UINT8 resynch_inprogress[MAXNETNODES];
|
||||
static UINT8 resynch_local_inprogress = false; // WE are desynched and getting packets to fix it.
|
||||
UINT8 hu_resynching = 0;
|
||||
static boolean resynch_local_inprogress = false; // WE are desynched and getting packets to fix it.
|
||||
boolean hu_resynching = false;
|
||||
|
||||
#ifdef SATURNPAK
|
||||
UINT8 hu_redownloadinggamestate = 0;
|
||||
boolean hu_redownloadinggamestate = false;
|
||||
static UINT8 gamestate_resend_counter[MAXNETNODES];
|
||||
#endif
|
||||
|
||||
@@ -192,7 +196,7 @@ static UINT8 mynode; // my address pointofview server
|
||||
|
||||
#ifdef SATURNPAK
|
||||
static boolean cl_redownloadinggamestate = false;
|
||||
boolean is_client_saturn[MAXNETNODES];
|
||||
static boolean is_client_saturn[MAXNETNODES];
|
||||
#endif
|
||||
|
||||
#ifdef SATURNJOIN
|
||||
@@ -1411,6 +1415,7 @@ static void CL_DrawConnectionStatus(void)
|
||||
// Buttons
|
||||
V_DrawFill(8, BASEVIDHEIGHT - 14, BASEVIDWIDTH - 16, 12, 239);
|
||||
V_DrawThinString(16, BASEVIDHEIGHT - 12, V_ALLOWLOWERCASE, va("[%sESC%s] = Abort", "\x82", "\x80"));
|
||||
V_DrawCenteredThinString(BASEVIDWIDTH/2, BASEVIDHEIGHT - 12, V_ALLOWLOWERCASE, va("[%sSPACE%s] = Load Addons", "\x82", "\x80"));
|
||||
V_DrawRightAlignedThinString(BASEVIDWIDTH - 12, BASEVIDHEIGHT - 12, V_ALLOWLOWERCASE, va("[%sENTER%s] = Join", "\x82", "\x80"));
|
||||
}
|
||||
else if (filedownload.current != -1)
|
||||
@@ -2553,7 +2558,7 @@ static boolean CL_ServerConnectionSearchTicker(tic_t *asksent)
|
||||
return true;
|
||||
}
|
||||
|
||||
cl_mode = (cv_serverinfoscreen.value) ? CL_VIEWSERVER : CL_CHECKFILES;
|
||||
cl_mode = cv_serverinfoscreen.value ? CL_VIEWSERVER : CL_CHECKFILES;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2574,6 +2579,17 @@ static boolean CL_ServerConnectionSearchTicker(tic_t *asksent)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void FreeMapIcon(void)
|
||||
{
|
||||
if (map_icon != NULL)
|
||||
Patch_Free(map_icon);
|
||||
map_icon = NULL;
|
||||
if (map_icon_data != NULL)
|
||||
Z_Free(map_icon_data);
|
||||
map_icon_data = NULL;
|
||||
map_icon_request_count = 0;
|
||||
}
|
||||
|
||||
/** Called by CL_ConnectToServer
|
||||
*
|
||||
* \param tmpsave The name of the gamestate file???
|
||||
@@ -2598,7 +2614,7 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic
|
||||
|
||||
case CL_ASKFULLFILELIST:
|
||||
if (cl_lastcheckedfilecount == UINT16_MAX) // All files retrieved
|
||||
cl_mode = (cv_serverinfoscreen.value) ? CL_VIEWSERVER : CL_CHECKFILES;
|
||||
cl_mode = cv_serverinfoscreen.value ? CL_VIEWSERVER : CL_CHECKFILES;
|
||||
else if (fileneedednum != cl_lastcheckedfilecount || I_GetTime() >= *asksent)
|
||||
{
|
||||
if (CL_AskFileList(fileneedednum))
|
||||
@@ -2731,7 +2747,19 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic
|
||||
{
|
||||
// Gamestate is now handled within CL_LoadReceivedSavegame()
|
||||
CL_LoadReceivedSavegame(false);
|
||||
cl_mode = CL_CONNECTED;
|
||||
|
||||
if (cl_addonsonly)
|
||||
{
|
||||
// close connection after savegame load
|
||||
// we want the actual server state
|
||||
// in case theres some stuff like records to be synched
|
||||
cl_mode = CL_ABORTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
cl_mode = CL_CONNECTED;
|
||||
}
|
||||
|
||||
break;
|
||||
} // don't break case continue to CL_CONNECTED
|
||||
else
|
||||
@@ -2745,7 +2773,6 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic
|
||||
case CL_ABORTED:
|
||||
cl_mode = CL_SEARCHING;
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
GetPackets();
|
||||
@@ -2756,6 +2783,11 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic
|
||||
{
|
||||
INT32 key;
|
||||
|
||||
if (I_Interrupted())
|
||||
{
|
||||
I_Quit();
|
||||
}
|
||||
|
||||
I_OsPolling();
|
||||
|
||||
if (cl_mode == CL_CONFIRMCONNECT)
|
||||
@@ -2767,24 +2799,21 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic
|
||||
{
|
||||
if (key == KEY_ENTER || key == KEY_JOY1)
|
||||
{
|
||||
cl_addonsonly = false;
|
||||
cl_mode = CL_CHECKFILES;
|
||||
if (map_icon != NULL)
|
||||
Patch_Free(map_icon);
|
||||
map_icon = NULL;
|
||||
if (map_icon_data != NULL)
|
||||
Z_Free(map_icon_data);
|
||||
map_icon_data = NULL;
|
||||
FreeMapIcon();
|
||||
}
|
||||
else if (key == KEY_ESCAPE || key == KEY_JOY1+1)
|
||||
{
|
||||
cl_mode = CL_ABORTED;
|
||||
if (map_icon != NULL)
|
||||
Patch_Free(map_icon);
|
||||
map_icon = NULL;
|
||||
if (map_icon_data != NULL)
|
||||
Z_Free(map_icon_data);
|
||||
map_icon_data = NULL;
|
||||
map_icon_request_count = 0;
|
||||
cl_addonsonly = false;
|
||||
FreeMapIcon();
|
||||
}
|
||||
else if (key == KEY_SPACE || key == KEY_JOY1+2)
|
||||
{
|
||||
cl_addonsonly = true;
|
||||
cl_mode = CL_CHECKFILES;
|
||||
FreeMapIcon();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2793,6 +2822,7 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic
|
||||
{
|
||||
CONS_Printf(M_GetText("Network game synchronization aborted.\n"));
|
||||
CL_AbortConnection();
|
||||
cl_addonsonly = false;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
+2
-2
@@ -654,9 +654,9 @@ 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
|
||||
|
||||
|
||||
+41
-21
@@ -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))
|
||||
{
|
||||
@@ -2023,7 +2043,7 @@ void D_SRB2Main(void)
|
||||
if (M_CheckProtoParam("replay"))
|
||||
{
|
||||
const char *replayurl = M_GetProtoParam();
|
||||
char *replayname = strrchr(replayurl, '/');
|
||||
gconst char *replayname = strrchr(replayurl, '/');
|
||||
|
||||
if (!replayname || !replayurl)
|
||||
I_Error("REPLAY: Invalid URL.");
|
||||
|
||||
+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"))
|
||||
{
|
||||
|
||||
@@ -13,6 +13,10 @@
|
||||
#ifndef __DEHACKED_H__
|
||||
#define __DEHACKED_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "m_fixed.h" // for get_number
|
||||
#include "info.h"
|
||||
|
||||
@@ -71,4 +75,9 @@ typedef struct
|
||||
} MYFILE;
|
||||
#define myfeof(a) (a->data + a->size <= a->curpos)
|
||||
char *myfgets(char *buf, size_t bufsize, MYFILE *f);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+7
-16
@@ -516,22 +516,6 @@ extern boolean capslock;
|
||||
// i_system.c, replace getchar() once the keyboard has been appropriated
|
||||
INT32 I_GetKey(void);
|
||||
|
||||
/* http://www.cse.yorku.ca/~oz/hash.html */
|
||||
static inline
|
||||
UINT32 quickncasehash (const char *p, size_t n)
|
||||
{
|
||||
size_t i = 0;
|
||||
UINT32 x = 5381;
|
||||
|
||||
while (i < n && p[i])
|
||||
{
|
||||
x = (x * 33) ^ tolower(p[i]);
|
||||
i++;
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
#ifndef __cplusplus
|
||||
#ifndef min // Double-Check with WATTCP-32's cdefs.h
|
||||
#define min(x, y) (((x) < (y)) ? (x) : (y))
|
||||
@@ -589,6 +573,13 @@ UINT32 quickncasehash (const char *p, size_t n)
|
||||
// NOTE: you WILL have nasal troubles if the variable is not initialized
|
||||
#define CLEANUP(f) __attribute__((__cleanup__(f)))
|
||||
|
||||
// the GNU constructor and destructor attributes
|
||||
// The constructor attribute causes the function to be called automatically before execution enters main ().
|
||||
// Similarly, the destructor attribute causes the function to be called automatically after main () has completed or exit () has been called.
|
||||
// Functions with these attributes are useful for initializing data that will be used implicitly during the execution of the program.
|
||||
#define CONSTRUCTOR __attribute__((constructor, used))
|
||||
#define DESTRUCTOR __attribute__((destructor, used))
|
||||
|
||||
// An assert-type mechanism.
|
||||
#ifdef PARANOIA
|
||||
#define I_Assert(e) ((e) ? (void)0 : I_Error("assert failed: %s, file %s, line %d", #e, __FILE__, __LINE__))
|
||||
|
||||
+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
|
||||
|
||||
|
||||
+16
-5
@@ -68,8 +68,21 @@ extern "C" {
|
||||
#define strnicmp(x,y,n) strncasecmp(x,y,n)
|
||||
#endif
|
||||
|
||||
char *nongnu_strcasestr(const char *in, const char *what);
|
||||
// glibc 2.43 made alot of standard lib functions propagate the constness of its input pointers
|
||||
// to not cause warnings or compile issues on older glibc versions we do this silly thing
|
||||
// to not have a gazillion glibc version checks
|
||||
#if defined(__GLIBC_PREREQ)
|
||||
#if __GLIBC_PREREQ(2, 43)
|
||||
#define gconst const
|
||||
#else
|
||||
#define gconst
|
||||
#endif
|
||||
#else
|
||||
#define gconst
|
||||
#endif
|
||||
|
||||
#ifndef _GNU_SOURCE
|
||||
char *nongnu_strcasestr(const char *in, const char *what);
|
||||
#define strcasestr nongnu_strcasestr
|
||||
#endif
|
||||
|
||||
@@ -127,9 +140,9 @@ size_t strlcpy(char *dst, const char *src, size_t dsize);
|
||||
#define STRBUFCPY(dst,src) strlcpy(dst, src, sizeof dst)
|
||||
|
||||
/* Boolean type definition */
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <stdbool.h>
|
||||
// dont use stdbools _BOOL type
|
||||
// its smaller (1 byte) than the old interger bool (4 bytes)
|
||||
// which results in packed struct sizes being mismatched between vanilla and this
|
||||
@@ -137,9 +150,7 @@ size_t strlcpy(char *dst, const char *src, size_t dsize);
|
||||
// which we cant use as enumeration constants
|
||||
typedef int32_t boolean;
|
||||
#else
|
||||
#define false FALSE
|
||||
#define true TRUE
|
||||
#define boolean BOOL
|
||||
#define boolean int32_t
|
||||
#endif
|
||||
|
||||
/* 7.18.2.1 Limits of exact-width integer types */
|
||||
|
||||
@@ -361,6 +361,11 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
|
||||
// on for fade-to-black
|
||||
for (;;)
|
||||
{
|
||||
if (I_Interrupted())
|
||||
{
|
||||
I_Quit();
|
||||
}
|
||||
|
||||
// get fademask first so we can tell if it exists or not
|
||||
fmask = F_GetFadeMask(wipetype, wipeframe++);
|
||||
|
||||
|
||||
+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
|
||||
|
||||
+3
-2
@@ -97,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;
|
||||
@@ -210,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;
|
||||
@@ -4150,6 +4148,7 @@ static void measurekeywords(mapsearchfreq_t *fr,
|
||||
{
|
||||
char *qp;
|
||||
char *sp;
|
||||
|
||||
if (wanttable)
|
||||
(*dimp) = Z_Realloc((*dimp), 255 * sizeof (struct searchdim),
|
||||
PU_STATIC, NULL);
|
||||
@@ -4164,10 +4163,12 @@ static void measurekeywords(mapsearchfreq_t *fr,
|
||||
(*dimp)[(*cuntp)].pos = sp - s;
|
||||
(*dimp)[(*cuntp)].siz = strlen(qp);
|
||||
}
|
||||
|
||||
(*cuntp)++;
|
||||
fr->total++;
|
||||
}
|
||||
}
|
||||
|
||||
if (wanttable)
|
||||
(*dimp) = Z_Realloc((*dimp), (*cuntp) * sizeof (struct searchdim),
|
||||
PU_STATIC, NULL);
|
||||
|
||||
@@ -15,8 +15,6 @@
|
||||
|
||||
#ifdef HWRENDER
|
||||
|
||||
#include <unordered_set>
|
||||
|
||||
#include "hw_main.h"
|
||||
#include "hw_glob.h"
|
||||
#include "hw_gl.h"
|
||||
@@ -100,7 +98,7 @@ static void HWR_DrawColumnInCache(const column_t *patchcol, UINT8 *block, GLMipm
|
||||
position = 0;
|
||||
}
|
||||
|
||||
position = std::max(((position * scale_y) + (FRACUNIT/2)) >> FRACBITS, 0);
|
||||
position = max(((position * scale_y) + (FRACUNIT/2)) >> FRACBITS, 0);
|
||||
|
||||
if (position + count >= pblockheight)
|
||||
count = pblockheight - position;
|
||||
@@ -164,7 +162,7 @@ static void HWR_DrawPatchInCache(GLMipmap_t *mipmap,
|
||||
fixed_t xfrac, xfracstep;
|
||||
fixed_t yfracstep, scale_y;
|
||||
const column_t *patchcol;
|
||||
UINT8 *block = static_cast<UINT8 *>(mipmap->data);
|
||||
UINT8 *block = (UINT8 *)(mipmap->data);
|
||||
INT32 bpp;
|
||||
INT32 blockmodulo;
|
||||
RGBA_t *palette;
|
||||
@@ -214,7 +212,7 @@ static void HWR_DrawTexturePatchInCache(GLMipmap_t *mipmap,
|
||||
fixed_t xfrac, xfracstep;
|
||||
fixed_t yfracstep, scale_y;
|
||||
const column_t *patchcol;
|
||||
UINT8 *block = static_cast<UINT8 *>(mipmap->data);
|
||||
UINT8 *block = (UINT8 *)(mipmap->data);
|
||||
INT32 bpp;
|
||||
INT32 blockmodulo;
|
||||
INT32 width, height;
|
||||
@@ -290,7 +288,7 @@ static UINT8 *MakeBlock(GLMipmap_t *glMipmap)
|
||||
INT32 blocksize = (glMipmap->width * glMipmap->height);
|
||||
|
||||
bpp = format2bpp(glMipmap->format);
|
||||
block = static_cast<UINT8 *>(Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data)));
|
||||
block = (UINT8 *)(Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data)));
|
||||
|
||||
switch (bpp)
|
||||
{
|
||||
@@ -327,7 +325,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
|
||||
texture = textures[texnum];
|
||||
|
||||
gltex->mipmap.flags = TF_CHROMAKEYED | TF_WRAPXY;
|
||||
gltex->mipmap.format = static_cast<GLTextureFormat_t>(textureformat);
|
||||
gltex->mipmap.format = (GLTextureFormat_t)(textureformat);
|
||||
|
||||
// hack the Legacy skies..
|
||||
if (UNLIKELY(memcmp(texture->name, "SKY", 3) == 0 &&
|
||||
@@ -346,7 +344,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
|
||||
colormap += COLORMAP_REMAPOFFSET;
|
||||
#endif
|
||||
|
||||
gltex->mipmap.colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*gltex->mipmap.colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||
gltex->mipmap.colormap = (GLColormap_t *)(Z_Calloc(sizeof(*gltex->mipmap.colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||
gltex->mipmap.colormap->source = colormap;
|
||||
memcpy(gltex->mipmap.colormap->data, colormap, 256 * sizeof(UINT8));
|
||||
|
||||
@@ -379,7 +377,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
|
||||
// Composite the columns together.
|
||||
for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++)
|
||||
{
|
||||
pdata = static_cast<UINT8 *>(W_CacheLumpNumPwad(patch->wad, patch->lump, PU_LEVEL));
|
||||
pdata = (UINT8 *)(W_CacheLumpNumPwad(patch->wad, patch->lump, PU_LEVEL));
|
||||
realpatch = (softwarepatch_t *)pdata;
|
||||
|
||||
HWR_DrawTexturePatchInCache(&gltex->mipmap, blockwidth, blockheight, texture, patch, realpatch);
|
||||
@@ -415,7 +413,7 @@ void HWR_MakePatch(const patch_t *patch, GLPatch_t *glPatch, GLMipmap_t *glMipma
|
||||
glMipmap->flags = 0;
|
||||
|
||||
// setup the texture info
|
||||
glMipmap->format = static_cast<GLTextureFormat_t>(patchformat);
|
||||
glMipmap->format = (GLTextureFormat_t)(patchformat);
|
||||
|
||||
glPatch->max_s = (float)patch->width / (float)glMipmap->width;
|
||||
glPatch->max_t = (float)patch->height / (float)glMipmap->height;
|
||||
@@ -457,7 +455,7 @@ static void HWR_FreeTextureData(patch_t *patch)
|
||||
if (!patch || !patch->hardware)
|
||||
return;
|
||||
|
||||
glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
glPatch = (GLPatch_t *)(patch->hardware);
|
||||
|
||||
if (vid.glstate == VID_GL_LIBRARY_LOADED)
|
||||
GL_DeleteTexture(glPatch->mipmap);
|
||||
@@ -473,7 +471,7 @@ void HWR_FreeTexture(patch_t *patch)
|
||||
|
||||
if (patch->hardware)
|
||||
{
|
||||
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
GLPatch_t *glPatch = (GLPatch_t *)(patch->hardware);
|
||||
|
||||
HWR_FreeTextureColormaps(patch);
|
||||
|
||||
@@ -499,7 +497,7 @@ static void HWR_FreeTextureColormaps(patch_t *patch)
|
||||
if (!patch)
|
||||
return;
|
||||
|
||||
pat = static_cast<GLPatch_t *>(patch->hardware);
|
||||
pat = (GLPatch_t *)(patch->hardware);
|
||||
if (!pat)
|
||||
return;
|
||||
|
||||
@@ -614,24 +612,20 @@ void HWR_FreeMapTextures(void)
|
||||
gl_numtextures = 0;
|
||||
}
|
||||
|
||||
#define NAME flatcheck
|
||||
#define KEY_TY UINT32
|
||||
#define HASH_FN vt_hash_integer
|
||||
#define CMPR_FN vt_cmpr_integer
|
||||
#include "../verstable.h"
|
||||
|
||||
static void HWR_PrecacheLevelFlats(void)
|
||||
{
|
||||
// lookup for flats that may´ve been already loaded
|
||||
// too lazy to make a hashtable or smth so unordered set will do :carbuncle:
|
||||
std::unordered_set<UINT32> flatpresent;
|
||||
flatcheck flatpresent;
|
||||
flatcheck_init(&flatpresent);
|
||||
size_t i, j;
|
||||
INT32 k;
|
||||
|
||||
auto load_flat = [&](lumpnum_t lump, boolean noencoremap)
|
||||
{
|
||||
// flat already loaded?
|
||||
if (flatpresent.count(lump) == 0)
|
||||
{
|
||||
HWR_GetFlat(lump, noencoremap);
|
||||
flatpresent.insert(lump);
|
||||
}
|
||||
};
|
||||
|
||||
// special case for encore
|
||||
#ifdef GLENCORE
|
||||
if (encoremap)
|
||||
@@ -649,14 +643,23 @@ static void HWR_PrecacheLevelFlats(void)
|
||||
|
||||
const levelflat_t *levelflat = &levelflats[pic];
|
||||
|
||||
load_flat(levelflat->lumpnum, R_NoEncore(sec, ceiling));
|
||||
if (flatcheck_is_end(flatcheck_get(&flatpresent, levelflat->lumpnum)))
|
||||
{
|
||||
HWR_GetFlat(levelflat->lumpnum, R_NoEncore(sec, ceiling));
|
||||
flatcheck_insert(&flatpresent, levelflat->lumpnum);
|
||||
}
|
||||
|
||||
if (levelflat->speed) // is it an animated flat ?
|
||||
{
|
||||
// start from 0, occasionally basenumlump != flat->lumpnum
|
||||
for (k = 0; k < levelflat->numpics; k++)
|
||||
{
|
||||
load_flat(levelflat->baselumpnum + k, R_NoEncore(sec, ceiling));
|
||||
lumpnum_t lump = levelflat->baselumpnum + k;
|
||||
if (flatcheck_is_end(flatcheck_get(&flatpresent, lump)))
|
||||
{
|
||||
HWR_GetFlat(lump, R_NoEncore(sec, ceiling));
|
||||
flatcheck_insert(&flatpresent, lump);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -671,18 +674,29 @@ static void HWR_PrecacheLevelFlats(void)
|
||||
{
|
||||
const levelflat_t *levelflat = &levelflats[i];
|
||||
|
||||
load_flat(levelflat->lumpnum, false);
|
||||
if (flatcheck_is_end(flatcheck_get(&flatpresent, levelflat->lumpnum)))
|
||||
{
|
||||
HWR_GetFlat(levelflat->lumpnum, false);
|
||||
flatcheck_insert(&flatpresent, levelflat->lumpnum);
|
||||
}
|
||||
|
||||
if (levelflat->speed) // is it an animated flat ?
|
||||
{
|
||||
// start from 0, occasionally basenumlump != flat->lumpnum
|
||||
for (k = 0; k < levelflat->numpics; k++)
|
||||
{
|
||||
load_flat(levelflat->baselumpnum + k, false);
|
||||
lumpnum_t lump = levelflat->baselumpnum + k;
|
||||
if (flatcheck_is_end(flatcheck_get(&flatpresent, lump)))
|
||||
{
|
||||
HWR_GetFlat(lump, false);
|
||||
flatcheck_insert(&flatpresent, lump);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flatcheck_cleanup(&flatpresent);
|
||||
}
|
||||
|
||||
static void HWR_PrecacheLevelTextures(void)
|
||||
@@ -692,7 +706,7 @@ static void HWR_PrecacheLevelTextures(void)
|
||||
size_t i, j, f;
|
||||
INT32 h;
|
||||
|
||||
texturepresent = static_cast<char *>(calloc(gl_numtextures, sizeof(*texturepresent)));
|
||||
texturepresent = (char *)(calloc(gl_numtextures, sizeof(*texturepresent)));
|
||||
if (texturepresent == NULL)
|
||||
I_Error("%s: Out of memory looking up textures", "HWR_PrecacheLevel");
|
||||
|
||||
@@ -867,7 +881,7 @@ void HWR_LoadMapTextures(size_t pnumtextures)
|
||||
HWR_FreeMapTextures();
|
||||
|
||||
gl_numtextures = pnumtextures;
|
||||
gl_textures = static_cast<GLMapTextureSet_t *>(calloc(gl_numtextures, sizeof(*gl_textures))); // *2 - 1 for encore-remapped texture and another for noencore texture (unused when not in encore), see: GLMapTextureSet_t
|
||||
gl_textures = (GLMapTextureSet_t *)(calloc(gl_numtextures, sizeof(*gl_textures))); // *2 - 1 for encore-remapped texture and another for noencore texture (unused when not in encore), see: GLMapTextureSet_t
|
||||
|
||||
if (gl_textures == NULL)
|
||||
I_Error("HWR_LoadMapTextures: ran out of memory for OpenGL textures. Sad!");
|
||||
@@ -964,7 +978,7 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum)
|
||||
W_ReadLump(flatlumpnum, Z_Malloc(size, PU_HWRCACHE, &glMipmap->data));
|
||||
|
||||
#ifdef GLENCORE
|
||||
flat = static_cast<UINT8 *>(glMipmap->data);
|
||||
flat = (UINT8 *)(glMipmap->data);
|
||||
for (steppy = 0; steppy < size; steppy++)
|
||||
{
|
||||
if (flat[steppy] == HWR_PATCHES_CHROMAKEY_COLORINDEX)
|
||||
@@ -1008,7 +1022,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
|
||||
if (!noencoremap && encoremap)
|
||||
colormap += COLORMAP_REMAPOFFSET;
|
||||
#endif
|
||||
glMipmap->colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*glMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||
glMipmap->colormap = (GLColormap_t *)(Z_Calloc(sizeof(*glMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||
glMipmap->colormap->source = colormap;
|
||||
memcpy(glMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
||||
}
|
||||
@@ -1032,7 +1046,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
|
||||
// --------------------+
|
||||
static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
||||
{
|
||||
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
GLPatch_t *glPatch = (GLPatch_t *)(patch->hardware);
|
||||
|
||||
if (!glMipmap->downloaded)
|
||||
{
|
||||
@@ -1053,7 +1067,7 @@ static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
||||
// ----------------------+
|
||||
static void HWR_UpdatePatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
||||
{
|
||||
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
GLPatch_t *glPatch = (GLPatch_t *)(patch->hardware);
|
||||
HWR_MakePatch(patch, glPatch, glMipmap, true);
|
||||
|
||||
// If hardware does not have the texture, then call GL_SetTexture to upload it
|
||||
@@ -1089,7 +1103,7 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
|
||||
|
||||
if (!patch->hardware)
|
||||
Patch_CreateGL(patch);
|
||||
glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
glPatch = (GLPatch_t *)(patch->hardware);
|
||||
|
||||
// Blatant hack for encore colormapping aside...
|
||||
if (colormap == colormaps || colormap == NULL || colormap == (const UINT8*)(COLORMAP_REMAPOFFSET))
|
||||
@@ -1125,12 +1139,12 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
|
||||
// (it have a liste of mipmap)
|
||||
// this malloc is cleared in HWR_FreeColormapCache
|
||||
// (...) unfortunately z_malloc fragment alot the memory :(so malloc is better
|
||||
newMipmap = static_cast<GLMipmap_t *>(calloc(1, sizeof (*newMipmap)));
|
||||
newMipmap = (GLMipmap_t *)(calloc(1, sizeof (*newMipmap)));
|
||||
if (newMipmap == NULL)
|
||||
I_Error("%s: Out of memory", "HWR_GetMappedPatch");
|
||||
glMipmap->nextcolormap = newMipmap;
|
||||
|
||||
newMipmap->colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*newMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||
newMipmap->colormap = (GLColormap_t *)(Z_Calloc(sizeof(*newMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||
newMipmap->colormap->source = colormap;
|
||||
memcpy(newMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
||||
|
||||
@@ -1153,7 +1167,7 @@ patch_t *HWR_GetCachedGLPatchPwad(UINT16 wadnum, UINT16 lumpnum)
|
||||
{
|
||||
void *ptr = Z_Calloc(sizeof(patch_t), PU_PATCH, &lumpcache[lumpnum]);
|
||||
Patch_Create(NULL, 0, ptr);
|
||||
Patch_AllocateHardwarePatch(static_cast<patch_t *>(ptr));
|
||||
Patch_AllocateHardwarePatch((patch_t *)(ptr));
|
||||
}
|
||||
|
||||
return (patch_t *)(lumpcache[lumpnum]);
|
||||
@@ -1170,7 +1184,7 @@ static void HWR_DrawFadeMaskInCache(GLMipmap_t *mipmap, INT32 pblockwidth, INT32
|
||||
{
|
||||
INT32 i,j;
|
||||
fixed_t posx, posy, stepx, stepy;
|
||||
UINT8 *block = static_cast<UINT8 *>(mipmap->data); // places the data directly into here
|
||||
UINT8 *block = (UINT8 *)(mipmap->data); // places the data directly into here
|
||||
UINT8 *flat;
|
||||
UINT8 *dest, *src, texel;
|
||||
RGBA_t col;
|
||||
@@ -1326,7 +1340,7 @@ void HWR_SetPalette(RGBA_t *palette)
|
||||
static void HWR_SetPaletteLookup(RGBA_t *palette)
|
||||
{
|
||||
int r, g, b;
|
||||
UINT8 *lut = static_cast<UINT8 *>(Z_Malloc(
|
||||
UINT8 *lut = (UINT8 *)(Z_Malloc(
|
||||
HWR_PALETTE_LUT_SIZE*HWR_PALETTE_LUT_SIZE*HWR_PALETTE_LUT_SIZE*sizeof(UINT8),
|
||||
PU_STATIC, NULL));
|
||||
#define STEP_SIZE (256/HWR_PALETTE_LUT_SIZE)
|
||||
@@ -1371,7 +1385,7 @@ void HWR_SetMapPalette(void)
|
||||
if (palsize < 768) // 256 * 3
|
||||
I_Error("HWR_SetMapPalette: A programmer assumed palette lumps are at least 768 bytes long, but apparently this was a wrong assumption!\n");
|
||||
|
||||
RGB_data = static_cast<UINT8 *>(W_CacheLumpNum(lumpnum, PU_CACHE));
|
||||
RGB_data = (UINT8 *)(W_CacheLumpNum(lumpnum, PU_CACHE));
|
||||
// we got the RGB palette now, but we need it in RGBA format.
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
@@ -1406,7 +1420,7 @@ static UINT32 HWR_CreateLightTable(UINT8 *lighttable)
|
||||
{
|
||||
UINT32 i, id;
|
||||
RGBA_t *palette = HWR_GetTexturePalette();
|
||||
RGBA_t *hw_lighttable = static_cast<RGBA_t *>(Z_Malloc(256 * 32 * sizeof(RGBA_t), PU_STATIC, NULL));
|
||||
RGBA_t *hw_lighttable = (RGBA_t *)(Z_Malloc(256 * 32 * sizeof(RGBA_t), PU_STATIC, NULL));
|
||||
|
||||
// To make the palette index -> RGBA mapping easier for the shader,
|
||||
// the hardware lighttable is composed of RGBA colors instead of palette indices.
|
||||
@@ -54,7 +54,7 @@ struct GLMipmap_s
|
||||
UINT16 width, height;
|
||||
UINT32 downloaded; // The GPU has this texture.
|
||||
|
||||
struct GLMipmap_s *nextcolormap;
|
||||
struct GLMipmap_s *nextcolormap;
|
||||
struct GLColormap_s *colormap;
|
||||
};
|
||||
typedef struct GLMipmap_s GLMipmap_t;
|
||||
|
||||
@@ -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)
|
||||
|
||||
+19
-24
@@ -242,7 +242,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};
|
||||
|
||||
@@ -551,7 +550,7 @@ static FUINT HWR_CalcSlopeLight(FUINT lightnum, pslope_t *slope, const sector_t
|
||||
// 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)
|
||||
{
|
||||
FSurfaceInfo Surf;
|
||||
FSurfaceInfo Surf = {};
|
||||
FOutVector *v3d;
|
||||
polyvertex_t *pv;
|
||||
pslope_t *slope = NULL;
|
||||
@@ -1376,7 +1375,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 +2674,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;
|
||||
|
||||
@@ -2842,9 +2841,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 +2863,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));
|
||||
@@ -3419,7 +3416,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 +3652,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 +3681,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 +3783,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 +3937,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 +3969,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 +4080,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 +4102,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 +4119,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
|
||||
//
|
||||
@@ -4513,7 +4510,6 @@ static void HWR_RenderDrawNodes(void)
|
||||
drawnodes.clear(); // clear so our size is 0 again!
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Draw all vissprites
|
||||
// --------------------------------------------------------------------------
|
||||
@@ -4850,7 +4846,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
|
||||
{
|
||||
@@ -5913,7 +5909,6 @@ void HWR_AddCommands(void)
|
||||
|
||||
CV_RegisterVar(&cv_glpaletterendering);
|
||||
CV_RegisterVar(&cv_glpalettedepth);
|
||||
CV_RegisterVar(&cv_glflashpal);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
@@ -6070,7 +6065,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 +6078,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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ boolean HWR_InitShaders(void)
|
||||
// returns INT32_MAX if not found
|
||||
static INT32 strstr_int(const char *str1, const char *str2)
|
||||
{
|
||||
char *location = strstr(str1, str2);
|
||||
gconst char *location = strstr(str1, str2);
|
||||
if (location)
|
||||
return location - str1;
|
||||
else
|
||||
|
||||
@@ -1383,19 +1383,19 @@ void GL_Flush(void)
|
||||
// -----------------+
|
||||
INT32 GL_isExtAvailable(const char *extension, const GLubyte *start)
|
||||
{
|
||||
GLubyte *where, *terminator;
|
||||
gconst GLubyte *where, *terminator;
|
||||
|
||||
if (!extension || !start)
|
||||
return 0;
|
||||
|
||||
where = (GLubyte *) strchr(extension, ' ');
|
||||
where = (gconst GLubyte *)strchr(extension, ' ');
|
||||
|
||||
if (where || *extension == '\0')
|
||||
return 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
where = (GLubyte *) strstr((const char *) start, extension);
|
||||
where = (gconst GLubyte *)strstr((const char *)start, extension);
|
||||
|
||||
if (!where)
|
||||
break;
|
||||
|
||||
+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.
|
||||
|
||||
+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
|
||||
|
||||
@@ -13,6 +13,10 @@
|
||||
#define LZF_H
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***********************************************************************
|
||||
**
|
||||
** lzf -- an extremely fast/free compression/decompression-method
|
||||
@@ -71,5 +75,9 @@ size_t
|
||||
lzf_decompress (const void *const in_data, size_t in_len,
|
||||
void *out_data, size_t out_len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
+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)
|
||||
|
||||
+35
-20
@@ -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;
|
||||
}
|
||||
@@ -4020,8 +4030,8 @@ I_mutex replayquerymutex;
|
||||
// to avoid infinite SIGABRT recursion in the signal handler
|
||||
// due to poisoned locks or mach-o kernel not supporting locks in signals
|
||||
// or something like that. idk
|
||||
# define Lock_search_state() if (!I_In_Exiting_Signal_Handler()) { I_LockMutex(&replayquerymutex); }
|
||||
# define Unlock_search_state() if (!I_In_Exiting_Signal_Handler()) { I_UnlockMutex(replayquerymutex); }
|
||||
# define Lock_search_state() if (!I_In_Exiting_Signal_Handler()) { I_lock_mutex(&replayquerymutex); }
|
||||
# define Unlock_search_state() if (!I_In_Exiting_Signal_Handler()) { I_unlock_mutex(replayquerymutex); }
|
||||
#else /*HAVE_THREADS*/
|
||||
# define Lock_search_state()
|
||||
# define Unlock_search_state()
|
||||
@@ -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
|
||||
+39
-10
@@ -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
|
||||
@@ -1454,9 +1460,9 @@ INT32 axtoi(const char *hexStg)
|
||||
|
||||
void CopyCaretColors(char *p, const char *s, int n)
|
||||
{
|
||||
char *t;
|
||||
int m;
|
||||
int c;
|
||||
gconst char *t;
|
||||
int m;
|
||||
int c;
|
||||
|
||||
if (!n)
|
||||
return;
|
||||
@@ -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)
|
||||
@@ -1956,6 +1969,22 @@ UINT32 FNV1a_Hash(const char *message, size_t size)
|
||||
return hash;
|
||||
}
|
||||
|
||||
// Behaves like the old quickncasehash
|
||||
// Stops either if it encounters null terminator
|
||||
// or reaches size
|
||||
UINT32 FNV1a_QuickCaseHash(const char *message, size_t size)
|
||||
{
|
||||
UINT32 hash = FNV1A_OFFSET_BASIS;
|
||||
|
||||
for (size_t i = 0; i < size && message[i]; i++)
|
||||
{
|
||||
hash ^= tolower(message[i]);
|
||||
hash *= FNV1A_PRIME;
|
||||
}
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
UINT32 FNV1a_HashString(const char *message)
|
||||
{
|
||||
UINT32 hash = FNV1A_OFFSET_BASIS;
|
||||
|
||||
@@ -123,6 +123,7 @@ FUNCMATH UINT8 M_CountBits(UINT32 num, UINT8 size);
|
||||
|
||||
// Hashes some message using FNV-1a
|
||||
UINT32 FNV1a_Hash(const char *message, size_t size);
|
||||
UINT32 FNV1a_QuickCaseHash(const char *message, size_t size);
|
||||
UINT32 FNV1a_HashString(const char *message);
|
||||
UINT32 FNV1a_HashLowercaseString(const char *message);
|
||||
|
||||
|
||||
+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)
|
||||
|
||||
@@ -16,6 +16,10 @@
|
||||
#ifndef _MD5_H
|
||||
#define _MD5_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#if defined (HAVE_LIMITS_H) || (defined (_LIBC) && _LIBC) || defined (_WIN32)
|
||||
@@ -52,4 +56,8 @@ int md5_stream(FILE *stream, void *resblock) THROWFUNC;
|
||||
digest. */
|
||||
extern void *md5_buffer(const char *buffer, size_t len, void *resblock) THROWFUNC;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif /* md5.h */
|
||||
+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;
|
||||
|
||||
|
||||
+3
-3
@@ -622,7 +622,7 @@ Rloadtextures (INT32 i, INT32 w)
|
||||
|
||||
// Set texture properties.
|
||||
memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name));
|
||||
texture->hash = quickncasehash(texture->name, 8);
|
||||
texture->hash = FNV1a_QuickCaseHash(texture->name, 8);
|
||||
|
||||
texture->width = SHORT(patchlump.width);
|
||||
texture->height = SHORT(patchlump.height);
|
||||
@@ -1066,7 +1066,7 @@ static texture_t *R_ParseTexture(boolean actuallyLoadTexture)
|
||||
// Allocate memory for a zero-patch texture. Obviously, we'll be adding patches momentarily.
|
||||
resultTexture = (texture_t *)Z_Calloc(sizeof(texture_t), PU_STATIC, NULL);
|
||||
memcpy(resultTexture->name, newTextureName, 8);
|
||||
resultTexture->hash = quickncasehash(newTextureName, 8);
|
||||
resultTexture->hash = FNV1a_QuickCaseHash(newTextureName, 8);
|
||||
resultTexture->width = newTextureWidth;
|
||||
resultTexture->height = newTextureHeight;
|
||||
resultTexture->type = TEXTURETYPE_COMPOSITE;
|
||||
@@ -1755,7 +1755,7 @@ INT32 R_CheckTextureNumForName(const char *name)
|
||||
if (name[0] == '-')
|
||||
return 0;
|
||||
|
||||
hash = quickncasehash(name, 8);
|
||||
hash = FNV1a_QuickCaseHash(name, 8);
|
||||
|
||||
for (i = 0; i < tidcachelen; i++)
|
||||
if (tidcache[i].hash == hash && !strncasecmp(tidcache[i].name, name, 8))
|
||||
|
||||
+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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
+11
-8
@@ -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];
|
||||
}
|
||||
@@ -2960,21 +2960,24 @@ fixed_t R_DoPlayerFade(mobj_t *thing)
|
||||
fixed_t fadealpha = FRACUNIT;
|
||||
static constexpr tic_t countdownstarttime = (15 * TICRATE) / 4; // starttime - (3*TICRATE)
|
||||
|
||||
if (thing->player == viewplayer || viewplayer->exiting || camera[R_GetViewNumber()].freecam || leveltime < countdownstarttime)
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+5
-28
@@ -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;
|
||||
@@ -1301,7 +1299,7 @@ static boolean ReadMusicDefFields(UINT16 wadnum, int line, char *stoken, musicde
|
||||
|
||||
STRBUFCPY(def->name, value);
|
||||
strlwr(def->name);
|
||||
def->hash = quickncasehash (def->name, 6);
|
||||
def->hash = FNV1a_QuickCaseHash(def->name, 6);
|
||||
}
|
||||
|
||||
(*defp) = def;
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -1483,7 +1481,7 @@ void S_InitMusicDefs(void)
|
||||
//
|
||||
musicdef_t *S_FindMusicCredit(const char *musname)
|
||||
{
|
||||
UINT32 hash = quickncasehash(musname, 6);
|
||||
UINT32 hash = FNV1a_QuickCaseHash(musname, 6);
|
||||
musicdef_t *def;
|
||||
|
||||
for (INT32 i = 0; i < nummusicdefs; ++i)
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -1886,6 +1886,7 @@ INT32 I_StartupSystem(void)
|
||||
SDL_version SDLlinked;
|
||||
SDL_VERSION(&SDLcompiled)
|
||||
SDL_GetVersion(&SDLlinked);
|
||||
|
||||
I_StartupConsole();
|
||||
#ifdef NEWSIGNALHANDLER
|
||||
// This is useful when debugging. It lets GDB attach to
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
+10
-7
@@ -23,24 +23,26 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _GNU_SOURCE
|
||||
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <stddef.h>
|
||||
|
||||
static inline int
|
||||
trycmp (char **pp, char *cp,
|
||||
const char *q, size_t qn)
|
||||
static inline int trycmp(char **pp, char *cp, const char *q, size_t qn)
|
||||
{
|
||||
char *p;
|
||||
p = (*pp);
|
||||
|
||||
if (strncasecmp(p, q, qn) == 0)
|
||||
return 0;
|
||||
|
||||
(*pp) = strchr(&p[1], (*cp));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline void
|
||||
swapp (char ***ppap, char ***ppbp, char **cpap, char **cpbp)
|
||||
static inline void swapp(char ***ppap, char ***ppbp, char **cpap, char **cpbp)
|
||||
{
|
||||
char **pp;
|
||||
char *p;
|
||||
@@ -54,8 +56,7 @@ swapp (char ***ppap, char ***ppbp, char **cpap, char **cpbp)
|
||||
*cpbp = p;
|
||||
}
|
||||
|
||||
char *
|
||||
nongnu_strcasestr (const char *s, const char *q)
|
||||
char *nongnu_strcasestr(const char *s, const char *q)
|
||||
{
|
||||
size_t qn;
|
||||
|
||||
@@ -113,3 +114,5 @@ nongnu_strcasestr (const char *s, const char *q)
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#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
|
||||
|
||||
+2126
File diff suppressed because it is too large.
Load diff
+210
-183
@@ -87,18 +87,32 @@ typedef struct
|
||||
} lumpchecklist_t;
|
||||
|
||||
// Must be a power of two
|
||||
#define LUMPNUMCACHESIZE 64
|
||||
#define LUMPNUMCACHESIZE 2048 // should be reasonable ig
|
||||
#define LUMPNUMCACHENAME 32
|
||||
|
||||
typedef struct lumpnum_cache_s
|
||||
{
|
||||
char lumpname[LUMPNUMCACHENAME];
|
||||
lumpnum_t lumpnum;
|
||||
UINT32 hash;
|
||||
} lumpnum_cache_t;
|
||||
#define NAME lumpnum_map
|
||||
#define KEY_TY char *
|
||||
#define KEY_GET_CONST
|
||||
#define VAL_TY lumpnum_t
|
||||
#define HASH_FN vt_hash_string
|
||||
#define CMPR_FN vt_cmpr_string
|
||||
#define KEY_DTOR_FN free
|
||||
#include "verstable.h"
|
||||
|
||||
static lumpnum_cache_t lumpnumcache[LUMPNUMCACHESIZE];
|
||||
static UINT16 lumpnumcacheindex = 0;
|
||||
#define NAME folder_map
|
||||
#define KEY_TY char *
|
||||
#define KEY_GET_CONST
|
||||
#define VAL_TY UINT16
|
||||
#define HASH_FN vt_hash_string
|
||||
#define CMPR_FN vt_cmpr_string
|
||||
#define KEY_DTOR_FN free
|
||||
#include "verstable.h"
|
||||
|
||||
static lumpnum_map lumpnumcache;
|
||||
|
||||
typedef struct FolderCache {
|
||||
folder_map map;
|
||||
} FolderCache;
|
||||
|
||||
static const char pat_central[] = {0x50, 0x4b, 0x01, 0x02, 0x00};
|
||||
static const char pat_end[] = {0x50, 0x4b, 0x05, 0x06, 0x00};
|
||||
@@ -116,6 +130,8 @@ wadfile_t *wadfiles[MAX_WADFILES] = {}; // 0 to numwadfiles-1 are valid
|
||||
// being ejected
|
||||
void W_Shutdown(void)
|
||||
{
|
||||
lumpnum_map_cleanup(&lumpnumcache);
|
||||
|
||||
while (numwadfiles--)
|
||||
{
|
||||
wadfile_t *wad = wadfiles[numwadfiles];
|
||||
@@ -127,18 +143,27 @@ void W_Shutdown(void)
|
||||
|
||||
while (wad->numlumps--)
|
||||
{
|
||||
Z_Free(wad->lumpinfo[wad->numlumps].longname);
|
||||
//Z_Free(wad->lumpinfo[wad->numlumps].longname);
|
||||
Z_Free(wad->lumpinfo[wad->numlumps].fullname);
|
||||
}
|
||||
|
||||
M_AATreeFree(wad->startfolders);
|
||||
M_AATreeFree(wad->endfolders);
|
||||
folder_map_cleanup(&wad->startfolders->map);
|
||||
free(wad->startfolders);
|
||||
folder_map_cleanup(&wad->endfolders->map);
|
||||
free(wad->endfolders);
|
||||
|
||||
Z_Free(wad->lumpinfo);
|
||||
Z_Free(wad);
|
||||
}
|
||||
}
|
||||
|
||||
// the lumpnum cache needs to be initialized before use
|
||||
CONSTRUCTOR static void W_Startup(void)
|
||||
{
|
||||
lumpnum_map_init(&lumpnumcache);
|
||||
lumpnum_map_reserve(&lumpnumcache, LUMPNUMCACHESIZE);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
// LUMP BASED ROUTINES
|
||||
//===========================================================================
|
||||
@@ -259,7 +284,7 @@ static inline void W_LoadDehackedLumpsPK3(UINT16 wadnum)
|
||||
lumpinfo_t *lump_p = &wadfiles[wadnum]->lumpinfo[posStart];
|
||||
|
||||
size_t length = len + 1 + strlen(lump_p->fullname); // length of file name, '|', and lump name
|
||||
char *name = malloc(length + 1);
|
||||
char *name = (char *)(malloc(length + 1));
|
||||
|
||||
if (!name)
|
||||
I_Error("W_LoadDehackedLumpsPK3: Out of memory!\n");
|
||||
@@ -295,7 +320,7 @@ static inline void W_LoadDehackedLumps(UINT16 wadnum)
|
||||
if (memcmp(lump_p->name, "SOC_", 4) == 0) // Check for generic SOC lump
|
||||
{ // shameless copy+paste of code from LUA_LoadLump
|
||||
size_t length = len + 1 + strlen(lump_p->fullname); // length of file name, '|', and lump name
|
||||
char *name = malloc(length + 1);
|
||||
char *name = (char *)(malloc(length + 1));
|
||||
|
||||
if (!name)
|
||||
I_Error("W_LoadDehackedLumps: Out of memory!\n");
|
||||
@@ -339,9 +364,9 @@ 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);
|
||||
CONS_Debug(DBG_SETUP, "Making MD5 for %s\n", filename);
|
||||
|
||||
if (md5_stream(fhandle, resblock) == 1)
|
||||
{
|
||||
@@ -350,7 +375,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;
|
||||
@@ -360,12 +385,12 @@ static inline INT32 W_MakeFileMD5(const char *filename, void *resblock)
|
||||
}
|
||||
|
||||
// Invalidates the cache of lump numbers. Call this whenever a wad is added.
|
||||
static void W_InvalidateLumpnumCache(void)
|
||||
FUNCINLINE static ATTRINLINE void W_InvalidateLumpnumCache(void)
|
||||
{
|
||||
memset(lumpnumcache, 0, sizeof(lumpnumcache));
|
||||
lumpnum_map_clear(&lumpnumcache);
|
||||
}
|
||||
|
||||
UINT32 W_HashLumpName(const char *name)
|
||||
FUNCINLINE static ATTRINLINE UINT32 W_HashLumpName(const char *name)
|
||||
{
|
||||
return FNV1a_HashLowercaseString(name);
|
||||
}
|
||||
@@ -391,28 +416,28 @@ static restype_t ResourceFileDetect(const char* filename)
|
||||
*/
|
||||
static lumpinfo_t* ResGetLumpsStandalone(FILE* handle, UINT16* numlumps, const char* lumpname)
|
||||
{
|
||||
lumpinfo_t* lumpinfo = Z_Calloc(sizeof (*lumpinfo), PU_STATIC, NULL);
|
||||
lumpinfo_t* lumpinfo = (lumpinfo_t *)(Z_Calloc(sizeof (*lumpinfo), PU_STATIC, NULL));
|
||||
lumpinfo->position = 0;
|
||||
fseek(handle, 0, SEEK_END);
|
||||
lumpinfo->size = ftell(handle);
|
||||
lumpinfo->size = (size_t)(ftell(handle));
|
||||
fseek(handle, 0, SEEK_SET);
|
||||
strlcpy(lumpinfo->name, lumpname, sizeof(lumpinfo->name));
|
||||
lumpinfo->namelength = strlen(lumpinfo->name);
|
||||
lumpinfo->hash.name = W_HashLumpName(lumpname);
|
||||
|
||||
// Allocate the lump's long name.
|
||||
lumpinfo->longname = Z_Malloc((lumpinfo->namelength + 1) * sizeof(char), PU_STATIC, NULL);
|
||||
/*lumpinfo->longname = (char *)(Z_Malloc((lumpinfo->namelength + 1) * sizeof(char), PU_STATIC, NULL));
|
||||
strcpy(lumpinfo->longname, lumpname);
|
||||
lumpinfo->longname[lumpinfo->namelength] = '\0';
|
||||
lumpinfo->longnamelength = lumpinfo->namelength;
|
||||
lumpinfo->hash.longname = lumpinfo->hash.name;
|
||||
lumpinfo->hash.longname = lumpinfo->hash.name;*/
|
||||
|
||||
// Allocate the lump's full name.
|
||||
lumpinfo->fullname = Z_Malloc((lumpinfo->namelength + 1) * sizeof(char), PU_STATIC, NULL);
|
||||
lumpinfo->fullname = (char *)(Z_Malloc((lumpinfo->namelength + 1) * sizeof(char), PU_STATIC, NULL));
|
||||
strcpy(lumpinfo->fullname, lumpname);
|
||||
lumpinfo->fullname[lumpinfo->namelength] = '\0';
|
||||
lumpinfo->fullnamelength = lumpinfo->namelength;
|
||||
lumpinfo->hash.fullname = lumpinfo->hash.name;
|
||||
//lumpinfo->hash.fullname = lumpinfo->hash.name;
|
||||
|
||||
*numlumps = 1;
|
||||
return lumpinfo;
|
||||
@@ -456,7 +481,7 @@ static lumpinfo_t* ResGetLumpsWad(FILE* handle, UINT16* nlmp, const char* filena
|
||||
|
||||
// read wad file directory
|
||||
i = header.numlumps * sizeof(*fileinfo);
|
||||
fileinfov = fileinfo = malloc(i);
|
||||
fileinfov = fileinfo = (filelump_t *)(malloc(i));
|
||||
|
||||
if (fseek(handle, header.infotableofs, SEEK_SET) == -1
|
||||
|| fread(fileinfo, 1, i, handle) < i)
|
||||
@@ -468,7 +493,7 @@ static lumpinfo_t* ResGetLumpsWad(FILE* handle, UINT16* nlmp, const char* filena
|
||||
numlumps = header.numlumps;
|
||||
|
||||
// fill in lumpinfo for this wad
|
||||
lump_p = lumpinfo = Z_Malloc(numlumps * sizeof (*lumpinfo), PU_STATIC, NULL);
|
||||
lump_p = lumpinfo = (lumpinfo_t *)(Z_Malloc(numlumps * sizeof (*lumpinfo), PU_STATIC, NULL));
|
||||
|
||||
for (i = 0; i < numlumps; i++, lump_p++, fileinfo++)
|
||||
{
|
||||
@@ -512,18 +537,18 @@ static lumpinfo_t* ResGetLumpsWad(FILE* handle, UINT16* nlmp, const char* filena
|
||||
lump_p->hash.name = W_HashLumpName(lump_p->name);
|
||||
|
||||
// Allocate the lump's long name.
|
||||
lump_p->longname = Z_Malloc(9 * sizeof(char), PU_STATIC, NULL);
|
||||
/*lump_p->longname = (char *)(Z_Malloc(9 * sizeof(char), PU_STATIC, NULL));
|
||||
strncpy(lump_p->longname, fileinfo->name, 8);
|
||||
lump_p->longname[8] = '\0';
|
||||
lump_p->longnamelength = lump_p->namelength;
|
||||
lump_p->hash.longname = lump_p->hash.name;
|
||||
lump_p->hash.longname = lump_p->hash.name;*/
|
||||
|
||||
// Allocate the lump's full name.
|
||||
lump_p->fullname = Z_Malloc(9 * sizeof(char), PU_STATIC, NULL);
|
||||
lump_p->fullname = (char *)(Z_Malloc(9 * sizeof(char), PU_STATIC, NULL));
|
||||
strncpy(lump_p->fullname, fileinfo->name, 8);
|
||||
lump_p->fullname[8] = '\0';
|
||||
lump_p->fullnamelength = lump_p->namelength;
|
||||
lump_p->hash.fullname = lump_p->hash.name;
|
||||
//lump_p->hash.fullname = lump_p->hash.name;
|
||||
}
|
||||
|
||||
*nlmp = numlumps;
|
||||
@@ -540,24 +565,24 @@ static boolean ResFindSignature(FILE* handle, const char endPat[], UINT32 startp
|
||||
int c;
|
||||
|
||||
fseek(handle, 0, SEEK_END);
|
||||
size_t len = ftell(handle);
|
||||
size_t len = (size_t)(ftell(handle));
|
||||
|
||||
fseek(handle, startpos, SEEK_SET);
|
||||
size_t remaining = len - startpos;
|
||||
size_t chunkpos = startpos;
|
||||
size_t remaining = (size_t)(len - startpos);
|
||||
size_t chunkpos = (size_t)(startpos);
|
||||
|
||||
s = endPat;
|
||||
|
||||
//128k buffers
|
||||
size_t buffer_size = min(128 * 1024 * sizeof(char), remaining);
|
||||
CLEANUP(pfree) char* buffer = (char*)(malloc(buffer_size));
|
||||
CLEANUP(pfree) char* buffer = (char *)(malloc(buffer_size));
|
||||
|
||||
size_t bytes_read = 0;
|
||||
while ((bytes_read = fread(buffer, 1, buffer_size, handle)) > 0)
|
||||
{
|
||||
for (size_t i = 0; i < bytes_read; i++)
|
||||
{
|
||||
c = (int)buffer[i];
|
||||
c = (int)(buffer[i]);
|
||||
|
||||
if (*s != c && s > endPat) // No match?
|
||||
s = endPat; // We "reset" the counter by sending the s pointer back to the start of the array.
|
||||
@@ -569,7 +594,7 @@ static boolean ResFindSignature(FILE* handle, const char endPat[], UINT32 startp
|
||||
if (*s == 0x00) // The array pointer has reached the key char which marks the end. It means we have matched the signature.
|
||||
{
|
||||
//the original function would leave the FILE* seeked to the end of the match
|
||||
size_t foundpos = chunkpos + i + 1;
|
||||
size_t foundpos = (size_t)(chunkpos + i + 1);
|
||||
fseek(handle, foundpos, SEEK_SET);
|
||||
return true;
|
||||
}
|
||||
@@ -646,7 +671,7 @@ static lumpinfo_t* ResGetLumpsZip(FILE* handle, UINT16* nlmp)
|
||||
// Contains entry number (number of lumps), and central directory start offset.
|
||||
fseek(handle, 0, SEEK_END);
|
||||
|
||||
const long startpos = (ftell(handle) - (22 + 65536));
|
||||
const long startpos = ftell(handle) - (22 + 65536);
|
||||
if (!ResFindSignature(handle, pat_end, max(0l, startpos)))
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "Missing central directory\n");
|
||||
@@ -662,11 +687,11 @@ static lumpinfo_t* ResGetLumpsZip(FILE* handle, UINT16* nlmp)
|
||||
|
||||
numlumps = SHORT(zend.entries);
|
||||
|
||||
lump_p = lumpinfo = Z_Malloc(numlumps * sizeof (*lumpinfo), PU_STATIC, NULL);
|
||||
lump_p = lumpinfo = (lumpinfo_t *)(Z_Malloc(numlumps * sizeof (*lumpinfo), PU_STATIC, NULL));
|
||||
|
||||
fseek(handle, LONG(zend.cdiroffset), SEEK_SET);
|
||||
|
||||
CLEANUP(Z_Pfree) char *cdir = Z_Malloc(LONG(zend.cdirsize), PU_STATIC, &cdir);
|
||||
CLEANUP(Z_Pfree) char *cdir = (char *)(Z_Malloc(LONG(zend.cdirsize), PU_STATIC, &cdir));
|
||||
|
||||
if (fread(cdir, 1, LONG(zend.cdirsize), handle) < (UINT32)(LONG(zend.cdirsize)))
|
||||
{
|
||||
@@ -679,7 +704,7 @@ static lumpinfo_t* ResGetLumpsZip(FILE* handle, UINT16* nlmp)
|
||||
|
||||
for (i = 0; i < numlumps; i++, lump_p++)
|
||||
{
|
||||
zentry_t *zentry = (zentry_t*)(cdir + offset);
|
||||
zentry_t *zentry = (zentry_t *)(cdir + offset);
|
||||
char* fullname;
|
||||
char* trimname;
|
||||
char* dotpos;
|
||||
@@ -695,8 +720,9 @@ static lumpinfo_t* ResGetLumpsZip(FILE* handle, UINT16* nlmp)
|
||||
lump_p->disksize = LONG(zentry->compsize);
|
||||
lump_p->size = LONG(zentry->size);
|
||||
|
||||
fullname = (char*)(malloc(SHORT(zentry->namelen) + 1));
|
||||
strlcpy(fullname, (char*)(zentry + 1), SHORT(zentry->namelen) + 1);
|
||||
fullname = (char *)(malloc(SHORT(zentry->namelen) + 1));
|
||||
strncpy(fullname, (char *)(zentry + 1), SHORT(zentry->namelen));
|
||||
fullname[zentry->namelen] = 0;
|
||||
|
||||
// Strip away file address and extension for the 8char name.
|
||||
if ((trimname = strrchr(fullname, '/')) != NULL)
|
||||
@@ -712,15 +738,15 @@ static lumpinfo_t* ResGetLumpsZip(FILE* handle, UINT16* nlmp)
|
||||
lump_p->namelength = strlen(lump_p->name);
|
||||
lump_p->hash.name = W_HashLumpName(lump_p->name);
|
||||
|
||||
lump_p->longname = Z_Calloc(dotpos - trimname + 1, PU_STATIC, NULL);
|
||||
/*lump_p->longname = (char *)(Z_Calloc(dotpos - trimname + 1, PU_STATIC, NULL));
|
||||
strlcpy(lump_p->longname, trimname, dotpos - trimname + 1);
|
||||
lump_p->longnamelength = strlen(lump_p->longname);
|
||||
lump_p->hash.longname = W_HashLumpName(lump_p->longname);
|
||||
lump_p->hash.longname = W_HashLumpName(lump_p->longname);*/
|
||||
|
||||
lump_p->fullname = (char*)(Z_Calloc(SHORT(zentry->namelen) + 1, PU_STATIC, NULL));
|
||||
lump_p->fullname = (char *)(Z_Calloc(SHORT(zentry->namelen) + 1, PU_STATIC, NULL));
|
||||
strncpy(lump_p->fullname, fullname, SHORT(zentry->namelen));
|
||||
lump_p->fullnamelength = zentry->namelen;
|
||||
lump_p->hash.fullname = W_HashLumpName(lump_p->fullname);
|
||||
//lump_p->hash.fullname = W_HashLumpName(lump_p->fullname);
|
||||
|
||||
switch(SHORT(zentry->compression))
|
||||
{
|
||||
@@ -895,17 +921,19 @@ UINT16 W_InitFile(const char *filename, boolean local, boolean startup)
|
||||
//
|
||||
// link wad file to search files
|
||||
//
|
||||
wadfile = Z_Calloc(sizeof (*wadfile), PU_STATIC, NULL);
|
||||
wadfile = (wadfile_t *)(Z_Calloc(sizeof (*wadfile), PU_STATIC, NULL));
|
||||
wadfile->filename = Z_StrDup(filename);
|
||||
wadfile->handle = handle;
|
||||
wadfile->numlumps = (UINT16)numlumps;
|
||||
wadfile->numlumps = (UINT16)(numlumps);
|
||||
wadfile->lumpinfo = lumpinfo;
|
||||
wadfile->important = important;
|
||||
fseek(handle, 0, SEEK_END);
|
||||
wadfile->filesize = (unsigned)ftell(handle);
|
||||
wadfile->filesize = (unsigned)(ftell(handle));
|
||||
wadfile->type = type;
|
||||
wadfile->startfolders = M_AATreeAlloc(AATREE_STRING);
|
||||
wadfile->endfolders = M_AATreeAlloc(AATREE_STRING);
|
||||
wadfile->startfolders = (FolderCache *)malloc(sizeof(FolderCache));
|
||||
folder_map_init(&wadfile->startfolders->map);
|
||||
wadfile->endfolders = (FolderCache *)malloc(sizeof(FolderCache));
|
||||
folder_map_init(&wadfile->endfolders->map);
|
||||
|
||||
// already generated, just copy it over
|
||||
memcpy(&wadfile->md5sum, &md5sum, 16);
|
||||
@@ -930,7 +958,7 @@ UINT16 W_InitFile(const char *filename, boolean local, boolean startup)
|
||||
#ifdef HWRENDER
|
||||
// Read shaders from file
|
||||
if (rendermode == render_opengl && (vid.glstate == VID_GL_LIBRARY_LOADED))
|
||||
HWR_LoadCustomShadersFromFile(numwadfiles - 1, (type == RET_PK3));
|
||||
HWR_LoadCustomShadersFromFile(numwadfiles - 1, (boolean)(type == RET_PK3));
|
||||
#endif
|
||||
|
||||
// TODO: HACK ALERT - Load Lua & SOC stuff right here. I feel like this should be out of this place, but... Let's stick with this for now.
|
||||
@@ -1030,7 +1058,7 @@ INT32 W_AddAutoloadedLocalFiles(char **filenames)
|
||||
/** Make sure a lump number is valid.
|
||||
* Compiles away to nothing if PARANOIA is not defined.
|
||||
*/
|
||||
static boolean TestValidLump(UINT16 wad, UINT16 lump)
|
||||
static inline boolean TestValidLump(UINT16 wad, UINT16 lump)
|
||||
{
|
||||
I_Assert(wad < MAX_WADFILES);
|
||||
if (!wadfiles[wad]) // make sure the wad file exists
|
||||
@@ -1053,7 +1081,7 @@ const char *W_CheckNameForNumPwad(UINT16 wad, UINT16 lump)
|
||||
|
||||
const char *W_CheckNameForNum(lumpnum_t lumpnum)
|
||||
{
|
||||
return W_CheckNameForNumPwad(WADFILENUM(lumpnum),LUMPNUM(lumpnum));
|
||||
return W_CheckNameForNumPwad(WADFILENUM(lumpnum), LUMPNUM(lumpnum));
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1107,7 +1135,7 @@ UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump)
|
||||
// Should be the only version, but that's not possible until we fix
|
||||
// all the instances of non null-terminated strings in the codebase...
|
||||
//
|
||||
UINT16 W_CheckNumForLongNamePwad(const char *name, UINT16 wad, UINT16 startlump)
|
||||
/*UINT16 W_CheckNumForLongNamePwad(const char *name, UINT16 wad, UINT16 startlump)
|
||||
{
|
||||
UINT16 i;
|
||||
UINT32 hash;
|
||||
@@ -1139,43 +1167,46 @@ UINT16 W_CheckNumForLongNamePwad(const char *name, UINT16 wad, UINT16 startlump)
|
||||
|
||||
// not found.
|
||||
return INT16_MAX;
|
||||
}
|
||||
}*/
|
||||
|
||||
UINT16 W_CheckNumForMarkerStartPwad(const char *name, UINT16 wad, UINT16 startlump)
|
||||
{
|
||||
UINT16 marker;
|
||||
|
||||
marker = W_CheckNumForNamePwad(name, wad, startlump);
|
||||
if (marker != INT16_MAX)
|
||||
marker++; // Do not count the first marker
|
||||
|
||||
return marker;
|
||||
}
|
||||
|
||||
// Look for the first lump from a folder.
|
||||
UINT16 W_CheckNumForFolderStartPK3(const char *name, UINT16 wad, UINT16 startlump)
|
||||
{
|
||||
size_t name_length;
|
||||
INT32 i;
|
||||
UINT16 i;
|
||||
size_t namelen;
|
||||
lumpinfo_t *lump_p = wadfiles[wad]->lumpinfo + startlump;
|
||||
name_length = strlen(name);
|
||||
|
||||
void *val = M_AATreeGetString(wadfiles[wad]->startfolders, name);
|
||||
if (val != NULL)
|
||||
return (uintptr_t)val;
|
||||
folder_map_itr it = folder_map_get(&wadfiles[wad]->startfolders->map, name);
|
||||
if (!folder_map_is_end(it))
|
||||
return it.data->val;
|
||||
|
||||
namelen = strlen(name);
|
||||
|
||||
for (i = startlump; i < wadfiles[wad]->numlumps; i++, lump_p++)
|
||||
{
|
||||
if (strnicmp(name, lump_p->fullname, name_length) == 0)
|
||||
if (strnicmp(name, lump_p->fullname, namelen) == 0)
|
||||
{
|
||||
/* SLADE is special and puts a single directory entry. Skip that. */
|
||||
if (strlen(lump_p->fullname) == name_length)
|
||||
if (lump_p->fullnamelength == namelen)
|
||||
i++;
|
||||
|
||||
M_AATreeSetString(wadfiles[wad]->startfolders, name, (void *)(uintptr_t)i);
|
||||
folder_map_insert(&wadfiles[wad]->startfolders->map, strdup(name), i);
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
M_AATreeSetString(wadfiles[wad]->startfolders, name, (void *)INT16_MAX);
|
||||
folder_map_insert(&wadfiles[wad]->startfolders->map, strdup(name), INT16_MAX);
|
||||
return INT16_MAX;
|
||||
}
|
||||
|
||||
@@ -1184,21 +1215,23 @@ UINT16 W_CheckNumForFolderStartPK3(const char *name, UINT16 wad, UINT16 startlum
|
||||
// Returns the position of the lumpinfo entry.
|
||||
UINT16 W_CheckNumForFolderEndPK3(const char *name, UINT16 wad, UINT16 startlump)
|
||||
{
|
||||
INT32 i;
|
||||
UINT16 i;
|
||||
size_t namelen;
|
||||
lumpinfo_t *lump_p = wadfiles[wad]->lumpinfo + startlump;
|
||||
size_t name_length = strlen(name);
|
||||
|
||||
void *val = M_AATreeGetString(wadfiles[wad]->endfolders, name);
|
||||
if (val != NULL)
|
||||
return (uintptr_t)val;
|
||||
folder_map_itr it = folder_map_get(&wadfiles[wad]->endfolders->map, name);
|
||||
if (!folder_map_is_end(it))
|
||||
return it.data->val;
|
||||
|
||||
namelen = strlen(name);
|
||||
|
||||
for (i = startlump; i < wadfiles[wad]->numlumps; i++, lump_p++)
|
||||
{
|
||||
if (strnicmp(name, lump_p->fullname, name_length))
|
||||
if (strnicmp(name, lump_p->fullname, namelen))
|
||||
break;
|
||||
}
|
||||
|
||||
M_AATreeSetString(wadfiles[wad]->endfolders, name, (void *)(uintptr_t)i);
|
||||
folder_map_insert(&wadfiles[wad]->endfolders->map, strdup(name), i);
|
||||
return i;
|
||||
}
|
||||
|
||||
@@ -1206,13 +1239,15 @@ UINT16 W_CheckNumForFolderEndPK3(const char *name, UINT16 wad, UINT16 startlump)
|
||||
// Returns lump position in PK3's lumpinfo, or INT16_MAX if not found.
|
||||
UINT16 W_CheckNumForFullNamePK3(const char *name, UINT16 wad, UINT16 startlump)
|
||||
{
|
||||
INT32 i;
|
||||
UINT16 i;
|
||||
size_t namelen;
|
||||
lumpinfo_t *lump_p = wadfiles[wad]->lumpinfo + startlump;
|
||||
size_t name_length = strlen(name);
|
||||
|
||||
namelen = strlen(name);
|
||||
|
||||
for (i = startlump; i < wadfiles[wad]->numlumps; i++, lump_p++)
|
||||
{
|
||||
if (!strnicmp(name, lump_p->fullname, name_length))
|
||||
if (!strnicmp(name, lump_p->fullname, namelen))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
@@ -1222,61 +1257,19 @@ UINT16 W_CheckNumForFullNamePK3(const char *name, UINT16 wad, UINT16 startlump)
|
||||
return INT16_MAX;
|
||||
}
|
||||
|
||||
static lumpnum_t CheckLumpInCache(const char *name, boolean longname)
|
||||
FUNCINLINE static ATTRINLINE lumpnum_t CheckLumpInCache(const char *name)
|
||||
{
|
||||
if (longname)
|
||||
{
|
||||
UINT32 hash = quickncasehash(name, 32);
|
||||
|
||||
// Loop backwards so that we check most recent entries first
|
||||
for (INT32 i = lumpnumcacheindex + LUMPNUMCACHESIZE; i > lumpnumcacheindex; i--)
|
||||
{
|
||||
if (lumpnumcache[i & (LUMPNUMCACHESIZE - 1)].hash == hash
|
||||
&& fasticmp(lumpnumcache[i & (LUMPNUMCACHESIZE - 1)].lumpname, name))
|
||||
{
|
||||
lumpnumcacheindex = i & (LUMPNUMCACHESIZE - 1);
|
||||
return lumpnumcache[lumpnumcacheindex].lumpnum;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT32 hash = quickncasehash(name, 8);
|
||||
|
||||
// Loop backwards so that we check most recent entries first
|
||||
for (INT32 i = lumpnumcacheindex + LUMPNUMCACHESIZE; i > lumpnumcacheindex; i--)
|
||||
{
|
||||
if (lumpnumcache[i & (LUMPNUMCACHESIZE - 1)].hash == hash
|
||||
&& lumpnumcache[i & (LUMPNUMCACHESIZE - 1)].lumpname[8] == '\0'
|
||||
&& strnicmp(lumpnumcache[i & (LUMPNUMCACHESIZE - 1)].lumpname, name, 8) == 0)
|
||||
{
|
||||
lumpnumcacheindex = i & (LUMPNUMCACHESIZE - 1);
|
||||
return lumpnumcache[lumpnumcacheindex].lumpnum;
|
||||
}
|
||||
}
|
||||
}
|
||||
lumpnum_map_itr it = lumpnum_map_get(&lumpnumcache, name);
|
||||
if (!lumpnum_map_is_end(it))
|
||||
return it.data->val;
|
||||
|
||||
return LUMPERROR;
|
||||
}
|
||||
|
||||
static void AddLumpToCache(lumpnum_t lumpnum, const char *name, boolean longname)
|
||||
FUNCINLINE static ATTRINLINE void AddLumpToCache(lumpnum_t lumpnum, const char *name)
|
||||
{
|
||||
if (longname && strlen(name) >= LUMPNUMCACHENAME)
|
||||
return;
|
||||
|
||||
lumpnumcacheindex = (lumpnumcacheindex + 1) & (LUMPNUMCACHESIZE - 1);
|
||||
memset(lumpnumcache[lumpnumcacheindex].lumpname, '\0', LUMPNUMCACHENAME);
|
||||
if (longname)
|
||||
{
|
||||
strlcpy(lumpnumcache[lumpnumcacheindex].lumpname, name, LUMPNUMCACHENAME);
|
||||
lumpnumcache[lumpnumcacheindex].hash = quickncasehash(name, LUMPNUMCACHENAME);
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(lumpnumcache[lumpnumcacheindex].lumpname, name, 8);
|
||||
lumpnumcache[lumpnumcacheindex].hash = quickncasehash(name, 8);
|
||||
}
|
||||
lumpnumcache[lumpnumcacheindex].lumpnum = lumpnum;
|
||||
I_Assert(strlen(name) <= 8); // we dont have longnames, so assume this is a non terminated string
|
||||
lumpnum_map_insert(&lumpnumcache, strdup(name), lumpnum);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1292,14 +1285,14 @@ lumpnum_t W_CheckNumForName(const char *name)
|
||||
return LUMPERROR;
|
||||
|
||||
// Check the lumpnumcache first.
|
||||
lumpnum_t cachenum = CheckLumpInCache(name, false);
|
||||
lumpnum_t cachenum = CheckLumpInCache(name);
|
||||
if (cachenum != LUMPERROR)
|
||||
return cachenum;
|
||||
|
||||
// scan wad files backwards so patch lump files take precedence
|
||||
for (i = numwadfiles - 1; i >= 0; i--)
|
||||
{
|
||||
check = W_CheckNumForNamePwad(name, (UINT16)i, 0);
|
||||
check = W_CheckNumForNamePwad(name, (UINT16)(i), 0);
|
||||
|
||||
if (check != INT16_MAX)
|
||||
break; //found it
|
||||
@@ -1313,7 +1306,7 @@ lumpnum_t W_CheckNumForName(const char *name)
|
||||
{
|
||||
// Update the cache.
|
||||
lumpnum_t lumpnum = (i << 16) | check;
|
||||
AddLumpToCache(lumpnum, name, false);
|
||||
AddLumpToCache(lumpnum, name);
|
||||
|
||||
return lumpnum;
|
||||
}
|
||||
@@ -1325,7 +1318,7 @@ lumpnum_t W_CheckNumForName(const char *name)
|
||||
// Should be the only version, but that's not possible until we fix
|
||||
// all the instances of non null-terminated strings in the codebase...
|
||||
//
|
||||
lumpnum_t W_CheckNumForLongName(const char *name)
|
||||
/*lumpnum_t W_CheckNumForLongName(const char *name)
|
||||
{
|
||||
INT32 i;
|
||||
lumpnum_t check = INT16_MAX;
|
||||
@@ -1334,14 +1327,14 @@ lumpnum_t W_CheckNumForLongName(const char *name)
|
||||
return LUMPERROR;
|
||||
|
||||
// Check the lumpnumcache first.
|
||||
lumpnum_t cachenum = CheckLumpInCache(name, true);
|
||||
lumpnum_t cachenum = CheckLumpInCache(name);
|
||||
if (cachenum != LUMPERROR)
|
||||
return cachenum;
|
||||
|
||||
// scan wad files backwards so patch lump files take precedence
|
||||
for (i = numwadfiles - 1; i >= 0; i--)
|
||||
{
|
||||
check = W_CheckNumForLongNamePwad(name, (UINT16)i, 0);
|
||||
check = W_CheckNumForLongNamePwad(name, (UINT16)(i), 0);
|
||||
|
||||
if (check != INT16_MAX)
|
||||
break; //found it
|
||||
@@ -1355,11 +1348,11 @@ lumpnum_t W_CheckNumForLongName(const char *name)
|
||||
{
|
||||
// Update the cache.
|
||||
lumpnum_t lumpnum = (i << 16) | check;
|
||||
AddLumpToCache(lumpnum, name, true);
|
||||
AddLumpToCache(lumpnum, name);
|
||||
|
||||
return lumpnum;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
//
|
||||
// W_GetNumForName
|
||||
@@ -1384,7 +1377,7 @@ lumpnum_t W_GetNumForName(const char *name)
|
||||
// Should be the only version, but that's not possible until we fix
|
||||
// all the instances of non null-terminated strings in the codebase...
|
||||
//
|
||||
lumpnum_t W_GetNumForLongName(const char *name)
|
||||
/*lumpnum_t W_GetNumForLongName(const char *name)
|
||||
{
|
||||
lumpnum_t i;
|
||||
|
||||
@@ -1394,7 +1387,7 @@ lumpnum_t W_GetNumForLongName(const char *name)
|
||||
I_Error("W_GetNumForLongName: %s not found!\n", name);
|
||||
|
||||
return i;
|
||||
}
|
||||
}*/
|
||||
|
||||
//
|
||||
// W_CheckNumForNameInBlock
|
||||
@@ -1411,32 +1404,49 @@ lumpnum_t W_CheckNumForNameInBlock(const char *name, const char *blockstart, con
|
||||
{
|
||||
if (wadfiles[i]->type == RET_WAD)
|
||||
{
|
||||
bsid = W_CheckNumForNamePwad(blockstart, (UINT16)i, 0);
|
||||
bsid = W_CheckNumForNamePwad(blockstart, (UINT16)(i), 0);
|
||||
if (bsid == INT16_MAX)
|
||||
continue; // Start block doesn't exist?
|
||||
beid = W_CheckNumForNamePwad(blockend, (UINT16)i, 0);
|
||||
beid = W_CheckNumForNamePwad(blockend, (UINT16)(i), 0);
|
||||
if (beid == INT16_MAX)
|
||||
continue; // End block doesn't exist?
|
||||
|
||||
check = W_CheckNumForNamePwad(name, (UINT16)i, bsid);
|
||||
check = W_CheckNumForNamePwad(name, (UINT16)(i), bsid);
|
||||
if (check < beid)
|
||||
return (i<<16)+check; // found it, in our constraints
|
||||
return (i << 16)+check; // found it, in our constraints
|
||||
}
|
||||
}
|
||||
|
||||
return LUMPERROR;
|
||||
}
|
||||
|
||||
// Used by Lua. Case sensitive lump checking, quickly...
|
||||
UINT8 W_LumpExists(const char *name)
|
||||
{
|
||||
INT32 i,j;
|
||||
INT32 i, j;
|
||||
UINT32 hash;
|
||||
size_t namelen;
|
||||
|
||||
// Check the lumpnumcache first.
|
||||
lumpnum_t cachenum = CheckLumpInCache(name);
|
||||
if (cachenum != LUMPERROR)
|
||||
return true;
|
||||
|
||||
namelen = strlen(name);
|
||||
hash = W_HashLumpName(name);
|
||||
|
||||
for (i = numwadfiles - 1; i >= 0; i--)
|
||||
{
|
||||
lumpinfo_t *lump_p = wadfiles[i]->lumpinfo;
|
||||
for (j = 0; j < wadfiles[i]->numlumps; ++j, ++lump_p)
|
||||
if (fastcmp(lump_p->name, name))
|
||||
{
|
||||
if (lump_p->namelength == namelen
|
||||
&& lump_p->hash.name == hash
|
||||
&& fastcmp(lump_p->name, name))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1596,13 +1606,13 @@ size_t W_ReadLumpHeaderPwad(UINT16 wad, UINT16 lump, void *dest, size_t size, si
|
||||
fseek(handle, (long)(l->position + offset), SEEK_SET);
|
||||
|
||||
// But let's not copy it yet. We support different compression formats on lumps, so we need to take that into account.
|
||||
switch(wadfiles[wad]->lumpinfo[lump].compression)
|
||||
switch (wadfiles[wad]->lumpinfo[lump].compression)
|
||||
{
|
||||
case CM_NOCOMPRESSION: // If it's uncompressed, we directly write the data into our destination, and return the bytes read.
|
||||
#ifdef NO_PNG_LUMPS
|
||||
{
|
||||
size_t bytesread = fread(dest, 1, size, handle);
|
||||
ErrorIfPNG((UINT8 *)dest, bytesread, wadfiles[wad]->filename, l->fullname);
|
||||
ErrorIfPNG((UINT8 *)(dest), bytesread, wadfiles[wad]->filename, l->fullname);
|
||||
return bytesread;
|
||||
}
|
||||
#else
|
||||
@@ -1615,8 +1625,8 @@ size_t W_ReadLumpHeaderPwad(UINT16 wad, UINT16 lump, void *dest, size_t size, si
|
||||
char *decData; // Lump's decompressed real data.
|
||||
size_t retval; // Helper var, lzf_decompress returns 0 when an error occurs.
|
||||
|
||||
rawData = Z_Malloc(l->disksize, PU_STATIC, NULL);
|
||||
decData = Z_Malloc(l->size, PU_STATIC, NULL);
|
||||
rawData = (char *)(Z_Malloc(l->disksize, PU_STATIC, NULL));
|
||||
decData = (char *)(Z_Malloc(l->size, PU_STATIC, NULL));
|
||||
|
||||
if (fread(rawData, 1, l->disksize, handle) < l->disksize)
|
||||
I_Error("wad %d, lump %d: cannot read compressed data", wad, lump);
|
||||
@@ -1643,7 +1653,7 @@ size_t W_ReadLumpHeaderPwad(UINT16 wad, UINT16 lump, void *dest, size_t size, si
|
||||
Z_Free(rawData);
|
||||
Z_Free(decData);
|
||||
#ifdef NO_PNG_LUMPS
|
||||
ErrorIfPNG((UINT8 *)dest, size, wadfiles[wad]->filename, l->fullname);
|
||||
ErrorIfPNG((UINT8 *)(dest), size, wadfiles[wad]->filename, l->fullname);
|
||||
#endif
|
||||
return size;
|
||||
#else
|
||||
@@ -1663,8 +1673,8 @@ size_t W_ReadLumpHeaderPwad(UINT16 wad, UINT16 lump, void *dest, size_t size, si
|
||||
unsigned long rawSize = l->disksize;
|
||||
unsigned long decSize = size;
|
||||
|
||||
rawData = Z_Malloc(rawSize, PU_STATIC, NULL);
|
||||
decData = dest;
|
||||
rawData = (UINT8 *)(Z_Malloc(rawSize, PU_STATIC, NULL));
|
||||
decData = (UINT8 *)(dest);
|
||||
|
||||
if (fread(rawData, 1, rawSize, handle) < rawSize)
|
||||
I_Error("wad %d, lump %d: cannot read compressed data", wad, lump);
|
||||
@@ -1700,7 +1710,7 @@ size_t W_ReadLumpHeaderPwad(UINT16 wad, UINT16 lump, void *dest, size_t size, si
|
||||
Z_Free(rawData);
|
||||
|
||||
#ifdef NO_PNG_LUMPS
|
||||
ErrorIfPNG((UINT8 *)dest, size, wadfiles[wad]->filename, l->fullname);
|
||||
ErrorIfPNG((UINT8 *)(dest), size, wadfiles[wad]->filename, l->fullname);
|
||||
#endif
|
||||
return size;
|
||||
}
|
||||
@@ -1888,7 +1898,7 @@ void *W_CacheSoftwarePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
|
||||
W_ReadLumpHeaderPwad(wad, lump, lumpdata, 0, 0);
|
||||
|
||||
dest = Z_Calloc(sizeof(patch_t), tag, &lumpcache[lump]);
|
||||
Patch_Create((softwarepatch_t*)lumpdata, len, dest);
|
||||
Patch_Create((softwarepatch_t *)(lumpdata), len, dest);
|
||||
|
||||
Z_Free(lumpdata);
|
||||
}
|
||||
@@ -1910,7 +1920,7 @@ void *W_CachePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
|
||||
if (!TestValidLump(wad, lump))
|
||||
return NULL;
|
||||
|
||||
patch = (patch_t *)W_CacheSoftwarePatchNumPwad(wad, lump, tag);
|
||||
patch = (patch_t *)(W_CacheSoftwarePatchNumPwad(wad, lump, tag));
|
||||
|
||||
if (patch == NULL)
|
||||
return NULL;
|
||||
@@ -1921,7 +1931,7 @@ void *W_CachePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
|
||||
Patch_CreateGL(patch);
|
||||
#endif
|
||||
|
||||
return (void *)patch;
|
||||
return (void*)(patch);
|
||||
}
|
||||
|
||||
void *W_CachePatchNum(lumpnum_t lumpnum, INT32 tag)
|
||||
@@ -1939,17 +1949,20 @@ void *W_GetCachedPatchNumPwad(UINT16 wad, UINT16 lump)
|
||||
|
||||
#ifdef ROTSPRITE
|
||||
// Caches a rotsprite for patch rotation.
|
||||
void *W_GetCachedRotPatchPwad(UINT16 wadnum, UINT16 lumpnum)
|
||||
void *W_GetCachedRotPatchPwad(UINT16 wad, UINT16 lump)
|
||||
{
|
||||
lumpcache_t *rotcache = wadfiles[wadnum]->rotcache;
|
||||
if (!TestValidLump(wad, lump))
|
||||
return NULL;
|
||||
|
||||
if (!rotcache[lumpnum])
|
||||
lumpcache_t *rotcache = wadfiles[wad]->rotcache;
|
||||
|
||||
if (!rotcache[lump])
|
||||
{
|
||||
rotsprite_t *rspr = RotatedPatch_Create(ROTANGLES);
|
||||
Z_SetUser(rspr, (void **)(&rotcache[lumpnum]));
|
||||
Z_SetUser(rspr, (void**)(&rotcache[lump]));
|
||||
}
|
||||
|
||||
return (void *)(rotcache[lumpnum]);
|
||||
return (void*)(rotcache[lump]);
|
||||
}
|
||||
#endif // ROTSPRITE
|
||||
|
||||
@@ -1962,7 +1975,7 @@ void W_UnlockCachedPatch(void *patch)
|
||||
// have different lifetimes from software's.
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
HWR_UnlockCachedPatch((GLPatch_t *)((patch_t *)patch)->hardware);
|
||||
HWR_UnlockCachedPatch((GLPatch_t *)(((patch_t *)(patch))->hardware));
|
||||
else
|
||||
#endif
|
||||
Z_ChangeTag(patch, PU_PATCH);
|
||||
@@ -1997,7 +2010,7 @@ void *W_CachePatchNameRotated(const char *name, INT32 rotationangle, INT32 tag)
|
||||
if (rotationangle < 1 || rotationangle >= ROTANGLES)
|
||||
return W_CachePatchNum(num, tag);
|
||||
|
||||
rspr = (rotsprite_t *)W_GetCachedRotPatchPwad(WADFILENUM(num),LUMPNUM(num));
|
||||
rspr = (rotsprite_t *)(W_GetCachedRotPatchPwad(WADFILENUM(num), LUMPNUM(num)));
|
||||
|
||||
if (rspr == NULL)
|
||||
return W_CachePatchNum(W_GetNumForName("MISSING"), tag);
|
||||
@@ -2006,7 +2019,7 @@ void *W_CachePatchNameRotated(const char *name, INT32 rotationangle, INT32 tag)
|
||||
{
|
||||
INT32 xpivot = 0, ypivot = 0;
|
||||
|
||||
ptr = (patch_t *)W_CachePatchNum(num, PU_PATCH);
|
||||
ptr = (patch_t *)(W_CachePatchNum(num, PU_PATCH));
|
||||
if (ptr == NULL)
|
||||
return W_CachePatchNum(W_GetNumForName("MISSING"), tag);
|
||||
|
||||
@@ -2199,7 +2212,7 @@ static int W_VerifyPK3(FILE *fp, lumpchecklist_t *checklist, boolean status)
|
||||
fseek(fp, 0, SEEK_END);
|
||||
file_size = ftell(fp);
|
||||
|
||||
const long startpos = (file_size - (22 + 65536));
|
||||
const long startpos = file_size - (22 + 65536);
|
||||
if (!ResFindSignature(fp, pat_end, max(0l, startpos)))
|
||||
return true;
|
||||
|
||||
@@ -2213,7 +2226,7 @@ static int W_VerifyPK3(FILE *fp, lumpchecklist_t *checklist, boolean status)
|
||||
|
||||
fseek(fp, LONG(zend.cdiroffset), SEEK_SET);
|
||||
|
||||
CLEANUP(pfree) char *cdir = (char*)(malloc(LONG(zend.cdirsize)));
|
||||
CLEANUP(pfree) char *cdir = (char *)(malloc(LONG(zend.cdirsize)));
|
||||
|
||||
if (fread(cdir, 1, LONG(zend.cdirsize), fp) < (UINT32)(LONG(zend.cdirsize)))
|
||||
{
|
||||
@@ -2224,7 +2237,7 @@ static int W_VerifyPK3(FILE *fp, lumpchecklist_t *checklist, boolean status)
|
||||
|
||||
for (i = 0; i < numlumps; i++)
|
||||
{
|
||||
zentry_t *zentry = (zentry_t*)(cdir + offset);
|
||||
zentry_t *zentry = (zentry_t *)(cdir + offset);
|
||||
char* fullname;
|
||||
char* trimname;
|
||||
char* dotpos;
|
||||
@@ -2236,8 +2249,9 @@ static int W_VerifyPK3(FILE *fp, lumpchecklist_t *checklist, boolean status)
|
||||
|
||||
if (verified == true)
|
||||
{
|
||||
fullname = (char*)(malloc(SHORT(zentry->namelen) + 1));
|
||||
strlcpy(fullname, (char*)(zentry + 1), SHORT(zentry->namelen) + 1);
|
||||
fullname = (char *)(malloc(SHORT(zentry->namelen) + 1));
|
||||
strncpy(fullname, (char *)(zentry + 1), SHORT(zentry->namelen));
|
||||
fullname[zentry->namelen] = 0;
|
||||
|
||||
// Strip away file address and extension for the 8char name.
|
||||
if ((trimname = strrchr(fullname, '/')) != NULL)
|
||||
@@ -2446,7 +2460,7 @@ static int W_CheckPK3Contains(FILE *fp, lumpchecklist_t *checklist)
|
||||
fseek(fp, 0, SEEK_END);
|
||||
file_size = ftell(fp);
|
||||
|
||||
const long startpos = (file_size - (22 + 65536));
|
||||
const long startpos = file_size - (22 + 65536);
|
||||
if (!ResFindSignature(fp, pat_end, max(0l, startpos)))
|
||||
return true;
|
||||
|
||||
@@ -2460,7 +2474,7 @@ static int W_CheckPK3Contains(FILE *fp, lumpchecklist_t *checklist)
|
||||
|
||||
fseek(fp, LONG(zend.cdiroffset), SEEK_SET);
|
||||
|
||||
CLEANUP(pfree) char *cdir = (char*)(malloc(LONG(zend.cdirsize)));
|
||||
CLEANUP(pfree) char *cdir = (char *)(malloc(LONG(zend.cdirsize)));
|
||||
|
||||
if (fread(cdir, 1, LONG(zend.cdirsize), fp) < (UINT32)(LONG(zend.cdirsize)))
|
||||
{
|
||||
@@ -2471,7 +2485,7 @@ static int W_CheckPK3Contains(FILE *fp, lumpchecklist_t *checklist)
|
||||
|
||||
for (i = 0; i < numlumps; i++)
|
||||
{
|
||||
zentry_t *zentry = (zentry_t*)(cdir + offset);
|
||||
zentry_t *zentry = (zentry_t *)(cdir + offset);
|
||||
CLEANUP(pfree) char* fullname = NULL;
|
||||
char* trimname;
|
||||
char* dotpos;
|
||||
@@ -2481,8 +2495,9 @@ static int W_CheckPK3Contains(FILE *fp, lumpchecklist_t *checklist)
|
||||
return false;
|
||||
}
|
||||
|
||||
fullname = (char*)(malloc(SHORT(zentry->namelen) + 1));
|
||||
strlcpy(fullname, (char*)(zentry + 1), SHORT(zentry->namelen) + 1);
|
||||
fullname = (char *)(malloc(SHORT(zentry->namelen) + 1));
|
||||
strncpy(fullname, (char *)(zentry + 1), SHORT(zentry->namelen));
|
||||
fullname[zentry->namelen] = 0;
|
||||
|
||||
// Strip away file address and extension for the 8char name.
|
||||
if ((trimname = strrchr(fullname, '/')) != NULL)
|
||||
@@ -2573,6 +2588,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[] =
|
||||
@@ -2585,7 +2612,6 @@ int W_CheckPostLoadList(const char *filename)
|
||||
{"SOC_", 4},
|
||||
{"MAINCFG", 7},
|
||||
{"OBJCTCFG", 8},
|
||||
{"MAP", 3},
|
||||
|
||||
{NULL, 0},
|
||||
};
|
||||
@@ -2618,14 +2644,14 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
|
||||
size_t *vsizecache;
|
||||
|
||||
// Remember that we're assuming that the WAD will have a specific set of lumps in a specific order.
|
||||
UINT8 *wadData = (UINT8*)(W_CacheLumpNum(lumpnum, PU_LEVEL));
|
||||
UINT8 *wadData = (UINT8 *)(W_CacheLumpNum(lumpnum, PU_LEVEL));
|
||||
if (wadData == NULL)
|
||||
I_Error("vres_GetMap: Invalid WadData!\n");
|
||||
|
||||
filelump_t *fileinfo = (filelump_t *)(wadData + LONG(((wadinfo_t *)wadData)->infotableofs));
|
||||
filelump_t *fileinfo = (filelump_t *)(wadData + LONG(((wadinfo_t *)(wadData))->infotableofs));
|
||||
|
||||
i = LONG(((wadinfo_t *)wadData)->numlumps);
|
||||
vsizecache = (size_t*)(Z_Malloc(sizeof(size_t)*i, PU_LEVEL, NULL));
|
||||
i = LONG(((wadinfo_t *)(wadData))->numlumps);
|
||||
vsizecache = (size_t *)(Z_Malloc(sizeof(size_t)*i, PU_LEVEL, NULL));
|
||||
|
||||
for (realentry = 0; realentry < i; realentry++)
|
||||
{
|
||||
@@ -2637,7 +2663,7 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
|
||||
numlumps++;
|
||||
}
|
||||
|
||||
vlumps = (virtlump_t*)(Z_Malloc(sizeof(virtlump_t)*numlumps, PU_LEVEL, NULL));
|
||||
vlumps = (virtlump_t *)(Z_Malloc(sizeof(virtlump_t)*numlumps, PU_LEVEL, NULL));
|
||||
if (vlumps == NULL)
|
||||
I_Error("vres_GetMap: Out of memory!\n");
|
||||
|
||||
@@ -2646,11 +2672,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
|
||||
@@ -2659,7 +2686,7 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
|
||||
// Play it safe with the name in this case.
|
||||
memcpy(vlumps[i].name, name, 8);
|
||||
vlumps[i].name[8] = '\0';
|
||||
vlumps[i].data = (UINT8*)(
|
||||
vlumps[i].data = (UINT8 *)(
|
||||
Z_Malloc(vlumps[i].size, PU_LEVEL, NULL) // This is memory inefficient, sorry about that.
|
||||
);
|
||||
memcpy(vlumps[i].data, wadData + LONG((fileinfo + realentry)->filepos), vlumps[i].size);
|
||||
@@ -2686,7 +2713,7 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
|
||||
}
|
||||
numlumps++;
|
||||
|
||||
vlumps = (virtlump_t*)(Z_Malloc(sizeof(virtlump_t)*numlumps, PU_LEVEL, NULL));
|
||||
vlumps = (virtlump_t *)(Z_Malloc(sizeof(virtlump_t)*numlumps, PU_LEVEL, NULL));
|
||||
if (vlumps == NULL)
|
||||
I_Error("vres_GetMap: Out of memory!\n");
|
||||
|
||||
@@ -2707,11 +2734,11 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
|
||||
vlumps[i].size = W_LumpLength(lumpnum);
|
||||
memcpy(vlumps[i].name, name, 8);
|
||||
vlumps[i].name[8] = '\0';
|
||||
vlumps[i].data = (UINT8*)(W_CacheLumpNum(lumpnum, PU_LEVEL));
|
||||
vlumps[i].data = (UINT8 *)(W_CacheLumpNum(lumpnum, PU_LEVEL));
|
||||
}
|
||||
}
|
||||
|
||||
vres = (virtres_t*)(Z_Malloc(sizeof(virtres_t), PU_LEVEL, NULL));
|
||||
vres = (virtres_t *)(Z_Malloc(sizeof(virtres_t), PU_LEVEL, NULL));
|
||||
vres->vlumps = vlumps;
|
||||
vres->numlumps = numlumps;
|
||||
|
||||
|
||||
+11
-13
@@ -68,11 +68,11 @@ typedef struct
|
||||
unsigned long position; // filelump_t filepos
|
||||
unsigned long disksize; // filelump_t size
|
||||
char name[9]; // filelump_t name[] e.g. "LongEntr"
|
||||
char *longname; // e.g. "LongEntryName"
|
||||
//char *longname; // e.g. "LongEntryName"
|
||||
char *fullname; // e.g. "Folder/Subfolder/LongEntryName.extension"
|
||||
|
||||
size_t namelength; // length of name
|
||||
size_t longnamelength; // length of longname
|
||||
//size_t longnamelength; // length of longname
|
||||
size_t fullnamelength; // length of fullname
|
||||
|
||||
size_t size; // real (uncompressed) size
|
||||
@@ -80,8 +80,8 @@ typedef struct
|
||||
|
||||
struct {
|
||||
UINT32 name; // hash of name
|
||||
UINT32 longname; // hash of longname
|
||||
UINT32 fullname; // hash of fullname
|
||||
//UINT32 longname; // hash of longname
|
||||
//UINT32 fullname; // hash of fullname
|
||||
} hash;
|
||||
} lumpinfo_t;
|
||||
|
||||
@@ -126,7 +126,6 @@ typedef enum restype
|
||||
RET_UNKNOWN,
|
||||
} restype_t;
|
||||
|
||||
|
||||
typedef struct wadfile_s
|
||||
{
|
||||
char *filename;
|
||||
@@ -137,8 +136,8 @@ typedef struct wadfile_s
|
||||
#ifdef ROTSPRITE
|
||||
lumpcache_t *rotcache; // Cache rotsprites for rotating patches.
|
||||
#endif
|
||||
aatree_t *startfolders;
|
||||
aatree_t *endfolders;
|
||||
struct FolderCache *startfolders;
|
||||
struct FolderCache *endfolders;
|
||||
UINT16 numlumps; // this wad's number of resources
|
||||
FILE *handle;
|
||||
UINT32 filesize; // for network
|
||||
@@ -174,13 +173,11 @@ INT32 W_AddAutoloadedLocalFiles(char **filenames);
|
||||
|
||||
#define W_FileHasFolders(wadfile) ((wadfile)->type == RET_PK3)
|
||||
|
||||
UINT32 W_HashLumpName(const char *name);
|
||||
|
||||
const char *W_CheckNameForNumPwad(UINT16 wad, UINT16 lump);
|
||||
const char *W_CheckNameForNum(lumpnum_t lumpnum);
|
||||
|
||||
UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump); // checks only in one pwad
|
||||
UINT16 W_CheckNumForLongNamePwad(const char *name, UINT16 wad, UINT16 startlump);
|
||||
//UINT16 W_CheckNumForLongNamePwad(const char *name, UINT16 wad, UINT16 startlump);
|
||||
|
||||
/* Find the first lump after F_START for instance. */
|
||||
UINT16 W_CheckNumForMarkerStartPwad(const char *name, UINT16 wad, UINT16 startlump);
|
||||
@@ -190,9 +187,9 @@ UINT16 W_CheckNumForFolderStartPK3(const char *name, UINT16 wad, UINT16 startlum
|
||||
UINT16 W_CheckNumForFolderEndPK3(const char *name, UINT16 wad, UINT16 startlump);
|
||||
|
||||
lumpnum_t W_CheckNumForName(const char *name);
|
||||
lumpnum_t W_CheckNumForLongName(const char *name);
|
||||
//lumpnum_t W_CheckNumForLongName(const char *name);
|
||||
lumpnum_t W_GetNumForName(const char *name); // like W_CheckNumForName but I_Error on LUMPERROR
|
||||
lumpnum_t W_GetNumForLongName(const char *name);
|
||||
//lumpnum_t W_GetNumForLongName(const char *name);
|
||||
lumpnum_t W_CheckNumForNameInBlock(const char *name, const char *blockstart, const char *blockend);
|
||||
UINT8 W_LumpExists(const char *name); // Lua uses this.
|
||||
UINT8 W_CheckMultipleLumps(const char* lump, ...); // variadic version of above lmao
|
||||
@@ -233,7 +230,7 @@ void *W_CacheSoftwarePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag);
|
||||
void *W_CacheSoftwarePatchNum(lumpnum_t lumpnum, INT32 tag);
|
||||
|
||||
#ifdef ROTSPRITE
|
||||
void *W_GetCachedRotPatchPwad(UINT16 wadnum, UINT16 lumpnum); // Get patch-based rotsprites from the cache.
|
||||
void *W_GetCachedRotPatchPwad(UINT16 wad, UINT16 lump); // Get patch-based rotsprites from the cache.
|
||||
void *W_CachePatchNameRotated(const char *name, INT32 rotationangle, INT32 tag);
|
||||
#endif
|
||||
|
||||
@@ -243,6 +240,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