Compare commits

..
Author SHA1 Message Date
alufolie91 c65647450a test: always draw 2nd final screen texture
we didnt do this in some cases to save on performance a bit
2026-04-12 15:32:15 +02:00
68 changed files with 1019 additions and 1165 deletions

No files matched your search

-5
View File
@@ -94,7 +94,6 @@
# NOSDLMAIN=1 - ?
# SDLMAIN=1 - ?
# NOLTO=1 - Disable link time optimizations
# USEJEMALLOC=1 Enable building with jemalloc Allocator to replace GLibc malloc, might improve performance
#
# Library configuration flags:
# Everything here is an override.
@@ -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
+23 -11
View File
@@ -526,12 +526,13 @@ static void auxgetstr (lua_State *L, TValue *t, const char *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, &key, L->top, slot);
luaV_finishget(L, t, L->top, L->top, slot);
api_incr_top(L);
}
api_incr_top(L);
lua_unlock(L);
}
@@ -640,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);
@@ -653,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 -2
View File
@@ -55,8 +55,8 @@ struct lua_longjmp {
void luaD_seterrorobj (lua_State *L, int lerrcode, StkId oldtop) {
switch (lerrcode) {
case LUA_ERRMEM: { /* memory error? */
setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */
case LUA_ERRMEM: {
setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG));
break;
}
case LUA_ERRERR: {
-1
View File
@@ -544,7 +544,6 @@ static void atomic (lua_State *L) {
marktmu(g); /* mark `preserved' userdata */
udsize += propagateall(g); /* remark, to propagate `preserveness' */
cleartable(g->weak); /* remove collected objects from weak tables */
luaS_clearcache(g);
/* flip current white */
g->currentwhite = cast_byte(otherwhite(g));
g->sweepstrgc = 0;
-30
View File
@@ -41,25 +41,6 @@ typedef unsigned char lu_byte;
*/
#define IntPoint(p) ((unsigned int)(lu_mem)(p))
/*
** conversion of pointer to unsigned integer: this is for hashing only;
** there is no problem if the integer cannot hold the whole pointer
** value. (In strict ISO C this may cause undefined behavior, but no
** actual machine seems to bother.)
*/
#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \
__STDC_VERSION__ >= 199901L
#include <stdint.h>
#if defined(UINTPTR_MAX) /* even in C99 this type is optional */
#define L_P2I uintptr_t
#else /* no 'intptr'? */
#define L_P2I uintmax_t /* use the largest available integer */
#endif
#else /* C89 option */
#define L_P2I size_t
#endif
#define point2uint(p) ((unsigned int)((L_P2I)(p) & UINT_MAX))
/* type to ensure maximum alignment */
@@ -119,17 +100,6 @@ typedef lu_int32 Instruction;
#endif
/*
** Size of cache for strings in the API. 'N' is the number of
** sets (better be a prime) and "M" is the size of each set (M == 1
** makes a direct cache.)
*/
#ifndef STRCACHE_N
#define STRCACHE_N 53
#define STRCACHE_M 2
#endif
/* minimum size for string buffer */
#ifndef LUA_MINBUFFER
#define LUA_MINBUFFER 32
+2
View File
@@ -13,6 +13,8 @@
#include "llimits.h"
#include "lua.h"
#define MEMERRMSG "not enough memory"
#define luaM_reallocv(L,b,on,n,e) \
((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ? /* +1 to avoid warnings */ \
+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).
+2 -1
View File
@@ -73,9 +73,10 @@ static void f_luaopen (lua_State *L, void *ud) {
stack_init(L, L); /* init stack */
sethvalue(L, gt(L), luaH_new(L, 0, 2)); /* table of globals */
sethvalue(L, registry(L), luaH_new(L, 0, 2)); /* registry */
luaS_init(L);
luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */
luaT_init(L);
luaX_init(L);
luaS_fix(luaS_newliteral(L, MEMERRMSG));
g->GCthreshold = 4*g->totalbytes;
}
-2
View File
@@ -88,11 +88,9 @@ typedef struct global_State {
lua_CFunction panic; /* to be called in unprotected errors */
TValue l_registry;
struct lua_State *mainthread;
TString *memerrmsg; /* memory-error message */
UpVal uvhead; /* head of double-linked list of all open upvalues */
struct Table *mt[NUM_TAGS]; /* metatables for basic types */
TString *tmname[TM_N]; /* array with tag-method names */
TString *strcache[STRCACHE_N][STRCACHE_M]; /* cache for strings in API */
} global_State;
-60
View File
@@ -18,9 +18,6 @@
#include "lstring.h"
#define MEMERRMSG "not enough memory"
void luaS_resize (lua_State *L, int newsize) {
GCObject **newhash;
@@ -75,36 +72,6 @@ static TString *newlstr (lua_State *L, const char *str, size_t l,
}
/*
** Clear API string cache. (Entries cannot be empty, so fill them with
** a non-collectable string.)
*/
void luaS_clearcache (global_State *g) {
int i, j;
for (i = 0; i < STRCACHE_N; i++)
for (j = 0; j < STRCACHE_M; j++) {
if (luaS_iswhite(g->strcache[i][j])) /* will entry be collected? */
g->strcache[i][j] = g->memerrmsg; /* replace it with something fixed */
}
}
/*
** Initialize the string table and the string cache
*/
void luaS_init (lua_State *L) {
global_State *g = G(L);
int i, j;
luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */
/* pre-create memory-error message */
g->memerrmsg = luaS_newliteral(L, MEMERRMSG);
luaS_fix(g->memerrmsg); /* it should never be collected */
for (i = 0; i < STRCACHE_N; i++) /* fill cache with valid strings */
for (j = 0; j < STRCACHE_M; j++)
g->strcache[i][j] = g->memerrmsg;
}
// string hash taken from luaJIT
/* Unaligned load of uint32_t. */
@@ -161,10 +128,6 @@ static inline __attribute__((always_inline)) unsigned luaS_hash (const char *str
#endif
}
/*
** new string (with explicit length)
*/
TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
GCObject *o;
unsigned int h = luaS_hash(str, l);
@@ -184,29 +147,6 @@ TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
}
/*
** Create or reuse a zero-terminated string, first checking in the
** cache (using the string address as a key). The cache can contain
** only zero-terminated strings, so it is safe to use 'strcmp' to
** check hits.
*/
TString *luaS_new (lua_State *L, const char *str) {
unsigned int i = point2uint(str) % STRCACHE_N; /* hash */
int j;
TString **p = G(L)->strcache[i];
for (j = 0; j < STRCACHE_M; j++) {
if (strcmp(str, getstr(p[j])) == 0) /* hit? */
return p[j]; /* that is it */
}
/* normal route */
for (j = STRCACHE_M - 1; j > 0; j--)
p[j] = p[j - 1]; /* move out last element */
/* new element is first in the list */
p[0] = luaS_newlstr(L, str, strlen(str));
return p[0];
}
Udata *luaS_newudata (lua_State *L, size_t s, Table *e) {
Udata *u;
if (l_unlikely(s > MAX_SIZET - sizeof(Udata)))
+2 -6
View File
@@ -17,19 +17,15 @@
#define sizeudata(u) (sizeof(union Udata)+(u)->len)
//#define luaS_new(L, s) (luaS_newlstr(L, s, strlen(s)))
#define luaS_new(L, s) (luaS_newlstr(L, s, strlen(s)))
#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \
(sizeof(s)/sizeof(char))-1))
#define luaS_iswhite(x) test2bits((x)->tsv.marked, WHITE0BIT, WHITE1BIT)
#define luaS_fix(s) l_setbit((s)->tsv.marked, FIXEDBIT)
#define luaS_fix(s) l_setbit((s)->tsv.marked, FIXEDBIT)
LUAI_FUNC void luaS_resize (lua_State *L, int newsize);
LUAI_FUNC void luaS_clearcache (global_State *g);
LUAI_FUNC void luaS_init (lua_State *L);
LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e);
LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l);
LUAI_FUNC TString *luaS_new (lua_State *L, const char *str);
#endif
+46 -22
View File
@@ -136,45 +136,57 @@ void luaV_finishget (lua_State *L, TValue *t, TValue *key, StkId val,
return;
}
t = tm; /* else try to access 'tm[key]' */
if (luaV_fastget(L, t, key, slot, luaH_get)) { /* fast track? */
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); /* get metamethod */
} else {
tm = fasttm(L, h->metatable, TM_USEDINDEX);
}
if (tm == NULL) { /* no metamethod? */
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");
}
@@ -406,6 +418,13 @@ static void Arith (lua_State *L, StkId ra, TValue *rb,
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;
StkId base;
@@ -498,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: {
@@ -510,11 +529,16 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue;
}
case OP_SELF: {
TValue *slot;
StkId ra = RA(i);
StkId rb = RB(i);
TValue *rc = RKC(i);
TString *key = rawtsvalue(rc); /* key must be a string */
setobjs2s(L, ra + 1, rb);
gettableProtected(L, rb, rc, ra);
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: {
+28 -2
View File
@@ -43,6 +43,32 @@
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);
@@ -50,8 +76,8 @@ 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_finishget (lua_State *L, TValue *t, TValue *key,
StkId val, TValue *tm);
LUAI_FUNC void luaV_settable (lua_State *L, TValue *t, TValue *key,
StkId val);
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);
+21 -172
View File
@@ -208,6 +208,14 @@ static void CONS_Clear_f(void)
Unlock_state();
}
// Choose english keymap
//
/*static void CONS_English_f(void)
{
shiftxform = english_shiftxform;
CONS_Printf(M_GetText("%s keymap.\n"), M_GetText("English"));
}*/
static char *bindtable[NUMINPUTS];
static void CONS_Bind_f(void)
@@ -625,186 +633,27 @@ void CON_MoveConsole(void)
Unlock_state();
}
//======================================================================
// KEYBOARD LAYOUTS FOR ENTERING TEXT
//======================================================================
static char english_shiftxform[] =
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31,
' ', '!', '"', '#', '$', '%', '&',
'"', // shift-'
'(', ')', '*', '+',
'<', // shift-,
'_', // shift--
'>', // shift-.
'?', // shift-/
')', // shift-0
'!', // shift-1
'@', // shift-2
'#', // shift-3
'$', // shift-4
'%', // shift-5
'^', // shift-6
'&', // shift-7
'*', // shift-8
'(', // shift-9
':',
':', // shift-;
'<',
'+', // shift-=
'>', '?', '@',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'{', // shift-[
'|', // shift-backslash - OH MY GOD DOES WATCOM SUCK
'}', // shift-]
'"', '_',
'~', // shift-`
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'{', '|', '}', '~', 127
};
static char french_shiftxform[] =
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31,
' ','$', //shift-!
'3', //shift-"
'#', '$', '%',
'1', //shift-&
'4', // shift-'
'5', // shift-(
')', // shift-)
'*', '+',
'?', // shift-,
'6', // shift--
'.', '/',
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9',
'/', // shitf-:
'.', // shift-;
'>', // shift-<
'+', // shift-=
'>', '?', '@',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'[', '\\', ']', '^',
'8', //shift-_
'`',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'{', '|', '}', '~', 127,
128, 129,
'2',
131, 132,
'0',
134,
'9',
136, 137,
'7',
139, 140,
'%'
};
static char french_altgrxform[] =
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31,
' ', '!',
'#', //altgr-"
'#', '$', '%', '&',
'{', //altgr-'
'[', //altgr-(
']', //altgr-)
'*', '+', ',',
'|', //altg--
'.', '/',
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9',
':', ';', '<',
'}', //altgr-=
'>', '?', '@',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'[', '\\', ']', '^',
'\\', //altgr-backslash
'`',
'a', 'b', 'c', 'd', 'E', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'{', '|', '}', '~', 127,
128, 129,
'~',
131, 132,
'@',
134,
'^',
136, 137,
'`',
139, 140,
KEY_FR_U_GRAVE
};
// fallback for special letter non displayable in the game (i.e.: 'é','à',etc.)
static INT32 CON_FallBackFrSpecialLetter(INT32 key)
{
switch (key)
{
case KEY_FR_E_AIGUE: return 'e';
case KEY_FR_E_GRAVE: return 'e';
case KEY_FR_C_CEDILLE: return 'c';
case KEY_FR_A_GRAVE: return 'a';
case KEY_FR_U_GRAVE: return 'u';
default: return key;
}
}
// goddang AZERTY
static size_t CON_GetShiftSize(void)
{
return ((cv_keyboardlayout.value == 3) ? sizeof(french_shiftxform) : sizeof(english_shiftxform));
}
static char *CON_Shiftform(void)
{
return (cv_keyboardlayout.value == 3) ? french_shiftxform : english_shiftxform;
}
INT32 CON_ShiftChar(INT32 ch)
{
if (I_UseNativeKeyboard() || ch >= (INT32)CON_GetShiftSize())
if (I_UseNativeKeyboard())
return ch;
// warning: shiftdown is NOT a boolean, it's 1 or 2 for lshift/rshift
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
{
return !!shiftdown != capslock ? CON_Shiftform()[ch] : ch;
if (shiftdown ^ capslock)
ch = shiftxform[ch];
}
// if we're holding shift we should still shift non letter symbols
if (shiftdown)
else // if we're holding shift we should still shift non letter symbols
{
return CON_Shiftform()[ch];
}
// AZERTY
if (cv_keyboardlayout.value == 3)
{
if (altdown & 0x2)
return french_altgrxform[ch];
return CON_FallBackFrSpecialLetter(ch);
if (shiftdown)
ch = shiftxform[ch];
else if (cv_keyboardlayout.value == 3)
{
if (altdown & 0x2)
ch = french_altgrxform[ch];
else
ch = HU_FallBackFrSpecialLetter(ch);
}
}
return ch;
+30 -44
View File
@@ -1255,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));
@@ -1483,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);
@@ -1499,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));
@@ -1542,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));
@@ -2228,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 &&
@@ -3392,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)
{
@@ -5631,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)
@@ -5674,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);
@@ -5685,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);
@@ -5695,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);
+37 -9
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];
@@ -371,10 +370,23 @@ static void D_MakeIntermissionBG(void)
if (rendermode == render_none)
{
lastdraw = false;
intermissionbginit = false;
return;
}
// no more valid map
// shouldnt happen at this point, but better safe than sorry!
if (!numsectors)
{
lastdraw = false;
return;
}
// need to render level again for this
// should be fine since at this point we did not unload it yet
if (cv_renderview.value)
{
D_Renderview();
}
#ifdef HWRENDER
if (rendermode == render_opengl)
{
@@ -387,7 +399,6 @@ static void D_MakeIntermissionBG(void)
}
lastdraw = false;
intermissionbginit = true;
}
static boolean D_Display(void)
@@ -547,6 +558,8 @@ static boolean D_Display(void)
break;
}
D_MakeIntermissionBG();
if (gamestate == GS_LEVEL)
{
// draw the view directly
@@ -555,8 +568,6 @@ static boolean D_Display(void)
PS_START_TIMING(ps_rendercalltime);
D_Renderview();
PS_STOP_TIMING(ps_rendercalltime);
D_MakeIntermissionBG();
}
PS_START_TIMING(ps_uitime);
@@ -722,15 +733,13 @@ void D_SRB2Loop(void)
precise_t elapsed;
precise_t enterprecise, finishprecise;
boolean ranwipe = false;
enterprecise = I_GetPreciseTime();
if (I_Interrupted())
{
I_Quit();
}
enterprecise = I_GetPreciseTime();
memset(&g_dc, 0, sizeof(g_dc));
Z_Frame_Reset();
@@ -738,6 +747,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)
@@ -1405,6 +1416,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
@@ -1434,6 +1447,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; }
@@ -1592,6 +1606,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
+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
+27 -59
View File
@@ -1010,7 +1010,6 @@ void D_RegisterClientCommands(void)
CV_RegisterVar(&cv_gamepadled[i]);
}
CV_RegisterVar(&cv_gamepadifunfocused);
CV_RegisterVar(&cv_gamepadledifunfocused);
CV_RegisterVar(&cv_rumbleifunfocused);
@@ -1214,22 +1213,13 @@ static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
if (len == 0 || len > MAXPLAYERNAME)
return false; // Empty or too long.
if (name[0] == ' ')
return false; // Starts with a space.
if (name[0] == ' ' || name[len-1] == ' ')
return false; // Starts or ends with a space.
if (isdigit(name[0]))
return false; // Starts with a digit.
if (name[0] == '@' || name[0] == '~')
return false; // Starts with an admin symbol.
// Clean up trailing whitespace.
while (len && name[len-1] == ' ')
{
name[len-1] = '\0';
len--;
}
if (len == 0)
return false;
// Check if it contains a non-printing character.
// Note: ANSI C isprint() considers space a printing character.
// Also don't allow semicolons, since they are used as
@@ -1282,8 +1272,7 @@ static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
* is restored to what it was before.
*
* We assume that if playernum is ::consoleplayer or ::secondarydisplayplayer
* (unless clientjoin is true, a necessary evil)
* the console variable ::cv_playername to ::cv_playername4 respectively is
* the console variable ::cv_playername or ::cv_playername2 respectively is
* already set to newname. However, the player name table is assumed to
* contain the old name.
*
@@ -1303,10 +1292,6 @@ static void CleanupPlayerName(INT32 playernum, const char *newname)
char *tmpname = NULL;
INT32 i;
boolean namefailed = true;
boolean clientjoin = !!(playernum >= MAXPLAYERS);
if (clientjoin)
playernum -= MAXPLAYERS;
buf = Z_StrDup(newname);
@@ -1363,21 +1348,18 @@ static void CleanupPlayerName(INT32 playernum, const char *newname)
}
// no stealing another player's name
if (!clientjoin)
for (i = 0; i < MAXPLAYERS; i++)
{
for (i = 0; i < MAXPLAYERS; i++)
if (i != playernum && playeringame[i]
&& fasticmp(tmpname, player_names[i]))
{
if (i != playernum && playeringame[i]
&& fasticmp(tmpname, player_names[i]))
{
break;
}
}
if (i < MAXPLAYERS)
break;
}
}
if (i < MAXPLAYERS)
break;
// name is okay then
namefailed = false;
} while (0);
@@ -1387,23 +1369,15 @@ static void CleanupPlayerName(INT32 playernum, const char *newname)
// set consvars whether namefailed or not, because even if it succeeded,
// spaces may have been removed
if (clientjoin)
{
consvar_t *namevars[] = {&cv_playername, &cv_playername2, &cv_playername3, &cv_playername4};
CV_StealthSet(namevars[playernum], tmpname);
}
else
{
if (playernum == consoleplayer)
CV_StealthSet(&cv_playername, tmpname);
else if (playernum == displayplayers[1] || (!netgame && playernum == 1))
CV_StealthSet(&cv_playername2, tmpname);
else if (playernum == displayplayers[2] || (!netgame && playernum == 2))
CV_StealthSet(&cv_playername3, tmpname);
else if (playernum == displayplayers[3] || (!netgame && playernum == 3))
CV_StealthSet(&cv_playername4, tmpname);
else I_Assert(((void)"CleanupPlayerName used on non-local player", 0));
}
if (playernum == consoleplayer)
CV_StealthSet(&cv_playername, tmpname);
else if (playernum == displayplayers[1] || (!netgame && playernum == 1))
CV_StealthSet(&cv_playername2, tmpname);
else if (playernum == displayplayers[2] || (!netgame && playernum == 2))
CV_StealthSet(&cv_playername3, tmpname);
else if (playernum == displayplayers[3] || (!netgame && playernum == 3))
CV_StealthSet(&cv_playername4, tmpname);
else I_Assert(((void)"CleanupPlayerName used on non-local player", 0));
Z_Free(buf);
}
@@ -1521,9 +1495,7 @@ static void ForceAllSkins(INT32 forcedskin)
}
static INT32 chmappending;
#ifdef PARANOIA
static INT32 snacpending[MAXSPLITSCREENPLAYERS];
#endif
// wonky compat, idk if anything uses this....
#define playerisbot (splitplayer == 1 && botingame)
@@ -1623,9 +1595,7 @@ static void SendNameAndColor(UINT8 splitplayer)
return;
}
#ifdef PARANOIA
snacpending[splitplayer]++;
#endif
// Don't change name if muted
if (player_name_changes[pnum] >= MAXNAMECHANGES)
@@ -1661,7 +1631,7 @@ static void SendNameAndColor(UINT8 splitplayer)
static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
{
player_t *player;
player_t *player = &players[playernum];
char name[MAXPLAYERNAME+1] = {};
UINT8 color, skin;
@@ -1670,18 +1640,14 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
I_Error("There is no player %d!", playernum);
#endif
player = &players[playernum];
#ifdef PARANOIA
if (P_IsLocalPlayer(player))
{
const INT32 localpnum = P_GetLocalPlayerNumForPlayer(player);
snacpending[localpnum]--;
if (snacpending[localpnum] < 0)
I_Error("snacpending negative for player %d!", localpnum);
}
snacpending[playernum]--;
#ifdef PARANOIA
if (snacpending[playernum] < 0)
I_Error("snacpending negative!");
#endif
}
READSTRINGN(*cp, name, MAXPLAYERNAME);
color = READUINT8(*cp);
@@ -2222,6 +2188,7 @@ void D_SetupVote(void)
WRITEUINT8(p, secondgt);
secondgt &= ~0x80;
for (i = 0; i < 4; i++)
{
UINT16 m;
@@ -5848,6 +5815,7 @@ static void BaseNumLaps_OnChange(void)
}
}
static void KartFrantic_OnChange(void)
{
if ((boolean)cv_kartfrantic.value != franticitems && gamestate == GS_LEVEL && leveltime > starttime)
+13 -26
View File
@@ -735,10 +735,6 @@ const char *I_GetJoyName(INT32 joyindex)
return NULL;
}
void I_SetJoystickFocus(void)
{
}
boolean I_GamepadHasLED(INT32 playernum)
{
(void)playernum;
@@ -1023,13 +1019,8 @@ static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_ms
sigmsg = ("SIGSEGV - SRB2Kart-Saturn has attempted to access a memory location that it shouldn't and needs to close.");
break;
#ifdef SIGTERM
case SIGTERM: // Software termination signal from terminate
sigmsg = ("SIGTERM - SRB2Kart-Saturn was terminated by a terminate signal.");
break;
#endif
#ifdef SIGKILL
case SIGKILL: // Software termination signal from kill
sigmsg = ("SIGKILL - SRB2Kart-Saturn was terminated by a kill signal.");
case SIGTERM: // Software termination signal from kill
sigmsg = ("SIGTERM - SRB2Kart-Saturn was terminated by a kill signal.");
break;
#endif
#ifdef SIGBREAK
@@ -1362,28 +1353,18 @@ static void I_Fork(void)
I_RegisterChildSignals();
break;
default:
// ignore those, those are handled by child process
// otherwise parent might exit before it
// and the below stuff wont run and your terminal will be left in an awkward state
#ifdef SIGINT
signal(SIGINT, SIG_IGN);
#endif
#ifdef SIGBREAK
signal(SIGBREAK, SIG_IGN);
#endif
#ifdef SIGTERM
signal(SIGTERM, SIG_IGN);
#endif
if (logstream)
fclose(logstream);/* the child has this */
c = wait(&status);
#ifdef LOGMESSAGES
/* By the way, exit closes files. */
logstream = fopen(logfilename, "at");
#else
logstream = 0;
#endif
if (c == -1)
{
kill(child, SIGKILL);
@@ -1445,6 +1426,7 @@ void I_Quit(void)
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
@@ -1472,6 +1454,7 @@ void I_Quit(void)
free(myargv); // Deallocate allocated memory
death:
W_Shutdown();
exit(0);
}
@@ -1517,6 +1500,7 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
I_OutputMsg("SRB2Kart %s Recursive Error", buffer);
W_Shutdown();
exit(-1); // recursive errors detected
}
}
@@ -1534,6 +1518,8 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
#endif
// ---
I_ShutdownConsole();
M_SaveConfig(NULL); // save game config, cvars..
D_SaveBan(); // save the ban list
G_SaveGameData(false); // Tails 12-08-2002
@@ -1549,6 +1535,8 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
I_ShutdownGraphics();
I_ShutdownSystem();
W_Shutdown();
#if defined (PARANOIA) && defined (__CYGWIN__)
*(INT32 *)2 = 4; //Alam: Debug!
#endif
@@ -1654,10 +1642,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])
-1
View File
@@ -113,7 +113,6 @@ extern UINT8 window_notinfocus; // are we in focus? (backend independant -- hand
extern boolean nodrawers;
extern boolean lastdraw;
extern boolean intermissionbginit;
#ifdef MOTIONBLUR
extern INT32 postimgparam[MAXSPLITSCREENPLAYERS];
-1
View File
@@ -81,7 +81,6 @@ consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS] = {
{"gamepadled4", "Skincolor", CV_SAVE|CV_CALL|CV_NOINIT, gamepadled_cons_t, led_off_handle4, 0, NULL, NULL, 0, 0, NULL}
};
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};
-1
View File
@@ -116,7 +116,6 @@ extern consvar_t cv_rumble[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_gamepadifunfocused;
extern consvar_t cv_gamepadledifunfocused;
extern consvar_t cv_rumbleifunfocused;
+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;
+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);
+2 -2
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
+43 -48
View File
@@ -258,7 +258,9 @@ static void CV_screentextures_OnChange(void)
if (cv_glframebuffer.value != 0)
CV_SetValue(&cv_glframebuffer, 0);
#endif
intermissionbginit = false;
// HACK: set lastdraw so intermission bg can refresh after toggling screentextures
if (gamestate == GS_INTERMISSION)
lastdraw = true;
}
GL_SetSpecialState(HWD_SET_SCREEN_TEXTURES, cv_glscreentextures.value);
M_UpdateOGLMenu();
@@ -275,7 +277,6 @@ static void CV_glframebuffer_OnChange(void)
I_DownSample();
RefreshOGLSDLSurface();
M_UpdateOGLMenu();
intermissionbginit = false;
}
#endif
@@ -511,7 +512,7 @@ static FUINT HWR_CalcWallLight(FUINT lightnum, seg_t *seg, extracolormap_t *colo
{
INT16 finallight = lightnum;
if (cv_glfakecontrast.value == 0 || (colormap && HWR_ShouldUsePaletteRendering()))
if (cv_glfakecontrast.value == 0 || (HWR_ShouldUsePaletteRendering() && colormap))
return (FUINT)finallight;
if (seg != NULL && P_ApplyLightOffsetFine(lightnum, seg->frontsector))
@@ -696,7 +697,7 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool
vert->z = (vy);\
\
}
for (i = 0, v3d = planeVerts; i < (INT32)nrPlaneVerts; i++, v3d++, pv++)
for (i = 0, v3d = planeVerts; i < (INT32)nrPlaneVerts; i++,v3d++, pv++)
SETUP3DVERT(v3d, pv->x, pv->y);
if (slope)
@@ -2673,7 +2674,7 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling,
float anglef = 0.0f, cosangf = 0.0f, sinangf = 0.0f;
angle_t angle = 0;
FSurfaceInfo Surf = {};
float tempxsow, tempytow;
fixed_t tempxsow, tempytow;
size_t nrPlaneVerts;
static FOutVector *planeVerts = NULL;
@@ -3801,7 +3802,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite)
{
const fixed_t h = P_GetLightZAt(&sector->lightlist[i], sprmo->x, sprmo->y);
if (h > temp)
if (!(h <= temp))
continue;
if (!lightset)
@@ -3863,7 +3864,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite)
wallVerts[1].y = endbot;
// The x and y only need to be adjusted in the case that it's not a papersprite
if (cv_glspritebillboarding.value && !cv_glshearing.value && !papersprite)
if (cv_glspritebillboarding.value && !papersprite)
{
// Get the x and z of the vertices so billboarding draws correctly
realheight = realbot - realtop;
@@ -3936,7 +3937,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
mobj_t *sprmo = spr->mobj;
if (!sprmo->subsector)
if (UNLIKELY(!sprmo->subsector))
return;
const boolean papersprite = (sprmo->frame & FF_PAPERSPRITE);
@@ -4100,7 +4101,7 @@ static void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr)
const precipmobj_t *sprmo = spr->precip;
if (!sprmo->subsector)
if (UNLIKELY(!sprmo->subsector))
return;
// cache sprite graphics
@@ -4300,23 +4301,22 @@ static std::vector<gl_drawnode_t> drawnodes;
static void *HWR_CreateDrawNode(gl_drawnode_type_t type)
{
gl_drawnode_t *drawnode;
// if we didnt alloc anything yet, reserve atleast 64 nodes
// dont declare with it as we want our size to be 0!
drawnodes.reserve(DRAWNODES_INIT_SIZE);
drawnodes.emplace_back();
drawnode = &drawnodes.back();
drawnode->type = type;
drawnodes.back().type = type;
// not sure if returning different pointers to a union is necessary
switch (type)
{
case DRAWNODE_PLANE:
return &drawnode->u.plane;
return &drawnodes.back().u.plane;
case DRAWNODE_POLYOBJECT_PLANE:
return &drawnode->u.polyplane;
return &drawnodes.back().u.polyplane;
case DRAWNODE_WALL:
return &drawnode->u.wall;
return &drawnodes.back().u.wall;
}
return NULL;
@@ -4383,7 +4383,9 @@ static int CompareDrawNodePlanes(const void *p1, const void *p2)
static void HWR_RenderDrawNodes(void)
{
size_t i = 0, run_start = 0;
static std::vector<INT32> sortindex(DRAWNODES_INIT_SIZE);
static std::vector<INT32> sortindex;
sortindex.reserve(DRAWNODES_INIT_SIZE);
// Array for storing the rendering order.
// A list of indices into the drawnodes array.
@@ -4818,9 +4820,11 @@ static void HWR_ProjectSprite(mobj_t *thing)
)
{
ang = R_PointToAngle(interp.x, interp.y);
#ifdef ROTSPRITE
camang = ang;
#endif
ang -= interp.angle;
if (mirrored)
@@ -4855,9 +4859,9 @@ static void HWR_ProjectSprite(mobj_t *thing)
flip ^= (1<<rot);
}
spr_width = spritecachedinfo[lumpoff].width;
spr_height = spritecachedinfo[lumpoff].height;
spr_offset = spritecachedinfo[lumpoff].offset;
spr_width = spritecachedinfo[lumpoff].width;
spr_height = spritecachedinfo[lumpoff].height;
spr_offset = spritecachedinfo[lumpoff].offset;
spr_topoffset = spritecachedinfo[lumpoff].topoffset;
#ifdef ROTSPRITE
@@ -4943,11 +4947,11 @@ static void HWR_ProjectSprite(mobj_t *thing)
// if the sprite is out of our view, dont need to draw it X)
if (!gld_SphereInFrustum(
(FixedToFloat(interp.x)) + cos_inv_yaw * (x1 + x2) / 2.0f,
FixedToFloat(interp.z) + (y1 + y2) / 2.0f,
FixedToFloat(interp.y) - sin_inv_yaw * (x1 + x2) / 2.0f,
//1.5 == sqrt(2) + small delta for MF_FOREGROUND
std::max<float>(FixedToFloat(spr_width) * spritexscale,
FixedToFloat(spr_height) * spriteyscale) / 2.0f * 1.5f))
FixedToFloat(interp.z) + (y1 + y2) / 2.0f,
FixedToFloat(interp.y) - sin_inv_yaw * (x1 + x2) / 2.0f,
//1.5 == sqrt(2) + small delta for MF_FOREGROUND
std::max<float>(FixedToFloat(spr_width) * spritexscale,
FixedToFloat(spr_height) * spriteyscale) / 2.0f * 1.5f))
{
return;
}
@@ -5006,10 +5010,10 @@ static void HWR_ProjectSprite(mobj_t *thing)
vis->flip = flip;
vis->scale = thing_scale;
/*vis->spritexscale = spritexscale;
vis->spritexscale = spritexscale;
vis->spriteyscale = spriteyscale;
vis->spritexoffset = FixedToFloat(spr_offset);
vis->spriteyoffset = FixedToFloat(spr_topoffset);*/
vis->spriteyoffset = FixedToFloat(spr_topoffset);
#ifdef ROTSPRITE
if (rotsprite != NULL)
@@ -5138,9 +5142,9 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
lumpoff = sprframe->lumpid[0];
flip = sprframe->flip; // Will only be 0x00 or 0xFF
spr_width = spritecachedinfo[lumpoff].width;
spr_height = spritecachedinfo[lumpoff].height;
spr_offset = spritecachedinfo[lumpoff].offset;
spr_width = spritecachedinfo[lumpoff].width;
spr_height = spritecachedinfo[lumpoff].height;
spr_offset = spritecachedinfo[lumpoff].offset;
spr_topoffset = spritecachedinfo[lumpoff].topoffset;
if (flip)
@@ -5163,11 +5167,11 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
if (!gld_SphereInFrustum(
(FixedToFloat(interp.x)) + cos_inv_yaw * (x1 + x2) / 2.0f,
FixedToFloat(interp.z) + (y1 + y2) / 2.0f,
FixedToFloat(interp.y) - sin_inv_yaw * (x1 + x2) / 2.0f,
//1.5 == sqrt(2) + small delta for MF_FOREGROUND
std::max<float>(FixedToFloat(spr_width) * thing_scale,
FixedToFloat(spr_height) * thing_scale) / 2.0f * 1.5f))
FixedToFloat(interp.z) + (y1 + y2) / 2.0f,
FixedToFloat(interp.y) - sin_inv_yaw * (x1 + x2) / 2.0f,
//1.5 == sqrt(2) + small delta for MF_FOREGROUND
std::max<float>(FixedToFloat(spr_width) * thing_scale,
FixedToFloat(spr_height) * thing_scale) / 2.0f * 1.5f))
{
return;
}
@@ -5280,6 +5284,7 @@ void HWR_ClearSkyDome(void)
sky->loops = NULL;
sky->data = NULL;
sky->vbo = 0;
sky->rows = sky->columns = 0;
sky->loopcount = 0;
@@ -5691,12 +5696,6 @@ extern "C" {
// ==========================================================================
static void HWR_RenderFrame(boolean skybox, boolean drawsky)
{
// NetUpdate below may cause this to be false midrender if toggled
const boolean useportals = HWR_UsePortals();
if (useportals)
GL_EnableStencilTest();
// Clear view, set viewport (glViewport), set perspective...
HWR_ClearView();
@@ -5714,7 +5713,7 @@ static void HWR_RenderFrame(boolean skybox, boolean drawsky)
viewwindowy,
(viewwindowx + viewwidth),
(viewwindowy + viewheight),
ZCLIP_PLANE, clipping_distances[renderdist - 1]);
ZCLIP_PLANE, clipping_distances[renderdist - 1]);
current_bsp_culling_distance = bsp_culling_distances[renderdist- 1];
}
@@ -5722,14 +5721,11 @@ static void HWR_RenderFrame(boolean skybox, boolean drawsky)
NetUpdate();
portalclipline = NULL;
if (useportals)
if (UNLIKELY(HWR_UsePortals()))
HWR_RenderViewpoint<RenderViewpointType::kPortal>(NULL, 0, !skybox);
else
HWR_RenderViewpoint<RenderViewpointType::kNormal>(NULL, 0, !skybox);
if (useportals)
GL_DisableStencilTest();
// Check for new console commands.
NetUpdate();
}
@@ -6096,8 +6092,7 @@ static void HWR_DoPostProcessor(void)
}
}
// screen textures are needed for the rest of the effects
if (cv_glscreentextures.value != 2)
if (cv_glscreentextures.value != 2) // screen textures are needed for the rest of the effects
return;
// Not supported in splitscreen - someone want to add support?
+2 -2
View File
@@ -161,9 +161,9 @@ 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
+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;
+16 -35
View File
@@ -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
@@ -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
// -----------------+
@@ -3260,6 +3243,14 @@ static void GL_Framebuffer_Generate(void)
if (!framebufferobject.fboobj)
pglGenFramebuffers(1, &framebufferobject.fboobj);
if (pglCheckFramebufferStatus(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
{
// if this fails, dont retry it a gazillion times
// this wouldnt recover
supportFBO = false;
return;
}
// Bind the framebuffer
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj);
@@ -3311,18 +3302,6 @@ static void GL_Framebuffer_Generate(void)
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
}
if (pglCheckFramebufferStatus(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
{
//pglGetError(); TODO:implement this or smth
GL_MSG_Error("GL_Framebuffer_Generate: Failed to create Framebuffer Object");
// if this fails, dont retry it a gazillion times
// this wouldnt recover
supportFBO = false;
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
return;
}
// Unbind the framebuffer
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
@@ -3345,10 +3324,6 @@ void GL_Framebuffer_Enable(void)
GL_Framebuffer_Generate();
// failed
if (!supportFBO || !framebufferobject.init)
return;
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj);
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, framebufferobject.rboobj);
}
@@ -3743,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;
@@ -3796,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);
@@ -3803,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];
}
+156 -2
View File
@@ -115,8 +115,155 @@ static patch_t *songcreditbg = NULL;
// -------
static void HU_DrawRankings(void);
consvar_t cv_showspecstuff = {"showspecstuff", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
//======================================================================
// KEYBOARD LAYOUTS FOR ENTERING TEXT
//======================================================================
char *shiftxform = NULL;
char english_shiftxform[] =
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31,
' ', '!', '"', '#', '$', '%', '&',
'"', // shift-'
'(', ')', '*', '+',
'<', // shift-,
'_', // shift--
'>', // shift-.
'?', // shift-/
')', // shift-0
'!', // shift-1
'@', // shift-2
'#', // shift-3
'$', // shift-4
'%', // shift-5
'^', // shift-6
'&', // shift-7
'*', // shift-8
'(', // shift-9
':',
':', // shift-;
'<',
'+', // shift-=
'>', '?', '@',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'{', // shift-[
'|', // shift-backslash - OH MY GOD DOES WATCOM SUCK
'}', // shift-]
'"', '_',
'~', // shift-`
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'{', '|', '}', '~', 127
};
char french_shiftxform[] =
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31,
' ','$', //shift-!
'3', //shift-"
'#', '$', '%',
'1', //shift-&
'4', // shift-'
'5', // shift-(
')', // shift-)
'*', '+',
'?', // shift-,
'6', // shift--
'.', '/',
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9',
'/', // shitf-:
'.', // shift-;
'>', // shift-<
'+', // shift-=
'>', '?', '@',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'[', '\\', ']', '^',
'8', //shift-_
'`',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'{', '|', '}', '~', 127,
128, 129,
'2',
131, 132,
'0',
134,
'9',
136, 137,
'7',
139, 140,
'%'
};
char french_altgrxform[] =
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31,
' ', '!',
'#', //altgr-"
'#', '$', '%', '&',
'{', //altgr-'
'[', //altgr-(
']', //altgr-)
'*', '+', ',',
'|', //altg--
'.', '/',
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9',
':', ';', '<',
'}', //altgr-=
'>', '?', '@',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'[', '\\', ']', '^',
'\\', //altgr-backslash
'`',
'a', 'b', 'c', 'd', 'E', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'{', '|', '}', '~', 127,
128, 129,
'~',
131, 132,
'@',
134,
'^',
136, 137,
'`',
139, 140,
KEY_FR_U_GRAVE
};
//fallback for special letter non displayable in the game (i.e.: 'é','à',etc.)
INT32 HU_FallBackFrSpecialLetter(INT32 key)
{
switch(key){
case KEY_FR_E_AIGUE: return 'e';
case KEY_FR_E_GRAVE: return 'e';
case KEY_FR_C_CEDILLE: return 'c';
case KEY_FR_A_GRAVE: return 'a';
case KEY_FR_U_GRAVE: return 'u';
default: return key;
}
}
static char cechotext[1024];
static tic_t cechotimer = 0;
static tic_t cechoduration = 5*TICRATE;
@@ -260,6 +407,9 @@ void HU_Init(void)
COM_AddCommand("csay", Command_CSay_f);
RegisterNetXCmd(XD_SAY, Got_Saycmd);
// set shift translation table
shiftxform = english_shiftxform;
if (dedicated || rendermode == render_none)
return;
@@ -285,6 +435,11 @@ void HU_Start(void)
headsupactive = true;
}
void HU_Shiftform(void)
{
shiftxform = (cv_keyboardlayout.value == 3) ? french_shiftxform : english_shiftxform;
}
//======================================================================
// EXECUTION
//======================================================================
@@ -979,8 +1134,7 @@ void HU_Ticker(void)
}
}
if (cechotimer > 0)
--cechotimer;
if (cechotimer > 0) --cechotimer;
// Animate the desynch dots
if (hu_resynching
+13
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
//------------------------------------
@@ -96,6 +105,8 @@ void HU_LoadGraphics(void);
// reset heads up when consoleplayer respawns.
void HU_Start(void);
void HU_Shiftform(void);
boolean HU_Responder(event_t *ev);
void HU_Ticker(void);
void HU_TickSongCredits(void);
@@ -104,6 +115,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_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);
-2
View File
@@ -148,8 +148,6 @@ extern INT32 numcontrollers;
*/
const char *I_GetJoyName(INT32 joyindex);
void I_SetJoystickFocus(void);
boolean I_GamepadHasLED(INT32 playernum);
boolean I_GamepadHasRumble(INT32 playernum);
-3
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;
+118 -68
View File
@@ -274,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};
@@ -311,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};
@@ -476,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);
@@ -530,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 --
@@ -864,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();
}
@@ -1134,6 +1149,7 @@ enum
SPEEDO_DIAL,
SPEEDO_PMETER,
SPEEDO_PMETERSMOL,
SPEEDO_EXTRA3,
};
static SINT8 K_GetSpeedometerStyle(void)
@@ -1148,6 +1164,8 @@ static SINT8 K_GetSpeedometerStyle(void)
return SPEEDO_PMETER;
else if (cv_newspeedometer.value == 6 && kartz_speedo_smol)
return SPEEDO_PMETERSMOL;
else if (cv_newspeedometer.value == 7 && xtra_speedo3)
return SPEEDO_EXTRA3;
else
return SPEEDO_VANILLA;
}
@@ -1165,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;
}
@@ -1176,6 +1196,7 @@ enum
GAUGE_SMALL,
GAUGE_BIGNUM,
GAUGE_NUMONLY,
GAUGE_EXTRA,
};
static SINT8 K_GetDriftgaugeStyle(void)
@@ -1188,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
@@ -1339,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;
}
@@ -1386,6 +1407,7 @@ static void K_drawKartStats(void)
{
case SPEEDO_EXTRA:
case SPEEDO_ACHII:
case SPEEDO_EXTRA3:
spdoffset = -10;
break;
case SPEEDO_DIAL:
@@ -2161,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++)
{
@@ -2178,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++)
{
@@ -2235,7 +2257,6 @@ static boolean K_drawKartPositionFaces(void)
if (!playeringame[rankplayer[i]])
continue;
if (player->spectator || !player->mo)
continue;
@@ -2413,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)
@@ -2622,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
@@ -2691,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?
@@ -2725,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]);
}
}
@@ -2782,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;
@@ -2874,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;
@@ -2961,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;
@@ -3021,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;
@@ -3234,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;
@@ -3264,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;
@@ -3281,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
{
@@ -3587,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);
@@ -4448,7 +4498,7 @@ static void K_drawLapStartAnim(void)
char *lapnum = va("%02d", stplyr->laps + 1);
const size_t laplength = strlen(lapnum);
for (size_t i = 0; i < laplength; i++)
for (int i = 0; i < (int)laplength; i++)
{
int digit = lapnum[i] - '0';
int frame = min(2, progress/2 - 8 - (i*2));
+42 -61
View File
@@ -1600,78 +1600,57 @@ static UINT8 K_CheckOffroadCollide(mobj_t *mo)
sector_t *s2; // FOF sector shortcut
ffloor_t *rover; // FOF
fixed_t flr, cel; // floor & ceiling for height checks to make sure we're touching the offroad sector.
INT32 special;
fixed_t flr;
fixed_t cel; // floor & ceiling for height checks to make sure we're touching the offroad sector.
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next)
{
if (!node->m_sector)
break; // shouldn't happen.
break; // shouldn't happen.
s = node->m_sector;
// 1: Check for the main sector, make sure we're on the floor of that sector and see if we can apply offroad.
// Make arbitrary Z checks because we want to check for 1 sector in particular, we don't want to affect the player if the offroad sector is way below them and they're lineriding a normal sector above.
special = GETSECSPECIAL(s->special, 1);
for (i = 2; i < 5; i++) // check for sector special
{
if (special != i)
continue;
flr = P_MobjFloorZ(mo, s, s, mo->x, mo->y, NULL, false, true);
cel = P_MobjCeilingZ(mo, s, s, mo->x, mo->y, NULL, true, true); // get Z coords of both floors and ceilings for this sector (this accounts for slopes properly.)
// NOTE: we don't use P_GetZAt with our x/y directly because the mobj won't have the same height because of its hitbox on the slope. Complex garbage but tldr it doesn't work.
if (s->flags & SF_FLIPSPECIAL_FLOOR)
{
flr = P_MobjFloorZ(mo, s, s, mo->x, mo->y, NULL, false, true);
if (mo->z == flr) // floor check
return i-1; // return offroad type
}
if ( ((s->flags & SF_FLIPSPECIAL_FLOOR) && mo->z == flr) // floor check
|| ((mo->eflags & MFE_VERTICALFLIP && (s->flags & SF_FLIPSPECIAL_CEILING) && (mo->z + mo->height) == cel)) ) // ceiling check.
if (mo->eflags & MFE_VERTICALFLIP && (s->flags & SF_FLIPSPECIAL_CEILING))
{
cel = P_MobjCeilingZ(mo, s, s, mo->x, mo->y, NULL, true, true);
// NOTE: we don't use P_GetZAt with our x/y directly because the mobj won't have the same height because of its hitbox on the slope. Complex garbage but tldr it doesn't work.
if ((mo->z + mo->height) == cel) // ceiling check
return i-1; // return offroad type
}
}
for (i = 2; i < 5; i++) // check for sector special
if (GETSECSPECIAL(s->special, 1) == i)
return i-1; // return offroad type
// 2: If we're here, we haven't found anything. So let's try looking for FOFs in the sectors using the same logic.
for (rover = s->ffloors; rover; rover = rover->next)
{
if (!(rover->flags & FF_EXISTS)) // This FOF doesn't exist anymore.
if (!(rover->flags & FF_EXISTS)) // This FOF doesn't exist anymore.
continue;
s2 = &sectors[rover->secnum]; // makes things easier for us
s2 = &sectors[rover->secnum]; // makes things easier for us
special = GETSECSPECIAL(s2->special, 1);
for (i = 2; i < 5; i++) // check for sector special
{
if (special != i)
continue;
flr = P_GetFOFBottomZ(mo, s, rover, mo->x, mo->y, NULL);
cel = P_GetFOFTopZ(mo, s, rover, mo->x, mo->y, NULL); // Z coords for fof top/bottom.
// we will do essentially the same checks as above instead of bothering with top/bottom height of the FOF.
// Reminder that an FOF's floor is its bottom, silly!
// we will do essentially the same checks as above instead of bothering with top/bottom height of the FOF.
// Reminder that an FOF's floor is its bottom, silly!
if ( ((s2->flags & SF_FLIPSPECIAL_FLOOR) && mo->z == cel) // "floor" check
|| ((s2->flags & SF_FLIPSPECIAL_CEILING) && (mo->z + mo->height) == flr) ) // "ceiling" check.
if (s2->flags & SF_FLIPSPECIAL_FLOOR)
{
cel = P_GetFOFTopZ(mo, s, rover, mo->x, mo->y, NULL); // Z coords for fof top/bottom.
if (mo->z == cel) // "floor" check
return i-1; // return offroad type
}
for (i = 2; i < 5; i++) // check for sector special
if (GETSECSPECIAL(s2->special, 1) == i)
return i-1; // return offroad type
if (s2->flags & SF_FLIPSPECIAL_CEILING)
{
flr = P_GetFOFBottomZ(mo, s, rover, mo->x, mo->y, NULL);
if ((mo->z + mo->height) == flr) // "ceiling" check
return i-1; // return offroad type
}
}
}
}
return 0; // couldn't find any offroad
return 0; // couldn't find any offroad
}
/** \brief Updates the Player's offroad value once per frame
@@ -1742,6 +1721,7 @@ static void K_SpawnDashDustRelease(player_t *player)
INT32 i;
I_Assert(player != NULL);
I_Assert(player->mo != NULL);
I_Assert(!P_MobjWasRemoved(player->mo));
if (!player->speed && !player->kartstuff[k_startboost])
@@ -1779,6 +1759,7 @@ static void K_SpawnBrakeDriftSparks(player_t *player) // Be sure to update the m
mobj_t *sparks;
I_Assert(player != NULL);
I_Assert(player->mo != NULL);
I_Assert(!P_MobjWasRemoved(player->mo));
// Position & etc are handled in its thinker, and its spawned invisible.
@@ -2336,13 +2317,10 @@ fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove
finalspeed *= forwardmove/25;
finalspeed /= 2;
if (forwardmove < 0)
{
if (finalspeed > mapobjectscale*2)
return finalspeed/2;
if (forwardmove < 0 && finalspeed > mapobjectscale*2)
return finalspeed/2;
else if (forwardmove < 0)
return -mapobjectscale/2;
}
if (finalspeed < 0)
finalspeed = 0;
@@ -3178,6 +3156,7 @@ static void K_SpawnDriftSparks(player_t *player)
INT32 i;
I_Assert(player != NULL);
I_Assert(player->mo != NULL);
I_Assert(!P_MobjWasRemoved(player->mo));
if (leveltime % 2 == 1)
@@ -3441,7 +3420,7 @@ static void K_QuiteSaltyHop(player_t *player)
pmo->spritexscale -= (FRACUNIT/8);
}
pmo->spriteyoffset += FixedMul(psalt->zoffset, cv_saltyheight.value);
pmo->spriteyoffset = FixedMul(psalt->zoffset, cv_saltyheight.value);
if (cv_saltyhopsfx.value)
{
@@ -3549,6 +3528,7 @@ void K_SpawnBoostTrail(player_t *player)
INT32 i;
I_Assert(player != NULL);
I_Assert(player->mo != NULL);
I_Assert(!P_MobjWasRemoved(player->mo));
if (!P_IsObjectOnGround(player->mo)
@@ -3630,6 +3610,7 @@ void K_SpawnSparkleTrail(mobj_t *mo)
mobj_t *sparkle;
INT32 i;
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
const boolean shouldblend = (mo->player && K_PlayerEffectsShouldBlend(mo->player));
@@ -3663,6 +3644,7 @@ mobj_t *K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
mobj_t *dust;
angle_t aoff;
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
if (mo->player)
@@ -3711,7 +3693,7 @@ void K_DriftDustHandling(mobj_t *spawner)
{
angle_t anglediff;
if (leveltime % 2 != 0 || !P_IsObjectOnGround(spawner))
if (!P_IsObjectOnGround(spawner) || leveltime % 2 != 0)
return;
if (spawner->player)
@@ -4094,7 +4076,7 @@ static void K_DoThunderShield(player_t *player)
mo->scale = player->mo->scale*3 + (player->mo->scale/2);
// spawn horizontal bolts;
for (i = 0; i < 7; i++)
for (i=0; i<7; i++)
{
mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK);
mo->angle = P_RandomRange(0, 359)*ANG1;
@@ -4105,7 +4087,7 @@ static void K_DoThunderShield(player_t *player)
// spawn the radius thing:
an = ANGLE_22h;
for (i = 0; i < 15; i++)
for (i=0; i<15; i++)
{
sx = player->mo->x + FixedMul((player->mo->scale*THUNDERRADIUS), FINECOSINE((an*i)>>ANGLETOFINESHIFT));
sy = player->mo->y + FixedMul((player->mo->scale*THUNDERRADIUS), FINESINE((an*i)>>ANGLETOFINESHIFT));
@@ -4197,12 +4179,12 @@ static void K_DoHyudoroSteal(player_t *player)
void K_DoSneaker(player_t *player, INT32 type)
{
const fixed_t intendedboost = K_GetSneakerBoostSpeed();
if (!player->kartstuff[k_floorboost] || player->kartstuff[k_floorboost] == 3)
{
S_StartSound(player->mo, sfx_cdfm01);
K_SpawnDashDustRelease(player);
const fixed_t intendedboost = K_GetSneakerBoostSpeed();
if (intendedboost > player->kartstuff[k_speedboost])
player->kartstuff[k_destboostcam] = FixedMul(FRACUNIT, FixedDiv((intendedboost - player->kartstuff[k_speedboost]), intendedboost));
}
@@ -6218,8 +6200,7 @@ void K_KartUpdatePosition(player_t *player)
players[i].kartstuff[k_prevcheck] += imo;
ipcd++;
}
if (isnextcheckpointi)
if (isnextcheckpointi )
{
players[i].kartstuff[k_nextcheck] += imo;
incd++;
+11 -11
View File
@@ -293,17 +293,17 @@ typedef struct Hook_State Hook_State;
typedef void (*Hook_Callback)(Hook_State *);
struct Hook_State {
INT32 status; /* return status to calling function */
void * userdata;
int hook_type;
mobjtype_t mobj_type; /* < NUMMOBJTYPES if mobj hook */
const char * string; /* used to fetch table, ran first if set */
int top; /* index of last argument passed to hook */
int id; /* id to fetch ref */
bool important; /* is this hook from local addon */
int values; /* num arguments passed to hook */
int results; /* num values returned by hook */
Hook_Callback results_handler; /* callback when hook successfully returns */
INT32 status;/* return status to calling function */
void * userdata;
int hook_type;
mobjtype_t mobj_type;/* <NUMMOBJTYPES if mobj hook */
const char * string;/* used to fetch table, ran first if set */
int top;/* index of last argument passed to hook */
int id;/* id to fetch ref */
boolean important;/* is this hook from local addon */
int values;/* num arguments passed to hook */
int results;/* num values returned by hook */
Hook_Callback results_handler;/* callback when hook successfully returns */
};
enum {
+3 -8
View File
@@ -1658,22 +1658,17 @@ static int mapheaderinfo_get(lua_State *L)
{
// Read custom vars now
// (note: don't include the "LUA." in your lua scripts!)
if (!header->numCustomOptions) {
lua_pushnil(L);
break;
}
UINT8 j = 0;
const char *cusoptstr = lua_tostring(L, 2);
for (;j < header->numCustomOptions && !fastcmp(cusoptstr, header->customopts[j].option); ++j);
for (;j < header->numCustomOptions && !fastcmp(lua_tostring(L, 2), header->customopts[j].option); ++j);
if (j < header->numCustomOptions)
if(j < header->numCustomOptions)
lua_pushstring(L, header->customopts[j].value);
else
lua_pushnil(L);
}
}
return 1;
}
int LUA_MapLib(lua_State *L)
+8 -13
View File
@@ -979,7 +979,7 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
if (!gL)
{
if (fastcmp(ptype, "player")) // players must always be included, even if no vars
if (fastcmp(ptype,"player")) // players must always be included, even if no vars
WRITEUINT16(*p, 0);
return;
}
@@ -995,7 +995,7 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
if (!lua_istable(gL, -1))
{ // no extra values table
lua_pop(gL, 1);
if (fastcmp(ptype, "player")) // players must always be included, even if no vars
if (fastcmp(ptype,"player")) // players must always be included, even if no vars
WRITEUINT16(*p, 0);
return;
}
@@ -1007,13 +1007,13 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
// skip anything that has an empty table and isn't a player.
if (i == 0)
{
if (fastcmp(ptype, "player")) // always include players even if they have no extra variables
if (fastcmp(ptype,"player")) // always include players even if they have no extra variables
WRITEUINT16(*p, 0);
lua_pop(gL, 1);
return;
}
if (fastcmp(ptype, "mobj")) // mobjs must write their mobjnum as a header
if (fastcmp(ptype,"mobj")) // mobjs must write their mobjnum as a header
WRITEUINT32(*p, ((mobj_t *)pointer)->mobjnum);
WRITEUINT16(*p, i);
@@ -1065,9 +1065,8 @@ static void ArchiveTables(UINT8 **p)
n++; // the table contained a new table we'll have to archive. :(
else if (e == 2) // invalid key type (function, thread, lightuserdata, or anything we don't recognise)
{
lua_pushvalue(gL, -2); // copy key for error message (lua_tostring may mutate it which confuses lua_next)
CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -1), luaL_typename(gL, -1), i);
lua_pop(gL, 2); // pop key copy and value
CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -2), luaL_typename(gL, -2), i);
lua_pop(gL, 1);
continue;
}
else if (e == 3) // nil key due to invalid userdata. NOT an error.
@@ -1081,15 +1080,11 @@ static void ArchiveTables(UINT8 **p)
if (e == 1)
n++; // the table contained a new table we'll have to archive. :(
else if (e == 2) // invalid value type
{
lua_pushvalue(gL, -2); // copy key for error message (same as above)
CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -1), luaL_typename(gL, -2));
lua_pop(gL, 1); // pop key copy
}
CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -2), luaL_typename(gL, -1));
lua_pop(gL, 1);
}
}
lua_pop(gL, 1);
WRITEUINT8(*p, ARCH_TEND);
}
-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
+27 -2
View File
@@ -496,6 +496,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
//
@@ -1224,7 +1250,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;
}
@@ -1254,7 +1280,6 @@ boolean M_Responder(event_t *ev)
void (*otherroutine)(event_t *sev) = currentMenu->menuitems[itemOn].itemaction;
otherroutine(ev); //Alam: what a hack
}
return true;
}
}
+22 -23
View File
@@ -1185,20 +1185,20 @@ static menuitem_t OP_FocusOptionsMenu[] =
{
{IT_HEADER, NULL, "Game Focus Options", NULL, 0},
{IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", &cv_playmusicifunfocused, 10},
{IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", &cv_playsoundifunfocused, 20},
{IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", &cv_playmusicifunfocused, 30},
{IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", &cv_playsoundifunfocused, 40},
{IT_STRING|IT_CVAR, NULL, "Pause Game While Unfocused", &cv_pauseifunfocused, 40},
{IT_STRING|IT_CVAR, NULL, "Pause Game While Unfocused", &cv_pauseifunfocused, 60},
{IT_STRING|IT_CVAR, NULL, "Background FPS Cap", &cv_fpscapbg, 60},
{IT_STRING|IT_CVAR, NULL, "Background FPS Cap", &cv_fpscapbg, 80},
{IT_STRING|IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost, 80},
{IT_STRING|IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost, 100},
{IT_STRING|IT_CVAR, NULL, "Visible Mouse", &cv_mousevisible, 100},
{IT_STRING|IT_CVAR, NULL, "Visible Mouse", &cv_mousevisible, 120},
{IT_STRING|IT_CVAR, NULL, "Gamepad LED Color While Unfocused ", &cv_gamepadledifunfocused, 140},
{IT_STRING|IT_CVAR, NULL, "Gamepad Rumble While Unfocused", &cv_rumbleifunfocused, 150},
{IT_STRING|IT_CVAR, NULL, "Gamepad Inputs While Unfocused", &cv_gamepadifunfocused, 120},
{IT_STRING|IT_CVAR, NULL, "Gamepad LED Color While Unfocused ", &cv_gamepadledifunfocused, 130},
{IT_STRING|IT_CVAR, NULL, "Gamepad Rumble While Unfocused", &cv_rumbleifunfocused, 140},
};
static const char* OP_FocusOptionsTooltips[] =
@@ -1210,7 +1210,6 @@ static const char* OP_FocusOptionsTooltips[] =
"Set manual framerate cap while the game is unfocused.",
"Should the FOCUS LOST window appear\n while the game is unfocused?",
"Displays the mouse cursor while the game is in focus.",
"Should gamepad still control the game when unfocused?",
"Should gamepad LED indicator change color when unfocused?",
"Should gamepad rumble apply when unfocused?",
};
@@ -1305,29 +1304,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[] =
+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')
{
+2
View File
@@ -306,6 +306,7 @@ void P_NewChaseDir(mobj_t *actor)
dirtype_t d[3];
dirtype_t tdir = DI_NODIR, olddir, turnaround;
I_Assert(actor->target != NULL);
I_Assert(!P_MobjWasRemoved(actor->target));
olddir = actor->movedir;
@@ -618,6 +619,7 @@ void A_Chase(void *thing)
if (LUA_CallAction(A_CHASE, actor))
return;
I_Assert(actor != NULL);
I_Assert(!P_MobjWasRemoved(actor));
if (actor->reactiontime)
+1
View File
@@ -1894,6 +1894,7 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies)
{
if (nobaddies->sector->lines[i]->special == 223)
{
upperbound = nobaddies->sector->ceilingheight;
lowerbound = nobaddies->sector->floorheight;
+31 -38
View File
@@ -189,12 +189,12 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
}
if (vertispeed)
object->momz = FixedMul(vertispeed, FixedSqrt(FixedMul(vscale, spring->scale)));
object->momz = FixedMul(vertispeed,FixedSqrt(FixedMul(vscale, spring->scale)));
if (horizspeed)
{
if (!object->player)
P_InstaThrustEvenIn2D(object, spring->angle, FixedMul(horizspeed, FixedSqrt(FixedMul(hscale, spring->scale))));
P_InstaThrustEvenIn2D(object, spring->angle, FixedMul(horizspeed,FixedSqrt(FixedMul(hscale, spring->scale))));
else
{
fixed_t finalSpeed = FixedDiv(horizspeed, hscale);
@@ -203,7 +203,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
if (pSpeed > finalSpeed)
finalSpeed = pSpeed;
P_InstaThrustEvenIn2D(object, spring->angle, FixedMul(finalSpeed, FixedSqrt(FixedMul(hscale, spring->scale))));
P_InstaThrustEvenIn2D(object, spring->angle, FixedMul(finalSpeed,FixedSqrt(FixedMul(hscale, spring->scale))));
}
}
@@ -321,7 +321,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
// Ignore spectators
if ((tmthing->player && tmthing->player->spectator)
|| (thing->player && thing->player->spectator))
|| (thing->player && thing->player->spectator))
return true;
#ifdef SEENAMES
@@ -1509,15 +1509,15 @@ static boolean PIT_CheckThing(mobj_t *thing)
// Adjusts tmfloorz and tmceilingz as lines are contacted - FOR CAMERA ONLY
static boolean PIT_CheckCameraLine(line_t *ld)
{
if (tmbbox[BOXRIGHT] <= ld->bbox[BOXLEFT] ||
tmbbox[BOXLEFT] >= ld->bbox[BOXRIGHT] ||
tmbbox[BOXTOP] <= ld->bbox[BOXBOTTOM] ||
tmbbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
return true;
if (ld->polyobj && !(ld->polyobj->flags & POF_SOLID))
return true;
if (tmbbox[BOXRIGHT] <= ld->bbox[BOXLEFT] || tmbbox[BOXLEFT] >= ld->bbox[BOXRIGHT]
|| tmbbox[BOXTOP] <= ld->bbox[BOXBOTTOM] || tmbbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
{
return true;
}
if (P_BoxOnLineSide(tmbbox, ld) != -1)
return true;
@@ -1571,13 +1571,11 @@ static boolean PIT_CheckCameraLine(line_t *ld)
//
static boolean PIT_CheckLine(line_t *ld)
{
if (tmbbox[BOXRIGHT] <= ld->bbox[BOXLEFT] ||
tmbbox[BOXLEFT] >= ld->bbox[BOXRIGHT] ||
tmbbox[BOXTOP] <= ld->bbox[BOXBOTTOM] ||
tmbbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
if (ld->polyobj && !(ld->polyobj->flags & POF_SOLID))
return true;
if (ld->polyobj && !(ld->polyobj->flags & POF_SOLID))
if (tmbbox[BOXRIGHT] <= ld->bbox[BOXLEFT] || tmbbox[BOXLEFT] >= ld->bbox[BOXRIGHT]
|| tmbbox[BOXTOP] <= ld->bbox[BOXBOTTOM] || tmbbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
return true;
if (P_BoxOnLineSide(tmbbox, ld) != -1)
@@ -1586,12 +1584,10 @@ static boolean PIT_CheckLine(line_t *ld)
if (tmthing->flags & MF_PAPERCOLLISION) // Caution! Turning whilst up against a wall will get you stuck. You probably shouldn't give the player this flag.
{
fixed_t cosradius, sinradius;
cosradius = FixedMul(tmthing->radius, FINECOSINE(tmthing->angle>>ANGLETOFINESHIFT));
sinradius = FixedMul(tmthing->radius, FINESINE(tmthing->angle>>ANGLETOFINESHIFT));
if (P_PointOnLineSide(tmx - cosradius, tmy - sinradius, ld)
== P_PointOnLineSide(tmx + cosradius, tmy + sinradius, ld))
== P_PointOnLineSide(tmx + cosradius, tmy + sinradius, ld))
return true; // the line doesn't cross between collider's start or end
}
@@ -2373,7 +2369,6 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
fixed_t radius = thing->radius;
fixed_t thingtop ;//= thing->z + thing->height;
fixed_t startingonground = P_IsObjectOnGround(thing);
INT32 special = -1;
floatok = false;
if (radius < MAXRADIUS/2)
@@ -2407,31 +2402,21 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
if (!(thing->flags & MF_NOCLIP))
{
// All things are affected by their scale.
fixed_t maxstep;
if (tmceilingz - tmfloorz < thing->height)
{
if (tmfloorthing)
tmhitthing = tmfloorthing;
return false; // doesn't fit
}
maxstep = FixedMul(MAXSTEPMOVE, mapobjectscale);
//All things are affected by their scale.
fixed_t maxstep = FixedMul(MAXSTEPMOVE, mapobjectscale);
INT32 special = 0;
if (thing->player)
{
if (special == -1)
special = GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1);
special = GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1);
// If using type Section1:13, double the maxstep.
if (special == 13 || P_PlayerTouchingSectorSpecial(thing->player, 1, 13))
if (P_PlayerTouchingSectorSpecial(thing->player, 1, 13) || special == 13)
{
maxstep <<= 1;
}
// If using type Section1:12, no maxstep. For ledges you don't want the player to climb! (see: Egg Zeppelin & SMK port walls)
else if (special == 12 || P_PlayerTouchingSectorSpecial(thing->player, 1, 12))
else if (P_PlayerTouchingSectorSpecial(thing->player, 1, 12) || special == 12)
{
maxstep = 0;
}
@@ -2442,6 +2427,14 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
maxstep = 0;
}
if (tmceilingz - tmfloorz < thing->height)
{
if (tmfloorthing)
tmhitthing = tmfloorthing;
return false; // doesn't fit
}
floatok = true;
thingtop = thing->z + thing->height;
@@ -2472,7 +2465,7 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
}
}
else if (maxstep > 0 && !(thing->player &&
(special == 14 || P_PlayerTouchingSectorSpecial(thing->player, 1, 14)))) // Step down
(P_PlayerTouchingSectorSpecial(thing->player, 1, 14) || special == 14))) // Step down
{
// If the floor difference is MAXSTEPMOVE or less, and the sector isn't Section1:14, ALWAYS
// step down! Formerly required a Section1:13 sector for the full MAXSTEPMOVE, but no more.
@@ -4008,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.
+39 -78
View File
@@ -423,40 +423,40 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
// Set open and high/low values here
fixed_t frontheight, backheight;
frontheight = P_GetCeilingZ(mobj, front, tmx, tmy, linedef);
backheight = P_GetCeilingZ(mobj, back, tmx, tmy, linedef);
if (frontheight < backheight)
{
opentop = frontheight;
highceiling = backheight;
opentopslope = front->c_slope;
}
else
{
opentop = backheight;
highceiling = frontheight;
opentopslope = back->c_slope;
}
frontheight = P_GetFloorZ(mobj, front, tmx, tmy, linedef);
backheight = P_GetFloorZ(mobj, back, tmx, tmy, linedef);
if (frontheight > backheight)
{
openbottom = frontheight;
lowfloor = backheight;
openbottomslope = front->f_slope;
}
else
{
openbottom = backheight;
lowfloor = frontheight;
openbottomslope = back->f_slope;
}
if (mobj)
{
frontheight = P_GetCeilingZ(mobj, front, tmx, tmy, linedef);
backheight = P_GetCeilingZ(mobj, back, tmx, tmy, linedef);
if (frontheight < backheight)
{
opentop = frontheight;
highceiling = backheight;
opentopslope = front->c_slope;
}
else
{
opentop = backheight;
highceiling = frontheight;
opentopslope = back->c_slope;
}
frontheight = P_GetFloorZ(mobj, front, tmx, tmy, linedef);
backheight = P_GetFloorZ(mobj, back, tmx, tmy, linedef);
if (frontheight > backheight)
{
openbottom = frontheight;
lowfloor = backheight;
openbottomslope = front->f_slope;
}
else
{
openbottom = backheight;
lowfloor = frontheight;
openbottomslope = back->f_slope;
}
fixed_t thingtop = mobj->z + mobj->height;
// Check for collision with front side's midtexture if Effect 4 is set
@@ -650,43 +650,6 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
lowfloor = lowestfloor;
}
}
else
{
// this is what P_LineOpening did before the addition of slopes
// so i´ll just use it as the fallback case
// not that we will ever likely hit this
frontheight = front->ceilingheight;
backheight = back->ceilingheight;
if (frontheight < backheight)
{
opentop = frontheight;
highceiling = backheight;
opentopslope = front->c_slope;
}
else
{
opentop = backheight;
highceiling = frontheight;
opentopslope = back->c_slope;
}
frontheight = front->floorheight;
backheight = back->floorheight;
if (frontheight > backheight)
{
openbottom = frontheight;
lowfloor = backheight;
openbottomslope = front->f_slope;
}
else
{
openbottom = backheight;
lowfloor = frontheight;
openbottomslope = back->f_slope;
}
}
openrange = opentop - openbottom;
}
@@ -705,6 +668,7 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
//
void P_UnsetThingPosition(mobj_t *thing)
{
I_Assert(thing != NULL);
I_Assert(!P_MobjWasRemoved(thing));
if (!(thing->flags & MF_NOSECTOR))
@@ -808,6 +772,7 @@ void P_SetThingPosition(mobj_t *thing)
sector_t *oldsec = NULL;
fixed_t tfloorz, tceilz;
I_Assert(thing != NULL);
I_Assert(!P_MobjWasRemoved(thing));
if (thing->player && thing->z <= thing->floorz && thing->subsector)
@@ -858,20 +823,16 @@ void P_SetThingPosition(mobj_t *thing)
// sector's floor is the same height.
if (thing->player && oldsec != NULL && thing->subsector && oldsec != thing->subsector->sector)
{
tfloorz = P_GetFloorZ(thing, ss->sector, thing->x, thing->y, NULL);
tceilz = P_GetCeilingZ(thing, ss->sector, thing->x, thing->y, NULL);
if (thing->eflags & MFE_VERTICALFLIP)
{
tceilz = P_GetCeilingZ(thing, ss->sector, thing->x, thing->y, NULL);
if (thing->z + thing->height >= tceilz)
thing->eflags |= MFE_JUSTSTEPPEDDOWN;
}
else
{
tfloorz = P_GetFloorZ(thing, ss->sector, thing->x, thing->y, NULL);
if (thing->z <= tfloorz)
thing->eflags |= MFE_JUSTSTEPPEDDOWN;
}
else if (thing->z <= tfloorz)
thing->eflags |= MFE_JUSTSTEPPEDDOWN;
}
}
+134 -148
View File
@@ -222,6 +222,11 @@ boolean P_SetMobjState(mobj_t *mobj, statenum_t state)
INT32 recursion = 0;
#ifdef PARANOIA
if (mobj->player != NULL)
I_Error("P_SetMobjState used for player mobj. Use P_SetPlayerMobjState instead!\n(State called: %d)", state);
#endif
if (mobj->player != NULL)
return P_SetPlayerMobjState(mobj, state);
@@ -334,6 +339,7 @@ void P_ExplodeMissile(mobj_t *mo)
{
mobj_t *explodemo;
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
mo->momx = mo->momy = mo->momz = 0;
@@ -414,18 +420,14 @@ boolean P_InsideANonSolidFFloor(mobj_t *mobj, ffloor_t *rover)
if (!(rover->flags & FF_EXISTS))
return false;
if ((((rover->flags & FF_BLOCKPLAYER) && mobj->player) ||
((rover->flags & FF_BLOCKOTHERS) && !mobj->player)))
return false;
topheight = P_GetFFloorTopZAt(rover, mobj->x, mobj->y);
if (mobj->z > topheight)
if ((((rover->flags & FF_BLOCKPLAYER) && mobj->player)
|| ((rover->flags & FF_BLOCKOTHERS) && !mobj->player)))
return false;
topheight = P_GetFFloorTopZAt (rover, mobj->x, mobj->y);
bottomheight = P_GetFFloorBottomZAt(rover, mobj->x, mobj->y);
if (mobj->z + mobj->height < bottomheight)
if (mobj->z > topheight || (mobj->z + mobj->height < bottomheight))
return false;
return true;
@@ -575,7 +577,7 @@ fixed_t P_MobjFloorZ(mobj_t *mobj, sector_t *sector, sector_t *boundsec, fixed_t
return P_GetSlopeZAt(slope, testx, testy);
// If boundsec is set, we're looking for specials. In that case, iterate over every line in this sector to find the TRUE highest/lowest point
if (perfect && boundsec)
if (perfect)
{
size_t i;
line_t *ld;
@@ -594,10 +596,8 @@ fixed_t P_MobjFloorZ(mobj_t *mobj, sector_t *sector, sector_t *boundsec, fixed_t
fixed_t highline;
ld = boundsec->lines[i];
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] ||
bbox[BOXLEFT] >= ld->bbox[BOXRIGHT] ||
bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] ||
bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] || bbox[BOXLEFT] >= ld->bbox[BOXRIGHT]
|| bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] || bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
continue;
if (P_BoxOnLineSide(bbox, ld) != -1)
@@ -664,7 +664,7 @@ fixed_t P_MobjCeilingZ(mobj_t *mobj, sector_t *sector, sector_t *boundsec, fixed
return P_GetSlopeZAt(slope, testx, testy);
// If boundsec is set, we're looking for specials. In that case, iterate over every line in this sector to find the TRUE highest/lowest point
if (perfect && boundsec)
if (perfect)
{
size_t i;
line_t *ld;
@@ -683,10 +683,8 @@ fixed_t P_MobjCeilingZ(mobj_t *mobj, sector_t *sector, sector_t *boundsec, fixed
fixed_t highline;
ld = boundsec->lines[i];
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] ||
bbox[BOXLEFT] >= ld->bbox[BOXRIGHT] ||
bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] ||
bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] || bbox[BOXLEFT] >= ld->bbox[BOXRIGHT]
|| bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] || bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
continue;
if (P_BoxOnLineSide(bbox, ld) != -1)
@@ -754,7 +752,7 @@ fixed_t P_CameraFloorZ(camera_t *mobj, sector_t *sector, sector_t *boundsec, fix
return P_GetSlopeZAt(slope, testx, testy);
// If boundsec is set, we're looking for specials. In that case, iterate over every line in this sector to find the TRUE highest/lowest point
if (perfect && boundsec)
if (perfect)
{
size_t i;
line_t *ld;
@@ -773,10 +771,8 @@ fixed_t P_CameraFloorZ(camera_t *mobj, sector_t *sector, sector_t *boundsec, fix
fixed_t highline;
ld = boundsec->lines[i];
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] ||
bbox[BOXLEFT] >= ld->bbox[BOXRIGHT] ||
bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] ||
bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] || bbox[BOXLEFT] >= ld->bbox[BOXRIGHT]
|| bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] || bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
continue;
if (P_BoxOnLineSide(bbox, ld) != -1)
@@ -843,7 +839,7 @@ fixed_t P_CameraCeilingZ(camera_t *mobj, sector_t *sector, sector_t *boundsec, f
return P_GetSlopeZAt(slope, testx, testy);
// If boundsec is set, we're looking for specials. In that case, iterate over every line in this sector to find the TRUE highest/lowest point
if (perfect && boundsec)
if (perfect)
{
size_t i;
line_t *ld;
@@ -862,10 +858,8 @@ fixed_t P_CameraCeilingZ(camera_t *mobj, sector_t *sector, sector_t *boundsec, f
fixed_t highline;
ld = boundsec->lines[i];
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] ||
bbox[BOXLEFT] >= ld->bbox[BOXRIGHT] ||
bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] ||
bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
if (bbox[BOXRIGHT] <= ld->bbox[BOXLEFT] || bbox[BOXLEFT] >= ld->bbox[BOXRIGHT]
|| bbox[BOXTOP] <= ld->bbox[BOXBOTTOM] || bbox[BOXBOTTOM] >= ld->bbox[BOXTOP])
continue;
if (P_BoxOnLineSide(bbox, ld) != -1)
@@ -896,7 +890,6 @@ fixed_t P_CameraCeilingZ(camera_t *mobj, sector_t *sector, sector_t *boundsec, f
else // Well, that makes it easy. Just get the ceiling height
return sector->ceilingheight;
}
static void P_PlayerFlip(mobj_t *mo)
{
if (!mo->player)
@@ -905,12 +898,7 @@ static void P_PlayerFlip(mobj_t *mo)
G_GhostAddFlip((INT32) (mo->player - players));
// Flip aiming to match!
if (UNLIKELY(mo->player->pflags & PF_NIGHTSMODE)) // NiGHTS doesn't use flipcam
{
if (mo->tracer)
mo->tracer->eflags ^= MFE_VERTICALFLIP;
}
else if (mo->player->pflags & PF_FLIPCAM)
if (mo->player->pflags & PF_FLIPCAM)
{
UINT8 i;
@@ -932,6 +920,11 @@ static void P_PlayerFlip(mobj_t *mo)
camera[i].z += FixedMul(20*FRACUNIT, mo->scale);
}
}
else if (UNLIKELY(mo->player->pflags & PF_NIGHTSMODE)) // NiGHTS doesn't use flipcam
{
if (mo->tracer)
mo->tracer->eflags ^= MFE_VERTICALFLIP;
}
}
//
@@ -947,6 +940,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
boolean goopgravity = false;
boolean wasflip;
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
wasflip = (mo->eflags & MFE_VERTICALFLIP) != 0;
@@ -1119,6 +1113,7 @@ void P_CheckGravity(mobj_t *mo, boolean affect)
//
static void P_SceneryXYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy)
{
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
const fixed_t fric_scale = FixedMul(FRACUNIT/32, mo->scale);
@@ -1162,6 +1157,7 @@ static void P_XYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy)
{
player_t *player;
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
player = mo->player;
@@ -1213,6 +1209,7 @@ static void P_PushableCheckBustables(mobj_t *mo)
fixed_t oldx;
fixed_t oldy;
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
if (netgame && mo->player && mo->player->spectator)
@@ -1331,6 +1328,7 @@ void P_XYMovement(mobj_t *mo)
vector3_t slopemom = {0, 0, 0};
fixed_t predictedz = 0;
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
// if it's stopped
@@ -1413,7 +1411,7 @@ void P_XYMovement(mobj_t *mo)
// blocked move
moved = false;
if (UNLIKELY(player && player->bot))
if (player && player->bot)
{
B_MoveBlocked(player);
}
@@ -1448,24 +1446,24 @@ void P_XYMovement(mobj_t *mo)
else
fx->eflags &= ~MFE_VERTICALFLIP;
fx->scale = mo->scale;
}
if (mo->type == MT_ORBINAUT) // Orbinaut speed decreasing
if (mo->type == MT_ORBINAUT) // Orbinaut speed decreasing
{
if (mo->health > 1)
{
if (mo->health > 1)
{
S_StartSound(mo, mo->info->attacksound);
mo->health--;
mo->threshold = 0;
}
else if (mo->health == 1)
{
// This Item Damage
S_StartSound(mo, mo->info->deathsound);
P_KillMobj(mo, NULL, NULL);
S_StartSound(mo, mo->info->attacksound);
mo->health--;
mo->threshold = 0;
}
else if (mo->health == 1)
{
// This Item Damage
S_StartSound(mo, mo->info->deathsound);
P_KillMobj(mo, NULL, NULL);
P_SetObjectMomZ(mo, 8*FRACUNIT, false);
P_InstaThrust(mo, R_PointToAngle2(mo->x, mo->y, mo->x, mo->y)+ANGLE_90, 16*FRACUNIT);
}
P_SetObjectMomZ(mo, 8*FRACUNIT, false);
P_InstaThrust(mo, R_PointToAngle2(mo->x, mo->y, mo->x, mo->y)+ANGLE_90, 16*FRACUNIT);
}
}
//}
@@ -1569,46 +1567,43 @@ void P_XYMovement(mobj_t *mo)
if (P_MobjWasRemoved(mo)) // MF_SPECIAL touched a player! O_o;;
return;
if (moved)
if (moved && oldslope) // Check to see if we ran off
{
if (oldslope) // Check to see if we ran off
if (oldslope != mo->standingslope) // First, compare different slopes
{
if (oldslope != mo->standingslope) // First, compare different slopes
{
angle_t oldangle, newangle;
angle_t moveangle = R_PointToAngle2(0, 0, mo->momx, mo->momy);
angle_t oldangle, newangle;
angle_t moveangle = R_PointToAngle2(0, 0, mo->momx, mo->momy);
oldangle = FixedMul((signed)oldslope->zangle, FINECOSINE((moveangle - oldslope->xydirection) >> ANGLETOFINESHIFT));
oldangle = FixedMul((signed)oldslope->zangle, FINECOSINE((moveangle - oldslope->xydirection) >> ANGLETOFINESHIFT));
if (mo->standingslope)
newangle = FixedMul((signed)mo->standingslope->zangle, FINECOSINE((moveangle - mo->standingslope->xydirection) >> ANGLETOFINESHIFT));
else
newangle = 0;
if (mo->standingslope)
newangle = FixedMul((signed)mo->standingslope->zangle, FINECOSINE((moveangle - mo->standingslope->xydirection) >> ANGLETOFINESHIFT));
else
newangle = 0;
// Now compare the Zs of the different quantizations
if (oldangle-newangle > ANG30 && oldangle-newangle < ANGLE_180) // Allow for a bit of sticking - this value can be adjusted later
{
mo->standingslope = oldslope;
P_SlopeLaunch(mo);
}
}
else if (predictedz-mo->z > abs(slopemom.z/2) // Sryder 2018-11-26: Don't launch here if it's a slope without physics, we stick to those like glue anyway
&& !(mo->standingslope->flags & SL_NOPHYSICS)) // Now check if we were supposed to stick to this slope
// Now compare the Zs of the different quantizations
if (oldangle-newangle > ANG30 && oldangle-newangle < ANGLE_180) // Allow for a bit of sticking - this value can be adjusted later
{
mo->standingslope = oldslope;
P_SlopeLaunch(mo);
}
}
else if (mo->standingslope && predictedz)
else if (predictedz-mo->z > abs(slopemom.z/2) // Sryder 2018-11-26: Don't launch here if it's a slope without physics, we stick to those like glue anyway
&& !(mo->standingslope->flags & SL_NOPHYSICS)) // Now check if we were supposed to stick to this slope
{
angle_t moveangle = R_PointToAngle2(0, 0, mo->momx, mo->momy);
angle_t newangle = FixedMul((signed)mo->standingslope->zangle, FINECOSINE((moveangle - mo->standingslope->xydirection) >> ANGLETOFINESHIFT));
P_SlopeLaunch(mo);
}
}
else if (moved && mo->standingslope && predictedz)
{
angle_t moveangle = R_PointToAngle2(0, 0, mo->momx, mo->momy);
angle_t newangle = FixedMul((signed)mo->standingslope->zangle, FINECOSINE((moveangle - mo->standingslope->xydirection) >> ANGLETOFINESHIFT));
if (ANGLE_MAX-newangle > ANG30 && newangle > ANGLE_180)
{
mo->momz = P_MobjFlip(mo)*FRACUNIT/2;
mo->z = predictedz + P_MobjFlip(mo);
mo->standingslope = NULL;
}
if (ANGLE_MAX-newangle > ANG30 && newangle > ANGLE_180)
{
mo->momz = P_MobjFlip(mo)*FRACUNIT/2;
mo->z = predictedz + P_MobjFlip(mo);
mo->standingslope = NULL;
}
}
@@ -1684,6 +1679,7 @@ void P_XYMovement(mobj_t *mo)
static void P_RingXYMovement(mobj_t *mo)
{
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
if (!P_SceneryTryMove(mo, mo->x + mo->momx, mo->y + mo->momy))
@@ -1694,6 +1690,7 @@ static void P_SceneryXYMovement(mobj_t *mo)
{
fixed_t oldx, oldy; // reducing bobbing/momentum on ice when up against walls
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
oldx = mo->x;
@@ -1731,6 +1728,7 @@ static void P_AdjustMobjFloorZ_FFloors(mobj_t *mo, sector_t *sector, UINT8 motyp
fixed_t delta1, delta2, thingtop;
fixed_t topheight, bottomheight;
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
thingtop = mo->z + mo->height;
@@ -1807,6 +1805,7 @@ static void P_AdjustMobjFloorZ_PolyObjs(mobj_t *mo, subsector_t *subsec)
fixed_t delta1, delta2, thingtop;
fixed_t polytop, polybottom;
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
thingtop = mo->z + mo->height;
@@ -1850,6 +1849,7 @@ static void P_AdjustMobjFloorZ_PolyObjs(mobj_t *mo, subsector_t *subsec)
static void P_RingZMovement(mobj_t *mo)
{
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
// Intercept the stupid 'fall through 3dfloors' bug
@@ -1884,6 +1884,7 @@ static void P_RingZMovement(mobj_t *mo)
boolean P_CheckDeathPitCollide(mobj_t *mo)
{
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
const INT32 secspecial = GETSECSPECIAL(mo->subsector->sector->special, 1);
@@ -1900,6 +1901,7 @@ boolean P_CheckDeathPitCollide(mobj_t *mo)
boolean P_CheckSolidLava(mobj_t *mo, ffloor_t *rover)
{
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
if (rover->flags & FF_SWIMMABLE && GETSECSPECIAL(rover->master->frontsector->special, 1) == 3
@@ -1918,6 +1920,7 @@ static boolean P_ZMovement(mobj_t *mo)
{
fixed_t dist, delta;
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
// Intercept the stupid 'fall through 3dfloors' bug
@@ -2374,6 +2377,7 @@ static boolean P_ZMovement(mobj_t *mo)
static void P_PlayerZMovement(mobj_t *mo)
{
I_Assert(mo != NULL);
I_Assert(!P_MobjWasRemoved(mo));
if (!mo->player)
@@ -2439,7 +2443,6 @@ static void P_PlayerZMovement(mobj_t *mo)
}
goto nightsdone;
}
// Get up if you fell.
if ((mo->state == &states[mo->info->painstate] || mo->state == &states[S_KART_SPIN])
&& mo->player->kartstuff[k_spinouttimer] == 0 && mo->player->kartstuff[k_squishedtimer] == 0) // SRB2kart
@@ -2492,7 +2495,7 @@ static void P_PlayerZMovement(mobj_t *mo)
polyobj_t *po = newsubsec->polyList;
sector_t *polysec;
while (po)
while(po)
{
if (!P_MobjInsidePolyobj(po, mo) || !(po->flags & POF_SOLID))
{
@@ -2720,7 +2723,6 @@ static boolean P_SceneryZMovement(mobj_t *mo)
P_RemoveMobj(mo);
return false;
}
if ((!(mo->eflags & MFE_VERTICALFLIP) && mo->z <= mo->floorz)
|| (mo->eflags & MFE_VERTICALFLIP && mo->z+mo->height >= mo->ceilingz)) // Hit the floor, so split!
{
@@ -2758,7 +2760,6 @@ static boolean P_SceneryZMovement(mobj_t *mo)
P_RemoveMobj(mo);
return false;
}
// Soniccd seed turns into a flower!
if ((!(mo->eflags & MFE_VERTICALFLIP) && mo->z <= mo->floorz)
|| (mo->eflags & MFE_VERTICALFLIP && mo->z+mo->height >= mo->ceilingz))
@@ -2869,29 +2870,22 @@ void P_MobjCheckWater(mobj_t *mobj)
|| ((rover->flags & FF_BLOCKOTHERS) && !mobj->player)))
continue;
fixed_t topcheck, bottomcheck;
topheight = P_GetFFloorTopZAt(rover, mobj->x, mobj->y);
bottomheight = P_GetFFloorBottomZAt(rover, mobj->x, mobj->y);
if (mobj->eflags & MFE_VERTICALFLIP)
{
topcheck = (thingtop - FixedMul(mobj->info->height/2, mobj->scale));
bottomcheck = thingtop;
if (topheight < (thingtop - FixedMul(mobj->info->height/2, mobj->scale))
|| bottomheight > thingtop)
continue;
}
else
{
topcheck = mobj->z;
bottomcheck = (mobj->z + FixedMul(mobj->info->height/2, mobj->scale));
if (topheight < mobj->z
|| bottomheight > (mobj->z + FixedMul(mobj->info->height/2, mobj->scale)))
continue;
}
topheight = P_GetFFloorTopZAt(rover, mobj->x, mobj->y);
if (topheight < topcheck)
continue;
bottomheight = P_GetFFloorBottomZAt(rover, mobj->x, mobj->y);
if (bottomheight > bottomcheck)
continue;
// Set the watertop and waterbottom
mobj->watertop = topheight;
mobj->waterbottom = bottomheight;
@@ -3097,14 +3091,11 @@ static void P_SceneryCheckWater(mobj_t *mobj)
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_SWIMMABLE) || rover->flags & FF_BLOCKOTHERS)
continue;
topheight = P_GetFFloorTopZAt(rover, mobj->x, mobj->y);
if (topheight <= mobj->z)
continue;
topheight = P_GetFFloorTopZAt(rover, mobj->x, mobj->y);
bottomheight = P_GetFFloorBottomZAt(rover, mobj->x, mobj->y);
if (bottomheight > (mobj->z + FixedMul(mobj->info->height >> 1, mobj->scale)))
if (topheight <= mobj->z
|| bottomheight > (mobj->z + FixedMul(mobj->info->height >> 1, mobj->scale)))
continue;
if (mobj->z + FixedMul(mobj->info->height, mobj->scale) > topheight)
@@ -3369,6 +3360,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
{
msecnode_t *node;
I_Assert(mobj != NULL);
I_Assert(mobj->player != NULL);
I_Assert(!P_MobjWasRemoved(mobj));
@@ -3383,23 +3375,20 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
mobj->eflags &= ~MFE_JUSTSTEPPEDDOWN;
// Zoom tube
if (mobj->tracer)
if (UNLIKELY(mobj->tracer && mobj->tracer->type == MT_TUBEWAYPOINT))
{
if (mobj->tracer->type == MT_TUBEWAYPOINT)
{
P_UnsetThingPosition(mobj);
mobj->x += mobj->momx;
mobj->y += mobj->momy;
mobj->z += mobj->momz;
P_SetThingPosition(mobj);
P_CheckPosition(mobj, mobj->x, mobj->y);
goto animonly;
}
else if (UNLIKELY(mobj->player->pflags & PF_MACESPIN))
{
P_CheckPosition(mobj, mobj->x, mobj->y);
goto animonly;
}
P_UnsetThingPosition(mobj);
mobj->x += mobj->momx;
mobj->y += mobj->momy;
mobj->z += mobj->momz;
P_SetThingPosition(mobj);
P_CheckPosition(mobj, mobj->x, mobj->y);
goto animonly;
}
else if (UNLIKELY(mobj->player->pflags & PF_MACESPIN && mobj->tracer))
{
P_CheckPosition(mobj, mobj->x, mobj->y);
goto animonly;
}
// Needed for gravity boots
@@ -3415,30 +3404,24 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
else
P_TryMove(mobj, mobj->x, mobj->y, true);
if (!(netgame && mobj->player->spectator))
if (LIKELY(!(netgame && mobj->player->spectator)))
{
// Crumbling platforms
for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next)
{
fixed_t topheight, bottomheight;
ffloor_t *rover;
for (rover = node->m_sector->ffloors; rover; rover = rover->next)
{
boolean oncrumble;
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_CRUMBLE))
continue;
if (mobj->eflags & MFE_VERTICALFLIP)
{
oncrumble = P_GetSpecialBottomZ(mobj, sectors + rover->secnum, node->m_sector) == mobj->z + mobj->height; // You nut.
}
else
{
oncrumble = P_GetSpecialTopZ(mobj, sectors + rover->secnum, node->m_sector) == mobj->z;
}
topheight = P_GetSpecialTopZ(mobj, sectors + rover->secnum, node->m_sector);
bottomheight = P_GetSpecialBottomZ(mobj, sectors + rover->secnum, node->m_sector);
if (oncrumble)
if ((topheight == mobj->z && !(mobj->eflags & MFE_VERTICALFLIP))
|| (bottomheight == mobj->z + mobj->height && mobj->eflags & MFE_VERTICALFLIP)) // You nut.
EV_StartCrumble(rover->master->frontsector, rover, (rover->flags & FF_FLOATBOB), mobj->player, rover->alpha, !(rover->flags & FF_NORETURN));
}
}
@@ -3541,9 +3524,11 @@ animonly:
static void P_CalculatePrecipFloor(precipmobj_t *mobj)
{
// recalculate floorz each time
const sector_t *sec = (mobj && mobj->subsector) ? mobj->subsector->sector : NULL;
const sector_t *sec;
if (!sec)
if (mobj && mobj->subsector && mobj->subsector->sector)
sec = mobj->subsector->sector;
else
return;
mobj->floorz = P_GetSectorFloorZAt(sec, mobj->x, mobj->y);
@@ -3637,10 +3622,8 @@ boolean P_PrecipThinker(precipmobj_t *mobj)
return true;
// only recalc this twice a second (doubt anyone will notice this lulul)
if ((leveltime % (TICRATE/2)) == 0)
{
if ((leveltime % 17) == 0)
P_CalculatePrecipFloor(mobj);
}
// adjust height
if ((mobj->z += mobj->momz) <= mobj->floorz)
@@ -4303,7 +4286,7 @@ static void P_Boss4PopSpikeballs(mobj_t *mobj)
{
mobj_t *base = mobj->tracer, *seg, *next;
P_SetTarget(&mobj->tracer, NULL);
while (base)
while(base)
{
next = base->tracer;
P_SetTarget(&base->tracer, NULL);
@@ -9024,9 +9007,10 @@ static void P_FiringThink(mobj_t *mobj)
//
void P_MobjThinker(mobj_t *mobj)
{
I_Assert(mobj != NULL);
I_Assert(!P_MobjWasRemoved(mobj));
if (mobj->flags & MF_NOTHINK)
if (UNLIKELY(mobj->flags & MF_NOTHINK))
return;
// Remove dead target/tracer.
@@ -9127,6 +9111,7 @@ void P_MobjThinker(mobj_t *mobj)
if (mobj->fuse && !P_FuseThink(mobj))
return;
I_Assert(mobj != NULL);
I_Assert(!P_MobjWasRemoved(mobj));
if (mobj->momx || mobj->momy || (mobj->flags2 & MF2_SKULLFLY))
@@ -9222,6 +9207,7 @@ boolean P_RailThinker(mobj_t *mobj)
{
fixed_t x, y, z;
I_Assert(mobj != NULL);
I_Assert(!P_MobjWasRemoved(mobj));
x = mobj->x, y = mobj->y, z = mobj->z;
@@ -9247,6 +9233,7 @@ void P_PushableThinker(mobj_t *mobj)
{
sector_t *sec;
I_Assert(mobj != NULL);
I_Assert(!P_MobjWasRemoved(mobj));
if (!mobj)
@@ -9284,13 +9271,12 @@ void P_PushableThinker(mobj_t *mobj)
x = mobj->spawnpoint->x << FRACBITS;
y = mobj->spawnpoint->y << FRACBITS;
ss = R_PointInSubsector(x, y);
if (mobj->spawnpoint->z != 0)
z = mobj->spawnpoint->z << FRACBITS;
else
{
ss = R_PointInSubsector(x, y);
z = ss->sector->floorheight;
}
spawnmo = P_SpawnMobj(x, y, z, mobj->type);
if (spawnmo)
@@ -10271,7 +10257,7 @@ void P_SpawnPrecipitation(void)
if (curWeather == PRECIP_BLANK)
rainmo->precipflags |= PCF_INVISIBLE;
floorz = rainmo->floorz >> FRACBITS;
floorz = rainmo->floorz >> FRACBITS;
ceilingz = rainmo->ceilingz >> FRACBITS;
if (floorz < ceilingz)
@@ -10338,6 +10324,8 @@ void P_PrecipitationEffects(void)
return;
}
boolean sounds_rain = ((cv_drawdist_precip.value != 0) && rainsfx && (!leveltime || leveltime % 80 == 1));
// Currently thunderstorming with lightning, and we're sounding the thunder...
// and where there's thunder, there's gotta be lightning!
if (effects_lightning && lightningStrike)
@@ -10359,8 +10347,6 @@ void P_PrecipitationEffects(void)
if (sound_disabled)
return; // Sound off? D'aw, no fun.
const boolean sounds_rain = ((cv_drawdist_precip.value != 0) && rainsfx && (!leveltime || leveltime % 80 == 1));
if (!sounds_rain && !sounds_thunder)
return; // no need to calculate volume at ALL
@@ -11849,6 +11835,8 @@ void P_SpawnHoops(mapthing_t *mthing)
x = mthing->x << FRACBITS;
y = mthing->y << FRACBITS;
sec = R_PointInSubsector(x, y)->sector;
// Save our flags!
if (mthing->type == 1713)
z = (mthing->options >> ZSHIFT) << FRACBITS;
@@ -11860,8 +11848,6 @@ void P_SpawnHoops(mapthing_t *mthing)
if (P_MobjWasRemoved(hoopcenter))
return;
sec = R_PointInSubsector(x, y)->sector;
hoopcenter->spawnpoint = mthing;
z += P_GetSectorFloorZAt(sec, x, y);
+4
View File
@@ -421,6 +421,10 @@ typedef struct mobj_s
//
// For precipitation
//
// Sometimes this is casted to a mobj_t,
// so please keep the start of the
// structure the same.
//
typedef struct precipmobj_s
{
// List: thinker links.
+1 -2
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;
+1 -2
View File
@@ -4441,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;
+5 -15
View File
@@ -157,7 +157,6 @@ void P_CalcHeight(player_t *player)
if (player->viewz > mo->ceilingz - FixedMul(FRACUNIT, mo->scale))
player->viewz = mo->ceilingz - FixedMul(FRACUNIT, mo->scale);
}
return;
}
@@ -775,7 +774,7 @@ boolean P_IsObjectInGoop(mobj_t *mo)
//
boolean P_IsObjectOnGround(mobj_t *mo)
{
if (P_IsObjectInGoop(mo))
if (UNLIKELY(P_IsObjectInGoop(mo)))
{
// but I don't want you to ever 'stand' while submerged in goo.
// You're in constant vertical momentum, even if you get stuck on something.
@@ -1393,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*/)
{
@@ -1514,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;
@@ -2112,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)
@@ -2273,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",
@@ -2396,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);
}
@@ -3976,12 +3970,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;
}
@@ -4758,7 +4749,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;
+5 -7
View File
@@ -221,9 +221,8 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel,
tempsec->floorheight = s->floorheight;
tempsec->ceilingheight = s->ceilingheight;
if ((underwater && (tempsec->floorheight = sec->floorheight,
tempsec->ceilingheight = s->floorheight - 1, !back)) ||
viewz <= s->floorheight)
if ((underwater && (tempsec-> floorheight = sec->floorheight,
tempsec->ceilingheight = s->floorheight - 1, !back)) || viewz <= s->floorheight)
{ // head-below-floor hack
tempsec->floorpic = s->floorpic;
tempsec->floor_xoffs = s->floor_xoffs;
@@ -259,8 +258,8 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel,
*ceilinglightlevel = s->ceilinglightsec == -1 ? s->lightlevel
: sectors[s->ceilinglightsec].lightlevel;
}
else if (heightsec != -1 && viewz >= sectors[heightsec].ceilingheight &&
sec->ceilingheight > s->ceilingheight)
else if (heightsec != -1 && viewz >= sectors[heightsec].ceilingheight
&& sec->ceilingheight > s->ceilingheight)
{ // Above-ceiling hack
tempsec->ceilingheight = s->ceilingheight;
tempsec->floorheight = s->ceilingheight + 1;
@@ -297,8 +296,7 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel,
*ceilinglightlevel = s->ceilinglightsec == -1 ? s->lightlevel :
sectors[s->ceilinglightsec].lightlevel;
}
sec = tempsec; // Use other sector
sec = tempsec;
}
return sec;
+9 -10
View File
@@ -531,10 +531,11 @@ typedef struct seg_s
vertex_t *v1;
vertex_t *v2;
#ifdef HWRENDER
floatvertex_t fv1; // v1 in floats - precalculated
floatvertex_t fv2; // v2 in floats - precalculated
#endif
INT32 side;
fixed_t offset;
angle_t angle;
side_t *sidedef;
line_t *linedef;
@@ -544,13 +545,11 @@ typedef struct seg_s
sector_t *frontsector;
sector_t *backsector;
INT32 side;
fixed_t length; // precalculated seg length
fixed_t offset;
angle_t angle;
#ifdef HWRENDER
floatvertex_t fv1; // v1 in floats - precalculated
floatvertex_t fv2; // v2 in floats - precalculated
#endif
polyobj_t *polyseg;
// Fake contrast calculated on level load
+7 -10
View File
@@ -532,12 +532,9 @@ typedef struct drawcolumndata_temp_s
// e6y: resolution limitation is removed
UINT8 *buf;
INT32 startx;
ColumnFlushType type;
INT32 commontop, commonbot;
INT32 startx;
ColumnFlushType type;
INT32 commontop, commonbot;
UINT8 *transmap;
// SoM 7-28-04: Fix the fuzz problem.
UINT8 *translation;
@@ -565,8 +562,8 @@ FUNCNORETURN static ATTRNORETURN void R_QuadFlushError(void)
}
static void (*R_FlushWholeColumns)(void) = R_FlushWholeError;
static void (*R_FlushHTColumns)(void) = R_FlushHTError;
static void (*R_FlushQuadColumn)(void) = R_QuadFlushError;
static void (*R_FlushHTColumns)(void) = R_FlushHTError;
static void (*R_FlushQuadColumn)(void) = R_QuadFlushError;
static void R_FlushColumns(void)
{
@@ -598,8 +595,8 @@ void R_ResetColumnBuffer(void)
temp_dc.type = FLUSH_NONE;
R_FlushWholeColumns = R_FlushWholeError;
R_FlushHTColumns = R_FlushHTError;
R_FlushQuadColumn = R_QuadFlushError;
R_FlushHTColumns = R_FlushHTError;
R_FlushQuadColumn = R_QuadFlushError;
}
/** \brief The R_InitViewBuffer function
+1 -2
View File
@@ -161,7 +161,7 @@ static void R_ParseSpriteInfo(boolean spr2)
if (i == NUMSPRITES)
I_Error("Error parsing SPRTINFO lump: Unknown sprite name \"%s\"", newSpriteName);
if (!memcmp(newSpriteName, sprnames[i], 4))
if (!memcmp(newSpriteName,sprnames[i], 4))
{
sprnum = static_cast<spritenum_t>(i);
break;
@@ -443,7 +443,6 @@ void *Patch_AllocateHardwarePatch(patch_t *patch)
GLPatch_t *glPatch = static_cast<GLPatch_t*>(Z_Calloc(sizeof(GLPatch_t), PU_HWRPATCHINFO, &patch->hardware));
glPatch->mipmap = static_cast<GLMipmap_t*>(Z_Calloc(sizeof(GLMipmap_t), PU_HWRPATCHINFO, &glPatch->mipmap));
}
return (void *)(patch->hardware);
}
+10 -11
View File
@@ -166,13 +166,11 @@ static void R_InstallSpriteLump(UINT16 wad, // graphics patch
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has rotations and a rot = 0 lump\n", spritename, cn);
sprtemp[frame].rotate = SRF_SINGLE;
for (r = 0; r < 8; r++)
{
sprtemp[frame].lumppat[r] = lumppat;
sprtemp[frame].lumpid[r] = lumpid;
}
sprtemp[frame].flip = flipped ? UINT8_MAX : 0; // 11111111 in binary
return;
}
@@ -269,7 +267,8 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
if (spritedef->numframes) // (then spriteframes is not null)
{
// copy the already defined sprite frames
memcpy(sprtemp, spritedef->spriteframes, spritedef->numframes * sizeof (spriteframe_t));
memcpy(sprtemp, spritedef->spriteframes,
spritedef->numframes * sizeof (spriteframe_t));
maxframe = spritedef->numframes - 1;
}
@@ -1148,7 +1147,7 @@ fixed_t R_GetSpriteDirectionalLighting(angle_t angle)
fixed_t extralight = 0;
light = FixedMul(FINECOSINE(angle >> ANGLETOFINESHIFT), FINECOSINE(maplighting.angle >> ANGLETOFINESHIFT))
+ FixedMul(FINESINE(angle >> ANGLETOFINESHIFT), FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
+ FixedMul(FINESINE(angle >> ANGLETOFINESHIFT), FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
light = (light + FRACUNIT) / 2;
light = FixedMul(light, FRACUNIT - FSIN(abs(AngleDeltaSigned(angle, maplighting.angle)) / 2));
@@ -1357,9 +1356,9 @@ static void R_ProjectSprite(mobj_t *thing)
I_Assert(lump < max_spritelumps);
spr_width = spritecachedinfo[lump].width;
spr_height = spritecachedinfo[lump].height;
spr_offset = spritecachedinfo[lump].offset;
spr_width = spritecachedinfo[lump].width;
spr_height = spritecachedinfo[lump].height;
spr_offset = spritecachedinfo[lump].offset;
spr_topoffset = spritecachedinfo[lump].topoffset;
#ifdef ROTSPRITE
@@ -1400,10 +1399,10 @@ static void R_ProjectSprite(mobj_t *thing)
if (rotsprite != NULL)
{
spr_width = rotsprite->width << FRACBITS;
spr_height = rotsprite->height << FRACBITS;
spr_offset = rotsprite->leftoffset << FRACBITS;
spr_topoffset = rotsprite->topoffset << FRACBITS;
spr_width = rotsprite->width << FRACBITS;
spr_height = rotsprite->height << FRACBITS;
spr_offset = rotsprite->leftoffset << FRACBITS;
spr_topoffset = rotsprite->topoffset << FRACBITS;
spr_topoffset += FEETADJUST;
// flip -> rotate, not rotate -> flip
+2 -2
View File
@@ -722,12 +722,12 @@ void S_UpdateSounds(void)
if (dedicated || sound_disabled)
return;
memset(listenmobj, 0, sizeof(listenmobj));
for (i = 0; i <= splitscreen; i++)
{
player_t *player = &players[displayplayers[i]];
listenmobj[i] = NULL;
if (player->awayviewtics)
{
listenmobj[i] = player->awayviewmobj;
+4 -1
View File
@@ -277,7 +277,10 @@ void SCR_Recalc(void)
// vid.recalc lasts only for the next refresh...
con_recalc = true;
am_recalc = true;
intermissionbginit = false;
// HACK: set lastdraw so intermission bg can refresh after resolution change
if (gamestate == GS_INTERMISSION)
lastdraw = true;
}
// Check for screen cmd-line parms: to force a resolution.
+12 -39
View File
@@ -961,11 +961,6 @@ static int joy_open(int playerIndex, int joyIndex)
return SDL_CONTROLLER_AXIS_MAX;
}
void I_SetJoystickFocus(void)
{
SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, cv_gamepadifunfocused.value ? "1" : "0");
}
//
// I_InitJoystick
//
@@ -980,18 +975,6 @@ void I_InitJoystick(UINT8 index)
if (M_CheckParm("-nojoy"))
return;
{
char dbpath[1024];
sprintf(dbpath, "%s" PATHSEP "gamecontrollerdb.txt", srb2path);
SDL_GameControllerAddMappingsFromFile(dbpath);
}
{
char dbpath[1024];
sprintf(dbpath, "%s" PATHSEP "gamecontrollerdb_user.txt", srb2home);
SDL_GameControllerAddMappingsFromFile(dbpath);
}
if (M_CheckParm("-noxinput"))
SDL_SetHintWithPriority("SDL_XINPUT_ENABLED", "0", SDL_HINT_OVERRIDE);
@@ -1662,15 +1645,9 @@ static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_ms
signame = "SIGSEGV";
break;
#ifdef SIGTERM
case SIGTERM: // Software termination signal from terminate
sigmsg = ("SRB2Kart-Saturn was terminated by a terminate signal.");
signame = "SIGTERM";
break;
#endif
#ifdef SIGKILL
case SIGKILL: // Software termination signal from kill
case SIGTERM: // Software termination signal from kill
sigmsg = ("SRB2Kart-Saturn was terminated by a kill signal.");
signame = "SIGKILL";
signame = "SIGTERM";
break;
#endif
#ifdef SIGBREAK
@@ -1868,7 +1845,9 @@ static void I_RegisterChildSignals(void)
signal(SIGABRT, signal_handler_child);
signal(SIGFPE, signal_handler_child);
}
#endif
#ifdef NEWSIGNALHANDLER
FUNCNORETURN static ATTRNORETURN void newsignalhandler_Warn(const char *pr)
{
char text[128];
@@ -1904,18 +1883,6 @@ static void I_Fork(void)
I_RegisterChildSignals();
break;
default:
// ignore those, those are handled by child process
// otherwise parent might exit before it
// and the below stuff wont run and your terminal will be left in an awkward state
#ifdef SIGINT
signal(SIGINT, SIG_IGN);
#endif
#ifdef SIGBREAK
signal(SIGBREAK, SIG_IGN);
#endif
#ifdef SIGTERM
signal(SIGTERM, SIG_IGN);
#endif
#ifdef LOGMESSAGES
if (logstream)
fclose(logstream);/* the child has this */
@@ -1924,8 +1891,6 @@ static void I_Fork(void)
#ifdef LOGMESSAGES
/* By the way, exit closes files. */
logstream = fopen(logfilename, "at");
#else
logstream = 0;
#endif
if (c == -1)
{
@@ -2008,6 +1973,7 @@ FUNCNORETURN void ATTRNORETURN I_Quit(void)
is_quitting = true;
SDL_ShowCursor(SDL_TRUE);
I_ShutdownConsole();
M_SaveConfig(NULL); //save game config, cvars..
D_SaveBan(); // save the ban list
G_SaveGameData(false); // Tails 12-08-2002
@@ -2036,6 +2002,7 @@ FUNCNORETURN void ATTRNORETURN I_Quit(void)
if (myargmalloc)
free(myargv); // Deallocate allocated memory
W_Shutdown();
exit(0);
}
@@ -2095,6 +2062,7 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
sigttl = "SRB2Kart " VERSIONSTRING " Recursive Error";
I_ShowSimpleErrorBox(sigttl, buffer);
W_Shutdown();
exit(-1); // recursive errors detected
}
}
@@ -2113,6 +2081,8 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
// ---
I_ShutdownConsole();
M_SaveConfig(NULL); // save game config, cvars..
D_SaveBan(); // save the ban list
G_SaveGameData(false); // Tails 12-08-2002
@@ -2134,6 +2104,8 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
//I_ShowSimpleErrorBox(sigttl, buffer);
I_ShowErrorBox(sigttl, buffer);
W_Shutdown();
#if defined (PARANOIA) && defined (__CYGWIN__)
*(INT32 *)2 = 4; //Alam: Debug!
#endif
@@ -2334,6 +2306,7 @@ char *I_GetUserName(void)
strncpy(username, p, MAXPLAYERNAME);
}
if (!fastcmp(username, ""))
return username;
+1
View File
@@ -108,6 +108,7 @@ static void KeyboardLayout_OnChange(void)
{
if (cv_keyboardlayout.value != 2)
SDL_StopTextInput();
HU_Shiftform();
}
static CV_PossibleValue_t keyboardlayout_cons_t[] = {{1,"Default US"}, {2, "Native"}, {3, "AZERTY"}, {0, NULL}};
+4 -13
View File
@@ -240,18 +240,7 @@ void OglSdlFinishUpdate(SDL_Window *window)
}
#endif
if (HWR_ShouldUsePaletteRendering())
{
// Final postprocess step of palette rendering, after everything else has been drawn.
GL_SetShader(HWR_GetShaderFromTarget(SHADER_PALETTE_POSTPROCESS));
GL_EnableShader();
HWR_DrawScreenFinalTexture(sdlw, sdlh);
GL_UnSetShader();
}
else
{
HWR_DrawScreenFinalTexture(sdlw, sdlh);
}
HWR_DrawScreenFinalTexture(sdlw, sdlh, HWR_ShouldUsePaletteRendering());
#ifdef USE_FBO_OGL
if (usefbo)
@@ -267,12 +256,14 @@ void OglSdlFinishUpdate(SDL_Window *window)
// Sryder: We need to draw the final screen texture again into the other buffer in the original position so that
// effects that want to take the old screen can do so after this
// well we dont need it on native res it seems
#if 0
#ifdef USE_FBO_OGL
if ((!I_CheckNativeRes() && !usefbo) || WipeInAction)
#else
if (!I_CheckNativeRes() || WipeInAction)
#endif
HWR_DrawScreenFinalTexture(realwidth, realheight);
#endif
HWR_DrawScreenFinalTexture(realwidth, realheight, false);
}
#endif //HWRENDER
+1 -1
View File
@@ -128,7 +128,7 @@ wadfile_t *wadfiles[MAX_WADFILES] = {}; // 0 to numwadfiles-1 are valid
// If not done on a Mac then open wad files
// can prevent removable media they are on from
// being ejected
DESTRUCTOR static void W_Shutdown(void)
void W_Shutdown(void)
{
lumpnum_map_cleanup(&lumpnumcache);
+2
View File
@@ -154,6 +154,8 @@ extern wadfile_t *wadfiles[MAX_WADFILES];
// =========================================================================
void W_Shutdown(void);
// Opens a WAD file. Returns the FILE * handle for the file, or NULL if not found or could not be opened
FILE *W_OpenWadFile(const char **filename, boolean useerrors);
// Load and add a wadfile to the active wad files, returns numbers of lumps, INT16_MAX on error
+1 -3
View File
@@ -330,7 +330,7 @@ static void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 x, INT32 hilicol)
V_DrawCenteredString(x+6, y, 0, va("%d", standings->pos[i]));
// localskins are amazing
if (*standings->color[i] != SKINCOLOR_NONE)
if (standings->color[i] != SKINCOLOR_NONE)
{
UINT8 *colormap = R_GetTranslationColormap(*standings->character[i], *standings->color[i], GTC_CACHE);
INT32 skinnum = (player->localskin ? (player->localskin - 1) : *standings->character[i]);
@@ -433,7 +433,6 @@ void Y_IntermissionDrawer(void)
return;
if (cv_betainterscreen.value == 1
|| !intermissionbginit
#ifdef HWRENDER
|| (rendermode == render_opengl && cv_glscreentextures.value != 2) // use the neato kart bg for intermission on disabled screen textures
#endif
@@ -795,7 +794,6 @@ void Y_EndIntermission(void)
endtic = -1;
sorttic = -1;
intertype = int_none;
intermissionbginit = false; // not sure if this is the right place to reset, but i guess it works for now....
}
//