Compare commits

..
Author SHA1 Message Date
alufolie91 0016d4836a hash_sparse: change length checks
dont early return on 0 len, let it be the falltrough case, this seems to help branch prediction
2026-02-22 14:03:50 +01:00
alufolie91 66bc684738 luaS_newlstr: use hash also for checking strings
taken from raptorjit
we can check the hash first to skip quite a bunch of memcmps which should be faster in most cases (hopefully but quick timedemo tests confirmed that)
2026-02-22 01:57:20 +01:00
alufolie91 44e377c981 blua: handle 0 length strings in hash_sparse 2026-02-21 23:13:27 +01:00
Alug 91de633633 Experiment: replace lua´s string hash with luajits ARX hash
the string hashing was the most hit and most spent in part of the whole game in alot of cases
replacing it with luajits algo absolutely massively improves lua performance (10-15fps in my bench timedemos!)
however idk how all this stuff exactly works so this needs alot of testing to make sure nothing breaks
ive rewritten the unaligned ptr access slightly to use memcpy for safety with some platforms that require stricter alignment
2026-02-11 17:02:28 +01:00
Alug f1047f9e76 Merge branch 'Saturn-Next' into bluaopti 2026-02-11 16:58:51 +01:00
Roberto Ierusalimschy 864e28fcf7 Avoid computing invalid addresses
luaV_execute should compute 'ra' only when the instruction uses it.
Computing an illegal address is undefined behavior even if the address
is never dereferenced.
2026-02-11 14:20:30 +01:00
Alug b2b0ca17d3 lua branching hint stuff
rechecked against lua 5.4
2026-02-11 14:20:27 +01:00
Alug 9b879e31e2 Merge branch 'Saturn-Next' into bluaopti 2025-12-09 18:07:26 +01:00
Alug 8e5633a23f Blua: supress "-Wcast-qual" warnings
from intentional casts
2025-12-03 20:09:32 +01:00
Alug 8bcada1fda Blua: opcode OP_SELF operate only with string keys, so they can use fast-track table access
https://github.com/lua/lua/commit/cb3d5dce30089512085f78a0bef79e30ef732e30
2025-12-03 19:42:13 +01:00
Alug 771152b919 Blua: OP_SELF can use 'luaV_fastget' specialized for strings, as it is applied only to string keys
https://github.com/lua/lua/commit/257961c601fdec1ea1f9640d460e0d31c39333a1
2025-12-03 19:42:09 +01:00
Alug b4277c88c1 Blua: 'luaV_fastget' only treats the real fast case (table with a non-nil value at given key, so that it does not need to check metamethods)
https://github.com/lua/lua/commit/1a44e822009752513ce895b9eabc51a4ee4a195a
2025-12-03 19:42:05 +01:00
Alug 63026cc11d Blua: 'Protect' in table operations is not needed in the fast track
https://github.com/lua/lua/commit/df8b996bccd3830d6fe9d7ba80e8fccd6ac3cabf
2025-12-03 19:42:02 +01:00
Alug b8385d1579 Blua: fast track for 'settable'
https://github.com/lua/lua/commit/3b795541c488c7e633567897c9112312007a20a0
https://github.com/lua/lua/commit/b91bc93fd33f2158745b37c9e091c6fa4d1a4fd5

had to adjust some things, hope this doesent explode lmao
2025-12-03 19:01:38 +01:00
Alug 916cc9d8ca Blua: implementation of fast track for gettable operations
https://github.com/lua/lua/commit/e247c3ada3ff47a1352927e797263137f4e02e0e

lets hope i converted this properly lul
2025-12-03 19:01:35 +01:00
Alug 347000a326 Blua: small optimization in luaL_addlstring (avoid adding chars one by one)
https://github.com/lua/lua/commit/f292760f12022a83cf01e788482a264aeeb3c276
2025-12-03 19:01:32 +01:00
Alug 4967313720 Blua: better names for metamethods in debug information
https://github.com/lua/lua/commit/becf19feeffeb0bf2297e163da4ccc7b4b5e6b5c
2025-12-03 19:01:29 +01:00
Alug 19b64a8b61 Blua: small optimization (reorder of BinOpr enum to unify some cases in switches)
https://github.com/lua/lua/commit/d7872dcf91eb2075312a03973a6cdb489610c796
2025-12-03 19:01:26 +01:00
Alug 6a7b2b9721 Blua: micro-optimization: avoid one API call in 'read_chars'
https://github.com/lua/lua/commit/f86f4116c82654d24faa4a32a909d0c27f3d4746
2025-12-03 19:01:24 +01:00
103 changed files with 2645 additions and 5300 deletions

No files matched your search

