Compare commits

..
Author SHA1 Message Date
alufolie91 fed7020da1 hash_sparse: change length checks
dont early return on 0 len, let it be the falltrough case, this seems to help branch prediction
2026-03-13 18:58:49 +01:00
alufolie91 1a4255d9df luaS_newlstr: use hash also for checking strings
taken from raptorjit
we can check the hash first to skip quite a bunch of memcmps which should be faster in most cases (hopefully but quick timedemo tests confirmed that)
2026-03-13 18:58:39 +01:00
alufolie91 f6ead71f0c blua: handle 0 length strings in hash_sparse 2026-03-13 18:58:31 +01:00
Alug 966f60f590 Experiment: replace lua´s string hash with luajits ARX hash
the string hashing was the most hit and most spent in part of the whole game in alot of cases
replacing it with luajits algo absolutely massively improves lua performance (10-15fps in my bench timedemos!)
however idk how all this stuff exactly works so this needs alot of testing to make sure nothing breaks
ive rewritten the unaligned ptr access slightly to use memcpy for safety with some platforms that require stricter alignment
2026-03-13 18:58:21 +01:00
alufolie91 9afc018a45 Avoid computing invalid addresses
luaV_execute should compute 'ra' only when the instruction uses it.
Computing an illegal address is undefined behavior even if the address
is never dereferenced.
2026-03-13 18:58:05 +01:00
Alug 43608810da lua branching hint stuff
rechecked against lua 5.4
2026-03-13 18:56:18 +01:00
Alug 90b5f9050a Blua: small optimization in luaL_addlstring (avoid adding chars one by one)
https://github.com/lua/lua/commit/f292760f12022a83cf01e788482a264aeeb3c276
2026-03-13 18:55:55 +01:00
Alug edc10a35a1 Blua: better names for metamethods in debug information
https://github.com/lua/lua/commit/becf19feeffeb0bf2297e163da4ccc7b4b5e6b5c
2026-03-13 18:55:49 +01:00
Alug 91435fe1b2 Blua: small optimization (reorder of BinOpr enum to unify some cases in switches)
https://github.com/lua/lua/commit/d7872dcf91eb2075312a03973a6cdb489610c796
2026-03-13 18:55:42 +01:00
Alug a7ebc7e745 Blua: micro-optimization: avoid one API call in 'read_chars'
https://github.com/lua/lua/commit/f86f4116c82654d24faa4a32a909d0c27f3d4746
2026-03-13 18:55:37 +01:00
alufolie91 3cf3c1bb99 Merge pull request #219 from Indev450/netstuff
Netcode fixes, cleanups and optimizations
2026-03-13 18:45:18 +01:00
alufolie91 2c170f1956 Merge pull request #217 from Indev450/optimizewadlumps
Optimze Wad Lumps
2026-03-13 18:21:50 +01:00
alufolie91 98da654e02 Fix P_MakeMapMD5 printing incorrect time
:chonkbuncle:
2026-03-10 16:55:54 +01:00
alufolie91 af84105e40 better error for nodeless maps 2026-03-10 16:55:51 +01:00
indev a1666704e5 Hide offroad particles when player is doing saltyhop 2026-03-09 14:53:30 +03:00
alufolie91 7b408a33d7 fix openmpt versions strings leaking
from https://lib.openmpt.org/doc/libopenmpt_c_overview.html "All strings returned from libopenmpt are dynamically allocated and must be freed with openmpt_free_string()."
didnt knew this tbh lol
2026-03-03 02:32:13 +01:00
alufolie91 9ee535066e OpenGL: initialize all FSurfaceInfo´s
seen this a bunch of times now that occasionally something tries to access uninit values from a surface info
since those are really small we just always init them now
2026-03-03 02:31:54 +01:00
alufolie91 6430150b63 fix parts of png info text for screenshots not being null terminated in some cases 2026-03-02 17:53:24 +01:00
alufolie91 16cf4ede89 v_video: generate missing flashpals instead
not sure if this is more sane than the huge ass array from before
but atleast this is more accurate and can basically generate flashpals from any palette while also still working with all the colour and gamma adjustments
prob needs some cleanup idk this is all rather messy lol
2026-03-02 17:23:11 +01:00
alufolie91 efe8732188 fix flashpals throwing random garbage into the renderer in some cases
iirc, if the provided palette currently in use did not provide subpalettes, this will read past the bounds of allocated memory, which aint good lol
i just dumped the white flashpal and threw it into there since idk if -file or autoload gets called before the palette gets initialised, which would carry a risk of copying more garbage, hence this big ass array
2026-03-02 00:44:10 +01:00
alufolie91 07fc0eb03a v_video: fix cv_palettenum bounds check
mhhm yeah
2026-03-02 00:35:19 +01:00
X.organic f2b46fd148 Fix myhashfgets-related buffer overflows in deh_soc.c 2026-03-02 00:35:16 +01:00
alufolie91 8247133966 w_wad: use strnlen to check lump length for map marker
lump name may not be null terminated here, so strlen may read out of bounds garbo
using strnlen ensures we read max 8 characters which is the name buffer size
2026-03-02 00:35:13 +01:00
alufolie91 397fb071e5 fix compiling with valgrind support 2026-03-02 00:35:11 +01:00
alufolie91 1a9fa94cbd Autoload: dont attempt to load directories
lol
2026-03-01 01:04:14 +01:00
alufolie91 e8c7cc6a9b D_AutoloadFile: add overflow safeguard 2026-03-01 01:04:14 +01:00
alufolie91 5ca3ab5966 Autoload: fix incorrectly incrementing wad count
those should only be incremented if we actually add something to the filearray and not instantly execute or error out
2026-03-01 01:04:14 +01:00
indev 1cf04514b3 Fix W_MakeFileMD5 printing incorrect time 2026-03-01 02:31:11 +03:00
alufolie91 5577ba4c7a Autoload: dont add wads that contain maps 2026-03-01 00:03:19 +01:00
alufolie91 6ff1cbf4b0 ok actually just remove keepmusic resume stuff
well now it just broke with dynmusic
this sucks, its probably fixable but the code was abysmal so shrug
2026-02-26 01:11:37 +01:00
alufolie91 db4cd73912 fix keepmusic resuming not resetting with "tunes" command
this code sucks ass wtf was i cooking
if this breaks again i will just wipe it lmao
2026-02-26 01:05:18 +01:00
alufolie91 1ec29c1c94 better flags for ASAN and UBSAN
compile with -O1 and -fno-omit-frame-pointer
-fno-common for ASAN
2026-02-25 21:30:23 +01:00
alufolie91 1e51365cad add comment about K_KartUpdatePosition 2026-02-25 17:45:07 +01:00
alufolie91 94026e4331 makefile: comment out all the "Wno" flags
we effectively fixed all of them, so this does not throw any warnings for me atleast
in case we may screw up id rather have those warnings appear
2026-02-25 17:45:05 +01:00
alufolie91 2084cdc6d5 hw_md2: remove pointless float casts
durs and tics are int32.
and so is var2, anim_duration is uint16 but that still makes no sense lul
2026-02-25 17:10:24 +01:00
alufolie91 1b22c3af19 those should be boolean
just for correctness!
2026-02-25 16:52:47 +01:00
alufolie91 3e327263c9 fix faulty papersprite flipping in opengl
lol
2026-02-25 16:46:58 +01:00
alufolie91 7c24d92613 delet V_GetSkincolorChar
this was unused and broken anyways
think this came from snowy kart or smth
2026-02-25 16:46:55 +01:00
alufolie91 3204b5c3b4 Merge branch 'Saturn-Next' into netstuff 2026-02-23 17:02:32 +01:00
alufolie91 cd02242a01 fix splitscreen clients being unable to join saturn servers
lmao oops idk dumb copy paste sry
2026-02-23 17:02:13 +01:00
Alug 6cbb8a36cf Merge branch 'Saturn-Next' into netstuff 2026-01-21 20:48:47 +01:00
Gustaf Alhäll bf1aa47854 Simplify textcmd handling 2026-01-09 20:53:15 +01:00
Alug be423b2910 Merge branch 'Saturn-Next' into netstuff 2026-01-08 00:34:19 +01:00
Alug 3bf3bdf641 enable "Wzero-as-null-pointer-constant", fix cases of it
prevent ambiguity and bad practices, i like expressive and "correct" code
shoutout blankart for making me aware this exists
2026-01-08 00:34:15 +01:00
Alug e923777eb6 Acessability: add basic "reducevfx" toggle to disable/reduce certain effects
toggles certain effects, which may be troublesome to some players

-disabled hyudoro flashing, instead makes player translucent
- Makes rainbow colour effects, such as invul, change colours very slowly
- Disables underwater and heatwave screen effects
- Disables palette flashing
- Disables vhs effect

not the most pretty implementation, but im lazy and this works

feel free to suggest more things
2026-01-08 00:33:53 +01:00
Alug cf6eb0010e K_SpawnSparkleTrail: check for blend effect apply outside the loop
tiny optimization
2026-01-08 00:33:50 +01:00
Alug 5184115216 enable "Wzero-as-null-pointer-constant", fix cases of it
prevent ambiguity and bad practices, i like expressive and "correct" code
shoutout blankart for making me aware this exists
2026-01-08 00:33:43 +01:00
Alug 39a46e8f79 Revert "Remove tic provision (vanilla compat edition)"
This reverts commit 4a3c9ccfbb.
2025-12-30 01:09:14 +01:00
Alug d9712cf85e Merge branch 'Saturn-Next' into netstuff 2025-12-27 15:13:50 +01:00
Alug 0691e2d9e2 Merge branch 'Saturn-Next' into netstuff 2025-12-27 13:40:19 +01:00
PAS 08864e27b2 Fix double byte-swap in SV_MakeTic 2025-12-26 21:44:39 +01:00
Alug 4a3c9ccfbb Remove tic provision (vanilla compat edition)
based on https://codeberg.org/srb2classic/srb2classic/commit/7cf14fbe740998c3246dd190904f49a236b2ccec

seems to get rid of some jitter in localhost
2025-12-26 21:44:37 +01:00
Alug cedd789a27 Merge branch 'Saturn-Next' into netstuff 2025-12-26 21:44:34 +01:00
Alug 8f91707164 Merge branch 'Saturn-Next' into netstuff 2025-12-09 18:07:06 +01:00
Alug 37eba186f5 netcode: replace some stuff with memsets + add a little bounds safety in some places 2025-12-09 18:07:02 +01:00
Alug 7eb2ad1e35 slightly cleanup SV_AddWaitingPlayers 2025-12-02 23:23:41 +01:00
Alug f49e57a38c d_cliserv: Cleanup PT_ClientJoin
move refuse message handling into its own function
2025-12-02 23:23:38 +01:00
Alug 265f4a50ef readd check for node before SV_SendSaveGame
Apparently in some cases the server will connect to itself, in this case the server tries to send itself the savegame, leading to a crash in some cases. oops
2025-12-02 23:23:36 +01:00
Alug e83e2659a7 reorder packets again 2025-12-02 23:23:29 +01:00
Alug c680dd3222 fix some packet types not being correctly handled 2025-12-02 23:23:15 +01:00
Alug 96aaaf5261 merge SendNameAndColor & SendWeaponPref
TODO: make a bunch of player specific cvars arrays for splitscreen handling

- also cleanup some strlen usage
2025-12-02 23:23:07 +01:00
Alug efb29e6be5 d_cliserv: do some cleanups
- expose SAVEGAMESIZE
- pass node number to SV_AddWaitingPlayers (saves iterating through all 128 net nodes everytime a player joins) lifted from RR
- move all packet handling to the packet handlers
- Reorder packethandling switches a little, so common/important packets get checked first
- fix wrong clamp for realfirsttic that was too early
- add nowtime division by NEWTICRATERATIO (no change unless ticrate changes)
2025-12-02 23:23:02 +01:00
40 changed files with 1519 additions and 1208 deletions

No files matched your search

