Compare commits

..
Author SHA1 Message Date
alufolie91 aa27dfe325 Merge branch 'Saturn-Next' into Saturn-Testing 2026-04-05 17:43:02 +02:00
alufolie91 74efc7ffe2 Merge remote-tracking branch 'origin/Saturn-Next' into Saturn-Testing 2026-04-04 16:57:58 +02:00
alufolie91 f52bd1df3f Merge branch 'Saturn-Next' into Saturn-Testing 2026-04-04 16:07:46 +02:00
alufolie91 09942ec48f controllers:check if controller supports addressable led and rumble 2026-03-29 13:49:59 +02:00
alufolie91 14c63c28b1 cache islocalplayer in P_SpectatorJoinGame 2026-03-29 13:46:57 +02:00
alufolie91 709c0dc69a Merge branch 'optifindvar' into Saturn-Testing 2026-03-29 13:12:04 +02:00
alufolie91 b9036384d5 Merge branch 'Saturn-Next' into Saturn-Testing 2026-03-29 13:10:56 +02:00
alufolie91 6b9730bf49 Merge branch 'Saturn-Next' into Saturn-Testing 2026-03-26 17:52:07 +01:00
alufolie91 4e235ddb0c Merge branch 'Saturn-Next' into Saturn-Testing 2026-03-23 21:47:42 +01:00
alufolie91 2ee97c6395 Merge branch 'Saturn-Next' into Saturn-Testing 2026-03-17 15:21:35 +01:00
alufolie91 dd1042e68b Merge remote-tracking branch 'origin/bluaopti2' into Saturn-Testing 2026-03-17 15:21:32 +01:00
alufolie91 7c0f296fcf testing branch 2026-03-13 19:14:01 +01:00
indev 11f78bc21f Allocate all colormaps with PU_STATIC 2026-03-13 19:13:27 +01:00
alufolie91 b84e3cdb7c Merge remote-tracking branch 'origin/addon-download-info' into Saturn-Testing 2026-03-13 19:13:22 +01:00
alufolie91 e551c1c1ff Merge branch 'bluaopti2' into Saturn-Testing 2026-03-13 19:12:58 +01:00
alufolie91 9cadd991f9 Merge branch 'vidmodestuff' into Saturn-Testing 2026-03-13 19:12:54 +01:00
indev ce0bddcbec Add toggle for server addon info 2026-03-11 17:26:12 +03:00
indev 9af6fc3b33 Display information about addon types loaded on server when joining (WIP) 2026-03-10 02:27:36 +03:00
Alug 467ecf8224 fix adding bogus resolutions into the resolution list when setting a new defaultres
CV_SetValue will call the callbacks each, which means when it sets the width, the height cvar will not be updated yet, which most definitely will not be in the modelist, so it will add it regardless
2026-02-03 22:02:17 +01:00
Alug 2077315f24 Merge branch 'Saturn-Next' into vidmodestuff 2025-12-27 15:13:31 +01:00
Alug 9bea6eddbd fix dedi build missing I_CheckAboveDesktopRes 2025-12-27 15:09:38 +01:00
Alug f4e5f7249c Merge branch 'Saturn-Next' into vidmodestuff 2025-12-27 15:09:02 +01:00
Alug a05413d925 fix erronous "Could not set custom resolution" warning on startup
the cvars may have not been initialised yet to anything
just return -2 and ignore
2025-11-24 20:49:45 +01:00
Alug 8a8cbffd12 I_CheckDesktopRes: use SDL_GetCurrentDisplayMode
instead of SDL_GetDesktopDisplayMode, as the former only returns the display mode from when the window was created, which might not reflect the actual current desktop mode.
Maybe fixes some resolutions being incorrectly reported asa having visual issues
2025-11-23 23:21:47 +01:00
Alug 1fb6c63097 fix dedi compile 2025-11-21 14:45:44 +01:00
Alug c312380944 check if our desired screen res already is in the videomode list
before deciding to rebuild the whole list when changing the resolution cvars
2025-11-18 05:22:50 +01:00
Alug b5bb2b42bf I_FillScreenResolutionsList: shrink list if it is too large
we check against MAXMODEDESCS, which is the maximum of modes the videomode can list
just in case we really get a display with a fuckton of resolutions, which most likely wont ever be the case though
this just removes the smallest modes from the list (accounting for the canonicals), to keep things simple
2025-11-18 04:55:50 +01:00
Alug d074f375ca M_VideoModeMenu: make sure red marked modes take precedence 2025-11-18 04:55:45 +01:00
Alug 6fd14f0a80 M_VideoModeMenu: remove old video mode dupe check 2025-11-18 04:55:41 +01:00
Alug d6bbb2c1b3 use static buffer for windowedModes names
no need to worry about memory management here :chaosleep:
2025-11-18 04:55:36 +01:00
Alug fa66b87965 cmp_resolutions: compare by numbers directly
instead by comparing it with strings
2025-11-18 04:55:30 +01:00
Alug c59d5db03e Merge remote-tracking branch 'origin/Saturn-Next' into vidmodestuff 2025-11-18 04:55:22 +01:00
Alug b6edc90553 mark resolutions listed above the current dektop resolution in red
as they lead to visual errors in openglmode without fbo support
2025-11-09 22:20:57 +01:00
Alug 23735121ff raise MAXWINMODES to 128
YES WINDOWS THANKS VERY MUCH SUPER COOL OF YOU
2025-11-09 20:40:03 +01:00
Alug 20950b698f make sure the default 320x200 mode exists 2025-11-09 20:39:58 +01:00
Alug 44df85d6a4 reduce the scope of this 2025-11-09 20:41:24 +01:00
Alug 42d53f1f6f Merge branch 'Saturn-Next' into vidmodestuff 2025-11-09 20:36:00 +01:00
Alug 48f2d0ff83 make sure our custom res fits within MAXVIDMODES
33 are alot so this probably will never be the case (i hope)
2025-11-09 20:21:30 +01:00
Alug 517723f9c1 handle custom res differently + make VID_NumModes return actual vidmodes
custom resolutions now will be put into the resolution list
which means they are selectable from the menu
2025-11-09 20:16:44 +01:00
Alug 6915077e0f refresh the video menu list if our resolution list changes
if you move the gamewindow to a different display, the video menu will now upadate to the new resolutions
2025-11-09 19:16:36 +01:00
Alug 406dbf333d use a video_mode_t thing for our custom resolution
perhaps we may merge it into windowedmodes? not sure
but this works for now
2025-11-09 19:13:38 +01:00
Alug a730dfd212 fix checking for if display changed 2025-11-09 19:13:35 +01:00
Alug 3058d365f3 no need to call I_FillScreenResolutionsList everywhere
its fine after startup, and when we move our window
2025-11-09 19:13:31 +01:00
Alug ccc453e0b0 fix windowmoved never resetting 2025-11-09 19:13:28 +01:00
Alug c3d02090e4 WIP: remove hardcoded resolutions
much thanks dsda-doom for most of the code for this
TODO:
- resolution menu needs to refresh if the list changes
- clean up
- handle custom resolutions more sane
- figure out the best maximum resolution list size the menu can display
2025-11-09 19:13:25 +01:00
Alug 20cd7621c3 delet numVidModes
wasnt doing anything
2025-11-09 19:13:22 +01:00
144 changed files with 8403 additions and 7917 deletions

No files matched your search

