Compare commits
377
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0c440d240c | ||
|
|
5c7be85977 | ||
|
|
c401926c0b | ||
|
|
957d3f7229 | ||
|
|
38a248193e | ||
|
|
934f2d347c | ||
|
|
551d7d4d89 | ||
|
|
a2184d2bef | ||
|
|
d638baeda6 | ||
|
|
4a06e8a6d1 | ||
|
|
e2a3992787 | ||
|
|
ec06150432 | ||
|
|
2413a3503c | ||
|
|
d9e339cb56 | ||
|
|
408db7a2eb | ||
|
|
e12ecabcf0 | ||
|
|
65c2d2733d | ||
|
|
00aa023e9e | ||
|
|
f43a4a2eb6 | ||
|
|
4eb108e0a6 | ||
|
|
ea76af5a81 | ||
|
|
4b8f998c85 | ||
|
|
d687be4997 | ||
|
|
1bcadf3c46 | ||
|
|
80e4d02c51 | ||
|
|
352d1faacf | ||
|
|
7f9d70285d | ||
|
|
496477fa9a | ||
|
|
530bb50709 | ||
|
|
8bb04a68a8 | ||
|
|
820ab4b2bc | ||
|
|
af6abb5458 | ||
|
|
5c373b6251 | ||
|
|
24bac9c133 | ||
|
|
73c7a5a0c4 | ||
|
|
49d6374505 | ||
|
|
2ba4757c6a | ||
|
|
3606b0ae66 | ||
|
|
ba75523d48 | ||
|
|
71640202ed | ||
|
|
5fb5af05be | ||
|
|
4f036c9312 | ||
|
|
d99c272a79 | ||
|
|
c4ed75fbc6 | ||
|
|
91927e324b | ||
|
|
13dc0db9a9 | ||
|
|
8aafde4c9d | ||
|
|
266a4effb7 | ||
|
|
948c9399de | ||
|
|
db4aedf498 | ||
|
|
f12d5a246d | ||
|
|
6efe56808a | ||
|
|
ec047151e3 | ||
|
|
b1100d6215 | ||
|
|
cb8df4c3d0 | ||
|
|
fbae43f61a | ||
|
|
7ea95b4495 | ||
|
|
07c780dc9c | ||
|
|
f6d3ab1f3a | ||
|
|
2c8099e228 | ||
|
|
7c84dd5661 | ||
|
|
cabd8baae5 | ||
|
|
593540a3f9 | ||
|
|
407af1d25c | ||
|
|
029c21eae8 | ||
|
|
568f29ed1c | ||
|
|
2dacc333b5 | ||
|
|
363612c488 | ||
|
|
d8ffffd86e | ||
|
|
4b2a13defb | ||
|
|
9cc74d8b17 | ||
|
|
066adb972e | ||
|
|
0f1ad8a086 | ||
|
|
40537eca81 | ||
|
|
0cff3c23f3 | ||
|
|
9bdda66a0c | ||
|
|
3b6a09da9b | ||
|
|
c275555678 | ||
|
|
fc588f8046 | ||
|
|
17093e8022 | ||
|
|
b575c288fa | ||
|
|
f9a6702219 | ||
|
|
cfda853e6f | ||
|
|
14ac3ca9b0 | ||
|
|
e94fecf56d | ||
|
|
51d9aa6197 | ||
|
|
96a29abc62 | ||
|
|
fa1b797a44 | ||
|
|
e1061ab4b4 | ||
|
|
ab0d071d35 | ||
|
|
8129b89034 | ||
|
|
14aaba7a87 | ||
|
|
2c1bb6c268 | ||
|
|
cc6437285f | ||
|
|
b24f6683b7 | ||
|
|
5f559af29c | ||
|
|
eef1c55549 | ||
|
|
3c227ec532 | ||
|
|
50f839e1ad | ||
|
|
8db399be9b | ||
|
|
8cb321993e | ||
|
|
b4cad08ad3 | ||
|
|
fa899d3970 | ||
|
|
b955fdb47d | ||
|
|
4686e8e112 | ||
|
|
667c67a61a | ||
|
|
df9a23a6c7 | ||
|
|
a3f557f4df | ||
|
|
1ac029edc6 | ||
|
|
761766d353 | ||
|
|
72d3360711 | ||
|
|
ac52ec2c48 | ||
|
|
956bc3f7df | ||
|
|
746a8cec8b | ||
|
|
f7a32b5f85 | ||
|
|
bd30ab8fb7 | ||
|
|
4140f93e41 | ||
|
|
8ae6f71578 | ||
|
|
d5083ac66c | ||
|
|
62be792a0d | ||
|
|
c34346cb9a | ||
|
|
d7803ecdcf | ||
|
|
1a2a487a93 | ||
|
|
bed6306cdf | ||
|
|
7521b3abd2 | ||
|
|
58d5bab181 | ||
|
|
2bffe443ed | ||
|
|
261c02f4b6 | ||
|
|
d59ac7d01b | ||
|
|
ac86f36186 | ||
|
|
b5c7fd5a2b | ||
|
|
da103f54d6 | ||
|
|
f82d138482 | ||
|
|
e7332a3efe | ||
|
|
bd27a62769 | ||
|
|
2b650e4b61 | ||
|
|
8e82256827 | ||
|
|
4fa937728b | ||
|
|
9f9e6450f2 | ||
|
|
1c75dd0401 | ||
|
|
e854096ca0 | ||
|
|
83a60ea857 | ||
|
|
3d9d14b353 | ||
|
|
24c9f88262 | ||
|
|
b652d802f5 | ||
|
|
459beeb000 | ||
|
|
a28d798189 | ||
|
|
e75a696ee5 | ||
|
|
e113027ce6 | ||
|
|
2ce4e866e3 | ||
|
|
55a57a1036 | ||
|
|
6aabdc86c0 | ||
|
|
9aaa7cc5bf | ||
|
|
d6946d4d44 | ||
|
|
a868844bdf | ||
|
|
39fd31c4b9 | ||
|
|
54f3d7b5e0 | ||
|
|
88116368bb | ||
|
|
9328825a7c | ||
|
|
f825ca32cc | ||
|
|
ce982d170f | ||
|
|
1b3050028e | ||
|
|
2344552ba8 | ||
|
|
50c1263e7d | ||
|
|
f1ded99262 | ||
|
|
b1620a3fce | ||
|
|
d0ea4d20d0 | ||
|
|
7f4804f98c | ||
|
|
4fe3495652 | ||
|
|
3c409b4a46 | ||
|
|
45067e00a5 | ||
|
|
370ed1583b | ||
|
|
535c2073f1 | ||
|
|
6460ae94f1 | ||
|
|
093ed023ef | ||
|
|
1bada2810a | ||
|
|
9df7f3cd3f | ||
|
|
010b6c0361 | ||
|
|
dbf67a9670 | ||
|
|
8868445c3c | ||
|
|
568cb8b8c7 | ||
|
|
3b00a69615 | ||
|
|
6949ce82ab | ||
|
|
c343c52477 | ||
|
|
7931a82b23 | ||
|
|
31ccf9c34a | ||
|
|
ff3b73c49e | ||
|
|
64bed71509 | ||
|
|
eed5943b0b | ||
|
|
4f9ddffe2a | ||
|
|
a73f3a073c | ||
|
|
a59928221b | ||
|
|
b46e5cb577 | ||
|
|
bb62fbfc12 | ||
|
|
81f46224e1 | ||
|
|
6c58c0de41 | ||
|
|
4edc102d67 | ||
|
|
e0bf663157 | ||
|
|
eccc3eb33f | ||
|
|
1217089d81 | ||
|
|
e5c0967a3f | ||
|
|
27f22e4b5b | ||
|
|
c039d14efc | ||
|
|
71a0b25e32 | ||
|
|
8c2132a98c | ||
|
|
898bcd336d | ||
|
|
5461a6dcbe | ||
|
|
d957bddc1f | ||
|
|
7177a9f57f | ||
|
|
4ccf3dfaf9 | ||
|
|
489a58f9fd | ||
|
|
b26effa241 | ||
|
|
efd8c20d26 | ||
|
|
03b85aa00e | ||
|
|
e6434c24ec | ||
|
|
52e23e7b08 | ||
|
|
b84e6d89e2 | ||
|
|
42fa435a0b | ||
|
|
873cff4474 | ||
|
|
e543599598 | ||
|
|
9d75bb1405 | ||
|
|
7b0e3269b3 | ||
|
|
12169bfb38 | ||
|
|
4dd5957f19 | ||
|
|
0fadfe0f72 | ||
|
|
621df7e296 | ||
|
|
17d72e02fe | ||
|
|
cd76660314 | ||
|
|
06a9ab785e | ||
|
|
6760546bcd | ||
|
|
b44e003ab9 | ||
|
|
6a1c907aa4 | ||
|
|
fded8cc562 | ||
|
|
43465c0e3f | ||
|
|
7fb21c35ba | ||
|
|
f6a0430a40 | ||
|
|
ab209448d1 | ||
|
|
9334b86f6e | ||
|
|
6022966d69 | ||
|
|
6c7db705c7 | ||
|
|
ce3d17de68 | ||
|
|
404d88a536 | ||
|
|
4f28f574bb | ||
|
|
654895dcff | ||
|
|
8af43a55c9 | ||
|
|
0d20ebb01f | ||
|
|
1c74b37026 | ||
|
|
6721f534cc | ||
|
|
bb3414d603 | ||
|
|
e13cb1ca92 | ||
|
|
a0dffd0670 | ||
|
|
7684e6aa07 | ||
|
|
0fb752b745 | ||
|
|
c418fe3ef8 | ||
|
|
fdccc80260 | ||
|
|
84be9096b1 | ||
|
|
e4e51f0f80 | ||
|
|
9087fd8377 | ||
|
|
1aa37be676 | ||
|
|
04f63b23ff | ||
|
|
d6ed923f83 | ||
|
|
c7845118c0 | ||
|
|
ffc6adde4c | ||
|
|
fed7020da1 | ||
|
|
1a4255d9df | ||
|
|
f6ead71f0c | ||
|
|
966f60f590 | ||
|
|
9afc018a45 | ||
|
|
43608810da | ||
|
|
90b5f9050a | ||
|
|
edc10a35a1 | ||
|
|
91435fe1b2 | ||
|
|
a7ebc7e745 | ||
|
|
3cf3c1bb99 | ||
|
|
2c170f1956 | ||
|
|
98da654e02 | ||
|
|
af84105e40 | ||
|
|
a1666704e5 | ||
|
|
7b408a33d7 | ||
|
|
9ee535066e | ||
|
|
6430150b63 | ||
|
|
16cf4ede89 | ||
|
|
efe8732188 | ||
|
|
07fc0eb03a | ||
|
|
f2b46fd148 | ||
|
|
8247133966 | ||
|
|
397fb071e5 | ||
|
|
1a9fa94cbd | ||
|
|
e8c7cc6a9b | ||
|
|
5ca3ab5966 | ||
|
|
1cf04514b3 | ||
|
|
5577ba4c7a | ||
|
|
6ff1cbf4b0 | ||
|
|
db4cd73912 | ||
|
|
3c70598aea | ||
|
|
1ec29c1c94 | ||
|
|
fedccd25b9 | ||
|
|
1e51365cad | ||
|
|
94026e4331 | ||
|
|
2084cdc6d5 | ||
|
|
1b22c3af19 | ||
|
|
3e327263c9 | ||
|
|
7c24d92613 | ||
|
|
ba808307e9 | ||
|
|
014a22e933 | ||
|
|
3f3ba9e993 | ||
|
|
2f684bba95 | ||
|
|
a287a6419f | ||
|
|
6f2aba7ee3 | ||
|
|
a9a0d4bed8 | ||
|
|
355c78e075 | ||
|
|
4623f8aff2 | ||
|
|
1265bbba2e | ||
|
|
fdccf868cc | ||
|
|
3204b5c3b4 | ||
|
|
cd02242a01 | ||
|
|
e35dc9e097 | ||
|
|
f4dc161831 | ||
|
|
1d6c27baca | ||
|
|
009df228d6 | ||
|
|
7746e494cf | ||
|
|
90a88983f1 | ||
|
|
22a4fe63db | ||
|
|
d77508f481 | ||
|
|
53321d33d5 | ||
|
|
5c28f6afd8 | ||
|
|
d49001143f | ||
|
|
513e5a7e3f | ||
|
|
6f75fab7ff | ||
|
|
38fc6d6ba1 | ||
|
|
02f2464a00 | ||
|
|
c84724da37 | ||
|
|
86b286fb0b | ||
|
|
ecef8913b1 | ||
|
|
277b202020 | ||
|
|
6ba97bc43c | ||
|
|
0fbde146a9 | ||
|
|
16e0c6f0f6 | ||
|
|
8cab07a4b2 | ||
|
|
00bc8bc149 | ||
|
|
f12b55f63b | ||
|
|
3e476d7658 | ||
|
|
6cbb8a36cf | ||
|
|
7dbb08315c | ||
|
|
b1ff1bb531 | ||
|
|
8eaf4a73f4 | ||
|
|
bf1aa47854 | ||
|
|
be423b2910 | ||
|
|
3bf3bdf641 | ||
|
|
e923777eb6 | ||
|
|
cf6eb0010e | ||
|
|
5184115216 | ||
|
|
39a46e8f79 | ||
|
|
d9712cf85e | ||
|
|
9ccd62b5cb | ||
|
|
0691e2d9e2 | ||
|
|
8e67e0bace | ||
|
|
08864e27b2 | ||
|
|
4a3c9ccfbb | ||
|
|
cedd789a27 | ||
|
|
fd2c208612 | ||
|
|
8f91707164 | ||
|
|
37eba186f5 | ||
|
|
8f3b7158e3 | ||
|
|
b76ce836a0 | ||
|
|
fd1e415731 | ||
|
|
41c887f2bf | ||
|
|
8091d825d5 | ||
|
|
699113fb25 | ||
|
|
3996abef36 | ||
|
|
7eb2ad1e35 | ||
|
|
f49e57a38c | ||
|
|
265f4a50ef | ||
|
|
e83e2659a7 | ||
|
|
c680dd3222 | ||
|
|
96aaaf5261 | ||
|
|
efb29e6be5 |
No files matched your search
+4
-1
@@ -1,5 +1,8 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
# needed for lto to work for some reason
|
||||
cmake_policy(SET CMP0069 NEW)
|
||||
|
||||
if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR})
|
||||
message(FATAL_ERROR "In-source builds will bring you a world of pain. Please make a separate directory to invoke CMake from.")
|
||||
endif()
|
||||
@@ -31,7 +34,7 @@ if("${SRB2_CPACK_GENERATOR}" STREQUAL "")
|
||||
endif()
|
||||
|
||||
set(CPACK_GENERATOR ${SRB2_CPACK_GENERATOR})
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Sonic Robo Blast 2 Kart" CACHE STRING "Program name for display purposes")
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Sonic Robo Blast 2 Kart Saturn" CACHE STRING "Program name for display purposes")
|
||||
set(CPACK_PACKAGE_VENDOR "Kart Krew" CACHE STRING "Vendor name for display purposes")
|
||||
#set(CPACK_PACKAGE_DESCRIPTION_FILE )
|
||||
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
|
||||
|
||||
+3
-1
@@ -275,6 +275,7 @@ if(${SRB2_CONFIG_HAVE_BLUA})
|
||||
lua_hooklib.c
|
||||
lua_hudlib.c
|
||||
lua_hudlib_drawlist.c
|
||||
lua_profile.cpp
|
||||
lua_infolib.c
|
||||
lua_maplib.c
|
||||
lua_mathlib.c
|
||||
@@ -290,6 +291,7 @@ if(${SRB2_CONFIG_HAVE_BLUA})
|
||||
lua_hook.h
|
||||
lua_hud.h
|
||||
lua_hudlib_drawlist.h
|
||||
lua_profile.h
|
||||
lua_libs.h
|
||||
lua_script.h
|
||||
lua_udatalib.h
|
||||
@@ -518,7 +520,7 @@ if(${SRB2_CONFIG_HWRENDER})
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_batching.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_shaders.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_bsp.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_cache.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_cache.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_clip.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_draw.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_main.cpp
|
||||
|
||||
+11
-5
@@ -93,7 +93,8 @@
|
||||
# NOLDWARNING=1 - ?
|
||||
# NOSDLMAIN=1 - ?
|
||||
# SDLMAIN=1 - ?
|
||||
# USELTO=1 - Enable building with LTO.
|
||||
# NOLTO=1 - Disable link time optimizations
|
||||
# USEJEMALLOC=1 Enable building with jemalloc Allocator to replace GLibc malloc, might improve performance
|
||||
#
|
||||
# Library configuration flags:
|
||||
# Everything here is an override.
|
||||
@@ -260,7 +261,7 @@ debug_opts=-D_DEBUG
|
||||
else # build a normal optimized version
|
||||
debug_opts=-DNDEBUG
|
||||
opts+=-O3
|
||||
ifdef USELTO
|
||||
ifndef NOLTO
|
||||
# compile with LTO
|
||||
opts+=-flto=auto
|
||||
libs+=-flto=auto
|
||||
@@ -269,16 +270,20 @@ 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
|
||||
|
||||
ifdef USEJEMALLOC
|
||||
libs+=-ljemalloc
|
||||
endif
|
||||
|
||||
ifneq (,$(filter $(CC) $(CXX),clang clang++))
|
||||
libs+=-fuse-ld=lld
|
||||
endif
|
||||
@@ -295,6 +300,7 @@ opts+=$(debug_opts)
|
||||
|
||||
opts+=$(foreach v,$(passthru_opts),$(if $($(v)),-D$(v)))
|
||||
|
||||
CWFLAGS+=-std=gnu17
|
||||
CXXFLAGS+=-std=c++17 # force c17 for c++ since most vpss run older ubuntu versions with old compilers
|
||||
|
||||
opts+=$(WFLAGS) $(CFLAGS)
|
||||
|
||||
@@ -64,6 +64,7 @@ endif
|
||||
|
||||
# This must have high to low order.
|
||||
gcc_versions:=\
|
||||
161 160 16\
|
||||
152 151 150 15\
|
||||
142 141 140 14\
|
||||
133 132 131 130 13\
|
||||
@@ -77,7 +78,7 @@ gcc_versions:=\
|
||||
55 54 53 52 51 50\
|
||||
49 48 47 46 45 44 43 42 41 40
|
||||
|
||||
latest_gcc_version:=15.2
|
||||
latest_gcc_version:=16.1
|
||||
|
||||
# Automatically set version flag, but not if one was
|
||||
# manually set. And don't bother if this is a clean only
|
||||
|
||||
@@ -8,6 +8,7 @@ passthru_opts+=\
|
||||
HAVE_MINIUPNPC\
|
||||
HAVE_DISCORDRPC DEVELOP\
|
||||
NOHOLEPUNCH\
|
||||
HAVE_IPV6\
|
||||
|
||||
# build with debugging information
|
||||
ifdef DEBUGMODE
|
||||
|
||||
+13
-12
@@ -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
|
||||
@@ -99,3 +99,4 @@ lua_skinlib.c
|
||||
lua_thinkerlib.c
|
||||
lua_udatalib.c
|
||||
lua_glib.c
|
||||
lua_profile.cpp
|
||||
+1
-1
@@ -434,7 +434,7 @@ LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {
|
||||
LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) {
|
||||
lua_lock(L);
|
||||
luaC_checkGC(L);
|
||||
setsvalue2s(L, L->top, (len == 0) ? luaS_new(L, "") : luaS_newlstr(L, s, len));
|
||||
setsvalue2s(L, L->top, (len == 0) ? luaS_newlstr(L, "", 0) : luaS_newlstr(L, s, len));
|
||||
api_incr_top(L);
|
||||
lua_unlock(L);
|
||||
}
|
||||
|
||||
+15
-3
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
@@ -81,6 +81,7 @@ static /*const*/ Node dummynode_ = {
|
||||
/*
|
||||
** hash for lua_Numbers
|
||||
*/
|
||||
#if 0
|
||||
static Node *hashnum (const Table *t, lua_Number n) {
|
||||
unsigned int a[numints];
|
||||
int i;
|
||||
@@ -90,6 +91,12 @@ static Node *hashnum (const Table *t, lua_Number n) {
|
||||
for (i = 1; i < numints; i++) a[0] += a[i];
|
||||
return hashmod(t, a[0]);
|
||||
}
|
||||
#else
|
||||
// our lua_Number is just typedef´d int32 so no need to do any of the above
|
||||
static inline Node *hashnum (const Table *t, lua_Number n) {
|
||||
return hashmod(t, cast(unsigned int, n));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
+48
-16
@@ -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;
|
||||
|
||||
+66
-4
@@ -1165,6 +1165,39 @@ void VS_Print(vsbuf_t *buf, const char *data)
|
||||
//
|
||||
// =========================================================================
|
||||
|
||||
#define NAME cvar_map_t
|
||||
#define KEY_TY const char *
|
||||
#define VAL_TY consvar_t *
|
||||
#define HASH_FN FNV1a_HashLowercaseString
|
||||
#define CMPR_FN vt_cmpr_casestring
|
||||
#include "verstable.h"
|
||||
|
||||
#define NAME netvar_map_t
|
||||
#define KEY_TY UINT16
|
||||
#define VAL_TY consvar_t *
|
||||
#define HASH_FN vt_hash_integer
|
||||
#define CMPR_FN vt_cmpr_integer
|
||||
#include "verstable.h"
|
||||
|
||||
static cvar_map_t cvar_map;
|
||||
static netvar_map_t netvar_map;
|
||||
|
||||
CONSTRUCTOR static void CV_InitMap(void)
|
||||
{
|
||||
// ensure the map is initialized
|
||||
cvar_map_t_init(&cvar_map);
|
||||
cvar_map_t_reserve(&cvar_map, 512);
|
||||
|
||||
netvar_map_t_init(&netvar_map);
|
||||
netvar_map_t_reserve(&netvar_map, 256);
|
||||
}
|
||||
|
||||
DESTRUCTOR static void CV_DestroyMap(void)
|
||||
{
|
||||
cvar_map_t_cleanup(&cvar_map);
|
||||
netvar_map_t_cleanup(&netvar_map);
|
||||
}
|
||||
|
||||
static const char *cv_null_string = "";
|
||||
|
||||
/** Searches if a variable has been registered.
|
||||
@@ -1175,11 +1208,17 @@ static const char *cv_null_string = "";
|
||||
*/
|
||||
consvar_t *CV_FindVar(const char *name)
|
||||
{
|
||||
consvar_t *cvar;
|
||||
cvar_map_t_itr it = cvar_map_t_get(&cvar_map, name);
|
||||
if (!cvar_map_t_is_end(it))
|
||||
return it.data->val;
|
||||
|
||||
// fallback linear search
|
||||
/*
|
||||
consvar_t *cvar;
|
||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||
if (fasticmp(name,cvar->name))
|
||||
if (fasticmp(name, cvar->name))
|
||||
return cvar;
|
||||
*/
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -1194,7 +1233,7 @@ consvar_t *CV_FindVar(const char *name)
|
||||
static inline UINT16 CV_ComputeNetid(const char *s)
|
||||
{
|
||||
UINT16 ret = 0, i = 0;
|
||||
static UINT16 premiers[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};
|
||||
static const UINT16 premiers[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};
|
||||
|
||||
while (*s)
|
||||
{
|
||||
@@ -1213,11 +1252,17 @@ static inline UINT16 CV_ComputeNetid(const char *s)
|
||||
*/
|
||||
static consvar_t *CV_FindNetVar(UINT16 netid)
|
||||
{
|
||||
netvar_map_t_itr it = netvar_map_t_get(&netvar_map, netid);
|
||||
if (!netvar_map_t_is_end(it))
|
||||
return it.data->val;
|
||||
|
||||
/*
|
||||
consvar_t *cvar;
|
||||
|
||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||
if (cvar->netid == netid)
|
||||
return cvar;
|
||||
*/
|
||||
|
||||
if (netid == 44542) // ouch this hack
|
||||
return &cv_karteliminatelast;
|
||||
@@ -1283,6 +1328,11 @@ void CV_RegisterVar(consvar_t *variable)
|
||||
|
||||
// the SetValue will set this bit
|
||||
variable->flags &= ~CV_MODIFIED;
|
||||
|
||||
cvar_map_t_insert(&cvar_map, variable->name, variable);
|
||||
|
||||
if (variable->flags & CV_NETVAR)
|
||||
netvar_map_t_insert(&netvar_map, variable->netid, variable);
|
||||
}
|
||||
|
||||
/** Finds the string value of a console variable.
|
||||
@@ -1588,9 +1638,21 @@ size_t CV_LoadNetVars(const UINT8 *bufstart)
|
||||
// prevent "invalid command received"
|
||||
serverloading = true;
|
||||
|
||||
// we can use our netvar map instead of going through all cvars each time
|
||||
netvar_map_t_itr it;
|
||||
for (it = netvar_map_t_first(&netvar_map);
|
||||
!netvar_map_t_is_end(it);
|
||||
it = netvar_map_t_next(it))
|
||||
{
|
||||
cvar = it.data->val;
|
||||
Setvalue(cvar, cvar->defaultvalue, true);
|
||||
}
|
||||
|
||||
/*
|
||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||
if (cvar->flags & CV_NETVAR)
|
||||
Setvalue(cvar, cvar->defaultvalue, true);
|
||||
*/
|
||||
|
||||
count = READUINT16(p);
|
||||
while (count--)
|
||||
@@ -1793,7 +1855,7 @@ void CV_AddValue(consvar_t *var, INT32 increment)
|
||||
if (newvalue == oldvalue)
|
||||
break; // don't loop forever if there's none of a certain gametype
|
||||
|
||||
if (newvalue >= 0 && !mapheaderinfo[newvalue])
|
||||
if (newvalue >= 0 && newvalue < NUMMAPS && !mapheaderinfo[newvalue])
|
||||
continue; // Don't allocate the header. That just makes memory usage skyrocket.
|
||||
|
||||
} while (!M_CanShowLevelInList(newvalue, gt));
|
||||
|
||||
+251
-122
@@ -46,23 +46,23 @@
|
||||
#ifdef HAVE_THREADS
|
||||
I_mutex con_mutex;
|
||||
|
||||
// g_in_exiting_signal_handler is an evil hack
|
||||
// I_In_Exiting_Signal_Handler is an evil hack
|
||||
// to avoid infinite SIGABRT recursion in the signal handler
|
||||
// due to poisoned locks or mach-o kernel not supporting locks in signals
|
||||
// or something like that. idk
|
||||
# define Lock_state() if (!g_in_exiting_signal_handler) { I_lock_mutex(&con_mutex); }
|
||||
# define Unlock_state() if (!g_in_exiting_signal_handler) { I_unlock_mutex(con_mutex); }
|
||||
#else/*HAVE_THREADS*/
|
||||
# define Lock_state() if (!I_In_Exiting_Signal_Handler()) { I_lock_mutex(&con_mutex); }
|
||||
# define Unlock_state() if (!I_In_Exiting_Signal_Handler()) { I_unlock_mutex(con_mutex); }
|
||||
#else /*HAVE_THREADS*/
|
||||
# define Lock_state()
|
||||
# define Unlock_state()
|
||||
#endif/*HAVE_THREADS*/
|
||||
#endif /*HAVE_THREADS*/
|
||||
|
||||
static boolean con_started = false; // console has been initialised
|
||||
boolean con_startup = false; // true at game startup, screen need refreshing
|
||||
static boolean con_forcepic = true; // at startup toggle console translucency when first off
|
||||
boolean con_recalc = false; // set true when screen size has changed
|
||||
|
||||
static tic_t con_tick; // console ticker for anim or blinking prompt cursor
|
||||
static tic_t con_tick; // console ticker for blinking prompt cursor
|
||||
// con_scrollup should use time (currenttime - lasttime)..
|
||||
|
||||
static boolean consoletoggle; // true when console key pushed, ticker will handle
|
||||
@@ -103,6 +103,7 @@ static void CON_InputInit(void);
|
||||
static void CON_RecalcSize(void);
|
||||
static void CON_ChangeHeight(void);
|
||||
|
||||
static void CONS_height_Change(void);
|
||||
static void CONS_hudlines_Change(void);
|
||||
static void CONS_backcolor_Change(void);
|
||||
|
||||
@@ -131,7 +132,7 @@ static CV_PossibleValue_t speed_cons_t[] = {{0, "MIN"}, {64, "MAX"}, {0, NULL}};
|
||||
static consvar_t cons_speed = {"con_speed", "8", CV_SAVE, speed_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
// percentage of screen height to use for console
|
||||
static consvar_t cons_height = {"con_height", "50", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
static consvar_t cons_height = {"con_height", "50", CV_CALL|CV_SAVE, CV_Unsigned, CONS_height_Change, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
static CV_PossibleValue_t backpic_cons_t[] = {{0, "translucent"}, {1, "picture"}, {0, NULL}};
|
||||
// whether to use console background picture, or translucent mode
|
||||
@@ -173,6 +174,18 @@ consvar_t cons_consoleprintinmenu = {"consoleprintinmenu", "Off", CV_SAVE, CV_On
|
||||
|
||||
static void CON_Print(char *msg);
|
||||
|
||||
// Change the console height on demand
|
||||
//
|
||||
static void CONS_height_Change(void)
|
||||
{
|
||||
Lock_state();
|
||||
|
||||
if (con_destlines > 0 && !con_startup) // If the console is open (as in, not using "bind")...
|
||||
CON_ChangeHeight(); // ...update its height now, not only when it's closed and re-opened
|
||||
|
||||
Unlock_state();
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
static void CONS_hudlines_Change(void)
|
||||
@@ -208,14 +221,6 @@ static void CONS_Clear_f(void)
|
||||
Unlock_state();
|
||||
}
|
||||
|
||||
// Choose english keymap
|
||||
//
|
||||
/*static void CONS_English_f(void)
|
||||
{
|
||||
shiftxform = english_shiftxform;
|
||||
CONS_Printf(M_GetText("%s keymap.\n"), M_GetText("English"));
|
||||
}*/
|
||||
|
||||
static char *bindtable[NUMINPUTS];
|
||||
|
||||
static void CONS_Bind_f(void)
|
||||
@@ -633,72 +638,191 @@ void CON_MoveConsole(void)
|
||||
Unlock_state();
|
||||
}
|
||||
|
||||
//======================================================================
|
||||
// KEYBOARD LAYOUTS FOR ENTERING TEXT
|
||||
//======================================================================
|
||||
|
||||
static char english_shiftxform[] =
|
||||
{
|
||||
0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31,
|
||||
' ', '!', '"', '#', '$', '%', '&',
|
||||
'"', // shift-'
|
||||
'(', ')', '*', '+',
|
||||
'<', // shift-,
|
||||
'_', // shift--
|
||||
'>', // shift-.
|
||||
'?', // shift-/
|
||||
')', // shift-0
|
||||
'!', // shift-1
|
||||
'@', // shift-2
|
||||
'#', // shift-3
|
||||
'$', // shift-4
|
||||
'%', // shift-5
|
||||
'^', // shift-6
|
||||
'&', // shift-7
|
||||
'*', // shift-8
|
||||
'(', // shift-9
|
||||
':',
|
||||
':', // shift-;
|
||||
'<',
|
||||
'+', // shift-=
|
||||
'>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'{', // shift-[
|
||||
'|', // shift-backslash - OH MY GOD DOES WATCOM SUCK
|
||||
'}', // shift-]
|
||||
'"', '_',
|
||||
'~', // shift-`
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'{', '|', '}', '~', 127
|
||||
};
|
||||
|
||||
static char french_shiftxform[] =
|
||||
{
|
||||
0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31,
|
||||
' ','$', //shift-!
|
||||
'3', //shift-"
|
||||
'#', '$', '%',
|
||||
'1', //shift-&
|
||||
'4', // shift-'
|
||||
'5', // shift-(
|
||||
')', // shift-)
|
||||
'*', '+',
|
||||
'?', // shift-,
|
||||
'6', // shift--
|
||||
'.', '/',
|
||||
'0', '1', '2', '3', '4', '5',
|
||||
'6', '7', '8', '9',
|
||||
'/', // shitf-:
|
||||
'.', // shift-;
|
||||
'>', // shift-<
|
||||
'+', // shift-=
|
||||
'>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'[', '\\', ']', '^',
|
||||
'8', //shift-_
|
||||
'`',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'{', '|', '}', '~', 127,
|
||||
128, 129,
|
||||
'2',
|
||||
131, 132,
|
||||
'0',
|
||||
134,
|
||||
'9',
|
||||
136, 137,
|
||||
'7',
|
||||
139, 140,
|
||||
'%'
|
||||
};
|
||||
|
||||
static char french_altgrxform[] =
|
||||
{
|
||||
0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31,
|
||||
' ', '!',
|
||||
'#', //altgr-"
|
||||
'#', '$', '%', '&',
|
||||
'{', //altgr-'
|
||||
'[', //altgr-(
|
||||
']', //altgr-)
|
||||
'*', '+', ',',
|
||||
'|', //altg--
|
||||
'.', '/',
|
||||
'0', '1', '2', '3', '4', '5',
|
||||
'6', '7', '8', '9',
|
||||
':', ';', '<',
|
||||
'}', //altgr-=
|
||||
'>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'[', '\\', ']', '^',
|
||||
'\\', //altgr-backslash
|
||||
'`',
|
||||
'a', 'b', 'c', 'd', 'E', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
|
||||
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
||||
'{', '|', '}', '~', 127,
|
||||
128, 129,
|
||||
'~',
|
||||
131, 132,
|
||||
'@',
|
||||
134,
|
||||
'^',
|
||||
136, 137,
|
||||
'`',
|
||||
139, 140,
|
||||
KEY_FR_U_GRAVE
|
||||
};
|
||||
|
||||
// fallback for special letter non displayable in the game (i.e.: 'é','à',etc.)
|
||||
static INT32 CON_FallBackFrSpecialLetter(INT32 key)
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
case KEY_FR_E_AIGUE: return 'e';
|
||||
case KEY_FR_E_GRAVE: return 'e';
|
||||
case KEY_FR_C_CEDILLE: return 'c';
|
||||
case KEY_FR_A_GRAVE: return 'a';
|
||||
case KEY_FR_U_GRAVE: return 'u';
|
||||
default: return key;
|
||||
}
|
||||
}
|
||||
|
||||
// goddang AZERTY
|
||||
static size_t CON_GetShiftSize(void)
|
||||
{
|
||||
return ((cv_keyboardlayout.value == 3) ? sizeof(french_shiftxform) : sizeof(english_shiftxform));
|
||||
}
|
||||
|
||||
static char *CON_Shiftform(void)
|
||||
{
|
||||
return (cv_keyboardlayout.value == 3) ? french_shiftxform : english_shiftxform;
|
||||
}
|
||||
|
||||
INT32 CON_ShiftChar(INT32 ch)
|
||||
{
|
||||
if (I_UseNativeKeyboard())
|
||||
if (I_UseNativeKeyboard() || ch >= (INT32)CON_GetShiftSize())
|
||||
return ch;
|
||||
|
||||
// warning: shiftdown is NOT a boolean, it's 1 or 2 for lshift/rshift
|
||||
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
|
||||
{
|
||||
if (cv_keyboardlayout.value == 3)
|
||||
{
|
||||
if (shiftdown ^ capslock)
|
||||
ch = shiftxform[ch];
|
||||
else if (altdown & 0x2)
|
||||
ch = french_altgrxform[ch];
|
||||
else
|
||||
ch = HU_FallBackFrSpecialLetter(ch);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (shiftdown ^ capslock)
|
||||
ch = shiftxform[ch];
|
||||
}
|
||||
return !!shiftdown != capslock ? CON_Shiftform()[ch] : ch;
|
||||
}
|
||||
else // if we're holding shift we should still shift non letter symbols
|
||||
|
||||
// if we're holding shift we should still shift non letter symbols
|
||||
if (shiftdown)
|
||||
{
|
||||
if (cv_keyboardlayout.value == 3)
|
||||
{
|
||||
if (shiftdown)
|
||||
ch = shiftxform[ch];
|
||||
else if (altdown & 0x2)
|
||||
ch = french_altgrxform[ch];
|
||||
else
|
||||
ch = HU_FallBackFrSpecialLetter(ch);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (shiftdown)
|
||||
ch = shiftxform[ch];
|
||||
}
|
||||
return CON_Shiftform()[ch];
|
||||
}
|
||||
|
||||
// AZERTY
|
||||
if (cv_keyboardlayout.value == 3)
|
||||
{
|
||||
if (altdown & 0x2)
|
||||
return french_altgrxform[ch];
|
||||
|
||||
return CON_FallBackFrSpecialLetter(ch);
|
||||
}
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
INT32 CON_ShitAndAltGrChar(INT32 ch)
|
||||
{
|
||||
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
|
||||
{
|
||||
if (shiftdown ^ capslock)
|
||||
ch = shiftxform[ch];
|
||||
}
|
||||
else // if we're holding shift we should still shift non letter symbols
|
||||
{
|
||||
if (shiftdown)
|
||||
ch = shiftxform[ch];
|
||||
else if (altdown & 0x2)
|
||||
{
|
||||
ch = french_altgrxform[ch];
|
||||
}
|
||||
else
|
||||
{
|
||||
ch = HU_FallBackFrSpecialLetter(ch);
|
||||
}
|
||||
}
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
// Clear time of console heads up messages
|
||||
//
|
||||
@@ -892,7 +1016,7 @@ boolean CON_Responder(event_t *ev)
|
||||
return true;
|
||||
|
||||
// ctrl modifier -- changes behavior, adds shortcuts
|
||||
if ((cv_keyboardlayout.value != 3 && ctrldown) || (cv_keyboardlayout.value == 3 && ctrldown && !altdown))
|
||||
if (ctrldown && (cv_keyboardlayout.value != 3 || !altdown))
|
||||
{
|
||||
// show all cvars/commands that match what we have inputted
|
||||
if (key == KEY_TAB)
|
||||
@@ -1222,19 +1346,10 @@ void CON_LogMessage(const char *msg)
|
||||
// Console print! Wahooo! Lots o fun!
|
||||
//
|
||||
|
||||
void CONS_Printf(const char *fmt, ...)
|
||||
static inline void CONS_PrintMsg(char *txt)
|
||||
{
|
||||
va_list argptr;
|
||||
static char *txt = NULL;
|
||||
boolean startup;
|
||||
|
||||
if (txt == NULL)
|
||||
txt = malloc(8192);
|
||||
|
||||
va_start(argptr, fmt);
|
||||
vsnprintf(txt, 8192, fmt, argptr);
|
||||
va_end(argptr);
|
||||
|
||||
// echo console prints to log file
|
||||
DEBFILE(txt);
|
||||
|
||||
@@ -1260,6 +1375,21 @@ void CONS_Printf(const char *fmt, ...)
|
||||
}
|
||||
}
|
||||
|
||||
void CONS_Printf(const char *fmt, ...)
|
||||
{
|
||||
va_list argptr;
|
||||
static char *txt = NULL;
|
||||
|
||||
if (txt == NULL)
|
||||
txt = malloc(8192);
|
||||
|
||||
va_start(argptr, fmt);
|
||||
vsnprintf(txt, 8192, fmt, argptr);
|
||||
va_end(argptr);
|
||||
|
||||
CONS_PrintMsg(txt);
|
||||
}
|
||||
|
||||
void CONS_Alert(alerttype_t level, const char *fmt, ...)
|
||||
{
|
||||
va_list argptr;
|
||||
@@ -1288,9 +1418,7 @@ void CONS_Alert(alerttype_t level, const char *fmt, ...)
|
||||
break;
|
||||
}
|
||||
|
||||
// I am lazy and I feel like just letting CONS_Printf take care of things.
|
||||
// Is that okay?
|
||||
CONS_Printf("%s", txt);
|
||||
CONS_PrintMsg(txt);
|
||||
}
|
||||
|
||||
void CONS_Debug(INT32 debugflags, const char *fmt, ...)
|
||||
@@ -1308,11 +1436,9 @@ void CONS_Debug(INT32 debugflags, const char *fmt, ...)
|
||||
vsnprintf(txt, 8192, fmt, argptr);
|
||||
va_end(argptr);
|
||||
|
||||
// Again I am lazy, oh well
|
||||
CONS_Printf("%s", txt);
|
||||
CONS_PrintMsg(txt);
|
||||
}
|
||||
|
||||
|
||||
// Print an error message, and wait for ENTER key to continue.
|
||||
// To make sure the user has seen the message
|
||||
//
|
||||
@@ -1324,6 +1450,8 @@ void CONS_Error(const char *msg)
|
||||
// dirty quick hack, but for the good cause
|
||||
while (I_GetKey() != KEY_ENTER)
|
||||
{
|
||||
I_HandleInterrupt();
|
||||
|
||||
// Sleep so we don't take too much of cpu usage
|
||||
I_Sleep(1.f/TICRATE*1000);
|
||||
|
||||
@@ -1522,53 +1650,54 @@ static void CON_DrawConsole(void)
|
||||
}
|
||||
|
||||
// draw console text lines from top to bottom
|
||||
if (con_curlines < minheight)
|
||||
return;
|
||||
|
||||
i = con_cy - con_scrollup;
|
||||
|
||||
// skip the last empty line due to the cursor being at the start of a new line
|
||||
i--;
|
||||
|
||||
i -= (con_curlines - minheight) / charheight;
|
||||
|
||||
if (rendermode == render_none) return;
|
||||
|
||||
for (y = (con_curlines-minheight) % charheight; y <= con_curlines-minheight; y += charheight, i++)
|
||||
if (con_curlines >= minheight)
|
||||
{
|
||||
INT32 x;
|
||||
size_t c;
|
||||
i = con_cy - con_scrollup;
|
||||
|
||||
p = (UINT8 *)&con_buffer[((i > 0 ? i : 0)%con_totallines)*con_width];
|
||||
// skip the last empty line due to the cursor being at the start of a new line
|
||||
i--;
|
||||
|
||||
for (c = 0, x = charwidth; c < con_width; c++, x += charwidth, p++)
|
||||
i -= (con_curlines - minheight) / charheight;
|
||||
|
||||
if (rendermode == render_none)
|
||||
return;
|
||||
|
||||
for (y = (con_curlines-minheight) % charheight; y <= con_curlines-minheight; y += charheight, i++)
|
||||
{
|
||||
while (*p & 0x80)
|
||||
INT32 x;
|
||||
size_t c;
|
||||
|
||||
p = (UINT8 *)&con_buffer[((i > 0 ? i : 0)%con_totallines)*con_width];
|
||||
|
||||
for (c = 0, x = charwidth; c < con_width; c++, x += charwidth, p++)
|
||||
{
|
||||
charflags = (*p & 0x7f) << V_CHARCOLORSHIFT;
|
||||
p++;
|
||||
c++;
|
||||
while (*p & 0x80)
|
||||
{
|
||||
charflags = (*p & 0x7f) << V_CHARCOLORSHIFT;
|
||||
p++;
|
||||
c++;
|
||||
}
|
||||
|
||||
if (c >= con_width)
|
||||
break;
|
||||
|
||||
int emotelen;
|
||||
emote_t *emote;
|
||||
|
||||
if ((emote = M_VerifyEmote((const char *)p, &emotelen)))
|
||||
{
|
||||
M_DrawScaledEmote(x<<FRACBITS, (y+2*con_scalefactor)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART|V_NOSCALEPATCH);
|
||||
p += emotelen-1;
|
||||
c += emotelen-1;
|
||||
continue;
|
||||
}
|
||||
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
||||
}
|
||||
|
||||
if (c >= con_width)
|
||||
break;
|
||||
|
||||
int emotelen;
|
||||
emote_t *emote;
|
||||
|
||||
if ((emote = M_VerifyEmote((const char *)p, &emotelen)))
|
||||
{
|
||||
M_DrawScaledEmote(x<<FRACBITS, (y+2*con_scalefactor)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART|V_NOSCALEPATCH);
|
||||
p += emotelen-1;
|
||||
c += emotelen-1;
|
||||
continue;
|
||||
}
|
||||
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
||||
}
|
||||
}
|
||||
|
||||
// draw prompt if enough place (not while game startup)
|
||||
if ((con_curlines == con_destlines) && (con_curlines >= minheight) && !con_startup)
|
||||
if ((con_curlines >= (minheight-charheight)) && !con_startup)
|
||||
CON_DrawInput();
|
||||
}
|
||||
|
||||
|
||||
+8
-1
@@ -13,6 +13,10 @@
|
||||
#ifndef __CONSOLE__
|
||||
#define __CONSOLE__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "d_event.h"
|
||||
#include "command.h"
|
||||
#include "i_threads.h"
|
||||
@@ -45,7 +49,6 @@ extern UINT8 *yellowmap, *purplemap, *greenmap, *bluemap, *graymap, *redmap, *or
|
||||
extern UINT8 *consolebgmap;
|
||||
|
||||
INT32 CON_ShiftChar(INT32 ch);
|
||||
INT32 CON_ShitAndAltGrChar(INT32 ch);
|
||||
|
||||
void CON_SetupBackColormap(void);
|
||||
void CON_ClearHUD(void); // clear heads up messages
|
||||
@@ -63,4 +66,8 @@ boolean CON_Ready(void);
|
||||
|
||||
void CON_LogMessage(const char *msg);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+553
-387
File diff suppressed because it is too large.
Load diff
+9
-3
@@ -600,6 +600,8 @@ extern consvar_t cv_discordinvites;
|
||||
|
||||
extern consvar_t cv_serverinfoscreen;
|
||||
|
||||
extern consvar_t cv_serveraddoninfo;
|
||||
|
||||
// Used in d_net, the only dependence
|
||||
//tic_t ExpandTics(INT32 low, tic_t basetic);
|
||||
void D_ClientServerInit(void);
|
||||
@@ -648,21 +650,25 @@ extern UINT8 playernode[MAXPLAYERS];
|
||||
|
||||
extern boolean player_muted[MAXPLAYERS];
|
||||
|
||||
extern UINT32 localplayerping;
|
||||
|
||||
INT32 D_NumPlayers(void);
|
||||
|
||||
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;
|
||||
|
||||
|
||||
+125
-99
@@ -79,6 +79,7 @@
|
||||
#include "core/memory.h"
|
||||
|
||||
#include "lua_script.h"
|
||||
#include "lua_profile.h"
|
||||
|
||||
/* Manually defined asset hashes for non-CMake builds
|
||||
* Last updated 2015 / 05 / 03 - SRB2 v2.1.15 - srb2.srb
|
||||
@@ -130,14 +131,15 @@ 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
|
||||
|
||||
boolean singletics = false; // timedemo
|
||||
boolean lastdraw = false;
|
||||
boolean intermissionbginit = false;
|
||||
|
||||
#ifdef MOTIONBLUR
|
||||
INT32 postimgparam[MAXSPLITSCREENPLAYERS];
|
||||
@@ -153,7 +155,7 @@ boolean music_disabled = false;
|
||||
INT32 debugload = 0;
|
||||
#endif
|
||||
|
||||
char savegamename[256];
|
||||
char savegamename[256] = {};
|
||||
|
||||
char srb2home[256] = ".";
|
||||
char srb2path[256] = ".";
|
||||
@@ -274,21 +276,17 @@ static void D_Renderview(void)
|
||||
|
||||
R_ApplyLevelInterpolators(R_GetTimeFrac(RTF_LEVEL));
|
||||
|
||||
if (rendermode == render_soft)
|
||||
if (rendermode == render_soft && cv_homremoval.value)
|
||||
{
|
||||
// if this is display player 1
|
||||
if (cv_homremoval.value)
|
||||
if (cv_homremoval.value == 1)
|
||||
{
|
||||
if (cv_homremoval.value == 1)
|
||||
{
|
||||
// Clear the software screen buffer to remove HOM
|
||||
memset(vid.screens[0], 31, vid.width * vid.height);
|
||||
}
|
||||
else if (cv_homremoval.value == 2)
|
||||
{
|
||||
//'development' HOM removal -- makes it blindingly obvious if HOM is spotted.
|
||||
memset(vid.screens[0], 32+(timeinmap&15), vid.width * vid.height);
|
||||
}
|
||||
// Clear the software screen buffer to remove HOM
|
||||
memset(vid.screens[0], 31, vid.width * vid.height);
|
||||
}
|
||||
else if (cv_homremoval.value == 2)
|
||||
{
|
||||
//'development' HOM removal -- makes it blindingly obvious if HOM is spotted.
|
||||
memset(vid.screens[0], 32+(timeinmap&15), vid.width * vid.height);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -322,7 +320,6 @@ static void D_Renderview(void)
|
||||
break;
|
||||
default: // Initialize for P1
|
||||
viewwindowy = viewwindowx = 0;
|
||||
objectsdrawn = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -333,19 +330,17 @@ static void D_Renderview(void)
|
||||
}
|
||||
else if (rendermode == render_soft)
|
||||
#endif
|
||||
{
|
||||
R_RenderPlayerView(&players[displayplayers[i]]);
|
||||
}
|
||||
|
||||
if (rendermode == render_soft)
|
||||
{
|
||||
if (i == 0)
|
||||
R_ApplyViewMorph();
|
||||
|
||||
if (i == 0)
|
||||
R_ApplyViewMorph();
|
||||
#ifdef MOTIONBLUR
|
||||
V_DoPostProcessor(i, postimgparam[i]);
|
||||
V_DoPostProcessor(i, postimgparam[i]);
|
||||
#else
|
||||
V_DoPostProcessor(i, 0);
|
||||
V_DoPostProcessor(i, 0);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -369,6 +364,33 @@ static void D_Renderview(void)
|
||||
// added comment : there is a wipe eatch change of the gamestate
|
||||
gamestate_t wipegamestate = GS_LEVEL;
|
||||
|
||||
static void D_MakeIntermissionBG(void)
|
||||
{
|
||||
if (!lastdraw)
|
||||
return;
|
||||
|
||||
if (rendermode == render_none)
|
||||
{
|
||||
lastdraw = false;
|
||||
intermissionbginit = false;
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
{
|
||||
HWR_MakeScreenTexture();
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
VID_BlitLinearScreen(vid.screens[0], vid.screens[1], vid.width, vid.height, vid.width, vid.width);
|
||||
}
|
||||
|
||||
lastdraw = false;
|
||||
intermissionbginit = true;
|
||||
}
|
||||
|
||||
static boolean D_Display(void)
|
||||
{
|
||||
boolean ranwipe = false;
|
||||
@@ -534,16 +556,8 @@ static boolean D_Display(void)
|
||||
PS_START_TIMING(ps_rendercalltime);
|
||||
D_Renderview();
|
||||
PS_STOP_TIMING(ps_rendercalltime);
|
||||
}
|
||||
|
||||
if (lastdraw)
|
||||
{
|
||||
if (rendermode == render_soft)
|
||||
{
|
||||
VID_BlitLinearScreen(vid.screens[0], vid.screens[1], vid.width, vid.height, vid.width, vid.width);
|
||||
}
|
||||
|
||||
lastdraw = false;
|
||||
D_MakeIntermissionBG();
|
||||
}
|
||||
|
||||
PS_START_TIMING(ps_uitime);
|
||||
@@ -645,6 +659,11 @@ static boolean D_Display(void)
|
||||
|
||||
CON_Drawer(); // Ha, i LIED!
|
||||
|
||||
if (cv_lua_profile.value > 0)
|
||||
{
|
||||
LUA_RenderTimers();
|
||||
}
|
||||
|
||||
PS_START_TIMING(ps_swaptime);
|
||||
I_FinishUpdate(); // page flip or blit buffer
|
||||
PS_STOP_TIMING(ps_swaptime);
|
||||
@@ -709,8 +728,12 @@ void D_SRB2Loop(void)
|
||||
precise_t elapsed;
|
||||
precise_t enterprecise, finishprecise;
|
||||
|
||||
boolean ranwipe = false;
|
||||
|
||||
enterprecise = I_GetPreciseTime();
|
||||
|
||||
I_HandleInterrupt();
|
||||
|
||||
memset(&g_dc, 0, sizeof(g_dc));
|
||||
Z_Frame_Reset();
|
||||
|
||||
@@ -718,8 +741,6 @@ void D_SRB2Loop(void)
|
||||
const UINT32 framecap = R_GetFramerateCap();
|
||||
capbudget = (framecap == 0) ? 0 : (precise_t)((double)precision / (double)framecap + 0.5); // + 0.5 instead of round
|
||||
|
||||
boolean ranwipe = false;
|
||||
|
||||
I_UpdateTime(cv_timescale.value);
|
||||
|
||||
if (lastwipetic)
|
||||
@@ -783,11 +804,6 @@ void D_SRB2Loop(void)
|
||||
|
||||
doDisplay = true;
|
||||
}
|
||||
|
||||
if (!dedicated)
|
||||
{
|
||||
G_DeviceLEDTick();
|
||||
}
|
||||
}
|
||||
|
||||
if (interp)
|
||||
@@ -829,6 +845,13 @@ void D_SRB2Loop(void)
|
||||
if (takescreenshot)
|
||||
M_DoScreenShot();
|
||||
|
||||
#ifndef DEDICATED
|
||||
if (!dedicated && renderisnewtic)
|
||||
{
|
||||
G_DeviceLEDTick();
|
||||
}
|
||||
#endif
|
||||
|
||||
// consoleplayer -> displayplayers (hear sounds from viewpoint)
|
||||
S_UpdateSounds(); // move positional sounds
|
||||
|
||||
@@ -1037,25 +1060,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 +1134,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 +1160,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_Alert(CONS_WARNING, "Autoload: file %s contains map data, this WILL cause crashes and desynchs! skipping...\n", 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 +1196,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 +1204,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 +1220,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;
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
@@ -1188,7 +1231,7 @@ void D_AddPostloadFiles(void)
|
||||
|
||||
static boolean AddIWAD(const char * file, const char *dir)
|
||||
{
|
||||
char * path = va(pandf, dir, file);
|
||||
char *path = va(pandf, dir, file);
|
||||
|
||||
if (FIL_ReadFileOK(path))
|
||||
{
|
||||
@@ -1316,20 +1359,24 @@ static void IdentifyVersion(void)
|
||||
//
|
||||
// search for maps
|
||||
//
|
||||
static void D_CheckMaps(boolean checkreplaced)
|
||||
static void D_CheckMapReplacements(boolean pwad)
|
||||
{
|
||||
INT32 i;
|
||||
char *name;
|
||||
UINT16 wadnum;
|
||||
lumpinfo_t *lumpinfo;
|
||||
size_t numfiles;
|
||||
|
||||
for (wadnum = 0; wadnum < mainwads; wadnum++)
|
||||
wadnum = pwad ? (mainwads+1) : 0;
|
||||
numfiles = pwad ? numwadfiles : mainwads;
|
||||
|
||||
for (; wadnum < numfiles; wadnum++)
|
||||
{
|
||||
lumpinfo = wadfiles[wadnum]->lumpinfo;
|
||||
for (i = 0; i < wadfiles[wadnum]->numlumps; i++, lumpinfo++)
|
||||
{
|
||||
name = lumpinfo->name;
|
||||
P_CheckMapReplacements(name, checkreplaced);
|
||||
P_CheckMapReplacements(name, pwad);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1365,8 +1412,6 @@ static inline void D_MakeTitleString(char *s)
|
||||
// extra graphic patches for saturn specific thingies
|
||||
boolean xtra_speedo = false; // extra speedometer check
|
||||
boolean xtra_speedo_clr = false; // extra speedometer colour check
|
||||
boolean xtra_speedo3 = false; // 80x 11 extra speedometer check
|
||||
boolean xtra_speedo_clr3 = false; // 80x 11 extra speedometer colour check
|
||||
boolean achi_speedo = false; // achiiro speedometer check
|
||||
boolean achi_speedo_clr = false; // extra speedometer colour check
|
||||
boolean dial_speedo = false; // dial speedometer check
|
||||
@@ -1396,7 +1441,6 @@ static void D_CheckSaturnExtraFiles(void)
|
||||
CV_PossibleValue_t minimapdot_cons_temp[NUMMINIMAPDOTSTUFF] = {{0, "Off"}, {0, NULL}, {0, NULL}, {0, NULL}, {0, NULL}};
|
||||
|
||||
unsigned last_speedo_i = 0;
|
||||
unsigned last_driftgauge_i = 3;
|
||||
unsigned last_inputdisplay_i = 2;
|
||||
unsigned last_minimapdot_i = 0;
|
||||
#define PUSHCONS(cons, i, id, name) { ++i; cons[i].value = id; cons[i].strvalue = name; }
|
||||
@@ -1555,20 +1599,6 @@ static void D_CheckSaturnExtraFiles(void)
|
||||
if (found_extra3_kart)
|
||||
{
|
||||
mainwads++;
|
||||
|
||||
// 80x11 speedometer crap
|
||||
if (W_LumpExists("SP_SM3TC"))
|
||||
{
|
||||
xtra_speedo3 = true;
|
||||
PUSHCONS(speedo_cons_temp, last_speedo_i, 7, "Extra");
|
||||
PUSHCONS(driftgaugestyle_cons_temp, last_driftgauge_i, 5, "Extra");
|
||||
}
|
||||
|
||||
// 80x11 speedometer crap but colour
|
||||
if (W_LumpExists("SC_SM3TC"))
|
||||
{
|
||||
xtra_speedo_clr3 = true;
|
||||
}
|
||||
}
|
||||
|
||||
#undef PUSHCONS
|
||||
@@ -1643,12 +1673,6 @@ void D_SRB2Main(void)
|
||||
strcpy(srb2, "SRB2Kart");
|
||||
D_MakeTitleString(srb2);
|
||||
|
||||
#if defined (__OS2__) && !defined (HAVE_SDL)
|
||||
// set PM window title
|
||||
snprintf(pmData->title, sizeof (pmData->title), "SRB2Kart" VERSIONSTRING ": %s", title);
|
||||
pmData->title[sizeof (pmData->title) - 1] = '\0';
|
||||
#endif
|
||||
|
||||
if (devparm)
|
||||
CONS_Printf(M_GetText("Development mode ON.\n"));
|
||||
|
||||
@@ -1772,10 +1796,6 @@ void D_SRB2Main(void)
|
||||
// Setup default unlockable conditions
|
||||
M_SetupDefaultConditionSets();
|
||||
|
||||
// Setup character tables
|
||||
// Have to be done here before files are loaded
|
||||
M_InitCharacterTables();
|
||||
|
||||
// load wad, including the main wad file
|
||||
CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n");
|
||||
|
||||
@@ -1819,17 +1839,19 @@ void D_SRB2Main(void)
|
||||
// conversion sometimes needs the palette
|
||||
V_ReloadPalette();
|
||||
|
||||
D_CheckMaps(false);
|
||||
D_CheckMapReplacements(false);
|
||||
|
||||
W_InitMultipleFiles(startuppwads, startuppwadcount, true);
|
||||
|
||||
// Only search for pwad maps if we actually have a pwad added
|
||||
if (startuppwadcount > 0)
|
||||
{
|
||||
D_CheckMaps(true);
|
||||
CONS_Printf("W_InitMultipleFiles(): Adding extra PWADs.\n");
|
||||
W_InitMultipleFiles(startuppwads, startuppwadcount, true);
|
||||
|
||||
// Only search for pwad maps if we actually have a pwad added
|
||||
D_CheckMapReplacements(true);
|
||||
|
||||
D_CleanFile(startuppwads, startuppwadcount);
|
||||
}
|
||||
|
||||
D_CleanFile(startuppwads, startuppwadcount);
|
||||
startuppwadcount = 0;
|
||||
|
||||
cht_Init();
|
||||
@@ -1916,7 +1938,7 @@ void D_SRB2Main(void)
|
||||
CONS_Printf("R_Init(): Init SRB2 refresh daemon.\n");
|
||||
R_Init();
|
||||
|
||||
#if SOUND==SOUND_DUMMY
|
||||
#if SOUND == SOUND_DUMMY
|
||||
sound_disabled = true;
|
||||
music_disabled = true;
|
||||
#else
|
||||
@@ -2029,9 +2051,13 @@ void D_SRB2Main(void)
|
||||
if (M_CheckProtoParam("replay"))
|
||||
{
|
||||
const char *replayurl = M_GetProtoParam();
|
||||
char *replayname = strrchr(replayurl, '/');
|
||||
|
||||
if (!replayname || !replayurl)
|
||||
if (!replayurl)
|
||||
I_Error("REPLAY: Invalid URL.");
|
||||
|
||||
gconst char *replayname = strrchr(replayurl, '/');
|
||||
|
||||
if (!replayname)
|
||||
I_Error("REPLAY: Invalid URL.");
|
||||
|
||||
#define REPLAYDIR "/DownloadedReplays/"
|
||||
@@ -2145,8 +2171,8 @@ void D_SRB2Main(void)
|
||||
|
||||
if (dedicated && server)
|
||||
{
|
||||
levelstarttic = gametic;
|
||||
G_SetGamestate(GS_LEVEL);
|
||||
|
||||
if (!P_SetupLevel(false, false))
|
||||
I_Quit(); // fail so reset game stuff
|
||||
}
|
||||
|
||||
@@ -38,8 +38,6 @@ extern boolean found_extra3_kart; // for use in k_kart.c
|
||||
|
||||
extern boolean xtra_speedo; // extra speedometer check
|
||||
extern boolean xtra_speedo_clr; // extra speedometer colour check
|
||||
extern boolean xtra_speedo3; // 80x11 extra speedometer check
|
||||
extern boolean xtra_speedo_clr3; // 80x11 extra speedometer colour check
|
||||
extern boolean achi_speedo; // achiiro speedometer check
|
||||
extern boolean achi_speedo_clr; // extra speedometer colour check
|
||||
extern boolean dial_speedo; // dial speedometer check
|
||||
|
||||
+1
-5
@@ -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)
|
||||
|
||||
@@ -27,7 +27,6 @@ extern "C" {
|
||||
// SINT8 is used for nodes sometimes >:(
|
||||
#define MAXNETNODES 127
|
||||
#define BROADCASTADDR MAXNETNODES
|
||||
#define NETSPLITSCREEN // Kart's splitscreen netgame feature
|
||||
|
||||
#define STATLENGTH (TICRATE*2)
|
||||
|
||||
|
||||
+225
-504
File diff suppressed because it is too large.
Load diff
+6
-14
@@ -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;
|
||||
@@ -54,10 +51,6 @@ extern consvar_t cv_mousevisible;
|
||||
//WTF
|
||||
extern consvar_t cv_mouseturn;
|
||||
extern consvar_t cv_usejoystick[4]; //MAXSPLITSCREENPLAYERS
|
||||
#ifdef LJOYSTICK
|
||||
extern consvar_t cv_joyport;
|
||||
extern consvar_t cv_joyport2;
|
||||
#endif
|
||||
extern consvar_t cv_joyscale[4]; //MAXSPLITSCREENPLAYERS
|
||||
|
||||
// normally in p_mobj but the .h is not read
|
||||
@@ -96,11 +89,6 @@ extern consvar_t cv_pause;
|
||||
extern consvar_t cv_restrictskinchange, cv_allowteamchange, cv_ingamecap, cv_respawntime;
|
||||
extern consvar_t cv_spectatorreentry, cv_antigrief;
|
||||
|
||||
/*extern consvar_t cv_teleporters, cv_superring, cv_supersneakers, cv_invincibility;
|
||||
extern consvar_t cv_jumpshield, cv_watershield, cv_ringshield, cv_forceshield, cv_bombshield;
|
||||
extern consvar_t cv_1up, cv_eggmanbox;
|
||||
extern consvar_t cv_recycler;*/
|
||||
|
||||
// SRB2kart items
|
||||
extern consvar_t cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana;
|
||||
extern consvar_t cv_eggmanmonitor, cv_orbinaut, cv_jawz, cv_mine;
|
||||
@@ -158,8 +146,10 @@ extern consvar_t cv_pingstyle;
|
||||
|
||||
//extern consvar_t cv_smallpos;
|
||||
extern consvar_t cv_showminimapnames;
|
||||
extern consvar_t cv_showminimapfinished;
|
||||
extern consvar_t cv_minihead;
|
||||
extern consvar_t cv_showminimapangle;
|
||||
extern consvar_t cv_spinoutroll;
|
||||
|
||||
extern consvar_t cv_showlapemblem;
|
||||
|
||||
@@ -199,6 +189,8 @@ extern consvar_t cv_ps_thinkframe_page;
|
||||
extern consvar_t cv_ps_samplesize;
|
||||
extern consvar_t cv_ps_descriptor;
|
||||
|
||||
extern consvar_t cv_lua_profile;
|
||||
|
||||
extern consvar_t cv_director, cv_kartdebugdirector, cv_showdirectorhud;
|
||||
|
||||
extern consvar_t cv_showtrackaddon;
|
||||
@@ -295,7 +287,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
|
||||
|
||||
+99
-36
@@ -116,6 +116,8 @@ static I_mutex downloadmutex;
|
||||
#endif
|
||||
char downloaddir[512] = "DOWNLOAD";
|
||||
|
||||
INT32 addontypes[NUMADDONTYPES] = {0};
|
||||
|
||||
file_download_t filedownload = {};
|
||||
|
||||
#ifdef HAVE_CURL
|
||||
@@ -135,6 +137,8 @@ HTTP_login *curl_logins = NULL;
|
||||
static void CURLGetFile(void);
|
||||
#endif
|
||||
|
||||
static addontype_t GetAddonType(const char *name);
|
||||
|
||||
/** Fills a serverinfo packet with information about wad files loaded.
|
||||
*
|
||||
* \todo Give this function a better name since it is in global scope.
|
||||
@@ -163,7 +167,9 @@ UINT8 *PutFileNeeded(UINT16 firstfile)
|
||||
continue;
|
||||
}
|
||||
|
||||
nameonly(strcpy(wadfilename, wadfiles[i]->filename));
|
||||
strncpy(wadfilename, wadfiles[i]->filename, MAX_WADPATH);
|
||||
wadfilename[MAX_WADPATH-1] = '\0';
|
||||
nameonly(wadfilename);
|
||||
|
||||
// Look below at the WRITE macros to understand what these numbers mean.
|
||||
const size_t len = strlen(wadfilename) + 1;
|
||||
@@ -225,8 +231,11 @@ void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr, UINT16 fi
|
||||
fileneeded[i].willsend = (UINT8)(filestatus >> 4);
|
||||
fileneeded[i].totalsize = READUINT32(p); // The four next bytes are the file size
|
||||
fileneeded[i].file = NULL; // The file isn't open yet
|
||||
READSTRINGN(p, fileneeded[i].filename, MAX_WADPATH); // The next bytes are the file name
|
||||
READSTRINGL(p, fileneeded[i].filename, MAX_WADPATH); // The next bytes are the file name
|
||||
READMEM(p, fileneeded[i].md5sum, 16); // The last 16 bytes are the file checksum
|
||||
|
||||
// Should be good place to calculate that?
|
||||
fileneeded[i].type = GetAddonType(fileneeded[i].filename);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -250,9 +259,10 @@ void CL_PrepareDownloadSaveGame(const char *tmpsave)
|
||||
*/
|
||||
boolean CL_CheckDownloadable(void)
|
||||
{
|
||||
UINT8 i,dlstatus = 0;
|
||||
UINT8 i, dlstatus = 0;
|
||||
|
||||
for (i = 0; i < fileneedednum; i++)
|
||||
{
|
||||
if (fileneeded[i].status != FS_FOUND && fileneeded[i].status != FS_OPEN)
|
||||
{
|
||||
if (fileneeded[i].willsend == 1)
|
||||
@@ -263,6 +273,7 @@ boolean CL_CheckDownloadable(void)
|
||||
else //if (fileneeded[i].willsend == 2)
|
||||
dlstatus = 2;
|
||||
}
|
||||
}
|
||||
|
||||
// Downloading locally disabled
|
||||
if (!dlstatus && M_CheckParm("-nodownload"))
|
||||
@@ -273,15 +284,17 @@ boolean CL_CheckDownloadable(void)
|
||||
|
||||
// not downloadable, put reason in console
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You need additional files to connect to this server:\n"));
|
||||
|
||||
for (i = 0; i < fileneedednum; i++)
|
||||
{
|
||||
if (fileneeded[i].status != FS_FOUND && fileneeded[i].status != FS_OPEN)
|
||||
{
|
||||
CONS_Printf(" * \"%s\" (%dK)", fileneeded[i].filename, fileneeded[i].totalsize >> 10);
|
||||
|
||||
if (fileneeded[i].status == FS_MD5SUMBAD)
|
||||
CONS_Printf(M_GetText(" wrong version, md5: "));
|
||||
else
|
||||
CONS_Printf(M_GetText(" not found, md5: "));
|
||||
if (fileneeded[i].status == FS_MD5SUMBAD)
|
||||
CONS_Printf(M_GetText(" wrong version, md5: "));
|
||||
else
|
||||
CONS_Printf(M_GetText(" not found, md5: "));
|
||||
|
||||
{
|
||||
INT32 j;
|
||||
@@ -292,6 +305,7 @@ boolean CL_CheckDownloadable(void)
|
||||
}
|
||||
CONS_Printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
switch (dlstatus)
|
||||
{
|
||||
@@ -305,6 +319,7 @@ boolean CL_CheckDownloadable(void)
|
||||
CONS_Printf(M_GetText("All files downloadable, but you have chosen to disable downloading locally.\n"));
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -542,7 +557,7 @@ INT32 CL_CheckFiles(void)
|
||||
if (fileneeded[i].status != FS_OPEN)
|
||||
filestoload++;
|
||||
|
||||
if (fileneeded[i].status != FS_NOTCHECKED) //since we're running this over multiple tics now, its possible for us to come across files checked in previous tics
|
||||
if (fileneeded[i].status != FS_NOTCHECKED) // since we're running this over multiple tics now, its possible for us to come across files checked in previous tics
|
||||
continue;
|
||||
|
||||
CONS_Debug(DBG_NETPLAY, "searching for '%s' ", fileneeded[i].filename);
|
||||
@@ -550,14 +565,18 @@ INT32 CL_CheckFiles(void)
|
||||
// Check in already loaded files
|
||||
for (j = mainwads+1; j < numwadfiles; j++)
|
||||
{
|
||||
nameonly(strcpy(wadfilename, wadfiles[j]->filename));
|
||||
|
||||
if (fasticmp(wadfilename, fileneeded[i].filename) &&
|
||||
!memcmp(wadfiles[j]->md5sum, fileneeded[i].md5sum, 16))
|
||||
if (!memcmp(wadfiles[j]->md5sum, fileneeded[i].md5sum, 16))
|
||||
{
|
||||
CONS_Debug(DBG_NETPLAY, "already loaded\n");
|
||||
fileneeded[i].status = FS_OPEN;
|
||||
return 4;
|
||||
strncpy(wadfilename, wadfiles[j]->filename, MAX_WADPATH);
|
||||
wadfilename[MAX_WADPATH-1] = '\0';
|
||||
nameonly(wadfilename);
|
||||
|
||||
if (fasticmp(wadfilename, fileneeded[i].filename))
|
||||
{
|
||||
CONS_Debug(DBG_NETPLAY, "already loaded\n");
|
||||
fileneeded[i].status = FS_OPEN;
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -575,6 +594,48 @@ INT32 CL_CheckFiles(void)
|
||||
return 1; //everything is FS_OPEN or FS_FOUND, proceed to loading
|
||||
}
|
||||
|
||||
static addontype_t GetAddonType(const char *name)
|
||||
{
|
||||
const char *prefix = strchr(name, '_');
|
||||
|
||||
// Doesn't have prefix (no '_' character or it is too far and is probably not for prefix but for something like version)
|
||||
// KRBCL_ is longest prefix i can think of so this should be enough
|
||||
if (prefix == NULL || prefix - name > 5)
|
||||
return ADDON_MISC;
|
||||
|
||||
// Skip 'K'
|
||||
if (*name == 'K')
|
||||
++name;
|
||||
|
||||
switch (*name)
|
||||
{
|
||||
case 'L':
|
||||
return ADDON_SCRIPT;
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
case 'B':
|
||||
return ADDON_MAP;
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
return ADDON_CHARACTER;
|
||||
break;
|
||||
}
|
||||
|
||||
return ADDON_MISC;
|
||||
}
|
||||
|
||||
void CL_CheckAddonTypes(void)
|
||||
{
|
||||
memset(&addontypes, 0, sizeof(addontypes));
|
||||
|
||||
for (INT32 i = 0; i < fileneedednum; i++)
|
||||
{
|
||||
addontypes[fileneeded[i].type]++;
|
||||
}
|
||||
}
|
||||
|
||||
// Load it now
|
||||
boolean CL_LoadServerFiles(void)
|
||||
{
|
||||
@@ -596,7 +657,7 @@ boolean CL_LoadServerFiles(void)
|
||||
else
|
||||
{
|
||||
const char *s;
|
||||
switch(fileneeded[i].status)
|
||||
switch (fileneeded[i].status)
|
||||
{
|
||||
case FS_NOTFOUND:
|
||||
s = "FS_NOTFOUND";
|
||||
@@ -639,7 +700,7 @@ static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid)
|
||||
|
||||
char wadfilename[MAX_WADPATH];
|
||||
|
||||
if (cv_noticedownload.value)
|
||||
if (cv_noticedownload.value && I_GetNodeAddress)
|
||||
CONS_Printf("Sending file \"%s\" (id %d) to node %d (%s)\n", filename, fileid, node, I_GetNodeAddress(node));
|
||||
|
||||
// Find the last file in the list and set a pointer to its "next" field
|
||||
@@ -664,7 +725,9 @@ static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid)
|
||||
// Look for the requested file through all loaded files
|
||||
for (wadnum = 0; wadfiles[wadnum]; wadnum++)
|
||||
{
|
||||
strlcpy(wadfilename, wadfiles[wadnum]->filename, MAX_WADPATH);
|
||||
// im a certified strlcpy hater
|
||||
strncpy(wadfilename, wadfiles[wadnum]->filename, MAX_WADPATH);
|
||||
wadfilename[MAX_WADPATH-1] = '\0';
|
||||
nameonly(wadfilename);
|
||||
|
||||
if (fasticmp(wadfilename, p->id.filename))
|
||||
@@ -960,7 +1023,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)
|
||||
{
|
||||
@@ -1017,23 +1080,23 @@ void Got_Filetxpak(void)
|
||||
{
|
||||
const char *s;
|
||||
|
||||
switch(file->status)
|
||||
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);
|
||||
@@ -1145,7 +1208,7 @@ filestatus_t checkfilemd5(char *filename, const UINT8 *wantedmd5sum)
|
||||
fhandle = fopen(filename, "rb");
|
||||
if (fhandle)
|
||||
{
|
||||
md5_stream(fhandle,md5sum);
|
||||
md5_stream(fhandle, md5sum);
|
||||
fclose(fhandle);
|
||||
if (!memcmp(wantedmd5sum, md5sum, 16))
|
||||
return FS_FOUND;
|
||||
|
||||
@@ -40,6 +40,15 @@ typedef enum
|
||||
FS_FALLBACK, // HTTP failed
|
||||
} filestatus_t;
|
||||
|
||||
typedef enum addontype_e
|
||||
{
|
||||
ADDON_SCRIPT,
|
||||
ADDON_MAP,
|
||||
ADDON_CHARACTER,
|
||||
ADDON_MISC,
|
||||
NUMADDONTYPES,
|
||||
} addontype_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UINT8 willsend; // Is the server willing to send it?
|
||||
@@ -51,11 +60,13 @@ typedef struct
|
||||
UINT32 totalsize;
|
||||
filestatus_t status; // The value returned by recsearch
|
||||
boolean justdownloaded; // To prevent late fragments from causing an I_Error
|
||||
addontype_t type;
|
||||
} fileneeded_t;
|
||||
|
||||
extern INT32 fileneedednum;
|
||||
extern fileneeded_t fileneeded[MAX_WADFILES];
|
||||
extern char downloaddir[512];
|
||||
extern INT32 addontypes[NUMADDONTYPES];
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -91,6 +102,7 @@ void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr, UINT16 fi
|
||||
void CL_PrepareDownloadSaveGame(const char *tmpsave);
|
||||
|
||||
INT32 CL_CheckFiles(void);
|
||||
void CL_CheckAddonTypes(void);
|
||||
boolean CL_LoadServerFiles(void);
|
||||
void SV_SendRam(INT32 node, void *data, size_t size, freemethod_t freemethod,
|
||||
UINT8 fileid);
|
||||
|
||||
@@ -566,6 +566,8 @@ typedef struct player_s
|
||||
fixed_t fovadd; // adjust FOV for hw rendering
|
||||
|
||||
SINT8 driftlevel; // just for controller rumble for now
|
||||
|
||||
UINT8 stairjank;
|
||||
} player_t;
|
||||
|
||||
#endif
|
||||
+58
-18
@@ -735,6 +735,22 @@ const char *I_GetJoyName(INT32 joyindex)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void I_SetJoystickFocus(void)
|
||||
{
|
||||
}
|
||||
|
||||
boolean I_GamepadHasLED(INT32 playernum)
|
||||
{
|
||||
(void)playernum;
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean I_GamepadHasRumble(INT32 playernum)
|
||||
{
|
||||
(void)playernum;
|
||||
return false;
|
||||
}
|
||||
|
||||
void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration)
|
||||
{
|
||||
(void)playernum;
|
||||
@@ -984,7 +1000,7 @@ void I_SleepDuration(precise_t duration)
|
||||
#endif
|
||||
}
|
||||
|
||||
boolean g_in_exiting_signal_handler = false;
|
||||
static volatile sig_atomic_t g_in_exiting_signal_handler = false;
|
||||
|
||||
static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_msg)
|
||||
{
|
||||
@@ -1007,8 +1023,13 @@ static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_ms
|
||||
sigmsg = ("SIGSEGV - SRB2Kart-Saturn has attempted to access a memory location that it shouldn't and needs to close.");
|
||||
break;
|
||||
#ifdef SIGTERM
|
||||
case SIGTERM: // Software termination signal from kill
|
||||
sigmsg = ("SIGTERM - SRB2Kart-Saturn was terminated by a kill signal.");
|
||||
case SIGTERM: // Software termination signal from terminate
|
||||
sigmsg = ("SIGTERM - SRB2Kart-Saturn was terminated by a terminate signal.");
|
||||
break;
|
||||
#endif
|
||||
#ifdef SIGKILL
|
||||
case SIGKILL: // Software termination signal from kill
|
||||
sigmsg = ("SIGKILL - SRB2Kart-Saturn was terminated by a kill signal.");
|
||||
break;
|
||||
#endif
|
||||
#ifdef SIGBREAK
|
||||
@@ -1048,6 +1069,11 @@ static void I_ReportSignal(int num, int coredumped)
|
||||
I_OutputMsg("\nProcess killed by signal: %s\n\n", sigmsg);
|
||||
}
|
||||
|
||||
boolean I_In_Exiting_Signal_Handler(void)
|
||||
{
|
||||
return g_in_exiting_signal_handler;
|
||||
}
|
||||
|
||||
#ifndef NEWSIGNALHANDLER
|
||||
FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
|
||||
{
|
||||
@@ -1067,11 +1093,17 @@ FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
|
||||
}
|
||||
#endif
|
||||
|
||||
FUNCNORETURN static ATTRNORETURN void quit_handler(int num)
|
||||
static volatile sig_atomic_t interrupted = 0;
|
||||
|
||||
boolean I_Interrupted(void)
|
||||
{
|
||||
signal(num, SIG_DFL); //default signal action
|
||||
raise(num);
|
||||
I_Quit();
|
||||
return interrupted;
|
||||
}
|
||||
|
||||
static void quit_handler(int num)
|
||||
{
|
||||
(void)num;
|
||||
interrupted = 1;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBBACKTRACE
|
||||
@@ -1330,18 +1362,28 @@ static void I_Fork(void)
|
||||
I_RegisterChildSignals();
|
||||
break;
|
||||
default:
|
||||
// ignore those, those are handled by child process
|
||||
// otherwise parent might exit before it
|
||||
// and the below stuff wont run and your terminal will be left in an awkward state
|
||||
#ifdef SIGINT
|
||||
signal(SIGINT, SIG_IGN);
|
||||
#endif
|
||||
#ifdef SIGBREAK
|
||||
signal(SIGBREAK, SIG_IGN);
|
||||
#endif
|
||||
#ifdef SIGTERM
|
||||
signal(SIGTERM, SIG_IGN);
|
||||
#endif
|
||||
if (logstream)
|
||||
fclose(logstream);/* the child has this */
|
||||
|
||||
c = wait(&status);
|
||||
|
||||
#ifdef LOGMESSAGES
|
||||
/* By the way, exit closes files. */
|
||||
logstream = fopen(logfilename, "at");
|
||||
#else
|
||||
logstream = 0;
|
||||
#endif
|
||||
|
||||
if (c == -1)
|
||||
{
|
||||
kill(child, SIGKILL);
|
||||
@@ -1401,8 +1443,8 @@ void I_Quit(void)
|
||||
/* prevent recursive I_Quit() */
|
||||
if (quiting)
|
||||
goto death;
|
||||
|
||||
quiting = false;
|
||||
I_ShutdownConsole();
|
||||
M_SaveConfig(NULL); //save game config, cvars..
|
||||
D_SaveBan(); // save the ban list
|
||||
G_SaveGameData(false); // Tails 12-08-2002
|
||||
@@ -1418,16 +1460,18 @@ void I_Quit(void)
|
||||
// use this for 1.28 19990220 by Kin
|
||||
I_ShutdownGraphics();
|
||||
I_ShutdownSystem();
|
||||
|
||||
/* if option -noendtxt is set, don't print the text */
|
||||
if (!M_CheckParm("-noendtxt") && W_CheckNumForName("ENDOOM") != LUMPERROR)
|
||||
{
|
||||
printf("\r");
|
||||
ShowEndTxt();
|
||||
}
|
||||
|
||||
if (myargmalloc)
|
||||
free(myargv); // Deallocate allocated memory
|
||||
|
||||
death:
|
||||
W_Shutdown();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@@ -1473,7 +1517,6 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
|
||||
|
||||
I_OutputMsg("SRB2Kart %s Recursive Error", buffer);
|
||||
|
||||
W_Shutdown();
|
||||
exit(-1); // recursive errors detected
|
||||
}
|
||||
}
|
||||
@@ -1491,8 +1534,6 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
|
||||
#endif
|
||||
// ---
|
||||
|
||||
I_ShutdownConsole();
|
||||
|
||||
M_SaveConfig(NULL); // save game config, cvars..
|
||||
D_SaveBan(); // save the ban list
|
||||
G_SaveGameData(false); // Tails 12-08-2002
|
||||
@@ -1508,8 +1549,6 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
|
||||
I_ShutdownGraphics();
|
||||
I_ShutdownSystem();
|
||||
|
||||
W_Shutdown();
|
||||
|
||||
#if defined (PARANOIA) && defined (__CYGWIN__)
|
||||
*(INT32 *)2 = 4; //Alam: Debug!
|
||||
#endif
|
||||
@@ -1615,9 +1654,10 @@ void I_ShutdownSystem(void)
|
||||
{
|
||||
INT32 c;
|
||||
|
||||
#ifndef NEWSIGNALHANDLER
|
||||
I_ShutdownConsole();
|
||||
#ifdef NEWSIGNALHANDLER
|
||||
if (M_CheckParm("-nofork"))
|
||||
#endif
|
||||
I_ShutdownConsole();
|
||||
|
||||
for (c = MAX_QUIT_FUNCS-1; c >= 0; c--)
|
||||
if (quit_funcs[c])
|
||||
|
||||
+296
-335
File diff suppressed because it is too large.
Load diff
@@ -13,6 +13,10 @@
|
||||
#ifndef __DEHACKED_H__
|
||||
#define __DEHACKED_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "m_fixed.h" // for get_number
|
||||
#include "info.h"
|
||||
|
||||
@@ -71,4 +75,9 @@ typedef struct
|
||||
} MYFILE;
|
||||
#define myfeof(a) (a->data + a->size <= a->curpos)
|
||||
char *myfgets(char *buf, size_t bufsize, MYFILE *f);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+4
-2
@@ -61,7 +61,7 @@ enum
|
||||
typedef struct
|
||||
{
|
||||
INT16 x, y;
|
||||
}ATTRPACK mapvertex_t;
|
||||
} ATTRPACK mapvertex_t;
|
||||
|
||||
// A SideDef, defining the visual appearance of a wall,
|
||||
// by setting textures and offsets.
|
||||
@@ -81,10 +81,12 @@ typedef struct
|
||||
INT16 flags;
|
||||
INT16 special;
|
||||
INT16 tag;
|
||||
// sidenum[1] will be 0xffff if one sided
|
||||
// sidenum[1] will be NO_INDEX if one sided
|
||||
UINT16 sidenum[2];
|
||||
} ATTRPACK maplinedef_t;
|
||||
|
||||
#define NO_INDEX 0xffff
|
||||
|
||||
//
|
||||
// LineDef attributes.
|
||||
//
|
||||
|
||||
+23
-18
@@ -130,8 +130,8 @@ extern char logfilename[1024];
|
||||
#else
|
||||
#define VERSION 1 // Game version
|
||||
#define SUBVERSION 6 // more precise version number
|
||||
#define VERSIONSTRING "Saturn v9.2"
|
||||
#define VERSIONSTRINGW L"Saturn v9.2"
|
||||
#define VERSIONSTRING "Saturn v9.3"
|
||||
#define VERSIONSTRINGW L"Saturn v9.3"
|
||||
|
||||
#define SATURN_TESTING // comment out for saturn release builds!
|
||||
|
||||
@@ -516,22 +516,6 @@ extern boolean capslock;
|
||||
// i_system.c, replace getchar() once the keyboard has been appropriated
|
||||
INT32 I_GetKey(void);
|
||||
|
||||
/* http://www.cse.yorku.ca/~oz/hash.html */
|
||||
static inline
|
||||
UINT32 quickncasehash (const char *p, size_t n)
|
||||
{
|
||||
size_t i = 0;
|
||||
UINT32 x = 5381;
|
||||
|
||||
while (i < n && p[i])
|
||||
{
|
||||
x = (x * 33) ^ tolower(p[i]);
|
||||
i++;
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
#ifndef __cplusplus
|
||||
#ifndef min // Double-Check with WATTCP-32's cdefs.h
|
||||
#define min(x, y) (((x) < (y)) ? (x) : (y))
|
||||
@@ -589,6 +573,13 @@ UINT32 quickncasehash (const char *p, size_t n)
|
||||
// NOTE: you WILL have nasal troubles if the variable is not initialized
|
||||
#define CLEANUP(f) __attribute__((__cleanup__(f)))
|
||||
|
||||
// the GNU constructor and destructor attributes
|
||||
// The constructor attribute causes the function to be called automatically before execution enters main ().
|
||||
// Similarly, the destructor attribute causes the function to be called automatically after main () has completed or exit () has been called.
|
||||
// Functions with these attributes are useful for initializing data that will be used implicitly during the execution of the program.
|
||||
#define CONSTRUCTOR __attribute__((constructor, used))
|
||||
#define DESTRUCTOR __attribute__((destructor, used))
|
||||
|
||||
// An assert-type mechanism.
|
||||
#ifdef PARANOIA
|
||||
#define I_Assert(e) ((e) ? (void)0 : I_Error("assert failed: %s, file %s, line %d", #e, __FILE__, __LINE__))
|
||||
@@ -611,6 +602,13 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
||||
// None of these that are disabled in the normal build are guaranteed to work perfectly
|
||||
// Compile them at your own risk!
|
||||
|
||||
// undefine to enable fixes and features that are not vanilla compatible
|
||||
#define COMPAT_VANILLA
|
||||
// if we build with 32 player (or more!) support we dont need to care vanilla compat
|
||||
#if MAXPLAYERS > 16
|
||||
#undef COMPAT_VANILLA
|
||||
#endif
|
||||
|
||||
//-- SATURN __
|
||||
/// Detect if a client is on Saturn in the clientconfig.
|
||||
/// To seperately allow them to join or block joining from vanilla clients.
|
||||
@@ -675,6 +673,13 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
||||
#undef UPDATE_ALERT
|
||||
#endif
|
||||
|
||||
// overwrite some of those
|
||||
// when not compiling in vanilla compat mode
|
||||
#ifndef COMPAT_VANILLA
|
||||
#define SATURNJOIN
|
||||
#define SATURNPAK
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
+4
-46
@@ -54,7 +54,6 @@ extern INT16 maptol;
|
||||
extern UINT8 globalweather;
|
||||
extern INT32 curWeather;
|
||||
extern INT32 cursaveslot;
|
||||
extern INT16 lastmapsaved;
|
||||
extern boolean gamecomplete;
|
||||
|
||||
#define PRECIP_NONE 0
|
||||
@@ -78,7 +77,6 @@ extern boolean imcontinuing; // Temporary flag while continuing
|
||||
extern UINT8 modeattacking;
|
||||
|
||||
// menu demo things
|
||||
extern UINT8 numDemos;
|
||||
extern UINT32 demoDelayTime;
|
||||
extern UINT32 demoIdleTime;
|
||||
|
||||
@@ -114,8 +112,8 @@ extern UINT8 paused; // Game paused?
|
||||
extern UINT8 window_notinfocus; // are we in focus? (backend independant -- handles auto pausing and display of "focus lost" message)
|
||||
|
||||
extern boolean nodrawers;
|
||||
extern boolean noblit;
|
||||
extern boolean lastdraw;
|
||||
extern boolean intermissionbginit;
|
||||
|
||||
#ifdef MOTIONBLUR
|
||||
extern INT32 postimgparam[MAXSPLITSCREENPLAYERS];
|
||||
@@ -205,12 +203,6 @@ extern struct quake
|
||||
fixed_t radius, intensity;
|
||||
} quake;
|
||||
|
||||
// NiGHTS grades
|
||||
typedef struct
|
||||
{
|
||||
UINT32 grade[6]; // D, C, B, A, S, X (F: failed to reach any of these)
|
||||
} nightsgrades_t;
|
||||
|
||||
// Custom Lua values
|
||||
// (This is not ifdeffed so the map header structure can stay identical, just in case.)
|
||||
typedef struct
|
||||
@@ -261,28 +253,16 @@ typedef struct
|
||||
UINT8 numlaps; ///< Number of laps in circuit mode, unless overridden.
|
||||
SINT8 unlockrequired; ///< Is an unlockable required to play this level? -1 if no.
|
||||
UINT8 levelselect; ///< Is this map available in the level select? If so, which map list is it available in?
|
||||
SINT8 bonustype; ///< What type of bonus does this level have? (-1 for null.)
|
||||
SINT8 saveoverride; ///< Set how the game is allowed to save (1 for always, -1 for never, 0 is 2.1 default)
|
||||
|
||||
UINT8 levelflags; ///< LF_flags: merged eight booleans into one UINT8 for space, see below
|
||||
UINT8 menuflags; ///< LF2_flags: options that affect record attack / nights mode menus
|
||||
|
||||
// NiGHTS stuff.
|
||||
UINT8 numGradedMares; ///< Internal. For grade support.
|
||||
nightsgrades_t *grades; ///< NiGHTS grades. Allocated dynamically for space reasons. Be careful.
|
||||
|
||||
// SRB2kart
|
||||
//boolean automap; ///< Displays a level's white map outline in modified games
|
||||
fixed_t mobj_scale; ///< Replacement for TOL_ERZ3
|
||||
|
||||
mapheader_lighting_t lighting; ///< Wall and sprite lighting
|
||||
mapheader_lighting_t lighting_encore; ///< Alternative lighting for Encore mode
|
||||
boolean use_encore_lighting; ///< Whether to use separate Encore lighting
|
||||
|
||||
// Music stuff.
|
||||
UINT32 musinterfadeout; ///< Fade out level music on intermission screen in milliseconds
|
||||
char musintername[7]; ///< Intermission screen music.
|
||||
|
||||
// Lua stuff.
|
||||
// (This is not ifdeffed so the map header structure can stay identical, just in case.)
|
||||
UINT8 numCustomOptions; ///< Internal. For Lua custom value support.
|
||||
@@ -379,8 +359,6 @@ typedef struct
|
||||
{
|
||||
tic_t time; ///< Time in which the level was finished.
|
||||
tic_t lap; ///< Best lap time for this level.
|
||||
//UINT32 score; ///< Score when the level was finished.
|
||||
//UINT16 rings; ///< Rings when the level was finished.
|
||||
} recorddata_t;
|
||||
|
||||
/** Setup for one NiGHTS map.
|
||||
@@ -394,34 +372,19 @@ typedef struct
|
||||
#define GRADE_A 5
|
||||
#define GRADE_S 6
|
||||
|
||||
/*typedef struct
|
||||
{
|
||||
// 8 mares, 1 overall (0)
|
||||
UINT8 nummares;
|
||||
UINT32 score[9];
|
||||
UINT8 grade[9];
|
||||
tic_t time[9];
|
||||
} nightsdata_t;*/
|
||||
|
||||
//extern nightsdata_t *nightsrecords[NUMMAPS];
|
||||
extern recorddata_t *mainrecords[NUMMAPS];
|
||||
|
||||
// mapvisited is now a set of flags that says what we've done in the map.
|
||||
#define MV_VISITED 1
|
||||
#define MV_BEATEN 2
|
||||
#define MV_ALLEMERALDS 4
|
||||
//#define MV_ULTIMATE 8
|
||||
//#define MV_PERFECT 16
|
||||
#define MV_MAX 7 // used in gamedata check
|
||||
extern UINT8 mapvisited[NUMMAPS];
|
||||
|
||||
// Temporary holding place for nights data for the current map
|
||||
//nightsdata_t ntemprecords;
|
||||
|
||||
extern UINT32 token; ///< Number of tokens collected in a level
|
||||
extern UINT32 token; ///< Number of tokens collected in a level
|
||||
extern UINT32 tokenlist; ///< List of tokens collected
|
||||
extern INT32 tokenbits; ///< Used for setting token bits
|
||||
extern INT32 sstimer; ///< Time allotted in the special stage
|
||||
extern INT32 tokenbits; ///< Used for setting token bits
|
||||
extern INT32 sstimer; ///< Time allotted in the special stage
|
||||
extern UINT32 bluescore; ///< Blue Team Scores
|
||||
extern UINT32 redscore; ///< Red Team Scores
|
||||
|
||||
@@ -437,9 +400,6 @@ extern boolean CheckForReverseGravity;
|
||||
extern UINT16 invulntics;
|
||||
extern UINT16 sneakertics;
|
||||
extern UINT16 flashingtics;
|
||||
extern UINT16 tailsflytics;
|
||||
extern UINT16 underwatertics;
|
||||
extern UINT16 spacetimetics;
|
||||
extern UINT16 extralifetics;
|
||||
|
||||
// SRB2kart
|
||||
@@ -461,7 +421,6 @@ extern UINT8 introtoplay;
|
||||
extern UINT8 creditscutscene;
|
||||
|
||||
extern UINT8 use1upSound;
|
||||
extern UINT8 maxXtraLife; // Max extra lives from rings
|
||||
|
||||
extern mobj_t *hunt1, *hunt2, *hunt3; // Emerald hunt locations
|
||||
|
||||
@@ -526,7 +485,6 @@ extern UINT32 timesBeatenWithEmeralds;
|
||||
// WAD, partly set at startup time.
|
||||
|
||||
extern tic_t gametic;
|
||||
#define localgametic leveltime
|
||||
|
||||
// Player spawn spots.
|
||||
extern mapthing_t *playerstarts[MAXPLAYERS]; // Cooperative
|
||||
|
||||
+16
-5
@@ -68,8 +68,21 @@ extern "C" {
|
||||
#define strnicmp(x,y,n) strncasecmp(x,y,n)
|
||||
#endif
|
||||
|
||||
char *nongnu_strcasestr(const char *in, const char *what);
|
||||
// glibc 2.43 made alot of standard lib functions propagate the constness of its input pointers
|
||||
// to not cause warnings or compile issues on older glibc versions we do this silly thing
|
||||
// to not have a gazillion glibc version checks
|
||||
#if defined(__GLIBC_PREREQ)
|
||||
#if __GLIBC_PREREQ(2, 43)
|
||||
#define gconst const
|
||||
#else
|
||||
#define gconst
|
||||
#endif
|
||||
#else
|
||||
#define gconst
|
||||
#endif
|
||||
|
||||
#ifndef _GNU_SOURCE
|
||||
char *nongnu_strcasestr(const char *in, const char *what);
|
||||
#define strcasestr nongnu_strcasestr
|
||||
#endif
|
||||
|
||||
@@ -127,9 +140,9 @@ size_t strlcpy(char *dst, const char *src, size_t dsize);
|
||||
#define STRBUFCPY(dst,src) strlcpy(dst, src, sizeof dst)
|
||||
|
||||
/* Boolean type definition */
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <stdbool.h>
|
||||
// dont use stdbools _BOOL type
|
||||
// its smaller (1 byte) than the old interger bool (4 bytes)
|
||||
// which results in packed struct sizes being mismatched between vanilla and this
|
||||
@@ -137,9 +150,7 @@ size_t strlcpy(char *dst, const char *src, size_t dsize);
|
||||
// which we cant use as enumeration constants
|
||||
typedef int32_t boolean;
|
||||
#else
|
||||
#define false FALSE
|
||||
#define true TRUE
|
||||
#define boolean BOOL
|
||||
#define boolean int32_t
|
||||
#endif
|
||||
|
||||
/* 7.18.2.1 Limits of exact-width integer types */
|
||||
|
||||
@@ -1110,14 +1110,6 @@ void F_TitleScreenTicker(boolean run)
|
||||
return;
|
||||
}
|
||||
|
||||
// Replay intro when done cycling through demos
|
||||
/*if (curDemo == numDemos) -- uuuh... we have a LOT of maps AND a big devteam... probably not gonna see a repeat unless you're super unlucky :V
|
||||
{
|
||||
curDemo = 0;
|
||||
F_StartIntro();
|
||||
return;
|
||||
}*/
|
||||
|
||||
mapname = G_BuildMapName(G_RandMap(TOL_RACE, -2, false, 0, false, NULL)+1);
|
||||
|
||||
numstaff = 1;
|
||||
|
||||
@@ -361,6 +361,8 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
|
||||
// on for fade-to-black
|
||||
for (;;)
|
||||
{
|
||||
I_HandleInterrupt();
|
||||
|
||||
// get fademask first so we can tell if it exists or not
|
||||
fmask = F_GetFadeMask(wipetype, wipeframe++);
|
||||
|
||||
|
||||
+3
-1
@@ -111,10 +111,12 @@ filestatus_t filesearch(char *filename, const char *startpath, const UINT8 *want
|
||||
char *searchname;
|
||||
int depthleft = maxsearchdepth;
|
||||
char searchpath[MAXFILEPATH];
|
||||
size_t *searchpathindex;
|
||||
size_t *searchpathindex = NULL;
|
||||
|
||||
dirhandle = (DIR**)malloc(maxsearchdepth * sizeof(DIR*));
|
||||
searchpathindex = (size_t *)malloc(maxsearchdepth * sizeof(size_t));
|
||||
if (!searchpathindex)
|
||||
I_Error("out of memory while searching for file %s\n", filename);
|
||||
|
||||
strcpy(searchpath, startpath);
|
||||
searchpathindex[--depthleft] = strlen(searchpath) + 1;
|
||||
|
||||
+110
-111
@@ -66,12 +66,10 @@
|
||||
#include <locale.h>
|
||||
|
||||
// menu demo things
|
||||
UINT8 numDemos = 0; //3; -- i'm FED UP of losing my skincolour to a broken demo. change this back when we make new ones
|
||||
UINT32 demoDelayTime = 15*TICRATE;
|
||||
UINT32 demoIdleTime = 3*TICRATE;
|
||||
|
||||
boolean nodrawers = false; // for comparative timing purposes
|
||||
boolean noblit = false; // for comparative timing purposes
|
||||
static tic_t demostarttime; // for comparative timing purposes
|
||||
|
||||
//@TODO put these all in a struct for namespacing purposes?
|
||||
@@ -449,7 +447,8 @@ void G_WriteDemoExtraData(void)
|
||||
{
|
||||
static UINT8 timeout = 0;
|
||||
|
||||
if (timeout) timeout--;
|
||||
if (timeout)
|
||||
timeout--;
|
||||
|
||||
if (demo_writerng == 1 || (demo_writerng == 2 && timeout == 0))
|
||||
{
|
||||
@@ -469,6 +468,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
||||
|
||||
if (!demobuf.p || !demo.deferstart)
|
||||
return;
|
||||
|
||||
ziptic = READUINT8(demobuf.p);
|
||||
|
||||
if (ziptic & ZT_FWD)
|
||||
@@ -490,11 +490,12 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
||||
|
||||
// what in the actual fuck is this???
|
||||
// SRB2kart: Copy-pasted from ticcmd building, removes that crappy demo cam
|
||||
if (((players[displayplayers[0]].mo && players[displayplayers[0]].speed > 0) // Moving
|
||||
const player_t *player = &players[displayplayers[0]];
|
||||
if (((player->mo && player->speed > 0) // Moving
|
||||
|| (leveltime > starttime && (cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE)) // Rubber-burn turn
|
||||
|| (players[displayplayers[0]].kartstuff[k_respawn]) // Respawning
|
||||
|| (players[displayplayers[0]].spectator || objectplacing)) // Not a physical player
|
||||
&& !(players[displayplayers[0]].kartstuff[k_spinouttimer] && players[displayplayers[0]].kartstuff[k_sneakertimer])) // Spinning and boosting cancels out spinout
|
||||
|| (player->kartstuff[k_respawn]) // Respawning
|
||||
|| (player->spectator || objectplacing)) // Not a physical player
|
||||
&& !(player->kartstuff[k_spinouttimer] && player->kartstuff[k_sneakertimer])) // Spinning and boosting cancels out spinout
|
||||
localangle[0] += (cmd->angleturn<<16);
|
||||
|
||||
if (!(demoflags & DF_GHOST) && *demobuf.p == DEMOMARKER)
|
||||
@@ -517,49 +518,49 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
||||
|
||||
if (cmd->forwardmove != oldcmd[playernum].forwardmove)
|
||||
{
|
||||
WRITEUINT8(demobuf.p,cmd->forwardmove);
|
||||
WRITEUINT8(demobuf.p, cmd->forwardmove);
|
||||
oldcmd[playernum].forwardmove = cmd->forwardmove;
|
||||
ziptic |= ZT_FWD;
|
||||
}
|
||||
|
||||
if (cmd->sidemove != oldcmd[playernum].sidemove)
|
||||
{
|
||||
WRITEUINT8(demobuf.p,cmd->sidemove);
|
||||
WRITEUINT8(demobuf.p, cmd->sidemove);
|
||||
oldcmd[playernum].sidemove = cmd->sidemove;
|
||||
ziptic |= ZT_SIDE;
|
||||
}
|
||||
|
||||
if (cmd->angleturn != oldcmd[playernum].angleturn)
|
||||
{
|
||||
WRITEINT16(demobuf.p,cmd->angleturn);
|
||||
WRITEINT16(demobuf.p, cmd->angleturn);
|
||||
oldcmd[playernum].angleturn = cmd->angleturn;
|
||||
ziptic |= ZT_ANGLE;
|
||||
}
|
||||
|
||||
if (cmd->buttons != oldcmd[playernum].buttons)
|
||||
{
|
||||
WRITEUINT16(demobuf.p,cmd->buttons);
|
||||
WRITEUINT16(demobuf.p, cmd->buttons);
|
||||
oldcmd[playernum].buttons = cmd->buttons;
|
||||
ziptic |= ZT_BUTTONS;
|
||||
}
|
||||
|
||||
if (cmd->aiming != oldcmd[playernum].aiming)
|
||||
{
|
||||
WRITEINT16(demobuf.p,cmd->aiming);
|
||||
WRITEINT16(demobuf.p, cmd->aiming);
|
||||
oldcmd[playernum].aiming = cmd->aiming;
|
||||
ziptic |= ZT_AIMING;
|
||||
}
|
||||
|
||||
if (cmd->driftturn != oldcmd[playernum].driftturn)
|
||||
{
|
||||
WRITEINT16(demobuf.p,cmd->driftturn);
|
||||
WRITEINT16(demobuf.p, cmd->driftturn);
|
||||
oldcmd[playernum].driftturn = cmd->driftturn;
|
||||
ziptic |= ZT_DRIFT;
|
||||
}
|
||||
|
||||
if (cmd->latency != oldcmd[playernum].latency)
|
||||
{
|
||||
WRITEUINT8(demobuf.p,cmd->latency);
|
||||
WRITEUINT8(demobuf.p, cmd->latency);
|
||||
oldcmd[playernum].latency = cmd->latency;
|
||||
ziptic |= ZT_LATENCY;
|
||||
}
|
||||
@@ -728,8 +729,8 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum)
|
||||
|
||||
// GZT_XYZ is only useful if you've moved 256 FRACUNITS or more in a single tic.
|
||||
if (abs(ghost->x-oldghost[playernum].x) > MAXMOM
|
||||
|| abs(ghost->y-oldghost[playernum].y) > MAXMOM
|
||||
|| abs(ghost->z-oldghost[playernum].z) > MAXMOM
|
||||
|| abs(ghost->y-oldghost[playernum].y) > MAXMOM
|
||||
|| abs(ghost->z-oldghost[playernum].z) > MAXMOM
|
||||
|| ((UINT8)(leveltime & 255) > 0 && (UINT8)(leveltime & 255) <= (UINT8)cv_netdemosyncquality.value)) // Hack to enable slightly nicer resyncing
|
||||
{
|
||||
oldghost[playernum].x = ghost->x;
|
||||
@@ -1346,7 +1347,7 @@ fadeghost:
|
||||
}
|
||||
else
|
||||
{
|
||||
mobj = P_SpawnMobj(g->mo->x, g->mo->y, g->mo->z - FixedDiv(FixedMul(g->mo->info->height, g->mo->scale) - g->mo->height,3*FRACUNIT), MT_THOK);
|
||||
mobj = P_SpawnMobj(g->mo->x, g->mo->y, g->mo->z - FixedDiv(FixedMul(g->mo->info->height, g->mo->scale) - g->mo->height, 3*FRACUNIT), MT_THOK);
|
||||
mobj->sprite = states[mobjinfo[type].spawnstate].sprite;
|
||||
mobj->frame = (states[mobjinfo[type].spawnstate].frame & FF_FRAMEMASK) | tr_trans60<<FF_TRANSSHIFT;
|
||||
mobj->tics = -1; // nope.
|
||||
@@ -1377,7 +1378,7 @@ fadeghost:
|
||||
UINT16 i, health;
|
||||
UINT16 count = READUINT16(g->p);
|
||||
//UINT32 type;
|
||||
fixed_t x,y,z;
|
||||
fixed_t x, y, z;
|
||||
angle_t angle;
|
||||
mobj_t *poof;
|
||||
|
||||
@@ -1520,7 +1521,9 @@ void G_PreviewRewind(tic_t previewtime)
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (!playeringame[i] || players[i].spectator)
|
||||
player_t *player = &players[i];
|
||||
|
||||
if (!playeringame[i] || player->spectator)
|
||||
{
|
||||
if (info->playerinfo[i].player.mo)
|
||||
{
|
||||
@@ -1532,35 +1535,35 @@ void G_PreviewRewind(tic_t previewtime)
|
||||
|
||||
if (!info->playerinfo[i].ingame || !info->playerinfo[i].player.mo)
|
||||
{
|
||||
if (players[i].mo)
|
||||
players[i].mo->flags2 |= MF2_DONTDRAW;
|
||||
if (player->mo)
|
||||
player->mo->flags2 |= MF2_DONTDRAW;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!players[i].mo)
|
||||
if (!player->mo)
|
||||
continue; //@TODO spawn temp object to act as a player display
|
||||
|
||||
players[i].mo->flags2 &= ~MF2_DONTDRAW;
|
||||
player->mo->flags2 &= ~MF2_DONTDRAW;
|
||||
|
||||
P_UnsetThingPosition(players[i].mo);
|
||||
P_UnsetThingPosition(player->mo);
|
||||
#define TWEEN(pr) info->playerinfo[i].mobj.pr + FixedMul((INT32) (next_info->playerinfo[i].mobj.pr - info->playerinfo[i].mobj.pr), tweenvalue)
|
||||
players[i].mo->x = TWEEN(x);
|
||||
players[i].mo->y = TWEEN(y);
|
||||
players[i].mo->z = TWEEN(z);
|
||||
players[i].mo->angle = TWEEN(angle);
|
||||
player->mo->x = TWEEN(x);
|
||||
player->mo->y = TWEEN(y);
|
||||
player->mo->z = TWEEN(z);
|
||||
player->mo->angle = TWEEN(angle);
|
||||
#undef TWEEN
|
||||
P_SetThingPosition(players[i].mo);
|
||||
P_SetThingPosition(player->mo);
|
||||
|
||||
players[i].frameangle = info->playerinfo[i].player.frameangle + FixedMul((INT32) (next_info->playerinfo[i].player.frameangle - info->playerinfo[i].player.frameangle), tweenvalue);
|
||||
player->frameangle = info->playerinfo[i].player.frameangle + FixedMul((INT32) (next_info->playerinfo[i].player.frameangle - info->playerinfo[i].player.frameangle), tweenvalue);
|
||||
|
||||
players[i].mo->sprite = info->playerinfo[i].mobj.sprite;
|
||||
players[i].mo->frame = info->playerinfo[i].mobj.frame;
|
||||
player->mo->sprite = info->playerinfo[i].mobj.sprite;
|
||||
player->mo->frame = info->playerinfo[i].mobj.frame;
|
||||
|
||||
players[i].realtime = info->playerinfo[i].player.realtime;
|
||||
player->realtime = info->playerinfo[i].player.realtime;
|
||||
|
||||
for (j = 0; j < NUMKARTSTUFF; j++)
|
||||
players[i].kartstuff[j] = info->playerinfo[i].player.kartstuff[j];
|
||||
player->kartstuff[j] = info->playerinfo[i].player.kartstuff[j];
|
||||
}
|
||||
|
||||
for (i = splitscreen; i >= 0; i--)
|
||||
@@ -1653,10 +1656,12 @@ void G_RecordDemo(const char *name)
|
||||
maxsize = cv_maxdemosize.value*1024*1024;
|
||||
|
||||
demobuf.buffer = Z_Malloc(maxsize + 100*1024, PU_STATIC, NULL);
|
||||
demoend = demobuf.buffer + maxsize;
|
||||
|
||||
if (demobuf.buffer)
|
||||
{
|
||||
demoend = demobuf.buffer + maxsize;
|
||||
demo.recording = true;
|
||||
}
|
||||
else
|
||||
CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n");
|
||||
}
|
||||
@@ -1691,7 +1696,7 @@ void G_BeginRecording(void)
|
||||
return;
|
||||
}
|
||||
|
||||
memset(name,0,sizeof(name));
|
||||
memset(name, 0, sizeof(name));
|
||||
|
||||
demobuf.p = demobuf.buffer;
|
||||
demoflags = DF_GHOST|(multiplayer ? DF_MULTIPLAYER : (modeattacking<<DF_ATTACKSHIFT));
|
||||
@@ -1705,9 +1710,9 @@ void G_BeginRecording(void)
|
||||
|
||||
// Setup header.
|
||||
memcpy(demobuf.p, DEMOHEADER, 12); demobuf.p += 12;
|
||||
WRITEUINT8(demobuf.p,VERSION);
|
||||
WRITEUINT8(demobuf.p,SUBVERSION);
|
||||
WRITEUINT16(demobuf.p,DEMOVERSION);
|
||||
WRITEUINT8(demobuf.p, VERSION);
|
||||
WRITEUINT8(demobuf.p, SUBVERSION);
|
||||
WRITEUINT16(demobuf.p, DEMOVERSION);
|
||||
|
||||
// Full replay title
|
||||
demobuf.p += 64;
|
||||
@@ -1736,7 +1741,7 @@ void G_BeginRecording(void)
|
||||
|
||||
// game data
|
||||
memcpy(demobuf.p, "PLAY", 4); demobuf.p += 4;
|
||||
WRITEINT16(demobuf.p,gamemap);
|
||||
WRITEINT16(demobuf.p, gamemap);
|
||||
memcpy(demobuf.p, mapmd5, 16); demobuf.p += 16;
|
||||
|
||||
WRITEUINT8(demobuf.p, demoflags);
|
||||
@@ -1768,8 +1773,8 @@ void G_BeginRecording(void)
|
||||
break;
|
||||
case ATTACKING_RECORD: // 1
|
||||
demotime_p = demobuf.p;
|
||||
WRITEUINT32(demobuf.p,UINT32_MAX); // time
|
||||
WRITEUINT32(demobuf.p,UINT32_MAX); // lap
|
||||
WRITEUINT32(demobuf.p, UINT32_MAX); // time
|
||||
WRITEUINT32(demobuf.p, UINT32_MAX); // lap
|
||||
break;
|
||||
default: // 3
|
||||
break;
|
||||
@@ -1826,9 +1831,9 @@ void G_BeginRecording(void)
|
||||
if (demoflags & DF_LUAVARS)
|
||||
LUA_Archive(&demobuf, false);
|
||||
|
||||
memset(&oldcmd,0,sizeof(oldcmd));
|
||||
memset(&oldghost,0,sizeof(oldghost));
|
||||
memset(&ghostext,0,sizeof(ghostext));
|
||||
memset(&oldcmd, 0, sizeof(oldcmd));
|
||||
memset(&oldghost, 0, sizeof(oldghost));
|
||||
memset(&ghostext, 0, sizeof(ghostext));
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
@@ -1868,19 +1873,19 @@ void G_WriteStanding(UINT8 ranking, char *name, INT32 skinnum, UINT8 color, UINT
|
||||
// Name
|
||||
memset(temp, 0, 16);
|
||||
strncpy(temp, name, 16);
|
||||
memcpy(demobuf.p,temp,16);
|
||||
memcpy(demobuf.p, temp, 16);
|
||||
demobuf.p += 16;
|
||||
|
||||
// Skin
|
||||
memset(temp, 0, 16);
|
||||
strncpy(temp, skins[skinnum].name, 16);
|
||||
memcpy(demobuf.p,temp,16);
|
||||
memcpy(demobuf.p, temp, 16);
|
||||
demobuf.p += 16;
|
||||
|
||||
// Color
|
||||
memset(temp, 0, 16);
|
||||
strncpy(temp, KartColor_Names[color], 16);
|
||||
memcpy(demobuf.p,temp,16);
|
||||
memcpy(demobuf.p, temp, 16);
|
||||
demobuf.p += 16;
|
||||
|
||||
// Score/time/whatever
|
||||
@@ -1994,7 +1999,6 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick)
|
||||
UINT8 totalfiles, filesloaded, nmusfilecount;
|
||||
char filename[MAX_WADPATH];
|
||||
UINT8 md5sum[16];
|
||||
boolean toomany = false;
|
||||
boolean alreadyloaded;
|
||||
UINT8 i, j;
|
||||
UINT8 error = 0;
|
||||
@@ -2004,53 +2008,44 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick)
|
||||
|
||||
for (i = 0; i < totalfiles; ++i)
|
||||
{
|
||||
if (toomany)
|
||||
SKIPSTRING((*pp));
|
||||
else
|
||||
{
|
||||
strlcpy(filename, (char *)(*pp), sizeof filename);
|
||||
SKIPSTRING((*pp));
|
||||
}
|
||||
strlcpy(filename, (char *)(*pp), sizeof filename);
|
||||
SKIPSTRING((*pp));
|
||||
|
||||
READMEM((*pp), md5sum, 16); // hue hue peepee
|
||||
|
||||
if (!toomany)
|
||||
alreadyloaded = false;
|
||||
nmusfilecount = 0;
|
||||
|
||||
for (j = 0; j < numwadfiles; ++j)
|
||||
{
|
||||
alreadyloaded = false;
|
||||
nmusfilecount = 0;
|
||||
|
||||
for (j = 0; j < numwadfiles; ++j)
|
||||
{
|
||||
if (wadfiles[j]->important && j > mainwads)
|
||||
nmusfilecount++;
|
||||
else
|
||||
continue;
|
||||
|
||||
if (memcmp(md5sum, wadfiles[j]->md5sum, 16) == 0)
|
||||
{
|
||||
alreadyloaded = true;
|
||||
|
||||
if (i != nmusfilecount-1 && error < DFILE_ERROR_OUTOFORDER)
|
||||
error |= DFILE_ERROR_OUTOFORDER;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (alreadyloaded)
|
||||
{
|
||||
filesloaded++;
|
||||
if (wadfiles[j]->important && j > mainwads)
|
||||
nmusfilecount++;
|
||||
else
|
||||
continue;
|
||||
}
|
||||
|
||||
if (numwadfiles >= MAX_WADFILES)
|
||||
error = DFILE_ERROR_CANNOTLOAD;
|
||||
else if (!quick && findfile(filename, md5sum, false) != FS_FOUND)
|
||||
error = DFILE_ERROR_CANNOTLOAD;
|
||||
else if (error < DFILE_ERROR_INCOMPLETEOUTOFORDER)
|
||||
error |= DFILE_ERROR_NOTLOADED;
|
||||
} else
|
||||
if (memcmp(md5sum, wadfiles[j]->md5sum, 16) == 0)
|
||||
{
|
||||
alreadyloaded = true;
|
||||
|
||||
if (i != nmusfilecount-1 && error < DFILE_ERROR_OUTOFORDER)
|
||||
error |= DFILE_ERROR_OUTOFORDER;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (alreadyloaded)
|
||||
{
|
||||
filesloaded++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (numwadfiles >= MAX_WADFILES)
|
||||
error = DFILE_ERROR_CANNOTLOAD;
|
||||
else if (!quick && findfile(filename, md5sum, false) != FS_FOUND)
|
||||
error = DFILE_ERROR_CANNOTLOAD;
|
||||
else if (error < DFILE_ERROR_INCOMPLETEOUTOFORDER)
|
||||
error |= DFILE_ERROR_NOTLOADED;
|
||||
}
|
||||
|
||||
// Get final file count
|
||||
@@ -2349,7 +2344,7 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
|
||||
extrainfo_p += 16;
|
||||
|
||||
// Skin
|
||||
memcpy(temp,extrainfo_p,16);
|
||||
memcpy(temp, extrainfo_p, 16);
|
||||
extrainfo_p += 16;
|
||||
pdemo->standings[count].skin = UINT8_MAX;
|
||||
|
||||
@@ -2363,12 +2358,12 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
|
||||
}
|
||||
|
||||
// Color
|
||||
memcpy(temp,extrainfo_p,16);
|
||||
memcpy(temp, extrainfo_p, 16);
|
||||
extrainfo_p += 16;
|
||||
|
||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
||||
{
|
||||
if (fasticmp(KartColor_Names[i],temp)) // SRB2kart
|
||||
if (fasticmp(KartColor_Names[i], temp)) // SRB2kart
|
||||
{
|
||||
pdemo->standings[count].color = i;
|
||||
break;
|
||||
@@ -2605,7 +2600,7 @@ void G_DoPlayDemo(char *defdemoname)
|
||||
boolean skiperrors = false;
|
||||
#endif
|
||||
boolean spectator;
|
||||
UINT8 slots[MAXPLAYERS], kartspeed[MAXPLAYERS], kartweight[MAXPLAYERS], numslots = 0;
|
||||
UINT8 slots[MAXPLAYERS] = {}, kartspeed[MAXPLAYERS] = {}, kartweight[MAXPLAYERS] = {}, numslots = 0;
|
||||
|
||||
G_InitDemoRewind();
|
||||
|
||||
@@ -2616,7 +2611,7 @@ void G_DoPlayDemo(char *defdemoname)
|
||||
if (defdemoname == NULL)
|
||||
{
|
||||
demobuf.p = demobuf.buffer;
|
||||
pdemoname = ZZ_Alloc(1); // Easier than adding checks for this everywhere it's freed
|
||||
pdemoname = ZZ_Calloc(1); // Easier than adding checks for this everywhere it's freed
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2628,7 +2623,7 @@ void G_DoPlayDemo(char *defdemoname)
|
||||
n++;
|
||||
|
||||
pdemoname = ZZ_Alloc(strlen(n)+1);
|
||||
strcpy(pdemoname,n);
|
||||
strcpy(pdemoname, n);
|
||||
|
||||
M_SetPlaybackMenuPointer();
|
||||
|
||||
@@ -2837,15 +2832,15 @@ void G_DoPlayDemo(char *defdemoname)
|
||||
if (demo.version == 0x0001)
|
||||
{
|
||||
// Player name
|
||||
memcpy(player_names[0],demobuf.p,16);
|
||||
memcpy(player_names[0], demobuf.p, 16);
|
||||
demobuf.p += 16;
|
||||
|
||||
// Skin
|
||||
memcpy(skin,demobuf.p,16);
|
||||
memcpy(skin, demobuf.p, 16);
|
||||
demobuf.p += 16;
|
||||
|
||||
// Color
|
||||
memcpy(color,demobuf.p,16);
|
||||
memcpy(color, demobuf.p, 16);
|
||||
demobuf.p += 16;
|
||||
|
||||
demobuf.p += 5; // Backwards compat - some stats
|
||||
@@ -2878,7 +2873,7 @@ void G_DoPlayDemo(char *defdemoname)
|
||||
// Set color
|
||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
||||
{
|
||||
if (fasticmp(KartColor_Names[i],color)) // SRB2kart
|
||||
if (fasticmp(KartColor_Names[i], color)) // SRB2kart
|
||||
{
|
||||
players[0].skincolor = i;
|
||||
break;
|
||||
@@ -2898,9 +2893,9 @@ void G_DoPlayDemo(char *defdemoname)
|
||||
return;
|
||||
}
|
||||
|
||||
memset(&oldcmd,0,sizeof(oldcmd));
|
||||
memset(&oldghost,0,sizeof(oldghost));
|
||||
memset(&ghostext,0,sizeof(ghostext));
|
||||
memset(&oldcmd, 0, sizeof(oldcmd));
|
||||
memset(&oldghost, 0, sizeof(oldghost));
|
||||
memset(&ghostext, 0, sizeof(ghostext));
|
||||
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Demo version does not match game version. Desyncs may occur.\n"));
|
||||
|
||||
@@ -3004,16 +2999,16 @@ void G_DoPlayDemo(char *defdemoname)
|
||||
players[p].spectator = spectator;
|
||||
|
||||
// Name
|
||||
memcpy(player_names[p],demobuf.p,16);
|
||||
memcpy(player_names[p], demobuf.p, 16);
|
||||
demobuf.p += 16;
|
||||
|
||||
// Skin
|
||||
memcpy(skin,demobuf.p,16);
|
||||
memcpy(skin, demobuf.p, 16);
|
||||
demobuf.p += 16;
|
||||
SetPlayerSkin(p, skin);
|
||||
|
||||
// Color
|
||||
memcpy(color,demobuf.p,16);
|
||||
memcpy(color, demobuf.p, 16);
|
||||
demobuf.p += 16;
|
||||
|
||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
||||
@@ -3090,6 +3085,9 @@ post_compat:
|
||||
if (cv_director.value)
|
||||
CV_SetValue(&cv_director, 0);
|
||||
|
||||
if (demo.timing)
|
||||
G_DoneLevelLoad();
|
||||
|
||||
demo.deferstart = true;
|
||||
}
|
||||
#undef SKIPERRORS
|
||||
@@ -3228,15 +3226,15 @@ void G_AddGhost(char *defdemoname)
|
||||
if (ghostversion == 0x0001)
|
||||
{
|
||||
// Player name (TODO: Display this somehow if it doesn't match cv_playername!)
|
||||
memcpy(name, p,16);
|
||||
memcpy(name, p, 16);
|
||||
p += 16;
|
||||
|
||||
// Skin
|
||||
memcpy(skin, p,16);
|
||||
memcpy(skin, p, 16);
|
||||
p += 16;
|
||||
|
||||
// Color
|
||||
memcpy(color, p,16);
|
||||
memcpy(color, p, 16);
|
||||
p += 16;
|
||||
|
||||
// Ghosts do not have a player structure to put this in.
|
||||
@@ -3388,7 +3386,7 @@ void G_AddGhost(char *defdemoname)
|
||||
|
||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
||||
{
|
||||
if (fasticmp(KartColor_Names[i],color)) // SRB2kart
|
||||
if (fasticmp(KartColor_Names[i], color)) // SRB2kart
|
||||
{
|
||||
gh->mo->color = (UINT8)i;
|
||||
break;
|
||||
@@ -3480,7 +3478,7 @@ void G_UpdateStaffGhostName(lumpnum_t l)
|
||||
if (ghostversion == 0x0001)
|
||||
{
|
||||
// Player name
|
||||
memcpy(dummystaffname, p,16);
|
||||
memcpy(dummystaffname, p, 16);
|
||||
dummystaffname[16] = '\0';
|
||||
return; // Not really a failure but whatever
|
||||
}
|
||||
@@ -3517,10 +3515,11 @@ static INT32 restorecv_vidwait;
|
||||
void G_TimeDemo(const char *name)
|
||||
{
|
||||
nodrawers = M_CheckParm("-nodraw");
|
||||
noblit = M_CheckParm("-noblit");
|
||||
|
||||
restorecv_vidwait = cv_vidwait.value;
|
||||
if (cv_vidwait.value)
|
||||
CV_Set(&cv_vidwait, "0");
|
||||
|
||||
demo.timing = true;
|
||||
singletics = true;
|
||||
framecount = 0;
|
||||
|
||||
+24
-43
@@ -61,17 +61,11 @@
|
||||
|
||||
gameaction_t gameaction = 0;
|
||||
gamestate_t gamestate = GS_NULL;
|
||||
UINT8 ultimatemode = false;
|
||||
|
||||
boolean botingame = false;
|
||||
UINT8 botskin = 0;
|
||||
UINT8 botcolor = 0;
|
||||
|
||||
JoyType_t Joystick[MAXSPLITSCREENPLAYERS] = {};
|
||||
|
||||
// 1024 bytes is plenty for a savegame
|
||||
#define SAVEGAMESIZE (1024)
|
||||
|
||||
// SRB2kart
|
||||
char gamedatafilename[64] = "kartdata.dat";
|
||||
char timeattackfolder[64] = "kart";
|
||||
@@ -90,7 +84,6 @@ INT16 maptol = 0;
|
||||
UINT8 globalweather = 0;
|
||||
INT32 curWeather = PRECIP_NONE;
|
||||
INT32 cursaveslot = -1; // Auto-save 1p savegame slot
|
||||
INT16 lastmapsaved = 0; // Last map we auto-saved at
|
||||
boolean gamecomplete = false;
|
||||
|
||||
UINT16 mainwads = 0;
|
||||
@@ -100,7 +93,6 @@ boolean savemoddata = false;
|
||||
UINT8 paused = 0;
|
||||
UINT8 modeattacking = ATTACKING_NONE;
|
||||
boolean imcontinuing = false;
|
||||
boolean runemeraldmanager = false;
|
||||
|
||||
boolean netgame = false; // only true if packets are broadcast
|
||||
boolean multiplayer = false;
|
||||
@@ -112,7 +104,6 @@ INT32 consoleplayer = 0; // player taking events and displaying
|
||||
INT32 displayplayers[MAXSPLITSCREENPLAYERS] = {}; // view being displayed
|
||||
|
||||
tic_t gametic = 0;
|
||||
tic_t levelstarttic = 0; // gametic at level start
|
||||
UINT32 totalrings = 0; // for intermission
|
||||
INT16 lastmap = 0; // last level you were at (returning from special stages)
|
||||
tic_t timeinmap = 0; // Ticker for time spent in level (used for levelcard display)
|
||||
@@ -190,9 +181,6 @@ boolean CheckForReverseGravity = false;
|
||||
UINT16 invulntics = 20*TICRATE;
|
||||
UINT16 sneakertics = 20*TICRATE;
|
||||
UINT16 flashingtics = 3*TICRATE/2; // SRB2kart
|
||||
UINT16 tailsflytics = 8*TICRATE;
|
||||
UINT16 underwatertics = 30*TICRATE;
|
||||
UINT16 spacetimetics = 11*TICRATE + (TICRATE/2);
|
||||
UINT16 extralifetics = 4*TICRATE;
|
||||
|
||||
// SRB2kart
|
||||
@@ -210,10 +198,7 @@ const INT32 wipeoutslowtime = 20;
|
||||
const INT32 wantedreduce = 5*TICRATE;
|
||||
const INT32 wantedfrequency = 10*TICRATE;
|
||||
|
||||
INT32 gameovertics = 15*TICRATE;
|
||||
|
||||
UINT8 use1upSound = 0;
|
||||
UINT8 maxXtraLife = 2; // Max extra lives from rings
|
||||
|
||||
UINT8 introtoplay = 0;
|
||||
UINT8 creditscutscene = 0;
|
||||
@@ -768,7 +753,7 @@ INT32 JoyAxis(axis_input_e axissel, UINT8 player)
|
||||
if (retaxis > (+JOYAXISRANGE))
|
||||
retaxis = +JOYAXISRANGE;
|
||||
|
||||
if (!Joystick[pnum].bGamepadStyle && axissel < AXISDEAD)
|
||||
if (!DigitalGamepadStyle(pnum) && axissel < AXISDEAD)
|
||||
{
|
||||
const INT32 jdeadzone = ((JOYAXISRANGE-1) * deadzone) >> FRACBITS;
|
||||
|
||||
@@ -816,8 +801,8 @@ static void G_HandleLocalDriftturn(ticcmd_t *cmd, UINT8 ssplayer)
|
||||
|
||||
const UINT8 forplayer = (ssplayer-1);
|
||||
|
||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle;
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle;
|
||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !DigitalGamepadStyle(forplayer);
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && DigitalGamepadStyle(forplayer);
|
||||
|
||||
turnright = InputDown(gc_turnright, ssplayer);
|
||||
turnleft = InputDown(gc_turnleft, ssplayer);
|
||||
@@ -872,7 +857,8 @@ static void G_HandleLocalDriftturn(ticcmd_t *cmd, UINT8 ssplayer)
|
||||
static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam)
|
||||
{
|
||||
INT32 axis = 0;
|
||||
const boolean usejoystick = cv_usejoystick[(ssplayer-1)].value;
|
||||
const UINT8 forplayer = (ssplayer-1);
|
||||
const boolean usejoystick = cv_usejoystick[forplayer].value;
|
||||
|
||||
// check for inputs and return button commands
|
||||
// for stuff like joining with item button, saltyhop, honking, etc.
|
||||
@@ -908,7 +894,7 @@ static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam)
|
||||
#undef CHECKINPUT
|
||||
|
||||
axis = JoyAxis(AXISLOOKBACK, ssplayer);
|
||||
camspin[ssplayer-1] = (InputDown(gc_lookback, ssplayer) || (usejoystick && axis > 0));
|
||||
camspin[forplayer] = (InputDown(gc_lookback, ssplayer) || (usejoystick && axis > 0));
|
||||
|
||||
// Reset to our spec player if we watch someone else.
|
||||
if ((cmd->driftturn || cmd->buttons)
|
||||
@@ -1005,10 +991,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||
player_t *player = P_GetLocalPlayerForNum(forplayer);
|
||||
|
||||
camera_t *thiscam = &camera[forplayer];
|
||||
const boolean freecam = camera[forplayer].freecam;
|
||||
|
||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle;
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle;
|
||||
const boolean freecam = thiscam->freecam;
|
||||
|
||||
lang = localangle[forplayer];
|
||||
laim = localaiming[forplayer];
|
||||
@@ -1040,6 +1023,9 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||
return;
|
||||
}
|
||||
|
||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !DigitalGamepadStyle(forplayer);
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && DigitalGamepadStyle(forplayer);
|
||||
|
||||
usejoystick = (analogjoystickmove || gamepadjoystickmove);
|
||||
turnright = InputDown(gc_turnright, ssplayer);
|
||||
turnleft = InputDown(gc_turnleft, ssplayer);
|
||||
@@ -1303,8 +1289,6 @@ static void G_DoLoadLevel(boolean resetplayer)
|
||||
// Make sure objectplace is OFF when you first start the level!
|
||||
OP_ResetObjectplace();
|
||||
|
||||
levelstarttic = gametic; // for time calculation
|
||||
|
||||
if (wipegamestate == GS_LEVEL)
|
||||
wipegamestate = -1; // force a wipe
|
||||
|
||||
@@ -1326,6 +1310,7 @@ static void G_DoLoadLevel(boolean resetplayer)
|
||||
{
|
||||
// fail so reset game stuff
|
||||
Command_ExitGame_f();
|
||||
P_FreeCorruptMapWarnings();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1359,6 +1344,8 @@ static void G_DoLoadLevel(boolean resetplayer)
|
||||
|
||||
// clear hud messages remains (usually from game startup)
|
||||
CON_ClearHUD();
|
||||
// print any map errors now due to clearhud above :chaosleep:
|
||||
P_PrintCorruptMapWarnings();
|
||||
|
||||
server_lagless = !cv_gentlemens.value;
|
||||
|
||||
@@ -3358,18 +3345,6 @@ static void G_DoStartVote(void)
|
||||
gameaction = ga_nothing;
|
||||
}
|
||||
|
||||
//
|
||||
// G_UseContinue
|
||||
//
|
||||
void G_UseContinue(void)
|
||||
{
|
||||
if (gamestate == GS_LEVEL && !netgame && !multiplayer)
|
||||
{
|
||||
gameaction = ga_startcont;
|
||||
lastdraw = true;
|
||||
}
|
||||
}
|
||||
|
||||
static void G_DoStartContinue(void)
|
||||
{
|
||||
I_Assert(!netgame && !multiplayer);
|
||||
@@ -3408,7 +3383,7 @@ static void G_DoContinued(void)
|
||||
token = 0;
|
||||
|
||||
// Reset # of lives
|
||||
pl->lives = (ultimatemode) ? 1 : 3;
|
||||
pl->lives = 3;
|
||||
|
||||
D_MapChange(gamemap, gametype, false, false, 0, false, false);
|
||||
|
||||
@@ -3902,7 +3877,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"));
|
||||
@@ -4052,7 +4027,6 @@ void G_InitNew(UINT8 pencoremode, const char *mapname, boolean resetplayer, bool
|
||||
if (W_CheckNumForName(mapname) == LUMPERROR)
|
||||
{
|
||||
I_Error("Internal game map '%s' not found\n", mapname);
|
||||
Command_ExitGame_f();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4117,6 +4091,7 @@ char *G_BuildMapTitle(INT32 mapnum)
|
||||
const char *actnum = NULL;
|
||||
|
||||
len += strlen(mapheaderinfo[mapnum-1]->lvlttl);
|
||||
|
||||
if (strlen(mapheaderinfo[mapnum-1]->zonttl) > 0)
|
||||
{
|
||||
zonetext = M_GetText(mapheaderinfo[mapnum-1]->zonttl);
|
||||
@@ -4127,6 +4102,7 @@ char *G_BuildMapTitle(INT32 mapnum)
|
||||
zonetext = M_GetText("Zone");
|
||||
len += strlen(zonetext) + 1; // ' ' + zonetext
|
||||
}
|
||||
|
||||
if (strlen(mapheaderinfo[mapnum-1]->actnum) > 0)
|
||||
{
|
||||
actnum = M_GetText(mapheaderinfo[mapnum-1]->actnum);
|
||||
@@ -4140,8 +4116,10 @@ char *G_BuildMapTitle(INT32 mapnum)
|
||||
|
||||
sprintf(title, "%s", mapheaderinfo[mapnum-1]->lvlttl);
|
||||
|
||||
if (zonetext) sprintf(title + strlen(title), " %s", zonetext);
|
||||
if (actnum) sprintf(title + strlen(title), " %s", actnum);
|
||||
if (zonetext)
|
||||
sprintf(title + strlen(title), " %s", zonetext);
|
||||
if (actnum)
|
||||
sprintf(title + strlen(title), " %s", actnum);
|
||||
}
|
||||
|
||||
return title;
|
||||
@@ -4153,6 +4131,7 @@ static void measurekeywords(mapsearchfreq_t *fr,
|
||||
{
|
||||
char *qp;
|
||||
char *sp;
|
||||
|
||||
if (wanttable)
|
||||
(*dimp) = Z_Realloc((*dimp), 255 * sizeof (struct searchdim),
|
||||
PU_STATIC, NULL);
|
||||
@@ -4167,10 +4146,12 @@ static void measurekeywords(mapsearchfreq_t *fr,
|
||||
(*dimp)[(*cuntp)].pos = sp - s;
|
||||
(*dimp)[(*cuntp)].siz = strlen(qp);
|
||||
}
|
||||
|
||||
(*cuntp)++;
|
||||
fr->total++;
|
||||
}
|
||||
}
|
||||
|
||||
if (wanttable)
|
||||
(*dimp) = Z_Realloc((*dimp), (*cuntp) * sizeof (struct searchdim),
|
||||
PU_STATIC, NULL);
|
||||
|
||||
+2
-6
@@ -39,12 +39,8 @@ extern INT32 player_name_changes[MAXPLAYERS];
|
||||
extern player_t players[MAXPLAYERS];
|
||||
extern boolean playeringame[MAXPLAYERS];
|
||||
|
||||
// gametic at level start
|
||||
extern tic_t levelstarttic;
|
||||
|
||||
// for modding?
|
||||
extern INT16 prevmap, nextmap;
|
||||
extern INT32 gameovertics;
|
||||
extern tic_t timeinmap; // Ticker for time spent in level (used for levelcard display)
|
||||
extern INT16 rw_maximums[NUM_WEAPONS];
|
||||
|
||||
@@ -122,10 +118,11 @@ extern consvar_t cv_driftsparkpulse;
|
||||
extern consvar_t cv_gravstretch;
|
||||
extern consvar_t cv_sloperoll;
|
||||
extern consvar_t cv_sliptideroll;
|
||||
extern consvar_t cv_stairjank;
|
||||
extern consvar_t cv_stairjanksfx;
|
||||
extern consvar_t cv_slamsound;
|
||||
extern consvar_t cv_sloperolldist;
|
||||
extern consvar_t cv_sparkroll;
|
||||
extern consvar_t cv_spinoutroll;
|
||||
|
||||
extern consvar_t cv_squishdance, cv_squishdancespeed;
|
||||
|
||||
@@ -252,7 +249,6 @@ UINT8 G_GetGametypeColor(INT16 gt);
|
||||
void G_ExitLevel(void);
|
||||
void G_NextLevel(void);
|
||||
void G_Continue(void);
|
||||
void G_UseContinue(void);
|
||||
void G_AfterIntermission(void);
|
||||
void G_EndGame(void); // moved from y_inter.c/h and renamed
|
||||
|
||||
|
||||
@@ -81,6 +81,7 @@ consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS] = {
|
||||
{"gamepadled4", "Skincolor", CV_SAVE|CV_CALL|CV_NOINIT, gamepadled_cons_t, led_off_handle4, 0, NULL, NULL, 0, 0, NULL}
|
||||
};
|
||||
|
||||
consvar_t cv_gamepadifunfocused = {"gamepadunfocused", "Off", CV_SAVE|CV_CALL, CV_OnOff, I_SetJoystickFocus, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_gamepadledifunfocused = {"gamepadledunfocused", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_rumbleifunfocused = {"rumbleifunfocused", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
@@ -939,6 +940,11 @@ void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT8 color)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!I_GamepadHasLED(playernum))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// so we can override this
|
||||
skincolor = color ? color : G_GetSkinColorForGamepad(playernum);
|
||||
byte_color = V_GetColor(colortranslations[skincolor][8]).s;
|
||||
@@ -974,12 +980,22 @@ void G_DeviceLEDTick(void)
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (!cv_usejoystick[i].value || !cv_gamepadled[i].value)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// does not have a configurable led! :c
|
||||
if (!I_GamepadHasLED(i))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
newcolor = G_GetSkinColorForGamepad(i);
|
||||
|
||||
if (curcolor[i] == newcolor) // dont update if same colour
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
G_SetPlayerGamepadIndicatorColor(i, newcolor);
|
||||
curcolor[i] = newcolor;
|
||||
@@ -1055,6 +1071,12 @@ void G_DeviceRumbleTick(void)
|
||||
continue;
|
||||
}
|
||||
|
||||
// does not support rumble! :c
|
||||
if (!I_GamepadHasRumble(i))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (camera[i].freecam)
|
||||
{
|
||||
continue;
|
||||
@@ -1117,6 +1139,12 @@ void G_DeviceRumbleTick(void)
|
||||
if (leveltime & 1) // this is actually funny lel
|
||||
high = RUMBLE_MODERATE;
|
||||
}
|
||||
/*else if ((player->stairjank > 8) // this is kinda cool but prob gets annoying after a while
|
||||
&& player->speed != 0
|
||||
&& P_IsObjectOnGround(player->mo))
|
||||
{
|
||||
low = high = RUMBLE_WEAK;
|
||||
}*/
|
||||
|
||||
if (player->kartstuff[k_brakedrift])
|
||||
{
|
||||
|
||||
@@ -116,6 +116,7 @@ extern consvar_t cv_rumble[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
|
||||
|
||||
extern consvar_t cv_gamepadifunfocused;
|
||||
extern consvar_t cv_gamepadledifunfocused;
|
||||
extern consvar_t cv_rumbleifunfocused;
|
||||
|
||||
|
||||
@@ -52,7 +52,6 @@ typedef enum
|
||||
} gameaction_t;
|
||||
|
||||
extern gamestate_t gamestate;
|
||||
extern UINT8 ultimatemode; // was sk_insane
|
||||
extern gameaction_t gameaction;
|
||||
|
||||
extern boolean botingame;
|
||||
|
||||
@@ -373,7 +373,7 @@ static poly_t *CutOutSubsecPoly(seg_t *lseg, INT32 count, poly_t *poly)
|
||||
if (!gl_maphashorizonlines && line->special == HORIZONSPECIAL)
|
||||
gl_maphashorizonlines = true;
|
||||
|
||||
if (line->sidenum[1] != 0xffff)
|
||||
if (line->sidenum[1] != NO_INDEX)
|
||||
{
|
||||
if (sides[line->sidenum[0]].sector == sides[line->sidenum[1]].sector)
|
||||
{
|
||||
|
||||
@@ -15,8 +15,6 @@
|
||||
|
||||
#ifdef HWRENDER
|
||||
|
||||
#include <unordered_set>
|
||||
|
||||
#include "hw_main.h"
|
||||
#include "hw_glob.h"
|
||||
#include "hw_gl.h"
|
||||
@@ -100,7 +98,7 @@ static void HWR_DrawColumnInCache(const column_t *patchcol, UINT8 *block, GLMipm
|
||||
position = 0;
|
||||
}
|
||||
|
||||
position = std::max(((position * scale_y) + (FRACUNIT/2)) >> FRACBITS, 0);
|
||||
position = max(((position * scale_y) + (FRACUNIT/2)) >> FRACBITS, 0);
|
||||
|
||||
if (position + count >= pblockheight)
|
||||
count = pblockheight - position;
|
||||
@@ -164,7 +162,7 @@ static void HWR_DrawPatchInCache(GLMipmap_t *mipmap,
|
||||
fixed_t xfrac, xfracstep;
|
||||
fixed_t yfracstep, scale_y;
|
||||
const column_t *patchcol;
|
||||
UINT8 *block = static_cast<UINT8 *>(mipmap->data);
|
||||
UINT8 *block = (UINT8 *)(mipmap->data);
|
||||
INT32 bpp;
|
||||
INT32 blockmodulo;
|
||||
RGBA_t *palette;
|
||||
@@ -214,7 +212,7 @@ static void HWR_DrawTexturePatchInCache(GLMipmap_t *mipmap,
|
||||
fixed_t xfrac, xfracstep;
|
||||
fixed_t yfracstep, scale_y;
|
||||
const column_t *patchcol;
|
||||
UINT8 *block = static_cast<UINT8 *>(mipmap->data);
|
||||
UINT8 *block = (UINT8 *)(mipmap->data);
|
||||
INT32 bpp;
|
||||
INT32 blockmodulo;
|
||||
INT32 width, height;
|
||||
@@ -290,7 +288,7 @@ static UINT8 *MakeBlock(GLMipmap_t *glMipmap)
|
||||
INT32 blocksize = (glMipmap->width * glMipmap->height);
|
||||
|
||||
bpp = format2bpp(glMipmap->format);
|
||||
block = static_cast<UINT8 *>(Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data)));
|
||||
block = (UINT8 *)(Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data)));
|
||||
|
||||
switch (bpp)
|
||||
{
|
||||
@@ -327,7 +325,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
|
||||
texture = textures[texnum];
|
||||
|
||||
gltex->mipmap.flags = TF_CHROMAKEYED | TF_WRAPXY;
|
||||
gltex->mipmap.format = static_cast<GLTextureFormat_t>(textureformat);
|
||||
gltex->mipmap.format = (GLTextureFormat_t)(textureformat);
|
||||
|
||||
// hack the Legacy skies..
|
||||
if (UNLIKELY(memcmp(texture->name, "SKY", 3) == 0 &&
|
||||
@@ -346,7 +344,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
|
||||
colormap += COLORMAP_REMAPOFFSET;
|
||||
#endif
|
||||
|
||||
gltex->mipmap.colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*gltex->mipmap.colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||
gltex->mipmap.colormap = (GLColormap_t *)(Z_Calloc(sizeof(*gltex->mipmap.colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||
gltex->mipmap.colormap->source = colormap;
|
||||
memcpy(gltex->mipmap.colormap->data, colormap, 256 * sizeof(UINT8));
|
||||
|
||||
@@ -379,7 +377,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
|
||||
// Composite the columns together.
|
||||
for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++)
|
||||
{
|
||||
pdata = static_cast<UINT8 *>(W_CacheLumpNumPwad(patch->wad, patch->lump, PU_LEVEL));
|
||||
pdata = (UINT8 *)(W_CacheLumpNumPwad(patch->wad, patch->lump, PU_LEVEL));
|
||||
realpatch = (softwarepatch_t *)pdata;
|
||||
|
||||
HWR_DrawTexturePatchInCache(&gltex->mipmap, blockwidth, blockheight, texture, patch, realpatch);
|
||||
@@ -415,7 +413,7 @@ void HWR_MakePatch(const patch_t *patch, GLPatch_t *glPatch, GLMipmap_t *glMipma
|
||||
glMipmap->flags = 0;
|
||||
|
||||
// setup the texture info
|
||||
glMipmap->format = static_cast<GLTextureFormat_t>(patchformat);
|
||||
glMipmap->format = (GLTextureFormat_t)(patchformat);
|
||||
|
||||
glPatch->max_s = (float)patch->width / (float)glMipmap->width;
|
||||
glPatch->max_t = (float)patch->height / (float)glMipmap->height;
|
||||
@@ -448,7 +446,7 @@ typedef struct
|
||||
} GLMapTextureSet_t; // idk i suck at naming things
|
||||
|
||||
static size_t gl_numtextures = 0; // Texture count
|
||||
static GLMapTextureSet_t *gl_textures; // For all textures
|
||||
static GLMapTextureSet_t *gl_textures = NULL; // For all textures
|
||||
|
||||
static void HWR_FreeTextureData(patch_t *patch)
|
||||
{
|
||||
@@ -457,7 +455,7 @@ static void HWR_FreeTextureData(patch_t *patch)
|
||||
if (!patch || !patch->hardware)
|
||||
return;
|
||||
|
||||
glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
glPatch = (GLPatch_t *)(patch->hardware);
|
||||
|
||||
if (vid.glstate == VID_GL_LIBRARY_LOADED)
|
||||
GL_DeleteTexture(glPatch->mipmap);
|
||||
@@ -473,7 +471,7 @@ void HWR_FreeTexture(patch_t *patch)
|
||||
|
||||
if (patch->hardware)
|
||||
{
|
||||
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
GLPatch_t *glPatch = (GLPatch_t *)(patch->hardware);
|
||||
|
||||
HWR_FreeTextureColormaps(patch);
|
||||
|
||||
@@ -499,7 +497,7 @@ static void HWR_FreeTextureColormaps(patch_t *patch)
|
||||
if (!patch)
|
||||
return;
|
||||
|
||||
pat = static_cast<GLPatch_t *>(patch->hardware);
|
||||
pat = (GLPatch_t *)(patch->hardware);
|
||||
if (!pat)
|
||||
return;
|
||||
|
||||
@@ -572,7 +570,8 @@ void HWR_ClearAllTextures(void)
|
||||
/*static void HWR_FreeColormapCache(void)
|
||||
{
|
||||
HWR_FreePatchCache(false);
|
||||
}*/
|
||||
}
|
||||
*/
|
||||
|
||||
void HWR_InitMapTextures(void)
|
||||
{
|
||||
@@ -614,23 +613,21 @@ void HWR_FreeMapTextures(void)
|
||||
gl_numtextures = 0;
|
||||
}
|
||||
|
||||
#define NAME flatcheck
|
||||
#define KEY_TY UINT32
|
||||
#define HASH_FN vt_hash_integer
|
||||
#define CMPR_FN vt_cmpr_integer
|
||||
#include "../verstable.h"
|
||||
|
||||
static void HWR_PrecacheLevelFlats(void)
|
||||
{
|
||||
// lookup for flats that may´ve been already loaded
|
||||
// too lazy to make a hashtable or smth so unordered set will do :carbuncle:
|
||||
std::unordered_set<UINT32> flatpresent;
|
||||
flatcheck flatpresent;
|
||||
size_t i, j;
|
||||
INT32 k;
|
||||
|
||||
auto load_flat = [&](lumpnum_t lump, boolean noencoremap)
|
||||
{
|
||||
// flat already loaded?
|
||||
if (flatpresent.count(lump) == 0)
|
||||
{
|
||||
HWR_GetFlat(lump, noencoremap);
|
||||
flatpresent.insert(lump);
|
||||
}
|
||||
};
|
||||
flatcheck_init(&flatpresent);
|
||||
flatcheck_reserve(&flatpresent, numlevelflats);
|
||||
|
||||
// special case for encore
|
||||
#ifdef GLENCORE
|
||||
@@ -649,14 +646,23 @@ static void HWR_PrecacheLevelFlats(void)
|
||||
|
||||
const levelflat_t *levelflat = &levelflats[pic];
|
||||
|
||||
load_flat(levelflat->lumpnum, R_NoEncore(sec, ceiling));
|
||||
if (flatcheck_is_end(flatcheck_get(&flatpresent, levelflat->lumpnum)))
|
||||
{
|
||||
HWR_GetFlat(levelflat->lumpnum, R_NoEncore(sec, ceiling));
|
||||
flatcheck_insert(&flatpresent, levelflat->lumpnum);
|
||||
}
|
||||
|
||||
if (levelflat->speed) // is it an animated flat ?
|
||||
{
|
||||
// start from 0, occasionally basenumlump != flat->lumpnum
|
||||
for (k = 0; k < levelflat->numpics; k++)
|
||||
{
|
||||
load_flat(levelflat->baselumpnum + k, R_NoEncore(sec, ceiling));
|
||||
lumpnum_t lump = levelflat->baselumpnum + k;
|
||||
if (flatcheck_is_end(flatcheck_get(&flatpresent, lump)))
|
||||
{
|
||||
HWR_GetFlat(lump, R_NoEncore(sec, ceiling));
|
||||
flatcheck_insert(&flatpresent, lump);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -671,18 +677,29 @@ static void HWR_PrecacheLevelFlats(void)
|
||||
{
|
||||
const levelflat_t *levelflat = &levelflats[i];
|
||||
|
||||
load_flat(levelflat->lumpnum, false);
|
||||
if (flatcheck_is_end(flatcheck_get(&flatpresent, levelflat->lumpnum)))
|
||||
{
|
||||
HWR_GetFlat(levelflat->lumpnum, false);
|
||||
flatcheck_insert(&flatpresent, levelflat->lumpnum);
|
||||
}
|
||||
|
||||
if (levelflat->speed) // is it an animated flat ?
|
||||
{
|
||||
// start from 0, occasionally basenumlump != flat->lumpnum
|
||||
for (k = 0; k < levelflat->numpics; k++)
|
||||
{
|
||||
load_flat(levelflat->baselumpnum + k, false);
|
||||
lumpnum_t lump = levelflat->baselumpnum + k;
|
||||
if (flatcheck_is_end(flatcheck_get(&flatpresent, lump)))
|
||||
{
|
||||
HWR_GetFlat(lump, false);
|
||||
flatcheck_insert(&flatpresent, lump);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flatcheck_cleanup(&flatpresent);
|
||||
}
|
||||
|
||||
static void HWR_PrecacheLevelTextures(void)
|
||||
@@ -692,7 +709,7 @@ static void HWR_PrecacheLevelTextures(void)
|
||||
size_t i, j, f;
|
||||
INT32 h;
|
||||
|
||||
texturepresent = static_cast<char *>(calloc(gl_numtextures, sizeof(*texturepresent)));
|
||||
texturepresent = (char *)(calloc(gl_numtextures, sizeof(*texturepresent)));
|
||||
if (texturepresent == NULL)
|
||||
I_Error("%s: Out of memory looking up textures", "HWR_PrecacheLevel");
|
||||
|
||||
@@ -712,7 +729,7 @@ static void HWR_PrecacheLevelTextures(void)
|
||||
for (j = 0; j < 2; j++)
|
||||
{
|
||||
// check if single-sided linedef
|
||||
if (line->sidenum[j] == 0xffff)
|
||||
if (line->sidenum[j] == NO_INDEX)
|
||||
continue;
|
||||
|
||||
const side_t *side = &sides[line->sidenum[j]];
|
||||
@@ -867,7 +884,7 @@ void HWR_LoadMapTextures(size_t pnumtextures)
|
||||
HWR_FreeMapTextures();
|
||||
|
||||
gl_numtextures = pnumtextures;
|
||||
gl_textures = static_cast<GLMapTextureSet_t *>(calloc(gl_numtextures, sizeof(*gl_textures))); // *2 - 1 for encore-remapped texture and another for noencore texture (unused when not in encore), see: GLMapTextureSet_t
|
||||
gl_textures = (GLMapTextureSet_t *)(calloc(gl_numtextures, sizeof(*gl_textures))); // *2 - 1 for encore-remapped texture and another for noencore texture (unused when not in encore), see: GLMapTextureSet_t
|
||||
|
||||
if (gl_textures == NULL)
|
||||
I_Error("HWR_LoadMapTextures: ran out of memory for OpenGL textures. Sad!");
|
||||
@@ -964,7 +981,7 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum)
|
||||
W_ReadLump(flatlumpnum, Z_Malloc(size, PU_HWRCACHE, &glMipmap->data));
|
||||
|
||||
#ifdef GLENCORE
|
||||
flat = static_cast<UINT8 *>(glMipmap->data);
|
||||
flat = (UINT8 *)(glMipmap->data);
|
||||
for (steppy = 0; steppy < size; steppy++)
|
||||
{
|
||||
if (flat[steppy] == HWR_PATCHES_CHROMAKEY_COLORINDEX)
|
||||
@@ -975,7 +992,6 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum)
|
||||
|
||||
flat[steppy] = glMipmap->colormap->source[flat[steppy]];
|
||||
}
|
||||
#endif
|
||||
|
||||
if (haschromakey)
|
||||
{
|
||||
@@ -987,6 +1003,7 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum)
|
||||
glMipmap->flags &= ~TF_CHROMAKEYED;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Download a Doom 'flat' to the hardware cache and make it ready for use
|
||||
@@ -1008,7 +1025,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
|
||||
if (!noencoremap && encoremap)
|
||||
colormap += COLORMAP_REMAPOFFSET;
|
||||
#endif
|
||||
glMipmap->colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*glMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||
glMipmap->colormap = (GLColormap_t *)(Z_Calloc(sizeof(*glMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||
glMipmap->colormap->source = colormap;
|
||||
memcpy(glMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
||||
}
|
||||
@@ -1032,7 +1049,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
|
||||
// --------------------+
|
||||
static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
||||
{
|
||||
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
GLPatch_t *glPatch = (GLPatch_t *)(patch->hardware);
|
||||
|
||||
if (!glMipmap->downloaded)
|
||||
{
|
||||
@@ -1053,7 +1070,7 @@ static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
||||
// ----------------------+
|
||||
static void HWR_UpdatePatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
||||
{
|
||||
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
GLPatch_t *glPatch = (GLPatch_t *)(patch->hardware);
|
||||
HWR_MakePatch(patch, glPatch, glMipmap, true);
|
||||
|
||||
// If hardware does not have the texture, then call GL_SetTexture to upload it
|
||||
@@ -1089,7 +1106,7 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
|
||||
|
||||
if (!patch->hardware)
|
||||
Patch_CreateGL(patch);
|
||||
glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
glPatch = (GLPatch_t *)(patch->hardware);
|
||||
|
||||
// Blatant hack for encore colormapping aside...
|
||||
if (colormap == colormaps || colormap == NULL || colormap == (const UINT8*)(COLORMAP_REMAPOFFSET))
|
||||
@@ -1113,7 +1130,9 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
|
||||
HWR_UpdatePatchMipmap(patch, glMipmap);
|
||||
}
|
||||
else
|
||||
{
|
||||
HWR_LoadPatchMipmap(patch, glMipmap);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -1125,12 +1144,12 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
|
||||
// (it have a liste of mipmap)
|
||||
// this malloc is cleared in HWR_FreeColormapCache
|
||||
// (...) unfortunately z_malloc fragment alot the memory :(so malloc is better
|
||||
newMipmap = static_cast<GLMipmap_t *>(calloc(1, sizeof (*newMipmap)));
|
||||
newMipmap = (GLMipmap_t *)(calloc(1, sizeof (*newMipmap)));
|
||||
if (newMipmap == NULL)
|
||||
I_Error("%s: Out of memory", "HWR_GetMappedPatch");
|
||||
glMipmap->nextcolormap = newMipmap;
|
||||
|
||||
newMipmap->colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*newMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||
newMipmap->colormap = (GLColormap_t *)(Z_Calloc(sizeof(*newMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||
newMipmap->colormap->source = colormap;
|
||||
memcpy(newMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
||||
|
||||
@@ -1153,7 +1172,7 @@ patch_t *HWR_GetCachedGLPatchPwad(UINT16 wadnum, UINT16 lumpnum)
|
||||
{
|
||||
void *ptr = Z_Calloc(sizeof(patch_t), PU_PATCH, &lumpcache[lumpnum]);
|
||||
Patch_Create(NULL, 0, ptr);
|
||||
Patch_AllocateHardwarePatch(static_cast<patch_t *>(ptr));
|
||||
Patch_AllocateHardwarePatch((patch_t *)(ptr));
|
||||
}
|
||||
|
||||
return (patch_t *)(lumpcache[lumpnum]);
|
||||
@@ -1170,7 +1189,7 @@ static void HWR_DrawFadeMaskInCache(GLMipmap_t *mipmap, INT32 pblockwidth, INT32
|
||||
{
|
||||
INT32 i,j;
|
||||
fixed_t posx, posy, stepx, stepy;
|
||||
UINT8 *block = static_cast<UINT8 *>(mipmap->data); // places the data directly into here
|
||||
UINT8 *block = (UINT8 *)(mipmap->data); // places the data directly into here
|
||||
UINT8 *flat;
|
||||
UINT8 *dest, *src, texel;
|
||||
RGBA_t col;
|
||||
@@ -1326,7 +1345,7 @@ void HWR_SetPalette(RGBA_t *palette)
|
||||
static void HWR_SetPaletteLookup(RGBA_t *palette)
|
||||
{
|
||||
int r, g, b;
|
||||
UINT8 *lut = static_cast<UINT8 *>(Z_Malloc(
|
||||
UINT8 *lut = (UINT8 *)(Z_Malloc(
|
||||
HWR_PALETTE_LUT_SIZE*HWR_PALETTE_LUT_SIZE*HWR_PALETTE_LUT_SIZE*sizeof(UINT8),
|
||||
PU_STATIC, NULL));
|
||||
#define STEP_SIZE (256/HWR_PALETTE_LUT_SIZE)
|
||||
@@ -1371,7 +1390,7 @@ void HWR_SetMapPalette(void)
|
||||
if (palsize < 768) // 256 * 3
|
||||
I_Error("HWR_SetMapPalette: A programmer assumed palette lumps are at least 768 bytes long, but apparently this was a wrong assumption!\n");
|
||||
|
||||
RGB_data = static_cast<UINT8 *>(W_CacheLumpNum(lumpnum, PU_CACHE));
|
||||
RGB_data = (UINT8 *)(W_CacheLumpNum(lumpnum, PU_CACHE));
|
||||
// we got the RGB palette now, but we need it in RGBA format.
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
@@ -1406,7 +1425,7 @@ static UINT32 HWR_CreateLightTable(UINT8 *lighttable)
|
||||
{
|
||||
UINT32 i, id;
|
||||
RGBA_t *palette = HWR_GetTexturePalette();
|
||||
RGBA_t *hw_lighttable = static_cast<RGBA_t *>(Z_Malloc(256 * 32 * sizeof(RGBA_t), PU_STATIC, NULL));
|
||||
RGBA_t *hw_lighttable = (RGBA_t *)(Z_Malloc(256 * 32 * sizeof(RGBA_t), PU_STATIC, NULL));
|
||||
|
||||
// To make the palette index -> RGBA mapping easier for the shader,
|
||||
// the hardware lighttable is composed of RGBA colors instead of palette indices.
|
||||
@@ -319,16 +319,17 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
|
||||
double clipfov;
|
||||
double floatangle;
|
||||
angle_t a1;
|
||||
|
||||
float tilt = fabsf(((float)(int)tiltangle) / (float)ANG1);
|
||||
|
||||
if (tilt > 90.0f)
|
||||
tilt = 90.0f;
|
||||
float tilt;
|
||||
|
||||
// If the pitch is larger than this you can look all around at a FOV of 90
|
||||
if (abs((signed)tiltangle) > 46 * ANG1)
|
||||
return 0xffffffff;
|
||||
|
||||
tilt = fabsf(((float)(int)tiltangle) / (float)ANG1);
|
||||
|
||||
if (tilt > 90.0f)
|
||||
tilt = 90.0f;
|
||||
|
||||
// ok, this is a gross hack that barely works...
|
||||
// but at least it doesn't overestimate too much...
|
||||
clipfov = atan(1 / (GLdouble)projMatrix[0]) * 360.0 / M_PI;
|
||||
|
||||
@@ -54,7 +54,7 @@ struct GLMipmap_s
|
||||
UINT16 width, height;
|
||||
UINT32 downloaded; // The GPU has this texture.
|
||||
|
||||
struct GLMipmap_s *nextcolormap;
|
||||
struct GLMipmap_s *nextcolormap;
|
||||
struct GLColormap_s *colormap;
|
||||
};
|
||||
typedef struct GLMipmap_s GLMipmap_t;
|
||||
|
||||
+31
-27
@@ -32,20 +32,6 @@
|
||||
|
||||
#include <fcntl.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UINT8 id_field_length ; // 1
|
||||
UINT8 color_map_type ; // 2
|
||||
UINT8 image_type ; // 3
|
||||
UINT8 dummy[5] ; // 4, 8
|
||||
INT16 x_origin ; // 9, 10
|
||||
INT16 y_origin ; //11, 12
|
||||
INT16 width ; //13, 14
|
||||
INT16 height ; //15, 16
|
||||
UINT8 image_pix_size ; //17
|
||||
UINT8 image_descriptor; //18
|
||||
} ATTRPACK TGAHeader; // sizeof is 18
|
||||
|
||||
static const UINT8 softwaretranstogl[11] = { 0, 25, 51, 76,102,127,153,178,204,229,255};
|
||||
static const UINT8 softwaretranstogl_hi[11] = { 0, 51,102,153,204,255,255,255,255,255,255};
|
||||
static const UINT8 softwaretranstogl_lo[11] = { 0, 12, 24, 36, 48, 60, 71, 83, 95,111,127};
|
||||
@@ -57,8 +43,7 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
|
||||
{
|
||||
FOutVector v[4];
|
||||
FBITFIELD flags;
|
||||
float cx = FIXED_TO_FLOAT(x);
|
||||
float cy = FIXED_TO_FLOAT(y);
|
||||
float cx, cy;
|
||||
UINT8 alphalevel = ((option & V_ALPHAMASK) >> V_ALPHASHIFT);
|
||||
UINT8 blendmode = ((bflags & V_BLENDMASK) >> V_BLENDSHIFT);
|
||||
GLPatch_t *hwrPatch;
|
||||
@@ -72,6 +57,9 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
|
||||
if (alphalevel >= 10 && alphalevel < 13)
|
||||
return;
|
||||
|
||||
cx = FIXED_TO_FLOAT(x);
|
||||
cy = FIXED_TO_FLOAT(y);
|
||||
|
||||
const float fvw = (float)vid.width;
|
||||
const float fvh = (float)vid.height;
|
||||
|
||||
@@ -150,7 +138,7 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
|
||||
if (!column->topdelta)
|
||||
{
|
||||
const UINT8 *source = (const UINT8 *)(column) + 3;
|
||||
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (column->topdelta == 0xff ? 31 : source[0]));
|
||||
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, source[0]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,7 +210,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)
|
||||
@@ -244,8 +232,7 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
||||
{
|
||||
FOutVector v[4];
|
||||
FBITFIELD flags;
|
||||
float cx = FIXED_TO_FLOAT(x);
|
||||
float cy = FIXED_TO_FLOAT(y);
|
||||
float cx, cy;
|
||||
UINT8 alphalevel = ((option & V_ALPHAMASK) >> V_ALPHASHIFT);
|
||||
GLPatch_t *hwrPatch;
|
||||
|
||||
@@ -258,6 +245,9 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
||||
if (alphalevel >= 10 && alphalevel < 13)
|
||||
return;
|
||||
|
||||
cx = FIXED_TO_FLOAT(x);
|
||||
cy = FIXED_TO_FLOAT(y);
|
||||
|
||||
const float fvw = (float)vid.width;
|
||||
const float fvh = (float)vid.height;
|
||||
|
||||
@@ -302,7 +292,7 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
||||
if (!column->topdelta)
|
||||
{
|
||||
const UINT8 *source = (const UINT8 *)(column) + 3;
|
||||
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (column->topdelta == 0xff ? 31 : source[0]));
|
||||
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, source[0]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -385,7 +375,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 +480,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 +533,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 +588,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 +692,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 +810,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)
|
||||
@@ -964,6 +954,20 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
|
||||
#endif
|
||||
|
||||
#ifndef USE_PNG
|
||||
typedef struct
|
||||
{
|
||||
UINT8 id_field_length ; // 1
|
||||
UINT8 color_map_type ; // 2
|
||||
UINT8 image_type ; // 3
|
||||
UINT8 dummy[5] ; // 4, 8
|
||||
INT16 x_origin ; // 9, 10
|
||||
INT16 y_origin ; //11, 12
|
||||
INT16 width ; //13, 14
|
||||
INT16 height ; //15, 16
|
||||
UINT8 image_pix_size ; //17
|
||||
UINT8 image_descriptor; //18
|
||||
} ATTRPACK TGAHeader; // sizeof is 18
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// save screenshots with TGA format
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
@@ -32,8 +32,12 @@ void GL_SetSpecialState(hwdspecialstate_t IdState, INT32 Value);
|
||||
void GL_SetTransform(FTransform *stransform);
|
||||
void GL_SetBlend(FBITFIELD PolyFlags);
|
||||
void GL_SetPalette(RGBA_t *palette);
|
||||
|
||||
void GL_ClearBuffer(FBOOLEAN ColorMask, FBOOLEAN DepthMask, FBOOLEAN StencilMask, FRGBAFloat * ClearColor);
|
||||
|
||||
void GL_EnableStencilTest(void);
|
||||
void GL_DisableStencilTest(void);
|
||||
|
||||
void GL_DrawPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags);
|
||||
void GL_DrawIndexedTriangles(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags, unsigned int *IndexArray);
|
||||
void GL_Draw2DLine(F2DCoord *v1, F2DCoord *v2, RGBA_t Color);
|
||||
@@ -63,7 +67,7 @@ void GL_FlushScreenTextures(void);
|
||||
void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags);
|
||||
void GL_DoScreenWipe(int wipeStart, int wipeEnd);
|
||||
void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8 downdistort, UINT8 barsize);
|
||||
void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean useshader);
|
||||
void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height);
|
||||
|
||||
void GL_PostImgRedraw(float points[SCREENVERTS][SCREENVERTS][2]);
|
||||
|
||||
@@ -72,6 +76,7 @@ void GL_LoadShader(int slot, char *code, hwdshaderstage_t stage);
|
||||
boolean GL_CompileShader(int slot);
|
||||
void GL_SetShader(int slot);
|
||||
void GL_UnSetShader(void);
|
||||
void GL_EnableShader(void);
|
||||
|
||||
void GL_SetShaderInfo(hwdshaderinfo_t info, INT32 value);
|
||||
|
||||
|
||||
@@ -34,8 +34,8 @@ typedef struct gl_vissprite_s
|
||||
float gz, gzt;
|
||||
float tz;
|
||||
float scale;
|
||||
float spritexscale, spriteyscale;
|
||||
float spritexoffset, spriteyoffset;
|
||||
//float spritexscale, spriteyscale;
|
||||
//float spritexoffset, spriteyoffset;
|
||||
patch_t *gpatch;
|
||||
boolean flip;
|
||||
UINT8 translucency; //alpha level 0-255
|
||||
|
||||
+465
-533
File diff suppressed because it is too large.
Load diff
@@ -102,7 +102,7 @@ void HWR_SetViewSize(void);
|
||||
void HWR_AddCommands(void);
|
||||
|
||||
void HWR_RenderPlayerView(void);
|
||||
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, int stencil_level, boolean allow_portals);
|
||||
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, int stencil_level);
|
||||
|
||||
void HWR_ClearSkyDome(void);
|
||||
void HWR_BuildSkyDome(void);
|
||||
@@ -151,14 +151,19 @@ FUNCINLINE static ATTRINLINE void HWR_RenderVhsEffect(fixed_t upbary, fixed_t do
|
||||
GL_RenderVhsEffect(upbary, downbary, updistort, downdistort, barsize);
|
||||
}
|
||||
|
||||
FUNCINLINE static ATTRINLINE void HWR_MakeScreenTexture(void)
|
||||
{
|
||||
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC1);
|
||||
}
|
||||
|
||||
FUNCINLINE static ATTRINLINE void HWR_MakeScreenFinalTexture(void)
|
||||
{
|
||||
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC2);
|
||||
}
|
||||
|
||||
FUNCINLINE static ATTRINLINE void HWR_DrawScreenFinalTexture(INT32 width, INT32 height, boolean useshader)
|
||||
FUNCINLINE static ATTRINLINE void HWR_DrawScreenFinalTexture(INT32 width, INT32 height)
|
||||
{
|
||||
GL_DrawScreenFinalTexture(HWD_SCREENTEXTURE_GENERIC2, width, height, useshader);
|
||||
GL_DrawScreenFinalTexture(HWD_SCREENTEXTURE_GENERIC2, width, height);
|
||||
}
|
||||
|
||||
// hw_main.c: Segs
|
||||
@@ -208,7 +213,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 +224,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)
|
||||
{
|
||||
|
||||
+16
-25
@@ -693,17 +693,15 @@ static void HWR_CreateBlendedTexture(patch_t *gpatch, patch_t *blendgpatch, GLMi
|
||||
GLPatch_t *hwrBlendPatch = blendgpatch->hardware;
|
||||
UINT16 w = gpatch->width, h = gpatch->height;
|
||||
UINT32 size = w*h;
|
||||
RGBA_t *image, *blendimage, *cur, blendcolor;
|
||||
RGBA_t *image, *blendimage, *cur;
|
||||
RGBA_t blendcolor = {};
|
||||
RGBA_t *palette = HWR_GetTexturePalette();
|
||||
UINT8 translation[17]; // First the color index
|
||||
UINT8 cutoff[17]; // Brightness cutoff before using the next color
|
||||
UINT8 translation[17] = {}; // First the color index
|
||||
UINT8 cutoff[17] = {}; // Brightness cutoff before using the next color
|
||||
UINT8 translen = 0;
|
||||
UINT8 i;
|
||||
UINT8 colorbrightnesses[17];
|
||||
UINT8 color_match_lookup[256]; // optimization attempt
|
||||
|
||||
memset(translation, 0, sizeof(translation));
|
||||
memset(cutoff, 0, sizeof(cutoff));
|
||||
UINT8 colorbrightnesses[17] = {};
|
||||
UINT8 color_match_lookup[256] = {}; // optimization attempt
|
||||
|
||||
if (glMipmap->width == 0)
|
||||
{
|
||||
@@ -716,14 +714,10 @@ static void HWR_CreateBlendedTexture(patch_t *gpatch, patch_t *blendgpatch, GLMi
|
||||
glMipmap->format = GL_TEXFMT_RGBA;
|
||||
}
|
||||
|
||||
if (glMipmap->data)
|
||||
{
|
||||
Z_Free(glMipmap->data);
|
||||
glMipmap->data = NULL;
|
||||
}
|
||||
Z_Free(glMipmap->data);
|
||||
glMipmap->data = NULL;
|
||||
|
||||
cur = Z_Malloc(size*4, PU_HWRMODELTEXTURE, &glMipmap->data);
|
||||
memset(cur, 0x00, size*4);
|
||||
cur = Z_Calloc(size*4, PU_HWRMODELTEXTURE, &glMipmap->data);
|
||||
|
||||
image = hwrPatch->mipmap->data;
|
||||
blendimage = hwrBlendPatch->mipmap->data;
|
||||
@@ -1037,7 +1031,6 @@ static void HWR_GetBlendedTexture(patch_t *patch, patch_t *blendgpatch, INT32 sk
|
||||
GLPatch_t *glPatch = patch->hardware;
|
||||
GLMipmap_t *glMipmap, *newMipmap;
|
||||
|
||||
|
||||
if (blendgpatch == NULL || colormap == colormaps || colormap == NULL)
|
||||
{
|
||||
// Don't do any blending
|
||||
@@ -1106,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;
|
||||
@@ -1343,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
|
||||
@@ -1407,12 +1400,11 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
|
||||
|
||||
const angle_t sliptideroll = ((cv_sliptideroll.value && spr->mobj->player) ? spr->mobj->player->sliproll : 0);
|
||||
const SINT8 flipfactor = flip ? -1 : 1;
|
||||
const angle_t thingrollangle = (spr->mobj->rollangle - spr->mobj->temprollangle);
|
||||
|
||||
if (spr->mobj->rollangle || sliptideroll)
|
||||
if (thingrollangle || sliptideroll)
|
||||
{
|
||||
angle_t rollang = sliptideroll
|
||||
? (spr->mobj->rollangle) + (sliptideroll * spr->mobj->player->kartstuff[k_aizdriftstrat])
|
||||
: (spr->mobj->rollangle);
|
||||
angle_t rollang = sliptideroll ? (thingrollangle + (sliptideroll * spr->mobj->player->kartstuff[k_aizdriftstrat])) : thingrollangle;
|
||||
|
||||
rollang *= flipfactor;
|
||||
|
||||
@@ -1482,7 +1474,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)
|
||||
{
|
||||
@@ -1533,7 +1525,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;
|
||||
|
||||
|
||||
@@ -154,7 +154,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
||||
char *buffer;
|
||||
int surfEnd;
|
||||
int i, t;
|
||||
int matCount;
|
||||
//int matCount;
|
||||
FILE *f;
|
||||
|
||||
if (!latlnginit)
|
||||
@@ -227,7 +227,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
||||
|
||||
retModel->meshes = (mesh_t*)Z_Calloc(sizeof(mesh_t)*retModel->numMeshes, ztag, NULL);
|
||||
|
||||
matCount = 0;
|
||||
//matCount = 0;
|
||||
for (i = 0, surfEnd = 0; i < mdh->numSurfaces; i++)
|
||||
{
|
||||
int j;
|
||||
@@ -237,7 +237,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
||||
|
||||
mdShader = (md3Shader*)((char*)mdS + mdS->offsetShaders);
|
||||
|
||||
for (j = 0; j < mdS->numShaders; j++, matCount++)
|
||||
for (j = 0; j < mdS->numShaders; j++ /*, matCount++*/)
|
||||
{
|
||||
size_t len = strlen(mdShader[j].name);
|
||||
mdShader[j].name[len-1] = 'z';
|
||||
@@ -503,7 +503,6 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
free(buffer);
|
||||
|
||||
return retModel;
|
||||
|
||||
@@ -80,8 +80,8 @@ void HWR_Portal_Add2Lines(const INT32 line1, const INT32 line2, seg_t *seg)
|
||||
gl_portal_t *portal = HWR_Portal_Add(seg);
|
||||
|
||||
// Offset the portal view by the linedef centers
|
||||
line_t* start = &lines[line1];
|
||||
line_t* dest = &lines[line2];
|
||||
line_t* start = &lines[line1];
|
||||
line_t* dest = &lines[line2];
|
||||
|
||||
angle_t dangle = R_PointToAngle2(0, 0, dest->dx, dest->dy) - R_PointToAngle2(start->dx, start->dy, 0, 0);
|
||||
|
||||
@@ -99,7 +99,7 @@ void HWR_Portal_Add2Lines(const INT32 line1, const INT32 line2, seg_t *seg)
|
||||
dest_c.y = dest->v1->y/2 + dest->v2->y/2;
|
||||
|
||||
disttopoint = R_PointToDist2(start_c.x, start_c.y, viewx, viewy);
|
||||
angtopoint = R_PointToAngle2(start_c.x, start_c.y, viewx, viewy);
|
||||
angtopoint = R_PointToAngle2(start_c.x, start_c.y, viewx, viewy);
|
||||
angtopoint += dangle;
|
||||
|
||||
portal->viewx = dest_c.x + FixedMul(FINECOSINE(angtopoint>>ANGLETOFINESHIFT), disttopoint);
|
||||
@@ -170,7 +170,7 @@ void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float
|
||||
HWR_PortalFrame(portal);
|
||||
|
||||
// call HWR_RenderViewpoint
|
||||
HWR_RenderPortalViewpoint(portal, stencil_level + 1, true);
|
||||
HWR_RenderPortalViewpoint(portal, stencil_level + 1);
|
||||
|
||||
// return to current frame
|
||||
if (rootportal)
|
||||
@@ -220,9 +220,9 @@ boolean HWR_PortalCheckBBox(const fixed_t *bspcoord)
|
||||
if (!portalclipline)
|
||||
return true;
|
||||
|
||||
if (HWR_PortalCheckPointSide(bspcoord[BOXLEFT], bspcoord[BOXTOP]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXLEFT], bspcoord[BOXBOTTOM]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXRIGHT], bspcoord[BOXTOP]) ||
|
||||
if (HWR_PortalCheckPointSide(bspcoord[BOXLEFT], bspcoord[BOXTOP]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXLEFT], bspcoord[BOXBOTTOM]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXRIGHT], bspcoord[BOXTOP]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXRIGHT], bspcoord[BOXBOTTOM]))
|
||||
{
|
||||
return true;
|
||||
|
||||
@@ -109,7 +109,7 @@ boolean HWR_InitShaders(void)
|
||||
// returns INT32_MAX if not found
|
||||
static INT32 strstr_int(const char *str1, const char *str2)
|
||||
{
|
||||
char *location = strstr(str1, str2);
|
||||
gconst char *location = strstr(str1, str2);
|
||||
if (location)
|
||||
return location - str1;
|
||||
else
|
||||
@@ -365,13 +365,17 @@ static void HWR_CompileShader(int index)
|
||||
if (vertex_source)
|
||||
{
|
||||
char *preprocessed = HWR_PreprocessShader(vertex_source);
|
||||
if (!preprocessed) return;
|
||||
if (!preprocessed)
|
||||
return;
|
||||
|
||||
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_VERTEX);
|
||||
}
|
||||
if (fragment_source)
|
||||
{
|
||||
char *preprocessed = HWR_PreprocessShader(fragment_source);
|
||||
if (!preprocessed) return;
|
||||
if (!preprocessed)
|
||||
return;
|
||||
|
||||
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_FRAGMENT);
|
||||
}
|
||||
|
||||
@@ -387,8 +391,10 @@ void HWR_CompileShaders(void)
|
||||
{
|
||||
int custom_index = gl_shadertargets[i].custom_shader;
|
||||
HWR_CompileShader(i);
|
||||
|
||||
if (!gl_shaders[i].compiled)
|
||||
CONS_Alert(CONS_ERROR, "HWR_CompileShaders: Compilation failed for base %s shader!\n", shaderxlat[i].type);
|
||||
|
||||
if (custom_index != -1)
|
||||
{
|
||||
HWR_CompileShader(custom_index);
|
||||
|
||||
+14
-19
@@ -76,35 +76,30 @@
|
||||
//
|
||||
|
||||
// Include GLSL_FLOOR_FUDGES or GLSL_WALL_FUDGES or define the fudges in shaders that use this macro.
|
||||
|
||||
// dither shader based on
|
||||
// https://github.com/hughsk/glsl-dither/blob/master/8x8.glsl
|
||||
// https://github.com/libretro/glsl-shaders/blob/master/dithering/shaders/bayer_4x4.glsl
|
||||
// adapted and messed about to work with srb2 and scale per resolution
|
||||
#define GLSL_DOOM_COLORMAP_DITHER \
|
||||
"float baseValue = max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \
|
||||
"float endResolutionx = scr_resolution.x;\n" \
|
||||
"float endResolutiony = scr_resolution.y;\n" \
|
||||
"if (scr_resolution.x > 1280.0) {\n" \
|
||||
"endResolutionx = scr_resolution.x * 0.5;\n" \
|
||||
"}\n" \
|
||||
"if (scr_resolution.y > 720.0) {\n" \
|
||||
"endResolutiony = scr_resolution.y * 0.5;\n" \
|
||||
"}\n" \
|
||||
"float zFactor = clamp((z - 192.0) / (6144.0 - 192.0), 0.0, 1.0);\n" \
|
||||
"int scaleFactor = int(mix(1.0, 8.0, zFactor));\n" \
|
||||
"endResolutionx = endResolutionx * scaleFactor;\n" \
|
||||
"endResolutiony = endResolutiony * scaleFactor;\n" \
|
||||
"vec2 normalizedPosition = position * vec2(endResolutionx / scr_resolution.x, endResolutiony / scr_resolution.y);\n" \
|
||||
"int x = int(mod(normalizedPosition.x, 4.0));\n" \
|
||||
"int y = int(mod(normalizedPosition.y, 4.0));\n" \
|
||||
"float patscale = min(scr_resolution.x / 1280.0, scr_resolution.y / 720.0);\n" \
|
||||
"patscale = max(floor(patscale + 0.5), 1.0);\n" \
|
||||
"patscale = 1.0 / patscale;\n" \
|
||||
"ivec2 p = ivec2(mod(floor(position * patscale), 4.0));\n" \
|
||||
"float depthfactor = clamp((z - 192.0) / (6144.0 - 192.0), 0.0, 1.0);\n" \
|
||||
"float bayerMatrix[4*4] = float[4*4](\n" \
|
||||
"0.0, 8.0, 2.0, 10.0,\n" \
|
||||
"12.0, 4.0, 14.0, 6.0,\n" \
|
||||
"3.0, 11.0, 1.0, 9.0,\n" \
|
||||
"15.0, 7.0, 13.0, 5.0\n" \
|
||||
");\n" \
|
||||
"float threshold = 16.0;\n" \
|
||||
"#ifdef SRB2_PALETTE_RENDERING\n" \
|
||||
"float threshold = (1.0 - pow(zFactor, 2.0)) * (bayerMatrix[y*4 + x] / 11.0);\n" \
|
||||
"#else\n" \
|
||||
"float threshold = (1.0 - pow(zFactor, 2.0)) * (bayerMatrix[y*4 + x] / 16.0);\n" \
|
||||
"threshold = 11.0;\n" \
|
||||
"#endif\n" \
|
||||
"return mix(baseValue + threshold - 0.5 / 16.0, baseValue, zFactor);\n"
|
||||
"threshold = (1.0 - pow(depthfactor, 2.0)) * (bayerMatrix[p.y*4 + p.x] / threshold);\n" \
|
||||
"return mix(baseValue + threshold - 0.5 / 16.0, baseValue, depthfactor);\n"
|
||||
|
||||
#define GLSL_DOOM_COLORMAP_NODITHER \
|
||||
"return max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \
|
||||
|
||||
@@ -1068,6 +1068,13 @@ void GL_SetShader(int slot)
|
||||
gl_shadersenabled = false;
|
||||
}
|
||||
|
||||
void GL_EnableShader(void)
|
||||
{
|
||||
// we can just use GL_Shader_SetUniforms as itll enable the shader for us
|
||||
// and handle any failures
|
||||
GL_Shader_SetUniforms(NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
void GL_UnSetShader(void)
|
||||
{
|
||||
if (gl_shadersenabled) // don't repeatedly call glUseProgram if not needed
|
||||
@@ -1115,7 +1122,7 @@ static void GL_Perspective(GLfloat fovy, GLfloat aspect)
|
||||
|
||||
const GLfloat deltaZ = FAR_CLIPPING_PLANE - NEAR_CLIPPING_PLANE;
|
||||
|
||||
if ((fabsf((float)deltaZ) < 1.0E-36f) || fpclassify(aspect) == FP_ZERO)
|
||||
if ((fabsf(deltaZ) < 1.0E-36f) || fpclassify(aspect) == FP_ZERO)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -1277,7 +1284,7 @@ void GL_SetStates(void)
|
||||
|
||||
pglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
|
||||
pglEnable(GL_STENCIL_TEST);
|
||||
pglDisable(GL_STENCIL_TEST);
|
||||
pglEnable(GL_DEPTH_TEST); // check the depth buffer
|
||||
pglDepthMask(GL_TRUE); // enable writing to depth buffer
|
||||
pglClearDepth(1.0f);
|
||||
@@ -1307,6 +1314,16 @@ void GL_SetStates(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
void GL_EnableStencilTest(void)
|
||||
{
|
||||
pglEnable(GL_STENCIL_TEST);
|
||||
}
|
||||
|
||||
void GL_DisableStencilTest(void)
|
||||
{
|
||||
pglDisable(GL_STENCIL_TEST);
|
||||
}
|
||||
|
||||
// -----------------+
|
||||
// DeleteTexture : Deletes a texture from the GPU and frees its data
|
||||
// -----------------+
|
||||
@@ -1383,19 +1400,19 @@ void GL_Flush(void)
|
||||
// -----------------+
|
||||
INT32 GL_isExtAvailable(const char *extension, const GLubyte *start)
|
||||
{
|
||||
GLubyte *where, *terminator;
|
||||
gconst GLubyte *where, *terminator;
|
||||
|
||||
if (!extension || !start)
|
||||
return 0;
|
||||
|
||||
where = (GLubyte *) strchr(extension, ' ');
|
||||
where = (gconst GLubyte *)strchr(extension, ' ');
|
||||
|
||||
if (where || *extension == '\0')
|
||||
return 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
where = (GLubyte *) strstr((const char *) start, extension);
|
||||
where = (gconst GLubyte *)strstr((const char *)start, extension);
|
||||
|
||||
if (!where)
|
||||
break;
|
||||
@@ -1566,6 +1583,7 @@ void GL_Draw2DLine(F2DCoord * v1, F2DCoord * v2, RGBA_t Color)
|
||||
angle = atanf((v2->y-v1->y)/(v2->x-v1->x));
|
||||
else
|
||||
angle = (float)N_PI_DEMI;
|
||||
|
||||
dx = sinf(angle) / (float)screen_width;
|
||||
dy = cosf(angle) / (float)screen_height;
|
||||
|
||||
@@ -1680,7 +1698,7 @@ static void GL_SetBlendMode(FBITFIELD flags)
|
||||
|
||||
void GL_SetBlend(FBITFIELD PolyFlags)
|
||||
{
|
||||
const FBITFIELD Xor = CurrentPolyFlags^PolyFlags;;
|
||||
const FBITFIELD Xor = CurrentPolyFlags^PolyFlags;
|
||||
|
||||
if (Xor & (PF_Blending|PF_RemoveYWrap|PF_ForceWrapX|PF_ForceWrapY|PF_Occlude|PF_NoTexture|PF_Modulated|PF_NoDepthTest|PF_Decal|PF_Skydecal|PF_Invisible))
|
||||
{
|
||||
@@ -2897,7 +2915,7 @@ void GL_CreateModelVBOs(model_t *model)
|
||||
}
|
||||
}
|
||||
|
||||
#define BUFFER_OFFSET(i) ((char*)(i))
|
||||
#define BUFFER_OFFSET(i) ((void*)(i))
|
||||
|
||||
void GL_DrawModelEx(model_t *model, INT32 frameIndex, float duration, float tics, INT32 nextFrameIndex, FTransform *pos, float hscale, float vscale, UINT8 flipped, UINT8 hflipped, FSurfaceInfo *Surface)
|
||||
{
|
||||
@@ -3243,14 +3261,6 @@ static void GL_Framebuffer_Generate(void)
|
||||
if (!framebufferobject.fboobj)
|
||||
pglGenFramebuffers(1, &framebufferobject.fboobj);
|
||||
|
||||
if (pglCheckFramebufferStatus(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
|
||||
{
|
||||
// if this fails, dont retry it a gazillion times
|
||||
// this wouldnt recover
|
||||
supportFBO = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// Bind the framebuffer
|
||||
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj);
|
||||
|
||||
@@ -3302,6 +3312,18 @@ static void GL_Framebuffer_Generate(void)
|
||||
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
|
||||
}
|
||||
|
||||
if (pglCheckFramebufferStatus(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
|
||||
{
|
||||
//pglGetError(); TODO:implement this or smth
|
||||
GL_MSG_Error("GL_Framebuffer_Generate: Failed to create Framebuffer Object");
|
||||
|
||||
// if this fails, dont retry it a gazillion times
|
||||
// this wouldnt recover
|
||||
supportFBO = false;
|
||||
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
// Unbind the framebuffer
|
||||
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
||||
|
||||
@@ -3324,6 +3346,10 @@ void GL_Framebuffer_Enable(void)
|
||||
|
||||
GL_Framebuffer_Generate();
|
||||
|
||||
// failed
|
||||
if (!supportFBO || !framebufferobject.init)
|
||||
return;
|
||||
|
||||
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj);
|
||||
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, framebufferobject.rboobj);
|
||||
}
|
||||
@@ -3718,7 +3744,7 @@ void GL_MakeScreenTexture(int tex)
|
||||
tex_downloaded = screenTextures[tex];
|
||||
}
|
||||
|
||||
void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean useshader)
|
||||
void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height)
|
||||
{
|
||||
float xfix, yfix;
|
||||
float origaspect, newaspect;
|
||||
@@ -3771,9 +3797,6 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean usesh
|
||||
|
||||
pglBindTexture(GL_TEXTURE_2D, screenTextures[tex]);
|
||||
|
||||
if (useshader)
|
||||
pglUseProgram(gl_shaders[SHADER_PALETTE_POSTPROCESS].program); // Final postprocess step of palette rendering, after everything else has been drawn.
|
||||
|
||||
pglColor4ubv(white);
|
||||
|
||||
pglTexCoordPointer(2, GL_FLOAT, 0, fix);
|
||||
@@ -3781,9 +3804,6 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean usesh
|
||||
|
||||
pglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
||||
|
||||
if (useshader)
|
||||
pglUseProgram(0);
|
||||
|
||||
tex_downloaded = screenTextures[tex];
|
||||
}
|
||||
|
||||
|
||||
+3
-1
@@ -225,9 +225,10 @@ HMS_connect (const char *format, ...)
|
||||
{
|
||||
cc = curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
|
||||
|
||||
#ifdef LOGMESSAGES
|
||||
cc = curl_easy_setopt(curl, CURLOPT_STDERR, logstream);
|
||||
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (M_CheckParm("-bindaddr") && M_IsNextParm())
|
||||
@@ -317,6 +318,7 @@ static void
|
||||
HMS_end (struct HMS_buffer *buffer)
|
||||
{
|
||||
curl_easy_cleanup(buffer->curl);
|
||||
free(buffer->errbuf);
|
||||
free(buffer->buffer);
|
||||
free(buffer);
|
||||
}
|
||||
|
||||
+230
-267
@@ -97,7 +97,6 @@ static textinput_t w_chat;
|
||||
static boolean headsupactive = false;
|
||||
boolean hu_showscores = false; // draw rankings
|
||||
static char hu_tick;
|
||||
static tic_t hu_emoteanim = 0;
|
||||
emote_autocomplete_t emote_autocomplete = {0};
|
||||
|
||||
static huddrawlist_h luahuddrawlist_scores = NULL;
|
||||
@@ -116,154 +115,12 @@ static patch_t *songcreditbg = NULL;
|
||||
// -------
|
||||
static void HU_DrawRankings(void);
|
||||
|
||||
|
||||
consvar_t cv_showspecstuff = {"showspecstuff", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
//======================================================================
|
||||
// KEYBOARD LAYOUTS FOR ENTERING TEXT
|
||||
//======================================================================
|
||||
|
||||
char *shiftxform = NULL;
|
||||
|
||||
char english_shiftxform[] =
|
||||
{
|
||||
0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31,
|
||||
' ', '!', '"', '#', '$', '%', '&',
|
||||
'"', // shift-'
|
||||
'(', ')', '*', '+',
|
||||
'<', // shift-,
|
||||
'_', // shift--
|
||||
'>', // shift-.
|
||||
'?', // shift-/
|
||||
')', // shift-0
|
||||
'!', // shift-1
|
||||
'@', // shift-2
|
||||
'#', // shift-3
|
||||
'$', // shift-4
|
||||
'%', // shift-5
|
||||
'^', // shift-6
|
||||
'&', // shift-7
|
||||
'*', // shift-8
|
||||
'(', // shift-9
|
||||
':',
|
||||
':', // shift-;
|
||||
'<',
|
||||
'+', // shift-=
|
||||
'>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'{', // shift-[
|
||||
'|', // shift-backslash - OH MY GOD DOES WATCOM SUCK
|
||||
'}', // shift-]
|
||||
'"', '_',
|
||||
'~', // shift-`
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'{', '|', '}', '~', 127
|
||||
};
|
||||
|
||||
char french_shiftxform[] =
|
||||
{
|
||||
0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31,
|
||||
' ','$', //shift-!
|
||||
'3', //shift-"
|
||||
'#', '$', '%',
|
||||
'1', //shift-&
|
||||
'4', // shift-'
|
||||
'5', // shift-(
|
||||
')', // shift-)
|
||||
'*', '+',
|
||||
'?', // shift-,
|
||||
'6', // shift--
|
||||
'.', '/',
|
||||
'0', '1', '2', '3', '4', '5',
|
||||
'6', '7', '8', '9',
|
||||
'/', // shitf-:
|
||||
'.', // shift-;
|
||||
'>', // shift-<
|
||||
'+', // shift-=
|
||||
'>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'[', '\\', ']', '^',
|
||||
'8', //shift-_
|
||||
'`',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'{', '|', '}', '~', 127,
|
||||
128, 129,
|
||||
'2',
|
||||
131, 132,
|
||||
'0',
|
||||
134,
|
||||
'9',
|
||||
136, 137,
|
||||
'7',
|
||||
139, 140,
|
||||
'%'
|
||||
};
|
||||
|
||||
char french_altgrxform[] =
|
||||
{
|
||||
0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31,
|
||||
' ', '!',
|
||||
'#', //altgr-"
|
||||
'#', '$', '%', '&',
|
||||
'{', //altgr-'
|
||||
'[', //altgr-(
|
||||
']', //altgr-)
|
||||
'*', '+', ',',
|
||||
'|', //altg--
|
||||
'.', '/',
|
||||
'0', '1', '2', '3', '4', '5',
|
||||
'6', '7', '8', '9',
|
||||
':', ';', '<',
|
||||
'}', //altgr-=
|
||||
'>', '?', '@',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'[', '\\', ']', '^',
|
||||
'\\', //altgr-backslash
|
||||
'`',
|
||||
'a', 'b', 'c', 'd', 'E', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
|
||||
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
||||
'{', '|', '}', '~', 127,
|
||||
128, 129,
|
||||
'~',
|
||||
131, 132,
|
||||
'@',
|
||||
134,
|
||||
'^',
|
||||
136, 137,
|
||||
'`',
|
||||
139, 140,
|
||||
KEY_FR_U_GRAVE
|
||||
};
|
||||
|
||||
//fallback for special letter non displayable in the game (i.e.: 'é','à',etc.)
|
||||
INT32 HU_FallBackFrSpecialLetter(INT32 key)
|
||||
{
|
||||
switch(key){
|
||||
case KEY_FR_E_AIGUE: return 'e';
|
||||
case KEY_FR_E_GRAVE: return 'e';
|
||||
case KEY_FR_C_CEDILLE: return 'c';
|
||||
case KEY_FR_A_GRAVE: return 'a';
|
||||
case KEY_FR_U_GRAVE: return 'u';
|
||||
default: return key;
|
||||
}
|
||||
}
|
||||
// stuff from SRB2-Banpyura thx alot! :3
|
||||
consvar_t cv_chat_xoffset = {"chat_xoffset", "0", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_chat_yoffset = {"chat_yoffset", "0", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_chat_showlimit = {"chat_showlimit", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
static char cechotext[1024];
|
||||
static tic_t cechotimer = 0;
|
||||
@@ -281,6 +138,7 @@ static void Command_Say_f(void);
|
||||
static void Command_Sayto_f(void);
|
||||
static void Command_Sayteam_f(void);
|
||||
static void Command_CSay_f(void);
|
||||
static void Command_Mute_f(void);
|
||||
static void Got_Saycmd(const UINT8 **p, INT32 playernum);
|
||||
|
||||
void HU_LoadGraphics(void)
|
||||
@@ -408,8 +266,7 @@ void HU_Init(void)
|
||||
COM_AddCommand("csay", Command_CSay_f);
|
||||
RegisterNetXCmd(XD_SAY, Got_Saycmd);
|
||||
|
||||
// set shift translation table
|
||||
shiftxform = english_shiftxform;
|
||||
COM_AddCommand("muteplayer", Command_Mute_f);
|
||||
|
||||
if (dedicated || rendermode == render_none)
|
||||
return;
|
||||
@@ -436,11 +293,6 @@ void HU_Start(void)
|
||||
headsupactive = true;
|
||||
}
|
||||
|
||||
void HU_Shiftform(void)
|
||||
{
|
||||
shiftxform = (cv_keyboardlayout.value == 3) ? french_shiftxform : english_shiftxform;
|
||||
}
|
||||
|
||||
//======================================================================
|
||||
// EXECUTION
|
||||
//======================================================================
|
||||
@@ -497,7 +349,9 @@ static void HU_removeChatText_Log(void)
|
||||
{
|
||||
chat_log[i] = chat_log[i+1];
|
||||
}
|
||||
|
||||
chat_nummsg_log--; // lost 1 msg.
|
||||
chat_log[chat_nummsg_log] = NULL;
|
||||
}
|
||||
|
||||
static void Chatlogsize_OnChange(void)
|
||||
@@ -516,6 +370,7 @@ static void Chatlogsize_OnChange(void)
|
||||
if (new_chat_log == NULL)
|
||||
{
|
||||
free(chat_log);
|
||||
chat_log = NULL;
|
||||
return;
|
||||
}
|
||||
chat_log = new_chat_log;
|
||||
@@ -541,6 +396,8 @@ void HU_AddChatText(const char *text, boolean playsound)
|
||||
HU_removeChatText_Log();
|
||||
|
||||
chat_log[chat_nummsg_log] = malloc(HU_MSGBUFSIZE);
|
||||
if (!chat_log[chat_nummsg_log])
|
||||
I_Error("HU_AddChatText: out of memory for chat log\n");
|
||||
strcpy(chat_log[chat_nummsg_log], text);
|
||||
++chat_nummsg_log;
|
||||
|
||||
@@ -623,7 +480,10 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
||||
// with that logic, characters 4 and 5 are our numbers:
|
||||
const char *newmsg;
|
||||
INT32 spc = 1; // used if nodenum[1] is a space.
|
||||
CLEANUP(pfree) char *nodenum = (char*) malloc(3);
|
||||
CLEANUP(pfree) char *nodenum = (char*)malloc(3);
|
||||
if (!nodenum)
|
||||
I_Error("DoSayCommand: out of memory for sending pm\n");
|
||||
|
||||
memcpy(nodenum, msg+3, 2);
|
||||
nodenum[2] = '\0';
|
||||
|
||||
@@ -904,7 +764,7 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
|
||||
target = READSINT8(*p);
|
||||
flags = READUINT8(*p);
|
||||
msg = buf;
|
||||
READSTRINGL(*p, msg, HU_MAXMSGLEN + 1);
|
||||
READSTRINGN(*p, msg, HU_MAXMSGLEN + 1);
|
||||
|
||||
if ((cv_mute.value || flags & (HU_CSAY|HU_SERVER_SAY)) && playernum != serverplayer && !(IsPlayerAdmin(playernum)))
|
||||
{
|
||||
@@ -1092,7 +952,6 @@ void HU_Ticker(void)
|
||||
return;
|
||||
|
||||
hu_tick++;
|
||||
hu_emoteanim++;
|
||||
hu_tick &= 7; // currently only to blink chat input cursor
|
||||
|
||||
if (PLAYER1INPUTDOWN(gc_scores))
|
||||
@@ -1112,7 +971,7 @@ void HU_Ticker(void)
|
||||
size_t i = 0;
|
||||
|
||||
// handle spam while we're at it:
|
||||
for(; (i < MAXPLAYERS); i++)
|
||||
for (; (i < MAXPLAYERS); i++)
|
||||
{
|
||||
if (stop_spamming[i] > 0)
|
||||
stop_spamming[i]--;
|
||||
@@ -1128,7 +987,8 @@ void HU_Ticker(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (cechotimer > 0) --cechotimer;
|
||||
if (cechotimer > 0)
|
||||
--cechotimer;
|
||||
|
||||
// Animate the desynch dots
|
||||
if (hu_resynching
|
||||
@@ -1170,21 +1030,42 @@ static boolean HU_clearChatSpaces(void)
|
||||
return nothingbutspaces;
|
||||
}
|
||||
|
||||
static void DoMute(const char *name)
|
||||
static void DoMute(const char *name, boolean chat)
|
||||
{
|
||||
INT32 pnum = D_LookupPlayer(name);
|
||||
|
||||
if (pnum < 0)
|
||||
// Shortcut to reuse this function for console and chat command
|
||||
#define PRINT(msg, sound) do { \
|
||||
if (chat) \
|
||||
HU_AddChatText((msg), (sound)); \
|
||||
else \
|
||||
CONS_Printf("%s\n", msg); \
|
||||
} while (0)
|
||||
|
||||
if (pnum < 0 || !playeringame[pnum])
|
||||
{
|
||||
HU_AddChatText("\x85""ERROR: \x80Player not found.", false);
|
||||
PRINT("\x85""ERROR: \x80Player not found.", false);
|
||||
return;
|
||||
}
|
||||
|
||||
player_muted[pnum] = !player_muted[pnum];
|
||||
|
||||
HU_AddChatText(va("Player '%s' has been %smuted.", player_names[pnum], player_muted[pnum] ? "" : "un"), false);
|
||||
PRINT(va("Player '%s' has been %smuted.", player_names[pnum], player_muted[pnum] ? "" : "un"), false);
|
||||
if (player_muted[pnum])
|
||||
HU_AddChatText("Use same command to unmute them.", false);
|
||||
PRINT("Use same command to unmute them.", false);
|
||||
|
||||
#undef PRINT
|
||||
}
|
||||
|
||||
static void Command_Mute_f(void)
|
||||
{
|
||||
if (COM_Argc() < 2)
|
||||
{
|
||||
CONS_Printf(M_GetText("mute <playername|playernum>: mute/unmute a player\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
DoMute(COM_Argv(1), false);
|
||||
}
|
||||
|
||||
static void HU_SendChatMessage(void)
|
||||
@@ -1218,7 +1099,7 @@ static void HU_SendChatMessage(void)
|
||||
if (msglength >= 5 && strnicmp(msg, "/mute", 5) == 0) // Used /mute
|
||||
{
|
||||
if (msglength > 6)
|
||||
DoMute(msg+6);
|
||||
DoMute(msg+6, true);
|
||||
else
|
||||
HU_AddChatText("\x82NOTICE: \x80Usage: /mute <name|node>", false);
|
||||
|
||||
@@ -1229,7 +1110,9 @@ static void HU_SendChatMessage(void)
|
||||
{
|
||||
INT32 spc = 1; // used if nodenum[1] is a space.
|
||||
const char *newmsg;
|
||||
CLEANUP(pfree) char *nodenum = (char*) malloc(3);
|
||||
CLEANUP(pfree) char *nodenum = (char*)malloc(3);
|
||||
if (!nodenum)
|
||||
I_Error("HU_SendChatMessage: out of memory for sending pm\n");
|
||||
|
||||
// what we're gonna do now is check if the node exists
|
||||
// with that logic, characters 4 and 5 are our numbers:
|
||||
@@ -1257,6 +1140,7 @@ static void HU_SendChatMessage(void)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// I'm very bad at C, I swear I am, additional checks eww!
|
||||
if (spc != 0)
|
||||
{
|
||||
@@ -1403,13 +1287,15 @@ boolean HU_Responder(event_t *ev)
|
||||
chat_on = false;
|
||||
I_SetTextInput(false);
|
||||
}
|
||||
else if ((c == KEY_UPARROW || c == KEY_MOUSEWHEELUP) && chat_scroll > 0 && !OLDCHAT) // CHAT SCROLLING YAYS!
|
||||
else if ((c == KEY_UPARROW || c == KEY_PGUP || c == KEY_MOUSEWHEELUP) &&
|
||||
((chat_scroll > 0) && !OLDCHAT)) // CHAT SCROLLING YAYS!
|
||||
{
|
||||
chat_scroll--;
|
||||
justscrolledup = true;
|
||||
chat_scrolltime = 4;
|
||||
}
|
||||
else if ((c == KEY_DOWNARROW || c == KEY_MOUSEWHEELDOWN) && chat_scroll < chat_maxscroll && chat_maxscroll > 0 && !OLDCHAT)
|
||||
else if ((c == KEY_DOWNARROW || c == KEY_PGDN || c == KEY_MOUSEWHEELDOWN) &&
|
||||
((chat_scroll < chat_maxscroll) && (chat_maxscroll > 0) && !OLDCHAT))
|
||||
{
|
||||
chat_scroll++;
|
||||
justscrolleddown = true;
|
||||
@@ -1489,7 +1375,12 @@ static char *CHAT_WordWrap(INT32 x, INT32 w, INT32 option, const char *string)
|
||||
|
||||
// 30/7/18: chaty is now the distance at which the lowest point of the chat will be drawn if that makes any sense.
|
||||
|
||||
INT16 chatx = 13, chaty = 169; // let's use this as our coordinates, shh
|
||||
// let's use this as our coordinates, shh
|
||||
// :chao: guess this just works lol
|
||||
#define chatx ((INT16)(13 + (cv_chat_xoffset.value)))
|
||||
#define chaty ((INT16)(169 + (cv_chat_yoffset.value)))
|
||||
|
||||
#define CHATSNAP (V_SNAPTOBOTTOM|V_SNAPTOLEFT)
|
||||
|
||||
// chat stuff by VincyTM LOL XD!
|
||||
|
||||
@@ -1516,7 +1407,7 @@ static void HU_drawMiniChat(void)
|
||||
|
||||
for (; i > 0; i--)
|
||||
{
|
||||
char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_mini[i-1]);
|
||||
char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), CHATSNAP|V_ALLOWLOWERCASE, chat_mini[i-1]);
|
||||
size_t j = 0;
|
||||
INT32 linescount = 0;
|
||||
emote_t *emote = NULL;
|
||||
@@ -1573,15 +1464,14 @@ static void HU_drawMiniChat(void)
|
||||
|
||||
y = chaty - charheight*(msglines+1);
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
y -= BASEVIDHEIGHT/2;
|
||||
|
||||
if (splitscreen > 1)
|
||||
y += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
y -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
dx = 0;
|
||||
@@ -1595,7 +1485,7 @@ static void HU_drawMiniChat(void)
|
||||
INT32 timer = ((cv_chattime.value*TICRATE)-chat_timers[i]) - cv_chattime.value*TICRATE+9; // see below...
|
||||
INT32 transflag = (timer >= 0 && timer <= 9) ? (timer*V_10TRANS) : 0; // you can make bad jokes out of this one.
|
||||
size_t j = 0;
|
||||
char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_mini[i]); // get the current message, and word wrap it.
|
||||
char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), CHATSNAP|V_ALLOWLOWERCASE, chat_mini[i]); // get the current message, and word wrap it.
|
||||
UINT8 *colormap = NULL;
|
||||
emote_t *emote = NULL;
|
||||
int emotelen = 0;
|
||||
@@ -1628,9 +1518,9 @@ static void HU_drawMiniChat(void)
|
||||
else if ((emote = M_VerifyEmote(msg+j, &emotelen)))
|
||||
{
|
||||
if (cv_chatbacktint.value) // on request of wolfy
|
||||
V_DrawFillConsoleMap(x + dx + 2, y+dy, EMOTEWIDTH, charheight, 239|V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||
V_DrawFillConsoleMap(x + dx + 2, y+dy, EMOTEWIDTH, charheight, 239|CHATSNAP);
|
||||
|
||||
M_DrawEmote(x+dx+2, y+dy, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT|transflag);
|
||||
M_DrawEmote(x+dx+2, y+dy, emote, CHATSNAP|transflag);
|
||||
dx += EMOTEWIDTH - charwidth;
|
||||
|
||||
j += emotelen;
|
||||
@@ -1638,9 +1528,9 @@ static void HU_drawMiniChat(void)
|
||||
else
|
||||
{
|
||||
if (cv_chatbacktint.value) // on request of wolfy
|
||||
V_DrawFillConsoleMap(x + dx + 2, y+dy, charwidth, charheight, 239|V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||
V_DrawFillConsoleMap(x + dx + 2, y+dy, charwidth, charheight, 239|CHATSNAP);
|
||||
|
||||
V_DrawChatCharacter(x + dx + 2, y+dy+cv_chatcentertext.value, msg[j++] |V_SNAPTOBOTTOM|V_SNAPTOLEFT|transflag, !cv_allcaps.value, colormap);
|
||||
V_DrawChatCharacter(x + dx + 2, y+dy+cv_chatcentertext.value, msg[j++] |CHATSNAP|transflag, !cv_allcaps.value, colormap);
|
||||
}
|
||||
|
||||
dx += charwidth;
|
||||
@@ -1679,18 +1569,15 @@ static void HU_drawChatLog(INT32 offset)
|
||||
if (chat_scroll > chat_maxscroll)
|
||||
chat_scroll = chat_maxscroll;
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
boxh = max(6, boxh/2);
|
||||
if (splitscreen > 1)
|
||||
boxw = max(64, boxw/2);
|
||||
}
|
||||
#endif
|
||||
|
||||
y = chaty - offset*charheight - (chat_scroll*charheight) - boxh*charheight - 12;
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
y -= BASEVIDHEIGHT/2;
|
||||
@@ -1698,20 +1585,19 @@ static void HU_drawChatLog(INT32 offset)
|
||||
y += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
y -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
|
||||
chat_topy = y + chat_scroll*charheight;
|
||||
chat_bottomy = chat_topy + boxh*charheight;
|
||||
|
||||
V_DrawFillConsoleMap(chatx, chat_topy, boxw, boxh*charheight +2, 239|V_SNAPTOBOTTOM|V_SNAPTOLEFT); // log box
|
||||
V_DrawFillConsoleMap(chatx, chat_topy, boxw, boxh*charheight +2, 239|CHATSNAP); // log box
|
||||
|
||||
for (i = 0; i < chat_nummsg_log; i++) // iterate through our chatlog
|
||||
{
|
||||
INT32 clrflag = 0;
|
||||
INT32 j = 0;
|
||||
char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_log[i]); // get the current message, and word wrap it.
|
||||
char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), CHATSNAP|V_ALLOWLOWERCASE, chat_log[i]); // get the current message, and word wrap it.
|
||||
UINT8 *colormap = NULL;
|
||||
emote_t *emote = NULL;
|
||||
int emotelen = 0;
|
||||
@@ -1741,7 +1627,7 @@ static void HU_drawChatLog(INT32 offset)
|
||||
{
|
||||
if ((y+dy+2 >= chat_topy) && (y+dy < (chat_bottomy)))
|
||||
{
|
||||
M_DrawEmote(x+dx+2, y+dy+1, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||
M_DrawEmote(x+dx+2, y+dy+1, emote, CHATSNAP);
|
||||
dx += EMOTEWIDTH - charwidth;
|
||||
}
|
||||
j += emotelen;
|
||||
@@ -1749,7 +1635,7 @@ static void HU_drawChatLog(INT32 offset)
|
||||
else
|
||||
{
|
||||
if ((y+dy+2 >= chat_topy) && (y+dy < (chat_bottomy)))
|
||||
V_DrawChatCharacter(x + dx + 2, y+dy+2, msg[j++] |V_SNAPTOBOTTOM|V_SNAPTOLEFT, !cv_allcaps.value, colormap);
|
||||
V_DrawChatCharacter(x + dx + 2, y+dy+2, msg[j++] |CHATSNAP, !cv_allcaps.value, colormap);
|
||||
else
|
||||
j++; // don't forget to increment this or we'll get stuck in the limbo.
|
||||
}
|
||||
@@ -1786,9 +1672,9 @@ static void HU_drawChatLog(INT32 offset)
|
||||
|
||||
// draw arrows to indicate that we can (or not) scroll.
|
||||
if (chat_scroll > 0)
|
||||
V_DrawCharacter(chatx-9, ((justscrolledup) ? (chat_topy-1) : (chat_topy)), V_SNAPTOBOTTOM | V_SNAPTOLEFT | highlight | '\x1A', false); // up arrow
|
||||
V_DrawCharacter(chatx-9, ((justscrolledup) ? (chat_topy-1) : (chat_topy)), CHATSNAP | highlight | '\x1A', false); // up arrow
|
||||
if (chat_scroll < chat_maxscroll)
|
||||
V_DrawCharacter(chatx-9, chat_bottomy-((justscrolleddown) ? 5 : 6), V_SNAPTOBOTTOM | V_SNAPTOLEFT | highlight | '\x1B', false); // down arrow
|
||||
V_DrawCharacter(chatx-9, chat_bottomy-((justscrolleddown) ? 5 : 6), CHATSNAP | highlight | '\x1B', false); // down arrow
|
||||
|
||||
justscrolleddown = false;
|
||||
justscrolledup = false;
|
||||
@@ -1806,13 +1692,14 @@ static void HU_DrawChat(void)
|
||||
INT32 boxw = cv_chatwidth.value;
|
||||
INT32 t = 0, c = 0, y = chaty - (typelines*charheight);
|
||||
UINT32 i = 0, saylen = strlen(w_chat_buf); // You learn new things everyday!
|
||||
UINT32 charcount = 0;
|
||||
INT32 cflag = 0;
|
||||
INT32 pm_offset = 0; // for cases when you type emote while also doing /pm
|
||||
size_t select_start = 0, select_end = 0;
|
||||
const char *ntalk = "Say: ", *ttalk = "Team: ";
|
||||
const char *talk = ntalk;
|
||||
const char *mute = "Chat has been muted.";
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
y -= BASEVIDHEIGHT/2;
|
||||
@@ -1823,7 +1710,6 @@ static void HU_DrawChat(void)
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
y -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
if (teamtalk)
|
||||
@@ -1838,7 +1724,7 @@ static void HU_DrawChat(void)
|
||||
cflag = V_GRAYMAP; // set text in gray if chat is muted.
|
||||
}
|
||||
|
||||
V_DrawFillConsoleMap(chatx, y-1, boxw, (typelines*charheight), 239 | V_SNAPTOBOTTOM | V_SNAPTOLEFT);
|
||||
V_DrawFillConsoleMap(chatx, y-1, boxw, (typelines*charheight), 239 | CHATSNAP);
|
||||
|
||||
while (talk[i])
|
||||
{
|
||||
@@ -1846,7 +1732,7 @@ static void HU_DrawChat(void)
|
||||
++i;
|
||||
else
|
||||
{
|
||||
V_DrawChatCharacter(chatx + c + 2, y, talk[i] |V_SNAPTOBOTTOM|V_SNAPTOLEFT|cflag, !cv_allcaps.value, V_GetStringColormap(talk[i]|cflag));
|
||||
V_DrawChatCharacter(chatx + c + 2, y, talk[i] |CHATSNAP|cflag, !cv_allcaps.value, V_GetStringColormap(talk[i]|cflag));
|
||||
i++;
|
||||
}
|
||||
|
||||
@@ -1864,7 +1750,7 @@ static void HU_DrawChat(void)
|
||||
typelines = 1;
|
||||
|
||||
if ((w_chat.cursor == 0 || w_chat.length == 0) && hu_tick < 4)
|
||||
V_DrawChatCharacter(chatx+2+c, y+1, '_'|V_SNAPTOBOTTOM|V_SNAPTOLEFT|t, !cv_allcaps.value, NULL);
|
||||
V_DrawChatCharacter(chatx+2+c, y+1, '_'|CHATSNAP|t, !cv_allcaps.value, NULL);
|
||||
|
||||
if (w_chat.select != w_chat.cursor)
|
||||
{
|
||||
@@ -1881,17 +1767,23 @@ static void HU_DrawChat(void)
|
||||
|
||||
if ((emote = M_VerifyEmote(w_chat_buf+i, &emotelen)))
|
||||
{
|
||||
M_DrawEmote(chatx + c + 2, y-1, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT|t);
|
||||
M_DrawEmote(chatx + c + 2, y-1, emote, CHATSNAP|t);
|
||||
c += EMOTEWIDTH - charwidth;
|
||||
i += emotelen-1;
|
||||
drawwidth = EMOTEWIDTH;
|
||||
if (cv_chat_showlimit.value)
|
||||
charcount += emotelen;
|
||||
}
|
||||
else if (w_chat_buf[i] >= HU_FONTSTART) //Hurdler: isn't it better like that?
|
||||
V_DrawChatCharacter(chatx + c + 2, y, w_chat_buf[i] | V_SNAPTOBOTTOM|V_SNAPTOLEFT | t, !cv_allcaps.value, NULL);
|
||||
{
|
||||
V_DrawChatCharacter(chatx + c + 2, y, w_chat_buf[i] | CHATSNAP | t, !cv_allcaps.value, NULL);
|
||||
if (cv_chat_showlimit.value)
|
||||
charcount++;
|
||||
}
|
||||
|
||||
// Draw selection
|
||||
if (i >= select_start && i < select_end)
|
||||
V_DrawFill(chatx + c + 2 - (drawwidth-charwidth), y-1, drawwidth, charheight, 103|V_TRANSLUCENT|V_SNAPTOBOTTOM|V_SNAPTOLEFT|t);
|
||||
V_DrawFill(chatx + c + 2 - (drawwidth-charwidth), y-1, drawwidth, charheight, 103|V_TRANSLUCENT|CHATSNAP|t);
|
||||
|
||||
++i;
|
||||
|
||||
@@ -1900,7 +1792,7 @@ static void HU_DrawChat(void)
|
||||
INT32 cursorx = (c+charwidth < boxw-charwidth) ? (chatx + 2 + c+charwidth) : (chatx+1); // we may have to go down.
|
||||
INT32 cursory = (cursorx != chatx+1) ? (y) : (y+charheight);
|
||||
if (hu_tick < 4)
|
||||
V_DrawChatCharacter(cursorx, cursory+1, '_' |V_SNAPTOBOTTOM|V_SNAPTOLEFT|t, !cv_allcaps.value, NULL);
|
||||
V_DrawChatCharacter(cursorx, cursory+1, '_' |CHATSNAP|t, !cv_allcaps.value, NULL);
|
||||
|
||||
if (cursorx == chatx+1 && saylen == i-1) // a weirdo hack
|
||||
{
|
||||
@@ -1918,62 +1810,11 @@ static void HU_DrawChat(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (emote_autocomplete.emotestart != -1 && (emote_autocomplete.complete[0] || (w_chat.cursor - emote_autocomplete.emotestart) > 1))
|
||||
if (cv_chat_showlimit.value)
|
||||
{
|
||||
emote_t *suggest;
|
||||
int skip = 0;
|
||||
|
||||
const char *complete;
|
||||
int complete_len;
|
||||
|
||||
if (emote_autocomplete.complete[0])
|
||||
{
|
||||
complete = emote_autocomplete.complete;
|
||||
complete_len = strlen(complete);
|
||||
}
|
||||
else
|
||||
{
|
||||
complete = &w_chat_buf[emote_autocomplete.emotestart];
|
||||
complete_len = w_chat.cursor - emote_autocomplete.emotestart;
|
||||
}
|
||||
|
||||
// A bit of copy-paste from /pm code :p
|
||||
INT32 suggesty = chaty - charheight - 1;
|
||||
size_t longest_suggestion_length = 0;
|
||||
|
||||
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
||||
{
|
||||
longest_suggestion_length = max(longest_suggestion_length, strlen(suggest->name));
|
||||
++skip;
|
||||
}
|
||||
|
||||
skip = 0;
|
||||
|
||||
#ifdef NETSPLITSCREEN
|
||||
if (splitscreen)
|
||||
{
|
||||
suggesty -= BASEVIDHEIGHT/2;
|
||||
if (splitscreen > 1)
|
||||
suggesty += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
suggesty -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
||||
{
|
||||
V_DrawFillConsoleMap(chatx + boxw + 2, suggesty - (7*skip), (longest_suggestion_length+2)*4 + EMOTEWIDTH, 6, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||
|
||||
// Highlight currently suggested emote
|
||||
int hlflag = 0;
|
||||
if (skip == emote_autocomplete.skip && emote_autocomplete.complete[0])
|
||||
hlflag = V_YELLOWMAP;
|
||||
|
||||
V_DrawSmallString(chatx + boxw + 4 + EMOTEWIDTH, suggesty - (7*skip), hlflag|V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, va(":%s:", suggest->name));
|
||||
M_DrawEmote(chatx + boxw + 2, suggesty - skip*7, suggest, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||
|
||||
++skip;
|
||||
}
|
||||
// Limit
|
||||
const INT32 clr = ((HU_MAXMSGLEN - charcount) > 64 ? V_TRANSLUCENT : (charcount == HU_MAXMSGLEN ? V_REDMAP : V_YELLOWMAP));
|
||||
V_DrawSmallString(chatx, y+7, CHATSNAP|clr, va("%d/%d", charcount, HU_MAXMSGLEN));
|
||||
}
|
||||
|
||||
// handle /pm list. It's messy, horrible and I don't care.
|
||||
@@ -1982,7 +1823,7 @@ static void HU_DrawChat(void)
|
||||
INT32 count = 0;
|
||||
INT32 p_dispy = chaty - charheight - 1;
|
||||
size_t longest_name_length = 0;
|
||||
#ifdef NETSPLITSCREEN
|
||||
|
||||
if (splitscreen)
|
||||
{
|
||||
p_dispy -= BASEVIDHEIGHT/2;
|
||||
@@ -1990,13 +1831,13 @@ static void HU_DrawChat(void)
|
||||
p_dispy += 16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
p_dispy -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
// Find longest player name, for drawing background for /pm list later
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (!playeringame[i]) continue;
|
||||
if (!playeringame[i])
|
||||
continue;
|
||||
|
||||
longest_name_length = max(longest_name_length, strlen(player_names[i]));
|
||||
}
|
||||
@@ -2011,6 +1852,7 @@ static void HU_DrawChat(void)
|
||||
{
|
||||
char nodenum[3];
|
||||
UINT32 n;
|
||||
|
||||
// right, that's half important: (w_chat_buf[4] may be a space since /pm0 msg is perfectly acceptable!)
|
||||
if (!isdigit(w_chat_buf[3]) || !(isdigit(w_chat_buf[4]) || (w_chat_buf[4] == ' ') || (w_chat_buf[4] == 0)))
|
||||
break;
|
||||
@@ -2048,16 +1890,79 @@ static void HU_DrawChat(void)
|
||||
}
|
||||
|
||||
// fill it like the chat so the text doesn't become hard to read because of the hud.
|
||||
V_DrawFillConsoleMap(chatx + boxw + 2, p_dispy - (6*count), (longest_name_length+4)*4, 6, 239 | V_SNAPTOBOTTOM | V_SNAPTOLEFT);
|
||||
V_DrawFillConsoleMap(chatx + boxw + 2, p_dispy - (6*count), (longest_name_length+4)*4, 6, 239 | CHATSNAP);
|
||||
|
||||
V_DrawSmallString(chatx + boxw + 4, p_dispy - (6*count), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, va("\x82%d\x80 - %s", i, player_names[i]));
|
||||
V_DrawSmallString(chatx + boxw + 4, p_dispy - (6*count), CHATSNAP|V_ALLOWLOWERCASE, va("\x82%d\x80 - %s", i, player_names[i]));
|
||||
count++;
|
||||
}
|
||||
|
||||
if (count == 0) // no results.
|
||||
{
|
||||
V_DrawFillConsoleMap(chatx + boxw + 2, p_dispy - (6*count), 48, 6, 239 | V_SNAPTOBOTTOM | V_SNAPTOLEFT); // fill it like the chat so the text doesn't become hard to read because of the hud.
|
||||
V_DrawSmallString(chatx + boxw + 4, p_dispy - (6*count), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, "NO RESULT.");
|
||||
pm_offset = 48 + 2;
|
||||
V_DrawFillConsoleMap(chatx + boxw + 2, p_dispy - (6*count), 48, 6, 239 | CHATSNAP); // fill it like the chat so the text doesn't become hard to read because of the hud.
|
||||
V_DrawSmallString(chatx + boxw + 4, p_dispy - (6*count), CHATSNAP|V_ALLOWLOWERCASE, "NO RESULT.");
|
||||
}
|
||||
else
|
||||
{
|
||||
pm_offset = (longest_name_length+4)*4 + 2;
|
||||
}
|
||||
}
|
||||
|
||||
if (emote_autocomplete.emotestart != -1 && (emote_autocomplete.complete[0] || (w_chat.cursor - emote_autocomplete.emotestart) > 1))
|
||||
{
|
||||
emote_t *suggest;
|
||||
int skip = 0;
|
||||
|
||||
const char *complete;
|
||||
int complete_len;
|
||||
|
||||
if (emote_autocomplete.complete[0])
|
||||
{
|
||||
complete = emote_autocomplete.complete;
|
||||
complete_len = strlen(complete);
|
||||
}
|
||||
else
|
||||
{
|
||||
complete = &w_chat_buf[emote_autocomplete.emotestart];
|
||||
complete_len = w_chat.cursor - emote_autocomplete.emotestart;
|
||||
}
|
||||
|
||||
// A bit of copy-paste from /pm code :p
|
||||
INT32 suggesty = chaty - charheight - 1;
|
||||
size_t longest_suggestion_length = 0;
|
||||
|
||||
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
||||
{
|
||||
longest_suggestion_length = max(longest_suggestion_length, strlen(suggest->name));
|
||||
++skip;
|
||||
}
|
||||
|
||||
INT32 emote_suggest_boxw = (longest_suggestion_length+2)*4 + EMOTEWIDTH;
|
||||
|
||||
skip = 0;
|
||||
|
||||
if (splitscreen)
|
||||
{
|
||||
suggesty -= BASEVIDHEIGHT/2;
|
||||
if (splitscreen > 1)
|
||||
suggesty += 16;
|
||||
}
|
||||
else
|
||||
suggesty -= (cv_kartspeedometer.value ? 16 : 0);
|
||||
|
||||
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
||||
{
|
||||
V_DrawFillConsoleMap(chatx + boxw + pm_offset + 2, suggesty - (7*skip), emote_suggest_boxw, 6, CHATSNAP);
|
||||
|
||||
// Highlight currently suggested emote
|
||||
int hlflag = 0;
|
||||
if (skip == emote_autocomplete.skip && emote_autocomplete.complete[0])
|
||||
hlflag = V_YELLOWMAP;
|
||||
|
||||
V_DrawSmallString(chatx + boxw + pm_offset + 4 + EMOTEWIDTH, suggesty - (7*skip), hlflag|CHATSNAP|V_ALLOWLOWERCASE, va(":%s:", suggest->name));
|
||||
M_DrawEmote(chatx + boxw + pm_offset + 2, suggesty - skip*7, suggest, CHATSNAP);
|
||||
|
||||
++skip;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2069,6 +1974,7 @@ static void HU_DrawChat(void)
|
||||
static void HU_DrawChat_Old(void)
|
||||
{
|
||||
INT32 t = 0, c = 0, y = HU_INPUTY;
|
||||
UINT32 charcount = 0;
|
||||
size_t i = 0;
|
||||
const char *ntalk = "Say: ", *ttalk = "Say-Team: ";
|
||||
const char *talk = ntalk;
|
||||
@@ -2114,11 +2020,17 @@ static void HU_DrawChat_Old(void)
|
||||
{
|
||||
M_DrawScaledEmote((HU_INPUTX + c)<<FRACBITS, (y+con_scalefactor*2)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART | V_NOSCALEPATCH | t);
|
||||
i += emotelen-1;
|
||||
|
||||
if (cv_chat_showlimit.value)
|
||||
charcount += emotelen;
|
||||
}
|
||||
else if (w_chat_buf[i] >= HU_FONTSTART) //Hurdler: isn't it better like that?
|
||||
{
|
||||
//charwidth = hu_font[w_chat[i]-HU_FONTSTART]->width * con_scalefactor;
|
||||
V_DrawCharacter(HU_INPUTX + c, y, w_chat_buf[i] | cv_constextsize.value | V_NOSCALESTART | t, !cv_allcaps.value);
|
||||
|
||||
if (cv_chat_showlimit.value)
|
||||
charcount++;
|
||||
}
|
||||
|
||||
// Draw selection
|
||||
@@ -2131,7 +2043,7 @@ static void HU_DrawChat_Old(void)
|
||||
{
|
||||
INT32 cursorx = (HU_INPUTX+c+charwidth < vid.width) ? (HU_INPUTX + c + charwidth) : (HU_INPUTX); // we may have to go down.
|
||||
INT32 cursory = (cursorx != HU_INPUTX) ? (y) : (y+charheight);
|
||||
V_DrawCharacter(cursorx, cursory+2*con_scalefactor, '_' |cv_constextsize.value | V_NOSCALESTART|t, !cv_allcaps.value);
|
||||
V_DrawCharacter(cursorx, cursory+2*con_scalefactor, '_' | cv_constextsize.value | V_NOSCALESTART |t, !cv_allcaps.value);
|
||||
}
|
||||
|
||||
c += charwidth;
|
||||
@@ -2141,6 +2053,24 @@ static void HU_DrawChat_Old(void)
|
||||
y += charheight;
|
||||
}
|
||||
}
|
||||
|
||||
// console chat users are FINALLY being fed!
|
||||
if (cv_chat_showlimit.value)
|
||||
{
|
||||
const char *lim = va(" (%i/%i)", charcount, HU_MAXMSGLEN);
|
||||
for (i = 0; lim[i]; i++)
|
||||
{
|
||||
V_DrawCharacter(HU_INPUTX + c, y, lim[i] | cv_constextsize.value | V_NOSCALESTART | t, !cv_allcaps.value);
|
||||
|
||||
c += charwidth;
|
||||
if (c >= vid.width) // text wrapping
|
||||
{
|
||||
c = 0;
|
||||
y += charheight;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void HU_DrawCEcho(void)
|
||||
@@ -2361,7 +2291,22 @@ void HU_DrawSongCredits(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void HU_ForceShowChat(void)
|
||||
{
|
||||
// only matters for non console chat
|
||||
// see m_menu for how forceshowchat is set
|
||||
if (!chat_on && forceshowchat)
|
||||
{
|
||||
// only print this if theres nothing in chat already
|
||||
if (chat_nummsg_log == 0)
|
||||
{
|
||||
HU_AddChatText("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", false);
|
||||
}
|
||||
|
||||
HU_DrawChat();
|
||||
}
|
||||
}
|
||||
|
||||
// Heads up displays drawer, call each frame
|
||||
//
|
||||
void HU_Drawer(void)
|
||||
@@ -2369,6 +2314,8 @@ void HU_Drawer(void)
|
||||
if (cv_vhseffect.value && ((paused && !camera[R_GetViewNumber()].freecam) || (demo.playback && cv_playbackspeed.value > 1)))
|
||||
V_DrawVhsEffect(demo.rewinding);
|
||||
|
||||
HU_ForceShowChat();
|
||||
|
||||
// draw chat string plus cursor
|
||||
if (chat_on)
|
||||
{
|
||||
@@ -2448,8 +2395,7 @@ void HU_Drawer(void)
|
||||
// IN-LEVEL MULTIPLAYER RANKINGS
|
||||
//======================================================================
|
||||
|
||||
static int
|
||||
Ping_gfx_num (int lag)
|
||||
static int Ping_gfx_num(int lag)
|
||||
{
|
||||
if (lag < 2)
|
||||
return 0;
|
||||
@@ -2463,8 +2409,7 @@ Ping_gfx_num (int lag)
|
||||
return 4;
|
||||
}
|
||||
|
||||
static int
|
||||
Ping_gfx_color (UINT32 lag)
|
||||
static int Ping_gfx_color(UINT32 lag)
|
||||
{
|
||||
if (lag < 2)
|
||||
return SKINCOLOR_JAWZ;
|
||||
@@ -2487,8 +2432,7 @@ Ping_gfx_color (UINT32 lag)
|
||||
return SKINCOLOR_WHITE; // to make the flashing work
|
||||
}
|
||||
|
||||
static const UINT8 *
|
||||
Ping_gfx_colormap (UINT32 lag, boolean gentleman)
|
||||
static const UINT8 *Ping_gfx_colormap(UINT32 lag, boolean gentleman)
|
||||
{
|
||||
const UINT8 *colormap = NULL;
|
||||
|
||||
@@ -2508,8 +2452,7 @@ Ping_gfx_colormap (UINT32 lag, boolean gentleman)
|
||||
return colormap;
|
||||
}
|
||||
|
||||
static UINT32
|
||||
Ping_conversion (UINT32 lag)
|
||||
static UINT32 Ping_conversion(UINT32 lag)
|
||||
{
|
||||
if (cv_pingmeasurement.value)
|
||||
{
|
||||
@@ -2626,6 +2569,26 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags)
|
||||
}
|
||||
}
|
||||
|
||||
void HU_drawLocalPlayerPing(INT32 x, INT32 y, INT32 flags)
|
||||
{
|
||||
UINT32 lag = localplayerping;
|
||||
const boolean gentleman = (cv_mindelay.value && (lag < (tic_t)simulated_lag));
|
||||
|
||||
if (gentleman)
|
||||
{
|
||||
lag = simulated_lag;
|
||||
}
|
||||
|
||||
if (cv_pingstyle.value == 0) // kart
|
||||
{
|
||||
HU_drawKartPing(x, y, lag, flags, gentleman);
|
||||
}
|
||||
else if (cv_pingstyle.value == 1) // old style ping
|
||||
{
|
||||
HU_drawOldPing(x, y, lag, flags, gentleman);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// HU_DrawSpectatorTicker
|
||||
//
|
||||
|
||||
+5
-18
@@ -42,15 +42,6 @@
|
||||
#define CRED_FONTEND 'Z' // the last font character
|
||||
#define CRED_FONTSIZE (CRED_FONTEND - CRED_FONTSTART + 1)
|
||||
|
||||
extern char *shiftxform; // english translation shift table
|
||||
extern char english_shiftxform[];
|
||||
|
||||
extern char french_shiftxform[];
|
||||
extern char french_altgrxform[];
|
||||
|
||||
//fallback for special letter non displayable in the game (i.e.: 'é','à',etc.)
|
||||
INT32 HU_FallBackFrSpecialLetter(INT32 key);
|
||||
|
||||
//------------------------------------
|
||||
// sorted player lines
|
||||
//------------------------------------
|
||||
@@ -68,12 +59,7 @@ typedef struct
|
||||
#define HU_MAXMSGLEN 223
|
||||
#define HU_MSGBUFSIZE 255
|
||||
#define MAX_CHAT_BUFSIZE 256 // that's enough messages, right? We'll delete the older ones when that gets out of hand.
|
||||
#define NETSPLITSCREEN // why the hell WOULDN'T we want this?
|
||||
#ifdef NETSPLITSCREEN
|
||||
#define OLDCHAT (cv_consolechat.value == 1 || dedicated || vid.width < 640)
|
||||
#else
|
||||
#define OLDCHAT (cv_consolechat.value == 1 || dedicated || vid.width < 640)
|
||||
#endif
|
||||
#define CHAT_MUTE (cv_mute.value && !(server || IsPlayerAdmin(consoleplayer))) // this still allows to open the chat but not to type. That's used for scrolling and whatnot.
|
||||
#define OLD_MUTE (OLDCHAT && cv_mute.value && !(server || IsPlayerAdmin(consoleplayer))) // this is used to prevent oldchat from opening when muted.
|
||||
|
||||
@@ -102,6 +88,10 @@ extern patch_t *tallminus;
|
||||
// set true whenever the tab rankings are being shown for any reason
|
||||
extern boolean hu_showscores;
|
||||
|
||||
extern consvar_t cv_chat_xoffset;
|
||||
extern consvar_t cv_chat_yoffset;
|
||||
extern consvar_t cv_chat_showlimit;
|
||||
|
||||
// init heads up data at game startup.
|
||||
void HU_Init(void);
|
||||
|
||||
@@ -110,8 +100,6 @@ void HU_LoadGraphics(void);
|
||||
// reset heads up when consoleplayer respawns.
|
||||
void HU_Start(void);
|
||||
|
||||
void HU_Shiftform(void);
|
||||
|
||||
boolean HU_Responder(event_t *ev);
|
||||
void HU_Ticker(void);
|
||||
void HU_TickSongCredits(void);
|
||||
@@ -120,8 +108,7 @@ void HU_Drawer(void);
|
||||
char HU_dequeueChatChar(void);
|
||||
void HU_clearChatChars(void);
|
||||
void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags); // Lat': Ping drawer for scoreboard.
|
||||
//void HU_DrawTeamTabRankings(playersort_t *tab, INT32 whiteplayer);
|
||||
//void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer);
|
||||
void HU_drawLocalPlayerPing(INT32 x, INT32 y, INT32 flags);
|
||||
void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 hilicol);
|
||||
void HU_DrawEmeralds(INT32 x, INT32 y, INT32 pemeralds);
|
||||
const char *HU_SkinColorToConsoleColor(skincolors_t color);
|
||||
|
||||
+1
-22
@@ -36,28 +36,7 @@ extern "C" {
|
||||
"JOYBUTTONS is greater than INT64 bits can hold"
|
||||
#endif
|
||||
|
||||
/** \brief The struct JoyType_s
|
||||
|
||||
share some joystick information (maybe 2 for splitscreen), to the game input code,
|
||||
actually, we need to know if it is a gamepad or analog controls
|
||||
*/
|
||||
|
||||
struct JoyType_s
|
||||
{
|
||||
/*! if true, we MUST Poll() to get new joystick data,
|
||||
that is: we NEED the DIRECTINPUTDEVICE2 ! (watchout NT compatibility) */
|
||||
INT32 bJoyNeedPoll;
|
||||
/*! this joystick is a gamepad, read: digital axes
|
||||
if FALSE, interpret the joystick event data as JOYAXISRANGE (see above) */
|
||||
INT32 bGamepadStyle;
|
||||
|
||||
};
|
||||
typedef struct JoyType_s JoyType_t;
|
||||
/** \brief Joystick info
|
||||
for palyer[sic] 1-4's joystick/gamepad
|
||||
*/
|
||||
|
||||
extern JoyType_t Joystick[MAXSPLITSCREENPLAYERS];
|
||||
#define DigitalGamepadStyle(i) (cv_joyscale[i].value == 0)
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
|
||||
+15
-1
@@ -43,7 +43,7 @@ extern UINT8 graphics_started;
|
||||
extern UINT8 keyboard_started;
|
||||
|
||||
/** \brief Set to true when inside a signal handler that will exit the program. */
|
||||
extern boolean g_in_exiting_signal_handler;
|
||||
boolean I_In_Exiting_Signal_Handler(void);
|
||||
|
||||
/** \brief The I_GetFreeMem function
|
||||
|
||||
@@ -148,6 +148,11 @@ extern INT32 numcontrollers;
|
||||
*/
|
||||
const char *I_GetJoyName(INT32 joyindex);
|
||||
|
||||
void I_SetJoystickFocus(void);
|
||||
|
||||
boolean I_GamepadHasLED(INT32 playernum);
|
||||
boolean I_GamepadHasRumble(INT32 playernum);
|
||||
|
||||
void I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration);
|
||||
void I_SetGamepadIndicatorColor(INT32 playernum, UINT8 red, UINT8 green, UINT8 blue);
|
||||
|
||||
@@ -195,6 +200,15 @@ INT32 I_StartupSystem(void);
|
||||
*/
|
||||
void I_ShutdownSystem(void);
|
||||
|
||||
/** \brief To check if a Interrupt or Terminate Signal was fired
|
||||
*/
|
||||
boolean I_Interrupted(void);
|
||||
static inline void I_HandleInterrupt(void)
|
||||
{
|
||||
if (I_Interrupted())
|
||||
I_Quit();
|
||||
}
|
||||
|
||||
/** \brief The I_GetDiskFreeSpace function
|
||||
|
||||
\param freespace a INT64 pointer to hold the free space amount
|
||||
|
||||
+12
-7
@@ -392,6 +392,9 @@ static const char *SOCK_GetNodeAddress(INT32 node)
|
||||
if (node == 0)
|
||||
return "self";
|
||||
|
||||
if (node < 0 || node > MAXNETNODES)
|
||||
return NULL;
|
||||
|
||||
if (!nodeconnected[node])
|
||||
return NULL;
|
||||
|
||||
@@ -496,8 +499,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 +512,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 +819,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 +1439,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 +1484,7 @@ static boolean SOCK_Ban(INT32 node)
|
||||
{
|
||||
INT32 ban;
|
||||
|
||||
if (node > MAXNETNODES)
|
||||
if (node < 0 || node > MAXNETNODES)
|
||||
return false;
|
||||
|
||||
ban = numbans;
|
||||
|
||||
@@ -452,7 +452,11 @@ void A_SpawnFreshCopy(void *actor);
|
||||
extern boolean actionsoverridden[NUMACTIONS];
|
||||
|
||||
// ratio of states to sprites to mobj types is roughly 6 : 1 : 1
|
||||
#ifdef COMPAT_VANILLA
|
||||
#define NUMMOBJFREESLOTS 1024
|
||||
#else
|
||||
#define NUMMOBJFREESLOTS 4096 // should be sufficient
|
||||
#endif
|
||||
#define NUMSPRITEFREESLOTS NUMMOBJFREESLOTS
|
||||
#define NUMSTATEFREESLOTS (NUMMOBJFREESLOTS*8)
|
||||
|
||||
|
||||
@@ -446,6 +446,12 @@ void K_UpdateDirector(void)
|
||||
}
|
||||
}
|
||||
|
||||
// not sure if we should just stop here?
|
||||
if (targetposition == MAXPLAYERS)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
target = directorinfo.sortedplayers[targetposition];
|
||||
|
||||
// stop here since we're already viewing this player
|
||||
|
||||
+176
-196
@@ -83,6 +83,7 @@ IMPL_HUD_OFFSET(stat); // Stats
|
||||
|
||||
// extra hud things
|
||||
consvar_t cv_showstats = {"showstats", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_showstats_skinname = {"showstats_skinname", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_highresportrait = {"highresportrait", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // make char potraits use their high-res version instead
|
||||
|
||||
@@ -92,10 +93,13 @@ consvar_t cv_showinput = {"showinput", "Off", CV_SAVE, inputdisplay_cons_t, NULL
|
||||
static CV_PossibleValue_t minihead_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "Others"}, {0, NULL}};
|
||||
consvar_t cv_minihead = {"smallminimapplayers", "Off", CV_SAVE, minihead_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_showminimapnames = {"showminimapnames", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_showminimapfinished = {"showminimapfinished", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
CV_PossibleValue_t minimapdot_cons_t[NUMMINIMAPDOTSTUFF];
|
||||
consvar_t cv_showminimapangle = {"showminimapangle", "Off", CV_SAVE, minimapdot_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_spinoutroll = {"spinoutroll", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
static CV_PossibleValue_t posanim_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "Smooth"}, {0, NULL}};
|
||||
consvar_t cv_posanim = {"postitionanimation", "On", CV_SAVE, posanim_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_smallposnum = {"smallpositionnumber", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
@@ -108,6 +112,11 @@ consvar_t cv_fancyroulette = {"animatedroulette", "Off", CV_SAVE, CV_OnOff, NULL
|
||||
consvar_t cv_darkitembox = {"darkitembox", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // itembox gets a dark border with specific items
|
||||
consvar_t cv_multiitemicon = {"multiitemicon", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
enum { ROULETTECOLOR_NONE = -1, ROULETTECOLOR_HUD, ROULETTECOLOR_PLAYER, ROULETTECOLOR_ITEM };
|
||||
static CV_PossibleValue_t roulettecolor_cons_t[] = {
|
||||
{ROULETTECOLOR_NONE, "None"}, {ROULETTECOLOR_HUD, "Hud"}, {ROULETTECOLOR_PLAYER, "Player"}, {ROULETTECOLOR_ITEM, "Item"}, {0, NULL}};
|
||||
consvar_t cv_roulettecolor = {"roulettecolor", "Hud", CV_SAVE, roulettecolor_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_showlaptimes = {"showlaptimes", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_biglaps = {"biglaphud", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // here for ppl who dont want to make 2 more patches for their custom hud
|
||||
@@ -207,6 +216,7 @@ void K_RegisterKartHudStuff(void)
|
||||
CV_RegisterVar(&cv_kartspeedometer);
|
||||
|
||||
CV_RegisterVar(&cv_showstats);
|
||||
CV_RegisterVar(&cv_showstats_skinname);
|
||||
CV_RegisterVar(&cv_showinput);
|
||||
|
||||
CV_RegisterVar(&cv_posanim);
|
||||
@@ -221,7 +231,9 @@ void K_RegisterKartHudStuff(void)
|
||||
|
||||
CV_RegisterVar(&cv_minihead);
|
||||
CV_RegisterVar(&cv_showminimapnames);
|
||||
CV_RegisterVar(&cv_showminimapfinished);
|
||||
CV_RegisterVar(&cv_showminimapangle);
|
||||
CV_RegisterVar(&cv_spinoutroll);
|
||||
|
||||
CV_RegisterVar(&cv_showlapemblem);
|
||||
|
||||
@@ -239,6 +251,8 @@ void K_RegisterKartHudStuff(void)
|
||||
CV_RegisterVar(&cv_multiitemicon);
|
||||
CV_RegisterVar(&cv_huditemamount);
|
||||
|
||||
CV_RegisterVar(&cv_roulettecolor);
|
||||
|
||||
CV_RegisterVar(&cv_highresportrait);
|
||||
|
||||
CV_RegisterVar(&cv_nametag);
|
||||
@@ -270,7 +284,6 @@ void K_RegisterKartHudStuff(void)
|
||||
|
||||
// Smol speedo
|
||||
static patch_t *skp_smallsticker = NULL;
|
||||
static patch_t *skp_smallsticker3 = NULL;
|
||||
|
||||
static patch_t *skp_speedpatches[5] = {NULL};
|
||||
|
||||
@@ -308,7 +321,6 @@ static patch_t *kp_bumperstickerwideclr = NULL;
|
||||
static patch_t *kp_karmastickerclr = NULL;
|
||||
static patch_t *kp_timeoutstickerclr = NULL;
|
||||
static patch_t *skp_smallstickerclr = NULL;
|
||||
static patch_t *skp_smallstickerclr3 = NULL;
|
||||
static patch_t *kp_itemmulstickerclr[2] = {NULL};
|
||||
static patch_t *kp_itembgclr[4] = {NULL};
|
||||
|
||||
@@ -474,11 +486,6 @@ static void K_LoadSaturnHUDGraphics(void)
|
||||
skp_smallstickerclr = (patch_t *)W_CachePatchName("SC_SMSTC", PU_HUDGFX);
|
||||
}
|
||||
|
||||
if (xtra_speedo_clr3)
|
||||
{
|
||||
skp_smallstickerclr3 = (patch_t *)W_CachePatchName("SC_SM3TC", PU_HUDGFX);
|
||||
}
|
||||
|
||||
if (achi_speedo_clr)
|
||||
{
|
||||
skp_smallstickerachiclr = (patch_t *)W_CachePatchName("SC_AMSTC", PU_HUDGFX);
|
||||
@@ -533,14 +540,6 @@ static void K_LoadSaturnHUDGraphics(void)
|
||||
kp_itemmulstickerclr[0] = (patch_t *)W_CachePatchName("K_ITMULC", PU_HUDGFX);
|
||||
}
|
||||
}
|
||||
|
||||
if (found_extra3_kart)
|
||||
{
|
||||
if (xtra_speedo3) // 80x11 patch scaled to size
|
||||
{
|
||||
skp_smallsticker3 = (patch_t *)W_CachePatchName("SP_SM3TC", PU_HUDGFX);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -- Kart patches --
|
||||
@@ -875,7 +874,7 @@ void K_LoadKartHUDGraphics(void)
|
||||
|
||||
kp_yougotem = (patch_t *)W_CachePatchName("YOUGOTEM", PU_HUDGFX);
|
||||
|
||||
if (found_extra_kart || found_extra2_kart || found_extra3_kart)
|
||||
if (found_extra_kart || found_extra2_kart)
|
||||
K_LoadSaturnHUDGraphics();
|
||||
}
|
||||
|
||||
@@ -931,21 +930,21 @@ const char *K_GetItemPatch(UINT8 item, boolean tiny)
|
||||
|
||||
//}
|
||||
|
||||
INT32 ITEM_X, ITEM_Y; // Item Window
|
||||
INT32 TIME_X, TIME_Y; // Time Sticker
|
||||
INT32 LAPS_X, LAPS_Y; // Lap Sticker
|
||||
INT32 SPDM_X, SPDM_Y; // Speedometer
|
||||
INT32 POSI_X, POSI_Y; // Position Number
|
||||
INT32 FACE_X, FACE_Y; // Top-four Faces
|
||||
INT32 STCD_X, STCD_Y; // Starting countdown
|
||||
INT32 CHEK_Y; // CHECK graphic
|
||||
INT32 MINI_X, MINI_Y; // Minimap
|
||||
INT32 WANT_X, WANT_Y; // Battle WANTED poster
|
||||
static INT32 ITEM_X, ITEM_Y; // Item Window
|
||||
static INT32 TIME_X, TIME_Y; // Time Sticker
|
||||
static INT32 LAPS_X, LAPS_Y; // Lap Sticker
|
||||
static INT32 SPDM_X, SPDM_Y; // Speedometer
|
||||
static INT32 POSI_X, POSI_Y; // Position Number
|
||||
static INT32 FACE_X, FACE_Y; // Top-four Faces
|
||||
static INT32 STCD_X, STCD_Y; // Starting countdown
|
||||
static INT32 CHEK_Y; // CHECK graphic
|
||||
static INT32 MINI_X, MINI_Y; // Minimap
|
||||
static INT32 WANT_X, WANT_Y; // Battle WANTED poster
|
||||
|
||||
// This is for the P2 and P4 side of splitscreen. Then we'll flip P1's and P2's to the bottom with V_SPLITSCREEN.
|
||||
INT32 ITEM2_X, ITEM2_Y;
|
||||
INT32 LAPS2_X, LAPS2_Y;
|
||||
INT32 POSI2_X, POSI2_Y;
|
||||
static INT32 ITEM2_X, ITEM2_Y;
|
||||
static INT32 LAPS2_X, LAPS2_Y;
|
||||
static INT32 POSI2_X, POSI2_Y;
|
||||
|
||||
static void K_initKartHUD(void)
|
||||
{
|
||||
@@ -1145,10 +1144,9 @@ enum
|
||||
SPEEDO_DIAL,
|
||||
SPEEDO_PMETER,
|
||||
SPEEDO_PMETERSMOL,
|
||||
SPEEDO_EXTRA3,
|
||||
};
|
||||
|
||||
static SINT8 K_GetSpeedometerStyle(void)
|
||||
static UINT8 K_GetSpeedometerStyle(void)
|
||||
{
|
||||
if (cv_newspeedometer.value == 2 && xtra_speedo)
|
||||
return SPEEDO_EXTRA;
|
||||
@@ -1160,8 +1158,6 @@ static SINT8 K_GetSpeedometerStyle(void)
|
||||
return SPEEDO_PMETER;
|
||||
else if (cv_newspeedometer.value == 6 && kartz_speedo_smol)
|
||||
return SPEEDO_PMETERSMOL;
|
||||
else if (cv_newspeedometer.value == 7 && xtra_speedo3)
|
||||
return SPEEDO_EXTRA3;
|
||||
else
|
||||
return SPEEDO_VANILLA;
|
||||
}
|
||||
@@ -1179,8 +1175,6 @@ static boolean K_UseColorSpeedo(int speedostyle)
|
||||
return achi_speedo_clr;
|
||||
case SPEEDO_DIAL:
|
||||
return dial_speedo_clr;
|
||||
case SPEEDO_EXTRA3:
|
||||
return xtra_speedo_clr3;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@@ -1192,7 +1186,6 @@ enum
|
||||
GAUGE_SMALL,
|
||||
GAUGE_BIGNUM,
|
||||
GAUGE_NUMONLY,
|
||||
GAUGE_EXTRA,
|
||||
};
|
||||
|
||||
static SINT8 K_GetDriftgaugeStyle(void)
|
||||
@@ -1205,8 +1198,6 @@ static SINT8 K_GetDriftgaugeStyle(void)
|
||||
return GAUGE_SMALL;
|
||||
else if (cv_driftgaugestyle.value == 3)
|
||||
return GAUGE_BIGNUM;
|
||||
else if (cv_driftgaugestyle.value == 5 && xtra_speedo3)
|
||||
return GAUGE_EXTRA;
|
||||
}
|
||||
|
||||
// Fallback
|
||||
@@ -1358,10 +1349,12 @@ INT32 K_getMinimapTrans(void)
|
||||
return -1;
|
||||
|
||||
if (timeinmap <= 113)
|
||||
{
|
||||
minimaptrans = ((((INT32)timeinmap) - 105)*minimaptrans)/(113-105);
|
||||
|
||||
if (!minimaptrans)
|
||||
return -1;
|
||||
if (!minimaptrans)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return (10-minimaptrans)<<FF_TRANSSHIFT;
|
||||
}
|
||||
@@ -1403,7 +1396,6 @@ static void K_drawKartStats(void)
|
||||
{
|
||||
case SPEEDO_EXTRA:
|
||||
case SPEEDO_ACHII:
|
||||
case SPEEDO_EXTRA3:
|
||||
spdoffset = -10;
|
||||
break;
|
||||
case SPEEDO_DIAL:
|
||||
@@ -1415,8 +1407,6 @@ static void K_drawKartStats(void)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
spdoffset = 0;
|
||||
|
||||
if (G_BattleGametype() && ((speedostyle != SPEEDO_DIAL) || splitscreen))
|
||||
spdoffset += ((stplyr->kartstuff[k_bumper] ? -5 : -8));
|
||||
@@ -1436,13 +1426,16 @@ static void K_drawKartStats(void)
|
||||
fakeskin = K_GetPlayerSkin(stplyr);
|
||||
|
||||
// Skin name
|
||||
if (K_IsHighResolution()) // V_DrawSmallString becomes a mess at low resolutions lel
|
||||
if (cv_showstats_skinname.value)
|
||||
{
|
||||
V_DrawSmallString(x+20, y+12, flags2, fakeskin->realname);
|
||||
}
|
||||
else
|
||||
{
|
||||
V_DrawThinString(x+20, y+7, flags2, fakeskin->realname);
|
||||
if (K_IsHighResolution()) // V_DrawSmallString becomes a mess at low resolutions lel
|
||||
{
|
||||
V_DrawSmallString(x+20, y+12, flags2, fakeskin->realname);
|
||||
}
|
||||
else
|
||||
{
|
||||
V_DrawThinString(x+20, y+7, flags2, fakeskin->realname);
|
||||
}
|
||||
}
|
||||
|
||||
// Icon and stats
|
||||
@@ -1524,74 +1517,77 @@ static void K_drawKartItem(void)
|
||||
|
||||
if (stplyr->kartstuff[k_itemroulette])
|
||||
{
|
||||
localcolor = K_GetHudColor();
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_PLAYER)
|
||||
localcolor = stplyr->skincolor;
|
||||
else if (cv_roulettecolor.value != ROULETTECOLOR_NONE)
|
||||
localcolor = K_GetHudColor();
|
||||
|
||||
switch ((stplyr->kartstuff[k_itemroulette] % (14*3)) / 3)
|
||||
{
|
||||
// Each case is handled in threes, to give three frames of in-game time to see the item on the roulette
|
||||
case 0: // Sneaker
|
||||
localpatch = kp_sneaker[offset];
|
||||
//localcolor = SKINCOLOR_RASPBERRY;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_RASPBERRY;
|
||||
break;
|
||||
case 1: // Banana
|
||||
localpatch = kp_banana[offset];
|
||||
//localcolor = SKINCOLOR_YELLOW;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_YELLOW;
|
||||
break;
|
||||
case 2: // Orbinaut
|
||||
localpatch = kp_orbinaut[3+offset];
|
||||
//localcolor = SKINCOLOR_STEEL;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_STEEL;
|
||||
break;
|
||||
case 3: // Mine
|
||||
localpatch = kp_mine[offset];
|
||||
//localcolor = SKINCOLOR_JET;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_JET;
|
||||
break;
|
||||
case 4: // Grow
|
||||
localpatch = kp_grow[offset];
|
||||
//localcolor = SKINCOLOR_TEAL;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_TEAL;
|
||||
break;
|
||||
case 5: // Hyudoro
|
||||
localpatch = kp_hyudoro[offset];
|
||||
//localcolor = SKINCOLOR_STEEL;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_STEEL;
|
||||
break;
|
||||
case 6: // Rocket Sneaker
|
||||
localpatch = kp_rocketsneaker[offset];
|
||||
//localcolor = SKINCOLOR_TANGERINE;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_TANGERINE;
|
||||
break;
|
||||
case 7: // Jawz
|
||||
localpatch = kp_jawz[offset];
|
||||
//localcolor = SKINCOLOR_JAWZ;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_JAWZ;
|
||||
break;
|
||||
case 8: // Self-Propelled Bomb
|
||||
localpatch = kp_selfpropelledbomb[offset];
|
||||
//localcolor = SKINCOLOR_JET;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_JET;
|
||||
break;
|
||||
case 9: // Shrink
|
||||
localpatch = kp_shrink[offset];
|
||||
//localcolor = SKINCOLOR_ORANGE;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_ORANGE;
|
||||
break;
|
||||
case 10: // Invincibility
|
||||
localpatch = localinv;
|
||||
//localcolor = SKINCOLOR_GREY;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_GREY;
|
||||
break;
|
||||
case 11: // Eggman Monitor
|
||||
localpatch = kp_eggman[offset];
|
||||
//localcolor = SKINCOLOR_ROSE;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_ROSE;
|
||||
break;
|
||||
case 12: // Ballhog
|
||||
localpatch = kp_ballhog[offset];
|
||||
//localcolor = SKINCOLOR_LILAC;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_LILAC;
|
||||
break;
|
||||
case 13: // Thunder Shield
|
||||
localpatch = kp_thundershield[offset];
|
||||
//localcolor = SKINCOLOR_CYAN;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_CYAN;
|
||||
break;
|
||||
/*case 14: // Pogo Spring
|
||||
localpatch = kp_pogospring[offset];
|
||||
localcolor = SKINCOLOR_TANGERINE;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_TANGERINE;
|
||||
break;
|
||||
case 15: // Kitchen Sink
|
||||
localpatch = kp_kitchensink[offset];
|
||||
localcolor = SKINCOLOR_STEEL;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_STEEL;
|
||||
break;*/
|
||||
default:
|
||||
break;
|
||||
@@ -2096,7 +2092,7 @@ static void K_DrawKartPositionNum(INT32 num)
|
||||
fy = POSI_Y;
|
||||
fflags = V_SNAPTOLEFT|((stplyrnum == 2) ? V_SPLITSCREEN|V_SNAPTOBOTTOM : 0); // flip P3 to the bottom.
|
||||
flipdraw = true;
|
||||
if (num && num >= 10)
|
||||
if (num >= 10)
|
||||
fx += W; // this seems dumb, but we need to do this in order for positions above 10 going off screen.
|
||||
}
|
||||
else // else, that means we're P2 or P4.
|
||||
@@ -2178,8 +2174,9 @@ static boolean K_drawKartPositionFaces(void)
|
||||
UINT8 *colormap;
|
||||
|
||||
ranklines = 0;
|
||||
memset(completed, 0, sizeof (completed));
|
||||
memset(rankplayer, 0, sizeof (rankplayer));
|
||||
|
||||
if (!LUA_HudEnabled(hud_minirankings))
|
||||
return false; // Don't proceed but still return true for free play above if HUD is disabled.
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
@@ -2194,8 +2191,7 @@ static boolean K_drawKartPositionFaces(void)
|
||||
if (numplayersingame <= 1)
|
||||
return true;
|
||||
|
||||
if (!LUA_HudEnabled(hud_minirankings))
|
||||
return false; // Don't proceed but still return true for free play above if HUD is disabled.
|
||||
memset(completed, 0, sizeof (completed));
|
||||
|
||||
for (j = 0; j < numplayersingame; j++)
|
||||
{
|
||||
@@ -2252,6 +2248,7 @@ static boolean K_drawKartPositionFaces(void)
|
||||
|
||||
if (!playeringame[rankplayer[i]])
|
||||
continue;
|
||||
|
||||
if (player->spectator || !player->mo)
|
||||
continue;
|
||||
|
||||
@@ -2429,7 +2426,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
||||
|
||||
static boolean K_BigLap(void)
|
||||
{
|
||||
return (cv_biglaps.value && (cv_numlaps.value > 9) && (K_UseColorHud() ? big_lap_color : big_lap) && (!stplyr->exiting));
|
||||
return (cv_biglaps.value && (cv_numlaps.value > 9) && !stplyr->exiting && (K_UseColorHud() ? big_lap_color : big_lap));
|
||||
}
|
||||
|
||||
static void K_drawKartLaps(void)
|
||||
@@ -2638,7 +2635,7 @@ static void K_drawKartSpeedometer(void)
|
||||
return;
|
||||
|
||||
// index 0 is the raw value, index 1 is the converted value
|
||||
fixed_t convSpeed[2] = {0,0};
|
||||
fixed_t convSpeed[2] = {0, 0};
|
||||
#ifdef ROTSPRITE
|
||||
fixed_t dial_divisor = DIALSPDDIV;
|
||||
#endif
|
||||
@@ -2707,34 +2704,28 @@ static void K_drawKartSpeedometer(void)
|
||||
|
||||
V_DrawKartString(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, metric);
|
||||
}
|
||||
else if (speedostyle == SPEEDO_EXTRA) // why bother if we dont?
|
||||
else if (speedostyle == SPEEDO_EXTRA || speedostyle == SPEEDO_ACHII) // why bother if we dont?
|
||||
{
|
||||
if (K_UseColorSpeedo(SPEEDO_EXTRA)) //Colourized hud
|
||||
patch_t *speedopat;
|
||||
UINT8 *colormap = NULL;
|
||||
|
||||
if (K_UseColorSpeedo(speedostyle)) //Colourized hud
|
||||
{
|
||||
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
V_DrawMappedPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_smallstickerclr, colormap);
|
||||
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
|
||||
speedopat = ((speedostyle == SPEEDO_EXTRA) ? skp_smallstickerclr : skp_smallstickerachiclr);
|
||||
V_DrawMappedPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, speedopat, colormap);
|
||||
speedopat = ((speedostyle == SPEEDO_EXTRA) ? skp_speedpatches[cv_kartspeedometer.value] : skp_speedpatchesachiclr[cv_kartspeedometer.value]);
|
||||
}
|
||||
else
|
||||
V_DrawScaledPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_smallsticker);
|
||||
{
|
||||
speedopat = ((speedostyle == SPEEDO_EXTRA) ? skp_smallsticker : skp_smallstickerachi);
|
||||
V_DrawScaledPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, speedopat);
|
||||
speedopat = ((speedostyle == SPEEDO_EXTRA) ? skp_speedpatches[cv_kartspeedometer.value] : skp_speedpatchesachi[cv_kartspeedometer.value]);
|
||||
}
|
||||
|
||||
V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
|
||||
V_DrawScaledPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_speedpatches[cv_kartspeedometer.value]);
|
||||
}
|
||||
else if (speedostyle == SPEEDO_ACHII) // why bother if we dont?
|
||||
{
|
||||
if (K_UseColorSpeedo(SPEEDO_ACHII)) //Colourized hud
|
||||
{
|
||||
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
V_DrawMappedPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_smallstickerachiclr, colormap);
|
||||
V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
|
||||
V_DrawMappedPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_speedpatchesachiclr[cv_kartspeedometer.value], colormap);
|
||||
}
|
||||
else
|
||||
{
|
||||
V_DrawScaledPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_smallstickerachi);
|
||||
V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
|
||||
V_DrawScaledPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_speedpatchesachi[cv_kartspeedometer.value]);
|
||||
}
|
||||
V_DrawMappedPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, speedopat, colormap);
|
||||
}
|
||||
#ifdef ROTSPRITE
|
||||
else if (speedostyle == SPEEDO_DIAL) // why bother if we dont?
|
||||
@@ -2747,46 +2738,36 @@ static void K_drawKartSpeedometer(void)
|
||||
(K_UseColorSpeedo(SPEEDO_DIAL)));
|
||||
}
|
||||
#endif
|
||||
else if (speedostyle == SPEEDO_EXTRA3) // why bother if we dont?
|
||||
{
|
||||
if (K_UseColorSpeedo(SPEEDO_EXTRA3)) //Colourized hud
|
||||
{
|
||||
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
V_DrawStretchyFixedPatch((SPDM_X-1)<<FRACBITS, (SPDM_Y + 5)<<FRACBITS, XTRA3PSCALE, XTRA3VSCALE, V_HUDTRANS|splitflags, skp_smallstickerclr3, colormap, 0);
|
||||
}
|
||||
else
|
||||
V_DrawStretchyFixedPatch((SPDM_X-1)<<FRACBITS, (SPDM_Y + 5)<<FRACBITS, XTRA3PSCALE, XTRA3VSCALE, V_HUDTRANS|splitflags, skp_smallsticker3, NULL, 0);
|
||||
|
||||
V_DrawRankNum(SPDM_X + 26, SPDM_Y + 4, V_HUDTRANS|splitflags, convSpeed[1], 3, NULL);
|
||||
V_DrawScaledPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_speedpatches[cv_kartspeedometer.value]);
|
||||
}
|
||||
// Kart Z speedo bullshit...
|
||||
// Draw the Speed counter.
|
||||
else if ((speedostyle == SPEEDO_PMETER) || (speedostyle == SPEEDO_PMETERSMOL))
|
||||
{
|
||||
fixed_t fuspeed = 0;
|
||||
INT32 spdpatch = 0;
|
||||
static const INT32 speedIntervals[22] = {2, 5, 7, 10, 12, 15, 17,
|
||||
20, 22, 25, 27, 30, 32,
|
||||
35, 37, 40, 42, 45, 47,
|
||||
50, 52, 55};
|
||||
static const INT32 spdinterval[22] = { 2, 5, 7, 10,
|
||||
12, 15, 17, 20,
|
||||
22, 25, 27, 30,
|
||||
32, 35, 37, 40,
|
||||
42, 45, 47, 50,
|
||||
52, 55};
|
||||
|
||||
fuspeed = FixedDiv(stplyr->speed, mapobjectscale)/FRACUNIT;
|
||||
const fixed_t spd = FixedDiv(stplyr->speed, mapobjectscale) / FRACUNIT;
|
||||
|
||||
for (INT32 i = 0; i < 22; ++i)
|
||||
if (spd > 54)
|
||||
{
|
||||
if (fuspeed < speedIntervals[i])
|
||||
spdpatch = (leveltime & 4) ? 24 : 23;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (INT32 i = 0; i < 22; ++i)
|
||||
{
|
||||
spdpatch = i;
|
||||
break;
|
||||
if (spd < spdinterval[i])
|
||||
{
|
||||
spdpatch = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (((fuspeed < 57 && fuspeed > 54) || (fuspeed < 60 && fuspeed > 56) || (fuspeed > 59)) && (leveltime & 4))
|
||||
spdpatch = 24;
|
||||
else if (((fuspeed < 57 && fuspeed > 54) || (fuspeed < 60 && fuspeed > 56) || (fuspeed > 59)) && !(leveltime & 4))
|
||||
spdpatch = 23;
|
||||
|
||||
V_DrawScaledPatch(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, (speedostyle == SPEEDO_PMETER) ? kp_kartzspeedo[spdpatch] : kp_kartzspeedo_smol[spdpatch]);
|
||||
}
|
||||
}
|
||||
@@ -2814,7 +2795,7 @@ static void K_drawKartBumpersOrKarma(void)
|
||||
{
|
||||
const UINT8 speedostyle = K_GetSpeedometerStyle();
|
||||
|
||||
if ((speedostyle == SPEEDO_EXTRA) || (speedostyle == SPEEDO_ACHII) || (speedostyle == SPEEDO_EXTRA3))
|
||||
if ((speedostyle == SPEEDO_EXTRA) || (speedostyle == SPEEDO_ACHII))
|
||||
fy += 5;
|
||||
else
|
||||
fy += 7;
|
||||
@@ -2906,10 +2887,12 @@ static boolean K_GetScreenCoords(vector2_t *vec, player_t *player, mobj_t *targe
|
||||
x = (fixed_t)(viewangle - R_PointToAngle(targx, targy));
|
||||
|
||||
distfact = FINECOSINE((x>>ANGLETOFINESHIFT) & FINEMASK);
|
||||
if (!distfact) distfact = 1;
|
||||
if (!distfact)
|
||||
distfact = 1;
|
||||
|
||||
if (encoremode)
|
||||
x = -x;
|
||||
|
||||
if (x < (fixed_t)ANGLE_270 || x > (fixed_t)ANGLE_90)
|
||||
return false;
|
||||
|
||||
@@ -2991,7 +2974,7 @@ static boolean K_GetScreenCoords(vector2_t *vec, player_t *player, mobj_t *targe
|
||||
if (stplyrnum > 0)
|
||||
y = y + yres;
|
||||
}
|
||||
if (splitscreen >= 2) // 3P or 4P
|
||||
else if (splitscreen >= 2) // 3P or 4P
|
||||
{
|
||||
x = x>>1;
|
||||
y = y>>1;
|
||||
@@ -3051,9 +3034,11 @@ static void K_drawNameTags(void)
|
||||
if (players[i].kartstuff[k_hyudorotimer]) // player is invisible
|
||||
continue;
|
||||
if (maxdistance)
|
||||
{
|
||||
distance = R_PointToDist(players[i].mo->x, players[i].mo->y);
|
||||
if (distance > maxdistance)
|
||||
continue;
|
||||
if (distance > maxdistance)
|
||||
continue;
|
||||
}
|
||||
if (!P_CheckSightFast(stplyr->mo, players[i].mo))
|
||||
continue;
|
||||
|
||||
@@ -3262,13 +3247,12 @@ static void K_drawDriftGauge(void)
|
||||
if (!splitscreen && !camera->chase)
|
||||
return;
|
||||
|
||||
if (forceshowhud)
|
||||
goto skipcrap; // i will skip the drift early return and you cant stop me!
|
||||
|
||||
if (!stplyr->kartstuff[k_drift])
|
||||
return;
|
||||
|
||||
skipcrap:
|
||||
// i will skip the drift early return and you cant stop me!
|
||||
if (!forceshowhud)
|
||||
{
|
||||
if (!stplyr->kartstuff[k_drift])
|
||||
return;
|
||||
}
|
||||
|
||||
if (P_MobjWasRemoved(stplyr->mo))
|
||||
return;
|
||||
@@ -3293,12 +3277,11 @@ skipcrap:
|
||||
{
|
||||
case GAUGE_DEFAULT:
|
||||
case GAUGE_SMALL:
|
||||
case GAUGE_EXTRA:
|
||||
case GAUGE_BIGNUM:
|
||||
{
|
||||
patch_t *driftpatch = NULL;
|
||||
|
||||
if (gaugestyle == GAUGE_DEFAULT || gaugestyle == GAUGE_BIGNUM || gaugestyle == GAUGE_EXTRA)
|
||||
if (gaugestyle == GAUGE_DEFAULT || gaugestyle == GAUGE_BIGNUM)
|
||||
{
|
||||
barx = basex - vid.dup*23;
|
||||
BAR_WIDTH = vid.dup*47;
|
||||
@@ -3311,30 +3294,15 @@ skipcrap:
|
||||
|
||||
bary = basey - vid.dup*2;
|
||||
|
||||
if (gaugestyle == GAUGE_EXTRA) // i hate hud code i hate hud code i hate hud code i hate hud code i hate hud code.....
|
||||
if (K_UseColorHud()) // Colourized hud
|
||||
{
|
||||
if (K_UseColorSpeedo(SPEEDO_EXTRA3)) // We reuse the extra speedometer patch hence this check
|
||||
{
|
||||
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
driftpatch = skp_smallstickerclr3;
|
||||
}
|
||||
else
|
||||
driftpatch = skp_smallsticker3;
|
||||
|
||||
V_DrawStretchyFixedPatch((basex - vid.dup*30)<<FRACBITS, ((basey<<FRACBITS) - FixedMul(vid.dup<<FRACBITS, 21*FRACUNIT/10)), XTRA3PSCALE, XTRA3VSCALE, V_NOSCALESTART|V_OFFSET|drifttrans, driftpatch, colormap, 0);
|
||||
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
driftpatch = (gaugestyle == GAUGE_SMALL ? driftgaugesmallcolor : driftgaugecolor);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (K_UseColorHud()) // Colourized hud
|
||||
{
|
||||
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
driftpatch = (gaugestyle == GAUGE_SMALL ? driftgaugesmallcolor : driftgaugecolor);
|
||||
}
|
||||
else
|
||||
driftpatch = (gaugestyle == GAUGE_SMALL ? driftgaugesmall : driftgauge);
|
||||
driftpatch = (gaugestyle == GAUGE_SMALL ? driftgaugesmall : driftgauge);
|
||||
|
||||
V_DrawMappedPatch(gaugestyle == GAUGE_SMALL ? basex + vid.dup*11 : basex, basey, V_NOSCALESTART|V_OFFSET|drifttrans, driftpatch, colormap);
|
||||
}
|
||||
V_DrawMappedPatch(gaugestyle == GAUGE_SMALL ? basex + vid.dup*11 : basex, basey, V_NOSCALESTART|V_OFFSET|drifttrans, driftpatch, colormap);
|
||||
|
||||
if (driftcharge >= driftval*4) // rainbow sparks
|
||||
{
|
||||
@@ -3632,7 +3600,7 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags)
|
||||
V_DrawCenteredSmallStringAtFixed(amxpos + (4*FRACUNIT), amypos - (3*FRACUNIT), V_ALLOWLOWERCASE|flags|V_SkinColorToHighlightcolor(mo->color), player_names[player - players]);
|
||||
}
|
||||
|
||||
const boolean minihead = K_useSmallMinimapHead(mo->player);
|
||||
const boolean minihead = K_useSmallMinimapHead(player);
|
||||
|
||||
// thx wanted reticle for having weird offsets very cool
|
||||
wntdamxpos = minihead ? amxpos + (1<<FRACBITS) : amxpos - (4<<FRACBITS);
|
||||
@@ -3774,6 +3742,9 @@ static void K_drawKartMinimap(void)
|
||||
if (!players[i].mo || players[i].spectator)
|
||||
continue;
|
||||
|
||||
if (!cv_showminimapfinished.value && players[i].exiting)
|
||||
continue;
|
||||
|
||||
if (P_IsDisplayPlayer(&players[i]))
|
||||
{
|
||||
// Draw display players on top of everything else
|
||||
@@ -3818,7 +3789,7 @@ static void K_drawKartMinimap(void)
|
||||
|
||||
if (cv_showminimapangle.value && (minidoticon || minilighticon) && !playertimedout)
|
||||
{
|
||||
UINT8 *colormap;
|
||||
UINT8 *colormap = NULL;
|
||||
drawinfo_t dims;
|
||||
fixed_t interpx, interpy;
|
||||
fixed_t xoff = 0, yoff = 0;
|
||||
@@ -3829,10 +3800,27 @@ static void K_drawKartMinimap(void)
|
||||
if (encoremode)
|
||||
ang = ANGLE_180 - ang;
|
||||
|
||||
if (mobj->colorized)
|
||||
colormap = R_GetTranslationColormap(TC_RAINBOW, mobj->color, GTC_CACHE);
|
||||
else
|
||||
colormap = R_GetLocalTranslationColormap(mobj->skin, mobj->localskin, mobj->color, GTC_CACHE, mobj->skinlocal);
|
||||
if (mobj->color)
|
||||
{
|
||||
if (mobj->colorized)
|
||||
{
|
||||
colormap = R_GetTranslationColormap(TC_RAINBOW, mobj->color, GTC_CACHE);
|
||||
}
|
||||
else
|
||||
{
|
||||
const INT32 skinnum = K_GetMobjLocalSkinNum(mobj->skin, mobj->localskin, mobj->skinlocal);
|
||||
|
||||
// special case if startcolor is not the default (160 / Green)
|
||||
if (skinnum && skins[skinnum].starttranscolor != skins[0].starttranscolor)
|
||||
{
|
||||
colormap = R_GetTranslationColormap(TC_DEFAULT, mobj->color, GTC_CACHE);
|
||||
}
|
||||
else
|
||||
{
|
||||
colormap = R_GetLocalTranslationColormap(mobj->skin, mobj->localskin, mobj->color, GTC_CACHE, mobj->skinlocal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interpx = lerp(mobj->old_x, mobj->x);
|
||||
interpy = lerp(mobj->old_y, mobj->y);
|
||||
@@ -3997,6 +3985,7 @@ static void K_drawBattleFullscreen(void)
|
||||
{
|
||||
if (stplyrnum == 0)
|
||||
V_DrawFadeScreen(0xFF00, 16);
|
||||
|
||||
if (stplyr->exiting < 6*TICRATE && !stplyr->spectator)
|
||||
{
|
||||
if (stplyr->kartstuff[k_position] == 1)
|
||||
@@ -4061,7 +4050,7 @@ static void K_drawBattleFullscreen(void)
|
||||
{
|
||||
if (i == displayplayers[0])
|
||||
continue;
|
||||
if (playeringame[i] && !stplyr->spectator)
|
||||
if (playeringame[i])
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4278,6 +4267,7 @@ static void K_drawInput(void)
|
||||
|
||||
y -= FRACUNIT;
|
||||
|
||||
// stick displays
|
||||
if (cv_showinput.value == 2 || cv_showinput.value == 3)
|
||||
{
|
||||
INT32 axis;
|
||||
@@ -4287,7 +4277,7 @@ static void K_drawInput(void)
|
||||
const INT32 joyy = y>>FRACBITS;
|
||||
static const INT32 joyxoffs = -8;
|
||||
static const INT32 joyyoffs = -24;
|
||||
const boolean usejoysprite = (cv_showinput.value == 3 && joystickicon);
|
||||
const boolean usejoysprite = (cv_showinput.value == 3 && joystickicon);
|
||||
|
||||
// O backing
|
||||
if (usejoysprite)
|
||||
@@ -4305,39 +4295,20 @@ static void K_drawInput(void)
|
||||
// kart does not have anything we can get analogue joystick y axis values from
|
||||
// during normal gameplay, so replicate shit here
|
||||
|
||||
// this is horrid but we cant get actual input in replays so uhh
|
||||
if (demo.playback || !P_IsLocalPlayer(stplyr)) // yeah...........
|
||||
const boolean analogjoystickmove = (!demo.playback && P_IsLocalPlayer(stplyr) && cv_usejoystick[stplyrnum].value && !DigitalGamepadStyle(stplyrnum));
|
||||
axis = analogjoystickmove ? JoyAxis(AXISAIM, stplyrnum+1) : 0;
|
||||
|
||||
if (axis != 0)
|
||||
{
|
||||
hudforward = stplyr->kartstuff[k_throwdir] * KART_FULLTURN;
|
||||
hudforward -= ((axis * KART_FULLTURN) / JOYAXISRANGE);
|
||||
}
|
||||
else
|
||||
{
|
||||
const boolean analogjoystickmove = cv_usejoystick[stplyrnum].value && !Joystick[stplyrnum].bGamepadStyle;
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[stplyrnum].value && Joystick[stplyrnum].bGamepadStyle;
|
||||
const UINT8 ssplayer = stplyrnum+1;
|
||||
|
||||
axis = JoyAxis(AXISAIM, ssplayer);
|
||||
|
||||
if (analogjoystickmove && axis != 0)
|
||||
{
|
||||
// JOYAXISRANGE is supposed to be 1023 (divide by 1024)
|
||||
hudforward -= ((axis * KART_FULLTURN) / (JOYAXISRANGE-1));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (InputDown(gc_aimforward, ssplayer) || (gamepadjoystickmove && axis < 0))
|
||||
{
|
||||
hudforward += KART_FULLTURN;
|
||||
}
|
||||
if (InputDown(gc_aimbackward, ssplayer) || (gamepadjoystickmove && axis > 0))
|
||||
{
|
||||
hudforward-= KART_FULLTURN;
|
||||
}
|
||||
}
|
||||
|
||||
hudforward = CLAMP(hudforward, -KART_FULLTURN, KART_FULLTURN);
|
||||
hudforward = stplyr->kartstuff[k_throwdir] * KART_FULLTURN;
|
||||
}
|
||||
|
||||
hudforward = CLAMP(hudforward, -KART_FULLTURN, KART_FULLTURN);
|
||||
|
||||
if (cmd->driftturn || hudforward)
|
||||
{
|
||||
INT16 turning = encoremode ? -cmd->driftturn : cmd->driftturn;
|
||||
@@ -4370,7 +4341,7 @@ static void K_drawInput(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
else // wheel
|
||||
{
|
||||
if (!cmd->driftturn) // no turn
|
||||
target = 0;
|
||||
@@ -4417,6 +4388,7 @@ static void K_drawChallengerScreen(void)
|
||||
19,20,19,20,19,20,19,20,19,20, // frame 20-21, 1 tic, 5 alternating: all text vibrates from impact
|
||||
21,22,23,24 // frame 22-25, 1 tic: CHALLENGER turns gold
|
||||
};
|
||||
|
||||
const UINT8 offset = min(52-1, (3*TICRATE)-mapreset);
|
||||
|
||||
V_DrawFadeScreen(0xFF00, 16); // Fade out
|
||||
@@ -4425,6 +4397,9 @@ static void K_drawChallengerScreen(void)
|
||||
|
||||
static void K_drawLapStartAnim(void)
|
||||
{
|
||||
if (!cv_showlapemblem.value)
|
||||
return;
|
||||
|
||||
// This is an EVEN MORE insanely complicated animation.
|
||||
const UINT8 progress = 80-stplyr->kartstuff[k_lapanimation];
|
||||
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
@@ -4468,9 +4443,10 @@ static void K_drawLapStartAnim(void)
|
||||
V_DrawFixedPatch(leftx, y, FRACUNIT, vflags, kp_lapanim_lap[min(progress/2, 6)], NULL);
|
||||
|
||||
char *lapnum = va("%02d", stplyr->laps + 1);
|
||||
const size_t laplength = strlen(lapnum);
|
||||
|
||||
for (int i = 0; i < (int)laplength; i++)
|
||||
const int laplength = (int)strlen(lapnum);
|
||||
|
||||
for (int i = 0; i < laplength; i++)
|
||||
{
|
||||
int digit = lapnum[i] - '0';
|
||||
int frame = min(2, progress/2 - 8 - (i*2));
|
||||
@@ -4518,6 +4494,7 @@ static void K_drawDistributionDebugger(void)
|
||||
kp_orbinaut[4],
|
||||
kp_jawz[1]
|
||||
};
|
||||
|
||||
INT32 useodds = 0;
|
||||
INT32 pingame = 0, bestbumper = 0;
|
||||
INT32 i;
|
||||
@@ -4534,8 +4511,10 @@ static void K_drawDistributionDebugger(void)
|
||||
if (!playeringame[i] || players[i].spectator)
|
||||
continue;
|
||||
pingame++;
|
||||
|
||||
if (players[i].exiting)
|
||||
dontforcespb = true;
|
||||
|
||||
if (players[i].kartstuff[k_bumper] > bestbumper)
|
||||
bestbumper = players[i].kartstuff[k_bumper];
|
||||
}
|
||||
@@ -4689,6 +4668,7 @@ void K_drawKartHUD(void)
|
||||
{
|
||||
if (LUA_HudEnabled(hud_battlefullscreen))
|
||||
K_drawBattleFullscreen();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4848,7 +4828,7 @@ void K_drawKartHUD(void)
|
||||
{
|
||||
if (stplyr->exiting)
|
||||
K_drawKartFinish();
|
||||
else if (stplyr->kartstuff[k_lapanimation] && !splitscreen && cv_showlapemblem.value)
|
||||
else if (stplyr->kartstuff[k_lapanimation] && !splitscreen)
|
||||
K_drawLapStartAnim();
|
||||
}
|
||||
|
||||
|
||||
@@ -35,11 +35,13 @@ extern consvar_t cv_darkitembox;
|
||||
extern consvar_t cv_biglaps;
|
||||
extern consvar_t cv_highresportrait;
|
||||
extern consvar_t cv_showstats;
|
||||
extern consvar_t cv_showstats_skinname;
|
||||
extern consvar_t cv_fancyroulette;
|
||||
extern consvar_t cv_showlaptimes;
|
||||
extern consvar_t cv_battlespeedo;
|
||||
extern consvar_t cv_multiitemicon;
|
||||
extern consvar_t cv_huditemamount;
|
||||
extern consvar_t cv_roulettecolor;
|
||||
|
||||
// for use in timeattack menu
|
||||
extern patch_t *kp_facenum[MAXPLAYERS+1];
|
||||
|
||||
+891
-706
File diff suppressed because it is too large.
Load diff
+1
-1
@@ -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);
|
||||
|
||||
+42
-13
@@ -358,7 +358,8 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
#define TYPEERROR(f, t) FIELDERROR(f, va("%s expected, got %s", lua_typename(L, t), luaL_typename(L, -1)))
|
||||
|
||||
lua_pushnil(L);
|
||||
while (lua_next(L, 1)) {
|
||||
while (lua_next(L, 1))
|
||||
{
|
||||
// stack: cvar table, cvar userdata, key/index, value
|
||||
// 1 2 3 4
|
||||
i = 0;
|
||||
@@ -368,26 +369,40 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
else if (lua_isstring(L, 3))
|
||||
k = lua_tostring(L, 3);
|
||||
|
||||
if (i == 1 || (k && fasticmp(k, "name"))) {
|
||||
if (i == 1 || (k && fasticmp(k, "name")))
|
||||
{
|
||||
if (!lua_isstring(L, 4))
|
||||
TYPEERROR("name", LUA_TSTRING)
|
||||
|
||||
cvar->name = Z_StrDup(lua_tostring(L, 4));
|
||||
} else if (i == 2 || (k && fasticmp(k, "defaultvalue"))) {
|
||||
}
|
||||
else if (i == 2 || (k && fasticmp(k, "defaultvalue")))
|
||||
{
|
||||
if (!lua_isstring(L, 4))
|
||||
TYPEERROR("defaultvalue", LUA_TSTRING)
|
||||
|
||||
cvar->defaultvalue = Z_StrDup(lua_tostring(L, 4));
|
||||
} else if (i == 3 || (k && fasticmp(k, "flags"))) {
|
||||
}
|
||||
else if (i == 3 || (k && fasticmp(k, "flags")))
|
||||
{
|
||||
if (!lua_isnumber(L, 4))
|
||||
TYPEERROR("flags", LUA_TNUMBER)
|
||||
|
||||
cvar->flags = (INT32)lua_tointeger(L, 4);
|
||||
} else if (i == 4 || (k && fasticmp(k, "PossibleValue"))) {
|
||||
if (lua_islightuserdata(L, 4)) {
|
||||
}
|
||||
else if (i == 4 || (k && fasticmp(k, "PossibleValue")))
|
||||
{
|
||||
if (lua_islightuserdata(L, 4))
|
||||
{
|
||||
CV_PossibleValue_t *pv = lua_touserdata(L, 4);
|
||||
|
||||
if (pv == CV_OnOff || pv == CV_YesNo || pv == CV_Unsigned || pv == CV_Natural)
|
||||
cvar->PossibleValue = pv;
|
||||
else
|
||||
FIELDERROR("PossibleValue", "CV_PossibleValue_t expected, got unrecognised pointer")
|
||||
} else if (lua_istable(L, 4)) {
|
||||
}
|
||||
else if (lua_istable(L, 4))
|
||||
{
|
||||
// Accepts tables in the form of {MIN=0, MAX=9999} or {Red=0, Green=1, Blue=2}
|
||||
// and converts them to CV_PossibleValue_t {{0,"MIN"},{9999,"MAX"}} or {{0,"Red"},{1,"Green"},{2,"Blue"}}
|
||||
//
|
||||
@@ -398,7 +413,9 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
CV_PossibleValue_t *cvpv;
|
||||
|
||||
lua_pushnil(L);
|
||||
while (lua_next(L, 4)) {
|
||||
|
||||
while (lua_next(L, 4))
|
||||
{
|
||||
count++;
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
@@ -412,7 +429,9 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
|
||||
i = 0;
|
||||
lua_pushnil(L);
|
||||
while (lua_next(L, 4)) {
|
||||
|
||||
while (lua_next(L, 4))
|
||||
{
|
||||
// stack: [...] PossibleValue table, index, value
|
||||
// 4 5 6
|
||||
if (lua_type(L, 5) != LUA_TSTRING
|
||||
@@ -423,14 +442,19 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
i++;
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
cvpv[i].value = 0;
|
||||
cvpv[i].strvalue = NULL;
|
||||
cvar->PossibleValue = cvpv;
|
||||
} else
|
||||
}
|
||||
else
|
||||
FIELDERROR("PossibleValue", va("%s or CV_PossibleValue_t expected, got %s", lua_typename(L, LUA_TTABLE), luaL_typename(L, -1)))
|
||||
} else if (i == 5 || (k && fasticmp(k, "func"))) {
|
||||
}
|
||||
else if (i == 5 || (k && fasticmp(k, "func")))
|
||||
{
|
||||
if (!lua_isfunction(L, 4))
|
||||
TYPEERROR("func", LUA_TFUNCTION)
|
||||
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, "CV_OnChange");
|
||||
I_Assert(lua_istable(L, 5));
|
||||
lua_pushlightuserdata(L, cvar);
|
||||
@@ -438,9 +462,13 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
lua_rawset(L, 5);
|
||||
lua_pop(L, 1);
|
||||
cvar->func = Lua_OnChange;
|
||||
|
||||
if (i == 5 && !(cvar->flags & CV_CALL))
|
||||
{
|
||||
category = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
|
||||
}
|
||||
}
|
||||
else if (((i == 5 && !(cvar->flags & CV_CALL))
|
||||
|| (cvar->flags & CV_CALL && i == 6))
|
||||
else if ((cvar->flags & CV_CALL && i == 6)
|
||||
|| (k && fasticmp(k, "category")))
|
||||
{
|
||||
category = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
|
||||
@@ -451,6 +479,7 @@ static int lib_cvRegisterVar(lua_State *L)
|
||||
{
|
||||
menu_name = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
|
||||
}
|
||||
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
#undef FIELDERROR
|
||||
|
||||
+86
-48
@@ -25,6 +25,7 @@
|
||||
#include "lua_libs.h"
|
||||
#include "lua_hook.h"
|
||||
#include "lua_hud.h" // hud_running errors
|
||||
#include "lua_profile.h"
|
||||
|
||||
/* =========================================================================
|
||||
ABSTRACTION
|
||||
@@ -65,6 +66,8 @@ static stringhook_t stringHooks[STRING_HOOK(MAX)];
|
||||
|
||||
bool hook_important = true;
|
||||
|
||||
#define NONMOHOOK ((mobjtype_t)-1)
|
||||
|
||||
// This will be indexed by hook id, the value of which fetches the registry.
|
||||
static int * hookRefs;
|
||||
static int nextid;
|
||||
@@ -199,7 +202,7 @@ FUNCINLINE static ATTRINLINE void add_hook(hook_t *map)
|
||||
|
||||
FUNCINLINE static ATTRINLINE void add_mobj_hook(lua_State *L, int hook_type)
|
||||
{
|
||||
mobjtype_t mobj_type = luaL_optnumber(L, 3, MT_NULL);
|
||||
mobjtype_t mobj_type = luaL_optnumber(L, 3, MT_NULL);
|
||||
|
||||
luaL_argcheck(L, mobj_type < NUMMOBJTYPES, 3, "invalid mobjtype_t");
|
||||
|
||||
@@ -293,18 +296,17 @@ typedef struct Hook_State Hook_State;
|
||||
typedef void (*Hook_Callback)(Hook_State *);
|
||||
|
||||
struct Hook_State {
|
||||
INT32 status;/* return status to calling function */
|
||||
void * userdata;
|
||||
int hook_type;
|
||||
mobjtype_t mobj_type;/* >0 if mobj hook */
|
||||
boolean force_mobj;// allows mobj_type equal 0
|
||||
const char * string;/* used to fetch table, ran first if set */
|
||||
int top;/* index of last argument passed to hook */
|
||||
int id;/* id to fetch ref */
|
||||
boolean important;/* is this hook from local addon */
|
||||
int values;/* num arguments passed to hook */
|
||||
int results;/* num values returned by hook */
|
||||
Hook_Callback results_handler;/* callback when hook successfully returns */
|
||||
INT32 status; /* return status to calling function */
|
||||
void * userdata;
|
||||
int hook_type;
|
||||
mobjtype_t mobj_type; /* != NONMOHOOK if mobj hook */
|
||||
const char * string; /* used to fetch table, ran first if set */
|
||||
int top; /* index of last argument passed to hook */
|
||||
int id; /* id to fetch ref */
|
||||
bool important; /* is this hook from local addon */
|
||||
int values; /* num arguments passed to hook */
|
||||
int results; /* num values returned by hook */
|
||||
Hook_Callback results_handler; /* callback when hook successfully returns */
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -364,10 +366,8 @@ FUNCINLINE static ATTRINLINE boolean prepare_hook
|
||||
int default_status,
|
||||
int hook_type
|
||||
){
|
||||
hook->force_mobj = false;
|
||||
|
||||
return init_hook_type(hook, default_status,
|
||||
hook_type, 0, NULL,
|
||||
hook_type, NONMOHOOK, NULL,
|
||||
hookIds[hook_type].numHooks);
|
||||
}
|
||||
|
||||
@@ -381,8 +381,6 @@ FUNCINLINE static ATTRINLINE boolean prepare_mobj_hook
|
||||
const mobjtype_t mobj_type =
|
||||
primary_mobj ? primary_mobj->type : NUMMOBJTYPES;
|
||||
|
||||
hook->force_mobj = true;
|
||||
|
||||
return init_hook_type(hook, default_status,
|
||||
hook_type, mobj_type, NULL,
|
||||
mobj_hook_available(hook_type, mobj_type));
|
||||
@@ -395,10 +393,8 @@ FUNCINLINE static ATTRINLINE boolean prepare_string_hook
|
||||
int hook_type,
|
||||
const char * string
|
||||
){
|
||||
hook->force_mobj = false;
|
||||
|
||||
if (init_hook_type(hook, default_status,
|
||||
hook_type, 0, string,
|
||||
hook_type, NONMOHOOK, string,
|
||||
stringHooks[hook_type].ref))
|
||||
{
|
||||
lua_pushstring(gL, string);
|
||||
@@ -414,7 +410,7 @@ FUNCINLINE static ATTRINLINE boolean prepare_hud_hook
|
||||
int hook_type
|
||||
){
|
||||
return init_hook_type(hook, 0,
|
||||
hook_type, 0, NULL,
|
||||
hook_type, NONMOHOOK, NULL,
|
||||
hudHookIds[hook_type].numHooks);
|
||||
}
|
||||
|
||||
@@ -450,11 +446,54 @@ FUNCINLINE static ATTRINLINE void get_hook_from_table(Hook_State *hook, int n)
|
||||
lua_getref(gL, hookRefs[hook->id]);
|
||||
}
|
||||
|
||||
static int pcall(Hook_State *hook)
|
||||
{
|
||||
return lua_pcall(gL, hook->values, hook->results, EINDEX);
|
||||
}
|
||||
|
||||
static const char *hook_name(Hook_State *hook)
|
||||
{
|
||||
if (hud_running)
|
||||
{
|
||||
return hudHookNames[hook->hook_type];
|
||||
}
|
||||
else if (hook->string)
|
||||
{
|
||||
return stringHookNames[hook->hook_type];
|
||||
}
|
||||
//else if (hook->mobj_type > 0)
|
||||
else if (hook->mobj_type != NONMOHOOK)
|
||||
{
|
||||
return mobjHookNames[hook->hook_type];
|
||||
}
|
||||
else
|
||||
{
|
||||
return hookNames[hook->hook_type];
|
||||
}
|
||||
}
|
||||
|
||||
static int pcall_timed_or_untimed(Hook_State *hook)
|
||||
{
|
||||
if (!hud_running && cv_lua_profile.value > 0)
|
||||
{
|
||||
lua_timer_t *timer = LUA_BeginFunctionTimer(gL, -1 - hook->values, hook_name(hook));
|
||||
int k = pcall(hook);
|
||||
LUA_EndFunctionTimer(timer);
|
||||
|
||||
return k;
|
||||
}
|
||||
else
|
||||
{
|
||||
return pcall(hook);
|
||||
}
|
||||
}
|
||||
|
||||
static int call_single_hook_no_copy(Hook_State *hook)
|
||||
{
|
||||
hook_important = hook->important;
|
||||
|
||||
if (lua_pcall(gL, hook->values, hook->results, EINDEX) == 0)
|
||||
//if (lua_pcall(gL, hook->values, hook->results, EINDEX) == 0)
|
||||
if (pcall_timed_or_untimed(hook) == 0)
|
||||
{
|
||||
if (hook->results > 0)
|
||||
{
|
||||
@@ -554,14 +593,13 @@ static int call_hooks
|
||||
{
|
||||
calls += call_string_hooks(hook);
|
||||
}
|
||||
else if (hook->force_mobj)
|
||||
//else if (hook->mobj_type > 0)
|
||||
else if (hook->mobj_type != NONMOHOOK)
|
||||
{
|
||||
/* call generic mobj hooks first */
|
||||
calls += call_mobj_type_hooks(hook, MT_NULL);
|
||||
|
||||
if (hook->mobj_type < NUMMOBJTYPES)
|
||||
calls += call_mobj_type_hooks(hook, hook->mobj_type);
|
||||
|
||||
ps_lua_mobjhooks.value.i += calls;
|
||||
}
|
||||
else
|
||||
@@ -615,7 +653,7 @@ FUNCINLINE static ATTRINLINE void res_hud(Hook_State *hook)
|
||||
|
||||
int LUA_HookMobj(mobj_t *mobj, int hook_type)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_mobj_hook(&hook, false, hook_type, mobj))
|
||||
{
|
||||
LUA_PushUserdata(gL, mobj, META_MOBJ);
|
||||
@@ -626,7 +664,7 @@ int LUA_HookMobj(mobj_t *mobj, int hook_type)
|
||||
|
||||
int LUA_Hook2Mobj(mobj_t *t1, mobj_t *t2, int hook_type)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_mobj_hook(&hook, 0, hook_type, t1))
|
||||
{
|
||||
LUA_PushUserdata(gL, t1, META_MOBJ);
|
||||
@@ -638,14 +676,14 @@ int LUA_Hook2Mobj(mobj_t *t1, mobj_t *t2, int hook_type)
|
||||
|
||||
void LUA_HookVoid(int type)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_hook(&hook, 0, type))
|
||||
call_hooks(&hook, 0, res_none);
|
||||
}
|
||||
|
||||
void LUA_HookInt(INT32 number, int hook_type)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_hook(&hook, 0, hook_type))
|
||||
{
|
||||
lua_pushinteger(gL, number);
|
||||
@@ -655,7 +693,7 @@ void LUA_HookInt(INT32 number, int hook_type)
|
||||
|
||||
/*void LUA_HookBool(boolean value, int hook_type)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_hook(&hook, 0, hook_type))
|
||||
{
|
||||
//lua_pushboolean(gL, value);
|
||||
@@ -665,7 +703,7 @@ void LUA_HookInt(INT32 number, int hook_type)
|
||||
|
||||
int LUA_HookPlayer(player_t *player, int hook_type)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_hook(&hook, false, hook_type))
|
||||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
@@ -676,7 +714,7 @@ int LUA_HookPlayer(player_t *player, int hook_type)
|
||||
|
||||
int LUA_HookTiccmd(player_t *player, ticcmd_t *cmd, int hook_type)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_hook(&hook, false, hook_type))
|
||||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
@@ -695,7 +733,7 @@ int LUA_HookTiccmd(player_t *player, ticcmd_t *cmd, int hook_type)
|
||||
|
||||
void LUA_HookHUD(int hook_type, huddrawlist_h list)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_hud_hook(&hook, hook_type))
|
||||
{
|
||||
LUA_SetHudHook(hook_type, list);
|
||||
@@ -723,7 +761,7 @@ static void hook_think_frame(int type)
|
||||
int hook_index = 0;
|
||||
precise_t time_taken = 0;
|
||||
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
|
||||
const hook_t * map = &hookIds[type];
|
||||
int k;
|
||||
@@ -783,7 +821,7 @@ void LUA_HookPostThinkFrame(void)
|
||||
|
||||
int LUA_HookTouchSpecial(mobj_t *special, mobj_t *toucher)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_mobj_hook(&hook, false, MOBJ_HOOK(TouchSpecial), special))
|
||||
{
|
||||
LUA_PushUserdata(gL, special, META_MOBJ);
|
||||
@@ -802,7 +840,7 @@ static int damage_hook
|
||||
int hook_type,
|
||||
Hook_Callback results_handler
|
||||
){
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_mobj_hook(&hook, 0, hook_type, target))
|
||||
{
|
||||
LUA_PushUserdata(gL, target, META_MOBJ);
|
||||
@@ -890,8 +928,8 @@ int LUA_HookBotAI(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd)
|
||||
{
|
||||
const char *skin = ((skin_t *)tails->skin)->name;
|
||||
|
||||
Hook_State hook;
|
||||
BotAI_State botai;
|
||||
Hook_State hook = {};
|
||||
BotAI_State botai = {};
|
||||
|
||||
if (prepare_string_hook(&hook, false, STRING_HOOK(BotAI), skin))
|
||||
{
|
||||
@@ -911,7 +949,7 @@ int LUA_HookBotAI(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd)
|
||||
|
||||
void LUA_HookLinedefExecute(line_t *line, mobj_t *mo, sector_t *sector)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_string_hook
|
||||
(&hook, 0, STRING_HOOK(LinedefExecute), line->text))
|
||||
{
|
||||
@@ -924,7 +962,7 @@ void LUA_HookLinedefExecute(line_t *line, mobj_t *mo, sector_t *sector)
|
||||
|
||||
int LUA_HookPlayerMsg(int source, int target, int flags, char *msg, int mute)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_hook(&hook, false, HOOK(PlayerMsg)))
|
||||
{
|
||||
LUA_PushUserdata(gL, &players[source], META_PLAYER); // Source player
|
||||
@@ -953,7 +991,7 @@ int LUA_HookPlayerMsg(int source, int target, int flags, char *msg, int mute)
|
||||
|
||||
int LUA_HookHurtMsg(player_t *player, mobj_t *inflictor, mobj_t *source)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_mobj_hook(&hook, false, MOBJ_HOOK(HurtMsg), inflictor))
|
||||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
@@ -967,7 +1005,7 @@ int LUA_HookHurtMsg(player_t *player, mobj_t *inflictor, mobj_t *source)
|
||||
void LUA_HookNetArchive(lua_CFunction archFunc, savebuffer_t *save)
|
||||
{
|
||||
const hook_t * map = &hookIds[HOOK(NetVars)];
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
/* this is a remarkable case where the stack isn't reset */
|
||||
if (map->numHooks > 0)
|
||||
{
|
||||
@@ -997,7 +1035,7 @@ void LUA_HookNetArchive(lua_CFunction archFunc, savebuffer_t *save)
|
||||
|
||||
void LUA_HookPlayerQuit(player_t *plr, int reason)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_hook(&hook, 0, HOOK(PlayerQuit)))
|
||||
{
|
||||
LUA_PushUserdata(gL, plr, META_PLAYER); // Player that quit
|
||||
@@ -1060,7 +1098,7 @@ int LUA_HookMusicChange(const char *oldname, struct MusicChange *param)
|
||||
const int type = HOOK(MusicChange);
|
||||
const hook_t * map = &hookIds[type];
|
||||
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
|
||||
int k;
|
||||
|
||||
@@ -1096,7 +1134,7 @@ int LUA_HookMusicChange(const char *oldname, struct MusicChange *param)
|
||||
|
||||
int LUA_HookMusicCredit(musicdef_t *musicdef)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_hook(&hook, 0, HOOK(MusicCredit)))
|
||||
{
|
||||
LUA_PushUserdata(gL, musicdef, META_MUSICDEF);
|
||||
@@ -1114,7 +1152,7 @@ static int kartdamage_hook
|
||||
int hook_type,
|
||||
Hook_Callback results_handler
|
||||
){
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_hook(&hook, 0, hook_type))
|
||||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
@@ -1163,7 +1201,7 @@ boolean LUA_HookPlayerExplode(player_t *player, mobj_t *inflictor, mobj_t *sourc
|
||||
|
||||
void LUA_HookSetupVote(INT16 result[], INT16 maxresults, UINT8 gt, UINT8 secondgt)
|
||||
{
|
||||
Hook_State hook;
|
||||
Hook_State hook = {};
|
||||
if (prepare_hook(&hook, 0, HOOK(SetupVote)))
|
||||
{
|
||||
// { 0, 0, 0, 0, }
|
||||
|
||||
+14
-9
@@ -644,20 +644,22 @@ static int libd_drawScaled(lua_State *L)
|
||||
// KART: draw patch on minimap from x, y coordinates on the map
|
||||
static int libd_drawOnMinimap(lua_State *L)
|
||||
{
|
||||
fixed_t x, y, scale; // coordinates of the object
|
||||
patch_t *patch; // patch we want to draw
|
||||
UINT8 *colormap = NULL; // do we want to colormap this patch?
|
||||
boolean centered; // the patch is centered and doesn't need readjusting on x/y coordinates.
|
||||
fixed_t x, y, scale; // coordinates of the object
|
||||
patch_t *patch; // patch we want to draw
|
||||
UINT8 *colormap = NULL; // do we want to colormap this patch?
|
||||
boolean centered; // the patch is centered and doesn't need readjusting on x/y coordinates.
|
||||
huddrawlist_h list;
|
||||
patch_t *AutomapPic = NULL;
|
||||
drawinfo_t info;
|
||||
|
||||
// variables used to replicate k_kart's mmap drawer:
|
||||
patch_t *AutomapPic;
|
||||
|
||||
// variables used for actually drawing the icon:
|
||||
INT32 splitflags, minimaptrans;
|
||||
fixed_t amnumxpos, amnumypos;
|
||||
fixed_t amxpos, amypos;
|
||||
INT32 mm_x, mm_y;
|
||||
fixed_t patchw = 0, patchh = 0;
|
||||
fixed_t patchw, patchh;
|
||||
|
||||
HUDONLY // only run this function in hud hooks
|
||||
|
||||
@@ -722,8 +724,11 @@ static int libd_drawOnMinimap(lua_State *L)
|
||||
|
||||
mm_y -= AutomapPic->topoffset;
|
||||
|
||||
// patch is supposedly already centered, don't butt in.
|
||||
if (!centered)
|
||||
if (centered)
|
||||
{
|
||||
patchw = patchh = 0; // patch is supposedly already centered, don't butt in.
|
||||
}
|
||||
else
|
||||
{
|
||||
// scale patch coords
|
||||
patchw = (patch->width * scale / 2);
|
||||
@@ -1297,7 +1302,7 @@ static int lib_hudsetvotebackground(lua_State *L)
|
||||
|
||||
if (strlen(prefix) != 4)
|
||||
{
|
||||
return luaL_argerror(L, 1, "prefix should 4 characters wide");
|
||||
return luaL_argerror(L, 1, "prefix should be 4 characters wide");
|
||||
}
|
||||
|
||||
strncpy(VoteScreen.luaPrefix, prefix, 4);
|
||||
|
||||
+28
-29
@@ -650,34 +650,34 @@ void LUA_HUD_DrawList(huddrawlist_h list)
|
||||
case DI_DrawString:
|
||||
switch(item->align)
|
||||
{
|
||||
// hu_font
|
||||
case align_left:
|
||||
V_DrawString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_center:
|
||||
V_DrawCenteredString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_right:
|
||||
V_DrawRightAlignedString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_fixed:
|
||||
V_DrawStringAtFixed(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
// hu_font, 0.5x scale
|
||||
case align_small:
|
||||
V_DrawSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_smallright:
|
||||
V_DrawRightAlignedSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
// tny_font
|
||||
case align_thin:
|
||||
V_DrawThinString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_thinright:
|
||||
V_DrawRightAlignedThinString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
}
|
||||
// hu_font
|
||||
case align_left:
|
||||
V_DrawString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_center:
|
||||
V_DrawCenteredString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_right:
|
||||
V_DrawRightAlignedString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_fixed:
|
||||
V_DrawStringAtFixed(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
// hu_font, 0.5x scale
|
||||
case align_small:
|
||||
V_DrawSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_smallright:
|
||||
V_DrawRightAlignedSmallString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
// tny_font
|
||||
case align_thin:
|
||||
V_DrawThinString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
case align_thinright:
|
||||
V_DrawRightAlignedThinString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DI_DrawKartString:
|
||||
V_DrawKartString(LERPS(x), LERPS(y), item->flags, itemstr);
|
||||
@@ -690,7 +690,6 @@ void LUA_HUD_DrawList(huddrawlist_h list)
|
||||
break;
|
||||
default:
|
||||
I_Error("can't draw draw list item: invalid draw list item type");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
+5
-1
@@ -22,7 +22,8 @@
|
||||
#include "lua_script.h"
|
||||
#include "lua_libs.h"
|
||||
#include "lua_hud.h" // hud_running errors
|
||||
#include "lua_hook.h" // cmd errors
|
||||
#include "lua_hook.h" // hook_cmd_running errors
|
||||
#include "lua_profile.h"
|
||||
|
||||
boolean LUA_CallAction(enum actionnum actionnum, mobj_t *actor);
|
||||
state_t *astate = NULL;
|
||||
@@ -110,7 +111,10 @@ static void A_Lua(mobj_t *actor)
|
||||
LUA_PushUserdata(gL, actor, META_MOBJ);
|
||||
lua_pushinteger(gL, var1);
|
||||
lua_pushinteger(gL, var2);
|
||||
|
||||
lua_timer_t *timer = LUA_BeginFunctionTimer(gL, -4, "A_Lua");
|
||||
LUA_Call(gL, 3, 0, 1);
|
||||
LUA_EndFunctionTimer(timer);
|
||||
|
||||
lua_pop(gL, 1); // pop error handler
|
||||
|
||||
|
||||
+15
-15
@@ -652,7 +652,7 @@ static int line_get(lua_State *L)
|
||||
LUA_PushUserdata(L, &sides[line->sidenum[0]], META_SIDE);
|
||||
return 1;
|
||||
case line_backside: // backside
|
||||
if (line->sidenum[1] == 0xffff)
|
||||
if (line->sidenum[1] == NO_INDEX)
|
||||
return 0;
|
||||
LUA_PushUserdata(L, &sides[line->sidenum[1]], META_SIDE);
|
||||
return 1;
|
||||
@@ -1506,7 +1506,6 @@ enum mapheaderinfo_e
|
||||
mapheaderinfo_saveoverride,
|
||||
mapheaderinfo_levelflags,
|
||||
mapheaderinfo_menuflags,
|
||||
//mapheaderinfo_automap,
|
||||
mapheaderinfo_mobj_scale,
|
||||
};
|
||||
|
||||
@@ -1542,7 +1541,6 @@ static const char *const mapheaderinfo_opt[] = {
|
||||
"saveoverride",
|
||||
"levelflags",
|
||||
"menuflags",
|
||||
//"automap",
|
||||
"mobj_scale",
|
||||
NULL,
|
||||
};
|
||||
@@ -1584,10 +1582,11 @@ static int mapheaderinfo_get(lua_State *L)
|
||||
lua_pushinteger(L, header->muspos);
|
||||
break;
|
||||
case mapheaderinfo_musinterfadeout:
|
||||
lua_pushinteger(L, header->musinterfadeout);
|
||||
lua_pushinteger(L, 0); // unused
|
||||
break;
|
||||
case mapheaderinfo_musintername:
|
||||
lua_pushstring(L, header->musintername);
|
||||
// uhh psure its fine to just push nil instead of empty string?
|
||||
lua_pushstring(L, NULL);
|
||||
break;
|
||||
case mapheaderinfo_forcecharacter:
|
||||
lua_pushstring(L, header->forcecharacter);
|
||||
@@ -1641,10 +1640,10 @@ static int mapheaderinfo_get(lua_State *L)
|
||||
lua_pushinteger(L, header->levelselect);
|
||||
break;
|
||||
case mapheaderinfo_bonustype:
|
||||
lua_pushinteger(L, header->bonustype);
|
||||
lua_pushinteger(L, 0); // unused
|
||||
break;
|
||||
case mapheaderinfo_saveoverride:
|
||||
lua_pushinteger(L, header->saveoverride);
|
||||
lua_pushinteger(L, SAVE_DEFAULT); // unused
|
||||
break;
|
||||
case mapheaderinfo_levelflags:
|
||||
lua_pushinteger(L, header->levelflags);
|
||||
@@ -1652,28 +1651,29 @@ static int mapheaderinfo_get(lua_State *L)
|
||||
case mapheaderinfo_menuflags:
|
||||
lua_pushinteger(L, header->menuflags);
|
||||
break;
|
||||
/*case mapheaderinfo_automap:
|
||||
lua_pushstring(L, header->selectheading);
|
||||
break;*/
|
||||
case mapheaderinfo_mobj_scale:
|
||||
lua_pushfixed(L, header->mobj_scale);
|
||||
break;
|
||||
// TODO add support for reading numGradedMares and grades
|
||||
default:
|
||||
{
|
||||
// Read custom vars now
|
||||
// (note: don't include the "LUA." in your lua scripts!)
|
||||
UINT8 j = 0;
|
||||
for (;j < header->numCustomOptions && !fastcmp(lua_tostring(L, 2), header->customopts[j].option); ++j);
|
||||
if (!header->numCustomOptions) {
|
||||
lua_pushnil(L);
|
||||
break;
|
||||
}
|
||||
|
||||
if(j < header->numCustomOptions)
|
||||
UINT8 j = 0;
|
||||
const char *cusoptstr = lua_tostring(L, 2);
|
||||
for (;j < header->numCustomOptions && !fastcmp(cusoptstr, header->customopts[j].option); ++j);
|
||||
|
||||
if (j < header->numCustomOptions)
|
||||
lua_pushstring(L, header->customopts[j].value);
|
||||
else
|
||||
lua_pushnil(L);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
int LUA_MapLib(lua_State *L)
|
||||
|
||||
@@ -0,0 +1,264 @@
|
||||
// DR. ROBOTNIK'S RING RACERS
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2025 by James Robert Roman
|
||||
// Copyright (C) 2025 by Kart Krew
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
// See the 'LICENSE' file for more details.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "screen.h"
|
||||
#include <algorithm>
|
||||
#include <cstddef>
|
||||
#include <unordered_map>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
|
||||
extern "C" {
|
||||
#include "blua/lua.h"
|
||||
};
|
||||
|
||||
#include "v_video.h"
|
||||
|
||||
#include "command.h"
|
||||
#include "doomtype.h"
|
||||
#include "i_system.h"
|
||||
#include "lua_profile.h"
|
||||
#include "m_perfstats.h"
|
||||
|
||||
extern "C" consvar_t cv_lua_profile;
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
precise_t g_time_reference;
|
||||
int g_tics_counted;
|
||||
|
||||
double g_running_tic_time;
|
||||
double g_avg_tic_time;
|
||||
|
||||
bool g_invalid;
|
||||
|
||||
}; // namespace
|
||||
|
||||
struct lua_timer_t
|
||||
{
|
||||
struct Stat
|
||||
{
|
||||
double calls = 0;
|
||||
double time = 0.0;
|
||||
};
|
||||
|
||||
Stat running, avg;
|
||||
};
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
std::unordered_map<std::string, lua_timer_t> g_tic_timers;
|
||||
|
||||
}; // namespace
|
||||
|
||||
lua_timer_t* LUA_BeginFunctionTimer(lua_State* L, int fn_idx, const char* name)
|
||||
{
|
||||
lua_Debug ar;
|
||||
|
||||
lua_pushvalue(L, fn_idx);
|
||||
lua_getinfo(L, ">S", &ar);
|
||||
|
||||
auto label = [&]
|
||||
{
|
||||
using sv = std::string_view;
|
||||
sv view{ar.source};
|
||||
|
||||
switch (view.front())
|
||||
{
|
||||
case '@': // file
|
||||
if (std::size_t p = view.rfind('/'); p != sv::npos) // lump or base
|
||||
{
|
||||
return view.substr(p + 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case '=': // ??
|
||||
view.remove_prefix(1);
|
||||
break;
|
||||
}
|
||||
|
||||
return view;
|
||||
};
|
||||
|
||||
// i sure hope this std::string mess is fine...
|
||||
auto [it, ins] = g_tic_timers.try_emplace(std::string(va("%s:%d (%s)", std::string(label()).c_str(), ar.linedefined, name)));
|
||||
auto& [key, timer] = *it;
|
||||
|
||||
g_time_reference = I_GetPreciseTime();
|
||||
|
||||
return &timer;
|
||||
}
|
||||
|
||||
void LUA_EndFunctionTimer(lua_timer_t* timer)
|
||||
{
|
||||
precise_t t = I_GetPreciseTime() - g_time_reference;
|
||||
double precision = I_GetPrecisePrecision();
|
||||
|
||||
timer->running.time += t / precision;
|
||||
timer->running.calls += 1.0;
|
||||
}
|
||||
|
||||
void LUA_ResetTicTimers(void)
|
||||
{
|
||||
if (cv_lua_profile.value <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_tics_counted < cv_lua_profile.value)
|
||||
{
|
||||
g_tics_counted++;
|
||||
|
||||
double precision = I_GetPrecisePrecision();
|
||||
g_running_tic_time += ps_prevtictime.value.p / precision;
|
||||
}
|
||||
else
|
||||
{
|
||||
double counted = g_tics_counted;
|
||||
|
||||
for (auto& [key, timer] : g_tic_timers)
|
||||
{
|
||||
timer.avg = {timer.running.calls / counted, timer.running.time / counted};
|
||||
timer.running = {};
|
||||
}
|
||||
|
||||
g_avg_tic_time = g_running_tic_time / counted;
|
||||
g_running_tic_time = 0.0;
|
||||
|
||||
g_tics_counted = 1;
|
||||
|
||||
g_invalid = false;
|
||||
}
|
||||
}
|
||||
|
||||
void LUA_RenderTimers(void)
|
||||
{
|
||||
constexpr int kRowHeight = 4;
|
||||
float row_y = kRowHeight;
|
||||
|
||||
// pretty much what the whole srb2::Draw does lol
|
||||
auto draw_row = [](float x, float y, INT32 flags, const char *str)
|
||||
{
|
||||
V_DrawSmallStringAtFixed(
|
||||
FloatToFixed(x),
|
||||
FloatToFixed(y),
|
||||
V_MONOSPACE|V_ALLOWLOWERCASE|flags,
|
||||
str
|
||||
);
|
||||
};
|
||||
|
||||
draw_row(0.f, 0.f, 0, va("-- AVERAGES PER TIC (over %d tics) --", cv_lua_profile.value));
|
||||
|
||||
if (g_invalid)
|
||||
{
|
||||
draw_row(0.f, row_y, V_GRAYMAP, " <Data pending>");
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<decltype(g_tic_timers)::iterator> view;
|
||||
view.reserve(g_tic_timers.size());
|
||||
|
||||
auto color_flag = [](double t)
|
||||
{
|
||||
if (t < 10.0)
|
||||
{
|
||||
return V_GRAYMAP;
|
||||
}
|
||||
else if (t >= 100.0)
|
||||
{
|
||||
return V_YELLOWMAP;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
{
|
||||
double cum = 0.0;
|
||||
|
||||
for (auto it = g_tic_timers.begin(); it != g_tic_timers.end(); ++it)
|
||||
{
|
||||
auto& [key, timer] = *it;
|
||||
|
||||
cum += timer.avg.time;
|
||||
|
||||
if (timer.avg.time > 0.0)
|
||||
{
|
||||
view.push_back(it);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
const INT32 tally_flags = color_flag(cum * 1'000'000.0);
|
||||
|
||||
draw_row(0.f, row_y, tally_flags, va("%8.2f us - TOTAL", cum * 1'000'000.0));
|
||||
draw_row(0.f, row_y + kRowHeight, tally_flags, va("%8.2f ms", cum * 1000.0));
|
||||
|
||||
// dont need to show this if we didnt capture over time
|
||||
// this would just show nan or inf anyways
|
||||
if (std::fpclassify(g_avg_tic_time) != FP_ZERO)
|
||||
{
|
||||
draw_row(0.f, row_y + kRowHeight * 2, tally_flags, va(
|
||||
"%8.2f%% overhead (%.2f / %.2f) <-- not counting rendering time",
|
||||
(cum / g_avg_tic_time) * 100.0,
|
||||
(cum * (double)TICRATE),
|
||||
(g_avg_tic_time * (double)TICRATE)
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
row_y += kRowHeight * 4;
|
||||
}
|
||||
|
||||
std::sort(
|
||||
view.rbegin(),
|
||||
view.rend(),
|
||||
[](auto a, auto b)
|
||||
{
|
||||
auto& [k1, t1] = *a;
|
||||
auto& [k2, t2] = *b;
|
||||
return t1.avg.time < t2.avg.time;
|
||||
}
|
||||
);
|
||||
|
||||
for (auto it : view)
|
||||
{
|
||||
auto& [key, timer] = *it;
|
||||
|
||||
double t = timer.avg.time * 1'000'000.0;
|
||||
|
||||
draw_row(0.f, row_y, color_flag(t), va(
|
||||
"%8.2f us %8.2f calls - %s",
|
||||
t,
|
||||
timer.avg.calls,
|
||||
key.c_str()
|
||||
));
|
||||
|
||||
row_y += kRowHeight;
|
||||
|
||||
// FIXME this is all ugly and sucks
|
||||
if (row_y >= BASEVIDHEIGHT)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" void lua_profile_OnChange(void)
|
||||
{
|
||||
g_invalid = true;
|
||||
|
||||
if (cv_lua_profile.value == 0)
|
||||
{
|
||||
g_tic_timers = {};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
// DR. ROBOTNIK'S RING RACERS
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 2025 by James Robert Roman
|
||||
// Copyright (C) 2025 by Kart Krew
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
// See the 'LICENSE' file for more details.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef lua_profile_h
|
||||
#define lua_profile_h
|
||||
|
||||
#include "blua/lua.h"
|
||||
#include "doomtype.h"
|
||||
//#include "typedef.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct lua_timer_t;
|
||||
typedef struct lua_timer_t lua_timer_t;
|
||||
|
||||
void LUA_ResetTicTimers(void);
|
||||
|
||||
lua_timer_t *LUA_BeginFunctionTimer(lua_State *L, int fn_idx, const char *name);
|
||||
void LUA_EndFunctionTimer(lua_timer_t *timer);
|
||||
|
||||
void LUA_RenderTimers(void);
|
||||
|
||||
void lua_profile_OnChange(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif/*lua_profile_h*/
|
||||
+21
-9
@@ -713,9 +713,12 @@ static UINT8 GetUserdataArchType(int index)
|
||||
|
||||
static UINT8 ArchiveValue(UINT8 **p, int TABLESINDEX, int myindex)
|
||||
{
|
||||
int type = lua_type(gL, myindex);
|
||||
|
||||
if (myindex < 0)
|
||||
myindex = lua_gettop(gL)+1+myindex;
|
||||
switch (lua_type(gL, myindex))
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case LUA_TNONE:
|
||||
case LUA_TNIL:
|
||||
@@ -725,8 +728,12 @@ static UINT8 ArchiveValue(UINT8 **p, int TABLESINDEX, int myindex)
|
||||
case LUA_TLIGHTUSERDATA:
|
||||
case LUA_TTHREAD:
|
||||
case LUA_TFUNCTION:
|
||||
{
|
||||
const char *typestr = (type == LUA_TLIGHTUSERDATA ? "light userdata" : (type == LUA_TTHREAD ? "thread" : (type == LUA_TFUNCTION ? "function" : "??")));
|
||||
CONS_Alert(CONS_ERROR, M_GetText("Archived an invalid value! (%s)\n"), typestr);
|
||||
WRITEUINT8(*p, ARCH_NULL);
|
||||
return 2;
|
||||
}
|
||||
case LUA_TBOOLEAN:
|
||||
WRITEUINT8(*p, ARCH_BOOLEAN);
|
||||
WRITEUINT8(*p, lua_toboolean(gL, myindex));
|
||||
@@ -979,7 +986,7 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
|
||||
|
||||
if (!gL)
|
||||
{
|
||||
if (fastcmp(ptype,"player")) // players must always be included, even if no vars
|
||||
if (fastcmp(ptype, "player")) // players must always be included, even if no vars
|
||||
WRITEUINT16(*p, 0);
|
||||
return;
|
||||
}
|
||||
@@ -995,7 +1002,7 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
|
||||
if (!lua_istable(gL, -1))
|
||||
{ // no extra values table
|
||||
lua_pop(gL, 1);
|
||||
if (fastcmp(ptype,"player")) // players must always be included, even if no vars
|
||||
if (fastcmp(ptype, "player")) // players must always be included, even if no vars
|
||||
WRITEUINT16(*p, 0);
|
||||
return;
|
||||
}
|
||||
@@ -1007,13 +1014,13 @@ static void ArchiveExtVars(UINT8 **p, void *pointer, const char *ptype)
|
||||
// skip anything that has an empty table and isn't a player.
|
||||
if (i == 0)
|
||||
{
|
||||
if (fastcmp(ptype,"player")) // always include players even if they have no extra variables
|
||||
if (fastcmp(ptype, "player")) // always include players even if they have no extra variables
|
||||
WRITEUINT16(*p, 0);
|
||||
lua_pop(gL, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (fastcmp(ptype,"mobj")) // mobjs must write their mobjnum as a header
|
||||
if (fastcmp(ptype, "mobj")) // mobjs must write their mobjnum as a header
|
||||
WRITEUINT32(*p, ((mobj_t *)pointer)->mobjnum);
|
||||
|
||||
WRITEUINT16(*p, i);
|
||||
@@ -1065,8 +1072,9 @@ static void ArchiveTables(UINT8 **p)
|
||||
n++; // the table contained a new table we'll have to archive. :(
|
||||
else if (e == 2) // invalid key type (function, thread, lightuserdata, or anything we don't recognise)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -2), luaL_typename(gL, -2), i);
|
||||
lua_pop(gL, 1);
|
||||
lua_pushvalue(gL, -2); // copy key for error message (lua_tostring may mutate it which confuses lua_next)
|
||||
CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -1), luaL_typename(gL, -1), i);
|
||||
lua_pop(gL, 2); // pop key copy and value
|
||||
continue;
|
||||
}
|
||||
else if (e == 3) // nil key due to invalid userdata. NOT an error.
|
||||
@@ -1080,11 +1088,15 @@ static void ArchiveTables(UINT8 **p)
|
||||
if (e == 1)
|
||||
n++; // the table contained a new table we'll have to archive. :(
|
||||
else if (e == 2) // invalid value type
|
||||
CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -2), luaL_typename(gL, -1));
|
||||
{
|
||||
lua_pushvalue(gL, -2); // copy key for error message (same as above)
|
||||
CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -1), luaL_typename(gL, -2));
|
||||
lua_pop(gL, 1); // pop key copy
|
||||
}
|
||||
|
||||
lua_pop(gL, 1);
|
||||
|
||||
}
|
||||
|
||||
lua_pop(gL, 1);
|
||||
WRITEUINT8(*p, ARCH_TEND);
|
||||
}
|
||||
|
||||
@@ -13,6 +13,10 @@
|
||||
#define LZF_H
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***********************************************************************
|
||||
**
|
||||
** lzf -- an extremely fast/free compression/decompression-method
|
||||
@@ -71,5 +75,9 @@ size_t
|
||||
lzf_decompress (const void *const in_data, size_t in_len,
|
||||
void *out_data, size_t out_len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
+1
-1
@@ -556,7 +556,7 @@ static void GIF_framewrite(void)
|
||||
}
|
||||
else if (gif_dynamicdelay ==(UINT8) 1)
|
||||
{
|
||||
float delayf = ceil(100.0f/NEWTICRATE);
|
||||
float delayf = ceilf(100.0f/NEWTICRATE);
|
||||
|
||||
delay = (UINT16)((I_GetPreciseTime() - gif_prevframetime)) / (I_GetPrecisePrecision() / 1000000) /10/1000;
|
||||
|
||||
|
||||
@@ -249,9 +249,6 @@ boolean cht_Responder(event_t *ev)
|
||||
#define REQUIRE_SINGLEPLAYER if (netgame || multiplayer)\
|
||||
{ CONS_Printf(M_GetText("This only works in single player.\n")); return; }
|
||||
|
||||
#define REQUIRE_NOULTIMATE if (ultimatemode)\
|
||||
{ CONS_Printf(M_GetText("You're too good to be cheating!\n")); return; }
|
||||
|
||||
// command that can be typed at the console!
|
||||
void Command_CheatNoClip_f(void)
|
||||
{
|
||||
@@ -259,7 +256,6 @@ void Command_CheatNoClip_f(void)
|
||||
|
||||
REQUIRE_INLEVEL;
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
plyr = &players[consoleplayer];
|
||||
plyr->pflags ^= PF_NOCLIP;
|
||||
@@ -274,7 +270,6 @@ void Command_CheatGod_f(void)
|
||||
|
||||
REQUIRE_INLEVEL;
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
plyr = &players[consoleplayer];
|
||||
plyr->pflags ^= PF_GODMODE;
|
||||
@@ -289,7 +284,6 @@ void Command_CheatNoTarget_f(void)
|
||||
|
||||
REQUIRE_INLEVEL;
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
plyr = &players[consoleplayer];
|
||||
plyr->pflags ^= PF_INVIS;
|
||||
@@ -593,7 +587,6 @@ void Command_Devmode_f(void)
|
||||
#ifndef _DEBUG
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
#endif
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
if (COM_Argc() > 1)
|
||||
{
|
||||
@@ -1048,7 +1041,6 @@ void Command_ObjectPlace_f(void)
|
||||
{
|
||||
REQUIRE_INLEVEL;
|
||||
REQUIRE_SINGLEPLAYER;
|
||||
REQUIRE_NOULTIMATE;
|
||||
|
||||
G_SetGameModified(multiplayer, true);
|
||||
|
||||
|
||||
@@ -29,7 +29,6 @@ void Command_ObjectPlace_f(void);
|
||||
void Command_Writethings_f(void);
|
||||
|
||||
extern consvar_t cv_opflags, cv_mapthingnum, cv_speed;
|
||||
//extern consvar_t cv_snapto, cv_grid;
|
||||
|
||||
extern boolean objectplacing;
|
||||
extern mobjtype_t op_currentthing;
|
||||
@@ -48,18 +47,10 @@ void Command_CheatNoClip_f(void);
|
||||
void Command_CheatGod_f(void);
|
||||
void Command_CheatNoTarget_f(void);
|
||||
void Command_Savecheckpoint_f(void);
|
||||
/*void Command_Getallemeralds_f(void);
|
||||
void Command_Resetemeralds_f(void);
|
||||
void Command_Setrings_f(void);
|
||||
void Command_Setlives_f(void);
|
||||
void Command_Setcontinues_f(void);*/
|
||||
void Command_Devmode_f(void);
|
||||
void Command_Scale_f(void);
|
||||
void Command_Gravflip_f(void);
|
||||
void Command_Hurtme_f(void);
|
||||
/*void Command_JumpToAxis_f(void);
|
||||
void Command_Charability_f(void);
|
||||
void Command_Charspeed_f(void);*/
|
||||
void Command_Teleport_f(void);
|
||||
void Command_RTeleport_f(void);
|
||||
void Command_Skynum_f(void);
|
||||
|
||||
+3
-22
@@ -479,32 +479,13 @@ UINT8 M_CheckLevelEmblems(void)
|
||||
// Update Score, Time, Rings emblems
|
||||
for (i = 0; i < numemblems; ++i)
|
||||
{
|
||||
if (emblemlocations[i].type <= ET_SKIN || emblemlocations[i].collected)
|
||||
// Requires time on map <= x
|
||||
if (emblemlocations[i].type != ET_TIME || emblemlocations[i].collected)
|
||||
continue;
|
||||
|
||||
levelnum = emblemlocations[i].level;
|
||||
valToReach = emblemlocations[i].var;
|
||||
|
||||
switch (emblemlocations[i].type)
|
||||
{
|
||||
/*case ET_SCORE: // Requires score on map >= x
|
||||
res = (G_GetBestScore(levelnum) >= (unsigned)valToReach);
|
||||
break;*/
|
||||
case ET_TIME: // Requires time on map <= x
|
||||
res = (G_GetBestTime(levelnum) <= (unsigned)valToReach);
|
||||
break;
|
||||
/*case ET_RINGS: // Requires rings on map >= x
|
||||
res = (G_GetBestRings(levelnum) >= valToReach);
|
||||
break;
|
||||
case ET_NGRADE: // Requires NiGHTS grade on map >= x
|
||||
res = (G_GetBestNightsGrade(levelnum, 0) >= valToReach);
|
||||
break;
|
||||
case ET_NTIME: // Requires NiGHTS time on map <= x
|
||||
res = (G_GetBestNightsTime(levelnum, 0) <= (unsigned)valToReach);
|
||||
break;*/
|
||||
default: // unreachable but shuts the compiler up.
|
||||
continue;
|
||||
}
|
||||
res = (G_GetBestTime(levelnum) <= (unsigned)valToReach);
|
||||
|
||||
emblemlocations[i].collected = res;
|
||||
if (res)
|
||||
|
||||
@@ -27,21 +27,11 @@ typedef enum
|
||||
UC_MATCHESPLAYED, // SRB2Kart: MATCHESPLAYED [x played]
|
||||
UC_GAMECLEAR, // GAMECLEAR <x times>
|
||||
UC_ALLEMERALDS, // ALLEMERALDS <x times>
|
||||
//UC_ULTIMATECLEAR, // ULTIMATECLEAR <x times>
|
||||
//UC_OVERALLSCORE, // OVERALLSCORE [score to beat]
|
||||
UC_OVERALLTIME, // OVERALLTIME [time to beat, tics]
|
||||
//UC_OVERALLRINGS, // OVERALLRINGS [rings to beat]
|
||||
UC_MAPVISITED, // MAPVISITED [map number]
|
||||
UC_MAPBEATEN, // MAPBEATEN [map number]
|
||||
UC_MAPALLEMERALDS, // MAPALLEMERALDS [map number]
|
||||
//UC_MAPULTIMATE, // MAPULTIMATE [map number]
|
||||
//UC_MAPPERFECT, // MAPPERFECT [map number]
|
||||
//UC_MAPSCORE, // MAPSCORE [map number] [score to beat]
|
||||
UC_MAPTIME, // MAPTIME [map number] [time to beat, tics]
|
||||
//UC_MAPRINGS, // MAPRINGS [map number] [rings to beat]
|
||||
//UC_NIGHTSSCORE, // NIGHTSSCORE [map number] <mare, omit or "0" for overall> [score to beat]
|
||||
//UC_NIGHTSTIME, // NIGHTSTIME [map number] <mare, omit "0" overall> [time to beat, tics]
|
||||
//UC_NIGHTSGRADE, // NIGHTSGRADE [map number] <mare, omit "0" overall> [grade]
|
||||
UC_TRIGGER, // TRIGGER [trigger number]
|
||||
UC_TOTALEMBLEMS, // TOTALEMBLEMS [number of emblems]
|
||||
UC_EMBLEM, // EMBLEM [emblem number]
|
||||
|
||||
+1
-1
@@ -278,7 +278,7 @@ void M_DrawScaledEmote(fixed_t x, fixed_t y, fixed_t scale, emote_t *emote, INT3
|
||||
static void Command_ListEmotes_f(void)
|
||||
{
|
||||
const int EMOTES_PER_PAGE = 24;
|
||||
const int NUMPAGES = std::max<int>(emotes.size()/EMOTES_PER_PAGE, 1);
|
||||
const int NUMPAGES = emotes.size()/EMOTES_PER_PAGE + (emotes.size() % EMOTES_PER_PAGE != 0 ? 1 : 0);
|
||||
int page = 1;
|
||||
|
||||
if (COM_Argc() > 1)
|
||||
|
||||
@@ -62,6 +62,9 @@ FUNCMATH fixed_t FixedHypot(fixed_t x, fixed_t y)
|
||||
angle_t angle;
|
||||
fixed_t dist;
|
||||
|
||||
I_Assert(x != INT32_MIN);
|
||||
I_Assert(y != INT32_MIN);
|
||||
|
||||
x = abs(x);
|
||||
y = abs(y);
|
||||
|
||||
@@ -77,6 +80,10 @@ FUNCMATH fixed_t FixedHypot(fixed_t x, fixed_t y)
|
||||
if (!y)
|
||||
return x;
|
||||
|
||||
// prevent underflow
|
||||
if (y == INT32_MIN)
|
||||
return INT32_MAX;
|
||||
|
||||
angle = (tantoangle[FixedDiv(y, x)>>DBITS] + ANGLE_90) >> ANGLETOFINESHIFT;
|
||||
|
||||
// use as cosine
|
||||
|
||||
+177
-234
@@ -149,13 +149,8 @@ M_waiting_mode_t m_waiting_mode = M_NOT_WAITING;
|
||||
|
||||
const char *quitmsg[NUM_QUITMESSAGES] = {};
|
||||
|
||||
// Stuff for customizing the player select screen Tails 09-22-2003
|
||||
description_t description[MAXSKINS] = {};
|
||||
|
||||
INT32 mapwads[NUMMAPS] = {};
|
||||
|
||||
boolean browselocalskins = false;
|
||||
|
||||
boolean menuactive = false;
|
||||
boolean fromlevelselect = false;
|
||||
|
||||
@@ -186,8 +181,8 @@ static INT16 itemOn = 1; // menu item skull is on, Hack by Tails 09-18-2002
|
||||
static INT16 skullAnimCounter = 10; // skull animation counter
|
||||
static boolean interpTimerHackAllow = 0;
|
||||
|
||||
static UINT8 setupcontrolplayer;
|
||||
static INT32 (*setupcontrols)[2]; // pointer to the gamecontrols of the player being edited
|
||||
static UINT8 setupcontrolplayer;
|
||||
static INT32 (*setupcontrols)[2]; // pointer to the gamecontrols of the player being edited
|
||||
|
||||
// shhh... what am I doing... nooooo!
|
||||
static INT32 vidm_testingmode = 0;
|
||||
@@ -201,8 +196,8 @@ static char setupm_ip[64];
|
||||
static textinput_t setupm_input_ip;
|
||||
|
||||
|
||||
static fixed_t multi_tics;
|
||||
static state_t *multi_state;
|
||||
static fixed_t multi_tics;
|
||||
static state_t *multi_state;
|
||||
|
||||
// this is set before entering the MultiPlayer setup menu,
|
||||
// for either player 1 or 2
|
||||
@@ -217,12 +212,19 @@ static INT32 setupm_fakeskin;
|
||||
static INT32 setupm_fakecolor;
|
||||
static UINT8 setupm_pselect = 1;
|
||||
|
||||
//variables used for other skin select menus
|
||||
// variables used for other skin select menus
|
||||
static UINT8 setupm_skinypos;
|
||||
static INT32 setupm_skinselect;
|
||||
static boolean setupm_skinlockedselect;
|
||||
|
||||
static UINT8 setupm_playernum; //brap
|
||||
static UINT8 setupm_playernum; // brap
|
||||
|
||||
// Addons Menu: Local mode
|
||||
static void M_LocalAddons(INT32 choice);
|
||||
static boolean addons_localmode = false;
|
||||
|
||||
#define LOCALMODE_KEY (KEY_RALT)
|
||||
#define AUTOLOAD_KEY (KEY_END)
|
||||
|
||||
//
|
||||
// PROTOTYPES
|
||||
@@ -328,7 +330,6 @@ static void M_EraseData(INT32 choice);
|
||||
|
||||
static void M_AddonsInternal();
|
||||
static void M_Addons(INT32 choice);
|
||||
static void M_LocalSkins(INT32 choice);
|
||||
static void M_AddonsOptions(INT32 choice);
|
||||
#define addonmenusize 9 // number of items actually displayed in the addons menu view, formerly (2*numaddonsshown + 1)
|
||||
#define numaddonsshown 4 // number of items to each side of the currently selected item, unless at top/bottom ends of directory
|
||||
@@ -412,6 +413,7 @@ static INT32 M_GetFirstLevelInList(void);
|
||||
|
||||
// crap to force hud to show when in saturns hud options
|
||||
boolean forceshowhud = false;
|
||||
boolean forceshowchat = false;
|
||||
|
||||
// smol text indicating if game is modified
|
||||
// so ppl dont wonder where their ra times went and stuff
|
||||
@@ -450,13 +452,13 @@ consvar_t cv_showallmaps = {"showallmaps", "No", CV_SAVE, CV_YesNo, NULL, 0, NUL
|
||||
consvar_t cv_showmusicfilename = {"showmusicfilename", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
static CV_PossibleValue_t serversort_cons_t[] = {
|
||||
{0,"Ping"},
|
||||
{1,"Modified State"},
|
||||
{2,"Most Players"},
|
||||
{3,"Least Players"},
|
||||
{4,"Max Player Slots"},
|
||||
{5,"Gametype"},
|
||||
{0,NULL}
|
||||
{0, "Ping"},
|
||||
{1, "Modified State"},
|
||||
{2, "Most Players"},
|
||||
{3, "Least Players"},
|
||||
{4, "Max Player Slots"},
|
||||
{5, "Gametype"},
|
||||
{0, NULL}
|
||||
};
|
||||
consvar_t cv_serversort = {"serversort", "Ping", CV_CALL, serversort_cons_t, M_SortServerList, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
@@ -499,32 +501,6 @@ static consvar_t cv_dummystaff = {"dummystaff", "0", CV_HIDEN|CV_CALL, dummystaf
|
||||
// all the menu definitions and onchanges reside in here now
|
||||
#include "m_menudefs.c"
|
||||
|
||||
static INT32 M_ShiftChar(INT32 ch)
|
||||
{
|
||||
if (I_UseNativeKeyboard())
|
||||
return ch;
|
||||
|
||||
if (cv_keyboardlayout.value == 3)
|
||||
{
|
||||
if (ch >= 32 && ch <= 141)
|
||||
{
|
||||
if (shiftdown)
|
||||
ch = shiftxform[ch];
|
||||
else if (altdown & 0x2)
|
||||
ch = french_altgrxform[ch];
|
||||
else
|
||||
ch = HU_FallBackFrSpecialLetter(ch);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (shiftdown && ch >= 32 && ch <= 127)
|
||||
ch = shiftxform[ch];
|
||||
}
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
//
|
||||
// M_GetGametypeColor
|
||||
//
|
||||
@@ -731,7 +707,7 @@ static void Dummystaff_OnChange(void)
|
||||
|
||||
dummystaffname[0] = '\0';
|
||||
|
||||
if ((l = W_CheckNumForName(va("%sS01",G_BuildMapName(cv_nextmap.value)))) == LUMPERROR)
|
||||
if ((l = W_CheckNumForName(va("%sS01", G_BuildMapName(cv_nextmap.value)))) == LUMPERROR)
|
||||
{
|
||||
CV_StealthSetValue(&cv_dummystaff, 0);
|
||||
return;
|
||||
@@ -740,7 +716,7 @@ static void Dummystaff_OnChange(void)
|
||||
{
|
||||
char *temp = dummystaffname;
|
||||
UINT8 numstaff = 1;
|
||||
while (numstaff < 99 && (l = W_CheckNumForName(va("%sS%02u",G_BuildMapName(cv_nextmap.value),numstaff+1))) != LUMPERROR)
|
||||
while (numstaff < 99 && (l = W_CheckNumForName(va("%sS%02u", G_BuildMapName(cv_nextmap.value), numstaff+1))) != LUMPERROR)
|
||||
numstaff++;
|
||||
|
||||
if (cv_dummystaff.value < 1)
|
||||
@@ -748,7 +724,7 @@ static void Dummystaff_OnChange(void)
|
||||
else if (cv_dummystaff.value > numstaff)
|
||||
CV_StealthSetValue(&cv_dummystaff, 1);
|
||||
|
||||
if ((l = W_CheckNumForName(va("%sS%02u",G_BuildMapName(cv_nextmap.value), cv_dummystaff.value))) == LUMPERROR)
|
||||
if ((l = W_CheckNumForName(va("%sS%02u", G_BuildMapName(cv_nextmap.value), cv_dummystaff.value))) == LUMPERROR)
|
||||
return; // shouldn't happen but might as well check...
|
||||
|
||||
G_UpdateStaffGhostName(l);
|
||||
@@ -833,7 +809,8 @@ static void M_ChangeCvar(INT32 choice)
|
||||
CV_SetValue(cv,skins[skinno].prefcolor);
|
||||
return;
|
||||
}
|
||||
CV_Set(cv,cv->defaultvalue);
|
||||
|
||||
CV_Set(cv, cv->defaultvalue);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -982,6 +959,7 @@ static void Command_Manual_f(void)
|
||||
{
|
||||
if (modeattacking)
|
||||
return;
|
||||
|
||||
M_StartControlPanel();
|
||||
M_Manual(INT32_MAX);
|
||||
itemOn = 0;
|
||||
@@ -1024,9 +1002,9 @@ boolean M_Responder(event_t *ev)
|
||||
//case KEY_JOY1 + 2:
|
||||
ch = KEY_ENTER;
|
||||
break;
|
||||
/*case KEY_JOY1 + 3: // Brake can function as 'n' for message boxes now.
|
||||
ch = 'n';
|
||||
break;*/
|
||||
/*case KEY_JOY1 + 3: // Brake can function as 'n' for message boxes now.
|
||||
ch = 'n';
|
||||
break;*/
|
||||
case KEY_MOUSE1 + 1:
|
||||
//case KEY_JOY1 + 1:
|
||||
ch = KEY_BACKSPACE;
|
||||
@@ -1043,6 +1021,24 @@ boolean M_Responder(event_t *ev)
|
||||
case KEY_HAT1 + 3:
|
||||
ch = KEY_RIGHTARROW;
|
||||
break;
|
||||
//Local Addon Mode
|
||||
case LOCALMODE_KEY:
|
||||
{
|
||||
if (!(server || IsPlayerAdmin(consoleplayer)))
|
||||
break;
|
||||
|
||||
if (!addons_localmode)
|
||||
{
|
||||
S_StartSound(NULL, sfx_ding);
|
||||
addons_localmode = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
S_StartSound(NULL, sfx_jshard);
|
||||
addons_localmode = false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (menuactive)
|
||||
@@ -1054,11 +1050,12 @@ boolean M_Responder(event_t *ev)
|
||||
const INT32 jxdeadzone = ((JOYAXISRANGE-1) * max(cv_xdeadzone[0].value, FRACUNIT/2)) >> FRACBITS;
|
||||
const INT32 jydeadzone = ((JOYAXISRANGE-1) * max(cv_ydeadzone[0].value, FRACUNIT/2)) >> FRACBITS;
|
||||
INT32 accelaxis = abs(cv_moveaxis[0].value);
|
||||
|
||||
if (ev->data1 == 0)
|
||||
{
|
||||
if (ev->data3 != INT32_MAX)
|
||||
{
|
||||
if (Joystick[0].bGamepadStyle || abs(ev->data3) > jydeadzone)
|
||||
if (DigitalGamepadStyle(0) || abs(ev->data3) > jydeadzone)
|
||||
{
|
||||
if (joywaity < thistime
|
||||
&& (pjoyy == 0 || (ev->data3 < 0) != (pjoyy < 0))) // no previous direction OR change direction
|
||||
@@ -1074,7 +1071,7 @@ boolean M_Responder(event_t *ev)
|
||||
|
||||
if (ev->data2 != INT32_MAX && joywaitx < thistime)
|
||||
{
|
||||
if (Joystick[0].bGamepadStyle || abs(ev->data2) > jxdeadzone)
|
||||
if (DigitalGamepadStyle(0) || abs(ev->data2) > jxdeadzone)
|
||||
{
|
||||
if (joywaitx < thistime
|
||||
&& (pjoyx == 0 || (ev->data2 < 0) != (pjoyx < 0))) // no previous direction OR change direction
|
||||
@@ -1093,19 +1090,22 @@ boolean M_Responder(event_t *ev)
|
||||
// The following borrows heavily from Joy1Axis.
|
||||
const boolean xmode = (accelaxis%2);
|
||||
INT32 retaxis = 0;
|
||||
|
||||
if (!xmode)
|
||||
accelaxis--;
|
||||
accelaxis /= 2;
|
||||
|
||||
if (ev->data1 == accelaxis)
|
||||
{
|
||||
const INT32 jacceldeadzone = xmode ? jxdeadzone : jydeadzone;
|
||||
retaxis = xmode ? ev->data2 : ev->data3;
|
||||
|
||||
if (retaxis != INT32_MAX)
|
||||
{
|
||||
if (cv_moveaxis[0].value < 0)
|
||||
retaxis = -retaxis;
|
||||
|
||||
if (Joystick[0].bGamepadStyle || retaxis > jacceldeadzone)
|
||||
if (DigitalGamepadStyle(0) || retaxis > jacceldeadzone)
|
||||
{
|
||||
if (joywaitaccel < thistime && retaxis > pjoyaccel) // only on upwards event
|
||||
{
|
||||
@@ -1253,7 +1253,7 @@ boolean M_Responder(event_t *ev)
|
||||
// Handle menuitems which need a specific key handling
|
||||
if (routine && (currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_KEYHANDLER)
|
||||
{
|
||||
ch = M_ShiftChar(ch);
|
||||
ch = CON_ShiftChar(ch);
|
||||
routine(ch);
|
||||
return true;
|
||||
}
|
||||
@@ -1283,6 +1283,7 @@ boolean M_Responder(event_t *ev)
|
||||
void (*otherroutine)(event_t *sev) = currentMenu->menuitems[itemOn].itemaction;
|
||||
otherroutine(ev); //Alam: what a hack
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1305,12 +1306,21 @@ boolean M_Responder(event_t *ev)
|
||||
{
|
||||
playback_last_menu_interaction_leveltime = leveltime;
|
||||
// Flip left/right with up/down for the playback menu, since it's a horizontal icon row.
|
||||
|
||||
switch (ch)
|
||||
{
|
||||
case KEY_LEFTARROW: ch = KEY_UPARROW; break;
|
||||
case KEY_UPARROW: ch = KEY_RIGHTARROW; break;
|
||||
case KEY_RIGHTARROW: ch = KEY_DOWNARROW; break;
|
||||
case KEY_DOWNARROW: ch = KEY_LEFTARROW; break;
|
||||
case KEY_LEFTARROW:
|
||||
ch = KEY_UPARROW;
|
||||
break;
|
||||
case KEY_UPARROW:
|
||||
ch = KEY_RIGHTARROW;
|
||||
break;
|
||||
case KEY_RIGHTARROW:
|
||||
ch = KEY_DOWNARROW;
|
||||
break;
|
||||
case KEY_DOWNARROW:
|
||||
ch = KEY_LEFTARROW;
|
||||
break;
|
||||
|
||||
// arbitrary keyboard shortcuts because fuck you
|
||||
|
||||
@@ -1361,7 +1371,8 @@ boolean M_Responder(event_t *ev)
|
||||
G_AdjustView(4, 1, true);
|
||||
break;
|
||||
|
||||
default: break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1486,6 +1497,7 @@ boolean M_Responder(event_t *ev)
|
||||
}
|
||||
|
||||
return false;
|
||||
break;
|
||||
|
||||
default:
|
||||
CON_Responder(ev);
|
||||
@@ -1592,11 +1604,16 @@ static boolean ShouldDrawMenuBG(void)
|
||||
if (forceshowhud)
|
||||
return false;
|
||||
|
||||
if (forceshowchat)
|
||||
return false;
|
||||
|
||||
// camera options stuff, only do when in level
|
||||
if (gamestate == GS_LEVEL &&
|
||||
(currentMenu == &OP_CamOptionsDef || currentMenu == &OP_Player1CamOptionsDef
|
||||
|| currentMenu == &OP_Player2CamOptionsDef || currentMenu == &OP_Player3CamOptionsDef
|
||||
|| currentMenu == &OP_Player4CamOptionsDef))
|
||||
(currentMenu == &OP_CamOptionsDef ||
|
||||
currentMenu == &OP_Player1CamOptionsDef ||
|
||||
currentMenu == &OP_Player2CamOptionsDef ||
|
||||
currentMenu == &OP_Player3CamOptionsDef ||
|
||||
currentMenu == &OP_Player4CamOptionsDef))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@@ -1612,7 +1629,9 @@ void M_Drawer(void)
|
||||
if (currentMenu == &MessageDef)
|
||||
menuactive = true;
|
||||
|
||||
// pain and suffering
|
||||
forceshowhud = (gamestate == GS_LEVEL && menuactive && (currentMenu == &OP_SaturnHudDef || currentMenu == &OP_HudOffsetDef || currentMenu == &OP_NametagDef || currentMenu == &OP_DriftGaugeDef)); // holy fuick
|
||||
forceshowchat = (gamestate == GS_LEVEL && menuactive && currentMenu == &OP_ChatOptionsDef && (!OLDCHAT) && (itemOn == op_chat_boxwidth || itemOn == op_chat_boxheight || itemOn == op_chat_xoffs || itemOn == op_chat_yoffs || itemOn == op_chat_charlmt)); // man i dont gaf anymore lmao
|
||||
|
||||
if (menuactive)
|
||||
{
|
||||
@@ -1731,19 +1750,16 @@ void M_StartControlPanel(void)
|
||||
MPauseMenu[mpause_switchteam].status = IT_DISABLED;
|
||||
MPauseMenu[mpause_switchspectate].status = IT_DISABLED;
|
||||
MPauseMenu[mpause_psetup].status = IT_DISABLED;
|
||||
MPauseMenu[mpause_localaddons].status = IT_STRING | IT_CALL;
|
||||
|
||||
MISC_ChangeTeamMenu[0].status = IT_DISABLED;
|
||||
MISC_ChangeSpectateMenu[0].status = IT_DISABLED;
|
||||
|
||||
MPauseMenu[mpause_addlocalskins].status = IT_STRING | IT_CALL;
|
||||
MPauseMenu[mpause_localskin].status = IT_STRING | IT_CALL;
|
||||
|
||||
// Reset these in case splitscreen messes things up
|
||||
MPauseMenu[mpause_addons].alphaKey = 8;
|
||||
|
||||
if (IsPlayerAdmin(consoleplayer))
|
||||
MPauseMenu[mpause_addlocalskins].alphaKey = 16;
|
||||
else
|
||||
MPauseMenu[mpause_addlocalskins].alphaKey = 24;
|
||||
MPauseMenu[mpause_localaddons].alphaKey = 24;
|
||||
|
||||
MPauseMenu[mpause_scramble].alphaKey = 8;
|
||||
MPauseMenu[mpause_switchmap].alphaKey = 24;
|
||||
@@ -1761,14 +1777,13 @@ void M_StartControlPanel(void)
|
||||
{
|
||||
MPauseMenu[mpause_switchmap].status = IT_STRING | IT_CALL;
|
||||
MPauseMenu[mpause_addons].status = IT_STRING | IT_CALL;
|
||||
|
||||
MPauseMenu[mpause_localaddons].status = IT_DISABLED;
|
||||
if (G_GametypeHasTeams())
|
||||
MPauseMenu[mpause_scramble].status = IT_STRING | IT_SUBMENU;
|
||||
}
|
||||
|
||||
if (server || (!cv_showlocalskinmenus.value))
|
||||
{
|
||||
MPauseMenu[mpause_addlocalskins].status = IT_DISABLED;
|
||||
MPauseMenu[mpause_localskin].status = IT_DISABLED;
|
||||
|
||||
MPauseMenu[mpause_options].alphaKey = 64;
|
||||
@@ -1776,7 +1791,6 @@ void M_StartControlPanel(void)
|
||||
MPauseMenu[mpause_quit].alphaKey = 88;
|
||||
}
|
||||
|
||||
|
||||
if (splitscreen)
|
||||
{
|
||||
MPauseMenu[mpause_psetupsplit].status = MPauseMenu[mpause_psetupsplit2].status = IT_STRING | IT_CALL;
|
||||
@@ -1985,8 +1999,6 @@ void M_Ticker(void)
|
||||
//
|
||||
void M_Init(void)
|
||||
{
|
||||
UINT8 i;
|
||||
|
||||
COM_AddCommand("manual", Command_Manual_f);
|
||||
|
||||
CV_RegisterVar(&cv_nextmap);
|
||||
@@ -2032,15 +2044,6 @@ void M_Init(void)
|
||||
quitmsg[QUIT3MSG5] = M_GetText("You'll be back to play soon, though...\n...right?\n\n(Press 'Y' to quit)");
|
||||
quitmsg[QUIT3MSG6] = M_GetText("Aww, is Eggman's Nightclub too\ndifficult for you?\n\n(Press 'Y' to quit)");
|
||||
|
||||
// Setup PlayerMenu table
|
||||
for (i = 0; i < MAXSKINS; i++)
|
||||
{
|
||||
PlayerMenu[i].status = (i == 0 ? IT_CALL : IT_DISABLED);
|
||||
PlayerMenu[i].patch = PlayerMenu[i].text = NULL;
|
||||
PlayerMenu[i].itemaction = M_ChoosePlayer;
|
||||
PlayerMenu[i].alphaKey = 0;
|
||||
}
|
||||
|
||||
#ifdef HWRENDER
|
||||
// Permanently hide some options based on render mode
|
||||
if (rendermode == render_soft)
|
||||
@@ -2064,7 +2067,6 @@ void M_Init(void)
|
||||
OP_OpenGLOptionsMenu[op_gl_shader].status = IT_GRAYEDOUT;
|
||||
OP_OpenGLOptionsMenu[op_gl_lightdither].status = IT_GRAYEDOUT;
|
||||
OP_OpenGLOptionsMenu[op_gl_palrender].status = IT_GRAYEDOUT;
|
||||
OP_OpenGLOptionsMenu[op_gl_flashpal].status = IT_GRAYEDOUT;
|
||||
|
||||
OP_ExpOptionsMenu[op_exp_paldepth].status = IT_GRAYEDOUT;
|
||||
}
|
||||
@@ -2096,55 +2098,6 @@ void M_Init(void)
|
||||
M_TextInputInit(&menuinput, menu_text_input_buf, sizeof menu_text_input_buf);
|
||||
}
|
||||
|
||||
void M_InitCharacterTables(void)
|
||||
{
|
||||
UINT8 i;
|
||||
|
||||
// Setup PlayerMenu table
|
||||
for (i = 0; i < MAXSKINS; i++)
|
||||
{
|
||||
PlayerMenu[i].status = (i < 4 ? IT_CALL : IT_DISABLED);
|
||||
PlayerMenu[i].patch = PlayerMenu[i].text = NULL;
|
||||
PlayerMenu[i].itemaction = M_ChoosePlayer;
|
||||
PlayerMenu[i].alphaKey = 0;
|
||||
}
|
||||
|
||||
// Setup description table
|
||||
for (i = 0; i < MAXSKINS; i++)
|
||||
{
|
||||
if (i == 0)
|
||||
{
|
||||
strcpy(description[i].notes, "\x82Sonic\x80 is the fastest of the three, but also the hardest to control. Beginners beware, but experts will find Sonic very powerful.\n\n\x82""Ability:\x80 Speed Thok\nDouble jump to zoom forward with a huge burst of speed.\n\n\x82Tip:\x80 Simply letting go of forward does not slow down in SRB2. To slow down, hold the opposite direction.");
|
||||
strcpy(description[i].picname, "");
|
||||
strcpy(description[i].skinname, "sonic");
|
||||
}
|
||||
else if (i == 1)
|
||||
{
|
||||
strcpy(description[i].notes, "\x82Tails\x80 is the most mobile of the three, but has the slowest speed. Because of his mobility, he's well-\nsuited to beginners.\n\n\x82""Ability:\x80 Fly\nDouble jump to start flying for a limited time. Repetitively hit the jump button to ascend.\n\n\x82Tip:\x80 To quickly descend while flying, hit the spin button.");
|
||||
strcpy(description[i].picname, "");
|
||||
strcpy(description[i].skinname, "tails");
|
||||
}
|
||||
else if (i == 2)
|
||||
{
|
||||
strcpy(description[i].notes, "\x82Knuckles\x80 is well-\nrounded and can destroy breakable walls simply by touching them, but he can't jump as high as the other two.\n\n\x82""Ability:\x80 Glide & Climb\nDouble jump to glide in the air as long as jump is held. Glide into a wall to climb it.\n\n\x82Tip:\x80 Press spin while climbing to jump off the wall; press jump instead to jump off\nand face away from\nthe wall.");
|
||||
strcpy(description[i].picname, "");
|
||||
strcpy(description[i].skinname, "knuckles");
|
||||
}
|
||||
else if (i == 3)
|
||||
{
|
||||
strcpy(description[i].notes, "\x82Sonic & Tails\x80 team up to take on Dr. Eggman!\nControl Sonic while Tails desperately struggles to keep up.\n\nPlayer 2 can control Tails directly by setting the controls in the options menu.\nTails's directional controls are relative to Player 1's camera.\n\nTails can pick up Sonic while flying and carry him around.");
|
||||
strcpy(description[i].picname, "CHRS&T");
|
||||
strcpy(description[i].skinname, "sonic&tails");
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(description[i].notes, "???");
|
||||
strcpy(description[i].picname, "");
|
||||
strcpy(description[i].skinname, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
// SPECIAL MENU OPTION DRAW ROUTINES GO HERE
|
||||
// ==========================================================================
|
||||
@@ -2936,7 +2889,7 @@ static void M_PrepareLevelSelect(void)
|
||||
boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt)
|
||||
{
|
||||
// invalid mapnum
|
||||
if (mapnum < -1)
|
||||
if (mapnum < -1 || mapnum >= NUMMAPS)
|
||||
return false;
|
||||
|
||||
// Random map!
|
||||
@@ -3382,14 +3335,14 @@ static void M_AddonsInternal(void)
|
||||
static void M_Addons(INT32 choice)
|
||||
{
|
||||
(void)choice;
|
||||
browselocalskins = false;
|
||||
addons_localmode = false;
|
||||
M_AddonsInternal();
|
||||
}
|
||||
|
||||
static void M_LocalSkins(INT32 choice)
|
||||
static void M_LocalAddons(INT32 choice)
|
||||
{
|
||||
(void)choice;
|
||||
browselocalskins = true;
|
||||
addons_localmode = true;
|
||||
M_AddonsInternal();
|
||||
}
|
||||
|
||||
@@ -3558,8 +3511,8 @@ static void M_DrawAddons(void)
|
||||
|
||||
if (Playing())
|
||||
{
|
||||
if (browselocalskins)
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, 5, V_ALLOWLOWERCASE, "Load \x83local skins\x80 from addons!");
|
||||
if (addons_localmode) // Draw notice that you're adding locally
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, 5, V_ALLOWLOWERCASE, "Load addons or \x83local skins\x80 locally!");
|
||||
else
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, 5, warningflags, "Adding files mid-game may cause problems.");
|
||||
}
|
||||
@@ -3722,7 +3675,10 @@ static void M_DrawAddons(void)
|
||||
//m = numwadfiles-(mainwads+2+1);
|
||||
//V_DrawCenteredString(BASEVIDWIDTH/2, y+24, (majormods ? highlightflags : V_TRANSLUCENT), va("%d ADD-ON%s LOADED", (int)m, (m == 1) ? "" : "S")); //+2 for music, sounds, +1 for main.kart
|
||||
|
||||
V_DrawThinString(0, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_TRANSLUCENT|V_ALLOWLOWERCASE, ("END Key - Add addon to autoload"));
|
||||
V_DrawThinString(0, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_TRANSLUCENT|V_ALLOWLOWERCASE, va("%s Key - Add addon to autoload", G_KeynumToString(AUTOLOAD_KEY)));
|
||||
|
||||
if (Playing() && (server || IsPlayerAdmin(consoleplayer)))
|
||||
V_DrawThinString(0, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_TRANSLUCENT|V_ALLOWLOWERCASE, va("%s Key - Switch to local addon mode", G_KeynumToString(LOCALMODE_KEY)));
|
||||
}
|
||||
|
||||
static void M_AddonExec(INT32 ch)
|
||||
@@ -3744,7 +3700,7 @@ static void M_AddonAutoLoad(INT32 ch)
|
||||
FILE *autoloadconfigfile;
|
||||
|
||||
// check our controls //
|
||||
if (ch != 'y' && ch != KEY_ENTER && ch != KEY_END)
|
||||
if (ch != 'y' && ch != KEY_ENTER && ch != AUTOLOAD_KEY)
|
||||
{
|
||||
S_StartSound(NULL, sfx_s26d);
|
||||
return;
|
||||
@@ -3758,7 +3714,7 @@ static void M_AddonAutoLoad(INT32 ch)
|
||||
switch (dirmenu[dir_on[menudepthleft]][DIR_TYPE])
|
||||
{
|
||||
case EXT_FOLDER:
|
||||
M_StartMessage(va("%c%s\x80\nAutoloading folders is not supported as of yet. \n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),NULL,MM_NOTHING);
|
||||
M_StartMessage(va("%c%s\x80\nAutoloading folders is not supported as of yet. \n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING), NULL, MM_NOTHING);
|
||||
break;
|
||||
case EXT_TXT:
|
||||
case EXT_CFG:
|
||||
@@ -3899,7 +3855,7 @@ static void M_HandleAddons(INT32 choice)
|
||||
}
|
||||
break;
|
||||
case EXT_TXT:
|
||||
M_StartMessage(va("%c%s\x80\nThis file may not be a console script.\nAttempt to run anyways? \n\n(Press 'Y' to confirm)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),M_AddonExec,MM_YESNO);
|
||||
M_StartMessage(va("%c%s\x80\nThis file may not be a console script.\nAttempt to run anyways? \n\n(Press 'Y' to confirm)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING), M_AddonExec, MM_YESNO);
|
||||
break;
|
||||
case EXT_CFG:
|
||||
M_AddonExec(KEY_ENTER);
|
||||
@@ -3912,30 +3868,40 @@ static void M_HandleAddons(INT32 choice)
|
||||
case EXT_KART:
|
||||
#endif
|
||||
case EXT_PK3:
|
||||
if (browselocalskins)
|
||||
{
|
||||
if (DumbStartsWith("KC_", dirmenu[dir_on[menudepthleft]]+DIR_STRING) || DumbStartsWith("kc_", dirmenu[dir_on[menudepthleft]]+DIR_STRING)) {
|
||||
M_StartMessage(va("%c%s\x80\nYou are loading a local skin.\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),NULL,MM_NOTHING);
|
||||
COM_BufAddText(va("addfilelocal \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING));
|
||||
const char *addonname = dirmenu[dir_on[menudepthleft]]+DIR_STRING;
|
||||
|
||||
if (addons_localmode)
|
||||
{
|
||||
if (DumbStartsWith("KC_", addonname) || DumbStartsWith("kc_", addonname))
|
||||
{
|
||||
M_StartMessage(va("%c%s\x80\nYou are loading a local skin.\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), addonname), NULL, MM_NOTHING);
|
||||
}
|
||||
else if (DumbStartsWith("KCL_", addonname) || DumbStartsWith("kcl_", addonname)) // skins with lua
|
||||
{
|
||||
M_StartMessage(va("%c%s\x80\nYou are loading a local skin with lua.\nBeware that this may cause issues like crashes or desyncs in some cases!\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), addonname), NULL, MM_NOTHING);
|
||||
}
|
||||
// no need to account for KRC cases
|
||||
|
||||
COM_BufAddText(va("addfilelocal \"%s%s\"", menupath, addonname));
|
||||
}
|
||||
else
|
||||
S_StartSound(NULL, sfx_s26d);
|
||||
}
|
||||
else
|
||||
{
|
||||
COM_BufAddText(va("addfile \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING));
|
||||
{
|
||||
COM_BufAddText(va("addfile \"%s%s\"", menupath, addonname));
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
S_StartSound(NULL, sfx_s26d);
|
||||
}
|
||||
}
|
||||
|
||||
if (refresh)
|
||||
refreshdirmenu |= REFRESHDIR_NORMAL;
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_END:
|
||||
case AUTOLOAD_KEY:
|
||||
{
|
||||
boolean refresh = true;
|
||||
if (!dirmenu[dir_on[menudepthleft]])
|
||||
@@ -4002,6 +3968,8 @@ static void M_HandleAddons(INT32 choice)
|
||||
M_SetupNextMenu(currentMenu->prevMenu);
|
||||
else
|
||||
M_ClearMenus(true);
|
||||
|
||||
addons_localmode = false; //Exiting this menu, disable addons_localmode already.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4016,16 +3984,16 @@ boolean replaynamesloaded = false;
|
||||
#ifdef HAVE_THREADS
|
||||
I_mutex replayquerymutex;
|
||||
|
||||
// g_in_exiting_signal_handler is an evil hack
|
||||
// I_In_Exiting_Signal_Handler is an evil hack
|
||||
// to avoid infinite SIGABRT recursion in the signal handler
|
||||
// due to poisoned locks or mach-o kernel not supporting locks in signals
|
||||
// or something like that. idk
|
||||
# define Lock_search_state() if (!g_in_exiting_signal_handler) { I_lock_mutex(&replayquerymutex); }
|
||||
# define Unlock_search_state() if (!g_in_exiting_signal_handler) { I_unlock_mutex(replayquerymutex); }
|
||||
#else/*HAVE_THREADS*/
|
||||
# define Lock_search_state() if (!I_In_Exiting_Signal_Handler()) { I_lock_mutex(&replayquerymutex); }
|
||||
# define Unlock_search_state() if (!I_In_Exiting_Signal_Handler()) { I_unlock_mutex(replayquerymutex); }
|
||||
#else /*HAVE_THREADS*/
|
||||
# define Lock_search_state()
|
||||
# define Unlock_search_state()
|
||||
#endif/*HAVE_THREADS*/
|
||||
#endif /*HAVE_THREADS*/
|
||||
|
||||
|
||||
#define MAXREPLAYQUERY 37
|
||||
@@ -4113,6 +4081,9 @@ static void AddCheckedReplay(void)
|
||||
// Check up to maxnum replays if they match with query
|
||||
static void M_HutCheckReplays(size_t maxnum)
|
||||
{
|
||||
// Stripped of color codes
|
||||
char demo_title[sizeof(demolist_all[0].title)];
|
||||
|
||||
if (!replaynamesloaded)
|
||||
return;
|
||||
|
||||
@@ -4145,7 +4116,9 @@ static void M_HutCheckReplays(size_t maxnum)
|
||||
case MD_NOTLOADED:
|
||||
case MD_OUTDATED:
|
||||
case MD_LOADED:
|
||||
if (demolist_all[replayquerycheck].title[0] && strcasestr(demolist_all[replayquerycheck].title, replayqueryinput.buffer) != NULL)
|
||||
StripColors(demo_title, demolist_all[replayquerycheck].title, sizeof(demo_title));
|
||||
|
||||
if (demolist_all[replayquerycheck].title[0] && strcasestr(demo_title, replayqueryinput.buffer) != NULL)
|
||||
AddCheckedReplay(); // It matches, add it!
|
||||
else
|
||||
replayquerycheck++; // Doesn't match, moving on...
|
||||
@@ -4905,6 +4878,7 @@ static void M_HutStartReplay(INT32 choice)
|
||||
demo.loadfiles = (itemOn == 0);
|
||||
demo.ignorefiles = (itemOn != 0);
|
||||
|
||||
CONS_Printf(M_GetText("Playing back demo '%s'.\n"), demolist[dir_on[menudepthleft]].filepath);
|
||||
G_DoPlayDemo(demolist[dir_on[menudepthleft]].filepath);
|
||||
}
|
||||
|
||||
@@ -5402,7 +5376,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
|
||||
}
|
||||
|
||||
if (cvar->flags & CV_NETVAR)
|
||||
OP_CustomCvarMenu[ccvarposition] = (menuitem_t){ IT_STRING | IT_CVAR , NULL, Z_StrDup(va("\x85 %s", name)), cvar, ccvaralphakey };
|
||||
OP_CustomCvarMenu[ccvarposition] = (menuitem_t){ IT_STRING | IT_CVAR, NULL, Z_StrDup(va("\x85 %s", name)), cvar, ccvaralphakey };
|
||||
else
|
||||
OP_CustomCvarMenu[ccvarposition] = (menuitem_t){ IT_STRING | IT_CVAR, NULL, Z_StrDup(name), cvar, ccvaralphakey };
|
||||
|
||||
@@ -5522,7 +5496,6 @@ static void M_DrawChecklist(void)
|
||||
|
||||
if (conditionSets[unlockables[i].conditionset - 1].numconditions)
|
||||
{
|
||||
c = 0;
|
||||
lastid = -1;
|
||||
|
||||
for (c = 0; c < conditionSets[unlockables[i].conditionset - 1].numconditions; c++)
|
||||
@@ -5682,9 +5655,6 @@ static void M_DrawMusicTest(void)
|
||||
{
|
||||
INT32 x, y, i;
|
||||
|
||||
x = 90<<FRACBITS;
|
||||
y = (BASEVIDHEIGHT-32)<<FRACBITS;
|
||||
|
||||
y = (BASEVIDWIDTH-vid.scaledwidth)/2;
|
||||
|
||||
V_DrawFill(y-1, 20, vid.scaledwidth+1, 24, 239);
|
||||
@@ -6470,7 +6440,7 @@ static void M_ChooseTimeAttack(INT32 choice)
|
||||
static void M_HandleStaffReplay(INT32 choice)
|
||||
{
|
||||
boolean exitmenu = false; // exit to previous menu
|
||||
lumpnum_t l = W_CheckNumForName(va("%sS%02u",G_BuildMapName(cv_nextmap.value),cv_dummystaff.value));
|
||||
lumpnum_t l = W_CheckNumForName(va("%sS%02u", G_BuildMapName(cv_nextmap.value), cv_dummystaff.value));
|
||||
|
||||
switch (choice)
|
||||
{
|
||||
@@ -6500,7 +6470,7 @@ static void M_HandleStaffReplay(INT32 choice)
|
||||
M_ClearMenus(true);
|
||||
modeattacking = ATTACKING_RECORD;
|
||||
demo.loadfiles = false; demo.ignorefiles = true; // Just assume that record attack replays have the files needed
|
||||
G_DoPlayDemo(va("%sS%02u",G_BuildMapName(cv_nextmap.value),cv_dummystaff.value));
|
||||
G_DoPlayDemo(va("%sS%02u", G_BuildMapName(cv_nextmap.value), cv_dummystaff.value));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -7680,7 +7650,11 @@ Update the maxplayers label...
|
||||
|
||||
// draw name string
|
||||
if (itemOn != 9)
|
||||
V_DrawString(x+8,y+12, V_ALLOWLOWERCASE, setupm_ip);
|
||||
{
|
||||
char buf[28];
|
||||
strlcpy(buf, setupm_ip, sizeof(buf));
|
||||
V_DrawString(x+8,y+12, V_ALLOWLOWERCASE, buf);
|
||||
}
|
||||
else
|
||||
M_DrawTextInputScroll(x+8, y+12, &setupm_input_ip, 0, SETUPM_IP_MAXSIZE);
|
||||
|
||||
@@ -7812,7 +7786,7 @@ static void M_SetupMultiHandler(INT32 choice)
|
||||
if (exitmenu)
|
||||
{
|
||||
if (currentMenu->prevMenu)
|
||||
M_SetupNextMenu (currentMenu->prevMenu);
|
||||
M_SetupNextMenu(currentMenu->prevMenu);
|
||||
else
|
||||
M_ClearMenus(true);
|
||||
}
|
||||
@@ -7941,25 +7915,24 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
INT32 tw = 0;
|
||||
spritedef_t *sprdef;
|
||||
spriteframe_t *sprframe;
|
||||
patch_t *statbg = (patch_t *)W_CachePatchName("K_STATBG", PU_PATCH);
|
||||
patch_t *statlr = (patch_t *)W_CachePatchName("K_STATLR", PU_PATCH);
|
||||
patch_t *statud = (patch_t *)W_CachePatchName("K_STATUD", PU_PATCH);
|
||||
patch_t *statdot = (patch_t *)W_CachePatchName("K_SDOT0", PU_PATCH);
|
||||
patch_t *patch;
|
||||
UINT8 frame;
|
||||
UINT8 speed;
|
||||
UINT8 weight;
|
||||
UINT8 i;
|
||||
UINT8 s, w;
|
||||
const UINT8 *flashcol = V_GetStringColormap(highlightflags);
|
||||
INT32 skinnum = 0;
|
||||
INT32 statx, staty;
|
||||
UINT32 speenframe;
|
||||
INT32 sltw, actw, hetw;
|
||||
UINT8 skintodisplay;
|
||||
INT32 nameboxaddy = 0;
|
||||
int statoffset = 0;
|
||||
int gridyoffset = 0;
|
||||
|
||||
const UINT8 *flashcol = V_GetStringColormap(highlightflags);
|
||||
patch_t *statbg = (patch_t *)W_CachePatchName("K_STATBG", PU_PATCH);
|
||||
patch_t *statlr = (patch_t *)W_CachePatchName("K_STATLR", PU_PATCH);
|
||||
patch_t *statud = (patch_t *)W_CachePatchName("K_STATUD", PU_PATCH);
|
||||
patch_t *statdot = (patch_t *)W_CachePatchName("K_SDOT0" , PU_PATCH);
|
||||
|
||||
mx = MP_PlayerSetupDef.x;
|
||||
my = MP_PlayerSetupDef.y;
|
||||
@@ -7974,8 +7947,6 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
switch (cv_skinselectmenu.value)
|
||||
{
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
nameboxaddy = 6;
|
||||
break;
|
||||
case SKINMENUTYPE_GRID:
|
||||
nameboxaddy = 6;
|
||||
break;
|
||||
@@ -7991,44 +7962,23 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
else
|
||||
M_DrawTextInput(mx + 40, my + nameboxaddy, &setupm_input, 0);
|
||||
|
||||
#define GETSELECTEDSKINNAME (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].realname : skins[setupm_fakeskin].realname)
|
||||
#define GETSELECTEDSPEED (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartspeed : skins[setupm_fakeskin].kartspeed)
|
||||
#define GETSELECTEDWEIGHT (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartweight : skins[setupm_fakeskin].kartweight)
|
||||
|
||||
// draw skin string
|
||||
st = V_StringWidth(skins[setupm_fakeskin].realname, 0);
|
||||
switch (cv_skinselectmenu.value)
|
||||
{
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
#define GETSELECTEDSKINNAME (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].realname : skins[setupm_fakeskin].realname)
|
||||
#define GETSELECTEDSPEED (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartspeed : skins[setupm_fakeskin].kartspeed)
|
||||
#define GETSELECTEDWEIGHT (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartweight : skins[setupm_fakeskin].kartweight)
|
||||
|
||||
statoffset = 0;
|
||||
tw = V_StringWidth("Character", 0);//V_StringWidth(GETSELECTEDSKINNAME, 0);
|
||||
st = V_StringWidth(GETSELECTEDSKINNAME, 0);
|
||||
|
||||
INT32 selectedskin = (itemOn == 1 && setupm_skinselect < numskins ? skinsorted[setupm_skinselect] : setupm_fakeskin);
|
||||
speed = skins[selectedskin].kartspeed;
|
||||
weight = skins[selectedskin].kartweight;
|
||||
|
||||
V_DrawString((mx+(tw/2)) - (st/2), my + 37,
|
||||
((MP_PlayerSetupMenu[2].status & IT_TYPE) == IT_SPACE ? V_TRANSLUCENT : 0) | highlightflags | V_ALLOWLOWERCASE,
|
||||
GETSELECTEDSKINNAME);
|
||||
if (statdp == true)
|
||||
statoffset = 50;
|
||||
else
|
||||
statoffset = 113;
|
||||
|
||||
V_DrawString(statx - statoffset, staty - 10, V_6WIDTHSPACE, va("\x84%dS \x87%dW", GETSELECTEDSPEED, GETSELECTEDWEIGHT));
|
||||
#undef GETSELECTEDSKINNAME
|
||||
#undef GETSELECTEDSPEED
|
||||
#undef GETSELECTEDWEIGHT
|
||||
break;
|
||||
V_DrawString(statx - (statdp ? 50 : 113), staty - 10, V_6WIDTHSPACE, va("\x84%dS \x87%dW", GETSELECTEDSPEED, GETSELECTEDWEIGHT));
|
||||
/* FALLTHRU */
|
||||
case SKINMENUTYPE_GRID:
|
||||
#define GETSELECTEDSKINNAME (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].realname : skins[setupm_fakeskin].realname)
|
||||
tw = V_StringWidth("Character", 0);//V_StringWidth(GETSELECTEDSKINNAME, 0);
|
||||
tw = V_StringWidth("Character", 0);
|
||||
st = V_StringWidth(GETSELECTEDSKINNAME, 0);
|
||||
V_DrawString((mx+(tw/2)) - (st/2), my + 37,
|
||||
((MP_PlayerSetupMenu[2].status & IT_TYPE) == IT_SPACE ? V_TRANSLUCENT : 0) | highlightflags | V_ALLOWLOWERCASE,
|
||||
GETSELECTEDSKINNAME);
|
||||
#undef GETSELECTEDSKINNAME
|
||||
break;
|
||||
case SKINMENUTYPE_2D:
|
||||
|
||||
@@ -8106,8 +8056,6 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
break;
|
||||
}
|
||||
|
||||
#define GRIDSTATOFFSET 0
|
||||
|
||||
switch (cv_skinselectmenu.value)
|
||||
{
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
@@ -8119,9 +8067,6 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
if (itemOn == 1)
|
||||
V_DrawSmallString(statx+101, staty-37, V_6WIDTHSPACE|highlightflags, "BS: change");
|
||||
|
||||
#define GETSELECTEDSPEED (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartspeed : skins[setupm_fakeskin].kartspeed)
|
||||
#define GETSELECTEDWEIGHT (itemOn == 1 && setupm_skinselect < numskins ? skins[skinsorted[setupm_skinselect]].kartweight : skins[setupm_fakeskin].kartweight)
|
||||
|
||||
if (statdp == true)
|
||||
{
|
||||
//Background
|
||||
@@ -8151,22 +8096,19 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
}
|
||||
}
|
||||
|
||||
#undef GETSELECTEDSPEED
|
||||
#undef GETSELECTEDWEIGHT
|
||||
|
||||
break;
|
||||
case SKINMENUTYPE_GRID:
|
||||
// SRB2Kart: draw the stat backer
|
||||
// labels
|
||||
V_DrawSmallString(statx+12+GRIDSTATOFFSET, staty+67, V_6WIDTHSPACE|highlightflags, "Acceleration");
|
||||
V_DrawSmallString(statx+76+GRIDSTATOFFSET, staty+67, V_6WIDTHSPACE|highlightflags, "Max Speed");
|
||||
V_DrawSmallString(statx+14+GRIDSTATOFFSET, staty+75, V_6WIDTHSPACE|highlightflags, "Handling");
|
||||
V_DrawSmallString(statx+21+GRIDSTATOFFSET, staty+108, V_6WIDTHSPACE|highlightflags, "Weight");
|
||||
V_DrawSmallString(statx+12, staty+67, V_6WIDTHSPACE|highlightflags, "Acceleration");
|
||||
V_DrawSmallString(statx+76, staty+67, V_6WIDTHSPACE|highlightflags, "Max Speed");
|
||||
V_DrawSmallString(statx+14, staty+75, V_6WIDTHSPACE|highlightflags, "Handling");
|
||||
V_DrawSmallString(statx+21, staty+108, V_6WIDTHSPACE|highlightflags, "Weight");
|
||||
// label arrows
|
||||
V_DrawFixedPatch(((statx+61+GRIDSTATOFFSET)<<FRACBITS) + (FRACUNIT>>1), (staty+67)<<FRACBITS, FRACUNIT>>1, 0, statlr, flashcol);
|
||||
V_DrawFixedPatch((statx+40+GRIDSTATOFFSET)<<FRACBITS, (staty+80)<<FRACBITS, FRACUNIT>>1, 0, statud, flashcol);
|
||||
V_DrawFixedPatch(((statx+61)<<FRACBITS) + (FRACUNIT>>1), (staty+67)<<FRACBITS, FRACUNIT>>1, 0, statlr, flashcol);
|
||||
V_DrawFixedPatch((statx+40)<<FRACBITS, (staty+80)<<FRACBITS, FRACUNIT>>1, 0, statud, flashcol);
|
||||
// bg
|
||||
V_DrawFixedPatch(((statx+48+GRIDSTATOFFSET)<<FRACBITS)+(FRACUNIT>>1), (staty+73)<<FRACBITS, FRACUNIT>>1, 0, statbg, NULL);
|
||||
V_DrawFixedPatch(((statx+48)<<FRACBITS)+(FRACUNIT>>1), (staty+73)<<FRACBITS, FRACUNIT>>1, 0, statbg, NULL);
|
||||
|
||||
for (i = 0; i < numskins; i++) // draw the stat dots
|
||||
{
|
||||
@@ -8174,7 +8116,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
{
|
||||
speed = skins[i].kartspeed;
|
||||
weight = skins[i].kartweight;
|
||||
V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
|
||||
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8200,9 +8142,9 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
#define TEXTVERTSHIFT 10
|
||||
|
||||
DRAWSLOW(statx - sltw - 2, staty);
|
||||
DRAWSLOW(statx - sltw - 2, staty - TEXTVERTSHIFT+ (9 * 18) - 11);
|
||||
DRAWSLOW(statx - sltw - 2, staty - TEXTVERTSHIFT + (9 * 18) - 11);
|
||||
DRAWFAST(statx + (9 * 18), staty);
|
||||
DRAWFAST(statx + (9 * 18), staty - TEXTVERTSHIFT+ (9 * 18) - 11);
|
||||
DRAWFAST(statx + (9 * 18), staty - TEXTVERTSHIFT + (9 * 18) - 11);
|
||||
DRAWACCEL(statx - actw - 2, staty + TEXTVERTSHIFT);
|
||||
DRAWACCEL(statx + (9 * 18), staty + TEXTVERTSHIFT);
|
||||
DRAWHEAVY(statx - hetw - 2, staty + (9 * 18) - 11);
|
||||
@@ -8239,15 +8181,18 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
break;
|
||||
}
|
||||
|
||||
#undef GETSELECTEDSKINNAME
|
||||
#undef GETSELECTEDSPEED
|
||||
#undef GETSELECTEDWEIGHT
|
||||
|
||||
switch (cv_skinselectmenu.value)
|
||||
{
|
||||
//Skin grid stuff
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
gridyoffset = 10;
|
||||
//Skin grid stuff
|
||||
case SKINMENUTYPE_EXTENDED:
|
||||
for (s = 0; s < SKINGRIDNEWWIDTH*SKINGRIDNEWHEIGHT; s++)
|
||||
{
|
||||
INT32 x = ((s % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH) - 8) + 100 + SKINXSHIFT; //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
|
||||
INT32 y = ((s / SKINGRIDNEWWIDTH) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2)) + gridyoffset); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
|
||||
INT32 y = ((s / SKINGRIDNEWWIDTH) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2)) + 10); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
|
||||
INT32 calcs = s + (setupm_skinypos * SKINGRIDNEWWIDTH);
|
||||
INT32 skinn;
|
||||
patch_t *face;
|
||||
@@ -8273,7 +8218,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
{
|
||||
patch_t *cursor;
|
||||
INT32 curx = (((setupm_skinselect % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH/2)) + SKINXSHIFT) + 20;
|
||||
INT32 cury = (((setupm_skinselect / SKINGRIDNEWWIDTH) - setupm_skinypos) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2))+ gridyoffset);
|
||||
INT32 cury = (((setupm_skinselect / SKINGRIDNEWWIDTH) - setupm_skinypos) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2))+ 10);
|
||||
|
||||
UINT8 cursorframe = (I_GetTime() / 4) % 7;
|
||||
cursor = (patch_t *)W_CachePatchName(va("K_CHILI%d", cursorframe + 1), PU_PATCH);
|
||||
@@ -8333,13 +8278,13 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
weight = skins[selectedskin].kartweight;
|
||||
statdot = (patch_t *)W_CachePatchName("K_SDOT1", PU_PATCH);
|
||||
if (skullAnimCounter < 4) // SRB2Kart: we draw this dot later so that it's not covered if there's multiple skins with the same stats
|
||||
V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, flashcol);
|
||||
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, flashcol);
|
||||
else
|
||||
V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
|
||||
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
|
||||
|
||||
statdot = (patch_t *)W_CachePatchName("K_SDOT2", PU_PATCH); // coloured center
|
||||
if (setupm_fakecolor)
|
||||
V_DrawFixedPatch((((statx+46+GRIDSTATOFFSET) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, R_GetTranslationColormap(0, setupm_fakecolor, GTC_MENUCACHE));
|
||||
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, R_GetTranslationColormap(0, setupm_fakecolor, GTC_MENUCACHE));
|
||||
}
|
||||
break;
|
||||
case SKINMENUTYPE_2D:
|
||||
@@ -8390,7 +8335,6 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
||||
}
|
||||
}
|
||||
break;
|
||||
#undef GRIDSTATOFFSET
|
||||
#undef SKINXSHIFT
|
||||
default:
|
||||
speed = skins[setupm_fakeskin].kartspeed;
|
||||
@@ -10050,7 +9994,6 @@ static void M_DrawVideoMode(void)
|
||||
va("Wait %d second%s", testtime, (testtime > 1) ? "s" : ""));
|
||||
M_CentreText(OP_VideoModeDef.y + 158,
|
||||
"or press ESC to return");
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+1
-23
@@ -26,7 +26,7 @@ extern "C" {
|
||||
#include "mserv.h"
|
||||
#include "r_things.h" // for SKINNAMESIZE
|
||||
|
||||
extern boolean forceshowhud;
|
||||
extern boolean forceshowhud, forceshowchat;
|
||||
|
||||
//
|
||||
// MENUS
|
||||
@@ -50,9 +50,6 @@ void M_Drawer(void);
|
||||
// Called by D_SRB2Main, loads the config file.
|
||||
void M_Init(void);
|
||||
|
||||
// Called by D_SRB2Main also, sets up the playermenu and description tables.
|
||||
void M_InitCharacterTables(void);
|
||||
|
||||
// Called by intro code to force menu up upon a keypress,
|
||||
// does nothing if menu is already up.
|
||||
void M_StartControlPanel(void);
|
||||
@@ -84,11 +81,6 @@ typedef enum
|
||||
} menumessagetype_t;
|
||||
void M_StartMessage(const char *string, void *routine, menumessagetype_t itemtype);
|
||||
|
||||
extern boolean DPADUPSCROLL;
|
||||
extern boolean DPADDOWNSCROLL;
|
||||
extern boolean DPADLEFTSCROLL;
|
||||
extern boolean DPADRIGHTSCROLL;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
M_NOT_WAITING,
|
||||
@@ -168,8 +160,6 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt);
|
||||
|
||||
#define MAXMENUCCVARS 999
|
||||
|
||||
#define MAXTOOLTIPS 255
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct menu_s *submenu; // IT_SUBMENU
|
||||
@@ -195,8 +185,6 @@ typedef struct menuitem_s
|
||||
UINT16 alphaKey;
|
||||
} menuitem_t;
|
||||
|
||||
extern menuitem_t PlayerMenu[MAXSKINS];
|
||||
|
||||
typedef struct menu_s
|
||||
{
|
||||
const char *menutitlepic;
|
||||
@@ -227,14 +215,6 @@ extern menu_t SP_LoadDef;
|
||||
void M_SetupJoystickMenu(INT32 choice);
|
||||
extern menu_t OP_JoystickSetDef;
|
||||
|
||||
// Stuff for customizing the player select screen
|
||||
typedef struct
|
||||
{
|
||||
char notes[441];
|
||||
char picname[8];
|
||||
char skinname[SKINNAMESIZE*2+2]; // skin&skin\0
|
||||
} description_t;
|
||||
|
||||
// mode descriptions for video mode menu
|
||||
typedef struct
|
||||
{
|
||||
@@ -262,8 +242,6 @@ typedef struct
|
||||
|
||||
extern INT32 mapwads[NUMMAPS];
|
||||
|
||||
extern description_t description[MAXSKINS];
|
||||
|
||||
extern consvar_t cv_replaysearchrate;
|
||||
extern consvar_t cv_showfocuslost;
|
||||
extern consvar_t cv_newgametype, cv_nextmap, cv_chooseskin, cv_serversort;
|
||||
|
||||
+225
-194
@@ -208,7 +208,7 @@ typedef enum
|
||||
static menuitem_t MPauseMenu[] =
|
||||
{
|
||||
{IT_STRING | IT_CALL, NULL, "Addons...", M_Addons, 8},
|
||||
{IT_STRING | IT_CALL, NULL, "Add local skins...", M_LocalSkins, 16},
|
||||
{IT_STRING | IT_CALL, NULL, "Local Add-ons...", M_LocalAddons, 8},
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Scramble Teams...", &MISC_ScrambleTeamDef, 24},
|
||||
{IT_STRING | IT_CALL, NULL, "Switch Map..." , M_MapChange, 32},
|
||||
|
||||
@@ -238,7 +238,7 @@ static menuitem_t MPauseMenu[] =
|
||||
typedef enum
|
||||
{
|
||||
mpause_addons = 0,
|
||||
mpause_addlocalskins,
|
||||
mpause_localaddons,
|
||||
mpause_scramble,
|
||||
mpause_switchmap,
|
||||
#ifdef HAVE_DISCORDRPC
|
||||
@@ -446,25 +446,25 @@ enum
|
||||
|
||||
static menuitem_t SP_ReplayMenu[] =
|
||||
{
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Time", M_ReplayTimeAttack, 90},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Lap", M_ReplayTimeAttack, 98},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Time", M_ReplayTimeAttack, 90},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Lap", M_ReplayTimeAttack, 98},
|
||||
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Replay Last", M_ReplayTimeAttack, 106},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Replay Guest", M_ReplayTimeAttack, 114},
|
||||
{IT_WHITESTRING|IT_KEYHANDLER, NULL, "Replay Staff",M_HandleStaffReplay,122},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Replay Last", M_ReplayTimeAttack, 106},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Replay Guest", M_ReplayTimeAttack, 114},
|
||||
{IT_WHITESTRING|IT_KEYHANDLER, NULL, "Replay Staff",M_HandleStaffReplay, 122},
|
||||
|
||||
{IT_WHITESTRING|IT_SUBMENU, NULL, "Back", &SP_TimeAttackDef, 130}
|
||||
{IT_WHITESTRING|IT_SUBMENU, NULL, "Back", &SP_TimeAttackDef, 130}
|
||||
};
|
||||
|
||||
static menuitem_t SP_GuestReplayMenu[] =
|
||||
{
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Save Best Time as Guest", M_SetGuestReplay, 94},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Save Best Lap as Guest", M_SetGuestReplay,102},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Save Last as Guest", M_SetGuestReplay,110},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Save Best Time as Guest", M_SetGuestReplay, 94},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Save Best Lap as Guest", M_SetGuestReplay, 102},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Save Last as Guest", M_SetGuestReplay, 110},
|
||||
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Delete Guest Replay", M_SetGuestReplay,120},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Delete Guest Replay", M_SetGuestReplay, 120},
|
||||
|
||||
{IT_WHITESTRING|IT_SUBMENU, NULL, "Back", &SP_TimeAttackDef, 130}
|
||||
{IT_WHITESTRING|IT_SUBMENU, NULL, "Back", &SP_TimeAttackDef, 130}
|
||||
};
|
||||
|
||||
static menuitem_t SP_GhostMenu[] =
|
||||
@@ -495,12 +495,6 @@ static menuitem_t SP_LevelStatsMenu[] =
|
||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelStats, '\0'}, // dummy menuitem for the control func
|
||||
};
|
||||
|
||||
// A rare case.
|
||||
// External files modify this menu, so we can't call it static.
|
||||
// And I'm too lazy to go through and rename it everywhere. ARRGH!
|
||||
#define M_ChoosePlayer NULL
|
||||
menuitem_t PlayerMenu[MAXSKINS];
|
||||
|
||||
// -----------------------------------
|
||||
// Multiplayer and all of its submenus
|
||||
// -----------------------------------
|
||||
@@ -561,10 +555,10 @@ static menuitem_t MP_PlayerSetupMenu[] =
|
||||
|
||||
static menuitem_t MP_ConnectMenu[] =
|
||||
{
|
||||
{IT_STRING | IT_CVAR, NULL, "Sort By", &cv_serversort, 0},
|
||||
{IT_STRING | IT_KEYHANDLER, NULL, "Page", M_HandleServerPage, 8},
|
||||
{IT_STRING | IT_CALL, NULL, "Refresh", M_Refresh, 16},
|
||||
{IT_STRING | IT_KEYHANDLER, NULL, "", M_HandleServerSearch,25},
|
||||
{IT_STRING | IT_CVAR, NULL, "Sort By", &cv_serversort, 0},
|
||||
{IT_STRING | IT_KEYHANDLER, NULL, "Page", M_HandleServerPage, 8},
|
||||
{IT_STRING | IT_CALL, NULL, "Refresh", M_Refresh, 16},
|
||||
{IT_STRING | IT_KEYHANDLER, NULL, "", M_HandleServerSearch, 25},
|
||||
|
||||
{IT_STRING | IT_SPACE, NULL, "", M_Connect, 48},
|
||||
{IT_STRING | IT_SPACE, NULL, "", M_Connect, 60},
|
||||
@@ -731,29 +725,29 @@ static const char* OP_AllControlsTooltips[sizeof(OP_AllControlsMenu)/sizeof(OP_A
|
||||
// The rest is null, for now
|
||||
};
|
||||
|
||||
#define OP_JOYMENU(pnum) \
|
||||
{IT_HEADER, NULL, "Gameplay Controls", NULL, 7}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[pnum] , 15}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[pnum] , 20}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[pnum] , 25}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[pnum] , 30}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[pnum] , 35}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[pnum] , 40}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[pnum] , 45}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[pnum] , 50}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[pnum] , 55}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[pnum] , 60}, \
|
||||
{IT_HEADER, NULL, "Camera Controls", NULL, 67}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[pnum] , 75}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_camturnaxis[pnum] , 80}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Strafe Left/Right" , &cv_camstrafeaxis[pnum] , 85}, \
|
||||
{IT_HEADER, NULL, "Deadzones", NULL, 92}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[pnum] , 100}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[pnum] , 105}, \
|
||||
{IT_HEADER, NULL, "Miscellaneous", NULL, 112}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[pnum] , 120}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Controller Rumble Strength" , &cv_rumblestrength[pnum] , 125}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Set LED to Player color" , &cv_gamepadled[pnum] , 130},
|
||||
#define OP_JOYMENU(pnum) \
|
||||
{IT_HEADER, NULL, "Gameplay Controls", NULL, 7}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[pnum] , 15}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[pnum] , 20}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[pnum] , 25}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[pnum] , 30}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[pnum] , 35}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[pnum] , 40}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[pnum] , 45}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[pnum] , 50}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[pnum] , 55}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[pnum] , 60}, \
|
||||
{IT_HEADER, NULL, "Camera Controls", NULL, 67}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[pnum] , 75}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_camturnaxis[pnum] , 80}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Strafe Left/Right" , &cv_camstrafeaxis[pnum] , 85}, \
|
||||
{IT_HEADER, NULL, "Deadzones", NULL, 92}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[pnum] , 100}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[pnum] , 105}, \
|
||||
{IT_HEADER, NULL, "Miscellaneous", NULL, 112}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[pnum] , 120}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Controller Rumble Strength" , &cv_rumblestrength[pnum] , 125}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Set LED to Player color" , &cv_gamepadled[pnum] , 130},
|
||||
|
||||
static menuitem_t OP_Joystick1Menu[] =
|
||||
{
|
||||
@@ -795,10 +789,9 @@ static menuitem_t OP_JoystickSetMenu[] =
|
||||
static menuitem_t OP_MouseOptionsMenu[] =
|
||||
{
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Mouse", &cv_usemouse, 10},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Mouse Turning", &cv_mouseturn, 20},
|
||||
{IT_STRING | IT_CVAR, NULL, "Invert Mouse", &cv_invertmouse, 30},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Mouse X Speed", &cv_mousexsens, 40},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Mouse X Speed", &cv_mousexsens, 40},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Mouse Y Speed", &cv_mouseysens, 50},
|
||||
};
|
||||
|
||||
@@ -867,7 +860,6 @@ static const char* OP_VideoTooltips[] =
|
||||
"Advanced graphical options.",
|
||||
};
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
op_video_res = 0,
|
||||
@@ -951,24 +943,25 @@ static menuitem_t OP_ExpOptionsMenu[] =
|
||||
//{IT_STRING | IT_CVAR, NULL, "Randomized Directional Light", &cv_randomdirlight, 45}, // should this ever come back
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Skyboxes", &cv_skybox, 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Skydome", &cv_skydome, 45},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Precache Level Textures", &cv_precachetextures, 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Precache Level Textures", &cv_precachetextures, 55},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "FPS counter sampling", &cv_accuratefps, 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "FPS counter sampling", &cv_accuratefps, 65},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Frameskip", &cv_frameskip, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Frameskip", &cv_frameskip, 75},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Votescreen Scaling", &cv_votebgscaling, 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Votescreen Scaling", &cv_votebgscaling, 85},
|
||||
|
||||
#ifdef HWRENDER
|
||||
{IT_STRING | IT_CVAR, NULL, "Screen Textures", &cv_glscreentextures, 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Screen Textures", &cv_glscreentextures, 95},
|
||||
#ifdef USE_FBO_OGL
|
||||
{IT_STRING | IT_CVAR, NULL, "FBO Downsampling support", &cv_glframebuffer, 95},
|
||||
{IT_STRING | IT_CVAR, NULL, "Palette Depth", &cv_glpalettedepth, 105},
|
||||
{IT_DISABLED, NULL, "", NULL, 115}, // dummy text
|
||||
{IT_STRING | IT_CVAR, NULL, "FBO Downsampling support", &cv_glframebuffer, 100},
|
||||
{IT_STRING | IT_CVAR, NULL, "Palette Depth", &cv_glpalettedepth, 110},
|
||||
{IT_DISABLED, NULL, "", NULL, 120}, // dummy text
|
||||
#else
|
||||
{IT_STRING | IT_CVAR, NULL, "Palette Depth", &cv_glpalettedepth, 100},
|
||||
{IT_DISABLED, NULL, "", NULL, 110}, // dummy text
|
||||
{IT_STRING | IT_CVAR, NULL, "Palette Depth", &cv_glpalettedepth, 110},
|
||||
{IT_DISABLED, NULL, "", NULL, 120}, // dummy text
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
@@ -981,12 +974,13 @@ static const char* OP_ExpTooltips[] =
|
||||
"Sets minimum sector brightness, useful for dark areas.",
|
||||
//"Should the directional lightning be randomized each map?\nTakes effect on next map load.",
|
||||
"Toggle being able to see the sky.",
|
||||
"Toggle skydome.", // idk man someone give a better description of this
|
||||
"Preload all level textures on level load.\nMassively reduces texture related stuttering during gameplay\nat the cost of longer level loading times.\nDisable this if you experience timeouts during level switches.",
|
||||
"Change the FPS counter sampling method\nInaccurate updates slower\nand might miss sudden framerate changes and drops,\nproviding a more averaged result.\nAccurate updates faster, but might be less readable.", // how to ingles??
|
||||
"Skips rendering frames if game logic takes too long\npreventing gameplay issues during performance drops.", // idk im shit as describing things
|
||||
"Different methods of scaling the votescreen backgrounds.",
|
||||
#ifdef HWRENDER
|
||||
"Should the game do Screen Textures? Provides a good boost to frames\nat the cost of some visual effects not working when disabled.",
|
||||
"Disabling Screen Textures may result in a performance boost\nbut will break certain effects.\nScreen textures are required at resolutions lower than your desktop resolution!",
|
||||
#ifdef USE_FBO_OGL
|
||||
"Allows the game to downsample from a higher resolution\nthan your display in OpenGL renderer mode.\nRequires a GPU with atleast OpenGL 2.1 support.",
|
||||
#endif
|
||||
@@ -1002,6 +996,7 @@ enum
|
||||
op_exp_secbright,
|
||||
//op_exp_dirlight,
|
||||
op_exp_skybox,
|
||||
op_exp_skydome,
|
||||
op_exp_texcache,
|
||||
op_exp_accuratefps,
|
||||
op_exp_frameskip,
|
||||
@@ -1015,7 +1010,6 @@ enum
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
#ifdef HWRENDER
|
||||
static menuitem_t OP_OpenGLOptionsMenu[] =
|
||||
{
|
||||
@@ -1023,20 +1017,18 @@ 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},
|
||||
{IT_STRING | IT_CVAR, NULL, "Anisotropic", &cv_glanisotropicmode, 55},
|
||||
{IT_STRING | IT_CVAR, NULL, "Visual Portals", &cv_glportals, 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Texture Quality", &cv_gltexturedepth, 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Texture Filter", &cv_glfiltermode, 45},
|
||||
{IT_STRING | IT_CVAR, NULL, "Anisotropic", &cv_glanisotropicmode, 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Visual Portals", &cv_glportals, 55},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Wall Contrast Style", &cv_glfakecontrast, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Slope Contrast", &cv_glslopecontrast, 75},
|
||||
{IT_STRING | IT_CVAR, NULL, "Dithered Lightning", &cv_gllightdither, 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Sprite Billboarding", &cv_glspritebillboarding, 85},
|
||||
{IT_STRING | IT_CVAR, NULL, "Software Perspective", &cv_glshearing, 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Rendering Distance", &cv_glrenderdistance, 95},
|
||||
{IT_STRING | IT_CVAR, NULL, "Wall Contrast Style", &cv_glfakecontrast, 65},
|
||||
{IT_STRING | IT_CVAR, NULL, "Slope Contrast", &cv_glslopecontrast, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Dithered Lightning", &cv_gllightdither, 75},
|
||||
{IT_STRING | IT_CVAR, NULL, "Sprite Billboarding", &cv_glspritebillboarding, 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Software Perspective", &cv_glshearing, 85},
|
||||
{IT_STRING | IT_CVAR, NULL, "Rendering Distance", &cv_glrenderdistance, 90},
|
||||
};
|
||||
|
||||
static const char* OP_OpenGLTooltips[] =
|
||||
@@ -1045,7 +1037,6 @@ static const char* OP_OpenGLTooltips[] =
|
||||
"Fallback 3D model for characters that don't have any.",
|
||||
"Graphical Shaders.",
|
||||
"Recreates the look of software mode.",
|
||||
"Flash palettes for palette rendering.",
|
||||
"Bit-depth of textures.",
|
||||
"Filter to use on textures.",
|
||||
"Anisotropic filtering.",
|
||||
@@ -1064,7 +1055,6 @@ enum
|
||||
op_gl_falbckmdls,
|
||||
op_gl_shader,
|
||||
op_gl_palrender,
|
||||
op_gl_flashpal,
|
||||
op_gl_scrdepth,
|
||||
op_gl_filter,
|
||||
op_gl_anis,
|
||||
@@ -1076,7 +1066,6 @@ enum
|
||||
op_gl_shearing,
|
||||
op_gl_renderdist,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
static menuitem_t OP_SoundOptionsMenu[] =
|
||||
@@ -1087,8 +1076,7 @@ static menuitem_t OP_SoundOptionsMenu[] =
|
||||
{IT_STRING|IT_CVAR|IT_CV_NOPRINT, NULL, "Music", &cv_gamedigimusic, 30},
|
||||
{IT_STRING|IT_CVAR|IT_CV_SLIDER, NULL, "Music Volume", &cv_digmusicvolume, 38},
|
||||
|
||||
//#ifndef NO_MIDI
|
||||
#if 0
|
||||
#if 0 //#ifndef NO_MIDI
|
||||
{IT_STRING|IT_CVAR|IT_CV_SLIDER, NULL, "MIDI Volume", &cv_midimusicvolume, 46},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Reverse L/R Channels", &stereoreverse, 60},
|
||||
@@ -1123,8 +1111,7 @@ static const char* OP_SoundTooltips[] =
|
||||
"Volume of Sound effects.",
|
||||
"Turn Music on or off.",
|
||||
"Volume of Music.",
|
||||
//#ifndef NO_MIDI
|
||||
#if 0
|
||||
#if 0 //#ifndef NO_MIDI
|
||||
"Volume of Midi Music.",
|
||||
#endif
|
||||
"Reverse left and right channels of audio.",
|
||||
@@ -1184,7 +1171,7 @@ static const char* OP_SoundAdvancedTooltips[] =
|
||||
"Should the Grow music be on or off?",
|
||||
"Should the Invulnerability music be on or off?",
|
||||
"Should music be kept when restarting the map?",
|
||||
"Should the Intro fanfare be skipped\nand map music be played on map start?",
|
||||
"Should the Intro fanfare be skipped\nand map music be played on map start?\nNote that this WILL skip sounds played by the map before round start as well!",
|
||||
"Controls Sound effects caching.\nKeep will retain previously played sound effects in cache." // man idk how to describe this in a non awful way lmao
|
||||
"\nOn will preload all sound effects.\nEliminates sound-related lag and stutters but increases memory usage.",
|
||||
"Size of the Audio Buffer\nreducing it will result in less sound latency\nbut may cause issues such as crackling or distorted Sound.",
|
||||
@@ -1195,20 +1182,20 @@ static menuitem_t OP_FocusOptionsMenu[] =
|
||||
{
|
||||
{IT_HEADER, NULL, "Game Focus Options", NULL, 0},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", &cv_playmusicifunfocused, 30},
|
||||
{IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", &cv_playsoundifunfocused, 40},
|
||||
{IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", &cv_playmusicifunfocused, 10},
|
||||
{IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", &cv_playsoundifunfocused, 20},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Pause Game While Unfocused", &cv_pauseifunfocused, 60},
|
||||
{IT_STRING|IT_CVAR, NULL, "Pause Game While Unfocused", &cv_pauseifunfocused, 40},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Background FPS Cap", &cv_fpscapbg, 80},
|
||||
{IT_STRING|IT_CVAR, NULL, "Background FPS Cap", &cv_fpscapbg, 60},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost, 100},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost, 80},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Visible Mouse", &cv_mousevisible, 120},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad LED Color While Unfocused ", &cv_gamepadledifunfocused, 140},
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad Rumble While Unfocused", &cv_rumbleifunfocused, 150},
|
||||
{IT_STRING|IT_CVAR, NULL, "Visible Mouse", &cv_mousevisible, 100},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad Inputs While Unfocused", &cv_gamepadifunfocused, 120},
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad LED Color While Unfocused ", &cv_gamepadledifunfocused, 130},
|
||||
{IT_STRING|IT_CVAR, NULL, "Gamepad Rumble While Unfocused", &cv_rumbleifunfocused, 140},
|
||||
};
|
||||
|
||||
static const char* OP_FocusOptionsTooltips[] =
|
||||
@@ -1220,6 +1207,7 @@ static const char* OP_FocusOptionsTooltips[] =
|
||||
"Set manual framerate cap while the game is unfocused.",
|
||||
"Should the FOCUS LOST window appear\n while the game is unfocused?",
|
||||
"Displays the mouse cursor while the game is in focus.",
|
||||
"Should gamepad still control the game when unfocused?",
|
||||
"Should gamepad LED indicator change color when unfocused?",
|
||||
"Should gamepad rumble apply when unfocused?",
|
||||
};
|
||||
@@ -1314,29 +1302,29 @@ static menuitem_t OP_DiscordOptionsMenu[] =
|
||||
|
||||
static menuitem_t OP_HUDOptionsMenu[] =
|
||||
{
|
||||
{IT_STRING | IT_CVAR, NULL, "Show HUD (F3)", &cv_showhud, 10},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show HUD (F3)", &cv_showhud, 10},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "HUD Visibility", &cv_translucenthud, 20},
|
||||
NULL, "HUD Visibility", &cv_translucenthud, 20},
|
||||
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Online HUD options...", &OP_ChatOptionsDef, 35},
|
||||
{IT_STRING | IT_CVAR, NULL, "Background Glass", &cons_backcolor, 45},
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Online HUD options...", &OP_ChatOptionsDef, 35},
|
||||
{IT_STRING | IT_CVAR, NULL, "Background Glass", &cons_backcolor, 45},
|
||||
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "Minimap Visibility", &cv_kartminimap, 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Speedometer Display", &cv_kartspeedometer, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show \"CHECK\"", &cv_kartcheck, 80},
|
||||
NULL, "Minimap Visibility", &cv_kartminimap, 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Speedometer Display", &cv_kartspeedometer, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show \"CHECK\"", &cv_kartcheck, 80},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Menu Highlights", &cons_menuhighlight, 95},
|
||||
{IT_STRING | IT_CVAR, NULL, "Menu Highlights", &cons_menuhighlight, 95},
|
||||
// highlight info - (GOOD HIGHLIGHT, WARNING HIGHLIGHT) - 110 (see M_DrawHUDOptions)
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Console Text Size", &cv_constextsize, 120},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Console Prints in Menu",&cons_consoleprintinmenu, 130},
|
||||
{IT_STRING | IT_CVAR, NULL, "Console Text Size", &cv_constextsize, 120},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Console Prints in Menu",&cons_consoleprintinmenu, 130},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Track Addon Name", &cv_showtrackaddon, 145},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Track Addon Name", &cv_showtrackaddon, 145},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Show All Maps", &cv_showallmaps, 155},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show All Maps", &cv_showallmaps, 155},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "2D character select", &cv_skinselectmenu, 165},
|
||||
{IT_STRING | IT_CVAR, NULL, "2D character select", &cv_skinselectmenu, 165},
|
||||
};
|
||||
|
||||
static menuitem_t OP_CamOptionsMenu[] =
|
||||
@@ -1417,44 +1405,70 @@ static const char* OP_PlayerCamOptionsTooltips[] =
|
||||
static menuitem_t OP_ChatOptionsMenu[] =
|
||||
{
|
||||
// will ANYONE who doesn't know how to use the console want to touch this one?
|
||||
{IT_STRING | IT_CVAR, NULL, "Chat Mode", &cv_consolechat, 5}, // nonetheless...
|
||||
{IT_STRING | IT_CVAR, NULL, "Chat Mode", &cv_consolechat, 5}, // nonetheless...
|
||||
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "Chat Box Width", &cv_chatwidth, 20},
|
||||
NULL, "Chat Box Width", &cv_chatwidth, 10},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "Chat Box Height", &cv_chatheight, 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Center Text in Chat", &cv_chatcentertext, 40},
|
||||
NULL, "Chat Box Height", &cv_chatheight, 15},
|
||||
{IT_STRING | IT_CVAR, NULL, "Chat Horizontal Offset", &cv_chat_xoffset, 20},
|
||||
{IT_STRING | IT_CVAR, NULL, "Chat Vertical Offset", &cv_chat_yoffset, 25},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Chat Background Tint", &cv_chatbacktint, 55},
|
||||
{IT_STRING | IT_CVAR, NULL, "Message Fadeout Time", &cv_chattime, 65},
|
||||
{IT_STRING | IT_CVAR, NULL, "Spam Protection", &cv_chatspamprotection, 75},
|
||||
{IT_STRING | IT_CVAR, NULL, "Max Chat Messages", &cv_chatlogsize, 85},
|
||||
{IT_STRING | IT_CVAR, NULL, "Center Text in Chat", &cv_chatcentertext, 35},
|
||||
{IT_STRING | IT_CVAR, NULL, "Chat Background Tint", &cv_chatbacktint, 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Message Fadeout Time", &cv_chattime, 45},
|
||||
{IT_STRING | IT_CVAR, NULL, "Spam Protection", &cv_chatspamprotection, 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Max Chat Messages", &cv_chatlogsize, 55},
|
||||
{IT_STRING | IT_CVAR, NULL, "Display Character Limit", &cv_chat_showlimit, 60},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Local ping display", &cv_showping, 105}, // shows ping above the framerate if we want to.
|
||||
{IT_STRING | IT_CVAR, NULL, "Ping display style", &cv_pingstyle, 115},
|
||||
{IT_STRING | IT_CVAR, NULL, "Ping measurement", &cv_pingmeasurement, 125},
|
||||
{IT_STRING | IT_CVAR, NULL, "Ping icon", &cv_pingicon, 135},
|
||||
{IT_STRING | IT_CVAR, NULL, "Local ping display", &cv_showping, 70}, // shows ping above the framerate if we want to.
|
||||
{IT_STRING | IT_CVAR, NULL, "Ping display style", &cv_pingstyle, 75},
|
||||
{IT_STRING | IT_CVAR, NULL, "Ping measurement", &cv_pingmeasurement, 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Ping icon", &cv_pingicon, 85},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Show IP address in playerlist", &cv_shownodeip, 145},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show IP address in playerlist", &cv_shownodeip, 90},
|
||||
};
|
||||
|
||||
static const char* OP_ChatOptionsTooltips[] =
|
||||
{
|
||||
"Chat mode used for in-game chat.",
|
||||
"Width of chat box.",
|
||||
"Height of chat box.",
|
||||
"Width of the chat box.",
|
||||
"Height of the chat box.",
|
||||
"Horizontal Offset of the chat box.",
|
||||
"Vertical Offset of the chat box.",
|
||||
"Center text in the chat message pop ups.",
|
||||
"Chatbox background.",
|
||||
"Background for the chat message pop ups.",
|
||||
"Fadeout time for new chat message.",
|
||||
"Spam protection for in-game chat.",
|
||||
"Maxiumum amount of chat messages to look back at.",
|
||||
"Show how many characters you have left to type in the chat.",
|
||||
"Show player ping.",
|
||||
"Choose the looks of the ping display.", // this is ass idk english lmao
|
||||
"Choose the style of the ping display.",
|
||||
"Measurement used for ping.",
|
||||
"Visibility of ping icon.",
|
||||
"Should Player IP addresses be printed when using\nthe nodes or listplayers command?",
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
op_chat_mode,
|
||||
op_chat_boxwidth,
|
||||
op_chat_boxheight,
|
||||
op_chat_yoffs,
|
||||
op_chat_xoffs,
|
||||
op_chat_centertxt,
|
||||
op_chat_bgtint,
|
||||
op_chat_fadetime,
|
||||
op_chat_spamprotect,
|
||||
op_chat_maxmsg,
|
||||
op_chat_charlmt,
|
||||
op_chat_showping,
|
||||
op_chat_pingstyle,
|
||||
op_chat_pingmeasr,
|
||||
op_chat_pingico,
|
||||
op_chat_nodeip,
|
||||
};
|
||||
|
||||
static menuitem_t OP_GameOptionsMenu[] =
|
||||
{
|
||||
{IT_STRING | IT_SUBMENU, NULL, "Random Item Toggles...", &OP_MonitorToggleDef, 10},
|
||||
@@ -1640,33 +1654,29 @@ static menuitem_t OP_AccessibilityMenu[] =
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Video Color Settings...", &OP_ColorOptionsDef, 30},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Reduce Effects", &cv_reducevfx, 35},
|
||||
{IT_STRING|IT_CVAR, NULL, "Midnight Channel Flicker", &cv_lessflicker, 40}, // obsolete now? or still better be a seperate toggle?
|
||||
{IT_STRING|IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 40}, // obsolete now? or still better be a seperate toggle?
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Minimum Sector Brightness", &cv_secbright, 45},
|
||||
|
||||
#ifdef HWRENDER
|
||||
{IT_STRING|IT_CVAR, NULL, "Screen Textures", &cv_glscreentextures, 50},
|
||||
#endif
|
||||
{IT_STRING|IT_CVAR, NULL, "Water Surface Ripples", &cv_ripplewater, 50},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Water Surface Ripples", &cv_ripplewater, 55},
|
||||
{IT_STRING|IT_CVAR, NULL, "Fade Players near Camera", &cv_playerfade, 55},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Fade Players near Camera", &cv_playerfade, 60},
|
||||
{IT_STRING|IT_CVAR, NULL, "Quake Screenshakes", &cv_screenquake, 60},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Quake Screenshakes", &cv_screenquake, 65},
|
||||
{IT_CALL|IT_STRING, NULL, "Camera Options...", M_CameraMenu, 65},
|
||||
|
||||
{IT_CALL|IT_STRING, NULL, "Camera Options...", M_CameraMenu, 70},
|
||||
{IT_HEADER, NULL, "Audio", NULL, 75},
|
||||
|
||||
{IT_HEADER, NULL, "Audio", NULL, 80},
|
||||
{IT_STRING|IT_CVAR, NULL, "Reverse L/R Channels", &stereoreverse, 85},
|
||||
{IT_STRING|IT_CVAR, NULL, "Same Sound Limit", &cv_samesoundlimit, 90},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Reverse L/R Channels", &stereoreverse, 90},
|
||||
{IT_STRING|IT_CVAR, NULL, "Same Sound Limit", &cv_samesoundlimit, 95},
|
||||
{IT_HEADER, NULL, "Controls", NULL, 100},
|
||||
|
||||
{IT_HEADER, NULL, "Controls", NULL, 105},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P1)", &cv_autoaccel[0], 115},
|
||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P2)", &cv_autoaccel[1], 120},
|
||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P3)", &cv_autoaccel[2], 125},
|
||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P4)", &cv_autoaccel[3], 130},
|
||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P1)", &cv_autoaccel[0], 110},
|
||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P2)", &cv_autoaccel[1], 115},
|
||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P3)", &cv_autoaccel[2], 120},
|
||||
{IT_STRING|IT_CVAR, NULL, "Automatic Acceleration (P4)", &cv_autoaccel[3], 125},
|
||||
};
|
||||
|
||||
static const char* OP_AccessibilityTooltips[] =
|
||||
@@ -1679,9 +1689,6 @@ static const char* OP_AccessibilityTooltips[] =
|
||||
"Reduces or disables certain effects players might be sensitive to\nSuch as flashing, flickering, certain screen effects and more.",
|
||||
"Disables the flicker effect on Midnight Channel.",
|
||||
"Sets minimum sector brightness, useful for dark areas",
|
||||
#ifdef HWRENDER
|
||||
"Disabling Screen Textures will disable the Underwater and Heat screen effects.",
|
||||
#endif
|
||||
"Toggles the ripple effect on water surfaces",
|
||||
"Fades other Players that are close to the camera in and out",
|
||||
"Toggles the screen shake effect during Earthquakes",
|
||||
@@ -1705,29 +1712,30 @@ static menuitem_t OP_SaturnMenu[] =
|
||||
{IT_STRING | IT_CVAR, NULL, "Minimum Input Delay", &cv_mindelay, 20},
|
||||
{IT_STRING | IT_CVAR, NULL, "Gentlemens Ping", &cv_gentlemens, 25},
|
||||
{IT_STRING | IT_CVAR, NULL, "Server Info Screen", &cv_serverinfoscreen, 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Server Addons Info", &cv_serveraddoninfo, 35},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Skin Select Spinning Speed", &cv_skinselectspin, 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Skin Select Spinning Speed", &cv_skinselectspin, 45},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Colorized Speedlines", &cv_coloredspeedlines, 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Colorized Sneakertrails", &cv_coloredsneakertrail, 55},
|
||||
{IT_STRING | IT_CVAR, NULL, "Colorized Speedlines", &cv_coloredspeedlines, 55},
|
||||
{IT_STRING | IT_CVAR, NULL, "Colorized Sneakertrails", &cv_coloredsneakertrail, 60},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Player Blendeffects", &cv_playerblendeffects, 65},
|
||||
{IT_STRING | IT_CVAR, NULL, "Player Blendeffects", &cv_playerblendeffects, 70},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Bananadrag Jitter", &cv_bananajitter, 75},
|
||||
{IT_STRING | IT_CVAR, NULL, "Bananadrag Jitter", &cv_bananajitter, 80},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Midair Driftsparks", &cv_airsparks, 85},
|
||||
{IT_STRING | IT_CVAR, NULL, "Midair Driftsparks", &cv_airsparks, 90},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Localskin Menus", &cv_showlocalskinmenus, 95},
|
||||
{IT_STRING | IT_CVAR, NULL, "Show Localskin Menus", &cv_showlocalskinmenus, 100},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Uppercase Menu", &cv_menucaps, 105},
|
||||
{IT_STRING | IT_CVAR, NULL, "Uppercase Menu", &cv_menucaps, 110},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Keyboard Layout", &cv_keyboardlayout, 115},
|
||||
{IT_STRING | IT_CVAR, NULL, "Keyboard Layout", &cv_keyboardlayout, 120},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 125},
|
||||
{IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 130},
|
||||
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Saturn Hud...", &OP_SaturnHudDef, 135},
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 140},
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 145}, // uwu
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Saturn Hud...", &OP_SaturnHudDef, 140},
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 145},
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 150}, // uwu
|
||||
};
|
||||
|
||||
static const char* OP_SaturnTooltips[] =
|
||||
@@ -1737,6 +1745,7 @@ static const char* OP_SaturnTooltips[] =
|
||||
"Practice for online play! 0 = instant response.",
|
||||
"Simulate online input delay when hosting a server.\nValue choosen by Player with the lowest ping",
|
||||
"Show a screen before joining a server displaying important information about it",
|
||||
"Show amount and types of addons that are loaded by server when joining",
|
||||
"How much speen do you want?",
|
||||
"Colourize the speedlines in your skincolor if you go fast enough!",
|
||||
"Colourize the sneaker flame trails in your skincolor!",
|
||||
@@ -1781,20 +1790,23 @@ static menuitem_t OP_PlayerDistortMenu[] =
|
||||
{IT_STRING | IT_CVAR, NULL, "Slope Rotation Distance", &cv_sloperolldist, 15},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Rotate Players when Sliptiding", &cv_sliptideroll, 25},
|
||||
{IT_STRING | IT_CVAR, NULL, "Rotate Sparks and Boost Trails", &cv_sparkroll, 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Rotate Bananas on Throw", &cv_bananthrowroll, 35},
|
||||
{IT_STRING | IT_CVAR, NULL, "Stair Janking Effect", &cv_stairjank, 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Stair Janking Sound Effect", &cv_stairjanksfx, 35}, // idk if that should be here but i dont care atm
|
||||
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Player Stretch Factor", &cv_gravstretch, 45},
|
||||
{IT_STRING | IT_CVAR, NULL, "Squish Sound Effect", &cv_slamsound, 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Rotate Sparks and Boost Trails", &cv_sparkroll, 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Rotate Bananas on Throw", &cv_bananthrowroll, 45},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Saltyhop", &cv_saltyhop, 60},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saltyhop Height", &cv_saltyheight, 65},
|
||||
{IT_STRING | IT_CVAR, NULL, "Saltyhop Sound Effect", &cv_saltyhopsfx, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Saltyhop Squish", &cv_saltysquish, 75},
|
||||
{IT_STRING | IT_CVAR, NULL, "Saltyhop Roll", &cv_saltyroll, 80},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Player Stretch Factor", &cv_gravstretch, 55},
|
||||
{IT_STRING | IT_CVAR, NULL, "Squish Sound Effect", &cv_slamsound, 60},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Squishdance", &cv_squishdance, 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Squishdance Speed", &cv_squishdancespeed, 96},
|
||||
{IT_STRING | IT_CVAR, NULL, "Saltyhop", &cv_saltyhop, 70},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saltyhop Height", &cv_saltyheight, 75},
|
||||
{IT_STRING | IT_CVAR, NULL, "Saltyhop Sound Effect", &cv_saltyhopsfx, 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Saltyhop Squish", &cv_saltysquish, 85},
|
||||
{IT_STRING | IT_CVAR, NULL, "Saltyhop Roll", &cv_saltyroll, 90},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Squishdance", &cv_squishdance, 100},
|
||||
{IT_STRING | IT_CVAR, NULL, "Squishdance Speed", &cv_squishdancespeed, 106}, // why is this offset by 6? idk cant remember lulul
|
||||
};
|
||||
|
||||
static const char* OP_PlayerDistortTooltips[] =
|
||||
@@ -1803,6 +1815,8 @@ static const char* OP_PlayerDistortTooltips[] =
|
||||
"Sprite rotation on slopes. Can either be just players or all objects.",
|
||||
"Distance object rotation should be visable.",
|
||||
"Player rotation when sliptiding.",
|
||||
"Slightly tilt the player when driving over stairs or small bumps.",
|
||||
"Sound effect when driving over stairs or small bumps.",
|
||||
"Rotation of a player's boost trails and drift sparks.",
|
||||
"Should banans rotate when thrown?\nAnd should they stay rotated when on the ground?",
|
||||
"Player squash and stretch.",
|
||||
@@ -1813,7 +1827,7 @@ static const char* OP_PlayerDistortTooltips[] =
|
||||
"Player hop squash and stretch.",
|
||||
"Should the player rotation be kept during player hop.",
|
||||
"Do a funny squishy dance when holding CUSTOM 3.",
|
||||
"Speed of the Squishy dance in BPM.",
|
||||
"Speed of the Squishy dance in SPM (Squishes Per Minute).",
|
||||
};
|
||||
|
||||
enum
|
||||
@@ -1822,6 +1836,8 @@ enum
|
||||
sloperotate,
|
||||
slrotatedist,
|
||||
sliptide,
|
||||
stairjank,
|
||||
stairjanksfx,
|
||||
sparkrotate,
|
||||
bananrotat,
|
||||
stretchyplayer,
|
||||
@@ -1839,47 +1855,51 @@ static menuitem_t OP_SaturnHudMenu[] =
|
||||
{
|
||||
{IT_HEADER, NULL, "Saturn Hud Options", NULL, 0},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Speedometer Style", &cv_newspeedometer, 10},
|
||||
{IT_STRING|IT_CVAR, NULL, "Battle Speedometer", &cv_battlespeedo, 15},
|
||||
{IT_STRING|IT_CVAR, NULL, "Speedometer Style", &cv_newspeedometer, 10},
|
||||
{IT_STRING|IT_CVAR, NULL, "Battle Speedometer", &cv_battlespeedo, 15},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Colourized HUD", &cv_colorizedhud, 25},
|
||||
{IT_STRING|IT_CVAR, NULL, "Colourized Itembox", &cv_colorizeditembox, 30},
|
||||
{IT_STRING|IT_CVAR, NULL, "Colourized HUD Color", &cv_colorizedhudcolor, 35},
|
||||
{IT_STRING|IT_CVAR, NULL, "Colourized HUD", &cv_colorizedhud, 25},
|
||||
{IT_STRING|IT_CVAR, NULL, "Colourized Itembox", &cv_colorizeditembox, 30},
|
||||
{IT_STRING|IT_CVAR, NULL, "Colourized HUD Color", &cv_colorizedhudcolor, 35},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Input Display", &cv_showinput, 45},
|
||||
{IT_STRING|IT_CVAR, NULL, "Input Display", &cv_showinput, 45},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Stat Display", &cv_showstats, 55},
|
||||
{IT_STRING|IT_CVAR, NULL, "Stat Display", &cv_showstats, 55},
|
||||
{IT_STRING|IT_CVAR, NULL, "Skin Name in Stat Display", &cv_showstats_skinname, 60},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Higher Resolution Portraits", &cv_highresportrait, 65},
|
||||
{IT_STRING|IT_CVAR, NULL, "Higher Resolution Portraits", &cv_highresportrait, 70},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Small Positionnumber", &cv_smallposnum, 75},
|
||||
{IT_STRING|IT_CVAR, NULL, "Positionnumber Animation", &cv_posanim, 80},
|
||||
{IT_STRING|IT_CVAR, NULL, "Small Positionnumber", &cv_smallposnum, 80},
|
||||
{IT_STRING|IT_CVAR, NULL, "Positionnumber Animation", &cv_posanim, 85},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Flash Lap Times", &cv_showlaptimes, 90},
|
||||
{IT_STRING|IT_CVAR, NULL, "Flash Lap Times", &cv_showlaptimes, 95},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Multi-Item icons", &cv_multiitemicon, 100},
|
||||
{IT_STRING|IT_CVAR, NULL, "Item Amount Number", &cv_huditemamount, 105},
|
||||
{IT_STRING|IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 110},
|
||||
{IT_STRING|IT_CVAR, NULL, "Multi-Item icons", &cv_multiitemicon, 105},
|
||||
{IT_STRING|IT_CVAR, NULL, "Item Amount Number", &cv_huditemamount, 110},
|
||||
{IT_STRING|IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 115},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 120},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 125},
|
||||
{IT_STRING|IT_CVAR, NULL, "Item Roulette Color", &cv_roulettecolor, 120},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 135},
|
||||
{IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 140},
|
||||
{IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 145},
|
||||
{IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 150},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 130},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 135},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 160},
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits on Pause", &cv_pausesongcredits, 165},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 145},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Finished on Minimap", &cv_showminimapfinished, 150},
|
||||
{IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 155},
|
||||
{IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 160},
|
||||
{IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 165},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 175},
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 175},
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits on Pause", &cv_pausesongcredits, 180},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 185},
|
||||
{IT_STRING|IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 190},
|
||||
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 195},
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 200},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 200},
|
||||
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 210},
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 210},
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 215},
|
||||
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 225},
|
||||
};
|
||||
|
||||
static const char* OP_SaturnHudTooltips[] =
|
||||
@@ -1892,6 +1912,7 @@ static const char* OP_SaturnHudTooltips[] =
|
||||
"The color to use instead of the player color when\ncolourized hud is enabled.",
|
||||
"Displays the input display and lets you choose its style.",
|
||||
"Enable the stat display.",
|
||||
"Show skin name in the stat display.",
|
||||
"Enable the use of the higher resolution want icons instead of rank\nfor some places.",
|
||||
"Make the Postionnumber half the size.",
|
||||
"Disable the animation of the Positionnumber\nwhen overtaking someone.",
|
||||
@@ -1899,9 +1920,11 @@ static const char* OP_SaturnHudTooltips[] =
|
||||
"Use extra graphics for multiple sneakers, bananas and jawz.",
|
||||
"Change when the item amount is to be displayed.\nMultiple will always display the number.\nWhen you have multiple of the same Item.\nAlways will always display the number regardless of Item amount.",
|
||||
"Enables an animation while the roulette is active.",
|
||||
"Changes the way items are colorized in roulette.",
|
||||
"Show the big 'LAP' text on a lap change.",
|
||||
"Show the big Cecho Messages.",
|
||||
"Show player names on the minimap.",
|
||||
"Show players that have finished already on the minimap.",
|
||||
"Minimize the player icons on the minimap.",
|
||||
"Erratically rotate player icons during spinouts.",
|
||||
"Visualize the player facing angle.",
|
||||
@@ -2598,7 +2621,7 @@ menu_t OP_Player2CamOptionsDef = DEFAULTMENUSTYLE(NULL, OP_Player2CamOptionsMenu
|
||||
menu_t OP_Player3CamOptionsDef = DEFAULTMENUSTYLE(NULL, OP_Player3CamOptionsMenu, &OP_CamOptionsDef, 30, 30, OP_PlayerCamOptionsTooltips);
|
||||
menu_t OP_Player4CamOptionsDef = DEFAULTMENUSTYLE(NULL, OP_Player4CamOptionsMenu, &OP_CamOptionsDef, 30, 30, OP_PlayerCamOptionsTooltips);
|
||||
|
||||
menu_t OP_ChatOptionsDef = DEFAULTMENUSTYLE("M_HUD", OP_ChatOptionsMenu, &OP_HUDOptionsDef, 30, 30, OP_ChatOptionsTooltips);
|
||||
menu_t OP_ChatOptionsDef = DEFAULTSCROLLSTYLE("M_HUD", OP_ChatOptionsMenu, &OP_HUDOptionsDef, 30, 25, OP_ChatOptionsTooltips);
|
||||
|
||||
menu_t OP_SoundAdvancedDef = DEFAULTSCROLLSTYLE("M_SOUND", OP_SoundAdvancedMenu, &OP_SoundOptionsDef, 30, 30, OP_SoundAdvancedTooltips);
|
||||
|
||||
@@ -2723,6 +2746,15 @@ void PDistort_menu_Onchange(void)
|
||||
OP_PlayerDistortMenu[slrotatedist].status = IT_GRAYEDOUT;
|
||||
OP_PlayerDistortMenu[saltroll].status = IT_GRAYEDOUT;
|
||||
}
|
||||
|
||||
if (cv_stairjank.value)
|
||||
{
|
||||
OP_PlayerDistortMenu[stairjanksfx].status = IT_STRING | IT_CVAR;
|
||||
}
|
||||
else
|
||||
{
|
||||
OP_PlayerDistortMenu[stairjanksfx].status = IT_GRAYEDOUT;
|
||||
}
|
||||
}
|
||||
|
||||
void Bird_menu_Onchange(void)
|
||||
@@ -2781,6 +2813,5 @@ void M_UpdateOGLMenu(void)
|
||||
OP_OpenGLOptionsMenu[op_gl_lightdither].status = (!HWR_UseShader()) ? IT_GRAYEDOUT : IT_STRING | IT_CVAR;
|
||||
|
||||
OP_OpenGLOptionsMenu[op_gl_palrender].status = (cv_glscreentextures.value != 2 || !HWR_UseShader()) ? IT_GRAYEDOUT : IT_STRING | IT_CVAR;
|
||||
OP_OpenGLOptionsMenu[op_gl_flashpal].status = (!HWR_ShouldUsePaletteRendering()) ? IT_GRAYEDOUT : IT_STRING | IT_CVAR;
|
||||
}
|
||||
#endif
|
||||
+39
-10
@@ -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
|
||||
@@ -1454,9 +1460,9 @@ INT32 axtoi(const char *hexStg)
|
||||
|
||||
void CopyCaretColors(char *p, const char *s, int n)
|
||||
{
|
||||
char *t;
|
||||
int m;
|
||||
int c;
|
||||
gconst char *t;
|
||||
int m;
|
||||
int c;
|
||||
|
||||
if (!n)
|
||||
return;
|
||||
@@ -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)
|
||||
@@ -1956,6 +1969,22 @@ UINT32 FNV1a_Hash(const char *message, size_t size)
|
||||
return hash;
|
||||
}
|
||||
|
||||
// Behaves like the old quickncasehash
|
||||
// Stops either if it encounters null terminator
|
||||
// or reaches size
|
||||
UINT32 FNV1a_QuickCaseHash(const char *message, size_t size)
|
||||
{
|
||||
UINT32 hash = FNV1A_OFFSET_BASIS;
|
||||
|
||||
for (size_t i = 0; i < size && message[i]; i++)
|
||||
{
|
||||
hash ^= tolower(message[i]);
|
||||
hash *= FNV1A_PRIME;
|
||||
}
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
UINT32 FNV1a_HashString(const char *message)
|
||||
{
|
||||
UINT32 hash = FNV1A_OFFSET_BASIS;
|
||||
|
||||
@@ -123,6 +123,7 @@ FUNCMATH UINT8 M_CountBits(UINT32 num, UINT8 size);
|
||||
|
||||
// Hashes some message using FNV-1a
|
||||
UINT32 FNV1a_Hash(const char *message, size_t size);
|
||||
UINT32 FNV1a_QuickCaseHash(const char *message, size_t size);
|
||||
UINT32 FNV1a_HashString(const char *message);
|
||||
UINT32 FNV1a_HashLowercaseString(const char *message);
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ struct perfstatrow {
|
||||
static ps_metric_t ps_frametime = {0};
|
||||
|
||||
ps_metric_t ps_tictime = {0};
|
||||
ps_metric_t ps_prevtictime = {0};
|
||||
|
||||
ps_metric_t ps_playerthink_time = {0};
|
||||
ps_metric_t ps_thinkertime = {0};
|
||||
|
||||
@@ -36,6 +36,7 @@ typedef struct
|
||||
#define PS_STOP_TIMING(metric) metric.value.p = I_GetPreciseTime() - metric.value.p
|
||||
|
||||
extern ps_metric_t ps_tictime;
|
||||
extern ps_metric_t ps_prevtictime;
|
||||
|
||||
extern ps_metric_t ps_playerthink_time;
|
||||
extern ps_metric_t ps_thinkertime;
|
||||
|
||||
+6
-6
@@ -256,7 +256,7 @@ static boolean M_TextInputHandleBase(textinput_t *input, INT32 key, boolean emot
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((cv_keyboardlayout.value != 3 && ctrldown) || (cv_keyboardlayout.value == 3 && ctrldown && !altdown))
|
||||
if (ctrldown && (cv_keyboardlayout.value != 3 || !altdown))
|
||||
{
|
||||
if (key == 'x' || key == 'X')
|
||||
{
|
||||
@@ -381,10 +381,10 @@ static boolean M_TextInputHandleBase(textinput_t *input, INT32 key, boolean emot
|
||||
// allow people to use keypad in console (good for typing IP addresses) - Calum
|
||||
if (key >= KEY_KEYPAD7 && key <= KEY_KPADDEL)
|
||||
{
|
||||
char keypad_translation[] = {'7','8','9','-',
|
||||
'4','5','6','+',
|
||||
'1','2','3',
|
||||
'0','.'};
|
||||
const char keypad_translation[] = {'7','8','9','-',
|
||||
'4','5','6','+',
|
||||
'1','2','3',
|
||||
'0', '.'};
|
||||
|
||||
key = keypad_translation[key - KEY_KEYPAD7];
|
||||
}
|
||||
@@ -392,7 +392,7 @@ static boolean M_TextInputHandleBase(textinput_t *input, INT32 key, boolean emot
|
||||
key = '/';
|
||||
|
||||
// same capslock code as hu_stuff.c's HU_responder. Check there for details.
|
||||
key = cv_keyboardlayout.value == 3 ? CON_ShitAndAltGrChar(key) : CON_ShiftChar(key);
|
||||
key = CON_ShiftChar(key);
|
||||
|
||||
// enter a char into the command prompt
|
||||
if (key < 32 || key > 127)
|
||||
|
||||
Loaded 100 of 157 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user