Compare commits

..
Author SHA1 Message Date
Alug f58772a570 z_zone: add asserts if zone memory functions are called from non main thread
also taken from srb2classic thanks!
2026-02-02 18:14:38 +01:00
Alug f7c065b22e refactor i_thread stuff
based on https://codeberg.org/srb2classic/srb2classic/commit/3670a7c1c193185cf4921de8955c96e63fbecc62
and other things from srb2classic
this also now allows to check if a thread failed to spawn and reduces duped stuff and such
2026-02-02 18:14:35 +01:00
154 changed files with 4403 additions and 7255 deletions

No files matched your search

+2 -1
View File
@@ -54,7 +54,7 @@ set(SRB2_CORE_SOURCES
string.c string.c
tables.c tables.c
v_video.c v_video.c
w_wad.cpp w_wad.c
y_inter.c y_inter.c
z_zone.cpp z_zone.cpp
) )
@@ -191,6 +191,7 @@ set(SRB2_CORE_GAME_SOURCES
k_kart.c k_kart.c
k_stats.c k_stats.c
i_time.c i_time.c
i_threads.c
p_local.h p_local.h
p_maputl.h p_maputl.h
+5 -11
View File
@@ -93,8 +93,7 @@
# NOLDWARNING=1 - ? # NOLDWARNING=1 - ?
# NOSDLMAIN=1 - ? # NOSDLMAIN=1 - ?
# SDLMAIN=1 - ? # SDLMAIN=1 - ?
# NOLTO=1 - Disable link time optimizations # USELTO=1 - Enable building with LTO.
# USEJEMALLOC=1 Enable building with jemalloc Allocator to replace GLibc malloc, might improve performance
# #
# Library configuration flags: # Library configuration flags:
# Everything here is an override. # Everything here is an override.
@@ -261,7 +260,7 @@ debug_opts=-D_DEBUG
else # build a normal optimized version else # build a normal optimized version
debug_opts=-DNDEBUG debug_opts=-DNDEBUG
opts+=-O3 opts+=-O3
ifndef NOLTO ifdef USELTO
# compile with LTO # compile with LTO
opts+=-flto=auto opts+=-flto=auto
libs+=-flto=auto libs+=-flto=auto
@@ -270,20 +269,16 @@ endif
ifdef USEASAN ifdef USEASAN
# compile with asan # compile with asan
opts+=-O1 -fsanitize=address -fno-omit-frame-pointer -fno-common opts+=-fsanitize=address
libs+=-fsanitize=address libs+=-fsanitize=address
endif endif
ifdef USEUBSAN ifdef USEUBSAN
# compile with ubsan # compile with asan
opts+=-O1 -fsanitize=undefined -fno-omit-frame-pointer opts+=-fsanitize=undefined
libs+=-fsanitize=undefined libs+=-fsanitize=undefined
endif endif
ifdef USEJEMALLOC
libs+=-ljemalloc
endif
ifneq (,$(filter $(CC) $(CXX),clang clang++)) ifneq (,$(filter $(CC) $(CXX),clang clang++))
libs+=-fuse-ld=lld libs+=-fuse-ld=lld
endif endif
@@ -300,7 +295,6 @@ opts+=$(debug_opts)
opts+=$(foreach v,$(passthru_opts),$(if $($(v)),-D$(v))) 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 CXXFLAGS+=-std=c++17 # force c17 for c++ since most vpss run older ubuntu versions with old compilers
opts+=$(WFLAGS) $(CFLAGS) opts+=$(WFLAGS) $(CFLAGS)
-5
View File
@@ -8,11 +8,6 @@ ifdef MINGW
libs+=-mconsole libs+=-mconsole
endif endif
ifndef NOTHREADS
opts+=-DHAVE_THREADS
sources+=dedicated/i_threads.c
endif
NOOPENMPT=1 NOOPENMPT=1
NOLIBGME=1 NOLIBGME=1
NOHW=1 NOHW=1
+1 -2
View File
@@ -64,7 +64,6 @@ endif
# This must have high to low order. # This must have high to low order.
gcc_versions:=\ gcc_versions:=\
161 160 16\
152 151 150 15\ 152 151 150 15\
142 141 140 14\ 142 141 140 14\
133 132 131 130 13\ 133 132 131 130 13\
@@ -78,7 +77,7 @@ gcc_versions:=\
55 54 53 52 51 50\ 55 54 53 52 51 50\
49 48 47 46 45 44 43 42 41 40 49 48 47 46 45 44 43 42 41 40
latest_gcc_version:=16.1 latest_gcc_version:=15.2
# Automatically set version flag, but not if one was # Automatically set version flag, but not if one was
# manually set. And don't bother if this is a clean only # manually set. And don't bother if this is a clean only
+5 -1
View File
@@ -8,7 +8,6 @@ passthru_opts+=\
HAVE_MINIUPNPC\ HAVE_MINIUPNPC\
HAVE_DISCORDRPC DEVELOP\ HAVE_DISCORDRPC DEVELOP\
NOHOLEPUNCH\ NOHOLEPUNCH\
HAVE_IPV6\
# build with debugging information # build with debugging information
ifdef DEBUGMODE ifdef DEBUGMODE
@@ -28,6 +27,11 @@ endif
sources+=$(call List,hardware/Sourcefile) sources+=$(call List,hardware/Sourcefile)
endif endif
ifndef NOTHREADS
opts+=-DHAVE_THREADS
sources+=i_threads.c
endif
ifndef NOMD5 ifndef NOMD5
sources+=md5.c sources+=md5.c
endif endif
-5
View File
@@ -40,11 +40,6 @@ sources+=sdl/mixer_sound.c
endif endif
endif endif
ifndef NOTHREADS
opts+=-DHAVE_THREADS
sources+=sdl/i_threads.c
endif
ifdef SDL_PKGCONFIG ifdef SDL_PKGCONFIG
$(eval $(call Use_pkg_config,SDL)) $(eval $(call Use_pkg_config,SDL))
else else
+12 -13
View File
@@ -20,8 +20,7 @@ $(foreach v,$(join $(wordlist 2,$(_n),- $(gcc_versions)),\
CXXFLAGS+= -Wno-aggregate-return CXXFLAGS+= -Wno-aggregate-return
# -W -Wno-unused # -W -Wno-unused
WFLAGS:=-Wall -Wnull-dereference WFLAGS:=-Wall -Wno-trigraphs -Wnull-dereference
#WFLAGS+=-Wno-trigraphs
ifdef GCC152 ifdef GCC152
WFLAGS+=-Wzero-as-null-pointer-constant WFLAGS+=-Wzero-as-null-pointer-constant
endif endif
@@ -32,7 +31,7 @@ ifndef RELAXWARNINGS
WFLAGS+=-W WFLAGS+=-W
#WFLAGS+=-Wno-sign-compare #WFLAGS+=-Wno-sign-compare
ifndef GCC295 ifndef GCC295
# WFLAGS+=-Wno-div-by-zero WFLAGS+=-Wno-div-by-zero
endif endif
#WFLAGS+=-Wsystem-headers #WFLAGS+=-Wsystem-headers
WFLAGS+=-Wfloat-equal WFLAGS+=-Wfloat-equal
@@ -63,7 +62,7 @@ endif
endif endif
WFLAGS+=-Wsign-compare WFLAGS+=-Wsign-compare
ifdef GCC91 ifdef GCC91
# WFLAGS+=-Wno-error=address-of-packed-member WFLAGS+=-Wno-error=address-of-packed-member
endif endif
ifdef GCC45 ifdef GCC45
WFLAGS+=-Wlogical-op WFLAGS+=-Wlogical-op
@@ -106,14 +105,14 @@ endif
endif endif
WFLAGS+=-Wformat-y2k WFLAGS+=-Wformat-y2k
ifdef GCC71 ifdef GCC71
#WFLAGS+=-Wno-error=format-overflow=2 WFLAGS+=-Wno-error=format-overflow=2
endif endif
WFLAGS+=-Wformat-security WFLAGS+=-Wformat-security
ifndef GCC29 ifndef GCC29
#WFLAGS+=-Winit-self #WFLAGS+=-Winit-self
endif endif
ifdef GCC46 ifdef GCC46
#WFLAGS+=-Wno-suggest-attribute=noreturn WFLAGS+=-Wno-suggest-attribute=noreturn
endif endif
ifdef NOLDWARNING ifdef NOLDWARNING
@@ -131,21 +130,21 @@ ifdef GCC44
#WFLAGS+=-Wno-error=array-bounds #WFLAGS+=-Wno-error=array-bounds
endif endif
ifdef GCC46 ifdef GCC46
# WFLAGS+=-Wno-error=suggest-attribute=noreturn WFLAGS+=-Wno-error=suggest-attribute=noreturn
endif endif
ifdef GCC54 ifdef GCC54
# WFLAGS+=-Wno-logical-op -Wno-error=logical-op WFLAGS+=-Wno-logical-op -Wno-error=logical-op
endif endif
ifdef GCC61 ifdef GCC61
# WFLAGS+=-Wno-tautological-compare -Wno-error=tautological-compare WFLAGS+=-Wno-tautological-compare -Wno-error=tautological-compare
endif endif
ifdef GCC71 ifdef GCC71
WFLAGS+=-Wimplicit-fallthrough=4 WFLAGS+=-Wimplicit-fallthrough=4
endif endif
ifdef GCC81 ifdef GCC81
# WFLAGS+=-Wno-error=format-overflow WFLAGS+=-Wno-error=format-overflow
# WFLAGS+=-Wno-format-overflow WFLAGS+=-Wno-format-overflow
# WFLAGS+=-Wno-error=multistatement-macros WFLAGS+=-Wno-error=multistatement-macros
endif endif
ifneq (,$(filter $(CC) $(CXX),clang clang++)) ifneq (,$(filter $(CC) $(CXX),clang clang++))
@@ -184,6 +183,6 @@ endif
# Lua # Lua
ifdef GCC43 ifdef GCC43
ifndef GCC44 ifndef GCC44
#WFLAGS+=-Wno-logical-op WFLAGS+=-Wno-logical-op
endif endif
endif endif
+9 -18
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_API void lua_pushlstring (lua_State *L, const char *s, size_t len) {
lua_lock(L); lua_lock(L);
luaC_checkGC(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); api_incr_top(L);
lua_unlock(L); lua_unlock(L);
} }
@@ -519,22 +519,6 @@ LUA_API int lua_pushthread (lua_State *L) {
** get functions (Lua -> stack) ** get functions (Lua -> stack)
*/ */
static void auxgetstr (lua_State *L, TValue *t, const char *k) {
TValue *slot;
TValue key;
TString *str = luaS_new(L, k);
api_checkvalidindex(L, t);
if (luaV_fastget(L, t, str, slot, luaH_getstr)) {
setobj2s(L, L->top, slot);
}
else {
setsvalue(L, &key, str);
luaV_finishget(L, t, &key, L->top, slot);
}
api_incr_top(L);
lua_unlock(L);
}
LUA_API void lua_gettable (lua_State *L, int idx) { LUA_API void lua_gettable (lua_State *L, int idx) {
StkId t; StkId t;
@@ -547,8 +531,15 @@ LUA_API void lua_gettable (lua_State *L, int idx) {
LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { LUA_API void lua_getfield (lua_State *L, int idx, const char *k) {
StkId t;
TValue key;
lua_lock(L); lua_lock(L);
auxgetstr(L, index2adr(L, idx), k); t = index2adr(L, idx);
api_checkvalidindex(L, t);
setsvalue(L, &key, luaS_new(L, k));
luaV_gettable(L, t, &key, L->top);
api_incr_top(L);
lua_unlock(L);
} }
+3 -15
View File
@@ -20,7 +20,6 @@
#define lauxlib_c #define lauxlib_c
#define LUA_LIB #define LUA_LIB
#include "ldebug.h"
#include "lua.h" #include "lua.h"
#include "lauxlib.h" #include "lauxlib.h"
@@ -469,19 +468,8 @@ LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) {
LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {
while (l) { while (l--)
size_t space = bufffree(B); luaL_addchar(B, *s++);
if (space == 0) {
luaL_prepbuffer(B);
lua_assert(bufffree(B) == LUAL_BUFFERSIZE);
space = LUAL_BUFFERSIZE;
}
if (space > l) space = l;
memcpy(B->p, s, space);
B->p += space;
s += space;
l -= space;
}
} }
@@ -698,6 +686,6 @@ static int panic (lua_State *L) {
LUALIB_API lua_State *luaL_newstate (void) { LUALIB_API lua_State *luaL_newstate (void) {
lua_State *L = lua_newstate(l_alloc, NULL); lua_State *L = lua_newstate(l_alloc, NULL);
if (l_likely(L)) lua_atpanic(L, &panic); if (L) lua_atpanic(L, &panic);
return L; return L;
} }
+12 -13
View File
@@ -790,19 +790,18 @@ void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {
case OPR_BXOR: codearith(fs, OP_BXOR, e1, e2); break; case OPR_BXOR: codearith(fs, OP_BXOR, e1, e2); break;
case OPR_BSHL: codearith(fs, OP_BSHL, e1, e2); break; case OPR_BSHL: codearith(fs, OP_BSHL, e1, e2); break;
case OPR_BSHR: codearith(fs, OP_BSHR, e1, e2); break; case OPR_BSHR: codearith(fs, OP_BSHR, e1, e2); break;
case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV: case OPR_ADD: codearith(fs, OP_ADD, e1, e2); break;
case OPR_MOD: case OPR_POW: { case OPR_SUB: codearith(fs, OP_SUB, e1, e2); break;
codearith(fs, op - OPR_ADD + OP_ADD, e1, e2); case OPR_MUL: codearith(fs, OP_MUL, e1, e2); break;
break; case OPR_DIV: codearith(fs, OP_DIV, e1, e2); break;
} case OPR_MOD: codearith(fs, OP_MOD, e1, e2); break;
case OPR_EQ: case OPR_LT: case OPR_LE: { case OPR_POW: codearith(fs, OP_POW, e1, e2); break;
codecomp(fs, op - OPR_EQ + OP_EQ, 1, e1, e2); case OPR_EQ: codecomp(fs, OP_EQ, 1, e1, e2); break;
break; case OPR_NE: codecomp(fs, OP_EQ, 0, e1, e2); break;
} case OPR_LT: codecomp(fs, OP_LT, 1, e1, e2); break;
case OPR_NE: case OPR_GT: case OPR_GE: { case OPR_LE: codecomp(fs, OP_LE, 1, e1, e2); break;
codecomp(fs, op - OPR_NE + OP_EQ, 0, e1, e2); case OPR_GT: codecomp(fs, OP_LT, 0, e1, e2); break;
break; case OPR_GE: codecomp(fs, OP_LE, 0, e1, e2); break;
}
default: lua_assert(0); default: lua_assert(0);
} }
} }
+3 -3
View File
@@ -21,13 +21,13 @@
/* /*
** grep "ORDER OPR" if you change these enums (ORDER OP) ** grep "ORDER OPR" if you change these enums
*/ */
typedef enum BinOpr { typedef enum BinOpr {
OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW, OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW,
OPR_CONCAT, OPR_CONCAT,
OPR_EQ, OPR_LT, OPR_LE, OPR_NE, OPR_EQ,
OPR_NE, OPR_GT, OPR_GE, OPR_LT, OPR_LE, OPR_GT, OPR_GE,
OPR_AND, OPR_OR, OPR_AND, OPR_OR,
OPR_BAND, OPR_BOR, OPR_BXOR, OPR_BAND, OPR_BOR, OPR_BXOR,
OPR_BSHL, OPR_BSHR, OPR_BSHL, OPR_BSHR,
+5 -28
View File
@@ -542,39 +542,16 @@ static const char *getobjname (lua_State *L, CallInfo *ci, int stackpos,
static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) { static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {
TMS tm = 0;
Instruction i; Instruction i;
if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1)) if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1))
return NULL; /* calling function is not Lua (or is unknown) */ return NULL; /* calling function is not Lua (or is unknown) */
ci--; /* calling function */ ci--; /* calling function */
i = ci_func(ci)->l.p->code[currentpc(L, ci)]; i = ci_func(ci)->l.p->code[currentpc(L, ci)];
switch (GET_OPCODE(i)) { if (GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL ||
case OP_CALL: GET_OPCODE(i) == OP_TFORLOOP)
case OP_TAILCALL: return getobjname(L, ci, GETARG_A(i), name);
case OP_TFORLOOP: else
return getobjname(L, ci, GETARG_A(i), name); return NULL; /* no useful name can be found */
case OP_GETGLOBAL:
case OP_SELF:
case OP_GETTABLE: tm = TM_INDEX; break;
case OP_SETGLOBAL:
case OP_SETTABLE: tm = TM_NEWINDEX; break;
case OP_EQ: tm = TM_EQ; break;
case OP_ADD: tm = TM_ADD; break;
case OP_SUB: tm = TM_SUB; break;
case OP_MUL: tm = TM_MUL; break;
case OP_DIV: tm = TM_DIV; break;
case OP_MOD: tm = TM_MOD; break;
case OP_POW: tm = TM_POW; break;
case OP_UNM: tm = TM_UNM; break;
case OP_LEN: tm = TM_LEN; break;
case OP_LT: tm = TM_LT; break;
case OP_LE: tm = TM_LE; break;
case OP_CONCAT: tm = TM_CONCAT; break;
default:
return NULL; /* else no useful name can be found */
}
*name = getstr(G(L)->tmname[tm]);
return "metamethod";
} }
+4 -4
View File
@@ -55,8 +55,8 @@ struct lua_longjmp {
void luaD_seterrorobj (lua_State *L, int lerrcode, StkId oldtop) { void luaD_seterrorobj (lua_State *L, int lerrcode, StkId oldtop) {
switch (lerrcode) { switch (lerrcode) {
case LUA_ERRMEM: { /* memory error? */ case LUA_ERRMEM: {
setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */ setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG));
break; break;
} }
case LUA_ERRERR: { case LUA_ERRERR: {
@@ -164,7 +164,7 @@ void luaD_reallocCI (lua_State *L, int newsize) {
void luaD_growstack (lua_State *L, int n) { void luaD_growstack (lua_State *L, int n) {
if (n <= L->stacksize) /* double size is enough? */ if (l_likely(n <= L->stacksize)) /* double size is enough? */
luaD_reallocstack(L, 2*L->stacksize); luaD_reallocstack(L, 2*L->stacksize);
else else
luaD_reallocstack(L, L->stacksize + n); luaD_reallocstack(L, L->stacksize + n);
@@ -318,7 +318,7 @@ int luaD_precall (lua_State *L, StkId func, int nresults) {
ci->top = L->top + LUA_MINSTACK; ci->top = L->top + LUA_MINSTACK;
lua_assert(ci->top <= L->stack_last); lua_assert(ci->top <= L->stack_last);
ci->nresults = nresults; ci->nresults = nresults;
if (l_unlikely(L->hookmask & LUA_MASKCALL)) if (L->hookmask & LUA_MASKCALL)
luaD_callhook(L, LUA_HOOKCALL, -1); luaD_callhook(L, LUA_HOOKCALL, -1);
lua_unlock(L); lua_unlock(L);
n = (*curr_func(L)->c.f)(L); /* do the actual call */ n = (*curr_func(L)->c.f)(L); /* do the actual call */
-1
View File
@@ -544,7 +544,6 @@ static void atomic (lua_State *L) {
marktmu(g); /* mark `preserved' userdata */ marktmu(g); /* mark `preserved' userdata */
udsize += propagateall(g); /* remark, to propagate `preserveness' */ udsize += propagateall(g); /* remark, to propagate `preserveness' */
cleartable(g->weak); /* remove collected objects from weak tables */ cleartable(g->weak); /* remove collected objects from weak tables */
luaS_clearcache(g);
/* flip current white */ /* flip current white */
g->currentwhite = cast_byte(otherwhite(g)); g->currentwhite = cast_byte(otherwhite(g));
g->sweepstrgc = 0; g->sweepstrgc = 0;
+9 -10
View File
@@ -356,21 +356,20 @@ static int read_line (lua_State *L, FILE *f) {
static int read_chars (lua_State *L, FILE *f, size_t n) { static int read_chars (lua_State *L, FILE *f, size_t n) {
size_t tbr = n; /* number of chars to be read */ size_t rlen; /* how much to read */
size_t rlen; /* how much to read in each cycle */ size_t nr; /* number of chars actually read */
size_t nr; /* number of chars actually read in each cycle */
luaL_Buffer b; luaL_Buffer b;
luaL_buffinit(L, &b); luaL_buffinit(L, &b);
rlen = LUAL_BUFFERSIZE; /* try to read that much each time */ rlen = LUAL_BUFFERSIZE; /* try to read that much each time */
do { do {
char *p = luaL_prepbuffer(&b); char *p = luaL_prepbuffer(&b);
if (rlen > tbr) rlen = tbr; /* cannot read more than asked */ if (rlen > n) rlen = n; /* cannot read more than asked */
nr = fread(p, sizeof(char), rlen, f); nr = fread(p, sizeof(char), rlen, f);
luaL_addsize(&b, nr); luaL_addsize(&b, nr);
tbr -= nr; /* still have to read 'tbr' chars */ n -= nr; /* still have to read `n' chars */
} while (tbr > 0 && nr == rlen); /* until end of count or eof */ } while (n > 0 && nr == rlen); /* until end of count or eof */
luaL_pushresult(&b); /* close buffer */ luaL_pushresult(&b); /* close buffer */
return (tbr == 0 || tbr < n); /* true iff read something */ return (n == 0 || lua_objlen(L, -1) > 0);
} }
@@ -433,13 +432,13 @@ static int f_read (lua_State *L) {
static int io_readline (lua_State *L) { static int io_readline (lua_State *L) {
FILE *f = *(FILE **)lua_touserdata(L, lua_upvalueindex(1)); FILE *f = *(FILE **)lua_touserdata(L, lua_upvalueindex(1));
int success; int sucess;
if (f == NULL) /* file is already closed? */ if (f == NULL) /* file is already closed? */
luaL_error(L, "file is already closed"); luaL_error(L, "file is already closed");
success = read_line(L, f); sucess = read_line(L, f);
if (ferror(f)) if (ferror(f))
return luaL_error(L, "%s", strerror(errno)); return luaL_error(L, "%s", strerror(errno));
if (success) return 1; if (sucess) return 1;
else { /* EOF */ else { /* EOF */
if (lua_toboolean(L, lua_upvalueindex(2))) { /* generator created file? */ if (lua_toboolean(L, lua_upvalueindex(2))) { /* generator created file? */
lua_settop(L, 0); lua_settop(L, 0);
-30
View File
@@ -41,25 +41,6 @@ typedef unsigned char lu_byte;
*/ */
#define IntPoint(p) ((unsigned int)(lu_mem)(p)) #define IntPoint(p) ((unsigned int)(lu_mem)(p))
/*
** conversion of pointer to unsigned integer: this is for hashing only;
** there is no problem if the integer cannot hold the whole pointer
** value. (In strict ISO C this may cause undefined behavior, but no
** actual machine seems to bother.)
*/
#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \
__STDC_VERSION__ >= 199901L
#include <stdint.h>
#if defined(UINTPTR_MAX) /* even in C99 this type is optional */
#define L_P2I uintptr_t
#else /* no 'intptr'? */
#define L_P2I uintmax_t /* use the largest available integer */
#endif
#else /* C89 option */
#define L_P2I size_t
#endif
#define point2uint(p) ((unsigned int)((L_P2I)(p) & UINT_MAX))
/* type to ensure maximum alignment */ /* type to ensure maximum alignment */
@@ -119,17 +100,6 @@ typedef lu_int32 Instruction;
#endif #endif
/*
** Size of cache for strings in the API. 'N' is the number of
** sets (better be a prime) and "M" is the size of each set (M == 1
** makes a direct cache.)
*/
#ifndef STRCACHE_N
#define STRCACHE_N 53
#define STRCACHE_M 2
#endif
/* minimum size for string buffer */ /* minimum size for string buffer */
#ifndef LUA_MINBUFFER #ifndef LUA_MINBUFFER
#define LUA_MINBUFFER 32 #define LUA_MINBUFFER 32
+2
View File
@@ -13,6 +13,8 @@
#include "llimits.h" #include "llimits.h"
#include "lua.h" #include "lua.h"
#define MEMERRMSG "not enough memory"
#define luaM_reallocv(L,b,on,n,e) \ #define luaM_reallocv(L,b,on,n,e) \
((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ? /* +1 to avoid warnings */ \ ((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ? /* +1 to avoid warnings */ \
+4 -4
View File
@@ -881,10 +881,10 @@ static const struct {
lu_byte right; /* right priority */ lu_byte right; /* right priority */
} priority[] = { /* ORDER OPR */ } priority[] = { /* ORDER OPR */
{6, 6}, {6, 6}, {7, 7}, {7, 7}, {7, 7}, /* `+' `-' `/' `%' */ {6, 6}, {6, 6}, {7, 7}, {7, 7}, {7, 7}, /* `+' `-' `/' `%' */
{10, 9}, {5, 4}, /* ^, .. (right associative) */ {10, 9}, {5, 4}, /* power and concat (right associative) */
{3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */ {3, 3}, {3, 3}, /* equality and inequality */
{3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */ {3, 3}, {3, 3}, {3, 3}, {3, 3}, /* order */
{2, 2}, {1, 1} /* and, or */ {2, 2}, {1, 1} /* logical (and/or) */
,{6, 6}, {6, 6}, {6, 6}, /* bit-wise (band/bor/bxor) */ ,{6, 6}, {6, 6}, {6, 6}, /* bit-wise (band/bor/bxor) */
{7, 7}, {7, 7} /* shl/shr */ {7, 7}, {7, 7} /* shl/shr */
}; };
+2 -1
View File
@@ -73,9 +73,10 @@ static void f_luaopen (lua_State *L, void *ud) {
stack_init(L, L); /* init stack */ stack_init(L, L); /* init stack */
sethvalue(L, gt(L), luaH_new(L, 0, 2)); /* table of globals */ sethvalue(L, gt(L), luaH_new(L, 0, 2)); /* table of globals */
sethvalue(L, registry(L), luaH_new(L, 0, 2)); /* registry */ sethvalue(L, registry(L), luaH_new(L, 0, 2)); /* registry */
luaS_init(L); luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */
luaT_init(L); luaT_init(L);
luaX_init(L); luaX_init(L);
luaS_fix(luaS_newliteral(L, MEMERRMSG));
g->GCthreshold = 4*g->totalbytes; g->GCthreshold = 4*g->totalbytes;
} }
-2
View File
@@ -88,11 +88,9 @@ typedef struct global_State {
lua_CFunction panic; /* to be called in unprotected errors */ lua_CFunction panic; /* to be called in unprotected errors */
TValue l_registry; TValue l_registry;
struct lua_State *mainthread; struct lua_State *mainthread;
TString *memerrmsg; /* memory-error message */
UpVal uvhead; /* head of double-linked list of all open upvalues */ UpVal uvhead; /* head of double-linked list of all open upvalues */
struct Table *mt[NUM_TAGS]; /* metatables for basic types */ struct Table *mt[NUM_TAGS]; /* metatables for basic types */
TString *tmname[TM_N]; /* array with tag-method names */ TString *tmname[TM_N]; /* array with tag-method names */
TString *strcache[STRCACHE_N][STRCACHE_M]; /* cache for strings in API */
} global_State; } global_State;
+4 -118
View File
@@ -18,9 +18,6 @@
#include "lstring.h" #include "lstring.h"
#define MEMERRMSG "not enough memory"
void luaS_resize (lua_State *L, int newsize) { void luaS_resize (lua_State *L, int newsize) {
GCObject **newhash; GCObject **newhash;
@@ -54,7 +51,7 @@ static TString *newlstr (lua_State *L, const char *str, size_t l,
unsigned int h) { unsigned int h) {
TString *ts; TString *ts;
stringtable *tb; stringtable *tb;
if (l_unlikely(l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char))) if (l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char))
luaM_toobig(L); luaM_toobig(L);
ts = cast(TString *, luaM_malloc(L, (l+1)*sizeof(char)+sizeof(TString))); ts = cast(TString *, luaM_malloc(L, (l+1)*sizeof(char)+sizeof(TString)));
ts->tsv.len = l; ts->tsv.len = l;
@@ -75,106 +72,18 @@ static TString *newlstr (lua_State *L, const char *str, size_t l,
} }
/* TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
** Clear API string cache. (Entries cannot be empty, so fill them with GCObject *o;
** a non-collectable string.)
*/
void luaS_clearcache (global_State *g) {
int i, j;
for (i = 0; i < STRCACHE_N; i++)
for (j = 0; j < STRCACHE_M; j++) {
if (luaS_iswhite(g->strcache[i][j])) /* will entry be collected? */
g->strcache[i][j] = g->memerrmsg; /* replace it with something fixed */
}
}
/*
** Initialize the string table and the string cache
*/
void luaS_init (lua_State *L) {
global_State *g = G(L);
int i, j;
luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */
/* pre-create memory-error message */
g->memerrmsg = luaS_newliteral(L, MEMERRMSG);
luaS_fix(g->memerrmsg); /* it should never be collected */
for (i = 0; i < STRCACHE_N; i++) /* fill cache with valid strings */
for (j = 0; j < STRCACHE_M; j++)
g->strcache[i][j] = g->memerrmsg;
}
// string hash taken from luaJIT
/* Unaligned load of uint32_t. */
static inline __attribute__((always_inline)) uint32_t getu32(const void* ptr)
{
uint32_t result;
memcpy(&result, ptr, 4);
return result;
}
// smol macro to look a little less messy lul
#define getu8(p) *cast(const uint8_t *, p)
/* Keyed sparse ARX string hash. Constant time. */
static unsigned hash_sparse(const char *str, size_t len)
{
/* Constants taken from lookup3 hash by Bob Jenkins. */
unsigned int a, b, h = cast(unsigned int, len);
#define rol(x, n) (((x)<<(n)) | ((x)>>(-cast(int, n)&(8*sizeof(x)-1))))
if (len >= 4) { /* Caveat: unaligned access! */
a = getu32(str);
h ^= getu32(str+len-4);
b = getu32(str+(len>>1)-2);
h ^= b; h -= rol(b, 14);
b += getu32(str+(len>>2)-1);
} else if (len > 0) {
a = getu8(str);
h ^= getu8(str+len-1);
b = getu8(str+(len>>1));
h ^= b; h -= rol(b, 14);
} else {
return 0;
}
a ^= h; a -= rol(h, 11);
b ^= a; b -= rol(a, 25);
h ^= b; h -= rol(b, 16);
#undef rol
return h;
}
#undef getu8
static inline __attribute__((always_inline)) unsigned luaS_hash (const char *str, size_t l) {
#if 0
unsigned int h = cast(unsigned int, l); /* seed */ unsigned int h = cast(unsigned int, l); /* seed */
size_t step = (l>>5)+1; /* if string is too long, don't hash all its chars */ size_t step = (l>>5)+1; /* if string is too long, don't hash all its chars */
size_t l1; size_t l1;
for (l1=l; l1>=step; l1-=step) /* compute hash */ for (l1=l; l1>=step; l1-=step) /* compute hash */
h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1])); h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1]));
return h;
#else
return hash_sparse(str, l);
#endif
}
/*
** new string (with explicit length)
*/
TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
GCObject *o;
unsigned int h = luaS_hash(str, l);
for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)]; for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)];
o != NULL; o != NULL;
o = o->gch.next) { o = o->gch.next) {
TString *ts = rawgco2ts(o); TString *ts = rawgco2ts(o);
if (ts->tsv.hash == h && if (l_unlikely(ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0))) {
ts->tsv.len == l &&
(memcmp(str, getstr(ts), l) == 0)) {
/* string may be dead */ /* string may be dead */
if (isdead(G(L), o)) changewhite(o); if (isdead(G(L), o)) changewhite(o);
return ts; return ts;
@@ -184,29 +93,6 @@ TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
} }
/*
** Create or reuse a zero-terminated string, first checking in the
** cache (using the string address as a key). The cache can contain
** only zero-terminated strings, so it is safe to use 'strcmp' to
** check hits.
*/
TString *luaS_new (lua_State *L, const char *str) {
unsigned int i = point2uint(str) % STRCACHE_N; /* hash */
int j;
TString **p = G(L)->strcache[i];
for (j = 0; j < STRCACHE_M; j++) {
if (strcmp(str, getstr(p[j])) == 0) /* hit? */
return p[j]; /* that is it */
}
/* normal route */
for (j = STRCACHE_M - 1; j > 0; j--)
p[j] = p[j - 1]; /* move out last element */
/* new element is first in the list */
p[0] = luaS_newlstr(L, str, strlen(str));
return p[0];
}
Udata *luaS_newudata (lua_State *L, size_t s, Table *e) { Udata *luaS_newudata (lua_State *L, size_t s, Table *e) {
Udata *u; Udata *u;
if (l_unlikely(s > MAX_SIZET - sizeof(Udata))) if (l_unlikely(s > MAX_SIZET - sizeof(Udata)))
+2 -6
View File
@@ -17,19 +17,15 @@
#define sizeudata(u) (sizeof(union Udata)+(u)->len) #define sizeudata(u) (sizeof(union Udata)+(u)->len)
//#define luaS_new(L, s) (luaS_newlstr(L, s, strlen(s))) #define luaS_new(L, s) (luaS_newlstr(L, s, strlen(s)))
#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \ #define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \
(sizeof(s)/sizeof(char))-1)) (sizeof(s)/sizeof(char))-1))
#define luaS_iswhite(x) test2bits((x)->tsv.marked, WHITE0BIT, WHITE1BIT) #define luaS_fix(s) l_setbit((s)->tsv.marked, FIXEDBIT)
#define luaS_fix(s) l_setbit((s)->tsv.marked, FIXEDBIT)
LUAI_FUNC void luaS_resize (lua_State *L, int newsize); LUAI_FUNC void luaS_resize (lua_State *L, int newsize);
LUAI_FUNC void luaS_clearcache (global_State *g);
LUAI_FUNC void luaS_init (lua_State *L);
LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e); LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e);
LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l);
LUAI_FUNC TString *luaS_new (lua_State *L, const char *str);
#endif #endif
-7
View File
@@ -81,7 +81,6 @@ static /*const*/ Node dummynode_ = {
/* /*
** hash for lua_Numbers ** hash for lua_Numbers
*/ */
#if 0
static Node *hashnum (const Table *t, lua_Number n) { static Node *hashnum (const Table *t, lua_Number n) {
unsigned int a[numints]; unsigned int a[numints];
int i; int i;
@@ -91,12 +90,6 @@ static Node *hashnum (const Table *t, lua_Number n) {
for (i = 1; i < numints; i++) a[0] += a[i]; for (i = 1; i < numints; i++) a[0] += a[i];
return hashmod(t, a[0]); return hashmod(t, a[0]);
} }
#else
// our lua_Number is just typedef´d int32 so no need to do any of the above
static inline Node *hashnum (const Table *t, lua_Number n) {
return hashmod(t, cast(unsigned int, n));
}
#endif
+38 -98
View File
@@ -28,7 +28,7 @@
/* limit for table tag-method chains (to avoid infinite loops) */ /* limit for table tag-method chains (to avoid loops) */
#define MAXTAGLOOP 100 #define MAXTAGLOOP 100
@@ -105,42 +105,27 @@ static void callTM (lua_State *L, const TValue *f, const TValue *p1,
} }
/* void luaV_gettable (lua_State *L, TValue *t, TValue *key, StkId val) {
** Finish the table access 'val = t[key]'. int loop;
** 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) {
int loop; /* counter to avoid infinite loops */
TValue *tm; /* metamethod */
for (loop = 0; loop < MAXTAGLOOP; loop++) { for (loop = 0; loop < MAXTAGLOOP; loop++) {
if (slot == NULL) { /* 't' is not a table? */ TValue *tm;
lua_assert(!ttistable(t)); if (ttistable(t)) { /* `t' is a table? */
tm = luaT_gettmbyobj(L, t, TM_INDEX); Table *h = hvalue(t);
if (l_unlikely(ttisnil(tm))) const TValue *res = luaH_get(h, key); /* do a primitive get */
luaG_typeerror(L, t, "index"); /* no metamethod */ if (!ttisnil(res) || /* result is no nil? */
/* else will try the metamethod */ (tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */
} setobj2s(L, val, res);
else { /* 't' is a table */
lua_assert(ttisnil(slot));
tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); /* table's metamethod */
if (tm == NULL) { /* no metamethod? */
setnilvalue(val); /* result is nil */
return; return;
} }
/* else will try the metamethod */ /* else will try the tag method */
} }
if (ttisfunction(tm)) { /* is metamethod a function? */ else if (l_unlikely(ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))))
callTMres(L, val, tm, t, key); /* call it */ luaG_typeerror(L, t, "index");
if (ttisfunction(tm)) {
callTMres(L, val, tm, t, key);
return; return;
} }
t = tm; /* else try to access 'tm[key]' */ t = tm; /* else repeat with `tm' */
if (luaV_fastget(L, t, key, slot, luaH_get)) { /* fast track? */
setobj2s(L, val, slot); /* done */
return;
}
/* else repeat (tail call 'luaV_finishget') */
} }
luaG_runerror(L, "loop in gettable"); luaG_runerror(L, "loop in gettable");
} }
@@ -154,12 +139,8 @@ void luaV_settable (lua_State *L, TValue *t, TValue *key, StkId val) {
Table *h = hvalue(t); Table *h = hvalue(t);
TValue *oldval = luaH_set(L, h, key); /* do a primitive set */ TValue *oldval = luaH_set(L, h, key); /* do a primitive set */
/* oldval is nil=> look for newindex, oldval is not nil => look for usedindex */ /* oldval is nil=> look for newindex, oldval is not nil => look for usedindex */
if (ttisnil(oldval)) { if (!((ttisnil(oldval) && ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) != NULL)) ||
tm = fasttm(L, h->metatable, TM_NEWINDEX); /* get metamethod */ ((!ttisnil(oldval)) && ((tm = fasttm(L, h->metatable, TM_USEDINDEX)) != NULL)))) {
} else {
tm = fasttm(L, h->metatable, TM_USEDINDEX);
}
if (tm == NULL) { /* no metamethod? */
setobj2t(L, oldval, val); setobj2t(L, oldval, val);
luaC_barriert(L, h, val); luaC_barriert(L, h, val);
return; return;
@@ -385,7 +366,6 @@ static void Arith (lua_State *L, StkId ra, TValue *rb,
#define arith_op(op,tm) { \ #define arith_op(op,tm) { \
StkId ra = RA(i); \
TValue *rb = RKB(i); \ TValue *rb = RKB(i); \
TValue *rc = RKC(i); \ TValue *rc = RKC(i); \
if (ttisnumber(rb) && ttisnumber(rc)) { \ if (ttisnumber(rb) && ttisnumber(rc)) { \
@@ -397,14 +377,6 @@ static void Arith (lua_State *L, StkId ra, TValue *rb,
} }
/*
** copy of 'luaV_gettable', but protecting call to potential metamethod
** (which can reallocate the stack)
*/
#define gettableProtected(L,t,k,v) { TValue *slot; \
if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \
else Protect(luaV_finishget(L,t,k,v,slot)); }
void luaV_execute (lua_State *L, int nexeccalls) { void luaV_execute (lua_State *L, int nexeccalls) {
LClosure *cl; LClosure *cl;
@@ -414,12 +386,13 @@ void luaV_execute (lua_State *L, int nexeccalls) {
reentry: /* entry point */ reentry: /* entry point */
lua_assert(isLua(L->ci)); lua_assert(isLua(L->ci));
pc = L->savedpc; pc = L->savedpc;
cl = &clvalue(L->ci->func)->l; /* local reference to function's closure */ cl = &clvalue(L->ci->func)->l;
k = cl->p->k; /* local reference to function's constant table */ base = L->base;
base = L->base; /* local copy of function's base */ k = cl->p->k;
/* main loop of interpreter */ /* main loop of interpreter */
for (;;) { for (;;) {
const Instruction i = *pc++; const Instruction i = *pc++;
StkId ra;
if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) && if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) &&
(--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) {
traceexec(L, pc); traceexec(L, pc);
@@ -429,28 +402,26 @@ void luaV_execute (lua_State *L, int nexeccalls) {
} }
base = L->base; base = L->base;
} }
/* warning!! several calls may realloc the stack and invalidate `ra' */
ra = RA(i);
lua_assert(base == L->base && L->base == L->ci->base); lua_assert(base == L->base && L->base == L->ci->base);
lua_assert(base <= L->top && L->top <= L->stack + L->stacksize); lua_assert(base <= L->top && L->top <= L->stack + L->stacksize);
lua_assert(L->top == L->ci->top || luaG_checkopenop(i)); lua_assert(L->top == L->ci->top || luaG_checkopenop(i));
switch (GET_OPCODE(i)) { switch (GET_OPCODE(i)) {
case OP_MOVE: { case OP_MOVE: {
StkId ra = RA(i);
setobjs2s(L, ra, RB(i)); setobjs2s(L, ra, RB(i));
continue; continue;
} }
case OP_LOADK: { case OP_LOADK: {
StkId ra = RA(i);
setobj2s(L, ra, KBx(i)); setobj2s(L, ra, KBx(i));
continue; continue;
} }
case OP_LOADBOOL: { case OP_LOADBOOL: {
StkId ra = RA(i);
setbvalue(ra, GETARG_B(i)); setbvalue(ra, GETARG_B(i));
if (GETARG_C(i)) pc++; /* skip next instruction (if C) */ if (GETARG_C(i)) pc++; /* skip next instruction (if C) */
continue; continue;
} }
case OP_LOADNIL: { case OP_LOADNIL: {
StkId ra = RA(i);
TValue *rb = RB(i); TValue *rb = RB(i);
do { do {
setnilvalue(rb--); setnilvalue(rb--);
@@ -458,13 +429,11 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_GETUPVAL: { case OP_GETUPVAL: {
StkId ra = RA(i);
int b = GETARG_B(i); int b = GETARG_B(i);
setobj2s(L, ra, cl->upvals[b]->v); setobj2s(L, ra, cl->upvals[b]->v);
continue; continue;
} }
case OP_GETGLOBAL: { case OP_GETGLOBAL: {
StkId ra = RA(i);
TValue g; TValue g;
TValue *rb = KBx(i); TValue *rb = KBx(i);
sethvalue(L, &g, cl->env); sethvalue(L, &g, cl->env);
@@ -473,14 +442,10 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_GETTABLE: { case OP_GETTABLE: {
StkId ra = RA(i); Protect(luaV_gettable(L, RB(i), RKC(i), ra));
StkId rb = RB(i);
TValue *rc = RKC(i);
gettableProtected(L, rb, rc, ra);
continue; continue;
} }
case OP_SETGLOBAL: { case OP_SETGLOBAL: {
StkId ra = RA(i);
TValue g; TValue g;
sethvalue(L, &g, cl->env); sethvalue(L, &g, cl->env);
lua_assert(ttisstring(KBx(i))); lua_assert(ttisstring(KBx(i)));
@@ -488,21 +453,16 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_SETUPVAL: { case OP_SETUPVAL: {
StkId ra = RA(i);
UpVal *uv = cl->upvals[GETARG_B(i)]; UpVal *uv = cl->upvals[GETARG_B(i)];
setobj(L, uv->v, ra); setobj(L, uv->v, ra);
luaC_barrier(L, uv, ra); luaC_barrier(L, uv, ra);
continue; continue;
} }
case OP_SETTABLE: { case OP_SETTABLE: {
StkId ra = RA(i); Protect(luaV_settable(L, ra, RKB(i), RKC(i)));
TValue *rb = RKB(i);
TValue *rc = RKC(i);
Protect(luaV_settable(L, ra, rb, rc));
continue; continue;
} }
case OP_NEWTABLE: { case OP_NEWTABLE: {
StkId ra = RA(i);
int b = GETARG_B(i); int b = GETARG_B(i);
int c = GETARG_C(i); int c = GETARG_C(i);
sethvalue(L, ra, luaH_new(L, luaO_fb2int(b), luaO_fb2int(c))); sethvalue(L, ra, luaH_new(L, luaO_fb2int(b), luaO_fb2int(c)));
@@ -510,11 +470,9 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_SELF: { case OP_SELF: {
StkId ra = RA(i);
StkId rb = RB(i); StkId rb = RB(i);
TValue *rc = RKC(i); setobjs2s(L, ra+1, rb);
setobjs2s(L, ra + 1, rb); Protect(luaV_gettable(L, rb, RKC(i), ra));
gettableProtected(L, rb, rc, ra);
continue; continue;
} }
case OP_ADD: { case OP_ADD: {
@@ -530,7 +488,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_DIV: { case OP_DIV: {
StkId ra = RA(i);
TValue *rb = RKB(i); TValue *rb = RKB(i);
TValue *rc = RKC(i); TValue *rc = RKC(i);
if (ttisnumber(rb) && ttisnumber(rc)) { if (ttisnumber(rb) && ttisnumber(rc)) {
@@ -546,7 +503,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_MOD: { case OP_MOD: {
StkId ra = RA(i);
TValue *rb = RKB(i); TValue *rb = RKB(i);
TValue *rc = RKC(i); TValue *rc = RKC(i);
if (ttisnumber(rb) && ttisnumber(rc)) { if (ttisnumber(rb) && ttisnumber(rc)) {
@@ -566,27 +522,26 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_BAND: { case OP_BAND: {
arith_op(luai_numand, TM_AND); arith_op(luai_numand, TM_AND);
continue; continue;
} }
case OP_BOR: { case OP_BOR: {
arith_op(luai_numor, TM_OR); arith_op(luai_numor, TM_OR);
continue; continue;
} }
case OP_BXOR: { case OP_BXOR: {
arith_op(luai_numxor, TM_XOR); arith_op(luai_numxor, TM_XOR);
continue; continue;
} }
case OP_BSHL: { case OP_BSHL: {
arith_op(luai_numshl, TM_SHL); arith_op(luai_numshl, TM_SHL);
continue; continue;
} }
case OP_BSHR: { case OP_BSHR: {
arith_op(luai_numshr, TM_SHR); arith_op(luai_numshr, TM_SHR);
continue; continue;
} }
case OP_BNOT: { case OP_BNOT: {
StkId ra = RA(i);
TValue *rb = RB(i); TValue *rb = RB(i);
if (ttisnumber(rb)) { if (ttisnumber(rb)) {
lua_Number nb = nvalue(rb); lua_Number nb = nvalue(rb);
@@ -598,7 +553,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_UNM: { case OP_UNM: {
StkId ra = RA(i);
TValue *rb = RB(i); TValue *rb = RB(i);
if (ttisnumber(rb)) { if (ttisnumber(rb)) {
lua_Number nb = nvalue(rb); lua_Number nb = nvalue(rb);
@@ -610,13 +564,11 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_NOT: { case OP_NOT: {
StkId ra = RA(i);
int res = l_isfalse(RB(i)); /* next assignment may change this value */ int res = l_isfalse(RB(i)); /* next assignment may change this value */
setbvalue(ra, res); setbvalue(ra, res);
continue; continue;
} }
case OP_LEN: { case OP_LEN: {
StkId ra = RA(i);
TValue *rb = RB(i); TValue *rb = RB(i);
switch (ttype(rb)) { switch (ttype(rb)) {
case LUA_TTABLE: { case LUA_TTABLE: {
@@ -674,14 +626,12 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_TEST: { case OP_TEST: {
StkId ra = RA(i);
if (l_isfalse(ra) != GETARG_C(i)) if (l_isfalse(ra) != GETARG_C(i))
dojump(L, pc, GETARG_sBx(*pc)); dojump(L, pc, GETARG_sBx(*pc));
pc++; pc++;
continue; continue;
} }
case OP_TESTSET: { case OP_TESTSET: {
StkId ra = RA(i);
TValue *rb = RB(i); TValue *rb = RB(i);
if (l_isfalse(rb) != GETARG_C(i)) { if (l_isfalse(rb) != GETARG_C(i)) {
setobjs2s(L, ra, rb); setobjs2s(L, ra, rb);
@@ -691,7 +641,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_CALL: { case OP_CALL: {
StkId ra = RA(i);
int b = GETARG_B(i); int b = GETARG_B(i);
int nresults = GETARG_C(i) - 1; int nresults = GETARG_C(i) - 1;
if (b != 0) L->top = ra+b; /* else previous instruction set top */ if (b != 0) L->top = ra+b; /* else previous instruction set top */
@@ -713,7 +662,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
} }
} }
case OP_TAILCALL: { case OP_TAILCALL: {
StkId ra = RA(i);
int b = GETARG_B(i); int b = GETARG_B(i);
if (b != 0) L->top = ra+b; /* else previous instruction set top */ if (b != 0) L->top = ra+b; /* else previous instruction set top */
L->savedpc = pc; L->savedpc = pc;
@@ -746,7 +694,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
} }
} }
case OP_RETURN: { case OP_RETURN: {
StkId ra = RA(i);
int b = GETARG_B(i); int b = GETARG_B(i);
if (b != 0) L->top = ra+b-1; if (b != 0) L->top = ra+b-1;
if (L->openupval) luaF_close(L, base); if (L->openupval) luaF_close(L, base);
@@ -762,7 +709,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
} }
} }
case OP_FORLOOP: { case OP_FORLOOP: {
StkId ra = RA(i);
lua_Number step = nvalue(ra+2); lua_Number step = nvalue(ra+2);
lua_Number idx = luai_numadd(nvalue(ra), step); /* increment index */ lua_Number idx = luai_numadd(nvalue(ra), step); /* increment index */
lua_Number limit = nvalue(ra+1); lua_Number limit = nvalue(ra+1);
@@ -775,7 +721,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_FORPREP: { case OP_FORPREP: {
StkId ra = RA(i);
const TValue *init = ra; const TValue *init = ra;
const TValue *plimit = ra+1; const TValue *plimit = ra+1;
const TValue *pstep = ra+2; const TValue *pstep = ra+2;
@@ -792,7 +737,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_TFORLOOP: { case OP_TFORLOOP: {
StkId ra = RA(i);
StkId cb = ra + 3; /* call base */ StkId cb = ra + 3; /* call base */
setobjs2s(L, cb+2, ra+2); setobjs2s(L, cb+2, ra+2);
setobjs2s(L, cb+1, ra+1); setobjs2s(L, cb+1, ra+1);
@@ -809,7 +753,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_SETLIST: { case OP_SETLIST: {
StkId ra = RA(i);
int n = GETARG_B(i); int n = GETARG_B(i);
int c = GETARG_C(i); int c = GETARG_C(i);
int last; int last;
@@ -832,12 +775,10 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_CLOSE: { case OP_CLOSE: {
StkId ra = RA(i);
luaF_close(L, ra); luaF_close(L, ra);
continue; continue;
} }
case OP_CLOSURE: { case OP_CLOSURE: {
StkId ra = RA(i);
Proto *p; Proto *p;
Closure *ncl; Closure *ncl;
int nup, j; int nup, j;
@@ -858,7 +799,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue; continue;
} }
case OP_VARARG: { case OP_VARARG: {
StkId ra = RA(i);
int b = GETARG_B(i) - 1; int b = GETARG_B(i) - 1;
int j; int j;
CallInfo *ci = L->ci; CallInfo *ci = L->ci;
+2 -24
View File
@@ -22,34 +22,12 @@
(ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2)) (ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2))
/*
** fast track for 'gettable': if 't' is a table and 't[k]' is not nil,
** return 1 with 'slot' pointing to 't[k]' (final result). Otherwise,
** return 0 (meaning it will have to check metamethod) with 'slot'
** pointing to a nil 't[k]' (if 't' is a table) or NULL (otherwise).
** 'f' is the raw get function to use.
*/
#define luaV_fastget(L,t,k,slot,f) \
(!ttistable(t) \
? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \
: (slot = f(hvalue(t), k), /* else, do raw access */ \
!ttisnil(slot))) /* result not nil? */
/*
** standard implementation for 'gettable'
*/
#define luaV_gettable(L,t,k,v) { TValue *slot; \
if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \
else luaV_finishget(L,t,k,v,slot); }
LUAI_FUNC int luaV_lessthan (lua_State *L, TValue *l, TValue *r); 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 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 const TValue *luaV_tonumber (const TValue *obj, TValue *n);
LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj); LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj);
LUAI_FUNC void luaV_finishget (lua_State *L, TValue *t, TValue *key, LUAI_FUNC void luaV_gettable (lua_State *L, TValue *t, TValue *key,
StkId val, TValue *tm); StkId val);
LUAI_FUNC void luaV_settable (lua_State *L, TValue *t, TValue *key, LUAI_FUNC void luaV_settable (lua_State *L, TValue *t, TValue *key,
StkId val); StkId val);
LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls); LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls);
+4 -66
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 FNV1a_HashLowercaseString
#define CMPR_FN vt_cmpr_casestring
#include "verstable.h"
#define NAME netvar_map_t
#define KEY_TY UINT16
#define VAL_TY consvar_t *
#define HASH_FN vt_hash_integer
#define CMPR_FN vt_cmpr_integer
#include "verstable.h"
static cvar_map_t cvar_map;
static netvar_map_t netvar_map;
CONSTRUCTOR static void CV_InitMap(void)
{
// ensure the map is initialized
cvar_map_t_init(&cvar_map);
cvar_map_t_reserve(&cvar_map, 512);
netvar_map_t_init(&netvar_map);
netvar_map_t_reserve(&netvar_map, 256);
}
DESTRUCTOR static void CV_DestroyMap(void)
{
cvar_map_t_cleanup(&cvar_map);
netvar_map_t_cleanup(&netvar_map);
}
static const char *cv_null_string = ""; static const char *cv_null_string = "";
/** Searches if a variable has been registered. /** Searches if a variable has been registered.
@@ -1208,17 +1175,11 @@ static const char *cv_null_string = "";
*/ */
consvar_t *CV_FindVar(const char *name) 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; consvar_t *cvar;
for (cvar = consvar_vars; cvar; cvar = cvar->next) for (cvar = consvar_vars; cvar; cvar = cvar->next)
if (fasticmp(name, cvar->name)) if (fasticmp(name,cvar->name))
return cvar; return cvar;
*/
return NULL; return NULL;
} }
@@ -1233,7 +1194,7 @@ consvar_t *CV_FindVar(const char *name)
static inline UINT16 CV_ComputeNetid(const char *s) static inline UINT16 CV_ComputeNetid(const char *s)
{ {
UINT16 ret = 0, i = 0; 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) while (*s)
{ {
@@ -1252,17 +1213,11 @@ static inline UINT16 CV_ComputeNetid(const char *s)
*/ */
static consvar_t *CV_FindNetVar(UINT16 netid) 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; consvar_t *cvar;
for (cvar = consvar_vars; cvar; cvar = cvar->next) for (cvar = consvar_vars; cvar; cvar = cvar->next)
if (cvar->netid == netid) if (cvar->netid == netid)
return cvar; return cvar;
*/
if (netid == 44542) // ouch this hack if (netid == 44542) // ouch this hack
return &cv_karteliminatelast; return &cv_karteliminatelast;
@@ -1328,11 +1283,6 @@ void CV_RegisterVar(consvar_t *variable)
// the SetValue will set this bit // the SetValue will set this bit
variable->flags &= ~CV_MODIFIED; 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. /** Finds the string value of a console variable.
@@ -1638,21 +1588,9 @@ size_t CV_LoadNetVars(const UINT8 *bufstart)
// prevent "invalid command received" // prevent "invalid command received"
serverloading = true; 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) for (cvar = consvar_vars; cvar; cvar = cvar->next)
if (cvar->flags & CV_NETVAR) if (cvar->flags & CV_NETVAR)
Setvalue(cvar, cvar->defaultvalue, true); Setvalue(cvar, cvar->defaultvalue, true);
*/
count = READUINT16(p); count = READUINT16(p);
while (count--) while (count--)
@@ -1855,7 +1793,7 @@ void CV_AddValue(consvar_t *var, INT32 increment)
if (newvalue == oldvalue) if (newvalue == oldvalue)
break; // don't loop forever if there's none of a certain gametype break; // don't loop forever if there's none of a certain gametype
if (newvalue >= 0 && newvalue < NUMMAPS && !mapheaderinfo[newvalue]) if (newvalue >= 0 && !mapheaderinfo[newvalue])
continue; // Don't allocate the header. That just makes memory usage skyrocket. continue; // Don't allocate the header. That just makes memory usage skyrocket.
} while (!M_CanShowLevelInList(newvalue, gt)); } while (!M_CanShowLevelInList(newvalue, gt));
+84 -197
View File
@@ -44,18 +44,18 @@
#define MAXHUDLINES 20 #define MAXHUDLINES 20
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_mutex con_mutex; 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 // to avoid infinite SIGABRT recursion in the signal handler
// due to poisoned locks or mach-o kernel not supporting locks in signals // due to poisoned locks or mach-o kernel not supporting locks in signals
// or something like that. idk // or something like that. idk
# define Lock_state() if (!I_In_Exiting_Signal_Handler()) { I_lock_mutex(&con_mutex); } # define Lock_state() if (!g_in_exiting_signal_handler) { I_LockMutex(&con_mutex); }
# define Unlock_state() if (!I_In_Exiting_Signal_Handler()) { I_unlock_mutex(con_mutex); } # define Unlock_state() if (!g_in_exiting_signal_handler) { I_UnlockMutex(con_mutex); }
#else /*HAVE_THREADS*/ #else/*HAVE_THREADS*/
# define Lock_state() # define Lock_state()
# define Unlock_state() # define Unlock_state()
#endif /*HAVE_THREADS*/ #endif/*HAVE_THREADS*/
static boolean con_started = false; // console has been initialised static boolean con_started = false; // console has been initialised
boolean con_startup = false; // true at game startup, screen need refreshing boolean con_startup = false; // true at game startup, screen need refreshing
@@ -208,6 +208,14 @@ static void CONS_Clear_f(void)
Unlock_state(); Unlock_state();
} }
// Choose english keymap
//
/*static void CONS_English_f(void)
{
shiftxform = english_shiftxform;
CONS_Printf(M_GetText("%s keymap.\n"), M_GetText("English"));
}*/
static char *bindtable[NUMINPUTS]; static char *bindtable[NUMINPUTS];
static void CONS_Bind_f(void) static void CONS_Bind_f(void)
@@ -625,191 +633,72 @@ void CON_MoveConsole(void)
Unlock_state(); Unlock_state();
} }
//======================================================================
// KEYBOARD LAYOUTS FOR ENTERING TEXT
//======================================================================
static char english_shiftxform[] =
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31,
' ', '!', '"', '#', '$', '%', '&',
'"', // shift-'
'(', ')', '*', '+',
'<', // shift-,
'_', // shift--
'>', // shift-.
'?', // shift-/
')', // shift-0
'!', // shift-1
'@', // shift-2
'#', // shift-3
'$', // shift-4
'%', // shift-5
'^', // shift-6
'&', // shift-7
'*', // shift-8
'(', // shift-9
':',
':', // shift-;
'<',
'+', // shift-=
'>', '?', '@',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'{', // shift-[
'|', // shift-backslash - OH MY GOD DOES WATCOM SUCK
'}', // shift-]
'"', '_',
'~', // shift-`
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'{', '|', '}', '~', 127
};
static char french_shiftxform[] =
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31,
' ','$', //shift-!
'3', //shift-"
'#', '$', '%',
'1', //shift-&
'4', // shift-'
'5', // shift-(
')', // shift-)
'*', '+',
'?', // shift-,
'6', // shift--
'.', '/',
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9',
'/', // shitf-:
'.', // shift-;
'>', // shift-<
'+', // shift-=
'>', '?', '@',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'[', '\\', ']', '^',
'8', //shift-_
'`',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'{', '|', '}', '~', 127,
128, 129,
'2',
131, 132,
'0',
134,
'9',
136, 137,
'7',
139, 140,
'%'
};
static char french_altgrxform[] =
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31,
' ', '!',
'#', //altgr-"
'#', '$', '%', '&',
'{', //altgr-'
'[', //altgr-(
']', //altgr-)
'*', '+', ',',
'|', //altg--
'.', '/',
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9',
':', ';', '<',
'}', //altgr-=
'>', '?', '@',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'[', '\\', ']', '^',
'\\', //altgr-backslash
'`',
'a', 'b', 'c', 'd', 'E', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'{', '|', '}', '~', 127,
128, 129,
'~',
131, 132,
'@',
134,
'^',
136, 137,
'`',
139, 140,
KEY_FR_U_GRAVE
};
// fallback for special letter non displayable in the game (i.e.: 'é','à',etc.)
static INT32 CON_FallBackFrSpecialLetter(INT32 key)
{
switch (key)
{
case KEY_FR_E_AIGUE: return 'e';
case KEY_FR_E_GRAVE: return 'e';
case KEY_FR_C_CEDILLE: return 'c';
case KEY_FR_A_GRAVE: return 'a';
case KEY_FR_U_GRAVE: return 'u';
default: return key;
}
}
// goddang AZERTY
static size_t CON_GetShiftSize(void)
{
return ((cv_keyboardlayout.value == 3) ? sizeof(french_shiftxform) : sizeof(english_shiftxform));
}
static char *CON_Shiftform(void)
{
return (cv_keyboardlayout.value == 3) ? french_shiftxform : english_shiftxform;
}
INT32 CON_ShiftChar(INT32 ch) INT32 CON_ShiftChar(INT32 ch)
{ {
if (I_UseNativeKeyboard() || ch >= (INT32)CON_GetShiftSize()) if (I_UseNativeKeyboard())
return ch; return ch;
// warning: shiftdown is NOT a boolean, it's 1 or 2 for lshift/rshift
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
{ {
return !!shiftdown != capslock ? CON_Shiftform()[ch] : ch; if (cv_keyboardlayout.value == 3)
{
if (shiftdown ^ capslock)
ch = shiftxform[ch];
else if (altdown & 0x2)
ch = french_altgrxform[ch];
else
ch = HU_FallBackFrSpecialLetter(ch);
}
else
{
if (shiftdown ^ capslock)
ch = shiftxform[ch];
}
} }
else // if we're holding shift we should still shift non letter symbols
// if we're holding shift we should still shift non letter symbols
if (shiftdown)
{ {
return CON_Shiftform()[ch]; if (cv_keyboardlayout.value == 3)
} {
if (shiftdown)
// AZERTY ch = shiftxform[ch];
if (cv_keyboardlayout.value == 3) else if (altdown & 0x2)
{ ch = french_altgrxform[ch];
if (altdown & 0x2) else
return french_altgrxform[ch]; ch = HU_FallBackFrSpecialLetter(ch);
}
return CON_FallBackFrSpecialLetter(ch); else
{
if (shiftdown)
ch = shiftxform[ch];
}
} }
return 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 // Clear time of console heads up messages
// //
@@ -1003,7 +892,7 @@ boolean CON_Responder(event_t *ev)
return true; return true;
// ctrl modifier -- changes behavior, adds shortcuts // 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 // show all cvars/commands that match what we have inputted
if (key == KEY_TAB) if (key == KEY_TAB)
@@ -1333,10 +1222,19 @@ void CON_LogMessage(const char *msg)
// Console print! Wahooo! Lots o fun! // 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; 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 // echo console prints to log file
DEBFILE(txt); DEBFILE(txt);
@@ -1362,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, ...) void CONS_Alert(alerttype_t level, const char *fmt, ...)
{ {
va_list argptr; va_list argptr;
@@ -1405,7 +1288,9 @@ void CONS_Alert(alerttype_t level, const char *fmt, ...)
break; 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, ...) void CONS_Debug(INT32 debugflags, const char *fmt, ...)
@@ -1423,9 +1308,11 @@ void CONS_Debug(INT32 debugflags, const char *fmt, ...)
vsnprintf(txt, 8192, fmt, argptr); vsnprintf(txt, 8192, fmt, argptr);
va_end(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. // Print an error message, and wait for ENTER key to continue.
// To make sure the user has seen the message // To make sure the user has seen the message
// //
+2 -9
View File
@@ -13,10 +13,6 @@
#ifndef __CONSOLE__ #ifndef __CONSOLE__
#define __CONSOLE__ #define __CONSOLE__
#ifdef __cplusplus
extern "C" {
#endif
#include "d_event.h" #include "d_event.h"
#include "command.h" #include "command.h"
#include "i_threads.h" #include "i_threads.h"
@@ -26,7 +22,7 @@ void CON_Init(void);
boolean CON_Responder(event_t *ev); boolean CON_Responder(event_t *ev);
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
extern I_mutex con_mutex; extern I_Mutex con_mutex;
#endif #endif
// set true when screen size has changed, to adapt console // set true when screen size has changed, to adapt console
@@ -49,6 +45,7 @@ extern UINT8 *yellowmap, *purplemap, *greenmap, *bluemap, *graymap, *redmap, *or
extern UINT8 *consolebgmap; extern UINT8 *consolebgmap;
INT32 CON_ShiftChar(INT32 ch); INT32 CON_ShiftChar(INT32 ch);
INT32 CON_ShitAndAltGrChar(INT32 ch);
void CON_SetupBackColormap(void); void CON_SetupBackColormap(void);
void CON_ClearHUD(void); // clear heads up messages void CON_ClearHUD(void); // clear heads up messages
@@ -66,8 +63,4 @@ boolean CON_Ready(void);
void CON_LogMessage(const char *msg); void CON_LogMessage(const char *msg);
#ifdef __cplusplus
} // extern "C"
#endif
#endif #endif
+381 -526
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_serverinfoscreen;
extern consvar_t cv_serveraddoninfo;
// Used in d_net, the only dependence // Used in d_net, the only dependence
//tic_t ExpandTics(INT32 low, tic_t basetic); //tic_t ExpandTics(INT32 low, tic_t basetic);
void D_ClientServerInit(void); void D_ClientServerInit(void);
@@ -656,17 +654,15 @@ void D_ResetTiccmds(void);
tic_t GetLag(INT32 node); tic_t GetLag(INT32 node);
extern boolean hu_resynching; extern UINT8 hu_resynching;
#ifdef SATURNPAK #ifdef SATURNPAK
extern boolean hu_redownloadinggamestate; extern UINT8 hu_redownloadinggamestate;
#endif #endif
extern boolean hu_stopped; // kart, true when the game is stopped for players due to a disconnecting or connecting player 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 typedef struct rewind_s
{ {
UINT8 savebuffer[SAVEGAMESIZE]; UINT8 savebuffer[(768*1024)];
tic_t leveltime; tic_t leveltime;
size_t demopos; size_t demopos;
+94 -111
View File
@@ -130,15 +130,14 @@ static size_t startuppwadcount = 0;
// autoloading // autoloading
static char *autoloadwadfiles[MAX_WADFILES]; static char *autoloadwadfiles[MAX_WADFILES];
static char *autoloadwadfilespost[MAX_WADFILES]; static char *autoloadwadfilespost[MAX_WADFILES];
static size_t autoloadwadcount = 0; static size_t autoloadcount = 0;
static size_t postloadwadcount = 0; static size_t postloadcount = 0;
// //
boolean devparm = false; // started game with -devparm boolean devparm = false; // started game with -devparm
boolean singletics = false; // timedemo boolean singletics = false; // timedemo
boolean lastdraw = false; boolean lastdraw = false;
boolean intermissionbginit = false;
#ifdef MOTIONBLUR #ifdef MOTIONBLUR
INT32 postimgparam[MAXSPLITSCREENPLAYERS]; INT32 postimgparam[MAXSPLITSCREENPLAYERS];
@@ -224,13 +223,13 @@ void D_ProcessEvents(void)
// Menu input // Menu input
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&m_menu_mutex); I_LockMutex(&m_menu_mutex);
#endif #endif
{ {
eaten = M_Responder(ev); eaten = M_Responder(ev);
} }
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_unlock_mutex(m_menu_mutex); I_UnlockMutex(m_menu_mutex);
#endif #endif
if (eaten) if (eaten)
@@ -245,13 +244,13 @@ void D_ProcessEvents(void)
// console input // console input
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&con_mutex); I_LockMutex(&con_mutex);
#endif #endif
{ {
eaten = CON_Responder(ev); eaten = CON_Responder(ev);
} }
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_unlock_mutex(con_mutex); I_UnlockMutex(con_mutex);
#endif #endif
if (eaten) if (eaten)
@@ -275,17 +274,21 @@ static void D_Renderview(void)
R_ApplyLevelInterpolators(R_GetTimeFrac(RTF_LEVEL)); R_ApplyLevelInterpolators(R_GetTimeFrac(RTF_LEVEL));
if (rendermode == render_soft && cv_homremoval.value) if (rendermode == render_soft)
{ {
if (cv_homremoval.value == 1) // if this is display player 1
if (cv_homremoval.value)
{ {
// Clear the software screen buffer to remove HOM if (cv_homremoval.value == 1)
memset(vid.screens[0], 31, vid.width * vid.height); {
} // Clear the software screen buffer to remove HOM
else if (cv_homremoval.value == 2) memset(vid.screens[0], 31, vid.width * vid.height);
{ }
//'development' HOM removal -- makes it blindingly obvious if HOM is spotted. else if (cv_homremoval.value == 2)
memset(vid.screens[0], 32+(timeinmap&15), vid.width * vid.height); {
//'development' HOM removal -- makes it blindingly obvious if HOM is spotted.
memset(vid.screens[0], 32+(timeinmap&15), vid.width * vid.height);
}
} }
} }
@@ -319,6 +322,7 @@ static void D_Renderview(void)
break; break;
default: // Initialize for P1 default: // Initialize for P1
viewwindowy = viewwindowx = 0; viewwindowy = viewwindowx = 0;
objectsdrawn = 0;
break; break;
} }
@@ -329,17 +333,19 @@ static void D_Renderview(void)
} }
else if (rendermode == render_soft) else if (rendermode == render_soft)
#endif #endif
{
R_RenderPlayerView(&players[displayplayers[i]]); R_RenderPlayerView(&players[displayplayers[i]]);
}
if (rendermode == render_soft)
{
if (i == 0)
R_ApplyViewMorph();
if (i == 0)
R_ApplyViewMorph();
#ifdef MOTIONBLUR #ifdef MOTIONBLUR
V_DoPostProcessor(i, postimgparam[i]); V_DoPostProcessor(i, postimgparam[i]);
#else #else
V_DoPostProcessor(i, 0); V_DoPostProcessor(i, 0);
#endif #endif
}
} }
} }
@@ -363,33 +369,6 @@ static void D_Renderview(void)
// added comment : there is a wipe eatch change of the gamestate // added comment : there is a wipe eatch change of the gamestate
gamestate_t wipegamestate = GS_LEVEL; gamestate_t wipegamestate = GS_LEVEL;
static void D_MakeIntermissionBG(void)
{
if (!lastdraw)
return;
if (rendermode == render_none)
{
lastdraw = false;
intermissionbginit = false;
return;
}
#ifdef HWRENDER
if (rendermode == render_opengl)
{
HWR_MakeScreenTexture();
}
else
#endif
{
VID_BlitLinearScreen(vid.screens[0], vid.screens[1], vid.width, vid.height, vid.width, vid.width);
}
lastdraw = false;
intermissionbginit = true;
}
static boolean D_Display(void) static boolean D_Display(void)
{ {
boolean ranwipe = false; boolean ranwipe = false;
@@ -555,8 +534,16 @@ static boolean D_Display(void)
PS_START_TIMING(ps_rendercalltime); PS_START_TIMING(ps_rendercalltime);
D_Renderview(); D_Renderview();
PS_STOP_TIMING(ps_rendercalltime); PS_STOP_TIMING(ps_rendercalltime);
}
D_MakeIntermissionBG(); if (lastdraw)
{
if (rendermode == render_soft)
{
VID_BlitLinearScreen(vid.screens[0], vid.screens[1], vid.width, vid.height, vid.width, vid.width);
}
lastdraw = false;
} }
PS_START_TIMING(ps_uitime); PS_START_TIMING(ps_uitime);
@@ -590,11 +577,11 @@ static boolean D_Display(void)
vid.recalc = false; vid.recalc = false;
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&m_menu_mutex); I_LockMutex(&m_menu_mutex);
#endif #endif
M_Drawer(); // menu is drawn even on top of everything... M_Drawer(); // menu is drawn even on top of everything...
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_unlock_mutex(m_menu_mutex); I_UnlockMutex(m_menu_mutex);
#endif #endif
// focus lost moved to M_Drawer // focus lost moved to M_Drawer
@@ -722,15 +709,8 @@ void D_SRB2Loop(void)
precise_t elapsed; precise_t elapsed;
precise_t enterprecise, finishprecise; precise_t enterprecise, finishprecise;
boolean ranwipe = false;
enterprecise = I_GetPreciseTime(); enterprecise = I_GetPreciseTime();
if (I_Interrupted())
{
I_Quit();
}
memset(&g_dc, 0, sizeof(g_dc)); memset(&g_dc, 0, sizeof(g_dc));
Z_Frame_Reset(); Z_Frame_Reset();
@@ -738,6 +718,8 @@ void D_SRB2Loop(void)
const UINT32 framecap = R_GetFramerateCap(); const UINT32 framecap = R_GetFramerateCap();
capbudget = (framecap == 0) ? 0 : (precise_t)((double)precision / (double)framecap + 0.5); // + 0.5 instead of round capbudget = (framecap == 0) ? 0 : (precise_t)((double)precision / (double)framecap + 0.5); // + 0.5 instead of round
boolean ranwipe = false;
I_UpdateTime(cv_timescale.value); I_UpdateTime(cv_timescale.value);
if (lastwipetic) if (lastwipetic)
@@ -801,6 +783,11 @@ void D_SRB2Loop(void)
doDisplay = true; doDisplay = true;
} }
if (!dedicated)
{
G_DeviceLEDTick();
}
} }
if (interp) if (interp)
@@ -842,13 +829,6 @@ void D_SRB2Loop(void)
if (takescreenshot) if (takescreenshot)
M_DoScreenShot(); M_DoScreenShot();
#ifndef DEDICATED
if (!dedicated && renderisnewtic)
{
G_DeviceLEDTick();
}
#endif
// consoleplayer -> displayplayers (hear sounds from viewpoint) // consoleplayer -> displayplayers (hear sounds from viewpoint)
S_UpdateSounds(); // move positional sounds S_UpdateSounds(); // move positional sounds
@@ -1057,38 +1037,25 @@ static INT32 D_DetectFileType(const char* filename)
} }
// autoload that shit // 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; char *newfile;
INT32 fileType = D_DetectFileType(file); 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) if (!fileType)
{ {
CONS_Printf("D_AutoloadFile: File %s is unknown or invalid\n", file); CONS_Printf("D_AutoloadFile: File %s is unknown or invalid\n", file);
return; return;
} }
if (fileType == 1)
{
CONS_Printf("D_AutoloadFile: File %s is a directory\n", file);
return;
}
if (fileType <= 6) if (fileType <= 6)
{ {
newfile = malloc(strlen(file) + 1); newfile = malloc(strlen(file) + 1);
if (!newfile) 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); strcpy(newfile, file);
filearray[*index] = newfile; filearray[index] = newfile;
(*index)++;
} }
else else
{ {
@@ -1131,7 +1098,7 @@ static void D_FindAddonsToAutoload(void)
// If the file is found, run our shit // If the file is found, run our shit
if (!autoloadconfigfile) // nope outta here 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; return;
} }
@@ -1157,34 +1124,27 @@ static void D_FindAddonsToAutoload(void)
if (newline) if (newline)
*newline = '\0'; *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)) 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; postload = true;
} }
// LOAD IT // LOAD IT
if (!postload) if (!postload)
{ {
D_AutoloadFile(wadsToAutoload, autoloadwadfiles, &autoloadwadcount); D_AutoloadFile(wadsToAutoload, autoloadwadfiles, autoloadcount);
autoloadcount++;
} }
else else
{ {
D_AutoloadFile(wadsToAutoload, autoloadwadfilespost, &postloadwadcount); D_AutoloadFile(wadsToAutoload, autoloadwadfilespost, postloadcount);
postloadcount++;
} }
} }
autoloadwadfiles[autoloadwadcount] = NULL; autoloadwadfiles[autoloadcount] = NULL;
autoloadwadfilespost[postloadwadcount] = NULL; autoloadwadfilespost[postloadcount] = NULL;
// we dont want memory leaks around here do we? // we dont want memory leaks around here do we?
fclose(autoloadconfigfile); fclose(autoloadconfigfile);
@@ -1193,7 +1153,7 @@ static void D_FindAddonsToAutoload(void)
static void D_AddAutoloadFiles(void) static void D_AddAutoloadFiles(void)
{ {
// nothing to autoload // nothing to autoload
if (autoloadwadcount == 0) if (autoloadcount == 0)
return; return;
CONS_Printf("D_AutoloadFile(): Loading autoloaded addons...\n"); CONS_Printf("D_AutoloadFile(): Loading autoloaded addons...\n");
@@ -1201,15 +1161,15 @@ static void D_AddAutoloadFiles(void)
if (W_AddAutoloadedLocalFiles(autoloadwadfiles) == 0) if (W_AddAutoloadedLocalFiles(autoloadwadfiles) == 0)
CONS_Printf("D_AutoloadFile(): Are you sure you put in valid files or what?\n"); 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) void D_AddPostloadFiles(void)
{ {
// nothing to postload // nothing to postload
if (postloadwadcount == 0 || !netgame) if (postloadcount == 0 || !netgame)
return; return;
CONS_Printf("D_AddPostloadFiles(): Loading postloaded addons...\n"); CONS_Printf("D_AddPostloadFiles(): Loading postloaded addons...\n");
@@ -1217,9 +1177,9 @@ void D_AddPostloadFiles(void)
if (W_AddAutoloadedLocalFiles(autoloadwadfilespost) == 0) if (W_AddAutoloadedLocalFiles(autoloadwadfilespost) == 0)
CONS_Printf("D_AddPostloadFiles(): Are you sure you put in valid files or what?\n"); 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;
} }
// ========================================================================== // ==========================================================================
@@ -1228,7 +1188,7 @@ void D_AddPostloadFiles(void)
static boolean AddIWAD(const char * file, const char *dir) 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)) if (FIL_ReadFileOK(path))
{ {
@@ -1405,6 +1365,8 @@ static inline void D_MakeTitleString(char *s)
// extra graphic patches for saturn specific thingies // extra graphic patches for saturn specific thingies
boolean xtra_speedo = false; // extra speedometer check boolean xtra_speedo = false; // extra speedometer check
boolean xtra_speedo_clr = false; // extra speedometer colour check boolean xtra_speedo_clr = false; // extra speedometer colour check
boolean xtra_speedo3 = false; // 80x 11 extra speedometer check
boolean xtra_speedo_clr3 = false; // 80x 11 extra speedometer colour check
boolean achi_speedo = false; // achiiro speedometer check boolean achi_speedo = false; // achiiro speedometer check
boolean achi_speedo_clr = false; // extra speedometer colour check boolean achi_speedo_clr = false; // extra speedometer colour check
boolean dial_speedo = false; // dial speedometer check boolean dial_speedo = false; // dial speedometer check
@@ -1434,6 +1396,7 @@ static void D_CheckSaturnExtraFiles(void)
CV_PossibleValue_t minimapdot_cons_temp[NUMMINIMAPDOTSTUFF] = {{0, "Off"}, {0, NULL}, {0, NULL}, {0, NULL}, {0, NULL}}; CV_PossibleValue_t minimapdot_cons_temp[NUMMINIMAPDOTSTUFF] = {{0, "Off"}, {0, NULL}, {0, NULL}, {0, NULL}, {0, NULL}};
unsigned last_speedo_i = 0; unsigned last_speedo_i = 0;
unsigned last_driftgauge_i = 3;
unsigned last_inputdisplay_i = 2; unsigned last_inputdisplay_i = 2;
unsigned last_minimapdot_i = 0; unsigned last_minimapdot_i = 0;
#define PUSHCONS(cons, i, id, name) { ++i; cons[i].value = id; cons[i].strvalue = name; } #define PUSHCONS(cons, i, id, name) { ++i; cons[i].value = id; cons[i].strvalue = name; }
@@ -1592,6 +1555,20 @@ static void D_CheckSaturnExtraFiles(void)
if (found_extra3_kart) if (found_extra3_kart)
{ {
mainwads++; mainwads++;
// 80x11 speedometer crap
if (W_LumpExists("SP_SM3TC"))
{
xtra_speedo3 = true;
PUSHCONS(speedo_cons_temp, last_speedo_i, 7, "Extra");
PUSHCONS(driftgaugestyle_cons_temp, last_driftgauge_i, 5, "Extra");
}
// 80x11 speedometer crap but colour
if (W_LumpExists("SC_SM3TC"))
{
xtra_speedo_clr3 = true;
}
} }
#undef PUSHCONS #undef PUSHCONS
@@ -1666,6 +1643,12 @@ void D_SRB2Main(void)
strcpy(srb2, "SRB2Kart"); strcpy(srb2, "SRB2Kart");
D_MakeTitleString(srb2); D_MakeTitleString(srb2);
#if defined (__OS2__) && !defined (HAVE_SDL)
// set PM window title
snprintf(pmData->title, sizeof (pmData->title), "SRB2Kart" VERSIONSTRING ": %s", title);
pmData->title[sizeof (pmData->title) - 1] = '\0';
#endif
if (devparm) if (devparm)
CONS_Printf(M_GetText("Development mode ON.\n")); CONS_Printf(M_GetText("Development mode ON.\n"));
@@ -1789,6 +1772,10 @@ void D_SRB2Main(void)
// Setup default unlockable conditions // Setup default unlockable conditions
M_SetupDefaultConditionSets(); M_SetupDefaultConditionSets();
// Setup character tables
// Have to be done here before files are loaded
M_InitCharacterTables();
// load wad, including the main wad file // load wad, including the main wad file
CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n"); CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n");
@@ -2042,13 +2029,9 @@ void D_SRB2Main(void)
if (M_CheckProtoParam("replay")) if (M_CheckProtoParam("replay"))
{ {
const char *replayurl = M_GetProtoParam(); const char *replayurl = M_GetProtoParam();
char *replayname = strrchr(replayurl, '/');
if (!replayurl) if (!replayname || !replayurl)
I_Error("REPLAY: Invalid URL.");
gconst char *replayname = strrchr(replayurl, '/');
if (!replayname)
I_Error("REPLAY: Invalid URL."); I_Error("REPLAY: Invalid URL.");
#define REPLAYDIR "/DownloadedReplays/" #define REPLAYDIR "/DownloadedReplays/"
@@ -2162,8 +2145,8 @@ void D_SRB2Main(void)
if (dedicated && server) if (dedicated && server)
{ {
levelstarttic = gametic;
G_SetGamestate(GS_LEVEL); G_SetGamestate(GS_LEVEL);
if (!P_SetupLevel(false, false)) if (!P_SetupLevel(false, false))
I_Quit(); // fail so reset game stuff I_Quit(); // fail so reset game stuff
} }
+2
View File
@@ -38,6 +38,8 @@ extern boolean found_extra3_kart; // for use in k_kart.c
extern boolean xtra_speedo; // extra speedometer check extern boolean xtra_speedo; // extra speedometer check
extern boolean xtra_speedo_clr; // extra speedometer colour check extern boolean xtra_speedo_clr; // extra speedometer colour check
extern boolean xtra_speedo3; // 80x11 extra speedometer check
extern boolean xtra_speedo_clr3; // 80x11 extra speedometer colour check
extern boolean achi_speedo; // achiiro speedometer check extern boolean achi_speedo; // achiiro speedometer check
extern boolean achi_speedo_clr; // extra speedometer colour check extern boolean achi_speedo_clr; // extra speedometer colour check
extern boolean dial_speedo; // dial speedometer check extern boolean dial_speedo; // dial speedometer check
+5 -1
View File
@@ -612,8 +612,12 @@ void Net_WaitAllAckReceived(UINT32 timeout)
static void InitNode(node_t *node) 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->nextacknum = 1;
node->remotefirstack = 0;
node->flags = 0;
} }
static void InitAck(void) static void InitAck(void)
+1
View File
@@ -27,6 +27,7 @@ extern "C" {
// SINT8 is used for nodes sometimes >:( // SINT8 is used for nodes sometimes >:(
#define MAXNETNODES 127 #define MAXNETNODES 127
#define BROADCASTADDR MAXNETNODES #define BROADCASTADDR MAXNETNODES
#define NETSPLITSCREEN // Kart's splitscreen netgame feature
#define STATLENGTH (TICRATE*2) #define STATLENGTH (TICRATE*2)
+502 -197
View File
File diff suppressed because it is too large. Load diff
+10 -3
View File
@@ -21,7 +21,10 @@ extern "C" {
#include "command.h" #include "command.h"
void SendWeaponPref(UINT8 splitplayer); void SendWeaponPref(void);
void SendWeaponPref2(void);
void SendWeaponPref3(void);
void SendWeaponPref4(void);
// console vars // console vars
extern consvar_t cv_playername; extern consvar_t cv_playername;
@@ -93,6 +96,11 @@ extern consvar_t cv_pause;
extern consvar_t cv_restrictskinchange, cv_allowteamchange, cv_ingamecap, cv_respawntime; extern consvar_t cv_restrictskinchange, cv_allowteamchange, cv_ingamecap, cv_respawntime;
extern consvar_t cv_spectatorreentry, cv_antigrief; extern consvar_t cv_spectatorreentry, cv_antigrief;
/*extern consvar_t cv_teleporters, cv_superring, cv_supersneakers, cv_invincibility;
extern consvar_t cv_jumpshield, cv_watershield, cv_ringshield, cv_forceshield, cv_bombshield;
extern consvar_t cv_1up, cv_eggmanbox;
extern consvar_t cv_recycler;*/
// SRB2kart items // SRB2kart items
extern consvar_t cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana; extern consvar_t cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana;
extern consvar_t cv_eggmanmonitor, cv_orbinaut, cv_jawz, cv_mine; extern consvar_t cv_eggmanmonitor, cv_orbinaut, cv_jawz, cv_mine;
@@ -150,7 +158,6 @@ extern consvar_t cv_pingstyle;
//extern consvar_t cv_smallpos; //extern consvar_t cv_smallpos;
extern consvar_t cv_showminimapnames; extern consvar_t cv_showminimapnames;
extern consvar_t cv_showminimapfinished;
extern consvar_t cv_minihead; extern consvar_t cv_minihead;
extern consvar_t cv_showminimapangle; extern consvar_t cv_showminimapangle;
@@ -288,7 +295,7 @@ typedef union {
// add game commands, needs cleanup // add game commands, needs cleanup
void D_RegisterServerCommands(void); void D_RegisterServerCommands(void);
void D_RegisterClientCommands(void); void D_RegisterClientCommands(void);
void D_SendPlayerConfig(UINT8 splitplayer); void D_SendPlayerConfig(void);
void Command_ExitGame_f(void); void Command_ExitGame_f(void);
void Command_Retry_f(void); void Command_Retry_f(void);
void D_GameTypeChanged(INT32 lastgametype); // not a real _OnChange function anymore void D_GameTypeChanged(INT32 lastgametype); // not a real _OnChange function anymore
+23 -72
View File
@@ -112,12 +112,10 @@ static fileused_t transferFiles[UINT8_MAX + 1];
INT32 fileneedednum = 0; // Number of files needed to join the server INT32 fileneedednum = 0; // Number of files needed to join the server
fileneeded_t fileneeded[MAX_WADFILES] = {}; // List of needed files fileneeded_t fileneeded[MAX_WADFILES] = {}; // List of needed files
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
static I_mutex downloadmutex; static I_Mutex downloadmutex;
#endif #endif
char downloaddir[512] = "DOWNLOAD"; char downloaddir[512] = "DOWNLOAD";
INT32 addontypes[NUMADDONTYPES] = {0};
file_download_t filedownload = {}; file_download_t filedownload = {};
#ifdef HAVE_CURL #ifdef HAVE_CURL
@@ -137,8 +135,6 @@ HTTP_login *curl_logins = NULL;
static void CURLGetFile(void); static void CURLGetFile(void);
#endif #endif
static addontype_t GetAddonType(const char *name);
/** Fills a serverinfo packet with information about wad files loaded. /** Fills a serverinfo packet with information about wad files loaded.
* *
* \todo Give this function a better name since it is in global scope. * \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].willsend = (UINT8)(filestatus >> 4);
fileneeded[i].totalsize = READUINT32(p); // The four next bytes are the file size fileneeded[i].totalsize = READUINT32(p); // The four next bytes are the file size
fileneeded[i].file = NULL; // The file isn't open yet 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 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 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 // Load it now
boolean CL_LoadServerFiles(void) boolean CL_LoadServerFiles(void)
{ {
@@ -1009,7 +960,7 @@ void Got_Filetxpak(void)
|| fastcmp(filename, "music.kart") || fastcmp(filename, "music.kart")
|| fastcmp(filename, "patch.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) if (filenum >= fileneedednum)
{ {
@@ -1068,21 +1019,21 @@ void Got_Filetxpak(void)
switch(file->status) switch(file->status)
{ {
case FS_NOTFOUND: case FS_NOTFOUND:
s = "FS_NOTFOUND"; s = "FS_NOTFOUND";
break; break;
case FS_FOUND: case FS_FOUND:
s = "FS_FOUND"; s = "FS_FOUND";
break; break;
case FS_OPEN: case FS_OPEN:
s = "FS_OPEN"; s = "FS_OPEN";
break; break;
case FS_MD5SUMBAD: case FS_MD5SUMBAD:
s = "FS_MD5SUMBAD"; s = "FS_MD5SUMBAD";
break; break;
default: default:
s = "unknown"; s = "unknown";
break; break;
} }
I_Error("Received a file not requested (file id: %d, file status: %s)\n", filenum, s); I_Error("Received a file not requested (file id: %d, file status: %s)\n", filenum, s);
@@ -1476,7 +1427,7 @@ void CURLPrepareFile(const char* url, int dfilenum)
filedownload.http_running = true; filedownload.http_running = true;
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_spawn_thread("http-download", (I_thread_fn)CURLGetFile, NULL); (void)!I_SpawnThread("http-download", (I_ThreadFn)CURLGetFile, NULL);
#endif #endif
} }
else else
@@ -1489,15 +1440,15 @@ void CURLAbortFile(void)
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
// lock and unlock to wait for the download thread to exit // lock and unlock to wait for the download thread to exit
I_lock_mutex(&downloadmutex); I_LockMutex(&downloadmutex);
I_unlock_mutex(downloadmutex); I_UnlockMutex(downloadmutex);
#endif #endif
} }
static void CURLGetFile(void) static void CURLGetFile(void)
{ {
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&downloadmutex); I_LockMutex(&downloadmutex);
#endif #endif
CURLMcode mc; /* return code used by curl_multi_wait() */ CURLMcode mc; /* return code used by curl_multi_wait() */
CURLcode easyres; /* Return from easy interface */ CURLcode easyres; /* Return from easy interface */
@@ -1598,7 +1549,7 @@ static void CURLGetFile(void)
filedownload.http_running = false; filedownload.http_running = false;
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_unlock_mutex(downloadmutex); I_UnlockMutex(downloadmutex);
#endif #endif
} }
-12
View File
@@ -40,15 +40,6 @@ typedef enum
FS_FALLBACK, // HTTP failed FS_FALLBACK, // HTTP failed
} filestatus_t; } filestatus_t;
typedef enum addontype_e
{
ADDON_SCRIPT,
ADDON_MAP,
ADDON_CHARACTER,
ADDON_MISC,
NUMADDONTYPES,
} addontype_t;
typedef struct typedef struct
{ {
UINT8 willsend; // Is the server willing to send it? UINT8 willsend; // Is the server willing to send it?
@@ -60,13 +51,11 @@ typedef struct
UINT32 totalsize; UINT32 totalsize;
filestatus_t status; // The value returned by recsearch filestatus_t status; // The value returned by recsearch
boolean justdownloaded; // To prevent late fragments from causing an I_Error boolean justdownloaded; // To prevent late fragments from causing an I_Error
addontype_t type;
} fileneeded_t; } fileneeded_t;
extern INT32 fileneedednum; extern INT32 fileneedednum;
extern fileneeded_t fileneeded[MAX_WADFILES]; extern fileneeded_t fileneeded[MAX_WADFILES];
extern char downloaddir[512]; extern char downloaddir[512];
extern INT32 addontypes[NUMADDONTYPES];
typedef struct typedef struct
{ {
@@ -102,7 +91,6 @@ void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr, UINT16 fi
void CL_PrepareDownloadSaveGame(const char *tmpsave); void CL_PrepareDownloadSaveGame(const char *tmpsave);
INT32 CL_CheckFiles(void); INT32 CL_CheckFiles(void);
void CL_CheckAddonTypes(void);
boolean CL_LoadServerFiles(void); boolean CL_LoadServerFiles(void);
void SV_SendRam(INT32 node, void *data, size_t size, freemethod_t freemethod, void SV_SendRam(INT32 node, void *data, size_t size, freemethod_t freemethod,
UINT8 fileid); UINT8 fileid);
-1
View File
@@ -2,6 +2,5 @@ i_system.c
i_main.c i_main.c
i_video.c i_video.c
i_sound.c i_sound.c
i_threads.c
dosstr.c dosstr.c
endtxt.c endtxt.c
+20 -60
View File
@@ -735,22 +735,6 @@ const char *I_GetJoyName(INT32 joyindex)
return NULL; return NULL;
} }
void I_SetJoystickFocus(void)
{
}
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 I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration)
{ {
(void)playernum; (void)playernum;
@@ -1000,7 +984,7 @@ void I_SleepDuration(precise_t duration)
#endif #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) static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_msg)
{ {
@@ -1023,13 +1007,8 @@ static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_ms
sigmsg = ("SIGSEGV - SRB2Kart-Saturn has attempted to access a memory location that it shouldn't and needs to close."); sigmsg = ("SIGSEGV - SRB2Kart-Saturn has attempted to access a memory location that it shouldn't and needs to close.");
break; break;
#ifdef SIGTERM #ifdef SIGTERM
case SIGTERM: // Software termination signal from terminate case SIGTERM: // Software termination signal from kill
sigmsg = ("SIGTERM - SRB2Kart-Saturn was terminated by a terminate signal."); sigmsg = ("SIGTERM - SRB2Kart-Saturn was terminated by a kill signal.");
break;
#endif
#ifdef SIGKILL
case SIGKILL: // Software termination signal from kill
sigmsg = ("SIGKILL - SRB2Kart-Saturn was terminated by a kill signal.");
break; break;
#endif #endif
#ifdef SIGBREAK #ifdef SIGBREAK
@@ -1069,11 +1048,6 @@ static void I_ReportSignal(int num, int coredumped)
I_OutputMsg("\nProcess killed by signal: %s\n\n", sigmsg); 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 #ifndef NEWSIGNALHANDLER
FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num) FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
{ {
@@ -1093,17 +1067,11 @@ FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
} }
#endif #endif
static volatile sig_atomic_t interrupted = 0; FUNCNORETURN static ATTRNORETURN void quit_handler(int num)
boolean I_Interrupted(void)
{ {
return interrupted; signal(num, SIG_DFL); //default signal action
} raise(num);
I_Quit();
static void quit_handler(int num)
{
(void)num;
interrupted = 1;
} }
#ifdef HAVE_LIBBACKTRACE #ifdef HAVE_LIBBACKTRACE
@@ -1362,28 +1330,18 @@ static void I_Fork(void)
I_RegisterChildSignals(); I_RegisterChildSignals();
break; break;
default: default:
// ignore those, those are handled by child process
// otherwise parent might exit before it
// and the below stuff wont run and your terminal will be left in an awkward state
#ifdef SIGINT
signal(SIGINT, SIG_IGN);
#endif
#ifdef SIGBREAK
signal(SIGBREAK, SIG_IGN);
#endif
#ifdef SIGTERM
signal(SIGTERM, SIG_IGN);
#endif
if (logstream) if (logstream)
fclose(logstream);/* the child has this */ fclose(logstream);/* the child has this */
c = wait(&status); c = wait(&status);
#ifdef LOGMESSAGES #ifdef LOGMESSAGES
/* By the way, exit closes files. */ /* By the way, exit closes files. */
logstream = fopen(logfilename, "at"); logstream = fopen(logfilename, "at");
#else #else
logstream = 0; logstream = 0;
#endif #endif
if (c == -1) if (c == -1)
{ {
kill(child, SIGKILL); kill(child, SIGKILL);
@@ -1423,8 +1381,8 @@ INT32 I_StartupSystem(void)
I_Fork(); I_Fork();
#endif #endif
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_start_threads(); I_StartThreads();
I_AddExitFunc(I_stop_threads); I_AddExitFunc(I_StopThreads);
#endif #endif
I_RegisterSignals(); I_RegisterSignals();
#ifndef NOMUMBLE #ifndef NOMUMBLE
@@ -1443,8 +1401,8 @@ void I_Quit(void)
/* prevent recursive I_Quit() */ /* prevent recursive I_Quit() */
if (quiting) if (quiting)
goto death; goto death;
quiting = false; quiting = false;
I_ShutdownConsole();
M_SaveConfig(NULL); //save game config, cvars.. M_SaveConfig(NULL); //save game config, cvars..
D_SaveBan(); // save the ban list D_SaveBan(); // save the ban list
G_SaveGameData(false); // Tails 12-08-2002 G_SaveGameData(false); // Tails 12-08-2002
@@ -1460,18 +1418,16 @@ void I_Quit(void)
// use this for 1.28 19990220 by Kin // use this for 1.28 19990220 by Kin
I_ShutdownGraphics(); I_ShutdownGraphics();
I_ShutdownSystem(); I_ShutdownSystem();
/* if option -noendtxt is set, don't print the text */ /* if option -noendtxt is set, don't print the text */
if (!M_CheckParm("-noendtxt") && W_CheckNumForName("ENDOOM") != LUMPERROR) if (!M_CheckParm("-noendtxt") && W_CheckNumForName("ENDOOM") != LUMPERROR)
{ {
printf("\r"); printf("\r");
ShowEndTxt(); ShowEndTxt();
} }
if (myargmalloc) if (myargmalloc)
free(myargv); // Deallocate allocated memory free(myargv); // Deallocate allocated memory
death: death:
W_Shutdown();
exit(0); exit(0);
} }
@@ -1517,6 +1473,7 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
I_OutputMsg("SRB2Kart %s Recursive Error", buffer); I_OutputMsg("SRB2Kart %s Recursive Error", buffer);
W_Shutdown();
exit(-1); // recursive errors detected exit(-1); // recursive errors detected
} }
} }
@@ -1534,6 +1491,8 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
#endif #endif
// --- // ---
I_ShutdownConsole();
M_SaveConfig(NULL); // save game config, cvars.. M_SaveConfig(NULL); // save game config, cvars..
D_SaveBan(); // save the ban list D_SaveBan(); // save the ban list
G_SaveGameData(false); // Tails 12-08-2002 G_SaveGameData(false); // Tails 12-08-2002
@@ -1549,6 +1508,8 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
I_ShutdownGraphics(); I_ShutdownGraphics();
I_ShutdownSystem(); I_ShutdownSystem();
W_Shutdown();
#if defined (PARANOIA) && defined (__CYGWIN__) #if defined (PARANOIA) && defined (__CYGWIN__)
*(INT32 *)2 = 4; //Alam: Debug! *(INT32 *)2 = 4; //Alam: Debug!
#endif #endif
@@ -1654,10 +1615,9 @@ void I_ShutdownSystem(void)
{ {
INT32 c; INT32 c;
#ifdef NEWSIGNALHANDLER #ifndef NEWSIGNALHANDLER
if (M_CheckParm("-nofork")) I_ShutdownConsole();
#endif #endif
I_ShutdownConsole();
for (c = MAX_QUIT_FUNCS-1; c >= 0; c--) for (c = MAX_QUIT_FUNCS-1; c >= 0; c--)
if (quit_funcs[c]) if (quit_funcs[c])
+287 -209
View File
File diff suppressed because it is too large. Load diff
-9
View File
@@ -13,10 +13,6 @@
#ifndef __DEHACKED_H__ #ifndef __DEHACKED_H__
#define __DEHACKED_H__ #define __DEHACKED_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "m_fixed.h" // for get_number #include "m_fixed.h" // for get_number
#include "info.h" #include "info.h"
@@ -75,9 +71,4 @@ typedef struct
} MYFILE; } MYFILE;
#define myfeof(a) (a->data + a->size <= a->curpos) #define myfeof(a) (a->data + a->size <= a->curpos)
char *myfgets(char *buf, size_t bufsize, MYFILE *f); char *myfgets(char *buf, size_t bufsize, MYFILE *f);
#ifdef __cplusplus
} // extern "C"
#endif
#endif #endif
+1 -1
View File
@@ -61,7 +61,7 @@ enum
typedef struct typedef struct
{ {
INT16 x, y; INT16 x, y;
} ATTRPACK mapvertex_t; }ATTRPACK mapvertex_t;
// A SideDef, defining the visual appearance of a wall, // A SideDef, defining the visual appearance of a wall,
// by setting textures and offsets. // by setting textures and offsets.
+18 -9
View File
@@ -130,8 +130,8 @@ extern char logfilename[1024];
#else #else
#define VERSION 1 // Game version #define VERSION 1 // Game version
#define SUBVERSION 6 // more precise version number #define SUBVERSION 6 // more precise version number
#define VERSIONSTRING "Saturn v9.3" #define VERSIONSTRING "Saturn v9.2"
#define VERSIONSTRINGW L"Saturn v9.3" #define VERSIONSTRINGW L"Saturn v9.2"
#define SATURN_TESTING // comment out for saturn release builds! #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 // i_system.c, replace getchar() once the keyboard has been appropriated
INT32 I_GetKey(void); 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 __cplusplus
#ifndef min // Double-Check with WATTCP-32's cdefs.h #ifndef min // Double-Check with WATTCP-32's cdefs.h
#define min(x, y) (((x) < (y)) ? (x) : (y)) #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 // NOTE: you WILL have nasal troubles if the variable is not initialized
#define CLEANUP(f) __attribute__((__cleanup__(f))) #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. // An assert-type mechanism.
#ifdef PARANOIA #ifdef PARANOIA
#define I_Assert(e) ((e) ? (void)0 : I_Error("assert failed: %s, file %s, line %d", #e, __FILE__, __LINE__)) #define I_Assert(e) ((e) ? (void)0 : I_Error("assert failed: %s, file %s, line %d", #e, __FILE__, __LINE__))
+46 -4
View File
@@ -54,6 +54,7 @@ extern INT16 maptol;
extern UINT8 globalweather; extern UINT8 globalweather;
extern INT32 curWeather; extern INT32 curWeather;
extern INT32 cursaveslot; extern INT32 cursaveslot;
extern INT16 lastmapsaved;
extern boolean gamecomplete; extern boolean gamecomplete;
#define PRECIP_NONE 0 #define PRECIP_NONE 0
@@ -77,6 +78,7 @@ extern boolean imcontinuing; // Temporary flag while continuing
extern UINT8 modeattacking; extern UINT8 modeattacking;
// menu demo things // menu demo things
extern UINT8 numDemos;
extern UINT32 demoDelayTime; extern UINT32 demoDelayTime;
extern UINT32 demoIdleTime; extern UINT32 demoIdleTime;
@@ -112,8 +114,8 @@ extern UINT8 paused; // Game paused?
extern UINT8 window_notinfocus; // are we in focus? (backend independant -- handles auto pausing and display of "focus lost" message) extern UINT8 window_notinfocus; // are we in focus? (backend independant -- handles auto pausing and display of "focus lost" message)
extern boolean nodrawers; extern boolean nodrawers;
extern boolean noblit;
extern boolean lastdraw; extern boolean lastdraw;
extern boolean intermissionbginit;
#ifdef MOTIONBLUR #ifdef MOTIONBLUR
extern INT32 postimgparam[MAXSPLITSCREENPLAYERS]; extern INT32 postimgparam[MAXSPLITSCREENPLAYERS];
@@ -203,6 +205,12 @@ extern struct quake
fixed_t radius, intensity; fixed_t radius, intensity;
} quake; } 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 // Custom Lua values
// (This is not ifdeffed so the map header structure can stay identical, just in case.) // (This is not ifdeffed so the map header structure can stay identical, just in case.)
typedef struct typedef struct
@@ -253,16 +261,28 @@ typedef struct
UINT8 numlaps; ///< Number of laps in circuit mode, unless overridden. UINT8 numlaps; ///< Number of laps in circuit mode, unless overridden.
SINT8 unlockrequired; ///< Is an unlockable required to play this level? -1 if no. 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? 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 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 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 // SRB2kart
//boolean automap; ///< Displays a level's white map outline in modified games
fixed_t mobj_scale; ///< Replacement for TOL_ERZ3 fixed_t mobj_scale; ///< Replacement for TOL_ERZ3
mapheader_lighting_t lighting; ///< Wall and sprite lighting mapheader_lighting_t lighting; ///< Wall and sprite lighting
mapheader_lighting_t lighting_encore; ///< Alternative lighting for Encore mode mapheader_lighting_t lighting_encore; ///< Alternative lighting for Encore mode
boolean use_encore_lighting; ///< Whether to use separate Encore lighting 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. // Lua stuff.
// (This is not ifdeffed so the map header structure can stay identical, just in case.) // (This is not ifdeffed so the map header structure can stay identical, just in case.)
UINT8 numCustomOptions; ///< Internal. For Lua custom value support. UINT8 numCustomOptions; ///< Internal. For Lua custom value support.
@@ -359,6 +379,8 @@ typedef struct
{ {
tic_t time; ///< Time in which the level was finished. tic_t time; ///< Time in which the level was finished.
tic_t lap; ///< Best lap time for this level. 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; } recorddata_t;
/** Setup for one NiGHTS map. /** Setup for one NiGHTS map.
@@ -372,19 +394,34 @@ typedef struct
#define GRADE_A 5 #define GRADE_A 5
#define GRADE_S 6 #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]; extern recorddata_t *mainrecords[NUMMAPS];
// mapvisited is now a set of flags that says what we've done in the map. // mapvisited is now a set of flags that says what we've done in the map.
#define MV_VISITED 1 #define MV_VISITED 1
#define MV_BEATEN 2 #define MV_BEATEN 2
#define MV_ALLEMERALDS 4 #define MV_ALLEMERALDS 4
//#define MV_ULTIMATE 8
//#define MV_PERFECT 16
#define MV_MAX 7 // used in gamedata check #define MV_MAX 7 // used in gamedata check
extern UINT8 mapvisited[NUMMAPS]; 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 UINT32 tokenlist; ///< List of tokens collected
extern INT32 tokenbits; ///< Used for setting token bits extern INT32 tokenbits; ///< Used for setting token bits
extern INT32 sstimer; ///< Time allotted in the special stage extern INT32 sstimer; ///< Time allotted in the special stage
extern UINT32 bluescore; ///< Blue Team Scores extern UINT32 bluescore; ///< Blue Team Scores
extern UINT32 redscore; ///< Red Team Scores extern UINT32 redscore; ///< Red Team Scores
@@ -400,6 +437,9 @@ extern boolean CheckForReverseGravity;
extern UINT16 invulntics; extern UINT16 invulntics;
extern UINT16 sneakertics; extern UINT16 sneakertics;
extern UINT16 flashingtics; extern UINT16 flashingtics;
extern UINT16 tailsflytics;
extern UINT16 underwatertics;
extern UINT16 spacetimetics;
extern UINT16 extralifetics; extern UINT16 extralifetics;
// SRB2kart // SRB2kart
@@ -421,6 +461,7 @@ extern UINT8 introtoplay;
extern UINT8 creditscutscene; extern UINT8 creditscutscene;
extern UINT8 use1upSound; extern UINT8 use1upSound;
extern UINT8 maxXtraLife; // Max extra lives from rings
extern mobj_t *hunt1, *hunt2, *hunt3; // Emerald hunt locations extern mobj_t *hunt1, *hunt2, *hunt3; // Emerald hunt locations
@@ -485,6 +526,7 @@ extern UINT32 timesBeatenWithEmeralds;
// WAD, partly set at startup time. // WAD, partly set at startup time.
extern tic_t gametic; extern tic_t gametic;
#define localgametic leveltime
// Player spawn spots. // Player spawn spots.
extern mapthing_t *playerstarts[MAXPLAYERS]; // Cooperative extern mapthing_t *playerstarts[MAXPLAYERS]; // Cooperative
+10 -16
View File
@@ -68,21 +68,8 @@ extern "C" {
#define strnicmp(x,y,n) strncasecmp(x,y,n) #define strnicmp(x,y,n) strncasecmp(x,y,n)
#endif #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); char *nongnu_strcasestr(const char *in, const char *what);
#ifndef _GNU_SOURCE
#define strcasestr nongnu_strcasestr #define strcasestr nongnu_strcasestr
#endif #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) #define STRBUFCPY(dst,src) strlcpy(dst, src, sizeof dst)
/* Boolean type definition */ /* Boolean type definition */
#include <stdbool.h>
#ifndef _WIN32 #ifndef _WIN32
#include <stdbool.h>
// dont use stdbools _BOOL type // dont use stdbools _BOOL type
// its smaller (1 byte) than the old interger bool (4 bytes) // its smaller (1 byte) than the old interger bool (4 bytes)
// which results in packed struct sizes being mismatched between vanilla and this // 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 // which we cant use as enumeration constants
typedef int32_t boolean; typedef int32_t boolean;
#else #else
#define boolean int32_t #define false FALSE
#define true TRUE
#define boolean BOOL
#endif #endif
/* 7.18.2.1 Limits of exact-width integer types */ /* 7.18.2.1 Limits of exact-width integer types */
@@ -234,6 +223,8 @@ typedef int32_t boolean;
#define FUNCNOINLINE __attribute__((noinline)) #define FUNCNOINLINE __attribute__((noinline))
#define FUNCWARNRV __attribute__((warn_unused_result))
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) // >= GCC 4.4 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) // >= GCC 4.4
#ifdef __i386__ // i386 only #ifdef __i386__ // i386 only
#define FUNCTARGET(X) __attribute__ ((__target__ (X))) #define FUNCTARGET(X) __attribute__ ((__target__ (X)))
@@ -279,6 +270,9 @@ typedef int32_t boolean;
#ifndef FUNCTARGET #ifndef FUNCTARGET
#define FUNCTARGET(x) #define FUNCTARGET(x)
#endif #endif
#ifndef FUNCWARNRV
#define FUNCWARNRV
#endif
#ifndef ATTRPACK #ifndef ATTRPACK
#define ATTRPACK #define ATTRPACK
#endif #endif
+8
View File
@@ -1110,6 +1110,14 @@ void F_TitleScreenTicker(boolean run)
return; return;
} }
// Replay intro when done cycling through demos
/*if (curDemo == numDemos) -- uuuh... we have a LOT of maps AND a big devteam... probably not gonna see a repeat unless you're super unlucky :V
{
curDemo = 0;
F_StartIntro();
return;
}*/
mapname = G_BuildMapName(G_RandMap(TOL_RACE, -2, false, 0, false, NULL)+1); mapname = G_BuildMapName(G_RandMap(TOL_RACE, -2, false, 0, false, NULL)+1);
numstaff = 1; numstaff = 1;
+2 -7
View File
@@ -361,11 +361,6 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
// on for fade-to-black // on for fade-to-black
for (;;) for (;;)
{ {
if (I_Interrupted())
{
I_Quit();
}
// get fademask first so we can tell if it exists or not // get fademask first so we can tell if it exists or not
fmask = F_GetFadeMask(wipetype, wipeframe++); fmask = F_GetFadeMask(wipetype, wipeframe++);
@@ -393,11 +388,11 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
if (rendermode != render_none && drawMenu) if (rendermode != render_none && drawMenu)
{ {
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&m_menu_mutex); I_LockMutex(&m_menu_mutex);
#endif #endif
M_Drawer(); // menu is drawn even on top of wipes M_Drawer(); // menu is drawn even on top of wipes
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_unlock_mutex(m_menu_mutex); I_UnlockMutex(m_menu_mutex);
#endif #endif
} }
+1 -3
View File
@@ -111,12 +111,10 @@ filestatus_t filesearch(char *filename, const char *startpath, const UINT8 *want
char *searchname; char *searchname;
int depthleft = maxsearchdepth; int depthleft = maxsearchdepth;
char searchpath[MAXFILEPATH]; char searchpath[MAXFILEPATH];
size_t *searchpathindex = NULL; size_t *searchpathindex;
dirhandle = (DIR**)malloc(maxsearchdepth * sizeof(DIR*)); dirhandle = (DIR**)malloc(maxsearchdepth * sizeof(DIR*));
searchpathindex = (size_t *)malloc(maxsearchdepth * sizeof(size_t)); 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); strcpy(searchpath, startpath);
searchpathindex[--depthleft] = strlen(searchpath) + 1; searchpathindex[--depthleft] = strlen(searchpath) + 1;
+43 -37
View File
@@ -66,10 +66,12 @@
#include <locale.h> #include <locale.h>
// menu demo things // menu demo things
UINT8 numDemos = 0; //3; -- i'm FED UP of losing my skincolour to a broken demo. change this back when we make new ones
UINT32 demoDelayTime = 15*TICRATE; UINT32 demoDelayTime = 15*TICRATE;
UINT32 demoIdleTime = 3*TICRATE; UINT32 demoIdleTime = 3*TICRATE;
boolean nodrawers = false; // for comparative timing purposes boolean nodrawers = false; // for comparative timing purposes
boolean noblit = false; // for comparative timing purposes
static tic_t demostarttime; // for comparative timing purposes static tic_t demostarttime; // for comparative timing purposes
//@TODO put these all in a struct for namespacing purposes? //@TODO put these all in a struct for namespacing purposes?
@@ -1651,12 +1653,10 @@ void G_RecordDemo(const char *name)
maxsize = cv_maxdemosize.value*1024*1024; maxsize = cv_maxdemosize.value*1024*1024;
demobuf.buffer = Z_Malloc(maxsize + 100*1024, PU_STATIC, NULL); demobuf.buffer = Z_Malloc(maxsize + 100*1024, PU_STATIC, NULL);
demoend = demobuf.buffer + maxsize;
if (demobuf.buffer) if (demobuf.buffer)
{
demoend = demobuf.buffer + maxsize;
demo.recording = true; demo.recording = true;
}
else else
CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n"); CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n");
} }
@@ -1994,6 +1994,7 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick)
UINT8 totalfiles, filesloaded, nmusfilecount; UINT8 totalfiles, filesloaded, nmusfilecount;
char filename[MAX_WADPATH]; char filename[MAX_WADPATH];
UINT8 md5sum[16]; UINT8 md5sum[16];
boolean toomany = false;
boolean alreadyloaded; boolean alreadyloaded;
UINT8 i, j; UINT8 i, j;
UINT8 error = 0; UINT8 error = 0;
@@ -2003,44 +2004,53 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick)
for (i = 0; i < totalfiles; ++i) for (i = 0; i < totalfiles; ++i)
{ {
strlcpy(filename, (char *)(*pp), sizeof filename); if (toomany)
SKIPSTRING((*pp)); SKIPSTRING((*pp));
else
{
strlcpy(filename, (char *)(*pp), sizeof filename);
SKIPSTRING((*pp));
}
READMEM((*pp), md5sum, 16); // hue hue peepee READMEM((*pp), md5sum, 16); // hue hue peepee
alreadyloaded = false; if (!toomany)
nmusfilecount = 0;
for (j = 0; j < numwadfiles; ++j)
{ {
if (wadfiles[j]->important && j > mainwads) alreadyloaded = false;
nmusfilecount++; nmusfilecount = 0;
else
continue;
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) if (memcmp(md5sum, wadfiles[j]->md5sum, 16) == 0)
error |= DFILE_ERROR_OUTOFORDER; {
alreadyloaded = true;
break; if (i != nmusfilecount-1 && error < DFILE_ERROR_OUTOFORDER)
error |= DFILE_ERROR_OUTOFORDER;
break;
}
} }
}
if (alreadyloaded) if (alreadyloaded)
{ {
filesloaded++; filesloaded++;
continue; 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; 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 // Get final file count
@@ -2595,7 +2605,7 @@ void G_DoPlayDemo(char *defdemoname)
boolean skiperrors = false; boolean skiperrors = false;
#endif #endif
boolean spectator; boolean spectator;
UINT8 slots[MAXPLAYERS] = {}, kartspeed[MAXPLAYERS] = {}, kartweight[MAXPLAYERS] = {}, numslots = 0; UINT8 slots[MAXPLAYERS], kartspeed[MAXPLAYERS], kartweight[MAXPLAYERS], numslots = 0;
G_InitDemoRewind(); G_InitDemoRewind();
@@ -2606,7 +2616,7 @@ void G_DoPlayDemo(char *defdemoname)
if (defdemoname == NULL) if (defdemoname == NULL)
{ {
demobuf.p = demobuf.buffer; 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 else
{ {
@@ -2618,7 +2628,7 @@ void G_DoPlayDemo(char *defdemoname)
n++; n++;
pdemoname = ZZ_Alloc(strlen(n)+1); pdemoname = ZZ_Alloc(strlen(n)+1);
strcpy(pdemoname, n); strcpy(pdemoname,n);
M_SetPlaybackMenuPointer(); M_SetPlaybackMenuPointer();
@@ -3080,9 +3090,6 @@ post_compat:
if (cv_director.value) if (cv_director.value)
CV_SetValue(&cv_director, 0); CV_SetValue(&cv_director, 0);
if (demo.timing)
G_DoneLevelLoad();
demo.deferstart = true; demo.deferstart = true;
} }
#undef SKIPERRORS #undef SKIPERRORS
@@ -3510,11 +3517,10 @@ static INT32 restorecv_vidwait;
void G_TimeDemo(const char *name) void G_TimeDemo(const char *name)
{ {
nodrawers = M_CheckParm("-nodraw"); nodrawers = M_CheckParm("-nodraw");
noblit = M_CheckParm("-noblit");
restorecv_vidwait = cv_vidwait.value; restorecv_vidwait = cv_vidwait.value;
if (cv_vidwait.value) if (cv_vidwait.value)
CV_Set(&cv_vidwait, "0"); CV_Set(&cv_vidwait, "0");
demo.timing = true; demo.timing = true;
singletics = true; singletics = true;
framecount = 0; framecount = 0;
+30 -5
View File
@@ -61,6 +61,7 @@
gameaction_t gameaction = 0; gameaction_t gameaction = 0;
gamestate_t gamestate = GS_NULL; gamestate_t gamestate = GS_NULL;
UINT8 ultimatemode = false;
boolean botingame = false; boolean botingame = false;
UINT8 botskin = 0; UINT8 botskin = 0;
@@ -68,6 +69,9 @@ UINT8 botcolor = 0;
JoyType_t Joystick[MAXSPLITSCREENPLAYERS] = {}; JoyType_t Joystick[MAXSPLITSCREENPLAYERS] = {};
// 1024 bytes is plenty for a savegame
#define SAVEGAMESIZE (1024)
// SRB2kart // SRB2kart
char gamedatafilename[64] = "kartdata.dat"; char gamedatafilename[64] = "kartdata.dat";
char timeattackfolder[64] = "kart"; char timeattackfolder[64] = "kart";
@@ -86,6 +90,7 @@ INT16 maptol = 0;
UINT8 globalweather = 0; UINT8 globalweather = 0;
INT32 curWeather = PRECIP_NONE; INT32 curWeather = PRECIP_NONE;
INT32 cursaveslot = -1; // Auto-save 1p savegame slot INT32 cursaveslot = -1; // Auto-save 1p savegame slot
INT16 lastmapsaved = 0; // Last map we auto-saved at
boolean gamecomplete = false; boolean gamecomplete = false;
UINT16 mainwads = 0; UINT16 mainwads = 0;
@@ -95,6 +100,7 @@ boolean savemoddata = false;
UINT8 paused = 0; UINT8 paused = 0;
UINT8 modeattacking = ATTACKING_NONE; UINT8 modeattacking = ATTACKING_NONE;
boolean imcontinuing = false; boolean imcontinuing = false;
boolean runemeraldmanager = false;
boolean netgame = false; // only true if packets are broadcast boolean netgame = false; // only true if packets are broadcast
boolean multiplayer = false; boolean multiplayer = false;
@@ -106,6 +112,7 @@ INT32 consoleplayer = 0; // player taking events and displaying
INT32 displayplayers[MAXSPLITSCREENPLAYERS] = {}; // view being displayed INT32 displayplayers[MAXSPLITSCREENPLAYERS] = {}; // view being displayed
tic_t gametic = 0; tic_t gametic = 0;
tic_t levelstarttic = 0; // gametic at level start
UINT32 totalrings = 0; // for intermission UINT32 totalrings = 0; // for intermission
INT16 lastmap = 0; // last level you were at (returning from special stages) INT16 lastmap = 0; // last level you were at (returning from special stages)
tic_t timeinmap = 0; // Ticker for time spent in level (used for levelcard display) tic_t timeinmap = 0; // Ticker for time spent in level (used for levelcard display)
@@ -183,6 +190,9 @@ boolean CheckForReverseGravity = false;
UINT16 invulntics = 20*TICRATE; UINT16 invulntics = 20*TICRATE;
UINT16 sneakertics = 20*TICRATE; UINT16 sneakertics = 20*TICRATE;
UINT16 flashingtics = 3*TICRATE/2; // SRB2kart UINT16 flashingtics = 3*TICRATE/2; // SRB2kart
UINT16 tailsflytics = 8*TICRATE;
UINT16 underwatertics = 30*TICRATE;
UINT16 spacetimetics = 11*TICRATE + (TICRATE/2);
UINT16 extralifetics = 4*TICRATE; UINT16 extralifetics = 4*TICRATE;
// SRB2kart // SRB2kart
@@ -200,7 +210,10 @@ const INT32 wipeoutslowtime = 20;
const INT32 wantedreduce = 5*TICRATE; const INT32 wantedreduce = 5*TICRATE;
const INT32 wantedfrequency = 10*TICRATE; const INT32 wantedfrequency = 10*TICRATE;
INT32 gameovertics = 15*TICRATE;
UINT8 use1upSound = 0; UINT8 use1upSound = 0;
UINT8 maxXtraLife = 2; // Max extra lives from rings
UINT8 introtoplay = 0; UINT8 introtoplay = 0;
UINT8 creditscutscene = 0; UINT8 creditscutscene = 0;
@@ -1290,6 +1303,8 @@ static void G_DoLoadLevel(boolean resetplayer)
// Make sure objectplace is OFF when you first start the level! // Make sure objectplace is OFF when you first start the level!
OP_ResetObjectplace(); OP_ResetObjectplace();
levelstarttic = gametic; // for time calculation
if (wipegamestate == GS_LEVEL) if (wipegamestate == GS_LEVEL)
wipegamestate = -1; // force a wipe wipegamestate = -1; // force a wipe
@@ -3343,6 +3358,18 @@ static void G_DoStartVote(void)
gameaction = ga_nothing; gameaction = ga_nothing;
} }
//
// G_UseContinue
//
void G_UseContinue(void)
{
if (gamestate == GS_LEVEL && !netgame && !multiplayer)
{
gameaction = ga_startcont;
lastdraw = true;
}
}
static void G_DoStartContinue(void) static void G_DoStartContinue(void)
{ {
I_Assert(!netgame && !multiplayer); I_Assert(!netgame && !multiplayer);
@@ -3381,7 +3408,7 @@ static void G_DoContinued(void)
token = 0; token = 0;
// Reset # of lives // Reset # of lives
pl->lives = 3; pl->lives = (ultimatemode) ? 1 : 3;
D_MapChange(gamemap, gametype, false, false, 0, false, false); D_MapChange(gamemap, gametype, false, false, 0, false, false);
@@ -3875,7 +3902,7 @@ void G_SaveGame(UINT32 savegameslot)
char name[VERSIONSIZE]; char name[VERSIONSIZE];
size_t length; 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) if (!save.p)
{ {
CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n")); CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n"));
@@ -4025,6 +4052,7 @@ void G_InitNew(UINT8 pencoremode, const char *mapname, boolean resetplayer, bool
if (W_CheckNumForName(mapname) == LUMPERROR) if (W_CheckNumForName(mapname) == LUMPERROR)
{ {
I_Error("Internal game map '%s' not found\n", mapname); I_Error("Internal game map '%s' not found\n", mapname);
Command_ExitGame_f();
return; return;
} }
@@ -4125,7 +4153,6 @@ static void measurekeywords(mapsearchfreq_t *fr,
{ {
char *qp; char *qp;
char *sp; char *sp;
if (wanttable) if (wanttable)
(*dimp) = Z_Realloc((*dimp), 255 * sizeof (struct searchdim), (*dimp) = Z_Realloc((*dimp), 255 * sizeof (struct searchdim),
PU_STATIC, NULL); PU_STATIC, NULL);
@@ -4140,12 +4167,10 @@ static void measurekeywords(mapsearchfreq_t *fr,
(*dimp)[(*cuntp)].pos = sp - s; (*dimp)[(*cuntp)].pos = sp - s;
(*dimp)[(*cuntp)].siz = strlen(qp); (*dimp)[(*cuntp)].siz = strlen(qp);
} }
(*cuntp)++; (*cuntp)++;
fr->total++; fr->total++;
} }
} }
if (wanttable) if (wanttable)
(*dimp) = Z_Realloc((*dimp), (*cuntp) * sizeof (struct searchdim), (*dimp) = Z_Realloc((*dimp), (*cuntp) * sizeof (struct searchdim),
PU_STATIC, NULL); PU_STATIC, NULL);
+5
View File
@@ -39,8 +39,12 @@ extern INT32 player_name_changes[MAXPLAYERS];
extern player_t players[MAXPLAYERS]; extern player_t players[MAXPLAYERS];
extern boolean playeringame[MAXPLAYERS]; extern boolean playeringame[MAXPLAYERS];
// gametic at level start
extern tic_t levelstarttic;
// for modding? // for modding?
extern INT16 prevmap, nextmap; extern INT16 prevmap, nextmap;
extern INT32 gameovertics;
extern tic_t timeinmap; // Ticker for time spent in level (used for levelcard display) extern tic_t timeinmap; // Ticker for time spent in level (used for levelcard display)
extern INT16 rw_maximums[NUM_WEAPONS]; extern INT16 rw_maximums[NUM_WEAPONS];
@@ -248,6 +252,7 @@ UINT8 G_GetGametypeColor(INT16 gt);
void G_ExitLevel(void); void G_ExitLevel(void);
void G_NextLevel(void); void G_NextLevel(void);
void G_Continue(void); void G_Continue(void);
void G_UseContinue(void);
void G_AfterIntermission(void); void G_AfterIntermission(void);
void G_EndGame(void); // moved from y_inter.c/h and renamed void G_EndGame(void); // moved from y_inter.c/h and renamed
-22
View File
@@ -81,7 +81,6 @@ consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS] = {
{"gamepadled4", "Skincolor", CV_SAVE|CV_CALL|CV_NOINIT, gamepadled_cons_t, led_off_handle4, 0, NULL, NULL, 0, 0, NULL} {"gamepadled4", "Skincolor", CV_SAVE|CV_CALL|CV_NOINIT, gamepadled_cons_t, led_off_handle4, 0, NULL, NULL, 0, 0, NULL}
}; };
consvar_t cv_gamepadifunfocused = {"gamepadunfocused", "Off", CV_SAVE|CV_CALL, CV_OnOff, I_SetJoystickFocus, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_gamepadledifunfocused = {"gamepadledunfocused", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_gamepadledifunfocused = {"gamepadledunfocused", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_rumbleifunfocused = {"rumbleifunfocused", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_rumbleifunfocused = {"rumbleifunfocused", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
@@ -940,11 +939,6 @@ void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT8 color)
return; return;
} }
if (!I_GamepadHasLED(playernum))
{
return;
}
// so we can override this // so we can override this
skincolor = color ? color : G_GetSkinColorForGamepad(playernum); skincolor = color ? color : G_GetSkinColorForGamepad(playernum);
byte_color = V_GetColor(colortranslations[skincolor][8]).s; byte_color = V_GetColor(colortranslations[skincolor][8]).s;
@@ -980,22 +974,12 @@ void G_DeviceLEDTick(void)
for (i = 0; i <= splitscreen; i++) for (i = 0; i <= splitscreen; i++)
{ {
if (!cv_usejoystick[i].value || !cv_gamepadled[i].value) if (!cv_usejoystick[i].value || !cv_gamepadled[i].value)
{
continue; continue;
}
// does not have a configurable led! :c
if (!I_GamepadHasLED(i))
{
continue;
}
newcolor = G_GetSkinColorForGamepad(i); newcolor = G_GetSkinColorForGamepad(i);
if (curcolor[i] == newcolor) // dont update if same colour if (curcolor[i] == newcolor) // dont update if same colour
{
continue; continue;
}
G_SetPlayerGamepadIndicatorColor(i, newcolor); G_SetPlayerGamepadIndicatorColor(i, newcolor);
curcolor[i] = newcolor; curcolor[i] = newcolor;
@@ -1071,12 +1055,6 @@ void G_DeviceRumbleTick(void)
continue; continue;
} }
// does not support rumble! :c
if (!I_GamepadHasRumble(i))
{
continue;
}
if (camera[i].freecam) if (camera[i].freecam)
{ {
continue; continue;
-1
View File
@@ -116,7 +116,6 @@ extern consvar_t cv_rumble[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_gamepadifunfocused;
extern consvar_t cv_gamepadledifunfocused; extern consvar_t cv_gamepadledifunfocused;
extern consvar_t cv_rumbleifunfocused; extern consvar_t cv_rumbleifunfocused;
+1
View File
@@ -52,6 +52,7 @@ typedef enum
} gameaction_t; } gameaction_t;
extern gamestate_t gamestate; extern gamestate_t gamestate;
extern UINT8 ultimatemode; // was sk_insane
extern gameaction_t gameaction; extern gameaction_t gameaction;
extern boolean botingame; extern boolean botingame;
@@ -15,6 +15,8 @@
#ifdef HWRENDER #ifdef HWRENDER
#include <unordered_set>
#include "hw_main.h" #include "hw_main.h"
#include "hw_glob.h" #include "hw_glob.h"
#include "hw_gl.h" #include "hw_gl.h"
@@ -98,7 +100,7 @@ static void HWR_DrawColumnInCache(const column_t *patchcol, UINT8 *block, GLMipm
position = 0; 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) if (position + count >= pblockheight)
count = pblockheight - position; count = pblockheight - position;
@@ -162,7 +164,7 @@ static void HWR_DrawPatchInCache(GLMipmap_t *mipmap,
fixed_t xfrac, xfracstep; fixed_t xfrac, xfracstep;
fixed_t yfracstep, scale_y; fixed_t yfracstep, scale_y;
const column_t *patchcol; const column_t *patchcol;
UINT8 *block = (UINT8 *)(mipmap->data); UINT8 *block = static_cast<UINT8 *>(mipmap->data);
INT32 bpp; INT32 bpp;
INT32 blockmodulo; INT32 blockmodulo;
RGBA_t *palette; RGBA_t *palette;
@@ -212,7 +214,7 @@ static void HWR_DrawTexturePatchInCache(GLMipmap_t *mipmap,
fixed_t xfrac, xfracstep; fixed_t xfrac, xfracstep;
fixed_t yfracstep, scale_y; fixed_t yfracstep, scale_y;
const column_t *patchcol; const column_t *patchcol;
UINT8 *block = (UINT8 *)(mipmap->data); UINT8 *block = static_cast<UINT8 *>(mipmap->data);
INT32 bpp; INT32 bpp;
INT32 blockmodulo; INT32 blockmodulo;
INT32 width, height; INT32 width, height;
@@ -288,7 +290,7 @@ static UINT8 *MakeBlock(GLMipmap_t *glMipmap)
INT32 blocksize = (glMipmap->width * glMipmap->height); INT32 blocksize = (glMipmap->width * glMipmap->height);
bpp = format2bpp(glMipmap->format); 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) switch (bpp)
{ {
@@ -325,7 +327,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
texture = textures[texnum]; texture = textures[texnum];
gltex->mipmap.flags = TF_CHROMAKEYED | TF_WRAPXY; 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.. // hack the Legacy skies..
if (UNLIKELY(memcmp(texture->name, "SKY", 3) == 0 && 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; colormap += COLORMAP_REMAPOFFSET;
#endif #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; gltex->mipmap.colormap->source = colormap;
memcpy(gltex->mipmap.colormap->data, colormap, 256 * sizeof(UINT8)); 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. // Composite the columns together.
for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++) 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; realpatch = (softwarepatch_t *)pdata;
HWR_DrawTexturePatchInCache(&gltex->mipmap, blockwidth, blockheight, texture, patch, realpatch); 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; glMipmap->flags = 0;
// setup the texture info // 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_s = (float)patch->width / (float)glMipmap->width;
glPatch->max_t = (float)patch->height / (float)glMipmap->height; glPatch->max_t = (float)patch->height / (float)glMipmap->height;
@@ -455,7 +457,7 @@ static void HWR_FreeTextureData(patch_t *patch)
if (!patch || !patch->hardware) if (!patch || !patch->hardware)
return; return;
glPatch = (GLPatch_t *)(patch->hardware); glPatch = static_cast<GLPatch_t *>(patch->hardware);
if (vid.glstate == VID_GL_LIBRARY_LOADED) if (vid.glstate == VID_GL_LIBRARY_LOADED)
GL_DeleteTexture(glPatch->mipmap); GL_DeleteTexture(glPatch->mipmap);
@@ -471,7 +473,7 @@ void HWR_FreeTexture(patch_t *patch)
if (patch->hardware) if (patch->hardware)
{ {
GLPatch_t *glPatch = (GLPatch_t *)(patch->hardware); GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
HWR_FreeTextureColormaps(patch); HWR_FreeTextureColormaps(patch);
@@ -497,7 +499,7 @@ static void HWR_FreeTextureColormaps(patch_t *patch)
if (!patch) if (!patch)
return; return;
pat = (GLPatch_t *)(patch->hardware); pat = static_cast<GLPatch_t *>(patch->hardware);
if (!pat) if (!pat)
return; return;
@@ -612,20 +614,24 @@ void HWR_FreeMapTextures(void)
gl_numtextures = 0; 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) static void HWR_PrecacheLevelFlats(void)
{ {
// lookup for flats that may´ve been already loaded // lookup for flats that may´ve been already loaded
flatcheck flatpresent; // too lazy to make a hashtable or smth so unordered set will do :carbuncle:
flatcheck_init(&flatpresent); std::unordered_set<UINT32> flatpresent;
size_t i, j; size_t i, j;
INT32 k; 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 // special case for encore
#ifdef GLENCORE #ifdef GLENCORE
if (encoremap) if (encoremap)
@@ -643,23 +649,14 @@ static void HWR_PrecacheLevelFlats(void)
const levelflat_t *levelflat = &levelflats[pic]; const levelflat_t *levelflat = &levelflats[pic];
if (flatcheck_is_end(flatcheck_get(&flatpresent, levelflat->lumpnum))) load_flat(levelflat->lumpnum, R_NoEncore(sec, ceiling));
{
HWR_GetFlat(levelflat->lumpnum, R_NoEncore(sec, ceiling));
flatcheck_insert(&flatpresent, levelflat->lumpnum);
}
if (levelflat->speed) // is it an animated flat ? if (levelflat->speed) // is it an animated flat ?
{ {
// start from 0, occasionally basenumlump != flat->lumpnum // start from 0, occasionally basenumlump != flat->lumpnum
for (k = 0; k < levelflat->numpics; k++) for (k = 0; k < levelflat->numpics; k++)
{ {
lumpnum_t lump = levelflat->baselumpnum + k; load_flat(levelflat->baselumpnum + k, R_NoEncore(sec, ceiling));
if (flatcheck_is_end(flatcheck_get(&flatpresent, lump)))
{
HWR_GetFlat(lump, R_NoEncore(sec, ceiling));
flatcheck_insert(&flatpresent, lump);
}
} }
} }
} }
@@ -674,29 +671,18 @@ static void HWR_PrecacheLevelFlats(void)
{ {
const levelflat_t *levelflat = &levelflats[i]; const levelflat_t *levelflat = &levelflats[i];
if (flatcheck_is_end(flatcheck_get(&flatpresent, levelflat->lumpnum))) load_flat(levelflat->lumpnum, false);
{
HWR_GetFlat(levelflat->lumpnum, false);
flatcheck_insert(&flatpresent, levelflat->lumpnum);
}
if (levelflat->speed) // is it an animated flat ? if (levelflat->speed) // is it an animated flat ?
{ {
// start from 0, occasionally basenumlump != flat->lumpnum // start from 0, occasionally basenumlump != flat->lumpnum
for (k = 0; k < levelflat->numpics; k++) for (k = 0; k < levelflat->numpics; k++)
{ {
lumpnum_t lump = levelflat->baselumpnum + k; load_flat(levelflat->baselumpnum + k, false);
if (flatcheck_is_end(flatcheck_get(&flatpresent, lump)))
{
HWR_GetFlat(lump, false);
flatcheck_insert(&flatpresent, lump);
}
} }
} }
} }
} }
flatcheck_cleanup(&flatpresent);
} }
static void HWR_PrecacheLevelTextures(void) static void HWR_PrecacheLevelTextures(void)
@@ -706,7 +692,7 @@ static void HWR_PrecacheLevelTextures(void)
size_t i, j, f; size_t i, j, f;
INT32 h; INT32 h;
texturepresent = (char *)(calloc(gl_numtextures, sizeof(*texturepresent))); texturepresent = static_cast<char *>(calloc(gl_numtextures, sizeof(*texturepresent)));
if (texturepresent == NULL) if (texturepresent == NULL)
I_Error("%s: Out of memory looking up textures", "HWR_PrecacheLevel"); I_Error("%s: Out of memory looking up textures", "HWR_PrecacheLevel");
@@ -881,7 +867,7 @@ void HWR_LoadMapTextures(size_t pnumtextures)
HWR_FreeMapTextures(); HWR_FreeMapTextures();
gl_numtextures = pnumtextures; 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) if (gl_textures == NULL)
I_Error("HWR_LoadMapTextures: ran out of memory for OpenGL textures. Sad!"); 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)); W_ReadLump(flatlumpnum, Z_Malloc(size, PU_HWRCACHE, &glMipmap->data));
#ifdef GLENCORE #ifdef GLENCORE
flat = (UINT8 *)(glMipmap->data); flat = static_cast<UINT8 *>(glMipmap->data);
for (steppy = 0; steppy < size; steppy++) for (steppy = 0; steppy < size; steppy++)
{ {
if (flat[steppy] == HWR_PATCHES_CHROMAKEY_COLORINDEX) if (flat[steppy] == HWR_PATCHES_CHROMAKEY_COLORINDEX)
@@ -1022,7 +1008,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
if (!noencoremap && encoremap) if (!noencoremap && encoremap)
colormap += COLORMAP_REMAPOFFSET; colormap += COLORMAP_REMAPOFFSET;
#endif #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; glMipmap->colormap->source = colormap;
memcpy(glMipmap->colormap->data, colormap, 256 * sizeof(UINT8)); 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) 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) 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) 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); HWR_MakePatch(patch, glPatch, glMipmap, true);
// If hardware does not have the texture, then call GL_SetTexture to upload it // 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) if (!patch->hardware)
Patch_CreateGL(patch); Patch_CreateGL(patch);
glPatch = (GLPatch_t *)(patch->hardware); glPatch = static_cast<GLPatch_t *>(patch->hardware);
// Blatant hack for encore colormapping aside... // Blatant hack for encore colormapping aside...
if (colormap == colormaps || colormap == NULL || colormap == (const UINT8*)(COLORMAP_REMAPOFFSET)) 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) // (it have a liste of mipmap)
// this malloc is cleared in HWR_FreeColormapCache // this malloc is cleared in HWR_FreeColormapCache
// (...) unfortunately z_malloc fragment alot the memory :(so malloc is better // (...) 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) if (newMipmap == NULL)
I_Error("%s: Out of memory", "HWR_GetMappedPatch"); I_Error("%s: Out of memory", "HWR_GetMappedPatch");
glMipmap->nextcolormap = newMipmap; 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; newMipmap->colormap->source = colormap;
memcpy(newMipmap->colormap->data, colormap, 256 * sizeof(UINT8)); 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]); void *ptr = Z_Calloc(sizeof(patch_t), PU_PATCH, &lumpcache[lumpnum]);
Patch_Create(NULL, 0, ptr); Patch_Create(NULL, 0, ptr);
Patch_AllocateHardwarePatch((patch_t *)(ptr)); Patch_AllocateHardwarePatch(static_cast<patch_t *>(ptr));
} }
return (patch_t *)(lumpcache[lumpnum]); return (patch_t *)(lumpcache[lumpnum]);
@@ -1184,7 +1170,7 @@ static void HWR_DrawFadeMaskInCache(GLMipmap_t *mipmap, INT32 pblockwidth, INT32
{ {
INT32 i,j; INT32 i,j;
fixed_t posx, posy, stepx, stepy; 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 *flat;
UINT8 *dest, *src, texel; UINT8 *dest, *src, texel;
RGBA_t col; RGBA_t col;
@@ -1340,7 +1326,7 @@ void HWR_SetPalette(RGBA_t *palette)
static void HWR_SetPaletteLookup(RGBA_t *palette) static void HWR_SetPaletteLookup(RGBA_t *palette)
{ {
int r, g, b; 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), HWR_PALETTE_LUT_SIZE*HWR_PALETTE_LUT_SIZE*HWR_PALETTE_LUT_SIZE*sizeof(UINT8),
PU_STATIC, NULL)); PU_STATIC, NULL));
#define STEP_SIZE (256/HWR_PALETTE_LUT_SIZE) #define STEP_SIZE (256/HWR_PALETTE_LUT_SIZE)
@@ -1385,7 +1371,7 @@ void HWR_SetMapPalette(void)
if (palsize < 768) // 256 * 3 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"); 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. // we got the RGB palette now, but we need it in RGBA format.
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
{ {
@@ -1420,7 +1406,7 @@ static UINT32 HWR_CreateLightTable(UINT8 *lighttable)
{ {
UINT32 i, id; UINT32 i, id;
RGBA_t *palette = HWR_GetTexturePalette(); 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, // To make the palette index -> RGBA mapping easier for the shader,
// the hardware lighttable is composed of RGBA colors instead of palette indices. // the hardware lighttable is composed of RGBA colors instead of palette indices.
+5 -6
View File
@@ -319,17 +319,16 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
double clipfov; double clipfov;
double floatangle; double floatangle;
angle_t a1; angle_t a1;
float tilt;
float tilt = fabsf(((float)(int)tiltangle) / (float)ANG1);
if (tilt > 90.0f)
tilt = 90.0f;
// If the pitch is larger than this you can look all around at a FOV of 90 // If the pitch is larger than this you can look all around at a FOV of 90
if (abs((signed)tiltangle) > 46 * ANG1) if (abs((signed)tiltangle) > 46 * ANG1)
return 0xffffffff; return 0xffffffff;
tilt = fabsf(((float)(int)tiltangle) / (float)ANG1);
if (tilt > 90.0f)
tilt = 90.0f;
// ok, this is a gross hack that barely works... // ok, this is a gross hack that barely works...
// but at least it doesn't overestimate too much... // but at least it doesn't overestimate too much...
clipfov = atan(1 / (GLdouble)projMatrix[0]) * 360.0 / M_PI; clipfov = atan(1 / (GLdouble)projMatrix[0]) * 360.0 / M_PI;
+1 -1
View File
@@ -54,7 +54,7 @@ struct GLMipmap_s
UINT16 width, height; UINT16 width, height;
UINT32 downloaded; // The GPU has this texture. UINT32 downloaded; // The GPU has this texture.
struct GLMipmap_s *nextcolormap; struct GLMipmap_s *nextcolormap;
struct GLColormap_s *colormap; struct GLColormap_s *colormap;
}; };
typedef struct GLMipmap_s GLMipmap_t; typedef struct GLMipmap_s GLMipmap_t;
+27 -31
View File
@@ -32,6 +32,20 @@
#include <fcntl.h> #include <fcntl.h>
typedef struct
{
UINT8 id_field_length ; // 1
UINT8 color_map_type ; // 2
UINT8 image_type ; // 3
UINT8 dummy[5] ; // 4, 8
INT16 x_origin ; // 9, 10
INT16 y_origin ; //11, 12
INT16 width ; //13, 14
INT16 height ; //15, 16
UINT8 image_pix_size ; //17
UINT8 image_descriptor; //18
} ATTRPACK TGAHeader; // sizeof is 18
static const UINT8 softwaretranstogl[11] = { 0, 25, 51, 76,102,127,153,178,204,229,255}; static const UINT8 softwaretranstogl[11] = { 0, 25, 51, 76,102,127,153,178,204,229,255};
static const UINT8 softwaretranstogl_hi[11] = { 0, 51,102,153,204,255,255,255,255,255,255}; static const UINT8 softwaretranstogl_hi[11] = { 0, 51,102,153,204,255,255,255,255,255,255};
static const UINT8 softwaretranstogl_lo[11] = { 0, 12, 24, 36, 48, 60, 71, 83, 95,111,127}; static const UINT8 softwaretranstogl_lo[11] = { 0, 12, 24, 36, 48, 60, 71, 83, 95,111,127};
@@ -43,7 +57,8 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
{ {
FOutVector v[4]; FOutVector v[4];
FBITFIELD flags; FBITFIELD flags;
float cx, cy; float cx = FIXED_TO_FLOAT(x);
float cy = FIXED_TO_FLOAT(y);
UINT8 alphalevel = ((option & V_ALPHAMASK) >> V_ALPHASHIFT); UINT8 alphalevel = ((option & V_ALPHAMASK) >> V_ALPHASHIFT);
UINT8 blendmode = ((bflags & V_BLENDMASK) >> V_BLENDSHIFT); UINT8 blendmode = ((bflags & V_BLENDMASK) >> V_BLENDSHIFT);
GLPatch_t *hwrPatch; GLPatch_t *hwrPatch;
@@ -57,9 +72,6 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
if (alphalevel >= 10 && alphalevel < 13) if (alphalevel >= 10 && alphalevel < 13)
return; return;
cx = FIXED_TO_FLOAT(x);
cy = FIXED_TO_FLOAT(y);
const float fvw = (float)vid.width; const float fvw = (float)vid.width;
const float fvh = (float)vid.height; const float fvh = (float)vid.height;
@@ -138,7 +150,7 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
if (!column->topdelta) if (!column->topdelta)
{ {
const UINT8 *source = (const UINT8 *)(column) + 3; 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]));
} }
} }
@@ -210,7 +222,7 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
if (alphalevel) if (alphalevel)
{ {
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff; Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff;
switch (alphalevel) switch (alphalevel)
@@ -232,7 +244,8 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
{ {
FOutVector v[4]; FOutVector v[4];
FBITFIELD flags; FBITFIELD flags;
float cx, cy; float cx = FIXED_TO_FLOAT(x);
float cy = FIXED_TO_FLOAT(y);
UINT8 alphalevel = ((option & V_ALPHAMASK) >> V_ALPHASHIFT); UINT8 alphalevel = ((option & V_ALPHAMASK) >> V_ALPHASHIFT);
GLPatch_t *hwrPatch; GLPatch_t *hwrPatch;
@@ -245,9 +258,6 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
if (alphalevel >= 10 && alphalevel < 13) if (alphalevel >= 10 && alphalevel < 13)
return; return;
cx = FIXED_TO_FLOAT(x);
cy = FIXED_TO_FLOAT(y);
const float fvw = (float)vid.width; const float fvw = (float)vid.width;
const float fvh = (float)vid.height; const float fvh = (float)vid.height;
@@ -292,7 +302,7 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
if (!column->topdelta) if (!column->topdelta)
{ {
const UINT8 *source = (const UINT8 *)(column) + 3; 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]));
} }
} }
@@ -375,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 // clip it since it is used for bunny scroll in doom I
if (alphalevel) if (alphalevel)
{ {
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff; Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff;
switch (alphalevel) switch (alphalevel)
@@ -480,7 +490,7 @@ void HWR_DrawFlatFill(INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatlumpnum)
void HWR_FadeScreenMenuBack(UINT16 color, UINT8 strength) void HWR_FadeScreenMenuBack(UINT16 color, UINT8 strength)
{ {
FOutVector v[4]; FOutVector v[4];
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
FBITFIELD poly_flags = PF_NoTexture|PF_Modulated|PF_NoDepthTest; FBITFIELD poly_flags = PF_NoTexture|PF_Modulated|PF_NoDepthTest;
v[0].x = v[3].x = -1.0f; v[0].x = v[3].x = -1.0f;
@@ -533,7 +543,7 @@ void HWR_FadeScreenMenuBack(UINT16 color, UINT8 strength)
void HWR_DrawConsoleBack(UINT32 color, INT32 height) void HWR_DrawConsoleBack(UINT32 color, INT32 height)
{ {
FOutVector v[4]; FOutVector v[4];
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
// setup some neat-o translucency effect // setup some neat-o translucency effect
if (!height) //cool hack 0 height is full height if (!height) //cool hack 0 height is full height
@@ -588,7 +598,7 @@ void HWR_drawAMline(const fline_t *fl, INT32 color)
void HWR_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 color) void HWR_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 color)
{ {
FOutVector v[4]; FOutVector v[4];
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
float fx, fy, fw, fh, fwait = 0; float fx, fy, fw, fh, fwait = 0;
RGBA_t *palette; RGBA_t *palette;
@@ -692,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) void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32 options)
{ {
FOutVector v[4]; FOutVector v[4];
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
float fx, fy, fw, fh; float fx, fy, fw, fh;
if (w < 0 || h < 0) if (w < 0 || h < 0)
@@ -810,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) void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
{ {
FOutVector v[4]; FOutVector v[4];
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
float fx, fy, fw, fh; float fx, fy, fw, fh;
if (w < 0 || h < 0) if (w < 0 || h < 0)
@@ -954,20 +964,6 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
#endif #endif
#ifndef USE_PNG #ifndef USE_PNG
typedef struct
{
UINT8 id_field_length ; // 1
UINT8 color_map_type ; // 2
UINT8 image_type ; // 3
UINT8 dummy[5] ; // 4, 8
INT16 x_origin ; // 9, 10
INT16 y_origin ; //11, 12
INT16 width ; //13, 14
INT16 height ; //15, 16
UINT8 image_pix_size ; //17
UINT8 image_descriptor; //18
} ATTRPACK TGAHeader; // sizeof is 18
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// save screenshots with TGA format // save screenshots with TGA format
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
+1 -6
View File
@@ -32,12 +32,8 @@ void GL_SetSpecialState(hwdspecialstate_t IdState, INT32 Value);
void GL_SetTransform(FTransform *stransform); void GL_SetTransform(FTransform *stransform);
void GL_SetBlend(FBITFIELD PolyFlags); void GL_SetBlend(FBITFIELD PolyFlags);
void GL_SetPalette(RGBA_t *palette); void GL_SetPalette(RGBA_t *palette);
void GL_ClearBuffer(FBOOLEAN ColorMask, FBOOLEAN DepthMask, FBOOLEAN StencilMask, FRGBAFloat * ClearColor); void GL_ClearBuffer(FBOOLEAN ColorMask, FBOOLEAN DepthMask, FBOOLEAN StencilMask, FRGBAFloat * ClearColor);
void GL_EnableStencilTest(void);
void GL_DisableStencilTest(void);
void GL_DrawPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags); void GL_DrawPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags);
void GL_DrawIndexedTriangles(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags, unsigned int *IndexArray); void GL_DrawIndexedTriangles(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags, unsigned int *IndexArray);
void GL_Draw2DLine(F2DCoord *v1, F2DCoord *v2, RGBA_t Color); void GL_Draw2DLine(F2DCoord *v1, F2DCoord *v2, RGBA_t Color);
@@ -67,7 +63,7 @@ void GL_FlushScreenTextures(void);
void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags); void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags);
void GL_DoScreenWipe(int wipeStart, int wipeEnd); void GL_DoScreenWipe(int wipeStart, int wipeEnd);
void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8 downdistort, UINT8 barsize); void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8 downdistort, UINT8 barsize);
void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height); void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean useshader);
void GL_PostImgRedraw(float points[SCREENVERTS][SCREENVERTS][2]); void GL_PostImgRedraw(float points[SCREENVERTS][SCREENVERTS][2]);
@@ -76,7 +72,6 @@ void GL_LoadShader(int slot, char *code, hwdshaderstage_t stage);
boolean GL_CompileShader(int slot); boolean GL_CompileShader(int slot);
void GL_SetShader(int slot); void GL_SetShader(int slot);
void GL_UnSetShader(void); void GL_UnSetShader(void);
void GL_EnableShader(void);
void GL_SetShaderInfo(hwdshaderinfo_t info, INT32 value); void GL_SetShaderInfo(hwdshaderinfo_t info, INT32 value);
+2 -2
View File
@@ -34,8 +34,8 @@ typedef struct gl_vissprite_s
float gz, gzt; float gz, gzt;
float tz; float tz;
float scale; float scale;
//float spritexscale, spriteyscale; float spritexscale, spriteyscale;
//float spritexoffset, spriteyoffset; float spritexoffset, spriteyoffset;
patch_t *gpatch; patch_t *gpatch;
boolean flip; boolean flip;
UINT8 translucency; //alpha level 0-255 UINT8 translucency; //alpha level 0-255
+133 -128
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_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_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}; consvar_t cv_gltexturedepth = {"gr_texturedepth", "32 bits", CV_CALL|CV_SAVE, gltexdepth_cons_t, CV_gltextureformat_OnChange, 0, NULL, NULL, 0, 0, NULL};
@@ -254,11 +255,11 @@ static void CV_screentextures_OnChange(void)
{ {
if (cv_glpaletterendering.value != 0) if (cv_glpaletterendering.value != 0)
CV_SetValue(&cv_glpaletterendering, 0); CV_SetValue(&cv_glpaletterendering, 0);
#ifdef USE_FBO_OGL #ifdef USE_FBO_OGL
if (cv_glframebuffer.value != 0) if (cv_glframebuffer.value != 0)
CV_SetValue(&cv_glframebuffer, 0); CV_SetValue(&cv_glframebuffer, 0);
#endif #endif
intermissionbginit = false;
} }
GL_SetSpecialState(HWD_SET_SCREEN_TEXTURES, cv_glscreentextures.value); GL_SetSpecialState(HWD_SET_SCREEN_TEXTURES, cv_glscreentextures.value);
M_UpdateOGLMenu(); M_UpdateOGLMenu();
@@ -275,7 +276,6 @@ static void CV_glframebuffer_OnChange(void)
I_DownSample(); I_DownSample();
RefreshOGLSDLSurface(); RefreshOGLSDLSurface();
M_UpdateOGLMenu(); M_UpdateOGLMenu();
intermissionbginit = false;
} }
#endif #endif
@@ -389,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); extralight = FixedMul(extralight, std::min(std::max(0, *lightlevel), 255) * FRACUNIT / 255);
// simple OGL approximation // simple OGL approximation
const fixed_t tr = R_QuickCamDist(spr->mobj->x, spr->mobj->y); fixed_t tr = R_QuickCamDist(spr->mobj->x, spr->mobj->y);
const fixed_t xscale = FixedDiv((vid.width / 2) << FRACBITS, tr); fixed_t xscale = FixedDiv((vid.width / 2) << FRACBITS, tr);
// Less change in contrast at further distances, to counteract DOOM diminished light // 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)); extralight = FixedMul(extralight, std::min(n, FRACUNIT));
// Contrast is stronger for normal sprites, stronger than wall lighting is at the same distance // Contrast is stronger for normal sprites, stronger than wall lighting is at the same distance
@@ -511,12 +511,12 @@ static FUINT HWR_CalcWallLight(FUINT lightnum, seg_t *seg, extracolormap_t *colo
{ {
INT16 finallight = lightnum; INT16 finallight = lightnum;
if (cv_glfakecontrast.value == 0 || (colormap && HWR_ShouldUsePaletteRendering())) if (cv_glfakecontrast.value == 0 || (HWR_ShouldUsePaletteRendering() && colormap))
return (FUINT)finallight; return (FUINT)finallight;
if (seg != NULL && P_ApplyLightOffsetFine(lightnum, seg->frontsector)) 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 += offset;
finallight = CLAMP(finallight, 0 , 255); finallight = CLAMP(finallight, 0 , 255);
@@ -534,7 +534,7 @@ static FUINT HWR_CalcSlopeLight(FUINT lightnum, pslope_t *slope, const sector_t
if (slope != NULL && sector != NULL && P_ApplyLightOffsetFine(lightnum, sector)) 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 += (fof ? -offset : offset);
finallight = CLAMP(finallight, 0 , 255); finallight = CLAMP(finallight, 0 , 255);
@@ -551,7 +551,7 @@ static FUINT HWR_CalcSlopeLight(FUINT lightnum, pslope_t *slope, const sector_t
// Render a floor or ceiling convex polygon // Render a floor or ceiling convex polygon
static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, FBITFIELD PolyFlags, INT32 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector, UINT8 alpha, extracolormap_t *planecolormap) static void HWR_RenderPlane(subsector_t *subsector, 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; FOutVector *v3d;
polyvertex_t *pv; polyvertex_t *pv;
pslope_t *slope = NULL; pslope_t *slope = NULL;
@@ -696,7 +696,7 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool
vert->z = (vy);\ vert->z = (vy);\
\ \
} }
for (i = 0, v3d = planeVerts; i < (INT32)nrPlaneVerts; i++, v3d++, pv++) for (i = 0, v3d = planeVerts; i < (INT32)nrPlaneVerts; i++,v3d++, pv++)
SETUP3DVERT(v3d, pv->x, pv->y); SETUP3DVERT(v3d, pv->x, pv->y);
if (slope) if (slope)
@@ -1376,9 +1376,10 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
extracolormap_t *colormap = gl_frontsector->extra_colormap; extracolormap_t *colormap = gl_frontsector->extra_colormap;
lightnum = HWR_CalcWallLight(lightnum, gl_curline, colormap); lightnum = HWR_CalcWallLight(lightnum, gl_curline, colormap);
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
Surf.PolyColor.s.alpha = 255; if (gl_frontsector)
Surf.PolyColor.s.alpha = 255;
const INT32 gl_midtexture = R_GetTextureNum(gl_sidedef->midtexture); const INT32 gl_midtexture = R_GetTextureNum(gl_sidedef->midtexture);
GLMapTexture_t *glTex = NULL; GLMapTexture_t *glTex = NULL;
@@ -1421,11 +1422,6 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
{ {
draw_sky_walls(0, 1, worldhigh, worldhighslope); 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 else
{ {
@@ -1470,6 +1466,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); gl_toptexture = R_GetTextureNum(gl_sidedef->toptexture);
// check TOP TEXTURE // check TOP TEXTURE
@@ -2260,7 +2265,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
static inline boolean HWR_UsePortals(void) static inline boolean HWR_UsePortals(void)
{ {
return supportstencil && gl_maphasportals && cv_glportals.value; return supportstencil && cv_glportals.value && gl_maphasportals;
} }
// From PrBoom: // From PrBoom:
@@ -2404,8 +2409,7 @@ static inline void DoAddLine(seg_t* line, angle_t angle1, angle_t angle2)
// SoM: Backsector needs to be run through R_FakeFlat // SoM: Backsector needs to be run through R_FakeFlat
static sector_t tempsec; static sector_t tempsec;
auto do_addline = [&](bool dontdraw) auto do_addline = [&](bool dontdraw) {
{
// Single sided line? // Single sided line?
if (!line->backsector) if (!line->backsector)
{ {
@@ -2672,8 +2676,8 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling,
float scrollx = 0.0f, scrolly = 0.0f; float scrollx = 0.0f, scrolly = 0.0f;
float anglef = 0.0f, cosangf = 0.0f, sinangf = 0.0f; float anglef = 0.0f, cosangf = 0.0f, sinangf = 0.0f;
angle_t angle = 0; angle_t angle = 0;
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
float tempxsow, tempytow; fixed_t tempxsow, tempytow;
size_t nrPlaneVerts; size_t nrPlaneVerts;
static FOutVector *planeVerts = NULL; static FOutVector *planeVerts = NULL;
@@ -2686,6 +2690,14 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling,
if (nrPlaneVerts < 3) // not even a triangle ? if (nrPlaneVerts < 3) // not even a triangle ?
return; 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 // Allocate plane-vertex buffer if we need to
if (!planeVerts || nrPlaneVerts > numAllocedPlaneVerts) if (!planeVerts || nrPlaneVerts > numAllocedPlaneVerts)
{ {
@@ -2694,8 +2706,6 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling,
Z_Malloc(numAllocedPlaneVerts * sizeof(FOutVector), PU_LEVEL, &planeVerts); Z_Malloc(numAllocedPlaneVerts * sizeof(FOutVector), PU_LEVEL, &planeVerts);
} }
const sector_t *sec = FOFsector ? FOFsector : gl_frontsector;
height = FixedToFloat(fixedheight); height = FixedToFloat(fixedheight);
len = W_LumpLength(lumpnum); len = W_LumpLength(lumpnum);
@@ -2833,8 +2843,9 @@ static void HWR_AddPolyObjectPlanes(void)
light = R_GetPlaneLight(gl_frontsector, polyobjsector->floorheight, true); light = R_GetPlaneLight(gl_frontsector, polyobjsector->floorheight, true);
if (po_ptrs[i]->translucency > 0) if (po_ptrs[i]->translucency > 0)
{ {
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
FBITFIELD blendmode; FBITFIELD blendmode;
memset(&Surf, 0x00, sizeof(Surf));
blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf); blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf);
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->floorpic].lumpnum, po_ptrs[i], false, polyobjsector->floorheight, 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)); (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));
@@ -2855,8 +2866,9 @@ static void HWR_AddPolyObjectPlanes(void)
light = R_GetPlaneLight(gl_frontsector, polyobjsector->ceilingheight, true); light = R_GetPlaneLight(gl_frontsector, polyobjsector->ceilingheight, true);
if (po_ptrs[i]->translucency > 0) if (po_ptrs[i]->translucency > 0)
{ {
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
FBITFIELD blendmode; FBITFIELD blendmode;
memset(&Surf, 0x00, sizeof(Surf));
blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf); blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf);
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->ceilingpic].lumpnum, po_ptrs[i], true, polyobjsector->ceilingheight, 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)); (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));
@@ -3408,7 +3420,7 @@ static void HWR_DrawSpriteShadow(gl_vissprite_t *spr, patch_t *gpatch, GLPatch_t
{ {
float this_scale = 1.0f; float this_scale = 1.0f;
FOutVector swallVerts[4]; FOutVector swallVerts[4];
FSurfaceInfo sSurf = {}; FSurfaceInfo sSurf;
FBITFIELD blendmode = 0; FBITFIELD blendmode = 0;
fixed_t floorheight, mobjfloor; fixed_t floorheight, mobjfloor;
pslope_t *floorslope; pslope_t *floorslope;
@@ -3644,7 +3656,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite)
FOutVector baseWallVerts[4]; // This is what the verts should end up as FOutVector baseWallVerts[4]; // This is what the verts should end up as
patch_t *gpatch; patch_t *gpatch;
GLPatch_t *hwrpatch; GLPatch_t *hwrpatch;
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
extracolormap_t *colormap; extracolormap_t *colormap;
INT32 lightlevel; INT32 lightlevel;
boolean lightset = true; boolean lightset = true;
@@ -3673,7 +3685,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite)
//Hurdler: 25/04/2000: now support colormap in hardware mode //Hurdler: 25/04/2000: now support colormap in hardware mode
HWR_GetMappedPatch(gpatch, spr->colormap); HWR_GetMappedPatch(gpatch, spr->colormap);
hwrpatch = static_cast<GLPatch_t *>(gpatch->hardware); hwrpatch = ((GLPatch_t *)gpatch->hardware);
// Draw shadow BEFORE sprite // Draw shadow BEFORE sprite
if (UNLIKELY(cv_shadow.value // Shadows enabled if (UNLIKELY(cv_shadow.value // Shadows enabled
@@ -3775,10 +3787,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 // 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) 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) 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()) if (HWR_UseShader())
@@ -3801,7 +3813,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite)
{ {
const fixed_t h = P_GetLightZAt(&sector->lightlist[i], sprmo->x, sprmo->y); const fixed_t h = P_GetLightZAt(&sector->lightlist[i], sprmo->x, sprmo->y);
if (h > temp) if (!(h <= temp))
continue; continue;
if (!lightset) if (!lightset)
@@ -3863,7 +3875,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite)
wallVerts[1].y = endbot; wallVerts[1].y = endbot;
// The x and y only need to be adjusted in the case that it's not a papersprite // The x and y only need to be adjusted in the case that it's not a papersprite
if (cv_glspritebillboarding.value && !cv_glshearing.value && !papersprite) if (cv_glspritebillboarding.value && sprmo && !papersprite)
{ {
// Get the x and z of the vertices so billboarding draws correctly // Get the x and z of the vertices so billboarding draws correctly
realheight = realbot - realtop; realheight = realbot - realtop;
@@ -3929,14 +3941,14 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
FOutVector wallVerts[4]; FOutVector wallVerts[4];
patch_t *gpatch; // sprite patch converted to hardware patch_t *gpatch; // sprite patch converted to hardware
GLPatch_t *hwrpatch; GLPatch_t *hwrpatch;
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
FBITFIELD blend = 0; FBITFIELD blend = 0;
INT32 shader = SHADER_NONE; INT32 shader = SHADER_NONE;
mobj_t *sprmo = spr->mobj; mobj_t *sprmo = spr->mobj;
if (!sprmo->subsector) if (UNLIKELY(!sprmo->subsector))
return; return;
const boolean papersprite = (sprmo->frame & FF_PAPERSPRITE); const boolean papersprite = (sprmo->frame & FF_PAPERSPRITE);
@@ -3961,7 +3973,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
//Hurdler: 25/04/2000: now support colormap in hardware mode //Hurdler: 25/04/2000: now support colormap in hardware mode
HWR_GetMappedPatch(gpatch, spr->colormap); HWR_GetMappedPatch(gpatch, spr->colormap);
hwrpatch = static_cast<GLPatch_t *>(gpatch->hardware); hwrpatch = ((GLPatch_t *)gpatch->hardware);
// create the sprite billboard // create the sprite billboard
// //
@@ -4072,10 +4084,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 // 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) 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) 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()) if (HWR_UseShader())
@@ -4094,13 +4106,13 @@ static void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr)
FOutVector wallVerts[4]; FOutVector wallVerts[4];
patch_t *gpatch; // sprite patch converted to hardware patch_t *gpatch; // sprite patch converted to hardware
GLPatch_t *hwrpatch; GLPatch_t *hwrpatch;
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
INT32 shader = SHADER_NONE; INT32 shader = SHADER_NONE;
const precipmobj_t *sprmo = spr->precip; const precipmobj_t *sprmo = spr->precip;
if (!sprmo->subsector) if (UNLIKELY(!sprmo->subsector))
return; return;
// cache sprite graphics // cache sprite graphics
@@ -4111,7 +4123,7 @@ static void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr)
//Hurdler: 25/04/2000: now support colormap in hardware mode //Hurdler: 25/04/2000: now support colormap in hardware mode
HWR_GetMappedPatch(gpatch, spr->colormap); HWR_GetMappedPatch(gpatch, spr->colormap);
hwrpatch = static_cast<GLPatch_t *>(gpatch->hardware); hwrpatch = ((GLPatch_t *)gpatch->hardware);
// create the sprite billboard // create the sprite billboard
// //
@@ -4300,23 +4312,22 @@ static std::vector<gl_drawnode_t> drawnodes;
static void *HWR_CreateDrawNode(gl_drawnode_type_t type) static void *HWR_CreateDrawNode(gl_drawnode_type_t type)
{ {
gl_drawnode_t *drawnode; // if we didnt alloc anything yet, reserve atleast 64 nodes
// dont declare with it as we want our size to be 0!
drawnodes.reserve(DRAWNODES_INIT_SIZE); drawnodes.reserve(DRAWNODES_INIT_SIZE);
drawnodes.emplace_back(); drawnodes.emplace_back();
drawnodes.back().type = type;
drawnode = &drawnodes.back();
drawnode->type = type;
// not sure if returning different pointers to a union is necessary // not sure if returning different pointers to a union is necessary
switch (type) switch (type)
{ {
case DRAWNODE_PLANE: case DRAWNODE_PLANE:
return &drawnode->u.plane; return &drawnodes.back().u.plane;
case DRAWNODE_POLYOBJECT_PLANE: case DRAWNODE_POLYOBJECT_PLANE:
return &drawnode->u.polyplane; return &drawnodes.back().u.polyplane;
case DRAWNODE_WALL: case DRAWNODE_WALL:
return &drawnode->u.wall; return &drawnodes.back().u.wall;
} }
return NULL; return NULL;
@@ -4383,7 +4394,9 @@ static int CompareDrawNodePlanes(const void *p1, const void *p2)
static void HWR_RenderDrawNodes(void) static void HWR_RenderDrawNodes(void)
{ {
size_t i = 0, run_start = 0; size_t i = 0, run_start = 0;
static std::vector<INT32> sortindex(DRAWNODES_INIT_SIZE); static std::vector<INT32> sortindex;
sortindex.reserve(DRAWNODES_INIT_SIZE);
// Array for storing the rendering order. // Array for storing the rendering order.
// A list of indices into the drawnodes array. // A list of indices into the drawnodes array.
@@ -4501,6 +4514,7 @@ static void HWR_RenderDrawNodes(void)
drawnodes.clear(); // clear so our size is 0 again! drawnodes.clear(); // clear so our size is 0 again!
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Draw all vissprites // Draw all vissprites
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@@ -4818,9 +4832,11 @@ static void HWR_ProjectSprite(mobj_t *thing)
) )
{ {
ang = R_PointToAngle(interp.x, interp.y); ang = R_PointToAngle(interp.x, interp.y);
#ifdef ROTSPRITE #ifdef ROTSPRITE
camang = ang; camang = ang;
#endif #endif
ang -= interp.angle; ang -= interp.angle;
if (mirrored) if (mirrored)
@@ -4835,7 +4851,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
flip = sprframe->flip; // Will only be 0x00 or 0xFF flip = sprframe->flip; // Will only be 0x00 or 0xFF
if (papersprite && ang < ANGLE_180) if (papersprite && ang < ANGLE_180)
flip ^= 0xFF; flip ^= 0xFFFF;
} }
else else
{ {
@@ -4855,9 +4871,9 @@ static void HWR_ProjectSprite(mobj_t *thing)
flip ^= (1<<rot); flip ^= (1<<rot);
} }
spr_width = spritecachedinfo[lumpoff].width; spr_width = spritecachedinfo[lumpoff].width;
spr_height = spritecachedinfo[lumpoff].height; spr_height = spritecachedinfo[lumpoff].height;
spr_offset = spritecachedinfo[lumpoff].offset; spr_offset = spritecachedinfo[lumpoff].offset;
spr_topoffset = spritecachedinfo[lumpoff].topoffset; spr_topoffset = spritecachedinfo[lumpoff].topoffset;
#ifdef ROTSPRITE #ifdef ROTSPRITE
@@ -4943,11 +4959,11 @@ static void HWR_ProjectSprite(mobj_t *thing)
// if the sprite is out of our view, dont need to draw it X) // if the sprite is out of our view, dont need to draw it X)
if (!gld_SphereInFrustum( if (!gld_SphereInFrustum(
(FixedToFloat(interp.x)) + cos_inv_yaw * (x1 + x2) / 2.0f, (FixedToFloat(interp.x)) + cos_inv_yaw * (x1 + x2) / 2.0f,
FixedToFloat(interp.z) + (y1 + y2) / 2.0f, FixedToFloat(interp.z) + (y1 + y2) / 2.0f,
FixedToFloat(interp.y) - sin_inv_yaw * (x1 + x2) / 2.0f, FixedToFloat(interp.y) - sin_inv_yaw * (x1 + x2) / 2.0f,
//1.5 == sqrt(2) + small delta for MF_FOREGROUND //1.5 == sqrt(2) + small delta for MF_FOREGROUND
std::max<float>(FixedToFloat(spr_width) * spritexscale, std::max<float>(FixedToFloat(spr_width) * spritexscale,
FixedToFloat(spr_height) * spriteyscale) / 2.0f * 1.5f)) FixedToFloat(spr_height) * spriteyscale) / 2.0f * 1.5f))
{ {
return; return;
} }
@@ -5006,10 +5022,10 @@ static void HWR_ProjectSprite(mobj_t *thing)
vis->flip = flip; vis->flip = flip;
vis->scale = thing_scale; vis->scale = thing_scale;
/*vis->spritexscale = spritexscale; vis->spritexscale = spritexscale;
vis->spriteyscale = spriteyscale; vis->spriteyscale = spriteyscale;
vis->spritexoffset = FixedToFloat(spr_offset); vis->spritexoffset = FixedToFloat(spr_offset);
vis->spriteyoffset = FixedToFloat(spr_topoffset);*/ vis->spriteyoffset = FixedToFloat(spr_topoffset);
#ifdef ROTSPRITE #ifdef ROTSPRITE
if (rotsprite != NULL) if (rotsprite != NULL)
@@ -5138,9 +5154,9 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
lumpoff = sprframe->lumpid[0]; lumpoff = sprframe->lumpid[0];
flip = sprframe->flip; // Will only be 0x00 or 0xFF flip = sprframe->flip; // Will only be 0x00 or 0xFF
spr_width = spritecachedinfo[lumpoff].width; spr_width = spritecachedinfo[lumpoff].width;
spr_height = spritecachedinfo[lumpoff].height; spr_height = spritecachedinfo[lumpoff].height;
spr_offset = spritecachedinfo[lumpoff].offset; spr_offset = spritecachedinfo[lumpoff].offset;
spr_topoffset = spritecachedinfo[lumpoff].topoffset; spr_topoffset = spritecachedinfo[lumpoff].topoffset;
if (flip) if (flip)
@@ -5163,11 +5179,11 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
if (!gld_SphereInFrustum( if (!gld_SphereInFrustum(
(FixedToFloat(interp.x)) + cos_inv_yaw * (x1 + x2) / 2.0f, (FixedToFloat(interp.x)) + cos_inv_yaw * (x1 + x2) / 2.0f,
FixedToFloat(interp.z) + (y1 + y2) / 2.0f, FixedToFloat(interp.z) + (y1 + y2) / 2.0f,
FixedToFloat(interp.y) - sin_inv_yaw * (x1 + x2) / 2.0f, FixedToFloat(interp.y) - sin_inv_yaw * (x1 + x2) / 2.0f,
//1.5 == sqrt(2) + small delta for MF_FOREGROUND //1.5 == sqrt(2) + small delta for MF_FOREGROUND
std::max<float>(FixedToFloat(spr_width) * thing_scale, std::max<float>(FixedToFloat(spr_width) * thing_scale,
FixedToFloat(spr_height) * thing_scale) / 2.0f * 1.5f)) FixedToFloat(spr_height) * thing_scale) / 2.0f * 1.5f))
{ {
return; return;
} }
@@ -5280,6 +5296,7 @@ void HWR_ClearSkyDome(void)
sky->loops = NULL; sky->loops = NULL;
sky->data = NULL; sky->data = NULL;
sky->vbo = 0;
sky->rows = sky->columns = 0; sky->rows = sky->columns = 0;
sky->loopcount = 0; sky->loopcount = 0;
@@ -5691,12 +5708,6 @@ extern "C" {
// ========================================================================== // ==========================================================================
static void HWR_RenderFrame(boolean skybox, boolean drawsky) static void HWR_RenderFrame(boolean skybox, boolean drawsky)
{ {
// NetUpdate below may cause this to be false midrender if toggled
const boolean useportals = HWR_UsePortals();
if (useportals)
GL_EnableStencilTest();
// Clear view, set viewport (glViewport), set perspective... // Clear view, set viewport (glViewport), set perspective...
HWR_ClearView(); HWR_ClearView();
@@ -5714,7 +5725,7 @@ static void HWR_RenderFrame(boolean skybox, boolean drawsky)
viewwindowy, viewwindowy,
(viewwindowx + viewwidth), (viewwindowx + viewwidth),
(viewwindowy + viewheight), (viewwindowy + viewheight),
ZCLIP_PLANE, clipping_distances[renderdist - 1]); ZCLIP_PLANE, clipping_distances[renderdist - 1]);
current_bsp_culling_distance = bsp_culling_distances[renderdist- 1]; current_bsp_culling_distance = bsp_culling_distances[renderdist- 1];
} }
@@ -5722,14 +5733,11 @@ static void HWR_RenderFrame(boolean skybox, boolean drawsky)
NetUpdate(); NetUpdate();
portalclipline = NULL; portalclipline = NULL;
if (useportals) if (UNLIKELY(HWR_UsePortals()))
HWR_RenderViewpoint<RenderViewpointType::kPortal>(NULL, 0, !skybox); HWR_RenderViewpoint<RenderViewpointType::kPortal>(NULL, 0, !skybox);
else else
HWR_RenderViewpoint<RenderViewpointType::kNormal>(NULL, 0, !skybox); HWR_RenderViewpoint<RenderViewpointType::kNormal>(NULL, 0, !skybox);
if (useportals)
GL_DisableStencilTest();
// Check for new console commands. // Check for new console commands.
NetUpdate(); NetUpdate();
} }
@@ -5906,6 +5914,7 @@ void HWR_AddCommands(void)
CV_RegisterVar(&cv_glpaletterendering); CV_RegisterVar(&cv_glpaletterendering);
CV_RegisterVar(&cv_glpalettedepth); CV_RegisterVar(&cv_glpalettedepth);
CV_RegisterVar(&cv_glflashpal);
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@@ -5985,7 +5994,7 @@ static void COM_HWR_glinfo(void)
// if the GPU is super new and supports a bajillion extensions - xyzzy // if the GPU is super new and supports a bajillion extensions - xyzzy
char *copy = strdup((const char*)gl_extensions); char *copy = strdup((const char*)gl_extensions);
char *ext; char *ext = strtok(copy, " ");
if (copy == NULL) if (copy == NULL)
{ {
@@ -5993,8 +6002,6 @@ static void COM_HWR_glinfo(void)
return; return;
} }
ext = strtok(copy, " ");
do do
{ {
CONS_Printf(" - %s\n", ext); CONS_Printf(" - %s\n", ext);
@@ -6064,7 +6071,7 @@ static void HWR_DoPostProcessor(void)
{ {
// Armageddon Blast Flash! // Armageddon Blast Flash!
// Could this even be considered postprocessor? // Could this even be considered postprocessor?
if (!HWR_ShouldUsePaletteRendering()) if (!HWR_PalRenderFlashpal())
{ {
const player_t *player = &players[displayplayers[viewssnum]]; const player_t *player = &players[displayplayers[viewssnum]];
@@ -6077,7 +6084,7 @@ static void HWR_DoPostProcessor(void)
{-4.0f, -4.0f, 4.0f, 0.0f, 0.0f} {-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 // This won't change if the flash palettes are changed unfortunately, but it works for its purpose
if (player->flashpal == PAL_NUKE) if (player->flashpal == PAL_NUKE)
@@ -6096,66 +6103,64 @@ static void HWR_DoPostProcessor(void)
} }
} }
// screen textures are needed for the rest of the effects if (cv_glscreentextures.value != 2) // screen textures are needed for the rest of the effects
if (cv_glscreentextures.value != 2)
return; return;
// Not supported in splitscreen - someone want to add support? //UINT8 viewnum = R_GetViewNumber(); // see below
if (splitscreen || cv_reducevfx.value)
return;
//UINT8 viewnum = R_GetViewNumber();
//camera_t *thiscam = &camera[viewnum]; //camera_t *thiscam = &camera[viewnum];
const camera_t *thiscam = &camera[0]; const camera_t *thiscam = &camera[0];
if (!(thiscam->postimg & POSTIMG_WATER || thiscam->postimg & POSTIMG_HEAT)) // Not supported in splitscreen - someone want to add support?
return; const boolean screenwave = (!splitscreen && !cv_reducevfx.value && (thiscam->postimg & POSTIMG_WATER || thiscam->postimg & POSTIMG_HEAT));
// Capture the screen for intermission and screen waving // Capture the screen for intermission and screen waving
if (gamestate != GS_INTERMISSION) if ((lastdraw || screenwave) && gamestate != GS_INTERMISSION)
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC1); GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC1);
// Drunken vision! WooOOooo~ // Drunken vision! WooOOooo~
// 10 by 10 grid. 2 coordinates (xy) if (screenwave)
float v[SCREENVERTS][SCREENVERTS][2];
float disStart = (leveltime-1) + FixedToFloat(R_GetTimeFrac(RTF_LEVEL));
UINT8 x, y;
float WAVELENGTH;
float AMPLITUDE;
float FREQUENCY;
// Modifies the wave.
if (thiscam->postimg & POSTIMG_WATER)
{ {
WAVELENGTH = 5.0f; // 10 by 10 grid. 2 coordinates (xy)
AMPLITUDE = 40.0f; float v[SCREENVERTS][SCREENVERTS][2];
FREQUENCY = 8.0f; float disStart = (leveltime-1) + FixedToFloat(R_GetTimeFrac(RTF_LEVEL));
}
else
{
WAVELENGTH = 10.0f;
AMPLITUDE = 60.0f;
FREQUENCY = 4.0f;
}
//static constexpr float scale = ((float)SCREENVERTS - 1.0f) / 9.0f; // well this evals to just 1.0f and what is x / 1? kek UINT8 x, y;
float WAVELENGTH;
float AMPLITUDE;
float FREQUENCY;
for (x = 0; x < SCREENVERTS; x++) // Modifies the wave.
{ if (thiscam->postimg & POSTIMG_WATER)
for (y = 0; y < SCREENVERTS; y++)
{ {
// Change X position based on its Y position. WAVELENGTH = 5.0f;
v[x][y][0] = x-4.5f + sinf(((disStart+(static_cast<float>(y) * WAVELENGTH)) / FREQUENCY)) / AMPLITUDE; // (x / scale) AMPLITUDE = 40.0f;
v[x][y][1] = y-4.5f; // (y / scale) FREQUENCY = 8.0f;
} }
else
{
WAVELENGTH = 10.0f;
AMPLITUDE = 60.0f;
FREQUENCY = 4.0f;
}
//static constexpr float scale = ((float)SCREENVERTS - 1.0f) / 9.0f; // well this evals to just 1.0f and what is x / 1? kek
for (x = 0; x < SCREENVERTS; x++)
{
for (y = 0; y < SCREENVERTS; y++)
{
// Change X position based on its Y position.
v[x][y][0] = x-4.5f + sinf(((disStart+(static_cast<float>(y) * WAVELENGTH)) / FREQUENCY)) / AMPLITUDE; // (x / scale)
v[x][y][1] = y-4.5f; // (y / scale)
}
}
GL_PostImgRedraw(v);
// Capture the screen again for screen waving on the intermission
if (gamestate != GS_INTERMISSION)
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC1);
} }
GL_PostImgRedraw(v);
// Capture the screen again for screen waving on the intermission
if (gamestate != GS_INTERMISSION)
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC1);
// Flipping of the screen isn't done here anymore // Flipping of the screen isn't done here anymore
} }
+8 -7
View File
@@ -151,19 +151,14 @@ FUNCINLINE static ATTRINLINE void HWR_RenderVhsEffect(fixed_t upbary, fixed_t do
GL_RenderVhsEffect(upbary, downbary, updistort, downdistort, barsize); GL_RenderVhsEffect(upbary, downbary, updistort, downdistort, barsize);
} }
FUNCINLINE static ATTRINLINE void HWR_MakeScreenTexture(void)
{
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC1);
}
FUNCINLINE static ATTRINLINE void HWR_MakeScreenFinalTexture(void) FUNCINLINE static ATTRINLINE void HWR_MakeScreenFinalTexture(void)
{ {
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC2); GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC2);
} }
FUNCINLINE static ATTRINLINE void HWR_DrawScreenFinalTexture(INT32 width, INT32 height) FUNCINLINE static ATTRINLINE void HWR_DrawScreenFinalTexture(INT32 width, INT32 height, boolean useshader)
{ {
GL_DrawScreenFinalTexture(HWD_SCREENTEXTURE_GENERIC2, width, height); GL_DrawScreenFinalTexture(HWD_SCREENTEXTURE_GENERIC2, width, height, useshader);
} }
// hw_main.c: Segs // hw_main.c: Segs
@@ -213,6 +208,7 @@ extern consvar_t cv_glportals;
extern consvar_t cv_glpaletterendering; extern consvar_t cv_glpaletterendering;
extern consvar_t cv_glpalettedepth; extern consvar_t cv_glpalettedepth;
extern consvar_t cv_glflashpal;
FUNCINLINE static ATTRINLINE boolean HWR_UseShader(void) FUNCINLINE static ATTRINLINE boolean HWR_UseShader(void)
{ {
@@ -224,6 +220,11 @@ FUNCINLINE static ATTRINLINE boolean HWR_ShouldUsePaletteRendering(void)
return (cv_glpaletterendering.value && (pLocalPalette != NULL) && HWR_UseShader()); 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. // Returns a pointer to the palette which should be used for caching textures.
FUNCINLINE static ATTRINLINE RGBA_t *HWR_GetTexturePalette(void) FUNCINLINE static ATTRINLINE RGBA_t *HWR_GetTexturePalette(void)
{ {
+21 -13
View File
@@ -693,15 +693,17 @@ static void HWR_CreateBlendedTexture(patch_t *gpatch, patch_t *blendgpatch, GLMi
GLPatch_t *hwrBlendPatch = blendgpatch->hardware; GLPatch_t *hwrBlendPatch = blendgpatch->hardware;
UINT16 w = gpatch->width, h = gpatch->height; UINT16 w = gpatch->width, h = gpatch->height;
UINT32 size = w*h; UINT32 size = w*h;
RGBA_t *image, *blendimage, *cur; RGBA_t *image, *blendimage, *cur, blendcolor;
RGBA_t blendcolor = {};
RGBA_t *palette = HWR_GetTexturePalette(); RGBA_t *palette = HWR_GetTexturePalette();
UINT8 translation[17] = {}; // First the color index UINT8 translation[17]; // First the color index
UINT8 cutoff[17] = {}; // Brightness cutoff before using the next color UINT8 cutoff[17]; // Brightness cutoff before using the next color
UINT8 translen = 0; UINT8 translen = 0;
UINT8 i; UINT8 i;
UINT8 colorbrightnesses[17] = {}; UINT8 colorbrightnesses[17];
UINT8 color_match_lookup[256] = {}; // optimization attempt UINT8 color_match_lookup[256]; // optimization attempt
memset(translation, 0, sizeof(translation));
memset(cutoff, 0, sizeof(cutoff));
if (glMipmap->width == 0) if (glMipmap->width == 0)
{ {
@@ -714,10 +716,14 @@ static void HWR_CreateBlendedTexture(patch_t *gpatch, patch_t *blendgpatch, GLMi
glMipmap->format = GL_TEXFMT_RGBA; glMipmap->format = GL_TEXFMT_RGBA;
} }
Z_Free(glMipmap->data); if (glMipmap->data)
glMipmap->data = NULL; {
Z_Free(glMipmap->data);
glMipmap->data = NULL;
}
cur = Z_Calloc(size*4, PU_HWRMODELTEXTURE, &glMipmap->data); cur = Z_Malloc(size*4, PU_HWRMODELTEXTURE, &glMipmap->data);
memset(cur, 0x00, size*4);
image = hwrPatch->mipmap->data; image = hwrPatch->mipmap->data;
blendimage = hwrBlendPatch->mipmap->data; blendimage = hwrBlendPatch->mipmap->data;
@@ -1031,6 +1037,7 @@ static void HWR_GetBlendedTexture(patch_t *patch, patch_t *blendgpatch, INT32 sk
GLPatch_t *glPatch = patch->hardware; GLPatch_t *glPatch = patch->hardware;
GLMipmap_t *glMipmap, *newMipmap; GLMipmap_t *glMipmap, *newMipmap;
if (blendgpatch == NULL || colormap == colormaps || colormap == NULL) if (blendgpatch == NULL || colormap == colormaps || colormap == NULL)
{ {
// Don't do any blending // Don't do any blending
@@ -1099,7 +1106,7 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
INT32 frame = 0; INT32 frame = 0;
INT32 nextFrame = -1; INT32 nextFrame = -1;
FTransform p; FTransform p;
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
if (!cv_glmdls.value || spr->precip) if (!cv_glmdls.value || spr->precip)
return; return;
@@ -1336,8 +1343,8 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
if (spr->mobj->frame & FF_ANIMATE) if (spr->mobj->frame & FF_ANIMATE)
{ {
// set duration and tics to be the correct values for FF_ANIMATE states // set duration and tics to be the correct values for FF_ANIMATE states
durs = spr->mobj->state->var2; durs = (float)spr->mobj->state->var2;
tics = (INT32)spr->mobj->anim_duration; tics = (float)spr->mobj->anim_duration;
} }
//FIXME: this is not yet correct //FIXME: this is not yet correct
@@ -1475,7 +1482,7 @@ void HWR_Draw2DModel(md2_t *md2, INT32 x, INT32 y, INT32 skinnum, skincolors_t c
patch_t *gpatch, *blendgpatch; patch_t *gpatch, *blendgpatch;
GLPatch_t *hwrPatch = NULL, *hwrBlendPatch = NULL; GLPatch_t *hwrPatch = NULL, *hwrBlendPatch = NULL;
FTransform p; FTransform p;
FSurfaceInfo Surf = {}; FSurfaceInfo Surf;
if (!md2->model) if (!md2->model)
{ {
@@ -1526,6 +1533,7 @@ void HWR_Draw2DModel(md2_t *md2, INT32 x, INT32 y, INT32 skinnum, skincolors_t c
if (blendgpatch) if (blendgpatch)
hwrBlendPatch = ((GLPatch_t *)blendgpatch->hardware); hwrBlendPatch = ((GLPatch_t *)blendgpatch->hardware);
memset(&Surf, 0x00, sizeof(FSurfaceInfo));
Surf.PolyColor.rgba = 0xFFFFFFFF; Surf.PolyColor.rgba = 0xFFFFFFFF;
Surf.PolyFlags = PF_Occlude | PF_Modulated; Surf.PolyFlags = PF_Occlude | PF_Modulated;
+4 -3
View File
@@ -154,7 +154,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
char *buffer; char *buffer;
int surfEnd; int surfEnd;
int i, t; int i, t;
//int matCount; int matCount;
FILE *f; FILE *f;
if (!latlnginit) if (!latlnginit)
@@ -227,7 +227,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
retModel->meshes = (mesh_t*)Z_Calloc(sizeof(mesh_t)*retModel->numMeshes, ztag, NULL); retModel->meshes = (mesh_t*)Z_Calloc(sizeof(mesh_t)*retModel->numMeshes, ztag, NULL);
//matCount = 0; matCount = 0;
for (i = 0, surfEnd = 0; i < mdh->numSurfaces; i++) for (i = 0, surfEnd = 0; i < mdh->numSurfaces; i++)
{ {
int j; int j;
@@ -237,7 +237,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
mdShader = (md3Shader*)((char*)mdS + mdS->offsetShaders); mdShader = (md3Shader*)((char*)mdS + mdS->offsetShaders);
for (j = 0; j < mdS->numShaders; j++ /*, matCount++*/) for (j = 0; j < mdS->numShaders; j++, matCount++)
{ {
size_t len = strlen(mdShader[j].name); size_t len = strlen(mdShader[j].name);
mdShader[j].name[len-1] = 'z'; mdShader[j].name[len-1] = 'z';
@@ -503,6 +503,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
} }
}*/ }*/
free(buffer); free(buffer);
return retModel; return retModel;
+3 -9
View File
@@ -109,7 +109,7 @@ boolean HWR_InitShaders(void)
// returns INT32_MAX if not found // returns INT32_MAX if not found
static INT32 strstr_int(const char *str1, const char *str2) static INT32 strstr_int(const char *str1, const char *str2)
{ {
gconst char *location = strstr(str1, str2); char *location = strstr(str1, str2);
if (location) if (location)
return location - str1; return location - str1;
else else
@@ -365,17 +365,13 @@ static void HWR_CompileShader(int index)
if (vertex_source) if (vertex_source)
{ {
char *preprocessed = HWR_PreprocessShader(vertex_source); char *preprocessed = HWR_PreprocessShader(vertex_source);
if (!preprocessed) if (!preprocessed) return;
return;
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_VERTEX); GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_VERTEX);
} }
if (fragment_source) if (fragment_source)
{ {
char *preprocessed = HWR_PreprocessShader(fragment_source); char *preprocessed = HWR_PreprocessShader(fragment_source);
if (!preprocessed) if (!preprocessed) return;
return;
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_FRAGMENT); GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_FRAGMENT);
} }
@@ -391,10 +387,8 @@ void HWR_CompileShaders(void)
{ {
int custom_index = gl_shadertargets[i].custom_shader; int custom_index = gl_shadertargets[i].custom_shader;
HWR_CompileShader(i); HWR_CompileShader(i);
if (!gl_shaders[i].compiled) if (!gl_shaders[i].compiled)
CONS_Alert(CONS_ERROR, "HWR_CompileShaders: Compilation failed for base %s shader!\n", shaderxlat[i].type); CONS_Alert(CONS_ERROR, "HWR_CompileShaders: Compilation failed for base %s shader!\n", shaderxlat[i].type);
if (custom_index != -1) if (custom_index != -1)
{ {
HWR_CompileShader(custom_index); HWR_CompileShader(custom_index);
+19 -9
View File
@@ -78,23 +78,33 @@
// Include GLSL_FLOOR_FUDGES or GLSL_WALL_FUDGES or define the fudges in shaders that use this macro. // Include GLSL_FLOOR_FUDGES or GLSL_WALL_FUDGES or define the fudges in shaders that use this macro.
#define GLSL_DOOM_COLORMAP_DITHER \ #define GLSL_DOOM_COLORMAP_DITHER \
"float baseValue = max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \ "float baseValue = max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \
"float patscale = min(scr_resolution.x / 1280.0, scr_resolution.y / 720.0);\n" \ "float endResolutionx = scr_resolution.x;\n" \
"patscale = max(floor(patscale + 0.5), 1.0);\n" \ "float endResolutiony = scr_resolution.y;\n" \
"patscale = 1.0 / patscale;\n" \ "if (scr_resolution.x > 1280.0) {\n" \
"ivec2 p = ivec2(mod(floor(position * patscale), 4.0));\n" \ "endResolutionx = scr_resolution.x * 0.5;\n" \
"float depthfactor = clamp((z - 192.0) / (6144.0 - 192.0), 0.0, 1.0);\n" \ "}\n" \
"if (scr_resolution.y > 720.0) {\n" \
"endResolutiony = scr_resolution.y * 0.5;\n" \
"}\n" \
"float zFactor = clamp((z - 192.0) / (6144.0 - 192.0), 0.0, 1.0);\n" \
"int scaleFactor = int(mix(1.0, 8.0, zFactor));\n" \
"endResolutionx = endResolutionx * scaleFactor;\n" \
"endResolutiony = endResolutiony * scaleFactor;\n" \
"vec2 normalizedPosition = position * vec2(endResolutionx / scr_resolution.x, endResolutiony / scr_resolution.y);\n" \
"int x = int(mod(normalizedPosition.x, 4.0));\n" \
"int y = int(mod(normalizedPosition.y, 4.0));\n" \
"float bayerMatrix[4*4] = float[4*4](\n" \ "float bayerMatrix[4*4] = float[4*4](\n" \
"0.0, 8.0, 2.0, 10.0,\n" \ "0.0, 8.0, 2.0, 10.0,\n" \
"12.0, 4.0, 14.0, 6.0,\n" \ "12.0, 4.0, 14.0, 6.0,\n" \
"3.0, 11.0, 1.0, 9.0,\n" \ "3.0, 11.0, 1.0, 9.0,\n" \
"15.0, 7.0, 13.0, 5.0\n" \ "15.0, 7.0, 13.0, 5.0\n" \
");\n" \ ");\n" \
"float threshold = 16.0;\n" \
"#ifdef SRB2_PALETTE_RENDERING\n" \ "#ifdef SRB2_PALETTE_RENDERING\n" \
"threshold = 11.0;\n" \ "float threshold = (1.0 - pow(zFactor, 2.0)) * (bayerMatrix[y*4 + x] / 11.0);\n" \
"#else\n" \
"float threshold = (1.0 - pow(zFactor, 2.0)) * (bayerMatrix[y*4 + x] / 16.0);\n" \
"#endif\n" \ "#endif\n" \
"threshold = (1.0 - pow(depthfactor, 2.0)) * (bayerMatrix[p.y*4 + p.x] / threshold);\n" \ "return mix(baseValue + threshold - 0.5 / 16.0, baseValue, zFactor);\n"
"return mix(baseValue + threshold - 0.5 / 16.0, baseValue, depthfactor);\n"
#define GLSL_DOOM_COLORMAP_NODITHER \ #define GLSL_DOOM_COLORMAP_NODITHER \
"return max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \ "return max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \
+19 -38
View File
@@ -1068,13 +1068,6 @@ void GL_SetShader(int slot)
gl_shadersenabled = false; gl_shadersenabled = false;
} }
void GL_EnableShader(void)
{
// we can just use GL_Shader_SetUniforms as itll enable the shader for us
// and handle any failures
GL_Shader_SetUniforms(NULL, NULL, NULL, NULL);
}
void GL_UnSetShader(void) void GL_UnSetShader(void)
{ {
if (gl_shadersenabled) // don't repeatedly call glUseProgram if not needed if (gl_shadersenabled) // don't repeatedly call glUseProgram if not needed
@@ -1284,7 +1277,7 @@ void GL_SetStates(void)
pglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); pglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
pglDisable(GL_STENCIL_TEST); pglEnable(GL_STENCIL_TEST);
pglEnable(GL_DEPTH_TEST); // check the depth buffer pglEnable(GL_DEPTH_TEST); // check the depth buffer
pglDepthMask(GL_TRUE); // enable writing to depth buffer pglDepthMask(GL_TRUE); // enable writing to depth buffer
pglClearDepth(1.0f); pglClearDepth(1.0f);
@@ -1314,16 +1307,6 @@ void GL_SetStates(void)
#endif #endif
} }
void GL_EnableStencilTest(void)
{
pglEnable(GL_STENCIL_TEST);
}
void GL_DisableStencilTest(void)
{
pglDisable(GL_STENCIL_TEST);
}
// -----------------+ // -----------------+
// DeleteTexture : Deletes a texture from the GPU and frees its data // DeleteTexture : Deletes a texture from the GPU and frees its data
// -----------------+ // -----------------+
@@ -1400,19 +1383,19 @@ void GL_Flush(void)
// -----------------+ // -----------------+
INT32 GL_isExtAvailable(const char *extension, const GLubyte *start) INT32 GL_isExtAvailable(const char *extension, const GLubyte *start)
{ {
gconst GLubyte *where, *terminator; GLubyte *where, *terminator;
if (!extension || !start) if (!extension || !start)
return 0; return 0;
where = (gconst GLubyte *)strchr(extension, ' '); where = (GLubyte *) strchr(extension, ' ');
if (where || *extension == '\0') if (where || *extension == '\0')
return 0; return 0;
for (;;) for (;;)
{ {
where = (gconst GLubyte *)strstr((const char *)start, extension); where = (GLubyte *) strstr((const char *) start, extension);
if (!where) if (!where)
break; break;
@@ -3260,6 +3243,14 @@ static void GL_Framebuffer_Generate(void)
if (!framebufferobject.fboobj) if (!framebufferobject.fboobj)
pglGenFramebuffers(1, &framebufferobject.fboobj); pglGenFramebuffers(1, &framebufferobject.fboobj);
if (pglCheckFramebufferStatus(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
{
// if this fails, dont retry it a gazillion times
// this wouldnt recover
supportFBO = false;
return;
}
// Bind the framebuffer // Bind the framebuffer
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj); pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj);
@@ -3311,18 +3302,6 @@ static void GL_Framebuffer_Generate(void)
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, 0); pglBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
} }
if (pglCheckFramebufferStatus(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
{
//pglGetError(); TODO:implement this or smth
GL_MSG_Error("GL_Framebuffer_Generate: Failed to create Framebuffer Object");
// if this fails, dont retry it a gazillion times
// this wouldnt recover
supportFBO = false;
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
return;
}
// Unbind the framebuffer // Unbind the framebuffer
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
@@ -3345,10 +3324,6 @@ void GL_Framebuffer_Enable(void)
GL_Framebuffer_Generate(); GL_Framebuffer_Generate();
// failed
if (!supportFBO || !framebufferobject.init)
return;
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj); pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj);
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, framebufferobject.rboobj); pglBindRenderbuffer(GL_RENDERBUFFER_EXT, framebufferobject.rboobj);
} }
@@ -3743,7 +3718,7 @@ void GL_MakeScreenTexture(int tex)
tex_downloaded = screenTextures[tex]; tex_downloaded = screenTextures[tex];
} }
void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height) void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean useshader)
{ {
float xfix, yfix; float xfix, yfix;
float origaspect, newaspect; float origaspect, newaspect;
@@ -3796,6 +3771,9 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height)
pglBindTexture(GL_TEXTURE_2D, screenTextures[tex]); pglBindTexture(GL_TEXTURE_2D, screenTextures[tex]);
if (useshader)
pglUseProgram(gl_shaders[SHADER_PALETTE_POSTPROCESS].program); // Final postprocess step of palette rendering, after everything else has been drawn.
pglColor4ubv(white); pglColor4ubv(white);
pglTexCoordPointer(2, GL_FLOAT, 0, fix); pglTexCoordPointer(2, GL_FLOAT, 0, fix);
@@ -3803,6 +3781,9 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height)
pglDrawArrays(GL_TRIANGLE_FAN, 0, 4); pglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
if (useshader)
pglUseProgram(0);
tex_downloaded = screenTextures[tex]; tex_downloaded = screenTextures[tex];
} }
+10 -12
View File
@@ -62,7 +62,7 @@ static int hms_started;
static char *hms_api; static char *hms_api;
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
static I_mutex hms_api_mutex; static I_Mutex hms_api_mutex;
#endif #endif
static char *hms_server_token; static char *hms_server_token;
@@ -90,9 +90,9 @@ Printf_url (const char *url)
boolean startup; boolean startup;
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&con_mutex); I_LockMutex(&con_mutex);
startup = con_startup; startup = con_startup;
I_unlock_mutex(con_mutex); I_UnlockMutex(con_mutex);
#else #else
startup = con_startup; startup = con_startup;
#endif #endif
@@ -183,7 +183,7 @@ HMS_connect (const char *format, ...)
} }
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&hms_api_mutex); I_LockMutex(&hms_api_mutex);
#endif #endif
seek = strlen(hms_api) + 1;/* + '/' */ seek = strlen(hms_api) + 1;/* + '/' */
@@ -195,7 +195,7 @@ HMS_connect (const char *format, ...)
sprintf(url, "%s/", hms_api); sprintf(url, "%s/", hms_api);
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_unlock_mutex(hms_api_mutex); I_UnlockMutex(hms_api_mutex);
#endif #endif
va_start (ap, format); va_start (ap, format);
@@ -225,10 +225,9 @@ HMS_connect (const char *format, ...)
{ {
cc = curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); cc = curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf); if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
#ifdef LOGMESSAGES
cc = curl_easy_setopt(curl, CURLOPT_STDERR, logstream); cc = curl_easy_setopt(curl, CURLOPT_STDERR, logstream);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf); if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
#endif
} }
if (M_CheckParm("-bindaddr") && M_IsNextParm()) if (M_CheckParm("-bindaddr") && M_IsNextParm())
@@ -318,7 +317,6 @@ static void
HMS_end (struct HMS_buffer *buffer) HMS_end (struct HMS_buffer *buffer)
{ {
curl_easy_cleanup(buffer->curl); curl_easy_cleanup(buffer->curl);
free(buffer->errbuf);
free(buffer->buffer); free(buffer->buffer);
free(buffer); free(buffer);
} }
@@ -479,12 +477,12 @@ HMS_fetch_servers (msg_server_t *list, int query_id)
if (address && port) if (address && port)
{ {
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&ms_QueryId_mutex); I_LockMutex(&ms_QueryId_mutex);
{ {
if (query_id != ms_QueryId) if (query_id != ms_QueryId)
doing_shit = 0; doing_shit = 0;
} }
I_unlock_mutex(ms_QueryId_mutex); I_UnlockMutex(ms_QueryId_mutex);
if (! doing_shit) if (! doing_shit)
break; break;
@@ -613,14 +611,14 @@ void
HMS_set_api (char *api) HMS_set_api (char *api)
{ {
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&hms_api_mutex); I_LockMutex(&hms_api_mutex);
#endif #endif
{ {
free(hms_api); free(hms_api);
hms_api = Strip_trailing_slashes(api); hms_api = Strip_trailing_slashes(api);
} }
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_unlock_mutex(hms_api_mutex); I_UnlockMutex(hms_api_mutex);
#endif #endif
} }
+230 -82
View File
@@ -97,6 +97,7 @@ static textinput_t w_chat;
static boolean headsupactive = false; static boolean headsupactive = false;
boolean hu_showscores = false; // draw rankings boolean hu_showscores = false; // draw rankings
static char hu_tick; static char hu_tick;
static tic_t hu_emoteanim = 0;
emote_autocomplete_t emote_autocomplete = {0}; emote_autocomplete_t emote_autocomplete = {0};
static huddrawlist_h luahuddrawlist_scores = NULL; static huddrawlist_h luahuddrawlist_scores = NULL;
@@ -115,8 +116,155 @@ static patch_t *songcreditbg = NULL;
// ------- // -------
static void HU_DrawRankings(void); static void HU_DrawRankings(void);
consvar_t cv_showspecstuff = {"showspecstuff", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_showspecstuff = {"showspecstuff", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
//======================================================================
// KEYBOARD LAYOUTS FOR ENTERING TEXT
//======================================================================
char *shiftxform = NULL;
char english_shiftxform[] =
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31,
' ', '!', '"', '#', '$', '%', '&',
'"', // shift-'
'(', ')', '*', '+',
'<', // shift-,
'_', // shift--
'>', // shift-.
'?', // shift-/
')', // shift-0
'!', // shift-1
'@', // shift-2
'#', // shift-3
'$', // shift-4
'%', // shift-5
'^', // shift-6
'&', // shift-7
'*', // shift-8
'(', // shift-9
':',
':', // shift-;
'<',
'+', // shift-=
'>', '?', '@',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'{', // shift-[
'|', // shift-backslash - OH MY GOD DOES WATCOM SUCK
'}', // shift-]
'"', '_',
'~', // shift-`
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'{', '|', '}', '~', 127
};
char french_shiftxform[] =
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31,
' ','$', //shift-!
'3', //shift-"
'#', '$', '%',
'1', //shift-&
'4', // shift-'
'5', // shift-(
')', // shift-)
'*', '+',
'?', // shift-,
'6', // shift--
'.', '/',
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9',
'/', // shitf-:
'.', // shift-;
'>', // shift-<
'+', // shift-=
'>', '?', '@',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'[', '\\', ']', '^',
'8', //shift-_
'`',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'{', '|', '}', '~', 127,
128, 129,
'2',
131, 132,
'0',
134,
'9',
136, 137,
'7',
139, 140,
'%'
};
char french_altgrxform[] =
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31,
' ', '!',
'#', //altgr-"
'#', '$', '%', '&',
'{', //altgr-'
'[', //altgr-(
']', //altgr-)
'*', '+', ',',
'|', //altg--
'.', '/',
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9',
':', ';', '<',
'}', //altgr-=
'>', '?', '@',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'[', '\\', ']', '^',
'\\', //altgr-backslash
'`',
'a', 'b', 'c', 'd', 'E', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'{', '|', '}', '~', 127,
128, 129,
'~',
131, 132,
'@',
134,
'^',
136, 137,
'`',
139, 140,
KEY_FR_U_GRAVE
};
//fallback for special letter non displayable in the game (i.e.: 'é','à',etc.)
INT32 HU_FallBackFrSpecialLetter(INT32 key)
{
switch(key){
case KEY_FR_E_AIGUE: return 'e';
case KEY_FR_E_GRAVE: return 'e';
case KEY_FR_C_CEDILLE: return 'c';
case KEY_FR_A_GRAVE: return 'a';
case KEY_FR_U_GRAVE: return 'u';
default: return key;
}
}
static char cechotext[1024]; static char cechotext[1024];
static tic_t cechotimer = 0; static tic_t cechotimer = 0;
static tic_t cechoduration = 5*TICRATE; static tic_t cechoduration = 5*TICRATE;
@@ -260,6 +408,9 @@ void HU_Init(void)
COM_AddCommand("csay", Command_CSay_f); COM_AddCommand("csay", Command_CSay_f);
RegisterNetXCmd(XD_SAY, Got_Saycmd); RegisterNetXCmd(XD_SAY, Got_Saycmd);
// set shift translation table
shiftxform = english_shiftxform;
if (dedicated || rendermode == render_none) if (dedicated || rendermode == render_none)
return; return;
@@ -285,6 +436,11 @@ void HU_Start(void)
headsupactive = true; headsupactive = true;
} }
void HU_Shiftform(void)
{
shiftxform = (cv_keyboardlayout.value == 3) ? french_shiftxform : english_shiftxform;
}
//====================================================================== //======================================================================
// EXECUTION // EXECUTION
//====================================================================== //======================================================================
@@ -341,9 +497,7 @@ static void HU_removeChatText_Log(void)
{ {
chat_log[i] = chat_log[i+1]; chat_log[i] = chat_log[i+1];
} }
chat_nummsg_log--; // lost 1 msg. chat_nummsg_log--; // lost 1 msg.
chat_log[chat_nummsg_log] = NULL;
} }
static void Chatlogsize_OnChange(void) static void Chatlogsize_OnChange(void)
@@ -362,7 +516,6 @@ static void Chatlogsize_OnChange(void)
if (new_chat_log == NULL) if (new_chat_log == NULL)
{ {
free(chat_log); free(chat_log);
chat_log = NULL;
return; return;
} }
chat_log = new_chat_log; chat_log = new_chat_log;
@@ -388,8 +541,6 @@ void HU_AddChatText(const char *text, boolean playsound)
HU_removeChatText_Log(); HU_removeChatText_Log();
chat_log[chat_nummsg_log] = malloc(HU_MSGBUFSIZE); 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); strcpy(chat_log[chat_nummsg_log], text);
++chat_nummsg_log; ++chat_nummsg_log;
@@ -472,10 +623,7 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
// with that logic, characters 4 and 5 are our numbers: // with that logic, characters 4 and 5 are our numbers:
const char *newmsg; const char *newmsg;
INT32 spc = 1; // used if nodenum[1] is a space. INT32 spc = 1; // used if nodenum[1] is a space.
CLEANUP(pfree) char *nodenum = (char*)malloc(3); CLEANUP(pfree) char *nodenum = (char*) malloc(3);
if (!nodenum)
I_Error("DoSayCommand: out of memory for sending pm\n");
memcpy(nodenum, msg+3, 2); memcpy(nodenum, msg+3, 2);
nodenum[2] = '\0'; nodenum[2] = '\0';
@@ -756,7 +904,7 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
target = READSINT8(*p); target = READSINT8(*p);
flags = READUINT8(*p); flags = READUINT8(*p);
msg = buf; 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))) if ((cv_mute.value || flags & (HU_CSAY|HU_SERVER_SAY)) && playernum != serverplayer && !(IsPlayerAdmin(playernum)))
{ {
@@ -944,6 +1092,7 @@ void HU_Ticker(void)
return; return;
hu_tick++; hu_tick++;
hu_emoteanim++;
hu_tick &= 7; // currently only to blink chat input cursor hu_tick &= 7; // currently only to blink chat input cursor
if (PLAYER1INPUTDOWN(gc_scores)) if (PLAYER1INPUTDOWN(gc_scores))
@@ -979,8 +1128,7 @@ void HU_Ticker(void)
} }
} }
if (cechotimer > 0) if (cechotimer > 0) --cechotimer;
--cechotimer;
// Animate the desynch dots // Animate the desynch dots
if (hu_resynching if (hu_resynching
@@ -1081,9 +1229,7 @@ static void HU_SendChatMessage(void)
{ {
INT32 spc = 1; // used if nodenum[1] is a space. INT32 spc = 1; // used if nodenum[1] is a space.
const char *newmsg; const char *newmsg;
CLEANUP(pfree) char *nodenum = (char*)malloc(3); CLEANUP(pfree) char *nodenum = (char*) malloc(3);
if (!nodenum)
I_Error("HU_SendChatMessage: out of memory for sending pm\n");
// what we're gonna do now is check if the node exists // what we're gonna do now is check if the node exists
// with that logic, characters 4 and 5 are our numbers: // with that logic, characters 4 and 5 are our numbers:
@@ -1427,6 +1573,7 @@ static void HU_drawMiniChat(void)
y = chaty - charheight*(msglines+1); y = chaty - charheight*(msglines+1);
#ifdef NETSPLITSCREEN
if (splitscreen) if (splitscreen)
{ {
y -= BASEVIDHEIGHT/2; y -= BASEVIDHEIGHT/2;
@@ -1434,6 +1581,7 @@ static void HU_drawMiniChat(void)
y += 16; y += 16;
} }
else else
#endif
y -= (cv_kartspeedometer.value ? 16 : 0); y -= (cv_kartspeedometer.value ? 16 : 0);
dx = 0; dx = 0;
@@ -1531,15 +1679,18 @@ static void HU_drawChatLog(INT32 offset)
if (chat_scroll > chat_maxscroll) if (chat_scroll > chat_maxscroll)
chat_scroll = chat_maxscroll; chat_scroll = chat_maxscroll;
#ifdef NETSPLITSCREEN
if (splitscreen) if (splitscreen)
{ {
boxh = max(6, boxh/2); boxh = max(6, boxh/2);
if (splitscreen > 1) if (splitscreen > 1)
boxw = max(64, boxw/2); boxw = max(64, boxw/2);
} }
#endif
y = chaty - offset*charheight - (chat_scroll*charheight) - boxh*charheight - 12; y = chaty - offset*charheight - (chat_scroll*charheight) - boxh*charheight - 12;
#ifdef NETSPLITSCREEN
if (splitscreen) if (splitscreen)
{ {
y -= BASEVIDHEIGHT/2; y -= BASEVIDHEIGHT/2;
@@ -1547,6 +1698,7 @@ static void HU_drawChatLog(INT32 offset)
y += 16; y += 16;
} }
else else
#endif
y -= (cv_kartspeedometer.value ? 16 : 0); y -= (cv_kartspeedometer.value ? 16 : 0);
@@ -1655,12 +1807,12 @@ static void HU_DrawChat(void)
INT32 t = 0, c = 0, y = chaty - (typelines*charheight); INT32 t = 0, c = 0, y = chaty - (typelines*charheight);
UINT32 i = 0, saylen = strlen(w_chat_buf); // You learn new things everyday! UINT32 i = 0, saylen = strlen(w_chat_buf); // You learn new things everyday!
INT32 cflag = 0; 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; size_t select_start = 0, select_end = 0;
const char *ntalk = "Say: ", *ttalk = "Team: "; const char *ntalk = "Say: ", *ttalk = "Team: ";
const char *talk = ntalk; const char *talk = ntalk;
const char *mute = "Chat has been muted."; const char *mute = "Chat has been muted.";
#ifdef NETSPLITSCREEN
if (splitscreen) if (splitscreen)
{ {
y -= BASEVIDHEIGHT/2; y -= BASEVIDHEIGHT/2;
@@ -1671,6 +1823,7 @@ static void HU_DrawChat(void)
} }
} }
else else
#endif
y -= (cv_kartspeedometer.value ? 16 : 0); y -= (cv_kartspeedometer.value ? 16 : 0);
if (teamtalk) if (teamtalk)
@@ -1765,13 +1918,71 @@ 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. // 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 if (strnicmp(w_chat_buf, "/pm", 3) == 0 && vid.width >= 400 && !teamtalk) // 320x200 unsupported kthxbai
{ {
INT32 count = 0; INT32 count = 0;
INT32 p_dispy = chaty - charheight - 1; INT32 p_dispy = chaty - charheight - 1;
size_t longest_name_length = 0; size_t longest_name_length = 0;
#ifdef NETSPLITSCREEN
if (splitscreen) if (splitscreen)
{ {
p_dispy -= BASEVIDHEIGHT/2; p_dispy -= BASEVIDHEIGHT/2;
@@ -1779,13 +1990,13 @@ static void HU_DrawChat(void)
p_dispy += 16; p_dispy += 16;
} }
else else
#endif
p_dispy -= (cv_kartspeedometer.value ? 16 : 0); p_dispy -= (cv_kartspeedometer.value ? 16 : 0);
// Find longest player name, for drawing background for /pm list later // Find longest player name, for drawing background for /pm list later
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
if (!playeringame[i]) if (!playeringame[i]) continue;
continue;
longest_name_length = max(longest_name_length, strlen(player_names[i])); longest_name_length = max(longest_name_length, strlen(player_names[i]));
} }
@@ -1845,72 +2056,9 @@ static void HU_DrawChat(void)
if (count == 0) // no results. 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_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."); 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;
if (splitscreen)
{
suggesty -= BASEVIDHEIGHT/2;
if (splitscreen > 1)
suggesty += 16;
}
else
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. 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.
+18
View File
@@ -42,6 +42,15 @@
#define CRED_FONTEND 'Z' // the last font character #define CRED_FONTEND 'Z' // the last font character
#define CRED_FONTSIZE (CRED_FONTEND - CRED_FONTSTART + 1) #define CRED_FONTSIZE (CRED_FONTEND - CRED_FONTSTART + 1)
extern char *shiftxform; // english translation shift table
extern char english_shiftxform[];
extern char french_shiftxform[];
extern char french_altgrxform[];
//fallback for special letter non displayable in the game (i.e.: 'é','à',etc.)
INT32 HU_FallBackFrSpecialLetter(INT32 key);
//------------------------------------ //------------------------------------
// sorted player lines // sorted player lines
//------------------------------------ //------------------------------------
@@ -59,7 +68,12 @@ typedef struct
#define HU_MAXMSGLEN 223 #define HU_MAXMSGLEN 223
#define HU_MSGBUFSIZE 255 #define HU_MSGBUFSIZE 255
#define MAX_CHAT_BUFSIZE 256 // that's enough messages, right? We'll delete the older ones when that gets out of hand. #define MAX_CHAT_BUFSIZE 256 // that's enough messages, right? We'll delete the older ones when that gets out of hand.
#define NETSPLITSCREEN // why the hell WOULDN'T we want this?
#ifdef NETSPLITSCREEN
#define OLDCHAT (cv_consolechat.value == 1 || dedicated || vid.width < 640) #define OLDCHAT (cv_consolechat.value == 1 || dedicated || vid.width < 640)
#else
#define OLDCHAT (cv_consolechat.value == 1 || dedicated || vid.width < 640)
#endif
#define CHAT_MUTE (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer))) // this still allows to open the chat but not to type. That's used for scrolling and whatnot. #define CHAT_MUTE (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer))) // this still allows to open the chat but not to type. That's used for scrolling and whatnot.
#define OLD_MUTE (OLDCHAT && cv_mute.value && !(server || IsPlayerAdmin(consoleplayer))) // this is used to prevent oldchat from opening when muted. #define OLD_MUTE (OLDCHAT && cv_mute.value && !(server || IsPlayerAdmin(consoleplayer))) // this is used to prevent oldchat from opening when muted.
@@ -96,6 +110,8 @@ void HU_LoadGraphics(void);
// reset heads up when consoleplayer respawns. // reset heads up when consoleplayer respawns.
void HU_Start(void); void HU_Start(void);
void HU_Shiftform(void);
boolean HU_Responder(event_t *ev); boolean HU_Responder(event_t *ev);
void HU_Ticker(void); void HU_Ticker(void);
void HU_TickSongCredits(void); void HU_TickSongCredits(void);
@@ -104,6 +120,8 @@ void HU_Drawer(void);
char HU_dequeueChatChar(void); char HU_dequeueChatChar(void);
void HU_clearChatChars(void); void HU_clearChatChars(void);
void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags); // Lat': Ping drawer for scoreboard. void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags); // Lat': Ping drawer for scoreboard.
//void HU_DrawTeamTabRankings(playersort_t *tab, INT32 whiteplayer);
//void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer);
void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 hilicol); void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 hilicol);
void HU_DrawEmeralds(INT32 x, INT32 y, INT32 pemeralds); void HU_DrawEmeralds(INT32 x, INT32 y, INT32 pemeralds);
const char *HU_SkinColorToConsoleColor(skincolors_t color); const char *HU_SkinColorToConsoleColor(skincolors_t color);
+3
View File
@@ -44,6 +44,9 @@ extern "C" {
struct JoyType_s struct JoyType_s
{ {
/*! if true, we MUST Poll() to get new joystick data,
that is: we NEED the DIRECTINPUTDEVICE2 ! (watchout NT compatibility) */
INT32 bJoyNeedPoll;
/*! this joystick is a gamepad, read: digital axes /*! this joystick is a gamepad, read: digital axes
if FALSE, interpret the joystick event data as JOYAXISRANGE (see above) */ if FALSE, interpret the joystick event data as JOYAXISRANGE (see above) */
INT32 bGamepadStyle; INT32 bGamepadStyle;
+1 -10
View File
@@ -43,7 +43,7 @@ extern UINT8 graphics_started;
extern UINT8 keyboard_started; extern UINT8 keyboard_started;
/** \brief Set to true when inside a signal handler that will exit the program. */ /** \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 /** \brief The I_GetFreeMem function
@@ -148,11 +148,6 @@ extern INT32 numcontrollers;
*/ */
const char *I_GetJoyName(INT32 joyindex); const char *I_GetJoyName(INT32 joyindex);
void I_SetJoystickFocus(void);
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_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration);
void I_SetGamepadIndicatorColor(INT32 playernum, UINT8 red, UINT8 green, UINT8 blue); void I_SetGamepadIndicatorColor(INT32 playernum, UINT8 red, UINT8 green, UINT8 blue);
@@ -200,10 +195,6 @@ INT32 I_StartupSystem(void);
*/ */
void I_ShutdownSystem(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 /** \brief The I_GetDiskFreeSpace function
\param freespace a INT64 pointer to hold the free space amount \param freespace a INT64 pointer to hold the free space amount
+7 -12
View File
@@ -392,9 +392,6 @@ static const char *SOCK_GetNodeAddress(INT32 node)
if (node == 0) if (node == 0)
return "self"; return "self";
if (node < 0 || node > MAXNETNODES)
return NULL;
if (!nodeconnected[node]) if (!nodeconnected[node])
return NULL; return NULL;
@@ -499,10 +496,8 @@ static void cleanupnodes(void)
// Why can't I start at zero? // Why can't I start at zero?
for (j = 1; j < MAXNETNODES; j++) for (j = 1; j < MAXNETNODES; j++)
{
if (!(nodeingame[j] || SV_SendingFile(j))) if (!(nodeingame[j] || SV_SendingFile(j)))
nodeconnected[j] = false; nodeconnected[j] = false;
}
} }
static SINT8 getfreenode(void) static SINT8 getfreenode(void)
@@ -512,13 +507,11 @@ static SINT8 getfreenode(void)
cleanupnodes(); cleanupnodes();
for (j = 0; j < MAXNETNODES; j++) for (j = 0; j < MAXNETNODES; j++)
{
if (!nodeconnected[j]) if (!nodeconnected[j])
{ {
nodeconnected[j] = true; nodeconnected[j] = true;
return j; return j;
} }
}
/** \warning No free node? Just in case a node might not have been freed properly, /** \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. * look if there are connected nodes that aren't in game, and forget them.
@@ -819,7 +812,7 @@ static void SOCK_Send(void)
static void SOCK_FreeNodenum(INT32 numnode) static void SOCK_FreeNodenum(INT32 numnode)
{ {
// can't disconnect from self :) // can't disconnect from self :)
if (numnode <= 0 || numnode > MAXNETNODES) if (!numnode || numnode > MAXNETNODES)
return; return;
DEBFILE(va("Free node %d (%s)\n", numnode, SOCK_GetNodeAddress(numnode))); DEBFILE(va("Free node %d (%s)\n", numnode, SOCK_GetNodeAddress(numnode)));
@@ -1439,12 +1432,14 @@ static void SOCK_RegisterHolePunch(void)
static boolean SOCK_OpenSocket(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 nodeconnected[0] = true; // always connected to self
for (i = 1; i < MAXNETNODES; i++)
nodeconnected[i] = false;
nodeconnected[BROADCASTADDR] = true; nodeconnected[BROADCASTADDR] = true;
I_NetSend = SOCK_Send; I_NetSend = SOCK_Send;
I_NetGet = SOCK_Get; I_NetGet = SOCK_Get;
I_NetCloseSocket = SOCK_CloseSocket; I_NetCloseSocket = SOCK_CloseSocket;
@@ -1484,7 +1479,7 @@ static boolean SOCK_Ban(INT32 node)
{ {
INT32 ban; INT32 ban;
if (node < 0 || node > MAXNETNODES) if (node > MAXNETNODES)
return false; return false;
ban = numbans; ban = numbans;
+87 -59
View File
@@ -1,4 +1,4 @@
// SONIC ROBO BLAST 2 // SONIC ROBO BLAST 2 KART
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Copyright (C) 2020-2023 by James R. // Copyright (C) 2020-2023 by James R.
// //
@@ -9,12 +9,14 @@
/// \file i_threads.c /// \file i_threads.c
/// \brief Multithreading abstraction /// \brief Multithreading abstraction
#if defined (__unix__) || (!defined(__APPLE__) && defined (UNIXCOMMON)) #ifdef HAVE_THREADS
#if defined (__unix__) || defined(UNIXCOMMON)
#include <pthread.h> #include <pthread.h>
#include "../i_threads.h" #include "i_threads.h"
#include "../doomdef.h" #include "doomdef.h"
#include "doomtype.h"
typedef struct thread_s thread_t; typedef struct thread_s thread_t;
@@ -22,7 +24,7 @@ struct thread_s
{ {
thread_t *next; thread_t *next;
void *userdata; void *userdata;
I_thread_fn func; I_ThreadFn func;
pthread_t thread; pthread_t thread;
}; };
@@ -41,12 +43,8 @@ static void *HandleThread(void *data)
return NULL; return NULL;
} }
void FUNCWARNRV
I_spawn_thread ( int I_SpawnThread(const char *name, I_ThreadFn entry, void *userdata)
const char * name,
I_thread_fn entry,
void * userdata
)
{ {
thread_t *thread; thread_t *thread;
(void)name; (void)name;
@@ -66,17 +64,20 @@ I_spawn_thread (
if (thread == NULL) if (thread == NULL)
{ {
thread = malloc(sizeof(thread_t)); thread = malloc(sizeof(thread_t));
if (thread == NULL)
return false;
thread->next = thread_list; thread->next = thread_list;
thread_list = thread; thread_list = thread;
} }
thread->func = entry; thread->func = entry;
thread->userdata = userdata; thread->userdata = userdata;
pthread_create(&thread->thread, NULL, HandleThread, thread); int err = pthread_create(&thread->thread, NULL, HandleThread, thread);
pthread_mutex_unlock(&thread_lock); pthread_mutex_unlock(&thread_lock);
return err == 0;
} }
int I_thread_is_stopped(void) int I_ThreadIsStopped(void)
{ {
thread_t *thread; thread_t *thread;
pthread_mutex_lock(&thread_lock); pthread_mutex_lock(&thread_lock);
@@ -94,11 +95,11 @@ int I_thread_is_stopped(void)
return true; return true;
} }
void I_start_threads(void) void I_StartThreads(void)
{ {
} }
void I_stop_threads(void) void I_StopThreads(void)
{ {
thread_t *thread = thread_list; thread_t *thread = thread_list;
while (thread != NULL) while (thread != NULL)
@@ -109,7 +110,7 @@ void I_stop_threads(void)
} }
} }
void I_lock_mutex(I_mutex *anchor) void I_LockMutex(I_Mutex *anchor)
{ {
pthread_mutex_lock(&thread_lock); pthread_mutex_lock(&thread_lock);
if (*anchor == NULL) if (*anchor == NULL)
@@ -127,25 +128,25 @@ void I_lock_mutex(I_mutex *anchor)
pthread_mutex_lock(*anchor); pthread_mutex_lock(*anchor);
} }
void I_unlock_mutex(I_mutex id) void I_UnlockMutex(I_Mutex id)
{ {
pthread_mutex_unlock(id); pthread_mutex_unlock(id);
} }
void I_hold_cond(I_cond *cond_anchor, I_mutex mutex_id) void I_HoldCond(I_Cond *condAnchor, I_Mutex mutexId)
{ {
I_Assert(mutex_id != NULL); I_Assert(mutexId != NULL);
pthread_mutex_lock(&thread_lock); pthread_mutex_lock(&thread_lock);
if (*cond_anchor == NULL) if (*condAnchor == NULL)
{ {
*cond_anchor = malloc(sizeof(pthread_cond_t)); *condAnchor = malloc(sizeof(pthread_cond_t));
pthread_cond_init(*cond_anchor, NULL); pthread_cond_init(*condAnchor, NULL);
} }
pthread_mutex_unlock(&thread_lock); pthread_mutex_unlock(&thread_lock);
pthread_cond_wait(*cond_anchor, mutex_id); pthread_cond_wait(*condAnchor, mutexId);
} }
void I_wake_one_cond(I_cond *anchor) void I_WakeOneCond(I_Cond *anchor)
{ {
pthread_mutex_lock(&thread_lock); pthread_mutex_lock(&thread_lock);
if (*anchor == NULL) if (*anchor == NULL)
@@ -157,7 +158,7 @@ void I_wake_one_cond(I_cond *anchor)
pthread_cond_signal(*anchor); pthread_cond_signal(*anchor);
} }
void I_wake_all_cond(I_cond *anchor) void I_WakeAllCond(I_Cond *anchor)
{ {
pthread_mutex_lock(&thread_lock); pthread_mutex_lock(&thread_lock);
if (*anchor == NULL) if (*anchor == NULL)
@@ -168,12 +169,17 @@ void I_wake_all_cond(I_cond *anchor)
pthread_mutex_unlock(&thread_lock); pthread_mutex_unlock(&thread_lock);
pthread_cond_broadcast(*anchor); pthread_cond_broadcast(*anchor);
} }
thread_handle_t I_GetCurrentThread(void)
{
return pthread_self();
}
#elif defined (_WIN32) #elif defined (_WIN32)
#include <windows.h> #include <windows.h>
#include "../i_threads.h" #include "i_threads.h"
#include "../doomdef.h" #include "doomdef.h"
#include "../doomtype.h" #include "doomtype.h"
typedef struct thread_s thread_t; typedef struct thread_s thread_t;
@@ -181,9 +187,9 @@ struct thread_s
{ {
thread_t *next; thread_t *next;
void *userdata; void *userdata;
I_thread_fn func; I_ThreadFn func;
HANDLE thread; HANDLE thread;
DWORD thread_id; DWORD threadId;
}; };
// we use a linked list to avoid moving memory blocks when allocating new threads. // we use a linked list to avoid moving memory blocks when allocating new threads.
@@ -201,7 +207,8 @@ static DWORD __stdcall HandleThread(void *data)
return 0; return 0;
} }
void I_spawn_thread(const char *name, I_thread_fn entry, void *userdata) FUNCWARNRV
int I_SpawnThread(const char *name, I_ThreadFn entry, void *userdata)
{ {
thread_t *thread; thread_t *thread;
(void)name; (void)name;
@@ -219,17 +226,20 @@ void I_spawn_thread(const char *name, I_thread_fn entry, void *userdata)
if (thread == NULL) if (thread == NULL)
{ {
thread = malloc(sizeof(thread_t)); thread = malloc(sizeof(thread_t));
if (thread == NULL)
return false;
thread->next = thread_list; thread->next = thread_list;
thread_list = thread; thread_list = thread;
} }
thread->func = entry; thread->func = entry;
thread->userdata = userdata; thread->userdata = userdata;
thread->thread = CreateThread(NULL, 0, HandleThread, thread, 0, &thread->thread_id); thread->thread = CreateThread(NULL, 0, HandleThread, thread, 0, &thread->threadId);
LeaveCriticalSection(&thread_lock); LeaveCriticalSection(&thread_lock);
return thread->thread != NULL;
} }
int I_thread_is_stopped(void) int I_ThreadIsStopped(void)
{ {
thread_t *thread; thread_t *thread;
EnterCriticalSection(&thread_lock); EnterCriticalSection(&thread_lock);
@@ -247,12 +257,12 @@ int I_thread_is_stopped(void)
return true; return true;
} }
void I_start_threads(void) void I_StartThreads(void)
{ {
InitializeCriticalSection(&thread_lock); InitializeCriticalSection(&thread_lock);
} }
void I_stop_threads(void) void I_StopThreads(void)
{ {
thread_t *thread = thread_list; thread_t *thread = thread_list;
while (thread != NULL) while (thread != NULL)
@@ -264,7 +274,7 @@ void I_stop_threads(void)
DeleteCriticalSection(&thread_lock); DeleteCriticalSection(&thread_lock);
} }
void I_lock_mutex(I_mutex *anchor) void I_LockMutex(I_Mutex *anchor)
{ {
EnterCriticalSection(&thread_lock); EnterCriticalSection(&thread_lock);
if (*anchor == NULL) if (*anchor == NULL)
@@ -276,25 +286,25 @@ void I_lock_mutex(I_mutex *anchor)
EnterCriticalSection(*anchor); EnterCriticalSection(*anchor);
} }
void I_unlock_mutex(I_mutex id) void I_UnlockMutex(I_Mutex id)
{ {
LeaveCriticalSection(id); LeaveCriticalSection(id);
} }
void I_hold_cond(I_cond *cond_anchor, I_mutex mutex_id) void I_HoldCond(I_Cond *condAnchor, I_Mutex mutexId)
{ {
I_Assert(mutex_id != NULL); I_Assert(mutexId != NULL);
EnterCriticalSection(&thread_lock); EnterCriticalSection(&thread_lock);
if (*cond_anchor == NULL) if (*condAnchor == NULL)
{ {
*cond_anchor = malloc(sizeof(CONDITION_VARIABLE)); *condAnchor = malloc(sizeof(CONDITION_VARIABLE));
InitializeConditionVariable(*cond_anchor); InitializeConditionVariable(*condAnchor);
} }
LeaveCriticalSection(&thread_lock); LeaveCriticalSection(&thread_lock);
SleepConditionVariableCS(*cond_anchor, mutex_id, INFINITE); SleepConditionVariableCS(*condAnchor, mutexId, INFINITE);
} }
void I_wake_one_cond(I_cond *anchor) void I_WakeOneCond(I_Cond *anchor)
{ {
EnterCriticalSection(&thread_lock); EnterCriticalSection(&thread_lock);
if (*anchor == NULL) if (*anchor == NULL)
@@ -306,7 +316,7 @@ void I_wake_one_cond(I_cond *anchor)
WakeConditionVariable(*anchor); WakeConditionVariable(*anchor);
} }
void I_wake_all_cond(I_cond *anchor) void I_WakeAllCond(I_Cond *anchor)
{ {
EnterCriticalSection(&thread_lock); EnterCriticalSection(&thread_lock);
if (*anchor == NULL) if (*anchor == NULL)
@@ -317,48 +327,66 @@ void I_wake_all_cond(I_cond *anchor)
LeaveCriticalSection(&thread_lock); LeaveCriticalSection(&thread_lock);
WakeAllConditionVariable(*anchor); WakeAllConditionVariable(*anchor);
} }
void *I_GetCurrentThread(void)
{
return GetCurrentThread();
}
#else #else
void I_spawn_thread(const char *name, I_thread_fn entry, void *userdata) #include "i_threads.h"
FUNCWARNRV
int I_SpawnThread(const char *name, I_ThreadFn entry, void *userdata)
{ {
(void)name; (void)name;
entry(userdata); entry(userdata);
return true;
} }
int I_thread_is_stopped(void) int I_ThreadIsStopped(void)
{
return true;
}
void I_StartThreads(void)
{ {
} }
void I_start_threads(void) void I_StopThreads(void)
{ {
} }
void I_stop_threads(void) void I_LockMutex(I_Mutex *anchor)
{
}
void I_lock_mutex(I_mutex *anchor)
{ {
(void)anchor; (void)anchor;
} }
void I_unlock_mutex(I_mutex id) void I_UnlockMutex(I_Mutex id)
{ {
(void)id; (void)id;
} }
void I_hold_cond(I_cond *cond_anchor, I_mutex mutex_id) void I_HoldCond(I_Cond *condAnchor, I_Mutex mutexId)
{ {
(void)cond_anchor; (void)condAnchor;
(void)mutex_id; (void)mutexId;
} }
void I_wake_one_cond(I_cond *anchor) void I_WakeOneCond(I_Cond *anchor)
{ {
(void)anchor; (void)anchor;
} }
void I_wake_all_cond(I_cond *anchor) void I_WakeAllCond(I_Cond *anchor)
{ {
(void)anchor; (void)anchor;
} }
void *I_GetCurrentThread(void)
{
return NULL;
}
#endif #endif
#endif // HAVE_THREADS
+25 -13
View File
@@ -1,6 +1,6 @@
// SONIC ROBO BLAST 2 KART // SONIC ROBO BLAST 2 KART
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Copyright (C) 2020 by James R. // Copyright (C) 2020-2023 by James R.
// //
// This program is free software distributed under the // This program is free software distributed under the
// terms of the GNU General Public License, version 2. // terms of the GNU General Public License, version 2.
@@ -14,34 +14,46 @@
#ifndef I_THREADS_H #ifndef I_THREADS_H
#define I_THREADS_H #define I_THREADS_H
#include "doomtype.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
typedef void (*I_thread_fn)(void *userdata); typedef void (*I_ThreadFn)(void *userdata);
typedef void * I_mutex; typedef void * I_Mutex;
typedef void * I_cond; typedef void * I_Cond;
void I_start_threads (void); #ifdef __linux__
void I_stop_threads (void); typedef long unsigned int thread_handle_t;
#else
typedef void *thread_handle_t;
#endif
void I_spawn_thread (const char *name, I_thread_fn, void *userdata); void I_StartThreads (void);
void I_StopThreads (void);
FUNCWARNRV
int I_SpawnThread (const char *name, I_ThreadFn, void *userdata);
/* check in your thread whether to return early */ /* check in your thread whether to return early */
int I_thread_is_stopped (void); int I_ThreadIsStopped (void);
void I_lock_mutex (I_mutex *); void I_LockMutex (I_Mutex *);
void I_unlock_mutex (I_mutex); void I_UnlockMutex (I_Mutex);
void I_hold_cond (I_cond *, I_mutex); void I_HoldCond (I_Cond *, I_Mutex);
void I_wake_one_cond (I_cond *); void I_WakeOneCond (I_Cond *);
void I_wake_all_cond (I_cond *); void I_WakeAllCond (I_Cond *);
thread_handle_t I_GetCurrentThread(void);
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"
#endif #endif
#endif/*I_THREADS_H*/ #endif/*I_THREADS_H*/
#endif/*HAVE_THREADS*/ #endif/*HAVE_THREADS*/
-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]; target = directorinfo.sortedplayers[targetposition];
// stop here since we're already viewing this player // stop here since we're already viewing this player
+148 -130
View File
@@ -83,7 +83,6 @@ IMPL_HUD_OFFSET(stat); // Stats
// extra hud things // extra hud things
consvar_t cv_showstats = {"showstats", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; 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 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}}; 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_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_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]; 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}; 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_kartspeedometer);
CV_RegisterVar(&cv_showstats); CV_RegisterVar(&cv_showstats);
CV_RegisterVar(&cv_showstats_skinname);
CV_RegisterVar(&cv_showinput); CV_RegisterVar(&cv_showinput);
CV_RegisterVar(&cv_posanim); CV_RegisterVar(&cv_posanim);
@@ -224,7 +221,6 @@ void K_RegisterKartHudStuff(void)
CV_RegisterVar(&cv_minihead); CV_RegisterVar(&cv_minihead);
CV_RegisterVar(&cv_showminimapnames); CV_RegisterVar(&cv_showminimapnames);
CV_RegisterVar(&cv_showminimapfinished);
CV_RegisterVar(&cv_showminimapangle); CV_RegisterVar(&cv_showminimapangle);
CV_RegisterVar(&cv_showlapemblem); CV_RegisterVar(&cv_showlapemblem);
@@ -274,6 +270,7 @@ void K_RegisterKartHudStuff(void)
// Smol speedo // Smol speedo
static patch_t *skp_smallsticker = NULL; static patch_t *skp_smallsticker = NULL;
static patch_t *skp_smallsticker3 = NULL;
static patch_t *skp_speedpatches[5] = {NULL}; static patch_t *skp_speedpatches[5] = {NULL};
@@ -311,6 +308,7 @@ static patch_t *kp_bumperstickerwideclr = NULL;
static patch_t *kp_karmastickerclr = NULL; static patch_t *kp_karmastickerclr = NULL;
static patch_t *kp_timeoutstickerclr = NULL; static patch_t *kp_timeoutstickerclr = NULL;
static patch_t *skp_smallstickerclr = NULL; static patch_t *skp_smallstickerclr = NULL;
static patch_t *skp_smallstickerclr3 = NULL;
static patch_t *kp_itemmulstickerclr[2] = {NULL}; static patch_t *kp_itemmulstickerclr[2] = {NULL};
static patch_t *kp_itembgclr[4] = {NULL}; static patch_t *kp_itembgclr[4] = {NULL};
@@ -476,6 +474,11 @@ static void K_LoadSaturnHUDGraphics(void)
skp_smallstickerclr = (patch_t *)W_CachePatchName("SC_SMSTC", PU_HUDGFX); skp_smallstickerclr = (patch_t *)W_CachePatchName("SC_SMSTC", PU_HUDGFX);
} }
if (xtra_speedo_clr3)
{
skp_smallstickerclr3 = (patch_t *)W_CachePatchName("SC_SM3TC", PU_HUDGFX);
}
if (achi_speedo_clr) if (achi_speedo_clr)
{ {
skp_smallstickerachiclr = (patch_t *)W_CachePatchName("SC_AMSTC", PU_HUDGFX); skp_smallstickerachiclr = (patch_t *)W_CachePatchName("SC_AMSTC", PU_HUDGFX);
@@ -530,6 +533,14 @@ static void K_LoadSaturnHUDGraphics(void)
kp_itemmulstickerclr[0] = (patch_t *)W_CachePatchName("K_ITMULC", PU_HUDGFX); kp_itemmulstickerclr[0] = (patch_t *)W_CachePatchName("K_ITMULC", PU_HUDGFX);
} }
} }
if (found_extra3_kart)
{
if (xtra_speedo3) // 80x11 patch scaled to size
{
skp_smallsticker3 = (patch_t *)W_CachePatchName("SP_SM3TC", PU_HUDGFX);
}
}
} }
// -- Kart patches -- // -- Kart patches --
@@ -864,7 +875,7 @@ void K_LoadKartHUDGraphics(void)
kp_yougotem = (patch_t *)W_CachePatchName("YOUGOTEM", PU_HUDGFX); kp_yougotem = (patch_t *)W_CachePatchName("YOUGOTEM", PU_HUDGFX);
if (found_extra_kart || found_extra2_kart) if (found_extra_kart || found_extra2_kart || found_extra3_kart)
K_LoadSaturnHUDGraphics(); K_LoadSaturnHUDGraphics();
} }
@@ -920,21 +931,21 @@ const char *K_GetItemPatch(UINT8 item, boolean tiny)
//} //}
static INT32 ITEM_X, ITEM_Y; // Item Window INT32 ITEM_X, ITEM_Y; // Item Window
static INT32 TIME_X, TIME_Y; // Time Sticker INT32 TIME_X, TIME_Y; // Time Sticker
static INT32 LAPS_X, LAPS_Y; // Lap Sticker INT32 LAPS_X, LAPS_Y; // Lap Sticker
static INT32 SPDM_X, SPDM_Y; // Speedometer INT32 SPDM_X, SPDM_Y; // Speedometer
static INT32 POSI_X, POSI_Y; // Position Number INT32 POSI_X, POSI_Y; // Position Number
static INT32 FACE_X, FACE_Y; // Top-four Faces INT32 FACE_X, FACE_Y; // Top-four Faces
static INT32 STCD_X, STCD_Y; // Starting countdown INT32 STCD_X, STCD_Y; // Starting countdown
static INT32 CHEK_Y; // CHECK graphic INT32 CHEK_Y; // CHECK graphic
static INT32 MINI_X, MINI_Y; // Minimap INT32 MINI_X, MINI_Y; // Minimap
static INT32 WANT_X, WANT_Y; // Battle WANTED poster 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. // 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; INT32 ITEM2_X, ITEM2_Y;
static INT32 LAPS2_X, LAPS2_Y; INT32 LAPS2_X, LAPS2_Y;
static INT32 POSI2_X, POSI2_Y; INT32 POSI2_X, POSI2_Y;
static void K_initKartHUD(void) static void K_initKartHUD(void)
{ {
@@ -1134,6 +1145,7 @@ enum
SPEEDO_DIAL, SPEEDO_DIAL,
SPEEDO_PMETER, SPEEDO_PMETER,
SPEEDO_PMETERSMOL, SPEEDO_PMETERSMOL,
SPEEDO_EXTRA3,
}; };
static SINT8 K_GetSpeedometerStyle(void) static SINT8 K_GetSpeedometerStyle(void)
@@ -1148,6 +1160,8 @@ static SINT8 K_GetSpeedometerStyle(void)
return SPEEDO_PMETER; return SPEEDO_PMETER;
else if (cv_newspeedometer.value == 6 && kartz_speedo_smol) else if (cv_newspeedometer.value == 6 && kartz_speedo_smol)
return SPEEDO_PMETERSMOL; return SPEEDO_PMETERSMOL;
else if (cv_newspeedometer.value == 7 && xtra_speedo3)
return SPEEDO_EXTRA3;
else else
return SPEEDO_VANILLA; return SPEEDO_VANILLA;
} }
@@ -1165,6 +1179,8 @@ static boolean K_UseColorSpeedo(int speedostyle)
return achi_speedo_clr; return achi_speedo_clr;
case SPEEDO_DIAL: case SPEEDO_DIAL:
return dial_speedo_clr; return dial_speedo_clr;
case SPEEDO_EXTRA3:
return xtra_speedo_clr3;
default: default:
return false; return false;
} }
@@ -1176,6 +1192,7 @@ enum
GAUGE_SMALL, GAUGE_SMALL,
GAUGE_BIGNUM, GAUGE_BIGNUM,
GAUGE_NUMONLY, GAUGE_NUMONLY,
GAUGE_EXTRA,
}; };
static SINT8 K_GetDriftgaugeStyle(void) static SINT8 K_GetDriftgaugeStyle(void)
@@ -1188,6 +1205,8 @@ static SINT8 K_GetDriftgaugeStyle(void)
return GAUGE_SMALL; return GAUGE_SMALL;
else if (cv_driftgaugestyle.value == 3) else if (cv_driftgaugestyle.value == 3)
return GAUGE_BIGNUM; return GAUGE_BIGNUM;
else if (cv_driftgaugestyle.value == 5 && xtra_speedo3)
return GAUGE_EXTRA;
} }
// Fallback // Fallback
@@ -1339,12 +1358,10 @@ INT32 K_getMinimapTrans(void)
return -1; return -1;
if (timeinmap <= 113) if (timeinmap <= 113)
{
minimaptrans = ((((INT32)timeinmap) - 105)*minimaptrans)/(113-105); minimaptrans = ((((INT32)timeinmap) - 105)*minimaptrans)/(113-105);
if (!minimaptrans) if (!minimaptrans)
return -1; return -1;
}
return (10-minimaptrans)<<FF_TRANSSHIFT; return (10-minimaptrans)<<FF_TRANSSHIFT;
} }
@@ -1386,6 +1403,7 @@ static void K_drawKartStats(void)
{ {
case SPEEDO_EXTRA: case SPEEDO_EXTRA:
case SPEEDO_ACHII: case SPEEDO_ACHII:
case SPEEDO_EXTRA3:
spdoffset = -10; spdoffset = -10;
break; break;
case SPEEDO_DIAL: case SPEEDO_DIAL:
@@ -1397,6 +1415,8 @@ static void K_drawKartStats(void)
break; break;
} }
} }
else
spdoffset = 0;
if (G_BattleGametype() && ((speedostyle != SPEEDO_DIAL) || splitscreen)) if (G_BattleGametype() && ((speedostyle != SPEEDO_DIAL) || splitscreen))
spdoffset += ((stplyr->kartstuff[k_bumper] ? -5 : -8)); spdoffset += ((stplyr->kartstuff[k_bumper] ? -5 : -8));
@@ -1416,16 +1436,13 @@ static void K_drawKartStats(void)
fakeskin = K_GetPlayerSkin(stplyr); fakeskin = K_GetPlayerSkin(stplyr);
// Skin name // 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);
{ }
V_DrawSmallString(x+20, y+12, flags2, fakeskin->realname); else
} {
else V_DrawThinString(x+20, y+7, flags2, fakeskin->realname);
{
V_DrawThinString(x+20, y+7, flags2, fakeskin->realname);
}
} }
// Icon and stats // Icon and stats
@@ -2079,7 +2096,7 @@ static void K_DrawKartPositionNum(INT32 num)
fy = POSI_Y; fy = POSI_Y;
fflags = V_SNAPTOLEFT|((stplyrnum == 2) ? V_SPLITSCREEN|V_SNAPTOBOTTOM : 0); // flip P3 to the bottom. fflags = V_SNAPTOLEFT|((stplyrnum == 2) ? V_SPLITSCREEN|V_SNAPTOBOTTOM : 0); // flip P3 to the bottom.
flipdraw = true; 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. 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. else // else, that means we're P2 or P4.
@@ -2161,9 +2178,8 @@ static boolean K_drawKartPositionFaces(void)
UINT8 *colormap; UINT8 *colormap;
ranklines = 0; ranklines = 0;
memset(completed, 0, sizeof (completed));
if (!LUA_HudEnabled(hud_minirankings)) memset(rankplayer, 0, sizeof (rankplayer));
return false; // Don't proceed but still return true for free play above if HUD is disabled.
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
@@ -2178,7 +2194,8 @@ static boolean K_drawKartPositionFaces(void)
if (numplayersingame <= 1) if (numplayersingame <= 1)
return true; return true;
memset(completed, 0, sizeof (completed)); if (!LUA_HudEnabled(hud_minirankings))
return false; // Don't proceed but still return true for free play above if HUD is disabled.
for (j = 0; j < numplayersingame; j++) for (j = 0; j < numplayersingame; j++)
{ {
@@ -2235,7 +2252,6 @@ static boolean K_drawKartPositionFaces(void)
if (!playeringame[rankplayer[i]]) if (!playeringame[rankplayer[i]])
continue; continue;
if (player->spectator || !player->mo) if (player->spectator || !player->mo)
continue; continue;
@@ -2413,7 +2429,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
static boolean K_BigLap(void) static boolean K_BigLap(void)
{ {
return (cv_biglaps.value && (cv_numlaps.value > 9) && !stplyr->exiting && (K_UseColorHud() ? big_lap_color : big_lap)); return (cv_biglaps.value && (cv_numlaps.value > 9) && (K_UseColorHud() ? big_lap_color : big_lap) && (!stplyr->exiting));
} }
static void K_drawKartLaps(void) static void K_drawKartLaps(void)
@@ -2622,7 +2638,7 @@ static void K_drawKartSpeedometer(void)
return; return;
// index 0 is the raw value, index 1 is the converted value // index 0 is the raw value, index 1 is the converted value
fixed_t convSpeed[2] = {0, 0}; fixed_t convSpeed[2] = {0,0};
#ifdef ROTSPRITE #ifdef ROTSPRITE
fixed_t dial_divisor = DIALSPDDIV; fixed_t dial_divisor = DIALSPDDIV;
#endif #endif
@@ -2691,28 +2707,34 @@ static void K_drawKartSpeedometer(void)
V_DrawKartString(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, metric); V_DrawKartString(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, metric);
} }
else if (speedostyle == SPEEDO_EXTRA || speedostyle == SPEEDO_ACHII) // why bother if we dont? else if (speedostyle == SPEEDO_EXTRA) // why bother if we dont?
{ {
patch_t *speedopat; if (K_UseColorSpeedo(SPEEDO_EXTRA)) //Colourized hud
UINT8 *colormap = NULL;
if (K_UseColorSpeedo(speedostyle)) //Colourized hud
{ {
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE); UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
V_DrawMappedPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_smallstickerclr, colormap);
}
else
V_DrawScaledPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_smallsticker);
speedopat = ((speedostyle == SPEEDO_EXTRA) ? skp_smallstickerclr : skp_smallstickerachiclr); V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
V_DrawMappedPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, speedopat, colormap); V_DrawScaledPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_speedpatches[cv_kartspeedometer.value]);
speedopat = ((speedostyle == SPEEDO_EXTRA) ? skp_speedpatches[cv_kartspeedometer.value] : skp_speedpatchesachiclr[cv_kartspeedometer.value]); }
else if (speedostyle == SPEEDO_ACHII) // why bother if we dont?
{
if (K_UseColorSpeedo(SPEEDO_ACHII)) //Colourized hud
{
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
V_DrawMappedPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_smallstickerachiclr, colormap);
V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
V_DrawMappedPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_speedpatchesachiclr[cv_kartspeedometer.value], colormap);
} }
else else
{ {
speedopat = ((speedostyle == SPEEDO_EXTRA) ? skp_smallsticker : skp_smallstickerachi); V_DrawScaledPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_smallstickerachi);
V_DrawScaledPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, speedopat); V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
speedopat = ((speedostyle == SPEEDO_EXTRA) ? skp_speedpatches[cv_kartspeedometer.value] : skp_speedpatchesachi[cv_kartspeedometer.value]); V_DrawScaledPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_speedpatchesachi[cv_kartspeedometer.value]);
} }
V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
V_DrawMappedPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, speedopat, colormap);
} }
#ifdef ROTSPRITE #ifdef ROTSPRITE
else if (speedostyle == SPEEDO_DIAL) // why bother if we dont? else if (speedostyle == SPEEDO_DIAL) // why bother if we dont?
@@ -2725,36 +2747,46 @@ static void K_drawKartSpeedometer(void)
(K_UseColorSpeedo(SPEEDO_DIAL))); (K_UseColorSpeedo(SPEEDO_DIAL)));
} }
#endif #endif
else if (speedostyle == SPEEDO_EXTRA3) // why bother if we dont?
{
if (K_UseColorSpeedo(SPEEDO_EXTRA3)) //Colourized hud
{
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
V_DrawStretchyFixedPatch((SPDM_X-1)<<FRACBITS, (SPDM_Y + 5)<<FRACBITS, XTRA3PSCALE, XTRA3VSCALE, V_HUDTRANS|splitflags, skp_smallstickerclr3, colormap, 0);
}
else
V_DrawStretchyFixedPatch((SPDM_X-1)<<FRACBITS, (SPDM_Y + 5)<<FRACBITS, XTRA3PSCALE, XTRA3VSCALE, V_HUDTRANS|splitflags, skp_smallsticker3, NULL, 0);
V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
V_DrawScaledPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_speedpatches[cv_kartspeedometer.value]);
}
// Kart Z speedo bullshit... // Kart Z speedo bullshit...
// Draw the Speed counter. // Draw the Speed counter.
else if ((speedostyle == SPEEDO_PMETER) || (speedostyle == SPEEDO_PMETERSMOL)) else if ((speedostyle == SPEEDO_PMETER) || (speedostyle == SPEEDO_PMETERSMOL))
{ {
fixed_t fuspeed = 0;
INT32 spdpatch = 0; INT32 spdpatch = 0;
static const INT32 spdinterval[22] = { 2, 5, 7, 10, static const INT32 speedIntervals[22] = {2, 5, 7, 10, 12, 15, 17,
12, 15, 17, 20, 20, 22, 25, 27, 30, 32,
22, 25, 27, 30, 35, 37, 40, 42, 45, 47,
32, 35, 37, 40, 50, 52, 55};
42, 45, 47, 50,
52, 55};
const fixed_t spd = FixedDiv(stplyr->speed, mapobjectscale) / FRACUNIT; fuspeed = FixedDiv(stplyr->speed, mapobjectscale)/FRACUNIT;
if (spd > 54) for (INT32 i = 0; i < 22; ++i)
{ {
spdpatch = (leveltime & 4) ? 24 : 23; if (fuspeed < speedIntervals[i])
}
else
{
for (INT32 i = 0; i < 22; ++i)
{ {
if (spd < spdinterval[i]) spdpatch = i;
{ break;
spdpatch = i;
break;
}
} }
} }
if (((fuspeed < 57 && fuspeed > 54) || (fuspeed < 60 && fuspeed > 56) || (fuspeed > 59)) && (leveltime & 4))
spdpatch = 24;
else if (((fuspeed < 57 && fuspeed > 54) || (fuspeed < 60 && fuspeed > 56) || (fuspeed > 59)) && !(leveltime & 4))
spdpatch = 23;
V_DrawScaledPatch(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, (speedostyle == SPEEDO_PMETER) ? kp_kartzspeedo[spdpatch] : kp_kartzspeedo_smol[spdpatch]); V_DrawScaledPatch(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, (speedostyle == SPEEDO_PMETER) ? kp_kartzspeedo[spdpatch] : kp_kartzspeedo_smol[spdpatch]);
} }
} }
@@ -2782,7 +2814,7 @@ static void K_drawKartBumpersOrKarma(void)
{ {
const UINT8 speedostyle = K_GetSpeedometerStyle(); const UINT8 speedostyle = K_GetSpeedometerStyle();
if ((speedostyle == SPEEDO_EXTRA) || (speedostyle == SPEEDO_ACHII)) if ((speedostyle == SPEEDO_EXTRA) || (speedostyle == SPEEDO_ACHII) || (speedostyle == SPEEDO_EXTRA3))
fy += 5; fy += 5;
else else
fy += 7; fy += 7;
@@ -2874,12 +2906,10 @@ static boolean K_GetScreenCoords(vector2_t *vec, player_t *player, mobj_t *targe
x = (fixed_t)(viewangle - R_PointToAngle(targx, targy)); x = (fixed_t)(viewangle - R_PointToAngle(targx, targy));
distfact = FINECOSINE((x>>ANGLETOFINESHIFT) & FINEMASK); distfact = FINECOSINE((x>>ANGLETOFINESHIFT) & FINEMASK);
if (!distfact) if (!distfact) distfact = 1;
distfact = 1;
if (encoremode) if (encoremode)
x = -x; x = -x;
if (x < (fixed_t)ANGLE_270 || x > (fixed_t)ANGLE_90) if (x < (fixed_t)ANGLE_270 || x > (fixed_t)ANGLE_90)
return false; return false;
@@ -2961,7 +2991,7 @@ static boolean K_GetScreenCoords(vector2_t *vec, player_t *player, mobj_t *targe
if (stplyrnum > 0) if (stplyrnum > 0)
y = y + yres; y = y + yres;
} }
else if (splitscreen >= 2) // 3P or 4P if (splitscreen >= 2) // 3P or 4P
{ {
x = x>>1; x = x>>1;
y = y>>1; y = y>>1;
@@ -3021,11 +3051,9 @@ static void K_drawNameTags(void)
if (players[i].kartstuff[k_hyudorotimer]) // player is invisible if (players[i].kartstuff[k_hyudorotimer]) // player is invisible
continue; continue;
if (maxdistance) if (maxdistance)
{
distance = R_PointToDist(players[i].mo->x, players[i].mo->y); distance = R_PointToDist(players[i].mo->x, players[i].mo->y);
if (distance > maxdistance) if (distance > maxdistance)
continue; continue;
}
if (!P_CheckSightFast(stplyr->mo, players[i].mo)) if (!P_CheckSightFast(stplyr->mo, players[i].mo))
continue; continue;
@@ -3234,12 +3262,13 @@ static void K_drawDriftGauge(void)
if (!splitscreen && !camera->chase) if (!splitscreen && !camera->chase)
return; return;
// i will skip the drift early return and you cant stop me! if (forceshowhud)
if (!forceshowhud) goto skipcrap; // i will skip the drift early return and you cant stop me!
{
if (!stplyr->kartstuff[k_drift]) if (!stplyr->kartstuff[k_drift])
return; return;
}
skipcrap:
if (P_MobjWasRemoved(stplyr->mo)) if (P_MobjWasRemoved(stplyr->mo))
return; return;
@@ -3264,11 +3293,12 @@ static void K_drawDriftGauge(void)
{ {
case GAUGE_DEFAULT: case GAUGE_DEFAULT:
case GAUGE_SMALL: case GAUGE_SMALL:
case GAUGE_EXTRA:
case GAUGE_BIGNUM: case GAUGE_BIGNUM:
{ {
patch_t *driftpatch = NULL; patch_t *driftpatch = NULL;
if (gaugestyle == GAUGE_DEFAULT || gaugestyle == GAUGE_BIGNUM) if (gaugestyle == GAUGE_DEFAULT || gaugestyle == GAUGE_BIGNUM || gaugestyle == GAUGE_EXTRA)
{ {
barx = basex - vid.dup*23; barx = basex - vid.dup*23;
BAR_WIDTH = vid.dup*47; BAR_WIDTH = vid.dup*47;
@@ -3281,15 +3311,30 @@ static void K_drawDriftGauge(void)
bary = basey - vid.dup*2; bary = basey - vid.dup*2;
if (K_UseColorHud()) // Colourized hud if (gaugestyle == GAUGE_EXTRA) // i hate hud code i hate hud code i hate hud code i hate hud code i hate hud code.....
{ {
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE); if (K_UseColorSpeedo(SPEEDO_EXTRA3)) // We reuse the extra speedometer patch hence this check
driftpatch = (gaugestyle == GAUGE_SMALL ? driftgaugesmallcolor : driftgaugecolor); {
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
driftpatch = skp_smallstickerclr3;
}
else
driftpatch = skp_smallsticker3;
V_DrawStretchyFixedPatch((basex - vid.dup*30)<<FRACBITS, ((basey<<FRACBITS) - FixedMul(vid.dup<<FRACBITS, 21*FRACUNIT/10)), XTRA3PSCALE, XTRA3VSCALE, V_NOSCALESTART|V_OFFSET|drifttrans, driftpatch, colormap, 0);
} }
else else
driftpatch = (gaugestyle == GAUGE_SMALL ? driftgaugesmall : driftgauge); {
if (K_UseColorHud()) // Colourized hud
{
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
driftpatch = (gaugestyle == GAUGE_SMALL ? driftgaugesmallcolor : driftgaugecolor);
}
else
driftpatch = (gaugestyle == GAUGE_SMALL ? driftgaugesmall : driftgauge);
V_DrawMappedPatch(gaugestyle == GAUGE_SMALL ? basex + vid.dup*11 : basex, basey, V_NOSCALESTART|V_OFFSET|drifttrans, driftpatch, colormap); V_DrawMappedPatch(gaugestyle == GAUGE_SMALL ? basex + vid.dup*11 : basex, basey, V_NOSCALESTART|V_OFFSET|drifttrans, driftpatch, colormap);
}
if (driftcharge >= driftval*4) // rainbow sparks if (driftcharge >= driftval*4) // rainbow sparks
{ {
@@ -3587,7 +3632,7 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags)
V_DrawCenteredSmallStringAtFixed(amxpos + (4*FRACUNIT), amypos - (3*FRACUNIT), V_ALLOWLOWERCASE|flags|V_SkinColorToHighlightcolor(mo->color), player_names[player - players]); V_DrawCenteredSmallStringAtFixed(amxpos + (4*FRACUNIT), amypos - (3*FRACUNIT), V_ALLOWLOWERCASE|flags|V_SkinColorToHighlightcolor(mo->color), player_names[player - players]);
} }
const boolean minihead = K_useSmallMinimapHead(player); const boolean minihead = K_useSmallMinimapHead(mo->player);
// thx wanted reticle for having weird offsets very cool // thx wanted reticle for having weird offsets very cool
wntdamxpos = minihead ? amxpos + (1<<FRACBITS) : amxpos - (4<<FRACBITS); wntdamxpos = minihead ? amxpos + (1<<FRACBITS) : amxpos - (4<<FRACBITS);
@@ -3729,9 +3774,6 @@ static void K_drawKartMinimap(void)
if (!players[i].mo || players[i].spectator) if (!players[i].mo || players[i].spectator)
continue; continue;
if (!cv_showminimapfinished.value && players[i].exiting)
continue;
if (P_IsDisplayPlayer(&players[i])) if (P_IsDisplayPlayer(&players[i]))
{ {
// Draw display players on top of everything else // Draw display players on top of everything else
@@ -3776,7 +3818,7 @@ static void K_drawKartMinimap(void)
if (cv_showminimapangle.value && (minidoticon || minilighticon) && !playertimedout) if (cv_showminimapangle.value && (minidoticon || minilighticon) && !playertimedout)
{ {
UINT8 *colormap = NULL; UINT8 *colormap;
drawinfo_t dims; drawinfo_t dims;
fixed_t interpx, interpy; fixed_t interpx, interpy;
fixed_t xoff = 0, yoff = 0; fixed_t xoff = 0, yoff = 0;
@@ -3787,27 +3829,10 @@ static void K_drawKartMinimap(void)
if (encoremode) if (encoremode)
ang = ANGLE_180 - ang; ang = ANGLE_180 - ang;
if (mobj->color) if (mobj->colorized)
{ colormap = R_GetTranslationColormap(TC_RAINBOW, mobj->color, GTC_CACHE);
if (mobj->colorized) else
{ colormap = R_GetLocalTranslationColormap(mobj->skin, mobj->localskin, mobj->color, GTC_CACHE, mobj->skinlocal);
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);
}
}
}
interpx = lerp(mobj->old_x, mobj->x); interpx = lerp(mobj->old_x, mobj->x);
interpy = lerp(mobj->old_y, mobj->y); interpy = lerp(mobj->old_y, mobj->y);
@@ -3972,7 +3997,6 @@ static void K_drawBattleFullscreen(void)
{ {
if (stplyrnum == 0) if (stplyrnum == 0)
V_DrawFadeScreen(0xFF00, 16); V_DrawFadeScreen(0xFF00, 16);
if (stplyr->exiting < 6*TICRATE && !stplyr->spectator) if (stplyr->exiting < 6*TICRATE && !stplyr->spectator)
{ {
if (stplyr->kartstuff[k_position] == 1) if (stplyr->kartstuff[k_position] == 1)
@@ -4037,7 +4061,7 @@ static void K_drawBattleFullscreen(void)
{ {
if (i == displayplayers[0]) if (i == displayplayers[0])
continue; continue;
if (playeringame[i]) if (playeringame[i] && !stplyr->spectator)
return; return;
} }
@@ -4288,7 +4312,7 @@ static void K_drawInput(void)
} }
else else
{ {
const boolean analogjoystickmove = cv_usejoystick[stplyrnum].value && !Joystick[stplyrnum].bGamepadStyle; const boolean analogjoystickmove = cv_usejoystick[stplyrnum].value && !Joystick[stplyrnum].bGamepadStyle;
const boolean gamepadjoystickmove = cv_usejoystick[stplyrnum].value && Joystick[stplyrnum].bGamepadStyle; const boolean gamepadjoystickmove = cv_usejoystick[stplyrnum].value && Joystick[stplyrnum].bGamepadStyle;
const UINT8 ssplayer = stplyrnum+1; const UINT8 ssplayer = stplyrnum+1;
@@ -4305,10 +4329,9 @@ static void K_drawInput(void)
{ {
hudforward += KART_FULLTURN; hudforward += KART_FULLTURN;
} }
if (InputDown(gc_aimbackward, ssplayer) || (gamepadjoystickmove && axis > 0)) if (InputDown(gc_aimbackward, ssplayer) || (gamepadjoystickmove && axis > 0))
{ {
hudforward -= KART_FULLTURN; hudforward-= KART_FULLTURN;
} }
} }
@@ -4394,7 +4417,6 @@ static void K_drawChallengerScreen(void)
19,20,19,20,19,20,19,20,19,20, // frame 20-21, 1 tic, 5 alternating: all text vibrates from impact 19,20,19,20,19,20,19,20,19,20, // frame 20-21, 1 tic, 5 alternating: all text vibrates from impact
21,22,23,24 // frame 22-25, 1 tic: CHALLENGER turns gold 21,22,23,24 // frame 22-25, 1 tic: CHALLENGER turns gold
}; };
const UINT8 offset = min(52-1, (3*TICRATE)-mapreset); const UINT8 offset = min(52-1, (3*TICRATE)-mapreset);
V_DrawFadeScreen(0xFF00, 16); // Fade out V_DrawFadeScreen(0xFF00, 16); // Fade out
@@ -4448,7 +4470,7 @@ static void K_drawLapStartAnim(void)
char *lapnum = va("%02d", stplyr->laps + 1); char *lapnum = va("%02d", stplyr->laps + 1);
const size_t laplength = strlen(lapnum); const size_t laplength = strlen(lapnum);
for (size_t i = 0; i < laplength; i++) for (int i = 0; i < (int)laplength; i++)
{ {
int digit = lapnum[i] - '0'; int digit = lapnum[i] - '0';
int frame = min(2, progress/2 - 8 - (i*2)); int frame = min(2, progress/2 - 8 - (i*2));
@@ -4496,7 +4518,6 @@ static void K_drawDistributionDebugger(void)
kp_orbinaut[4], kp_orbinaut[4],
kp_jawz[1] kp_jawz[1]
}; };
INT32 useodds = 0; INT32 useodds = 0;
INT32 pingame = 0, bestbumper = 0; INT32 pingame = 0, bestbumper = 0;
INT32 i; INT32 i;
@@ -4513,10 +4534,8 @@ static void K_drawDistributionDebugger(void)
if (!playeringame[i] || players[i].spectator) if (!playeringame[i] || players[i].spectator)
continue; continue;
pingame++; pingame++;
if (players[i].exiting) if (players[i].exiting)
dontforcespb = true; dontforcespb = true;
if (players[i].kartstuff[k_bumper] > bestbumper) if (players[i].kartstuff[k_bumper] > bestbumper)
bestbumper = players[i].kartstuff[k_bumper]; bestbumper = players[i].kartstuff[k_bumper];
} }
@@ -4670,7 +4689,6 @@ void K_drawKartHUD(void)
{ {
if (LUA_HudEnabled(hud_battlefullscreen)) if (LUA_HudEnabled(hud_battlefullscreen))
K_drawBattleFullscreen(); K_drawBattleFullscreen();
return; return;
} }
-1
View File
@@ -35,7 +35,6 @@ extern consvar_t cv_darkitembox;
extern consvar_t cv_biglaps; extern consvar_t cv_biglaps;
extern consvar_t cv_highresportrait; extern consvar_t cv_highresportrait;
extern consvar_t cv_showstats; extern consvar_t cv_showstats;
extern consvar_t cv_showstats_skinname;
extern consvar_t cv_fancyroulette; extern consvar_t cv_fancyroulette;
extern consvar_t cv_showlaptimes; extern consvar_t cv_showlaptimes;
extern consvar_t cv_battlespeedo; extern consvar_t cv_battlespeedo;
+53 -91
View File
@@ -660,22 +660,13 @@ INT32 K_GetSkinNum(player_t *player)
// //
// returns the mobj skinnumber // returns the mobj skinnumber
// accounts for localskins ? // accounts for localskins
// //
INT32 K_GetMobjSkinNum(const skin_t *skin, boolean local) INT32 K_GetMobjSkinNum(const skin_t *skin, boolean local)
{ {
return skin - K_GetSkinArray(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 // returns the players skinnumber
// accounts for localskins // accounts for localskins
@@ -1489,6 +1480,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid)
fixed_t nx = FixedDiv(distx, dist); fixed_t nx = FixedDiv(distx, dist);
fixed_t ny = FixedDiv(disty, dist); fixed_t ny = FixedDiv(disty, dist);
dist = dist ? dist : 1;
distx = FixedMul(mobj1->radius+mobj2->radius, nx); distx = FixedMul(mobj1->radius+mobj2->radius, nx);
disty = FixedMul(mobj1->radius+mobj2->radius, ny); disty = FixedMul(mobj1->radius+mobj2->radius, ny);
@@ -1600,78 +1592,57 @@ static UINT8 K_CheckOffroadCollide(mobj_t *mo)
sector_t *s2; // FOF sector shortcut sector_t *s2; // FOF sector shortcut
ffloor_t *rover; // FOF ffloor_t *rover; // FOF
fixed_t flr, cel; // floor & ceiling for height checks to make sure we're touching the offroad sector. fixed_t flr;
INT32 special; fixed_t cel; // floor & ceiling for height checks to make sure we're touching the offroad sector.
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo)); I_Assert(!P_MobjWasRemoved(mo));
for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next) for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next)
{ {
if (!node->m_sector) if (!node->m_sector)
break; // shouldn't happen. break; // shouldn't happen.
s = node->m_sector; s = node->m_sector;
// 1: Check for the main sector, make sure we're on the floor of that sector and see if we can apply offroad. // 1: Check for the main sector, make sure we're on the floor of that sector and see if we can apply offroad.
// Make arbitrary Z checks because we want to check for 1 sector in particular, we don't want to affect the player if the offroad sector is way below them and they're lineriding a normal sector above. // Make arbitrary Z checks because we want to check for 1 sector in particular, we don't want to affect the player if the offroad sector is way below them and they're lineriding a normal sector above.
special = GETSECSPECIAL(s->special, 1); flr = P_MobjFloorZ(mo, s, s, mo->x, mo->y, NULL, false, true);
for (i = 2; i < 5; i++) // check for sector special cel = P_MobjCeilingZ(mo, s, s, mo->x, mo->y, NULL, true, true); // get Z coords of both floors and ceilings for this sector (this accounts for slopes properly.)
{ // NOTE: we don't use P_GetZAt with our x/y directly because the mobj won't have the same height because of its hitbox on the slope. Complex garbage but tldr it doesn't work.
if (special != i)
continue;
if (s->flags & SF_FLIPSPECIAL_FLOOR) if ( ((s->flags & SF_FLIPSPECIAL_FLOOR) && mo->z == flr) // floor check
{ || ((mo->eflags & MFE_VERTICALFLIP && (s->flags & SF_FLIPSPECIAL_CEILING) && (mo->z + mo->height) == cel)) ) // ceiling check.
flr = P_MobjFloorZ(mo, s, s, mo->x, mo->y, NULL, false, true);
if (mo->z == flr) // floor check
return i-1; // return offroad type
}
if (mo->eflags & MFE_VERTICALFLIP && (s->flags & SF_FLIPSPECIAL_CEILING)) for (i = 2; i < 5; i++) // check for sector special
{
cel = P_MobjCeilingZ(mo, s, s, mo->x, mo->y, NULL, true, true); if (GETSECSPECIAL(s->special, 1) == i)
// NOTE: we don't use P_GetZAt with our x/y directly because the mobj won't have the same height because of its hitbox on the slope. Complex garbage but tldr it doesn't work. return i-1; // return offroad type
if ((mo->z + mo->height) == cel) // ceiling check
return i-1; // return offroad type
}
}
// 2: If we're here, we haven't found anything. So let's try looking for FOFs in the sectors using the same logic. // 2: If we're here, we haven't found anything. So let's try looking for FOFs in the sectors using the same logic.
for (rover = s->ffloors; rover; rover = rover->next) for (rover = s->ffloors; rover; rover = rover->next)
{ {
if (!(rover->flags & FF_EXISTS)) // This FOF doesn't exist anymore. if (!(rover->flags & FF_EXISTS)) // This FOF doesn't exist anymore.
continue; continue;
s2 = &sectors[rover->secnum]; // makes things easier for us s2 = &sectors[rover->secnum]; // makes things easier for us
special = GETSECSPECIAL(s2->special, 1); flr = P_GetFOFBottomZ(mo, s, rover, mo->x, mo->y, NULL);
for (i = 2; i < 5; i++) // check for sector special cel = P_GetFOFTopZ(mo, s, rover, mo->x, mo->y, NULL); // Z coords for fof top/bottom.
{
if (special != i)
continue;
// we will do essentially the same checks as above instead of bothering with top/bottom height of the FOF. // we will do essentially the same checks as above instead of bothering with top/bottom height of the FOF.
// Reminder that an FOF's floor is its bottom, silly! // Reminder that an FOF's floor is its bottom, silly!
if ( ((s2->flags & SF_FLIPSPECIAL_FLOOR) && mo->z == cel) // "floor" check
|| ((s2->flags & SF_FLIPSPECIAL_CEILING) && (mo->z + mo->height) == flr) ) // "ceiling" check.
if (s2->flags & SF_FLIPSPECIAL_FLOOR) for (i = 2; i < 5; i++) // check for sector special
{
cel = P_GetFOFTopZ(mo, s, rover, mo->x, mo->y, NULL); // Z coords for fof top/bottom. if (GETSECSPECIAL(s2->special, 1) == i)
if (mo->z == cel) // "floor" check return i-1; // return offroad type
return i-1; // return offroad type
}
if (s2->flags & SF_FLIPSPECIAL_CEILING)
{
flr = P_GetFOFBottomZ(mo, s, rover, mo->x, mo->y, NULL);
if ((mo->z + mo->height) == flr) // "ceiling" check
return i-1; // return offroad type
}
}
} }
} }
return 0; // couldn't find any offroad
return 0; // couldn't find any offroad
} }
/** \brief Updates the Player's offroad value once per frame /** \brief Updates the Player's offroad value once per frame
@@ -1742,6 +1713,7 @@ static void K_SpawnDashDustRelease(player_t *player)
INT32 i; INT32 i;
I_Assert(player != NULL); I_Assert(player != NULL);
I_Assert(player->mo != NULL);
I_Assert(!P_MobjWasRemoved(player->mo)); I_Assert(!P_MobjWasRemoved(player->mo));
if (!player->speed && !player->kartstuff[k_startboost]) if (!player->speed && !player->kartstuff[k_startboost])
@@ -1779,6 +1751,7 @@ static void K_SpawnBrakeDriftSparks(player_t *player) // Be sure to update the m
mobj_t *sparks; mobj_t *sparks;
I_Assert(player != NULL); I_Assert(player != NULL);
I_Assert(player->mo != NULL);
I_Assert(!P_MobjWasRemoved(player->mo)); I_Assert(!P_MobjWasRemoved(player->mo));
// Position & etc are handled in its thinker, and its spawned invisible. // Position & etc are handled in its thinker, and its spawned invisible.
@@ -1974,9 +1947,11 @@ static void K_PlayGenericCombatSound(mobj_t *source, mobj_t *other, sfxenum_t sf
if (!skin) if (!skin)
return; return;
boolean alwaysHear = false;
if (cv_kartvoices.value && !P_MobjWasRemoved(other) && other->player != NULL) 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]); S_StartSound(alwaysHear ? NULL : source, skin->soundsid[S_sfx[sfx_id].skinsound]);
} }
@@ -2176,13 +2151,7 @@ static void K_GetKartBoostPower(player_t *player)
&& player->speed > 0 && player->speed > 0
&& !player->spectator) && !player->spectator)
{ {
mobj_t *dust = K_SpawnWipeoutTrail(player->mo, true); K_SpawnWipeoutTrail(player->mo, true);
// Technically, all mobjs that think can cause desynchs if they are spawned conditionally, so best we can do
// is to hide them if you are in saltyhop jump
if (dust && player->mo->salty.jump)
dust->flags2 |= MF2_DONTDRAW;
if (leveltime % 6 == 0) if (leveltime % 6 == 0)
S_StartSound(player->mo, sfx_cdfm70); S_StartSound(player->mo, sfx_cdfm70);
} }
@@ -2336,13 +2305,10 @@ fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove
finalspeed *= forwardmove/25; finalspeed *= forwardmove/25;
finalspeed /= 2; finalspeed /= 2;
if (forwardmove < 0) if (forwardmove < 0 && finalspeed > mapobjectscale*2)
{ return finalspeed/2;
if (finalspeed > mapobjectscale*2) else if (forwardmove < 0)
return finalspeed/2;
return -mapobjectscale/2; return -mapobjectscale/2;
}
if (finalspeed < 0) if (finalspeed < 0)
finalspeed = 0; finalspeed = 0;
@@ -2392,7 +2358,6 @@ void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount)
break; break;
case 3: case 3:
st = S_BATTLEPOINT3A; st = S_BATTLEPOINT3A;
break;
default: default:
return; // NO STATE! return; // NO STATE!
} }
@@ -3178,6 +3143,7 @@ static void K_SpawnDriftSparks(player_t *player)
INT32 i; INT32 i;
I_Assert(player != NULL); I_Assert(player != NULL);
I_Assert(player->mo != NULL);
I_Assert(!P_MobjWasRemoved(player->mo)); I_Assert(!P_MobjWasRemoved(player->mo));
if (leveltime % 2 == 1) if (leveltime % 2 == 1)
@@ -3441,7 +3407,7 @@ static void K_QuiteSaltyHop(player_t *player)
pmo->spritexscale -= (FRACUNIT/8); pmo->spritexscale -= (FRACUNIT/8);
} }
pmo->spriteyoffset += FixedMul(psalt->zoffset, cv_saltyheight.value); pmo->spriteyoffset = FixedMul(psalt->zoffset, cv_saltyheight.value);
if (cv_saltyhopsfx.value) if (cv_saltyhopsfx.value)
{ {
@@ -3549,6 +3515,7 @@ void K_SpawnBoostTrail(player_t *player)
INT32 i; INT32 i;
I_Assert(player != NULL); I_Assert(player != NULL);
I_Assert(player->mo != NULL);
I_Assert(!P_MobjWasRemoved(player->mo)); I_Assert(!P_MobjWasRemoved(player->mo));
if (!P_IsObjectOnGround(player->mo) if (!P_IsObjectOnGround(player->mo)
@@ -3630,6 +3597,7 @@ void K_SpawnSparkleTrail(mobj_t *mo)
mobj_t *sparkle; mobj_t *sparkle;
INT32 i; INT32 i;
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo)); I_Assert(!P_MobjWasRemoved(mo));
const boolean shouldblend = (mo->player && K_PlayerEffectsShouldBlend(mo->player)); const boolean shouldblend = (mo->player && K_PlayerEffectsShouldBlend(mo->player));
@@ -3658,11 +3626,12 @@ void K_SpawnSparkleTrail(mobj_t *mo)
P_SetMobjState(sparkle, S_KARTINVULN_LARGE1); 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; mobj_t *dust;
angle_t aoff; angle_t aoff;
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo)); I_Assert(!P_MobjWasRemoved(mo));
if (mo->player) if (mo->player)
@@ -3694,10 +3663,10 @@ mobj_t *K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
dust->momx = mo->momx/2; dust->momx = mo->momx/2;
dust->momy = mo->momy/2; dust->momy = mo->momy/2;
dust->momz = mo->momz/2; dust->momz = mo->momz/2;
dust->flags2 |= MF2_SHADOW;
} }
return dust; if (translucent)
dust->flags2 |= MF2_SHADOW;
} }
// K_DriftDustHandling // K_DriftDustHandling
@@ -3711,7 +3680,7 @@ void K_DriftDustHandling(mobj_t *spawner)
{ {
angle_t anglediff; angle_t anglediff;
if (leveltime % 2 != 0 || !P_IsObjectOnGround(spawner)) if (!P_IsObjectOnGround(spawner) || leveltime % 2 != 0)
return; return;
if (spawner->player) if (spawner->player)
@@ -4094,7 +4063,7 @@ static void K_DoThunderShield(player_t *player)
mo->scale = player->mo->scale*3 + (player->mo->scale/2); mo->scale = player->mo->scale*3 + (player->mo->scale/2);
// spawn horizontal bolts; // spawn horizontal bolts;
for (i = 0; i < 7; i++) for (i=0; i<7; i++)
{ {
mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK); mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK);
mo->angle = P_RandomRange(0, 359)*ANG1; mo->angle = P_RandomRange(0, 359)*ANG1;
@@ -4105,7 +4074,7 @@ static void K_DoThunderShield(player_t *player)
// spawn the radius thing: // spawn the radius thing:
an = ANGLE_22h; an = ANGLE_22h;
for (i = 0; i < 15; i++) for (i=0; i<15; i++)
{ {
sx = player->mo->x + FixedMul((player->mo->scale*THUNDERRADIUS), FINECOSINE((an*i)>>ANGLETOFINESHIFT)); sx = player->mo->x + FixedMul((player->mo->scale*THUNDERRADIUS), FINECOSINE((an*i)>>ANGLETOFINESHIFT));
sy = player->mo->y + FixedMul((player->mo->scale*THUNDERRADIUS), FINESINE((an*i)>>ANGLETOFINESHIFT)); sy = player->mo->y + FixedMul((player->mo->scale*THUNDERRADIUS), FINESINE((an*i)>>ANGLETOFINESHIFT));
@@ -4197,12 +4166,12 @@ static void K_DoHyudoroSteal(player_t *player)
void K_DoSneaker(player_t *player, INT32 type) void K_DoSneaker(player_t *player, INT32 type)
{ {
const fixed_t intendedboost = K_GetSneakerBoostSpeed();
if (!player->kartstuff[k_floorboost] || player->kartstuff[k_floorboost] == 3) if (!player->kartstuff[k_floorboost] || player->kartstuff[k_floorboost] == 3)
{ {
S_StartSound(player->mo, sfx_cdfm01); S_StartSound(player->mo, sfx_cdfm01);
K_SpawnDashDustRelease(player); K_SpawnDashDustRelease(player);
const fixed_t intendedboost = K_GetSneakerBoostSpeed();
if (intendedboost > player->kartstuff[k_speedboost]) if (intendedboost > player->kartstuff[k_speedboost])
player->kartstuff[k_destboostcam] = FixedMul(FRACUNIT, FixedDiv((intendedboost - player->kartstuff[k_speedboost]), intendedboost)); player->kartstuff[k_destboostcam] = FixedMul(FRACUNIT, FixedDiv((intendedboost - player->kartstuff[k_speedboost]), intendedboost));
} }
@@ -4672,7 +4641,8 @@ void K_RepairOrbitChain(mobj_t *orbit)
prev->movedir = num; prev->movedir = num;
} }
player->kartstuff[k_itemamount] = num; if (player->kartstuff[k_itemamount] != num)
player->kartstuff[k_itemamount] = num;
} }
} }
@@ -6197,13 +6167,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 isprevcheckpointi = mo->health == players[i].starpostnum;
const boolean isnextcheckpointi = mo->health == (players[i].starpostnum + 1); const boolean isnextcheckpointi = mo->health == (players[i].starpostnum + 1);
@@ -6218,8 +6181,7 @@ void K_KartUpdatePosition(player_t *player)
players[i].kartstuff[k_prevcheck] += imo; players[i].kartstuff[k_prevcheck] += imo;
ipcd++; ipcd++;
} }
if (isnextcheckpointi )
if (isnextcheckpointi)
{ {
players[i].kartstuff[k_nextcheck] += imo; players[i].kartstuff[k_nextcheck] += imo;
incd++; incd++;
+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_RollMobjBySlopes(mobj_t *mo, pslope_t *slope);
void K_SpawnBoostTrail(player_t *player); void K_SpawnBoostTrail(player_t *player);
void K_SpawnSparkleTrail(mobj_t *mo); 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_DriftDustHandling(mobj_t *spawner);
void K_PuntMine(mobj_t *mine, mobj_t *punter); void K_PuntMine(mobj_t *mine, mobj_t *punter);
void K_DoSneaker(player_t *player, INT32 type); 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))) #define TYPEERROR(f, t) FIELDERROR(f, va("%s expected, got %s", lua_typename(L, t), luaL_typename(L, -1)))
lua_pushnil(L); lua_pushnil(L);
while (lua_next(L, 1)) while (lua_next(L, 1)) {
{
// stack: cvar table, cvar userdata, key/index, value // stack: cvar table, cvar userdata, key/index, value
// 1 2 3 4 // 1 2 3 4
i = 0; i = 0;
@@ -369,40 +368,26 @@ static int lib_cvRegisterVar(lua_State *L)
else if (lua_isstring(L, 3)) else if (lua_isstring(L, 3))
k = lua_tostring(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)) if (!lua_isstring(L, 4))
TYPEERROR("name", LUA_TSTRING) TYPEERROR("name", LUA_TSTRING)
cvar->name = Z_StrDup(lua_tostring(L, 4)); 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)) if (!lua_isstring(L, 4))
TYPEERROR("defaultvalue", LUA_TSTRING) TYPEERROR("defaultvalue", LUA_TSTRING)
cvar->defaultvalue = Z_StrDup(lua_tostring(L, 4)); 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)) if (!lua_isnumber(L, 4))
TYPEERROR("flags", LUA_TNUMBER) TYPEERROR("flags", LUA_TNUMBER)
cvar->flags = (INT32)lua_tointeger(L, 4); cvar->flags = (INT32)lua_tointeger(L, 4);
} } else if (i == 4 || (k && fasticmp(k, "PossibleValue"))) {
else if (i == 4 || (k && fasticmp(k, "PossibleValue"))) if (lua_islightuserdata(L, 4)) {
{
if (lua_islightuserdata(L, 4))
{
CV_PossibleValue_t *pv = lua_touserdata(L, 4); CV_PossibleValue_t *pv = lua_touserdata(L, 4);
if (pv == CV_OnOff || pv == CV_YesNo || pv == CV_Unsigned || pv == CV_Natural) if (pv == CV_OnOff || pv == CV_YesNo || pv == CV_Unsigned || pv == CV_Natural)
cvar->PossibleValue = pv; cvar->PossibleValue = pv;
else else
FIELDERROR("PossibleValue", "CV_PossibleValue_t expected, got unrecognised pointer") 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} // 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"}} // 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; CV_PossibleValue_t *cvpv;
lua_pushnil(L); lua_pushnil(L);
while (lua_next(L, 4)) {
while (lua_next(L, 4))
{
count++; count++;
lua_pop(L, 1); lua_pop(L, 1);
} }
@@ -429,9 +412,7 @@ static int lib_cvRegisterVar(lua_State *L)
i = 0; i = 0;
lua_pushnil(L); lua_pushnil(L);
while (lua_next(L, 4)) {
while (lua_next(L, 4))
{
// stack: [...] PossibleValue table, index, value // stack: [...] PossibleValue table, index, value
// 4 5 6 // 4 5 6
if (lua_type(L, 5) != LUA_TSTRING if (lua_type(L, 5) != LUA_TSTRING
@@ -442,19 +423,14 @@ static int lib_cvRegisterVar(lua_State *L)
i++; i++;
lua_pop(L, 1); lua_pop(L, 1);
} }
cvpv[i].value = 0; cvpv[i].value = 0;
cvpv[i].strvalue = NULL; cvpv[i].strvalue = NULL;
cvar->PossibleValue = cvpv; 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))) 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)) if (!lua_isfunction(L, 4))
TYPEERROR("func", LUA_TFUNCTION) TYPEERROR("func", LUA_TFUNCTION)
lua_getfield(L, LUA_REGISTRYINDEX, "CV_OnChange"); lua_getfield(L, LUA_REGISTRYINDEX, "CV_OnChange");
I_Assert(lua_istable(L, 5)); I_Assert(lua_istable(L, 5));
lua_pushlightuserdata(L, cvar); lua_pushlightuserdata(L, cvar);
@@ -462,13 +438,9 @@ static int lib_cvRegisterVar(lua_State *L)
lua_rawset(L, 5); lua_rawset(L, 5);
lua_pop(L, 1); lua_pop(L, 1);
cvar->func = Lua_OnChange; 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"))) || (k && fasticmp(k, "category")))
{ {
category = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4); 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); menu_name = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
} }
lua_pop(L, 1); lua_pop(L, 1);
} }
#undef FIELDERROR #undef FIELDERROR
+49 -39
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) 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"); luaL_argcheck(L, mobj_type < NUMMOBJTYPES, 3, "invalid mobjtype_t");
@@ -293,17 +293,18 @@ typedef struct Hook_State Hook_State;
typedef void (*Hook_Callback)(Hook_State *); typedef void (*Hook_Callback)(Hook_State *);
struct Hook_State { struct Hook_State {
INT32 status; /* return status to calling function */ INT32 status;/* return status to calling function */
void * userdata; void * userdata;
int hook_type; int hook_type;
mobjtype_t mobj_type; /* < NUMMOBJTYPES if mobj hook */ mobjtype_t mobj_type;/* >0 if mobj hook */
const char * string; /* used to fetch table, ran first if set */ boolean force_mobj;// allows mobj_type equal 0
int top; /* index of last argument passed to hook */ const char * string;/* used to fetch table, ran first if set */
int id; /* id to fetch ref */ int top;/* index of last argument passed to hook */
bool important; /* is this hook from local addon */ int id;/* id to fetch ref */
int values; /* num arguments passed to hook */ boolean important;/* is this hook from local addon */
int results; /* num values returned by hook */ int values;/* num arguments passed to hook */
Hook_Callback results_handler; /* callback when hook successfully returns */ int results;/* num values returned by hook */
Hook_Callback results_handler;/* callback when hook successfully returns */
}; };
enum { enum {
@@ -363,8 +364,10 @@ FUNCINLINE static ATTRINLINE boolean prepare_hook
int default_status, int default_status,
int hook_type int hook_type
){ ){
hook->force_mobj = false;
return init_hook_type(hook, default_status, return init_hook_type(hook, default_status,
hook_type, NUMMOBJTYPES, NULL, hook_type, 0, NULL,
hookIds[hook_type].numHooks); hookIds[hook_type].numHooks);
} }
@@ -378,6 +381,8 @@ FUNCINLINE static ATTRINLINE boolean prepare_mobj_hook
const mobjtype_t mobj_type = const mobjtype_t mobj_type =
primary_mobj ? primary_mobj->type : NUMMOBJTYPES; primary_mobj ? primary_mobj->type : NUMMOBJTYPES;
hook->force_mobj = true;
return init_hook_type(hook, default_status, return init_hook_type(hook, default_status,
hook_type, mobj_type, NULL, hook_type, mobj_type, NULL,
mobj_hook_available(hook_type, mobj_type)); mobj_hook_available(hook_type, mobj_type));
@@ -390,8 +395,10 @@ FUNCINLINE static ATTRINLINE boolean prepare_string_hook
int hook_type, int hook_type,
const char * string const char * string
){ ){
hook->force_mobj = false;
if (init_hook_type(hook, default_status, if (init_hook_type(hook, default_status,
hook_type, NUMMOBJTYPES, string, hook_type, 0, string,
stringHooks[hook_type].ref)) stringHooks[hook_type].ref))
{ {
lua_pushstring(gL, string); lua_pushstring(gL, string);
@@ -407,7 +414,7 @@ FUNCINLINE static ATTRINLINE boolean prepare_hud_hook
int hook_type int hook_type
){ ){
return init_hook_type(hook, 0, return init_hook_type(hook, 0,
hook_type, NUMMOBJTYPES, NULL, hook_type, 0, NULL,
hudHookIds[hook_type].numHooks); hudHookIds[hook_type].numHooks);
} }
@@ -547,11 +554,14 @@ static int call_hooks
{ {
calls += call_string_hooks(hook); calls += call_string_hooks(hook);
} }
else if (hook->mobj_type < NUMMOBJTYPES) else if (hook->force_mobj)
{ {
/* call generic mobj hooks first */ /* call generic mobj hooks first */
calls += call_mobj_type_hooks(hook, MT_NULL); 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; ps_lua_mobjhooks.value.i += calls;
} }
else else
@@ -605,7 +615,7 @@ FUNCINLINE static ATTRINLINE void res_hud(Hook_State *hook)
int LUA_HookMobj(mobj_t *mobj, int hook_type) int LUA_HookMobj(mobj_t *mobj, int hook_type)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_mobj_hook(&hook, false, hook_type, mobj)) if (prepare_mobj_hook(&hook, false, hook_type, mobj))
{ {
LUA_PushUserdata(gL, mobj, META_MOBJ); LUA_PushUserdata(gL, mobj, META_MOBJ);
@@ -616,7 +626,7 @@ int LUA_HookMobj(mobj_t *mobj, int hook_type)
int LUA_Hook2Mobj(mobj_t *t1, mobj_t *t2, int hook_type) int LUA_Hook2Mobj(mobj_t *t1, mobj_t *t2, int hook_type)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_mobj_hook(&hook, 0, hook_type, t1)) if (prepare_mobj_hook(&hook, 0, hook_type, t1))
{ {
LUA_PushUserdata(gL, t1, META_MOBJ); LUA_PushUserdata(gL, t1, META_MOBJ);
@@ -628,14 +638,14 @@ int LUA_Hook2Mobj(mobj_t *t1, mobj_t *t2, int hook_type)
void LUA_HookVoid(int type) void LUA_HookVoid(int type)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_hook(&hook, 0, type)) if (prepare_hook(&hook, 0, type))
call_hooks(&hook, 0, res_none); call_hooks(&hook, 0, res_none);
} }
void LUA_HookInt(INT32 number, int hook_type) void LUA_HookInt(INT32 number, int hook_type)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_hook(&hook, 0, hook_type)) if (prepare_hook(&hook, 0, hook_type))
{ {
lua_pushinteger(gL, number); lua_pushinteger(gL, number);
@@ -645,7 +655,7 @@ void LUA_HookInt(INT32 number, int hook_type)
/*void LUA_HookBool(boolean value, int hook_type) /*void LUA_HookBool(boolean value, int hook_type)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_hook(&hook, 0, hook_type)) if (prepare_hook(&hook, 0, hook_type))
{ {
//lua_pushboolean(gL, value); //lua_pushboolean(gL, value);
@@ -655,7 +665,7 @@ void LUA_HookInt(INT32 number, int hook_type)
int LUA_HookPlayer(player_t *player, int hook_type) int LUA_HookPlayer(player_t *player, int hook_type)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_hook(&hook, false, hook_type)) if (prepare_hook(&hook, false, hook_type))
{ {
LUA_PushUserdata(gL, player, META_PLAYER); LUA_PushUserdata(gL, player, META_PLAYER);
@@ -666,7 +676,7 @@ int LUA_HookPlayer(player_t *player, int hook_type)
int LUA_HookTiccmd(player_t *player, ticcmd_t *cmd, int hook_type) int LUA_HookTiccmd(player_t *player, ticcmd_t *cmd, int hook_type)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_hook(&hook, false, hook_type)) if (prepare_hook(&hook, false, hook_type))
{ {
LUA_PushUserdata(gL, player, META_PLAYER); LUA_PushUserdata(gL, player, META_PLAYER);
@@ -685,7 +695,7 @@ int LUA_HookTiccmd(player_t *player, ticcmd_t *cmd, int hook_type)
void LUA_HookHUD(int hook_type, huddrawlist_h list) void LUA_HookHUD(int hook_type, huddrawlist_h list)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_hud_hook(&hook, hook_type)) if (prepare_hud_hook(&hook, hook_type))
{ {
LUA_SetHudHook(hook_type, list); LUA_SetHudHook(hook_type, list);
@@ -713,7 +723,7 @@ static void hook_think_frame(int type)
int hook_index = 0; int hook_index = 0;
precise_t time_taken = 0; precise_t time_taken = 0;
Hook_State hook = {}; Hook_State hook;
const hook_t * map = &hookIds[type]; const hook_t * map = &hookIds[type];
int k; int k;
@@ -773,7 +783,7 @@ void LUA_HookPostThinkFrame(void)
int LUA_HookTouchSpecial(mobj_t *special, mobj_t *toucher) int LUA_HookTouchSpecial(mobj_t *special, mobj_t *toucher)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_mobj_hook(&hook, false, MOBJ_HOOK(TouchSpecial), special)) if (prepare_mobj_hook(&hook, false, MOBJ_HOOK(TouchSpecial), special))
{ {
LUA_PushUserdata(gL, special, META_MOBJ); LUA_PushUserdata(gL, special, META_MOBJ);
@@ -792,7 +802,7 @@ static int damage_hook
int hook_type, int hook_type,
Hook_Callback results_handler Hook_Callback results_handler
){ ){
Hook_State hook = {}; Hook_State hook;
if (prepare_mobj_hook(&hook, 0, hook_type, target)) if (prepare_mobj_hook(&hook, 0, hook_type, target))
{ {
LUA_PushUserdata(gL, target, META_MOBJ); LUA_PushUserdata(gL, target, META_MOBJ);
@@ -880,8 +890,8 @@ int LUA_HookBotAI(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd)
{ {
const char *skin = ((skin_t *)tails->skin)->name; const char *skin = ((skin_t *)tails->skin)->name;
Hook_State hook = {}; Hook_State hook;
BotAI_State botai = {}; BotAI_State botai;
if (prepare_string_hook(&hook, false, STRING_HOOK(BotAI), skin)) if (prepare_string_hook(&hook, false, STRING_HOOK(BotAI), skin))
{ {
@@ -901,7 +911,7 @@ int LUA_HookBotAI(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd)
void LUA_HookLinedefExecute(line_t *line, mobj_t *mo, sector_t *sector) void LUA_HookLinedefExecute(line_t *line, mobj_t *mo, sector_t *sector)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_string_hook if (prepare_string_hook
(&hook, 0, STRING_HOOK(LinedefExecute), line->text)) (&hook, 0, STRING_HOOK(LinedefExecute), line->text))
{ {
@@ -914,7 +924,7 @@ void LUA_HookLinedefExecute(line_t *line, mobj_t *mo, sector_t *sector)
int LUA_HookPlayerMsg(int source, int target, int flags, char *msg, int mute) int LUA_HookPlayerMsg(int source, int target, int flags, char *msg, int mute)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_hook(&hook, false, HOOK(PlayerMsg))) if (prepare_hook(&hook, false, HOOK(PlayerMsg)))
{ {
LUA_PushUserdata(gL, &players[source], META_PLAYER); // Source player LUA_PushUserdata(gL, &players[source], META_PLAYER); // Source player
@@ -943,7 +953,7 @@ int LUA_HookPlayerMsg(int source, int target, int flags, char *msg, int mute)
int LUA_HookHurtMsg(player_t *player, mobj_t *inflictor, mobj_t *source) int LUA_HookHurtMsg(player_t *player, mobj_t *inflictor, mobj_t *source)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_mobj_hook(&hook, false, MOBJ_HOOK(HurtMsg), inflictor)) if (prepare_mobj_hook(&hook, false, MOBJ_HOOK(HurtMsg), inflictor))
{ {
LUA_PushUserdata(gL, player, META_PLAYER); LUA_PushUserdata(gL, player, META_PLAYER);
@@ -957,7 +967,7 @@ int LUA_HookHurtMsg(player_t *player, mobj_t *inflictor, mobj_t *source)
void LUA_HookNetArchive(lua_CFunction archFunc, savebuffer_t *save) void LUA_HookNetArchive(lua_CFunction archFunc, savebuffer_t *save)
{ {
const hook_t * map = &hookIds[HOOK(NetVars)]; const hook_t * map = &hookIds[HOOK(NetVars)];
Hook_State hook = {}; Hook_State hook;
/* this is a remarkable case where the stack isn't reset */ /* this is a remarkable case where the stack isn't reset */
if (map->numHooks > 0) if (map->numHooks > 0)
{ {
@@ -987,7 +997,7 @@ void LUA_HookNetArchive(lua_CFunction archFunc, savebuffer_t *save)
void LUA_HookPlayerQuit(player_t *plr, int reason) void LUA_HookPlayerQuit(player_t *plr, int reason)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_hook(&hook, 0, HOOK(PlayerQuit))) if (prepare_hook(&hook, 0, HOOK(PlayerQuit)))
{ {
LUA_PushUserdata(gL, plr, META_PLAYER); // Player that quit LUA_PushUserdata(gL, plr, META_PLAYER); // Player that quit
@@ -1050,7 +1060,7 @@ int LUA_HookMusicChange(const char *oldname, struct MusicChange *param)
const int type = HOOK(MusicChange); const int type = HOOK(MusicChange);
const hook_t * map = &hookIds[type]; const hook_t * map = &hookIds[type];
Hook_State hook = {}; Hook_State hook;
int k; int k;
@@ -1086,7 +1096,7 @@ int LUA_HookMusicChange(const char *oldname, struct MusicChange *param)
int LUA_HookMusicCredit(musicdef_t *musicdef) int LUA_HookMusicCredit(musicdef_t *musicdef)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_hook(&hook, 0, HOOK(MusicCredit))) if (prepare_hook(&hook, 0, HOOK(MusicCredit)))
{ {
LUA_PushUserdata(gL, musicdef, META_MUSICDEF); LUA_PushUserdata(gL, musicdef, META_MUSICDEF);
@@ -1104,7 +1114,7 @@ static int kartdamage_hook
int hook_type, int hook_type,
Hook_Callback results_handler Hook_Callback results_handler
){ ){
Hook_State hook = {}; Hook_State hook;
if (prepare_hook(&hook, 0, hook_type)) if (prepare_hook(&hook, 0, hook_type))
{ {
LUA_PushUserdata(gL, player, META_PLAYER); LUA_PushUserdata(gL, player, META_PLAYER);
@@ -1153,7 +1163,7 @@ boolean LUA_HookPlayerExplode(player_t *player, mobj_t *inflictor, mobj_t *sourc
void LUA_HookSetupVote(INT16 result[], INT16 maxresults, UINT8 gt, UINT8 secondgt) void LUA_HookSetupVote(INT16 result[], INT16 maxresults, UINT8 gt, UINT8 secondgt)
{ {
Hook_State hook = {}; Hook_State hook;
if (prepare_hook(&hook, 0, HOOK(SetupVote))) if (prepare_hook(&hook, 0, HOOK(SetupVote)))
{ {
// { 0, 0, 0, 0, } // { 0, 0, 0, 0, }
+1 -1
View File
@@ -1297,7 +1297,7 @@ static int lib_hudsetvotebackground(lua_State *L)
if (strlen(prefix) != 4) if (strlen(prefix) != 4)
{ {
return luaL_argerror(L, 1, "prefix should be 4 characters wide"); return luaL_argerror(L, 1, "prefix should 4 characters wide");
} }
strncpy(VoteScreen.luaPrefix, prefix, 4); strncpy(VoteScreen.luaPrefix, prefix, 4);
+29 -28
View File
@@ -650,34 +650,34 @@ void LUA_HUD_DrawList(huddrawlist_h list)
case DI_DrawString: case DI_DrawString:
switch(item->align) switch(item->align)
{ {
// hu_font // hu_font
case align_left: case align_left:
V_DrawString(LERPS(x), LERPS(y), item->flags, itemstr); V_DrawString(LERPS(x), LERPS(y), item->flags, itemstr);
break; break;
case align_center: case align_center:
V_DrawCenteredString(LERPS(x), LERPS(y), item->flags, itemstr); V_DrawCenteredString(LERPS(x), LERPS(y), item->flags, itemstr);
break; break;
case align_right: case align_right:
V_DrawRightAlignedString(LERPS(x), LERPS(y), item->flags, itemstr); V_DrawRightAlignedString(LERPS(x), LERPS(y), item->flags, itemstr);
break; break;
case align_fixed: case align_fixed:
V_DrawStringAtFixed(LERPS(x), LERPS(y), item->flags, itemstr); V_DrawStringAtFixed(LERPS(x), LERPS(y), item->flags, itemstr);
break; break;
// hu_font, 0.5x scale // hu_font, 0.5x scale
case align_small: case align_small:
V_DrawSmallString(LERPS(x), LERPS(y), item->flags, itemstr); V_DrawSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
break; break;
case align_smallright: case align_smallright:
V_DrawRightAlignedSmallString(LERPS(x), LERPS(y), item->flags, itemstr); V_DrawRightAlignedSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
break; break;
// tny_font // tny_font
case align_thin: case align_thin:
V_DrawThinString(LERPS(x), LERPS(y), item->flags, itemstr); V_DrawThinString(LERPS(x), LERPS(y), item->flags, itemstr);
break; break;
case align_thinright: case align_thinright:
V_DrawRightAlignedThinString(LERPS(x), LERPS(y), item->flags, itemstr); V_DrawRightAlignedThinString(LERPS(x), LERPS(y), item->flags, itemstr);
break; break;
} }
break; break;
case DI_DrawKartString: case DI_DrawKartString:
V_DrawKartString(LERPS(x), LERPS(y), item->flags, itemstr); V_DrawKartString(LERPS(x), LERPS(y), item->flags, itemstr);
@@ -690,6 +690,7 @@ void LUA_HUD_DrawList(huddrawlist_h list)
break; break;
default: default:
I_Error("can't draw draw list item: invalid draw list item type"); I_Error("can't draw draw list item: invalid draw list item type");
continue;
} }
} }
} }
+13 -13
View File
@@ -1506,6 +1506,7 @@ enum mapheaderinfo_e
mapheaderinfo_saveoverride, mapheaderinfo_saveoverride,
mapheaderinfo_levelflags, mapheaderinfo_levelflags,
mapheaderinfo_menuflags, mapheaderinfo_menuflags,
//mapheaderinfo_automap,
mapheaderinfo_mobj_scale, mapheaderinfo_mobj_scale,
}; };
@@ -1541,6 +1542,7 @@ static const char *const mapheaderinfo_opt[] = {
"saveoverride", "saveoverride",
"levelflags", "levelflags",
"menuflags", "menuflags",
//"automap",
"mobj_scale", "mobj_scale",
NULL, NULL,
}; };
@@ -1582,11 +1584,10 @@ static int mapheaderinfo_get(lua_State *L)
lua_pushinteger(L, header->muspos); lua_pushinteger(L, header->muspos);
break; break;
case mapheaderinfo_musinterfadeout: case mapheaderinfo_musinterfadeout:
lua_pushinteger(L, 0); // unused lua_pushinteger(L, header->musinterfadeout);
break; break;
case mapheaderinfo_musintername: case mapheaderinfo_musintername:
// uhh psure its fine to just push nil instead of empty string? lua_pushstring(L, header->musintername);
lua_pushstring(L, NULL);
break; break;
case mapheaderinfo_forcecharacter: case mapheaderinfo_forcecharacter:
lua_pushstring(L, header->forcecharacter); lua_pushstring(L, header->forcecharacter);
@@ -1640,10 +1641,10 @@ static int mapheaderinfo_get(lua_State *L)
lua_pushinteger(L, header->levelselect); lua_pushinteger(L, header->levelselect);
break; break;
case mapheaderinfo_bonustype: case mapheaderinfo_bonustype:
lua_pushinteger(L, 0); // unused lua_pushinteger(L, header->bonustype);
break; break;
case mapheaderinfo_saveoverride: case mapheaderinfo_saveoverride:
lua_pushinteger(L, SAVE_DEFAULT); // unused lua_pushinteger(L, header->saveoverride);
break; break;
case mapheaderinfo_levelflags: case mapheaderinfo_levelflags:
lua_pushinteger(L, header->levelflags); lua_pushinteger(L, header->levelflags);
@@ -1651,29 +1652,28 @@ static int mapheaderinfo_get(lua_State *L)
case mapheaderinfo_menuflags: case mapheaderinfo_menuflags:
lua_pushinteger(L, header->menuflags); lua_pushinteger(L, header->menuflags);
break; break;
/*case mapheaderinfo_automap:
lua_pushstring(L, header->selectheading);
break;*/
case mapheaderinfo_mobj_scale: case mapheaderinfo_mobj_scale:
lua_pushfixed(L, header->mobj_scale); lua_pushfixed(L, header->mobj_scale);
break; break;
// TODO add support for reading numGradedMares and grades
default: default:
{ {
// Read custom vars now // Read custom vars now
// (note: don't include the "LUA." in your lua scripts!) // (note: don't include the "LUA." in your lua scripts!)
if (!header->numCustomOptions) {
lua_pushnil(L);
break;
}
UINT8 j = 0; UINT8 j = 0;
const char *cusoptstr = lua_tostring(L, 2); for (;j < header->numCustomOptions && !fastcmp(lua_tostring(L, 2), header->customopts[j].option); ++j);
for (;j < header->numCustomOptions && !fastcmp(cusoptstr, header->customopts[j].option); ++j);
if (j < header->numCustomOptions) if(j < header->numCustomOptions)
lua_pushstring(L, header->customopts[j].value); lua_pushstring(L, header->customopts[j].value);
else else
lua_pushnil(L); lua_pushnil(L);
} }
} }
return 1; return 1;
} }
int LUA_MapLib(lua_State *L) int LUA_MapLib(lua_State *L)
+8 -13
View File
@@ -979,7 +979,7 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
if (!gL) if (!gL)
{ {
if (fastcmp(ptype, "player")) // players must always be included, even if no vars if (fastcmp(ptype,"player")) // players must always be included, even if no vars
WRITEUINT16(*p, 0); WRITEUINT16(*p, 0);
return; return;
} }
@@ -995,7 +995,7 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
if (!lua_istable(gL, -1)) if (!lua_istable(gL, -1))
{ // no extra values table { // no extra values table
lua_pop(gL, 1); lua_pop(gL, 1);
if (fastcmp(ptype, "player")) // players must always be included, even if no vars if (fastcmp(ptype,"player")) // players must always be included, even if no vars
WRITEUINT16(*p, 0); WRITEUINT16(*p, 0);
return; return;
} }
@@ -1007,13 +1007,13 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
// skip anything that has an empty table and isn't a player. // skip anything that has an empty table and isn't a player.
if (i == 0) if (i == 0)
{ {
if (fastcmp(ptype, "player")) // always include players even if they have no extra variables if (fastcmp(ptype,"player")) // always include players even if they have no extra variables
WRITEUINT16(*p, 0); WRITEUINT16(*p, 0);
lua_pop(gL, 1); lua_pop(gL, 1);
return; return;
} }
if (fastcmp(ptype, "mobj")) // mobjs must write their mobjnum as a header if (fastcmp(ptype,"mobj")) // mobjs must write their mobjnum as a header
WRITEUINT32(*p, ((mobj_t *)pointer)->mobjnum); WRITEUINT32(*p, ((mobj_t *)pointer)->mobjnum);
WRITEUINT16(*p, i); WRITEUINT16(*p, i);
@@ -1065,9 +1065,8 @@ static void ArchiveTables(UINT8 **p)
n++; // the table contained a new table we'll have to archive. :( n++; // the table contained a new table we'll have to archive. :(
else if (e == 2) // invalid key type (function, thread, lightuserdata, or anything we don't recognise) else if (e == 2) // invalid key type (function, thread, lightuserdata, or anything we don't recognise)
{ {
lua_pushvalue(gL, -2); // copy key for error message (lua_tostring may mutate it which confuses lua_next) CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -2), luaL_typename(gL, -2), i);
CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -1), luaL_typename(gL, -1), i); lua_pop(gL, 1);
lua_pop(gL, 2); // pop key copy and value
continue; continue;
} }
else if (e == 3) // nil key due to invalid userdata. NOT an error. else if (e == 3) // nil key due to invalid userdata. NOT an error.
@@ -1081,15 +1080,11 @@ static void ArchiveTables(UINT8 **p)
if (e == 1) if (e == 1)
n++; // the table contained a new table we'll have to archive. :( n++; // the table contained a new table we'll have to archive. :(
else if (e == 2) // invalid value type else if (e == 2) // invalid value type
{ CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -2), luaL_typename(gL, -1));
lua_pushvalue(gL, -2); // copy key for error message (same as above)
CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -1), luaL_typename(gL, -2));
lua_pop(gL, 1); // pop key copy
}
lua_pop(gL, 1); lua_pop(gL, 1);
}
}
lua_pop(gL, 1); lua_pop(gL, 1);
WRITEUINT8(*p, ARCH_TEND); WRITEUINT8(*p, ARCH_TEND);
} }
-8
View File
@@ -13,10 +13,6 @@
#define LZF_H #define LZF_H
#include <stdio.h> #include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
/*********************************************************************** /***********************************************************************
** **
** lzf -- an extremely fast/free compression/decompression-method ** 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, lzf_decompress (const void *const in_data, size_t in_len,
void *out_data, size_t out_len); void *out_data, size_t out_len);
#ifdef __cplusplus
} // extern "C"
#endif
#endif #endif
+1 -1
View File
@@ -556,7 +556,7 @@ static void GIF_framewrite(void)
} }
else if (gif_dynamicdelay ==(UINT8) 1) else if (gif_dynamicdelay ==(UINT8) 1)
{ {
float delayf = ceilf(100.0f/NEWTICRATE); float delayf = ceil(100.0f/NEWTICRATE);
delay = (UINT16)((I_GetPreciseTime() - gif_prevframetime)) / (I_GetPrecisePrecision() / 1000000) /10/1000; delay = (UINT16)((I_GetPreciseTime() - gif_prevframetime)) / (I_GetPrecisePrecision() / 1000000) /10/1000;
+8
View File
@@ -249,6 +249,9 @@ boolean cht_Responder(event_t *ev)
#define REQUIRE_SINGLEPLAYER if (netgame || multiplayer)\ #define REQUIRE_SINGLEPLAYER if (netgame || multiplayer)\
{ CONS_Printf(M_GetText("This only works in single player.\n")); return; } { CONS_Printf(M_GetText("This only works in single player.\n")); return; }
#define REQUIRE_NOULTIMATE if (ultimatemode)\
{ CONS_Printf(M_GetText("You're too good to be cheating!\n")); return; }
// command that can be typed at the console! // command that can be typed at the console!
void Command_CheatNoClip_f(void) void Command_CheatNoClip_f(void)
{ {
@@ -256,6 +259,7 @@ void Command_CheatNoClip_f(void)
REQUIRE_INLEVEL; REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER; REQUIRE_SINGLEPLAYER;
REQUIRE_NOULTIMATE;
plyr = &players[consoleplayer]; plyr = &players[consoleplayer];
plyr->pflags ^= PF_NOCLIP; plyr->pflags ^= PF_NOCLIP;
@@ -270,6 +274,7 @@ void Command_CheatGod_f(void)
REQUIRE_INLEVEL; REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER; REQUIRE_SINGLEPLAYER;
REQUIRE_NOULTIMATE;
plyr = &players[consoleplayer]; plyr = &players[consoleplayer];
plyr->pflags ^= PF_GODMODE; plyr->pflags ^= PF_GODMODE;
@@ -284,6 +289,7 @@ void Command_CheatNoTarget_f(void)
REQUIRE_INLEVEL; REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER; REQUIRE_SINGLEPLAYER;
REQUIRE_NOULTIMATE;
plyr = &players[consoleplayer]; plyr = &players[consoleplayer];
plyr->pflags ^= PF_INVIS; plyr->pflags ^= PF_INVIS;
@@ -587,6 +593,7 @@ void Command_Devmode_f(void)
#ifndef _DEBUG #ifndef _DEBUG
REQUIRE_SINGLEPLAYER; REQUIRE_SINGLEPLAYER;
#endif #endif
REQUIRE_NOULTIMATE;
if (COM_Argc() > 1) if (COM_Argc() > 1)
{ {
@@ -1041,6 +1048,7 @@ void Command_ObjectPlace_f(void)
{ {
REQUIRE_INLEVEL; REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER; REQUIRE_SINGLEPLAYER;
REQUIRE_NOULTIMATE;
G_SetGameModified(multiplayer, true); G_SetGameModified(multiplayer, true);
+9
View File
@@ -29,6 +29,7 @@ void Command_ObjectPlace_f(void);
void Command_Writethings_f(void); void Command_Writethings_f(void);
extern consvar_t cv_opflags, cv_mapthingnum, cv_speed; extern consvar_t cv_opflags, cv_mapthingnum, cv_speed;
//extern consvar_t cv_snapto, cv_grid;
extern boolean objectplacing; extern boolean objectplacing;
extern mobjtype_t op_currentthing; extern mobjtype_t op_currentthing;
@@ -47,10 +48,18 @@ void Command_CheatNoClip_f(void);
void Command_CheatGod_f(void); void Command_CheatGod_f(void);
void Command_CheatNoTarget_f(void); void Command_CheatNoTarget_f(void);
void Command_Savecheckpoint_f(void); void Command_Savecheckpoint_f(void);
/*void Command_Getallemeralds_f(void);
void Command_Resetemeralds_f(void);
void Command_Setrings_f(void);
void Command_Setlives_f(void);
void Command_Setcontinues_f(void);*/
void Command_Devmode_f(void); void Command_Devmode_f(void);
void Command_Scale_f(void); void Command_Scale_f(void);
void Command_Gravflip_f(void); void Command_Gravflip_f(void);
void Command_Hurtme_f(void); void Command_Hurtme_f(void);
/*void Command_JumpToAxis_f(void);
void Command_Charability_f(void);
void Command_Charspeed_f(void);*/
void Command_Teleport_f(void); void Command_Teleport_f(void);
void Command_RTeleport_f(void); void Command_RTeleport_f(void);
void Command_Skynum_f(void); void Command_Skynum_f(void);
+22 -3
View File
@@ -479,13 +479,32 @@ UINT8 M_CheckLevelEmblems(void)
// Update Score, Time, Rings emblems // Update Score, Time, Rings emblems
for (i = 0; i < numemblems; ++i) for (i = 0; i < numemblems; ++i)
{ {
// Requires time on map <= x if (emblemlocations[i].type <= ET_SKIN || emblemlocations[i].collected)
if (emblemlocations[i].type != ET_TIME || emblemlocations[i].collected)
continue; continue;
levelnum = emblemlocations[i].level; levelnum = emblemlocations[i].level;
valToReach = emblemlocations[i].var; 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; emblemlocations[i].collected = res;
if (res) if (res)
+10
View File
@@ -27,11 +27,21 @@ typedef enum
UC_MATCHESPLAYED, // SRB2Kart: MATCHESPLAYED [x played] UC_MATCHESPLAYED, // SRB2Kart: MATCHESPLAYED [x played]
UC_GAMECLEAR, // GAMECLEAR <x times> UC_GAMECLEAR, // GAMECLEAR <x times>
UC_ALLEMERALDS, // ALLEMERALDS <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_OVERALLTIME, // OVERALLTIME [time to beat, tics]
//UC_OVERALLRINGS, // OVERALLRINGS [rings to beat]
UC_MAPVISITED, // MAPVISITED [map number] UC_MAPVISITED, // MAPVISITED [map number]
UC_MAPBEATEN, // MAPBEATEN [map number] UC_MAPBEATEN, // MAPBEATEN [map number]
UC_MAPALLEMERALDS, // MAPALLEMERALDS [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_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_TRIGGER, // TRIGGER [trigger number]
UC_TOTALEMBLEMS, // TOTALEMBLEMS [number of emblems] UC_TOTALEMBLEMS, // TOTALEMBLEMS [number of emblems]
UC_EMBLEM, // EMBLEM [emblem number] 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) static void Command_ListEmotes_f(void)
{ {
const int EMOTES_PER_PAGE = 24; 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; int page = 1;
if (COM_Argc() > 1) if (COM_Argc() > 1)
-7
View File
@@ -62,9 +62,6 @@ FUNCMATH fixed_t FixedHypot(fixed_t x, fixed_t y)
angle_t angle; angle_t angle;
fixed_t dist; fixed_t dist;
I_Assert(x != INT32_MIN);
I_Assert(y != INT32_MIN);
x = abs(x); x = abs(x);
y = abs(y); y = abs(y);
@@ -80,10 +77,6 @@ FUNCMATH fixed_t FixedHypot(fixed_t x, fixed_t y)
if (!y) if (!y)
return x; return x;
// prevent underflow
if (y == INT32_MIN)
return INT32_MAX;
angle = (tantoangle[FixedDiv(y, x)>>DBITS] + ANGLE_90) >> ANGLETOFINESHIFT; angle = (tantoangle[FixedDiv(y, x)>>DBITS] + ANGLE_90) >> ANGLETOFINESHIFT;
// use as cosine // use as cosine
+212 -99
View File
@@ -142,13 +142,16 @@ typedef enum
} text_enum; } text_enum;
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_mutex m_menu_mutex; I_Mutex m_menu_mutex;
#endif #endif
M_waiting_mode_t m_waiting_mode = M_NOT_WAITING; M_waiting_mode_t m_waiting_mode = M_NOT_WAITING;
const char *quitmsg[NUM_QUITMESSAGES] = {}; const char *quitmsg[NUM_QUITMESSAGES] = {};
// Stuff for customizing the player select screen Tails 09-22-2003
description_t description[MAXSKINS] = {};
INT32 mapwads[NUMMAPS] = {}; INT32 mapwads[NUMMAPS] = {};
boolean browselocalskins = false; boolean browselocalskins = false;
@@ -183,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 INT16 skullAnimCounter = 10; // skull animation counter
static boolean interpTimerHackAllow = 0; static boolean interpTimerHackAllow = 0;
static UINT8 setupcontrolplayer; static UINT8 setupcontrolplayer;
static INT32 (*setupcontrols)[2]; // pointer to the gamecontrols of the player being edited static INT32 (*setupcontrols)[2]; // pointer to the gamecontrols of the player being edited
// shhh... what am I doing... nooooo! // shhh... what am I doing... nooooo!
static INT32 vidm_testingmode = 0; static INT32 vidm_testingmode = 0;
@@ -198,8 +201,8 @@ static char setupm_ip[64];
static textinput_t setupm_input_ip; static textinput_t setupm_input_ip;
static fixed_t multi_tics; static fixed_t multi_tics;
static state_t *multi_state; static state_t *multi_state;
// this is set before entering the MultiPlayer setup menu, // this is set before entering the MultiPlayer setup menu,
// for either player 1 or 2 // for either player 1 or 2
@@ -496,6 +499,32 @@ static consvar_t cv_dummystaff = {"dummystaff", "0", CV_HIDEN|CV_CALL, dummystaf
// all the menu definitions and onchanges reside in here now // all the menu definitions and onchanges reside in here now
#include "m_menudefs.c" #include "m_menudefs.c"
static INT32 M_ShiftChar(INT32 ch)
{
if (I_UseNativeKeyboard())
return ch;
if (cv_keyboardlayout.value == 3)
{
if (ch >= 32 && ch <= 141)
{
if (shiftdown)
ch = shiftxform[ch];
else if (altdown & 0x2)
ch = french_altgrxform[ch];
else
ch = HU_FallBackFrSpecialLetter(ch);
}
}
else
{
if (shiftdown && ch >= 32 && ch <= 127)
ch = shiftxform[ch];
}
return ch;
}
// //
// M_GetGametypeColor // M_GetGametypeColor
// //
@@ -995,9 +1024,9 @@ boolean M_Responder(event_t *ev)
//case KEY_JOY1 + 2: //case KEY_JOY1 + 2:
ch = KEY_ENTER; ch = KEY_ENTER;
break; break;
/*case KEY_JOY1 + 3: // Brake can function as 'n' for message boxes now. /*case KEY_JOY1 + 3: // Brake can function as 'n' for message boxes now.
ch = 'n'; ch = 'n';
break;*/ break;*/
case KEY_MOUSE1 + 1: case KEY_MOUSE1 + 1:
//case KEY_JOY1 + 1: //case KEY_JOY1 + 1:
ch = KEY_BACKSPACE; ch = KEY_BACKSPACE;
@@ -1224,7 +1253,7 @@ boolean M_Responder(event_t *ev)
// Handle menuitems which need a specific key handling // Handle menuitems which need a specific key handling
if (routine && (currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_KEYHANDLER) if (routine && (currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_KEYHANDLER)
{ {
ch = CON_ShiftChar(ch); ch = M_ShiftChar(ch);
routine(ch); routine(ch);
return true; return true;
} }
@@ -1254,7 +1283,6 @@ boolean M_Responder(event_t *ev)
void (*otherroutine)(event_t *sev) = currentMenu->menuitems[itemOn].itemaction; void (*otherroutine)(event_t *sev) = currentMenu->menuitems[itemOn].itemaction;
otherroutine(ev); //Alam: what a hack otherroutine(ev); //Alam: what a hack
} }
return true; return true;
} }
} }
@@ -1277,21 +1305,12 @@ boolean M_Responder(event_t *ev)
{ {
playback_last_menu_interaction_leveltime = leveltime; playback_last_menu_interaction_leveltime = leveltime;
// Flip left/right with up/down for the playback menu, since it's a horizontal icon row. // Flip left/right with up/down for the playback menu, since it's a horizontal icon row.
switch (ch) switch (ch)
{ {
case KEY_LEFTARROW: case KEY_LEFTARROW: ch = KEY_UPARROW; break;
ch = KEY_UPARROW; case KEY_UPARROW: ch = KEY_RIGHTARROW; break;
break; case KEY_RIGHTARROW: ch = KEY_DOWNARROW; break;
case KEY_UPARROW: case KEY_DOWNARROW: ch = KEY_LEFTARROW; break;
ch = KEY_RIGHTARROW;
break;
case KEY_RIGHTARROW:
ch = KEY_DOWNARROW;
break;
case KEY_DOWNARROW:
ch = KEY_LEFTARROW;
break;
// arbitrary keyboard shortcuts because fuck you // arbitrary keyboard shortcuts because fuck you
@@ -1342,8 +1361,7 @@ boolean M_Responder(event_t *ev)
G_AdjustView(4, 1, true); G_AdjustView(4, 1, true);
break; break;
default: default: break;
break;
} }
} }
@@ -1468,7 +1486,6 @@ boolean M_Responder(event_t *ev)
} }
return false; return false;
break;
default: default:
CON_Responder(ev); CON_Responder(ev);
@@ -1950,7 +1967,7 @@ void M_Ticker(void)
} }
#if defined (MASTERSERVER) && defined (HAVE_THREADS) #if defined (MASTERSERVER) && defined (HAVE_THREADS)
I_lock_mutex(&ms_ServerList_mutex); I_LockMutex(&ms_ServerList_mutex);
{ {
if (ms_ServerList) if (ms_ServerList)
{ {
@@ -1959,7 +1976,7 @@ void M_Ticker(void)
ms_ServerList = NULL; ms_ServerList = NULL;
} }
} }
I_unlock_mutex(ms_ServerList_mutex); I_UnlockMutex(ms_ServerList_mutex);
#endif #endif
} }
@@ -1968,6 +1985,8 @@ void M_Ticker(void)
// //
void M_Init(void) void M_Init(void)
{ {
UINT8 i;
COM_AddCommand("manual", Command_Manual_f); COM_AddCommand("manual", Command_Manual_f);
CV_RegisterVar(&cv_nextmap); CV_RegisterVar(&cv_nextmap);
@@ -2013,6 +2032,15 @@ void M_Init(void)
quitmsg[QUIT3MSG5] = M_GetText("You'll be back to play soon, though...\n...right?\n\n(Press 'Y' to quit)"); quitmsg[QUIT3MSG5] = M_GetText("You'll be back to play soon, though...\n...right?\n\n(Press 'Y' to quit)");
quitmsg[QUIT3MSG6] = M_GetText("Aww, is Eggman's Nightclub too\ndifficult for you?\n\n(Press 'Y' to quit)"); quitmsg[QUIT3MSG6] = M_GetText("Aww, is Eggman's Nightclub too\ndifficult for you?\n\n(Press 'Y' to quit)");
// Setup PlayerMenu table
for (i = 0; i < MAXSKINS; i++)
{
PlayerMenu[i].status = (i == 0 ? IT_CALL : IT_DISABLED);
PlayerMenu[i].patch = PlayerMenu[i].text = NULL;
PlayerMenu[i].itemaction = M_ChoosePlayer;
PlayerMenu[i].alphaKey = 0;
}
#ifdef HWRENDER #ifdef HWRENDER
// Permanently hide some options based on render mode // Permanently hide some options based on render mode
if (rendermode == render_soft) if (rendermode == render_soft)
@@ -2036,6 +2064,7 @@ void M_Init(void)
OP_OpenGLOptionsMenu[op_gl_shader].status = IT_GRAYEDOUT; OP_OpenGLOptionsMenu[op_gl_shader].status = IT_GRAYEDOUT;
OP_OpenGLOptionsMenu[op_gl_lightdither].status = IT_GRAYEDOUT; OP_OpenGLOptionsMenu[op_gl_lightdither].status = IT_GRAYEDOUT;
OP_OpenGLOptionsMenu[op_gl_palrender].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; OP_ExpOptionsMenu[op_exp_paldepth].status = IT_GRAYEDOUT;
} }
@@ -2067,6 +2096,55 @@ void M_Init(void)
M_TextInputInit(&menuinput, menu_text_input_buf, sizeof menu_text_input_buf); M_TextInputInit(&menuinput, menu_text_input_buf, sizeof menu_text_input_buf);
} }
void M_InitCharacterTables(void)
{
UINT8 i;
// Setup PlayerMenu table
for (i = 0; i < MAXSKINS; i++)
{
PlayerMenu[i].status = (i < 4 ? IT_CALL : IT_DISABLED);
PlayerMenu[i].patch = PlayerMenu[i].text = NULL;
PlayerMenu[i].itemaction = M_ChoosePlayer;
PlayerMenu[i].alphaKey = 0;
}
// Setup description table
for (i = 0; i < MAXSKINS; i++)
{
if (i == 0)
{
strcpy(description[i].notes, "\x82Sonic\x80 is the fastest of the three, but also the hardest to control. Beginners beware, but experts will find Sonic very powerful.\n\n\x82""Ability:\x80 Speed Thok\nDouble jump to zoom forward with a huge burst of speed.\n\n\x82Tip:\x80 Simply letting go of forward does not slow down in SRB2. To slow down, hold the opposite direction.");
strcpy(description[i].picname, "");
strcpy(description[i].skinname, "sonic");
}
else if (i == 1)
{
strcpy(description[i].notes, "\x82Tails\x80 is the most mobile of the three, but has the slowest speed. Because of his mobility, he's well-\nsuited to beginners.\n\n\x82""Ability:\x80 Fly\nDouble jump to start flying for a limited time. Repetitively hit the jump button to ascend.\n\n\x82Tip:\x80 To quickly descend while flying, hit the spin button.");
strcpy(description[i].picname, "");
strcpy(description[i].skinname, "tails");
}
else if (i == 2)
{
strcpy(description[i].notes, "\x82Knuckles\x80 is well-\nrounded and can destroy breakable walls simply by touching them, but he can't jump as high as the other two.\n\n\x82""Ability:\x80 Glide & Climb\nDouble jump to glide in the air as long as jump is held. Glide into a wall to climb it.\n\n\x82Tip:\x80 Press spin while climbing to jump off the wall; press jump instead to jump off\nand face away from\nthe wall.");
strcpy(description[i].picname, "");
strcpy(description[i].skinname, "knuckles");
}
else if (i == 3)
{
strcpy(description[i].notes, "\x82Sonic & Tails\x80 team up to take on Dr. Eggman!\nControl Sonic while Tails desperately struggles to keep up.\n\nPlayer 2 can control Tails directly by setting the controls in the options menu.\nTails's directional controls are relative to Player 1's camera.\n\nTails can pick up Sonic while flying and carry him around.");
strcpy(description[i].picname, "CHRS&T");
strcpy(description[i].skinname, "sonic&tails");
}
else
{
strcpy(description[i].notes, "???");
strcpy(description[i].picname, "");
strcpy(description[i].skinname, "");
}
}
}
// ========================================================================== // ==========================================================================
// SPECIAL MENU OPTION DRAW ROUTINES GO HERE // SPECIAL MENU OPTION DRAW ROUTINES GO HERE
// ========================================================================== // ==========================================================================
@@ -2858,7 +2936,7 @@ static void M_PrepareLevelSelect(void)
boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt) boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt)
{ {
// invalid mapnum // invalid mapnum
if (mapnum < -1 || mapnum >= NUMMAPS) if (mapnum < -1)
return false; return false;
// Random map! // Random map!
@@ -3936,18 +4014,18 @@ size_t demolist_all_size = 0;
boolean replaynamesloaded = false; boolean replaynamesloaded = false;
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_mutex replayquerymutex; 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 // to avoid infinite SIGABRT recursion in the signal handler
// due to poisoned locks or mach-o kernel not supporting locks in signals // due to poisoned locks or mach-o kernel not supporting locks in signals
// or something like that. idk // or something like that. idk
# define Lock_search_state() if (!I_In_Exiting_Signal_Handler()) { I_lock_mutex(&replayquerymutex); } # define Lock_search_state() if (!g_in_exiting_signal_handler) { I_LockMutex(&replayquerymutex); }
# define Unlock_search_state() if (!I_In_Exiting_Signal_Handler()) { I_unlock_mutex(replayquerymutex); } # define Unlock_search_state() if (!g_in_exiting_signal_handler) { I_UnlockMutex(replayquerymutex); }
#else /*HAVE_THREADS*/ #else/*HAVE_THREADS*/
# define Lock_search_state() # define Lock_search_state()
# define Unlock_search_state() # define Unlock_search_state()
#endif /*HAVE_THREADS*/ #endif/*HAVE_THREADS*/
#define MAXREPLAYQUERY 37 #define MAXREPLAYQUERY 37
@@ -4010,7 +4088,10 @@ static void LoadReplayNames(void)
Unlock_search_state(); Unlock_search_state();
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_spawn_thread("replay-names-load", ReplayNamesLoadThread, replaydirpath); if (!I_SpawnThread("replay-names-load", ReplayNamesLoadThread, replaydirpath))
{
free(replaydirpath);
}
#else #else
ReplayNamesLoadThread(replaydirpath); ReplayNamesLoadThread(replaydirpath);
#endif #endif
@@ -4035,9 +4116,6 @@ static void AddCheckedReplay(void)
// Check up to maxnum replays if they match with query // Check up to maxnum replays if they match with query
static void M_HutCheckReplays(size_t maxnum) static void M_HutCheckReplays(size_t maxnum)
{ {
// Stripped of color codes
char demo_title[sizeof(demolist_all[0].title)];
if (!replaynamesloaded) if (!replaynamesloaded)
return; return;
@@ -4070,9 +4148,7 @@ static void M_HutCheckReplays(size_t maxnum)
case MD_NOTLOADED: case MD_NOTLOADED:
case MD_OUTDATED: case MD_OUTDATED:
case MD_LOADED: case MD_LOADED:
StripColors(demo_title, demolist_all[replayquerycheck].title, sizeof(demo_title)); if (demolist_all[replayquerycheck].title[0] && strcasestr(demolist_all[replayquerycheck].title, replayqueryinput.buffer) != NULL)
if (demolist_all[replayquerycheck].title[0] && strcasestr(demo_title, replayqueryinput.buffer) != NULL)
AddCheckedReplay(); // It matches, add it! AddCheckedReplay(); // It matches, add it!
else else
replayquerycheck++; // Doesn't match, moving on... replayquerycheck++; // Doesn't match, moving on...
@@ -4832,7 +4908,6 @@ static void M_HutStartReplay(INT32 choice)
demo.loadfiles = (itemOn == 0); demo.loadfiles = (itemOn == 0);
demo.ignorefiles = (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); G_DoPlayDemo(demolist[dir_on[menudepthleft]].filepath);
} }
@@ -5330,7 +5405,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
} }
if (cvar->flags & CV_NETVAR) 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 else
OP_CustomCvarMenu[ccvarposition] = (menuitem_t){ IT_STRING | IT_CVAR, NULL, Z_StrDup(name), cvar, ccvaralphakey }; OP_CustomCvarMenu[ccvarposition] = (menuitem_t){ IT_STRING | IT_CVAR, NULL, Z_StrDup(name), cvar, ccvaralphakey };
@@ -5450,6 +5525,7 @@ static void M_DrawChecklist(void)
if (conditionSets[unlockables[i].conditionset - 1].numconditions) if (conditionSets[unlockables[i].conditionset - 1].numconditions)
{ {
c = 0;
lastid = -1; lastid = -1;
for (c = 0; c < conditionSets[unlockables[i].conditionset - 1].numconditions; c++) for (c = 0; c < conditionSets[unlockables[i].conditionset - 1].numconditions; c++)
@@ -5609,6 +5685,9 @@ static void M_DrawMusicTest(void)
{ {
INT32 x, y, i; INT32 x, y, i;
x = 90<<FRACBITS;
y = (BASEVIDHEIGHT-32)<<FRACBITS;
y = (BASEVIDWIDTH-vid.scaledwidth)/2; y = (BASEVIDWIDTH-vid.scaledwidth)/2;
V_DrawFill(y-1, 20, vid.scaledwidth+1, 24, 239); V_DrawFill(y-1, 20, vid.scaledwidth+1, 24, 239);
@@ -6394,7 +6473,7 @@ static void M_ChooseTimeAttack(INT32 choice)
static void M_HandleStaffReplay(INT32 choice) static void M_HandleStaffReplay(INT32 choice)
{ {
boolean exitmenu = false; // exit to previous menu 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) switch (choice)
{ {
@@ -6424,7 +6503,7 @@ static void M_HandleStaffReplay(INT32 choice)
M_ClearMenus(true); M_ClearMenus(true);
modeattacking = ATTACKING_RECORD; modeattacking = ATTACKING_RECORD;
demo.loadfiles = false; demo.ignorefiles = true; // Just assume that record attack replays have the files needed 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; break;
default: default:
break; break;
@@ -6608,11 +6687,11 @@ static void M_EndGame(INT32 choice)
void M_SetWaitingMode(int mode) void M_SetWaitingMode(int mode)
{ {
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&m_menu_mutex); I_LockMutex(&m_menu_mutex);
#endif #endif
m_waiting_mode = mode; m_waiting_mode = mode;
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_unlock_mutex(m_menu_mutex); I_UnlockMutex(m_menu_mutex);
#endif #endif
} }
@@ -6621,11 +6700,11 @@ int M_GetWaitingMode(void)
int mode; int mode;
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&m_menu_mutex); I_LockMutex(&m_menu_mutex);
#endif #endif
mode = m_waiting_mode; mode = m_waiting_mode;
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_unlock_mutex(m_menu_mutex); I_UnlockMutex(m_menu_mutex);
#endif #endif
return mode; return mode;
@@ -6637,20 +6716,23 @@ static void Spawn_masterserver_thread(const char *name, void (*thread)(int*))
{ {
int *id = malloc(sizeof *id); int *id = malloc(sizeof *id);
I_lock_mutex(&ms_QueryId_mutex); I_LockMutex(&ms_QueryId_mutex);
*id = ms_QueryId; *id = ms_QueryId;
I_unlock_mutex(ms_QueryId_mutex); I_UnlockMutex(ms_QueryId_mutex);
I_spawn_thread(name, (I_thread_fn)thread, id); if (!I_SpawnThread(name, (I_ThreadFn)thread, id))
{
free(id);
}
} }
static int Same_instance(int id) static int Same_instance(int id)
{ {
int okay; int okay;
I_lock_mutex(&ms_QueryId_mutex); I_LockMutex(&ms_QueryId_mutex);
okay = ( id == ms_QueryId ); okay = ( id == ms_QueryId );
I_unlock_mutex(ms_QueryId_mutex); I_UnlockMutex(ms_QueryId_mutex);
return okay; return okay;
} }
@@ -6679,9 +6761,9 @@ static void Fetch_servers_thread(int *id)
M_SetWaitingMode(M_NOT_WAITING); M_SetWaitingMode(M_NOT_WAITING);
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&ms_ServerList_mutex); I_LockMutex(&ms_ServerList_mutex);
ms_ServerList = server_list; ms_ServerList = server_list;
I_unlock_mutex(ms_ServerList_mutex); I_UnlockMutex(ms_ServerList_mutex);
#else #else
CL_QueryServerList(server_list); CL_QueryServerList(server_list);
free(server_list); free(server_list);
@@ -6714,7 +6796,7 @@ static void M_SearchServerList(void)
serverlistsearchedcount = 0; serverlistsearchedcount = 0;
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&ms_ServerList_mutex); I_LockMutex(&ms_ServerList_mutex);
#endif #endif
for (UINT32 i = 0; i < serverlistcount; ++i) for (UINT32 i = 0; i < serverlistcount; ++i)
@@ -6725,7 +6807,7 @@ static void M_SearchServerList(void)
} }
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_unlock_mutex(ms_ServerList_mutex); I_UnlockMutex(ms_ServerList_mutex);
#endif #endif
if (menuinput.length > 0) if (menuinput.length > 0)
@@ -7091,11 +7173,11 @@ static void M_CheckMODVersion(int id)
{ {
sprintf(updatestring, UPDATE_ALERT_STRING, VERSIONSTRING, updatecheck); sprintf(updatestring, UPDATE_ALERT_STRING, VERSIONSTRING, updatecheck);
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_lock_mutex(&m_menu_mutex); I_LockMutex(&m_menu_mutex);
#endif #endif
M_StartMessage(updatestring, NULL, MM_NOTHING); M_StartMessage(updatestring, NULL, MM_NOTHING);
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
I_unlock_mutex(m_menu_mutex); I_UnlockMutex(m_menu_mutex);
#endif #endif
} }
} }
@@ -7141,13 +7223,13 @@ static void M_ConnectMenu(INT32 choice)
itemOn = 0; itemOn = 0;
#if defined (MASTERSERVER) && defined (HAVE_THREADS) #if defined (MASTERSERVER) && defined (HAVE_THREADS)
I_lock_mutex(&ms_QueryId_mutex); I_LockMutex(&ms_QueryId_mutex);
{ {
ms_QueryId++; ms_QueryId++;
} }
I_unlock_mutex(ms_QueryId_mutex); I_UnlockMutex(ms_QueryId_mutex);
I_lock_mutex(&ms_ServerList_mutex); I_LockMutex(&ms_ServerList_mutex);
{ {
if (ms_ServerList) if (ms_ServerList)
{ {
@@ -7155,7 +7237,7 @@ static void M_ConnectMenu(INT32 choice)
ms_ServerList = NULL; ms_ServerList = NULL;
} }
} }
I_unlock_mutex(ms_ServerList_mutex); I_UnlockMutex(ms_ServerList_mutex);
#ifdef UPDATE_ALERT #ifdef UPDATE_ALERT
Spawn_masterserver_thread("check-new-version", Check_new_version_thread); Spawn_masterserver_thread("check-new-version", Check_new_version_thread);
@@ -7865,24 +7947,25 @@ static void M_DrawSetupMultiPlayerMenu(void)
INT32 tw = 0; INT32 tw = 0;
spritedef_t *sprdef; spritedef_t *sprdef;
spriteframe_t *sprframe; spriteframe_t *sprframe;
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 *patch; patch_t *patch;
UINT8 frame; UINT8 frame;
UINT8 speed; UINT8 speed;
UINT8 weight; UINT8 weight;
UINT8 i; UINT8 i;
UINT8 s, w; UINT8 s, w;
const UINT8 *flashcol = V_GetStringColormap(highlightflags);
INT32 skinnum = 0; INT32 skinnum = 0;
INT32 statx, staty; INT32 statx, staty;
UINT32 speenframe; UINT32 speenframe;
INT32 sltw, actw, hetw; INT32 sltw, actw, hetw;
UINT8 skintodisplay; UINT8 skintodisplay;
INT32 nameboxaddy = 0; INT32 nameboxaddy = 0;
int statoffset = 0;
const UINT8 *flashcol = V_GetStringColormap(highlightflags); int gridyoffset = 0;
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);
mx = MP_PlayerSetupDef.x; mx = MP_PlayerSetupDef.x;
my = MP_PlayerSetupDef.y; my = MP_PlayerSetupDef.y;
@@ -7897,6 +7980,8 @@ static void M_DrawSetupMultiPlayerMenu(void)
switch (cv_skinselectmenu.value) switch (cv_skinselectmenu.value)
{ {
case SKINMENUTYPE_EXTENDED: case SKINMENUTYPE_EXTENDED:
nameboxaddy = 6;
break;
case SKINMENUTYPE_GRID: case SKINMENUTYPE_GRID:
nameboxaddy = 6; nameboxaddy = 6;
break; break;
@@ -7912,23 +7997,44 @@ static void M_DrawSetupMultiPlayerMenu(void)
else else
M_DrawTextInput(mx + 40, my + nameboxaddy, &setupm_input, 0); M_DrawTextInput(mx + 40, my + nameboxaddy, &setupm_input, 0);
#define GETSELECTEDSKINNAME (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].realname : skins[setupm_fakeskin].realname)
#define GETSELECTEDSPEED (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartspeed : skins[setupm_fakeskin].kartspeed)
#define GETSELECTEDWEIGHT (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartweight : skins[setupm_fakeskin].kartweight)
// draw skin string // draw skin string
st = V_StringWidth(skins[setupm_fakeskin].realname, 0); st = V_StringWidth(skins[setupm_fakeskin].realname, 0);
switch (cv_skinselectmenu.value) switch (cv_skinselectmenu.value)
{ {
case SKINMENUTYPE_EXTENDED: case SKINMENUTYPE_EXTENDED:
V_DrawString(statx - (statdp ? 50 : 113), staty - 10, V_6WIDTHSPACE, va("\x84%dS \x87%dW", GETSELECTEDSPEED, GETSELECTEDWEIGHT)); #define GETSELECTEDSKINNAME (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].realname : skins[setupm_fakeskin].realname)
/* FALLTHRU */ #define GETSELECTEDSPEED (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartspeed : skins[setupm_fakeskin].kartspeed)
#define GETSELECTEDWEIGHT (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartweight : skins[setupm_fakeskin].kartweight)
statoffset = 0;
tw = V_StringWidth("Character", 0);//V_StringWidth(GETSELECTEDSKINNAME, 0);
st = V_StringWidth(GETSELECTEDSKINNAME, 0);
INT32 selectedskin = (itemOn == 1 && setupm_skinselect < numskins ? skinsorted[setupm_skinselect] : setupm_fakeskin);
speed = skins[selectedskin].kartspeed;
weight = skins[selectedskin].kartweight;
V_DrawString((mx+(tw/2)) - (st/2), my + 37,
((MP_PlayerSetupMenu[2].status & IT_TYPE) == IT_SPACE ? V_TRANSLUCENT : 0) | highlightflags | V_ALLOWLOWERCASE,
GETSELECTEDSKINNAME);
if (statdp == true)
statoffset = 50;
else
statoffset = 113;
V_DrawString(statx - statoffset, staty - 10, V_6WIDTHSPACE, va("\x84%dS \x87%dW", GETSELECTEDSPEED, GETSELECTEDWEIGHT));
#undef GETSELECTEDSKINNAME
#undef GETSELECTEDSPEED
#undef GETSELECTEDWEIGHT
break;
case SKINMENUTYPE_GRID: case SKINMENUTYPE_GRID:
tw = V_StringWidth("Character", 0); #define GETSELECTEDSKINNAME (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].realname : skins[setupm_fakeskin].realname)
tw = V_StringWidth("Character", 0);//V_StringWidth(GETSELECTEDSKINNAME, 0);
st = V_StringWidth(GETSELECTEDSKINNAME, 0); st = V_StringWidth(GETSELECTEDSKINNAME, 0);
V_DrawString((mx+(tw/2)) - (st/2), my + 37, V_DrawString((mx+(tw/2)) - (st/2), my + 37,
((MP_PlayerSetupMenu[2].status & IT_TYPE) == IT_SPACE ? V_TRANSLUCENT : 0) | highlightflags | V_ALLOWLOWERCASE, ((MP_PlayerSetupMenu[2].status & IT_TYPE) == IT_SPACE ? V_TRANSLUCENT : 0) | highlightflags | V_ALLOWLOWERCASE,
GETSELECTEDSKINNAME); GETSELECTEDSKINNAME);
#undef GETSELECTEDSKINNAME
break; break;
case SKINMENUTYPE_2D: case SKINMENUTYPE_2D:
@@ -8006,6 +8112,8 @@ static void M_DrawSetupMultiPlayerMenu(void)
break; break;
} }
#define GRIDSTATOFFSET 0
switch (cv_skinselectmenu.value) switch (cv_skinselectmenu.value)
{ {
case SKINMENUTYPE_EXTENDED: case SKINMENUTYPE_EXTENDED:
@@ -8017,6 +8125,9 @@ static void M_DrawSetupMultiPlayerMenu(void)
if (itemOn == 1) if (itemOn == 1)
V_DrawSmallString(statx+101, staty-37, V_6WIDTHSPACE|highlightflags, "BS: change"); V_DrawSmallString(statx+101, staty-37, V_6WIDTHSPACE|highlightflags, "BS: change");
#define GETSELECTEDSPEED (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartspeed : skins[setupm_fakeskin].kartspeed)
#define GETSELECTEDWEIGHT (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartweight : skins[setupm_fakeskin].kartweight)
if (statdp == true) if (statdp == true)
{ {
//Background //Background
@@ -8046,19 +8157,22 @@ static void M_DrawSetupMultiPlayerMenu(void)
} }
} }
#undef GETSELECTEDSPEED
#undef GETSELECTEDWEIGHT
break; break;
case SKINMENUTYPE_GRID: case SKINMENUTYPE_GRID:
// SRB2Kart: draw the stat backer // SRB2Kart: draw the stat backer
// labels // labels
V_DrawSmallString(statx+12, staty+67, V_6WIDTHSPACE|highlightflags, "Acceleration"); V_DrawSmallString(statx+12+GRIDSTATOFFSET, staty+67, V_6WIDTHSPACE|highlightflags, "Acceleration");
V_DrawSmallString(statx+76, staty+67, V_6WIDTHSPACE|highlightflags, "Max Speed"); V_DrawSmallString(statx+76+GRIDSTATOFFSET, staty+67, V_6WIDTHSPACE|highlightflags, "Max Speed");
V_DrawSmallString(statx+14, staty+75, V_6WIDTHSPACE|highlightflags, "Handling"); V_DrawSmallString(statx+14+GRIDSTATOFFSET, staty+75, V_6WIDTHSPACE|highlightflags, "Handling");
V_DrawSmallString(statx+21, staty+108, V_6WIDTHSPACE|highlightflags, "Weight"); V_DrawSmallString(statx+21+GRIDSTATOFFSET, staty+108, V_6WIDTHSPACE|highlightflags, "Weight");
// label arrows // label arrows
V_DrawFixedPatch(((statx+61)<<FRACBITS) + (FRACUNIT>>1), (staty+67)<<FRACBITS, FRACUNIT>>1, 0, statlr, flashcol); V_DrawFixedPatch(((statx+61+GRIDSTATOFFSET)<<FRACBITS) + (FRACUNIT>>1), (staty+67)<<FRACBITS, FRACUNIT>>1, 0, statlr, flashcol);
V_DrawFixedPatch((statx+40)<<FRACBITS, (staty+80)<<FRACBITS, FRACUNIT>>1, 0, statud, flashcol); V_DrawFixedPatch((statx+40+GRIDSTATOFFSET)<<FRACBITS, (staty+80)<<FRACBITS, FRACUNIT>>1, 0, statud, flashcol);
// bg // bg
V_DrawFixedPatch(((statx+48)<<FRACBITS)+(FRACUNIT>>1), (staty+73)<<FRACBITS, FRACUNIT>>1, 0, statbg, NULL); V_DrawFixedPatch(((statx+48+GRIDSTATOFFSET)<<FRACBITS)+(FRACUNIT>>1), (staty+73)<<FRACBITS, FRACUNIT>>1, 0, statbg, NULL);
for (i = 0; i < numskins; i++) // draw the stat dots for (i = 0; i < numskins; i++) // draw the stat dots
{ {
@@ -8066,7 +8180,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
{ {
speed = skins[i].kartspeed; speed = skins[i].kartspeed;
weight = skins[i].kartweight; weight = skins[i].kartweight;
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL); V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
} }
} }
@@ -8092,9 +8206,9 @@ static void M_DrawSetupMultiPlayerMenu(void)
#define TEXTVERTSHIFT 10 #define TEXTVERTSHIFT 10
DRAWSLOW(statx - sltw - 2, staty); DRAWSLOW(statx - sltw - 2, staty);
DRAWSLOW(statx - sltw - 2, staty - TEXTVERTSHIFT + (9 * 18) - 11); DRAWSLOW(statx - sltw - 2, staty - TEXTVERTSHIFT+ (9 * 18) - 11);
DRAWFAST(statx + (9 * 18), staty); DRAWFAST(statx + (9 * 18), staty);
DRAWFAST(statx + (9 * 18), staty - TEXTVERTSHIFT + (9 * 18) - 11); DRAWFAST(statx + (9 * 18), staty - TEXTVERTSHIFT+ (9 * 18) - 11);
DRAWACCEL(statx - actw - 2, staty + TEXTVERTSHIFT); DRAWACCEL(statx - actw - 2, staty + TEXTVERTSHIFT);
DRAWACCEL(statx + (9 * 18), staty + TEXTVERTSHIFT); DRAWACCEL(statx + (9 * 18), staty + TEXTVERTSHIFT);
DRAWHEAVY(statx - hetw - 2, staty + (9 * 18) - 11); DRAWHEAVY(statx - hetw - 2, staty + (9 * 18) - 11);
@@ -8131,18 +8245,15 @@ static void M_DrawSetupMultiPlayerMenu(void)
break; break;
} }
#undef GETSELECTEDSKINNAME
#undef GETSELECTEDSPEED
#undef GETSELECTEDWEIGHT
switch (cv_skinselectmenu.value) switch (cv_skinselectmenu.value)
{ {
//Skin grid stuff //Skin grid stuff
case SKINMENUTYPE_EXTENDED: case SKINMENUTYPE_EXTENDED:
gridyoffset = 10;
for (s = 0; s < SKINGRIDNEWWIDTH*SKINGRIDNEWHEIGHT; s++) for (s = 0; s < SKINGRIDNEWWIDTH*SKINGRIDNEWHEIGHT; s++)
{ {
INT32 x = ((s % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH) - 8) + 100 + SKINXSHIFT; //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4; INT32 x = ((s % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH) - 8) + 100 + SKINXSHIFT; //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
INT32 y = ((s / SKINGRIDNEWWIDTH) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2)) + 10); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4; INT32 y = ((s / SKINGRIDNEWWIDTH) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2)) + gridyoffset); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
INT32 calcs = s + (setupm_skinypos * SKINGRIDNEWWIDTH); INT32 calcs = s + (setupm_skinypos * SKINGRIDNEWWIDTH);
INT32 skinn; INT32 skinn;
patch_t *face; patch_t *face;
@@ -8168,7 +8279,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
{ {
patch_t *cursor; patch_t *cursor;
INT32 curx = (((setupm_skinselect % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH/2)) + SKINXSHIFT) + 20; INT32 curx = (((setupm_skinselect % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH/2)) + SKINXSHIFT) + 20;
INT32 cury = (((setupm_skinselect / SKINGRIDNEWWIDTH) - setupm_skinypos) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2))+ 10); INT32 cury = (((setupm_skinselect / SKINGRIDNEWWIDTH) - setupm_skinypos) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2))+ gridyoffset);
UINT8 cursorframe = (I_GetTime() / 4) % 7; UINT8 cursorframe = (I_GetTime() / 4) % 7;
cursor = (patch_t *)W_CachePatchName(va("K_CHILI%d", cursorframe + 1), PU_PATCH); cursor = (patch_t *)W_CachePatchName(va("K_CHILI%d", cursorframe + 1), PU_PATCH);
@@ -8228,13 +8339,13 @@ static void M_DrawSetupMultiPlayerMenu(void)
weight = skins[selectedskin].kartweight; weight = skins[selectedskin].kartweight;
statdot = (patch_t *)W_CachePatchName("K_SDOT1", PU_PATCH); statdot = (patch_t *)W_CachePatchName("K_SDOT1", PU_PATCH);
if (skullAnimCounter < 4) // SRB2Kart: we draw this dot later so that it's not covered if there's multiple skins with the same stats if (skullAnimCounter < 4) // SRB2Kart: we draw this dot later so that it's not covered if there's multiple skins with the same stats
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, flashcol); V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, flashcol);
else else
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL); V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
statdot = (patch_t *)W_CachePatchName("K_SDOT2", PU_PATCH); // coloured center statdot = (patch_t *)W_CachePatchName("K_SDOT2", PU_PATCH); // coloured center
if (setupm_fakecolor) if (setupm_fakecolor)
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, R_GetTranslationColormap(0, setupm_fakecolor, GTC_MENUCACHE)); V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, R_GetTranslationColormap(0, setupm_fakecolor, GTC_MENUCACHE));
} }
break; break;
case SKINMENUTYPE_2D: case SKINMENUTYPE_2D:
@@ -8285,6 +8396,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
} }
} }
break; break;
#undef GRIDSTATOFFSET
#undef SKINXSHIFT #undef SKINXSHIFT
default: default:
speed = skins[setupm_fakeskin].kartspeed; speed = skins[setupm_fakeskin].kartspeed;
@@ -9944,6 +10056,7 @@ static void M_DrawVideoMode(void)
va("Wait %d second%s", testtime, (testtime > 1) ? "s" : "")); va("Wait %d second%s", testtime, (testtime > 1) ? "s" : ""));
M_CentreText(OP_VideoModeDef.y + 158, M_CentreText(OP_VideoModeDef.y + 158,
"or press ESC to return"); "or press ESC to return");
} }
else else
{ {
+23 -1
View File
@@ -50,6 +50,9 @@ void M_Drawer(void);
// Called by D_SRB2Main, loads the config file. // Called by D_SRB2Main, loads the config file.
void M_Init(void); void M_Init(void);
// Called by D_SRB2Main also, sets up the playermenu and description tables.
void M_InitCharacterTables(void);
// Called by intro code to force menu up upon a keypress, // Called by intro code to force menu up upon a keypress,
// does nothing if menu is already up. // does nothing if menu is already up.
void M_StartControlPanel(void); void M_StartControlPanel(void);
@@ -81,6 +84,11 @@ typedef enum
} menumessagetype_t; } menumessagetype_t;
void M_StartMessage(const char *string, void *routine, menumessagetype_t itemtype); void M_StartMessage(const char *string, void *routine, menumessagetype_t itemtype);
extern boolean DPADUPSCROLL;
extern boolean DPADDOWNSCROLL;
extern boolean DPADLEFTSCROLL;
extern boolean DPADRIGHTSCROLL;
typedef enum typedef enum
{ {
M_NOT_WAITING, M_NOT_WAITING,
@@ -160,6 +168,8 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt);
#define MAXMENUCCVARS 999 #define MAXMENUCCVARS 999
#define MAXTOOLTIPS 255
typedef union typedef union
{ {
struct menu_s *submenu; // IT_SUBMENU struct menu_s *submenu; // IT_SUBMENU
@@ -185,6 +195,8 @@ typedef struct menuitem_s
UINT16 alphaKey; UINT16 alphaKey;
} menuitem_t; } menuitem_t;
extern menuitem_t PlayerMenu[MAXSKINS];
typedef struct menu_s typedef struct menu_s
{ {
const char *menutitlepic; const char *menutitlepic;
@@ -203,7 +215,7 @@ void M_SetupNextMenu(menu_t *menudef);
void M_ClearMenus(boolean callexitmenufunc); void M_ClearMenus(boolean callexitmenufunc);
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
extern I_mutex m_menu_mutex; extern I_Mutex m_menu_mutex;
#endif #endif
extern menu_t *currentMenu; extern menu_t *currentMenu;
@@ -215,6 +227,14 @@ extern menu_t SP_LoadDef;
void M_SetupJoystickMenu(INT32 choice); void M_SetupJoystickMenu(INT32 choice);
extern menu_t OP_JoystickSetDef; extern menu_t OP_JoystickSetDef;
// Stuff for customizing the player select screen
typedef struct
{
char notes[441];
char picname[8];
char skinname[SKINNAMESIZE*2+2]; // skin&skin\0
} description_t;
// mode descriptions for video mode menu // mode descriptions for video mode menu
typedef struct typedef struct
{ {
@@ -242,6 +262,8 @@ typedef struct
extern INT32 mapwads[NUMMAPS]; extern INT32 mapwads[NUMMAPS];
extern description_t description[MAXSKINS];
extern consvar_t cv_replaysearchrate; extern consvar_t cv_replaysearchrate;
extern consvar_t cv_showfocuslost; extern consvar_t cv_showfocuslost;
extern consvar_t cv_newgametype, cv_nextmap, cv_chooseskin, cv_serversort; extern consvar_t cv_newgametype, cv_nextmap, cv_chooseskin, cv_serversort;
+93 -82
View File
@@ -495,6 +495,12 @@ static menuitem_t SP_LevelStatsMenu[] =
{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelStats, '\0'}, // dummy menuitem for the control func {IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelStats, '\0'}, // dummy menuitem for the control func
}; };
// A rare case.
// External files modify this menu, so we can't call it static.
// And I'm too lazy to go through and rename it everywhere. ARRGH!
#define M_ChoosePlayer NULL
menuitem_t PlayerMenu[MAXSKINS];
// ----------------------------------- // -----------------------------------
// Multiplayer and all of its submenus // Multiplayer and all of its submenus
// ----------------------------------- // -----------------------------------
@@ -980,7 +986,7 @@ static const char* OP_ExpTooltips[] =
"Skips rendering frames if game logic takes too long\npreventing gameplay issues during performance drops.", // idk im shit as describing things "Skips rendering frames if game logic takes too long\npreventing gameplay issues during performance drops.", // idk im shit as describing things
"Different methods of scaling the votescreen backgrounds.", "Different methods of scaling the votescreen backgrounds.",
#ifdef HWRENDER #ifdef HWRENDER
"Disabling Screen Textures may result in a performance boost\nbut will break certain effects.\nScreen textures are required at resolutions lower than your desktop resolution!" "Should the game do Screen Textures? Provides a good boost to frames\nat the cost of some visual effects not working when disabled.",
#ifdef USE_FBO_OGL #ifdef USE_FBO_OGL
"Allows the game to downsample from a higher resolution\nthan your display in OpenGL renderer mode.\nRequires a GPU with atleast OpenGL 2.1 support.", "Allows the game to downsample from a higher resolution\nthan your display in OpenGL renderer mode.\nRequires a GPU with atleast OpenGL 2.1 support.",
#endif #endif
@@ -1017,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, "Fallback Player 3D Model", &cv_glfallbackplayermodel, 20},
{IT_STRING | IT_CVAR, NULL, "Shaders", &cv_glshaders, 25}, {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", &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 Quality", &cv_gltexturedepth, 45},
{IT_STRING | IT_CVAR, NULL, "Texture Filter", &cv_glfiltermode, 50}, {IT_STRING | IT_CVAR, NULL, "Texture Filter", &cv_glfiltermode, 50},
@@ -1037,6 +1045,7 @@ static const char* OP_OpenGLTooltips[] =
"Fallback 3D model for characters that don't have any.", "Fallback 3D model for characters that don't have any.",
"Graphical Shaders.", "Graphical Shaders.",
"Recreates the look of software mode.", "Recreates the look of software mode.",
"Flash palettes for palette rendering.",
"Bit-depth of textures.", "Bit-depth of textures.",
"Filter to use on textures.", "Filter to use on textures.",
"Anisotropic filtering.", "Anisotropic filtering.",
@@ -1055,6 +1064,7 @@ enum
op_gl_falbckmdls, op_gl_falbckmdls,
op_gl_shader, op_gl_shader,
op_gl_palrender, op_gl_palrender,
op_gl_flashpal,
op_gl_scrdepth, op_gl_scrdepth,
op_gl_filter, op_gl_filter,
op_gl_anis, op_gl_anis,
@@ -1185,20 +1195,20 @@ static menuitem_t OP_FocusOptionsMenu[] =
{ {
{IT_HEADER, NULL, "Game Focus Options", NULL, 0}, {IT_HEADER, NULL, "Game Focus Options", NULL, 0},
{IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", &cv_playmusicifunfocused, 10}, {IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", &cv_playmusicifunfocused, 30},
{IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", &cv_playsoundifunfocused, 20}, {IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", &cv_playsoundifunfocused, 40},
{IT_STRING|IT_CVAR, NULL, "Pause Game While Unfocused", &cv_pauseifunfocused, 40}, {IT_STRING|IT_CVAR, NULL, "Pause Game While Unfocused", &cv_pauseifunfocused, 60},
{IT_STRING|IT_CVAR, NULL, "Background FPS Cap", &cv_fpscapbg, 60}, {IT_STRING|IT_CVAR, NULL, "Background FPS Cap", &cv_fpscapbg, 80},
{IT_STRING|IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost, 80}, {IT_STRING|IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost, 100},
{IT_STRING|IT_CVAR, NULL, "Visible Mouse", &cv_mousevisible, 100}, {IT_STRING|IT_CVAR, NULL, "Visible Mouse", &cv_mousevisible, 120},
{IT_STRING|IT_CVAR, NULL, "Gamepad LED Color While Unfocused ", &cv_gamepadledifunfocused, 140},
{IT_STRING|IT_CVAR, NULL, "Gamepad Rumble While Unfocused", &cv_rumbleifunfocused, 150},
{IT_STRING|IT_CVAR, NULL, "Gamepad Inputs While Unfocused", &cv_gamepadifunfocused, 120},
{IT_STRING|IT_CVAR, NULL, "Gamepad LED Color While Unfocused ", &cv_gamepadledifunfocused, 130},
{IT_STRING|IT_CVAR, NULL, "Gamepad Rumble While Unfocused", &cv_rumbleifunfocused, 140},
}; };
static const char* OP_FocusOptionsTooltips[] = static const char* OP_FocusOptionsTooltips[] =
@@ -1210,7 +1220,6 @@ static const char* OP_FocusOptionsTooltips[] =
"Set manual framerate cap while the game is unfocused.", "Set manual framerate cap while the game is unfocused.",
"Should the FOCUS LOST window appear\n while the game is unfocused?", "Should the FOCUS LOST window appear\n while the game is unfocused?",
"Displays the mouse cursor while the game is in focus.", "Displays the mouse cursor while the game is in focus.",
"Should gamepad still control the game when unfocused?",
"Should gamepad LED indicator change color when unfocused?", "Should gamepad LED indicator change color when unfocused?",
"Should gamepad rumble apply when unfocused?", "Should gamepad rumble apply when unfocused?",
}; };
@@ -1305,29 +1314,29 @@ static menuitem_t OP_DiscordOptionsMenu[] =
static menuitem_t OP_HUDOptionsMenu[] = static menuitem_t OP_HUDOptionsMenu[] =
{ {
{IT_STRING | IT_CVAR, NULL, "Show HUD (F3)", &cv_showhud, 10}, {IT_STRING | IT_CVAR, NULL, "Show HUD (F3)", &cv_showhud, 10},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, {IT_STRING | IT_CVAR | IT_CV_SLIDER,
NULL, "HUD Visibility", &cv_translucenthud, 20}, NULL, "HUD Visibility", &cv_translucenthud, 20},
{IT_STRING | IT_SUBMENU, NULL, "Online HUD options...", &OP_ChatOptionsDef, 35}, {IT_STRING | IT_SUBMENU, NULL, "Online HUD options...", &OP_ChatOptionsDef, 35},
{IT_STRING | IT_CVAR, NULL, "Background Glass", &cons_backcolor, 45}, {IT_STRING | IT_CVAR, NULL, "Background Glass", &cons_backcolor, 45},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, {IT_STRING | IT_CVAR | IT_CV_SLIDER,
NULL, "Minimap Visibility", &cv_kartminimap, 60}, NULL, "Minimap Visibility", &cv_kartminimap, 60},
{IT_STRING | IT_CVAR, NULL, "Speedometer Display", &cv_kartspeedometer, 70}, {IT_STRING | IT_CVAR, NULL, "Speedometer Display", &cv_kartspeedometer, 70},
{IT_STRING | IT_CVAR, NULL, "Show \"CHECK\"", &cv_kartcheck, 80}, {IT_STRING | IT_CVAR, NULL, "Show \"CHECK\"", &cv_kartcheck, 80},
{IT_STRING | IT_CVAR, NULL, "Menu Highlights", &cons_menuhighlight, 95}, {IT_STRING | IT_CVAR, NULL, "Menu Highlights", &cons_menuhighlight, 95},
// highlight info - (GOOD HIGHLIGHT, WARNING HIGHLIGHT) - 110 (see M_DrawHUDOptions) // highlight info - (GOOD HIGHLIGHT, WARNING HIGHLIGHT) - 110 (see M_DrawHUDOptions)
{IT_STRING | IT_CVAR, NULL, "Console Text Size", &cv_constextsize, 120}, {IT_STRING | IT_CVAR, NULL, "Console Text Size", &cv_constextsize, 120},
{IT_STRING | IT_CVAR, NULL, "Show Console Prints in Menu",&cons_consoleprintinmenu, 130}, {IT_STRING | IT_CVAR, NULL, "Show Console Prints in Menu",&cons_consoleprintinmenu, 130},
{IT_STRING | IT_CVAR, NULL, "Show Track Addon Name", &cv_showtrackaddon, 145}, {IT_STRING | IT_CVAR, NULL, "Show Track Addon Name", &cv_showtrackaddon, 145},
{IT_STRING | IT_CVAR, NULL, "Show All Maps", &cv_showallmaps, 155}, {IT_STRING | IT_CVAR, NULL, "Show All Maps", &cv_showallmaps, 155},
{IT_STRING | IT_CVAR, NULL, "2D character select", &cv_skinselectmenu, 165}, {IT_STRING | IT_CVAR, NULL, "2D character select", &cv_skinselectmenu, 165},
}; };
static menuitem_t OP_CamOptionsMenu[] = static menuitem_t OP_CamOptionsMenu[] =
@@ -1635,25 +1644,29 @@ static menuitem_t OP_AccessibilityMenu[] =
{IT_STRING|IT_CVAR, NULL, "Minimum Sector Brightness", &cv_secbright, 45}, {IT_STRING|IT_CVAR, NULL, "Minimum Sector Brightness", &cv_secbright, 45},
{IT_STRING|IT_CVAR, NULL, "Water Surface Ripples", &cv_ripplewater, 50}, #ifdef HWRENDER
{IT_STRING|IT_CVAR, NULL, "Screen Textures", &cv_glscreentextures, 50},
#endif
{IT_STRING|IT_CVAR, NULL, "Fade Players near Camera", &cv_playerfade, 55}, {IT_STRING|IT_CVAR, NULL, "Water Surface Ripples", &cv_ripplewater, 55},
{IT_STRING|IT_CVAR, NULL, "Quake Screenshakes", &cv_screenquake, 60}, {IT_STRING|IT_CVAR, NULL, "Fade Players near Camera", &cv_playerfade, 60},
{IT_CALL|IT_STRING, NULL, "Camera Options...", M_CameraMenu, 65}, {IT_STRING|IT_CVAR, NULL, "Quake Screenshakes", &cv_screenquake, 65},
{IT_HEADER, NULL, "Audio", NULL, 75}, {IT_CALL|IT_STRING, NULL, "Camera Options...", M_CameraMenu, 70},
{IT_STRING|IT_CVAR, NULL, "Reverse L/R Channels", &stereoreverse, 85}, {IT_HEADER, NULL, "Audio", NULL, 80},
{IT_STRING|IT_CVAR, NULL, "Same Sound Limit", &cv_samesoundlimit, 90},
{IT_HEADER, NULL, "Controls", NULL, 100}, {IT_STRING|IT_CVAR, NULL, "Reverse L/R Channels", &stereoreverse, 90},
{IT_STRING|IT_CVAR, NULL, "Same Sound Limit", &cv_samesoundlimit, 95},
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P1)", &cv_autoaccel[0], 110}, {IT_HEADER, NULL, "Controls", NULL, 105},
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P2)", &cv_autoaccel[1], 115},
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P3)", &cv_autoaccel[2], 120}, {IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P1)", &cv_autoaccel[0], 115},
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P4)", &cv_autoaccel[3], 125}, {IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P2)", &cv_autoaccel[1], 120},
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P3)", &cv_autoaccel[2], 125},
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P4)", &cv_autoaccel[3], 130},
}; };
static const char* OP_AccessibilityTooltips[] = static const char* OP_AccessibilityTooltips[] =
@@ -1666,6 +1679,9 @@ static const char* OP_AccessibilityTooltips[] =
"Reduces or disables certain effects players might be sensitive to\nSuch as flashing, flickering, certain screen effects and more.", "Reduces or disables certain effects players might be sensitive to\nSuch as flashing, flickering, certain screen effects and more.",
"Disables the flicker effect on Midnight Channel.", "Disables the flicker effect on Midnight Channel.",
"Sets minimum sector brightness, useful for dark areas", "Sets minimum sector brightness, useful for dark areas",
#ifdef HWRENDER
"Disabling Screen Textures will disable the Underwater and Heat screen effects.",
#endif
"Toggles the ripple effect on water surfaces", "Toggles the ripple effect on water surfaces",
"Fades other Players that are close to the camera in and out", "Fades other Players that are close to the camera in and out",
"Toggles the screen shake effect during Earthquakes", "Toggles the screen shake effect during Earthquakes",
@@ -1689,30 +1705,29 @@ static menuitem_t OP_SaturnMenu[] =
{IT_STRING | IT_CVAR, NULL, "Minimum Input Delay", &cv_mindelay, 20}, {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, "Gentlemens Ping", &cv_gentlemens, 25},
{IT_STRING | IT_CVAR, NULL, "Server Info Screen", &cv_serverinfoscreen, 30}, {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 Speedlines", &cv_coloredspeedlines, 50},
{IT_STRING | IT_CVAR, NULL, "Colorized Sneakertrails", &cv_coloredsneakertrail, 60}, {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, "Saturn Hud...", &OP_SaturnHudDef, 135},
{IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 145}, {IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 140},
{IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 150}, // uwu {IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 145}, // uwu
}; };
static const char* OP_SaturnTooltips[] = static const char* OP_SaturnTooltips[] =
@@ -1722,7 +1737,6 @@ static const char* OP_SaturnTooltips[] =
"Practice for online play! 0 = instant response.", "Practice for online play! 0 = instant response.",
"Simulate online input delay when hosting a server.\nValue choosen by Player with the lowest ping", "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 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?", "How much speen do you want?",
"Colourize the speedlines in your skincolor if you go fast enough!", "Colourize the speedlines in your skincolor if you go fast enough!",
"Colourize the sneaker flame trails in your skincolor!", "Colourize the sneaker flame trails in your skincolor!",
@@ -1825,49 +1839,47 @@ static menuitem_t OP_SaturnHudMenu[] =
{ {
{IT_HEADER, NULL, "Saturn Hud Options", NULL, 0}, {IT_HEADER, NULL, "Saturn Hud Options", NULL, 0},
{IT_STRING|IT_CVAR, NULL, "Speedometer Style", &cv_newspeedometer, 10}, {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, "Battle Speedometer", &cv_battlespeedo, 15},
{IT_STRING|IT_CVAR, NULL, "Colourized HUD", &cv_colorizedhud, 25}, {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 Itembox", &cv_colorizeditembox, 30},
{IT_STRING|IT_CVAR, NULL, "Colourized HUD Color", &cv_colorizedhudcolor, 35}, {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, "Stat Display", &cv_showstats, 55},
{IT_STRING|IT_CVAR, NULL, "Skin Name in Stat Display", &cv_showstats_skinname, 60},
{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, "Small Positionnumber", &cv_smallposnum, 75},
{IT_STRING|IT_CVAR, NULL, "Positionnumber Animation", &cv_posanim, 85}, {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, "Multi-Item icons", &cv_multiitemicon, 100},
{IT_STRING|IT_CVAR, NULL, "Item Amount Number", &cv_huditemamount, 110}, {IT_STRING|IT_CVAR, NULL, "Item Amount Number", &cv_huditemamount, 105},
{IT_STRING|IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 115}, {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 Lap Emblem", &cv_showlapemblem, 120},
{IT_STRING|IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 130}, {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 Names on Minimap", &cv_showminimapnames, 135},
{IT_STRING|IT_CVAR, NULL, "Show Finished on Minimap", &cv_showminimapfinished, 145}, {IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 140},
{IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 150}, {IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 145},
{IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 155}, {IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 150},
{IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 160},
{IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 170}, {IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 160},
{IT_STRING|IT_CVAR, NULL, "Music Credits on Pause", &cv_pausesongcredits, 175}, {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, "Nametags...", &OP_NametagDef, 195},
{IT_STRING|IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 210}, {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[] = static const char* OP_SaturnHudTooltips[] =
@@ -1880,7 +1892,6 @@ static const char* OP_SaturnHudTooltips[] =
"The color to use instead of the player color when\ncolourized hud is enabled.", "The color to use instead of the player color when\ncolourized hud is enabled.",
"Displays the input display and lets you choose its style.", "Displays the input display and lets you choose its style.",
"Enable the stat display.", "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.", "Enable the use of the higher resolution want icons instead of rank\nfor some places.",
"Make the Postionnumber half the size.", "Make the Postionnumber half the size.",
"Disable the animation of the Positionnumber\nwhen overtaking someone.", "Disable the animation of the Positionnumber\nwhen overtaking someone.",
@@ -1891,7 +1902,6 @@ static const char* OP_SaturnHudTooltips[] =
"Show the big 'LAP' text on a lap change.", "Show the big 'LAP' text on a lap change.",
"Show the big Cecho Messages.", "Show the big Cecho Messages.",
"Show player names on the minimap.", "Show player names on the minimap.",
"Show players that have finished already on the minimap.",
"Minimize the player icons on the minimap.", "Minimize the player icons on the minimap.",
"Erratically rotate player icons during spinouts.", "Erratically rotate player icons during spinouts.",
"Visualize the player facing angle.", "Visualize the player facing angle.",
@@ -2771,5 +2781,6 @@ void M_UpdateOGLMenu(void)
OP_OpenGLOptionsMenu[op_gl_lightdither].status = (!HWR_UseShader()) ? IT_GRAYEDOUT : IT_STRING | IT_CVAR; 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_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 #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 else
snprintf(locationtxt, 40, "Unknown"); snprintf(locationtxt, 40, "Unknown");
memset(png_infotext, 0x00, sizeof(png_infotext)); memset(png_infotext,0x00,sizeof (png_infotext));
for (i = 0; i < SRB2PNGTXT; i++) for (i = 0; i < SRB2PNGTXT; i++)
png_infotext[i].key = keytxt[i]; png_infotext[i].key = keytxt[i];
png_infotext[0].text = titletxt; png_infotext[0].text = titletxt;
if (movie) 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[5].text = locationtxt;
png_infotext[6].text = interfacetxt; png_infotext[6].text = interfacetxt;
png_infotext[7].text = rendermodetxt; png_infotext[7].text = rendermodetxt;
strncpy(ctrevision, comprevision, sizeof(ctrevision)-1); png_infotext[8].text = strncpy(ctrevision, comprevision, sizeof(ctrevision)-1);
ctrevision[sizeof(ctrevision)-1] = '\0'; png_infotext[9].text = strncpy(ctdate, compdate, sizeof(ctdate)-1);
png_infotext[8].text = ctrevision; png_infotext[10].text = strncpy(cttime, comptime, sizeof(cttime)-1);
strncpy(ctdate, compdate, sizeof(ctdate)-1);
ctdate[sizeof(ctdate)-1] = '\0';
png_infotext[9].text = ctdate;
strncpy(cttime, comptime, sizeof(cttime)-1);
cttime[sizeof(cttime)-1] = '\0';
png_infotext[10].text = cttime;
png_set_text(png_ptr, png_info_ptr, png_infotext, SRB2PNGTXT); png_set_text(png_ptr, png_info_ptr, png_infotext, SRB2PNGTXT);
#undef SRB2PNGTXT #undef SRB2PNGTXT
@@ -1460,9 +1454,9 @@ INT32 axtoi(const char *hexStg)
void CopyCaretColors(char *p, const char *s, int n) void CopyCaretColors(char *p, const char *s, int n)
{ {
gconst char *t; char *t;
int m; int m;
int c; int c;
if (!n) if (!n)
return; return;
@@ -1570,7 +1564,6 @@ char *M_GetToken(const char *inputString)
{ {
startPos = endPos; startPos = endPos;
} }
if (stringToUse == NULL) if (stringToUse == NULL)
return 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 the end of the string is reached, no token is to be read
if (startPos == stringLength) if (startPos == stringLength) {
{
endPos = stringLength; endPos = stringLength;
return NULL; return NULL;
} }
@@ -1652,7 +1644,7 @@ char *M_GetToken(const char *inputString)
|| stringToUse[startPos] == '}') || stringToUse[startPos] == '}')
{ {
endPos = startPos + 1; 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[0] = stringToUse[startPos];
texturesToken[1] = '\0'; texturesToken[1] = '\0';
return texturesToken; return texturesToken;
@@ -1863,10 +1855,8 @@ int M_PathParts(const char *path)
int n; int n;
const char *p; const char *p;
const char *t; const char *t;
if (path == NULL) if (path == NULL)
return 0; return 0;
for (n = 0, p = path ;; ++n) for (n = 0, p = path ;; ++n)
{ {
t = p; t = p;
@@ -1879,7 +1869,6 @@ int M_PathParts(const char *path)
break; break;
} }
} }
return n; return n;
} }
@@ -1922,9 +1911,7 @@ void M_MkdirEachUntil(const char *cpath, int start, int end, int mode)
if (!( p = strchr(p, PATHSEP[0]) )) if (!( p = strchr(p, PATHSEP[0]) ))
return; return;
} }
p += strspn(p, PATHSEP); p += strspn(p, PATHSEP);
for (;;) for (;;)
{ {
if (end > 0 && !--end) if (end > 0 && !--end)
@@ -1969,22 +1956,6 @@ UINT32 FNV1a_Hash(const char *message, size_t size)
return hash; 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 FNV1a_HashString(const char *message)
{ {
UINT32 hash = FNV1A_OFFSET_BASIS; 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 // Hashes some message using FNV-1a
UINT32 FNV1a_Hash(const char *message, size_t size); 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_HashString(const char *message);
UINT32 FNV1a_HashLowercaseString(const char *message); UINT32 FNV1a_HashLowercaseString(const char *message);
Loaded 100 of 154 files, more files were not shown because too many files have changed in this diff. Show more