Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f7de828fc4 | ||
|
|
6eca90da4a |
No files matched your search
+2
-7
@@ -93,8 +93,7 @@
|
||||
# NOLDWARNING=1 - ?
|
||||
# NOSDLMAIN=1 - ?
|
||||
# SDLMAIN=1 - ?
|
||||
# NOLTO=1 - Disable link time optimizations
|
||||
# USEJEMALLOC=1 Enable building with jemalloc Allocator to replace GLibc malloc, might improve performance
|
||||
# USELTO=1 - Enable building with LTO.
|
||||
#
|
||||
# Library configuration flags:
|
||||
# Everything here is an override.
|
||||
@@ -261,7 +260,7 @@ debug_opts=-D_DEBUG
|
||||
else # build a normal optimized version
|
||||
debug_opts=-DNDEBUG
|
||||
opts+=-O3
|
||||
ifndef NOLTO
|
||||
ifdef USELTO
|
||||
# compile with LTO
|
||||
opts+=-flto=auto
|
||||
libs+=-flto=auto
|
||||
@@ -280,10 +279,6 @@ opts+=-O1 -fsanitize=undefined -fno-omit-frame-pointer
|
||||
libs+=-fsanitize=undefined
|
||||
endif
|
||||
|
||||
ifdef USEJEMALLOC
|
||||
libs+=-ljemalloc
|
||||
endif
|
||||
|
||||
ifneq (,$(filter $(CC) $(CXX),clang clang++))
|
||||
libs+=-fuse-ld=lld
|
||||
endif
|
||||
|
||||
@@ -64,7 +64,6 @@ endif
|
||||
|
||||
# This must have high to low order.
|
||||
gcc_versions:=\
|
||||
161 160 16\
|
||||
152 151 150 15\
|
||||
142 141 140 14\
|
||||
133 132 131 130 13\
|
||||
@@ -78,7 +77,7 @@ gcc_versions:=\
|
||||
55 54 53 52 51 50\
|
||||
49 48 47 46 45 44 43 42 41 40
|
||||
|
||||
latest_gcc_version:=16.1
|
||||
latest_gcc_version:=15.2
|
||||
|
||||
# Automatically set version flag, but not if one was
|
||||
# manually set. And don't bother if this is a clean only
|
||||
|
||||
@@ -8,7 +8,6 @@ passthru_opts+=\
|
||||
HAVE_MINIUPNPC\
|
||||
HAVE_DISCORDRPC DEVELOP\
|
||||
NOHOLEPUNCH\
|
||||
HAVE_IPV6\
|
||||
|
||||
# build with debugging information
|
||||
ifdef DEBUGMODE
|
||||
|
||||
+8
-17
@@ -519,22 +519,6 @@ LUA_API int lua_pushthread (lua_State *L) {
|
||||
** get functions (Lua -> stack)
|
||||
*/
|
||||
|
||||
static void auxgetstr (lua_State *L, TValue *t, const char *k) {
|
||||
TValue *slot;
|
||||
TValue key;
|
||||
TString *str = luaS_new(L, k);
|
||||
api_checkvalidindex(L, t);
|
||||
if (luaV_fastget(L, t, str, slot, luaH_getstr)) {
|
||||
setobj2s(L, L->top, slot);
|
||||
}
|
||||
else {
|
||||
setsvalue(L, &key, str);
|
||||
luaV_finishget(L, t, &key, L->top, slot);
|
||||
}
|
||||
api_incr_top(L);
|
||||
lua_unlock(L);
|
||||
}
|
||||
|
||||
|
||||
LUA_API void lua_gettable (lua_State *L, int idx) {
|
||||
StkId t;
|
||||
@@ -547,8 +531,15 @@ LUA_API void lua_gettable (lua_State *L, int idx) {
|
||||
|
||||
|
||||
LUA_API void lua_getfield (lua_State *L, int idx, const char *k) {
|
||||
StkId t;
|
||||
TValue key;
|
||||
lua_lock(L);
|
||||
auxgetstr(L, index2adr(L, idx), k);
|
||||
t = index2adr(L, idx);
|
||||
api_checkvalidindex(L, t);
|
||||
setsvalue(L, &key, luaS_new(L, k));
|
||||
luaV_gettable(L, t, &key, L->top);
|
||||
api_incr_top(L);
|
||||
lua_unlock(L);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+3
-15
@@ -20,7 +20,6 @@
|
||||
#define lauxlib_c
|
||||
#define LUA_LIB
|
||||
|
||||
#include "ldebug.h"
|
||||
#include "lua.h"
|
||||
|
||||
#include "lauxlib.h"
|
||||
@@ -469,19 +468,8 @@ LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) {
|
||||
|
||||
|
||||
LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {
|
||||
while (l) {
|
||||
size_t space = bufffree(B);
|
||||
if (space == 0) {
|
||||
luaL_prepbuffer(B);
|
||||
lua_assert(bufffree(B) == LUAL_BUFFERSIZE);
|
||||
space = LUAL_BUFFERSIZE;
|
||||
}
|
||||
if (space > l) space = l;
|
||||
memcpy(B->p, s, space);
|
||||
B->p += space;
|
||||
s += space;
|
||||
l -= space;
|
||||
}
|
||||
while (l--)
|
||||
luaL_addchar(B, *s++);
|
||||
}
|
||||
|
||||
|
||||
@@ -698,6 +686,6 @@ static int panic (lua_State *L) {
|
||||
|
||||
LUALIB_API lua_State *luaL_newstate (void) {
|
||||
lua_State *L = lua_newstate(l_alloc, NULL);
|
||||
if (l_likely(L)) lua_atpanic(L, &panic);
|
||||
if (L) lua_atpanic(L, &panic);
|
||||
return L;
|
||||
}
|
||||
+12
-13
@@ -790,19 +790,18 @@ void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {
|
||||
case OPR_BXOR: codearith(fs, OP_BXOR, e1, e2); break;
|
||||
case OPR_BSHL: codearith(fs, OP_BSHL, e1, e2); break;
|
||||
case OPR_BSHR: codearith(fs, OP_BSHR, e1, e2); break;
|
||||
case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV:
|
||||
case OPR_MOD: case OPR_POW: {
|
||||
codearith(fs, op - OPR_ADD + OP_ADD, e1, e2);
|
||||
break;
|
||||
}
|
||||
case OPR_EQ: case OPR_LT: case OPR_LE: {
|
||||
codecomp(fs, op - OPR_EQ + OP_EQ, 1, e1, e2);
|
||||
break;
|
||||
}
|
||||
case OPR_NE: case OPR_GT: case OPR_GE: {
|
||||
codecomp(fs, op - OPR_NE + OP_EQ, 0, e1, e2);
|
||||
break;
|
||||
}
|
||||
case OPR_ADD: codearith(fs, OP_ADD, e1, e2); break;
|
||||
case OPR_SUB: codearith(fs, OP_SUB, e1, e2); break;
|
||||
case OPR_MUL: codearith(fs, OP_MUL, e1, e2); break;
|
||||
case OPR_DIV: codearith(fs, OP_DIV, e1, e2); break;
|
||||
case OPR_MOD: codearith(fs, OP_MOD, e1, e2); break;
|
||||
case OPR_POW: codearith(fs, OP_POW, e1, e2); break;
|
||||
case OPR_EQ: codecomp(fs, OP_EQ, 1, e1, e2); break;
|
||||
case OPR_NE: codecomp(fs, OP_EQ, 0, e1, e2); break;
|
||||
case OPR_LT: codecomp(fs, OP_LT, 1, e1, e2); break;
|
||||
case OPR_LE: codecomp(fs, OP_LE, 1, e1, e2); break;
|
||||
case OPR_GT: codecomp(fs, OP_LT, 0, e1, e2); break;
|
||||
case OPR_GE: codecomp(fs, OP_LE, 0, e1, e2); break;
|
||||
default: lua_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -21,13 +21,13 @@
|
||||
|
||||
|
||||
/*
|
||||
** grep "ORDER OPR" if you change these enums (ORDER OP)
|
||||
** grep "ORDER OPR" if you change these enums
|
||||
*/
|
||||
typedef enum BinOpr {
|
||||
OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW,
|
||||
OPR_CONCAT,
|
||||
OPR_EQ, OPR_LT, OPR_LE,
|
||||
OPR_NE, OPR_GT, OPR_GE,
|
||||
OPR_NE, OPR_EQ,
|
||||
OPR_LT, OPR_LE, OPR_GT, OPR_GE,
|
||||
OPR_AND, OPR_OR,
|
||||
OPR_BAND, OPR_BOR, OPR_BXOR,
|
||||
OPR_BSHL, OPR_BSHR,
|
||||
|
||||
+5
-28
@@ -542,39 +542,16 @@ static const char *getobjname (lua_State *L, CallInfo *ci, int stackpos,
|
||||
|
||||
|
||||
static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {
|
||||
TMS tm = 0;
|
||||
Instruction i;
|
||||
if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1))
|
||||
return NULL; /* calling function is not Lua (or is unknown) */
|
||||
ci--; /* calling function */
|
||||
i = ci_func(ci)->l.p->code[currentpc(L, ci)];
|
||||
switch (GET_OPCODE(i)) {
|
||||
case OP_CALL:
|
||||
case OP_TAILCALL:
|
||||
case OP_TFORLOOP:
|
||||
return getobjname(L, ci, GETARG_A(i), name);
|
||||
case OP_GETGLOBAL:
|
||||
case OP_SELF:
|
||||
case OP_GETTABLE: tm = TM_INDEX; break;
|
||||
case OP_SETGLOBAL:
|
||||
case OP_SETTABLE: tm = TM_NEWINDEX; break;
|
||||
case OP_EQ: tm = TM_EQ; break;
|
||||
case OP_ADD: tm = TM_ADD; break;
|
||||
case OP_SUB: tm = TM_SUB; break;
|
||||
case OP_MUL: tm = TM_MUL; break;
|
||||
case OP_DIV: tm = TM_DIV; break;
|
||||
case OP_MOD: tm = TM_MOD; break;
|
||||
case OP_POW: tm = TM_POW; break;
|
||||
case OP_UNM: tm = TM_UNM; break;
|
||||
case OP_LEN: tm = TM_LEN; break;
|
||||
case OP_LT: tm = TM_LT; break;
|
||||
case OP_LE: tm = TM_LE; break;
|
||||
case OP_CONCAT: tm = TM_CONCAT; break;
|
||||
default:
|
||||
return NULL; /* else no useful name can be found */
|
||||
}
|
||||
*name = getstr(G(L)->tmname[tm]);
|
||||
return "metamethod";
|
||||
if (GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL ||
|
||||
GET_OPCODE(i) == OP_TFORLOOP)
|
||||
return getobjname(L, ci, GETARG_A(i), name);
|
||||
else
|
||||
return NULL; /* no useful name can be found */
|
||||
}
|
||||
|
||||
|
||||
|
||||
+4
-4
@@ -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: {
|
||||
@@ -164,7 +164,7 @@ void luaD_reallocCI (lua_State *L, int newsize) {
|
||||
|
||||
|
||||
void luaD_growstack (lua_State *L, int n) {
|
||||
if (n <= L->stacksize) /* double size is enough? */
|
||||
if (l_likely(n <= L->stacksize)) /* double size is enough? */
|
||||
luaD_reallocstack(L, 2*L->stacksize);
|
||||
else
|
||||
luaD_reallocstack(L, L->stacksize + n);
|
||||
@@ -318,7 +318,7 @@ int luaD_precall (lua_State *L, StkId func, int nresults) {
|
||||
ci->top = L->top + LUA_MINSTACK;
|
||||
lua_assert(ci->top <= L->stack_last);
|
||||
ci->nresults = nresults;
|
||||
if (l_unlikely(L->hookmask & LUA_MASKCALL))
|
||||
if (L->hookmask & LUA_MASKCALL)
|
||||
luaD_callhook(L, LUA_HOOKCALL, -1);
|
||||
lua_unlock(L);
|
||||
n = (*curr_func(L)->c.f)(L); /* do the actual call */
|
||||
|
||||
@@ -544,7 +544,6 @@ static void atomic (lua_State *L) {
|
||||
marktmu(g); /* mark `preserved' userdata */
|
||||
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;
|
||||
|
||||
+9
-10
@@ -356,21 +356,20 @@ static int read_line (lua_State *L, FILE *f) {
|
||||
|
||||
|
||||
static int read_chars (lua_State *L, FILE *f, size_t n) {
|
||||
size_t tbr = n; /* number of chars to be read */
|
||||
size_t rlen; /* how much to read in each cycle */
|
||||
size_t nr; /* number of chars actually read in each cycle */
|
||||
size_t rlen; /* how much to read */
|
||||
size_t nr; /* number of chars actually read */
|
||||
luaL_Buffer b;
|
||||
luaL_buffinit(L, &b);
|
||||
rlen = LUAL_BUFFERSIZE; /* try to read that much each time */
|
||||
do {
|
||||
char *p = luaL_prepbuffer(&b);
|
||||
if (rlen > tbr) rlen = tbr; /* cannot read more than asked */
|
||||
if (rlen > n) rlen = n; /* cannot read more than asked */
|
||||
nr = fread(p, sizeof(char), rlen, f);
|
||||
luaL_addsize(&b, nr);
|
||||
tbr -= nr; /* still have to read 'tbr' chars */
|
||||
} while (tbr > 0 && nr == rlen); /* until end of count or eof */
|
||||
n -= nr; /* still have to read `n' chars */
|
||||
} while (n > 0 && nr == rlen); /* until end of count or eof */
|
||||
luaL_pushresult(&b); /* close buffer */
|
||||
return (tbr == 0 || tbr < n); /* true iff read something */
|
||||
return (n == 0 || lua_objlen(L, -1) > 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -433,13 +432,13 @@ static int f_read (lua_State *L) {
|
||||
|
||||
static int io_readline (lua_State *L) {
|
||||
FILE *f = *(FILE **)lua_touserdata(L, lua_upvalueindex(1));
|
||||
int success;
|
||||
int sucess;
|
||||
if (f == NULL) /* file is already closed? */
|
||||
luaL_error(L, "file is already closed");
|
||||
success = read_line(L, f);
|
||||
sucess = read_line(L, f);
|
||||
if (ferror(f))
|
||||
return luaL_error(L, "%s", strerror(errno));
|
||||
if (success) return 1;
|
||||
if (sucess) return 1;
|
||||
else { /* EOF */
|
||||
if (lua_toboolean(L, lua_upvalueindex(2))) { /* generator created file? */
|
||||
lua_settop(L, 0);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */ \
|
||||
|
||||
+4
-4
@@ -881,10 +881,10 @@ static const struct {
|
||||
lu_byte right; /* right priority */
|
||||
} priority[] = { /* ORDER OPR */
|
||||
{6, 6}, {6, 6}, {7, 7}, {7, 7}, {7, 7}, /* `+' `-' `/' `%' */
|
||||
{10, 9}, {5, 4}, /* ^, .. (right associative) */
|
||||
{3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */
|
||||
{3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */
|
||||
{2, 2}, {1, 1} /* and, or */
|
||||
{10, 9}, {5, 4}, /* power and concat (right associative) */
|
||||
{3, 3}, {3, 3}, /* equality and inequality */
|
||||
{3, 3}, {3, 3}, {3, 3}, {3, 3}, /* order */
|
||||
{2, 2}, {1, 1} /* logical (and/or) */
|
||||
,{6, 6}, {6, 6}, {6, 6}, /* bit-wise (band/bor/bxor) */
|
||||
{7, 7}, {7, 7} /* shl/shr */
|
||||
};
|
||||
|
||||
+2
-1
@@ -73,9 +73,10 @@ static void f_luaopen (lua_State *L, void *ud) {
|
||||
stack_init(L, L); /* init stack */
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
+4
-118
@@ -18,9 +18,6 @@
|
||||
#include "lstring.h"
|
||||
|
||||
|
||||
#define MEMERRMSG "not enough memory"
|
||||
|
||||
|
||||
|
||||
void luaS_resize (lua_State *L, int newsize) {
|
||||
GCObject **newhash;
|
||||
@@ -54,7 +51,7 @@ static TString *newlstr (lua_State *L, const char *str, size_t l,
|
||||
unsigned int h) {
|
||||
TString *ts;
|
||||
stringtable *tb;
|
||||
if (l_unlikely(l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char)))
|
||||
if (l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char))
|
||||
luaM_toobig(L);
|
||||
ts = cast(TString *, luaM_malloc(L, (l+1)*sizeof(char)+sizeof(TString)));
|
||||
ts->tsv.len = l;
|
||||
@@ -75,106 +72,18 @@ 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. */
|
||||
static inline __attribute__((always_inline)) uint32_t getu32(const void* ptr)
|
||||
{
|
||||
uint32_t result;
|
||||
memcpy(&result, ptr, 4);
|
||||
return result;
|
||||
}
|
||||
|
||||
// smol macro to look a little less messy lul
|
||||
#define getu8(p) *cast(const uint8_t *, p)
|
||||
|
||||
/* Keyed sparse ARX string hash. Constant time. */
|
||||
static unsigned hash_sparse(const char *str, size_t len)
|
||||
{
|
||||
/* Constants taken from lookup3 hash by Bob Jenkins. */
|
||||
unsigned int a, b, h = cast(unsigned int, len);
|
||||
#define rol(x, n) (((x)<<(n)) | ((x)>>(-cast(int, n)&(8*sizeof(x)-1))))
|
||||
if (len >= 4) { /* Caveat: unaligned access! */
|
||||
a = getu32(str);
|
||||
h ^= getu32(str+len-4);
|
||||
b = getu32(str+(len>>1)-2);
|
||||
h ^= b; h -= rol(b, 14);
|
||||
b += getu32(str+(len>>2)-1);
|
||||
} else if (len > 0) {
|
||||
a = getu8(str);
|
||||
h ^= getu8(str+len-1);
|
||||
b = getu8(str+(len>>1));
|
||||
h ^= b; h -= rol(b, 14);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
a ^= h; a -= rol(h, 11);
|
||||
b ^= a; b -= rol(a, 25);
|
||||
h ^= b; h -= rol(b, 16);
|
||||
#undef rol
|
||||
return h;
|
||||
}
|
||||
|
||||
#undef getu8
|
||||
|
||||
|
||||
static inline __attribute__((always_inline)) unsigned luaS_hash (const char *str, size_t l) {
|
||||
#if 0
|
||||
TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
|
||||
GCObject *o;
|
||||
unsigned int h = cast(unsigned int, l); /* seed */
|
||||
size_t step = (l>>5)+1; /* if string is too long, don't hash all its chars */
|
||||
size_t l1;
|
||||
for (l1=l; l1>=step; l1-=step) /* compute hash */
|
||||
h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1]));
|
||||
return h;
|
||||
#else
|
||||
return hash_sparse(str, l);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** new string (with explicit length)
|
||||
*/
|
||||
TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
|
||||
GCObject *o;
|
||||
unsigned int h = luaS_hash(str, l);
|
||||
for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)];
|
||||
o != NULL;
|
||||
o = o->gch.next) {
|
||||
TString *ts = rawgco2ts(o);
|
||||
if (ts->tsv.hash == h &&
|
||||
ts->tsv.len == l &&
|
||||
(memcmp(str, getstr(ts), l) == 0)) {
|
||||
if (l_unlikely(ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0))) {
|
||||
/* string may be dead */
|
||||
if (isdead(G(L), o)) changewhite(o);
|
||||
return ts;
|
||||
@@ -184,29 +93,6 @@ TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Create or reuse a zero-terminated string, first checking in the
|
||||
** cache (using the string address as a key). The cache can contain
|
||||
** only zero-terminated strings, so it is safe to use 'strcmp' to
|
||||
** check hits.
|
||||
*/
|
||||
TString *luaS_new (lua_State *L, const char *str) {
|
||||
unsigned int i = point2uint(str) % STRCACHE_N; /* hash */
|
||||
int j;
|
||||
TString **p = G(L)->strcache[i];
|
||||
for (j = 0; j < STRCACHE_M; j++) {
|
||||
if (strcmp(str, getstr(p[j])) == 0) /* hit? */
|
||||
return p[j]; /* that is it */
|
||||
}
|
||||
/* normal route */
|
||||
for (j = STRCACHE_M - 1; j > 0; j--)
|
||||
p[j] = p[j - 1]; /* move out last element */
|
||||
/* new element is first in the list */
|
||||
p[0] = luaS_newlstr(L, str, strlen(str));
|
||||
return p[0];
|
||||
}
|
||||
|
||||
|
||||
Udata *luaS_newudata (lua_State *L, size_t s, Table *e) {
|
||||
Udata *u;
|
||||
if (l_unlikely(s > MAX_SIZET - sizeof(Udata)))
|
||||
|
||||
+2
-6
@@ -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
|
||||
@@ -81,7 +81,6 @@ static /*const*/ Node dummynode_ = {
|
||||
/*
|
||||
** hash for lua_Numbers
|
||||
*/
|
||||
#if 0
|
||||
static Node *hashnum (const Table *t, lua_Number n) {
|
||||
unsigned int a[numints];
|
||||
int i;
|
||||
@@ -91,12 +90,6 @@ static Node *hashnum (const Table *t, lua_Number n) {
|
||||
for (i = 1; i < numints; i++) a[0] += a[i];
|
||||
return hashmod(t, a[0]);
|
||||
}
|
||||
#else
|
||||
// our lua_Number is just typedef´d int32 so no need to do any of the above
|
||||
static inline Node *hashnum (const Table *t, lua_Number n) {
|
||||
return hashmod(t, cast(unsigned int, n));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
+38
-98
@@ -28,7 +28,7 @@
|
||||
|
||||
|
||||
|
||||
/* limit for table tag-method chains (to avoid infinite loops) */
|
||||
/* limit for table tag-method chains (to avoid loops) */
|
||||
#define MAXTAGLOOP 100
|
||||
|
||||
|
||||
@@ -105,42 +105,27 @@ static void callTM (lua_State *L, const TValue *f, const TValue *p1,
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Finish the table access 'val = t[key]'.
|
||||
** if 'slot' is NULL, 't' is not a table; otherwise, 'slot' points to
|
||||
** t[k] entry (which must be nil).
|
||||
*/
|
||||
void luaV_finishget (lua_State *L, TValue *t, TValue *key, StkId val,
|
||||
TValue *slot) {
|
||||
int loop; /* counter to avoid infinite loops */
|
||||
TValue *tm; /* metamethod */
|
||||
void luaV_gettable (lua_State *L, TValue *t, TValue *key, StkId val) {
|
||||
int loop;
|
||||
for (loop = 0; loop < MAXTAGLOOP; loop++) {
|
||||
if (slot == NULL) { /* 't' is not a table? */
|
||||
lua_assert(!ttistable(t));
|
||||
tm = luaT_gettmbyobj(L, t, TM_INDEX);
|
||||
if (l_unlikely(ttisnil(tm)))
|
||||
luaG_typeerror(L, t, "index"); /* no metamethod */
|
||||
/* else will try the metamethod */
|
||||
}
|
||||
else { /* 't' is a table */
|
||||
lua_assert(ttisnil(slot));
|
||||
tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); /* table's metamethod */
|
||||
if (tm == NULL) { /* no metamethod? */
|
||||
setnilvalue(val); /* result is nil */
|
||||
TValue *tm;
|
||||
if (ttistable(t)) { /* `t' is a table? */
|
||||
Table *h = hvalue(t);
|
||||
const TValue *res = luaH_get(h, key); /* do a primitive get */
|
||||
if (!ttisnil(res) || /* result is no nil? */
|
||||
(tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */
|
||||
setobj2s(L, val, res);
|
||||
return;
|
||||
}
|
||||
/* else will try the metamethod */
|
||||
/* else will try the tag method */
|
||||
}
|
||||
if (ttisfunction(tm)) { /* is metamethod a function? */
|
||||
callTMres(L, val, tm, t, key); /* call it */
|
||||
else if (l_unlikely(ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))))
|
||||
luaG_typeerror(L, t, "index");
|
||||
if (ttisfunction(tm)) {
|
||||
callTMres(L, val, tm, t, key);
|
||||
return;
|
||||
}
|
||||
t = tm; /* else try to access 'tm[key]' */
|
||||
if (luaV_fastget(L, t, key, slot, luaH_get)) { /* fast track? */
|
||||
setobj2s(L, val, slot); /* done */
|
||||
return;
|
||||
}
|
||||
/* else repeat (tail call 'luaV_finishget') */
|
||||
t = tm; /* else repeat with `tm' */
|
||||
}
|
||||
luaG_runerror(L, "loop in gettable");
|
||||
}
|
||||
@@ -154,12 +139,8 @@ void luaV_settable (lua_State *L, TValue *t, TValue *key, StkId val) {
|
||||
Table *h = hvalue(t);
|
||||
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? */
|
||||
if (!((ttisnil(oldval) && ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) != NULL)) ||
|
||||
((!ttisnil(oldval)) && ((tm = fasttm(L, h->metatable, TM_USEDINDEX)) != NULL)))) {
|
||||
setobj2t(L, oldval, val);
|
||||
luaC_barriert(L, h, val);
|
||||
return;
|
||||
@@ -385,7 +366,6 @@ static void Arith (lua_State *L, StkId ra, TValue *rb,
|
||||
|
||||
|
||||
#define arith_op(op,tm) { \
|
||||
StkId ra = RA(i); \
|
||||
TValue *rb = RKB(i); \
|
||||
TValue *rc = RKC(i); \
|
||||
if (ttisnumber(rb) && ttisnumber(rc)) { \
|
||||
@@ -397,14 +377,6 @@ static void Arith (lua_State *L, StkId ra, TValue *rb,
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** copy of 'luaV_gettable', but protecting call to potential metamethod
|
||||
** (which can reallocate the stack)
|
||||
*/
|
||||
#define gettableProtected(L,t,k,v) { TValue *slot; \
|
||||
if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \
|
||||
else Protect(luaV_finishget(L,t,k,v,slot)); }
|
||||
|
||||
|
||||
void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
LClosure *cl;
|
||||
@@ -414,12 +386,13 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
reentry: /* entry point */
|
||||
lua_assert(isLua(L->ci));
|
||||
pc = L->savedpc;
|
||||
cl = &clvalue(L->ci->func)->l; /* local reference to function's closure */
|
||||
k = cl->p->k; /* local reference to function's constant table */
|
||||
base = L->base; /* local copy of function's base */
|
||||
cl = &clvalue(L->ci->func)->l;
|
||||
base = L->base;
|
||||
k = cl->p->k;
|
||||
/* main loop of interpreter */
|
||||
for (;;) {
|
||||
const Instruction i = *pc++;
|
||||
StkId ra;
|
||||
if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) &&
|
||||
(--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) {
|
||||
traceexec(L, pc);
|
||||
@@ -429,28 +402,26 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
}
|
||||
base = L->base;
|
||||
}
|
||||
/* warning!! several calls may realloc the stack and invalidate `ra' */
|
||||
ra = RA(i);
|
||||
lua_assert(base == L->base && L->base == L->ci->base);
|
||||
lua_assert(base <= L->top && L->top <= L->stack + L->stacksize);
|
||||
lua_assert(L->top == L->ci->top || luaG_checkopenop(i));
|
||||
switch (GET_OPCODE(i)) {
|
||||
case OP_MOVE: {
|
||||
StkId ra = RA(i);
|
||||
setobjs2s(L, ra, RB(i));
|
||||
continue;
|
||||
}
|
||||
case OP_LOADK: {
|
||||
StkId ra = RA(i);
|
||||
setobj2s(L, ra, KBx(i));
|
||||
continue;
|
||||
}
|
||||
case OP_LOADBOOL: {
|
||||
StkId ra = RA(i);
|
||||
setbvalue(ra, GETARG_B(i));
|
||||
if (GETARG_C(i)) pc++; /* skip next instruction (if C) */
|
||||
continue;
|
||||
}
|
||||
case OP_LOADNIL: {
|
||||
StkId ra = RA(i);
|
||||
TValue *rb = RB(i);
|
||||
do {
|
||||
setnilvalue(rb--);
|
||||
@@ -458,13 +429,11 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_GETUPVAL: {
|
||||
StkId ra = RA(i);
|
||||
int b = GETARG_B(i);
|
||||
setobj2s(L, ra, cl->upvals[b]->v);
|
||||
continue;
|
||||
}
|
||||
case OP_GETGLOBAL: {
|
||||
StkId ra = RA(i);
|
||||
TValue g;
|
||||
TValue *rb = KBx(i);
|
||||
sethvalue(L, &g, cl->env);
|
||||
@@ -473,14 +442,10 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_GETTABLE: {
|
||||
StkId ra = RA(i);
|
||||
StkId rb = RB(i);
|
||||
TValue *rc = RKC(i);
|
||||
gettableProtected(L, rb, rc, ra);
|
||||
Protect(luaV_gettable(L, RB(i), RKC(i), ra));
|
||||
continue;
|
||||
}
|
||||
case OP_SETGLOBAL: {
|
||||
StkId ra = RA(i);
|
||||
TValue g;
|
||||
sethvalue(L, &g, cl->env);
|
||||
lua_assert(ttisstring(KBx(i)));
|
||||
@@ -488,21 +453,16 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_SETUPVAL: {
|
||||
StkId ra = RA(i);
|
||||
UpVal *uv = cl->upvals[GETARG_B(i)];
|
||||
setobj(L, uv->v, ra);
|
||||
luaC_barrier(L, uv, ra);
|
||||
continue;
|
||||
}
|
||||
case OP_SETTABLE: {
|
||||
StkId ra = RA(i);
|
||||
TValue *rb = RKB(i);
|
||||
TValue *rc = RKC(i);
|
||||
Protect(luaV_settable(L, ra, rb, rc));
|
||||
Protect(luaV_settable(L, ra, RKB(i), RKC(i)));
|
||||
continue;
|
||||
}
|
||||
case OP_NEWTABLE: {
|
||||
StkId ra = RA(i);
|
||||
int b = GETARG_B(i);
|
||||
int c = GETARG_C(i);
|
||||
sethvalue(L, ra, luaH_new(L, luaO_fb2int(b), luaO_fb2int(c)));
|
||||
@@ -510,11 +470,9 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_SELF: {
|
||||
StkId ra = RA(i);
|
||||
StkId rb = RB(i);
|
||||
TValue *rc = RKC(i);
|
||||
setobjs2s(L, ra + 1, rb);
|
||||
gettableProtected(L, rb, rc, ra);
|
||||
setobjs2s(L, ra+1, rb);
|
||||
Protect(luaV_gettable(L, rb, RKC(i), ra));
|
||||
continue;
|
||||
}
|
||||
case OP_ADD: {
|
||||
@@ -530,7 +488,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_DIV: {
|
||||
StkId ra = RA(i);
|
||||
TValue *rb = RKB(i);
|
||||
TValue *rc = RKC(i);
|
||||
if (ttisnumber(rb) && ttisnumber(rc)) {
|
||||
@@ -546,7 +503,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_MOD: {
|
||||
StkId ra = RA(i);
|
||||
TValue *rb = RKB(i);
|
||||
TValue *rc = RKC(i);
|
||||
if (ttisnumber(rb) && ttisnumber(rc)) {
|
||||
@@ -566,27 +522,26 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_BAND: {
|
||||
arith_op(luai_numand, TM_AND);
|
||||
continue;
|
||||
arith_op(luai_numand, TM_AND);
|
||||
continue;
|
||||
}
|
||||
case OP_BOR: {
|
||||
arith_op(luai_numor, TM_OR);
|
||||
continue;
|
||||
arith_op(luai_numor, TM_OR);
|
||||
continue;
|
||||
}
|
||||
case OP_BXOR: {
|
||||
arith_op(luai_numxor, TM_XOR);
|
||||
continue;
|
||||
arith_op(luai_numxor, TM_XOR);
|
||||
continue;
|
||||
}
|
||||
case OP_BSHL: {
|
||||
arith_op(luai_numshl, TM_SHL);
|
||||
continue;
|
||||
arith_op(luai_numshl, TM_SHL);
|
||||
continue;
|
||||
}
|
||||
case OP_BSHR: {
|
||||
arith_op(luai_numshr, TM_SHR);
|
||||
continue;
|
||||
arith_op(luai_numshr, TM_SHR);
|
||||
continue;
|
||||
}
|
||||
case OP_BNOT: {
|
||||
StkId ra = RA(i);
|
||||
TValue *rb = RB(i);
|
||||
if (ttisnumber(rb)) {
|
||||
lua_Number nb = nvalue(rb);
|
||||
@@ -598,7 +553,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_UNM: {
|
||||
StkId ra = RA(i);
|
||||
TValue *rb = RB(i);
|
||||
if (ttisnumber(rb)) {
|
||||
lua_Number nb = nvalue(rb);
|
||||
@@ -610,13 +564,11 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_NOT: {
|
||||
StkId ra = RA(i);
|
||||
int res = l_isfalse(RB(i)); /* next assignment may change this value */
|
||||
setbvalue(ra, res);
|
||||
continue;
|
||||
}
|
||||
case OP_LEN: {
|
||||
StkId ra = RA(i);
|
||||
TValue *rb = RB(i);
|
||||
switch (ttype(rb)) {
|
||||
case LUA_TTABLE: {
|
||||
@@ -674,14 +626,12 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_TEST: {
|
||||
StkId ra = RA(i);
|
||||
if (l_isfalse(ra) != GETARG_C(i))
|
||||
dojump(L, pc, GETARG_sBx(*pc));
|
||||
pc++;
|
||||
continue;
|
||||
}
|
||||
case OP_TESTSET: {
|
||||
StkId ra = RA(i);
|
||||
TValue *rb = RB(i);
|
||||
if (l_isfalse(rb) != GETARG_C(i)) {
|
||||
setobjs2s(L, ra, rb);
|
||||
@@ -691,7 +641,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_CALL: {
|
||||
StkId ra = RA(i);
|
||||
int b = GETARG_B(i);
|
||||
int nresults = GETARG_C(i) - 1;
|
||||
if (b != 0) L->top = ra+b; /* else previous instruction set top */
|
||||
@@ -713,7 +662,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
}
|
||||
}
|
||||
case OP_TAILCALL: {
|
||||
StkId ra = RA(i);
|
||||
int b = GETARG_B(i);
|
||||
if (b != 0) L->top = ra+b; /* else previous instruction set top */
|
||||
L->savedpc = pc;
|
||||
@@ -746,7 +694,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
}
|
||||
}
|
||||
case OP_RETURN: {
|
||||
StkId ra = RA(i);
|
||||
int b = GETARG_B(i);
|
||||
if (b != 0) L->top = ra+b-1;
|
||||
if (L->openupval) luaF_close(L, base);
|
||||
@@ -762,7 +709,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
}
|
||||
}
|
||||
case OP_FORLOOP: {
|
||||
StkId ra = RA(i);
|
||||
lua_Number step = nvalue(ra+2);
|
||||
lua_Number idx = luai_numadd(nvalue(ra), step); /* increment index */
|
||||
lua_Number limit = nvalue(ra+1);
|
||||
@@ -775,7 +721,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_FORPREP: {
|
||||
StkId ra = RA(i);
|
||||
const TValue *init = ra;
|
||||
const TValue *plimit = ra+1;
|
||||
const TValue *pstep = ra+2;
|
||||
@@ -792,7 +737,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_TFORLOOP: {
|
||||
StkId ra = RA(i);
|
||||
StkId cb = ra + 3; /* call base */
|
||||
setobjs2s(L, cb+2, ra+2);
|
||||
setobjs2s(L, cb+1, ra+1);
|
||||
@@ -809,7 +753,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_SETLIST: {
|
||||
StkId ra = RA(i);
|
||||
int n = GETARG_B(i);
|
||||
int c = GETARG_C(i);
|
||||
int last;
|
||||
@@ -832,12 +775,10 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_CLOSE: {
|
||||
StkId ra = RA(i);
|
||||
luaF_close(L, ra);
|
||||
continue;
|
||||
}
|
||||
case OP_CLOSURE: {
|
||||
StkId ra = RA(i);
|
||||
Proto *p;
|
||||
Closure *ncl;
|
||||
int nup, j;
|
||||
@@ -858,7 +799,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||
continue;
|
||||
}
|
||||
case OP_VARARG: {
|
||||
StkId ra = RA(i);
|
||||
int b = GETARG_B(i) - 1;
|
||||
int j;
|
||||
CallInfo *ci = L->ci;
|
||||
|
||||
+2
-24
@@ -22,34 +22,12 @@
|
||||
(ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2))
|
||||
|
||||
|
||||
/*
|
||||
** fast track for 'gettable': if 't' is a table and 't[k]' is not nil,
|
||||
** return 1 with 'slot' pointing to 't[k]' (final result). Otherwise,
|
||||
** return 0 (meaning it will have to check metamethod) with 'slot'
|
||||
** pointing to a nil 't[k]' (if 't' is a table) or NULL (otherwise).
|
||||
** 'f' is the raw get function to use.
|
||||
*/
|
||||
#define luaV_fastget(L,t,k,slot,f) \
|
||||
(!ttistable(t) \
|
||||
? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \
|
||||
: (slot = f(hvalue(t), k), /* else, do raw access */ \
|
||||
!ttisnil(slot))) /* result not nil? */
|
||||
|
||||
/*
|
||||
** standard implementation for 'gettable'
|
||||
*/
|
||||
#define luaV_gettable(L,t,k,v) { TValue *slot; \
|
||||
if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \
|
||||
else luaV_finishget(L,t,k,v,slot); }
|
||||
|
||||
|
||||
|
||||
LUAI_FUNC int luaV_lessthan (lua_State *L, TValue *l, TValue *r);
|
||||
LUAI_FUNC int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2);
|
||||
LUAI_FUNC const TValue *luaV_tonumber (const TValue *obj, TValue *n);
|
||||
LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj);
|
||||
LUAI_FUNC void luaV_finishget (lua_State *L, TValue *t, TValue *key,
|
||||
StkId val, TValue *tm);
|
||||
LUAI_FUNC void luaV_gettable (lua_State *L, TValue *t, TValue *key,
|
||||
StkId val);
|
||||
LUAI_FUNC void luaV_settable (lua_State *L, TValue *t, TValue *key,
|
||||
StkId val);
|
||||
LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls);
|
||||
|
||||
+2
-64
@@ -1165,39 +1165,6 @@ void VS_Print(vsbuf_t *buf, const char *data)
|
||||
//
|
||||
// =========================================================================
|
||||
|
||||
#define NAME cvar_map_t
|
||||
#define KEY_TY const char *
|
||||
#define VAL_TY consvar_t *
|
||||
#define HASH_FN FNV1a_HashLowercaseString
|
||||
#define CMPR_FN vt_cmpr_casestring
|
||||
#include "verstable.h"
|
||||
|
||||
#define NAME netvar_map_t
|
||||
#define KEY_TY UINT16
|
||||
#define VAL_TY consvar_t *
|
||||
#define HASH_FN vt_hash_integer
|
||||
#define CMPR_FN vt_cmpr_integer
|
||||
#include "verstable.h"
|
||||
|
||||
static cvar_map_t cvar_map;
|
||||
static netvar_map_t netvar_map;
|
||||
|
||||
CONSTRUCTOR static void CV_InitMap(void)
|
||||
{
|
||||
// ensure the map is initialized
|
||||
cvar_map_t_init(&cvar_map);
|
||||
cvar_map_t_reserve(&cvar_map, 512);
|
||||
|
||||
netvar_map_t_init(&netvar_map);
|
||||
netvar_map_t_reserve(&netvar_map, 256);
|
||||
}
|
||||
|
||||
DESTRUCTOR static void CV_DestroyMap(void)
|
||||
{
|
||||
cvar_map_t_cleanup(&cvar_map);
|
||||
netvar_map_t_cleanup(&netvar_map);
|
||||
}
|
||||
|
||||
static const char *cv_null_string = "";
|
||||
|
||||
/** Searches if a variable has been registered.
|
||||
@@ -1208,17 +1175,11 @@ static const char *cv_null_string = "";
|
||||
*/
|
||||
consvar_t *CV_FindVar(const char *name)
|
||||
{
|
||||
cvar_map_t_itr it = cvar_map_t_get(&cvar_map, name);
|
||||
if (!cvar_map_t_is_end(it))
|
||||
return it.data->val;
|
||||
|
||||
// fallback linear search
|
||||
/*
|
||||
consvar_t *cvar;
|
||||
|
||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||
if (fasticmp(name, cvar->name))
|
||||
return cvar;
|
||||
*/
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -1233,7 +1194,7 @@ consvar_t *CV_FindVar(const char *name)
|
||||
static inline UINT16 CV_ComputeNetid(const char *s)
|
||||
{
|
||||
UINT16 ret = 0, i = 0;
|
||||
static const UINT16 premiers[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};
|
||||
static UINT16 premiers[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};
|
||||
|
||||
while (*s)
|
||||
{
|
||||
@@ -1252,17 +1213,11 @@ static inline UINT16 CV_ComputeNetid(const char *s)
|
||||
*/
|
||||
static consvar_t *CV_FindNetVar(UINT16 netid)
|
||||
{
|
||||
netvar_map_t_itr it = netvar_map_t_get(&netvar_map, netid);
|
||||
if (!netvar_map_t_is_end(it))
|
||||
return it.data->val;
|
||||
|
||||
/*
|
||||
consvar_t *cvar;
|
||||
|
||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||
if (cvar->netid == netid)
|
||||
return cvar;
|
||||
*/
|
||||
|
||||
if (netid == 44542) // ouch this hack
|
||||
return &cv_karteliminatelast;
|
||||
@@ -1328,11 +1283,6 @@ void CV_RegisterVar(consvar_t *variable)
|
||||
|
||||
// the SetValue will set this bit
|
||||
variable->flags &= ~CV_MODIFIED;
|
||||
|
||||
cvar_map_t_insert(&cvar_map, variable->name, variable);
|
||||
|
||||
if (variable->flags & CV_NETVAR)
|
||||
netvar_map_t_insert(&netvar_map, variable->netid, variable);
|
||||
}
|
||||
|
||||
/** Finds the string value of a console variable.
|
||||
@@ -1638,21 +1588,9 @@ size_t CV_LoadNetVars(const UINT8 *bufstart)
|
||||
// prevent "invalid command received"
|
||||
serverloading = true;
|
||||
|
||||
// we can use our netvar map instead of going through all cvars each time
|
||||
netvar_map_t_itr it;
|
||||
for (it = netvar_map_t_first(&netvar_map);
|
||||
!netvar_map_t_is_end(it);
|
||||
it = netvar_map_t_next(it))
|
||||
{
|
||||
cvar = it.data->val;
|
||||
Setvalue(cvar, cvar->defaultvalue, true);
|
||||
}
|
||||
|
||||
/*
|
||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||
if (cvar->flags & CV_NETVAR)
|
||||
Setvalue(cvar, cvar->defaultvalue, true);
|
||||
*/
|
||||
|
||||
count = READUINT16(p);
|
||||
while (count--)
|
||||
|
||||
+22
-173
@@ -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;
|
||||
@@ -1003,7 +852,7 @@ boolean CON_Responder(event_t *ev)
|
||||
return true;
|
||||
|
||||
// ctrl modifier -- changes behavior, adds shortcuts
|
||||
if (ctrldown && (cv_keyboardlayout.value != 3 || !altdown))
|
||||
if (ctrldown && (cv_keyboardlayout.value != 3 || (cv_keyboardlayout.value == 3 && !altdown)))
|
||||
{
|
||||
// show all cvars/commands that match what we have inputted
|
||||
if (key == KEY_TAB)
|
||||
|
||||
+43
-128
@@ -1154,67 +1154,6 @@ static void CV_LoadPlayerNames(UINT8 **p)
|
||||
}
|
||||
}
|
||||
|
||||
static void CL_DrawAddonTypes(void)
|
||||
{
|
||||
if (!cv_serveraddoninfo.value)
|
||||
return;
|
||||
|
||||
INT32 y = 0;
|
||||
|
||||
INT32 addontypes_downloaded[NUMADDONTYPES] = {0};
|
||||
|
||||
for (INT32 i = 0; i < fileneedednum; ++i)
|
||||
{
|
||||
switch (fileneeded[i].status)
|
||||
{
|
||||
case FS_FOUND:
|
||||
case FS_OPEN:
|
||||
addontypes_downloaded[fileneeded[i].type]++;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (addontype_t type = 0; type < NUMADDONTYPES; ++type)
|
||||
{
|
||||
if (addontypes[type] == 0)
|
||||
continue;
|
||||
|
||||
INT32 flags = V_SNAPTOTOP|V_SNAPTOLEFT|V_ALLOWLOWERCASE;
|
||||
|
||||
if (addontypes[type] == addontypes_downloaded[type])
|
||||
flags |= V_GREENMAP;
|
||||
else
|
||||
flags |= V_YELLOWMAP;
|
||||
|
||||
const char *typestr = "Misc";
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case ADDON_SCRIPT:
|
||||
typestr = "Script";
|
||||
break;
|
||||
|
||||
case ADDON_MAP:
|
||||
typestr = "Map";
|
||||
break;
|
||||
|
||||
case ADDON_CHARACTER:
|
||||
typestr = "Character";
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
V_DrawSmallString(4, 4 + y, flags, va("%s addons", typestr));
|
||||
V_DrawRightAlignedSmallString(100, 4 + y, flags, va("%d/%d", addontypes_downloaded[type], addontypes[type]));
|
||||
y += 6;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// CL_DrawConnectionStatus
|
||||
//
|
||||
@@ -1255,18 +1194,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));
|
||||
@@ -1328,8 +1269,6 @@ static void CL_DrawConnectionStatus(void)
|
||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, totalfileslength, 8, 160);
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
||||
va(" %2u/%2u Files", checkednum, fileneedednum));
|
||||
|
||||
CL_DrawAddonTypes();
|
||||
}
|
||||
else if (cl_mode == CL_LOADFILES)
|
||||
{
|
||||
@@ -1353,8 +1292,6 @@ static void CL_DrawConnectionStatus(void)
|
||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, totalfileslength, 8, 160);
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
||||
va(" %2u/%2u Files", loadcompletednum, fileneedednum));
|
||||
|
||||
CL_DrawAddonTypes();
|
||||
}
|
||||
else if (cl_mode == CL_VIEWSERVER)
|
||||
{
|
||||
@@ -1483,15 +1420,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 +1435,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,23 +1480,21 @@ 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));
|
||||
|
||||
CL_DrawAddonTypes();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1575,8 +1511,6 @@ static void CL_DrawConnectionStatus(void)
|
||||
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, V_YELLOWMAP|MENUCAPS,
|
||||
M_GetText("Waiting to download files..."));
|
||||
|
||||
CL_DrawAddonTypes();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2228,12 +2162,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 &&
|
||||
@@ -2580,7 +2509,7 @@ static boolean CL_FinishedFileList(void)
|
||||
* \sa CL_ConnectToServer
|
||||
*
|
||||
*/
|
||||
static void CL_ServerConnectionSearchTicker(tic_t *asksent)
|
||||
static boolean CL_ServerConnectionSearchTicker(tic_t *asksent)
|
||||
{
|
||||
INT32 i;
|
||||
|
||||
@@ -2598,7 +2527,7 @@ static void CL_ServerConnectionSearchTicker(tic_t *asksent)
|
||||
{
|
||||
i = SL_SearchServer(servernode);
|
||||
if (i < 0)
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
joinnode = i;
|
||||
@@ -2626,11 +2555,10 @@ static void CL_ServerConnectionSearchTicker(tic_t *asksent)
|
||||
{
|
||||
cl_mode = CL_ASKFULLFILELIST;
|
||||
cl_lastcheckedfilecount = 0;
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
cl_mode = cv_serverinfoscreen.value ? CL_VIEWSERVER : CL_CHECKFILES;
|
||||
CL_CheckAddonTypes();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2638,7 +2566,7 @@ static void CL_ServerConnectionSearchTicker(tic_t *asksent)
|
||||
*asksent = 0;
|
||||
}
|
||||
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Ask the info to the server (askinfo packet)
|
||||
@@ -2648,6 +2576,7 @@ static void CL_ServerConnectionSearchTicker(tic_t *asksent)
|
||||
*asksent = I_GetTime() + NEWTICRATE;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void FreeMapIcon(void)
|
||||
@@ -2679,15 +2608,13 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic
|
||||
switch (cl_mode)
|
||||
{
|
||||
case CL_SEARCHING:
|
||||
CL_ServerConnectionSearchTicker(asksent);
|
||||
if (!CL_ServerConnectionSearchTicker(asksent))
|
||||
return false;
|
||||
break;
|
||||
|
||||
case CL_ASKFULLFILELIST:
|
||||
if (cl_lastcheckedfilecount == UINT16_MAX) // All files retrieved
|
||||
{
|
||||
cl_mode = cv_serverinfoscreen.value ? CL_VIEWSERVER : CL_CHECKFILES;
|
||||
CL_CheckAddonTypes();
|
||||
}
|
||||
else if (fileneedednum != cl_lastcheckedfilecount || I_GetTime() >= *asksent)
|
||||
{
|
||||
if (CL_AskFileList(fileneedednum))
|
||||
@@ -3392,21 +3319,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)
|
||||
{
|
||||
@@ -4301,8 +4216,6 @@ consvar_t cv_connectawaittime = {"connectawaittime", "5", CV_SAVE, connectawaitt
|
||||
|
||||
consvar_t cv_serverinfoscreen = {"serverinfoscreen", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_serveraddoninfo = {"serveraddoninfo", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
static void Got_AddPlayer(const UINT8 **p, INT32 playernum);
|
||||
static void Got_RemovePlayer(const UINT8 **p, INT32 playernum);
|
||||
|
||||
@@ -4375,7 +4288,7 @@ void D_ClientServerInit(void)
|
||||
playerinfo[i].node = 255;
|
||||
|
||||
gametic = 0;
|
||||
leveltime = 0;
|
||||
localgametic = 0;
|
||||
|
||||
// do not send anything before the real begin
|
||||
SV_StopServer();
|
||||
@@ -5631,7 +5544,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 +5587,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 +5598,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 +5608,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);
|
||||
|
||||
@@ -5992,11 +5905,13 @@ static void PT_ServerTics(SINT8 node)
|
||||
realend = gametic + CLIENTBACKUPTICS;
|
||||
cl_packetmissed = realstart > neededtic;
|
||||
|
||||
UINT8 *pak = (UINT8 *)&packet->cmds;
|
||||
UINT8 *txtpak = (UINT8 *)&packet->cmds[packet->numslots * packet->numtics];
|
||||
|
||||
if (realstart <= neededtic && realend > neededtic)
|
||||
{
|
||||
tic_t i, j;
|
||||
UINT8 *pak = (UINT8 *)&packet->cmds;
|
||||
UINT8 *txtpak = (UINT8 *)&packet->cmds[packet->numslots * packet->numtics];
|
||||
pak = (UINT8 *)&packet->cmds;
|
||||
|
||||
for (i = realstart; i < realend; i++)
|
||||
{
|
||||
@@ -6833,7 +6748,7 @@ boolean TryRunTics(tic_t realtics)
|
||||
{
|
||||
boolean update_stats = !(paused || P_AutoPause());
|
||||
|
||||
DEBFILE(va("============ Running tic %d (local %d)\n", gametic, leveltime));
|
||||
DEBFILE(va("============ Running tic %d (local %d)\n", gametic, localgametic));
|
||||
|
||||
if (update_stats)
|
||||
PS_START_TIMING(ps_tictime);
|
||||
|
||||
@@ -600,8 +600,6 @@ extern consvar_t cv_discordinvites;
|
||||
|
||||
extern consvar_t cv_serverinfoscreen;
|
||||
|
||||
extern consvar_t cv_serveraddoninfo;
|
||||
|
||||
// Used in d_net, the only dependence
|
||||
//tic_t ExpandTics(INT32 low, tic_t basetic);
|
||||
void D_ClientServerInit(void);
|
||||
|
||||
+39
-42
@@ -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];
|
||||
@@ -363,33 +362,6 @@ static void D_Renderview(void)
|
||||
// added comment : there is a wipe eatch change of the gamestate
|
||||
gamestate_t wipegamestate = GS_LEVEL;
|
||||
|
||||
static void D_MakeIntermissionBG(void)
|
||||
{
|
||||
if (!lastdraw)
|
||||
return;
|
||||
|
||||
if (rendermode == render_none)
|
||||
{
|
||||
lastdraw = false;
|
||||
intermissionbginit = false;
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
{
|
||||
HWR_MakeScreenTexture();
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
VID_BlitLinearScreen(vid.screens[0], vid.screens[1], vid.width, vid.height, vid.width, vid.width);
|
||||
}
|
||||
|
||||
lastdraw = false;
|
||||
intermissionbginit = true;
|
||||
}
|
||||
|
||||
static boolean D_Display(void)
|
||||
{
|
||||
boolean ranwipe = false;
|
||||
@@ -555,8 +527,16 @@ static boolean D_Display(void)
|
||||
PS_START_TIMING(ps_rendercalltime);
|
||||
D_Renderview();
|
||||
PS_STOP_TIMING(ps_rendercalltime);
|
||||
}
|
||||
|
||||
D_MakeIntermissionBG();
|
||||
if (lastdraw)
|
||||
{
|
||||
if (rendermode == render_soft)
|
||||
{
|
||||
VID_BlitLinearScreen(vid.screens[0], vid.screens[1], vid.width, vid.height, vid.width, vid.width);
|
||||
}
|
||||
|
||||
lastdraw = false;
|
||||
}
|
||||
|
||||
PS_START_TIMING(ps_uitime);
|
||||
@@ -717,20 +697,18 @@ void D_SRB2Loop(void)
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (I_Interrupted())
|
||||
{
|
||||
I_Quit();
|
||||
}
|
||||
|
||||
// capbudget is the minimum precise_t duration of a single loop iteration
|
||||
precise_t capbudget;
|
||||
precise_t elapsed;
|
||||
precise_t enterprecise, finishprecise;
|
||||
|
||||
boolean ranwipe = false;
|
||||
|
||||
enterprecise = I_GetPreciseTime();
|
||||
|
||||
if (I_Interrupted())
|
||||
{
|
||||
I_Quit();
|
||||
}
|
||||
|
||||
memset(&g_dc, 0, sizeof(g_dc));
|
||||
Z_Frame_Reset();
|
||||
|
||||
@@ -738,6 +716,8 @@ void D_SRB2Loop(void)
|
||||
const UINT32 framecap = R_GetFramerateCap();
|
||||
capbudget = (framecap == 0) ? 0 : (precise_t)((double)precision / (double)framecap + 0.5); // + 0.5 instead of round
|
||||
|
||||
boolean ranwipe = false;
|
||||
|
||||
I_UpdateTime(cv_timescale.value);
|
||||
|
||||
if (lastwipetic)
|
||||
@@ -1405,6 +1385,8 @@ static inline void D_MakeTitleString(char *s)
|
||||
// extra graphic patches for saturn specific thingies
|
||||
boolean xtra_speedo = false; // extra speedometer check
|
||||
boolean xtra_speedo_clr = false; // extra speedometer colour check
|
||||
boolean xtra_speedo3 = false; // 80x 11 extra speedometer check
|
||||
boolean xtra_speedo_clr3 = false; // 80x 11 extra speedometer colour check
|
||||
boolean achi_speedo = false; // achiiro speedometer check
|
||||
boolean achi_speedo_clr = false; // extra speedometer colour check
|
||||
boolean dial_speedo = false; // dial speedometer check
|
||||
@@ -1434,6 +1416,7 @@ static void D_CheckSaturnExtraFiles(void)
|
||||
CV_PossibleValue_t minimapdot_cons_temp[NUMMINIMAPDOTSTUFF] = {{0, "Off"}, {0, NULL}, {0, NULL}, {0, NULL}, {0, NULL}};
|
||||
|
||||
unsigned last_speedo_i = 0;
|
||||
unsigned last_driftgauge_i = 3;
|
||||
unsigned last_inputdisplay_i = 2;
|
||||
unsigned last_minimapdot_i = 0;
|
||||
#define PUSHCONS(cons, i, id, name) { ++i; cons[i].value = id; cons[i].strvalue = name; }
|
||||
@@ -1592,6 +1575,20 @@ static void D_CheckSaturnExtraFiles(void)
|
||||
if (found_extra3_kart)
|
||||
{
|
||||
mainwads++;
|
||||
|
||||
// 80x11 speedometer crap
|
||||
if (W_LumpExists("SP_SM3TC"))
|
||||
{
|
||||
xtra_speedo3 = true;
|
||||
PUSHCONS(speedo_cons_temp, last_speedo_i, 7, "Extra");
|
||||
PUSHCONS(driftgaugestyle_cons_temp, last_driftgauge_i, 5, "Extra");
|
||||
}
|
||||
|
||||
// 80x11 speedometer crap but colour
|
||||
if (W_LumpExists("SC_SM3TC"))
|
||||
{
|
||||
xtra_speedo_clr3 = true;
|
||||
}
|
||||
}
|
||||
|
||||
#undef PUSHCONS
|
||||
@@ -1789,6 +1786,10 @@ void D_SRB2Main(void)
|
||||
// Setup default unlockable conditions
|
||||
M_SetupDefaultConditionSets();
|
||||
|
||||
// Setup character tables
|
||||
// Have to be done here before files are loaded
|
||||
M_InitCharacterTables();
|
||||
|
||||
// load wad, including the main wad file
|
||||
CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n");
|
||||
|
||||
@@ -2042,13 +2043,9 @@ void D_SRB2Main(void)
|
||||
if (M_CheckProtoParam("replay"))
|
||||
{
|
||||
const char *replayurl = M_GetProtoParam();
|
||||
|
||||
if (!replayurl)
|
||||
I_Error("REPLAY: Invalid URL.");
|
||||
|
||||
gconst char *replayname = strrchr(replayurl, '/');
|
||||
|
||||
if (!replayname)
|
||||
if (!replayname || !replayurl)
|
||||
I_Error("REPLAY: Invalid URL.");
|
||||
|
||||
#define REPLAYDIR "/DownloadedReplays/"
|
||||
@@ -2162,8 +2159,8 @@ void D_SRB2Main(void)
|
||||
|
||||
if (dedicated && server)
|
||||
{
|
||||
levelstarttic = gametic;
|
||||
G_SetGamestate(GS_LEVEL);
|
||||
|
||||
if (!P_SetupLevel(false, false))
|
||||
I_Quit(); // fail so reset game stuff
|
||||
}
|
||||
|
||||
@@ -38,6 +38,8 @@ extern boolean found_extra3_kart; // for use in k_kart.c
|
||||
|
||||
extern boolean xtra_speedo; // extra speedometer check
|
||||
extern boolean xtra_speedo_clr; // extra speedometer colour check
|
||||
extern boolean xtra_speedo3; // 80x11 extra speedometer check
|
||||
extern boolean xtra_speedo_clr3; // 80x11 extra speedometer colour check
|
||||
extern boolean achi_speedo; // achiiro speedometer check
|
||||
extern boolean achi_speedo_clr; // extra speedometer colour check
|
||||
extern boolean dial_speedo; // dial speedometer check
|
||||
|
||||
@@ -27,6 +27,7 @@ extern "C" {
|
||||
// SINT8 is used for nodes sometimes >:(
|
||||
#define MAXNETNODES 127
|
||||
#define BROADCASTADDR MAXNETNODES
|
||||
#define NETSPLITSCREEN // Kart's splitscreen netgame feature
|
||||
|
||||
#define STATLENGTH (TICRATE*2)
|
||||
|
||||
|
||||
+28
-61
@@ -900,7 +900,6 @@ void D_RegisterClientCommands(void)
|
||||
CV_RegisterVar(&cv_mindelay);
|
||||
CV_RegisterVar(&cv_gentlemens);
|
||||
CV_RegisterVar(&cv_serverinfoscreen);
|
||||
CV_RegisterVar(&cv_serveraddoninfo);
|
||||
|
||||
#ifdef NETGAME_DEVMODE
|
||||
CV_RegisterVar(&cv_fishcake);
|
||||
@@ -1010,7 +1009,6 @@ void D_RegisterClientCommands(void)
|
||||
CV_RegisterVar(&cv_gamepadled[i]);
|
||||
}
|
||||
|
||||
CV_RegisterVar(&cv_gamepadifunfocused);
|
||||
CV_RegisterVar(&cv_gamepadledifunfocused);
|
||||
CV_RegisterVar(&cv_rumbleifunfocused);
|
||||
|
||||
@@ -1214,22 +1212,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 +1271,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 +1291,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 +1347,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 +1368,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 +1494,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 +1594,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,8 +1630,8 @@ static void SendNameAndColor(UINT8 splitplayer)
|
||||
|
||||
static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
||||
{
|
||||
player_t *player;
|
||||
char name[MAXPLAYERNAME+1] = {};
|
||||
player_t *player = &players[playernum];
|
||||
char name[MAXPLAYERNAME+1];
|
||||
UINT8 color, skin;
|
||||
|
||||
#ifdef PARANOIA
|
||||
@@ -1670,18 +1639,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 +2187,7 @@ void D_SetupVote(void)
|
||||
WRITEUINT8(p, secondgt);
|
||||
secondgt &= ~0x80;
|
||||
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
UINT16 m;
|
||||
@@ -5848,6 +5814,7 @@ static void BaseNumLaps_OnChange(void)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void KartFrantic_OnChange(void)
|
||||
{
|
||||
if ((boolean)cv_kartfrantic.value != franticitems && gamestate == GS_LEVEL && leveltime > starttime)
|
||||
|
||||
+5
-1
@@ -93,6 +93,11 @@ extern consvar_t cv_pause;
|
||||
extern consvar_t cv_restrictskinchange, cv_allowteamchange, cv_ingamecap, cv_respawntime;
|
||||
extern consvar_t cv_spectatorreentry, cv_antigrief;
|
||||
|
||||
/*extern consvar_t cv_teleporters, cv_superring, cv_supersneakers, cv_invincibility;
|
||||
extern consvar_t cv_jumpshield, cv_watershield, cv_ringshield, cv_forceshield, cv_bombshield;
|
||||
extern consvar_t cv_1up, cv_eggmanbox;
|
||||
extern consvar_t cv_recycler;*/
|
||||
|
||||
// SRB2kart items
|
||||
extern consvar_t cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana;
|
||||
extern consvar_t cv_eggmanmonitor, cv_orbinaut, cv_jawz, cv_mine;
|
||||
@@ -150,7 +155,6 @@ extern consvar_t cv_pingstyle;
|
||||
|
||||
//extern consvar_t cv_smallpos;
|
||||
extern consvar_t cv_showminimapnames;
|
||||
extern consvar_t cv_showminimapfinished;
|
||||
extern consvar_t cv_minihead;
|
||||
extern consvar_t cv_showminimapangle;
|
||||
|
||||
|
||||
+1
-50
@@ -116,8 +116,6 @@ static I_mutex downloadmutex;
|
||||
#endif
|
||||
char downloaddir[512] = "DOWNLOAD";
|
||||
|
||||
INT32 addontypes[NUMADDONTYPES] = {0};
|
||||
|
||||
file_download_t filedownload = {};
|
||||
|
||||
#ifdef HAVE_CURL
|
||||
@@ -137,8 +135,6 @@ HTTP_login *curl_logins = NULL;
|
||||
static void CURLGetFile(void);
|
||||
#endif
|
||||
|
||||
static addontype_t GetAddonType(const char *name);
|
||||
|
||||
/** Fills a serverinfo packet with information about wad files loaded.
|
||||
*
|
||||
* \todo Give this function a better name since it is in global scope.
|
||||
@@ -229,11 +225,8 @@ void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr, UINT16 fi
|
||||
fileneeded[i].willsend = (UINT8)(filestatus >> 4);
|
||||
fileneeded[i].totalsize = READUINT32(p); // The four next bytes are the file size
|
||||
fileneeded[i].file = NULL; // The file isn't open yet
|
||||
READSTRINGL(p, fileneeded[i].filename, MAX_WADPATH); // The next bytes are the file name
|
||||
READSTRINGN(p, fileneeded[i].filename, MAX_WADPATH); // The next bytes are the file name
|
||||
READMEM(p, fileneeded[i].md5sum, 16); // The last 16 bytes are the file checksum
|
||||
|
||||
// Should be good place to calculate that?
|
||||
fileneeded[i].type = GetAddonType(fileneeded[i].filename);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -582,48 +575,6 @@ INT32 CL_CheckFiles(void)
|
||||
return 1; //everything is FS_OPEN or FS_FOUND, proceed to loading
|
||||
}
|
||||
|
||||
static addontype_t GetAddonType(const char *name)
|
||||
{
|
||||
const char *prefix = strchr(name, '_');
|
||||
|
||||
// Doesn't have prefix (no '_' character or it is too far and is probably not for prefix but for something like version)
|
||||
// KRBCL_ is longest prefix i can think of so this should be enough
|
||||
if (prefix == NULL || prefix - name > 5)
|
||||
return ADDON_MISC;
|
||||
|
||||
// Skip 'K'
|
||||
if (*name == 'K')
|
||||
++name;
|
||||
|
||||
switch (*name)
|
||||
{
|
||||
case 'L':
|
||||
return ADDON_SCRIPT;
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
case 'B':
|
||||
return ADDON_MAP;
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
return ADDON_CHARACTER;
|
||||
break;
|
||||
}
|
||||
|
||||
return ADDON_MISC;
|
||||
}
|
||||
|
||||
void CL_CheckAddonTypes(void)
|
||||
{
|
||||
memset(&addontypes, 0, sizeof(addontypes));
|
||||
|
||||
for (INT32 i = 0; i < fileneedednum; i++)
|
||||
{
|
||||
addontypes[fileneeded[i].type]++;
|
||||
}
|
||||
}
|
||||
|
||||
// Load it now
|
||||
boolean CL_LoadServerFiles(void)
|
||||
{
|
||||
|
||||
@@ -40,15 +40,6 @@ typedef enum
|
||||
FS_FALLBACK, // HTTP failed
|
||||
} filestatus_t;
|
||||
|
||||
typedef enum addontype_e
|
||||
{
|
||||
ADDON_SCRIPT,
|
||||
ADDON_MAP,
|
||||
ADDON_CHARACTER,
|
||||
ADDON_MISC,
|
||||
NUMADDONTYPES,
|
||||
} addontype_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UINT8 willsend; // Is the server willing to send it?
|
||||
@@ -60,13 +51,11 @@ typedef struct
|
||||
UINT32 totalsize;
|
||||
filestatus_t status; // The value returned by recsearch
|
||||
boolean justdownloaded; // To prevent late fragments from causing an I_Error
|
||||
addontype_t type;
|
||||
} fileneeded_t;
|
||||
|
||||
extern INT32 fileneedednum;
|
||||
extern fileneeded_t fileneeded[MAX_WADFILES];
|
||||
extern char downloaddir[512];
|
||||
extern INT32 addontypes[NUMADDONTYPES];
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -102,7 +91,6 @@ void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr, UINT16 fi
|
||||
void CL_PrepareDownloadSaveGame(const char *tmpsave);
|
||||
|
||||
INT32 CL_CheckFiles(void);
|
||||
void CL_CheckAddonTypes(void);
|
||||
boolean CL_LoadServerFiles(void);
|
||||
void SV_SendRam(INT32 node, void *data, size_t size, freemethod_t freemethod,
|
||||
UINT8 fileid);
|
||||
|
||||
+14
-42
@@ -735,22 +735,6 @@ const char *I_GetJoyName(INT32 joyindex)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void I_SetJoystickFocus(void)
|
||||
{
|
||||
}
|
||||
|
||||
boolean I_GamepadHasLED(INT32 playernum)
|
||||
{
|
||||
(void)playernum;
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean I_GamepadHasRumble(INT32 playernum)
|
||||
{
|
||||
(void)playernum;
|
||||
return false;
|
||||
}
|
||||
|
||||
void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration)
|
||||
{
|
||||
(void)playernum;
|
||||
@@ -1023,13 +1007,8 @@ static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_ms
|
||||
sigmsg = ("SIGSEGV - SRB2Kart-Saturn has attempted to access a memory location that it shouldn't and needs to close.");
|
||||
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 +1341,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);
|
||||
@@ -1415,6 +1384,7 @@ static void I_Fork(void)
|
||||
|
||||
INT32 I_StartupSystem(void)
|
||||
{
|
||||
W_Startup();
|
||||
I_StartupConsole();
|
||||
#ifdef NEWSIGNALHANDLER
|
||||
// This is useful when debugging. It lets GDB attach to
|
||||
@@ -1443,8 +1413,8 @@ void I_Quit(void)
|
||||
/* prevent recursive I_Quit() */
|
||||
if (quiting)
|
||||
goto death;
|
||||
|
||||
quiting = false;
|
||||
I_ShutdownConsole();
|
||||
M_SaveConfig(NULL); //save game config, cvars..
|
||||
D_SaveBan(); // save the ban list
|
||||
G_SaveGameData(false); // Tails 12-08-2002
|
||||
@@ -1460,18 +1430,16 @@ void I_Quit(void)
|
||||
// use this for 1.28 19990220 by Kin
|
||||
I_ShutdownGraphics();
|
||||
I_ShutdownSystem();
|
||||
|
||||
/* if option -noendtxt is set, don't print the text */
|
||||
if (!M_CheckParm("-noendtxt") && W_CheckNumForName("ENDOOM") != LUMPERROR)
|
||||
{
|
||||
printf("\r");
|
||||
ShowEndTxt();
|
||||
}
|
||||
|
||||
if (myargmalloc)
|
||||
free(myargv); // Deallocate allocated memory
|
||||
|
||||
death:
|
||||
W_Shutdown();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@@ -1517,6 +1485,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 +1503,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 +1520,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 +1627,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])
|
||||
|
||||
+217
-172
@@ -43,9 +43,6 @@
|
||||
|
||||
#include "m_cond.h"
|
||||
|
||||
// idk how PUSHGETTER works, but this is unused
|
||||
static UINT8 ultimatemode = false;
|
||||
|
||||
#define REQUIRE_MATHLIB_GUID "{748fcbc8-6480-4013-ac4e-7afce6cab766}"
|
||||
|
||||
// Free slot names
|
||||
@@ -283,6 +280,149 @@ static void clear_levels(void)
|
||||
P_AllocMapHeader(gamemap-1);
|
||||
}
|
||||
|
||||
static boolean findFreeSlot(INT32 *num)
|
||||
{
|
||||
// Send the character select entry to a free slot.
|
||||
while (*num < MAXSKINS && PlayerMenu[*num].status != IT_DISABLED)
|
||||
*num = *num+1;
|
||||
|
||||
// No more free slots. :(
|
||||
if (*num >= MAXSKINS)
|
||||
return false;
|
||||
|
||||
// Found one! ^_^
|
||||
return true;
|
||||
}
|
||||
|
||||
// Reads a player.
|
||||
// For modifying the character select screen
|
||||
static void readPlayer(MYFILE *f, INT32 num)
|
||||
{
|
||||
char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL);
|
||||
char *word;
|
||||
char *word2;
|
||||
INT32 i;
|
||||
boolean slotfound = false;
|
||||
|
||||
do
|
||||
{
|
||||
if (myfgets(s, MAXLINELEN, f))
|
||||
{
|
||||
if (s[0] == '\n')
|
||||
break;
|
||||
|
||||
word = strtok(s, " ");
|
||||
if (word)
|
||||
strupr(word);
|
||||
else
|
||||
break;
|
||||
|
||||
if (fastcmp(word, "PLAYERTEXT"))
|
||||
{
|
||||
char *playertext = NULL;
|
||||
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
goto done;
|
||||
PlayerMenu[num].status = IT_CALL;
|
||||
|
||||
// A friendly neighborhood alias for brevity's sake
|
||||
const size_t note_size = sizeof(description[num].notes);
|
||||
|
||||
for (i = 0; i < (INT32)(MAXLINELEN-note_size-3); i++)
|
||||
{
|
||||
if (s[i] == '=')
|
||||
{
|
||||
playertext = &s[i+2];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (playertext)
|
||||
{
|
||||
strlcpy(description[num].notes, playertext, note_size);
|
||||
strlcat(description[num].notes,
|
||||
myhashfgets(playertext, note_size, f), note_size);
|
||||
}
|
||||
else
|
||||
strcpy(description[num].notes, "");
|
||||
|
||||
// For some reason, cutting the string did not work above. Most likely due to strcpy or strcat...
|
||||
// It works down here, though.
|
||||
{
|
||||
INT32 numline = 0;
|
||||
for (i = 0; (size_t)i < note_size-1; i++)
|
||||
{
|
||||
if (numline < 20 && description[num].notes[i] == '\n')
|
||||
numline++;
|
||||
|
||||
if (numline >= 20 || description[num].notes[i] == '\0' || description[num].notes[i] == '#')
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
description[num].notes[strlen(description[num].notes)-1] = '\0';
|
||||
description[num].notes[i] = '\0';
|
||||
continue;
|
||||
}
|
||||
|
||||
word2 = strtok(NULL, " = ");
|
||||
if (word2)
|
||||
strupr(word2);
|
||||
else
|
||||
break;
|
||||
|
||||
if (word2[strlen(word2)-1] == '\n')
|
||||
word2[strlen(word2)-1] = '\0';
|
||||
i = atoi(word2);
|
||||
|
||||
if (fastcmp(word, "PICNAME"))
|
||||
{
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
goto done;
|
||||
PlayerMenu[num].status = IT_CALL;
|
||||
strncpy(description[num].picname, word2, 8);
|
||||
}
|
||||
else if (fastcmp(word, "STATUS"))
|
||||
{
|
||||
// Limit the status to only IT_DISABLED and IT_CALL
|
||||
if (i)
|
||||
i = IT_CALL;
|
||||
else
|
||||
i = IT_DISABLED;
|
||||
|
||||
/*
|
||||
You MAY disable previous entries if you so desire...
|
||||
But try to enable something that's already enabled and you will be sent to a free slot.
|
||||
|
||||
Because of this, you are allowed to edit any previous entrys you like, but only if you
|
||||
signal that you are purposely doing so by disabling and then reenabling the slot.
|
||||
|
||||
... Or use MENUPOSITION first, that works too. Hell, you could edit multiple character
|
||||
slots in a single section that way, due to how SOC editing works.
|
||||
*/
|
||||
if (i != IT_DISABLED && !slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
goto done;
|
||||
PlayerMenu[num].status = (INT16)i;
|
||||
}
|
||||
else if (fastcmp(word, "SKINNAME"))
|
||||
{
|
||||
// Send to free slot.
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
goto done;
|
||||
PlayerMenu[num].status = IT_CALL;
|
||||
|
||||
strlcpy(description[num].skinname, word2, sizeof description[num].skinname);
|
||||
strlwr(description[num].skinname);
|
||||
}
|
||||
else
|
||||
deh_warning("readPlayer %d: unknown word '%s'", num, word);
|
||||
}
|
||||
} while (!myfeof(f)); // finish when the line is empty
|
||||
|
||||
done:
|
||||
Z_Free(s);
|
||||
}
|
||||
|
||||
static int freeslotusage[2][2] = {{0, 0}, {0, 0}}; // [S_, MT_][max, previous .wad's max]
|
||||
|
||||
void DEH_UpdateMaxFreeslots(void)
|
||||
@@ -2363,12 +2503,26 @@ static void readmaincfg(MYFILE *f)
|
||||
{
|
||||
flashingtics = (UINT16)get_number(word2);
|
||||
}
|
||||
else if (fastcmp(word, "TAILSFLYTICS"))
|
||||
{
|
||||
tailsflytics = (UINT16)get_number(word2);
|
||||
}
|
||||
else if (fastcmp(word, "UNDERWATERTICS"))
|
||||
{
|
||||
underwatertics = (UINT16)get_number(word2);
|
||||
}
|
||||
else if (fastcmp(word, "SPACETIMETICS"))
|
||||
{
|
||||
spacetimetics = (UINT16)get_number(word2);
|
||||
}
|
||||
else if (fastcmp(word, "EXTRALIFETICS"))
|
||||
{
|
||||
// this modifies player->powers[pw_extralife]
|
||||
// which still has some game behaviour attached to it...
|
||||
extralifetics = (UINT16)get_number(word2);
|
||||
}
|
||||
else if (fastcmp(word, "GAMEOVERTICS"))
|
||||
{
|
||||
gameovertics = get_number(word2);
|
||||
}
|
||||
|
||||
else if (fastcmp(word, "INTROTOPLAY"))
|
||||
{
|
||||
@@ -2392,7 +2546,10 @@ static void readmaincfg(MYFILE *f)
|
||||
if (creditscutscene > 128)
|
||||
creditscutscene = 128;
|
||||
}
|
||||
|
||||
else if (fastcmp(word, "NUMDEMOS"))
|
||||
{
|
||||
numDemos = (UINT8)get_number(word2);
|
||||
}
|
||||
else if (fastcmp(word, "DEMODELAYTIME"))
|
||||
{
|
||||
demoDelayTime = get_number(word2);
|
||||
@@ -2405,6 +2562,10 @@ static void readmaincfg(MYFILE *f)
|
||||
{
|
||||
use1upSound = (UINT8)(value || word2[0] == 'T' || word2[0] == 'Y');
|
||||
}
|
||||
else if (fastcmp(word, "MAXXTRALIFE"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "GAMEDATA"))
|
||||
{
|
||||
// just ignore it but dont throw a warning
|
||||
@@ -2443,30 +2604,6 @@ static void readmaincfg(MYFILE *f)
|
||||
{
|
||||
strlcpy(customversionstring, word2, sizeof (customversionstring));
|
||||
}
|
||||
else if (fastcmp(word, "NUMDEMOS"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "TAILSFLYTICS"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "UNDERWATERTICS"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "SPACETIMETICS"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "GAMEOVERTICS"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else if (fastcmp(word, "MAXXTRALIFE"))
|
||||
{
|
||||
continue; // unused
|
||||
}
|
||||
else
|
||||
deh_warning("Maincfg: unknown word '%s'", word);
|
||||
}
|
||||
@@ -2675,12 +2812,17 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
|
||||
deh_num_warning = 0;
|
||||
// save values for cross reference
|
||||
/*
|
||||
for (i = 0; i < NUMSTATES; i++)
|
||||
saveactions[i] = states[i].action;
|
||||
for (i = 0; i < NUMSPRITES; i++)
|
||||
savesprnames[i] = sprnames[i];
|
||||
*/
|
||||
for (i = 0; i < NUMSFX; i++)
|
||||
savesfxnames[i] = S_sfx[i].name;
|
||||
|
||||
// it doesn't test the version of SRB2 and version of dehacked file
|
||||
dbg_line = -1; // start at -1 so the first line is 0.
|
||||
|
||||
while (!myfeof(f))
|
||||
{
|
||||
char origpos[256];
|
||||
@@ -2708,15 +2850,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
strncpy(origpos, s, size);
|
||||
origpos[size] = '\0';
|
||||
|
||||
if (NULL != (word = strtok(s, " ")))
|
||||
{
|
||||
if (NULL != (word = strtok(s, " "))) {
|
||||
strupr(word);
|
||||
const size_t wordlen = strlen(word);
|
||||
|
||||
if (word[wordlen-1] == '\n')
|
||||
word[wordlen-1] = '\0';
|
||||
if (word[strlen(word)-1] == '\n')
|
||||
word[strlen(word)-1] = '\0';
|
||||
}
|
||||
|
||||
if (word)
|
||||
{
|
||||
if (fastcmp(word, "FREESLOT"))
|
||||
@@ -2737,46 +2875,32 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
// This is not a major mod.
|
||||
continue;
|
||||
}
|
||||
|
||||
word2 = strtok(NULL, " ");
|
||||
|
||||
if (fastcmp(word, "CHARACTER"))
|
||||
{
|
||||
if (word2)
|
||||
{
|
||||
if (word2) {
|
||||
strupr(word2);
|
||||
const size_t wordlen = strlen(word2);
|
||||
|
||||
if (word2[wordlen-1] == '\n')
|
||||
word2[wordlen-1] = '\0';
|
||||
|
||||
if (word2[strlen(word2)-1] == '\n')
|
||||
word2[strlen(word2)-1] = '\0';
|
||||
i = atoi(word2);
|
||||
}
|
||||
else
|
||||
} else
|
||||
i = 0;
|
||||
|
||||
if (i >= 0 && i < 32)
|
||||
ignorelines(f); // unused
|
||||
readPlayer(f, i);
|
||||
else
|
||||
{
|
||||
deh_warning("Character %d out of range (0 - 31)", i);
|
||||
ignorelines(f);
|
||||
}
|
||||
|
||||
// This is not a major mod.
|
||||
continue;
|
||||
}
|
||||
|
||||
if (word2)
|
||||
{
|
||||
strupr(word2);
|
||||
const size_t wordlen = strlen(word2);
|
||||
|
||||
if (word2[wordlen-1] == '\n')
|
||||
word2[wordlen-1] = '\0';
|
||||
|
||||
if (word2[strlen(word2)-1] == '\n')
|
||||
word2[strlen(word2)-1] = '\0';
|
||||
i = atoi(word2);
|
||||
|
||||
if (fastcmp(word, "PATCH"))
|
||||
{
|
||||
// Read patch from spec file.
|
||||
@@ -2787,7 +2911,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
{
|
||||
if (i == 0 && word2[0] != '0') // If word2 isn't a number
|
||||
i = get_mobjtype(word2); // find a thing by name
|
||||
|
||||
if (i < NUMMOBJTYPES && i >= 0)
|
||||
{
|
||||
if (i < (MT_FIRSTFREESLOT+freeslotusage[1][1]))
|
||||
@@ -2835,7 +2958,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
{
|
||||
if (i == 0 && word2[0] != '0') // If word2 isn't a number
|
||||
i = get_state(word2); // find a state by name
|
||||
|
||||
if (i < NUMSTATES && i >= 0)
|
||||
{
|
||||
if (i < (S_FIRSTFREESLOT+freeslotusage[0][1]))
|
||||
@@ -2852,7 +2974,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
{
|
||||
if (i == 0 && word2[0] != '0') // If word2 isn't a number
|
||||
i = get_sfx(word2); // find a sound by name
|
||||
|
||||
if (i < NUMSFX && i >= 0)
|
||||
readsound(f, i, savesfxnames);
|
||||
else
|
||||
@@ -2866,7 +2987,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
{
|
||||
if (i == 0 && word2[0] != '0') // If word2 isn't a number
|
||||
i = get_huditem(word2); // find a huditem by name
|
||||
|
||||
if (i >= 0 && i < NUMHUDITEMS)
|
||||
readhuditem(f, i);
|
||||
else
|
||||
@@ -3004,8 +3124,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
||||
if (deh_num_warning)
|
||||
{
|
||||
CONS_Printf(M_GetText("%d warning%s in the SOC lump\n"), deh_num_warning, deh_num_warning == 1 ? "" : "s");
|
||||
if (devparm)
|
||||
if (devparm) {
|
||||
I_Error("%s%s",va(M_GetText("%d warning%s in the SOC lump\n"), deh_num_warning, deh_num_warning == 1 ? "" : "s"), M_GetText("See log.txt for details.\n"));
|
||||
//while (!I_GetKey())
|
||||
//I_OsPolling();
|
||||
}
|
||||
}
|
||||
|
||||
deh_loaded = true;
|
||||
@@ -8094,109 +8217,84 @@ struct {
|
||||
{NULL,0}
|
||||
};
|
||||
|
||||
// Returns the vlaue of MT_ enumerations
|
||||
static mobjtype_t get_mobjtype(const char *word)
|
||||
{
|
||||
{ // Returns the vlaue of MT_ enumerations
|
||||
mobjtype_t i;
|
||||
|
||||
if (*word >= '0' && *word <= '9')
|
||||
return atoi(word);
|
||||
|
||||
if (fastncmp("MT_",word,3))
|
||||
word += 3; // take off the MT_
|
||||
|
||||
for (i = 0; i < NUMMOBJFREESLOTS; i++)
|
||||
{
|
||||
for (i = 0; i < NUMMOBJFREESLOTS; i++) {
|
||||
if (!FREE_MOBJS[i])
|
||||
break;
|
||||
if (fastcmp(word, FREE_MOBJS[i]))
|
||||
return MT_FIRSTFREESLOT+i;
|
||||
}
|
||||
|
||||
for (i = 0; i < MT_FIRSTFREESLOT; i++)
|
||||
if (fastcmp(word, MOBJTYPE_LIST[i]+3))
|
||||
return i;
|
||||
|
||||
deh_warning("Couldn't find mobjtype named 'MT_%s'",word);
|
||||
return MT_BLUECRAWLA;
|
||||
}
|
||||
|
||||
// Returns the value of S_ enumerations
|
||||
static statenum_t get_state(const char *word)
|
||||
{
|
||||
{ // Returns the value of S_ enumerations
|
||||
statenum_t i;
|
||||
if (*word >= '0' && *word <= '9')
|
||||
return atoi(word);
|
||||
|
||||
if (fastncmp("S_",word,2))
|
||||
word += 2; // take off the S_
|
||||
|
||||
for (i = 0; i < NUMSTATEFREESLOTS; i++)
|
||||
{
|
||||
for (i = 0; i < NUMSTATEFREESLOTS; i++) {
|
||||
if (!FREE_STATES[i])
|
||||
break;
|
||||
|
||||
if (fastcmp(word, FREE_STATES[i]))
|
||||
return S_FIRSTFREESLOT+i;
|
||||
}
|
||||
|
||||
for (i = 0; i < S_FIRSTFREESLOT; i++)
|
||||
if (fastcmp(word, STATE_LIST[i]+2))
|
||||
return i;
|
||||
|
||||
deh_warning("Couldn't find state named 'S_%s'",word);
|
||||
return S_NULL;
|
||||
}
|
||||
|
||||
// Returns the value of SPR_ enumerations
|
||||
static spritenum_t get_sprite(const char *word)
|
||||
{
|
||||
{ // Returns the value of SPR_ enumerations
|
||||
spritenum_t i;
|
||||
if (*word >= '0' && *word <= '9')
|
||||
return atoi(word);
|
||||
|
||||
if (fastncmp("SPR_",word,4))
|
||||
word += 4; // take off the SPR_
|
||||
|
||||
for (i = 0; i < NUMSPRITES; i++)
|
||||
if (!sprnames[i][4] && memcmp(word,sprnames[i],4) == 0)
|
||||
if (!sprnames[i][4] && memcmp(word,sprnames[i],4)==0)
|
||||
return i;
|
||||
|
||||
deh_warning("Couldn't find sprite named 'SPR_%s'",word);
|
||||
return SPR_NULL;
|
||||
}
|
||||
|
||||
// Returns the value of SFX_ enumerations
|
||||
static sfxenum_t get_sfx(const char *word)
|
||||
{
|
||||
{ // Returns the value of SFX_ enumerations
|
||||
sfxenum_t i;
|
||||
|
||||
if (*word >= '0' && *word <= '9')
|
||||
return atoi(word);
|
||||
|
||||
if (fastncmp("SFX_",word,4))
|
||||
word += 4; // take off the SFX_
|
||||
else if (fastncmp("DS",word,2))
|
||||
word += 2; // take off the DS
|
||||
|
||||
for (i = 0; i < NUMSFX; i++)
|
||||
if (S_sfx[i].name && fasticmp(word, S_sfx[i].name))
|
||||
return i;
|
||||
|
||||
deh_warning("Couldn't find sfx named 'SFX_%s'",word);
|
||||
return sfx_None;
|
||||
}
|
||||
|
||||
#ifdef MUSICSLOT_COMPATIBILITY
|
||||
// Returns the value of MUS_ enumerations
|
||||
static UINT16 get_mus(const char *word, UINT8 dehacked_mode)
|
||||
{
|
||||
{ // Returns the value of MUS_ enumerations
|
||||
UINT16 i;
|
||||
char lumptmp[4];
|
||||
|
||||
if (*word >= '0' && *word <= '9')
|
||||
return atoi(word);
|
||||
|
||||
if (!word[2] && toupper(word[0]) >= 'A' && toupper(word[0]) <= 'Z')
|
||||
return (UINT16)M_MapNumber(word[0], word[1]);
|
||||
|
||||
@@ -8220,33 +8318,25 @@ static UINT16 get_mus(const char *word, UINT8 dehacked_mode)
|
||||
deh_warning("Couldn't find music named 'MUS_%s'",word);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; compat_special_music_slots[i][0]; ++i)
|
||||
if (fasticmp(word, compat_special_music_slots[i]))
|
||||
return i + 1036;
|
||||
|
||||
if (dehacked_mode)
|
||||
deh_warning("Couldn't find music named 'MUS_%s'",word);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Returns the value of HUD_ enumerations
|
||||
static hudnum_t get_huditem(const char *word)
|
||||
{
|
||||
{ // Returns the value of HUD_ enumerations
|
||||
hudnum_t i;
|
||||
|
||||
if (*word >= '0' && *word <= '9')
|
||||
return atoi(word);
|
||||
|
||||
if (fastncmp("HUD_",word,4))
|
||||
word += 4; // take off the HUD_
|
||||
|
||||
for (i = 0; i < NUMHUDITEMS; i++)
|
||||
if (fastcmp(word, HUDITEMS_LIST[i]))
|
||||
return i;
|
||||
|
||||
deh_warning("Couldn't find huditem named 'HUD_%s'",word);
|
||||
return HUD_LIVESNAME;
|
||||
}
|
||||
@@ -8293,16 +8383,15 @@ static inline int lib_freeslot(lua_State *L)
|
||||
{
|
||||
int n = lua_gettop(L);
|
||||
int r = 0; // args returned
|
||||
char *s, *type, *word;
|
||||
char *s, *type,*word;
|
||||
|
||||
while (n-- > 0)
|
||||
{
|
||||
while (n-- > 0)
|
||||
{
|
||||
s = Z_StrDup(luaL_checkstring(L,1));
|
||||
type = strtok(s, "_");
|
||||
if (type)
|
||||
strupr(type);
|
||||
else
|
||||
{
|
||||
else {
|
||||
Z_Free(s);
|
||||
return luaL_error(L, "Unknown enum type in '%s'\n", luaL_checkstring(L, 1));
|
||||
}
|
||||
@@ -8310,25 +8399,19 @@ static inline int lib_freeslot(lua_State *L)
|
||||
word = strtok(NULL, "\n");
|
||||
if (word)
|
||||
strupr(word);
|
||||
else
|
||||
{
|
||||
else {
|
||||
Z_Free(s);
|
||||
return luaL_error(L, "Missing enum name in '%s'\n", luaL_checkstring(L, 1));
|
||||
}
|
||||
|
||||
if (fastcmp(type, "SFX"))
|
||||
{
|
||||
if (fastcmp(type, "SFX")) {
|
||||
sfxenum_t sfx;
|
||||
strlwr(word);
|
||||
CONS_Printf("Sound sfx_%s allocated.\n",word);
|
||||
sfx = S_AddSoundFx(word, false, 0, false);
|
||||
|
||||
if (sfx != sfx_None)
|
||||
{
|
||||
if (sfx != sfx_None) {
|
||||
lua_pushinteger(L, sfx);
|
||||
r++;
|
||||
}
|
||||
else
|
||||
} else
|
||||
I_Error("Out of Sfx Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word); //Should never get here since S_AddSoundFx was changed to throw I_Error when it can't allocate
|
||||
}
|
||||
else if (fastcmp(type, "SPR"))
|
||||
@@ -8342,7 +8425,7 @@ static inline int lib_freeslot(lua_State *L)
|
||||
{
|
||||
if (used_spr[(j-SPR_FIRSTFREESLOT)/8] & (1<<(j%8)))
|
||||
{
|
||||
if (!sprnames[j][4] && memcmp(sprnames[j], word, 4) == 0)
|
||||
if (!sprnames[j][4] && memcmp(sprnames[j],word,4)==0)
|
||||
sprnames[j][4] = wad;
|
||||
continue; // Already allocated, next.
|
||||
}
|
||||
@@ -8360,7 +8443,6 @@ static inline int lib_freeslot(lua_State *L)
|
||||
r++;
|
||||
break;
|
||||
}
|
||||
|
||||
if (j > SPR_LASTFREESLOT)
|
||||
I_Error("Out of Sprite Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||
}
|
||||
@@ -8368,9 +8450,7 @@ static inline int lib_freeslot(lua_State *L)
|
||||
{
|
||||
statenum_t i;
|
||||
for (i = 0; i < NUMSTATEFREESLOTS; i++)
|
||||
{
|
||||
if (!FREE_STATES[i])
|
||||
{
|
||||
if (!FREE_STATES[i]) {
|
||||
CONS_Printf("State S_%s allocated.\n",word);
|
||||
|
||||
lua_pushcfunction(L, lua_glib_invalidate_cache);
|
||||
@@ -8384,8 +8464,6 @@ static inline int lib_freeslot(lua_State *L)
|
||||
r++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == NUMSTATEFREESLOTS)
|
||||
I_Error("Out of State Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||
}
|
||||
@@ -8393,9 +8471,7 @@ static inline int lib_freeslot(lua_State *L)
|
||||
{
|
||||
mobjtype_t i;
|
||||
for (i = 0; i < NUMMOBJFREESLOTS; i++)
|
||||
{
|
||||
if (!FREE_MOBJS[i])
|
||||
{
|
||||
if (!FREE_MOBJS[i]) {
|
||||
CONS_Printf("MobjType MT_%s allocated.\n",word);
|
||||
|
||||
lua_pushcfunction(L, lua_glib_invalidate_cache);
|
||||
@@ -8409,17 +8485,13 @@ static inline int lib_freeslot(lua_State *L)
|
||||
r++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == NUMMOBJFREESLOTS)
|
||||
I_Error("Out of Mobj Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||
}
|
||||
|
||||
Z_Free(s);
|
||||
lua_remove(L, 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -8432,10 +8504,8 @@ static inline int lib_action(lua_State *L)
|
||||
mobj_t *actor = *((mobj_t **)luaL_checkudata(L,1,META_MOBJ));
|
||||
var1 = (INT32)luaL_optinteger(L,2,0);
|
||||
var2 = (INT32)luaL_optinteger(L,3,0);
|
||||
|
||||
if (!actor)
|
||||
return LUA_ErrInvalid(L, "mobj_t");
|
||||
|
||||
(*action)(actor);
|
||||
return 0;
|
||||
}
|
||||
@@ -8457,29 +8527,23 @@ FUNCINLINE static ATTRINLINE int lib_getenum(lua_State *L)
|
||||
|
||||
const char *word;
|
||||
boolean mathlib = lua_toboolean(L, UV_MATHLIB);
|
||||
|
||||
if (lua_type(L, 2) != LUA_TSTRING)
|
||||
if (lua_type(L,2) != LUA_TSTRING)
|
||||
return 0;
|
||||
|
||||
word = lua_tostring(L, 2);
|
||||
word = lua_tostring(L,2);
|
||||
|
||||
/* First check actions, as they can be overridden. */
|
||||
if (!mathlib && fastncmp("A_", word, 2))
|
||||
{
|
||||
if (!mathlib && fastncmp("A_",word,2)) {
|
||||
char *caps;
|
||||
// Try to get a Lua action first.
|
||||
/// \todo Push a closure that sets superactions[] and superstack.
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, LREG_ACTIONS);
|
||||
|
||||
// actions are stored in all uppercase.
|
||||
caps = Z_StrDup(word);
|
||||
strupr(caps);
|
||||
lua_getfield(L, -1, caps);
|
||||
Z_Free(caps);
|
||||
|
||||
if (!lua_isnil(L, -1))
|
||||
return 1; // Success! :D That was easy.
|
||||
|
||||
// Welp, that failed.
|
||||
lua_pop(L, 2); // pop nil and LREG_ACTIONS
|
||||
// Hardcoded actions are handled by the proxy.
|
||||
@@ -8488,14 +8552,12 @@ FUNCINLINE static ATTRINLINE int lib_getenum(lua_State *L)
|
||||
/* Then check the globals proxy table. */
|
||||
lua_pushvalue(L, 2);
|
||||
lua_gettable(L, GLIB_PROXY);
|
||||
|
||||
if (!lua_isnil(L, -1))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (mathlib)
|
||||
return luaL_error(L, "constant '%s' could not be parsed.\n", word);
|
||||
if (mathlib) return luaL_error(L, "constant '%s' could not be parsed.\n", word);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -8553,7 +8615,6 @@ static int lua_enumlib_server_get(lua_State *L)
|
||||
{
|
||||
if ((!multiplayer || !(netgame || demo.playback)) && !playeringame[serverplayer])
|
||||
return 0;
|
||||
|
||||
LUA_PushUserdata(L, &players[serverplayer], META_PLAYER);
|
||||
return 1;
|
||||
}
|
||||
@@ -8562,7 +8623,6 @@ static int lua_enumlib_consoleplayer_get(lua_State *L)
|
||||
{
|
||||
if (consoleplayer < 0 || !playeringame[consoleplayer])
|
||||
return 0;
|
||||
|
||||
LUA_PushUserdata(L, &players[consoleplayer], META_PLAYER);
|
||||
return 1;
|
||||
}
|
||||
@@ -8755,15 +8815,12 @@ static int lua_enumlib_action_get(lua_State *L)
|
||||
const char *action = lua_tostring(L, 1);
|
||||
|
||||
for (int i = 0; actionpointers[i].name; i++)
|
||||
{
|
||||
if (fasticmp(action, actionpointers[i].name))
|
||||
{
|
||||
if (fasticmp(action, actionpointers[i].name)) {
|
||||
// push lib_action as a C closure with the actionf_t* as an upvalue.
|
||||
lua_pushlightuserdata(L, &actionpointers[i].action);
|
||||
lua_pushcclosure(L, lib_action, 1);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -8781,13 +8838,8 @@ static char *lua_enumlib_sprintf_upper(char **buf, int* size, const char *format
|
||||
va_list va;
|
||||
va_start(va, format);
|
||||
|
||||
va_list vacpy;
|
||||
va_copy(vacpy, va);
|
||||
|
||||
int length = vsnprintf(*buf, *size, format, vacpy);
|
||||
va_end(vacpy);
|
||||
|
||||
if (length >= *size)
|
||||
int length = vsnprintf(*buf, *size, format, va);
|
||||
if (length > *size)
|
||||
{
|
||||
void *ptr = realloc(*buf, length+1);
|
||||
if (!ptr)
|
||||
@@ -8795,13 +8847,12 @@ static char *lua_enumlib_sprintf_upper(char **buf, int* size, const char *format
|
||||
va_end(va);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*buf = ptr;
|
||||
*size = length+1;
|
||||
|
||||
length = vsnprintf(*buf, *size, format, va);
|
||||
va_start(va, format);
|
||||
vsnprintf(*buf, *size, format, va);
|
||||
}
|
||||
|
||||
va_end(va);
|
||||
|
||||
for (int i = 0; i < length; i++)
|
||||
@@ -8826,14 +8877,11 @@ static int lua_enumlib_super_get(lua_State *L)
|
||||
}
|
||||
|
||||
for (int i = 0; actionpointers[i].name; i++)
|
||||
{
|
||||
if (fasticmp(superactions[superstack-1], actionpointers[i].name))
|
||||
{
|
||||
if (fasticmp(superactions[superstack-1], actionpointers[i].name)) {
|
||||
lua_pushlightuserdata(L, &actionpointers[i].action);
|
||||
lua_pushcclosure(L, lib_action, 1);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -9302,10 +9350,7 @@ enum actionnum LUA_GetActionNumByName(const char *actiontocompare)
|
||||
{
|
||||
size_t z;
|
||||
for (z = 0; actionpointers[z].name; z++)
|
||||
{
|
||||
if (fasticmp(actiontocompare, actionpointers[z].name))
|
||||
return z;
|
||||
}
|
||||
|
||||
return z;
|
||||
}
|
||||
+1
-1
@@ -61,7 +61,7 @@ enum
|
||||
typedef struct
|
||||
{
|
||||
INT16 x, y;
|
||||
} ATTRPACK mapvertex_t;
|
||||
}ATTRPACK mapvertex_t;
|
||||
|
||||
// A SideDef, defining the visual appearance of a wall,
|
||||
// by setting textures and offsets.
|
||||
|
||||
+2
-9
@@ -130,8 +130,8 @@ extern char logfilename[1024];
|
||||
#else
|
||||
#define VERSION 1 // Game version
|
||||
#define SUBVERSION 6 // more precise version number
|
||||
#define VERSIONSTRING "Saturn v9.3"
|
||||
#define VERSIONSTRINGW L"Saturn v9.3"
|
||||
#define VERSIONSTRING "Saturn v9.2"
|
||||
#define VERSIONSTRINGW L"Saturn v9.2"
|
||||
|
||||
#define SATURN_TESTING // comment out for saturn release builds!
|
||||
|
||||
@@ -573,13 +573,6 @@ INT32 I_GetKey(void);
|
||||
// NOTE: you WILL have nasal troubles if the variable is not initialized
|
||||
#define CLEANUP(f) __attribute__((__cleanup__(f)))
|
||||
|
||||
// the GNU constructor and destructor attributes
|
||||
// The constructor attribute causes the function to be called automatically before execution enters main ().
|
||||
// Similarly, the destructor attribute causes the function to be called automatically after main () has completed or exit () has been called.
|
||||
// Functions with these attributes are useful for initializing data that will be used implicitly during the execution of the program.
|
||||
#define CONSTRUCTOR __attribute__((constructor, used))
|
||||
#define DESTRUCTOR __attribute__((destructor, used))
|
||||
|
||||
// An assert-type mechanism.
|
||||
#ifdef PARANOIA
|
||||
#define I_Assert(e) ((e) ? (void)0 : I_Error("assert failed: %s, file %s, line %d", #e, __FILE__, __LINE__))
|
||||
|
||||
+7
-1
@@ -54,6 +54,7 @@ extern INT16 maptol;
|
||||
extern UINT8 globalweather;
|
||||
extern INT32 curWeather;
|
||||
extern INT32 cursaveslot;
|
||||
extern INT16 lastmapsaved;
|
||||
extern boolean gamecomplete;
|
||||
|
||||
#define PRECIP_NONE 0
|
||||
@@ -77,6 +78,7 @@ extern boolean imcontinuing; // Temporary flag while continuing
|
||||
extern UINT8 modeattacking;
|
||||
|
||||
// menu demo things
|
||||
extern UINT8 numDemos;
|
||||
extern UINT32 demoDelayTime;
|
||||
extern UINT32 demoIdleTime;
|
||||
|
||||
@@ -112,8 +114,8 @@ extern UINT8 paused; // Game paused?
|
||||
extern UINT8 window_notinfocus; // are we in focus? (backend independant -- handles auto pausing and display of "focus lost" message)
|
||||
|
||||
extern boolean nodrawers;
|
||||
extern boolean noblit;
|
||||
extern boolean lastdraw;
|
||||
extern boolean intermissionbginit;
|
||||
|
||||
#ifdef MOTIONBLUR
|
||||
extern INT32 postimgparam[MAXSPLITSCREENPLAYERS];
|
||||
@@ -400,6 +402,9 @@ extern boolean CheckForReverseGravity;
|
||||
extern UINT16 invulntics;
|
||||
extern UINT16 sneakertics;
|
||||
extern UINT16 flashingtics;
|
||||
extern UINT16 tailsflytics;
|
||||
extern UINT16 underwatertics;
|
||||
extern UINT16 spacetimetics;
|
||||
extern UINT16 extralifetics;
|
||||
|
||||
// SRB2kart
|
||||
@@ -485,6 +490,7 @@ extern UINT32 timesBeatenWithEmeralds;
|
||||
// WAD, partly set at startup time.
|
||||
|
||||
extern tic_t gametic;
|
||||
#define localgametic leveltime
|
||||
|
||||
// Player spawn spots.
|
||||
extern mapthing_t *playerstarts[MAXPLAYERS]; // Cooperative
|
||||
|
||||
@@ -1110,6 +1110,14 @@ void F_TitleScreenTicker(boolean run)
|
||||
return;
|
||||
}
|
||||
|
||||
// Replay intro when done cycling through demos
|
||||
/*if (curDemo == numDemos) -- uuuh... we have a LOT of maps AND a big devteam... probably not gonna see a repeat unless you're super unlucky :V
|
||||
{
|
||||
curDemo = 0;
|
||||
F_StartIntro();
|
||||
return;
|
||||
}*/
|
||||
|
||||
mapname = G_BuildMapName(G_RandMap(TOL_RACE, -2, false, 0, false, NULL)+1);
|
||||
|
||||
numstaff = 1;
|
||||
|
||||
+1
-3
@@ -111,12 +111,10 @@ filestatus_t filesearch(char *filename, const char *startpath, const UINT8 *want
|
||||
char *searchname;
|
||||
int depthleft = maxsearchdepth;
|
||||
char searchpath[MAXFILEPATH];
|
||||
size_t *searchpathindex = NULL;
|
||||
size_t *searchpathindex;
|
||||
|
||||
dirhandle = (DIR**)malloc(maxsearchdepth * sizeof(DIR*));
|
||||
searchpathindex = (size_t *)malloc(maxsearchdepth * sizeof(size_t));
|
||||
if (!searchpathindex)
|
||||
I_Error("out of memory while searching for file %s\n", filename);
|
||||
|
||||
strcpy(searchpath, startpath);
|
||||
searchpathindex[--depthleft] = strlen(searchpath) + 1;
|
||||
|
||||
+40
-31
@@ -66,10 +66,12 @@
|
||||
#include <locale.h>
|
||||
|
||||
// menu demo things
|
||||
UINT8 numDemos = 0; //3; -- i'm FED UP of losing my skincolour to a broken demo. change this back when we make new ones
|
||||
UINT32 demoDelayTime = 15*TICRATE;
|
||||
UINT32 demoIdleTime = 3*TICRATE;
|
||||
|
||||
boolean nodrawers = false; // for comparative timing purposes
|
||||
boolean noblit = false; // for comparative timing purposes
|
||||
static tic_t demostarttime; // for comparative timing purposes
|
||||
|
||||
//@TODO put these all in a struct for namespacing purposes?
|
||||
@@ -1651,12 +1653,10 @@ void G_RecordDemo(const char *name)
|
||||
maxsize = cv_maxdemosize.value*1024*1024;
|
||||
|
||||
demobuf.buffer = Z_Malloc(maxsize + 100*1024, PU_STATIC, NULL);
|
||||
demoend = demobuf.buffer + maxsize;
|
||||
|
||||
if (demobuf.buffer)
|
||||
{
|
||||
demoend = demobuf.buffer + maxsize;
|
||||
demo.recording = true;
|
||||
}
|
||||
else
|
||||
CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n");
|
||||
}
|
||||
@@ -1994,6 +1994,7 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick)
|
||||
UINT8 totalfiles, filesloaded, nmusfilecount;
|
||||
char filename[MAX_WADPATH];
|
||||
UINT8 md5sum[16];
|
||||
boolean toomany = false;
|
||||
boolean alreadyloaded;
|
||||
UINT8 i, j;
|
||||
UINT8 error = 0;
|
||||
@@ -2003,44 +2004,53 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick)
|
||||
|
||||
for (i = 0; i < totalfiles; ++i)
|
||||
{
|
||||
strlcpy(filename, (char *)(*pp), sizeof filename);
|
||||
SKIPSTRING((*pp));
|
||||
if (toomany)
|
||||
SKIPSTRING((*pp));
|
||||
else
|
||||
{
|
||||
strlcpy(filename, (char *)(*pp), sizeof filename);
|
||||
SKIPSTRING((*pp));
|
||||
}
|
||||
|
||||
READMEM((*pp), md5sum, 16); // hue hue peepee
|
||||
|
||||
alreadyloaded = false;
|
||||
nmusfilecount = 0;
|
||||
|
||||
for (j = 0; j < numwadfiles; ++j)
|
||||
if (!toomany)
|
||||
{
|
||||
if (wadfiles[j]->important && j > mainwads)
|
||||
nmusfilecount++;
|
||||
else
|
||||
continue;
|
||||
alreadyloaded = false;
|
||||
nmusfilecount = 0;
|
||||
|
||||
if (memcmp(md5sum, wadfiles[j]->md5sum, 16) == 0)
|
||||
for (j = 0; j < numwadfiles; ++j)
|
||||
{
|
||||
alreadyloaded = true;
|
||||
if (wadfiles[j]->important && j > mainwads)
|
||||
nmusfilecount++;
|
||||
else
|
||||
continue;
|
||||
|
||||
if (i != nmusfilecount-1 && error < DFILE_ERROR_OUTOFORDER)
|
||||
error |= DFILE_ERROR_OUTOFORDER;
|
||||
if (memcmp(md5sum, wadfiles[j]->md5sum, 16) == 0)
|
||||
{
|
||||
alreadyloaded = true;
|
||||
|
||||
break;
|
||||
if (i != nmusfilecount-1 && error < DFILE_ERROR_OUTOFORDER)
|
||||
error |= DFILE_ERROR_OUTOFORDER;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (alreadyloaded)
|
||||
{
|
||||
filesloaded++;
|
||||
continue;
|
||||
}
|
||||
if (alreadyloaded)
|
||||
{
|
||||
filesloaded++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (numwadfiles >= MAX_WADFILES)
|
||||
if (numwadfiles >= MAX_WADFILES)
|
||||
error = DFILE_ERROR_CANNOTLOAD;
|
||||
else if (!quick && findfile(filename, md5sum, false) != FS_FOUND)
|
||||
error = DFILE_ERROR_CANNOTLOAD;
|
||||
else if (error < DFILE_ERROR_INCOMPLETEOUTOFORDER)
|
||||
error |= DFILE_ERROR_NOTLOADED;
|
||||
} else
|
||||
error = DFILE_ERROR_CANNOTLOAD;
|
||||
else if (!quick && findfile(filename, md5sum, false) != FS_FOUND)
|
||||
error = DFILE_ERROR_CANNOTLOAD;
|
||||
else if (error < DFILE_ERROR_INCOMPLETEOUTOFORDER)
|
||||
error |= DFILE_ERROR_NOTLOADED;
|
||||
}
|
||||
|
||||
// Get final file count
|
||||
@@ -3510,11 +3520,10 @@ static INT32 restorecv_vidwait;
|
||||
void G_TimeDemo(const char *name)
|
||||
{
|
||||
nodrawers = M_CheckParm("-nodraw");
|
||||
|
||||
noblit = M_CheckParm("-noblit");
|
||||
restorecv_vidwait = cv_vidwait.value;
|
||||
if (cv_vidwait.value)
|
||||
CV_Set(&cv_vidwait, "0");
|
||||
|
||||
demo.timing = true;
|
||||
singletics = true;
|
||||
framecount = 0;
|
||||
|
||||
+24
-1
@@ -61,6 +61,7 @@
|
||||
|
||||
gameaction_t gameaction = 0;
|
||||
gamestate_t gamestate = GS_NULL;
|
||||
UINT8 ultimatemode = false;
|
||||
|
||||
boolean botingame = false;
|
||||
UINT8 botskin = 0;
|
||||
@@ -86,6 +87,7 @@ INT16 maptol = 0;
|
||||
UINT8 globalweather = 0;
|
||||
INT32 curWeather = PRECIP_NONE;
|
||||
INT32 cursaveslot = -1; // Auto-save 1p savegame slot
|
||||
INT16 lastmapsaved = 0; // Last map we auto-saved at
|
||||
boolean gamecomplete = false;
|
||||
|
||||
UINT16 mainwads = 0;
|
||||
@@ -106,6 +108,7 @@ INT32 consoleplayer = 0; // player taking events and displaying
|
||||
INT32 displayplayers[MAXSPLITSCREENPLAYERS] = {}; // view being displayed
|
||||
|
||||
tic_t gametic = 0;
|
||||
tic_t levelstarttic = 0; // gametic at level start
|
||||
UINT32 totalrings = 0; // for intermission
|
||||
INT16 lastmap = 0; // last level you were at (returning from special stages)
|
||||
tic_t timeinmap = 0; // Ticker for time spent in level (used for levelcard display)
|
||||
@@ -183,6 +186,9 @@ boolean CheckForReverseGravity = false;
|
||||
UINT16 invulntics = 20*TICRATE;
|
||||
UINT16 sneakertics = 20*TICRATE;
|
||||
UINT16 flashingtics = 3*TICRATE/2; // SRB2kart
|
||||
UINT16 tailsflytics = 8*TICRATE;
|
||||
UINT16 underwatertics = 30*TICRATE;
|
||||
UINT16 spacetimetics = 11*TICRATE + (TICRATE/2);
|
||||
UINT16 extralifetics = 4*TICRATE;
|
||||
|
||||
// SRB2kart
|
||||
@@ -200,6 +206,8 @@ const INT32 wipeoutslowtime = 20;
|
||||
const INT32 wantedreduce = 5*TICRATE;
|
||||
const INT32 wantedfrequency = 10*TICRATE;
|
||||
|
||||
INT32 gameovertics = 15*TICRATE;
|
||||
|
||||
UINT8 use1upSound = 0;
|
||||
|
||||
UINT8 introtoplay = 0;
|
||||
@@ -1290,6 +1298,8 @@ static void G_DoLoadLevel(boolean resetplayer)
|
||||
// Make sure objectplace is OFF when you first start the level!
|
||||
OP_ResetObjectplace();
|
||||
|
||||
levelstarttic = gametic; // for time calculation
|
||||
|
||||
if (wipegamestate == GS_LEVEL)
|
||||
wipegamestate = -1; // force a wipe
|
||||
|
||||
@@ -3343,6 +3353,18 @@ static void G_DoStartVote(void)
|
||||
gameaction = ga_nothing;
|
||||
}
|
||||
|
||||
//
|
||||
// G_UseContinue
|
||||
//
|
||||
void G_UseContinue(void)
|
||||
{
|
||||
if (gamestate == GS_LEVEL && !netgame && !multiplayer)
|
||||
{
|
||||
gameaction = ga_startcont;
|
||||
lastdraw = true;
|
||||
}
|
||||
}
|
||||
|
||||
static void G_DoStartContinue(void)
|
||||
{
|
||||
I_Assert(!netgame && !multiplayer);
|
||||
@@ -3381,7 +3403,7 @@ static void G_DoContinued(void)
|
||||
token = 0;
|
||||
|
||||
// Reset # of lives
|
||||
pl->lives = 3;
|
||||
pl->lives = (ultimatemode) ? 1 : 3;
|
||||
|
||||
D_MapChange(gamemap, gametype, false, false, 0, false, false);
|
||||
|
||||
@@ -4025,6 +4047,7 @@ void G_InitNew(UINT8 pencoremode, const char *mapname, boolean resetplayer, bool
|
||||
if (W_CheckNumForName(mapname) == LUMPERROR)
|
||||
{
|
||||
I_Error("Internal game map '%s' not found\n", mapname);
|
||||
Command_ExitGame_f();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,8 +39,12 @@ extern INT32 player_name_changes[MAXPLAYERS];
|
||||
extern player_t players[MAXPLAYERS];
|
||||
extern boolean playeringame[MAXPLAYERS];
|
||||
|
||||
// gametic at level start
|
||||
extern tic_t levelstarttic;
|
||||
|
||||
// for modding?
|
||||
extern INT16 prevmap, nextmap;
|
||||
extern INT32 gameovertics;
|
||||
extern tic_t timeinmap; // Ticker for time spent in level (used for levelcard display)
|
||||
extern INT16 rw_maximums[NUM_WEAPONS];
|
||||
|
||||
@@ -248,6 +252,7 @@ UINT8 G_GetGametypeColor(INT16 gt);
|
||||
void G_ExitLevel(void);
|
||||
void G_NextLevel(void);
|
||||
void G_Continue(void);
|
||||
void G_UseContinue(void);
|
||||
void G_AfterIntermission(void);
|
||||
void G_EndGame(void); // moved from y_inter.c/h and renamed
|
||||
|
||||
|
||||
@@ -81,7 +81,6 @@ consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS] = {
|
||||
{"gamepadled4", "Skincolor", CV_SAVE|CV_CALL|CV_NOINIT, gamepadled_cons_t, led_off_handle4, 0, NULL, NULL, 0, 0, NULL}
|
||||
};
|
||||
|
||||
consvar_t cv_gamepadifunfocused = {"gamepadunfocused", "Off", CV_SAVE|CV_CALL, CV_OnOff, I_SetJoystickFocus, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_gamepadledifunfocused = {"gamepadledunfocused", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_rumbleifunfocused = {"rumbleifunfocused", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
@@ -940,11 +939,6 @@ void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT8 color)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!I_GamepadHasLED(playernum))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// so we can override this
|
||||
skincolor = color ? color : G_GetSkinColorForGamepad(playernum);
|
||||
byte_color = V_GetColor(colortranslations[skincolor][8]).s;
|
||||
@@ -980,22 +974,12 @@ void G_DeviceLEDTick(void)
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (!cv_usejoystick[i].value || !cv_gamepadled[i].value)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// does not have a configurable led! :c
|
||||
if (!I_GamepadHasLED(i))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
newcolor = G_GetSkinColorForGamepad(i);
|
||||
|
||||
if (curcolor[i] == newcolor) // dont update if same colour
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
G_SetPlayerGamepadIndicatorColor(i, newcolor);
|
||||
curcolor[i] = newcolor;
|
||||
@@ -1071,12 +1055,6 @@ void G_DeviceRumbleTick(void)
|
||||
continue;
|
||||
}
|
||||
|
||||
// does not support rumble! :c
|
||||
if (!I_GamepadHasRumble(i))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (camera[i].freecam)
|
||||
{
|
||||
continue;
|
||||
|
||||
@@ -116,7 +116,6 @@ extern consvar_t cv_rumble[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
|
||||
|
||||
extern consvar_t cv_gamepadifunfocused;
|
||||
extern consvar_t cv_gamepadledifunfocused;
|
||||
extern consvar_t cv_rumbleifunfocused;
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@ typedef enum
|
||||
} gameaction_t;
|
||||
|
||||
extern gamestate_t gamestate;
|
||||
extern UINT8 ultimatemode; // was sk_insane
|
||||
extern gameaction_t gameaction;
|
||||
|
||||
extern boolean botingame;
|
||||
|
||||
+2422
-545
File diff suppressed because it is too large.
Load diff
@@ -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;
|
||||
|
||||
@@ -110,7 +110,7 @@ typedef struct
|
||||
typedef struct
|
||||
{
|
||||
poly_t *planepoly; // the generated convex polygon
|
||||
} extrasubsector_t;
|
||||
} poly_subsector_t;
|
||||
|
||||
// Vanilla features
|
||||
//#define USE_MODEL_NEXTFRAME
|
||||
|
||||
+20
-24
@@ -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;
|
||||
|
||||
@@ -138,7 +150,7 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
|
||||
if (!column->topdelta)
|
||||
{
|
||||
const UINT8 *source = (const UINT8 *)(column) + 3;
|
||||
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, source[0]);
|
||||
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (column->topdelta == 0xff ? 31 : source[0]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -292,7 +302,7 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
||||
if (!column->topdelta)
|
||||
{
|
||||
const UINT8 *source = (const UINT8 *)(column) + 3;
|
||||
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, source[0]);
|
||||
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (column->topdelta == 0xff ? 31 : source[0]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -954,20 +964,6 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
|
||||
#endif
|
||||
|
||||
#ifndef USE_PNG
|
||||
typedef struct
|
||||
{
|
||||
UINT8 id_field_length ; // 1
|
||||
UINT8 color_map_type ; // 2
|
||||
UINT8 image_type ; // 3
|
||||
UINT8 dummy[5] ; // 4, 8
|
||||
INT16 x_origin ; // 9, 10
|
||||
INT16 y_origin ; //11, 12
|
||||
INT16 width ; //13, 14
|
||||
INT16 height ; //15, 16
|
||||
UINT8 image_pix_size ; //17
|
||||
UINT8 image_descriptor; //18
|
||||
} ATTRPACK TGAHeader; // sizeof is 18
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// save screenshots with TGA format
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
@@ -32,12 +32,8 @@ void GL_SetSpecialState(hwdspecialstate_t IdState, INT32 Value);
|
||||
void GL_SetTransform(FTransform *stransform);
|
||||
void GL_SetBlend(FBITFIELD PolyFlags);
|
||||
void GL_SetPalette(RGBA_t *palette);
|
||||
|
||||
void GL_ClearBuffer(FBOOLEAN ColorMask, FBOOLEAN DepthMask, FBOOLEAN StencilMask, FRGBAFloat * ClearColor);
|
||||
|
||||
void GL_EnableStencilTest(void);
|
||||
void GL_DisableStencilTest(void);
|
||||
|
||||
void GL_DrawPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags);
|
||||
void GL_DrawIndexedTriangles(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags, unsigned int *IndexArray);
|
||||
void GL_Draw2DLine(F2DCoord *v1, F2DCoord *v2, RGBA_t Color);
|
||||
@@ -67,7 +63,7 @@ void GL_FlushScreenTextures(void);
|
||||
void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags);
|
||||
void GL_DoScreenWipe(int wipeStart, int wipeEnd);
|
||||
void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8 downdistort, UINT8 barsize);
|
||||
void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height);
|
||||
void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean useshader);
|
||||
|
||||
void GL_PostImgRedraw(float points[SCREENVERTS][SCREENVERTS][2]);
|
||||
|
||||
@@ -76,7 +72,6 @@ void GL_LoadShader(int slot, char *code, hwdshaderstage_t stage);
|
||||
boolean GL_CompileShader(int slot);
|
||||
void GL_SetShader(int slot);
|
||||
void GL_UnSetShader(void);
|
||||
void GL_EnableShader(void);
|
||||
|
||||
void GL_SetShaderInfo(hwdshaderinfo_t info, INT32 value);
|
||||
|
||||
|
||||
@@ -34,8 +34,8 @@ typedef struct gl_vissprite_s
|
||||
float gz, gzt;
|
||||
float tz;
|
||||
float scale;
|
||||
//float spritexscale, spriteyscale;
|
||||
//float spritexoffset, spriteyoffset;
|
||||
float spritexscale, spriteyscale;
|
||||
float spritexoffset, spriteyoffset;
|
||||
patch_t *gpatch;
|
||||
boolean flip;
|
||||
UINT8 translucency; //alpha level 0-255
|
||||
@@ -52,12 +52,12 @@ void HWR_ObjectLightLevelPost(gl_vissprite_t *spr, const sector_t *sector, INT32
|
||||
// --------
|
||||
// hw_bsp.c
|
||||
// --------
|
||||
extern extrasubsector_t *extrasubsectors;
|
||||
extern poly_subsector_t *poly_subsectors;
|
||||
#ifdef PARANOIA
|
||||
extern size_t addsubsector;
|
||||
extern size_t num_poly_subsector;
|
||||
#endif
|
||||
|
||||
void HWR_FreeExtraSubsectors(void);
|
||||
void HWR_InitPolyPool(void);
|
||||
void HWR_FreePolyPool(void);
|
||||
|
||||
// --------
|
||||
// hw_cache.c
|
||||
|
||||
+138
-124
@@ -125,7 +125,7 @@ ps_metric_t ps_hw_batchdrawtime = {};
|
||||
static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, boolean noencore, FSurfaceInfo* Surf, INT32 cutflag, ffloor_t *pfloor, FBITFIELD polyflags);
|
||||
static void HWR_RenderWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, FBITFIELD blend, boolean fogwall, INT32 lightlevel, extracolormap_t *wallcolormap);
|
||||
|
||||
static void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap);
|
||||
static void HWR_AddTransparentFloor(lumpnum_t lumpnum, poly_subsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap);
|
||||
static void HWR_AddTransparentWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, INT32 texnum, boolean noencore, FBITFIELD blend, boolean fogwall, INT32 lightlevel, extracolormap_t *wallcolormap);
|
||||
static void HWR_AddTransparentPolyobjectFloor(lumpnum_t lumpnum, polyobj_t *polysector, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, extracolormap_t *planecolormap);
|
||||
|
||||
@@ -231,6 +231,17 @@ consvar_t cv_glanisotropicmode = {"gr_anisotropicmode", "1", CV_CALL|CV_SAVE, gl
|
||||
|
||||
consvar_t cv_glsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_glpolytile = {"gr_polytile", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
CV_PossibleValue_t grpolyshape_cons_t[] = {
|
||||
{0, "Subsector"},
|
||||
{1, "Fat"},
|
||||
{2, "Trim"},
|
||||
{3, "NotConvex"},
|
||||
{0, NULL}
|
||||
};
|
||||
consvar_t cv_glpolyshape = {"gr_polygon_shape", "Trim", CV_SAVE, grpolyshape_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_glbatching = {"gr_batching", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_glwireframe = {"gr_wireframe", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
@@ -254,11 +265,11 @@ static void CV_screentextures_OnChange(void)
|
||||
{
|
||||
if (cv_glpaletterendering.value != 0)
|
||||
CV_SetValue(&cv_glpaletterendering, 0);
|
||||
|
||||
#ifdef USE_FBO_OGL
|
||||
if (cv_glframebuffer.value != 0)
|
||||
CV_SetValue(&cv_glframebuffer, 0);
|
||||
#endif
|
||||
intermissionbginit = false;
|
||||
}
|
||||
GL_SetSpecialState(HWD_SET_SCREEN_TEXTURES, cv_glscreentextures.value);
|
||||
M_UpdateOGLMenu();
|
||||
@@ -275,7 +286,6 @@ static void CV_glframebuffer_OnChange(void)
|
||||
I_DownSample();
|
||||
RefreshOGLSDLSurface();
|
||||
M_UpdateOGLMenu();
|
||||
intermissionbginit = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -389,11 +399,11 @@ void HWR_ObjectLightLevelPost(gl_vissprite_t *spr, const sector_t *sector, INT32
|
||||
extralight = FixedMul(extralight, std::min(std::max(0, *lightlevel), 255) * FRACUNIT / 255);
|
||||
|
||||
// simple OGL approximation
|
||||
const fixed_t tr = R_QuickCamDist(spr->mobj->x, spr->mobj->y);
|
||||
const fixed_t xscale = FixedDiv((vid.width / 2) << FRACBITS, tr);
|
||||
fixed_t tr = R_QuickCamDist(spr->mobj->x, spr->mobj->y);
|
||||
fixed_t xscale = FixedDiv((vid.width / 2) << FRACBITS, tr);
|
||||
|
||||
// Less change in contrast at further distances, to counteract DOOM diminished light
|
||||
const fixed_t n = FixedDiv(FixedMul(xscale, LIGHTRESOLUTIONFIX), ((MAXLIGHTSCALE-1) << LIGHTSCALESHIFT));
|
||||
fixed_t n = FixedDiv(FixedMul(xscale, LIGHTRESOLUTIONFIX), ((MAXLIGHTSCALE-1) << LIGHTSCALESHIFT));
|
||||
extralight = FixedMul(extralight, std::min(n, FRACUNIT));
|
||||
|
||||
// Contrast is stronger for normal sprites, stronger than wall lighting is at the same distance
|
||||
@@ -511,12 +521,12 @@ 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))
|
||||
{
|
||||
const INT16 offset = (cv_glfakecontrast.value == 2) ? seg->hwLightOffset : ((INT16)seg->lightOffset * 8);
|
||||
INT16 offset = (cv_glfakecontrast.value == 2) ? seg->hwLightOffset : ((INT16)seg->lightOffset * 8);
|
||||
|
||||
finallight += offset;
|
||||
finallight = CLAMP(finallight, 0 , 255);
|
||||
@@ -534,7 +544,7 @@ static FUINT HWR_CalcSlopeLight(FUINT lightnum, pslope_t *slope, const sector_t
|
||||
|
||||
if (slope != NULL && sector != NULL && P_ApplyLightOffsetFine(lightnum, sector))
|
||||
{
|
||||
const INT16 offset = (cv_glfakecontrast.value == 2) ? slope->hwLightOffset : ((INT16)slope->lightOffset * 8);
|
||||
INT16 offset = (cv_glfakecontrast.value == 2) ? slope->hwLightOffset : ((INT16)slope->lightOffset * 8);
|
||||
|
||||
finallight += (fof ? -offset : offset);
|
||||
finallight = CLAMP(finallight, 0 , 255);
|
||||
@@ -549,7 +559,7 @@ static FUINT HWR_CalcSlopeLight(FUINT lightnum, pslope_t *slope, const sector_t
|
||||
|
||||
// HWR_RenderPlane
|
||||
// Render a floor or ceiling convex polygon
|
||||
static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, FBITFIELD PolyFlags, INT32 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector, UINT8 alpha, extracolormap_t *planecolormap)
|
||||
static void HWR_RenderPlane(subsector_t *subsector, poly_subsector_t *xsub, boolean isceiling, fixed_t fixedheight, FBITFIELD PolyFlags, INT32 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector, UINT8 alpha, extracolormap_t *planecolormap)
|
||||
{
|
||||
FSurfaceInfo Surf = {};
|
||||
FOutVector *v3d;
|
||||
@@ -696,7 +706,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)
|
||||
@@ -1421,11 +1431,6 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
{
|
||||
draw_sky_walls(0, 1, worldhigh, worldhighslope);
|
||||
}
|
||||
|
||||
// hack to allow height changes in outdoor areas
|
||||
// This is what gets rid of the upper textures if there should be sky
|
||||
worldtop = worldhigh;
|
||||
worldtopslope = worldhighslope;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1470,6 +1475,15 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
}
|
||||
}
|
||||
|
||||
// hack to allow height changes in outdoor areas
|
||||
// This is what gets rid of the upper textures if there should be sky
|
||||
if (gl_frontsector->ceilingpic == skyflatnum
|
||||
&& gl_backsector->ceilingpic == skyflatnum)
|
||||
{
|
||||
worldtop = worldhigh;
|
||||
worldtopslope = worldhighslope;
|
||||
}
|
||||
|
||||
gl_toptexture = R_GetTextureNum(gl_sidedef->toptexture);
|
||||
|
||||
// check TOP TEXTURE
|
||||
@@ -2260,7 +2274,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
|
||||
static inline boolean HWR_UsePortals(void)
|
||||
{
|
||||
return supportstencil && gl_maphasportals && cv_glportals.value;
|
||||
return supportstencil && cv_glportals.value && gl_maphasportals;
|
||||
}
|
||||
|
||||
// From PrBoom:
|
||||
@@ -2404,8 +2418,7 @@ static inline void DoAddLine(seg_t* line, angle_t angle1, angle_t angle2)
|
||||
// SoM: Backsector needs to be run through R_FakeFlat
|
||||
static sector_t tempsec;
|
||||
|
||||
auto do_addline = [&](bool dontdraw)
|
||||
{
|
||||
auto do_addline = [&](bool dontdraw) {
|
||||
// Single sided line?
|
||||
if (!line->backsector)
|
||||
{
|
||||
@@ -2673,7 +2686,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;
|
||||
@@ -2686,6 +2699,14 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling,
|
||||
if (nrPlaneVerts < 3) // not even a triangle ?
|
||||
return;
|
||||
|
||||
if (nrPlaneVerts > INT16_MAX) // FIXME: exceeds plVerts size
|
||||
{
|
||||
CONS_Debug(DBG_RENDER, "polygon size of %s exceeds max value of %d vertices\n", sizeu1(nrPlaneVerts), UINT16_MAX);
|
||||
return;
|
||||
}
|
||||
|
||||
const sector_t *sec = FOFsector ? FOFsector : gl_frontsector;
|
||||
|
||||
// Allocate plane-vertex buffer if we need to
|
||||
if (!planeVerts || nrPlaneVerts > numAllocedPlaneVerts)
|
||||
{
|
||||
@@ -2694,8 +2715,6 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling,
|
||||
Z_Malloc(numAllocedPlaneVerts * sizeof(FOutVector), PU_LEVEL, &planeVerts);
|
||||
}
|
||||
|
||||
const sector_t *sec = FOFsector ? FOFsector : gl_frontsector;
|
||||
|
||||
height = FixedToFloat(fixedheight);
|
||||
|
||||
len = W_LumpLength(lumpnum);
|
||||
@@ -2813,7 +2832,7 @@ static void HWR_AddPolyObjectPlanes(void)
|
||||
sector_t *polyobjsector;
|
||||
INT32 light = 0;
|
||||
|
||||
// Polyobject Planes need their own function for drawing because they don't have extrasubsectors by themselves
|
||||
// Polyobject Planes need their own function for drawing because they don't have poly_subsectors by themselves
|
||||
// It should be okay because polyobjects should always be convex anyway
|
||||
|
||||
for (i = 0; i < numpolys; i++)
|
||||
@@ -2941,9 +2960,9 @@ static void HWR_Subsector(size_t num)
|
||||
ffloor_t *rover;
|
||||
|
||||
#ifdef PARANOIA // no risk while developing, enough debugging nights!
|
||||
if (num >= addsubsector)
|
||||
if (num >= num_poly_subsector)
|
||||
I_Error("HWR_Subsector: ss %s with numss = %s, addss = %s\n",
|
||||
sizeu1(num), sizeu2(numsubsectors), sizeu3(addsubsector));
|
||||
sizeu1(num), sizeu2(numsubsectors), sizeu3(num_poly_subsector));
|
||||
#endif
|
||||
|
||||
if (num < numsubsectors)
|
||||
@@ -3038,7 +3057,7 @@ static void HWR_Subsector(size_t num)
|
||||
if (sub->validcount != validcount)
|
||||
{
|
||||
HWR_GetFlat(levelflats[gl_frontsector->floorpic].lumpnum, R_NoEncore(gl_frontsector, false));
|
||||
HWR_RenderPlane(sub, &extrasubsectors[num], false,
|
||||
HWR_RenderPlane(sub, &poly_subsectors[num], false,
|
||||
gl_frontsector->floorheight,
|
||||
// We now return you to your regularly scheduled rendering.
|
||||
PF_Occlude, floorlightlevel, levelflats[gl_frontsector->floorpic].lumpnum, NULL, 255, floorcolormap);
|
||||
@@ -3053,7 +3072,7 @@ static void HWR_Subsector(size_t num)
|
||||
if (sub->validcount != validcount)
|
||||
{
|
||||
HWR_GetFlat(levelflats[gl_frontsector->ceilingpic].lumpnum, R_NoEncore(gl_frontsector, true));
|
||||
HWR_RenderPlane(sub, &extrasubsectors[num], true,
|
||||
HWR_RenderPlane(sub, &poly_subsectors[num], true,
|
||||
gl_frontsector->ceilingheight,
|
||||
// We now return you to your regularly scheduled rendering.
|
||||
PF_Occlude, ceilinglightlevel, levelflats[gl_frontsector->ceilingpic].lumpnum, NULL, 255, ceilingcolormap);
|
||||
@@ -3100,7 +3119,7 @@ static void HWR_Subsector(size_t num)
|
||||
alpha = HWR_FogBlockAlpha(*gl_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap);
|
||||
|
||||
HWR_AddTransparentFloor(0,
|
||||
&extrasubsectors[num],
|
||||
&poly_subsectors[num],
|
||||
false,
|
||||
*rover->bottomheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
@@ -3112,7 +3131,7 @@ static void HWR_Subsector(size_t num)
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < bottomCullHeight));
|
||||
|
||||
HWR_AddTransparentFloor(levelflats[*rover->bottompic].lumpnum,
|
||||
&extrasubsectors[num],
|
||||
&poly_subsectors[num],
|
||||
false,
|
||||
*rover->bottomheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
@@ -3124,7 +3143,7 @@ static void HWR_Subsector(size_t num)
|
||||
HWR_GetFlat(levelflats[*rover->bottompic].lumpnum, R_NoEncore(gl_frontsector, false));
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < bottomCullHeight));
|
||||
|
||||
HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->bottompic].lumpnum,
|
||||
HWR_RenderPlane(sub, &poly_subsectors[num], false, *rover->bottomheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->bottompic].lumpnum,
|
||||
rover->master->frontsector, 255, gl_frontsector->lightlist[light].extra_colormap);
|
||||
}
|
||||
}
|
||||
@@ -3146,7 +3165,7 @@ static void HWR_Subsector(size_t num)
|
||||
alpha = HWR_FogBlockAlpha(*gl_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap);
|
||||
|
||||
HWR_AddTransparentFloor(0,
|
||||
&extrasubsectors[num],
|
||||
&poly_subsectors[num],
|
||||
true,
|
||||
*rover->topheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
@@ -3158,7 +3177,7 @@ static void HWR_Subsector(size_t num)
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < topCullHeight));
|
||||
|
||||
HWR_AddTransparentFloor(levelflats[*rover->toppic].lumpnum,
|
||||
&extrasubsectors[num],
|
||||
&poly_subsectors[num],
|
||||
true,
|
||||
*rover->topheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
@@ -3170,7 +3189,7 @@ static void HWR_Subsector(size_t num)
|
||||
HWR_GetFlat(levelflats[*rover->toppic].lumpnum, R_NoEncore(gl_frontsector, true));
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < topCullHeight));
|
||||
|
||||
HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->toppic].lumpnum,
|
||||
HWR_RenderPlane(sub, &poly_subsectors[num], true, *rover->topheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->toppic].lumpnum,
|
||||
rover->master->frontsector, 255, gl_frontsector->lightlist[light].extra_colormap);
|
||||
}
|
||||
}
|
||||
@@ -3801,7 +3820,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite)
|
||||
{
|
||||
const fixed_t h = P_GetLightZAt(§or->lightlist[i], sprmo->x, sprmo->y);
|
||||
|
||||
if (h > temp)
|
||||
if (!(h <= temp))
|
||||
continue;
|
||||
|
||||
if (!lightset)
|
||||
@@ -3863,7 +3882,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 && sprmo && !papersprite)
|
||||
{
|
||||
// Get the x and z of the vertices so billboarding draws correctly
|
||||
realheight = realbot - realtop;
|
||||
@@ -3936,7 +3955,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 +4119,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
|
||||
@@ -4251,7 +4270,7 @@ typedef struct
|
||||
|
||||
typedef struct
|
||||
{
|
||||
extrasubsector_t *xsub;
|
||||
poly_subsector_t *xsub;
|
||||
boolean isceiling;
|
||||
fixed_t fixedheight;
|
||||
INT32 lightlevel;
|
||||
@@ -4300,23 +4319,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;
|
||||
@@ -4336,7 +4354,7 @@ static void HWR_AddTransparentWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, I
|
||||
wallinfo->wallcolormap = wallcolormap;
|
||||
}
|
||||
|
||||
static void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap)
|
||||
static void HWR_AddTransparentFloor(lumpnum_t lumpnum, poly_subsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap)
|
||||
{
|
||||
planeinfo_t *planeinfo = static_cast<planeinfo_t*>(HWR_CreateDrawNode(DRAWNODE_PLANE));
|
||||
|
||||
@@ -4383,7 +4401,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 +4838,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 +4877,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 +4965,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 +5028,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 +5160,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 +5185,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 +5302,7 @@ void HWR_ClearSkyDome(void)
|
||||
sky->loops = NULL;
|
||||
sky->data = NULL;
|
||||
|
||||
sky->vbo = 0;
|
||||
sky->rows = sky->columns = 0;
|
||||
sky->loopcount = 0;
|
||||
|
||||
@@ -5691,12 +5714,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 +5731,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 +5739,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();
|
||||
}
|
||||
@@ -5810,6 +5824,7 @@ void HWR_RenderPlayerView(void)
|
||||
|
||||
void HWR_LoadLevel(void)
|
||||
{
|
||||
HWR_FreePolyPool();
|
||||
HWR_CreatePlanePolygons((INT32)numnodes - 1);
|
||||
|
||||
// Build the sky dome
|
||||
@@ -5894,6 +5909,8 @@ void HWR_AddCommands(void)
|
||||
CV_RegisterVar(&cv_glanisotropicmode);
|
||||
|
||||
CV_RegisterVar(&cv_glsolvetjoin);
|
||||
CV_RegisterVar(&cv_glpolytile);
|
||||
CV_RegisterVar(&cv_glpolyshape);
|
||||
|
||||
CV_RegisterVar(&cv_glbatching);
|
||||
|
||||
@@ -5921,6 +5938,7 @@ void HWR_Startup(void)
|
||||
CONS_Printf("HWR_Startup()...\n");
|
||||
textureformat = patchformat = GL_TEXFMT_RGBA;
|
||||
|
||||
HWR_InitPolyPool();
|
||||
HWR_InitMapTextures();
|
||||
HWR_InitMD2();
|
||||
|
||||
@@ -5985,7 +6003,7 @@ static void COM_HWR_glinfo(void)
|
||||
// if the GPU is super new and supports a bajillion extensions - xyzzy
|
||||
|
||||
char *copy = strdup((const char*)gl_extensions);
|
||||
char *ext;
|
||||
char *ext = strtok(copy, " ");
|
||||
|
||||
if (copy == NULL)
|
||||
{
|
||||
@@ -5993,8 +6011,6 @@ static void COM_HWR_glinfo(void)
|
||||
return;
|
||||
}
|
||||
|
||||
ext = strtok(copy, " ");
|
||||
|
||||
do
|
||||
{
|
||||
CONS_Printf(" - %s\n", ext);
|
||||
@@ -6014,7 +6030,7 @@ static void COM_HWR_glinfo(void)
|
||||
void HWR_Shutdown(void)
|
||||
{
|
||||
CONS_Printf("HWR_Shutdown()\n");
|
||||
HWR_FreeExtraSubsectors();
|
||||
HWR_FreePolyPool();
|
||||
HWR_FreeMapTextures();
|
||||
GL_FlushScreenTextures();
|
||||
HWR_ClearAllTextures();
|
||||
@@ -6096,66 +6112,64 @@ 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?
|
||||
if (splitscreen || cv_reducevfx.value)
|
||||
return;
|
||||
|
||||
//UINT8 viewnum = R_GetViewNumber();
|
||||
//UINT8 viewnum = R_GetViewNumber(); // see below
|
||||
//camera_t *thiscam = &camera[viewnum];
|
||||
const camera_t *thiscam = &camera[0];
|
||||
|
||||
if (!(thiscam->postimg & POSTIMG_WATER || thiscam->postimg & POSTIMG_HEAT))
|
||||
return;
|
||||
// Not supported in splitscreen - someone want to add support?
|
||||
const boolean screenwave = (!splitscreen && !cv_reducevfx.value && (thiscam->postimg & POSTIMG_WATER || thiscam->postimg & POSTIMG_HEAT));
|
||||
|
||||
// Capture the screen for intermission and screen waving
|
||||
if (gamestate != GS_INTERMISSION)
|
||||
if ((lastdraw || screenwave) && gamestate != GS_INTERMISSION)
|
||||
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC1);
|
||||
|
||||
// Drunken vision! WooOOooo~
|
||||
// 10 by 10 grid. 2 coordinates (xy)
|
||||
float v[SCREENVERTS][SCREENVERTS][2];
|
||||
float disStart = (leveltime-1) + FixedToFloat(R_GetTimeFrac(RTF_LEVEL));
|
||||
|
||||
UINT8 x, y;
|
||||
float WAVELENGTH;
|
||||
float AMPLITUDE;
|
||||
float FREQUENCY;
|
||||
|
||||
// Modifies the wave.
|
||||
if (thiscam->postimg & POSTIMG_WATER)
|
||||
if (screenwave)
|
||||
{
|
||||
WAVELENGTH = 5.0f;
|
||||
AMPLITUDE = 40.0f;
|
||||
FREQUENCY = 8.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
WAVELENGTH = 10.0f;
|
||||
AMPLITUDE = 60.0f;
|
||||
FREQUENCY = 4.0f;
|
||||
}
|
||||
// 10 by 10 grid. 2 coordinates (xy)
|
||||
float v[SCREENVERTS][SCREENVERTS][2];
|
||||
float disStart = (leveltime-1) + FixedToFloat(R_GetTimeFrac(RTF_LEVEL));
|
||||
|
||||
//static constexpr float scale = ((float)SCREENVERTS - 1.0f) / 9.0f; // well this evals to just 1.0f and what is x / 1? kek
|
||||
UINT8 x, y;
|
||||
float WAVELENGTH;
|
||||
float AMPLITUDE;
|
||||
float FREQUENCY;
|
||||
|
||||
for (x = 0; x < SCREENVERTS; x++)
|
||||
{
|
||||
for (y = 0; y < SCREENVERTS; y++)
|
||||
// Modifies the wave.
|
||||
if (thiscam->postimg & POSTIMG_WATER)
|
||||
{
|
||||
// Change X position based on its Y position.
|
||||
v[x][y][0] = x-4.5f + sinf(((disStart+(static_cast<float>(y) * WAVELENGTH)) / FREQUENCY)) / AMPLITUDE; // (x / scale)
|
||||
v[x][y][1] = y-4.5f; // (y / scale)
|
||||
WAVELENGTH = 5.0f;
|
||||
AMPLITUDE = 40.0f;
|
||||
FREQUENCY = 8.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
WAVELENGTH = 10.0f;
|
||||
AMPLITUDE = 60.0f;
|
||||
FREQUENCY = 4.0f;
|
||||
}
|
||||
|
||||
//static constexpr float scale = ((float)SCREENVERTS - 1.0f) / 9.0f; // well this evals to just 1.0f and what is x / 1? kek
|
||||
|
||||
for (x = 0; x < SCREENVERTS; x++)
|
||||
{
|
||||
for (y = 0; y < SCREENVERTS; y++)
|
||||
{
|
||||
// Change X position based on its Y position.
|
||||
v[x][y][0] = x-4.5f + sinf(((disStart+(static_cast<float>(y) * WAVELENGTH)) / FREQUENCY)) / AMPLITUDE; // (x / scale)
|
||||
v[x][y][1] = y-4.5f; // (y / scale)
|
||||
}
|
||||
}
|
||||
|
||||
GL_PostImgRedraw(v);
|
||||
|
||||
// Capture the screen again for screen waving on the intermission
|
||||
if (gamestate != GS_INTERMISSION)
|
||||
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC1);
|
||||
}
|
||||
|
||||
GL_PostImgRedraw(v);
|
||||
|
||||
// Capture the screen again for screen waving on the intermission
|
||||
if (gamestate != GS_INTERMISSION)
|
||||
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC1);
|
||||
// Flipping of the screen isn't done here anymore
|
||||
}
|
||||
|
||||
|
||||
@@ -151,19 +151,14 @@ FUNCINLINE static ATTRINLINE void HWR_RenderVhsEffect(fixed_t upbary, fixed_t do
|
||||
GL_RenderVhsEffect(upbary, downbary, updistort, downdistort, barsize);
|
||||
}
|
||||
|
||||
FUNCINLINE static ATTRINLINE void HWR_MakeScreenTexture(void)
|
||||
{
|
||||
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC1);
|
||||
}
|
||||
|
||||
FUNCINLINE static ATTRINLINE void HWR_MakeScreenFinalTexture(void)
|
||||
{
|
||||
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC2);
|
||||
}
|
||||
|
||||
FUNCINLINE static ATTRINLINE void HWR_DrawScreenFinalTexture(INT32 width, INT32 height)
|
||||
FUNCINLINE static ATTRINLINE void HWR_DrawScreenFinalTexture(INT32 width, INT32 height, boolean useshader)
|
||||
{
|
||||
GL_DrawScreenFinalTexture(HWD_SCREENTEXTURE_GENERIC2, width, height);
|
||||
GL_DrawScreenFinalTexture(HWD_SCREENTEXTURE_GENERIC2, width, height, useshader);
|
||||
}
|
||||
|
||||
// hw_main.c: Segs
|
||||
@@ -200,7 +195,7 @@ extern consvar_t cv_gllightdither;
|
||||
extern consvar_t cv_glfiltermode;
|
||||
extern consvar_t cv_glanisotropicmode;
|
||||
|
||||
extern consvar_t cv_glsolvetjoin;
|
||||
extern consvar_t cv_glsolvetjoin, cv_glpolytile, cv_glpolyshape;
|
||||
|
||||
extern consvar_t cv_glbatching;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -365,17 +365,13 @@ static void HWR_CompileShader(int index)
|
||||
if (vertex_source)
|
||||
{
|
||||
char *preprocessed = HWR_PreprocessShader(vertex_source);
|
||||
if (!preprocessed)
|
||||
return;
|
||||
|
||||
if (!preprocessed) return;
|
||||
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_VERTEX);
|
||||
}
|
||||
if (fragment_source)
|
||||
{
|
||||
char *preprocessed = HWR_PreprocessShader(fragment_source);
|
||||
if (!preprocessed)
|
||||
return;
|
||||
|
||||
if (!preprocessed) return;
|
||||
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_FRAGMENT);
|
||||
}
|
||||
|
||||
@@ -391,10 +387,8 @@ void HWR_CompileShaders(void)
|
||||
{
|
||||
int custom_index = gl_shadertargets[i].custom_shader;
|
||||
HWR_CompileShader(i);
|
||||
|
||||
if (!gl_shaders[i].compiled)
|
||||
CONS_Alert(CONS_ERROR, "HWR_CompileShaders: Compilation failed for base %s shader!\n", shaderxlat[i].type);
|
||||
|
||||
if (custom_index != -1)
|
||||
{
|
||||
HWR_CompileShader(custom_index);
|
||||
|
||||
@@ -78,23 +78,33 @@
|
||||
// Include GLSL_FLOOR_FUDGES or GLSL_WALL_FUDGES or define the fudges in shaders that use this macro.
|
||||
#define GLSL_DOOM_COLORMAP_DITHER \
|
||||
"float baseValue = max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \
|
||||
"float patscale = min(scr_resolution.x / 1280.0, scr_resolution.y / 720.0);\n" \
|
||||
"patscale = max(floor(patscale + 0.5), 1.0);\n" \
|
||||
"patscale = 1.0 / patscale;\n" \
|
||||
"ivec2 p = ivec2(mod(floor(position * patscale), 4.0));\n" \
|
||||
"float depthfactor = clamp((z - 192.0) / (6144.0 - 192.0), 0.0, 1.0);\n" \
|
||||
"float endResolutionx = scr_resolution.x;\n" \
|
||||
"float endResolutiony = scr_resolution.y;\n" \
|
||||
"if (scr_resolution.x > 1280.0) {\n" \
|
||||
"endResolutionx = scr_resolution.x * 0.5;\n" \
|
||||
"}\n" \
|
||||
"if (scr_resolution.y > 720.0) {\n" \
|
||||
"endResolutiony = scr_resolution.y * 0.5;\n" \
|
||||
"}\n" \
|
||||
"float zFactor = clamp((z - 192.0) / (6144.0 - 192.0), 0.0, 1.0);\n" \
|
||||
"int scaleFactor = int(mix(1.0, 8.0, zFactor));\n" \
|
||||
"endResolutionx = endResolutionx * scaleFactor;\n" \
|
||||
"endResolutiony = endResolutiony * scaleFactor;\n" \
|
||||
"vec2 normalizedPosition = position * vec2(endResolutionx / scr_resolution.x, endResolutiony / scr_resolution.y);\n" \
|
||||
"int x = int(mod(normalizedPosition.x, 4.0));\n" \
|
||||
"int y = int(mod(normalizedPosition.y, 4.0));\n" \
|
||||
"float bayerMatrix[4*4] = float[4*4](\n" \
|
||||
"0.0, 8.0, 2.0, 10.0,\n" \
|
||||
"12.0, 4.0, 14.0, 6.0,\n" \
|
||||
"3.0, 11.0, 1.0, 9.0,\n" \
|
||||
"15.0, 7.0, 13.0, 5.0\n" \
|
||||
");\n" \
|
||||
"float threshold = 16.0;\n" \
|
||||
"#ifdef SRB2_PALETTE_RENDERING\n" \
|
||||
"threshold = 11.0;\n" \
|
||||
"float threshold = (1.0 - pow(zFactor, 2.0)) * (bayerMatrix[y*4 + x] / 11.0);\n" \
|
||||
"#else\n" \
|
||||
"float threshold = (1.0 - pow(zFactor, 2.0)) * (bayerMatrix[y*4 + x] / 16.0);\n" \
|
||||
"#endif\n" \
|
||||
"threshold = (1.0 - pow(depthfactor, 2.0)) * (bayerMatrix[p.y*4 + p.x] / threshold);\n" \
|
||||
"return mix(baseValue + threshold - 0.5 / 16.0, baseValue, depthfactor);\n"
|
||||
"return mix(baseValue + threshold - 0.5 / 16.0, baseValue, zFactor);\n"
|
||||
|
||||
#define GLSL_DOOM_COLORMAP_NODITHER \
|
||||
"return max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \
|
||||
|
||||
@@ -1068,13 +1068,6 @@ void GL_SetShader(int slot)
|
||||
gl_shadersenabled = false;
|
||||
}
|
||||
|
||||
void GL_EnableShader(void)
|
||||
{
|
||||
// we can just use GL_Shader_SetUniforms as itll enable the shader for us
|
||||
// and handle any failures
|
||||
GL_Shader_SetUniforms(NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
void GL_UnSetShader(void)
|
||||
{
|
||||
if (gl_shadersenabled) // don't repeatedly call glUseProgram if not needed
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
|
||||
+171
-14
@@ -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
|
||||
//======================================================================
|
||||
@@ -388,8 +543,6 @@ void HU_AddChatText(const char *text, boolean playsound)
|
||||
HU_removeChatText_Log();
|
||||
|
||||
chat_log[chat_nummsg_log] = malloc(HU_MSGBUFSIZE);
|
||||
if (!chat_log[chat_nummsg_log])
|
||||
I_Error("HU_AddChatText: out of memory for chat log\n");
|
||||
strcpy(chat_log[chat_nummsg_log], text);
|
||||
++chat_nummsg_log;
|
||||
|
||||
@@ -472,10 +625,7 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
||||
// with that logic, characters 4 and 5 are our numbers:
|
||||
const char *newmsg;
|
||||
INT32 spc = 1; // used if nodenum[1] is a space.
|
||||
CLEANUP(pfree) char *nodenum = (char*)malloc(3);
|
||||
if (!nodenum)
|
||||
I_Error("DoSayCommand: out of memory for sending pm\n");
|
||||
|
||||
CLEANUP(pfree) char *nodenum = (char*) malloc(3);
|
||||
memcpy(nodenum, msg+3, 2);
|
||||
nodenum[2] = '\0';
|
||||
|
||||
@@ -979,8 +1129,7 @@ void HU_Ticker(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (cechotimer > 0)
|
||||
--cechotimer;
|
||||
if (cechotimer > 0) --cechotimer;
|
||||
|
||||
// Animate the desynch dots
|
||||
if (hu_resynching
|
||||
@@ -1081,9 +1230,7 @@ static void HU_SendChatMessage(void)
|
||||
{
|
||||
INT32 spc = 1; // used if nodenum[1] is a space.
|
||||
const char *newmsg;
|
||||
CLEANUP(pfree) char *nodenum = (char*)malloc(3);
|
||||
if (!nodenum)
|
||||
I_Error("HU_SendChatMessage: out of memory for sending pm\n");
|
||||
CLEANUP(pfree) char *nodenum = (char*) malloc(3);
|
||||
|
||||
// what we're gonna do now is check if the node exists
|
||||
// with that logic, characters 4 and 5 are our numbers:
|
||||
@@ -1427,6 +1574,7 @@ static void HU_drawMiniChat(void)
|
||||
|
||||
y = chaty - charheight*(msglines+1);
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
y -= BASEVIDHEIGHT/2;
|
||||
@@ -1434,6 +1582,7 @@ static void HU_drawMiniChat(void)
|
||||
y += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
y -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
dx = 0;
|
||||
@@ -1531,15 +1680,18 @@ static void HU_drawChatLog(INT32 offset)
|
||||
if (chat_scroll > chat_maxscroll)
|
||||
chat_scroll = chat_maxscroll;
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
boxh = max(6, boxh/2);
|
||||
if (splitscreen > 1)
|
||||
boxw = max(64, boxw/2);
|
||||
}
|
||||
#endif
|
||||
|
||||
y = chaty - offset*charheight - (chat_scroll*charheight) - boxh*charheight - 12;
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
y -= BASEVIDHEIGHT/2;
|
||||
@@ -1547,6 +1699,7 @@ static void HU_drawChatLog(INT32 offset)
|
||||
y += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
y -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
|
||||
@@ -1661,6 +1814,7 @@ static void HU_DrawChat(void)
|
||||
const char *talk = ntalk;
|
||||
const char *mute = "Chat has been muted.";
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
y -= BASEVIDHEIGHT/2;
|
||||
@@ -1671,6 +1825,7 @@ static void HU_DrawChat(void)
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
y -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
if (teamtalk)
|
||||
@@ -1771,7 +1926,7 @@ static void HU_DrawChat(void)
|
||||
INT32 count = 0;
|
||||
INT32 p_dispy = chaty - charheight - 1;
|
||||
size_t longest_name_length = 0;
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
p_dispy -= BASEVIDHEIGHT/2;
|
||||
@@ -1779,13 +1934,13 @@ static void HU_DrawChat(void)
|
||||
p_dispy += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
p_dispy -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
// Find longest player name, for drawing background for /pm list later
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (!playeringame[i])
|
||||
continue;
|
||||
if (!playeringame[i]) continue;
|
||||
|
||||
longest_name_length = max(longest_name_length, strlen(player_names[i]));
|
||||
}
|
||||
@@ -1888,6 +2043,7 @@ static void HU_DrawChat(void)
|
||||
|
||||
skip = 0;
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
suggesty -= BASEVIDHEIGHT/2;
|
||||
@@ -1895,6 +2051,7 @@ static void HU_DrawChat(void)
|
||||
suggesty += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
suggesty -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
||||
|
||||
@@ -42,6 +42,15 @@
|
||||
#define CRED_FONTEND 'Z' // the last font character
|
||||
#define CRED_FONTSIZE (CRED_FONTEND - CRED_FONTSTART + 1)
|
||||
|
||||
extern char *shiftxform; // english translation shift table
|
||||
extern char english_shiftxform[];
|
||||
|
||||
extern char french_shiftxform[];
|
||||
extern char french_altgrxform[];
|
||||
|
||||
//fallback for special letter non displayable in the game (i.e.: 'é','à',etc.)
|
||||
INT32 HU_FallBackFrSpecialLetter(INT32 key);
|
||||
|
||||
//------------------------------------
|
||||
// sorted player lines
|
||||
//------------------------------------
|
||||
@@ -59,7 +68,12 @@ typedef struct
|
||||
#define HU_MAXMSGLEN 223
|
||||
#define HU_MSGBUFSIZE 255
|
||||
#define MAX_CHAT_BUFSIZE 256 // that's enough messages, right? We'll delete the older ones when that gets out of hand.
|
||||
#define NETSPLITSCREEN // why the hell WOULDN'T we want this?
|
||||
#ifdef NETSPLITSCREEN
|
||||
#define OLDCHAT (cv_consolechat.value == 1 || dedicated || vid.width < 640)
|
||||
#else
|
||||
#define OLDCHAT (cv_consolechat.value == 1 || dedicated || vid.width < 640)
|
||||
#endif
|
||||
#define CHAT_MUTE (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer))) // this still allows to open the chat but not to type. That's used for scrolling and whatnot.
|
||||
#define OLD_MUTE (OLDCHAT && cv_mute.value && !(server || IsPlayerAdmin(consoleplayer))) // this is used to prevent oldchat from opening when muted.
|
||||
|
||||
@@ -96,6 +110,8 @@ void HU_LoadGraphics(void);
|
||||
// reset heads up when consoleplayer respawns.
|
||||
void HU_Start(void);
|
||||
|
||||
void HU_Shiftform(void);
|
||||
|
||||
boolean HU_Responder(event_t *ev);
|
||||
void HU_Ticker(void);
|
||||
void HU_TickSongCredits(void);
|
||||
@@ -104,6 +120,8 @@ void HU_Drawer(void);
|
||||
char HU_dequeueChatChar(void);
|
||||
void HU_clearChatChars(void);
|
||||
void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags); // Lat': Ping drawer for scoreboard.
|
||||
//void HU_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);
|
||||
|
||||
@@ -44,6 +44,9 @@ extern "C" {
|
||||
|
||||
struct JoyType_s
|
||||
{
|
||||
/*! if true, we MUST Poll() to get new joystick data,
|
||||
that is: we NEED the DIRECTINPUTDEVICE2 ! (watchout NT compatibility) */
|
||||
INT32 bJoyNeedPoll;
|
||||
/*! this joystick is a gamepad, read: digital axes
|
||||
if FALSE, interpret the joystick event data as JOYAXISRANGE (see above) */
|
||||
INT32 bGamepadStyle;
|
||||
|
||||
@@ -148,11 +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);
|
||||
|
||||
void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration);
|
||||
void I_SetGamepadIndicatorColor(INT32 playernum, UINT8 red, UINT8 green, UINT8 blue);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -446,12 +446,6 @@ void K_UpdateDirector(void)
|
||||
}
|
||||
}
|
||||
|
||||
// not sure if we should just stop here?
|
||||
if (targetposition == MAXPLAYERS)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
target = directorinfo.sortedplayers[targetposition];
|
||||
|
||||
// stop here since we're already viewing this player
|
||||
|
||||
+128
-95
@@ -83,7 +83,6 @@ IMPL_HUD_OFFSET(stat); // Stats
|
||||
|
||||
// extra hud things
|
||||
consvar_t cv_showstats = {"showstats", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_showstats_skinname = {"showstats_skinname", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_highresportrait = {"highresportrait", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // make char potraits use their high-res version instead
|
||||
|
||||
@@ -93,7 +92,6 @@ consvar_t cv_showinput = {"showinput", "Off", CV_SAVE, inputdisplay_cons_t, NULL
|
||||
static CV_PossibleValue_t minihead_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "Others"}, {0, NULL}};
|
||||
consvar_t cv_minihead = {"smallminimapplayers", "Off", CV_SAVE, minihead_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_showminimapnames = {"showminimapnames", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_showminimapfinished = {"showminimapfinished", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
CV_PossibleValue_t minimapdot_cons_t[NUMMINIMAPDOTSTUFF];
|
||||
consvar_t cv_showminimapangle = {"showminimapangle", "Off", CV_SAVE, minimapdot_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
@@ -209,7 +207,6 @@ void K_RegisterKartHudStuff(void)
|
||||
CV_RegisterVar(&cv_kartspeedometer);
|
||||
|
||||
CV_RegisterVar(&cv_showstats);
|
||||
CV_RegisterVar(&cv_showstats_skinname);
|
||||
CV_RegisterVar(&cv_showinput);
|
||||
|
||||
CV_RegisterVar(&cv_posanim);
|
||||
@@ -224,7 +221,6 @@ void K_RegisterKartHudStuff(void)
|
||||
|
||||
CV_RegisterVar(&cv_minihead);
|
||||
CV_RegisterVar(&cv_showminimapnames);
|
||||
CV_RegisterVar(&cv_showminimapfinished);
|
||||
CV_RegisterVar(&cv_showminimapangle);
|
||||
|
||||
CV_RegisterVar(&cv_showlapemblem);
|
||||
@@ -274,6 +270,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 +308,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 +474,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 +533,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 +875,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 +1145,7 @@ enum
|
||||
SPEEDO_DIAL,
|
||||
SPEEDO_PMETER,
|
||||
SPEEDO_PMETERSMOL,
|
||||
SPEEDO_EXTRA3,
|
||||
};
|
||||
|
||||
static SINT8 K_GetSpeedometerStyle(void)
|
||||
@@ -1148,6 +1160,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 +1179,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 +1192,7 @@ enum
|
||||
GAUGE_SMALL,
|
||||
GAUGE_BIGNUM,
|
||||
GAUGE_NUMONLY,
|
||||
GAUGE_EXTRA,
|
||||
};
|
||||
|
||||
static SINT8 K_GetDriftgaugeStyle(void)
|
||||
@@ -1188,6 +1205,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 +1358,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 +1403,7 @@ static void K_drawKartStats(void)
|
||||
{
|
||||
case SPEEDO_EXTRA:
|
||||
case SPEEDO_ACHII:
|
||||
case SPEEDO_EXTRA3:
|
||||
spdoffset = -10;
|
||||
break;
|
||||
case SPEEDO_DIAL:
|
||||
@@ -1416,16 +1434,13 @@ static void K_drawKartStats(void)
|
||||
fakeskin = K_GetPlayerSkin(stplyr);
|
||||
|
||||
// Skin name
|
||||
if (cv_showstats_skinname.value)
|
||||
if (K_IsHighResolution()) // V_DrawSmallString becomes a mess at low resolutions lel
|
||||
{
|
||||
if (K_IsHighResolution()) // V_DrawSmallString becomes a mess at low resolutions lel
|
||||
{
|
||||
V_DrawSmallString(x+20, y+12, flags2, fakeskin->realname);
|
||||
}
|
||||
else
|
||||
{
|
||||
V_DrawThinString(x+20, y+7, flags2, fakeskin->realname);
|
||||
}
|
||||
V_DrawSmallString(x+20, y+12, flags2, fakeskin->realname);
|
||||
}
|
||||
else
|
||||
{
|
||||
V_DrawThinString(x+20, y+7, flags2, fakeskin->realname);
|
||||
}
|
||||
|
||||
// Icon and stats
|
||||
@@ -2079,7 +2094,7 @@ static void K_DrawKartPositionNum(INT32 num)
|
||||
fy = POSI_Y;
|
||||
fflags = V_SNAPTOLEFT|((stplyrnum == 2) ? V_SPLITSCREEN|V_SNAPTOBOTTOM : 0); // flip P3 to the bottom.
|
||||
flipdraw = true;
|
||||
if (num >= 10)
|
||||
if (num && num >= 10)
|
||||
fx += W; // this seems dumb, but we need to do this in order for positions above 10 going off screen.
|
||||
}
|
||||
else // else, that means we're P2 or P4.
|
||||
@@ -2161,9 +2176,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 +2192,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 +2250,6 @@ static boolean K_drawKartPositionFaces(void)
|
||||
|
||||
if (!playeringame[rankplayer[i]])
|
||||
continue;
|
||||
|
||||
if (player->spectator || !player->mo)
|
||||
continue;
|
||||
|
||||
@@ -2413,7 +2427,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 +2636,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 +2705,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 +2745,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 +2812,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 +2904,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 +2989,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 +3049,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 +3260,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 +3291,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 +3309,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 +3630,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);
|
||||
@@ -3729,9 +3772,6 @@ static void K_drawKartMinimap(void)
|
||||
if (!players[i].mo || players[i].spectator)
|
||||
continue;
|
||||
|
||||
if (!cv_showminimapfinished.value && players[i].exiting)
|
||||
continue;
|
||||
|
||||
if (P_IsDisplayPlayer(&players[i]))
|
||||
{
|
||||
// Draw display players on top of everything else
|
||||
@@ -3972,7 +4012,6 @@ static void K_drawBattleFullscreen(void)
|
||||
{
|
||||
if (stplyrnum == 0)
|
||||
V_DrawFadeScreen(0xFF00, 16);
|
||||
|
||||
if (stplyr->exiting < 6*TICRATE && !stplyr->spectator)
|
||||
{
|
||||
if (stplyr->kartstuff[k_position] == 1)
|
||||
@@ -4037,7 +4076,7 @@ static void K_drawBattleFullscreen(void)
|
||||
{
|
||||
if (i == displayplayers[0])
|
||||
continue;
|
||||
if (playeringame[i])
|
||||
if (playeringame[i] && !stplyr->spectator)
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4288,7 +4327,7 @@ static void K_drawInput(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
const boolean analogjoystickmove = cv_usejoystick[stplyrnum].value && !Joystick[stplyrnum].bGamepadStyle;
|
||||
const boolean analogjoystickmove = cv_usejoystick[stplyrnum].value && !Joystick[stplyrnum].bGamepadStyle;
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[stplyrnum].value && Joystick[stplyrnum].bGamepadStyle;
|
||||
const UINT8 ssplayer = stplyrnum+1;
|
||||
|
||||
@@ -4305,10 +4344,9 @@ static void K_drawInput(void)
|
||||
{
|
||||
hudforward += KART_FULLTURN;
|
||||
}
|
||||
|
||||
if (InputDown(gc_aimbackward, ssplayer) || (gamepadjoystickmove && axis > 0))
|
||||
{
|
||||
hudforward -= KART_FULLTURN;
|
||||
hudforward-= KART_FULLTURN;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4394,7 +4432,6 @@ static void K_drawChallengerScreen(void)
|
||||
19,20,19,20,19,20,19,20,19,20, // frame 20-21, 1 tic, 5 alternating: all text vibrates from impact
|
||||
21,22,23,24 // frame 22-25, 1 tic: CHALLENGER turns gold
|
||||
};
|
||||
|
||||
const UINT8 offset = min(52-1, (3*TICRATE)-mapreset);
|
||||
|
||||
V_DrawFadeScreen(0xFF00, 16); // Fade out
|
||||
@@ -4448,7 +4485,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));
|
||||
@@ -4496,7 +4533,6 @@ static void K_drawDistributionDebugger(void)
|
||||
kp_orbinaut[4],
|
||||
kp_jawz[1]
|
||||
};
|
||||
|
||||
INT32 useodds = 0;
|
||||
INT32 pingame = 0, bestbumper = 0;
|
||||
INT32 i;
|
||||
@@ -4513,10 +4549,8 @@ static void K_drawDistributionDebugger(void)
|
||||
if (!playeringame[i] || players[i].spectator)
|
||||
continue;
|
||||
pingame++;
|
||||
|
||||
if (players[i].exiting)
|
||||
dontforcespb = true;
|
||||
|
||||
if (players[i].kartstuff[k_bumper] > bestbumper)
|
||||
bestbumper = players[i].kartstuff[k_bumper];
|
||||
}
|
||||
@@ -4670,7 +4704,6 @@ void K_drawKartHUD(void)
|
||||
{
|
||||
if (LUA_HudEnabled(hud_battlefullscreen))
|
||||
K_drawBattleFullscreen();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,6 @@ extern consvar_t cv_darkitembox;
|
||||
extern consvar_t cv_biglaps;
|
||||
extern consvar_t cv_highresportrait;
|
||||
extern consvar_t cv_showstats;
|
||||
extern consvar_t cv_showstats_skinname;
|
||||
extern consvar_t cv_fancyroulette;
|
||||
extern consvar_t cv_showlaptimes;
|
||||
extern consvar_t cv_battlespeedo;
|
||||
|
||||
+50
-65
@@ -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 = §ors[rover->secnum]; // makes things easier for us
|
||||
s2 = §ors[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.
|
||||
@@ -1974,9 +1955,11 @@ static void K_PlayGenericCombatSound(mobj_t *source, mobj_t *other, sfxenum_t sf
|
||||
if (!skin)
|
||||
return;
|
||||
|
||||
boolean alwaysHear = false;
|
||||
|
||||
if (cv_kartvoices.value && !P_MobjWasRemoved(other) && other->player != NULL)
|
||||
{
|
||||
boolean alwaysHear = P_IsDisplayPlayer(other->player);
|
||||
alwaysHear = P_IsDisplayPlayer(other->player);
|
||||
S_StartSound(alwaysHear ? NULL : source, skin->soundsid[S_sfx[sfx_id].skinsound]);
|
||||
}
|
||||
|
||||
@@ -2336,13 +2319,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;
|
||||
@@ -2392,7 +2372,6 @@ void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount)
|
||||
break;
|
||||
case 3:
|
||||
st = S_BATTLEPOINT3A;
|
||||
break;
|
||||
default:
|
||||
return; // NO STATE!
|
||||
}
|
||||
@@ -3178,6 +3157,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 +3421,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 +3529,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 +3611,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 +3645,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)
|
||||
@@ -3694,9 +3677,11 @@ mobj_t *K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
|
||||
dust->momx = mo->momx/2;
|
||||
dust->momy = mo->momy/2;
|
||||
dust->momz = mo->momz/2;
|
||||
dust->flags2 |= MF2_SHADOW;
|
||||
}
|
||||
|
||||
if (translucent)
|
||||
dust->flags2 |= MF2_SHADOW;
|
||||
|
||||
return dust;
|
||||
}
|
||||
|
||||
@@ -3711,7 +3696,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 +4079,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 +4090,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 +4182,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));
|
||||
}
|
||||
@@ -4672,7 +4657,8 @@ void K_RepairOrbitChain(mobj_t *orbit)
|
||||
prev->movedir = num;
|
||||
}
|
||||
|
||||
player->kartstuff[k_itemamount] = num;
|
||||
if (player->kartstuff[k_itemamount] != num)
|
||||
player->kartstuff[k_itemamount] = num;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6218,8 +6204,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++;
|
||||
|
||||
+13
-42
@@ -358,8 +358,7 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
#define TYPEERROR(f, t) FIELDERROR(f, va("%s expected, got %s", lua_typename(L, t), luaL_typename(L, -1)))
|
||||
|
||||
lua_pushnil(L);
|
||||
while (lua_next(L, 1))
|
||||
{
|
||||
while (lua_next(L, 1)) {
|
||||
// stack: cvar table, cvar userdata, key/index, value
|
||||
// 1 2 3 4
|
||||
i = 0;
|
||||
@@ -369,40 +368,26 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
else if (lua_isstring(L, 3))
|
||||
k = lua_tostring(L, 3);
|
||||
|
||||
if (i == 1 || (k && fasticmp(k, "name")))
|
||||
{
|
||||
if (i == 1 || (k && fasticmp(k, "name"))) {
|
||||
if (!lua_isstring(L, 4))
|
||||
TYPEERROR("name", LUA_TSTRING)
|
||||
|
||||
cvar->name = Z_StrDup(lua_tostring(L, 4));
|
||||
}
|
||||
else if (i == 2 || (k && fasticmp(k, "defaultvalue")))
|
||||
{
|
||||
} else if (i == 2 || (k && fasticmp(k, "defaultvalue"))) {
|
||||
if (!lua_isstring(L, 4))
|
||||
TYPEERROR("defaultvalue", LUA_TSTRING)
|
||||
|
||||
cvar->defaultvalue = Z_StrDup(lua_tostring(L, 4));
|
||||
}
|
||||
else if (i == 3 || (k && fasticmp(k, "flags")))
|
||||
{
|
||||
} else if (i == 3 || (k && fasticmp(k, "flags"))) {
|
||||
if (!lua_isnumber(L, 4))
|
||||
TYPEERROR("flags", LUA_TNUMBER)
|
||||
|
||||
cvar->flags = (INT32)lua_tointeger(L, 4);
|
||||
}
|
||||
else if (i == 4 || (k && fasticmp(k, "PossibleValue")))
|
||||
{
|
||||
if (lua_islightuserdata(L, 4))
|
||||
{
|
||||
} else if (i == 4 || (k && fasticmp(k, "PossibleValue"))) {
|
||||
if (lua_islightuserdata(L, 4)) {
|
||||
CV_PossibleValue_t *pv = lua_touserdata(L, 4);
|
||||
|
||||
if (pv == CV_OnOff || pv == CV_YesNo || pv == CV_Unsigned || pv == CV_Natural)
|
||||
cvar->PossibleValue = pv;
|
||||
else
|
||||
FIELDERROR("PossibleValue", "CV_PossibleValue_t expected, got unrecognised pointer")
|
||||
}
|
||||
else if (lua_istable(L, 4))
|
||||
{
|
||||
} else if (lua_istable(L, 4)) {
|
||||
// Accepts tables in the form of {MIN=0, MAX=9999} or {Red=0, Green=1, Blue=2}
|
||||
// and converts them to CV_PossibleValue_t {{0,"MIN"},{9999,"MAX"}} or {{0,"Red"},{1,"Green"},{2,"Blue"}}
|
||||
//
|
||||
@@ -413,9 +398,7 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
CV_PossibleValue_t *cvpv;
|
||||
|
||||
lua_pushnil(L);
|
||||
|
||||
while (lua_next(L, 4))
|
||||
{
|
||||
while (lua_next(L, 4)) {
|
||||
count++;
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
@@ -429,9 +412,7 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
|
||||
i = 0;
|
||||
lua_pushnil(L);
|
||||
|
||||
while (lua_next(L, 4))
|
||||
{
|
||||
while (lua_next(L, 4)) {
|
||||
// stack: [...] PossibleValue table, index, value
|
||||
// 4 5 6
|
||||
if (lua_type(L, 5) != LUA_TSTRING
|
||||
@@ -442,19 +423,14 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
i++;
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
cvpv[i].value = 0;
|
||||
cvpv[i].strvalue = NULL;
|
||||
cvar->PossibleValue = cvpv;
|
||||
}
|
||||
else
|
||||
} else
|
||||
FIELDERROR("PossibleValue", va("%s or CV_PossibleValue_t expected, got %s", lua_typename(L, LUA_TTABLE), luaL_typename(L, -1)))
|
||||
}
|
||||
else if (i == 5 || (k && fasticmp(k, "func")))
|
||||
{
|
||||
} else if (i == 5 || (k && fasticmp(k, "func"))) {
|
||||
if (!lua_isfunction(L, 4))
|
||||
TYPEERROR("func", LUA_TFUNCTION)
|
||||
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, "CV_OnChange");
|
||||
I_Assert(lua_istable(L, 5));
|
||||
lua_pushlightuserdata(L, cvar);
|
||||
@@ -462,13 +438,9 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
lua_rawset(L, 5);
|
||||
lua_pop(L, 1);
|
||||
cvar->func = Lua_OnChange;
|
||||
|
||||
if (i == 5 && !(cvar->flags & CV_CALL))
|
||||
{
|
||||
category = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
|
||||
}
|
||||
}
|
||||
else if ((cvar->flags & CV_CALL && i == 6)
|
||||
else if (((i == 5 && !(cvar->flags & CV_CALL))
|
||||
|| (cvar->flags & CV_CALL && i == 6))
|
||||
|| (k && fasticmp(k, "category")))
|
||||
{
|
||||
category = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
|
||||
@@ -479,7 +451,6 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
{
|
||||
menu_name = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
|
||||
}
|
||||
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
#undef FIELDERROR
|
||||
|
||||
+11
-11
@@ -293,17 +293,17 @@ typedef struct Hook_State Hook_State;
|
||||
typedef void (*Hook_Callback)(Hook_State *);
|
||||
|
||||
struct Hook_State {
|
||||
INT32 status; /* return status to calling function */
|
||||
void * userdata;
|
||||
int hook_type;
|
||||
mobjtype_t mobj_type; /* < NUMMOBJTYPES if mobj hook */
|
||||
const char * string; /* used to fetch table, ran first if set */
|
||||
int top; /* index of last argument passed to hook */
|
||||
int id; /* id to fetch ref */
|
||||
bool important; /* is this hook from local addon */
|
||||
int values; /* num arguments passed to hook */
|
||||
int results; /* num values returned by hook */
|
||||
Hook_Callback results_handler; /* callback when hook successfully returns */
|
||||
INT32 status;/* return status to calling function */
|
||||
void * userdata;
|
||||
int hook_type;
|
||||
mobjtype_t mobj_type;/* <NUMMOBJTYPES if mobj hook */
|
||||
const char * string;/* used to fetch table, ran first if set */
|
||||
int top;/* index of last argument passed to hook */
|
||||
int id;/* id to fetch ref */
|
||||
boolean important;/* is this hook from local addon */
|
||||
int values;/* num arguments passed to hook */
|
||||
int results;/* num values returned by hook */
|
||||
Hook_Callback results_handler;/* callback when hook successfully returns */
|
||||
};
|
||||
|
||||
enum {
|
||||
|
||||
+1
-1
@@ -1297,7 +1297,7 @@ static int lib_hudsetvotebackground(lua_State *L)
|
||||
|
||||
if (strlen(prefix) != 4)
|
||||
{
|
||||
return luaL_argerror(L, 1, "prefix should be 4 characters wide");
|
||||
return luaL_argerror(L, 1, "prefix should 4 characters wide");
|
||||
}
|
||||
|
||||
strncpy(VoteScreen.luaPrefix, prefix, 4);
|
||||
|
||||
+29
-28
@@ -650,34 +650,34 @@ void LUA_HUD_DrawList(huddrawlist_h list)
|
||||
case DI_DrawString:
|
||||
switch(item->align)
|
||||
{
|
||||
// hu_font
|
||||
case align_left:
|
||||
V_DrawString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_center:
|
||||
V_DrawCenteredString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_right:
|
||||
V_DrawRightAlignedString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_fixed:
|
||||
V_DrawStringAtFixed(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
// hu_font, 0.5x scale
|
||||
case align_small:
|
||||
V_DrawSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_smallright:
|
||||
V_DrawRightAlignedSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
// tny_font
|
||||
case align_thin:
|
||||
V_DrawThinString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_thinright:
|
||||
V_DrawRightAlignedThinString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
}
|
||||
// hu_font
|
||||
case align_left:
|
||||
V_DrawString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_center:
|
||||
V_DrawCenteredString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_right:
|
||||
V_DrawRightAlignedString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_fixed:
|
||||
V_DrawStringAtFixed(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
// hu_font, 0.5x scale
|
||||
case align_small:
|
||||
V_DrawSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_smallright:
|
||||
V_DrawRightAlignedSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
// tny_font
|
||||
case align_thin:
|
||||
V_DrawThinString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_thinright:
|
||||
V_DrawRightAlignedThinString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DI_DrawKartString:
|
||||
V_DrawKartString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
@@ -690,6 +690,7 @@ void LUA_HUD_DrawList(huddrawlist_h list)
|
||||
break;
|
||||
default:
|
||||
I_Error("can't draw draw list item: invalid draw list item type");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-8
@@ -1658,22 +1658,17 @@ static int mapheaderinfo_get(lua_State *L)
|
||||
{
|
||||
// Read custom vars now
|
||||
// (note: don't include the "LUA." in your lua scripts!)
|
||||
if (!header->numCustomOptions) {
|
||||
lua_pushnil(L);
|
||||
break;
|
||||
}
|
||||
|
||||
UINT8 j = 0;
|
||||
const char *cusoptstr = lua_tostring(L, 2);
|
||||
for (;j < header->numCustomOptions && !fastcmp(cusoptstr, header->customopts[j].option); ++j);
|
||||
for (;j < header->numCustomOptions && !fastcmp(lua_tostring(L, 2), header->customopts[j].option); ++j);
|
||||
|
||||
if (j < header->numCustomOptions)
|
||||
if(j < header->numCustomOptions)
|
||||
lua_pushstring(L, header->customopts[j].value);
|
||||
else
|
||||
lua_pushnil(L);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
int LUA_MapLib(lua_State *L)
|
||||
|
||||
+8
-13
@@ -979,7 +979,7 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
|
||||
|
||||
if (!gL)
|
||||
{
|
||||
if (fastcmp(ptype, "player")) // players must always be included, even if no vars
|
||||
if (fastcmp(ptype,"player")) // players must always be included, even if no vars
|
||||
WRITEUINT16(*p, 0);
|
||||
return;
|
||||
}
|
||||
@@ -995,7 +995,7 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
|
||||
if (!lua_istable(gL, -1))
|
||||
{ // no extra values table
|
||||
lua_pop(gL, 1);
|
||||
if (fastcmp(ptype, "player")) // players must always be included, even if no vars
|
||||
if (fastcmp(ptype,"player")) // players must always be included, even if no vars
|
||||
WRITEUINT16(*p, 0);
|
||||
return;
|
||||
}
|
||||
@@ -1007,13 +1007,13 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
|
||||
// skip anything that has an empty table and isn't a player.
|
||||
if (i == 0)
|
||||
{
|
||||
if (fastcmp(ptype, "player")) // always include players even if they have no extra variables
|
||||
if (fastcmp(ptype,"player")) // always include players even if they have no extra variables
|
||||
WRITEUINT16(*p, 0);
|
||||
lua_pop(gL, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (fastcmp(ptype, "mobj")) // mobjs must write their mobjnum as a header
|
||||
if (fastcmp(ptype,"mobj")) // mobjs must write their mobjnum as a header
|
||||
WRITEUINT32(*p, ((mobj_t *)pointer)->mobjnum);
|
||||
|
||||
WRITEUINT16(*p, i);
|
||||
@@ -1065,9 +1065,8 @@ static void ArchiveTables(UINT8 **p)
|
||||
n++; // the table contained a new table we'll have to archive. :(
|
||||
else if (e == 2) // invalid key type (function, thread, lightuserdata, or anything we don't recognise)
|
||||
{
|
||||
lua_pushvalue(gL, -2); // copy key for error message (lua_tostring may mutate it which confuses lua_next)
|
||||
CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -1), luaL_typename(gL, -1), i);
|
||||
lua_pop(gL, 2); // pop key copy and value
|
||||
CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -2), luaL_typename(gL, -2), i);
|
||||
lua_pop(gL, 1);
|
||||
continue;
|
||||
}
|
||||
else if (e == 3) // nil key due to invalid userdata. NOT an error.
|
||||
@@ -1081,15 +1080,11 @@ static void ArchiveTables(UINT8 **p)
|
||||
if (e == 1)
|
||||
n++; // the table contained a new table we'll have to archive. :(
|
||||
else if (e == 2) // invalid value type
|
||||
{
|
||||
lua_pushvalue(gL, -2); // copy key for error message (same as above)
|
||||
CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -1), luaL_typename(gL, -2));
|
||||
lua_pop(gL, 1); // pop key copy
|
||||
}
|
||||
CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -2), luaL_typename(gL, -1));
|
||||
|
||||
lua_pop(gL, 1);
|
||||
}
|
||||
|
||||
}
|
||||
lua_pop(gL, 1);
|
||||
WRITEUINT8(*p, ARCH_TEND);
|
||||
}
|
||||
|
||||
@@ -249,6 +249,9 @@ boolean cht_Responder(event_t *ev)
|
||||
#define REQUIRE_SINGLEPLAYER if (netgame || multiplayer)\
|
||||
{ CONS_Printf(M_GetText("This only works in single player.\n")); return; }
|
||||
|
||||
#define REQUIRE_NOULTIMATE if (ultimatemode)\
|
||||
{ CONS_Printf(M_GetText("You're too good to be cheating!\n")); return; }
|
||||
|
||||
// command that can be typed at the console!
|
||||
void Command_CheatNoClip_f(void)
|
||||
{
|
||||
@@ -256,6 +259,7 @@ void Command_CheatNoClip_f(void)
|
||||
|
||||
REQUIRE_INLEVEL;
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
plyr = &players[consoleplayer];
|
||||
plyr->pflags ^= PF_NOCLIP;
|
||||
@@ -270,6 +274,7 @@ void Command_CheatGod_f(void)
|
||||
|
||||
REQUIRE_INLEVEL;
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
plyr = &players[consoleplayer];
|
||||
plyr->pflags ^= PF_GODMODE;
|
||||
@@ -284,6 +289,7 @@ void Command_CheatNoTarget_f(void)
|
||||
|
||||
REQUIRE_INLEVEL;
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
plyr = &players[consoleplayer];
|
||||
plyr->pflags ^= PF_INVIS;
|
||||
@@ -587,6 +593,7 @@ void Command_Devmode_f(void)
|
||||
#ifndef _DEBUG
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
#endif
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
if (COM_Argc() > 1)
|
||||
{
|
||||
@@ -1041,6 +1048,7 @@ void Command_ObjectPlace_f(void)
|
||||
{
|
||||
REQUIRE_INLEVEL;
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
G_SetGameModified(multiplayer, true);
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ void Command_ObjectPlace_f(void);
|
||||
void Command_Writethings_f(void);
|
||||
|
||||
extern consvar_t cv_opflags, cv_mapthingnum, cv_speed;
|
||||
//extern consvar_t cv_snapto, cv_grid;
|
||||
|
||||
extern boolean objectplacing;
|
||||
extern mobjtype_t op_currentthing;
|
||||
@@ -47,10 +48,18 @@ void Command_CheatNoClip_f(void);
|
||||
void Command_CheatGod_f(void);
|
||||
void Command_CheatNoTarget_f(void);
|
||||
void Command_Savecheckpoint_f(void);
|
||||
/*void Command_Getallemeralds_f(void);
|
||||
void Command_Resetemeralds_f(void);
|
||||
void Command_Setrings_f(void);
|
||||
void Command_Setlives_f(void);
|
||||
void Command_Setcontinues_f(void);*/
|
||||
void Command_Devmode_f(void);
|
||||
void Command_Scale_f(void);
|
||||
void Command_Gravflip_f(void);
|
||||
void Command_Hurtme_f(void);
|
||||
/*void Command_JumpToAxis_f(void);
|
||||
void Command_Charability_f(void);
|
||||
void Command_Charspeed_f(void);*/
|
||||
void Command_Teleport_f(void);
|
||||
void Command_RTeleport_f(void);
|
||||
void Command_Skynum_f(void);
|
||||
|
||||
@@ -62,9 +62,6 @@ FUNCMATH fixed_t FixedHypot(fixed_t x, fixed_t y)
|
||||
angle_t angle;
|
||||
fixed_t dist;
|
||||
|
||||
I_Assert(x != INT32_MIN);
|
||||
I_Assert(y != INT32_MIN);
|
||||
|
||||
x = abs(x);
|
||||
y = abs(y);
|
||||
|
||||
@@ -80,10 +77,6 @@ FUNCMATH fixed_t FixedHypot(fixed_t x, fixed_t y)
|
||||
if (!y)
|
||||
return x;
|
||||
|
||||
// prevent underflow
|
||||
if (y == INT32_MIN)
|
||||
return INT32_MAX;
|
||||
|
||||
angle = (tantoangle[FixedDiv(y, x)>>DBITS] + ANGLE_90) >> ANGLETOFINESHIFT;
|
||||
|
||||
// use as cosine
|
||||
|
||||
+150
-37
@@ -149,6 +149,9 @@ M_waiting_mode_t m_waiting_mode = M_NOT_WAITING;
|
||||
|
||||
const char *quitmsg[NUM_QUITMESSAGES] = {};
|
||||
|
||||
// Stuff for customizing the player select screen Tails 09-22-2003
|
||||
description_t description[MAXSKINS] = {};
|
||||
|
||||
INT32 mapwads[NUMMAPS] = {};
|
||||
|
||||
boolean browselocalskins = false;
|
||||
@@ -496,6 +499,32 @@ static consvar_t cv_dummystaff = {"dummystaff", "0", CV_HIDEN|CV_CALL, dummystaf
|
||||
// all the menu definitions and onchanges reside in here now
|
||||
#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 +1253,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 +1283,6 @@ boolean M_Responder(event_t *ev)
|
||||
void (*otherroutine)(event_t *sev) = currentMenu->menuitems[itemOn].itemaction;
|
||||
otherroutine(ev); //Alam: what a hack
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1968,6 +1996,8 @@ void M_Ticker(void)
|
||||
//
|
||||
void M_Init(void)
|
||||
{
|
||||
UINT8 i;
|
||||
|
||||
COM_AddCommand("manual", Command_Manual_f);
|
||||
|
||||
CV_RegisterVar(&cv_nextmap);
|
||||
@@ -2013,6 +2043,15 @@ void M_Init(void)
|
||||
quitmsg[QUIT3MSG5] = M_GetText("You'll be back to play soon, though...\n...right?\n\n(Press 'Y' to quit)");
|
||||
quitmsg[QUIT3MSG6] = M_GetText("Aww, is Eggman's Nightclub too\ndifficult for you?\n\n(Press 'Y' to quit)");
|
||||
|
||||
// Setup PlayerMenu table
|
||||
for (i = 0; i < MAXSKINS; i++)
|
||||
{
|
||||
PlayerMenu[i].status = (i == 0 ? IT_CALL : IT_DISABLED);
|
||||
PlayerMenu[i].patch = PlayerMenu[i].text = NULL;
|
||||
PlayerMenu[i].itemaction = M_ChoosePlayer;
|
||||
PlayerMenu[i].alphaKey = 0;
|
||||
}
|
||||
|
||||
#ifdef HWRENDER
|
||||
// Permanently hide some options based on render mode
|
||||
if (rendermode == render_soft)
|
||||
@@ -2067,6 +2106,55 @@ void M_Init(void)
|
||||
M_TextInputInit(&menuinput, menu_text_input_buf, sizeof menu_text_input_buf);
|
||||
}
|
||||
|
||||
void M_InitCharacterTables(void)
|
||||
{
|
||||
UINT8 i;
|
||||
|
||||
// Setup PlayerMenu table
|
||||
for (i = 0; i < MAXSKINS; i++)
|
||||
{
|
||||
PlayerMenu[i].status = (i < 4 ? IT_CALL : IT_DISABLED);
|
||||
PlayerMenu[i].patch = PlayerMenu[i].text = NULL;
|
||||
PlayerMenu[i].itemaction = M_ChoosePlayer;
|
||||
PlayerMenu[i].alphaKey = 0;
|
||||
}
|
||||
|
||||
// Setup description table
|
||||
for (i = 0; i < MAXSKINS; i++)
|
||||
{
|
||||
if (i == 0)
|
||||
{
|
||||
strcpy(description[i].notes, "\x82Sonic\x80 is the fastest of the three, but also the hardest to control. Beginners beware, but experts will find Sonic very powerful.\n\n\x82""Ability:\x80 Speed Thok\nDouble jump to zoom forward with a huge burst of speed.\n\n\x82Tip:\x80 Simply letting go of forward does not slow down in SRB2. To slow down, hold the opposite direction.");
|
||||
strcpy(description[i].picname, "");
|
||||
strcpy(description[i].skinname, "sonic");
|
||||
}
|
||||
else if (i == 1)
|
||||
{
|
||||
strcpy(description[i].notes, "\x82Tails\x80 is the most mobile of the three, but has the slowest speed. Because of his mobility, he's well-\nsuited to beginners.\n\n\x82""Ability:\x80 Fly\nDouble jump to start flying for a limited time. Repetitively hit the jump button to ascend.\n\n\x82Tip:\x80 To quickly descend while flying, hit the spin button.");
|
||||
strcpy(description[i].picname, "");
|
||||
strcpy(description[i].skinname, "tails");
|
||||
}
|
||||
else if (i == 2)
|
||||
{
|
||||
strcpy(description[i].notes, "\x82Knuckles\x80 is well-\nrounded and can destroy breakable walls simply by touching them, but he can't jump as high as the other two.\n\n\x82""Ability:\x80 Glide & Climb\nDouble jump to glide in the air as long as jump is held. Glide into a wall to climb it.\n\n\x82Tip:\x80 Press spin while climbing to jump off the wall; press jump instead to jump off\nand face away from\nthe wall.");
|
||||
strcpy(description[i].picname, "");
|
||||
strcpy(description[i].skinname, "knuckles");
|
||||
}
|
||||
else if (i == 3)
|
||||
{
|
||||
strcpy(description[i].notes, "\x82Sonic & Tails\x80 team up to take on Dr. Eggman!\nControl Sonic while Tails desperately struggles to keep up.\n\nPlayer 2 can control Tails directly by setting the controls in the options menu.\nTails's directional controls are relative to Player 1's camera.\n\nTails can pick up Sonic while flying and carry him around.");
|
||||
strcpy(description[i].picname, "CHRS&T");
|
||||
strcpy(description[i].skinname, "sonic&tails");
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(description[i].notes, "???");
|
||||
strcpy(description[i].picname, "");
|
||||
strcpy(description[i].skinname, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
// SPECIAL MENU OPTION DRAW ROUTINES GO HERE
|
||||
// ==========================================================================
|
||||
@@ -5330,7 +5418,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
|
||||
}
|
||||
|
||||
if (cvar->flags & CV_NETVAR)
|
||||
OP_CustomCvarMenu[ccvarposition] = (menuitem_t){ IT_STRING | IT_CVAR, NULL, Z_StrDup(va("\x85 %s", name)), cvar, ccvaralphakey };
|
||||
OP_CustomCvarMenu[ccvarposition] = (menuitem_t){ IT_STRING | IT_CVAR , NULL, Z_StrDup(va("\x85 %s", name)), cvar, ccvaralphakey };
|
||||
else
|
||||
OP_CustomCvarMenu[ccvarposition] = (menuitem_t){ IT_STRING | IT_CVAR, NULL, Z_StrDup(name), cvar, ccvaralphakey };
|
||||
|
||||
@@ -7865,24 +7953,25 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
INT32 tw = 0;
|
||||
spritedef_t *sprdef;
|
||||
spriteframe_t *sprframe;
|
||||
patch_t *statbg = (patch_t *)W_CachePatchName("K_STATBG", PU_PATCH);
|
||||
patch_t *statlr = (patch_t *)W_CachePatchName("K_STATLR", PU_PATCH);
|
||||
patch_t *statud = (patch_t *)W_CachePatchName("K_STATUD", PU_PATCH);
|
||||
patch_t *statdot = (patch_t *)W_CachePatchName("K_SDOT0" , PU_PATCH);
|
||||
patch_t *patch;
|
||||
UINT8 frame;
|
||||
UINT8 speed;
|
||||
UINT8 weight;
|
||||
UINT8 i;
|
||||
UINT8 s, w;
|
||||
const UINT8 *flashcol = V_GetStringColormap(highlightflags);
|
||||
INT32 skinnum = 0;
|
||||
INT32 statx, staty;
|
||||
UINT32 speenframe;
|
||||
INT32 sltw, actw, hetw;
|
||||
UINT8 skintodisplay;
|
||||
INT32 nameboxaddy = 0;
|
||||
|
||||
const UINT8 *flashcol = V_GetStringColormap(highlightflags);
|
||||
patch_t *statbg = (patch_t *)W_CachePatchName("K_STATBG", PU_PATCH);
|
||||
patch_t *statlr = (patch_t *)W_CachePatchName("K_STATLR", PU_PATCH);
|
||||
patch_t *statud = (patch_t *)W_CachePatchName("K_STATUD", PU_PATCH);
|
||||
patch_t *statdot = (patch_t *)W_CachePatchName("K_SDOT0" , PU_PATCH);
|
||||
int statoffset = 0;
|
||||
int gridyoffset = 0;
|
||||
|
||||
mx = MP_PlayerSetupDef.x;
|
||||
my = MP_PlayerSetupDef.y;
|
||||
@@ -7897,6 +7986,8 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
switch (cv_skinselectmenu.value)
|
||||
{
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
nameboxaddy = 6;
|
||||
break;
|
||||
case SKINMENUTYPE_GRID:
|
||||
nameboxaddy = 6;
|
||||
break;
|
||||
@@ -7912,23 +8003,39 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
else
|
||||
M_DrawTextInput(mx + 40, my + nameboxaddy, &setupm_input, 0);
|
||||
|
||||
#define GETSELECTEDSKINNAME (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].realname : skins[setupm_fakeskin].realname)
|
||||
#define GETSELECTEDSPEED (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartspeed : skins[setupm_fakeskin].kartspeed)
|
||||
#define GETSELECTEDWEIGHT (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartweight : skins[setupm_fakeskin].kartweight)
|
||||
|
||||
// draw skin string
|
||||
st = V_StringWidth(skins[setupm_fakeskin].realname, 0);
|
||||
switch (cv_skinselectmenu.value)
|
||||
{
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
V_DrawString(statx - (statdp ? 50 : 113), staty - 10, V_6WIDTHSPACE, va("\x84%dS \x87%dW", GETSELECTEDSPEED, GETSELECTEDWEIGHT));
|
||||
/* FALLTHRU */
|
||||
#define GETSELECTEDSKINNAME (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].realname : skins[setupm_fakeskin].realname)
|
||||
#define GETSELECTEDSPEED (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartspeed : skins[setupm_fakeskin].kartspeed)
|
||||
#define GETSELECTEDWEIGHT (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartweight : skins[setupm_fakeskin].kartweight)
|
||||
|
||||
tw = V_StringWidth("Character", 0);//V_StringWidth(GETSELECTEDSKINNAME, 0);
|
||||
st = V_StringWidth(GETSELECTEDSKINNAME, 0);
|
||||
|
||||
V_DrawString((mx+(tw/2)) - (st/2), my + 37,
|
||||
((MP_PlayerSetupMenu[2].status & IT_TYPE) == IT_SPACE ? V_TRANSLUCENT : 0) | highlightflags | V_ALLOWLOWERCASE,
|
||||
GETSELECTEDSKINNAME);
|
||||
if (statdp == true)
|
||||
statoffset = 50;
|
||||
else
|
||||
statoffset = 113;
|
||||
|
||||
V_DrawString(statx - statoffset, staty - 10, V_6WIDTHSPACE, va("\x84%dS \x87%dW", GETSELECTEDSPEED, GETSELECTEDWEIGHT));
|
||||
#undef GETSELECTEDSKINNAME
|
||||
#undef GETSELECTEDSPEED
|
||||
#undef GETSELECTEDWEIGHT
|
||||
break;
|
||||
case SKINMENUTYPE_GRID:
|
||||
tw = V_StringWidth("Character", 0);
|
||||
#define GETSELECTEDSKINNAME (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].realname : skins[setupm_fakeskin].realname)
|
||||
tw = V_StringWidth("Character", 0);//V_StringWidth(GETSELECTEDSKINNAME, 0);
|
||||
st = V_StringWidth(GETSELECTEDSKINNAME, 0);
|
||||
V_DrawString((mx+(tw/2)) - (st/2), my + 37,
|
||||
((MP_PlayerSetupMenu[2].status & IT_TYPE) == IT_SPACE ? V_TRANSLUCENT : 0) | highlightflags | V_ALLOWLOWERCASE,
|
||||
GETSELECTEDSKINNAME);
|
||||
#undef GETSELECTEDSKINNAME
|
||||
break;
|
||||
case SKINMENUTYPE_2D:
|
||||
|
||||
@@ -8006,6 +8113,8 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
break;
|
||||
}
|
||||
|
||||
#define GRIDSTATOFFSET 0
|
||||
|
||||
switch (cv_skinselectmenu.value)
|
||||
{
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
@@ -8017,6 +8126,9 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
if (itemOn == 1)
|
||||
V_DrawSmallString(statx+101, staty-37, V_6WIDTHSPACE|highlightflags, "BS: change");
|
||||
|
||||
#define GETSELECTEDSPEED (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartspeed : skins[setupm_fakeskin].kartspeed)
|
||||
#define GETSELECTEDWEIGHT (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartweight : skins[setupm_fakeskin].kartweight)
|
||||
|
||||
if (statdp == true)
|
||||
{
|
||||
//Background
|
||||
@@ -8046,19 +8158,22 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
}
|
||||
}
|
||||
|
||||
#undef GETSELECTEDSPEED
|
||||
#undef GETSELECTEDWEIGHT
|
||||
|
||||
break;
|
||||
case SKINMENUTYPE_GRID:
|
||||
// SRB2Kart: draw the stat backer
|
||||
// labels
|
||||
V_DrawSmallString(statx+12, staty+67, V_6WIDTHSPACE|highlightflags, "Acceleration");
|
||||
V_DrawSmallString(statx+76, staty+67, V_6WIDTHSPACE|highlightflags, "Max Speed");
|
||||
V_DrawSmallString(statx+14, staty+75, V_6WIDTHSPACE|highlightflags, "Handling");
|
||||
V_DrawSmallString(statx+21, staty+108, V_6WIDTHSPACE|highlightflags, "Weight");
|
||||
V_DrawSmallString(statx+12+GRIDSTATOFFSET, staty+67, V_6WIDTHSPACE|highlightflags, "Acceleration");
|
||||
V_DrawSmallString(statx+76+GRIDSTATOFFSET, staty+67, V_6WIDTHSPACE|highlightflags, "Max Speed");
|
||||
V_DrawSmallString(statx+14+GRIDSTATOFFSET, staty+75, V_6WIDTHSPACE|highlightflags, "Handling");
|
||||
V_DrawSmallString(statx+21+GRIDSTATOFFSET, staty+108, V_6WIDTHSPACE|highlightflags, "Weight");
|
||||
// label arrows
|
||||
V_DrawFixedPatch(((statx+61)<<FRACBITS) + (FRACUNIT>>1), (staty+67)<<FRACBITS, FRACUNIT>>1, 0, statlr, flashcol);
|
||||
V_DrawFixedPatch((statx+40)<<FRACBITS, (staty+80)<<FRACBITS, FRACUNIT>>1, 0, statud, flashcol);
|
||||
V_DrawFixedPatch(((statx+61+GRIDSTATOFFSET)<<FRACBITS) + (FRACUNIT>>1), (staty+67)<<FRACBITS, FRACUNIT>>1, 0, statlr, flashcol);
|
||||
V_DrawFixedPatch((statx+40+GRIDSTATOFFSET)<<FRACBITS, (staty+80)<<FRACBITS, FRACUNIT>>1, 0, statud, flashcol);
|
||||
// bg
|
||||
V_DrawFixedPatch(((statx+48)<<FRACBITS)+(FRACUNIT>>1), (staty+73)<<FRACBITS, FRACUNIT>>1, 0, statbg, NULL);
|
||||
V_DrawFixedPatch(((statx+48+GRIDSTATOFFSET)<<FRACBITS)+(FRACUNIT>>1), (staty+73)<<FRACBITS, FRACUNIT>>1, 0, statbg, NULL);
|
||||
|
||||
for (i = 0; i < numskins; i++) // draw the stat dots
|
||||
{
|
||||
@@ -8066,7 +8181,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
{
|
||||
speed = skins[i].kartspeed;
|
||||
weight = skins[i].kartweight;
|
||||
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
|
||||
V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8092,9 +8207,9 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
#define TEXTVERTSHIFT 10
|
||||
|
||||
DRAWSLOW(statx - sltw - 2, staty);
|
||||
DRAWSLOW(statx - sltw - 2, staty - TEXTVERTSHIFT + (9 * 18) - 11);
|
||||
DRAWSLOW(statx - sltw - 2, staty - TEXTVERTSHIFT+ (9 * 18) - 11);
|
||||
DRAWFAST(statx + (9 * 18), staty);
|
||||
DRAWFAST(statx + (9 * 18), staty - TEXTVERTSHIFT + (9 * 18) - 11);
|
||||
DRAWFAST(statx + (9 * 18), staty - TEXTVERTSHIFT+ (9 * 18) - 11);
|
||||
DRAWACCEL(statx - actw - 2, staty + TEXTVERTSHIFT);
|
||||
DRAWACCEL(statx + (9 * 18), staty + TEXTVERTSHIFT);
|
||||
DRAWHEAVY(statx - hetw - 2, staty + (9 * 18) - 11);
|
||||
@@ -8131,18 +8246,15 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
break;
|
||||
}
|
||||
|
||||
#undef GETSELECTEDSKINNAME
|
||||
#undef GETSELECTEDSPEED
|
||||
#undef GETSELECTEDWEIGHT
|
||||
|
||||
switch (cv_skinselectmenu.value)
|
||||
{
|
||||
//Skin grid stuff
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
//Skin grid stuff
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
gridyoffset = 10;
|
||||
for (s = 0; s < SKINGRIDNEWWIDTH*SKINGRIDNEWHEIGHT; s++)
|
||||
{
|
||||
INT32 x = ((s % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH) - 8) + 100 + SKINXSHIFT; //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
|
||||
INT32 y = ((s / SKINGRIDNEWWIDTH) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2)) + 10); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
|
||||
INT32 y = ((s / SKINGRIDNEWWIDTH) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2)) + gridyoffset); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
|
||||
INT32 calcs = s + (setupm_skinypos * SKINGRIDNEWWIDTH);
|
||||
INT32 skinn;
|
||||
patch_t *face;
|
||||
@@ -8168,7 +8280,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
{
|
||||
patch_t *cursor;
|
||||
INT32 curx = (((setupm_skinselect % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH/2)) + SKINXSHIFT) + 20;
|
||||
INT32 cury = (((setupm_skinselect / SKINGRIDNEWWIDTH) - setupm_skinypos) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2))+ 10);
|
||||
INT32 cury = (((setupm_skinselect / SKINGRIDNEWWIDTH) - setupm_skinypos) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2))+ gridyoffset);
|
||||
|
||||
UINT8 cursorframe = (I_GetTime() / 4) % 7;
|
||||
cursor = (patch_t *)W_CachePatchName(va("K_CHILI%d", cursorframe + 1), PU_PATCH);
|
||||
@@ -8228,13 +8340,13 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
weight = skins[selectedskin].kartweight;
|
||||
statdot = (patch_t *)W_CachePatchName("K_SDOT1", PU_PATCH);
|
||||
if (skullAnimCounter < 4) // SRB2Kart: we draw this dot later so that it's not covered if there's multiple skins with the same stats
|
||||
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, flashcol);
|
||||
V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, flashcol);
|
||||
else
|
||||
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
|
||||
V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
|
||||
|
||||
statdot = (patch_t *)W_CachePatchName("K_SDOT2", PU_PATCH); // coloured center
|
||||
if (setupm_fakecolor)
|
||||
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, R_GetTranslationColormap(0, setupm_fakecolor, GTC_MENUCACHE));
|
||||
V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, R_GetTranslationColormap(0, setupm_fakecolor, GTC_MENUCACHE));
|
||||
}
|
||||
break;
|
||||
case SKINMENUTYPE_2D:
|
||||
@@ -8285,6 +8397,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
}
|
||||
}
|
||||
break;
|
||||
#undef GRIDSTATOFFSET
|
||||
#undef SKINXSHIFT
|
||||
default:
|
||||
speed = skins[setupm_fakeskin].kartspeed;
|
||||
|
||||
@@ -50,6 +50,9 @@ void M_Drawer(void);
|
||||
// Called by D_SRB2Main, loads the config file.
|
||||
void M_Init(void);
|
||||
|
||||
// Called by D_SRB2Main also, sets up the playermenu and description tables.
|
||||
void M_InitCharacterTables(void);
|
||||
|
||||
// Called by intro code to force menu up upon a keypress,
|
||||
// does nothing if menu is already up.
|
||||
void M_StartControlPanel(void);
|
||||
@@ -81,6 +84,11 @@ typedef enum
|
||||
} menumessagetype_t;
|
||||
void M_StartMessage(const char *string, void *routine, menumessagetype_t itemtype);
|
||||
|
||||
extern boolean DPADUPSCROLL;
|
||||
extern boolean DPADDOWNSCROLL;
|
||||
extern boolean DPADLEFTSCROLL;
|
||||
extern boolean DPADRIGHTSCROLL;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
M_NOT_WAITING,
|
||||
@@ -160,6 +168,8 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt);
|
||||
|
||||
#define MAXMENUCCVARS 999
|
||||
|
||||
#define MAXTOOLTIPS 255
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct menu_s *submenu; // IT_SUBMENU
|
||||
@@ -185,6 +195,8 @@ typedef struct menuitem_s
|
||||
UINT16 alphaKey;
|
||||
} menuitem_t;
|
||||
|
||||
extern menuitem_t PlayerMenu[MAXSKINS];
|
||||
|
||||
typedef struct menu_s
|
||||
{
|
||||
const char *menutitlepic;
|
||||
@@ -215,6 +227,14 @@ extern menu_t SP_LoadDef;
|
||||
void M_SetupJoystickMenu(INT32 choice);
|
||||
extern menu_t OP_JoystickSetDef;
|
||||
|
||||
// Stuff for customizing the player select screen
|
||||
typedef struct
|
||||
{
|
||||
char notes[441];
|
||||
char picname[8];
|
||||
char skinname[SKINNAMESIZE*2+2]; // skin&skin\0
|
||||
} description_t;
|
||||
|
||||
// mode descriptions for video mode menu
|
||||
typedef struct
|
||||
{
|
||||
@@ -242,6 +262,8 @@ typedef struct
|
||||
|
||||
extern INT32 mapwads[NUMMAPS];
|
||||
|
||||
extern description_t description[MAXSKINS];
|
||||
|
||||
extern consvar_t cv_replaysearchrate;
|
||||
extern consvar_t cv_showfocuslost;
|
||||
extern consvar_t cv_newgametype, cv_nextmap, cv_chooseskin, cv_serversort;
|
||||
|
||||
+68
-69
@@ -495,6 +495,12 @@ static menuitem_t SP_LevelStatsMenu[] =
|
||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelStats, '\0'}, // dummy menuitem for the control func
|
||||
};
|
||||
|
||||
// A rare case.
|
||||
// External files modify this menu, so we can't call it static.
|
||||
// And I'm too lazy to go through and rename it everywhere. ARRGH!
|
||||
#define M_ChoosePlayer NULL
|
||||
menuitem_t PlayerMenu[MAXSKINS];
|
||||
|
||||
// -----------------------------------
|
||||
// Multiplayer and all of its submenus
|
||||
// -----------------------------------
|
||||
@@ -1185,20 +1191,20 @@ static menuitem_t OP_FocusOptionsMenu[] =
|
||||
{
|
||||
{IT_HEADER, NULL, "Game Focus Options", NULL, 0},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", &cv_playmusicifunfocused, 10},
|
||||
{IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", &cv_playsoundifunfocused, 20},
|
||||
{IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", &cv_playmusicifunfocused, 30},
|
||||
{IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", &cv_playsoundifunfocused, 40},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Pause Game While Unfocused", &cv_pauseifunfocused, 40},
|
||||
{IT_STRING|IT_CVAR, NULL, "Pause Game While Unfocused", &cv_pauseifunfocused, 60},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Background FPS Cap", &cv_fpscapbg, 60},
|
||||
{IT_STRING|IT_CVAR, NULL, "Background FPS Cap", &cv_fpscapbg, 80},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost, 80},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost, 100},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Visible Mouse", &cv_mousevisible, 100},
|
||||
{IT_STRING|IT_CVAR, NULL, "Visible Mouse", &cv_mousevisible, 120},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad LED Color While Unfocused ", &cv_gamepadledifunfocused, 140},
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad Rumble While Unfocused", &cv_rumbleifunfocused, 150},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad Inputs While Unfocused", &cv_gamepadifunfocused, 120},
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad LED Color While Unfocused ", &cv_gamepadledifunfocused, 130},
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad Rumble While Unfocused", &cv_rumbleifunfocused, 140},
|
||||
};
|
||||
|
||||
static const char* OP_FocusOptionsTooltips[] =
|
||||
@@ -1210,7 +1216,6 @@ static const char* OP_FocusOptionsTooltips[] =
|
||||
"Set manual framerate cap while the game is unfocused.",
|
||||
"Should the FOCUS LOST window appear\n while the game is unfocused?",
|
||||
"Displays the mouse cursor while the game is in focus.",
|
||||
"Should gamepad still control the game when unfocused?",
|
||||
"Should gamepad LED indicator change color when unfocused?",
|
||||
"Should gamepad rumble apply when unfocused?",
|
||||
};
|
||||
@@ -1305,29 +1310,29 @@ static menuitem_t OP_DiscordOptionsMenu[] =
|
||||
|
||||
static menuitem_t OP_HUDOptionsMenu[] =
|
||||
{
|
||||
{IT_STRING | IT_CVAR, NULL, "Show HUD (F3)", &cv_showhud, 10},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show HUD (F3)", &cv_showhud, 10},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "HUD Visibility", &cv_translucenthud, 20},
|
||||
NULL, "HUD Visibility", &cv_translucenthud, 20},
|
||||
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Online HUD options...", &OP_ChatOptionsDef, 35},
|
||||
{IT_STRING | IT_CVAR, NULL, "Background Glass", &cons_backcolor, 45},
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Online HUD options...", &OP_ChatOptionsDef, 35},
|
||||
{IT_STRING | IT_CVAR, NULL, "Background Glass", &cons_backcolor, 45},
|
||||
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "Minimap Visibility", &cv_kartminimap, 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Speedometer Display", &cv_kartspeedometer, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show \"CHECK\"", &cv_kartcheck, 80},
|
||||
NULL, "Minimap Visibility", &cv_kartminimap, 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Speedometer Display", &cv_kartspeedometer, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show \"CHECK\"", &cv_kartcheck, 80},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Menu Highlights", &cons_menuhighlight, 95},
|
||||
{IT_STRING | IT_CVAR, NULL, "Menu Highlights", &cons_menuhighlight, 95},
|
||||
// highlight info - (GOOD HIGHLIGHT, WARNING HIGHLIGHT) - 110 (see M_DrawHUDOptions)
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Console Text Size", &cv_constextsize, 120},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Console Prints in Menu",&cons_consoleprintinmenu, 130},
|
||||
{IT_STRING | IT_CVAR, NULL, "Console Text Size", &cv_constextsize, 120},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Console Prints in Menu",&cons_consoleprintinmenu, 130},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Track Addon Name", &cv_showtrackaddon, 145},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Track Addon Name", &cv_showtrackaddon, 145},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Show All Maps", &cv_showallmaps, 155},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show All Maps", &cv_showallmaps, 155},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "2D character select", &cv_skinselectmenu, 165},
|
||||
{IT_STRING | IT_CVAR, NULL, "2D character select", &cv_skinselectmenu, 165},
|
||||
};
|
||||
|
||||
static menuitem_t OP_CamOptionsMenu[] =
|
||||
@@ -1689,30 +1694,29 @@ static menuitem_t OP_SaturnMenu[] =
|
||||
{IT_STRING | IT_CVAR, NULL, "Minimum Input Delay", &cv_mindelay, 20},
|
||||
{IT_STRING | IT_CVAR, NULL, "Gentlemens Ping", &cv_gentlemens, 25},
|
||||
{IT_STRING | IT_CVAR, NULL, "Server Info Screen", &cv_serverinfoscreen, 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Server Addons Info", &cv_serveraddoninfo, 35},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Skin Select Spinning Speed", &cv_skinselectspin, 45},
|
||||
{IT_STRING | IT_CVAR, NULL, "Skin Select Spinning Speed", &cv_skinselectspin, 40},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Colorized Speedlines", &cv_coloredspeedlines, 55},
|
||||
{IT_STRING | IT_CVAR, NULL, "Colorized Sneakertrails", &cv_coloredsneakertrail, 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Colorized Speedlines", &cv_coloredspeedlines, 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Colorized Sneakertrails", &cv_coloredsneakertrail, 55},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Player Blendeffects", &cv_playerblendeffects, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Player Blendeffects", &cv_playerblendeffects, 65},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Bananadrag Jitter", &cv_bananajitter, 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Bananadrag Jitter", &cv_bananajitter, 75},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Midair Driftsparks", &cv_airsparks, 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Midair Driftsparks", &cv_airsparks, 85},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Localskin Menus", &cv_showlocalskinmenus, 100},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Localskin Menus", &cv_showlocalskinmenus, 95},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Uppercase Menu", &cv_menucaps, 110},
|
||||
{IT_STRING | IT_CVAR, NULL, "Uppercase Menu", &cv_menucaps, 105},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Keyboard Layout", &cv_keyboardlayout, 120},
|
||||
{IT_STRING | IT_CVAR, NULL, "Keyboard Layout", &cv_keyboardlayout, 115},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 130},
|
||||
{IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 125},
|
||||
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Saturn Hud...", &OP_SaturnHudDef, 140},
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 145},
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 150}, // uwu
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Saturn Hud...", &OP_SaturnHudDef, 135},
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 140},
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 145}, // uwu
|
||||
};
|
||||
|
||||
static const char* OP_SaturnTooltips[] =
|
||||
@@ -1722,7 +1726,6 @@ static const char* OP_SaturnTooltips[] =
|
||||
"Practice for online play! 0 = instant response.",
|
||||
"Simulate online input delay when hosting a server.\nValue choosen by Player with the lowest ping",
|
||||
"Show a screen before joining a server displaying important information about it",
|
||||
"Show amount and types of addons that are loaded by server when joining",
|
||||
"How much speen do you want?",
|
||||
"Colourize the speedlines in your skincolor if you go fast enough!",
|
||||
"Colourize the sneaker flame trails in your skincolor!",
|
||||
@@ -1825,49 +1828,47 @@ static menuitem_t OP_SaturnHudMenu[] =
|
||||
{
|
||||
{IT_HEADER, NULL, "Saturn Hud Options", NULL, 0},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Speedometer Style", &cv_newspeedometer, 10},
|
||||
{IT_STRING|IT_CVAR, NULL, "Battle Speedometer", &cv_battlespeedo, 15},
|
||||
{IT_STRING|IT_CVAR, NULL, "Speedometer Style", &cv_newspeedometer, 10},
|
||||
{IT_STRING|IT_CVAR, NULL, "Battle Speedometer", &cv_battlespeedo, 15},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Colourized HUD", &cv_colorizedhud, 25},
|
||||
{IT_STRING|IT_CVAR, NULL, "Colourized Itembox", &cv_colorizeditembox, 30},
|
||||
{IT_STRING|IT_CVAR, NULL, "Colourized HUD Color", &cv_colorizedhudcolor, 35},
|
||||
{IT_STRING|IT_CVAR, NULL, "Colourized HUD", &cv_colorizedhud, 25},
|
||||
{IT_STRING|IT_CVAR, NULL, "Colourized Itembox", &cv_colorizeditembox, 30},
|
||||
{IT_STRING|IT_CVAR, NULL, "Colourized HUD Color", &cv_colorizedhudcolor, 35},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Input Display", &cv_showinput, 45},
|
||||
{IT_STRING|IT_CVAR, NULL, "Input Display", &cv_showinput, 45},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Stat Display", &cv_showstats, 55},
|
||||
{IT_STRING|IT_CVAR, NULL, "Skin Name in Stat Display", &cv_showstats_skinname, 60},
|
||||
{IT_STRING|IT_CVAR, NULL, "Stat Display", &cv_showstats, 55},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Higher Resolution Portraits", &cv_highresportrait, 70},
|
||||
{IT_STRING|IT_CVAR, NULL, "Higher Resolution Portraits", &cv_highresportrait, 65},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Small Positionnumber", &cv_smallposnum, 80},
|
||||
{IT_STRING|IT_CVAR, NULL, "Positionnumber Animation", &cv_posanim, 85},
|
||||
{IT_STRING|IT_CVAR, NULL, "Small Positionnumber", &cv_smallposnum, 75},
|
||||
{IT_STRING|IT_CVAR, NULL, "Positionnumber Animation", &cv_posanim, 80},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Flash Lap Times", &cv_showlaptimes, 95},
|
||||
{IT_STRING|IT_CVAR, NULL, "Flash Lap Times", &cv_showlaptimes, 90},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Multi-Item icons", &cv_multiitemicon, 105},
|
||||
{IT_STRING|IT_CVAR, NULL, "Item Amount Number", &cv_huditemamount, 110},
|
||||
{IT_STRING|IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 115},
|
||||
{IT_STRING|IT_CVAR, NULL, "Multi-Item icons", &cv_multiitemicon, 100},
|
||||
{IT_STRING|IT_CVAR, NULL, "Item Amount Number", &cv_huditemamount, 105},
|
||||
{IT_STRING|IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 110},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 125},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 130},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 120},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 125},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 140},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Finished on Minimap", &cv_showminimapfinished, 145},
|
||||
{IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 150},
|
||||
{IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 155},
|
||||
{IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 160},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 135},
|
||||
{IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 140},
|
||||
{IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 145},
|
||||
{IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 150},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 170},
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits on Pause", &cv_pausesongcredits, 175},
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 160},
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits on Pause", &cv_pausesongcredits, 165},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 185},
|
||||
{IT_STRING|IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 175},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 195},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 185},
|
||||
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 205},
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 210},
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 195},
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 200},
|
||||
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 220},
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 210},
|
||||
};
|
||||
|
||||
static const char* OP_SaturnHudTooltips[] =
|
||||
@@ -1880,7 +1881,6 @@ static const char* OP_SaturnHudTooltips[] =
|
||||
"The color to use instead of the player color when\ncolourized hud is enabled.",
|
||||
"Displays the input display and lets you choose its style.",
|
||||
"Enable the stat display.",
|
||||
"Show skin name in the stat display.",
|
||||
"Enable the use of the higher resolution want icons instead of rank\nfor some places.",
|
||||
"Make the Postionnumber half the size.",
|
||||
"Disable the animation of the Positionnumber\nwhen overtaking someone.",
|
||||
@@ -1891,7 +1891,6 @@ static const char* OP_SaturnHudTooltips[] =
|
||||
"Show the big 'LAP' text on a lap change.",
|
||||
"Show the big Cecho Messages.",
|
||||
"Show player names on the minimap.",
|
||||
"Show players that have finished already on the minimap.",
|
||||
"Minimize the player icons on the minimap.",
|
||||
"Erratically rotate player icons during spinouts.",
|
||||
"Visualize the player facing angle.",
|
||||
|
||||
+5
-5
@@ -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 || (cv_keyboardlayout.value == 3 && !altdown)))
|
||||
{
|
||||
if (key == 'x' || key == 'X')
|
||||
{
|
||||
@@ -381,10 +381,10 @@ static boolean M_TextInputHandleBase(textinput_t *input, INT32 key, boolean emot
|
||||
// allow people to use keypad in console (good for typing IP addresses) - Calum
|
||||
if (key >= KEY_KEYPAD7 && key <= KEY_KPADDEL)
|
||||
{
|
||||
const char keypad_translation[] = {'7','8','9','-',
|
||||
'4','5','6','+',
|
||||
'1','2','3',
|
||||
'0', '.'};
|
||||
char keypad_translation[] = {'7','8','9','-',
|
||||
'4','5','6','+',
|
||||
'1','2','3',
|
||||
'0','.'};
|
||||
|
||||
key = keypad_translation[key - KEY_KEYPAD7];
|
||||
}
|
||||
|
||||
@@ -599,14 +599,9 @@ Update_parameters (void)
|
||||
delayed = MSInProgress;
|
||||
|
||||
if (delayed)/* do another update after the current one */
|
||||
{
|
||||
registered = 0;
|
||||
MSUpdateAgain = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
registered = MSRegistered;
|
||||
}
|
||||
}
|
||||
Unlock_state();
|
||||
|
||||
|
||||
+58
-20
@@ -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)
|
||||
@@ -1529,7 +1531,10 @@ void A_LobShot(void *thing)
|
||||
|
||||
if (!(actor->flags & MF_BOSS))
|
||||
{
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
if (ultimatemode)
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE;
|
||||
else
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1565,7 +1570,10 @@ void A_FireShot(void *thing)
|
||||
|
||||
if (!(actor->flags & MF_BOSS))
|
||||
{
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
if (ultimatemode)
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE;
|
||||
else
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1605,7 +1613,10 @@ void A_SuperFireShot(void *thing)
|
||||
|
||||
if (!(actor->flags & MF_BOSS))
|
||||
{
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
if (ultimatemode)
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE;
|
||||
else
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2859,6 +2870,12 @@ void A_ExtraLife(void *thing)
|
||||
if (actor->type == MT_1UPICO && !actor->tracer)
|
||||
actor->frame -= 2; // No lives icon for this player, use the default.
|
||||
|
||||
if (ultimatemode) //I don't THINK so!
|
||||
{
|
||||
S_StartSound(player->mo, sfx_lose);
|
||||
return;
|
||||
}
|
||||
|
||||
// In shooter gametypes, give the player 100 rings instead of an extra life.
|
||||
if (gametype != GT_COOP && gametype != GT_COMPETITION)
|
||||
P_GivePlayerRings(player, 100);
|
||||
@@ -3633,7 +3650,7 @@ static inline boolean PIT_GrenadeRing(mobj_t *thing)
|
||||
return true;
|
||||
|
||||
if (thing->player && (thing->player->kartstuff[k_hyudorotimer]
|
||||
|| (G_BattleGametype() && thing->player->kartstuff[k_bumper] <= 0 && thing->player->kartstuff[k_comebacktimer])))
|
||||
|| (G_BattleGametype() && thing->player && thing->player->kartstuff[k_bumper] <= 0 && thing->player->kartstuff[k_comebacktimer])))
|
||||
return true;
|
||||
|
||||
if ((gametype == GT_CTF || gametype == GT_TEAMMATCH)
|
||||
@@ -3998,13 +4015,26 @@ void A_JetChase(void *thing)
|
||||
}
|
||||
|
||||
// chase towards player
|
||||
P_Thrust(actor, actor->angle, FixedMul(actor->info->speed/4, actor->scale));
|
||||
if (ultimatemode)
|
||||
P_Thrust(actor, actor->angle, FixedMul(actor->info->speed/2, actor->scale));
|
||||
else
|
||||
P_Thrust(actor, actor->angle, FixedMul(actor->info->speed/4, actor->scale));
|
||||
|
||||
// must adjust height
|
||||
if (actor->z < (actor->target->z + actor->target->height + FixedMul((32<<FRACBITS), actor->scale)))
|
||||
actor->momz += FixedMul(FRACUNIT/2, actor->scale);
|
||||
if (ultimatemode)
|
||||
{
|
||||
if (actor->z < (actor->target->z + actor->target->height + FixedMul((64<<FRACBITS), actor->scale)))
|
||||
actor->momz += FixedMul(FRACUNIT/2, actor->scale);
|
||||
else
|
||||
actor->momz -= FixedMul(FRACUNIT/2, actor->scale);
|
||||
}
|
||||
else
|
||||
actor->momz -= FixedMul(FRACUNIT/2, actor->scale);
|
||||
{
|
||||
if (actor->z < (actor->target->z + actor->target->height + FixedMul((32<<FRACBITS), actor->scale)))
|
||||
actor->momz += FixedMul(FRACUNIT/2, actor->scale);
|
||||
else
|
||||
actor->momz -= FixedMul(FRACUNIT/2, actor->scale);
|
||||
}
|
||||
}
|
||||
|
||||
// Function: A_JetbThink
|
||||
@@ -4107,7 +4137,10 @@ void A_JetgShoot(void *thing)
|
||||
A_FaceTarget(actor);
|
||||
P_SpawnMissile(actor, actor->target, (mobjtype_t)actor->info->raisestate);
|
||||
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
if (ultimatemode)
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE;
|
||||
else
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
|
||||
if (actor->info->attacksound)
|
||||
S_StartSound(actor, actor->info->attacksound);
|
||||
@@ -5268,7 +5301,7 @@ void A_MixUp(void *thing)
|
||||
if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE
|
||||
&& !players[i].exiting && !players[i].powers[pw_super])
|
||||
{
|
||||
if (netgame && players[i].spectator) // Ignore spectators
|
||||
if ((netgame || multiplayer) && players[i].spectator) // Ignore spectators
|
||||
continue;
|
||||
|
||||
numplayers++;
|
||||
@@ -5311,11 +5344,6 @@ void A_MixUp(void *thing)
|
||||
}
|
||||
}
|
||||
|
||||
// idk if we ever really end up here
|
||||
// but bad things would happen if we do without this
|
||||
if (one == -1)
|
||||
return;
|
||||
|
||||
//get this done first!
|
||||
tempthing = players[one].mo->tracer;
|
||||
P_SetTarget(&players[one].mo->tracer, players[two].mo->tracer);
|
||||
@@ -6430,8 +6458,12 @@ void A_BuzzFly(void *thing)
|
||||
// chase towards player
|
||||
{
|
||||
INT32 dist, realspeed;
|
||||
const fixed_t mf = 5*(FRACUNIT/4);
|
||||
|
||||
realspeed = FixedMul(actor->info->speed, actor->scale);
|
||||
if (ultimatemode)
|
||||
realspeed = FixedMul(FixedMul(actor->info->speed,mf), actor->scale);
|
||||
else
|
||||
realspeed = FixedMul(actor->info->speed, actor->scale);
|
||||
|
||||
dist = P_AproxDistance(P_AproxDistance(actor->target->x - actor->x,
|
||||
actor->target->y - actor->y), actor->target->z - actor->z);
|
||||
@@ -7886,7 +7918,7 @@ void A_ItemPop(void *thing)
|
||||
|
||||
if (!(actor->target && actor->target->player))
|
||||
{
|
||||
if (cv_debug)
|
||||
if (cv_debug && !(actor->target && actor->target->player))
|
||||
CONS_Printf("ERROR: Powerup has no target!\n");
|
||||
return;
|
||||
}
|
||||
@@ -8748,7 +8780,7 @@ void A_ReaperThinker(void *thing)
|
||||
actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y);
|
||||
|
||||
// The player we should target if it's near us:
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
for (i = 0; i<MAXPLAYERS; i++)
|
||||
{
|
||||
|
||||
if (!playeringame[i])
|
||||
@@ -9219,7 +9251,10 @@ void A_MultiShot(void *thing)
|
||||
|
||||
if (!(actor->flags & MF_BOSS))
|
||||
{
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
if (ultimatemode)
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE;
|
||||
else
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10828,7 +10863,10 @@ void A_BrakFireShot(void *thing)
|
||||
|
||||
if (!(actor->flags & MF_BOSS))
|
||||
{
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
if (ultimatemode)
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE;
|
||||
else
|
||||
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
+21
-1
@@ -1219,6 +1219,24 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||
|
||||
case MT_EXTRALARGEBUBBLE:
|
||||
return; // SRB2kart - don't need bubbles mucking with the player
|
||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL)
|
||||
return;
|
||||
if (UNLIKELY(maptol & TOL_NIGHTS))
|
||||
return;
|
||||
if (UNLIKELY(mariomode))
|
||||
return;
|
||||
else if (toucher->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
if (special->z+special->height < toucher->z + toucher->height / 3
|
||||
|| special->z+special->height > toucher->z + (toucher->height*2/3))
|
||||
return; // Only go in the mouth
|
||||
}
|
||||
else if (special->z < toucher->z + toucher->height / 3
|
||||
|| special->z > toucher->z + (toucher->height*2/3))
|
||||
return; // Only go in the mouth
|
||||
|
||||
toucher->momx = toucher->momy = toucher->momz = 0;
|
||||
break;
|
||||
|
||||
case MT_WATERDROP:
|
||||
if (special->state == &states[special->info->spawnstate])
|
||||
@@ -1860,8 +1878,10 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
|
||||
P_InstaThrust(target,target->angle,FixedMul(2*FRACUNIT, target->scale));
|
||||
target->momz = FixedMul(7*FRACUNIT, target->scale);
|
||||
if (flip)
|
||||
{
|
||||
target->momz = -target->momz;
|
||||
|
||||
if (flip)
|
||||
{
|
||||
target = P_SpawnMobj(x,y,z-FixedMul(12*FRACUNIT, target->scale),MT_SPIKE);
|
||||
target->eflags |= MFE_VERTICALFLIP;
|
||||
}
|
||||
|
||||
@@ -99,6 +99,9 @@ typedef struct camera_s
|
||||
// Hold up/down to pan the camera vertically
|
||||
SINT8 dpad_y_held;
|
||||
|
||||
// Things used by FS cameras.
|
||||
fixed_t viewheight;
|
||||
angle_t startangle;
|
||||
|
||||
// Camera demobjerization
|
||||
// Info for drawing: position.
|
||||
@@ -118,6 +121,8 @@ typedef struct camera_s
|
||||
fixed_t radius;
|
||||
fixed_t height;
|
||||
|
||||
fixed_t relativex;
|
||||
|
||||
// Momentums, used to update position.
|
||||
fixed_t momx, momy, momz;
|
||||
|
||||
@@ -207,6 +212,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj);
|
||||
void P_GivePlayerRings(player_t *player, INT32 num_rings);
|
||||
void P_GivePlayerLives(player_t *player, INT32 numlives);
|
||||
UINT8 P_GetNextEmerald(void);
|
||||
void P_GiveEmerald(boolean spawnObj);
|
||||
void P_ResetScore(player_t *player);
|
||||
boolean P_AutoPause(void);
|
||||
|
||||
@@ -214,6 +220,7 @@ void P_DoJumpShield(player_t *player);
|
||||
void P_BlackOw(player_t *player);
|
||||
void P_ElementalFireTrail(player_t *player);
|
||||
|
||||
//void P_DoPityCheck(player_t *player);
|
||||
void P_PlayerThink(player_t *player);
|
||||
void P_PlayerAfterThink(player_t *player);
|
||||
void P_DoPlayerExit(player_t *player);
|
||||
@@ -274,6 +281,7 @@ void P_RemoveMobj(mobj_t *th);
|
||||
void P_RemoveSavegameMobj(mobj_t *th);
|
||||
boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state);
|
||||
boolean P_SetMobjState(mobj_t *mobj, statenum_t state);
|
||||
//void P_RunShields(void);
|
||||
void P_RunOverlays(void);
|
||||
void P_RunShadows(void);
|
||||
void P_MobjThinker(mobj_t *mobj);
|
||||
|
||||
+31
-38
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+147
-154
@@ -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);
|
||||
@@ -5637,15 +5620,13 @@ void P_SetScale(mobj_t *mobj, fixed_t newscale)
|
||||
void P_Attract(mobj_t *source, mobj_t *dest, boolean nightsgrab) // Home in on your target
|
||||
{
|
||||
fixed_t dist, ndist, speedmul;
|
||||
fixed_t tx, ty, tz;
|
||||
fixed_t tx = dest->x;
|
||||
fixed_t ty = dest->y;
|
||||
fixed_t tz = dest->z + (dest->height/2); // Aim for center
|
||||
|
||||
if (!dest || dest->health <= 0 || !dest->player || !source->tracer)
|
||||
return;
|
||||
|
||||
tx = dest->x;
|
||||
ty = dest->y;
|
||||
tz = dest->z + (dest->height/2); // Aim for center
|
||||
|
||||
// change slope
|
||||
dist = P_AproxDistance(P_AproxDistance(tx - source->x, ty - source->y), tz - source->z);
|
||||
|
||||
@@ -9024,9 +9005,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 +9109,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 +9205,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 +9231,7 @@ void P_PushableThinker(mobj_t *mobj)
|
||||
{
|
||||
sector_t *sec;
|
||||
|
||||
I_Assert(mobj != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mobj));
|
||||
|
||||
if (!mobj)
|
||||
@@ -9284,13 +9269,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 +10255,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 +10322,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 +10345,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
|
||||
|
||||
@@ -11177,7 +11161,16 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
||||
}
|
||||
}
|
||||
|
||||
if (i == MT_EMMY && (gametype != GT_COOP || tokenbits == 30 || tokenlist & (1 << tokenbits++)))
|
||||
if (ultimatemode)
|
||||
{
|
||||
if (i == MT_PITYTV || i == MT_GREENTV || i == MT_YELLOWTV || i == MT_BLUETV || i == MT_BLACKTV || i == MT_WHITETV)
|
||||
return; // No shields in Ultimate mode
|
||||
|
||||
if (i == MT_SUPERRINGBOX)
|
||||
return; // No rings in Ultimate mode (except special stages)
|
||||
}
|
||||
|
||||
if (i == MT_EMMY && (gametype != GT_COOP || ultimatemode || tokenbits == 30 || tokenlist & (1 << tokenbits++)))
|
||||
return; // you already got this token, or there are too many, or the gametype's not right
|
||||
|
||||
// Objectplace landing point
|
||||
@@ -11849,6 +11842,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 +11855,6 @@ void P_SpawnHoops(mapthing_t *mthing)
|
||||
if (P_MobjWasRemoved(hoopcenter))
|
||||
return;
|
||||
|
||||
sec = R_PointInSubsector(x, y)->sector;
|
||||
|
||||
hoopcenter->spawnpoint = mthing;
|
||||
|
||||
z += P_GetSectorFloorZAt(sec, x, y);
|
||||
|
||||
@@ -421,6 +421,10 @@ typedef struct mobj_s
|
||||
//
|
||||
// For precipitation
|
||||
//
|
||||
// Sometimes this is casted to a mobj_t,
|
||||
// so please keep the start of the
|
||||
// structure the same.
|
||||
//
|
||||
typedef struct precipmobj_s
|
||||
{
|
||||
// List: thinker links.
|
||||
|
||||
@@ -3308,6 +3308,8 @@ FUNCINLINE static ATTRINLINE void P_ArchiveMisc(savebuffer_t *save)
|
||||
else
|
||||
WRITEINT16(save->p, gamemap);
|
||||
|
||||
lastmapsaved = gamemap;
|
||||
|
||||
WRITEUINT16(save->p, (botskin ? (emeralds|(1<<10)) : emeralds)+357);
|
||||
WRITESTRINGN(save->p, timeattackfolder, sizeof(timeattackfolder));
|
||||
}
|
||||
@@ -3331,6 +3333,8 @@ FUNCINLINE static ATTRINLINE void P_UnArchiveSPGame(savebuffer_t *save, INT16 ma
|
||||
if (!mapheaderinfo[gamemap-1])
|
||||
P_AllocMapHeader(gamemap-1);
|
||||
|
||||
lastmapsaved = gamemap;
|
||||
|
||||
tokenlist = 0;
|
||||
token = 0;
|
||||
|
||||
|
||||
+1
-2
@@ -2586,8 +2586,7 @@ void P_FreeLevelState(void)
|
||||
}
|
||||
|
||||
// Clear pointers that would be left dangling by the purge
|
||||
// Pointers are now PU_STATIC so they won't be freed :)
|
||||
//R_FlushTranslationColormapCache();
|
||||
R_FlushTranslationColormapCache();
|
||||
|
||||
#ifdef HWRENDER
|
||||
// Free GPU textures before freeing patches.
|
||||
|
||||
+1
-2
@@ -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
@@ -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;
|
||||
|
||||
|
||||
+2
-2
@@ -706,7 +706,6 @@ void P_Ticker(boolean run)
|
||||
|
||||
if (indirectitemcooldown > 0)
|
||||
indirectitemcooldown--;
|
||||
|
||||
if (hyubgone > 0)
|
||||
hyubgone--;
|
||||
|
||||
@@ -714,7 +713,8 @@ void P_Ticker(boolean run)
|
||||
{
|
||||
K_UpdateSpectateGrief();
|
||||
}
|
||||
else if (G_BattleGametype())
|
||||
|
||||
if (G_BattleGametype())
|
||||
{
|
||||
if (wantedcalcdelay && --wantedcalcdelay <= 0)
|
||||
K_CalculateBattleWanted();
|
||||
|
||||
+44
-24
@@ -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;
|
||||
}
|
||||
|
||||
@@ -221,6 +220,32 @@ UINT8 P_GetNextEmerald(void)
|
||||
return (UINT8)(gamemap - sstage_start);
|
||||
}
|
||||
|
||||
//
|
||||
// P_GiveEmerald
|
||||
//
|
||||
// Award an emerald upon completion
|
||||
// of a special stage.
|
||||
//
|
||||
void P_GiveEmerald(boolean spawnObj)
|
||||
{
|
||||
INT32 i;
|
||||
UINT8 em;
|
||||
|
||||
S_StartSound(NULL, sfx_cgot); // Got the emerald!
|
||||
em = P_GetNextEmerald();
|
||||
emeralds |= (1 << em);
|
||||
|
||||
if (spawnObj)
|
||||
{
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (playeringame[i])
|
||||
P_SetMobjState(P_SpawnMobj(players[i].mo->x, players[i].mo->y, players[i].mo->z + players[i].mo->info->height, MT_GOTEMERALD),
|
||||
mobjinfo[MT_GOTEMERALD].spawnstate + em);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// P_ResetScore
|
||||
//
|
||||
@@ -775,7 +800,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.
|
||||
@@ -1201,6 +1226,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
|
||||
|
||||
ghost->pitch = mobj->pitch;
|
||||
ghost->roll = mobj->roll;
|
||||
ghost->sloperoll = mobj->sloperoll;
|
||||
ghost->rollangle = mobj->rollangle;
|
||||
ghost->sloperoll = mobj->sloperoll;
|
||||
ghost->slopepitch = mobj->slopepitch;
|
||||
@@ -1393,8 +1419,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 +1539,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 +2136,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 +2298,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 +2420,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);
|
||||
}
|
||||
@@ -3109,16 +3130,19 @@ void P_ToggleDemoCamera(UINT8 viewnum)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!cam->freecam) // toggle on
|
||||
if (!cam->freecam) // toggle on
|
||||
{
|
||||
cam->freecam = true;
|
||||
cam->button_a_held = 2;
|
||||
cam->reset_aiming = true;
|
||||
|
||||
// get rid of some hud elements
|
||||
displayplayers[0] = consoleplayer;
|
||||
if (displayplayers[0] != consoleplayer)
|
||||
{
|
||||
displayplayers[0] = consoleplayer;
|
||||
}
|
||||
}
|
||||
else // toggle off
|
||||
else // toggle off
|
||||
{
|
||||
cam->freecam = false;
|
||||
G_FixCamera(viewnum+1);
|
||||
@@ -3484,6 +3508,8 @@ void P_ResetCamera(player_t *player, camera_t *thiscam)
|
||||
}
|
||||
}
|
||||
|
||||
thiscam->relativex = 0;
|
||||
|
||||
thiscam->subsector = R_PointInSubsectorFast(thiscam->x, thiscam->y);
|
||||
|
||||
thiscam->radius = 20*FRACUNIT;
|
||||
@@ -3976,12 +4002,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;
|
||||
}
|
||||
@@ -4033,7 +4056,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
|
||||
|
||||
if (timeover)
|
||||
thiscam->angle = angle;
|
||||
else if (!camstill && !resetcalled && !paused)
|
||||
else if (!camstill && !resetcalled && !paused && timeover != 1)
|
||||
thiscam->angle = R_PointToAngle2(thiscam->x, thiscam->y, viewpointx, viewpointy);
|
||||
|
||||
if (timeover == 1)
|
||||
@@ -4156,12 +4179,10 @@ void P_ResetLocalCamAiming(player_t *player)
|
||||
|
||||
boolean P_SpectatorJoinGame(player_t *player)
|
||||
{
|
||||
const boolean islocalplayer = P_IsLocalPlayer(player);
|
||||
|
||||
// Team changing isn't allowed.
|
||||
if (!cv_allowteamchange.value)
|
||||
{
|
||||
if (islocalplayer)
|
||||
if (P_IsLocalPlayer(player))
|
||||
CONS_Printf(M_GetText("Server does not allow team change.\n"));
|
||||
}
|
||||
// Team changing in Team Match and CTF
|
||||
@@ -4209,7 +4230,7 @@ boolean P_SpectatorJoinGame(player_t *player)
|
||||
P_ResetLocalCamAiming(player);
|
||||
|
||||
//Reset away view
|
||||
if (islocalplayer && displayplayers[0] != consoleplayer)
|
||||
if (P_IsLocalPlayer(player) && displayplayers[0] != consoleplayer)
|
||||
displayplayers[0] = consoleplayer;
|
||||
|
||||
if (changeto == 1)
|
||||
@@ -4236,7 +4257,7 @@ boolean P_SpectatorJoinGame(player_t *player)
|
||||
P_ResetLocalCamAiming(player);
|
||||
|
||||
//Reset away view
|
||||
if (islocalplayer && displayplayers[0] != consoleplayer)
|
||||
if (P_IsLocalPlayer(player) && displayplayers[0] != consoleplayer)
|
||||
displayplayers[0] = consoleplayer;
|
||||
|
||||
HU_AddChatText(va(M_GetText("\x82*%s entered the game."), player_names[player-players]), false);
|
||||
@@ -4758,7 +4779,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;
|
||||
|
||||
+6
-7
@@ -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;
|
||||
@@ -993,6 +991,7 @@ static void R_Subsector(size_t num)
|
||||
visffloor[numffloors].height = polysec->floorheight;
|
||||
visffloor[numffloors].polyobj = po;
|
||||
visffloor[numffloors].slope = NULL;
|
||||
// visffloor[numffloors].ffloor = rover;
|
||||
po->visplane = visffloor[numffloors].plane;
|
||||
numffloors++;
|
||||
}
|
||||
|
||||
+46
-4
@@ -37,6 +37,44 @@
|
||||
// Not sure if this is necessary, but it was in w_wad.c, so I'm putting it here too -Shadow Hog
|
||||
#include <errno.h>
|
||||
|
||||
//
|
||||
// Texture definition.
|
||||
// Each texture is composed of one or more patches,
|
||||
// with patches being lumps stored in the WAD.
|
||||
// The lumps are referenced by number, and patched
|
||||
// into the rectangular texture space using origin
|
||||
// and possibly other attributes.
|
||||
//
|
||||
typedef struct
|
||||
{
|
||||
INT16 originx, originy;
|
||||
INT16 patch, stepdir, colormap;
|
||||
} ATTRPACK mappatch_t;
|
||||
|
||||
//
|
||||
// Texture definition.
|
||||
// An SRB2 wall texture is a list of patches
|
||||
// which are to be combined in a predefined order.
|
||||
//
|
||||
typedef struct
|
||||
{
|
||||
char name[8];
|
||||
INT32 masked;
|
||||
INT16 width;
|
||||
INT16 height;
|
||||
INT32 columndirectory; // FIXTHIS: OBSOLETE
|
||||
INT16 patchcount;
|
||||
mappatch_t patches[1];
|
||||
} ATTRPACK maptexture_t;
|
||||
|
||||
// Store lists of lumps for F_START/F_END etc.
|
||||
typedef struct
|
||||
{
|
||||
UINT16 wadfile;
|
||||
UINT16 firstlump;
|
||||
size_t numlumps;
|
||||
} lumplist_t;
|
||||
|
||||
//
|
||||
// Graphics.
|
||||
// SRB2 graphics for walls and sprites
|
||||
@@ -798,7 +836,11 @@ static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
|
||||
}
|
||||
else
|
||||
{
|
||||
Z_Free(patchName);
|
||||
if (patchName != NULL)
|
||||
{
|
||||
Z_Free(patchName);
|
||||
}
|
||||
|
||||
patchName = (char *)Z_Malloc((texturesTokenLength+1)*sizeof(char),PU_STATIC,NULL);
|
||||
memcpy(patchName,texturesToken,texturesTokenLength*sizeof(char));
|
||||
patchName[texturesTokenLength] = '\0';
|
||||
@@ -1324,7 +1366,7 @@ void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap)
|
||||
colormap_p = colormap_p2 = colormaps;
|
||||
colormap_p += COLORMAP_REMAPOFFSET;
|
||||
|
||||
for (p = 0; p < LIGHTLEVELS; p++)
|
||||
for (p = 0; p < 32; p++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
@@ -1546,7 +1588,7 @@ INT32 R_CreateColormap(char *p1, char *p2, char *p3)
|
||||
|
||||
// Calculate the palette index for each palette index, for each light level
|
||||
// (as well as the two unused colormap lines we inherited from Doom)
|
||||
for (p = 0; p < LIGHTLEVELS; p++)
|
||||
for (p = 0; p < 32; p++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
@@ -1580,7 +1622,7 @@ INT32 R_CreateColormap(char *p1, char *p2, char *p3)
|
||||
{
|
||||
lighttable_t *colormap_p2 = extra_colormaps[mapnum].colormap;
|
||||
|
||||
for (p = 0; p < LIGHTLEVELS; p++)
|
||||
for (p = 0; p < 32; p++)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
|
||||
@@ -45,6 +45,9 @@ enum
|
||||
TEXTURETYPE_COMPOSITE,
|
||||
};
|
||||
|
||||
// A maptexturedef_t describes a rectangular texture,
|
||||
// which is composed of one or more mappatch_t structures
|
||||
// that arrange graphic patches.
|
||||
typedef struct
|
||||
{
|
||||
// Keep name for switch changing, etc.
|
||||
|
||||
+9
-10
@@ -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
|
||||
|
||||
+10
-16
@@ -419,7 +419,7 @@ static UINT8* RGetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 f
|
||||
// Generate the colormap if necessary
|
||||
if (!ret)
|
||||
{
|
||||
ret = static_cast<UINT8*>(Z_Malloc(NUM_PALETTE_ENTRIES, PU_STATIC, NULL));
|
||||
ret = static_cast<UINT8*>(Z_Malloc(NUM_PALETTE_ENTRIES, (flags & GTC_CACHE) ? PU_LEVEL : PU_STATIC, NULL));
|
||||
K_GenerateKartColormap(ret, skinnum, color, local); //R_GenerateTranslationColormap(ret, skinnum, color); // SRB2kart
|
||||
|
||||
// Cache the colormap if desired
|
||||
@@ -487,10 +487,6 @@ patch_t* R_GetSkinFaceMini(player_t* ply)
|
||||
|
||||
\return void
|
||||
*/
|
||||
|
||||
/* There seems to be no reason to free cached colormaps tho? Not like they can change :ChonkBunckle: */
|
||||
|
||||
/*
|
||||
void R_FlushTranslationColormapCache(void)
|
||||
{
|
||||
INT32 i;
|
||||
@@ -503,7 +499,6 @@ void R_FlushTranslationColormapCache(void)
|
||||
if (localtranslationtablecache[i])
|
||||
memset(localtranslationtablecache[i], 0, MAXTRANSLATIONS * sizeof(UINT8**));
|
||||
}
|
||||
*/
|
||||
|
||||
// ==========================================================================
|
||||
// COMMON DRAWER FOR 8 AND 16 BIT COLOR MODES
|
||||
@@ -515,6 +510,8 @@ void R_FlushTranslationColormapCache(void)
|
||||
// in reality, the few routines that can work for either mode, are
|
||||
// put here
|
||||
|
||||
enum columncontext_e columncontext = COLUMNCONTEXT_DIRECT;
|
||||
|
||||
enum ColumnFlushType
|
||||
{
|
||||
FLUSH_NONE = 0x0000,
|
||||
@@ -532,12 +529,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 +559,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 +592,8 @@ void R_ResetColumnBuffer(void)
|
||||
|
||||
temp_dc.type = FLUSH_NONE;
|
||||
R_FlushWholeColumns = R_FlushWholeError;
|
||||
R_FlushHTColumns = R_FlushHTError;
|
||||
R_FlushQuadColumn = R_QuadFlushError;
|
||||
R_FlushHTColumns = R_FlushHTError;
|
||||
R_FlushQuadColumn = R_QuadFlushError;
|
||||
}
|
||||
|
||||
/** \brief The R_InitViewBuffer function
|
||||
|
||||
+1
-2
@@ -105,6 +105,7 @@ enum columncontext_e
|
||||
COLUMNCONTEXT_FLUSH,
|
||||
};
|
||||
|
||||
extern enum columncontext_e columncontext;
|
||||
void R_SetColumnContext(enum columncontext_e _columncontext);
|
||||
|
||||
void R_ResetColumnBuffer(void);
|
||||
@@ -123,8 +124,6 @@ enum
|
||||
COLDRAWFUNC_TRANSTRANS,
|
||||
COLDRAWFUNC_TWOSMULTIPATCH,
|
||||
COLDRAWFUNC_TWOSMULTIPATCHTRANS,
|
||||
COLDRAWFUNC_TWOSMULTIPATCH_DIRECT,
|
||||
COLDRAWFUNC_TWOSMULTIPATCHTRANS_DIRECT,
|
||||
COLDRAWFUNC_FOG,
|
||||
|
||||
COLDRAWFUNC_MAX
|
||||
|
||||
Loaded 100 of 120 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user