+3 -3
View File
@@ -269,13 +269,13 @@ endif
ifdef USEASAN
# compile with asan
opts+=-fsanitize=address
opts+=-O1 -fsanitize=address -fno-omit-frame-pointer -fno-common
libs+=-fsanitize=address
endif
ifdef USEUBSAN
# compile with asan
opts+=-fsanitize=undefined
# compile with ubsan
opts+=-O1 -fsanitize=undefined -fno-omit-frame-pointer
libs+=-fsanitize=undefined
endif
+13 -12
View File
@@ -20,7 +20,8 @@ $(foreach v,$(join $(wordlist 2,$(_n),- $(gcc_versions)),\
CXXFLAGS+= -Wno-aggregate-return
# -W -Wno-unused
WFLAGS:=-Wall -Wno-trigraphs -Wnull-dereference
WFLAGS:=-Wall -Wnull-dereference
#WFLAGS+=-Wno-trigraphs
ifdef GCC152
WFLAGS+=-Wzero-as-null-pointer-constant
endif
@@ -31,7 +32,7 @@ ifndef RELAXWARNINGS
WFLAGS+=-W
#WFLAGS+=-Wno-sign-compare
ifndef GCC295
WFLAGS+=-Wno-div-by-zero
# WFLAGS+=-Wno-div-by-zero
endif
#WFLAGS+=-Wsystem-headers
WFLAGS+=-Wfloat-equal
@@ -62,7 +63,7 @@ endif
endif
WFLAGS+=-Wsign-compare
ifdef GCC91
WFLAGS+=-Wno-error=address-of-packed-member
# WFLAGS+=-Wno-error=address-of-packed-member
endif
ifdef GCC45
WFLAGS+=-Wlogical-op
@@ -105,14 +106,14 @@ endif
endif
WFLAGS+=-Wformat-y2k
ifdef GCC71
WFLAGS+=-Wno-error=format-overflow=2
#WFLAGS+=-Wno-error=format-overflow=2
endif
WFLAGS+=-Wformat-security
ifndef GCC29
#WFLAGS+=-Winit-self
endif
ifdef GCC46
WFLAGS+=-Wno-suggest-attribute=noreturn
#WFLAGS+=-Wno-suggest-attribute=noreturn
endif
ifdef NOLDWARNING
@@ -130,21 +131,21 @@ ifdef GCC44
#WFLAGS+=-Wno-error=array-bounds
endif
ifdef GCC46
WFLAGS+=-Wno-error=suggest-attribute=noreturn
# WFLAGS+=-Wno-error=suggest-attribute=noreturn
endif
ifdef GCC54
WFLAGS+=-Wno-logical-op -Wno-error=logical-op
# WFLAGS+=-Wno-logical-op -Wno-error=logical-op
endif
ifdef GCC61
WFLAGS+=-Wno-tautological-compare -Wno-error=tautological-compare
# WFLAGS+=-Wno-tautological-compare -Wno-error=tautological-compare
endif
ifdef GCC71
WFLAGS+=-Wimplicit-fallthrough=4
endif
ifdef GCC81
WFLAGS+=-Wno-error=format-overflow
WFLAGS+=-Wno-format-overflow
WFLAGS+=-Wno-error=multistatement-macros
# WFLAGS+=-Wno-error=format-overflow
# WFLAGS+=-Wno-format-overflow
# WFLAGS+=-Wno-error=multistatement-macros
endif
ifneq (,$(filter $(CC) $(CXX),clang clang++))
@@ -183,6 +184,6 @@ endif
# Lua
ifdef GCC43
ifndef GCC44
WFLAGS+=-Wno-logical-op
#WFLAGS+=-Wno-logical-op
endif
endif
+15 -3
View File
@@ -20,6 +20,7 @@
#define lauxlib_c
#define LUA_LIB
#include "ldebug.h"
#include "lua.h"
#include "lauxlib.h"
@@ -468,8 +469,19 @@ LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) {
LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {
while (l--)
luaL_addchar(B, *s++);
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;
}
}
@@ -686,6 +698,6 @@ static int panic (lua_State *L) {
LUALIB_API lua_State *luaL_newstate (void) {
lua_State *L = lua_newstate(l_alloc, NULL);
if (L) lua_atpanic(L, &panic);
if (l_likely(L)) lua_atpanic(L, &panic);
return L;
}
+13 -12
View File
@@ -790,18 +790,19 @@ 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: 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;
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;
}
default: lua_assert(0);
}
}
+3 -3
View File
@@ -21,13 +21,13 @@
/*
** grep "ORDER OPR" if you change these enums
** grep "ORDER OPR" if you change these enums (ORDER OP)
*/
typedef enum BinOpr {
OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW,
OPR_CONCAT,
OPR_NE, OPR_EQ,
OPR_LT, OPR_LE, OPR_GT, OPR_GE,
OPR_EQ, OPR_LT, OPR_LE,
OPR_NE, OPR_GT, OPR_GE,
OPR_AND, OPR_OR,
OPR_BAND, OPR_BOR, OPR_BXOR,
OPR_BSHL, OPR_BSHR,
+28 -5
View File
@@ -542,16 +542,39 @@ static const char *getobjname (lua_State *L, CallInfo *ci, int stackpos,
static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {
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)];
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 */
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";
}
+2 -2
View File
@@ -164,7 +164,7 @@ void luaD_reallocCI (lua_State *L, int newsize) {
void luaD_growstack (lua_State *L, int n) {
if (l_likely(n <= L->stacksize)) /* double size is enough? */
if (n <= L->stacksize) /* double size is enough? */
luaD_reallocstack(L, 2*L->stacksize);
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->hookmask & LUA_MASKCALL)
if (l_unlikely(L->hookmask & LUA_MASKCALL))
luaD_callhook(L, LUA_HOOKCALL, -1);
lua_unlock(L);
n = (*curr_func(L)->c.f)(L); /* do the actual call */
+10 -9
View File
@@ -356,20 +356,21 @@ static int read_line (lua_State *L, FILE *f) {
static int read_chars (lua_State *L, FILE *f, size_t n) {
size_t rlen; /* how much to read */
size_t nr; /* number of chars actually read */
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 */
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 > n) rlen = n; /* cannot read more than asked */
if (rlen > tbr) rlen = tbr; /* cannot read more than asked */
nr = fread(p, sizeof(char), rlen, f);
luaL_addsize(&b, nr);
n -= nr; /* still have to read `n' chars */
} while (n > 0 && nr == rlen); /* until end of count or eof */
tbr -= nr; /* still have to read 'tbr' chars */
} while (tbr > 0 && nr == rlen); /* until end of count or eof */
luaL_pushresult(&b); /* close buffer */
return (n == 0 || lua_objlen(L, -1) > 0);
return (tbr == 0 || tbr < n); /* true iff read something */
}
@@ -432,13 +433,13 @@ static int f_read (lua_State *L) {
static int io_readline (lua_State *L) {
FILE *f = *(FILE **)lua_touserdata(L, lua_upvalueindex(1));
int sucess;
int success;
if (f == NULL) /* file is already closed? */
luaL_error(L, "file is already closed");
sucess = read_line(L, f);
success = read_line(L, f);
if (ferror(f))
return luaL_error(L, "%s", strerror(errno));
if (sucess) return 1;
if (success) return 1;
else { /* EOF */
if (lua_toboolean(L, lua_upvalueindex(2))) { /* generator created file? */
lua_settop(L, 0);
+4 -4
View File
@@ -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}, /* 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) */
{10, 9}, {5, 4}, /* ^, .. (right associative) */
{3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */
{3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */
{2, 2}, {1, 1} /* and, or */
,{6, 6}, {6, 6}, {6, 6}, /* bit-wise (band/bor/bxor) */
{7, 7}, {7, 7} /* shl/shr */
};
+58 -4
View File
@@ -51,7 +51,7 @@ static TString *newlstr (lua_State *L, const char *str, size_t l,
unsigned int h) {
TString *ts;
stringtable *tb;
if (l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char))
if (l_unlikely(l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char)))
luaM_toobig(L);
ts = cast(TString *, luaM_malloc(L, (l+1)*sizeof(char)+sizeof(TString)));
ts->tsv.len = l;
@@ -72,18 +72,72 @@ static TString *newlstr (lua_State *L, const char *str, size_t l,
}
TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
GCObject *o;
// 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
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
}
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 (l_unlikely(ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0))) {
if (ts->tsv.hash == h &&
ts->tsv.len == l &&
(memcmp(str, getstr(ts), l) == 0)) {
/* string may be dead */
if (isdead(G(L), o)) changewhite(o);
return ts;
+48 -16
View File
@@ -28,7 +28,7 @@
/* limit for table tag-method chains (to avoid loops) */
/* limit for table tag-method chains (to avoid infinite loops) */
#define MAXTAGLOOP 100
@@ -366,6 +366,7 @@ 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)) { \
@@ -392,7 +393,6 @@ void luaV_execute (lua_State *L, int nexeccalls) {
/* 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);
@@ -402,26 +402,28 @@ 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--);
@@ -429,11 +431,13 @@ 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);
@@ -442,10 +446,14 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue;
}
case OP_GETTABLE: {
Protect(luaV_gettable(L, RB(i), RKC(i), ra));
StkId ra = RA(i);
StkId rb = RB(i);
TValue *rc = RKC(i);
Protect(luaV_gettable(L, rb, rc, ra));
continue;
}
case OP_SETGLOBAL: {
StkId ra = RA(i);
TValue g;
sethvalue(L, &g, cl->env);
lua_assert(ttisstring(KBx(i)));
@@ -453,16 +461,21 @@ 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: {
Protect(luaV_settable(L, ra, RKB(i), RKC(i)));
StkId ra = RA(i);
TValue *rb = RKB(i);
TValue *rc = RKC(i);
Protect(luaV_settable(L, ra, rb, rc));
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)));
@@ -470,6 +483,7 @@ void luaV_execute (lua_State *L, int nexeccalls) {
continue;
}
case OP_SELF: {
StkId ra = RA(i);
StkId rb = RB(i);
setobjs2s(L, ra+1, rb);
Protect(luaV_gettable(L, rb, RKC(i), ra));
@@ -488,6 +502,7 @@ 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)) {
@@ -503,6 +518,7 @@ 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)) {
@@ -522,26 +538,27 @@ 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);
@@ -553,6 +570,7 @@ 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);
@@ -564,11 +582,13 @@ 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: {
@@ -626,12 +646,14 @@ 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);
@@ -641,6 +663,7 @@ 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 */
@@ -662,6 +685,7 @@ 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;
@@ -694,6 +718,7 @@ 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);
@@ -709,6 +734,7 @@ 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);
@@ -721,6 +747,7 @@ 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;
@@ -737,6 +764,7 @@ 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);
@@ -753,6 +781,7 @@ 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;
@@ -775,10 +804,12 @@ 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;
@@ -799,6 +830,7 @@ 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;
+347 -319
View File
File diff suppressed because it is too large. Load diff
+5 -3
View File
@@ -654,15 +654,17 @@ void D_ResetTiccmds(void);
tic_t GetLag(INT32 node);
extern UINT8 hu_resynching;
extern boolean hu_resynching;
#ifdef SATURNPAK
extern UINT8 hu_redownloadinggamestate;
extern boolean hu_redownloadinggamestate;
#endif
extern boolean hu_stopped; // kart, true when the game is stopped for players due to a disconnecting or connecting player
#define SAVEGAMESIZE (768*1024)
typedef struct rewind_s
{
UINT8 savebuffer[(768*1024)];
UINT8 savebuffer[SAVEGAMESIZE];
tic_t leveltime;
size_t demopos;
+39 -19
View File
@@ -130,8 +130,8 @@ static size_t startuppwadcount = 0;
// autoloading
static char *autoloadwadfiles[MAX_WADFILES];
static char *autoloadwadfilespost[MAX_WADFILES];
static size_t autoloadcount = 0;
static size_t postloadcount = 0;
static size_t autoloadwadcount = 0;
static size_t postloadwadcount = 0;
//
boolean devparm = false; // started game with -devparm
@@ -1037,25 +1037,38 @@ static INT32 D_DetectFileType(const char* filename)
}
// autoload that shit
static void D_AutoloadFile(const char *file, char **filearray, size_t index)
static void D_AutoloadFile(const char *file, char **filearray, size_t *index)
{
char *newfile;
INT32 fileType = D_DetectFileType(file);
if (*index >= MAX_WADFILES)
{
CONS_Printf("D_AutoloadFile: Failed to add file %s! Too many autoloaded files\n", file);
return;
}
if (!fileType)
{
CONS_Printf("D_AutoloadFile: File %s is unknown or invalid\n", file);
return;
}
if (fileType == 1)
{
CONS_Printf("D_AutoloadFile: File %s is a directory\n", file);
return;
}
if (fileType <= 6)
{
newfile = malloc(strlen(file) + 1);
if (!newfile)
I_Error("No more free memory to AutoloadFile %s",file);
I_Error("D_AutoloadFile: No more free memory to autoload file %s", file);
strcpy(newfile, file);
filearray[index] = newfile;
filearray[*index] = newfile;
(*index)++;
}
else
{
@@ -1098,7 +1111,7 @@ static void D_FindAddonsToAutoload(void)
// If the file is found, run our shit
if (!autoloadconfigfile) // nope outta here
{
autoloadcount = postloadcount = 0; // so D_AddAutoloadFiles can skip everything since nothings there to autoload
autoloadwadcount = postloadwadcount = 0; // so D_AddAutoloadFiles can skip everything since nothings there to autoload
return;
}
@@ -1124,27 +1137,34 @@ static void D_FindAddonsToAutoload(void)
if (newline)
*newline = '\0';
// ok so theres still issues with players adding stuff to autoload by accident
// sometimes this stuff contains maps
// you can probably imagine how that goes in a netgame....
if (W_CheckAutoLoadContainsMap(wadsToAutoload))
{
CONS_Printf("Autoload: file %s contains map data! skipping...", wadsToAutoload);
continue;
}
if (!postload && W_CheckPostLoadList(wadsToAutoload))
{
CONS_Printf("forcing postload for file %s\n", wadsToAutoload);
CONS_Printf("Autoload: forcing postload for file %s\n", wadsToAutoload);
postload = true;
}
// LOAD IT
if (!postload)
{
D_AutoloadFile(wadsToAutoload, autoloadwadfiles, autoloadcount);
autoloadcount++;
D_AutoloadFile(wadsToAutoload, autoloadwadfiles, &autoloadwadcount);
}
else
{
D_AutoloadFile(wadsToAutoload, autoloadwadfilespost, postloadcount);
postloadcount++;
D_AutoloadFile(wadsToAutoload, autoloadwadfilespost, &postloadwadcount);
}
}
autoloadwadfiles[autoloadcount] = NULL;
autoloadwadfilespost[postloadcount] = NULL;
autoloadwadfiles[autoloadwadcount] = NULL;
autoloadwadfilespost[postloadwadcount] = NULL;
// we dont want memory leaks around here do we?
fclose(autoloadconfigfile);
@@ -1153,7 +1173,7 @@ static void D_FindAddonsToAutoload(void)
static void D_AddAutoloadFiles(void)
{
// nothing to autoload
if (autoloadcount == 0)
if (autoloadwadcount == 0)
return;
CONS_Printf("D_AutoloadFile(): Loading autoloaded addons...\n");
@@ -1161,15 +1181,15 @@ static void D_AddAutoloadFiles(void)
if (W_AddAutoloadedLocalFiles(autoloadwadfiles) == 0)
CONS_Printf("D_AutoloadFile(): Are you sure you put in valid files or what?\n");
D_CleanFile(autoloadwadfiles, autoloadcount);
D_CleanFile(autoloadwadfiles, autoloadwadcount);
autoloadcount = 0;
autoloadwadcount = 0;
}
void D_AddPostloadFiles(void)
{
// nothing to postload
if (postloadcount == 0 || !netgame)
if (postloadwadcount == 0 || !netgame)
return;
CONS_Printf("D_AddPostloadFiles(): Loading postloaded addons...\n");
@@ -1177,9 +1197,9 @@ void D_AddPostloadFiles(void)
if (W_AddAutoloadedLocalFiles(autoloadwadfilespost) == 0)
CONS_Printf("D_AddPostloadFiles(): Are you sure you put in valid files or what?\n");
D_CleanFile(autoloadwadfilespost, postloadcount);
D_CleanFile(autoloadwadfilespost, postloadwadcount);
postloadcount = 0;
postloadwadcount = 0;
}
// ==========================================================================
+1 -5
View File
@@ -612,12 +612,8 @@ void Net_WaitAllAckReceived(UINT32 timeout)
static void InitNode(node_t *node)
{
node->acktosend_head = node->acktosend_tail = 0;
memset(node->acktosend, 0, sizeof(node->acktosend));
node->firstacktosend = 0;
memset(node, 0, sizeof(node_t));
node->nextacknum = 1;
node->remotefirstack = 0;
node->flags = 0;
}
static void InitAck(void)
+144 -482
View File
@@ -1208,11 +1208,11 @@ static boolean AllowedPlayerNameChar(char ch)
static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
{
INT32 ix;
size_t ix, len = strlen(name);
if (strlen(name) == 0 || strlen(name) > MAXPLAYERNAME)
if (len == 0 || len > MAXPLAYERNAME)
return false; // Empty or too long.
if (name[0] == ' ' || name[strlen(name)-1] == ' ')
if (name[0] == ' ' || name[len-1] == ' ')
return false; // Starts or ends with a space.
if (isdigit(name[0]))
return false; // Starts with a digit.
@@ -1226,20 +1226,19 @@ static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
// Also, anything over 0x80 is disallowed too, since compilers love to
// differ on whether they're printable characters or not.
for (ix = 0; name[ix] != '\0'; ix++)
for (ix = 0; ix < len; ix++)
if (!AllowedPlayerNameChar(name[ix]))
return false;
// Check if a player is currently using the name, case-insensitively.
for (ix = 0; ix < MAXPLAYERS; ix++)
{
if (ix != playernum && playeringame[ix]
if (ix != (size_t)playernum && playeringame[ix]
&& fasticmp(name, player_names[ix]))
{
// We shouldn't kick people out just because
// they joined the game with the same name
// as someone else -- modify the name instead.
size_t len = strlen(name);
// Recursion!
// Slowly strip characters off the end of the
@@ -1458,7 +1457,9 @@ UINT8 CanChangeSkin(INT32 playernum)
return true;
}
if (players[playernum].spectator || players[playernum].playerstate == PST_DEAD || players[playernum].playerstate == PST_REBORN)
if (players[playernum].spectator ||
players[playernum].playerstate == PST_DEAD ||
players[playernum].playerstate == PST_REBORN)
return true;
return false;
@@ -1492,445 +1493,144 @@ static void ForceAllSkins(INT32 forcedskin)
}
}
static INT32 snacpending = 0, snac2pending = 0, snac3pending = 0, snac4pending = 0, chmappending = 0;
static INT32 chmappending;
static INT32 snacpending[MAXSPLITSCREENPLAYERS];
// wonky compat, idk if anything uses this....
#define playerisbot (splitplayer == 1 && botingame)
// name, color, or skin has changed
//
static void SendNameAndColor(void)
static void SendNameAndColor(UINT8 splitplayer)
{
char buf[MAXPLAYERNAME+2];
char *p;
p = buf;
// splitscreen
if (splitscreen < splitplayer && !playerisbot)
return;
const INT32 pnum = P_GetLocalPlayerNumForNum(splitplayer);
player_t *player = &players[pnum];
// TODO: make those cvars arrays
consvar_t *playercolor, *playername, *playerskin;
consvar_t *colorvars[] = {&cv_playercolor, &cv_playercolor2, &cv_playercolor3, &cv_playercolor4};
consvar_t *namevars[] = {&cv_playername, &cv_playername2, &cv_playername3, &cv_playername4};
consvar_t *skinvars[] = {&cv_skin, &cv_skin2, &cv_skin3, &cv_skin4};
playercolor = colorvars[splitplayer];
playername = namevars[splitplayer];
playerskin = skinvars[splitplayer];
// normal player colors
if (G_GametypeHasTeams())
{
if (players[consoleplayer].ctfteam == 1 && cv_playercolor.value != skincolor_redteam)
CV_StealthSetValue(&cv_playercolor, skincolor_redteam);
else if (players[consoleplayer].ctfteam == 2 && cv_playercolor.value != skincolor_blueteam)
CV_StealthSetValue(&cv_playercolor, skincolor_blueteam);
if (player->ctfteam == 1 && playercolor->value != skincolor_redteam)
CV_StealthSetValue(playercolor, skincolor_redteam);
else if (player->ctfteam == 2 && playercolor->value != skincolor_blueteam)
CV_StealthSetValue(playercolor, skincolor_blueteam);
}
// never allow the color "none"
if (!cv_playercolor.value)
if (!playercolor->value)
{
if (players[consoleplayer].skincolor)
CV_StealthSetValue(&cv_playercolor, players[consoleplayer].skincolor);
else if (skins[players[consoleplayer].skin].prefcolor)
CV_StealthSetValue(&cv_playercolor, skins[players[consoleplayer].skin].prefcolor);
if (player->skincolor)
CV_StealthSetValue(playercolor, player->skincolor);
else if (skins[player->skin].prefcolor)
CV_StealthSetValue(playercolor, skins[player->skin].prefcolor);
else
CV_StealthSet(&cv_playercolor, cv_playercolor.defaultvalue);
CV_StealthSet(playercolor, playercolor->defaultvalue);
}
if (fastcmp(cv_playername.string, player_names[consoleplayer])
&& cv_playercolor.value == players[consoleplayer].skincolor
&& fastcmp(cv_skin.string, skins[players[consoleplayer].skin].name))
return;
// We'll handle it later if we're not playing.
if (!Playing())
return;
if (fastcmp(playername->string, player_names[pnum])
&& playercolor->value == player->skincolor
&& fastcmp(playerskin->string, skins[player->skin].name))
return;
if (playerisbot)
{
players[pnum].skincolor = botcolor;
if (players[pnum].mo)
players[pnum].mo->color = players[pnum].skincolor;
SetPlayerSkinByNum(pnum, botskin-1);
return;
}
// If you're not in a netgame, merely update the skin, color, and name.
if (!netgame)
{
INT32 foundskin;
CleanupPlayerName(consoleplayer, cv_playername.zstring);
strcpy(player_names[consoleplayer], cv_playername.zstring);
CleanupPlayerName(pnum, playername->zstring);
strcpy(player_names[pnum], playername->zstring);
players[consoleplayer].skincolor = cv_playercolor.value;
player->skincolor = playercolor->value;
if (players[consoleplayer].mo)
players[consoleplayer].mo->color = players[consoleplayer].skincolor;
if (player->mo)
player->mo->color = player->skincolor;
if ((foundskin = R_SkinAvailable(cv_skin.string)) != -1)
if ((foundskin = R_SkinAvailable(playerskin->string)) != -1)
{
cv_skin.value = foundskin;
SetPlayerSkin(consoleplayer, cv_skin.string);
CV_StealthSet(&cv_skin, skins[cv_skin.value].name);
playerskin->value = foundskin;
SetPlayerSkin(pnum, playerskin->string);
CV_StealthSet(playerskin, skins[playerskin->value].name);
}
else
{
cv_skin.value = players[consoleplayer].skin;
CV_StealthSet(&cv_skin, skins[players[consoleplayer].skin].name);
playerskin->value = player->skin;
CV_StealthSet(playerskin, skins[player->skin].name);
// will always be same as current
SetPlayerSkin(consoleplayer, cv_skin.string);
SetPlayerSkin(pnum, playerskin->string);
}
return;
}
snacpending++;
snacpending[splitplayer]++;
// Don't change name if muted
if (player_name_changes[consoleplayer] >= MAXNAMECHANGES)
if (player_name_changes[pnum] >= MAXNAMECHANGES)
{
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
CV_StealthSet(playername, player_names[pnum]);
HU_AddChatText("\x85*You must wait to change your name again", false);
}
else if (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer)))
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
else if (cv_mute.value && !(server || IsPlayerAdmin(pnum)))
CV_StealthSet(playername, player_names[pnum]);
else // Cleanup name if changing it
CleanupPlayerName(consoleplayer, cv_playername.zstring);
CleanupPlayerName(pnum, playername->zstring);
// Don't change skin if the server doesn't want you to.
if (!CanChangeSkin(consoleplayer))
CV_StealthSet(&cv_skin, skins[players[consoleplayer].skin].name);
if (!CanChangeSkin(pnum))
CV_StealthSet(playerskin, skins[player->skin].name);
// check if player has the skin loaded (cv_skin may have
// the name of a skin that was available in the previous game)
cv_skin.value = R_SkinAvailable(cv_skin.string);
if (cv_skin.value < 0)
playerskin->value = R_SkinAvailable(playerskin->string);
if (playerskin->value < 0)
{
INT32 skinnum = players[consoleplayer].skin;
CV_StealthSet(&cv_skin, skins[skinnum].name);
cv_skin.value = skinnum;
INT32 skinnum = player->skin;
CV_StealthSet(playerskin, skins[skinnum].name);
playerskin->value = skinnum;
}
// Finally write out the complete packet and send it off.
WRITESTRINGN(p, cv_playername.zstring, MAXPLAYERNAME);
WRITEUINT8(p, (UINT8)cv_playercolor.value);
WRITEUINT8(p, (UINT8)cv_skin.value);
SendNetXCmdForPlayer(0, XD_NAMEANDCOLOR, buf, p - buf);
}
// splitscreen
static void SendNameAndColor2(void)
{
INT32 secondplaya = -1;
char buf[MAXPLAYERNAME+2];
char *p;
if (splitscreen < 1 && !botingame)
return; // can happen if skin2/color2/name2 changed
if (displayplayers[1] != consoleplayer)
secondplaya = displayplayers[1];
else if (!netgame) // HACK
secondplaya = 1;
if (secondplaya == -1)
return;
p = buf;
// normal player colors
if (G_GametypeHasTeams())
{
if (players[secondplaya].ctfteam == 1 && cv_playercolor2.value != skincolor_redteam)
CV_StealthSetValue(&cv_playercolor2, skincolor_redteam);
else if (players[secondplaya].ctfteam == 2 && cv_playercolor2.value != skincolor_blueteam)
CV_StealthSetValue(&cv_playercolor2, skincolor_blueteam);
}
// never allow the color "none"
if (!cv_playercolor2.value)
{
if (players[secondplaya].skincolor)
CV_StealthSetValue(&cv_playercolor2, players[secondplaya].skincolor);
else if (skins[players[secondplaya].skin].prefcolor)
CV_StealthSetValue(&cv_playercolor2, skins[players[secondplaya].skin].prefcolor);
else
CV_StealthSet(&cv_playercolor2, cv_playercolor2.defaultvalue);
}
// We'll handle it later if we're not playing.
if (!Playing())
return;
// If you're not in a netgame, merely update the skin, color, and name.
if (botingame)
{
players[secondplaya].skincolor = botcolor;
if (players[secondplaya].mo)
players[secondplaya].mo->color = players[secondplaya].skincolor;
SetPlayerSkinByNum(secondplaya, botskin-1);
return;
}
else if (!netgame)
{
INT32 foundskin;
CleanupPlayerName(secondplaya, cv_playername2.zstring);
strcpy(player_names[secondplaya], cv_playername2.zstring);
// don't use displayplayers[1]: the second player must be 1
players[secondplaya].skincolor = cv_playercolor2.value;
if (players[secondplaya].mo)
players[secondplaya].mo->color = players[secondplaya].skincolor;
if ((foundskin = R_SkinAvailable(cv_skin2.string)) != -1)
{
cv_skin2.value = foundskin;
SetPlayerSkin(secondplaya, cv_skin2.string);
}
else
{
cv_skin2.value = players[secondplaya].skin;
CV_StealthSet(&cv_skin2, skins[players[secondplaya].skin].name);
// will always be same as current
SetPlayerSkin(secondplaya, cv_skin2.string);
}
return;
}
snac2pending++;
// Don't change name if muted
if (player_name_changes[displayplayers[1]] >= MAXNAMECHANGES)
{
CV_StealthSet(&cv_playername2, player_names[displayplayers[1]]);
HU_AddChatText("\x85*You must wait to change your name again", false);
}
else if (cv_mute.value && !(server || IsPlayerAdmin(displayplayers[1])))
CV_StealthSet(&cv_playername2, player_names[displayplayers[1]]);
else // Cleanup name if changing it
CleanupPlayerName(displayplayers[1], cv_playername2.zstring);
// Don't change skin if the server doesn't want you to.
if (!CanChangeSkin(displayplayers[1]))
CV_StealthSet(&cv_skin2, skins[players[displayplayers[1]].skin].name);
// check if player has the skin loaded (cv_skin2 may have
// the name of a skin that was available in the previous game)
cv_skin2.value = R_SkinAvailable(cv_skin2.string);
if (cv_skin2.value < 0)
{
INT32 skinnum = players[displayplayers[1]].skin;
CV_StealthSet(&cv_skin2, skins[skinnum].name);
cv_skin2.value = skinnum;
}
// Finally write out the complete packet and send it off.
WRITESTRINGN(p, cv_playername2.zstring, MAXPLAYERNAME);
WRITEUINT8(p, (UINT8)cv_playercolor2.value);
WRITEUINT8(p, (UINT8)cv_skin2.value);
SendNetXCmdForPlayer(1, XD_NAMEANDCOLOR, buf, p - buf);
}
static void SendNameAndColor3(void)
{
INT32 thirdplaya = -1;
char buf[MAXPLAYERNAME+2];
char *p;
if (splitscreen < 2)
return; // can happen if skin3/color3/name3 changed
if (displayplayers[2] != consoleplayer)
thirdplaya = displayplayers[2];
else if (!netgame) // HACK
thirdplaya = 2;
if (thirdplaya == -1)
return;
p = buf;
// normal player colors
if (G_GametypeHasTeams())
{
if (players[thirdplaya].ctfteam == 1 && cv_playercolor3.value != skincolor_redteam)
CV_StealthSetValue(&cv_playercolor3, skincolor_redteam);
else if (players[thirdplaya].ctfteam == 2 && cv_playercolor3.value != skincolor_blueteam)
CV_StealthSetValue(&cv_playercolor3, skincolor_blueteam);
}
// never allow the color "none"
if (!cv_playercolor3.value)
{
if (players[thirdplaya].skincolor)
CV_StealthSetValue(&cv_playercolor3, players[thirdplaya].skincolor);
else if (skins[players[thirdplaya].skin].prefcolor)
CV_StealthSetValue(&cv_playercolor3, skins[players[thirdplaya].skin].prefcolor);
else
CV_StealthSet(&cv_playercolor3, cv_playercolor3.defaultvalue);
}
// We'll handle it later if we're not playing.
if (!Playing())
return;
// If you're not in a netgame, merely update the skin, color, and name.
if (!netgame)
{
INT32 foundskin;
CleanupPlayerName(thirdplaya, cv_playername3.zstring);
strcpy(player_names[thirdplaya], cv_playername3.zstring);
// don't use displayplayers[2]: the third player must be 2
players[thirdplaya].skincolor = cv_playercolor3.value;
if (players[thirdplaya].mo)
players[thirdplaya].mo->color = players[thirdplaya].skincolor;
if ((foundskin = R_SkinAvailable(cv_skin3.string)) != -1)
{
cv_skin3.value = foundskin;
SetPlayerSkin(thirdplaya, cv_skin3.string);
}
else
{
cv_skin3.value = players[thirdplaya].skin;
CV_StealthSet(&cv_skin3, skins[players[thirdplaya].skin].name);
// will always be same as current
SetPlayerSkin(thirdplaya, cv_skin3.string);
}
return;
}
snac3pending++;
// Don't change name if muted
if (player_name_changes[displayplayers[2]] >= MAXNAMECHANGES)
{
CV_StealthSet(&cv_playername3, player_names[displayplayers[2]]);
HU_AddChatText("\x85*You must wait to change your name again", false);
}
else if (cv_mute.value && !(server || IsPlayerAdmin(displayplayers[2])))
CV_StealthSet(&cv_playername3, player_names[displayplayers[2]]);
else // Cleanup name if changing it
CleanupPlayerName(displayplayers[2], cv_playername3.zstring);
// Don't change skin if the server doesn't want you to.
if (!CanChangeSkin(displayplayers[2]))
CV_StealthSet(&cv_skin3, skins[players[displayplayers[2]].skin].name);
// check if player has the skin loaded (cv_skin3 may have
// the name of a skin that was available in the previous game)
cv_skin3.value = R_SkinAvailable(cv_skin3.string);
if (cv_skin3.value < 0)
{
INT32 skinnum = players[displayplayers[2]].skin;
CV_StealthSet(&cv_skin3, skins[skinnum].name);
cv_skin3.value = skinnum;
}
// Finally write out the complete packet and send it off.
WRITESTRINGN(p, cv_playername3.zstring, MAXPLAYERNAME);
WRITEUINT8(p, (UINT8)cv_playercolor3.value);
WRITEUINT8(p, (UINT8)cv_skin3.value);
SendNetXCmdForPlayer(2, XD_NAMEANDCOLOR, buf, p - buf);
}
static void SendNameAndColor4(void)
{
INT32 fourthplaya = -1;
char buf[MAXPLAYERNAME+2];
char *p;
if (splitscreen < 3)
return; // can happen if skin4/color4/name4 changed
if (displayplayers[3] != consoleplayer)
fourthplaya = displayplayers[3];
else if (!netgame) // HACK
fourthplaya = 3;
if (fourthplaya == -1)
return;
p = buf;
// normal player colors
if (G_GametypeHasTeams())
{
if (players[fourthplaya].ctfteam == 1 && cv_playercolor4.value != skincolor_redteam)
CV_StealthSetValue(&cv_playercolor4, skincolor_redteam);
else if (players[fourthplaya].ctfteam == 2 && cv_playercolor4.value != skincolor_blueteam)
CV_StealthSetValue(&cv_playercolor4, skincolor_blueteam);
}
// never allow the color "none"
if (!cv_playercolor4.value)
{
if (players[fourthplaya].skincolor)
CV_StealthSetValue(&cv_playercolor4, players[fourthplaya].skincolor);
else if (skins[players[fourthplaya].skin].prefcolor)
CV_StealthSetValue(&cv_playercolor4, skins[players[fourthplaya].skin].prefcolor);
else
CV_StealthSet(&cv_playercolor4, cv_playercolor4.defaultvalue);
}
// We'll handle it later if we're not playing.
if (!Playing())
return;
// If you're not in a netgame, merely update the skin, color, and name.
if (botingame)
{
players[fourthplaya].skincolor = botcolor;
if (players[fourthplaya].mo)
players[fourthplaya].mo->color = players[fourthplaya].skincolor;
SetPlayerSkinByNum(fourthplaya, botskin-1);
return;
}
else if (!netgame)
{
INT32 foundskin;
CleanupPlayerName(fourthplaya, cv_playername4.zstring);
strcpy(player_names[fourthplaya], cv_playername4.zstring);
// don't use displayplayers[3]: the second player must be 4
players[fourthplaya].skincolor = cv_playercolor4.value;
if (players[fourthplaya].mo)
players[fourthplaya].mo->color = players[fourthplaya].skincolor;
if ((foundskin = R_SkinAvailable(cv_skin4.string)) != -1)
{
cv_skin4.value = foundskin;
SetPlayerSkin(fourthplaya, cv_skin4.string);
}
else
{
cv_skin4.value = players[fourthplaya].skin;
CV_StealthSet(&cv_skin4, skins[players[fourthplaya].skin].name);
// will always be same as current
SetPlayerSkin(fourthplaya, cv_skin4.string);
}
return;
}
snac4pending++;
// Don't change name if muted
if (player_name_changes[displayplayers[3]] >= MAXNAMECHANGES)
{
CV_StealthSet(&cv_playername4, player_names[displayplayers[3]]);
HU_AddChatText("\x85*You must wait to change your name again", false);
}
else if (cv_mute.value && !(server || IsPlayerAdmin(displayplayers[3])))
CV_StealthSet(&cv_playername4, player_names[displayplayers[3]]);
else // Cleanup name if changing it
CleanupPlayerName(displayplayers[3], cv_playername4.zstring);
// Don't change skin if the server doesn't want you to.
if (!CanChangeSkin(displayplayers[3]))
CV_StealthSet(&cv_skin4, skins[players[displayplayers[3]].skin].name);
// check if player has the skin loaded (cv_skin4 may have
// the name of a skin that was available in the previous game)
cv_skin4.value = R_SkinAvailable(cv_skin4.string);
if (cv_skin4.value < 0)
{
INT32 skinnum = players[displayplayers[3]].skin;
CV_StealthSet(&cv_skin4, skins[skinnum].name);
cv_skin4.value = skinnum;
}
// Finally write out the complete packet and send it off.
WRITESTRINGN(p, cv_playername4.zstring, MAXPLAYERNAME);
WRITEUINT8(p, (UINT8)cv_playercolor4.value);
WRITEUINT8(p, (UINT8)cv_skin4.value);
SendNetXCmdForPlayer(3, XD_NAMEANDCOLOR, buf, p - buf);
WRITESTRINGN(p, playername->zstring, MAXPLAYERNAME);
WRITEUINT8(p, (UINT8)playercolor->value);
WRITEUINT8(p, (UINT8)playerskin->value);
SendNetXCmdForPlayer(splitplayer, XD_NAMEANDCOLOR, buf, p - buf);
}
static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
{
player_t *p = &players[playernum];
player_t *player = &players[playernum];
char name[MAXPLAYERNAME+1];
UINT8 color, skin;
@@ -1939,19 +1639,14 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
I_Error("There is no player %d!", playernum);
#endif
if (playernum == consoleplayer)
snacpending--; // TODO: make snacpending an array instead of 4 separate vars?
else if (playernum == displayplayers[1])
snac2pending--;
else if (playernum == displayplayers[2])
snac3pending--;
else if (playernum == displayplayers[3])
snac4pending--;
if (P_IsLocalPlayer(player))
{
snacpending[playernum]--;
#ifdef PARANOIA
if (snacpending < 0 || snac2pending < 0 || snac3pending < 0 || snac4pending < 0)
I_Error("snacpending negative!");
if (snacpending[playernum] < 0)
I_Error("snacpending negative!");
#endif
}
READSTRINGN(*cp, name, MAXPLAYERNAME);
color = READUINT8(*cp);
@@ -1965,33 +1660,32 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
}
// set color
p->skincolor = color % MAXSKINCOLORS;
if (p->mo)
p->mo->color = (UINT8)p->skincolor;
player->skincolor = color % MAXSKINCOLORS;
if (player->mo)
player->mo->color = (UINT8)player->skincolor;
demo_extradata[playernum] |= DXD_COLOR;
// normal player colors
if (server && (p != &players[consoleplayer] && p != &players[displayplayers[1]]
&& p != &players[displayplayers[2]] && p != &players[displayplayers[3]]))
if (server && !P_IsLocalPlayer(player))
{
boolean kick = false;
// team colors
if (G_GametypeHasTeams())
{
if (p->ctfteam == 1 && p->skincolor != skincolor_redteam)
if (player->ctfteam == 1 && player->skincolor != skincolor_redteam)
kick = true;
else if (p->ctfteam == 2 && p->skincolor != skincolor_blueteam)
else if (player->ctfteam == 2 && player->skincolor != skincolor_blueteam)
kick = true;
}
// don't allow color "none"
if (!p->skincolor)
if (!player->skincolor)
kick = true;
if (kick)
{
CONS_Alert(CONS_WARNING, M_GetText("Illegal color change received from %s (team: %d), color: %d)\n"), player_names[playernum], p->ctfteam, p->skincolor);
CONS_Alert(CONS_WARNING, M_GetText("Illegal color change received from %s (team: %d), color: %d)\n"), player_names[playernum], player->ctfteam, player->skincolor);
SendKick(playernum, KICK_MSG_CON_FAIL);
return;
}
@@ -2003,6 +1697,7 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
const INT32 forcedskin = cv_forceskin.value;
SetPlayerSkinByNum(playernum, forcedskin);
// TODO: make cv_skin an array
if (playernum == consoleplayer)
CV_StealthSet(&cv_skin, skins[forcedskin].name);
else if (playernum == displayplayers[1])
@@ -2016,44 +1711,16 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
SetPlayerSkinByNum(playernum, skin);
}
void SendWeaponPref(void)
void SendWeaponPref(UINT8 splitplayer)
{
UINT8 buf[1];
buf[0] = 0;
if (cv_flipcam[0].value)
if (cv_flipcam[splitplayer].value)
buf[0] |= 1;
SendNetXCmdForPlayer(0, XD_WEAPONPREF, buf, 1);
}
void SendWeaponPref2(void)
{
UINT8 buf[1];
buf[0] = 0;
if (cv_flipcam[1].value)
buf[0] |= 1;
SendNetXCmdForPlayer(1, XD_WEAPONPREF, buf, 1);
}
void SendWeaponPref3(void)
{
UINT8 buf[1];
buf[0] = 0;
if (cv_flipcam[2].value)
buf[0] |= 1;
SendNetXCmdForPlayer(2, XD_WEAPONPREF, buf, 1);
}
void SendWeaponPref4(void)
{
UINT8 buf[1];
buf[0] = 0;
if (cv_flipcam[3].value)
buf[0] |= 1;
SendNetXCmdForPlayer(3, XD_WEAPONPREF, buf, 1);
SendNetXCmdForPlayer(splitplayer, XD_WEAPONPREF, buf, 1);
}
static void Got_WeaponPref(const UINT8 **cp, INT32 playernum)
@@ -2069,23 +1736,10 @@ static void Got_WeaponPref(const UINT8 **cp, INT32 playernum)
player->pflags |= PF_ANALOGMODE;
}
void D_SendPlayerConfig(void)
void D_SendPlayerConfig(UINT8 splitplayer)
{
SendNameAndColor();
if (splitscreen || botingame)
SendNameAndColor2();
if (splitscreen > 1)
SendNameAndColor3();
if (splitscreen > 2)
SendNameAndColor4();
SendWeaponPref();
if (splitscreen)
SendWeaponPref2();
if (splitscreen > 1)
SendWeaponPref3();
if (splitscreen > 2)
SendWeaponPref4();
SendNameAndColor(splitplayer);
SendWeaponPref(splitplayer);
}
// Only works for displayplayer, sorry!
@@ -2108,10 +1762,12 @@ INT32 D_LookupPlayer(const char *s)
return playernum;
}
const size_t len = strlen(s);
for (playernum = 0; playernum < MAXPLAYERS; ++playernum)
{
/* Match name case-insensitively: fully, or partially the start. */
if (playeringame[playernum] && (strnicmp(player_names[playernum], s, strlen(s)) == 0))
if (playeringame[playernum] && (strnicmp(player_names[playernum], s, len) == 0))
{
return playernum;
}
@@ -2151,13 +1807,15 @@ static void GetViewablePlayerPlaceRange(INT32 *first, INT32 *last)
(*last) = 0;
for (i = 0; i < MAXPLAYERS; ++i)
if (G_CouldView(i))
{
place = players[i].kartstuff[k_position];
if (place < (*first))
(*first) = place;
if (place > (*last))
(*last) = place;
if (G_CouldView(i))
{
place = players[i].kartstuff[k_position];
if (place < (*first))
(*first) = place;
if (place > (*last))
(*last) = place;
}
}
}
@@ -2491,7 +2149,7 @@ void D_MapChange(INT32 mapnum, INT32 newgametype, boolean pencoremode, boolean r
displayplayers[1] = 1;
playeringame[1] = true;
players[1].bot = 1;
SendNameAndColor2();
SendNameAndColor(1);
}
}
@@ -5768,50 +5426,54 @@ static void ForceSkin_OnChange(void)
}
}
//Allows the player's name to be changed if cv_mute is off.
// Allows the player's name to be changed if cv_mute is off.
static void Name_OnChange(void)
{
if (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer)))
{
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
return;
}
else
SendNameAndColor();
SendNameAndColor(0);
}
static void Name2_OnChange(void)
{
if (cv_mute.value) //Secondary player can't be admin.
if (cv_mute.value) // Secondary player can't be admin.
{
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
CV_StealthSet(&cv_playername2, player_names[displayplayers[1]]);
return;
}
else
SendNameAndColor2();
SendNameAndColor(1);
}
static void Name3_OnChange(void)
{
if (cv_mute.value) //Third player can't be admin.
if (cv_mute.value) // Third player can't be admin.
{
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
CV_StealthSet(&cv_playername3, player_names[displayplayers[2]]);
return;
}
else
SendNameAndColor3();
SendNameAndColor(2);
}
static void Name4_OnChange(void)
{
if (cv_mute.value) //Secondary player can't be admin.
if (cv_mute.value) // Secondary player can't be admin.
{
CONS_Alert(CONS_NOTICE, M_GetText("You may not change your name when chat is muted.\n"));
CV_StealthSet(&cv_playername4, player_names[displayplayers[3]]);
return;
}
else
SendNameAndColor4();
SendNameAndColor(3);
}
/** Sends a skin change for the console player, unless that player is moving.
@@ -5833,7 +5495,7 @@ static void Skin_OnChange(void)
}
if (CanChangeSkin(consoleplayer) && !P_PlayerMoving(consoleplayer))
SendNameAndColor();
SendNameAndColor(0);
else
{
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
@@ -5854,7 +5516,7 @@ static void Skin2_OnChange(void)
return; // do whatever you want
if (CanChangeSkin(displayplayers[1]) && !P_PlayerMoving(displayplayers[1]))
SendNameAndColor2();
SendNameAndColor(1);
else
{
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
@@ -5870,7 +5532,7 @@ static void Skin3_OnChange(void)
return; // do whatever you want
if (CanChangeSkin(displayplayers[2]) && !P_PlayerMoving(displayplayers[2]))
SendNameAndColor3();
SendNameAndColor(2);
else
{
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
@@ -5886,7 +5548,7 @@ static void Skin4_OnChange(void)
return; // do whatever you want
if (CanChangeSkin(displayplayers[3]) && !P_PlayerMoving(displayplayers[3]))
SendNameAndColor4();
SendNameAndColor(3);
else
{
CONS_Alert(CONS_NOTICE, M_GetText("You can't change your skin at the moment.\n"));
@@ -5999,7 +5661,7 @@ static void Color_OnChange(void)
if (!P_PlayerMoving(consoleplayer))
{
// Color change menu scrolling fix is no longer necessary
SendNameAndColor();
SendNameAndColor(0);
}
else
{
@@ -6021,7 +5683,7 @@ static void Color2_OnChange(void)
if (!P_PlayerMoving(displayplayers[1]))
{
// Color change menu scrolling fix is no longer necessary
SendNameAndColor2();
SendNameAndColor(1);
}
else
{
@@ -6038,7 +5700,7 @@ static void Color3_OnChange(void)
if (!P_PlayerMoving(displayplayers[2]))
{
// Color change menu scrolling fix is no longer necessary
SendNameAndColor3();
SendNameAndColor(2);
}
else
{
@@ -6055,7 +5717,7 @@ static void Color4_OnChange(void)
if (!P_PlayerMoving(displayplayers[3]))
{
// Color change menu scrolling fix is no longer necessary
SendNameAndColor4();
SendNameAndColor(3);
}
else
{
+2 -5
View File
@@ -21,10 +21,7 @@ extern "C" {
#include "command.h"
void SendWeaponPref(void);
void SendWeaponPref2(void);
void SendWeaponPref3(void);
void SendWeaponPref4(void);
void SendWeaponPref(UINT8 splitplayer);
// console vars
extern consvar_t cv_playername;
@@ -295,7 +292,7 @@ typedef union {
// add game commands, needs cleanup
void D_RegisterServerCommands(void);
void D_RegisterClientCommands(void);
void D_SendPlayerConfig(void);
void D_SendPlayerConfig(UINT8 splitplayer);
void Command_ExitGame_f(void);
void Command_Retry_f(void);
void D_GameTypeChanged(INT32 lastgametype); // not a real _OnChange function anymore
+16 -16
View File
@@ -960,7 +960,7 @@ void Got_Filetxpak(void)
|| fastcmp(filename, "music.kart")
|| fastcmp(filename, "patch.kart")
))
I_Error("Tried to download \"%s\"", filename);
I_Error("Tried to download base-game file: \"%s\"", filename);
if (filenum >= fileneedednum)
{
@@ -1019,21 +1019,21 @@ void Got_Filetxpak(void)
switch(file->status)
{
case FS_NOTFOUND:
s = "FS_NOTFOUND";
break;
case FS_FOUND:
s = "FS_FOUND";
break;
case FS_OPEN:
s = "FS_OPEN";
break;
case FS_MD5SUMBAD:
s = "FS_MD5SUMBAD";
break;
default:
s = "unknown";
break;
case FS_NOTFOUND:
s = "FS_NOTFOUND";
break;
case FS_FOUND:
s = "FS_FOUND";
break;
case FS_OPEN:
s = "FS_OPEN";
break;
case FS_MD5SUMBAD:
s = "FS_MD5SUMBAD";
break;
default:
s = "unknown";
break;
}
I_Error("Received a file not requested (file id: %d, file status: %s)\n", filenum, s);
+22 -5
View File
@@ -115,20 +115,25 @@ char *myfgets(char *buf, size_t bufsize, MYFILE *f)
size_t i = 0;
if (myfeof(f))
return NULL;
// we need one byte for a null terminated string
bufsize--;
while (i < bufsize && !myfeof(f))
{
char c = *f->curpos++;
if (c == '^')
buf[i++] = myfget_color(f);
else if (c == '\\')
buf[i++] = myfget_hex(f);
else if (c != '\r')
buf[i++] = c;
if (c == '\n')
break;
}
buf[i] = '\0';
dbg_line++;
@@ -138,25 +143,31 @@ char *myfgets(char *buf, size_t bufsize, MYFILE *f)
static char *myhashfgets(char *buf, size_t bufsize, MYFILE *f)
{
size_t i = 0;
if (myfeof(f))
return NULL;
// we need one byte for a null terminated string
bufsize--;
while (i < bufsize && !myfeof(f))
{
char c = *f->curpos++;
if (c == '^')
buf[i++] = myfget_color(f);
else if (c == '\\')
buf[i++] = myfget_hex(f);
else if (c != '\r')
buf[i++] = c;
if (c == '\n') // Ensure debug line is right...
dbg_line++;
if (c == '#')
break;
}
i++;
buf[i] = '\0';
return buf;
@@ -315,7 +326,10 @@ static void readPlayer(MYFILE *f, INT32 num)
goto done;
PlayerMenu[num].status = IT_CALL;
for (i = 0; i < MAXLINELEN-3; i++)
// A friendly neighborhood alias for brevity's sake
const size_t note_size = sizeof(description[num].notes);
for (i = 0; i < (INT32)(MAXLINELEN-note_size-3); i++)
{
if (s[i] == '=')
{
@@ -323,10 +337,12 @@ static void readPlayer(MYFILE *f, INT32 num)
break;
}
}
if (playertext)
{
strcpy(description[num].notes, playertext);
strcat(description[num].notes, myhashfgets(playertext, sizeof (description[num].notes), f));
strlcpy(description[num].notes, playertext, note_size);
strlcat(description[num].notes,
myhashfgets(playertext, note_size, f), note_size);
}
else
strcpy(description[num].notes, "");
@@ -335,7 +351,7 @@ static void readPlayer(MYFILE *f, INT32 num)
// It works down here, though.
{
INT32 numline = 0;
for (i = 0; (size_t)i < sizeof(description[num].notes)-1; i++)
for (i = 0; (size_t)i < note_size-1; i++)
{
if (numline < 20 && description[num].notes[i] == '\n')
numline++;
@@ -344,6 +360,7 @@ static void readPlayer(MYFILE *f, INT32 num)
break;
}
}
description[num].notes[strlen(description[num].notes)-1] = '\0';
description[num].notes[i] = '\0';
continue;
+1 -4
View File
@@ -69,9 +69,6 @@ UINT8 botcolor = 0;
JoyType_t Joystick[MAXSPLITSCREENPLAYERS] = {};
// 1024 bytes is plenty for a savegame
#define SAVEGAMESIZE (1024)
// SRB2kart
char gamedatafilename[64] = "kartdata.dat";
char timeattackfolder[64] = "kart";
@@ -3902,7 +3899,7 @@ void G_SaveGame(UINT32 savegameslot)
char name[VERSIONSIZE];
size_t length;
save.p = save.buffer = (UINT8 *)Z_Malloc(SAVEGAMESIZE, PU_STATIC, NULL);
save.p = save.buffer = (UINT8 *)Z_Malloc(1024, PU_STATIC, NULL); // 1024 bytes is plenty for a savegame
if (!save.p)
{
CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n"));
+7 -7
View File
@@ -222,7 +222,7 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
if (alphalevel)
{
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff;
switch (alphalevel)
@@ -385,7 +385,7 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
// clip it since it is used for bunny scroll in doom I
if (alphalevel)
{
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff;
switch (alphalevel)
@@ -490,7 +490,7 @@ void HWR_DrawFlatFill(INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatlumpnum)
void HWR_FadeScreenMenuBack(UINT16 color, UINT8 strength)
{
FOutVector v[4];
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
FBITFIELD poly_flags = PF_NoTexture|PF_Modulated|PF_NoDepthTest;
v[0].x = v[3].x = -1.0f;
@@ -543,7 +543,7 @@ void HWR_FadeScreenMenuBack(UINT16 color, UINT8 strength)
void HWR_DrawConsoleBack(UINT32 color, INT32 height)
{
FOutVector v[4];
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
// setup some neat-o translucency effect
if (!height) //cool hack 0 height is full height
@@ -598,7 +598,7 @@ void HWR_drawAMline(const fline_t *fl, INT32 color)
void HWR_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 color)
{
FOutVector v[4];
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
float fx, fy, fw, fh, fwait = 0;
RGBA_t *palette;
@@ -702,7 +702,7 @@ void HWR_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 color)
void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32 options)
{
FOutVector v[4];
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
float fx, fy, fw, fh;
if (w < 0 || h < 0)
@@ -820,7 +820,7 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32
void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
{
FOutVector v[4];
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
float fx, fy, fw, fh;
if (w < 0 || h < 0)
+12 -16
View File
@@ -242,7 +242,6 @@ consvar_t cv_glportals = {"gr_portals", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL,
consvar_t cv_glpaletterendering = {"gr_paletteshader", "Off", CV_CALL|CV_SAVE, CV_OnOff, CV_glpaletterendering_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_glpalettedepth = {"gr_palettedepth", "16 bits", CV_SAVE|CV_CALL, glpalettedepth_cons_t, CV_glpalettedepth_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_glflashpal = {"gr_flashpal", "On", CV_CALL|CV_SAVE, CV_OnOff, CV_glpaletterendering_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_gltexturedepth = {"gr_texturedepth", "32 bits", CV_CALL|CV_SAVE, gltexdepth_cons_t, CV_gltextureformat_OnChange, 0, NULL, NULL, 0, 0, NULL};
@@ -551,7 +550,7 @@ static FUINT HWR_CalcSlopeLight(FUINT lightnum, pslope_t *slope, const sector_t
// 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)
{
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
FOutVector *v3d;
polyvertex_t *pv;
pslope_t *slope = NULL;
@@ -1376,7 +1375,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
extracolormap_t *colormap = gl_frontsector->extra_colormap;
lightnum = HWR_CalcWallLight(lightnum, gl_curline, colormap);
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
Surf.PolyColor.s.alpha = 255;
@@ -2675,7 +2674,7 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling,
float scrollx = 0.0f, scrolly = 0.0f;
float anglef = 0.0f, cosangf = 0.0f, sinangf = 0.0f;
angle_t angle = 0;
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
fixed_t tempxsow, tempytow;
size_t nrPlaneVerts;
@@ -2842,9 +2841,8 @@ static void HWR_AddPolyObjectPlanes(void)
light = R_GetPlaneLight(gl_frontsector, polyobjsector->floorheight, true);
if (po_ptrs[i]->translucency > 0)
{
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
FBITFIELD blendmode;
memset(&Surf, 0x00, sizeof(Surf));
blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf);
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->floorpic].lumpnum, po_ptrs[i], false, polyobjsector->floorheight,
(light == -1 ? gl_frontsector->lightlevel : *gl_frontsector->lightlist[light].lightlevel), Surf.PolyColor.s.alpha, polyobjsector, blendmode, (light == -1 ? gl_frontsector->extra_colormap : gl_frontsector->lightlist[light].extra_colormap));
@@ -2865,9 +2863,8 @@ static void HWR_AddPolyObjectPlanes(void)
light = R_GetPlaneLight(gl_frontsector, polyobjsector->ceilingheight, true);
if (po_ptrs[i]->translucency > 0)
{
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
FBITFIELD blendmode;
memset(&Surf, 0x00, sizeof(Surf));
blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf);
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->ceilingpic].lumpnum, po_ptrs[i], true, polyobjsector->ceilingheight,
(light == -1 ? gl_frontsector->lightlevel : *gl_frontsector->lightlist[light].lightlevel), Surf.PolyColor.s.alpha, polyobjsector, blendmode, (light == -1 ? gl_frontsector->extra_colormap : gl_frontsector->lightlist[light].extra_colormap));
@@ -3419,7 +3416,7 @@ static void HWR_DrawSpriteShadow(gl_vissprite_t *spr, patch_t *gpatch, GLPatch_t
{
float this_scale = 1.0f;
FOutVector swallVerts[4];
FSurfaceInfo sSurf;
FSurfaceInfo sSurf = {};
FBITFIELD blendmode = 0;
fixed_t floorheight, mobjfloor;
pslope_t *floorslope;
@@ -3655,7 +3652,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite)
FOutVector baseWallVerts[4]; // This is what the verts should end up as
patch_t *gpatch;
GLPatch_t *hwrpatch;
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
extracolormap_t *colormap;
INT32 lightlevel;
boolean lightset = true;
@@ -3940,7 +3937,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
FOutVector wallVerts[4];
patch_t *gpatch; // sprite patch converted to hardware
GLPatch_t *hwrpatch;
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
FBITFIELD blend = 0;
INT32 shader = SHADER_NONE;
@@ -4105,7 +4102,7 @@ static void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr)
FOutVector wallVerts[4];
patch_t *gpatch; // sprite patch converted to hardware
GLPatch_t *hwrpatch;
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
INT32 shader = SHADER_NONE;
@@ -4850,7 +4847,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
flip = sprframe->flip; // Will only be 0x00 or 0xFF
if (papersprite && ang < ANGLE_180)
flip ^= 0xFFFF;
flip ^= 0xFF;
}
else
{
@@ -5913,7 +5910,6 @@ void HWR_AddCommands(void)
CV_RegisterVar(&cv_glpaletterendering);
CV_RegisterVar(&cv_glpalettedepth);
CV_RegisterVar(&cv_glflashpal);
}
// --------------------------------------------------------------------------
@@ -6070,7 +6066,7 @@ static void HWR_DoPostProcessor(void)
{
// Armageddon Blast Flash!
// Could this even be considered postprocessor?
if (!HWR_PalRenderFlashpal())
if (!HWR_ShouldUsePaletteRendering())
{
const player_t *player = &players[displayplayers[viewssnum]];
@@ -6083,7 +6079,7 @@ static void HWR_DoPostProcessor(void)
{-4.0f, -4.0f, 4.0f, 0.0f, 0.0f}
};
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
// This won't change if the flash palettes are changed unfortunately, but it works for its purpose
if (player->flashpal == PAL_NUKE)
-6
View File
@@ -208,7 +208,6 @@ extern consvar_t cv_glportals;
extern consvar_t cv_glpaletterendering;
extern consvar_t cv_glpalettedepth;
extern consvar_t cv_glflashpal;
FUNCINLINE static ATTRINLINE boolean HWR_UseShader(void)
{
@@ -220,11 +219,6 @@ FUNCINLINE static ATTRINLINE boolean HWR_ShouldUsePaletteRendering(void)
return (cv_glpaletterendering.value && (pLocalPalette != NULL) && HWR_UseShader());
}
FUNCINLINE static ATTRINLINE boolean HWR_PalRenderFlashpal(void)
{
return (cv_glflashpal.value && HWR_ShouldUsePaletteRendering());
}
// Returns a pointer to the palette which should be used for caching textures.
FUNCINLINE static ATTRINLINE RGBA_t *HWR_GetTexturePalette(void)
{
+4 -5
View File
@@ -1099,7 +1099,7 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
INT32 frame = 0;
INT32 nextFrame = -1;
FTransform p;
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
if (!cv_glmdls.value || spr->precip)
return;
@@ -1336,8 +1336,8 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
if (spr->mobj->frame & FF_ANIMATE)
{
// set duration and tics to be the correct values for FF_ANIMATE states
durs = (float)spr->mobj->state->var2;
tics = (float)spr->mobj->anim_duration;
durs = spr->mobj->state->var2;
tics = (INT32)spr->mobj->anim_duration;
}
//FIXME: this is not yet correct
@@ -1475,7 +1475,7 @@ void HWR_Draw2DModel(md2_t *md2, INT32 x, INT32 y, INT32 skinnum, skincolors_t c
patch_t *gpatch, *blendgpatch;
GLPatch_t *hwrPatch = NULL, *hwrBlendPatch = NULL;
FTransform p;
FSurfaceInfo Surf;
FSurfaceInfo Surf = {};
if (!md2->model)
{
@@ -1526,7 +1526,6 @@ void HWR_Draw2DModel(md2_t *md2, INT32 x, INT32 y, INT32 skinnum, skincolors_t c
if (blendgpatch)
hwrBlendPatch = ((GLPatch_t *)blendgpatch->hardware);
memset(&Surf, 0x00, sizeof(FSurfaceInfo));
Surf.PolyColor.rgba = 0xFFFFFFFF;
Surf.PolyFlags = PF_Occlude | PF_Modulated;
+9 -7
View File
@@ -496,8 +496,10 @@ static void cleanupnodes(void)
// Why can't I start at zero?
for (j = 1; j < MAXNETNODES; j++)
{
if (!(nodeingame[j] || SV_SendingFile(j)))
nodeconnected[j] = false;
}
}
static SINT8 getfreenode(void)
@@ -507,11 +509,13 @@ static SINT8 getfreenode(void)
cleanupnodes();
for (j = 0; j < MAXNETNODES; j++)
{
if (!nodeconnected[j])
{
nodeconnected[j] = true;
return j;
}
}
/** \warning No free node? Just in case a node might not have been freed properly,
* look if there are connected nodes that aren't in game, and forget them.
@@ -812,7 +816,7 @@ static void SOCK_Send(void)
static void SOCK_FreeNodenum(INT32 numnode)
{
// can't disconnect from self :)
if (!numnode || numnode > MAXNETNODES)
if (numnode <= 0 || numnode > MAXNETNODES)
return;
DEBFILE(va("Free node %d (%s)\n", numnode, SOCK_GetNodeAddress(numnode)));
@@ -1432,14 +1436,12 @@ static void SOCK_RegisterHolePunch(void)
static boolean SOCK_OpenSocket(void)
{
size_t i;
memset(clientaddress, 0, sizeof (clientaddress));
memset(clientaddress, 0, sizeof(clientaddress));
memset(nodeconnected, false, sizeof(nodeconnected));
nodeconnected[0] = true; // always connected to self
for (i = 1; i < MAXNETNODES; i++)
nodeconnected[i] = false;
nodeconnected[BROADCASTADDR] = true;
I_NetSend = SOCK_Send;
I_NetGet = SOCK_Get;
I_NetCloseSocket = SOCK_CloseSocket;
@@ -1479,7 +1481,7 @@ static boolean SOCK_Ban(INT32 node)
{
INT32 ban;
if (node > MAXNETNODES)
if (node < 0 || node > MAXNETNODES)
return false;
ban = numbans;
+17 -2
View File
@@ -2159,7 +2159,13 @@ static void K_GetKartBoostPower(player_t *player)
&& player->speed > 0
&& !player->spectator)
{
K_SpawnWipeoutTrail(player->mo, true);
mobj_t *dust = K_SpawnWipeoutTrail(player->mo, true);
// Technically, all mobjs that think can cause desynchs if they are spawned conditionally, so best we can do
// is to hide them if you are in saltyhop jump
if (dust && player->mo->salty.jump)
dust->flags2 |= MF2_DONTDRAW;
if (leveltime % 6 == 0)
S_StartSound(player->mo, sfx_cdfm70);
}
@@ -3634,7 +3640,7 @@ void K_SpawnSparkleTrail(mobj_t *mo)
P_SetMobjState(sparkle, S_KARTINVULN_LARGE1);
}
void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
mobj_t *K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
{
mobj_t *dust;
angle_t aoff;
@@ -3675,6 +3681,8 @@ void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent)
if (translucent)
dust->flags2 |= MF2_SHADOW;
return dust;
}
// K_DriftDustHandling
@@ -6175,6 +6183,13 @@ void K_KartUpdatePosition(player_t *player)
}
}
// the player should NOT be checked against themselves! lol
// otherwise prevcheck will effectively be halved
// sadly this stuff is exposed to lua and atleast one script uses those so we cant fix it
// oh well
//if (player == &players[i])
//continue;
const boolean isprevcheckpointi = mo->health == players[i].starpostnum;
const boolean isnextcheckpointi = mo->health == (players[i].starpostnum + 1);
+1 -1
View File
@@ -57,7 +57,7 @@ boolean K_ShouldSlopeRoll(mobj_t *mobj);
void K_RollMobjBySlopes(mobj_t *mo, pslope_t *slope);
void K_SpawnBoostTrail(player_t *player);
void K_SpawnSparkleTrail(mobj_t *mo);
void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent);
mobj_t *K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent);
void K_DriftDustHandling(mobj_t *spawner);
void K_PuntMine(mobj_t *mine, mobj_t *punter);
void K_DoSneaker(player_t *player, INT32 type);
-2
View File
@@ -1023,8 +1023,6 @@ static menuitem_t OP_OpenGLOptionsMenu[] =
{IT_STRING | IT_CVAR, NULL, "Fallback Player 3D Model", &cv_glfallbackplayermodel, 20},
{IT_STRING | IT_CVAR, NULL, "Shaders", &cv_glshaders, 25},
{IT_STRING | IT_CVAR, NULL, "Palette Rendering", &cv_glpaletterendering, 30},
{IT_STRING | IT_CVAR, NULL, "Palette Rendering Flashpals",&cv_glflashpal, 35},
//{IT_STRING | IT_CVAR, NULL, "Min Shader Brightness", &cv_glsecbright, 40},
{IT_STRING | IT_CVAR, NULL, "Texture Quality", &cv_gltexturedepth, 45},
{IT_STRING | IT_CVAR, NULL, "Texture Filter", &cv_glfiltermode, 50},
+20 -7
View File
@@ -788,10 +788,10 @@ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png
else
snprintf(locationtxt, 40, "Unknown");
memset(png_infotext,0x00,sizeof (png_infotext));
memset(png_infotext, 0x00, sizeof(png_infotext));
for (i = 0; i < SRB2PNGTXT; i++)
png_infotext[i].key = keytxt[i];
png_infotext[i].key = keytxt[i];
png_infotext[0].text = titletxt;
if (movie)
@@ -804,9 +804,15 @@ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png
png_infotext[5].text = locationtxt;
png_infotext[6].text = interfacetxt;
png_infotext[7].text = rendermodetxt;
png_infotext[8].text = strncpy(ctrevision, comprevision, sizeof(ctrevision)-1);
png_infotext[9].text = strncpy(ctdate, compdate, sizeof(ctdate)-1);
png_infotext[10].text = strncpy(cttime, comptime, sizeof(cttime)-1);
strncpy(ctrevision, comprevision, sizeof(ctrevision)-1);
ctrevision[sizeof(ctrevision)-1] = '\0';
png_infotext[8].text = ctrevision;
strncpy(ctdate, compdate, sizeof(ctdate)-1);
ctdate[sizeof(ctdate)-1] = '\0';
png_infotext[9].text = ctdate;
strncpy(cttime, comptime, sizeof(cttime)-1);
cttime[sizeof(cttime)-1] = '\0';
png_infotext[10].text = cttime;
png_set_text(png_ptr, png_info_ptr, png_infotext, SRB2PNGTXT);
#undef SRB2PNGTXT
@@ -1564,6 +1570,7 @@ char *M_GetToken(const char *inputString)
{
startPos = endPos;
}
if (stringToUse == NULL)
return NULL;
@@ -1634,7 +1641,8 @@ char *M_GetToken(const char *inputString)
}
// If the end of the string is reached, no token is to be read
if (startPos == stringLength) {
if (startPos == stringLength)
{
endPos = stringLength;
return NULL;
}
@@ -1644,7 +1652,7 @@ char *M_GetToken(const char *inputString)
|| stringToUse[startPos] == '}')
{
endPos = startPos + 1;
texturesToken = (char *)Z_Malloc(2*sizeof(char),PU_STATIC,NULL);
texturesToken = (char *)Z_Malloc(2*sizeof(char), PU_STATIC, NULL);
texturesToken[0] = stringToUse[startPos];
texturesToken[1] = '\0';
return texturesToken;
@@ -1855,8 +1863,10 @@ int M_PathParts(const char *path)
int n;
const char *p;
const char *t;
if (path == NULL)
return 0;
for (n = 0, p = path ;; ++n)
{
t = p;
@@ -1869,6 +1879,7 @@ int M_PathParts(const char *path)
break;
}
}
return n;
}
@@ -1911,7 +1922,9 @@ void M_MkdirEachUntil(const char *cpath, int start, int end, int mode)
if (!( p = strchr(p, PATHSEP[0]) ))
return;
}
p += strspn(p, PATHSEP);
for (;;)
{
if (end > 0 && !--end)
+10 -10
View File
@@ -414,7 +414,7 @@ void P_UpdateSegLightOffset(seg_t *li)
angle_t liAngle = R_PointToAngle2(0, 0, (li->v1->x - li->v2->x), (li->v1->y - li->v2->y)) - ANGLE_90;
light = FixedMul(FINECOSINE(liAngle >> ANGLETOFINESHIFT), FINECOSINE(maplighting.angle >> ANGLETOFINESHIFT))
+ FixedMul(FINESINE(liAngle >> ANGLETOFINESHIFT), FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
+ FixedMul(FINESINE(liAngle >> ANGLETOFINESHIFT), FINESINE(maplighting.angle >> ANGLETOFINESHIFT));
light = (light + FRACUNIT) / 2;
}
else
@@ -1914,7 +1914,7 @@ static void P_LoadMapBSP(const virtres_t* virt)
if (numsubsectors <= 0)
I_Error("Level has no subsectors (did you forget to run it through a nodesbuilder?)");
if (numnodes <= 0)
I_Error("Level has no nodes");
I_Error("Level has no nodes (does your map have at least 2 sectors?)");
if (numsegs <= 0)
I_Error("Level has no segs");
@@ -2077,10 +2077,10 @@ static void P_LevelInitStuff(boolean reloadinggamestate)
stagefailed = false;
// earthquake camera
memset(&quake,0,sizeof(struct quake));
memset(&quake, 0, sizeof(struct quake));
// song credit init
memset(&cursongcredit,0,sizeof(struct cursongcredit));
memset(&cursongcredit, 0, sizeof(struct cursongcredit));
cursongcredit.trans = NUMTRANSMAPS;
for (i = 0; i < MAXPLAYERS; i++)
@@ -2174,14 +2174,14 @@ static INT32 P_MakeBufferMD5(const char *buffer, size_t len, void *resblock)
memset(resblock, 0x00, 16);
return 1;
#else
tic_t t = I_GetTime();
precise_t t = I_GetPreciseTime();
CONS_Debug(DBG_SETUP, "Making MD5\n");
if (md5_buffer(buffer, len, resblock) == NULL)
return 1;
CONS_Debug(DBG_SETUP, "MD5 calc took %f seconds\n", (float)(I_GetTime() - t)/NEWTICRATE);
CONS_Debug(DBG_SETUP, "MD5 calc took %f seconds\n", (float)(I_GetPreciseTime() - t)/I_GetPrecisePrecision());
return 0;
#endif
@@ -2203,10 +2203,10 @@ static void P_MakeMapMD5(virtres_t *virt, void *dest)
virtlump_t* virtmthings = vres_Find(virt, "THINGS");
virtlump_t* virtsides = vres_Find(virt, "SIDEDEFS");
P_MakeBufferMD5((char*)virtlines->data, virtlines->size, linemd5);
P_MakeBufferMD5((char*)virtsectors->data, virtsectors->size, sectormd5);
P_MakeBufferMD5((char*)virtmthings->data, virtmthings->size, thingmd5);
P_MakeBufferMD5((char*)virtsides->data, virtsides->size, sidedefmd5);
P_MakeBufferMD5((char*)virtlines->data, virtlines->size, linemd5);
P_MakeBufferMD5((char*)virtsectors->data, virtsectors->size, sectormd5);
P_MakeBufferMD5((char*)virtmthings->data, virtmthings->size, thingmd5);
P_MakeBufferMD5((char*)virtsides->data, virtsides->size, sidedefmd5);
for (i = 0; i < 16; i++)
resmd5[i] = (linemd5[i] + sectormd5[i] + thingmd5[i] + sidedefmd5[i]) & 0xFF;
+4 -4
View File
@@ -280,22 +280,22 @@ static void Fov_OnChange(void)
static void FlipCam_OnChange(void)
{
SendWeaponPref();
SendWeaponPref(0);
}
static void FlipCam2_OnChange(void)
{
SendWeaponPref2();
SendWeaponPref(1);
}
static void FlipCam3_OnChange(void)
{
SendWeaponPref3();
SendWeaponPref(2);
}
static void FlipCam4_OnChange(void)
{
SendWeaponPref4();
SendWeaponPref(3);
}
static void Precipstuff_OnChange(void)
+3 -26
View File
@@ -116,9 +116,7 @@ consvar_t cv_skipintromusic = {"skipintromusic", "No", CV_SAVE, CV_YesNo, NULL,
boolean keepmapmusic = false; // keep the current music on map restart
boolean skipintromus = false; // skip the intro fanfare
static boolean resumekeepmusic = false;
static music_t keepmusic;
static void S_SetKeepMusResume(void);
#ifdef HAVE_OPENMPT
openmpt_module *openmpt_mhandle = NULL;
@@ -1438,7 +1436,7 @@ void S_LoadMusicDefs(UINT16 wadnum)
stoken = strtok(stoken, " ");
if (stoken)
{
if (! ReadMusicDefFields(wadnum, line, stoken, &def))
if (!ReadMusicDefFields(wadnum, line, stoken, &def))
break;
}
@@ -1848,8 +1846,6 @@ void S_StopMusic(void)
mapmusic.resume = (cv_resume.value && fasticmp(music.name, mapmusic.name)) ? I_GetSongPosition() : 0;
S_SetKeepMusResume();
if (I_SongPaused())
I_ResumeSong();
@@ -1976,17 +1972,6 @@ void S_ResetKeepAndSpecialMus(void)
keepmapmusic = skipintromus = false;
}
// saves the current song position everytime a song stops
// so we can resume it in some cases
static void S_SetKeepMusResume(void)
{
keepmusic.resume = 0;
if (fasticmp(music.name, mapmusic.name))
{
keepmusic.resume = I_GetSongPosition();
}
}
// determine if we should keep the music on a map restart
// this gets called BEFORE the level gets loaded in G_DoLoadLevel
@@ -1995,7 +1980,7 @@ void S_KeepMusic(void)
static INT16 oldmap = -1;
static boolean oldencore = false;
keepmapmusic = resumekeepmusic = false;
keepmapmusic = false;
if (!cv_keepmusic.value)
{
@@ -2009,9 +1994,7 @@ void S_KeepMusic(void)
if (oldmap == gamemap && oldencore == encoremode)
{
const boolean musicchanged = S_CheckMusicException();
resumekeepmusic = (musicchanged && keepmusic.resume);
keepmapmusic = (!musicchanged || resumekeepmusic);
keepmapmusic = (S_CheckMusicException() == false);
}
oldencore = encoremode;
@@ -2072,12 +2055,6 @@ void S_InitMapMusic(void)
if (keepmapmusic)
{
// this is kinda silly, but we can use it to fade back into the map song at the saved point, should the current music be different from the map music
if (resumekeepmusic)
{
S_ChangeMusicEx(mapmusic.name, mapmusic.flags, true, keepmusic.resume, 0, 500);
}
return;
}
+7 -2
View File
@@ -216,8 +216,13 @@ void I_StartupSound(void)
SDLmixlinked->major, SDLmixlinked->minor, SDLmixlinked->patch);
#ifdef HAVE_OPENMPT
I_OutputMsg("libopenmpt version: %s\n", openmpt_get_string("library_version"));
I_OutputMsg("libopenmpt build date: %s\n", openmpt_get_string("build"));
const char *openmptstr;
openmptstr = openmpt_get_string("library_version");
I_OutputMsg("libopenmpt version: %s\n", openmptstr);
openmpt_free_string(openmptstr);
openmptstr = openmpt_get_string("build");
I_OutputMsg("libopenmpt build date: %s\n", openmptstr);
openmpt_free_string(openmptstr);
#endif
sound_started = true;
+1 -1
View File
@@ -180,7 +180,7 @@ static void ST_doPaletteStuff(void)
INT32 palette = 0;
#ifdef HWRENDER
if (rendermode == render_opengl && !HWR_PalRenderFlashpal())
if (rendermode == render_opengl && !HWR_ShouldUsePaletteRendering())
return;
#endif
+525
View File
@@ -0,0 +1,525 @@
#ifndef H_PALDELTA
#define H_PALDELTA
// those are the differences in palette indices between the main srb2 playpal and its white and nuke subpalettes
// this is probably not the best way of doing any of this, but it works lol
static const INT16 pPaletteDeltaFlash[256][3] = {
{ 6, 6, 6},
{ 12, 12, 12},
{ 18, 18, 18},
{ 24, 24, 24},
{ 30, 30, 30},
{ 36, 36, 36},
{ 42, 42, 42},
{ 48, 48, 48},
{ 54, 54, 54},
{ 60, 60, 60},
{ 66, 66, 66},
{ 72, 72, 72},
{ 78, 78, 78},
{ 84, 84, 84},
{ 90, 90, 90},
{ 95, 95, 95},
{ 101, 101, 101},
{ 107, 107, 107},
{ 113, 113, 113},
{ 119, 119, 119},
{ 125, 125, 125},
{ 131, 131, 131},
{ 137, 137, 137},
{ 143, 143, 143},
{ 149, 149, 149},
{ 155, 155, 155},
{ 161, 161, 161},
{ 167, 167, 167},
{ 173, 173, 173},
{ 179, 179, 179},
{ 185, 185, 185},
{ 191, 191, 191},
{ 48, 66, 84},
{ 54, 71, 89},
{ 60, 77, 95},
{ 66, 83, 100},
{ 72, 88, 105},
{ 79, 94, 111},
{ 85, 99, 117},
{ 91, 105, 123},
{ 96, 111, 129},
{ 102, 117, 135},
{ 108, 123, 141},
{ 114, 128, 146},
{ 120, 134, 152},
{ 127, 140, 158},
{ 133, 145, 163},
{ 140, 152, 170},
{ 48, 98, 134},
{ 57, 104, 137},
{ 63, 107, 140},
{ 69, 110, 143},
{ 75, 116, 146},
{ 84, 119, 149},
{ 90, 125, 152},
{ 95, 128, 155},
{ 101, 131, 158},
{ 110, 137, 161},
{ 119, 140, 164},
{ 128, 143, 167},
{ 134, 149, 170},
{ 143, 155, 173},
{ 152, 158, 176},
{ 158, 164, 179},
{ 0, 15, 24},
{ 0, 21, 33},
{ 0, 27, 42},
{ 0, 33, 51},
{ 0, 36, 57},
{ 0, 42, 66},
{ 0, 48, 75},
{ 0, 51, 81},
{ 0, 57, 93},
{ 6, 63, 98},
{ 12, 69, 104},
{ 18, 75, 110},
{ 24, 81, 116},
{ 30, 87, 122},
{ 36, 93, 128},
{ 39, 95, 131},
{ 0, 12, 26},
{ 0, 26, 52},
{ 0, 39, 78},
{ 0, 52, 102},
{ 0, 65, 127},
{ 0, 78, 150},
{ 0, 91, 172},
{ 0, 102, 191},
{ 9, 108, 191},
{ 19, 114, 191},
{ 29, 120, 191},
{ 39, 127, 191},
{ 48, 133, 191},
{ 58, 139, 191},
{ 68, 145, 191},
{ 78, 150, 191},
{ 0, 0, 12},
{ 0, 0, 36},
{ 0, 0, 60},
{ 0, 0, 84},
{ 0, 0, 107},
{ 0, 0, 131},
{ 0, 0, 155},
{ 0, 0, 179},
{ 0, 0, 191},
{ 36, 36, 191},
{ 60, 60, 191},
{ 84, 84, 191},
{ 107, 107, 191},
{ 131, 131, 191},
{ 155, 155, 191},
{ 179, 179, 191},
{ 0, 0, 104},
{ 15, 27, 125},
{ 30, 51, 140},
{ 45, 75, 155},
{ 60, 98, 167},
{ 75, 122, 176},
{ 90, 140, 185},
{ 104, 158, 191},
{ 0, 0, 0},
{ 0, 24, 24},
{ 0, 48, 48},
{ 0, 72, 72},
{ 0, 95, 95},
{ 0, 119, 119},
{ 0, 143, 143},
{ 0, 167, 167},
{ 0, 191, 191},
{ 12, 191, 191},
{ 24, 191, 191},
{ 36, 191, 191},
{ 48, 191, 191},
{ 60, 191, 191},
{ 72, 191, 191},
{ 84, 191, 191},
{ 95, 191, 191},
{ 107, 191, 191},
{ 119, 191, 191},
{ 131, 191, 191},
{ 143, 191, 191},
{ 155, 191, 191},
{ 167, 191, 191},
{ 179, 191, 191},
{ 0, 54, 54},
{ 9, 69, 69},
{ 18, 84, 84},
{ 27, 98, 98},
{ 39, 110, 110},
{ 48, 122, 122},
{ 57, 131, 131},
{ 66, 143, 143},
{ 85, 156, 191},
{ 91, 161, 191},
{ 96, 166, 191},
{ 102, 172, 191},
{ 108, 177, 191},
{ 114, 182, 191},
{ 120, 187, 191},
{ 127, 191, 191},
{ 101, 0, 131},
{ 106, 11, 134},
{ 111, 23, 138},
{ 117, 35, 142},
{ 123, 47, 145},
{ 129, 59, 149},
{ 134, 71, 153},
{ 140, 83, 157},
{ 145, 95, 160},
{ 151, 106, 164},
{ 157, 118, 168},
{ 162, 130, 172},
{ 168, 142, 175},
{ 173, 154, 179},
{ 179, 166, 183},
{ 185, 179, 187},
{ 24, 0, 65},
{ 42, 20, 80},
{ 61, 41, 95},
{ 79, 61, 110},
{ 97, 82, 124},
{ 115, 101, 139},
{ 135, 123, 154},
{ 153, 143, 169},
{ 191, 0, 191},
{ 191, 24, 191},
{ 191, 48, 191},
{ 191, 72, 191},
{ 191, 95, 191},
{ 191, 119, 191},
{ 191, 143, 191},
{ 191, 167, 191},
{ 0, 107, 0},
{ 0, 191, 0},
{ 24, 191, 24},
{ 48, 191, 48},
{ 72, 191, 72},
{ 95, 191, 95},
{ 119, 191, 119},
{ 143, 191, 143},
{ 16, 16, 9},
{ 44, 44, 22},
{ 73, 73, 36},
{ 101, 101, 51},
{ 127, 127, 66},
{ 142, 142, 93},
{ 156, 156, 121},
{ 170, 170, 151},
{ 31, 10, 0},
{ 48, 15, 0},
{ 64, 21, 0},
{ 79, 25, 0},
{ 95, 30, 0},
{ 111, 36, 0},
{ 127, 41, 0},
{ 143, 48, 0},
{ 149, 73, 24},
{ 155, 84, 48},
{ 161, 101, 72},
{ 167, 119, 95},
{ 191, 48, 48},
{ 191, 95, 95},
{ 191, 119, 119},
{ 191, 143, 143},
{ 18, 18, 0},
{ 42, 42, 0},
{ 61, 61, 0},
{ 86, 86, 0},
{ 104, 104, 0},
{ 129, 129, 0},
{ 154, 154, 0},
{ 172, 172, 0},
{ 191, 191, 0},
{ 191, 191, 18},
{ 191, 191, 36},
{ 191, 191, 55},
{ 191, 191, 74},
{ 191, 191, 92},
{ 191, 191, 110},
{ 191, 191, 129},
{ 191, 191, 131},
{ 191, 191, 143},
{ 191, 191, 149},
{ 191, 191, 161},
{ 191, 191, 167},
{ 191, 191, 179},
{ 191, 191, 185},
{ 191, 0, 0},
{ 36, 95, 36},
{ 54, 107, 54},
{ 72, 119, 72},
{ 90, 131, 90},
{ 107, 143, 107},
{ 125, 155, 125},
{ 143, 167, 143},
{ 161, 179, 161}
};
static const INT16 pPaletteDeltaNuke[256][3] = {
{ 6,-133,-133},
{ 12,-125,-125},
{ 18,-117,-117},
{ 24,-109,-109},
{ 30,-101,-101},
{ 36, -93, -93},
{ 42, -85, -85},
{ 48, -77, -77},
{ 54, -69, -69},
{ 60, -61, -61},
{ 66, -53, -53},
{ 72, -45, -45},
{ 78, -37, -37},
{ 84, -29, -29},
{ 90, -21, -21},
{ 95, -14, -14},
{ 101, -6, -6},
{ 107, 2, 2},
{ 113, 10, 10},
{ 119, 18, 18},
{ 125, 26, 26},
{ 131, 34, 34},
{ 137, 42, 42},
{ 143, 50, 50},
{ 149, 58, 58},
{ 155, 66, 66},
{ 161, 74, 74},
{ 167, 82, 82},
{ 173, 90, 90},
{ 179, 98, 98},
{ 185, 106, 106},
{ 191, 113, 113},
{ 48, -53, -29},
{ 54, -46, -22},
{ 60, -38, -14},
{ 66, -30, -7},
{ 72, -23, 0},
{ 79, -15, 8},
{ 85, -8, 16},
{ 91, -1, 23},
{ 96, 7, 31},
{ 102, 15, 39},
{ 108, 23, 47},
{ 114, 30, 54},
{ 120, 38, 62},
{ 127, 46, 70},
{ 133, 53, 77},
{ 140, 62, 86},
{ 48, -10, 38},
{ 57, -2, 42},
{ 63, 2, 46},
{ 69, 6, 50},
{ 75, 14, 54},
{ 84, 18, 58},
{ 90, 26, 62},
{ 95, 30, 66},
{ 101, 34, 70},
{ 110, 42, 74},
{ 119, 46, 78},
{ 128, 50, 82},
{ 134, 58, 86},
{ 143, 66, 90},
{ 152, 70, 94},
{ 158, 78, 98},
{ 0,-121,-109},
{ 0,-113, -97},
{ 0,-105, -85},
{ 0, -97, -73},
{ 0, -93, -65},
{ 0, -85, -53},
{ 0, -77, -41},
{ 0, -73, -33},
{ 0, -65, -17},
{ 6, -57, -10},
{ 12, -49, -2},
{ 18, -41, 6},
{ 24, -33, 14},
{ 30, -25, 22},
{ 36, -17, 30},
{ 39, -14, 34},
{ 0,-124,-106},
{ 0,-106, -71},
{ 0, -89, -37},
{ 0, -71, -4},
{ 0, -54, 28},
{ 0, -37, 59},
{ 0, -20, 88},
{ 0, -4, 113},
{ 9, 4, 113},
{ 19, 12, 113},
{ 29, 20, 113},
{ 39, 28, 113},
{ 48, 36, 113},
{ 58, 44, 113},
{ 68, 52, 113},
{ 78, 59, 113},
{ 0,-141,-125},
{ 0,-141, -93},
{ 0,-141, -61},
{ 0,-141, -29},
{ 0,-141, 2},
{ 0,-141, 34},
{ 0,-141, 66},
{ 0,-141, 98},
{ 0,-141, 113},
{ 36, -93, 113},
{ 60, -61, 113},
{ 84, -29, 113},
{ 107, 2, 113},
{ 131, 34, 113},
{ 155, 66, 113},
{ 179, 98, 113},
{ 0,-141, -2},
{ 15,-105, 26},
{ 30, -73, 46},
{ 45, -41, 66},
{ 60, -10, 82},
{ 75, 22, 94},
{ 90, 46, 106},
{ 104, 70, 113},
{ 0,-141,-141},
{ 0,-109,-109},
{ 0, -77, -77},
{ 0, -45, -45},
{ 0, -14, -14},
{ 0, 18, 18},
{ 0, 50, 50},
{ 0, 82, 82},
{ 0, 113, 113},
{ 12, 113, 113},
{ 24, 113, 113},
{ 36, 113, 113},
{ 48, 113, 113},
{ 60, 113, 113},
{ 72, 113, 113},
{ 84, 113, 113},
{ 95, 113, 113},
{ 107, 113, 113},
{ 119, 113, 113},
{ 131, 113, 113},
{ 143, 113, 113},
{ 155, 113, 113},
{ 167, 113, 113},
{ 179, 113, 113},
{ 0, -69, -69},
{ 9, -49, -49},
{ 18, -29, -29},
{ 27, -10, -10},
{ 39, 6, 6},
{ 48, 22, 22},
{ 57, 34, 34},
{ 66, 50, 50},
{ 85, 67, 113},
{ 91, 74, 113},
{ 96, 81, 113},
{ 102, 88, 113},
{ 108, 95, 113},
{ 114, 102, 113},
{ 120, 108, 113},
{ 127, 113, 113},
{ 101,-141, 34},
{ 106,-126, 38},
{ 111,-110, 43},
{ 117, -94, 48},
{ 123, -78, 53},
{ 129, -62, 58},
{ 134, -46, 63},
{ 140, -30, 68},
{ 145, -14, 73},
{ 151, 1, 78},
{ 157, 17, 83},
{ 162, 33, 88},
{ 168, 49, 93},
{ 173, 65, 98},
{ 179, 81, 103},
{ 185, 98, 109},
{ 24,-141, -54},
{ 42,-114, -34},
{ 61, -86, -14},
{ 79, -59, 6},
{ 97, -32, 25},
{ 115, -6, 45},
{ 135, 23, 65},
{ 153, 50, 84},
{ 191,-141, 113},
{ 191,-109, 113},
{ 191, -77, 113},
{ 191, -45, 113},
{ 191, -14, 113},
{ 191, 18, 113},
{ 191, 50, 113},
{ 191, 82, 113},
{ 0, 2,-141},
{ 0, 113,-141},
{ 24, 113,-109},
{ 48, 113, -77},
{ 72, 113, -45},
{ 95, 113, -14},
{ 119, 113, 18},
{ 143, 113, 50},
{ 16,-119,-129},
{ 44, -82,-111},
{ 73, -43, -92},
{ 101, -6, -73},
{ 127, 29, -53},
{ 142, 48, -17},
{ 156, 67, 21},
{ 170, 86, 61},
{ 31,-127,-141},
{ 48,-121,-141},
{ 64,-113,-141},
{ 79,-107,-141},
{ 95,-100,-141},
{ 111, -93,-141},
{ 127, -86,-141},
{ 143, -77,-141},
{ 149, -43,-109},
{ 155, -29, -77},
{ 161, -6, -45},
{ 167, 18, -14},
{ 191, -77, -77},
{ 191, -14, -14},
{ 191, 18, 18},
{ 191, 50, 50},
{ 18,-117,-141},
{ 42, -84,-141},
{ 61, -59,-141},
{ 86, -26,-141},
{ 104, -2,-141},
{ 129, 31,-141},
{ 154, 64,-141},
{ 172, 89,-141},
{ 191, 113,-141},
{ 191, 113,-117},
{ 191, 113, -92},
{ 191, 113, -67},
{ 191, 113, -42},
{ 191, 113, -18},
{ 191, 113, 6},
{ 191, 113, 31},
{ 191, 113, 34},
{ 191, 113, 50},
{ 191, 113, 58},
{ 191, 113, 74},
{ 191, 113, 82},
{ 191, 113, 98},
{ 191, 113, 106},
{ 191,-141,-141},
{ 36, -14, -93},
{ 54, 2, -69},
{ 72, 18, -45},
{ 90, 34, -21},
{ 107, 50, 2},
{ 125, 66, 26},
{ 143, 82, 50},
{ 161, 98, 74}
};
#endif
+98 -173
View File
@@ -91,6 +91,7 @@ consvar_t cv_menucaps = {"menucaps", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NUL
// local copy of the palette for V_GetColor()
RGBA_t *pLocalPalette = NULL;
RGBA_t *pGammaCorrectedPalette = NULL;
static RGBA_t *pFallbackFlashPal = NULL;
static size_t currentPaletteSize;
@@ -409,6 +410,58 @@ UINT32 V_GammaCorrect(UINT32 input, double power)
return result.rgba;
}
#include "v_paldeltas.h"
// remaps a palette with given "deltas"
// this is used with premade deltas between the srb2 palette and its both flashpals
// so we may approximate generate our own, should the current palette miss them
static void ApplyPaletteDelta(const RGBA_t *pal_in, RGBA_t *pal_out, const INT16 pal_delta[][3])
{
size_t i;
for (i = 0; i < 256; i++)
{
INT16 r = (INT16)pal_in[i].s.red + pal_delta[i][0];
INT16 g = (INT16)pal_in[i].s.green + pal_delta[i][1];
INT16 b = (INT16)pal_in[i].s.blue + pal_delta[i][2];
pal_out[i].s.red = (UINT8)CLAMP(r, 0 , 255);
pal_out[i].s.green = (UINT8)CLAMP(g, 0 , 255);
pal_out[i].s.blue = (UINT8)CLAMP(b, 0 , 255);
pal_out[i].s.alpha = 0xFF; // pal_in[i].s.alpha
}
}
static void GenerateFlashPalettes(void)
{
size_t i, palsize;
RGBA_t *pFlashPalGammaCorrectedPalette = NULL;
// generate flashpalettes if the current palette does not provide any subpalettes
if (currentPaletteSize >= (14 * (256 * 3))) // 14 palettes are in playpal
return;
palsize = (2*256);
pFallbackFlashPal = Z_Malloc(sizeof(*pFallbackFlashPal)*palsize, PU_STATIC, NULL);
pFlashPalGammaCorrectedPalette = Z_Malloc(sizeof (*pFlashPalGammaCorrectedPalette)*palsize, PU_STATIC, NULL);
// apply our deltas to the palettes to get the white and red "flashes"
ApplyPaletteDelta(pLocalPalette, pFallbackFlashPal, pPaletteDeltaFlash);
ApplyPaletteDelta(pLocalPalette, pFallbackFlashPal+256, pPaletteDeltaNuke);
// apply colour and gamma correction if needed
if (Cubeapply)
{
for (i = 0; i < palsize; i++)
{
pFlashPalGammaCorrectedPalette[i].rgba = V_GammaDecode(pFallbackFlashPal[i].rgba);
V_CubeApply(&pFlashPalGammaCorrectedPalette[i]);
pFallbackFlashPal[i].rgba = V_GammaEncode(pFlashPalGammaCorrectedPalette[i].rgba);
}
}
Z_Free(pFlashPalGammaCorrectedPalette);
}
// keep a copy of the palette so that we can get the RGB value for a color index at any time.
static void LoadPalette(const char *lumpname)
{
@@ -428,6 +481,8 @@ static void LoadPalette(const char *lumpname)
Z_Free(pLocalPalette);
Z_Free(pGammaCorrectedPalette);
Z_Free(pFallbackFlashPal);
pFallbackFlashPal = NULL;
pLocalPalette = Z_Malloc(sizeof (*pLocalPalette)*palsize, PU_STATIC, NULL);
pGammaCorrectedPalette = Z_Malloc(sizeof (*pGammaCorrectedPalette)*palsize, PU_STATIC, NULL);
@@ -447,12 +502,19 @@ static void LoadPalette(const char *lumpname)
pLocalPalette[i].s.alpha = 0xFF;
pGammaCorrectedPalette[i].rgba = V_GammaDecode(pLocalPalette[i].rgba);
}
if (!Cubeapply)
continue;
GenerateFlashPalettes();
V_CubeApply(&pGammaCorrectedPalette[i]);
pLocalPalette[i].rgba = V_GammaEncode(pGammaCorrectedPalette[i].rgba);
// gotta apply any colour and gamma adjustments afterwards
// so we dont double apply it to the generated flashpals
if (Cubeapply)
{
for (i = 0; i < palsize; i++)
{
V_CubeApply(&pGammaCorrectedPalette[i]);
pLocalPalette[i].rgba = V_GammaEncode(pGammaCorrectedPalette[i].rgba);
}
}
}
@@ -543,6 +605,7 @@ void V_ReloadPalette(void)
// -------------+
void V_SetPalette(INT32 palettenum)
{
RGBA_t *pal = NULL;
if (!pLocalPalette)
V_ReloadPalette();
@@ -554,24 +617,47 @@ void V_SetPalette(INT32 palettenum)
if (palettenum == 0)
{
palettenum = cv_palettenum.value;
if (palettenum * 256U > currentPaletteSize - 256)
{
CONS_Alert(CONS_WARNING, "cv_palettenum %d out of range\n", palettenum);
palettenum = 0;
}
}
}
// in many cases custom palettes do not provide the needed subpalettes for flashpals to work
// before this would mean the renderer gets passed random data out of allocated memory bounds
// which was not very cool :chonkbuncle:
// gladly 2.1 only actually has 2 different subpalettes
// one for "white flash" and one red/pinkish one for nuke
// since we checked the palette earlier we should have generated those ourselves
if (((size_t)palettenum >= currentPaletteSize / (256 * 3)))
{
CONS_Debug(DBG_RENDER, "palettenum %d out of range\n", palettenum);
// if for some reason we did not generate flashpals
// just fall back to the main palette i guess?
if (pFallbackFlashPal != NULL)
{
if (palettenum == PAL_NUKE)
pal = &pFallbackFlashPal[256];
else
pal = pFallbackFlashPal;
}
else
{
pal = pLocalPalette;
}
}
else
{
pal = &pLocalPalette[palettenum*256];
}
#ifdef HWRENDER
if (rendermode == render_opengl)
HWR_SetPalette(&pLocalPalette[palettenum*256]);
HWR_SetPalette(pal);
#if defined (__unix__) || defined (UNIXCOMMON) || defined (HAVE_SDL)
else
#endif
#endif
if (rendermode != render_none)
I_SetPalette(&pLocalPalette[palettenum*256]);
I_SetPalette(pal);
}
void V_SetPaletteLump(const char *pal)
@@ -3309,167 +3395,6 @@ INT32 V_SubStringLengthToFit(const char *string, INT32 width, INT32 option)
return max(i-1, 0);
}
char V_GetSkincolorChar(INT32 color)
{
char cstart = 0x80;
switch (color)
{
case SKINCOLOR_WHITE:
case SKINCOLOR_SILVER:
case SKINCOLOR_SLATE:
cstart = 0x80; // White
break;
case SKINCOLOR_GREY:
case SKINCOLOR_NICKEL:
case SKINCOLOR_BLACK:
case SKINCOLOR_SKUNK:
case SKINCOLOR_JET:
cstart = 0x86; // V_GRAYMAP
break;
case SKINCOLOR_SEPIA:
case SKINCOLOR_BEIGE:
case SKINCOLOR_WALNUT:
case SKINCOLOR_BROWN:
case SKINCOLOR_LEATHER:
case SKINCOLOR_RUST:
case SKINCOLOR_WRISTWATCH:
cstart = 0x8e; // V_BROWNMAP
break;
case SKINCOLOR_FAIRY:
case SKINCOLOR_SALMON:
case SKINCOLOR_PINK:
case SKINCOLOR_ROSE:
case SKINCOLOR_BRICK:
case SKINCOLOR_LEMONADE:
case SKINCOLOR_BUBBLEGUM:
case SKINCOLOR_LILAC:
cstart = 0x8d; // V_PINKMAP
break;
case SKINCOLOR_CINNAMON:
case SKINCOLOR_RUBY:
case SKINCOLOR_RASPBERRY:
case SKINCOLOR_CHERRY:
case SKINCOLOR_RED:
case SKINCOLOR_CRIMSON:
case SKINCOLOR_MAROON:
case SKINCOLOR_FLAME:
case SKINCOLOR_SCARLET:
case SKINCOLOR_KETCHUP:
cstart = 0x85; // V_REDMAP
break;
case SKINCOLOR_DAWN:
case SKINCOLOR_SUNSET:
case SKINCOLOR_CREAMSICLE:
case SKINCOLOR_ORANGE:
case SKINCOLOR_PUMPKIN:
case SKINCOLOR_ROSEWOOD:
case SKINCOLOR_BURGUNDY:
case SKINCOLOR_TANGERINE:
cstart = 0x87; // V_ORANGEMAP
break;
case SKINCOLOR_PEACH:
case SKINCOLOR_CARAMEL:
case SKINCOLOR_CREAM:
cstart = 0x8f; // V_PEACHMAP
break;
case SKINCOLOR_GOLD:
case SKINCOLOR_ROYAL:
case SKINCOLOR_BRONZE:
case SKINCOLOR_COPPER:
case SKINCOLOR_THUNDER:
cstart = 0x8a; // V_GOLDMAP
break;
case SKINCOLOR_POPCORN:
case SKINCOLOR_QUARRY:
case SKINCOLOR_YELLOW:
case SKINCOLOR_MUSTARD:
case SKINCOLOR_CROCODILE:
case SKINCOLOR_OLIVE:
cstart = 0x82; // V_YELLOWMAP
break;
case SKINCOLOR_ARTICHOKE:
case SKINCOLOR_VOMIT:
case SKINCOLOR_GARDEN:
case SKINCOLOR_TEA:
case SKINCOLOR_PISTACHIO:
cstart = 0x8b; // V_TEAMAP
break;
case SKINCOLOR_LIME:
case SKINCOLOR_HANDHELD:
case SKINCOLOR_MOSS:
case SKINCOLOR_CAMOUFLAGE:
case SKINCOLOR_ROBOHOOD:
case SKINCOLOR_MINT:
case SKINCOLOR_GREEN:
case SKINCOLOR_PINETREE:
case SKINCOLOR_EMERALD:
case SKINCOLOR_SWAMP:
case SKINCOLOR_DREAM:
case SKINCOLOR_PLAGUE:
case SKINCOLOR_ALGAE:
cstart = 0x83; // V_GREENMAP
break;
case SKINCOLOR_CARIBBEAN:
case SKINCOLOR_AZURE:
case SKINCOLOR_AQUA:
case SKINCOLOR_TEAL:
case SKINCOLOR_CYAN:
case SKINCOLOR_JAWZ:
case SKINCOLOR_CERULEAN:
case SKINCOLOR_NAVY:
case SKINCOLOR_SAPPHIRE:
cstart = 0x88; // V_SKYMAP
break;
case SKINCOLOR_PIGEON:
case SKINCOLOR_PLATINUM:
case SKINCOLOR_STEEL:
cstart = 0x8c; // V_STEELMAP
break;
case SKINCOLOR_PERIWINKLE:
case SKINCOLOR_BLUE:
case SKINCOLOR_BLUEBERRY:
case SKINCOLOR_NOVA:
cstart = 0x84; // V_BLUEMAP
break;
case SKINCOLOR_ULTRAVIOLET:
case SKINCOLOR_PURPLE:
case SKINCOLOR_FUCHSIA:
cstart = 0x81; // V_PURPLEMAP
break;
case SKINCOLOR_PASTEL:
case SKINCOLOR_MOONSLAM:
case SKINCOLOR_DUSK:
case SKINCOLOR_TOXIC:
case SKINCOLOR_MAUVE:
case SKINCOLOR_LAVENDER:
case SKINCOLOR_BYZANTIUM:
case SKINCOLOR_POMEGRANATE:
cstart = 0x89; // V_LAVENDERMAP
break;
default:
break;
}
return cstart;
}
INT32 V_SkinColorToHighlightcolor(skincolors_t color)
{
switch (color)
-2
View File
@@ -287,8 +287,6 @@ INT32 V_ThinSubStringWidth(const char *string, INT32 length, INT32 option);
// Find maximum length for substring taken from current string to fit into given width
INT32 V_SubStringLengthToFit(const char *string, INT32 width, INT32 option);
char V_GetSkincolorChar(INT32 color);
INT32 V_SkinColorToHighlightcolor(skincolors_t color);
// this is pretty dumb, but has to be done like this, otherwise the fps counter just disappears sometimes for no reason lol
+16 -4
View File
@@ -365,7 +365,7 @@ static inline INT32 W_MakeFileMD5(const char *filename, void *resblock)
if ((fhandle = fopen(filename, "rb")) != NULL)
{
tic_t t = I_GetTime();
precise_t t = I_GetPreciseTime();
CONS_Debug(DBG_SETUP, "Making MD5 for %s\n",filename);
@@ -376,7 +376,7 @@ static inline INT32 W_MakeFileMD5(const char *filename, void *resblock)
}
CONS_Debug(DBG_SETUP, "MD5 calc for %s took %f seconds\n",
filename, (float)(I_GetTime() - t)/NEWTICRATE);
filename, (float)(I_GetPreciseTime() - t)/I_GetPrecisePrecision());
fclose(fhandle);
return 0;
@@ -2589,6 +2589,18 @@ static int W_CheckFileContains(const char *filename, lumpchecklist_t *checklist)
return contains;
}
int W_CheckAutoLoadContainsMap(const char *filename)
{
// for now this checks for map marker
static lumpchecklist_t autoloadblacklist[] =
{
{"MAP", 3},
{NULL, 0},
};
return W_CheckFileContains(filename, autoloadblacklist);
}
int W_CheckPostLoadList(const char *filename)
{
static lumpchecklist_t postloadlist[] =
@@ -2601,7 +2613,6 @@ int W_CheckPostLoadList(const char *filename)
{"SOC_", 4},
{"MAINCFG", 7},
{"OBJCTCFG", 8},
{"MAP", 3},
{NULL, 0},
};
@@ -2662,11 +2673,12 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
{
if (vsizecache[realentry] == 0)
continue;
vlumps[i].size = vsizecache[realentry];
const char *name = (fileinfo + realentry)->name;
if (strlen(name) == 5 && memcmp(name, "MAP", 3) == 0)
if (strnlen(name, 8) == 5 && memcmp(name, "MAP", 3) == 0)
{
numlumps--; // We skip map marker, so 1 of entries becomes empty
continue; // This will skip i++ so we will write to same entry
+1
View File
@@ -241,6 +241,7 @@ void W_VerifyFileMD5(UINT16 wadfilenum, const char *matchmd5);
int W_VerifyNMUSlumps(const char *filename, FILE *handle, boolean exit_on_error);
int W_CheckAutoLoadContainsMap(const char *filename);
int W_CheckPostLoadList(const char *filename);
#ifdef __cplusplus
+10 -2
View File
@@ -523,11 +523,19 @@ void Z_CheckHeap(INT32 tag)
#ifdef VALGRIND_MEMPOOL_EXISTS
if (!VALGRIND_MEMPOOL_EXISTS(block))
{
I_Error("Z_CheckHeap %d: block %u"
I_Error("Z_CheckHeap :"
#ifdef ZDEBUG
" %s %d"
#endif
" block %u"
#ifdef ZDEBUG
" (owned by %s:%d)"
#endif
" should not exist", i, blocknumon
" should not exist"
#ifdef ZDEBUG
, file, line
#endif
, blocknumon
#ifdef ZDEBUG
, block->ownerfile, block->ownerline
#endif