Compare commits
210
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aa27dfe325 | ||
|
|
03b85aa00e | ||
|
|
e6434c24ec | ||
|
|
74efc7ffe2 | ||
|
|
52e23e7b08 | ||
|
|
b84e6d89e2 | ||
|
|
42fa435a0b | ||
|
|
873cff4474 | ||
|
|
f52bd1df3f | ||
|
|
e543599598 | ||
|
|
9d75bb1405 | ||
|
|
7b0e3269b3 | ||
|
|
12169bfb38 | ||
|
|
4dd5957f19 | ||
|
|
09942ec48f | ||
|
|
14c63c28b1 | ||
|
|
709c0dc69a | ||
|
|
b9036384d5 | ||
|
|
0fadfe0f72 | ||
|
|
621df7e296 | ||
|
|
17d72e02fe | ||
|
|
cd76660314 | ||
|
|
06a9ab785e | ||
|
|
6760546bcd | ||
|
|
b44e003ab9 | ||
|
|
6a1c907aa4 | ||
|
|
fded8cc562 | ||
|
|
43465c0e3f | ||
|
|
6b9730bf49 | ||
|
|
7fb21c35ba | ||
|
|
f6a0430a40 | ||
|
|
ab209448d1 | ||
|
|
9334b86f6e | ||
|
|
6022966d69 | ||
|
|
6c7db705c7 | ||
|
|
ce3d17de68 | ||
|
|
404d88a536 | ||
|
|
4f28f574bb | ||
|
|
4e235ddb0c | ||
|
|
654895dcff | ||
|
|
8af43a55c9 | ||
|
|
0d20ebb01f | ||
|
|
1c74b37026 | ||
|
|
6721f534cc | ||
|
|
bb3414d603 | ||
|
|
e13cb1ca92 | ||
|
|
2ee97c6395 | ||
|
|
dd1042e68b | ||
|
|
a0dffd0670 | ||
|
|
7684e6aa07 | ||
|
|
0fb752b745 | ||
|
|
c418fe3ef8 | ||
|
|
fdccc80260 | ||
|
|
84be9096b1 | ||
|
|
e4e51f0f80 | ||
|
|
7c0f296fcf | ||
|
|
11f78bc21f | ||
|
|
b84e3cdb7c | ||
|
|
e551c1c1ff | ||
|
|
9cadd991f9 | ||
|
|
9087fd8377 | ||
|
|
1aa37be676 | ||
|
|
04f63b23ff | ||
|
|
d6ed923f83 | ||
|
|
c7845118c0 | ||
|
|
ffc6adde4c | ||
|
|
fed7020da1 | ||
|
|
1a4255d9df | ||
|
|
f6ead71f0c | ||
|
|
966f60f590 | ||
|
|
9afc018a45 | ||
|
|
43608810da | ||
|
|
90b5f9050a | ||
|
|
edc10a35a1 | ||
|
|
91435fe1b2 | ||
|
|
a7ebc7e745 | ||
|
|
3cf3c1bb99 | ||
|
|
2c170f1956 | ||
|
|
ce0bddcbec | ||
|
|
98da654e02 | ||
|
|
af84105e40 | ||
|
|
9af6fc3b33 | ||
|
|
a1666704e5 | ||
|
|
7b408a33d7 | ||
|
|
9ee535066e | ||
|
|
6430150b63 | ||
|
|
16cf4ede89 | ||
|
|
efe8732188 | ||
|
|
07fc0eb03a | ||
|
|
f2b46fd148 | ||
|
|
8247133966 | ||
|
|
397fb071e5 | ||
|
|
1a9fa94cbd | ||
|
|
e8c7cc6a9b | ||
|
|
5ca3ab5966 | ||
|
|
1cf04514b3 | ||
|
|
5577ba4c7a | ||
|
|
6ff1cbf4b0 | ||
|
|
db4cd73912 | ||
|
|
3c70598aea | ||
|
|
1ec29c1c94 | ||
|
|
fedccd25b9 | ||
|
|
1e51365cad | ||
|
|
94026e4331 | ||
|
|
2084cdc6d5 | ||
|
|
1b22c3af19 | ||
|
|
3e327263c9 | ||
|
|
7c24d92613 | ||
|
|
ba808307e9 | ||
|
|
014a22e933 | ||
|
|
3f3ba9e993 | ||
|
|
2f684bba95 | ||
|
|
a287a6419f | ||
|
|
6f2aba7ee3 | ||
|
|
a9a0d4bed8 | ||
|
|
355c78e075 | ||
|
|
4623f8aff2 | ||
|
|
1265bbba2e | ||
|
|
fdccf868cc | ||
|
|
3204b5c3b4 | ||
|
|
cd02242a01 | ||
|
|
e35dc9e097 | ||
|
|
f4dc161831 | ||
|
|
1d6c27baca | ||
|
|
009df228d6 | ||
|
|
7746e494cf | ||
|
|
90a88983f1 | ||
|
|
22a4fe63db | ||
|
|
d77508f481 | ||
|
|
53321d33d5 | ||
|
|
5c28f6afd8 | ||
|
|
d49001143f | ||
|
|
513e5a7e3f | ||
|
|
6f75fab7ff | ||
|
|
38fc6d6ba1 | ||
|
|
02f2464a00 | ||
|
|
c84724da37 | ||
|
|
86b286fb0b | ||
|
|
ecef8913b1 | ||
|
|
277b202020 | ||
|
|
6ba97bc43c | ||
|
|
0fbde146a9 | ||
|
|
16e0c6f0f6 | ||
|
|
467ecf8224 | ||
|
|
8cab07a4b2 | ||
|
|
00bc8bc149 | ||
|
|
f12b55f63b | ||
|
|
3e476d7658 | ||
|
|
6cbb8a36cf | ||
|
|
7dbb08315c | ||
|
|
b1ff1bb531 | ||
|
|
8eaf4a73f4 | ||
|
|
bf1aa47854 | ||
|
|
be423b2910 | ||
|
|
3bf3bdf641 | ||
|
|
e923777eb6 | ||
|
|
cf6eb0010e | ||
|
|
5184115216 | ||
|
|
39a46e8f79 | ||
|
|
d9712cf85e | ||
|
|
9ccd62b5cb | ||
|
|
2077315f24 | ||
|
|
9bea6eddbd | ||
|
|
f4e5f7249c | ||
|
|
0691e2d9e2 | ||
|
|
8e67e0bace | ||
|
|
08864e27b2 | ||
|
|
4a3c9ccfbb | ||
|
|
cedd789a27 | ||
|
|
fd2c208612 | ||
|
|
8f91707164 | ||
|
|
37eba186f5 | ||
|
|
8f3b7158e3 | ||
|
|
b76ce836a0 | ||
|
|
fd1e415731 | ||
|
|
41c887f2bf | ||
|
|
8091d825d5 | ||
|
|
699113fb25 | ||
|
|
3996abef36 | ||
|
|
7eb2ad1e35 | ||
|
|
f49e57a38c | ||
|
|
265f4a50ef | ||
|
|
e83e2659a7 | ||
|
|
c680dd3222 | ||
|
|
96aaaf5261 | ||
|
|
efb29e6be5 | ||
|
|
a05413d925 | ||
|
|
8a8cbffd12 | ||
|
|
1fb6c63097 | ||
|
|
c312380944 | ||
|
|
b5bb2b42bf | ||
|
|
d074f375ca | ||
|
|
6fd14f0a80 | ||
|
|
d6bbb2c1b3 | ||
|
|
fa66b87965 | ||
|
|
c59d5db03e | ||
|
|
b6edc90553 | ||
|
|
23735121ff | ||
|
|
20950b698f | ||
|
|
44df85d6a4 | ||
|
|
42d53f1f6f | ||
|
|
48f2d0ff83 | ||
|
|
517723f9c1 | ||
|
|
6915077e0f | ||
|
|
406dbf333d | ||
|
|
a730dfd212 | ||
|
|
3058d365f3 | ||
|
|
ccc453e0b0 | ||
|
|
c3d02090e4 | ||
|
|
20cd7621c3 |
No files matched your search
+1
-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.c
|
w_wad.cpp
|
||||||
y_inter.c
|
y_inter.c
|
||||||
z_zone.cpp
|
z_zone.cpp
|
||||||
)
|
)
|
||||||
|
|||||||
+4
-3
@@ -269,13 +269,13 @@ endif
|
|||||||
|
|
||||||
ifdef USEASAN
|
ifdef USEASAN
|
||||||
# compile with asan
|
# compile with asan
|
||||||
opts+=-fsanitize=address
|
opts+=-O1 -fsanitize=address -fno-omit-frame-pointer -fno-common
|
||||||
libs+=-fsanitize=address
|
libs+=-fsanitize=address
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef USEUBSAN
|
ifdef USEUBSAN
|
||||||
# compile with asan
|
# compile with ubsan
|
||||||
opts+=-fsanitize=undefined
|
opts+=-O1 -fsanitize=undefined -fno-omit-frame-pointer
|
||||||
libs+=-fsanitize=undefined
|
libs+=-fsanitize=undefined
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -295,6 +295,7 @@ 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)
|
||||||
|
|||||||
+13
-12
@@ -20,7 +20,8 @@ $(foreach v,$(join $(wordlist 2,$(_n),- $(gcc_versions)),\
|
|||||||
CXXFLAGS+= -Wno-aggregate-return
|
CXXFLAGS+= -Wno-aggregate-return
|
||||||
|
|
||||||
# -W -Wno-unused
|
# -W -Wno-unused
|
||||||
WFLAGS:=-Wall -Wno-trigraphs -Wnull-dereference
|
WFLAGS:=-Wall -Wnull-dereference
|
||||||
|
#WFLAGS+=-Wno-trigraphs
|
||||||
ifdef GCC152
|
ifdef GCC152
|
||||||
WFLAGS+=-Wzero-as-null-pointer-constant
|
WFLAGS+=-Wzero-as-null-pointer-constant
|
||||||
endif
|
endif
|
||||||
@@ -31,7 +32,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
|
||||||
@@ -62,7 +63,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
|
||||||
@@ -105,14 +106,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
|
||||||
@@ -130,21 +131,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++))
|
||||||
@@ -183,6 +184,6 @@ endif
|
|||||||
# Lua
|
# Lua
|
||||||
ifdef GCC43
|
ifdef GCC43
|
||||||
ifndef GCC44
|
ifndef GCC44
|
||||||
WFLAGS+=-Wno-logical-op
|
#WFLAGS+=-Wno-logical-op
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
+39
-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_new(L, "") : luaS_newlstr(L, s, len));
|
setsvalue2s(L, L->top, (len == 0) ? luaS_newlstr(L, "", 0) : luaS_newlstr(L, s, len));
|
||||||
api_incr_top(L);
|
api_incr_top(L);
|
||||||
lua_unlock(L);
|
lua_unlock(L);
|
||||||
}
|
}
|
||||||
@@ -519,6 +519,23 @@ 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);
|
||||||
|
api_incr_top(L);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setsvalue(L, &key, str);
|
||||||
|
luaV_finishget(L, t, L->top, 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;
|
||||||
@@ -531,15 +548,8 @@ 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);
|
||||||
t = index2adr(L, idx);
|
auxgetstr(L, index2adr(L, idx), k);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -631,6 +641,25 @@ LUA_API void lua_getfenv (lua_State *L, int idx) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
static void auxsetstr (lua_State *L, TValue *t, const char *k) {
|
||||||
|
TValue key;
|
||||||
|
TValue *slot;
|
||||||
|
TString *str = luaS_new(L, k);
|
||||||
|
api_checknelems(L, 1);
|
||||||
|
api_checkvalidindex(L, t);
|
||||||
|
if (luaV_fastset(L, t, str, slot, luaH_setstr, L->top)) {
|
||||||
|
setobj2t(L, cast(TValue *, slot), L->top - 1);
|
||||||
|
L->top--; /* pop value */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setsvalue2s(L, &key, str);
|
||||||
|
luaV_finishset(L, t, &key, L->top - 1, slot);
|
||||||
|
L->top--; /* pop value */
|
||||||
|
}
|
||||||
|
lua_unlock(L);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
LUA_API void lua_settable (lua_State *L, int idx) {
|
LUA_API void lua_settable (lua_State *L, int idx) {
|
||||||
StkId t;
|
StkId t;
|
||||||
lua_lock(L);
|
lua_lock(L);
|
||||||
@@ -644,16 +673,8 @@ LUA_API void lua_settable (lua_State *L, int idx) {
|
|||||||
|
|
||||||
|
|
||||||
LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {
|
LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {
|
||||||
StkId t;
|
|
||||||
TValue key;
|
|
||||||
lua_lock(L);
|
lua_lock(L);
|
||||||
api_checknelems(L, 1);
|
auxsetstr(L, index2adr(L, idx), k);
|
||||||
t = index2adr(L, idx);
|
|
||||||
api_checkvalidindex(L, t);
|
|
||||||
setsvalue(L, &key, luaS_new(L, k));
|
|
||||||
luaV_settable(L, t, &key, L->top - 1);
|
|
||||||
L->top--; /* pop value */
|
|
||||||
lua_unlock(L);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+15
-3
@@ -20,6 +20,7 @@
|
|||||||
#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"
|
||||||
@@ -468,8 +469,19 @@ 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) {
|
||||||
luaL_addchar(B, *s++);
|
size_t space = bufffree(B);
|
||||||
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -686,6 +698,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) lua_atpanic(L, &panic);
|
if (l_likely(L)) lua_atpanic(L, &panic);
|
||||||
return L;
|
return L;
|
||||||
}
|
}
|
||||||
+25
-12
@@ -626,8 +626,20 @@ static void codenot (FuncState *fs, expdesc *e) {
|
|||||||
removevalues(fs, e->t);
|
removevalues(fs, e->t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Check whether expression 'e' is a literal string
|
||||||
|
*/
|
||||||
|
static int isKstr (FuncState *fs, expdesc *e) {
|
||||||
|
return (e->k == VK && ttisstring(&fs->f->k[e->u.s.info]));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Create expression 't[k]'. 't' must have its final result already in a
|
||||||
|
** register or upvalue. Upvalues can only be indexed by literal strings.
|
||||||
|
*/
|
||||||
void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
|
void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
|
||||||
|
if (t->k == VUPVAL && !isKstr(fs, k)) /* upvalue indexed by non string? */
|
||||||
|
luaK_exp2anyreg(fs, t); /* put it in a register */
|
||||||
t->u.s.aux = luaK_exp2RK(fs, k);
|
t->u.s.aux = luaK_exp2RK(fs, k);
|
||||||
t->k = VINDEXED;
|
t->k = VINDEXED;
|
||||||
}
|
}
|
||||||
@@ -790,18 +802,19 @@ 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: codearith(fs, OP_ADD, e1, e2); break;
|
case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV:
|
||||||
case OPR_SUB: codearith(fs, OP_SUB, e1, e2); break;
|
case OPR_MOD: case OPR_POW: {
|
||||||
case OPR_MUL: codearith(fs, OP_MUL, e1, e2); break;
|
codearith(fs, op - OPR_ADD + OP_ADD, e1, e2);
|
||||||
case OPR_DIV: codearith(fs, OP_DIV, e1, e2); break;
|
break;
|
||||||
case OPR_MOD: codearith(fs, OP_MOD, e1, e2); break;
|
}
|
||||||
case OPR_POW: codearith(fs, OP_POW, e1, e2); break;
|
case OPR_EQ: case OPR_LT: case OPR_LE: {
|
||||||
case OPR_EQ: codecomp(fs, OP_EQ, 1, e1, e2); break;
|
codecomp(fs, op - OPR_EQ + OP_EQ, 1, e1, e2);
|
||||||
case OPR_NE: codecomp(fs, OP_EQ, 0, e1, e2); break;
|
break;
|
||||||
case OPR_LT: codecomp(fs, OP_LT, 1, e1, e2); break;
|
}
|
||||||
case OPR_LE: codecomp(fs, OP_LE, 1, e1, e2); break;
|
case OPR_NE: case OPR_GT: case OPR_GE: {
|
||||||
case OPR_GT: codecomp(fs, OP_LT, 0, e1, e2); break;
|
codecomp(fs, op - OPR_NE + OP_EQ, 0, e1, e2);
|
||||||
case OPR_GE: codecomp(fs, OP_LE, 0, e1, e2); break;
|
break;
|
||||||
|
}
|
||||||
default: lua_assert(0);
|
default: lua_assert(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -21,13 +21,13 @@
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** grep "ORDER OPR" if you change these enums
|
** grep "ORDER OPR" if you change these enums (ORDER OP)
|
||||||
*/
|
*/
|
||||||
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_NE, OPR_EQ,
|
OPR_EQ, OPR_LT, OPR_LE,
|
||||||
OPR_LT, OPR_LE, OPR_GT, OPR_GE,
|
OPR_NE, 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,
|
||||||
|
|||||||
+28
-5
@@ -542,16 +542,39 @@ 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)];
|
||||||
if (GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL ||
|
switch (GET_OPCODE(i)) {
|
||||||
GET_OPCODE(i) == OP_TFORLOOP)
|
case OP_CALL:
|
||||||
return getobjname(L, ci, GETARG_A(i), name);
|
case OP_TAILCALL:
|
||||||
else
|
case OP_TFORLOOP:
|
||||||
return NULL; /* no useful name can be found */
|
return getobjname(L, ci, GETARG_A(i), name);
|
||||||
|
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";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -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 (l_likely(n <= L->stacksize)) /* double size is enough? */
|
if (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->hookmask & LUA_MASKCALL)
|
if (l_unlikely(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 */
|
||||||
|
|||||||
+10
-9
@@ -356,20 +356,21 @@ 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 rlen; /* how much to read */
|
size_t tbr = n; /* number of chars to be read */
|
||||||
size_t nr; /* number of chars actually read */
|
size_t rlen; /* how much to read in each cycle */
|
||||||
|
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 > n) rlen = n; /* cannot read more than asked */
|
if (rlen > tbr) rlen = tbr; /* 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);
|
||||||
n -= nr; /* still have to read `n' chars */
|
tbr -= nr; /* still have to read 'tbr' chars */
|
||||||
} while (n > 0 && nr == rlen); /* until end of count or eof */
|
} while (tbr > 0 && nr == rlen); /* until end of count or eof */
|
||||||
luaL_pushresult(&b); /* close buffer */
|
luaL_pushresult(&b); /* close buffer */
|
||||||
return (n == 0 || lua_objlen(L, -1) > 0);
|
return (tbr == 0 || tbr < n); /* true iff read something */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -432,13 +433,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 sucess;
|
int success;
|
||||||
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");
|
||||||
sucess = read_line(L, f);
|
success = 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 (sucess) return 1;
|
if (success) 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);
|
||||||
|
|||||||
@@ -232,6 +232,8 @@ OP_VARARG/* A B R(A), R(A+1), ..., R(A+B-1) = vararg */
|
|||||||
(*) In OP_SETLIST, if (B == 0) then B = `top';
|
(*) In OP_SETLIST, if (B == 0) then B = `top';
|
||||||
if (C == 0) then next `instruction' is real C
|
if (C == 0) then next `instruction' is real C
|
||||||
|
|
||||||
|
(*) In OP_SELF, the index must be a string.
|
||||||
|
|
||||||
(*) For comparisons, A specifies what condition the test should accept
|
(*) For comparisons, A specifies what condition the test should accept
|
||||||
(true or false).
|
(true or false).
|
||||||
|
|
||||||
|
|||||||
+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}, /* power and concat (right associative) */
|
{10, 9}, {5, 4}, /* ^, .. (right associative) */
|
||||||
{3, 3}, {3, 3}, /* equality and inequality */
|
{3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */
|
||||||
{3, 3}, {3, 3}, {3, 3}, {3, 3}, /* order */
|
{3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */
|
||||||
{2, 2}, {1, 1} /* logical (and/or) */
|
{2, 2}, {1, 1} /* 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 */
|
||||||
};
|
};
|
||||||
|
|||||||
+58
-4
@@ -51,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+1 > (MAX_SIZET - sizeof(TString))/sizeof(char))
|
if (l_unlikely(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;
|
||||||
@@ -72,18 +72,72 @@ static TString *newlstr (lua_State *L, const char *str, size_t l,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
|
// string hash taken from luaJIT
|
||||||
GCObject *o;
|
|
||||||
|
/* 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
|
||||||
|
}
|
||||||
|
|
||||||
|
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 (l_unlikely(ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0))) {
|
if (ts->tsv.hash == h &&
|
||||||
|
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;
|
||||||
|
|||||||
+135
-51
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* limit for table tag-method chains (to avoid loops) */
|
/* limit for table tag-method chains (to avoid infinite loops) */
|
||||||
#define MAXTAGLOOP 100
|
#define MAXTAGLOOP 100
|
||||||
|
|
||||||
|
|
||||||
@@ -105,57 +105,88 @@ static void callTM (lua_State *L, const TValue *f, const TValue *p1,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void luaV_gettable (lua_State *L, TValue *t, TValue *key, StkId val) {
|
/*
|
||||||
int loop;
|
** Finish the table access 'val = t[key]'.
|
||||||
|
** 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++) {
|
||||||
TValue *tm;
|
if (slot == NULL) { /* 't' is not a table? */
|
||||||
if (ttistable(t)) { /* `t' is a table? */
|
lua_assert(!ttistable(t));
|
||||||
Table *h = hvalue(t);
|
tm = luaT_gettmbyobj(L, t, TM_INDEX);
|
||||||
const TValue *res = luaH_get(h, key); /* do a primitive get */
|
if (l_unlikely(ttisnil(tm)))
|
||||||
if (!ttisnil(res) || /* result is no nil? */
|
luaG_typeerror(L, t, "index"); /* no metamethod */
|
||||||
(tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */
|
/* else will try the metamethod */
|
||||||
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 tag method */
|
/* else will try the metamethod */
|
||||||
}
|
}
|
||||||
else if (l_unlikely(ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))))
|
if (ttisfunction(tm)) { /* is metamethod a function? */
|
||||||
luaG_typeerror(L, t, "index");
|
callTMres(L, val, tm, t, key); /* call it */
|
||||||
if (ttisfunction(tm)) {
|
|
||||||
callTMres(L, val, tm, t, key);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
t = tm; /* else repeat with `tm' */
|
t = tm; /* else try to access 'tm[key]' */
|
||||||
|
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, "'__index' chain too long; possible loop");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void luaV_settable (lua_State *L, TValue *t, TValue *key, StkId val) {
|
/*
|
||||||
int loop;
|
** Finish a table assignment 't[key] = val'.
|
||||||
|
** If 'slot' is NULL, 't' is not a table. Otherwise, 'slot' points
|
||||||
|
** to the entry 't[key]', or to 'luaO_nilobject' if there is no such
|
||||||
|
** entry. (The value at 'slot' must be nil, otherwise 'luaV_fastset'
|
||||||
|
** would have done the job.)
|
||||||
|
*/
|
||||||
|
void luaV_finishset (lua_State *L, TValue *t, TValue *key,
|
||||||
|
StkId val, TValue *slot) {
|
||||||
|
int loop; /* counter to avoid infinite loops */
|
||||||
for (loop = 0; loop < MAXTAGLOOP; loop++) {
|
for (loop = 0; loop < MAXTAGLOOP; loop++) {
|
||||||
TValue *tm = NULL;
|
TValue *tm;
|
||||||
if (ttistable(t)) { /* `t' is a table? */
|
if (slot != NULL) {
|
||||||
|
lua_assert(ttistable(t) && ttisnil(slot));
|
||||||
Table *h = hvalue(t);
|
Table *h = hvalue(t);
|
||||||
TValue *oldval = luaH_set(L, h, key); /* do a primitive set */
|
/* must check the metamethod */
|
||||||
/* oldval is nil=> look for newindex, oldval is not nil => look for usedindex */
|
/* slot is nil=> look for newindex, slot is not nil => look for usedindex */
|
||||||
if (!((ttisnil(oldval) && ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) != NULL)) ||
|
if (!((ttisnil(slot) && ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) != NULL)) ||
|
||||||
((!ttisnil(oldval)) && ((tm = fasttm(L, h->metatable, TM_USEDINDEX)) != NULL)))) {
|
((!ttisnil(slot)) && ((tm = fasttm(L, h->metatable, TM_USEDINDEX)) != NULL)))) {
|
||||||
setobj2t(L, oldval, val);
|
/* no metamethod and (now) there is an entry with given key */
|
||||||
|
setobj2t(L, cast(TValue *, slot), val);
|
||||||
luaC_barriert(L, h, val);
|
luaC_barriert(L, h, val);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* else will try the tag method */
|
/* else will try the metamethod */
|
||||||
}
|
}
|
||||||
else if (l_unlikely(ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))))
|
else { /* not a table; check metamethod */
|
||||||
luaG_typeerror(L, t, "index");
|
if (l_unlikely(ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))))
|
||||||
|
luaG_typeerror(L, t, "index");
|
||||||
|
}
|
||||||
|
/* try the metamethod */
|
||||||
if (ttisfunction(tm)) {
|
if (ttisfunction(tm)) {
|
||||||
callTM(L, tm, t, key, val);
|
callTM(L, tm, t, key, val);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
t = tm; /* else repeat with `tm' */
|
t = tm; /* else repeat assignment over 'tm' */
|
||||||
|
if (luaV_fastset(L, t, key, slot, luaH_set, val))
|
||||||
|
return; /* done */
|
||||||
|
/* else loop */
|
||||||
}
|
}
|
||||||
luaG_runerror(L, "loop in settable");
|
luaG_runerror(L, "settable chain too long; possible loop");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -366,6 +397,7 @@ 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)) { \
|
||||||
@@ -377,6 +409,21 @@ 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)); }
|
||||||
|
|
||||||
|
|
||||||
|
/* same for 'luaV_settable' */
|
||||||
|
#define settableProtected(L,t,k,v) { TValue *slot; \
|
||||||
|
if (!luaV_fastset(L,t,k,slot,luaH_set,v)) \
|
||||||
|
Protect(luaV_finishset(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;
|
||||||
@@ -386,13 +433,12 @@ 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;
|
cl = &clvalue(L->ci->func)->l; /* local reference to function's closure */
|
||||||
base = L->base;
|
k = cl->p->k; /* local reference to function's constant table */
|
||||||
k = cl->p->k;
|
base = L->base; /* local copy of function's base */
|
||||||
/* 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);
|
||||||
@@ -402,26 +448,28 @@ 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--);
|
||||||
@@ -429,11 +477,13 @@ 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);
|
||||||
@@ -442,10 +492,14 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
case OP_GETTABLE: {
|
case OP_GETTABLE: {
|
||||||
Protect(luaV_gettable(L, RB(i), RKC(i), ra));
|
StkId ra = RA(i);
|
||||||
|
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)));
|
||||||
@@ -453,16 +507,21 @@ 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: {
|
||||||
Protect(luaV_settable(L, ra, RKB(i), RKC(i)));
|
StkId ra = RA(i);
|
||||||
|
TValue *rb = RKB(i);
|
||||||
|
TValue *rc = RKC(i);
|
||||||
|
settableProtected(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)));
|
||||||
@@ -470,9 +529,16 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
case OP_SELF: {
|
case OP_SELF: {
|
||||||
|
TValue *slot;
|
||||||
|
StkId ra = RA(i);
|
||||||
StkId rb = RB(i);
|
StkId rb = RB(i);
|
||||||
setobjs2s(L, ra+1, rb);
|
TValue *rc = RKC(i);
|
||||||
Protect(luaV_gettable(L, rb, RKC(i), ra));
|
TString *key = rawtsvalue(rc); /* key must be a string */
|
||||||
|
setobjs2s(L, ra + 1, rb);
|
||||||
|
if (luaV_fastget(L, rb, key, slot, luaH_getstr)) {
|
||||||
|
setobj2s(L, ra, slot);
|
||||||
|
}
|
||||||
|
else Protect(luaV_finishget(L, rb, rc, ra, slot));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
case OP_ADD: {
|
case OP_ADD: {
|
||||||
@@ -488,6 +554,7 @@ 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)) {
|
||||||
@@ -503,6 +570,7 @@ 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)) {
|
||||||
@@ -522,26 +590,27 @@ 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);
|
||||||
@@ -553,6 +622,7 @@ 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);
|
||||||
@@ -564,11 +634,13 @@ 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: {
|
||||||
@@ -626,12 +698,14 @@ 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);
|
||||||
@@ -641,6 +715,7 @@ 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 */
|
||||||
@@ -662,6 +737,7 @@ 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;
|
||||||
@@ -694,6 +770,7 @@ 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);
|
||||||
@@ -709,6 +786,7 @@ 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);
|
||||||
@@ -721,6 +799,7 @@ 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;
|
||||||
@@ -737,6 +816,7 @@ 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);
|
||||||
@@ -753,6 +833,7 @@ 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;
|
||||||
@@ -775,10 +856,12 @@ 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;
|
||||||
@@ -799,6 +882,7 @@ 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;
|
||||||
|
|||||||
+52
-4
@@ -22,14 +22,62 @@
|
|||||||
(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); }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Fast track for set table. If 't' is a table and 't[k]' is not nil,
|
||||||
|
** call GC barrier, do a raw 't[k]=v', and return true; otherwise,
|
||||||
|
** return false with 'slot' equal to NULL (if 't' is not a table) or
|
||||||
|
** 'nil'. (This is needed by 'luaV_finishget'.) Note that, if the macro
|
||||||
|
** returns true, there is no need to 'invalidateTMcache', because the
|
||||||
|
** call is not creating a new entry.
|
||||||
|
*/
|
||||||
|
#define luaV_fastset(L,t,k,slot,f,v) \
|
||||||
|
(!ttistable(t) \
|
||||||
|
? (slot = NULL, 0) \
|
||||||
|
: (slot = f(L, hvalue(t), k), \
|
||||||
|
ttisnil(slot) ? 0 \
|
||||||
|
: (__extension__ ({ \
|
||||||
|
if (valiswhite(v) && isblack(obj2gco(hvalue(t)))) \
|
||||||
|
luaC_barrierback(L, hvalue(t)); \
|
||||||
|
setobj2t(L, cast(TValue *,slot), v); \
|
||||||
|
1; \
|
||||||
|
}))))
|
||||||
|
|
||||||
|
|
||||||
|
#define luaV_settable(L,t,k,v) { TValue *slot; \
|
||||||
|
if (!luaV_fastset(L,t,k,slot,luaH_set,v)) \
|
||||||
|
luaV_finishset(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_gettable (lua_State *L, TValue *t, TValue *key,
|
LUAI_FUNC void luaV_finishget (lua_State *L, TValue *t, TValue *key,
|
||||||
StkId val);
|
StkId val, TValue *tm);
|
||||||
LUAI_FUNC void luaV_settable (lua_State *L, TValue *t, TValue *key,
|
LUAI_FUNC void luaV_finishset (lua_State *L, TValue *t, TValue *key,
|
||||||
StkId val);
|
StkId val, TValue *oldval);
|
||||||
LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls);
|
LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls);
|
||||||
LUAI_FUNC void luaV_concat (lua_State *L, int total, int last);
|
LUAI_FUNC void luaV_concat (lua_State *L, int total, int last);
|
||||||
|
|
||||||
|
|||||||
+66
-4
@@ -1165,6 +1165,39 @@ void VS_Print(vsbuf_t *buf, const char *data)
|
|||||||
//
|
//
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
|
|
||||||
|
#define NAME cvar_map_t
|
||||||
|
#define KEY_TY const char *
|
||||||
|
#define VAL_TY consvar_t *
|
||||||
|
#define HASH_FN vt_hash_string
|
||||||
|
#define CMPR_FN vt_cmpr_string
|
||||||
|
#include "verstable.h"
|
||||||
|
|
||||||
|
#define NAME netvar_map_t
|
||||||
|
#define KEY_TY UINT16
|
||||||
|
#define VAL_TY consvar_t *
|
||||||
|
#define HASH_FN vt_hash_integer
|
||||||
|
#define CMPR_FN vt_cmpr_integer
|
||||||
|
#include "verstable.h"
|
||||||
|
|
||||||
|
static cvar_map_t cvar_map;
|
||||||
|
static netvar_map_t netvar_map;
|
||||||
|
|
||||||
|
CONSTRUCTOR static void CV_InitMap(void)
|
||||||
|
{
|
||||||
|
// ensure the map is initialized
|
||||||
|
cvar_map_t_init(&cvar_map);
|
||||||
|
cvar_map_t_reserve(&cvar_map, 512);
|
||||||
|
|
||||||
|
netvar_map_t_init(&netvar_map);
|
||||||
|
netvar_map_t_reserve(&netvar_map, 256);
|
||||||
|
}
|
||||||
|
|
||||||
|
DESTRUCTOR static void CV_DestroyMap(void)
|
||||||
|
{
|
||||||
|
cvar_map_t_cleanup(&cvar_map);
|
||||||
|
netvar_map_t_cleanup(&netvar_map);
|
||||||
|
}
|
||||||
|
|
||||||
static const char *cv_null_string = "";
|
static const char *cv_null_string = "";
|
||||||
|
|
||||||
/** Searches if a variable has been registered.
|
/** Searches if a variable has been registered.
|
||||||
@@ -1175,11 +1208,17 @@ static const char *cv_null_string = "";
|
|||||||
*/
|
*/
|
||||||
consvar_t *CV_FindVar(const char *name)
|
consvar_t *CV_FindVar(const char *name)
|
||||||
{
|
{
|
||||||
consvar_t *cvar;
|
cvar_map_t_itr it = cvar_map_t_get(&cvar_map, name);
|
||||||
|
if (!cvar_map_t_is_end(it))
|
||||||
|
return it.data->val;
|
||||||
|
|
||||||
|
// fallback linear search
|
||||||
|
/*
|
||||||
|
consvar_t *cvar;
|
||||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
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;
|
||||||
}
|
}
|
||||||
@@ -1194,7 +1233,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 UINT16 premiers[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};
|
static const UINT16 premiers[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};
|
||||||
|
|
||||||
while (*s)
|
while (*s)
|
||||||
{
|
{
|
||||||
@@ -1213,11 +1252,17 @@ 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;
|
||||||
@@ -1283,6 +1328,11 @@ 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.
|
||||||
@@ -1588,9 +1638,21 @@ 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--)
|
||||||
@@ -1793,7 +1855,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 && !mapheaderinfo[newvalue])
|
if (newvalue >= 0 && newvalue < NUMMAPS && !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));
|
||||||
|
|||||||
+31
-69
@@ -46,16 +46,16 @@
|
|||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_mutex con_mutex;
|
I_mutex con_mutex;
|
||||||
|
|
||||||
// g_in_exiting_signal_handler is an evil hack
|
// I_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 (!g_in_exiting_signal_handler) { I_lock_mutex(&con_mutex); }
|
# define Lock_state() if (!I_In_Exiting_Signal_Handler()) { I_lock_mutex(&con_mutex); }
|
||||||
# define Unlock_state() if (!g_in_exiting_signal_handler) { I_unlock_mutex(con_mutex); }
|
# define Unlock_state() if (!I_In_Exiting_Signal_Handler()) { I_unlock_mutex(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
|
||||||
@@ -638,68 +638,28 @@ INT32 CON_ShiftChar(INT32 ch)
|
|||||||
if (I_UseNativeKeyboard())
|
if (I_UseNativeKeyboard())
|
||||||
return ch;
|
return ch;
|
||||||
|
|
||||||
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
|
|
||||||
{
|
|
||||||
if (cv_keyboardlayout.value == 3)
|
|
||||||
{
|
|
||||||
if (shiftdown ^ capslock)
|
|
||||||
ch = shiftxform[ch];
|
|
||||||
else if (altdown & 0x2)
|
|
||||||
ch = french_altgrxform[ch];
|
|
||||||
else
|
|
||||||
ch = HU_FallBackFrSpecialLetter(ch);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (shiftdown ^ capslock)
|
|
||||||
ch = shiftxform[ch];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // if we're holding shift we should still shift non letter symbols
|
|
||||||
{
|
|
||||||
if (cv_keyboardlayout.value == 3)
|
|
||||||
{
|
|
||||||
if (shiftdown)
|
|
||||||
ch = shiftxform[ch];
|
|
||||||
else if (altdown & 0x2)
|
|
||||||
ch = french_altgrxform[ch];
|
|
||||||
else
|
|
||||||
ch = HU_FallBackFrSpecialLetter(ch);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (shiftdown)
|
|
||||||
ch = shiftxform[ch];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ch;
|
|
||||||
}
|
|
||||||
|
|
||||||
INT32 CON_ShitAndAltGrChar(INT32 ch)
|
|
||||||
{
|
|
||||||
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
|
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
|
||||||
{
|
{
|
||||||
if (shiftdown ^ capslock)
|
if (shiftdown ^ capslock)
|
||||||
ch = shiftxform[ch];
|
ch = shiftxform[ch];
|
||||||
}
|
}
|
||||||
else // if we're holding shift we should still shift non letter symbols
|
else // if we're holding shift we should still shift non letter symbols
|
||||||
{
|
{
|
||||||
if (shiftdown)
|
if (shiftdown)
|
||||||
ch = shiftxform[ch];
|
ch = shiftxform[ch];
|
||||||
else if (altdown & 0x2)
|
else if (cv_keyboardlayout.value == 3)
|
||||||
{
|
{
|
||||||
ch = french_altgrxform[ch];
|
if (altdown & 0x2)
|
||||||
}
|
ch = french_altgrxform[ch];
|
||||||
else
|
else
|
||||||
{
|
ch = HU_FallBackFrSpecialLetter(ch);
|
||||||
ch = HU_FallBackFrSpecialLetter(ch);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ch;
|
return ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Clear time of console heads up messages
|
// Clear time of console heads up messages
|
||||||
//
|
//
|
||||||
void CON_ClearHUD(void)
|
void CON_ClearHUD(void)
|
||||||
@@ -892,7 +852,7 @@ boolean CON_Responder(event_t *ev)
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
// ctrl modifier -- changes behavior, adds shortcuts
|
// ctrl modifier -- changes behavior, adds shortcuts
|
||||||
if ((cv_keyboardlayout.value != 3 && ctrldown) || (cv_keyboardlayout.value == 3 && ctrldown && !altdown))
|
if (ctrldown && (cv_keyboardlayout.value != 3 || !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)
|
||||||
@@ -1222,19 +1182,10 @@ void CON_LogMessage(const char *msg)
|
|||||||
// Console print! Wahooo! Lots o fun!
|
// Console print! Wahooo! Lots o fun!
|
||||||
//
|
//
|
||||||
|
|
||||||
void CONS_Printf(const char *fmt, ...)
|
static inline void CONS_PrintMsg(char *txt)
|
||||||
{
|
{
|
||||||
va_list argptr;
|
|
||||||
static char *txt = NULL;
|
|
||||||
boolean startup;
|
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);
|
||||||
|
|
||||||
@@ -1260,6 +1211,21 @@ void CONS_Printf(const char *fmt, ...)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CONS_Printf(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list argptr;
|
||||||
|
static char *txt = NULL;
|
||||||
|
|
||||||
|
if (txt == NULL)
|
||||||
|
txt = malloc(8192);
|
||||||
|
|
||||||
|
va_start(argptr, fmt);
|
||||||
|
vsnprintf(txt, 8192, fmt, argptr);
|
||||||
|
va_end(argptr);
|
||||||
|
|
||||||
|
CONS_PrintMsg(txt);
|
||||||
|
}
|
||||||
|
|
||||||
void CONS_Alert(alerttype_t level, const char *fmt, ...)
|
void CONS_Alert(alerttype_t level, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list argptr;
|
va_list argptr;
|
||||||
@@ -1288,9 +1254,7 @@ void CONS_Alert(alerttype_t level, const char *fmt, ...)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// I am lazy and I feel like just letting CONS_Printf take care of things.
|
CONS_PrintMsg(txt);
|
||||||
// Is that okay?
|
|
||||||
CONS_Printf("%s", txt);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CONS_Debug(INT32 debugflags, const char *fmt, ...)
|
void CONS_Debug(INT32 debugflags, const char *fmt, ...)
|
||||||
@@ -1308,11 +1272,9 @@ void CONS_Debug(INT32 debugflags, const char *fmt, ...)
|
|||||||
vsnprintf(txt, 8192, fmt, argptr);
|
vsnprintf(txt, 8192, fmt, argptr);
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
|
|
||||||
// Again I am lazy, oh well
|
CONS_PrintMsg(txt);
|
||||||
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
|
||||||
//
|
//
|
||||||
|
|||||||
+8
-1
@@ -13,6 +13,10 @@
|
|||||||
#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"
|
||||||
@@ -45,7 +49,6 @@ 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
|
||||||
@@ -63,4 +66,8 @@ boolean CON_Ready(void);
|
|||||||
|
|
||||||
void CON_LogMessage(const char *msg);
|
void CON_LogMessage(const char *msg);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // extern "C"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
+479
-348
File diff suppressed because it is too large.
Load diff
+7
-3
@@ -600,6 +600,8 @@ 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);
|
||||||
@@ -654,15 +656,17 @@ void D_ResetTiccmds(void);
|
|||||||
|
|
||||||
tic_t GetLag(INT32 node);
|
tic_t GetLag(INT32 node);
|
||||||
|
|
||||||
extern UINT8 hu_resynching;
|
extern boolean hu_resynching;
|
||||||
#ifdef SATURNPAK
|
#ifdef SATURNPAK
|
||||||
extern UINT8 hu_redownloadinggamestate;
|
extern boolean 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[(768*1024)];
|
UINT8 savebuffer[SAVEGAMESIZE];
|
||||||
tic_t leveltime;
|
tic_t leveltime;
|
||||||
size_t demopos;
|
size_t demopos;
|
||||||
|
|
||||||
|
|||||||
+73
-55
@@ -130,8 +130,8 @@ 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 autoloadcount = 0;
|
static size_t autoloadwadcount = 0;
|
||||||
static size_t postloadcount = 0;
|
static size_t postloadwadcount = 0;
|
||||||
//
|
//
|
||||||
|
|
||||||
boolean devparm = false; // started game with -devparm
|
boolean devparm = false; // started game with -devparm
|
||||||
@@ -274,21 +274,17 @@ static void D_Renderview(void)
|
|||||||
|
|
||||||
R_ApplyLevelInterpolators(R_GetTimeFrac(RTF_LEVEL));
|
R_ApplyLevelInterpolators(R_GetTimeFrac(RTF_LEVEL));
|
||||||
|
|
||||||
if (rendermode == render_soft)
|
if (rendermode == render_soft && cv_homremoval.value)
|
||||||
{
|
{
|
||||||
// if this is display player 1
|
if (cv_homremoval.value == 1)
|
||||||
if (cv_homremoval.value)
|
|
||||||
{
|
{
|
||||||
if (cv_homremoval.value == 1)
|
// Clear the software screen buffer to remove HOM
|
||||||
{
|
memset(vid.screens[0], 31, vid.width * vid.height);
|
||||||
// Clear the software screen buffer to remove HOM
|
}
|
||||||
memset(vid.screens[0], 31, vid.width * vid.height);
|
else if (cv_homremoval.value == 2)
|
||||||
}
|
{
|
||||||
else if (cv_homremoval.value == 2)
|
//'development' HOM removal -- makes it blindingly obvious if HOM is spotted.
|
||||||
{
|
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,7 +318,6 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,19 +328,17 @@ 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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -704,6 +697,11 @@ void D_SRB2Loop(void)
|
|||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
|
if (I_Interrupted())
|
||||||
|
{
|
||||||
|
I_Quit();
|
||||||
|
}
|
||||||
|
|
||||||
// capbudget is the minimum precise_t duration of a single loop iteration
|
// capbudget is the minimum precise_t duration of a single loop iteration
|
||||||
precise_t capbudget;
|
precise_t capbudget;
|
||||||
precise_t elapsed;
|
precise_t elapsed;
|
||||||
@@ -783,11 +781,6 @@ void D_SRB2Loop(void)
|
|||||||
|
|
||||||
doDisplay = true;
|
doDisplay = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dedicated)
|
|
||||||
{
|
|
||||||
G_DeviceLEDTick();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (interp)
|
if (interp)
|
||||||
@@ -829,6 +822,13 @@ 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
|
||||||
|
|
||||||
@@ -1037,25 +1037,38 @@ 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("No more free memory to AutoloadFile %s",file);
|
I_Error("D_AutoloadFile: No more free memory to autoload file %s", file);
|
||||||
|
|
||||||
strcpy(newfile, file);
|
strcpy(newfile, file);
|
||||||
filearray[index] = newfile;
|
filearray[*index] = newfile;
|
||||||
|
(*index)++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1098,7 +1111,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
|
||||||
{
|
{
|
||||||
autoloadcount = postloadcount = 0; // so D_AddAutoloadFiles can skip everything since nothings there to autoload
|
autoloadwadcount = postloadwadcount = 0; // so D_AddAutoloadFiles can skip everything since nothings there to autoload
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1124,27 +1137,34 @@ 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("forcing postload for file %s\n", wadsToAutoload);
|
CONS_Printf("Autoload: forcing postload for file %s\n", wadsToAutoload);
|
||||||
postload = true;
|
postload = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// LOAD IT
|
// LOAD IT
|
||||||
if (!postload)
|
if (!postload)
|
||||||
{
|
{
|
||||||
D_AutoloadFile(wadsToAutoload, autoloadwadfiles, autoloadcount);
|
D_AutoloadFile(wadsToAutoload, autoloadwadfiles, &autoloadwadcount);
|
||||||
autoloadcount++;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
D_AutoloadFile(wadsToAutoload, autoloadwadfilespost, postloadcount);
|
D_AutoloadFile(wadsToAutoload, autoloadwadfilespost, &postloadwadcount);
|
||||||
postloadcount++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
autoloadwadfiles[autoloadcount] = NULL;
|
autoloadwadfiles[autoloadwadcount] = NULL;
|
||||||
autoloadwadfilespost[postloadcount] = NULL;
|
autoloadwadfilespost[postloadwadcount] = NULL;
|
||||||
|
|
||||||
// we dont want memory leaks around here do we?
|
// we dont want memory leaks around here do we?
|
||||||
fclose(autoloadconfigfile);
|
fclose(autoloadconfigfile);
|
||||||
@@ -1153,7 +1173,7 @@ static void D_FindAddonsToAutoload(void)
|
|||||||
static void D_AddAutoloadFiles(void)
|
static void D_AddAutoloadFiles(void)
|
||||||
{
|
{
|
||||||
// nothing to autoload
|
// nothing to autoload
|
||||||
if (autoloadcount == 0)
|
if (autoloadwadcount == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CONS_Printf("D_AutoloadFile(): Loading autoloaded addons...\n");
|
CONS_Printf("D_AutoloadFile(): Loading autoloaded addons...\n");
|
||||||
@@ -1161,15 +1181,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, autoloadcount);
|
D_CleanFile(autoloadwadfiles, autoloadwadcount);
|
||||||
|
|
||||||
autoloadcount = 0;
|
autoloadwadcount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void D_AddPostloadFiles(void)
|
void D_AddPostloadFiles(void)
|
||||||
{
|
{
|
||||||
// nothing to postload
|
// nothing to postload
|
||||||
if (postloadcount == 0 || !netgame)
|
if (postloadwadcount == 0 || !netgame)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CONS_Printf("D_AddPostloadFiles(): Loading postloaded addons...\n");
|
CONS_Printf("D_AddPostloadFiles(): Loading postloaded addons...\n");
|
||||||
@@ -1177,9 +1197,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, postloadcount);
|
D_CleanFile(autoloadwadfilespost, postloadwadcount);
|
||||||
|
|
||||||
postloadcount = 0;
|
postloadwadcount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
@@ -1188,7 +1208,7 @@ void D_AddPostloadFiles(void)
|
|||||||
|
|
||||||
static boolean AddIWAD(const char * file, const char *dir)
|
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))
|
||||||
{
|
{
|
||||||
@@ -1643,12 +1663,6 @@ 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"));
|
||||||
|
|
||||||
@@ -2029,9 +2043,13 @@ 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 (!replayname || !replayurl)
|
if (!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/"
|
||||||
|
|||||||
+1
-5
@@ -612,12 +612,8 @@ void Net_WaitAllAckReceived(UINT32 timeout)
|
|||||||
|
|
||||||
static void InitNode(node_t *node)
|
static void InitNode(node_t *node)
|
||||||
{
|
{
|
||||||
node->acktosend_head = node->acktosend_tail = 0;
|
memset(node, 0, sizeof(node_t));
|
||||||
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)
|
||||||
|
|||||||
+146
-483
@@ -900,6 +900,7 @@ void D_RegisterClientCommands(void)
|
|||||||
CV_RegisterVar(&cv_mindelay);
|
CV_RegisterVar(&cv_mindelay);
|
||||||
CV_RegisterVar(&cv_gentlemens);
|
CV_RegisterVar(&cv_gentlemens);
|
||||||
CV_RegisterVar(&cv_serverinfoscreen);
|
CV_RegisterVar(&cv_serverinfoscreen);
|
||||||
|
CV_RegisterVar(&cv_serveraddoninfo);
|
||||||
|
|
||||||
#ifdef NETGAME_DEVMODE
|
#ifdef NETGAME_DEVMODE
|
||||||
CV_RegisterVar(&cv_fishcake);
|
CV_RegisterVar(&cv_fishcake);
|
||||||
@@ -1208,11 +1209,11 @@ static boolean AllowedPlayerNameChar(char ch)
|
|||||||
|
|
||||||
static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
|
static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
|
||||||
{
|
{
|
||||||
INT32 ix;
|
size_t ix, len = strlen(name);
|
||||||
|
|
||||||
if (strlen(name) == 0 || strlen(name) > MAXPLAYERNAME)
|
if (len == 0 || len > MAXPLAYERNAME)
|
||||||
return false; // Empty or too long.
|
return false; // Empty or too long.
|
||||||
if (name[0] == ' ' || name[strlen(name)-1] == ' ')
|
if (name[0] == ' ' || name[len-1] == ' ')
|
||||||
return false; // Starts or ends with a space.
|
return false; // Starts or ends with a space.
|
||||||
if (isdigit(name[0]))
|
if (isdigit(name[0]))
|
||||||
return false; // Starts with a digit.
|
return false; // Starts with a digit.
|
||||||
@@ -1226,20 +1227,19 @@ static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
|
|||||||
|
|
||||||
// Also, anything over 0x80 is disallowed too, since compilers love to
|
// Also, anything over 0x80 is disallowed too, since compilers love to
|
||||||
// differ on whether they're printable characters or not.
|
// differ on whether they're printable characters or not.
|
||||||
for (ix = 0; name[ix] != '\0'; ix++)
|
for (ix = 0; ix < len; ix++)
|
||||||
if (!AllowedPlayerNameChar(name[ix]))
|
if (!AllowedPlayerNameChar(name[ix]))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Check if a player is currently using the name, case-insensitively.
|
// Check if a player is currently using the name, case-insensitively.
|
||||||
for (ix = 0; ix < MAXPLAYERS; ix++)
|
for (ix = 0; ix < MAXPLAYERS; ix++)
|
||||||
{
|
{
|
||||||
if (ix != playernum && playeringame[ix]
|
if (ix != (size_t)playernum && playeringame[ix]
|
||||||
&& fasticmp(name, player_names[ix]))
|
&& fasticmp(name, player_names[ix]))
|
||||||
{
|
{
|
||||||
// We shouldn't kick people out just because
|
// We shouldn't kick people out just because
|
||||||
// they joined the game with the same name
|
// they joined the game with the same name
|
||||||
// as someone else -- modify the name instead.
|
// as someone else -- modify the name instead.
|
||||||
size_t len = strlen(name);
|
|
||||||
|
|
||||||
// Recursion!
|
// Recursion!
|
||||||
// Slowly strip characters off the end of the
|
// Slowly strip characters off the end of the
|
||||||
@@ -1458,7 +1458,9 @@ UINT8 CanChangeSkin(INT32 playernum)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (players[playernum].spectator || players[playernum].playerstate == PST_DEAD || players[playernum].playerstate == PST_REBORN)
|
if (players[playernum].spectator ||
|
||||||
|
players[playernum].playerstate == PST_DEAD ||
|
||||||
|
players[playernum].playerstate == PST_REBORN)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -1492,446 +1494,145 @@ static void ForceAllSkins(INT32 forcedskin)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static INT32 snacpending = 0, snac2pending = 0, snac3pending = 0, snac4pending = 0, chmappending = 0;
|
static INT32 chmappending;
|
||||||
|
static INT32 snacpending[MAXSPLITSCREENPLAYERS];
|
||||||
|
|
||||||
|
// wonky compat, idk if anything uses this....
|
||||||
|
#define playerisbot (splitplayer == 1 && botingame)
|
||||||
|
|
||||||
// name, color, or skin has changed
|
// name, color, or skin has changed
|
||||||
//
|
//
|
||||||
static void SendNameAndColor(void)
|
static void SendNameAndColor(UINT8 splitplayer)
|
||||||
{
|
{
|
||||||
char buf[MAXPLAYERNAME+2];
|
char buf[MAXPLAYERNAME+2];
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
p = buf;
|
p = buf;
|
||||||
|
|
||||||
|
// splitscreen
|
||||||
|
if (splitscreen < splitplayer && !playerisbot)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const INT32 pnum = P_GetLocalPlayerNumForNum(splitplayer);
|
||||||
|
|
||||||
|
player_t *player = &players[pnum];
|
||||||
|
|
||||||
|
// TODO: make those cvars arrays
|
||||||
|
consvar_t *playercolor, *playername, *playerskin;
|
||||||
|
consvar_t *colorvars[] = {&cv_playercolor, &cv_playercolor2, &cv_playercolor3, &cv_playercolor4};
|
||||||
|
consvar_t *namevars[] = {&cv_playername, &cv_playername2, &cv_playername3, &cv_playername4};
|
||||||
|
consvar_t *skinvars[] = {&cv_skin, &cv_skin2, &cv_skin3, &cv_skin4};
|
||||||
|
|
||||||
|
playercolor = colorvars[splitplayer];
|
||||||
|
playername = namevars[splitplayer];
|
||||||
|
playerskin = skinvars[splitplayer];
|
||||||
|
|
||||||
// normal player colors
|
// normal player colors
|
||||||
if (G_GametypeHasTeams())
|
if (G_GametypeHasTeams())
|
||||||
{
|
{
|
||||||
if (players[consoleplayer].ctfteam == 1 && cv_playercolor.value != skincolor_redteam)
|
if (player->ctfteam == 1 && playercolor->value != skincolor_redteam)
|
||||||
CV_StealthSetValue(&cv_playercolor, skincolor_redteam);
|
CV_StealthSetValue(playercolor, skincolor_redteam);
|
||||||
else if (players[consoleplayer].ctfteam == 2 && cv_playercolor.value != skincolor_blueteam)
|
else if (player->ctfteam == 2 && playercolor->value != skincolor_blueteam)
|
||||||
CV_StealthSetValue(&cv_playercolor, skincolor_blueteam);
|
CV_StealthSetValue(playercolor, skincolor_blueteam);
|
||||||
}
|
}
|
||||||
|
|
||||||
// never allow the color "none"
|
// never allow the color "none"
|
||||||
if (!cv_playercolor.value)
|
if (!playercolor->value)
|
||||||
{
|
{
|
||||||
if (players[consoleplayer].skincolor)
|
if (player->skincolor)
|
||||||
CV_StealthSetValue(&cv_playercolor, players[consoleplayer].skincolor);
|
CV_StealthSetValue(playercolor, player->skincolor);
|
||||||
else if (skins[players[consoleplayer].skin].prefcolor)
|
else if (skins[player->skin].prefcolor)
|
||||||
CV_StealthSetValue(&cv_playercolor, skins[players[consoleplayer].skin].prefcolor);
|
CV_StealthSetValue(playercolor, skins[player->skin].prefcolor);
|
||||||
else
|
else
|
||||||
CV_StealthSet(&cv_playercolor, cv_playercolor.defaultvalue);
|
CV_StealthSet(playercolor, playercolor->defaultvalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fastcmp(cv_playername.string, player_names[consoleplayer])
|
|
||||||
&& cv_playercolor.value == players[consoleplayer].skincolor
|
|
||||||
&& fastcmp(cv_skin.string, skins[players[consoleplayer].skin].name))
|
|
||||||
return;
|
|
||||||
|
|
||||||
// We'll handle it later if we're not playing.
|
// We'll handle it later if we're not playing.
|
||||||
if (!Playing())
|
if (!Playing())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (fastcmp(playername->string, player_names[pnum])
|
||||||
|
&& playercolor->value == player->skincolor
|
||||||
|
&& fastcmp(playerskin->string, skins[player->skin].name))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (playerisbot)
|
||||||
|
{
|
||||||
|
players[pnum].skincolor = botcolor;
|
||||||
|
if (players[pnum].mo)
|
||||||
|
players[pnum].mo->color = players[pnum].skincolor;
|
||||||
|
SetPlayerSkinByNum(pnum, botskin-1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// If you're not in a netgame, merely update the skin, color, and name.
|
// If you're not in a netgame, merely update the skin, color, and name.
|
||||||
if (!netgame)
|
if (!netgame)
|
||||||
{
|
{
|
||||||
INT32 foundskin;
|
INT32 foundskin;
|
||||||
|
|
||||||
CleanupPlayerName(consoleplayer, cv_playername.zstring);
|
CleanupPlayerName(pnum, playername->zstring);
|
||||||
strcpy(player_names[consoleplayer], cv_playername.zstring);
|
strcpy(player_names[pnum], playername->zstring);
|
||||||
|
|
||||||
players[consoleplayer].skincolor = cv_playercolor.value;
|
player->skincolor = playercolor->value;
|
||||||
|
|
||||||
if (players[consoleplayer].mo)
|
if (player->mo)
|
||||||
players[consoleplayer].mo->color = players[consoleplayer].skincolor;
|
player->mo->color = player->skincolor;
|
||||||
|
|
||||||
if ((foundskin = R_SkinAvailable(cv_skin.string)) != -1)
|
if ((foundskin = R_SkinAvailable(playerskin->string)) != -1)
|
||||||
{
|
{
|
||||||
cv_skin.value = foundskin;
|
playerskin->value = foundskin;
|
||||||
SetPlayerSkin(consoleplayer, cv_skin.string);
|
SetPlayerSkin(pnum, playerskin->string);
|
||||||
CV_StealthSet(&cv_skin, skins[cv_skin.value].name);
|
CV_StealthSet(playerskin, skins[playerskin->value].name);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cv_skin.value = players[consoleplayer].skin;
|
playerskin->value = player->skin;
|
||||||
CV_StealthSet(&cv_skin, skins[players[consoleplayer].skin].name);
|
CV_StealthSet(playerskin, skins[player->skin].name);
|
||||||
// will always be same as current
|
// will always be same as current
|
||||||
SetPlayerSkin(consoleplayer, cv_skin.string);
|
SetPlayerSkin(pnum, playerskin->string);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
snacpending++;
|
snacpending[splitplayer]++;
|
||||||
|
|
||||||
// Don't change name if muted
|
// Don't change name if muted
|
||||||
if (player_name_changes[consoleplayer] >= MAXNAMECHANGES)
|
if (player_name_changes[pnum] >= MAXNAMECHANGES)
|
||||||
{
|
{
|
||||||
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
|
CV_StealthSet(playername, player_names[pnum]);
|
||||||
HU_AddChatText("\x85*You must wait to change your name again", false);
|
HU_AddChatText("\x85*You must wait to change your name again", false);
|
||||||
}
|
}
|
||||||
else if (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer)))
|
else if (cv_mute.value && !(server || IsPlayerAdmin(pnum)))
|
||||||
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
|
CV_StealthSet(playername, player_names[pnum]);
|
||||||
else // Cleanup name if changing it
|
else // Cleanup name if changing it
|
||||||
CleanupPlayerName(consoleplayer, cv_playername.zstring);
|
CleanupPlayerName(pnum, playername->zstring);
|
||||||
|
|
||||||
// Don't change skin if the server doesn't want you to.
|
// Don't change skin if the server doesn't want you to.
|
||||||
if (!CanChangeSkin(consoleplayer))
|
if (!CanChangeSkin(pnum))
|
||||||
CV_StealthSet(&cv_skin, skins[players[consoleplayer].skin].name);
|
CV_StealthSet(playerskin, skins[player->skin].name);
|
||||||
|
|
||||||
// check if player has the skin loaded (cv_skin may have
|
// check if player has the skin loaded (cv_skin may have
|
||||||
// the name of a skin that was available in the previous game)
|
// the name of a skin that was available in the previous game)
|
||||||
cv_skin.value = R_SkinAvailable(cv_skin.string);
|
playerskin->value = R_SkinAvailable(playerskin->string);
|
||||||
if (cv_skin.value < 0)
|
if (playerskin->value < 0)
|
||||||
{
|
{
|
||||||
INT32 skinnum = players[consoleplayer].skin;
|
INT32 skinnum = player->skin;
|
||||||
CV_StealthSet(&cv_skin, skins[skinnum].name);
|
CV_StealthSet(playerskin, skins[skinnum].name);
|
||||||
cv_skin.value = skinnum;
|
playerskin->value = skinnum;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finally write out the complete packet and send it off.
|
// Finally write out the complete packet and send it off.
|
||||||
WRITESTRINGN(p, cv_playername.zstring, MAXPLAYERNAME);
|
WRITESTRINGN(p, playername->zstring, MAXPLAYERNAME);
|
||||||
WRITEUINT8(p, (UINT8)cv_playercolor.value);
|
WRITEUINT8(p, (UINT8)playercolor->value);
|
||||||
WRITEUINT8(p, (UINT8)cv_skin.value);
|
WRITEUINT8(p, (UINT8)playerskin->value);
|
||||||
SendNetXCmdForPlayer(0, XD_NAMEANDCOLOR, buf, p - buf);
|
SendNetXCmdForPlayer(splitplayer, XD_NAMEANDCOLOR, buf, p - buf);
|
||||||
}
|
|
||||||
|
|
||||||
// splitscreen
|
|
||||||
static void SendNameAndColor2(void)
|
|
||||||
{
|
|
||||||
INT32 secondplaya = -1;
|
|
||||||
char buf[MAXPLAYERNAME+2];
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
if (splitscreen < 1 && !botingame)
|
|
||||||
return; // can happen if skin2/color2/name2 changed
|
|
||||||
|
|
||||||
if (displayplayers[1] != consoleplayer)
|
|
||||||
secondplaya = displayplayers[1];
|
|
||||||
else if (!netgame) // HACK
|
|
||||||
secondplaya = 1;
|
|
||||||
|
|
||||||
if (secondplaya == -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
p = buf;
|
|
||||||
|
|
||||||
// normal player colors
|
|
||||||
if (G_GametypeHasTeams())
|
|
||||||
{
|
|
||||||
if (players[secondplaya].ctfteam == 1 && cv_playercolor2.value != skincolor_redteam)
|
|
||||||
CV_StealthSetValue(&cv_playercolor2, skincolor_redteam);
|
|
||||||
else if (players[secondplaya].ctfteam == 2 && cv_playercolor2.value != skincolor_blueteam)
|
|
||||||
CV_StealthSetValue(&cv_playercolor2, skincolor_blueteam);
|
|
||||||
}
|
|
||||||
|
|
||||||
// never allow the color "none"
|
|
||||||
if (!cv_playercolor2.value)
|
|
||||||
{
|
|
||||||
if (players[secondplaya].skincolor)
|
|
||||||
CV_StealthSetValue(&cv_playercolor2, players[secondplaya].skincolor);
|
|
||||||
else if (skins[players[secondplaya].skin].prefcolor)
|
|
||||||
CV_StealthSetValue(&cv_playercolor2, skins[players[secondplaya].skin].prefcolor);
|
|
||||||
else
|
|
||||||
CV_StealthSet(&cv_playercolor2, cv_playercolor2.defaultvalue);
|
|
||||||
}
|
|
||||||
|
|
||||||
// We'll handle it later if we're not playing.
|
|
||||||
if (!Playing())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// If you're not in a netgame, merely update the skin, color, and name.
|
|
||||||
if (botingame)
|
|
||||||
{
|
|
||||||
players[secondplaya].skincolor = botcolor;
|
|
||||||
if (players[secondplaya].mo)
|
|
||||||
players[secondplaya].mo->color = players[secondplaya].skincolor;
|
|
||||||
SetPlayerSkinByNum(secondplaya, botskin-1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (!netgame)
|
|
||||||
{
|
|
||||||
INT32 foundskin;
|
|
||||||
|
|
||||||
CleanupPlayerName(secondplaya, cv_playername2.zstring);
|
|
||||||
strcpy(player_names[secondplaya], cv_playername2.zstring);
|
|
||||||
|
|
||||||
// don't use displayplayers[1]: the second player must be 1
|
|
||||||
players[secondplaya].skincolor = cv_playercolor2.value;
|
|
||||||
if (players[secondplaya].mo)
|
|
||||||
players[secondplaya].mo->color = players[secondplaya].skincolor;
|
|
||||||
|
|
||||||
if ((foundskin = R_SkinAvailable(cv_skin2.string)) != -1)
|
|
||||||
{
|
|
||||||
cv_skin2.value = foundskin;
|
|
||||||
SetPlayerSkin(secondplaya, cv_skin2.string);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cv_skin2.value = players[secondplaya].skin;
|
|
||||||
CV_StealthSet(&cv_skin2, skins[players[secondplaya].skin].name);
|
|
||||||
// will always be same as current
|
|
||||||
SetPlayerSkin(secondplaya, cv_skin2.string);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
snac2pending++;
|
|
||||||
|
|
||||||
// Don't change name if muted
|
|
||||||
if (player_name_changes[displayplayers[1]] >= MAXNAMECHANGES)
|
|
||||||
{
|
|
||||||
CV_StealthSet(&cv_playername2, player_names[displayplayers[1]]);
|
|
||||||
HU_AddChatText("\x85*You must wait to change your name again", false);
|
|
||||||
}
|
|
||||||
else if (cv_mute.value && !(server || IsPlayerAdmin(displayplayers[1])))
|
|
||||||
CV_StealthSet(&cv_playername2, player_names[displayplayers[1]]);
|
|
||||||
else // Cleanup name if changing it
|
|
||||||
CleanupPlayerName(displayplayers[1], cv_playername2.zstring);
|
|
||||||
|
|
||||||
// Don't change skin if the server doesn't want you to.
|
|
||||||
if (!CanChangeSkin(displayplayers[1]))
|
|
||||||
CV_StealthSet(&cv_skin2, skins[players[displayplayers[1]].skin].name);
|
|
||||||
|
|
||||||
// check if player has the skin loaded (cv_skin2 may have
|
|
||||||
// the name of a skin that was available in the previous game)
|
|
||||||
cv_skin2.value = R_SkinAvailable(cv_skin2.string);
|
|
||||||
if (cv_skin2.value < 0)
|
|
||||||
{
|
|
||||||
INT32 skinnum = players[displayplayers[1]].skin;
|
|
||||||
CV_StealthSet(&cv_skin2, skins[skinnum].name);
|
|
||||||
cv_skin2.value = skinnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finally write out the complete packet and send it off.
|
|
||||||
WRITESTRINGN(p, cv_playername2.zstring, MAXPLAYERNAME);
|
|
||||||
WRITEUINT8(p, (UINT8)cv_playercolor2.value);
|
|
||||||
WRITEUINT8(p, (UINT8)cv_skin2.value);
|
|
||||||
SendNetXCmdForPlayer(1, XD_NAMEANDCOLOR, buf, p - buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SendNameAndColor3(void)
|
|
||||||
{
|
|
||||||
INT32 thirdplaya = -1;
|
|
||||||
char buf[MAXPLAYERNAME+2];
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
if (splitscreen < 2)
|
|
||||||
return; // can happen if skin3/color3/name3 changed
|
|
||||||
|
|
||||||
if (displayplayers[2] != consoleplayer)
|
|
||||||
thirdplaya = displayplayers[2];
|
|
||||||
else if (!netgame) // HACK
|
|
||||||
thirdplaya = 2;
|
|
||||||
|
|
||||||
if (thirdplaya == -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
p = buf;
|
|
||||||
|
|
||||||
// normal player colors
|
|
||||||
if (G_GametypeHasTeams())
|
|
||||||
{
|
|
||||||
if (players[thirdplaya].ctfteam == 1 && cv_playercolor3.value != skincolor_redteam)
|
|
||||||
CV_StealthSetValue(&cv_playercolor3, skincolor_redteam);
|
|
||||||
else if (players[thirdplaya].ctfteam == 2 && cv_playercolor3.value != skincolor_blueteam)
|
|
||||||
CV_StealthSetValue(&cv_playercolor3, skincolor_blueteam);
|
|
||||||
}
|
|
||||||
|
|
||||||
// never allow the color "none"
|
|
||||||
if (!cv_playercolor3.value)
|
|
||||||
{
|
|
||||||
if (players[thirdplaya].skincolor)
|
|
||||||
CV_StealthSetValue(&cv_playercolor3, players[thirdplaya].skincolor);
|
|
||||||
else if (skins[players[thirdplaya].skin].prefcolor)
|
|
||||||
CV_StealthSetValue(&cv_playercolor3, skins[players[thirdplaya].skin].prefcolor);
|
|
||||||
else
|
|
||||||
CV_StealthSet(&cv_playercolor3, cv_playercolor3.defaultvalue);
|
|
||||||
}
|
|
||||||
|
|
||||||
// We'll handle it later if we're not playing.
|
|
||||||
if (!Playing())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// If you're not in a netgame, merely update the skin, color, and name.
|
|
||||||
if (!netgame)
|
|
||||||
{
|
|
||||||
INT32 foundskin;
|
|
||||||
|
|
||||||
CleanupPlayerName(thirdplaya, cv_playername3.zstring);
|
|
||||||
strcpy(player_names[thirdplaya], cv_playername3.zstring);
|
|
||||||
|
|
||||||
// don't use displayplayers[2]: the third player must be 2
|
|
||||||
players[thirdplaya].skincolor = cv_playercolor3.value;
|
|
||||||
if (players[thirdplaya].mo)
|
|
||||||
players[thirdplaya].mo->color = players[thirdplaya].skincolor;
|
|
||||||
|
|
||||||
if ((foundskin = R_SkinAvailable(cv_skin3.string)) != -1)
|
|
||||||
{
|
|
||||||
cv_skin3.value = foundskin;
|
|
||||||
SetPlayerSkin(thirdplaya, cv_skin3.string);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cv_skin3.value = players[thirdplaya].skin;
|
|
||||||
CV_StealthSet(&cv_skin3, skins[players[thirdplaya].skin].name);
|
|
||||||
// will always be same as current
|
|
||||||
SetPlayerSkin(thirdplaya, cv_skin3.string);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
snac3pending++;
|
|
||||||
|
|
||||||
// Don't change name if muted
|
|
||||||
if (player_name_changes[displayplayers[2]] >= MAXNAMECHANGES)
|
|
||||||
{
|
|
||||||
CV_StealthSet(&cv_playername3, player_names[displayplayers[2]]);
|
|
||||||
HU_AddChatText("\x85*You must wait to change your name again", false);
|
|
||||||
}
|
|
||||||
else if (cv_mute.value && !(server || IsPlayerAdmin(displayplayers[2])))
|
|
||||||
CV_StealthSet(&cv_playername3, player_names[displayplayers[2]]);
|
|
||||||
else // Cleanup name if changing it
|
|
||||||
CleanupPlayerName(displayplayers[2], cv_playername3.zstring);
|
|
||||||
|
|
||||||
// Don't change skin if the server doesn't want you to.
|
|
||||||
if (!CanChangeSkin(displayplayers[2]))
|
|
||||||
CV_StealthSet(&cv_skin3, skins[players[displayplayers[2]].skin].name);
|
|
||||||
|
|
||||||
// check if player has the skin loaded (cv_skin3 may have
|
|
||||||
// the name of a skin that was available in the previous game)
|
|
||||||
cv_skin3.value = R_SkinAvailable(cv_skin3.string);
|
|
||||||
if (cv_skin3.value < 0)
|
|
||||||
{
|
|
||||||
INT32 skinnum = players[displayplayers[2]].skin;
|
|
||||||
CV_StealthSet(&cv_skin3, skins[skinnum].name);
|
|
||||||
cv_skin3.value = skinnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finally write out the complete packet and send it off.
|
|
||||||
WRITESTRINGN(p, cv_playername3.zstring, MAXPLAYERNAME);
|
|
||||||
WRITEUINT8(p, (UINT8)cv_playercolor3.value);
|
|
||||||
WRITEUINT8(p, (UINT8)cv_skin3.value);
|
|
||||||
SendNetXCmdForPlayer(2, XD_NAMEANDCOLOR, buf, p - buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SendNameAndColor4(void)
|
|
||||||
{
|
|
||||||
INT32 fourthplaya = -1;
|
|
||||||
char buf[MAXPLAYERNAME+2];
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
if (splitscreen < 3)
|
|
||||||
return; // can happen if skin4/color4/name4 changed
|
|
||||||
|
|
||||||
if (displayplayers[3] != consoleplayer)
|
|
||||||
fourthplaya = displayplayers[3];
|
|
||||||
else if (!netgame) // HACK
|
|
||||||
fourthplaya = 3;
|
|
||||||
|
|
||||||
if (fourthplaya == -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
p = buf;
|
|
||||||
|
|
||||||
// normal player colors
|
|
||||||
if (G_GametypeHasTeams())
|
|
||||||
{
|
|
||||||
if (players[fourthplaya].ctfteam == 1 && cv_playercolor4.value != skincolor_redteam)
|
|
||||||
CV_StealthSetValue(&cv_playercolor4, skincolor_redteam);
|
|
||||||
else if (players[fourthplaya].ctfteam == 2 && cv_playercolor4.value != skincolor_blueteam)
|
|
||||||
CV_StealthSetValue(&cv_playercolor4, skincolor_blueteam);
|
|
||||||
}
|
|
||||||
|
|
||||||
// never allow the color "none"
|
|
||||||
if (!cv_playercolor4.value)
|
|
||||||
{
|
|
||||||
if (players[fourthplaya].skincolor)
|
|
||||||
CV_StealthSetValue(&cv_playercolor4, players[fourthplaya].skincolor);
|
|
||||||
else if (skins[players[fourthplaya].skin].prefcolor)
|
|
||||||
CV_StealthSetValue(&cv_playercolor4, skins[players[fourthplaya].skin].prefcolor);
|
|
||||||
else
|
|
||||||
CV_StealthSet(&cv_playercolor4, cv_playercolor4.defaultvalue);
|
|
||||||
}
|
|
||||||
|
|
||||||
// We'll handle it later if we're not playing.
|
|
||||||
if (!Playing())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// If you're not in a netgame, merely update the skin, color, and name.
|
|
||||||
if (botingame)
|
|
||||||
{
|
|
||||||
players[fourthplaya].skincolor = botcolor;
|
|
||||||
if (players[fourthplaya].mo)
|
|
||||||
players[fourthplaya].mo->color = players[fourthplaya].skincolor;
|
|
||||||
SetPlayerSkinByNum(fourthplaya, botskin-1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (!netgame)
|
|
||||||
{
|
|
||||||
INT32 foundskin;
|
|
||||||
|
|
||||||
CleanupPlayerName(fourthplaya, cv_playername4.zstring);
|
|
||||||
strcpy(player_names[fourthplaya], cv_playername4.zstring);
|
|
||||||
|
|
||||||
// don't use displayplayers[3]: the second player must be 4
|
|
||||||
players[fourthplaya].skincolor = cv_playercolor4.value;
|
|
||||||
if (players[fourthplaya].mo)
|
|
||||||
players[fourthplaya].mo->color = players[fourthplaya].skincolor;
|
|
||||||
|
|
||||||
if ((foundskin = R_SkinAvailable(cv_skin4.string)) != -1)
|
|
||||||
{
|
|
||||||
cv_skin4.value = foundskin;
|
|
||||||
SetPlayerSkin(fourthplaya, cv_skin4.string);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cv_skin4.value = players[fourthplaya].skin;
|
|
||||||
CV_StealthSet(&cv_skin4, skins[players[fourthplaya].skin].name);
|
|
||||||
// will always be same as current
|
|
||||||
SetPlayerSkin(fourthplaya, cv_skin4.string);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
snac4pending++;
|
|
||||||
|
|
||||||
// Don't change name if muted
|
|
||||||
if (player_name_changes[displayplayers[3]] >= MAXNAMECHANGES)
|
|
||||||
{
|
|
||||||
CV_StealthSet(&cv_playername4, player_names[displayplayers[3]]);
|
|
||||||
HU_AddChatText("\x85*You must wait to change your name again", false);
|
|
||||||
}
|
|
||||||
else if (cv_mute.value && !(server || IsPlayerAdmin(displayplayers[3])))
|
|
||||||
CV_StealthSet(&cv_playername4, player_names[displayplayers[3]]);
|
|
||||||
else // Cleanup name if changing it
|
|
||||||
CleanupPlayerName(displayplayers[3], cv_playername4.zstring);
|
|
||||||
|
|
||||||
// Don't change skin if the server doesn't want you to.
|
|
||||||
if (!CanChangeSkin(displayplayers[3]))
|
|
||||||
CV_StealthSet(&cv_skin4, skins[players[displayplayers[3]].skin].name);
|
|
||||||
|
|
||||||
// check if player has the skin loaded (cv_skin4 may have
|
|
||||||
// the name of a skin that was available in the previous game)
|
|
||||||
cv_skin4.value = R_SkinAvailable(cv_skin4.string);
|
|
||||||
if (cv_skin4.value < 0)
|
|
||||||
{
|
|
||||||
INT32 skinnum = players[displayplayers[3]].skin;
|
|
||||||
CV_StealthSet(&cv_skin4, skins[skinnum].name);
|
|
||||||
cv_skin4.value = skinnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finally write out the complete packet and send it off.
|
|
||||||
WRITESTRINGN(p, cv_playername4.zstring, MAXPLAYERNAME);
|
|
||||||
WRITEUINT8(p, (UINT8)cv_playercolor4.value);
|
|
||||||
WRITEUINT8(p, (UINT8)cv_skin4.value);
|
|
||||||
SendNetXCmdForPlayer(3, XD_NAMEANDCOLOR, buf, p - buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
||||||
{
|
{
|
||||||
player_t *p = &players[playernum];
|
player_t *player = &players[playernum];
|
||||||
char name[MAXPLAYERNAME+1];
|
char name[MAXPLAYERNAME+1] = {};
|
||||||
UINT8 color, skin;
|
UINT8 color, skin;
|
||||||
|
|
||||||
#ifdef PARANOIA
|
#ifdef PARANOIA
|
||||||
@@ -1939,19 +1640,14 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
|||||||
I_Error("There is no player %d!", playernum);
|
I_Error("There is no player %d!", playernum);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (playernum == consoleplayer)
|
if (P_IsLocalPlayer(player))
|
||||||
snacpending--; // TODO: make snacpending an array instead of 4 separate vars?
|
{
|
||||||
else if (playernum == displayplayers[1])
|
snacpending[playernum]--;
|
||||||
snac2pending--;
|
|
||||||
else if (playernum == displayplayers[2])
|
|
||||||
snac3pending--;
|
|
||||||
else if (playernum == displayplayers[3])
|
|
||||||
snac4pending--;
|
|
||||||
|
|
||||||
#ifdef PARANOIA
|
#ifdef PARANOIA
|
||||||
if (snacpending < 0 || snac2pending < 0 || snac3pending < 0 || snac4pending < 0)
|
if (snacpending[playernum] < 0)
|
||||||
I_Error("snacpending negative!");
|
I_Error("snacpending negative!");
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
READSTRINGN(*cp, name, MAXPLAYERNAME);
|
READSTRINGN(*cp, name, MAXPLAYERNAME);
|
||||||
color = READUINT8(*cp);
|
color = READUINT8(*cp);
|
||||||
@@ -1965,33 +1661,32 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// set color
|
// set color
|
||||||
p->skincolor = color % MAXSKINCOLORS;
|
player->skincolor = color % MAXSKINCOLORS;
|
||||||
if (p->mo)
|
if (player->mo)
|
||||||
p->mo->color = (UINT8)p->skincolor;
|
player->mo->color = (UINT8)player->skincolor;
|
||||||
demo_extradata[playernum] |= DXD_COLOR;
|
demo_extradata[playernum] |= DXD_COLOR;
|
||||||
|
|
||||||
// normal player colors
|
// normal player colors
|
||||||
if (server && (p != &players[consoleplayer] && p != &players[displayplayers[1]]
|
if (server && !P_IsLocalPlayer(player))
|
||||||
&& p != &players[displayplayers[2]] && p != &players[displayplayers[3]]))
|
|
||||||
{
|
{
|
||||||
boolean kick = false;
|
boolean kick = false;
|
||||||
|
|
||||||
// team colors
|
// team colors
|
||||||
if (G_GametypeHasTeams())
|
if (G_GametypeHasTeams())
|
||||||
{
|
{
|
||||||
if (p->ctfteam == 1 && p->skincolor != skincolor_redteam)
|
if (player->ctfteam == 1 && player->skincolor != skincolor_redteam)
|
||||||
kick = true;
|
kick = true;
|
||||||
else if (p->ctfteam == 2 && p->skincolor != skincolor_blueteam)
|
else if (player->ctfteam == 2 && player->skincolor != skincolor_blueteam)
|
||||||
kick = true;
|
kick = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// don't allow color "none"
|
// don't allow color "none"
|
||||||
if (!p->skincolor)
|
if (!player->skincolor)
|
||||||
kick = true;
|
kick = true;
|
||||||
|
|
||||||
if (kick)
|
if (kick)
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Illegal color change received from %s (team: %d), color: %d)\n"), player_names[playernum], p->ctfteam, p->skincolor);
|
CONS_Alert(CONS_WARNING, M_GetText("Illegal color change received from %s (team: %d), color: %d)\n"), player_names[playernum], player->ctfteam, player->skincolor);
|
||||||
SendKick(playernum, KICK_MSG_CON_FAIL);
|
SendKick(playernum, KICK_MSG_CON_FAIL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2003,6 +1698,7 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
|||||||
const INT32 forcedskin = cv_forceskin.value;
|
const INT32 forcedskin = cv_forceskin.value;
|
||||||
SetPlayerSkinByNum(playernum, forcedskin);
|
SetPlayerSkinByNum(playernum, forcedskin);
|
||||||
|
|
||||||
|
// TODO: make cv_skin an array
|
||||||
if (playernum == consoleplayer)
|
if (playernum == consoleplayer)
|
||||||
CV_StealthSet(&cv_skin, skins[forcedskin].name);
|
CV_StealthSet(&cv_skin, skins[forcedskin].name);
|
||||||
else if (playernum == displayplayers[1])
|
else if (playernum == displayplayers[1])
|
||||||
@@ -2016,44 +1712,16 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
|||||||
SetPlayerSkinByNum(playernum, skin);
|
SetPlayerSkinByNum(playernum, skin);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendWeaponPref(void)
|
void SendWeaponPref(UINT8 splitplayer)
|
||||||
{
|
{
|
||||||
UINT8 buf[1];
|
UINT8 buf[1];
|
||||||
|
|
||||||
buf[0] = 0;
|
buf[0] = 0;
|
||||||
if (cv_flipcam[0].value)
|
|
||||||
|
if (cv_flipcam[splitplayer].value)
|
||||||
buf[0] |= 1;
|
buf[0] |= 1;
|
||||||
SendNetXCmdForPlayer(0, XD_WEAPONPREF, buf, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SendWeaponPref2(void)
|
SendNetXCmdForPlayer(splitplayer, XD_WEAPONPREF, buf, 1);
|
||||||
{
|
|
||||||
UINT8 buf[1];
|
|
||||||
|
|
||||||
buf[0] = 0;
|
|
||||||
if (cv_flipcam[1].value)
|
|
||||||
buf[0] |= 1;
|
|
||||||
SendNetXCmdForPlayer(1, XD_WEAPONPREF, buf, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SendWeaponPref3(void)
|
|
||||||
{
|
|
||||||
UINT8 buf[1];
|
|
||||||
|
|
||||||
buf[0] = 0;
|
|
||||||
if (cv_flipcam[2].value)
|
|
||||||
buf[0] |= 1;
|
|
||||||
SendNetXCmdForPlayer(2, XD_WEAPONPREF, buf, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SendWeaponPref4(void)
|
|
||||||
{
|
|
||||||
UINT8 buf[1];
|
|
||||||
|
|
||||||
buf[0] = 0;
|
|
||||||
if (cv_flipcam[3].value)
|
|
||||||
buf[0] |= 1;
|
|
||||||
SendNetXCmdForPlayer(3, XD_WEAPONPREF, buf, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Got_WeaponPref(const UINT8 **cp, INT32 playernum)
|
static void Got_WeaponPref(const UINT8 **cp, INT32 playernum)
|
||||||
@@ -2069,23 +1737,10 @@ static void Got_WeaponPref(const UINT8 **cp, INT32 playernum)
|
|||||||
player->pflags |= PF_ANALOGMODE;
|
player->pflags |= PF_ANALOGMODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void D_SendPlayerConfig(void)
|
void D_SendPlayerConfig(UINT8 splitplayer)
|
||||||
{
|
{
|
||||||
SendNameAndColor();
|
SendNameAndColor(splitplayer);
|
||||||
if (splitscreen || botingame)
|
SendWeaponPref(splitplayer);
|
||||||
SendNameAndColor2();
|
|
||||||
if (splitscreen > 1)
|
|
||||||
SendNameAndColor3();
|
|
||||||
if (splitscreen > 2)
|
|
||||||
SendNameAndColor4();
|
|
||||||
|
|
||||||
SendWeaponPref();
|
|
||||||
if (splitscreen)
|
|
||||||
SendWeaponPref2();
|
|
||||||
if (splitscreen > 1)
|
|
||||||
SendWeaponPref3();
|
|
||||||
if (splitscreen > 2)
|
|
||||||
SendWeaponPref4();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only works for displayplayer, sorry!
|
// Only works for displayplayer, sorry!
|
||||||
@@ -2108,10 +1763,12 @@ INT32 D_LookupPlayer(const char *s)
|
|||||||
return playernum;
|
return playernum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const size_t len = strlen(s);
|
||||||
|
|
||||||
for (playernum = 0; playernum < MAXPLAYERS; ++playernum)
|
for (playernum = 0; playernum < MAXPLAYERS; ++playernum)
|
||||||
{
|
{
|
||||||
/* Match name case-insensitively: fully, or partially the start. */
|
/* Match name case-insensitively: fully, or partially the start. */
|
||||||
if (playeringame[playernum] && (strnicmp(player_names[playernum], s, strlen(s)) == 0))
|
if (playeringame[playernum] && (strnicmp(player_names[playernum], s, len) == 0))
|
||||||
{
|
{
|
||||||
return playernum;
|
return playernum;
|
||||||
}
|
}
|
||||||
@@ -2151,13 +1808,15 @@ static void GetViewablePlayerPlaceRange(INT32 *first, INT32 *last)
|
|||||||
(*last) = 0;
|
(*last) = 0;
|
||||||
|
|
||||||
for (i = 0; i < MAXPLAYERS; ++i)
|
for (i = 0; i < MAXPLAYERS; ++i)
|
||||||
if (G_CouldView(i))
|
|
||||||
{
|
{
|
||||||
place = players[i].kartstuff[k_position];
|
if (G_CouldView(i))
|
||||||
if (place < (*first))
|
{
|
||||||
(*first) = place;
|
place = players[i].kartstuff[k_position];
|
||||||
if (place > (*last))
|
if (place < (*first))
|
||||||
(*last) = place;
|
(*first) = place;
|
||||||
|
if (place > (*last))
|
||||||
|
(*last) = place;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2491,7 +2150,7 @@ void D_MapChange(INT32 mapnum, INT32 newgametype, boolean pencoremode, boolean r
|
|||||||
displayplayers[1] = 1;
|
displayplayers[1] = 1;
|
||||||
playeringame[1] = true;
|
playeringame[1] = true;
|
||||||
players[1].bot = 1;
|
players[1].bot = 1;
|
||||||
SendNameAndColor2();
|
SendNameAndColor(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5768,50 +5427,54 @@ static void ForceSkin_OnChange(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Allows the player's name to be changed if cv_mute is off.
|
// Allows the player's name to be changed if cv_mute is off.
|
||||||
static void Name_OnChange(void)
|
static void Name_OnChange(void)
|
||||||
{
|
{
|
||||||
if (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer)))
|
if (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer)))
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
|
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
|
||||||
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
|
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
SendNameAndColor();
|
SendNameAndColor(0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Name2_OnChange(void)
|
static void Name2_OnChange(void)
|
||||||
{
|
{
|
||||||
if (cv_mute.value) //Secondary player can't be admin.
|
if (cv_mute.value) // Secondary player can't be admin.
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
|
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
|
||||||
CV_StealthSet(&cv_playername2, player_names[displayplayers[1]]);
|
CV_StealthSet(&cv_playername2, player_names[displayplayers[1]]);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
SendNameAndColor2();
|
SendNameAndColor(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Name3_OnChange(void)
|
static void Name3_OnChange(void)
|
||||||
{
|
{
|
||||||
if (cv_mute.value) //Third player can't be admin.
|
if (cv_mute.value) // Third player can't be admin.
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
|
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
|
||||||
CV_StealthSet(&cv_playername3, player_names[displayplayers[2]]);
|
CV_StealthSet(&cv_playername3, player_names[displayplayers[2]]);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
SendNameAndColor3();
|
SendNameAndColor(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Name4_OnChange(void)
|
static void Name4_OnChange(void)
|
||||||
{
|
{
|
||||||
if (cv_mute.value) //Secondary player can't be admin.
|
if (cv_mute.value) // Secondary player can't be admin.
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
|
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
|
||||||
CV_StealthSet(&cv_playername4, player_names[displayplayers[3]]);
|
CV_StealthSet(&cv_playername4, player_names[displayplayers[3]]);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
SendNameAndColor4();
|
SendNameAndColor(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sends a skin change for the console player, unless that player is moving.
|
/** Sends a skin change for the console player, unless that player is moving.
|
||||||
@@ -5833,7 +5496,7 @@ static void Skin_OnChange(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (CanChangeSkin(consoleplayer) && !P_PlayerMoving(consoleplayer))
|
if (CanChangeSkin(consoleplayer) && !P_PlayerMoving(consoleplayer))
|
||||||
SendNameAndColor();
|
SendNameAndColor(0);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
|
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
|
||||||
@@ -5854,7 +5517,7 @@ static void Skin2_OnChange(void)
|
|||||||
return; // do whatever you want
|
return; // do whatever you want
|
||||||
|
|
||||||
if (CanChangeSkin(displayplayers[1]) && !P_PlayerMoving(displayplayers[1]))
|
if (CanChangeSkin(displayplayers[1]) && !P_PlayerMoving(displayplayers[1]))
|
||||||
SendNameAndColor2();
|
SendNameAndColor(1);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
|
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
|
||||||
@@ -5870,7 +5533,7 @@ static void Skin3_OnChange(void)
|
|||||||
return; // do whatever you want
|
return; // do whatever you want
|
||||||
|
|
||||||
if (CanChangeSkin(displayplayers[2]) && !P_PlayerMoving(displayplayers[2]))
|
if (CanChangeSkin(displayplayers[2]) && !P_PlayerMoving(displayplayers[2]))
|
||||||
SendNameAndColor3();
|
SendNameAndColor(2);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
|
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
|
||||||
@@ -5886,7 +5549,7 @@ static void Skin4_OnChange(void)
|
|||||||
return; // do whatever you want
|
return; // do whatever you want
|
||||||
|
|
||||||
if (CanChangeSkin(displayplayers[3]) && !P_PlayerMoving(displayplayers[3]))
|
if (CanChangeSkin(displayplayers[3]) && !P_PlayerMoving(displayplayers[3]))
|
||||||
SendNameAndColor4();
|
SendNameAndColor(3);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
|
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
|
||||||
@@ -5999,7 +5662,7 @@ static void Color_OnChange(void)
|
|||||||
if (!P_PlayerMoving(consoleplayer))
|
if (!P_PlayerMoving(consoleplayer))
|
||||||
{
|
{
|
||||||
// Color change menu scrolling fix is no longer necessary
|
// Color change menu scrolling fix is no longer necessary
|
||||||
SendNameAndColor();
|
SendNameAndColor(0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -6021,7 +5684,7 @@ static void Color2_OnChange(void)
|
|||||||
if (!P_PlayerMoving(displayplayers[1]))
|
if (!P_PlayerMoving(displayplayers[1]))
|
||||||
{
|
{
|
||||||
// Color change menu scrolling fix is no longer necessary
|
// Color change menu scrolling fix is no longer necessary
|
||||||
SendNameAndColor2();
|
SendNameAndColor(1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -6038,7 +5701,7 @@ static void Color3_OnChange(void)
|
|||||||
if (!P_PlayerMoving(displayplayers[2]))
|
if (!P_PlayerMoving(displayplayers[2]))
|
||||||
{
|
{
|
||||||
// Color change menu scrolling fix is no longer necessary
|
// Color change menu scrolling fix is no longer necessary
|
||||||
SendNameAndColor3();
|
SendNameAndColor(2);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -6055,7 +5718,7 @@ static void Color4_OnChange(void)
|
|||||||
if (!P_PlayerMoving(displayplayers[3]))
|
if (!P_PlayerMoving(displayplayers[3]))
|
||||||
{
|
{
|
||||||
// Color change menu scrolling fix is no longer necessary
|
// Color change menu scrolling fix is no longer necessary
|
||||||
SendNameAndColor4();
|
SendNameAndColor(3);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
+3
-5
@@ -21,10 +21,7 @@ extern "C" {
|
|||||||
|
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
|
|
||||||
void SendWeaponPref(void);
|
void SendWeaponPref(UINT8 splitplayer);
|
||||||
void SendWeaponPref2(void);
|
|
||||||
void SendWeaponPref3(void);
|
|
||||||
void SendWeaponPref4(void);
|
|
||||||
|
|
||||||
// console vars
|
// console vars
|
||||||
extern consvar_t cv_playername;
|
extern consvar_t cv_playername;
|
||||||
@@ -158,6 +155,7 @@ 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;
|
||||||
|
|
||||||
@@ -295,7 +293,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(void);
|
void D_SendPlayerConfig(UINT8 splitplayer);
|
||||||
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
|
||||||
|
|||||||
+66
-17
@@ -116,6 +116,8 @@ 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
|
||||||
@@ -135,6 +137,8 @@ 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.
|
||||||
@@ -225,8 +229,11 @@ 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
|
||||||
READSTRINGN(p, fileneeded[i].filename, MAX_WADPATH); // The next bytes are the file name
|
READSTRINGL(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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -575,6 +582,48 @@ 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)
|
||||||
{
|
{
|
||||||
@@ -960,7 +1009,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 \"%s\"", filename);
|
I_Error("Tried to download base-game file: \"%s\"", filename);
|
||||||
|
|
||||||
if (filenum >= fileneedednum)
|
if (filenum >= fileneedednum)
|
||||||
{
|
{
|
||||||
@@ -1019,21 +1068,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);
|
||||||
|
|||||||
@@ -40,6 +40,15 @@ 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?
|
||||||
@@ -51,11 +60,13 @@ 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
|
||||||
{
|
{
|
||||||
@@ -91,6 +102,7 @@ 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);
|
||||||
|
|||||||
@@ -735,6 +735,18 @@ const char *I_GetJoyName(INT32 joyindex)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean I_GamepadHasLED(INT32 playernum)
|
||||||
|
{
|
||||||
|
(void)playernum;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean I_GamepadHasRumble(INT32 playernum)
|
||||||
|
{
|
||||||
|
(void)playernum;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration)
|
void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration)
|
||||||
{
|
{
|
||||||
(void)playernum;
|
(void)playernum;
|
||||||
@@ -984,7 +996,7 @@ void I_SleepDuration(precise_t duration)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean g_in_exiting_signal_handler = false;
|
static volatile sig_atomic_t 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)
|
||||||
{
|
{
|
||||||
@@ -1048,6 +1060,11 @@ 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)
|
||||||
{
|
{
|
||||||
@@ -1067,11 +1084,17 @@ FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FUNCNORETURN static ATTRNORETURN void quit_handler(int num)
|
static volatile sig_atomic_t interrupted = 0;
|
||||||
|
|
||||||
|
boolean I_Interrupted(void)
|
||||||
{
|
{
|
||||||
signal(num, SIG_DFL); //default signal action
|
return interrupted;
|
||||||
raise(num);
|
}
|
||||||
I_Quit();
|
|
||||||
|
static void quit_handler(int num)
|
||||||
|
{
|
||||||
|
(void)num;
|
||||||
|
interrupted = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_LIBBACKTRACE
|
#ifdef HAVE_LIBBACKTRACE
|
||||||
|
|||||||
@@ -115,6 +115,10 @@ INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VID_RefreshModeList(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void VID_PrepareModeList(void)
|
void VID_PrepareModeList(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -125,6 +129,13 @@ INT32 VID_SetMode(INT32 modeNum)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height)
|
||||||
|
{
|
||||||
|
(void)width;
|
||||||
|
(void)height;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void I_StartupGraphics(void)
|
void I_StartupGraphics(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
+155
-119
@@ -115,20 +115,25 @@ char *myfgets(char *buf, size_t bufsize, MYFILE *f)
|
|||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
if (myfeof(f))
|
if (myfeof(f))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// we need one byte for a null terminated string
|
// we need one byte for a null terminated string
|
||||||
bufsize--;
|
bufsize--;
|
||||||
|
|
||||||
while (i < bufsize && !myfeof(f))
|
while (i < bufsize && !myfeof(f))
|
||||||
{
|
{
|
||||||
char c = *f->curpos++;
|
char c = *f->curpos++;
|
||||||
|
|
||||||
if (c == '^')
|
if (c == '^')
|
||||||
buf[i++] = myfget_color(f);
|
buf[i++] = myfget_color(f);
|
||||||
else if (c == '\\')
|
else if (c == '\\')
|
||||||
buf[i++] = myfget_hex(f);
|
buf[i++] = myfget_hex(f);
|
||||||
else if (c != '\r')
|
else if (c != '\r')
|
||||||
buf[i++] = c;
|
buf[i++] = c;
|
||||||
|
|
||||||
if (c == '\n')
|
if (c == '\n')
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf[i] = '\0';
|
buf[i] = '\0';
|
||||||
|
|
||||||
dbg_line++;
|
dbg_line++;
|
||||||
@@ -138,25 +143,31 @@ char *myfgets(char *buf, size_t bufsize, MYFILE *f)
|
|||||||
static char *myhashfgets(char *buf, size_t bufsize, MYFILE *f)
|
static char *myhashfgets(char *buf, size_t bufsize, MYFILE *f)
|
||||||
{
|
{
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
if (myfeof(f))
|
if (myfeof(f))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// we need one byte for a null terminated string
|
// we need one byte for a null terminated string
|
||||||
bufsize--;
|
bufsize--;
|
||||||
|
|
||||||
while (i < bufsize && !myfeof(f))
|
while (i < bufsize && !myfeof(f))
|
||||||
{
|
{
|
||||||
char c = *f->curpos++;
|
char c = *f->curpos++;
|
||||||
|
|
||||||
if (c == '^')
|
if (c == '^')
|
||||||
buf[i++] = myfget_color(f);
|
buf[i++] = myfget_color(f);
|
||||||
else if (c == '\\')
|
else if (c == '\\')
|
||||||
buf[i++] = myfget_hex(f);
|
buf[i++] = myfget_hex(f);
|
||||||
else if (c != '\r')
|
else if (c != '\r')
|
||||||
buf[i++] = c;
|
buf[i++] = c;
|
||||||
|
|
||||||
if (c == '\n') // Ensure debug line is right...
|
if (c == '\n') // Ensure debug line is right...
|
||||||
dbg_line++;
|
dbg_line++;
|
||||||
|
|
||||||
if (c == '#')
|
if (c == '#')
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
i++;
|
|
||||||
buf[i] = '\0';
|
buf[i] = '\0';
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
@@ -173,7 +184,7 @@ FUNCPRINTF static void deh_warning(const char *first, ...)
|
|||||||
vsnprintf(buf, 1000, first, argptr); // sizeof only returned 4 here. it didn't like that pointer.
|
vsnprintf(buf, 1000, first, argptr); // sizeof only returned 4 here. it didn't like that pointer.
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
|
|
||||||
if(dbg_line == -1) // Not in a SOC, line number unknown.
|
if (dbg_line == -1) // Not in a SOC, line number unknown.
|
||||||
CONS_Alert(CONS_WARNING, "%s\n", buf);
|
CONS_Alert(CONS_WARNING, "%s\n", buf);
|
||||||
else
|
else
|
||||||
CONS_Alert(CONS_WARNING, "Line %u: %s\n", dbg_line, buf);
|
CONS_Alert(CONS_WARNING, "Line %u: %s\n", dbg_line, buf);
|
||||||
@@ -261,7 +272,6 @@ static void clear_levels(void)
|
|||||||
// (no need to set num to 0, we're freeing the entire header shortly)
|
// (no need to set num to 0, we're freeing the entire header shortly)
|
||||||
Z_Free(mapheaderinfo[i]->customopts);
|
Z_Free(mapheaderinfo[i]->customopts);
|
||||||
|
|
||||||
P_DeleteGrades(i);
|
|
||||||
Z_Free(mapheaderinfo[i]);
|
Z_Free(mapheaderinfo[i]);
|
||||||
mapheaderinfo[i] = NULL;
|
mapheaderinfo[i] = NULL;
|
||||||
}
|
}
|
||||||
@@ -315,7 +325,10 @@ static void readPlayer(MYFILE *f, INT32 num)
|
|||||||
goto done;
|
goto done;
|
||||||
PlayerMenu[num].status = IT_CALL;
|
PlayerMenu[num].status = IT_CALL;
|
||||||
|
|
||||||
for (i = 0; i < MAXLINELEN-3; i++)
|
// A friendly neighborhood alias for brevity's sake
|
||||||
|
const size_t note_size = sizeof(description[num].notes);
|
||||||
|
|
||||||
|
for (i = 0; i < (INT32)(MAXLINELEN-note_size-3); i++)
|
||||||
{
|
{
|
||||||
if (s[i] == '=')
|
if (s[i] == '=')
|
||||||
{
|
{
|
||||||
@@ -323,10 +336,12 @@ static void readPlayer(MYFILE *f, INT32 num)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (playertext)
|
if (playertext)
|
||||||
{
|
{
|
||||||
strcpy(description[num].notes, playertext);
|
strlcpy(description[num].notes, playertext, note_size);
|
||||||
strcat(description[num].notes, myhashfgets(playertext, sizeof (description[num].notes), f));
|
strlcat(description[num].notes,
|
||||||
|
myhashfgets(playertext, note_size, f), note_size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
strcpy(description[num].notes, "");
|
strcpy(description[num].notes, "");
|
||||||
@@ -335,7 +350,7 @@ static void readPlayer(MYFILE *f, INT32 num)
|
|||||||
// It works down here, though.
|
// It works down here, though.
|
||||||
{
|
{
|
||||||
INT32 numline = 0;
|
INT32 numline = 0;
|
||||||
for (i = 0; (size_t)i < sizeof(description[num].notes)-1; i++)
|
for (i = 0; (size_t)i < note_size-1; i++)
|
||||||
{
|
{
|
||||||
if (numline < 20 && description[num].notes[i] == '\n')
|
if (numline < 20 && description[num].notes[i] == '\n')
|
||||||
numline++;
|
numline++;
|
||||||
@@ -344,6 +359,7 @@ static void readPlayer(MYFILE *f, INT32 num)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
description[num].notes[strlen(description[num].notes)-1] = '\0';
|
description[num].notes[strlen(description[num].notes)-1] = '\0';
|
||||||
description[num].notes[i] = '\0';
|
description[num].notes[i] = '\0';
|
||||||
continue;
|
continue;
|
||||||
@@ -819,22 +835,8 @@ static void readlevelheader(MYFILE *f, INT32 num, INT32 wadnum)
|
|||||||
// Now go to uppercase
|
// Now go to uppercase
|
||||||
strupr(word2);
|
strupr(word2);
|
||||||
|
|
||||||
// NiGHTS grades
|
|
||||||
if (fastncmp(word, "GRADES", 6))
|
|
||||||
{
|
|
||||||
UINT8 mare = (UINT8)atoi(word + 6);
|
|
||||||
|
|
||||||
if (mare <= 0 || mare > 8)
|
|
||||||
{
|
|
||||||
deh_warning("Level header %d: unknown word '%s'", num, word);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
P_AddGradesForMare((INT16)(num-1), mare-1, word2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Strings that can be truncated
|
// Strings that can be truncated
|
||||||
else if (fastcmp(word, "SCRIPTNAME"))
|
if (fastcmp(word, "SCRIPTNAME"))
|
||||||
{
|
{
|
||||||
deh_strlcpy(mapheaderinfo[num-1]->scriptname, word2,
|
deh_strlcpy(mapheaderinfo[num-1]->scriptname, word2,
|
||||||
sizeof(mapheaderinfo[num-1]->scriptname), va("Level header %d: scriptname", num));
|
sizeof(mapheaderinfo[num-1]->scriptname), va("Level header %d: scriptname", num));
|
||||||
@@ -846,10 +848,6 @@ static void readlevelheader(MYFILE *f, INT32 num, INT32 wadnum)
|
|||||||
}
|
}
|
||||||
else if (fastcmp(word, "ACT"))
|
else if (fastcmp(word, "ACT"))
|
||||||
{
|
{
|
||||||
/*if (i >= 0 && i < 20) // 0 for no act number, TTL1 through TTL19
|
|
||||||
mapheaderinfo[num-1]->actnum = (UINT8)i;
|
|
||||||
else
|
|
||||||
deh_warning("Level header %d: invalid act number %d", num, i);*/
|
|
||||||
deh_strlcpy(mapheaderinfo[num-1]->actnum, word2,
|
deh_strlcpy(mapheaderinfo[num-1]->actnum, word2,
|
||||||
sizeof(mapheaderinfo[num-1]->actnum), va("Level header %d: actnum", num));
|
sizeof(mapheaderinfo[num-1]->actnum), va("Level header %d: actnum", num));
|
||||||
}
|
}
|
||||||
@@ -914,11 +912,7 @@ static void readlevelheader(MYFILE *f, INT32 num, INT32 wadnum)
|
|||||||
mapheaderinfo[num-1]->mustrack = ((UINT16)i - 1);
|
mapheaderinfo[num-1]->mustrack = ((UINT16)i - 1);
|
||||||
else if (fastcmp(word, "MUSICPOS"))
|
else if (fastcmp(word, "MUSICPOS"))
|
||||||
mapheaderinfo[num-1]->muspos = (UINT32)get_number(word2);
|
mapheaderinfo[num-1]->muspos = (UINT32)get_number(word2);
|
||||||
else if (fastcmp(word, "MUSICINTERFADEOUT"))
|
|
||||||
mapheaderinfo[num-1]->musinterfadeout = (UINT32)get_number(word2);
|
|
||||||
else if (fastcmp(word, "MUSICINTER"))
|
|
||||||
deh_strlcpy(mapheaderinfo[num-1]->musintername, word2,
|
|
||||||
sizeof(mapheaderinfo[num-1]->musintername), va("Level header %d: intermission music", num));
|
|
||||||
else if (fastcmp(word, "FORCECHARACTER"))
|
else if (fastcmp(word, "FORCECHARACTER"))
|
||||||
{
|
{
|
||||||
strlcpy(mapheaderinfo[num-1]->forcecharacter, word2, SKINNAMESIZE+1);
|
strlcpy(mapheaderinfo[num-1]->forcecharacter, word2, SKINNAMESIZE+1);
|
||||||
@@ -960,44 +954,12 @@ static void readlevelheader(MYFILE *f, INT32 num, INT32 wadnum)
|
|||||||
else if (fastcmp(word, "SKYBOXSCALEZ"))
|
else if (fastcmp(word, "SKYBOXSCALEZ"))
|
||||||
mapheaderinfo[num-1]->skybox_scalez = (INT16)i;
|
mapheaderinfo[num-1]->skybox_scalez = (INT16)i;
|
||||||
|
|
||||||
else if (fastcmp(word, "BONUSTYPE"))
|
|
||||||
{
|
|
||||||
if (fastcmp(word2, "NONE")) i = -1;
|
|
||||||
else if (fastcmp(word2, "NORMAL")) i = 0;
|
|
||||||
else if (fastcmp(word2, "BOSS")) i = 1;
|
|
||||||
else if (fastcmp(word2, "ERZ3")) i = 2;
|
|
||||||
|
|
||||||
if (i >= -1 && i <= 2) // -1 for no bonus. Max is 2.
|
|
||||||
mapheaderinfo[num-1]->bonustype = (SINT8)i;
|
|
||||||
else
|
|
||||||
deh_warning("Level header %d: invalid bonus type number %d", num, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (fastcmp(word, "SAVEOVERRIDE"))
|
|
||||||
{
|
|
||||||
if (fastcmp(word2, "DEFAULT")) i = SAVE_DEFAULT;
|
|
||||||
else if (fastcmp(word2, "ALWAYS")) i = SAVE_ALWAYS;
|
|
||||||
else if (fastcmp(word2, "NEVER")) i = SAVE_NEVER;
|
|
||||||
|
|
||||||
if (i >= SAVE_NEVER && i <= SAVE_ALWAYS)
|
|
||||||
mapheaderinfo[num-1]->saveoverride = (SINT8)i;
|
|
||||||
else
|
|
||||||
deh_warning("Level header %d: invalid save override number %d", num, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (fastcmp(word, "LEVELFLAGS"))
|
else if (fastcmp(word, "LEVELFLAGS"))
|
||||||
mapheaderinfo[num-1]->levelflags = get_number(word2);
|
mapheaderinfo[num-1]->levelflags = get_number(word2);
|
||||||
else if (fastcmp(word, "MENUFLAGS"))
|
else if (fastcmp(word, "MENUFLAGS"))
|
||||||
mapheaderinfo[num-1]->menuflags = get_number(word2);
|
mapheaderinfo[num-1]->menuflags = get_number(word2);
|
||||||
|
|
||||||
// SRB2Kart
|
// SRB2Kart
|
||||||
/*else if (fastcmp(word, "AUTOMAP"))
|
|
||||||
{
|
|
||||||
if (i || word2[0] == 'T' || word2[0] == 'Y')
|
|
||||||
mapheaderinfo[num-1]->automap = true;
|
|
||||||
else
|
|
||||||
mapheaderinfo[num-1]->automap = false;
|
|
||||||
}*/
|
|
||||||
else if (fastcmp(word, "MOBJSCALE"))
|
else if (fastcmp(word, "MOBJSCALE"))
|
||||||
mapheaderinfo[num-1]->mobj_scale = get_number(word2);
|
mapheaderinfo[num-1]->mobj_scale = get_number(word2);
|
||||||
else if (fastcmp(word, "LIGHTCONTRAST") || fastcmp(word, "ENCORELIGHTCONTRAST"))
|
else if (fastcmp(word, "LIGHTCONTRAST") || fastcmp(word, "ENCORELIGHTCONTRAST"))
|
||||||
@@ -1110,6 +1072,26 @@ static void readlevelheader(MYFILE *f, INT32 num, INT32 wadnum)
|
|||||||
else
|
else
|
||||||
mapheaderinfo[num-1]->menuflags &= ~LF2_NOVISITNEEDED;
|
mapheaderinfo[num-1]->menuflags &= ~LF2_NOVISITNEEDED;
|
||||||
}
|
}
|
||||||
|
else if (fastcmp(word, "MUSICINTERFADEOUT"))
|
||||||
|
{
|
||||||
|
continue; // unused
|
||||||
|
}
|
||||||
|
else if (fastcmp(word, "MUSICINTER"))
|
||||||
|
{
|
||||||
|
continue; // unused
|
||||||
|
}
|
||||||
|
else if (fastcmp(word, "BONUSTYPE"))
|
||||||
|
{
|
||||||
|
continue; // unused
|
||||||
|
}
|
||||||
|
else if (fastcmp(word, "SAVEOVERRIDE"))
|
||||||
|
{
|
||||||
|
continue; // unused
|
||||||
|
}
|
||||||
|
else if (fastncmp(word, "GRADES", 6)) // NiGHTS grades
|
||||||
|
{
|
||||||
|
continue; // unused
|
||||||
|
}
|
||||||
else
|
else
|
||||||
deh_warning("Level header %d: unknown word '%s'", num, word);
|
deh_warning("Level header %d: unknown word '%s'", num, word);
|
||||||
}
|
}
|
||||||
@@ -1200,7 +1182,6 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
|
|||||||
i = atoi(word2);
|
i = atoi(word2);
|
||||||
usi = (UINT16)i;
|
usi = (UINT16)i;
|
||||||
|
|
||||||
|
|
||||||
if (fastcmp(word, "NUMBEROFPICS"))
|
if (fastcmp(word, "NUMBEROFPICS"))
|
||||||
{
|
{
|
||||||
cutscenes[num]->scene[scenenum].numpics = (UINT8)i;
|
cutscenes[num]->scene[scenenum].numpics = (UINT8)i;
|
||||||
@@ -1881,16 +1862,8 @@ static void reademblemdata(MYFILE *f, INT32 num)
|
|||||||
emblemlocations[num-1].type = ET_GLOBAL;
|
emblemlocations[num-1].type = ET_GLOBAL;
|
||||||
else if (fastcmp(word2, "SKIN"))
|
else if (fastcmp(word2, "SKIN"))
|
||||||
emblemlocations[num-1].type = ET_SKIN;
|
emblemlocations[num-1].type = ET_SKIN;
|
||||||
/*else if (fastcmp(word2, "SCORE"))
|
|
||||||
emblemlocations[num-1].type = ET_SCORE;*/
|
|
||||||
else if (fastcmp(word2, "TIME"))
|
else if (fastcmp(word2, "TIME"))
|
||||||
emblemlocations[num-1].type = ET_TIME;
|
emblemlocations[num-1].type = ET_TIME;
|
||||||
/*else if (fastcmp(word2, "RINGS"))
|
|
||||||
emblemlocations[num-1].type = ET_RINGS;
|
|
||||||
else if (fastcmp(word2, "NGRADE"))
|
|
||||||
emblemlocations[num-1].type = ET_NGRADE;
|
|
||||||
else if (fastcmp(word2, "NTIME"))
|
|
||||||
emblemlocations[num-1].type = ET_NTIME;*/
|
|
||||||
else
|
else
|
||||||
emblemlocations[num-1].type = (UINT8)value;
|
emblemlocations[num-1].type = (UINT8)value;
|
||||||
}
|
}
|
||||||
@@ -2179,14 +2152,11 @@ static void readcondition(UINT8 set, UINT32 id, char *word2)
|
|||||||
}
|
}
|
||||||
else if ((offset=0) || fastcmp(params[0], "GAMECLEAR")
|
else if ((offset=0) || fastcmp(params[0], "GAMECLEAR")
|
||||||
|| (++offset && fastcmp(params[0], "ALLEMERALDS")))
|
|| (++offset && fastcmp(params[0], "ALLEMERALDS")))
|
||||||
//|| (++offset && fastcmp(params[0], "ULTIMATECLEAR")))
|
|
||||||
{
|
{
|
||||||
ty = UC_GAMECLEAR + offset;
|
ty = UC_GAMECLEAR + offset;
|
||||||
re = (params[1]) ? atoi(params[1]) : 1;
|
re = (params[1]) ? atoi(params[1]) : 1;
|
||||||
}
|
}
|
||||||
else if ((offset=0) || fastcmp(params[0], "OVERALLTIME"))
|
else if ((offset=0) || fastcmp(params[0], "OVERALLTIME"))
|
||||||
//|| (++offset && fastcmp(params[0], "OVERALLSCORE"))
|
|
||||||
//|| (++offset && fastcmp(params[0], "OVERALLRINGS")))
|
|
||||||
{
|
{
|
||||||
PARAMCHECK(1);
|
PARAMCHECK(1);
|
||||||
ty = UC_OVERALLTIME + offset;
|
ty = UC_OVERALLTIME + offset;
|
||||||
@@ -2195,8 +2165,6 @@ static void readcondition(UINT8 set, UINT32 id, char *word2)
|
|||||||
else if ((offset=0) || fastcmp(params[0], "MAPVISITED")
|
else if ((offset=0) || fastcmp(params[0], "MAPVISITED")
|
||||||
|| (++offset && fastcmp(params[0], "MAPBEATEN"))
|
|| (++offset && fastcmp(params[0], "MAPBEATEN"))
|
||||||
|| (++offset && fastcmp(params[0], "MAPALLEMERALDS")))
|
|| (++offset && fastcmp(params[0], "MAPALLEMERALDS")))
|
||||||
//|| (++offset && fastcmp(params[0], "MAPULTIMATE"))
|
|
||||||
//|| (++offset && fastcmp(params[0], "MAPPERFECT")))
|
|
||||||
{
|
{
|
||||||
PARAMCHECK(1);
|
PARAMCHECK(1);
|
||||||
ty = UC_MAPVISITED + offset;
|
ty = UC_MAPVISITED + offset;
|
||||||
@@ -2214,8 +2182,6 @@ static void readcondition(UINT8 set, UINT32 id, char *word2)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((offset=0) || fastcmp(params[0], "MAPTIME"))
|
else if ((offset=0) || fastcmp(params[0], "MAPTIME"))
|
||||||
//|| (++offset && fastcmp(params[0], "MAPSCORE"))
|
|
||||||
//|| (++offset && fastcmp(params[0], "MAPRINGS")))
|
|
||||||
{
|
{
|
||||||
PARAMCHECK(2);
|
PARAMCHECK(2);
|
||||||
ty = UC_MAPTIME + offset;
|
ty = UC_MAPTIME + offset;
|
||||||
@@ -2598,7 +2564,7 @@ static void readmaincfg(MYFILE *f)
|
|||||||
}
|
}
|
||||||
else if (fastcmp(word, "MAXXTRALIFE"))
|
else if (fastcmp(word, "MAXXTRALIFE"))
|
||||||
{
|
{
|
||||||
maxXtraLife = (UINT8)get_number(word2);
|
continue; // unused
|
||||||
}
|
}
|
||||||
else if (fastcmp(word, "GAMEDATA"))
|
else if (fastcmp(word, "GAMEDATA"))
|
||||||
{
|
{
|
||||||
@@ -2628,6 +2594,7 @@ static void readmaincfg(MYFILE *f)
|
|||||||
strcatbf(savegamename, srb2home, PATHSEP);
|
strcatbf(savegamename, srb2home, PATHSEP);
|
||||||
|
|
||||||
refreshdirmenu |= REFRESHDIR_GAMEDATA;*/
|
refreshdirmenu |= REFRESHDIR_GAMEDATA;*/
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
else if (fastcmp(word, "RESETDATA"))
|
else if (fastcmp(word, "RESETDATA"))
|
||||||
{
|
{
|
||||||
@@ -2845,12 +2812,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
|||||||
|
|
||||||
deh_num_warning = 0;
|
deh_num_warning = 0;
|
||||||
// save values for cross reference
|
// save values for cross reference
|
||||||
/*
|
|
||||||
for (i = 0; i < NUMSTATES; i++)
|
|
||||||
saveactions[i] = states[i].action;
|
|
||||||
for (i = 0; i < NUMSPRITES; i++)
|
|
||||||
savesprnames[i] = sprnames[i];
|
|
||||||
*/
|
|
||||||
for (i = 0; i < NUMSFX; i++)
|
for (i = 0; i < NUMSFX; i++)
|
||||||
savesfxnames[i] = S_sfx[i].name;
|
savesfxnames[i] = S_sfx[i].name;
|
||||||
|
|
||||||
@@ -3157,11 +3118,8 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
|||||||
if (deh_num_warning)
|
if (deh_num_warning)
|
||||||
{
|
{
|
||||||
CONS_Printf(M_GetText("%d warning%s in the SOC lump\n"), deh_num_warning, deh_num_warning == 1 ? "" : "s");
|
CONS_Printf(M_GetText("%d warning%s in the SOC lump\n"), deh_num_warning, deh_num_warning == 1 ? "" : "s");
|
||||||
if (devparm) {
|
if (devparm)
|
||||||
I_Error("%s%s",va(M_GetText("%d warning%s in the SOC lump\n"), deh_num_warning, deh_num_warning == 1 ? "" : "s"), M_GetText("See log.txt for details.\n"));
|
I_Error("%s%s",va(M_GetText("%d warning%s in the SOC lump\n"), deh_num_warning, deh_num_warning == 1 ? "" : "s"), M_GetText("See log.txt for details.\n"));
|
||||||
//while (!I_GetKey())
|
|
||||||
//I_OsPolling();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
deh_loaded = true;
|
deh_loaded = true;
|
||||||
@@ -8250,84 +8208,109 @@ struct {
|
|||||||
{NULL,0}
|
{NULL,0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Returns the vlaue of MT_ enumerations
|
||||||
static mobjtype_t get_mobjtype(const char *word)
|
static mobjtype_t get_mobjtype(const char *word)
|
||||||
{ // Returns the vlaue of MT_ enumerations
|
{
|
||||||
mobjtype_t i;
|
mobjtype_t i;
|
||||||
|
|
||||||
if (*word >= '0' && *word <= '9')
|
if (*word >= '0' && *word <= '9')
|
||||||
return atoi(word);
|
return atoi(word);
|
||||||
|
|
||||||
if (fastncmp("MT_",word,3))
|
if (fastncmp("MT_",word,3))
|
||||||
word += 3; // take off the MT_
|
word += 3; // take off the MT_
|
||||||
for (i = 0; i < NUMMOBJFREESLOTS; i++) {
|
|
||||||
|
for (i = 0; i < NUMMOBJFREESLOTS; i++)
|
||||||
|
{
|
||||||
if (!FREE_MOBJS[i])
|
if (!FREE_MOBJS[i])
|
||||||
break;
|
break;
|
||||||
if (fastcmp(word, FREE_MOBJS[i]))
|
if (fastcmp(word, FREE_MOBJS[i]))
|
||||||
return MT_FIRSTFREESLOT+i;
|
return MT_FIRSTFREESLOT+i;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < MT_FIRSTFREESLOT; i++)
|
for (i = 0; i < MT_FIRSTFREESLOT; i++)
|
||||||
if (fastcmp(word, MOBJTYPE_LIST[i]+3))
|
if (fastcmp(word, MOBJTYPE_LIST[i]+3))
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
deh_warning("Couldn't find mobjtype named 'MT_%s'",word);
|
deh_warning("Couldn't find mobjtype named 'MT_%s'",word);
|
||||||
return MT_BLUECRAWLA;
|
return MT_BLUECRAWLA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the value of S_ enumerations
|
||||||
static statenum_t get_state(const char *word)
|
static statenum_t get_state(const char *word)
|
||||||
{ // Returns the value of S_ enumerations
|
{
|
||||||
statenum_t i;
|
statenum_t i;
|
||||||
if (*word >= '0' && *word <= '9')
|
if (*word >= '0' && *word <= '9')
|
||||||
return atoi(word);
|
return atoi(word);
|
||||||
|
|
||||||
if (fastncmp("S_",word,2))
|
if (fastncmp("S_",word,2))
|
||||||
word += 2; // take off the S_
|
word += 2; // take off the S_
|
||||||
for (i = 0; i < NUMSTATEFREESLOTS; i++) {
|
|
||||||
|
for (i = 0; i < NUMSTATEFREESLOTS; i++)
|
||||||
|
{
|
||||||
if (!FREE_STATES[i])
|
if (!FREE_STATES[i])
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (fastcmp(word, FREE_STATES[i]))
|
if (fastcmp(word, FREE_STATES[i]))
|
||||||
return S_FIRSTFREESLOT+i;
|
return S_FIRSTFREESLOT+i;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < S_FIRSTFREESLOT; i++)
|
for (i = 0; i < S_FIRSTFREESLOT; i++)
|
||||||
if (fastcmp(word, STATE_LIST[i]+2))
|
if (fastcmp(word, STATE_LIST[i]+2))
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
deh_warning("Couldn't find state named 'S_%s'",word);
|
deh_warning("Couldn't find state named 'S_%s'",word);
|
||||||
return S_NULL;
|
return S_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the value of SPR_ enumerations
|
||||||
static spritenum_t get_sprite(const char *word)
|
static spritenum_t get_sprite(const char *word)
|
||||||
{ // Returns the value of SPR_ enumerations
|
{
|
||||||
spritenum_t i;
|
spritenum_t i;
|
||||||
if (*word >= '0' && *word <= '9')
|
if (*word >= '0' && *word <= '9')
|
||||||
return atoi(word);
|
return atoi(word);
|
||||||
|
|
||||||
if (fastncmp("SPR_",word,4))
|
if (fastncmp("SPR_",word,4))
|
||||||
word += 4; // take off the SPR_
|
word += 4; // take off the SPR_
|
||||||
|
|
||||||
for (i = 0; i < NUMSPRITES; i++)
|
for (i = 0; i < NUMSPRITES; i++)
|
||||||
if (!sprnames[i][4] && memcmp(word,sprnames[i],4)==0)
|
if (!sprnames[i][4] && memcmp(word,sprnames[i],4) == 0)
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
deh_warning("Couldn't find sprite named 'SPR_%s'",word);
|
deh_warning("Couldn't find sprite named 'SPR_%s'",word);
|
||||||
return SPR_NULL;
|
return SPR_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the value of SFX_ enumerations
|
||||||
static sfxenum_t get_sfx(const char *word)
|
static sfxenum_t get_sfx(const char *word)
|
||||||
{ // Returns the value of SFX_ enumerations
|
{
|
||||||
sfxenum_t i;
|
sfxenum_t i;
|
||||||
|
|
||||||
if (*word >= '0' && *word <= '9')
|
if (*word >= '0' && *word <= '9')
|
||||||
return atoi(word);
|
return atoi(word);
|
||||||
|
|
||||||
if (fastncmp("SFX_",word,4))
|
if (fastncmp("SFX_",word,4))
|
||||||
word += 4; // take off the SFX_
|
word += 4; // take off the SFX_
|
||||||
else if (fastncmp("DS",word,2))
|
else if (fastncmp("DS",word,2))
|
||||||
word += 2; // take off the DS
|
word += 2; // take off the DS
|
||||||
|
|
||||||
for (i = 0; i < NUMSFX; i++)
|
for (i = 0; i < NUMSFX; i++)
|
||||||
if (S_sfx[i].name && fasticmp(word, S_sfx[i].name))
|
if (S_sfx[i].name && fasticmp(word, S_sfx[i].name))
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
deh_warning("Couldn't find sfx named 'SFX_%s'",word);
|
deh_warning("Couldn't find sfx named 'SFX_%s'",word);
|
||||||
return sfx_None;
|
return sfx_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MUSICSLOT_COMPATIBILITY
|
#ifdef MUSICSLOT_COMPATIBILITY
|
||||||
|
// Returns the value of MUS_ enumerations
|
||||||
static UINT16 get_mus(const char *word, UINT8 dehacked_mode)
|
static UINT16 get_mus(const char *word, UINT8 dehacked_mode)
|
||||||
{ // Returns the value of MUS_ enumerations
|
{
|
||||||
UINT16 i;
|
UINT16 i;
|
||||||
char lumptmp[4];
|
char lumptmp[4];
|
||||||
|
|
||||||
if (*word >= '0' && *word <= '9')
|
if (*word >= '0' && *word <= '9')
|
||||||
return atoi(word);
|
return atoi(word);
|
||||||
|
|
||||||
if (!word[2] && toupper(word[0]) >= 'A' && toupper(word[0]) <= 'Z')
|
if (!word[2] && toupper(word[0]) >= 'A' && toupper(word[0]) <= 'Z')
|
||||||
return (UINT16)M_MapNumber(word[0], word[1]);
|
return (UINT16)M_MapNumber(word[0], word[1]);
|
||||||
|
|
||||||
@@ -8351,25 +8334,33 @@ static UINT16 get_mus(const char *word, UINT8 dehacked_mode)
|
|||||||
deh_warning("Couldn't find music named 'MUS_%s'",word);
|
deh_warning("Couldn't find music named 'MUS_%s'",word);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; compat_special_music_slots[i][0]; ++i)
|
for (i = 0; compat_special_music_slots[i][0]; ++i)
|
||||||
if (fasticmp(word, compat_special_music_slots[i]))
|
if (fasticmp(word, compat_special_music_slots[i]))
|
||||||
return i + 1036;
|
return i + 1036;
|
||||||
|
|
||||||
if (dehacked_mode)
|
if (dehacked_mode)
|
||||||
deh_warning("Couldn't find music named 'MUS_%s'",word);
|
deh_warning("Couldn't find music named 'MUS_%s'",word);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Returns the value of HUD_ enumerations
|
||||||
static hudnum_t get_huditem(const char *word)
|
static hudnum_t get_huditem(const char *word)
|
||||||
{ // Returns the value of HUD_ enumerations
|
{
|
||||||
hudnum_t i;
|
hudnum_t i;
|
||||||
|
|
||||||
if (*word >= '0' && *word <= '9')
|
if (*word >= '0' && *word <= '9')
|
||||||
return atoi(word);
|
return atoi(word);
|
||||||
|
|
||||||
if (fastncmp("HUD_",word,4))
|
if (fastncmp("HUD_",word,4))
|
||||||
word += 4; // take off the HUD_
|
word += 4; // take off the HUD_
|
||||||
|
|
||||||
for (i = 0; i < NUMHUDITEMS; i++)
|
for (i = 0; i < NUMHUDITEMS; i++)
|
||||||
if (fastcmp(word, HUDITEMS_LIST[i]))
|
if (fastcmp(word, HUDITEMS_LIST[i]))
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
deh_warning("Couldn't find huditem named 'HUD_%s'",word);
|
deh_warning("Couldn't find huditem named 'HUD_%s'",word);
|
||||||
return HUD_LIVESNAME;
|
return HUD_LIVESNAME;
|
||||||
}
|
}
|
||||||
@@ -8416,15 +8407,16 @@ static inline int lib_freeslot(lua_State *L)
|
|||||||
{
|
{
|
||||||
int n = lua_gettop(L);
|
int n = lua_gettop(L);
|
||||||
int r = 0; // args returned
|
int r = 0; // args returned
|
||||||
char *s, *type,*word;
|
char *s, *type, *word;
|
||||||
|
|
||||||
while (n-- > 0)
|
while (n-- > 0)
|
||||||
{
|
{
|
||||||
s = Z_StrDup(luaL_checkstring(L,1));
|
s = Z_StrDup(luaL_checkstring(L,1));
|
||||||
type = strtok(s, "_");
|
type = strtok(s, "_");
|
||||||
if (type)
|
if (type)
|
||||||
strupr(type);
|
strupr(type);
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
Z_Free(s);
|
Z_Free(s);
|
||||||
return luaL_error(L, "Unknown enum type in '%s'\n", luaL_checkstring(L, 1));
|
return luaL_error(L, "Unknown enum type in '%s'\n", luaL_checkstring(L, 1));
|
||||||
}
|
}
|
||||||
@@ -8432,19 +8424,25 @@ static inline int lib_freeslot(lua_State *L)
|
|||||||
word = strtok(NULL, "\n");
|
word = strtok(NULL, "\n");
|
||||||
if (word)
|
if (word)
|
||||||
strupr(word);
|
strupr(word);
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
Z_Free(s);
|
Z_Free(s);
|
||||||
return luaL_error(L, "Missing enum name in '%s'\n", luaL_checkstring(L, 1));
|
return luaL_error(L, "Missing enum name in '%s'\n", luaL_checkstring(L, 1));
|
||||||
}
|
}
|
||||||
if (fastcmp(type, "SFX")) {
|
|
||||||
|
if (fastcmp(type, "SFX"))
|
||||||
|
{
|
||||||
sfxenum_t sfx;
|
sfxenum_t sfx;
|
||||||
strlwr(word);
|
strlwr(word);
|
||||||
CONS_Printf("Sound sfx_%s allocated.\n",word);
|
CONS_Printf("Sound sfx_%s allocated.\n",word);
|
||||||
sfx = S_AddSoundFx(word, false, 0, false);
|
sfx = S_AddSoundFx(word, false, 0, false);
|
||||||
if (sfx != sfx_None) {
|
|
||||||
|
if (sfx != sfx_None)
|
||||||
|
{
|
||||||
lua_pushinteger(L, sfx);
|
lua_pushinteger(L, sfx);
|
||||||
r++;
|
r++;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
I_Error("Out of Sfx Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word); //Should never get here since S_AddSoundFx was changed to throw I_Error when it can't allocate
|
I_Error("Out of Sfx Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word); //Should never get here since S_AddSoundFx was changed to throw I_Error when it can't allocate
|
||||||
}
|
}
|
||||||
else if (fastcmp(type, "SPR"))
|
else if (fastcmp(type, "SPR"))
|
||||||
@@ -8458,7 +8456,7 @@ static inline int lib_freeslot(lua_State *L)
|
|||||||
{
|
{
|
||||||
if (used_spr[(j-SPR_FIRSTFREESLOT)/8] & (1<<(j%8)))
|
if (used_spr[(j-SPR_FIRSTFREESLOT)/8] & (1<<(j%8)))
|
||||||
{
|
{
|
||||||
if (!sprnames[j][4] && memcmp(sprnames[j],word,4)==0)
|
if (!sprnames[j][4] && memcmp(sprnames[j], word, 4) == 0)
|
||||||
sprnames[j][4] = wad;
|
sprnames[j][4] = wad;
|
||||||
continue; // Already allocated, next.
|
continue; // Already allocated, next.
|
||||||
}
|
}
|
||||||
@@ -8476,6 +8474,7 @@ static inline int lib_freeslot(lua_State *L)
|
|||||||
r++;
|
r++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (j > SPR_LASTFREESLOT)
|
if (j > SPR_LASTFREESLOT)
|
||||||
I_Error("Out of Sprite Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
I_Error("Out of Sprite Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||||
}
|
}
|
||||||
@@ -8483,7 +8482,9 @@ static inline int lib_freeslot(lua_State *L)
|
|||||||
{
|
{
|
||||||
statenum_t i;
|
statenum_t i;
|
||||||
for (i = 0; i < NUMSTATEFREESLOTS; i++)
|
for (i = 0; i < NUMSTATEFREESLOTS; i++)
|
||||||
if (!FREE_STATES[i]) {
|
{
|
||||||
|
if (!FREE_STATES[i])
|
||||||
|
{
|
||||||
CONS_Printf("State S_%s allocated.\n",word);
|
CONS_Printf("State S_%s allocated.\n",word);
|
||||||
|
|
||||||
lua_pushcfunction(L, lua_glib_invalidate_cache);
|
lua_pushcfunction(L, lua_glib_invalidate_cache);
|
||||||
@@ -8497,6 +8498,8 @@ static inline int lib_freeslot(lua_State *L)
|
|||||||
r++;
|
r++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (i == NUMSTATEFREESLOTS)
|
if (i == NUMSTATEFREESLOTS)
|
||||||
I_Error("Out of State Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
I_Error("Out of State Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||||
}
|
}
|
||||||
@@ -8504,7 +8507,9 @@ static inline int lib_freeslot(lua_State *L)
|
|||||||
{
|
{
|
||||||
mobjtype_t i;
|
mobjtype_t i;
|
||||||
for (i = 0; i < NUMMOBJFREESLOTS; i++)
|
for (i = 0; i < NUMMOBJFREESLOTS; i++)
|
||||||
if (!FREE_MOBJS[i]) {
|
{
|
||||||
|
if (!FREE_MOBJS[i])
|
||||||
|
{
|
||||||
CONS_Printf("MobjType MT_%s allocated.\n",word);
|
CONS_Printf("MobjType MT_%s allocated.\n",word);
|
||||||
|
|
||||||
lua_pushcfunction(L, lua_glib_invalidate_cache);
|
lua_pushcfunction(L, lua_glib_invalidate_cache);
|
||||||
@@ -8518,13 +8523,17 @@ static inline int lib_freeslot(lua_State *L)
|
|||||||
r++;
|
r++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (i == NUMMOBJFREESLOTS)
|
if (i == NUMMOBJFREESLOTS)
|
||||||
I_Error("Out of Mobj Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
I_Error("Out of Mobj Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||||
}
|
}
|
||||||
|
|
||||||
Z_Free(s);
|
Z_Free(s);
|
||||||
lua_remove(L, 1);
|
lua_remove(L, 1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8537,15 +8546,17 @@ static inline int lib_action(lua_State *L)
|
|||||||
mobj_t *actor = *((mobj_t **)luaL_checkudata(L,1,META_MOBJ));
|
mobj_t *actor = *((mobj_t **)luaL_checkudata(L,1,META_MOBJ));
|
||||||
var1 = (INT32)luaL_optinteger(L,2,0);
|
var1 = (INT32)luaL_optinteger(L,2,0);
|
||||||
var2 = (INT32)luaL_optinteger(L,3,0);
|
var2 = (INT32)luaL_optinteger(L,3,0);
|
||||||
|
|
||||||
if (!actor)
|
if (!actor)
|
||||||
return LUA_ErrInvalid(L, "mobj_t");
|
return LUA_ErrInvalid(L, "mobj_t");
|
||||||
|
|
||||||
(*action)(actor);
|
(*action)(actor);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hardcoded A_Action name to call for super() or NULL if super() would be invalid.
|
// Hardcoded A_Action name to call for super() or NULL if super() would be invalid.
|
||||||
// Set in lua_infolib.
|
// Set in lua_infolib.
|
||||||
const char *superactions[MAXRECURSION];
|
const char *superactions[MAXRECURSION] = {};
|
||||||
UINT8 superstack = 0;
|
UINT8 superstack = 0;
|
||||||
|
|
||||||
static int lib_dummysuper(lua_State *L)
|
static int lib_dummysuper(lua_State *L)
|
||||||
@@ -8560,23 +8571,29 @@ FUNCINLINE static ATTRINLINE int lib_getenum(lua_State *L)
|
|||||||
|
|
||||||
const char *word;
|
const char *word;
|
||||||
boolean mathlib = lua_toboolean(L, UV_MATHLIB);
|
boolean mathlib = lua_toboolean(L, UV_MATHLIB);
|
||||||
|
|
||||||
if (lua_type(L,2) != LUA_TSTRING)
|
if (lua_type(L,2) != LUA_TSTRING)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
word = lua_tostring(L,2);
|
word = lua_tostring(L,2);
|
||||||
|
|
||||||
/* First check actions, as they can be overridden. */
|
/* First check actions, as they can be overridden. */
|
||||||
if (!mathlib && fastncmp("A_",word,2)) {
|
if (!mathlib && fastncmp("A_",word,2))
|
||||||
|
{
|
||||||
char *caps;
|
char *caps;
|
||||||
// Try to get a Lua action first.
|
// Try to get a Lua action first.
|
||||||
/// \todo Push a closure that sets superactions[] and superstack.
|
/// \todo Push a closure that sets superactions[] and superstack.
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, LREG_ACTIONS);
|
lua_getfield(L, LUA_REGISTRYINDEX, LREG_ACTIONS);
|
||||||
|
|
||||||
// actions are stored in all uppercase.
|
// actions are stored in all uppercase.
|
||||||
caps = Z_StrDup(word);
|
caps = Z_StrDup(word);
|
||||||
strupr(caps);
|
strupr(caps);
|
||||||
lua_getfield(L, -1, caps);
|
lua_getfield(L, -1, caps);
|
||||||
Z_Free(caps);
|
Z_Free(caps);
|
||||||
|
|
||||||
if (!lua_isnil(L, -1))
|
if (!lua_isnil(L, -1))
|
||||||
return 1; // Success! :D That was easy.
|
return 1; // Success! :D That was easy.
|
||||||
|
|
||||||
// Welp, that failed.
|
// Welp, that failed.
|
||||||
lua_pop(L, 2); // pop nil and LREG_ACTIONS
|
lua_pop(L, 2); // pop nil and LREG_ACTIONS
|
||||||
// Hardcoded actions are handled by the proxy.
|
// Hardcoded actions are handled by the proxy.
|
||||||
@@ -8585,12 +8602,14 @@ FUNCINLINE static ATTRINLINE int lib_getenum(lua_State *L)
|
|||||||
/* Then check the globals proxy table. */
|
/* Then check the globals proxy table. */
|
||||||
lua_pushvalue(L, 2);
|
lua_pushvalue(L, 2);
|
||||||
lua_gettable(L, GLIB_PROXY);
|
lua_gettable(L, GLIB_PROXY);
|
||||||
|
|
||||||
if (!lua_isnil(L, -1))
|
if (!lua_isnil(L, -1))
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mathlib) return luaL_error(L, "constant '%s' could not be parsed.\n", word);
|
if (mathlib)
|
||||||
|
return luaL_error(L, "constant '%s' could not be parsed.\n", word);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -8648,6 +8667,7 @@ static int lua_enumlib_server_get(lua_State *L)
|
|||||||
{
|
{
|
||||||
if ((!multiplayer || !(netgame || demo.playback)) && !playeringame[serverplayer])
|
if ((!multiplayer || !(netgame || demo.playback)) && !playeringame[serverplayer])
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
LUA_PushUserdata(L, &players[serverplayer], META_PLAYER);
|
LUA_PushUserdata(L, &players[serverplayer], META_PLAYER);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -8656,6 +8676,7 @@ static int lua_enumlib_consoleplayer_get(lua_State *L)
|
|||||||
{
|
{
|
||||||
if (consoleplayer < 0 || !playeringame[consoleplayer])
|
if (consoleplayer < 0 || !playeringame[consoleplayer])
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
LUA_PushUserdata(L, &players[consoleplayer], META_PLAYER);
|
LUA_PushUserdata(L, &players[consoleplayer], META_PLAYER);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -8848,12 +8869,15 @@ static int lua_enumlib_action_get(lua_State *L)
|
|||||||
const char *action = lua_tostring(L, 1);
|
const char *action = lua_tostring(L, 1);
|
||||||
|
|
||||||
for (int i = 0; actionpointers[i].name; i++)
|
for (int i = 0; actionpointers[i].name; i++)
|
||||||
if (fasticmp(action, actionpointers[i].name)) {
|
{
|
||||||
|
if (fasticmp(action, actionpointers[i].name))
|
||||||
|
{
|
||||||
// push lib_action as a C closure with the actionf_t* as an upvalue.
|
// push lib_action as a C closure with the actionf_t* as an upvalue.
|
||||||
lua_pushlightuserdata(L, &actionpointers[i].action);
|
lua_pushlightuserdata(L, &actionpointers[i].action);
|
||||||
lua_pushcclosure(L, lib_action, 1);
|
lua_pushcclosure(L, lib_action, 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -8871,8 +8895,13 @@ static char *lua_enumlib_sprintf_upper(char **buf, int* size, const char *format
|
|||||||
va_list va;
|
va_list va;
|
||||||
va_start(va, format);
|
va_start(va, format);
|
||||||
|
|
||||||
int length = vsnprintf(*buf, *size, format, va);
|
va_list vacpy;
|
||||||
if (length > *size)
|
va_copy(vacpy, va);
|
||||||
|
|
||||||
|
int length = vsnprintf(*buf, *size, format, vacpy);
|
||||||
|
va_end(vacpy);
|
||||||
|
|
||||||
|
if (length >= *size)
|
||||||
{
|
{
|
||||||
void *ptr = realloc(*buf, length+1);
|
void *ptr = realloc(*buf, length+1);
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
@@ -8880,12 +8909,13 @@ static char *lua_enumlib_sprintf_upper(char **buf, int* size, const char *format
|
|||||||
va_end(va);
|
va_end(va);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
*buf = ptr;
|
*buf = ptr;
|
||||||
*size = length+1;
|
*size = length+1;
|
||||||
|
|
||||||
va_start(va, format);
|
length = vsnprintf(*buf, *size, format, va);
|
||||||
vsnprintf(*buf, *size, format, va);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(va);
|
va_end(va);
|
||||||
|
|
||||||
for (int i = 0; i < length; i++)
|
for (int i = 0; i < length; i++)
|
||||||
@@ -8910,11 +8940,14 @@ static int lua_enumlib_super_get(lua_State *L)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; actionpointers[i].name; i++)
|
for (int i = 0; actionpointers[i].name; i++)
|
||||||
if (fasticmp(superactions[superstack-1], actionpointers[i].name)) {
|
{
|
||||||
|
if (fasticmp(superactions[superstack-1], actionpointers[i].name))
|
||||||
|
{
|
||||||
lua_pushlightuserdata(L, &actionpointers[i].action);
|
lua_pushlightuserdata(L, &actionpointers[i].action);
|
||||||
lua_pushcclosure(L, lib_action, 1);
|
lua_pushcclosure(L, lib_action, 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -9383,7 +9416,10 @@ enum actionnum LUA_GetActionNumByName(const char *actiontocompare)
|
|||||||
{
|
{
|
||||||
size_t z;
|
size_t z;
|
||||||
for (z = 0; actionpointers[z].name; z++)
|
for (z = 0; actionpointers[z].name; z++)
|
||||||
|
{
|
||||||
if (fasticmp(actiontocompare, actionpointers[z].name))
|
if (fasticmp(actiontocompare, actionpointers[z].name))
|
||||||
return z;
|
return z;
|
||||||
|
}
|
||||||
|
|
||||||
return z;
|
return z;
|
||||||
}
|
}
|
||||||
@@ -13,6 +13,10 @@
|
|||||||
#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"
|
||||||
|
|
||||||
@@ -71,4 +75,9 @@ 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
|
||||||
+9
-18
@@ -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.2"
|
#define VERSIONSTRING "Saturn v9.3 - Testing"
|
||||||
#define VERSIONSTRINGW L"Saturn v9.2"
|
#define VERSIONSTRINGW L"Saturn v9.3 - Testing"
|
||||||
|
|
||||||
#define SATURN_TESTING // comment out for saturn release builds!
|
#define SATURN_TESTING // comment out for saturn release builds!
|
||||||
|
|
||||||
@@ -516,22 +516,6 @@ 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))
|
||||||
@@ -589,6 +573,13 @@ UINT32 quickncasehash (const char *p, size_t n)
|
|||||||
// 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__))
|
||||||
|
|||||||
+3
-39
@@ -205,12 +205,6 @@ 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
|
||||||
@@ -261,28 +255,16 @@ 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.
|
||||||
@@ -379,8 +361,6 @@ 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.
|
||||||
@@ -394,34 +374,19 @@ 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];
|
||||||
|
|
||||||
// Temporary holding place for nights data for the current map
|
extern UINT32 token; ///< Number of tokens collected in a level
|
||||||
//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
|
||||||
|
|
||||||
@@ -461,7 +426,6 @@ 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
|
||||||
|
|
||||||
|
|||||||
+16
-5
@@ -68,8 +68,21 @@ extern "C" {
|
|||||||
#define strnicmp(x,y,n) strncasecmp(x,y,n)
|
#define strnicmp(x,y,n) strncasecmp(x,y,n)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char *nongnu_strcasestr(const char *in, const char *what);
|
// glibc 2.43 made alot of standard lib functions propagate the constness of its input pointers
|
||||||
|
// to not cause warnings or compile issues on older glibc versions we do this silly thing
|
||||||
|
// to not have a gazillion glibc version checks
|
||||||
|
#if defined(__GLIBC_PREREQ)
|
||||||
|
#if __GLIBC_PREREQ(2, 43)
|
||||||
|
#define gconst const
|
||||||
|
#else
|
||||||
|
#define gconst
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define gconst
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef _GNU_SOURCE
|
#ifndef _GNU_SOURCE
|
||||||
|
char *nongnu_strcasestr(const char *in, const char *what);
|
||||||
#define strcasestr nongnu_strcasestr
|
#define strcasestr nongnu_strcasestr
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -127,9 +140,9 @@ size_t strlcpy(char *dst, const char *src, size_t dsize);
|
|||||||
#define STRBUFCPY(dst,src) strlcpy(dst, src, sizeof dst)
|
#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
|
||||||
@@ -137,9 +150,7 @@ 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 false FALSE
|
#define boolean int32_t
|
||||||
#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 */
|
||||||
|
|||||||
@@ -361,6 +361,11 @@ 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++);
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -111,10 +111,12 @@ 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;
|
size_t *searchpathindex = NULL;
|
||||||
|
|
||||||
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;
|
||||||
|
|||||||
+40
-45
@@ -1653,10 +1653,12 @@ 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,7 +1996,6 @@ 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;
|
||||||
@@ -2004,53 +2005,44 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick)
|
|||||||
|
|
||||||
for (i = 0; i < totalfiles; ++i)
|
for (i = 0; i < totalfiles; ++i)
|
||||||
{
|
{
|
||||||
if (toomany)
|
strlcpy(filename, (char *)(*pp), sizeof filename);
|
||||||
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
|
||||||
|
|
||||||
if (!toomany)
|
alreadyloaded = false;
|
||||||
|
nmusfilecount = 0;
|
||||||
|
|
||||||
|
for (j = 0; j < numwadfiles; ++j)
|
||||||
{
|
{
|
||||||
alreadyloaded = false;
|
if (wadfiles[j]->important && j > mainwads)
|
||||||
nmusfilecount = 0;
|
nmusfilecount++;
|
||||||
|
else
|
||||||
for (j = 0; j < numwadfiles; ++j)
|
|
||||||
{
|
|
||||||
if (wadfiles[j]->important && j > mainwads)
|
|
||||||
nmusfilecount++;
|
|
||||||
else
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (memcmp(md5sum, wadfiles[j]->md5sum, 16) == 0)
|
|
||||||
{
|
|
||||||
alreadyloaded = true;
|
|
||||||
|
|
||||||
if (i != nmusfilecount-1 && error < DFILE_ERROR_OUTOFORDER)
|
|
||||||
error |= DFILE_ERROR_OUTOFORDER;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (alreadyloaded)
|
|
||||||
{
|
|
||||||
filesloaded++;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
if (numwadfiles >= MAX_WADFILES)
|
if (memcmp(md5sum, wadfiles[j]->md5sum, 16) == 0)
|
||||||
error = DFILE_ERROR_CANNOTLOAD;
|
{
|
||||||
else if (!quick && findfile(filename, md5sum, false) != FS_FOUND)
|
alreadyloaded = true;
|
||||||
error = DFILE_ERROR_CANNOTLOAD;
|
|
||||||
else if (error < DFILE_ERROR_INCOMPLETEOUTOFORDER)
|
if (i != nmusfilecount-1 && error < DFILE_ERROR_OUTOFORDER)
|
||||||
error |= DFILE_ERROR_NOTLOADED;
|
error |= DFILE_ERROR_OUTOFORDER;
|
||||||
} else
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alreadyloaded)
|
||||||
|
{
|
||||||
|
filesloaded++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numwadfiles >= MAX_WADFILES)
|
||||||
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
|
||||||
@@ -2605,7 +2597,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();
|
||||||
|
|
||||||
@@ -2616,7 +2608,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
if (defdemoname == NULL)
|
if (defdemoname == NULL)
|
||||||
{
|
{
|
||||||
demobuf.p = demobuf.buffer;
|
demobuf.p = demobuf.buffer;
|
||||||
pdemoname = ZZ_Alloc(1); // Easier than adding checks for this everywhere it's freed
|
pdemoname = ZZ_Calloc(1); // Easier than adding checks for this everywhere it's freed
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2628,7 +2620,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();
|
||||||
|
|
||||||
@@ -3090,6 +3082,9 @@ 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
|
||||||
|
|||||||
+4
-7
@@ -69,9 +69,6 @@ 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";
|
||||||
@@ -100,7 +97,6 @@ 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;
|
||||||
@@ -213,7 +209,6 @@ const INT32 wantedfrequency = 10*TICRATE;
|
|||||||
INT32 gameovertics = 15*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;
|
||||||
@@ -3902,7 +3897,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(SAVEGAMESIZE, PU_STATIC, NULL);
|
save.p = save.buffer = (UINT8 *)Z_Malloc(1024, PU_STATIC, NULL); // 1024 bytes is plenty for a savegame
|
||||||
if (!save.p)
|
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"));
|
||||||
@@ -4052,7 +4047,6 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4153,6 +4147,7 @@ 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);
|
||||||
@@ -4167,10 +4162,12 @@ 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);
|
||||||
|
|||||||
@@ -939,6 +939,11 @@ 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;
|
||||||
@@ -974,12 +979,22 @@ 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;
|
||||||
@@ -1055,6 +1070,12 @@ 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;
|
||||||
|
|||||||
@@ -15,8 +15,6 @@
|
|||||||
|
|
||||||
#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"
|
||||||
@@ -100,7 +98,7 @@ static void HWR_DrawColumnInCache(const column_t *patchcol, UINT8 *block, GLMipm
|
|||||||
position = 0;
|
position = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
position = std::max(((position * scale_y) + (FRACUNIT/2)) >> FRACBITS, 0);
|
position = max(((position * scale_y) + (FRACUNIT/2)) >> FRACBITS, 0);
|
||||||
|
|
||||||
if (position + count >= pblockheight)
|
if (position + count >= pblockheight)
|
||||||
count = pblockheight - position;
|
count = pblockheight - position;
|
||||||
@@ -164,7 +162,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 = static_cast<UINT8 *>(mipmap->data);
|
UINT8 *block = (UINT8 *)(mipmap->data);
|
||||||
INT32 bpp;
|
INT32 bpp;
|
||||||
INT32 blockmodulo;
|
INT32 blockmodulo;
|
||||||
RGBA_t *palette;
|
RGBA_t *palette;
|
||||||
@@ -214,7 +212,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 = static_cast<UINT8 *>(mipmap->data);
|
UINT8 *block = (UINT8 *)(mipmap->data);
|
||||||
INT32 bpp;
|
INT32 bpp;
|
||||||
INT32 blockmodulo;
|
INT32 blockmodulo;
|
||||||
INT32 width, height;
|
INT32 width, height;
|
||||||
@@ -290,7 +288,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 = static_cast<UINT8 *>(Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data)));
|
block = (UINT8 *)(Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data)));
|
||||||
|
|
||||||
switch (bpp)
|
switch (bpp)
|
||||||
{
|
{
|
||||||
@@ -327,7 +325,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 = static_cast<GLTextureFormat_t>(textureformat);
|
gltex->mipmap.format = (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 &&
|
||||||
@@ -346,7 +344,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
|
|||||||
colormap += COLORMAP_REMAPOFFSET;
|
colormap += COLORMAP_REMAPOFFSET;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
gltex->mipmap.colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*gltex->mipmap.colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
gltex->mipmap.colormap = (GLColormap_t *)(Z_Calloc(sizeof(*gltex->mipmap.colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||||
gltex->mipmap.colormap->source = colormap;
|
gltex->mipmap.colormap->source = colormap;
|
||||||
memcpy(gltex->mipmap.colormap->data, colormap, 256 * sizeof(UINT8));
|
memcpy(gltex->mipmap.colormap->data, colormap, 256 * sizeof(UINT8));
|
||||||
|
|
||||||
@@ -379,7 +377,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
|
|||||||
// Composite the columns together.
|
// 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 = static_cast<UINT8 *>(W_CacheLumpNumPwad(patch->wad, patch->lump, PU_LEVEL));
|
pdata = (UINT8 *)(W_CacheLumpNumPwad(patch->wad, patch->lump, PU_LEVEL));
|
||||||
realpatch = (softwarepatch_t *)pdata;
|
realpatch = (softwarepatch_t *)pdata;
|
||||||
|
|
||||||
HWR_DrawTexturePatchInCache(&gltex->mipmap, blockwidth, blockheight, texture, patch, realpatch);
|
HWR_DrawTexturePatchInCache(&gltex->mipmap, blockwidth, blockheight, texture, patch, realpatch);
|
||||||
@@ -415,7 +413,7 @@ void HWR_MakePatch(const patch_t *patch, GLPatch_t *glPatch, GLMipmap_t *glMipma
|
|||||||
glMipmap->flags = 0;
|
glMipmap->flags = 0;
|
||||||
|
|
||||||
// setup the texture info
|
// setup the texture info
|
||||||
glMipmap->format = static_cast<GLTextureFormat_t>(patchformat);
|
glMipmap->format = (GLTextureFormat_t)(patchformat);
|
||||||
|
|
||||||
glPatch->max_s = (float)patch->width / (float)glMipmap->width;
|
glPatch->max_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;
|
||||||
@@ -457,7 +455,7 @@ static void HWR_FreeTextureData(patch_t *patch)
|
|||||||
if (!patch || !patch->hardware)
|
if (!patch || !patch->hardware)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
glPatch = (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);
|
||||||
@@ -473,7 +471,7 @@ void HWR_FreeTexture(patch_t *patch)
|
|||||||
|
|
||||||
if (patch->hardware)
|
if (patch->hardware)
|
||||||
{
|
{
|
||||||
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
GLPatch_t *glPatch = (GLPatch_t *)(patch->hardware);
|
||||||
|
|
||||||
HWR_FreeTextureColormaps(patch);
|
HWR_FreeTextureColormaps(patch);
|
||||||
|
|
||||||
@@ -499,7 +497,7 @@ static void HWR_FreeTextureColormaps(patch_t *patch)
|
|||||||
if (!patch)
|
if (!patch)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pat = static_cast<GLPatch_t *>(patch->hardware);
|
pat = (GLPatch_t *)(patch->hardware);
|
||||||
if (!pat)
|
if (!pat)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -614,24 +612,20 @@ 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
|
||||||
// too lazy to make a hashtable or smth so unordered set will do :carbuncle:
|
flatcheck flatpresent;
|
||||||
std::unordered_set<UINT32> flatpresent;
|
flatcheck_init(&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)
|
||||||
@@ -649,14 +643,23 @@ static void HWR_PrecacheLevelFlats(void)
|
|||||||
|
|
||||||
const levelflat_t *levelflat = &levelflats[pic];
|
const levelflat_t *levelflat = &levelflats[pic];
|
||||||
|
|
||||||
load_flat(levelflat->lumpnum, R_NoEncore(sec, ceiling));
|
if (flatcheck_is_end(flatcheck_get(&flatpresent, levelflat->lumpnum)))
|
||||||
|
{
|
||||||
|
HWR_GetFlat(levelflat->lumpnum, R_NoEncore(sec, ceiling));
|
||||||
|
flatcheck_insert(&flatpresent, levelflat->lumpnum);
|
||||||
|
}
|
||||||
|
|
||||||
if (levelflat->speed) // is it an animated flat ?
|
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++)
|
||||||
{
|
{
|
||||||
load_flat(levelflat->baselumpnum + k, R_NoEncore(sec, ceiling));
|
lumpnum_t lump = levelflat->baselumpnum + k;
|
||||||
|
if (flatcheck_is_end(flatcheck_get(&flatpresent, lump)))
|
||||||
|
{
|
||||||
|
HWR_GetFlat(lump, R_NoEncore(sec, ceiling));
|
||||||
|
flatcheck_insert(&flatpresent, lump);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -671,18 +674,29 @@ static void HWR_PrecacheLevelFlats(void)
|
|||||||
{
|
{
|
||||||
const levelflat_t *levelflat = &levelflats[i];
|
const levelflat_t *levelflat = &levelflats[i];
|
||||||
|
|
||||||
load_flat(levelflat->lumpnum, false);
|
if (flatcheck_is_end(flatcheck_get(&flatpresent, levelflat->lumpnum)))
|
||||||
|
{
|
||||||
|
HWR_GetFlat(levelflat->lumpnum, false);
|
||||||
|
flatcheck_insert(&flatpresent, levelflat->lumpnum);
|
||||||
|
}
|
||||||
|
|
||||||
if (levelflat->speed) // is it an animated flat ?
|
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++)
|
||||||
{
|
{
|
||||||
load_flat(levelflat->baselumpnum + k, false);
|
lumpnum_t lump = levelflat->baselumpnum + k;
|
||||||
|
if (flatcheck_is_end(flatcheck_get(&flatpresent, lump)))
|
||||||
|
{
|
||||||
|
HWR_GetFlat(lump, false);
|
||||||
|
flatcheck_insert(&flatpresent, lump);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flatcheck_cleanup(&flatpresent);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HWR_PrecacheLevelTextures(void)
|
static void HWR_PrecacheLevelTextures(void)
|
||||||
@@ -692,7 +706,7 @@ static void HWR_PrecacheLevelTextures(void)
|
|||||||
size_t i, j, f;
|
size_t i, j, f;
|
||||||
INT32 h;
|
INT32 h;
|
||||||
|
|
||||||
texturepresent = static_cast<char *>(calloc(gl_numtextures, sizeof(*texturepresent)));
|
texturepresent = (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");
|
||||||
|
|
||||||
@@ -867,7 +881,7 @@ void HWR_LoadMapTextures(size_t pnumtextures)
|
|||||||
HWR_FreeMapTextures();
|
HWR_FreeMapTextures();
|
||||||
|
|
||||||
gl_numtextures = pnumtextures;
|
gl_numtextures = pnumtextures;
|
||||||
gl_textures = static_cast<GLMapTextureSet_t *>(calloc(gl_numtextures, sizeof(*gl_textures))); // *2 - 1 for encore-remapped texture and another for noencore texture (unused when not in encore), see: GLMapTextureSet_t
|
gl_textures = (GLMapTextureSet_t *)(calloc(gl_numtextures, sizeof(*gl_textures))); // *2 - 1 for encore-remapped texture and another for noencore texture (unused when not in encore), see: GLMapTextureSet_t
|
||||||
|
|
||||||
if (gl_textures == NULL)
|
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!");
|
||||||
@@ -964,7 +978,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 = static_cast<UINT8 *>(glMipmap->data);
|
flat = (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)
|
||||||
@@ -1008,7 +1022,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 = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*glMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
glMipmap->colormap = (GLColormap_t *)(Z_Calloc(sizeof(*glMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||||
glMipmap->colormap->source = colormap;
|
glMipmap->colormap->source = colormap;
|
||||||
memcpy(glMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
memcpy(glMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
||||||
}
|
}
|
||||||
@@ -1032,7 +1046,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
|
|||||||
// --------------------+
|
// --------------------+
|
||||||
static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
||||||
{
|
{
|
||||||
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
GLPatch_t *glPatch = (GLPatch_t *)(patch->hardware);
|
||||||
|
|
||||||
if (!glMipmap->downloaded)
|
if (!glMipmap->downloaded)
|
||||||
{
|
{
|
||||||
@@ -1053,7 +1067,7 @@ static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
|||||||
// ----------------------+
|
// ----------------------+
|
||||||
static void HWR_UpdatePatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
static void HWR_UpdatePatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
||||||
{
|
{
|
||||||
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
GLPatch_t *glPatch = (GLPatch_t *)(patch->hardware);
|
||||||
HWR_MakePatch(patch, glPatch, glMipmap, true);
|
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
|
||||||
@@ -1089,7 +1103,7 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
|
|||||||
|
|
||||||
if (!patch->hardware)
|
if (!patch->hardware)
|
||||||
Patch_CreateGL(patch);
|
Patch_CreateGL(patch);
|
||||||
glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
glPatch = (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))
|
||||||
@@ -1125,12 +1139,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 = static_cast<GLMipmap_t *>(calloc(1, sizeof (*newMipmap)));
|
newMipmap = (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 = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*newMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
newMipmap->colormap = (GLColormap_t *)(Z_Calloc(sizeof(*newMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||||
newMipmap->colormap->source = colormap;
|
newMipmap->colormap->source = colormap;
|
||||||
memcpy(newMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
memcpy(newMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
||||||
|
|
||||||
@@ -1153,7 +1167,7 @@ patch_t *HWR_GetCachedGLPatchPwad(UINT16 wadnum, UINT16 lumpnum)
|
|||||||
{
|
{
|
||||||
void *ptr = Z_Calloc(sizeof(patch_t), PU_PATCH, &lumpcache[lumpnum]);
|
void *ptr = Z_Calloc(sizeof(patch_t), PU_PATCH, &lumpcache[lumpnum]);
|
||||||
Patch_Create(NULL, 0, ptr);
|
Patch_Create(NULL, 0, ptr);
|
||||||
Patch_AllocateHardwarePatch(static_cast<patch_t *>(ptr));
|
Patch_AllocateHardwarePatch((patch_t *)(ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
return (patch_t *)(lumpcache[lumpnum]);
|
return (patch_t *)(lumpcache[lumpnum]);
|
||||||
@@ -1170,7 +1184,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 = static_cast<UINT8 *>(mipmap->data); // places the data directly into here
|
UINT8 *block = (UINT8 *)(mipmap->data); // places the data directly into here
|
||||||
UINT8 *flat;
|
UINT8 *flat;
|
||||||
UINT8 *dest, *src, texel;
|
UINT8 *dest, *src, texel;
|
||||||
RGBA_t col;
|
RGBA_t col;
|
||||||
@@ -1326,7 +1340,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 = static_cast<UINT8 *>(Z_Malloc(
|
UINT8 *lut = (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)
|
||||||
@@ -1371,7 +1385,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 = static_cast<UINT8 *>(W_CacheLumpNum(lumpnum, PU_CACHE));
|
RGB_data = (UINT8 *)(W_CacheLumpNum(lumpnum, PU_CACHE));
|
||||||
// we got the RGB palette now, but we need it in RGBA format.
|
// 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++)
|
||||||
{
|
{
|
||||||
@@ -1406,7 +1420,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 = static_cast<RGBA_t *>(Z_Malloc(256 * 32 * sizeof(RGBA_t), PU_STATIC, NULL));
|
RGBA_t *hw_lighttable = (RGBA_t *)(Z_Malloc(256 * 32 * sizeof(RGBA_t), PU_STATIC, NULL));
|
||||||
|
|
||||||
// To make the palette index -> RGBA mapping easier for the shader,
|
// 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.
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -150,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, (column->topdelta == 0xff ? 31 : source[0]));
|
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, source[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,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)
|
||||||
@@ -302,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, (column->topdelta == 0xff ? 31 : source[0]));
|
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, source[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -385,7 +385,7 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
|||||||
// clip it since it is used for bunny scroll in doom I
|
// 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)
|
||||||
@@ -490,7 +490,7 @@ void HWR_DrawFlatFill(INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatlumpnum)
|
|||||||
void HWR_FadeScreenMenuBack(UINT16 color, UINT8 strength)
|
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;
|
||||||
@@ -543,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
|
||||||
@@ -598,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;
|
||||||
|
|
||||||
@@ -702,7 +702,7 @@ void HWR_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 color)
|
|||||||
void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32 options)
|
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)
|
||||||
@@ -820,7 +820,7 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32
|
|||||||
void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
|
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)
|
||||||
|
|||||||
+35
-50
@@ -242,7 +242,6 @@ consvar_t cv_glportals = {"gr_portals", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL,
|
|||||||
|
|
||||||
consvar_t cv_glpaletterendering = {"gr_paletteshader", "Off", CV_CALL|CV_SAVE, CV_OnOff, CV_glpaletterendering_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_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};
|
||||||
|
|
||||||
@@ -389,11 +388,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
|
||||||
fixed_t tr = R_QuickCamDist(spr->mobj->x, spr->mobj->y);
|
const fixed_t tr = R_QuickCamDist(spr->mobj->x, spr->mobj->y);
|
||||||
fixed_t xscale = FixedDiv((vid.width / 2) << FRACBITS, tr);
|
const 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
|
||||||
fixed_t n = FixedDiv(FixedMul(xscale, LIGHTRESOLUTIONFIX), ((MAXLIGHTSCALE-1) << LIGHTSCALESHIFT));
|
const 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
|
||||||
@@ -516,7 +515,7 @@ static FUINT HWR_CalcWallLight(FUINT lightnum, seg_t *seg, extracolormap_t *colo
|
|||||||
|
|
||||||
if (seg != NULL && P_ApplyLightOffsetFine(lightnum, seg->frontsector))
|
if (seg != NULL && P_ApplyLightOffsetFine(lightnum, seg->frontsector))
|
||||||
{
|
{
|
||||||
INT16 offset = (cv_glfakecontrast.value == 2) ? seg->hwLightOffset : ((INT16)seg->lightOffset * 8);
|
const 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 +533,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))
|
||||||
{
|
{
|
||||||
INT16 offset = (cv_glfakecontrast.value == 2) ? slope->hwLightOffset : ((INT16)slope->lightOffset * 8);
|
const 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 +550,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;
|
||||||
@@ -1376,10 +1375,9 @@ 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 = {};
|
||||||
|
|
||||||
if (gl_frontsector)
|
Surf.PolyColor.s.alpha = 255;
|
||||||
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;
|
||||||
@@ -1422,6 +1420,11 @@ 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
|
||||||
{
|
{
|
||||||
@@ -1466,15 +1469,6 @@ 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
|
||||||
@@ -2265,7 +2259,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 && cv_glportals.value && gl_maphasportals;
|
return supportstencil && gl_maphasportals && cv_glportals.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// From PrBoom:
|
// From PrBoom:
|
||||||
@@ -2409,7 +2403,8 @@ 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)
|
||||||
{
|
{
|
||||||
@@ -2676,7 +2671,7 @@ 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 = {};
|
||||||
fixed_t tempxsow, tempytow;
|
fixed_t tempxsow, tempytow;
|
||||||
size_t nrPlaneVerts;
|
size_t nrPlaneVerts;
|
||||||
|
|
||||||
@@ -2690,14 +2685,6 @@ 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)
|
||||||
{
|
{
|
||||||
@@ -2706,6 +2693,8 @@ 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);
|
||||||
@@ -2843,9 +2832,8 @@ 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));
|
||||||
@@ -2866,9 +2854,8 @@ 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));
|
||||||
@@ -3420,7 +3407,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;
|
||||||
@@ -3656,7 +3643,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;
|
||||||
@@ -3685,7 +3672,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 = ((GLPatch_t *)gpatch->hardware);
|
hwrpatch = static_cast<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
|
||||||
@@ -3787,10 +3774,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 = FixedMul(FRACUNIT/2, Surf.PolyColor.s.alpha);
|
Surf.PolyColor.s.alpha = static_cast<UINT8>(FixedMul(FRACUNIT/2, static_cast<fixed_t>(Surf.PolyColor.s.alpha)));
|
||||||
|
|
||||||
if (cv_playerfade.value)
|
if (cv_playerfade.value)
|
||||||
Surf.PolyColor.s.alpha = FixedMul(R_DoPlayerFade(sprmo), Surf.PolyColor.s.alpha);
|
Surf.PolyColor.s.alpha = static_cast<UINT8>(FixedMul(R_DoPlayerFade(sprmo), static_cast<fixed_t>(Surf.PolyColor.s.alpha)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HWR_UseShader())
|
if (HWR_UseShader())
|
||||||
@@ -3941,7 +3928,7 @@ 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;
|
||||||
@@ -3973,7 +3960,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 = ((GLPatch_t *)gpatch->hardware);
|
hwrpatch = static_cast<GLPatch_t *>(gpatch->hardware);
|
||||||
|
|
||||||
// create the sprite billboard
|
// create the sprite billboard
|
||||||
//
|
//
|
||||||
@@ -4084,10 +4071,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 = FixedMul(FRACUNIT/2, Surf.PolyColor.s.alpha);
|
Surf.PolyColor.s.alpha = static_cast<UINT8>(FixedMul(FRACUNIT/2, static_cast<fixed_t>(Surf.PolyColor.s.alpha)));
|
||||||
|
|
||||||
if (cv_playerfade.value)
|
if (cv_playerfade.value)
|
||||||
Surf.PolyColor.s.alpha = FixedMul(R_DoPlayerFade(sprmo), Surf.PolyColor.s.alpha);
|
Surf.PolyColor.s.alpha = static_cast<UINT8>(FixedMul(R_DoPlayerFade(sprmo), static_cast<fixed_t>(Surf.PolyColor.s.alpha)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HWR_UseShader())
|
if (HWR_UseShader())
|
||||||
@@ -4106,7 +4093,7 @@ 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;
|
||||||
|
|
||||||
@@ -4123,7 +4110,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 = ((GLPatch_t *)gpatch->hardware);
|
hwrpatch = static_cast<GLPatch_t *>(gpatch->hardware);
|
||||||
|
|
||||||
// create the sprite billboard
|
// create the sprite billboard
|
||||||
//
|
//
|
||||||
@@ -4514,7 +4501,6 @@ 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
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
@@ -4851,7 +4837,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 ^= 0xFFFF;
|
flip ^= 0xFF;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -5914,7 +5900,6 @@ void HWR_AddCommands(void)
|
|||||||
|
|
||||||
CV_RegisterVar(&cv_glpaletterendering);
|
CV_RegisterVar(&cv_glpaletterendering);
|
||||||
CV_RegisterVar(&cv_glpalettedepth);
|
CV_RegisterVar(&cv_glpalettedepth);
|
||||||
CV_RegisterVar(&cv_glflashpal);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
@@ -6071,7 +6056,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_PalRenderFlashpal())
|
if (!HWR_ShouldUsePaletteRendering())
|
||||||
{
|
{
|
||||||
const player_t *player = &players[displayplayers[viewssnum]];
|
const player_t *player = &players[displayplayers[viewssnum]];
|
||||||
|
|
||||||
@@ -6084,7 +6069,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)
|
||||||
|
|||||||
@@ -208,7 +208,6 @@ 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)
|
||||||
{
|
{
|
||||||
@@ -220,11 +219,6 @@ 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)
|
||||||
{
|
{
|
||||||
|
|||||||
+13
-21
@@ -693,17 +693,15 @@ 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, blendcolor;
|
RGBA_t *image, *blendimage, *cur;
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
@@ -716,14 +714,10 @@ static void HWR_CreateBlendedTexture(patch_t *gpatch, patch_t *blendgpatch, GLMi
|
|||||||
glMipmap->format = GL_TEXFMT_RGBA;
|
glMipmap->format = GL_TEXFMT_RGBA;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (glMipmap->data)
|
Z_Free(glMipmap->data);
|
||||||
{
|
glMipmap->data = NULL;
|
||||||
Z_Free(glMipmap->data);
|
|
||||||
glMipmap->data = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
cur = Z_Malloc(size*4, PU_HWRMODELTEXTURE, &glMipmap->data);
|
cur = Z_Calloc(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;
|
||||||
@@ -1037,7 +1031,6 @@ 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
|
||||||
@@ -1106,7 +1099,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;
|
||||||
@@ -1343,8 +1336,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 = (float)spr->mobj->state->var2;
|
durs = spr->mobj->state->var2;
|
||||||
tics = (float)spr->mobj->anim_duration;
|
tics = (INT32)spr->mobj->anim_duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME: this is not yet correct
|
//FIXME: this is not yet correct
|
||||||
@@ -1482,7 +1475,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)
|
||||||
{
|
{
|
||||||
@@ -1533,7 +1526,6 @@ 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;
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
char *location = strstr(str1, str2);
|
gconst char *location = strstr(str1, str2);
|
||||||
if (location)
|
if (location)
|
||||||
return location - str1;
|
return location - str1;
|
||||||
else
|
else
|
||||||
@@ -365,13 +365,17 @@ 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) return;
|
if (!preprocessed)
|
||||||
|
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) return;
|
if (!preprocessed)
|
||||||
|
return;
|
||||||
|
|
||||||
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_FRAGMENT);
|
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_FRAGMENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -387,8 +391,10 @@ 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);
|
||||||
|
|||||||
@@ -1383,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)
|
||||||
{
|
{
|
||||||
GLubyte *where, *terminator;
|
gconst GLubyte *where, *terminator;
|
||||||
|
|
||||||
if (!extension || !start)
|
if (!extension || !start)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
where = (GLubyte *) strchr(extension, ' ');
|
where = (gconst GLubyte *)strchr(extension, ' ');
|
||||||
|
|
||||||
if (where || *extension == '\0')
|
if (where || *extension == '\0')
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
where = (GLubyte *) strstr((const char *) start, extension);
|
where = (gconst GLubyte *)strstr((const char *)start, extension);
|
||||||
|
|
||||||
if (!where)
|
if (!where)
|
||||||
break;
|
break;
|
||||||
|
|||||||
+3
-1
@@ -225,9 +225,10 @@ 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())
|
||||||
@@ -317,6 +318,7 @@ 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);
|
||||||
}
|
}
|
||||||
|
|||||||
+79
-63
@@ -97,7 +97,6 @@ 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;
|
||||||
@@ -497,7 +496,9 @@ 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)
|
||||||
@@ -516,6 +517,7 @@ 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;
|
||||||
@@ -541,6 +543,8 @@ 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;
|
||||||
|
|
||||||
@@ -623,7 +627,10 @@ 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';
|
||||||
|
|
||||||
@@ -904,7 +911,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;
|
||||||
READSTRINGL(*p, msg, HU_MAXMSGLEN + 1);
|
READSTRINGN(*p, msg, HU_MAXMSGLEN + 1);
|
||||||
|
|
||||||
if ((cv_mute.value || flags & (HU_CSAY|HU_SERVER_SAY)) && playernum != serverplayer && !(IsPlayerAdmin(playernum)))
|
if ((cv_mute.value || flags & (HU_CSAY|HU_SERVER_SAY)) && playernum != serverplayer && !(IsPlayerAdmin(playernum)))
|
||||||
{
|
{
|
||||||
@@ -1092,7 +1099,6 @@ 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))
|
||||||
@@ -1229,7 +1235,9 @@ 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:
|
||||||
@@ -1807,6 +1815,7 @@ 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;
|
||||||
@@ -1918,64 +1927,6 @@ static void HU_DrawChat(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (emote_autocomplete.emotestart != -1 && (emote_autocomplete.complete[0] || (w_chat.cursor - emote_autocomplete.emotestart) > 1))
|
|
||||||
{
|
|
||||||
emote_t *suggest;
|
|
||||||
int skip = 0;
|
|
||||||
|
|
||||||
const char *complete;
|
|
||||||
int complete_len;
|
|
||||||
|
|
||||||
if (emote_autocomplete.complete[0])
|
|
||||||
{
|
|
||||||
complete = emote_autocomplete.complete;
|
|
||||||
complete_len = strlen(complete);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
complete = &w_chat_buf[emote_autocomplete.emotestart];
|
|
||||||
complete_len = w_chat.cursor - emote_autocomplete.emotestart;
|
|
||||||
}
|
|
||||||
|
|
||||||
// A bit of copy-paste from /pm code :p
|
|
||||||
INT32 suggesty = chaty - charheight - 1;
|
|
||||||
size_t longest_suggestion_length = 0;
|
|
||||||
|
|
||||||
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
|
||||||
{
|
|
||||||
longest_suggestion_length = max(longest_suggestion_length, strlen(suggest->name));
|
|
||||||
++skip;
|
|
||||||
}
|
|
||||||
|
|
||||||
skip = 0;
|
|
||||||
|
|
||||||
#ifdef NETSPLITSCREEN
|
|
||||||
if (splitscreen)
|
|
||||||
{
|
|
||||||
suggesty -= BASEVIDHEIGHT/2;
|
|
||||||
if (splitscreen > 1)
|
|
||||||
suggesty += 16;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
suggesty -= (cv_kartspeedometer.value ? 16 : 0);
|
|
||||||
|
|
||||||
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
|
||||||
{
|
|
||||||
V_DrawFillConsoleMap(chatx + boxw + 2, suggesty - (7*skip), (longest_suggestion_length+2)*4 + EMOTEWIDTH, 6, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
|
||||||
|
|
||||||
// Highlight currently suggested emote
|
|
||||||
int hlflag = 0;
|
|
||||||
if (skip == emote_autocomplete.skip && emote_autocomplete.complete[0])
|
|
||||||
hlflag = V_YELLOWMAP;
|
|
||||||
|
|
||||||
V_DrawSmallString(chatx + boxw + 4 + EMOTEWIDTH, suggesty - (7*skip), hlflag|V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, va(":%s:", suggest->name));
|
|
||||||
M_DrawEmote(chatx + boxw + 2, suggesty - skip*7, suggest, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
|
||||||
|
|
||||||
++skip;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// handle /pm list. It's messy, horrible and I don't care.
|
// 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
|
||||||
{
|
{
|
||||||
@@ -2056,9 +2007,74 @@ 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;
|
||||||
|
|
||||||
|
#ifdef NETSPLITSCREEN
|
||||||
|
if (splitscreen)
|
||||||
|
{
|
||||||
|
suggesty -= BASEVIDHEIGHT/2;
|
||||||
|
if (splitscreen > 1)
|
||||||
|
suggesty += 16;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
suggesty -= (cv_kartspeedometer.value ? 16 : 0);
|
||||||
|
|
||||||
|
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
||||||
|
{
|
||||||
|
V_DrawFillConsoleMap(chatx + boxw + pm_offset + 2, suggesty - (7*skip), emote_suggest_boxw, 6, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||||
|
|
||||||
|
// Highlight currently suggested emote
|
||||||
|
int hlflag = 0;
|
||||||
|
if (skip == emote_autocomplete.skip && emote_autocomplete.complete[0])
|
||||||
|
hlflag = V_YELLOWMAP;
|
||||||
|
|
||||||
|
V_DrawSmallString(chatx + boxw + pm_offset + 4 + EMOTEWIDTH, suggesty - (7*skip), hlflag|V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, va(":%s:", suggest->name));
|
||||||
|
M_DrawEmote(chatx + boxw + pm_offset + 2, suggesty - skip*7, suggest, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||||
|
|
||||||
|
++skip;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HU_drawChatLog(typelines - 1); // typelines is the # of lines we're typing. If there's more than 1 then the log should scroll up to give us more space.
|
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.
|
||||||
|
|||||||
+8
-1
@@ -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. */
|
||||||
extern boolean g_in_exiting_signal_handler;
|
boolean I_In_Exiting_Signal_Handler(void);
|
||||||
|
|
||||||
/** \brief The I_GetFreeMem function
|
/** \brief The I_GetFreeMem function
|
||||||
|
|
||||||
@@ -148,6 +148,9 @@ extern INT32 numcontrollers;
|
|||||||
*/
|
*/
|
||||||
const char *I_GetJoyName(INT32 joyindex);
|
const char *I_GetJoyName(INT32 joyindex);
|
||||||
|
|
||||||
|
boolean I_GamepadHasLED(INT32 playernum);
|
||||||
|
boolean I_GamepadHasRumble(INT32 playernum);
|
||||||
|
|
||||||
void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration);
|
void I_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);
|
||||||
|
|
||||||
@@ -195,6 +198,10 @@ 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
|
||||||
|
|||||||
+9
-7
@@ -496,8 +496,10 @@ 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)
|
||||||
@@ -507,11 +509,13 @@ 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.
|
||||||
@@ -812,7 +816,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 || numnode > MAXNETNODES)
|
if (numnode <= 0 || 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)));
|
||||||
@@ -1432,14 +1436,12 @@ static void SOCK_RegisterHolePunch(void)
|
|||||||
|
|
||||||
static boolean SOCK_OpenSocket(void)
|
static boolean SOCK_OpenSocket(void)
|
||||||
{
|
{
|
||||||
size_t i;
|
memset(clientaddress, 0, sizeof(clientaddress));
|
||||||
|
|
||||||
memset(clientaddress, 0, sizeof (clientaddress));
|
|
||||||
|
|
||||||
|
memset(nodeconnected, false, sizeof(nodeconnected));
|
||||||
nodeconnected[0] = true; // always connected to self
|
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;
|
||||||
@@ -1479,7 +1481,7 @@ static boolean SOCK_Ban(INT32 node)
|
|||||||
{
|
{
|
||||||
INT32 ban;
|
INT32 ban;
|
||||||
|
|
||||||
if (node > MAXNETNODES)
|
if (node < 0 || node > MAXNETNODES)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
ban = numbans;
|
ban = numbans;
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ INT32 VID_SetMode(INT32 modenum);
|
|||||||
*/
|
*/
|
||||||
const char *VID_GetModeName(INT32 modenum);
|
const char *VID_GetModeName(INT32 modenum);
|
||||||
|
|
||||||
|
void VID_RefreshModeList(void);
|
||||||
void VID_PrepareModeList(void);
|
void VID_PrepareModeList(void);
|
||||||
|
|
||||||
/** \brief can video system do fullscreen
|
/** \brief can video system do fullscreen
|
||||||
@@ -121,6 +122,7 @@ void I_ReadScreen(UINT8 * restrict scr, INT32 scale);
|
|||||||
|
|
||||||
UINT32 I_GetRefreshRate(void);
|
UINT32 I_GetRefreshRate(void);
|
||||||
|
|
||||||
|
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height);
|
||||||
boolean I_CheckNativeRes(void);
|
boolean I_CheckNativeRes(void);
|
||||||
|
|
||||||
void I_SetBorderlessWindow(void);
|
void I_SetBorderlessWindow(void);
|
||||||
|
|||||||
@@ -446,6 +446,12 @@ 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
|
||||||
|
|||||||
+53
-28
@@ -83,6 +83,7 @@ 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
|
||||||
|
|
||||||
@@ -92,6 +93,7 @@ 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};
|
||||||
@@ -207,6 +209,7 @@ 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);
|
||||||
@@ -221,6 +224,7 @@ 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);
|
||||||
@@ -931,21 +935,21 @@ const char *K_GetItemPatch(UINT8 item, boolean tiny)
|
|||||||
|
|
||||||
//}
|
//}
|
||||||
|
|
||||||
INT32 ITEM_X, ITEM_Y; // Item Window
|
static INT32 ITEM_X, ITEM_Y; // Item Window
|
||||||
INT32 TIME_X, TIME_Y; // Time Sticker
|
static INT32 TIME_X, TIME_Y; // Time Sticker
|
||||||
INT32 LAPS_X, LAPS_Y; // Lap Sticker
|
static INT32 LAPS_X, LAPS_Y; // Lap Sticker
|
||||||
INT32 SPDM_X, SPDM_Y; // Speedometer
|
static INT32 SPDM_X, SPDM_Y; // Speedometer
|
||||||
INT32 POSI_X, POSI_Y; // Position Number
|
static INT32 POSI_X, POSI_Y; // Position Number
|
||||||
INT32 FACE_X, FACE_Y; // Top-four Faces
|
static INT32 FACE_X, FACE_Y; // Top-four Faces
|
||||||
INT32 STCD_X, STCD_Y; // Starting countdown
|
static INT32 STCD_X, STCD_Y; // Starting countdown
|
||||||
INT32 CHEK_Y; // CHECK graphic
|
static INT32 CHEK_Y; // CHECK graphic
|
||||||
INT32 MINI_X, MINI_Y; // Minimap
|
static INT32 MINI_X, MINI_Y; // Minimap
|
||||||
INT32 WANT_X, WANT_Y; // Battle WANTED poster
|
static 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.
|
||||||
INT32 ITEM2_X, ITEM2_Y;
|
static INT32 ITEM2_X, ITEM2_Y;
|
||||||
INT32 LAPS2_X, LAPS2_Y;
|
static INT32 LAPS2_X, LAPS2_Y;
|
||||||
INT32 POSI2_X, POSI2_Y;
|
static INT32 POSI2_X, POSI2_Y;
|
||||||
|
|
||||||
static void K_initKartHUD(void)
|
static void K_initKartHUD(void)
|
||||||
{
|
{
|
||||||
@@ -1415,8 +1419,6 @@ 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));
|
||||||
@@ -1436,13 +1438,16 @@ static void K_drawKartStats(void)
|
|||||||
fakeskin = K_GetPlayerSkin(stplyr);
|
fakeskin = K_GetPlayerSkin(stplyr);
|
||||||
|
|
||||||
// Skin name
|
// Skin name
|
||||||
if (K_IsHighResolution()) // V_DrawSmallString becomes a mess at low resolutions lel
|
if (cv_showstats_skinname.value)
|
||||||
{
|
{
|
||||||
V_DrawSmallString(x+20, y+12, flags2, fakeskin->realname);
|
if (K_IsHighResolution()) // V_DrawSmallString becomes a mess at low resolutions lel
|
||||||
}
|
{
|
||||||
else
|
V_DrawSmallString(x+20, y+12, flags2, fakeskin->realname);
|
||||||
{
|
}
|
||||||
V_DrawThinString(x+20, y+7, flags2, fakeskin->realname);
|
else
|
||||||
|
{
|
||||||
|
V_DrawThinString(x+20, y+7, flags2, fakeskin->realname);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Icon and stats
|
// Icon and stats
|
||||||
@@ -2096,7 +2101,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 && num >= 10)
|
if (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.
|
||||||
@@ -3774,6 +3779,9 @@ 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
|
||||||
@@ -3818,7 +3826,7 @@ static void K_drawKartMinimap(void)
|
|||||||
|
|
||||||
if (cv_showminimapangle.value && (minidoticon || minilighticon) && !playertimedout)
|
if (cv_showminimapangle.value && (minidoticon || minilighticon) && !playertimedout)
|
||||||
{
|
{
|
||||||
UINT8 *colormap;
|
UINT8 *colormap = NULL;
|
||||||
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;
|
||||||
@@ -3829,10 +3837,27 @@ static void K_drawKartMinimap(void)
|
|||||||
if (encoremode)
|
if (encoremode)
|
||||||
ang = ANGLE_180 - ang;
|
ang = ANGLE_180 - ang;
|
||||||
|
|
||||||
if (mobj->colorized)
|
if (mobj->color)
|
||||||
colormap = R_GetTranslationColormap(TC_RAINBOW, mobj->color, GTC_CACHE);
|
{
|
||||||
else
|
if (mobj->colorized)
|
||||||
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);
|
||||||
@@ -4061,7 +4086,7 @@ static void K_drawBattleFullscreen(void)
|
|||||||
{
|
{
|
||||||
if (i == displayplayers[0])
|
if (i == displayplayers[0])
|
||||||
continue;
|
continue;
|
||||||
if (playeringame[i] && !stplyr->spectator)
|
if (playeringame[i])
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ 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;
|
||||||
|
|||||||
+30
-11
@@ -660,13 +660,22 @@ 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
|
||||||
@@ -1480,7 +1489,6 @@ 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);
|
||||||
|
|
||||||
@@ -1947,11 +1955,9 @@ 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)
|
||||||
{
|
{
|
||||||
alwaysHear = P_IsDisplayPlayer(other->player);
|
boolean 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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2151,7 +2157,13 @@ static void K_GetKartBoostPower(player_t *player)
|
|||||||
&& player->speed > 0
|
&& player->speed > 0
|
||||||
&& !player->spectator)
|
&& !player->spectator)
|
||||||
{
|
{
|
||||||
K_SpawnWipeoutTrail(player->mo, true);
|
mobj_t *dust = K_SpawnWipeoutTrail(player->mo, true);
|
||||||
|
|
||||||
|
// Technically, all mobjs that think can cause desynchs if they are spawned conditionally, so best we can do
|
||||||
|
// is to hide them if you are in saltyhop jump
|
||||||
|
if (dust && player->mo->salty.jump)
|
||||||
|
dust->flags2 |= MF2_DONTDRAW;
|
||||||
|
|
||||||
if (leveltime % 6 == 0)
|
if (leveltime % 6 == 0)
|
||||||
S_StartSound(player->mo, sfx_cdfm70);
|
S_StartSound(player->mo, sfx_cdfm70);
|
||||||
}
|
}
|
||||||
@@ -2358,6 +2370,7 @@ 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!
|
||||||
}
|
}
|
||||||
@@ -3626,7 +3639,7 @@ void K_SpawnSparkleTrail(mobj_t *mo)
|
|||||||
P_SetMobjState(sparkle, S_KARTINVULN_LARGE1);
|
P_SetMobjState(sparkle, S_KARTINVULN_LARGE1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
|
mobj_t *K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
|
||||||
{
|
{
|
||||||
mobj_t *dust;
|
mobj_t *dust;
|
||||||
angle_t aoff;
|
angle_t aoff;
|
||||||
@@ -3663,10 +3676,10 @@ void 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (translucent)
|
return dust;
|
||||||
dust->flags2 |= MF2_SHADOW;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// K_DriftDustHandling
|
// K_DriftDustHandling
|
||||||
@@ -4641,8 +4654,7 @@ void K_RepairOrbitChain(mobj_t *orbit)
|
|||||||
prev->movedir = num;
|
prev->movedir = num;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player->kartstuff[k_itemamount] != num)
|
player->kartstuff[k_itemamount] = num;
|
||||||
player->kartstuff[k_itemamount] = num;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6167,6 +6179,13 @@ void K_KartUpdatePosition(player_t *player)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the player should NOT be checked against themselves! lol
|
||||||
|
// otherwise prevcheck will effectively be halved
|
||||||
|
// sadly this stuff is exposed to lua and atleast one script uses those so we cant fix it
|
||||||
|
// oh well
|
||||||
|
//if (player == &players[i])
|
||||||
|
//continue;
|
||||||
|
|
||||||
const boolean isprevcheckpointi = mo->health == players[i].starpostnum;
|
const boolean isprevcheckpointi = mo->health == players[i].starpostnum;
|
||||||
const boolean isnextcheckpointi = mo->health == (players[i].starpostnum + 1);
|
const boolean isnextcheckpointi = mo->health == (players[i].starpostnum + 1);
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -57,7 +57,7 @@ boolean K_ShouldSlopeRoll(mobj_t *mobj);
|
|||||||
void K_RollMobjBySlopes(mobj_t *mo, pslope_t *slope);
|
void K_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);
|
||||||
void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent);
|
mobj_t *K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent);
|
||||||
void K_DriftDustHandling(mobj_t *spawner);
|
void K_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);
|
||||||
|
|||||||
+42
-13
@@ -358,7 +358,8 @@ 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;
|
||||||
@@ -368,26 +369,40 @@ 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"))) {
|
}
|
||||||
if (lua_islightuserdata(L, 4)) {
|
else if (i == 4 || (k && fasticmp(k, "PossibleValue")))
|
||||||
|
{
|
||||||
|
if (lua_islightuserdata(L, 4))
|
||||||
|
{
|
||||||
CV_PossibleValue_t *pv = lua_touserdata(L, 4);
|
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"}}
|
||||||
//
|
//
|
||||||
@@ -398,7 +413,9 @@ 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);
|
||||||
}
|
}
|
||||||
@@ -412,7 +429,9 @@ 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
|
||||||
@@ -423,14 +442,19 @@ 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);
|
||||||
@@ -438,9 +462,13 @@ 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 (((i == 5 && !(cvar->flags & CV_CALL))
|
else if ((cvar->flags & CV_CALL && i == 6)
|
||||||
|| (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);
|
||||||
@@ -451,6 +479,7 @@ 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
|
||||||
|
|||||||
+29
-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");
|
||||||
|
|
||||||
@@ -296,8 +296,7 @@ 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;/* >0 if mobj hook */
|
mobjtype_t mobj_type;/* <NUMMOBJTYPES if mobj hook */
|
||||||
boolean force_mobj;// allows mobj_type equal 0
|
|
||||||
const char * string;/* used to fetch table, ran first if set */
|
const char * string;/* used to fetch table, ran first if set */
|
||||||
int top;/* index of last argument passed to hook */
|
int top;/* index of last argument passed to hook */
|
||||||
int id;/* id to fetch ref */
|
int id;/* id to fetch ref */
|
||||||
@@ -364,10 +363,8 @@ 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, 0, NULL,
|
hook_type, NUMMOBJTYPES, NULL,
|
||||||
hookIds[hook_type].numHooks);
|
hookIds[hook_type].numHooks);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -381,8 +378,6 @@ 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));
|
||||||
@@ -395,10 +390,8 @@ 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, 0, string,
|
hook_type, NUMMOBJTYPES, string,
|
||||||
stringHooks[hook_type].ref))
|
stringHooks[hook_type].ref))
|
||||||
{
|
{
|
||||||
lua_pushstring(gL, string);
|
lua_pushstring(gL, string);
|
||||||
@@ -414,7 +407,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, 0, NULL,
|
hook_type, NUMMOBJTYPES, NULL,
|
||||||
hudHookIds[hook_type].numHooks);
|
hudHookIds[hook_type].numHooks);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -554,14 +547,11 @@ static int call_hooks
|
|||||||
{
|
{
|
||||||
calls += call_string_hooks(hook);
|
calls += call_string_hooks(hook);
|
||||||
}
|
}
|
||||||
else if (hook->force_mobj)
|
else if (hook->mobj_type < NUMMOBJTYPES)
|
||||||
{
|
{
|
||||||
/* 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
|
||||||
@@ -615,7 +605,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);
|
||||||
@@ -626,7 +616,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);
|
||||||
@@ -638,14 +628,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);
|
||||||
@@ -655,7 +645,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);
|
||||||
@@ -665,7 +655,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);
|
||||||
@@ -676,7 +666,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);
|
||||||
@@ -695,7 +685,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);
|
||||||
@@ -723,7 +713,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;
|
||||||
@@ -783,7 +773,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);
|
||||||
@@ -802,7 +792,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);
|
||||||
@@ -890,8 +880,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))
|
||||||
{
|
{
|
||||||
@@ -911,7 +901,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))
|
||||||
{
|
{
|
||||||
@@ -924,7 +914,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
|
||||||
@@ -953,7 +943,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);
|
||||||
@@ -967,7 +957,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)
|
||||||
{
|
{
|
||||||
@@ -997,7 +987,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
|
||||||
@@ -1060,7 +1050,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;
|
||||||
|
|
||||||
@@ -1096,7 +1086,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);
|
||||||
@@ -1114,7 +1104,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);
|
||||||
@@ -1163,7 +1153,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, }
|
||||||
|
|||||||
+28
-29
@@ -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,7 +690,6 @@ 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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+5
-10
@@ -1506,7 +1506,6 @@ enum mapheaderinfo_e
|
|||||||
mapheaderinfo_saveoverride,
|
mapheaderinfo_saveoverride,
|
||||||
mapheaderinfo_levelflags,
|
mapheaderinfo_levelflags,
|
||||||
mapheaderinfo_menuflags,
|
mapheaderinfo_menuflags,
|
||||||
//mapheaderinfo_automap,
|
|
||||||
mapheaderinfo_mobj_scale,
|
mapheaderinfo_mobj_scale,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1542,7 +1541,6 @@ static const char *const mapheaderinfo_opt[] = {
|
|||||||
"saveoverride",
|
"saveoverride",
|
||||||
"levelflags",
|
"levelflags",
|
||||||
"menuflags",
|
"menuflags",
|
||||||
//"automap",
|
|
||||||
"mobj_scale",
|
"mobj_scale",
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
@@ -1584,10 +1582,11 @@ 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, header->musinterfadeout);
|
lua_pushinteger(L, 0); // unused
|
||||||
break;
|
break;
|
||||||
case mapheaderinfo_musintername:
|
case mapheaderinfo_musintername:
|
||||||
lua_pushstring(L, header->musintername);
|
// uhh psure its fine to just push nil instead of empty string?
|
||||||
|
lua_pushstring(L, NULL);
|
||||||
break;
|
break;
|
||||||
case mapheaderinfo_forcecharacter:
|
case mapheaderinfo_forcecharacter:
|
||||||
lua_pushstring(L, header->forcecharacter);
|
lua_pushstring(L, header->forcecharacter);
|
||||||
@@ -1641,10 +1640,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, header->bonustype);
|
lua_pushinteger(L, 0); // unused
|
||||||
break;
|
break;
|
||||||
case mapheaderinfo_saveoverride:
|
case mapheaderinfo_saveoverride:
|
||||||
lua_pushinteger(L, header->saveoverride);
|
lua_pushinteger(L, SAVE_DEFAULT); // unused
|
||||||
break;
|
break;
|
||||||
case mapheaderinfo_levelflags:
|
case mapheaderinfo_levelflags:
|
||||||
lua_pushinteger(L, header->levelflags);
|
lua_pushinteger(L, header->levelflags);
|
||||||
@@ -1652,13 +1651,9 @@ 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
|
||||||
|
|||||||
@@ -13,6 +13,10 @@
|
|||||||
#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
|
||||||
@@ -71,5 +75,9 @@ 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 = ceil(100.0f/NEWTICRATE);
|
float delayf = ceilf(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;
|
||||||
|
|
||||||
|
|||||||
+3
-22
@@ -479,32 +479,13 @@ 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)
|
||||||
{
|
{
|
||||||
if (emblemlocations[i].type <= ET_SKIN || emblemlocations[i].collected)
|
// Requires time on map <= x
|
||||||
|
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,21 +27,11 @@ 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 = std::max<int>(emotes.size()/EMOTES_PER_PAGE, 1);
|
const int NUMPAGES = emotes.size()/EMOTES_PER_PAGE + (emotes.size() % EMOTES_PER_PAGE != 0 ? 1 : 0);
|
||||||
int page = 1;
|
int page = 1;
|
||||||
|
|
||||||
if (COM_Argc() > 1)
|
if (COM_Argc() > 1)
|
||||||
|
|||||||
+83
-84
@@ -186,8 +186,8 @@ static INT16 itemOn = 1; // menu item skull is on, Hack by Tails 09-18-2002
|
|||||||
static INT16 skullAnimCounter = 10; // skull animation counter
|
static 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;
|
||||||
@@ -201,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
|
||||||
@@ -308,7 +308,6 @@ static void M_SetupMultiHandler(INT32 choice);
|
|||||||
|
|
||||||
// Options
|
// Options
|
||||||
// Split into multiple parts due to size
|
// Split into multiple parts due to size
|
||||||
static void M_VideoModeMenu(INT32 choice);
|
|
||||||
static void M_Setup1PControlsMenu(void);
|
static void M_Setup1PControlsMenu(void);
|
||||||
static void M_Setup2PControlsMenu(void);
|
static void M_Setup2PControlsMenu(void);
|
||||||
static void M_Setup3PControlsMenu(void);
|
static void M_Setup3PControlsMenu(void);
|
||||||
@@ -1024,9 +1023,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;
|
||||||
@@ -1305,12 +1304,21 @@ 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: ch = KEY_UPARROW; break;
|
case KEY_LEFTARROW:
|
||||||
case KEY_UPARROW: ch = KEY_RIGHTARROW; break;
|
ch = KEY_UPARROW;
|
||||||
case KEY_RIGHTARROW: ch = KEY_DOWNARROW; break;
|
break;
|
||||||
case KEY_DOWNARROW: ch = KEY_LEFTARROW; break;
|
case KEY_UPARROW:
|
||||||
|
ch = KEY_RIGHTARROW;
|
||||||
|
break;
|
||||||
|
case KEY_RIGHTARROW:
|
||||||
|
ch = KEY_DOWNARROW;
|
||||||
|
break;
|
||||||
|
case KEY_DOWNARROW:
|
||||||
|
ch = KEY_LEFTARROW;
|
||||||
|
break;
|
||||||
|
|
||||||
// arbitrary keyboard shortcuts because fuck you
|
// arbitrary keyboard shortcuts because fuck you
|
||||||
|
|
||||||
@@ -1361,7 +1369,8 @@ boolean M_Responder(event_t *ev)
|
|||||||
G_AdjustView(4, 1, true);
|
G_AdjustView(4, 1, true);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: break;
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1486,6 +1495,7 @@ boolean M_Responder(event_t *ev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CON_Responder(ev);
|
CON_Responder(ev);
|
||||||
@@ -2064,7 +2074,6 @@ 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;
|
||||||
}
|
}
|
||||||
@@ -2936,7 +2945,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)
|
if (mapnum < -1 || mapnum >= NUMMAPS)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Random map!
|
// Random map!
|
||||||
@@ -4016,16 +4025,16 @@ boolean replaynamesloaded = false;
|
|||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_mutex replayquerymutex;
|
I_mutex replayquerymutex;
|
||||||
|
|
||||||
// g_in_exiting_signal_handler is an evil hack
|
// I_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 (!g_in_exiting_signal_handler) { I_lock_mutex(&replayquerymutex); }
|
# define Lock_search_state() if (!I_In_Exiting_Signal_Handler()) { I_lock_mutex(&replayquerymutex); }
|
||||||
# define Unlock_search_state() if (!g_in_exiting_signal_handler) { I_unlock_mutex(replayquerymutex); }
|
# define Unlock_search_state() if (!I_In_Exiting_Signal_Handler()) { I_unlock_mutex(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
|
||||||
@@ -4113,6 +4122,9 @@ 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;
|
||||||
|
|
||||||
@@ -4145,7 +4157,9 @@ 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:
|
||||||
if (demolist_all[replayquerycheck].title[0] && strcasestr(demolist_all[replayquerycheck].title, replayqueryinput.buffer) != NULL)
|
StripColors(demo_title, demolist_all[replayquerycheck].title, sizeof(demo_title));
|
||||||
|
|
||||||
|
if (demolist_all[replayquerycheck].title[0] && strcasestr(demo_title, replayqueryinput.buffer) != NULL)
|
||||||
AddCheckedReplay(); // It matches, add it!
|
AddCheckedReplay(); // It matches, add it!
|
||||||
else
|
else
|
||||||
replayquerycheck++; // Doesn't match, moving on...
|
replayquerycheck++; // Doesn't match, moving on...
|
||||||
@@ -4905,6 +4919,7 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5402,7 +5417,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 };
|
||||||
|
|
||||||
@@ -5522,7 +5537,6 @@ 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++)
|
||||||
@@ -5682,9 +5696,6 @@ 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);
|
||||||
@@ -6470,7 +6481,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)
|
||||||
{
|
{
|
||||||
@@ -6500,7 +6511,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;
|
||||||
@@ -7944,7 +7955,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
|||||||
patch_t *statbg = (patch_t *)W_CachePatchName("K_STATBG", PU_PATCH);
|
patch_t *statbg = (patch_t *)W_CachePatchName("K_STATBG", PU_PATCH);
|
||||||
patch_t *statlr = (patch_t *)W_CachePatchName("K_STATLR", 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 *statud = (patch_t *)W_CachePatchName("K_STATUD", PU_PATCH);
|
||||||
patch_t *statdot = (patch_t *)W_CachePatchName("K_SDOT0", PU_PATCH);
|
patch_t *statdot = (patch_t *)W_CachePatchName("K_SDOT0" , PU_PATCH);
|
||||||
patch_t *patch;
|
patch_t *patch;
|
||||||
UINT8 frame;
|
UINT8 frame;
|
||||||
UINT8 speed;
|
UINT8 speed;
|
||||||
@@ -8000,14 +8011,9 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
|||||||
#define GETSELECTEDSPEED (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartspeed : skins[setupm_fakeskin].kartspeed)
|
#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)
|
#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);
|
tw = V_StringWidth("Character", 0);//V_StringWidth(GETSELECTEDSKINNAME, 0);
|
||||||
st = 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,
|
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);
|
||||||
@@ -9741,14 +9747,11 @@ static void M_ResetControls(INT32 choice)
|
|||||||
// ===============
|
// ===============
|
||||||
|
|
||||||
//added : 30-01-98:
|
//added : 30-01-98:
|
||||||
#define MAXCOLUMNMODES 12 //max modes displayed in one column
|
|
||||||
#define MAXMODEDESCS (MAXCOLUMNMODES*3)
|
|
||||||
|
|
||||||
static modedesc_t modedescs[MAXMODEDESCS];
|
static modedesc_t modedescs[MAXMODEDESCS];
|
||||||
|
|
||||||
static void M_VideoModeMenu(INT32 choice)
|
void M_VideoModeMenu(INT32 choice)
|
||||||
{
|
{
|
||||||
INT32 i, j, vdup, nummodes, width, height;
|
INT32 i, nummodes, width, height;
|
||||||
const char *desc;
|
const char *desc;
|
||||||
|
|
||||||
(void)choice;
|
(void)choice;
|
||||||
@@ -9762,54 +9765,30 @@ static void M_VideoModeMenu(INT32 choice)
|
|||||||
nummodes = VID_NumModes();
|
nummodes = VID_NumModes();
|
||||||
|
|
||||||
// DOS does not skip mode 0, because mode 0 is ALWAYS present
|
// DOS does not skip mode 0, because mode 0 is ALWAYS present
|
||||||
i = 0;
|
for (i = 0; i < nummodes && vidm_nummodes < MAXMODEDESCS; i++)
|
||||||
for (; i < nummodes && vidm_nummodes < MAXMODEDESCS; i++)
|
|
||||||
{
|
{
|
||||||
desc = VID_GetModeName(i);
|
desc = VID_GetModeName(i);
|
||||||
if (desc)
|
|
||||||
{
|
|
||||||
vdup = 0;
|
|
||||||
|
|
||||||
// when a resolution exists both under VGA and VESA, keep the
|
if (!desc)
|
||||||
// VESA mode, which is always a higher modenum
|
continue;
|
||||||
for (j = 0; j < vidm_nummodes; j++)
|
|
||||||
{
|
|
||||||
if (fastcmp(modedescs[j].desc, desc))
|
|
||||||
{
|
|
||||||
// mode(0): 320x200 is always standard VGA, not vesa
|
|
||||||
if (modedescs[j].modenum)
|
|
||||||
{
|
|
||||||
modedescs[j].modenum = i;
|
|
||||||
vdup = 1;
|
|
||||||
|
|
||||||
if (i == vid.modenum)
|
modedescs[vidm_nummodes].modenum = i;
|
||||||
vidm_selected = j;
|
modedescs[vidm_nummodes].desc = desc;
|
||||||
}
|
|
||||||
else
|
|
||||||
vdup = 1;
|
|
||||||
|
|
||||||
break;
|
if (i == vid.modenum)
|
||||||
}
|
vidm_selected = vidm_nummodes;
|
||||||
}
|
|
||||||
|
|
||||||
if (!vdup)
|
// Pull out the width and height
|
||||||
{
|
sscanf(desc, "%u%*c%u", &width, &height);
|
||||||
modedescs[vidm_nummodes].modenum = i;
|
|
||||||
modedescs[vidm_nummodes].desc = desc;
|
|
||||||
|
|
||||||
if (i == vid.modenum)
|
// Show resolutions above desktop res as red.
|
||||||
vidm_selected = vidm_nummodes;
|
if (I_CheckAboveDesktopRes(width, height))
|
||||||
|
modedescs[vidm_nummodes].goodratio = 2;
|
||||||
|
// Show multiples of 320x200 as green.
|
||||||
|
else if (SCR_IsAspectCorrect(width, height))
|
||||||
|
modedescs[vidm_nummodes].goodratio = 1;
|
||||||
|
|
||||||
// Pull out the width and height
|
vidm_nummodes++;
|
||||||
sscanf(desc, "%u%*c%u", &width, &height);
|
|
||||||
|
|
||||||
// Show multiples of 320x200 as green.
|
|
||||||
if (SCR_IsAspectCorrect(width, height))
|
|
||||||
modedescs[vidm_nummodes].goodratio = 1;
|
|
||||||
|
|
||||||
vidm_nummodes++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vidm_column_size = (vidm_nummodes+2) / 3;
|
vidm_column_size = (vidm_nummodes+2) / 3;
|
||||||
@@ -10026,7 +10005,11 @@ static void M_DrawVideoMode(void)
|
|||||||
V_DrawString(row, col, highlightflags|MENUCAPS, modedescs[i].desc);
|
V_DrawString(row, col, highlightflags|MENUCAPS, modedescs[i].desc);
|
||||||
// Show multiples of 320x200 as green.
|
// Show multiples of 320x200 as green.
|
||||||
else
|
else
|
||||||
V_DrawString(row, col, ((modedescs[i].goodratio) ? recommendedflags : 0)|MENUCAPS, modedescs[i].desc);
|
{
|
||||||
|
const UINT8 goodratio = modedescs[i].goodratio;
|
||||||
|
const INT32 goodflag = ((goodratio == 2) ? warningflags : (goodratio == 1) ? recommendedflags : 0);
|
||||||
|
V_DrawString(row, col, goodflag|MENUCAPS, modedescs[i].desc);
|
||||||
|
}
|
||||||
|
|
||||||
col += 8;
|
col += 8;
|
||||||
if ((i % vidm_column_size) == (vidm_column_size-1))
|
if ((i % vidm_column_size) == (vidm_column_size-1))
|
||||||
@@ -10050,7 +10033,6 @@ 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
|
||||||
{
|
{
|
||||||
@@ -10066,9 +10048,26 @@ static void M_DrawVideoMode(void)
|
|||||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 138,
|
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 138,
|
||||||
recommendedflags|MENUCAPS, "Marked modes are recommended.");
|
recommendedflags|MENUCAPS, "Marked modes are recommended.");
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 146,
|
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 146,
|
||||||
highlightflags|MENUCAPS, "Other modes may have visual errors.");
|
warningflags|MENUCAPS, "Marked modes are above Desktop resolution");
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 158,
|
|
||||||
highlightflags|MENUCAPS, "Larger modes may have performance issues.");
|
if (rendermode == render_opengl)
|
||||||
|
{
|
||||||
|
#ifdef USE_FBO_OGL
|
||||||
|
if (!cv_glframebuffer.value)
|
||||||
|
#endif
|
||||||
|
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 154,
|
||||||
|
warningflags|MENUCAPS, "and will have visual errors in OpenGL mode.");
|
||||||
|
|
||||||
|
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 166,
|
||||||
|
highlightflags|MENUCAPS, "Other modes may have visual errors.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 154,
|
||||||
|
highlightflags|MENUCAPS, "Other modes may have visual errors.");
|
||||||
|
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 166,
|
||||||
|
highlightflags|MENUCAPS, "Larger modes may have performance issues.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw the cursor for the VidMode menu
|
// Draw the cursor for the VidMode menu
|
||||||
|
|||||||
@@ -223,6 +223,11 @@ extern menu_t *currentMenu;
|
|||||||
extern menu_t MainDef;
|
extern menu_t MainDef;
|
||||||
extern menu_t SP_LoadDef;
|
extern menu_t SP_LoadDef;
|
||||||
|
|
||||||
|
#define MAXCOLUMNMODES 12 //max modes displayed in one column
|
||||||
|
#define MAXMODEDESCS (MAXCOLUMNMODES*3)
|
||||||
|
extern menu_t OP_VideoModeDef;
|
||||||
|
void M_VideoModeMenu(INT32 choice);
|
||||||
|
|
||||||
// Call upon joystick hotplug
|
// Call upon joystick hotplug
|
||||||
void M_SetupJoystickMenu(INT32 choice);
|
void M_SetupJoystickMenu(INT32 choice);
|
||||||
extern menu_t OP_JoystickSetDef;
|
extern menu_t OP_JoystickSetDef;
|
||||||
|
|||||||
+59
-65
@@ -986,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
|
||||||
"Should the game do Screen Textures? Provides a good boost to frames\nat the cost of some visual effects not working when disabled.",
|
"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!"
|
||||||
#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
|
||||||
@@ -1023,8 +1023,6 @@ static menuitem_t OP_OpenGLOptionsMenu[] =
|
|||||||
{IT_STRING | IT_CVAR, NULL, "Fallback Player 3D Model", &cv_glfallbackplayermodel, 20},
|
{IT_STRING | IT_CVAR, NULL, "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},
|
||||||
@@ -1045,7 +1043,6 @@ 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.",
|
||||||
@@ -1064,7 +1061,6 @@ 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,
|
||||||
@@ -1644,29 +1640,25 @@ 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},
|
||||||
|
|
||||||
#ifdef HWRENDER
|
{IT_STRING|IT_CVAR, NULL, "Water Surface Ripples", &cv_ripplewater, 50},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Screen Textures", &cv_glscreentextures, 50},
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Water Surface Ripples", &cv_ripplewater, 55},
|
{IT_STRING|IT_CVAR, NULL, "Fade Players near Camera", &cv_playerfade, 55},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Fade Players near Camera", &cv_playerfade, 60},
|
{IT_STRING|IT_CVAR, NULL, "Quake Screenshakes", &cv_screenquake, 60},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Quake Screenshakes", &cv_screenquake, 65},
|
{IT_CALL|IT_STRING, NULL, "Camera Options...", M_CameraMenu, 65},
|
||||||
|
|
||||||
{IT_CALL|IT_STRING, NULL, "Camera Options...", M_CameraMenu, 70},
|
{IT_HEADER, NULL, "Audio", NULL, 75},
|
||||||
|
|
||||||
{IT_HEADER, NULL, "Audio", NULL, 80},
|
{IT_STRING|IT_CVAR, NULL, "Reverse L/R Channels", &stereoreverse, 85},
|
||||||
|
{IT_STRING|IT_CVAR, NULL, "Same Sound Limit", &cv_samesoundlimit, 90},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Reverse L/R Channels", &stereoreverse, 90},
|
{IT_HEADER, NULL, "Controls", NULL, 100},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Same Sound Limit", &cv_samesoundlimit, 95},
|
|
||||||
|
|
||||||
{IT_HEADER, NULL, "Controls", NULL, 105},
|
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P1)", &cv_autoaccel[0], 110},
|
||||||
|
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P2)", &cv_autoaccel[1], 115},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P1)", &cv_autoaccel[0], 115},
|
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P3)", &cv_autoaccel[2], 120},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P2)", &cv_autoaccel[1], 120},
|
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P4)", &cv_autoaccel[3], 125},
|
||||||
{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[] =
|
||||||
@@ -1679,9 +1671,6 @@ 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",
|
||||||
@@ -1705,29 +1694,30 @@ 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, 40},
|
{IT_STRING | IT_CVAR, NULL, "Skin Select Spinning Speed", &cv_skinselectspin, 45},
|
||||||
|
|
||||||
{IT_STRING | IT_CVAR, NULL, "Colorized Speedlines", &cv_coloredspeedlines, 50},
|
{IT_STRING | IT_CVAR, NULL, "Colorized Speedlines", &cv_coloredspeedlines, 55},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Colorized Sneakertrails", &cv_coloredsneakertrail, 55},
|
{IT_STRING | IT_CVAR, NULL, "Colorized Sneakertrails", &cv_coloredsneakertrail, 60},
|
||||||
|
|
||||||
{IT_STRING | IT_CVAR, NULL, "Player Blendeffects", &cv_playerblendeffects, 65},
|
{IT_STRING | IT_CVAR, NULL, "Player Blendeffects", &cv_playerblendeffects, 70},
|
||||||
|
|
||||||
{IT_STRING | IT_CVAR, NULL, "Bananadrag Jitter", &cv_bananajitter, 75},
|
{IT_STRING | IT_CVAR, NULL, "Bananadrag Jitter", &cv_bananajitter, 80},
|
||||||
|
|
||||||
{IT_STRING | IT_CVAR, NULL, "Midair Driftsparks", &cv_airsparks, 85},
|
{IT_STRING | IT_CVAR, NULL, "Midair Driftsparks", &cv_airsparks, 90},
|
||||||
|
|
||||||
{IT_STRING | IT_CVAR, NULL, "Show Localskin Menus", &cv_showlocalskinmenus, 95},
|
{IT_STRING | IT_CVAR, NULL, "Show Localskin Menus", &cv_showlocalskinmenus, 100},
|
||||||
|
|
||||||
{IT_STRING | IT_CVAR, NULL, "Uppercase Menu", &cv_menucaps, 105},
|
{IT_STRING | IT_CVAR, NULL, "Uppercase Menu", &cv_menucaps, 110},
|
||||||
|
|
||||||
{IT_STRING | IT_CVAR, NULL, "Keyboard Layout", &cv_keyboardlayout, 115},
|
{IT_STRING | IT_CVAR, NULL, "Keyboard Layout", &cv_keyboardlayout, 120},
|
||||||
|
|
||||||
{IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 125},
|
{IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 130},
|
||||||
|
|
||||||
{IT_SUBMENU|IT_STRING, NULL, "Saturn Hud...", &OP_SaturnHudDef, 135},
|
{IT_SUBMENU|IT_STRING, NULL, "Saturn Hud...", &OP_SaturnHudDef, 140},
|
||||||
{IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 140},
|
{IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 145},
|
||||||
{IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 145}, // uwu
|
{IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 150}, // uwu
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char* OP_SaturnTooltips[] =
|
static const char* OP_SaturnTooltips[] =
|
||||||
@@ -1737,6 +1727,7 @@ 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!",
|
||||||
@@ -1839,47 +1830,49 @@ 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, 65},
|
{IT_STRING|IT_CVAR, NULL, "Higher Resolution Portraits", &cv_highresportrait, 70},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Small Positionnumber", &cv_smallposnum, 75},
|
{IT_STRING|IT_CVAR, NULL, "Small Positionnumber", &cv_smallposnum, 80},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Positionnumber Animation", &cv_posanim, 80},
|
{IT_STRING|IT_CVAR, NULL, "Positionnumber Animation", &cv_posanim, 85},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Flash Lap Times", &cv_showlaptimes, 90},
|
{IT_STRING|IT_CVAR, NULL, "Flash Lap Times", &cv_showlaptimes, 95},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Multi-Item icons", &cv_multiitemicon, 100},
|
{IT_STRING|IT_CVAR, NULL, "Multi-Item icons", &cv_multiitemicon, 105},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Item Amount Number", &cv_huditemamount, 105},
|
{IT_STRING|IT_CVAR, NULL, "Item Amount Number", &cv_huditemamount, 110},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 110},
|
{IT_STRING|IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 115},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 120},
|
{IT_STRING|IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 125},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 125},
|
{IT_STRING|IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 130},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 135},
|
{IT_STRING|IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 140},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 140},
|
{IT_STRING|IT_CVAR, NULL, "Show Finished on Minimap", &cv_showminimapfinished, 145},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 145},
|
{IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 150},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 150},
|
{IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 155},
|
||||||
|
{IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 160},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 160},
|
{IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 170},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Music Credits on Pause", &cv_pausesongcredits, 165},
|
{IT_STRING|IT_CVAR, NULL, "Music Credits on Pause", &cv_pausesongcredits, 175},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 175},
|
{IT_STRING|IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 185},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 185},
|
{IT_STRING|IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 195},
|
||||||
|
|
||||||
{IT_STRING|IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 195},
|
{IT_STRING|IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 205},
|
||||||
{IT_STRING|IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 200},
|
{IT_STRING|IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 210},
|
||||||
|
|
||||||
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 210},
|
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 220},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char* OP_SaturnHudTooltips[] =
|
static const char* OP_SaturnHudTooltips[] =
|
||||||
@@ -1892,6 +1885,7 @@ 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.",
|
||||||
@@ -1902,6 +1896,7 @@ 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.",
|
||||||
@@ -2781,6 +2776,5 @@ 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
|
||||||
+39
-10
@@ -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,9 +804,15 @@ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png
|
|||||||
png_infotext[5].text = locationtxt;
|
png_infotext[5].text = locationtxt;
|
||||||
png_infotext[6].text = interfacetxt;
|
png_infotext[6].text = interfacetxt;
|
||||||
png_infotext[7].text = rendermodetxt;
|
png_infotext[7].text = rendermodetxt;
|
||||||
png_infotext[8].text = strncpy(ctrevision, comprevision, sizeof(ctrevision)-1);
|
strncpy(ctrevision, comprevision, sizeof(ctrevision)-1);
|
||||||
png_infotext[9].text = strncpy(ctdate, compdate, sizeof(ctdate)-1);
|
ctrevision[sizeof(ctrevision)-1] = '\0';
|
||||||
png_infotext[10].text = strncpy(cttime, comptime, sizeof(cttime)-1);
|
png_infotext[8].text = ctrevision;
|
||||||
|
strncpy(ctdate, compdate, sizeof(ctdate)-1);
|
||||||
|
ctdate[sizeof(ctdate)-1] = '\0';
|
||||||
|
png_infotext[9].text = ctdate;
|
||||||
|
strncpy(cttime, comptime, sizeof(cttime)-1);
|
||||||
|
cttime[sizeof(cttime)-1] = '\0';
|
||||||
|
png_infotext[10].text = cttime;
|
||||||
|
|
||||||
png_set_text(png_ptr, png_info_ptr, png_infotext, SRB2PNGTXT);
|
png_set_text(png_ptr, png_info_ptr, png_infotext, SRB2PNGTXT);
|
||||||
#undef SRB2PNGTXT
|
#undef SRB2PNGTXT
|
||||||
@@ -1454,9 +1460,9 @@ INT32 axtoi(const char *hexStg)
|
|||||||
|
|
||||||
void CopyCaretColors(char *p, const char *s, int n)
|
void CopyCaretColors(char *p, const char *s, int n)
|
||||||
{
|
{
|
||||||
char *t;
|
gconst char *t;
|
||||||
int m;
|
int m;
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
if (!n)
|
if (!n)
|
||||||
return;
|
return;
|
||||||
@@ -1564,6 +1570,7 @@ char *M_GetToken(const char *inputString)
|
|||||||
{
|
{
|
||||||
startPos = endPos;
|
startPos = endPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stringToUse == NULL)
|
if (stringToUse == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -1634,7 +1641,8 @@ char *M_GetToken(const char *inputString)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If the end of the string is reached, no token is to be read
|
// If 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;
|
||||||
}
|
}
|
||||||
@@ -1644,7 +1652,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;
|
||||||
@@ -1855,8 +1863,10 @@ 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;
|
||||||
@@ -1869,6 +1879,7 @@ int M_PathParts(const char *path)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1911,7 +1922,9 @@ 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)
|
||||||
@@ -1956,6 +1969,22 @@ 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,6 +123,7 @@ 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);
|
||||||
|
|
||||||
|
|||||||
+6
-6
@@ -256,7 +256,7 @@ static boolean M_TextInputHandleBase(textinput_t *input, INT32 key, boolean emot
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((cv_keyboardlayout.value != 3 && ctrldown) || (cv_keyboardlayout.value == 3 && ctrldown && !altdown))
|
if (ctrldown && (cv_keyboardlayout.value!=3 || !altdown))
|
||||||
{
|
{
|
||||||
if (key == 'x' || key == 'X')
|
if (key == 'x' || key == 'X')
|
||||||
{
|
{
|
||||||
@@ -381,10 +381,10 @@ static boolean M_TextInputHandleBase(textinput_t *input, INT32 key, boolean emot
|
|||||||
// allow people to use keypad in console (good for typing IP addresses) - Calum
|
// allow people to use keypad in console (good for typing IP addresses) - Calum
|
||||||
if (key >= KEY_KEYPAD7 && key <= KEY_KPADDEL)
|
if (key >= KEY_KEYPAD7 && key <= KEY_KPADDEL)
|
||||||
{
|
{
|
||||||
char keypad_translation[] = {'7','8','9','-',
|
const char keypad_translation[] = {'7','8','9','-',
|
||||||
'4','5','6','+',
|
'4','5','6','+',
|
||||||
'1','2','3',
|
'1','2','3',
|
||||||
'0','.'};
|
'0', '.'};
|
||||||
|
|
||||||
key = keypad_translation[key - KEY_KEYPAD7];
|
key = keypad_translation[key - KEY_KEYPAD7];
|
||||||
}
|
}
|
||||||
@@ -392,7 +392,7 @@ static boolean M_TextInputHandleBase(textinput_t *input, INT32 key, boolean emot
|
|||||||
key = '/';
|
key = '/';
|
||||||
|
|
||||||
// same capslock code as hu_stuff.c's HU_responder. Check there for details.
|
// same capslock code as hu_stuff.c's HU_responder. Check there for details.
|
||||||
key = cv_keyboardlayout.value == 3 ? CON_ShitAndAltGrChar(key) : CON_ShiftChar(key);
|
key = CON_ShiftChar(key);
|
||||||
|
|
||||||
// enter a char into the command prompt
|
// enter a char into the command prompt
|
||||||
if (key < 32 || key > 127)
|
if (key < 32 || key > 127)
|
||||||
|
|||||||
@@ -16,6 +16,10 @@
|
|||||||
#ifndef _MD5_H
|
#ifndef _MD5_H
|
||||||
#define _MD5_H 1
|
#define _MD5_H 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#if defined (HAVE_LIMITS_H) || (defined (_LIBC) && _LIBC) || defined (_WIN32)
|
#if defined (HAVE_LIMITS_H) || (defined (_LIBC) && _LIBC) || defined (_WIN32)
|
||||||
@@ -52,4 +56,8 @@ int md5_stream(FILE *stream, void *resblock) THROWFUNC;
|
|||||||
digest. */
|
digest. */
|
||||||
extern void *md5_buffer(const char *buffer, size_t len, void *resblock) THROWFUNC;
|
extern void *md5_buffer(const char *buffer, size_t len, void *resblock) THROWFUNC;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // extern "C"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* md5.h */
|
#endif /* md5.h */
|
||||||
@@ -262,6 +262,7 @@ Finish_registration (void)
|
|||||||
{
|
{
|
||||||
CONS_Printf("\n");
|
CONS_Printf("\n");
|
||||||
CONS_Alert(CONS_NOTICE, "%s\n", rules);
|
CONS_Alert(CONS_NOTICE, "%s\n", rules);
|
||||||
|
free(rules);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (registered)
|
if (registered)
|
||||||
@@ -598,9 +599,14 @@ Update_parameters (void)
|
|||||||
delayed = MSInProgress;
|
delayed = MSInProgress;
|
||||||
|
|
||||||
if (delayed)/* do another update after the current one */
|
if (delayed)/* do another update after the current one */
|
||||||
|
{
|
||||||
|
registered = 0;
|
||||||
MSUpdateAgain = true;
|
MSUpdateAgain = true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
registered = MSRegistered;
|
registered = MSRegistered;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Unlock_state();
|
Unlock_state();
|
||||||
|
|
||||||
|
|||||||
+9
-4
@@ -3650,7 +3650,7 @@ static inline boolean PIT_GrenadeRing(mobj_t *thing)
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (thing->player && (thing->player->kartstuff[k_hyudorotimer]
|
if (thing->player && (thing->player->kartstuff[k_hyudorotimer]
|
||||||
|| (G_BattleGametype() && thing->player && thing->player->kartstuff[k_bumper] <= 0 && thing->player->kartstuff[k_comebacktimer])))
|
|| (G_BattleGametype() && thing->player->kartstuff[k_bumper] <= 0 && thing->player->kartstuff[k_comebacktimer])))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if ((gametype == GT_CTF || gametype == GT_TEAMMATCH)
|
if ((gametype == GT_CTF || gametype == GT_TEAMMATCH)
|
||||||
@@ -5301,7 +5301,7 @@ void A_MixUp(void *thing)
|
|||||||
if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE
|
if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE
|
||||||
&& !players[i].exiting && !players[i].powers[pw_super])
|
&& !players[i].exiting && !players[i].powers[pw_super])
|
||||||
{
|
{
|
||||||
if ((netgame || multiplayer) && players[i].spectator) // Ignore spectators
|
if (netgame && players[i].spectator) // Ignore spectators
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
numplayers++;
|
numplayers++;
|
||||||
@@ -5344,6 +5344,11 @@ void A_MixUp(void *thing)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// idk if we ever really end up here
|
||||||
|
// but bad things would happen if we do without this
|
||||||
|
if (one == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
//get this done first!
|
//get this done first!
|
||||||
tempthing = players[one].mo->tracer;
|
tempthing = players[one].mo->tracer;
|
||||||
P_SetTarget(&players[one].mo->tracer, players[two].mo->tracer);
|
P_SetTarget(&players[one].mo->tracer, players[two].mo->tracer);
|
||||||
@@ -7918,7 +7923,7 @@ void A_ItemPop(void *thing)
|
|||||||
|
|
||||||
if (!(actor->target && actor->target->player))
|
if (!(actor->target && actor->target->player))
|
||||||
{
|
{
|
||||||
if (cv_debug && !(actor->target && actor->target->player))
|
if (cv_debug)
|
||||||
CONS_Printf("ERROR: Powerup has no target!\n");
|
CONS_Printf("ERROR: Powerup has no target!\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -8780,7 +8785,7 @@ void A_ReaperThinker(void *thing)
|
|||||||
actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y);
|
actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y);
|
||||||
|
|
||||||
// The player we should target if it's near us:
|
// The player we should target if it's near us:
|
||||||
for (i = 0; i<MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!playeringame[i])
|
if (!playeringame[i])
|
||||||
|
|||||||
+3
-24
@@ -831,7 +831,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||||||
{
|
{
|
||||||
S_StartSound(toucher, special->info->seesound);
|
S_StartSound(toucher, special->info->seesound);
|
||||||
|
|
||||||
if (player->pflags & PF_NIGHTSMODE)
|
if (UNLIKELY(player->pflags & PF_NIGHTSMODE))
|
||||||
{
|
{
|
||||||
player->bumpertime = TICRATE/2;
|
player->bumpertime = TICRATE/2;
|
||||||
if (special->threshold > 0)
|
if (special->threshold > 0)
|
||||||
@@ -1131,7 +1131,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||||||
S_StartSound(toucher, special->info->painsound);
|
S_StartSound(toucher, special->info->painsound);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING)) || (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING))
|
else if (UNLIKELY((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING)) || (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING))
|
||||||
|| player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object?
|
|| player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object?
|
||||||
{
|
{
|
||||||
// Shatter the shield!
|
// Shatter the shield!
|
||||||
@@ -1219,24 +1219,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||||||
|
|
||||||
case MT_EXTRALARGEBUBBLE:
|
case MT_EXTRALARGEBUBBLE:
|
||||||
return; // SRB2kart - don't need bubbles mucking with the player
|
return; // SRB2kart - don't need bubbles mucking with the player
|
||||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL)
|
|
||||||
return;
|
|
||||||
if (UNLIKELY(maptol & TOL_NIGHTS))
|
|
||||||
return;
|
|
||||||
if (UNLIKELY(mariomode))
|
|
||||||
return;
|
|
||||||
else if (toucher->eflags & MFE_VERTICALFLIP)
|
|
||||||
{
|
|
||||||
if (special->z+special->height < toucher->z + toucher->height / 3
|
|
||||||
|| special->z+special->height > toucher->z + (toucher->height*2/3))
|
|
||||||
return; // Only go in the mouth
|
|
||||||
}
|
|
||||||
else if (special->z < toucher->z + toucher->height / 3
|
|
||||||
|| special->z > toucher->z + (toucher->height*2/3))
|
|
||||||
return; // Only go in the mouth
|
|
||||||
|
|
||||||
toucher->momx = toucher->momy = toucher->momz = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MT_WATERDROP:
|
case MT_WATERDROP:
|
||||||
if (special->state == &states[special->info->spawnstate])
|
if (special->state == &states[special->info->spawnstate])
|
||||||
@@ -1877,11 +1859,9 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
|
|||||||
P_SetThingPosition(target);
|
P_SetThingPosition(target);
|
||||||
P_InstaThrust(target,target->angle,FixedMul(2*FRACUNIT, target->scale));
|
P_InstaThrust(target,target->angle,FixedMul(2*FRACUNIT, target->scale));
|
||||||
target->momz = FixedMul(7*FRACUNIT, target->scale);
|
target->momz = FixedMul(7*FRACUNIT, target->scale);
|
||||||
if (flip)
|
|
||||||
target->momz = -target->momz;
|
|
||||||
|
|
||||||
if (flip)
|
if (flip)
|
||||||
{
|
{
|
||||||
|
target->momz = -target->momz;
|
||||||
target = P_SpawnMobj(x,y,z-FixedMul(12*FRACUNIT, target->scale),MT_SPIKE);
|
target = P_SpawnMobj(x,y,z-FixedMul(12*FRACUNIT, target->scale),MT_SPIKE);
|
||||||
target->eflags |= MFE_VERTICALFLIP;
|
target->eflags |= MFE_VERTICALFLIP;
|
||||||
}
|
}
|
||||||
@@ -2420,7 +2400,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||||||
{
|
{
|
||||||
player->kartstuff[k_sneakertimer] = 0;
|
player->kartstuff[k_sneakertimer] = 0;
|
||||||
K_SpinPlayer(player, source, 1, inflictor, false);
|
K_SpinPlayer(player, source, 1, inflictor, false);
|
||||||
damage = player->mo->health - 1;
|
|
||||||
P_RingDamage(player, inflictor, source);
|
P_RingDamage(player, inflictor, source);
|
||||||
P_PlayerRingBurst(player, 5);
|
P_PlayerRingBurst(player, 5);
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,6 @@ extern "C" {
|
|||||||
|
|
||||||
#define FLOATSPEED (FRACUNIT*4)
|
#define FLOATSPEED (FRACUNIT*4)
|
||||||
|
|
||||||
//#define VIEWHEIGHTS "41"
|
|
||||||
|
|
||||||
// Maximum player score.
|
// Maximum player score.
|
||||||
#define MAXSCORE 999999990
|
#define MAXSCORE 999999990
|
||||||
|
|
||||||
@@ -214,7 +212,6 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj);
|
|||||||
void P_GivePlayerRings(player_t *player, INT32 num_rings);
|
void P_GivePlayerRings(player_t *player, INT32 num_rings);
|
||||||
void P_GivePlayerLives(player_t *player, INT32 numlives);
|
void P_GivePlayerLives(player_t *player, INT32 numlives);
|
||||||
UINT8 P_GetNextEmerald(void);
|
UINT8 P_GetNextEmerald(void);
|
||||||
void P_GiveEmerald(boolean spawnObj);
|
|
||||||
void P_ResetScore(player_t *player);
|
void P_ResetScore(player_t *player);
|
||||||
boolean P_AutoPause(void);
|
boolean P_AutoPause(void);
|
||||||
|
|
||||||
@@ -239,14 +236,10 @@ void P_InstaThrustEvenIn2D(mobj_t *mo, angle_t angle, fixed_t move);
|
|||||||
boolean P_LookForEnemies(player_t *player);
|
boolean P_LookForEnemies(player_t *player);
|
||||||
void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius);
|
void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius);
|
||||||
void P_HomingAttack(mobj_t *source, mobj_t *enemy); /// \todo doesn't belong in p_user
|
void P_HomingAttack(mobj_t *source, mobj_t *enemy); /// \todo doesn't belong in p_user
|
||||||
//boolean P_SuperReady(player_t *player);
|
|
||||||
boolean P_AnalogMove(player_t *player);
|
boolean P_AnalogMove(player_t *player);
|
||||||
/*boolean P_TransferToNextMare(player_t *player);
|
|
||||||
UINT8 P_FindLowestMare(void);*/
|
|
||||||
UINT8 P_FindLowestLap(void);
|
UINT8 P_FindLowestLap(void);
|
||||||
UINT8 P_FindHighestLap(void);
|
UINT8 P_FindHighestLap(void);
|
||||||
void P_FindEmerald(void);
|
void P_FindEmerald(void);
|
||||||
//void P_TransferToAxis(player_t *player, INT32 axisnum);
|
|
||||||
boolean P_PlayerMoving(INT32 pnum);
|
boolean P_PlayerMoving(INT32 pnum);
|
||||||
void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range);
|
void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range);
|
||||||
|
|
||||||
|
|||||||
+28
-76
@@ -122,27 +122,6 @@ static void P_CycleMobjState(mobj_t *mobj)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// P_CycleMobjState for players.
|
|
||||||
//
|
|
||||||
static void P_CyclePlayerMobjState(mobj_t *mobj)
|
|
||||||
{
|
|
||||||
// state animations
|
|
||||||
P_CycleStateAnimation(mobj);
|
|
||||||
|
|
||||||
// cycle through states,
|
|
||||||
// calling action functions at transitions
|
|
||||||
if (mobj->tics != -1)
|
|
||||||
{
|
|
||||||
mobj->tics--;
|
|
||||||
|
|
||||||
// you can cycle through multiple states in a tic
|
|
||||||
if (!mobj->tics && mobj->state)
|
|
||||||
if (!P_SetPlayerMobjState(mobj, mobj->state->nextstate))
|
|
||||||
return; // freed itself
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MAX_RECURSION 20
|
#define MAX_RECURSION 20
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -335,7 +314,7 @@ static boolean P_SetPrecipMobjState(precipmobj_t *mobj, statenum_t state)
|
|||||||
mobj->tics = st->tics;
|
mobj->tics = st->tics;
|
||||||
mobj->sprite = st->sprite;
|
mobj->sprite = st->sprite;
|
||||||
mobj->frame = st->frame;
|
mobj->frame = st->frame;
|
||||||
mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set
|
//mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -919,12 +898,7 @@ static void P_PlayerFlip(mobj_t *mo)
|
|||||||
G_GhostAddFlip((INT32) (mo->player - players));
|
G_GhostAddFlip((INT32) (mo->player - players));
|
||||||
// Flip aiming to match!
|
// Flip aiming to match!
|
||||||
|
|
||||||
if (UNLIKELY(mo->player->pflags & PF_NIGHTSMODE)) // NiGHTS doesn't use flipcam
|
if (mo->player->pflags & PF_FLIPCAM)
|
||||||
{
|
|
||||||
if (mo->tracer)
|
|
||||||
mo->tracer->eflags ^= MFE_VERTICALFLIP;
|
|
||||||
}
|
|
||||||
else if (mo->player->pflags & PF_FLIPCAM)
|
|
||||||
{
|
{
|
||||||
UINT8 i;
|
UINT8 i;
|
||||||
|
|
||||||
@@ -946,6 +920,11 @@ static void P_PlayerFlip(mobj_t *mo)
|
|||||||
camera[i].z += FixedMul(20*FRACUNIT, mo->scale);
|
camera[i].z += FixedMul(20*FRACUNIT, mo->scale);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (UNLIKELY(mo->player->pflags & PF_NIGHTSMODE)) // NiGHTS doesn't use flipcam
|
||||||
|
{
|
||||||
|
if (mo->tracer)
|
||||||
|
mo->tracer->eflags ^= MFE_VERTICALFLIP;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1670,6 +1649,14 @@ void P_XYMovement(mobj_t *mo)
|
|||||||
if (mo->flags & MF_NOCLIPHEIGHT)
|
if (mo->flags & MF_NOCLIPHEIGHT)
|
||||||
return; // no frictions for objects that can pass through floors
|
return; // no frictions for objects that can pass through floors
|
||||||
|
|
||||||
|
//{ SRB2kart stuff
|
||||||
|
if (mo->type == MT_ORBINAUT || mo->type == MT_JAWZ_DUD || mo->type == MT_JAWZ || mo->type == MT_BALLHOG) //(mo->type == MT_JAWZ && !mo->tracer))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (mo->player && (mo->player->kartstuff[k_spinouttimer] && !mo->player->kartstuff[k_wipeoutslow]) && mo->player->speed <= K_GetKartSpeed(mo->player, false)/2)
|
||||||
|
return;
|
||||||
|
//}
|
||||||
|
|
||||||
if (mo->flags & MF_MISSILE || mo->flags2 & MF2_SKULLFLY || mo->type == MT_SHELL || mo->type == MT_VULTURE)
|
if (mo->flags & MF_MISSILE || mo->flags2 & MF2_SKULLFLY || mo->type == MT_SHELL || mo->type == MT_VULTURE)
|
||||||
return; // no friction for missiles ever
|
return; // no friction for missiles ever
|
||||||
|
|
||||||
@@ -1683,14 +1670,6 @@ void P_XYMovement(mobj_t *mo)
|
|||||||
&& (mo->standingslope && abs(mo->standingslope->zdelta) > FRACUNIT>>8)) // Special exception for tumbleweeds on slopes
|
&& (mo->standingslope && abs(mo->standingslope->zdelta) > FRACUNIT>>8)) // Special exception for tumbleweeds on slopes
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//{ SRB2kart stuff
|
|
||||||
if (mo->type == MT_ORBINAUT || mo->type == MT_JAWZ_DUD || mo->type == MT_JAWZ || mo->type == MT_BALLHOG) //(mo->type == MT_JAWZ && !mo->tracer))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (mo->player && (mo->player->kartstuff[k_spinouttimer] && !mo->player->kartstuff[k_wipeoutslow]) && mo->player->speed <= K_GetKartSpeed(mo->player, false)/2)
|
|
||||||
return;
|
|
||||||
//}
|
|
||||||
|
|
||||||
if (((!(mo->eflags & MFE_VERTICALFLIP) && mo->z > mo->floorz) || (mo->eflags & MFE_VERTICALFLIP && mo->z+mo->height < mo->ceilingz))
|
if (((!(mo->eflags & MFE_VERTICALFLIP) && mo->z > mo->floorz) || (mo->eflags & MFE_VERTICALFLIP && mo->z+mo->height < mo->ceilingz))
|
||||||
&& !(player && player->pflags & PF_SLIDING))
|
&& !(player && player->pflags & PF_SLIDING))
|
||||||
return; // no friction when airborne
|
return; // no friction when airborne
|
||||||
@@ -3210,30 +3189,6 @@ static boolean P_CameraCheckWater(camera_t *thiscam)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void P_DestroyRobots(void)
|
|
||||||
{
|
|
||||||
// Search through all the thinkers for enemies.
|
|
||||||
mobj_t *mo;
|
|
||||||
thinker_t *think;
|
|
||||||
|
|
||||||
for (think = thinkercap.next; think != &thinkercap; think = think->next)
|
|
||||||
{
|
|
||||||
if (think->function != (actionf_p1)P_MobjThinker)
|
|
||||||
continue; // not a mobj thinker
|
|
||||||
|
|
||||||
mo = (mobj_t *)think;
|
|
||||||
|
|
||||||
if (mo->health <= 0 || !(mo->flags & MF_ENEMY || mo->flags & MF_BOSS))
|
|
||||||
continue; // not a valid enemy
|
|
||||||
|
|
||||||
if (mo->type == MT_PLAYER) // Don't chase after other players!
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Found a target enemy
|
|
||||||
P_KillMobj(mo, players[consoleplayer].mo, players[consoleplayer].mo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// the below is chasecam only, if you're curious. check out P_CalcPostImg in p_user.c for first person
|
// the below is chasecam only, if you're curious. check out P_CalcPostImg in p_user.c for first person
|
||||||
void P_CalcChasePostImg(player_t *player, camera_t *thiscam)
|
void P_CalcChasePostImg(player_t *player, camera_t *thiscam)
|
||||||
{
|
{
|
||||||
@@ -3252,7 +3207,7 @@ void P_CalcChasePostImg(player_t *player, camera_t *thiscam)
|
|||||||
player_flipcam = cv_flipcam[pnum].value;
|
player_flipcam = cv_flipcam[pnum].value;
|
||||||
}
|
}
|
||||||
|
|
||||||
const boolean flipcam = (player_flipcam && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP);
|
const boolean flipcam = (player_flipcam && player->mo->eflags & MFE_VERTICALFLIP && LIKELY(!(player->pflags & PF_NIGHTSMODE)));
|
||||||
UINT8 postimgtype = 0;
|
UINT8 postimgtype = 0;
|
||||||
|
|
||||||
if (encoremode)
|
if (encoremode)
|
||||||
@@ -3620,7 +3575,7 @@ boolean P_PrecipThinker(precipmobj_t *mobj)
|
|||||||
mobj->lastThink = leveltime;
|
mobj->lastThink = leveltime;
|
||||||
|
|
||||||
R_ResetPrecipitationMobjInterpolationState(mobj);
|
R_ResetPrecipitationMobjInterpolationState(mobj);
|
||||||
P_CycleStateAnimation((mobj_t *)mobj);
|
//P_CycleStateAnimation((mobj_t *)mobj); // if we ever want animated precip, readd a specific function which does not need casting
|
||||||
|
|
||||||
if (mobj->state == &states[S_RAINRETURN])
|
if (mobj->state == &states[S_RAINRETURN])
|
||||||
{
|
{
|
||||||
@@ -5665,13 +5620,15 @@ void P_SetScale(mobj_t *mobj, fixed_t newscale)
|
|||||||
void P_Attract(mobj_t *source, mobj_t *dest, boolean nightsgrab) // Home in on your target
|
void P_Attract(mobj_t *source, mobj_t *dest, boolean nightsgrab) // Home in on your target
|
||||||
{
|
{
|
||||||
fixed_t dist, ndist, speedmul;
|
fixed_t dist, ndist, speedmul;
|
||||||
fixed_t tx = dest->x;
|
fixed_t tx, ty, tz;
|
||||||
fixed_t ty = dest->y;
|
|
||||||
fixed_t tz = dest->z + (dest->height/2); // Aim for center
|
|
||||||
|
|
||||||
if (!dest || dest->health <= 0 || !dest->player || !source->tracer)
|
if (!dest || dest->health <= 0 || !dest->player || !source->tracer)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
tx = dest->x;
|
||||||
|
ty = dest->y;
|
||||||
|
tz = dest->z + (dest->height/2); // Aim for center
|
||||||
|
|
||||||
// change slope
|
// change slope
|
||||||
dist = P_AproxDistance(P_AproxDistance(tx - source->x, ty - source->y), tz - source->z);
|
dist = P_AproxDistance(P_AproxDistance(tx - source->x, ty - source->y), tz - source->z);
|
||||||
|
|
||||||
@@ -6986,7 +6943,7 @@ static boolean P_MobjDeadThink(mobj_t *mobj)
|
|||||||
fixed_t ns;
|
fixed_t ns;
|
||||||
mobj_t *mo2;
|
mobj_t *mo2;
|
||||||
|
|
||||||
i = P_RandomByte();
|
i = P_RandomByte(); // grrrrrr
|
||||||
z = mobj->subsector->sector->floorheight + ((P_RandomByte()&63)*FRACUNIT);
|
z = mobj->subsector->sector->floorheight + ((P_RandomByte()&63)*FRACUNIT);
|
||||||
|
|
||||||
for (j = 0; j < 2; j++)
|
for (j = 0; j < 2; j++)
|
||||||
@@ -8553,7 +8510,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||||||
|
|
||||||
if (mobj->tracer && mobj->tracer->player)
|
if (mobj->tracer && mobj->tracer->player)
|
||||||
{
|
{
|
||||||
if (!(mobj->tracer->player->pflags & PF_NIGHTSMODE))
|
if (LIKELY(!(mobj->tracer->player->pflags & PF_NIGHTSMODE)))
|
||||||
{
|
{
|
||||||
mobj->flags &= ~MF_NOGRAVITY;
|
mobj->flags &= ~MF_NOGRAVITY;
|
||||||
mobj->flags2 &= ~MF2_DONTDRAW;
|
mobj->flags2 &= ~MF2_DONTDRAW;
|
||||||
@@ -8577,7 +8534,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||||||
P_SetTarget(&mobj->target, NULL);
|
P_SetTarget(&mobj->target, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mobj->tracer->player->pflags & PF_NIGHTSMODE)
|
if (UNLIKELY(mobj->tracer->player->pflags & PF_NIGHTSMODE))
|
||||||
{
|
{
|
||||||
if (mobj->tracer->player->bonustime)
|
if (mobj->tracer->player->bonustime)
|
||||||
{
|
{
|
||||||
@@ -9221,10 +9178,7 @@ void P_MobjThinker(mobj_t *mobj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Can end up here if a player dies.
|
// Can end up here if a player dies.
|
||||||
if (mobj->player)
|
P_CycleMobjState(mobj);
|
||||||
P_CyclePlayerMobjState(mobj);
|
|
||||||
else
|
|
||||||
P_CycleMobjState(mobj);
|
|
||||||
|
|
||||||
if (P_MobjWasRemoved(mobj))
|
if (P_MobjWasRemoved(mobj))
|
||||||
return;
|
return;
|
||||||
@@ -10034,7 +9988,7 @@ static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype
|
|||||||
|
|
||||||
mobj->x = x;
|
mobj->x = x;
|
||||||
mobj->y = y;
|
mobj->y = y;
|
||||||
mobj->flags = info->flags;
|
//mobj->flags = info->flags;
|
||||||
|
|
||||||
// do not set the state with P_SetMobjState,
|
// do not set the state with P_SetMobjState,
|
||||||
// because action routines can not be called yet
|
// because action routines can not be called yet
|
||||||
@@ -10044,7 +9998,7 @@ static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype
|
|||||||
mobj->tics = st->tics;
|
mobj->tics = st->tics;
|
||||||
mobj->sprite = st->sprite;
|
mobj->sprite = st->sprite;
|
||||||
mobj->frame = st->frame; // FF_FRAMEMASK for frame, and other bits..
|
mobj->frame = st->frame; // FF_FRAMEMASK for frame, and other bits..
|
||||||
mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set
|
//mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set
|
||||||
|
|
||||||
// set subsector and/or block links
|
// set subsector and/or block links
|
||||||
P_SetPrecipitationThingPosition(mobj);
|
P_SetPrecipitationThingPosition(mobj);
|
||||||
@@ -11118,8 +11072,6 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
|||||||
{
|
{
|
||||||
if (!cv_powerstones.value || !G_BattleGametype())
|
if (!cv_powerstones.value || !G_BattleGametype())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
runemeraldmanager = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!G_RaceGametype()) // No enemies in match or CTF modes
|
if (!G_RaceGametype()) // No enemies in match or CTF modes
|
||||||
|
|||||||
+2
-7
@@ -444,12 +444,10 @@ typedef struct precipmobj_s
|
|||||||
// More drawing info: to determine current sprite.
|
// More drawing info: to determine current sprite.
|
||||||
spritenum_t sprite; // used to find patch_t and flip value
|
spritenum_t sprite; // used to find patch_t and flip value
|
||||||
UINT32 frame; // frame number, plus bits see p_pspr.h
|
UINT32 frame; // frame number, plus bits see p_pspr.h
|
||||||
UINT16 anim_duration; // for FF_ANIMATE states
|
//UINT16 anim_duration; // for FF_ANIMATE states
|
||||||
|
|
||||||
INT16 lightlevel; // Add to sector lightlevel, -255 - 255
|
INT16 lightlevel; // Add to sector lightlevel, -255 - 255
|
||||||
|
|
||||||
struct mprecipsecnode_s *touching_sectorlist; // a linked list of sectors where this object appears
|
|
||||||
|
|
||||||
struct subsector_s *subsector; // Subsector the mobj resides in.
|
struct subsector_s *subsector; // Subsector the mobj resides in.
|
||||||
|
|
||||||
// The closest interval over all contacted sectors (or things).
|
// The closest interval over all contacted sectors (or things).
|
||||||
@@ -458,11 +456,10 @@ typedef struct precipmobj_s
|
|||||||
|
|
||||||
// Momentums, used to update position.
|
// Momentums, used to update position.
|
||||||
fixed_t momx, momy, momz;
|
fixed_t momx, momy, momz;
|
||||||
fixed_t precipflags; // fixed_t so it uses the same spot as "pmomz" even as we use precipflags_t for it
|
precipflag_t precipflags;
|
||||||
|
|
||||||
state_t *state;
|
state_t *state;
|
||||||
INT32 tics; // state tic counter
|
INT32 tics; // state tic counter
|
||||||
UINT32 flags; // flags from mobjinfo tables
|
|
||||||
tic_t lastThink;
|
tic_t lastThink;
|
||||||
} precipmobj_t;
|
} precipmobj_t;
|
||||||
|
|
||||||
@@ -502,7 +499,6 @@ void P_SpawnPrecipitation(void);
|
|||||||
void P_SpawnParaloop(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, statenum_t nstate, angle_t rotangle, boolean spawncenter);
|
void P_SpawnParaloop(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, statenum_t nstate, angle_t rotangle, boolean spawncenter);
|
||||||
boolean P_BossTargetPlayer(mobj_t *actor, boolean closest);
|
boolean P_BossTargetPlayer(mobj_t *actor, boolean closest);
|
||||||
boolean P_SupermanLook4Players(mobj_t *actor);
|
boolean P_SupermanLook4Players(mobj_t *actor);
|
||||||
void P_DestroyRobots(void);
|
|
||||||
boolean P_PrecipThinker(precipmobj_t *mobj);
|
boolean P_PrecipThinker(precipmobj_t *mobj);
|
||||||
void P_NullPrecipThinker(precipmobj_t *mobj);
|
void P_NullPrecipThinker(precipmobj_t *mobj);
|
||||||
void P_FreePrecipMobj(precipmobj_t *mobj);
|
void P_FreePrecipMobj(precipmobj_t *mobj);
|
||||||
@@ -513,7 +509,6 @@ void P_EmeraldManager(void);
|
|||||||
#define MAXHUNTEMERALDS 64
|
#define MAXHUNTEMERALDS 64
|
||||||
extern mapthing_t *huntemeralds[MAXHUNTEMERALDS];
|
extern mapthing_t *huntemeralds[MAXHUNTEMERALDS];
|
||||||
extern INT32 numhuntemeralds;
|
extern INT32 numhuntemeralds;
|
||||||
extern boolean runemeraldmanager;
|
|
||||||
extern INT32 numstarposts;
|
extern INT32 numstarposts;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
+12
-116
@@ -218,8 +218,6 @@ static void P_ClearSingleMapHeaderInfo(INT16 i)
|
|||||||
mapheaderinfo[num]->musname[6] = 0;
|
mapheaderinfo[num]->musname[6] = 0;
|
||||||
mapheaderinfo[num]->mustrack = 0;
|
mapheaderinfo[num]->mustrack = 0;
|
||||||
mapheaderinfo[num]->muspos = 0;
|
mapheaderinfo[num]->muspos = 0;
|
||||||
mapheaderinfo[num]->musinterfadeout = 0;
|
|
||||||
mapheaderinfo[num]->musintername[0] = '\0';
|
|
||||||
mapheaderinfo[num]->forcecharacter[0] = '\0';
|
mapheaderinfo[num]->forcecharacter[0] = '\0';
|
||||||
mapheaderinfo[num]->weather = 0;
|
mapheaderinfo[num]->weather = 0;
|
||||||
mapheaderinfo[num]->skynum = 1;
|
mapheaderinfo[num]->skynum = 1;
|
||||||
@@ -237,16 +235,10 @@ static void P_ClearSingleMapHeaderInfo(INT16 i)
|
|||||||
mapheaderinfo[num]->numlaps = NUMLAPS_DEFAULT;
|
mapheaderinfo[num]->numlaps = NUMLAPS_DEFAULT;
|
||||||
mapheaderinfo[num]->unlockrequired = -1;
|
mapheaderinfo[num]->unlockrequired = -1;
|
||||||
mapheaderinfo[num]->levelselect = 0;
|
mapheaderinfo[num]->levelselect = 0;
|
||||||
mapheaderinfo[num]->bonustype = 0;
|
|
||||||
mapheaderinfo[num]->saveoverride = SAVE_DEFAULT;
|
|
||||||
mapheaderinfo[num]->levelflags = 0;
|
mapheaderinfo[num]->levelflags = 0;
|
||||||
mapheaderinfo[num]->menuflags = (mainwads ? 0 : LF2_EXISTSHACK); // see p_setup.c - prevents replacing maps in addons with easier versions
|
mapheaderinfo[num]->menuflags = (mainwads ? 0 : LF2_EXISTSHACK); // see p_setup.c - prevents replacing maps in addons with easier versions
|
||||||
|
|
||||||
// TODO grades support for delfile (pfft yeah right)
|
|
||||||
P_DeleteGrades(num);
|
|
||||||
|
|
||||||
// SRB2Kart
|
// SRB2Kart
|
||||||
//mapheaderinfo[num]->automap = false;
|
|
||||||
mapheaderinfo[num]->mobj_scale = FRACUNIT;
|
mapheaderinfo[num]->mobj_scale = FRACUNIT;
|
||||||
|
|
||||||
mapheaderinfo[num]->customopts = NULL;
|
mapheaderinfo[num]->customopts = NULL;
|
||||||
@@ -266,107 +258,11 @@ void P_AllocMapHeader(INT16 i)
|
|||||||
if (!mapheaderinfo[i])
|
if (!mapheaderinfo[i])
|
||||||
{
|
{
|
||||||
mapheaderinfo[i] = Z_Malloc(sizeof(mapheader_t), PU_STATIC, NULL);
|
mapheaderinfo[i] = Z_Malloc(sizeof(mapheader_t), PU_STATIC, NULL);
|
||||||
mapheaderinfo[i]->grades = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
P_ClearSingleMapHeaderInfo(i + 1);
|
P_ClearSingleMapHeaderInfo(i + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** NiGHTS Grades are a special structure,
|
|
||||||
* we initialize them here.
|
|
||||||
*
|
|
||||||
* \param i Index of header to allocate grades for
|
|
||||||
* \param mare The mare we're adding grades for
|
|
||||||
* \param grades the string from DeHackEd, we work with it ourselves
|
|
||||||
*/
|
|
||||||
void P_AddGradesForMare(INT16 i, UINT8 mare, char *gtext)
|
|
||||||
{
|
|
||||||
INT32 g;
|
|
||||||
char *spos = gtext;
|
|
||||||
|
|
||||||
CONS_Debug(DBG_SETUP, "Map %d Mare %d: ", i+1, (UINT16)mare+1);
|
|
||||||
|
|
||||||
if (mapheaderinfo[i]->numGradedMares < mare+1)
|
|
||||||
{
|
|
||||||
mapheaderinfo[i]->numGradedMares = mare+1;
|
|
||||||
mapheaderinfo[i]->grades = Z_Realloc(mapheaderinfo[i]->grades, sizeof(nightsgrades_t) * mapheaderinfo[i]->numGradedMares, PU_STATIC, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (g = 0; g < 6; ++g)
|
|
||||||
{
|
|
||||||
// Allow "partial" grading systems
|
|
||||||
if (spos != NULL)
|
|
||||||
{
|
|
||||||
mapheaderinfo[i]->grades[mare].grade[g] = atoi(spos);
|
|
||||||
CONS_Debug(DBG_SETUP, "%u ", atoi(spos));
|
|
||||||
// Grab next comma
|
|
||||||
spos = strchr(spos, ',');
|
|
||||||
if (spos)
|
|
||||||
++spos;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Grade not reachable
|
|
||||||
mapheaderinfo[i]->grades[mare].grade[g] = UINT32_MAX;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CONS_Debug(DBG_SETUP, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** And this removes the grades safely.
|
|
||||||
*
|
|
||||||
* \param i The header to remove grades from
|
|
||||||
*/
|
|
||||||
void P_DeleteGrades(INT16 i)
|
|
||||||
{
|
|
||||||
Z_Free(mapheaderinfo[i]->grades);
|
|
||||||
mapheaderinfo[i]->grades = NULL;
|
|
||||||
mapheaderinfo[i]->numGradedMares = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** And this fetches the grades
|
|
||||||
*
|
|
||||||
* \param pscore The player's score.
|
|
||||||
* \param map The game map.
|
|
||||||
* \param mare The mare to test.
|
|
||||||
*/
|
|
||||||
UINT8 P_GetGrade(UINT32 pscore, INT16 map, UINT8 mare)
|
|
||||||
{
|
|
||||||
INT32 i;
|
|
||||||
|
|
||||||
// Determining the grade
|
|
||||||
if (mapheaderinfo[map-1] && mapheaderinfo[map-1]->grades && mapheaderinfo[map-1]->numGradedMares >= mare + 1)
|
|
||||||
{
|
|
||||||
INT32 pgrade = 0;
|
|
||||||
for (i = 0; i < 6; ++i)
|
|
||||||
{
|
|
||||||
if (pscore >= mapheaderinfo[map-1]->grades[mare].grade[i])
|
|
||||||
++pgrade;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (UINT8)pgrade;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
UINT8 P_HasGrades(INT16 map, UINT8 mare)
|
|
||||||
{
|
|
||||||
// Determining the grade
|
|
||||||
// Mare 0 is treated as overall and is true if ANY grades exist
|
|
||||||
return (mapheaderinfo[map-1] && mapheaderinfo[map-1]->grades
|
|
||||||
&& (mare == 0 || mapheaderinfo[map-1]->numGradedMares >= mare));
|
|
||||||
}
|
|
||||||
|
|
||||||
UINT32 P_GetScoreForGrade(INT16 map, UINT8 mare, UINT8 grade)
|
|
||||||
{
|
|
||||||
// Get the score for the grade... if it exists
|
|
||||||
if (grade == GRADE_F || grade > GRADE_S || !P_HasGrades(map, mare)) return 0;
|
|
||||||
|
|
||||||
return mapheaderinfo[map-1]->grades[mare].grade[grade-1];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loads the vertexes for a level.
|
// Loads the vertexes for a level.
|
||||||
FUNCINLINE static ATTRINLINE void P_LoadVertices(UINT8 *data)
|
FUNCINLINE static ATTRINLINE void P_LoadVertices(UINT8 *data)
|
||||||
{
|
{
|
||||||
@@ -414,7 +310,7 @@ void P_UpdateSegLightOffset(seg_t *li)
|
|||||||
angle_t liAngle = R_PointToAngle2(0, 0, (li->v1->x - li->v2->x), (li->v1->y - li->v2->y)) - ANGLE_90;
|
angle_t liAngle = R_PointToAngle2(0, 0, (li->v1->x - li->v2->x), (li->v1->y - li->v2->y)) - ANGLE_90;
|
||||||
|
|
||||||
light = FixedMul(FINECOSINE(liAngle >> ANGLETOFINESHIFT), FINECOSINE(maplighting.angle >> ANGLETOFINESHIFT))
|
light = FixedMul(FINECOSINE(liAngle >> ANGLETOFINESHIFT), FINECOSINE(maplighting.angle >> ANGLETOFINESHIFT))
|
||||||
+ FixedMul(FINESINE(liAngle >> ANGLETOFINESHIFT), FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
|
+ FixedMul(FINESINE(liAngle >> ANGLETOFINESHIFT), FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
|
||||||
light = (light + FRACUNIT) / 2;
|
light = (light + FRACUNIT) / 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1914,7 +1810,7 @@ static void P_LoadMapBSP(const virtres_t* virt)
|
|||||||
if (numsubsectors <= 0)
|
if (numsubsectors <= 0)
|
||||||
I_Error("Level has no subsectors (did you forget to run it through a nodesbuilder?)");
|
I_Error("Level has no subsectors (did you forget to run it through a nodesbuilder?)");
|
||||||
if (numnodes <= 0)
|
if (numnodes <= 0)
|
||||||
I_Error("Level has no nodes");
|
I_Error("Level has no nodes (does your map have at least 2 sectors?)");
|
||||||
if (numsegs <= 0)
|
if (numsegs <= 0)
|
||||||
I_Error("Level has no segs");
|
I_Error("Level has no segs");
|
||||||
|
|
||||||
@@ -2047,7 +1943,6 @@ static void P_LevelInitStuff(boolean reloadinggamestate)
|
|||||||
|
|
||||||
// special stage tokens, emeralds, and ring total
|
// special stage tokens, emeralds, and ring total
|
||||||
tokenbits = 0;
|
tokenbits = 0;
|
||||||
runemeraldmanager = false;
|
|
||||||
nummaprings = nummapboxes = numgotboxes = 0;
|
nummaprings = nummapboxes = numgotboxes = 0;
|
||||||
|
|
||||||
// emerald hunt
|
// emerald hunt
|
||||||
@@ -2077,10 +1972,10 @@ static void P_LevelInitStuff(boolean reloadinggamestate)
|
|||||||
stagefailed = false;
|
stagefailed = false;
|
||||||
|
|
||||||
// earthquake camera
|
// earthquake camera
|
||||||
memset(&quake,0,sizeof(struct quake));
|
memset(&quake, 0, sizeof(struct quake));
|
||||||
|
|
||||||
// song credit init
|
// song credit init
|
||||||
memset(&cursongcredit,0,sizeof(struct cursongcredit));
|
memset(&cursongcredit, 0, sizeof(struct cursongcredit));
|
||||||
cursongcredit.trans = NUMTRANSMAPS;
|
cursongcredit.trans = NUMTRANSMAPS;
|
||||||
|
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
@@ -2174,14 +2069,14 @@ static INT32 P_MakeBufferMD5(const char *buffer, size_t len, void *resblock)
|
|||||||
memset(resblock, 0x00, 16);
|
memset(resblock, 0x00, 16);
|
||||||
return 1;
|
return 1;
|
||||||
#else
|
#else
|
||||||
tic_t t = I_GetTime();
|
precise_t t = I_GetPreciseTime();
|
||||||
|
|
||||||
CONS_Debug(DBG_SETUP, "Making MD5\n");
|
CONS_Debug(DBG_SETUP, "Making MD5\n");
|
||||||
|
|
||||||
if (md5_buffer(buffer, len, resblock) == NULL)
|
if (md5_buffer(buffer, len, resblock) == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
CONS_Debug(DBG_SETUP, "MD5 calc took %f seconds\n", (float)(I_GetTime() - t)/NEWTICRATE);
|
CONS_Debug(DBG_SETUP, "MD5 calc took %f seconds\n", (float)(I_GetPreciseTime() - t)/I_GetPrecisePrecision());
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
@@ -2203,10 +2098,10 @@ static void P_MakeMapMD5(virtres_t *virt, void *dest)
|
|||||||
virtlump_t* virtmthings = vres_Find(virt, "THINGS");
|
virtlump_t* virtmthings = vres_Find(virt, "THINGS");
|
||||||
virtlump_t* virtsides = vres_Find(virt, "SIDEDEFS");
|
virtlump_t* virtsides = vres_Find(virt, "SIDEDEFS");
|
||||||
|
|
||||||
P_MakeBufferMD5((char*)virtlines->data, virtlines->size, linemd5);
|
P_MakeBufferMD5((char*)virtlines->data, virtlines->size, linemd5);
|
||||||
P_MakeBufferMD5((char*)virtsectors->data, virtsectors->size, sectormd5);
|
P_MakeBufferMD5((char*)virtsectors->data, virtsectors->size, sectormd5);
|
||||||
P_MakeBufferMD5((char*)virtmthings->data, virtmthings->size, thingmd5);
|
P_MakeBufferMD5((char*)virtmthings->data, virtmthings->size, thingmd5);
|
||||||
P_MakeBufferMD5((char*)virtsides->data, virtsides->size, sidedefmd5);
|
P_MakeBufferMD5((char*)virtsides->data, virtsides->size, sidedefmd5);
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
for (i = 0; i < 16; i++)
|
||||||
resmd5[i] = (linemd5[i] + sectormd5[i] + thingmd5[i] + sidedefmd5[i]) & 0xFF;
|
resmd5[i] = (linemd5[i] + sectormd5[i] + thingmd5[i] + sidedefmd5[i]) & 0xFF;
|
||||||
@@ -2691,7 +2586,8 @@ void P_FreeLevelState(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Clear pointers that would be left dangling by the purge
|
// Clear pointers that would be left dangling by the purge
|
||||||
R_FlushTranslationColormapCache();
|
// Pointers are now PU_STATIC so they won't be freed :)
|
||||||
|
//R_FlushTranslationColormapCache();
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
// Free GPU textures before freeing patches.
|
// Free GPU textures before freeing patches.
|
||||||
|
|||||||
@@ -114,13 +114,6 @@ size_t P_PrecacheLevelFlats(void);
|
|||||||
|
|
||||||
void P_AllocMapHeader(INT16 i);
|
void P_AllocMapHeader(INT16 i);
|
||||||
|
|
||||||
// Needed for NiGHTS
|
|
||||||
void P_DeleteGrades(INT16 i);
|
|
||||||
void P_AddGradesForMare(INT16 i, UINT8 mare, char *gtext);
|
|
||||||
UINT8 P_GetGrade(UINT32 pscore, INT16 map, UINT8 mare);
|
|
||||||
UINT8 P_HasGrades(INT16 map, UINT8 mare);
|
|
||||||
UINT32 P_GetScoreForGrade(INT16 map, UINT8 mare, UINT8 grade);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+2
-2
@@ -76,8 +76,8 @@ static void P_UpdateSlopeLightOffset(pslope_t *slope)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
light = FixedMul(nX, FINECOSINE(maplighting.angle >> ANGLETOFINESHIFT))
|
light = FixedMul(nX, FINECOSINE(maplighting.angle >> ANGLETOFINESHIFT))
|
||||||
+ FixedMul(nY, FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
|
+ FixedMul(nY, FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
|
||||||
light = (light + FRACUNIT) / 2;
|
light = (light + FRACUNIT) / 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
+19
-22
@@ -1702,7 +1702,7 @@ void P_SwitchWeather(INT32 weathernum)
|
|||||||
|
|
||||||
precipmobj->type = type; // proper set the type
|
precipmobj->type = type; // proper set the type
|
||||||
precipmobj->info = &mobjinfo[type];
|
precipmobj->info = &mobjinfo[type];
|
||||||
precipmobj->flags = mobjinfo[type].flags;
|
//precipmobj->flags = mobjinfo[type].flags;
|
||||||
|
|
||||||
st = &states[mobjinfo[type].spawnstate+z];
|
st = &states[mobjinfo[type].spawnstate+z];
|
||||||
|
|
||||||
@@ -3161,11 +3161,6 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
|||||||
INT32 section1, section2, section3, section4;
|
INT32 section1, section2, section3, section4;
|
||||||
INT32 special;
|
INT32 special;
|
||||||
|
|
||||||
section1 = GETSECSPECIAL(sector->special, 1);
|
|
||||||
section2 = GETSECSPECIAL(sector->special, 2);
|
|
||||||
section3 = GETSECSPECIAL(sector->special, 3);
|
|
||||||
section4 = GETSECSPECIAL(sector->special, 4);
|
|
||||||
|
|
||||||
// Ignore spectators
|
// Ignore spectators
|
||||||
if (player->spectator)
|
if (player->spectator)
|
||||||
return;
|
return;
|
||||||
@@ -3176,6 +3171,11 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
|||||||
if (player->playerstate == PST_DEAD)
|
if (player->playerstate == PST_DEAD)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
section1 = GETSECSPECIAL(sector->special, 1);
|
||||||
|
section2 = GETSECSPECIAL(sector->special, 2);
|
||||||
|
section3 = GETSECSPECIAL(sector->special, 3);
|
||||||
|
section4 = GETSECSPECIAL(sector->special, 4);
|
||||||
|
|
||||||
// Conveyor stuff
|
// Conveyor stuff
|
||||||
if (section3 == 2 || section3 == 4)
|
if (section3 == 2 || section3 == 4)
|
||||||
player->onconveyor = section3;
|
player->onconveyor = section3;
|
||||||
@@ -4381,8 +4381,6 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VDOORSPEED (FRACUNIT*2)
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_RunSpecialSectorCheck
|
// P_RunSpecialSectorCheck
|
||||||
//
|
//
|
||||||
@@ -4401,7 +4399,7 @@ static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector)
|
|||||||
|
|
||||||
// The list of specials that activate without floor touch
|
// The list of specials that activate without floor touch
|
||||||
// Check Section 1
|
// Check Section 1
|
||||||
switch(GETSECSPECIAL(sector->special, 1))
|
switch (GETSECSPECIAL(sector->special, 1))
|
||||||
{
|
{
|
||||||
//case 2: // Damage (water)
|
//case 2: // Damage (water)
|
||||||
case 8: // Instant kill
|
case 8: // Instant kill
|
||||||
@@ -4412,7 +4410,7 @@ static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check Section 2
|
// Check Section 2
|
||||||
switch(GETSECSPECIAL(sector->special, 2))
|
switch (GETSECSPECIAL(sector->special, 2))
|
||||||
{
|
{
|
||||||
case 2: // Linedef executor (All players needed)
|
case 2: // Linedef executor (All players needed)
|
||||||
case 4: // Linedef executor
|
case 4: // Linedef executor
|
||||||
@@ -4423,7 +4421,7 @@ static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check Section 4
|
// Check Section 4
|
||||||
switch(GETSECSPECIAL(sector->special, 4))
|
switch (GETSECSPECIAL(sector->special, 4))
|
||||||
{
|
{
|
||||||
case 2: // Level Exit / GOAL Sector / Flag Return
|
case 2: // Level Exit / GOAL Sector / Flag Return
|
||||||
case 1: // Starpost activator
|
case 1: // Starpost activator
|
||||||
@@ -4512,9 +4510,7 @@ void P_UpdateSpecials(void)
|
|||||||
{
|
{
|
||||||
anim_t *anim;
|
anim_t *anim;
|
||||||
INT32 i;
|
INT32 i;
|
||||||
INT32 pic;
|
|
||||||
size_t j;
|
size_t j;
|
||||||
|
|
||||||
levelflat_t *foundflats; // for flat animation
|
levelflat_t *foundflats; // for flat animation
|
||||||
|
|
||||||
// LEVEL TIMER
|
// LEVEL TIMER
|
||||||
@@ -4532,9 +4528,11 @@ void P_UpdateSpecials(void)
|
|||||||
{
|
{
|
||||||
for (i = 0; i < anim->numpics; i++)
|
for (i = 0; i < anim->numpics; i++)
|
||||||
{
|
{
|
||||||
pic = anim->basepic + ((leveltime/anim->speed + i) % anim->numpics);
|
|
||||||
if (anim->istexture)
|
if (anim->istexture)
|
||||||
texturetranslation[anim->basepic+i] = pic;
|
{
|
||||||
|
texturetranslation[anim->basepic+i] = anim->basepic +
|
||||||
|
((leveltime/anim->speed + i) % anim->numpics);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4629,8 +4627,8 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
|||||||
|
|
||||||
if (sec2->numattached == 0)
|
if (sec2->numattached == 0)
|
||||||
{
|
{
|
||||||
sec2->attached = Z_Malloc(sizeof (*sec2->attached) * sec2->maxattached, PU_STATIC, NULL);
|
sec2->attached = Z_Malloc(sizeof(*sec2->attached) * sec2->maxattached, PU_STATIC, NULL);
|
||||||
sec2->attachedsolid = Z_Malloc(sizeof (*sec2->attachedsolid) * sec2->maxattached, PU_STATIC, NULL);
|
sec2->attachedsolid = Z_Malloc(sizeof(*sec2->attachedsolid) * sec2->maxattached, PU_STATIC, NULL);
|
||||||
sec2->attached[0] = sec - sectors;
|
sec2->attached[0] = sec - sectors;
|
||||||
sec2->numattached = 1;
|
sec2->numattached = 1;
|
||||||
sec2->attachedsolid[0] = (flags & FF_SOLID);
|
sec2->attachedsolid[0] = (flags & FF_SOLID);
|
||||||
@@ -4644,8 +4642,8 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
|||||||
if (sec2->numattached >= sec2->maxattached)
|
if (sec2->numattached >= sec2->maxattached)
|
||||||
{
|
{
|
||||||
sec2->maxattached *= 2;
|
sec2->maxattached *= 2;
|
||||||
sec2->attached = Z_Realloc(sec2->attached, sizeof (*sec2->attached) * sec2->maxattached, PU_STATIC, NULL);
|
sec2->attached = Z_Realloc(sec2->attached, sizeof(*sec2->attached) * sec2->maxattached, PU_STATIC, NULL);
|
||||||
sec2->attachedsolid = Z_Realloc(sec2->attachedsolid, sizeof (*sec2->attachedsolid) * sec2->maxattached, PU_STATIC, NULL);
|
sec2->attachedsolid = Z_Realloc(sec2->attachedsolid, sizeof(*sec2->attachedsolid) * sec2->maxattached, PU_STATIC, NULL);
|
||||||
}
|
}
|
||||||
sec2->attached[sec2->numattached] = sec - sectors;
|
sec2->attached[sec2->numattached] = sec - sectors;
|
||||||
sec2->attachedsolid[sec2->numattached] = (flags & FF_SOLID);
|
sec2->attachedsolid[sec2->numattached] = (flags & FF_SOLID);
|
||||||
@@ -4653,7 +4651,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add the floor
|
// Add the floor
|
||||||
ffloor = Z_Calloc(sizeof (*ffloor), PU_LEVEL, NULL);
|
ffloor = Z_Calloc(sizeof(*ffloor), PU_LEVEL, NULL);
|
||||||
ffloor->secnum = sec2 - sectors;
|
ffloor->secnum = sec2 - sectors;
|
||||||
ffloor->target = sec;
|
ffloor->target = sec;
|
||||||
ffloor->bottomheight = &sec2->floorheight;
|
ffloor->bottomheight = &sec2->floorheight;
|
||||||
@@ -5468,7 +5466,6 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 10: // Vertical culling plane for sprites and FOFs
|
case 10: // Vertical culling plane for sprites and FOFs
|
||||||
sec = sides[*lines[i].sidenum].sector - sectors;
|
|
||||||
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
|
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
|
||||||
sectors[s].cullheight = &lines[i]; // This allows it to change in realtime!
|
sectors[s].cullheight = &lines[i]; // This allows it to change in realtime!
|
||||||
break;
|
break;
|
||||||
@@ -5989,7 +5986,7 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
|
|||||||
if (!virt)
|
if (!virt)
|
||||||
virt = vres_GetMap(lastloadedmaplumpnum);
|
virt = vres_GetMap(lastloadedmaplumpnum);
|
||||||
|
|
||||||
data = (UINT8*) vres_Find(virt, "SIDEDEFS")->data;
|
data = (UINT8*)vres_Find(virt, "SIDEDEFS")->data;
|
||||||
|
|
||||||
for (b = 0; b < (INT16)numsides; b++)
|
for (b = 0; b < (INT16)numsides; b++)
|
||||||
{
|
{
|
||||||
|
|||||||
+4
-3
@@ -728,11 +728,12 @@ void P_Ticker(boolean run)
|
|||||||
|
|
||||||
if (cv_recordmultiplayerdemos.value)
|
if (cv_recordmultiplayerdemos.value)
|
||||||
{
|
{
|
||||||
const INT32 axis = JoyAxis(AXISLOOKBACK, 1);
|
|
||||||
|
|
||||||
if (demo.savemode == DSM_NOTSAVING || demo.savemode == DSM_WILLAUTOSAVE)
|
if (demo.savemode == DSM_NOTSAVING || demo.savemode == DSM_WILLAUTOSAVE)
|
||||||
if (demo.savebutton && demo.savebutton + 3*TICRATE < leveltime && (InputDown(gc_lookback, 1) || (cv_usejoystick[0].value && axis > 0)))
|
{
|
||||||
|
const INT32 axis = cv_usejoystick[0].value ? JoyAxis(AXISLOOKBACK, 1) : -1;
|
||||||
|
if (demo.savebutton && demo.savebutton + 3*TICRATE < leveltime && (InputDown(gc_lookback, 1) || (axis > 0)))
|
||||||
demo.savemode = DSM_TITLEENTRY;
|
demo.savemode = DSM_TITLEENTRY;
|
||||||
|
}
|
||||||
|
|
||||||
// if there are no players left at all, stop demo recording
|
// if there are no players left at all, stop demo recording
|
||||||
// Demos that that dont have any players crash during playback, which can happen with dedicated servers
|
// Demos that that dont have any players crash during playback, which can happen with dedicated servers
|
||||||
|
|||||||
+25
-60
@@ -220,32 +220,6 @@ UINT8 P_GetNextEmerald(void)
|
|||||||
return (UINT8)(gamemap - sstage_start);
|
return (UINT8)(gamemap - sstage_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// P_GiveEmerald
|
|
||||||
//
|
|
||||||
// Award an emerald upon completion
|
|
||||||
// of a special stage.
|
|
||||||
//
|
|
||||||
void P_GiveEmerald(boolean spawnObj)
|
|
||||||
{
|
|
||||||
INT32 i;
|
|
||||||
UINT8 em;
|
|
||||||
|
|
||||||
S_StartSound(NULL, sfx_cgot); // Got the emerald!
|
|
||||||
em = P_GetNextEmerald();
|
|
||||||
emeralds |= (1 << em);
|
|
||||||
|
|
||||||
if (spawnObj)
|
|
||||||
{
|
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
|
||||||
{
|
|
||||||
if (playeringame[i])
|
|
||||||
P_SetMobjState(P_SpawnMobj(players[i].mo->x, players[i].mo->y, players[i].mo->z + players[i].mo->info->height, MT_GOTEMERALD),
|
|
||||||
mobjinfo[MT_GOTEMERALD].spawnstate + em);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_ResetScore
|
// P_ResetScore
|
||||||
//
|
//
|
||||||
@@ -1226,7 +1200,6 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
|
|||||||
|
|
||||||
ghost->pitch = mobj->pitch;
|
ghost->pitch = mobj->pitch;
|
||||||
ghost->roll = mobj->roll;
|
ghost->roll = mobj->roll;
|
||||||
ghost->sloperoll = mobj->sloperoll;
|
|
||||||
ghost->rollangle = mobj->rollangle;
|
ghost->rollangle = mobj->rollangle;
|
||||||
ghost->sloperoll = mobj->sloperoll;
|
ghost->sloperoll = mobj->sloperoll;
|
||||||
ghost->slopepitch = mobj->slopepitch;
|
ghost->slopepitch = mobj->slopepitch;
|
||||||
@@ -1822,7 +1795,6 @@ void P_DoJumpShield(player_t *player)
|
|||||||
|
|
||||||
player->pflags &= ~PF_JUMPED;
|
player->pflags &= ~PF_JUMPED;
|
||||||
//P_DoJump(player, false);
|
//P_DoJump(player, false);
|
||||||
player->pflags &= ~PF_JUMPED;
|
|
||||||
player->secondjump = 0;
|
player->secondjump = 0;
|
||||||
player->jumping = 0;
|
player->jumping = 0;
|
||||||
player->pflags |= PF_THOKKED;
|
player->pflags |= PF_THOKKED;
|
||||||
@@ -1894,7 +1866,6 @@ static void P_3dMovement(player_t *player)
|
|||||||
ticcmd_t *cmd;
|
ticcmd_t *cmd;
|
||||||
angle_t movepushangle, movepushsideangle; // Analog
|
angle_t movepushangle, movepushsideangle; // Analog
|
||||||
fixed_t movepushforward = 0, movepushside = 0;
|
fixed_t movepushforward = 0, movepushside = 0;
|
||||||
angle_t dangle; // replaces old quadrants bits
|
|
||||||
boolean analogmove = false;
|
boolean analogmove = false;
|
||||||
fixed_t oldMagnitude, newMagnitude;
|
fixed_t oldMagnitude, newMagnitude;
|
||||||
vector3_t totalthrust;
|
vector3_t totalthrust;
|
||||||
@@ -1952,15 +1923,6 @@ static void P_3dMovement(player_t *player)
|
|||||||
// Calculates player's speed based on distance-of-a-line formula
|
// Calculates player's speed based on distance-of-a-line formula
|
||||||
player->speed = R_PointToDist2(0, 0, player->rmomx, player->rmomy);
|
player->speed = R_PointToDist2(0, 0, player->rmomx, player->rmomy);
|
||||||
|
|
||||||
// Monster Iestyn - 04-11-13
|
|
||||||
// Quadrants are stupid, excessive and broken, let's do this a much simpler way!
|
|
||||||
// Get delta angle from rmom angle and player angle first
|
|
||||||
dangle = R_PointToAngle2(0,0, player->rmomx, player->rmomy) - player->mo->angle;
|
|
||||||
if (dangle > ANGLE_180) //flip to keep to one side
|
|
||||||
{
|
|
||||||
dangle = InvAngle(dangle);
|
|
||||||
}
|
|
||||||
|
|
||||||
// When sliding, don't allow forward/back
|
// When sliding, don't allow forward/back
|
||||||
if (player->pflags & PF_SLIDING)
|
if (player->pflags & PF_SLIDING)
|
||||||
cmd->forwardmove = 0;
|
cmd->forwardmove = 0;
|
||||||
@@ -2003,20 +1965,23 @@ static void P_3dMovement(player_t *player)
|
|||||||
K_MomentumToFacing(player);
|
K_MomentumToFacing(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const fixed_t kartspd = K_GetKartSpeed(player, true);
|
||||||
|
|
||||||
// Sideways movement
|
// Sideways movement
|
||||||
if (cmd->sidemove != 0 && !((player->exiting || mapreset) || player->kartstuff[k_spinouttimer]))
|
if (cmd->sidemove != 0 && !((player->exiting || mapreset) || player->kartstuff[k_spinouttimer]))
|
||||||
{
|
{
|
||||||
if (cmd->sidemove > 0)
|
if (cmd->sidemove > 0)
|
||||||
movepushside = (cmd->sidemove * FRACUNIT/128) + FixedDiv(player->speed, K_GetKartSpeed(player, true));
|
movepushside = (cmd->sidemove * FRACUNIT/128) + FixedDiv(player->speed, kartspd);
|
||||||
else
|
else
|
||||||
movepushside = (cmd->sidemove * FRACUNIT/128) - FixedDiv(player->speed, K_GetKartSpeed(player, true));
|
movepushside = (cmd->sidemove * FRACUNIT/128) - FixedDiv(player->speed, kartspd);
|
||||||
|
|
||||||
totalthrust.x += P_ReturnThrustX(player->mo, movepushsideangle, movepushside);
|
totalthrust.x += P_ReturnThrustX(player->mo, movepushsideangle, movepushside);
|
||||||
totalthrust.y += P_ReturnThrustY(player->mo, movepushsideangle, movepushside);
|
totalthrust.y += P_ReturnThrustY(player->mo, movepushsideangle, movepushside);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((totalthrust.x || totalthrust.y)
|
if ((totalthrust.x || totalthrust.y)
|
||||||
&& player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)) && abs(player->mo->standingslope->zdelta) > FRACUNIT/2) {
|
&& player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)) && abs(player->mo->standingslope->zdelta) > FRACUNIT/2)
|
||||||
|
{
|
||||||
// Factor thrust to slope, but only for the part pushing up it!
|
// Factor thrust to slope, but only for the part pushing up it!
|
||||||
// The rest is unaffected.
|
// The rest is unaffected.
|
||||||
angle_t thrustangle = R_PointToAngle2(0, 0, totalthrust.x, totalthrust.y)-player->mo->standingslope->xydirection;
|
angle_t thrustangle = R_PointToAngle2(0, 0, totalthrust.x, totalthrust.y)-player->mo->standingslope->xydirection;
|
||||||
@@ -2052,11 +2017,11 @@ static void P_3dMovement(player_t *player)
|
|||||||
// -Shadow Hog
|
// -Shadow Hog
|
||||||
newMagnitude = R_PointToDist2(player->mo->momx - player->cmomx, player->mo->momy - player->cmomy, 0, 0);
|
newMagnitude = R_PointToDist2(player->mo->momx - player->cmomx, player->mo->momy - player->cmomy, 0, 0);
|
||||||
|
|
||||||
if (newMagnitude > K_GetKartSpeed(player, true)) //topspeed)
|
if (newMagnitude > kartspd) //topspeed)
|
||||||
{
|
{
|
||||||
fixed_t tempmomx, tempmomy;
|
fixed_t tempmomx, tempmomy;
|
||||||
|
|
||||||
if (oldMagnitude > K_GetKartSpeed(player, true) && onground) // SRB2Kart: onground check for air speed cap
|
if (oldMagnitude > kartspd && onground) // SRB2Kart: onground check for air speed cap
|
||||||
{
|
{
|
||||||
if (newMagnitude > oldMagnitude)
|
if (newMagnitude > oldMagnitude)
|
||||||
{
|
{
|
||||||
@@ -2069,8 +2034,8 @@ static void P_3dMovement(player_t *player)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tempmomx = FixedMul(FixedDiv(player->mo->momx - player->cmomx, newMagnitude), K_GetKartSpeed(player, true)); //topspeed)
|
tempmomx = FixedMul(FixedDiv(player->mo->momx - player->cmomx, newMagnitude), kartspd); //topspeed)
|
||||||
tempmomy = FixedMul(FixedDiv(player->mo->momy - player->cmomy, newMagnitude), K_GetKartSpeed(player, true)); //topspeed)
|
tempmomy = FixedMul(FixedDiv(player->mo->momy - player->cmomy, newMagnitude), kartspd); //topspeed)
|
||||||
player->mo->momx = tempmomx + player->cmomx;
|
player->mo->momx = tempmomx + player->cmomx;
|
||||||
player->mo->momy = tempmomy + player->cmomy;
|
player->mo->momy = tempmomy + player->cmomy;
|
||||||
}
|
}
|
||||||
@@ -2485,9 +2450,10 @@ static void P_MovePlayer(player_t *player)
|
|||||||
const fixed_t runnyspeed = 20*FRACUNIT;
|
const fixed_t runnyspeed = 20*FRACUNIT;
|
||||||
|
|
||||||
speed = R_PointToDist2(player->rmomx, player->rmomy, 0, 0);
|
speed = R_PointToDist2(player->rmomx, player->rmomy, 0, 0);
|
||||||
|
const fixed_t kartspd = K_GetKartSpeed(player, false);
|
||||||
|
|
||||||
if (speed > K_GetKartSpeed(player, false)-(5<<FRACBITS))
|
if (speed > kartspd-(5<<FRACBITS))
|
||||||
speed = K_GetKartSpeed(player, false)-(5<<FRACBITS);
|
speed = kartspd-(5<<FRACBITS);
|
||||||
|
|
||||||
if (speed >= runnyspeed)
|
if (speed >= runnyspeed)
|
||||||
player->fovadd = speed-runnyspeed;
|
player->fovadd = speed-runnyspeed;
|
||||||
@@ -3137,19 +3103,16 @@ void P_ToggleDemoCamera(UINT8 viewnum)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cam->freecam) // toggle on
|
if (!cam->freecam) // toggle on
|
||||||
{
|
{
|
||||||
cam->freecam = true;
|
cam->freecam = true;
|
||||||
cam->button_a_held = 2;
|
cam->button_a_held = 2;
|
||||||
cam->reset_aiming = true;
|
cam->reset_aiming = true;
|
||||||
|
|
||||||
// get rid of some hud elements
|
// get rid of some hud elements
|
||||||
if (displayplayers[0] != consoleplayer)
|
displayplayers[0] = consoleplayer;
|
||||||
{
|
|
||||||
displayplayers[0] = consoleplayer;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else // toggle off
|
else // toggle off
|
||||||
{
|
{
|
||||||
cam->freecam = false;
|
cam->freecam = false;
|
||||||
G_FixCamera(viewnum+1);
|
G_FixCamera(viewnum+1);
|
||||||
@@ -4063,7 +4026,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
|
|||||||
|
|
||||||
if (timeover)
|
if (timeover)
|
||||||
thiscam->angle = angle;
|
thiscam->angle = angle;
|
||||||
else if (!camstill && !resetcalled && !paused && timeover != 1)
|
else if (!camstill && !resetcalled && !paused)
|
||||||
thiscam->angle = R_PointToAngle2(thiscam->x, thiscam->y, viewpointx, viewpointy);
|
thiscam->angle = R_PointToAngle2(thiscam->x, thiscam->y, viewpointx, viewpointy);
|
||||||
|
|
||||||
if (timeover == 1)
|
if (timeover == 1)
|
||||||
@@ -4120,7 +4083,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
|
|||||||
angle -= (angle - thiscam->pitch)/2;
|
angle -= (angle - thiscam->pitch)/2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player->playerstate != PST_DEAD && !((player->pflags & PF_NIGHTSMODE) && player->exiting))
|
if (player->playerstate != PST_DEAD && LIKELY(!((player->pflags & PF_NIGHTSMODE) && player->exiting)))
|
||||||
angle += (focusaiming < ANGLE_180 ? focusaiming/2 : InvAngle(InvAngle(focusaiming)/2)); // overcomplicated version of '((signed)focusaiming)/2;'
|
angle += (focusaiming < ANGLE_180 ? focusaiming/2 : InvAngle(InvAngle(focusaiming)/2)); // overcomplicated version of '((signed)focusaiming)/2;'
|
||||||
|
|
||||||
if (!camstill && !timeover) // Keep the view still...
|
if (!camstill && !timeover) // Keep the view still...
|
||||||
@@ -4186,10 +4149,12 @@ void P_ResetLocalCamAiming(player_t *player)
|
|||||||
|
|
||||||
boolean P_SpectatorJoinGame(player_t *player)
|
boolean P_SpectatorJoinGame(player_t *player)
|
||||||
{
|
{
|
||||||
|
const boolean islocalplayer = P_IsLocalPlayer(player);
|
||||||
|
|
||||||
// Team changing isn't allowed.
|
// Team changing isn't allowed.
|
||||||
if (!cv_allowteamchange.value)
|
if (!cv_allowteamchange.value)
|
||||||
{
|
{
|
||||||
if (P_IsLocalPlayer(player))
|
if (islocalplayer)
|
||||||
CONS_Printf(M_GetText("Server does not allow team change.\n"));
|
CONS_Printf(M_GetText("Server does not allow team change.\n"));
|
||||||
}
|
}
|
||||||
// Team changing in Team Match and CTF
|
// Team changing in Team Match and CTF
|
||||||
@@ -4237,7 +4202,7 @@ boolean P_SpectatorJoinGame(player_t *player)
|
|||||||
P_ResetLocalCamAiming(player);
|
P_ResetLocalCamAiming(player);
|
||||||
|
|
||||||
//Reset away view
|
//Reset away view
|
||||||
if (P_IsLocalPlayer(player) && displayplayers[0] != consoleplayer)
|
if (islocalplayer && displayplayers[0] != consoleplayer)
|
||||||
displayplayers[0] = consoleplayer;
|
displayplayers[0] = consoleplayer;
|
||||||
|
|
||||||
if (changeto == 1)
|
if (changeto == 1)
|
||||||
@@ -4264,7 +4229,7 @@ boolean P_SpectatorJoinGame(player_t *player)
|
|||||||
P_ResetLocalCamAiming(player);
|
P_ResetLocalCamAiming(player);
|
||||||
|
|
||||||
//Reset away view
|
//Reset away view
|
||||||
if (P_IsLocalPlayer(player) && displayplayers[0] != consoleplayer)
|
if (islocalplayer && displayplayers[0] != consoleplayer)
|
||||||
displayplayers[0] = consoleplayer;
|
displayplayers[0] = consoleplayer;
|
||||||
|
|
||||||
HU_AddChatText(va(M_GetText("\x82*%s entered the game."), player_names[player-players]), false);
|
HU_AddChatText(va(M_GetText("\x82*%s entered the game."), player_names[player-players]), false);
|
||||||
@@ -4464,7 +4429,7 @@ static INT32 Quaketilt(player_t *player)
|
|||||||
|
|
||||||
lowb = FixedMul(lowb, player->mo->scale);
|
lowb = FixedMul(lowb, player->mo->scale);
|
||||||
moma = FixedMul(FixedDiv(delta, ANGLE_90), tilt);
|
moma = FixedMul(FixedDiv(delta, ANGLE_90), tilt);
|
||||||
speed = abs( player->mo->momx + player->mo->momy );
|
speed = abs(player->mo->momx + player->mo->momy);
|
||||||
|
|
||||||
if (speed < lowb)
|
if (speed < lowb)
|
||||||
{
|
{
|
||||||
@@ -4595,7 +4560,7 @@ void P_PlayerThink(player_t *player)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SEENAMES
|
#ifdef SEENAMES
|
||||||
if (netgame && player == &players[displayplayers[0]] && !(leveltime % (TICRATE/5)) && !splitscreen)
|
if (netgame && !splitscreen && player == &players[displayplayers[0]] && !(leveltime % (TICRATE/5)))
|
||||||
{
|
{
|
||||||
seenplayer = NULL;
|
seenplayer = NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -991,7 +991,6 @@ static void R_Subsector(size_t num)
|
|||||||
visffloor[numffloors].height = polysec->floorheight;
|
visffloor[numffloors].height = polysec->floorheight;
|
||||||
visffloor[numffloors].polyobj = po;
|
visffloor[numffloors].polyobj = po;
|
||||||
visffloor[numffloors].slope = NULL;
|
visffloor[numffloors].slope = NULL;
|
||||||
// visffloor[numffloors].ffloor = rover;
|
|
||||||
po->visplane = visffloor[numffloors].plane;
|
po->visplane = visffloor[numffloors].plane;
|
||||||
numffloors++;
|
numffloors++;
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-49
@@ -37,44 +37,6 @@
|
|||||||
// Not sure if this is necessary, but it was in w_wad.c, so I'm putting it here too -Shadow Hog
|
// Not sure if this is necessary, but it was in w_wad.c, so I'm putting it here too -Shadow Hog
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
//
|
|
||||||
// Texture definition.
|
|
||||||
// Each texture is composed of one or more patches,
|
|
||||||
// with patches being lumps stored in the WAD.
|
|
||||||
// The lumps are referenced by number, and patched
|
|
||||||
// into the rectangular texture space using origin
|
|
||||||
// and possibly other attributes.
|
|
||||||
//
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
INT16 originx, originy;
|
|
||||||
INT16 patch, stepdir, colormap;
|
|
||||||
} ATTRPACK mappatch_t;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Texture definition.
|
|
||||||
// An SRB2 wall texture is a list of patches
|
|
||||||
// which are to be combined in a predefined order.
|
|
||||||
//
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
char name[8];
|
|
||||||
INT32 masked;
|
|
||||||
INT16 width;
|
|
||||||
INT16 height;
|
|
||||||
INT32 columndirectory; // FIXTHIS: OBSOLETE
|
|
||||||
INT16 patchcount;
|
|
||||||
mappatch_t patches[1];
|
|
||||||
} ATTRPACK maptexture_t;
|
|
||||||
|
|
||||||
// Store lists of lumps for F_START/F_END etc.
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
UINT16 wadfile;
|
|
||||||
UINT16 firstlump;
|
|
||||||
size_t numlumps;
|
|
||||||
} lumplist_t;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Graphics.
|
// Graphics.
|
||||||
// SRB2 graphics for walls and sprites
|
// SRB2 graphics for walls and sprites
|
||||||
@@ -622,7 +584,7 @@ Rloadtextures (INT32 i, INT32 w)
|
|||||||
|
|
||||||
// Set texture properties.
|
// Set texture properties.
|
||||||
memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name));
|
memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name));
|
||||||
texture->hash = quickncasehash(texture->name, 8);
|
texture->hash = FNV1a_QuickCaseHash(texture->name, 8);
|
||||||
|
|
||||||
texture->width = SHORT(patchlump.width);
|
texture->width = SHORT(patchlump.width);
|
||||||
texture->height = SHORT(patchlump.height);
|
texture->height = SHORT(patchlump.height);
|
||||||
@@ -836,11 +798,7 @@ static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (patchName != NULL)
|
Z_Free(patchName);
|
||||||
{
|
|
||||||
Z_Free(patchName);
|
|
||||||
}
|
|
||||||
|
|
||||||
patchName = (char *)Z_Malloc((texturesTokenLength+1)*sizeof(char),PU_STATIC,NULL);
|
patchName = (char *)Z_Malloc((texturesTokenLength+1)*sizeof(char),PU_STATIC,NULL);
|
||||||
memcpy(patchName,texturesToken,texturesTokenLength*sizeof(char));
|
memcpy(patchName,texturesToken,texturesTokenLength*sizeof(char));
|
||||||
patchName[texturesTokenLength] = '\0';
|
patchName[texturesTokenLength] = '\0';
|
||||||
@@ -1066,7 +1024,7 @@ static texture_t *R_ParseTexture(boolean actuallyLoadTexture)
|
|||||||
// Allocate memory for a zero-patch texture. Obviously, we'll be adding patches momentarily.
|
// Allocate memory for a zero-patch texture. Obviously, we'll be adding patches momentarily.
|
||||||
resultTexture = (texture_t *)Z_Calloc(sizeof(texture_t), PU_STATIC, NULL);
|
resultTexture = (texture_t *)Z_Calloc(sizeof(texture_t), PU_STATIC, NULL);
|
||||||
memcpy(resultTexture->name, newTextureName, 8);
|
memcpy(resultTexture->name, newTextureName, 8);
|
||||||
resultTexture->hash = quickncasehash(newTextureName, 8);
|
resultTexture->hash = FNV1a_QuickCaseHash(newTextureName, 8);
|
||||||
resultTexture->width = newTextureWidth;
|
resultTexture->width = newTextureWidth;
|
||||||
resultTexture->height = newTextureHeight;
|
resultTexture->height = newTextureHeight;
|
||||||
resultTexture->type = TEXTURETYPE_COMPOSITE;
|
resultTexture->type = TEXTURETYPE_COMPOSITE;
|
||||||
@@ -1366,7 +1324,7 @@ void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap)
|
|||||||
colormap_p = colormap_p2 = colormaps;
|
colormap_p = colormap_p2 = colormaps;
|
||||||
colormap_p += COLORMAP_REMAPOFFSET;
|
colormap_p += COLORMAP_REMAPOFFSET;
|
||||||
|
|
||||||
for (p = 0; p < 32; p++)
|
for (p = 0; p < LIGHTLEVELS; p++)
|
||||||
{
|
{
|
||||||
for (i = 0; i < 256; i++)
|
for (i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
@@ -1588,7 +1546,7 @@ INT32 R_CreateColormap(char *p1, char *p2, char *p3)
|
|||||||
|
|
||||||
// Calculate the palette index for each palette index, for each light level
|
// Calculate the palette index for each palette index, for each light level
|
||||||
// (as well as the two unused colormap lines we inherited from Doom)
|
// (as well as the two unused colormap lines we inherited from Doom)
|
||||||
for (p = 0; p < 32; p++)
|
for (p = 0; p < LIGHTLEVELS; p++)
|
||||||
{
|
{
|
||||||
for (i = 0; i < 256; i++)
|
for (i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
@@ -1622,7 +1580,7 @@ INT32 R_CreateColormap(char *p1, char *p2, char *p3)
|
|||||||
{
|
{
|
||||||
lighttable_t *colormap_p2 = extra_colormaps[mapnum].colormap;
|
lighttable_t *colormap_p2 = extra_colormaps[mapnum].colormap;
|
||||||
|
|
||||||
for (p = 0; p < 32; p++)
|
for (p = 0; p < LIGHTLEVELS; p++)
|
||||||
{
|
{
|
||||||
for (i = 0; i < 256; i++)
|
for (i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
@@ -1755,7 +1713,7 @@ INT32 R_CheckTextureNumForName(const char *name)
|
|||||||
if (name[0] == '-')
|
if (name[0] == '-')
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
hash = quickncasehash(name, 8);
|
hash = FNV1a_QuickCaseHash(name, 8);
|
||||||
|
|
||||||
for (i = 0; i < tidcachelen; i++)
|
for (i = 0; i < tidcachelen; i++)
|
||||||
if (tidcache[i].hash == hash && !strncasecmp(tidcache[i].name, name, 8))
|
if (tidcache[i].hash == hash && !strncasecmp(tidcache[i].name, name, 8))
|
||||||
|
|||||||
@@ -45,9 +45,6 @@ enum
|
|||||||
TEXTURETYPE_COMPOSITE,
|
TEXTURETYPE_COMPOSITE,
|
||||||
};
|
};
|
||||||
|
|
||||||
// A maptexturedef_t describes a rectangular texture,
|
|
||||||
// which is composed of one or more mappatch_t structures
|
|
||||||
// that arrange graphic patches.
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
// Keep name for switch changing, etc.
|
// Keep name for switch changing, etc.
|
||||||
|
|||||||
+8
-4
@@ -400,7 +400,7 @@ static UINT8* RGetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 f
|
|||||||
case TC_ALLWHITE: skintableindex = ALLWHITE_TT_CACHE_INDEX; break;
|
case TC_ALLWHITE: skintableindex = ALLWHITE_TT_CACHE_INDEX; break;
|
||||||
case TC_RAINBOW: skintableindex = RAINBOW_TT_CACHE_INDEX; break;
|
case TC_RAINBOW: skintableindex = RAINBOW_TT_CACHE_INDEX; break;
|
||||||
case TC_BLINK: skintableindex = BLINK_TT_CACHE_INDEX; break;
|
case TC_BLINK: skintableindex = BLINK_TT_CACHE_INDEX; break;
|
||||||
default: skintableindex = skinnum; break;
|
default: skintableindex = skinnum; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -419,7 +419,7 @@ static UINT8* RGetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 f
|
|||||||
// Generate the colormap if necessary
|
// Generate the colormap if necessary
|
||||||
if (!ret)
|
if (!ret)
|
||||||
{
|
{
|
||||||
ret = static_cast<UINT8*>(Z_Malloc(NUM_PALETTE_ENTRIES, (flags & GTC_CACHE) ? PU_LEVEL : PU_STATIC, NULL));
|
ret = static_cast<UINT8*>(Z_Malloc(NUM_PALETTE_ENTRIES, PU_STATIC, NULL));
|
||||||
K_GenerateKartColormap(ret, skinnum, color, local); //R_GenerateTranslationColormap(ret, skinnum, color); // SRB2kart
|
K_GenerateKartColormap(ret, skinnum, color, local); //R_GenerateTranslationColormap(ret, skinnum, color); // SRB2kart
|
||||||
|
|
||||||
// Cache the colormap if desired
|
// Cache the colormap if desired
|
||||||
@@ -437,8 +437,7 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags)
|
|||||||
|
|
||||||
UINT8* R_GetLocalTranslationColormap(skin_t *skin, skin_t *localskin, skincolors_t color, UINT8 flags, boolean local)
|
UINT8* R_GetLocalTranslationColormap(skin_t *skin, skin_t *localskin, skincolors_t color, UINT8 flags, boolean local)
|
||||||
{
|
{
|
||||||
const INT32 skinnum = localskin ? (localskin - K_GetSkinArray(local)) : (skin - skins);
|
return RGetTranslationColormap(K_GetMobjLocalSkinNum(skin, localskin, local), color, flags, (localskin && local));
|
||||||
return RGetTranslationColormap(skinnum, color, flags, (localskin && local));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
patch_t* R_GetSkinFaceRank(player_t* ply)
|
patch_t* R_GetSkinFaceRank(player_t* ply)
|
||||||
@@ -488,6 +487,10 @@ patch_t* R_GetSkinFaceMini(player_t* ply)
|
|||||||
|
|
||||||
\return void
|
\return void
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* There seems to be no reason to free cached colormaps tho? Not like they can change :ChonkBunckle: */
|
||||||
|
|
||||||
|
/*
|
||||||
void R_FlushTranslationColormapCache(void)
|
void R_FlushTranslationColormapCache(void)
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
@@ -500,6 +503,7 @@ void R_FlushTranslationColormapCache(void)
|
|||||||
if (localtranslationtablecache[i])
|
if (localtranslationtablecache[i])
|
||||||
memset(localtranslationtablecache[i], 0, MAXTRANSLATIONS * sizeof(UINT8**));
|
memset(localtranslationtablecache[i], 0, MAXTRANSLATIONS * sizeof(UINT8**));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// COMMON DRAWER FOR 8 AND 16 BIT COLOR MODES
|
// COMMON DRAWER FOR 8 AND 16 BIT COLOR MODES
|
||||||
|
|||||||
+33
-33
@@ -204,7 +204,7 @@ static void R_DrawColumnTemplate(drawcolumndata_t *dc)
|
|||||||
intptr_t frac;
|
intptr_t frac;
|
||||||
// Looks familiar.
|
// Looks familiar.
|
||||||
const intptr_t fracstep = dc->iscale;
|
const intptr_t fracstep = dc->iscale;
|
||||||
const intptr_t heightmask = dc->sourcelength-1; // CPhipps - specify type
|
intptr_t heightmask = dc->sourcelength-1; // CPhipps - specify type
|
||||||
constexpr INT32 npow2min = -1;
|
constexpr INT32 npow2min = -1;
|
||||||
const INT32 npow2max = dc->sourcelength;
|
const INT32 npow2max = dc->sourcelength;
|
||||||
|
|
||||||
@@ -237,10 +237,10 @@ static void R_DrawColumnTemplate(drawcolumndata_t *dc)
|
|||||||
// Determine scaling, which is the only mapping to be done.
|
// Determine scaling, which is the only mapping to be done.
|
||||||
frac = (dc->texturemid + FixedMul((dc->yl << FRACBITS) - centeryfrac, fracstep));
|
frac = (dc->texturemid + FixedMul((dc->yl << FRACBITS) - centeryfrac, fracstep));
|
||||||
|
|
||||||
switch (heightmask)
|
switch (dc->sourcelength)
|
||||||
{
|
{
|
||||||
case 255:
|
case 256:
|
||||||
case 127:
|
case 128:
|
||||||
{
|
{
|
||||||
while (count--)
|
while (count--)
|
||||||
{
|
{
|
||||||
@@ -251,7 +251,7 @@ static void R_DrawColumnTemplate(drawcolumndata_t *dc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case npow2min:
|
case 0:
|
||||||
{
|
{
|
||||||
if (frac < 0)
|
if (frac < 0)
|
||||||
// adjust in case we underread
|
// adjust in case we underread
|
||||||
@@ -269,42 +269,22 @@ static void R_DrawColumnTemplate(drawcolumndata_t *dc)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (!(dc->sourcelength & heightmask)) // power of 2 -- killough
|
if (dc->sourcelength & heightmask) // not a power of 2 -- killough
|
||||||
{
|
{
|
||||||
while ((count -= 2) >= 0) // texture height is a power of 2 -- killough
|
heightmask = dc->texheight << FRACBITS;
|
||||||
{
|
|
||||||
*dest = R_DrawColumnPixel<Type>(dc, dest, (frac>>FRACBITS) & heightmask, source, colormap);
|
|
||||||
|
|
||||||
dest += stride;
|
|
||||||
frac += fracstep;
|
|
||||||
|
|
||||||
*dest = R_DrawColumnPixel<Type>(dc, dest, (frac>>FRACBITS) & heightmask, source, colormap);
|
|
||||||
|
|
||||||
dest += stride;
|
|
||||||
frac += fracstep;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count & 1)
|
|
||||||
{
|
|
||||||
*dest = R_DrawColumnPixel<Type>(dc, dest, (frac>>FRACBITS) & heightmask, source, colormap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const intptr_t fixed_heightmask = dc->texheight << FRACBITS;
|
|
||||||
|
|
||||||
if (frac < 0)
|
if (frac < 0)
|
||||||
{
|
{
|
||||||
while ((frac += fixed_heightmask) < 0)
|
while ((frac += heightmask) < 0)
|
||||||
{
|
{
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while (frac >= fixed_heightmask)
|
while (frac >= heightmask)
|
||||||
{
|
{
|
||||||
frac -= fixed_heightmask;
|
frac -= heightmask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -324,7 +304,7 @@ static void R_DrawColumnTemplate(drawcolumndata_t *dc)
|
|||||||
// Avoid overflow.
|
// Avoid overflow.
|
||||||
if (fracstep > 0x7FFFFFFF - frac)
|
if (fracstep > 0x7FFFFFFF - frac)
|
||||||
{
|
{
|
||||||
frac += fracstep - fixed_heightmask;
|
frac += fracstep - heightmask;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@@ -332,13 +312,33 @@ static void R_DrawColumnTemplate(drawcolumndata_t *dc)
|
|||||||
frac += fracstep;
|
frac += fracstep;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (frac >= fixed_heightmask)
|
while (frac >= heightmask)
|
||||||
{
|
{
|
||||||
frac -= fixed_heightmask;
|
frac -= heightmask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (--count);
|
while (--count);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while ((count -= 2) >= 0) // texture height is a power of 2 -- killough
|
||||||
|
{
|
||||||
|
*dest = R_DrawColumnPixel<Type>(dc, dest, ((frac>>FRACBITS) & heightmask), source, colormap);
|
||||||
|
|
||||||
|
dest += stride;
|
||||||
|
frac += fracstep;
|
||||||
|
|
||||||
|
*dest = R_DrawColumnPixel<Type>(dc, dest, ((frac>>FRACBITS) & heightmask), source, colormap);
|
||||||
|
|
||||||
|
dest += stride;
|
||||||
|
frac += fracstep;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count & 1)
|
||||||
|
{
|
||||||
|
*dest = R_DrawColumnPixel<Type>(dc, dest, ((frac>>FRACBITS) & heightmask), source, colormap);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-10
@@ -280,22 +280,22 @@ static void Fov_OnChange(void)
|
|||||||
|
|
||||||
static void FlipCam_OnChange(void)
|
static void FlipCam_OnChange(void)
|
||||||
{
|
{
|
||||||
SendWeaponPref();
|
SendWeaponPref(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FlipCam2_OnChange(void)
|
static void FlipCam2_OnChange(void)
|
||||||
{
|
{
|
||||||
SendWeaponPref2();
|
SendWeaponPref(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FlipCam3_OnChange(void)
|
static void FlipCam3_OnChange(void)
|
||||||
{
|
{
|
||||||
SendWeaponPref3();
|
SendWeaponPref(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FlipCam4_OnChange(void)
|
static void FlipCam4_OnChange(void)
|
||||||
{
|
{
|
||||||
SendWeaponPref4();
|
SendWeaponPref(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Precipstuff_OnChange(void)
|
static void Precipstuff_OnChange(void)
|
||||||
@@ -342,14 +342,14 @@ angle_t R_PointToAngle64(INT64 x, INT64 y)
|
|||||||
return (y -= viewy, (x -= viewx) || y) ?
|
return (y -= viewy, (x -= viewx) || y) ?
|
||||||
x >= 0 ?
|
x >= 0 ?
|
||||||
y >= 0 ?
|
y >= 0 ?
|
||||||
(x > y) ? tantoangle[SlopeDivEx(y,x)] : // octant 0
|
(x > y) ? tantoangle[SlopeDivEx(y,x)] : // octant 0
|
||||||
ANGLE_90-tantoangle[SlopeDivEx(x,y)] : // octant 1
|
ANGLE_90-tantoangle[SlopeDivEx(x,y)] : // octant 1
|
||||||
x > (y = -y) ? 0-tantoangle[SlopeDivEx(y,x)] : // octant 8
|
x > (y = -y) ? 0-tantoangle[SlopeDivEx(y,x)] : // octant 8
|
||||||
ANGLE_270+tantoangle[SlopeDivEx(x,y)] : // octant 7
|
ANGLE_270+tantoangle[SlopeDivEx(x,y)] : // octant 7
|
||||||
y >= 0 ? (x = -x) > y ? ANGLE_180-tantoangle[SlopeDivEx(y,x)] : // octant 3
|
y >= 0 ? (x = -x) > y ? ANGLE_180-tantoangle[SlopeDivEx(y,x)] : // octant 3
|
||||||
ANGLE_90 + tantoangle[SlopeDivEx(x,y)] : // octant 2
|
ANGLE_90 + tantoangle[SlopeDivEx(x,y)] : // octant 2
|
||||||
(x = -x) > (y = -y) ? ANGLE_180+tantoangle[SlopeDivEx(y,x)] : // octant 4
|
(x = -x) > (y = -y) ? ANGLE_180+tantoangle[SlopeDivEx(y,x)] : // octant 4
|
||||||
ANGLE_270-tantoangle[SlopeDivEx(x,y)] : // octant 5
|
ANGLE_270-tantoangle[SlopeDivEx(x,y)] : // octant 5
|
||||||
0;
|
0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-4
@@ -1282,10 +1282,7 @@ void R_DrawSinglePlane(drawspandata_t* ds, visplane_t *pl, boolean allow_paralle
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Don't mess with angle on slopes! We'll handle this ourselves later
|
// Don't mess with angle on slopes! We'll handle this ourselves later
|
||||||
if (viewangle != pl->viewangle + pl->plangle)
|
viewangle = pl->viewangle + pl->plangle;
|
||||||
{
|
|
||||||
viewangle = pl->viewangle + pl->plangle;
|
|
||||||
}
|
|
||||||
|
|
||||||
ds->planeheight = abs(pl->height - pl->viewz);
|
ds->planeheight = abs(pl->height - pl->viewz);
|
||||||
ds->planezlight = zlight[light];
|
ds->planezlight = zlight[light];
|
||||||
|
|||||||
@@ -1222,6 +1222,15 @@ static void R_RenderSegLoop(drawcolumndata_t* dc)
|
|||||||
if (yl < top)
|
if (yl < top)
|
||||||
yl = top;
|
yl = top;
|
||||||
|
|
||||||
|
// insanely shitty hack to fix flickering on some maps
|
||||||
|
// for god knows why, on secret slide the renderer assumes some double sided linedefs have insanely tall walls
|
||||||
|
// since such tall walls are effectively nonsense in any case
|
||||||
|
// just skip them
|
||||||
|
if (yl > FRACUNIT*3)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (markceiling)
|
if (markceiling)
|
||||||
{
|
{
|
||||||
bottom = yl > floorclip[rw_x] ? floorclip[rw_x] : yl;
|
bottom = yl > floorclip[rw_x] ? floorclip[rw_x] : yl;
|
||||||
|
|||||||
+1
-1
@@ -774,7 +774,7 @@ void R_AddSkins(UINT16 wadnum, boolean local)
|
|||||||
// So just let the function in the while loop take care of it for us.
|
// So just let the function in the while loop take care of it for us.
|
||||||
}
|
}
|
||||||
|
|
||||||
R_FlushTranslationColormapCache();
|
//R_FlushTranslationColormapCache();
|
||||||
|
|
||||||
CONS_Printf(M_GetText("Added skin '%s'\n"), skin->name);
|
CONS_Printf(M_GetText("Added skin '%s'\n"), skin->name);
|
||||||
#ifdef SKINVALUES
|
#ifdef SKINVALUES
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ INT32 R_LocalSkinAvailable(const char *name, boolean local);
|
|||||||
// had to move those here Zzz...
|
// had to move those here Zzz...
|
||||||
INT32 K_GetSkinNum(player_t *player);
|
INT32 K_GetSkinNum(player_t *player);
|
||||||
INT32 K_GetMobjSkinNum(const skin_t *skin, boolean local);
|
INT32 K_GetMobjSkinNum(const skin_t *skin, boolean local);
|
||||||
|
INT32 K_GetMobjLocalSkinNum(const skin_t *skin, const skin_t *localskin, boolean local);
|
||||||
skin_t *K_GetPlayerSkin(player_t *player);
|
skin_t *K_GetPlayerSkin(player_t *player);
|
||||||
skin_t *K_GetMobjSkin(const mobj_t *mobj);
|
skin_t *K_GetMobjSkin(const mobj_t *mobj);
|
||||||
patch_t *K_GetFacePrefix(player_t *player, INT32 skinnum);
|
patch_t *K_GetFacePrefix(player_t *player, INT32 skinnum);
|
||||||
|
|||||||
+11
-11
@@ -1662,7 +1662,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
|||||||
|
|
||||||
if (thing->frame & FF_ABSOLUTELIGHTLEVEL)
|
if (thing->frame & FF_ABSOLUTELIGHTLEVEL)
|
||||||
{
|
{
|
||||||
const UINT8 n = R_ThingLightLevel(thing);
|
const UINT8 n = static_cast<UINT8>(R_ThingLightLevel(thing));
|
||||||
// n = uint8 aka 0 - 255, so the shift will always be 0 - LIGHTLEVELS - 1
|
// n = uint8 aka 0 - 255, so the shift will always be 0 - LIGHTLEVELS - 1
|
||||||
lights_array = scalelight[n >> LIGHTSEGSHIFT];
|
lights_array = scalelight[n >> LIGHTSEGSHIFT];
|
||||||
}
|
}
|
||||||
@@ -1855,9 +1855,6 @@ static void R_ProjectSprite(mobj_t *thing)
|
|||||||
|
|
||||||
if (thing->subsector->sector->numlights)
|
if (thing->subsector->sector->numlights)
|
||||||
R_SplitSprite(vis);
|
R_SplitSprite(vis);
|
||||||
|
|
||||||
// Debug
|
|
||||||
++objectsdrawn;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void R_ProjectPrecipitationSprite(precipmobj_t *thing)
|
static void R_ProjectPrecipitationSprite(precipmobj_t *thing)
|
||||||
@@ -2963,21 +2960,24 @@ fixed_t R_DoPlayerFade(mobj_t *thing)
|
|||||||
fixed_t fadealpha = FRACUNIT;
|
fixed_t fadealpha = FRACUNIT;
|
||||||
static constexpr tic_t countdownstarttime = (15 * TICRATE) / 4; // starttime - (3*TICRATE)
|
static constexpr tic_t countdownstarttime = (15 * TICRATE) / 4; // starttime - (3*TICRATE)
|
||||||
|
|
||||||
if (thing->player == viewplayer || viewplayer->exiting || camera[R_GetViewNumber()].freecam || leveltime < countdownstarttime)
|
if (thing->player == viewplayer || viewplayer->exiting || viewplayer->spectator || camera[R_GetViewNumber()].freecam || leveltime < countdownstarttime)
|
||||||
return fadealpha;
|
return fadealpha;
|
||||||
|
|
||||||
const INT32 playerdist = (FixedMul((thing->x - viewx), viewcos) + FixedMul((thing->y - viewy), viewsin)) >> FRACBITS;
|
const INT32 otherplayerdist = (FixedMul((thing->x - viewx), viewcos) + FixedMul((thing->y - viewy), viewsin)) >> FRACBITS;
|
||||||
const INT32 viewplayerdist = (FixedMul((viewplayer->mo->x - viewx), viewcos) + FixedMul((viewplayer->mo->y - viewy), viewsin)) >> FRACBITS;
|
const INT32 viewplayerdist = (FixedMul((viewplayer->mo->x - viewx), viewcos) + FixedMul((viewplayer->mo->y - viewy), viewsin)) >> FRACBITS;
|
||||||
|
|
||||||
if (playerdist < viewplayerdist)
|
if (viewplayerdist < 2)
|
||||||
|
return fadealpha; // avoid zero division
|
||||||
|
|
||||||
|
if (otherplayerdist < viewplayerdist)
|
||||||
{
|
{
|
||||||
if (playerdist < viewplayerdist / 2) // stronger fade when very close
|
if (otherplayerdist < viewplayerdist / 2) // stronger fade when very close
|
||||||
{
|
{
|
||||||
fadealpha = (playerdist * FRACUNIT) / (viewplayerdist / 2) / 3;
|
fadealpha = (otherplayerdist * FRACUNIT) / (viewplayerdist / 2) / 3;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fadealpha = (playerdist * FRACUNIT) / viewplayerdist;
|
fadealpha = (otherplayerdist * FRACUNIT) / viewplayerdist;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -50,7 +50,7 @@ extern fixed_t windowtop;
|
|||||||
extern fixed_t windowbottom;
|
extern fixed_t windowbottom;
|
||||||
extern INT32 lengthcol;
|
extern INT32 lengthcol;
|
||||||
|
|
||||||
FUNCINLINE static ATTRINLINE INT32 R_ThingLightLevel(mobj_t* thing)
|
FUNCINLINE static ATTRINLINE INT32 R_ThingLightLevel(const mobj_t* thing)
|
||||||
{
|
{
|
||||||
return (INT32)thing->lightlevel;
|
return (INT32)thing->lightlevel;
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-44
@@ -116,9 +116,7 @@ consvar_t cv_skipintromusic = {"skipintromusic", "No", CV_SAVE, CV_YesNo, NULL,
|
|||||||
|
|
||||||
boolean keepmapmusic = false; // keep the current music on map restart
|
boolean keepmapmusic = false; // keep the current music on map restart
|
||||||
boolean skipintromus = false; // skip the intro fanfare
|
boolean skipintromus = false; // skip the intro fanfare
|
||||||
static boolean resumekeepmusic = false;
|
|
||||||
static music_t keepmusic;
|
static music_t keepmusic;
|
||||||
static void S_SetKeepMusResume(void);
|
|
||||||
|
|
||||||
#ifdef HAVE_OPENMPT
|
#ifdef HAVE_OPENMPT
|
||||||
openmpt_module *openmpt_mhandle = NULL;
|
openmpt_module *openmpt_mhandle = NULL;
|
||||||
@@ -473,13 +471,12 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
memset(listener, 0, sizeof(listener));
|
memset(listener, 0, sizeof(listener));
|
||||||
|
memset(listenmobj, 0, sizeof(listenmobj));
|
||||||
|
|
||||||
for (i = 0; i <= splitscreen; i++)
|
for (i = 0; i <= splitscreen; i++)
|
||||||
{
|
{
|
||||||
player_t *player = &players[displayplayers[i]];
|
player_t *player = &players[displayplayers[i]];
|
||||||
|
|
||||||
listenmobj[i] = NULL;
|
|
||||||
|
|
||||||
if (player->awayviewtics)
|
if (player->awayviewtics)
|
||||||
{
|
{
|
||||||
listenmobj[i] = player->awayviewmobj;
|
listenmobj[i] = player->awayviewmobj;
|
||||||
@@ -1289,7 +1286,8 @@ static boolean ReadMusicDefFields(UINT16 wadnum, int line, char *stoken, musicde
|
|||||||
CONS_Alert(CONS_WARNING,
|
CONS_Alert(CONS_WARNING,
|
||||||
"MUSICDEF: Field '%s' is missing name. (file %s, line %d)\n",
|
"MUSICDEF: Field '%s' is missing name. (file %s, line %d)\n",
|
||||||
stoken, wadfiles[wadnum]->filename, line);
|
stoken, wadfiles[wadnum]->filename, line);
|
||||||
goto skip_lump;
|
(void)strtok(NULL, " ");
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1302,15 +1300,11 @@ static boolean ReadMusicDefFields(UINT16 wadnum, int line, char *stoken, musicde
|
|||||||
|
|
||||||
STRBUFCPY(def->name, value);
|
STRBUFCPY(def->name, value);
|
||||||
strlwr(def->name);
|
strlwr(def->name);
|
||||||
def->hash = quickncasehash (def->name, 6);
|
def->hash = FNV1a_QuickCaseHash(def->name, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
(*defp) = def;
|
(*defp) = def;
|
||||||
}
|
}
|
||||||
|
|
||||||
skip_lump:
|
|
||||||
stoken = strtok(NULL, " ");
|
|
||||||
line++;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1327,7 +1321,8 @@ skip_lump:
|
|||||||
CONS_Alert(CONS_WARNING,
|
CONS_Alert(CONS_WARNING,
|
||||||
"MUSICDEF: Field '%s' is missing value. (file %s, line %d)\n",
|
"MUSICDEF: Field '%s' is missing value. (file %s, line %d)\n",
|
||||||
stoken, wadfiles[wadnum]->filename, line);
|
stoken, wadfiles[wadnum]->filename, line);
|
||||||
goto skip_field;
|
(void)strtok(NULL, " ");
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1379,10 +1374,6 @@ skip_lump:
|
|||||||
else
|
else
|
||||||
CONS_Alert(CONS_WARNING, "MUSICDEF: Invalid field '%s'. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line);
|
CONS_Alert(CONS_WARNING, "MUSICDEF: Invalid field '%s'. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line);
|
||||||
#undef ADDDEF
|
#undef ADDDEF
|
||||||
|
|
||||||
skip_field:
|
|
||||||
stoken = strtok(NULL, "= ");
|
|
||||||
line++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1407,7 +1398,8 @@ void S_LoadMusicDefs(UINT16 wadnum)
|
|||||||
|
|
||||||
for (int k = 0; k < 2; k++)
|
for (int k = 0; k < 2; k++)
|
||||||
{
|
{
|
||||||
lumpnum = W_CheckNumForNamePwad((k == 1 ? "MUSCINFO" : "MUSICDEF") , wadnum, 0); //check for MUSCINFO lump on 2nd iteration
|
const char *lumpname = (k == 1 ? "MUSCINFO" : "MUSICDEF");
|
||||||
|
lumpnum = W_CheckNumForNamePwad(lumpname, wadnum, 0); //check for MUSCINFO lump on 2nd iteration
|
||||||
|
|
||||||
if (lumpnum == INT16_MAX)
|
if (lumpnum == INT16_MAX)
|
||||||
continue;
|
continue;
|
||||||
@@ -1433,13 +1425,13 @@ void S_LoadMusicDefs(UINT16 wadnum)
|
|||||||
nlf = 1;
|
nlf = 1;
|
||||||
else
|
else
|
||||||
nlf = 0;
|
nlf = 0;
|
||||||
*lf++ = '\0';/* now we can delimit to here */
|
*lf++ = '\0'; /* now we can delimit to here */
|
||||||
}
|
}
|
||||||
|
|
||||||
stoken = strtok(stoken, " ");
|
stoken = strtok(stoken, " ");
|
||||||
if (stoken)
|
if (stoken)
|
||||||
{
|
{
|
||||||
if (! ReadMusicDefFields(wadnum, line, stoken, &def))
|
if (!ReadMusicDefFields(wadnum, line, stoken, &def))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1455,10 +1447,10 @@ void S_LoadMusicDefs(UINT16 wadnum)
|
|||||||
}
|
}
|
||||||
while (nlf || ncr) ;
|
while (nlf || ncr) ;
|
||||||
|
|
||||||
stoken = lf;/* now the next nonempty line */
|
stoken = lf; /* now the next nonempty line */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
break;/* EOF */
|
break; /* EOF */
|
||||||
}
|
}
|
||||||
|
|
||||||
free(musdeftext);
|
free(musdeftext);
|
||||||
@@ -1484,7 +1476,7 @@ void S_InitMusicDefs(void)
|
|||||||
//
|
//
|
||||||
musicdef_t *S_FindMusicCredit(const char *musname)
|
musicdef_t *S_FindMusicCredit(const char *musname)
|
||||||
{
|
{
|
||||||
UINT32 hash = quickncasehash(musname, 6);
|
UINT32 hash = FNV1a_QuickCaseHash(musname, 6);
|
||||||
musicdef_t *def;
|
musicdef_t *def;
|
||||||
|
|
||||||
for (INT32 i = 0; i < nummusicdefs; ++i)
|
for (INT32 i = 0; i < nummusicdefs; ++i)
|
||||||
@@ -1849,8 +1841,6 @@ void S_StopMusic(void)
|
|||||||
|
|
||||||
mapmusic.resume = (cv_resume.value && fasticmp(music.name, mapmusic.name)) ? I_GetSongPosition() : 0;
|
mapmusic.resume = (cv_resume.value && fasticmp(music.name, mapmusic.name)) ? I_GetSongPosition() : 0;
|
||||||
|
|
||||||
S_SetKeepMusResume();
|
|
||||||
|
|
||||||
if (I_SongPaused())
|
if (I_SongPaused())
|
||||||
I_ResumeSong();
|
I_ResumeSong();
|
||||||
|
|
||||||
@@ -1977,17 +1967,6 @@ void S_ResetKeepAndSpecialMus(void)
|
|||||||
keepmapmusic = skipintromus = false;
|
keepmapmusic = skipintromus = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// saves the current song position everytime a song stops
|
|
||||||
// so we can resume it in some cases
|
|
||||||
static void S_SetKeepMusResume(void)
|
|
||||||
{
|
|
||||||
keepmusic.resume = 0;
|
|
||||||
|
|
||||||
if (fasticmp(music.name, mapmusic.name))
|
|
||||||
{
|
|
||||||
keepmusic.resume = I_GetSongPosition();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// determine if we should keep the music on a map restart
|
// determine if we should keep the music on a map restart
|
||||||
// this gets called BEFORE the level gets loaded in G_DoLoadLevel
|
// this gets called BEFORE the level gets loaded in G_DoLoadLevel
|
||||||
@@ -1996,7 +1975,7 @@ void S_KeepMusic(void)
|
|||||||
static INT16 oldmap = -1;
|
static INT16 oldmap = -1;
|
||||||
static boolean oldencore = false;
|
static boolean oldencore = false;
|
||||||
|
|
||||||
keepmapmusic = resumekeepmusic = false;
|
keepmapmusic = false;
|
||||||
|
|
||||||
if (!cv_keepmusic.value)
|
if (!cv_keepmusic.value)
|
||||||
{
|
{
|
||||||
@@ -2010,9 +1989,7 @@ void S_KeepMusic(void)
|
|||||||
|
|
||||||
if (oldmap == gamemap && oldencore == encoremode)
|
if (oldmap == gamemap && oldencore == encoremode)
|
||||||
{
|
{
|
||||||
const boolean musicchanged = S_CheckMusicException();
|
keepmapmusic = (S_CheckMusicException() == false);
|
||||||
resumekeepmusic = (musicchanged && keepmusic.resume);
|
|
||||||
keepmapmusic = (!musicchanged || resumekeepmusic);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
oldencore = encoremode;
|
oldencore = encoremode;
|
||||||
@@ -2073,12 +2050,6 @@ void S_InitMapMusic(void)
|
|||||||
|
|
||||||
if (keepmapmusic)
|
if (keepmapmusic)
|
||||||
{
|
{
|
||||||
// this is kinda silly, but we can use it to fade back into the map song at the saved point, should the current music be different from the map music
|
|
||||||
if (resumekeepmusic)
|
|
||||||
{
|
|
||||||
S_ChangeMusicEx(mapmusic.name, mapmusic.flags, true, keepmusic.resume, 0, 500);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-4
@@ -42,8 +42,8 @@ INT32 setmodeneeded = 0; // video mode change needed if > 0 (the mode number to
|
|||||||
static CV_PossibleValue_t shittyscreen_cons_t[] = {{0, "Okay"}, {1, "Shitty"}, {2, "Extra Shitty"}, {0, NULL}};
|
static CV_PossibleValue_t shittyscreen_cons_t[] = {{0, "Okay"}, {1, "Shitty"}, {2, "Extra Shitty"}, {0, NULL}};
|
||||||
|
|
||||||
//added : 03-02-98: default screen mode, as loaded/saved in config
|
//added : 03-02-98: default screen mode, as loaded/saved in config
|
||||||
consvar_t cv_scr_width = {"scr_width", "1280", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_scr_width = {"scr_width", "1280", CV_SAVE|CV_CALL, CV_Unsigned, VID_RefreshModeList, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE|CV_CALL, CV_Unsigned, VID_RefreshModeList, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_renderview = {"renderview", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_renderview = {"renderview", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_frameskip = {"frameskip", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_frameskip = {"frameskip", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
@@ -315,8 +315,9 @@ void SCR_CheckDefaultMode(void)
|
|||||||
void SCR_SetDefaultMode(void)
|
void SCR_SetDefaultMode(void)
|
||||||
{
|
{
|
||||||
// remember the default screen size
|
// remember the default screen size
|
||||||
CV_SetValue(&cv_scr_width, vid.width);
|
CV_StealthSetValue(&cv_scr_width, vid.width);
|
||||||
CV_SetValue(&cv_scr_height, vid.height);
|
CV_StealthSetValue(&cv_scr_height, vid.height);
|
||||||
|
VID_RefreshModeList(); // probably not needed but justin käs
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change fullscreen on/off according to cv_fullscreen
|
// Change fullscreen on/off according to cv_fullscreen
|
||||||
|
|||||||
+63
-21
@@ -304,7 +304,7 @@ static void I_StartupConsole(void)
|
|||||||
if (!consolevent)
|
if (!consolevent)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (isatty(STDIN_FILENO)!=1)
|
if (isatty(STDIN_FILENO) != 1)
|
||||||
{
|
{
|
||||||
I_OutputMsg("stdin is not a tty, tty console mode failed\n");
|
I_OutputMsg("stdin is not a tty, tty console mode failed\n");
|
||||||
consolevent = false;
|
consolevent = false;
|
||||||
@@ -729,6 +729,8 @@ static void JoyReset(SDLJoyInfo_t *JoySet)
|
|||||||
#if (SDL_VERSION_ATLEAST(2,32,4))
|
#if (SDL_VERSION_ATLEAST(2,32,4))
|
||||||
JoySet->id = -1;
|
JoySet->id = -1;
|
||||||
#endif
|
#endif
|
||||||
|
JoySet->hasled = false;
|
||||||
|
JoySet->hasrumble = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief SDL info about joystick
|
/** \brief SDL info about joystick
|
||||||
@@ -949,6 +951,13 @@ static int joy_open(int playerIndex, int joyIndex)
|
|||||||
JoyInfo[playerIndex].id = I_GetJoystickDeviceIndex(JoyInfo[playerIndex].dev);
|
JoyInfo[playerIndex].id = I_GetJoystickDeviceIndex(JoyInfo[playerIndex].dev);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if (SDL_VERSION_ATLEAST(2,0,14))
|
||||||
|
JoyInfo[playerIndex].hasled = SDL_GameControllerHasLED(JoyInfo[playerIndex].dev);
|
||||||
|
#endif
|
||||||
|
#if (SDL_VERSION_ATLEAST(2,0,18))
|
||||||
|
JoyInfo[playerIndex].hasrumble = SDL_GameControllerHasRumble(JoyInfo[playerIndex].dev);
|
||||||
|
#endif
|
||||||
|
|
||||||
return SDL_CONTROLLER_AXIS_MAX;
|
return SDL_CONTROLLER_AXIS_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -996,6 +1005,8 @@ void I_InitJoystick(UINT8 index)
|
|||||||
#if (SDL_VERSION_ATLEAST(2,32,4))
|
#if (SDL_VERSION_ATLEAST(2,32,4))
|
||||||
JoyInfo[index].id = -1;
|
JoyInfo[index].id = -1;
|
||||||
#endif
|
#endif
|
||||||
|
JoyInfo[index].hasled = false;
|
||||||
|
JoyInfo[index].hasrumble = false;
|
||||||
|
|
||||||
if (cv_usejoystick[index].value)
|
if (cv_usejoystick[index].value)
|
||||||
newcontroller = SDL_GameControllerOpen(cv_usejoystick[index].value-1);
|
newcontroller = SDL_GameControllerOpen(cv_usejoystick[index].value-1);
|
||||||
@@ -1130,6 +1141,26 @@ const char *I_GetJoyName(INT32 joyindex)
|
|||||||
return joyname;
|
return joyname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean I_GamepadHasLED(INT32 playernum)
|
||||||
|
{
|
||||||
|
#if !(SDL_VERSION_ATLEAST(2,0,14))
|
||||||
|
(void)playernum;
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
|
return (JoyInfo[playernum].dev != NULL && JoyInfo[playernum].hasled);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean I_GamepadHasRumble(INT32 playernum)
|
||||||
|
{
|
||||||
|
#if !(SDL_VERSION_ATLEAST(2,0,18))
|
||||||
|
(void)playernum;
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
|
return (JoyInfo[playernum].dev != NULL && JoyInfo[playernum].hasrumble);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration)
|
void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration)
|
||||||
{
|
{
|
||||||
#if !(SDL_VERSION_ATLEAST(2,0,14))
|
#if !(SDL_VERSION_ATLEAST(2,0,14))
|
||||||
@@ -1145,6 +1176,11 @@ void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!I_GamepadHasRumble(playernum))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SDL_GameControllerRumble(controller, low_strength, high_strength, duration);
|
SDL_GameControllerRumble(controller, low_strength, high_strength, duration);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -1164,6 +1200,11 @@ void I_SetGamepadIndicatorColor(INT32 playernum, UINT8 red, UINT8 green, UINT8 b
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!I_GamepadHasLED(playernum))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SDL_GameControllerSetLED(controller, red, green, blue);
|
SDL_GameControllerSetLED(controller, red, green, blue);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -1577,7 +1618,7 @@ static void write_backtrace(bt_crash_reason_t reason)
|
|||||||
static std::thread::id g_main_thread_id;
|
static std::thread::id g_main_thread_id;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
boolean g_in_exiting_signal_handler = false;
|
static volatile sig_atomic_t g_in_exiting_signal_handler = false;
|
||||||
|
|
||||||
static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_msg, char *signal_name)
|
static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_msg, char *signal_name)
|
||||||
{
|
{
|
||||||
@@ -1712,6 +1753,11 @@ static void I_ReportSignal(int num, int coredumped)
|
|||||||
I_ShowErrorBox(sigttl, sigmsg);
|
I_ShowErrorBox(sigttl, 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)
|
||||||
{
|
{
|
||||||
@@ -1741,21 +1787,17 @@ FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FUNCNORETURN static ATTRNORETURN void quit_handler(int num)
|
static volatile sig_atomic_t interrupted = false;
|
||||||
{
|
|
||||||
#ifdef HAVE_THREADS
|
|
||||||
if (g_main_thread_id != std::this_thread::get_id())
|
|
||||||
{
|
|
||||||
// Do not attempt any sort of recovery if this signal triggers off the main thread
|
|
||||||
signal(num, SIG_DFL);
|
|
||||||
raise(num);
|
|
||||||
exit(-2);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
signal(num, SIG_DFL); //default signal action
|
boolean I_Interrupted(void)
|
||||||
raise(num);
|
{
|
||||||
I_Quit();
|
return interrupted;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void quit_handler(int num)
|
||||||
|
{
|
||||||
|
(void)num;
|
||||||
|
interrupted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void I_RegisterSignals(void)
|
static void I_RegisterSignals(void)
|
||||||
@@ -1841,18 +1883,15 @@ static void I_Fork(void)
|
|||||||
I_RegisterChildSignals();
|
I_RegisterChildSignals();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
#ifdef LOGMESSAGES
|
||||||
if (logstream)
|
if (logstream)
|
||||||
fclose(logstream);/* the child has this */
|
fclose(logstream);/* the child has this */
|
||||||
|
#endif
|
||||||
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
|
|
||||||
logstream = 0;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
{
|
{
|
||||||
kill(child, SIGKILL);
|
kill(child, SIGKILL);
|
||||||
@@ -1888,6 +1927,7 @@ INT32 I_StartupSystem(void)
|
|||||||
SDL_version SDLlinked;
|
SDL_version SDLlinked;
|
||||||
SDL_VERSION(&SDLcompiled)
|
SDL_VERSION(&SDLcompiled)
|
||||||
SDL_GetVersion(&SDLlinked);
|
SDL_GetVersion(&SDLlinked);
|
||||||
|
|
||||||
I_StartupConsole();
|
I_StartupConsole();
|
||||||
#ifdef NEWSIGNALHANDLER
|
#ifdef NEWSIGNALHANDLER
|
||||||
// This is useful when debugging. It lets GDB attach to
|
// This is useful when debugging. It lets GDB attach to
|
||||||
@@ -1951,12 +1991,14 @@ FUNCNORETURN void ATTRNORETURN I_Quit(void)
|
|||||||
I_ShutdownInput();
|
I_ShutdownInput();
|
||||||
I_ShutdownSystem();
|
I_ShutdownSystem();
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
|
|
||||||
/* 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
|
||||||
|
|
||||||
|
|||||||
+258
-87
@@ -84,15 +84,20 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// maximum number of windowed modes (see windowedModes[][])
|
// maximum number of windowed modes (see windowedModes[][])
|
||||||
#define MAXWINMODES (22)
|
#define MAXWINMODES (128)
|
||||||
|
|
||||||
/** \brief
|
static void I_FillScreenResolutionsList(boolean force);
|
||||||
*/
|
|
||||||
static INT32 numVidModes = -1;
|
|
||||||
|
|
||||||
/** \brief
|
typedef struct
|
||||||
*/
|
{
|
||||||
static char vidModeName[33][32]; // allow 33 different modes
|
char name[10];
|
||||||
|
INT32 w;
|
||||||
|
INT32 h;
|
||||||
|
} video_mode_t;
|
||||||
|
|
||||||
|
static video_mode_t windowedModes[MAXWINMODES] = {{"320x200", 320, 200}}; // make sure the default mode exists
|
||||||
|
static const char *fallback_resolution_name = "Fallback";
|
||||||
|
static int vid_nummodes = 1;
|
||||||
|
|
||||||
rendermode_t rendermode = render_none;
|
rendermode_t rendermode = render_none;
|
||||||
|
|
||||||
@@ -139,9 +144,6 @@ static SDL_bool disable_mouse = SDL_FALSE;
|
|||||||
#define MOUSE_MENU false //(!disable_mouse && cv_usemouse.value && menuactive && !USE_FULLSCREEN)
|
#define MOUSE_MENU false //(!disable_mouse && cv_usemouse.value && menuactive && !USE_FULLSCREEN)
|
||||||
#define MOUSEBUTTONS_MAX MOUSEBUTTONS
|
#define MOUSEBUTTONS_MAX MOUSEBUTTONS
|
||||||
|
|
||||||
// first entry in the modelist which is not bigger than MAXVIDWIDTHxMAXVIDHEIGHT
|
|
||||||
static INT32 firstEntry = 0;
|
|
||||||
|
|
||||||
// Total mouse motion X/Y offsets
|
// Total mouse motion X/Y offsets
|
||||||
static INT32 mousemovex = 0, mousemovey = 0;
|
static INT32 mousemovex = 0, mousemovey = 0;
|
||||||
|
|
||||||
@@ -162,38 +164,6 @@ static SDL_Texture *texture = NULL;
|
|||||||
static SDL_GLContext sdlglcontext = NULL;
|
static SDL_GLContext sdlglcontext = NULL;
|
||||||
#endif
|
#endif
|
||||||
static SDL_bool havefocus = SDL_TRUE;
|
static SDL_bool havefocus = SDL_TRUE;
|
||||||
static const char *fallback_resolution_name = "Fallback";
|
|
||||||
|
|
||||||
// windowed video modes from which to choose from.
|
|
||||||
static INT32 windowedModes[MAXWINMODES][2] =
|
|
||||||
{
|
|
||||||
{2560,1440}, // 1.66
|
|
||||||
{1920,1200}, // 1.60,6.00
|
|
||||||
{1920,1080}, // 1.66
|
|
||||||
{1680,1050}, // 1.60,5.25
|
|
||||||
{1600,1200}, // 1.33
|
|
||||||
{1600, 900}, // 1.66
|
|
||||||
{1366, 768}, // 1.66
|
|
||||||
{1440, 900}, // 1.60,4.50
|
|
||||||
{1280,1024}, // 1.33?
|
|
||||||
{1280, 960}, // 1.33,4.00
|
|
||||||
{1280, 800}, // 1.60,4.00
|
|
||||||
{1280, 720}, // 1.66
|
|
||||||
{1152, 864}, // 1.33,3.60
|
|
||||||
{1024, 768}, // 1.33,3.20
|
|
||||||
{ 960, 600}, // 1.33,3.20
|
|
||||||
{ 800, 600}, // 1.33,2.50
|
|
||||||
{ 735, 415}, // 1.33,2.50
|
|
||||||
{ 640, 480}, // 1.33,2.00
|
|
||||||
{ 640, 400}, // 1.60,2.00
|
|
||||||
{ 500, 300}, // 1.33
|
|
||||||
{ 320, 240}, // 1.33,1.00
|
|
||||||
{ 320, 200}, // 1.60,1.00
|
|
||||||
};
|
|
||||||
|
|
||||||
#define CUSTOMMODENUM 9999
|
|
||||||
static INT32 custom_width = 0;
|
|
||||||
static INT32 custom_height = 0;
|
|
||||||
|
|
||||||
static SDL_bool Impl_CreateWindow(SDL_bool fullscreen);
|
static SDL_bool Impl_CreateWindow(SDL_bool fullscreen);
|
||||||
static void Impl_SetWindowIcon(void);
|
static void Impl_SetWindowIcon(void);
|
||||||
@@ -519,11 +489,20 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (windowmoved && rendermode == render_opengl)
|
if (windowmoved)
|
||||||
{
|
{
|
||||||
I_CheckDesktopRes();
|
I_CheckDesktopRes();
|
||||||
|
|
||||||
|
// if we say moved our game window to a different screen
|
||||||
|
// refetch our resolutions
|
||||||
|
I_FillScreenResolutionsList(false);
|
||||||
|
#ifdef HWRENDER
|
||||||
#ifdef USE_FBO_OGL
|
#ifdef USE_FBO_OGL
|
||||||
I_DownSample();
|
if (rendermode == render_opengl)
|
||||||
|
{
|
||||||
|
I_DownSample();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
windowmoved = SDL_FALSE;
|
windowmoved = SDL_FALSE;
|
||||||
}
|
}
|
||||||
@@ -540,7 +519,8 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
|
|||||||
|
|
||||||
if (!firsttimeonmouse)
|
if (!firsttimeonmouse)
|
||||||
{
|
{
|
||||||
if (cv_usemouse.value) I_StartupMouse();
|
if (cv_usemouse.value)
|
||||||
|
I_StartupMouse();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!mousefocus && !kbfocus)
|
else if (!mousefocus && !kbfocus)
|
||||||
@@ -1164,8 +1144,8 @@ void I_GetEvent(void)
|
|||||||
SDL_GetWindowSize(window, &wwidth, &wheight);
|
SDL_GetWindowSize(window, &wwidth, &wheight);
|
||||||
event.type = ev_mouse;
|
event.type = ev_mouse;
|
||||||
event.data1 = 0;
|
event.data1 = 0;
|
||||||
event.data2 = (INT32)lround(mousemovex * ((float)wwidth / (float)realwidth));
|
event.data2 = (INT32)lroundf(mousemovex * ((float)wwidth / (float)realwidth));
|
||||||
event.data3 = (INT32)lround(mousemovey * ((float)wheight / (float)realheight));
|
event.data3 = (INT32)lroundf(mousemovey * ((float)wheight / (float)realheight));
|
||||||
D_PostEvent(&event);
|
D_PostEvent(&event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1234,9 +1214,9 @@ static void VID_Command_ModeList_f(void)
|
|||||||
"Under opengl, fullscreen only supports native desktop resolution.\n"
|
"Under opengl, fullscreen only supports native desktop resolution.\n"
|
||||||
"Under software, the mode is stretched up to desktop resolution.\n");
|
"Under software, the mode is stretched up to desktop resolution.\n");
|
||||||
|
|
||||||
for (i = 0; i < MAXWINMODES; i++)
|
for (i = 0; i < vid_nummodes; i++)
|
||||||
{
|
{
|
||||||
CONS_Printf("%2d: %dx%d\n", i, windowedModes[i][0], windowedModes[i][1]);
|
CONS_Printf("%2d: %dx%d\n", i, windowedModes[i].w, windowedModes[i].h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1275,7 +1255,7 @@ static void I_CheckDesktopRes(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SDL_GetDesktopDisplayMode(currentDisplayIndex, &curmode) != 0)
|
if (SDL_GetCurrentDisplayMode(currentDisplayIndex, &curmode) != 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1290,6 +1270,11 @@ boolean I_CheckNativeRes(void)
|
|||||||
return (vid.width == desktopwidth && vid.height == desktopheight);
|
return (vid.width == desktopwidth && vid.height == desktopheight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height)
|
||||||
|
{
|
||||||
|
return (width > desktopwidth || height > desktopheight);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef USE_FBO_OGL
|
#ifdef USE_FBO_OGL
|
||||||
|
|
||||||
void RefreshOGLSDLSurface(void)
|
void RefreshOGLSDLSurface(void)
|
||||||
@@ -1520,13 +1505,207 @@ void I_SetPalette(RGBA_t *palette)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure the canonical resolutions are always available
|
||||||
|
static const struct {
|
||||||
|
const int w, h;
|
||||||
|
} canonicals[] = {
|
||||||
|
{1920, 1200}, // 16:10
|
||||||
|
{1280, 800}, // 16:10
|
||||||
|
{ 960, 600}, // 16:10
|
||||||
|
{ 640, 400}, // 16:10
|
||||||
|
{ 320, 200}, // Vanilla Doom
|
||||||
|
};
|
||||||
|
static const int num_canonicals = sizeof(canonicals)/sizeof(*canonicals);
|
||||||
|
|
||||||
|
// [FG] sort resolutions by width first and height second
|
||||||
|
static int cmp_resolutions(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
const video_mode_t *ma = (const video_mode_t *) a;
|
||||||
|
const video_mode_t *mb = (const video_mode_t *) b;
|
||||||
|
|
||||||
|
return (ma->w == mb->w) ? mb->h - ma->h : mb->w - ma->w;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void I_AppendResolution(SDL_DisplayMode *mode, int *list_size)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < *list_size; i++)
|
||||||
|
if (windowedModes[i].w == mode->w
|
||||||
|
&& windowedModes[i].h == mode->h)
|
||||||
|
return;
|
||||||
|
|
||||||
|
snprintf(windowedModes[*list_size].name,
|
||||||
|
sizeof(windowedModes[*list_size].name),
|
||||||
|
"%dx%d", mode->w, mode->h);
|
||||||
|
windowedModes[*list_size].w = mode->w;
|
||||||
|
windowedModes[*list_size].h = mode->h;
|
||||||
|
|
||||||
|
(*list_size)++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// small helper to check if a video mode is canonical
|
||||||
|
static boolean IsModeCanonical(int w, int h)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < num_canonicals; i++)
|
||||||
|
{
|
||||||
|
if (canonicals[i].w == w && canonicals[i].h == h)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if our desired resolution already is in the videomode list
|
||||||
|
static int IsCustomResolutionInList(int list_size)
|
||||||
|
{
|
||||||
|
INT32 custom_w = cv_scr_width.value;
|
||||||
|
INT32 custom_h = cv_scr_height.value;
|
||||||
|
|
||||||
|
// startup
|
||||||
|
if (!custom_w || !custom_h)
|
||||||
|
return -2;
|
||||||
|
|
||||||
|
// invalid resolution
|
||||||
|
// dont even attempt to add it
|
||||||
|
if (custom_w < BASEVIDWIDTH || custom_w > MAXVIDWIDTH
|
||||||
|
|| custom_h < BASEVIDHEIGHT || custom_h > MAXVIDHEIGHT)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
for (int i = 0; i < list_size; i++)
|
||||||
|
{
|
||||||
|
if (windowedModes[i].w == custom_w && windowedModes[i].h == custom_h)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// I_FillScreenResolutionsList
|
||||||
|
// Get all the supported screen resolutions
|
||||||
|
// and fill the list with them
|
||||||
|
//
|
||||||
|
static void I_FillScreenResolutionsList(boolean force)
|
||||||
|
{
|
||||||
|
int currentDisplayIndex = -1;
|
||||||
|
static int oldDisplayIndex = -1;
|
||||||
|
SDL_DisplayMode mode;
|
||||||
|
int i = 0, list_size = 0;
|
||||||
|
int count = 0;
|
||||||
|
char custom_resolution[10];
|
||||||
|
|
||||||
|
currentDisplayIndex = SDL_GetWindowDisplayIndex(window);
|
||||||
|
|
||||||
|
// No valid index
|
||||||
|
if (currentDisplayIndex < 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// didnt change screen, no need to redo the list
|
||||||
|
if (!force && currentDisplayIndex == oldDisplayIndex)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
oldDisplayIndex = currentDisplayIndex;
|
||||||
|
|
||||||
|
// Don't call SDL_ListModes if SDL has not been initialized
|
||||||
|
count = SDL_GetNumDisplayModes(currentDisplayIndex);
|
||||||
|
|
||||||
|
list_size = 0;
|
||||||
|
|
||||||
|
// on success, SDL_GetNumDisplayModes() always returns at least 1
|
||||||
|
if (count > 0)
|
||||||
|
{
|
||||||
|
// -2 for the desired resolution and for NULL
|
||||||
|
count = min(count, MAXWINMODES - 2 - num_canonicals);
|
||||||
|
|
||||||
|
for (i = count - 1 + num_canonicals; i >= 0; i--)
|
||||||
|
{
|
||||||
|
// make sure the canonical resolutions are always available
|
||||||
|
if (i > count - 1)
|
||||||
|
{
|
||||||
|
mode.w = canonicals[i - count].w;
|
||||||
|
mode.h = canonicals[i - count].h;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SDL_GetDisplayMode(currentDisplayIndex, i, &mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
I_AppendResolution(&mode, &list_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
windowedModes[list_size].name[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
const int customresinlist = IsCustomResolutionInList(list_size);
|
||||||
|
|
||||||
|
if (customresinlist == 0)
|
||||||
|
{
|
||||||
|
// did not find mode from list, make custom resolution if the values somewhat make sense
|
||||||
|
if (list_size < MAXWINMODES)
|
||||||
|
{
|
||||||
|
snprintf(custom_resolution, sizeof(custom_resolution), "%dx%d", cv_scr_width.value, cv_scr_height.value);
|
||||||
|
|
||||||
|
// [FG] if the desired resolution not in the list, append it
|
||||||
|
snprintf(windowedModes[list_size].name,
|
||||||
|
sizeof(windowedModes[list_size].name),
|
||||||
|
"%dx%d", cv_scr_width.value, cv_scr_height.value);
|
||||||
|
windowedModes[list_size].w = cv_scr_width.value;
|
||||||
|
windowedModes[list_size].h = cv_scr_height.value;
|
||||||
|
list_size++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
CONS_Alert(CONS_ERROR, "Could not set custom resolution!\n");
|
||||||
|
}
|
||||||
|
else if (customresinlist == -1)
|
||||||
|
CONS_Alert(CONS_ERROR, "Could not set custom resolution!\n");
|
||||||
|
|
||||||
|
// [FG] sort the list
|
||||||
|
SDL_qsort(windowedModes, list_size, sizeof(*windowedModes), cmp_resolutions);
|
||||||
|
|
||||||
|
// if we have more video modes than we can list
|
||||||
|
// try to shrink the list, lowest resolutions first
|
||||||
|
// whilst keeping the canonicals
|
||||||
|
if (list_size > MAXMODEDESCS)
|
||||||
|
{
|
||||||
|
// list is sorted from largest to smallest, so start at the end
|
||||||
|
for (i = list_size - 1; i >= 0 && list_size > MAXMODEDESCS; i--)
|
||||||
|
{
|
||||||
|
if (IsModeCanonical(windowedModes[i].w, windowedModes[i].h))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Should we like, instead prioritize checking for non aspect correct resolutions to remove?
|
||||||
|
|
||||||
|
// we gotta shift everything
|
||||||
|
// due to canonicals we cant just shrink the list
|
||||||
|
for (int k = i; k < list_size - 1; k++)
|
||||||
|
{
|
||||||
|
windowedModes[k] = windowedModes[k + 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
list_size--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
windowedModes[list_size].name[0] = '\0';
|
||||||
|
vid_nummodes = list_size;
|
||||||
|
|
||||||
|
// be sure to update the video menu
|
||||||
|
if (menuactive &&
|
||||||
|
currentMenu == &OP_VideoModeDef)
|
||||||
|
M_VideoModeMenu(0);
|
||||||
|
}
|
||||||
|
|
||||||
// return number of fullscreen + X11 modes
|
// return number of fullscreen + X11 modes
|
||||||
INT32 VID_NumModes(void)
|
INT32 VID_NumModes(void)
|
||||||
{
|
{
|
||||||
if (USE_FULLSCREEN && numVidModes != -1)
|
return vid_nummodes;
|
||||||
return numVidModes - firstEntry;
|
|
||||||
else
|
|
||||||
return MAXWINMODES;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *VID_GetModeName(INT32 modeNum)
|
const char *VID_GetModeName(INT32 modeNum)
|
||||||
@@ -1536,42 +1715,34 @@ const char *VID_GetModeName(INT32 modeNum)
|
|||||||
return fallback_resolution_name;
|
return fallback_resolution_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (modeNum > MAXWINMODES)
|
if (modeNum > vid_nummodes)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sprintf(&vidModeName[modeNum][0], "%dx%d",
|
return windowedModes[modeNum].name;
|
||||||
windowedModes[modeNum][0],
|
|
||||||
windowedModes[modeNum][1]);
|
|
||||||
|
|
||||||
return &vidModeName[modeNum][0];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < MAXWINMODES; i++)
|
for (i = 0; i < vid_nummodes; i++)
|
||||||
{
|
{
|
||||||
if (windowedModes[i][0] == w && windowedModes[i][1] == h)
|
if (windowedModes[i].w == w && windowedModes[i].h == h)
|
||||||
{
|
{
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// did not find mode from list, make custom resolution if the values somewhat make sense
|
|
||||||
// opengl mode does not mind about max resolution defined in screen.h
|
|
||||||
// if not using opengl, check against the maximum as well
|
|
||||||
if ((w >= BASEVIDWIDTH && h >= BASEVIDHEIGHT) &&
|
|
||||||
(rendermode == render_opengl || (w <= MAXVIDWIDTH && h <= MAXVIDHEIGHT)))
|
|
||||||
{
|
|
||||||
custom_width = w;
|
|
||||||
custom_height = h;
|
|
||||||
return CUSTOMMODENUM;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VID_RefreshModeList(void)
|
||||||
|
{
|
||||||
|
// check if we even need to rebuild the list
|
||||||
|
if (IsCustomResolutionInList(vid_nummodes) == 0)
|
||||||
|
I_FillScreenResolutionsList(true);
|
||||||
|
}
|
||||||
|
|
||||||
void VID_PrepareModeList(void)
|
void VID_PrepareModeList(void)
|
||||||
{
|
{
|
||||||
// Under SDL2, we just use the windowed modes list, and scale in windowed fullscreen.
|
// Under SDL2, we just use the windowed modes list, and scale in windowed fullscreen.
|
||||||
@@ -1603,17 +1774,10 @@ INT32 VID_SetMode(INT32 modeNum)
|
|||||||
{
|
{
|
||||||
vid.recalc = true;
|
vid.recalc = true;
|
||||||
|
|
||||||
if (modeNum >= 0 && modeNum < MAXWINMODES)
|
if (modeNum >= 0 && modeNum < vid_nummodes)
|
||||||
{
|
{
|
||||||
vid.width = windowedModes[modeNum][0];
|
vid.width = windowedModes[modeNum].w;
|
||||||
vid.height = windowedModes[modeNum][1];
|
vid.height = windowedModes[modeNum].h;
|
||||||
vid.modenum = modeNum;
|
|
||||||
}
|
|
||||||
else if (modeNum == CUSTOMMODENUM && custom_width && custom_height)
|
|
||||||
{
|
|
||||||
// at this point these values are assumed to be okay
|
|
||||||
vid.width = custom_width;
|
|
||||||
vid.height = custom_height;
|
|
||||||
vid.modenum = modeNum;
|
vid.modenum = modeNum;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1646,7 +1810,6 @@ INT32 VID_SetMode(INT32 modeNum)
|
|||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static SDL_bool Impl_CreateContext(void)
|
static SDL_bool Impl_CreateContext(void)
|
||||||
{
|
{
|
||||||
// Renderer-specific stuff
|
// Renderer-specific stuff
|
||||||
@@ -1669,6 +1832,9 @@ static SDL_bool Impl_CreateContext(void)
|
|||||||
I_Error("Failed to set up GL context: %s\n", SDL_GetError());
|
I_Error("Failed to set up GL context: %s\n", SDL_GetError());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// be sure to fill the resolution list the moment we have a window
|
||||||
|
I_FillScreenResolutionsList(false);
|
||||||
|
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -1710,6 +1876,9 @@ static SDL_bool Impl_CreateContext(void)
|
|||||||
|
|
||||||
SDL_RenderSetLogicalSize(renderer, BASEVIDWIDTH, BASEVIDHEIGHT);
|
SDL_RenderSetLogicalSize(renderer, BASEVIDWIDTH, BASEVIDHEIGHT);
|
||||||
|
|
||||||
|
// be sure to fill the resolution list the moment we have a window
|
||||||
|
I_FillScreenResolutionsList(false);
|
||||||
|
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1947,8 +2116,6 @@ void I_StartupGraphics(void)
|
|||||||
usesdl2soft = M_CheckParm("-softblit");
|
usesdl2soft = M_CheckParm("-softblit");
|
||||||
borderlesswindow = M_CheckParm("-borderless");
|
borderlesswindow = M_CheckParm("-borderless");
|
||||||
|
|
||||||
VID_Command_ModeList_f();
|
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
if (rendermode == render_opengl)
|
if (rendermode == render_opengl)
|
||||||
{
|
{
|
||||||
@@ -1972,6 +2139,9 @@ void I_StartupGraphics(void)
|
|||||||
vid.height = BASEVIDHEIGHT; // BitsPerPixel is the SDL interface's
|
vid.height = BASEVIDHEIGHT; // BitsPerPixel is the SDL interface's
|
||||||
vid.recalc = true; // Set up the console stufff
|
vid.recalc = true; // Set up the console stufff
|
||||||
|
|
||||||
|
// be sure to print AFTER window creation
|
||||||
|
VID_Command_ModeList_f();
|
||||||
|
|
||||||
#ifdef HAVE_TTF
|
#ifdef HAVE_TTF
|
||||||
I_ShutdownTTF();
|
I_ShutdownTTF();
|
||||||
#endif
|
#endif
|
||||||
@@ -2027,7 +2197,8 @@ void I_ShutdownGraphics(void)
|
|||||||
SDL_DestroyWindow(window);
|
SDL_DestroyWindow(window);
|
||||||
window = NULL;
|
window = NULL;
|
||||||
|
|
||||||
SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
if (SDL_WasInit(SDL_INIT_VIDEO) == SDL_INIT_VIDEO)
|
||||||
|
SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
||||||
framebuffer = SDL_FALSE;
|
framebuffer = SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loaded 100 of 113 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user