+1 -4
View File
@@ -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
View File
@@ -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
View File
@@ -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
+1 -2
View File
@@ -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
-1
View File
@@ -8,7 +8,6 @@ passthru_opts+=\
HAVE_MINIUPNPC\
HAVE_DISCORDRPC DEVELOP\
NOHOLEPUNCH\
HAVE_IPV6\
# build with debugging information
ifdef DEBUGMODE
+2
View File
@@ -42,6 +42,8 @@ include Makefile.d/haiku.mk
else ifdef SOLARIS # FIXME: UNTESTED
UNIX=1
platform=solaris
else ifdef CYGWIN32 # FIXME: UNTESTED
platform=cygwin
else ifdef MINGW
ifdef MINGW64
NONX86=1
+10
View File
@@ -15,6 +15,16 @@ sources+=$(call List,sdl/Sourcefile)
NOUPNP=1
# FIXME: UNTESTED
#ifdef PANDORA
#include sdl/SRB2Pandora/Makefile.cfg
#endif #ifdef PANDORA
# FIXME: UNTESTED
#ifdef CYGWIN32
#include sdl/MakeCYG.cfg
#endif #ifdef CYGWIN32
ifndef NOHW
sources+=sdl/ogl_sdl.c
endif
+5 -5
View File
@@ -34,8 +34,8 @@ size_t I_GetFreeMem(size_t *total)
/* return si.freeram; */
char buf[1024];
char *memTag;
size_t freeKBytes;
size_t totalKBytes;
UINT32 freeKBytes;
UINT32 totalKBytes;
INT32 n;
INT32 meminfo_fd = -1;
@@ -46,7 +46,7 @@ size_t I_GetFreeMem(size_t *total)
if (n < 0)
{
// Error
*total = 0;
*total = 0L;
return 0;
}
@@ -54,7 +54,7 @@ size_t I_GetFreeMem(size_t *total)
if (NULL == (memTag = strstr(buf, MEMTOTAL)))
{
// Error
*total = 0;
*total = 0L;
return 0;
}
@@ -64,7 +64,7 @@ size_t I_GetFreeMem(size_t *total)
if (NULL == (memTag = strstr(buf, MEMFREE)))
{
// Error
*total = 0;
*total = 0L;
return 0;
}
+38 -17
View File
@@ -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);
}
+12
View File
@@ -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;
}
+2
View File
@@ -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).
-7
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
+60 -227
View File
@@ -62,7 +62,7 @@ static boolean con_started = false; // console has been initialised
static boolean con_forcepic = true; // at startup toggle console translucency when first off
boolean con_recalc = false; // set true when screen size has changed
static tic_t con_tick; // console ticker for blinking prompt cursor
static tic_t con_tick; // console ticker for anim or blinking prompt cursor
// con_scrollup should use time (currenttime - lasttime)..
static boolean consoletoggle; // true when console key pushed, ticker will handle
@@ -103,7 +103,6 @@ static void CON_InputInit(void);
static void CON_RecalcSize(void);
static void CON_ChangeHeight(void);
static void CONS_height_Change(void);
static void CONS_hudlines_Change(void);
static void CONS_backcolor_Change(void);
@@ -132,7 +131,7 @@ static CV_PossibleValue_t speed_cons_t[] = {{0, "MIN"}, {64, "MAX"}, {0, NULL}};
static consvar_t cons_speed = {"con_speed", "8", CV_SAVE, speed_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
// percentage of screen height to use for console
static consvar_t cons_height = {"con_height", "50", CV_CALL|CV_SAVE, CV_Unsigned, CONS_height_Change, 0, NULL, NULL, 0, 0, NULL};
static consvar_t cons_height = {"con_height", "50", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
static CV_PossibleValue_t backpic_cons_t[] = {{0, "translucent"}, {1, "picture"}, {0, NULL}};
// whether to use console background picture, or translucent mode
@@ -174,18 +173,6 @@ consvar_t cons_consoleprintinmenu = {"consoleprintinmenu", "Off", CV_SAVE, CV_On
static void CON_Print(char *msg);
// Change the console height on demand
//
static void CONS_height_Change(void)
{
Lock_state();
if (con_destlines > 0 && !con_startup) // If the console is open (as in, not using "bind")...
CON_ChangeHeight(); // ...update its height now, not only when it's closed and re-opened
Unlock_state();
}
//
//
static void CONS_hudlines_Change(void)
@@ -221,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)
@@ -638,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;
@@ -1450,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);
@@ -1650,54 +1484,53 @@ static void CON_DrawConsole(void)
}
// draw console text lines from top to bottom
if (con_curlines >= minheight)
if (con_curlines < minheight)
return;
i = con_cy - con_scrollup;
// skip the last empty line due to the cursor being at the start of a new line
i--;
i -= (con_curlines - minheight) / charheight;
if (rendermode == render_none) return;
for (y = (con_curlines-minheight) % charheight; y <= con_curlines-minheight; y += charheight, i++)
{
i = con_cy - con_scrollup;
INT32 x;
size_t c;
// skip the last empty line due to the cursor being at the start of a new line
i--;
p = (UINT8 *)&con_buffer[((i > 0 ? i : 0)%con_totallines)*con_width];
i -= (con_curlines - minheight) / charheight;
if (rendermode == render_none)
return;
for (y = (con_curlines-minheight) % charheight; y <= con_curlines-minheight; y += charheight, i++)
for (c = 0, x = charwidth; c < con_width; c++, x += charwidth, p++)
{
INT32 x;
size_t c;
p = (UINT8 *)&con_buffer[((i > 0 ? i : 0)%con_totallines)*con_width];
for (c = 0, x = charwidth; c < con_width; c++, x += charwidth, p++)
while (*p & 0x80)
{
while (*p & 0x80)
{
charflags = (*p & 0x7f) << V_CHARCOLORSHIFT;
p++;
c++;
}
if (c >= con_width)
break;
int emotelen;
emote_t *emote;
if ((emote = M_VerifyEmote((const char *)p, &emotelen)))
{
M_DrawScaledEmote(x<<FRACBITS, (y+2*con_scalefactor)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART|V_NOSCALEPATCH);
p += emotelen-1;
c += emotelen-1;
continue;
}
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
charflags = (*p & 0x7f) << V_CHARCOLORSHIFT;
p++;
c++;
}
if (c >= con_width)
break;
int emotelen;
emote_t *emote;
if ((emote = M_VerifyEmote((const char *)p, &emotelen)))
{
M_DrawScaledEmote(x<<FRACBITS, (y+2*con_scalefactor)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART|V_NOSCALEPATCH);
p += emotelen-1;
c += emotelen-1;
continue;
}
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
}
}
// draw prompt if enough place (not while game startup)
if ((con_curlines >= (minheight-charheight)) && !con_startup)
if ((con_curlines == con_destlines) && (con_curlines >= minheight) && !con_startup)
CON_DrawInput();
}
-3
View File
@@ -114,7 +114,6 @@ void* PoolAllocator::allocate()
FreeBlock* ret = head_;
head_ = head_->next;
allocated_blocks_++;
return ret;
}
@@ -126,7 +125,6 @@ void PoolAllocator::deallocate(void* p)
FreeBlock* block = reinterpret_cast<FreeBlock*>(p);
block->next = head_;
head_ = block;
allocated_blocks_--;
}
void PoolAllocator::release()
@@ -146,7 +144,6 @@ void PoolAllocator::release()
first_chunk_ = nullptr;
head_ = nullptr;
allocated_blocks_ = 0;
}
static LinearMemory g_frame_memory {4 * 1024 * 1024};
-4
View File
@@ -37,7 +37,6 @@ class PoolAllocator final
FreeBlock* head_;
size_t block_size_;
size_t blocks_;
size_t allocated_blocks_;
int32_t tag_;
ChunkFooter* allocate_chunk();
@@ -48,7 +47,6 @@ public:
, head_(nullptr)
, block_size_(block_size)
, blocks_(blocks)
, allocated_blocks_(0)
, tag_(tag)
{}
PoolAllocator(const PoolAllocator&) = delete;
@@ -61,8 +59,6 @@ public:
void* allocate();
void deallocate(void* p);
constexpr size_t block_size() const noexcept { return block_size_; };
constexpr size_t allocated_blocks() const noexcept { return allocated_blocks_; };
constexpr size_t allocated_bytes() const noexcept { return allocated_blocks_ * block_size_; };
void release();
};
+45 -102
View File
@@ -110,7 +110,7 @@ SINT8 joinnode = 0; // used for CL_VIEWSERVER
boolean player_muted[MAXPLAYERS] = {};
// Server specific vars
UINT8 playernode[MAXPLAYERS] = {UINT8_MAX};
UINT8 playernode[MAXPLAYERS] = {};
// Minimum timeout for sending the savegame
// The actual timeout will be longer depending on the savegame length
@@ -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);
@@ -841,13 +839,11 @@ static void resynch_write_ctf(resynchend_pak *rst)
rst->flagplayer[i] = (SINT8)j;
break;
}
if (j == MAXPLAYERS) // fine, no I_Error
{
CONS_Alert(CONS_ERROR, "One of the flags has gone completely missing...\n");
rst->flagplayer[i] = -2;
}
continue;
}
@@ -1137,7 +1133,6 @@ static void CV_SavePlayerNames(UINT8 **p)
WRITEUINT8(*p, 0);
continue;
}
WRITESTRING(*p, player_names[i]);
}
}
@@ -1151,13 +1146,10 @@ static void CV_LoadPlayerNames(UINT8 **p)
for (; i < MAXPLAYERS; ++i)
{
READSTRING(*p, tmp_name);
if (tmp_name[0] == 0)
continue;
if (tmp_name[MAXPLAYERNAME]) // overflow detected
I_Error("Received bad server config packet when trying to join");
memcpy(player_names[i], tmp_name, MAXPLAYERNAME+1);
}
}
@@ -1263,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));
@@ -1455,7 +1449,6 @@ static void CL_DrawConnectionStatus(void)
if (playerinfo[i].node < 255)
{
strncpy(player_name, playerinfo[i].name, MAXPLAYERNAME);
player_name[MAXPLAYERNAME] = '\0';
// if we get a skin color
// try to colourize the player name
@@ -1492,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);
@@ -1508,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));
@@ -1551,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));
@@ -2035,7 +2029,6 @@ static void SV_SendSaveGame(INT32 node, boolean resending)
P_SaveNetGame(&save, resending);
length = save.p - save.buffer;
if (length > SAVEGAMESIZE)
{
Z_Free(save.buffer);
@@ -2188,8 +2181,7 @@ static void CL_LoadReceivedSavegame(boolean reloading)
if (unlink(tmpsave) == -1)
CONS_Alert(CONS_ERROR, M_GetText("Can't delete %s\n"), tmpsave);
consistancy[gametic%BACKUPTICS] = Consistancy();
if (!reloading)
CON_ToggleOff();
CON_ToggleOff();
#ifdef SATURNPAK
// Tell the server we have received and reloaded the gamestate
@@ -2239,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 &&
@@ -2867,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();
@@ -3400,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)
{
@@ -3449,7 +3427,7 @@ void CL_ClearPlayer(INT32 playernum)
if (players[playernum].mo)
{
// Don't leave a NiGHTS ghost!
if (nightsplayer(&players[playernum]) && players[playernum].mo->tracer)
if (UNLIKELY((players[playernum].pflags & PF_NIGHTSMODE) && players[playernum].mo->tracer))
P_RemoveMobj(players[playernum].mo->tracer);
P_RemoveMobj(players[playernum].mo);
}
@@ -3506,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);
@@ -3767,10 +3742,6 @@ static void Command_Ban(void)
if (pn == -1 || pn == 0)
return;
// player does not exist
if (!playeringame[pn])
return;
WRITEUINT8(p, pn);
if (COM_Argc() == 2)
@@ -3888,10 +3859,6 @@ static void Command_Kick(void)
if (pn == -1 || pn == 0)
return;
// player does not exist
if (!playeringame[pn])
return;
// Special case if we are trying to kick a player who is downloading the game state:
// trigger a timeout instead of kicking them, because a kick would only
// take effect after they have finished downloading
@@ -3941,13 +3908,6 @@ static void Got_KickCmd(const UINT8 **p, INT32 playernum)
pnum = READUINT8(*p);
msg = READUINT8(*p);
if (pnum >= MAXPLAYERS)
{
CONS_Alert(CONS_WARNING, M_GetText("Illegal kick command received from %s for player %d\n"), player_names[playernum], pnum);
return;
}
// FIXME: this does not work at all on dedi, servernode == 0 which is prevented from kick/ban command
if (pnum == serverplayer && IsPlayerAdmin(playernum))
{
CONS_Printf(M_GetText("Server is being shut down remotely. Goodbye!\n"));
@@ -4002,16 +3962,6 @@ static void Got_KickCmd(const UINT8 **p, INT32 playernum)
msg = KICK_MSG_CON_FAIL;
}
// without this the server will remove itself and thus self destruct on dedicated
if (server && (playernode[pnum] == UINT8_MAX || !playeringame[pnum]))
{
CONS_Alert(CONS_WARNING, M_GetText("Attempting to kick player %d which is not in game received from %s\n"), pnum, player_names[playernum]);
return;
}
// make sure we dont read garbage anywhere
memset(reason, 0, sizeof(buf));
if (msg == KICK_MSG_CUSTOM_BAN || msg == KICK_MSG_CUSTOM_KICK)
{
READSTRINGN(*p, reason, MAX_REASONLENGTH+1);
@@ -4411,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();
@@ -4483,7 +4433,6 @@ void SV_ResetServer(void)
pingmeasurecount = 1;
memset(realpingtable, 0, sizeof(realpingtable));
memset(playerpingtable, 0, sizeof(playerpingtable));
localplayerping = 0;
ClearAdminPlayers();
@@ -4832,7 +4781,7 @@ void CL_RemoveSplitscreenPlayer(UINT8 p)
// is there a game running
boolean Playing(void)
{
return ((server && serverrunning) || (client && cl_mode == CL_CONNECTED));
return (server && serverrunning) || (client && cl_mode == CL_CONNECTED);
}
boolean SV_SpawnServer(void)
@@ -5433,7 +5382,7 @@ static void PT_ServerCFG(SINT8 node)
{
maketic = gametic = neededtic = (tic_t)LONG(netbuffer->u.servercfg.gametic);
if ((gametype = netbuffer->u.servercfg.gametype) >= NUMGAMETYPES)
I_Error("Bad gametype %d in cliserv!", gametype);
I_Error("Bad gametype in cliserv!");
modifiedgame = netbuffer->u.servercfg.modifiedgame;
for (j = 0; j < MAXPLAYERS; j++)
adminplayers[j] = netbuffer->u.servercfg.adminplayers[j];
@@ -5668,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)
@@ -5711,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);
@@ -5722,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);
@@ -5732,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);
@@ -6870,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);
@@ -7020,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;
@@ -7084,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
-2
View File
@@ -650,8 +650,6 @@ extern UINT8 playernode[MAXPLAYERS];
extern boolean player_muted[MAXPLAYERS];
extern UINT32 localplayerping;
INT32 D_NumPlayers(void);
void D_ResetTiccmds(void);
+64 -52
View File
@@ -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] = ".";
@@ -275,6 +274,20 @@ static void D_Renderview(void)
R_ApplyLevelInterpolators(R_GetTimeFrac(RTF_LEVEL));
if (rendermode == render_soft && cv_homremoval.value)
{
if (cv_homremoval.value == 1)
{
// Clear the software screen buffer to remove HOM
memset(vid.screens[0], 31, vid.width * vid.height);
}
else if (cv_homremoval.value == 2)
{
//'development' HOM removal -- makes it blindingly obvious if HOM is spotted.
memset(vid.screens[0], 32+(timeinmap&15), vid.width * vid.height);
}
}
for (i = 0; i <= splitscreen; i++)
{
if (!P_MobjWasRemoved(players[displayplayers[i]].mo) || players[displayplayers[i]].playerstate == PST_DEAD)
@@ -349,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;
@@ -541,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);
@@ -703,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();
@@ -721,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)
@@ -1145,7 +1142,7 @@ static void D_FindAddonsToAutoload(void)
// you can probably imagine how that goes in a netgame....
if (W_CheckAutoLoadContainsMap(wadsToAutoload))
{
CONS_Alert(CONS_WARNING, "Autoload: file %s contains map data, this WILL cause crashes and desynchs! skipping...\n", wadsToAutoload);
CONS_Printf("Autoload: file %s contains map data! skipping...", wadsToAutoload);
continue;
}
@@ -1339,24 +1336,20 @@ static void IdentifyVersion(void)
//
// search for maps
//
static void D_CheckMapReplacements(boolean pwad)
static void D_CheckMaps(boolean checkreplaced)
{
INT32 i;
char *name;
UINT16 wadnum;
lumpinfo_t *lumpinfo;
size_t numfiles;
wadnum = pwad ? (mainwads+1) : 0;
numfiles = pwad ? numwadfiles : mainwads;
for (; wadnum < numfiles; wadnum++)
for (wadnum = 0; wadnum < mainwads; wadnum++)
{
lumpinfo = wadfiles[wadnum]->lumpinfo;
for (i = 0; i < wadfiles[wadnum]->numlumps; i++, lumpinfo++)
{
name = lumpinfo->name;
P_CheckMapReplacements(name, pwad);
P_CheckMapReplacements(name, checkreplaced);
}
}
}
@@ -1392,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
@@ -1421,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; }
@@ -1579,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
@@ -1776,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");
@@ -1819,19 +1833,17 @@ void D_SRB2Main(void)
// conversion sometimes needs the palette
V_ReloadPalette();
D_CheckMapReplacements(false);
D_CheckMaps(false);
W_InitMultipleFiles(startuppwads, startuppwadcount, true);
// Only search for pwad maps if we actually have a pwad added
if (startuppwadcount > 0)
{
CONS_Printf("W_InitMultipleFiles(): Adding extra PWADs.\n");
W_InitMultipleFiles(startuppwads, startuppwadcount, true);
// Only search for pwad maps if we actually have a pwad added
D_CheckMapReplacements(true);
D_CleanFile(startuppwads, startuppwadcount);
D_CheckMaps(true);
}
D_CleanFile(startuppwads, startuppwadcount);
startuppwadcount = 0;
cht_Init();
@@ -1918,7 +1930,7 @@ void D_SRB2Main(void)
CONS_Printf("R_Init(): Init SRB2 refresh daemon.\n");
R_Init();
#if SOUND == SOUND_DUMMY
#if SOUND==SOUND_DUMMY
sound_disabled = true;
music_disabled = true;
#else
@@ -2151,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
}
+2
View File
@@ -38,6 +38,8 @@ extern boolean found_extra3_kart; // for use in k_kart.c
extern boolean xtra_speedo; // extra speedometer check
extern boolean xtra_speedo_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
+1
View File
@@ -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)
+41 -105
View File
@@ -150,7 +150,6 @@ static void Command_ListWADS_f(void);
static void Command_LocateLump_f(void);
static void Command_ListDoomednums_f(void);
static void Command_ListUnusedSprites_f(void);
static void Command_ListUnusedMapSlots_f(void);
static void Command_RunSOC(void);
static void Command_Pause(void);
static void Command_Respawn(void);
@@ -566,7 +565,6 @@ const char *netxcmdnames[MAXNETXCMD - 1] =
"MODIFYVOTE",
"PICKVOTE",
"REMOVEPLAYER",
"DISCORD",
"LUACMD",
"LUAVAR"
};
@@ -647,7 +645,6 @@ void D_RegisterServerCommands(void)
COM_AddCommand("locatelump", Command_LocateLump_f);
COM_AddCommand("listmapthings", Command_ListDoomednums_f);
COM_AddCommand("listunusedsprites", Command_ListUnusedSprites_f);
COM_AddCommand("listunusedmapslots", Command_ListUnusedMapSlots_f);
COM_AddCommand("runsoc", Command_RunSOC);
COM_AddCommand("pause", Command_Pause);
@@ -931,6 +928,8 @@ void D_RegisterClientCommands(void)
COM_AddCommand("displayplayer", Command_Displayplayer_f);
CV_RegisterVar(&cv_audbuffersize);
CV_RegisterVar(&cv_palette);
CV_RegisterVar(&cv_palettenum);
@@ -941,9 +940,6 @@ void D_RegisterClientCommands(void)
CV_RegisterVar(&cv_chatspamprotection);
CV_RegisterVar(&cv_consolechat);
CV_RegisterVar(&cv_chatnotifications);
CV_RegisterVar(&cv_chat_xoffset);
CV_RegisterVar(&cv_chat_yoffset);
CV_RegisterVar(&cv_chat_showlimit);
CV_RegisterVar(&cv_chatbacktint);
CV_RegisterVar(&cv_chatcentertext);
CV_RegisterVar(&cv_songcredits);
@@ -1009,20 +1005,11 @@ void D_RegisterClientCommands(void)
CV_RegisterVar(&cv_usejoystick[i]);
CV_RegisterVar(&cv_joyscale[i]);
CV_RegisterVar(&cv_gamepadled[i]);
CV_RegisterVar(&cv_rumble[i]);
CV_RegisterVar(&cv_rumble_strength[i]);
CV_RegisterVar(&cv_rumble_spinout[i]);
CV_RegisterVar(&cv_rumble_sneakerboost[i]);
CV_RegisterVar(&cv_rumble_offroad[i]);
CV_RegisterVar(&cv_rumble_bananadrag[i]);
CV_RegisterVar(&cv_rumble_stairjank[i]);
CV_RegisterVar(&cv_rumble_brakedrift[i]);
CV_RegisterVar(&cv_rumble_driftcharge[i]);
CV_RegisterVar(&cv_rumblestrength[i]);
CV_RegisterVar(&cv_gamepadled[i]);
}
CV_RegisterVar(&cv_gamepadifunfocused);
CV_RegisterVar(&cv_gamepadledifunfocused);
CV_RegisterVar(&cv_rumbleifunfocused);
@@ -1039,7 +1026,6 @@ void D_RegisterClientCommands(void)
CV_RegisterVar(&cv_midimusicvolume);
#endif
CV_RegisterVar(&cv_numChannels);
CV_RegisterVar(&cv_audbuffersize);
#ifdef HAVE_OPENMPT
CV_RegisterVar(&cv_modfilter);
@@ -1227,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
@@ -1295,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.
*
@@ -1316,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);
@@ -1376,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);
@@ -1400,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);
}
@@ -1534,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)
@@ -1561,8 +1520,8 @@ static void SendNameAndColor(UINT8 splitplayer)
// TODO: make those cvars arrays
consvar_t *playercolor, *playername, *playerskin;
consvar_t *colorvars[] = {&cv_playercolor, &cv_playercolor2, &cv_playercolor3, &cv_playercolor4};
consvar_t *namevars[] = {&cv_playername, &cv_playername2, &cv_playername3, &cv_playername4};
consvar_t *skinvars[] = {&cv_skin, &cv_skin2, &cv_skin3, &cv_skin4};
consvar_t *namevars[] = {&cv_playername, &cv_playername2, &cv_playername3, &cv_playername4};
consvar_t *skinvars[] = {&cv_skin, &cv_skin2, &cv_skin3, &cv_skin4};
playercolor = colorvars[splitplayer];
playername = namevars[splitplayer];
@@ -1636,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)
@@ -1674,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;
@@ -1683,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);
@@ -1806,7 +1759,7 @@ INT32 D_LookupPlayer(const char *s)
if ((playernum = atoi(s)))
{
playernum = max(min(playernum, MAXPLAYERS-1), 0); /* not out of range */
playernum = max(min(playernum, MAXPLAYERS-1), 0);/* not out of range */
return playernum;
}
@@ -2235,6 +2188,7 @@ void D_SetupVote(void)
WRITEUINT8(p, secondgt);
secondgt &= ~0x80;
for (i = 0; i < 4; i++)
{
UINT16 m;
@@ -4604,23 +4558,6 @@ void Command_ListUnusedSprites_f(void)
}
}
void Command_ListUnusedMapSlots_f(void)
{
INT32 i;
CONS_Printf("\x82Printing map slot non-usage...\n");
for (i = 0; i < NUMMAPS; i++)
{
// is checking this enough?
if (mapheaderinfo[i])
continue;
CONS_Printf("%s\n", G_BuildMapName(i+1));
}
}
// =========================================================================
// MISC. COMMANDS
// =========================================================================
@@ -5501,6 +5438,7 @@ static void Name_OnChange(void)
}
SendNameAndColor(0);
}
static void Name2_OnChange(void)
@@ -5691,22 +5629,19 @@ static void Command_SkinSearch(void)
size_t i;
UINT16 s;
UINT16 ic = 0;
for (i = 1; i < COM_Argc(); i++)
{
for (s = 0; s < numskins; s++)
//skin_t *skininput = &skins[s];
for (i = 1; i < COM_Argc(); i++){
for( s = 0 ; s < numallskins ; s++ )
{
skin_t *skininput = &skins[s];
if (strcasestr(skininput->realname, COM_Argv(i)))
if (strcasestr(skininput->realname,COM_Argv(i)))
{
ic++;
CONS_Printf("%d. %s%s:\x80 %s\n", ic, HU_SkinColorToConsoleColor(skininput->prefcolor), skininput->realname, skininput->name);
CONS_Printf("%d. %s%s:\x80 %s\n", ic,HU_SkinColorToConsoleColor(skininput->prefcolor),skininput->realname,skininput->name);
}
}
}
CONS_Printf("Total %d skins.\n", ic);
CONS_Printf("Total %d skins.\n", ic);
}
/** Sends a color change for the console player, unless that player is moving.
@@ -5880,6 +5815,7 @@ static void BaseNumLaps_OnChange(void)
}
}
static void KartFrantic_OnChange(void)
{
if ((boolean)cv_kartfrantic.value != franticitems && gamestate == GS_LEVEL && leveltime > starttime)
+9 -1
View File
@@ -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;
@@ -149,7 +158,6 @@ extern consvar_t cv_showminimapnames;
extern consvar_t cv_showminimapfinished;
extern consvar_t cv_minihead;
extern consvar_t cv_showminimapangle;
extern consvar_t cv_spinoutroll;
extern consvar_t cv_showlapemblem;
+19 -33
View File
@@ -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;
-2
View File
@@ -566,8 +566,6 @@ typedef struct player_s
fixed_t fovadd; // adjust FOV for hw rendering
SINT8 driftlevel; // just for controller rumble for now
UINT8 stairjank;
} player_t;
#endif
+45 -112
View File
@@ -68,12 +68,6 @@ typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T);
#include <time.h>
#if defined (__linux__)
#include <sys/vfs.h>
#elif defined(__APPLE__)
#include <sys/param.h>
#include <sys/mount.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#include <mach/mach.h>
#else
#include <sys/param.h>
#include <sys/mount.h>
@@ -162,7 +156,8 @@ const char *wadSearchPaths[] = {
/** \brief WAD file to look for
*/
#define WADKEYWORD "srb2.srb"
#define WADKEYWORD1 "srb2.srb"
#define WADKEYWORD2 "srb2.wad"
/** \brief holds wad path
*/
static char returnWadPath[256];
@@ -525,23 +520,16 @@ void I_OutputMsg(const char *fmt, ...)
{
size_t len;
char *txt;
va_list argptr;
va_list argptr;
if (!fmt)
return;
va_start(argptr, fmt);
va_start(argptr,fmt);
len = vsnprintf(NULL, 0, fmt, argptr);
va_end(argptr);
if (len == 0)
return;
txt = (char*)(malloc(len+1));
if (!txt)
I_Error("I_OutputMsg: Out of memory!\n");
va_start(argptr, fmt);
txt = malloc(len+1);
va_start(argptr,fmt);
vsprintf(txt, fmt, argptr);
va_end(argptr);
@@ -747,10 +735,6 @@ const char *I_GetJoyName(INT32 joyindex)
return NULL;
}
void I_SetJoystickFocus(void)
{
}
boolean I_GamepadHasLED(INT32 playernum)
{
(void)playernum;
@@ -1035,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
@@ -1374,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);
@@ -1425,12 +1394,6 @@ static void I_Fork(void)
}
#endif/*NEWSIGNALHANDLER*/
int I_OpenURL(const char *url)
{
(void)url;
return -1;
}
INT32 I_StartupSystem(void)
{
I_StartupConsole();
@@ -1461,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
@@ -1478,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);
}
@@ -1535,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
}
}
@@ -1552,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
@@ -1567,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
@@ -1672,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])
@@ -1820,12 +1785,20 @@ const char *I_ClipboardPaste(void)
*/
static boolean isWadPathOk(const char *path)
{
char *wad3path = (char*)(malloc(256));
char *wad3path = malloc(256);
if (!wad3path)
return false;
sprintf(wad3path, pandf, path, WADKEYWORD);
sprintf(wad3path, pandf, path, WADKEYWORD1);
if (FIL_ReadFileOK(wad3path))
{
free(wad3path);
return true;
}
sprintf(wad3path, pandf, path, WADKEYWORD2);
if (FIL_ReadFileOK(wad3path))
{
@@ -1842,17 +1815,12 @@ static void pathonly(char *s)
size_t j;
for (j = strlen(s); j != (size_t)-1; j--)
{
if ((s[j] == '\\') || (s[j] == ':') || (s[j] == '/'))
{
if (s[j] == ':')
s[j+1] = 0;
else
s[j] = 0;
if (s[j] == ':') s[j+1] = 0;
else s[j] = 0;
return;
}
}
}
/** \brief search for srb2.srb in the given path
@@ -1868,7 +1836,7 @@ static const char *searchWad(const char *searchDir)
static char tempsw[256] = "";
filestatus_t fstemp;
strcpy(tempsw, WADKEYWORD);
strcpy(tempsw, WADKEYWORD1);
fstemp = filesearch(tempsw, searchDir, NULL, true, 20);
if (fstemp == FS_FOUND)
{
@@ -1989,22 +1957,17 @@ const char *I_LocateWad(void)
static long get_entry(const char* name, const char* buf)
{
long val;
const char* hit = strstr(buf, name);
if (hit == NULL)
{
char* hit = strstr(buf, name);
if (hit == NULL) {
return -1;
}
errno = 0;
val = strtol(hit + strlen(name), NULL, 10);
if (errno != 0)
{
if (errno != 0) {
CONS_Alert(CONS_ERROR, M_GetText("get_entry: strtol() failed: %s\n"), strerror(errno));
return -1;
}
return val;
}
#endif
@@ -2029,13 +1992,13 @@ size_t I_GetFreeMem(size_t *total)
*total = 32 << 20;
return 32 << 20;
#elif defined (_WIN32)
MEMORYSTATUSEX info;
MEMORYSTATUS info;
info.dwLength = sizeof (MEMORYSTATUSEX);
GlobalMemoryStatusEx( &info );
info.dwLength = sizeof (MEMORYSTATUS);
GlobalMemoryStatus( &info );
if (total)
*total = (size_t)info.ullTotalPhys;
return (size_t)info.ullAvailPhys;
*total = (size_t)info.dwTotalPhys;
return (size_t)info.dwAvailPhys;
#elif defined (__OS2__)
UINT32 pr_arena;
@@ -2068,7 +2031,7 @@ size_t I_GetFreeMem(size_t *total)
{
// Error
if (total)
*total = 0;
*total = 0L;
return 0;
}
@@ -2077,12 +2040,12 @@ size_t I_GetFreeMem(size_t *total)
{
// Error
if (total)
*total = 0;
*total = 0L;
return 0;
}
memTag += sizeof (MEMTOTAL);
totalKBytes = strtoul(memTag, NULL, 10);
totalKBytes = (size_t)atoi(memTag);
if ((memTag = strstr(buf, MEMAVAILABLE)) == NULL)
{
@@ -2096,7 +2059,7 @@ size_t I_GetFreeMem(size_t *total)
{
// Error
if (total)
*total = 0;
*total = 0L;
return 0;
}
freeKBytes = MemAvailable;
@@ -2104,46 +2067,16 @@ size_t I_GetFreeMem(size_t *total)
else
{
memTag += sizeof (MEMAVAILABLE);
freeKBytes = strtoul(memTag, NULL, 10);
freeKBytes = atoi(memTag);
}
if (total)
*total = totalKBytes << 10;
return freeKBytes << 10;
#elif defined(__APPLE__)
/* macOS */
mach_port_t host = mach_host_self();
kern_return_t kr;
mach_msg_type_number_t count;
vm_size_t v_page_size;
struct vm_statistics64 vm_stats;
uint64_t total_mem, free_mem;
size_t size;
size = sizeof(total_mem);
if (sysctlbyname("hw.memsize", &total_mem, &size, NULL, 0) < 0)
total_mem = 0;
kr = host_page_size(host, &v_page_size);
if (kr != KERN_SUCCESS)
v_page_size = 4096;
count = HOST_VM_INFO64_COUNT;
kr = host_statistics64(host, HOST_VM_INFO64, (host_info64_t)&vm_stats, &count);
if (kr == KERN_SUCCESS)
free_mem = (uint64_t)(vm_stats.free_count + vm_stats.inactive_count) * v_page_size;
else
free_mem = 0;
if (total)
*total = (size_t)total_mem;
return (size_t)free_mem;
#else
// Guess 48 MB.
if (total)
{
*total = 48<<20;
}
return 48<<20;
#endif
}
+11
View File
@@ -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
View File
@@ -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
View File
@@ -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 -16
View File
@@ -130,8 +130,8 @@ extern char logfilename[1024];
#else
#define VERSION 1 // Game version
#define SUBVERSION 6 // more precise version number
#define VERSIONSTRING "Saturn v9.3"
#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,13 +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
// if we build with 32 player (or more!) support we dont need to care vanilla compat
#if MAXPLAYERS > 16
#undef COMPAT_VANILLA
#endif
//-- SATURN __
/// Detect if a client is on Saturn in the clientconfig.
/// To seperately allow them to join or block joining from vanilla clients.
@@ -673,13 +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
#endif
#ifdef __cplusplus
} // extern "C"
#endif
+7 -1
View File
@@ -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
+8
View File
@@ -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
View File
@@ -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++);
+69 -73
View File
@@ -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?
@@ -447,8 +449,7 @@ void G_WriteDemoExtraData(void)
{
static UINT8 timeout = 0;
if (timeout)
timeout--;
if (timeout) timeout--;
if (demo_writerng == 1 || (demo_writerng == 2 && timeout == 0))
{
@@ -468,7 +469,6 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
if (!demobuf.p || !demo.deferstart)
return;
ziptic = READUINT8(demobuf.p);
if (ziptic & ZT_FWD)
@@ -490,12 +490,11 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
// what in the actual fuck is this???
// SRB2kart: Copy-pasted from ticcmd building, removes that crappy demo cam
const player_t *player = &players[displayplayers[0]];
if (((player->mo && player->speed > 0) // Moving
if (((players[displayplayers[0]].mo && players[displayplayers[0]].speed > 0) // Moving
|| (leveltime > starttime && (cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE)) // Rubber-burn turn
|| (player->kartstuff[k_respawn]) // Respawning
|| (player->spectator || objectplacing)) // Not a physical player
&& !(player->kartstuff[k_spinouttimer] && player->kartstuff[k_sneakertimer])) // Spinning and boosting cancels out spinout
|| (players[displayplayers[0]].kartstuff[k_respawn]) // Respawning
|| (players[displayplayers[0]].spectator || objectplacing)) // Not a physical player
&& !(players[displayplayers[0]].kartstuff[k_spinouttimer] && players[displayplayers[0]].kartstuff[k_sneakertimer])) // Spinning and boosting cancels out spinout
localangle[0] += (cmd->angleturn<<16);
if (!(demoflags & DF_GHOST) && *demobuf.p == DEMOMARKER)
@@ -518,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;
}
@@ -716,7 +715,7 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum)
if (!(demoflags & DF_GHOST))
return; // No ghost data to write.
if (ghost->player && nightsplayer(ghost->player) && ghost->tracer)
if (ghost->player && ghost->player->pflags & PF_NIGHTSMODE && ghost->tracer)
{
// We're talking about the NiGHTS thing, not the normal platforming thing!
ziptic |= GZT_NIGHTS;
@@ -729,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;
@@ -934,7 +933,7 @@ void G_ConsAllGhostTics(void)
void G_ConsGhostTic(INT32 playernum)
{
UINT8 ziptic;
fixed_t px, py, pz, gx, gy, gz;
fixed_t px,py,pz,gx,gy,gz;
mobj_t *testmo;
fixed_t syncleeway;
boolean nightsfail = false;
@@ -979,7 +978,7 @@ void G_ConsGhostTic(INT32 playernum)
if (ziptic & GZT_NIGHTS)
{
if (!testmo || !testmo->player || !nightsplayer(testmo->player) || !testmo->tracer)
if (!testmo || !testmo->player || !(testmo->player->pflags & PF_NIGHTSMODE) || !testmo->tracer)
nightsfail = true;
else
testmo = testmo->tracer;
@@ -1347,7 +1346,7 @@ fadeghost:
}
else
{
mobj = P_SpawnMobj(g->mo->x, g->mo->y, g->mo->z - FixedDiv(FixedMul(g->mo->info->height, g->mo->scale) - g->mo->height, 3*FRACUNIT), MT_THOK);
mobj = P_SpawnMobj(g->mo->x, g->mo->y, g->mo->z - FixedDiv(FixedMul(g->mo->info->height, g->mo->scale) - g->mo->height,3*FRACUNIT), MT_THOK);
mobj->sprite = states[mobjinfo[type].spawnstate].sprite;
mobj->frame = (states[mobjinfo[type].spawnstate].frame & FF_FRAMEMASK) | tr_trans60<<FF_TRANSSHIFT;
mobj->tics = -1; // nope.
@@ -1378,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;
@@ -1521,9 +1520,7 @@ void G_PreviewRewind(tic_t previewtime)
for (i = 0; i < MAXPLAYERS; i++)
{
player_t *player = &players[i];
if (!playeringame[i] || player->spectator)
if (!playeringame[i] || players[i].spectator)
{
if (info->playerinfo[i].player.mo)
{
@@ -1535,35 +1532,35 @@ void G_PreviewRewind(tic_t previewtime)
if (!info->playerinfo[i].ingame || !info->playerinfo[i].player.mo)
{
if (player->mo)
player->mo->flags2 |= MF2_DONTDRAW;
if (players[i].mo)
players[i].mo->flags2 |= MF2_DONTDRAW;
continue;
}
if (!player->mo)
if (!players[i].mo)
continue; //@TODO spawn temp object to act as a player display
player->mo->flags2 &= ~MF2_DONTDRAW;
players[i].mo->flags2 &= ~MF2_DONTDRAW;
P_UnsetThingPosition(player->mo);
P_UnsetThingPosition(players[i].mo);
#define TWEEN(pr) info->playerinfo[i].mobj.pr + FixedMul((INT32) (next_info->playerinfo[i].mobj.pr - info->playerinfo[i].mobj.pr), tweenvalue)
player->mo->x = TWEEN(x);
player->mo->y = TWEEN(y);
player->mo->z = TWEEN(z);
player->mo->angle = TWEEN(angle);
players[i].mo->x = TWEEN(x);
players[i].mo->y = TWEEN(y);
players[i].mo->z = TWEEN(z);
players[i].mo->angle = TWEEN(angle);
#undef TWEEN
P_SetThingPosition(player->mo);
P_SetThingPosition(players[i].mo);
player->frameangle = info->playerinfo[i].player.frameangle + FixedMul((INT32) (next_info->playerinfo[i].player.frameangle - info->playerinfo[i].player.frameangle), tweenvalue);
players[i].frameangle = info->playerinfo[i].player.frameangle + FixedMul((INT32) (next_info->playerinfo[i].player.frameangle - info->playerinfo[i].player.frameangle), tweenvalue);
player->mo->sprite = info->playerinfo[i].mobj.sprite;
player->mo->frame = info->playerinfo[i].mobj.frame;
players[i].mo->sprite = info->playerinfo[i].mobj.sprite;
players[i].mo->frame = info->playerinfo[i].mobj.frame;
player->realtime = info->playerinfo[i].player.realtime;
players[i].realtime = info->playerinfo[i].player.realtime;
for (j = 0; j < NUMKARTSTUFF; j++)
player->kartstuff[j] = info->playerinfo[i].player.kartstuff[j];
players[i].kartstuff[j] = info->playerinfo[i].player.kartstuff[j];
}
for (i = splitscreen; i >= 0; i--)
@@ -1696,7 +1693,7 @@ void G_BeginRecording(void)
return;
}
memset(name, 0, sizeof(name));
memset(name,0,sizeof(name));
demobuf.p = demobuf.buffer;
demoflags = DF_GHOST|(multiplayer ? DF_MULTIPLAYER : (modeattacking<<DF_ATTACKSHIFT));
@@ -1710,9 +1707,9 @@ void G_BeginRecording(void)
// Setup header.
memcpy(demobuf.p, DEMOHEADER, 12); demobuf.p += 12;
WRITEUINT8(demobuf.p, VERSION);
WRITEUINT8(demobuf.p, SUBVERSION);
WRITEUINT16(demobuf.p, DEMOVERSION);
WRITEUINT8(demobuf.p,VERSION);
WRITEUINT8(demobuf.p,SUBVERSION);
WRITEUINT16(demobuf.p,DEMOVERSION);
// Full replay title
demobuf.p += 64;
@@ -1741,7 +1738,7 @@ void G_BeginRecording(void)
// game data
memcpy(demobuf.p, "PLAY", 4); demobuf.p += 4;
WRITEINT16(demobuf.p, gamemap);
WRITEINT16(demobuf.p,gamemap);
memcpy(demobuf.p, mapmd5, 16); demobuf.p += 16;
WRITEUINT8(demobuf.p, demoflags);
@@ -1773,8 +1770,8 @@ void G_BeginRecording(void)
break;
case ATTACKING_RECORD: // 1
demotime_p = demobuf.p;
WRITEUINT32(demobuf.p, UINT32_MAX); // time
WRITEUINT32(demobuf.p, UINT32_MAX); // lap
WRITEUINT32(demobuf.p,UINT32_MAX); // time
WRITEUINT32(demobuf.p,UINT32_MAX); // lap
break;
default: // 3
break;
@@ -1831,9 +1828,9 @@ void G_BeginRecording(void)
if (demoflags & DF_LUAVARS)
LUA_Archive(&demobuf, false);
memset(&oldcmd, 0, sizeof(oldcmd));
memset(&oldghost, 0, sizeof(oldghost));
memset(&ghostext, 0, sizeof(ghostext));
memset(&oldcmd,0,sizeof(oldcmd));
memset(&oldghost,0,sizeof(oldghost));
memset(&ghostext,0,sizeof(ghostext));
for (i = 0; i < MAXPLAYERS; i++)
{
@@ -1873,19 +1870,19 @@ void G_WriteStanding(UINT8 ranking, char *name, INT32 skinnum, UINT8 color, UINT
// Name
memset(temp, 0, 16);
strncpy(temp, name, 16);
memcpy(demobuf.p, temp, 16);
memcpy(demobuf.p,temp,16);
demobuf.p += 16;
// Skin
memset(temp, 0, 16);
strncpy(temp, skins[skinnum].name, 16);
memcpy(demobuf.p, temp, 16);
memcpy(demobuf.p,temp,16);
demobuf.p += 16;
// Color
memset(temp, 0, 16);
strncpy(temp, KartColor_Names[color], 16);
memcpy(demobuf.p, temp, 16);
memcpy(demobuf.p,temp,16);
demobuf.p += 16;
// Score/time/whatever
@@ -2344,7 +2341,7 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
extrainfo_p += 16;
// Skin
memcpy(temp, extrainfo_p, 16);
memcpy(temp,extrainfo_p,16);
extrainfo_p += 16;
pdemo->standings[count].skin = UINT8_MAX;
@@ -2358,12 +2355,12 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
}
// Color
memcpy(temp, extrainfo_p, 16);
memcpy(temp,extrainfo_p,16);
extrainfo_p += 16;
for (i = 0; i < MAXSKINCOLORS; i++)
{
if (fasticmp(KartColor_Names[i], temp)) // SRB2kart
if (fasticmp(KartColor_Names[i],temp)) // SRB2kart
{
pdemo->standings[count].color = i;
break;
@@ -2832,15 +2829,15 @@ void G_DoPlayDemo(char *defdemoname)
if (demo.version == 0x0001)
{
// Player name
memcpy(player_names[0], demobuf.p, 16);
memcpy(player_names[0],demobuf.p,16);
demobuf.p += 16;
// Skin
memcpy(skin, demobuf.p, 16);
memcpy(skin,demobuf.p,16);
demobuf.p += 16;
// Color
memcpy(color, demobuf.p, 16);
memcpy(color,demobuf.p,16);
demobuf.p += 16;
demobuf.p += 5; // Backwards compat - some stats
@@ -2873,7 +2870,7 @@ void G_DoPlayDemo(char *defdemoname)
// Set color
for (i = 0; i < MAXSKINCOLORS; i++)
{
if (fasticmp(KartColor_Names[i], color)) // SRB2kart
if (fasticmp(KartColor_Names[i],color)) // SRB2kart
{
players[0].skincolor = i;
break;
@@ -2893,9 +2890,9 @@ void G_DoPlayDemo(char *defdemoname)
return;
}
memset(&oldcmd, 0, sizeof(oldcmd));
memset(&oldghost, 0, sizeof(oldghost));
memset(&ghostext, 0, sizeof(ghostext));
memset(&oldcmd,0,sizeof(oldcmd));
memset(&oldghost,0,sizeof(oldghost));
memset(&ghostext,0,sizeof(ghostext));
CONS_Alert(CONS_WARNING, M_GetText("Demo version does not match game version. Desyncs may occur.\n"));
@@ -2999,16 +2996,16 @@ void G_DoPlayDemo(char *defdemoname)
players[p].spectator = spectator;
// Name
memcpy(player_names[p], demobuf.p, 16);
memcpy(player_names[p],demobuf.p,16);
demobuf.p += 16;
// Skin
memcpy(skin, demobuf.p, 16);
memcpy(skin,demobuf.p,16);
demobuf.p += 16;
SetPlayerSkin(p, skin);
// Color
memcpy(color, demobuf.p, 16);
memcpy(color,demobuf.p,16);
demobuf.p += 16;
for (i = 0; i < MAXSKINCOLORS; i++)
@@ -3226,15 +3223,15 @@ void G_AddGhost(char *defdemoname)
if (ghostversion == 0x0001)
{
// Player name (TODO: Display this somehow if it doesn't match cv_playername!)
memcpy(name, p, 16);
memcpy(name, p,16);
p += 16;
// Skin
memcpy(skin, p, 16);
memcpy(skin, p,16);
p += 16;
// Color
memcpy(color, p, 16);
memcpy(color, p,16);
p += 16;
// Ghosts do not have a player structure to put this in.
@@ -3386,7 +3383,7 @@ void G_AddGhost(char *defdemoname)
for (i = 0; i < MAXSKINCOLORS; i++)
{
if (fasticmp(KartColor_Names[i], color)) // SRB2kart
if (fasticmp(KartColor_Names[i],color)) // SRB2kart
{
gh->mo->color = (UINT8)i;
break;
@@ -3478,7 +3475,7 @@ void G_UpdateStaffGhostName(lumpnum_t l)
if (ghostversion == 0x0001)
{
// Player name
memcpy(dummystaffname, p, 16);
memcpy(dummystaffname, p,16);
dummystaffname[16] = '\0';
return; // Not really a failure but whatever
}
@@ -3515,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;
+36 -20
View File
@@ -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);
@@ -857,8 +867,7 @@ static void G_HandleLocalDriftturn(ticcmd_t *cmd, UINT8 ssplayer)
static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam)
{
INT32 axis = 0;
const UINT8 forplayer = (ssplayer-1);
const boolean usejoystick = cv_usejoystick[forplayer].value;
const boolean usejoystick = cv_usejoystick[(ssplayer-1)].value;
// check for inputs and return button commands
// for stuff like joining with item button, saltyhop, honking, etc.
@@ -894,7 +903,7 @@ static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam)
#undef CHECKINPUT
axis = JoyAxis(AXISLOOKBACK, ssplayer);
camspin[forplayer] = (InputDown(gc_lookback, ssplayer) || (usejoystick && axis > 0));
camspin[ssplayer-1] = (InputDown(gc_lookback, ssplayer) || (usejoystick && axis > 0));
// Reset to our spec player if we watch someone else.
if ((cmd->driftturn || cmd->buttons)
@@ -991,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];
@@ -1023,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);
@@ -1289,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
@@ -1310,7 +1321,6 @@ static void G_DoLoadLevel(boolean resetplayer)
{
// fail so reset game stuff
Command_ExitGame_f();
P_FreeCorruptMapWarnings();
return;
}
@@ -1344,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;
@@ -3345,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);
@@ -3383,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);
@@ -4091,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);
@@ -4102,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);
@@ -4116,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;
+9 -6
View File
@@ -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];
@@ -118,11 +122,10 @@ extern consvar_t cv_driftsparkpulse;
extern consvar_t cv_gravstretch;
extern consvar_t cv_sloperoll;
extern consvar_t cv_sliptideroll;
extern consvar_t cv_stairjank;
extern consvar_t cv_stairjanksfx;
extern consvar_t cv_slamsound;
extern consvar_t cv_sloperolldist;
extern consvar_t cv_sparkroll;
extern consvar_t cv_spinoutroll;
extern consvar_t cv_squishdance, cv_squishdancespeed;
@@ -228,11 +231,10 @@ void G_SaveGameData(boolean force);
void G_SaveGame(UINT32 slot);
#define G_RaceGametype() (G_IsGameType(GT_RACE))
#define G_GametypeHasTeams() (G_IsGameType(GT_TEAMMATCH) || G_IsGameType(GT_CTF))
#define G_BattleGametype() (G_IsGameType(GT_MATCH))
#define G_GametypeHasTeams() (UNLIKELY(G_IsGameType(GT_TEAMMATCH) || G_IsGameType(GT_CTF)))
#define G_TagGametype() (UNLIKELY(G_IsGameType(GT_TAG) || G_IsGameType(GT_HIDEANDSEEK)))
#define G_RaceGametype() (G_IsGameType(GT_RACE))
#define G_TagGametype() (G_IsGameType(GT_TAG) || G_IsGameType(GT_HIDEANDSEEK))
FUNCINLINE static ATTRINLINE boolean G_IsGameType(int type)
{
@@ -250,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
+12 -49
View File
@@ -66,30 +66,13 @@ consvar_t cv_rumble[MAXSPLITSCREENPLAYERS] = {
static CV_PossibleValue_t rumblestrength_cons_t[] = {{FRACUNIT/4, "MIN"}, {FRACUNIT*4, "MAX"}, {0, NULL}};
consvar_t cv_rumble_strength[MAXSPLITSCREENPLAYERS] = {
consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS] = {
{"rumblestrength", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
{"rumblestrength2", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
{"rumblestrength3", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
{"rumblestrength4", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}
};
#define IMPL_RUMBLE_TYPE(type)\
consvar_t cv_rumble_##type [MAXSPLITSCREENPLAYERS] = {\
{"rumble_" #type, "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},\
{"rumble2_" #type, "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},\
{"rumble3_" #type, "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},\
{"rumble4_" #type, "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}\
};
IMPL_RUMBLE_TYPE(spinout);
IMPL_RUMBLE_TYPE(sneakerboost);
IMPL_RUMBLE_TYPE(offroad);
IMPL_RUMBLE_TYPE(bananadrag);
IMPL_RUMBLE_TYPE(stairjank);
IMPL_RUMBLE_TYPE(brakedrift);
IMPL_RUMBLE_TYPE(driftcharge);
static CV_PossibleValue_t gamepadled_cons_t[] = {{0, "Off"}, {1, "Skincolor"}, {2, "Mobjcolor"}, {0, NULL}};
consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS] = {
{"gamepadled", "Skincolor", CV_SAVE|CV_CALL|CV_NOINIT, gamepadled_cons_t, led_off_handle, 0, NULL, NULL, 0, 0, NULL},
@@ -98,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};
@@ -1053,8 +1035,8 @@ void G_PlayerDeviceRumble(INT32 playernum, UINT16 low_strength, UINT16 high_stre
// doesent need to be super precise
// but ensure this is within range (0-65535)
// placed here so it applies to lua aswell
low_strength = (UINT16)min(FixedMul(low_strength, cv_rumble_strength[playernum].value), UINT16_MAX);
high_strength = (UINT16)min(FixedMul(high_strength, cv_rumble_strength[playernum].value), UINT16_MAX);
low_strength = (UINT16)min(FixedMul(low_strength, cv_rumblestrength[playernum].value), UINT16_MAX);
high_strength = (UINT16)min(FixedMul(high_strength, cv_rumblestrength[playernum].value), UINT16_MAX);
I_GamepadRumble(playernum, low_strength, high_strength, duration);
}
@@ -1076,7 +1058,7 @@ void G_DeviceRumbleTick(void)
{
UINT8 i;
if (dedicated || numcontrollers == 0 || gamestate != GS_LEVEL || demo.playback)
if (dedicated || numcontrollers == 0 || gamestate != GS_LEVEL)
{
return;
}
@@ -1107,11 +1089,6 @@ void G_DeviceRumbleTick(void)
const player_t *player = P_GetLocalPlayerForNum(i);
if (!player)
{
continue;
}
// allow lua to do some crap for spectators
if (player->spectator || !player->mo)
{
@@ -1127,20 +1104,17 @@ void G_DeviceRumbleTick(void)
continue;
}
if (cv_rumble_spinout[i].value
&& player->kartstuff[k_spinouttimer])
if (player->kartstuff[k_spinouttimer])
{
//low = high = FRACUNIT / 6;
low = high = FixedMul((RUMBLE_VERYSTRONG), (FixedDiv(player->kartstuff[k_spinouttimer], (3*TICRATE / 2)))); // try do some some kinda fadeout, 3*TICRATE / 2 is the "default" spinout time
}
else if (cv_rumble_sneakerboost[i].value
&& (player->kartstuff[k_sneakertimer] > (sneakertime-(TICRATE/2))))
else if (player->kartstuff[k_sneakertimer] > (sneakertime-(TICRATE/2)))
{
low = high = RUMBLE_STRONG;
}
else if (cv_rumble_offroad[i].value
&& (player->kartstuff[k_offroad])
&& (player->speed != 0)
else if ((player->kartstuff[k_offroad])
&& player->speed != 0
&& P_IsObjectOnGround(player->mo))
{
// weaken this depending on if you got hyu or invinc
@@ -1157,37 +1131,26 @@ void G_DeviceRumbleTick(void)
low = high = RUMBLE_MODERATE;
}
}
else if (cv_rumble_bananadrag[i].value
&& (player->kartstuff[k_bananadrag] > TICRATE)
&& (player->speed != 0)
else if ((player->kartstuff[k_bananadrag] > TICRATE)
&& player->speed != 0
&& P_IsObjectOnGround(player->mo))
{
if (leveltime & 1) // this is actually funny lel
high = RUMBLE_MODERATE;
}
else if (cv_rumble_stairjank[i].value
&& (player->stairjank > 8)
&& (player->speed != 0)
&& P_IsObjectOnGround(player->mo))
{
low = high = RUMBLE_VERYWEAK;
}
if (cv_rumble_brakedrift[i].value
&& player->kartstuff[k_brakedrift])
if (player->kartstuff[k_brakedrift])
{
high = CLAMP((high + RUMBLE_VERYWEAK), 0, UINT16_MAX);
}
// pulse when gettin new driftlevel
// let this come last
if (cv_rumble_driftcharge[i].value
&& player->kartstuff[k_driftcharge]
if (player->kartstuff[k_driftcharge]
&& player->driftlevel)
{
high = CLAMP((high + RUMBLE_VERYWEAK), 0, UINT16_MAX);
// make it rumble slightly longer the higher your driftlevel!
if (player->driftlevel == 2)
lenght = 114;
else if (player->driftlevel == 3)
+5 -16
View File
@@ -100,10 +100,9 @@ typedef enum
gc_custom2, // Lua scriptable
gc_custom3, // Lua scriptable
gc_director,
// freecam specific controls
gc_freecam, // Toggle for freecam while ingame
gc_camfloat, // alternative button for raising camera
gc_camsink, // alternative button for sinking camera
gc_freecam, // Toggle for freecam while ingame
gc_camfloat, // alternative button for raising cam
gc_camsink, // alternative button for sinking
gc_strafeleft,
gc_straferight,
num_gamecontrols
@@ -113,20 +112,10 @@ typedef enum
extern consvar_t cv_mousexsens, cv_mouseysens;
extern consvar_t cv_controlperkey;
extern consvar_t cv_turnsmooth[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumble[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumble[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumble_strength[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumble_spinout[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumble_sneakerboost[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumble_offroad[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumble_bananadrag[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumble_stairjank[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumble_brakedrift[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumble_driftcharge[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_gamepadifunfocused;
extern consvar_t cv_gamepadledifunfocused;
extern consvar_t cv_rumbleifunfocused;
+1
View File
@@ -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;
-1
View File
@@ -183,7 +183,6 @@ static int comparePolygons(const void *p1, const void *p2)
UINT32 downloaded1 = poly1->texture ? poly1->texture->downloaded : 0; // there should be a opengl texture name here, usable for comparisons
UINT32 downloaded2 = poly2->texture ? poly2->texture->downloaded : 0;
diff64 = downloaded1 - downloaded2;
if (diff64 != 0) return diff64;
+244 -293
View File
@@ -12,21 +12,20 @@
/// \brief convert SRB2 map
#include "../doomdef.h"
#include "../doomstat.h"
#ifdef HWRENDER
#include "hw_main.h"
#include "hw_glob.h"
#include "../r_local.h"
#include "../z_zone.h"
#ifdef HWR_LOADING_SCREEN
#include "../console.h"
#include "../v_video.h"
#include "../m_menu.h"
#include "../p_setup.h" // levelfadecol
#include "../i_system.h"
#include "../m_argv.h"
#include "../i_video.h"
#endif
//#define DEBUG_HWBSP
#include "../w_wad.h"
#include "../p_setup.h" // levelfadecol
// --------------------------------------------------------------------------
// This is global data for planes rendering
@@ -34,20 +33,19 @@
extrasubsector_t *extrasubsectors = NULL;
// extra subsectors are subsectors without segs, added for the plane polygons
#define NUM_EXTRA_SUBSECTORS 50
static size_t num_alloc_extra_subsector;
// newsubsectors are subsectors without segs, added for the plane polygons
#define NEWSUBSECTORS 50
static size_t totsubsectors;
#ifdef PARANOIA
size_t num_extra_subsector;
size_t addsubsector;
#else
static size_t num_extra_subsector;
static size_t addsubsector;
#endif
typedef struct {
typedef struct
{
float x, y;
float dx, dy;
polyvertex_t divpt;
float divfrac;
} fdivline_t;
// when loading the map, this is set to true if portals are found.
@@ -55,7 +53,7 @@ typedef struct {
boolean gl_maphasportals = false;
// Determine on mapload if current map has any Horizonlines present
// avoids doing a bunch of work during rendering
// so we can avoid rather hot checks in HWR_Subsector
boolean gl_maphashorizonlines = false;
// ==========================================================================
@@ -82,25 +80,26 @@ static poly_t *HWR_AllocPoly(INT32 numpts)
return p;
}
/// TODO: polygons should be freed in reverse order for efficiency,
/// \todo polygons should be freed in reverse order for efficiency,
/// for now don't free because it doesn't free in reverse order
static void HWR_FreePoly(poly_t *poly)
{
Z_Free(poly);
}
// Return interception along bsp line (partline),
// Return interception along bsp line,
// with the polygon segment
// Return the division in partline div fields.
// divfrac = how far along partline vector is crossing pt
static boolean fracdivline(fdivline_t *partline, polyvertex_t *v1, polyvertex_t *v2)
//
static float bspfrac;
static polyvertex_t *fracdivline(fdivline_t *bsp, polyvertex_t *v1,
polyvertex_t *v2)
{
double frac1, frac2;
double num; // numerator
double den; // denominator
double v1x, v1y, v1dx, v1dy; // polygon side vector, v1->v2
double v3x, v3y, v3dx, v3dy; // partline vector
static polyvertex_t pt;
double frac;
double num;
double den;
double v1x, v1y, v1dx, v1dy;
double v2x, v2y, v2dx, v2dy;
// a segment of a polygon
v1x = v1->x;
@@ -109,118 +108,111 @@ static boolean fracdivline(fdivline_t *partline, polyvertex_t *v1, polyvertex_t
v1dy = v2->y - v1->y;
// the bsp partition line
v3x = partline->x;
v3y = partline->y;
v3dx = partline->dx;
v3dy = partline->dy;
v2x = bsp->x;
v2y = bsp->y;
v2dx = bsp->dx;
v2dy = bsp->dy;
den = v3dy*v1dx - v3dx*v1dy;
den = v2dy*v1dx - v2dx*v1dy;
if (fabs(den) < 1.0E-36) // avoid check of float for exact 0
return false; // partline and polygon side are effectively parallel
if (fabsf((float)den) < 1.0E-36f) // avoid checking exactly for 0.0
return NULL; // parallel
// first check the frac along the polygon segment,
// (do not accept hit with the extensions)
num = (v3x - v1x)*v3dy + (v1y - v3y)*v3dx;
frac1 = num / den;
num = (v2x - v1x)*v2dy + (v1y - v2y)*v2dx;
frac = num / den;
// 0= cross at v1, 1.0= cross at v2
if (frac1 < 0.0 || frac1 > 1.0) // double
return false; // not within the polygon side
if (frac < 0.0l || frac > 1.0l)
return NULL;
// now get the frac along the BSP line
// which is useful to determine what is left, what is right
num = (v3x - v1x)*v1dy + (v1y - v3y)*v1dx;
frac2 = num / den;
num = (v2x - v1x)*v1dy + (v1y - v2y)*v1dx;
frac = num / den;
bspfrac = (float)frac;
partline->divfrac = frac2; // how far along partline vector
// find the interception point along the partition line
pt.x = (float)(v2x + v2dx*frac);
pt.y = (float)(v2y + v2dy*frac);
// [WDJ] find the interception point along the segment.
// It should be slightly more accurate because it is always closer to the
// crossing point than arbitrary positions on the partition line.
partline->divpt.x = v1x + v1dx*frac1;
partline->divpt.y = v1y + v1dy*frac1;
return true;
return &pt;
}
// BOOMEDIT.WAD has a vertex error of .21
#define DIVLINE_VERTEX_DIFF 0.45f
// if two vertice coords have a x and/or y difference
// of less or equal than 1 FRACUNIT, they are considered the same
// point. Note: hardcoded value, 1.0f could be anything else.
static boolean SameVertex(polyvertex_t *p1, polyvertex_t *p2)
static boolean SameVertice (polyvertex_t *p1, polyvertex_t *p2)
{
if (fabsf(p2->x - p1->x) > DIVLINE_VERTEX_DIFF)
if (fabsf( p2->x - p1->x ) > DIVLINE_VERTEX_DIFF)
return false;
if (fabsf(p2->y - p1->y) > DIVLINE_VERTEX_DIFF)
if (fabsf( p2->y - p1->y ) > DIVLINE_VERTEX_DIFF)
return false;
// p1 and p2 are considered the same vertex
return true;
}
// split a _CONVEX_ polygon in two convex polygons
// outputs:
// frontpoly : polygon on right side of bsp line
// backpoly : polygon on left side
//
// Called from: WalkBSPNode
static void SplitPoly (fdivline_t *dlnp, // splitting parametric line
poly_t *poly, // the convex poly we split
poly_t **frontpoly, // return one poly here
poly_t **backpoly) // return the other here
static void SplitPoly (fdivline_t *bsp, //splitting parametric line
poly_t *poly, //the convex poly we split
poly_t **frontpoly, //return one poly here
poly_t **backpoly) //return the other here
{
INT32 i, j;
polyvertex_t *pv;
INT32 ps, pe; // poly start, end
INT32 ps_online, pe_online;
INT32 nptfront, nptback;
INT32 ps = -1, pe = -1;
INT32 nptfront, nptback;
polyvertex_t vs = {};
polyvertex_t ve = {};
polyvertex_t lastpv = {};
float ps_frac = 0.0f, pe_frac = 0.0f; // used to tell which poly is on
// the front side of the bsp partition line
ps = pe = -1;
ps_online = pe_online = 0;
float fracs = 0.0f, frace = 0.0f; //used to tell which poly is on
// the front side of the bsp partition line
INT32 psonline = 0, peonline = 0;
for (i = 0; i < poly->numpts; i++)
{
// i, j are one side of the poly
j = i+1;
j = i + 1;
if (j == poly->numpts)
j = 0; // wrap poly
j = 0;
// start & end points
if (!fracdivline(dlnp, &poly->pts[i], &poly->pts[j]))
pv = fracdivline(bsp, &poly->pts[i], &poly->pts[j]);
if (pv == NULL)
continue;
// have dividing pt
if (ps < 0)
{
// first point
ps = i;
vs = dlnp->divpt;
ps_frac = dlnp->divfrac;
vs = *pv;
fracs = bspfrac;
}
else
{
// the partition line can traverse a junction between two segments
//the partition line traverse a junction between two segments
// or the two points are so close, they can be considered as one
// thus, don't accept, since split 2 must be another vertex
if (SameVertex(&dlnp->divpt, &lastpv))
if (SameVertice(pv, &lastpv))
{
if (pe < 0)
{
ps = i;
ps_online = 1;
psonline = 1;
}
else
{
pe = i;
pe_online = 1;
peonline = 1;
}
}
else
@@ -228,25 +220,24 @@ static void SplitPoly (fdivline_t *dlnp, // splitting parametric line
if (pe < 0)
{
pe = i;
ve = dlnp->divpt;
pe_frac = dlnp->divfrac;
ve = *pv;
frace = bspfrac;
}
else
{
// a frac, not same vertice as last one
// we already got pt2 so pt 2 is not on the line,
// so we probably got back to the start point
// which is on the line
if (SameVertex(&dlnp->divpt, &vs))
ps_online = 1;
// a frac, not same vertice as last one
// we already got pt2 so pt 2 is not on the line,
// so we probably got back to the start point
// which is on the line
if (SameVertice(pv, &vs))
psonline = 1;
break;
}
}
}
// remember last point intercept to detect identical points
lastpv = dlnp->divpt;
lastpv = *pv;
}
// no split: the partition line is either parallel and
@@ -263,34 +254,28 @@ static void SplitPoly (fdivline_t *dlnp, // splitting parametric line
// linedefs where each side point the same sector, that is:
// the deep water effect with the original Doom
//TODO: make sure front poly is to front of partition line?
/// \todo make sure front poly is to front of partition line?
*frontpoly = poly;
*backpoly = NULL;
*backpoly = NULL;
return;
}
//if (ps >= 0 && pe < 0)
if (pe < 0)
{
//I_Error("SplitPoly: only one point for split line (%d %d)", ps, pe);
*frontpoly = poly;
*backpoly = NULL;
*backpoly = NULL;
return;
}
if (pe <= ps)
{
//I_Error("SplitPoly: invalid splitting line (%d %d)", ps, pe);
*frontpoly = poly;
*backpoly = NULL;
return;
}
if (UNLIKELY(pe <= ps))
I_Error("SplitPoly: invalid splitting line (%d %d)", ps, pe);
// Number of points on each side, _not_ counting those
// that may lie just on the line.
nptback = pe - ps - pe_online;
nptfront = poly->numpts - pe_online - ps_online - nptback;
// number of points on each side, _not_ counting those
// that may lie just one the line
nptback = pe - ps - peonline;
nptfront = poly->numpts - peonline - psonline - nptback;
if (nptback > 0)
*backpoly = HWR_AllocPoly(2 + nptback);
@@ -310,9 +295,11 @@ static void SplitPoly (fdivline_t *dlnp, // splitting parametric line
*pv++ = ve;
i = pe;
do {
do
{
if (++i == poly->numpts)
i = 0;
*pv++ = poly->pts[i];
} while (i != ps && --nptfront);
}
@@ -325,81 +312,68 @@ static void SplitPoly (fdivline_t *dlnp, // splitting parametric line
*pv++ = vs;
i = ps;
do {
do
{
if (++i == poly->numpts)
i = 0;
*pv++ = poly->pts[i];
} while (i != pe && --nptback);
}
// make sure frontpoly is the one on the 'right' side
// of the partition line
if (ps_frac > pe_frac)
if (fracs > frace)
{
poly_t* swappoly;
swappoly = *backpoly;
*backpoly = *frontpoly;
poly_t *swappoly;
swappoly = *backpoly;
*backpoly = *frontpoly;
*frontpoly = swappoly;
}
HWR_FreePoly(poly);
HWR_FreePoly (poly);
}
// checks if any line is a portal or horizonline, for optimization
static inline void CheckForPortalsAndHorizonLines(seg_t *lseg, const line_t *line)
{
// portal check
if (!gl_maphasportals && lseg->side == 0 && line->special == PORTALSPECIAL)
{
// Find the other side!
INT32 line2 = P_FindSpecialLineFromTag(PORTALSPECIAL, line->tag, -1);
if (line == &lines[line2])
line2 = P_FindSpecialLineFromTag(PORTALSPECIAL, line->tag, line2);
if (line2 >= 0) // found it!
gl_maphasportals = 1;
}
// horizonline check
if (!gl_maphashorizonlines && line->special == HORIZONSPECIAL)
gl_maphashorizonlines = true;
}
// Use each seg of the poly as a partition line, keep only the
// use each seg of the poly as a partition line, keep only the
// part of the convex poly to the front of the seg (that is,
// the part inside the sector). The part behind the seg, is
// the void space and is cut out.
// the part inside the sector), the part behind the seg, is
// the void space and is cut out
//
// poly : surrounding convex polygon, non-destructive
// lseg : array of seg
// segcount : number of seg in the array
// Return frontpoly, which may be new or ptr to poly.
// Called from: HWR_SubsecPoly
static poly_t *CutOutSubsecPoly(seg_t *lseg, INT32 segcount, poly_t *poly)
static poly_t *CutOutSubsecPoly(seg_t *lseg, INT32 count, poly_t *poly)
{
INT32 i, j;
poly_t* frontpoly = poly; // default, return same poly
polyvertex_t *pv;
INT32 poly_num_pts = 0, ps, pe;
INT32 nump = 0, ps, pe;
polyvertex_t vs = {}, ve = {},
p1 = {}, p2 = {};
float ps_frac = 0.0f;
vertex_t *v1, *v2;
float fracs = 0.0f;
fdivline_t cutseg; // x, y, dx, dy as start of node_t struct
poly_t *temppoly;
// for each seg of the subsector
for (; segcount--; lseg++)
for (; count--; lseg++)
{
// x, y, dx, dy (like a divline)
const line_t *line = lseg->linedef;
if (!line)
continue;
// portal check
if (UNLIKELY(!gl_maphasportals && line->special == PORTALSPECIAL && lseg->side == 0))
{
// Find the other side!
INT32 line2 = P_FindSpecialLineFromTag(PORTALSPECIAL, line->tag, -1);
CheckForPortalsAndHorizonLines(lseg, line);
if (line == &lines[line2])
line2 = P_FindSpecialLineFromTag(PORTALSPECIAL, line->tag, line2);
if (line->sidenum[1] != NO_INDEX)
if (line2 >= 0) // found it!
gl_maphasportals = 1;
}
if (!gl_maphashorizonlines && line->special == HORIZONSPECIAL)
gl_maphashorizonlines = true;
if (line->sidenum[1] != 0xffff)
{
if (sides[line->sidenum[0]].sector == sides[line->sidenum[1]].sector)
{
@@ -411,21 +385,10 @@ static poly_t *CutOutSubsecPoly(seg_t *lseg, INT32 segcount, poly_t *poly)
}
}
if (lseg->side) // side 1
{
v1 = line->v2;
v2 = line->v1;
}
else // side 0
{
v1 = line->v1;
v2 = line->v2;
}
p1.x = FixedToFloat(v1->x);
p1.y = FixedToFloat(v1->y);
p2.x = FixedToFloat(v2->x);
p2.y = FixedToFloat(v2->y);
p1.x = FIXED_TO_FLOAT(lseg->side ? line->v2->x : line->v1->x);
p1.y = FIXED_TO_FLOAT(lseg->side ? line->v2->y : line->v1->y);
p2.x = FIXED_TO_FLOAT(lseg->side ? line->v1->x : line->v2->x);
p2.y = FIXED_TO_FLOAT(lseg->side ? line->v1->y : line->v2->y);
cutseg.x = p1.x;
cutseg.y = p1.y;
@@ -438,130 +401,125 @@ static poly_t *CutOutSubsecPoly(seg_t *lseg, INT32 segcount, poly_t *poly)
for (i = 0; i < poly->numpts; i++)
{
// i, j are one side of the poly
j = i+1;
j = i + 1;
if (j == poly->numpts)
j = 0;
if (!fracdivline(&cutseg, &poly->pts[i], &poly->pts[j]))
pv = fracdivline(&cutseg, &poly->pts[i], &poly->pts[j]);
if (pv == NULL)
continue;
// have dividing pt
if (ps < 0)
{
ps = i;
vs = cutseg.divpt;
ps_frac = cutseg.divfrac;
continue;
}
// frac 1 on previous segment,
// 0 on the next,
// the split line goes through one of the convex poly
// vertices, happens quite often since the convex
// poly is already adjacent to the subsector segs
// on most borders
if (SameVertex(&cutseg.divpt, &vs))
continue;
if (ps_frac <= cutseg.divfrac)
{
poly_num_pts = 2 + poly->numpts - (i-ps);
pe = ps;
ps = i;
ve = cutseg.divpt;
vs = *pv;
fracs = bspfrac;
}
else
{
poly_num_pts = 2 + (i-ps);
pe = i;
ve = vs;
vs = cutseg.divpt;
}
//frac 1 on previous segment,
// 0 on the next,
//the split line goes through one of the convex poly
// vertices, happens quite often since the convex
// poly is already adjacent to the subsector segs
// on most borders
if (SameVertice(pv, &vs))
continue;
// found 2nd point
break;
if (fracs <= bspfrac)
{
nump = 2 + poly->numpts - (i-ps);
pe = ps;
ps = i;
ve = *pv;
}
else
{
nump = 2 + (i-ps);
pe = i;
ve = vs;
vs = *pv;
}
//found 2nd point
break;
}
}
// there was a split
if (ps >= 0)
{
// need 2 points
//need 2 points
if (pe >= 0)
{
// generate FRONT poly
frontpoly = HWR_AllocPoly(poly_num_pts);
temppoly = HWR_AllocPoly(nump);
pv = frontpoly->pts;
pv = temppoly->pts;
*pv++ = vs;
*pv++ = ve;
do {
if (++ps == poly->numpts) // poly wrap
do
{
if (++ps == poly->numpts)
ps = 0;
*pv++ = poly->pts[ps];
} while (ps != pe);
HWR_FreePoly(poly);
poly = frontpoly;
poly = temppoly;
}
#ifdef DEBUG_HWBSP
// hmmm... maybe we should NOT accept this, but this happens
// only when the cut is not needed it seems (when the cut
// line is aligned to one of the borders of the poly, and
// only some times..)
else
{
// hmmm... maybe we should NOT accept this, but this happens
// only when the cut is not needed it seems (when the cut
// line is aligned to one of the borders of the poly, and
// only some times..)
// [WDJ] This happens often (27 times in Doom2 map01).
skipcut++;
//I_Error("CutOutPoly: only one point for split line (%d %d) %d", ps, pe, debugpos);
I_Error("CutOutPoly: only one point for split line (%d %d) %d", ps, pe, debugpos);
}
#endif
}
}
return frontpoly;
return poly;
}
// At this point, the poly should be convex and the exact
// layout of the subsector. It is not always the case,
// layout of the subsector, it is not always the case,
// so continue to cut off the poly into smaller parts with
// each seg of the subsector.
//
// ssindex : subsec index, 0..(numsubsectors-1)
// poly : surrounding convex polygon, non-destructive
// Called from WalkBSPNode
static inline void HWR_SubsecPoly(INT32 ssindex, poly_t *poly)
static inline void HWR_SubsecPoly(INT32 num, poly_t *poly)
{
INT16 segcount;
INT16 count;
subsector_t *sub;
seg_t *lseg;
sub = &subsectors[ssindex];
segcount = sub->numlines;
sub = &subsectors[num];
count = sub->numlines;
lseg = &segs[sub->firstline];
if (poly)
{
poly = CutOutSubsecPoly(lseg, segcount, poly);
poly = CutOutSubsecPoly(lseg,count,poly);
#ifdef DEBUG_HWBSP
totalsubsecpolys++;
#endif
//extra data for this subsector
extrasubsectors[ssindex].planepoly = poly;
extrasubsectors[num].planepoly = poly;
}
}
// The bsp divline does not have enough precision.
// Search for the segs source of this divline.
static inline void SetDivline(node_t *bsp, fdivline_t *divline)
// the bsp divline have not enouth presition
// search for the segs source of this divline
static inline void SearchDivline(node_t *bsp, fdivline_t *divline)
{
// MAR - If you don't use the same partition line that the BSP uses,
// the front/back polys won't match the subsectors in the BSP!
divline->x = FixedToFloat(bsp->x);
divline->y = FixedToFloat(bsp->y);
divline->dx = FixedToFloat(bsp->dx);
divline->dy = FixedToFloat(bsp->dy);
divline->x = FIXED_TO_FLOAT(bsp->x);
divline->y = FIXED_TO_FLOAT(bsp->y);
divline->dx = FIXED_TO_FLOAT(bsp->dx);
divline->dy = FIXED_TO_FLOAT(bsp->dy);
}
//Hurdler: implement a loading status
@@ -574,25 +532,20 @@ static void loading_status(void)
char s[16];
int x, y;
/*if (g_reloadinggamestate)
{
return;
}*/
I_OsPolling();
CON_Drawer();
sprintf(s, "%d%%", (++ls_percent)<<1);
x = BASEVIDWIDTH/2;
y = BASEVIDHEIGHT/2;
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, levelfadecol); // Black background to match fade in effect
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); // Black background to match fade in effect
//V_DrawPatchFill(srb2back); // SRB2 background, ehhh too bright.
M_DrawTextBox(x-58, y-8, 13, 1);
V_DrawString(x-50, y, V_YELLOWMAP, "Loading...");
V_DrawRightAlignedString(x+50, y, V_YELLOWMAP, s);
// Is this really necessary at this point..?
V_DrawCenteredString(BASEVIDWIDTH/2, 40, V_YELLOWMAP, "OPENGL MODE IS INCOMPLETE AND SOME");
V_DrawCenteredString(BASEVIDWIDTH/2, 50, V_YELLOWMAP, "VISUAL FEATURES ARE MISSING/BROKEN.");
V_DrawCenteredString(BASEVIDWIDTH/2, 40, V_YELLOWMAP, "OPENGL MODE IS INCOMPLETE AND MAY");
V_DrawCenteredString(BASEVIDWIDTH/2, 50, V_YELLOWMAP, "NOT DISPLAY SOME SURFACES.");
V_DrawCenteredString(BASEVIDWIDTH/2, 70, V_YELLOWMAP, "USE AT SONIC'S RISK.");
I_UpdateNoVsync();
@@ -623,14 +576,14 @@ static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *b
{
CONS_Debug(DBG_RENDER, "Adding a new subsector\n");
if (num_extra_subsector == numsubsectors + NUM_EXTRA_SUBSECTORS)
I_Error("WalkBSPNode: not enough num_extra_subsectors\n");
else if (num_extra_subsector > 0x7fff)
I_Error("WalkBSPNode: num_extra_subsector > 0x7fff\n");
if (UNLIKELY(addsubsector == numsubsectors + NEWSUBSECTORS))
I_Error("WalkBSPNode: not enough addsubsectors\n");
else if (UNLIKELY(addsubsector > 0x7fff))
I_Error("WalkBSPNode: addsubsector > 0x7fff\n");
*leafnode = (UINT16)((UINT16)num_extra_subsector | NF_SUBSECTOR);
extrasubsectors[num_extra_subsector].planepoly = poly;
num_extra_subsector++;
*leafnode = (UINT16)((UINT16)addsubsector | NF_SUBSECTOR);
extrasubsectors[addsubsector].planepoly = poly;
addsubsector++;
}
//add subsectors without segs here?
@@ -640,8 +593,8 @@ static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *b
{
HWR_SubsecPoly(bspnum & ~NF_SUBSECTOR, poly);
#ifdef HWR_LOADING_SCREEN
//Hurdler: implement a loading status
#ifdef HWR_LOADING_SCREEN
if (ls_count-- <= 0)
{
ls_count = numsubsectors/50;
@@ -660,7 +613,7 @@ static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *b
}
bsp = &nodes[bspnum];
SetDivline(bsp, &fdivline);
SearchDivline(bsp, &fdivline);
SplitPoly(&fdivline, poly, &frontpoly, &backpoly);
poly = NULL;
@@ -703,12 +656,12 @@ void HWR_FreeExtraSubsectors(void)
extrasubsectors = NULL;
}
#define MAXDIST (1.5f)
#define MAXDIST 1.5f
// BP: can't move vertex: DON'T change polygon geometry! (convex)
//#define MOVEVERTEX
// Is vertex va within the seg v1, v2
static boolean PointInSeg(polyvertex_t *va, polyvertex_t *v1, polyvertex_t *v2)
static boolean PointInSeg(polyvertex_t *va,polyvertex_t *v1,polyvertex_t *v2)
{
register float ax, ay, bx, by, cx, cy, d, norm;
@@ -783,8 +736,8 @@ static boolean PointInSeg(polyvertex_t *va, polyvertex_t *v1, polyvertex_t *v2)
if (cx*cx+cy*cy <= MAXDIST*MAXDIST)
{
// ajust a little the point position
va->x = ax*d+v1->x;
va->y = ay*d+v1->y;
a->x = ax*d+v1->x;
a->y = ay*d+v1->y;
// anyway the correction is not enouth
return true;
}
@@ -796,10 +749,10 @@ static boolean PointInSeg(polyvertex_t *va, polyvertex_t *v1, polyvertex_t *v2)
static INT32 numsplitpoly;
static void SearchSegInBSP(INT32 bspnum, polyvertex_t *p, poly_t *poly)
static void SearchSegInBSP(INT32 bspnum,polyvertex_t *p,poly_t *poly)
{
poly_t *q;
INT32 j, k;
INT32 j,k;
if (bspnum & NF_SUBSECTOR)
{
@@ -819,12 +772,12 @@ static void SearchSegInBSP(INT32 bspnum, polyvertex_t *p, poly_t *poly)
if (k == numpts)
k = 0;
if (!SameVertex(p, &q->pts[j]) &&
!SameVertex(p, &q->pts[k]) &&
PointInSeg(p, &q->pts[j], &q->pts[k]))
if (!SameVertice(p, &q->pts[j])
&& !SameVertice(p, &q->pts[k])
&& PointInSeg(p, &q->pts[j], &q->pts[k]))
{
INT32 n;
poly_t *newpoly = HWR_AllocPoly(numpts+1);
INT32 n;
for (n = 0; n <= j; n++)
newpoly->pts[n] = q->pts[n];
@@ -845,17 +798,16 @@ static void SearchSegInBSP(INT32 bspnum, polyvertex_t *p, poly_t *poly)
return;
}
// Not a subsector, visit left and right children.
if ((FixedToFloat(nodes[bspnum].bbox[0][BOXBOTTOM])-MAXDIST <= p->y) &&
(FixedToFloat(nodes[bspnum].bbox[0][BOXTOP ])+MAXDIST >= p->y) &&
(FixedToFloat(nodes[bspnum].bbox[0][BOXLEFT ])-MAXDIST <= p->x) &&
(FixedToFloat(nodes[bspnum].bbox[0][BOXRIGHT ])+MAXDIST >= p->x))
if ((FIXED_TO_FLOAT(nodes[bspnum].bbox[0][BOXBOTTOM])-MAXDIST <= p->y) &&
(FIXED_TO_FLOAT(nodes[bspnum].bbox[0][BOXTOP ])+MAXDIST >= p->y) &&
(FIXED_TO_FLOAT(nodes[bspnum].bbox[0][BOXLEFT ])-MAXDIST <= p->x) &&
(FIXED_TO_FLOAT(nodes[bspnum].bbox[0][BOXRIGHT ])+MAXDIST >= p->x))
SearchSegInBSP(nodes[bspnum].children[0], p, poly);
if ((FixedToFloat(nodes[bspnum].bbox[1][BOXBOTTOM])-MAXDIST <= p->y) &&
(FixedToFloat(nodes[bspnum].bbox[1][BOXTOP ])+MAXDIST >= p->y) &&
(FixedToFloat(nodes[bspnum].bbox[1][BOXLEFT ])-MAXDIST <= p->x) &&
(FixedToFloat(nodes[bspnum].bbox[1][BOXRIGHT ])+MAXDIST >= p->x))
if ((FIXED_TO_FLOAT(nodes[bspnum].bbox[1][BOXBOTTOM])-MAXDIST <= p->y) &&
(FIXED_TO_FLOAT(nodes[bspnum].bbox[1][BOXTOP ])+MAXDIST >= p->y) &&
(FIXED_TO_FLOAT(nodes[bspnum].bbox[1][BOXLEFT ])-MAXDIST <= p->x) &&
(FIXED_TO_FLOAT(nodes[bspnum].bbox[1][BOXRIGHT ])+MAXDIST >= p->x))
SearchSegInBSP(nodes[bspnum].children[1], p, poly);
}
@@ -864,43 +816,38 @@ static void SearchSegInBSP(INT32 bspnum, polyvertex_t *p, poly_t *poly)
// but we must use a different structure : polygone pointing on segs
// segs pointing on polygone and on vertex (too mush complicated, well not
// realy but i am soo lasy), the methode discibed is also better for segs presition
static void SolveTProblem(void)
static INT32 SolveTProblem(void)
{
poly_t *p;
INT32 i, numpts;
size_t ssnum;
INT32 i;
size_t l;
if (!cv_glsolvetjoin.value)
return;
if (cv_glsolvetjoin.value == 0)
return 0;
CONS_Debug(DBG_RENDER, "Solving T-joins. This may take a while. Please wait...\n");
#ifdef HWR_LOADING_SCREEN
CON_Drawer(); //let the user know what we are doing
I_FinishUpdate(); // page flip or blit buffer
#endif
numsplitpoly = 0;
for (ssnum = 0; ssnum < num_extra_subsector; ssnum++)
for (l = 0; l < addsubsector; l++)
{
p = extrasubsectors[ssnum].planepoly;
p = extrasubsectors[l].planepoly;
if (!p || p->numpts == 0)
if (!p)
continue;
numpts = p->numpts;
for (i = 0; i < numpts; i++)
for (i = 0; i < p->numpts; i++)
SearchSegInBSP((INT32)numnodes-1, &p->pts[i], p);
}
#ifdef DEBUG_HWBSP
CONS_Debug(DBG_RENDER, "numsplitpoly %d\n", numsplitpoly);
CONS_Debug(DBG_RENDER, "%d point divides a polygon line\n", numsplitpoly);
#endif
return numsplitpoly;
}
// call this routine after the BSP of a Doom wad file is loaded,
// and it will generate all the convex polys for the hardware renderer
void HWR_CreatePlanePolygons(INT32 bspnum)
@@ -918,7 +865,7 @@ void HWR_CreatePlanePolygons(INT32 bspnum)
#endif
// reset the portal and horizonline flag
gl_maphasportals = gl_maphashorizonlines = false;
gl_maphasportals = gl_maphashorizonlines = 0;
// find min/max boundaries of map
#ifdef DEBUG_HWBSP
@@ -935,35 +882,39 @@ void HWR_CreatePlanePolygons(INT32 bspnum)
HWR_FreeExtraSubsectors();
// allocate extra data for each subsector present in map
num_alloc_extra_subsector = numsubsectors + NUM_EXTRA_SUBSECTORS;
extrasubsectors = (extrasubsector_t*)calloc(num_alloc_extra_subsector, sizeof(*extrasubsectors));
totsubsectors = numsubsectors + NEWSUBSECTORS;
extrasubsectors = calloc(totsubsectors, sizeof(*extrasubsectors));
if (UNLIKELY(!extrasubsectors))
I_Error("couldn't malloc extrasubsectors num_alloc_extra_subsector %s\n", sizeu1(num_alloc_extra_subsector));
I_Error("couldn't malloc extrasubsectors totsubsectors %s\n", sizeu1(totsubsectors));
// number of the first new subsector that might be added
num_extra_subsector = numsubsectors;
addsubsector = numsubsectors;
// construct the initial convex poly that encloses the full map
rootp = HWR_AllocPoly(4);
rootpv = rootp->pts;
// clockwise polygon
rootpv->x = FixedToFloat(rootbbox[BOXLEFT ]);
rootpv->y = FixedToFloat(rootbbox[BOXBOTTOM]); //lr
rootpv->x = FIXED_TO_FLOAT(rootbbox[BOXLEFT ]);
rootpv->y = FIXED_TO_FLOAT(rootbbox[BOXBOTTOM]); //lr
rootpv++;
rootpv->x = FixedToFloat(rootbbox[BOXLEFT ]);
rootpv->y = FixedToFloat(rootbbox[BOXTOP ]); //ur
rootpv->x = FIXED_TO_FLOAT(rootbbox[BOXLEFT ]);
rootpv->y = FIXED_TO_FLOAT(rootbbox[BOXTOP ]); //ur
rootpv++;
rootpv->x = FixedToFloat(rootbbox[BOXRIGHT ]);
rootpv->y = FixedToFloat(rootbbox[BOXTOP ]); //ul
rootpv->x = FIXED_TO_FLOAT(rootbbox[BOXRIGHT ]);
rootpv->y = FIXED_TO_FLOAT(rootbbox[BOXTOP ]); //ul
rootpv++;
rootpv->x = FixedToFloat(rootbbox[BOXRIGHT ]);
rootpv->y = FixedToFloat(rootbbox[BOXBOTTOM]); //ll
rootpv->x = FIXED_TO_FLOAT(rootbbox[BOXRIGHT ]);
rootpv->y = FIXED_TO_FLOAT(rootbbox[BOXBOTTOM]); //ll
rootpv++;
WalkBSPNode(bspnum, rootp, NULL, rootbbox);
#ifdef DEBUG_HWBSP
i = SolveTProblem();
CONS_Debug(DBG_RENDER, "%d point divides a polygon line\n",i);
#else
SolveTProblem();
#endif
#ifdef DEBUG_HWBSP
//debug debug..
+5 -10
View File
@@ -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;
}
+5 -6
View File
@@ -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;
+1
View File
@@ -96,6 +96,7 @@ typedef struct
typedef struct
{
float x, y, z;
fixed_t x2, y2, z2;
} polyvertex_t;
// a convex 'plane' polygon, clockwise order
+18 -22
View File
@@ -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
// --------------------------------------------------------------------------
+1 -6
View File
@@ -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);
+3 -3
View File
@@ -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
@@ -54,7 +54,7 @@ void HWR_ObjectLightLevelPost(gl_vissprite_t *spr, const sector_t *sector, INT32
// --------
extern extrasubsector_t *extrasubsectors;
#ifdef PARANOIA
extern size_t num_extra_subsector;
extern size_t addsubsector;
#endif
void HWR_FreeExtraSubsectors(void);
+545 -503
View File
File diff suppressed because it is too large. Load diff
+3 -8
View File
@@ -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
+5 -7
View File
@@ -1153,11 +1153,8 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
INT32 durs = spr->mobj->state->tics;
INT32 tics = spr->mobj->tics;
//mdlframe_t *next = NULL;
//const UINT8 flip = (UINT8)(!(spr->mobj->eflags & MFE_VERTICALFLIP) != !R_ThingVerticallyFlipped(spr->mobj)); // :chaosleep:
const UINT8 flip = (UINT8)((spr->mobj->eflags & MFE_VERTICALFLIP) == MFE_VERTICALFLIP);
const UINT8 hflip = (UINT8)(!(spr->mobj->mirrored) != !R_ThingHorizontallyFlipped(spr->mobj));
const UINT8 hflip = (UINT8)(!(spr->mobj->mirrored) != !(spr->mobj->frame & FF_HORIZONTALFLIP));
spritedef_t *sprdef;
spriteframe_t *sprframe;
spriteinfo_t *sprinfo;
@@ -1403,11 +1400,12 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
const angle_t sliptideroll = ((cv_sliptideroll.value && spr->mobj->player) ? spr->mobj->player->sliproll : 0);
const SINT8 flipfactor = flip ? -1 : 1;
const angle_t thingrollangle = (spr->mobj->rollangle - spr->mobj->temprollangle);
if (thingrollangle || sliptideroll)
if (spr->mobj->rollangle || sliptideroll)
{
angle_t rollang = sliptideroll ? (thingrollangle + (sliptideroll * spr->mobj->player->kartstuff[k_aizdriftstrat])) : thingrollangle;
angle_t rollang = sliptideroll
? (spr->mobj->rollangle) + (sliptideroll * spr->mobj->player->kartstuff[k_aizdriftstrat])
: (spr->mobj->rollangle);
rollang *= flipfactor;
+4 -3
View File
@@ -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;
+7 -7
View File
@@ -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
View File
@@ -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" \
+549
View File
@@ -0,0 +1,549 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
// Copyright (C) 1998-2000 by DooM Legacy Team.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
//-----------------------------------------------------------------------------
/// \file
/// \brief Windows specific part of the OpenGL API for Doom Legacy
///
/// TODO:
/// - check if windowed mode works
/// - support different pixel formats
#if defined (_WIN32)
//#define WIN32_LEAN_AND_MEAN
#define RPC_NO_WINDOWS_H
#include <windows.h>
#include <time.h>
#include "r_opengl.h"
// **************************************************************************
// GLOBALS
// **************************************************************************
#ifdef DEBUG_TO_FILE
static unsigned long nb_frames = 0;
static clock_t my_clock;
FILE *gllogstream;
#endif
static HDC hDC = NULL; // the window's device context
static HGLRC hGLRC = NULL; // the OpenGL rendering context
static HWND hWnd = NULL;
static BOOL WasFullScreen = FALSE;
static void UnSetRes(void);
#ifdef USE_WGL_SWAP
PFNWGLEXTSWAPCONTROLPROC wglSwapIntervalEXT = NULL;
#endif
PFNglClear pglClear;
PFNglGetIntegerv pglGetIntegerv;
PFNglGetString pglGetString;
#define MAX_VIDEO_MODES 32
static vmode_t video_modes[MAX_VIDEO_MODES];
INT32 oglflags = 0;
// **************************************************************************
// FUNCTIONS
// **************************************************************************
// -----------------+
// APIENTRY DllMain : DLL Entry Point,
// : open/close debug log
// Returns :
// -----------------+
BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved) // reserved
{
// Perform actions based on the reason for calling.
UNREFERENCED_PARAMETER(lpvReserved);
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// Initialize once for each new process.
// Return FALSE to fail DLL load.
#ifdef DEBUG_TO_FILE
gllogstream = fopen("ogllog.txt", "wt");
if (gllogstream == NULL)
return FALSE;
#endif
DisableThreadLibraryCalls(hinstDLL);
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
// Perform any necessary cleanup.
#ifdef DEBUG_TO_FILE
if (gllogstream)
{
fclose(gllogstream);
gllogstream = NULL;
}
#endif
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
#ifdef STATIC_OPENGL
#define pwglGetProcAddress wglGetProcAddress;
#define pwglCreateContext wglCreateContext;
#define pwglDeleteContext wglDeleteContext;
#define pwglMakeCurrent wglMakeCurrent;
#else
static HMODULE OGL32;
typedef void *(WINAPI *PFNwglGetProcAddress) (const char *);
static PFNwglGetProcAddress pwglGetProcAddress;
typedef HGLRC (WINAPI *PFNwglCreateContext) (HDC hdc);
static PFNwglCreateContext pwglCreateContext;
typedef BOOL (WINAPI *PFNwglDeleteContext) (HGLRC hglrc);
static PFNwglDeleteContext pwglDeleteContext;
typedef BOOL (WINAPI *PFNwglMakeCurrent) (HDC hdc, HGLRC hglrc);
static PFNwglMakeCurrent pwglMakeCurrent;
#endif
#ifndef STATIC_OPENGL
void *GetGLFunc(const char *proc)
{
void *func = NULL;
if (pwglGetProcAddress)
func = pwglGetProcAddress(proc);
if (!func)
func = GetProcAddress(OGL32, proc);
return func;
}
#endif
boolean LoadGL(void)
{
#ifndef STATIC_OPENGL
OGL32 = LoadLibrary("OPENGL32.DLL");
if (!OGL32)
return 0;
pwglGetProcAddress = GetGLFunc("wglGetProcAddress");
pwglCreateContext = GetGLFunc("wglCreateContext");
pwglDeleteContext = GetGLFunc("wglDeleteContext");
pwglMakeCurrent = GetGLFunc("wglMakeCurrent");
#endif
return SetupGLfunc();
}
// -----------------+
// SetupPixelFormat : Set the device context's pixel format
// Note : Because we currently use only the desktop's BPP format, all the
// : video modes in Doom Legacy OpenGL are of the same BPP, thus the
// : PixelFormat is set only once.
// : Setting the pixel format more than once on the same window
// : doesn't work. (ultimately for different pixel formats, we
// : should close the window, and re-create it)
// -----------------+
int SetupPixelFormat(INT32 WantColorBits, INT32 WantStencilBits, INT32 WantDepthBits)
{
static DWORD iLastPFD = 0;
INT32 nPixelFormat;
PIXELFORMATDESCRIPTOR pfd =
{
sizeof (PIXELFORMATDESCRIPTOR), // size
1, // version
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA, // color type
32 /*WantColorBits*/, // cColorBits : prefered color depth
0, 0, // cRedBits, cRedShift
0, 0, // cGreenBits, cGreenShift
0, 0, // cBlueBits, cBlueShift
0, 0, // cAlphaBits, cAlphaShift
0, // cAccumBits
0, 0, 0, 0, // cAccum Red/Green/Blue/Alpha Bits
0, // cDepthBits (0,16,24,32)
0, // cStencilBits
0, // cAuxBuffers
PFD_MAIN_PLANE, // iLayerType
0, // reserved, must be zero
0, 0, 0, // dwLayerMask, dwVisibleMask, dwDamageMask
};
DWORD iPFD = (WantColorBits<<16) | (WantStencilBits<<8) | WantDepthBits;
pfd.cDepthBits = (BYTE)WantDepthBits;
pfd.cStencilBits = (BYTE)WantStencilBits;
if (iLastPFD)
{
DBG_Printf("WARNING : SetPixelFormat() called twise not supported by all drivers !\n");
}
// set the pixel format only if different than the current
if (iPFD == iLastPFD)
return 2;
else
iLastPFD = iPFD;
DBG_Printf("SetupPixelFormat() - %d ColorBits - %d StencilBits - %d DepthBits\n",
WantColorBits, WantStencilBits, WantDepthBits);
nPixelFormat = ChoosePixelFormat(hDC, &pfd);
if (nPixelFormat == 0)
DBG_Printf("ChoosePixelFormat() FAILED\n");
if (SetPixelFormat(hDC, nPixelFormat, &pfd) == 0)
{
DBG_Printf("SetPixelFormat() FAILED\n");
return 0;
}
return 1;
}
// -----------------+
// SetRes : Set a display mode
// Notes : pcurrentmode is actually not used
// -----------------+
static INT32 WINAPI SetRes(viddef_t *lvid, vmode_t *pcurrentmode)
{
LPCSTR renderer;
BOOL WantFullScreen = !(lvid->u.windowed); //(lvid->u.windowed ? 0 : CDS_FULLSCREEN);
UNREFERENCED_PARAMETER(pcurrentmode);
DBG_Printf ("SetMode(): %dx%d %d bits (%s)\n",
lvid->width, lvid->height, lvid->bpp*8,
WantFullScreen ? "fullscreen" : "windowed");
hWnd = lvid->WndParent;
// BP : why flush texture ?
// if important flush also the first one (white texture) and restore it !
Flush(); // Flush textures.
// TODO: if not fullscreen, skip display stuff and just resize viewport stuff ...
// Exit previous mode
//if (hGLRC) //Hurdler: TODO: check if this is valid
// UnSetRes();
if (WasFullScreen)
ChangeDisplaySettings(NULL, CDS_FULLSCREEN); //switch in and out of fullscreen
// Change display settings.
if (WantFullScreen)
{
DEVMODE dm;
ZeroMemory(&dm, sizeof (dm));
dm.dmSize = sizeof (dm);
dm.dmPelsWidth = lvid->width;
dm.dmPelsHeight = lvid->height;
dm.dmBitsPerPel = lvid->bpp*8;
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;
if (ChangeDisplaySettings(&dm, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
return -2;
if (ChangeDisplaySettings(&dm, CDS_FULLSCREEN) !=DISP_CHANGE_SUCCESSFUL)
return -3;
SetWindowLong(hWnd, GWL_STYLE, WS_POPUP|WS_VISIBLE);
// faB : book says to put these, surely for windowed mode
//WS_CLIPCHILDREN|WS_CLIPSIBLINGS);
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, lvid->width, lvid->height, SWP_NOACTIVATE|SWP_NOZORDER);
}
else
{
RECT bounds;
INT32 x, y;
INT32 w = lvid->width, h = lvid->height;
GetWindowRect(hWnd, &bounds);
bounds.right = bounds.left+w;
bounds.bottom = bounds.top+h;
AdjustWindowRectEx(&bounds, GetWindowLong(hWnd, GWL_STYLE), (GetMenu(hWnd) != NULL), 0);
w = bounds.right-bounds.left;
h = bounds.bottom-bounds.top;
x = (GetSystemMetrics(SM_CXSCREEN)-w)/2;
y = (GetSystemMetrics(SM_CYSCREEN)-h)/2;
SetWindowPos(hWnd, NULL, x, y, w, h, SWP_NOACTIVATE|SWP_NOZORDER);
}
if (!hDC)
hDC = GetDC(hWnd);
if (!hDC)
{
DBG_Printf("GetDC() FAILED\n");
return 0;
}
{
INT32 res;
// Set res.
res = SetupPixelFormat(lvid->bpp*8, 0, 16);
if (res == 0)
return 0;
else if (res == 1)
{
// Exit previous mode
if (hGLRC)
UnSetRes();
hGLRC = pwglCreateContext(hDC);
if (!hGLRC)
{
DBG_Printf("pwglCreateContext() FAILED\n");
return 0;
}
if (!pwglMakeCurrent(hDC, hGLRC))
{
DBG_Printf("wglMakeCurrent() FAILED\n");
return 0;
}
}
}
gl_extensions = pglGetString(GL_EXTENSIONS);
// Get info and extensions.
//BP: why don't we make it earlier ?
//Hurdler: we cannot do that before intialising gl context
renderer = (LPCSTR)pglGetString(GL_RENDERER);
DBG_Printf("Vendor : %s\n", pglGetString(GL_VENDOR));
DBG_Printf("Renderer : %s\n", renderer);
DBG_Printf("Version : %s\n", pglGetString(GL_VERSION));
DBG_Printf("Extensions : %s\n", gl_extensions);
// BP: disable advenced feature that don't work on somes hardware
// Hurdler: Now works on G400 with bios 1.6 and certified drivers 6.04
if (strstr(renderer, "810")) oglflags |= GLF_NOZBUFREAD;
DBG_Printf("oglflags : 0x%X\n", oglflags);
#ifdef USE_WGL_SWAP
if (isExtAvailable("WGL_EXT_swap_control",gl_extensions))
wglSwapIntervalEXT = GetGLFunc("wglSwapIntervalEXT");
else
wglSwapIntervalEXT = NULL;
#endif
if (isExtAvailable("GL_EXT_texture_filter_anisotropic",gl_extensions))
pglGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maximumAnisotropy);
else
maximumAnisotropy = 0;
SetupGLFunc13();
screen_depth = (GLbyte)(lvid->bpp*8);
if (screen_depth > 16)
textureformatGL = GL_RGBA;
else
textureformatGL = GL_RGB5_A1;
GL_SetModelView(lvid->width, lvid->height);
GL_SetStates();
// we need to clear the depth buffer. Very important!!!
pglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
lvid->buffer = NULL; // unless we use the software view
lvid->direct = NULL; // direct access to video memory, old DOS crap
WasFullScreen = WantFullScreen;
return 1; // on renvoie une valeur pour dire que cela s'est bien pass�
}
// -----------------+
// UnSetRes : Restore the original display mode
// -----------------+
static void UnSetRes(void)
{
DBG_Printf("UnSetRes()\n");
pwglMakeCurrent(hDC, NULL);
pwglDeleteContext(hGLRC);
hGLRC = NULL;
if (WasFullScreen)
ChangeDisplaySettings(NULL, CDS_FULLSCREEN);
}
// -----------------+
// GetModeList : Return the list of available display modes.
// Returns : pvidmodes - points to list of detected OpenGL video modes
// : numvidmodes - number of detected OpenGL video modes
// -----------------+
EXPORT void HWRAPI(GetModeList) (vmode_t** pvidmodes, INT32 *numvidmodes)
{
INT32 i;
#if 1
INT32 iMode;
/*
faB test code
Commented out because there might be a problem with combo (Voodoo2 + other card),
we need to get the 3D card's display modes only.
*/
(*pvidmodes) = &video_modes[0];
// Get list of device modes
for (i = 0,iMode = 0; iMode < MAX_VIDEO_MODES; i++)
{
DEVMODE Tmp;
ZeroMemory(&Tmp, sizeof (Tmp));
Tmp.dmSize = sizeof (Tmp);
if (!EnumDisplaySettings(NULL, i, &Tmp))
break;
// add video mode
if (Tmp.dmBitsPerPel == 16 &&
(iMode == 0 || !
(Tmp.dmPelsWidth == video_modes[iMode-1].width &&
Tmp.dmPelsHeight == video_modes[iMode-1].height)
)
)
{
video_modes[iMode].pnext = &video_modes[iMode+1];
video_modes[iMode].windowed = 0; // fullscreen is the default
video_modes[iMode].misc = 0;
video_modes[iMode].name = malloc(12 * sizeof (CHAR));
sprintf(video_modes[iMode].name, "%dx%d", (INT32)Tmp.dmPelsWidth, (INT32)Tmp.dmPelsHeight);
DBG_Printf ("Mode: %s\n", video_modes[iMode].name);
video_modes[iMode].width = Tmp.dmPelsWidth;
video_modes[iMode].height = Tmp.dmPelsHeight;
video_modes[iMode].bytesperpixel = Tmp.dmBitsPerPel/8;
video_modes[iMode].rowbytes = Tmp.dmPelsWidth * video_modes[iMode].bytesperpixel;
video_modes[iMode].pextradata = NULL;
video_modes[iMode].setmode = SetRes;
iMode++;
}
}
(*numvidmodes) = iMode;
#else
// classic video modes (fullscreen/windowed)
// Added some. Tails
INT32 res[][2] = {
{ 320, 200},
{ 320, 240},
{ 400, 300},
{ 512, 384},
{ 640, 400},
{ 640, 480},
{ 800, 600},
{ 960, 600},
{1024, 768},
{1152, 864},
{1280, 800},
{1280, 960},
{1280,1024},
{1600,1000},
{1680,1050},
{1920,1200},
};
HDC bpphdc;
INT32 iBitsPerPel;
DBG_Printf ("HWRAPI GetModeList()\n");
bpphdc = GetDC(NULL); // on obtient le bpp actuel
iBitsPerPel = GetDeviceCaps(bpphdc, BITSPIXEL);
ReleaseDC(NULL, bpphdc);
(*pvidmodes) = &video_modes[0];
(*numvidmodes) = sizeof (res) / sizeof (res[0]);
for (i = 0; i < (*numvidmodes); i++)
{
video_modes[i].pnext = &video_modes[i+1];
video_modes[i].windowed = 0; // fullscreen is the default
video_modes[i].misc = 0;
video_modes[i].name = malloc(12 * sizeof (CHAR));
sprintf(video_modes[i].name, "%dx%d", res[i][0], res[i][1]);
DBG_Printf ("Mode: %s\n", video_modes[i].name);
video_modes[i].width = res[i][0];
video_modes[i].height = res[i][1];
video_modes[i].bytesperpixel = iBitsPerPel/8;
video_modes[i].rowbytes = res[i][0] * video_modes[i].bytesperpixel;
video_modes[i].pextradata = NULL;
video_modes[i].setmode = SetRes;
}
#endif
video_modes[(*numvidmodes)-1].pnext = NULL;
}
// -----------------+
// Shutdown : Shutdown OpenGL, restore the display mode
// -----------------+
EXPORT void HWRAPI(Shutdown) (void)
{
#ifdef DEBUG_TO_FILE
long nb_centiemes;
DBG_Printf ("HWRAPI Shutdown()\n");
nb_centiemes = ((clock()-my_clock)*100)/CLOCKS_PER_SEC;
DBG_Printf("Nb frames: %li; Nb sec: %2.2f -> %2.1f fps\n",
nb_frames, nb_centiemes/100.0f, (100*nb_frames)/(double)nb_centiemes);
#endif
Flush();
// Exit previous mode
if (hGLRC)
UnSetRes();
if (hDC)
{
ReleaseDC(hWnd, hDC);
hDC = NULL;
}
FreeLibrary(OGL32);
DBG_Printf ("HWRAPI Shutdown(DONE)\n");
}
// -----------------+
// FinishUpdate : Swap front and back buffers
// -----------------+
void GL_FinishUpdate (INT32 waitvbl)
{
#ifdef USE_WGL_SWAP
static INT32 oldwaitvbl = 0;
#else
UNREFERENCED_PARAMETER(waitvbl);
#endif
// DBG_Printf ("FinishUpdate()\n");
#ifdef DEBUG_TO_FILE
if ((++nb_frames)==2) // on ne commence pas � la premi�re frame
my_clock = clock();
#endif
#ifdef USE_WGL_SWAP
if (oldwaitvbl != waitvbl && wglSwapIntervalEXT)
wglSwapIntervalEXT(waitvbl);
oldwaitvbl = waitvbl;
#endif
SwapBuffers(hDC);
}
#endif
+35 -68
View File
@@ -776,15 +776,15 @@ static int GLFramebuffer_CheckExt(void)
// gl versions from 2.1 may still support framebuffer objects
// maybe, just maybe, we support the standart extensions
if (GL_isExtAvailable("GL_ARB_framebuffer_no_attachments", gl_extensions) &&
GL_isExtAvailable("GL_ARB_framebuffer_object", gl_extensions) &&
GL_isExtAvailable("GL_ARB_framebuffer_sRGB", gl_extensions))
if (GL_isExtAvailable("GL_ARB_framebuffer_no_attachments", gl_extensions)
&& GL_isExtAvailable("GL_ARB_framebuffer_object", gl_extensions)
&& GL_isExtAvailable("GL_ARB_framebuffer_sRGB", gl_extensions))
return FBO_ARB;
// nope, try the older 2.1 extensions
if (GL_isExtAvailable("GL_EXT_framebuffer_no_attachments", gl_extensions) &&
GL_isExtAvailable("GL_EXT_framebuffer_object", gl_extensions) &&
GL_isExtAvailable("GL_EXT_framebuffer_sRGB", gl_extensions))
if (GL_isExtAvailable("GL_EXT_framebuffer_no_attachments", gl_extensions)
&& GL_isExtAvailable("GL_EXT_framebuffer_object", gl_extensions)
&& GL_isExtAvailable("GL_EXT_framebuffer_sRGB", gl_extensions))
{
// perhaps we may even support a stencil attachment
if (GL_isExtAvailable("GL_EXT_packed_depth_stencil", gl_extensions))
@@ -885,7 +885,7 @@ void SetupGLFunc4(void)
{ \
GL_MSG_Warning("failed to get OpenGL FBO function: %s\n", #func); \
GL_DBG_Printf("\nFBO: No framebuffer object support\n"); \
supportFBO = FBO_NONE; \
supportFBO = false; \
return; \
} \
@@ -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
// -----------------+
@@ -1465,19 +1448,6 @@ void GL_ReadScreenTexture(int tex, UINT8 *restrict dest, INT32 scale)
if (tex != HWD_SCREENTEXTURE_GENERIC2)
GL_DrawScreenTexture(tex, NULL, 0);
#ifdef USE_FBO_OGL
// FIXME: this is incredibly stupid
// but the final screen texture will NOT be drawn in the downsample fbo
if (tex == HWD_SCREENTEXTURE_GENERIC2 &&
UseScreenFBO() && HWR_ShouldUsePaletteRendering())
{
GL_SetShader(HWR_GetShaderFromTarget(SHADER_PALETTE_POSTPROCESS));
GL_EnableShader();
GL_DrawScreenTexture(HWD_SCREENTEXTURE_GENERIC2, NULL, 0);
GL_UnSetShader();
}
#endif
image = malloc(screen_width*screen_height*3);
pglPixelStorei(GL_PACK_ALIGNMENT, 1);
pglReadPixels(0, 0, screen_width, screen_height, GL_RGB, GL_UNSIGNED_BYTE, image);
@@ -1596,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;
@@ -1711,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))
{
@@ -2503,7 +2472,7 @@ void GL_RenderSkyDome(gl_sky_t *sky)
GL_Shader_SetUniforms(NULL, NULL, NULL, NULL);
// Build the sky dome! Yes!
if (sky->rebuild || !sky->vbo)
if (sky->rebuild)
{
// delete VBO when already exists
if (sky->vbo)
@@ -2928,7 +2897,7 @@ void GL_CreateModelVBOs(model_t *model)
}
}
#define BUFFER_OFFSET(i) ((void*)(i))
#define BUFFER_OFFSET(i) ((char*)(i))
void GL_DrawModelEx(model_t *model, INT32 frameIndex, float duration, float tics, INT32 nextFrameIndex, FTransform *pos, float hscale, float vscale, UINT8 flipped, UINT8 hflipped, FSurfaceInfo *Surface)
{
@@ -3221,8 +3190,8 @@ void GL_SetTransform(FTransform *stransform)
{
float dy = stransform->viewaiming * 2;
if (stransform->fliptype == TRANSFORM_FLIP ||
stransform->fliptype == TRANSFORM_MIRRORFLIP)
if (stransform->fliptype == TRANSFORM_FLIP
|| stransform->fliptype == TRANSFORM_MIRRORFLIP)
dy *= -1.0f;
pglTranslatef(0.0f, -dy/BASEVIDHEIGHT, 0.0f);
@@ -3247,7 +3216,7 @@ void GL_SetTransform(FTransform *stransform)
#ifdef USE_FBO_OGL
static void GL_Framebuffer_DeleteAttachments(void)
{
if (supportFBO == FBO_NONE || !framebufferobject.init)
if (!supportFBO || !framebufferobject.init)
return;
// Unbind the framebuffer
@@ -3267,13 +3236,21 @@ static void GL_Framebuffer_DeleteAttachments(void)
static void GL_Framebuffer_Generate(void)
{
if (supportFBO == FBO_NONE || framebufferobject.init || !UseScreenFBO())
if (!supportFBO || framebufferobject.init || !UseScreenFBO())
return;
// Generate the framebuffer
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);
@@ -3287,10 +3264,10 @@ static void GL_Framebuffer_Generate(void)
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
Clamp2D(GL_TEXTURE_WRAP_S);
Clamp2D(GL_TEXTURE_WRAP_T);
pglBindTexture(GL_TEXTURE_2D, 0);
// Attach the framebuffer texture to the framebuffer
pglFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, framebufferobject.tex, 0);
pglBindTexture(GL_TEXTURE_2D, 0);
}
// Generate the renderbuffer
@@ -3325,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 = FBO_NONE;
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
return;
}
// Unbind the framebuffer
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
@@ -3345,7 +3310,7 @@ static void GL_Framebuffer_Generate(void)
void GL_Framebuffer_Unbind(void)
{
if (supportFBO == FBO_NONE || !framebufferobject.init)
if (!supportFBO || !framebufferobject.init)
return;
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
@@ -3354,22 +3319,18 @@ void GL_Framebuffer_Unbind(void)
void GL_Framebuffer_Enable(void)
{
if (supportFBO == FBO_NONE || !UseScreenFBO())
if (!supportFBO || !UseScreenFBO())
return;
GL_Framebuffer_Generate();
// failed
if (supportFBO == FBO_NONE || !framebufferobject.init)
return;
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj);
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, framebufferobject.rboobj);
}
void GL_Framebuffer_Disable(void)
{
if (supportFBO == FBO_NONE || !framebufferobject.init)
if (!supportFBO || !framebufferobject.init)
return;
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
@@ -3757,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;
@@ -3810,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);
@@ -3817,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];
}
+79
View File
@@ -0,0 +1,79 @@
[Project]
FileName=r_opengl.dev
Name=r_opengl
Ver=1
IsCpp=1
Type=3
Compiler=-D_M_IX86=500_@@_-Wall_@@_-D_WINDOWS_@@_-DUSE_WGL_SWAP_@@_-Os_@@_-fomit-frame-pointer_@@_
CppCompiler=
Includes=
Linker=--def ../r_mingw.def_@@_-lgdi32_@@_
Libs=
UnitCount=3
Folders=
ObjFiles=
PrivateResource=
ResourceIncludes=
MakeIncludes=
Icon=
ExeOutput=C:\srb2demo2
ObjectOutput=..\..\..\objs\Mingw\r_opengl
OverrideOutput=1
OverrideOutputName=r_opengl.dll
HostApplication=
CommandLine=
IncludeVersionInfo=0
SupportXPThemes=0
CompilerSet=0
CompilerSettings=00000000000000000111d0
UseCustomMakefile=0
CustomMakefile=
[Unit1]
FileName=ogl_win.c
Folder=
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit2]
FileName=r_opengl.c
Folder=
Compile=1
CompileCpp=0
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit3]
FileName=r_opengl.h
Folder=
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[VersionInfo]
Major=0
Minor=1
Release=1
Build=1
LanguageID=1033
CharsetID=1252
CompanyName=
FileVersion=0.1
FileDescription=Developed using the Dev-C++ IDE
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=r_opengl.exe
ProductName=r_opengl
ProductVersion=0.1
AutoIncBuildNr=0
+105
View File
@@ -0,0 +1,105 @@
# Microsoft Developer Studio Project File - Name="r_opengl" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=r_opengl - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "r_opengl.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "r_opengl.mak" CFG="r_opengl - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "r_opengl - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "r_opengl - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "r_opengl - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "r_opengl___Win32_Release"
# PROP BASE Intermediate_Dir "r_opengl___Win32_Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "..\..\..\bin\VC\Release\r_opengl"
# PROP Intermediate_Dir "..\..\..\objs\VC\Release\r_opengl"
# PROP Ignore_Export_Lib 1
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "R_OPENGL_EXPORTS" /YX /FD /c
# ADD CPP /nologo /G5 /W3 /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "__WIN32__" /D "__MSC__" /D "USE_WGL_SWAP" /FR /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x80c /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 user32.lib gdi32.lib /nologo /dll /pdb:"..\..\..\bin\VC\Release\r_opengl.pdb" /machine:I386 /out:"C:\srb2demo2\r_opengl.dll"
# SUBTRACT LINK32 /pdb:none /debug
!ELSEIF "$(CFG)" == "r_opengl - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "..\..\..\objs\Debug"
# PROP BASE Intermediate_Dir "..\..\..\objs\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "..\..\..\bin\VC\Debug\r_opengl"
# PROP Intermediate_Dir "..\..\..\objs\VC\Debug\r_opengl"
# PROP Ignore_Export_Lib 1
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "R_OPENGL_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /G6 /W4 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "__WIN32__" /D "__MSC__" /D "USE_WGL_SWAP" /FR /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x80c /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 user32.lib gdi32.lib /nologo /dll /pdb:"..\..\..\bin\VC\Debug\r_opengl.pdb" /debug /machine:I386 /out:"C:\srb2demo2\r_opengld.dll" /pdbtype:sept
# SUBTRACT LINK32 /pdb:none
!ENDIF
# Begin Target
# Name "r_opengl - Win32 Release"
# Name "r_opengl - Win32 Debug"
# Begin Source File
SOURCE=.\ogl_win.c
# End Source File
# Begin Source File
SOURCE=.\r_opengl.c
# End Source File
# Begin Source File
SOURCE=.\r_opengl.h
# End Source File
# End Target
# End Project
+215 -163
View File
@@ -115,12 +115,154 @@ 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};
// stuff from SRB2-Banpyura thx alot! :3
consvar_t cv_chat_xoffset = {"chat_xoffset", "0", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_chat_yoffset = {"chat_yoffset", "0", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_chat_showlimit = {"chat_showlimit", "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;
@@ -138,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)
@@ -266,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;
@@ -293,6 +435,11 @@ void HU_Start(void)
headsupactive = true;
}
void HU_Shiftform(void)
{
shiftxform = (cv_keyboardlayout.value == 3) ? french_shiftxform : english_shiftxform;
}
//======================================================================
// EXECUTION
//======================================================================
@@ -971,7 +1118,7 @@ void HU_Ticker(void)
size_t i = 0;
// handle spam while we're at it:
for (; (i < MAXPLAYERS); i++)
for(; (i < MAXPLAYERS); i++)
{
if (stop_spamming[i] > 0)
stop_spamming[i]--;
@@ -987,8 +1134,7 @@ void HU_Ticker(void)
}
}
if (cechotimer > 0)
--cechotimer;
if (cechotimer > 0) --cechotimer;
// Animate the desynch dots
if (hu_resynching
@@ -1030,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)
@@ -1099,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);
@@ -1140,7 +1265,6 @@ static void HU_SendChatMessage(void)
return;
}
}
// I'm very bad at C, I swear I am, additional checks eww!
if (spc != 0)
{
@@ -1287,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;
@@ -1375,12 +1497,7 @@ static char *CHAT_WordWrap(INT32 x, INT32 w, INT32 option, const char *string)
// 30/7/18: chaty is now the distance at which the lowest point of the chat will be drawn if that makes any sense.
// let's use this as our coordinates, shh
// :chao: guess this just works lol
#define chatx ((INT16)(13 + (cv_chat_xoffset.value)))
#define chaty ((INT16)(169 + (cv_chat_yoffset.value)))
#define CHATSNAP (V_SNAPTOBOTTOM|V_SNAPTOLEFT)
INT16 chatx = 13, chaty = 169; // let's use this as our coordinates, shh
// chat stuff by VincyTM LOL XD!
@@ -1407,7 +1524,7 @@ static void HU_drawMiniChat(void)
for (; i > 0; i--)
{
char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), CHATSNAP|V_ALLOWLOWERCASE, chat_mini[i-1]);
char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_mini[i-1]);
size_t j = 0;
INT32 linescount = 0;
emote_t *emote = NULL;
@@ -1464,14 +1581,15 @@ static void HU_drawMiniChat(void)
y = chaty - charheight*(msglines+1);
#ifdef NETSPLITSCREEN
if (splitscreen)
{
y -= BASEVIDHEIGHT/2;
if (splitscreen > 1)
y += 16;
}
else
#endif
y -= (cv_kartspeedometer.value ? 16 : 0);
dx = 0;
@@ -1485,7 +1603,7 @@ static void HU_drawMiniChat(void)
INT32 timer = ((cv_chattime.value*TICRATE)-chat_timers[i]) - cv_chattime.value*TICRATE+9; // see below...
INT32 transflag = (timer >= 0 && timer <= 9) ? (timer*V_10TRANS) : 0; // you can make bad jokes out of this one.
size_t j = 0;
char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), CHATSNAP|V_ALLOWLOWERCASE, chat_mini[i]); // get the current message, and word wrap it.
char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_mini[i]); // get the current message, and word wrap it.
UINT8 *colormap = NULL;
emote_t *emote = NULL;
int emotelen = 0;
@@ -1518,9 +1636,9 @@ static void HU_drawMiniChat(void)
else if ((emote = M_VerifyEmote(msg+j, &emotelen)))
{
if (cv_chatbacktint.value) // on request of wolfy
V_DrawFillConsoleMap(x + dx + 2, y+dy, EMOTEWIDTH, charheight, 239|CHATSNAP);
V_DrawFillConsoleMap(x + dx + 2, y+dy, EMOTEWIDTH, charheight, 239|V_SNAPTOBOTTOM|V_SNAPTOLEFT);
M_DrawEmote(x+dx+2, y+dy, emote, CHATSNAP|transflag);
M_DrawEmote(x+dx+2, y+dy, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT|transflag);
dx += EMOTEWIDTH - charwidth;
j += emotelen;
@@ -1528,9 +1646,9 @@ static void HU_drawMiniChat(void)
else
{
if (cv_chatbacktint.value) // on request of wolfy
V_DrawFillConsoleMap(x + dx + 2, y+dy, charwidth, charheight, 239|CHATSNAP);
V_DrawFillConsoleMap(x + dx + 2, y+dy, charwidth, charheight, 239|V_SNAPTOBOTTOM|V_SNAPTOLEFT);
V_DrawChatCharacter(x + dx + 2, y+dy+cv_chatcentertext.value, msg[j++] |CHATSNAP|transflag, !cv_allcaps.value, colormap);
V_DrawChatCharacter(x + dx + 2, y+dy+cv_chatcentertext.value, msg[j++] |V_SNAPTOBOTTOM|V_SNAPTOLEFT|transflag, !cv_allcaps.value, colormap);
}
dx += charwidth;
@@ -1569,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;
@@ -1585,19 +1706,20 @@ static void HU_drawChatLog(INT32 offset)
y += 16;
}
else
#endif
y -= (cv_kartspeedometer.value ? 16 : 0);
chat_topy = y + chat_scroll*charheight;
chat_bottomy = chat_topy + boxh*charheight;
V_DrawFillConsoleMap(chatx, chat_topy, boxw, boxh*charheight +2, 239|CHATSNAP); // log box
V_DrawFillConsoleMap(chatx, chat_topy, boxw, boxh*charheight +2, 239|V_SNAPTOBOTTOM|V_SNAPTOLEFT); // log box
for (i = 0; i < chat_nummsg_log; i++) // iterate through our chatlog
{
INT32 clrflag = 0;
INT32 j = 0;
char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), CHATSNAP|V_ALLOWLOWERCASE, chat_log[i]); // get the current message, and word wrap it.
char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_log[i]); // get the current message, and word wrap it.
UINT8 *colormap = NULL;
emote_t *emote = NULL;
int emotelen = 0;
@@ -1627,7 +1749,7 @@ static void HU_drawChatLog(INT32 offset)
{
if ((y+dy+2 >= chat_topy) && (y+dy < (chat_bottomy)))
{
M_DrawEmote(x+dx+2, y+dy+1, emote, CHATSNAP);
M_DrawEmote(x+dx+2, y+dy+1, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
dx += EMOTEWIDTH - charwidth;
}
j += emotelen;
@@ -1635,7 +1757,7 @@ static void HU_drawChatLog(INT32 offset)
else
{
if ((y+dy+2 >= chat_topy) && (y+dy < (chat_bottomy)))
V_DrawChatCharacter(x + dx + 2, y+dy+2, msg[j++] |CHATSNAP, !cv_allcaps.value, colormap);
V_DrawChatCharacter(x + dx + 2, y+dy+2, msg[j++] |V_SNAPTOBOTTOM|V_SNAPTOLEFT, !cv_allcaps.value, colormap);
else
j++; // don't forget to increment this or we'll get stuck in the limbo.
}
@@ -1672,9 +1794,9 @@ static void HU_drawChatLog(INT32 offset)
// draw arrows to indicate that we can (or not) scroll.
if (chat_scroll > 0)
V_DrawCharacter(chatx-9, ((justscrolledup) ? (chat_topy-1) : (chat_topy)), CHATSNAP | highlight | '\x1A', false); // up arrow
V_DrawCharacter(chatx-9, ((justscrolledup) ? (chat_topy-1) : (chat_topy)), V_SNAPTOBOTTOM | V_SNAPTOLEFT | highlight | '\x1A', false); // up arrow
if (chat_scroll < chat_maxscroll)
V_DrawCharacter(chatx-9, chat_bottomy-((justscrolleddown) ? 5 : 6), CHATSNAP | highlight | '\x1B', false); // down arrow
V_DrawCharacter(chatx-9, chat_bottomy-((justscrolleddown) ? 5 : 6), V_SNAPTOBOTTOM | V_SNAPTOLEFT | highlight | '\x1B', false); // down arrow
justscrolleddown = false;
justscrolledup = false;
@@ -1692,7 +1814,6 @@ static void HU_DrawChat(void)
INT32 boxw = cv_chatwidth.value;
INT32 t = 0, c = 0, y = chaty - (typelines*charheight);
UINT32 i = 0, saylen = strlen(w_chat_buf); // You learn new things everyday!
UINT32 charcount = 0;
INT32 cflag = 0;
INT32 pm_offset = 0; // for cases when you type emote while also doing /pm
size_t select_start = 0, select_end = 0;
@@ -1700,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;
@@ -1710,6 +1832,7 @@ static void HU_DrawChat(void)
}
}
else
#endif
y -= (cv_kartspeedometer.value ? 16 : 0);
if (teamtalk)
@@ -1724,7 +1847,7 @@ static void HU_DrawChat(void)
cflag = V_GRAYMAP; // set text in gray if chat is muted.
}
V_DrawFillConsoleMap(chatx, y-1, boxw, (typelines*charheight), 239 | CHATSNAP);
V_DrawFillConsoleMap(chatx, y-1, boxw, (typelines*charheight), 239 | V_SNAPTOBOTTOM | V_SNAPTOLEFT);
while (talk[i])
{
@@ -1732,7 +1855,7 @@ static void HU_DrawChat(void)
++i;
else
{
V_DrawChatCharacter(chatx + c + 2, y, talk[i] |CHATSNAP|cflag, !cv_allcaps.value, V_GetStringColormap(talk[i]|cflag));
V_DrawChatCharacter(chatx + c + 2, y, talk[i] |V_SNAPTOBOTTOM|V_SNAPTOLEFT|cflag, !cv_allcaps.value, V_GetStringColormap(talk[i]|cflag));
i++;
}
@@ -1750,7 +1873,7 @@ static void HU_DrawChat(void)
typelines = 1;
if ((w_chat.cursor == 0 || w_chat.length == 0) && hu_tick < 4)
V_DrawChatCharacter(chatx+2+c, y+1, '_'|CHATSNAP|t, !cv_allcaps.value, NULL);
V_DrawChatCharacter(chatx+2+c, y+1, '_'|V_SNAPTOBOTTOM|V_SNAPTOLEFT|t, !cv_allcaps.value, NULL);
if (w_chat.select != w_chat.cursor)
{
@@ -1767,23 +1890,17 @@ static void HU_DrawChat(void)
if ((emote = M_VerifyEmote(w_chat_buf+i, &emotelen)))
{
M_DrawEmote(chatx + c + 2, y-1, emote, CHATSNAP|t);
M_DrawEmote(chatx + c + 2, y-1, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT|t);
c += EMOTEWIDTH - charwidth;
i += emotelen-1;
drawwidth = EMOTEWIDTH;
if (cv_chat_showlimit.value)
charcount += emotelen;
}
else if (w_chat_buf[i] >= HU_FONTSTART) //Hurdler: isn't it better like that?
{
V_DrawChatCharacter(chatx + c + 2, y, w_chat_buf[i] | CHATSNAP | t, !cv_allcaps.value, NULL);
if (cv_chat_showlimit.value)
charcount++;
}
V_DrawChatCharacter(chatx + c + 2, y, w_chat_buf[i] | V_SNAPTOBOTTOM|V_SNAPTOLEFT | t, !cv_allcaps.value, NULL);
// Draw selection
if (i >= select_start && i < select_end)
V_DrawFill(chatx + c + 2 - (drawwidth-charwidth), y-1, drawwidth, charheight, 103|V_TRANSLUCENT|CHATSNAP|t);
V_DrawFill(chatx + c + 2 - (drawwidth-charwidth), y-1, drawwidth, charheight, 103|V_TRANSLUCENT|V_SNAPTOBOTTOM|V_SNAPTOLEFT|t);
++i;
@@ -1792,7 +1909,7 @@ static void HU_DrawChat(void)
INT32 cursorx = (c+charwidth < boxw-charwidth) ? (chatx + 2 + c+charwidth) : (chatx+1); // we may have to go down.
INT32 cursory = (cursorx != chatx+1) ? (y) : (y+charheight);
if (hu_tick < 4)
V_DrawChatCharacter(cursorx, cursory+1, '_' |CHATSNAP|t, !cv_allcaps.value, NULL);
V_DrawChatCharacter(cursorx, cursory+1, '_' |V_SNAPTOBOTTOM|V_SNAPTOLEFT|t, !cv_allcaps.value, NULL);
if (cursorx == chatx+1 && saylen == i-1) // a weirdo hack
{
@@ -1810,20 +1927,13 @@ static void HU_DrawChat(void)
}
}
if (cv_chat_showlimit.value)
{
// Limit
const INT32 clr = ((HU_MAXMSGLEN - charcount) > 64 ? V_TRANSLUCENT : (charcount == HU_MAXMSGLEN ? V_REDMAP : V_YELLOWMAP));
V_DrawSmallString(chatx, y+7, CHATSNAP|clr, va("%d/%d", charcount, HU_MAXMSGLEN));
}
// handle /pm list. It's messy, horrible and I don't care.
if (strnicmp(w_chat_buf, "/pm", 3) == 0 && vid.width >= 400 && !teamtalk) // 320x200 unsupported kthxbai
{
INT32 count = 0;
INT32 p_dispy = chaty - charheight - 1;
size_t longest_name_length = 0;
#ifdef NETSPLITSCREEN
if (splitscreen)
{
p_dispy -= BASEVIDHEIGHT/2;
@@ -1831,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]));
}
@@ -1852,7 +1962,6 @@ static void HU_DrawChat(void)
{
char nodenum[3];
UINT32 n;
// right, that's half important: (w_chat_buf[4] may be a space since /pm0 msg is perfectly acceptable!)
if (!isdigit(w_chat_buf[3]) || !(isdigit(w_chat_buf[4]) || (w_chat_buf[4] == ' ') || (w_chat_buf[4] == 0)))
break;
@@ -1890,17 +1999,17 @@ static void HU_DrawChat(void)
}
// fill it like the chat so the text doesn't become hard to read because of the hud.
V_DrawFillConsoleMap(chatx + boxw + 2, p_dispy - (6*count), (longest_name_length+4)*4, 6, 239 | CHATSNAP);
V_DrawFillConsoleMap(chatx + boxw + 2, p_dispy - (6*count), (longest_name_length+4)*4, 6, 239 | V_SNAPTOBOTTOM | V_SNAPTOLEFT);
V_DrawSmallString(chatx + boxw + 4, p_dispy - (6*count), CHATSNAP|V_ALLOWLOWERCASE, va("\x82%d\x80 - %s", i, player_names[i]));
V_DrawSmallString(chatx + boxw + 4, p_dispy - (6*count), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, va("\x82%d\x80 - %s", i, player_names[i]));
count++;
}
if (count == 0) // no results.
{
pm_offset = 48 + 2;
V_DrawFillConsoleMap(chatx + boxw + 2, p_dispy - (6*count), 48, 6, 239 | CHATSNAP); // fill it like the chat so the text doesn't become hard to read because of the hud.
V_DrawSmallString(chatx + boxw + 4, p_dispy - (6*count), CHATSNAP|V_ALLOWLOWERCASE, "NO RESULT.");
V_DrawFillConsoleMap(chatx + boxw + 2, p_dispy - (6*count), 48, 6, 239 | V_SNAPTOBOTTOM | V_SNAPTOLEFT); // fill it like the chat so the text doesn't become hard to read because of the hud.
V_DrawSmallString(chatx + boxw + 4, p_dispy - (6*count), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, "NO RESULT.");
}
else
{
@@ -1941,6 +2050,7 @@ static void HU_DrawChat(void)
skip = 0;
#ifdef NETSPLITSCREEN
if (splitscreen)
{
suggesty -= BASEVIDHEIGHT/2;
@@ -1948,19 +2058,20 @@ static void HU_DrawChat(void)
suggesty += 16;
}
else
#endif
suggesty -= (cv_kartspeedometer.value ? 16 : 0);
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
{
V_DrawFillConsoleMap(chatx + boxw + pm_offset + 2, suggesty - (7*skip), emote_suggest_boxw, 6, CHATSNAP);
V_DrawFillConsoleMap(chatx + boxw + pm_offset + 2, suggesty - (7*skip), emote_suggest_boxw, 6, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
// Highlight currently suggested emote
int hlflag = 0;
if (skip == emote_autocomplete.skip && emote_autocomplete.complete[0])
hlflag = V_YELLOWMAP;
V_DrawSmallString(chatx + boxw + pm_offset + 4 + EMOTEWIDTH, suggesty - (7*skip), hlflag|CHATSNAP|V_ALLOWLOWERCASE, va(":%s:", suggest->name));
M_DrawEmote(chatx + boxw + pm_offset + 2, suggesty - skip*7, suggest, CHATSNAP);
V_DrawSmallString(chatx + boxw + pm_offset + 4 + EMOTEWIDTH, suggesty - (7*skip), hlflag|V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, va(":%s:", suggest->name));
M_DrawEmote(chatx + boxw + pm_offset + 2, suggesty - skip*7, suggest, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
++skip;
}
@@ -1974,7 +2085,6 @@ static void HU_DrawChat(void)
static void HU_DrawChat_Old(void)
{
INT32 t = 0, c = 0, y = HU_INPUTY;
UINT32 charcount = 0;
size_t i = 0;
const char *ntalk = "Say: ", *ttalk = "Say-Team: ";
const char *talk = ntalk;
@@ -2020,17 +2130,11 @@ static void HU_DrawChat_Old(void)
{
M_DrawScaledEmote((HU_INPUTX + c)<<FRACBITS, (y+con_scalefactor*2)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART | V_NOSCALEPATCH | t);
i += emotelen-1;
if (cv_chat_showlimit.value)
charcount += emotelen;
}
else if (w_chat_buf[i] >= HU_FONTSTART) //Hurdler: isn't it better like that?
{
//charwidth = hu_font[w_chat[i]-HU_FONTSTART]->width * con_scalefactor;
V_DrawCharacter(HU_INPUTX + c, y, w_chat_buf[i] | cv_constextsize.value | V_NOSCALESTART | t, !cv_allcaps.value);
if (cv_chat_showlimit.value)
charcount++;
}
// Draw selection
@@ -2043,7 +2147,7 @@ static void HU_DrawChat_Old(void)
{
INT32 cursorx = (HU_INPUTX+c+charwidth < vid.width) ? (HU_INPUTX + c + charwidth) : (HU_INPUTX); // we may have to go down.
INT32 cursory = (cursorx != HU_INPUTX) ? (y) : (y+charheight);
V_DrawCharacter(cursorx, cursory+2*con_scalefactor, '_' | cv_constextsize.value | V_NOSCALESTART |t, !cv_allcaps.value);
V_DrawCharacter(cursorx, cursory+2*con_scalefactor, '_' |cv_constextsize.value | V_NOSCALESTART|t, !cv_allcaps.value);
}
c += charwidth;
@@ -2053,24 +2157,6 @@ static void HU_DrawChat_Old(void)
y += charheight;
}
}
// console chat users are FINALLY being fed!
if (cv_chat_showlimit.value)
{
const char *lim = va(" (%i/%i)", charcount, HU_MAXMSGLEN);
for (i = 0; lim[i]; i++)
{
V_DrawCharacter(HU_INPUTX + c, y, lim[i] | cv_constextsize.value | V_NOSCALESTART | t, !cv_allcaps.value);
c += charwidth;
if (c >= vid.width) // text wrapping
{
c = 0;
y += charheight;
}
}
}
}
static void HU_DrawCEcho(void)
@@ -2259,13 +2345,12 @@ static void HU_DrawSongCreditsBox(void)
y = -BOXCREDITHEIGHT*dup + (FixedMul(BOXCREDITHEIGHT*FRACUNIT, FixedDiv(t*FRACUNIT, TICRATE*FRACUNIT/2))*dup - interpoffset)/FRACUNIT;
}
bgt = (NUMTRANSMAPS/2) + (cursongcredit.trans/2) - 2; // arbitrary value, looks a bit better
bgt = (NUMTRANSMAPS/2) + (cursongcredit.trans/2);
if (bgt < NUMTRANSMAPS)
{
const UINT8 accent = colortranslations[K_GetHudColor()][7];
V_DrawFill(x, y, strwidth*dup, BOXCREDITHEIGHT*dup, accent|flags|(bgt<<V_ALPHASHIFT));
V_DrawFill(x+dup, y+dup, (strwidth-2)*dup, (BOXCREDITHEIGHT-2)*dup, accent|flags|(bgt<<V_ALPHASHIFT));
V_DrawFill(x, y, strwidth*dup, BOXCREDITHEIGHT*dup, 28|flags|(bgt<<V_ALPHASHIFT));
V_DrawFill(x+dup, y+dup, (strwidth-2)*dup, (BOXCREDITHEIGHT-2)*dup, 30|flags|(bgt<<V_ALPHASHIFT));
}
if (cursongcredit.trans < NUMTRANSMAPS)
@@ -2292,22 +2377,7 @@ void HU_DrawSongCredits(void)
}
}
static void HU_ForceShowChat(void)
{
// only matters for non console chat
// see m_menu for how forceshowchat is set
if (!chat_on && forceshowchat)
{
// only print this if theres nothing in chat already
if (chat_nummsg_log == 0)
{
HU_AddChatText("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", false);
}
HU_DrawChat();
}
}
// Heads up displays drawer, call each frame
//
void HU_Drawer(void)
@@ -2315,8 +2385,6 @@ void HU_Drawer(void)
if (cv_vhseffect.value && ((paused && !camera[R_GetViewNumber()].freecam) || (demo.playback && cv_playbackspeed.value > 1)))
V_DrawVhsEffect(demo.rewinding);
HU_ForceShowChat();
// draw chat string plus cursor
if (chat_on)
{
@@ -2396,7 +2464,8 @@ void HU_Drawer(void)
// IN-LEVEL MULTIPLAYER RANKINGS
//======================================================================
static int Ping_gfx_num(int lag)
static int
Ping_gfx_num (int lag)
{
if (lag < 2)
return 0;
@@ -2410,7 +2479,8 @@ static int Ping_gfx_num(int lag)
return 4;
}
static int Ping_gfx_color(UINT32 lag)
static int
Ping_gfx_color (UINT32 lag)
{
if (lag < 2)
return SKINCOLOR_JAWZ;
@@ -2433,7 +2503,8 @@ static int Ping_gfx_color(UINT32 lag)
return SKINCOLOR_WHITE; // to make the flashing work
}
static const UINT8 *Ping_gfx_colormap(UINT32 lag, boolean gentleman)
static const UINT8 *
Ping_gfx_colormap (UINT32 lag, boolean gentleman)
{
const UINT8 *colormap = NULL;
@@ -2453,7 +2524,8 @@ static const UINT8 *Ping_gfx_colormap(UINT32 lag, boolean gentleman)
return colormap;
}
static UINT32 Ping_conversion(UINT32 lag)
static UINT32
Ping_conversion (UINT32 lag)
{
if (cv_pingmeasurement.value)
{
@@ -2570,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 -5
View File
@@ -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.
@@ -88,10 +102,6 @@ extern patch_t *tallminus;
// set true whenever the tab rankings are being shown for any reason
extern boolean hu_showscores;
extern consvar_t cv_chat_xoffset;
extern consvar_t cv_chat_yoffset;
extern consvar_t cv_chat_showlimit;
// init heads up data at game startup.
void HU_Init(void);
@@ -100,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);
@@ -108,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
View File
@@ -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"
-14
View File
@@ -14,9 +14,6 @@
#ifndef __I_SYSTEM__
#define __I_SYSTEM__
// page for Saturn issue reports
#define SATURNISSUEPAGE "https://github.com/Indev450/SRB2Kart-Saturn/issues"
#ifdef __cplusplus
extern "C" {
#endif
@@ -151,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);
@@ -206,15 +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 Open A URL
*/
int I_OpenURL(const char *url);
/** \brief The I_GetDiskFreeSpace function
-4
View File
@@ -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;
@@ -1694,7 +1691,6 @@ boolean I_InitTcpNetwork(void)
hardware_MAXPACKETLENGTH = MAXPACKETLENGTH;
}
}
if (M_CheckProtoParam("ip"))
{
COM_ImmedExecute(va("exec \"%s"PATHSEP"kartexec.cfg\" -noerror\n", srb2home));
+2
View File
@@ -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);
-4
View File
@@ -452,11 +452,7 @@ void A_SpawnFreshCopy(void *actor);
extern boolean actionsoverridden[NUMACTIONS];
// ratio of states to sprites to mobj types is roughly 6 : 1 : 1
#ifdef COMPAT_VANILLA
#define NUMMOBJFREESLOTS 1024
#else
#define NUMMOBJFREESLOTS 4096 // should be sufficient
#endif
#define NUMSPRITEFREESLOTS NUMMOBJFREESLOTS
#define NUMSTATEFREESLOTS (NUMMOBJFREESLOTS*8)
+173 -145
View File
@@ -98,8 +98,6 @@ consvar_t cv_showminimapfinished = {"showminimapfinished", "On", CV_SAVE, CV_OnO
CV_PossibleValue_t minimapdot_cons_t[NUMMINIMAPDOTSTUFF];
consvar_t cv_showminimapangle = {"showminimapangle", "Off", CV_SAVE, minimapdot_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_spinoutroll = {"spinoutroll", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
static CV_PossibleValue_t posanim_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "Smooth"}, {0, NULL}};
consvar_t cv_posanim = {"postitionanimation", "On", CV_SAVE, posanim_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_smallposnum = {"smallpositionnumber", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
@@ -112,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
@@ -233,7 +226,6 @@ void K_RegisterKartHudStuff(void)
CV_RegisterVar(&cv_showminimapnames);
CV_RegisterVar(&cv_showminimapfinished);
CV_RegisterVar(&cv_showminimapangle);
CV_RegisterVar(&cv_spinoutroll);
CV_RegisterVar(&cv_showlapemblem);
@@ -251,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);
@@ -284,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};
@@ -321,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};
@@ -486,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);
@@ -540,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 --
@@ -874,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();
}
@@ -1144,9 +1149,10 @@ enum
SPEEDO_DIAL,
SPEEDO_PMETER,
SPEEDO_PMETERSMOL,
SPEEDO_EXTRA3,
};
static UINT8 K_GetSpeedometerStyle(void)
static SINT8 K_GetSpeedometerStyle(void)
{
if (cv_newspeedometer.value == 2 && xtra_speedo)
return SPEEDO_EXTRA;
@@ -1158,6 +1164,8 @@ static UINT8 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;
}
@@ -1175,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;
}
@@ -1186,6 +1196,7 @@ enum
GAUGE_SMALL,
GAUGE_BIGNUM,
GAUGE_NUMONLY,
GAUGE_EXTRA,
};
static SINT8 K_GetDriftgaugeStyle(void)
@@ -1198,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
@@ -1349,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;
}
@@ -1396,6 +1407,7 @@ static void K_drawKartStats(void)
{
case SPEEDO_EXTRA:
case SPEEDO_ACHII:
case SPEEDO_EXTRA3:
spdoffset = -10;
break;
case SPEEDO_DIAL:
@@ -1517,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;
@@ -2174,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++)
{
@@ -2191,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++)
{
@@ -2248,7 +2257,6 @@ static boolean K_drawKartPositionFaces(void)
if (!playeringame[rankplayer[i]])
continue;
if (player->spectator || !player->mo)
continue;
@@ -2426,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)
@@ -2635,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
@@ -2704,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?
@@ -2738,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]);
}
}
@@ -2795,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;
@@ -2887,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;
@@ -2974,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;
@@ -3034,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;
@@ -3247,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;
@@ -3277,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;
@@ -3294,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
{
@@ -3600,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);
@@ -3941,23 +3978,10 @@ static void K_drawBattleFullscreen(void)
INT32 x = BASEVIDWIDTH/2;
INT32 y = (-64*FRACUNIT) + cardanim; // card animation goes from 0 to 164, 164 is the middle of the screen
INT32 splitflags = splitscreen ? V_SNAPTOTOP : 0; // I don't feel like properly supporting non-green resolutions, so you can have a misuse of SNAPTO instead
INT32 splitflags = V_SNAPTOTOP; // I don't feel like properly supporting non-green resolutions, so you can have a misuse of SNAPTO instead
fixed_t scale = FRACUNIT;
boolean drawcomebacktimer = true; // lazy hack because it's cleaner in the long run.
// Small hack, if we're not in splitscreen we will not use V_SNAPTOTOP, instead we will just slightly offset
// y position so "attack or protect" doesn't slightly show before popping in
// We will also reduce this when is closer to finishing so when its at the bottom, the "hack offset" is 0
if (!splitscreen)
{
fixed_t offset = ((vid.height - vid.dup*BASEVIDHEIGHT)/vid.dup) * FRACUNIT/2;
// cardanim goes from 0 to 164, so when it is 164 offset will be multiplied by (1 - 164/164) = 0 :3
offset = FixedMul(offset, FRACUNIT - FixedDiv(cardanim, 164*FRACUNIT));
y -= offset;
}
if (!LUA_HudEnabled(hud_battlecomebacktimer))
drawcomebacktimer = false;
@@ -3998,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)
@@ -4045,12 +4068,12 @@ static void K_drawBattleFullscreen(void)
if (K_UseColorHud()) // Colourized hud
{
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, splitflags, kp_timeoutstickerclr, colormap);
V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, 0, kp_timeoutstickerclr, colormap);
}
else
V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, splitflags, kp_timeoutsticker, NULL);
V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, 0, kp_timeoutsticker, NULL);
V_DrawKartString(x-txoff, ty, splitflags, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
V_DrawKartString(x-txoff, ty, 0, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
}
}
@@ -4280,7 +4303,6 @@ static void K_drawInput(void)
y -= FRACUNIT;
// stick displays
if (cv_showinput.value == 2 || cv_showinput.value == 3)
{
INT32 axis;
@@ -4290,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)
@@ -4308,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)
{
@@ -4354,7 +4395,7 @@ static void K_drawInput(void)
}
}
}
else // wheel
else
{
if (!cmd->driftturn) // no turn
target = 0;
@@ -4401,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
@@ -4410,9 +4450,6 @@ static void K_drawChallengerScreen(void)
static void K_drawLapStartAnim(void)
{
if (!cv_showlapemblem.value)
return;
// This is an EVEN MORE insanely complicated animation.
const UINT8 progress = 80-stplyr->kartstuff[k_lapanimation];
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
@@ -4456,10 +4493,9 @@ static void K_drawLapStartAnim(void)
V_DrawFixedPatch(leftx, y, FRACUNIT, vflags, kp_lapanim_lap[min(progress/2, 6)], NULL);
char *lapnum = va("%02d", stplyr->laps + 1);
const size_t laplength = strlen(lapnum);
const int laplength = (int)strlen(lapnum);
for (int 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));
@@ -4507,7 +4543,6 @@ static void K_drawDistributionDebugger(void)
kp_orbinaut[4],
kp_jawz[1]
};
INT32 useodds = 0;
INT32 pingame = 0, bestbumper = 0;
INT32 i;
@@ -4524,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];
}
@@ -4589,11 +4622,7 @@ static void K_drawCheckpointDebugger(void)
else
V_DrawString(8, 184, 0, va("Checkpoint: %d / %d (Skip: %d)", stplyr->starpostnum, numstarposts, ((numstarposts/2) + stplyr->starpostnum)));
// really gnarly hack
const INT32 prevcheck = (stprevnextchecks[0] != INT32_MAX) ? stprevnextchecks[0]: stplyr->kartstuff[k_prevcheck];
const INT32 nextcheck = (stprevnextchecks[1] != INT32_MAX) ? stprevnextchecks[1]: stplyr->kartstuff[k_nextcheck];
V_DrawString(8, 192, 0, va("Waypoint dist: Prev %d, Next %d", prevcheck, nextcheck));
V_DrawString(8, 192, 0, va("Waypoint dist: Prev %d, Next %d", stplyr->kartstuff[k_prevcheck], stplyr->kartstuff[k_nextcheck]));
}
// determines if gametype info (laps/bumpers) should be hidden
@@ -4685,7 +4714,6 @@ void K_drawKartHUD(void)
{
if (LUA_HudEnabled(hud_battlefullscreen))
K_drawBattleFullscreen();
return;
}
@@ -4845,7 +4873,7 @@ void K_drawKartHUD(void)
{
if (stplyr->exiting)
K_drawKartFinish();
else if (stplyr->kartstuff[k_lapanimation] && !splitscreen)
else if (stplyr->kartstuff[k_lapanimation] && !splitscreen && cv_showlapemblem.value)
K_drawLapStartAnim();
}
-1
View File
@@ -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];
+758 -935
View File
File diff suppressed because it is too large. Load diff
-2
View File
@@ -32,8 +32,6 @@ extern consvar_t cv_bananajitter;
extern consvar_t cv_bananthrowroll;
extern consvar_t cv_airsparks;
extern INT32 stprevnextchecks[2];
boolean K_IsPlayerLosing(player_t *player);
boolean K_IsPlayerWanted(player_t *player);
INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean spbrush);
+26 -12
View File
@@ -3055,44 +3055,58 @@ static int lib_kSetHyuCountdown(lua_State *L)
static int lib_gSetPlayerGamepadIndicatorColor(lua_State *L)
{
INT32 pnum = -1;
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); // retrieve player
INT32 player = -1;
player_t *plr = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); // retrieve player
UINT8 color = (UINT8)luaL_checkinteger(L, 2); // skincolor
if (!player)
if (!plr)
return LUA_ErrInvalid(L, "player_t");
if (color >= MAXTRANSLATIONS)
return luaL_error(L, "color %d out of range (0 - %d).", color, MAXTRANSLATIONS-1);
pnum = P_GetLocalPlayerNumForPlayer(player);
for (int i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
{
if (plr - players == displayplayers[i])
{
player = i;
break;
}
}
// Not a local player
if (pnum == -1) return 0;
if (player == -1) return 0;
// pls update with color 0 when youre done with changing led stuff so it can get player color again
G_SetPlayerGamepadIndicatorColor(pnum, color);
G_SetPlayerGamepadIndicatorColor(player, color);
return 0;
}
static int lib_gPlayerDeviceRumble(lua_State *L)
{
INT32 pnum = -1;
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); // retrieve player
INT32 player = -1;
player_t *plr = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); // retrieve player
UINT16 low_strength = (UINT16)luaL_checkinteger(L, 2); // low frequency rumble motor strenght
UINT16 high_strength = (UINT16)luaL_checkinteger(L, 3); // high frequency rumble motor strenght
UINT32 duration = (UINT32)luaL_optinteger(L, 4, 84); // duration of rumble in ms
if (!player)
if (!plr)
return LUA_ErrInvalid(L, "player_t");
pnum = P_GetLocalPlayerNumForPlayer(player);
for (int i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
{
if (plr - players == displayplayers[i])
{
player = i;
break;
}
}
// Not a local player
if (pnum == -1) return 0;
if (player == -1) return 0;
G_PlayerDeviceRumble(pnum, low_strength, high_strength, duration);
G_PlayerDeviceRumble(player, low_strength, high_strength, duration);
return 0;
}
+16 -58
View File
@@ -65,8 +65,6 @@ static stringhook_t stringHooks[STRING_HOOK(MAX)];
bool hook_important = true;
#define NONMOHOOK ((mobjtype_t)-1)
// This will be indexed by hook id, the value of which fetches the registry.
static int * hookRefs;
static int nextid;
@@ -295,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; /* != NONMOHOOK 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 {
@@ -366,7 +364,7 @@ FUNCINLINE static ATTRINLINE boolean prepare_hook
int hook_type
){
return init_hook_type(hook, default_status,
hook_type, NONMOHOOK, NULL,
hook_type, NUMMOBJTYPES, NULL,
hookIds[hook_type].numHooks);
}
@@ -393,7 +391,7 @@ FUNCINLINE static ATTRINLINE boolean prepare_string_hook
const char * string
){
if (init_hook_type(hook, default_status,
hook_type, NONMOHOOK, string,
hook_type, NUMMOBJTYPES, string,
stringHooks[hook_type].ref))
{
lua_pushstring(gL, string);
@@ -409,7 +407,7 @@ FUNCINLINE static ATTRINLINE boolean prepare_hud_hook
int hook_type
){
return init_hook_type(hook, 0,
hook_type, NONMOHOOK, NULL,
hook_type, NUMMOBJTYPES, NULL,
hudHookIds[hook_type].numHooks);
}
@@ -530,48 +528,10 @@ static int call_string_hooks(Hook_State *hook)
return calls;
}
FUNCINLINE static ATTRINLINE int call_mobj_type_hooks(Hook_State *hook, mobjtype_t mobj_type)
{
static UINT8 seen = 0; // so we dont have to check all this shit constantly
int numCalls = call_mapped(hook, &mobjHookIds[mobj_type][hook->hook_type]);
if (!seen && numCalls > 0 && mobj_type == MT_NULL && (
hook->hook_type == MOBJ_HOOK(MobjThinker )
|| hook->hook_type == MOBJ_HOOK(MobjCollide )
|| hook->hook_type == MOBJ_HOOK(MobjMoveCollide)
|| hook->hook_type == MOBJ_HOOK(MobjFuse )
|| hook->hook_type == MOBJ_HOOK(MobjThinker )
|| hook->hook_type == MOBJ_HOOK(BossThinker )
))
{
seen = 1;
CONS_Alert(
CONS_WARNING, "%s\n", va(
"%s hooks not attached to a specific mobj type may cause performance issues!",
mobjHookNames[hook->hook_type])
);
// print which script triggered it, ty indev <3
for (int k = 0; k < mobjHookIds[mobj_type][hook->hook_type].numHooks; ++k)
{
lua_getref(gL, hookRefs[mobjHookIds[mobj_type][hook->hook_type].ids[k].id]);
lua_Debug ar;
lua_getinfo(gL, ">S", &ar);
CONS_Printf("%s:%d\n", ar.short_src, ar.linedefined);
}
}
return numCalls;
}
/*
FUNCINLINE static ATTRINLINE int call_mobj_type_hooks(Hook_State *hook, mobjtype_t mobj_type)
{
return call_mapped(hook, &mobjHookIds[mobj_type][hook->hook_type]);
}
*/
static int call_hooks
(
@@ -587,13 +547,11 @@ static int call_hooks
{
calls += call_string_hooks(hook);
}
//else if (hook->mobj_type > 0)
else if (hook->mobj_type != NONMOHOOK)
else if (hook->mobj_type < NUMMOBJTYPES)
{
/* call generic mobj hooks first */
calls += call_mobj_type_hooks(hook, MT_NULL);
if (hook->mobj_type < NUMMOBJTYPES)
calls += call_mobj_type_hooks(hook, hook->mobj_type);
calls += call_mobj_type_hooks(hook, hook->mobj_type);
ps_lua_mobjhooks.value.i += calls;
}
else
+9 -14
View File
@@ -644,22 +644,20 @@ static int libd_drawScaled(lua_State *L)
// KART: draw patch on minimap from x, y coordinates on the map
static int libd_drawOnMinimap(lua_State *L)
{
fixed_t x, y, scale; // coordinates of the object
patch_t *patch; // patch we want to draw
UINT8 *colormap = NULL; // do we want to colormap this patch?
boolean centered; // the patch is centered and doesn't need readjusting on x/y coordinates.
fixed_t x, y, scale; // coordinates of the object
patch_t *patch; // patch we want to draw
UINT8 *colormap = NULL; // do we want to colormap this patch?
boolean centered; // the patch is centered and doesn't need readjusting on x/y coordinates.
huddrawlist_h list;
patch_t *AutomapPic = NULL;
drawinfo_t info;
// variables used to replicate k_kart's mmap drawer:
patch_t *AutomapPic;
// variables used for actually drawing the icon:
INT32 splitflags, minimaptrans;
fixed_t amnumxpos, amnumypos;
fixed_t amxpos, amypos;
INT32 mm_x, mm_y;
fixed_t patchw, patchh;
fixed_t patchw = 0, patchh = 0;
HUDONLY // only run this function in hud hooks
@@ -724,11 +722,8 @@ static int libd_drawOnMinimap(lua_State *L)
mm_y -= AutomapPic->topoffset;
if (centered)
{
patchw = patchh = 0; // patch is supposedly already centered, don't butt in.
}
else
// patch is supposedly already centered, don't butt in.
if (!centered)
{
// scale patch coords
patchw = (patch->width * scale / 2);
@@ -1302,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
View File
@@ -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)
+9 -21
View File
@@ -713,12 +713,9 @@ static UINT8 GetUserdataArchType(int index)
static UINT8 ArchiveValue(UINT8 **p, int TABLESINDEX, int myindex)
{
int type = lua_type(gL, myindex);
if (myindex < 0)
myindex = lua_gettop(gL)+1+myindex;
switch (type)
switch (lua_type(gL, myindex))
{
case LUA_TNONE:
case LUA_TNIL:
@@ -728,12 +725,8 @@ static UINT8 ArchiveValue(UINT8 **p, int TABLESINDEX, int myindex)
case LUA_TLIGHTUSERDATA:
case LUA_TTHREAD:
case LUA_TFUNCTION:
{
const char *typestr = (type == LUA_TLIGHTUSERDATA ? "light userdata" : (type == LUA_TTHREAD ? "thread" : (type == LUA_TFUNCTION ? "function" : "??")));
CONS_Alert(CONS_ERROR, M_GetText("Archived an invalid value! (%s)\n"), typestr);
WRITEUINT8(*p, ARCH_NULL);
return 2;
}
case LUA_TBOOLEAN:
WRITEUINT8(*p, ARCH_BOOLEAN);
WRITEUINT8(*p, lua_toboolean(gL, myindex));
@@ -986,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;
}
@@ -1002,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;
}
@@ -1014,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);
@@ -1072,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.
@@ -1088,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);
}
+11 -3
View File
@@ -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)
{
@@ -766,7 +773,7 @@ boolean OP_FreezeObjectplace(void)
if (!objectplacing)
return false;
if (nightsmode && nightsplayer(&players[consoleplayer]))
if ((maptol & TOL_NIGHTS) && (players[consoleplayer].pflags & PF_NIGHTSMODE))
return false;
return true;
@@ -1041,6 +1048,7 @@ void Command_ObjectPlace_f(void)
{
REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER;
REQUIRE_NOULTIMATE;
G_SetGameModified(multiplayer, true);
@@ -1049,7 +1057,7 @@ void Command_ObjectPlace_f(void)
{
objectplacing = true;
if (nightsplayer(&players[0]))
if ((players[0].pflags & PF_NIGHTSMODE))
return;
if (!COM_CheckParm("-silent"))
@@ -1120,7 +1128,7 @@ void Command_ObjectPlace_f(void)
// Don't touch the NiGHTS Objectplace stuff.
// ... or if the mo mysteriously vanished.
if (!players[0].mo || nightsplayer(&players[0]))
if (!players[0].mo || (players[0].pflags & PF_NIGHTSMODE))
return;
// If still in dummy state, get out of it.
+9
View File
@@ -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);
-7
View File
@@ -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
+250 -219
View File
@@ -25,7 +25,6 @@
#include "d_netcmd.h"
#include "d_clisrv.h"
#include "i_net.h"
#include "i_system.h"
#include "console.h"
#include "r_fps.h"
#include "r_local.h"
@@ -150,8 +149,13 @@ 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;
boolean menuactive = false;
boolean fromlevelselect = false;
@@ -213,19 +217,12 @@ static INT32 setupm_fakeskin;
static INT32 setupm_fakecolor;
static UINT8 setupm_pselect = 1;
// variables used for other skin select menus
//variables used for other skin select menus
static UINT8 setupm_skinypos;
static INT32 setupm_skinselect;
static boolean setupm_skinlockedselect;
static UINT8 setupm_playernum; // brap
// Addons Menu: Local mode
static void M_LocalAddons(INT32 choice);
static boolean addons_localmode = false;
#define LOCALMODE_KEY (KEY_RALT)
#define AUTOLOAD_KEY (KEY_END)
static UINT8 setupm_playernum; //brap
//
// PROTOTYPES
@@ -277,8 +274,6 @@ static void M_ConfirmTeamChange(INT32 choice);
static void M_ConfirmSpectateChange(INT32 choice);
static void M_QuitSRB2(INT32 choice);
static void M_SaturnReportIssue(INT32 choice);
// Single Player
static void M_TimeAttack(INT32 choice);
static boolean M_QuitTimeAttackMenu(void);
@@ -313,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);
@@ -333,6 +327,7 @@ static void M_EraseData(INT32 choice);
static void M_AddonsInternal();
static void M_Addons(INT32 choice);
static void M_LocalSkins(INT32 choice);
static void M_AddonsOptions(INT32 choice);
#define addonmenusize 9 // number of items actually displayed in the addons menu view, formerly (2*numaddonsshown + 1)
#define numaddonsshown 4 // number of items to each side of the currently selected item, unless at top/bottom ends of directory
@@ -416,7 +411,6 @@ static INT32 M_GetFirstLevelInList(void);
// crap to force hud to show when in saturns hud options
boolean forceshowhud = false;
boolean forceshowchat = false;
// smol text indicating if game is modified
// so ppl dont wonder where their ra times went and stuff
@@ -455,13 +449,13 @@ consvar_t cv_showallmaps = {"showallmaps", "No", CV_SAVE, CV_YesNo, NULL, 0, NUL
consvar_t cv_showmusicfilename = {"showmusicfilename", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
static CV_PossibleValue_t serversort_cons_t[] = {
{0, "Ping"},
{1, "Modified State"},
{2, "Most Players"},
{3, "Least Players"},
{4, "Max Player Slots"},
{5, "Gametype"},
{0, NULL}
{0,"Ping"},
{1,"Modified State"},
{2,"Most Players"},
{3,"Least Players"},
{4,"Max Player Slots"},
{5,"Gametype"},
{0,NULL}
};
consvar_t cv_serversort = {"serversort", "Ping", CV_CALL, serversort_cons_t, M_SortServerList, 0, NULL, NULL, 0, 0, NULL};
@@ -504,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
//
@@ -710,7 +730,7 @@ static void Dummystaff_OnChange(void)
dummystaffname[0] = '\0';
if ((l = W_CheckNumForName(va("%sS01", G_BuildMapName(cv_nextmap.value)))) == LUMPERROR)
if ((l = W_CheckNumForName(va("%sS01",G_BuildMapName(cv_nextmap.value)))) == LUMPERROR)
{
CV_StealthSetValue(&cv_dummystaff, 0);
return;
@@ -719,7 +739,7 @@ static void Dummystaff_OnChange(void)
{
char *temp = dummystaffname;
UINT8 numstaff = 1;
while (numstaff < 99 && (l = W_CheckNumForName(va("%sS%02u", G_BuildMapName(cv_nextmap.value), numstaff+1))) != LUMPERROR)
while (numstaff < 99 && (l = W_CheckNumForName(va("%sS%02u",G_BuildMapName(cv_nextmap.value),numstaff+1))) != LUMPERROR)
numstaff++;
if (cv_dummystaff.value < 1)
@@ -727,7 +747,7 @@ static void Dummystaff_OnChange(void)
else if (cv_dummystaff.value > numstaff)
CV_StealthSetValue(&cv_dummystaff, 1);
if ((l = W_CheckNumForName(va("%sS%02u", G_BuildMapName(cv_nextmap.value), cv_dummystaff.value))) == LUMPERROR)
if ((l = W_CheckNumForName(va("%sS%02u",G_BuildMapName(cv_nextmap.value), cv_dummystaff.value))) == LUMPERROR)
return; // shouldn't happen but might as well check...
G_UpdateStaffGhostName(l);
@@ -812,8 +832,7 @@ static void M_ChangeCvar(INT32 choice)
CV_SetValue(cv,skins[skinno].prefcolor);
return;
}
CV_Set(cv, cv->defaultvalue);
CV_Set(cv,cv->defaultvalue);
return;
}
@@ -962,7 +981,6 @@ static void Command_Manual_f(void)
{
if (modeattacking)
return;
M_StartControlPanel();
M_Manual(INT32_MAX);
itemOn = 0;
@@ -1024,24 +1042,6 @@ boolean M_Responder(event_t *ev)
case KEY_HAT1 + 3:
ch = KEY_RIGHTARROW;
break;
//Local Addon Mode
case LOCALMODE_KEY:
{
if (!(server || IsPlayerAdmin(consoleplayer)))
break;
if (!addons_localmode)
{
S_StartSound(NULL, sfx_ding);
addons_localmode = true;
}
else
{
S_StartSound(NULL, sfx_jshard);
addons_localmode = false;
}
}
break;
}
}
else if (menuactive)
@@ -1053,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
@@ -1074,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
@@ -1093,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
{
@@ -1256,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;
}
@@ -1286,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;
}
}
@@ -1607,16 +1602,11 @@ static boolean ShouldDrawMenuBG(void)
if (forceshowhud)
return false;
if (forceshowchat)
return false;
// camera options stuff, only do when in level
if (gamestate == GS_LEVEL &&
(currentMenu == &OP_CamOptionsDef ||
currentMenu == &OP_Player1CamOptionsDef ||
currentMenu == &OP_Player2CamOptionsDef ||
currentMenu == &OP_Player3CamOptionsDef ||
currentMenu == &OP_Player4CamOptionsDef))
(currentMenu == &OP_CamOptionsDef || currentMenu == &OP_Player1CamOptionsDef
|| currentMenu == &OP_Player2CamOptionsDef || currentMenu == &OP_Player3CamOptionsDef
|| currentMenu == &OP_Player4CamOptionsDef))
return false;
return true;
@@ -1632,9 +1622,7 @@ void M_Drawer(void)
if (currentMenu == &MessageDef)
menuactive = true;
// pain and suffering
forceshowhud = (gamestate == GS_LEVEL && menuactive && (currentMenu == &OP_SaturnHudDef || currentMenu == &OP_HudOffsetDef || currentMenu == &OP_NametagDef || currentMenu == &OP_DriftGaugeDef)); // holy fuick
forceshowchat = (gamestate == GS_LEVEL && menuactive && currentMenu == &OP_ChatOptionsDef && (!OLDCHAT) && (itemOn == op_chat_boxwidth || itemOn == op_chat_boxheight || itemOn == op_chat_xoffs || itemOn == op_chat_yoffs || itemOn == op_chat_charlmt)); // man i dont gaf anymore lmao
if (menuactive)
{
@@ -1753,16 +1741,19 @@ void M_StartControlPanel(void)
MPauseMenu[mpause_switchteam].status = IT_DISABLED;
MPauseMenu[mpause_switchspectate].status = IT_DISABLED;
MPauseMenu[mpause_psetup].status = IT_DISABLED;
MPauseMenu[mpause_localaddons].status = IT_STRING | IT_CALL;
MISC_ChangeTeamMenu[0].status = IT_DISABLED;
MISC_ChangeSpectateMenu[0].status = IT_DISABLED;
MPauseMenu[mpause_addlocalskins].status = IT_STRING | IT_CALL;
MPauseMenu[mpause_localskin].status = IT_STRING | IT_CALL;
// Reset these in case splitscreen messes things up
MPauseMenu[mpause_addons].alphaKey = 8;
MPauseMenu[mpause_localaddons].alphaKey = 24;
if (IsPlayerAdmin(consoleplayer))
MPauseMenu[mpause_addlocalskins].alphaKey = 16;
else
MPauseMenu[mpause_addlocalskins].alphaKey = 24;
MPauseMenu[mpause_scramble].alphaKey = 8;
MPauseMenu[mpause_switchmap].alphaKey = 24;
@@ -1780,13 +1771,14 @@ void M_StartControlPanel(void)
{
MPauseMenu[mpause_switchmap].status = IT_STRING | IT_CALL;
MPauseMenu[mpause_addons].status = IT_STRING | IT_CALL;
MPauseMenu[mpause_localaddons].status = IT_DISABLED;
if (G_GametypeHasTeams())
MPauseMenu[mpause_scramble].status = IT_STRING | IT_SUBMENU;
}
if (server || (!cv_showlocalskinmenus.value))
{
MPauseMenu[mpause_addlocalskins].status = IT_DISABLED;
MPauseMenu[mpause_localskin].status = IT_DISABLED;
MPauseMenu[mpause_options].alphaKey = 64;
@@ -1794,6 +1786,7 @@ void M_StartControlPanel(void)
MPauseMenu[mpause_quit].alphaKey = 88;
}
if (splitscreen)
{
MPauseMenu[mpause_psetupsplit].status = MPauseMenu[mpause_psetupsplit2].status = IT_STRING | IT_CALL;
@@ -2002,6 +1995,8 @@ void M_Ticker(void)
//
void M_Init(void)
{
UINT8 i;
COM_AddCommand("manual", Command_Manual_f);
CV_RegisterVar(&cv_nextmap);
@@ -2047,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)
@@ -2101,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
// ==========================================================================
@@ -3338,14 +3391,14 @@ static void M_AddonsInternal(void)
static void M_Addons(INT32 choice)
{
(void)choice;
addons_localmode = false;
browselocalskins = false;
M_AddonsInternal();
}
static void M_LocalAddons(INT32 choice)
static void M_LocalSkins(INT32 choice)
{
(void)choice;
addons_localmode = true;
browselocalskins = true;
M_AddonsInternal();
}
@@ -3514,8 +3567,8 @@ static void M_DrawAddons(void)
if (Playing())
{
if (addons_localmode) // Draw notice that you're adding locally
V_DrawCenteredString(BASEVIDWIDTH/2, 5, V_ALLOWLOWERCASE, "Load addons or \x83local skins\x80 locally!");
if (browselocalskins)
V_DrawCenteredString(BASEVIDWIDTH/2, 5, V_ALLOWLOWERCASE, "Load \x83local skins\x80 from addons!");
else
V_DrawCenteredString(BASEVIDWIDTH/2, 5, warningflags, "Adding files mid-game may cause problems.");
}
@@ -3678,10 +3731,7 @@ static void M_DrawAddons(void)
//m = numwadfiles-(mainwads+2+1);
//V_DrawCenteredString(BASEVIDWIDTH/2, y+24, (majormods ? highlightflags : V_TRANSLUCENT), va("%d ADD-ON%s LOADED", (int)m, (m == 1) ? "" : "S")); //+2 for music, sounds, +1 for main.kart
V_DrawThinString(0, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_TRANSLUCENT|V_ALLOWLOWERCASE, va("%s Key - Add addon to autoload", G_KeynumToString(AUTOLOAD_KEY)));
if (Playing() && (server || IsPlayerAdmin(consoleplayer)))
V_DrawThinString(0, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_TRANSLUCENT|V_ALLOWLOWERCASE, va("%s Key - Switch to local addon mode", G_KeynumToString(LOCALMODE_KEY)));
V_DrawThinString(0, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_TRANSLUCENT|V_ALLOWLOWERCASE, ("END Key - Add addon to autoload"));
}
static void M_AddonExec(INT32 ch)
@@ -3703,7 +3753,7 @@ static void M_AddonAutoLoad(INT32 ch)
FILE *autoloadconfigfile;
// check our controls //
if (ch != 'y' && ch != KEY_ENTER && ch != AUTOLOAD_KEY)
if (ch != 'y' && ch != KEY_ENTER && ch != KEY_END)
{
S_StartSound(NULL, sfx_s26d);
return;
@@ -3717,7 +3767,7 @@ static void M_AddonAutoLoad(INT32 ch)
switch (dirmenu[dir_on[menudepthleft]][DIR_TYPE])
{
case EXT_FOLDER:
M_StartMessage(va("%c%s\x80\nAutoloading folders is not supported as of yet. \n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING), NULL, MM_NOTHING);
M_StartMessage(va("%c%s\x80\nAutoloading folders is not supported as of yet. \n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),NULL,MM_NOTHING);
break;
case EXT_TXT:
case EXT_CFG:
@@ -3858,7 +3908,7 @@ static void M_HandleAddons(INT32 choice)
}
break;
case EXT_TXT:
M_StartMessage(va("%c%s\x80\nThis file may not be a console script.\nAttempt to run anyways? \n\n(Press 'Y' to confirm)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING), M_AddonExec, MM_YESNO);
M_StartMessage(va("%c%s\x80\nThis file may not be a console script.\nAttempt to run anyways? \n\n(Press 'Y' to confirm)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),M_AddonExec,MM_YESNO);
break;
case EXT_CFG:
M_AddonExec(KEY_ENTER);
@@ -3871,40 +3921,30 @@ static void M_HandleAddons(INT32 choice)
case EXT_KART:
#endif
case EXT_PK3:
if (browselocalskins)
{
const char *addonname = dirmenu[dir_on[menudepthleft]]+DIR_STRING;
if (addons_localmode)
{
if (DumbStartsWith("KC_", addonname) || DumbStartsWith("kc_", addonname))
{
M_StartMessage(va("%c%s\x80\nYou are loading a local skin.\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), addonname), NULL, MM_NOTHING);
}
else if (DumbStartsWith("KCL_", addonname) || DumbStartsWith("kcl_", addonname)) // skins with lua
{
M_StartMessage(va("%c%s\x80\nYou are loading a local skin with lua.\nBeware that this may cause issues like crashes or desyncs in some cases!\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), addonname), NULL, MM_NOTHING);
}
// no need to account for KRC cases
COM_BufAddText(va("addfilelocal \"%s%s\"", menupath, addonname));
if (DumbStartsWith("KC_", dirmenu[dir_on[menudepthleft]]+DIR_STRING) || DumbStartsWith("kc_", dirmenu[dir_on[menudepthleft]]+DIR_STRING)) {
M_StartMessage(va("%c%s\x80\nYou are loading a local skin.\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),NULL,MM_NOTHING);
COM_BufAddText(va("addfilelocal \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING));
}
else
{
COM_BufAddText(va("addfile \"%s%s\"", menupath, addonname));
}
S_StartSound(NULL, sfx_s26d);
}
else
{
COM_BufAddText(va("addfile \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING));
}
break;
default:
S_StartSound(NULL, sfx_s26d);
}
}
if (refresh)
refreshdirmenu |= REFRESHDIR_NORMAL;
}
break;
case AUTOLOAD_KEY:
case KEY_END:
{
boolean refresh = true;
if (!dirmenu[dir_on[menudepthleft]])
@@ -3971,8 +4011,6 @@ static void M_HandleAddons(INT32 choice)
M_SetupNextMenu(currentMenu->prevMenu);
else
M_ClearMenus(true);
addons_localmode = false; //Exiting this menu, disable addons_localmode already.
}
}
@@ -4250,14 +4288,6 @@ static boolean M_HandleReplayHutQuery(INT32 choice)
char tmp[MAXREPLAYQUERY+1];
memcpy(tmp, replayqueryinput_buffer, MAXREPLAYQUERY+1);
Lock_search_state();
if (!replaynamesloaded)
{
Unlock_search_state();
return false;
}
Unlock_search_state();
if (M_TextInputHandle(&replayqueryinput, choice))
{
S_StartSound(NULL, sfx_menu1);
@@ -7661,11 +7691,7 @@ Update the maxplayers label...
// draw name string
if (itemOn != 9)
{
char buf[28];
strlcpy(buf, setupm_ip, sizeof(buf));
V_DrawString(x+8,y+12, V_ALLOWLOWERCASE, buf);
}
V_DrawString(x+8,y+12, V_ALLOWLOWERCASE, setupm_ip);
else
M_DrawTextInputScroll(x+8, y+12, &setupm_input_ip, 0, SETUPM_IP_MAXSIZE);
@@ -7797,7 +7823,7 @@ static void M_SetupMultiHandler(INT32 choice)
if (exitmenu)
{
if (currentMenu->prevMenu)
M_SetupNextMenu(currentMenu->prevMenu);
M_SetupNextMenu (currentMenu->prevMenu);
else
M_ClearMenus(true);
}
@@ -7926,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;
@@ -7958,6 +7985,8 @@ static void M_DrawSetupMultiPlayerMenu(void)
switch (cv_skinselectmenu.value)
{
case SKINMENUTYPE_EXTENDED:
nameboxaddy = 6;
break;
case SKINMENUTYPE_GRID:
nameboxaddy = 6;
break;
@@ -7973,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:
@@ -8067,6 +8112,8 @@ static void M_DrawSetupMultiPlayerMenu(void)
break;
}
#define GRIDSTATOFFSET 0
switch (cv_skinselectmenu.value)
{
case SKINMENUTYPE_EXTENDED:
@@ -8078,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
@@ -8107,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
{
@@ -8127,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);
}
}
@@ -8153,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);
@@ -8192,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;
@@ -8229,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);
@@ -8289,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:
@@ -8346,6 +8396,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
}
}
break;
#undef GRIDSTATOFFSET
#undef SKINXSHIFT
default:
speed = skins[setupm_fakeskin].kartspeed;
@@ -9048,15 +9099,15 @@ static boolean M_QuitMultiPlayerMenu(void)
if (!fastcmp(setupm_name, setupm_cvname->string))
{
// remove trailing whitespaces
l = strlen(setupm_name)-1;
for (;(signed)l >= 0 && setupm_name[l] ==' '; l--)
setupm_name[l] = 0;
COM_BufAddText(va("%s \"%s\"\n", setupm_cvname->name, setupm_name));
for (l = strlen(setupm_name)-1;
(signed)l >= 0 && setupm_name[l] ==' '; l--)
setupm_name[l] =0;
COM_BufAddText(va("%s \"%s\"\n",setupm_cvname->name,setupm_name));
}
// you know what? always putting these in the buffer won't hurt anything.
COM_BufAddText(va("%s \"%s\"\n", setupm_cvskin->name, skins[setupm_fakeskin].name));
COM_BufAddText(va("%s %d\n", setupm_cvcolor->name, setupm_fakecolor));
COM_BufAddText(va("%s \"%s\"\n",setupm_cvskin->name,skins[setupm_fakeskin].name));
COM_BufAddText(va("%s %d\n",setupm_cvcolor->name,setupm_fakecolor));
return true;
}
@@ -9696,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;
@@ -9717,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;
@@ -9981,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))
@@ -10020,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
@@ -10592,20 +10637,6 @@ static void M_QuitSRB2(INT32 choice)
M_StartMessage(quitmsg[M_RandomKey(NUM_QUITMESSAGES)], M_QuitResponse, MM_YESNO);
}
// ===========
// SATURN MENU
// ===========
static void M_SaturnReportIssue(INT32 choice)
{
(void)choice;
int url = I_OpenURL(SATURNISSUEPAGE);
// SDL_OpenURL unsupported or failed
if (url == -1)
M_StartMessage(M_GetText("Failed to Open Web Page.\nPlease open the following page in your web browser:\n\n" SATURNISSUEPAGE "\n\n(Press a key)\n"), NULL, MM_NOTHING);
}
#ifdef HAVE_DISCORDRPC
// =====================================================================
+28 -1
View File
@@ -26,7 +26,7 @@ extern "C" {
#include "mserv.h"
#include "r_things.h" // for SKINNAMESIZE
extern boolean forceshowhud, forceshowchat;
extern boolean forceshowhud;
//
// MENUS
@@ -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;
+144 -237
View File
@@ -36,7 +36,6 @@ static menu_t SP_TimeAttackDef, SP_ReplayDef, SP_GuestReplayDef, SP_GhostDef;
menu_t OP_ControlsDef, OP_AllControlsDef;
menu_t OP_MouseOptionsDef;
menu_t OP_Joystick1Def, OP_Joystick2Def, OP_Joystick3Def, OP_Joystick4Def;
menu_t OP_Joystick1RumbleDef, OP_Joystick2RumbleDef, OP_Joystick3RumbleDef, OP_Joystick4RumbleDef;
// Custom cvar menu
menu_t OP_CustomCvarMenuDef;
@@ -209,7 +208,7 @@ typedef enum
static menuitem_t MPauseMenu[] =
{
{IT_STRING | IT_CALL, NULL, "Addons...", M_Addons, 8},
{IT_STRING | IT_CALL, NULL, "Local Add-ons...", M_LocalAddons, 8},
{IT_STRING | IT_CALL, NULL, "Add local skins...", M_LocalSkins, 16},
{IT_STRING | IT_SUBMENU, NULL, "Scramble Teams...", &MISC_ScrambleTeamDef, 24},
{IT_STRING | IT_CALL, NULL, "Switch Map..." , M_MapChange, 32},
@@ -239,7 +238,7 @@ static menuitem_t MPauseMenu[] =
typedef enum
{
mpause_addons = 0,
mpause_localaddons,
mpause_addlocalskins,
mpause_scramble,
mpause_switchmap,
#ifdef HAVE_DISCORDRPC
@@ -447,25 +446,25 @@ enum
static menuitem_t SP_ReplayMenu[] =
{
{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Time", M_ReplayTimeAttack, 90},
{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Lap", M_ReplayTimeAttack, 98},
{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Time", M_ReplayTimeAttack, 90},
{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Lap", M_ReplayTimeAttack, 98},
{IT_WHITESTRING|IT_CALL, NULL, "Replay Last", M_ReplayTimeAttack, 106},
{IT_WHITESTRING|IT_CALL, NULL, "Replay Guest", M_ReplayTimeAttack, 114},
{IT_WHITESTRING|IT_KEYHANDLER, NULL, "Replay Staff",M_HandleStaffReplay, 122},
{IT_WHITESTRING|IT_CALL, NULL, "Replay Last", M_ReplayTimeAttack, 106},
{IT_WHITESTRING|IT_CALL, NULL, "Replay Guest", M_ReplayTimeAttack, 114},
{IT_WHITESTRING|IT_KEYHANDLER, NULL, "Replay Staff",M_HandleStaffReplay,122},
{IT_WHITESTRING|IT_SUBMENU, NULL, "Back", &SP_TimeAttackDef, 130}
{IT_WHITESTRING|IT_SUBMENU, NULL, "Back", &SP_TimeAttackDef, 130}
};
static menuitem_t SP_GuestReplayMenu[] =
{
{IT_WHITESTRING|IT_CALL, NULL, "Save Best Time as Guest", M_SetGuestReplay, 94},
{IT_WHITESTRING|IT_CALL, NULL, "Save Best Lap as Guest", M_SetGuestReplay, 102},
{IT_WHITESTRING|IT_CALL, NULL, "Save Last as Guest", M_SetGuestReplay, 110},
{IT_WHITESTRING|IT_CALL, NULL, "Save Best Time as Guest", M_SetGuestReplay, 94},
{IT_WHITESTRING|IT_CALL, NULL, "Save Best Lap as Guest", M_SetGuestReplay,102},
{IT_WHITESTRING|IT_CALL, NULL, "Save Last as Guest", M_SetGuestReplay,110},
{IT_WHITESTRING|IT_CALL, NULL, "Delete Guest Replay", M_SetGuestReplay, 120},
{IT_WHITESTRING|IT_CALL, NULL, "Delete Guest Replay", M_SetGuestReplay,120},
{IT_WHITESTRING|IT_SUBMENU, NULL, "Back", &SP_TimeAttackDef, 130}
{IT_WHITESTRING|IT_SUBMENU, NULL, "Back", &SP_TimeAttackDef, 130}
};
static menuitem_t SP_GhostMenu[] =
@@ -496,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
// -----------------------------------
@@ -556,10 +561,10 @@ static menuitem_t MP_PlayerSetupMenu[] =
static menuitem_t MP_ConnectMenu[] =
{
{IT_STRING | IT_CVAR, NULL, "Sort By", &cv_serversort, 0},
{IT_STRING | IT_KEYHANDLER, NULL, "Page", M_HandleServerPage, 8},
{IT_STRING | IT_CALL, NULL, "Refresh", M_Refresh, 16},
{IT_STRING | IT_KEYHANDLER, NULL, "", M_HandleServerSearch, 25},
{IT_STRING | IT_CVAR, NULL, "Sort By", &cv_serversort, 0},
{IT_STRING | IT_KEYHANDLER, NULL, "Page", M_HandleServerPage, 8},
{IT_STRING | IT_CALL, NULL, "Refresh", M_Refresh, 16},
{IT_STRING | IT_KEYHANDLER, NULL, "", M_HandleServerSearch,25},
{IT_STRING | IT_SPACE, NULL, "", M_Connect, 48},
{IT_STRING | IT_SPACE, NULL, "", M_Connect, 60},
@@ -726,36 +731,29 @@ static const char* OP_AllControlsTooltips[sizeof(OP_AllControlsMenu)/sizeof(OP_A
// The rest is null, for now
};
// i really do not feel like messing with setup routines
// and macro preprocessor cannot eval maths for string shit like this :chaosleep:
#define RUMBDEF_0 OP_Joystick1RumbleDef
#define RUMBDEF_1 OP_Joystick2RumbleDef
#define RUMBDEF_2 OP_Joystick3RumbleDef
#define RUMBDEF_3 OP_Joystick4RumbleDef
#define RUMBDEF(x) RUMBDEF_##x
#define OP_JOYMENU(pnum) \
{IT_HEADER, NULL, "Gameplay Controls", NULL, 7}, \
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[pnum] , 15}, \
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[pnum] , 20}, \
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[pnum] , 25}, \
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[pnum] , 30}, \
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[pnum] , 35}, \
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[pnum] , 40}, \
{IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[pnum] , 45}, \
{IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[pnum] , 50}, \
{IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[pnum] , 55}, \
{IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[pnum] , 60}, \
{IT_HEADER, NULL, "Camera Controls", NULL, 67}, \
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[pnum] , 75}, \
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_camturnaxis[pnum] , 80}, \
{IT_STRING | IT_CVAR, NULL, "Strafe Left/Right" , &cv_camstrafeaxis[pnum] , 85}, \
{IT_HEADER, NULL, "Deadzones", NULL, 92}, \
{IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[pnum] , 100}, \
{IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[pnum] , 105}, \
{IT_HEADER, NULL, "Miscellaneous", NULL, 112}, \
{IT_SUBMENU|IT_STRING, NULL, "Rumble Options..." , &RUMBDEF(pnum) , 120}, \
{IT_STRING | IT_CVAR, NULL, "Set LED to Player color" , &cv_gamepadled[pnum] , 125},
#define OP_JOYMENU(pnum) \
{IT_HEADER, NULL, "Gameplay Controls", NULL, 7}, \
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[pnum] , 15}, \
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[pnum] , 20}, \
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[pnum] , 25}, \
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[pnum] , 30}, \
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[pnum] , 35}, \
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[pnum] , 40}, \
{IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[pnum] , 45}, \
{IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[pnum] , 50}, \
{IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[pnum] , 55}, \
{IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[pnum] , 60}, \
{IT_HEADER, NULL, "Camera Controls", NULL, 67}, \
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[pnum] , 75}, \
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_camturnaxis[pnum] , 80}, \
{IT_STRING | IT_CVAR, NULL, "Strafe Left/Right" , &cv_camstrafeaxis[pnum] , 85}, \
{IT_HEADER, NULL, "Deadzones", NULL, 92}, \
{IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[pnum] , 100}, \
{IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[pnum] , 105}, \
{IT_HEADER, NULL, "Miscellaneous", NULL, 112}, \
{IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[pnum] , 120}, \
{IT_STRING | IT_CVAR, NULL, "Controller Rumble Strength" , &cv_rumblestrength[pnum] , 125}, \
{IT_STRING | IT_CVAR, NULL, "Set LED to Player color" , &cv_gamepadled[pnum] , 130},
static menuitem_t OP_Joystick1Menu[] =
{
@@ -781,46 +779,6 @@ static menuitem_t OP_Joystick4Menu[] =
OP_JOYMENU(3)
};
#undef RUMBDEF
#undef RUMBDEF_0
#undef RUMBDEF_1
#undef RUMBDEF_2
#undef RUMBDEF_3
// FIXME: stair jank rumble should be greyed out if its disabled, but menus suck butt!
#define OP_JOYRUMBLEMENU(pnum) \
{IT_HEADER, NULL, "Global", NULL, 7}, \
{IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[pnum] , 15}, \
{IT_STRING | IT_CVAR, NULL, "Controller Rumble Strength" , &cv_rumble_strength[pnum] , 20}, \
{IT_HEADER, NULL, "Rumble Types", NULL, 27}, \
{IT_STRING | IT_CVAR, NULL, "Spinout" , &cv_rumble_spinout[pnum] , 35}, \
{IT_STRING | IT_CVAR, NULL, "Sneaker Boost" , &cv_rumble_sneakerboost[pnum] , 40}, \
{IT_STRING | IT_CVAR, NULL, "Offroad" , &cv_rumble_offroad[pnum] , 45}, \
{IT_STRING | IT_CVAR, NULL, "Banana Dragging" , &cv_rumble_bananadrag[pnum] , 50}, \
{IT_STRING | IT_CVAR, NULL, "Stair Jank" , &cv_rumble_stairjank[pnum] , 55}, \
{IT_STRING | IT_CVAR, NULL, "Brake Drift" , &cv_rumble_brakedrift[pnum] , 60}, \
{IT_STRING | IT_CVAR, NULL, "Drift Charge" , &cv_rumble_driftcharge[pnum] , 65}, \
static menuitem_t OP_Joystick1RumbleMenu[] =
{
OP_JOYRUMBLEMENU(0)
};
static menuitem_t OP_Joystick2RumbleMenu[] =
{
OP_JOYRUMBLEMENU(1)
};
static menuitem_t OP_Joystick3RumbleMenu[] =
{
OP_JOYRUMBLEMENU(2)
};
static menuitem_t OP_Joystick4RumbleMenu[] =
{
OP_JOYRUMBLEMENU(3)
};
static menuitem_t OP_JoystickSetMenu[] =
{
{IT_CALL | IT_NOTHING, "None", NULL, M_AssignJoystick, LINEHEIGHT+5},
@@ -837,9 +795,10 @@ static menuitem_t OP_JoystickSetMenu[] =
static menuitem_t OP_MouseOptionsMenu[] =
{
{IT_STRING | IT_CVAR, NULL, "Use Mouse", &cv_usemouse, 10},
{IT_STRING | IT_CVAR, NULL, "Mouse Turning", &cv_mouseturn, 20},
{IT_STRING | IT_CVAR, NULL, "Invert Mouse", &cv_invertmouse, 30},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Mouse X Speed", &cv_mousexsens, 40},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Mouse X Speed", &cv_mousexsens, 40},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Mouse Y Speed", &cv_mouseysens, 50},
};
@@ -908,6 +867,7 @@ static const char* OP_VideoTooltips[] =
"Advanced graphical options.",
};
enum
{
op_video_res = 0,
@@ -991,25 +951,24 @@ static menuitem_t OP_ExpOptionsMenu[] =
//{IT_STRING | IT_CVAR, NULL, "Randomized Directional Light", &cv_randomdirlight, 45}, // should this ever come back
{IT_STRING | IT_CVAR, NULL, "Skyboxes", &cv_skybox, 40},
{IT_STRING | IT_CVAR, NULL, "Skydome", &cv_skydome, 45},
{IT_STRING | IT_CVAR, NULL, "Precache Level Textures", &cv_precachetextures, 55},
{IT_STRING | IT_CVAR, NULL, "Precache Level Textures", &cv_precachetextures, 50},
{IT_STRING | IT_CVAR, NULL, "FPS counter sampling", &cv_accuratefps, 65},
{IT_STRING | IT_CVAR, NULL, "FPS counter sampling", &cv_accuratefps, 60},
{IT_STRING | IT_CVAR, NULL, "Frameskip", &cv_frameskip, 75},
{IT_STRING | IT_CVAR, NULL, "Frameskip", &cv_frameskip, 70},
{IT_STRING | IT_CVAR, NULL, "Votescreen Scaling", &cv_votebgscaling, 85},
{IT_STRING | IT_CVAR, NULL, "Votescreen Scaling", &cv_votebgscaling, 80},
#ifdef HWRENDER
{IT_STRING | IT_CVAR, NULL, "Screen Textures", &cv_glscreentextures, 95},
{IT_STRING | IT_CVAR, NULL, "Screen Textures", &cv_glscreentextures, 90},
#ifdef USE_FBO_OGL
{IT_STRING | IT_CVAR, NULL, "FBO Downsampling support", &cv_glframebuffer, 100},
{IT_STRING | IT_CVAR, NULL, "Palette Depth", &cv_glpalettedepth, 110},
{IT_DISABLED, NULL, "", NULL, 120}, // dummy text
{IT_STRING | IT_CVAR, NULL, "FBO Downsampling support", &cv_glframebuffer, 95},
{IT_STRING | IT_CVAR, NULL, "Palette Depth", &cv_glpalettedepth, 105},
{IT_DISABLED, NULL, "", NULL, 115}, // dummy text
#else
{IT_STRING | IT_CVAR, NULL, "Palette Depth", &cv_glpalettedepth, 110},
{IT_DISABLED, NULL, "", NULL, 120}, // dummy text
{IT_STRING | IT_CVAR, NULL, "Palette Depth", &cv_glpalettedepth, 100},
{IT_DISABLED, NULL, "", NULL, 110}, // dummy text
#endif
#endif
};
@@ -1022,13 +981,12 @@ static const char* OP_ExpTooltips[] =
"Sets minimum sector brightness, useful for dark areas.",
//"Should the directional lightning be randomized each map?\nTakes effect on next map load.",
"Toggle being able to see the sky.",
"Toggle skydome.", // idk man someone give a better description of this
"Preload all level textures on level load.\nMassively reduces texture related stuttering during gameplay\nat the cost of longer level loading times.\nDisable this if you experience timeouts during level switches.",
"Change the FPS counter sampling method\nInaccurate updates slower\nand might miss sudden framerate changes and drops,\nproviding a more averaged result.\nAccurate updates faster, but might be less readable.", // how to ingles??
"Skips rendering frames if game logic takes too long\npreventing gameplay issues during performance drops.", // idk im shit as describing things
"Different methods of scaling the votescreen backgrounds.",
#ifdef HWRENDER
"Disabling Screen Textures may result in a performance boost\nbut will break certain effects.\nScreen textures are required at resolutions lower than your desktop resolution!",
"Disabling Screen Textures may result in a performance boost\nbut will break certain effects.\nScreen textures are required at resolutions lower than your desktop resolution!"
#ifdef USE_FBO_OGL
"Allows the game to downsample from a higher resolution\nthan your display in OpenGL renderer mode.\nRequires a GPU with atleast OpenGL 2.1 support.",
#endif
@@ -1044,7 +1002,6 @@ enum
op_exp_secbright,
//op_exp_dirlight,
op_exp_skybox,
op_exp_skydome,
op_exp_texcache,
op_exp_accuratefps,
op_exp_frameskip,
@@ -1058,6 +1015,7 @@ enum
#endif
};
#ifdef HWRENDER
static menuitem_t OP_OpenGLOptionsMenu[] =
{
@@ -1066,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[] =
@@ -1114,6 +1072,7 @@ enum
op_gl_shearing,
op_gl_renderdist,
};
#endif
static menuitem_t OP_SoundOptionsMenu[] =
@@ -1124,7 +1083,8 @@ static menuitem_t OP_SoundOptionsMenu[] =
{IT_STRING|IT_CVAR|IT_CV_NOPRINT, NULL, "Music", &cv_gamedigimusic, 30},
{IT_STRING|IT_CVAR|IT_CV_SLIDER, NULL, "Music Volume", &cv_digmusicvolume, 38},
#if 0 //#ifndef NO_MIDI
//#ifndef NO_MIDI
#if 0
{IT_STRING|IT_CVAR|IT_CV_SLIDER, NULL, "MIDI Volume", &cv_midimusicvolume, 46},
{IT_STRING|IT_CVAR, NULL, "Reverse L/R Channels", &stereoreverse, 60},
@@ -1159,7 +1119,8 @@ static const char* OP_SoundTooltips[] =
"Volume of Sound effects.",
"Turn Music on or off.",
"Volume of Music.",
#if 0 //#ifndef NO_MIDI
//#ifndef NO_MIDI
#if 0
"Volume of Midi Music.",
#endif
"Reverse left and right channels of audio.",
@@ -1219,7 +1180,7 @@ static const char* OP_SoundAdvancedTooltips[] =
"Should the Grow music be on or off?",
"Should the Invulnerability music be on or off?",
"Should music be kept when restarting the map?",
"Should the Intro fanfare be skipped\nand map music be played on map start?\nNote that this WILL skip sounds played by the map before round start as well!",
"Should the Intro fanfare be skipped\nand map music be played on map start?",
"Controls Sound effects caching.\nKeep will retain previously played sound effects in cache." // man idk how to describe this in a non awful way lmao
"\nOn will preload all sound effects.\nEliminates sound-related lag and stutters but increases memory usage.",
"Size of the Audio Buffer\nreducing it will result in less sound latency\nbut may cause issues such as crackling or distorted Sound.",
@@ -1230,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[] =
@@ -1255,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?",
};
@@ -1350,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[] =
@@ -1453,70 +1413,44 @@ static const char* OP_PlayerCamOptionsTooltips[] =
static menuitem_t OP_ChatOptionsMenu[] =
{
// will ANYONE who doesn't know how to use the console want to touch this one?
{IT_STRING | IT_CVAR, NULL, "Chat Mode", &cv_consolechat, 5}, // nonetheless...
{IT_STRING | IT_CVAR, NULL, "Chat Mode", &cv_consolechat, 5}, // nonetheless...
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
NULL, "Chat Box Width", &cv_chatwidth, 10},
NULL, "Chat Box Width", &cv_chatwidth, 20},
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
NULL, "Chat Box Height", &cv_chatheight, 15},
{IT_STRING | IT_CVAR, NULL, "Chat Horizontal Offset", &cv_chat_xoffset, 20},
{IT_STRING | IT_CVAR, NULL, "Chat Vertical Offset", &cv_chat_yoffset, 25},
NULL, "Chat Box Height", &cv_chatheight, 30},
{IT_STRING | IT_CVAR, NULL, "Center Text in Chat", &cv_chatcentertext, 40},
{IT_STRING | IT_CVAR, NULL, "Center Text in Chat", &cv_chatcentertext, 35},
{IT_STRING | IT_CVAR, NULL, "Chat Background Tint", &cv_chatbacktint, 40},
{IT_STRING | IT_CVAR, NULL, "Message Fadeout Time", &cv_chattime, 45},
{IT_STRING | IT_CVAR, NULL, "Spam Protection", &cv_chatspamprotection, 50},
{IT_STRING | IT_CVAR, NULL, "Max Chat Messages", &cv_chatlogsize, 55},
{IT_STRING | IT_CVAR, NULL, "Display Character Limit", &cv_chat_showlimit, 60},
{IT_STRING | IT_CVAR, NULL, "Chat Background Tint", &cv_chatbacktint, 55},
{IT_STRING | IT_CVAR, NULL, "Message Fadeout Time", &cv_chattime, 65},
{IT_STRING | IT_CVAR, NULL, "Spam Protection", &cv_chatspamprotection, 75},
{IT_STRING | IT_CVAR, NULL, "Max Chat Messages", &cv_chatlogsize, 85},
{IT_STRING | IT_CVAR, NULL, "Local ping display", &cv_showping, 70}, // shows ping above the framerate if we want to.
{IT_STRING | IT_CVAR, NULL, "Ping display style", &cv_pingstyle, 75},
{IT_STRING | IT_CVAR, NULL, "Ping measurement", &cv_pingmeasurement, 80},
{IT_STRING | IT_CVAR, NULL, "Ping icon", &cv_pingicon, 85},
{IT_STRING | IT_CVAR, NULL, "Local ping display", &cv_showping, 105}, // shows ping above the framerate if we want to.
{IT_STRING | IT_CVAR, NULL, "Ping display style", &cv_pingstyle, 115},
{IT_STRING | IT_CVAR, NULL, "Ping measurement", &cv_pingmeasurement, 125},
{IT_STRING | IT_CVAR, NULL, "Ping icon", &cv_pingicon, 135},
{IT_STRING | IT_CVAR, NULL, "Show IP address in playerlist", &cv_shownodeip, 90},
{IT_STRING | IT_CVAR, NULL, "Show IP address in playerlist", &cv_shownodeip, 145},
};
static const char* OP_ChatOptionsTooltips[] =
{
"Chat mode used for in-game chat.",
"Width of the chat box.",
"Height of the chat box.",
"Horizontal Offset of the chat box.",
"Vertical Offset of the chat box.",
"Width of chat box.",
"Height of chat box.",
"Center text in the chat message pop ups.",
"Background for the chat message pop ups.",
"Chatbox background.",
"Fadeout time for new chat message.",
"Spam protection for in-game chat.",
"Maxiumum amount of chat messages to look back at.",
"Show how many characters you have left to type in the chat.",
"Show player ping.",
"Choose the style of the ping display.",
"Choose the looks of the ping display.", // this is ass idk english lmao
"Measurement used for ping.",
"Visibility of ping icon.",
"Should Player IP addresses be printed when using\nthe nodes or listplayers command?",
};
enum
{
op_chat_mode,
op_chat_boxwidth,
op_chat_boxheight,
op_chat_yoffs,
op_chat_xoffs,
op_chat_centertxt,
op_chat_bgtint,
op_chat_fadetime,
op_chat_spamprotect,
op_chat_maxmsg,
op_chat_charlmt,
op_chat_showping,
op_chat_pingstyle,
op_chat_pingmeasr,
op_chat_pingico,
op_chat_nodeip,
};
static menuitem_t OP_GameOptionsMenu[] =
{
{IT_STRING | IT_SUBMENU, NULL, "Random Item Toggles...", &OP_MonitorToggleDef, 10},
@@ -1702,7 +1636,7 @@ static menuitem_t OP_AccessibilityMenu[] =
{IT_SUBMENU|IT_STRING, NULL, "Video Color Settings...", &OP_ColorOptionsDef, 30},
{IT_STRING|IT_CVAR, NULL, "Reduce Effects", &cv_reducevfx, 35},
{IT_STRING|IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 40}, // obsolete now? or still better be a seperate toggle?
{IT_STRING|IT_CVAR, NULL, "Midnight Channel Flicker", &cv_lessflicker, 40}, // obsolete now? or still better be a seperate toggle?
{IT_STRING|IT_CVAR, NULL, "Minimum Sector Brightness", &cv_secbright, 45},
@@ -1784,7 +1718,6 @@ static menuitem_t OP_SaturnMenu[] =
{IT_SUBMENU|IT_STRING, NULL, "Saturn Hud...", &OP_SaturnHudDef, 140},
{IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 145},
{IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 150}, // uwu
{IT_STRING|IT_CALL, NULL, "Report an Issue", M_SaturnReportIssue, 155}
};
static const char* OP_SaturnTooltips[] =
@@ -1808,7 +1741,6 @@ static const char* OP_SaturnTooltips[] =
"Options for Saturn specific HUD things.",
"Options for sprite distortion effects.",
"See the people who helped make this project possible!",
"Noticed a bug, have a Suggestion or other Feedback?\nFeel free to tell us!",
};
enum
@@ -1830,7 +1762,6 @@ enum
sm_hud,
sm_distortionmenu,
sm_credits,
sm_issue,
};
static menuitem_t OP_PlayerDistortMenu[] =
@@ -1841,23 +1772,20 @@ static menuitem_t OP_PlayerDistortMenu[] =
{IT_STRING | IT_CVAR, NULL, "Slope Rotation Distance", &cv_sloperolldist, 15},
{IT_STRING | IT_CVAR, NULL, "Rotate Players when Sliptiding", &cv_sliptideroll, 25},
{IT_STRING | IT_CVAR, NULL, "Stair Janking Effect", &cv_stairjank, 30},
{IT_STRING | IT_CVAR, NULL, "Stair Janking Sound Effect", &cv_stairjanksfx, 35}, // idk if that should be here but i dont care atm
{IT_STRING | IT_CVAR, NULL, "Rotate Sparks and Boost Trails", &cv_sparkroll, 30},
{IT_STRING | IT_CVAR, NULL, "Rotate Bananas on Throw", &cv_bananthrowroll, 35},
{IT_STRING | IT_CVAR, NULL, "Rotate Sparks and Boost Trails", &cv_sparkroll, 40},
{IT_STRING | IT_CVAR, NULL, "Rotate Bananas on Throw", &cv_bananthrowroll, 45},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Player Stretch Factor", &cv_gravstretch, 45},
{IT_STRING | IT_CVAR, NULL, "Squish Sound Effect", &cv_slamsound, 50},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Player Stretch Factor", &cv_gravstretch, 55},
{IT_STRING | IT_CVAR, NULL, "Squish Sound Effect", &cv_slamsound, 60},
{IT_STRING | IT_CVAR, NULL, "Saltyhop", &cv_saltyhop, 60},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saltyhop Height", &cv_saltyheight, 65},
{IT_STRING | IT_CVAR, NULL, "Saltyhop Sound Effect", &cv_saltyhopsfx, 70},
{IT_STRING | IT_CVAR, NULL, "Saltyhop Squish", &cv_saltysquish, 75},
{IT_STRING | IT_CVAR, NULL, "Saltyhop Roll", &cv_saltyroll, 80},
{IT_STRING | IT_CVAR, NULL, "Saltyhop", &cv_saltyhop, 70},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saltyhop Height", &cv_saltyheight, 75},
{IT_STRING | IT_CVAR, NULL, "Saltyhop Sound Effect", &cv_saltyhopsfx, 80},
{IT_STRING | IT_CVAR, NULL, "Saltyhop Squish", &cv_saltysquish, 85},
{IT_STRING | IT_CVAR, NULL, "Saltyhop Roll", &cv_saltyroll, 90},
{IT_STRING | IT_CVAR, NULL, "Squishdance", &cv_squishdance, 100},
{IT_STRING | IT_CVAR, NULL, "Squishdance Speed", &cv_squishdancespeed, 106}, // why is this offset by 6? idk cant remember lulul
{IT_STRING | IT_CVAR, NULL, "Squishdance", &cv_squishdance, 90},
{IT_STRING | IT_CVAR, NULL, "Squishdance Speed", &cv_squishdancespeed, 96},
};
static const char* OP_PlayerDistortTooltips[] =
@@ -1866,8 +1794,6 @@ static const char* OP_PlayerDistortTooltips[] =
"Sprite rotation on slopes. Can either be just players or all objects.",
"Distance object rotation should be visable.",
"Player rotation when sliptiding.",
"Slightly tilt the player when driving over stairs or small bumps.",
"Sound effect when driving over stairs or small bumps.",
"Rotation of a player's boost trails and drift sparks.",
"Should banans rotate when thrown?\nAnd should they stay rotated when on the ground?",
"Player squash and stretch.",
@@ -1878,7 +1804,7 @@ static const char* OP_PlayerDistortTooltips[] =
"Player hop squash and stretch.",
"Should the player rotation be kept during player hop.",
"Do a funny squishy dance when holding CUSTOM 3.",
"Speed of the Squishy dance in SPM (Squishes Per Minute).",
"Speed of the Squishy dance in BPM.",
};
enum
@@ -1887,8 +1813,6 @@ enum
sloperotate,
slrotatedist,
sliptide,
stairjank,
stairjanksfx,
sparkrotate,
bananrotat,
stretchyplayer,
@@ -1929,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[] =
@@ -1971,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.",
@@ -2581,11 +2502,6 @@ menu_t OP_Joystick2Def = DEFAULTSCROLLSTYLE("M_CONTRO", OP_Joystick2Menu, &OP
menu_t OP_Joystick3Def = DEFAULTSCROLLSTYLE("M_CONTRO", OP_Joystick3Menu, &OP_AllControlsDef, 30, 36, NULL);
menu_t OP_Joystick4Def = DEFAULTSCROLLSTYLE("M_CONTRO", OP_Joystick4Menu, &OP_AllControlsDef, 30, 36, NULL);
menu_t OP_Joystick1RumbleDef = DEFAULTSCROLLSTYLE("M_CONTRO", OP_Joystick1RumbleMenu, &OP_Joystick1Def, 30, 36, NULL);
menu_t OP_Joystick2RumbleDef = DEFAULTSCROLLSTYLE("M_CONTRO", OP_Joystick2RumbleMenu, &OP_Joystick2Def, 30, 36, NULL);
menu_t OP_Joystick3RumbleDef = DEFAULTSCROLLSTYLE("M_CONTRO", OP_Joystick3RumbleMenu, &OP_Joystick3Def, 30, 36, NULL);
menu_t OP_Joystick4RumbleDef = DEFAULTSCROLLSTYLE("M_CONTRO", OP_Joystick4RumbleMenu, &OP_Joystick4Def, 30, 36, NULL);
menu_t OP_JoystickSetDef =
{
"M_CONTRO",
@@ -2677,7 +2593,7 @@ menu_t OP_Player2CamOptionsDef = DEFAULTMENUSTYLE(NULL, OP_Player2CamOptionsMenu
menu_t OP_Player3CamOptionsDef = DEFAULTMENUSTYLE(NULL, OP_Player3CamOptionsMenu, &OP_CamOptionsDef, 30, 30, OP_PlayerCamOptionsTooltips);
menu_t OP_Player4CamOptionsDef = DEFAULTMENUSTYLE(NULL, OP_Player4CamOptionsMenu, &OP_CamOptionsDef, 30, 30, OP_PlayerCamOptionsTooltips);
menu_t OP_ChatOptionsDef = DEFAULTSCROLLSTYLE("M_HUD", OP_ChatOptionsMenu, &OP_HUDOptionsDef, 30, 25, OP_ChatOptionsTooltips);
menu_t OP_ChatOptionsDef = DEFAULTMENUSTYLE("M_HUD", OP_ChatOptionsMenu, &OP_HUDOptionsDef, 30, 30, OP_ChatOptionsTooltips);
menu_t OP_SoundAdvancedDef = DEFAULTSCROLLSTYLE("M_SOUND", OP_SoundAdvancedMenu, &OP_SoundOptionsDef, 30, 30, OP_SoundAdvancedTooltips);
@@ -2802,15 +2718,6 @@ void PDistort_menu_Onchange(void)
OP_PlayerDistortMenu[slrotatedist].status = IT_GRAYEDOUT;
OP_PlayerDistortMenu[saltroll].status = IT_GRAYEDOUT;
}
if (cv_stairjank.value)
{
OP_PlayerDistortMenu[stairjanksfx].status = IT_STRING | IT_CVAR;
}
else
{
OP_PlayerDistortMenu[stairjanksfx].status = IT_GRAYEDOUT;
}
}
void Bird_menu_Onchange(void)
+1 -1
View File
@@ -256,7 +256,7 @@ static boolean M_TextInputHandleBase(textinput_t *input, INT32 key, boolean emot
return true;
}
if (ctrldown && (cv_keyboardlayout.value != 3 || !altdown))
if (ctrldown && (cv_keyboardlayout.value!=3 || !altdown))
{
if (key == 'x' || key == 'X')
{
+1 -1
View File
@@ -44,7 +44,7 @@ boolean M_TextInputHandle(textinput_t *input, INT32 key);
// If currently typing something that looks like an existing emote, return suggestions for it
boolean M_TextInputHandleEmotes(textinput_t *input, INT32 key, emote_autocomplete_t *autocomplete);
#define M_DrawTextInput(x, y, input, flags) M_DrawTextInputScroll((x), (y), (input), (flags), ((input)->buffer_size-2)*8)
#define M_DrawTextInput(x, y, input, flags) M_DrawTextInputScroll((x), (y), (input), (flags), ((input)->buffer_size-1)*8)
void M_DrawTextInputScroll(INT32 x, INT32 y, textinput_t *input, INT32 flags, INT32 MAXINPUTWIDTH);
#endif
+67 -23
View File
@@ -250,8 +250,7 @@ boolean P_Move(mobj_t *actor, fixed_t speed)
I_Assert(movedir < NUMDIRS);
tryx = actor->x + FixedMul(speed*xspeed[movedir], actor->scale);
if (twodmo(actor))
if (UNLIKELY(twodlevel || actor->flags2 & MF2_TWOD))
tryy = actor->y;
else
tryy = actor->y + FixedMul(speed*yspeed[movedir], actor->scale);
@@ -307,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;
@@ -329,7 +329,7 @@ void P_NewChaseDir(mobj_t *actor)
else
d[1] = DI_NODIR;
if (twodmo(actor))
if (twodlevel || actor->flags2 & MF2_TWOD)
d[2] = DI_NODIR;
if (deltay < -FixedMul(10*FRACUNIT, actor->scale))
d[2] = DI_SOUTH;
@@ -619,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)
@@ -873,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;
@@ -931,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;
@@ -1532,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;
}
}
@@ -1568,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;
}
}
@@ -1608,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;
}
}
@@ -2762,11 +2770,9 @@ void A_Invincibility(void *thing)
if (P_IsLocalPlayer(player) && !player->powers[pw_super])
{
S_StopMusic();
if (mariomode)
G_GhostAddColor((INT32) (player - players), GHC_INVINCIBLE);
S_ChangeMusicInternal(mariomode ? "minvnc" : "invinc", false);
S_ChangeMusicInternal((mariomode) ? "minvnc" : "invinc", false);
}
}
@@ -2864,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);
@@ -4003,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
@@ -4112,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);
@@ -4360,7 +4388,7 @@ void A_MouseThink(void *thing)
|| (actor->eflags & MFE_VERTICALFLIP && actor->z + actor->height == actor->ceilingz))
&& !actor->reactiontime)
{
if (twodmo(actor))
if (UNLIKELY(twodlevel || actor->flags2 & MF2_TWOD))
{
if (P_RandomChance(FRACUNIT/2))
actor->angle += ANGLE_180;
@@ -6435,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);
@@ -9224,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;
}
}
@@ -10833,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;
}
}
@@ -10879,7 +10917,10 @@ void A_BrakLobShot(void *thing)
return; // Don't even bother if we've got nothing to aim at.
// Look up actor's current gravity situation
g = P_GetSectorGravity(actor->subsector->sector);
if (actor->subsector->sector->gravity)
g = FixedMul(gravity,(FixedDiv(*actor->subsector->sector->gravity>>FRACBITS, 1000)));
else
g = gravity;
// Look up distance between actor and its target
x = P_AproxDistance(actor->target->x - actor->x, actor->target->y - actor->y);
@@ -10994,7 +11035,10 @@ void A_NapalmScatter(void *thing)
airtime = 16<<FRACBITS;
// Look up actor's current gravity situation
g = P_GetSectorGravity(actor->subsector->sector);
if (actor->subsector->sector->gravity)
g = FixedMul(gravity,(FixedDiv(*actor->subsector->sector->gravity>>FRACBITS, 1000)));
else
g = gravity;
// vy = (g*(airtime-1))/2
vy = FixedMul(g,(airtime-(1<<FRACBITS)))>>1;
+10 -14
View File
@@ -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;
@@ -2338,7 +2334,7 @@ void T_RaiseSector(levelspecthink_t *raise)
fixed_t origspeed = raise->vars[3];
// Slow down as you get closer to the bottom
raise->vars[3] = FixedMul(raise->vars[3], FixedDiv(raise->sector->ceilingheight - raise->vars[7], (raise->vars[5] - raise->vars[7])>>5));
raise->vars[3] = FixedMul(raise->vars[3],FixedDiv(raise->sector->ceilingheight - raise->vars[7], (raise->vars[5] - raise->vars[7])>>5));
if (raise->vars[3] <= origspeed/16)
raise->vars[3] = origspeed/16;
@@ -2349,7 +2345,7 @@ void T_RaiseSector(levelspecthink_t *raise)
{
fixed_t origspeed = raise->vars[3];
// Slow down as you get closer to the top
raise->vars[3] = FixedMul(raise->vars[3], FixedDiv(raise->vars[5] - raise->sector->ceilingheight, (raise->vars[5] - raise->vars[7])>>5));
raise->vars[3] = FixedMul(raise->vars[3],FixedDiv(raise->vars[5] - raise->sector->ceilingheight, (raise->vars[5] - raise->vars[7])>>5));
if (raise->vars[3] <= origspeed/16)
raise->vars[3] = origspeed/16;
+96 -120
View File
@@ -589,7 +589,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
special->momx = special->momy = special->momz = 0;
P_GivePlayerRings(player, 1);
if (nightsmode && special->type != MT_FLINGRING)
if (UNLIKELY((maptol & TOL_NIGHTS) && special->type != MT_FLINGRING))
P_DoNightsScore(player);
break;
@@ -601,7 +601,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
special->momx = special->momy = 0;
P_GivePlayerRings(player, 1);
if (nightsmode && special->type != MT_FLINGCOIN)
if (UNLIKELY((maptol & TOL_NIGHTS) && special->type != MT_FLINGCOIN))
P_DoNightsScore(player);
break;
case MT_BLUEBALL:
@@ -617,7 +617,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
else
special->scalespeed = 4*FRACUNIT/5;
if (nightsmode)
if (UNLIKELY(maptol & TOL_NIGHTS))
P_DoNightsScore(player);
break;
case MT_AUTOPICKUP:
@@ -831,7 +831,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
{
S_StartSound(toucher, special->info->seesound);
if (nightsplayer(player))
if (UNLIKELY(player->pflags & PF_NIGHTSMODE))
{
player->bumpertime = TICRATE/2;
if (special->threshold > 0)
@@ -883,20 +883,18 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
break;
case MT_HOOPCOLLIDE:
// This produces a kind of 'domino effect' with the hoop's pieces.
for (; special != NULL && special->hprev != NULL; special = special->hprev); // Move to the first sprite in the hoop
for (; special->hprev != NULL; special = special->hprev); // Move to the first sprite in the hoop
i = 0;
for (; special != NULL && special->type == MT_HOOP; special = special->hnext)
for (; special->hnext != NULL && special->type == MT_HOOP; special = special->hnext)
{
if (!P_MobjWasRemoved(special))
if (!P_MobjWasRemoved(special->target))
{
special->fuse = 11;
special->movedir = i;
if (!P_MobjWasRemoved(special->target))
{
special->extravalue1 = special->target->extravalue1;
special->extravalue2 = special->target->extravalue2;
special->target->threshold = 4242;
}
special->extravalue1 = special->target->extravalue1;
special->extravalue2 = special->target->extravalue2;
special->target->threshold = 4242;
}
i++;
}
@@ -1133,7 +1131,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
S_StartSound(toucher, special->info->painsound);
return;
}
else if ((nightsplayer(player) && (player->pflags & PF_DRILLING)) || (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING))
else if (UNLIKELY((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING)) || (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING))
|| player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object?
{
// Shatter the shield!
@@ -1464,11 +1462,49 @@ boolean P_CheckRacers(void)
return false;
}
static void P_UpdateRemovedOrbital(mobj_t *target, mobj_t *inflictor, mobj_t *source)
/** Kills an object.
*
* \param target The victim.
* \param inflictor The attack weapon. May be NULL (environmental damage).
* \param source The attacker. May be NULL.
* \todo Cleanup, refactor, split up.
* \sa P_DamageMobj
*/
void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
{
mobjtype_t item;
mobj_t *mo;
int ms;
if (target->flags & (MF_ENEMY|MF_BOSS))
target->momx = target->momy = target->momz = 0;
// SRB2kart
if (target->type != MT_PLAYER && !(target->flags & MF_MONITOR)
&& !(target->type == MT_ORBINAUT || target->type == MT_ORBINAUT_SHIELD
|| target->type == MT_JAWZ || target->type == MT_JAWZ_DUD || target->type == MT_JAWZ_SHIELD
|| target->type == MT_BANANA || target->type == MT_BANANA_SHIELD
|| target->type == MT_EGGMANITEM || target->type == MT_EGGMANITEM_SHIELD
|| target->type == MT_BALLHOG || target->type == MT_SPB)) // kart dead items
target->flags |= MF_NOGRAVITY; // Don't drop Tails 03-08-2000
else
target->flags &= ~MF_NOGRAVITY; // lose it if you for whatever reason have it, I'm looking at you shields
//
if (target->flags2 & MF2_NIGHTSPULL)
P_SetTarget(&target->tracer, NULL);
// dead target is no more shootable
target->flags &= ~(MF_SHOOTABLE|MF_FLOAT|MF_SPECIAL);
target->flags2 &= ~(MF2_SKULLFLY|MF2_NIGHTSPULL);
target->health = 0; // This makes it easy to check if something's dead elsewhere.
if (LUA_HookMobjDeath(target, inflictor, source) || P_MobjWasRemoved(target))
return;
// SRB2kart
// I wish I knew a better way to do this
if (!P_MobjWasRemovedCompat(target->target) && target->target->player && !P_MobjWasRemovedCompat(target->target->player->mo))
if (target->target && target->target->player && target->target->player->mo)
{
if (target->target->player->kartstuff[k_eggmanheld] && target->type == MT_EGGMANITEM_SHIELD)
target->target->player->kartstuff[k_eggmanheld] = 0;
@@ -1481,7 +1517,7 @@ static void P_UpdateRemovedOrbital(mobj_t *target, mobj_t *inflictor, mobj_t *so
{
if (target->movedir != 0 && target->movedir < (UINT16)target->target->player->kartstuff[k_itemamount])
{
if (!P_MobjWasRemovedCompat(target->target->hnext))
if (target->target->hnext)
K_KillBananaChain(target->target->hnext, inflictor, source);
target->target->player->kartstuff[k_itemamount] = 0;
@@ -1510,60 +1546,14 @@ static void P_UpdateRemovedOrbital(mobj_t *target, mobj_t *inflictor, mobj_t *so
P_SetTarget(&target->target->hnext, NULL);
}
}
}
/** Kills an object.
*
* \param target The victim.
* \param inflictor The attack weapon. May be NULL (environmental damage).
* \param source The attacker. May be NULL.
* \todo Cleanup, refactor, split up.
* \sa P_DamageMobj
*/
void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
{
mobjtype_t item;
mobj_t *mo;
int ms;
if (target->flags & (MF_ENEMY|MF_BOSS))
target->momx = target->momy = target->momz = 0;
// SRB2kart
if (target->type != MT_PLAYER
&& !(target->flags & MF_MONITOR)
&& !(target->type == MT_ORBINAUT || target->type == MT_ORBINAUT_SHIELD
|| target->type == MT_JAWZ || target->type == MT_JAWZ_DUD || target->type == MT_JAWZ_SHIELD
|| target->type == MT_BANANA || target->type == MT_BANANA_SHIELD
|| target->type == MT_EGGMANITEM || target->type == MT_EGGMANITEM_SHIELD
|| target->type == MT_BALLHOG || target->type == MT_SPB)) // kart dead items
target->flags |= MF_NOGRAVITY; // Don't drop Tails 03-08-2000
else
target->flags &= ~MF_NOGRAVITY; // lose it if you for whatever reason have it, I'm looking at you shields
//
if (target->flags2 & MF2_NIGHTSPULL)
P_SetTarget(&target->tracer, NULL);
// dead target is no more shootable
target->flags &= ~(MF_SHOOTABLE|MF_FLOAT|MF_SPECIAL);
target->flags2 &= ~(MF2_SKULLFLY|MF2_NIGHTSPULL);
target->health = 0; // This makes it easy to check if something's dead elsewhere.
if (LUA_HookMobjDeath(target, inflictor, source) || P_MobjWasRemoved(target))
return;
P_UpdateRemovedOrbital(target, inflictor, source);
// Above block does not clean up rocket sneakers when a player dies, so we need to do it here target->target is null when using rocket sneakers
if (target->player)
{
// Above block does not clean up rocket sneakers when a player dies, so we need to do it here target->target is null when using rocket sneakers
K_DropRocketSneaker(target->player);
// Let EVERYONE know what happened to a player! 01-29-2002 Tails
if (!target->player->spectator)
target->flags2 &= ~MF2_DONTDRAW;
// Let EVERYONE know what happened to a player! 01-29-2002 Tails
if (target->player && !target->player->spectator)
{
target->flags2 &= ~MF2_DONTDRAW;
}
// if killed by a player
@@ -1573,7 +1563,6 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
{
P_SetTarget(&target->target, source);
source->player->numboxes++;
if (cv_itemrespawn.value && (netgame || multiplayer))
{
target->fuse = cv_itemrespawntime.value*TICRATE + 2; // Random box generation
@@ -1591,41 +1580,35 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
target->player->playerstate = PST_DEAD;
if (P_IsLocalPlayer(target->player))
if (cv_fading.value && P_IsLocalPlayer(target->player))
{
if (cv_fading.value)
{
if (netgame || multiplayer)
ms = cv_respawntime.value * 1000;
else
ms = 1000;
if (netgame || multiplayer)
ms = cv_respawntime.value * 1000;
else
ms = 1000;
/*
* If the time spent with the music paused is less than half
* a second, continue playing the song (just mute it).
*/
if ((ms - cv_respawnfademusicout.value) < 500)
S_FadeMusic(0, cv_respawnfademusicout.value);
else
S_FadeOutStopMusic(cv_respawnfademusicout.value);
}
/*
If the time spent with the music paused is less than half
a second, continue playing the song (just mute it).
*/
if ((ms - cv_respawnfademusicout.value) < 500)
S_FadeMusic(0, cv_respawnfademusicout.value);
else
S_FadeOutStopMusic(cv_respawnfademusicout.value);
}
if (target->player == &players[consoleplayer])
for (UINT8 i = 0; i <= splitscreen; i++)
{
if (target->player == P_GetLocalPlayerForNum(i))
{
// don't die in auto map,
// switch view prior to dying
if (automapactive)
if (i == 0 && automapactive)
AM_Stop();
}
for (UINT8 i = 0; i <= splitscreen; i++)
{
if (target->player == P_GetLocalPlayerForNum(i))
{
// added : 22-02-98: recenter view for next life...
localaiming[i] = 0;
break;
}
// added : 22-02-98: recenter view for next life...
localaiming[i] = 0;
break;
}
}
@@ -1641,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)
@@ -1695,7 +1678,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
else
prandom = P_RandomKey(5); // No placable object, just use a random number.
switch (prandom)
switch(prandom)
{
default: item = MT_BUNNY; break;
case 1: item = MT_BIRD; break;
@@ -2239,24 +2222,18 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
return false;
// well no clue but this may happen ig
if (P_MobjWasRemovedCompat(target))
return false;
if (target->health <= 0)
if (!target || (target->health <= 0))
return false;
// Spectator handling
if (netgame)
{
if (target->player && target->player->spectator)
{
if (damage == DMG_SPECTATOR)
damage = DMG_INSTAKILL;
else
return false;
}
if (damage == DMG_SPECTATOR && target->player && target->player->spectator)
damage = DMG_INSTAKILL;
else if (target->player && target->player->spectator)
return false;
if (!P_MobjWasRemovedCompat(source) && source->player && source->player->spectator)
if (source && source->player && source->player->spectator)
return false;
}
@@ -2350,17 +2327,16 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
if (player->exiting)
return false;
if (UNLIKELY(!(target->player->pflags & (PF_NIGHTSMODE|PF_NIGHTSFALL)) && nightsmode))
if (UNLIKELY(!(target->player->pflags & (PF_NIGHTSMODE|PF_NIGHTSFALL)) && (maptol & TOL_NIGHTS)))
return false;
}
if (nightsplayer(player)) // NiGHTS damage handling
if (UNLIKELY(player->pflags & PF_NIGHTSMODE)) // NiGHTS damage handling
{
if (!force)
{
if (source == target)
return false; // Don't hit yourself with your own paraloop, baka
if (source && source->player && !cv_friendlyfire.value
&& (gametype == GT_COOP
|| (G_GametypeHasTeams() && target->player->ctfteam == source->player->ctfteam)))
@@ -2410,7 +2386,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
else if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->powers[pw_flashing])
{
if (!force) // shoulddamage bypasses all of that.
if (!force) // shoulddamage bypasses all of that.
{
K_DoInstashield(player);
return false;
@@ -2599,7 +2575,7 @@ void P_PlayerRingBurst(player_t *player, INT32 num_rings)
ns = FixedMul(((i*FRACUNIT)/16)+2*FRACUNIT, mo->scale);
mo->momx = FixedMul(FINECOSINE(fa),ns);
if (!twodmo(player->mo))
if (LIKELY(!(twodlevel || (player->mo->flags2 & MF2_TWOD))))
mo->momy = FixedMul(FINESINE(fa),ns);
P_SetObjectMomZ(mo, 8*FRACUNIT, false);
@@ -2623,7 +2599,7 @@ void P_PlayerRingBurst(player_t *player, INT32 num_rings)
ns = FixedMul(momxy, mo->scale);
mo->momx = FixedMul(FINECOSINE(fa),ns);
if (!twodmo(player->mo))
if (LIKELY(!(twodlevel || (player->mo->flags2 & MF2_TWOD))))
mo->momy = FixedMul(FINESINE(fa),ns);
ns = momz;
@@ -2730,7 +2706,7 @@ void P_PlayerWeaponPanelBurst(player_t *player)
ns = FixedMul(3*FRACUNIT, mo->scale);
mo->momx = FixedMul(FINECOSINE(fa),ns);
if (!twodmo(player->mo))
if (LIKELY(!(twodlevel || (player->mo->flags2 & MF2_TWOD))))
mo->momy = FixedMul(FINESINE(fa),ns);
P_SetObjectMomZ(mo, 4*FRACUNIT, false);
@@ -2814,7 +2790,7 @@ void P_PlayerWeaponAmmoBurst(player_t *player)
ns = FixedMul(2*FRACUNIT, mo->scale);
mo->momx = FixedMul(FINECOSINE(fa), ns);
if (!twodmo(player->mo))
if (LIKELY(!(twodlevel || (player->mo->flags2 & MF2_TWOD))))
mo->momy = FixedMul(FINESINE(fa),ns);
P_SetObjectMomZ(mo, 3*FRACUNIT, false);
@@ -2930,7 +2906,7 @@ void P_PlayerEmeraldBurst(player_t *player, boolean toss)
momx = FixedMul(FINECOSINE(fa), ns);
if (!twodmo(player->mo))
if (LIKELY(!(twodlevel || (player->mo->flags2 & MF2_TWOD))))
momy = FixedMul(FINESINE(fa),ns);
else
momy = 0;
@@ -2987,7 +2963,7 @@ void P_PlayerFlagBurst(player_t *player, boolean toss)
{
angle_t fa = P_RandomByte()*FINEANGLES/256;
flag->momx = FixedMul(FINECOSINE(fa), FixedMul(6*FRACUNIT, player->mo->scale));
if (!twodmo(player->mo))
if (LIKELY(!(twodlevel || (player->mo->flags2 & MF2_TWOD))))
flag->momy = FixedMul(FINESINE(fa), FixedMul(6*FRACUNIT, player->mo->scale));
}
+10 -17
View File
@@ -59,12 +59,8 @@ extern "C" {
#define AIMINGTOSLOPE(aiming) FINESINE((aiming>>ANGLETOFINESHIFT) & FINEMASK)
// unused modes, kept for compat
#define nightsmode (UNLIKELY(maptol & TOL_NIGHTS))
#define nightsplayer(player) (UNLIKELY((player)->pflags & PF_NIGHTSMODE))
#define mariomode (UNLIKELY(maptol & TOL_MARIO))
#define twodlevel (UNLIKELY(maptol & TOL_2D))
#define twodmo(mobj) (UNLIKELY(twodlevel || ((mobj)->flags2 & MF2_TWOD)))
#define mariomode (maptol & TOL_MARIO)
#define twodlevel (maptol & TOL_2D)
//
// P_TICK
@@ -103,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;
@@ -121,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;
@@ -217,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);
@@ -277,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);
@@ -291,17 +295,6 @@ FUNCINLINE static ATTRINLINE boolean P_MobjWasRemoved(const mobj_t *mobj)
return (!mobj || mobj->thinker.function != (actionf_p1)P_MobjThinker);
}
// stupid, but kart allows mobjs that are marked to be removed to be accessed and modified in many cases
// so can only check if its not NULL in vanilla compat mode
FUNCINLINE static ATTRINLINE boolean P_MobjWasRemovedCompat(const mobj_t *mobj)
{
#ifdef COMPAT_VANILLA
return (!mobj);
#else
return P_MobjWasRemoved(mobj);
#endif
}
fixed_t P_MobjFloorZ(mobj_t *mobj, sector_t *sector, sector_t *boundsec, fixed_t x, fixed_t y, line_t *line, boolean lowest, boolean perfect);
fixed_t P_MobjCeilingZ(mobj_t *mobj, sector_t *sector, sector_t *boundsec, fixed_t x, fixed_t y, line_t *line, boolean lowest, boolean perfect);
#define P_GetFloorZ(mobj, sector, x, y, line) P_MobjFloorZ(mobj, sector, NULL, x, y, line, false, false)
+73 -180
View File
@@ -136,17 +136,14 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
if (object->eflags & MFE_SPRUNG) // Object was already sprung this tic
return false;
if (object->player)
{
// Spectators don't trigger springs.
if (object->player->spectator)
return false;
// Spectators don't trigger springs.
if (object->player && object->player->spectator)
return false;
if (nightsplayer(object->player))
{
/*Someone want to make these work like bumpers?*/
return false;
}
if (UNLIKELY(object->player && (object->player->pflags & PF_NIGHTSMODE)))
{
/*Someone want to make these work like bumpers?*/
return false;
}
object->standingslope = NULL; // Okay, now we can't return - no launching off at silly angles for you.
@@ -163,15 +160,10 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
if (spring->eflags & MFE_VERTICALFLIP)
vertispeed *= -1;
// Vertical springs teleport you on TOP of them.
if (vertispeed > 0)
{
object->z = spring->z + spring->height + 1;
}
else if (vertispeed < 0)
{
object->z = spring->z - object->height - 1;
}
else
{
// Horizontal springs teleport you in FRONT of them.
@@ -197,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);
@@ -211,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))));
}
}
@@ -223,9 +215,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
if (object->player)
{
if (spring->flags & MF_ENEMY) // Spring shells
{
P_SetTarget(&spring->target, object);
}
if (horizspeed && object->player->cmd.forwardmove == 0 && object->player->cmd.sidemove == 0)
{
@@ -322,16 +312,16 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (thing == tmthing)
return true;
// Ignore... things.
if (!tmthing || P_MobjWasRemoved(thing))
return true;
I_Assert(!P_MobjWasRemoved(tmthing));
I_Assert(!P_MobjWasRemoved(thing));
// Ignore... things.
if (P_MobjWasRemovedCompat(tmthing) || P_MobjWasRemoved(thing))
return true;
// Ignore spectators
if ((tmthing->player && tmthing->player->spectator)
|| (thing->player && thing->player->spectator))
|| (thing->player && thing->player->spectator))
return true;
#ifdef SEENAMES
@@ -360,13 +350,12 @@ static boolean PIT_CheckThing(mobj_t *thing)
}
#endif
if ((thing->flags & MF_NOCLIPTHING) || !(thing->flags & (MF_SOLID|MF_SPECIAL|MF_PAIN|MF_SHOOTABLE)))
if (!(thing->flags & (MF_SOLID|MF_SPECIAL|MF_PAIN|MF_SHOOTABLE)) || (thing->flags & MF_NOCLIPTHING))
return true;
// Don't collide with your buddies while NiGHTS-flying.
if (nightsmode &&
tmthing->player && thing->player &&
(nightsplayer(tmthing->player) || nightsplayer(thing->player)))
if (UNLIKELY(tmthing->player && thing->player && (maptol & TOL_NIGHTS)
&& ((tmthing->player->pflags & PF_NIGHTSMODE) || (thing->player->pflags & PF_NIGHTSMODE))))
return true;
blockdist = thing->radius + tmthing->radius;
@@ -730,11 +719,11 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (thing->type != MT_PLAYER)
return true;
if (thing->player)
{
if (thing->player->powers[pw_flashing])
return true;
if (thing->player && thing->player->powers[pw_flashing])
return true;
if (thing->type == MT_PLAYER && thing->player)
{
if (tmthing->state == &states[S_MINEEXPLOSION1])
K_ExplodePlayer(thing->player, tmthing->target, tmthing);
else
@@ -1088,7 +1077,6 @@ static boolean PIT_CheckThing(mobj_t *thing)
thing->momy -= FixedMul(PUSHACCEL, thing->scale);
tmthing->momy += FixedMul(PUSHACCEL, thing->scale);
}
if (tmthing->momx > 0 && tmthing->momx > FixedMul(4*FRACUNIT, thing->scale)
&& tmthing->momx > thing->momx)
{
@@ -1106,7 +1094,6 @@ static boolean PIT_CheckThing(mobj_t *thing)
thing->momx = FixedMul(thing->info->speed, thing->scale);
else if (thing->momx < -FixedMul(thing->info->speed, thing->scale))
thing->momx = -FixedMul(thing->info->speed, thing->scale);
if (thing->momy > FixedMul(thing->info->speed, thing->scale))
thing->momy = FixedMul(thing->info->speed, thing->scale);
else if (thing->momy < -FixedMul(thing->info->speed, thing->scale))
@@ -1118,7 +1105,6 @@ static boolean PIT_CheckThing(mobj_t *thing)
tmthing->momx = FixedMul(4*FRACUNIT, thing->scale);
else if (tmthing->momx < FixedMul(-4*FRACUNIT, thing->scale))
tmthing->momx = FixedMul(-4*FRACUNIT, thing->scale);
if (tmthing->momy > FixedMul(4*FRACUNIT, thing->scale))
tmthing->momy = FixedMul(4*FRACUNIT, thing->scale);
else if (tmthing->momy < FixedMul(-4*FRACUNIT, thing->scale))
@@ -1140,7 +1126,6 @@ static boolean PIT_CheckThing(mobj_t *thing)
P_TouchSpecialThing(thing, tmthing, true); // can remove thing
return true;
}
// check again for special pickup
if (tmthing->flags & MF_SPECIAL && thing->player)
{
@@ -1524,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;
@@ -1586,27 +1571,23 @@ 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])
return true; // didn't hit it
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; // didn't hit it
return true;
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
}
@@ -1828,14 +1809,14 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y)
delta1 = abs(thing->z - midheight);
delta2 = abs(thingtop - midheight);
if ((topheight > tmfloorz) && (delta1 < delta2)
if (topheight > tmfloorz && delta1 < delta2
&& !(rover->flags & FF_REVERSEPLATFORM))
{
tmfloorz = tmdropoffz = topheight;
tmfloorslope = *rover->t_slope;
}
if ((bottomheight < tmceilingz) && (delta1 >= delta2)
if (bottomheight < tmceilingz && delta1 >= delta2
&& !(rover->flags & FF_PLATFORM)
&& !(thing->type == MT_SKIM && (rover->flags & FF_SWIMMABLE)))
{
@@ -1890,7 +1871,8 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y)
po->validcount = validcount;
if (!(po->flags & POF_SOLID) || !P_BBoxInsidePolyobj(po, tmbbox))
if (!P_BBoxInsidePolyobj(po, tmbbox)
|| !(po->flags & POF_SOLID))
{
plink = (polymaplink_t *)(plink->link.next);
continue;
@@ -2135,7 +2117,7 @@ static boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam)
po->validcount = validcount;
if (!(po->flags & POF_SOLID) || !P_PointInsidePolyobj(po, x, y))
if (!P_PointInsidePolyobj(po, x, y) || !(po->flags & POF_SOLID))
{
plink = (polymaplink_t *)(plink->link.next);
continue;
@@ -2385,11 +2367,8 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
fixed_t tryx = thing->x;
fixed_t tryy = thing->y;
fixed_t radius = thing->radius;
fixed_t thingtop;//= thing->z + thing->height;
fixed_t thingtop ;//= thing->z + thing->height;
fixed_t startingonground = P_IsObjectOnGround(thing);
fixed_t stairjank = 0;
pslope_t *oldslope = thing->standingslope;
INT32 special = -1;
floatok = false;
if (radius < MAXRADIUS/2)
@@ -2423,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) // this should use the target coords not the ones were started with, but cant fix that for compat reasons!
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;
}
@@ -2458,23 +2427,23 @@ 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;
const boolean flipped =
(thing->eflags & MFE_VERTICALFLIP) != 0;
// Step up
if (thing->z < tmfloorz)
{
if (tmfloorz - thing->z <= maxstep)
{
if (maxstep > 0 && !flipped)
{
stairjank = (tmfloorz - thing->z);
}
thing->z = thing->floorz = tmfloorz;
thing->eflags |= MFE_JUSTSTEPPEDDOWN;
}
@@ -2487,11 +2456,6 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
{
if (thingtop - tmceilingz <= maxstep)
{
if (maxstep > 0 && flipped)
{
stairjank = (thingtop - tmceilingz);
}
thing->z = ( thing->ceilingz = tmceilingz ) - thing->height;
thing->eflags |= MFE_JUSTSTEPPEDDOWN;
}
@@ -2501,28 +2465,18 @@ 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.
if (thingtop == thing->ceilingz && tmceilingz > thingtop && tmceilingz - thingtop <= maxstep)
{
if (flipped)
{
stairjank = (tmceilingz - thingtop);
}
thing->z = (thing->ceilingz = tmceilingz) - thing->height;
thing->eflags |= MFE_JUSTSTEPPEDDOWN;
}
else if (thing->z == thing->floorz && tmfloorz < thing->z && thing->z - tmfloorz <= maxstep)
{
if (!flipped)
{
stairjank = (thing->z - tmfloorz);
}
thing->z = thing->floorz = tmfloorz;
thing->eflags |= MFE_JUSTSTEPPEDDOWN;
}
@@ -2598,26 +2552,6 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
else // don't set standingslope if you're not going to clip against it
thing->standingslope = NULL;
/* FIXME: slope step down (even up) has some false
positives, so just ignore them entirely. */
if (stairjank && !oldslope && !thing->standingslope && thing->player && !thing->player->spectator)
{
/* use a shorter sound if not two tics have passed
* since the last step */
//S_ReducedVFXSound(thing, (thing->player->stairjank >= 16 ? sfx_s23b : sfx_s268), NULL);
//S_StartSound(thing, (thing->player->stairjank >= 16 ? sfx_s23b : sfx_s268));
// sound does not work out all that well for kart maps
// best i can do...
if (cv_stairjank.value && cv_stairjanksfx.value)
S_StartSoundAtVolume(thing, (thing->player->stairjank >= 8 ? sfx_s23b : sfx_s268), 192); // dont blast this at full volume lul
// Can't spawn things during P_TryMove, because global variables :)
thing->player->stairjank = 9;
//thing->player->stairjank = 17;
}
thing->x = x;
thing->y = y;
@@ -2668,7 +2602,7 @@ boolean P_SceneryTryMove(mobj_t *thing, fixed_t x, fixed_t y)
if (tmfloorz - thing->z > maxstep)
return false; // too big a step up
}
} while (tryx != x || tryy != y);
} while(tryx != x || tryy != y);
// the move is ok,
// so link the thing into its new position
@@ -3163,9 +3097,6 @@ void P_SlideMove(mobj_t *mo, boolean forceslide)
INT16 hitcount = 0;
boolean success = false;
if (P_MobjWasRemovedCompat(mo))
return;
if (tmhitthing && mo->z + mo->height > tmhitthing->z && mo->z < tmhitthing->z + tmhitthing->height)
{
// Don't mess with your momentum if it's a pushable object. Pushables do their own crazy things already.
@@ -3202,9 +3133,6 @@ void P_SlideMove(mobj_t *mo, boolean forceslide)
bestslideline = NULL;
retry:
if (P_MobjWasRemovedCompat(mo))
return;
if (++hitcount == 3)
goto stairstep; // don't loop forever
@@ -3253,13 +3181,7 @@ retry:
// the move must have hit the middle, so stairstep
stairstep:
if (!P_TryMove(mo, mo->x, mo->y + mo->momy, true)) //Allow things to drop off.
{
if (P_MobjWasRemovedCompat(mo))
return;
P_TryMove(mo, mo->x + mo->momx, mo->y, true);
}
return;
}
@@ -3271,12 +3193,7 @@ stairstep:
newy = FixedMul(mo->momy, bestslidefrac);
if (!P_TryMove(mo, mo->x + newx, mo->y + newy, true))
{
goto stairstep;
}
if (P_MobjWasRemovedCompat(mo))
return;
}
// Now continue along the wall.
@@ -3295,7 +3212,7 @@ stairstep:
if (bestslideline != NULL)
P_HitSlideLine(bestslideline); // clip the moves
if (twodmo(mo) && mo->player)
if (UNLIKELY((twodlevel || (mo->flags2 & MF2_TWOD)) && mo->player))
{
mo->momx = tmxmove;
tmymove = 0;
@@ -3347,11 +3264,8 @@ stairstep:
goto retry;
}
if (P_MobjWasRemovedCompat(mo))
return;
success = true;
} while (tmxmove || tmymove);
} while(tmxmove || tmymove);
}
//
@@ -3364,18 +3278,12 @@ void P_BouncePlayerMove(mobj_t *mo)
{
fixed_t leadx, leady;
fixed_t trailx, traily;
fixed_t mmomx, mmomy;
fixed_t oldmomx, oldmomy;
fixed_t mmomx = 0, mmomy = 0;
fixed_t oldmomx = mo->momx, oldmomy = mo->momy;
if (P_MobjWasRemovedCompat(mo))
if (!mo->player)
return;
if (mo->player == NULL)
return;
oldmomx = mo->momx;
oldmomy = mo->momy;
if (mo->player->spectator)
{
P_SlideMove(mo, true);
@@ -3464,9 +3372,6 @@ void P_BouncePlayerMove(mobj_t *mo)
if (!P_TryMove(mo, mo->x + tmxmove, mo->y + tmymove, true))
{
if (P_MobjWasRemovedCompat(mo))
return;
P_TryMove(mo, mo->x - oldmomx, mo->y - oldmomy, true);
}
}
@@ -3484,9 +3389,6 @@ void P_BounceMove(mobj_t *mo)
INT32 hitcount;
fixed_t mmomx = 0, mmomy = 0;
if (P_MobjWasRemovedCompat(mo))
return;
if (mo->player)
{
P_BouncePlayerMove(mo);
@@ -3503,9 +3405,6 @@ void P_BounceMove(mobj_t *mo)
hitcount = 0;
retry:
if (P_MobjWasRemovedCompat(mo))
return;
if (++hitcount == 3)
goto bounceback; // don't loop forever
@@ -3564,12 +3463,7 @@ bounceback:
newy = FixedMul(mmomy, bestslidefrac);
if (!P_TryMove(mo, mo->x + newx, mo->y + newy, true))
{
if (P_MobjWasRemovedCompat(mo))
return;
goto bounceback;
}
}
// Now continue along the wall.
@@ -3643,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);
@@ -3662,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
}
@@ -3766,7 +3659,7 @@ static boolean PIT_ChangeSector(mobj_t *thing, boolean realcrush)
delta1 = abs(thing->z - midheight);
delta2 = abs(thingtop - midheight);
if ((bottomheight <= thing->ceilingz) && (delta1 >= delta2))
if (bottomheight <= thing->ceilingz && delta1 >= delta2)
{
if (thing->flags & MF_PUSHABLE)
{
@@ -4108,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.
@@ -4224,7 +4117,7 @@ void P_CreateSecNodeList(mobj_t *thing, fixed_t x, fixed_t y)
* Must clear tmthing at tic end, as it might contain a pointer to a removed thinker, or the level might have ended/been ended and we clear the objects it was pointing too. Hopefully we don't need to carry this between tics for sync. */
void P_MapStart(void)
{
if (tmthing)
if (UNLIKELY(tmthing))
I_Error("P_MapStart: tmthing set!");
}
@@ -4276,7 +4169,7 @@ fixed_t P_FloorzAtPos(fixed_t x, fixed_t y, fixed_t z, fixed_t height)
delta1 = abs(z - midheight);
delta2 = abs(thingtop - midheight);
if ((topheight > floorz) && (delta1 < delta2))
if (topheight > floorz && delta1 < delta2)
floorz = topheight;
}
}
+56 -116
View File
@@ -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;
@@ -326,7 +326,7 @@ void P_CameraLineOpening(line_t *linedef)
{
for (rover = front->ffloors; rover; rover = rover->next)
{
fixed_t topheight, bottomheight, midheight;
fixed_t topheight, bottomheight;
if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || UNLIKELY(GETSECSPECIAL(rover->master->frontsector->special, 4) == 12))
continue;
@@ -334,10 +334,8 @@ void P_CameraLineOpening(line_t *linedef)
topheight = P_CameraGetFOFTopZ(mapcampointer, front, rover, tmx, tmy, linedef);
bottomheight = P_CameraGetFOFBottomZ(mapcampointer, front, rover, tmx, tmy, linedef);
midheight = (bottomheight + ((topheight - bottomheight) / 2));
delta1 = abs(mapcampointer->z - midheight);
delta2 = abs(thingtop - midheight);
delta1 = abs(mapcampointer->z - (bottomheight + ((topheight - bottomheight)/2)));
delta2 = abs(thingtop - (bottomheight + ((topheight - bottomheight)/2)));
if (bottomheight < lowestceiling && delta1 >= delta2)
lowestceiling = bottomheight;
@@ -356,7 +354,7 @@ void P_CameraLineOpening(line_t *linedef)
{
for (rover = back->ffloors; rover; rover = rover->next)
{
fixed_t topheight, bottomheight, midheight;
fixed_t topheight, bottomheight;
if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || UNLIKELY(GETSECSPECIAL(rover->master->frontsector->special, 4) == 12))
continue;
@@ -364,10 +362,8 @@ void P_CameraLineOpening(line_t *linedef)
topheight = P_CameraGetFOFTopZ(mapcampointer, back, rover, tmx, tmy, linedef);
bottomheight = P_CameraGetFOFBottomZ(mapcampointer, back, rover, tmx, tmy, linedef);
midheight = (bottomheight + ((topheight - bottomheight) / 2));
delta1 = abs(mapcampointer->z - midheight);
delta2 = abs(thingtop - midheight);
delta1 = abs(mapcampointer->z - (bottomheight + ((topheight - bottomheight)/2)));
delta2 = abs(thingtop - (bottomheight + ((topheight - bottomheight)/2)));
if (bottomheight < lowestceiling && delta1 >= delta2)
lowestceiling = bottomheight;
@@ -402,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;
@@ -427,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
@@ -528,7 +524,7 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
// Check for frontsector's fake floors
for (rover = front->ffloors; rover; rover = rover->next)
{
fixed_t topheight, bottomheight, midheight;
fixed_t topheight, bottomheight;
if (!(rover->flags & FF_EXISTS))
continue;
@@ -542,10 +538,8 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
topheight = P_GetFOFTopZ(mobj, front, rover, tmx, tmy, linedef);
bottomheight = P_GetFOFBottomZ(mobj, front, rover, tmx, tmy, linedef);
midheight = (bottomheight + ((topheight - bottomheight) / 2));
delta1 = abs(mobj->z - midheight);
delta2 = abs(thingtop - midheight);
delta1 = abs(mobj->z - (bottomheight + ((topheight - bottomheight)/2)));
delta2 = abs(thingtop - (bottomheight + ((topheight - bottomheight)/2)));
if (delta1 >= delta2 && !(rover->flags & FF_PLATFORM)) // thing is below FOF
{
@@ -573,7 +567,7 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
// Check for backsectors fake floors
for (rover = back->ffloors; rover; rover = rover->next)
{
fixed_t topheight, bottomheight, midheight;
fixed_t topheight, bottomheight;
if (!(rover->flags & FF_EXISTS))
continue;
@@ -586,10 +580,8 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
topheight = P_GetFOFTopZ(mobj, back, rover, tmx, tmy, linedef);
bottomheight = P_GetFOFBottomZ(mobj, back, rover, tmx, tmy, linedef);
midheight = (bottomheight + ((topheight - bottomheight) / 2));
delta1 = abs(mobj->z - midheight);
delta2 = abs(thingtop - midheight);
delta1 = abs(mobj->z - (bottomheight + ((topheight - bottomheight)/2)));
delta2 = abs(thingtop - (bottomheight + ((topheight - bottomheight)/2)));
if (delta1 >= delta2 && !(rover->flags & FF_PLATFORM)) // thing is below FOF
{
@@ -619,10 +611,8 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
{
const sector_t *polysec = linedef->backsector;
const fixed_t polymid = (polysec->floorheight + ((polysec->ceilingheight - polysec->floorheight) / 2));
delta1 = abs(mobj->z - polymid);
delta2 = abs(thingtop - polymid);
delta1 = abs(mobj->z - (polysec->floorheight + ((polysec->ceilingheight - polysec->floorheight)/2)));
delta2 = abs(thingtop - (polysec->floorheight + ((polysec->ceilingheight - polysec->floorheight)/2)));
if (polysec->floorheight < lowestceiling && delta1 >= delta2)
{
@@ -630,9 +620,7 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
ceilingslope = NULL;
}
else if (polysec->floorheight < highestceiling && delta1 >= delta2)
{
highestceiling = polysec->floorheight;
}
if (polysec->ceilingheight > highestfloor && delta1 < delta2)
{
@@ -640,9 +628,7 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
floorslope = NULL;
}
else if (polysec->ceilingheight > lowestfloor && delta1 < delta2)
{
lowestfloor = polysec->ceilingheight;
}
}
if (highestceiling < highceiling)
@@ -664,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;
}
@@ -719,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))
@@ -822,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)
@@ -856,7 +807,7 @@ void P_SetThingPosition(mobj_t *thing)
// at sector_t->touching_thinglist) are broken. When a node is
// added, new sector links are created.
P_CreateSecNodeList(thing, thing->x, thing->y);
P_CreateSecNodeList(thing,thing->x,thing->y);
thing->touching_sectorlist = sector_list; // Attach to Thing's mobj_t
sector_list = NULL; // clear for next time
}
@@ -872,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;
}
}
@@ -986,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)
@@ -1018,13 +961,11 @@ boolean P_BlockThingsIterator(INT32 x, INT32 y, boolean (*func)(mobj_t *))
for (mobj = blocklinks[y*bmapwidth + x]; mobj; mobj = bnext)
{
P_SetTarget(&bnext, mobj->bnext); // We want to note our reference to bnext here incase it is MF_NOTHINK and gets removed!
if (!func(mobj))
{
P_SetTarget(&bnext, NULL);
return false;
}
if (P_MobjWasRemoved(tmthing) // func just popped our tmthing, cannot continue.
|| (bnext && P_MobjWasRemoved(bnext))) // func just broke blockmap chain, cannot continue.
{
@@ -1032,7 +973,6 @@ boolean P_BlockThingsIterator(INT32 x, INT32 y, boolean (*func)(mobj_t *))
return true;
}
}
P_SetTarget(&bnext, NULL);
return true;
}
+610 -724
View File
File diff suppressed because it is too large. Load diff
+4 -1
View File
@@ -298,7 +298,6 @@ typedef struct mobj_s
angle_t angle, pitch, roll; // orientation
angle_t old_angle, old_pitch, old_roll; // orientation interpolation
angle_t rollangle;
angle_t temprollangle; // same as rollangle but resets each tic, idk either man. // cba exposing this to lua either
spritenum_t sprite; // used to find patch_t and flip value
UINT32 frame; // frame number, plus bits see p_pspr.h
UINT16 anim_duration; // for FF_ANIMATE states
@@ -422,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.
+10 -11
View File
@@ -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
@@ -3059,7 +3057,7 @@ static void P_NetUnArchiveThinkers(savebuffer_t *save)
break;
default:
I_Error("P_NetUnArchiveThinkers: Unknown tclass %d in savegame", tclass);
I_Error("P_UnarchiveSpecials: Unknown tclass %d in savegame", tclass);
}
}
@@ -3170,7 +3168,7 @@ FUNCINLINE static ATTRINLINE void P_UnArchivePolyObjects(savebuffer_t *save)
numSavedPolys = READINT32(save->p);
if (numSavedPolys != numPolyObjects)
I_Error("P_UnArchivePolyObjects: polyobj count inconsistency (expected %d, got %d)\n", numPolyObjects, numSavedPolys);
I_Error("P_UnArchivePolyObjects: polyobj count inconsistency\n");
for (i = 0; i < numSavedPolys; ++i)
P_UnArchivePolyObj(save, &PolyObjects[i]);
@@ -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
{
+214 -570
View File
File diff suppressed because it is too large. Load diff
-4
View File
@@ -35,7 +35,6 @@ extern mapthing_t *deathmatchstarts[MAX_DM_STARTS];
extern INT32 numdmstarts, numcoopstarts, numredctfstarts, numbluectfstarts;
extern boolean levelloading;
extern UINT8 levelfadecol;
extern lumpnum_t lastloadedmaplumpnum; // for comparative savegame
extern virtres_t *curmapvirt;
@@ -115,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
View File
@@ -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 -9
View File
@@ -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
@@ -901,11 +898,6 @@ void P_SlopeLaunch(mobj_t *mo)
//CONS_Printf("Launched off of slope.\n");
mo->standingslope = NULL;
if (mo->player)
{
mo->player->stairjank = 0; // fuck you
}
}
// Function to help handle landing on slopes
+134 -245
View File
@@ -538,7 +538,6 @@ static sector_t *getNextSector(line_t *line, sector_t *sec)
else
return NULL;
}
return line->frontsector;
}
@@ -569,7 +568,6 @@ fixed_t P_FindLowestFloorSurrounding(sector_t *sec)
if (other->floorheight < floorh)
floorh = other->floorheight;
}
return floorh;
}
@@ -883,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;
@@ -891,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;
@@ -901,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;
@@ -1182,7 +1180,7 @@ INT32 P_FindMinSurroundingLight(sector_t *sector, INT32 max)
for (i = 0; i < sector->linecount; i++)
{
line = sector->lines[i];
check = getNextSector(line, sector);
check = getNextSector(line,sector);
if (!check)
continue;
@@ -1236,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;
@@ -1273,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)
@@ -1296,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!
@@ -1310,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)
@@ -1340,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)
{
@@ -1351,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;
}
@@ -1457,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)
{
@@ -1466,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
{
@@ -1474,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)
@@ -1499,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;
@@ -1513,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);
@@ -1528,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;
@@ -1611,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))
@@ -1991,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)
@@ -2100,7 +2082,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
ffloor_t *rover;
boolean foundit = false;
for (rover = mo->subsector->sector->ffloors; rover; rover = rover->next)
for(rover = mo->subsector->sector->ffloors; rover; rover = rover->next)
{
if (rover->master->frontsector->tag != line->tag)
continue;
@@ -2437,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;
@@ -2506,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;
@@ -2521,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;
@@ -2585,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;
}
@@ -2603,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;
}
@@ -2635,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
@@ -2684,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)
@@ -2712,7 +2684,6 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
break;
}
}
}
} while (tryagain);
}
break;
@@ -2990,10 +2961,10 @@ sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 n
{
fixed_t topheight, bottomheight;
if (!(rover->flags & FF_EXISTS))
if (GETSECSPECIAL(rover->master->frontsector->special, section) != number)
continue;
if (GETSECSPECIAL(rover->master->frontsector->special, section) != number)
if (!(rover->flags & FF_EXISTS))
continue;
topheight = P_GetSpecialTopZ(player->mo, sectors + rover->secnum, player->mo->subsector->sector);
@@ -3288,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)
@@ -3342,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)
@@ -3416,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);
@@ -3441,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);
@@ -3475,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;
@@ -3496,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
@@ -3518,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
@@ -3574,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;
@@ -3698,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;
@@ -3745,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;
@@ -3773,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;
@@ -3820,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;
@@ -3840,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)")
{
@@ -3880,7 +3820,7 @@ DoneSection2:
player->kartstuff[k_lapanimation] = 80;
if (nightsplayer(player))
if (UNLIKELY(player->pflags & PF_NIGHTSMODE))
player->drillmeter += 48*20;
if (netgame && player->laps >= (UINT8)cv_numlaps.value)
@@ -4501,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;
@@ -4563,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++)
{
@@ -4599,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;
}
@@ -4683,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
@@ -4790,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;
@@ -4798,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;
@@ -5236,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)
@@ -5302,18 +5222,6 @@ static void P_RunLevelLoadExecutors(void)
}
}
static fixed_t P_GetSectorGravityFactor(sector_t *sec)
{
return FixedDiv(*sec->gravity >> FRACBITS, 1000);
}
fixed_t P_GetSectorGravity(sector_t *sec)
{
if (sec && sec->gravity)
return FixedMul(gravity, P_GetSectorGravityFactor(sec));
return gravity;
}
/** After the map has loaded, scans for specials that spawn 3Dfloors and
* thinkers.
*
@@ -5353,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));
@@ -5365,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
@@ -5378,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())
@@ -5414,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)
@@ -5500,7 +5406,6 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
if ((lines[i].flags & (ML_NOSONIC|ML_NOTAILS)) != (ML_NOSONIC|ML_NOTAILS)) // If you can do something...
{
angle_t flatangle = InvAngle(lines[i].angle);
fixed_t xoffs;
fixed_t yoffs;
@@ -6073,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;
@@ -6520,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
}
@@ -6546,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);
}
}
}
@@ -6601,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
@@ -6625,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);
}
}
}
@@ -6802,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));
@@ -7013,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;
@@ -7047,7 +6941,6 @@ static void P_SpawnFriction(void)
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
Add_Friction(friction, movefactor, s, -1);
}
}
}
/*
@@ -7096,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
@@ -7138,7 +7030,7 @@ static inline boolean PIT_PushThing(mobj_t *thing)
return false;
// Allow this to affect pushable objects at some point?
if (thing->player && (!(thing->flags & (MF_NOGRAVITY | MF_NOCLIP)) || nightsplayer(thing->player)))
if (thing->player && (!(thing->flags & (MF_NOGRAVITY | MF_NOCLIP)) || UNLIKELY(thing->player->pflags & PF_NIGHTSMODE)))
{
INT32 dist;
INT32 speed;
@@ -7150,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);
@@ -7168,7 +7061,7 @@ static inline boolean PIT_PushThing(mobj_t *thing)
// Written with bits and pieces of P_HomingAttack
if ((speed > 0) && (P_CheckSight(thing, tmpusher->source)))
{
if (!nightsplayer(thing->player))
if (LIKELY(!(thing->player->pflags & PF_NIGHTSMODE)))
{
// only push wrt Z if health & 1 (mapthing has ambush flag)
if (tmpusher->source->health & 1)
@@ -7320,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.
@@ -7362,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;
@@ -7501,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;
@@ -7569,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 ;)
{
@@ -7591,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
View File
@@ -56,8 +56,6 @@ sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 n
void P_PlayerInSpecialSector(player_t *player);
void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *roversector);
fixed_t P_GetSectorGravity(sector_t *sec);
fixed_t P_FindLowestFloorSurrounding(sector_t *sec);
fixed_t P_FindHighestFloorSurrounding(sector_t *sec);
+2 -13
View File
@@ -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();
+40 -61
View File
@@ -74,7 +74,7 @@ void P_Thrust(mobj_t *mo, angle_t angle, fixed_t move)
mo->momx += FixedMul(move, FINECOSINE(angle));
if (!twodmo(mo))
if (LIKELY(!(twodlevel || (mo->flags2 & MF2_TWOD))))
mo->momy += FixedMul(move, FINESINE(angle));
}
@@ -90,7 +90,7 @@ void P_InstaThrust(mobj_t *mo, angle_t angle, fixed_t move)
mo->momx = FixedMul(move, FINECOSINE(angle));
if (!twodmo(mo))
if (LIKELY(!(twodlevel || (mo->flags2 & MF2_TWOD))))
mo->momy = FixedMul(move,FINESINE(angle));
}
@@ -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;
}
@@ -475,7 +474,7 @@ void P_PlayLivesJingle(player_t *player)
if (UNLIKELY(use1upSound))
S_StartSound(NULL, sfx_oneup);
else if (mariomode)
else if (UNLIKELY(mariomode))
S_StartSound(NULL, sfx_marioa);
else
{
@@ -503,7 +502,7 @@ void P_PlayRinglossSound(mobj_t *source, mobj_t *damager)
S_StartSound(NULL, sfx);
}
else
S_StartSound(source, mariomode ? sfx_mario8 : sfx_khurt1 + key);
S_StartSound(source, UNLIKELY(mariomode) ? sfx_mario8 : sfx_khurt1 + key);
}
else
S_StartSound(source, sfx_slip);
@@ -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)
@@ -1206,7 +1201,6 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
ghost->pitch = mobj->pitch;
ghost->roll = mobj->roll;
ghost->rollangle = mobj->rollangle;
ghost->temprollangle = mobj->temprollangle;
ghost->sloperoll = mobj->sloperoll;
ghost->slopepitch = mobj->slopepitch;
@@ -1398,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*/)
{
@@ -1519,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;
@@ -1574,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;
@@ -1725,7 +1715,7 @@ static void P_DoBubbleBreath(player_t *player)
else
zh = player->mo->z + FixedDiv(player->mo->height,5*(FRACUNIT/4));
if (!(player->mo->eflags & MFE_UNDERWATER) || player->spectator || ((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL && !nightsplayer(player)))
if (!(player->mo->eflags & MFE_UNDERWATER) || player->spectator || ((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL && !(player->pflags & PF_NIGHTSMODE)))
return;
if (P_RandomChance(FRACUNIT/16))
@@ -1842,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)
@@ -1853,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);
@@ -2119,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)
@@ -2280,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",
@@ -2298,7 +2288,7 @@ static void P_MovePlayer(player_t *player)
P_3dMovement(player);
}
if (twodlevel) // psure this doesent even work at all
if (UNLIKELY(maptol & TOL_2D)) // psure this doesent even work at all
runspd = FixedMul(runspd, 2*FRACUNIT/3);
/////////////////////////
@@ -2362,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)
@@ -2403,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);
}
@@ -2743,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 (twodmo(player->mo) && abs(player->mo->y-mo->y) > player->mo->radius)
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;
@@ -3156,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);
@@ -3491,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;
@@ -3508,7 +3497,7 @@ static boolean P_CheckNoclipCameraPosition(player_t *player, camera_t *thiscam,
boolean cameranoclip;
mobj_t *mo = player->mo;
cameranoclip = (nightsplayer(player)
cameranoclip = ((player->pflags & (PF_NOCLIP|PF_NIGHTSMODE))
|| (mo->flags & (MF_NOCLIP|MF_NOCLIPHEIGHT)) // Noclipping player camera noclips too!!
|| (leveltime < introtime)); // Kart intro cam
@@ -3740,7 +3729,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
fixed_t f1, f2;
// We probably shouldn't move the camera if there is no player or player mobj somehow
if (!player || P_MobjWasRemoved(player->mo))
if (!player || !player->mo)
return true;
// This can happen when joining
@@ -3983,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;
}
@@ -4097,7 +4083,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
angle -= (angle - thiscam->pitch)/2;
}
if (player->playerstate != PST_DEAD && !(nightsplayer(player) && player->exiting))
if (player->playerstate != PST_DEAD && LIKELY(!((player->pflags & PF_NIGHTSMODE) && player->exiting)))
angle += (focusaiming < ANGLE_180 ? focusaiming/2 : InvAngle(InvAngle(focusaiming)/2)); // overcomplicated version of '((signed)focusaiming)/2;'
if (!camstill && !timeover) // Keep the view still...
@@ -4174,7 +4160,7 @@ boolean P_SpectatorJoinGame(player_t *player)
// Team changing in Team Match and CTF
// Pressing fire assigns you to a team that needs players if allowed.
// Partial code reproduction from p_tick.c autobalance code.
else if (G_GametypeHasTeams())
else if (UNLIKELY(G_GametypeHasTeams()))
{
INT32 changeto = 0;
INT32 z, numplayersred = 0, numplayersblue = 0;
@@ -4587,7 +4573,6 @@ void P_PlayerThink(player_t *player)
{
short int i;
mo->flags |= MF_NOCLIPHEIGHT;
for (i = 0; i < 32; i++)
{
// Debug drawing
@@ -4766,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;
@@ -4871,7 +4855,7 @@ void P_PlayerThink(player_t *player)
// Even if not NiGHTS, pull in nearby objects when walking around as John Q. Elliot.
if (UNLIKELY(!objectplacing && !((netgame || multiplayer) && player->spectator)
&& nightsmode && (!nightsplayer(player) || player->powers[pw_nights_helper])))
&& maptol & TOL_NIGHTS && (!(player->pflags & PF_NIGHTSMODE) || player->powers[pw_nights_helper])))
{
thinker_t *th;
mobj_t *mo2;
@@ -4973,7 +4957,7 @@ void P_PlayerThink(player_t *player)
#endif
// check for use
if (!nightsplayer(player))
if (LIKELY(!(player->pflags & PF_NIGHTSMODE)))
{
if (cmd->buttons & BT_BRAKE)
player->pflags |= PF_USEDOWN;
@@ -5090,11 +5074,6 @@ void P_PlayerThink(player_t *player)
player->squishdance.time = 0;
}
if (player->stairjank > 0)
{
player->stairjank--;
}
// Flash player after being hit.
if (!(player->kartstuff[k_hyudorotimer] // SRB2kart - fixes Hyudoro not flashing when it should.
|| player->kartstuff[k_growshrinktimer] > 0 // Grow doesn't flash either.
@@ -5164,7 +5143,7 @@ void P_PlayerAfterThink(player_t *player)
}
}
if (nightsplayer(player))
if (UNLIKELY(player->pflags & PF_NIGHTSMODE))
{
player->powers[pw_gravityboots] = 0;
}
Loaded 100 of 144 files, more files were not shown because too many files have changed in this diff. Show more