+1 -1
View File
@@ -54,7 +54,7 @@ set(SRB2_CORE_SOURCES
string.c
tables.c
v_video.c
w_wad.cpp
w_wad.c
y_inter.c
z_zone.cpp
)
+3 -4
View File
@@ -269,13 +269,13 @@ endif
ifdef USEASAN
# compile with asan
opts+=-O1 -fsanitize=address -fno-omit-frame-pointer -fno-common
opts+=-fsanitize=address
libs+=-fsanitize=address
endif
ifdef USEUBSAN
# compile with ubsan
opts+=-O1 -fsanitize=undefined -fno-omit-frame-pointer
# compile with asan
opts+=-fsanitize=undefined
libs+=-fsanitize=undefined
endif
@@ -295,7 +295,6 @@ 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)
+12 -13
View File
@@ -20,8 +20,7 @@ $(foreach v,$(join $(wordlist 2,$(_n),- $(gcc_versions)),\
CXXFLAGS+= -Wno-aggregate-return
# -W -Wno-unused
WFLAGS:=-Wall -Wnull-dereference
#WFLAGS+=-Wno-trigraphs
WFLAGS:=-Wall -Wno-trigraphs -Wnull-dereference
ifdef GCC152
WFLAGS+=-Wzero-as-null-pointer-constant
endif
@@ -32,7 +31,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
@@ -63,7 +62,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
@@ -106,14 +105,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
@@ -131,21 +130,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++))
@@ -184,6 +183,6 @@ endif
# Lua
ifdef GCC43
ifndef GCC44
#WFLAGS+=-Wno-logical-op
WFLAGS+=-Wno-logical-op
endif
endif
+9 -6
View File
@@ -434,7 +434,7 @@ LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {
LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) {
lua_lock(L);
luaC_checkGC(L);
setsvalue2s(L, L->top, (len == 0) ? luaS_newlstr(L, "", 0) : luaS_newlstr(L, s, len));
setsvalue2s(L, L->top, (len == 0) ? luaS_new(L, "") : luaS_newlstr(L, s, len));
api_incr_top(L);
lua_unlock(L);
}
@@ -519,8 +519,8 @@ LUA_API int lua_pushthread (lua_State *L) {
** get functions (Lua -> stack)
*/
static void auxgetstr (lua_State *L, TValue *t, const char *k) {
TValue *slot;
static void auxgetstr (lua_State *L, const TValue *t, const char *k) {
const TValue *slot;
TValue key;
TString *str = luaS_new(L, k);
api_checkvalidindex(L, t);
@@ -640,10 +640,11 @@ LUA_API void lua_getfenv (lua_State *L, int idx) {
** set functions (stack -> Lua)
*/
static void auxsetstr (lua_State *L, TValue *t, const char *k) {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcast-qual"
static void auxsetstr (lua_State *L, const TValue *t, const char *k) {
TValue key;
TValue *slot;
const TValue *slot;
TString *str = luaS_new(L, k);
api_checknelems(L, 1);
api_checkvalidindex(L, t);
@@ -671,6 +672,8 @@ LUA_API void lua_settable (lua_State *L, int idx) {
lua_unlock(L);
}
#pragma GCC diagnostic pop
LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {
lua_lock(L);
+1 -1
View File
@@ -61,7 +61,7 @@ TValue *luaT_gettm (Table *events, TMS event, TString *ename) {
}
TValue *luaT_gettmbyobj (lua_State *L, TValue *o, TMS event) {
TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {
Table *mt;
switch (ttype(o)) {
case LUA_TTABLE:
+1 -1
View File
@@ -55,7 +55,7 @@ LUAI_DATA const char *const luaT_typenames[];
LUAI_FUNC TValue *luaT_gettm (Table *events, TMS event, TString *ename);
LUAI_FUNC TValue *luaT_gettmbyobj (lua_State *L, TValue *o, TMS event);
LUAI_FUNC TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event);
LUAI_FUNC void luaT_init (lua_State *L);
#endif
+19 -12
View File
@@ -110,10 +110,10 @@ static void callTM (lua_State *L, const TValue *f, const TValue *p1,
** if 'slot' is NULL, 't' is not a table; otherwise, 'slot' points to
** t[k] entry (which must be nil).
*/
void luaV_finishget (lua_State *L, TValue *t, TValue *key, StkId val,
TValue *slot) {
void luaV_finishget (lua_State *L, const TValue *t, TValue *key, StkId val,
const TValue *slot) {
int loop; /* counter to avoid infinite loops */
TValue *tm; /* metamethod */
const TValue *tm; /* metamethod */
for (loop = 0; loop < MAXTAGLOOP; loop++) {
if (slot == NULL) { /* 't' is not a table? */
lua_assert(!ttistable(t));
@@ -145,7 +145,6 @@ void luaV_finishget (lua_State *L, TValue *t, TValue *key, StkId val,
luaG_runerror(L, "'__index' chain too long; possible loop");
}
/*
** Finish a table assignment 't[key] = val'.
** If 'slot' is NULL, 't' is not a table. Otherwise, 'slot' points
@@ -153,11 +152,13 @@ void luaV_finishget (lua_State *L, TValue *t, TValue *key, StkId val,
** entry. (The value at 'slot' must be nil, otherwise 'luaV_fastset'
** would have done the job.)
*/
void luaV_finishset (lua_State *L, TValue *t, TValue *key,
StkId val, TValue *slot) {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcast-qual"
void luaV_finishset (lua_State *L, const TValue *t, TValue *key,
StkId val, const TValue *slot) {
int loop; /* counter to avoid infinite loops */
for (loop = 0; loop < MAXTAGLOOP; loop++) {
TValue *tm;
const TValue *tm;
if (slot != NULL) {
lua_assert(ttistable(t) && ttisnil(slot));
Table *h = hvalue(t);
@@ -188,9 +189,10 @@ void luaV_finishset (lua_State *L, TValue *t, TValue *key,
}
luaG_runerror(L, "settable chain too long; possible loop");
}
#pragma GCC diagnostic pop
static int call_binTM (lua_State *L, TValue *p1, TValue *p2,
static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2,
StkId res, TMS event) {
const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */
if (ttisnil(tm))
@@ -215,7 +217,7 @@ static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2,
}
static int call_orderTM (lua_State *L, TValue *p1, TValue *p2,
static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2,
TMS event) {
const TValue *tm1 = luaT_gettmbyobj(L, p1, event);
const TValue *tm2;
@@ -409,17 +411,20 @@ static void Arith (lua_State *L, StkId ra, TValue *rb,
}
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcast-qual"
/*
** copy of 'luaV_gettable', but protecting call to potential metamethod
** (which can reallocate the stack)
*/
#define gettableProtected(L,t,k,v) { TValue *slot; \
#define gettableProtected(L,t,k,v) { const TValue *slot; \
if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \
else Protect(luaV_finishget(L,t,k,v,slot)); }
/* same for 'luaV_settable' */
#define settableProtected(L,t,k,v) { TValue *slot; \
#define settableProtected(L,t,k,v) { const TValue *slot; \
if (!luaV_fastset(L,t,k,slot,luaH_set,v)) \
Protect(luaV_finishset(L,t,k,v,slot)); }
@@ -529,8 +534,8 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue;
}
case OP_SELF: {
TValue *slot;
StkId ra = RA(i);
const TValue *slot;
StkId rb = RB(i);
TValue *rc = RKC(i);
TString *key = rawtsvalue(rc); /* key must be a string */
@@ -906,3 +911,5 @@ void luaV_execute (lua_State *L, int nexeccalls) {
}
}
}
#pragma GCC diagnostic pop
+6 -7
View File
@@ -38,7 +38,7 @@
/*
** standard implementation for 'gettable'
*/
#define luaV_gettable(L,t,k,v) { TValue *slot; \
#define luaV_gettable(L,t,k,v) { const TValue *slot; \
if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \
else luaV_finishget(L,t,k,v,slot); }
@@ -63,8 +63,7 @@
1; \
}))))
#define luaV_settable(L,t,k,v) { TValue *slot; \
#define luaV_settable(L,t,k,v) { const TValue *slot; \
if (!luaV_fastset(L,t,k,slot,luaH_set,v)) \
luaV_finishset(L,t,k,v,slot); }
@@ -74,10 +73,10 @@ LUAI_FUNC int luaV_lessthan (lua_State *L, TValue *l, TValue *r);
LUAI_FUNC int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2);
LUAI_FUNC const TValue *luaV_tonumber (const TValue *obj, TValue *n);
LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj);
LUAI_FUNC void luaV_finishget (lua_State *L, TValue *t, TValue *key,
StkId val, TValue *tm);
LUAI_FUNC void luaV_finishset (lua_State *L, TValue *t, TValue *key,
StkId val, TValue *oldval);
LUAI_FUNC void luaV_finishget (lua_State *L, const TValue *t, TValue *key,
StkId val, const TValue *tm);
LUAI_FUNC void luaV_finishset (lua_State *L, const TValue *t, TValue *key,
StkId val, const TValue *oldval);
LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls);
LUAI_FUNC void luaV_concat (lua_State *L, int total, int last);
+3 -65
View File
@@ -1165,39 +1165,6 @@ 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 vt_hash_string
#define CMPR_FN vt_cmpr_string
#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.
@@ -1208,17 +1175,11 @@ static const char *cv_null_string = "";
*/
consvar_t *CV_FindVar(const char *name)
{
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))
if (fasticmp(name,cvar->name))
return cvar;
*/
return NULL;
}
@@ -1233,7 +1194,7 @@ consvar_t *CV_FindVar(const char *name)
static inline UINT16 CV_ComputeNetid(const char *s)
{
UINT16 ret = 0, i = 0;
static const UINT16 premiers[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};
static UINT16 premiers[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};
while (*s)
{
@@ -1252,17 +1213,11 @@ 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;
@@ -1328,11 +1283,6 @@ 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.
@@ -1638,21 +1588,9 @@ 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--)
+71 -33
View File
@@ -46,16 +46,16 @@
#ifdef HAVE_THREADS
I_mutex con_mutex;
// I_In_Exiting_Signal_Handler is an evil hack
// g_in_exiting_signal_handler is an evil hack
// 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_lock_mutex(&con_mutex); }
# define Unlock_state() if (!I_In_Exiting_Signal_Handler()) { I_unlock_mutex(con_mutex); }
#else /*HAVE_THREADS*/
# define Lock_state() if (!g_in_exiting_signal_handler) { I_lock_mutex(&con_mutex); }
# define Unlock_state() if (!g_in_exiting_signal_handler) { I_unlock_mutex(con_mutex); }
#else/*HAVE_THREADS*/
# define Lock_state()
# define Unlock_state()
#endif /*HAVE_THREADS*/
#endif/*HAVE_THREADS*/
static boolean con_started = false; // console has been initialised
boolean con_startup = false; // true at game startup, screen need refreshing
@@ -640,25 +640,65 @@ INT32 CON_ShiftChar(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
{
if (shiftdown)
ch = shiftxform[ch];
else if (cv_keyboardlayout.value == 3)
if (cv_keyboardlayout.value == 3)
{
if (altdown & 0x2)
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
{
if (shiftdown)
ch = shiftxform[ch];
else if (altdown & 0x2)
{
ch = french_altgrxform[ch];
}
else
{
ch = HU_FallBackFrSpecialLetter(ch);
}
}
return ch;
}
// Clear time of console heads up messages
//
@@ -852,7 +892,7 @@ boolean CON_Responder(event_t *ev)
return true;
// ctrl modifier -- changes behavior, adds shortcuts
if (ctrldown && (cv_keyboardlayout.value != 3 || !altdown))
if ((cv_keyboardlayout.value != 3 && ctrldown) || (cv_keyboardlayout.value == 3 && ctrldown && !altdown))
{
// show all cvars/commands that match what we have inputted
if (key == KEY_TAB)
@@ -1182,10 +1222,19 @@ void CON_LogMessage(const char *msg)
// Console print! Wahooo! Lots o fun!
//
static inline void CONS_PrintMsg(char *txt)
void CONS_Printf(const char *fmt, ...)
{
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);
@@ -1211,21 +1260,6 @@ static inline void CONS_PrintMsg(char *txt)
}
}
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;
@@ -1254,7 +1288,9 @@ void CONS_Alert(alerttype_t level, const char *fmt, ...)
break;
}
CONS_PrintMsg(txt);
// I am lazy and I feel like just letting CONS_Printf take care of things.
// Is that okay?
CONS_Printf("%s", txt);
}
void CONS_Debug(INT32 debugflags, const char *fmt, ...)
@@ -1272,9 +1308,11 @@ void CONS_Debug(INT32 debugflags, const char *fmt, ...)
vsnprintf(txt, 8192, fmt, argptr);
va_end(argptr);
CONS_PrintMsg(txt);
// Again I am lazy, oh well
CONS_Printf("%s", txt);
}
// Print an error message, and wait for ENTER key to continue.
// To make sure the user has seen the message
//
+1 -8
View File
@@ -13,10 +13,6 @@
#ifndef __CONSOLE__
#define __CONSOLE__
#ifdef __cplusplus
extern "C" {
#endif
#include "d_event.h"
#include "command.h"
#include "i_threads.h"
@@ -49,6 +45,7 @@ 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
@@ -66,8 +63,4 @@ boolean CON_Ready(void);
void CON_LogMessage(const char *msg);
#ifdef __cplusplus
} // extern "C"
#endif
#endif
+345 -476
View File
File diff suppressed because it is too large. Load diff
+3 -7
View File
@@ -600,8 +600,6 @@ extern consvar_t cv_discordinvites;
extern consvar_t cv_serverinfoscreen;
extern consvar_t cv_serveraddoninfo;
// Used in d_net, the only dependence
//tic_t ExpandTics(INT32 low, tic_t basetic);
void D_ClientServerInit(void);
@@ -656,17 +654,15 @@ void D_ResetTiccmds(void);
tic_t GetLag(INT32 node);
extern boolean hu_resynching;
extern UINT8 hu_resynching;
#ifdef SATURNPAK
extern boolean hu_redownloadinggamestate;
extern UINT8 hu_redownloadinggamestate;
#endif
extern boolean hu_stopped; // kart, true when the game is stopped for players due to a disconnecting or connecting player
#define SAVEGAMESIZE (768*1024)
typedef struct rewind_s
{
UINT8 savebuffer[SAVEGAMESIZE];
UINT8 savebuffer[(768*1024)];
tic_t leveltime;
size_t demopos;
+22 -51
View File
@@ -130,8 +130,8 @@ static size_t startuppwadcount = 0;
// autoloading
static char *autoloadwadfiles[MAX_WADFILES];
static char *autoloadwadfilespost[MAX_WADFILES];
static size_t autoloadwadcount = 0;
static size_t postloadwadcount = 0;
static size_t autoloadcount = 0;
static size_t postloadcount = 0;
//
boolean devparm = false; // started game with -devparm
@@ -697,11 +697,6 @@ void D_SRB2Loop(void)
for (;;)
{
if (I_Interrupted())
{
I_Quit();
}
// capbudget is the minimum precise_t duration of a single loop iteration
precise_t capbudget;
precise_t elapsed;
@@ -1037,38 +1032,25 @@ 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("D_AutoloadFile: No more free memory to autoload file %s", file);
I_Error("No more free memory to AutoloadFile %s",file);
strcpy(newfile, file);
filearray[*index] = newfile;
(*index)++;
filearray[index] = newfile;
}
else
{
@@ -1111,7 +1093,7 @@ static void D_FindAddonsToAutoload(void)
// If the file is found, run our shit
if (!autoloadconfigfile) // nope outta here
{
autoloadwadcount = postloadwadcount = 0; // so D_AddAutoloadFiles can skip everything since nothings there to autoload
autoloadcount = postloadcount = 0; // so D_AddAutoloadFiles can skip everything since nothings there to autoload
return;
}
@@ -1137,34 +1119,27 @@ 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("Autoload: forcing postload for file %s\n", wadsToAutoload);
CONS_Printf("forcing postload for file %s\n", wadsToAutoload);
postload = true;
}
// LOAD IT
if (!postload)
{
D_AutoloadFile(wadsToAutoload, autoloadwadfiles, &autoloadwadcount);
D_AutoloadFile(wadsToAutoload, autoloadwadfiles, autoloadcount);
autoloadcount++;
}
else
{
D_AutoloadFile(wadsToAutoload, autoloadwadfilespost, &postloadwadcount);
D_AutoloadFile(wadsToAutoload, autoloadwadfilespost, postloadcount);
postloadcount++;
}
}
autoloadwadfiles[autoloadwadcount] = NULL;
autoloadwadfilespost[postloadwadcount] = NULL;
autoloadwadfiles[autoloadcount] = NULL;
autoloadwadfilespost[postloadcount] = NULL;
// we dont want memory leaks around here do we?
fclose(autoloadconfigfile);
@@ -1173,7 +1148,7 @@ static void D_FindAddonsToAutoload(void)
static void D_AddAutoloadFiles(void)
{
// nothing to autoload
if (autoloadwadcount == 0)
if (autoloadcount == 0)
return;
CONS_Printf("D_AutoloadFile(): Loading autoloaded addons...\n");
@@ -1181,15 +1156,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, autoloadwadcount);
D_CleanFile(autoloadwadfiles, autoloadcount);
autoloadwadcount = 0;
autoloadcount = 0;
}
void D_AddPostloadFiles(void)
{
// nothing to postload
if (postloadwadcount == 0 || !netgame)
if (postloadcount == 0 || !netgame)
return;
CONS_Printf("D_AddPostloadFiles(): Loading postloaded addons...\n");
@@ -1197,9 +1172,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, postloadwadcount);
D_CleanFile(autoloadwadfilespost, postloadcount);
postloadwadcount = 0;
postloadcount = 0;
}
// ==========================================================================
@@ -1208,7 +1183,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))
{
@@ -2043,13 +2018,9 @@ void D_SRB2Main(void)
if (M_CheckProtoParam("replay"))
{
const char *replayurl = M_GetProtoParam();
char *replayname = strrchr(replayurl, '/');
if (!replayurl)
I_Error("REPLAY: Invalid URL.");
gconst char *replayname = strrchr(replayurl, '/');
if (!replayname)
if (!replayname || !replayurl)
I_Error("REPLAY: Invalid URL.");
#define REPLAYDIR "/DownloadedReplays/"
+5 -1
View File
@@ -612,8 +612,12 @@ void Net_WaitAllAckReceived(UINT32 timeout)
static void InitNode(node_t *node)
{
memset(node, 0, sizeof(node_t));
node->acktosend_head = node->acktosend_tail = 0;
memset(node->acktosend, 0, sizeof(node->acktosend));
node->firstacktosend = 0;
node->nextacknum = 1;
node->remotefirstack = 0;
node->flags = 0;
}
static void InitAck(void)
+483 -146
View File
@@ -900,7 +900,6 @@ void D_RegisterClientCommands(void)
CV_RegisterVar(&cv_mindelay);
CV_RegisterVar(&cv_gentlemens);
CV_RegisterVar(&cv_serverinfoscreen);
CV_RegisterVar(&cv_serveraddoninfo);
#ifdef NETGAME_DEVMODE
CV_RegisterVar(&cv_fishcake);
@@ -1209,11 +1208,11 @@ static boolean AllowedPlayerNameChar(char ch)
static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
{
size_t ix, len = strlen(name);
INT32 ix;
if (len == 0 || len > MAXPLAYERNAME)
if (strlen(name) == 0 || strlen(name) > MAXPLAYERNAME)
return false; // Empty or too long.
if (name[0] == ' ' || name[len-1] == ' ')
if (name[0] == ' ' || name[strlen(name)-1] == ' ')
return false; // Starts or ends with a space.
if (isdigit(name[0]))
return false; // Starts with a digit.
@@ -1227,19 +1226,20 @@ static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
// Also, anything over 0x80 is disallowed too, since compilers love to
// differ on whether they're printable characters or not.
for (ix = 0; ix < len; ix++)
for (ix = 0; name[ix] != '\0'; ix++)
if (!AllowedPlayerNameChar(name[ix]))
return false;
// Check if a player is currently using the name, case-insensitively.
for (ix = 0; ix < MAXPLAYERS; ix++)
{
if (ix != (size_t)playernum && playeringame[ix]
if (ix != playernum && playeringame[ix]
&& fasticmp(name, player_names[ix]))
{
// We shouldn't kick people out just because
// they joined the game with the same name
// as someone else -- modify the name instead.
size_t len = strlen(name);
// Recursion!
// Slowly strip characters off the end of the
@@ -1458,9 +1458,7 @@ UINT8 CanChangeSkin(INT32 playernum)
return true;
}
if (players[playernum].spectator ||
players[playernum].playerstate == PST_DEAD ||
players[playernum].playerstate == PST_REBORN)
if (players[playernum].spectator || players[playernum].playerstate == PST_DEAD || players[playernum].playerstate == PST_REBORN)
return true;
return false;
@@ -1494,145 +1492,446 @@ static void ForceAllSkins(INT32 forcedskin)
}
}
static INT32 chmappending;
static INT32 snacpending[MAXSPLITSCREENPLAYERS];
// wonky compat, idk if anything uses this....
#define playerisbot (splitplayer == 1 && botingame)
static INT32 snacpending = 0, snac2pending = 0, snac3pending = 0, snac4pending = 0, chmappending = 0;
// name, color, or skin has changed
//
static void SendNameAndColor(UINT8 splitplayer)
static void SendNameAndColor(void)
{
char buf[MAXPLAYERNAME+2];
char *p;
p = buf;
// splitscreen
if (splitscreen < splitplayer && !playerisbot)
return;
const INT32 pnum = P_GetLocalPlayerNumForNum(splitplayer);
player_t *player = &players[pnum];
// TODO: make those cvars arrays
consvar_t *playercolor, *playername, *playerskin;
consvar_t *colorvars[] = {&cv_playercolor, &cv_playercolor2, &cv_playercolor3, &cv_playercolor4};
consvar_t *namevars[] = {&cv_playername, &cv_playername2, &cv_playername3, &cv_playername4};
consvar_t *skinvars[] = {&cv_skin, &cv_skin2, &cv_skin3, &cv_skin4};
playercolor = colorvars[splitplayer];
playername = namevars[splitplayer];
playerskin = skinvars[splitplayer];
// normal player colors
if (G_GametypeHasTeams())
{
if (player->ctfteam == 1 && playercolor->value != skincolor_redteam)
CV_StealthSetValue(playercolor, skincolor_redteam);
else if (player->ctfteam == 2 && playercolor->value != skincolor_blueteam)
CV_StealthSetValue(playercolor, skincolor_blueteam);
if (players[consoleplayer].ctfteam == 1 && cv_playercolor.value != skincolor_redteam)
CV_StealthSetValue(&cv_playercolor, skincolor_redteam);
else if (players[consoleplayer].ctfteam == 2 && cv_playercolor.value != skincolor_blueteam)
CV_StealthSetValue(&cv_playercolor, skincolor_blueteam);
}
// never allow the color "none"
if (!playercolor->value)
if (!cv_playercolor.value)
{
if (player->skincolor)
CV_StealthSetValue(playercolor, player->skincolor);
else if (skins[player->skin].prefcolor)
CV_StealthSetValue(playercolor, skins[player->skin].prefcolor);
if (players[consoleplayer].skincolor)
CV_StealthSetValue(&cv_playercolor, players[consoleplayer].skincolor);
else if (skins[players[consoleplayer].skin].prefcolor)
CV_StealthSetValue(&cv_playercolor, skins[players[consoleplayer].skin].prefcolor);
else
CV_StealthSet(playercolor, playercolor->defaultvalue);
CV_StealthSet(&cv_playercolor, cv_playercolor.defaultvalue);
}
if (fastcmp(cv_playername.string, player_names[consoleplayer])
&& cv_playercolor.value == players[consoleplayer].skincolor
&& fastcmp(cv_skin.string, skins[players[consoleplayer].skin].name))
return;
// We'll handle it later if we're not playing.
if (!Playing())
return;
if (fastcmp(playername->string, player_names[pnum])
&& playercolor->value == player->skincolor
&& fastcmp(playerskin->string, skins[player->skin].name))
return;
if (playerisbot)
{
players[pnum].skincolor = botcolor;
if (players[pnum].mo)
players[pnum].mo->color = players[pnum].skincolor;
SetPlayerSkinByNum(pnum, botskin-1);
return;
}
// If you're not in a netgame, merely update the skin, color, and name.
if (!netgame)
{
INT32 foundskin;
CleanupPlayerName(pnum, playername->zstring);
strcpy(player_names[pnum], playername->zstring);
CleanupPlayerName(consoleplayer, cv_playername.zstring);
strcpy(player_names[consoleplayer], cv_playername.zstring);
player->skincolor = playercolor->value;
players[consoleplayer].skincolor = cv_playercolor.value;
if (player->mo)
player->mo->color = player->skincolor;
if (players[consoleplayer].mo)
players[consoleplayer].mo->color = players[consoleplayer].skincolor;
if ((foundskin = R_SkinAvailable(playerskin->string)) != -1)
if ((foundskin = R_SkinAvailable(cv_skin.string)) != -1)
{
playerskin->value = foundskin;
SetPlayerSkin(pnum, playerskin->string);
CV_StealthSet(playerskin, skins[playerskin->value].name);
cv_skin.value = foundskin;
SetPlayerSkin(consoleplayer, cv_skin.string);
CV_StealthSet(&cv_skin, skins[cv_skin.value].name);
}
else
{
playerskin->value = player->skin;
CV_StealthSet(playerskin, skins[player->skin].name);
cv_skin.value = players[consoleplayer].skin;
CV_StealthSet(&cv_skin, skins[players[consoleplayer].skin].name);
// will always be same as current
SetPlayerSkin(pnum, playerskin->string);
SetPlayerSkin(consoleplayer, cv_skin.string);
}
return;
}
snacpending[splitplayer]++;
snacpending++;
// Don't change name if muted
if (player_name_changes[pnum] >= MAXNAMECHANGES)
if (player_name_changes[consoleplayer] >= MAXNAMECHANGES)
{
CV_StealthSet(playername, player_names[pnum]);
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
HU_AddChatText("\x85*You must wait to change your name again", false);
}
else if (cv_mute.value && !(server || IsPlayerAdmin(pnum)))
CV_StealthSet(playername, player_names[pnum]);
else if (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer)))
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
else // Cleanup name if changing it
CleanupPlayerName(pnum, playername->zstring);
CleanupPlayerName(consoleplayer, cv_playername.zstring);
// Don't change skin if the server doesn't want you to.
if (!CanChangeSkin(pnum))
CV_StealthSet(playerskin, skins[player->skin].name);
if (!CanChangeSkin(consoleplayer))
CV_StealthSet(&cv_skin, skins[players[consoleplayer].skin].name);
// check if player has the skin loaded (cv_skin may have
// the name of a skin that was available in the previous game)
playerskin->value = R_SkinAvailable(playerskin->string);
if (playerskin->value < 0)
cv_skin.value = R_SkinAvailable(cv_skin.string);
if (cv_skin.value < 0)
{
INT32 skinnum = player->skin;
CV_StealthSet(playerskin, skins[skinnum].name);
playerskin->value = skinnum;
INT32 skinnum = players[consoleplayer].skin;
CV_StealthSet(&cv_skin, skins[skinnum].name);
cv_skin.value = skinnum;
}
// Finally write out the complete packet and send it off.
WRITESTRINGN(p, playername->zstring, MAXPLAYERNAME);
WRITEUINT8(p, (UINT8)playercolor->value);
WRITEUINT8(p, (UINT8)playerskin->value);
SendNetXCmdForPlayer(splitplayer, XD_NAMEANDCOLOR, buf, p - buf);
WRITESTRINGN(p, cv_playername.zstring, MAXPLAYERNAME);
WRITEUINT8(p, (UINT8)cv_playercolor.value);
WRITEUINT8(p, (UINT8)cv_skin.value);
SendNetXCmdForPlayer(0, XD_NAMEANDCOLOR, buf, p - buf);
}
// splitscreen
static void SendNameAndColor2(void)
{
INT32 secondplaya = -1;
char buf[MAXPLAYERNAME+2];
char *p;
if (splitscreen < 1 && !botingame)
return; // can happen if skin2/color2/name2 changed
if (displayplayers[1] != consoleplayer)
secondplaya = displayplayers[1];
else if (!netgame) // HACK
secondplaya = 1;
if (secondplaya == -1)
return;
p = buf;
// normal player colors
if (G_GametypeHasTeams())
{
if (players[secondplaya].ctfteam == 1 && cv_playercolor2.value != skincolor_redteam)
CV_StealthSetValue(&cv_playercolor2, skincolor_redteam);
else if (players[secondplaya].ctfteam == 2 && cv_playercolor2.value != skincolor_blueteam)
CV_StealthSetValue(&cv_playercolor2, skincolor_blueteam);
}
// never allow the color "none"
if (!cv_playercolor2.value)
{
if (players[secondplaya].skincolor)
CV_StealthSetValue(&cv_playercolor2, players[secondplaya].skincolor);
else if (skins[players[secondplaya].skin].prefcolor)
CV_StealthSetValue(&cv_playercolor2, skins[players[secondplaya].skin].prefcolor);
else
CV_StealthSet(&cv_playercolor2, cv_playercolor2.defaultvalue);
}
// We'll handle it later if we're not playing.
if (!Playing())
return;
// If you're not in a netgame, merely update the skin, color, and name.
if (botingame)
{
players[secondplaya].skincolor = botcolor;
if (players[secondplaya].mo)
players[secondplaya].mo->color = players[secondplaya].skincolor;
SetPlayerSkinByNum(secondplaya, botskin-1);
return;
}
else if (!netgame)
{
INT32 foundskin;
CleanupPlayerName(secondplaya, cv_playername2.zstring);
strcpy(player_names[secondplaya], cv_playername2.zstring);
// don't use displayplayers[1]: the second player must be 1
players[secondplaya].skincolor = cv_playercolor2.value;
if (players[secondplaya].mo)
players[secondplaya].mo->color = players[secondplaya].skincolor;
if ((foundskin = R_SkinAvailable(cv_skin2.string)) != -1)
{
cv_skin2.value = foundskin;
SetPlayerSkin(secondplaya, cv_skin2.string);
}
else
{
cv_skin2.value = players[secondplaya].skin;
CV_StealthSet(&cv_skin2, skins[players[secondplaya].skin].name);
// will always be same as current
SetPlayerSkin(secondplaya, cv_skin2.string);
}
return;
}
snac2pending++;
// Don't change name if muted
if (player_name_changes[displayplayers[1]] >= MAXNAMECHANGES)
{
CV_StealthSet(&cv_playername2, player_names[displayplayers[1]]);
HU_AddChatText("\x85*You must wait to change your name again", false);
}
else if (cv_mute.value && !(server || IsPlayerAdmin(displayplayers[1])))
CV_StealthSet(&cv_playername2, player_names[displayplayers[1]]);
else // Cleanup name if changing it
CleanupPlayerName(displayplayers[1], cv_playername2.zstring);
// Don't change skin if the server doesn't want you to.
if (!CanChangeSkin(displayplayers[1]))
CV_StealthSet(&cv_skin2, skins[players[displayplayers[1]].skin].name);
// check if player has the skin loaded (cv_skin2 may have
// the name of a skin that was available in the previous game)
cv_skin2.value = R_SkinAvailable(cv_skin2.string);
if (cv_skin2.value < 0)
{
INT32 skinnum = players[displayplayers[1]].skin;
CV_StealthSet(&cv_skin2, skins[skinnum].name);
cv_skin2.value = skinnum;
}
// Finally write out the complete packet and send it off.
WRITESTRINGN(p, cv_playername2.zstring, MAXPLAYERNAME);
WRITEUINT8(p, (UINT8)cv_playercolor2.value);
WRITEUINT8(p, (UINT8)cv_skin2.value);
SendNetXCmdForPlayer(1, XD_NAMEANDCOLOR, buf, p - buf);
}
static void SendNameAndColor3(void)
{
INT32 thirdplaya = -1;
char buf[MAXPLAYERNAME+2];
char *p;
if (splitscreen < 2)
return; // can happen if skin3/color3/name3 changed
if (displayplayers[2] != consoleplayer)
thirdplaya = displayplayers[2];
else if (!netgame) // HACK
thirdplaya = 2;
if (thirdplaya == -1)
return;
p = buf;
// normal player colors
if (G_GametypeHasTeams())
{
if (players[thirdplaya].ctfteam == 1 && cv_playercolor3.value != skincolor_redteam)
CV_StealthSetValue(&cv_playercolor3, skincolor_redteam);
else if (players[thirdplaya].ctfteam == 2 && cv_playercolor3.value != skincolor_blueteam)
CV_StealthSetValue(&cv_playercolor3, skincolor_blueteam);
}
// never allow the color "none"
if (!cv_playercolor3.value)
{
if (players[thirdplaya].skincolor)
CV_StealthSetValue(&cv_playercolor3, players[thirdplaya].skincolor);
else if (skins[players[thirdplaya].skin].prefcolor)
CV_StealthSetValue(&cv_playercolor3, skins[players[thirdplaya].skin].prefcolor);
else
CV_StealthSet(&cv_playercolor3, cv_playercolor3.defaultvalue);
}
// We'll handle it later if we're not playing.
if (!Playing())
return;
// If you're not in a netgame, merely update the skin, color, and name.
if (!netgame)
{
INT32 foundskin;
CleanupPlayerName(thirdplaya, cv_playername3.zstring);
strcpy(player_names[thirdplaya], cv_playername3.zstring);
// don't use displayplayers[2]: the third player must be 2
players[thirdplaya].skincolor = cv_playercolor3.value;
if (players[thirdplaya].mo)
players[thirdplaya].mo->color = players[thirdplaya].skincolor;
if ((foundskin = R_SkinAvailable(cv_skin3.string)) != -1)
{
cv_skin3.value = foundskin;
SetPlayerSkin(thirdplaya, cv_skin3.string);
}
else
{
cv_skin3.value = players[thirdplaya].skin;
CV_StealthSet(&cv_skin3, skins[players[thirdplaya].skin].name);
// will always be same as current
SetPlayerSkin(thirdplaya, cv_skin3.string);
}
return;
}
snac3pending++;
// Don't change name if muted
if (player_name_changes[displayplayers[2]] >= MAXNAMECHANGES)
{
CV_StealthSet(&cv_playername3, player_names[displayplayers[2]]);
HU_AddChatText("\x85*You must wait to change your name again", false);
}
else if (cv_mute.value && !(server || IsPlayerAdmin(displayplayers[2])))
CV_StealthSet(&cv_playername3, player_names[displayplayers[2]]);
else // Cleanup name if changing it
CleanupPlayerName(displayplayers[2], cv_playername3.zstring);
// Don't change skin if the server doesn't want you to.
if (!CanChangeSkin(displayplayers[2]))
CV_StealthSet(&cv_skin3, skins[players[displayplayers[2]].skin].name);
// check if player has the skin loaded (cv_skin3 may have
// the name of a skin that was available in the previous game)
cv_skin3.value = R_SkinAvailable(cv_skin3.string);
if (cv_skin3.value < 0)
{
INT32 skinnum = players[displayplayers[2]].skin;
CV_StealthSet(&cv_skin3, skins[skinnum].name);
cv_skin3.value = skinnum;
}
// Finally write out the complete packet and send it off.
WRITESTRINGN(p, cv_playername3.zstring, MAXPLAYERNAME);
WRITEUINT8(p, (UINT8)cv_playercolor3.value);
WRITEUINT8(p, (UINT8)cv_skin3.value);
SendNetXCmdForPlayer(2, XD_NAMEANDCOLOR, buf, p - buf);
}
static void SendNameAndColor4(void)
{
INT32 fourthplaya = -1;
char buf[MAXPLAYERNAME+2];
char *p;
if (splitscreen < 3)
return; // can happen if skin4/color4/name4 changed
if (displayplayers[3] != consoleplayer)
fourthplaya = displayplayers[3];
else if (!netgame) // HACK
fourthplaya = 3;
if (fourthplaya == -1)
return;
p = buf;
// normal player colors
if (G_GametypeHasTeams())
{
if (players[fourthplaya].ctfteam == 1 && cv_playercolor4.value != skincolor_redteam)
CV_StealthSetValue(&cv_playercolor4, skincolor_redteam);
else if (players[fourthplaya].ctfteam == 2 && cv_playercolor4.value != skincolor_blueteam)
CV_StealthSetValue(&cv_playercolor4, skincolor_blueteam);
}
// never allow the color "none"
if (!cv_playercolor4.value)
{
if (players[fourthplaya].skincolor)
CV_StealthSetValue(&cv_playercolor4, players[fourthplaya].skincolor);
else if (skins[players[fourthplaya].skin].prefcolor)
CV_StealthSetValue(&cv_playercolor4, skins[players[fourthplaya].skin].prefcolor);
else
CV_StealthSet(&cv_playercolor4, cv_playercolor4.defaultvalue);
}
// We'll handle it later if we're not playing.
if (!Playing())
return;
// If you're not in a netgame, merely update the skin, color, and name.
if (botingame)
{
players[fourthplaya].skincolor = botcolor;
if (players[fourthplaya].mo)
players[fourthplaya].mo->color = players[fourthplaya].skincolor;
SetPlayerSkinByNum(fourthplaya, botskin-1);
return;
}
else if (!netgame)
{
INT32 foundskin;
CleanupPlayerName(fourthplaya, cv_playername4.zstring);
strcpy(player_names[fourthplaya], cv_playername4.zstring);
// don't use displayplayers[3]: the second player must be 4
players[fourthplaya].skincolor = cv_playercolor4.value;
if (players[fourthplaya].mo)
players[fourthplaya].mo->color = players[fourthplaya].skincolor;
if ((foundskin = R_SkinAvailable(cv_skin4.string)) != -1)
{
cv_skin4.value = foundskin;
SetPlayerSkin(fourthplaya, cv_skin4.string);
}
else
{
cv_skin4.value = players[fourthplaya].skin;
CV_StealthSet(&cv_skin4, skins[players[fourthplaya].skin].name);
// will always be same as current
SetPlayerSkin(fourthplaya, cv_skin4.string);
}
return;
}
snac4pending++;
// Don't change name if muted
if (player_name_changes[displayplayers[3]] >= MAXNAMECHANGES)
{
CV_StealthSet(&cv_playername4, player_names[displayplayers[3]]);
HU_AddChatText("\x85*You must wait to change your name again", false);
}
else if (cv_mute.value && !(server || IsPlayerAdmin(displayplayers[3])))
CV_StealthSet(&cv_playername4, player_names[displayplayers[3]]);
else // Cleanup name if changing it
CleanupPlayerName(displayplayers[3], cv_playername4.zstring);
// Don't change skin if the server doesn't want you to.
if (!CanChangeSkin(displayplayers[3]))
CV_StealthSet(&cv_skin4, skins[players[displayplayers[3]].skin].name);
// check if player has the skin loaded (cv_skin4 may have
// the name of a skin that was available in the previous game)
cv_skin4.value = R_SkinAvailable(cv_skin4.string);
if (cv_skin4.value < 0)
{
INT32 skinnum = players[displayplayers[3]].skin;
CV_StealthSet(&cv_skin4, skins[skinnum].name);
cv_skin4.value = skinnum;
}
// Finally write out the complete packet and send it off.
WRITESTRINGN(p, cv_playername4.zstring, MAXPLAYERNAME);
WRITEUINT8(p, (UINT8)cv_playercolor4.value);
WRITEUINT8(p, (UINT8)cv_skin4.value);
SendNetXCmdForPlayer(3, XD_NAMEANDCOLOR, buf, p - buf);
}
static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
{
player_t *player = &players[playernum];
char name[MAXPLAYERNAME+1] = {};
player_t *p = &players[playernum];
char name[MAXPLAYERNAME+1];
UINT8 color, skin;
#ifdef PARANOIA
@@ -1640,14 +1939,19 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
I_Error("There is no player %d!", playernum);
#endif
if (P_IsLocalPlayer(player))
{
snacpending[playernum]--;
if (playernum == consoleplayer)
snacpending--; // TODO: make snacpending an array instead of 4 separate vars?
else if (playernum == displayplayers[1])
snac2pending--;
else if (playernum == displayplayers[2])
snac3pending--;
else if (playernum == displayplayers[3])
snac4pending--;
#ifdef PARANOIA
if (snacpending[playernum] < 0)
I_Error("snacpending negative!");
if (snacpending < 0 || snac2pending < 0 || snac3pending < 0 || snac4pending < 0)
I_Error("snacpending negative!");
#endif
}
READSTRINGN(*cp, name, MAXPLAYERNAME);
color = READUINT8(*cp);
@@ -1661,32 +1965,33 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
}
// set color
player->skincolor = color % MAXSKINCOLORS;
if (player->mo)
player->mo->color = (UINT8)player->skincolor;
p->skincolor = color % MAXSKINCOLORS;
if (p->mo)
p->mo->color = (UINT8)p->skincolor;
demo_extradata[playernum] |= DXD_COLOR;
// normal player colors
if (server && !P_IsLocalPlayer(player))
if (server && (p != &players[consoleplayer] && p != &players[displayplayers[1]]
&& p != &players[displayplayers[2]] && p != &players[displayplayers[3]]))
{
boolean kick = false;
// team colors
if (G_GametypeHasTeams())
{
if (player->ctfteam == 1 && player->skincolor != skincolor_redteam)
if (p->ctfteam == 1 && p->skincolor != skincolor_redteam)
kick = true;
else if (player->ctfteam == 2 && player->skincolor != skincolor_blueteam)
else if (p->ctfteam == 2 && p->skincolor != skincolor_blueteam)
kick = true;
}
// don't allow color "none"
if (!player->skincolor)
if (!p->skincolor)
kick = true;
if (kick)
{
CONS_Alert(CONS_WARNING, M_GetText("Illegal color change received from %s (team: %d), color: %d)\n"), player_names[playernum], player->ctfteam, player->skincolor);
CONS_Alert(CONS_WARNING, M_GetText("Illegal color change received from %s (team: %d), color: %d)\n"), player_names[playernum], p->ctfteam, p->skincolor);
SendKick(playernum, KICK_MSG_CON_FAIL);
return;
}
@@ -1698,7 +2003,6 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
const INT32 forcedskin = cv_forceskin.value;
SetPlayerSkinByNum(playernum, forcedskin);
// TODO: make cv_skin an array
if (playernum == consoleplayer)
CV_StealthSet(&cv_skin, skins[forcedskin].name);
else if (playernum == displayplayers[1])
@@ -1712,16 +2016,44 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
SetPlayerSkinByNum(playernum, skin);
}
void SendWeaponPref(UINT8 splitplayer)
void SendWeaponPref(void)
{
UINT8 buf[1];
buf[0] = 0;
if (cv_flipcam[splitplayer].value)
if (cv_flipcam[0].value)
buf[0] |= 1;
SendNetXCmdForPlayer(0, XD_WEAPONPREF, buf, 1);
}
SendNetXCmdForPlayer(splitplayer, XD_WEAPONPREF, buf, 1);
void SendWeaponPref2(void)
{
UINT8 buf[1];
buf[0] = 0;
if (cv_flipcam[1].value)
buf[0] |= 1;
SendNetXCmdForPlayer(1, XD_WEAPONPREF, buf, 1);
}
void SendWeaponPref3(void)
{
UINT8 buf[1];
buf[0] = 0;
if (cv_flipcam[2].value)
buf[0] |= 1;
SendNetXCmdForPlayer(2, XD_WEAPONPREF, buf, 1);
}
void SendWeaponPref4(void)
{
UINT8 buf[1];
buf[0] = 0;
if (cv_flipcam[3].value)
buf[0] |= 1;
SendNetXCmdForPlayer(3, XD_WEAPONPREF, buf, 1);
}
static void Got_WeaponPref(const UINT8 **cp, INT32 playernum)
@@ -1737,10 +2069,23 @@ static void Got_WeaponPref(const UINT8 **cp, INT32 playernum)
player->pflags |= PF_ANALOGMODE;
}
void D_SendPlayerConfig(UINT8 splitplayer)
void D_SendPlayerConfig(void)
{
SendNameAndColor(splitplayer);
SendWeaponPref(splitplayer);
SendNameAndColor();
if (splitscreen || botingame)
SendNameAndColor2();
if (splitscreen > 1)
SendNameAndColor3();
if (splitscreen > 2)
SendNameAndColor4();
SendWeaponPref();
if (splitscreen)
SendWeaponPref2();
if (splitscreen > 1)
SendWeaponPref3();
if (splitscreen > 2)
SendWeaponPref4();
}
// Only works for displayplayer, sorry!
@@ -1763,12 +2108,10 @@ INT32 D_LookupPlayer(const char *s)
return playernum;
}
const size_t len = strlen(s);
for (playernum = 0; playernum < MAXPLAYERS; ++playernum)
{
/* Match name case-insensitively: fully, or partially the start. */
if (playeringame[playernum] && (strnicmp(player_names[playernum], s, len) == 0))
if (playeringame[playernum] && (strnicmp(player_names[playernum], s, strlen(s)) == 0))
{
return playernum;
}
@@ -1808,15 +2151,13 @@ static void GetViewablePlayerPlaceRange(INT32 *first, INT32 *last)
(*last) = 0;
for (i = 0; i < MAXPLAYERS; ++i)
{
if (G_CouldView(i))
{
place = players[i].kartstuff[k_position];
if (place < (*first))
(*first) = place;
if (place > (*last))
(*last) = place;
}
{
place = players[i].kartstuff[k_position];
if (place < (*first))
(*first) = place;
if (place > (*last))
(*last) = place;
}
}
@@ -2150,7 +2491,7 @@ void D_MapChange(INT32 mapnum, INT32 newgametype, boolean pencoremode, boolean r
displayplayers[1] = 1;
playeringame[1] = true;
players[1].bot = 1;
SendNameAndColor(1);
SendNameAndColor2();
}
}
@@ -5427,54 +5768,50 @@ static void ForceSkin_OnChange(void)
}
}
// Allows the player's name to be changed if cv_mute is off.
//Allows the player's name to be changed if cv_mute is off.
static void Name_OnChange(void)
{
if (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer)))
{
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
return;
}
SendNameAndColor(0);
else
SendNameAndColor();
}
static void Name2_OnChange(void)
{
if (cv_mute.value) // Secondary player can't be admin.
if (cv_mute.value) //Secondary player can't be admin.
{
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
CV_StealthSet(&cv_playername2, player_names[displayplayers[1]]);
return;
}
SendNameAndColor(1);
else
SendNameAndColor2();
}
static void Name3_OnChange(void)
{
if (cv_mute.value) // Third player can't be admin.
if (cv_mute.value) //Third player can't be admin.
{
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
CV_StealthSet(&cv_playername3, player_names[displayplayers[2]]);
return;
}
SendNameAndColor(2);
else
SendNameAndColor3();
}
static void Name4_OnChange(void)
{
if (cv_mute.value) // Secondary player can't be admin.
if (cv_mute.value) //Secondary player can't be admin.
{
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
CV_StealthSet(&cv_playername4, player_names[displayplayers[3]]);
return;
}
SendNameAndColor(3);
else
SendNameAndColor4();
}
/** Sends a skin change for the console player, unless that player is moving.
@@ -5496,7 +5833,7 @@ static void Skin_OnChange(void)
}
if (CanChangeSkin(consoleplayer) && !P_PlayerMoving(consoleplayer))
SendNameAndColor(0);
SendNameAndColor();
else
{
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
@@ -5517,7 +5854,7 @@ static void Skin2_OnChange(void)
return; // do whatever you want
if (CanChangeSkin(displayplayers[1]) && !P_PlayerMoving(displayplayers[1]))
SendNameAndColor(1);
SendNameAndColor2();
else
{
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
@@ -5533,7 +5870,7 @@ static void Skin3_OnChange(void)
return; // do whatever you want
if (CanChangeSkin(displayplayers[2]) && !P_PlayerMoving(displayplayers[2]))
SendNameAndColor(2);
SendNameAndColor3();
else
{
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
@@ -5549,7 +5886,7 @@ static void Skin4_OnChange(void)
return; // do whatever you want
if (CanChangeSkin(displayplayers[3]) && !P_PlayerMoving(displayplayers[3]))
SendNameAndColor(3);
SendNameAndColor4();
else
{
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
@@ -5662,7 +5999,7 @@ static void Color_OnChange(void)
if (!P_PlayerMoving(consoleplayer))
{
// Color change menu scrolling fix is no longer necessary
SendNameAndColor(0);
SendNameAndColor();
}
else
{
@@ -5684,7 +6021,7 @@ static void Color2_OnChange(void)
if (!P_PlayerMoving(displayplayers[1]))
{
// Color change menu scrolling fix is no longer necessary
SendNameAndColor(1);
SendNameAndColor2();
}
else
{
@@ -5701,7 +6038,7 @@ static void Color3_OnChange(void)
if (!P_PlayerMoving(displayplayers[2]))
{
// Color change menu scrolling fix is no longer necessary
SendNameAndColor(2);
SendNameAndColor3();
}
else
{
@@ -5718,7 +6055,7 @@ static void Color4_OnChange(void)
if (!P_PlayerMoving(displayplayers[3]))
{
// Color change menu scrolling fix is no longer necessary
SendNameAndColor(3);
SendNameAndColor4();
}
else
{
+5 -3
View File
@@ -21,7 +21,10 @@ extern "C" {
#include "command.h"
void SendWeaponPref(UINT8 splitplayer);
void SendWeaponPref(void);
void SendWeaponPref2(void);
void SendWeaponPref3(void);
void SendWeaponPref4(void);
// console vars
extern consvar_t cv_playername;
@@ -155,7 +158,6 @@ extern consvar_t cv_pingstyle;
//extern consvar_t cv_smallpos;
extern consvar_t cv_showminimapnames;
extern consvar_t cv_showminimapfinished;
extern consvar_t cv_minihead;
extern consvar_t cv_showminimapangle;
@@ -293,7 +295,7 @@ typedef union {
// add game commands, needs cleanup
void D_RegisterServerCommands(void);
void D_RegisterClientCommands(void);
void D_SendPlayerConfig(UINT8 splitplayer);
void D_SendPlayerConfig(void);
void Command_ExitGame_f(void);
void Command_Retry_f(void);
void D_GameTypeChanged(INT32 lastgametype); // not a real _OnChange function anymore
+17 -66
View File
@@ -116,8 +116,6 @@ static I_mutex downloadmutex;
#endif
char downloaddir[512] = "DOWNLOAD";
INT32 addontypes[NUMADDONTYPES] = {0};
file_download_t filedownload = {};
#ifdef HAVE_CURL
@@ -137,8 +135,6 @@ HTTP_login *curl_logins = NULL;
static void CURLGetFile(void);
#endif
static addontype_t GetAddonType(const char *name);
/** Fills a serverinfo packet with information about wad files loaded.
*
* \todo Give this function a better name since it is in global scope.
@@ -229,11 +225,8 @@ void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr, UINT16 fi
fileneeded[i].willsend = (UINT8)(filestatus >> 4);
fileneeded[i].totalsize = READUINT32(p); // The four next bytes are the file size
fileneeded[i].file = NULL; // The file isn't open yet
READSTRINGL(p, fileneeded[i].filename, MAX_WADPATH); // The next bytes are the file name
READSTRINGN(p, fileneeded[i].filename, MAX_WADPATH); // The next bytes are the file name
READMEM(p, fileneeded[i].md5sum, 16); // The last 16 bytes are the file checksum
// Should be good place to calculate that?
fileneeded[i].type = GetAddonType(fileneeded[i].filename);
}
}
@@ -582,48 +575,6 @@ INT32 CL_CheckFiles(void)
return 1; //everything is FS_OPEN or FS_FOUND, proceed to loading
}
static addontype_t GetAddonType(const char *name)
{
const char *prefix = strchr(name, '_');
// Doesn't have prefix (no '_' character or it is too far and is probably not for prefix but for something like version)
// KRBCL_ is longest prefix i can think of so this should be enough
if (prefix == NULL || prefix - name > 5)
return ADDON_MISC;
// Skip 'K'
if (*name == 'K')
++name;
switch (*name)
{
case 'L':
return ADDON_SCRIPT;
break;
case 'R':
case 'B':
return ADDON_MAP;
break;
case 'C':
return ADDON_CHARACTER;
break;
}
return ADDON_MISC;
}
void CL_CheckAddonTypes(void)
{
memset(&addontypes, 0, sizeof(addontypes));
for (INT32 i = 0; i < fileneedednum; i++)
{
addontypes[fileneeded[i].type]++;
}
}
// Load it now
boolean CL_LoadServerFiles(void)
{
@@ -1009,7 +960,7 @@ void Got_Filetxpak(void)
|| fastcmp(filename, "music.kart")
|| fastcmp(filename, "patch.kart")
))
I_Error("Tried to download base-game file: \"%s\"", filename);
I_Error("Tried to download \"%s\"", filename);
if (filenum >= fileneedednum)
{
@@ -1068,21 +1019,21 @@ void Got_Filetxpak(void)
switch(file->status)
{
case FS_NOTFOUND:
s = "FS_NOTFOUND";
break;
case FS_FOUND:
s = "FS_FOUND";
break;
case FS_OPEN:
s = "FS_OPEN";
break;
case FS_MD5SUMBAD:
s = "FS_MD5SUMBAD";
break;
default:
s = "unknown";
break;
case FS_NOTFOUND:
s = "FS_NOTFOUND";
break;
case FS_FOUND:
s = "FS_FOUND";
break;
case FS_OPEN:
s = "FS_OPEN";
break;
case FS_MD5SUMBAD:
s = "FS_MD5SUMBAD";
break;
default:
s = "unknown";
break;
}
I_Error("Received a file not requested (file id: %d, file status: %s)\n", filenum, s);
-12
View File
@@ -40,15 +40,6 @@ typedef enum
FS_FALLBACK, // HTTP failed
} filestatus_t;
typedef enum addontype_e
{
ADDON_SCRIPT,
ADDON_MAP,
ADDON_CHARACTER,
ADDON_MISC,
NUMADDONTYPES,
} addontype_t;
typedef struct
{
UINT8 willsend; // Is the server willing to send it?
@@ -60,13 +51,11 @@ typedef struct
UINT32 totalsize;
filestatus_t status; // The value returned by recsearch
boolean justdownloaded; // To prevent late fragments from causing an I_Error
addontype_t type;
} fileneeded_t;
extern INT32 fileneedednum;
extern fileneeded_t fileneeded[MAX_WADFILES];
extern char downloaddir[512];
extern INT32 addontypes[NUMADDONTYPES];
typedef struct
{
@@ -102,7 +91,6 @@ void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr, UINT16 fi
void CL_PrepareDownloadSaveGame(const char *tmpsave);
INT32 CL_CheckFiles(void);
void CL_CheckAddonTypes(void);
boolean CL_LoadServerFiles(void);
void SV_SendRam(INT32 node, void *data, size_t size, freemethod_t freemethod,
UINT8 fileid);
+5 -28
View File
@@ -735,18 +735,6 @@ const char *I_GetJoyName(INT32 joyindex)
return NULL;
}
boolean I_GamepadHasLED(INT32 playernum)
{
(void)playernum;
return false;
}
boolean I_GamepadHasRumble(INT32 playernum)
{
(void)playernum;
return false;
}
void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration)
{
(void)playernum;
@@ -996,7 +984,7 @@ void I_SleepDuration(precise_t duration)
#endif
}
static volatile sig_atomic_t g_in_exiting_signal_handler = false;
boolean g_in_exiting_signal_handler = false;
static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_msg)
{
@@ -1060,11 +1048,6 @@ static void I_ReportSignal(int num, int coredumped)
I_OutputMsg("\nProcess killed by signal: %s\n\n", sigmsg);
}
boolean I_In_Exiting_Signal_Handler(void)
{
return g_in_exiting_signal_handler;
}
#ifndef NEWSIGNALHANDLER
FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
{
@@ -1084,17 +1067,11 @@ FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
}
#endif
static volatile sig_atomic_t interrupted = 0;
boolean I_Interrupted(void)
FUNCNORETURN static ATTRNORETURN void quit_handler(int num)
{
return interrupted;
}
static void quit_handler(int num)
{
(void)num;
interrupted = 1;
signal(num, SIG_DFL); //default signal action
raise(num);
I_Quit();
}
#ifdef HAVE_LIBBACKTRACE
-11
View File
@@ -115,10 +115,6 @@ INT32 VID_GetModeForSize(INT32 w, INT32 h)
return -1;
}
void VID_RefreshModeList(void)
{
}
void VID_PrepareModeList(void)
{
}
@@ -129,13 +125,6 @@ INT32 VID_SetMode(INT32 modeNum)
return true;
}
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height)
{
(void)width;
(void)height;
return false;
}
void I_StartupGraphics(void)
{
}
+119 -155
View File
@@ -115,25 +115,20 @@ 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++;
@@ -143,31 +138,25 @@ 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;
@@ -184,7 +173,7 @@ FUNCPRINTF static void deh_warning(const char *first, ...)
vsnprintf(buf, 1000, first, argptr); // sizeof only returned 4 here. it didn't like that pointer.
va_end(argptr);
if (dbg_line == -1) // Not in a SOC, line number unknown.
if(dbg_line == -1) // Not in a SOC, line number unknown.
CONS_Alert(CONS_WARNING, "%s\n", buf);
else
CONS_Alert(CONS_WARNING, "Line %u: %s\n", dbg_line, buf);
@@ -272,6 +261,7 @@ 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;
}
@@ -325,10 +315,7 @@ static void readPlayer(MYFILE *f, INT32 num)
goto done;
PlayerMenu[num].status = IT_CALL;
// 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++)
for (i = 0; i < MAXLINELEN-3; i++)
{
if (s[i] == '=')
{
@@ -336,12 +323,10 @@ static void readPlayer(MYFILE *f, INT32 num)
break;
}
}
if (playertext)
{
strlcpy(description[num].notes, playertext, note_size);
strlcat(description[num].notes,
myhashfgets(playertext, note_size, f), note_size);
strcpy(description[num].notes, playertext);
strcat(description[num].notes, myhashfgets(playertext, sizeof (description[num].notes), f));
}
else
strcpy(description[num].notes, "");
@@ -350,7 +335,7 @@ static void readPlayer(MYFILE *f, INT32 num)
// It works down here, though.
{
INT32 numline = 0;
for (i = 0; (size_t)i < note_size-1; i++)
for (i = 0; (size_t)i < sizeof(description[num].notes)-1; i++)
{
if (numline < 20 && description[num].notes[i] == '\n')
numline++;
@@ -359,7 +344,6 @@ static void readPlayer(MYFILE *f, INT32 num)
break;
}
}
description[num].notes[strlen(description[num].notes)-1] = '\0';
description[num].notes[i] = '\0';
continue;
@@ -835,8 +819,22 @@ 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
if (fastcmp(word, "SCRIPTNAME"))
else if (fastcmp(word, "SCRIPTNAME"))
{
deh_strlcpy(mapheaderinfo[num-1]->scriptname, word2,
sizeof(mapheaderinfo[num-1]->scriptname), va("Level header %d: scriptname", num));
@@ -848,6 +846,10 @@ 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));
}
@@ -912,7 +914,11 @@ 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);
@@ -954,12 +960,44 @@ 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"))
@@ -1072,26 +1110,6 @@ 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);
}
@@ -1182,6 +1200,7 @@ 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;
@@ -1862,8 +1881,16 @@ 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;
}
@@ -2152,11 +2179,14 @@ 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;
@@ -2165,6 +2195,8 @@ 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;
@@ -2182,6 +2214,8 @@ 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;
@@ -2564,7 +2598,7 @@ static void readmaincfg(MYFILE *f)
}
else if (fastcmp(word, "MAXXTRALIFE"))
{
continue; // unused
maxXtraLife = (UINT8)get_number(word2);
}
else if (fastcmp(word, "GAMEDATA"))
{
@@ -2594,7 +2628,6 @@ static void readmaincfg(MYFILE *f)
strcatbf(savegamename, srb2home, PATHSEP);
refreshdirmenu |= REFRESHDIR_GAMEDATA;*/
continue;
}
else if (fastcmp(word, "RESETDATA"))
{
@@ -2812,6 +2845,12 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
deh_num_warning = 0;
// save values for cross reference
/*
for (i = 0; i < NUMSTATES; i++)
saveactions[i] = states[i].action;
for (i = 0; i < NUMSPRITES; i++)
savesprnames[i] = sprnames[i];
*/
for (i = 0; i < NUMSFX; i++)
savesfxnames[i] = S_sfx[i].name;
@@ -3118,8 +3157,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
if (deh_num_warning)
{
CONS_Printf(M_GetText("%d warning%s in the SOC lump\n"), deh_num_warning, deh_num_warning == 1 ? "" : "s");
if (devparm)
if (devparm) {
I_Error("%s%s",va(M_GetText("%d warning%s in the SOC lump\n"), deh_num_warning, deh_num_warning == 1 ? "" : "s"), M_GetText("See log.txt for details.\n"));
//while (!I_GetKey())
//I_OsPolling();
}
}
deh_loaded = true;
@@ -8208,109 +8250,84 @@ struct {
{NULL,0}
};
// Returns the vlaue of MT_ enumerations
static mobjtype_t get_mobjtype(const char *word)
{
{ // Returns the vlaue of MT_ enumerations
mobjtype_t i;
if (*word >= '0' && *word <= '9')
return atoi(word);
if (fastncmp("MT_",word,3))
word += 3; // take off the MT_
for (i = 0; i < NUMMOBJFREESLOTS; i++)
{
for (i = 0; i < NUMMOBJFREESLOTS; i++) {
if (!FREE_MOBJS[i])
break;
if (fastcmp(word, FREE_MOBJS[i]))
return MT_FIRSTFREESLOT+i;
}
for (i = 0; i < MT_FIRSTFREESLOT; i++)
if (fastcmp(word, MOBJTYPE_LIST[i]+3))
return i;
deh_warning("Couldn't find mobjtype named 'MT_%s'",word);
return MT_BLUECRAWLA;
}
// Returns the value of S_ enumerations
static statenum_t get_state(const char *word)
{
{ // Returns the value of S_ enumerations
statenum_t i;
if (*word >= '0' && *word <= '9')
return atoi(word);
if (fastncmp("S_",word,2))
word += 2; // take off the S_
for (i = 0; i < NUMSTATEFREESLOTS; i++)
{
for (i = 0; i < NUMSTATEFREESLOTS; i++) {
if (!FREE_STATES[i])
break;
if (fastcmp(word, FREE_STATES[i]))
return S_FIRSTFREESLOT+i;
}
for (i = 0; i < S_FIRSTFREESLOT; i++)
if (fastcmp(word, STATE_LIST[i]+2))
return i;
deh_warning("Couldn't find state named 'S_%s'",word);
return S_NULL;
}
// Returns the value of SPR_ enumerations
static spritenum_t get_sprite(const char *word)
{
{ // Returns the value of SPR_ enumerations
spritenum_t i;
if (*word >= '0' && *word <= '9')
return atoi(word);
if (fastncmp("SPR_",word,4))
word += 4; // take off the SPR_
for (i = 0; i < NUMSPRITES; i++)
if (!sprnames[i][4] && memcmp(word,sprnames[i],4) == 0)
if (!sprnames[i][4] && memcmp(word,sprnames[i],4)==0)
return i;
deh_warning("Couldn't find sprite named 'SPR_%s'",word);
return SPR_NULL;
}
// Returns the value of SFX_ enumerations
static sfxenum_t get_sfx(const char *word)
{
{ // Returns the value of SFX_ enumerations
sfxenum_t i;
if (*word >= '0' && *word <= '9')
return atoi(word);
if (fastncmp("SFX_",word,4))
word += 4; // take off the SFX_
else if (fastncmp("DS",word,2))
word += 2; // take off the DS
for (i = 0; i < NUMSFX; i++)
if (S_sfx[i].name && fasticmp(word, S_sfx[i].name))
return i;
deh_warning("Couldn't find sfx named 'SFX_%s'",word);
return sfx_None;
}
#ifdef MUSICSLOT_COMPATIBILITY
// Returns the value of MUS_ enumerations
static UINT16 get_mus(const char *word, UINT8 dehacked_mode)
{
{ // Returns the value of MUS_ enumerations
UINT16 i;
char lumptmp[4];
if (*word >= '0' && *word <= '9')
return atoi(word);
if (!word[2] && toupper(word[0]) >= 'A' && toupper(word[0]) <= 'Z')
return (UINT16)M_MapNumber(word[0], word[1]);
@@ -8334,33 +8351,25 @@ static UINT16 get_mus(const char *word, UINT8 dehacked_mode)
deh_warning("Couldn't find music named 'MUS_%s'",word);
return 0;
}
for (i = 0; compat_special_music_slots[i][0]; ++i)
if (fasticmp(word, compat_special_music_slots[i]))
return i + 1036;
if (dehacked_mode)
deh_warning("Couldn't find music named 'MUS_%s'",word);
return 0;
}
#endif
// Returns the value of HUD_ enumerations
static hudnum_t get_huditem(const char *word)
{
{ // Returns the value of HUD_ enumerations
hudnum_t i;
if (*word >= '0' && *word <= '9')
return atoi(word);
if (fastncmp("HUD_",word,4))
word += 4; // take off the HUD_
for (i = 0; i < NUMHUDITEMS; i++)
if (fastcmp(word, HUDITEMS_LIST[i]))
return i;
deh_warning("Couldn't find huditem named 'HUD_%s'",word);
return HUD_LIVESNAME;
}
@@ -8407,16 +8416,15 @@ static inline int lib_freeslot(lua_State *L)
{
int n = lua_gettop(L);
int r = 0; // args returned
char *s, *type, *word;
char *s, *type,*word;
while (n-- > 0)
{
while (n-- > 0)
{
s = Z_StrDup(luaL_checkstring(L,1));
type = strtok(s, "_");
if (type)
strupr(type);
else
{
else {
Z_Free(s);
return luaL_error(L, "Unknown enum type in '%s'\n", luaL_checkstring(L, 1));
}
@@ -8424,25 +8432,19 @@ static inline int lib_freeslot(lua_State *L)
word = strtok(NULL, "\n");
if (word)
strupr(word);
else
{
else {
Z_Free(s);
return luaL_error(L, "Missing enum name in '%s'\n", luaL_checkstring(L, 1));
}
if (fastcmp(type, "SFX"))
{
if (fastcmp(type, "SFX")) {
sfxenum_t sfx;
strlwr(word);
CONS_Printf("Sound sfx_%s allocated.\n",word);
sfx = S_AddSoundFx(word, false, 0, false);
if (sfx != sfx_None)
{
if (sfx != sfx_None) {
lua_pushinteger(L, sfx);
r++;
}
else
} else
I_Error("Out of Sfx Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word); //Should never get here since S_AddSoundFx was changed to throw I_Error when it can't allocate
}
else if (fastcmp(type, "SPR"))
@@ -8456,7 +8458,7 @@ static inline int lib_freeslot(lua_State *L)
{
if (used_spr[(j-SPR_FIRSTFREESLOT)/8] & (1<<(j%8)))
{
if (!sprnames[j][4] && memcmp(sprnames[j], word, 4) == 0)
if (!sprnames[j][4] && memcmp(sprnames[j],word,4)==0)
sprnames[j][4] = wad;
continue; // Already allocated, next.
}
@@ -8474,7 +8476,6 @@ static inline int lib_freeslot(lua_State *L)
r++;
break;
}
if (j > SPR_LASTFREESLOT)
I_Error("Out of Sprite Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
}
@@ -8482,9 +8483,7 @@ static inline int lib_freeslot(lua_State *L)
{
statenum_t i;
for (i = 0; i < NUMSTATEFREESLOTS; i++)
{
if (!FREE_STATES[i])
{
if (!FREE_STATES[i]) {
CONS_Printf("State S_%s allocated.\n",word);
lua_pushcfunction(L, lua_glib_invalidate_cache);
@@ -8498,8 +8497,6 @@ static inline int lib_freeslot(lua_State *L)
r++;
break;
}
}
if (i == NUMSTATEFREESLOTS)
I_Error("Out of State Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
}
@@ -8507,9 +8504,7 @@ static inline int lib_freeslot(lua_State *L)
{
mobjtype_t i;
for (i = 0; i < NUMMOBJFREESLOTS; i++)
{
if (!FREE_MOBJS[i])
{
if (!FREE_MOBJS[i]) {
CONS_Printf("MobjType MT_%s allocated.\n",word);
lua_pushcfunction(L, lua_glib_invalidate_cache);
@@ -8523,17 +8518,13 @@ static inline int lib_freeslot(lua_State *L)
r++;
break;
}
}
if (i == NUMMOBJFREESLOTS)
I_Error("Out of Mobj Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
}
Z_Free(s);
lua_remove(L, 1);
continue;
}
return r;
}
@@ -8546,17 +8537,15 @@ static inline int lib_action(lua_State *L)
mobj_t *actor = *((mobj_t **)luaL_checkudata(L,1,META_MOBJ));
var1 = (INT32)luaL_optinteger(L,2,0);
var2 = (INT32)luaL_optinteger(L,3,0);
if (!actor)
return LUA_ErrInvalid(L, "mobj_t");
(*action)(actor);
return 0;
}
// Hardcoded A_Action name to call for super() or NULL if super() would be invalid.
// Set in lua_infolib.
const char *superactions[MAXRECURSION] = {};
const char *superactions[MAXRECURSION];
UINT8 superstack = 0;
static int lib_dummysuper(lua_State *L)
@@ -8571,29 +8560,23 @@ FUNCINLINE static ATTRINLINE int lib_getenum(lua_State *L)
const char *word;
boolean mathlib = lua_toboolean(L, UV_MATHLIB);
if (lua_type(L,2) != LUA_TSTRING)
return 0;
word = lua_tostring(L,2);
/* First check actions, as they can be overridden. */
if (!mathlib && fastncmp("A_",word,2))
{
if (!mathlib && fastncmp("A_",word,2)) {
char *caps;
// Try to get a Lua action first.
/// \todo Push a closure that sets superactions[] and superstack.
lua_getfield(L, LUA_REGISTRYINDEX, LREG_ACTIONS);
// actions are stored in all uppercase.
caps = Z_StrDup(word);
strupr(caps);
lua_getfield(L, -1, caps);
Z_Free(caps);
if (!lua_isnil(L, -1))
return 1; // Success! :D That was easy.
// Welp, that failed.
lua_pop(L, 2); // pop nil and LREG_ACTIONS
// Hardcoded actions are handled by the proxy.
@@ -8602,14 +8585,12 @@ FUNCINLINE static ATTRINLINE int lib_getenum(lua_State *L)
/* Then check the globals proxy table. */
lua_pushvalue(L, 2);
lua_gettable(L, GLIB_PROXY);
if (!lua_isnil(L, -1))
{
return 1;
}
if (mathlib)
return luaL_error(L, "constant '%s' could not be parsed.\n", word);
if (mathlib) return luaL_error(L, "constant '%s' could not be parsed.\n", word);
return 0;
}
@@ -8667,7 +8648,6 @@ static int lua_enumlib_server_get(lua_State *L)
{
if ((!multiplayer || !(netgame || demo.playback)) && !playeringame[serverplayer])
return 0;
LUA_PushUserdata(L, &players[serverplayer], META_PLAYER);
return 1;
}
@@ -8676,7 +8656,6 @@ static int lua_enumlib_consoleplayer_get(lua_State *L)
{
if (consoleplayer < 0 || !playeringame[consoleplayer])
return 0;
LUA_PushUserdata(L, &players[consoleplayer], META_PLAYER);
return 1;
}
@@ -8869,15 +8848,12 @@ static int lua_enumlib_action_get(lua_State *L)
const char *action = lua_tostring(L, 1);
for (int i = 0; actionpointers[i].name; i++)
{
if (fasticmp(action, actionpointers[i].name))
{
if (fasticmp(action, actionpointers[i].name)) {
// push lib_action as a C closure with the actionf_t* as an upvalue.
lua_pushlightuserdata(L, &actionpointers[i].action);
lua_pushcclosure(L, lib_action, 1);
return 1;
}
}
return 0;
}
@@ -8895,13 +8871,8 @@ static char *lua_enumlib_sprintf_upper(char **buf, int* size, const char *format
va_list va;
va_start(va, format);
va_list vacpy;
va_copy(vacpy, va);
int length = vsnprintf(*buf, *size, format, vacpy);
va_end(vacpy);
if (length >= *size)
int length = vsnprintf(*buf, *size, format, va);
if (length > *size)
{
void *ptr = realloc(*buf, length+1);
if (!ptr)
@@ -8909,13 +8880,12 @@ static char *lua_enumlib_sprintf_upper(char **buf, int* size, const char *format
va_end(va);
return NULL;
}
*buf = ptr;
*size = length+1;
length = vsnprintf(*buf, *size, format, va);
va_start(va, format);
vsnprintf(*buf, *size, format, va);
}
va_end(va);
for (int i = 0; i < length; i++)
@@ -8940,14 +8910,11 @@ static int lua_enumlib_super_get(lua_State *L)
}
for (int i = 0; actionpointers[i].name; i++)
{
if (fasticmp(superactions[superstack-1], actionpointers[i].name))
{
if (fasticmp(superactions[superstack-1], actionpointers[i].name)) {
lua_pushlightuserdata(L, &actionpointers[i].action);
lua_pushcclosure(L, lib_action, 1);
return 1;
}
}
return 0;
}
@@ -9416,10 +9383,7 @@ enum actionnum LUA_GetActionNumByName(const char *actiontocompare)
{
size_t z;
for (z = 0; actionpointers[z].name; z++)
{
if (fasticmp(actiontocompare, actionpointers[z].name))
return z;
}
return z;
}
-9
View File
@@ -13,10 +13,6 @@
#ifndef __DEHACKED_H__
#define __DEHACKED_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "m_fixed.h" // for get_number
#include "info.h"
@@ -75,9 +71,4 @@ 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
+18 -9
View File
@@ -130,8 +130,8 @@ extern char logfilename[1024];
#else
#define VERSION 1 // Game version
#define SUBVERSION 6 // more precise version number
#define VERSIONSTRING "Saturn v9.3 - Testing"
#define VERSIONSTRINGW L"Saturn v9.3 - Testing"
#define VERSIONSTRING "Saturn v9.2"
#define VERSIONSTRINGW L"Saturn v9.2"
#define SATURN_TESTING // comment out for saturn release builds!
@@ -516,6 +516,22 @@ 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))
@@ -573,13 +589,6 @@ INT32 I_GetKey(void);
// 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__))
+39 -3
View File
@@ -205,6 +205,12 @@ 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
@@ -255,16 +261,28 @@ 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.
@@ -361,6 +379,8 @@ 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.
@@ -374,19 +394,34 @@ 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];
extern UINT32 token; ///< Number of tokens collected in a level
// 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 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
@@ -426,6 +461,7 @@ extern UINT8 introtoplay;
extern UINT8 creditscutscene;
extern UINT8 use1upSound;
extern UINT8 maxXtraLife; // Max extra lives from rings
extern mobj_t *hunt1, *hunt2, *hunt3; // Emerald hunt locations
+5 -16
View File
@@ -68,21 +68,8 @@ extern "C" {
#define strnicmp(x,y,n) strncasecmp(x,y,n)
#endif
// 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);
#ifndef _GNU_SOURCE
#define strcasestr nongnu_strcasestr
#endif
@@ -140,9 +127,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
@@ -150,7 +137,9 @@ size_t strlcpy(char *dst, const char *src, size_t dsize);
// which we cant use as enumeration constants
typedef int32_t boolean;
#else
#define boolean int32_t
#define false FALSE
#define true TRUE
#define boolean BOOL
#endif
/* 7.18.2.1 Limits of exact-width integer types */
-5
View File
@@ -361,11 +361,6 @@ 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++);
+1 -3
View File
@@ -111,12 +111,10 @@ filestatus_t filesearch(char *filename, const char *startpath, const UINT8 *want
char *searchname;
int depthleft = maxsearchdepth;
char searchpath[MAXFILEPATH];
size_t *searchpathindex = NULL;
size_t *searchpathindex;
dirhandle = (DIR**)malloc(maxsearchdepth * sizeof(DIR*));
searchpathindex = (size_t *)malloc(maxsearchdepth * sizeof(size_t));
if (!searchpathindex)
I_Error("out of memory while searching for file %s\n", filename);
strcpy(searchpath, startpath);
searchpathindex[--depthleft] = strlen(searchpath) + 1;
+39 -34
View File
@@ -1653,12 +1653,10 @@ void G_RecordDemo(const char *name)
maxsize = cv_maxdemosize.value*1024*1024;
demobuf.buffer = Z_Malloc(maxsize + 100*1024, PU_STATIC, NULL);
demoend = demobuf.buffer + maxsize;
if (demobuf.buffer)
{
demoend = demobuf.buffer + maxsize;
demo.recording = true;
}
else
CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n");
}
@@ -1996,6 +1994,7 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick)
UINT8 totalfiles, filesloaded, nmusfilecount;
char filename[MAX_WADPATH];
UINT8 md5sum[16];
boolean toomany = false;
boolean alreadyloaded;
UINT8 i, j;
UINT8 error = 0;
@@ -2005,44 +2004,53 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick)
for (i = 0; i < totalfiles; ++i)
{
strlcpy(filename, (char *)(*pp), sizeof filename);
SKIPSTRING((*pp));
if (toomany)
SKIPSTRING((*pp));
else
{
strlcpy(filename, (char *)(*pp), sizeof filename);
SKIPSTRING((*pp));
}
READMEM((*pp), md5sum, 16); // hue hue peepee
alreadyloaded = false;
nmusfilecount = 0;
for (j = 0; j < numwadfiles; ++j)
if (!toomany)
{
if (wadfiles[j]->important && j > mainwads)
nmusfilecount++;
else
continue;
alreadyloaded = false;
nmusfilecount = 0;
if (memcmp(md5sum, wadfiles[j]->md5sum, 16) == 0)
for (j = 0; j < numwadfiles; ++j)
{
alreadyloaded = true;
if (wadfiles[j]->important && j > mainwads)
nmusfilecount++;
else
continue;
if (i != nmusfilecount-1 && error < DFILE_ERROR_OUTOFORDER)
error |= DFILE_ERROR_OUTOFORDER;
if (memcmp(md5sum, wadfiles[j]->md5sum, 16) == 0)
{
alreadyloaded = true;
break;
if (i != nmusfilecount-1 && error < DFILE_ERROR_OUTOFORDER)
error |= DFILE_ERROR_OUTOFORDER;
break;
}
}
}
if (alreadyloaded)
{
filesloaded++;
continue;
}
if (alreadyloaded)
{
filesloaded++;
continue;
}
if (numwadfiles >= MAX_WADFILES)
if (numwadfiles >= MAX_WADFILES)
error = DFILE_ERROR_CANNOTLOAD;
else if (!quick && findfile(filename, md5sum, false) != FS_FOUND)
error = DFILE_ERROR_CANNOTLOAD;
else if (error < DFILE_ERROR_INCOMPLETEOUTOFORDER)
error |= DFILE_ERROR_NOTLOADED;
} else
error = DFILE_ERROR_CANNOTLOAD;
else if (!quick && findfile(filename, md5sum, false) != FS_FOUND)
error = DFILE_ERROR_CANNOTLOAD;
else if (error < DFILE_ERROR_INCOMPLETEOUTOFORDER)
error |= DFILE_ERROR_NOTLOADED;
}
// Get final file count
@@ -2608,7 +2616,7 @@ void G_DoPlayDemo(char *defdemoname)
if (defdemoname == NULL)
{
demobuf.p = demobuf.buffer;
pdemoname = ZZ_Calloc(1); // Easier than adding checks for this everywhere it's freed
pdemoname = ZZ_Alloc(1); // Easier than adding checks for this everywhere it's freed
}
else
{
@@ -2620,7 +2628,7 @@ void G_DoPlayDemo(char *defdemoname)
n++;
pdemoname = ZZ_Alloc(strlen(n)+1);
strcpy(pdemoname, n);
strcpy(pdemoname,n);
M_SetPlaybackMenuPointer();
@@ -3082,9 +3090,6 @@ post_compat:
if (cv_director.value)
CV_SetValue(&cv_director, 0);
if (demo.timing)
G_DoneLevelLoad();
demo.deferstart = true;
}
#undef SKIPERRORS
+7 -4
View File
@@ -69,6 +69,9 @@ UINT8 botcolor = 0;
JoyType_t Joystick[MAXSPLITSCREENPLAYERS] = {};
// 1024 bytes is plenty for a savegame
#define SAVEGAMESIZE (1024)
// SRB2kart
char gamedatafilename[64] = "kartdata.dat";
char timeattackfolder[64] = "kart";
@@ -97,6 +100,7 @@ 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;
@@ -209,6 +213,7 @@ 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;
@@ -3897,7 +3902,7 @@ void G_SaveGame(UINT32 savegameslot)
char name[VERSIONSIZE];
size_t length;
save.p = save.buffer = (UINT8 *)Z_Malloc(1024, PU_STATIC, NULL); // 1024 bytes is plenty for a savegame
save.p = save.buffer = (UINT8 *)Z_Malloc(SAVEGAMESIZE, PU_STATIC, NULL);
if (!save.p)
{
CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n"));
@@ -4047,6 +4052,7 @@ void G_InitNew(UINT8 pencoremode, const char *mapname, boolean resetplayer, bool
if (W_CheckNumForName(mapname) == LUMPERROR)
{
I_Error("Internal game map '%s' not found\n", mapname);
Command_ExitGame_f();
return;
}
@@ -4147,7 +4153,6 @@ static void measurekeywords(mapsearchfreq_t *fr,
{
char *qp;
char *sp;
if (wanttable)
(*dimp) = Z_Realloc((*dimp), 255 * sizeof (struct searchdim),
PU_STATIC, NULL);
@@ -4162,12 +4167,10 @@ 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);
-21
View File
@@ -939,11 +939,6 @@ void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT8 color)
return;
}
if (!I_GamepadHasLED(playernum))
{
return;
}
// so we can override this
skincolor = color ? color : G_GetSkinColorForGamepad(playernum);
byte_color = V_GetColor(colortranslations[skincolor][8]).s;
@@ -979,22 +974,12 @@ void G_DeviceLEDTick(void)
for (i = 0; i <= splitscreen; i++)
{
if (!cv_usejoystick[i].value || !cv_gamepadled[i].value)
{
continue;
}
// does not have a configurable led! :c
if (!I_GamepadHasLED(i))
{
continue;
}
newcolor = G_GetSkinColorForGamepad(i);
if (curcolor[i] == newcolor) // dont update if same colour
{
continue;
}
G_SetPlayerGamepadIndicatorColor(i, newcolor);
curcolor[i] = newcolor;
@@ -1070,12 +1055,6 @@ void G_DeviceRumbleTick(void)
continue;
}
// does not support rumble! :c
if (!I_GamepadHasRumble(i))
{
continue;
}
if (camera[i].freecam)
{
continue;
@@ -15,6 +15,8 @@
#ifdef HWRENDER
#include <unordered_set>
#include "hw_main.h"
#include "hw_glob.h"
#include "hw_gl.h"
@@ -98,7 +100,7 @@ static void HWR_DrawColumnInCache(const column_t *patchcol, UINT8 *block, GLMipm
position = 0;
}
position = max(((position * scale_y) + (FRACUNIT/2)) >> FRACBITS, 0);
position = std::max(((position * scale_y) + (FRACUNIT/2)) >> FRACBITS, 0);
if (position + count >= pblockheight)
count = pblockheight - position;
@@ -162,7 +164,7 @@ static void HWR_DrawPatchInCache(GLMipmap_t *mipmap,
fixed_t xfrac, xfracstep;
fixed_t yfracstep, scale_y;
const column_t *patchcol;
UINT8 *block = (UINT8 *)(mipmap->data);
UINT8 *block = static_cast<UINT8 *>(mipmap->data);
INT32 bpp;
INT32 blockmodulo;
RGBA_t *palette;
@@ -212,7 +214,7 @@ static void HWR_DrawTexturePatchInCache(GLMipmap_t *mipmap,
fixed_t xfrac, xfracstep;
fixed_t yfracstep, scale_y;
const column_t *patchcol;
UINT8 *block = (UINT8 *)(mipmap->data);
UINT8 *block = static_cast<UINT8 *>(mipmap->data);
INT32 bpp;
INT32 blockmodulo;
INT32 width, height;
@@ -288,7 +290,7 @@ static UINT8 *MakeBlock(GLMipmap_t *glMipmap)
INT32 blocksize = (glMipmap->width * glMipmap->height);
bpp = format2bpp(glMipmap->format);
block = (UINT8 *)(Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data)));
block = static_cast<UINT8 *>(Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data)));
switch (bpp)
{
@@ -325,7 +327,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 = (GLTextureFormat_t)(textureformat);
gltex->mipmap.format = static_cast<GLTextureFormat_t>(textureformat);
// hack the Legacy skies..
if (UNLIKELY(memcmp(texture->name, "SKY", 3) == 0 &&
@@ -344,7 +346,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
colormap += COLORMAP_REMAPOFFSET;
#endif
gltex->mipmap.colormap = (GLColormap_t *)(Z_Calloc(sizeof(*gltex->mipmap.colormap), PU_HWRPATCHCOLMIPMAP, NULL));
gltex->mipmap.colormap = static_cast<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));
@@ -377,7 +379,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 = (UINT8 *)(W_CacheLumpNumPwad(patch->wad, patch->lump, PU_LEVEL));
pdata = static_cast<UINT8 *>(W_CacheLumpNumPwad(patch->wad, patch->lump, PU_LEVEL));
realpatch = (softwarepatch_t *)pdata;
HWR_DrawTexturePatchInCache(&gltex->mipmap, blockwidth, blockheight, texture, patch, realpatch);
@@ -413,7 +415,7 @@ void HWR_MakePatch(const patch_t *patch, GLPatch_t *glPatch, GLMipmap_t *glMipma
glMipmap->flags = 0;
// setup the texture info
glMipmap->format = (GLTextureFormat_t)(patchformat);
glMipmap->format = static_cast<GLTextureFormat_t>(patchformat);
glPatch->max_s = (float)patch->width / (float)glMipmap->width;
glPatch->max_t = (float)patch->height / (float)glMipmap->height;
@@ -455,7 +457,7 @@ static void HWR_FreeTextureData(patch_t *patch)
if (!patch || !patch->hardware)
return;
glPatch = (GLPatch_t *)(patch->hardware);
glPatch = static_cast<GLPatch_t *>(patch->hardware);
if (vid.glstate == VID_GL_LIBRARY_LOADED)
GL_DeleteTexture(glPatch->mipmap);
@@ -471,7 +473,7 @@ void HWR_FreeTexture(patch_t *patch)
if (patch->hardware)
{
GLPatch_t *glPatch = (GLPatch_t *)(patch->hardware);
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
HWR_FreeTextureColormaps(patch);
@@ -497,7 +499,7 @@ static void HWR_FreeTextureColormaps(patch_t *patch)
if (!patch)
return;
pat = (GLPatch_t *)(patch->hardware);
pat = static_cast<GLPatch_t *>(patch->hardware);
if (!pat)
return;
@@ -612,20 +614,24 @@ 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
flatcheck flatpresent;
flatcheck_init(&flatpresent);
// too lazy to make a hashtable or smth so unordered set will do :carbuncle:
std::unordered_set<UINT32> 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)
@@ -643,23 +649,14 @@ static void HWR_PrecacheLevelFlats(void)
const levelflat_t *levelflat = &levelflats[pic];
if (flatcheck_is_end(flatcheck_get(&flatpresent, levelflat->lumpnum)))
{
HWR_GetFlat(levelflat->lumpnum, R_NoEncore(sec, ceiling));
flatcheck_insert(&flatpresent, levelflat->lumpnum);
}
load_flat(levelflat->lumpnum, R_NoEncore(sec, ceiling));
if (levelflat->speed) // is it an animated flat ?
{
// start from 0, occasionally basenumlump != flat->lumpnum
for (k = 0; k < levelflat->numpics; k++)
{
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);
}
load_flat(levelflat->baselumpnum + k, R_NoEncore(sec, ceiling));
}
}
}
@@ -674,29 +671,18 @@ static void HWR_PrecacheLevelFlats(void)
{
const levelflat_t *levelflat = &levelflats[i];
if (flatcheck_is_end(flatcheck_get(&flatpresent, levelflat->lumpnum)))
{
HWR_GetFlat(levelflat->lumpnum, false);
flatcheck_insert(&flatpresent, levelflat->lumpnum);
}
load_flat(levelflat->lumpnum, false);
if (levelflat->speed) // is it an animated flat ?
{
// start from 0, occasionally basenumlump != flat->lumpnum
for (k = 0; k < levelflat->numpics; k++)
{
lumpnum_t lump = levelflat->baselumpnum + k;
if (flatcheck_is_end(flatcheck_get(&flatpresent, lump)))
{
HWR_GetFlat(lump, false);
flatcheck_insert(&flatpresent, lump);
}
load_flat(levelflat->baselumpnum + k, false);
}
}
}
}
flatcheck_cleanup(&flatpresent);
}
static void HWR_PrecacheLevelTextures(void)
@@ -706,7 +692,7 @@ static void HWR_PrecacheLevelTextures(void)
size_t i, j, f;
INT32 h;
texturepresent = (char *)(calloc(gl_numtextures, sizeof(*texturepresent)));
texturepresent = static_cast<char *>(calloc(gl_numtextures, sizeof(*texturepresent)));
if (texturepresent == NULL)
I_Error("%s: Out of memory looking up textures", "HWR_PrecacheLevel");
@@ -881,7 +867,7 @@ void HWR_LoadMapTextures(size_t pnumtextures)
HWR_FreeMapTextures();
gl_numtextures = pnumtextures;
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
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
if (gl_textures == NULL)
I_Error("HWR_LoadMapTextures: ran out of memory for OpenGL textures. Sad!");
@@ -978,7 +964,7 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum)
W_ReadLump(flatlumpnum, Z_Malloc(size, PU_HWRCACHE, &glMipmap->data));
#ifdef GLENCORE
flat = (UINT8 *)(glMipmap->data);
flat = static_cast<UINT8 *>(glMipmap->data);
for (steppy = 0; steppy < size; steppy++)
{
if (flat[steppy] == HWR_PATCHES_CHROMAKEY_COLORINDEX)
@@ -1022,7 +1008,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
if (!noencoremap && encoremap)
colormap += COLORMAP_REMAPOFFSET;
#endif
glMipmap->colormap = (GLColormap_t *)(Z_Calloc(sizeof(*glMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
glMipmap->colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*glMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
glMipmap->colormap->source = colormap;
memcpy(glMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
}
@@ -1046,7 +1032,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
// --------------------+
static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
{
GLPatch_t *glPatch = (GLPatch_t *)(patch->hardware);
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
if (!glMipmap->downloaded)
{
@@ -1067,7 +1053,7 @@ static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
// ----------------------+
static void HWR_UpdatePatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
{
GLPatch_t *glPatch = (GLPatch_t *)(patch->hardware);
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
HWR_MakePatch(patch, glPatch, glMipmap, true);
// If hardware does not have the texture, then call GL_SetTexture to upload it
@@ -1103,7 +1089,7 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
if (!patch->hardware)
Patch_CreateGL(patch);
glPatch = (GLPatch_t *)(patch->hardware);
glPatch = static_cast<GLPatch_t *>(patch->hardware);
// Blatant hack for encore colormapping aside...
if (colormap == colormaps || colormap == NULL || colormap == (const UINT8*)(COLORMAP_REMAPOFFSET))
@@ -1139,12 +1125,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 = (GLMipmap_t *)(calloc(1, sizeof (*newMipmap)));
newMipmap = static_cast<GLMipmap_t *>(calloc(1, sizeof (*newMipmap)));
if (newMipmap == NULL)
I_Error("%s: Out of memory", "HWR_GetMappedPatch");
glMipmap->nextcolormap = newMipmap;
newMipmap->colormap = (GLColormap_t *)(Z_Calloc(sizeof(*newMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
newMipmap->colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*newMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
newMipmap->colormap->source = colormap;
memcpy(newMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
@@ -1167,7 +1153,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((patch_t *)(ptr));
Patch_AllocateHardwarePatch(static_cast<patch_t *>(ptr));
}
return (patch_t *)(lumpcache[lumpnum]);
@@ -1184,7 +1170,7 @@ static void HWR_DrawFadeMaskInCache(GLMipmap_t *mipmap, INT32 pblockwidth, INT32
{
INT32 i,j;
fixed_t posx, posy, stepx, stepy;
UINT8 *block = (UINT8 *)(mipmap->data); // places the data directly into here
UINT8 *block = static_cast<UINT8 *>(mipmap->data); // places the data directly into here
UINT8 *flat;
UINT8 *dest, *src, texel;
RGBA_t col;
@@ -1340,7 +1326,7 @@ void HWR_SetPalette(RGBA_t *palette)
static void HWR_SetPaletteLookup(RGBA_t *palette)
{
int r, g, b;
UINT8 *lut = (UINT8 *)(Z_Malloc(
UINT8 *lut = static_cast<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)
@@ -1385,7 +1371,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 = (UINT8 *)(W_CacheLumpNum(lumpnum, PU_CACHE));
RGB_data = static_cast<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++)
{
@@ -1420,7 +1406,7 @@ static UINT32 HWR_CreateLightTable(UINT8 *lighttable)
{
UINT32 i, id;
RGBA_t *palette = HWR_GetTexturePalette();
RGBA_t *hw_lighttable = (RGBA_t *)(Z_Malloc(256 * 32 * sizeof(RGBA_t), PU_STATIC, NULL));
RGBA_t *hw_lighttable = static_cast<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.
+1 -1
View File
@@ -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;
+9 -9
View File
@@ -150,7 +150,7 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
if (!column->topdelta)
{
const UINT8 *source = (const UINT8 *)(column) + 3;
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, source[0]);
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (column->topdelta == 0xff ? 31 : source[0]));
}
}
@@ -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)
@@ -302,7 +302,7 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
if (!column->topdelta)
{
const UINT8 *source = (const UINT8 *)(column) + 3;
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, source[0]);
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (column->topdelta == 0xff ? 31 : source[0]));
}
}
@@ -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)
+48 -34
View File
@@ -242,6 +242,7 @@ 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};
@@ -388,11 +389,11 @@ void HWR_ObjectLightLevelPost(gl_vissprite_t *spr, const sector_t *sector, INT32
extralight = FixedMul(extralight, std::min(std::max(0, *lightlevel), 255) * FRACUNIT / 255);
// simple OGL approximation
const fixed_t tr = R_QuickCamDist(spr->mobj->x, spr->mobj->y);
const fixed_t xscale = FixedDiv((vid.width / 2) << FRACBITS, tr);
fixed_t tr = R_QuickCamDist(spr->mobj->x, spr->mobj->y);
fixed_t xscale = FixedDiv((vid.width / 2) << FRACBITS, tr);
// Less change in contrast at further distances, to counteract DOOM diminished light
const fixed_t n = FixedDiv(FixedMul(xscale, LIGHTRESOLUTIONFIX), ((MAXLIGHTSCALE-1) << LIGHTSCALESHIFT));
fixed_t n = FixedDiv(FixedMul(xscale, LIGHTRESOLUTIONFIX), ((MAXLIGHTSCALE-1) << LIGHTSCALESHIFT));
extralight = FixedMul(extralight, std::min(n, FRACUNIT));
// Contrast is stronger for normal sprites, stronger than wall lighting is at the same distance
@@ -515,7 +516,7 @@ static FUINT HWR_CalcWallLight(FUINT lightnum, seg_t *seg, extracolormap_t *colo
if (seg != NULL && P_ApplyLightOffsetFine(lightnum, seg->frontsector))
{
const INT16 offset = (cv_glfakecontrast.value == 2) ? seg->hwLightOffset : ((INT16)seg->lightOffset * 8);
INT16 offset = (cv_glfakecontrast.value == 2) ? seg->hwLightOffset : ((INT16)seg->lightOffset * 8);
finallight += offset;
finallight = CLAMP(finallight, 0 , 255);
@@ -533,7 +534,7 @@ static FUINT HWR_CalcSlopeLight(FUINT lightnum, pslope_t *slope, const sector_t
if (slope != NULL && sector != NULL && P_ApplyLightOffsetFine(lightnum, sector))
{
const INT16 offset = (cv_glfakecontrast.value == 2) ? slope->hwLightOffset : ((INT16)slope->lightOffset * 8);
INT16 offset = (cv_glfakecontrast.value == 2) ? slope->hwLightOffset : ((INT16)slope->lightOffset * 8);
finallight += (fof ? -offset : offset);
finallight = CLAMP(finallight, 0 , 255);
@@ -550,7 +551,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;
@@ -1375,7 +1376,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;
@@ -1420,11 +1421,6 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
{
draw_sky_walls(0, 1, worldhigh, worldhighslope);
}
// hack to allow height changes in outdoor areas
// This is what gets rid of the upper textures if there should be sky
worldtop = worldhigh;
worldtopslope = worldhighslope;
}
else
{
@@ -1469,6 +1465,15 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
}
}
// hack to allow height changes in outdoor areas
// This is what gets rid of the upper textures if there should be sky
if (gl_frontsector->ceilingpic == skyflatnum
&& gl_backsector->ceilingpic == skyflatnum)
{
worldtop = worldhigh;
worldtopslope = worldhighslope;
}
gl_toptexture = R_GetTextureNum(gl_sidedef->toptexture);
// check TOP TEXTURE
@@ -2259,7 +2264,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
static inline boolean HWR_UsePortals(void)
{
return supportstencil && gl_maphasportals && cv_glportals.value;
return supportstencil && cv_glportals.value && gl_maphasportals;
}
// From PrBoom:
@@ -2403,8 +2408,7 @@ static inline void DoAddLine(seg_t* line, angle_t angle1, angle_t angle2)
// SoM: Backsector needs to be run through R_FakeFlat
static sector_t tempsec;
auto do_addline = [&](bool dontdraw)
{
auto do_addline = [&](bool dontdraw) {
// Single sided line?
if (!line->backsector)
{
@@ -2671,7 +2675,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;
@@ -2685,6 +2689,14 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling,
if (nrPlaneVerts < 3) // not even a triangle ?
return;
if (nrPlaneVerts > INT16_MAX) // FIXME: exceeds plVerts size
{
CONS_Debug(DBG_RENDER, "polygon size of %s exceeds max value of %d vertices\n", sizeu1(nrPlaneVerts), UINT16_MAX);
return;
}
const sector_t *sec = FOFsector ? FOFsector : gl_frontsector;
// Allocate plane-vertex buffer if we need to
if (!planeVerts || nrPlaneVerts > numAllocedPlaneVerts)
{
@@ -2693,8 +2705,6 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling,
Z_Malloc(numAllocedPlaneVerts * sizeof(FOutVector), PU_LEVEL, &planeVerts);
}
const sector_t *sec = FOFsector ? FOFsector : gl_frontsector;
height = FixedToFloat(fixedheight);
len = W_LumpLength(lumpnum);
@@ -2832,8 +2842,9 @@ 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));
@@ -2854,8 +2865,9 @@ 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));
@@ -3407,7 +3419,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;
@@ -3643,7 +3655,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;
@@ -3672,7 +3684,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 = static_cast<GLPatch_t *>(gpatch->hardware);
hwrpatch = ((GLPatch_t *)gpatch->hardware);
// Draw shadow BEFORE sprite
if (UNLIKELY(cv_shadow.value // Shadows enabled
@@ -3774,10 +3786,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 = static_cast<UINT8>(FixedMul(FRACUNIT/2, static_cast<fixed_t>(Surf.PolyColor.s.alpha)));
Surf.PolyColor.s.alpha = FixedMul(FRACUNIT/2, Surf.PolyColor.s.alpha);
if (cv_playerfade.value)
Surf.PolyColor.s.alpha = static_cast<UINT8>(FixedMul(R_DoPlayerFade(sprmo), static_cast<fixed_t>(Surf.PolyColor.s.alpha)));
Surf.PolyColor.s.alpha = FixedMul(R_DoPlayerFade(sprmo), Surf.PolyColor.s.alpha);
}
if (HWR_UseShader())
@@ -3928,7 +3940,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;
@@ -3960,7 +3972,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 = static_cast<GLPatch_t *>(gpatch->hardware);
hwrpatch = ((GLPatch_t *)gpatch->hardware);
// create the sprite billboard
//
@@ -4071,10 +4083,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 = static_cast<UINT8>(FixedMul(FRACUNIT/2, static_cast<fixed_t>(Surf.PolyColor.s.alpha)));
Surf.PolyColor.s.alpha = FixedMul(FRACUNIT/2, Surf.PolyColor.s.alpha);
if (cv_playerfade.value)
Surf.PolyColor.s.alpha = static_cast<UINT8>(FixedMul(R_DoPlayerFade(sprmo), static_cast<fixed_t>(Surf.PolyColor.s.alpha)));
Surf.PolyColor.s.alpha = FixedMul(R_DoPlayerFade(sprmo), Surf.PolyColor.s.alpha);
}
if (HWR_UseShader())
@@ -4093,7 +4105,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;
@@ -4110,7 +4122,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 = static_cast<GLPatch_t *>(gpatch->hardware);
hwrpatch = ((GLPatch_t *)gpatch->hardware);
// create the sprite billboard
//
@@ -4501,6 +4513,7 @@ static void HWR_RenderDrawNodes(void)
drawnodes.clear(); // clear so our size is 0 again!
}
// --------------------------------------------------------------------------
// Draw all vissprites
// --------------------------------------------------------------------------
@@ -4837,7 +4850,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
flip = sprframe->flip; // Will only be 0x00 or 0xFF
if (papersprite && ang < ANGLE_180)
flip ^= 0xFF;
flip ^= 0xFFFF;
}
else
{
@@ -5900,6 +5913,7 @@ void HWR_AddCommands(void)
CV_RegisterVar(&cv_glpaletterendering);
CV_RegisterVar(&cv_glpalettedepth);
CV_RegisterVar(&cv_glflashpal);
}
// --------------------------------------------------------------------------
@@ -6056,7 +6070,7 @@ static void HWR_DoPostProcessor(void)
{
// Armageddon Blast Flash!
// Could this even be considered postprocessor?
if (!HWR_ShouldUsePaletteRendering())
if (!HWR_PalRenderFlashpal())
{
const player_t *player = &players[displayplayers[viewssnum]];
@@ -6069,7 +6083,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)
+6
View File
@@ -208,6 +208,7 @@ 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)
{
@@ -219,6 +220,11 @@ 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)
{
+5 -4
View File
@@ -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 = spr->mobj->state->var2;
tics = (INT32)spr->mobj->anim_duration;
durs = (float)spr->mobj->state->var2;
tics = (float)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,6 +1526,7 @@ 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;
+3 -9
View File
@@ -109,7 +109,7 @@ boolean HWR_InitShaders(void)
// returns INT32_MAX if not found
static INT32 strstr_int(const char *str1, const char *str2)
{
gconst char *location = strstr(str1, str2);
char *location = strstr(str1, str2);
if (location)
return location - str1;
else
@@ -365,17 +365,13 @@ static void HWR_CompileShader(int index)
if (vertex_source)
{
char *preprocessed = HWR_PreprocessShader(vertex_source);
if (!preprocessed)
return;
if (!preprocessed) return;
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_VERTEX);
}
if (fragment_source)
{
char *preprocessed = HWR_PreprocessShader(fragment_source);
if (!preprocessed)
return;
if (!preprocessed) return;
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_FRAGMENT);
}
@@ -391,10 +387,8 @@ void HWR_CompileShaders(void)
{
int custom_index = gl_shadertargets[i].custom_shader;
HWR_CompileShader(i);
if (!gl_shaders[i].compiled)
CONS_Alert(CONS_ERROR, "HWR_CompileShaders: Compilation failed for base %s shader!\n", shaderxlat[i].type);
if (custom_index != -1)
{
HWR_CompileShader(custom_index);
+3 -3
View File
@@ -1383,19 +1383,19 @@ void GL_Flush(void)
// -----------------+
INT32 GL_isExtAvailable(const char *extension, const GLubyte *start)
{
gconst GLubyte *where, *terminator;
GLubyte *where, *terminator;
if (!extension || !start)
return 0;
where = (gconst GLubyte *)strchr(extension, ' ');
where = (GLubyte *) strchr(extension, ' ');
if (where || *extension == '\0')
return 0;
for (;;)
{
where = (gconst GLubyte *)strstr((const char *)start, extension);
where = (GLubyte *) strstr((const char *) start, extension);
if (!where)
break;
-1
View File
@@ -318,7 +318,6 @@ static void
HMS_end (struct HMS_buffer *buffer)
{
curl_easy_cleanup(buffer->curl);
free(buffer->errbuf);
free(buffer->buffer);
free(buffer);
}
+63 -76
View File
@@ -97,6 +97,7 @@ 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;
@@ -543,8 +544,6 @@ void HU_AddChatText(const char *text, boolean playsound)
HU_removeChatText_Log();
chat_log[chat_nummsg_log] = malloc(HU_MSGBUFSIZE);
if (!chat_log[chat_nummsg_log])
I_Error("HU_AddChatText: out of memory for chat log\n");
strcpy(chat_log[chat_nummsg_log], text);
++chat_nummsg_log;
@@ -627,10 +626,7 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
// with that logic, characters 4 and 5 are our numbers:
const char *newmsg;
INT32 spc = 1; // used if nodenum[1] is a space.
CLEANUP(pfree) char *nodenum = (char*)malloc(3);
if (!nodenum)
I_Error("DoSayCommand: out of memory for sending pm\n");
CLEANUP(pfree) char *nodenum = (char*) malloc(3);
memcpy(nodenum, msg+3, 2);
nodenum[2] = '\0';
@@ -911,7 +907,7 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
target = READSINT8(*p);
flags = READUINT8(*p);
msg = buf;
READSTRINGN(*p, msg, HU_MAXMSGLEN + 1);
READSTRINGL(*p, msg, HU_MAXMSGLEN + 1);
if ((cv_mute.value || flags & (HU_CSAY|HU_SERVER_SAY)) && playernum != serverplayer && !(IsPlayerAdmin(playernum)))
{
@@ -1099,6 +1095,7 @@ void HU_Ticker(void)
return;
hu_tick++;
hu_emoteanim++;
hu_tick &= 7; // currently only to blink chat input cursor
if (PLAYER1INPUTDOWN(gc_scores))
@@ -1235,9 +1232,7 @@ static void HU_SendChatMessage(void)
{
INT32 spc = 1; // used if nodenum[1] is a space.
const char *newmsg;
CLEANUP(pfree) char *nodenum = (char*)malloc(3);
if (!nodenum)
I_Error("HU_SendChatMessage: out of memory for sending pm\n");
CLEANUP(pfree) char *nodenum = (char*) malloc(3);
// what we're gonna do now is check if the node exists
// with that logic, characters 4 and 5 are our numbers:
@@ -1815,7 +1810,6 @@ 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;
@@ -1927,6 +1921,64 @@ 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
{
@@ -2007,74 +2059,9 @@ 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.
+1 -8
View File
@@ -43,7 +43,7 @@ extern UINT8 graphics_started;
extern UINT8 keyboard_started;
/** \brief Set to true when inside a signal handler that will exit the program. */
boolean I_In_Exiting_Signal_Handler(void);
extern boolean g_in_exiting_signal_handler;
/** \brief The I_GetFreeMem function
@@ -148,9 +148,6 @@ extern INT32 numcontrollers;
*/
const char *I_GetJoyName(INT32 joyindex);
boolean I_GamepadHasLED(INT32 playernum);
boolean I_GamepadHasRumble(INT32 playernum);
void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration);
void I_SetGamepadIndicatorColor(INT32 playernum, UINT8 red, UINT8 green, UINT8 blue);
@@ -198,10 +195,6 @@ INT32 I_StartupSystem(void);
*/
void I_ShutdownSystem(void);
/** \brief To check if a Interrupt or Terminate Signal was fired
*/
boolean I_Interrupted(void);
/** \brief The I_GetDiskFreeSpace function
\param freespace a INT64 pointer to hold the free space amount
+7 -9
View File
@@ -496,10 +496,8 @@ static void cleanupnodes(void)
// Why can't I start at zero?
for (j = 1; j < MAXNETNODES; j++)
{
if (!(nodeingame[j] || SV_SendingFile(j)))
nodeconnected[j] = false;
}
}
static SINT8 getfreenode(void)
@@ -509,13 +507,11 @@ static SINT8 getfreenode(void)
cleanupnodes();
for (j = 0; j < MAXNETNODES; j++)
{
if (!nodeconnected[j])
{
nodeconnected[j] = true;
return j;
}
}
/** \warning No free node? Just in case a node might not have been freed properly,
* look if there are connected nodes that aren't in game, and forget them.
@@ -816,7 +812,7 @@ static void SOCK_Send(void)
static void SOCK_FreeNodenum(INT32 numnode)
{
// can't disconnect from self :)
if (numnode <= 0 || numnode > MAXNETNODES)
if (!numnode || numnode > MAXNETNODES)
return;
DEBFILE(va("Free node %d (%s)\n", numnode, SOCK_GetNodeAddress(numnode)));
@@ -1436,12 +1432,14 @@ static void SOCK_RegisterHolePunch(void)
static boolean SOCK_OpenSocket(void)
{
memset(clientaddress, 0, sizeof(clientaddress));
size_t i;
memset(clientaddress, 0, sizeof (clientaddress));
memset(nodeconnected, false, sizeof(nodeconnected));
nodeconnected[0] = true; // always connected to self
for (i = 1; i < MAXNETNODES; i++)
nodeconnected[i] = false;
nodeconnected[BROADCASTADDR] = true;
I_NetSend = SOCK_Send;
I_NetGet = SOCK_Get;
I_NetCloseSocket = SOCK_CloseSocket;
@@ -1481,7 +1479,7 @@ static boolean SOCK_Ban(INT32 node)
{
INT32 ban;
if (node < 0 || node > MAXNETNODES)
if (node > MAXNETNODES)
return false;
ban = numbans;
-2
View File
@@ -95,7 +95,6 @@ INT32 VID_SetMode(INT32 modenum);
*/
const char *VID_GetModeName(INT32 modenum);
void VID_RefreshModeList(void);
void VID_PrepareModeList(void);
/** \brief can video system do fullscreen
@@ -122,7 +121,6 @@ void I_ReadScreen(UINT8 * restrict scr, INT32 scale);
UINT32 I_GetRefreshRate(void);
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height);
boolean I_CheckNativeRes(void);
void I_SetBorderlessWindow(void);
-6
View File
@@ -446,12 +446,6 @@ void K_UpdateDirector(void)
}
}
// not sure if we should just stop here?
if (targetposition == MAXPLAYERS)
{
break;
}
target = directorinfo.sortedplayers[targetposition];
// stop here since we're already viewing this player
+26 -53
View File
@@ -83,7 +83,6 @@ IMPL_HUD_OFFSET(stat); // Stats
// extra hud things
consvar_t cv_showstats = {"showstats", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_showstats_skinname = {"showstats_skinname", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_highresportrait = {"highresportrait", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // make char potraits use their high-res version instead
@@ -93,7 +92,6 @@ consvar_t cv_showinput = {"showinput", "Off", CV_SAVE, inputdisplay_cons_t, NULL
static CV_PossibleValue_t minihead_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "Others"}, {0, NULL}};
consvar_t cv_minihead = {"smallminimapplayers", "Off", CV_SAVE, minihead_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_showminimapnames = {"showminimapnames", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_showminimapfinished = {"showminimapfinished", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
CV_PossibleValue_t minimapdot_cons_t[NUMMINIMAPDOTSTUFF];
consvar_t cv_showminimapangle = {"showminimapangle", "Off", CV_SAVE, minimapdot_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
@@ -209,7 +207,6 @@ void K_RegisterKartHudStuff(void)
CV_RegisterVar(&cv_kartspeedometer);
CV_RegisterVar(&cv_showstats);
CV_RegisterVar(&cv_showstats_skinname);
CV_RegisterVar(&cv_showinput);
CV_RegisterVar(&cv_posanim);
@@ -224,7 +221,6 @@ void K_RegisterKartHudStuff(void)
CV_RegisterVar(&cv_minihead);
CV_RegisterVar(&cv_showminimapnames);
CV_RegisterVar(&cv_showminimapfinished);
CV_RegisterVar(&cv_showminimapangle);
CV_RegisterVar(&cv_showlapemblem);
@@ -935,21 +931,21 @@ const char *K_GetItemPatch(UINT8 item, boolean tiny)
//}
static INT32 ITEM_X, ITEM_Y; // Item Window
static INT32 TIME_X, TIME_Y; // Time Sticker
static INT32 LAPS_X, LAPS_Y; // Lap Sticker
static INT32 SPDM_X, SPDM_Y; // Speedometer
static INT32 POSI_X, POSI_Y; // Position Number
static INT32 FACE_X, FACE_Y; // Top-four Faces
static INT32 STCD_X, STCD_Y; // Starting countdown
static INT32 CHEK_Y; // CHECK graphic
static INT32 MINI_X, MINI_Y; // Minimap
static INT32 WANT_X, WANT_Y; // Battle WANTED poster
INT32 ITEM_X, ITEM_Y; // Item Window
INT32 TIME_X, TIME_Y; // Time Sticker
INT32 LAPS_X, LAPS_Y; // Lap Sticker
INT32 SPDM_X, SPDM_Y; // Speedometer
INT32 POSI_X, POSI_Y; // Position Number
INT32 FACE_X, FACE_Y; // Top-four Faces
INT32 STCD_X, STCD_Y; // Starting countdown
INT32 CHEK_Y; // CHECK graphic
INT32 MINI_X, MINI_Y; // Minimap
INT32 WANT_X, WANT_Y; // Battle WANTED poster
// This is for the P2 and P4 side of splitscreen. Then we'll flip P1's and P2's to the bottom with V_SPLITSCREEN.
static INT32 ITEM2_X, ITEM2_Y;
static INT32 LAPS2_X, LAPS2_Y;
static INT32 POSI2_X, POSI2_Y;
INT32 ITEM2_X, ITEM2_Y;
INT32 LAPS2_X, LAPS2_Y;
INT32 POSI2_X, POSI2_Y;
static void K_initKartHUD(void)
{
@@ -1438,16 +1434,13 @@ static void K_drawKartStats(void)
fakeskin = K_GetPlayerSkin(stplyr);
// Skin name
if (cv_showstats_skinname.value)
if (K_IsHighResolution()) // V_DrawSmallString becomes a mess at low resolutions lel
{
if (K_IsHighResolution()) // V_DrawSmallString becomes a mess at low resolutions lel
{
V_DrawSmallString(x+20, y+12, flags2, fakeskin->realname);
}
else
{
V_DrawThinString(x+20, y+7, flags2, fakeskin->realname);
}
V_DrawSmallString(x+20, y+12, flags2, fakeskin->realname);
}
else
{
V_DrawThinString(x+20, y+7, flags2, fakeskin->realname);
}
// Icon and stats
@@ -2101,7 +2094,7 @@ static void K_DrawKartPositionNum(INT32 num)
fy = POSI_Y;
fflags = V_SNAPTOLEFT|((stplyrnum == 2) ? V_SPLITSCREEN|V_SNAPTOBOTTOM : 0); // flip P3 to the bottom.
flipdraw = true;
if (num >= 10)
if (num && num >= 10)
fx += W; // this seems dumb, but we need to do this in order for positions above 10 going off screen.
}
else // else, that means we're P2 or P4.
@@ -3779,9 +3772,6 @@ static void K_drawKartMinimap(void)
if (!players[i].mo || players[i].spectator)
continue;
if (!cv_showminimapfinished.value && players[i].exiting)
continue;
if (P_IsDisplayPlayer(&players[i]))
{
// Draw display players on top of everything else
@@ -3826,7 +3816,7 @@ static void K_drawKartMinimap(void)
if (cv_showminimapangle.value && (minidoticon || minilighticon) && !playertimedout)
{
UINT8 *colormap = NULL;
UINT8 *colormap;
drawinfo_t dims;
fixed_t interpx, interpy;
fixed_t xoff = 0, yoff = 0;
@@ -3837,27 +3827,10 @@ static void K_drawKartMinimap(void)
if (encoremode)
ang = ANGLE_180 - ang;
if (mobj->color)
{
if (mobj->colorized)
{
colormap = R_GetTranslationColormap(TC_RAINBOW, mobj->color, GTC_CACHE);
}
else
{
const INT32 skinnum = K_GetMobjLocalSkinNum(mobj->skin, mobj->localskin, mobj->skinlocal);
// special case if startcolor is not the default (160 / Green)
if (skinnum && skins[skinnum].starttranscolor != skins[0].starttranscolor)
{
colormap = R_GetTranslationColormap(TC_DEFAULT, mobj->color, GTC_CACHE);
}
else
{
colormap = R_GetLocalTranslationColormap(mobj->skin, mobj->localskin, mobj->color, GTC_CACHE, mobj->skinlocal);
}
}
}
if (mobj->colorized)
colormap = R_GetTranslationColormap(TC_RAINBOW, mobj->color, GTC_CACHE);
else
colormap = R_GetLocalTranslationColormap(mobj->skin, mobj->localskin, mobj->color, GTC_CACHE, mobj->skinlocal);
interpx = lerp(mobj->old_x, mobj->x);
interpy = lerp(mobj->old_y, mobj->y);
@@ -4086,7 +4059,7 @@ static void K_drawBattleFullscreen(void)
{
if (i == displayplayers[0])
continue;
if (playeringame[i])
if (playeringame[i] && !stplyr->spectator)
return;
}
-1
View File
@@ -35,7 +35,6 @@ extern consvar_t cv_darkitembox;
extern consvar_t cv_biglaps;
extern consvar_t cv_highresportrait;
extern consvar_t cv_showstats;
extern consvar_t cv_showstats_skinname;
extern consvar_t cv_fancyroulette;
extern consvar_t cv_showlaptimes;
extern consvar_t cv_battlespeedo;
+10 -30
View File
@@ -660,22 +660,13 @@ INT32 K_GetSkinNum(player_t *player)
//
// returns the mobj skinnumber
// accounts for localskins ?
// accounts for localskins
//
INT32 K_GetMobjSkinNum(const skin_t *skin, boolean local)
{
return skin - K_GetSkinArray(local);
}
//
// returns the mobj skinnumber
// accounts for localskins
//
INT32 K_GetMobjLocalSkinNum(const skin_t *skin, const skin_t *localskin, boolean local)
{
return localskin ? (localskin - K_GetSkinArray(local)) : (skin - skins);
}
//
// returns the players skinnumber
// accounts for localskins
@@ -1955,9 +1946,11 @@ static void K_PlayGenericCombatSound(mobj_t *source, mobj_t *other, sfxenum_t sf
if (!skin)
return;
boolean alwaysHear = false;
if (cv_kartvoices.value && !P_MobjWasRemoved(other) && other->player != NULL)
{
boolean alwaysHear = P_IsDisplayPlayer(other->player);
alwaysHear = P_IsDisplayPlayer(other->player);
S_StartSound(alwaysHear ? NULL : source, skin->soundsid[S_sfx[sfx_id].skinsound]);
}
@@ -2157,13 +2150,7 @@ static void K_GetKartBoostPower(player_t *player)
&& player->speed > 0
&& !player->spectator)
{
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;
K_SpawnWipeoutTrail(player->mo, true);
if (leveltime % 6 == 0)
S_StartSound(player->mo, sfx_cdfm70);
}
@@ -2370,7 +2357,6 @@ void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount)
break;
case 3:
st = S_BATTLEPOINT3A;
break;
default:
return; // NO STATE!
}
@@ -3639,7 +3625,7 @@ void K_SpawnSparkleTrail(mobj_t *mo)
P_SetMobjState(sparkle, S_KARTINVULN_LARGE1);
}
mobj_t *K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
{
mobj_t *dust;
angle_t aoff;
@@ -3676,10 +3662,10 @@ mobj_t *K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
dust->momx = mo->momx/2;
dust->momy = mo->momy/2;
dust->momz = mo->momz/2;
dust->flags2 |= MF2_SHADOW;
}
return dust;
if (translucent)
dust->flags2 |= MF2_SHADOW;
}
// K_DriftDustHandling
@@ -4654,7 +4640,8 @@ void K_RepairOrbitChain(mobj_t *orbit)
prev->movedir = num;
}
player->kartstuff[k_itemamount] = num;
if (player->kartstuff[k_itemamount] != num)
player->kartstuff[k_itemamount] = num;
}
}
@@ -6179,13 +6166,6 @@ 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
View File
@@ -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);
mobj_t *K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent);
void 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);
+13 -42
View File
@@ -358,8 +358,7 @@ static int lib_cvRegisterVar(lua_State *L)
#define TYPEERROR(f, t) FIELDERROR(f, va("%s expected, got %s", lua_typename(L, t), luaL_typename(L, -1)))
lua_pushnil(L);
while (lua_next(L, 1))
{
while (lua_next(L, 1)) {
// stack: cvar table, cvar userdata, key/index, value
// 1 2 3 4
i = 0;
@@ -369,40 +368,26 @@ static int lib_cvRegisterVar(lua_State *L)
else if (lua_isstring(L, 3))
k = lua_tostring(L, 3);
if (i == 1 || (k && fasticmp(k, "name")))
{
if (i == 1 || (k && fasticmp(k, "name"))) {
if (!lua_isstring(L, 4))
TYPEERROR("name", LUA_TSTRING)
cvar->name = Z_StrDup(lua_tostring(L, 4));
}
else if (i == 2 || (k && fasticmp(k, "defaultvalue")))
{
} else if (i == 2 || (k && fasticmp(k, "defaultvalue"))) {
if (!lua_isstring(L, 4))
TYPEERROR("defaultvalue", LUA_TSTRING)
cvar->defaultvalue = Z_StrDup(lua_tostring(L, 4));
}
else if (i == 3 || (k && fasticmp(k, "flags")))
{
} else if (i == 3 || (k && fasticmp(k, "flags"))) {
if (!lua_isnumber(L, 4))
TYPEERROR("flags", LUA_TNUMBER)
cvar->flags = (INT32)lua_tointeger(L, 4);
}
else if (i == 4 || (k && fasticmp(k, "PossibleValue")))
{
if (lua_islightuserdata(L, 4))
{
} else if (i == 4 || (k && fasticmp(k, "PossibleValue"))) {
if (lua_islightuserdata(L, 4)) {
CV_PossibleValue_t *pv = lua_touserdata(L, 4);
if (pv == CV_OnOff || pv == CV_YesNo || pv == CV_Unsigned || pv == CV_Natural)
cvar->PossibleValue = pv;
else
FIELDERROR("PossibleValue", "CV_PossibleValue_t expected, got unrecognised pointer")
}
else if (lua_istable(L, 4))
{
} else if (lua_istable(L, 4)) {
// Accepts tables in the form of {MIN=0, MAX=9999} or {Red=0, Green=1, Blue=2}
// and converts them to CV_PossibleValue_t {{0,"MIN"},{9999,"MAX"}} or {{0,"Red"},{1,"Green"},{2,"Blue"}}
//
@@ -413,9 +398,7 @@ static int lib_cvRegisterVar(lua_State *L)
CV_PossibleValue_t *cvpv;
lua_pushnil(L);
while (lua_next(L, 4))
{
while (lua_next(L, 4)) {
count++;
lua_pop(L, 1);
}
@@ -429,9 +412,7 @@ static int lib_cvRegisterVar(lua_State *L)
i = 0;
lua_pushnil(L);
while (lua_next(L, 4))
{
while (lua_next(L, 4)) {
// stack: [...] PossibleValue table, index, value
// 4 5 6
if (lua_type(L, 5) != LUA_TSTRING
@@ -442,19 +423,14 @@ static int lib_cvRegisterVar(lua_State *L)
i++;
lua_pop(L, 1);
}
cvpv[i].value = 0;
cvpv[i].strvalue = NULL;
cvar->PossibleValue = cvpv;
}
else
} else
FIELDERROR("PossibleValue", va("%s or CV_PossibleValue_t expected, got %s", lua_typename(L, LUA_TTABLE), luaL_typename(L, -1)))
}
else if (i == 5 || (k && fasticmp(k, "func")))
{
} else if (i == 5 || (k && fasticmp(k, "func"))) {
if (!lua_isfunction(L, 4))
TYPEERROR("func", LUA_TFUNCTION)
lua_getfield(L, LUA_REGISTRYINDEX, "CV_OnChange");
I_Assert(lua_istable(L, 5));
lua_pushlightuserdata(L, cvar);
@@ -462,13 +438,9 @@ static int lib_cvRegisterVar(lua_State *L)
lua_rawset(L, 5);
lua_pop(L, 1);
cvar->func = Lua_OnChange;
if (i == 5 && !(cvar->flags & CV_CALL))
{
category = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
}
}
else if ((cvar->flags & CV_CALL && i == 6)
else if (((i == 5 && !(cvar->flags & CV_CALL))
|| (cvar->flags & CV_CALL && i == 6))
|| (k && fasticmp(k, "category")))
{
category = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
@@ -479,7 +451,6 @@ static int lib_cvRegisterVar(lua_State *L)
{
menu_name = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
}
lua_pop(L, 1);
}
#undef FIELDERROR
+17 -7
View File
@@ -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,7 +296,8 @@ struct Hook_State {
INT32 status;/* return status to calling function */
void * userdata;
int hook_type;
mobjtype_t mobj_type;/* <NUMMOBJTYPES if mobj hook */
mobjtype_t mobj_type;/* >0 if mobj hook */
boolean force_mobj;// allows mobj_type equal 0
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 */
@@ -363,8 +364,10 @@ 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, NUMMOBJTYPES, NULL,
hook_type, 0, NULL,
hookIds[hook_type].numHooks);
}
@@ -378,6 +381,8 @@ 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));
@@ -390,8 +395,10 @@ 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, NUMMOBJTYPES, string,
hook_type, 0, string,
stringHooks[hook_type].ref))
{
lua_pushstring(gL, string);
@@ -407,7 +414,7 @@ FUNCINLINE static ATTRINLINE boolean prepare_hud_hook
int hook_type
){
return init_hook_type(hook, 0,
hook_type, NUMMOBJTYPES, NULL,
hook_type, 0, NULL,
hudHookIds[hook_type].numHooks);
}
@@ -547,11 +554,14 @@ static int call_hooks
{
calls += call_string_hooks(hook);
}
else if (hook->mobj_type < NUMMOBJTYPES)
else if (hook->force_mobj)
{
/* call generic mobj hooks first */
calls += call_mobj_type_hooks(hook, MT_NULL);
calls += call_mobj_type_hooks(hook, hook->mobj_type);
if (hook->mobj_type < NUMMOBJTYPES)
calls += call_mobj_type_hooks(hook, hook->mobj_type);
ps_lua_mobjhooks.value.i += calls;
}
else
+29 -28
View File
@@ -650,34 +650,34 @@ void LUA_HUD_DrawList(huddrawlist_h list)
case DI_DrawString:
switch(item->align)
{
// hu_font
case align_left:
V_DrawString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
case align_center:
V_DrawCenteredString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
case align_right:
V_DrawRightAlignedString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
case align_fixed:
V_DrawStringAtFixed(LERPS(x), LERPS(y), item->flags, itemstr);
break;
// hu_font, 0.5x scale
case align_small:
V_DrawSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
case align_smallright:
V_DrawRightAlignedSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
// tny_font
case align_thin:
V_DrawThinString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
case align_thinright:
V_DrawRightAlignedThinString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
}
// hu_font
case align_left:
V_DrawString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
case align_center:
V_DrawCenteredString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
case align_right:
V_DrawRightAlignedString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
case align_fixed:
V_DrawStringAtFixed(LERPS(x), LERPS(y), item->flags, itemstr);
break;
// hu_font, 0.5x scale
case align_small:
V_DrawSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
case align_smallright:
V_DrawRightAlignedSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
// tny_font
case align_thin:
V_DrawThinString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
case align_thinright:
V_DrawRightAlignedThinString(LERPS(x), LERPS(y), item->flags, itemstr);
break;
}
break;
case DI_DrawKartString:
V_DrawKartString(LERPS(x), LERPS(y), item->flags, itemstr);
@@ -690,6 +690,7 @@ void LUA_HUD_DrawList(huddrawlist_h list)
break;
default:
I_Error("can't draw draw list item: invalid draw list item type");
continue;
}
}
}
+10 -5
View File
@@ -1506,6 +1506,7 @@ enum mapheaderinfo_e
mapheaderinfo_saveoverride,
mapheaderinfo_levelflags,
mapheaderinfo_menuflags,
//mapheaderinfo_automap,
mapheaderinfo_mobj_scale,
};
@@ -1541,6 +1542,7 @@ static const char *const mapheaderinfo_opt[] = {
"saveoverride",
"levelflags",
"menuflags",
//"automap",
"mobj_scale",
NULL,
};
@@ -1582,11 +1584,10 @@ static int mapheaderinfo_get(lua_State *L)
lua_pushinteger(L, header->muspos);
break;
case mapheaderinfo_musinterfadeout:
lua_pushinteger(L, 0); // unused
lua_pushinteger(L, header->musinterfadeout);
break;
case mapheaderinfo_musintername:
// uhh psure its fine to just push nil instead of empty string?
lua_pushstring(L, NULL);
lua_pushstring(L, header->musintername);
break;
case mapheaderinfo_forcecharacter:
lua_pushstring(L, header->forcecharacter);
@@ -1640,10 +1641,10 @@ static int mapheaderinfo_get(lua_State *L)
lua_pushinteger(L, header->levelselect);
break;
case mapheaderinfo_bonustype:
lua_pushinteger(L, 0); // unused
lua_pushinteger(L, header->bonustype);
break;
case mapheaderinfo_saveoverride:
lua_pushinteger(L, SAVE_DEFAULT); // unused
lua_pushinteger(L, header->saveoverride);
break;
case mapheaderinfo_levelflags:
lua_pushinteger(L, header->levelflags);
@@ -1651,9 +1652,13 @@ 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
-8
View File
@@ -13,10 +13,6 @@
#define LZF_H
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
/***********************************************************************
**
** lzf -- an extremely fast/free compression/decompression-method
@@ -75,9 +71,5 @@ 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
+22 -3
View File
@@ -479,13 +479,32 @@ UINT8 M_CheckLevelEmblems(void)
// Update Score, Time, Rings emblems
for (i = 0; i < numemblems; ++i)
{
// Requires time on map <= x
if (emblemlocations[i].type != ET_TIME || emblemlocations[i].collected)
if (emblemlocations[i].type <= ET_SKIN || emblemlocations[i].collected)
continue;
levelnum = emblemlocations[i].level;
valToReach = emblemlocations[i].var;
res = (G_GetBestTime(levelnum) <= (unsigned)valToReach);
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;
}
emblemlocations[i].collected = res;
if (res)
+10
View File
@@ -27,11 +27,21 @@ 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
View File
@@ -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 = emotes.size()/EMOTES_PER_PAGE + (emotes.size() % EMOTES_PER_PAGE != 0 ? 1 : 0);
const int NUMPAGES = std::max<int>(emotes.size()/EMOTES_PER_PAGE, 1);
int page = 1;
if (COM_Argc() > 1)
+74 -82
View File
@@ -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
@@ -308,6 +308,7 @@ static void M_SetupMultiHandler(INT32 choice);
// Options
// Split into multiple parts due to size
static void M_VideoModeMenu(INT32 choice);
static void M_Setup1PControlsMenu(void);
static void M_Setup2PControlsMenu(void);
static void M_Setup3PControlsMenu(void);
@@ -1023,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;
@@ -1304,21 +1305,12 @@ 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
@@ -1369,8 +1361,7 @@ boolean M_Responder(event_t *ev)
G_AdjustView(4, 1, true);
break;
default:
break;
default: break;
}
}
@@ -1495,7 +1486,6 @@ boolean M_Responder(event_t *ev)
}
return false;
break;
default:
CON_Responder(ev);
@@ -2074,6 +2064,7 @@ 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;
}
@@ -4025,16 +4016,16 @@ boolean replaynamesloaded = false;
#ifdef HAVE_THREADS
I_mutex replayquerymutex;
// I_In_Exiting_Signal_Handler is an evil hack
// g_in_exiting_signal_handler is an evil hack
// 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_lock_mutex(&replayquerymutex); }
# define Unlock_search_state() if (!I_In_Exiting_Signal_Handler()) { I_unlock_mutex(replayquerymutex); }
#else /*HAVE_THREADS*/
# define Lock_search_state() if (!g_in_exiting_signal_handler) { I_lock_mutex(&replayquerymutex); }
# define Unlock_search_state() if (!g_in_exiting_signal_handler) { I_unlock_mutex(replayquerymutex); }
#else/*HAVE_THREADS*/
# define Lock_search_state()
# define Unlock_search_state()
#endif /*HAVE_THREADS*/
#endif/*HAVE_THREADS*/
#define MAXREPLAYQUERY 37
@@ -4122,9 +4113,6 @@ 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;
@@ -4157,9 +4145,7 @@ static void M_HutCheckReplays(size_t maxnum)
case MD_NOTLOADED:
case MD_OUTDATED:
case MD_LOADED:
StripColors(demo_title, demolist_all[replayquerycheck].title, sizeof(demo_title));
if (demolist_all[replayquerycheck].title[0] && strcasestr(demo_title, replayqueryinput.buffer) != NULL)
if (demolist_all[replayquerycheck].title[0] && strcasestr(demolist_all[replayquerycheck].title, replayqueryinput.buffer) != NULL)
AddCheckedReplay(); // It matches, add it!
else
replayquerycheck++; // Doesn't match, moving on...
@@ -4919,7 +4905,6 @@ 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);
}
@@ -5417,7 +5402,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
}
if (cvar->flags & CV_NETVAR)
OP_CustomCvarMenu[ccvarposition] = (menuitem_t){ IT_STRING | IT_CVAR, NULL, Z_StrDup(va("\x85 %s", name)), cvar, ccvaralphakey };
OP_CustomCvarMenu[ccvarposition] = (menuitem_t){ IT_STRING | IT_CVAR , NULL, Z_StrDup(va("\x85 %s", name)), cvar, ccvaralphakey };
else
OP_CustomCvarMenu[ccvarposition] = (menuitem_t){ IT_STRING | IT_CVAR, NULL, Z_StrDup(name), cvar, ccvaralphakey };
@@ -6481,7 +6466,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)
{
@@ -6511,7 +6496,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;
@@ -7955,7 +7940,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;
@@ -9747,11 +9732,14 @@ static void M_ResetControls(INT32 choice)
// ===============
//added : 30-01-98:
#define MAXCOLUMNMODES 12 //max modes displayed in one column
#define MAXMODEDESCS (MAXCOLUMNMODES*3)
static modedesc_t modedescs[MAXMODEDESCS];
void M_VideoModeMenu(INT32 choice)
static void M_VideoModeMenu(INT32 choice)
{
INT32 i, nummodes, width, height;
INT32 i, j, vdup, nummodes, width, height;
const char *desc;
(void)choice;
@@ -9765,30 +9753,54 @@ void M_VideoModeMenu(INT32 choice)
nummodes = VID_NumModes();
// DOS does not skip mode 0, because mode 0 is ALWAYS present
for (i = 0; i < nummodes && vidm_nummodes < MAXMODEDESCS; i++)
i = 0;
for (; i < nummodes && vidm_nummodes < MAXMODEDESCS; i++)
{
desc = VID_GetModeName(i);
if (desc)
{
vdup = 0;
if (!desc)
continue;
// when a resolution exists both under VGA and VESA, keep the
// VESA mode, which is always a higher modenum
for (j = 0; j < vidm_nummodes; j++)
{
if (fastcmp(modedescs[j].desc, desc))
{
// mode(0): 320x200 is always standard VGA, not vesa
if (modedescs[j].modenum)
{
modedescs[j].modenum = i;
vdup = 1;
modedescs[vidm_nummodes].modenum = i;
modedescs[vidm_nummodes].desc = desc;
if (i == vid.modenum)
vidm_selected = j;
}
else
vdup = 1;
if (i == vid.modenum)
vidm_selected = vidm_nummodes;
break;
}
}
// Pull out the width and height
sscanf(desc, "%u%*c%u", &width, &height);
if (!vdup)
{
modedescs[vidm_nummodes].modenum = i;
modedescs[vidm_nummodes].desc = desc;
// Show resolutions above desktop res as red.
if (I_CheckAboveDesktopRes(width, height))
modedescs[vidm_nummodes].goodratio = 2;
// Show multiples of 320x200 as green.
else if (SCR_IsAspectCorrect(width, height))
modedescs[vidm_nummodes].goodratio = 1;
if (i == vid.modenum)
vidm_selected = vidm_nummodes;
vidm_nummodes++;
// Pull out the width and height
sscanf(desc, "%u%*c%u", &width, &height);
// Show multiples of 320x200 as green.
if (SCR_IsAspectCorrect(width, height))
modedescs[vidm_nummodes].goodratio = 1;
vidm_nummodes++;
}
}
}
vidm_column_size = (vidm_nummodes+2) / 3;
@@ -10005,11 +10017,7 @@ static void M_DrawVideoMode(void)
V_DrawString(row, col, highlightflags|MENUCAPS, modedescs[i].desc);
// Show multiples of 320x200 as green.
else
{
const UINT8 goodratio = modedescs[i].goodratio;
const INT32 goodflag = ((goodratio == 2) ? warningflags : (goodratio == 1) ? recommendedflags : 0);
V_DrawString(row, col, goodflag|MENUCAPS, modedescs[i].desc);
}
V_DrawString(row, col, ((modedescs[i].goodratio) ? recommendedflags : 0)|MENUCAPS, modedescs[i].desc);
col += 8;
if ((i % vidm_column_size) == (vidm_column_size-1))
@@ -10033,6 +10041,7 @@ 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
{
@@ -10048,26 +10057,9 @@ static void M_DrawVideoMode(void)
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 138,
recommendedflags|MENUCAPS, "Marked modes are recommended.");
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 146,
warningflags|MENUCAPS, "Marked modes are above Desktop resolution");
if (rendermode == render_opengl)
{
#ifdef USE_FBO_OGL
if (!cv_glframebuffer.value)
#endif
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 154,
warningflags|MENUCAPS, "and will have visual errors in OpenGL mode.");
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 166,
highlightflags|MENUCAPS, "Other modes may have visual errors.");
}
else
{
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 154,
highlightflags|MENUCAPS, "Other modes may have visual errors.");
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 166,
highlightflags|MENUCAPS, "Larger modes may have performance issues.");
}
highlightflags|MENUCAPS, "Other modes may have visual errors.");
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 158,
highlightflags|MENUCAPS, "Larger modes may have performance issues.");
}
// Draw the cursor for the VidMode menu
-5
View File
@@ -223,11 +223,6 @@ extern menu_t *currentMenu;
extern menu_t MainDef;
extern menu_t SP_LoadDef;
#define MAXCOLUMNMODES 12 //max modes displayed in one column
#define MAXMODEDESCS (MAXCOLUMNMODES*3)
extern menu_t OP_VideoModeDef;
void M_VideoModeMenu(INT32 choice);
// Call upon joystick hotplug
void M_SetupJoystickMenu(INT32 choice);
extern menu_t OP_JoystickSetDef;
+45 -46
View File
@@ -1023,6 +1023,8 @@ 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},
@@ -1043,6 +1045,7 @@ 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.",
@@ -1061,6 +1064,7 @@ enum
op_gl_falbckmdls,
op_gl_shader,
op_gl_palrender,
op_gl_flashpal,
op_gl_scrdepth,
op_gl_filter,
op_gl_anis,
@@ -1694,30 +1698,29 @@ static menuitem_t OP_SaturnMenu[] =
{IT_STRING | IT_CVAR, NULL, "Minimum Input Delay", &cv_mindelay, 20},
{IT_STRING | IT_CVAR, NULL, "Gentlemens Ping", &cv_gentlemens, 25},
{IT_STRING | IT_CVAR, NULL, "Server Info Screen", &cv_serverinfoscreen, 30},
{IT_STRING | IT_CVAR, NULL, "Server Addons Info", &cv_serveraddoninfo, 35},
{IT_STRING | IT_CVAR, NULL, "Skin Select Spinning Speed", &cv_skinselectspin, 45},
{IT_STRING | IT_CVAR, NULL, "Skin Select Spinning Speed", &cv_skinselectspin, 40},
{IT_STRING | IT_CVAR, NULL, "Colorized Speedlines", &cv_coloredspeedlines, 55},
{IT_STRING | IT_CVAR, NULL, "Colorized Sneakertrails", &cv_coloredsneakertrail, 60},
{IT_STRING | IT_CVAR, NULL, "Colorized Speedlines", &cv_coloredspeedlines, 50},
{IT_STRING | IT_CVAR, NULL, "Colorized Sneakertrails", &cv_coloredsneakertrail, 55},
{IT_STRING | IT_CVAR, NULL, "Player Blendeffects", &cv_playerblendeffects, 70},
{IT_STRING | IT_CVAR, NULL, "Player Blendeffects", &cv_playerblendeffects, 65},
{IT_STRING | IT_CVAR, NULL, "Bananadrag Jitter", &cv_bananajitter, 80},
{IT_STRING | IT_CVAR, NULL, "Bananadrag Jitter", &cv_bananajitter, 75},
{IT_STRING | IT_CVAR, NULL, "Midair Driftsparks", &cv_airsparks, 90},
{IT_STRING | IT_CVAR, NULL, "Midair Driftsparks", &cv_airsparks, 85},
{IT_STRING | IT_CVAR, NULL, "Show Localskin Menus", &cv_showlocalskinmenus, 100},
{IT_STRING | IT_CVAR, NULL, "Show Localskin Menus", &cv_showlocalskinmenus, 95},
{IT_STRING | IT_CVAR, NULL, "Uppercase Menu", &cv_menucaps, 110},
{IT_STRING | IT_CVAR, NULL, "Uppercase Menu", &cv_menucaps, 105},
{IT_STRING | IT_CVAR, NULL, "Keyboard Layout", &cv_keyboardlayout, 120},
{IT_STRING | IT_CVAR, NULL, "Keyboard Layout", &cv_keyboardlayout, 115},
{IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 130},
{IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 125},
{IT_SUBMENU|IT_STRING, NULL, "Saturn Hud...", &OP_SaturnHudDef, 140},
{IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 145},
{IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 150}, // uwu
{IT_SUBMENU|IT_STRING, NULL, "Saturn Hud...", &OP_SaturnHudDef, 135},
{IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 140},
{IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 145}, // uwu
};
static const char* OP_SaturnTooltips[] =
@@ -1727,7 +1730,6 @@ static const char* OP_SaturnTooltips[] =
"Practice for online play! 0 = instant response.",
"Simulate online input delay when hosting a server.\nValue choosen by Player with the lowest ping",
"Show a screen before joining a server displaying important information about it",
"Show amount and types of addons that are loaded by server when joining",
"How much speen do you want?",
"Colourize the speedlines in your skincolor if you go fast enough!",
"Colourize the sneaker flame trails in your skincolor!",
@@ -1830,49 +1832,47 @@ static menuitem_t OP_SaturnHudMenu[] =
{
{IT_HEADER, NULL, "Saturn Hud Options", NULL, 0},
{IT_STRING|IT_CVAR, NULL, "Speedometer Style", &cv_newspeedometer, 10},
{IT_STRING|IT_CVAR, NULL, "Battle Speedometer", &cv_battlespeedo, 15},
{IT_STRING|IT_CVAR, NULL, "Speedometer Style", &cv_newspeedometer, 10},
{IT_STRING|IT_CVAR, NULL, "Battle Speedometer", &cv_battlespeedo, 15},
{IT_STRING|IT_CVAR, NULL, "Colourized HUD", &cv_colorizedhud, 25},
{IT_STRING|IT_CVAR, NULL, "Colourized Itembox", &cv_colorizeditembox, 30},
{IT_STRING|IT_CVAR, NULL, "Colourized HUD Color", &cv_colorizedhudcolor, 35},
{IT_STRING|IT_CVAR, NULL, "Colourized HUD", &cv_colorizedhud, 25},
{IT_STRING|IT_CVAR, NULL, "Colourized Itembox", &cv_colorizeditembox, 30},
{IT_STRING|IT_CVAR, NULL, "Colourized HUD Color", &cv_colorizedhudcolor, 35},
{IT_STRING|IT_CVAR, NULL, "Input Display", &cv_showinput, 45},
{IT_STRING|IT_CVAR, NULL, "Input Display", &cv_showinput, 45},
{IT_STRING|IT_CVAR, NULL, "Stat Display", &cv_showstats, 55},
{IT_STRING|IT_CVAR, NULL, "Skin Name in Stat Display", &cv_showstats_skinname, 60},
{IT_STRING|IT_CVAR, NULL, "Stat Display", &cv_showstats, 55},
{IT_STRING|IT_CVAR, NULL, "Higher Resolution Portraits", &cv_highresportrait, 70},
{IT_STRING|IT_CVAR, NULL, "Higher Resolution Portraits", &cv_highresportrait, 65},
{IT_STRING|IT_CVAR, NULL, "Small Positionnumber", &cv_smallposnum, 80},
{IT_STRING|IT_CVAR, NULL, "Positionnumber Animation", &cv_posanim, 85},
{IT_STRING|IT_CVAR, NULL, "Small Positionnumber", &cv_smallposnum, 75},
{IT_STRING|IT_CVAR, NULL, "Positionnumber Animation", &cv_posanim, 80},
{IT_STRING|IT_CVAR, NULL, "Flash Lap Times", &cv_showlaptimes, 95},
{IT_STRING|IT_CVAR, NULL, "Flash Lap Times", &cv_showlaptimes, 90},
{IT_STRING|IT_CVAR, NULL, "Multi-Item icons", &cv_multiitemicon, 105},
{IT_STRING|IT_CVAR, NULL, "Item Amount Number", &cv_huditemamount, 110},
{IT_STRING|IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 115},
{IT_STRING|IT_CVAR, NULL, "Multi-Item icons", &cv_multiitemicon, 100},
{IT_STRING|IT_CVAR, NULL, "Item Amount Number", &cv_huditemamount, 105},
{IT_STRING|IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 110},
{IT_STRING|IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 125},
{IT_STRING|IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 130},
{IT_STRING|IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 120},
{IT_STRING|IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 125},
{IT_STRING|IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 140},
{IT_STRING|IT_CVAR, NULL, "Show Finished on Minimap", &cv_showminimapfinished, 145},
{IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 150},
{IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 155},
{IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 160},
{IT_STRING|IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 135},
{IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 140},
{IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 145},
{IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 150},
{IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 170},
{IT_STRING|IT_CVAR, NULL, "Music Credits on Pause", &cv_pausesongcredits, 175},
{IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 160},
{IT_STRING|IT_CVAR, NULL, "Music Credits on Pause", &cv_pausesongcredits, 165},
{IT_STRING|IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 185},
{IT_STRING|IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 175},
{IT_STRING|IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 195},
{IT_STRING|IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 185},
{IT_STRING|IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 205},
{IT_STRING|IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 210},
{IT_STRING|IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 195},
{IT_STRING|IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 200},
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 220},
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 210},
};
static const char* OP_SaturnHudTooltips[] =
@@ -1885,7 +1885,6 @@ static const char* OP_SaturnHudTooltips[] =
"The color to use instead of the player color when\ncolourized hud is enabled.",
"Displays the input display and lets you choose its style.",
"Enable the stat display.",
"Show skin name in the stat display.",
"Enable the use of the higher resolution want icons instead of rank\nfor some places.",
"Make the Postionnumber half the size.",
"Disable the animation of the Positionnumber\nwhen overtaking someone.",
@@ -1896,7 +1895,6 @@ static const char* OP_SaturnHudTooltips[] =
"Show the big 'LAP' text on a lap change.",
"Show the big Cecho Messages.",
"Show player names on the minimap.",
"Show players that have finished already on the minimap.",
"Minimize the player icons on the minimap.",
"Erratically rotate player icons during spinouts.",
"Visualize the player facing angle.",
@@ -2776,5 +2774,6 @@ 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
+10 -39
View File
@@ -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,15 +804,9 @@ 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;
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_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);
png_set_text(png_ptr, png_info_ptr, png_infotext, SRB2PNGTXT);
#undef SRB2PNGTXT
@@ -1460,9 +1454,9 @@ INT32 axtoi(const char *hexStg)
void CopyCaretColors(char *p, const char *s, int n)
{
gconst char *t;
int m;
int c;
char *t;
int m;
int c;
if (!n)
return;
@@ -1570,7 +1564,6 @@ char *M_GetToken(const char *inputString)
{
startPos = endPos;
}
if (stringToUse == NULL)
return NULL;
@@ -1641,8 +1634,7 @@ 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;
}
@@ -1652,7 +1644,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;
@@ -1863,10 +1855,8 @@ 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;
@@ -1879,7 +1869,6 @@ int M_PathParts(const char *path)
break;
}
}
return n;
}
@@ -1922,9 +1911,7 @@ 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)
@@ -1969,22 +1956,6 @@ 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;
-1
View File
@@ -123,7 +123,6 @@ 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);
+6 -6
View File
@@ -256,7 +256,7 @@ static boolean M_TextInputHandleBase(textinput_t *input, INT32 key, boolean emot
return true;
}
if (ctrldown && (cv_keyboardlayout.value!=3 || !altdown))
if ((cv_keyboardlayout.value != 3 && ctrldown) || (cv_keyboardlayout.value == 3 && ctrldown && !altdown))
{
if (key == 'x' || key == 'X')
{
@@ -381,10 +381,10 @@ static boolean M_TextInputHandleBase(textinput_t *input, INT32 key, boolean emot
// allow people to use keypad in console (good for typing IP addresses) - Calum
if (key >= KEY_KEYPAD7 && key <= KEY_KPADDEL)
{
const char keypad_translation[] = {'7','8','9','-',
'4','5','6','+',
'1','2','3',
'0', '.'};
char keypad_translation[] = {'7','8','9','-',
'4','5','6','+',
'1','2','3',
'0','.'};
key = keypad_translation[key - KEY_KEYPAD7];
}
@@ -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 = CON_ShiftChar(key);
key = cv_keyboardlayout.value == 3 ? CON_ShitAndAltGrChar(key) : CON_ShiftChar(key);
// enter a char into the command prompt
if (key < 32 || key > 127)
-8
View File
@@ -16,10 +16,6 @@
#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)
@@ -56,8 +52,4 @@ 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 */
-6
View File
@@ -262,7 +262,6 @@ Finish_registration (void)
{
CONS_Printf("\n");
CONS_Alert(CONS_NOTICE, "%s\n", rules);
free(rules);
}
if (registered)
@@ -599,14 +598,9 @@ Update_parameters (void)
delayed = MSInProgress;
if (delayed)/* do another update after the current one */
{
registered = 0;
MSUpdateAgain = true;
}
else
{
registered = MSRegistered;
}
}
Unlock_state();
+4 -9
View File
@@ -3650,7 +3650,7 @@ static inline boolean PIT_GrenadeRing(mobj_t *thing)
return true;
if (thing->player && (thing->player->kartstuff[k_hyudorotimer]
|| (G_BattleGametype() && thing->player->kartstuff[k_bumper] <= 0 && thing->player->kartstuff[k_comebacktimer])))
|| (G_BattleGametype() && thing->player && thing->player->kartstuff[k_bumper] <= 0 && thing->player->kartstuff[k_comebacktimer])))
return true;
if ((gametype == GT_CTF || gametype == GT_TEAMMATCH)
@@ -5301,7 +5301,7 @@ void A_MixUp(void *thing)
if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE
&& !players[i].exiting && !players[i].powers[pw_super])
{
if (netgame && players[i].spectator) // Ignore spectators
if ((netgame || multiplayer) && players[i].spectator) // Ignore spectators
continue;
numplayers++;
@@ -5344,11 +5344,6 @@ void A_MixUp(void *thing)
}
}
// idk if we ever really end up here
// but bad things would happen if we do without this
if (one == -1)
return;
//get this done first!
tempthing = players[one].mo->tracer;
P_SetTarget(&players[one].mo->tracer, players[two].mo->tracer);
@@ -7923,7 +7918,7 @@ void A_ItemPop(void *thing)
if (!(actor->target && actor->target->player))
{
if (cv_debug)
if (cv_debug && !(actor->target && actor->target->player))
CONS_Printf("ERROR: Powerup has no target!\n");
return;
}
@@ -8785,7 +8780,7 @@ void A_ReaperThinker(void *thing)
actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y);
// The player we should target if it's near us:
for (i = 0; i < MAXPLAYERS; i++)
for (i = 0; i<MAXPLAYERS; i++)
{
if (!playeringame[i])
+23 -3
View File
@@ -831,7 +831,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
{
S_StartSound(toucher, special->info->seesound);
if (UNLIKELY(player->pflags & PF_NIGHTSMODE))
if (player->pflags & PF_NIGHTSMODE)
{
player->bumpertime = TICRATE/2;
if (special->threshold > 0)
@@ -1131,7 +1131,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
S_StartSound(toucher, special->info->painsound);
return;
}
else if (UNLIKELY((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING)) || (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING))
else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING)) || (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING))
|| player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object?
{
// Shatter the shield!
@@ -1219,6 +1219,24 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
case MT_EXTRALARGEBUBBLE:
return; // SRB2kart - don't need bubbles mucking with the player
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL)
return;
if (UNLIKELY(maptol & TOL_NIGHTS))
return;
if (UNLIKELY(mariomode))
return;
else if (toucher->eflags & MFE_VERTICALFLIP)
{
if (special->z+special->height < toucher->z + toucher->height / 3
|| special->z+special->height > toucher->z + (toucher->height*2/3))
return; // Only go in the mouth
}
else if (special->z < toucher->z + toucher->height / 3
|| special->z > toucher->z + (toucher->height*2/3))
return; // Only go in the mouth
toucher->momx = toucher->momy = toucher->momz = 0;
break;
case MT_WATERDROP:
if (special->state == &states[special->info->spawnstate])
@@ -1860,8 +1878,10 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
P_InstaThrust(target,target->angle,FixedMul(2*FRACUNIT, target->scale));
target->momz = FixedMul(7*FRACUNIT, target->scale);
if (flip)
{
target->momz = -target->momz;
if (flip)
{
target = P_SpawnMobj(x,y,z-FixedMul(12*FRACUNIT, target->scale),MT_SPIKE);
target->eflags |= MFE_VERTICALFLIP;
}
+7
View File
@@ -30,6 +30,8 @@ extern "C" {
#define FLOATSPEED (FRACUNIT*4)
//#define VIEWHEIGHTS "41"
// Maximum player score.
#define MAXSCORE 999999990
@@ -212,6 +214,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj);
void P_GivePlayerRings(player_t *player, INT32 num_rings);
void P_GivePlayerLives(player_t *player, INT32 numlives);
UINT8 P_GetNextEmerald(void);
void P_GiveEmerald(boolean spawnObj);
void P_ResetScore(player_t *player);
boolean P_AutoPause(void);
@@ -236,10 +239,14 @@ void P_InstaThrustEvenIn2D(mobj_t *mo, angle_t angle, fixed_t move);
boolean P_LookForEnemies(player_t *player);
void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius);
void P_HomingAttack(mobj_t *source, mobj_t *enemy); /// \todo doesn't belong in p_user
//boolean P_SuperReady(player_t *player);
boolean P_AnalogMove(player_t *player);
/*boolean P_TransferToNextMare(player_t *player);
UINT8 P_FindLowestMare(void);*/
UINT8 P_FindLowestLap(void);
UINT8 P_FindHighestLap(void);
void P_FindEmerald(void);
//void P_TransferToAxis(player_t *player, INT32 axisnum);
boolean P_PlayerMoving(INT32 pnum);
void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range);
+71 -23
View File
@@ -122,6 +122,27 @@ 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
//
@@ -898,7 +919,12 @@ static void P_PlayerFlip(mobj_t *mo)
G_GhostAddFlip((INT32) (mo->player - players));
// Flip aiming to match!
if (mo->player->pflags & PF_FLIPCAM)
if (UNLIKELY(mo->player->pflags & PF_NIGHTSMODE)) // NiGHTS doesn't use flipcam
{
if (mo->tracer)
mo->tracer->eflags ^= MFE_VERTICALFLIP;
}
else if (mo->player->pflags & PF_FLIPCAM)
{
UINT8 i;
@@ -920,11 +946,6 @@ static void P_PlayerFlip(mobj_t *mo)
camera[i].z += FixedMul(20*FRACUNIT, mo->scale);
}
}
else if (UNLIKELY(mo->player->pflags & PF_NIGHTSMODE)) // NiGHTS doesn't use flipcam
{
if (mo->tracer)
mo->tracer->eflags ^= MFE_VERTICALFLIP;
}
}
//
@@ -1649,14 +1670,6 @@ 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
@@ -1670,6 +1683,14 @@ 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
@@ -3189,6 +3210,30 @@ 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)
{
@@ -3207,7 +3252,7 @@ void P_CalcChasePostImg(player_t *player, camera_t *thiscam)
player_flipcam = cv_flipcam[pnum].value;
}
const boolean flipcam = (player_flipcam && player->mo->eflags & MFE_VERTICALFLIP && LIKELY(!(player->pflags & PF_NIGHTSMODE)));
const boolean flipcam = (player_flipcam && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP);
UINT8 postimgtype = 0;
if (encoremode)
@@ -5620,15 +5665,13 @@ void P_SetScale(mobj_t *mobj, fixed_t newscale)
void P_Attract(mobj_t *source, mobj_t *dest, boolean nightsgrab) // Home in on your target
{
fixed_t dist, ndist, speedmul;
fixed_t tx, ty, tz;
fixed_t tx = dest->x;
fixed_t ty = dest->y;
fixed_t tz = dest->z + (dest->height/2); // Aim for center
if (!dest || dest->health <= 0 || !dest->player || !source->tracer)
return;
tx = dest->x;
ty = dest->y;
tz = dest->z + (dest->height/2); // Aim for center
// change slope
dist = P_AproxDistance(P_AproxDistance(tx - source->x, ty - source->y), tz - source->z);
@@ -8510,7 +8553,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
if (mobj->tracer && mobj->tracer->player)
{
if (LIKELY(!(mobj->tracer->player->pflags & PF_NIGHTSMODE)))
if (!(mobj->tracer->player->pflags & PF_NIGHTSMODE))
{
mobj->flags &= ~MF_NOGRAVITY;
mobj->flags2 &= ~MF2_DONTDRAW;
@@ -8534,7 +8577,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
P_SetTarget(&mobj->target, NULL);
}
if (UNLIKELY(mobj->tracer->player->pflags & PF_NIGHTSMODE))
if (mobj->tracer->player->pflags & PF_NIGHTSMODE)
{
if (mobj->tracer->player->bonustime)
{
@@ -9178,7 +9221,10 @@ void P_MobjThinker(mobj_t *mobj)
}
// Can end up here if a player dies.
P_CycleMobjState(mobj);
if (mobj->player)
P_CyclePlayerMobjState(mobj);
else
P_CycleMobjState(mobj);
if (P_MobjWasRemoved(mobj))
return;
@@ -11072,6 +11118,8 @@ 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
+2
View File
@@ -499,6 +499,7 @@ 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);
@@ -509,6 +510,7 @@ void P_EmeraldManager(void);
#define MAXHUNTEMERALDS 64
extern mapthing_t *huntemeralds[MAXHUNTEMERALDS];
extern INT32 numhuntemeralds;
extern boolean runemeraldmanager;
extern INT32 numstarposts;
#ifdef __cplusplus
+116 -12
View File
@@ -218,6 +218,8 @@ 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;
@@ -235,10 +237,16 @@ 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;
@@ -258,11 +266,107 @@ 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)
{
@@ -310,7 +414,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
@@ -1810,7 +1914,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 (does your map have at least 2 sectors?)");
I_Error("Level has no nodes");
if (numsegs <= 0)
I_Error("Level has no segs");
@@ -1943,6 +2047,7 @@ static void P_LevelInitStuff(boolean reloadinggamestate)
// special stage tokens, emeralds, and ring total
tokenbits = 0;
runemeraldmanager = false;
nummaprings = nummapboxes = numgotboxes = 0;
// emerald hunt
@@ -1972,10 +2077,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++)
@@ -2069,14 +2174,14 @@ static INT32 P_MakeBufferMD5(const char *buffer, size_t len, void *resblock)
memset(resblock, 0x00, 16);
return 1;
#else
precise_t t = I_GetPreciseTime();
tic_t t = I_GetTime();
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_GetPreciseTime() - t)/I_GetPrecisePrecision());
CONS_Debug(DBG_SETUP, "MD5 calc took %f seconds\n", (float)(I_GetTime() - t)/NEWTICRATE);
return 0;
#endif
@@ -2098,10 +2203,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;
@@ -2586,8 +2691,7 @@ void P_FreeLevelState(void)
}
// Clear pointers that would be left dangling by the purge
// Pointers are now PU_STATIC so they won't be freed :)
//R_FlushTranslationColormapCache();
R_FlushTranslationColormapCache();
#ifdef HWRENDER
// Free GPU textures before freeing patches.
+7
View File
@@ -114,6 +114,13 @@ 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
View File
@@ -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
{
+3 -3
View File
@@ -4399,7 +4399,7 @@ static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector)
// The list of specials that activate without floor touch
// Check Section 1
switch (GETSECSPECIAL(sector->special, 1))
switch(GETSECSPECIAL(sector->special, 1))
{
//case 2: // Damage (water)
case 8: // Instant kill
@@ -4410,7 +4410,7 @@ static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector)
}
// Check Section 2
switch (GETSECSPECIAL(sector->special, 2))
switch(GETSECSPECIAL(sector->special, 2))
{
case 2: // Linedef executor (All players needed)
case 4: // Linedef executor
@@ -4421,7 +4421,7 @@ static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector)
}
// Check Section 4
switch (GETSECSPECIAL(sector->special, 4))
switch(GETSECSPECIAL(sector->special, 4))
{
case 2: // Level Exit / GOAL Sector / Flag Return
case 1: // Starpost activator
+48 -24
View File
@@ -220,6 +220,32 @@ UINT8 P_GetNextEmerald(void)
return (UINT8)(gamemap - sstage_start);
}
//
// P_GiveEmerald
//
// Award an emerald upon completion
// of a special stage.
//
void P_GiveEmerald(boolean spawnObj)
{
INT32 i;
UINT8 em;
S_StartSound(NULL, sfx_cgot); // Got the emerald!
em = P_GetNextEmerald();
emeralds |= (1 << em);
if (spawnObj)
{
for (i = 0; i < MAXPLAYERS; i++)
{
if (playeringame[i])
P_SetMobjState(P_SpawnMobj(players[i].mo->x, players[i].mo->y, players[i].mo->z + players[i].mo->info->height, MT_GOTEMERALD),
mobjinfo[MT_GOTEMERALD].spawnstate + em);
}
}
}
//
// P_ResetScore
//
@@ -1200,6 +1226,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
ghost->pitch = mobj->pitch;
ghost->roll = mobj->roll;
ghost->sloperoll = mobj->sloperoll;
ghost->rollangle = mobj->rollangle;
ghost->sloperoll = mobj->sloperoll;
ghost->slopepitch = mobj->slopepitch;
@@ -1965,23 +1992,20 @@ 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, kartspd);
movepushside = (cmd->sidemove * FRACUNIT/128) + FixedDiv(player->speed, K_GetKartSpeed(player, true));
else
movepushside = (cmd->sidemove * FRACUNIT/128) - FixedDiv(player->speed, kartspd);
movepushside = (cmd->sidemove * FRACUNIT/128) - FixedDiv(player->speed, K_GetKartSpeed(player, true));
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;
@@ -2017,11 +2041,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 > kartspd) //topspeed)
if (newMagnitude > K_GetKartSpeed(player, true)) //topspeed)
{
fixed_t tempmomx, tempmomy;
if (oldMagnitude > kartspd && onground) // SRB2Kart: onground check for air speed cap
if (oldMagnitude > K_GetKartSpeed(player, true) && onground) // SRB2Kart: onground check for air speed cap
{
if (newMagnitude > oldMagnitude)
{
@@ -2034,8 +2058,8 @@ static void P_3dMovement(player_t *player)
}
else
{
tempmomx = FixedMul(FixedDiv(player->mo->momx - player->cmomx, newMagnitude), kartspd); //topspeed)
tempmomy = FixedMul(FixedDiv(player->mo->momy - player->cmomy, newMagnitude), kartspd); //topspeed)
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)
player->mo->momx = tempmomx + player->cmomx;
player->mo->momy = tempmomy + player->cmomy;
}
@@ -2450,10 +2474,9 @@ 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 > kartspd-(5<<FRACBITS))
speed = kartspd-(5<<FRACBITS);
if (speed > K_GetKartSpeed(player, false)-(5<<FRACBITS))
speed = K_GetKartSpeed(player, false)-(5<<FRACBITS);
if (speed >= runnyspeed)
player->fovadd = speed-runnyspeed;
@@ -3103,16 +3126,19 @@ void P_ToggleDemoCamera(UINT8 viewnum)
return;
}
if (!cam->freecam) // toggle on
if (!cam->freecam) // toggle on
{
cam->freecam = true;
cam->button_a_held = 2;
cam->reset_aiming = true;
// get rid of some hud elements
displayplayers[0] = consoleplayer;
if (displayplayers[0] != consoleplayer)
{
displayplayers[0] = consoleplayer;
}
}
else // toggle off
else // toggle off
{
cam->freecam = false;
G_FixCamera(viewnum+1);
@@ -4026,7 +4052,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
if (timeover)
thiscam->angle = angle;
else if (!camstill && !resetcalled && !paused)
else if (!camstill && !resetcalled && !paused && timeover != 1)
thiscam->angle = R_PointToAngle2(thiscam->x, thiscam->y, viewpointx, viewpointy);
if (timeover == 1)
@@ -4083,7 +4109,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
angle -= (angle - thiscam->pitch)/2;
}
if (player->playerstate != PST_DEAD && LIKELY(!((player->pflags & PF_NIGHTSMODE) && player->exiting)))
if (player->playerstate != PST_DEAD && !((player->pflags & PF_NIGHTSMODE) && player->exiting))
angle += (focusaiming < ANGLE_180 ? focusaiming/2 : InvAngle(InvAngle(focusaiming)/2)); // overcomplicated version of '((signed)focusaiming)/2;'
if (!camstill && !timeover) // Keep the view still...
@@ -4149,12 +4175,10 @@ void P_ResetLocalCamAiming(player_t *player)
boolean P_SpectatorJoinGame(player_t *player)
{
const boolean islocalplayer = P_IsLocalPlayer(player);
// Team changing isn't allowed.
if (!cv_allowteamchange.value)
{
if (islocalplayer)
if (P_IsLocalPlayer(player))
CONS_Printf(M_GetText("Server does not allow team change.\n"));
}
// Team changing in Team Match and CTF
@@ -4202,7 +4226,7 @@ boolean P_SpectatorJoinGame(player_t *player)
P_ResetLocalCamAiming(player);
//Reset away view
if (islocalplayer && displayplayers[0] != consoleplayer)
if (P_IsLocalPlayer(player) && displayplayers[0] != consoleplayer)
displayplayers[0] = consoleplayer;
if (changeto == 1)
@@ -4229,7 +4253,7 @@ boolean P_SpectatorJoinGame(player_t *player)
P_ResetLocalCamAiming(player);
//Reset away view
if (islocalplayer && displayplayers[0] != consoleplayer)
if (P_IsLocalPlayer(player) && displayplayers[0] != consoleplayer)
displayplayers[0] = consoleplayer;
HU_AddChatText(va(M_GetText("\x82*%s entered the game."), player_names[player-players]), false);
@@ -4560,7 +4584,7 @@ void P_PlayerThink(player_t *player)
}
#ifdef SEENAMES
if (netgame && !splitscreen && player == &players[displayplayers[0]] && !(leveltime % (TICRATE/5)))
if (netgame && player == &players[displayplayers[0]] && !(leveltime % (TICRATE/5)) && !splitscreen)
{
seenplayer = NULL;
+1
View File
@@ -991,6 +991,7 @@ static void R_Subsector(size_t num)
visffloor[numffloors].height = polysec->floorheight;
visffloor[numffloors].polyobj = po;
visffloor[numffloors].slope = NULL;
// visffloor[numffloors].ffloor = rover;
po->visplane = visffloor[numffloors].plane;
numffloors++;
}
+49 -7
View File
@@ -37,6 +37,44 @@
// Not sure if this is necessary, but it was in w_wad.c, so I'm putting it here too -Shadow Hog
#include <errno.h>
//
// Texture definition.
// Each texture is composed of one or more patches,
// with patches being lumps stored in the WAD.
// The lumps are referenced by number, and patched
// into the rectangular texture space using origin
// and possibly other attributes.
//
typedef struct
{
INT16 originx, originy;
INT16 patch, stepdir, colormap;
} ATTRPACK mappatch_t;
//
// Texture definition.
// An SRB2 wall texture is a list of patches
// which are to be combined in a predefined order.
//
typedef struct
{
char name[8];
INT32 masked;
INT16 width;
INT16 height;
INT32 columndirectory; // FIXTHIS: OBSOLETE
INT16 patchcount;
mappatch_t patches[1];
} ATTRPACK maptexture_t;
// Store lists of lumps for F_START/F_END etc.
typedef struct
{
UINT16 wadfile;
UINT16 firstlump;
size_t numlumps;
} lumplist_t;
//
// Graphics.
// SRB2 graphics for walls and sprites
@@ -584,7 +622,7 @@ Rloadtextures (INT32 i, INT32 w)
// Set texture properties.
memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name));
texture->hash = FNV1a_QuickCaseHash(texture->name, 8);
texture->hash = quickncasehash(texture->name, 8);
texture->width = SHORT(patchlump.width);
texture->height = SHORT(patchlump.height);
@@ -798,7 +836,11 @@ static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
}
else
{
Z_Free(patchName);
if (patchName != NULL)
{
Z_Free(patchName);
}
patchName = (char *)Z_Malloc((texturesTokenLength+1)*sizeof(char),PU_STATIC,NULL);
memcpy(patchName,texturesToken,texturesTokenLength*sizeof(char));
patchName[texturesTokenLength] = '\0';
@@ -1024,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 = FNV1a_QuickCaseHash(newTextureName, 8);
resultTexture->hash = quickncasehash(newTextureName, 8);
resultTexture->width = newTextureWidth;
resultTexture->height = newTextureHeight;
resultTexture->type = TEXTURETYPE_COMPOSITE;
@@ -1324,7 +1366,7 @@ void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap)
colormap_p = colormap_p2 = colormaps;
colormap_p += COLORMAP_REMAPOFFSET;
for (p = 0; p < LIGHTLEVELS; p++)
for (p = 0; p < 32; p++)
{
for (i = 0; i < 256; i++)
{
@@ -1546,7 +1588,7 @@ INT32 R_CreateColormap(char *p1, char *p2, char *p3)
// Calculate the palette index for each palette index, for each light level
// (as well as the two unused colormap lines we inherited from Doom)
for (p = 0; p < LIGHTLEVELS; p++)
for (p = 0; p < 32; p++)
{
for (i = 0; i < 256; i++)
{
@@ -1580,7 +1622,7 @@ INT32 R_CreateColormap(char *p1, char *p2, char *p3)
{
lighttable_t *colormap_p2 = extra_colormaps[mapnum].colormap;
for (p = 0; p < LIGHTLEVELS; p++)
for (p = 0; p < 32; p++)
{
for (i = 0; i < 256; i++)
{
@@ -1713,7 +1755,7 @@ INT32 R_CheckTextureNumForName(const char *name)
if (name[0] == '-')
return 0;
hash = FNV1a_QuickCaseHash(name, 8);
hash = quickncasehash(name, 8);
for (i = 0; i < tidcachelen; i++)
if (tidcache[i].hash == hash && !strncasecmp(tidcache[i].name, name, 8))
+3
View File
@@ -45,6 +45,9 @@ enum
TEXTURETYPE_COMPOSITE,
};
// A maptexturedef_t describes a rectangular texture,
// which is composed of one or more mappatch_t structures
// that arrange graphic patches.
typedef struct
{
// Keep name for switch changing, etc.
+4 -8
View File
@@ -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;
}
}
@@ -419,7 +419,7 @@ static UINT8* RGetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 f
// Generate the colormap if necessary
if (!ret)
{
ret = static_cast<UINT8*>(Z_Malloc(NUM_PALETTE_ENTRIES, PU_STATIC, NULL));
ret = static_cast<UINT8*>(Z_Malloc(NUM_PALETTE_ENTRIES, (flags & GTC_CACHE) ? PU_LEVEL : PU_STATIC, NULL));
K_GenerateKartColormap(ret, skinnum, color, local); //R_GenerateTranslationColormap(ret, skinnum, color); // SRB2kart
// Cache the colormap if desired
@@ -437,7 +437,8 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags)
UINT8* R_GetLocalTranslationColormap(skin_t *skin, skin_t *localskin, skincolors_t color, UINT8 flags, boolean local)
{
return RGetTranslationColormap(K_GetMobjLocalSkinNum(skin, localskin, local), color, flags, (localskin && local));
const INT32 skinnum = localskin ? (localskin - K_GetSkinArray(local)) : (skin - skins);
return RGetTranslationColormap(skinnum, color, flags, (localskin && local));
}
patch_t* R_GetSkinFaceRank(player_t* ply)
@@ -487,10 +488,6 @@ patch_t* R_GetSkinFaceMini(player_t* ply)
\return void
*/
/* There seems to be no reason to free cached colormaps tho? Not like they can change :ChonkBunckle: */
/*
void R_FlushTranslationColormapCache(void)
{
INT32 i;
@@ -503,7 +500,6 @@ void R_FlushTranslationColormapCache(void)
if (localtranslationtablecache[i])
memset(localtranslationtablecache[i], 0, MAXTRANSLATIONS * sizeof(UINT8**));
}
*/
// ==========================================================================
// COMMON DRAWER FOR 8 AND 16 BIT COLOR MODES
+33 -33
View File
@@ -204,7 +204,7 @@ static void R_DrawColumnTemplate(drawcolumndata_t *dc)
intptr_t frac;
// Looks familiar.
const intptr_t fracstep = dc->iscale;
intptr_t heightmask = dc->sourcelength-1; // CPhipps - specify type
const intptr_t heightmask = dc->sourcelength-1; // CPhipps - specify type
constexpr INT32 npow2min = -1;
const INT32 npow2max = dc->sourcelength;
@@ -237,10 +237,10 @@ static void R_DrawColumnTemplate(drawcolumndata_t *dc)
// Determine scaling, which is the only mapping to be done.
frac = (dc->texturemid + FixedMul((dc->yl << FRACBITS) - centeryfrac, fracstep));
switch (dc->sourcelength)
switch (heightmask)
{
case 256:
case 128:
case 255:
case 127:
{
while (count--)
{
@@ -251,7 +251,7 @@ static void R_DrawColumnTemplate(drawcolumndata_t *dc)
}
}
break;
case 0:
case npow2min:
{
if (frac < 0)
// adjust in case we underread
@@ -269,22 +269,42 @@ static void R_DrawColumnTemplate(drawcolumndata_t *dc)
break;
default:
{
if (dc->sourcelength & heightmask) // not a power of 2 -- killough
if (!(dc->sourcelength & heightmask)) // power of 2 -- killough
{
heightmask = dc->texheight << FRACBITS;
while ((count -= 2) >= 0) // texture height is a power of 2 -- killough
{
*dest = R_DrawColumnPixel<Type>(dc, dest, (frac>>FRACBITS) & heightmask, source, colormap);
dest += stride;
frac += fracstep;
*dest = R_DrawColumnPixel<Type>(dc, dest, (frac>>FRACBITS) & heightmask, source, colormap);
dest += stride;
frac += fracstep;
}
if (count & 1)
{
*dest = R_DrawColumnPixel<Type>(dc, dest, (frac>>FRACBITS) & heightmask, source, colormap);
}
}
else
{
const intptr_t fixed_heightmask = dc->texheight << FRACBITS;
if (frac < 0)
{
while ((frac += heightmask) < 0)
while ((frac += fixed_heightmask) < 0)
{
;
}
}
else
{
while (frac >= heightmask)
while (frac >= fixed_heightmask)
{
frac -= heightmask;
frac -= fixed_heightmask;
}
}
@@ -304,7 +324,7 @@ static void R_DrawColumnTemplate(drawcolumndata_t *dc)
// Avoid overflow.
if (fracstep > 0x7FFFFFFF - frac)
{
frac += fracstep - heightmask;
frac += fracstep - fixed_heightmask;
}
else
#endif
@@ -312,33 +332,13 @@ static void R_DrawColumnTemplate(drawcolumndata_t *dc)
frac += fracstep;
}
while (frac >= heightmask)
while (frac >= fixed_heightmask)
{
frac -= heightmask;
frac -= fixed_heightmask;
}
}
while (--count);
}
else
{
while ((count -= 2) >= 0) // texture height is a power of 2 -- killough
{
*dest = R_DrawColumnPixel<Type>(dc, dest, ((frac>>FRACBITS) & heightmask), source, colormap);
dest += stride;
frac += fracstep;
*dest = R_DrawColumnPixel<Type>(dc, dest, ((frac>>FRACBITS) & heightmask), source, colormap);
dest += stride;
frac += fracstep;
}
if (count & 1)
{
*dest = R_DrawColumnPixel<Type>(dc, dest, ((frac>>FRACBITS) & heightmask), source, colormap);
}
}
}
break;
}
+10 -10
View File
@@ -280,22 +280,22 @@ static void Fov_OnChange(void)
static void FlipCam_OnChange(void)
{
SendWeaponPref(0);
SendWeaponPref();
}
static void FlipCam2_OnChange(void)
{
SendWeaponPref(1);
SendWeaponPref2();
}
static void FlipCam3_OnChange(void)
{
SendWeaponPref(2);
SendWeaponPref3();
}
static void FlipCam4_OnChange(void)
{
SendWeaponPref(3);
SendWeaponPref4();
}
static void Precipstuff_OnChange(void)
@@ -342,14 +342,14 @@ angle_t R_PointToAngle64(INT64 x, INT64 y)
return (y -= viewy, (x -= viewx) || y) ?
x >= 0 ?
y >= 0 ?
(x > y) ? tantoangle[SlopeDivEx(y,x)] : // octant 0
ANGLE_90-tantoangle[SlopeDivEx(x,y)] : // octant 1
x > (y = -y) ? 0-tantoangle[SlopeDivEx(y,x)] : // octant 8
ANGLE_270+tantoangle[SlopeDivEx(x,y)] : // octant 7
(x > y) ? tantoangle[SlopeDivEx(y,x)] : // octant 0
ANGLE_90-tantoangle[SlopeDivEx(x,y)] : // octant 1
x > (y = -y) ? 0-tantoangle[SlopeDivEx(y,x)] : // octant 8
ANGLE_270+tantoangle[SlopeDivEx(x,y)] : // octant 7
y >= 0 ? (x = -x) > y ? ANGLE_180-tantoangle[SlopeDivEx(y,x)] : // octant 3
ANGLE_90 + tantoangle[SlopeDivEx(x,y)] : // octant 2
ANGLE_90 + tantoangle[SlopeDivEx(x,y)] : // octant 2
(x = -x) > (y = -y) ? ANGLE_180+tantoangle[SlopeDivEx(y,x)] : // octant 4
ANGLE_270-tantoangle[SlopeDivEx(x,y)] : // octant 5
ANGLE_270-tantoangle[SlopeDivEx(x,y)] : // octant 5
0;
}
+4 -1
View File
@@ -1282,7 +1282,10 @@ void R_DrawSinglePlane(drawspandata_t* ds, visplane_t *pl, boolean allow_paralle
else
{
// Don't mess with angle on slopes! We'll handle this ourselves later
viewangle = pl->viewangle + pl->plangle;
if (viewangle != pl->viewangle + pl->plangle)
{
viewangle = pl->viewangle + pl->plangle;
}
ds->planeheight = abs(pl->height - pl->viewz);
ds->planezlight = zlight[light];
-9
View File
@@ -1222,15 +1222,6 @@ 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;
+1 -1
View File
@@ -774,7 +774,7 @@ void R_AddSkins(UINT16 wadnum, boolean local)
// So just let the function in the while loop take care of it for us.
}
//R_FlushTranslationColormapCache();
R_FlushTranslationColormapCache();
CONS_Printf(M_GetText("Added skin '%s'\n"), skin->name);
#ifdef SKINVALUES
-1
View File
@@ -92,7 +92,6 @@ INT32 R_LocalSkinAvailable(const char *name, boolean local);
// had to move those here Zzz...
INT32 K_GetSkinNum(player_t *player);
INT32 K_GetMobjSkinNum(const skin_t *skin, boolean local);
INT32 K_GetMobjLocalSkinNum(const skin_t *skin, const skin_t *localskin, boolean local);
skin_t *K_GetPlayerSkin(player_t *player);
skin_t *K_GetMobjSkin(const mobj_t *mobj);
patch_t *K_GetFacePrefix(player_t *player, INT32 skinnum);
+8 -11
View File
@@ -1662,7 +1662,7 @@ static void R_ProjectSprite(mobj_t *thing)
if (thing->frame & FF_ABSOLUTELIGHTLEVEL)
{
const UINT8 n = static_cast<UINT8>(R_ThingLightLevel(thing));
const UINT8 n = R_ThingLightLevel(thing);
// n = uint8 aka 0 - 255, so the shift will always be 0 - LIGHTLEVELS - 1
lights_array = scalelight[n >> LIGHTSEGSHIFT];
}
@@ -2960,24 +2960,21 @@ 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 || viewplayer->spectator || camera[R_GetViewNumber()].freecam || leveltime < countdownstarttime)
if (thing->player == viewplayer || viewplayer->exiting || camera[R_GetViewNumber()].freecam || leveltime < countdownstarttime)
return fadealpha;
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;
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;
if (viewplayerdist < 2)
return fadealpha; // avoid zero division
if (otherplayerdist < viewplayerdist)
if (playerdist < viewplayerdist)
{
if (otherplayerdist < viewplayerdist / 2) // stronger fade when very close
if (playerdist < viewplayerdist / 2) // stronger fade when very close
{
fadealpha = (otherplayerdist * FRACUNIT) / (viewplayerdist / 2) / 3;
fadealpha = (playerdist * FRACUNIT) / (viewplayerdist / 2) / 3;
}
else
{
fadealpha = (otherplayerdist * FRACUNIT) / viewplayerdist;
fadealpha = (playerdist * FRACUNIT) / viewplayerdist;
}
}
+1 -1
View File
@@ -50,7 +50,7 @@ extern fixed_t windowtop;
extern fixed_t windowbottom;
extern INT32 lengthcol;
FUNCINLINE static ATTRINLINE INT32 R_ThingLightLevel(const mobj_t* thing)
FUNCINLINE static ATTRINLINE INT32 R_ThingLightLevel(mobj_t* thing)
{
return (INT32)thing->lightlevel;
}
+42 -14
View File
@@ -116,7 +116,9 @@ 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;
@@ -1286,8 +1288,7 @@ static boolean ReadMusicDefFields(UINT16 wadnum, int line, char *stoken, musicde
CONS_Alert(CONS_WARNING,
"MUSICDEF: Field '%s' is missing name. (file %s, line %d)\n",
stoken, wadfiles[wadnum]->filename, line);
(void)strtok(NULL, " ");
return true;
goto skip_lump;
}
else
{
@@ -1300,11 +1301,15 @@ static boolean ReadMusicDefFields(UINT16 wadnum, int line, char *stoken, musicde
STRBUFCPY(def->name, value);
strlwr(def->name);
def->hash = FNV1a_QuickCaseHash(def->name, 6);
def->hash = quickncasehash (def->name, 6);
}
(*defp) = def;
}
skip_lump:
stoken = strtok(NULL, " ");
line++;
}
else
{
@@ -1321,8 +1326,7 @@ static boolean ReadMusicDefFields(UINT16 wadnum, int line, char *stoken, musicde
CONS_Alert(CONS_WARNING,
"MUSICDEF: Field '%s' is missing value. (file %s, line %d)\n",
stoken, wadfiles[wadnum]->filename, line);
(void)strtok(NULL, " ");
return true;
goto skip_field;
}
else
{
@@ -1374,6 +1378,10 @@ static boolean ReadMusicDefFields(UINT16 wadnum, int line, char *stoken, musicde
else
CONS_Alert(CONS_WARNING, "MUSICDEF: Invalid field '%s'. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line);
#undef ADDDEF
skip_field:
stoken = strtok(NULL, "= ");
line++;
}
}
@@ -1398,8 +1406,7 @@ void S_LoadMusicDefs(UINT16 wadnum)
for (int k = 0; k < 2; k++)
{
const char *lumpname = (k == 1 ? "MUSCINFO" : "MUSICDEF");
lumpnum = W_CheckNumForNamePwad(lumpname, wadnum, 0); //check for MUSCINFO lump on 2nd iteration
lumpnum = W_CheckNumForNamePwad((k == 1 ? "MUSCINFO" : "MUSICDEF") , wadnum, 0); //check for MUSCINFO lump on 2nd iteration
if (lumpnum == INT16_MAX)
continue;
@@ -1425,13 +1432,13 @@ void S_LoadMusicDefs(UINT16 wadnum)
nlf = 1;
else
nlf = 0;
*lf++ = '\0'; /* now we can delimit to here */
*lf++ = '\0';/* now we can delimit to here */
}
stoken = strtok(stoken, " ");
if (stoken)
{
if (!ReadMusicDefFields(wadnum, line, stoken, &def))
if (! ReadMusicDefFields(wadnum, line, stoken, &def))
break;
}
@@ -1447,10 +1454,10 @@ void S_LoadMusicDefs(UINT16 wadnum)
}
while (nlf || ncr) ;
stoken = lf; /* now the next nonempty line */
stoken = lf;/* now the next nonempty line */
}
else
break; /* EOF */
break;/* EOF */
}
free(musdeftext);
@@ -1476,7 +1483,7 @@ void S_InitMusicDefs(void)
//
musicdef_t *S_FindMusicCredit(const char *musname)
{
UINT32 hash = FNV1a_QuickCaseHash(musname, 6);
UINT32 hash = quickncasehash(musname, 6);
musicdef_t *def;
for (INT32 i = 0; i < nummusicdefs; ++i)
@@ -1841,6 +1848,8 @@ void S_StopMusic(void)
mapmusic.resume = (cv_resume.value && fasticmp(music.name, mapmusic.name)) ? I_GetSongPosition() : 0;
S_SetKeepMusResume();
if (I_SongPaused())
I_ResumeSong();
@@ -1967,6 +1976,17 @@ 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
@@ -1975,7 +1995,7 @@ void S_KeepMusic(void)
static INT16 oldmap = -1;
static boolean oldencore = false;
keepmapmusic = false;
keepmapmusic = resumekeepmusic = false;
if (!cv_keepmusic.value)
{
@@ -1989,7 +2009,9 @@ void S_KeepMusic(void)
if (oldmap == gamemap && oldencore == encoremode)
{
keepmapmusic = (S_CheckMusicException() == false);
const boolean musicchanged = S_CheckMusicException();
resumekeepmusic = (musicchanged && keepmusic.resume);
keepmapmusic = (!musicchanged || resumekeepmusic);
}
oldencore = encoremode;
@@ -2050,6 +2072,12 @@ 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;
}
+4 -5
View File
@@ -42,8 +42,8 @@ INT32 setmodeneeded = 0; // video mode change needed if > 0 (the mode number to
static CV_PossibleValue_t shittyscreen_cons_t[] = {{0, "Okay"}, {1, "Shitty"}, {2, "Extra Shitty"}, {0, NULL}};
//added : 03-02-98: default screen mode, as loaded/saved in config
consvar_t cv_scr_width = {"scr_width", "1280", CV_SAVE|CV_CALL, CV_Unsigned, VID_RefreshModeList, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE|CV_CALL, CV_Unsigned, VID_RefreshModeList, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_scr_width = {"scr_width", "1280", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_renderview = {"renderview", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_frameskip = {"frameskip", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
@@ -315,9 +315,8 @@ void SCR_CheckDefaultMode(void)
void SCR_SetDefaultMode(void)
{
// remember the default screen size
CV_StealthSetValue(&cv_scr_width, vid.width);
CV_StealthSetValue(&cv_scr_height, vid.height);
VID_RefreshModeList(); // probably not needed but justin käs
CV_SetValue(&cv_scr_width, vid.width);
CV_SetValue(&cv_scr_height, vid.height);
}
// Change fullscreen on/off according to cv_fullscreen
+15 -60
View File
@@ -304,7 +304,7 @@ static void I_StartupConsole(void)
if (!consolevent)
return;
if (isatty(STDIN_FILENO) != 1)
if (isatty(STDIN_FILENO)!=1)
{
I_OutputMsg("stdin is not a tty, tty console mode failed\n");
consolevent = false;
@@ -729,8 +729,6 @@ static void JoyReset(SDLJoyInfo_t *JoySet)
#if (SDL_VERSION_ATLEAST(2,32,4))
JoySet->id = -1;
#endif
JoySet->hasled = false;
JoySet->hasrumble = false;
}
/** \brief SDL info about joystick
@@ -951,13 +949,6 @@ static int joy_open(int playerIndex, int joyIndex)
JoyInfo[playerIndex].id = I_GetJoystickDeviceIndex(JoyInfo[playerIndex].dev);
#endif
#if (SDL_VERSION_ATLEAST(2,0,14))
JoyInfo[playerIndex].hasled = SDL_GameControllerHasLED(JoyInfo[playerIndex].dev);
#endif
#if (SDL_VERSION_ATLEAST(2,0,18))
JoyInfo[playerIndex].hasrumble = SDL_GameControllerHasRumble(JoyInfo[playerIndex].dev);
#endif
return SDL_CONTROLLER_AXIS_MAX;
}
@@ -1005,8 +996,6 @@ void I_InitJoystick(UINT8 index)
#if (SDL_VERSION_ATLEAST(2,32,4))
JoyInfo[index].id = -1;
#endif
JoyInfo[index].hasled = false;
JoyInfo[index].hasrumble = false;
if (cv_usejoystick[index].value)
newcontroller = SDL_GameControllerOpen(cv_usejoystick[index].value-1);
@@ -1141,26 +1130,6 @@ const char *I_GetJoyName(INT32 joyindex)
return joyname;
}
boolean I_GamepadHasLED(INT32 playernum)
{
#if !(SDL_VERSION_ATLEAST(2,0,14))
(void)playernum;
return false;
#else
return (JoyInfo[playernum].dev != NULL && JoyInfo[playernum].hasled);
#endif
}
boolean I_GamepadHasRumble(INT32 playernum)
{
#if !(SDL_VERSION_ATLEAST(2,0,18))
(void)playernum;
return false;
#else
return (JoyInfo[playernum].dev != NULL && JoyInfo[playernum].hasrumble);
#endif
}
void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration)
{
#if !(SDL_VERSION_ATLEAST(2,0,14))
@@ -1176,11 +1145,6 @@ void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength,
return;
}
if (!I_GamepadHasRumble(playernum))
{
return;
}
SDL_GameControllerRumble(controller, low_strength, high_strength, duration);
#endif
}
@@ -1200,11 +1164,6 @@ void I_SetGamepadIndicatorColor(INT32 playernum, UINT8 red, UINT8 green, UINT8 b
return;
}
if (!I_GamepadHasLED(playernum))
{
return;
}
SDL_GameControllerSetLED(controller, red, green, blue);
#endif
}
@@ -1618,7 +1577,7 @@ static void write_backtrace(bt_crash_reason_t reason)
static std::thread::id g_main_thread_id;
#endif
static volatile sig_atomic_t g_in_exiting_signal_handler = false;
boolean g_in_exiting_signal_handler = false;
static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_msg, char *signal_name)
{
@@ -1753,11 +1712,6 @@ static void I_ReportSignal(int num, int coredumped)
I_ShowErrorBox(sigttl, sigmsg);
}
boolean I_In_Exiting_Signal_Handler(void)
{
return g_in_exiting_signal_handler;
}
#ifndef NEWSIGNALHANDLER
FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
{
@@ -1787,17 +1741,21 @@ FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
}
#endif
static volatile sig_atomic_t interrupted = false;
boolean I_Interrupted(void)
FUNCNORETURN static ATTRNORETURN void quit_handler(int num)
{
return interrupted;
}
#ifdef HAVE_THREADS
if (g_main_thread_id != std::this_thread::get_id())
{
// Do not attempt any sort of recovery if this signal triggers off the main thread
signal(num, SIG_DFL);
raise(num);
exit(-2);
}
#endif
static void quit_handler(int num)
{
(void)num;
interrupted = true;
signal(num, SIG_DFL); //default signal action
raise(num);
I_Quit();
}
static void I_RegisterSignals(void)
@@ -1927,7 +1885,6 @@ 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
@@ -1991,14 +1948,12 @@ FUNCNORETURN void ATTRNORETURN I_Quit(void)
I_ShutdownInput();
I_ShutdownSystem();
SDL_Quit();
/* if option -noendtxt is set, don't print the text */
if (!M_CheckParm("-noendtxt") && W_CheckNumForName("ENDOOM") != LUMPERROR)
{
printf("\r");
ShowEndTxt();
}
if (myargmalloc)
free(myargv); // Deallocate allocated memory
+85 -256
View File
@@ -84,20 +84,15 @@
#endif
// maximum number of windowed modes (see windowedModes[][])
#define MAXWINMODES (128)
#define MAXWINMODES (22)
static void I_FillScreenResolutionsList(boolean force);
/** \brief
*/
static INT32 numVidModes = -1;
typedef struct
{
char name[10];
INT32 w;
INT32 h;
} video_mode_t;
static video_mode_t windowedModes[MAXWINMODES] = {{"320x200", 320, 200}}; // make sure the default mode exists
static const char *fallback_resolution_name = "Fallback";
static int vid_nummodes = 1;
/** \brief
*/
static char vidModeName[33][32]; // allow 33 different modes
rendermode_t rendermode = render_none;
@@ -144,6 +139,9 @@ static SDL_bool disable_mouse = SDL_FALSE;
#define MOUSE_MENU false //(!disable_mouse && cv_usemouse.value && menuactive && !USE_FULLSCREEN)
#define MOUSEBUTTONS_MAX MOUSEBUTTONS
// first entry in the modelist which is not bigger than MAXVIDWIDTHxMAXVIDHEIGHT
static INT32 firstEntry = 0;
// Total mouse motion X/Y offsets
static INT32 mousemovex = 0, mousemovey = 0;
@@ -164,6 +162,38 @@ static SDL_Texture *texture = NULL;
static SDL_GLContext sdlglcontext = NULL;
#endif
static SDL_bool havefocus = SDL_TRUE;
static const char *fallback_resolution_name = "Fallback";
// windowed video modes from which to choose from.
static INT32 windowedModes[MAXWINMODES][2] =
{
{2560,1440}, // 1.66
{1920,1200}, // 1.60,6.00
{1920,1080}, // 1.66
{1680,1050}, // 1.60,5.25
{1600,1200}, // 1.33
{1600, 900}, // 1.66
{1366, 768}, // 1.66
{1440, 900}, // 1.60,4.50
{1280,1024}, // 1.33?
{1280, 960}, // 1.33,4.00
{1280, 800}, // 1.60,4.00
{1280, 720}, // 1.66
{1152, 864}, // 1.33,3.60
{1024, 768}, // 1.33,3.20
{ 960, 600}, // 1.33,3.20
{ 800, 600}, // 1.33,2.50
{ 735, 415}, // 1.33,2.50
{ 640, 480}, // 1.33,2.00
{ 640, 400}, // 1.60,2.00
{ 500, 300}, // 1.33
{ 320, 240}, // 1.33,1.00
{ 320, 200}, // 1.60,1.00
};
#define CUSTOMMODENUM 9999
static INT32 custom_width = 0;
static INT32 custom_height = 0;
static SDL_bool Impl_CreateWindow(SDL_bool fullscreen);
static void Impl_SetWindowIcon(void);
@@ -489,20 +519,11 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
return;
}
if (windowmoved)
if (windowmoved && rendermode == render_opengl)
{
I_CheckDesktopRes();
// if we say moved our game window to a different screen
// refetch our resolutions
I_FillScreenResolutionsList(false);
#ifdef HWRENDER
#ifdef USE_FBO_OGL
if (rendermode == render_opengl)
{
I_DownSample();
}
#endif
I_DownSample();
#endif
windowmoved = SDL_FALSE;
}
@@ -519,8 +540,7 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
if (!firsttimeonmouse)
{
if (cv_usemouse.value)
I_StartupMouse();
if (cv_usemouse.value) I_StartupMouse();
}
}
else if (!mousefocus && !kbfocus)
@@ -1214,9 +1234,9 @@ static void VID_Command_ModeList_f(void)
"Under opengl, fullscreen only supports native desktop resolution.\n"
"Under software, the mode is stretched up to desktop resolution.\n");
for (i = 0; i < vid_nummodes; i++)
for (i = 0; i < MAXWINMODES; i++)
{
CONS_Printf("%2d: %dx%d\n", i, windowedModes[i].w, windowedModes[i].h);
CONS_Printf("%2d: %dx%d\n", i, windowedModes[i][0], windowedModes[i][1]);
}
}
@@ -1255,7 +1275,7 @@ static void I_CheckDesktopRes(void)
return;
}
if (SDL_GetCurrentDisplayMode(currentDisplayIndex, &curmode) != 0)
if (SDL_GetDesktopDisplayMode(currentDisplayIndex, &curmode) != 0)
{
return;
}
@@ -1270,11 +1290,6 @@ boolean I_CheckNativeRes(void)
return (vid.width == desktopwidth && vid.height == desktopheight);
}
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height)
{
return (width > desktopwidth || height > desktopheight);
}
#ifdef USE_FBO_OGL
void RefreshOGLSDLSurface(void)
@@ -1505,207 +1520,13 @@ void I_SetPalette(RGBA_t *palette)
}
}
// make sure the canonical resolutions are always available
static const struct {
const int w, h;
} canonicals[] = {
{1920, 1200}, // 16:10
{1280, 800}, // 16:10
{ 960, 600}, // 16:10
{ 640, 400}, // 16:10
{ 320, 200}, // Vanilla Doom
};
static const int num_canonicals = sizeof(canonicals)/sizeof(*canonicals);
// [FG] sort resolutions by width first and height second
static int cmp_resolutions(const void *a, const void *b)
{
const video_mode_t *ma = (const video_mode_t *) a;
const video_mode_t *mb = (const video_mode_t *) b;
return (ma->w == mb->w) ? mb->h - ma->h : mb->w - ma->w;
}
static void I_AppendResolution(SDL_DisplayMode *mode, int *list_size)
{
int i;
for (i = 0; i < *list_size; i++)
if (windowedModes[i].w == mode->w
&& windowedModes[i].h == mode->h)
return;
snprintf(windowedModes[*list_size].name,
sizeof(windowedModes[*list_size].name),
"%dx%d", mode->w, mode->h);
windowedModes[*list_size].w = mode->w;
windowedModes[*list_size].h = mode->h;
(*list_size)++;
}
// small helper to check if a video mode is canonical
static boolean IsModeCanonical(int w, int h)
{
for (int i = 0; i < num_canonicals; i++)
{
if (canonicals[i].w == w && canonicals[i].h == h)
return true;
}
return false;
}
// check if our desired resolution already is in the videomode list
static int IsCustomResolutionInList(int list_size)
{
INT32 custom_w = cv_scr_width.value;
INT32 custom_h = cv_scr_height.value;
// startup
if (!custom_w || !custom_h)
return -2;
// invalid resolution
// dont even attempt to add it
if (custom_w < BASEVIDWIDTH || custom_w > MAXVIDWIDTH
|| custom_h < BASEVIDHEIGHT || custom_h > MAXVIDHEIGHT)
return -1;
for (int i = 0; i < list_size; i++)
{
if (windowedModes[i].w == custom_w && windowedModes[i].h == custom_h)
{
return 1;
}
}
return 0;
}
//
// I_FillScreenResolutionsList
// Get all the supported screen resolutions
// and fill the list with them
//
static void I_FillScreenResolutionsList(boolean force)
{
int currentDisplayIndex = -1;
static int oldDisplayIndex = -1;
SDL_DisplayMode mode;
int i = 0, list_size = 0;
int count = 0;
char custom_resolution[10];
currentDisplayIndex = SDL_GetWindowDisplayIndex(window);
// No valid index
if (currentDisplayIndex < 0)
{
return;
}
// didnt change screen, no need to redo the list
if (!force && currentDisplayIndex == oldDisplayIndex)
{
return;
}
oldDisplayIndex = currentDisplayIndex;
// Don't call SDL_ListModes if SDL has not been initialized
count = SDL_GetNumDisplayModes(currentDisplayIndex);
list_size = 0;
// on success, SDL_GetNumDisplayModes() always returns at least 1
if (count > 0)
{
// -2 for the desired resolution and for NULL
count = min(count, MAXWINMODES - 2 - num_canonicals);
for (i = count - 1 + num_canonicals; i >= 0; i--)
{
// make sure the canonical resolutions are always available
if (i > count - 1)
{
mode.w = canonicals[i - count].w;
mode.h = canonicals[i - count].h;
}
else
{
SDL_GetDisplayMode(currentDisplayIndex, i, &mode);
}
I_AppendResolution(&mode, &list_size);
}
windowedModes[list_size].name[0] = '\0';
}
const int customresinlist = IsCustomResolutionInList(list_size);
if (customresinlist == 0)
{
// did not find mode from list, make custom resolution if the values somewhat make sense
if (list_size < MAXWINMODES)
{
snprintf(custom_resolution, sizeof(custom_resolution), "%dx%d", cv_scr_width.value, cv_scr_height.value);
// [FG] if the desired resolution not in the list, append it
snprintf(windowedModes[list_size].name,
sizeof(windowedModes[list_size].name),
"%dx%d", cv_scr_width.value, cv_scr_height.value);
windowedModes[list_size].w = cv_scr_width.value;
windowedModes[list_size].h = cv_scr_height.value;
list_size++;
}
else
CONS_Alert(CONS_ERROR, "Could not set custom resolution!\n");
}
else if (customresinlist == -1)
CONS_Alert(CONS_ERROR, "Could not set custom resolution!\n");
// [FG] sort the list
SDL_qsort(windowedModes, list_size, sizeof(*windowedModes), cmp_resolutions);
// if we have more video modes than we can list
// try to shrink the list, lowest resolutions first
// whilst keeping the canonicals
if (list_size > MAXMODEDESCS)
{
// list is sorted from largest to smallest, so start at the end
for (i = list_size - 1; i >= 0 && list_size > MAXMODEDESCS; i--)
{
if (IsModeCanonical(windowedModes[i].w, windowedModes[i].h))
continue;
// Should we like, instead prioritize checking for non aspect correct resolutions to remove?
// we gotta shift everything
// due to canonicals we cant just shrink the list
for (int k = i; k < list_size - 1; k++)
{
windowedModes[k] = windowedModes[k + 1];
}
list_size--;
}
}
windowedModes[list_size].name[0] = '\0';
vid_nummodes = list_size;
// be sure to update the video menu
if (menuactive &&
currentMenu == &OP_VideoModeDef)
M_VideoModeMenu(0);
}
// return number of fullscreen + X11 modes
INT32 VID_NumModes(void)
{
return vid_nummodes;
if (USE_FULLSCREEN && numVidModes != -1)
return numVidModes - firstEntry;
else
return MAXWINMODES;
}
const char *VID_GetModeName(INT32 modeNum)
@@ -1715,32 +1536,40 @@ const char *VID_GetModeName(INT32 modeNum)
return fallback_resolution_name;
}
if (modeNum > vid_nummodes)
if (modeNum > MAXWINMODES)
return NULL;
return windowedModes[modeNum].name;
sprintf(&vidModeName[modeNum][0], "%dx%d",
windowedModes[modeNum][0],
windowedModes[modeNum][1]);
return &vidModeName[modeNum][0];
}
INT32 VID_GetModeForSize(INT32 w, INT32 h)
{
int i;
for (i = 0; i < vid_nummodes; i++)
for (i = 0; i < MAXWINMODES; i++)
{
if (windowedModes[i].w == w && windowedModes[i].h == h)
if (windowedModes[i][0] == w && windowedModes[i][1] == h)
{
return i;
}
}
return -1;
}
// did not find mode from list, make custom resolution if the values somewhat make sense
// opengl mode does not mind about max resolution defined in screen.h
// if not using opengl, check against the maximum as well
if ((w >= BASEVIDWIDTH && h >= BASEVIDHEIGHT) &&
(rendermode == render_opengl || (w <= MAXVIDWIDTH && h <= MAXVIDHEIGHT)))
{
custom_width = w;
custom_height = h;
return CUSTOMMODENUM;
}
void VID_RefreshModeList(void)
{
// check if we even need to rebuild the list
if (IsCustomResolutionInList(vid_nummodes) == 0)
I_FillScreenResolutionsList(true);
return -1;
}
void VID_PrepareModeList(void)
@@ -1774,10 +1603,17 @@ INT32 VID_SetMode(INT32 modeNum)
{
vid.recalc = true;
if (modeNum >= 0 && modeNum < vid_nummodes)
if (modeNum >= 0 && modeNum < MAXWINMODES)
{
vid.width = windowedModes[modeNum].w;
vid.height = windowedModes[modeNum].h;
vid.width = windowedModes[modeNum][0];
vid.height = windowedModes[modeNum][1];
vid.modenum = modeNum;
}
else if (modeNum == CUSTOMMODENUM && custom_width && custom_height)
{
// at this point these values are assumed to be okay
vid.width = custom_width;
vid.height = custom_height;
vid.modenum = modeNum;
}
else
@@ -1810,6 +1646,7 @@ INT32 VID_SetMode(INT32 modeNum)
return SDL_TRUE;
}
static SDL_bool Impl_CreateContext(void)
{
// Renderer-specific stuff
@@ -1832,9 +1669,6 @@ static SDL_bool Impl_CreateContext(void)
I_Error("Failed to set up GL context: %s\n", SDL_GetError());
}
// be sure to fill the resolution list the moment we have a window
I_FillScreenResolutionsList(false);
return SDL_TRUE;
}
#endif
@@ -1876,9 +1710,6 @@ static SDL_bool Impl_CreateContext(void)
SDL_RenderSetLogicalSize(renderer, BASEVIDWIDTH, BASEVIDHEIGHT);
// be sure to fill the resolution list the moment we have a window
I_FillScreenResolutionsList(false);
return SDL_TRUE;
}
@@ -2116,6 +1947,8 @@ void I_StartupGraphics(void)
usesdl2soft = M_CheckParm("-softblit");
borderlesswindow = M_CheckParm("-borderless");
VID_Command_ModeList_f();
#ifdef HWRENDER
if (rendermode == render_opengl)
{
@@ -2139,9 +1972,6 @@ void I_StartupGraphics(void)
vid.height = BASEVIDHEIGHT; // BitsPerPixel is the SDL interface's
vid.recalc = true; // Set up the console stufff
// be sure to print AFTER window creation
VID_Command_ModeList_f();
#ifdef HAVE_TTF
I_ShutdownTTF();
#endif
@@ -2197,8 +2027,7 @@ void I_ShutdownGraphics(void)
SDL_DestroyWindow(window);
window = NULL;
if (SDL_WasInit(SDL_INIT_VIDEO) == SDL_INIT_VIDEO)
SDL_QuitSubSystem(SDL_INIT_VIDEO);
SDL_QuitSubSystem(SDL_INIT_VIDEO);
framebuffer = SDL_FALSE;
}
+3 -9
View File
@@ -216,13 +216,8 @@ void I_StartupSound(void)
SDLmixlinked->major, SDLmixlinked->minor, SDLmixlinked->patch);
#ifdef HAVE_OPENMPT
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);
I_OutputMsg("libopenmpt version: %s\n", openmpt_get_string("library_version"));
I_OutputMsg("libopenmpt build date: %s\n", openmpt_get_string("build"));
#endif
sound_started = true;
@@ -242,8 +237,7 @@ void I_ShutdownSound(void)
Mix_Quit();
#endif
if (SDL_WasInit(SDL_INIT_AUDIO) == SDL_INIT_AUDIO)
SDL_QuitSubSystem(SDL_INIT_AUDIO);
SDL_QuitSubSystem(SDL_INIT_AUDIO);
#ifdef HAVE_LIBGME
if (gme)
-4
View File
@@ -57,10 +57,6 @@ typedef struct SDLJoyInfo_s
//int hats;
/// number of balls
//int balls;
///
boolean hasled;
///
boolean hasrumble;
} SDLJoyInfo_t;
/** \brief SDL info about controller 1
+2 -2
View File
@@ -180,12 +180,12 @@ static void ST_doPaletteStuff(void)
INT32 palette = 0;
#ifdef HWRENDER
if (rendermode == render_opengl && !HWR_ShouldUsePaletteRendering())
if (rendermode == render_opengl && !HWR_PalRenderFlashpal())
return;
#endif
if (stplyr && stplyr->flashcount)
palette = min(stplyr->flashpal, 13);
palette = CLAMP(stplyr->flashpal, 0, 13);
if (palette != st_palette)
{
+7 -10
View File
@@ -23,26 +23,24 @@ 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;
@@ -56,7 +54,8 @@ static inline void 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;
@@ -114,5 +113,3 @@ char *nongnu_strcasestr(const char *s, const char *q)
return NULL;
}
#endif
-525
View File
@@ -1,525 +0,0 @@
#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
+177 -105
View File
@@ -91,7 +91,6 @@ 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;
@@ -410,61 +409,6 @@ 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;
static const size_t palsize = (2*256); // two flashpals
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;
}
CONS_Debug(DBG_RENDER, "Current palette does not provide enough subpalettes for flashpalettes to work!\nCreating fallback palettes...\n");
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)
{
@@ -484,8 +428,6 @@ 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);
@@ -505,19 +447,12 @@ static void LoadPalette(const char *lumpname)
pLocalPalette[i].s.alpha = 0xFF;
pGammaCorrectedPalette[i].rgba = V_GammaDecode(pLocalPalette[i].rgba);
}
GenerateFlashPalettes();
if (!Cubeapply)
continue;
// 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);
}
V_CubeApply(&pGammaCorrectedPalette[i]);
pLocalPalette[i].rgba = V_GammaEncode(pGammaCorrectedPalette[i].rgba);
}
}
@@ -608,7 +543,6 @@ void V_ReloadPalette(void)
// -------------+
void V_SetPalette(INT32 palettenum)
{
RGBA_t *pal = NULL;
if (!pLocalPalette)
V_ReloadPalette();
@@ -620,47 +554,24 @@ void V_SetPalette(INT32 palettenum)
if (palettenum == 0)
{
palettenum = cv_palettenum.value;
}
}
// 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;
if (palettenum * 256U > currentPaletteSize - 256)
{
CONS_Alert(CONS_WARNING, "cv_palettenum %d out of range\n", palettenum);
palettenum = 0;
}
}
else
{
pal = pLocalPalette;
}
}
else
{
pal = &pLocalPalette[palettenum*256];
}
#ifdef HWRENDER
if (rendermode == render_opengl)
HWR_SetPalette(pal);
HWR_SetPalette(&pLocalPalette[palettenum*256]);
#if defined (__unix__) || defined (UNIXCOMMON) || defined (HAVE_SDL)
else
#endif
#endif
if (rendermode != render_none)
I_SetPalette(pal);
I_SetPalette(&pLocalPalette[palettenum*256]);
}
void V_SetPaletteLump(const char *pal)
@@ -3235,7 +3146,7 @@ INT32 V_SubStringWidth(const char *string, INT32 length, INT32 option)
break;
}
for (i = 0; i < length && string[i]; i++)
for (i = 0; string[i] && i < length; i++)
{
c = string[i];
if ((UINT8)c >= 0x80 && (UINT8)c <= 0x8F) //color parsing! -Inuyasha 2.16.09
@@ -3280,7 +3191,7 @@ INT32 V_SmallSubStringWidth(const char *string, INT32 length, INT32 option)
break;
}
for (i = 0; i < length && string[i]; i++)
for (i = 0; string[i] && i < length; i++)
{
c = string[i];
if ((UINT8)c >= 0x80 && (UINT8)c <= 0x8F) //color parsing! -Inuyasha 2.16.09
@@ -3329,7 +3240,7 @@ INT32 V_ThinSubStringWidth(const char *string, INT32 length, INT32 option)
break;
}
for (i = 0; i < length && string[i]; i++)
for (i = 0; string[i] && i < length; i++)
{
c = string[i];
if ((UINT8)c >= 0x80 && (UINT8)c <= 0x8F) //color parsing! -Inuyasha 2.16.09
@@ -3398,6 +3309,167 @@ 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)
@@ -3845,12 +3917,12 @@ void V_Recalc(void)
// Set dup based on width or height, whichever is less
if (((vid.width*FRACUNIT) / BASEVIDWIDTH) < ((vid.height*FRACUNIT) / BASEVIDHEIGHT))
{
vid.dup = max(vid.width / BASEVIDWIDTH, 1);
vid.dup = vid.width / BASEVIDWIDTH;
vid.fdup = (vid.width*FRACUNIT) / BASEVIDWIDTH;
}
else
{
vid.dup = max(vid.height / BASEVIDHEIGHT, 1);
vid.dup = vid.height / BASEVIDHEIGHT;
vid.fdup = (vid.height*FRACUNIT) / BASEVIDHEIGHT;
}
+2
View File
@@ -287,6 +287,8 @@ 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
-2119
View File
File diff suppressed because it is too large. Load diff
+183 -210
View File
@@ -87,32 +87,18 @@ typedef struct
} lumpchecklist_t;
// Must be a power of two
#define LUMPNUMCACHESIZE 2048 // should be reasonable ig
#define LUMPNUMCACHESIZE 64
#define LUMPNUMCACHENAME 32
#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"
typedef struct lumpnum_cache_s
{
char lumpname[LUMPNUMCACHENAME];
lumpnum_t lumpnum;
UINT32 hash;
} lumpnum_cache_t;
#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 lumpnum_cache_t lumpnumcache[LUMPNUMCACHESIZE];
static UINT16 lumpnumcacheindex = 0;
static const char pat_central[] = {0x50, 0x4b, 0x01, 0x02, 0x00};
static const char pat_end[] = {0x50, 0x4b, 0x05, 0x06, 0x00};
@@ -130,8 +116,6 @@ 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];
@@ -143,27 +127,18 @@ 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);
}
folder_map_cleanup(&wad->startfolders->map);
free(wad->startfolders);
folder_map_cleanup(&wad->endfolders->map);
free(wad->endfolders);
M_AATreeFree(wad->startfolders);
M_AATreeFree(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
//===========================================================================
@@ -284,7 +259,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 = (char *)(malloc(length + 1));
char *name = malloc(length + 1);
if (!name)
I_Error("W_LoadDehackedLumpsPK3: Out of memory!\n");
@@ -320,7 +295,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 = (char *)(malloc(length + 1));
char *name = malloc(length + 1);
if (!name)
I_Error("W_LoadDehackedLumps: Out of memory!\n");
@@ -364,9 +339,9 @@ static inline INT32 W_MakeFileMD5(const char *filename, void *resblock)
if ((fhandle = fopen(filename, "rb")) != NULL)
{
precise_t t = I_GetPreciseTime();
tic_t t = I_GetTime();
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)
{
@@ -375,7 +350,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_GetPreciseTime() - t)/I_GetPrecisePrecision());
filename, (float)(I_GetTime() - t)/NEWTICRATE);
fclose(fhandle);
return 0;
@@ -385,12 +360,12 @@ static inline INT32 W_MakeFileMD5(const char *filename, void *resblock)
}
// Invalidates the cache of lump numbers. Call this whenever a wad is added.
FUNCINLINE static ATTRINLINE void W_InvalidateLumpnumCache(void)
static void W_InvalidateLumpnumCache(void)
{
lumpnum_map_clear(&lumpnumcache);
memset(lumpnumcache, 0, sizeof(lumpnumcache));
}
FUNCINLINE static ATTRINLINE UINT32 W_HashLumpName(const char *name)
UINT32 W_HashLumpName(const char *name)
{
return FNV1a_HashLowercaseString(name);
}
@@ -416,28 +391,28 @@ static restype_t ResourceFileDetect(const char* filename)
*/
static lumpinfo_t* ResGetLumpsStandalone(FILE* handle, UINT16* numlumps, const char* lumpname)
{
lumpinfo_t* lumpinfo = (lumpinfo_t *)(Z_Calloc(sizeof (*lumpinfo), PU_STATIC, NULL));
lumpinfo_t* lumpinfo = Z_Calloc(sizeof (*lumpinfo), PU_STATIC, NULL);
lumpinfo->position = 0;
fseek(handle, 0, SEEK_END);
lumpinfo->size = (size_t)(ftell(handle));
lumpinfo->size = 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 = (char *)(Z_Malloc((lumpinfo->namelength + 1) * sizeof(char), PU_STATIC, NULL));
lumpinfo->longname = 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 = (char *)(Z_Malloc((lumpinfo->namelength + 1) * sizeof(char), PU_STATIC, NULL));
lumpinfo->fullname = 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;
@@ -481,7 +456,7 @@ static lumpinfo_t* ResGetLumpsWad(FILE* handle, UINT16* nlmp, const char* filena
// read wad file directory
i = header.numlumps * sizeof(*fileinfo);
fileinfov = fileinfo = (filelump_t *)(malloc(i));
fileinfov = fileinfo = malloc(i);
if (fseek(handle, header.infotableofs, SEEK_SET) == -1
|| fread(fileinfo, 1, i, handle) < i)
@@ -493,7 +468,7 @@ static lumpinfo_t* ResGetLumpsWad(FILE* handle, UINT16* nlmp, const char* filena
numlumps = header.numlumps;
// fill in lumpinfo for this wad
lump_p = lumpinfo = (lumpinfo_t *)(Z_Malloc(numlumps * sizeof (*lumpinfo), PU_STATIC, NULL));
lump_p = lumpinfo = Z_Malloc(numlumps * sizeof (*lumpinfo), PU_STATIC, NULL);
for (i = 0; i < numlumps; i++, lump_p++, fileinfo++)
{
@@ -537,18 +512,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 = (char *)(Z_Malloc(9 * sizeof(char), PU_STATIC, NULL));
lump_p->longname = 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 = (char *)(Z_Malloc(9 * sizeof(char), PU_STATIC, NULL));
lump_p->fullname = 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;
@@ -565,24 +540,24 @@ static boolean ResFindSignature(FILE* handle, const char endPat[], UINT32 startp
int c;
fseek(handle, 0, SEEK_END);
size_t len = (size_t)(ftell(handle));
size_t len = ftell(handle);
fseek(handle, startpos, SEEK_SET);
size_t remaining = (size_t)(len - startpos);
size_t chunkpos = (size_t)(startpos);
size_t remaining = len - startpos;
size_t chunkpos = 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.
@@ -594,7 +569,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 = (size_t)(chunkpos + i + 1);
size_t foundpos = chunkpos + i + 1;
fseek(handle, foundpos, SEEK_SET);
return true;
}
@@ -671,7 +646,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");
@@ -687,11 +662,11 @@ static lumpinfo_t* ResGetLumpsZip(FILE* handle, UINT16* nlmp)
numlumps = SHORT(zend.entries);
lump_p = lumpinfo = (lumpinfo_t *)(Z_Malloc(numlumps * sizeof (*lumpinfo), PU_STATIC, NULL));
lump_p = lumpinfo = Z_Malloc(numlumps * sizeof (*lumpinfo), PU_STATIC, NULL);
fseek(handle, LONG(zend.cdiroffset), SEEK_SET);
CLEANUP(Z_Pfree) char *cdir = (char *)(Z_Malloc(LONG(zend.cdirsize), PU_STATIC, &cdir));
CLEANUP(Z_Pfree) char *cdir = Z_Malloc(LONG(zend.cdirsize), PU_STATIC, &cdir);
if (fread(cdir, 1, LONG(zend.cdirsize), handle) < (UINT32)(LONG(zend.cdirsize)))
{
@@ -704,7 +679,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;
@@ -720,9 +695,8 @@ 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));
strncpy(fullname, (char *)(zentry + 1), SHORT(zentry->namelen));
fullname[zentry->namelen] = 0;
fullname = (char*)(malloc(SHORT(zentry->namelen) + 1));
strlcpy(fullname, (char*)(zentry + 1), SHORT(zentry->namelen) + 1);
// Strip away file address and extension for the 8char name.
if ((trimname = strrchr(fullname, '/')) != NULL)
@@ -738,15 +712,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 = (char *)(Z_Calloc(dotpos - trimname + 1, PU_STATIC, NULL));
lump_p->longname = 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))
{
@@ -921,19 +895,17 @@ UINT16 W_InitFile(const char *filename, boolean local, boolean startup)
//
// link wad file to search files
//
wadfile = (wadfile_t *)(Z_Calloc(sizeof (*wadfile), PU_STATIC, NULL));
wadfile = 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 = (FolderCache *)malloc(sizeof(FolderCache));
folder_map_init(&wadfile->startfolders->map);
wadfile->endfolders = (FolderCache *)malloc(sizeof(FolderCache));
folder_map_init(&wadfile->endfolders->map);
wadfile->startfolders = M_AATreeAlloc(AATREE_STRING);
wadfile->endfolders = M_AATreeAlloc(AATREE_STRING);
// already generated, just copy it over
memcpy(&wadfile->md5sum, &md5sum, 16);
@@ -958,7 +930,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, (boolean)(type == RET_PK3));
HWR_LoadCustomShadersFromFile(numwadfiles - 1, (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.
@@ -1058,7 +1030,7 @@ INT32 W_AddAutoloadedLocalFiles(char **filenames)
/** Make sure a lump number is valid.
* Compiles away to nothing if PARANOIA is not defined.
*/
static inline boolean TestValidLump(UINT16 wad, UINT16 lump)
static boolean TestValidLump(UINT16 wad, UINT16 lump)
{
I_Assert(wad < MAX_WADFILES);
if (!wadfiles[wad]) // make sure the wad file exists
@@ -1081,7 +1053,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));
}
//
@@ -1135,7 +1107,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;
@@ -1167,46 +1139,43 @@ UINT16 W_CheckNumForNamePwad(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)
{
UINT16 i;
size_t namelen;
size_t name_length;
INT32 i;
lumpinfo_t *lump_p = wadfiles[wad]->lumpinfo + startlump;
name_length = strlen(name);
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);
void *val = M_AATreeGetString(wadfiles[wad]->startfolders, name);
if (val != NULL)
return (uintptr_t)val;
for (i = startlump; i < wadfiles[wad]->numlumps; i++, lump_p++)
{
if (strnicmp(name, lump_p->fullname, namelen) == 0)
if (strnicmp(name, lump_p->fullname, name_length) == 0)
{
/* SLADE is special and puts a single directory entry. Skip that. */
if (lump_p->fullnamelength == namelen)
if (strlen(lump_p->fullname) == name_length)
i++;
folder_map_insert(&wadfiles[wad]->startfolders->map, strdup(name), i);
M_AATreeSetString(wadfiles[wad]->startfolders, name, (void *)(uintptr_t)i);
return i;
}
}
folder_map_insert(&wadfiles[wad]->startfolders->map, strdup(name), INT16_MAX);
M_AATreeSetString(wadfiles[wad]->startfolders, name, (void *)INT16_MAX);
return INT16_MAX;
}
@@ -1215,23 +1184,21 @@ 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)
{
UINT16 i;
size_t namelen;
INT32 i;
lumpinfo_t *lump_p = wadfiles[wad]->lumpinfo + startlump;
size_t name_length = strlen(name);
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);
void *val = M_AATreeGetString(wadfiles[wad]->endfolders, name);
if (val != NULL)
return (uintptr_t)val;
for (i = startlump; i < wadfiles[wad]->numlumps; i++, lump_p++)
{
if (strnicmp(name, lump_p->fullname, namelen))
if (strnicmp(name, lump_p->fullname, name_length))
break;
}
folder_map_insert(&wadfiles[wad]->endfolders->map, strdup(name), i);
M_AATreeSetString(wadfiles[wad]->endfolders, name, (void *)(uintptr_t)i);
return i;
}
@@ -1239,15 +1206,13 @@ 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)
{
UINT16 i;
size_t namelen;
INT32 i;
lumpinfo_t *lump_p = wadfiles[wad]->lumpinfo + startlump;
namelen = strlen(name);
size_t name_length = strlen(name);
for (i = startlump; i < wadfiles[wad]->numlumps; i++, lump_p++)
{
if (!strnicmp(name, lump_p->fullname, namelen))
if (!strnicmp(name, lump_p->fullname, name_length))
{
return i;
}
@@ -1257,19 +1222,61 @@ UINT16 W_CheckNumForFullNamePK3(const char *name, UINT16 wad, UINT16 startlump)
return INT16_MAX;
}
FUNCINLINE static ATTRINLINE lumpnum_t CheckLumpInCache(const char *name)
static lumpnum_t CheckLumpInCache(const char *name, boolean longname)
{
lumpnum_map_itr it = lumpnum_map_get(&lumpnumcache, name);
if (!lumpnum_map_is_end(it))
return it.data->val;
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;
}
}
}
return LUMPERROR;
}
FUNCINLINE static ATTRINLINE void AddLumpToCache(lumpnum_t lumpnum, const char *name)
static void AddLumpToCache(lumpnum_t lumpnum, const char *name, boolean longname)
{
I_Assert(strnlen(name, 9) <= 8); // we dont have longnames, so assume this is a non terminated string
lumpnum_map_insert(&lumpnumcache, strdup(name), lumpnum);
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;
}
//
@@ -1285,14 +1292,14 @@ lumpnum_t W_CheckNumForName(const char *name)
return LUMPERROR;
// Check the lumpnumcache first.
lumpnum_t cachenum = CheckLumpInCache(name);
lumpnum_t cachenum = CheckLumpInCache(name, false);
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
@@ -1306,7 +1313,7 @@ lumpnum_t W_CheckNumForName(const char *name)
{
// Update the cache.
lumpnum_t lumpnum = (i << 16) | check;
AddLumpToCache(lumpnum, name);
AddLumpToCache(lumpnum, name, false);
return lumpnum;
}
@@ -1318,7 +1325,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;
@@ -1327,14 +1334,14 @@ lumpnum_t W_CheckNumForName(const char *name)
return LUMPERROR;
// Check the lumpnumcache first.
lumpnum_t cachenum = CheckLumpInCache(name);
lumpnum_t cachenum = CheckLumpInCache(name, true);
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
@@ -1348,11 +1355,11 @@ lumpnum_t W_CheckNumForName(const char *name)
{
// Update the cache.
lumpnum_t lumpnum = (i << 16) | check;
AddLumpToCache(lumpnum, name);
AddLumpToCache(lumpnum, name, true);
return lumpnum;
}
}*/
}
//
// W_GetNumForName
@@ -1377,7 +1384,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;
@@ -1387,7 +1394,7 @@ lumpnum_t W_GetNumForName(const char *name)
I_Error("W_GetNumForLongName: %s not found!\n", name);
return i;
}*/
}
//
// W_CheckNumForNameInBlock
@@ -1404,49 +1411,32 @@ 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;
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);
INT32 i,j;
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 (lump_p->namelength == namelen
&& lump_p->hash.name == hash
&& fastcmp(lump_p->name, name))
if (fastcmp(lump_p->name, name))
return true;
}
}
return false;
}
@@ -1606,13 +1596,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
@@ -1625,8 +1615,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 = (char *)(Z_Malloc(l->disksize, PU_STATIC, NULL));
decData = (char *)(Z_Malloc(l->size, PU_STATIC, NULL));
rawData = Z_Malloc(l->disksize, PU_STATIC, NULL);
decData = 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);
@@ -1653,7 +1643,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
@@ -1673,8 +1663,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 = (UINT8 *)(Z_Malloc(rawSize, PU_STATIC, NULL));
decData = (UINT8 *)(dest);
rawData = Z_Malloc(rawSize, PU_STATIC, NULL);
decData = dest;
if (fread(rawData, 1, rawSize, handle) < rawSize)
I_Error("wad %d, lump %d: cannot read compressed data", wad, lump);
@@ -1710,7 +1700,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;
}
@@ -1898,7 +1888,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);
}
@@ -1920,7 +1910,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;
@@ -1931,7 +1921,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)
@@ -1949,20 +1939,17 @@ void *W_GetCachedPatchNumPwad(UINT16 wad, UINT16 lump)
#ifdef ROTSPRITE
// Caches a rotsprite for patch rotation.
void *W_GetCachedRotPatchPwad(UINT16 wad, UINT16 lump)
void *W_GetCachedRotPatchPwad(UINT16 wadnum, UINT16 lumpnum)
{
if (!TestValidLump(wad, lump))
return NULL;
lumpcache_t *rotcache = wadfiles[wadnum]->rotcache;
lumpcache_t *rotcache = wadfiles[wad]->rotcache;
if (!rotcache[lump])
if (!rotcache[lumpnum])
{
rotsprite_t *rspr = RotatedPatch_Create(ROTANGLES);
Z_SetUser(rspr, (void**)(&rotcache[lump]));
Z_SetUser(rspr, (void **)(&rotcache[lumpnum]));
}
return (void*)(rotcache[lump]);
return (void *)(rotcache[lumpnum]);
}
#endif // ROTSPRITE
@@ -1975,7 +1962,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);
@@ -2010,7 +1997,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);
@@ -2019,7 +2006,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);
@@ -2212,7 +2199,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;
@@ -2226,7 +2213,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)))
{
@@ -2237,7 +2224,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;
@@ -2249,9 +2236,8 @@ static int W_VerifyPK3(FILE *fp, lumpchecklist_t *checklist, boolean status)
if (verified == true)
{
fullname = (char *)(malloc(SHORT(zentry->namelen) + 1));
strncpy(fullname, (char *)(zentry + 1), SHORT(zentry->namelen));
fullname[zentry->namelen] = 0;
fullname = (char*)(malloc(SHORT(zentry->namelen) + 1));
strlcpy(fullname, (char*)(zentry + 1), SHORT(zentry->namelen) + 1);
// Strip away file address and extension for the 8char name.
if ((trimname = strrchr(fullname, '/')) != NULL)
@@ -2460,7 +2446,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;
@@ -2474,7 +2460,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)))
{
@@ -2485,7 +2471,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;
@@ -2495,9 +2481,8 @@ static int W_CheckPK3Contains(FILE *fp, lumpchecklist_t *checklist)
return false;
}
fullname = (char *)(malloc(SHORT(zentry->namelen) + 1));
strncpy(fullname, (char *)(zentry + 1), SHORT(zentry->namelen));
fullname[zentry->namelen] = 0;
fullname = (char*)(malloc(SHORT(zentry->namelen) + 1));
strlcpy(fullname, (char*)(zentry + 1), SHORT(zentry->namelen) + 1);
// Strip away file address and extension for the 8char name.
if ((trimname = strrchr(fullname, '/')) != NULL)
@@ -2588,18 +2573,6 @@ 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[] =
@@ -2612,6 +2585,7 @@ int W_CheckPostLoadList(const char *filename)
{"SOC_", 4},
{"MAINCFG", 7},
{"OBJCTCFG", 8},
{"MAP", 3},
{NULL, 0},
};
@@ -2644,14 +2618,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++)
{
@@ -2663,7 +2637,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");
@@ -2672,12 +2646,11 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
{
if (vsizecache[realentry] == 0)
continue;
vlumps[i].size = vsizecache[realentry];
const char *name = (fileinfo + realentry)->name;
if (strnlen(name, 8) == 5 && memcmp(name, "MAP", 3) == 0)
if (strlen(name) == 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
@@ -2686,7 +2659,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);
@@ -2713,7 +2686,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");
@@ -2734,11 +2707,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;
Loaded 100 of 103 files, more files were not shown because too many files have changed in this diff. Show more