Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f58772a570 | ||
|
|
f7c065b22e |
No files matched your search
+2
-1
@@ -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
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 */
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
|
||||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
File diff suppressed because it is too large.
Load diff
+3
-7
@@ -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
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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)
|
||||||
|
|||||||
@@ -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
File diff suppressed because it is too large.
Load diff
+10
-3
@@ -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
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
@@ -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
File diff suppressed because it is too large.
Load diff
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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(§or->lightlist[i], sprmo->x, sprmo->y);
|
const fixed_t h = P_GetLightZAt(§or->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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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" \
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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.
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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*/
|
||||||
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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 = §ors[rover->secnum]; // makes things easier for us
|
s2 = §ors[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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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)
|
||||||
|
|||||||
@@ -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
@@ -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)
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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
Reference in new issue
Block a user