Compare commits
46
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aa27dfe325 | ||
|
|
74efc7ffe2 | ||
|
|
f52bd1df3f | ||
|
|
09942ec48f | ||
|
|
14c63c28b1 | ||
|
|
709c0dc69a | ||
|
|
b9036384d5 | ||
|
|
6b9730bf49 | ||
|
|
4e235ddb0c | ||
|
|
2ee97c6395 | ||
|
|
dd1042e68b | ||
|
|
7c0f296fcf | ||
|
|
11f78bc21f | ||
|
|
b84e3cdb7c | ||
|
|
e551c1c1ff | ||
|
|
9cadd991f9 | ||
|
|
ce0bddcbec | ||
|
|
9af6fc3b33 | ||
|
|
467ecf8224 | ||
|
|
2077315f24 | ||
|
|
9bea6eddbd | ||
|
|
f4e5f7249c | ||
|
|
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
-4
@@ -1,8 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
# needed for lto to work for some reason
|
||||
cmake_policy(SET CMP0069 NEW)
|
||||
|
||||
if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR})
|
||||
message(FATAL_ERROR "In-source builds will bring you a world of pain. Please make a separate directory to invoke CMake from.")
|
||||
endif()
|
||||
@@ -34,7 +31,7 @@ if("${SRB2_CPACK_GENERATOR}" STREQUAL "")
|
||||
endif()
|
||||
|
||||
set(CPACK_GENERATOR ${SRB2_CPACK_GENERATOR})
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Sonic Robo Blast 2 Kart Saturn" CACHE STRING "Program name for display purposes")
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Sonic Robo Blast 2 Kart" CACHE STRING "Program name for display purposes")
|
||||
set(CPACK_PACKAGE_VENDOR "Kart Krew" CACHE STRING "Vendor name for display purposes")
|
||||
#set(CPACK_PACKAGE_DESCRIPTION_FILE )
|
||||
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
|
||||
|
||||
+2
-2
@@ -54,7 +54,7 @@ set(SRB2_CORE_SOURCES
|
||||
string.c
|
||||
tables.c
|
||||
v_video.c
|
||||
w_wad.c
|
||||
w_wad.cpp
|
||||
y_inter.c
|
||||
z_zone.cpp
|
||||
)
|
||||
@@ -518,7 +518,7 @@ if(${SRB2_CONFIG_HWRENDER})
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_batching.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_shaders.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_bsp.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_cache.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_cache.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_clip.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_draw.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_main.cpp
|
||||
|
||||
+2
-7
@@ -93,8 +93,7 @@
|
||||
# NOLDWARNING=1 - ?
|
||||
# NOSDLMAIN=1 - ?
|
||||
# SDLMAIN=1 - ?
|
||||
# NOLTO=1 - Disable link time optimizations
|
||||
# USEJEMALLOC=1 Enable building with jemalloc Allocator to replace GLibc malloc, might improve performance
|
||||
# USELTO=1 - Enable building with LTO.
|
||||
#
|
||||
# Library configuration flags:
|
||||
# Everything here is an override.
|
||||
@@ -261,7 +260,7 @@ debug_opts=-D_DEBUG
|
||||
else # build a normal optimized version
|
||||
debug_opts=-DNDEBUG
|
||||
opts+=-O3
|
||||
ifndef NOLTO
|
||||
ifdef USELTO
|
||||
# compile with LTO
|
||||
opts+=-flto=auto
|
||||
libs+=-flto=auto
|
||||
@@ -280,10 +279,6 @@ opts+=-O1 -fsanitize=undefined -fno-omit-frame-pointer
|
||||
libs+=-fsanitize=undefined
|
||||
endif
|
||||
|
||||
ifdef USEJEMALLOC
|
||||
libs+=-ljemalloc
|
||||
endif
|
||||
|
||||
ifneq (,$(filter $(CC) $(CXX),clang clang++))
|
||||
libs+=-fuse-ld=lld
|
||||
endif
|
||||
|
||||
@@ -64,7 +64,6 @@ endif
|
||||
|
||||
# This must have high to low order.
|
||||
gcc_versions:=\
|
||||
161 160 16\
|
||||
152 151 150 15\
|
||||
142 141 140 14\
|
||||
133 132 131 130 13\
|
||||
@@ -78,7 +77,7 @@ gcc_versions:=\
|
||||
55 54 53 52 51 50\
|
||||
49 48 47 46 45 44 43 42 41 40
|
||||
|
||||
latest_gcc_version:=16.1
|
||||
latest_gcc_version:=15.2
|
||||
|
||||
# Automatically set version flag, but not if one was
|
||||
# manually set. And don't bother if this is a clean only
|
||||
|
||||
@@ -8,7 +8,6 @@ passthru_opts+=\
|
||||
HAVE_MINIUPNPC\
|
||||
HAVE_DISCORDRPC DEVELOP\
|
||||
NOHOLEPUNCH\
|
||||
HAVE_IPV6\
|
||||
|
||||
# build with debugging information
|
||||
ifdef DEBUGMODE
|
||||
|
||||
+38
-17
@@ -519,6 +519,23 @@ LUA_API int lua_pushthread (lua_State *L) {
|
||||
** get functions (Lua -> stack)
|
||||
*/
|
||||
|
||||
static void auxgetstr (lua_State *L, TValue *t, const char *k) {
|
||||
TValue *slot;
|
||||
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) {
|
||||
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) {
|
||||
StkId t;
|
||||
TValue key;
|
||||
lua_lock(L);
|
||||
t = index2adr(L, idx);
|
||||
api_checkvalidindex(L, t);
|
||||
setsvalue(L, &key, luaS_new(L, k));
|
||||
luaV_gettable(L, t, &key, L->top);
|
||||
api_incr_top(L);
|
||||
lua_unlock(L);
|
||||
auxgetstr(L, index2adr(L, idx), k);
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
StkId t;
|
||||
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) {
|
||||
StkId t;
|
||||
TValue key;
|
||||
lua_lock(L);
|
||||
api_checknelems(L, 1);
|
||||
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);
|
||||
auxsetstr(L, index2adr(L, idx), k);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -626,8 +626,20 @@ static void codenot (FuncState *fs, expdesc *e) {
|
||||
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) {
|
||||
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->k = VINDEXED;
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
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
|
||||
(true or false).
|
||||
|
||||
|
||||
@@ -81,7 +81,6 @@ static /*const*/ Node dummynode_ = {
|
||||
/*
|
||||
** hash for lua_Numbers
|
||||
*/
|
||||
#if 0
|
||||
static Node *hashnum (const Table *t, lua_Number n) {
|
||||
unsigned int a[numints];
|
||||
int i;
|
||||
@@ -91,12 +90,6 @@ static Node *hashnum (const Table *t, lua_Number n) {
|
||||
for (i = 1; i < numints; i++) a[0] += a[i];
|
||||
return hashmod(t, a[0]);
|
||||
}
|
||||
#else
|
||||
// our lua_Number is just typedef´d int32 so no need to do any of the above
|
||||
static inline Node *hashnum (const Table *t, lua_Number n) {
|
||||
return hashmod(t, cast(unsigned int, n));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
+89
-37
@@ -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++) {
|
||||
TValue *tm;
|
||||
if (ttistable(t)) { /* `t' is a table? */
|
||||
Table *h = hvalue(t);
|
||||
const TValue *res = luaH_get(h, key); /* do a primitive get */
|
||||
if (!ttisnil(res) || /* result is no nil? */
|
||||
(tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */
|
||||
setobj2s(L, val, res);
|
||||
if (slot == NULL) { /* 't' is not a table? */
|
||||
lua_assert(!ttistable(t));
|
||||
tm = luaT_gettmbyobj(L, t, TM_INDEX);
|
||||
if (l_unlikely(ttisnil(tm)))
|
||||
luaG_typeerror(L, t, "index"); /* no metamethod */
|
||||
/* else will try the metamethod */
|
||||
}
|
||||
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;
|
||||
}
|
||||
/* else will try the tag method */
|
||||
/* else will try the metamethod */
|
||||
}
|
||||
else if (l_unlikely(ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))))
|
||||
luaG_typeerror(L, t, "index");
|
||||
if (ttisfunction(tm)) {
|
||||
callTMres(L, val, tm, t, key);
|
||||
if (ttisfunction(tm)) { /* is metamethod a function? */
|
||||
callTMres(L, val, tm, t, key); /* call it */
|
||||
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++) {
|
||||
TValue *tm = NULL;
|
||||
if (ttistable(t)) { /* `t' is a table? */
|
||||
TValue *tm;
|
||||
if (slot != NULL) {
|
||||
lua_assert(ttistable(t) && ttisnil(slot));
|
||||
Table *h = hvalue(t);
|
||||
TValue *oldval = luaH_set(L, h, key); /* do a primitive set */
|
||||
/* oldval is nil=> look for newindex, oldval is not nil => look for usedindex */
|
||||
if (!((ttisnil(oldval) && ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) != NULL)) ||
|
||||
((!ttisnil(oldval)) && ((tm = fasttm(L, h->metatable, TM_USEDINDEX)) != NULL)))) {
|
||||
setobj2t(L, oldval, val);
|
||||
/* must check the metamethod */
|
||||
/* slot is nil=> look for newindex, slot is not nil => look for usedindex */
|
||||
if (!((ttisnil(slot) && ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) != NULL)) ||
|
||||
((!ttisnil(slot)) && ((tm = fasttm(L, h->metatable, TM_USEDINDEX)) != NULL)))) {
|
||||
/* no metamethod and (now) there is an entry with given key */
|
||||
setobj2t(L, cast(TValue *, slot), val);
|
||||
luaC_barriert(L, h, val);
|
||||
return;
|
||||
}
|
||||
/* else will try the tag method */
|
||||
/* else will try the metamethod */
|
||||
}
|
||||
else if (l_unlikely(ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))))
|
||||
luaG_typeerror(L, t, "index");
|
||||
else { /* not a table; check metamethod */
|
||||
if (l_unlikely(ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))))
|
||||
luaG_typeerror(L, t, "index");
|
||||
}
|
||||
/* try the metamethod */
|
||||
if (ttisfunction(tm)) {
|
||||
callTM(L, tm, t, key, val);
|
||||
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");
|
||||
}
|
||||
|
||||
|
||||
@@ -378,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) {
|
||||
LClosure *cl;
|
||||
@@ -387,9 +433,9 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
reentry: /* entry point */
|
||||
lua_assert(isLua(L->ci));
|
||||
pc = L->savedpc;
|
||||
cl = &clvalue(L->ci->func)->l;
|
||||
base = L->base;
|
||||
k = cl->p->k;
|
||||
cl = &clvalue(L->ci->func)->l; /* local reference to function's closure */
|
||||
k = cl->p->k; /* local reference to function's constant table */
|
||||
base = L->base; /* local copy of function's base */
|
||||
/* main loop of interpreter */
|
||||
for (;;) {
|
||||
const Instruction i = *pc++;
|
||||
@@ -449,7 +495,7 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
StkId ra = RA(i);
|
||||
StkId rb = RB(i);
|
||||
TValue *rc = RKC(i);
|
||||
Protect(luaV_gettable(L, rb, rc, ra));
|
||||
gettableProtected(L, rb, rc, ra);
|
||||
continue;
|
||||
}
|
||||
case OP_SETGLOBAL: {
|
||||
@@ -471,7 +517,7 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
StkId ra = RA(i);
|
||||
TValue *rb = RKB(i);
|
||||
TValue *rc = RKC(i);
|
||||
Protect(luaV_settable(L, ra, rb, rc));
|
||||
settableProtected(L, ra, rb, rc);
|
||||
continue;
|
||||
}
|
||||
case OP_NEWTABLE: {
|
||||
@@ -483,10 +529,16 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_SELF: {
|
||||
TValue *slot;
|
||||
StkId ra = RA(i);
|
||||
StkId rb = RB(i);
|
||||
setobjs2s(L, ra+1, rb);
|
||||
Protect(luaV_gettable(L, rb, RKC(i), ra));
|
||||
TValue *rc = RKC(i);
|
||||
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;
|
||||
}
|
||||
case OP_ADD: {
|
||||
|
||||
+52
-4
@@ -22,14 +22,62 @@
|
||||
(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_equalval (lua_State *L, const TValue *t1, const TValue *t2);
|
||||
LUAI_FUNC const TValue *luaV_tonumber (const TValue *obj, TValue *n);
|
||||
LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj);
|
||||
LUAI_FUNC void luaV_gettable (lua_State *L, TValue *t, TValue *key,
|
||||
StkId val);
|
||||
LUAI_FUNC void luaV_settable (lua_State *L, TValue *t, TValue *key,
|
||||
StkId val);
|
||||
LUAI_FUNC void luaV_finishget (lua_State *L, TValue *t, TValue *key,
|
||||
StkId val, TValue *tm);
|
||||
LUAI_FUNC void luaV_finishset (lua_State *L, TValue *t, TValue *key,
|
||||
StkId val, TValue *oldval);
|
||||
LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls);
|
||||
LUAI_FUNC void luaV_concat (lua_State *L, int total, int last);
|
||||
|
||||
|
||||
+2
-2
@@ -1168,8 +1168,8 @@ void VS_Print(vsbuf_t *buf, const char *data)
|
||||
#define NAME cvar_map_t
|
||||
#define KEY_TY const char *
|
||||
#define VAL_TY consvar_t *
|
||||
#define HASH_FN FNV1a_HashLowercaseString
|
||||
#define CMPR_FN vt_cmpr_casestring
|
||||
#define HASH_FN vt_hash_string
|
||||
#define CMPR_FN vt_cmpr_string
|
||||
#include "verstable.h"
|
||||
|
||||
#define NAME netvar_map_t
|
||||
|
||||
+21
-174
@@ -208,6 +208,14 @@ static void CONS_Clear_f(void)
|
||||
Unlock_state();
|
||||
}
|
||||
|
||||
// Choose english keymap
|
||||
//
|
||||
/*static void CONS_English_f(void)
|
||||
{
|
||||
shiftxform = english_shiftxform;
|
||||
CONS_Printf(M_GetText("%s keymap.\n"), M_GetText("English"));
|
||||
}*/
|
||||
|
||||
static char *bindtable[NUMINPUTS];
|
||||
|
||||
static void CONS_Bind_f(void)
|
||||
@@ -625,186 +633,27 @@ void CON_MoveConsole(void)
|
||||
Unlock_state();
|
||||
}
|
||||
|
||||
//======================================================================
|
||||
// KEYBOARD LAYOUTS FOR ENTERING TEXT
|
||||
//======================================================================
|
||||
|
||||
static char english_shiftxform[] =
|
||||
{
|
||||
0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31,
|
||||
' ', '!', '"', '#', '$', '%', '&',
|
||||
'"', // shift-'
|
||||
'(', ')', '*', '+',
|
||||
'<', // shift-,
|
||||
'_', // shift--
|
||||
'>', // shift-.
|
||||
'?', // shift-/
|
||||
')', // shift-0
|
||||
'!', // shift-1
|
||||
'@', // shift-2
|
||||
'#', // shift-3
|
||||
'$', // shift-4
|
||||
'%', // shift-5
|
||||
'^', // shift-6
|
||||
'&', // shift-7
|
||||
'*', // shift-8
|
||||
'(', // shift-9
|
||||
':',
|
||||
':', // shift-;
|
||||
'<',
|
||||
'+', // shift-=
|
||||
'>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'{', // shift-[
|
||||
'|', // shift-backslash - OH MY GOD DOES WATCOM SUCK
|
||||
'}', // shift-]
|
||||
'"', '_',
|
||||
'~', // shift-`
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'{', '|', '}', '~', 127
|
||||
};
|
||||
|
||||
static char french_shiftxform[] =
|
||||
{
|
||||
0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31,
|
||||
' ','$', //shift-!
|
||||
'3', //shift-"
|
||||
'#', '$', '%',
|
||||
'1', //shift-&
|
||||
'4', // shift-'
|
||||
'5', // shift-(
|
||||
')', // shift-)
|
||||
'*', '+',
|
||||
'?', // shift-,
|
||||
'6', // shift--
|
||||
'.', '/',
|
||||
'0', '1', '2', '3', '4', '5',
|
||||
'6', '7', '8', '9',
|
||||
'/', // shitf-:
|
||||
'.', // shift-;
|
||||
'>', // shift-<
|
||||
'+', // shift-=
|
||||
'>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'[', '\\', ']', '^',
|
||||
'8', //shift-_
|
||||
'`',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'{', '|', '}', '~', 127,
|
||||
128, 129,
|
||||
'2',
|
||||
131, 132,
|
||||
'0',
|
||||
134,
|
||||
'9',
|
||||
136, 137,
|
||||
'7',
|
||||
139, 140,
|
||||
'%'
|
||||
};
|
||||
|
||||
static char french_altgrxform[] =
|
||||
{
|
||||
0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31,
|
||||
' ', '!',
|
||||
'#', //altgr-"
|
||||
'#', '$', '%', '&',
|
||||
'{', //altgr-'
|
||||
'[', //altgr-(
|
||||
']', //altgr-)
|
||||
'*', '+', ',',
|
||||
'|', //altg--
|
||||
'.', '/',
|
||||
'0', '1', '2', '3', '4', '5',
|
||||
'6', '7', '8', '9',
|
||||
':', ';', '<',
|
||||
'}', //altgr-=
|
||||
'>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'[', '\\', ']', '^',
|
||||
'\\', //altgr-backslash
|
||||
'`',
|
||||
'a', 'b', 'c', 'd', 'E', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
|
||||
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
||||
'{', '|', '}', '~', 127,
|
||||
128, 129,
|
||||
'~',
|
||||
131, 132,
|
||||
'@',
|
||||
134,
|
||||
'^',
|
||||
136, 137,
|
||||
'`',
|
||||
139, 140,
|
||||
KEY_FR_U_GRAVE
|
||||
};
|
||||
|
||||
// fallback for special letter non displayable in the game (i.e.: 'é','à',etc.)
|
||||
static INT32 CON_FallBackFrSpecialLetter(INT32 key)
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
case KEY_FR_E_AIGUE: return 'e';
|
||||
case KEY_FR_E_GRAVE: return 'e';
|
||||
case KEY_FR_C_CEDILLE: return 'c';
|
||||
case KEY_FR_A_GRAVE: return 'a';
|
||||
case KEY_FR_U_GRAVE: return 'u';
|
||||
default: return key;
|
||||
}
|
||||
}
|
||||
|
||||
// goddang AZERTY
|
||||
static size_t CON_GetShiftSize(void)
|
||||
{
|
||||
return ((cv_keyboardlayout.value == 3) ? sizeof(french_shiftxform) : sizeof(english_shiftxform));
|
||||
}
|
||||
|
||||
static char *CON_Shiftform(void)
|
||||
{
|
||||
return (cv_keyboardlayout.value == 3) ? french_shiftxform : english_shiftxform;
|
||||
}
|
||||
|
||||
INT32 CON_ShiftChar(INT32 ch)
|
||||
{
|
||||
if (I_UseNativeKeyboard() || ch >= (INT32)CON_GetShiftSize())
|
||||
if (I_UseNativeKeyboard())
|
||||
return ch;
|
||||
|
||||
// warning: shiftdown is NOT a boolean, it's 1 or 2 for lshift/rshift
|
||||
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
|
||||
{
|
||||
return !!shiftdown != capslock ? CON_Shiftform()[ch] : ch;
|
||||
if (shiftdown ^ capslock)
|
||||
ch = shiftxform[ch];
|
||||
}
|
||||
|
||||
// if we're holding shift we should still shift non letter symbols
|
||||
if (shiftdown)
|
||||
else // if we're holding shift we should still shift non letter symbols
|
||||
{
|
||||
return CON_Shiftform()[ch];
|
||||
}
|
||||
|
||||
// AZERTY
|
||||
if (cv_keyboardlayout.value == 3)
|
||||
{
|
||||
if (altdown & 0x2)
|
||||
return french_altgrxform[ch];
|
||||
|
||||
return CON_FallBackFrSpecialLetter(ch);
|
||||
if (shiftdown)
|
||||
ch = shiftxform[ch];
|
||||
else if (cv_keyboardlayout.value == 3)
|
||||
{
|
||||
if (altdown & 0x2)
|
||||
ch = french_altgrxform[ch];
|
||||
else
|
||||
ch = HU_FallBackFrSpecialLetter(ch);
|
||||
}
|
||||
}
|
||||
|
||||
return ch;
|
||||
@@ -1437,8 +1286,6 @@ void CONS_Error(const char *msg)
|
||||
// dirty quick hack, but for the good cause
|
||||
while (I_GetKey() != KEY_ENTER)
|
||||
{
|
||||
I_HandleInterrupt();
|
||||
|
||||
// Sleep so we don't take too much of cpu usage
|
||||
I_Sleep(1.f/TICRATE*1000);
|
||||
|
||||
|
||||
+40
-63
@@ -125,7 +125,6 @@ static tic_t freezetimeout[MAXNETNODES]; // Until when can this node freeze the
|
||||
UINT16 pingmeasurecount = 1;
|
||||
UINT32 realpingtable[MAXPLAYERS] = {}; //the base table of ping where an average will be sent to everyone.
|
||||
UINT32 playerpingtable[MAXPLAYERS] = {}; //table of player latency values.
|
||||
UINT32 localplayerping = 0;
|
||||
|
||||
#define GENTLEMANSMOOTHING (TICRATE)
|
||||
static tic_t reference_lag = 0;
|
||||
@@ -357,13 +356,12 @@ void SendNetXCmdForPlayer(UINT8 playerid, netxcmd_t id, const void *param, size_
|
||||
|
||||
if (2+nparam > MAXTEXTCMD)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("packet too large to fit NetXCmd, cannot add netcmd %s with id %d! (size: %s, max: %d)\n"), netxcmdnames[id-1], id, sizeu1(2+nparam), MAXTEXTCMD);
|
||||
CONS_Alert(CONS_ERROR, M_GetText("packet too large to fit NetXCmd, cannot add netcmd %d! (size: %s, max: %d)\n"), id, sizeu1(2+nparam), MAXTEXTCMD);
|
||||
return;
|
||||
}
|
||||
|
||||
// for future reference: if (cv_debug) != debug disabled.
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("NetXCmd buffer full, delaying netcmd %s with id %d... (size: %d, needed: %s)\n"), netxcmdnames[id-1], id, localtextcmd[playerid][0], sizeu1(nparam));
|
||||
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("NetXCmd buffer full, delaying netcmd %d... (size: %d, needed: %s)\n"), id, localtextcmd[playerid][0], sizeu1(nparam));
|
||||
if (buf == NULL)
|
||||
{
|
||||
textcmdbuf[playerid] = (textcmdbuf_t*)Z_Malloc(sizeof(textcmdbuf_t), PU_STATIC, NULL);
|
||||
@@ -1257,18 +1255,20 @@ static void CL_DrawConnectionStatus(void)
|
||||
case CL_DOWNLOADSAVEGAME:
|
||||
if (filedownload.current != -1)
|
||||
{
|
||||
UINT32 dldlength = 0;
|
||||
INT32 dldlength = 0;
|
||||
fileneeded_t *file = &fileneeded[filedownload.current];
|
||||
UINT32 currentsize = file->currentsize;
|
||||
UINT32 totalsize = file->totalsize;
|
||||
UINT32 currentsize = min(file->currentsize, totalsize);
|
||||
|
||||
cltext = M_GetText("Downloading game state...");
|
||||
Net_GetNetStat();
|
||||
|
||||
if (totalsize != 0)
|
||||
dldlength = (UINT32)((currentsize/(double)totalsize) * 256);
|
||||
dldlength = (INT32)((currentsize/(double)totalsize) * 256);
|
||||
if (dldlength > 256)
|
||||
dldlength = 256;
|
||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 111);
|
||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, (INT32)dldlength, 8, 96);
|
||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, dldlength, 8, 96);
|
||||
|
||||
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE,
|
||||
va(" %4uK/%4uK", currentsize>>10, totalsize>>10));
|
||||
@@ -1485,15 +1485,14 @@ static void CL_DrawConnectionStatus(void)
|
||||
}
|
||||
else if (filedownload.current != -1)
|
||||
{
|
||||
UINT32 dldlength = 0;
|
||||
INT32 dldlength = 0;
|
||||
INT32 totalfileslength = 0;
|
||||
UINT32 totaldldsize = 0;
|
||||
UINT32 totalfileslength = 0;
|
||||
static char tempname[28];
|
||||
fileneeded_t *file = &fileneeded[filedownload.current];
|
||||
char *filename = file->filename;
|
||||
UINT32 currentsize = file->currentsize;
|
||||
UINT32 totalsize = file->totalsize;
|
||||
UINT32 currentsize = min(file->currentsize, totalsize);
|
||||
UINT32 fdtotalsize = filedownload.totalsize;
|
||||
|
||||
// Draw the bottom box.
|
||||
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-58-8, 32, 1);
|
||||
@@ -1501,9 +1500,11 @@ static void CL_DrawConnectionStatus(void)
|
||||
|
||||
Net_GetNetStat();
|
||||
if (totalsize != 0)
|
||||
dldlength = (UINT32)((currentsize/(double)totalsize) * 256);
|
||||
dldlength = (INT32)((currentsize/(double)totalsize) * 256);
|
||||
if (dldlength > 256)
|
||||
dldlength = 256;
|
||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, 256, 8, 175);
|
||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, (INT32)dldlength, 8, 160);
|
||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, dldlength, 8, 160);
|
||||
|
||||
memset(tempname, 0, sizeof(tempname));
|
||||
|
||||
@@ -1544,18 +1545,18 @@ static void CL_DrawConnectionStatus(void)
|
||||
totaldldsize = filedownload.completedsize;
|
||||
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-14, V_YELLOWMAP|MENUCAPS, "Overall Download Progress");
|
||||
if (fdtotalsize != 0)
|
||||
totalfileslength = (UINT32)((totaldldsize/(double)fdtotalsize) * 256);
|
||||
if (filedownload.totalsize != 0)
|
||||
totalfileslength = (INT32)((totaldldsize/(double)filedownload.totalsize) * 256);
|
||||
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1);
|
||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 175);
|
||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, (INT32)totalfileslength, 8, 160);
|
||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, totalfileslength, 8, 160);
|
||||
|
||||
if ((fdtotalsize>>20) >= 10) // display in MB if over 10MB
|
||||
if (filedownload.totalsize>>20 >= 10) // display in MB if over 10MB
|
||||
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
||||
va(" %4uM/%4uM", (INT32)(totaldldsize>>20), (INT32)(fdtotalsize>>20)));
|
||||
va(" %4uM/%4uM", totaldldsize>>20, filedownload.totalsize>>20));
|
||||
else
|
||||
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
||||
va(" %4uK/%4uK", (INT32)(totaldldsize>>10), (INT32)(fdtotalsize>>10)));
|
||||
va(" %4uK/%4uK", totaldldsize>>10, filedownload.totalsize>>10));
|
||||
|
||||
V_DrawRightAlignedString(BASEVIDWIDTH/2+128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
||||
va("%2u/%2u Files ", filedownload.completednum, filedownload.totalnum));
|
||||
@@ -2230,12 +2231,7 @@ static void CL_ReloadReceivedSavegame(void)
|
||||
static void SendAskInfo(INT32 node)
|
||||
{
|
||||
tic_t asktime;
|
||||
doomdata_t *netbuffer;
|
||||
|
||||
if (node == -1)
|
||||
return;
|
||||
|
||||
netbuffer = DOOMCOM_DATA(doomcom);
|
||||
doomdata_t *netbuffer = DOOMCOM_DATA(doomcom);
|
||||
|
||||
#ifdef HOLEPUNCH
|
||||
if (node != 0 && node != BROADCASTADDR &&
|
||||
@@ -2858,7 +2854,10 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic
|
||||
{
|
||||
INT32 key;
|
||||
|
||||
I_HandleInterrupt();
|
||||
if (I_Interrupted())
|
||||
{
|
||||
I_Quit();
|
||||
}
|
||||
|
||||
I_OsPolling();
|
||||
|
||||
@@ -3391,21 +3390,9 @@ static void Command_connect(void)
|
||||
}
|
||||
else
|
||||
CONS_Alert(CONS_ERROR, M_GetText("There is no network driver\n"));
|
||||
|
||||
// invalid address
|
||||
if (servernode == -1)
|
||||
{
|
||||
D_QuitNetGame(); // this will also call D_CloseConnection for us
|
||||
CL_Reset();
|
||||
servernode = 0; // not sure if this is cool, but if this is -1 then bad things happen in alot of networking code
|
||||
D_StartTitle();
|
||||
M_StartMessage(M_GetText("Failed to connect to server\nMake sure you put in a valid Address!\n"), NULL, MM_NOTHING);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (I_GetNodeAddress)
|
||||
CV_Set(&cv_lastserver, I_GetNodeAddress(servernode));
|
||||
CV_Set(&cv_lastserver, I_GetNodeAddress(servernode));
|
||||
|
||||
if (splitscreen != cv_splitplayers.value-1)
|
||||
{
|
||||
@@ -3497,9 +3484,6 @@ void CL_RemovePlayer(INT32 playernum, INT32 reason)
|
||||
while ((doomcom->numslots > 1) && !playeringame[doomcom->numslots-1])
|
||||
doomcom->numslots--;
|
||||
|
||||
// Unmute slot if player was muted
|
||||
player_muted[playernum] = false;
|
||||
|
||||
// Reset the name
|
||||
sprintf(player_names[playernum], "Player %d", playernum+1);
|
||||
|
||||
@@ -4377,7 +4361,7 @@ void D_ClientServerInit(void)
|
||||
playerinfo[i].node = 255;
|
||||
|
||||
gametic = 0;
|
||||
leveltime = 0;
|
||||
localgametic = 0;
|
||||
|
||||
// do not send anything before the real begin
|
||||
SV_StopServer();
|
||||
@@ -4449,7 +4433,6 @@ void SV_ResetServer(void)
|
||||
pingmeasurecount = 1;
|
||||
memset(realpingtable, 0, sizeof(realpingtable));
|
||||
memset(playerpingtable, 0, sizeof(playerpingtable));
|
||||
localplayerping = 0;
|
||||
|
||||
ClearAdminPlayers();
|
||||
|
||||
@@ -5634,7 +5617,7 @@ static void PT_ClientCmd(INT32 netconsole, SINT8 node)
|
||||
realstart = ExpandTics(netbuffer->u.clientpak.client_tic, nettics[node]);
|
||||
realend = ExpandTics(netbuffer->u.clientpak.resendfrom, nettics[node]);
|
||||
|
||||
if ( netbuffer->packettype == PT_CLIENTMIS || netbuffer->packettype == PT_CLIENT2MIS
|
||||
if (netbuffer->packettype == PT_CLIENTMIS || netbuffer->packettype == PT_CLIENT2MIS
|
||||
|| netbuffer->packettype == PT_CLIENT3MIS || netbuffer->packettype == PT_CLIENT4MIS
|
||||
|| netbuffer->packettype == PT_NODEKEEPALIVEMIS
|
||||
|| supposedtics[node] < realend)
|
||||
@@ -5677,10 +5660,10 @@ static void PT_ClientCmd(INT32 netconsole, SINT8 node)
|
||||
return;
|
||||
|
||||
// Splitscreen cmd
|
||||
if ((nodetoplayer2[node] >= 0) &&
|
||||
((netbuffer->packettype == PT_CLIENT2CMD || netbuffer->packettype == PT_CLIENT2MIS)
|
||||
if (((netbuffer->packettype == PT_CLIENT2CMD || netbuffer->packettype == PT_CLIENT2MIS)
|
||||
|| (netbuffer->packettype == PT_CLIENT3CMD || netbuffer->packettype == PT_CLIENT3MIS)
|
||||
|| (netbuffer->packettype == PT_CLIENT4CMD || netbuffer->packettype == PT_CLIENT4MIS)))
|
||||
|| (netbuffer->packettype == PT_CLIENT4CMD || netbuffer->packettype == PT_CLIENT4MIS))
|
||||
&& (nodetoplayer2[node] >= 0))
|
||||
{
|
||||
G_MoveTiccmd(&playercmds[(UINT8)nodetoplayer2[node]], &netbuffer->u.client2pak.cmd2, 1);
|
||||
|
||||
@@ -5688,9 +5671,9 @@ static void PT_ClientCmd(INT32 netconsole, SINT8 node)
|
||||
return;
|
||||
}
|
||||
|
||||
if ((nodetoplayer3[node] >= 0) &&
|
||||
((netbuffer->packettype == PT_CLIENT3CMD || netbuffer->packettype == PT_CLIENT3MIS)
|
||||
|| (netbuffer->packettype == PT_CLIENT4CMD || netbuffer->packettype == PT_CLIENT4MIS)))
|
||||
if (((netbuffer->packettype == PT_CLIENT3CMD || netbuffer->packettype == PT_CLIENT3MIS)
|
||||
|| (netbuffer->packettype == PT_CLIENT4CMD || netbuffer->packettype == PT_CLIENT4MIS))
|
||||
&& (nodetoplayer3[node] >= 0))
|
||||
{
|
||||
G_MoveTiccmd(&playercmds[(UINT8)nodetoplayer3[node]], &netbuffer->u.client3pak.cmd3, 1);
|
||||
|
||||
@@ -5698,8 +5681,8 @@ static void PT_ClientCmd(INT32 netconsole, SINT8 node)
|
||||
return;
|
||||
}
|
||||
|
||||
if ((nodetoplayer4[node] >= 0) &&
|
||||
(netbuffer->packettype == PT_CLIENT4CMD || netbuffer->packettype == PT_CLIENT4MIS))
|
||||
if ((netbuffer->packettype == PT_CLIENT4CMD || netbuffer->packettype == PT_CLIENT4MIS)
|
||||
&& (nodetoplayer4[node] >= 0))
|
||||
{
|
||||
G_MoveTiccmd(&playercmds[(UINT8)nodetoplayer4[node]], &netbuffer->u.client4pak.cmd4, 1);
|
||||
|
||||
@@ -6836,7 +6819,7 @@ boolean TryRunTics(tic_t realtics)
|
||||
{
|
||||
boolean update_stats = !(paused || P_AutoPause());
|
||||
|
||||
DEBFILE(va("============ Running tic %d (local %d)\n", gametic, leveltime));
|
||||
DEBFILE(va("============ Running tic %d (local %d)\n", gametic, localgametic));
|
||||
|
||||
if (update_stats)
|
||||
PS_START_TIMING(ps_tictime);
|
||||
@@ -6986,12 +6969,10 @@ static void UpdatePingTable(void)
|
||||
|
||||
INT32 i;
|
||||
|
||||
const boolean playing = Playing();
|
||||
|
||||
if (server)
|
||||
{
|
||||
//if (playing && !(gametime % 8)) // Value chosen based on _my vibes man_ << dont do this for v8 atleast, this is placeboeing ppl to hell and back
|
||||
if (playing && !(gametime % 35)) // update once per second.
|
||||
//if (Playing() && !(gametime % 8)) // Value chosen based on _my vibes man_ << dont do this for v8 atleast, this is placeboeing ppl to hell and back
|
||||
if (Playing() && !(gametime % 35)) // update once per second.
|
||||
PingUpdate();
|
||||
|
||||
fastest = 0;
|
||||
@@ -7050,10 +7031,6 @@ static void UpdatePingTable(void)
|
||||
else
|
||||
lowest_lag = simulated_lag = 0;
|
||||
}
|
||||
|
||||
// this is really dumb but oh well
|
||||
if (playing && !(gametime % 35))
|
||||
localplayerping = playerpingtable[consoleplayer];
|
||||
}
|
||||
|
||||
#ifdef HOLEPUNCH
|
||||
|
||||
@@ -650,8 +650,6 @@ extern UINT8 playernode[MAXPLAYERS];
|
||||
|
||||
extern boolean player_muted[MAXPLAYERS];
|
||||
|
||||
extern UINT32 localplayerping;
|
||||
|
||||
INT32 D_NumPlayers(void);
|
||||
|
||||
void D_ResetTiccmds(void);
|
||||
|
||||
+39
-35
@@ -138,7 +138,6 @@ boolean devparm = false; // started game with -devparm
|
||||
|
||||
boolean singletics = false; // timedemo
|
||||
boolean lastdraw = false;
|
||||
boolean intermissionbginit = false;
|
||||
|
||||
#ifdef MOTIONBLUR
|
||||
INT32 postimgparam[MAXSPLITSCREENPLAYERS];
|
||||
@@ -154,7 +153,7 @@ boolean music_disabled = false;
|
||||
INT32 debugload = 0;
|
||||
#endif
|
||||
|
||||
char savegamename[256] = {};
|
||||
char savegamename[256];
|
||||
|
||||
char srb2home[256] = ".";
|
||||
char srb2path[256] = ".";
|
||||
@@ -363,33 +362,6 @@ static void D_Renderview(void)
|
||||
// added comment : there is a wipe eatch change of the gamestate
|
||||
gamestate_t wipegamestate = GS_LEVEL;
|
||||
|
||||
static void D_MakeIntermissionBG(void)
|
||||
{
|
||||
if (!lastdraw)
|
||||
return;
|
||||
|
||||
if (rendermode == render_none)
|
||||
{
|
||||
lastdraw = false;
|
||||
intermissionbginit = false;
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
{
|
||||
HWR_MakeScreenTexture();
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
VID_BlitLinearScreen(vid.screens[0], vid.screens[1], vid.width, vid.height, vid.width, vid.width);
|
||||
}
|
||||
|
||||
lastdraw = false;
|
||||
intermissionbginit = true;
|
||||
}
|
||||
|
||||
static boolean D_Display(void)
|
||||
{
|
||||
boolean ranwipe = false;
|
||||
@@ -555,8 +527,16 @@ static boolean D_Display(void)
|
||||
PS_START_TIMING(ps_rendercalltime);
|
||||
D_Renderview();
|
||||
PS_STOP_TIMING(ps_rendercalltime);
|
||||
}
|
||||
|
||||
D_MakeIntermissionBG();
|
||||
if (lastdraw)
|
||||
{
|
||||
if (rendermode == render_soft)
|
||||
{
|
||||
VID_BlitLinearScreen(vid.screens[0], vid.screens[1], vid.width, vid.height, vid.width, vid.width);
|
||||
}
|
||||
|
||||
lastdraw = false;
|
||||
}
|
||||
|
||||
PS_START_TIMING(ps_uitime);
|
||||
@@ -717,17 +697,18 @@ void D_SRB2Loop(void)
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (I_Interrupted())
|
||||
{
|
||||
I_Quit();
|
||||
}
|
||||
|
||||
// capbudget is the minimum precise_t duration of a single loop iteration
|
||||
precise_t capbudget;
|
||||
precise_t elapsed;
|
||||
precise_t enterprecise, finishprecise;
|
||||
|
||||
boolean ranwipe = false;
|
||||
|
||||
enterprecise = I_GetPreciseTime();
|
||||
|
||||
I_HandleInterrupt();
|
||||
|
||||
memset(&g_dc, 0, sizeof(g_dc));
|
||||
Z_Frame_Reset();
|
||||
|
||||
@@ -735,6 +716,8 @@ void D_SRB2Loop(void)
|
||||
const UINT32 framecap = R_GetFramerateCap();
|
||||
capbudget = (framecap == 0) ? 0 : (precise_t)((double)precision / (double)framecap + 0.5); // + 0.5 instead of round
|
||||
|
||||
boolean ranwipe = false;
|
||||
|
||||
I_UpdateTime(cv_timescale.value);
|
||||
|
||||
if (lastwipetic)
|
||||
@@ -1402,6 +1385,8 @@ static inline void D_MakeTitleString(char *s)
|
||||
// extra graphic patches for saturn specific thingies
|
||||
boolean xtra_speedo = false; // extra speedometer check
|
||||
boolean xtra_speedo_clr = false; // extra speedometer colour check
|
||||
boolean xtra_speedo3 = false; // 80x 11 extra speedometer check
|
||||
boolean xtra_speedo_clr3 = false; // 80x 11 extra speedometer colour check
|
||||
boolean achi_speedo = false; // achiiro speedometer check
|
||||
boolean achi_speedo_clr = false; // extra speedometer colour check
|
||||
boolean dial_speedo = false; // dial speedometer check
|
||||
@@ -1431,6 +1416,7 @@ static void D_CheckSaturnExtraFiles(void)
|
||||
CV_PossibleValue_t minimapdot_cons_temp[NUMMINIMAPDOTSTUFF] = {{0, "Off"}, {0, NULL}, {0, NULL}, {0, NULL}, {0, NULL}};
|
||||
|
||||
unsigned last_speedo_i = 0;
|
||||
unsigned last_driftgauge_i = 3;
|
||||
unsigned last_inputdisplay_i = 2;
|
||||
unsigned last_minimapdot_i = 0;
|
||||
#define PUSHCONS(cons, i, id, name) { ++i; cons[i].value = id; cons[i].strvalue = name; }
|
||||
@@ -1589,6 +1575,20 @@ static void D_CheckSaturnExtraFiles(void)
|
||||
if (found_extra3_kart)
|
||||
{
|
||||
mainwads++;
|
||||
|
||||
// 80x11 speedometer crap
|
||||
if (W_LumpExists("SP_SM3TC"))
|
||||
{
|
||||
xtra_speedo3 = true;
|
||||
PUSHCONS(speedo_cons_temp, last_speedo_i, 7, "Extra");
|
||||
PUSHCONS(driftgaugestyle_cons_temp, last_driftgauge_i, 5, "Extra");
|
||||
}
|
||||
|
||||
// 80x11 speedometer crap but colour
|
||||
if (W_LumpExists("SC_SM3TC"))
|
||||
{
|
||||
xtra_speedo_clr3 = true;
|
||||
}
|
||||
}
|
||||
|
||||
#undef PUSHCONS
|
||||
@@ -1786,6 +1786,10 @@ void D_SRB2Main(void)
|
||||
// Setup default unlockable conditions
|
||||
M_SetupDefaultConditionSets();
|
||||
|
||||
// Setup character tables
|
||||
// Have to be done here before files are loaded
|
||||
M_InitCharacterTables();
|
||||
|
||||
// load wad, including the main wad file
|
||||
CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n");
|
||||
|
||||
@@ -2159,8 +2163,8 @@ void D_SRB2Main(void)
|
||||
|
||||
if (dedicated && server)
|
||||
{
|
||||
levelstarttic = gametic;
|
||||
G_SetGamestate(GS_LEVEL);
|
||||
|
||||
if (!P_SetupLevel(false, false))
|
||||
I_Quit(); // fail so reset game stuff
|
||||
}
|
||||
|
||||
@@ -38,6 +38,8 @@ extern boolean found_extra3_kart; // for use in k_kart.c
|
||||
|
||||
extern boolean xtra_speedo; // extra speedometer check
|
||||
extern boolean xtra_speedo_clr; // extra speedometer colour check
|
||||
extern boolean xtra_speedo3; // 80x11 extra speedometer check
|
||||
extern boolean xtra_speedo_clr3; // 80x11 extra speedometer colour check
|
||||
extern boolean achi_speedo; // achiiro speedometer check
|
||||
extern boolean achi_speedo_clr; // extra speedometer colour check
|
||||
extern boolean dial_speedo; // dial speedometer check
|
||||
|
||||
@@ -27,6 +27,7 @@ extern "C" {
|
||||
// SINT8 is used for nodes sometimes >:(
|
||||
#define MAXNETNODES 127
|
||||
#define BROADCASTADDR MAXNETNODES
|
||||
#define NETSPLITSCREEN // Kart's splitscreen netgame feature
|
||||
|
||||
#define STATLENGTH (TICRATE*2)
|
||||
|
||||
|
||||
+27
-59
@@ -1010,7 +1010,6 @@ void D_RegisterClientCommands(void)
|
||||
CV_RegisterVar(&cv_gamepadled[i]);
|
||||
}
|
||||
|
||||
CV_RegisterVar(&cv_gamepadifunfocused);
|
||||
CV_RegisterVar(&cv_gamepadledifunfocused);
|
||||
CV_RegisterVar(&cv_rumbleifunfocused);
|
||||
|
||||
@@ -1214,22 +1213,13 @@ static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
|
||||
|
||||
if (len == 0 || len > MAXPLAYERNAME)
|
||||
return false; // Empty or too long.
|
||||
if (name[0] == ' ')
|
||||
return false; // Starts with a space.
|
||||
if (name[0] == ' ' || name[len-1] == ' ')
|
||||
return false; // Starts or ends with a space.
|
||||
if (isdigit(name[0]))
|
||||
return false; // Starts with a digit.
|
||||
if (name[0] == '@' || name[0] == '~')
|
||||
return false; // Starts with an admin symbol.
|
||||
|
||||
// Clean up trailing whitespace.
|
||||
while (len && name[len-1] == ' ')
|
||||
{
|
||||
name[len-1] = '\0';
|
||||
len--;
|
||||
}
|
||||
if (len == 0)
|
||||
return false;
|
||||
|
||||
// Check if it contains a non-printing character.
|
||||
// Note: ANSI C isprint() considers space a printing character.
|
||||
// Also don't allow semicolons, since they are used as
|
||||
@@ -1282,8 +1272,7 @@ static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
|
||||
* is restored to what it was before.
|
||||
*
|
||||
* We assume that if playernum is ::consoleplayer or ::secondarydisplayplayer
|
||||
* (unless clientjoin is true, a necessary evil)
|
||||
* the console variable ::cv_playername to ::cv_playername4 respectively is
|
||||
* the console variable ::cv_playername or ::cv_playername2 respectively is
|
||||
* already set to newname. However, the player name table is assumed to
|
||||
* contain the old name.
|
||||
*
|
||||
@@ -1303,10 +1292,6 @@ static void CleanupPlayerName(INT32 playernum, const char *newname)
|
||||
char *tmpname = NULL;
|
||||
INT32 i;
|
||||
boolean namefailed = true;
|
||||
boolean clientjoin = !!(playernum >= MAXPLAYERS);
|
||||
|
||||
if (clientjoin)
|
||||
playernum -= MAXPLAYERS;
|
||||
|
||||
buf = Z_StrDup(newname);
|
||||
|
||||
@@ -1363,21 +1348,18 @@ static void CleanupPlayerName(INT32 playernum, const char *newname)
|
||||
}
|
||||
|
||||
// no stealing another player's name
|
||||
if (!clientjoin)
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (i != playernum && playeringame[i]
|
||||
&& fasticmp(tmpname, player_names[i]))
|
||||
{
|
||||
if (i != playernum && playeringame[i]
|
||||
&& fasticmp(tmpname, player_names[i]))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i < MAXPLAYERS)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i < MAXPLAYERS)
|
||||
break;
|
||||
|
||||
// name is okay then
|
||||
namefailed = false;
|
||||
} while (0);
|
||||
@@ -1387,23 +1369,15 @@ static void CleanupPlayerName(INT32 playernum, const char *newname)
|
||||
|
||||
// set consvars whether namefailed or not, because even if it succeeded,
|
||||
// spaces may have been removed
|
||||
if (clientjoin)
|
||||
{
|
||||
consvar_t *namevars[] = {&cv_playername, &cv_playername2, &cv_playername3, &cv_playername4};
|
||||
CV_StealthSet(namevars[playernum], tmpname);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (playernum == consoleplayer)
|
||||
CV_StealthSet(&cv_playername, tmpname);
|
||||
else if (playernum == displayplayers[1] || (!netgame && playernum == 1))
|
||||
CV_StealthSet(&cv_playername2, tmpname);
|
||||
else if (playernum == displayplayers[2] || (!netgame && playernum == 2))
|
||||
CV_StealthSet(&cv_playername3, tmpname);
|
||||
else if (playernum == displayplayers[3] || (!netgame && playernum == 3))
|
||||
CV_StealthSet(&cv_playername4, tmpname);
|
||||
else I_Assert(((void)"CleanupPlayerName used on non-local player", 0));
|
||||
}
|
||||
if (playernum == consoleplayer)
|
||||
CV_StealthSet(&cv_playername, tmpname);
|
||||
else if (playernum == displayplayers[1] || (!netgame && playernum == 1))
|
||||
CV_StealthSet(&cv_playername2, tmpname);
|
||||
else if (playernum == displayplayers[2] || (!netgame && playernum == 2))
|
||||
CV_StealthSet(&cv_playername3, tmpname);
|
||||
else if (playernum == displayplayers[3] || (!netgame && playernum == 3))
|
||||
CV_StealthSet(&cv_playername4, tmpname);
|
||||
else I_Assert(((void)"CleanupPlayerName used on non-local player", 0));
|
||||
|
||||
Z_Free(buf);
|
||||
}
|
||||
@@ -1521,9 +1495,7 @@ static void ForceAllSkins(INT32 forcedskin)
|
||||
}
|
||||
|
||||
static INT32 chmappending;
|
||||
#ifdef PARANOIA
|
||||
static INT32 snacpending[MAXSPLITSCREENPLAYERS];
|
||||
#endif
|
||||
|
||||
// wonky compat, idk if anything uses this....
|
||||
#define playerisbot (splitplayer == 1 && botingame)
|
||||
@@ -1623,9 +1595,7 @@ static void SendNameAndColor(UINT8 splitplayer)
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef PARANOIA
|
||||
snacpending[splitplayer]++;
|
||||
#endif
|
||||
|
||||
// Don't change name if muted
|
||||
if (player_name_changes[pnum] >= MAXNAMECHANGES)
|
||||
@@ -1661,7 +1631,7 @@ static void SendNameAndColor(UINT8 splitplayer)
|
||||
|
||||
static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
||||
{
|
||||
player_t *player;
|
||||
player_t *player = &players[playernum];
|
||||
char name[MAXPLAYERNAME+1] = {};
|
||||
UINT8 color, skin;
|
||||
|
||||
@@ -1670,18 +1640,14 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
||||
I_Error("There is no player %d!", playernum);
|
||||
#endif
|
||||
|
||||
player = &players[playernum];
|
||||
|
||||
#ifdef PARANOIA
|
||||
if (P_IsLocalPlayer(player))
|
||||
{
|
||||
const INT32 localpnum = P_GetLocalPlayerNumForPlayer(player);
|
||||
snacpending[localpnum]--;
|
||||
|
||||
if (snacpending[localpnum] < 0)
|
||||
I_Error("snacpending negative for player %d!", localpnum);
|
||||
}
|
||||
snacpending[playernum]--;
|
||||
#ifdef PARANOIA
|
||||
if (snacpending[playernum] < 0)
|
||||
I_Error("snacpending negative!");
|
||||
#endif
|
||||
}
|
||||
|
||||
READSTRINGN(*cp, name, MAXPLAYERNAME);
|
||||
color = READUINT8(*cp);
|
||||
@@ -2222,6 +2188,7 @@ void D_SetupVote(void)
|
||||
WRITEUINT8(p, secondgt);
|
||||
secondgt &= ~0x80;
|
||||
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
UINT16 m;
|
||||
@@ -5848,6 +5815,7 @@ static void BaseNumLaps_OnChange(void)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void KartFrantic_OnChange(void)
|
||||
{
|
||||
if ((boolean)cv_kartfrantic.value != franticitems && gamestate == GS_LEVEL && leveltime > starttime)
|
||||
|
||||
@@ -51,6 +51,10 @@ extern consvar_t cv_mousevisible;
|
||||
//WTF
|
||||
extern consvar_t cv_mouseturn;
|
||||
extern consvar_t cv_usejoystick[4]; //MAXSPLITSCREENPLAYERS
|
||||
#ifdef LJOYSTICK
|
||||
extern consvar_t cv_joyport;
|
||||
extern consvar_t cv_joyport2;
|
||||
#endif
|
||||
extern consvar_t cv_joyscale[4]; //MAXSPLITSCREENPLAYERS
|
||||
|
||||
// normally in p_mobj but the .h is not read
|
||||
@@ -89,6 +93,11 @@ extern consvar_t cv_pause;
|
||||
extern consvar_t cv_restrictskinchange, cv_allowteamchange, cv_ingamecap, cv_respawntime;
|
||||
extern consvar_t cv_spectatorreentry, cv_antigrief;
|
||||
|
||||
/*extern consvar_t cv_teleporters, cv_superring, cv_supersneakers, cv_invincibility;
|
||||
extern consvar_t cv_jumpshield, cv_watershield, cv_ringshield, cv_forceshield, cv_bombshield;
|
||||
extern consvar_t cv_1up, cv_eggmanbox;
|
||||
extern consvar_t cv_recycler;*/
|
||||
|
||||
// SRB2kart items
|
||||
extern consvar_t cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana;
|
||||
extern consvar_t cv_eggmanmonitor, cv_orbinaut, cv_jawz, cv_mine;
|
||||
|
||||
+19
-33
@@ -167,9 +167,7 @@ UINT8 *PutFileNeeded(UINT16 firstfile)
|
||||
continue;
|
||||
}
|
||||
|
||||
strncpy(wadfilename, wadfiles[i]->filename, MAX_WADPATH);
|
||||
wadfilename[MAX_WADPATH-1] = '\0';
|
||||
nameonly(wadfilename);
|
||||
nameonly(strcpy(wadfilename, wadfiles[i]->filename));
|
||||
|
||||
// Look below at the WRITE macros to understand what these numbers mean.
|
||||
const size_t len = strlen(wadfilename) + 1;
|
||||
@@ -259,10 +257,9 @@ void CL_PrepareDownloadSaveGame(const char *tmpsave)
|
||||
*/
|
||||
boolean CL_CheckDownloadable(void)
|
||||
{
|
||||
UINT8 i, dlstatus = 0;
|
||||
UINT8 i,dlstatus = 0;
|
||||
|
||||
for (i = 0; i < fileneedednum; i++)
|
||||
{
|
||||
if (fileneeded[i].status != FS_FOUND && fileneeded[i].status != FS_OPEN)
|
||||
{
|
||||
if (fileneeded[i].willsend == 1)
|
||||
@@ -273,7 +270,6 @@ boolean CL_CheckDownloadable(void)
|
||||
else //if (fileneeded[i].willsend == 2)
|
||||
dlstatus = 2;
|
||||
}
|
||||
}
|
||||
|
||||
// Downloading locally disabled
|
||||
if (!dlstatus && M_CheckParm("-nodownload"))
|
||||
@@ -284,17 +280,15 @@ boolean CL_CheckDownloadable(void)
|
||||
|
||||
// not downloadable, put reason in console
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You need additional files to connect to this server:\n"));
|
||||
|
||||
for (i = 0; i < fileneedednum; i++)
|
||||
{
|
||||
if (fileneeded[i].status != FS_FOUND && fileneeded[i].status != FS_OPEN)
|
||||
{
|
||||
CONS_Printf(" * \"%s\" (%dK)", fileneeded[i].filename, fileneeded[i].totalsize >> 10);
|
||||
|
||||
if (fileneeded[i].status == FS_MD5SUMBAD)
|
||||
CONS_Printf(M_GetText(" wrong version, md5: "));
|
||||
else
|
||||
CONS_Printf(M_GetText(" not found, md5: "));
|
||||
if (fileneeded[i].status == FS_MD5SUMBAD)
|
||||
CONS_Printf(M_GetText(" wrong version, md5: "));
|
||||
else
|
||||
CONS_Printf(M_GetText(" not found, md5: "));
|
||||
|
||||
{
|
||||
INT32 j;
|
||||
@@ -305,7 +299,6 @@ boolean CL_CheckDownloadable(void)
|
||||
}
|
||||
CONS_Printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
switch (dlstatus)
|
||||
{
|
||||
@@ -319,7 +312,6 @@ boolean CL_CheckDownloadable(void)
|
||||
CONS_Printf(M_GetText("All files downloadable, but you have chosen to disable downloading locally.\n"));
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -557,7 +549,7 @@ INT32 CL_CheckFiles(void)
|
||||
if (fileneeded[i].status != FS_OPEN)
|
||||
filestoload++;
|
||||
|
||||
if (fileneeded[i].status != FS_NOTCHECKED) // since we're running this over multiple tics now, its possible for us to come across files checked in previous tics
|
||||
if (fileneeded[i].status != FS_NOTCHECKED) //since we're running this over multiple tics now, its possible for us to come across files checked in previous tics
|
||||
continue;
|
||||
|
||||
CONS_Debug(DBG_NETPLAY, "searching for '%s' ", fileneeded[i].filename);
|
||||
@@ -565,18 +557,14 @@ INT32 CL_CheckFiles(void)
|
||||
// Check in already loaded files
|
||||
for (j = mainwads+1; j < numwadfiles; j++)
|
||||
{
|
||||
if (!memcmp(wadfiles[j]->md5sum, fileneeded[i].md5sum, 16))
|
||||
{
|
||||
strncpy(wadfilename, wadfiles[j]->filename, MAX_WADPATH);
|
||||
wadfilename[MAX_WADPATH-1] = '\0';
|
||||
nameonly(wadfilename);
|
||||
nameonly(strcpy(wadfilename, wadfiles[j]->filename));
|
||||
|
||||
if (fasticmp(wadfilename, fileneeded[i].filename))
|
||||
{
|
||||
CONS_Debug(DBG_NETPLAY, "already loaded\n");
|
||||
fileneeded[i].status = FS_OPEN;
|
||||
return 4;
|
||||
}
|
||||
if (fasticmp(wadfilename, fileneeded[i].filename) &&
|
||||
!memcmp(wadfiles[j]->md5sum, fileneeded[i].md5sum, 16))
|
||||
{
|
||||
CONS_Debug(DBG_NETPLAY, "already loaded\n");
|
||||
fileneeded[i].status = FS_OPEN;
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -657,7 +645,7 @@ boolean CL_LoadServerFiles(void)
|
||||
else
|
||||
{
|
||||
const char *s;
|
||||
switch (fileneeded[i].status)
|
||||
switch(fileneeded[i].status)
|
||||
{
|
||||
case FS_NOTFOUND:
|
||||
s = "FS_NOTFOUND";
|
||||
@@ -700,7 +688,7 @@ static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid)
|
||||
|
||||
char wadfilename[MAX_WADPATH];
|
||||
|
||||
if (cv_noticedownload.value && I_GetNodeAddress)
|
||||
if (cv_noticedownload.value)
|
||||
CONS_Printf("Sending file \"%s\" (id %d) to node %d (%s)\n", filename, fileid, node, I_GetNodeAddress(node));
|
||||
|
||||
// Find the last file in the list and set a pointer to its "next" field
|
||||
@@ -725,9 +713,7 @@ static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid)
|
||||
// Look for the requested file through all loaded files
|
||||
for (wadnum = 0; wadfiles[wadnum]; wadnum++)
|
||||
{
|
||||
// im a certified strlcpy hater
|
||||
strncpy(wadfilename, wadfiles[wadnum]->filename, MAX_WADPATH);
|
||||
wadfilename[MAX_WADPATH-1] = '\0';
|
||||
strlcpy(wadfilename, wadfiles[wadnum]->filename, MAX_WADPATH);
|
||||
nameonly(wadfilename);
|
||||
|
||||
if (fasticmp(wadfilename, p->id.filename))
|
||||
@@ -1080,7 +1066,7 @@ void Got_Filetxpak(void)
|
||||
{
|
||||
const char *s;
|
||||
|
||||
switch (file->status)
|
||||
switch(file->status)
|
||||
{
|
||||
case FS_NOTFOUND:
|
||||
s = "FS_NOTFOUND";
|
||||
@@ -1208,7 +1194,7 @@ filestatus_t checkfilemd5(char *filename, const UINT8 *wantedmd5sum)
|
||||
fhandle = fopen(filename, "rb");
|
||||
if (fhandle)
|
||||
{
|
||||
md5_stream(fhandle, md5sum);
|
||||
md5_stream(fhandle,md5sum);
|
||||
fclose(fhandle);
|
||||
if (!memcmp(wantedmd5sum, md5sum, 16))
|
||||
return FS_FOUND;
|
||||
|
||||
+13
-30
@@ -735,10 +735,6 @@ const char *I_GetJoyName(INT32 joyindex)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void I_SetJoystickFocus(void)
|
||||
{
|
||||
}
|
||||
|
||||
boolean I_GamepadHasLED(INT32 playernum)
|
||||
{
|
||||
(void)playernum;
|
||||
@@ -1023,13 +1019,8 @@ static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_ms
|
||||
sigmsg = ("SIGSEGV - SRB2Kart-Saturn has attempted to access a memory location that it shouldn't and needs to close.");
|
||||
break;
|
||||
#ifdef SIGTERM
|
||||
case SIGTERM: // Software termination signal from terminate
|
||||
sigmsg = ("SIGTERM - SRB2Kart-Saturn was terminated by a terminate signal.");
|
||||
break;
|
||||
#endif
|
||||
#ifdef SIGKILL
|
||||
case SIGKILL: // Software termination signal from kill
|
||||
sigmsg = ("SIGKILL - SRB2Kart-Saturn was terminated by a kill signal.");
|
||||
case SIGTERM: // Software termination signal from kill
|
||||
sigmsg = ("SIGTERM - SRB2Kart-Saturn was terminated by a kill signal.");
|
||||
break;
|
||||
#endif
|
||||
#ifdef SIGBREAK
|
||||
@@ -1362,28 +1353,18 @@ static void I_Fork(void)
|
||||
I_RegisterChildSignals();
|
||||
break;
|
||||
default:
|
||||
// ignore those, those are handled by child process
|
||||
// otherwise parent might exit before it
|
||||
// and the below stuff wont run and your terminal will be left in an awkward state
|
||||
#ifdef SIGINT
|
||||
signal(SIGINT, SIG_IGN);
|
||||
#endif
|
||||
#ifdef SIGBREAK
|
||||
signal(SIGBREAK, SIG_IGN);
|
||||
#endif
|
||||
#ifdef SIGTERM
|
||||
signal(SIGTERM, SIG_IGN);
|
||||
#endif
|
||||
if (logstream)
|
||||
fclose(logstream);/* the child has this */
|
||||
|
||||
c = wait(&status);
|
||||
|
||||
#ifdef LOGMESSAGES
|
||||
/* By the way, exit closes files. */
|
||||
logstream = fopen(logfilename, "at");
|
||||
#else
|
||||
logstream = 0;
|
||||
#endif
|
||||
|
||||
if (c == -1)
|
||||
{
|
||||
kill(child, SIGKILL);
|
||||
@@ -1443,8 +1424,8 @@ void I_Quit(void)
|
||||
/* prevent recursive I_Quit() */
|
||||
if (quiting)
|
||||
goto death;
|
||||
|
||||
quiting = false;
|
||||
I_ShutdownConsole();
|
||||
M_SaveConfig(NULL); //save game config, cvars..
|
||||
D_SaveBan(); // save the ban list
|
||||
G_SaveGameData(false); // Tails 12-08-2002
|
||||
@@ -1460,18 +1441,16 @@ void I_Quit(void)
|
||||
// use this for 1.28 19990220 by Kin
|
||||
I_ShutdownGraphics();
|
||||
I_ShutdownSystem();
|
||||
|
||||
/* if option -noendtxt is set, don't print the text */
|
||||
if (!M_CheckParm("-noendtxt") && W_CheckNumForName("ENDOOM") != LUMPERROR)
|
||||
{
|
||||
printf("\r");
|
||||
ShowEndTxt();
|
||||
}
|
||||
|
||||
if (myargmalloc)
|
||||
free(myargv); // Deallocate allocated memory
|
||||
|
||||
death:
|
||||
W_Shutdown();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@@ -1517,6 +1496,7 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
|
||||
|
||||
I_OutputMsg("SRB2Kart %s Recursive Error", buffer);
|
||||
|
||||
W_Shutdown();
|
||||
exit(-1); // recursive errors detected
|
||||
}
|
||||
}
|
||||
@@ -1534,6 +1514,8 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
|
||||
#endif
|
||||
// ---
|
||||
|
||||
I_ShutdownConsole();
|
||||
|
||||
M_SaveConfig(NULL); // save game config, cvars..
|
||||
D_SaveBan(); // save the ban list
|
||||
G_SaveGameData(false); // Tails 12-08-2002
|
||||
@@ -1549,6 +1531,8 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
|
||||
I_ShutdownGraphics();
|
||||
I_ShutdownSystem();
|
||||
|
||||
W_Shutdown();
|
||||
|
||||
#if defined (PARANOIA) && defined (__CYGWIN__)
|
||||
*(INT32 *)2 = 4; //Alam: Debug!
|
||||
#endif
|
||||
@@ -1654,10 +1638,9 @@ void I_ShutdownSystem(void)
|
||||
{
|
||||
INT32 c;
|
||||
|
||||
#ifdef NEWSIGNALHANDLER
|
||||
if (M_CheckParm("-nofork"))
|
||||
#ifndef NEWSIGNALHANDLER
|
||||
I_ShutdownConsole();
|
||||
#endif
|
||||
I_ShutdownConsole();
|
||||
|
||||
for (c = MAX_QUIT_FUNCS-1; c >= 0; c--)
|
||||
if (quit_funcs[c])
|
||||
|
||||
@@ -115,6 +115,10 @@ INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
||||
return -1;
|
||||
}
|
||||
|
||||
void VID_RefreshModeList(void)
|
||||
{
|
||||
}
|
||||
|
||||
void VID_PrepareModeList(void)
|
||||
{
|
||||
}
|
||||
@@ -125,6 +129,13 @@ INT32 VID_SetMode(INT32 modeNum)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height)
|
||||
{
|
||||
(void)width;
|
||||
(void)height;
|
||||
return false;
|
||||
}
|
||||
|
||||
void I_StartupGraphics(void)
|
||||
{
|
||||
}
|
||||
|
||||
+229
-154
@@ -43,9 +43,6 @@
|
||||
|
||||
#include "m_cond.h"
|
||||
|
||||
// idk how PUSHGETTER works, but this is unused
|
||||
static UINT8 ultimatemode = false;
|
||||
|
||||
#define REQUIRE_MATHLIB_GUID "{748fcbc8-6480-4013-ac4e-7afce6cab766}"
|
||||
|
||||
// Free slot names
|
||||
@@ -283,6 +280,149 @@ static void clear_levels(void)
|
||||
P_AllocMapHeader(gamemap-1);
|
||||
}
|
||||
|
||||
static boolean findFreeSlot(INT32 *num)
|
||||
{
|
||||
// Send the character select entry to a free slot.
|
||||
while (*num < MAXSKINS && PlayerMenu[*num].status != IT_DISABLED)
|
||||
*num = *num+1;
|
||||
|
||||
// No more free slots. :(
|
||||
if (*num >= MAXSKINS)
|
||||
return false;
|
||||
|
||||
// Found one! ^_^
|
||||
return true;
|
||||
}
|
||||
|
||||
// Reads a player.
|
||||
// For modifying the character select screen
|
||||
static void readPlayer(MYFILE *f, INT32 num)
|
||||
{
|
||||
char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL);
|
||||
char *word;
|
||||
char *word2;
|
||||
INT32 i;
|
||||
boolean slotfound = false;
|
||||
|
||||
do
|
||||
{
|
||||
if (myfgets(s, MAXLINELEN, f))
|
||||
{
|
||||
if (s[0] == '\n')
|
||||
break;
|
||||
|
||||
word = strtok(s, " ");
|
||||
if (word)
|
||||
strupr(word);
|
||||
else
|
||||
break;
|
||||
|
||||
if (fastcmp(word, "PLAYERTEXT"))
|
||||
{
|
||||
char *playertext = NULL;
|
||||
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
goto done;
|
||||
PlayerMenu[num].status = IT_CALL;
|
||||
|
||||
// A friendly neighborhood alias for brevity's sake
|
||||
const size_t note_size = sizeof(description[num].notes);
|
||||
|
||||
for (i = 0; i < (INT32)(MAXLINELEN-note_size-3); i++)
|
||||
{
|
||||
if (s[i] == '=')
|
||||
{
|
||||
playertext = &s[i+2];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (playertext)
|
||||
{
|
||||
strlcpy(description[num].notes, playertext, note_size);
|
||||
strlcat(description[num].notes,
|
||||
myhashfgets(playertext, note_size, f), note_size);
|
||||
}
|
||||
else
|
||||
strcpy(description[num].notes, "");
|
||||
|
||||
// For some reason, cutting the string did not work above. Most likely due to strcpy or strcat...
|
||||
// It works down here, though.
|
||||
{
|
||||
INT32 numline = 0;
|
||||
for (i = 0; (size_t)i < note_size-1; i++)
|
||||
{
|
||||
if (numline < 20 && description[num].notes[i] == '\n')
|
||||
numline++;
|
||||
|
||||
if (numline >= 20 || description[num].notes[i] == '\0' || description[num].notes[i] == '#')
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
description[num].notes[strlen(description[num].notes)-1] = '\0';
|
||||
description[num].notes[i] = '\0';
|
||||
continue;
|
||||
}
|
||||
|
||||
word2 = strtok(NULL, " = ");
|
||||
if (word2)
|
||||
strupr(word2);
|
||||
else
|
||||
break;
|
||||
|
||||
if (word2[strlen(word2)-1] == '\n')
|
||||
word2[strlen(word2)-1] = '\0';
|
||||
i = atoi(word2);
|
||||
|
||||
if (fastcmp(word, "PICNAME"))
|
||||
{
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
goto done;
|
||||
PlayerMenu[num].status = IT_CALL;
|
||||
strncpy(description[num].picname, word2, 8);
|
||||
}
|
||||
else if (fastcmp(word, "STATUS"))
|
||||
{
|
||||
// Limit the status to only IT_DISABLED and IT_CALL
|
||||
if (i)
|
||||
i = IT_CALL;
|
||||
else
|
||||
i = IT_DISABLED;
|
||||
|
||||
/*
|
||||
You MAY disable previous entries if you so desire...
|
||||
But try to enable something that's already enabled and you will be sent to a free slot.
|
||||
|
||||
Because of this, you are allowed to edit any previous entrys you like, but only if you
|
||||
signal that you are purposely doing so by disabling and then reenabling the slot.
|
||||
|
||||
... Or use MENUPOSITION first, that works too. Hell, you could edit multiple character
|
||||
slots in a single section that way, due to how SOC editing works.
|
||||
*/
|
||||
if (i != IT_DISABLED && !slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
goto done;
|
||||
PlayerMenu[num].status = (INT16)i;
|
||||
}
|
||||
else if (fastcmp(word, "SKINNAME"))
|
||||
{
|
||||
// Send to free slot.
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
goto done;
|
||||
PlayerMenu[num].status = IT_CALL;
|
||||
|
||||
strlcpy(description[num].skinname, word2, sizeof description[num].skinname);
|
||||
strlwr(description[num].skinname);
|
||||
}
|
||||
else
|
||||
deh_warning("readPlayer %d: unknown word '%s'", num, word);
|
||||
}
|
||||
} while (!myfeof(f)); // finish when the line is empty
|
||||
|
||||
done:
|
||||
Z_Free(s);
|
||||
}
|
||||
|
||||
static int freeslotusage[2][2] = {{0, 0}, {0, 0}}; // [S_, MT_][max, previous .wad's max]
|
||||
|
||||
void DEH_UpdateMaxFreeslots(void)
|
||||
@@ -337,14 +477,12 @@ static void readfreeslots(MYFILE *f)
|
||||
{
|
||||
if (used_spr[(i-SPR_FIRSTFREESLOT)/8] & (1<<(i%8)))
|
||||
{
|
||||
if (!sprnames[i][4] && memcmp(sprnames[i], word, 4) == 0)
|
||||
if (!sprnames[i][4] && memcmp(sprnames[i],word,4)==0)
|
||||
sprnames[i][4] = (char)f->wad;
|
||||
|
||||
continue; // Already allocated, next.
|
||||
}
|
||||
|
||||
// Found a free slot!
|
||||
strncpy(sprnames[i], word, 4);
|
||||
strncpy(sprnames[i],word,4);
|
||||
//sprnames[i][4] = 0;
|
||||
CONS_Printf("Sprite SPR_%s allocated.\n",word);
|
||||
|
||||
@@ -353,26 +491,22 @@ static void readfreeslots(MYFILE *f)
|
||||
used_spr[(i-SPR_FIRSTFREESLOT)/8] |= 1<<(i%8); // Okay, this sprite slot has been named now.
|
||||
break;
|
||||
}
|
||||
|
||||
if (i > SPR_LASTFREESLOT)
|
||||
I_Error("Out of Sprite Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||
}
|
||||
else if (fastcmp(type, "S"))
|
||||
{
|
||||
for (i = 0; i < NUMSTATEFREESLOTS; i++)
|
||||
{
|
||||
if (!FREE_STATES[i])
|
||||
{
|
||||
CONS_Printf("State S_%s allocated.\n", word);
|
||||
if (!FREE_STATES[i]) {
|
||||
CONS_Printf("State S_%s allocated.\n",word);
|
||||
|
||||
LUA_InvalidateMathlibCache(va("S_%s", word));
|
||||
|
||||
FREE_STATES[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
|
||||
strcpy(FREE_STATES[i], word);
|
||||
strcpy(FREE_STATES[i],word);
|
||||
freeslotusage[0][0]++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == NUMSTATEFREESLOTS)
|
||||
I_Error("Out of State Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||
@@ -380,19 +514,16 @@ static void readfreeslots(MYFILE *f)
|
||||
else if (fastcmp(type, "MT"))
|
||||
{
|
||||
for (i = 0; i < NUMMOBJFREESLOTS; i++)
|
||||
{
|
||||
if (!FREE_MOBJS[i])
|
||||
{
|
||||
CONS_Printf("MobjType MT_%s allocated.\n", word);
|
||||
if (!FREE_MOBJS[i]) {
|
||||
CONS_Printf("MobjType MT_%s allocated.\n",word);
|
||||
|
||||
LUA_InvalidateMathlibCache(va("MT_%s", word));
|
||||
|
||||
FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
|
||||
strcpy(FREE_MOBJS[i], word);
|
||||
strcpy(FREE_MOBJS[i],word);
|
||||
freeslotusage[1][0]++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == NUMMOBJFREESLOTS)
|
||||
I_Error("Out of Mobj Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||
@@ -435,11 +566,8 @@ static void readthing(MYFILE *f, INT32 num)
|
||||
strupr(word2);
|
||||
else
|
||||
break;
|
||||
|
||||
const size_t word2len = strlen(word2);
|
||||
|
||||
if (word2[word2len-1] == '\n')
|
||||
word2[word2len-1] = '\0';
|
||||
if (word2[strlen(word2)-1] == '\n')
|
||||
word2[strlen(word2)-1] = '\0';
|
||||
|
||||
if (fastcmp(word, "MAPTHINGNUM") || fastcmp(word, "DOOMEDNUM"))
|
||||
{
|
||||
@@ -746,20 +874,14 @@ static void readlevelheader(MYFILE *f, INT32 num, INT32 wadnum)
|
||||
{
|
||||
UINT16 tol = 0;
|
||||
tmp = strtok(word2,",");
|
||||
|
||||
do {
|
||||
for (i = 0; TYPEOFLEVEL[i].name; i++)
|
||||
{
|
||||
if (fastcmp(tmp, TYPEOFLEVEL[i].name))
|
||||
break;
|
||||
}
|
||||
|
||||
if (!TYPEOFLEVEL[i].name)
|
||||
deh_warning("Level header %d: unknown typeoflevel flag %s\n", num, tmp);
|
||||
|
||||
tol |= TYPEOFLEVEL[i].flag;
|
||||
} while((tmp = strtok(NULL,",")) != NULL);
|
||||
|
||||
mapheaderinfo[num-1]->typeoflevel = tol;
|
||||
}
|
||||
}
|
||||
@@ -1055,11 +1177,8 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
|
||||
else
|
||||
break;
|
||||
|
||||
const size_t word2len = strlen(word2);
|
||||
|
||||
if (word2[word2len-1] == '\n')
|
||||
word2[word2len-1] = '\0';
|
||||
|
||||
if (word2[strlen(word2)-1] == '\n')
|
||||
word2[strlen(word2)-1] = '\0';
|
||||
i = atoi(word2);
|
||||
usi = (UINT16)i;
|
||||
|
||||
@@ -1109,14 +1228,12 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
|
||||
else if (fastcmp(word, "MUSICSLOT"))
|
||||
{
|
||||
i = get_mus(word2, true);
|
||||
|
||||
if (i && i <= 1035)
|
||||
snprintf(cutscenes[num]->scene[scenenum].musswitch, 7, "%sM", G_BuildMapName(i));
|
||||
else if (i && i <= 1050)
|
||||
strncpy(cutscenes[num]->scene[scenenum].musswitch, compat_special_music_slots[i - 1036], 7);
|
||||
else
|
||||
cutscenes[num]->scene[scenenum].musswitch[0] = 0; // becomes empty string
|
||||
|
||||
cutscenes[num]->scene[scenenum].musswitch[6] = 0;
|
||||
}
|
||||
#endif
|
||||
@@ -1521,11 +1638,8 @@ static void readframe(MYFILE *f, INT32 num)
|
||||
strupr(word2);
|
||||
else
|
||||
break;
|
||||
|
||||
const size_t word2len = strlen(word2);
|
||||
|
||||
if (word2[word2len-1] == '\n')
|
||||
word2[word2len-1] = '\0';
|
||||
if (word2[strlen(word2)-1] == '\n')
|
||||
word2[strlen(word2)-1] = '\0';
|
||||
|
||||
if (fastcmp(word1, "SPRITENUMBER") || fastcmp(word1, "SPRITENAME"))
|
||||
{
|
||||
@@ -1854,19 +1968,13 @@ static void readextraemblemdata(MYFILE *f, INT32 num)
|
||||
value = atoi(word2); // used for numerical settings
|
||||
|
||||
if (fastcmp(word, "NAME"))
|
||||
{
|
||||
deh_strlcpy(extraemblems[num-1].name, word2,
|
||||
sizeof (extraemblems[num-1].name), va("Extra emblem %d: name", num));
|
||||
}
|
||||
sizeof (extraemblems[num-1].name), va("Extra emblem %d: name", num));
|
||||
else if (fastcmp(word, "OBJECTIVE"))
|
||||
{
|
||||
deh_strlcpy(extraemblems[num-1].description, word2,
|
||||
sizeof (extraemblems[num-1].description), va("Extra emblem %d: objective", num));
|
||||
}
|
||||
sizeof (extraemblems[num-1].description), va("Extra emblem %d: objective", num));
|
||||
else if (fastcmp(word, "CONDITIONSET"))
|
||||
{
|
||||
extraemblems[num-1].conditionset = (UINT8)value;
|
||||
}
|
||||
else if (fastcmp(word, "SPRITE"))
|
||||
{
|
||||
if (word2[0] >= 'A' && word2[0] <= 'Z')
|
||||
@@ -1938,15 +2046,11 @@ static void readunlockable(MYFILE *f, INT32 num)
|
||||
i = atoi(word2); // used for numerical settings
|
||||
|
||||
if (fastcmp(word, "NAME"))
|
||||
{
|
||||
deh_strlcpy(unlockables[num].name, word2,
|
||||
sizeof (unlockables[num].name), va("Unlockable %d: name", num));
|
||||
}
|
||||
sizeof (unlockables[num].name), va("Unlockable %d: name", num));
|
||||
else if (fastcmp(word, "OBJECTIVE"))
|
||||
{
|
||||
deh_strlcpy(unlockables[num].objective, word2,
|
||||
sizeof (unlockables[num].objective), va("Unlockable %d: objective", num));
|
||||
}
|
||||
sizeof (unlockables[num].objective), va("Unlockable %d: objective", num));
|
||||
else if (fastcmp(word, "SHOWCONDITIONSET"))
|
||||
unlockables[num].showconditionset = (UINT8)i;
|
||||
else if (fastcmp(word, "CONDITIONSET"))
|
||||
@@ -2399,12 +2503,26 @@ static void readmaincfg(MYFILE *f)
|
||||
{
|
||||
flashingtics = (UINT16)get_number(word2);
|
||||
}
|
||||
else if (fastcmp(word, "TAILSFLYTICS"))
|
||||
{
|
||||
tailsflytics = (UINT16)get_number(word2);
|
||||
}
|
||||
else if (fastcmp(word, "UNDERWATERTICS"))
|
||||
{
|
||||
underwatertics = (UINT16)get_number(word2);
|
||||
}
|
||||
else if (fastcmp(word, "SPACETIMETICS"))
|
||||
{
|
||||
spacetimetics = (UINT16)get_number(word2);
|
||||
}
|
||||
else if (fastcmp(word, "EXTRALIFETICS"))
|
||||
{
|
||||
// this modifies player->powers[pw_extralife]
|
||||
// which still has some game behaviour attached to it...
|
||||
extralifetics = (UINT16)get_number(word2);
|
||||
}
|
||||
else if (fastcmp(word, "GAMEOVERTICS"))
|
||||
{
|
||||
gameovertics = get_number(word2);
|
||||
}
|
||||
|
||||
else if (fastcmp(word, "INTROTOPLAY"))
|
||||
{
|
||||
@@ -2428,7 +2546,10 @@ static void readmaincfg(MYFILE *f)
|
||||
if (creditscutscene > 128)
|
||||
creditscutscene = 128;
|
||||
}
|
||||
|
||||
else if (fastcmp(word, "NUMDEMOS"))
|
||||
{
|
||||
numDemos = (UINT8)get_number(word2);
|
||||
}
|
||||
else if (fastcmp(word, "DEMODELAYTIME"))
|
||||
{
|
||||
demoDelayTime = get_number(word2);
|
||||
@@ -2441,6 +2562,10 @@ static void readmaincfg(MYFILE *f)
|
||||
{
|
||||
use1upSound = (UINT8)(value || word2[0] == 'T' || word2[0] == 'Y');
|
||||
}
|
||||
else if (fastcmp(word, "MAXXTRALIFE"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "GAMEDATA"))
|
||||
{
|
||||
// just ignore it but dont throw a warning
|
||||
@@ -2479,30 +2604,6 @@ static void readmaincfg(MYFILE *f)
|
||||
{
|
||||
strlcpy(customversionstring, word2, sizeof (customversionstring));
|
||||
}
|
||||
else if (fastcmp(word, "NUMDEMOS"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "TAILSFLYTICS"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "UNDERWATERTICS"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "SPACETIMETICS"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "GAMEOVERTICS"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "MAXXTRALIFE"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else
|
||||
deh_warning("Maincfg: unknown word '%s'", word);
|
||||
}
|
||||
@@ -2716,7 +2817,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
|
||||
// it doesn't test the version of SRB2 and version of dehacked file
|
||||
dbg_line = -1; // start at -1 so the first line is 0.
|
||||
|
||||
while (!myfeof(f))
|
||||
{
|
||||
char origpos[256];
|
||||
@@ -2744,15 +2844,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
strncpy(origpos, s, size);
|
||||
origpos[size] = '\0';
|
||||
|
||||
if (NULL != (word = strtok(s, " ")))
|
||||
{
|
||||
if (NULL != (word = strtok(s, " "))) {
|
||||
strupr(word);
|
||||
const size_t wordlen = strlen(word);
|
||||
|
||||
if (word[wordlen-1] == '\n')
|
||||
word[wordlen-1] = '\0';
|
||||
if (word[strlen(word)-1] == '\n')
|
||||
word[strlen(word)-1] = '\0';
|
||||
}
|
||||
|
||||
if (word)
|
||||
{
|
||||
if (fastcmp(word, "FREESLOT"))
|
||||
@@ -2773,46 +2869,32 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
// This is not a major mod.
|
||||
continue;
|
||||
}
|
||||
|
||||
word2 = strtok(NULL, " ");
|
||||
|
||||
if (fastcmp(word, "CHARACTER"))
|
||||
{
|
||||
if (word2)
|
||||
{
|
||||
if (word2) {
|
||||
strupr(word2);
|
||||
const size_t wordlen = strlen(word2);
|
||||
|
||||
if (word2[wordlen-1] == '\n')
|
||||
word2[wordlen-1] = '\0';
|
||||
|
||||
if (word2[strlen(word2)-1] == '\n')
|
||||
word2[strlen(word2)-1] = '\0';
|
||||
i = atoi(word2);
|
||||
}
|
||||
else
|
||||
} else
|
||||
i = 0;
|
||||
|
||||
if (i >= 0 && i < 32)
|
||||
ignorelines(f); // unused
|
||||
readPlayer(f, i);
|
||||
else
|
||||
{
|
||||
deh_warning("Character %d out of range (0 - 31)", i);
|
||||
ignorelines(f);
|
||||
}
|
||||
|
||||
// This is not a major mod.
|
||||
continue;
|
||||
}
|
||||
|
||||
if (word2)
|
||||
{
|
||||
strupr(word2);
|
||||
const size_t wordlen = strlen(word2);
|
||||
|
||||
if (word2[wordlen-1] == '\n')
|
||||
word2[wordlen-1] = '\0';
|
||||
|
||||
if (word2[strlen(word2)-1] == '\n')
|
||||
word2[strlen(word2)-1] = '\0';
|
||||
i = atoi(word2);
|
||||
|
||||
if (fastcmp(word, "PATCH"))
|
||||
{
|
||||
// Read patch from spec file.
|
||||
@@ -2823,7 +2905,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
{
|
||||
if (i == 0 && word2[0] != '0') // If word2 isn't a number
|
||||
i = get_mobjtype(word2); // find a thing by name
|
||||
|
||||
if (i < NUMMOBJTYPES && i >= 0)
|
||||
{
|
||||
if (i < (MT_FIRSTFREESLOT+freeslotusage[1][1]))
|
||||
@@ -2871,7 +2952,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
{
|
||||
if (i == 0 && word2[0] != '0') // If word2 isn't a number
|
||||
i = get_state(word2); // find a state by name
|
||||
|
||||
if (i < NUMSTATES && i >= 0)
|
||||
{
|
||||
if (i < (S_FIRSTFREESLOT+freeslotusage[0][1]))
|
||||
@@ -2888,7 +2968,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
{
|
||||
if (i == 0 && word2[0] != '0') // If word2 isn't a number
|
||||
i = get_sfx(word2); // find a sound by name
|
||||
|
||||
if (i < NUMSFX && i >= 0)
|
||||
readsound(f, i, savesfxnames);
|
||||
else
|
||||
@@ -2902,7 +2981,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
{
|
||||
if (i == 0 && word2[0] != '0') // If word2 isn't a number
|
||||
i = get_huditem(word2); // find a huditem by name
|
||||
|
||||
if (i >= 0 && i < NUMHUDITEMS)
|
||||
readhuditem(f, i);
|
||||
else
|
||||
@@ -8138,7 +8216,7 @@ static mobjtype_t get_mobjtype(const char *word)
|
||||
if (*word >= '0' && *word <= '9')
|
||||
return atoi(word);
|
||||
|
||||
if (fastncmp("MT_", word, 3))
|
||||
if (fastncmp("MT_",word,3))
|
||||
word += 3; // take off the MT_
|
||||
|
||||
for (i = 0; i < NUMMOBJFREESLOTS; i++)
|
||||
@@ -8164,7 +8242,7 @@ static statenum_t get_state(const char *word)
|
||||
if (*word >= '0' && *word <= '9')
|
||||
return atoi(word);
|
||||
|
||||
if (fastncmp("S_", word, 2))
|
||||
if (fastncmp("S_",word,2))
|
||||
word += 2; // take off the S_
|
||||
|
||||
for (i = 0; i < NUMSTATEFREESLOTS; i++)
|
||||
@@ -8191,11 +8269,11 @@ static spritenum_t get_sprite(const char *word)
|
||||
if (*word >= '0' && *word <= '9')
|
||||
return atoi(word);
|
||||
|
||||
if (fastncmp("SPR_", word, 4))
|
||||
if (fastncmp("SPR_",word,4))
|
||||
word += 4; // take off the SPR_
|
||||
|
||||
for (i = 0; i < NUMSPRITES; i++)
|
||||
if (!sprnames[i][4] && memcmp(word, sprnames[i], 4) == 0)
|
||||
if (!sprnames[i][4] && memcmp(word,sprnames[i],4) == 0)
|
||||
return i;
|
||||
|
||||
deh_warning("Couldn't find sprite named 'SPR_%s'",word);
|
||||
@@ -8236,15 +8314,14 @@ static UINT16 get_mus(const char *word, UINT8 dehacked_mode)
|
||||
if (!word[2] && toupper(word[0]) >= 'A' && toupper(word[0]) <= 'Z')
|
||||
return (UINT16)M_MapNumber(word[0], word[1]);
|
||||
|
||||
if (fastncmp("MUS_", word, 4))
|
||||
if (fastncmp("MUS_",word,4))
|
||||
word += 4; // take off the MUS_
|
||||
else if (fastncmp("O_", word, 2) || fastncmp("D_", word, 2))
|
||||
else if (fastncmp("O_",word,2) || fastncmp("D_",word,2))
|
||||
word += 2; // take off the O_ or D_
|
||||
|
||||
strncpy(lumptmp, word, 4);
|
||||
lumptmp[3] = 0;
|
||||
|
||||
if (fasticmp("MAP", lumptmp))
|
||||
if (fasticmp("MAP",lumptmp))
|
||||
{
|
||||
word += 3;
|
||||
if (toupper(word[0]) >= 'A' && toupper(word[0]) <= 'Z')
|
||||
@@ -8357,7 +8434,7 @@ static inline int lib_freeslot(lua_State *L)
|
||||
{
|
||||
sfxenum_t sfx;
|
||||
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);
|
||||
|
||||
if (sfx != sfx_None)
|
||||
@@ -8381,10 +8458,8 @@ static inline int lib_freeslot(lua_State *L)
|
||||
{
|
||||
if (!sprnames[j][4] && memcmp(sprnames[j], word, 4) == 0)
|
||||
sprnames[j][4] = wad;
|
||||
|
||||
continue; // Already allocated, next.
|
||||
}
|
||||
|
||||
// Found a free slot!
|
||||
CONS_Printf("Sprite SPR_%s allocated.\n",word);
|
||||
|
||||
@@ -8392,7 +8467,7 @@ static inline int lib_freeslot(lua_State *L)
|
||||
lua_pushfstring(L, "SPR_%s", word);
|
||||
lua_call(L, 1, 0);
|
||||
|
||||
strncpy(sprnames[j], word, 4);
|
||||
strncpy(sprnames[j],word,4);
|
||||
//sprnames[j][4] = 0;
|
||||
used_spr[(j-SPR_FIRSTFREESLOT)/8] |= 1<<(j%8); // Okay, this sprite slot has been named now.
|
||||
lua_pushinteger(L, j);
|
||||
@@ -8410,7 +8485,7 @@ static inline int lib_freeslot(lua_State *L)
|
||||
{
|
||||
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_pushfstring(L, "S_%s", word);
|
||||
@@ -8435,14 +8510,14 @@ static inline int lib_freeslot(lua_State *L)
|
||||
{
|
||||
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_pushfstring(L, "MT_%s", word);
|
||||
lua_call(L, 1, 0);
|
||||
|
||||
FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
|
||||
strcpy(FREE_MOBJS[i], word);
|
||||
strcpy(FREE_MOBJS[i],word);
|
||||
freeslotusage[1][0]++;
|
||||
lua_pushinteger(L, i);
|
||||
r++;
|
||||
@@ -8497,13 +8572,13 @@ FUNCINLINE static ATTRINLINE int lib_getenum(lua_State *L)
|
||||
const char *word;
|
||||
boolean mathlib = lua_toboolean(L, UV_MATHLIB);
|
||||
|
||||
if (lua_type(L, 2) != LUA_TSTRING)
|
||||
if (lua_type(L,2) != LUA_TSTRING)
|
||||
return 0;
|
||||
|
||||
word = lua_tostring(L, 2);
|
||||
word = lua_tostring(L,2);
|
||||
|
||||
/* First check actions, as they can be overridden. */
|
||||
if (!mathlib && fastncmp("A_", word, 2))
|
||||
if (!mathlib && fastncmp("A_",word,2))
|
||||
{
|
||||
char *caps;
|
||||
// Try to get a Lua action first.
|
||||
@@ -8629,7 +8704,6 @@ static int lua_enumlib_mobjtype_get(lua_State *L)
|
||||
{
|
||||
if (!FREE_MOBJS[i])
|
||||
break;
|
||||
|
||||
if (fastcmp(s+3, FREE_MOBJS[i]))
|
||||
{
|
||||
lua_pushinteger(L, MT_FIRSTFREESLOT+i);
|
||||
@@ -8718,29 +8792,30 @@ static int lua_enumlib_sfx_get_ds(lua_State *L)
|
||||
}
|
||||
|
||||
#ifdef MUSICSLOT_COMPATIBILITY
|
||||
static int lua_enumlib_mus_get(lua_State *L)
|
||||
{
|
||||
const char *name = strchr(lua_tostring(L, 1), '_') + 1;
|
||||
int mus = get_mus(name, false);
|
||||
|
||||
if (mus == 0)
|
||||
return 0;
|
||||
static int lua_enumlib_mus_get(lua_State *L)
|
||||
{
|
||||
const char *name = strchr(lua_tostring(L, 1), '_') + 1;
|
||||
int mus = get_mus(name, false);
|
||||
|
||||
lua_pushinteger(L, mus);
|
||||
return 1;
|
||||
}
|
||||
if (mus == 0)
|
||||
return 0;
|
||||
|
||||
static int lua_enumlib_mus_get_mathlib(lua_State *L)
|
||||
{
|
||||
const char *name = strchr(lua_tostring(L, 1), '_') + 1;
|
||||
int mus = get_mus(name, false);
|
||||
lua_pushinteger(L, mus);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (mus == 0)
|
||||
return luaL_error(L, "music '%s' could not be found.\n", lua_tostring(L, 1));
|
||||
static int lua_enumlib_mus_get_mathlib(lua_State *L)
|
||||
{
|
||||
const char *name = strchr(lua_tostring(L, 1), '_') + 1;
|
||||
int mus = get_mus(name, false);
|
||||
|
||||
lua_pushinteger(L, mus);
|
||||
return 1;
|
||||
}
|
||||
if (mus == 0)
|
||||
return luaL_error(L, "music '%s' could not be found.\n", lua_tostring(L, 1));
|
||||
|
||||
lua_pushinteger(L, mus);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int lua_enumlib_power_get(lua_State *L)
|
||||
|
||||
+2
-4
@@ -61,7 +61,7 @@ enum
|
||||
typedef struct
|
||||
{
|
||||
INT16 x, y;
|
||||
} ATTRPACK mapvertex_t;
|
||||
}ATTRPACK mapvertex_t;
|
||||
|
||||
// A SideDef, defining the visual appearance of a wall,
|
||||
// by setting textures and offsets.
|
||||
@@ -81,12 +81,10 @@ typedef struct
|
||||
INT16 flags;
|
||||
INT16 special;
|
||||
INT16 tag;
|
||||
// sidenum[1] will be NO_INDEX if one sided
|
||||
// sidenum[1] will be 0xffff if one sided
|
||||
UINT16 sidenum[2];
|
||||
} ATTRPACK maplinedef_t;
|
||||
|
||||
#define NO_INDEX 0xffff
|
||||
|
||||
//
|
||||
// LineDef attributes.
|
||||
//
|
||||
|
||||
+2
-13
@@ -130,8 +130,8 @@ extern char logfilename[1024];
|
||||
#else
|
||||
#define VERSION 1 // Game version
|
||||
#define SUBVERSION 6 // more precise version number
|
||||
#define VERSIONSTRING "Saturn v9.3"
|
||||
#define VERSIONSTRINGW L"Saturn v9.3"
|
||||
#define VERSIONSTRING "Saturn v9.3 - Testing"
|
||||
#define VERSIONSTRINGW L"Saturn v9.3 - Testing"
|
||||
|
||||
#define SATURN_TESTING // comment out for saturn release builds!
|
||||
|
||||
@@ -602,9 +602,6 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
||||
// None of these that are disabled in the normal build are guaranteed to work perfectly
|
||||
// Compile them at your own risk!
|
||||
|
||||
// undefine to enable fixes and features that are not vanilla compatible
|
||||
#define COMPAT_VANILLA
|
||||
|
||||
//-- SATURN __
|
||||
/// Detect if a client is on Saturn in the clientconfig.
|
||||
/// To seperately allow them to join or block joining from vanilla clients.
|
||||
@@ -669,14 +666,6 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
||||
#undef UPDATE_ALERT
|
||||
#endif
|
||||
|
||||
// overwrite some of those
|
||||
// when not compiling in vanilla compat mode
|
||||
#ifndef COMPAT_VANILLA
|
||||
#define SATURNJOIN
|
||||
#define SATURNPAK
|
||||
#undef SEENAMES
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
+7
-1
@@ -54,6 +54,7 @@ extern INT16 maptol;
|
||||
extern UINT8 globalweather;
|
||||
extern INT32 curWeather;
|
||||
extern INT32 cursaveslot;
|
||||
extern INT16 lastmapsaved;
|
||||
extern boolean gamecomplete;
|
||||
|
||||
#define PRECIP_NONE 0
|
||||
@@ -77,6 +78,7 @@ extern boolean imcontinuing; // Temporary flag while continuing
|
||||
extern UINT8 modeattacking;
|
||||
|
||||
// menu demo things
|
||||
extern UINT8 numDemos;
|
||||
extern UINT32 demoDelayTime;
|
||||
extern UINT32 demoIdleTime;
|
||||
|
||||
@@ -112,8 +114,8 @@ extern UINT8 paused; // Game paused?
|
||||
extern UINT8 window_notinfocus; // are we in focus? (backend independant -- handles auto pausing and display of "focus lost" message)
|
||||
|
||||
extern boolean nodrawers;
|
||||
extern boolean noblit;
|
||||
extern boolean lastdraw;
|
||||
extern boolean intermissionbginit;
|
||||
|
||||
#ifdef MOTIONBLUR
|
||||
extern INT32 postimgparam[MAXSPLITSCREENPLAYERS];
|
||||
@@ -400,6 +402,9 @@ extern boolean CheckForReverseGravity;
|
||||
extern UINT16 invulntics;
|
||||
extern UINT16 sneakertics;
|
||||
extern UINT16 flashingtics;
|
||||
extern UINT16 tailsflytics;
|
||||
extern UINT16 underwatertics;
|
||||
extern UINT16 spacetimetics;
|
||||
extern UINT16 extralifetics;
|
||||
|
||||
// SRB2kart
|
||||
@@ -485,6 +490,7 @@ extern UINT32 timesBeatenWithEmeralds;
|
||||
// WAD, partly set at startup time.
|
||||
|
||||
extern tic_t gametic;
|
||||
#define localgametic leveltime
|
||||
|
||||
// Player spawn spots.
|
||||
extern mapthing_t *playerstarts[MAXPLAYERS]; // Cooperative
|
||||
|
||||
@@ -1110,6 +1110,14 @@ void F_TitleScreenTicker(boolean run)
|
||||
return;
|
||||
}
|
||||
|
||||
// Replay intro when done cycling through demos
|
||||
/*if (curDemo == numDemos) -- uuuh... we have a LOT of maps AND a big devteam... probably not gonna see a repeat unless you're super unlucky :V
|
||||
{
|
||||
curDemo = 0;
|
||||
F_StartIntro();
|
||||
return;
|
||||
}*/
|
||||
|
||||
mapname = G_BuildMapName(G_RandMap(TOL_RACE, -2, false, 0, false, NULL)+1);
|
||||
|
||||
numstaff = 1;
|
||||
|
||||
+4
-1
@@ -361,7 +361,10 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
|
||||
// on for fade-to-black
|
||||
for (;;)
|
||||
{
|
||||
I_HandleInterrupt();
|
||||
if (I_Interrupted())
|
||||
{
|
||||
I_Quit();
|
||||
}
|
||||
|
||||
// get fademask first so we can tell if it exists or not
|
||||
fmask = F_GetFadeMask(wipetype, wipeframe++);
|
||||
|
||||
+13
-12
@@ -66,10 +66,12 @@
|
||||
#include <locale.h>
|
||||
|
||||
// menu demo things
|
||||
UINT8 numDemos = 0; //3; -- i'm FED UP of losing my skincolour to a broken demo. change this back when we make new ones
|
||||
UINT32 demoDelayTime = 15*TICRATE;
|
||||
UINT32 demoIdleTime = 3*TICRATE;
|
||||
|
||||
boolean nodrawers = false; // for comparative timing purposes
|
||||
boolean noblit = false; // for comparative timing purposes
|
||||
static tic_t demostarttime; // for comparative timing purposes
|
||||
|
||||
//@TODO put these all in a struct for namespacing purposes?
|
||||
@@ -515,49 +517,49 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
||||
|
||||
if (cmd->forwardmove != oldcmd[playernum].forwardmove)
|
||||
{
|
||||
WRITEUINT8(demobuf.p, cmd->forwardmove);
|
||||
WRITEUINT8(demobuf.p,cmd->forwardmove);
|
||||
oldcmd[playernum].forwardmove = cmd->forwardmove;
|
||||
ziptic |= ZT_FWD;
|
||||
}
|
||||
|
||||
if (cmd->sidemove != oldcmd[playernum].sidemove)
|
||||
{
|
||||
WRITEUINT8(demobuf.p, cmd->sidemove);
|
||||
WRITEUINT8(demobuf.p,cmd->sidemove);
|
||||
oldcmd[playernum].sidemove = cmd->sidemove;
|
||||
ziptic |= ZT_SIDE;
|
||||
}
|
||||
|
||||
if (cmd->angleturn != oldcmd[playernum].angleturn)
|
||||
{
|
||||
WRITEINT16(demobuf.p, cmd->angleturn);
|
||||
WRITEINT16(demobuf.p,cmd->angleturn);
|
||||
oldcmd[playernum].angleturn = cmd->angleturn;
|
||||
ziptic |= ZT_ANGLE;
|
||||
}
|
||||
|
||||
if (cmd->buttons != oldcmd[playernum].buttons)
|
||||
{
|
||||
WRITEUINT16(demobuf.p, cmd->buttons);
|
||||
WRITEUINT16(demobuf.p,cmd->buttons);
|
||||
oldcmd[playernum].buttons = cmd->buttons;
|
||||
ziptic |= ZT_BUTTONS;
|
||||
}
|
||||
|
||||
if (cmd->aiming != oldcmd[playernum].aiming)
|
||||
{
|
||||
WRITEINT16(demobuf.p, cmd->aiming);
|
||||
WRITEINT16(demobuf.p,cmd->aiming);
|
||||
oldcmd[playernum].aiming = cmd->aiming;
|
||||
ziptic |= ZT_AIMING;
|
||||
}
|
||||
|
||||
if (cmd->driftturn != oldcmd[playernum].driftturn)
|
||||
{
|
||||
WRITEINT16(demobuf.p, cmd->driftturn);
|
||||
WRITEINT16(demobuf.p,cmd->driftturn);
|
||||
oldcmd[playernum].driftturn = cmd->driftturn;
|
||||
ziptic |= ZT_DRIFT;
|
||||
}
|
||||
|
||||
if (cmd->latency != oldcmd[playernum].latency)
|
||||
{
|
||||
WRITEUINT8(demobuf.p, cmd->latency);
|
||||
WRITEUINT8(demobuf.p,cmd->latency);
|
||||
oldcmd[playernum].latency = cmd->latency;
|
||||
ziptic |= ZT_LATENCY;
|
||||
}
|
||||
@@ -726,8 +728,8 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum)
|
||||
|
||||
// GZT_XYZ is only useful if you've moved 256 FRACUNITS or more in a single tic.
|
||||
if (abs(ghost->x-oldghost[playernum].x) > MAXMOM
|
||||
|| abs(ghost->y-oldghost[playernum].y) > MAXMOM
|
||||
|| abs(ghost->z-oldghost[playernum].z) > MAXMOM
|
||||
|| abs(ghost->y-oldghost[playernum].y) > MAXMOM
|
||||
|| abs(ghost->z-oldghost[playernum].z) > MAXMOM
|
||||
|| ((UINT8)(leveltime & 255) > 0 && (UINT8)(leveltime & 255) <= (UINT8)cv_netdemosyncquality.value)) // Hack to enable slightly nicer resyncing
|
||||
{
|
||||
oldghost[playernum].x = ghost->x;
|
||||
@@ -1375,7 +1377,7 @@ fadeghost:
|
||||
UINT16 i, health;
|
||||
UINT16 count = READUINT16(g->p);
|
||||
//UINT32 type;
|
||||
fixed_t x, y, z;
|
||||
fixed_t x,y,z;
|
||||
angle_t angle;
|
||||
mobj_t *poof;
|
||||
|
||||
@@ -3510,11 +3512,10 @@ static INT32 restorecv_vidwait;
|
||||
void G_TimeDemo(const char *name)
|
||||
{
|
||||
nodrawers = M_CheckParm("-nodraw");
|
||||
|
||||
noblit = M_CheckParm("-noblit");
|
||||
restorecv_vidwait = cv_vidwait.value;
|
||||
if (cv_vidwait.value)
|
||||
CV_Set(&cv_vidwait, "0");
|
||||
|
||||
demo.timing = true;
|
||||
singletics = true;
|
||||
framecount = 0;
|
||||
|
||||
+34
-17
@@ -61,11 +61,14 @@
|
||||
|
||||
gameaction_t gameaction = 0;
|
||||
gamestate_t gamestate = GS_NULL;
|
||||
UINT8 ultimatemode = false;
|
||||
|
||||
boolean botingame = false;
|
||||
UINT8 botskin = 0;
|
||||
UINT8 botcolor = 0;
|
||||
|
||||
JoyType_t Joystick[MAXSPLITSCREENPLAYERS] = {};
|
||||
|
||||
// SRB2kart
|
||||
char gamedatafilename[64] = "kartdata.dat";
|
||||
char timeattackfolder[64] = "kart";
|
||||
@@ -84,6 +87,7 @@ INT16 maptol = 0;
|
||||
UINT8 globalweather = 0;
|
||||
INT32 curWeather = PRECIP_NONE;
|
||||
INT32 cursaveslot = -1; // Auto-save 1p savegame slot
|
||||
INT16 lastmapsaved = 0; // Last map we auto-saved at
|
||||
boolean gamecomplete = false;
|
||||
|
||||
UINT16 mainwads = 0;
|
||||
@@ -104,6 +108,7 @@ INT32 consoleplayer = 0; // player taking events and displaying
|
||||
INT32 displayplayers[MAXSPLITSCREENPLAYERS] = {}; // view being displayed
|
||||
|
||||
tic_t gametic = 0;
|
||||
tic_t levelstarttic = 0; // gametic at level start
|
||||
UINT32 totalrings = 0; // for intermission
|
||||
INT16 lastmap = 0; // last level you were at (returning from special stages)
|
||||
tic_t timeinmap = 0; // Ticker for time spent in level (used for levelcard display)
|
||||
@@ -181,6 +186,9 @@ boolean CheckForReverseGravity = false;
|
||||
UINT16 invulntics = 20*TICRATE;
|
||||
UINT16 sneakertics = 20*TICRATE;
|
||||
UINT16 flashingtics = 3*TICRATE/2; // SRB2kart
|
||||
UINT16 tailsflytics = 8*TICRATE;
|
||||
UINT16 underwatertics = 30*TICRATE;
|
||||
UINT16 spacetimetics = 11*TICRATE + (TICRATE/2);
|
||||
UINT16 extralifetics = 4*TICRATE;
|
||||
|
||||
// SRB2kart
|
||||
@@ -198,6 +206,8 @@ const INT32 wipeoutslowtime = 20;
|
||||
const INT32 wantedreduce = 5*TICRATE;
|
||||
const INT32 wantedfrequency = 10*TICRATE;
|
||||
|
||||
INT32 gameovertics = 15*TICRATE;
|
||||
|
||||
UINT8 use1upSound = 0;
|
||||
|
||||
UINT8 introtoplay = 0;
|
||||
@@ -753,7 +763,7 @@ INT32 JoyAxis(axis_input_e axissel, UINT8 player)
|
||||
if (retaxis > (+JOYAXISRANGE))
|
||||
retaxis = +JOYAXISRANGE;
|
||||
|
||||
if (!DigitalGamepadStyle(pnum) && axissel < AXISDEAD)
|
||||
if (!Joystick[pnum].bGamepadStyle && axissel < AXISDEAD)
|
||||
{
|
||||
const INT32 jdeadzone = ((JOYAXISRANGE-1) * deadzone) >> FRACBITS;
|
||||
|
||||
@@ -801,8 +811,8 @@ static void G_HandleLocalDriftturn(ticcmd_t *cmd, UINT8 ssplayer)
|
||||
|
||||
const UINT8 forplayer = (ssplayer-1);
|
||||
|
||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !DigitalGamepadStyle(forplayer);
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && DigitalGamepadStyle(forplayer);
|
||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle;
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle;
|
||||
|
||||
turnright = InputDown(gc_turnright, ssplayer);
|
||||
turnleft = InputDown(gc_turnleft, ssplayer);
|
||||
@@ -990,7 +1000,10 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||
player_t *player = P_GetLocalPlayerForNum(forplayer);
|
||||
|
||||
camera_t *thiscam = &camera[forplayer];
|
||||
const boolean freecam = thiscam->freecam;
|
||||
const boolean freecam = camera[forplayer].freecam;
|
||||
|
||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle;
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle;
|
||||
|
||||
lang = localangle[forplayer];
|
||||
laim = localaiming[forplayer];
|
||||
@@ -1022,9 +1035,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||
return;
|
||||
}
|
||||
|
||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !DigitalGamepadStyle(forplayer);
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && DigitalGamepadStyle(forplayer);
|
||||
|
||||
usejoystick = (analogjoystickmove || gamepadjoystickmove);
|
||||
turnright = InputDown(gc_turnright, ssplayer);
|
||||
turnleft = InputDown(gc_turnleft, ssplayer);
|
||||
@@ -1288,6 +1298,8 @@ static void G_DoLoadLevel(boolean resetplayer)
|
||||
// Make sure objectplace is OFF when you first start the level!
|
||||
OP_ResetObjectplace();
|
||||
|
||||
levelstarttic = gametic; // for time calculation
|
||||
|
||||
if (wipegamestate == GS_LEVEL)
|
||||
wipegamestate = -1; // force a wipe
|
||||
|
||||
@@ -1309,7 +1321,6 @@ static void G_DoLoadLevel(boolean resetplayer)
|
||||
{
|
||||
// fail so reset game stuff
|
||||
Command_ExitGame_f();
|
||||
P_FreeCorruptMapWarnings();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1343,8 +1354,6 @@ static void G_DoLoadLevel(boolean resetplayer)
|
||||
|
||||
// clear hud messages remains (usually from game startup)
|
||||
CON_ClearHUD();
|
||||
// print any map errors now due to clearhud above :chaosleep:
|
||||
P_PrintCorruptMapWarnings();
|
||||
|
||||
server_lagless = !cv_gentlemens.value;
|
||||
|
||||
@@ -3344,6 +3353,18 @@ static void G_DoStartVote(void)
|
||||
gameaction = ga_nothing;
|
||||
}
|
||||
|
||||
//
|
||||
// G_UseContinue
|
||||
//
|
||||
void G_UseContinue(void)
|
||||
{
|
||||
if (gamestate == GS_LEVEL && !netgame && !multiplayer)
|
||||
{
|
||||
gameaction = ga_startcont;
|
||||
lastdraw = true;
|
||||
}
|
||||
}
|
||||
|
||||
static void G_DoStartContinue(void)
|
||||
{
|
||||
I_Assert(!netgame && !multiplayer);
|
||||
@@ -3382,7 +3403,7 @@ static void G_DoContinued(void)
|
||||
token = 0;
|
||||
|
||||
// Reset # of lives
|
||||
pl->lives = 3;
|
||||
pl->lives = (ultimatemode) ? 1 : 3;
|
||||
|
||||
D_MapChange(gamemap, gametype, false, false, 0, false, false);
|
||||
|
||||
@@ -4090,7 +4111,6 @@ char *G_BuildMapTitle(INT32 mapnum)
|
||||
const char *actnum = NULL;
|
||||
|
||||
len += strlen(mapheaderinfo[mapnum-1]->lvlttl);
|
||||
|
||||
if (strlen(mapheaderinfo[mapnum-1]->zonttl) > 0)
|
||||
{
|
||||
zonetext = M_GetText(mapheaderinfo[mapnum-1]->zonttl);
|
||||
@@ -4101,7 +4121,6 @@ char *G_BuildMapTitle(INT32 mapnum)
|
||||
zonetext = M_GetText("Zone");
|
||||
len += strlen(zonetext) + 1; // ' ' + zonetext
|
||||
}
|
||||
|
||||
if (strlen(mapheaderinfo[mapnum-1]->actnum) > 0)
|
||||
{
|
||||
actnum = M_GetText(mapheaderinfo[mapnum-1]->actnum);
|
||||
@@ -4115,10 +4134,8 @@ char *G_BuildMapTitle(INT32 mapnum)
|
||||
|
||||
sprintf(title, "%s", mapheaderinfo[mapnum-1]->lvlttl);
|
||||
|
||||
if (zonetext)
|
||||
sprintf(title + strlen(title), " %s", zonetext);
|
||||
if (actnum)
|
||||
sprintf(title + strlen(title), " %s", actnum);
|
||||
if (zonetext) sprintf(title + strlen(title), " %s", zonetext);
|
||||
if (actnum) sprintf(title + strlen(title), " %s", actnum);
|
||||
}
|
||||
|
||||
return title;
|
||||
|
||||
@@ -39,8 +39,12 @@ extern INT32 player_name_changes[MAXPLAYERS];
|
||||
extern player_t players[MAXPLAYERS];
|
||||
extern boolean playeringame[MAXPLAYERS];
|
||||
|
||||
// gametic at level start
|
||||
extern tic_t levelstarttic;
|
||||
|
||||
// for modding?
|
||||
extern INT16 prevmap, nextmap;
|
||||
extern INT32 gameovertics;
|
||||
extern tic_t timeinmap; // Ticker for time spent in level (used for levelcard display)
|
||||
extern INT16 rw_maximums[NUM_WEAPONS];
|
||||
|
||||
@@ -248,6 +252,7 @@ UINT8 G_GetGametypeColor(INT16 gt);
|
||||
void G_ExitLevel(void);
|
||||
void G_NextLevel(void);
|
||||
void G_Continue(void);
|
||||
void G_UseContinue(void);
|
||||
void G_AfterIntermission(void);
|
||||
void G_EndGame(void); // moved from y_inter.c/h and renamed
|
||||
|
||||
|
||||
@@ -81,7 +81,6 @@ consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS] = {
|
||||
{"gamepadled4", "Skincolor", CV_SAVE|CV_CALL|CV_NOINIT, gamepadled_cons_t, led_off_handle4, 0, NULL, NULL, 0, 0, NULL}
|
||||
};
|
||||
|
||||
consvar_t cv_gamepadifunfocused = {"gamepadunfocused", "Off", CV_SAVE|CV_CALL, CV_OnOff, I_SetJoystickFocus, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_gamepadledifunfocused = {"gamepadledunfocused", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_rumbleifunfocused = {"rumbleifunfocused", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
|
||||
@@ -116,7 +116,6 @@ extern consvar_t cv_rumble[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
|
||||
|
||||
extern consvar_t cv_gamepadifunfocused;
|
||||
extern consvar_t cv_gamepadledifunfocused;
|
||||
extern consvar_t cv_rumbleifunfocused;
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@ typedef enum
|
||||
} gameaction_t;
|
||||
|
||||
extern gamestate_t gamestate;
|
||||
extern UINT8 ultimatemode; // was sk_insane
|
||||
extern gameaction_t gameaction;
|
||||
|
||||
extern boolean botingame;
|
||||
|
||||
@@ -373,7 +373,7 @@ static poly_t *CutOutSubsecPoly(seg_t *lseg, INT32 count, poly_t *poly)
|
||||
if (!gl_maphashorizonlines && line->special == HORIZONSPECIAL)
|
||||
gl_maphashorizonlines = true;
|
||||
|
||||
if (line->sidenum[1] != NO_INDEX)
|
||||
if (line->sidenum[1] != 0xffff)
|
||||
{
|
||||
if (sides[line->sidenum[0]].sector == sides[line->sidenum[1]].sector)
|
||||
{
|
||||
|
||||
+5
-10
@@ -446,7 +446,7 @@ typedef struct
|
||||
} GLMapTextureSet_t; // idk i suck at naming things
|
||||
|
||||
static size_t gl_numtextures = 0; // Texture count
|
||||
static GLMapTextureSet_t *gl_textures = NULL; // For all textures
|
||||
static GLMapTextureSet_t *gl_textures; // For all textures
|
||||
|
||||
static void HWR_FreeTextureData(patch_t *patch)
|
||||
{
|
||||
@@ -570,8 +570,7 @@ void HWR_ClearAllTextures(void)
|
||||
/*static void HWR_FreeColormapCache(void)
|
||||
{
|
||||
HWR_FreePatchCache(false);
|
||||
}
|
||||
*/
|
||||
}*/
|
||||
|
||||
void HWR_InitMapTextures(void)
|
||||
{
|
||||
@@ -623,12 +622,10 @@ static void HWR_PrecacheLevelFlats(void)
|
||||
{
|
||||
// lookup for flats that may´ve been already loaded
|
||||
flatcheck flatpresent;
|
||||
flatcheck_init(&flatpresent);
|
||||
size_t i, j;
|
||||
INT32 k;
|
||||
|
||||
flatcheck_init(&flatpresent);
|
||||
flatcheck_reserve(&flatpresent, numlevelflats);
|
||||
|
||||
// special case for encore
|
||||
#ifdef GLENCORE
|
||||
if (encoremap)
|
||||
@@ -729,7 +726,7 @@ static void HWR_PrecacheLevelTextures(void)
|
||||
for (j = 0; j < 2; j++)
|
||||
{
|
||||
// check if single-sided linedef
|
||||
if (line->sidenum[j] == NO_INDEX)
|
||||
if (line->sidenum[j] == 0xffff)
|
||||
continue;
|
||||
|
||||
const side_t *side = &sides[line->sidenum[j]];
|
||||
@@ -992,6 +989,7 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum)
|
||||
|
||||
flat[steppy] = glMipmap->colormap->source[flat[steppy]];
|
||||
}
|
||||
#endif
|
||||
|
||||
if (haschromakey)
|
||||
{
|
||||
@@ -1003,7 +1001,6 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum)
|
||||
glMipmap->flags &= ~TF_CHROMAKEYED;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Download a Doom 'flat' to the hardware cache and make it ready for use
|
||||
@@ -1130,9 +1127,7 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
|
||||
HWR_UpdatePatchMipmap(patch, glMipmap);
|
||||
}
|
||||
else
|
||||
{
|
||||
HWR_LoadPatchMipmap(patch, glMipmap);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -319,17 +319,16 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
|
||||
double clipfov;
|
||||
double floatangle;
|
||||
angle_t a1;
|
||||
float tilt;
|
||||
|
||||
float tilt = fabsf(((float)(int)tiltangle) / (float)ANG1);
|
||||
|
||||
if (tilt > 90.0f)
|
||||
tilt = 90.0f;
|
||||
|
||||
// If the pitch is larger than this you can look all around at a FOV of 90
|
||||
if (abs((signed)tiltangle) > 46 * ANG1)
|
||||
return 0xffffffff;
|
||||
|
||||
tilt = fabsf(((float)(int)tiltangle) / (float)ANG1);
|
||||
|
||||
if (tilt > 90.0f)
|
||||
tilt = 90.0f;
|
||||
|
||||
// ok, this is a gross hack that barely works...
|
||||
// but at least it doesn't overestimate too much...
|
||||
clipfov = atan(1 / (GLdouble)projMatrix[0]) * 360.0 / M_PI;
|
||||
|
||||
+18
-22
@@ -32,6 +32,20 @@
|
||||
|
||||
#include <fcntl.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UINT8 id_field_length ; // 1
|
||||
UINT8 color_map_type ; // 2
|
||||
UINT8 image_type ; // 3
|
||||
UINT8 dummy[5] ; // 4, 8
|
||||
INT16 x_origin ; // 9, 10
|
||||
INT16 y_origin ; //11, 12
|
||||
INT16 width ; //13, 14
|
||||
INT16 height ; //15, 16
|
||||
UINT8 image_pix_size ; //17
|
||||
UINT8 image_descriptor; //18
|
||||
} ATTRPACK TGAHeader; // sizeof is 18
|
||||
|
||||
static const UINT8 softwaretranstogl[11] = { 0, 25, 51, 76,102,127,153,178,204,229,255};
|
||||
static const UINT8 softwaretranstogl_hi[11] = { 0, 51,102,153,204,255,255,255,255,255,255};
|
||||
static const UINT8 softwaretranstogl_lo[11] = { 0, 12, 24, 36, 48, 60, 71, 83, 95,111,127};
|
||||
@@ -43,7 +57,8 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
|
||||
{
|
||||
FOutVector v[4];
|
||||
FBITFIELD flags;
|
||||
float cx, cy;
|
||||
float cx = FIXED_TO_FLOAT(x);
|
||||
float cy = FIXED_TO_FLOAT(y);
|
||||
UINT8 alphalevel = ((option & V_ALPHAMASK) >> V_ALPHASHIFT);
|
||||
UINT8 blendmode = ((bflags & V_BLENDMASK) >> V_BLENDSHIFT);
|
||||
GLPatch_t *hwrPatch;
|
||||
@@ -57,9 +72,6 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
|
||||
if (alphalevel >= 10 && alphalevel < 13)
|
||||
return;
|
||||
|
||||
cx = FIXED_TO_FLOAT(x);
|
||||
cy = FIXED_TO_FLOAT(y);
|
||||
|
||||
const float fvw = (float)vid.width;
|
||||
const float fvh = (float)vid.height;
|
||||
|
||||
@@ -232,7 +244,8 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
||||
{
|
||||
FOutVector v[4];
|
||||
FBITFIELD flags;
|
||||
float cx, cy;
|
||||
float cx = FIXED_TO_FLOAT(x);
|
||||
float cy = FIXED_TO_FLOAT(y);
|
||||
UINT8 alphalevel = ((option & V_ALPHAMASK) >> V_ALPHASHIFT);
|
||||
GLPatch_t *hwrPatch;
|
||||
|
||||
@@ -245,9 +258,6 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
||||
if (alphalevel >= 10 && alphalevel < 13)
|
||||
return;
|
||||
|
||||
cx = FIXED_TO_FLOAT(x);
|
||||
cy = FIXED_TO_FLOAT(y);
|
||||
|
||||
const float fvw = (float)vid.width;
|
||||
const float fvh = (float)vid.height;
|
||||
|
||||
@@ -954,20 +964,6 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
|
||||
#endif
|
||||
|
||||
#ifndef USE_PNG
|
||||
typedef struct
|
||||
{
|
||||
UINT8 id_field_length ; // 1
|
||||
UINT8 color_map_type ; // 2
|
||||
UINT8 image_type ; // 3
|
||||
UINT8 dummy[5] ; // 4, 8
|
||||
INT16 x_origin ; // 9, 10
|
||||
INT16 y_origin ; //11, 12
|
||||
INT16 width ; //13, 14
|
||||
INT16 height ; //15, 16
|
||||
UINT8 image_pix_size ; //17
|
||||
UINT8 image_descriptor; //18
|
||||
} ATTRPACK TGAHeader; // sizeof is 18
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// save screenshots with TGA format
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
@@ -32,12 +32,8 @@ void GL_SetSpecialState(hwdspecialstate_t IdState, INT32 Value);
|
||||
void GL_SetTransform(FTransform *stransform);
|
||||
void GL_SetBlend(FBITFIELD PolyFlags);
|
||||
void GL_SetPalette(RGBA_t *palette);
|
||||
|
||||
void GL_ClearBuffer(FBOOLEAN ColorMask, FBOOLEAN DepthMask, FBOOLEAN StencilMask, FRGBAFloat * ClearColor);
|
||||
|
||||
void GL_EnableStencilTest(void);
|
||||
void GL_DisableStencilTest(void);
|
||||
|
||||
void GL_DrawPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags);
|
||||
void GL_DrawIndexedTriangles(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags, unsigned int *IndexArray);
|
||||
void GL_Draw2DLine(F2DCoord *v1, F2DCoord *v2, RGBA_t Color);
|
||||
@@ -67,7 +63,7 @@ void GL_FlushScreenTextures(void);
|
||||
void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags);
|
||||
void GL_DoScreenWipe(int wipeStart, int wipeEnd);
|
||||
void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8 downdistort, UINT8 barsize);
|
||||
void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height);
|
||||
void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean useshader);
|
||||
|
||||
void GL_PostImgRedraw(float points[SCREENVERTS][SCREENVERTS][2]);
|
||||
|
||||
@@ -76,7 +72,6 @@ void GL_LoadShader(int slot, char *code, hwdshaderstage_t stage);
|
||||
boolean GL_CompileShader(int slot);
|
||||
void GL_SetShader(int slot);
|
||||
void GL_UnSetShader(void);
|
||||
void GL_EnableShader(void);
|
||||
|
||||
void GL_SetShaderInfo(hwdshaderinfo_t info, INT32 value);
|
||||
|
||||
|
||||
@@ -34,8 +34,8 @@ typedef struct gl_vissprite_s
|
||||
float gz, gzt;
|
||||
float tz;
|
||||
float scale;
|
||||
//float spritexscale, spriteyscale;
|
||||
//float spritexoffset, spriteyoffset;
|
||||
float spritexscale, spriteyscale;
|
||||
float spritexoffset, spriteyoffset;
|
||||
patch_t *gpatch;
|
||||
boolean flip;
|
||||
UINT8 translucency; //alpha level 0-255
|
||||
|
||||
+461
-295
File diff suppressed because it is too large.
Load diff
@@ -102,7 +102,7 @@ void HWR_SetViewSize(void);
|
||||
void HWR_AddCommands(void);
|
||||
|
||||
void HWR_RenderPlayerView(void);
|
||||
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, int stencil_level);
|
||||
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, int stencil_level, boolean allow_portals);
|
||||
|
||||
void HWR_ClearSkyDome(void);
|
||||
void HWR_BuildSkyDome(void);
|
||||
@@ -151,19 +151,14 @@ FUNCINLINE static ATTRINLINE void HWR_RenderVhsEffect(fixed_t upbary, fixed_t do
|
||||
GL_RenderVhsEffect(upbary, downbary, updistort, downdistort, barsize);
|
||||
}
|
||||
|
||||
FUNCINLINE static ATTRINLINE void HWR_MakeScreenTexture(void)
|
||||
{
|
||||
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC1);
|
||||
}
|
||||
|
||||
FUNCINLINE static ATTRINLINE void HWR_MakeScreenFinalTexture(void)
|
||||
{
|
||||
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC2);
|
||||
}
|
||||
|
||||
FUNCINLINE static ATTRINLINE void HWR_DrawScreenFinalTexture(INT32 width, INT32 height)
|
||||
FUNCINLINE static ATTRINLINE void HWR_DrawScreenFinalTexture(INT32 width, INT32 height, boolean useshader)
|
||||
{
|
||||
GL_DrawScreenFinalTexture(HWD_SCREENTEXTURE_GENERIC2, width, height);
|
||||
GL_DrawScreenFinalTexture(HWD_SCREENTEXTURE_GENERIC2, width, height, useshader);
|
||||
}
|
||||
|
||||
// hw_main.c: Segs
|
||||
|
||||
@@ -154,7 +154,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
||||
char *buffer;
|
||||
int surfEnd;
|
||||
int i, t;
|
||||
//int matCount;
|
||||
int matCount;
|
||||
FILE *f;
|
||||
|
||||
if (!latlnginit)
|
||||
@@ -227,7 +227,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
||||
|
||||
retModel->meshes = (mesh_t*)Z_Calloc(sizeof(mesh_t)*retModel->numMeshes, ztag, NULL);
|
||||
|
||||
//matCount = 0;
|
||||
matCount = 0;
|
||||
for (i = 0, surfEnd = 0; i < mdh->numSurfaces; i++)
|
||||
{
|
||||
int j;
|
||||
@@ -237,7 +237,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
||||
|
||||
mdShader = (md3Shader*)((char*)mdS + mdS->offsetShaders);
|
||||
|
||||
for (j = 0; j < mdS->numShaders; j++ /*, matCount++*/)
|
||||
for (j = 0; j < mdS->numShaders; j++, matCount++)
|
||||
{
|
||||
size_t len = strlen(mdShader[j].name);
|
||||
mdShader[j].name[len-1] = 'z';
|
||||
@@ -503,6 +503,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
free(buffer);
|
||||
|
||||
return retModel;
|
||||
|
||||
@@ -80,8 +80,8 @@ void HWR_Portal_Add2Lines(const INT32 line1, const INT32 line2, seg_t *seg)
|
||||
gl_portal_t *portal = HWR_Portal_Add(seg);
|
||||
|
||||
// Offset the portal view by the linedef centers
|
||||
line_t* start = &lines[line1];
|
||||
line_t* dest = &lines[line2];
|
||||
line_t* start = &lines[line1];
|
||||
line_t* dest = &lines[line2];
|
||||
|
||||
angle_t dangle = R_PointToAngle2(0, 0, dest->dx, dest->dy) - R_PointToAngle2(start->dx, start->dy, 0, 0);
|
||||
|
||||
@@ -99,7 +99,7 @@ void HWR_Portal_Add2Lines(const INT32 line1, const INT32 line2, seg_t *seg)
|
||||
dest_c.y = dest->v1->y/2 + dest->v2->y/2;
|
||||
|
||||
disttopoint = R_PointToDist2(start_c.x, start_c.y, viewx, viewy);
|
||||
angtopoint = R_PointToAngle2(start_c.x, start_c.y, viewx, viewy);
|
||||
angtopoint = R_PointToAngle2(start_c.x, start_c.y, viewx, viewy);
|
||||
angtopoint += dangle;
|
||||
|
||||
portal->viewx = dest_c.x + FixedMul(FINECOSINE(angtopoint>>ANGLETOFINESHIFT), disttopoint);
|
||||
@@ -170,7 +170,7 @@ void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float
|
||||
HWR_PortalFrame(portal);
|
||||
|
||||
// call HWR_RenderViewpoint
|
||||
HWR_RenderPortalViewpoint(portal, stencil_level + 1);
|
||||
HWR_RenderPortalViewpoint(portal, stencil_level + 1, true);
|
||||
|
||||
// return to current frame
|
||||
if (rootportal)
|
||||
@@ -220,9 +220,9 @@ boolean HWR_PortalCheckBBox(const fixed_t *bspcoord)
|
||||
if (!portalclipline)
|
||||
return true;
|
||||
|
||||
if (HWR_PortalCheckPointSide(bspcoord[BOXLEFT], bspcoord[BOXTOP]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXLEFT], bspcoord[BOXBOTTOM]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXRIGHT], bspcoord[BOXTOP]) ||
|
||||
if (HWR_PortalCheckPointSide(bspcoord[BOXLEFT], bspcoord[BOXTOP]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXLEFT], bspcoord[BOXBOTTOM]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXRIGHT], bspcoord[BOXTOP]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXRIGHT], bspcoord[BOXBOTTOM]))
|
||||
{
|
||||
return true;
|
||||
|
||||
+19
-14
@@ -76,30 +76,35 @@
|
||||
//
|
||||
|
||||
// Include GLSL_FLOOR_FUDGES or GLSL_WALL_FUDGES or define the fudges in shaders that use this macro.
|
||||
|
||||
// dither shader based on
|
||||
// https://github.com/hughsk/glsl-dither/blob/master/8x8.glsl
|
||||
// https://github.com/libretro/glsl-shaders/blob/master/dithering/shaders/bayer_4x4.glsl
|
||||
// adapted and messed about to work with srb2 and scale per resolution
|
||||
#define GLSL_DOOM_COLORMAP_DITHER \
|
||||
"float baseValue = max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \
|
||||
"float patscale = min(scr_resolution.x / 1280.0, scr_resolution.y / 720.0);\n" \
|
||||
"patscale = max(floor(patscale + 0.5), 1.0);\n" \
|
||||
"patscale = 1.0 / patscale;\n" \
|
||||
"ivec2 p = ivec2(mod(floor(position * patscale), 4.0));\n" \
|
||||
"float depthfactor = clamp((z - 192.0) / (6144.0 - 192.0), 0.0, 1.0);\n" \
|
||||
"float endResolutionx = scr_resolution.x;\n" \
|
||||
"float endResolutiony = scr_resolution.y;\n" \
|
||||
"if (scr_resolution.x > 1280.0) {\n" \
|
||||
"endResolutionx = scr_resolution.x * 0.5;\n" \
|
||||
"}\n" \
|
||||
"if (scr_resolution.y > 720.0) {\n" \
|
||||
"endResolutiony = scr_resolution.y * 0.5;\n" \
|
||||
"}\n" \
|
||||
"float zFactor = clamp((z - 192.0) / (6144.0 - 192.0), 0.0, 1.0);\n" \
|
||||
"int scaleFactor = int(mix(1.0, 8.0, zFactor));\n" \
|
||||
"endResolutionx = endResolutionx * scaleFactor;\n" \
|
||||
"endResolutiony = endResolutiony * scaleFactor;\n" \
|
||||
"vec2 normalizedPosition = position * vec2(endResolutionx / scr_resolution.x, endResolutiony / scr_resolution.y);\n" \
|
||||
"int x = int(mod(normalizedPosition.x, 4.0));\n" \
|
||||
"int y = int(mod(normalizedPosition.y, 4.0));\n" \
|
||||
"float bayerMatrix[4*4] = float[4*4](\n" \
|
||||
"0.0, 8.0, 2.0, 10.0,\n" \
|
||||
"12.0, 4.0, 14.0, 6.0,\n" \
|
||||
"3.0, 11.0, 1.0, 9.0,\n" \
|
||||
"15.0, 7.0, 13.0, 5.0\n" \
|
||||
");\n" \
|
||||
"float threshold = 16.0;\n" \
|
||||
"#ifdef SRB2_PALETTE_RENDERING\n" \
|
||||
"threshold = 11.0;\n" \
|
||||
"float threshold = (1.0 - pow(zFactor, 2.0)) * (bayerMatrix[y*4 + x] / 11.0);\n" \
|
||||
"#else\n" \
|
||||
"float threshold = (1.0 - pow(zFactor, 2.0)) * (bayerMatrix[y*4 + x] / 16.0);\n" \
|
||||
"#endif\n" \
|
||||
"threshold = (1.0 - pow(depthfactor, 2.0)) * (bayerMatrix[p.y*4 + p.x] / threshold);\n" \
|
||||
"return mix(baseValue + threshold - 0.5 / 16.0, baseValue, depthfactor);\n"
|
||||
"return mix(baseValue + threshold - 0.5 / 16.0, baseValue, zFactor);\n"
|
||||
|
||||
#define GLSL_DOOM_COLORMAP_NODITHER \
|
||||
"return max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \
|
||||
|
||||
@@ -1068,13 +1068,6 @@ void GL_SetShader(int slot)
|
||||
gl_shadersenabled = false;
|
||||
}
|
||||
|
||||
void GL_EnableShader(void)
|
||||
{
|
||||
// we can just use GL_Shader_SetUniforms as itll enable the shader for us
|
||||
// and handle any failures
|
||||
GL_Shader_SetUniforms(NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
void GL_UnSetShader(void)
|
||||
{
|
||||
if (gl_shadersenabled) // don't repeatedly call glUseProgram if not needed
|
||||
@@ -1122,7 +1115,7 @@ static void GL_Perspective(GLfloat fovy, GLfloat aspect)
|
||||
|
||||
const GLfloat deltaZ = FAR_CLIPPING_PLANE - NEAR_CLIPPING_PLANE;
|
||||
|
||||
if ((fabsf(deltaZ) < 1.0E-36f) || fpclassify(aspect) == FP_ZERO)
|
||||
if ((fabsf((float)deltaZ) < 1.0E-36f) || fpclassify(aspect) == FP_ZERO)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -1284,7 +1277,7 @@ void GL_SetStates(void)
|
||||
|
||||
pglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
|
||||
pglDisable(GL_STENCIL_TEST);
|
||||
pglEnable(GL_STENCIL_TEST);
|
||||
pglEnable(GL_DEPTH_TEST); // check the depth buffer
|
||||
pglDepthMask(GL_TRUE); // enable writing to depth buffer
|
||||
pglClearDepth(1.0f);
|
||||
@@ -1314,16 +1307,6 @@ void GL_SetStates(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
void GL_EnableStencilTest(void)
|
||||
{
|
||||
pglEnable(GL_STENCIL_TEST);
|
||||
}
|
||||
|
||||
void GL_DisableStencilTest(void)
|
||||
{
|
||||
pglDisable(GL_STENCIL_TEST);
|
||||
}
|
||||
|
||||
// -----------------+
|
||||
// DeleteTexture : Deletes a texture from the GPU and frees its data
|
||||
// -----------------+
|
||||
@@ -1583,7 +1566,6 @@ void GL_Draw2DLine(F2DCoord * v1, F2DCoord * v2, RGBA_t Color)
|
||||
angle = atanf((v2->y-v1->y)/(v2->x-v1->x));
|
||||
else
|
||||
angle = (float)N_PI_DEMI;
|
||||
|
||||
dx = sinf(angle) / (float)screen_width;
|
||||
dy = cosf(angle) / (float)screen_height;
|
||||
|
||||
@@ -1698,7 +1680,7 @@ static void GL_SetBlendMode(FBITFIELD flags)
|
||||
|
||||
void GL_SetBlend(FBITFIELD PolyFlags)
|
||||
{
|
||||
const FBITFIELD Xor = CurrentPolyFlags^PolyFlags;
|
||||
const FBITFIELD Xor = CurrentPolyFlags^PolyFlags;;
|
||||
|
||||
if (Xor & (PF_Blending|PF_RemoveYWrap|PF_ForceWrapX|PF_ForceWrapY|PF_Occlude|PF_NoTexture|PF_Modulated|PF_NoDepthTest|PF_Decal|PF_Skydecal|PF_Invisible))
|
||||
{
|
||||
@@ -3261,6 +3243,14 @@ static void GL_Framebuffer_Generate(void)
|
||||
if (!framebufferobject.fboobj)
|
||||
pglGenFramebuffers(1, &framebufferobject.fboobj);
|
||||
|
||||
if (pglCheckFramebufferStatus(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
|
||||
{
|
||||
// if this fails, dont retry it a gazillion times
|
||||
// this wouldnt recover
|
||||
supportFBO = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// Bind the framebuffer
|
||||
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj);
|
||||
|
||||
@@ -3312,18 +3302,6 @@ static void GL_Framebuffer_Generate(void)
|
||||
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
|
||||
}
|
||||
|
||||
if (pglCheckFramebufferStatus(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
|
||||
{
|
||||
//pglGetError(); TODO:implement this or smth
|
||||
GL_MSG_Error("GL_Framebuffer_Generate: Failed to create Framebuffer Object");
|
||||
|
||||
// if this fails, dont retry it a gazillion times
|
||||
// this wouldnt recover
|
||||
supportFBO = false;
|
||||
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
// Unbind the framebuffer
|
||||
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
||||
|
||||
@@ -3346,10 +3324,6 @@ void GL_Framebuffer_Enable(void)
|
||||
|
||||
GL_Framebuffer_Generate();
|
||||
|
||||
// failed
|
||||
if (!supportFBO || !framebufferobject.init)
|
||||
return;
|
||||
|
||||
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj);
|
||||
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, framebufferobject.rboobj);
|
||||
}
|
||||
@@ -3744,7 +3718,7 @@ void GL_MakeScreenTexture(int tex)
|
||||
tex_downloaded = screenTextures[tex];
|
||||
}
|
||||
|
||||
void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height)
|
||||
void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean useshader)
|
||||
{
|
||||
float xfix, yfix;
|
||||
float origaspect, newaspect;
|
||||
@@ -3797,6 +3771,9 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height)
|
||||
|
||||
pglBindTexture(GL_TEXTURE_2D, screenTextures[tex]);
|
||||
|
||||
if (useshader)
|
||||
pglUseProgram(gl_shaders[SHADER_PALETTE_POSTPROCESS].program); // Final postprocess step of palette rendering, after everything else has been drawn.
|
||||
|
||||
pglColor4ubv(white);
|
||||
|
||||
pglTexCoordPointer(2, GL_FLOAT, 0, fix);
|
||||
@@ -3804,6 +3781,9 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height)
|
||||
|
||||
pglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
||||
|
||||
if (useshader)
|
||||
pglUseProgram(0);
|
||||
|
||||
tex_downloaded = screenTextures[tex];
|
||||
}
|
||||
|
||||
|
||||
+176
-58
@@ -115,8 +115,155 @@ static patch_t *songcreditbg = NULL;
|
||||
// -------
|
||||
static void HU_DrawRankings(void);
|
||||
|
||||
|
||||
consvar_t cv_showspecstuff = {"showspecstuff", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
//======================================================================
|
||||
// KEYBOARD LAYOUTS FOR ENTERING TEXT
|
||||
//======================================================================
|
||||
|
||||
char *shiftxform = NULL;
|
||||
|
||||
char english_shiftxform[] =
|
||||
{
|
||||
0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31,
|
||||
' ', '!', '"', '#', '$', '%', '&',
|
||||
'"', // shift-'
|
||||
'(', ')', '*', '+',
|
||||
'<', // shift-,
|
||||
'_', // shift--
|
||||
'>', // shift-.
|
||||
'?', // shift-/
|
||||
')', // shift-0
|
||||
'!', // shift-1
|
||||
'@', // shift-2
|
||||
'#', // shift-3
|
||||
'$', // shift-4
|
||||
'%', // shift-5
|
||||
'^', // shift-6
|
||||
'&', // shift-7
|
||||
'*', // shift-8
|
||||
'(', // shift-9
|
||||
':',
|
||||
':', // shift-;
|
||||
'<',
|
||||
'+', // shift-=
|
||||
'>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'{', // shift-[
|
||||
'|', // shift-backslash - OH MY GOD DOES WATCOM SUCK
|
||||
'}', // shift-]
|
||||
'"', '_',
|
||||
'~', // shift-`
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'{', '|', '}', '~', 127
|
||||
};
|
||||
|
||||
char french_shiftxform[] =
|
||||
{
|
||||
0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31,
|
||||
' ','$', //shift-!
|
||||
'3', //shift-"
|
||||
'#', '$', '%',
|
||||
'1', //shift-&
|
||||
'4', // shift-'
|
||||
'5', // shift-(
|
||||
')', // shift-)
|
||||
'*', '+',
|
||||
'?', // shift-,
|
||||
'6', // shift--
|
||||
'.', '/',
|
||||
'0', '1', '2', '3', '4', '5',
|
||||
'6', '7', '8', '9',
|
||||
'/', // shitf-:
|
||||
'.', // shift-;
|
||||
'>', // shift-<
|
||||
'+', // shift-=
|
||||
'>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'[', '\\', ']', '^',
|
||||
'8', //shift-_
|
||||
'`',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'{', '|', '}', '~', 127,
|
||||
128, 129,
|
||||
'2',
|
||||
131, 132,
|
||||
'0',
|
||||
134,
|
||||
'9',
|
||||
136, 137,
|
||||
'7',
|
||||
139, 140,
|
||||
'%'
|
||||
};
|
||||
|
||||
char french_altgrxform[] =
|
||||
{
|
||||
0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31,
|
||||
' ', '!',
|
||||
'#', //altgr-"
|
||||
'#', '$', '%', '&',
|
||||
'{', //altgr-'
|
||||
'[', //altgr-(
|
||||
']', //altgr-)
|
||||
'*', '+', ',',
|
||||
'|', //altg--
|
||||
'.', '/',
|
||||
'0', '1', '2', '3', '4', '5',
|
||||
'6', '7', '8', '9',
|
||||
':', ';', '<',
|
||||
'}', //altgr-=
|
||||
'>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'[', '\\', ']', '^',
|
||||
'\\', //altgr-backslash
|
||||
'`',
|
||||
'a', 'b', 'c', 'd', 'E', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
|
||||
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
||||
'{', '|', '}', '~', 127,
|
||||
128, 129,
|
||||
'~',
|
||||
131, 132,
|
||||
'@',
|
||||
134,
|
||||
'^',
|
||||
136, 137,
|
||||
'`',
|
||||
139, 140,
|
||||
KEY_FR_U_GRAVE
|
||||
};
|
||||
|
||||
//fallback for special letter non displayable in the game (i.e.: 'é','à',etc.)
|
||||
INT32 HU_FallBackFrSpecialLetter(INT32 key)
|
||||
{
|
||||
switch(key){
|
||||
case KEY_FR_E_AIGUE: return 'e';
|
||||
case KEY_FR_E_GRAVE: return 'e';
|
||||
case KEY_FR_C_CEDILLE: return 'c';
|
||||
case KEY_FR_A_GRAVE: return 'a';
|
||||
case KEY_FR_U_GRAVE: return 'u';
|
||||
default: return key;
|
||||
}
|
||||
}
|
||||
|
||||
static char cechotext[1024];
|
||||
static tic_t cechotimer = 0;
|
||||
static tic_t cechoduration = 5*TICRATE;
|
||||
@@ -133,7 +280,6 @@ static void Command_Say_f(void);
|
||||
static void Command_Sayto_f(void);
|
||||
static void Command_Sayteam_f(void);
|
||||
static void Command_CSay_f(void);
|
||||
static void Command_Mute_f(void);
|
||||
static void Got_Saycmd(const UINT8 **p, INT32 playernum);
|
||||
|
||||
void HU_LoadGraphics(void)
|
||||
@@ -261,7 +407,8 @@ void HU_Init(void)
|
||||
COM_AddCommand("csay", Command_CSay_f);
|
||||
RegisterNetXCmd(XD_SAY, Got_Saycmd);
|
||||
|
||||
COM_AddCommand("muteplayer", Command_Mute_f);
|
||||
// set shift translation table
|
||||
shiftxform = english_shiftxform;
|
||||
|
||||
if (dedicated || rendermode == render_none)
|
||||
return;
|
||||
@@ -288,6 +435,11 @@ void HU_Start(void)
|
||||
headsupactive = true;
|
||||
}
|
||||
|
||||
void HU_Shiftform(void)
|
||||
{
|
||||
shiftxform = (cv_keyboardlayout.value == 3) ? french_shiftxform : english_shiftxform;
|
||||
}
|
||||
|
||||
//======================================================================
|
||||
// EXECUTION
|
||||
//======================================================================
|
||||
@@ -982,8 +1134,7 @@ void HU_Ticker(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (cechotimer > 0)
|
||||
--cechotimer;
|
||||
if (cechotimer > 0) --cechotimer;
|
||||
|
||||
// Animate the desynch dots
|
||||
if (hu_resynching
|
||||
@@ -1025,42 +1176,21 @@ static boolean HU_clearChatSpaces(void)
|
||||
return nothingbutspaces;
|
||||
}
|
||||
|
||||
static void DoMute(const char *name, boolean chat)
|
||||
static void DoMute(const char *name)
|
||||
{
|
||||
INT32 pnum = D_LookupPlayer(name);
|
||||
|
||||
// Shortcut to reuse this function for console and chat command
|
||||
#define PRINT(msg, sound) do { \
|
||||
if (chat) \
|
||||
HU_AddChatText((msg), (sound)); \
|
||||
else \
|
||||
CONS_Printf("%s\n", msg); \
|
||||
} while (0)
|
||||
|
||||
if (pnum < 0 || !playeringame[pnum])
|
||||
if (pnum < 0)
|
||||
{
|
||||
PRINT("\x85""ERROR: \x80Player not found.", false);
|
||||
HU_AddChatText("\x85""ERROR: \x80Player not found.", false);
|
||||
return;
|
||||
}
|
||||
|
||||
player_muted[pnum] = !player_muted[pnum];
|
||||
|
||||
PRINT(va("Player '%s' has been %smuted.", player_names[pnum], player_muted[pnum] ? "" : "un"), false);
|
||||
HU_AddChatText(va("Player '%s' has been %smuted.", player_names[pnum], player_muted[pnum] ? "" : "un"), false);
|
||||
if (player_muted[pnum])
|
||||
PRINT("Use same command to unmute them.", false);
|
||||
|
||||
#undef PRINT
|
||||
}
|
||||
|
||||
static void Command_Mute_f(void)
|
||||
{
|
||||
if (COM_Argc() < 2)
|
||||
{
|
||||
CONS_Printf(M_GetText("mute <playername|playernum>: mute/unmute a player\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
DoMute(COM_Argv(1), false);
|
||||
HU_AddChatText("Use same command to unmute them.", false);
|
||||
}
|
||||
|
||||
static void HU_SendChatMessage(void)
|
||||
@@ -1094,7 +1224,7 @@ static void HU_SendChatMessage(void)
|
||||
if (msglength >= 5 && strnicmp(msg, "/mute", 5) == 0) // Used /mute
|
||||
{
|
||||
if (msglength > 6)
|
||||
DoMute(msg+6, true);
|
||||
DoMute(msg+6);
|
||||
else
|
||||
HU_AddChatText("\x82NOTICE: \x80Usage: /mute <name|node>", false);
|
||||
|
||||
@@ -1281,15 +1411,13 @@ boolean HU_Responder(event_t *ev)
|
||||
chat_on = false;
|
||||
I_SetTextInput(false);
|
||||
}
|
||||
else if ((c == KEY_UPARROW || c == KEY_PGUP || c == KEY_MOUSEWHEELUP) &&
|
||||
((chat_scroll > 0) && !OLDCHAT)) // CHAT SCROLLING YAYS!
|
||||
else if ((c == KEY_UPARROW || c == KEY_MOUSEWHEELUP) && chat_scroll > 0 && !OLDCHAT) // CHAT SCROLLING YAYS!
|
||||
{
|
||||
chat_scroll--;
|
||||
justscrolledup = true;
|
||||
chat_scrolltime = 4;
|
||||
}
|
||||
else if ((c == KEY_DOWNARROW || c == KEY_PGDN || c == KEY_MOUSEWHEELDOWN) &&
|
||||
((chat_scroll < chat_maxscroll) && (chat_maxscroll > 0) && !OLDCHAT))
|
||||
else if ((c == KEY_DOWNARROW || c == KEY_MOUSEWHEELDOWN) && chat_scroll < chat_maxscroll && chat_maxscroll > 0 && !OLDCHAT)
|
||||
{
|
||||
chat_scroll++;
|
||||
justscrolleddown = true;
|
||||
@@ -1453,6 +1581,7 @@ static void HU_drawMiniChat(void)
|
||||
|
||||
y = chaty - charheight*(msglines+1);
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
y -= BASEVIDHEIGHT/2;
|
||||
@@ -1460,6 +1589,7 @@ static void HU_drawMiniChat(void)
|
||||
y += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
y -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
dx = 0;
|
||||
@@ -1557,15 +1687,18 @@ static void HU_drawChatLog(INT32 offset)
|
||||
if (chat_scroll > chat_maxscroll)
|
||||
chat_scroll = chat_maxscroll;
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
boxh = max(6, boxh/2);
|
||||
if (splitscreen > 1)
|
||||
boxw = max(64, boxw/2);
|
||||
}
|
||||
#endif
|
||||
|
||||
y = chaty - offset*charheight - (chat_scroll*charheight) - boxh*charheight - 12;
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
y -= BASEVIDHEIGHT/2;
|
||||
@@ -1573,6 +1706,7 @@ static void HU_drawChatLog(INT32 offset)
|
||||
y += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
y -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
|
||||
@@ -1687,6 +1821,7 @@ static void HU_DrawChat(void)
|
||||
const char *talk = ntalk;
|
||||
const char *mute = "Chat has been muted.";
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
y -= BASEVIDHEIGHT/2;
|
||||
@@ -1697,6 +1832,7 @@ static void HU_DrawChat(void)
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
y -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
if (teamtalk)
|
||||
@@ -1797,7 +1933,7 @@ static void HU_DrawChat(void)
|
||||
INT32 count = 0;
|
||||
INT32 p_dispy = chaty - charheight - 1;
|
||||
size_t longest_name_length = 0;
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
p_dispy -= BASEVIDHEIGHT/2;
|
||||
@@ -1805,13 +1941,13 @@ static void HU_DrawChat(void)
|
||||
p_dispy += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
p_dispy -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
// Find longest player name, for drawing background for /pm list later
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (!playeringame[i])
|
||||
continue;
|
||||
if (!playeringame[i]) continue;
|
||||
|
||||
longest_name_length = max(longest_name_length, strlen(player_names[i]));
|
||||
}
|
||||
@@ -1914,6 +2050,7 @@ static void HU_DrawChat(void)
|
||||
|
||||
skip = 0;
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
suggesty -= BASEVIDHEIGHT/2;
|
||||
@@ -1921,6 +2058,7 @@ static void HU_DrawChat(void)
|
||||
suggesty += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
suggesty -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
||||
@@ -2504,26 +2642,6 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags)
|
||||
}
|
||||
}
|
||||
|
||||
void HU_drawLocalPlayerPing(INT32 x, INT32 y, INT32 flags)
|
||||
{
|
||||
UINT32 lag = localplayerping;
|
||||
const boolean gentleman = (cv_mindelay.value && (lag < (tic_t)simulated_lag));
|
||||
|
||||
if (gentleman)
|
||||
{
|
||||
lag = simulated_lag;
|
||||
}
|
||||
|
||||
if (cv_pingstyle.value == 0) // kart
|
||||
{
|
||||
HU_drawKartPing(x, y, lag, flags, gentleman);
|
||||
}
|
||||
else if (cv_pingstyle.value == 1) // old style ping
|
||||
{
|
||||
HU_drawOldPing(x, y, lag, flags, gentleman);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// HU_DrawSpectatorTicker
|
||||
//
|
||||
|
||||
+18
-1
@@ -42,6 +42,15 @@
|
||||
#define CRED_FONTEND 'Z' // the last font character
|
||||
#define CRED_FONTSIZE (CRED_FONTEND - CRED_FONTSTART + 1)
|
||||
|
||||
extern char *shiftxform; // english translation shift table
|
||||
extern char english_shiftxform[];
|
||||
|
||||
extern char french_shiftxform[];
|
||||
extern char french_altgrxform[];
|
||||
|
||||
//fallback for special letter non displayable in the game (i.e.: 'é','à',etc.)
|
||||
INT32 HU_FallBackFrSpecialLetter(INT32 key);
|
||||
|
||||
//------------------------------------
|
||||
// sorted player lines
|
||||
//------------------------------------
|
||||
@@ -59,7 +68,12 @@ typedef struct
|
||||
#define HU_MAXMSGLEN 223
|
||||
#define HU_MSGBUFSIZE 255
|
||||
#define MAX_CHAT_BUFSIZE 256 // that's enough messages, right? We'll delete the older ones when that gets out of hand.
|
||||
#define NETSPLITSCREEN // why the hell WOULDN'T we want this?
|
||||
#ifdef NETSPLITSCREEN
|
||||
#define OLDCHAT (cv_consolechat.value == 1 || dedicated || vid.width < 640)
|
||||
#else
|
||||
#define OLDCHAT (cv_consolechat.value == 1 || dedicated || vid.width < 640)
|
||||
#endif
|
||||
#define CHAT_MUTE (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer))) // this still allows to open the chat but not to type. That's used for scrolling and whatnot.
|
||||
#define OLD_MUTE (OLDCHAT && cv_mute.value && !(server || IsPlayerAdmin(consoleplayer))) // this is used to prevent oldchat from opening when muted.
|
||||
|
||||
@@ -96,6 +110,8 @@ void HU_LoadGraphics(void);
|
||||
// reset heads up when consoleplayer respawns.
|
||||
void HU_Start(void);
|
||||
|
||||
void HU_Shiftform(void);
|
||||
|
||||
boolean HU_Responder(event_t *ev);
|
||||
void HU_Ticker(void);
|
||||
void HU_TickSongCredits(void);
|
||||
@@ -104,7 +120,8 @@ void HU_Drawer(void);
|
||||
char HU_dequeueChatChar(void);
|
||||
void HU_clearChatChars(void);
|
||||
void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags); // Lat': Ping drawer for scoreboard.
|
||||
void HU_drawLocalPlayerPing(INT32 x, INT32 y, INT32 flags);
|
||||
//void HU_DrawTeamTabRankings(playersort_t *tab, INT32 whiteplayer);
|
||||
//void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer);
|
||||
void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 hilicol);
|
||||
void HU_DrawEmeralds(INT32 x, INT32 y, INT32 pemeralds);
|
||||
const char *HU_SkinColorToConsoleColor(skincolors_t color);
|
||||
|
||||
+22
-1
@@ -36,7 +36,28 @@ extern "C" {
|
||||
"JOYBUTTONS is greater than INT64 bits can hold"
|
||||
#endif
|
||||
|
||||
#define DigitalGamepadStyle(i) (cv_joyscale[i].value == 0)
|
||||
/** \brief The struct JoyType_s
|
||||
|
||||
share some joystick information (maybe 2 for splitscreen), to the game input code,
|
||||
actually, we need to know if it is a gamepad or analog controls
|
||||
*/
|
||||
|
||||
struct JoyType_s
|
||||
{
|
||||
/*! if true, we MUST Poll() to get new joystick data,
|
||||
that is: we NEED the DIRECTINPUTDEVICE2 ! (watchout NT compatibility) */
|
||||
INT32 bJoyNeedPoll;
|
||||
/*! this joystick is a gamepad, read: digital axes
|
||||
if FALSE, interpret the joystick event data as JOYAXISRANGE (see above) */
|
||||
INT32 bGamepadStyle;
|
||||
|
||||
};
|
||||
typedef struct JoyType_s JoyType_t;
|
||||
/** \brief Joystick info
|
||||
for palyer[sic] 1-4's joystick/gamepad
|
||||
*/
|
||||
|
||||
extern JoyType_t Joystick[MAXSPLITSCREENPLAYERS];
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
|
||||
@@ -148,8 +148,6 @@ extern INT32 numcontrollers;
|
||||
*/
|
||||
const char *I_GetJoyName(INT32 joyindex);
|
||||
|
||||
void I_SetJoystickFocus(void);
|
||||
|
||||
boolean I_GamepadHasLED(INT32 playernum);
|
||||
boolean I_GamepadHasRumble(INT32 playernum);
|
||||
|
||||
@@ -203,11 +201,6 @@ void I_ShutdownSystem(void);
|
||||
/** \brief To check if a Interrupt or Terminate Signal was fired
|
||||
*/
|
||||
boolean I_Interrupted(void);
|
||||
static inline void I_HandleInterrupt(void)
|
||||
{
|
||||
if (I_Interrupted())
|
||||
I_Quit();
|
||||
}
|
||||
|
||||
/** \brief The I_GetDiskFreeSpace function
|
||||
|
||||
|
||||
@@ -392,9 +392,6 @@ static const char *SOCK_GetNodeAddress(INT32 node)
|
||||
if (node == 0)
|
||||
return "self";
|
||||
|
||||
if (node < 0 || node > MAXNETNODES)
|
||||
return NULL;
|
||||
|
||||
if (!nodeconnected[node])
|
||||
return NULL;
|
||||
|
||||
|
||||
@@ -95,6 +95,7 @@ INT32 VID_SetMode(INT32 modenum);
|
||||
*/
|
||||
const char *VID_GetModeName(INT32 modenum);
|
||||
|
||||
void VID_RefreshModeList(void);
|
||||
void VID_PrepareModeList(void);
|
||||
|
||||
/** \brief can video system do fullscreen
|
||||
@@ -121,6 +122,7 @@ void I_ReadScreen(UINT8 * restrict scr, INT32 scale);
|
||||
|
||||
UINT32 I_GetRefreshRate(void);
|
||||
|
||||
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height);
|
||||
boolean I_CheckNativeRes(void);
|
||||
|
||||
void I_SetBorderlessWindow(void);
|
||||
|
||||
+165
-113
@@ -110,11 +110,6 @@ consvar_t cv_fancyroulette = {"animatedroulette", "Off", CV_SAVE, CV_OnOff, NULL
|
||||
consvar_t cv_darkitembox = {"darkitembox", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // itembox gets a dark border with specific items
|
||||
consvar_t cv_multiitemicon = {"multiitemicon", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
enum { ROULETTECOLOR_NONE = -1, ROULETTECOLOR_HUD, ROULETTECOLOR_PLAYER, ROULETTECOLOR_ITEM };
|
||||
static CV_PossibleValue_t roulettecolor_cons_t[] = {
|
||||
{ROULETTECOLOR_NONE, "None"}, {ROULETTECOLOR_HUD, "Hud"}, {ROULETTECOLOR_PLAYER, "Player"}, {ROULETTECOLOR_ITEM, "Item"}, {0, NULL}};
|
||||
consvar_t cv_roulettecolor = {"roulettecolor", "Hud", CV_SAVE, roulettecolor_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_showlaptimes = {"showlaptimes", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_biglaps = {"biglaphud", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // here for ppl who dont want to make 2 more patches for their custom hud
|
||||
@@ -248,8 +243,6 @@ void K_RegisterKartHudStuff(void)
|
||||
CV_RegisterVar(&cv_multiitemicon);
|
||||
CV_RegisterVar(&cv_huditemamount);
|
||||
|
||||
CV_RegisterVar(&cv_roulettecolor);
|
||||
|
||||
CV_RegisterVar(&cv_highresportrait);
|
||||
|
||||
CV_RegisterVar(&cv_nametag);
|
||||
@@ -281,6 +274,7 @@ void K_RegisterKartHudStuff(void)
|
||||
|
||||
// Smol speedo
|
||||
static patch_t *skp_smallsticker = NULL;
|
||||
static patch_t *skp_smallsticker3 = NULL;
|
||||
|
||||
static patch_t *skp_speedpatches[5] = {NULL};
|
||||
|
||||
@@ -318,6 +312,7 @@ static patch_t *kp_bumperstickerwideclr = NULL;
|
||||
static patch_t *kp_karmastickerclr = NULL;
|
||||
static patch_t *kp_timeoutstickerclr = NULL;
|
||||
static patch_t *skp_smallstickerclr = NULL;
|
||||
static patch_t *skp_smallstickerclr3 = NULL;
|
||||
static patch_t *kp_itemmulstickerclr[2] = {NULL};
|
||||
static patch_t *kp_itembgclr[4] = {NULL};
|
||||
|
||||
@@ -483,6 +478,11 @@ static void K_LoadSaturnHUDGraphics(void)
|
||||
skp_smallstickerclr = (patch_t *)W_CachePatchName("SC_SMSTC", PU_HUDGFX);
|
||||
}
|
||||
|
||||
if (xtra_speedo_clr3)
|
||||
{
|
||||
skp_smallstickerclr3 = (patch_t *)W_CachePatchName("SC_SM3TC", PU_HUDGFX);
|
||||
}
|
||||
|
||||
if (achi_speedo_clr)
|
||||
{
|
||||
skp_smallstickerachiclr = (patch_t *)W_CachePatchName("SC_AMSTC", PU_HUDGFX);
|
||||
@@ -537,6 +537,14 @@ static void K_LoadSaturnHUDGraphics(void)
|
||||
kp_itemmulstickerclr[0] = (patch_t *)W_CachePatchName("K_ITMULC", PU_HUDGFX);
|
||||
}
|
||||
}
|
||||
|
||||
if (found_extra3_kart)
|
||||
{
|
||||
if (xtra_speedo3) // 80x11 patch scaled to size
|
||||
{
|
||||
skp_smallsticker3 = (patch_t *)W_CachePatchName("SP_SM3TC", PU_HUDGFX);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -- Kart patches --
|
||||
@@ -871,7 +879,7 @@ void K_LoadKartHUDGraphics(void)
|
||||
|
||||
kp_yougotem = (patch_t *)W_CachePatchName("YOUGOTEM", PU_HUDGFX);
|
||||
|
||||
if (found_extra_kart || found_extra2_kart)
|
||||
if (found_extra_kart || found_extra2_kart || found_extra3_kart)
|
||||
K_LoadSaturnHUDGraphics();
|
||||
}
|
||||
|
||||
@@ -1141,6 +1149,7 @@ enum
|
||||
SPEEDO_DIAL,
|
||||
SPEEDO_PMETER,
|
||||
SPEEDO_PMETERSMOL,
|
||||
SPEEDO_EXTRA3,
|
||||
};
|
||||
|
||||
static SINT8 K_GetSpeedometerStyle(void)
|
||||
@@ -1155,6 +1164,8 @@ static SINT8 K_GetSpeedometerStyle(void)
|
||||
return SPEEDO_PMETER;
|
||||
else if (cv_newspeedometer.value == 6 && kartz_speedo_smol)
|
||||
return SPEEDO_PMETERSMOL;
|
||||
else if (cv_newspeedometer.value == 7 && xtra_speedo3)
|
||||
return SPEEDO_EXTRA3;
|
||||
else
|
||||
return SPEEDO_VANILLA;
|
||||
}
|
||||
@@ -1172,6 +1183,8 @@ static boolean K_UseColorSpeedo(int speedostyle)
|
||||
return achi_speedo_clr;
|
||||
case SPEEDO_DIAL:
|
||||
return dial_speedo_clr;
|
||||
case SPEEDO_EXTRA3:
|
||||
return xtra_speedo_clr3;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@@ -1183,6 +1196,7 @@ enum
|
||||
GAUGE_SMALL,
|
||||
GAUGE_BIGNUM,
|
||||
GAUGE_NUMONLY,
|
||||
GAUGE_EXTRA,
|
||||
};
|
||||
|
||||
static SINT8 K_GetDriftgaugeStyle(void)
|
||||
@@ -1195,6 +1209,8 @@ static SINT8 K_GetDriftgaugeStyle(void)
|
||||
return GAUGE_SMALL;
|
||||
else if (cv_driftgaugestyle.value == 3)
|
||||
return GAUGE_BIGNUM;
|
||||
else if (cv_driftgaugestyle.value == 5 && xtra_speedo3)
|
||||
return GAUGE_EXTRA;
|
||||
}
|
||||
|
||||
// Fallback
|
||||
@@ -1346,12 +1362,10 @@ INT32 K_getMinimapTrans(void)
|
||||
return -1;
|
||||
|
||||
if (timeinmap <= 113)
|
||||
{
|
||||
minimaptrans = ((((INT32)timeinmap) - 105)*minimaptrans)/(113-105);
|
||||
|
||||
if (!minimaptrans)
|
||||
return -1;
|
||||
}
|
||||
if (!minimaptrans)
|
||||
return -1;
|
||||
|
||||
return (10-minimaptrans)<<FF_TRANSSHIFT;
|
||||
}
|
||||
@@ -1393,6 +1407,7 @@ static void K_drawKartStats(void)
|
||||
{
|
||||
case SPEEDO_EXTRA:
|
||||
case SPEEDO_ACHII:
|
||||
case SPEEDO_EXTRA3:
|
||||
spdoffset = -10;
|
||||
break;
|
||||
case SPEEDO_DIAL:
|
||||
@@ -1514,77 +1529,74 @@ static void K_drawKartItem(void)
|
||||
|
||||
if (stplyr->kartstuff[k_itemroulette])
|
||||
{
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_PLAYER)
|
||||
localcolor = stplyr->skincolor;
|
||||
else if (cv_roulettecolor.value != ROULETTECOLOR_NONE)
|
||||
localcolor = K_GetHudColor();
|
||||
localcolor = K_GetHudColor();
|
||||
|
||||
switch ((stplyr->kartstuff[k_itemroulette] % (14*3)) / 3)
|
||||
{
|
||||
// Each case is handled in threes, to give three frames of in-game time to see the item on the roulette
|
||||
case 0: // Sneaker
|
||||
localpatch = kp_sneaker[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_RASPBERRY;
|
||||
//localcolor = SKINCOLOR_RASPBERRY;
|
||||
break;
|
||||
case 1: // Banana
|
||||
localpatch = kp_banana[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_YELLOW;
|
||||
//localcolor = SKINCOLOR_YELLOW;
|
||||
break;
|
||||
case 2: // Orbinaut
|
||||
localpatch = kp_orbinaut[3+offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_STEEL;
|
||||
//localcolor = SKINCOLOR_STEEL;
|
||||
break;
|
||||
case 3: // Mine
|
||||
localpatch = kp_mine[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_JET;
|
||||
//localcolor = SKINCOLOR_JET;
|
||||
break;
|
||||
case 4: // Grow
|
||||
localpatch = kp_grow[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_TEAL;
|
||||
//localcolor = SKINCOLOR_TEAL;
|
||||
break;
|
||||
case 5: // Hyudoro
|
||||
localpatch = kp_hyudoro[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_STEEL;
|
||||
//localcolor = SKINCOLOR_STEEL;
|
||||
break;
|
||||
case 6: // Rocket Sneaker
|
||||
localpatch = kp_rocketsneaker[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_TANGERINE;
|
||||
//localcolor = SKINCOLOR_TANGERINE;
|
||||
break;
|
||||
case 7: // Jawz
|
||||
localpatch = kp_jawz[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_JAWZ;
|
||||
//localcolor = SKINCOLOR_JAWZ;
|
||||
break;
|
||||
case 8: // Self-Propelled Bomb
|
||||
localpatch = kp_selfpropelledbomb[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_JET;
|
||||
//localcolor = SKINCOLOR_JET;
|
||||
break;
|
||||
case 9: // Shrink
|
||||
localpatch = kp_shrink[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_ORANGE;
|
||||
//localcolor = SKINCOLOR_ORANGE;
|
||||
break;
|
||||
case 10: // Invincibility
|
||||
localpatch = localinv;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_GREY;
|
||||
//localcolor = SKINCOLOR_GREY;
|
||||
break;
|
||||
case 11: // Eggman Monitor
|
||||
localpatch = kp_eggman[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_ROSE;
|
||||
//localcolor = SKINCOLOR_ROSE;
|
||||
break;
|
||||
case 12: // Ballhog
|
||||
localpatch = kp_ballhog[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_LILAC;
|
||||
//localcolor = SKINCOLOR_LILAC;
|
||||
break;
|
||||
case 13: // Thunder Shield
|
||||
localpatch = kp_thundershield[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_CYAN;
|
||||
//localcolor = SKINCOLOR_CYAN;
|
||||
break;
|
||||
/*case 14: // Pogo Spring
|
||||
localpatch = kp_pogospring[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_TANGERINE;
|
||||
localcolor = SKINCOLOR_TANGERINE;
|
||||
break;
|
||||
case 15: // Kitchen Sink
|
||||
localpatch = kp_kitchensink[offset];
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_STEEL;
|
||||
localcolor = SKINCOLOR_STEEL;
|
||||
break;*/
|
||||
default:
|
||||
break;
|
||||
@@ -2171,9 +2183,8 @@ static boolean K_drawKartPositionFaces(void)
|
||||
UINT8 *colormap;
|
||||
|
||||
ranklines = 0;
|
||||
|
||||
if (!LUA_HudEnabled(hud_minirankings))
|
||||
return false; // Don't proceed but still return true for free play above if HUD is disabled.
|
||||
memset(completed, 0, sizeof (completed));
|
||||
memset(rankplayer, 0, sizeof (rankplayer));
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
@@ -2188,7 +2199,8 @@ static boolean K_drawKartPositionFaces(void)
|
||||
if (numplayersingame <= 1)
|
||||
return true;
|
||||
|
||||
memset(completed, 0, sizeof (completed));
|
||||
if (!LUA_HudEnabled(hud_minirankings))
|
||||
return false; // Don't proceed but still return true for free play above if HUD is disabled.
|
||||
|
||||
for (j = 0; j < numplayersingame; j++)
|
||||
{
|
||||
@@ -2245,7 +2257,6 @@ static boolean K_drawKartPositionFaces(void)
|
||||
|
||||
if (!playeringame[rankplayer[i]])
|
||||
continue;
|
||||
|
||||
if (player->spectator || !player->mo)
|
||||
continue;
|
||||
|
||||
@@ -2423,7 +2434,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
||||
|
||||
static boolean K_BigLap(void)
|
||||
{
|
||||
return (cv_biglaps.value && (cv_numlaps.value > 9) && !stplyr->exiting && (K_UseColorHud() ? big_lap_color : big_lap));
|
||||
return (cv_biglaps.value && (cv_numlaps.value > 9) && (K_UseColorHud() ? big_lap_color : big_lap) && (!stplyr->exiting));
|
||||
}
|
||||
|
||||
static void K_drawKartLaps(void)
|
||||
@@ -2632,7 +2643,7 @@ static void K_drawKartSpeedometer(void)
|
||||
return;
|
||||
|
||||
// index 0 is the raw value, index 1 is the converted value
|
||||
fixed_t convSpeed[2] = {0, 0};
|
||||
fixed_t convSpeed[2] = {0,0};
|
||||
#ifdef ROTSPRITE
|
||||
fixed_t dial_divisor = DIALSPDDIV;
|
||||
#endif
|
||||
@@ -2701,28 +2712,34 @@ static void K_drawKartSpeedometer(void)
|
||||
|
||||
V_DrawKartString(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, metric);
|
||||
}
|
||||
else if (speedostyle == SPEEDO_EXTRA || speedostyle == SPEEDO_ACHII) // why bother if we dont?
|
||||
else if (speedostyle == SPEEDO_EXTRA) // why bother if we dont?
|
||||
{
|
||||
patch_t *speedopat;
|
||||
UINT8 *colormap = NULL;
|
||||
|
||||
if (K_UseColorSpeedo(speedostyle)) //Colourized hud
|
||||
if (K_UseColorSpeedo(SPEEDO_EXTRA)) //Colourized hud
|
||||
{
|
||||
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
V_DrawMappedPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_smallstickerclr, colormap);
|
||||
}
|
||||
else
|
||||
V_DrawScaledPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_smallsticker);
|
||||
|
||||
speedopat = ((speedostyle == SPEEDO_EXTRA) ? skp_smallstickerclr : skp_smallstickerachiclr);
|
||||
V_DrawMappedPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, speedopat, colormap);
|
||||
speedopat = ((speedostyle == SPEEDO_EXTRA) ? skp_speedpatches[cv_kartspeedometer.value] : skp_speedpatchesachiclr[cv_kartspeedometer.value]);
|
||||
V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
|
||||
V_DrawScaledPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_speedpatches[cv_kartspeedometer.value]);
|
||||
}
|
||||
else if (speedostyle == SPEEDO_ACHII) // why bother if we dont?
|
||||
{
|
||||
if (K_UseColorSpeedo(SPEEDO_ACHII)) //Colourized hud
|
||||
{
|
||||
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
V_DrawMappedPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_smallstickerachiclr, colormap);
|
||||
V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
|
||||
V_DrawMappedPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_speedpatchesachiclr[cv_kartspeedometer.value], colormap);
|
||||
}
|
||||
else
|
||||
{
|
||||
speedopat = ((speedostyle == SPEEDO_EXTRA) ? skp_smallsticker : skp_smallstickerachi);
|
||||
V_DrawScaledPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, speedopat);
|
||||
speedopat = ((speedostyle == SPEEDO_EXTRA) ? skp_speedpatches[cv_kartspeedometer.value] : skp_speedpatchesachi[cv_kartspeedometer.value]);
|
||||
V_DrawScaledPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_smallstickerachi);
|
||||
V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
|
||||
V_DrawScaledPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_speedpatchesachi[cv_kartspeedometer.value]);
|
||||
}
|
||||
|
||||
V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
|
||||
V_DrawMappedPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, speedopat, colormap);
|
||||
}
|
||||
#ifdef ROTSPRITE
|
||||
else if (speedostyle == SPEEDO_DIAL) // why bother if we dont?
|
||||
@@ -2735,36 +2752,46 @@ static void K_drawKartSpeedometer(void)
|
||||
(K_UseColorSpeedo(SPEEDO_DIAL)));
|
||||
}
|
||||
#endif
|
||||
else if (speedostyle == SPEEDO_EXTRA3) // why bother if we dont?
|
||||
{
|
||||
if (K_UseColorSpeedo(SPEEDO_EXTRA3)) //Colourized hud
|
||||
{
|
||||
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
V_DrawStretchyFixedPatch((SPDM_X-1)<<FRACBITS, (SPDM_Y + 5)<<FRACBITS, XTRA3PSCALE, XTRA3VSCALE, V_HUDTRANS|splitflags, skp_smallstickerclr3, colormap, 0);
|
||||
}
|
||||
else
|
||||
V_DrawStretchyFixedPatch((SPDM_X-1)<<FRACBITS, (SPDM_Y + 5)<<FRACBITS, XTRA3PSCALE, XTRA3VSCALE, V_HUDTRANS|splitflags, skp_smallsticker3, NULL, 0);
|
||||
|
||||
V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
|
||||
V_DrawScaledPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_speedpatches[cv_kartspeedometer.value]);
|
||||
}
|
||||
// Kart Z speedo bullshit...
|
||||
// Draw the Speed counter.
|
||||
else if ((speedostyle == SPEEDO_PMETER) || (speedostyle == SPEEDO_PMETERSMOL))
|
||||
{
|
||||
fixed_t fuspeed = 0;
|
||||
INT32 spdpatch = 0;
|
||||
static const INT32 spdinterval[22] = { 2, 5, 7, 10,
|
||||
12, 15, 17, 20,
|
||||
22, 25, 27, 30,
|
||||
32, 35, 37, 40,
|
||||
42, 45, 47, 50,
|
||||
52, 55};
|
||||
static const INT32 speedIntervals[22] = {2, 5, 7, 10, 12, 15, 17,
|
||||
20, 22, 25, 27, 30, 32,
|
||||
35, 37, 40, 42, 45, 47,
|
||||
50, 52, 55};
|
||||
|
||||
const fixed_t spd = FixedDiv(stplyr->speed, mapobjectscale) / FRACUNIT;
|
||||
fuspeed = FixedDiv(stplyr->speed, mapobjectscale)/FRACUNIT;
|
||||
|
||||
if (spd > 54)
|
||||
for (INT32 i = 0; i < 22; ++i)
|
||||
{
|
||||
spdpatch = (leveltime & 4) ? 24 : 23;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (INT32 i = 0; i < 22; ++i)
|
||||
if (fuspeed < speedIntervals[i])
|
||||
{
|
||||
if (spd < spdinterval[i])
|
||||
{
|
||||
spdpatch = i;
|
||||
break;
|
||||
}
|
||||
spdpatch = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (((fuspeed < 57 && fuspeed > 54) || (fuspeed < 60 && fuspeed > 56) || (fuspeed > 59)) && (leveltime & 4))
|
||||
spdpatch = 24;
|
||||
else if (((fuspeed < 57 && fuspeed > 54) || (fuspeed < 60 && fuspeed > 56) || (fuspeed > 59)) && !(leveltime & 4))
|
||||
spdpatch = 23;
|
||||
|
||||
V_DrawScaledPatch(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, (speedostyle == SPEEDO_PMETER) ? kp_kartzspeedo[spdpatch] : kp_kartzspeedo_smol[spdpatch]);
|
||||
}
|
||||
}
|
||||
@@ -2792,7 +2819,7 @@ static void K_drawKartBumpersOrKarma(void)
|
||||
{
|
||||
const UINT8 speedostyle = K_GetSpeedometerStyle();
|
||||
|
||||
if ((speedostyle == SPEEDO_EXTRA) || (speedostyle == SPEEDO_ACHII))
|
||||
if ((speedostyle == SPEEDO_EXTRA) || (speedostyle == SPEEDO_ACHII) || (speedostyle == SPEEDO_EXTRA3))
|
||||
fy += 5;
|
||||
else
|
||||
fy += 7;
|
||||
@@ -2884,12 +2911,10 @@ static boolean K_GetScreenCoords(vector2_t *vec, player_t *player, mobj_t *targe
|
||||
x = (fixed_t)(viewangle - R_PointToAngle(targx, targy));
|
||||
|
||||
distfact = FINECOSINE((x>>ANGLETOFINESHIFT) & FINEMASK);
|
||||
if (!distfact)
|
||||
distfact = 1;
|
||||
if (!distfact) distfact = 1;
|
||||
|
||||
if (encoremode)
|
||||
x = -x;
|
||||
|
||||
if (x < (fixed_t)ANGLE_270 || x > (fixed_t)ANGLE_90)
|
||||
return false;
|
||||
|
||||
@@ -2971,7 +2996,7 @@ static boolean K_GetScreenCoords(vector2_t *vec, player_t *player, mobj_t *targe
|
||||
if (stplyrnum > 0)
|
||||
y = y + yres;
|
||||
}
|
||||
else if (splitscreen >= 2) // 3P or 4P
|
||||
if (splitscreen >= 2) // 3P or 4P
|
||||
{
|
||||
x = x>>1;
|
||||
y = y>>1;
|
||||
@@ -3031,11 +3056,9 @@ static void K_drawNameTags(void)
|
||||
if (players[i].kartstuff[k_hyudorotimer]) // player is invisible
|
||||
continue;
|
||||
if (maxdistance)
|
||||
{
|
||||
distance = R_PointToDist(players[i].mo->x, players[i].mo->y);
|
||||
if (distance > maxdistance)
|
||||
continue;
|
||||
}
|
||||
if (distance > maxdistance)
|
||||
continue;
|
||||
if (!P_CheckSightFast(stplyr->mo, players[i].mo))
|
||||
continue;
|
||||
|
||||
@@ -3244,12 +3267,13 @@ static void K_drawDriftGauge(void)
|
||||
if (!splitscreen && !camera->chase)
|
||||
return;
|
||||
|
||||
// i will skip the drift early return and you cant stop me!
|
||||
if (!forceshowhud)
|
||||
{
|
||||
if (!stplyr->kartstuff[k_drift])
|
||||
return;
|
||||
}
|
||||
if (forceshowhud)
|
||||
goto skipcrap; // i will skip the drift early return and you cant stop me!
|
||||
|
||||
if (!stplyr->kartstuff[k_drift])
|
||||
return;
|
||||
|
||||
skipcrap:
|
||||
|
||||
if (P_MobjWasRemoved(stplyr->mo))
|
||||
return;
|
||||
@@ -3274,11 +3298,12 @@ static void K_drawDriftGauge(void)
|
||||
{
|
||||
case GAUGE_DEFAULT:
|
||||
case GAUGE_SMALL:
|
||||
case GAUGE_EXTRA:
|
||||
case GAUGE_BIGNUM:
|
||||
{
|
||||
patch_t *driftpatch = NULL;
|
||||
|
||||
if (gaugestyle == GAUGE_DEFAULT || gaugestyle == GAUGE_BIGNUM)
|
||||
if (gaugestyle == GAUGE_DEFAULT || gaugestyle == GAUGE_BIGNUM || gaugestyle == GAUGE_EXTRA)
|
||||
{
|
||||
barx = basex - vid.dup*23;
|
||||
BAR_WIDTH = vid.dup*47;
|
||||
@@ -3291,15 +3316,30 @@ static void K_drawDriftGauge(void)
|
||||
|
||||
bary = basey - vid.dup*2;
|
||||
|
||||
if (K_UseColorHud()) // Colourized hud
|
||||
if (gaugestyle == GAUGE_EXTRA) // i hate hud code i hate hud code i hate hud code i hate hud code i hate hud code.....
|
||||
{
|
||||
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
driftpatch = (gaugestyle == GAUGE_SMALL ? driftgaugesmallcolor : driftgaugecolor);
|
||||
if (K_UseColorSpeedo(SPEEDO_EXTRA3)) // We reuse the extra speedometer patch hence this check
|
||||
{
|
||||
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
driftpatch = skp_smallstickerclr3;
|
||||
}
|
||||
else
|
||||
driftpatch = skp_smallsticker3;
|
||||
|
||||
V_DrawStretchyFixedPatch((basex - vid.dup*30)<<FRACBITS, ((basey<<FRACBITS) - FixedMul(vid.dup<<FRACBITS, 21*FRACUNIT/10)), XTRA3PSCALE, XTRA3VSCALE, V_NOSCALESTART|V_OFFSET|drifttrans, driftpatch, colormap, 0);
|
||||
}
|
||||
else
|
||||
driftpatch = (gaugestyle == GAUGE_SMALL ? driftgaugesmall : driftgauge);
|
||||
{
|
||||
if (K_UseColorHud()) // Colourized hud
|
||||
{
|
||||
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
driftpatch = (gaugestyle == GAUGE_SMALL ? driftgaugesmallcolor : driftgaugecolor);
|
||||
}
|
||||
else
|
||||
driftpatch = (gaugestyle == GAUGE_SMALL ? driftgaugesmall : driftgauge);
|
||||
|
||||
V_DrawMappedPatch(gaugestyle == GAUGE_SMALL ? basex + vid.dup*11 : basex, basey, V_NOSCALESTART|V_OFFSET|drifttrans, driftpatch, colormap);
|
||||
V_DrawMappedPatch(gaugestyle == GAUGE_SMALL ? basex + vid.dup*11 : basex, basey, V_NOSCALESTART|V_OFFSET|drifttrans, driftpatch, colormap);
|
||||
}
|
||||
|
||||
if (driftcharge >= driftval*4) // rainbow sparks
|
||||
{
|
||||
@@ -3597,7 +3637,7 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags)
|
||||
V_DrawCenteredSmallStringAtFixed(amxpos + (4*FRACUNIT), amypos - (3*FRACUNIT), V_ALLOWLOWERCASE|flags|V_SkinColorToHighlightcolor(mo->color), player_names[player - players]);
|
||||
}
|
||||
|
||||
const boolean minihead = K_useSmallMinimapHead(player);
|
||||
const boolean minihead = K_useSmallMinimapHead(mo->player);
|
||||
|
||||
// thx wanted reticle for having weird offsets very cool
|
||||
wntdamxpos = minihead ? amxpos + (1<<FRACBITS) : amxpos - (4<<FRACBITS);
|
||||
@@ -3982,7 +4022,6 @@ static void K_drawBattleFullscreen(void)
|
||||
{
|
||||
if (stplyrnum == 0)
|
||||
V_DrawFadeScreen(0xFF00, 16);
|
||||
|
||||
if (stplyr->exiting < 6*TICRATE && !stplyr->spectator)
|
||||
{
|
||||
if (stplyr->kartstuff[k_position] == 1)
|
||||
@@ -4264,7 +4303,6 @@ static void K_drawInput(void)
|
||||
|
||||
y -= FRACUNIT;
|
||||
|
||||
// stick displays
|
||||
if (cv_showinput.value == 2 || cv_showinput.value == 3)
|
||||
{
|
||||
INT32 axis;
|
||||
@@ -4274,7 +4312,7 @@ static void K_drawInput(void)
|
||||
const INT32 joyy = y>>FRACBITS;
|
||||
static const INT32 joyxoffs = -8;
|
||||
static const INT32 joyyoffs = -24;
|
||||
const boolean usejoysprite = (cv_showinput.value == 3 && joystickicon);
|
||||
const boolean usejoysprite = (cv_showinput.value == 3 && joystickicon);
|
||||
|
||||
// O backing
|
||||
if (usejoysprite)
|
||||
@@ -4292,19 +4330,38 @@ static void K_drawInput(void)
|
||||
// kart does not have anything we can get analogue joystick y axis values from
|
||||
// during normal gameplay, so replicate shit here
|
||||
|
||||
const boolean analogjoystickmove = (!demo.playback && P_IsLocalPlayer(stplyr) && cv_usejoystick[stplyrnum].value && !DigitalGamepadStyle(stplyrnum));
|
||||
axis = analogjoystickmove ? JoyAxis(AXISAIM, stplyrnum+1) : 0;
|
||||
|
||||
if (axis != 0)
|
||||
{
|
||||
hudforward -= ((axis * KART_FULLTURN) / JOYAXISRANGE);
|
||||
}
|
||||
else
|
||||
// this is horrid but we cant get actual input in replays so uhh
|
||||
if (demo.playback || !P_IsLocalPlayer(stplyr)) // yeah...........
|
||||
{
|
||||
hudforward = stplyr->kartstuff[k_throwdir] * KART_FULLTURN;
|
||||
}
|
||||
else
|
||||
{
|
||||
const boolean analogjoystickmove = cv_usejoystick[stplyrnum].value && !Joystick[stplyrnum].bGamepadStyle;
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[stplyrnum].value && Joystick[stplyrnum].bGamepadStyle;
|
||||
const UINT8 ssplayer = stplyrnum+1;
|
||||
|
||||
hudforward = CLAMP(hudforward, -KART_FULLTURN, KART_FULLTURN);
|
||||
axis = JoyAxis(AXISAIM, ssplayer);
|
||||
|
||||
if (analogjoystickmove && axis != 0)
|
||||
{
|
||||
// JOYAXISRANGE is supposed to be 1023 (divide by 1024)
|
||||
hudforward -= ((axis * KART_FULLTURN) / (JOYAXISRANGE-1));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (InputDown(gc_aimforward, ssplayer) || (gamepadjoystickmove && axis < 0))
|
||||
{
|
||||
hudforward += KART_FULLTURN;
|
||||
}
|
||||
if (InputDown(gc_aimbackward, ssplayer) || (gamepadjoystickmove && axis > 0))
|
||||
{
|
||||
hudforward-= KART_FULLTURN;
|
||||
}
|
||||
}
|
||||
|
||||
hudforward = CLAMP(hudforward, -KART_FULLTURN, KART_FULLTURN);
|
||||
}
|
||||
|
||||
if (cmd->driftturn || hudforward)
|
||||
{
|
||||
@@ -4338,7 +4395,7 @@ static void K_drawInput(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
else // wheel
|
||||
else
|
||||
{
|
||||
if (!cmd->driftturn) // no turn
|
||||
target = 0;
|
||||
@@ -4385,7 +4442,6 @@ static void K_drawChallengerScreen(void)
|
||||
19,20,19,20,19,20,19,20,19,20, // frame 20-21, 1 tic, 5 alternating: all text vibrates from impact
|
||||
21,22,23,24 // frame 22-25, 1 tic: CHALLENGER turns gold
|
||||
};
|
||||
|
||||
const UINT8 offset = min(52-1, (3*TICRATE)-mapreset);
|
||||
|
||||
V_DrawFadeScreen(0xFF00, 16); // Fade out
|
||||
@@ -4439,7 +4495,7 @@ static void K_drawLapStartAnim(void)
|
||||
char *lapnum = va("%02d", stplyr->laps + 1);
|
||||
const size_t laplength = strlen(lapnum);
|
||||
|
||||
for (size_t i = 0; i < laplength; i++)
|
||||
for (int i = 0; i < (int)laplength; i++)
|
||||
{
|
||||
int digit = lapnum[i] - '0';
|
||||
int frame = min(2, progress/2 - 8 - (i*2));
|
||||
@@ -4487,7 +4543,6 @@ static void K_drawDistributionDebugger(void)
|
||||
kp_orbinaut[4],
|
||||
kp_jawz[1]
|
||||
};
|
||||
|
||||
INT32 useodds = 0;
|
||||
INT32 pingame = 0, bestbumper = 0;
|
||||
INT32 i;
|
||||
@@ -4504,10 +4559,8 @@ static void K_drawDistributionDebugger(void)
|
||||
if (!playeringame[i] || players[i].spectator)
|
||||
continue;
|
||||
pingame++;
|
||||
|
||||
if (players[i].exiting)
|
||||
dontforcespb = true;
|
||||
|
||||
if (players[i].kartstuff[k_bumper] > bestbumper)
|
||||
bestbumper = players[i].kartstuff[k_bumper];
|
||||
}
|
||||
@@ -4661,7 +4714,6 @@ void K_drawKartHUD(void)
|
||||
{
|
||||
if (LUA_HudEnabled(hud_battlefullscreen))
|
||||
K_drawBattleFullscreen();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,6 @@ extern consvar_t cv_showlaptimes;
|
||||
extern consvar_t cv_battlespeedo;
|
||||
extern consvar_t cv_multiitemicon;
|
||||
extern consvar_t cv_huditemamount;
|
||||
extern consvar_t cv_roulettecolor;
|
||||
|
||||
// for use in timeattack menu
|
||||
extern patch_t *kp_facenum[MAXPLAYERS+1];
|
||||
|
||||
+652
-763
File diff suppressed because it is too large.
Load diff
+11
-11
@@ -293,17 +293,17 @@ typedef struct Hook_State Hook_State;
|
||||
typedef void (*Hook_Callback)(Hook_State *);
|
||||
|
||||
struct Hook_State {
|
||||
INT32 status; /* return status to calling function */
|
||||
void * userdata;
|
||||
int hook_type;
|
||||
mobjtype_t mobj_type; /* < NUMMOBJTYPES if mobj hook */
|
||||
const char * string; /* used to fetch table, ran first if set */
|
||||
int top; /* index of last argument passed to hook */
|
||||
int id; /* id to fetch ref */
|
||||
bool important; /* is this hook from local addon */
|
||||
int values; /* num arguments passed to hook */
|
||||
int results; /* num values returned by hook */
|
||||
Hook_Callback results_handler; /* callback when hook successfully returns */
|
||||
INT32 status;/* return status to calling function */
|
||||
void * userdata;
|
||||
int hook_type;
|
||||
mobjtype_t mobj_type;/* <NUMMOBJTYPES if mobj hook */
|
||||
const char * string;/* used to fetch table, ran first if set */
|
||||
int top;/* index of last argument passed to hook */
|
||||
int id;/* id to fetch ref */
|
||||
boolean important;/* is this hook from local addon */
|
||||
int values;/* num arguments passed to hook */
|
||||
int results;/* num values returned by hook */
|
||||
Hook_Callback results_handler;/* callback when hook successfully returns */
|
||||
};
|
||||
|
||||
enum {
|
||||
|
||||
+1
-1
@@ -1297,7 +1297,7 @@ static int lib_hudsetvotebackground(lua_State *L)
|
||||
|
||||
if (strlen(prefix) != 4)
|
||||
{
|
||||
return luaL_argerror(L, 1, "prefix should be 4 characters wide");
|
||||
return luaL_argerror(L, 1, "prefix should 4 characters wide");
|
||||
}
|
||||
|
||||
strncpy(VoteScreen.luaPrefix, prefix, 4);
|
||||
|
||||
+4
-9
@@ -652,7 +652,7 @@ static int line_get(lua_State *L)
|
||||
LUA_PushUserdata(L, &sides[line->sidenum[0]], META_SIDE);
|
||||
return 1;
|
||||
case line_backside: // backside
|
||||
if (line->sidenum[1] == NO_INDEX)
|
||||
if (line->sidenum[1] == 0xffff)
|
||||
return 0;
|
||||
LUA_PushUserdata(L, &sides[line->sidenum[1]], META_SIDE);
|
||||
return 1;
|
||||
@@ -1658,22 +1658,17 @@ static int mapheaderinfo_get(lua_State *L)
|
||||
{
|
||||
// Read custom vars now
|
||||
// (note: don't include the "LUA." in your lua scripts!)
|
||||
if (!header->numCustomOptions) {
|
||||
lua_pushnil(L);
|
||||
break;
|
||||
}
|
||||
|
||||
UINT8 j = 0;
|
||||
const char *cusoptstr = lua_tostring(L, 2);
|
||||
for (;j < header->numCustomOptions && !fastcmp(cusoptstr, header->customopts[j].option); ++j);
|
||||
for (;j < header->numCustomOptions && !fastcmp(lua_tostring(L, 2), header->customopts[j].option); ++j);
|
||||
|
||||
if (j < header->numCustomOptions)
|
||||
if(j < header->numCustomOptions)
|
||||
lua_pushstring(L, header->customopts[j].value);
|
||||
else
|
||||
lua_pushnil(L);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
int LUA_MapLib(lua_State *L)
|
||||
|
||||
+8
-13
@@ -979,7 +979,7 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
|
||||
|
||||
if (!gL)
|
||||
{
|
||||
if (fastcmp(ptype, "player")) // players must always be included, even if no vars
|
||||
if (fastcmp(ptype,"player")) // players must always be included, even if no vars
|
||||
WRITEUINT16(*p, 0);
|
||||
return;
|
||||
}
|
||||
@@ -995,7 +995,7 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
|
||||
if (!lua_istable(gL, -1))
|
||||
{ // no extra values table
|
||||
lua_pop(gL, 1);
|
||||
if (fastcmp(ptype, "player")) // players must always be included, even if no vars
|
||||
if (fastcmp(ptype,"player")) // players must always be included, even if no vars
|
||||
WRITEUINT16(*p, 0);
|
||||
return;
|
||||
}
|
||||
@@ -1007,13 +1007,13 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
|
||||
// skip anything that has an empty table and isn't a player.
|
||||
if (i == 0)
|
||||
{
|
||||
if (fastcmp(ptype, "player")) // always include players even if they have no extra variables
|
||||
if (fastcmp(ptype,"player")) // always include players even if they have no extra variables
|
||||
WRITEUINT16(*p, 0);
|
||||
lua_pop(gL, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (fastcmp(ptype, "mobj")) // mobjs must write their mobjnum as a header
|
||||
if (fastcmp(ptype,"mobj")) // mobjs must write their mobjnum as a header
|
||||
WRITEUINT32(*p, ((mobj_t *)pointer)->mobjnum);
|
||||
|
||||
WRITEUINT16(*p, i);
|
||||
@@ -1065,9 +1065,8 @@ static void ArchiveTables(UINT8 **p)
|
||||
n++; // the table contained a new table we'll have to archive. :(
|
||||
else if (e == 2) // invalid key type (function, thread, lightuserdata, or anything we don't recognise)
|
||||
{
|
||||
lua_pushvalue(gL, -2); // copy key for error message (lua_tostring may mutate it which confuses lua_next)
|
||||
CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -1), luaL_typename(gL, -1), i);
|
||||
lua_pop(gL, 2); // pop key copy and value
|
||||
CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -2), luaL_typename(gL, -2), i);
|
||||
lua_pop(gL, 1);
|
||||
continue;
|
||||
}
|
||||
else if (e == 3) // nil key due to invalid userdata. NOT an error.
|
||||
@@ -1081,15 +1080,11 @@ static void ArchiveTables(UINT8 **p)
|
||||
if (e == 1)
|
||||
n++; // the table contained a new table we'll have to archive. :(
|
||||
else if (e == 2) // invalid value type
|
||||
{
|
||||
lua_pushvalue(gL, -2); // copy key for error message (same as above)
|
||||
CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -1), luaL_typename(gL, -2));
|
||||
lua_pop(gL, 1); // pop key copy
|
||||
}
|
||||
CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -2), luaL_typename(gL, -1));
|
||||
|
||||
lua_pop(gL, 1);
|
||||
}
|
||||
|
||||
}
|
||||
lua_pop(gL, 1);
|
||||
WRITEUINT8(*p, ARCH_TEND);
|
||||
}
|
||||
|
||||
@@ -249,6 +249,9 @@ boolean cht_Responder(event_t *ev)
|
||||
#define REQUIRE_SINGLEPLAYER if (netgame || multiplayer)\
|
||||
{ CONS_Printf(M_GetText("This only works in single player.\n")); return; }
|
||||
|
||||
#define REQUIRE_NOULTIMATE if (ultimatemode)\
|
||||
{ CONS_Printf(M_GetText("You're too good to be cheating!\n")); return; }
|
||||
|
||||
// command that can be typed at the console!
|
||||
void Command_CheatNoClip_f(void)
|
||||
{
|
||||
@@ -256,6 +259,7 @@ void Command_CheatNoClip_f(void)
|
||||
|
||||
REQUIRE_INLEVEL;
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
plyr = &players[consoleplayer];
|
||||
plyr->pflags ^= PF_NOCLIP;
|
||||
@@ -270,6 +274,7 @@ void Command_CheatGod_f(void)
|
||||
|
||||
REQUIRE_INLEVEL;
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
plyr = &players[consoleplayer];
|
||||
plyr->pflags ^= PF_GODMODE;
|
||||
@@ -284,6 +289,7 @@ void Command_CheatNoTarget_f(void)
|
||||
|
||||
REQUIRE_INLEVEL;
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
plyr = &players[consoleplayer];
|
||||
plyr->pflags ^= PF_INVIS;
|
||||
@@ -587,6 +593,7 @@ void Command_Devmode_f(void)
|
||||
#ifndef _DEBUG
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
#endif
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
if (COM_Argc() > 1)
|
||||
{
|
||||
@@ -1041,6 +1048,7 @@ void Command_ObjectPlace_f(void)
|
||||
{
|
||||
REQUIRE_INLEVEL;
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
G_SetGameModified(multiplayer, true);
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ void Command_ObjectPlace_f(void);
|
||||
void Command_Writethings_f(void);
|
||||
|
||||
extern consvar_t cv_opflags, cv_mapthingnum, cv_speed;
|
||||
//extern consvar_t cv_snapto, cv_grid;
|
||||
|
||||
extern boolean objectplacing;
|
||||
extern mobjtype_t op_currentthing;
|
||||
@@ -47,10 +48,18 @@ void Command_CheatNoClip_f(void);
|
||||
void Command_CheatGod_f(void);
|
||||
void Command_CheatNoTarget_f(void);
|
||||
void Command_Savecheckpoint_f(void);
|
||||
/*void Command_Getallemeralds_f(void);
|
||||
void Command_Resetemeralds_f(void);
|
||||
void Command_Setrings_f(void);
|
||||
void Command_Setlives_f(void);
|
||||
void Command_Setcontinues_f(void);*/
|
||||
void Command_Devmode_f(void);
|
||||
void Command_Scale_f(void);
|
||||
void Command_Gravflip_f(void);
|
||||
void Command_Hurtme_f(void);
|
||||
/*void Command_JumpToAxis_f(void);
|
||||
void Command_Charability_f(void);
|
||||
void Command_Charspeed_f(void);*/
|
||||
void Command_Teleport_f(void);
|
||||
void Command_RTeleport_f(void);
|
||||
void Command_Skynum_f(void);
|
||||
|
||||
@@ -62,9 +62,6 @@ FUNCMATH fixed_t FixedHypot(fixed_t x, fixed_t y)
|
||||
angle_t angle;
|
||||
fixed_t dist;
|
||||
|
||||
I_Assert(x != INT32_MIN);
|
||||
I_Assert(y != INT32_MIN);
|
||||
|
||||
x = abs(x);
|
||||
y = abs(y);
|
||||
|
||||
@@ -80,10 +77,6 @@ FUNCMATH fixed_t FixedHypot(fixed_t x, fixed_t y)
|
||||
if (!y)
|
||||
return x;
|
||||
|
||||
// prevent underflow
|
||||
if (y == INT32_MIN)
|
||||
return INT32_MAX;
|
||||
|
||||
angle = (tantoangle[FixedDiv(y, x)>>DBITS] + ANGLE_90) >> ANGLETOFINESHIFT;
|
||||
|
||||
// use as cosine
|
||||
|
||||
+195
-93
@@ -149,6 +149,9 @@ M_waiting_mode_t m_waiting_mode = M_NOT_WAITING;
|
||||
|
||||
const char *quitmsg[NUM_QUITMESSAGES] = {};
|
||||
|
||||
// Stuff for customizing the player select screen Tails 09-22-2003
|
||||
description_t description[MAXSKINS] = {};
|
||||
|
||||
INT32 mapwads[NUMMAPS] = {};
|
||||
|
||||
boolean browselocalskins = false;
|
||||
@@ -305,7 +308,6 @@ static void M_SetupMultiHandler(INT32 choice);
|
||||
|
||||
// Options
|
||||
// Split into multiple parts due to size
|
||||
static void M_VideoModeMenu(INT32 choice);
|
||||
static void M_Setup1PControlsMenu(void);
|
||||
static void M_Setup2PControlsMenu(void);
|
||||
static void M_Setup3PControlsMenu(void);
|
||||
@@ -496,6 +498,32 @@ static consvar_t cv_dummystaff = {"dummystaff", "0", CV_HIDEN|CV_CALL, dummystaf
|
||||
// all the menu definitions and onchanges reside in here now
|
||||
#include "m_menudefs.c"
|
||||
|
||||
static INT32 M_ShiftChar(INT32 ch)
|
||||
{
|
||||
if (I_UseNativeKeyboard())
|
||||
return ch;
|
||||
|
||||
if (cv_keyboardlayout.value == 3)
|
||||
{
|
||||
if (ch >= 32 && ch <= 141)
|
||||
{
|
||||
if (shiftdown)
|
||||
ch = shiftxform[ch];
|
||||
else if (altdown & 0x2)
|
||||
ch = french_altgrxform[ch];
|
||||
else
|
||||
ch = HU_FallBackFrSpecialLetter(ch);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (shiftdown && ch >= 32 && ch <= 127)
|
||||
ch = shiftxform[ch];
|
||||
}
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
//
|
||||
// M_GetGametypeColor
|
||||
//
|
||||
@@ -1025,12 +1053,11 @@ boolean M_Responder(event_t *ev)
|
||||
const INT32 jxdeadzone = ((JOYAXISRANGE-1) * max(cv_xdeadzone[0].value, FRACUNIT/2)) >> FRACBITS;
|
||||
const INT32 jydeadzone = ((JOYAXISRANGE-1) * max(cv_ydeadzone[0].value, FRACUNIT/2)) >> FRACBITS;
|
||||
INT32 accelaxis = abs(cv_moveaxis[0].value);
|
||||
|
||||
if (ev->data1 == 0)
|
||||
{
|
||||
if (ev->data3 != INT32_MAX)
|
||||
{
|
||||
if (DigitalGamepadStyle(0) || abs(ev->data3) > jydeadzone)
|
||||
if (Joystick[0].bGamepadStyle || abs(ev->data3) > jydeadzone)
|
||||
{
|
||||
if (joywaity < thistime
|
||||
&& (pjoyy == 0 || (ev->data3 < 0) != (pjoyy < 0))) // no previous direction OR change direction
|
||||
@@ -1046,7 +1073,7 @@ boolean M_Responder(event_t *ev)
|
||||
|
||||
if (ev->data2 != INT32_MAX && joywaitx < thistime)
|
||||
{
|
||||
if (DigitalGamepadStyle(0) || abs(ev->data2) > jxdeadzone)
|
||||
if (Joystick[0].bGamepadStyle || abs(ev->data2) > jxdeadzone)
|
||||
{
|
||||
if (joywaitx < thistime
|
||||
&& (pjoyx == 0 || (ev->data2 < 0) != (pjoyx < 0))) // no previous direction OR change direction
|
||||
@@ -1065,22 +1092,19 @@ boolean M_Responder(event_t *ev)
|
||||
// The following borrows heavily from Joy1Axis.
|
||||
const boolean xmode = (accelaxis%2);
|
||||
INT32 retaxis = 0;
|
||||
|
||||
if (!xmode)
|
||||
accelaxis--;
|
||||
accelaxis /= 2;
|
||||
|
||||
if (ev->data1 == accelaxis)
|
||||
{
|
||||
const INT32 jacceldeadzone = xmode ? jxdeadzone : jydeadzone;
|
||||
retaxis = xmode ? ev->data2 : ev->data3;
|
||||
|
||||
if (retaxis != INT32_MAX)
|
||||
{
|
||||
if (cv_moveaxis[0].value < 0)
|
||||
retaxis = -retaxis;
|
||||
|
||||
if (DigitalGamepadStyle(0) || retaxis > jacceldeadzone)
|
||||
if (Joystick[0].bGamepadStyle || retaxis > jacceldeadzone)
|
||||
{
|
||||
if (joywaitaccel < thistime && retaxis > pjoyaccel) // only on upwards event
|
||||
{
|
||||
@@ -1228,7 +1252,7 @@ boolean M_Responder(event_t *ev)
|
||||
// Handle menuitems which need a specific key handling
|
||||
if (routine && (currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_KEYHANDLER)
|
||||
{
|
||||
ch = CON_ShiftChar(ch);
|
||||
ch = M_ShiftChar(ch);
|
||||
routine(ch);
|
||||
return true;
|
||||
}
|
||||
@@ -1258,7 +1282,6 @@ boolean M_Responder(event_t *ev)
|
||||
void (*otherroutine)(event_t *sev) = currentMenu->menuitems[itemOn].itemaction;
|
||||
otherroutine(ev); //Alam: what a hack
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1972,6 +1995,8 @@ void M_Ticker(void)
|
||||
//
|
||||
void M_Init(void)
|
||||
{
|
||||
UINT8 i;
|
||||
|
||||
COM_AddCommand("manual", Command_Manual_f);
|
||||
|
||||
CV_RegisterVar(&cv_nextmap);
|
||||
@@ -2017,6 +2042,15 @@ void M_Init(void)
|
||||
quitmsg[QUIT3MSG5] = M_GetText("You'll be back to play soon, though...\n...right?\n\n(Press 'Y' to quit)");
|
||||
quitmsg[QUIT3MSG6] = M_GetText("Aww, is Eggman's Nightclub too\ndifficult for you?\n\n(Press 'Y' to quit)");
|
||||
|
||||
// Setup PlayerMenu table
|
||||
for (i = 0; i < MAXSKINS; i++)
|
||||
{
|
||||
PlayerMenu[i].status = (i == 0 ? IT_CALL : IT_DISABLED);
|
||||
PlayerMenu[i].patch = PlayerMenu[i].text = NULL;
|
||||
PlayerMenu[i].itemaction = M_ChoosePlayer;
|
||||
PlayerMenu[i].alphaKey = 0;
|
||||
}
|
||||
|
||||
#ifdef HWRENDER
|
||||
// Permanently hide some options based on render mode
|
||||
if (rendermode == render_soft)
|
||||
@@ -2071,6 +2105,55 @@ void M_Init(void)
|
||||
M_TextInputInit(&menuinput, menu_text_input_buf, sizeof menu_text_input_buf);
|
||||
}
|
||||
|
||||
void M_InitCharacterTables(void)
|
||||
{
|
||||
UINT8 i;
|
||||
|
||||
// Setup PlayerMenu table
|
||||
for (i = 0; i < MAXSKINS; i++)
|
||||
{
|
||||
PlayerMenu[i].status = (i < 4 ? IT_CALL : IT_DISABLED);
|
||||
PlayerMenu[i].patch = PlayerMenu[i].text = NULL;
|
||||
PlayerMenu[i].itemaction = M_ChoosePlayer;
|
||||
PlayerMenu[i].alphaKey = 0;
|
||||
}
|
||||
|
||||
// Setup description table
|
||||
for (i = 0; i < MAXSKINS; i++)
|
||||
{
|
||||
if (i == 0)
|
||||
{
|
||||
strcpy(description[i].notes, "\x82Sonic\x80 is the fastest of the three, but also the hardest to control. Beginners beware, but experts will find Sonic very powerful.\n\n\x82""Ability:\x80 Speed Thok\nDouble jump to zoom forward with a huge burst of speed.\n\n\x82Tip:\x80 Simply letting go of forward does not slow down in SRB2. To slow down, hold the opposite direction.");
|
||||
strcpy(description[i].picname, "");
|
||||
strcpy(description[i].skinname, "sonic");
|
||||
}
|
||||
else if (i == 1)
|
||||
{
|
||||
strcpy(description[i].notes, "\x82Tails\x80 is the most mobile of the three, but has the slowest speed. Because of his mobility, he's well-\nsuited to beginners.\n\n\x82""Ability:\x80 Fly\nDouble jump to start flying for a limited time. Repetitively hit the jump button to ascend.\n\n\x82Tip:\x80 To quickly descend while flying, hit the spin button.");
|
||||
strcpy(description[i].picname, "");
|
||||
strcpy(description[i].skinname, "tails");
|
||||
}
|
||||
else if (i == 2)
|
||||
{
|
||||
strcpy(description[i].notes, "\x82Knuckles\x80 is well-\nrounded and can destroy breakable walls simply by touching them, but he can't jump as high as the other two.\n\n\x82""Ability:\x80 Glide & Climb\nDouble jump to glide in the air as long as jump is held. Glide into a wall to climb it.\n\n\x82Tip:\x80 Press spin while climbing to jump off the wall; press jump instead to jump off\nand face away from\nthe wall.");
|
||||
strcpy(description[i].picname, "");
|
||||
strcpy(description[i].skinname, "knuckles");
|
||||
}
|
||||
else if (i == 3)
|
||||
{
|
||||
strcpy(description[i].notes, "\x82Sonic & Tails\x80 team up to take on Dr. Eggman!\nControl Sonic while Tails desperately struggles to keep up.\n\nPlayer 2 can control Tails directly by setting the controls in the options menu.\nTails's directional controls are relative to Player 1's camera.\n\nTails can pick up Sonic while flying and carry him around.");
|
||||
strcpy(description[i].picname, "CHRS&T");
|
||||
strcpy(description[i].skinname, "sonic&tails");
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(description[i].notes, "???");
|
||||
strcpy(description[i].picname, "");
|
||||
strcpy(description[i].skinname, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
// SPECIAL MENU OPTION DRAW ROUTINES GO HERE
|
||||
// ==========================================================================
|
||||
@@ -7869,24 +7952,25 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
INT32 tw = 0;
|
||||
spritedef_t *sprdef;
|
||||
spriteframe_t *sprframe;
|
||||
patch_t *statbg = (patch_t *)W_CachePatchName("K_STATBG", PU_PATCH);
|
||||
patch_t *statlr = (patch_t *)W_CachePatchName("K_STATLR", PU_PATCH);
|
||||
patch_t *statud = (patch_t *)W_CachePatchName("K_STATUD", PU_PATCH);
|
||||
patch_t *statdot = (patch_t *)W_CachePatchName("K_SDOT0" , PU_PATCH);
|
||||
patch_t *patch;
|
||||
UINT8 frame;
|
||||
UINT8 speed;
|
||||
UINT8 weight;
|
||||
UINT8 i;
|
||||
UINT8 s, w;
|
||||
const UINT8 *flashcol = V_GetStringColormap(highlightflags);
|
||||
INT32 skinnum = 0;
|
||||
INT32 statx, staty;
|
||||
UINT32 speenframe;
|
||||
INT32 sltw, actw, hetw;
|
||||
UINT8 skintodisplay;
|
||||
INT32 nameboxaddy = 0;
|
||||
|
||||
const UINT8 *flashcol = V_GetStringColormap(highlightflags);
|
||||
patch_t *statbg = (patch_t *)W_CachePatchName("K_STATBG", PU_PATCH);
|
||||
patch_t *statlr = (patch_t *)W_CachePatchName("K_STATLR", PU_PATCH);
|
||||
patch_t *statud = (patch_t *)W_CachePatchName("K_STATUD", PU_PATCH);
|
||||
patch_t *statdot = (patch_t *)W_CachePatchName("K_SDOT0" , PU_PATCH);
|
||||
int statoffset = 0;
|
||||
int gridyoffset = 0;
|
||||
|
||||
mx = MP_PlayerSetupDef.x;
|
||||
my = MP_PlayerSetupDef.y;
|
||||
@@ -7901,6 +7985,8 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
switch (cv_skinselectmenu.value)
|
||||
{
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
nameboxaddy = 6;
|
||||
break;
|
||||
case SKINMENUTYPE_GRID:
|
||||
nameboxaddy = 6;
|
||||
break;
|
||||
@@ -7916,23 +8002,39 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
else
|
||||
M_DrawTextInput(mx + 40, my + nameboxaddy, &setupm_input, 0);
|
||||
|
||||
#define GETSELECTEDSKINNAME (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].realname : skins[setupm_fakeskin].realname)
|
||||
#define GETSELECTEDSPEED (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartspeed : skins[setupm_fakeskin].kartspeed)
|
||||
#define GETSELECTEDWEIGHT (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartweight : skins[setupm_fakeskin].kartweight)
|
||||
|
||||
// draw skin string
|
||||
st = V_StringWidth(skins[setupm_fakeskin].realname, 0);
|
||||
switch (cv_skinselectmenu.value)
|
||||
{
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
V_DrawString(statx - (statdp ? 50 : 113), staty - 10, V_6WIDTHSPACE, va("\x84%dS \x87%dW", GETSELECTEDSPEED, GETSELECTEDWEIGHT));
|
||||
/* FALLTHRU */
|
||||
#define GETSELECTEDSKINNAME (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].realname : skins[setupm_fakeskin].realname)
|
||||
#define GETSELECTEDSPEED (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartspeed : skins[setupm_fakeskin].kartspeed)
|
||||
#define GETSELECTEDWEIGHT (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartweight : skins[setupm_fakeskin].kartweight)
|
||||
|
||||
tw = V_StringWidth("Character", 0);//V_StringWidth(GETSELECTEDSKINNAME, 0);
|
||||
st = V_StringWidth(GETSELECTEDSKINNAME, 0);
|
||||
|
||||
V_DrawString((mx+(tw/2)) - (st/2), my + 37,
|
||||
((MP_PlayerSetupMenu[2].status & IT_TYPE) == IT_SPACE ? V_TRANSLUCENT : 0) | highlightflags | V_ALLOWLOWERCASE,
|
||||
GETSELECTEDSKINNAME);
|
||||
if (statdp == true)
|
||||
statoffset = 50;
|
||||
else
|
||||
statoffset = 113;
|
||||
|
||||
V_DrawString(statx - statoffset, staty - 10, V_6WIDTHSPACE, va("\x84%dS \x87%dW", GETSELECTEDSPEED, GETSELECTEDWEIGHT));
|
||||
#undef GETSELECTEDSKINNAME
|
||||
#undef GETSELECTEDSPEED
|
||||
#undef GETSELECTEDWEIGHT
|
||||
break;
|
||||
case SKINMENUTYPE_GRID:
|
||||
tw = V_StringWidth("Character", 0);
|
||||
#define GETSELECTEDSKINNAME (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].realname : skins[setupm_fakeskin].realname)
|
||||
tw = V_StringWidth("Character", 0);//V_StringWidth(GETSELECTEDSKINNAME, 0);
|
||||
st = V_StringWidth(GETSELECTEDSKINNAME, 0);
|
||||
V_DrawString((mx+(tw/2)) - (st/2), my + 37,
|
||||
((MP_PlayerSetupMenu[2].status & IT_TYPE) == IT_SPACE ? V_TRANSLUCENT : 0) | highlightflags | V_ALLOWLOWERCASE,
|
||||
GETSELECTEDSKINNAME);
|
||||
#undef GETSELECTEDSKINNAME
|
||||
break;
|
||||
case SKINMENUTYPE_2D:
|
||||
|
||||
@@ -8010,6 +8112,8 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
break;
|
||||
}
|
||||
|
||||
#define GRIDSTATOFFSET 0
|
||||
|
||||
switch (cv_skinselectmenu.value)
|
||||
{
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
@@ -8021,6 +8125,9 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
if (itemOn == 1)
|
||||
V_DrawSmallString(statx+101, staty-37, V_6WIDTHSPACE|highlightflags, "BS: change");
|
||||
|
||||
#define GETSELECTEDSPEED (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartspeed : skins[setupm_fakeskin].kartspeed)
|
||||
#define GETSELECTEDWEIGHT (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartweight : skins[setupm_fakeskin].kartweight)
|
||||
|
||||
if (statdp == true)
|
||||
{
|
||||
//Background
|
||||
@@ -8050,19 +8157,22 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
}
|
||||
}
|
||||
|
||||
#undef GETSELECTEDSPEED
|
||||
#undef GETSELECTEDWEIGHT
|
||||
|
||||
break;
|
||||
case SKINMENUTYPE_GRID:
|
||||
// SRB2Kart: draw the stat backer
|
||||
// labels
|
||||
V_DrawSmallString(statx+12, staty+67, V_6WIDTHSPACE|highlightflags, "Acceleration");
|
||||
V_DrawSmallString(statx+76, staty+67, V_6WIDTHSPACE|highlightflags, "Max Speed");
|
||||
V_DrawSmallString(statx+14, staty+75, V_6WIDTHSPACE|highlightflags, "Handling");
|
||||
V_DrawSmallString(statx+21, staty+108, V_6WIDTHSPACE|highlightflags, "Weight");
|
||||
V_DrawSmallString(statx+12+GRIDSTATOFFSET, staty+67, V_6WIDTHSPACE|highlightflags, "Acceleration");
|
||||
V_DrawSmallString(statx+76+GRIDSTATOFFSET, staty+67, V_6WIDTHSPACE|highlightflags, "Max Speed");
|
||||
V_DrawSmallString(statx+14+GRIDSTATOFFSET, staty+75, V_6WIDTHSPACE|highlightflags, "Handling");
|
||||
V_DrawSmallString(statx+21+GRIDSTATOFFSET, staty+108, V_6WIDTHSPACE|highlightflags, "Weight");
|
||||
// label arrows
|
||||
V_DrawFixedPatch(((statx+61)<<FRACBITS) + (FRACUNIT>>1), (staty+67)<<FRACBITS, FRACUNIT>>1, 0, statlr, flashcol);
|
||||
V_DrawFixedPatch((statx+40)<<FRACBITS, (staty+80)<<FRACBITS, FRACUNIT>>1, 0, statud, flashcol);
|
||||
V_DrawFixedPatch(((statx+61+GRIDSTATOFFSET)<<FRACBITS) + (FRACUNIT>>1), (staty+67)<<FRACBITS, FRACUNIT>>1, 0, statlr, flashcol);
|
||||
V_DrawFixedPatch((statx+40+GRIDSTATOFFSET)<<FRACBITS, (staty+80)<<FRACBITS, FRACUNIT>>1, 0, statud, flashcol);
|
||||
// bg
|
||||
V_DrawFixedPatch(((statx+48)<<FRACBITS)+(FRACUNIT>>1), (staty+73)<<FRACBITS, FRACUNIT>>1, 0, statbg, NULL);
|
||||
V_DrawFixedPatch(((statx+48+GRIDSTATOFFSET)<<FRACBITS)+(FRACUNIT>>1), (staty+73)<<FRACBITS, FRACUNIT>>1, 0, statbg, NULL);
|
||||
|
||||
for (i = 0; i < numskins; i++) // draw the stat dots
|
||||
{
|
||||
@@ -8070,7 +8180,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
{
|
||||
speed = skins[i].kartspeed;
|
||||
weight = skins[i].kartweight;
|
||||
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
|
||||
V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8096,9 +8206,9 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
#define TEXTVERTSHIFT 10
|
||||
|
||||
DRAWSLOW(statx - sltw - 2, staty);
|
||||
DRAWSLOW(statx - sltw - 2, staty - TEXTVERTSHIFT + (9 * 18) - 11);
|
||||
DRAWSLOW(statx - sltw - 2, staty - TEXTVERTSHIFT+ (9 * 18) - 11);
|
||||
DRAWFAST(statx + (9 * 18), staty);
|
||||
DRAWFAST(statx + (9 * 18), staty - TEXTVERTSHIFT + (9 * 18) - 11);
|
||||
DRAWFAST(statx + (9 * 18), staty - TEXTVERTSHIFT+ (9 * 18) - 11);
|
||||
DRAWACCEL(statx - actw - 2, staty + TEXTVERTSHIFT);
|
||||
DRAWACCEL(statx + (9 * 18), staty + TEXTVERTSHIFT);
|
||||
DRAWHEAVY(statx - hetw - 2, staty + (9 * 18) - 11);
|
||||
@@ -8135,18 +8245,15 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
break;
|
||||
}
|
||||
|
||||
#undef GETSELECTEDSKINNAME
|
||||
#undef GETSELECTEDSPEED
|
||||
#undef GETSELECTEDWEIGHT
|
||||
|
||||
switch (cv_skinselectmenu.value)
|
||||
{
|
||||
//Skin grid stuff
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
//Skin grid stuff
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
gridyoffset = 10;
|
||||
for (s = 0; s < SKINGRIDNEWWIDTH*SKINGRIDNEWHEIGHT; s++)
|
||||
{
|
||||
INT32 x = ((s % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH) - 8) + 100 + SKINXSHIFT; //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
|
||||
INT32 y = ((s / SKINGRIDNEWWIDTH) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2)) + 10); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
|
||||
INT32 y = ((s / SKINGRIDNEWWIDTH) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2)) + gridyoffset); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
|
||||
INT32 calcs = s + (setupm_skinypos * SKINGRIDNEWWIDTH);
|
||||
INT32 skinn;
|
||||
patch_t *face;
|
||||
@@ -8172,7 +8279,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
{
|
||||
patch_t *cursor;
|
||||
INT32 curx = (((setupm_skinselect % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH/2)) + SKINXSHIFT) + 20;
|
||||
INT32 cury = (((setupm_skinselect / SKINGRIDNEWWIDTH) - setupm_skinypos) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2))+ 10);
|
||||
INT32 cury = (((setupm_skinselect / SKINGRIDNEWWIDTH) - setupm_skinypos) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2))+ gridyoffset);
|
||||
|
||||
UINT8 cursorframe = (I_GetTime() / 4) % 7;
|
||||
cursor = (patch_t *)W_CachePatchName(va("K_CHILI%d", cursorframe + 1), PU_PATCH);
|
||||
@@ -8232,13 +8339,13 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
weight = skins[selectedskin].kartweight;
|
||||
statdot = (patch_t *)W_CachePatchName("K_SDOT1", PU_PATCH);
|
||||
if (skullAnimCounter < 4) // SRB2Kart: we draw this dot later so that it's not covered if there's multiple skins with the same stats
|
||||
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, flashcol);
|
||||
V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, flashcol);
|
||||
else
|
||||
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
|
||||
V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
|
||||
|
||||
statdot = (patch_t *)W_CachePatchName("K_SDOT2", PU_PATCH); // coloured center
|
||||
if (setupm_fakecolor)
|
||||
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, R_GetTranslationColormap(0, setupm_fakecolor, GTC_MENUCACHE));
|
||||
V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, R_GetTranslationColormap(0, setupm_fakecolor, GTC_MENUCACHE));
|
||||
}
|
||||
break;
|
||||
case SKINMENUTYPE_2D:
|
||||
@@ -8289,6 +8396,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
}
|
||||
}
|
||||
break;
|
||||
#undef GRIDSTATOFFSET
|
||||
#undef SKINXSHIFT
|
||||
default:
|
||||
speed = skins[setupm_fakeskin].kartspeed;
|
||||
@@ -9639,14 +9747,11 @@ static void M_ResetControls(INT32 choice)
|
||||
// ===============
|
||||
|
||||
//added : 30-01-98:
|
||||
#define MAXCOLUMNMODES 12 //max modes displayed in one column
|
||||
#define MAXMODEDESCS (MAXCOLUMNMODES*3)
|
||||
|
||||
static modedesc_t modedescs[MAXMODEDESCS];
|
||||
|
||||
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;
|
||||
|
||||
(void)choice;
|
||||
@@ -9660,54 +9765,30 @@ static void M_VideoModeMenu(INT32 choice)
|
||||
nummodes = VID_NumModes();
|
||||
|
||||
// DOS does not skip mode 0, because mode 0 is ALWAYS present
|
||||
i = 0;
|
||||
for (; i < nummodes && vidm_nummodes < MAXMODEDESCS; i++)
|
||||
for (i = 0; i < nummodes && vidm_nummodes < MAXMODEDESCS; i++)
|
||||
{
|
||||
desc = VID_GetModeName(i);
|
||||
if (desc)
|
||||
{
|
||||
vdup = 0;
|
||||
|
||||
// when a resolution exists both under VGA and VESA, keep the
|
||||
// VESA mode, which is always a higher modenum
|
||||
for (j = 0; j < vidm_nummodes; j++)
|
||||
{
|
||||
if (fastcmp(modedescs[j].desc, desc))
|
||||
{
|
||||
// mode(0): 320x200 is always standard VGA, not vesa
|
||||
if (modedescs[j].modenum)
|
||||
{
|
||||
modedescs[j].modenum = i;
|
||||
vdup = 1;
|
||||
if (!desc)
|
||||
continue;
|
||||
|
||||
if (i == vid.modenum)
|
||||
vidm_selected = j;
|
||||
}
|
||||
else
|
||||
vdup = 1;
|
||||
modedescs[vidm_nummodes].modenum = i;
|
||||
modedescs[vidm_nummodes].desc = desc;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == vid.modenum)
|
||||
vidm_selected = vidm_nummodes;
|
||||
|
||||
if (!vdup)
|
||||
{
|
||||
modedescs[vidm_nummodes].modenum = i;
|
||||
modedescs[vidm_nummodes].desc = desc;
|
||||
// Pull out the width and height
|
||||
sscanf(desc, "%u%*c%u", &width, &height);
|
||||
|
||||
if (i == vid.modenum)
|
||||
vidm_selected = vidm_nummodes;
|
||||
// Show resolutions above desktop res as red.
|
||||
if (I_CheckAboveDesktopRes(width, height))
|
||||
modedescs[vidm_nummodes].goodratio = 2;
|
||||
// Show multiples of 320x200 as green.
|
||||
else if (SCR_IsAspectCorrect(width, height))
|
||||
modedescs[vidm_nummodes].goodratio = 1;
|
||||
|
||||
// Pull out the width and height
|
||||
sscanf(desc, "%u%*c%u", &width, &height);
|
||||
|
||||
// Show multiples of 320x200 as green.
|
||||
if (SCR_IsAspectCorrect(width, height))
|
||||
modedescs[vidm_nummodes].goodratio = 1;
|
||||
|
||||
vidm_nummodes++;
|
||||
}
|
||||
}
|
||||
vidm_nummodes++;
|
||||
}
|
||||
|
||||
vidm_column_size = (vidm_nummodes+2) / 3;
|
||||
@@ -9924,7 +10005,11 @@ static void M_DrawVideoMode(void)
|
||||
V_DrawString(row, col, highlightflags|MENUCAPS, modedescs[i].desc);
|
||||
// Show multiples of 320x200 as green.
|
||||
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;
|
||||
if ((i % vidm_column_size) == (vidm_column_size-1))
|
||||
@@ -9963,9 +10048,26 @@ static void M_DrawVideoMode(void)
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 138,
|
||||
recommendedflags|MENUCAPS, "Marked modes are recommended.");
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 146,
|
||||
highlightflags|MENUCAPS, "Other modes may have visual errors.");
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 158,
|
||||
highlightflags|MENUCAPS, "Larger modes may have performance issues.");
|
||||
warningflags|MENUCAPS, "Marked modes are above Desktop resolution");
|
||||
|
||||
if (rendermode == render_opengl)
|
||||
{
|
||||
#ifdef USE_FBO_OGL
|
||||
if (!cv_glframebuffer.value)
|
||||
#endif
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 154,
|
||||
warningflags|MENUCAPS, "and will have visual errors in OpenGL mode.");
|
||||
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 166,
|
||||
highlightflags|MENUCAPS, "Other modes may have visual errors.");
|
||||
}
|
||||
else
|
||||
{
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 154,
|
||||
highlightflags|MENUCAPS, "Other modes may have visual errors.");
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, OP_VideoModeDef.y + 166,
|
||||
highlightflags|MENUCAPS, "Larger modes may have performance issues.");
|
||||
}
|
||||
}
|
||||
|
||||
// Draw the cursor for the VidMode menu
|
||||
|
||||
@@ -50,6 +50,9 @@ void M_Drawer(void);
|
||||
// Called by D_SRB2Main, loads the config file.
|
||||
void M_Init(void);
|
||||
|
||||
// Called by D_SRB2Main also, sets up the playermenu and description tables.
|
||||
void M_InitCharacterTables(void);
|
||||
|
||||
// Called by intro code to force menu up upon a keypress,
|
||||
// does nothing if menu is already up.
|
||||
void M_StartControlPanel(void);
|
||||
@@ -81,6 +84,11 @@ typedef enum
|
||||
} menumessagetype_t;
|
||||
void M_StartMessage(const char *string, void *routine, menumessagetype_t itemtype);
|
||||
|
||||
extern boolean DPADUPSCROLL;
|
||||
extern boolean DPADDOWNSCROLL;
|
||||
extern boolean DPADLEFTSCROLL;
|
||||
extern boolean DPADRIGHTSCROLL;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
M_NOT_WAITING,
|
||||
@@ -160,6 +168,8 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt);
|
||||
|
||||
#define MAXMENUCCVARS 999
|
||||
|
||||
#define MAXTOOLTIPS 255
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct menu_s *submenu; // IT_SUBMENU
|
||||
@@ -185,6 +195,8 @@ typedef struct menuitem_s
|
||||
UINT16 alphaKey;
|
||||
} menuitem_t;
|
||||
|
||||
extern menuitem_t PlayerMenu[MAXSKINS];
|
||||
|
||||
typedef struct menu_s
|
||||
{
|
||||
const char *menutitlepic;
|
||||
@@ -211,10 +223,23 @@ extern menu_t *currentMenu;
|
||||
extern menu_t MainDef;
|
||||
extern menu_t SP_LoadDef;
|
||||
|
||||
#define MAXCOLUMNMODES 12 //max modes displayed in one column
|
||||
#define MAXMODEDESCS (MAXCOLUMNMODES*3)
|
||||
extern menu_t OP_VideoModeDef;
|
||||
void M_VideoModeMenu(INT32 choice);
|
||||
|
||||
// Call upon joystick hotplug
|
||||
void M_SetupJoystickMenu(INT32 choice);
|
||||
extern menu_t OP_JoystickSetDef;
|
||||
|
||||
// Stuff for customizing the player select screen
|
||||
typedef struct
|
||||
{
|
||||
char notes[441];
|
||||
char picname[8];
|
||||
char skinname[SKINNAMESIZE*2+2]; // skin&skin\0
|
||||
} description_t;
|
||||
|
||||
// mode descriptions for video mode menu
|
||||
typedef struct
|
||||
{
|
||||
@@ -242,6 +267,8 @@ typedef struct
|
||||
|
||||
extern INT32 mapwads[NUMMAPS];
|
||||
|
||||
extern description_t description[MAXSKINS];
|
||||
|
||||
extern consvar_t cv_replaysearchrate;
|
||||
extern consvar_t cv_showfocuslost;
|
||||
extern consvar_t cv_newgametype, cv_nextmap, cv_chooseskin, cv_serversort;
|
||||
|
||||
+52
-50
@@ -495,6 +495,12 @@ static menuitem_t SP_LevelStatsMenu[] =
|
||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelStats, '\0'}, // dummy menuitem for the control func
|
||||
};
|
||||
|
||||
// A rare case.
|
||||
// External files modify this menu, so we can't call it static.
|
||||
// And I'm too lazy to go through and rename it everywhere. ARRGH!
|
||||
#define M_ChoosePlayer NULL
|
||||
menuitem_t PlayerMenu[MAXSKINS];
|
||||
|
||||
// -----------------------------------
|
||||
// Multiplayer and all of its submenus
|
||||
// -----------------------------------
|
||||
@@ -1018,17 +1024,17 @@ static menuitem_t OP_OpenGLOptionsMenu[] =
|
||||
{IT_STRING | IT_CVAR, NULL, "Shaders", &cv_glshaders, 25},
|
||||
{IT_STRING | IT_CVAR, NULL, "Palette Rendering", &cv_glpaletterendering, 30},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Texture Quality", &cv_gltexturedepth, 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Texture Filter", &cv_glfiltermode, 45},
|
||||
{IT_STRING | IT_CVAR, NULL, "Anisotropic", &cv_glanisotropicmode, 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Visual Portals", &cv_glportals, 55},
|
||||
{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, "Anisotropic", &cv_glanisotropicmode, 55},
|
||||
{IT_STRING | IT_CVAR, NULL, "Visual Portals", &cv_glportals, 60},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Wall Contrast Style", &cv_glfakecontrast, 65},
|
||||
{IT_STRING | IT_CVAR, NULL, "Slope Contrast", &cv_glslopecontrast, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Dithered Lightning", &cv_gllightdither, 75},
|
||||
{IT_STRING | IT_CVAR, NULL, "Sprite Billboarding", &cv_glspritebillboarding, 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Software Perspective", &cv_glshearing, 85},
|
||||
{IT_STRING | IT_CVAR, NULL, "Rendering Distance", &cv_glrenderdistance, 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Wall Contrast Style", &cv_glfakecontrast, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Slope Contrast", &cv_glslopecontrast, 75},
|
||||
{IT_STRING | IT_CVAR, NULL, "Dithered Lightning", &cv_gllightdither, 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Sprite Billboarding", &cv_glspritebillboarding, 85},
|
||||
{IT_STRING | IT_CVAR, NULL, "Software Perspective", &cv_glshearing, 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Rendering Distance", &cv_glrenderdistance, 95},
|
||||
};
|
||||
|
||||
static const char* OP_OpenGLTooltips[] =
|
||||
@@ -1185,20 +1191,20 @@ static menuitem_t OP_FocusOptionsMenu[] =
|
||||
{
|
||||
{IT_HEADER, NULL, "Game Focus Options", NULL, 0},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", &cv_playmusicifunfocused, 10},
|
||||
{IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", &cv_playsoundifunfocused, 20},
|
||||
{IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", &cv_playmusicifunfocused, 30},
|
||||
{IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", &cv_playsoundifunfocused, 40},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Pause Game While Unfocused", &cv_pauseifunfocused, 40},
|
||||
{IT_STRING|IT_CVAR, NULL, "Pause Game While Unfocused", &cv_pauseifunfocused, 60},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Background FPS Cap", &cv_fpscapbg, 60},
|
||||
{IT_STRING|IT_CVAR, NULL, "Background FPS Cap", &cv_fpscapbg, 80},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost, 80},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost, 100},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Visible Mouse", &cv_mousevisible, 100},
|
||||
{IT_STRING|IT_CVAR, NULL, "Visible Mouse", &cv_mousevisible, 120},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad LED Color While Unfocused ", &cv_gamepadledifunfocused, 140},
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad Rumble While Unfocused", &cv_rumbleifunfocused, 150},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad Inputs While Unfocused", &cv_gamepadifunfocused, 120},
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad LED Color While Unfocused ", &cv_gamepadledifunfocused, 130},
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad Rumble While Unfocused", &cv_rumbleifunfocused, 140},
|
||||
};
|
||||
|
||||
static const char* OP_FocusOptionsTooltips[] =
|
||||
@@ -1210,7 +1216,6 @@ static const char* OP_FocusOptionsTooltips[] =
|
||||
"Set manual framerate cap while the game is unfocused.",
|
||||
"Should the FOCUS LOST window appear\n while the game is unfocused?",
|
||||
"Displays the mouse cursor while the game is in focus.",
|
||||
"Should gamepad still control the game when unfocused?",
|
||||
"Should gamepad LED indicator change color when unfocused?",
|
||||
"Should gamepad rumble apply when unfocused?",
|
||||
};
|
||||
@@ -1305,29 +1310,29 @@ static menuitem_t OP_DiscordOptionsMenu[] =
|
||||
|
||||
static menuitem_t OP_HUDOptionsMenu[] =
|
||||
{
|
||||
{IT_STRING | IT_CVAR, NULL, "Show HUD (F3)", &cv_showhud, 10},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show HUD (F3)", &cv_showhud, 10},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "HUD Visibility", &cv_translucenthud, 20},
|
||||
NULL, "HUD Visibility", &cv_translucenthud, 20},
|
||||
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Online HUD options...", &OP_ChatOptionsDef, 35},
|
||||
{IT_STRING | IT_CVAR, NULL, "Background Glass", &cons_backcolor, 45},
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Online HUD options...", &OP_ChatOptionsDef, 35},
|
||||
{IT_STRING | IT_CVAR, NULL, "Background Glass", &cons_backcolor, 45},
|
||||
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "Minimap Visibility", &cv_kartminimap, 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Speedometer Display", &cv_kartspeedometer, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show \"CHECK\"", &cv_kartcheck, 80},
|
||||
NULL, "Minimap Visibility", &cv_kartminimap, 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Speedometer Display", &cv_kartspeedometer, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show \"CHECK\"", &cv_kartcheck, 80},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Menu Highlights", &cons_menuhighlight, 95},
|
||||
{IT_STRING | IT_CVAR, NULL, "Menu Highlights", &cons_menuhighlight, 95},
|
||||
// highlight info - (GOOD HIGHLIGHT, WARNING HIGHLIGHT) - 110 (see M_DrawHUDOptions)
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Console Text Size", &cv_constextsize, 120},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Console Prints in Menu",&cons_consoleprintinmenu, 130},
|
||||
{IT_STRING | IT_CVAR, NULL, "Console Text Size", &cv_constextsize, 120},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Console Prints in Menu",&cons_consoleprintinmenu, 130},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Track Addon Name", &cv_showtrackaddon, 145},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Track Addon Name", &cv_showtrackaddon, 145},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Show All Maps", &cv_showallmaps, 155},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show All Maps", &cv_showallmaps, 155},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "2D character select", &cv_skinselectmenu, 165},
|
||||
{IT_STRING | IT_CVAR, NULL, "2D character select", &cv_skinselectmenu, 165},
|
||||
};
|
||||
|
||||
static menuitem_t OP_CamOptionsMenu[] =
|
||||
@@ -1848,28 +1853,26 @@ static menuitem_t OP_SaturnHudMenu[] =
|
||||
{IT_STRING|IT_CVAR, NULL, "Item Amount Number", &cv_huditemamount, 110},
|
||||
{IT_STRING|IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 115},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Item Roulette Color", &cv_roulettecolor, 120},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 125},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 130},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 130},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 135},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 140},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Finished on Minimap", &cv_showminimapfinished, 145},
|
||||
{IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 150},
|
||||
{IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 155},
|
||||
{IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 160},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 145},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Finished on Minimap", &cv_showminimapfinished, 150},
|
||||
{IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 155},
|
||||
{IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 160},
|
||||
{IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 165},
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 170},
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits on Pause", &cv_pausesongcredits, 175},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 175},
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits on Pause", &cv_pausesongcredits, 180},
|
||||
{IT_STRING|IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 185},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 190},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 195},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 200},
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 205},
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 210},
|
||||
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 210},
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 215},
|
||||
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 225},
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 220},
|
||||
};
|
||||
|
||||
static const char* OP_SaturnHudTooltips[] =
|
||||
@@ -1890,7 +1893,6 @@ static const char* OP_SaturnHudTooltips[] =
|
||||
"Use extra graphics for multiple sneakers, bananas and jawz.",
|
||||
"Change when the item amount is to be displayed.\nMultiple will always display the number.\nWhen you have multiple of the same Item.\nAlways will always display the number regardless of Item amount.",
|
||||
"Enables an animation while the roulette is active.",
|
||||
"Changes the way items are colorized in roulette.",
|
||||
"Show the big 'LAP' text on a lap change.",
|
||||
"Show the big Cecho Messages.",
|
||||
"Show player names on the minimap.",
|
||||
|
||||
+1
-1
@@ -256,7 +256,7 @@ static boolean M_TextInputHandleBase(textinput_t *input, INT32 key, boolean emot
|
||||
return true;
|
||||
}
|
||||
|
||||
if (ctrldown && (cv_keyboardlayout.value != 3 || !altdown))
|
||||
if (ctrldown && (cv_keyboardlayout.value!=3 || !altdown))
|
||||
{
|
||||
if (key == 'x' || key == 'X')
|
||||
{
|
||||
|
||||
+58
-19
@@ -306,6 +306,7 @@ void P_NewChaseDir(mobj_t *actor)
|
||||
dirtype_t d[3];
|
||||
dirtype_t tdir = DI_NODIR, olddir, turnaround;
|
||||
|
||||
I_Assert(actor->target != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(actor->target));
|
||||
|
||||
olddir = actor->movedir;
|
||||
@@ -328,7 +329,7 @@ void P_NewChaseDir(mobj_t *actor)
|
||||
else
|
||||
d[1] = DI_NODIR;
|
||||
|
||||
if (UNLIKELY(twodlevel || actor->flags2 & MF2_TWOD))
|
||||
if (twodlevel || actor->flags2 & MF2_TWOD)
|
||||
d[2] = DI_NODIR;
|
||||
if (deltay < -FixedMul(10*FRACUNIT, actor->scale))
|
||||
d[2] = DI_SOUTH;
|
||||
@@ -618,6 +619,7 @@ void A_Chase(void *thing)
|
||||
if (LUA_CallAction(A_CHASE, actor))
|
||||
return;
|
||||
|
||||
I_Assert(actor != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(actor));
|
||||
|
||||
if (actor->reactiontime)
|
||||
@@ -872,7 +874,7 @@ void A_PointyThink(void *thing)
|
||||
TVector v;
|
||||
TVector *res;
|
||||
angle_t fa;
|
||||
fixed_t radius;
|
||||
fixed_t radius = FixedMul(actor->info->radius*actor->info->reactiontime, actor->scale);
|
||||
boolean firsttime = true;
|
||||
INT32 sign;
|
||||
|
||||
@@ -930,8 +932,6 @@ void A_PointyThink(void *thing)
|
||||
if (!actor->tracer) // For some reason we do not have spike balls...
|
||||
return;
|
||||
|
||||
radius = FixedMul(actor->info->radius*actor->info->reactiontime, actor->scale);
|
||||
|
||||
// Position spike balls relative to the value of 'lastlook'.
|
||||
ball = actor->tracer;
|
||||
|
||||
@@ -1531,7 +1531,10 @@ void A_LobShot(void *thing)
|
||||
|
||||
if (!(actor->flags & MF_BOSS))
|
||||
{
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
if (ultimatemode)
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE;
|
||||
else
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1567,7 +1570,10 @@ void A_FireShot(void *thing)
|
||||
|
||||
if (!(actor->flags & MF_BOSS))
|
||||
{
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
if (ultimatemode)
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE;
|
||||
else
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1607,7 +1613,10 @@ void A_SuperFireShot(void *thing)
|
||||
|
||||
if (!(actor->flags & MF_BOSS))
|
||||
{
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
if (ultimatemode)
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE;
|
||||
else
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2761,11 +2770,9 @@ void A_Invincibility(void *thing)
|
||||
if (P_IsLocalPlayer(player) && !player->powers[pw_super])
|
||||
{
|
||||
S_StopMusic();
|
||||
|
||||
if (UNLIKELY(mariomode))
|
||||
if (mariomode)
|
||||
G_GhostAddColor((INT32) (player - players), GHC_INVINCIBLE);
|
||||
|
||||
S_ChangeMusicInternal((UNLIKELY(mariomode)) ? "minvnc" : "invinc", false);
|
||||
S_ChangeMusicInternal((mariomode) ? "minvnc" : "invinc", false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2863,6 +2870,12 @@ void A_ExtraLife(void *thing)
|
||||
if (actor->type == MT_1UPICO && !actor->tracer)
|
||||
actor->frame -= 2; // No lives icon for this player, use the default.
|
||||
|
||||
if (ultimatemode) //I don't THINK so!
|
||||
{
|
||||
S_StartSound(player->mo, sfx_lose);
|
||||
return;
|
||||
}
|
||||
|
||||
// In shooter gametypes, give the player 100 rings instead of an extra life.
|
||||
if (gametype != GT_COOP && gametype != GT_COMPETITION)
|
||||
P_GivePlayerRings(player, 100);
|
||||
@@ -4002,13 +4015,26 @@ void A_JetChase(void *thing)
|
||||
}
|
||||
|
||||
// chase towards player
|
||||
P_Thrust(actor, actor->angle, FixedMul(actor->info->speed/4, actor->scale));
|
||||
if (ultimatemode)
|
||||
P_Thrust(actor, actor->angle, FixedMul(actor->info->speed/2, actor->scale));
|
||||
else
|
||||
P_Thrust(actor, actor->angle, FixedMul(actor->info->speed/4, actor->scale));
|
||||
|
||||
// must adjust height
|
||||
if (actor->z < (actor->target->z + actor->target->height + FixedMul((32<<FRACBITS), actor->scale)))
|
||||
actor->momz += FixedMul(FRACUNIT/2, actor->scale);
|
||||
if (ultimatemode)
|
||||
{
|
||||
if (actor->z < (actor->target->z + actor->target->height + FixedMul((64<<FRACBITS), actor->scale)))
|
||||
actor->momz += FixedMul(FRACUNIT/2, actor->scale);
|
||||
else
|
||||
actor->momz -= FixedMul(FRACUNIT/2, actor->scale);
|
||||
}
|
||||
else
|
||||
actor->momz -= FixedMul(FRACUNIT/2, actor->scale);
|
||||
{
|
||||
if (actor->z < (actor->target->z + actor->target->height + FixedMul((32<<FRACBITS), actor->scale)))
|
||||
actor->momz += FixedMul(FRACUNIT/2, actor->scale);
|
||||
else
|
||||
actor->momz -= FixedMul(FRACUNIT/2, actor->scale);
|
||||
}
|
||||
}
|
||||
|
||||
// Function: A_JetbThink
|
||||
@@ -4111,7 +4137,10 @@ void A_JetgShoot(void *thing)
|
||||
A_FaceTarget(actor);
|
||||
P_SpawnMissile(actor, actor->target, (mobjtype_t)actor->info->raisestate);
|
||||
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
if (ultimatemode)
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE;
|
||||
else
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
|
||||
if (actor->info->attacksound)
|
||||
S_StartSound(actor, actor->info->attacksound);
|
||||
@@ -6434,8 +6463,12 @@ void A_BuzzFly(void *thing)
|
||||
// chase towards player
|
||||
{
|
||||
INT32 dist, realspeed;
|
||||
const fixed_t mf = 5*(FRACUNIT/4);
|
||||
|
||||
realspeed = FixedMul(actor->info->speed, actor->scale);
|
||||
if (ultimatemode)
|
||||
realspeed = FixedMul(FixedMul(actor->info->speed,mf), actor->scale);
|
||||
else
|
||||
realspeed = FixedMul(actor->info->speed, actor->scale);
|
||||
|
||||
dist = P_AproxDistance(P_AproxDistance(actor->target->x - actor->x,
|
||||
actor->target->y - actor->y), actor->target->z - actor->z);
|
||||
@@ -9223,7 +9256,10 @@ void A_MultiShot(void *thing)
|
||||
|
||||
if (!(actor->flags & MF_BOSS))
|
||||
{
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
if (ultimatemode)
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE;
|
||||
else
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10832,7 +10868,10 @@ void A_BrakFireShot(void *thing)
|
||||
|
||||
if (!(actor->flags & MF_BOSS))
|
||||
{
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
if (ultimatemode)
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE;
|
||||
else
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+8
-12
@@ -845,7 +845,7 @@ void T_BounceCheese(levelspecthink_t *bouncer)
|
||||
T_MovePlane(bouncer->sector, 0, bouncer->sector->ceilingheight, 0, 1, -1); // update things on ceiling
|
||||
T_MovePlane(bouncer->sector, 0, bouncer->sector->floorheight, 0, 0, -1); // update things on floor
|
||||
bouncer->sector->ceilingdata = NULL;
|
||||
bouncer->sector->floordata = NULL;
|
||||
bouncer->sector->floordata = NULL;;
|
||||
bouncer->sector->moved = true;
|
||||
P_RemoveThinker(&bouncer->thinker); // remove bouncer from actives
|
||||
}
|
||||
@@ -1107,13 +1107,14 @@ void T_SpikeSector(levelspecthink_t *spikes)
|
||||
|
||||
if (affectsec == spikes->sector) // Applied to an actual sector
|
||||
{
|
||||
fixed_t affectfloor = P_GetSpecialBottomZ(thing, affectsec, affectsec);
|
||||
fixed_t affectceil = P_GetSpecialTopZ(thing, affectsec, affectsec);
|
||||
|
||||
if (affectsec->flags & SF_FLIPSPECIAL_FLOOR)
|
||||
{
|
||||
if (!(thing->eflags & MFE_VERTICALFLIP) && thing->momz > 0)
|
||||
continue;
|
||||
|
||||
fixed_t affectfloor = P_GetSpecialBottomZ(thing, affectsec, affectsec);
|
||||
|
||||
if (thing->z == affectfloor)
|
||||
dothepain = true;
|
||||
}
|
||||
@@ -1123,21 +1124,19 @@ void T_SpikeSector(levelspecthink_t *spikes)
|
||||
if ((thing->eflags & MFE_VERTICALFLIP) && thing->momz < 0)
|
||||
continue;
|
||||
|
||||
fixed_t affectceil = P_GetSpecialTopZ(thing, affectsec, affectsec);
|
||||
|
||||
if (thing->z + thing->height == affectceil)
|
||||
dothepain = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fixed_t affectfloor = P_GetSpecialBottomZ(thing, affectsec, spikes->sector);
|
||||
fixed_t affectceil = P_GetSpecialTopZ(thing, affectsec, spikes->sector);
|
||||
if (affectsec->flags & SF_FLIPSPECIAL_FLOOR)
|
||||
{
|
||||
if (!(thing->eflags & MFE_VERTICALFLIP) && thing->momz > 0)
|
||||
continue;
|
||||
|
||||
fixed_t affectceil = P_GetSpecialTopZ(thing, affectsec, spikes->sector);
|
||||
|
||||
if (thing->z == affectceil)
|
||||
dothepain = true;
|
||||
}
|
||||
@@ -1147,8 +1146,6 @@ void T_SpikeSector(levelspecthink_t *spikes)
|
||||
if ((thing->eflags & MFE_VERTICALFLIP) && thing->momz < 0)
|
||||
continue;
|
||||
|
||||
fixed_t affectfloor = P_GetSpecialBottomZ(thing, affectsec, spikes->sector);
|
||||
|
||||
if (thing->z + thing->height == affectfloor)
|
||||
dothepain = true;
|
||||
}
|
||||
@@ -1655,7 +1652,6 @@ wegotit:
|
||||
static mobj_t *SearchMarioNode(msecnode_t *node)
|
||||
{
|
||||
mobj_t *thing = NULL;
|
||||
|
||||
for (; node; node = node->m_thinglist_next)
|
||||
{
|
||||
// Things which should NEVER be ejected from a MarioBlock, by type.
|
||||
@@ -1898,6 +1894,7 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies)
|
||||
{
|
||||
if (nobaddies->sector->lines[i]->special == 223)
|
||||
{
|
||||
|
||||
upperbound = nobaddies->sector->ceilingheight;
|
||||
lowerbound = nobaddies->sector->floorheight;
|
||||
|
||||
@@ -2083,12 +2080,11 @@ void T_EachTimeThinker(levelspecthink_t *eachtime)
|
||||
continue;
|
||||
|
||||
topheight = P_GetSpecialTopZ(players[j].mo, sec, targetsec);
|
||||
bottomheight = P_GetSpecialBottomZ(players[j].mo, sec, targetsec);
|
||||
|
||||
if (players[j].mo->z > topheight)
|
||||
continue;
|
||||
|
||||
bottomheight = P_GetSpecialBottomZ(players[j].mo, sec, targetsec);
|
||||
|
||||
if (players[j].mo->z + players[j].mo->height < bottomheight)
|
||||
continue;
|
||||
|
||||
|
||||
+1
-1
@@ -1624,7 +1624,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
|
||||
// Drop stuff.
|
||||
// This determines the kind of object spawned
|
||||
// during the death frame of a thing.
|
||||
if (LIKELY(!mariomode) // Don't show birds, etc. in Mario Mode Tails 12-23-2001
|
||||
if (!mariomode // Don't show birds, etc. in Mario Mode Tails 12-23-2001
|
||||
&& target->flags & MF_ENEMY)
|
||||
{
|
||||
if (cv_soniccd.value)
|
||||
|
||||
@@ -99,6 +99,10 @@ typedef struct camera_s
|
||||
// Hold up/down to pan the camera vertically
|
||||
SINT8 dpad_y_held;
|
||||
|
||||
// Things used by FS cameras.
|
||||
fixed_t viewheight;
|
||||
angle_t startangle;
|
||||
|
||||
// Camera demobjerization
|
||||
// Info for drawing: position.
|
||||
fixed_t x, y, z;
|
||||
@@ -117,6 +121,8 @@ typedef struct camera_s
|
||||
fixed_t radius;
|
||||
fixed_t height;
|
||||
|
||||
fixed_t relativex;
|
||||
|
||||
// Momentums, used to update position.
|
||||
fixed_t momx, momy, momz;
|
||||
|
||||
@@ -213,6 +219,7 @@ void P_DoJumpShield(player_t *player);
|
||||
void P_BlackOw(player_t *player);
|
||||
void P_ElementalFireTrail(player_t *player);
|
||||
|
||||
//void P_DoPityCheck(player_t *player);
|
||||
void P_PlayerThink(player_t *player);
|
||||
void P_PlayerAfterThink(player_t *player);
|
||||
void P_DoPlayerExit(player_t *player);
|
||||
@@ -273,6 +280,7 @@ void P_RemoveMobj(mobj_t *th);
|
||||
void P_RemoveSavegameMobj(mobj_t *th);
|
||||
boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state);
|
||||
boolean P_SetMobjState(mobj_t *mobj, statenum_t state);
|
||||
//void P_RunShields(void);
|
||||
void P_RunOverlays(void);
|
||||
void P_RunShadows(void);
|
||||
void P_MobjThinker(mobj_t *mobj);
|
||||
|
||||
+38
-46
@@ -189,12 +189,12 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
||||
}
|
||||
|
||||
if (vertispeed)
|
||||
object->momz = FixedMul(vertispeed, FixedSqrt(FixedMul(vscale, spring->scale)));
|
||||
object->momz = FixedMul(vertispeed,FixedSqrt(FixedMul(vscale, spring->scale)));
|
||||
|
||||
if (horizspeed)
|
||||
{
|
||||
if (!object->player)
|
||||
P_InstaThrustEvenIn2D(object, spring->angle, FixedMul(horizspeed, FixedSqrt(FixedMul(hscale, spring->scale))));
|
||||
P_InstaThrustEvenIn2D(object, spring->angle, FixedMul(horizspeed,FixedSqrt(FixedMul(hscale, spring->scale))));
|
||||
else
|
||||
{
|
||||
fixed_t finalSpeed = FixedDiv(horizspeed, hscale);
|
||||
@@ -203,7 +203,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
||||
if (pSpeed > finalSpeed)
|
||||
finalSpeed = pSpeed;
|
||||
|
||||
P_InstaThrustEvenIn2D(object, spring->angle, FixedMul(finalSpeed, FixedSqrt(FixedMul(hscale, spring->scale))));
|
||||
P_InstaThrustEvenIn2D(object, spring->angle, FixedMul(finalSpeed,FixedSqrt(FixedMul(hscale, spring->scale))));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -321,7 +321,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||
|
||||
// Ignore spectators
|
||||
if ((tmthing->player && tmthing->player->spectator)
|
||||
|| (thing->player && thing->player->spectator))
|
||||
|| (thing->player && thing->player->spectator))
|
||||
return true;
|
||||
|
||||
#ifdef SEENAMES
|
||||
@@ -1509,15 +1509,15 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||
// Adjusts tmfloorz and tmceilingz as lines are contacted - FOR CAMERA ONLY
|
||||
static boolean PIT_CheckCameraLine(line_t *ld)
|
||||
{
|
||||
if (tmbbox[BOXRIGHT] <= ld->bbox[BOXLEFT] ||
|
||||
tmbbox[BOXLEFT] >= ld->bbox[BOXRIGHT] ||
|
||||
tmbbox[BOXTOP] <= ld->bbox[BOXBOTTOM] ||
|
||||
tmbbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
|
||||
return true;
|
||||
|
||||
if (ld->polyobj && !(ld->polyobj->flags & POF_SOLID))
|
||||
return true;
|
||||
|
||||
if (tmbbox[BOXRIGHT] <= ld->bbox[BOXLEFT] || tmbbox[BOXLEFT] >= ld->bbox[BOXRIGHT]
|
||||
|| tmbbox[BOXTOP] <= ld->bbox[BOXBOTTOM] || tmbbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (P_BoxOnLineSide(tmbbox, ld) != -1)
|
||||
return true;
|
||||
|
||||
@@ -1571,13 +1571,11 @@ static boolean PIT_CheckCameraLine(line_t *ld)
|
||||
//
|
||||
static boolean PIT_CheckLine(line_t *ld)
|
||||
{
|
||||
if (tmbbox[BOXRIGHT] <= ld->bbox[BOXLEFT] ||
|
||||
tmbbox[BOXLEFT] >= ld->bbox[BOXRIGHT] ||
|
||||
tmbbox[BOXTOP] <= ld->bbox[BOXBOTTOM] ||
|
||||
tmbbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
|
||||
if (ld->polyobj && !(ld->polyobj->flags & POF_SOLID))
|
||||
return true;
|
||||
|
||||
if (ld->polyobj && !(ld->polyobj->flags & POF_SOLID))
|
||||
if (tmbbox[BOXRIGHT] <= ld->bbox[BOXLEFT] || tmbbox[BOXLEFT] >= ld->bbox[BOXRIGHT]
|
||||
|| tmbbox[BOXTOP] <= ld->bbox[BOXBOTTOM] || tmbbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
|
||||
return true;
|
||||
|
||||
if (P_BoxOnLineSide(tmbbox, ld) != -1)
|
||||
@@ -1586,12 +1584,10 @@ static boolean PIT_CheckLine(line_t *ld)
|
||||
if (tmthing->flags & MF_PAPERCOLLISION) // Caution! Turning whilst up against a wall will get you stuck. You probably shouldn't give the player this flag.
|
||||
{
|
||||
fixed_t cosradius, sinradius;
|
||||
|
||||
cosradius = FixedMul(tmthing->radius, FINECOSINE(tmthing->angle>>ANGLETOFINESHIFT));
|
||||
sinradius = FixedMul(tmthing->radius, FINESINE(tmthing->angle>>ANGLETOFINESHIFT));
|
||||
|
||||
if (P_PointOnLineSide(tmx - cosradius, tmy - sinradius, ld)
|
||||
== P_PointOnLineSide(tmx + cosradius, tmy + sinradius, ld))
|
||||
== P_PointOnLineSide(tmx + cosradius, tmy + sinradius, ld))
|
||||
return true; // the line doesn't cross between collider's start or end
|
||||
}
|
||||
|
||||
@@ -2373,7 +2369,6 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
|
||||
fixed_t radius = thing->radius;
|
||||
fixed_t thingtop ;//= thing->z + thing->height;
|
||||
fixed_t startingonground = P_IsObjectOnGround(thing);
|
||||
INT32 special = -1;
|
||||
floatok = false;
|
||||
|
||||
if (radius < MAXRADIUS/2)
|
||||
@@ -2407,31 +2402,21 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
|
||||
|
||||
if (!(thing->flags & MF_NOCLIP))
|
||||
{
|
||||
// All things are affected by their scale.
|
||||
fixed_t maxstep;
|
||||
|
||||
if (tmceilingz - tmfloorz < thing->height)
|
||||
{
|
||||
if (tmfloorthing)
|
||||
tmhitthing = tmfloorthing;
|
||||
|
||||
return false; // doesn't fit
|
||||
}
|
||||
|
||||
maxstep = FixedMul(MAXSTEPMOVE, mapobjectscale);
|
||||
//All things are affected by their scale.
|
||||
fixed_t maxstep = FixedMul(MAXSTEPMOVE, mapobjectscale);
|
||||
INT32 special = 0;
|
||||
|
||||
if (thing->player)
|
||||
{
|
||||
if (special == -1)
|
||||
special = GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1);
|
||||
special = GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1);
|
||||
|
||||
// If using type Section1:13, double the maxstep.
|
||||
if (special == 13 || P_PlayerTouchingSectorSpecial(thing->player, 1, 13))
|
||||
if (P_PlayerTouchingSectorSpecial(thing->player, 1, 13) || special == 13)
|
||||
{
|
||||
maxstep <<= 1;
|
||||
}
|
||||
// If using type Section1:12, no maxstep. For ledges you don't want the player to climb! (see: Egg Zeppelin & SMK port walls)
|
||||
else if (special == 12 || P_PlayerTouchingSectorSpecial(thing->player, 1, 12))
|
||||
else if (P_PlayerTouchingSectorSpecial(thing->player, 1, 12) || special == 12)
|
||||
{
|
||||
maxstep = 0;
|
||||
}
|
||||
@@ -2442,6 +2427,14 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
|
||||
maxstep = 0;
|
||||
}
|
||||
|
||||
if (tmceilingz - tmfloorz < thing->height)
|
||||
{
|
||||
if (tmfloorthing)
|
||||
tmhitthing = tmfloorthing;
|
||||
|
||||
return false; // doesn't fit
|
||||
}
|
||||
|
||||
floatok = true;
|
||||
|
||||
thingtop = thing->z + thing->height;
|
||||
@@ -2472,7 +2465,7 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
|
||||
}
|
||||
}
|
||||
else if (maxstep > 0 && !(thing->player &&
|
||||
(special == 14 || P_PlayerTouchingSectorSpecial(thing->player, 1, 14)))) // Step down
|
||||
(P_PlayerTouchingSectorSpecial(thing->player, 1, 14) || special == 14))) // Step down
|
||||
{
|
||||
// If the floor difference is MAXSTEPMOVE or less, and the sector isn't Section1:14, ALWAYS
|
||||
// step down! Formerly required a Section1:13 sector for the full MAXSTEPMOVE, but no more.
|
||||
@@ -3544,12 +3537,6 @@ static boolean PIT_RadiusAttack(mobj_t *thing)
|
||||
if (thing->flags & MF_MONITOR)
|
||||
return true;
|
||||
|
||||
if (thing->floorz > bombspot->z && bombspot->ceilingz < thing->z)
|
||||
return true;
|
||||
|
||||
if (thing->ceilingz < bombspot->z && bombspot->floorz > thing->z)
|
||||
return true;
|
||||
|
||||
dx = abs(thing->x - bombspot->x);
|
||||
dy = abs(thing->y - bombspot->y);
|
||||
dz = abs(thing->z + (thing->height>>1) - bombspot->z);
|
||||
@@ -3563,9 +3550,14 @@ static boolean PIT_RadiusAttack(mobj_t *thing)
|
||||
if (dist >= bombdamage)
|
||||
return true; // out of range
|
||||
|
||||
// must be in direct path
|
||||
if (thing->floorz > bombspot->z && bombspot->ceilingz < thing->z)
|
||||
return true;
|
||||
|
||||
if (thing->ceilingz < bombspot->z && bombspot->floorz > thing->z)
|
||||
return true;
|
||||
|
||||
if (P_CheckSight(thing, bombspot))
|
||||
{
|
||||
{ // must be in direct path
|
||||
P_DamageMobj(thing, bombspot, bombsource, 1); // Tails 01-11-2001
|
||||
}
|
||||
|
||||
@@ -4009,10 +4001,10 @@ static inline boolean PIT_GetSectors(line_t *ld)
|
||||
tmbbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
|
||||
return true;
|
||||
|
||||
if (ld->polyobj) // line belongs to a polyobject, don't add it
|
||||
if (P_BoxOnLineSide(tmbbox, ld) != -1)
|
||||
return true;
|
||||
|
||||
if (P_BoxOnLineSide(tmbbox, ld) != -1)
|
||||
if (ld->polyobj) // line belongs to a polyobject, don't add it
|
||||
return true;
|
||||
|
||||
// This line crosses through the object.
|
||||
|
||||
+41
-84
@@ -242,7 +242,7 @@ void P_CameraLineOpening(line_t *linedef)
|
||||
sector_t *back;
|
||||
fixed_t frontfloor, frontceiling, backfloor, backceiling;
|
||||
|
||||
if (linedef->sidenum[1] == NO_INDEX)
|
||||
if (linedef->sidenum[1] == 0xffff)
|
||||
{
|
||||
// single sided line
|
||||
openrange = 0;
|
||||
@@ -398,7 +398,7 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
|
||||
{
|
||||
sector_t *front, *back;
|
||||
|
||||
if (linedef->sidenum[1] == NO_INDEX)
|
||||
if (linedef->sidenum[1] == 0xffff)
|
||||
{
|
||||
// single sided line
|
||||
openrange = 0;
|
||||
@@ -423,40 +423,40 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
|
||||
// Set open and high/low values here
|
||||
fixed_t frontheight, backheight;
|
||||
|
||||
frontheight = P_GetCeilingZ(mobj, front, tmx, tmy, linedef);
|
||||
backheight = P_GetCeilingZ(mobj, back, tmx, tmy, linedef);
|
||||
|
||||
if (frontheight < backheight)
|
||||
{
|
||||
opentop = frontheight;
|
||||
highceiling = backheight;
|
||||
opentopslope = front->c_slope;
|
||||
}
|
||||
else
|
||||
{
|
||||
opentop = backheight;
|
||||
highceiling = frontheight;
|
||||
opentopslope = back->c_slope;
|
||||
}
|
||||
|
||||
frontheight = P_GetFloorZ(mobj, front, tmx, tmy, linedef);
|
||||
backheight = P_GetFloorZ(mobj, back, tmx, tmy, linedef);
|
||||
|
||||
if (frontheight > backheight)
|
||||
{
|
||||
openbottom = frontheight;
|
||||
lowfloor = backheight;
|
||||
openbottomslope = front->f_slope;
|
||||
}
|
||||
else
|
||||
{
|
||||
openbottom = backheight;
|
||||
lowfloor = frontheight;
|
||||
openbottomslope = back->f_slope;
|
||||
}
|
||||
|
||||
if (mobj)
|
||||
{
|
||||
frontheight = P_GetCeilingZ(mobj, front, tmx, tmy, linedef);
|
||||
backheight = P_GetCeilingZ(mobj, back, tmx, tmy, linedef);
|
||||
|
||||
if (frontheight < backheight)
|
||||
{
|
||||
opentop = frontheight;
|
||||
highceiling = backheight;
|
||||
opentopslope = front->c_slope;
|
||||
}
|
||||
else
|
||||
{
|
||||
opentop = backheight;
|
||||
highceiling = frontheight;
|
||||
opentopslope = back->c_slope;
|
||||
}
|
||||
|
||||
frontheight = P_GetFloorZ(mobj, front, tmx, tmy, linedef);
|
||||
backheight = P_GetFloorZ(mobj, back, tmx, tmy, linedef);
|
||||
|
||||
if (frontheight > backheight)
|
||||
{
|
||||
openbottom = frontheight;
|
||||
lowfloor = backheight;
|
||||
openbottomslope = front->f_slope;
|
||||
}
|
||||
else
|
||||
{
|
||||
openbottom = backheight;
|
||||
lowfloor = frontheight;
|
||||
openbottomslope = back->f_slope;
|
||||
}
|
||||
|
||||
fixed_t thingtop = mobj->z + mobj->height;
|
||||
|
||||
// Check for collision with front side's midtexture if Effect 4 is set
|
||||
@@ -650,43 +650,6 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
|
||||
lowfloor = lowestfloor;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// this is what P_LineOpening did before the addition of slopes
|
||||
// so i´ll just use it as the fallback case
|
||||
// not that we will ever likely hit this
|
||||
frontheight = front->ceilingheight;
|
||||
backheight = back->ceilingheight;
|
||||
|
||||
if (frontheight < backheight)
|
||||
{
|
||||
opentop = frontheight;
|
||||
highceiling = backheight;
|
||||
opentopslope = front->c_slope;
|
||||
}
|
||||
else
|
||||
{
|
||||
opentop = backheight;
|
||||
highceiling = frontheight;
|
||||
opentopslope = back->c_slope;
|
||||
}
|
||||
|
||||
frontheight = front->floorheight;
|
||||
backheight = back->floorheight;
|
||||
|
||||
if (frontheight > backheight)
|
||||
{
|
||||
openbottom = frontheight;
|
||||
lowfloor = backheight;
|
||||
openbottomslope = front->f_slope;
|
||||
}
|
||||
else
|
||||
{
|
||||
openbottom = backheight;
|
||||
lowfloor = frontheight;
|
||||
openbottomslope = back->f_slope;
|
||||
}
|
||||
}
|
||||
|
||||
openrange = opentop - openbottom;
|
||||
}
|
||||
@@ -705,6 +668,7 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
|
||||
//
|
||||
void P_UnsetThingPosition(mobj_t *thing)
|
||||
{
|
||||
I_Assert(thing != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(thing));
|
||||
|
||||
if (!(thing->flags & MF_NOSECTOR))
|
||||
@@ -808,6 +772,7 @@ void P_SetThingPosition(mobj_t *thing)
|
||||
sector_t *oldsec = NULL;
|
||||
fixed_t tfloorz, tceilz;
|
||||
|
||||
I_Assert(thing != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(thing));
|
||||
|
||||
if (thing->player && thing->z <= thing->floorz && thing->subsector)
|
||||
@@ -858,20 +823,16 @@ void P_SetThingPosition(mobj_t *thing)
|
||||
// sector's floor is the same height.
|
||||
if (thing->player && oldsec != NULL && thing->subsector && oldsec != thing->subsector->sector)
|
||||
{
|
||||
tfloorz = P_GetFloorZ(thing, ss->sector, thing->x, thing->y, NULL);
|
||||
tceilz = P_GetCeilingZ(thing, ss->sector, thing->x, thing->y, NULL);
|
||||
|
||||
if (thing->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
tceilz = P_GetCeilingZ(thing, ss->sector, thing->x, thing->y, NULL);
|
||||
|
||||
if (thing->z + thing->height >= tceilz)
|
||||
thing->eflags |= MFE_JUSTSTEPPEDDOWN;
|
||||
}
|
||||
else
|
||||
{
|
||||
tfloorz = P_GetFloorZ(thing, ss->sector, thing->x, thing->y, NULL);
|
||||
|
||||
if (thing->z <= tfloorz)
|
||||
thing->eflags |= MFE_JUSTSTEPPEDDOWN;
|
||||
}
|
||||
else if (thing->z <= tfloorz)
|
||||
thing->eflags |= MFE_JUSTSTEPPEDDOWN;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -972,10 +933,6 @@ boolean P_BlockLinesIterator(INT32 x, INT32 y, boolean (*func)(line_t *))
|
||||
// First index is really empty, so +1 it.
|
||||
for (list = blockmaplump + offset + 1; *list != -1; list++)
|
||||
{
|
||||
#ifdef RANGECHECK
|
||||
if (*list < 0 || (UINT32)*list >= numlines)
|
||||
I_Error("P_BlockLinesIterator: index >= numlines");
|
||||
#endif
|
||||
ld = &lines[*list];
|
||||
|
||||
if (ld->validcount == validcount)
|
||||
|
||||
+144
-157
@@ -222,6 +222,11 @@ boolean P_SetMobjState(mobj_t *mobj, statenum_t state)
|
||||
|
||||
INT32 recursion = 0;
|
||||
|
||||
#ifdef PARANOIA
|
||||
if (mobj->player != NULL)
|
||||
I_Error("P_SetMobjState used for player mobj. Use P_SetPlayerMobjState instead!\n(State called: %d)", state);
|
||||
#endif
|
||||
|
||||
if (mobj->player != NULL)
|
||||
return P_SetPlayerMobjState(mobj, state);
|
||||
|
||||
@@ -334,6 +339,7 @@ void P_ExplodeMissile(mobj_t *mo)
|
||||
{
|
||||
mobj_t *explodemo;
|
||||
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
mo->momx = mo->momy = mo->momz = 0;
|
||||
@@ -414,18 +420,14 @@ boolean P_InsideANonSolidFFloor(mobj_t *mobj, ffloor_t *rover)
|
||||
if (!(rover->flags & FF_EXISTS))
|
||||
return false;
|
||||
|
||||
if ((((rover->flags & FF_BLOCKPLAYER) && mobj->player) ||
|
||||
((rover->flags & FF_BLOCKOTHERS) && !mobj->player)))
|
||||
return false;
|
||||
|
||||
topheight = P_GetFFloorTopZAt(rover, mobj->x, mobj->y);
|
||||
|
||||
if (mobj->z > topheight)
|
||||
if ((((rover->flags & FF_BLOCKPLAYER) && mobj->player)
|
||||
|| ((rover->flags & FF_BLOCKOTHERS) && !mobj->player)))
|
||||
return false;
|
||||
|
||||
topheight = P_GetFFloorTopZAt (rover, mobj->x, mobj->y);
|
||||
bottomheight = P_GetFFloorBottomZAt(rover, mobj->x, mobj->y);
|
||||
|
||||
if (mobj->z + mobj->height < bottomheight)
|
||||
if (mobj->z > topheight || (mobj->z + mobj->height < bottomheight))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@@ -575,7 +577,7 @@ fixed_t P_MobjFloorZ(mobj_t *mobj, sector_t *sector, sector_t *boundsec, fixed_t
|
||||
return P_GetSlopeZAt(slope, testx, testy);
|
||||
|
||||
// If boundsec is set, we're looking for specials. In that case, iterate over every line in this sector to find the TRUE highest/lowest point
|
||||
if (perfect && boundsec)
|
||||
if (perfect)
|
||||
{
|
||||
size_t i;
|
||||
line_t *ld;
|
||||
@@ -594,10 +596,8 @@ fixed_t P_MobjFloorZ(mobj_t *mobj, sector_t *sector, sector_t *boundsec, fixed_t
|
||||
fixed_t highline;
|
||||
ld = boundsec->lines[i];
|
||||
|
||||
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] ||
|
||||
bbox[BOXLEFT] >= ld->bbox[BOXRIGHT] ||
|
||||
bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] ||
|
||||
bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
|
||||
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] || bbox[BOXLEFT] >= ld->bbox[BOXRIGHT]
|
||||
|| bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] || bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
|
||||
continue;
|
||||
|
||||
if (P_BoxOnLineSide(bbox, ld) != -1)
|
||||
@@ -664,7 +664,7 @@ fixed_t P_MobjCeilingZ(mobj_t *mobj, sector_t *sector, sector_t *boundsec, fixed
|
||||
return P_GetSlopeZAt(slope, testx, testy);
|
||||
|
||||
// If boundsec is set, we're looking for specials. In that case, iterate over every line in this sector to find the TRUE highest/lowest point
|
||||
if (perfect && boundsec)
|
||||
if (perfect)
|
||||
{
|
||||
size_t i;
|
||||
line_t *ld;
|
||||
@@ -683,10 +683,8 @@ fixed_t P_MobjCeilingZ(mobj_t *mobj, sector_t *sector, sector_t *boundsec, fixed
|
||||
fixed_t highline;
|
||||
ld = boundsec->lines[i];
|
||||
|
||||
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] ||
|
||||
bbox[BOXLEFT] >= ld->bbox[BOXRIGHT] ||
|
||||
bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] ||
|
||||
bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
|
||||
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] || bbox[BOXLEFT] >= ld->bbox[BOXRIGHT]
|
||||
|| bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] || bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
|
||||
continue;
|
||||
|
||||
if (P_BoxOnLineSide(bbox, ld) != -1)
|
||||
@@ -754,7 +752,7 @@ fixed_t P_CameraFloorZ(camera_t *mobj, sector_t *sector, sector_t *boundsec, fix
|
||||
return P_GetSlopeZAt(slope, testx, testy);
|
||||
|
||||
// If boundsec is set, we're looking for specials. In that case, iterate over every line in this sector to find the TRUE highest/lowest point
|
||||
if (perfect && boundsec)
|
||||
if (perfect)
|
||||
{
|
||||
size_t i;
|
||||
line_t *ld;
|
||||
@@ -773,10 +771,8 @@ fixed_t P_CameraFloorZ(camera_t *mobj, sector_t *sector, sector_t *boundsec, fix
|
||||
fixed_t highline;
|
||||
ld = boundsec->lines[i];
|
||||
|
||||
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] ||
|
||||
bbox[BOXLEFT] >= ld->bbox[BOXRIGHT] ||
|
||||
bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] ||
|
||||
bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
|
||||
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] || bbox[BOXLEFT] >= ld->bbox[BOXRIGHT]
|
||||
|| bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] || bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
|
||||
continue;
|
||||
|
||||
if (P_BoxOnLineSide(bbox, ld) != -1)
|
||||
@@ -843,7 +839,7 @@ fixed_t P_CameraCeilingZ(camera_t *mobj, sector_t *sector, sector_t *boundsec, f
|
||||
return P_GetSlopeZAt(slope, testx, testy);
|
||||
|
||||
// If boundsec is set, we're looking for specials. In that case, iterate over every line in this sector to find the TRUE highest/lowest point
|
||||
if (perfect && boundsec)
|
||||
if (perfect)
|
||||
{
|
||||
size_t i;
|
||||
line_t *ld;
|
||||
@@ -862,10 +858,8 @@ fixed_t P_CameraCeilingZ(camera_t *mobj, sector_t *sector, sector_t *boundsec, f
|
||||
fixed_t highline;
|
||||
ld = boundsec->lines[i];
|
||||
|
||||
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] ||
|
||||
bbox[BOXLEFT] >= ld->bbox[BOXRIGHT] ||
|
||||
bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] ||
|
||||
bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
|
||||
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] || bbox[BOXLEFT] >= ld->bbox[BOXRIGHT]
|
||||
|| bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] || bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
|
||||
continue;
|
||||
|
||||
if (P_BoxOnLineSide(bbox, ld) != -1)
|
||||
@@ -896,7 +890,6 @@ fixed_t P_CameraCeilingZ(camera_t *mobj, sector_t *sector, sector_t *boundsec, f
|
||||
else // Well, that makes it easy. Just get the ceiling height
|
||||
return sector->ceilingheight;
|
||||
}
|
||||
|
||||
static void P_PlayerFlip(mobj_t *mo)
|
||||
{
|
||||
if (!mo->player)
|
||||
@@ -905,12 +898,7 @@ static void P_PlayerFlip(mobj_t *mo)
|
||||
G_GhostAddFlip((INT32) (mo->player - players));
|
||||
// Flip aiming to match!
|
||||
|
||||
if (UNLIKELY(mo->player->pflags & PF_NIGHTSMODE)) // NiGHTS doesn't use flipcam
|
||||
{
|
||||
if (mo->tracer)
|
||||
mo->tracer->eflags ^= MFE_VERTICALFLIP;
|
||||
}
|
||||
else if (mo->player->pflags & PF_FLIPCAM)
|
||||
if (mo->player->pflags & PF_FLIPCAM)
|
||||
{
|
||||
UINT8 i;
|
||||
|
||||
@@ -932,6 +920,11 @@ static void P_PlayerFlip(mobj_t *mo)
|
||||
camera[i].z += FixedMul(20*FRACUNIT, mo->scale);
|
||||
}
|
||||
}
|
||||
else if (UNLIKELY(mo->player->pflags & PF_NIGHTSMODE)) // NiGHTS doesn't use flipcam
|
||||
{
|
||||
if (mo->tracer)
|
||||
mo->tracer->eflags ^= MFE_VERTICALFLIP;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
@@ -947,6 +940,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
|
||||
boolean goopgravity = false;
|
||||
boolean wasflip;
|
||||
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
wasflip = (mo->eflags & MFE_VERTICALFLIP) != 0;
|
||||
@@ -1119,6 +1113,7 @@ void P_CheckGravity(mobj_t *mo, boolean affect)
|
||||
//
|
||||
static void P_SceneryXYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy)
|
||||
{
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
const fixed_t fric_scale = FixedMul(FRACUNIT/32, mo->scale);
|
||||
@@ -1162,6 +1157,7 @@ static void P_XYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy)
|
||||
{
|
||||
player_t *player;
|
||||
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
player = mo->player;
|
||||
@@ -1213,6 +1209,7 @@ static void P_PushableCheckBustables(mobj_t *mo)
|
||||
fixed_t oldx;
|
||||
fixed_t oldy;
|
||||
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
if (netgame && mo->player && mo->player->spectator)
|
||||
@@ -1331,6 +1328,7 @@ void P_XYMovement(mobj_t *mo)
|
||||
vector3_t slopemom = {0, 0, 0};
|
||||
fixed_t predictedz = 0;
|
||||
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
// if it's stopped
|
||||
@@ -1413,7 +1411,7 @@ void P_XYMovement(mobj_t *mo)
|
||||
// blocked move
|
||||
moved = false;
|
||||
|
||||
if (UNLIKELY(player && player->bot))
|
||||
if (player && player->bot)
|
||||
{
|
||||
B_MoveBlocked(player);
|
||||
}
|
||||
@@ -1448,24 +1446,24 @@ void P_XYMovement(mobj_t *mo)
|
||||
else
|
||||
fx->eflags &= ~MFE_VERTICALFLIP;
|
||||
fx->scale = mo->scale;
|
||||
}
|
||||
|
||||
if (mo->type == MT_ORBINAUT) // Orbinaut speed decreasing
|
||||
if (mo->type == MT_ORBINAUT) // Orbinaut speed decreasing
|
||||
{
|
||||
if (mo->health > 1)
|
||||
{
|
||||
if (mo->health > 1)
|
||||
{
|
||||
S_StartSound(mo, mo->info->attacksound);
|
||||
mo->health--;
|
||||
mo->threshold = 0;
|
||||
}
|
||||
else if (mo->health == 1)
|
||||
{
|
||||
// This Item Damage
|
||||
S_StartSound(mo, mo->info->deathsound);
|
||||
P_KillMobj(mo, NULL, NULL);
|
||||
S_StartSound(mo, mo->info->attacksound);
|
||||
mo->health--;
|
||||
mo->threshold = 0;
|
||||
}
|
||||
else if (mo->health == 1)
|
||||
{
|
||||
// This Item Damage
|
||||
S_StartSound(mo, mo->info->deathsound);
|
||||
P_KillMobj(mo, NULL, NULL);
|
||||
|
||||
P_SetObjectMomZ(mo, 8*FRACUNIT, false);
|
||||
P_InstaThrust(mo, R_PointToAngle2(mo->x, mo->y, mo->x, mo->y)+ANGLE_90, 16*FRACUNIT);
|
||||
}
|
||||
P_SetObjectMomZ(mo, 8*FRACUNIT, false);
|
||||
P_InstaThrust(mo, R_PointToAngle2(mo->x, mo->y, mo->x, mo->y)+ANGLE_90, 16*FRACUNIT);
|
||||
}
|
||||
}
|
||||
//}
|
||||
@@ -1569,46 +1567,43 @@ void P_XYMovement(mobj_t *mo)
|
||||
if (P_MobjWasRemoved(mo)) // MF_SPECIAL touched a player! O_o;;
|
||||
return;
|
||||
|
||||
if (moved)
|
||||
if (moved && oldslope) // Check to see if we ran off
|
||||
{
|
||||
if (oldslope) // Check to see if we ran off
|
||||
if (oldslope != mo->standingslope) // First, compare different slopes
|
||||
{
|
||||
if (oldslope != mo->standingslope) // First, compare different slopes
|
||||
{
|
||||
angle_t oldangle, newangle;
|
||||
angle_t moveangle = R_PointToAngle2(0, 0, mo->momx, mo->momy);
|
||||
angle_t oldangle, newangle;
|
||||
angle_t moveangle = R_PointToAngle2(0, 0, mo->momx, mo->momy);
|
||||
|
||||
oldangle = FixedMul((signed)oldslope->zangle, FINECOSINE((moveangle - oldslope->xydirection) >> ANGLETOFINESHIFT));
|
||||
oldangle = FixedMul((signed)oldslope->zangle, FINECOSINE((moveangle - oldslope->xydirection) >> ANGLETOFINESHIFT));
|
||||
|
||||
if (mo->standingslope)
|
||||
newangle = FixedMul((signed)mo->standingslope->zangle, FINECOSINE((moveangle - mo->standingslope->xydirection) >> ANGLETOFINESHIFT));
|
||||
else
|
||||
newangle = 0;
|
||||
if (mo->standingslope)
|
||||
newangle = FixedMul((signed)mo->standingslope->zangle, FINECOSINE((moveangle - mo->standingslope->xydirection) >> ANGLETOFINESHIFT));
|
||||
else
|
||||
newangle = 0;
|
||||
|
||||
// Now compare the Zs of the different quantizations
|
||||
if (oldangle-newangle > ANG30 && oldangle-newangle < ANGLE_180) // Allow for a bit of sticking - this value can be adjusted later
|
||||
{
|
||||
mo->standingslope = oldslope;
|
||||
P_SlopeLaunch(mo);
|
||||
}
|
||||
}
|
||||
else if (predictedz-mo->z > abs(slopemom.z/2) // Sryder 2018-11-26: Don't launch here if it's a slope without physics, we stick to those like glue anyway
|
||||
&& !(mo->standingslope->flags & SL_NOPHYSICS)) // Now check if we were supposed to stick to this slope
|
||||
// Now compare the Zs of the different quantizations
|
||||
if (oldangle-newangle > ANG30 && oldangle-newangle < ANGLE_180) // Allow for a bit of sticking - this value can be adjusted later
|
||||
{
|
||||
mo->standingslope = oldslope;
|
||||
P_SlopeLaunch(mo);
|
||||
}
|
||||
}
|
||||
else if (mo->standingslope && predictedz)
|
||||
else if (predictedz-mo->z > abs(slopemom.z/2) // Sryder 2018-11-26: Don't launch here if it's a slope without physics, we stick to those like glue anyway
|
||||
&& !(mo->standingslope->flags & SL_NOPHYSICS)) // Now check if we were supposed to stick to this slope
|
||||
{
|
||||
angle_t moveangle = R_PointToAngle2(0, 0, mo->momx, mo->momy);
|
||||
angle_t newangle = FixedMul((signed)mo->standingslope->zangle, FINECOSINE((moveangle - mo->standingslope->xydirection) >> ANGLETOFINESHIFT));
|
||||
P_SlopeLaunch(mo);
|
||||
}
|
||||
}
|
||||
else if (moved && mo->standingslope && predictedz)
|
||||
{
|
||||
angle_t moveangle = R_PointToAngle2(0, 0, mo->momx, mo->momy);
|
||||
angle_t newangle = FixedMul((signed)mo->standingslope->zangle, FINECOSINE((moveangle - mo->standingslope->xydirection) >> ANGLETOFINESHIFT));
|
||||
|
||||
if (ANGLE_MAX-newangle > ANG30 && newangle > ANGLE_180)
|
||||
{
|
||||
mo->momz = P_MobjFlip(mo)*FRACUNIT/2;
|
||||
mo->z = predictedz + P_MobjFlip(mo);
|
||||
mo->standingslope = NULL;
|
||||
}
|
||||
if (ANGLE_MAX-newangle > ANG30 && newangle > ANGLE_180)
|
||||
{
|
||||
mo->momz = P_MobjFlip(mo)*FRACUNIT/2;
|
||||
mo->z = predictedz + P_MobjFlip(mo);
|
||||
mo->standingslope = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1684,6 +1679,7 @@ void P_XYMovement(mobj_t *mo)
|
||||
|
||||
static void P_RingXYMovement(mobj_t *mo)
|
||||
{
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
if (!P_SceneryTryMove(mo, mo->x + mo->momx, mo->y + mo->momy))
|
||||
@@ -1694,6 +1690,7 @@ static void P_SceneryXYMovement(mobj_t *mo)
|
||||
{
|
||||
fixed_t oldx, oldy; // reducing bobbing/momentum on ice when up against walls
|
||||
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
oldx = mo->x;
|
||||
@@ -1731,6 +1728,7 @@ static void P_AdjustMobjFloorZ_FFloors(mobj_t *mo, sector_t *sector, UINT8 motyp
|
||||
fixed_t delta1, delta2, thingtop;
|
||||
fixed_t topheight, bottomheight;
|
||||
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
thingtop = mo->z + mo->height;
|
||||
@@ -1807,6 +1805,7 @@ static void P_AdjustMobjFloorZ_PolyObjs(mobj_t *mo, subsector_t *subsec)
|
||||
fixed_t delta1, delta2, thingtop;
|
||||
fixed_t polytop, polybottom;
|
||||
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
thingtop = mo->z + mo->height;
|
||||
@@ -1850,6 +1849,7 @@ static void P_AdjustMobjFloorZ_PolyObjs(mobj_t *mo, subsector_t *subsec)
|
||||
|
||||
static void P_RingZMovement(mobj_t *mo)
|
||||
{
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
// Intercept the stupid 'fall through 3dfloors' bug
|
||||
@@ -1884,6 +1884,7 @@ static void P_RingZMovement(mobj_t *mo)
|
||||
|
||||
boolean P_CheckDeathPitCollide(mobj_t *mo)
|
||||
{
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
const INT32 secspecial = GETSECSPECIAL(mo->subsector->sector->special, 1);
|
||||
@@ -1900,6 +1901,7 @@ boolean P_CheckDeathPitCollide(mobj_t *mo)
|
||||
|
||||
boolean P_CheckSolidLava(mobj_t *mo, ffloor_t *rover)
|
||||
{
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
if (rover->flags & FF_SWIMMABLE && GETSECSPECIAL(rover->master->frontsector->special, 1) == 3
|
||||
@@ -1918,6 +1920,7 @@ static boolean P_ZMovement(mobj_t *mo)
|
||||
{
|
||||
fixed_t dist, delta;
|
||||
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
// Intercept the stupid 'fall through 3dfloors' bug
|
||||
@@ -2374,6 +2377,7 @@ static boolean P_ZMovement(mobj_t *mo)
|
||||
|
||||
static void P_PlayerZMovement(mobj_t *mo)
|
||||
{
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
if (!mo->player)
|
||||
@@ -2439,7 +2443,6 @@ static void P_PlayerZMovement(mobj_t *mo)
|
||||
}
|
||||
goto nightsdone;
|
||||
}
|
||||
|
||||
// Get up if you fell.
|
||||
if ((mo->state == &states[mo->info->painstate] || mo->state == &states[S_KART_SPIN])
|
||||
&& mo->player->kartstuff[k_spinouttimer] == 0 && mo->player->kartstuff[k_squishedtimer] == 0) // SRB2kart
|
||||
@@ -2492,7 +2495,7 @@ static void P_PlayerZMovement(mobj_t *mo)
|
||||
polyobj_t *po = newsubsec->polyList;
|
||||
sector_t *polysec;
|
||||
|
||||
while (po)
|
||||
while(po)
|
||||
{
|
||||
if (!P_MobjInsidePolyobj(po, mo) || !(po->flags & POF_SOLID))
|
||||
{
|
||||
@@ -2720,7 +2723,6 @@ static boolean P_SceneryZMovement(mobj_t *mo)
|
||||
P_RemoveMobj(mo);
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((!(mo->eflags & MFE_VERTICALFLIP) && mo->z <= mo->floorz)
|
||||
|| (mo->eflags & MFE_VERTICALFLIP && mo->z+mo->height >= mo->ceilingz)) // Hit the floor, so split!
|
||||
{
|
||||
@@ -2758,7 +2760,6 @@ static boolean P_SceneryZMovement(mobj_t *mo)
|
||||
P_RemoveMobj(mo);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Soniccd seed turns into a flower!
|
||||
if ((!(mo->eflags & MFE_VERTICALFLIP) && mo->z <= mo->floorz)
|
||||
|| (mo->eflags & MFE_VERTICALFLIP && mo->z+mo->height >= mo->ceilingz))
|
||||
@@ -2869,29 +2870,22 @@ void P_MobjCheckWater(mobj_t *mobj)
|
||||
|| ((rover->flags & FF_BLOCKOTHERS) && !mobj->player)))
|
||||
continue;
|
||||
|
||||
fixed_t topcheck, bottomcheck;
|
||||
topheight = P_GetFFloorTopZAt(rover, mobj->x, mobj->y);
|
||||
bottomheight = P_GetFFloorBottomZAt(rover, mobj->x, mobj->y);
|
||||
|
||||
if (mobj->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
topcheck = (thingtop - FixedMul(mobj->info->height/2, mobj->scale));
|
||||
bottomcheck = thingtop;
|
||||
if (topheight < (thingtop - FixedMul(mobj->info->height/2, mobj->scale))
|
||||
|| bottomheight > thingtop)
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
topcheck = mobj->z;
|
||||
bottomcheck = (mobj->z + FixedMul(mobj->info->height/2, mobj->scale));
|
||||
if (topheight < mobj->z
|
||||
|| bottomheight > (mobj->z + FixedMul(mobj->info->height/2, mobj->scale)))
|
||||
continue;
|
||||
}
|
||||
|
||||
topheight = P_GetFFloorTopZAt(rover, mobj->x, mobj->y);
|
||||
|
||||
if (topheight < topcheck)
|
||||
continue;
|
||||
|
||||
bottomheight = P_GetFFloorBottomZAt(rover, mobj->x, mobj->y);
|
||||
|
||||
if (bottomheight > bottomcheck)
|
||||
continue;
|
||||
|
||||
// Set the watertop and waterbottom
|
||||
mobj->watertop = topheight;
|
||||
mobj->waterbottom = bottomheight;
|
||||
@@ -3097,14 +3091,11 @@ static void P_SceneryCheckWater(mobj_t *mobj)
|
||||
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_SWIMMABLE) || rover->flags & FF_BLOCKOTHERS)
|
||||
continue;
|
||||
|
||||
topheight = P_GetFFloorTopZAt(rover, mobj->x, mobj->y);
|
||||
|
||||
if (topheight <= mobj->z)
|
||||
continue;
|
||||
|
||||
topheight = P_GetFFloorTopZAt(rover, mobj->x, mobj->y);
|
||||
bottomheight = P_GetFFloorBottomZAt(rover, mobj->x, mobj->y);
|
||||
|
||||
if (bottomheight > (mobj->z + FixedMul(mobj->info->height >> 1, mobj->scale)))
|
||||
if (topheight <= mobj->z
|
||||
|| bottomheight > (mobj->z + FixedMul(mobj->info->height >> 1, mobj->scale)))
|
||||
continue;
|
||||
|
||||
if (mobj->z + FixedMul(mobj->info->height, mobj->scale) > topheight)
|
||||
@@ -3369,6 +3360,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
||||
{
|
||||
msecnode_t *node;
|
||||
|
||||
I_Assert(mobj != NULL);
|
||||
I_Assert(mobj->player != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mobj));
|
||||
|
||||
@@ -3383,23 +3375,20 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
||||
mobj->eflags &= ~MFE_JUSTSTEPPEDDOWN;
|
||||
|
||||
// Zoom tube
|
||||
if (mobj->tracer)
|
||||
if (UNLIKELY(mobj->tracer && mobj->tracer->type == MT_TUBEWAYPOINT))
|
||||
{
|
||||
if (mobj->tracer->type == MT_TUBEWAYPOINT)
|
||||
{
|
||||
P_UnsetThingPosition(mobj);
|
||||
mobj->x += mobj->momx;
|
||||
mobj->y += mobj->momy;
|
||||
mobj->z += mobj->momz;
|
||||
P_SetThingPosition(mobj);
|
||||
P_CheckPosition(mobj, mobj->x, mobj->y);
|
||||
goto animonly;
|
||||
}
|
||||
else if (UNLIKELY(mobj->player->pflags & PF_MACESPIN))
|
||||
{
|
||||
P_CheckPosition(mobj, mobj->x, mobj->y);
|
||||
goto animonly;
|
||||
}
|
||||
P_UnsetThingPosition(mobj);
|
||||
mobj->x += mobj->momx;
|
||||
mobj->y += mobj->momy;
|
||||
mobj->z += mobj->momz;
|
||||
P_SetThingPosition(mobj);
|
||||
P_CheckPosition(mobj, mobj->x, mobj->y);
|
||||
goto animonly;
|
||||
}
|
||||
else if (UNLIKELY(mobj->player->pflags & PF_MACESPIN && mobj->tracer))
|
||||
{
|
||||
P_CheckPosition(mobj, mobj->x, mobj->y);
|
||||
goto animonly;
|
||||
}
|
||||
|
||||
// Needed for gravity boots
|
||||
@@ -3415,30 +3404,24 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
||||
else
|
||||
P_TryMove(mobj, mobj->x, mobj->y, true);
|
||||
|
||||
if (!(netgame && mobj->player->spectator))
|
||||
if (LIKELY(!(netgame && mobj->player->spectator)))
|
||||
{
|
||||
// Crumbling platforms
|
||||
for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||
{
|
||||
fixed_t topheight, bottomheight;
|
||||
ffloor_t *rover;
|
||||
|
||||
for (rover = node->m_sector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
boolean oncrumble;
|
||||
|
||||
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_CRUMBLE))
|
||||
continue;
|
||||
|
||||
if (mobj->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
oncrumble = P_GetSpecialBottomZ(mobj, sectors + rover->secnum, node->m_sector) == mobj->z + mobj->height; // You nut.
|
||||
}
|
||||
else
|
||||
{
|
||||
oncrumble = P_GetSpecialTopZ(mobj, sectors + rover->secnum, node->m_sector) == mobj->z;
|
||||
}
|
||||
topheight = P_GetSpecialTopZ(mobj, sectors + rover->secnum, node->m_sector);
|
||||
bottomheight = P_GetSpecialBottomZ(mobj, sectors + rover->secnum, node->m_sector);
|
||||
|
||||
if (oncrumble)
|
||||
if ((topheight == mobj->z && !(mobj->eflags & MFE_VERTICALFLIP))
|
||||
|| (bottomheight == mobj->z + mobj->height && mobj->eflags & MFE_VERTICALFLIP)) // You nut.
|
||||
EV_StartCrumble(rover->master->frontsector, rover, (rover->flags & FF_FLOATBOB), mobj->player, rover->alpha, !(rover->flags & FF_NORETURN));
|
||||
}
|
||||
}
|
||||
@@ -3541,9 +3524,11 @@ animonly:
|
||||
static void P_CalculatePrecipFloor(precipmobj_t *mobj)
|
||||
{
|
||||
// recalculate floorz each time
|
||||
const sector_t *sec = (mobj && mobj->subsector) ? mobj->subsector->sector : NULL;
|
||||
const sector_t *sec;
|
||||
|
||||
if (!sec)
|
||||
if (mobj && mobj->subsector && mobj->subsector->sector)
|
||||
sec = mobj->subsector->sector;
|
||||
else
|
||||
return;
|
||||
|
||||
mobj->floorz = P_GetSectorFloorZAt(sec, mobj->x, mobj->y);
|
||||
@@ -3637,10 +3622,8 @@ boolean P_PrecipThinker(precipmobj_t *mobj)
|
||||
return true;
|
||||
|
||||
// only recalc this twice a second (doubt anyone will notice this lulul)
|
||||
if ((leveltime % (TICRATE/2)) == 0)
|
||||
{
|
||||
if ((leveltime % 17) == 0)
|
||||
P_CalculatePrecipFloor(mobj);
|
||||
}
|
||||
|
||||
// adjust height
|
||||
if ((mobj->z += mobj->momz) <= mobj->floorz)
|
||||
@@ -4303,7 +4286,7 @@ static void P_Boss4PopSpikeballs(mobj_t *mobj)
|
||||
{
|
||||
mobj_t *base = mobj->tracer, *seg, *next;
|
||||
P_SetTarget(&mobj->tracer, NULL);
|
||||
while (base)
|
||||
while(base)
|
||||
{
|
||||
next = base->tracer;
|
||||
P_SetTarget(&base->tracer, NULL);
|
||||
@@ -9024,9 +9007,10 @@ static void P_FiringThink(mobj_t *mobj)
|
||||
//
|
||||
void P_MobjThinker(mobj_t *mobj)
|
||||
{
|
||||
I_Assert(mobj != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mobj));
|
||||
|
||||
if (mobj->flags & MF_NOTHINK)
|
||||
if (UNLIKELY(mobj->flags & MF_NOTHINK))
|
||||
return;
|
||||
|
||||
// Remove dead target/tracer.
|
||||
@@ -9127,6 +9111,7 @@ void P_MobjThinker(mobj_t *mobj)
|
||||
if (mobj->fuse && !P_FuseThink(mobj))
|
||||
return;
|
||||
|
||||
I_Assert(mobj != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mobj));
|
||||
|
||||
if (mobj->momx || mobj->momy || (mobj->flags2 & MF2_SKULLFLY))
|
||||
@@ -9222,6 +9207,7 @@ boolean P_RailThinker(mobj_t *mobj)
|
||||
{
|
||||
fixed_t x, y, z;
|
||||
|
||||
I_Assert(mobj != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mobj));
|
||||
|
||||
x = mobj->x, y = mobj->y, z = mobj->z;
|
||||
@@ -9247,6 +9233,7 @@ void P_PushableThinker(mobj_t *mobj)
|
||||
{
|
||||
sector_t *sec;
|
||||
|
||||
I_Assert(mobj != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mobj));
|
||||
|
||||
if (!mobj)
|
||||
@@ -9284,13 +9271,12 @@ void P_PushableThinker(mobj_t *mobj)
|
||||
x = mobj->spawnpoint->x << FRACBITS;
|
||||
y = mobj->spawnpoint->y << FRACBITS;
|
||||
|
||||
ss = R_PointInSubsector(x, y);
|
||||
|
||||
if (mobj->spawnpoint->z != 0)
|
||||
z = mobj->spawnpoint->z << FRACBITS;
|
||||
else
|
||||
{
|
||||
ss = R_PointInSubsector(x, y);
|
||||
z = ss->sector->floorheight;
|
||||
}
|
||||
|
||||
spawnmo = P_SpawnMobj(x, y, z, mobj->type);
|
||||
if (spawnmo)
|
||||
@@ -10271,7 +10257,7 @@ void P_SpawnPrecipitation(void)
|
||||
if (curWeather == PRECIP_BLANK)
|
||||
rainmo->precipflags |= PCF_INVISIBLE;
|
||||
|
||||
floorz = rainmo->floorz >> FRACBITS;
|
||||
floorz = rainmo->floorz >> FRACBITS;
|
||||
ceilingz = rainmo->ceilingz >> FRACBITS;
|
||||
|
||||
if (floorz < ceilingz)
|
||||
@@ -10338,6 +10324,8 @@ void P_PrecipitationEffects(void)
|
||||
return;
|
||||
}
|
||||
|
||||
boolean sounds_rain = ((cv_drawdist_precip.value != 0) && rainsfx && (!leveltime || leveltime % 80 == 1));
|
||||
|
||||
// Currently thunderstorming with lightning, and we're sounding the thunder...
|
||||
// and where there's thunder, there's gotta be lightning!
|
||||
if (effects_lightning && lightningStrike)
|
||||
@@ -10359,8 +10347,6 @@ void P_PrecipitationEffects(void)
|
||||
if (sound_disabled)
|
||||
return; // Sound off? D'aw, no fun.
|
||||
|
||||
const boolean sounds_rain = ((cv_drawdist_precip.value != 0) && rainsfx && (!leveltime || leveltime % 80 == 1));
|
||||
|
||||
if (!sounds_rain && !sounds_thunder)
|
||||
return; // no need to calculate volume at ALL
|
||||
|
||||
@@ -11029,11 +11015,7 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
||||
{
|
||||
if (mthing->type > MAXPLAYERS) // be wary of playerstarts size! playerstarts[MAXPLAYERS]
|
||||
{
|
||||
#ifdef COMPAT_VANILLA
|
||||
CONS_Alert(CONS_ERROR, "Excess player start detected %d This will crash vanilla clients!\n", mthing->type);
|
||||
#else
|
||||
CONS_Debug(DBG_SETUP, "Excess player start detected %d\n", mthing->type);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -11181,7 +11163,16 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
||||
}
|
||||
}
|
||||
|
||||
if (i == MT_EMMY && (gametype != GT_COOP || tokenbits == 30 || tokenlist & (1 << tokenbits++)))
|
||||
if (ultimatemode)
|
||||
{
|
||||
if (i == MT_PITYTV || i == MT_GREENTV || i == MT_YELLOWTV || i == MT_BLUETV || i == MT_BLACKTV || i == MT_WHITETV)
|
||||
return; // No shields in Ultimate mode
|
||||
|
||||
if (i == MT_SUPERRINGBOX)
|
||||
return; // No rings in Ultimate mode (except special stages)
|
||||
}
|
||||
|
||||
if (i == MT_EMMY && (gametype != GT_COOP || ultimatemode || tokenbits == 30 || tokenlist & (1 << tokenbits++)))
|
||||
return; // you already got this token, or there are too many, or the gametype's not right
|
||||
|
||||
// Objectplace landing point
|
||||
@@ -11284,11 +11275,7 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
||||
|
||||
if (P_MobjWasRemoved(mobj))
|
||||
{
|
||||
#ifdef COMPAT_VANILLA
|
||||
CONS_Alert(CONS_ERROR, "Failed to spawn map thing #%d at %d, %d. This will crash vanilla clients!\n", mthing->type, x>>FRACBITS, y>>FRACBITS);
|
||||
#else
|
||||
CONS_Debug(DBG_SETUP, "Failed to spawn map thing #%d at %d, %d.\n", mthing->type, x>>FRACBITS, y>>FRACBITS);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -11857,6 +11844,8 @@ void P_SpawnHoops(mapthing_t *mthing)
|
||||
x = mthing->x << FRACBITS;
|
||||
y = mthing->y << FRACBITS;
|
||||
|
||||
sec = R_PointInSubsector(x, y)->sector;
|
||||
|
||||
// Save our flags!
|
||||
if (mthing->type == 1713)
|
||||
z = (mthing->options >> ZSHIFT) << FRACBITS;
|
||||
@@ -11868,8 +11857,6 @@ void P_SpawnHoops(mapthing_t *mthing)
|
||||
if (P_MobjWasRemoved(hoopcenter))
|
||||
return;
|
||||
|
||||
sec = R_PointInSubsector(x, y)->sector;
|
||||
|
||||
hoopcenter->spawnpoint = mthing;
|
||||
|
||||
z += P_GetSectorFloorZAt(sec, x, y);
|
||||
|
||||
@@ -421,6 +421,10 @@ typedef struct mobj_s
|
||||
//
|
||||
// For precipitation
|
||||
//
|
||||
// Sometimes this is casted to a mobj_t,
|
||||
// so please keep the start of the
|
||||
// structure the same.
|
||||
//
|
||||
typedef struct precipmobj_s
|
||||
{
|
||||
// List: thinker links.
|
||||
|
||||
+8
-9
@@ -691,7 +691,7 @@ static void ArchiveLines(savebuffer_t *save)
|
||||
if (spawnli->special == 321 || spawnli->special == 322) // only reason li->callcount would be non-zero is if either of these are involved
|
||||
diff |= LD_CLLCOUNT;
|
||||
|
||||
if (li->sidenum[0] != NO_INDEX)
|
||||
if (li->sidenum[0] != 0xffff)
|
||||
{
|
||||
si = &sides[li->sidenum[0]];
|
||||
spawnsi = &spawnsides[li->sidenum[0]];
|
||||
@@ -706,8 +706,7 @@ static void ArchiveLines(savebuffer_t *save)
|
||||
if (si->midtexture != spawnsi->midtexture)
|
||||
diff |= LD_S1MIDTEX;
|
||||
}
|
||||
|
||||
if (li->sidenum[1] != NO_INDEX)
|
||||
if (li->sidenum[1] != 0xffff)
|
||||
{
|
||||
si = &sides[li->sidenum[1]];
|
||||
spawnsi = &spawnsides[li->sidenum[1]];
|
||||
@@ -787,7 +786,6 @@ static void UnArchiveFFloors(savebuffer_t *save, const sector_t *ss)
|
||||
I_Error("Sector does not have any ffloors!");
|
||||
|
||||
fflr_i = READUINT16(save->p); // get first modified ffloor's number ready
|
||||
|
||||
for (;;) // for some reason the usual for (rover = x; ...) thing doesn't work here?
|
||||
{
|
||||
if (fflr_i == 0xffff) // end of modified ffloors list, let's stop already
|
||||
@@ -3310,6 +3308,8 @@ FUNCINLINE static ATTRINLINE void P_ArchiveMisc(savebuffer_t *save)
|
||||
else
|
||||
WRITEINT16(save->p, gamemap);
|
||||
|
||||
lastmapsaved = gamemap;
|
||||
|
||||
WRITEUINT16(save->p, (botskin ? (emeralds|(1<<10)) : emeralds)+357);
|
||||
WRITESTRINGN(save->p, timeattackfolder, sizeof(timeattackfolder));
|
||||
}
|
||||
@@ -3333,6 +3333,8 @@ FUNCINLINE static ATTRINLINE void P_UnArchiveSPGame(savebuffer_t *save, INT16 ma
|
||||
if (!mapheaderinfo[gamemap-1])
|
||||
P_AllocMapHeader(gamemap-1);
|
||||
|
||||
lastmapsaved = gamemap;
|
||||
|
||||
tokenlist = 0;
|
||||
token = 0;
|
||||
|
||||
@@ -3512,7 +3514,7 @@ static void P_ReloadSaveLevelData(void)
|
||||
li->firsttag = spawnli->firsttag;
|
||||
li->nexttag = spawnli->nexttag;
|
||||
|
||||
if (li->sidenum[0] != NO_INDEX)
|
||||
if (li->sidenum[0] != 0xffff)
|
||||
{
|
||||
si = &sides[li->sidenum[0]];
|
||||
spawnsi = &spawnsides[li->sidenum[0]];
|
||||
@@ -3523,7 +3525,7 @@ static void P_ReloadSaveLevelData(void)
|
||||
si->midtexture = spawnsi->midtexture;
|
||||
}
|
||||
|
||||
if (li->sidenum[1] != NO_INDEX)
|
||||
if (li->sidenum[1] != 0xffff)
|
||||
{
|
||||
si = &sides[li->sidenum[1]];
|
||||
spawnsi = &spawnsides[li->sidenum[1]];
|
||||
@@ -3590,11 +3592,8 @@ FUNCINLINE static ATTRINLINE boolean P_NetUnArchiveMisc(savebuffer_t *save, bool
|
||||
if (!P_SetupLevel(true, reloading))
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("Can't load the level!\n"));
|
||||
P_FreeCorruptMapWarnings();
|
||||
return false;
|
||||
}
|
||||
|
||||
P_PrintCorruptMapWarnings();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+37
-308
@@ -188,57 +188,6 @@ FUNCNORETURN static ATTRNORETURN void CorruptMapError(const char *msg)
|
||||
I_Error("Invalid or corrupt map.\nLook in log file or text console for technical details.");
|
||||
}
|
||||
|
||||
static char **mapwarnings = NULL;
|
||||
static size_t nummapwarnings = 0;
|
||||
|
||||
// collect map errors we can fix clientside
|
||||
// we then can print em when the map finishes loading
|
||||
// so they actually appear and raise awareness shits fucked
|
||||
// see G_DoLoadLevel as to why :chaosleep:
|
||||
static void CorruptMapWarning(const char *msg)
|
||||
{
|
||||
#ifdef PARANOIA
|
||||
// just error out
|
||||
I_Error("%sThis WILL crash Vanilla clients!\n", msg);
|
||||
#endif
|
||||
nummapwarnings++;
|
||||
mapwarnings = Z_Realloc(mapwarnings, nummapwarnings * sizeof(*mapwarnings), PU_STATIC, NULL);
|
||||
mapwarnings[nummapwarnings-1] = Z_StrDup(msg);
|
||||
}
|
||||
|
||||
void P_PrintCorruptMapWarnings(void)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!nummapwarnings)
|
||||
return;
|
||||
|
||||
for (i = 0; i < nummapwarnings; i++)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "%sAttempting to fix... This WILL crash Vanilla clients!\n", mapwarnings[i]);
|
||||
}
|
||||
|
||||
P_FreeCorruptMapWarnings();
|
||||
}
|
||||
|
||||
void P_FreeCorruptMapWarnings(void)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!nummapwarnings)
|
||||
return;
|
||||
|
||||
for (i = 0; i < nummapwarnings; i++)
|
||||
{
|
||||
Z_Free(mapwarnings[i]);
|
||||
mapwarnings[i] = NULL;
|
||||
}
|
||||
|
||||
Z_Free(mapwarnings);
|
||||
mapwarnings = NULL;
|
||||
nummapwarnings = 0;
|
||||
}
|
||||
|
||||
#define NUMLAPS_DEFAULT 3
|
||||
|
||||
static void P_ClearMapHeaderLighting(mapheader_lighting_t *lighting)
|
||||
@@ -488,39 +437,8 @@ static void P_LoadSegs(UINT8 *data)
|
||||
|
||||
for (i = 0; i < numsegs; i++, li++, ml++)
|
||||
{
|
||||
INT16 v1, v2;
|
||||
|
||||
v1 = SHORT(ml->v1);
|
||||
v2 = SHORT(ml->v2);
|
||||
|
||||
// e6y
|
||||
// check and fix wrong references to non-existent vertexes
|
||||
// see e1m9 @ NIVELES.WAD
|
||||
// http://www.doomworld.com/idgames/index.php?id=12647
|
||||
if ((unsigned)v1 >= numvertexes || (unsigned)v2 >= numvertexes)
|
||||
{
|
||||
if ((unsigned)v1 >= numvertexes)
|
||||
CorruptMapWarning(va("P_LoadSegs: seg %s references a non-existent vertex %d\n", sizeu1(i), v1));
|
||||
if ((unsigned)v2 >= numvertexes)
|
||||
CorruptMapWarning(va("P_LoadSegs: seg %s references a non-existent vertex %d\n", sizeu1(i), v2));
|
||||
|
||||
if (li->sidedef == &sides[li->linedef->sidenum[0]])
|
||||
{
|
||||
li->v1 = lines[ml->linedef].v1;
|
||||
li->v2 = lines[ml->linedef].v2;
|
||||
}
|
||||
else
|
||||
{
|
||||
li->v1 = lines[ml->linedef].v2;
|
||||
li->v2 = lines[ml->linedef].v1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
li->v1 = &vertexes[v1];
|
||||
li->v2 = &vertexes[v2];
|
||||
}
|
||||
|
||||
li->v1 = &vertexes[SHORT(ml->v1)];
|
||||
li->v2 = &vertexes[SHORT(ml->v2)];
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
{
|
||||
@@ -537,59 +455,14 @@ static void P_LoadSegs(UINT8 *data)
|
||||
li->angle = (SHORT(ml->angle))<<FRACBITS;
|
||||
li->offset = (SHORT(ml->offset))<<FRACBITS;
|
||||
rawlinedef = SHORT(ml->linedef);
|
||||
|
||||
//e6y: check for wrong indexes
|
||||
if ((unsigned)rawlinedef >= numlines)
|
||||
{
|
||||
I_Error("P_LoadSegs: seg %s references a non-existent linedef %d", sizeu1(i), (unsigned)rawlinedef);
|
||||
}
|
||||
|
||||
ldef = &lines[rawlinedef];
|
||||
li->linedef = ldef;
|
||||
rawside = SHORT(ml->side);
|
||||
|
||||
//e6y: fix wrong side index
|
||||
if (rawside != 0 && rawside != 1)
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadSegs: seg %s contains wrong side index %d.\n", sizeu1(i), rawside));
|
||||
rawside = 1;
|
||||
}
|
||||
|
||||
//e6y: check for wrong indexes
|
||||
if (ldef->sidenum[rawside] >= numsides)
|
||||
{
|
||||
I_Error("P_LoadSegs: linedef %d for seg %s references a non-existent sidedef %d", rawlinedef, sizeu1(i), ldef->sidenum[rawside]);
|
||||
}
|
||||
|
||||
li->side = rawside;
|
||||
|
||||
li->side = rawside = SHORT(ml->side);
|
||||
li->sidedef = &sides[ldef->sidenum[rawside]];
|
||||
|
||||
/* cph 2006/09/30 - our frontsector can be the second side of the
|
||||
* linedef, so must check for NO_INDEX in case we are incorrectly
|
||||
* referencing the back of a 1S line */
|
||||
if (ldef->sidenum[rawside] == NO_INDEX)
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadSegs: front of seg %s has no sidedef\n", sizeu1(i)));
|
||||
li->frontsector = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
li->frontsector = sides[ldef->sidenum[rawside]].sector;
|
||||
}
|
||||
li->frontsector = sides[ldef->sidenum[rawside]].sector;
|
||||
|
||||
if (ldef->flags & ML_TWOSIDED)
|
||||
{
|
||||
if (ldef->sidenum[rawside^1] == NO_INDEX)
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadSegs: back of seg %s has no sidedef while being marked as double sided\n", sizeu1(i)));
|
||||
li->backsector = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
li->backsector = sides[ldef->sidenum[rawside^1]].sector;
|
||||
}
|
||||
}
|
||||
li->backsector = sides[ldef->sidenum[rawside^1]].sector;
|
||||
|
||||
P_UpdateSegLightOffset(li);
|
||||
}
|
||||
@@ -865,33 +738,7 @@ static void P_LoadNodes(UINT8 *data)
|
||||
|
||||
for (j = 0; j < 2; j++)
|
||||
{
|
||||
UINT16 child;
|
||||
|
||||
child = SHORT(mn->children[j]);
|
||||
|
||||
if (child & NF_SUBSECTOR)
|
||||
{
|
||||
// Convert to extended type
|
||||
child &= ~NF_SUBSECTOR;
|
||||
|
||||
// haleyjd 11/06/10: check for invalid subsector reference
|
||||
if (child >= numsubsectors)
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadNodes: BSP tree %s references invalid subsector %d\n", sizeu1(i), child));
|
||||
child = 0;
|
||||
}
|
||||
|
||||
child |= NF_SUBSECTOR;
|
||||
}
|
||||
else if (child >= numnodes)
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadNodes: BSP node %s references invalid node.\n", sizeu1(i)));
|
||||
//I_Error("P_LoadNodes: BSP node %d references invalid node %d.\n", sizeu1(i), Index(((node_t *)no->children[j])));
|
||||
child = 0;
|
||||
}
|
||||
|
||||
no->children[j] = child;
|
||||
|
||||
no->children[j] = SHORT(mn->children[j]);
|
||||
for (k = 0; k < 4; k++)
|
||||
no->bbox[j][k] = SHORT(mn->bbox[j][k])<<FRACBITS;
|
||||
}
|
||||
@@ -1154,9 +1001,9 @@ static void P_InitializeLinedef(line_t *ld)
|
||||
// cph 2002/07/20 - these errors are fatal if not fixed, so apply them
|
||||
for (j = 0; j < 2; j++)
|
||||
{
|
||||
if (ld->sidenum[j] != NO_INDEX && ld->sidenum[j] >= (UINT16)numsides)
|
||||
if (ld->sidenum[j] != 0xffff && ld->sidenum[j] >= (UINT16)numsides)
|
||||
{
|
||||
ld->sidenum[j] = NO_INDEX;
|
||||
ld->sidenum[j] = 0xffff;
|
||||
CONS_Debug(DBG_SETUP, "P_InitializeLinedef: Linedef %s has out-of-range sidedef number\n", sizeu1((size_t)(ld - lines)));
|
||||
}
|
||||
}
|
||||
@@ -1164,23 +1011,23 @@ static void P_InitializeLinedef(line_t *ld)
|
||||
ld->firsttag = ld->nexttag = -1;
|
||||
|
||||
// killough 11/98: fix common wad errors (missing sidedefs):
|
||||
if (ld->sidenum[0] == NO_INDEX)
|
||||
if (ld->sidenum[0] == 0xffff)
|
||||
{
|
||||
ld->sidenum[0] = 0; // Substitute dummy sidedef for missing right side
|
||||
// cph - print a warning about the bug
|
||||
CONS_Debug(DBG_SETUP, "P_InitializeLinedef: Linedef %s missing first sidedef\n", sizeu1((size_t)(ld - lines)));
|
||||
}
|
||||
|
||||
if ((ld->sidenum[1] == NO_INDEX) && (ld->flags & ML_TWOSIDED))
|
||||
if ((ld->sidenum[1] == 0xffff) && (ld->flags & ML_TWOSIDED))
|
||||
{
|
||||
ld->flags &= ~ML_TWOSIDED; // Clear 2s flag for missing left side
|
||||
// cph - print a warning about the bug
|
||||
CONS_Debug(DBG_SETUP, "P_InitializeLinedef: Linedef %s has two-sided flag set, but no second sidedef\n", sizeu1((size_t)(ld - lines)));
|
||||
}
|
||||
|
||||
if (ld->sidenum[0] != NO_INDEX && ld->special)
|
||||
if (ld->sidenum[0] != 0xffff && ld->special)
|
||||
sides[ld->sidenum[0]].special = ld->special;
|
||||
if (ld->sidenum[1] != NO_INDEX && ld->special)
|
||||
if (ld->sidenum[1] != 0xffff && ld->special)
|
||||
sides[ld->sidenum[1]].special = ld->special;
|
||||
}
|
||||
|
||||
@@ -1213,10 +1060,10 @@ static void P_LoadLineDefs2(void)
|
||||
for (; i--; ld++)
|
||||
{
|
||||
ld->frontsector = sides[ld->sidenum[0]].sector; //e6y: Can't be -1 here
|
||||
ld->backsector = ld->sidenum[1] != NO_INDEX ? sides[ld->sidenum[1]].sector : NULL;
|
||||
ld->backsector = ld->sidenum[1] != 0xffff ? sides[ld->sidenum[1]].sector : NULL;
|
||||
|
||||
// Repeat count for midtexture
|
||||
if ((ld->flags & ML_EFFECT5) && (ld->sidenum[1] != NO_INDEX))
|
||||
if ((ld->flags & ML_EFFECT5) && (ld->sidenum[1] != 0xffff))
|
||||
{
|
||||
sides[ld->sidenum[0]].repeatcnt = (INT16)(((unsigned)sides[ld->sidenum[0]].textureoffset >> FRACBITS) >> 12);
|
||||
sides[ld->sidenum[0]].textureoffset = (((unsigned)sides[ld->sidenum[0]].textureoffset >> FRACBITS) & 2047) << FRACBITS;
|
||||
@@ -1232,13 +1079,13 @@ static void P_LoadLineDefs2(void)
|
||||
{
|
||||
size_t len = strlen(sides[ld->sidenum[0]].text)+1;
|
||||
|
||||
if (ld->sidenum[1] != NO_INDEX && sides[ld->sidenum[1]].text)
|
||||
if (ld->sidenum[1] != 0xffff && sides[ld->sidenum[1]].text)
|
||||
len += strlen(sides[ld->sidenum[1]].text);
|
||||
|
||||
ld->text = Z_Malloc(len, PU_LEVEL, NULL);
|
||||
memcpy(ld->text, sides[ld->sidenum[0]].text, strlen(sides[ld->sidenum[0]].text)+1);
|
||||
|
||||
if (ld->sidenum[1] != NO_INDEX && sides[ld->sidenum[1]].text)
|
||||
if (ld->sidenum[1] != 0xffff && sides[ld->sidenum[1]].text)
|
||||
memcpy(ld->text+strlen(ld->text)+1, sides[ld->sidenum[1]].text, strlen(sides[ld->sidenum[1]].text)+1);
|
||||
}
|
||||
break;
|
||||
@@ -1368,14 +1215,14 @@ static void P_LoadSideChangeMusic(boolean firstside, mapsidedef_t *msd, side_t *
|
||||
|
||||
if (msd->bottomtexture[0] != '-' || msd->bottomtexture[1] != '\0')
|
||||
{
|
||||
memcpy(process, msd->bottomtexture, 8);
|
||||
memcpy(process,msd->bottomtexture,8);
|
||||
process[8] = '\0';
|
||||
sd->bottomtexture = get_number(process);
|
||||
}
|
||||
|
||||
if (!(msd->midtexture[0] == '-' && msd->midtexture[1] == '\0') || msd->midtexture[1] != '\0')
|
||||
{
|
||||
memcpy(process, msd->midtexture, 8);
|
||||
memcpy(process,msd->midtexture,8);
|
||||
process[8] = '\0';
|
||||
sd->midtexture = get_number(process);
|
||||
}
|
||||
@@ -1385,7 +1232,7 @@ static void P_LoadSideChangeMusic(boolean firstside, mapsidedef_t *msd, side_t *
|
||||
|
||||
if (firstside || msd->toptexture[0] != '-' || msd->toptexture[1] != '\0')
|
||||
{
|
||||
memcpy(process, msd->toptexture, 8);
|
||||
memcpy(process,msd->toptexture,8);
|
||||
process[8] = '\0';
|
||||
|
||||
// If they type in O_ or D_ and their music name, just shrug,
|
||||
@@ -1425,7 +1272,7 @@ static void P_LoadSidedefs(void *data)
|
||||
// Colormaps!
|
||||
switch (sd->special)
|
||||
{
|
||||
case 63: // variable colormap via 242 linedef
|
||||
case 63: // variable colormap via 242 linedef
|
||||
case 606: //SoM: 4/4/2000: Just colormap transfer
|
||||
// SoM: R_CreateColormap will only create a colormap in software mode...
|
||||
// Perhaps we should just call it instead of doing the calculations here.
|
||||
@@ -1441,26 +1288,26 @@ static void P_LoadSidedefs(void *data)
|
||||
if (msd->toptexture[0] != '-' || msd->toptexture[1] != '\0')
|
||||
{
|
||||
char process[8+1];
|
||||
memcpy(process, msd->toptexture, 8);
|
||||
memcpy(process,msd->toptexture,8);
|
||||
process[8] = '\0';
|
||||
sd->toptexture = get_number(process);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 9: // Mace parameters
|
||||
case 14: // Bustable block parameters
|
||||
case 15: // Fan particle spawner parameters
|
||||
case 9: // Mace parameters
|
||||
case 14: // Bustable block parameters
|
||||
case 15: // Fan particle spawner parameters
|
||||
case 425: // Calls P_SetMobjState on calling mobj
|
||||
case 434: // Custom Power
|
||||
case 442: // Calls P_SetMobjState on mobjs of a given type in the tagged sectors
|
||||
{
|
||||
char process[8*3+1];
|
||||
memset(process, 0, 8*3+1);
|
||||
memset(process,0,8*3+1);
|
||||
sd->toptexture = sd->midtexture = sd->bottomtexture = 0;
|
||||
if (msd->toptexture[0] == '-' && msd->toptexture[1] == '\0')
|
||||
break;
|
||||
else
|
||||
memcpy(process, msd->toptexture, 8);
|
||||
memcpy(process,msd->toptexture,8);
|
||||
if (msd->midtexture[0] != '-' || msd->midtexture[1] != '\0')
|
||||
memcpy(process+strlen(process), msd->midtexture, 8);
|
||||
if (msd->bottomtexture[0] != '-' || msd->bottomtexture[1] != '\0')
|
||||
@@ -1472,12 +1319,12 @@ static void P_LoadSidedefs(void *data)
|
||||
case 443: // Calls a named Lua function
|
||||
{
|
||||
char process[8*3+1];
|
||||
memset(process, 0, 8*3+1);
|
||||
memset(process,0,8*3+1);
|
||||
sd->toptexture = sd->midtexture = sd->bottomtexture = 0;
|
||||
if (msd->toptexture[0] == '-' && msd->toptexture[1] == '\0')
|
||||
break;
|
||||
else
|
||||
memcpy(process,msd->toptexture, 8);
|
||||
memcpy(process,msd->toptexture,8);
|
||||
if (msd->midtexture[0] != '-' || msd->midtexture[1] != '\0')
|
||||
memcpy(process+strlen(process), msd->midtexture, 8);
|
||||
if (msd->bottomtexture[0] != '-' || msd->bottomtexture[1] != '\0')
|
||||
@@ -1778,80 +1625,6 @@ static void P_CreateBlockMap(void)
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// P_VerifyBlockMap
|
||||
//
|
||||
// haleyjd 03/04/10: do verification on validity of blockmap.
|
||||
//
|
||||
static boolean P_VerifyBlockMap(INT32 count)
|
||||
{
|
||||
// FIXME: should any of this shit be unsinged?
|
||||
INT32 x, y;
|
||||
INT32 *maxoffs = blockmaplump + count;
|
||||
|
||||
//skipblstart = true;
|
||||
|
||||
for (y = 0; y < bmapheight; y++)
|
||||
{
|
||||
for (x = 0; x < bmapwidth; x++)
|
||||
{
|
||||
INT32 offset;
|
||||
INT32 *list, *tmplist;
|
||||
INT32 *blockoffset;
|
||||
|
||||
offset = y * bmapwidth + x;
|
||||
blockoffset = blockmaplump + offset + 4;
|
||||
|
||||
// check that block offset is in bounds
|
||||
if (blockoffset >= maxoffs)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "P_VerifyBlockMap: block offset overflow\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
offset = *blockoffset;
|
||||
|
||||
// check that list offset is in bounds
|
||||
if (offset < 4 || offset >= count)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "P_VerifyBlockMap: list offset overflow\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
list = blockmaplump + offset;
|
||||
|
||||
//if (*list != 0)
|
||||
//skipblstart = false;
|
||||
|
||||
// scan forward for a -1 terminator before maxoffs
|
||||
for (tmplist = list; ; tmplist++)
|
||||
{
|
||||
// we have overflowed the lump?
|
||||
if (tmplist >= maxoffs)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "P_VerifyBlockMap: open blocklist\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (*tmplist == -1) // found -1
|
||||
break;
|
||||
}
|
||||
|
||||
// scan the list for out-of-range linedef indicies in list
|
||||
for (tmplist = list; *tmplist != -1; tmplist++)
|
||||
{
|
||||
if (*tmplist < 0 || *tmplist >= (INT32)numlines)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "P_VerifyBlockMap: index >= numlines\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Split from P_LoadBlockMap for convenience
|
||||
// -- Monster Iestyn 08/01/18
|
||||
static void P_ReadBlockMapLump(INT16 *wadblockmaplump, size_t count)
|
||||
@@ -1893,20 +1666,9 @@ static boolean P_LoadRawBlockMap(UINT8 *data, size_t count)
|
||||
|
||||
bmaporgx = blockmaplump[0]<<FRACBITS;
|
||||
bmaporgy = blockmaplump[1]<<FRACBITS;
|
||||
bmapwidth = blockmaplump[2];
|
||||
bmapwidth = blockmaplump[2];
|
||||
bmapheight = blockmaplump[3];
|
||||
|
||||
// haleyjd 03/04/10: check for blockmap problems
|
||||
// http://www.doomworld.com/idgames/index.php?id=12935
|
||||
if (!P_VerifyBlockMap(count))
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadBlockMap: corrupted or invalid BLOCKMAP lump! Check the log for more information.\n"));
|
||||
// vanilla WILL crash here anyways so just rebuild it ourselves
|
||||
Z_Free(blockmaplump);
|
||||
blockmaplump = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
// clear out mobj chains
|
||||
count = sizeof (*blocklinks)* bmapwidth*bmapheight;
|
||||
blocklinks = Z_Calloc(count, PU_LEVEL, NULL);
|
||||
@@ -1941,35 +1703,22 @@ static void P_GroupLines(void)
|
||||
for (i = 0; i < numsubsectors; i++, ss++)
|
||||
{
|
||||
if (ss->firstline >= numsegs)
|
||||
{
|
||||
CorruptMapError(va("P_GroupLines: ss->firstline invalid "
|
||||
"(subsector %s, firstline refers to %d of %s)", sizeu1(i), ss->firstline,
|
||||
sizeu2(numsegs)));
|
||||
}
|
||||
|
||||
seg = &segs[ss->firstline];
|
||||
sidei = (size_t)(seg->sidedef - sides);
|
||||
|
||||
if (!seg->sidedef)
|
||||
{
|
||||
CorruptMapError(va("P_GroupLines: seg->sidedef is NULL "
|
||||
"(subsector %s, firstline is %d)", sizeu1(i), ss->firstline));
|
||||
}
|
||||
|
||||
if (seg->sidedef - sides < 0 || seg->sidedef - sides > (UINT16)numsides)
|
||||
{
|
||||
CorruptMapError(va("P_GroupLines: seg->sidedef refers to sidedef %s of %s "
|
||||
"(subsector %s, firstline is %d)", sizeu1(sidei), sizeu2(numsides),
|
||||
sizeu3(i), ss->firstline));
|
||||
}
|
||||
|
||||
if (!seg->sidedef->sector)
|
||||
{
|
||||
CorruptMapError(va("P_GroupLines: seg->sidedef->sector is NULL "
|
||||
"(subsector %s, firstline is %d, sidedef is %s)", sizeu1(i), ss->firstline,
|
||||
sizeu1(sidei)));
|
||||
}
|
||||
|
||||
ss->sector = seg->sidedef->sector;
|
||||
}
|
||||
|
||||
@@ -2031,36 +1780,20 @@ static void P_GroupLines(void)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// PK3 version
|
||||
// -- Monster Iestyn 09/01/18
|
||||
static void P_LoadReject(UINT8 *data, size_t rejectsize)
|
||||
static void P_LoadReject(UINT8 *data, size_t count)
|
||||
{
|
||||
const size_t neededsize = (numsectors * numsectors + 7) >> 3;
|
||||
size_t allocsize = rejectsize;
|
||||
|
||||
if (!rejectsize) // zero length, someone probably used ZDBSP
|
||||
if (!count) // zero length, someone probably used ZDBSP
|
||||
{
|
||||
rejectmatrix = NULL;
|
||||
CONS_Debug(DBG_SETUP, "P_LoadReject: REJECT lump has size 0, will not be loaded\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rejectsize < neededsize)
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadReject: REJECT is %s byte%s too small. REJECT might be invalid!\n", sizeu1(neededsize - rejectsize), (neededsize - rejectsize) == 1 ? "" : "s"));
|
||||
#ifdef COMPAT_VANILLA
|
||||
// we can pad this and somewhat prevent desyncs
|
||||
// probs not cool if the reject is from a completely different map
|
||||
// but whatever
|
||||
allocsize = neededsize;
|
||||
#else
|
||||
rejectmatrix = NULL;
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
rejectmatrix = Z_Calloc(allocsize, PU_LEVEL, NULL); // allocate memory for the reject matrix
|
||||
memcpy(rejectmatrix, data, rejectsize); // copy the data into it
|
||||
rejectmatrix = Z_Malloc(count, PU_LEVEL, NULL); // allocate memory for the reject matrix
|
||||
memcpy(rejectmatrix, data, count); // copy the data into it
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2098,13 +1831,9 @@ static void P_LoadMapLUT(const virtres_t* virt)
|
||||
|
||||
// Lookup tables
|
||||
if (virtreject)
|
||||
{
|
||||
P_LoadReject(virtreject->data, virtreject->size);
|
||||
}
|
||||
else
|
||||
{
|
||||
rejectmatrix = NULL;
|
||||
}
|
||||
|
||||
if (!(virtblockmap && P_LoadRawBlockMap(virtblockmap->data, virtblockmap->size)))
|
||||
P_CreateBlockMap();
|
||||
@@ -3198,7 +2927,7 @@ static size_t sreplaces = 0, mreplaces = 0, digmreplaces = 0;
|
||||
static boolean P_CheckSoundReplacements(UINT16 wadnum, char *name, size_t i)
|
||||
{
|
||||
size_t j;
|
||||
lumpnum_t lumpnum = (i | (wadnum<<16));
|
||||
lumpnum_t lumpnum = (i|(wadnum<<16));
|
||||
|
||||
if (name[0] == 'D')
|
||||
{
|
||||
@@ -3206,8 +2935,8 @@ static boolean P_CheckSoundReplacements(UINT16 wadnum, char *name, size_t i)
|
||||
{
|
||||
for (j = 1; j < NUMSFX; j++)
|
||||
{
|
||||
if ((S_sfx[j].lumpnum != lumpnum) && (S_sfx[j].lumpnum != LUMPERROR) &&
|
||||
S_sfx[j].name && !strnicmp(S_sfx[j].name, name + 2, 6))
|
||||
if (S_sfx[j].name && !strnicmp(S_sfx[j].name, name + 2, 6)
|
||||
&& (S_sfx[j].lumpnum != lumpnum) && (S_sfx[j].lumpnum != LUMPERROR))
|
||||
{
|
||||
// the sound will be reloaded when needed,
|
||||
// since sfx->data will be NULL
|
||||
|
||||
@@ -114,9 +114,6 @@ size_t P_PrecacheLevelFlats(void);
|
||||
|
||||
void P_AllocMapHeader(INT16 i);
|
||||
|
||||
void P_PrintCorruptMapWarnings(void);
|
||||
void P_FreeCorruptMapWarnings(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
+22
-40
@@ -31,6 +31,8 @@ typedef struct {
|
||||
fixed_t bbox[4];
|
||||
} los_t;
|
||||
|
||||
static INT32 sightcounts[2];
|
||||
|
||||
typedef INT32 (*divlinefunc)(fixed_t x, fixed_t y, const divline_t *node);
|
||||
typedef INT32 (*divlinecrossfunc)(fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2, const divline_t *node);
|
||||
|
||||
@@ -71,7 +73,7 @@ static inline INT32 P_DivlineCrossedFast(fixed_t x1, fixed_t y1, fixed_t x2, fix
|
||||
return (P_DivlineSideFast(x1, y1, node) == P_DivlineSideFast(x2, y2, node));
|
||||
}
|
||||
|
||||
static boolean P_CrossSubsecPolyObj(polyobj_t *po, register los_t *los, boolean fast)
|
||||
static boolean P_CrossSubsecPolyObj(polyobj_t *po, register los_t *los)
|
||||
{
|
||||
size_t i;
|
||||
sector_t *polysec;
|
||||
@@ -79,8 +81,6 @@ static boolean P_CrossSubsecPolyObj(polyobj_t *po, register los_t *los, boolean
|
||||
if (!(po->flags & POF_RENDERALL))
|
||||
return true; // the polyobject isn't visible, so we can ignore it
|
||||
|
||||
const divlinecrossfunc divlinecrossFunc = fast ? P_DivlineCrossedFast : P_DivlineCrossed;
|
||||
|
||||
polysec = po->lines[0]->backsector;
|
||||
|
||||
for (i = 0; i < po->numLines; ++i)
|
||||
@@ -108,21 +108,21 @@ static boolean P_CrossSubsecPolyObj(polyobj_t *po, register los_t *los, boolean
|
||||
v2 = line->v2;
|
||||
|
||||
// line isn't crossed?
|
||||
if (divlinecrossFunc(v1->x, v1->y, v2->x, v2->y, &los->strace))
|
||||
if (P_DivlineCrossed(v1->x, v1->y, v2->x, v2->y, &los->strace))
|
||||
continue;
|
||||
|
||||
divl.dx = v2->x - (divl.x = v1->x);
|
||||
divl.dy = v2->y - (divl.y = v1->y);
|
||||
|
||||
// line isn't crossed?
|
||||
if (divlinecrossFunc(los->strace.x, los->strace.y, los->t2x, los->t2y, &divl))
|
||||
if (P_DivlineCrossed(los->strace.x, los->strace.y, los->t2x, los->t2y, &divl))
|
||||
continue;
|
||||
|
||||
frac = P_InterceptVector(&los->strace, &divl);
|
||||
|
||||
// get slopes of top and bottom of this polyobject line
|
||||
topslope = FixedDiv(polysec->ceilingheight - los->sightzstart, frac);
|
||||
bottomslope = FixedDiv(polysec->floorheight - los->sightzstart, frac);
|
||||
topslope = FixedDiv(polysec->ceilingheight - los->sightzstart , frac);
|
||||
bottomslope = FixedDiv(polysec->floorheight - los->sightzstart , frac);
|
||||
|
||||
if (topslope >= los->topslope && bottomslope <= los->bottomslope)
|
||||
return false; // view completely blocked
|
||||
@@ -147,8 +147,6 @@ static boolean P_CrossSubsector(size_t num, register los_t *los, boolean fast)
|
||||
I_Error("P_CrossSubsector: ss %s with numss = %s\n", sizeu1(num), sizeu2(numsubsectors));
|
||||
#endif
|
||||
|
||||
const divlinecrossfunc divlinecrossFunc = fast ? P_DivlineCrossedFast : P_DivlineCrossed;
|
||||
|
||||
// haleyjd 02/23/06: this assignment should be after the above check
|
||||
seg = segs + subsectors[num].firstline;
|
||||
|
||||
@@ -160,13 +158,15 @@ static boolean P_CrossSubsector(size_t num, register los_t *los, boolean fast)
|
||||
if (po->validcount != validcount)
|
||||
{
|
||||
po->validcount = validcount;
|
||||
if (!P_CrossSubsecPolyObj(po, los, fast))
|
||||
if (!P_CrossSubsecPolyObj(po, los))
|
||||
return false;
|
||||
}
|
||||
po = (polyobj_t *)(po->link.next);
|
||||
}
|
||||
}
|
||||
|
||||
const divlinecrossfunc divlinecrossFunc = fast ? P_DivlineCrossedFast : P_DivlineCrossed;
|
||||
|
||||
for (count = subsectors[num].numlines; --count >= 0; seg++) // check lines
|
||||
{
|
||||
line_t *line = seg->linedef;
|
||||
@@ -214,17 +214,14 @@ static boolean P_CrossSubsector(size_t num, register los_t *los, boolean fast)
|
||||
|
||||
front = seg->frontsector;
|
||||
back = seg->backsector;
|
||||
|
||||
// calculate position at intercept
|
||||
fracx = los->strace.x + FixedMul(los->strace.dx, frac);
|
||||
fracy = los->strace.y + FixedMul(los->strace.dy, frac);
|
||||
|
||||
// calculate sector heights
|
||||
frontf = P_GetSectorFloorZAt (front, fracx, fracy);
|
||||
frontc = P_GetSectorCeilingZAt(front, fracx, fracy);
|
||||
backf = P_GetSectorFloorZAt (back , fracx, fracy);
|
||||
backc = P_GetSectorCeilingZAt(back , fracx, fracy);
|
||||
|
||||
// crosses a two sided line
|
||||
// no wall to block sight with?
|
||||
if (frontf == backf && frontc == backc
|
||||
@@ -265,7 +262,6 @@ static boolean P_CrossSubsector(size_t num, register los_t *los, boolean fast)
|
||||
ffloor_t *rover;
|
||||
fixed_t topslope, bottomslope;
|
||||
fixed_t topz, bottomz;
|
||||
|
||||
// check front sector's FOFs first
|
||||
for (rover = front->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
@@ -279,11 +275,9 @@ static boolean P_CrossSubsector(size_t num, register los_t *los, boolean fast)
|
||||
bottomz = P_GetFFloorBottomZAt(rover, fracx, fracy);
|
||||
topslope = FixedDiv( topz - los->sightzstart, frac);
|
||||
bottomslope = FixedDiv(bottomz - los->sightzstart, frac);
|
||||
|
||||
if (topslope >= los->topslope && bottomslope <= los->bottomslope)
|
||||
return false; // view completely blocked
|
||||
}
|
||||
|
||||
// check back sector's FOFs as well
|
||||
for (rover = back->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
@@ -297,7 +291,6 @@ static boolean P_CrossSubsector(size_t num, register los_t *los, boolean fast)
|
||||
bottomz = P_GetFFloorBottomZAt(rover, fracx, fracy);
|
||||
topslope = FixedDiv( topz - los->sightzstart, frac);
|
||||
bottomslope = FixedDiv(bottomz - los->sightzstart, frac);
|
||||
|
||||
if (topslope >= los->topslope && bottomslope <= los->bottomslope)
|
||||
return false; // view completely blocked
|
||||
}
|
||||
@@ -322,10 +315,10 @@ static boolean P_CrossBSPNode(INT32 bspnum, register los_t *los, boolean fast)
|
||||
|
||||
while (!(bspnum & NF_SUBSECTOR))
|
||||
{
|
||||
register const node_t *bsp = nodes + bspnum;
|
||||
register node_t *bsp = nodes + bspnum;
|
||||
|
||||
INT32 side = divlineFunc(los->strace.x, los->strace.y, (const divline_t *)bsp) & 1;
|
||||
INT32 side2 = divlineFunc(los->t2x, los->t2y, (const divline_t *)bsp);
|
||||
INT32 side = divlineFunc(los->strace.x, los->strace.y, (divline_t *)bsp) & 1;
|
||||
INT32 side2 = divlineFunc(los->t2x, los->t2y, (divline_t *) bsp);
|
||||
|
||||
if (side == side2)
|
||||
{
|
||||
@@ -364,10 +357,8 @@ boolean P_CheckSight2(mobj_t *t1, mobj_t *t2, boolean fast)
|
||||
I_Assert(!P_MobjWasRemoved(t2));
|
||||
|
||||
if (!t1->subsector || !t2->subsector
|
||||
|| !t1->subsector->sector || !t2->subsector->sector)
|
||||
{
|
||||
|| !t1->subsector->sector || !t2->subsector->sector)
|
||||
return false;
|
||||
}
|
||||
|
||||
s1 = t1->subsector->sector;
|
||||
s2 = t2->subsector->sector;
|
||||
@@ -377,9 +368,7 @@ boolean P_CheckSight2(mobj_t *t1, mobj_t *t2, boolean fast)
|
||||
{
|
||||
// Check in REJECT table.
|
||||
if (rejectmatrix[pnum>>3] & (1 << (pnum&7))) // can't possibly be connected
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// killough 11/98: shortcut for melee situations
|
||||
@@ -387,9 +376,11 @@ boolean P_CheckSight2(mobj_t *t1, mobj_t *t2, boolean fast)
|
||||
// haleyjd 02/23/06: can't do this if there are polyobjects in the subsec
|
||||
if (!t1->subsector->polyList &&
|
||||
t1->subsector == t2->subsector)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// An unobstructed LOS is possible.
|
||||
// Now look from eyes of t1 to any part of t2.
|
||||
sightcounts[1]++;
|
||||
|
||||
validcount++;
|
||||
|
||||
@@ -432,30 +423,21 @@ boolean P_CheckSight2(mobj_t *t1, mobj_t *t2, boolean fast)
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check for blocking floors here.
|
||||
|
||||
topz1 = P_GetFFloorTopZAt (rover, t1->x, t1->y);
|
||||
topz2 = P_GetFFloorTopZAt (rover, t2->x, t2->y);
|
||||
bottomz1 = P_GetFFloorBottomZAt(rover, t1->x, t1->y);
|
||||
|
||||
if (los.sightzstart < bottomz1 && t2->z >= topz2)
|
||||
{
|
||||
// no way to see through that
|
||||
return false;
|
||||
}
|
||||
|
||||
topz1 = P_GetFFloorTopZAt (rover, t1->x, t1->y);
|
||||
bottomz2 = P_GetFFloorBottomZAt(rover, t2->x, t2->y);
|
||||
|
||||
if (los.sightzstart >= topz1 && t2->z + t2->height < bottomz2)
|
||||
// Check for blocking floors here.
|
||||
if ((los.sightzstart < bottomz1 && t2->z >= topz2)
|
||||
|| (los.sightzstart >= topz1 && t2->z + t2->height < bottomz2))
|
||||
{
|
||||
// no way to see through that
|
||||
return false;
|
||||
}
|
||||
|
||||
if (rover->flags & FF_SOLID)
|
||||
{
|
||||
continue; // shortcut since neither mobj can be inside the 3dfloor
|
||||
}
|
||||
|
||||
if (rover->flags & FF_BOTHPLANES || !(rover->flags & FF_INVERTPLANES))
|
||||
{
|
||||
|
||||
+1
-4
@@ -166,8 +166,7 @@ static void P_ReconfigureVertexSlope(pslope_t *slope)
|
||||
slope->real_xydirection = R_PointToAngle2(0, 0, slope->d.x, slope->d.y)+ANGLE_180;
|
||||
slope->real_zangle = InvAngle(R_PointToAngle2(0, 0, FRACUNIT, slope->zdelta));
|
||||
|
||||
// Set some defaults for a non-sloped "slope"
|
||||
if (slope->normal.x == 0 && slope->normal.y == 0)
|
||||
if (slope->normal.x == 0 && slope->normal.y == 0) // Set some defaults for a non-sloped "slope"
|
||||
{
|
||||
slope->zangle = slope->xydirection = 0;
|
||||
slope->zdelta = slope->d.x = slope->d.y = 0;
|
||||
@@ -664,10 +663,8 @@ static pslope_t *P_NewVertexSlope(INT16 tag1, INT16 tag2, INT16 tag3, UINT8 flag
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
mt = ret->vertices[i];
|
||||
|
||||
if (!mt) // If a vertex wasn't found, it's game over. There's nothing you can do to recover (except maybe try and kill the slope instead - TODO?)
|
||||
I_Error("P_NewVertexSlope: Slope vertex %s (for linedef tag %d) not found!", sizeu1(i), tag1);
|
||||
|
||||
if (mt->extrainfo)
|
||||
mt->z = mt->options;
|
||||
else
|
||||
|
||||
+127
-223
@@ -881,7 +881,7 @@ static boolean PolyDoor(line_t *line)
|
||||
|
||||
pdd.polyObjNum = line->tag; // polyobject id
|
||||
|
||||
switch (line->special)
|
||||
switch(line->special)
|
||||
{
|
||||
case 480: // Polyobj_DoorSlide
|
||||
pdd.doorType = POLY_DOOR_SLIDE;
|
||||
@@ -889,7 +889,7 @@ static boolean PolyDoor(line_t *line)
|
||||
pdd.angle = line->angle; // angle of motion
|
||||
pdd.distance = sides[line->sidenum[0]].rowoffset;
|
||||
|
||||
if (line->sidenum[1] != NO_INDEX)
|
||||
if (line->sidenum[1] != 0xffff)
|
||||
pdd.delay = sides[line->sidenum[1]].textureoffset >> FRACBITS; // delay in tics
|
||||
else
|
||||
pdd.delay = 0;
|
||||
@@ -899,7 +899,7 @@ static boolean PolyDoor(line_t *line)
|
||||
pdd.speed = sides[line->sidenum[0]].textureoffset >> FRACBITS; // angular speed
|
||||
pdd.distance = sides[line->sidenum[0]].rowoffset >> FRACBITS; // angular distance
|
||||
|
||||
if (line->sidenum[1] != NO_INDEX)
|
||||
if (line->sidenum[1] != 0xffff)
|
||||
pdd.delay = sides[line->sidenum[1]].textureoffset >> FRACBITS; // delay in tics
|
||||
else
|
||||
pdd.delay = 0;
|
||||
@@ -1234,6 +1234,7 @@ static void P_AddExecutorDelay(line_t *line, mobj_t *mobj, sector_t *sector)
|
||||
boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller)
|
||||
{
|
||||
sector_t *ctlsector;
|
||||
fixed_t dist = P_AproxDistance(triggerline->dx, triggerline->dy)>>FRACBITS;
|
||||
size_t i, linecnt, sectori;
|
||||
INT16 specialtype = triggerline->special;
|
||||
//fromlapexec = false;
|
||||
@@ -1271,8 +1272,6 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
rings = actor->health-1;
|
||||
}
|
||||
|
||||
const fixed_t dist = P_AproxDistance(triggerline->dx, triggerline->dy)>>FRACBITS;
|
||||
|
||||
if (triggerline->flags & ML_NOCLIMB)
|
||||
{
|
||||
if (rings > dist)
|
||||
@@ -1294,6 +1293,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
msecnode_t *node;
|
||||
mobj_t *mo;
|
||||
INT32 numpush = 0;
|
||||
INT32 numneeded = dist;
|
||||
|
||||
if (!caller)
|
||||
return false; // we need a calling sector to find pushables in, silly!
|
||||
@@ -1308,8 +1308,6 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
node = node->m_thinglist_next;
|
||||
}
|
||||
|
||||
const fixed_t numneeded = P_AproxDistance(triggerline->dx, triggerline->dy)>>FRACBITS;
|
||||
|
||||
if (triggerline->flags & ML_NOCLIMB) // Need at least or more
|
||||
{
|
||||
if (numpush < numneeded)
|
||||
@@ -1338,7 +1336,6 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
else if (secspecial == 7) // SRB2Kart: reusing for Race Lap executor
|
||||
{
|
||||
UINT8 lap;
|
||||
INT32 targlap;
|
||||
|
||||
if (actor && actor->player && triggerline->flags & ML_EFFECT4)
|
||||
{
|
||||
@@ -1349,21 +1346,19 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
lap = P_FindLowestLap();
|
||||
}
|
||||
|
||||
targlap = (INT32)(sides[triggerline->sidenum[0]].textureoffset >> FRACBITS);
|
||||
|
||||
if (triggerline->flags & ML_NOCLIMB) // Need higher than or equal to
|
||||
{
|
||||
if (lap < targlap)
|
||||
if (lap < (sides[triggerline->sidenum[0]].textureoffset >> FRACBITS))
|
||||
return false;
|
||||
}
|
||||
else if (triggerline->flags & ML_BLOCKMONSTERS) // Need lower than or equal to
|
||||
{
|
||||
if (lap > targlap)
|
||||
if (lap > (sides[triggerline->sidenum[0]].textureoffset >> FRACBITS))
|
||||
return false;
|
||||
}
|
||||
else // Need equal to
|
||||
{
|
||||
if (lap != targlap)
|
||||
if (lap != (sides[triggerline->sidenum[0]].textureoffset >> FRACBITS))
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1455,7 +1450,6 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
if (triggerline->flags & ML_EFFECT5) // disregard order for efficiency
|
||||
{
|
||||
for (i = 0; i < linecnt; i++)
|
||||
{
|
||||
if (ctlsector->lines[i]->special >= 400
|
||||
&& ctlsector->lines[i]->special < 500)
|
||||
{
|
||||
@@ -1464,7 +1458,6 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
else
|
||||
P_ProcessLineSpecial(ctlsector->lines[i], actor, caller);
|
||||
}
|
||||
}
|
||||
}
|
||||
else // walk around the sector in a defined order
|
||||
{
|
||||
@@ -1472,13 +1465,11 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
size_t j, masterlineindex = (size_t)-1;
|
||||
|
||||
for (i = 0; i < linecnt; i++)
|
||||
{
|
||||
if (ctlsector->lines[i] == triggerline)
|
||||
{
|
||||
masterlineindex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PARANOIA
|
||||
if (masterlineindex == (size_t)-1)
|
||||
@@ -1497,13 +1488,11 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
{
|
||||
if (i == j)
|
||||
continue;
|
||||
|
||||
if (ctlsector->lines[i]->v1 == ctlsector->lines[j]->v2)
|
||||
{
|
||||
i = j;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ctlsector->lines[i]->v1 == ctlsector->lines[j]->v1)
|
||||
{
|
||||
i = j;
|
||||
@@ -1511,7 +1500,6 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (j == linecnt)
|
||||
{
|
||||
const size_t vertexei = (size_t)(ctlsector->lines[i]->v1 - vertexes);
|
||||
@@ -1526,13 +1514,11 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
{
|
||||
if (i == j)
|
||||
continue;
|
||||
|
||||
if (ctlsector->lines[i]->v2 == ctlsector->lines[j]->v1)
|
||||
{
|
||||
i = j;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ctlsector->lines[i]->v2 == ctlsector->lines[j]->v2)
|
||||
{
|
||||
i = j;
|
||||
@@ -1609,21 +1595,19 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller)
|
||||
if (lines[masterline].tag != tag)
|
||||
continue;
|
||||
|
||||
const INT16 specialtype = lines[masterline].special;
|
||||
|
||||
// "No More Enemies" and "Level Load" take care of themselves.
|
||||
if (specialtype == 313
|
||||
|| specialtype == 399
|
||||
|| specialtype == 328
|
||||
|| specialtype == 323
|
||||
if (lines[masterline].special == 313
|
||||
|| lines[masterline].special == 399
|
||||
|| lines[masterline].special == 328
|
||||
|| lines[masterline].special == 323
|
||||
// Each-time executors handle themselves, too
|
||||
|| specialtype == 301 // Each time
|
||||
|| specialtype == 306 // Character ability - Each time
|
||||
|| specialtype == 310 // CTF Red team - Each time
|
||||
|| specialtype == 312 // CTF Blue team - Each time
|
||||
|| specialtype == 322 // Trigger on X calls - Each Time
|
||||
|| specialtype < 300
|
||||
|| specialtype > 399)
|
||||
|| lines[masterline].special == 301 // Each time
|
||||
|| lines[masterline].special == 306 // Character ability - Each time
|
||||
|| lines[masterline].special == 310 // CTF Red team - Each time
|
||||
|| lines[masterline].special == 312 // CTF Blue team - Each time
|
||||
|| lines[masterline].special == 322 // Trigger on X calls - Each Time
|
||||
|| lines[masterline].special < 300
|
||||
|| lines[masterline].special > 399)
|
||||
continue;
|
||||
|
||||
if (!P_RunTriggerLinedef(&lines[masterline], actor, caller))
|
||||
@@ -1989,8 +1973,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
INT32 position = (INT32)max(sides[line->sidenum[0]].midtexture, 0);
|
||||
UINT32 prefadems = (UINT32)max(sides[line->sidenum[0]].textureoffset >> FRACBITS, 0);
|
||||
UINT32 postfadems = (UINT32)max(sides[line->sidenum[0]].rowoffset >> FRACBITS, 0);
|
||||
UINT8 fadetarget = (UINT8)max((line->sidenum[1] != NO_INDEX) ? sides[line->sidenum[1]].textureoffset >> FRACBITS : 0, 0);
|
||||
INT16 fadesource = (INT16)max((line->sidenum[1] != NO_INDEX) ? sides[line->sidenum[1]].rowoffset >> FRACBITS : -1, -1);
|
||||
UINT8 fadetarget = (UINT8)max((line->sidenum[1] != 0xffff) ? sides[line->sidenum[1]].textureoffset >> FRACBITS : 0, 0);
|
||||
INT16 fadesource = (INT16)max((line->sidenum[1] != 0xffff) ? sides[line->sidenum[1]].rowoffset >> FRACBITS : -1, -1);
|
||||
|
||||
// Seek offset from current song position
|
||||
if (line->flags & ML_EFFECT1)
|
||||
@@ -2435,8 +2419,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
P_SetPlayerMobjState(mo, S_KART_STND1); // SRB2kart - was S_PLAY_STND
|
||||
|
||||
// Reset bot too.
|
||||
if (bot)
|
||||
{
|
||||
if (bot) {
|
||||
if (line->flags & ML_NOCLIMB)
|
||||
P_SetOrigin(bot, mo->x, mo->y, mo->z);
|
||||
bot->momx = bot->momy = bot->momz = 1;
|
||||
@@ -2504,7 +2487,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
|
||||
var1 = sides[line->sidenum[0]].toptexture; //(line->dx>>FRACBITS)-1;
|
||||
|
||||
if (line->sidenum[1] != NO_INDEX && line->flags & ML_BLOCKMONSTERS) // read power from back sidedef
|
||||
if (line->sidenum[1] != 0xffff && line->flags & ML_BLOCKMONSTERS) // read power from back sidedef
|
||||
var2 = sides[line->sidenum[1]].toptexture;
|
||||
else if (line->flags & ML_NOCLIMB) // 'Infinite'
|
||||
var2 = UINT16_MAX;
|
||||
@@ -2519,7 +2502,6 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
P_SetTarget(&dummy->target, bot);
|
||||
A_CustomPower(dummy);
|
||||
}
|
||||
|
||||
P_RemoveMobj(dummy);
|
||||
}
|
||||
break;
|
||||
@@ -2583,15 +2565,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
if (mo && mo->player)
|
||||
{
|
||||
UINT16 fractime = (UINT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS);
|
||||
|
||||
if (fractime < 1)
|
||||
fractime = 1; //instantly wears off upon leaving
|
||||
|
||||
if (line->flags & ML_NOCLIMB)
|
||||
fractime |= 1<<15; //more crazy &ing, as if music stuff wasn't enough
|
||||
|
||||
mo->player->powers[pw_nocontrol] = fractime;
|
||||
|
||||
if (bot)
|
||||
bot->player->powers[pw_nocontrol] = fractime;
|
||||
}
|
||||
@@ -2601,10 +2579,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
if (mo)
|
||||
{
|
||||
mo->destscale = FixedDiv(P_AproxDistance(line->dx, line->dy), 100<<FRACBITS);
|
||||
|
||||
if (mo->destscale < FRACUNIT/100)
|
||||
mo->destscale = FRACUNIT/100;
|
||||
|
||||
if (mo->player && bot)
|
||||
bot->destscale = mo->destscale;
|
||||
}
|
||||
@@ -2633,7 +2609,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
if (always || this->bottomtexture)
|
||||
this->bottomtexture = set->bottomtexture;
|
||||
|
||||
if (lines[linenum].sidenum[1] == NO_INDEX)
|
||||
if (lines[linenum].sidenum[1] == 0xffff)
|
||||
continue; // One-sided stops here.
|
||||
|
||||
// Back side
|
||||
@@ -2682,18 +2658,16 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
sector_t *sec;
|
||||
mobj_t *thing;
|
||||
|
||||
if (line->sidenum[1] != NO_INDEX)
|
||||
if (line->sidenum[1] != 0xffff)
|
||||
state = (statenum_t)sides[line->sidenum[1]].toptexture;
|
||||
|
||||
while ((secnum = P_FindSectorFromLineTag(line, secnum)) >= 0)
|
||||
{
|
||||
boolean tryagain;
|
||||
sec = sectors + secnum;
|
||||
|
||||
do {
|
||||
tryagain = false;
|
||||
for (thing = sec->thinglist; thing; thing = thing->snext)
|
||||
{
|
||||
if (thing->type == type)
|
||||
{
|
||||
if (state != NUMSTATES)
|
||||
@@ -2710,7 +2684,6 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} while (tryagain);
|
||||
}
|
||||
break;
|
||||
@@ -3286,7 +3259,6 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
||||
case 3: // Linedef executor requires all players present // Trigger Linedef Exec (Floor Touch, All Players)
|
||||
/// \todo check continues for proper splitscreen support?
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (playeringame[i] && !players[i].bot && players[i].mo && (gametype != GT_COOP || players[i].lives > 0))
|
||||
{
|
||||
if (roversector)
|
||||
@@ -3340,7 +3312,6 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
||||
goto DoneSection2;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* FALLTHRU */
|
||||
case 4: // Linedef executor that doesn't require touching floor // Trigger Linedef Exec (Anywhere in Sector)
|
||||
case 5: // Linedef executor // Trigger Linedef Exec (Floor Touch)
|
||||
@@ -3414,16 +3385,14 @@ DoneSection2:
|
||||
{
|
||||
const fixed_t hscale = mapobjectscale + (mapobjectscale - player->mo->scale);
|
||||
const fixed_t minspeed = 24*hscale;
|
||||
angle_t pushangle = FixedHypot(player->mo->momx, player->mo->momy) ? R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy) : player->mo->angle;
|
||||
// if we have no speed for SOME REASON, use the player's angle, otherwise we'd be forcefully thrusted to what I can only assume is angle 0
|
||||
|
||||
if (player->mo->eflags & MFE_SPRUNG)
|
||||
break;
|
||||
|
||||
if (player->speed < minspeed) // Push forward to prevent getting stuck
|
||||
{
|
||||
// if we have no speed for SOME REASON, use the player's angle, otherwise we'd be forcefully thrusted to what I can only assume is angle 0
|
||||
const angle_t pushangle = FixedHypot(player->mo->momx, player->mo->momy) ? R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy) : player->mo->angle;
|
||||
P_InstaThrust(player->mo, pushangle, minspeed);
|
||||
}
|
||||
|
||||
player->kartstuff[k_pogospring] = 1;
|
||||
K_DoPogoSpring(player->mo, 0, 1);
|
||||
@@ -3439,22 +3408,16 @@ DoneSection2:
|
||||
const fixed_t hscale = mapobjectscale + (mapobjectscale - player->mo->scale);
|
||||
const fixed_t minspeed = 24*hscale;
|
||||
const fixed_t maxspeed = 28*hscale;
|
||||
angle_t pushangle = FixedHypot(player->mo->momx, player->mo->momy) ? R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy) : player->mo->angle;
|
||||
// if we have no speed for SOME REASON, use the player's angle, otherwise we'd be forcefully thrusted to what I can only assume is angle 0
|
||||
|
||||
if (player->mo->eflags & MFE_SPRUNG)
|
||||
break;
|
||||
|
||||
if (player->speed > maxspeed) // Prevent overshooting jumps
|
||||
{
|
||||
// if we have no speed for SOME REASON, use the player's angle, otherwise we'd be forcefully thrusted to what I can only assume is angle 0
|
||||
const angle_t pushangle = FixedHypot(player->mo->momx, player->mo->momy) ? R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy) : player->mo->angle;
|
||||
P_InstaThrust(player->mo, pushangle, maxspeed);
|
||||
}
|
||||
else if (player->speed < minspeed) // Push forward to prevent getting stuck
|
||||
{
|
||||
// if we have no speed for SOME REASON, use the player's angle, otherwise we'd be forcefully thrusted to what I can only assume is angle 0
|
||||
const angle_t pushangle = FixedHypot(player->mo->momx, player->mo->momy) ? R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy) : player->mo->angle;
|
||||
P_InstaThrust(player->mo, pushangle, minspeed);
|
||||
}
|
||||
|
||||
player->kartstuff[k_pogospring] = 2;
|
||||
K_DoPogoSpring(player->mo, 0, 1);
|
||||
@@ -3473,14 +3436,11 @@ DoneSection2:
|
||||
|
||||
if (i != -1)
|
||||
{
|
||||
INT32 sfxnum;
|
||||
angle_t lineangle;
|
||||
fixed_t linespeed;
|
||||
|
||||
const line_t *line = &lines[i];
|
||||
|
||||
lineangle = line->angle;
|
||||
linespeed = P_AproxDistance(line->v2->x-line->v1->x, line->v2->y-line->v1->y);
|
||||
lineangle = lines[i].angle;
|
||||
linespeed = P_AproxDistance(lines[i].v2->x-lines[i].v1->x, lines[i].v2->y-lines[i].v1->y);
|
||||
|
||||
player->mo->angle = lineangle;
|
||||
|
||||
@@ -3494,7 +3454,7 @@ DoneSection2:
|
||||
P_ForceLocalAngle(player, player->mo->angle);
|
||||
}
|
||||
|
||||
if (!(line->flags & ML_EFFECT4))
|
||||
if (!(lines[i].flags & ML_EFFECT4))
|
||||
{
|
||||
P_UnsetThingPosition(player->mo);
|
||||
if (roversector) // make FOF speed pads work
|
||||
@@ -3516,14 +3476,7 @@ DoneSection2:
|
||||
player->kartstuff[k_drift] = 0;
|
||||
player->kartstuff[k_driftcharge] = 0;
|
||||
player->kartstuff[k_pogospring] = 0;
|
||||
|
||||
sfxnum = sides[line->sidenum[0]].toptexture;
|
||||
|
||||
// none or invalid sound?
|
||||
if (sfxnum <= sfx_None || sfxnum >= NUMSFX)
|
||||
sfxnum = sfx_spdpad; // use the zippy sound then!
|
||||
|
||||
S_StartSound(player->mo, sfxnum);
|
||||
S_StartSound(player->mo, sfx_spdpad);
|
||||
|
||||
{
|
||||
sfxenum_t pick = P_RandomKey(2); // Gotta roll the RNG every time this is called for sync reasons
|
||||
@@ -3572,25 +3525,21 @@ DoneSection2:
|
||||
P_DoPlayerExit(player);
|
||||
|
||||
P_SetupSignExit(player);
|
||||
// important: use sector->tag on next line instead of player->mo->subsector->tag
|
||||
// this part is different from in P_PlayerThink, this is what was causing
|
||||
// FOF custom exits not to work.
|
||||
lineindex = P_FindSpecialLineFromTag(2, sector->tag, -1);
|
||||
|
||||
if (gametype == GT_COOP)
|
||||
if (gametype == GT_COOP && lineindex != -1) // Custom exit!
|
||||
{
|
||||
// important: use sector->tag on next line instead of player->mo->subsector->tag
|
||||
// this part is different from in P_PlayerThink, this is what was causing
|
||||
// FOF custom exits not to work.
|
||||
lineindex = P_FindSpecialLineFromTag(2, sector->tag, -1);
|
||||
// Special goodies with the block monsters flag depending on emeralds collected
|
||||
if ((lines[lineindex].flags & ML_BLOCKMONSTERS) && ALL7EMERALDS(emeralds))
|
||||
nextmapoverride = (INT16)(lines[lineindex].frontsector->ceilingheight>>FRACBITS);
|
||||
else
|
||||
nextmapoverride = (INT16)(lines[lineindex].frontsector->floorheight>>FRACBITS);
|
||||
|
||||
if (lineindex != -1) // Custom exit!)
|
||||
{
|
||||
// Special goodies with the block monsters flag depending on emeralds collected
|
||||
if ((lines[lineindex].flags & ML_BLOCKMONSTERS) && ALL7EMERALDS(emeralds))
|
||||
nextmapoverride = (INT16)(lines[lineindex].frontsector->ceilingheight>>FRACBITS);
|
||||
else
|
||||
nextmapoverride = (INT16)(lines[lineindex].frontsector->floorheight>>FRACBITS);
|
||||
|
||||
if (lines[lineindex].flags & ML_NOCLIMB)
|
||||
skipstats = true;
|
||||
}
|
||||
if (lines[lineindex].flags & ML_NOCLIMB)
|
||||
skipstats = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -3696,6 +3645,7 @@ DoneSection2:
|
||||
thinker_t *th;
|
||||
mobj_t *waypoint = NULL;
|
||||
mobj_t *mo2;
|
||||
angle_t an;
|
||||
|
||||
if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT)
|
||||
break;
|
||||
@@ -3743,13 +3693,10 @@ DoneSection2:
|
||||
CONS_Debug(DBG_GAMELOGIC, "Waypoint %d found in sequence %d - speed = %d\n", waypoint->health, sequence, speed);
|
||||
}
|
||||
|
||||
if (!(lines[lineindex].flags & ML_EFFECT4))
|
||||
{
|
||||
const angle_t an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle;
|
||||
an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle;
|
||||
|
||||
if (an > ANGLE_90 && an < ANGLE_270)
|
||||
break; // behind back
|
||||
}
|
||||
if (an > ANGLE_90 && an < ANGLE_270 && !(lines[lineindex].flags & ML_EFFECT4))
|
||||
break; // behind back
|
||||
|
||||
P_SetTarget(&player->mo->tracer, waypoint);
|
||||
player->speed = speed;
|
||||
@@ -3771,6 +3718,7 @@ DoneSection2:
|
||||
thinker_t *th;
|
||||
mobj_t *waypoint = NULL;
|
||||
mobj_t *mo2;
|
||||
angle_t an;
|
||||
|
||||
if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT)
|
||||
break;
|
||||
@@ -3818,13 +3766,10 @@ DoneSection2:
|
||||
CONS_Debug(DBG_GAMELOGIC, "Waypoint %d found in sequence %d - speed = %d\n", waypoint->health, sequence, speed);
|
||||
}
|
||||
|
||||
if (!(lines[lineindex].flags & ML_EFFECT4))
|
||||
{
|
||||
const angle_t an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle;
|
||||
an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle;
|
||||
|
||||
if (an > ANGLE_90 && an < ANGLE_270)
|
||||
break; // behind back
|
||||
}
|
||||
if (an > ANGLE_90 && an < ANGLE_270 && !(lines[lineindex].flags & ML_EFFECT4))
|
||||
break; // behind back
|
||||
|
||||
P_SetTarget(&player->mo->tracer, waypoint);
|
||||
player->speed = speed;
|
||||
@@ -3838,13 +3783,10 @@ DoneSection2:
|
||||
|
||||
case 10: // Finish Line
|
||||
// SRB2kart - 150117
|
||||
if (!G_RaceGametype())
|
||||
break;
|
||||
|
||||
if (player->starpostnum >= (numstarposts - (numstarposts/2)) || player->exiting)
|
||||
if (G_RaceGametype() && (player->starpostnum >= (numstarposts - (numstarposts/2)) || player->exiting))
|
||||
player->kartstuff[k_starpostwp] = player->kartstuff[k_waypoint] = 0;
|
||||
//
|
||||
if (!player->exiting)
|
||||
if (G_RaceGametype() && !player->exiting)
|
||||
{
|
||||
if (player->starpostnum >= (numstarposts - (numstarposts/2))) // srb2kart: must have touched *enough* starposts (was originally "(player->starpostnum == numstarposts)")
|
||||
{
|
||||
@@ -4499,13 +4441,12 @@ static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector)
|
||||
}
|
||||
|
||||
f_affectpoint = P_GetSpecialBottomZ(player->mo, sector, sector);
|
||||
c_affectpoint = P_GetSpecialTopZ(player->mo, sector, sector);
|
||||
|
||||
// Only go further if on the ground
|
||||
if ((sector->flags & SF_FLIPSPECIAL_FLOOR) && !(sector->flags & SF_FLIPSPECIAL_CEILING) && player->mo->z != f_affectpoint)
|
||||
return;
|
||||
|
||||
c_affectpoint = P_GetSpecialTopZ(player->mo, sector, sector);
|
||||
|
||||
if ((sector->flags & SF_FLIPSPECIAL_CEILING) && !(sector->flags & SF_FLIPSPECIAL_FLOOR) && player->mo->z + player->mo->height != c_affectpoint)
|
||||
return;
|
||||
|
||||
@@ -4561,13 +4502,27 @@ void P_PlayerInSpecialSector(player_t *player)
|
||||
|
||||
#undef TELEPORTED
|
||||
|
||||
static void P_UpdateAnimFlats(void)
|
||||
/** Animate planes, scroll walls, etc. and keeps track of level timelimit and exits if time is up.
|
||||
*
|
||||
* \sa P_CheckTimeLimit, P_CheckPointLimit
|
||||
*/
|
||||
void P_UpdateSpecials(void)
|
||||
{
|
||||
anim_t *anim;
|
||||
INT32 i;
|
||||
size_t j;
|
||||
levelflat_t *foundflats; // for flat animation
|
||||
|
||||
// LEVEL TIMER
|
||||
P_CheckTimeLimit();
|
||||
|
||||
// POINT LIMIT
|
||||
P_CheckPointLimit();
|
||||
|
||||
// Dynamic slopeness
|
||||
if (!midgamejoin) // run here when not joined midgame to prevent any potential issues that may arise
|
||||
P_RunDynamicSlopes();
|
||||
|
||||
// ANIMATE TEXTURES
|
||||
for (anim = anims; anim < lastanim; anim++)
|
||||
{
|
||||
@@ -4597,40 +4552,15 @@ static void P_UpdateAnimFlats(void)
|
||||
}
|
||||
}
|
||||
|
||||
/** Animate planes, scroll walls, etc. and keeps track of level timelimit and exits if time is up.
|
||||
*
|
||||
* \sa P_CheckTimeLimit, P_CheckPointLimit
|
||||
*/
|
||||
void P_UpdateSpecials(void)
|
||||
{
|
||||
// LEVEL TIMER
|
||||
P_CheckTimeLimit();
|
||||
|
||||
// POINT LIMIT
|
||||
P_CheckPointLimit();
|
||||
|
||||
#ifdef COMPAT_VANILLA
|
||||
// Dynamic slopeness
|
||||
// we run this here only when not joined midrace
|
||||
// for vanilla compat reasons :chaosleep:
|
||||
if (!midgamejoin)
|
||||
P_RunDynamicSlopes();
|
||||
#endif
|
||||
|
||||
P_UpdateAnimFlats();
|
||||
}
|
||||
|
||||
static inline ffloor_t *P_GetFFloorBySec(sector_t *sec, sector_t *sec2)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
|
||||
if (!sec->ffloors)
|
||||
return NULL;
|
||||
|
||||
for (rover = sec->ffloors; rover; rover = rover->next)
|
||||
if (rover->secnum == (size_t)(sec2 - sectors))
|
||||
return rover;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -4681,7 +4611,6 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
||||
|
||||
if (sec == sec2)
|
||||
return NULL; //Don't need a fake floor on a control sector.
|
||||
|
||||
if ((ffloor = (P_GetFFloorBySec(sec, sec2))))
|
||||
return ffloor; // If this ffloor already exists, return it
|
||||
|
||||
@@ -4788,7 +4717,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
||||
P_AddSpikeThinker(sec, (INT32)sec2num);
|
||||
}
|
||||
// Should this FOF have friction?
|
||||
else if (th->function == (actionf_p1)T_Friction)
|
||||
else if(th->function == (actionf_p1)T_Friction)
|
||||
{
|
||||
f = (friction_t *)th;
|
||||
|
||||
@@ -4796,7 +4725,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
||||
Add_Friction(f->friction, f->movefactor, (INT32)(sec-sectors), f->affectee);
|
||||
}
|
||||
// Should this FOF have wind/current/pusher?
|
||||
else if (th->function == (actionf_p1)T_Pusher)
|
||||
else if(th->function == (actionf_p1)T_Pusher)
|
||||
{
|
||||
p = (pusher_t *)th;
|
||||
|
||||
@@ -5234,18 +5163,11 @@ void T_LaserFlash(laserthink_t *flash)
|
||||
if (thing->health <= 0)
|
||||
continue;
|
||||
|
||||
// thing is neither shootable nor an egg guard shield
|
||||
if (!(thing->flags & MF_SHOOTABLE) && (thing->type != MT_EGGSHIELD))
|
||||
continue;
|
||||
|
||||
top = P_GetSpecialTopZ(thing, sourcesec, sector);
|
||||
|
||||
if (thing->z >= top)
|
||||
continue;
|
||||
|
||||
bottom = P_GetSpecialBottomZ(thing, sourcesec, sector);
|
||||
|
||||
if (thing->z + thing->height <= bottom)
|
||||
if (thing->z >= top
|
||||
|| thing->z + thing->height <= bottom)
|
||||
continue;
|
||||
|
||||
if (thing->flags & MF_SHOOTABLE)
|
||||
@@ -5339,7 +5261,7 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
|
||||
continue;
|
||||
|
||||
// Process Section 1
|
||||
switch (GETSECSPECIAL(sector->special, 1))
|
||||
switch(GETSECSPECIAL(sector->special, 1))
|
||||
{
|
||||
case 5: // Spikes
|
||||
P_AddSpikeThinker(sector, (INT32)(sector-sectors));
|
||||
@@ -5351,7 +5273,7 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
|
||||
}
|
||||
|
||||
// Process Section 2
|
||||
switch (GETSECSPECIAL(sector->special, 2))
|
||||
switch(GETSECSPECIAL(sector->special, 2))
|
||||
{
|
||||
case 10: // Time for special stage
|
||||
sstimer = (sector->floorheight>>FRACBITS) * TICRATE + 6; // Time to finish
|
||||
@@ -5364,7 +5286,7 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
|
||||
}
|
||||
|
||||
// Process Section 4
|
||||
switch (GETSECSPECIAL(sector->special, 4))
|
||||
switch(GETSECSPECIAL(sector->special, 4))
|
||||
{
|
||||
case 10: // Circuit finish line
|
||||
if (G_RaceGametype())
|
||||
@@ -5400,13 +5322,11 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
|
||||
// Allocate each list, and then zero the count so we can use it to track
|
||||
// the end of the list as we add the thinkers
|
||||
for (i = 0; i < numsectors; i++)
|
||||
{
|
||||
if (secthinkers[i].count > 0)
|
||||
if(secthinkers[i].count > 0)
|
||||
{
|
||||
secthinkers[i].thinkers = Z_Malloc(secthinkers[i].count * sizeof(thinker_t *), PU_STATIC, NULL);
|
||||
secthinkers[i].count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Finally, populate the lists.
|
||||
for (th = thinkercap.next; th != &thinkercap; th = th->next)
|
||||
@@ -6058,7 +5978,7 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
|
||||
break;
|
||||
|
||||
case 259: // Make-Your-Own FOF!
|
||||
if (lines[i].sidenum[1] != NO_INDEX)
|
||||
if (lines[i].sidenum[1] != 0xffff)
|
||||
{
|
||||
UINT8 *data;
|
||||
UINT16 b;
|
||||
@@ -6505,19 +6425,15 @@ void T_Scroll(scroll_t *s)
|
||||
if (thing->flags2 & MF2_PUSHED) // Already pushed this tic by an exclusive pusher.
|
||||
continue;
|
||||
|
||||
height = P_GetSpecialBottomZ(thing, sec, psec);
|
||||
|
||||
if (!(thing->flags & MF_NOCLIP)) // Thing must be clipped
|
||||
if (!(thing->flags & MF_NOGRAVITY || thing->z+thing->height != height)) // Thing must a) be non-floating and have z+height == height
|
||||
{
|
||||
height = P_GetSpecialBottomZ(thing, sec, psec);
|
||||
|
||||
if (!(thing->flags & MF_NOGRAVITY || thing->z+thing->height != height)) // Thing must a) be non-floating and have z+height == height
|
||||
{
|
||||
// Move objects only if on floor
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
}
|
||||
|
||||
// Move objects only if on floor
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
}
|
||||
|
||||
} // end of for loop through touching_thinglist
|
||||
} // end of loop through sectors
|
||||
}
|
||||
@@ -6531,16 +6447,14 @@ void T_Scroll(scroll_t *s)
|
||||
if (thing->flags2 & MF2_PUSHED)
|
||||
continue;
|
||||
|
||||
if (!(thing->flags & MF_NOCLIP)) // Thing must be clipped
|
||||
{
|
||||
height = P_GetSpecialBottomZ(thing, sec, sec);
|
||||
height = P_GetSpecialBottomZ(thing, sec, sec);
|
||||
|
||||
if (!(thing->flags & MF_NOGRAVITY || thing->z > height))
|
||||
{
|
||||
// Move objects only if on floor or underwater,
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
}
|
||||
if (!(thing->flags & MF_NOCLIP) &&
|
||||
(!(thing->flags & MF_NOGRAVITY || thing->z > height)))
|
||||
{
|
||||
// Move objects only if on floor or underwater,
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6586,16 +6500,14 @@ void T_Scroll(scroll_t *s)
|
||||
if (thing->flags2 & MF2_PUSHED)
|
||||
continue;
|
||||
|
||||
if (!(thing->flags & MF_NOCLIP)) // Thing must be clipped
|
||||
{
|
||||
height = P_GetSpecialTopZ(thing, sec, psec);
|
||||
height = P_GetSpecialTopZ(thing, sec, psec);
|
||||
|
||||
if (!(thing->flags & MF_NOGRAVITY || thing->z != height))// Thing must a) be non-floating and have z == height
|
||||
{
|
||||
// Move objects only if on floor or underwater,
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
}
|
||||
if (!(thing->flags & MF_NOCLIP)) // Thing must be clipped
|
||||
if (!(thing->flags & MF_NOGRAVITY || thing->z != height))// Thing must a) be non-floating and have z == height
|
||||
{
|
||||
// Move objects only if on floor or underwater,
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
}
|
||||
} // end of for loop through touching_thinglist
|
||||
} // end of loop through sectors
|
||||
@@ -6610,16 +6522,14 @@ void T_Scroll(scroll_t *s)
|
||||
if (thing->flags2 & MF2_PUSHED)
|
||||
continue;
|
||||
|
||||
if (!(thing->flags & MF_NOCLIP)) // Thing must be clipped
|
||||
{
|
||||
height = P_GetSpecialTopZ(thing, sec, sec);
|
||||
height = P_GetSpecialTopZ(thing, sec, sec);
|
||||
|
||||
if (!(thing->flags & MF_NOGRAVITY || thing->z+thing->height < height))
|
||||
{
|
||||
// Move objects only if on floor or underwater,
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
}
|
||||
if (!(thing->flags & MF_NOCLIP) &&
|
||||
(!(thing->flags & MF_NOGRAVITY || thing->z+thing->height < height)))
|
||||
{
|
||||
// Move objects only if on floor or underwater,
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6787,7 +6697,7 @@ static void P_SpawnScrollers(void)
|
||||
case 506:
|
||||
s = lines[i].sidenum[1];
|
||||
|
||||
if (s != NO_INDEX)
|
||||
if (s != 0xffff)
|
||||
Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, lines[i].sidenum[0], accel, 0);
|
||||
else
|
||||
CONS_Debug(DBG_GAMELOGIC, "Line special 506 (line #%s) missing 2nd side!\n", sizeu1(i));
|
||||
@@ -6998,7 +6908,6 @@ static void P_SpawnFriction(void)
|
||||
INT32 movefactor; // applied to each player move to simulate inertia
|
||||
|
||||
for (i = 0; i < numlines; i++, l++)
|
||||
{
|
||||
if (l->special == 540)
|
||||
{
|
||||
//length = P_AproxDistance(l->dx, l->dy)>>FRACBITS;
|
||||
@@ -7032,7 +6941,6 @@ static void P_SpawnFriction(void)
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Friction(friction, movefactor, s, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -7081,10 +6989,9 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *
|
||||
// "The right triangle of the square of the length of the hypotenuse is equal to the sum of the squares of the lengths of the other two sides."
|
||||
// "Bah! Stupid brains! Don't you know anything besides the Pythagorean Theorem?" - Earthworm Jim
|
||||
if (type == p_downcurrent || type == p_upcurrent || type == p_upwind || type == p_downwind)
|
||||
p->magnitude = P_AproxDistance(p->x_mag, p->y_mag)<<(FRACBITS-PUSH_FACTOR);
|
||||
p->magnitude = P_AproxDistance(p->x_mag,p->y_mag)<<(FRACBITS-PUSH_FACTOR);
|
||||
else
|
||||
p->magnitude = P_AproxDistance(p->x_mag, p->y_mag);
|
||||
|
||||
p->magnitude = P_AproxDistance(p->x_mag,p->y_mag);
|
||||
if (source) // point source exist?
|
||||
{
|
||||
// where force goes to zero
|
||||
@@ -7135,14 +7042,15 @@ static inline boolean PIT_PushThing(mobj_t *thing)
|
||||
|
||||
// don't fade wrt Z if health & 2 (mapthing has multi flag)
|
||||
if (tmpusher->source->health & 2)
|
||||
dist = P_AproxDistance(thing->x - sx, thing->y - sy);
|
||||
dist = P_AproxDistance(thing->x - sx,thing->y - sy);
|
||||
else
|
||||
{
|
||||
// Make sure the Z is in range
|
||||
if (thing->z < sz - tmpusher->radius || thing->z > sz + tmpusher->radius)
|
||||
return false;
|
||||
|
||||
dist = P_AproxDistance(P_AproxDistance(thing->x - sx, thing->y - sy), thing->z - sz);
|
||||
dist = P_AproxDistance(P_AproxDistance(thing->x - sx, thing->y - sy),
|
||||
thing->z - sz);
|
||||
}
|
||||
|
||||
speed = (tmpusher->magnitude - ((dist>>FRACBITS)>>1))<<(FRACBITS - PUSH_FACTOR - 1);
|
||||
@@ -7305,6 +7213,7 @@ void T_Pusher(pusher_t *p)
|
||||
|
||||
if (p->type == p_push)
|
||||
{
|
||||
|
||||
// Seek out all pushable things within the force radius of this
|
||||
// point pusher. Crosses sectors, so use blockmap.
|
||||
|
||||
@@ -7347,16 +7256,13 @@ void T_Pusher(pusher_t *p)
|
||||
if (thing->flags2 & MF2_PUSHED)
|
||||
continue;
|
||||
|
||||
if (thing->player)
|
||||
{
|
||||
if (thing->player->pflags & PF_ROPEHANG)
|
||||
continue;
|
||||
if (thing->player && thing->player->pflags & PF_ROPEHANG)
|
||||
continue;
|
||||
|
||||
if ((thing->state == &states[thing->info->painstate])
|
||||
&& (thing->player->powers[pw_flashing] > (K_GetKartFlashing(thing->player)/4)*3
|
||||
&& thing->player->powers[pw_flashing] <= K_GetKartFlashing(thing->player)))
|
||||
continue;
|
||||
}
|
||||
if (thing->player && (thing->state == &states[thing->info->painstate])
|
||||
&& (thing->player->powers[pw_flashing] > (K_GetKartFlashing(thing->player)/4)*3
|
||||
&& thing->player->powers[pw_flashing] <= K_GetKartFlashing(thing->player)))
|
||||
continue;
|
||||
|
||||
inFOF = touching = moved = false;
|
||||
|
||||
@@ -7486,7 +7392,7 @@ void T_Pusher(pusher_t *p)
|
||||
if (p->slider && thing->player)
|
||||
{
|
||||
boolean jumped = (thing->player->pflags & PF_JUMPED);
|
||||
P_ResetPlayer(thing->player);
|
||||
P_ResetPlayer (thing->player);
|
||||
|
||||
if (jumped)
|
||||
thing->player->pflags |= PF_JUMPED;
|
||||
@@ -7554,17 +7460,16 @@ static void P_SpawnPushers(void)
|
||||
mobj_t *thing;
|
||||
|
||||
for (i = 0; i < numlines; i++, l++)
|
||||
{
|
||||
switch (l->special)
|
||||
{
|
||||
case 541: // wind
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Pusher(p_wind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
||||
break;
|
||||
break;
|
||||
case 544: // current
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Pusher(p_current, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
||||
break;
|
||||
break;
|
||||
case 547: // push/pull
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
{
|
||||
@@ -7576,21 +7481,20 @@ static void P_SpawnPushers(void)
|
||||
case 545: // current up
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Pusher(p_upcurrent, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
||||
break;
|
||||
break;
|
||||
case 546: // current down
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Pusher(p_downcurrent, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
||||
break;
|
||||
break;
|
||||
case 542: // wind up
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Pusher(p_upwind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
||||
break;
|
||||
break;
|
||||
case 543: // wind down
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Pusher(p_downwind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void P_StartQuake(tic_t time, fixed_t intensity, fixed_t radius)
|
||||
|
||||
+2
-13
@@ -611,15 +611,6 @@ void P_Ticker(boolean run)
|
||||
#ifdef DEMO_COMPAT_100
|
||||
}
|
||||
#endif
|
||||
|
||||
// Lookback is normally handled inside G_BuildTiccmd, which isn't called in replays so we're doing that manually
|
||||
// idk if this is best place to handle this tho...
|
||||
for (i = 0; i <= splitscreen; ++i)
|
||||
{
|
||||
const boolean usejoystick = cv_usejoystick[i].value;
|
||||
INT32 axis = JoyAxis(AXISLOOKBACK, i+1);
|
||||
camspin[i] = (InputDown(gc_lookback, i+1) || (usejoystick && axis > 0));
|
||||
}
|
||||
}
|
||||
|
||||
ps_lua_mobjhooks.value.i = 0;
|
||||
@@ -646,9 +637,7 @@ void P_Ticker(boolean run)
|
||||
if (run)
|
||||
{
|
||||
// Dynamic slopeness
|
||||
#ifdef COMPAT_VANILLA
|
||||
if (midgamejoin) // only run here if we joined midgame to fix some desynchs
|
||||
#endif
|
||||
P_RunDynamicSlopes();
|
||||
|
||||
PS_START_TIMING(ps_thinkertime);
|
||||
@@ -717,7 +706,6 @@ void P_Ticker(boolean run)
|
||||
|
||||
if (indirectitemcooldown > 0)
|
||||
indirectitemcooldown--;
|
||||
|
||||
if (hyubgone > 0)
|
||||
hyubgone--;
|
||||
|
||||
@@ -725,7 +713,8 @@ void P_Ticker(boolean run)
|
||||
{
|
||||
K_UpdateSpectateGrief();
|
||||
}
|
||||
else if (G_BattleGametype())
|
||||
|
||||
if (G_BattleGametype())
|
||||
{
|
||||
if (wantedcalcdelay && --wantedcalcdelay <= 0)
|
||||
K_CalculateBattleWanted();
|
||||
|
||||
+25
-40
@@ -157,7 +157,6 @@ void P_CalcHeight(player_t *player)
|
||||
if (player->viewz > mo->ceilingz - FixedMul(FRACUNIT, mo->scale))
|
||||
player->viewz = mo->ceilingz - FixedMul(FRACUNIT, mo->scale);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -775,7 +774,7 @@ boolean P_IsObjectInGoop(mobj_t *mo)
|
||||
//
|
||||
boolean P_IsObjectOnGround(mobj_t *mo)
|
||||
{
|
||||
if (P_IsObjectInGoop(mo))
|
||||
if (UNLIKELY(P_IsObjectInGoop(mo)))
|
||||
{
|
||||
// but I don't want you to ever 'stand' while submerged in goo.
|
||||
// You're in constant vertical momentum, even if you get stuck on something.
|
||||
@@ -1122,26 +1121,22 @@ void P_SpawnShieldOrb(player_t *player)
|
||||
P_SetTarget(&ov->target, shieldobj);
|
||||
P_SetMobjState(ov, shieldobj->info->seestate);
|
||||
}
|
||||
|
||||
if (shieldobj->info->meleestate)
|
||||
{
|
||||
ov = P_SpawnMobj(shieldobj->x, shieldobj->y, shieldobj->z, MT_OVERLAY);
|
||||
P_SetTarget(&ov->target, shieldobj);
|
||||
P_SetMobjState(ov, shieldobj->info->meleestate);
|
||||
}
|
||||
|
||||
if (shieldobj->info->missilestate)
|
||||
{
|
||||
ov = P_SpawnMobj(shieldobj->x, shieldobj->y, shieldobj->z, MT_OVERLAY);
|
||||
P_SetTarget(&ov->target, shieldobj);
|
||||
P_SetMobjState(ov, shieldobj->info->missilestate);
|
||||
}
|
||||
|
||||
if (player->powers[pw_shield] & SH_FORCE)
|
||||
{
|
||||
//Copy and pasted from P_ShieldLook in p_mobj.c
|
||||
shieldobj->movecount = (player->powers[pw_shield] & 0xFF);
|
||||
|
||||
if (shieldobj->movecount < 1)
|
||||
{
|
||||
if (shieldobj->info->painstate)
|
||||
@@ -1397,8 +1392,7 @@ static void P_CheckBustableBlocks(player_t *player)
|
||||
|
||||
for (rover = node->m_sector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
if (!(rover->flags & FF_EXISTS))
|
||||
continue;
|
||||
if (!(rover->flags & FF_EXISTS)) continue;
|
||||
|
||||
if ((rover->flags & FF_BUSTUP)/* && !rover->master->frontsector->crumblestate*/)
|
||||
{
|
||||
@@ -1518,12 +1512,11 @@ static void P_CheckBouncySectors(player_t *player)
|
||||
continue; // this sector type is required for FOFs to be bouncy
|
||||
|
||||
topheight = P_GetFOFTopZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL);
|
||||
bottomheight = P_GetFOFBottomZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL);
|
||||
|
||||
if (player->mo->z > topheight)
|
||||
continue;
|
||||
|
||||
bottomheight = P_GetFOFBottomZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL);
|
||||
|
||||
if (player->mo->z + player->mo->height < bottomheight)
|
||||
continue;
|
||||
|
||||
@@ -1573,12 +1566,10 @@ static void P_CheckBouncySectors(player_t *player)
|
||||
newmom = -8*FRACUNIT;
|
||||
}
|
||||
|
||||
const fixed_t halfpheight = P_GetPlayerHeight(player)/2;
|
||||
|
||||
if (newmom > halfpheight)
|
||||
newmom = halfpheight;
|
||||
else if (newmom < -halfpheight)
|
||||
newmom = -halfpheight;
|
||||
if (newmom > P_GetPlayerHeight(player)/2)
|
||||
newmom = P_GetPlayerHeight(player)/2;
|
||||
else if (newmom < -P_GetPlayerHeight(player)/2)
|
||||
newmom = -P_GetPlayerHeight(player)/2;
|
||||
|
||||
momentum.z = newmom*2;
|
||||
|
||||
@@ -1841,9 +1832,6 @@ void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range)
|
||||
if (!((mo2->flags & MF_SHOOTABLE && mo2->flags & MF_ENEMY) || mo2->type == MT_EGGGUARD || mo2->player))
|
||||
continue;
|
||||
|
||||
if (mo2->health <= 0)
|
||||
continue;
|
||||
|
||||
dist = P_AproxDistance(P_AproxDistance(player->mo->x-mo2->x, player->mo->y-mo2->y), player->mo->z-mo2->z);
|
||||
|
||||
if (range < dist)
|
||||
@@ -1852,12 +1840,15 @@ void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range)
|
||||
if (!P_CheckSight(player->mo, mo2))
|
||||
continue; // if your psychic powers can't "see" it don't bother
|
||||
|
||||
an = R_PointToAngle2(player->mo->x, player->mo->y, mo2->x, mo2->y);
|
||||
if (mo2->health > 0)
|
||||
{
|
||||
an = R_PointToAngle2(player->mo->x, player->mo->y, mo2->x, mo2->y);
|
||||
|
||||
P_Thrust(mo2, an, thrust);
|
||||
P_Thrust(mo2, an, thrust);
|
||||
|
||||
if (mo2->type == MT_GOLDBUZZ || mo2->type == MT_REDBUZZ)
|
||||
mo2->tics += 8;
|
||||
if (mo2->type == MT_GOLDBUZZ || mo2->type == MT_REDBUZZ)
|
||||
mo2->tics += 8;
|
||||
}
|
||||
}
|
||||
|
||||
//P_SpawnThokMobj(player);
|
||||
@@ -2118,6 +2109,7 @@ void P_ElementalFireTrail(player_t *player)
|
||||
INT32 i;
|
||||
|
||||
I_Assert(player != NULL);
|
||||
I_Assert(player->mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(player->mo));
|
||||
|
||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||
@@ -2279,8 +2271,7 @@ static void P_MovePlayer(player_t *player)
|
||||
}
|
||||
//CONS_Printf("applied turn: %d\n", angle_diff);
|
||||
|
||||
if (add_delta)
|
||||
{
|
||||
if (add_delta) {
|
||||
player->mo->angle += angle_diff << TICCMD_REDUCE;
|
||||
player->mo->angle &= ~0xFFFF; // Try to keep the turning somewhat similar to how it was before?
|
||||
//CONS_Printf("leftover turn (%s): %5d or %4d%%\n",
|
||||
@@ -2361,7 +2352,7 @@ static void P_MovePlayer(player_t *player)
|
||||
if (onground && leveltime % 50 == 0 && player->kartstuff[k_drift] != 0)
|
||||
S_StartSound(player->mo, sfx_drift);
|
||||
// Leveltime being 50 might take a while at times. We'll start it up once, isntantly.
|
||||
else if (onground && player->kartstuff[k_drift] != 0 && !S_SoundPlaying(player->mo, sfx_drift))
|
||||
else if (onground && !S_SoundPlaying(player->mo, sfx_drift) && player->kartstuff[k_drift] != 0)
|
||||
S_StartSound(player->mo, sfx_drift);
|
||||
// Ok, we'll stop now.
|
||||
else if (player->kartstuff[k_drift] == 0 || !onground)
|
||||
@@ -2402,18 +2393,15 @@ static void P_MovePlayer(player_t *player)
|
||||
{
|
||||
mobj_t *water = P_SpawnMobj(player->mo->x, player->mo->y,
|
||||
((player->mo->eflags & MFE_VERTICALFLIP) ? player->mo->waterbottom - FixedMul(mobjinfo[MT_SPLISH].height, player->mo->scale) : player->mo->watertop), MT_SPLISH);
|
||||
|
||||
if (player->mo->eflags & MFE_GOOWATER)
|
||||
S_StartSound(water, sfx_ghit);
|
||||
else
|
||||
S_StartSound(water, sfx_wslap);
|
||||
|
||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
water->flags2 |= MF2_OBJECTFLIP;
|
||||
water->eflags |= MFE_VERTICALFLIP;
|
||||
}
|
||||
|
||||
water->destscale = player->mo->scale;
|
||||
P_SetScale(water, player->mo->scale);
|
||||
}
|
||||
@@ -2742,16 +2730,16 @@ boolean P_LookForEnemies(player_t *player)
|
||||
|| ((mo->z+mo->height < player->mo->z+player->mo->height-FixedMul(MAXSTEPMOVE, mapobjectscale)) && (player->mo->eflags & MFE_VERTICALFLIP))) // Reverse gravity check - Flame.
|
||||
continue; // Don't home upwards!
|
||||
|
||||
const fixed_t modist = P_AproxDistance(P_AproxDistance(player->mo->x-mo->x, player->mo->y-mo->y), player->mo->z-mo->z);
|
||||
|
||||
if (modist > FixedMul(RING_DIST, player->mo->scale))
|
||||
if (P_AproxDistance(P_AproxDistance(player->mo->x-mo->x, player->mo->y-mo->y),
|
||||
player->mo->z-mo->z) > FixedMul(RING_DIST, player->mo->scale))
|
||||
continue; // out of range
|
||||
|
||||
if (UNLIKELY((twodlevel || player->mo->flags2 & MF2_TWOD)
|
||||
&& abs(player->mo->y-mo->y) > player->mo->radius))
|
||||
continue; // not in your 2d plane
|
||||
|
||||
if (closestmo && modist > P_AproxDistance(P_AproxDistance(player->mo->x-closestmo->x,
|
||||
if (closestmo && P_AproxDistance(P_AproxDistance(player->mo->x-mo->x, player->mo->y-mo->y),
|
||||
player->mo->z-mo->z) > P_AproxDistance(P_AproxDistance(player->mo->x-closestmo->x,
|
||||
player->mo->y-closestmo->y), player->mo->z-closestmo->z))
|
||||
continue;
|
||||
|
||||
@@ -3155,8 +3143,8 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num)
|
||||
cmd->angleturn = (INT16)(lang >> TICCMD_REDUCE);
|
||||
cmd->aiming = G_ClipAimingPitch(&laim);
|
||||
|
||||
const boolean analogjoystickmove = cv_usejoystick[num].value && !DigitalGamepadStyle(num);
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[num].value && DigitalGamepadStyle(num);
|
||||
const boolean analogjoystickmove = cv_usejoystick[num].value && !Joystick[num].bGamepadStyle;
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[num].value && Joystick[num].bGamepadStyle;
|
||||
|
||||
usejoystick = (analogjoystickmove || gamepadjoystickmove);
|
||||
|
||||
@@ -3490,6 +3478,8 @@ void P_ResetCamera(player_t *player, camera_t *thiscam)
|
||||
}
|
||||
}
|
||||
|
||||
thiscam->relativex = 0;
|
||||
|
||||
thiscam->subsector = R_PointInSubsectorFast(thiscam->x, thiscam->y);
|
||||
|
||||
thiscam->radius = 20*FRACUNIT;
|
||||
@@ -3982,12 +3972,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
|
||||
{
|
||||
fixed_t panmax = (dist/5);
|
||||
const INT32 sparkval = K_GetKartDriftSparkValue(player);
|
||||
|
||||
pan = FixedDiv(FixedMul(min((fixed_t)player->kartstuff[k_driftcharge], sparkval), panmax), sparkval);
|
||||
|
||||
if (pan > panmax)
|
||||
pan = panmax;
|
||||
|
||||
if (player->kartstuff[k_drift] < 0)
|
||||
pan *= -1;
|
||||
}
|
||||
@@ -4586,7 +4573,6 @@ void P_PlayerThink(player_t *player)
|
||||
{
|
||||
short int i;
|
||||
mo->flags |= MF_NOCLIPHEIGHT;
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
// Debug drawing
|
||||
@@ -4765,7 +4751,6 @@ void P_PlayerThink(player_t *player)
|
||||
player->mo->flags2 |= MF2_SHADOW;
|
||||
else
|
||||
player->mo->flags2 &= ~MF2_SHADOW;
|
||||
|
||||
P_DeathThink(player);
|
||||
LUA_HookPlayer(player, HOOK(PlayerThink));
|
||||
return;
|
||||
|
||||
+10
-25
@@ -221,9 +221,8 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel,
|
||||
tempsec->floorheight = s->floorheight;
|
||||
tempsec->ceilingheight = s->ceilingheight;
|
||||
|
||||
if ((underwater && (tempsec->floorheight = sec->floorheight,
|
||||
tempsec->ceilingheight = s->floorheight - 1, !back)) ||
|
||||
viewz <= s->floorheight)
|
||||
if ((underwater && (tempsec-> floorheight = sec->floorheight,
|
||||
tempsec->ceilingheight = s->floorheight - 1, !back)) || viewz <= s->floorheight)
|
||||
{ // head-below-floor hack
|
||||
tempsec->floorpic = s->floorpic;
|
||||
tempsec->floor_xoffs = s->floor_xoffs;
|
||||
@@ -259,8 +258,8 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel,
|
||||
*ceilinglightlevel = s->ceilinglightsec == -1 ? s->lightlevel
|
||||
: sectors[s->ceilinglightsec].lightlevel;
|
||||
}
|
||||
else if (heightsec != -1 && viewz >= sectors[heightsec].ceilingheight &&
|
||||
sec->ceilingheight > s->ceilingheight)
|
||||
else if (heightsec != -1 && viewz >= sectors[heightsec].ceilingheight
|
||||
&& sec->ceilingheight > s->ceilingheight)
|
||||
{ // Above-ceiling hack
|
||||
tempsec->ceilingheight = s->ceilingheight;
|
||||
tempsec->floorheight = s->ceilingheight + 1;
|
||||
@@ -297,8 +296,7 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel,
|
||||
*ceilinglightlevel = s->ceilinglightsec == -1 ? s->lightlevel :
|
||||
sectors[s->ceilinglightsec].lightlevel;
|
||||
}
|
||||
|
||||
sec = tempsec; // Use other sector
|
||||
sec = tempsec;
|
||||
}
|
||||
|
||||
return sec;
|
||||
@@ -320,20 +318,13 @@ static void R_AddLine(seg_t *line)
|
||||
INT32 x1, x2;
|
||||
angle_t angle1, angle2, span, tspan;
|
||||
static sector_t tempsec;
|
||||
boolean bothfloorssky = false;
|
||||
fixed_t v1x, v1y, v2x, v2y; // the seg's vertexes as fixed_t
|
||||
boolean bothfloorssky = false;
|
||||
|
||||
g_portal = NULL;
|
||||
|
||||
v1x = line->v1->x;
|
||||
v1y = line->v1->y;
|
||||
|
||||
v2x = line->v2->x;
|
||||
v2y = line->v2->y;
|
||||
|
||||
// big room fix
|
||||
angle1 = R_PointToAngle64(v1x, v1y);
|
||||
angle2 = R_PointToAngle64(v2x, v2y);
|
||||
angle1 = R_PointToAngle64(line->v1->x, line->v1->y);
|
||||
angle2 = R_PointToAngle64(line->v2->x, line->v2->y);
|
||||
|
||||
curline = line;
|
||||
|
||||
@@ -526,7 +517,6 @@ static boolean R_CheckBBox(const fixed_t *bspcoord)
|
||||
angle_t angle1, angle2;
|
||||
INT32 sx1, sx2;
|
||||
const INT32* check;
|
||||
fixed_t x1, y1, x2, y2;
|
||||
|
||||
// Find the corners of the box
|
||||
// that define the edges from current viewpoint.
|
||||
@@ -540,14 +530,9 @@ static boolean R_CheckBBox(const fixed_t *bspcoord)
|
||||
|
||||
check = checkcoord[boxpos];
|
||||
|
||||
x1 = bspcoord[check[0]];
|
||||
y1 = bspcoord[check[1]];
|
||||
x2 = bspcoord[check[2]];
|
||||
y2 = bspcoord[check[3]];
|
||||
|
||||
// big room fix
|
||||
angle1 = R_PointToAngle64(x1, y1) - viewangle;
|
||||
angle2 = R_PointToAngle64(x2, y2) - viewangle;
|
||||
angle1 = R_PointToAngle64(bspcoord[check[0]], bspcoord[check[1]]) - viewangle;
|
||||
angle2 = R_PointToAngle64(bspcoord[check[2]], bspcoord[check[3]]) - viewangle;
|
||||
|
||||
// cph - replaced old code, which was unclear and badly commented
|
||||
// Much more efficient code now
|
||||
|
||||
+10
-11
@@ -430,7 +430,7 @@ typedef struct line_s
|
||||
INT16 tag;
|
||||
|
||||
// Visual appearance: sidedefs.
|
||||
UINT16 sidenum[2]; // sidenum[1] will be NO_INDEX if one-sided
|
||||
UINT16 sidenum[2]; // sidenum[1] will be 0xffff if one-sided
|
||||
fixed_t alpha; // translucency
|
||||
UINT8 blendmode; // blendmode
|
||||
|
||||
@@ -531,10 +531,11 @@ typedef struct seg_s
|
||||
vertex_t *v1;
|
||||
vertex_t *v2;
|
||||
|
||||
#ifdef HWRENDER
|
||||
floatvertex_t fv1; // v1 in floats - precalculated
|
||||
floatvertex_t fv2; // v2 in floats - precalculated
|
||||
#endif
|
||||
INT32 side;
|
||||
|
||||
fixed_t offset;
|
||||
|
||||
angle_t angle;
|
||||
|
||||
side_t *sidedef;
|
||||
line_t *linedef;
|
||||
@@ -544,13 +545,11 @@ typedef struct seg_s
|
||||
sector_t *frontsector;
|
||||
sector_t *backsector;
|
||||
|
||||
INT32 side;
|
||||
|
||||
fixed_t length; // precalculated seg length
|
||||
fixed_t offset;
|
||||
|
||||
angle_t angle;
|
||||
|
||||
#ifdef HWRENDER
|
||||
floatvertex_t fv1; // v1 in floats - precalculated
|
||||
floatvertex_t fv2; // v2 in floats - precalculated
|
||||
#endif
|
||||
polyobj_t *polyseg;
|
||||
|
||||
// Fake contrast calculated on level load
|
||||
|
||||
+9
-10
@@ -515,6 +515,8 @@ void R_FlushTranslationColormapCache(void)
|
||||
// in reality, the few routines that can work for either mode, are
|
||||
// put here
|
||||
|
||||
enum columncontext_e columncontext = COLUMNCONTEXT_DIRECT;
|
||||
|
||||
enum ColumnFlushType
|
||||
{
|
||||
FLUSH_NONE = 0x0000,
|
||||
@@ -532,12 +534,9 @@ typedef struct drawcolumndata_temp_s
|
||||
// e6y: resolution limitation is removed
|
||||
UINT8 *buf;
|
||||
|
||||
INT32 startx;
|
||||
|
||||
ColumnFlushType type;
|
||||
|
||||
INT32 commontop, commonbot;
|
||||
|
||||
INT32 startx;
|
||||
ColumnFlushType type;
|
||||
INT32 commontop, commonbot;
|
||||
UINT8 *transmap;
|
||||
// SoM 7-28-04: Fix the fuzz problem.
|
||||
UINT8 *translation;
|
||||
@@ -565,8 +564,8 @@ FUNCNORETURN static ATTRNORETURN void R_QuadFlushError(void)
|
||||
}
|
||||
|
||||
static void (*R_FlushWholeColumns)(void) = R_FlushWholeError;
|
||||
static void (*R_FlushHTColumns)(void) = R_FlushHTError;
|
||||
static void (*R_FlushQuadColumn)(void) = R_QuadFlushError;
|
||||
static void (*R_FlushHTColumns)(void) = R_FlushHTError;
|
||||
static void (*R_FlushQuadColumn)(void) = R_QuadFlushError;
|
||||
|
||||
static void R_FlushColumns(void)
|
||||
{
|
||||
@@ -598,8 +597,8 @@ void R_ResetColumnBuffer(void)
|
||||
|
||||
temp_dc.type = FLUSH_NONE;
|
||||
R_FlushWholeColumns = R_FlushWholeError;
|
||||
R_FlushHTColumns = R_FlushHTError;
|
||||
R_FlushQuadColumn = R_QuadFlushError;
|
||||
R_FlushHTColumns = R_FlushHTError;
|
||||
R_FlushQuadColumn = R_QuadFlushError;
|
||||
}
|
||||
|
||||
/** \brief The R_InitViewBuffer function
|
||||
|
||||
+1
-2
@@ -105,6 +105,7 @@ enum columncontext_e
|
||||
COLUMNCONTEXT_FLUSH,
|
||||
};
|
||||
|
||||
extern enum columncontext_e columncontext;
|
||||
void R_SetColumnContext(enum columncontext_e _columncontext);
|
||||
|
||||
void R_ResetColumnBuffer(void);
|
||||
@@ -123,8 +124,6 @@ enum
|
||||
COLDRAWFUNC_TRANSTRANS,
|
||||
COLDRAWFUNC_TWOSMULTIPATCH,
|
||||
COLDRAWFUNC_TWOSMULTIPATCHTRANS,
|
||||
COLDRAWFUNC_TWOSMULTIPATCH_DIRECT,
|
||||
COLDRAWFUNC_TWOSMULTIPATCHTRANS_DIRECT,
|
||||
COLDRAWFUNC_FOG,
|
||||
|
||||
COLDRAWFUNC_MAX
|
||||
|
||||
+4
-4
@@ -387,10 +387,10 @@ void R_InterpolatePrecipMobjState(precipmobj_t *mobj, fixed_t frac, interpmobjst
|
||||
return;
|
||||
}
|
||||
|
||||
out->x = R_LerpFixed(mobj->old_x, mobj->x, frac);
|
||||
out->y = R_LerpFixed(mobj->old_y, mobj->y, frac);
|
||||
out->z = R_LerpFixed(mobj->old_z, mobj->z, frac);
|
||||
out->scale = mapobjectscale;
|
||||
out->x = R_LerpFixed(mobj->old_x, mobj->x, frac);
|
||||
out->y = R_LerpFixed(mobj->old_y, mobj->y, frac);
|
||||
out->z = R_LerpFixed(mobj->old_z, mobj->z, frac);
|
||||
out->scale = mapobjectscale;
|
||||
}
|
||||
|
||||
static levelinterpolator_t *CreateInterpolator(levelinterpolator_type_e type, thinker_t *thinker)
|
||||
|
||||
+2
-3
@@ -161,7 +161,7 @@ static void R_ParseSpriteInfo(boolean spr2)
|
||||
if (i == NUMSPRITES)
|
||||
I_Error("Error parsing SPRTINFO lump: Unknown sprite name \"%s\"", newSpriteName);
|
||||
|
||||
if (!memcmp(newSpriteName, sprnames[i], 4))
|
||||
if (!memcmp(newSpriteName,sprnames[i], 4))
|
||||
{
|
||||
sprnum = static_cast<spritenum_t>(i);
|
||||
break;
|
||||
@@ -289,7 +289,7 @@ void R_ParseSPRTINFOLump(UINT16 wadNum, UINT16 lumpNum)
|
||||
sprinfoLumpLength = W_LumpLengthPwad(wadNum, lumpNum);
|
||||
sprinfoText = (char *)Z_Malloc((sprinfoLumpLength+1)*sizeof(char),PU_STATIC,NULL);
|
||||
// Now move the contents of the lump into this new location.
|
||||
memmove(sprinfoText, sprinfoLump, sprinfoLumpLength);
|
||||
memmove(sprinfoText,sprinfoLump,sprinfoLumpLength);
|
||||
// Make damn well sure the last character in our new memory location is \0.
|
||||
sprinfoText[sprinfoLumpLength] = '\0';
|
||||
// Finally, free up the memory from the first data load, because we really
|
||||
@@ -443,7 +443,6 @@ void *Patch_AllocateHardwarePatch(patch_t *patch)
|
||||
GLPatch_t *glPatch = static_cast<GLPatch_t*>(Z_Calloc(sizeof(GLPatch_t), PU_HWRPATCHINFO, &patch->hardware));
|
||||
glPatch->mipmap = static_cast<GLMipmap_t*>(Z_Calloc(sizeof(GLMipmap_t), PU_HWRPATCHINFO, &glPatch->mipmap));
|
||||
}
|
||||
|
||||
return (void *)(patch->hardware);
|
||||
}
|
||||
|
||||
|
||||
+3
-57
@@ -16,7 +16,6 @@
|
||||
#include "r_sky.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
#include "r_portal.h"
|
||||
#include "r_splats.h"
|
||||
@@ -1167,37 +1166,6 @@ static inline void R_ExpandPlaneY(visplane_t *pl, INT32 x, INT16 top, INT16 bott
|
||||
// CALLED: CORE LOOPING ROUTINE.
|
||||
//
|
||||
|
||||
static std::vector<UINT8> holecol(256);
|
||||
|
||||
// used for R_DrawWallColumn
|
||||
// convert "holey" columns into contigous columns
|
||||
// filled with cyan in place of holes
|
||||
static UINT8 *R_GetHoleColumn(drawcolumndata_t* dc)
|
||||
{
|
||||
column_t *col = (column_t *)(dc->source - 3);
|
||||
|
||||
const INT32 texheight = dc->texheight;
|
||||
holecol.resize(texheight);
|
||||
|
||||
// fill in everything with cyan so we can skip it
|
||||
memset(holecol.data(), TRANSPARENTPIXEL, texheight);
|
||||
|
||||
// shamelessly copy pasted from R_GenerateTexture
|
||||
INT32 topdelta, prevdelta = -1;
|
||||
while (col->topdelta != 0xff)
|
||||
{
|
||||
topdelta = col->topdelta;
|
||||
if (topdelta <= prevdelta)
|
||||
topdelta += prevdelta;
|
||||
prevdelta = topdelta;
|
||||
|
||||
memcpy(holecol.data() + topdelta, (UINT8*)col + 4, col->length);
|
||||
col = (column_t *)((UINT8*)col + col->length + 4);
|
||||
}
|
||||
|
||||
return holecol.data();
|
||||
}
|
||||
|
||||
static void R_DrawWallColumn(drawcolumndata_t* dc, INT32 yl, INT32 yh, fixed_t mid, fixed_t texturecolumn, INT32 texture, boolean remap)
|
||||
{
|
||||
const INT32 itexturecolumn = texturecolumn >> FRACBITS;
|
||||
@@ -1207,35 +1175,13 @@ static void R_DrawWallColumn(drawcolumndata_t* dc, INT32 yl, INT32 yh, fixed_t m
|
||||
dc->source = R_GetColumn(texture, itexturecolumn);
|
||||
dc->texheight = textureheight[texture] >> FRACBITS;
|
||||
dc->sourcelength = dc->texheight;
|
||||
|
||||
R_SetColumnFunc(colfunctype);
|
||||
coldrawfunc_t* colfunccopy = colfunc;
|
||||
|
||||
if (textures[texture]->holes)
|
||||
{
|
||||
dc->source = R_GetHoleColumn(dc);
|
||||
|
||||
if (cv_softcyancut.value)
|
||||
{
|
||||
// need to use multipatch drawers to cut cyan pixels
|
||||
if (R_CheckColumnFunc(COLDRAWFUNC_FUZZY) == true)
|
||||
{
|
||||
colfunccopy = colfuncs[COLDRAWFUNC_TWOSMULTIPATCHTRANS_DIRECT];
|
||||
}
|
||||
else
|
||||
{
|
||||
colfunccopy = colfuncs[COLDRAWFUNC_TWOSMULTIPATCH_DIRECT];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
drawcolumndata_t dc_copy = *dc;
|
||||
|
||||
if (remap)
|
||||
{
|
||||
dc_copy.colormap += COLORMAP_REMAPOFFSET;
|
||||
}
|
||||
|
||||
colfunccopy(const_cast<drawcolumndata_t*>(&dc_copy));
|
||||
}
|
||||
|
||||
@@ -1444,7 +1390,7 @@ static void R_RenderSegLoop(drawcolumndata_t* dc)
|
||||
// calculate lighting
|
||||
pindex = FixedMul(rw_scale, LIGHTRESOLUTIONFIX)>>LIGHTSCALESHIFT;
|
||||
|
||||
if (pindex >= MAXLIGHTSCALE)
|
||||
if (pindex >= MAXLIGHTSCALE)
|
||||
pindex = MAXLIGHTSCALE-1;
|
||||
|
||||
dc->colormap = walllights[pindex];
|
||||
@@ -1479,7 +1425,7 @@ static void R_RenderSegLoop(drawcolumndata_t* dc)
|
||||
|
||||
pindex = FixedMul(rw_scale, LIGHTRESOLUTIONFIX)>>LIGHTSCALESHIFT;
|
||||
|
||||
if (pindex >= MAXLIGHTSCALE)
|
||||
if (pindex >= MAXLIGHTSCALE)
|
||||
pindex = MAXLIGHTSCALE-1;
|
||||
|
||||
if (dc->lightlist[i].extra_colormap)
|
||||
@@ -2204,7 +2150,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||
topremap = (encoremap && !(curline->linedef->flags & ML_TFERLINE));
|
||||
|
||||
if ((linedef->flags & (ML_DONTPEGTOP) && (linedef->flags & ML_DONTPEGBOTTOM))
|
||||
&& linedef->sidenum[1] != NO_INDEX)
|
||||
&& linedef->sidenum[1] != 0xffff)
|
||||
{
|
||||
// Special case... use offsets from 2nd side but only if it has a texture.
|
||||
side_t *def = &sides[linedef->sidenum[1]];
|
||||
|
||||
+1
-1
@@ -712,7 +712,7 @@ void R_AddSkins(UINT16 wadnum, boolean local)
|
||||
// skip to end of this skin's frames
|
||||
lastlump = lump;
|
||||
|
||||
while (W_CheckNameForNumPwad(wadnum, lastlump) && memcmp(W_CheckNameForNumPwad(wadnum, lastlump), csprname, 4) == 0)
|
||||
while (W_CheckNameForNumPwad(wadnum, lastlump) && memcmp(W_CheckNameForNumPwad(wadnum, lastlump), csprname,4)==0)
|
||||
lastlump++;
|
||||
|
||||
// allocate (or replace) sprite frames, and set spritedef
|
||||
|
||||
+1
-1
@@ -131,7 +131,7 @@ void R_AddWallSplat(line_t *wallline, INT16 sectorside, const char *patchname, f
|
||||
// set the splat
|
||||
splat->patch = W_GetNumForName(patchname);
|
||||
sectorside ^= 1;
|
||||
if (wallline->sidenum[sectorside] != NO_INDEX)
|
||||
if (wallline->sidenum[sectorside] != 0xffff)
|
||||
{
|
||||
backsector = sides[wallline->sidenum[sectorside]].sector;
|
||||
|
||||
|
||||
+38
-50
@@ -166,13 +166,11 @@ static void R_InstallSpriteLump(UINT16 wad, // graphics patch
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has rotations and a rot = 0 lump\n", spritename, cn);
|
||||
|
||||
sprtemp[frame].rotate = SRF_SINGLE;
|
||||
|
||||
for (r = 0; r < 8; r++)
|
||||
{
|
||||
sprtemp[frame].lumppat[r] = lumppat;
|
||||
sprtemp[frame].lumpid[r] = lumpid;
|
||||
}
|
||||
|
||||
sprtemp[frame].flip = flipped ? UINT8_MAX : 0; // 11111111 in binary
|
||||
return;
|
||||
}
|
||||
@@ -182,14 +180,15 @@ static void R_InstallSpriteLump(UINT16 wad, // graphics patch
|
||||
UINT8 rightfactor = ((rotation == ROT_R) ? 4 : 0);
|
||||
|
||||
// the lump should be used for half of all rotations
|
||||
if (sprtemp[frame].rotate == SRF_NONE)
|
||||
sprtemp[frame].rotate = SRF_SINGLE;
|
||||
else if (sprtemp[frame].rotate == SRF_SINGLE)
|
||||
if (sprtemp[frame].rotate == SRF_SINGLE)
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has L/R rotations and a rot = 0 lump\n", spritename, cn);
|
||||
else if (sprtemp[frame].rotate == SRF_3D)
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has both L/R and 1-8 rotations\n", spritename, cn);
|
||||
// Let's not complain about multiple L/R rotations. It's not worth the effort.
|
||||
|
||||
if (sprtemp[frame].rotate == SRF_NONE)
|
||||
sprtemp[frame].rotate = SRF_SINGLE;
|
||||
|
||||
sprtemp[frame].rotate |= ((rotation == ROT_R) ? SRF_RIGHT : SRF_LEFT);
|
||||
|
||||
if (sprtemp[frame].rotate == (SRF_3D|SRF_2D))
|
||||
@@ -232,7 +231,6 @@ static void R_InstallSpriteLump(UINT16 wad, // graphics patch
|
||||
// when using sprites in pwad : the lumppat points the new graphics
|
||||
sprtemp[frame].lumppat[rotation] = lumppat;
|
||||
sprtemp[frame].lumpid[rotation] = lumpid;
|
||||
|
||||
if (flipped)
|
||||
sprtemp[frame].flip |= (1<<rotation);
|
||||
else
|
||||
@@ -261,17 +259,16 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
||||
softwarepatch_t patch;
|
||||
UINT8 numadded = 0;
|
||||
|
||||
memset(sprtemp, 0xFF, sizeof(sprtemp));
|
||||
memset(sprtemp,0xFF, sizeof (sprtemp));
|
||||
maxframe = (size_t)-1;
|
||||
|
||||
spritename = sprname;
|
||||
|
||||
// are we 'patching' a sprite already loaded ?
|
||||
// if so, it might patch only certain frames, not all
|
||||
if (spritedef->numframes) // (then spriteframes is not null)
|
||||
{
|
||||
// copy the already defined sprite frames
|
||||
memcpy(sprtemp, spritedef->spriteframes, spritedef->numframes * sizeof (spriteframe_t));
|
||||
memcpy(sprtemp, spritedef->spriteframes,
|
||||
spritedef->numframes * sizeof (spriteframe_t));
|
||||
maxframe = spritedef->numframes - 1;
|
||||
}
|
||||
|
||||
@@ -291,7 +288,7 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
||||
|
||||
if (frame >= 64 || !(R_ValidSpriteAngle(rotation))) // Give an actual NAME error -_-...
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Bad sprite name: %s\n"), W_CheckNameForNumPwad(wadnum, l));
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Bad sprite name: %s\n"), W_CheckNameForNumPwad(wadnum,l));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -317,15 +314,6 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
||||
{
|
||||
frame = R_Char2Frame(lumpinfo[l].name[6]);
|
||||
rotation = (UINT8)(lumpinfo[l].name[7] - '0');
|
||||
|
||||
/*
|
||||
if (frame >= 64 || !(R_ValidSpriteAngle(rotation))) // Give an actual NAME error -_-...
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Bad sprite name: %s\n"), W_CheckNameForNumPwad(wadnum, l));
|
||||
continue;
|
||||
}
|
||||
*/
|
||||
|
||||
R_InstallSpriteLump(wadnum, l, numspritelumps, frame, rotation, 1);
|
||||
}
|
||||
|
||||
@@ -374,32 +362,30 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
||||
switch (sprtemp[frame].rotate)
|
||||
{
|
||||
case SRF_NONE:
|
||||
// no rotations were found for that frame at all
|
||||
I_Error("R_AddSingleSpriteDef: No patches found for %.4s frame %c", sprname, R_Frame2Char(frame));
|
||||
break;
|
||||
// no rotations were found for that frame at all
|
||||
I_Error("R_AddSingleSpriteDef: No patches found for %.4s frame %c", sprname, R_Frame2Char(frame));
|
||||
break;
|
||||
|
||||
case SRF_SINGLE:
|
||||
// only the first rotation is needed
|
||||
break;
|
||||
// only the first rotation is needed
|
||||
break;
|
||||
|
||||
case SRF_2D: // both Left and Right rotations
|
||||
// we test to see whether the left and right slots are present
|
||||
if ((sprtemp[frame].lumppat[2] == LUMPERROR) || (sprtemp[frame].lumppat[6] == LUMPERROR))
|
||||
I_Error("R_AddSingleSpriteDef: Sprite %s frame %c is missing rotations",
|
||||
sprname, R_Frame2Char(frame));
|
||||
break;
|
||||
break;
|
||||
|
||||
default:
|
||||
// must have all 8 frames
|
||||
for (rotation = 0; rotation < 8; rotation++)
|
||||
{
|
||||
// we test the patch lump, or the id lump whatever
|
||||
// if it was not loaded the two are LUMPERROR
|
||||
if (sprtemp[frame].lumppat[rotation] == LUMPERROR)
|
||||
I_Error("R_AddSingleSpriteDef: Sprite %.4s frame %c is missing rotations",
|
||||
sprname, R_Frame2Char(frame));
|
||||
}
|
||||
break;
|
||||
// must have all 8 frames
|
||||
for (rotation = 0; rotation < 8; rotation++)
|
||||
// we test the patch lump, or the id lump whatever
|
||||
// if it was not loaded the two are LUMPERROR
|
||||
if (sprtemp[frame].lumppat[rotation] == LUMPERROR)
|
||||
I_Error("R_AddSingleSpriteDef: Sprite %.4s frame %c is missing rotations",
|
||||
sprname, R_Frame2Char(frame));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -407,6 +393,7 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
||||
if (spritedef->numframes && // has been allocated
|
||||
spritedef->numframes < maxframe) // more frames are defined ?
|
||||
{
|
||||
|
||||
Z_Free(spritedef->spriteframes);
|
||||
spritedef->spriteframes = NULL;
|
||||
}
|
||||
@@ -463,10 +450,12 @@ void R_AddSpriteDefs(UINT16 wadnum)
|
||||
//
|
||||
for (i = 0; i < numsprites; i++)
|
||||
{
|
||||
if (sprnames[i][4] && wadnum >= (UINT16)sprnames[i][4])
|
||||
spritename = sprnames[i];
|
||||
|
||||
if (spritename[4] && wadnum >= (UINT16)spritename[4])
|
||||
continue;
|
||||
|
||||
if (R_AddSingleSpriteDef(sprnames[i], &sprites[i], wadnum, start, end))
|
||||
if (R_AddSingleSpriteDef(spritename, &sprites[i], wadnum, start, end))
|
||||
{
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
@@ -474,7 +463,9 @@ void R_AddSpriteDefs(UINT16 wadnum)
|
||||
#endif
|
||||
// if a new sprite was added (not just replaced)
|
||||
addsprites++;
|
||||
CONS_Debug(DBG_SETUP, "sprite %s set in pwad %d\n", sprnames[i], wadnum);
|
||||
#ifndef ZDEBUG
|
||||
CONS_Debug(DBG_SETUP, "sprite %s set in pwad %d\n", spritename, wadnum);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -781,7 +772,6 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||
|
||||
R_SetColumnFunc(BASEDRAWFUNC); // hack: this isn't resetting properly somewhere.
|
||||
dc.colormap = vis->colormap;
|
||||
|
||||
if ((vis->mobj->flags & MF_BOSS) && (vis->mobj->flags2 & MF2_FRET) && (leveltime & 1)) // Bosses "flash"
|
||||
{
|
||||
R_SetColumnFunc(COLDRAWFUNC_TRANS); // translate certain pixels to white
|
||||
@@ -834,7 +824,6 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||
else
|
||||
dc.colormap = &vis->extra_colormap->colormap[dc.colormap - colormaps];
|
||||
}
|
||||
|
||||
if (!dc.colormap)
|
||||
dc.colormap = colormaps;
|
||||
|
||||
@@ -859,7 +848,6 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||
vis->xiscale = FixedDiv(vis->xiscale, this_scale);
|
||||
vis->isScaled = true;
|
||||
}
|
||||
|
||||
dc.texturemid = FixedDiv(dc.texturemid, this_scale);
|
||||
}
|
||||
|
||||
@@ -1159,7 +1147,7 @@ fixed_t R_GetSpriteDirectionalLighting(angle_t angle)
|
||||
fixed_t extralight = 0;
|
||||
|
||||
light = FixedMul(FINECOSINE(angle >> ANGLETOFINESHIFT), FINECOSINE(maplighting.angle >> ANGLETOFINESHIFT))
|
||||
+ FixedMul(FINESINE(angle >> ANGLETOFINESHIFT), FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
|
||||
+ FixedMul(FINESINE(angle >> ANGLETOFINESHIFT), FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
|
||||
light = (light + FRACUNIT) / 2;
|
||||
|
||||
light = FixedMul(light, FRACUNIT - FSIN(abs(AngleDeltaSigned(angle, maplighting.angle)) / 2));
|
||||
@@ -1368,9 +1356,9 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||
|
||||
I_Assert(lump < max_spritelumps);
|
||||
|
||||
spr_width = spritecachedinfo[lump].width;
|
||||
spr_height = spritecachedinfo[lump].height;
|
||||
spr_offset = spritecachedinfo[lump].offset;
|
||||
spr_width = spritecachedinfo[lump].width;
|
||||
spr_height = spritecachedinfo[lump].height;
|
||||
spr_offset = spritecachedinfo[lump].offset;
|
||||
spr_topoffset = spritecachedinfo[lump].topoffset;
|
||||
|
||||
#ifdef ROTSPRITE
|
||||
@@ -1411,10 +1399,10 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||
|
||||
if (rotsprite != NULL)
|
||||
{
|
||||
spr_width = rotsprite->width << FRACBITS;
|
||||
spr_height = rotsprite->height << FRACBITS;
|
||||
spr_offset = rotsprite->leftoffset << FRACBITS;
|
||||
spr_topoffset = rotsprite->topoffset << FRACBITS;
|
||||
spr_width = rotsprite->width << FRACBITS;
|
||||
spr_height = rotsprite->height << FRACBITS;
|
||||
spr_offset = rotsprite->leftoffset << FRACBITS;
|
||||
spr_topoffset = rotsprite->topoffset << FRACBITS;
|
||||
spr_topoffset += FEETADJUST;
|
||||
|
||||
// flip -> rotate, not rotate -> flip
|
||||
|
||||
+131
-144
@@ -477,11 +477,6 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
|
||||
{
|
||||
player_t *player = &players[displayplayers[i]];
|
||||
|
||||
if (!player)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (player->awayviewtics)
|
||||
{
|
||||
listenmobj[i] = player->awayviewmobj;
|
||||
@@ -540,84 +535,79 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
|
||||
|
||||
i = 0; // sensible default
|
||||
|
||||
// Check to see if it is audible, and if not, modify the params
|
||||
if (origin && !itsUs)
|
||||
{
|
||||
boolean audible = false;
|
||||
|
||||
if (splitscreen > 0)
|
||||
// Check to see if it is audible, and if not, modify the params
|
||||
if (origin && !itsUs)
|
||||
{
|
||||
fixed_t recdist = INT32_MAX;
|
||||
UINT8 j = 0;
|
||||
|
||||
for (; j <= splitscreen; j++)
|
||||
boolean audible = false;
|
||||
if (splitscreen > 0)
|
||||
{
|
||||
fixed_t thisdist = INT32_MAX;
|
||||
fixed_t recdist = INT32_MAX;
|
||||
UINT8 j = 0;
|
||||
|
||||
if (!listenmobj[j])
|
||||
for (; j <= splitscreen; j++)
|
||||
{
|
||||
continue;
|
||||
fixed_t thisdist = INT32_MAX;
|
||||
|
||||
if (!listenmobj[j])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
thisdist = P_AproxDistance(listener[j].x - origin->x, listener[j].y - origin->y);
|
||||
|
||||
if (thisdist >= recdist)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
recdist = thisdist;
|
||||
i = j;
|
||||
}
|
||||
}
|
||||
|
||||
thisdist = P_AproxDistance(listener[j].x - origin->x, listener[j].y - origin->y);
|
||||
if (listenmobj[i])
|
||||
{
|
||||
audible = S_AdjustSoundParams(listenmobj[i], origin, &volume, &sep, sfx);
|
||||
}
|
||||
|
||||
if (thisdist >= recdist)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
recdist = thisdist;
|
||||
i = j;
|
||||
if (!audible)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (listenmobj[i])
|
||||
{
|
||||
audible = S_AdjustSoundParams(listenmobj[i], origin, &volume, &sep, sfx);
|
||||
}
|
||||
|
||||
if (!audible)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// This is supposed to handle the loading/caching.
|
||||
// For some odd reason, the caching is done nearly
|
||||
// each time the sound is needed?
|
||||
|
||||
// cache data if necessary
|
||||
// NOTE: set sfx->data NULL sfx->lump -1 to force a reload
|
||||
if (!sfx->data)
|
||||
{
|
||||
sfx->data = I_GetSfx(sfx);
|
||||
// This is supposed to handle the loading/caching.
|
||||
// For some odd reason, the caching is done nearly
|
||||
// each time the sound is needed?
|
||||
|
||||
// cache data if necessary
|
||||
// NOTE: set sfx->data NULL sfx->lump -1 to force a reload
|
||||
if (!sfx->data)
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, "Tried to load invalid sfx_%s\n", sfx->name);
|
||||
return; /* don't play it */
|
||||
sfx->data = I_GetSfx(sfx);
|
||||
}
|
||||
|
||||
// Avoid channel reverse if surround
|
||||
if (reverse)
|
||||
{
|
||||
sep = (~sep) & 255;
|
||||
}
|
||||
|
||||
// At this point it is determined that a sound can and should be played, so find a free channel to play it on
|
||||
cnum = S_getChannel(origin, sfx);
|
||||
|
||||
if (cnum < 0)
|
||||
{
|
||||
return; // If there's no free channels, there won't be any for anymore players either
|
||||
}
|
||||
|
||||
// Now that we know we are going to play a sound, fill out this info
|
||||
channels[cnum].sfxinfo = sfx;
|
||||
channels[cnum].origin = origin;
|
||||
channels[cnum].volume = initial_volume;
|
||||
channels[cnum].handle = I_StartSound(sfx_id, volume, sep, cnum);
|
||||
}
|
||||
|
||||
// Avoid channel reverse if surround
|
||||
if (reverse)
|
||||
{
|
||||
sep = (~sep) & 255;
|
||||
}
|
||||
|
||||
// At this point it is determined that a sound can and should be played, so find a free channel to play it on
|
||||
cnum = S_getChannel(origin, sfx);
|
||||
|
||||
if (cnum < 0)
|
||||
{
|
||||
return; // If there's no free channels, there won't be any for anymore players either
|
||||
}
|
||||
|
||||
// Now that we know we are going to play a sound, fill out this info
|
||||
channels[cnum].sfxinfo = sfx;
|
||||
channels[cnum].origin = origin;
|
||||
channels[cnum].volume = initial_volume;
|
||||
channels[cnum].handle = I_StartSound(sfx_id, volume, sep, cnum);
|
||||
}
|
||||
|
||||
void S_StartSound(const void *origin, sfxenum_t sfx_id)
|
||||
@@ -732,16 +722,11 @@ void S_UpdateSounds(void)
|
||||
if (dedicated || sound_disabled)
|
||||
return;
|
||||
|
||||
memset(listenmobj, 0, sizeof(listenmobj));
|
||||
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
player_t *player = &players[displayplayers[i]];
|
||||
|
||||
if (!player)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
listenmobj[i] = NULL;
|
||||
|
||||
if (player->awayviewtics)
|
||||
{
|
||||
@@ -776,83 +761,84 @@ void S_UpdateSounds(void)
|
||||
{
|
||||
c = &channels[cnum];
|
||||
|
||||
if (c->sfxinfo == NULL)
|
||||
continue;
|
||||
|
||||
// if channel is allocated but sound has stopped, free it
|
||||
if (!I_SoundIsPlaying(c->handle))
|
||||
if (c->sfxinfo)
|
||||
{
|
||||
S_StopChannel(cnum);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (c->origin == NULL)
|
||||
continue;
|
||||
|
||||
// initialize parameters
|
||||
volume = c->volume; // 8 bits internal volume precision
|
||||
sep = NORM_SEP;
|
||||
|
||||
// check non-local sounds for distance clipping
|
||||
// or modify their params
|
||||
boolean itsUs = false;
|
||||
|
||||
for (i = splitscreen; i >= 0; i--)
|
||||
{
|
||||
if (camera[i].freecam)
|
||||
continue;
|
||||
|
||||
if (c->origin != listenmobj[i])
|
||||
continue;
|
||||
|
||||
itsUs = true;
|
||||
}
|
||||
|
||||
if (itsUs == false)
|
||||
{
|
||||
const mobj_t *origin = c->origin;
|
||||
|
||||
i = 0;
|
||||
|
||||
if (splitscreen > 0)
|
||||
if (I_SoundIsPlaying(c->handle))
|
||||
{
|
||||
fixed_t recdist = INT32_MAX;
|
||||
UINT8 j = 0;
|
||||
// initialize parameters
|
||||
volume = c->volume; // 8 bits internal volume precision
|
||||
sep = NORM_SEP;
|
||||
|
||||
for (; j <= splitscreen; j++)
|
||||
// check non-local sounds for distance clipping
|
||||
// or modify their params
|
||||
if (c->origin)
|
||||
{
|
||||
fixed_t thisdist = INT32_MAX;
|
||||
boolean itsUs = false;
|
||||
|
||||
if (!listenmobj[j])
|
||||
for (i = splitscreen; i >= 0; i--)
|
||||
{
|
||||
continue;
|
||||
if (camera[i].freecam)
|
||||
continue;
|
||||
|
||||
if (c->origin != listenmobj[i])
|
||||
continue;
|
||||
|
||||
itsUs = true;
|
||||
}
|
||||
|
||||
thisdist = P_AproxDistance(listener[j].x - origin->x, listener[j].y - origin->y);
|
||||
|
||||
if (thisdist >= recdist)
|
||||
if (itsUs == false)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
const mobj_t *origin = c->origin;
|
||||
|
||||
recdist = thisdist;
|
||||
i = j;
|
||||
i = 0;
|
||||
|
||||
if (splitscreen > 0)
|
||||
{
|
||||
fixed_t recdist = INT32_MAX;
|
||||
UINT8 j = 0;
|
||||
|
||||
for (; j <= splitscreen; j++)
|
||||
{
|
||||
fixed_t thisdist = INT32_MAX;
|
||||
|
||||
if (!listenmobj[j])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
thisdist = P_AproxDistance(listener[j].x - origin->x, listener[j].y - origin->y);
|
||||
|
||||
if (thisdist >= recdist)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
recdist = thisdist;
|
||||
i = j;
|
||||
}
|
||||
}
|
||||
|
||||
if (listenmobj[i])
|
||||
{
|
||||
audible = S_AdjustSoundParams(
|
||||
listenmobj[i], c->origin,
|
||||
&volume, &sep,
|
||||
c->sfxinfo
|
||||
);
|
||||
}
|
||||
|
||||
if (audible)
|
||||
I_UpdateSoundParams(c->handle, volume, sep);
|
||||
else
|
||||
S_StopChannel(cnum);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (listenmobj[i])
|
||||
{
|
||||
audible = S_AdjustSoundParams(
|
||||
listenmobj[i], c->origin,
|
||||
&volume, &sep,
|
||||
c->sfxinfo
|
||||
);
|
||||
}
|
||||
|
||||
if (audible)
|
||||
I_UpdateSoundParams(c->handle, volume, sep);
|
||||
else
|
||||
{
|
||||
// if channel is allocated but sound has stopped, free it
|
||||
S_StopChannel(cnum);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -880,6 +866,7 @@ void S_ClearSfx(void)
|
||||
|
||||
static void S_StopChannel(INT32 cnum)
|
||||
{
|
||||
INT32 i;
|
||||
channel_t *c = &channels[cnum];
|
||||
|
||||
if (c->sfxinfo)
|
||||
@@ -888,6 +875,12 @@ static void S_StopChannel(INT32 cnum)
|
||||
if (I_SoundIsPlaying(c->handle))
|
||||
I_StopSound(c->handle);
|
||||
|
||||
// check to see
|
||||
// if other channels are playing the sound
|
||||
for (i = 0; i < numofchannels; i++)
|
||||
if (cnum != i && c->sfxinfo == channels[i].sfxinfo)
|
||||
break;
|
||||
|
||||
c->sfxinfo = NULL;
|
||||
}
|
||||
|
||||
@@ -1053,14 +1046,12 @@ static boolean S_AdjustSoundParams(const mobj_t *listener, const mobj_t *source,
|
||||
INT32 S_OriginPlaying(void *origin)
|
||||
{
|
||||
INT32 cnum;
|
||||
|
||||
if (!origin)
|
||||
return false;
|
||||
|
||||
for (cnum = 0; cnum < numofchannels; cnum++)
|
||||
if (channels[cnum].origin == origin)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1073,7 +1064,6 @@ INT32 S_IdPlaying(sfxenum_t id)
|
||||
for (cnum = 0; cnum < numofchannels; cnum++)
|
||||
if ((size_t)(channels[cnum].sfxinfo - S_sfx) == (size_t)id)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1082,7 +1072,6 @@ INT32 S_IdPlaying(sfxenum_t id)
|
||||
INT32 S_SoundPlaying(void *origin, sfxenum_t id)
|
||||
{
|
||||
INT32 cnum;
|
||||
|
||||
if (!origin)
|
||||
return 0;
|
||||
|
||||
@@ -1092,7 +1081,6 @@ INT32 S_SoundPlaying(void *origin, sfxenum_t id)
|
||||
&& (size_t)(channels[cnum].sfxinfo - S_sfx) == (size_t)id)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1105,7 +1093,6 @@ static sfxenum_t newsounds[MAXNEWSOUNDS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
void S_StartSoundName(void *mo, const char *soundname)
|
||||
{
|
||||
INT32 i, soundnum = 0;
|
||||
|
||||
// Search existing sounds...
|
||||
for (i = sfx_None + 1; i < NUMSFX; i++)
|
||||
{
|
||||
@@ -1411,8 +1398,8 @@ void S_LoadMusicDefs(UINT16 wadnum)
|
||||
|
||||
for (int k = 0; k < 2; k++)
|
||||
{
|
||||
const char *lumpname = (k == 1 ? "MUSCINFO" : "MUSICDEF"); //check for MUSCINFO lump on 2nd iteration
|
||||
lumpnum = W_CheckNumForNamePwad(lumpname, wadnum, 0);
|
||||
const char *lumpname = (k == 1 ? "MUSCINFO" : "MUSICDEF");
|
||||
lumpnum = W_CheckNumForNamePwad(lumpname, wadnum, 0); //check for MUSCINFO lump on 2nd iteration
|
||||
|
||||
if (lumpnum == INT16_MAX)
|
||||
continue;
|
||||
|
||||
+7
-10
@@ -42,8 +42,8 @@ INT32 setmodeneeded = 0; // video mode change needed if > 0 (the mode number to
|
||||
static CV_PossibleValue_t shittyscreen_cons_t[] = {{0, "Okay"}, {1, "Shitty"}, {2, "Extra Shitty"}, {0, NULL}};
|
||||
|
||||
//added : 03-02-98: default screen mode, as loaded/saved in config
|
||||
consvar_t cv_scr_width = {"scr_width", "1280", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_scr_width = {"scr_width", "1280", CV_SAVE|CV_CALL, CV_Unsigned, VID_RefreshModeList, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE|CV_CALL, CV_Unsigned, VID_RefreshModeList, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_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};
|
||||
@@ -120,10 +120,6 @@ static void SCR_SetDrawFuncs(enum columncontext_e _columncontext)
|
||||
colfuncs[COLDRAWFUNC_TWOSMULTIPATCHTRANS] = R_Draw2sMultiPatchTranslucentColumn;
|
||||
}
|
||||
|
||||
// gotta keep a copy of those for R_DrawWallColumn.....
|
||||
colfuncs[COLDRAWFUNC_TWOSMULTIPATCH_DIRECT] = R_Draw2sMultiPatchColumn;
|
||||
colfuncs[COLDRAWFUNC_TWOSMULTIPATCHTRANS_DIRECT] = R_Draw2sMultiPatchTranslucentColumn;
|
||||
|
||||
colfuncs[COLDRAWFUNC_FOG] = R_DrawFogColumn;
|
||||
|
||||
R_SetColumnFunc(BASEDRAWFUNC);
|
||||
@@ -158,6 +154,7 @@ void SCR_SetMode(void)
|
||||
// effectively adding massive overhead due to excessive flushing, so we draw our masked thing directly to screen instead
|
||||
void R_SetColumnContext(enum columncontext_e _columncontext)
|
||||
{
|
||||
columncontext = _columncontext;
|
||||
SCR_SetDrawFuncs(_columncontext); // set our column drawers
|
||||
}
|
||||
|
||||
@@ -277,7 +274,6 @@ void SCR_Recalc(void)
|
||||
// vid.recalc lasts only for the next refresh...
|
||||
con_recalc = true;
|
||||
am_recalc = true;
|
||||
intermissionbginit = false;
|
||||
}
|
||||
|
||||
// Check for screen cmd-line parms: to force a resolution.
|
||||
@@ -319,8 +315,9 @@ void SCR_CheckDefaultMode(void)
|
||||
void SCR_SetDefaultMode(void)
|
||||
{
|
||||
// remember the default screen size
|
||||
CV_SetValue(&cv_scr_width, vid.width);
|
||||
CV_SetValue(&cv_scr_height, vid.height);
|
||||
CV_StealthSetValue(&cv_scr_width, vid.width);
|
||||
CV_StealthSetValue(&cv_scr_height, vid.height);
|
||||
VID_RefreshModeList(); // probably not needed but justin käs
|
||||
}
|
||||
|
||||
// Change fullscreen on/off according to cv_fullscreen
|
||||
@@ -530,6 +527,6 @@ void SCR_DisplayLocalPing(void)
|
||||
if (cv_showping.value == 1 || (cv_showping.value == 2 && ping > servermaxping)) // only show 2 (warning) if our ping is at a bad level
|
||||
{
|
||||
INT32 dispy = (cv_ticrate.value == 1) ? 165 : ((cv_ticrate.value == 2 || cv_ticrate.value == 4) ? 172 : ((cv_ticrate.value == 3) ? 163 : 181)); // absolute buttpain
|
||||
HU_drawLocalPlayerPing(308, dispy, pingflags); // consoleplayer's ping is everyone's ping in a splitnetgame :P
|
||||
HU_drawPlayerPing(308, dispy, consoleplayer, pingflags); // consoleplayer's ping is everyone's ping in a splitnetgame :P
|
||||
}
|
||||
}
|
||||
+20
-43
@@ -743,22 +743,26 @@ INT32 numcontrollers = 0;
|
||||
//
|
||||
void I_JoyScale(void)
|
||||
{
|
||||
JoyInfo[0].scale = DigitalGamepadStyle(0) ? 1 : cv_joyscale[0].value;
|
||||
Joystick[0].bGamepadStyle = cv_joyscale[0].value == 0;
|
||||
JoyInfo[0].scale = Joystick[0].bGamepadStyle ? 1 : cv_joyscale[0].value;
|
||||
}
|
||||
|
||||
void I_JoyScale2(void)
|
||||
{
|
||||
JoyInfo[1].scale = DigitalGamepadStyle(1) ? 1 : cv_joyscale[1].value;
|
||||
Joystick[1].bGamepadStyle = cv_joyscale[1].value == 0;
|
||||
JoyInfo[1].scale = Joystick[1].bGamepadStyle ? 1 : cv_joyscale[1].value;
|
||||
}
|
||||
|
||||
void I_JoyScale3(void)
|
||||
{
|
||||
JoyInfo[2].scale = DigitalGamepadStyle(2) ? 1 : cv_joyscale[2].value;
|
||||
Joystick[2].bGamepadStyle = cv_joyscale[2].value == 0;
|
||||
JoyInfo[2].scale = Joystick[2].bGamepadStyle ? 1 : cv_joyscale[2].value;
|
||||
}
|
||||
|
||||
void I_JoyScale4(void)
|
||||
{
|
||||
JoyInfo[3].scale = DigitalGamepadStyle(3) ? 1 : cv_joyscale[3].value;
|
||||
Joystick[3].bGamepadStyle = cv_joyscale[3].value == 0;
|
||||
JoyInfo[3].scale = Joystick[3].bGamepadStyle ? 1 : cv_joyscale[3].value;
|
||||
}
|
||||
|
||||
// Cheat to get the device index for a joystick handle
|
||||
@@ -957,11 +961,6 @@ static int joy_open(int playerIndex, int joyIndex)
|
||||
return SDL_CONTROLLER_AXIS_MAX;
|
||||
}
|
||||
|
||||
void I_SetJoystickFocus(void)
|
||||
{
|
||||
SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, cv_gamepadifunfocused.value ? "1" : "0");
|
||||
}
|
||||
|
||||
//
|
||||
// I_InitJoystick
|
||||
//
|
||||
@@ -976,18 +975,6 @@ void I_InitJoystick(UINT8 index)
|
||||
if (M_CheckParm("-nojoy"))
|
||||
return;
|
||||
|
||||
{
|
||||
char dbpath[1024];
|
||||
sprintf(dbpath, "%s" PATHSEP "gamecontrollerdb.txt", srb2path);
|
||||
SDL_GameControllerAddMappingsFromFile(dbpath);
|
||||
}
|
||||
|
||||
{
|
||||
char dbpath[1024];
|
||||
sprintf(dbpath, "%s" PATHSEP "gamecontrollerdb_user.txt", srb2home);
|
||||
SDL_GameControllerAddMappingsFromFile(dbpath);
|
||||
}
|
||||
|
||||
if (M_CheckParm("-noxinput"))
|
||||
SDL_SetHintWithPriority("SDL_XINPUT_ENABLED", "0", SDL_HINT_OVERRIDE);
|
||||
|
||||
@@ -1658,15 +1645,9 @@ static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_ms
|
||||
signame = "SIGSEGV";
|
||||
break;
|
||||
#ifdef SIGTERM
|
||||
case SIGTERM: // Software termination signal from terminate
|
||||
sigmsg = ("SRB2Kart-Saturn was terminated by a terminate signal.");
|
||||
signame = "SIGTERM";
|
||||
break;
|
||||
#endif
|
||||
#ifdef SIGKILL
|
||||
case SIGKILL: // Software termination signal from kill
|
||||
case SIGTERM: // Software termination signal from kill
|
||||
sigmsg = ("SRB2Kart-Saturn was terminated by a kill signal.");
|
||||
signame = "SIGKILL";
|
||||
signame = "SIGTERM";
|
||||
break;
|
||||
#endif
|
||||
#ifdef SIGBREAK
|
||||
@@ -1864,7 +1845,9 @@ static void I_RegisterChildSignals(void)
|
||||
signal(SIGABRT, signal_handler_child);
|
||||
signal(SIGFPE, signal_handler_child);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef NEWSIGNALHANDLER
|
||||
FUNCNORETURN static ATTRNORETURN void newsignalhandler_Warn(const char *pr)
|
||||
{
|
||||
char text[128];
|
||||
@@ -1900,18 +1883,6 @@ static void I_Fork(void)
|
||||
I_RegisterChildSignals();
|
||||
break;
|
||||
default:
|
||||
// ignore those, those are handled by child process
|
||||
// otherwise parent might exit before it
|
||||
// and the below stuff wont run and your terminal will be left in an awkward state
|
||||
#ifdef SIGINT
|
||||
signal(SIGINT, SIG_IGN);
|
||||
#endif
|
||||
#ifdef SIGBREAK
|
||||
signal(SIGBREAK, SIG_IGN);
|
||||
#endif
|
||||
#ifdef SIGTERM
|
||||
signal(SIGTERM, SIG_IGN);
|
||||
#endif
|
||||
#ifdef LOGMESSAGES
|
||||
if (logstream)
|
||||
fclose(logstream);/* the child has this */
|
||||
@@ -1920,8 +1891,6 @@ static void I_Fork(void)
|
||||
#ifdef LOGMESSAGES
|
||||
/* By the way, exit closes files. */
|
||||
logstream = fopen(logfilename, "at");
|
||||
#else
|
||||
logstream = 0;
|
||||
#endif
|
||||
if (c == -1)
|
||||
{
|
||||
@@ -2004,6 +1973,7 @@ FUNCNORETURN void ATTRNORETURN I_Quit(void)
|
||||
is_quitting = true;
|
||||
SDL_ShowCursor(SDL_TRUE);
|
||||
|
||||
I_ShutdownConsole();
|
||||
M_SaveConfig(NULL); //save game config, cvars..
|
||||
D_SaveBan(); // save the ban list
|
||||
G_SaveGameData(false); // Tails 12-08-2002
|
||||
@@ -2032,6 +2002,7 @@ FUNCNORETURN void ATTRNORETURN I_Quit(void)
|
||||
if (myargmalloc)
|
||||
free(myargv); // Deallocate allocated memory
|
||||
|
||||
W_Shutdown();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@@ -2091,6 +2062,7 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
|
||||
sigttl = "SRB2Kart " VERSIONSTRING " Recursive Error";
|
||||
I_ShowSimpleErrorBox(sigttl, buffer);
|
||||
|
||||
W_Shutdown();
|
||||
exit(-1); // recursive errors detected
|
||||
}
|
||||
}
|
||||
@@ -2109,6 +2081,8 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
|
||||
|
||||
// ---
|
||||
|
||||
I_ShutdownConsole();
|
||||
|
||||
M_SaveConfig(NULL); // save game config, cvars..
|
||||
D_SaveBan(); // save the ban list
|
||||
G_SaveGameData(false); // Tails 12-08-2002
|
||||
@@ -2130,6 +2104,8 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
|
||||
//I_ShowSimpleErrorBox(sigttl, buffer);
|
||||
I_ShowErrorBox(sigttl, buffer);
|
||||
|
||||
W_Shutdown();
|
||||
|
||||
#if defined (PARANOIA) && defined (__CYGWIN__)
|
||||
*(INT32 *)2 = 4; //Alam: Debug!
|
||||
#endif
|
||||
@@ -2330,6 +2306,7 @@ char *I_GetUserName(void)
|
||||
strncpy(username, p, MAXPLAYERNAME);
|
||||
}
|
||||
|
||||
|
||||
if (!fastcmp(username, ""))
|
||||
return username;
|
||||
|
||||
|
||||
+256
-88
@@ -84,15 +84,20 @@
|
||||
#endif
|
||||
|
||||
// maximum number of windowed modes (see windowedModes[][])
|
||||
#define MAXWINMODES (22)
|
||||
#define MAXWINMODES (128)
|
||||
|
||||
/** \brief
|
||||
*/
|
||||
static INT32 numVidModes = -1;
|
||||
static void I_FillScreenResolutionsList(boolean force);
|
||||
|
||||
/** \brief
|
||||
*/
|
||||
static char vidModeName[33][32]; // allow 33 different modes
|
||||
typedef struct
|
||||
{
|
||||
char name[10];
|
||||
INT32 w;
|
||||
INT32 h;
|
||||
} video_mode_t;
|
||||
|
||||
static video_mode_t windowedModes[MAXWINMODES] = {{"320x200", 320, 200}}; // make sure the default mode exists
|
||||
static const char *fallback_resolution_name = "Fallback";
|
||||
static int vid_nummodes = 1;
|
||||
|
||||
rendermode_t rendermode = render_none;
|
||||
|
||||
@@ -108,6 +113,7 @@ static void KeyboardLayout_OnChange(void)
|
||||
{
|
||||
if (cv_keyboardlayout.value != 2)
|
||||
SDL_StopTextInput();
|
||||
HU_Shiftform();
|
||||
}
|
||||
|
||||
static CV_PossibleValue_t keyboardlayout_cons_t[] = {{1,"Default US"}, {2, "Native"}, {3, "AZERTY"}, {0, NULL}};
|
||||
@@ -138,9 +144,6 @@ static SDL_bool disable_mouse = SDL_FALSE;
|
||||
#define MOUSE_MENU false //(!disable_mouse && cv_usemouse.value && menuactive && !USE_FULLSCREEN)
|
||||
#define MOUSEBUTTONS_MAX MOUSEBUTTONS
|
||||
|
||||
// first entry in the modelist which is not bigger than MAXVIDWIDTHxMAXVIDHEIGHT
|
||||
static INT32 firstEntry = 0;
|
||||
|
||||
// Total mouse motion X/Y offsets
|
||||
static INT32 mousemovex = 0, mousemovey = 0;
|
||||
|
||||
@@ -161,38 +164,6 @@ static SDL_Texture *texture = NULL;
|
||||
static SDL_GLContext sdlglcontext = NULL;
|
||||
#endif
|
||||
static SDL_bool havefocus = SDL_TRUE;
|
||||
static const char *fallback_resolution_name = "Fallback";
|
||||
|
||||
// windowed video modes from which to choose from.
|
||||
static INT32 windowedModes[MAXWINMODES][2] =
|
||||
{
|
||||
{2560,1440}, // 1.66
|
||||
{1920,1200}, // 1.60,6.00
|
||||
{1920,1080}, // 1.66
|
||||
{1680,1050}, // 1.60,5.25
|
||||
{1600,1200}, // 1.33
|
||||
{1600, 900}, // 1.66
|
||||
{1366, 768}, // 1.66
|
||||
{1440, 900}, // 1.60,4.50
|
||||
{1280,1024}, // 1.33?
|
||||
{1280, 960}, // 1.33,4.00
|
||||
{1280, 800}, // 1.60,4.00
|
||||
{1280, 720}, // 1.66
|
||||
{1152, 864}, // 1.33,3.60
|
||||
{1024, 768}, // 1.33,3.20
|
||||
{ 960, 600}, // 1.33,3.20
|
||||
{ 800, 600}, // 1.33,2.50
|
||||
{ 735, 415}, // 1.33,2.50
|
||||
{ 640, 480}, // 1.33,2.00
|
||||
{ 640, 400}, // 1.60,2.00
|
||||
{ 500, 300}, // 1.33
|
||||
{ 320, 240}, // 1.33,1.00
|
||||
{ 320, 200}, // 1.60,1.00
|
||||
};
|
||||
|
||||
#define CUSTOMMODENUM 9999
|
||||
static INT32 custom_width = 0;
|
||||
static INT32 custom_height = 0;
|
||||
|
||||
static SDL_bool Impl_CreateWindow(SDL_bool fullscreen);
|
||||
static void Impl_SetWindowIcon(void);
|
||||
@@ -454,7 +425,7 @@ static INT32 SDLJoyAxis(const Sint16 axis, evtype_t which)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (DigitalGamepadStyle(pid))
|
||||
if (Joystick[pid].bGamepadStyle)
|
||||
{
|
||||
// gamepad control type, on or off, live or die
|
||||
if (raxis < -(JOYAXISRANGE/2))
|
||||
@@ -518,11 +489,20 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
|
||||
return;
|
||||
}
|
||||
|
||||
if (windowmoved && rendermode == render_opengl)
|
||||
if (windowmoved)
|
||||
{
|
||||
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
|
||||
I_DownSample();
|
||||
if (rendermode == render_opengl)
|
||||
{
|
||||
I_DownSample();
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
windowmoved = SDL_FALSE;
|
||||
}
|
||||
@@ -539,7 +519,8 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
|
||||
|
||||
if (!firsttimeonmouse)
|
||||
{
|
||||
if (cv_usemouse.value) I_StartupMouse();
|
||||
if (cv_usemouse.value)
|
||||
I_StartupMouse();
|
||||
}
|
||||
}
|
||||
else if (!mousefocus && !kbfocus)
|
||||
@@ -1233,9 +1214,9 @@ static void VID_Command_ModeList_f(void)
|
||||
"Under opengl, fullscreen only supports native desktop resolution.\n"
|
||||
"Under software, the mode is stretched up to desktop resolution.\n");
|
||||
|
||||
for (i = 0; i < 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1274,7 +1255,7 @@ static void I_CheckDesktopRes(void)
|
||||
return;
|
||||
}
|
||||
|
||||
if (SDL_GetDesktopDisplayMode(currentDisplayIndex, &curmode) != 0)
|
||||
if (SDL_GetCurrentDisplayMode(currentDisplayIndex, &curmode) != 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -1289,6 +1270,11 @@ boolean I_CheckNativeRes(void)
|
||||
return (vid.width == desktopwidth && vid.height == desktopheight);
|
||||
}
|
||||
|
||||
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height)
|
||||
{
|
||||
return (width > desktopwidth || height > desktopheight);
|
||||
}
|
||||
|
||||
#ifdef USE_FBO_OGL
|
||||
|
||||
void RefreshOGLSDLSurface(void)
|
||||
@@ -1519,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
|
||||
INT32 VID_NumModes(void)
|
||||
{
|
||||
if (USE_FULLSCREEN && numVidModes != -1)
|
||||
return numVidModes - firstEntry;
|
||||
else
|
||||
return MAXWINMODES;
|
||||
return vid_nummodes;
|
||||
}
|
||||
|
||||
const char *VID_GetModeName(INT32 modeNum)
|
||||
@@ -1535,42 +1715,34 @@ const char *VID_GetModeName(INT32 modeNum)
|
||||
return fallback_resolution_name;
|
||||
}
|
||||
|
||||
if (modeNum > MAXWINMODES)
|
||||
if (modeNum > vid_nummodes)
|
||||
return NULL;
|
||||
|
||||
sprintf(&vidModeName[modeNum][0], "%dx%d",
|
||||
windowedModes[modeNum][0],
|
||||
windowedModes[modeNum][1]);
|
||||
|
||||
return &vidModeName[modeNum][0];
|
||||
return windowedModes[modeNum].name;
|
||||
}
|
||||
|
||||
INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
// Under SDL2, we just use the windowed modes list, and scale in windowed fullscreen.
|
||||
@@ -1602,17 +1774,10 @@ INT32 VID_SetMode(INT32 modeNum)
|
||||
{
|
||||
vid.recalc = true;
|
||||
|
||||
if (modeNum >= 0 && modeNum < MAXWINMODES)
|
||||
if (modeNum >= 0 && modeNum < vid_nummodes)
|
||||
{
|
||||
vid.width = windowedModes[modeNum][0];
|
||||
vid.height = windowedModes[modeNum][1];
|
||||
vid.modenum = modeNum;
|
||||
}
|
||||
else if (modeNum == CUSTOMMODENUM && custom_width && custom_height)
|
||||
{
|
||||
// at this point these values are assumed to be okay
|
||||
vid.width = custom_width;
|
||||
vid.height = custom_height;
|
||||
vid.width = windowedModes[modeNum].w;
|
||||
vid.height = windowedModes[modeNum].h;
|
||||
vid.modenum = modeNum;
|
||||
}
|
||||
else
|
||||
@@ -1645,7 +1810,6 @@ INT32 VID_SetMode(INT32 modeNum)
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
static SDL_bool Impl_CreateContext(void)
|
||||
{
|
||||
// Renderer-specific stuff
|
||||
@@ -1668,6 +1832,9 @@ static SDL_bool Impl_CreateContext(void)
|
||||
I_Error("Failed to set up GL context: %s\n", SDL_GetError());
|
||||
}
|
||||
|
||||
// be sure to fill the resolution list the moment we have a window
|
||||
I_FillScreenResolutionsList(false);
|
||||
|
||||
return SDL_TRUE;
|
||||
}
|
||||
#endif
|
||||
@@ -1709,6 +1876,9 @@ static SDL_bool Impl_CreateContext(void)
|
||||
|
||||
SDL_RenderSetLogicalSize(renderer, BASEVIDWIDTH, BASEVIDHEIGHT);
|
||||
|
||||
// be sure to fill the resolution list the moment we have a window
|
||||
I_FillScreenResolutionsList(false);
|
||||
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
@@ -1855,9 +2025,6 @@ void I_StartupGraphics(void)
|
||||
{
|
||||
word = strtok(line, " \n");
|
||||
|
||||
if (!word)
|
||||
continue;
|
||||
|
||||
if (rendermode == render_none)
|
||||
{
|
||||
if (fasticmp(word, "software"))
|
||||
@@ -1949,8 +2116,6 @@ void I_StartupGraphics(void)
|
||||
usesdl2soft = M_CheckParm("-softblit");
|
||||
borderlesswindow = M_CheckParm("-borderless");
|
||||
|
||||
VID_Command_ModeList_f();
|
||||
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
{
|
||||
@@ -1974,6 +2139,9 @@ void I_StartupGraphics(void)
|
||||
vid.height = BASEVIDHEIGHT; // BitsPerPixel is the SDL interface's
|
||||
vid.recalc = true; // Set up the console stufff
|
||||
|
||||
// be sure to print AFTER window creation
|
||||
VID_Command_ModeList_f();
|
||||
|
||||
#ifdef HAVE_TTF
|
||||
I_ShutdownTTF();
|
||||
#endif
|
||||
|
||||
Binary file not shown.
@@ -945,7 +945,7 @@ UINT32 I_GetSongLength(void)
|
||||
|
||||
boolean I_SetSongLoopPoint(UINT32 looppoint)
|
||||
{
|
||||
if (!music || !is_looping)
|
||||
if (!music|| !is_looping)
|
||||
return false;
|
||||
|
||||
const musictype_t mustype = I_SongType();
|
||||
@@ -958,7 +958,7 @@ boolean I_SetSongLoopPoint(UINT32 looppoint)
|
||||
if (length > 0)
|
||||
looppoint %= length;
|
||||
|
||||
loop_point = max((float)(looppoint / 1000.0L), 0.0f);
|
||||
loop_point = max((float)(looppoint / 1000.0L), 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
+5
-18
@@ -137,13 +137,13 @@ boolean OglSdlSurface(INT32 w, INT32 h)
|
||||
|
||||
GL_DBG_Printf("OpenGL %s\n", gl_version);
|
||||
GL_DBG_Printf("GPU: %s\n", gl_renderer);
|
||||
GL_DBG_Printf("Extensions: \n");
|
||||
GL_DBG_Printf("Extensions:");
|
||||
|
||||
{
|
||||
// Need to do it with strtok for same reason its done like that in gr_glinfo command
|
||||
|
||||
char *copy = strdup((const char*)gl_extensions);
|
||||
char *ext;
|
||||
char *ext = strtok(copy, " ");
|
||||
|
||||
if (copy == NULL)
|
||||
{
|
||||
@@ -151,11 +151,9 @@ boolean OglSdlSurface(INT32 w, INT32 h)
|
||||
}
|
||||
else
|
||||
{
|
||||
ext = strtok(copy, " ");
|
||||
|
||||
do
|
||||
{
|
||||
GL_DBG_Printf(" - %s\n", ext);
|
||||
GL_DBG_Printf(" %s", ext);
|
||||
} while ((ext = strtok(NULL, " ")) != NULL);
|
||||
|
||||
free(copy);
|
||||
@@ -240,18 +238,7 @@ void OglSdlFinishUpdate(SDL_Window *window)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (HWR_ShouldUsePaletteRendering())
|
||||
{
|
||||
// Final postprocess step of palette rendering, after everything else has been drawn.
|
||||
GL_SetShader(HWR_GetShaderFromTarget(SHADER_PALETTE_POSTPROCESS));
|
||||
GL_EnableShader();
|
||||
HWR_DrawScreenFinalTexture(sdlw, sdlh);
|
||||
GL_UnSetShader();
|
||||
}
|
||||
else
|
||||
{
|
||||
HWR_DrawScreenFinalTexture(sdlw, sdlh);
|
||||
}
|
||||
HWR_DrawScreenFinalTexture(sdlw, sdlh, HWR_ShouldUsePaletteRendering());
|
||||
|
||||
#ifdef USE_FBO_OGL
|
||||
if (usefbo)
|
||||
@@ -272,7 +259,7 @@ void OglSdlFinishUpdate(SDL_Window *window)
|
||||
#else
|
||||
if (!I_CheckNativeRes() || WipeInAction)
|
||||
#endif
|
||||
HWR_DrawScreenFinalTexture(realwidth, realheight);
|
||||
HWR_DrawScreenFinalTexture(realwidth, realheight, false);
|
||||
}
|
||||
|
||||
#endif //HWRENDER
|
||||
|
||||
Loaded 100 of 106 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user