Compare commits
471
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
148bd1ab4d | ||
|
|
473619ab66 | ||
|
|
d75638cbfc | ||
|
|
f09b591989 | ||
|
|
79d75aa08d | ||
|
|
486560d79e | ||
|
|
953b0c8f94 | ||
|
|
5639e872f1 | ||
|
|
80da0fc538 | ||
|
|
014126b57d | ||
|
|
d7b150a04f | ||
|
|
5751f9b29b | ||
|
|
1a29bd1e63 | ||
|
|
e54b6a780d | ||
|
|
c1a0b97c54 | ||
|
|
b8aaf63b20 | ||
|
|
d43b60ad83 | ||
|
|
cb5d3ab4e1 | ||
|
|
eba1cfb94d | ||
|
|
f5030e6a3c | ||
|
|
3adcf608c3 | ||
|
|
9682ab59c9 | ||
|
|
51adf8869c | ||
|
|
5183baed44 | ||
|
|
e5c6cb635d | ||
|
|
1ba4fe99a7 | ||
|
|
c44d6f6aeb | ||
|
|
07427b391e | ||
|
|
2210bd4e2d | ||
|
|
f4ac08d09f | ||
|
|
090580badf | ||
|
|
0eacda7494 | ||
|
|
14df9c01fa | ||
|
|
a69fc07dcf | ||
|
|
cea97226d5 | ||
|
|
19a7a4c5c1 | ||
|
|
98d4ab3e9d | ||
|
|
1700db48b4 | ||
|
|
ba3429f497 | ||
|
|
3b98d6c44f | ||
|
|
3183ec58ab | ||
|
|
46a72bda8e | ||
|
|
156400ffc2 | ||
|
|
116fbd93d0 | ||
|
|
30affaf451 | ||
|
|
d66020e3a9 | ||
|
|
4749d1a108 | ||
|
|
36d13734f6 | ||
|
|
3fc5f572bb | ||
|
|
d65319a9fc | ||
|
|
1d8b066a64 | ||
|
|
e6033322c6 | ||
|
|
d988876bca | ||
|
|
7e92482ced | ||
|
|
fa753c3694 | ||
|
|
58403cf4a5 | ||
|
|
13241d1880 | ||
|
|
91f016fd0c | ||
|
|
5e1ae2155f | ||
|
|
dd2a227529 | ||
|
|
9521183eb3 | ||
|
|
56bb20f4e1 | ||
|
|
604fa7281b | ||
|
|
2c9a82e2d3 | ||
|
|
4f7e296885 | ||
|
|
c917708184 | ||
|
|
110e93f4ed | ||
|
|
a0d6d452a0 | ||
|
|
7fb3f7a1aa | ||
|
|
7e906074ec | ||
|
|
de35e086d3 | ||
|
|
295b35b23a | ||
|
|
a5b6dad8f3 | ||
|
|
d024992144 | ||
|
|
3df604e8b6 | ||
|
|
080f586c19 | ||
|
|
0e62afd348 | ||
|
|
648d3c439b | ||
|
|
1dd3e90363 | ||
|
|
c78c0d1657 | ||
|
|
838d05eef7 | ||
|
|
3c3e8dd986 | ||
|
|
2d79ff9606 | ||
|
|
70f4207e02 | ||
|
|
242754f811 | ||
|
|
521544f6ba | ||
|
|
efc0681e01 | ||
|
|
4c3fa7d826 | ||
|
|
ac87678708 | ||
|
|
a6e5edabd2 | ||
|
|
24e5b1d84b | ||
|
|
ade7db9004 | ||
|
|
819b171d90 | ||
|
|
882716e911 | ||
|
|
5644036d25 | ||
|
|
de74c9251f | ||
|
|
1552b1808f | ||
|
|
fd349e2b37 | ||
|
|
0cf1cabcc2 | ||
|
|
bcbe765b9d | ||
|
|
eca3effb3b | ||
|
|
f1380a276e | ||
|
|
8ffeab1646 | ||
|
|
2eb175c356 | ||
|
|
4e606fc7de | ||
|
|
c5116dea1a | ||
|
|
924f9c2151 | ||
|
|
e0fa53e4df | ||
|
|
eeb7d48a6f | ||
|
|
df291710d8 | ||
|
|
16577877d3 | ||
|
|
309d459a70 | ||
|
|
e1430f7bc7 | ||
|
|
bf70beb88a | ||
|
|
a951622f6a | ||
|
|
d7db0d68dc | ||
|
|
2b9224cc3f | ||
|
|
0a750cd3bc | ||
|
|
0e8a32612f | ||
|
|
3c6882203b | ||
|
|
0464a8b0c7 | ||
|
|
599eda96aa | ||
|
|
421d735052 | ||
|
|
73bc64f9da | ||
|
|
5d807d65e5 | ||
|
|
88d86a6e60 | ||
|
|
b2cdbaae60 | ||
|
|
9160431556 | ||
|
|
2f9a400cf3 | ||
|
|
c39073dd9e | ||
|
|
f03692b840 | ||
|
|
617e8fdd55 | ||
|
|
d5252bd3b3 | ||
|
|
94f46c3ce6 | ||
|
|
c3e709231d | ||
|
|
7878e01e3f | ||
|
|
4631844c9f | ||
|
|
0c440d240c | ||
|
|
5c7be85977 | ||
|
|
c401926c0b | ||
|
|
e0e8be8d46 | ||
|
|
957d3f7229 | ||
|
|
7e47b9b6ba | ||
|
|
6e91e00289 | ||
|
|
a539f38e72 | ||
|
|
4f21d8f983 | ||
|
|
31517ebebe | ||
|
|
3a2e009d01 | ||
|
|
38e50a3cfb | ||
|
|
97555bc263 | ||
|
|
848115d105 | ||
|
|
3668c2c4f3 | ||
|
|
d5f68bf2aa | ||
|
|
3ae968f060 | ||
|
|
d73f79509e | ||
|
|
19e9eedce3 | ||
|
|
8880057ff2 | ||
|
|
9692484d2e | ||
|
|
df3a64339c | ||
|
|
5a966aa317 | ||
|
|
a132db9e6e | ||
|
|
0acfc96812 | ||
|
|
f09c61cee9 | ||
|
|
735c4b67dc | ||
|
|
267a758447 | ||
|
|
6892c212d1 | ||
|
|
a1127068df | ||
|
|
7ee93d889e | ||
|
|
ee9c9e2839 | ||
|
|
28c4061a26 | ||
|
|
d0f02f1530 | ||
|
|
53fbbecbcd | ||
|
|
587f24ae85 | ||
|
|
ba0b414062 | ||
|
|
b27b4bfd7a | ||
|
|
7971f76885 | ||
|
|
7048eeacc3 | ||
|
|
8a62f4e978 | ||
|
|
f5fdf917bd | ||
|
|
b9ac91c74f | ||
|
|
b408a098bd | ||
|
|
90ab1f4994 | ||
|
|
96484c94db | ||
|
|
c805fa9f33 | ||
|
|
29159ca5cd | ||
|
|
b6b70ae8f0 | ||
|
|
2b0e4b7468 | ||
|
|
c374bd75fc | ||
|
|
ec70e8aa29 | ||
|
|
3ad6159e85 | ||
|
|
2ae1e0f56e | ||
|
|
2302d4efbd | ||
|
|
be08c9cd1f | ||
|
|
7b91666db9 | ||
|
|
ba5c85ba8a | ||
|
|
05e8771fbc | ||
|
|
59b7b0529f | ||
|
|
3fa8ab442a | ||
|
|
fdd8381258 | ||
|
|
41cbce3ed3 | ||
|
|
63e4c5a63d | ||
|
|
bba86fe4af | ||
|
|
1dee3060dd | ||
|
|
56c2178bde | ||
|
|
e445669521 | ||
|
|
7a309bc0b8 | ||
|
|
8b6ebfbad4 | ||
|
|
5775c12b16 | ||
|
|
78ebc14d88 | ||
|
|
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 | ||
|
|
00bc8bc149 | ||
|
|
f12b55f63b | ||
|
|
3e476d7658 |
No files matched your search
+4
-1
@@ -1,5 +1,8 @@
|
|||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
|
# needed for lto to work for some reason
|
||||||
|
cmake_policy(SET CMP0069 NEW)
|
||||||
|
|
||||||
if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR})
|
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.")
|
message(FATAL_ERROR "In-source builds will bring you a world of pain. Please make a separate directory to invoke CMake from.")
|
||||||
endif()
|
endif()
|
||||||
@@ -31,7 +34,7 @@ if("${SRB2_CPACK_GENERATOR}" STREQUAL "")
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CPACK_GENERATOR ${SRB2_CPACK_GENERATOR})
|
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_VENDOR "Kart Krew" CACHE STRING "Vendor name for display purposes")
|
||||||
#set(CPACK_PACKAGE_DESCRIPTION_FILE )
|
#set(CPACK_PACKAGE_DESCRIPTION_FILE )
|
||||||
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
|
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
|
||||||
|
|||||||
+16
-4
@@ -54,7 +54,7 @@ set(SRB2_CORE_SOURCES
|
|||||||
string.c
|
string.c
|
||||||
tables.c
|
tables.c
|
||||||
v_video.c
|
v_video.c
|
||||||
w_wad.cpp
|
w_wad.c
|
||||||
y_inter.c
|
y_inter.c
|
||||||
z_zone.cpp
|
z_zone.cpp
|
||||||
)
|
)
|
||||||
@@ -246,6 +246,11 @@ set(SRB2_CONFIG_ASAN OFF CACHE BOOL
|
|||||||
"Compile with AddressSanitizer (libasan).")
|
"Compile with AddressSanitizer (libasan).")
|
||||||
set(SRB2_CONFIG_UBSAN OFF CACHE BOOL
|
set(SRB2_CONFIG_UBSAN OFF CACHE BOOL
|
||||||
"Compile with UndefinedBehaviorSanitizer (libubsan).")
|
"Compile with UndefinedBehaviorSanitizer (libubsan).")
|
||||||
|
set(SRB2_CONFIG_TSAN OFF CACHE BOOL
|
||||||
|
"Compile with ThreadSanitizer (libtsan).")
|
||||||
|
|
||||||
|
set(SRB2_CONFIG_MUMBLE ON CACHE BOOL
|
||||||
|
"Enable Mumble support")
|
||||||
|
|
||||||
set(SRB2_CONFIG_SATURNPAK ON CACHE BOOL
|
set(SRB2_CONFIG_SATURNPAK ON CACHE BOOL
|
||||||
"Enable Saturn specific special packet. Required for using the newer resynch system")
|
"Enable Saturn specific special packet. Required for using the newer resynch system")
|
||||||
@@ -254,6 +259,9 @@ set(SRB2_CONFIG_SATURNJOIN ON CACHE BOOL
|
|||||||
set(SRB2_CONFIG_SCREENFBO ON CACHE BOOL
|
set(SRB2_CONFIG_SCREENFBO ON CACHE BOOL
|
||||||
"Enable hardware renderer (OpenGL) FBO downsampling support")
|
"Enable hardware renderer (OpenGL) FBO downsampling support")
|
||||||
|
|
||||||
|
set(SRB2_CONFIG_PHOBOS OFF CACHE BOOL
|
||||||
|
" Compile the Phobos client. Which contains things not compatible with vanilla, such as raised skinlimits, 32 player support, bugfixes, etc.")
|
||||||
|
|
||||||
if(${SRB2_CONFIG_DEDICATED})
|
if(${SRB2_CONFIG_DEDICATED})
|
||||||
set(SRB2_CONFIG_HAVE_GME NO)
|
set(SRB2_CONFIG_HAVE_GME NO)
|
||||||
set(SRB2_CONFIG_HAVE_OPENMPT NO)
|
set(SRB2_CONFIG_HAVE_OPENMPT NO)
|
||||||
@@ -275,6 +283,7 @@ if(${SRB2_CONFIG_HAVE_BLUA})
|
|||||||
lua_hooklib.c
|
lua_hooklib.c
|
||||||
lua_hudlib.c
|
lua_hudlib.c
|
||||||
lua_hudlib_drawlist.c
|
lua_hudlib_drawlist.c
|
||||||
|
lua_profile.cpp
|
||||||
lua_infolib.c
|
lua_infolib.c
|
||||||
lua_maplib.c
|
lua_maplib.c
|
||||||
lua_mathlib.c
|
lua_mathlib.c
|
||||||
@@ -283,16 +292,15 @@ if(${SRB2_CONFIG_HAVE_BLUA})
|
|||||||
lua_script.c
|
lua_script.c
|
||||||
lua_skinlib.c
|
lua_skinlib.c
|
||||||
lua_thinkerlib.c
|
lua_thinkerlib.c
|
||||||
lua_udatalib.c
|
|
||||||
lua_glib.c
|
lua_glib.c
|
||||||
)
|
)
|
||||||
set(SRB2_LUA_HEADERS
|
set(SRB2_LUA_HEADERS
|
||||||
lua_hook.h
|
lua_hook.h
|
||||||
lua_hud.h
|
lua_hud.h
|
||||||
lua_hudlib_drawlist.h
|
lua_hudlib_drawlist.h
|
||||||
|
lua_profile.h
|
||||||
lua_libs.h
|
lua_libs.h
|
||||||
lua_script.h
|
lua_script.h
|
||||||
lua_udatalib.h
|
|
||||||
lua_glib.h
|
lua_glib.h
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -518,7 +526,7 @@ if(${SRB2_CONFIG_HWRENDER})
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_batching.c
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_batching.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_shaders.c
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_shaders.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_bsp.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_clip.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_draw.c
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_draw.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_main.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_main.cpp
|
||||||
@@ -578,6 +586,10 @@ if(${SRB2_CONFIG_SATURNJOIN})
|
|||||||
add_definitions(-DDOSATURNJOIN)
|
add_definitions(-DDOSATURNJOIN)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(${SRB2_CONFIG_PHOBOS})
|
||||||
|
add_definitions(-DPHOBOS_BUILD)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Targets
|
# Targets
|
||||||
|
|
||||||
# Compatibility flag with later versions of GCC
|
# Compatibility flag with later versions of GCC
|
||||||
|
|||||||
+28
-10
@@ -65,12 +65,17 @@
|
|||||||
# DEBUGMODE=1 - Enable various debugging capabilities.
|
# DEBUGMODE=1 - Enable various debugging capabilities.
|
||||||
# Also disables optimizations.
|
# Also disables optimizations.
|
||||||
#
|
#
|
||||||
|
# PHOBOS_BUILD=1 - Compile the Phobos client.
|
||||||
|
# Contains things not compatible with vanilla.
|
||||||
|
# such as raised skinlimits, 32 player support, bugfixes, etc.
|
||||||
|
#
|
||||||
# Development flags:
|
# Development flags:
|
||||||
#
|
#
|
||||||
# VALGRIND=1 - Enable Valgrind memory debugging support.
|
# VALGRIND=1 - Enable Valgrind memory debugging support.
|
||||||
# PROFILEMODE=1 - Enable performance profiling (gprof).
|
# PROFILEMODE=1 - Enable performance profiling (gprof).
|
||||||
# USEASAN=1 - Enable building with Address Sanitizer.
|
# USEASAN=1 - Enable building with Address Sanitizer.
|
||||||
# USEUBSAN=1 - Enable building with Undefined Behavior Sanitizer.
|
# USEUBSAN=1 - Enable building with Undefined Behavior Sanitizer.
|
||||||
|
# USETSAN=1 - Enable building with Thread Sanitizer.
|
||||||
# NOLIBBACKTRACE=1 - Disable using Libbacktrace for crashlog traces.
|
# NOLIBBACKTRACE=1 - Disable using Libbacktrace for crashlog traces.
|
||||||
#
|
#
|
||||||
# General flags for building:
|
# General flags for building:
|
||||||
@@ -93,7 +98,8 @@
|
|||||||
# NOLDWARNING=1 - ?
|
# NOLDWARNING=1 - ?
|
||||||
# NOSDLMAIN=1 - ?
|
# NOSDLMAIN=1 - ?
|
||||||
# SDLMAIN=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:
|
# Library configuration flags:
|
||||||
# Everything here is an override.
|
# Everything here is an override.
|
||||||
@@ -245,10 +251,6 @@ ifdef STATIC
|
|||||||
libs+=-static
|
libs+=-static
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter $(CC) $(CXX),gcc g++))
|
|
||||||
opts+=-mno-ms-bitfields
|
|
||||||
endif
|
|
||||||
|
|
||||||
# build with profiling information
|
# build with profiling information
|
||||||
ifdef PROFILEMODE
|
ifdef PROFILEMODE
|
||||||
opts+=-pg
|
opts+=-pg
|
||||||
@@ -260,23 +262,39 @@ debug_opts=-D_DEBUG
|
|||||||
else # build a normal optimized version
|
else # build a normal optimized version
|
||||||
debug_opts=-DNDEBUG
|
debug_opts=-DNDEBUG
|
||||||
opts+=-O3
|
opts+=-O3
|
||||||
ifdef USELTO
|
|
||||||
# compile with LTO
|
|
||||||
opts+=-flto=auto
|
|
||||||
libs+=-flto=auto
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef USEASAN
|
ifdef USEASAN
|
||||||
# compile with asan
|
# compile with asan
|
||||||
opts+=-O1 -fsanitize=address -fno-omit-frame-pointer -fno-common
|
opts+=-O1 -fsanitize=address -fno-omit-frame-pointer -fno-common
|
||||||
libs+=-fsanitize=address
|
libs+=-fsanitize=address
|
||||||
|
NOLTO=1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef USEUBSAN
|
ifdef USEUBSAN
|
||||||
# compile with ubsan
|
# compile with ubsan
|
||||||
opts+=-O1 -fsanitize=undefined -fno-omit-frame-pointer
|
opts+=-O1 -fsanitize=undefined -fno-omit-frame-pointer
|
||||||
libs+=-fsanitize=undefined
|
libs+=-fsanitize=undefined
|
||||||
|
NOLTO=1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef USETSAN
|
||||||
|
# compile with tsan
|
||||||
|
opts+=-O1 -fsanitize=thread -fno-omit-frame-pointer
|
||||||
|
libs+=-fsanitize=thread
|
||||||
|
NOLTO=1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifndef DEBUGMODE
|
||||||
|
ifndef NOLTO
|
||||||
|
# compile with LTO
|
||||||
|
opts+=-flto=auto
|
||||||
|
libs+=-flto=auto
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef USEJEMALLOC
|
||||||
|
libs+=-ljemalloc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter $(CC) $(CXX),clang clang++))
|
ifneq (,$(filter $(CC) $(CXX),clang clang++))
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ endif
|
|||||||
|
|
||||||
# This must have high to low order.
|
# This must have high to low order.
|
||||||
gcc_versions:=\
|
gcc_versions:=\
|
||||||
|
161 160 16\
|
||||||
152 151 150 15\
|
152 151 150 15\
|
||||||
142 141 140 14\
|
142 141 140 14\
|
||||||
133 132 131 130 13\
|
133 132 131 130 13\
|
||||||
@@ -77,7 +78,7 @@ gcc_versions:=\
|
|||||||
55 54 53 52 51 50\
|
55 54 53 52 51 50\
|
||||||
49 48 47 46 45 44 43 42 41 40
|
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
|
# Automatically set version flag, but not if one was
|
||||||
# manually set. And don't bother if this is a clean only
|
# manually set. And don't bother if this is a clean only
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ passthru_opts+=\
|
|||||||
HAVE_MINIUPNPC\
|
HAVE_MINIUPNPC\
|
||||||
HAVE_DISCORDRPC DEVELOP\
|
HAVE_DISCORDRPC DEVELOP\
|
||||||
NOHOLEPUNCH\
|
NOHOLEPUNCH\
|
||||||
|
HAVE_IPV6\
|
||||||
|
PHOBOS_BUILD\
|
||||||
|
|
||||||
# build with debugging information
|
# build with debugging information
|
||||||
ifdef DEBUGMODE
|
ifdef DEBUGMODE
|
||||||
@@ -85,7 +87,7 @@ ifdef VALGRIND
|
|||||||
VALGRIND_PKGCONFIG?=valgrind
|
VALGRIND_PKGCONFIG?=valgrind
|
||||||
VALGRIND_LDFLAGS=
|
VALGRIND_LDFLAGS=
|
||||||
$(eval $(call Use_pkg_config,VALGRIND))
|
$(eval $(call Use_pkg_config,VALGRIND))
|
||||||
ZDEBUG=1
|
#ZDEBUG=1 we enable this by default
|
||||||
opts+=-DHAVE_VALGRIND
|
opts+=-DHAVE_VALGRIND
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|||||||
@@ -42,8 +42,6 @@ include Makefile.d/haiku.mk
|
|||||||
else ifdef SOLARIS # FIXME: UNTESTED
|
else ifdef SOLARIS # FIXME: UNTESTED
|
||||||
UNIX=1
|
UNIX=1
|
||||||
platform=solaris
|
platform=solaris
|
||||||
else ifdef CYGWIN32 # FIXME: UNTESTED
|
|
||||||
platform=cygwin
|
|
||||||
else ifdef MINGW
|
else ifdef MINGW
|
||||||
ifdef MINGW64
|
ifdef MINGW64
|
||||||
NONX86=1
|
NONX86=1
|
||||||
|
|||||||
@@ -15,16 +15,6 @@ sources+=$(call List,sdl/Sourcefile)
|
|||||||
|
|
||||||
NOUPNP=1
|
NOUPNP=1
|
||||||
|
|
||||||
# FIXME: UNTESTED
|
|
||||||
#ifdef PANDORA
|
|
||||||
#include sdl/SRB2Pandora/Makefile.cfg
|
|
||||||
#endif #ifdef PANDORA
|
|
||||||
|
|
||||||
# FIXME: UNTESTED
|
|
||||||
#ifdef CYGWIN32
|
|
||||||
#include sdl/MakeCYG.cfg
|
|
||||||
#endif #ifdef CYGWIN32
|
|
||||||
|
|
||||||
ifndef NOHW
|
ifndef NOHW
|
||||||
sources+=sdl/ogl_sdl.c
|
sources+=sdl/ogl_sdl.c
|
||||||
endif
|
endif
|
||||||
|
|||||||
+1
-1
@@ -97,5 +97,5 @@ lua_playerlib.c
|
|||||||
lua_script.c
|
lua_script.c
|
||||||
lua_skinlib.c
|
lua_skinlib.c
|
||||||
lua_thinkerlib.c
|
lua_thinkerlib.c
|
||||||
lua_udatalib.c
|
|
||||||
lua_glib.c
|
lua_glib.c
|
||||||
|
lua_profile.cpp
|
||||||
@@ -34,8 +34,8 @@ size_t I_GetFreeMem(size_t *total)
|
|||||||
/* return si.freeram; */
|
/* return si.freeram; */
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
char *memTag;
|
char *memTag;
|
||||||
UINT32 freeKBytes;
|
size_t freeKBytes;
|
||||||
UINT32 totalKBytes;
|
size_t totalKBytes;
|
||||||
INT32 n;
|
INT32 n;
|
||||||
INT32 meminfo_fd = -1;
|
INT32 meminfo_fd = -1;
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ size_t I_GetFreeMem(size_t *total)
|
|||||||
if (n < 0)
|
if (n < 0)
|
||||||
{
|
{
|
||||||
// Error
|
// Error
|
||||||
*total = 0L;
|
*total = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ size_t I_GetFreeMem(size_t *total)
|
|||||||
if (NULL == (memTag = strstr(buf, MEMTOTAL)))
|
if (NULL == (memTag = strstr(buf, MEMTOTAL)))
|
||||||
{
|
{
|
||||||
// Error
|
// Error
|
||||||
*total = 0L;
|
*total = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ size_t I_GetFreeMem(size_t *total)
|
|||||||
if (NULL == (memTag = strstr(buf, MEMFREE)))
|
if (NULL == (memTag = strstr(buf, MEMFREE)))
|
||||||
{
|
{
|
||||||
// Error
|
// Error
|
||||||
*total = 0L;
|
*total = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -55,8 +55,8 @@ struct lua_longjmp {
|
|||||||
|
|
||||||
void luaD_seterrorobj (lua_State *L, int lerrcode, StkId oldtop) {
|
void luaD_seterrorobj (lua_State *L, int lerrcode, StkId oldtop) {
|
||||||
switch (lerrcode) {
|
switch (lerrcode) {
|
||||||
case LUA_ERRMEM: {
|
case LUA_ERRMEM: { /* memory error? */
|
||||||
setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG));
|
setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LUA_ERRERR: {
|
case LUA_ERRERR: {
|
||||||
|
|||||||
@@ -13,8 +13,6 @@
|
|||||||
#include "llimits.h"
|
#include "llimits.h"
|
||||||
#include "lua.h"
|
#include "lua.h"
|
||||||
|
|
||||||
#define MEMERRMSG "not enough memory"
|
|
||||||
|
|
||||||
|
|
||||||
#define luaM_reallocv(L,b,on,n,e) \
|
#define luaM_reallocv(L,b,on,n,e) \
|
||||||
((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ? /* +1 to avoid warnings */ \
|
((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ? /* +1 to avoid warnings */ \
|
||||||
|
|||||||
+1
-1
@@ -143,7 +143,7 @@ const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) {
|
|||||||
}
|
}
|
||||||
case 'p': {
|
case 'p': {
|
||||||
char buff[4*sizeof(void *) + 8]; /* should be enough space for a `%p' */
|
char buff[4*sizeof(void *) + 8]; /* should be enough space for a `%p' */
|
||||||
sprintf(buff, "%p", va_arg(argp, void *));
|
snprintf(buff, sizeof(buff), "%p", va_arg(argp, void *));
|
||||||
pushstr(L, buff);
|
pushstr(L, buff);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-1
@@ -64,6 +64,9 @@ static void freestack (lua_State *L, lua_State *L1) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define MEMERRMSG "not enough memory"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** open parts that may cause memory-allocation errors
|
** open parts that may cause memory-allocation errors
|
||||||
*/
|
*/
|
||||||
@@ -76,7 +79,9 @@ static void f_luaopen (lua_State *L, void *ud) {
|
|||||||
luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */
|
luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */
|
||||||
luaT_init(L);
|
luaT_init(L);
|
||||||
luaX_init(L);
|
luaX_init(L);
|
||||||
luaS_fix(luaS_newliteral(L, MEMERRMSG));
|
/* pre-create memory-error message */
|
||||||
|
g->memerrmsg = luaS_newliteral(L, MEMERRMSG);
|
||||||
|
luaS_fix(g->memerrmsg); /* it should never be collected */
|
||||||
g->GCthreshold = 4*g->totalbytes;
|
g->GCthreshold = 4*g->totalbytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ typedef struct global_State {
|
|||||||
lua_CFunction panic; /* to be called in unprotected errors */
|
lua_CFunction panic; /* to be called in unprotected errors */
|
||||||
TValue l_registry;
|
TValue l_registry;
|
||||||
struct lua_State *mainthread;
|
struct lua_State *mainthread;
|
||||||
|
TString *memerrmsg; /* memory-error message */
|
||||||
UpVal uvhead; /* head of double-linked list of all open upvalues */
|
UpVal uvhead; /* head of double-linked list of all open upvalues */
|
||||||
struct Table *mt[NUM_TAGS]; /* metatables for basic types */
|
struct Table *mt[NUM_TAGS]; /* metatables for basic types */
|
||||||
TString *tmname[TM_N]; /* array with tag-method names */
|
TString *tmname[TM_N]; /* array with tag-method names */
|
||||||
|
|||||||
+5
-5
@@ -776,23 +776,23 @@ static int str_format (lua_State *L) {
|
|||||||
strfrmt = scanformat(L, strfrmt, form);
|
strfrmt = scanformat(L, strfrmt, form);
|
||||||
switch (*strfrmt++) {
|
switch (*strfrmt++) {
|
||||||
case 'c': {
|
case 'c': {
|
||||||
sprintf(buff, form, (int)luaL_checknumber(L, arg));
|
snprintf(buff, sizeof(buff), form, (int)luaL_checknumber(L, arg));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'd': case 'i': {
|
case 'd': case 'i': {
|
||||||
addintlen(form);
|
addintlen(form);
|
||||||
sprintf(buff, form, (LUA_INTFRM_T)luaL_checknumber(L, arg));
|
snprintf(buff, sizeof(buff), form, (LUA_INTFRM_T)luaL_checknumber(L, arg));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'o': case 'u': case 'x': case 'X': {
|
case 'o': case 'u': case 'x': case 'X': {
|
||||||
addintlen(form);
|
addintlen(form);
|
||||||
sprintf(buff, form, (unsigned LUA_INTFRM_T)luaL_checknumber(L, arg));
|
snprintf(buff, sizeof(buff), form, (unsigned LUA_INTFRM_T)luaL_checknumber(L, arg));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'e': case 'E': case 'f':
|
case 'e': case 'E': case 'f':
|
||||||
case 'g': case 'G': {
|
case 'g': case 'G': {
|
||||||
lua_Number n = luaL_checknumber(L, arg);
|
lua_Number n = luaL_checknumber(L, arg);
|
||||||
sprintf(buff, form, (double)n);
|
snprintf(buff, sizeof(buff), form, (double)n);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'q': {
|
case 'q': {
|
||||||
@@ -810,7 +810,7 @@ static int str_format (lua_State *L) {
|
|||||||
continue; /* skip the `addsize' at the end */
|
continue; /* skip the `addsize' at the end */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sprintf(buff, form, s);
|
snprintf(buff, sizeof(buff), form, s);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ static /*const*/ Node dummynode_ = {
|
|||||||
/*
|
/*
|
||||||
** hash for lua_Numbers
|
** hash for lua_Numbers
|
||||||
*/
|
*/
|
||||||
|
#if 0
|
||||||
static Node *hashnum (const Table *t, lua_Number n) {
|
static Node *hashnum (const Table *t, lua_Number n) {
|
||||||
unsigned int a[numints];
|
unsigned int a[numints];
|
||||||
int i;
|
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];
|
for (i = 1; i < numints; i++) a[0] += a[i];
|
||||||
return hashmod(t, a[0]);
|
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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -536,7 +536,7 @@
|
|||||||
#define LUA_NUMBER_SCAN "%d"
|
#define LUA_NUMBER_SCAN "%d"
|
||||||
#define LUA_NUMBER_FMT "%d"
|
#define LUA_NUMBER_FMT "%d"
|
||||||
#endif
|
#endif
|
||||||
#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n))
|
#define lua_number2str(s,n) snprintf((s), LUAI_MAXNUMBER2STR, LUA_NUMBER_FMT, (n))
|
||||||
#define LUAI_MAXNUMBER2STR 12 /* 10 digits, sign, and \0 */
|
#define LUAI_MAXNUMBER2STR 12 /* 10 digits, sign, and \0 */
|
||||||
#define lua_str2number(s,p) ({ \
|
#define lua_str2number(s,p) ({ \
|
||||||
long nmr = strtol((s), (p), 10); \
|
long nmr = strtol((s), (p), 10); \
|
||||||
|
|||||||
@@ -206,6 +206,15 @@ FUNCINLINE static ATTRINLINE UINT32 readulong(void *ptr)
|
|||||||
p += n; \
|
p += n; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PHOBOS_BUILD
|
||||||
|
#define WRITESKIN(p,b) WRITEUINT16(p,b)
|
||||||
|
#define READSKIN(p) READUINT16(p)
|
||||||
|
#else
|
||||||
|
#define WRITESKIN(p,b) WRITEUINT8(p,b)
|
||||||
|
#define READSKIN(p) READUINT8(p)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+108
-18
@@ -113,18 +113,29 @@ static vsbuf_t com_text; // variable sized buffer
|
|||||||
* \param ptext The text to add.
|
* \param ptext The text to add.
|
||||||
* \sa COM_BufInsertText
|
* \sa COM_BufInsertText
|
||||||
*/
|
*/
|
||||||
void COM_BufAddText(const char *ptext)
|
void COM_BufAddTextEx(const char *ptext, size_t plen)
|
||||||
{
|
{
|
||||||
size_t l;
|
size_t l;
|
||||||
|
char *text;
|
||||||
|
|
||||||
l = strlen(ptext);
|
if (plen == 0)
|
||||||
|
plen = strlen(ptext);
|
||||||
|
|
||||||
|
text = Z_Malloc(sizeof(char) * (plen+1), PU_STATIC, NULL);
|
||||||
|
memcpy(text, ptext, plen);
|
||||||
|
text[plen] = '\0';
|
||||||
|
|
||||||
|
l = strlen(text);
|
||||||
|
|
||||||
if (com_text.cursize + l >= com_text.maxsize)
|
if (com_text.cursize + l >= com_text.maxsize)
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Command buffer full!\n"));
|
CONS_Alert(CONS_WARNING, M_GetText("Command buffer full!\n"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
VS_Write(&com_text, ptext, l);
|
|
||||||
|
VS_Write(&com_text, text, l);
|
||||||
|
|
||||||
|
Z_Free(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Adds command text and executes it immediately.
|
/** Adds command text and executes it immediately.
|
||||||
@@ -132,8 +143,10 @@ void COM_BufAddText(const char *ptext)
|
|||||||
* \param ptext The text to execute. A newline is automatically added.
|
* \param ptext The text to execute. A newline is automatically added.
|
||||||
* \sa COM_BufAddText
|
* \sa COM_BufAddText
|
||||||
*/
|
*/
|
||||||
void COM_BufInsertText(const char *ptext)
|
void COM_BufInsertTextEx(const char *ptext, size_t plen)
|
||||||
{
|
{
|
||||||
|
const INT32 old_wait = com_wait;
|
||||||
|
|
||||||
char *temp = NULL;
|
char *temp = NULL;
|
||||||
size_t templen;
|
size_t templen;
|
||||||
|
|
||||||
@@ -145,10 +158,14 @@ void COM_BufInsertText(const char *ptext)
|
|||||||
VS_Clear(&com_text);
|
VS_Clear(&com_text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
com_wait = 0;
|
||||||
|
|
||||||
// add the entire text of the file (or alias)
|
// add the entire text of the file (or alias)
|
||||||
COM_BufAddText(ptext);
|
COM_BufAddTextEx(ptext, plen);
|
||||||
COM_BufExecute(); // do it right away
|
COM_BufExecute(); // do it right away
|
||||||
|
|
||||||
|
com_wait += old_wait;
|
||||||
|
|
||||||
// add the copied off data
|
// add the copied off data
|
||||||
if (templen)
|
if (templen)
|
||||||
{
|
{
|
||||||
@@ -159,8 +176,7 @@ void COM_BufInsertText(const char *ptext)
|
|||||||
|
|
||||||
/** Progress the wait timer and flush waiting console commands when ready.
|
/** Progress the wait timer and flush waiting console commands when ready.
|
||||||
*/
|
*/
|
||||||
void
|
void COM_BufTicker(void)
|
||||||
COM_BufTicker(void)
|
|
||||||
{
|
{
|
||||||
if (com_wait)
|
if (com_wait)
|
||||||
{
|
{
|
||||||
@@ -1165,6 +1181,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 = "";
|
static const char *cv_null_string = "";
|
||||||
|
|
||||||
/** Searches if a variable has been registered.
|
/** Searches if a variable has been registered.
|
||||||
@@ -1175,11 +1224,17 @@ static const char *cv_null_string = "";
|
|||||||
*/
|
*/
|
||||||
consvar_t *CV_FindVar(const char *name)
|
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)
|
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||||
if (fasticmp(name, cvar->name))
|
if (fasticmp(name, cvar->name))
|
||||||
return cvar;
|
return cvar;
|
||||||
|
*/
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -1194,7 +1249,7 @@ consvar_t *CV_FindVar(const char *name)
|
|||||||
static inline UINT16 CV_ComputeNetid(const char *s)
|
static inline UINT16 CV_ComputeNetid(const char *s)
|
||||||
{
|
{
|
||||||
UINT16 ret = 0, i = 0;
|
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)
|
while (*s)
|
||||||
{
|
{
|
||||||
@@ -1213,11 +1268,17 @@ static inline UINT16 CV_ComputeNetid(const char *s)
|
|||||||
*/
|
*/
|
||||||
static consvar_t *CV_FindNetVar(UINT16 netid)
|
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;
|
consvar_t *cvar;
|
||||||
|
|
||||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||||
if (cvar->netid == netid)
|
if (cvar->netid == netid)
|
||||||
return cvar;
|
return cvar;
|
||||||
|
*/
|
||||||
|
|
||||||
if (netid == 44542) // ouch this hack
|
if (netid == 44542) // ouch this hack
|
||||||
return &cv_karteliminatelast;
|
return &cv_karteliminatelast;
|
||||||
@@ -1283,6 +1344,11 @@ void CV_RegisterVar(consvar_t *variable)
|
|||||||
|
|
||||||
// the SetValue will set this bit
|
// the SetValue will set this bit
|
||||||
variable->flags &= ~CV_MODIFIED;
|
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.
|
/** Finds the string value of a console variable.
|
||||||
@@ -1546,7 +1612,9 @@ void CV_SaveNetVars(UINT8 **p, boolean isdemorecording)
|
|||||||
// send only changed cvars ...
|
// send only changed cvars ...
|
||||||
// the client will reset all netvars to default before loading
|
// the client will reset all netvars to default before loading
|
||||||
WRITEUINT16(*p, 0x0000);
|
WRITEUINT16(*p, 0x0000);
|
||||||
|
|
||||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||||
|
{
|
||||||
if (((cvar->flags & CV_NETVAR) && !CV_IsSetToDefault(cvar)) || (isdemorecording && cvar->netid == cv_numlaps.netid))
|
if (((cvar->flags & CV_NETVAR) && !CV_IsSetToDefault(cvar)) || (isdemorecording && cvar->netid == cv_numlaps.netid))
|
||||||
{
|
{
|
||||||
WRITEUINT16(*p, cvar->netid);
|
WRITEUINT16(*p, cvar->netid);
|
||||||
@@ -1564,7 +1632,7 @@ void CV_SaveNetVars(UINT8 **p, boolean isdemorecording)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
char buf[9];
|
char buf[9];
|
||||||
sprintf(buf, "%d", mapheaderinfo[gamemap - 1]->numlaps);
|
snprintf(buf, sizeof(buf), "%d", mapheaderinfo[gamemap - 1]->numlaps);
|
||||||
WRITESTRING(*p, buf);
|
WRITESTRING(*p, buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1576,6 +1644,8 @@ void CV_SaveNetVars(UINT8 **p, boolean isdemorecording)
|
|||||||
WRITEUINT8(*p, false);
|
WRITEUINT8(*p, false);
|
||||||
++count;
|
++count;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
WRITEUINT16(count_p, count);
|
WRITEUINT16(count_p, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1588,9 +1658,21 @@ size_t CV_LoadNetVars(const UINT8 *bufstart)
|
|||||||
// prevent "invalid command received"
|
// prevent "invalid command received"
|
||||||
serverloading = true;
|
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)
|
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||||
if (cvar->flags & CV_NETVAR)
|
if (cvar->flags & CV_NETVAR)
|
||||||
Setvalue(cvar, cvar->defaultvalue, true);
|
Setvalue(cvar, cvar->defaultvalue, true);
|
||||||
|
*/
|
||||||
|
|
||||||
count = READUINT16(p);
|
count = READUINT16(p);
|
||||||
while (count--)
|
while (count--)
|
||||||
@@ -1657,6 +1739,7 @@ static void CV_SetCVar(consvar_t *var, const char *value, boolean stealth)
|
|||||||
// send the value of the variable
|
// send the value of the variable
|
||||||
UINT8 buf[128];
|
UINT8 buf[128];
|
||||||
UINT8 *p = buf;
|
UINT8 *p = buf;
|
||||||
|
|
||||||
if (!(server || (IsPlayerAdmin(consoleplayer))))
|
if (!(server || (IsPlayerAdmin(consoleplayer))))
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_NOTICE, "Only the server or admin can change: %s %s\n", var->name, var->string);
|
CONS_Alert(CONS_NOTICE, "Only the server or admin can change: %s %s\n", var->name, var->string);
|
||||||
@@ -1720,8 +1803,7 @@ void CV_StealthSet(consvar_t *var, const char *value)
|
|||||||
void CV_StealthSetValue(consvar_t *var, INT32 value)
|
void CV_StealthSetValue(consvar_t *var, INT32 value)
|
||||||
{
|
{
|
||||||
char val[32];
|
char val[32];
|
||||||
|
snprintf(val, sizeof(val), "%d", value);
|
||||||
sprintf(val, "%d", value);
|
|
||||||
CV_SetCVar(var, val, true);
|
CV_SetCVar(var, val, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1741,8 +1823,7 @@ void CV_Set(consvar_t *var, const char *value)
|
|||||||
void CV_SetValue(consvar_t *var, INT32 value)
|
void CV_SetValue(consvar_t *var, INT32 value)
|
||||||
{
|
{
|
||||||
char val[32];
|
char val[32];
|
||||||
|
snprintf(val, sizeof(val), "%d", value);
|
||||||
sprintf(val, "%d", value);
|
|
||||||
CV_SetCVar(var, val, false);
|
CV_SetCVar(var, val, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2140,6 +2221,7 @@ void CV_SaveVariables(FILE *f)
|
|||||||
consvar_t *cvar;
|
consvar_t *cvar;
|
||||||
|
|
||||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||||
|
{
|
||||||
if (cvar->flags & CV_SAVE)
|
if (cvar->flags & CV_SAVE)
|
||||||
{
|
{
|
||||||
char stringtowrite[MAXTEXTCMD+1];
|
char stringtowrite[MAXTEXTCMD+1];
|
||||||
@@ -2148,15 +2230,23 @@ void CV_SaveVariables(FILE *f)
|
|||||||
if (fastcmp(cvar->string, "MAX") || fastcmp(cvar->string, "MIN"))
|
if (fastcmp(cvar->string, "MAX") || fastcmp(cvar->string, "MIN"))
|
||||||
{
|
{
|
||||||
if (cvar->flags & CV_FLOAT)
|
if (cvar->flags & CV_FLOAT)
|
||||||
sprintf(stringtowrite, "%f", FixedToFloat(cvar->value));
|
{
|
||||||
else
|
snprintf(stringtowrite, sizeof(stringtowrite), "%f", FixedToFloat(cvar->value));
|
||||||
sprintf(stringtowrite, "%d", cvar->value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
strcpy(stringtowrite, cvar->string);
|
{
|
||||||
|
snprintf(stringtowrite, sizeof(stringtowrite), "%d", cvar->value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strncpy(stringtowrite, cvar->string, sizeof(stringtowrite)-1);
|
||||||
|
stringtowrite[sizeof(stringtowrite)-1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
fprintf(f, "%s \"%s\"\n", cvar->name, stringtowrite);
|
fprintf(f, "%s \"%s\"\n", cvar->name, stringtowrite);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|||||||
+4
-2
@@ -52,10 +52,12 @@ size_t COM_FirstOption(void);
|
|||||||
const char *COM_CompleteCommand(const char *partial, INT32 skips);
|
const char *COM_CompleteCommand(const char *partial, INT32 skips);
|
||||||
|
|
||||||
// insert at queu (at end of other command)
|
// insert at queu (at end of other command)
|
||||||
void COM_BufAddText(const char *btext);
|
#define COM_BufAddText(s) COM_BufAddTextEx(s, 0)
|
||||||
|
void COM_BufAddTextEx(const char *ptext, size_t plen);
|
||||||
|
|
||||||
// insert in head (before other command)
|
// insert in head (before other command)
|
||||||
void COM_BufInsertText(const char *btext);
|
#define COM_BufInsertText(s) COM_BufInsertTextEx(s, 0)
|
||||||
|
void COM_BufInsertTextEx(const char *ptext, size_t plen);
|
||||||
|
|
||||||
// don't bother inserting, just do immediately
|
// don't bother inserting, just do immediately
|
||||||
void COM_ImmedExecute(const char *ptext);
|
void COM_ImmedExecute(const char *ptext);
|
||||||
|
|||||||
+214
-85
@@ -62,7 +62,7 @@ static boolean con_started = false; // console has been initialised
|
|||||||
static boolean con_forcepic = true; // at startup toggle console translucency when first off
|
static boolean con_forcepic = true; // at startup toggle console translucency when first off
|
||||||
boolean con_recalc = false; // set true when screen size has changed
|
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)..
|
// con_scrollup should use time (currenttime - lasttime)..
|
||||||
|
|
||||||
static boolean consoletoggle; // true when console key pushed, ticker will handle
|
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_RecalcSize(void);
|
||||||
static void CON_ChangeHeight(void);
|
static void CON_ChangeHeight(void);
|
||||||
|
|
||||||
|
static void CONS_height_Change(void);
|
||||||
static void CONS_hudlines_Change(void);
|
static void CONS_hudlines_Change(void);
|
||||||
static void CONS_backcolor_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};
|
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
|
// 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}};
|
static CV_PossibleValue_t backpic_cons_t[] = {{0, "translucent"}, {1, "picture"}, {0, NULL}};
|
||||||
// whether to use console background picture, or translucent mode
|
// 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);
|
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)
|
static void CONS_hudlines_Change(void)
|
||||||
@@ -208,14 +221,6 @@ static void CONS_Clear_f(void)
|
|||||||
Unlock_state();
|
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 char *bindtable[NUMINPUTS];
|
||||||
|
|
||||||
static void CONS_Bind_f(void)
|
static void CONS_Bind_f(void)
|
||||||
@@ -633,72 +638,191 @@ void CON_MoveConsole(void)
|
|||||||
Unlock_state();
|
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)
|
INT32 CON_ShiftChar(INT32 ch)
|
||||||
{
|
{
|
||||||
if (I_UseNativeKeyboard())
|
if (I_UseNativeKeyboard() || ch >= (INT32)CON_GetShiftSize())
|
||||||
return ch;
|
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 ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
|
||||||
{
|
{
|
||||||
|
return !!shiftdown != capslock ? CON_Shiftform()[ch] : ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we're holding shift we should still shift non letter symbols
|
||||||
|
if (shiftdown)
|
||||||
|
{
|
||||||
|
return CON_Shiftform()[ch];
|
||||||
|
}
|
||||||
|
|
||||||
|
// AZERTY
|
||||||
if (cv_keyboardlayout.value == 3)
|
if (cv_keyboardlayout.value == 3)
|
||||||
{
|
{
|
||||||
if (shiftdown ^ capslock)
|
if (altdown & 0x2)
|
||||||
ch = shiftxform[ch];
|
return french_altgrxform[ch];
|
||||||
else if (altdown & 0x2)
|
|
||||||
ch = french_altgrxform[ch];
|
return CON_FallBackFrSpecialLetter(ch);
|
||||||
else
|
|
||||||
ch = HU_FallBackFrSpecialLetter(ch);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (shiftdown ^ capslock)
|
|
||||||
ch = shiftxform[ch];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // if we're holding shift we should still shift non letter symbols
|
|
||||||
{
|
|
||||||
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 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
|
// Clear time of console heads up messages
|
||||||
//
|
//
|
||||||
@@ -892,7 +1016,7 @@ boolean CON_Responder(event_t *ev)
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
// ctrl modifier -- changes behavior, adds shortcuts
|
// 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
|
// show all cvars/commands that match what we have inputted
|
||||||
if (key == KEY_TAB)
|
if (key == KEY_TAB)
|
||||||
@@ -1222,19 +1346,10 @@ void CON_LogMessage(const char *msg)
|
|||||||
// Console print! Wahooo! Lots o fun!
|
// 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;
|
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
|
// echo console prints to log file
|
||||||
DEBFILE(txt);
|
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, ...)
|
void CONS_Alert(alerttype_t level, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list argptr;
|
va_list argptr;
|
||||||
@@ -1288,9 +1418,7 @@ void CONS_Alert(alerttype_t level, const char *fmt, ...)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// I am lazy and I feel like just letting CONS_Printf take care of things.
|
CONS_PrintMsg(txt);
|
||||||
// Is that okay?
|
|
||||||
CONS_Printf("%s", txt);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CONS_Debug(INT32 debugflags, const char *fmt, ...)
|
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);
|
vsnprintf(txt, 8192, fmt, argptr);
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
|
|
||||||
// Again I am lazy, oh well
|
CONS_PrintMsg(txt);
|
||||||
CONS_Printf("%s", txt);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Print an error message, and wait for ENTER key to continue.
|
// Print an error message, and wait for ENTER key to continue.
|
||||||
// To make sure the user has seen the message
|
// 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
|
// dirty quick hack, but for the good cause
|
||||||
while (I_GetKey() != KEY_ENTER)
|
while (I_GetKey() != KEY_ENTER)
|
||||||
{
|
{
|
||||||
|
I_HandleInterrupt();
|
||||||
|
|
||||||
// Sleep so we don't take too much of cpu usage
|
// Sleep so we don't take too much of cpu usage
|
||||||
I_Sleep(1.f/TICRATE*1000);
|
I_Sleep(1.f/TICRATE*1000);
|
||||||
|
|
||||||
@@ -1522,9 +1650,8 @@ static void CON_DrawConsole(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// draw console text lines from top to bottom
|
// draw console text lines from top to bottom
|
||||||
if (con_curlines < minheight)
|
if (con_curlines >= minheight)
|
||||||
return;
|
{
|
||||||
|
|
||||||
i = con_cy - con_scrollup;
|
i = con_cy - con_scrollup;
|
||||||
|
|
||||||
// skip the last empty line due to the cursor being at the start of a new line
|
// skip the last empty line due to the cursor being at the start of a new line
|
||||||
@@ -1532,7 +1659,8 @@ static void CON_DrawConsole(void)
|
|||||||
|
|
||||||
i -= (con_curlines - minheight) / charheight;
|
i -= (con_curlines - minheight) / charheight;
|
||||||
|
|
||||||
if (rendermode == render_none) return;
|
if (rendermode == render_none)
|
||||||
|
return;
|
||||||
|
|
||||||
for (y = (con_curlines-minheight) % charheight; y <= con_curlines-minheight; y += charheight, i++)
|
for (y = (con_curlines-minheight) % charheight; y <= con_curlines-minheight; y += charheight, i++)
|
||||||
{
|
{
|
||||||
@@ -1566,9 +1694,10 @@ static void CON_DrawConsole(void)
|
|||||||
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// draw prompt if enough place (not while game startup)
|
// 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();
|
CON_DrawInput();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ extern UINT8 *yellowmap, *purplemap, *greenmap, *bluemap, *graymap, *redmap, *or
|
|||||||
extern UINT8 *consolebgmap;
|
extern UINT8 *consolebgmap;
|
||||||
|
|
||||||
INT32 CON_ShiftChar(INT32 ch);
|
INT32 CON_ShiftChar(INT32 ch);
|
||||||
INT32 CON_ShitAndAltGrChar(INT32 ch);
|
|
||||||
|
|
||||||
void CON_SetupBackColormap(void);
|
void CON_SetupBackColormap(void);
|
||||||
void CON_ClearHUD(void); // clear heads up messages
|
void CON_ClearHUD(void); // clear heads up messages
|
||||||
|
|||||||
+6
-3
@@ -1,7 +1,7 @@
|
|||||||
// BLANKART
|
// DR. ROBOTNIK'S RING RACERS
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2024 by Ronald "Eidolon" Kinard
|
// Copyright (C) 2025 by Ronald "Eidolon" Kinard
|
||||||
// Copyright (C) 2024 by Kart Krew
|
// Copyright (C) 2025 by Kart Krew
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
@@ -114,6 +114,7 @@ void* PoolAllocator::allocate()
|
|||||||
|
|
||||||
FreeBlock* ret = head_;
|
FreeBlock* ret = head_;
|
||||||
head_ = head_->next;
|
head_ = head_->next;
|
||||||
|
allocated_blocks_++;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,6 +126,7 @@ void PoolAllocator::deallocate(void* p)
|
|||||||
FreeBlock* block = reinterpret_cast<FreeBlock*>(p);
|
FreeBlock* block = reinterpret_cast<FreeBlock*>(p);
|
||||||
block->next = head_;
|
block->next = head_;
|
||||||
head_ = block;
|
head_ = block;
|
||||||
|
allocated_blocks_--;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PoolAllocator::release()
|
void PoolAllocator::release()
|
||||||
@@ -144,6 +146,7 @@ void PoolAllocator::release()
|
|||||||
|
|
||||||
first_chunk_ = nullptr;
|
first_chunk_ = nullptr;
|
||||||
head_ = nullptr;
|
head_ = nullptr;
|
||||||
|
allocated_blocks_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static LinearMemory g_frame_memory {4 * 1024 * 1024};
|
static LinearMemory g_frame_memory {4 * 1024 * 1024};
|
||||||
|
|||||||
+7
-3
@@ -1,7 +1,7 @@
|
|||||||
// SONIC ROBO BLAST 2 KART
|
// DR. ROBOTNIK'S RING RACERS
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2024 by Ronald "Eidolon" Kinard
|
// Copyright (C) 2025 by Ronald "Eidolon" Kinard
|
||||||
// Copyright (C) 2024 by Kart Krew
|
// Copyright (C) 2025 by Kart Krew
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
@@ -37,6 +37,7 @@ class PoolAllocator final
|
|||||||
FreeBlock* head_;
|
FreeBlock* head_;
|
||||||
size_t block_size_;
|
size_t block_size_;
|
||||||
size_t blocks_;
|
size_t blocks_;
|
||||||
|
size_t allocated_blocks_;
|
||||||
int32_t tag_;
|
int32_t tag_;
|
||||||
|
|
||||||
ChunkFooter* allocate_chunk();
|
ChunkFooter* allocate_chunk();
|
||||||
@@ -47,6 +48,7 @@ public:
|
|||||||
, head_(nullptr)
|
, head_(nullptr)
|
||||||
, block_size_(block_size)
|
, block_size_(block_size)
|
||||||
, blocks_(blocks)
|
, blocks_(blocks)
|
||||||
|
, allocated_blocks_(0)
|
||||||
, tag_(tag)
|
, tag_(tag)
|
||||||
{}
|
{}
|
||||||
PoolAllocator(const PoolAllocator&) = delete;
|
PoolAllocator(const PoolAllocator&) = delete;
|
||||||
@@ -59,6 +61,8 @@ public:
|
|||||||
void* allocate();
|
void* allocate();
|
||||||
void deallocate(void* p);
|
void deallocate(void* p);
|
||||||
constexpr size_t block_size() const noexcept { return block_size_; };
|
constexpr size_t block_size() const noexcept { return block_size_; };
|
||||||
|
constexpr size_t allocated_blocks() const noexcept { return allocated_blocks_; };
|
||||||
|
constexpr size_t allocated_bytes() const noexcept { return allocated_blocks_ * block_size_; };
|
||||||
|
|
||||||
void release();
|
void release();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// SONIC ROBO BLAST 2 KART
|
// DR. ROBOTNIK'S RING RACERS
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2024 by Ronald "Eidolon" Kinard
|
// Copyright (C) 2025 by Ronald "Eidolon" Kinard
|
||||||
// Copyright (C) 2024 by Kart Krew
|
// Copyright (C) 2025 by Kart Krew
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// BLANKART
|
// DR. ROBOTNIK'S RING RACERS
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2024 by Ronald "Eidolon" Kinard
|
// Copyright (C) 2025 by Ronald "Eidolon" Kinard
|
||||||
// Copyright (C) 2024 by Kart Krew
|
// Copyright (C) 2025 by Kart Krew
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// SONIC ROBO BLAST 2 KART
|
// DR. ROBOTNIK'S RING RACERS
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2024 by Ronald "Eidolon" Kinard
|
// Copyright (C) 2025 by Ronald "Eidolon" Kinard
|
||||||
// Copyright (C) 2024 by Kart Krew
|
// Copyright (C) 2025 by Kart Krew
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
|
|||||||
+322
-127
File diff suppressed because it is too large.
Load diff
+12
-2
@@ -339,13 +339,17 @@ typedef struct
|
|||||||
UINT8 clientnode;
|
UINT8 clientnode;
|
||||||
UINT8 gamestate;
|
UINT8 gamestate;
|
||||||
|
|
||||||
|
#ifndef PHOBOS_BUILD
|
||||||
// 0xFF == not in game; else player skin num
|
// 0xFF == not in game; else player skin num
|
||||||
UINT8 playerskins[MAXPLAYERS];
|
UINT8 playerskins[MAXPLAYERS];
|
||||||
UINT8 playercolor[MAXPLAYERS];
|
UINT8 playercolor[MAXPLAYERS];
|
||||||
|
#endif
|
||||||
|
|
||||||
UINT8 gametype;
|
UINT8 gametype;
|
||||||
UINT8 modifiedgame;
|
UINT8 modifiedgame;
|
||||||
|
#ifndef PHOBOS_BUILD
|
||||||
SINT8 adminplayers[MAXPLAYERS]; // Needs to be signed
|
SINT8 adminplayers[MAXPLAYERS]; // Needs to be signed
|
||||||
|
#endif
|
||||||
|
|
||||||
char server_context[8]; // Unique context id, generated at server startup.
|
char server_context[8]; // Unique context id, generated at server startup.
|
||||||
|
|
||||||
@@ -354,7 +358,9 @@ typedef struct
|
|||||||
boolean allownewplayer;
|
boolean allownewplayer;
|
||||||
boolean discordinvites;
|
boolean discordinvites;
|
||||||
|
|
||||||
|
#ifndef PHOBOS_BUILD
|
||||||
UINT8 varlengthinputs[0]; // Playernames and netvars
|
UINT8 varlengthinputs[0]; // Playernames and netvars
|
||||||
|
#endif
|
||||||
} ATTRPACK serverconfig_pak;
|
} ATTRPACK serverconfig_pak;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -444,7 +450,7 @@ typedef struct
|
|||||||
char name[MAXPLAYERNAME+1];
|
char name[MAXPLAYERNAME+1];
|
||||||
UINT8 address[4]; // sending another string would run us up against MAXPACKETLENGTH
|
UINT8 address[4]; // sending another string would run us up against MAXPACKETLENGTH
|
||||||
UINT8 team;
|
UINT8 team;
|
||||||
UINT8 skin;
|
skinnum_t skin;
|
||||||
UINT8 data; // Color is first four bits, hasflag, isit and issuper have one bit each, the last is unused.
|
UINT8 data; // Color is first four bits, hasflag, isit and issuper have one bit each, the last is unused.
|
||||||
UINT32 score;
|
UINT32 score;
|
||||||
UINT16 timeinserver; // In seconds.
|
UINT16 timeinserver; // In seconds.
|
||||||
@@ -454,7 +460,7 @@ typedef struct
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
char name[MAXPLAYERNAME+1];
|
char name[MAXPLAYERNAME+1];
|
||||||
UINT8 skin;
|
skinnum_t skin;
|
||||||
UINT8 color;
|
UINT8 color;
|
||||||
UINT32 pflags;
|
UINT32 pflags;
|
||||||
UINT32 score;
|
UINT32 score;
|
||||||
@@ -600,6 +606,8 @@ extern consvar_t cv_discordinvites;
|
|||||||
|
|
||||||
extern consvar_t cv_serverinfoscreen;
|
extern consvar_t cv_serverinfoscreen;
|
||||||
|
|
||||||
|
extern consvar_t cv_serveraddoninfo;
|
||||||
|
|
||||||
// Used in d_net, the only dependence
|
// Used in d_net, the only dependence
|
||||||
//tic_t ExpandTics(INT32 low, tic_t basetic);
|
//tic_t ExpandTics(INT32 low, tic_t basetic);
|
||||||
void D_ClientServerInit(void);
|
void D_ClientServerInit(void);
|
||||||
@@ -648,6 +656,8 @@ extern UINT8 playernode[MAXPLAYERS];
|
|||||||
|
|
||||||
extern boolean player_muted[MAXPLAYERS];
|
extern boolean player_muted[MAXPLAYERS];
|
||||||
|
|
||||||
|
extern UINT32 localplayerping;
|
||||||
|
|
||||||
INT32 D_NumPlayers(void);
|
INT32 D_NumPlayers(void);
|
||||||
|
|
||||||
void D_ResetTiccmds(void);
|
void D_ResetTiccmds(void);
|
||||||
|
|||||||
+72
-68
@@ -79,6 +79,7 @@
|
|||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
|
|
||||||
#include "lua_script.h"
|
#include "lua_script.h"
|
||||||
|
#include "lua_profile.h"
|
||||||
|
|
||||||
/* Manually defined asset hashes for non-CMake builds
|
/* Manually defined asset hashes for non-CMake builds
|
||||||
* Last updated 2015 / 05 / 03 - SRB2 v2.1.15 - srb2.srb
|
* Last updated 2015 / 05 / 03 - SRB2 v2.1.15 - srb2.srb
|
||||||
@@ -138,6 +139,7 @@ boolean devparm = false; // started game with -devparm
|
|||||||
|
|
||||||
boolean singletics = false; // timedemo
|
boolean singletics = false; // timedemo
|
||||||
boolean lastdraw = false;
|
boolean lastdraw = false;
|
||||||
|
boolean intermissionbginit = false;
|
||||||
|
|
||||||
#ifdef MOTIONBLUR
|
#ifdef MOTIONBLUR
|
||||||
INT32 postimgparam[MAXSPLITSCREENPLAYERS];
|
INT32 postimgparam[MAXSPLITSCREENPLAYERS];
|
||||||
@@ -153,7 +155,7 @@ boolean music_disabled = false;
|
|||||||
INT32 debugload = 0;
|
INT32 debugload = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char savegamename[256];
|
char savegamename[256] = {};
|
||||||
|
|
||||||
char srb2home[256] = ".";
|
char srb2home[256] = ".";
|
||||||
char srb2path[256] = ".";
|
char srb2path[256] = ".";
|
||||||
@@ -274,20 +276,6 @@ static void D_Renderview(void)
|
|||||||
|
|
||||||
R_ApplyLevelInterpolators(R_GetTimeFrac(RTF_LEVEL));
|
R_ApplyLevelInterpolators(R_GetTimeFrac(RTF_LEVEL));
|
||||||
|
|
||||||
if (rendermode == render_soft && cv_homremoval.value)
|
|
||||||
{
|
|
||||||
if (cv_homremoval.value == 1)
|
|
||||||
{
|
|
||||||
// Clear the software screen buffer to remove HOM
|
|
||||||
memset(vid.screens[0], 31, vid.width * vid.height);
|
|
||||||
}
|
|
||||||
else if (cv_homremoval.value == 2)
|
|
||||||
{
|
|
||||||
//'development' HOM removal -- makes it blindingly obvious if HOM is spotted.
|
|
||||||
memset(vid.screens[0], 32+(timeinmap&15), vid.width * vid.height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i <= splitscreen; i++)
|
for (i = 0; i <= splitscreen; i++)
|
||||||
{
|
{
|
||||||
if (!P_MobjWasRemoved(players[displayplayers[i]].mo) || players[displayplayers[i]].playerstate == PST_DEAD)
|
if (!P_MobjWasRemoved(players[displayplayers[i]].mo) || players[displayplayers[i]].playerstate == PST_DEAD)
|
||||||
@@ -362,6 +350,33 @@ static void D_Renderview(void)
|
|||||||
// added comment : there is a wipe eatch change of the gamestate
|
// added comment : there is a wipe eatch change of the gamestate
|
||||||
gamestate_t wipegamestate = GS_LEVEL;
|
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)
|
static boolean D_Display(void)
|
||||||
{
|
{
|
||||||
boolean ranwipe = false;
|
boolean ranwipe = false;
|
||||||
@@ -527,16 +542,8 @@ static boolean D_Display(void)
|
|||||||
PS_START_TIMING(ps_rendercalltime);
|
PS_START_TIMING(ps_rendercalltime);
|
||||||
D_Renderview();
|
D_Renderview();
|
||||||
PS_STOP_TIMING(ps_rendercalltime);
|
PS_STOP_TIMING(ps_rendercalltime);
|
||||||
}
|
|
||||||
|
|
||||||
if (lastdraw)
|
D_MakeIntermissionBG();
|
||||||
{
|
|
||||||
if (rendermode == render_soft)
|
|
||||||
{
|
|
||||||
VID_BlitLinearScreen(vid.screens[0], vid.screens[1], vid.width, vid.height, vid.width, vid.width);
|
|
||||||
}
|
|
||||||
|
|
||||||
lastdraw = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PS_START_TIMING(ps_uitime);
|
PS_START_TIMING(ps_uitime);
|
||||||
@@ -638,6 +645,11 @@ static boolean D_Display(void)
|
|||||||
|
|
||||||
CON_Drawer(); // Ha, i LIED!
|
CON_Drawer(); // Ha, i LIED!
|
||||||
|
|
||||||
|
if (cv_lua_profile.value > 0)
|
||||||
|
{
|
||||||
|
LUA_RenderTimers();
|
||||||
|
}
|
||||||
|
|
||||||
PS_START_TIMING(ps_swaptime);
|
PS_START_TIMING(ps_swaptime);
|
||||||
I_FinishUpdate(); // page flip or blit buffer
|
I_FinishUpdate(); // page flip or blit buffer
|
||||||
PS_STOP_TIMING(ps_swaptime);
|
PS_STOP_TIMING(ps_swaptime);
|
||||||
@@ -697,18 +709,17 @@ void D_SRB2Loop(void)
|
|||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (I_Interrupted())
|
|
||||||
{
|
|
||||||
I_Quit();
|
|
||||||
}
|
|
||||||
|
|
||||||
// capbudget is the minimum precise_t duration of a single loop iteration
|
// capbudget is the minimum precise_t duration of a single loop iteration
|
||||||
precise_t capbudget;
|
precise_t capbudget;
|
||||||
precise_t elapsed;
|
precise_t elapsed;
|
||||||
precise_t enterprecise, finishprecise;
|
precise_t enterprecise, finishprecise;
|
||||||
|
|
||||||
|
boolean ranwipe = false;
|
||||||
|
|
||||||
enterprecise = I_GetPreciseTime();
|
enterprecise = I_GetPreciseTime();
|
||||||
|
|
||||||
|
I_HandleInterrupt();
|
||||||
|
|
||||||
memset(&g_dc, 0, sizeof(g_dc));
|
memset(&g_dc, 0, sizeof(g_dc));
|
||||||
Z_Frame_Reset();
|
Z_Frame_Reset();
|
||||||
|
|
||||||
@@ -716,8 +727,6 @@ void D_SRB2Loop(void)
|
|||||||
const UINT32 framecap = R_GetFramerateCap();
|
const UINT32 framecap = R_GetFramerateCap();
|
||||||
capbudget = (framecap == 0) ? 0 : (precise_t)((double)precision / (double)framecap + 0.5); // + 0.5 instead of round
|
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);
|
I_UpdateTime(cv_timescale.value);
|
||||||
|
|
||||||
if (lastwipetic)
|
if (lastwipetic)
|
||||||
@@ -1140,13 +1149,19 @@ static void D_FindAddonsToAutoload(void)
|
|||||||
// ok so theres still issues with players adding stuff to autoload by accident
|
// ok so theres still issues with players adding stuff to autoload by accident
|
||||||
// sometimes this stuff contains maps
|
// sometimes this stuff contains maps
|
||||||
// you can probably imagine how that goes in a netgame....
|
// you can probably imagine how that goes in a netgame....
|
||||||
if (W_CheckAutoLoadContainsMap(wadsToAutoload))
|
int retmap = W_CheckAutoLoadContainsMap(wadsToAutoload);
|
||||||
|
if (retmap == -1)
|
||||||
{
|
{
|
||||||
CONS_Printf("Autoload: file %s contains map data! skipping...", wadsToAutoload);
|
CONS_Alert(CONS_WARNING, "Autoload: file %s was not found or not valid.\n", wadsToAutoload);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (retmap > 0)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_WARNING, "Autoload: file %s contains map data, this WILL cause crashes and desynchs! skipping...\n", wadsToAutoload);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!postload && W_CheckPostLoadList(wadsToAutoload))
|
if (!postload && W_CheckPostLoadList(wadsToAutoload) > 0)
|
||||||
{
|
{
|
||||||
CONS_Printf("Autoload: forcing postload for file %s\n", wadsToAutoload);
|
CONS_Printf("Autoload: forcing postload for file %s\n", wadsToAutoload);
|
||||||
postload = true;
|
postload = true;
|
||||||
@@ -1208,7 +1223,7 @@ void D_AddPostloadFiles(void)
|
|||||||
|
|
||||||
static boolean AddIWAD(const char * file, const char *dir)
|
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))
|
if (FIL_ReadFileOK(path))
|
||||||
{
|
{
|
||||||
@@ -1236,7 +1251,7 @@ static void IdentifyVersion(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
char tempsrb2path[256] = ".";
|
char tempsrb2path[256] = ".";
|
||||||
if (getcwd(tempsrb2path, 256) == NULL)
|
if (I_GetCwd(tempsrb2path, 256) == NULL)
|
||||||
strcpy(tempsrb2path, ".");
|
strcpy(tempsrb2path, ".");
|
||||||
|
|
||||||
// get the current directory (possible problem on NT with "." as current dir)
|
// get the current directory (possible problem on NT with "." as current dir)
|
||||||
@@ -1336,20 +1351,24 @@ static void IdentifyVersion(void)
|
|||||||
//
|
//
|
||||||
// search for maps
|
// search for maps
|
||||||
//
|
//
|
||||||
static void D_CheckMaps(boolean checkreplaced)
|
static void D_CheckMapReplacements(boolean pwad)
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
char *name;
|
char *name;
|
||||||
UINT16 wadnum;
|
UINT16 wadnum;
|
||||||
lumpinfo_t *lumpinfo;
|
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;
|
lumpinfo = wadfiles[wadnum]->lumpinfo;
|
||||||
for (i = 0; i < wadfiles[wadnum]->numlumps; i++, lumpinfo++)
|
for (i = 0; i < wadfiles[wadnum]->numlumps; i++, lumpinfo++)
|
||||||
{
|
{
|
||||||
name = lumpinfo->name;
|
name = lumpinfo->name;
|
||||||
P_CheckMapReplacements(name, checkreplaced);
|
P_CheckMapReplacements(name, pwad);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1385,8 +1404,6 @@ static inline void D_MakeTitleString(char *s)
|
|||||||
// extra graphic patches for saturn specific thingies
|
// extra graphic patches for saturn specific thingies
|
||||||
boolean xtra_speedo = false; // extra speedometer check
|
boolean xtra_speedo = false; // extra speedometer check
|
||||||
boolean xtra_speedo_clr = false; // extra speedometer colour 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 = false; // achiiro speedometer check
|
||||||
boolean achi_speedo_clr = false; // extra speedometer colour check
|
boolean achi_speedo_clr = false; // extra speedometer colour check
|
||||||
boolean dial_speedo = false; // dial speedometer check
|
boolean dial_speedo = false; // dial speedometer check
|
||||||
@@ -1416,7 +1433,6 @@ static void D_CheckSaturnExtraFiles(void)
|
|||||||
CV_PossibleValue_t minimapdot_cons_temp[NUMMINIMAPDOTSTUFF] = {{0, "Off"}, {0, NULL}, {0, NULL}, {0, NULL}, {0, NULL}};
|
CV_PossibleValue_t minimapdot_cons_temp[NUMMINIMAPDOTSTUFF] = {{0, "Off"}, {0, NULL}, {0, NULL}, {0, NULL}, {0, NULL}};
|
||||||
|
|
||||||
unsigned last_speedo_i = 0;
|
unsigned last_speedo_i = 0;
|
||||||
unsigned last_driftgauge_i = 3;
|
|
||||||
unsigned last_inputdisplay_i = 2;
|
unsigned last_inputdisplay_i = 2;
|
||||||
unsigned last_minimapdot_i = 0;
|
unsigned last_minimapdot_i = 0;
|
||||||
#define PUSHCONS(cons, i, id, name) { ++i; cons[i].value = id; cons[i].strvalue = name; }
|
#define PUSHCONS(cons, i, id, name) { ++i; cons[i].value = id; cons[i].strvalue = name; }
|
||||||
@@ -1575,20 +1591,6 @@ static void D_CheckSaturnExtraFiles(void)
|
|||||||
if (found_extra3_kart)
|
if (found_extra3_kart)
|
||||||
{
|
{
|
||||||
mainwads++;
|
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
|
#undef PUSHCONS
|
||||||
@@ -1786,10 +1788,6 @@ void D_SRB2Main(void)
|
|||||||
// Setup default unlockable conditions
|
// Setup default unlockable conditions
|
||||||
M_SetupDefaultConditionSets();
|
M_SetupDefaultConditionSets();
|
||||||
|
|
||||||
// Setup character tables
|
|
||||||
// Have to be done here before files are loaded
|
|
||||||
M_InitCharacterTables();
|
|
||||||
|
|
||||||
// load wad, including the main wad file
|
// load wad, including the main wad file
|
||||||
CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n");
|
CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n");
|
||||||
|
|
||||||
@@ -1833,17 +1831,19 @@ void D_SRB2Main(void)
|
|||||||
// conversion sometimes needs the palette
|
// conversion sometimes needs the palette
|
||||||
V_ReloadPalette();
|
V_ReloadPalette();
|
||||||
|
|
||||||
D_CheckMaps(false);
|
D_CheckMapReplacements(false);
|
||||||
|
|
||||||
|
if (startuppwadcount > 0)
|
||||||
|
{
|
||||||
|
CONS_Printf("W_InitMultipleFiles(): Adding extra PWADs.\n");
|
||||||
W_InitMultipleFiles(startuppwads, startuppwadcount, true);
|
W_InitMultipleFiles(startuppwads, startuppwadcount, true);
|
||||||
|
|
||||||
// Only search for pwad maps if we actually have a pwad added
|
// Only search for pwad maps if we actually have a pwad added
|
||||||
if (startuppwadcount > 0)
|
D_CheckMapReplacements(true);
|
||||||
{
|
|
||||||
D_CheckMaps(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
D_CleanFile(startuppwads, startuppwadcount);
|
D_CleanFile(startuppwads, startuppwadcount);
|
||||||
|
}
|
||||||
|
|
||||||
startuppwadcount = 0;
|
startuppwadcount = 0;
|
||||||
|
|
||||||
cht_Init();
|
cht_Init();
|
||||||
@@ -1930,7 +1930,7 @@ void D_SRB2Main(void)
|
|||||||
CONS_Printf("R_Init(): Init SRB2 refresh daemon.\n");
|
CONS_Printf("R_Init(): Init SRB2 refresh daemon.\n");
|
||||||
R_Init();
|
R_Init();
|
||||||
|
|
||||||
#if SOUND==SOUND_DUMMY
|
#if SOUND == SOUND_DUMMY
|
||||||
sound_disabled = true;
|
sound_disabled = true;
|
||||||
music_disabled = true;
|
music_disabled = true;
|
||||||
#else
|
#else
|
||||||
@@ -2043,9 +2043,13 @@ void D_SRB2Main(void)
|
|||||||
if (M_CheckProtoParam("replay"))
|
if (M_CheckProtoParam("replay"))
|
||||||
{
|
{
|
||||||
const char *replayurl = M_GetProtoParam();
|
const char *replayurl = M_GetProtoParam();
|
||||||
|
|
||||||
|
if (!replayurl)
|
||||||
|
I_Error("REPLAY: Invalid URL.");
|
||||||
|
|
||||||
gconst char *replayname = strrchr(replayurl, '/');
|
gconst char *replayname = strrchr(replayurl, '/');
|
||||||
|
|
||||||
if (!replayname || !replayurl)
|
if (!replayname)
|
||||||
I_Error("REPLAY: Invalid URL.");
|
I_Error("REPLAY: Invalid URL.");
|
||||||
|
|
||||||
#define REPLAYDIR "/DownloadedReplays/"
|
#define REPLAYDIR "/DownloadedReplays/"
|
||||||
@@ -2159,8 +2163,8 @@ void D_SRB2Main(void)
|
|||||||
|
|
||||||
if (dedicated && server)
|
if (dedicated && server)
|
||||||
{
|
{
|
||||||
levelstarttic = gametic;
|
|
||||||
G_SetGamestate(GS_LEVEL);
|
G_SetGamestate(GS_LEVEL);
|
||||||
|
|
||||||
if (!P_SetupLevel(false, false))
|
if (!P_SetupLevel(false, false))
|
||||||
I_Quit(); // fail so reset game stuff
|
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; // extra speedometer check
|
||||||
extern boolean xtra_speedo_clr; // extra speedometer colour 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; // achiiro speedometer check
|
||||||
extern boolean achi_speedo_clr; // extra speedometer colour check
|
extern boolean achi_speedo_clr; // extra speedometer colour check
|
||||||
extern boolean dial_speedo; // dial speedometer check
|
extern boolean dial_speedo; // dial speedometer check
|
||||||
|
|||||||
+3
-1
@@ -1315,7 +1315,9 @@ boolean D_CheckNetGame(void)
|
|||||||
while (!debugfile && k < MAXPLAYERS)
|
while (!debugfile && k < MAXPLAYERS)
|
||||||
{
|
{
|
||||||
k++;
|
k++;
|
||||||
sprintf(filename, "debug%d.txt", k);
|
|
||||||
|
snprintf(filename, sizeof(filename), "debug%d.txt", k);
|
||||||
|
|
||||||
debugfile = fopen(va("%s" PATHSEP "%s", srb2home, filename), "w");
|
debugfile = fopen(va("%s" PATHSEP "%s", srb2home, filename), "w");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ extern "C" {
|
|||||||
// SINT8 is used for nodes sometimes >:(
|
// SINT8 is used for nodes sometimes >:(
|
||||||
#define MAXNETNODES 127
|
#define MAXNETNODES 127
|
||||||
#define BROADCASTADDR MAXNETNODES
|
#define BROADCASTADDR MAXNETNODES
|
||||||
#define NETSPLITSCREEN // Kart's splitscreen netgame feature
|
|
||||||
|
|
||||||
#define STATLENGTH (TICRATE*2)
|
#define STATLENGTH (TICRATE*2)
|
||||||
|
|
||||||
|
|||||||
+181
-37
@@ -47,6 +47,7 @@
|
|||||||
#include "z_zone.h"
|
#include "z_zone.h"
|
||||||
#include "lua_script.h"
|
#include "lua_script.h"
|
||||||
#include "lua_hook.h"
|
#include "lua_hook.h"
|
||||||
|
#include "lua_profile.h"
|
||||||
#include "m_cond.h"
|
#include "m_cond.h"
|
||||||
#include "m_anigif.h"
|
#include "m_anigif.h"
|
||||||
#include "k_kart.h" // SRB2kart
|
#include "k_kart.h" // SRB2kart
|
||||||
@@ -146,10 +147,16 @@ static void Command_Addfilelocal(void);
|
|||||||
static void Command_Addfile(void);
|
static void Command_Addfile(void);
|
||||||
static void Command_Addskins(void);
|
static void Command_Addskins(void);
|
||||||
static void Command_GLocalSkin(void);
|
static void Command_GLocalSkin(void);
|
||||||
|
static void SetPrefcolor(int splitplayer);
|
||||||
|
static void Command_UsePrefcolor(void);
|
||||||
|
static void Command_UsePrefcolor2(void);
|
||||||
|
static void Command_UsePrefcolor3(void);
|
||||||
|
static void Command_UsePrefcolor4(void);
|
||||||
static void Command_ListWADS_f(void);
|
static void Command_ListWADS_f(void);
|
||||||
static void Command_LocateLump_f(void);
|
static void Command_LocateLump_f(void);
|
||||||
static void Command_ListDoomednums_f(void);
|
static void Command_ListDoomednums_f(void);
|
||||||
static void Command_ListUnusedSprites_f(void);
|
static void Command_ListUnusedSprites_f(void);
|
||||||
|
static void Command_ListUnusedMapSlots_f(void);
|
||||||
static void Command_RunSOC(void);
|
static void Command_RunSOC(void);
|
||||||
static void Command_Pause(void);
|
static void Command_Pause(void);
|
||||||
static void Command_Respawn(void);
|
static void Command_Respawn(void);
|
||||||
@@ -433,10 +440,18 @@ consvar_t cv_pointlimit = {"pointlimit", "0", CV_NETVAR|CV_CALL|CV_NOINIT, point
|
|||||||
static CV_PossibleValue_t timelimit_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t timelimit_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_timelimit = {"timelimit", "0", CV_NETVAR|CV_CALL|CV_NOINIT, timelimit_cons_t,
|
consvar_t cv_timelimit = {"timelimit", "0", CV_NETVAR|CV_CALL|CV_NOINIT, timelimit_cons_t,
|
||||||
TimeLimit_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
TimeLimit_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
#ifdef PHOBOS_BUILD
|
||||||
|
static CV_PossibleValue_t numlaps_cons_t[] = {{1, "MIN"}, {255, "MAX"}, {0, NULL}};
|
||||||
|
#else
|
||||||
static CV_PossibleValue_t numlaps_cons_t[] = {{1, "MIN"}, {50, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t numlaps_cons_t[] = {{1, "MIN"}, {50, "MAX"}, {0, NULL}};
|
||||||
|
#endif
|
||||||
consvar_t cv_numlaps = {"numlaps", "3", CV_NETVAR|CV_CALL|CV_NOINIT, numlaps_cons_t,
|
consvar_t cv_numlaps = {"numlaps", "3", CV_NETVAR|CV_CALL|CV_NOINIT, numlaps_cons_t,
|
||||||
NumLaps_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
NumLaps_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
#ifdef PHOBOS_BUILD
|
||||||
|
static CV_PossibleValue_t basenumlaps_cons_t[] = {{1, "MIN"}, {255, "MAX"}, {0, "Map default"}, {0, NULL}};
|
||||||
|
#else
|
||||||
static CV_PossibleValue_t basenumlaps_cons_t[] = {{1, "MIN"}, {50, "MAX"}, {0, "Map default"}, {0, NULL}};
|
static CV_PossibleValue_t basenumlaps_cons_t[] = {{1, "MIN"}, {50, "MAX"}, {0, "Map default"}, {0, NULL}};
|
||||||
|
#endif
|
||||||
consvar_t cv_basenumlaps = {"basenumlaps", "Map default", CV_NETVAR|CV_CALL|CV_CHEAT, basenumlaps_cons_t, BaseNumLaps_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_basenumlaps = {"basenumlaps", "Map default", CV_NETVAR|CV_CALL|CV_CHEAT, basenumlaps_cons_t, BaseNumLaps_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_forceskin = {"forceskin", "Off", CV_NETVAR|CV_CALL|CV_CHEAT, Forceskin_cons_t, ForceSkin_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_forceskin = {"forceskin", "Off", CV_NETVAR|CV_CALL|CV_CHEAT, Forceskin_cons_t, ForceSkin_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
@@ -505,6 +520,9 @@ static CV_PossibleValue_t ps_descriptor_cons_t[] = {
|
|||||||
{1, "Average"}, {2, "SD"}, {3, "Minimum"}, {4, "Maximum"}, {0, NULL}};
|
{1, "Average"}, {2, "SD"}, {3, "Minimum"}, {4, "Maximum"}, {0, NULL}};
|
||||||
consvar_t cv_ps_descriptor = {"ps_descriptor", "Average", 0, ps_descriptor_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_ps_descriptor = {"ps_descriptor", "Average", 0, ps_descriptor_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
//consvar_t cv_lua_profile = {"lua_profile", "0").values(CV_Unsigned).onchange(lua_profile_OnChange).description("Show hook timings over an average of N tics");
|
||||||
|
consvar_t cv_lua_profile = {"lua_profile", "0", CV_CALL, CV_Unsigned, lua_profile_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
// only there to better keep track of it globally
|
// only there to better keep track of it globally
|
||||||
consvar_t cv_director = {"director", "Off", CV_HIDEN, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_director = {"director", "Off", CV_HIDEN, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
@@ -565,6 +583,7 @@ const char *netxcmdnames[MAXNETXCMD - 1] =
|
|||||||
"MODIFYVOTE",
|
"MODIFYVOTE",
|
||||||
"PICKVOTE",
|
"PICKVOTE",
|
||||||
"REMOVEPLAYER",
|
"REMOVEPLAYER",
|
||||||
|
"DISCORD",
|
||||||
"LUACMD",
|
"LUACMD",
|
||||||
"LUAVAR"
|
"LUAVAR"
|
||||||
};
|
};
|
||||||
@@ -598,6 +617,12 @@ void D_RegisterServerCommands(void)
|
|||||||
Forceskin_cons_t[i].value = 0;
|
Forceskin_cons_t[i].value = 0;
|
||||||
Forceskin_cons_t[i].strvalue = NULL;
|
Forceskin_cons_t[i].strvalue = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set default player names
|
||||||
|
// Monster Iestyn (12/08/19): not sure where else I could have actually put this, but oh well
|
||||||
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
|
snprintf(player_names[i], sizeof(player_names[i]), "Player %d", 1 + i);
|
||||||
|
|
||||||
RegisterNetXCmd(XD_NAMEANDCOLOR, Got_NameAndColor);
|
RegisterNetXCmd(XD_NAMEANDCOLOR, Got_NameAndColor);
|
||||||
RegisterNetXCmd(XD_WEAPONPREF, Got_WeaponPref);
|
RegisterNetXCmd(XD_WEAPONPREF, Got_WeaponPref);
|
||||||
RegisterNetXCmd(XD_MAP, Got_Mapcmd);
|
RegisterNetXCmd(XD_MAP, Got_Mapcmd);
|
||||||
@@ -645,6 +670,7 @@ void D_RegisterServerCommands(void)
|
|||||||
COM_AddCommand("locatelump", Command_LocateLump_f);
|
COM_AddCommand("locatelump", Command_LocateLump_f);
|
||||||
COM_AddCommand("listmapthings", Command_ListDoomednums_f);
|
COM_AddCommand("listmapthings", Command_ListDoomednums_f);
|
||||||
COM_AddCommand("listunusedsprites", Command_ListUnusedSprites_f);
|
COM_AddCommand("listunusedsprites", Command_ListUnusedSprites_f);
|
||||||
|
COM_AddCommand("listunusedmapslots", Command_ListUnusedMapSlots_f);
|
||||||
|
|
||||||
COM_AddCommand("runsoc", Command_RunSOC);
|
COM_AddCommand("runsoc", Command_RunSOC);
|
||||||
COM_AddCommand("pause", Command_Pause);
|
COM_AddCommand("pause", Command_Pause);
|
||||||
@@ -845,6 +871,11 @@ void D_RegisterClientCommands(void)
|
|||||||
|
|
||||||
COM_AddCommand("localskin", Command_GLocalSkin);
|
COM_AddCommand("localskin", Command_GLocalSkin);
|
||||||
|
|
||||||
|
COM_AddCommand("useprefcolor", Command_UsePrefcolor);
|
||||||
|
COM_AddCommand("useprefcolor2", Command_UsePrefcolor2);
|
||||||
|
COM_AddCommand("useprefcolor3", Command_UsePrefcolor3);
|
||||||
|
COM_AddCommand("useprefcolor4", Command_UsePrefcolor4);
|
||||||
|
|
||||||
K_RegisterClientKartStuff(); // SRB2kart
|
K_RegisterClientKartStuff(); // SRB2kart
|
||||||
|
|
||||||
CV_RegisterVar(&cv_screenshot_option);
|
CV_RegisterVar(&cv_screenshot_option);
|
||||||
@@ -900,6 +931,7 @@ void D_RegisterClientCommands(void)
|
|||||||
CV_RegisterVar(&cv_mindelay);
|
CV_RegisterVar(&cv_mindelay);
|
||||||
CV_RegisterVar(&cv_gentlemens);
|
CV_RegisterVar(&cv_gentlemens);
|
||||||
CV_RegisterVar(&cv_serverinfoscreen);
|
CV_RegisterVar(&cv_serverinfoscreen);
|
||||||
|
CV_RegisterVar(&cv_serveraddoninfo);
|
||||||
|
|
||||||
#ifdef NETGAME_DEVMODE
|
#ifdef NETGAME_DEVMODE
|
||||||
CV_RegisterVar(&cv_fishcake);
|
CV_RegisterVar(&cv_fishcake);
|
||||||
@@ -927,11 +959,11 @@ void D_RegisterClientCommands(void)
|
|||||||
|
|
||||||
COM_AddCommand("displayplayer", Command_Displayplayer_f);
|
COM_AddCommand("displayplayer", Command_Displayplayer_f);
|
||||||
|
|
||||||
CV_RegisterVar(&cv_audbuffersize);
|
|
||||||
|
|
||||||
CV_RegisterVar(&cv_palette);
|
CV_RegisterVar(&cv_palette);
|
||||||
CV_RegisterVar(&cv_palettenum);
|
CV_RegisterVar(&cv_palettenum);
|
||||||
|
|
||||||
|
CV_RegisterVar(&cv_lua_profile);
|
||||||
|
|
||||||
// m_menu.c
|
// m_menu.c
|
||||||
CV_RegisterVar(&cv_chatheight);
|
CV_RegisterVar(&cv_chatheight);
|
||||||
CV_RegisterVar(&cv_chatwidth);
|
CV_RegisterVar(&cv_chatwidth);
|
||||||
@@ -939,6 +971,9 @@ void D_RegisterClientCommands(void)
|
|||||||
CV_RegisterVar(&cv_chatspamprotection);
|
CV_RegisterVar(&cv_chatspamprotection);
|
||||||
CV_RegisterVar(&cv_consolechat);
|
CV_RegisterVar(&cv_consolechat);
|
||||||
CV_RegisterVar(&cv_chatnotifications);
|
CV_RegisterVar(&cv_chatnotifications);
|
||||||
|
CV_RegisterVar(&cv_chat_xoffset);
|
||||||
|
CV_RegisterVar(&cv_chat_yoffset);
|
||||||
|
CV_RegisterVar(&cv_chat_showlimit);
|
||||||
CV_RegisterVar(&cv_chatbacktint);
|
CV_RegisterVar(&cv_chatbacktint);
|
||||||
CV_RegisterVar(&cv_chatcentertext);
|
CV_RegisterVar(&cv_chatcentertext);
|
||||||
CV_RegisterVar(&cv_songcredits);
|
CV_RegisterVar(&cv_songcredits);
|
||||||
@@ -1004,11 +1039,20 @@ void D_RegisterClientCommands(void)
|
|||||||
|
|
||||||
CV_RegisterVar(&cv_usejoystick[i]);
|
CV_RegisterVar(&cv_usejoystick[i]);
|
||||||
CV_RegisterVar(&cv_joyscale[i]);
|
CV_RegisterVar(&cv_joyscale[i]);
|
||||||
CV_RegisterVar(&cv_rumble[i]);
|
|
||||||
CV_RegisterVar(&cv_rumblestrength[i]);
|
|
||||||
CV_RegisterVar(&cv_gamepadled[i]);
|
CV_RegisterVar(&cv_gamepadled[i]);
|
||||||
|
|
||||||
|
CV_RegisterVar(&cv_rumble[i]);
|
||||||
|
CV_RegisterVar(&cv_rumble_strength[i]);
|
||||||
|
CV_RegisterVar(&cv_rumble_spinout[i]);
|
||||||
|
CV_RegisterVar(&cv_rumble_sneakerboost[i]);
|
||||||
|
CV_RegisterVar(&cv_rumble_offroad[i]);
|
||||||
|
CV_RegisterVar(&cv_rumble_bananadrag[i]);
|
||||||
|
CV_RegisterVar(&cv_rumble_stairjank[i]);
|
||||||
|
CV_RegisterVar(&cv_rumble_brakedrift[i]);
|
||||||
|
CV_RegisterVar(&cv_rumble_driftcharge[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CV_RegisterVar(&cv_gamepadifunfocused);
|
||||||
CV_RegisterVar(&cv_gamepadledifunfocused);
|
CV_RegisterVar(&cv_gamepadledifunfocused);
|
||||||
CV_RegisterVar(&cv_rumbleifunfocused);
|
CV_RegisterVar(&cv_rumbleifunfocused);
|
||||||
|
|
||||||
@@ -1025,6 +1069,7 @@ void D_RegisterClientCommands(void)
|
|||||||
CV_RegisterVar(&cv_midimusicvolume);
|
CV_RegisterVar(&cv_midimusicvolume);
|
||||||
#endif
|
#endif
|
||||||
CV_RegisterVar(&cv_numChannels);
|
CV_RegisterVar(&cv_numChannels);
|
||||||
|
CV_RegisterVar(&cv_audbuffersize);
|
||||||
|
|
||||||
#ifdef HAVE_OPENMPT
|
#ifdef HAVE_OPENMPT
|
||||||
CV_RegisterVar(&cv_modfilter);
|
CV_RegisterVar(&cv_modfilter);
|
||||||
@@ -1212,13 +1257,22 @@ static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
|
|||||||
|
|
||||||
if (len == 0 || len > MAXPLAYERNAME)
|
if (len == 0 || len > MAXPLAYERNAME)
|
||||||
return false; // Empty or too long.
|
return false; // Empty or too long.
|
||||||
if (name[0] == ' ' || name[len-1] == ' ')
|
if (name[0] == ' ')
|
||||||
return false; // Starts or ends with a space.
|
return false; // Starts with a space.
|
||||||
if (isdigit(name[0]))
|
if (isdigit(name[0]))
|
||||||
return false; // Starts with a digit.
|
return false; // Starts with a digit.
|
||||||
if (name[0] == '@' || name[0] == '~')
|
if (name[0] == '@' || name[0] == '~')
|
||||||
return false; // Starts with an admin symbol.
|
return false; // Starts with an admin symbol.
|
||||||
|
|
||||||
|
// Clean up trailing whitespace.
|
||||||
|
while (len && name[len-1] == ' ')
|
||||||
|
{
|
||||||
|
name[len-1] = '\0';
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
if (len == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
// Check if it contains a non-printing character.
|
// Check if it contains a non-printing character.
|
||||||
// Note: ANSI C isprint() considers space a printing character.
|
// Note: ANSI C isprint() considers space a printing character.
|
||||||
// Also don't allow semicolons, since they are used as
|
// Also don't allow semicolons, since they are used as
|
||||||
@@ -1252,7 +1306,8 @@ static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
|
|||||||
else if (len == 1) // Agh!
|
else if (len == 1) // Agh!
|
||||||
{
|
{
|
||||||
// Last ditch effort...
|
// Last ditch effort...
|
||||||
sprintf(name, "%d", M_RandomKey(10));
|
snprintf(name, MAXPLAYERNAME+1, "%d", M_RandomKey(10));
|
||||||
|
|
||||||
if (!EnsurePlayerNameIsGood(name, playernum))
|
if (!EnsurePlayerNameIsGood(name, playernum))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1271,7 +1326,8 @@ static boolean EnsurePlayerNameIsGood(char *name, INT32 playernum)
|
|||||||
* is restored to what it was before.
|
* is restored to what it was before.
|
||||||
*
|
*
|
||||||
* We assume that if playernum is ::consoleplayer or ::secondarydisplayplayer
|
* We assume that if playernum is ::consoleplayer or ::secondarydisplayplayer
|
||||||
* the console variable ::cv_playername or ::cv_playername2 respectively is
|
* (unless clientjoin is true, a necessary evil)
|
||||||
|
* the console variable ::cv_playername to ::cv_playername4 respectively is
|
||||||
* already set to newname. However, the player name table is assumed to
|
* already set to newname. However, the player name table is assumed to
|
||||||
* contain the old name.
|
* contain the old name.
|
||||||
*
|
*
|
||||||
@@ -1291,6 +1347,10 @@ static void CleanupPlayerName(INT32 playernum, const char *newname)
|
|||||||
char *tmpname = NULL;
|
char *tmpname = NULL;
|
||||||
INT32 i;
|
INT32 i;
|
||||||
boolean namefailed = true;
|
boolean namefailed = true;
|
||||||
|
boolean clientjoin = !!(playernum >= MAXPLAYERS);
|
||||||
|
|
||||||
|
if (clientjoin)
|
||||||
|
playernum -= MAXPLAYERS;
|
||||||
|
|
||||||
buf = Z_StrDup(newname);
|
buf = Z_StrDup(newname);
|
||||||
|
|
||||||
@@ -1347,6 +1407,8 @@ static void CleanupPlayerName(INT32 playernum, const char *newname)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// no stealing another player's name
|
// no stealing another player's name
|
||||||
|
if (!clientjoin)
|
||||||
|
{
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
{
|
{
|
||||||
if (i != playernum && playeringame[i]
|
if (i != playernum && playeringame[i]
|
||||||
@@ -1358,6 +1420,7 @@ static void CleanupPlayerName(INT32 playernum, const char *newname)
|
|||||||
|
|
||||||
if (i < MAXPLAYERS)
|
if (i < MAXPLAYERS)
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// name is okay then
|
// name is okay then
|
||||||
namefailed = false;
|
namefailed = false;
|
||||||
@@ -1368,6 +1431,13 @@ static void CleanupPlayerName(INT32 playernum, const char *newname)
|
|||||||
|
|
||||||
// set consvars whether namefailed or not, because even if it succeeded,
|
// set consvars whether namefailed or not, because even if it succeeded,
|
||||||
// spaces may have been removed
|
// spaces may have been removed
|
||||||
|
if (clientjoin)
|
||||||
|
{
|
||||||
|
consvar_t *namevars[] = {&cv_playername, &cv_playername2, &cv_playername3, &cv_playername4};
|
||||||
|
CV_StealthSet(namevars[playernum], tmpname);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (playernum == consoleplayer)
|
if (playernum == consoleplayer)
|
||||||
CV_StealthSet(&cv_playername, tmpname);
|
CV_StealthSet(&cv_playername, tmpname);
|
||||||
else if (playernum == displayplayers[1] || (!netgame && playernum == 1))
|
else if (playernum == displayplayers[1] || (!netgame && playernum == 1))
|
||||||
@@ -1377,6 +1447,7 @@ static void CleanupPlayerName(INT32 playernum, const char *newname)
|
|||||||
else if (playernum == displayplayers[3] || (!netgame && playernum == 3))
|
else if (playernum == displayplayers[3] || (!netgame && playernum == 3))
|
||||||
CV_StealthSet(&cv_playername4, tmpname);
|
CV_StealthSet(&cv_playername4, tmpname);
|
||||||
else I_Assert(((void)"CleanupPlayerName used on non-local player", 0));
|
else I_Assert(((void)"CleanupPlayerName used on non-local player", 0));
|
||||||
|
}
|
||||||
|
|
||||||
Z_Free(buf);
|
Z_Free(buf);
|
||||||
}
|
}
|
||||||
@@ -1494,7 +1565,9 @@ static void ForceAllSkins(INT32 forcedskin)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static INT32 chmappending;
|
static INT32 chmappending;
|
||||||
|
#ifdef PARANOIA
|
||||||
static INT32 snacpending[MAXSPLITSCREENPLAYERS];
|
static INT32 snacpending[MAXSPLITSCREENPLAYERS];
|
||||||
|
#endif
|
||||||
|
|
||||||
// wonky compat, idk if anything uses this....
|
// wonky compat, idk if anything uses this....
|
||||||
#define playerisbot (splitplayer == 1 && botingame)
|
#define playerisbot (splitplayer == 1 && botingame)
|
||||||
@@ -1594,7 +1667,9 @@ static void SendNameAndColor(UINT8 splitplayer)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef PARANOIA
|
||||||
snacpending[splitplayer]++;
|
snacpending[splitplayer]++;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Don't change name if muted
|
// Don't change name if muted
|
||||||
if (player_name_changes[pnum] >= MAXNAMECHANGES)
|
if (player_name_changes[pnum] >= MAXNAMECHANGES)
|
||||||
@@ -1624,33 +1699,39 @@ static void SendNameAndColor(UINT8 splitplayer)
|
|||||||
// Finally write out the complete packet and send it off.
|
// Finally write out the complete packet and send it off.
|
||||||
WRITESTRINGN(p, playername->zstring, MAXPLAYERNAME);
|
WRITESTRINGN(p, playername->zstring, MAXPLAYERNAME);
|
||||||
WRITEUINT8(p, (UINT8)playercolor->value);
|
WRITEUINT8(p, (UINT8)playercolor->value);
|
||||||
WRITEUINT8(p, (UINT8)playerskin->value);
|
WRITESKIN(p, (skinnum_t)playerskin->value);
|
||||||
|
|
||||||
SendNetXCmdForPlayer(splitplayer, XD_NAMEANDCOLOR, buf, p - buf);
|
SendNetXCmdForPlayer(splitplayer, XD_NAMEANDCOLOR, buf, p - buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
|
||||||
{
|
{
|
||||||
player_t *player = &players[playernum];
|
player_t *player;
|
||||||
char name[MAXPLAYERNAME+1];
|
char name[MAXPLAYERNAME+1] = {};
|
||||||
UINT8 color, skin;
|
UINT8 color;
|
||||||
|
skinnum_t skin;
|
||||||
|
|
||||||
#ifdef PARANOIA
|
#ifdef PARANOIA
|
||||||
if (playernum < 0 || playernum > MAXPLAYERS)
|
if (playernum < 0 || playernum > MAXPLAYERS)
|
||||||
I_Error("There is no player %d!", playernum);
|
I_Error("There is no player %d!", playernum);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
player = &players[playernum];
|
||||||
|
|
||||||
|
#ifdef PARANOIA
|
||||||
if (P_IsLocalPlayer(player))
|
if (P_IsLocalPlayer(player))
|
||||||
{
|
{
|
||||||
snacpending[playernum]--;
|
const INT32 localpnum = P_GetLocalPlayerNumForPlayer(player);
|
||||||
#ifdef PARANOIA
|
snacpending[localpnum]--;
|
||||||
if (snacpending[playernum] < 0)
|
|
||||||
I_Error("snacpending negative!");
|
if (snacpending[localpnum] < 0)
|
||||||
#endif
|
I_Error("snacpending negative for player %d!", localpnum);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
READSTRINGN(*cp, name, MAXPLAYERNAME);
|
READSTRINGN(*cp, name, MAXPLAYERNAME);
|
||||||
color = READUINT8(*cp);
|
color = READUINT8(*cp);
|
||||||
skin = READUINT8(*cp);
|
skin = READSKIN(*cp);
|
||||||
|
|
||||||
// set name
|
// set name
|
||||||
if (player_name_changes[playernum] < MAXNAMECHANGES)
|
if (player_name_changes[playernum] < MAXNAMECHANGES)
|
||||||
@@ -1758,7 +1839,7 @@ INT32 D_LookupPlayer(const char *s)
|
|||||||
|
|
||||||
if ((playernum = atoi(s)))
|
if ((playernum = atoi(s)))
|
||||||
{
|
{
|
||||||
playernum = max(min(playernum, MAXPLAYERS-1), 0);/* not out of range */
|
playernum = max(min(playernum, MAXPLAYERS-1), 0); /* not out of range */
|
||||||
return playernum;
|
return playernum;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2187,7 +2268,6 @@ void D_SetupVote(void)
|
|||||||
WRITEUINT8(p, secondgt);
|
WRITEUINT8(p, secondgt);
|
||||||
secondgt &= ~0x80;
|
secondgt &= ~0x80;
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
UINT16 m;
|
UINT16 m;
|
||||||
@@ -2283,11 +2363,12 @@ static char *ConcatCommandArgv(int start, int end)
|
|||||||
if (!p)
|
if (!p)
|
||||||
I_Error("ConcatCommandArgv: Out of memory!\n");
|
I_Error("ConcatCommandArgv: Out of memory!\n");
|
||||||
|
|
||||||
--end;/* handle the final argument separately */
|
--end; /* handle the final argument separately */
|
||||||
|
|
||||||
for (i = start; i < end; ++i)
|
for (i = start; i < end; ++i)
|
||||||
{
|
{
|
||||||
p += sprintf(p, "%s ", COM_Argv(i));
|
if (size - (p - final) > 0)
|
||||||
|
p += snprintf(p, size - (p - final), "%s ", COM_Argv(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* at this point "end" is actually the last argument's position */
|
/* at this point "end" is actually the last argument's position */
|
||||||
@@ -2701,11 +2782,11 @@ static void Command_ReplayMarker(void)
|
|||||||
|
|
||||||
if (title)
|
if (title)
|
||||||
{
|
{
|
||||||
snprintf(demo.titlename, 64, "%s [%i:%02d/%.5s]", title, G_TicsToMinutes(adjustedleveltime, false), G_TicsToSeconds(adjustedleveltime), modeattacking ? "Record Attack" : connectedservername);
|
snprintf(demo.titlename, sizeof(demo.titlename)-1, "%s [%i:%02d/%.5s]", title, G_TicsToMinutes(adjustedleveltime, false), G_TicsToSeconds(adjustedleveltime), modeattacking ? "Record Attack" : connectedservername);
|
||||||
Z_Free(title);
|
Z_Free(title);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
snprintf(demo.titlename, 64, "[%i:%02d/%.5s]", G_TicsToMinutes(adjustedleveltime, false), G_TicsToSeconds(adjustedleveltime), modeattacking ? "Record Attack" : connectedservername);
|
snprintf(demo.titlename, sizeof(demo.titlename)-1, "[%i:%02d/%.5s]", G_TicsToMinutes(adjustedleveltime, false), G_TicsToSeconds(adjustedleveltime), modeattacking ? "Record Attack" : connectedservername);
|
||||||
|
|
||||||
CONS_Printf("Replay will be saved!\n");
|
CONS_Printf("Replay will be saved!\n");
|
||||||
}
|
}
|
||||||
@@ -4263,6 +4344,49 @@ static void Command_GLocalSkin(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void SetPrefcolor(int splitplayer)
|
||||||
|
{
|
||||||
|
// splitscreen
|
||||||
|
if (splitscreen < splitplayer)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const INT32 pnum = P_GetLocalPlayerNumForNum(splitplayer);
|
||||||
|
|
||||||
|
player_t *player = &players[pnum];
|
||||||
|
consvar_t *colorvars[] = {&cv_playercolor, &cv_playercolor2, &cv_playercolor3, &cv_playercolor4};
|
||||||
|
consvar_t *playercolor = colorvars[splitplayer];
|
||||||
|
|
||||||
|
if (skins[player->skin].prefcolor)
|
||||||
|
{
|
||||||
|
CV_SetValue(playercolor, skins[player->skin].prefcolor);
|
||||||
|
CONS_Printf("Set color to %s%s\n", HU_SkinColorToConsoleColor(skins[player->skin].prefcolor), KartColor_Names[skins[player->skin].prefcolor]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CONS_Printf("\x86Your skin has no prefcolor set\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Command_UsePrefcolor(void)
|
||||||
|
{
|
||||||
|
SetPrefcolor(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Command_UsePrefcolor2(void)
|
||||||
|
{
|
||||||
|
SetPrefcolor(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Command_UsePrefcolor3(void)
|
||||||
|
{
|
||||||
|
SetPrefcolor(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Command_UsePrefcolor4(void)
|
||||||
|
{
|
||||||
|
SetPrefcolor(3);
|
||||||
|
}
|
||||||
|
|
||||||
static void Got_RequestAddfilecmd(const UINT8 **cp, INT32 playernum)
|
static void Got_RequestAddfilecmd(const UINT8 **cp, INT32 playernum)
|
||||||
{
|
{
|
||||||
char filename[241];
|
char filename[241];
|
||||||
@@ -4302,15 +4426,15 @@ static void Got_RequestAddfilecmd(const UINT8 **cp, INT32 playernum)
|
|||||||
char message[275];
|
char message[275];
|
||||||
|
|
||||||
if (toomany)
|
if (toomany)
|
||||||
sprintf(message, M_GetText("Too many files loaded to add %s\n"), filename);
|
snprintf(message, sizeof(message), M_GetText("Too many files loaded to add %s\n"), filename);
|
||||||
else if (ncs == FS_NOTFOUND)
|
else if (ncs == FS_NOTFOUND)
|
||||||
sprintf(message, M_GetText("The server doesn't have %s\n"), filename);
|
snprintf(message, sizeof(message), M_GetText("The server doesn't have %s\n"), filename);
|
||||||
else if (ncs == FS_MD5SUMBAD)
|
else if (ncs == FS_MD5SUMBAD)
|
||||||
sprintf(message, M_GetText("Checksum mismatch on %s\n"), filename);
|
snprintf(message, sizeof(message), M_GetText("Checksum mismatch on %s\n"), filename);
|
||||||
else
|
else
|
||||||
sprintf(message, M_GetText("Unknown error finding wad file (%s)\n"), filename);
|
snprintf(message, sizeof(message), M_GetText("Unknown error finding wad file (%s)\n"), filename);
|
||||||
|
|
||||||
CONS_Printf("%s",message);
|
CONS_Printf("%s", message);
|
||||||
|
|
||||||
for (j = 0; j < MAXPLAYERS; j++)
|
for (j = 0; j < MAXPLAYERS; j++)
|
||||||
if (adminplayers[j])
|
if (adminplayers[j])
|
||||||
@@ -4557,6 +4681,23 @@ void Command_ListUnusedSprites_f(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Command_ListUnusedMapSlots_f(void)
|
||||||
|
{
|
||||||
|
INT32 i;
|
||||||
|
|
||||||
|
CONS_Printf("\x82Printing map slot non-usage...\n");
|
||||||
|
|
||||||
|
for (i = 0; i < NUMMAPS; i++)
|
||||||
|
{
|
||||||
|
// is checking this enough?
|
||||||
|
if (mapheaderinfo[i])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
CONS_Printf("%s\n", G_BuildMapName(i+1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
// MISC. COMMANDS
|
// MISC. COMMANDS
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
@@ -5125,8 +5266,10 @@ static void Command_Mapmd5_f(void)
|
|||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
char md5tmp[33];
|
char md5tmp[33];
|
||||||
|
|
||||||
for (i = 0; i < 16; ++i)
|
for (i = 0; i < 16; ++i)
|
||||||
sprintf(&md5tmp[i*2], "%02x", mapmd5[i]);
|
snprintf(&md5tmp[i*2], 3, "%02x", mapmd5[i]);
|
||||||
|
|
||||||
CONS_Printf("%s: %s\n", G_BuildMapName(gamemap), md5tmp);
|
CONS_Printf("%s: %s\n", G_BuildMapName(gamemap), md5tmp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -5437,7 +5580,6 @@ static void Name_OnChange(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
SendNameAndColor(0);
|
SendNameAndColor(0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Name2_OnChange(void)
|
static void Name2_OnChange(void)
|
||||||
@@ -5628,18 +5770,21 @@ static void Command_SkinSearch(void)
|
|||||||
size_t i;
|
size_t i;
|
||||||
UINT16 s;
|
UINT16 s;
|
||||||
UINT16 ic = 0;
|
UINT16 ic = 0;
|
||||||
//skin_t *skininput = &skins[s];
|
|
||||||
for (i = 1; i < COM_Argc(); i++){
|
for (i = 1; i < COM_Argc(); i++)
|
||||||
for( s = 0 ; s < numallskins ; s++ )
|
{
|
||||||
|
for (s = 0; s < numskins; s++)
|
||||||
{
|
{
|
||||||
skin_t *skininput = &skins[s];
|
skin_t *skininput = &skins[s];
|
||||||
if (strcasestr(skininput->realname,COM_Argv(i)))
|
|
||||||
|
if (strcasestr(skininput->realname, COM_Argv(i)))
|
||||||
{
|
{
|
||||||
ic++;
|
ic++;
|
||||||
CONS_Printf("%d. %s%s:\x80 %s\n", ic,HU_SkinColorToConsoleColor(skininput->prefcolor),skininput->realname,skininput->name);
|
CONS_Printf("%d. %s%s:\x80 %s\n", ic, HU_SkinColorToConsoleColor(skininput->prefcolor), skininput->realname, skininput->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CONS_Printf("Total %d skins.\n", ic);
|
CONS_Printf("Total %d skins.\n", ic);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5814,7 +5959,6 @@ static void BaseNumLaps_OnChange(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void KartFrantic_OnChange(void)
|
static void KartFrantic_OnChange(void)
|
||||||
{
|
{
|
||||||
if ((boolean)cv_kartfrantic.value != franticitems && gamestate == GS_LEVEL && leveltime > starttime)
|
if ((boolean)cv_kartfrantic.value != franticitems && gamestate == GS_LEVEL && leveltime > starttime)
|
||||||
|
|||||||
+4
-9
@@ -51,10 +51,6 @@ extern consvar_t cv_mousevisible;
|
|||||||
//WTF
|
//WTF
|
||||||
extern consvar_t cv_mouseturn;
|
extern consvar_t cv_mouseturn;
|
||||||
extern consvar_t cv_usejoystick[4]; //MAXSPLITSCREENPLAYERS
|
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
|
extern consvar_t cv_joyscale[4]; //MAXSPLITSCREENPLAYERS
|
||||||
|
|
||||||
// normally in p_mobj but the .h is not read
|
// normally in p_mobj but the .h is not read
|
||||||
@@ -93,11 +89,6 @@ extern consvar_t cv_pause;
|
|||||||
extern consvar_t cv_restrictskinchange, cv_allowteamchange, cv_ingamecap, cv_respawntime;
|
extern consvar_t cv_restrictskinchange, cv_allowteamchange, cv_ingamecap, cv_respawntime;
|
||||||
extern consvar_t cv_spectatorreentry, cv_antigrief;
|
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
|
// SRB2kart items
|
||||||
extern consvar_t cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana;
|
extern consvar_t cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana;
|
||||||
extern consvar_t cv_eggmanmonitor, cv_orbinaut, cv_jawz, cv_mine;
|
extern consvar_t cv_eggmanmonitor, cv_orbinaut, cv_jawz, cv_mine;
|
||||||
@@ -155,8 +146,10 @@ extern consvar_t cv_pingstyle;
|
|||||||
|
|
||||||
//extern consvar_t cv_smallpos;
|
//extern consvar_t cv_smallpos;
|
||||||
extern consvar_t cv_showminimapnames;
|
extern consvar_t cv_showminimapnames;
|
||||||
|
extern consvar_t cv_showminimapfinished;
|
||||||
extern consvar_t cv_minihead;
|
extern consvar_t cv_minihead;
|
||||||
extern consvar_t cv_showminimapangle;
|
extern consvar_t cv_showminimapangle;
|
||||||
|
extern consvar_t cv_spinoutroll;
|
||||||
|
|
||||||
extern consvar_t cv_showlapemblem;
|
extern consvar_t cv_showlapemblem;
|
||||||
|
|
||||||
@@ -196,6 +189,8 @@ extern consvar_t cv_ps_thinkframe_page;
|
|||||||
extern consvar_t cv_ps_samplesize;
|
extern consvar_t cv_ps_samplesize;
|
||||||
extern consvar_t cv_ps_descriptor;
|
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_director, cv_kartdebugdirector, cv_showdirectorhud;
|
||||||
|
|
||||||
extern consvar_t cv_showtrackaddon;
|
extern consvar_t cv_showtrackaddon;
|
||||||
|
|||||||
+81
-16
@@ -116,6 +116,8 @@ static I_mutex downloadmutex;
|
|||||||
#endif
|
#endif
|
||||||
char downloaddir[512] = "DOWNLOAD";
|
char downloaddir[512] = "DOWNLOAD";
|
||||||
|
|
||||||
|
INT32 addontypes[NUMADDONTYPES] = {0};
|
||||||
|
|
||||||
file_download_t filedownload = {};
|
file_download_t filedownload = {};
|
||||||
|
|
||||||
#ifdef HAVE_CURL
|
#ifdef HAVE_CURL
|
||||||
@@ -135,6 +137,8 @@ HTTP_login *curl_logins = NULL;
|
|||||||
static void CURLGetFile(void);
|
static void CURLGetFile(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static addontype_t GetAddonType(const char *name);
|
||||||
|
|
||||||
/** Fills a serverinfo packet with information about wad files loaded.
|
/** Fills a serverinfo packet with information about wad files loaded.
|
||||||
*
|
*
|
||||||
* \todo Give this function a better name since it is in global scope.
|
* \todo Give this function a better name since it is in global scope.
|
||||||
@@ -163,7 +167,9 @@ UINT8 *PutFileNeeded(UINT16 firstfile)
|
|||||||
continue;
|
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.
|
// Look below at the WRITE macros to understand what these numbers mean.
|
||||||
const size_t len = strlen(wadfilename) + 1;
|
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].willsend = (UINT8)(filestatus >> 4);
|
||||||
fileneeded[i].totalsize = READUINT32(p); // The four next bytes are the file size
|
fileneeded[i].totalsize = READUINT32(p); // The four next bytes are the file size
|
||||||
fileneeded[i].file = NULL; // The file isn't open yet
|
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
|
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)
|
boolean CL_CheckDownloadable(void)
|
||||||
{
|
{
|
||||||
UINT8 i,dlstatus = 0;
|
UINT8 i, dlstatus = 0;
|
||||||
|
|
||||||
for (i = 0; i < fileneedednum; i++)
|
for (i = 0; i < fileneedednum; i++)
|
||||||
|
{
|
||||||
if (fileneeded[i].status != FS_FOUND && fileneeded[i].status != FS_OPEN)
|
if (fileneeded[i].status != FS_FOUND && fileneeded[i].status != FS_OPEN)
|
||||||
{
|
{
|
||||||
if (fileneeded[i].willsend == 1)
|
if (fileneeded[i].willsend == 1)
|
||||||
@@ -263,6 +273,7 @@ boolean CL_CheckDownloadable(void)
|
|||||||
else //if (fileneeded[i].willsend == 2)
|
else //if (fileneeded[i].willsend == 2)
|
||||||
dlstatus = 2;
|
dlstatus = 2;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Downloading locally disabled
|
// Downloading locally disabled
|
||||||
if (!dlstatus && M_CheckParm("-nodownload"))
|
if (!dlstatus && M_CheckParm("-nodownload"))
|
||||||
@@ -273,7 +284,9 @@ boolean CL_CheckDownloadable(void)
|
|||||||
|
|
||||||
// not downloadable, put reason in console
|
// not downloadable, put reason in console
|
||||||
CONS_Alert(CONS_NOTICE, M_GetText("You need additional files to connect to this server:\n"));
|
CONS_Alert(CONS_NOTICE, M_GetText("You need additional files to connect to this server:\n"));
|
||||||
|
|
||||||
for (i = 0; i < fileneedednum; i++)
|
for (i = 0; i < fileneedednum; i++)
|
||||||
|
{
|
||||||
if (fileneeded[i].status != FS_FOUND && fileneeded[i].status != FS_OPEN)
|
if (fileneeded[i].status != FS_FOUND && fileneeded[i].status != FS_OPEN)
|
||||||
{
|
{
|
||||||
CONS_Printf(" * \"%s\" (%dK)", fileneeded[i].filename, fileneeded[i].totalsize >> 10);
|
CONS_Printf(" * \"%s\" (%dK)", fileneeded[i].filename, fileneeded[i].totalsize >> 10);
|
||||||
@@ -286,12 +299,16 @@ boolean CL_CheckDownloadable(void)
|
|||||||
{
|
{
|
||||||
INT32 j;
|
INT32 j;
|
||||||
char md5tmp[33];
|
char md5tmp[33];
|
||||||
|
|
||||||
for (j = 0; j < 16; j++)
|
for (j = 0; j < 16; j++)
|
||||||
sprintf(&md5tmp[j*2], "%02x", fileneeded[i].md5sum[j]);
|
snprintf(&md5tmp[j*2], 3, "%02x", fileneeded[i].md5sum[j]);
|
||||||
|
|
||||||
CONS_Printf("%s", md5tmp);
|
CONS_Printf("%s", md5tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
CONS_Printf("\n");
|
CONS_Printf("\n");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (dlstatus)
|
switch (dlstatus)
|
||||||
{
|
{
|
||||||
@@ -305,6 +322,7 @@ boolean CL_CheckDownloadable(void)
|
|||||||
CONS_Printf(M_GetText("All files downloadable, but you have chosen to disable downloading locally.\n"));
|
CONS_Printf(M_GetText("All files downloadable, but you have chosen to disable downloading locally.\n"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -542,7 +560,7 @@ INT32 CL_CheckFiles(void)
|
|||||||
if (fileneeded[i].status != FS_OPEN)
|
if (fileneeded[i].status != FS_OPEN)
|
||||||
filestoload++;
|
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;
|
continue;
|
||||||
|
|
||||||
CONS_Debug(DBG_NETPLAY, "searching for '%s' ", fileneeded[i].filename);
|
CONS_Debug(DBG_NETPLAY, "searching for '%s' ", fileneeded[i].filename);
|
||||||
@@ -550,16 +568,20 @@ INT32 CL_CheckFiles(void)
|
|||||||
// Check in already loaded files
|
// Check in already loaded files
|
||||||
for (j = mainwads+1; j < numwadfiles; j++)
|
for (j = mainwads+1; j < numwadfiles; j++)
|
||||||
{
|
{
|
||||||
nameonly(strcpy(wadfilename, wadfiles[j]->filename));
|
if (!memcmp(wadfiles[j]->md5sum, fileneeded[i].md5sum, 16))
|
||||||
|
{
|
||||||
|
strncpy(wadfilename, wadfiles[j]->filename, MAX_WADPATH);
|
||||||
|
wadfilename[MAX_WADPATH-1] = '\0';
|
||||||
|
nameonly(wadfilename);
|
||||||
|
|
||||||
if (fasticmp(wadfilename, fileneeded[i].filename) &&
|
if (fasticmp(wadfilename, fileneeded[i].filename))
|
||||||
!memcmp(wadfiles[j]->md5sum, fileneeded[i].md5sum, 16))
|
|
||||||
{
|
{
|
||||||
CONS_Debug(DBG_NETPLAY, "already loaded\n");
|
CONS_Debug(DBG_NETPLAY, "already loaded\n");
|
||||||
fileneeded[i].status = FS_OPEN;
|
fileneeded[i].status = FS_OPEN;
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fileneeded[i].status = findfile(fileneeded[i].filename, fileneeded[i].md5sum, true);
|
fileneeded[i].status = findfile(fileneeded[i].filename, fileneeded[i].md5sum, true);
|
||||||
CONS_Debug(DBG_NETPLAY, "found %d\n", fileneeded[i].status);
|
CONS_Debug(DBG_NETPLAY, "found %d\n", fileneeded[i].status);
|
||||||
@@ -575,6 +597,48 @@ INT32 CL_CheckFiles(void)
|
|||||||
return 1; //everything is FS_OPEN or FS_FOUND, proceed to loading
|
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
|
// Load it now
|
||||||
boolean CL_LoadServerFiles(void)
|
boolean CL_LoadServerFiles(void)
|
||||||
{
|
{
|
||||||
@@ -596,7 +660,7 @@ boolean CL_LoadServerFiles(void)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
switch(fileneeded[i].status)
|
switch (fileneeded[i].status)
|
||||||
{
|
{
|
||||||
case FS_NOTFOUND:
|
case FS_NOTFOUND:
|
||||||
s = "FS_NOTFOUND";
|
s = "FS_NOTFOUND";
|
||||||
@@ -639,7 +703,7 @@ static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid)
|
|||||||
|
|
||||||
char wadfilename[MAX_WADPATH];
|
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));
|
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
|
// Find the last file in the list and set a pointer to its "next" field
|
||||||
@@ -664,7 +728,9 @@ static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid)
|
|||||||
// Look for the requested file through all loaded files
|
// Look for the requested file through all loaded files
|
||||||
for (wadnum = 0; wadfiles[wadnum]; wadnum++)
|
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);
|
nameonly(wadfilename);
|
||||||
|
|
||||||
if (fasticmp(wadfilename, p->id.filename))
|
if (fasticmp(wadfilename, p->id.filename))
|
||||||
@@ -1017,7 +1083,7 @@ void Got_Filetxpak(void)
|
|||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
switch(file->status)
|
switch (file->status)
|
||||||
{
|
{
|
||||||
case FS_NOTFOUND:
|
case FS_NOTFOUND:
|
||||||
s = "FS_NOTFOUND";
|
s = "FS_NOTFOUND";
|
||||||
@@ -1145,7 +1211,7 @@ filestatus_t checkfilemd5(char *filename, const UINT8 *wantedmd5sum)
|
|||||||
fhandle = fopen(filename, "rb");
|
fhandle = fopen(filename, "rb");
|
||||||
if (fhandle)
|
if (fhandle)
|
||||||
{
|
{
|
||||||
md5_stream(fhandle,md5sum);
|
md5_stream(fhandle, md5sum);
|
||||||
fclose(fhandle);
|
fclose(fhandle);
|
||||||
if (!memcmp(wantedmd5sum, md5sum, 16))
|
if (!memcmp(wantedmd5sum, md5sum, 16))
|
||||||
return FS_FOUND;
|
return FS_FOUND;
|
||||||
@@ -1553,8 +1619,7 @@ static void CURLGetFile(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
HTTP_login *
|
HTTP_login *CURLGetLogin(const char *url, HTTP_login ***return_prev_next)
|
||||||
CURLGetLogin (const char *url, HTTP_login ***return_prev_next)
|
|
||||||
{
|
{
|
||||||
HTTP_login * login;
|
HTTP_login * login;
|
||||||
HTTP_login ** prev_next;
|
HTTP_login ** prev_next;
|
||||||
@@ -1564,7 +1629,7 @@ CURLGetLogin (const char *url, HTTP_login ***return_prev_next)
|
|||||||
( login = (*prev_next));
|
( login = (*prev_next));
|
||||||
prev_next = &login->next
|
prev_next = &login->next
|
||||||
){
|
){
|
||||||
if (fastcmp(login->url, url) != 0)
|
if (fastcmp(login->url, url))
|
||||||
{
|
{
|
||||||
if (return_prev_next)
|
if (return_prev_next)
|
||||||
(*return_prev_next) = prev_next;
|
(*return_prev_next) = prev_next;
|
||||||
|
|||||||
@@ -40,6 +40,15 @@ typedef enum
|
|||||||
FS_FALLBACK, // HTTP failed
|
FS_FALLBACK, // HTTP failed
|
||||||
} filestatus_t;
|
} filestatus_t;
|
||||||
|
|
||||||
|
typedef enum addontype_e
|
||||||
|
{
|
||||||
|
ADDON_SCRIPT,
|
||||||
|
ADDON_MAP,
|
||||||
|
ADDON_CHARACTER,
|
||||||
|
ADDON_MISC,
|
||||||
|
NUMADDONTYPES,
|
||||||
|
} addontype_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
UINT8 willsend; // Is the server willing to send it?
|
UINT8 willsend; // Is the server willing to send it?
|
||||||
@@ -51,11 +60,13 @@ typedef struct
|
|||||||
UINT32 totalsize;
|
UINT32 totalsize;
|
||||||
filestatus_t status; // The value returned by recsearch
|
filestatus_t status; // The value returned by recsearch
|
||||||
boolean justdownloaded; // To prevent late fragments from causing an I_Error
|
boolean justdownloaded; // To prevent late fragments from causing an I_Error
|
||||||
|
addontype_t type;
|
||||||
} fileneeded_t;
|
} fileneeded_t;
|
||||||
|
|
||||||
extern INT32 fileneedednum;
|
extern INT32 fileneedednum;
|
||||||
extern fileneeded_t fileneeded[MAX_WADFILES];
|
extern fileneeded_t fileneeded[MAX_WADFILES];
|
||||||
extern char downloaddir[512];
|
extern char downloaddir[512];
|
||||||
|
extern INT32 addontypes[NUMADDONTYPES];
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -91,6 +102,7 @@ void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr, UINT16 fi
|
|||||||
void CL_PrepareDownloadSaveGame(const char *tmpsave);
|
void CL_PrepareDownloadSaveGame(const char *tmpsave);
|
||||||
|
|
||||||
INT32 CL_CheckFiles(void);
|
INT32 CL_CheckFiles(void);
|
||||||
|
void CL_CheckAddonTypes(void);
|
||||||
boolean CL_LoadServerFiles(void);
|
boolean CL_LoadServerFiles(void);
|
||||||
void SV_SendRam(INT32 node, void *data, size_t size, freemethod_t freemethod,
|
void SV_SendRam(INT32 node, void *data, size_t size, freemethod_t freemethod,
|
||||||
UINT8 fileid);
|
UINT8 fileid);
|
||||||
|
|||||||
+14
-3
@@ -361,11 +361,17 @@ typedef struct squishdance_s
|
|||||||
{
|
{
|
||||||
tic_t countdown; // hold "custom 3" for 2 seconds to engange le dance
|
tic_t countdown; // hold "custom 3" for 2 seconds to engange le dance
|
||||||
tic_t time;
|
tic_t time;
|
||||||
fixed_t work;
|
|
||||||
fixed_t ang;
|
|
||||||
fixed_t bounce; // hehe squishy
|
|
||||||
} squishdance_t;
|
} squishdance_t;
|
||||||
|
|
||||||
|
typedef struct salty_s
|
||||||
|
{
|
||||||
|
bool ready;
|
||||||
|
bool tapping;
|
||||||
|
fixed_t zoffset;
|
||||||
|
fixed_t momz;
|
||||||
|
bool jump;
|
||||||
|
} salty_t;
|
||||||
|
|
||||||
// ========================================================================
|
// ========================================================================
|
||||||
// PLAYER STRUCTURE
|
// PLAYER STRUCTURE
|
||||||
// ========================================================================
|
// ========================================================================
|
||||||
@@ -561,11 +567,16 @@ typedef struct player_s
|
|||||||
|
|
||||||
fixed_t spinoutrot; // When a player spins out, this value increments modulus 360.
|
fixed_t spinoutrot; // When a player spins out, this value increments modulus 360.
|
||||||
|
|
||||||
|
// saltyhop! hardcode edition
|
||||||
|
salty_t salty;
|
||||||
|
|
||||||
squishdance_t squishdance;
|
squishdance_t squishdance;
|
||||||
|
|
||||||
fixed_t fovadd; // adjust FOV for hw rendering
|
fixed_t fovadd; // adjust FOV for hw rendering
|
||||||
|
|
||||||
SINT8 driftlevel; // just for controller rumble for now
|
SINT8 driftlevel; // just for controller rumble for now
|
||||||
|
|
||||||
|
UINT8 stairjank;
|
||||||
} player_t;
|
} player_t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
+2
-2
@@ -211,12 +211,12 @@ void D_SetupProtocol(void)
|
|||||||
|
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
if (!fastcmp(buffer, "no"))
|
if (fastcmp(buffer, "no"))
|
||||||
{
|
{
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (fastcmp(buffer, exe_path))
|
else if (!fastcmp(buffer, exe_path))
|
||||||
{
|
{
|
||||||
// overwrite
|
// overwrite
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|||||||
@@ -119,20 +119,25 @@ target_compile_definitions(SRB2SDL2 PRIVATE
|
|||||||
-DHAVE_THREADS
|
-DHAVE_THREADS
|
||||||
)
|
)
|
||||||
|
|
||||||
if(SRB2_CONFIG_LTO AND NOT SRB2_CONFIG_DEBUGMODE)
|
if(SRB2_CONFIG_LTO AND NOT SRB2_CONFIG_DEBUGMODE AND NOT SRB2_CONFIG_ASAN AND NOT SRB2_CONFIG_UBSAN AND NOT SRB2_CONFIG_TSAN)
|
||||||
set_property(TARGET SRB2SDL2 PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
|
set_property(TARGET SRB2SDL2 PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(SRB2_CONFIG_ASAN)
|
if(SRB2_CONFIG_ASAN)
|
||||||
target_compile_options(SRB2SDL2 PRIVATE -fsanitize=address)
|
target_compile_options(SRB2SDL2 PRIVATE -O1 -fsanitize=address -fno-omit-frame-pointer -fno-common)
|
||||||
target_link_options(SRB2SDL2 PRIVATE -fsanitize=address)
|
target_link_options(SRB2SDL2 PRIVATE -fsanitize=address)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(SRB2_CONFIG_UBSAN)
|
if(SRB2_CONFIG_UBSAN)
|
||||||
target_compile_options(SRB2SDL2 PRIVATE -fsanitize=undefined)
|
target_compile_options(SRB2SDL2 PRIVATE -O1 -fsanitize=undefined -fno-omit-frame-pointer)
|
||||||
target_link_options(SRB2SDL2 PRIVATE -fsanitize=undefined)
|
target_link_options(SRB2SDL2 PRIVATE -fsanitize=undefined)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(SRB2_CONFIG_TSAN)
|
||||||
|
target_compile_options(SRB2SDL2 PRIVATE -O1 -fsanitize=thread -fno-omit-frame-pointer)
|
||||||
|
target_link_options(SRB2SDL2 PRIVATE -fsanitize=thread)
|
||||||
|
endif()
|
||||||
|
|
||||||
## strip debug symbols into separate file when using gcc
|
## strip debug symbols into separate file when using gcc
|
||||||
# if(CMAKE_COMPILER_IS_GNUCC)
|
# if(CMAKE_COMPILER_IS_GNUCC)
|
||||||
# if(${CMAKE_BUILD_TYPE} MATCHES Debug)
|
# if(${CMAKE_BUILD_TYPE} MATCHES Debug)
|
||||||
|
|||||||
+171
-71
@@ -68,6 +68,12 @@ typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T);
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#if defined (__linux__)
|
#if defined (__linux__)
|
||||||
#include <sys/vfs.h>
|
#include <sys/vfs.h>
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/mount.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
#include <mach/mach.h>
|
||||||
#else
|
#else
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/mount.h>
|
#include <sys/mount.h>
|
||||||
@@ -156,8 +162,7 @@ const char *wadSearchPaths[] = {
|
|||||||
|
|
||||||
/** \brief WAD file to look for
|
/** \brief WAD file to look for
|
||||||
*/
|
*/
|
||||||
#define WADKEYWORD1 "srb2.srb"
|
#define WADKEYWORD "srb2.srb"
|
||||||
#define WADKEYWORD2 "srb2.wad"
|
|
||||||
/** \brief holds wad path
|
/** \brief holds wad path
|
||||||
*/
|
*/
|
||||||
static char returnWadPath[256];
|
static char returnWadPath[256];
|
||||||
@@ -522,15 +527,22 @@ void I_OutputMsg(const char *fmt, ...)
|
|||||||
char *txt;
|
char *txt;
|
||||||
va_list argptr;
|
va_list argptr;
|
||||||
|
|
||||||
va_start(argptr,fmt);
|
if (!fmt)
|
||||||
|
return;
|
||||||
|
|
||||||
|
va_start(argptr, fmt);
|
||||||
len = vsnprintf(NULL, 0, fmt, argptr);
|
len = vsnprintf(NULL, 0, fmt, argptr);
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
txt = malloc(len+1);
|
txt = (char*)(malloc(len+1));
|
||||||
va_start(argptr,fmt);
|
|
||||||
vsprintf(txt, fmt, argptr);
|
if (!txt)
|
||||||
|
I_Error("I_OutputMsg: Out of memory!\n");
|
||||||
|
|
||||||
|
va_start(argptr, fmt);
|
||||||
|
vsnprintf(txt, len+1, fmt, argptr);
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
|
|
||||||
#ifdef HAVE_TTF
|
#ifdef HAVE_TTF
|
||||||
@@ -538,7 +550,7 @@ void I_OutputMsg(const char *fmt, ...)
|
|||||||
DEFAULTFONTBGR, DEFAULTFONTBGG, DEFAULTFONTBGB, DEFAULTFONTBGA, txt);
|
DEFAULTFONTBGR, DEFAULTFONTBGG, DEFAULTFONTBGB, DEFAULTFONTBGA, txt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
len = strlen(txt);
|
len = strnlen(txt, len+1);
|
||||||
|
|
||||||
#ifdef LOGMESSAGES
|
#ifdef LOGMESSAGES
|
||||||
if (logstream)
|
if (logstream)
|
||||||
@@ -735,6 +747,22 @@ const char *I_GetJoyName(INT32 joyindex)
|
|||||||
return NULL;
|
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 I_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration)
|
||||||
{
|
{
|
||||||
(void)playernum;
|
(void)playernum;
|
||||||
@@ -940,14 +968,18 @@ void I_Sleep(UINT32 ms)
|
|||||||
|
|
||||||
void I_SleepDuration(precise_t duration)
|
void I_SleepDuration(precise_t duration)
|
||||||
{
|
{
|
||||||
#if defined(__linux__) || defined(__FreeBSD__) || defined(__HAIKU__)
|
#if defined(__linux__) || defined(__FreeBSD__) || defined(__HAIKU__) || defined(__OpenBSD__)
|
||||||
UINT64 precision = I_GetPrecisePrecision();
|
UINT64 precision = I_GetPrecisePrecision();
|
||||||
struct timespec ts = {
|
struct timespec ts = {
|
||||||
.tv_sec = duration / precision,
|
.tv_sec = duration / precision,
|
||||||
.tv_nsec = duration * 1000000000 / precision % 1000000000,
|
.tv_nsec = duration * 1000000000 / precision % 1000000000,
|
||||||
};
|
};
|
||||||
int status;
|
int status;
|
||||||
|
#ifdef __OpenBSD__
|
||||||
|
do status = nanosleep(&ts, &ts);
|
||||||
|
#else
|
||||||
do status = clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &ts);
|
do status = clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &ts);
|
||||||
|
#endif
|
||||||
while (status == EINTR);
|
while (status == EINTR);
|
||||||
#elif defined (MIN_SLEEP_DURATION_MS)
|
#elif defined (MIN_SLEEP_DURATION_MS)
|
||||||
UINT64 precision = I_GetPrecisePrecision();
|
UINT64 precision = I_GetPrecisePrecision();
|
||||||
@@ -1007,8 +1039,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.");
|
sigmsg = ("SIGSEGV - SRB2Kart-Saturn has attempted to access a memory location that it shouldn't and needs to close.");
|
||||||
break;
|
break;
|
||||||
#ifdef SIGTERM
|
#ifdef SIGTERM
|
||||||
case SIGTERM: // Software termination signal from kill
|
case SIGTERM: // Software termination signal from terminate
|
||||||
sigmsg = ("SIGTERM - SRB2Kart-Saturn was terminated by a kill signal.");
|
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;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef SIGBREAK
|
#ifdef SIGBREAK
|
||||||
@@ -1020,7 +1057,7 @@ static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_ms
|
|||||||
sigmsg = ("SIGABRT - SRB2Kart-Saturn was terminated by an abort signal.");
|
sigmsg = ("SIGABRT - SRB2Kart-Saturn was terminated by an abort signal.");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
sprintf(signal_msg, "Signal number %d", signal_num);
|
snprintf(signal_msg, 512, "Signal number %d", signal_num);
|
||||||
sigmsg = (core_dumped ? "Unknown signal" : signal_msg);
|
sigmsg = (core_dumped ? "Unknown signal" : signal_msg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1028,13 +1065,17 @@ static void I_PrintSignal(INT32 signal_num, boolean core_dumped, char *signal_ms
|
|||||||
if (core_dumped)
|
if (core_dumped)
|
||||||
{
|
{
|
||||||
if (sigmsg)
|
if (sigmsg)
|
||||||
sprintf(signal_msg, "%s (core dumped)", sigmsg);
|
{
|
||||||
else
|
snprintf(signal_msg, 512, "%s (core dumped)", sigmsg);
|
||||||
strcat(signal_msg, " (core dumped)");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(signal_msg, "%s", sigmsg);
|
strcat(signal_msg, " (core dumped)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
snprintf(signal_msg, 512, "%s", sigmsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1311,7 +1352,7 @@ FUNCNORETURN static ATTRNORETURN void newsignalhandler_Warn(const char *pr)
|
|||||||
{
|
{
|
||||||
char text[128];
|
char text[128];
|
||||||
|
|
||||||
snprintf(text, sizeof text,
|
snprintf(text, sizeof(text),
|
||||||
"Error while setting up signal reporting: %s: %s",
|
"Error while setting up signal reporting: %s: %s",
|
||||||
pr,
|
pr,
|
||||||
strerror(errno)
|
strerror(errno)
|
||||||
@@ -1341,18 +1382,28 @@ static void I_Fork(void)
|
|||||||
I_RegisterChildSignals();
|
I_RegisterChildSignals();
|
||||||
break;
|
break;
|
||||||
default:
|
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)
|
if (logstream)
|
||||||
fclose(logstream);/* the child has this */
|
fclose(logstream);/* the child has this */
|
||||||
|
|
||||||
c = wait(&status);
|
c = wait(&status);
|
||||||
|
|
||||||
#ifdef LOGMESSAGES
|
#ifdef LOGMESSAGES
|
||||||
/* By the way, exit closes files. */
|
/* By the way, exit closes files. */
|
||||||
logstream = fopen(logfilename, "at");
|
logstream = fopen(logfilename, "at");
|
||||||
#else
|
#else
|
||||||
logstream = 0;
|
logstream = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
{
|
{
|
||||||
kill(child, SIGKILL);
|
kill(child, SIGKILL);
|
||||||
@@ -1382,9 +1433,14 @@ static void I_Fork(void)
|
|||||||
}
|
}
|
||||||
#endif/*NEWSIGNALHANDLER*/
|
#endif/*NEWSIGNALHANDLER*/
|
||||||
|
|
||||||
|
int I_OpenURL(const char *url)
|
||||||
|
{
|
||||||
|
(void)url;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
INT32 I_StartupSystem(void)
|
INT32 I_StartupSystem(void)
|
||||||
{
|
{
|
||||||
W_Startup();
|
|
||||||
I_StartupConsole();
|
I_StartupConsole();
|
||||||
#ifdef NEWSIGNALHANDLER
|
#ifdef NEWSIGNALHANDLER
|
||||||
// This is useful when debugging. It lets GDB attach to
|
// This is useful when debugging. It lets GDB attach to
|
||||||
@@ -1413,8 +1469,8 @@ void I_Quit(void)
|
|||||||
/* prevent recursive I_Quit() */
|
/* prevent recursive I_Quit() */
|
||||||
if (quiting)
|
if (quiting)
|
||||||
goto death;
|
goto death;
|
||||||
|
|
||||||
quiting = false;
|
quiting = false;
|
||||||
I_ShutdownConsole();
|
|
||||||
M_SaveConfig(NULL); //save game config, cvars..
|
M_SaveConfig(NULL); //save game config, cvars..
|
||||||
D_SaveBan(); // save the ban list
|
D_SaveBan(); // save the ban list
|
||||||
G_SaveGameData(false); // Tails 12-08-2002
|
G_SaveGameData(false); // Tails 12-08-2002
|
||||||
@@ -1430,16 +1486,18 @@ void I_Quit(void)
|
|||||||
// use this for 1.28 19990220 by Kin
|
// use this for 1.28 19990220 by Kin
|
||||||
I_ShutdownGraphics();
|
I_ShutdownGraphics();
|
||||||
I_ShutdownSystem();
|
I_ShutdownSystem();
|
||||||
|
|
||||||
/* if option -noendtxt is set, don't print the text */
|
/* if option -noendtxt is set, don't print the text */
|
||||||
if (!M_CheckParm("-noendtxt") && W_CheckNumForName("ENDOOM") != LUMPERROR)
|
if (!M_CheckParm("-noendtxt") && W_CheckNumForName("ENDOOM") != LUMPERROR)
|
||||||
{
|
{
|
||||||
printf("\r");
|
printf("\r");
|
||||||
ShowEndTxt();
|
ShowEndTxt();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (myargmalloc)
|
if (myargmalloc)
|
||||||
free(myargv); // Deallocate allocated memory
|
free(myargv); // Deallocate allocated memory
|
||||||
|
|
||||||
death:
|
death:
|
||||||
W_Shutdown();
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1480,12 +1538,11 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
|
|||||||
if (errorcount > 20)
|
if (errorcount > 20)
|
||||||
{
|
{
|
||||||
va_start(argptr, error);
|
va_start(argptr, error);
|
||||||
vsnprintf(buffer, 8192, error, argptr);
|
vsnprintf(buffer, sizeof(buffer), error, argptr);
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
|
|
||||||
I_OutputMsg("SRB2Kart %s Recursive Error", buffer);
|
I_OutputMsg("SRB2Kart %s Recursive Error", buffer);
|
||||||
|
|
||||||
W_Shutdown();
|
|
||||||
exit(-1); // recursive errors detected
|
exit(-1); // recursive errors detected
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1494,7 +1551,7 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
|
|||||||
|
|
||||||
// Display error message in the console before we start shutting it down
|
// Display error message in the console before we start shutting it down
|
||||||
va_start(argptr, error);
|
va_start(argptr, error);
|
||||||
vsnprintf(buffer, 8192, error, argptr);
|
vsnprintf(buffer, sizeof(buffer), error, argptr);
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
I_OutputMsg("\nI_Error(): %s\n", buffer);
|
I_OutputMsg("\nI_Error(): %s\n", buffer);
|
||||||
|
|
||||||
@@ -1503,8 +1560,6 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
|
|||||||
#endif
|
#endif
|
||||||
// ---
|
// ---
|
||||||
|
|
||||||
I_ShutdownConsole();
|
|
||||||
|
|
||||||
M_SaveConfig(NULL); // save game config, cvars..
|
M_SaveConfig(NULL); // save game config, cvars..
|
||||||
D_SaveBan(); // save the ban list
|
D_SaveBan(); // save the ban list
|
||||||
G_SaveGameData(false); // Tails 12-08-2002
|
G_SaveGameData(false); // Tails 12-08-2002
|
||||||
@@ -1520,8 +1575,6 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...)
|
|||||||
I_ShutdownGraphics();
|
I_ShutdownGraphics();
|
||||||
I_ShutdownSystem();
|
I_ShutdownSystem();
|
||||||
|
|
||||||
W_Shutdown();
|
|
||||||
|
|
||||||
#if defined (PARANOIA) && defined (__CYGWIN__)
|
#if defined (PARANOIA) && defined (__CYGWIN__)
|
||||||
*(INT32 *)2 = 4; //Alam: Debug!
|
*(INT32 *)2 = 4; //Alam: Debug!
|
||||||
#endif
|
#endif
|
||||||
@@ -1627,9 +1680,10 @@ void I_ShutdownSystem(void)
|
|||||||
{
|
{
|
||||||
INT32 c;
|
INT32 c;
|
||||||
|
|
||||||
#ifndef NEWSIGNALHANDLER
|
#ifdef NEWSIGNALHANDLER
|
||||||
I_ShutdownConsole();
|
if (M_CheckParm("-nofork"))
|
||||||
#endif
|
#endif
|
||||||
|
I_ShutdownConsole();
|
||||||
|
|
||||||
for (c = MAX_QUIT_FUNCS-1; c >= 0; c--)
|
for (c = MAX_QUIT_FUNCS-1; c >= 0; c--)
|
||||||
if (quit_funcs[c])
|
if (quit_funcs[c])
|
||||||
@@ -1718,7 +1772,8 @@ char *I_GetUserName(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
strncpy(username, p, MAXPLAYERNAME);
|
|
||||||
|
snprintf(username, sizeof(username), "%s", p);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fastcmp(username, ""))
|
if (!fastcmp(username, ""))
|
||||||
@@ -1742,6 +1797,24 @@ INT32 I_mkdir(const char *dirname, INT32 unixright)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INT32 I_ChDir(const char *path)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
return (SetCurrentDirectoryA(path) ? 0 : -1);
|
||||||
|
#else
|
||||||
|
return chdir(path);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
char *I_GetCwd(char *buf, size_t size)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
return (GetCurrentDirectoryA((DWORD)size, buf) ? buf : NULL);
|
||||||
|
#else
|
||||||
|
return getcwd(buf, size);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
char *I_GetEnv(const char *name)
|
char *I_GetEnv(const char *name)
|
||||||
{
|
{
|
||||||
return getenv(name);
|
return getenv(name);
|
||||||
@@ -1774,42 +1847,34 @@ const char *I_ClipboardPaste(void)
|
|||||||
*/
|
*/
|
||||||
static boolean isWadPathOk(const char *path)
|
static boolean isWadPathOk(const char *path)
|
||||||
{
|
{
|
||||||
char *wad3path = malloc(256);
|
char wad3path[256];
|
||||||
|
|
||||||
if (!wad3path)
|
snprintf(wad3path, sizeof(wad3path), pandf, path, WADKEYWORD);
|
||||||
return false;
|
|
||||||
|
|
||||||
sprintf(wad3path, pandf, path, WADKEYWORD1);
|
|
||||||
|
|
||||||
if (FIL_ReadFileOK(wad3path))
|
if (FIL_ReadFileOK(wad3path))
|
||||||
{
|
{
|
||||||
free(wad3path);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(wad3path, pandf, path, WADKEYWORD2);
|
|
||||||
|
|
||||||
if (FIL_ReadFileOK(wad3path))
|
|
||||||
{
|
|
||||||
free(wad3path);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(wad3path);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pathonly(char *s)
|
static void pathonly(char *s, size_t size)
|
||||||
{
|
{
|
||||||
size_t j;
|
size_t j;
|
||||||
|
|
||||||
for (j = strlen(s); j != (size_t)-1; j--)
|
for (j = strnlen(s, size); j != (size_t)-1; j--)
|
||||||
|
{
|
||||||
if ((s[j] == '\\') || (s[j] == ':') || (s[j] == '/'))
|
if ((s[j] == '\\') || (s[j] == ':') || (s[j] == '/'))
|
||||||
{
|
{
|
||||||
if (s[j] == ':') s[j+1] = 0;
|
if (s[j] == ':')
|
||||||
else s[j] = 0;
|
s[j+1] = 0;
|
||||||
|
else
|
||||||
|
s[j] = 0;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief search for srb2.srb in the given path
|
/** \brief search for srb2.srb in the given path
|
||||||
@@ -1825,11 +1890,12 @@ static const char *searchWad(const char *searchDir)
|
|||||||
static char tempsw[256] = "";
|
static char tempsw[256] = "";
|
||||||
filestatus_t fstemp;
|
filestatus_t fstemp;
|
||||||
|
|
||||||
strcpy(tempsw, WADKEYWORD1);
|
snprintf(tempsw, sizeof(tempsw), "%s", WADKEYWORD);
|
||||||
fstemp = filesearch(tempsw, searchDir, NULL, true, 20);
|
fstemp = filesearch(tempsw, searchDir, NULL, true, 20);
|
||||||
|
|
||||||
if (fstemp == FS_FOUND)
|
if (fstemp == FS_FOUND)
|
||||||
{
|
{
|
||||||
pathonly(tempsw);
|
pathonly(tempsw, sizeof(tempsw));
|
||||||
return tempsw;
|
return tempsw;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1867,7 +1933,7 @@ static const char *locateWad(void)
|
|||||||
|
|
||||||
#ifndef NOCWD
|
#ifndef NOCWD
|
||||||
// examine current dir
|
// examine current dir
|
||||||
strcpy(returnWadPath, ".");
|
snprintf(returnWadPath, sizeof(returnWadPath), "%s", ".");
|
||||||
I_OutputMsg(",%s", returnWadPath);
|
I_OutputMsg(",%s", returnWadPath);
|
||||||
if (isWadPathOk(returnWadPath))
|
if (isWadPathOk(returnWadPath))
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1879,7 +1945,7 @@ static const char *locateWad(void)
|
|||||||
// examine user jart directory
|
// examine user jart directory
|
||||||
if ((envstr = I_GetEnv("HOME")) != NULL)
|
if ((envstr = I_GetEnv("HOME")) != NULL)
|
||||||
{
|
{
|
||||||
sprintf(returnWadPath, "%s" PATHSEP DEFAULTDIR, envstr);
|
snprintf(returnWadPath, sizeof(returnWadPath), "%s" PATHSEP DEFAULTDIR, envstr);
|
||||||
CHECKWADPATH(returnWadPath);
|
CHECKWADPATH(returnWadPath);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -1893,7 +1959,7 @@ static const char *locateWad(void)
|
|||||||
// examine default dirs
|
// examine default dirs
|
||||||
for (i = 0; wadDefaultPaths[i]; i++)
|
for (i = 0; wadDefaultPaths[i]; i++)
|
||||||
{
|
{
|
||||||
strcpy(returnWadPath, wadDefaultPaths[i]);
|
snprintf(returnWadPath, sizeof(returnWadPath), "%s", wadDefaultPaths[i]);
|
||||||
CHECKWADPATH(returnWadPath);
|
CHECKWADPATH(returnWadPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1921,12 +1987,11 @@ const char *I_LocateWad(void)
|
|||||||
// change to the directory where we found srb2.srb
|
// change to the directory where we found srb2.srb
|
||||||
#if defined (_WIN32)
|
#if defined (_WIN32)
|
||||||
waddir = _fullpath(NULL, waddir, MAX_PATH);
|
waddir = _fullpath(NULL, waddir, MAX_PATH);
|
||||||
SetCurrentDirectoryA(waddir);
|
|
||||||
#else
|
#else
|
||||||
waddir = realpath(waddir, NULL);
|
waddir = realpath(waddir, NULL);
|
||||||
if (waddir == NULL || chdir(waddir) == -1)
|
|
||||||
I_OutputMsg("Couldn't change working directory\n");
|
|
||||||
#endif
|
#endif
|
||||||
|
if (waddir == NULL || I_ChDir(waddir) == -1)
|
||||||
|
I_OutputMsg("Couldn't change working directory\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return waddir;
|
return waddir;
|
||||||
@@ -1946,17 +2011,22 @@ const char *I_LocateWad(void)
|
|||||||
static long get_entry(const char* name, const char* buf)
|
static long get_entry(const char* name, const char* buf)
|
||||||
{
|
{
|
||||||
long val;
|
long val;
|
||||||
char* hit = strstr(buf, name);
|
const char* hit = strstr(buf, name);
|
||||||
if (hit == NULL) {
|
|
||||||
|
if (hit == NULL)
|
||||||
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
val = strtol(hit + strlen(name), NULL, 10);
|
val = strtol(hit + strlen(name), NULL, 10);
|
||||||
if (errno != 0) {
|
|
||||||
|
if (errno != 0)
|
||||||
|
{
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("get_entry: strtol() failed: %s\n"), strerror(errno));
|
CONS_Alert(CONS_ERROR, M_GetText("get_entry: strtol() failed: %s\n"), strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -1981,13 +2051,13 @@ size_t I_GetFreeMem(size_t *total)
|
|||||||
*total = 32 << 20;
|
*total = 32 << 20;
|
||||||
return 32 << 20;
|
return 32 << 20;
|
||||||
#elif defined (_WIN32)
|
#elif defined (_WIN32)
|
||||||
MEMORYSTATUS info;
|
MEMORYSTATUSEX info;
|
||||||
|
|
||||||
info.dwLength = sizeof (MEMORYSTATUS);
|
info.dwLength = sizeof (MEMORYSTATUSEX);
|
||||||
GlobalMemoryStatus( &info );
|
GlobalMemoryStatusEx( &info );
|
||||||
if (total)
|
if (total)
|
||||||
*total = (size_t)info.dwTotalPhys;
|
*total = (size_t)info.ullTotalPhys;
|
||||||
return (size_t)info.dwAvailPhys;
|
return (size_t)info.ullAvailPhys;
|
||||||
#elif defined (__OS2__)
|
#elif defined (__OS2__)
|
||||||
UINT32 pr_arena;
|
UINT32 pr_arena;
|
||||||
|
|
||||||
@@ -2020,7 +2090,7 @@ size_t I_GetFreeMem(size_t *total)
|
|||||||
{
|
{
|
||||||
// Error
|
// Error
|
||||||
if (total)
|
if (total)
|
||||||
*total = 0L;
|
*total = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2029,12 +2099,12 @@ size_t I_GetFreeMem(size_t *total)
|
|||||||
{
|
{
|
||||||
// Error
|
// Error
|
||||||
if (total)
|
if (total)
|
||||||
*total = 0L;
|
*total = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
memTag += sizeof (MEMTOTAL);
|
memTag += sizeof (MEMTOTAL);
|
||||||
totalKBytes = (size_t)atoi(memTag);
|
totalKBytes = strtoul(memTag, NULL, 10);
|
||||||
|
|
||||||
if ((memTag = strstr(buf, MEMAVAILABLE)) == NULL)
|
if ((memTag = strstr(buf, MEMAVAILABLE)) == NULL)
|
||||||
{
|
{
|
||||||
@@ -2048,7 +2118,7 @@ size_t I_GetFreeMem(size_t *total)
|
|||||||
{
|
{
|
||||||
// Error
|
// Error
|
||||||
if (total)
|
if (total)
|
||||||
*total = 0L;
|
*total = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
freeKBytes = MemAvailable;
|
freeKBytes = MemAvailable;
|
||||||
@@ -2056,16 +2126,46 @@ size_t I_GetFreeMem(size_t *total)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
memTag += sizeof (MEMAVAILABLE);
|
memTag += sizeof (MEMAVAILABLE);
|
||||||
freeKBytes = atoi(memTag);
|
freeKBytes = strtoul(memTag, NULL, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (total)
|
if (total)
|
||||||
*total = totalKBytes << 10;
|
*total = totalKBytes << 10;
|
||||||
return freeKBytes << 10;
|
return freeKBytes << 10;
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
/* macOS */
|
||||||
|
mach_port_t host = mach_host_self();
|
||||||
|
kern_return_t kr;
|
||||||
|
mach_msg_type_number_t count;
|
||||||
|
vm_size_t v_page_size;
|
||||||
|
struct vm_statistics64 vm_stats;
|
||||||
|
uint64_t total_mem, free_mem;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
size = sizeof(total_mem);
|
||||||
|
if (sysctlbyname("hw.memsize", &total_mem, &size, NULL, 0) < 0)
|
||||||
|
total_mem = 0;
|
||||||
|
|
||||||
|
kr = host_page_size(host, &v_page_size);
|
||||||
|
if (kr != KERN_SUCCESS)
|
||||||
|
v_page_size = 4096;
|
||||||
|
|
||||||
|
count = HOST_VM_INFO64_COUNT;
|
||||||
|
kr = host_statistics64(host, HOST_VM_INFO64, (host_info64_t)&vm_stats, &count);
|
||||||
|
if (kr == KERN_SUCCESS)
|
||||||
|
free_mem = (uint64_t)(vm_stats.free_count + vm_stats.inactive_count) * v_page_size;
|
||||||
|
else
|
||||||
|
free_mem = 0;
|
||||||
|
|
||||||
|
if (total)
|
||||||
|
*total = (size_t)total_mem;
|
||||||
|
return (size_t)free_mem;
|
||||||
#else
|
#else
|
||||||
// Guess 48 MB.
|
// Guess 48 MB.
|
||||||
if (total)
|
if (total)
|
||||||
|
{
|
||||||
*total = 48<<20;
|
*total = 48<<20;
|
||||||
|
}
|
||||||
return 48<<20;
|
return 48<<20;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
+264
-320
File diff suppressed because it is too large.
Load diff
+5
-2
@@ -402,7 +402,7 @@ static void Discordrp_OnChange(void)
|
|||||||
static void DRPC_GotServerIP(UINT32 address)
|
static void DRPC_GotServerIP(UINT32 address)
|
||||||
{
|
{
|
||||||
const unsigned char * p = (const unsigned char *)&address;
|
const unsigned char * p = (const unsigned char *)&address;
|
||||||
sprintf(self_ip, "%u.%u.%u.%u:%u", p[0], p[1], p[2], p[3], current_port);
|
snprintf(self_ip, IP_SIZE+1, "%u.%u.%u.%u:%u", p[0], p[1], p[2], p[3], current_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------
|
/*--------------------------------------------------
|
||||||
@@ -474,6 +474,7 @@ void DRPC_UpdatePresence(void)
|
|||||||
char charname[11+SKINNAMESIZE+1];
|
char charname[11+SKINNAMESIZE+1];
|
||||||
|
|
||||||
boolean joinSecretSet = false;
|
boolean joinSecretSet = false;
|
||||||
|
char *clientJoinSecret = NULL;
|
||||||
|
|
||||||
DiscordRichPresence discordPresence;
|
DiscordRichPresence discordPresence;
|
||||||
memset(&discordPresence, 0, sizeof(discordPresence));
|
memset(&discordPresence, 0, sizeof(discordPresence));
|
||||||
@@ -530,7 +531,8 @@ void DRPC_UpdatePresence(void)
|
|||||||
// Grab the host's IP for joining.
|
// Grab the host's IP for joining.
|
||||||
if ((join = DRPC_GetServerIP()) != NULL)
|
if ((join = DRPC_GetServerIP()) != NULL)
|
||||||
{
|
{
|
||||||
discordPresence.joinSecret = DRPC_XORIPString(join);
|
clientJoinSecret = DRPC_XORIPString(join);
|
||||||
|
discordPresence.joinSecret = clientJoinSecret;
|
||||||
joinSecretSet = true;
|
joinSecretSet = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -712,6 +714,7 @@ void DRPC_UpdatePresence(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Discord_UpdatePresence(&discordPresence);
|
Discord_UpdatePresence(&discordPresence);
|
||||||
|
free(clientJoinSecret);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAVE_DISCORDRPC
|
#endif // HAVE_DISCORDRPC
|
||||||
+4
-2
@@ -61,7 +61,7 @@ enum
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
INT16 x, y;
|
INT16 x, y;
|
||||||
}ATTRPACK mapvertex_t;
|
} ATTRPACK mapvertex_t;
|
||||||
|
|
||||||
// A SideDef, defining the visual appearance of a wall,
|
// A SideDef, defining the visual appearance of a wall,
|
||||||
// by setting textures and offsets.
|
// by setting textures and offsets.
|
||||||
@@ -81,10 +81,12 @@ typedef struct
|
|||||||
INT16 flags;
|
INT16 flags;
|
||||||
INT16 special;
|
INT16 special;
|
||||||
INT16 tag;
|
INT16 tag;
|
||||||
// sidenum[1] will be 0xffff if one sided
|
// sidenum[1] will be NO_INDEX if one sided
|
||||||
UINT16 sidenum[2];
|
UINT16 sidenum[2];
|
||||||
} ATTRPACK maplinedef_t;
|
} ATTRPACK maplinedef_t;
|
||||||
|
|
||||||
|
#define NO_INDEX 0xffff
|
||||||
|
|
||||||
//
|
//
|
||||||
// LineDef attributes.
|
// LineDef attributes.
|
||||||
//
|
//
|
||||||
|
|||||||
+38
-2
@@ -128,10 +128,24 @@ extern char logfilename[1024];
|
|||||||
// most interface strings are ignored in development mode.
|
// most interface strings are ignored in development mode.
|
||||||
// we use comprevision and compbranch instead.
|
// we use comprevision and compbranch instead.
|
||||||
#else
|
#else
|
||||||
|
#ifdef PHOBOS_BUILD
|
||||||
|
#define VERSION 1 // Game version
|
||||||
|
#define SUBVERSION 69 // more precise version number
|
||||||
|
#else
|
||||||
#define VERSION 1 // Game version
|
#define VERSION 1 // Game version
|
||||||
#define SUBVERSION 6 // more precise version number
|
#define SUBVERSION 6 // more precise version number
|
||||||
#define VERSIONSTRING "Saturn v9.2"
|
#endif
|
||||||
#define VERSIONSTRINGW L"Saturn v9.2"
|
|
||||||
|
#ifdef PHOBOS_BUILD
|
||||||
|
#define CLIENTNAME "Phobos"
|
||||||
|
#define CLIENTNAMEW L"Phobos"
|
||||||
|
#else
|
||||||
|
#define CLIENTNAME "Saturn"
|
||||||
|
#define CLIENTNAMEW L"Saturn"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define VERSIONSTRING CLIENTNAME " v10.1"
|
||||||
|
#define VERSIONSTRINGW CLIENTNAMEW L" v10.1"
|
||||||
|
|
||||||
#define SATURN_TESTING // comment out for saturn release builds!
|
#define SATURN_TESTING // comment out for saturn release builds!
|
||||||
|
|
||||||
@@ -573,6 +587,13 @@ INT32 I_GetKey(void);
|
|||||||
// NOTE: you WILL have nasal troubles if the variable is not initialized
|
// NOTE: you WILL have nasal troubles if the variable is not initialized
|
||||||
#define CLEANUP(f) __attribute__((__cleanup__(f)))
|
#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.
|
// An assert-type mechanism.
|
||||||
#ifdef PARANOIA
|
#ifdef PARANOIA
|
||||||
#define I_Assert(e) ((e) ? (void)0 : I_Error("assert failed: %s, file %s, line %d", #e, __FILE__, __LINE__))
|
#define I_Assert(e) ((e) ? (void)0 : I_Error("assert failed: %s, file %s, line %d", #e, __FILE__, __LINE__))
|
||||||
@@ -595,6 +616,21 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
|||||||
// None of these that are disabled in the normal build are guaranteed to work perfectly
|
// None of these that are disabled in the normal build are guaranteed to work perfectly
|
||||||
// Compile them at your own risk!
|
// Compile them at your own risk!
|
||||||
|
|
||||||
|
#ifdef PHOBOS_BUILD
|
||||||
|
// we want 32 players yesss
|
||||||
|
#undef MAXPLAYERS
|
||||||
|
#define MAXPLAYERS 32
|
||||||
|
|
||||||
|
// raise skinlimit to 1024
|
||||||
|
#undef MAXSKINS
|
||||||
|
#define MAXSKINS 1024
|
||||||
|
|
||||||
|
// overwrite some of those
|
||||||
|
// when not compiling in vanilla compat mode
|
||||||
|
#define SATURNJOIN
|
||||||
|
#define SATURNPAK
|
||||||
|
#endif
|
||||||
|
|
||||||
//-- SATURN __
|
//-- SATURN __
|
||||||
/// Detect if a client is on Saturn in the clientconfig.
|
/// Detect if a client is on Saturn in the clientconfig.
|
||||||
/// To seperately allow them to join or block joining from vanilla clients.
|
/// To seperately allow them to join or block joining from vanilla clients.
|
||||||
|
|||||||
+1
-43
@@ -54,7 +54,6 @@ extern INT16 maptol;
|
|||||||
extern UINT8 globalweather;
|
extern UINT8 globalweather;
|
||||||
extern INT32 curWeather;
|
extern INT32 curWeather;
|
||||||
extern INT32 cursaveslot;
|
extern INT32 cursaveslot;
|
||||||
extern INT16 lastmapsaved;
|
|
||||||
extern boolean gamecomplete;
|
extern boolean gamecomplete;
|
||||||
|
|
||||||
#define PRECIP_NONE 0
|
#define PRECIP_NONE 0
|
||||||
@@ -78,7 +77,6 @@ extern boolean imcontinuing; // Temporary flag while continuing
|
|||||||
extern UINT8 modeattacking;
|
extern UINT8 modeattacking;
|
||||||
|
|
||||||
// menu demo things
|
// menu demo things
|
||||||
extern UINT8 numDemos;
|
|
||||||
extern UINT32 demoDelayTime;
|
extern UINT32 demoDelayTime;
|
||||||
extern UINT32 demoIdleTime;
|
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 UINT8 window_notinfocus; // are we in focus? (backend independant -- handles auto pausing and display of "focus lost" message)
|
||||||
|
|
||||||
extern boolean nodrawers;
|
extern boolean nodrawers;
|
||||||
extern boolean noblit;
|
|
||||||
extern boolean lastdraw;
|
extern boolean lastdraw;
|
||||||
|
extern boolean intermissionbginit;
|
||||||
|
|
||||||
#ifdef MOTIONBLUR
|
#ifdef MOTIONBLUR
|
||||||
extern INT32 postimgparam[MAXSPLITSCREENPLAYERS];
|
extern INT32 postimgparam[MAXSPLITSCREENPLAYERS];
|
||||||
@@ -205,12 +203,6 @@ extern struct quake
|
|||||||
fixed_t radius, intensity;
|
fixed_t radius, intensity;
|
||||||
} quake;
|
} 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
|
// Custom Lua values
|
||||||
// (This is not ifdeffed so the map header structure can stay identical, just in case.)
|
// (This is not ifdeffed so the map header structure can stay identical, just in case.)
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -261,28 +253,16 @@ typedef struct
|
|||||||
UINT8 numlaps; ///< Number of laps in circuit mode, unless overridden.
|
UINT8 numlaps; ///< Number of laps in circuit mode, unless overridden.
|
||||||
SINT8 unlockrequired; ///< Is an unlockable required to play this level? -1 if no.
|
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?
|
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 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
|
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
|
// SRB2kart
|
||||||
//boolean automap; ///< Displays a level's white map outline in modified games
|
|
||||||
fixed_t mobj_scale; ///< Replacement for TOL_ERZ3
|
fixed_t mobj_scale; ///< Replacement for TOL_ERZ3
|
||||||
|
|
||||||
mapheader_lighting_t lighting; ///< Wall and sprite lighting
|
mapheader_lighting_t lighting; ///< Wall and sprite lighting
|
||||||
mapheader_lighting_t lighting_encore; ///< Alternative lighting for Encore mode
|
mapheader_lighting_t lighting_encore; ///< Alternative lighting for Encore mode
|
||||||
boolean use_encore_lighting; ///< Whether to use separate Encore lighting
|
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.
|
// Lua stuff.
|
||||||
// (This is not ifdeffed so the map header structure can stay identical, just in case.)
|
// (This is not ifdeffed so the map header structure can stay identical, just in case.)
|
||||||
UINT8 numCustomOptions; ///< Internal. For Lua custom value support.
|
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 time; ///< Time in which the level was finished.
|
||||||
tic_t lap; ///< Best lap time for this level.
|
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;
|
} recorddata_t;
|
||||||
|
|
||||||
/** Setup for one NiGHTS map.
|
/** Setup for one NiGHTS map.
|
||||||
@@ -394,30 +372,15 @@ typedef struct
|
|||||||
#define GRADE_A 5
|
#define GRADE_A 5
|
||||||
#define GRADE_S 6
|
#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];
|
extern recorddata_t *mainrecords[NUMMAPS];
|
||||||
|
|
||||||
// mapvisited is now a set of flags that says what we've done in the map.
|
// mapvisited is now a set of flags that says what we've done in the map.
|
||||||
#define MV_VISITED 1
|
#define MV_VISITED 1
|
||||||
#define MV_BEATEN 2
|
#define MV_BEATEN 2
|
||||||
#define MV_ALLEMERALDS 4
|
#define MV_ALLEMERALDS 4
|
||||||
//#define MV_ULTIMATE 8
|
|
||||||
//#define MV_PERFECT 16
|
|
||||||
#define MV_MAX 7 // used in gamedata check
|
#define MV_MAX 7 // used in gamedata check
|
||||||
extern UINT8 mapvisited[NUMMAPS];
|
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 UINT32 tokenlist; ///< List of tokens collected
|
||||||
extern INT32 tokenbits; ///< Used for setting token bits
|
extern INT32 tokenbits; ///< Used for setting token bits
|
||||||
@@ -437,9 +400,6 @@ extern boolean CheckForReverseGravity;
|
|||||||
extern UINT16 invulntics;
|
extern UINT16 invulntics;
|
||||||
extern UINT16 sneakertics;
|
extern UINT16 sneakertics;
|
||||||
extern UINT16 flashingtics;
|
extern UINT16 flashingtics;
|
||||||
extern UINT16 tailsflytics;
|
|
||||||
extern UINT16 underwatertics;
|
|
||||||
extern UINT16 spacetimetics;
|
|
||||||
extern UINT16 extralifetics;
|
extern UINT16 extralifetics;
|
||||||
|
|
||||||
// SRB2kart
|
// SRB2kart
|
||||||
@@ -461,7 +421,6 @@ extern UINT8 introtoplay;
|
|||||||
extern UINT8 creditscutscene;
|
extern UINT8 creditscutscene;
|
||||||
|
|
||||||
extern UINT8 use1upSound;
|
extern UINT8 use1upSound;
|
||||||
extern UINT8 maxXtraLife; // Max extra lives from rings
|
|
||||||
|
|
||||||
extern mobj_t *hunt1, *hunt2, *hunt3; // Emerald hunt locations
|
extern mobj_t *hunt1, *hunt2, *hunt3; // Emerald hunt locations
|
||||||
|
|
||||||
@@ -526,7 +485,6 @@ extern UINT32 timesBeatenWithEmeralds;
|
|||||||
// WAD, partly set at startup time.
|
// WAD, partly set at startup time.
|
||||||
|
|
||||||
extern tic_t gametic;
|
extern tic_t gametic;
|
||||||
#define localgametic leveltime
|
|
||||||
|
|
||||||
// Player spawn spots.
|
// Player spawn spots.
|
||||||
extern mapthing_t *playerstarts[MAXPLAYERS]; // Cooperative
|
extern mapthing_t *playerstarts[MAXPLAYERS]; // Cooperative
|
||||||
|
|||||||
@@ -42,6 +42,12 @@ extern "C" {
|
|||||||
#define INT64 int64_t
|
#define INT64 int64_t
|
||||||
#define UINT64 uint64_t
|
#define UINT64 uint64_t
|
||||||
|
|
||||||
|
#ifdef PHOBOS_BUILD
|
||||||
|
typedef uint16_t skinnum_t;
|
||||||
|
#else
|
||||||
|
typedef uint8_t skinnum_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE_CC__
|
#ifdef __APPLE_CC__
|
||||||
#define DEBUG_LOG
|
#define DEBUG_LOG
|
||||||
#define NOIPX
|
#define NOIPX
|
||||||
|
|||||||
@@ -1110,14 +1110,6 @@ void F_TitleScreenTicker(boolean run)
|
|||||||
return;
|
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);
|
mapname = G_BuildMapName(G_RandMap(TOL_RACE, -2, false, 0, false, NULL)+1);
|
||||||
|
|
||||||
numstaff = 1;
|
numstaff = 1;
|
||||||
|
|||||||
+3
-5
@@ -111,7 +111,8 @@ static fademask_t *F_GetFadeMask(UINT8 masknum, UINT8 scrnnum)
|
|||||||
goto freemask;
|
goto freemask;
|
||||||
|
|
||||||
// SRB2Kart: This suddenly triggers ERRORMODE now
|
// SRB2Kart: This suddenly triggers ERRORMODE now
|
||||||
//sprintf(&lumpname[4], "%.2hu%.2hu", (UINT16)masknum, (UINT16)scrnnum);
|
//snprintf(&lumpname[4], 3, "%.2hu%.2hu", (UINT16)masknum, (UINT16)scrnnum);
|
||||||
|
//lumpname[8] = 0;
|
||||||
|
|
||||||
lumpname[4] = '0'+(masknum/10);
|
lumpname[4] = '0'+(masknum/10);
|
||||||
lumpname[5] = '0'+(masknum%10);
|
lumpname[5] = '0'+(masknum%10);
|
||||||
@@ -361,10 +362,7 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
|
|||||||
// on for fade-to-black
|
// on for fade-to-black
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (I_Interrupted())
|
I_HandleInterrupt();
|
||||||
{
|
|
||||||
I_Quit();
|
|
||||||
}
|
|
||||||
|
|
||||||
// get fademask first so we can tell if it exists or not
|
// get fademask first so we can tell if it exists or not
|
||||||
fmask = F_GetFadeMask(wipetype, wipeframe++);
|
fmask = F_GetFadeMask(wipetype, wipeframe++);
|
||||||
|
|||||||
+3
-1
@@ -111,10 +111,12 @@ filestatus_t filesearch(char *filename, const char *startpath, const UINT8 *want
|
|||||||
char *searchname;
|
char *searchname;
|
||||||
int depthleft = maxsearchdepth;
|
int depthleft = maxsearchdepth;
|
||||||
char searchpath[MAXFILEPATH];
|
char searchpath[MAXFILEPATH];
|
||||||
size_t *searchpathindex;
|
size_t *searchpathindex = NULL;
|
||||||
|
|
||||||
dirhandle = (DIR**)malloc(maxsearchdepth * sizeof(DIR*));
|
dirhandle = (DIR**)malloc(maxsearchdepth * sizeof(DIR*));
|
||||||
searchpathindex = (size_t *)malloc(maxsearchdepth * sizeof(size_t));
|
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);
|
strcpy(searchpath, startpath);
|
||||||
searchpathindex[--depthleft] = strlen(searchpath) + 1;
|
searchpathindex[--depthleft] = strlen(searchpath) + 1;
|
||||||
|
|||||||
+139
-169
@@ -63,15 +63,12 @@
|
|||||||
|
|
||||||
// for replay dates
|
// for replay dates
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <locale.h>
|
|
||||||
|
|
||||||
// menu demo things
|
// 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 demoDelayTime = 15*TICRATE;
|
||||||
UINT32 demoIdleTime = 3*TICRATE;
|
UINT32 demoIdleTime = 3*TICRATE;
|
||||||
|
|
||||||
boolean nodrawers = false; // for comparative timing purposes
|
boolean nodrawers = false; // for comparative timing purposes
|
||||||
boolean noblit = false; // for comparative timing purposes
|
|
||||||
static tic_t demostarttime; // for comparative timing purposes
|
static tic_t demostarttime; // for comparative timing purposes
|
||||||
|
|
||||||
//@TODO put these all in a struct for namespacing purposes?
|
//@TODO put these all in a struct for namespacing purposes?
|
||||||
@@ -449,7 +446,8 @@ void G_WriteDemoExtraData(void)
|
|||||||
{
|
{
|
||||||
static UINT8 timeout = 0;
|
static UINT8 timeout = 0;
|
||||||
|
|
||||||
if (timeout) timeout--;
|
if (timeout)
|
||||||
|
timeout--;
|
||||||
|
|
||||||
if (demo_writerng == 1 || (demo_writerng == 2 && timeout == 0))
|
if (demo_writerng == 1 || (demo_writerng == 2 && timeout == 0))
|
||||||
{
|
{
|
||||||
@@ -469,6 +467,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
|||||||
|
|
||||||
if (!demobuf.p || !demo.deferstart)
|
if (!demobuf.p || !demo.deferstart)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ziptic = READUINT8(demobuf.p);
|
ziptic = READUINT8(demobuf.p);
|
||||||
|
|
||||||
if (ziptic & ZT_FWD)
|
if (ziptic & ZT_FWD)
|
||||||
@@ -490,11 +489,12 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
|||||||
|
|
||||||
// what in the actual fuck is this???
|
// what in the actual fuck is this???
|
||||||
// SRB2kart: Copy-pasted from ticcmd building, removes that crappy demo cam
|
// 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
|
|| (leveltime > starttime && (cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE)) // Rubber-burn turn
|
||||||
|| (players[displayplayers[0]].kartstuff[k_respawn]) // Respawning
|
|| (player->kartstuff[k_respawn]) // Respawning
|
||||||
|| (players[displayplayers[0]].spectator || objectplacing)) // Not a physical player
|
|| (player->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_spinouttimer] && player->kartstuff[k_sneakertimer])) // Spinning and boosting cancels out spinout
|
||||||
localangle[0] += (cmd->angleturn<<16);
|
localangle[0] += (cmd->angleturn<<16);
|
||||||
|
|
||||||
if (!(demoflags & DF_GHOST) && *demobuf.p == DEMOMARKER)
|
if (!(demoflags & DF_GHOST) && *demobuf.p == DEMOMARKER)
|
||||||
@@ -517,49 +517,49 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
|||||||
|
|
||||||
if (cmd->forwardmove != oldcmd[playernum].forwardmove)
|
if (cmd->forwardmove != oldcmd[playernum].forwardmove)
|
||||||
{
|
{
|
||||||
WRITEUINT8(demobuf.p,cmd->forwardmove);
|
WRITEUINT8(demobuf.p, cmd->forwardmove);
|
||||||
oldcmd[playernum].forwardmove = cmd->forwardmove;
|
oldcmd[playernum].forwardmove = cmd->forwardmove;
|
||||||
ziptic |= ZT_FWD;
|
ziptic |= ZT_FWD;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->sidemove != oldcmd[playernum].sidemove)
|
if (cmd->sidemove != oldcmd[playernum].sidemove)
|
||||||
{
|
{
|
||||||
WRITEUINT8(demobuf.p,cmd->sidemove);
|
WRITEUINT8(demobuf.p, cmd->sidemove);
|
||||||
oldcmd[playernum].sidemove = cmd->sidemove;
|
oldcmd[playernum].sidemove = cmd->sidemove;
|
||||||
ziptic |= ZT_SIDE;
|
ziptic |= ZT_SIDE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->angleturn != oldcmd[playernum].angleturn)
|
if (cmd->angleturn != oldcmd[playernum].angleturn)
|
||||||
{
|
{
|
||||||
WRITEINT16(demobuf.p,cmd->angleturn);
|
WRITEINT16(demobuf.p, cmd->angleturn);
|
||||||
oldcmd[playernum].angleturn = cmd->angleturn;
|
oldcmd[playernum].angleturn = cmd->angleturn;
|
||||||
ziptic |= ZT_ANGLE;
|
ziptic |= ZT_ANGLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->buttons != oldcmd[playernum].buttons)
|
if (cmd->buttons != oldcmd[playernum].buttons)
|
||||||
{
|
{
|
||||||
WRITEUINT16(demobuf.p,cmd->buttons);
|
WRITEUINT16(demobuf.p, cmd->buttons);
|
||||||
oldcmd[playernum].buttons = cmd->buttons;
|
oldcmd[playernum].buttons = cmd->buttons;
|
||||||
ziptic |= ZT_BUTTONS;
|
ziptic |= ZT_BUTTONS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->aiming != oldcmd[playernum].aiming)
|
if (cmd->aiming != oldcmd[playernum].aiming)
|
||||||
{
|
{
|
||||||
WRITEINT16(demobuf.p,cmd->aiming);
|
WRITEINT16(demobuf.p, cmd->aiming);
|
||||||
oldcmd[playernum].aiming = cmd->aiming;
|
oldcmd[playernum].aiming = cmd->aiming;
|
||||||
ziptic |= ZT_AIMING;
|
ziptic |= ZT_AIMING;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->driftturn != oldcmd[playernum].driftturn)
|
if (cmd->driftturn != oldcmd[playernum].driftturn)
|
||||||
{
|
{
|
||||||
WRITEINT16(demobuf.p,cmd->driftturn);
|
WRITEINT16(demobuf.p, cmd->driftturn);
|
||||||
oldcmd[playernum].driftturn = cmd->driftturn;
|
oldcmd[playernum].driftturn = cmd->driftturn;
|
||||||
ziptic |= ZT_DRIFT;
|
ziptic |= ZT_DRIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->latency != oldcmd[playernum].latency)
|
if (cmd->latency != oldcmd[playernum].latency)
|
||||||
{
|
{
|
||||||
WRITEUINT8(demobuf.p,cmd->latency);
|
WRITEUINT8(demobuf.p, cmd->latency);
|
||||||
oldcmd[playernum].latency = cmd->latency;
|
oldcmd[playernum].latency = cmd->latency;
|
||||||
ziptic |= ZT_LATENCY;
|
ziptic |= ZT_LATENCY;
|
||||||
}
|
}
|
||||||
@@ -715,7 +715,7 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum)
|
|||||||
if (!(demoflags & DF_GHOST))
|
if (!(demoflags & DF_GHOST))
|
||||||
return; // No ghost data to write.
|
return; // No ghost data to write.
|
||||||
|
|
||||||
if (ghost->player && ghost->player->pflags & PF_NIGHTSMODE && ghost->tracer)
|
if (ghost->player && nightsplayer(ghost->player) && ghost->tracer)
|
||||||
{
|
{
|
||||||
// We're talking about the NiGHTS thing, not the normal platforming thing!
|
// We're talking about the NiGHTS thing, not the normal platforming thing!
|
||||||
ziptic |= GZT_NIGHTS;
|
ziptic |= GZT_NIGHTS;
|
||||||
@@ -933,7 +933,7 @@ void G_ConsAllGhostTics(void)
|
|||||||
void G_ConsGhostTic(INT32 playernum)
|
void G_ConsGhostTic(INT32 playernum)
|
||||||
{
|
{
|
||||||
UINT8 ziptic;
|
UINT8 ziptic;
|
||||||
fixed_t px,py,pz,gx,gy,gz;
|
fixed_t px, py, pz, gx, gy, gz;
|
||||||
mobj_t *testmo;
|
mobj_t *testmo;
|
||||||
fixed_t syncleeway;
|
fixed_t syncleeway;
|
||||||
boolean nightsfail = false;
|
boolean nightsfail = false;
|
||||||
@@ -978,7 +978,7 @@ void G_ConsGhostTic(INT32 playernum)
|
|||||||
|
|
||||||
if (ziptic & GZT_NIGHTS)
|
if (ziptic & GZT_NIGHTS)
|
||||||
{
|
{
|
||||||
if (!testmo || !testmo->player || !(testmo->player->pflags & PF_NIGHTSMODE) || !testmo->tracer)
|
if (!testmo || !testmo->player || !nightsplayer(testmo->player) || !testmo->tracer)
|
||||||
nightsfail = true;
|
nightsfail = true;
|
||||||
else
|
else
|
||||||
testmo = testmo->tracer;
|
testmo = testmo->tracer;
|
||||||
@@ -1346,7 +1346,7 @@ fadeghost:
|
|||||||
}
|
}
|
||||||
else
|
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->sprite = states[mobjinfo[type].spawnstate].sprite;
|
||||||
mobj->frame = (states[mobjinfo[type].spawnstate].frame & FF_FRAMEMASK) | tr_trans60<<FF_TRANSSHIFT;
|
mobj->frame = (states[mobjinfo[type].spawnstate].frame & FF_FRAMEMASK) | tr_trans60<<FF_TRANSSHIFT;
|
||||||
mobj->tics = -1; // nope.
|
mobj->tics = -1; // nope.
|
||||||
@@ -1377,7 +1377,7 @@ fadeghost:
|
|||||||
UINT16 i, health;
|
UINT16 i, health;
|
||||||
UINT16 count = READUINT16(g->p);
|
UINT16 count = READUINT16(g->p);
|
||||||
//UINT32 type;
|
//UINT32 type;
|
||||||
fixed_t x,y,z;
|
fixed_t x, y, z;
|
||||||
angle_t angle;
|
angle_t angle;
|
||||||
mobj_t *poof;
|
mobj_t *poof;
|
||||||
|
|
||||||
@@ -1520,7 +1520,9 @@ void G_PreviewRewind(tic_t previewtime)
|
|||||||
|
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
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)
|
if (info->playerinfo[i].player.mo)
|
||||||
{
|
{
|
||||||
@@ -1532,35 +1534,35 @@ void G_PreviewRewind(tic_t previewtime)
|
|||||||
|
|
||||||
if (!info->playerinfo[i].ingame || !info->playerinfo[i].player.mo)
|
if (!info->playerinfo[i].ingame || !info->playerinfo[i].player.mo)
|
||||||
{
|
{
|
||||||
if (players[i].mo)
|
if (player->mo)
|
||||||
players[i].mo->flags2 |= MF2_DONTDRAW;
|
player->mo->flags2 |= MF2_DONTDRAW;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!players[i].mo)
|
if (!player->mo)
|
||||||
continue; //@TODO spawn temp object to act as a player display
|
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)
|
#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);
|
player->mo->x = TWEEN(x);
|
||||||
players[i].mo->y = TWEEN(y);
|
player->mo->y = TWEEN(y);
|
||||||
players[i].mo->z = TWEEN(z);
|
player->mo->z = TWEEN(z);
|
||||||
players[i].mo->angle = TWEEN(angle);
|
player->mo->angle = TWEEN(angle);
|
||||||
#undef TWEEN
|
#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;
|
player->mo->sprite = info->playerinfo[i].mobj.sprite;
|
||||||
players[i].mo->frame = info->playerinfo[i].mobj.frame;
|
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++)
|
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--)
|
for (i = splitscreen; i >= 0; i--)
|
||||||
@@ -1653,10 +1655,12 @@ void G_RecordDemo(const char *name)
|
|||||||
maxsize = cv_maxdemosize.value*1024*1024;
|
maxsize = cv_maxdemosize.value*1024*1024;
|
||||||
|
|
||||||
demobuf.buffer = Z_Malloc(maxsize + 100*1024, PU_STATIC, NULL);
|
demobuf.buffer = Z_Malloc(maxsize + 100*1024, PU_STATIC, NULL);
|
||||||
demoend = demobuf.buffer + maxsize;
|
|
||||||
|
|
||||||
if (demobuf.buffer)
|
if (demobuf.buffer)
|
||||||
|
{
|
||||||
|
demoend = demobuf.buffer + maxsize;
|
||||||
demo.recording = true;
|
demo.recording = true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n");
|
CONS_Alert(CONS_ERROR, "Failed to allocate demo buffer\n");
|
||||||
}
|
}
|
||||||
@@ -1691,7 +1695,7 @@ void G_BeginRecording(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(name,0,sizeof(name));
|
memset(name, 0, sizeof(name));
|
||||||
|
|
||||||
demobuf.p = demobuf.buffer;
|
demobuf.p = demobuf.buffer;
|
||||||
demoflags = DF_GHOST|(multiplayer ? DF_MULTIPLAYER : (modeattacking<<DF_ATTACKSHIFT));
|
demoflags = DF_GHOST|(multiplayer ? DF_MULTIPLAYER : (modeattacking<<DF_ATTACKSHIFT));
|
||||||
@@ -1705,9 +1709,9 @@ void G_BeginRecording(void)
|
|||||||
|
|
||||||
// Setup header.
|
// Setup header.
|
||||||
memcpy(demobuf.p, DEMOHEADER, 12); demobuf.p += 12;
|
memcpy(demobuf.p, DEMOHEADER, 12); demobuf.p += 12;
|
||||||
WRITEUINT8(demobuf.p,VERSION);
|
WRITEUINT8(demobuf.p, VERSION);
|
||||||
WRITEUINT8(demobuf.p,SUBVERSION);
|
WRITEUINT8(demobuf.p, SUBVERSION);
|
||||||
WRITEUINT16(demobuf.p,DEMOVERSION);
|
WRITEUINT16(demobuf.p, DEMOVERSION);
|
||||||
|
|
||||||
// Full replay title
|
// Full replay title
|
||||||
demobuf.p += 64;
|
demobuf.p += 64;
|
||||||
@@ -1718,11 +1722,11 @@ void G_BeginRecording(void)
|
|||||||
// Print to a separate temp buffer instead of demo.titlename, so we can use it in M_TextInputSetString
|
// Print to a separate temp buffer instead of demo.titlename, so we can use it in M_TextInputSetString
|
||||||
if (title)
|
if (title)
|
||||||
{
|
{
|
||||||
snprintf(demotitlename, 64, "%s - %s", title, modeattacking ? "Time Attack" : connectedservername);
|
snprintf(demotitlename, sizeof(demotitlename)-1, "%s - %s", title, modeattacking ? "Time Attack" : connectedservername);
|
||||||
Z_Free(title);
|
Z_Free(title);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
snprintf(demotitlename, 64, "%s", modeattacking ? "Time Attack" : connectedservername);
|
snprintf(demotitlename, sizeof(demotitlename)-1, "%s", modeattacking ? "Time Attack" : connectedservername);
|
||||||
|
|
||||||
// Init just in case it isn't initialized already
|
// Init just in case it isn't initialized already
|
||||||
M_TextInputInit(&demo.titlenameinput, demo.titlename, sizeof(demo.titlename));
|
M_TextInputInit(&demo.titlenameinput, demo.titlename, sizeof(demo.titlename));
|
||||||
@@ -1736,7 +1740,7 @@ void G_BeginRecording(void)
|
|||||||
|
|
||||||
// game data
|
// game data
|
||||||
memcpy(demobuf.p, "PLAY", 4); demobuf.p += 4;
|
memcpy(demobuf.p, "PLAY", 4); demobuf.p += 4;
|
||||||
WRITEINT16(demobuf.p,gamemap);
|
WRITEINT16(demobuf.p, gamemap);
|
||||||
memcpy(demobuf.p, mapmd5, 16); demobuf.p += 16;
|
memcpy(demobuf.p, mapmd5, 16); demobuf.p += 16;
|
||||||
|
|
||||||
WRITEUINT8(demobuf.p, demoflags);
|
WRITEUINT8(demobuf.p, demoflags);
|
||||||
@@ -1768,8 +1772,8 @@ void G_BeginRecording(void)
|
|||||||
break;
|
break;
|
||||||
case ATTACKING_RECORD: // 1
|
case ATTACKING_RECORD: // 1
|
||||||
demotime_p = demobuf.p;
|
demotime_p = demobuf.p;
|
||||||
WRITEUINT32(demobuf.p,UINT32_MAX); // time
|
WRITEUINT32(demobuf.p, UINT32_MAX); // time
|
||||||
WRITEUINT32(demobuf.p,UINT32_MAX); // lap
|
WRITEUINT32(demobuf.p, UINT32_MAX); // lap
|
||||||
break;
|
break;
|
||||||
default: // 3
|
default: // 3
|
||||||
break;
|
break;
|
||||||
@@ -1826,9 +1830,9 @@ void G_BeginRecording(void)
|
|||||||
if (demoflags & DF_LUAVARS)
|
if (demoflags & DF_LUAVARS)
|
||||||
LUA_Archive(&demobuf, false);
|
LUA_Archive(&demobuf, false);
|
||||||
|
|
||||||
memset(&oldcmd,0,sizeof(oldcmd));
|
memset(&oldcmd, 0, sizeof(oldcmd));
|
||||||
memset(&oldghost,0,sizeof(oldghost));
|
memset(&oldghost, 0, sizeof(oldghost));
|
||||||
memset(&ghostext,0,sizeof(ghostext));
|
memset(&ghostext, 0, sizeof(ghostext));
|
||||||
|
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
{
|
{
|
||||||
@@ -1868,19 +1872,19 @@ void G_WriteStanding(UINT8 ranking, char *name, INT32 skinnum, UINT8 color, UINT
|
|||||||
// Name
|
// Name
|
||||||
memset(temp, 0, 16);
|
memset(temp, 0, 16);
|
||||||
strncpy(temp, name, 16);
|
strncpy(temp, name, 16);
|
||||||
memcpy(demobuf.p,temp,16);
|
memcpy(demobuf.p, temp, 16);
|
||||||
demobuf.p += 16;
|
demobuf.p += 16;
|
||||||
|
|
||||||
// Skin
|
// Skin
|
||||||
memset(temp, 0, 16);
|
memset(temp, 0, 16);
|
||||||
strncpy(temp, skins[skinnum].name, 16);
|
strncpy(temp, skins[skinnum].name, 16);
|
||||||
memcpy(demobuf.p,temp,16);
|
memcpy(demobuf.p, temp, 16);
|
||||||
demobuf.p += 16;
|
demobuf.p += 16;
|
||||||
|
|
||||||
// Color
|
// Color
|
||||||
memset(temp, 0, 16);
|
memset(temp, 0, 16);
|
||||||
strncpy(temp, KartColor_Names[color], 16);
|
strncpy(temp, KartColor_Names[color], 16);
|
||||||
memcpy(demobuf.p,temp,16);
|
memcpy(demobuf.p, temp, 16);
|
||||||
demobuf.p += 16;
|
demobuf.p += 16;
|
||||||
|
|
||||||
// Score/time/whatever
|
// Score/time/whatever
|
||||||
@@ -1994,7 +1998,6 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick)
|
|||||||
UINT8 totalfiles, filesloaded, nmusfilecount;
|
UINT8 totalfiles, filesloaded, nmusfilecount;
|
||||||
char filename[MAX_WADPATH];
|
char filename[MAX_WADPATH];
|
||||||
UINT8 md5sum[16];
|
UINT8 md5sum[16];
|
||||||
boolean toomany = false;
|
|
||||||
boolean alreadyloaded;
|
boolean alreadyloaded;
|
||||||
UINT8 i, j;
|
UINT8 i, j;
|
||||||
UINT8 error = 0;
|
UINT8 error = 0;
|
||||||
@@ -2003,19 +2006,12 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick)
|
|||||||
filesloaded = 0;
|
filesloaded = 0;
|
||||||
|
|
||||||
for (i = 0; i < totalfiles; ++i)
|
for (i = 0; i < totalfiles; ++i)
|
||||||
{
|
|
||||||
if (toomany)
|
|
||||||
SKIPSTRING((*pp));
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
strlcpy(filename, (char *)(*pp), sizeof filename);
|
strlcpy(filename, (char *)(*pp), sizeof filename);
|
||||||
SKIPSTRING((*pp));
|
SKIPSTRING((*pp));
|
||||||
}
|
|
||||||
|
|
||||||
READMEM((*pp), md5sum, 16); // hue hue peepee
|
READMEM((*pp), md5sum, 16); // hue hue peepee
|
||||||
|
|
||||||
if (!toomany)
|
|
||||||
{
|
|
||||||
alreadyloaded = false;
|
alreadyloaded = false;
|
||||||
nmusfilecount = 0;
|
nmusfilecount = 0;
|
||||||
|
|
||||||
@@ -2049,8 +2045,6 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick)
|
|||||||
error = DFILE_ERROR_CANNOTLOAD;
|
error = DFILE_ERROR_CANNOTLOAD;
|
||||||
else if (error < DFILE_ERROR_INCOMPLETEOUTOFORDER)
|
else if (error < DFILE_ERROR_INCOMPLETEOUTOFORDER)
|
||||||
error |= DFILE_ERROR_NOTLOADED;
|
error |= DFILE_ERROR_NOTLOADED;
|
||||||
} else
|
|
||||||
error = DFILE_ERROR_CANNOTLOAD;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get final file count
|
// Get final file count
|
||||||
@@ -2217,7 +2211,7 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
|
|||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("Failed to read file '%s'.\n"), pdemo->filepath);
|
CONS_Alert(CONS_ERROR, M_GetText("Failed to read file '%s'.\n"), pdemo->filepath);
|
||||||
pdemo->type = MD_INVALID;
|
pdemo->type = MD_INVALID;
|
||||||
sprintf(pdemo->title, "INVALID REPLAY");
|
snprintf(pdemo->title, sizeof(pdemo->title), "INVALID REPLAY");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2227,7 +2221,7 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
|
|||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("%s is not a SRB2Kart replay file.\n"), pdemo->filepath);
|
CONS_Alert(CONS_ERROR, M_GetText("%s is not a SRB2Kart replay file.\n"), pdemo->filepath);
|
||||||
pdemo->type = MD_INVALID;
|
pdemo->type = MD_INVALID;
|
||||||
sprintf(pdemo->title, "INVALID REPLAY");
|
snprintf(pdemo->title, sizeof(pdemo->title), "INVALID REPLAY");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2252,14 +2246,14 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
|
|||||||
#ifdef DEMO_COMPAT_100
|
#ifdef DEMO_COMPAT_100
|
||||||
case 0x0001:
|
case 0x0001:
|
||||||
pdemo->type = MD_OUTDATED;
|
pdemo->type = MD_OUTDATED;
|
||||||
sprintf(pdemo->title, "Legacy Replay");
|
snprintf(pdemo->title, sizeof(pdemo->title), "Legacy Replay");
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
// too old, cannot support.
|
// too old, cannot support.
|
||||||
default:
|
default:
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("%s is an incompatible replay format and cannot be played.\n"), pdemo->filepath);
|
CONS_Alert(CONS_ERROR, M_GetText("%s is an incompatible replay format and cannot be played.\n"), pdemo->filepath);
|
||||||
pdemo->type = MD_INVALID;
|
pdemo->type = MD_INVALID;
|
||||||
sprintf(pdemo->title, "INVALID REPLAY");
|
snprintf(pdemo->title, sizeof(pdemo->title), "INVALID REPLAY");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2272,7 +2266,7 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
|
|||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("%s is the wrong type of recording and cannot be played.\n"), pdemo->filepath);
|
CONS_Alert(CONS_ERROR, M_GetText("%s is the wrong type of recording and cannot be played.\n"), pdemo->filepath);
|
||||||
pdemo->type = MD_INVALID;
|
pdemo->type = MD_INVALID;
|
||||||
sprintf(pdemo->title, "INVALID REPLAY");
|
snprintf(pdemo->title, sizeof(pdemo->title), "INVALID REPLAY");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2293,7 +2287,7 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
|
|||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("%s is a legacy multiplayer replay and cannot be played.\n"), pdemo->filepath);
|
CONS_Alert(CONS_ERROR, M_GetText("%s is a legacy multiplayer replay and cannot be played.\n"), pdemo->filepath);
|
||||||
pdemo->type = MD_INVALID;
|
pdemo->type = MD_INVALID;
|
||||||
sprintf(pdemo->title, "INVALID REPLAY");
|
snprintf(pdemo->title, sizeof(pdemo->title), "INVALID REPLAY");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -2340,7 +2334,7 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
|
|||||||
while (READUINT8(extrainfo_p) == DW_STANDING) // Assume standings are always first in the extrainfo
|
while (READUINT8(extrainfo_p) == DW_STANDING) // Assume standings are always first in the extrainfo
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
char temp[16];
|
char temp[17];
|
||||||
|
|
||||||
pdemo->standings[count].ranking = READUINT8(extrainfo_p);
|
pdemo->standings[count].ranking = READUINT8(extrainfo_p);
|
||||||
|
|
||||||
@@ -2349,7 +2343,8 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
|
|||||||
extrainfo_p += 16;
|
extrainfo_p += 16;
|
||||||
|
|
||||||
// Skin
|
// Skin
|
||||||
memcpy(temp,extrainfo_p,16);
|
memcpy(temp, extrainfo_p, 16);
|
||||||
|
temp[16] = '\0';
|
||||||
extrainfo_p += 16;
|
extrainfo_p += 16;
|
||||||
pdemo->standings[count].skin = UINT8_MAX;
|
pdemo->standings[count].skin = UINT8_MAX;
|
||||||
|
|
||||||
@@ -2363,12 +2358,13 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Color
|
// Color
|
||||||
memcpy(temp,extrainfo_p,16);
|
memcpy(temp, extrainfo_p, 16);
|
||||||
|
temp[16] = '\0';
|
||||||
extrainfo_p += 16;
|
extrainfo_p += 16;
|
||||||
|
|
||||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
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;
|
pdemo->standings[count].color = i;
|
||||||
break;
|
break;
|
||||||
@@ -2390,7 +2386,9 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
|
|||||||
#if defined (_WIN32)
|
#if defined (_WIN32)
|
||||||
// return the file creation time
|
// return the file creation time
|
||||||
// useful for demos that were renamed
|
// useful for demos that were renamed
|
||||||
static long G_GetCreationTime(char *filepath)
|
// windows only, as file creation times are
|
||||||
|
// very unreliable (or non existant depending on fs) on linux
|
||||||
|
static time_t G_GetCreationTime(char *filepath)
|
||||||
{
|
{
|
||||||
struct stat fileinfo;
|
struct stat fileinfo;
|
||||||
|
|
||||||
@@ -2401,35 +2399,24 @@ static long G_GetCreationTime(char *filepath)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static char *G_GetDemoDate(menudemo_t *pdemo)
|
static char *G_GetDemoDate(menudemo_t *pdemo, const char *dateformat)
|
||||||
{
|
{
|
||||||
char *endPos = NULL;
|
char *endPos = NULL;
|
||||||
static char datetime[11];
|
char *datetime;
|
||||||
time_t file_time = 0;
|
time_t file_time = 0;
|
||||||
const char *format = NULL;
|
struct tm tm_buf;
|
||||||
struct tm *tm_buf = NULL;
|
|
||||||
CLEANUP(pfree) char *filename = NULL;
|
CLEANUP(pfree) char *filename = NULL;
|
||||||
|
|
||||||
// get le filepath
|
// get le filepath
|
||||||
filename = strdup(pdemo->filepath);
|
filename = strdup(pdemo->filepath);
|
||||||
|
|
||||||
if (!filename)
|
if (!filename)
|
||||||
{
|
|
||||||
#if defined (_WIN32)
|
|
||||||
// if we cant get a filename try just getting the file creation time
|
|
||||||
file_time = G_GetCreationTime(pdemo->filepath);
|
|
||||||
goto skipfilenametime;
|
|
||||||
#else
|
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the actual filename Zzz...
|
// get the actual filename Zzz...
|
||||||
nameonly(filename);
|
nameonly(filename);
|
||||||
|
|
||||||
// the first 10 characters of a replay name usually is a unix timestamp
|
// the first 10 characters of a replay name is a unix timestamp
|
||||||
|
|
||||||
// not long enough to contain a valid timestamp
|
|
||||||
if (strlen(filename) < 10)
|
if (strlen(filename) < 10)
|
||||||
{
|
{
|
||||||
#if defined (_WIN32)
|
#if defined (_WIN32)
|
||||||
@@ -2461,73 +2448,55 @@ static char *G_GetDemoDate(menudemo_t *pdemo)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (_WIN32)
|
|
||||||
skipfilenametime:
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// then throw it into localtime to get an actual human readable format lmao
|
// then throw it into localtime to get an actual human readable format lmao
|
||||||
tm_buf = localtime(&file_time);
|
#if defined(_WIN32)
|
||||||
|
skipfilenametime:
|
||||||
// cant believe we ended up in 1970
|
if ((localtime_s(&tm_buf, &file_time) != 0) ||
|
||||||
if (tm_buf == NULL || tm_buf->tm_year <= 110)
|
(tm_buf.tm_year <= 110)) // cant believe we ended up in 1970
|
||||||
{
|
{
|
||||||
#if defined (_WIN32)
|
|
||||||
// uh ohh, we got an invalid time
|
// uh ohh, we got an invalid time
|
||||||
// try one more time getting the creation time
|
// try one more time getting the creation time
|
||||||
file_time = G_GetCreationTime(pdemo->filepath);
|
file_time = G_GetCreationTime(pdemo->filepath);
|
||||||
tm_buf = localtime(&file_time);
|
|
||||||
|
|
||||||
if (tm_buf == NULL || tm_buf->tm_year <= 110)
|
if ((localtime_s(&tm_buf, &file_time) != 0) ||
|
||||||
|
(tm_buf.tm_year <= 110))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
goto gotcreationtime;
|
|
||||||
#else
|
#else
|
||||||
|
if ((localtime_r(&file_time, &tm_buf) == NULL) ||
|
||||||
|
(tm_buf.tm_year <= 110)) // cant believe we ended up in 1970
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
#if defined (_WIN32)
|
datetime = malloc(sizeof(pdemo->date)); // mallocma balls
|
||||||
gotcreationtime:
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// US ppl are special (:
|
// no mallocma balls... :c
|
||||||
if (cv_demodateformat.value == 2)
|
if (!datetime)
|
||||||
format = "%m.%d.%Y";
|
return NULL;
|
||||||
else if (cv_demodateformat.value == 1)
|
|
||||||
format = "%d.%m.%Y";
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const char *locale = setlocale(LC_TIME, NULL);
|
|
||||||
|
|
||||||
if (locale == NULL)
|
if (strftime(datetime, sizeof(pdemo->date), dateformat, &tm_buf) == 0)
|
||||||
format = "%d.%m.%Y"; // fallback to non US format
|
|
||||||
else if (strstr(locale, "en_US"))
|
|
||||||
format = "%m.%d.%Y";
|
|
||||||
else
|
|
||||||
format = "%d.%m.%Y";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strftime(datetime, sizeof(datetime), format, tm_buf) == 0)
|
|
||||||
{
|
{
|
||||||
|
free(datetime);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return datetime;
|
return datetime;
|
||||||
}
|
}
|
||||||
|
|
||||||
void G_LoadDemoTitle(menudemo_t *pdemo)
|
void G_LoadDemoTitle(menudemo_t *pdemo, const char *dateformat)
|
||||||
{
|
{
|
||||||
UINT8 infobuffer[96], *info_p;
|
UINT8 infobuffer[96], *info_p;
|
||||||
UINT16 pdemoversion;
|
UINT16 pdemoversion;
|
||||||
char *demodate = NULL;
|
|
||||||
size_t count;
|
size_t count;
|
||||||
|
|
||||||
|
memset(pdemo->date, 0, sizeof(pdemo->date));
|
||||||
|
|
||||||
FILE *handle = fopen(pdemo->filepath, "rb");
|
FILE *handle = fopen(pdemo->filepath, "rb");
|
||||||
|
|
||||||
if (!handle)
|
if (!handle)
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("Failed to read file '%s'.\n"), pdemo->filepath);
|
CONS_Alert(CONS_ERROR, M_GetText("Failed to read file '%s'.\n"), pdemo->filepath);
|
||||||
sprintf(pdemo->title, "INVALID REPLAY");
|
snprintf(pdemo->title, sizeof(pdemo->title), "INVALID REPLAY");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2539,7 +2508,7 @@ void G_LoadDemoTitle(menudemo_t *pdemo)
|
|||||||
if (count < 96 || memcmp(info_p, DEMOHEADER, 12))
|
if (count < 96 || memcmp(info_p, DEMOHEADER, 12))
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("%s is not a SRB2Kart replay file.\n"), pdemo->filepath);
|
CONS_Alert(CONS_ERROR, M_GetText("%s is not a SRB2Kart replay file.\n"), pdemo->filepath);
|
||||||
sprintf(pdemo->title, "INVALID REPLAY");
|
snprintf(pdemo->title, sizeof(pdemo->title), "INVALID REPLAY");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2549,8 +2518,6 @@ void G_LoadDemoTitle(menudemo_t *pdemo)
|
|||||||
|
|
||||||
pdemoversion = READUINT16(info_p);
|
pdemoversion = READUINT16(info_p);
|
||||||
|
|
||||||
memset(pdemo->date, 0, sizeof(pdemo->date));
|
|
||||||
|
|
||||||
switch (pdemoversion)
|
switch (pdemoversion)
|
||||||
{
|
{
|
||||||
case DEMOVERSION: // latest always supported
|
case DEMOVERSION: // latest always supported
|
||||||
@@ -2558,23 +2525,22 @@ void G_LoadDemoTitle(menudemo_t *pdemo)
|
|||||||
memcpy(pdemo->title, info_p, 64);
|
memcpy(pdemo->title, info_p, 64);
|
||||||
|
|
||||||
// demo date
|
// demo date
|
||||||
demodate = G_GetDemoDate(pdemo);
|
char *demodate = G_GetDemoDate(pdemo, dateformat);
|
||||||
|
|
||||||
if (demodate)
|
if (demodate)
|
||||||
{
|
{
|
||||||
strlcpy(pdemo->date, demodate, sizeof(pdemo->date));
|
strlcpy(pdemo->date, demodate, sizeof(pdemo->date));
|
||||||
|
free(demodate);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
#ifdef DEMO_COMPAT_100
|
#ifdef DEMO_COMPAT_100
|
||||||
case 0x0001:
|
case 0x0001:
|
||||||
sprintf(pdemo->title, "Legacy Replay");
|
snprintf(pdemo->title, sizeof(pdemo->title), "Legacy Replay");
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
// too old, cannot support.
|
// too old, cannot support.
|
||||||
default:
|
default:
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("%s is an incompatible replay format and cannot be played.\n"), pdemo->filepath);
|
CONS_Alert(CONS_ERROR, M_GetText("%s is an incompatible replay format and cannot be played.\n"), pdemo->filepath);
|
||||||
sprintf(pdemo->title, "INVALID REPLAY");
|
snprintf(pdemo->title, sizeof(pdemo->title), "INVALID REPLAY");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2616,7 +2582,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
if (defdemoname == NULL)
|
if (defdemoname == NULL)
|
||||||
{
|
{
|
||||||
demobuf.p = demobuf.buffer;
|
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
|
else
|
||||||
{
|
{
|
||||||
@@ -2628,7 +2594,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
n++;
|
n++;
|
||||||
|
|
||||||
pdemoname = ZZ_Alloc(strlen(n)+1);
|
pdemoname = ZZ_Alloc(strlen(n)+1);
|
||||||
strcpy(pdemoname,n);
|
strcpy(pdemoname, n);
|
||||||
|
|
||||||
M_SetPlaybackMenuPointer();
|
M_SetPlaybackMenuPointer();
|
||||||
|
|
||||||
@@ -2638,7 +2604,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
//FIL_DefaultExtension(defdemoname, ".lmp");
|
//FIL_DefaultExtension(defdemoname, ".lmp");
|
||||||
if (!FIL_ReadFile(defdemoname, &demobuf.buffer))
|
if (!FIL_ReadFile(defdemoname, &demobuf.buffer))
|
||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("Failed to read file '%s'.\n"), defdemoname);
|
snprintf(msg, sizeof(msg), M_GetText("Failed to read file '%s'.\n"), defdemoname);
|
||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
gameaction = ga_nothing;
|
gameaction = ga_nothing;
|
||||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
@@ -2650,7 +2616,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
// load demo resource from WAD
|
// load demo resource from WAD
|
||||||
else if ((l = W_CheckNumForName(defdemoname)) == LUMPERROR)
|
else if ((l = W_CheckNumForName(defdemoname)) == LUMPERROR)
|
||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("Failed to read lump '%s'.\n"), defdemoname);
|
snprintf(msg, sizeof(msg), M_GetText("Failed to read lump '%s'.\n"), defdemoname);
|
||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
gameaction = ga_nothing;
|
gameaction = ga_nothing;
|
||||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
@@ -2671,7 +2637,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
|
|
||||||
if (memcmp(demobuf.p, DEMOHEADER, 12))
|
if (memcmp(demobuf.p, DEMOHEADER, 12))
|
||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s is not a SRB2Kart replay file.\n"), pdemoname);
|
snprintf(msg, sizeof(msg), M_GetText("%s is not a SRB2Kart replay file.\n"), pdemoname);
|
||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
@@ -2697,7 +2663,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
#endif
|
#endif
|
||||||
// too old, cannot support.
|
// too old, cannot support.
|
||||||
default:
|
default:
|
||||||
snprintf(msg, 1024, M_GetText("%s is an incompatible replay format and cannot be played.\n"), pdemoname);
|
snprintf(msg, sizeof(msg), M_GetText("%s is an incompatible replay format and cannot be played.\n"), pdemoname);
|
||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
@@ -2708,7 +2674,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
|
|
||||||
if (memcmp(demobuf.p, "PLAY", 4))
|
if (memcmp(demobuf.p, "PLAY", 4))
|
||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s is the wrong type of recording and cannot be played.\n"), pdemoname);
|
snprintf(msg, sizeof(msg), M_GetText("%s is the wrong type of recording and cannot be played.\n"), pdemoname);
|
||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
@@ -2725,7 +2691,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
{
|
{
|
||||||
if (demoflags & DF_MULTIPLAYER)
|
if (demoflags & DF_MULTIPLAYER)
|
||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s is an alpha multiplayer replay and cannot be played.\n"), pdemoname);
|
snprintf(msg, sizeof(msg), M_GetText("%s is an alpha multiplayer replay and cannot be played.\n"), pdemoname);
|
||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
@@ -2752,31 +2718,31 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
switch (error)
|
switch (error)
|
||||||
{
|
{
|
||||||
case DFILE_ERROR_NOTLOADED:
|
case DFILE_ERROR_NOTLOADED:
|
||||||
snprintf(msg, 1024,
|
snprintf(msg, sizeof(msg),
|
||||||
"Required files for this demo are not loaded.\n\nUse\n\"playdemo %s -addfiles\"\nto load them and play the demo.\n",
|
"Required files for this demo are not loaded.\n\nUse\n\"playdemo %s -addfiles\"\nto load them and play the demo.\n",
|
||||||
pdemoname);
|
pdemoname);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DFILE_ERROR_OUTOFORDER:
|
case DFILE_ERROR_OUTOFORDER:
|
||||||
snprintf(msg, 1024,
|
snprintf(msg, sizeof(msg),
|
||||||
"Required files for this demo are loaded out of order.\n\nUse\n\"playdemo %s -force\"\nto play the demo anyway.\n",
|
"Required files for this demo are loaded out of order.\n\nUse\n\"playdemo %s -force\"\nto play the demo anyway.\n",
|
||||||
pdemoname);
|
pdemoname);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DFILE_ERROR_INCOMPLETEOUTOFORDER:
|
case DFILE_ERROR_INCOMPLETEOUTOFORDER:
|
||||||
snprintf(msg, 1024,
|
snprintf(msg, sizeof(msg),
|
||||||
"Required files for this demo are not loaded, and some are out of order.\n\nUse\n\"playdemo %s -addfiles\"\nto load needed files and play the demo.\n",
|
"Required files for this demo are not loaded, and some are out of order.\n\nUse\n\"playdemo %s -addfiles\"\nto load needed files and play the demo.\n",
|
||||||
pdemoname);
|
pdemoname);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DFILE_ERROR_CANNOTLOAD:
|
case DFILE_ERROR_CANNOTLOAD:
|
||||||
snprintf(msg, 1024,
|
snprintf(msg, sizeof(msg),
|
||||||
"Required files for this demo cannot be loaded.\n\nUse\n\"playdemo %s -force\"\nto play the demo anyway.\n",
|
"Required files for this demo cannot be loaded.\n\nUse\n\"playdemo %s -force\"\nto play the demo anyway.\n",
|
||||||
pdemoname);
|
pdemoname);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DFILE_ERROR_EXTRAFILES:
|
case DFILE_ERROR_EXTRAFILES:
|
||||||
snprintf(msg, 1024,
|
snprintf(msg, sizeof(msg),
|
||||||
"You have additional files loaded beyond the demo's file list.\n\nUse\n\"playdemo %s -force\"\nto play the demo anyway.\n",
|
"You have additional files loaded beyond the demo's file list.\n\nUse\n\"playdemo %s -force\"\nto play the demo anyway.\n",
|
||||||
pdemoname);
|
pdemoname);
|
||||||
break;
|
break;
|
||||||
@@ -2826,7 +2792,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
// ...*map* not loaded?
|
// ...*map* not loaded?
|
||||||
if (!gamemap || (gamemap > NUMMAPS) || (W_CheckNumForName(G_BuildMapName(gamemap)) == LUMPERROR))
|
if (!gamemap || (gamemap > NUMMAPS) || (W_CheckNumForName(G_BuildMapName(gamemap)) == LUMPERROR))
|
||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s features a course that is not currently loaded.\n"), pdemoname);
|
snprintf(msg, sizeof(msg), M_GetText("%s features a course that is not currently loaded.\n"), pdemoname);
|
||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
@@ -2837,15 +2803,15 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
if (demo.version == 0x0001)
|
if (demo.version == 0x0001)
|
||||||
{
|
{
|
||||||
// Player name
|
// Player name
|
||||||
memcpy(player_names[0],demobuf.p,16);
|
memcpy(player_names[0], demobuf.p, 16);
|
||||||
demobuf.p += 16;
|
demobuf.p += 16;
|
||||||
|
|
||||||
// Skin
|
// Skin
|
||||||
memcpy(skin,demobuf.p,16);
|
memcpy(skin, demobuf.p, 16);
|
||||||
demobuf.p += 16;
|
demobuf.p += 16;
|
||||||
|
|
||||||
// Color
|
// Color
|
||||||
memcpy(color,demobuf.p,16);
|
memcpy(color, demobuf.p, 16);
|
||||||
demobuf.p += 16;
|
demobuf.p += 16;
|
||||||
|
|
||||||
demobuf.p += 5; // Backwards compat - some stats
|
demobuf.p += 5; // Backwards compat - some stats
|
||||||
@@ -2858,7 +2824,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
// Skin not loaded?
|
// Skin not loaded?
|
||||||
if (!SetPlayerSkin(0, skin))
|
if (!SetPlayerSkin(0, skin))
|
||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s features a character that is not currently loaded.\n"), pdemoname);
|
snprintf(msg, sizeof(msg), M_GetText("%s features a character that is not currently loaded.\n"), pdemoname);
|
||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
@@ -2868,7 +2834,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
// ...*map* not loaded?
|
// ...*map* not loaded?
|
||||||
if (!gamemap || (gamemap > NUMMAPS) || !mapheaderinfo[gamemap-1] || !(mapheaderinfo[gamemap-1]->menuflags & LF2_EXISTSHACK))
|
if (!gamemap || (gamemap > NUMMAPS) || !mapheaderinfo[gamemap-1] || !(mapheaderinfo[gamemap-1]->menuflags & LF2_EXISTSHACK))
|
||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s features a course that is not currently loaded.\n"), pdemoname);
|
snprintf(msg, sizeof(msg), M_GetText("%s features a course that is not currently loaded.\n"), pdemoname);
|
||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
@@ -2878,7 +2844,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
// Set color
|
// Set color
|
||||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
for (i = 0; i < MAXSKINCOLORS; i++)
|
||||||
{
|
{
|
||||||
if (fasticmp(KartColor_Names[i],color)) // SRB2kart
|
if (fasticmp(KartColor_Names[i], color)) // SRB2kart
|
||||||
{
|
{
|
||||||
players[0].skincolor = i;
|
players[0].skincolor = i;
|
||||||
break;
|
break;
|
||||||
@@ -2891,16 +2857,16 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
// Sigh ... it's an empty demo.
|
// Sigh ... it's an empty demo.
|
||||||
if (*demobuf.p == DEMOMARKER)
|
if (*demobuf.p == DEMOMARKER)
|
||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s contains no data to be played.\n"), pdemoname);
|
snprintf(msg, sizeof(msg), M_GetText("%s contains no data to be played.\n"), pdemoname);
|
||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&oldcmd,0,sizeof(oldcmd));
|
memset(&oldcmd, 0, sizeof(oldcmd));
|
||||||
memset(&oldghost,0,sizeof(oldghost));
|
memset(&oldghost, 0, sizeof(oldghost));
|
||||||
memset(&ghostext,0,sizeof(ghostext));
|
memset(&ghostext, 0, sizeof(ghostext));
|
||||||
|
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Demo version does not match game version. Desyncs may occur.\n"));
|
CONS_Alert(CONS_WARNING, M_GetText("Demo version does not match game version. Desyncs may occur.\n"));
|
||||||
|
|
||||||
@@ -2929,7 +2895,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
// Sigh ... it's an empty demo.
|
// Sigh ... it's an empty demo.
|
||||||
if (*demobuf.p == DEMOMARKER)
|
if (*demobuf.p == DEMOMARKER)
|
||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s contains no data to be played.\n"), pdemoname);
|
snprintf(msg, sizeof(msg), M_GetText("%s contains no data to be played.\n"), pdemoname);
|
||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
@@ -2978,7 +2944,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
|
|
||||||
if (modeattacking)
|
if (modeattacking)
|
||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s is a Record Attack replay with spectators, and is thus invalid.\n"), pdemoname);
|
snprintf(msg, sizeof(msg), M_GetText("%s is a Record Attack replay with spectators, and is thus invalid.\n"), pdemoname);
|
||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
@@ -2990,7 +2956,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
|
|
||||||
if (modeattacking && numslots > 1)
|
if (modeattacking && numslots > 1)
|
||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s is a Record Attack replay with multiple players, and is thus invalid.\n"), pdemoname);
|
snprintf(msg, sizeof(msg), M_GetText("%s is a Record Attack replay with multiple players, and is thus invalid.\n"), pdemoname);
|
||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
@@ -3004,16 +2970,16 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
players[p].spectator = spectator;
|
players[p].spectator = spectator;
|
||||||
|
|
||||||
// Name
|
// Name
|
||||||
memcpy(player_names[p],demobuf.p,16);
|
memcpy(player_names[p], demobuf.p, 16);
|
||||||
demobuf.p += 16;
|
demobuf.p += 16;
|
||||||
|
|
||||||
// Skin
|
// Skin
|
||||||
memcpy(skin,demobuf.p,16);
|
memcpy(skin, demobuf.p, 16);
|
||||||
demobuf.p += 16;
|
demobuf.p += 16;
|
||||||
SetPlayerSkin(p, skin);
|
SetPlayerSkin(p, skin);
|
||||||
|
|
||||||
// Color
|
// Color
|
||||||
memcpy(color,demobuf.p,16);
|
memcpy(color, demobuf.p, 16);
|
||||||
demobuf.p += 16;
|
demobuf.p += 16;
|
||||||
|
|
||||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
for (i = 0; i < MAXSKINCOLORS; i++)
|
||||||
@@ -3090,6 +3056,9 @@ post_compat:
|
|||||||
if (cv_director.value)
|
if (cv_director.value)
|
||||||
CV_SetValue(&cv_director, 0);
|
CV_SetValue(&cv_director, 0);
|
||||||
|
|
||||||
|
if (demo.timing)
|
||||||
|
G_DoneLevelLoad();
|
||||||
|
|
||||||
demo.deferstart = true;
|
demo.deferstart = true;
|
||||||
}
|
}
|
||||||
#undef SKIPERRORS
|
#undef SKIPERRORS
|
||||||
@@ -3228,15 +3197,15 @@ void G_AddGhost(char *defdemoname)
|
|||||||
if (ghostversion == 0x0001)
|
if (ghostversion == 0x0001)
|
||||||
{
|
{
|
||||||
// Player name (TODO: Display this somehow if it doesn't match cv_playername!)
|
// Player name (TODO: Display this somehow if it doesn't match cv_playername!)
|
||||||
memcpy(name, p,16);
|
memcpy(name, p, 16);
|
||||||
p += 16;
|
p += 16;
|
||||||
|
|
||||||
// Skin
|
// Skin
|
||||||
memcpy(skin, p,16);
|
memcpy(skin, p, 16);
|
||||||
p += 16;
|
p += 16;
|
||||||
|
|
||||||
// Color
|
// Color
|
||||||
memcpy(color, p,16);
|
memcpy(color, p, 16);
|
||||||
p += 16;
|
p += 16;
|
||||||
|
|
||||||
// Ghosts do not have a player structure to put this in.
|
// Ghosts do not have a player structure to put this in.
|
||||||
@@ -3388,7 +3357,7 @@ void G_AddGhost(char *defdemoname)
|
|||||||
|
|
||||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
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;
|
gh->mo->color = (UINT8)i;
|
||||||
break;
|
break;
|
||||||
@@ -3480,7 +3449,7 @@ void G_UpdateStaffGhostName(lumpnum_t l)
|
|||||||
if (ghostversion == 0x0001)
|
if (ghostversion == 0x0001)
|
||||||
{
|
{
|
||||||
// Player name
|
// Player name
|
||||||
memcpy(dummystaffname, p,16);
|
memcpy(dummystaffname, p, 16);
|
||||||
dummystaffname[16] = '\0';
|
dummystaffname[16] = '\0';
|
||||||
return; // Not really a failure but whatever
|
return; // Not really a failure but whatever
|
||||||
}
|
}
|
||||||
@@ -3517,10 +3486,11 @@ static INT32 restorecv_vidwait;
|
|||||||
void G_TimeDemo(const char *name)
|
void G_TimeDemo(const char *name)
|
||||||
{
|
{
|
||||||
nodrawers = M_CheckParm("-nodraw");
|
nodrawers = M_CheckParm("-nodraw");
|
||||||
noblit = M_CheckParm("-noblit");
|
|
||||||
restorecv_vidwait = cv_vidwait.value;
|
restorecv_vidwait = cv_vidwait.value;
|
||||||
if (cv_vidwait.value)
|
if (cv_vidwait.value)
|
||||||
CV_Set(&cv_vidwait, "0");
|
CV_Set(&cv_vidwait, "0");
|
||||||
|
|
||||||
demo.timing = true;
|
demo.timing = true;
|
||||||
singletics = true;
|
singletics = true;
|
||||||
framecount = 0;
|
framecount = 0;
|
||||||
|
|||||||
+3
-2
@@ -82,7 +82,8 @@ typedef struct menudemo_s {
|
|||||||
struct {
|
struct {
|
||||||
UINT8 ranking;
|
UINT8 ranking;
|
||||||
char name[17];
|
char name[17];
|
||||||
UINT8 skin, color;
|
skinnum_t skin;
|
||||||
|
UINT8 color;
|
||||||
UINT32 timeorscore;
|
UINT32 timeorscore;
|
||||||
} standings[MAXPLAYERS];
|
} standings[MAXPLAYERS];
|
||||||
} menudemo_t;
|
} menudemo_t;
|
||||||
@@ -97,7 +98,7 @@ void G_SetDemoTime(UINT32 ptime, UINT32 plap);
|
|||||||
UINT8 G_CmpDemoTime(char *oldname, char *newname);
|
UINT8 G_CmpDemoTime(char *oldname, char *newname);
|
||||||
|
|
||||||
void G_LoadDemoInfo(menudemo_t *pdemo);
|
void G_LoadDemoInfo(menudemo_t *pdemo);
|
||||||
void G_LoadDemoTitle(menudemo_t *pdemo); // For use in replay search feature
|
void G_LoadDemoTitle(menudemo_t *pdemo, const char *dateformat); // For use in replay search feature
|
||||||
void G_DeferedPlayDemo(const char *demo);
|
void G_DeferedPlayDemo(const char *demo);
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
|||||||
+42
-72
@@ -61,14 +61,11 @@
|
|||||||
|
|
||||||
gameaction_t gameaction = 0;
|
gameaction_t gameaction = 0;
|
||||||
gamestate_t gamestate = GS_NULL;
|
gamestate_t gamestate = GS_NULL;
|
||||||
UINT8 ultimatemode = false;
|
|
||||||
|
|
||||||
boolean botingame = false;
|
boolean botingame = false;
|
||||||
UINT8 botskin = 0;
|
skinnum_t botskin = 0;
|
||||||
UINT8 botcolor = 0;
|
UINT8 botcolor = 0;
|
||||||
|
|
||||||
JoyType_t Joystick[MAXSPLITSCREENPLAYERS] = {};
|
|
||||||
|
|
||||||
// SRB2kart
|
// SRB2kart
|
||||||
char gamedatafilename[64] = "kartdata.dat";
|
char gamedatafilename[64] = "kartdata.dat";
|
||||||
char timeattackfolder[64] = "kart";
|
char timeattackfolder[64] = "kart";
|
||||||
@@ -87,7 +84,6 @@ INT16 maptol = 0;
|
|||||||
UINT8 globalweather = 0;
|
UINT8 globalweather = 0;
|
||||||
INT32 curWeather = PRECIP_NONE;
|
INT32 curWeather = PRECIP_NONE;
|
||||||
INT32 cursaveslot = -1; // Auto-save 1p savegame slot
|
INT32 cursaveslot = -1; // Auto-save 1p savegame slot
|
||||||
INT16 lastmapsaved = 0; // Last map we auto-saved at
|
|
||||||
boolean gamecomplete = false;
|
boolean gamecomplete = false;
|
||||||
|
|
||||||
UINT16 mainwads = 0;
|
UINT16 mainwads = 0;
|
||||||
@@ -97,7 +93,6 @@ boolean savemoddata = false;
|
|||||||
UINT8 paused = 0;
|
UINT8 paused = 0;
|
||||||
UINT8 modeattacking = ATTACKING_NONE;
|
UINT8 modeattacking = ATTACKING_NONE;
|
||||||
boolean imcontinuing = false;
|
boolean imcontinuing = false;
|
||||||
boolean runemeraldmanager = false;
|
|
||||||
|
|
||||||
boolean netgame = false; // only true if packets are broadcast
|
boolean netgame = false; // only true if packets are broadcast
|
||||||
boolean multiplayer = false;
|
boolean multiplayer = false;
|
||||||
@@ -109,7 +104,6 @@ INT32 consoleplayer = 0; // player taking events and displaying
|
|||||||
INT32 displayplayers[MAXSPLITSCREENPLAYERS] = {}; // view being displayed
|
INT32 displayplayers[MAXSPLITSCREENPLAYERS] = {}; // view being displayed
|
||||||
|
|
||||||
tic_t gametic = 0;
|
tic_t gametic = 0;
|
||||||
tic_t levelstarttic = 0; // gametic at level start
|
|
||||||
UINT32 totalrings = 0; // for intermission
|
UINT32 totalrings = 0; // for intermission
|
||||||
INT16 lastmap = 0; // last level you were at (returning from special stages)
|
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)
|
tic_t timeinmap = 0; // Ticker for time spent in level (used for levelcard display)
|
||||||
@@ -187,9 +181,6 @@ boolean CheckForReverseGravity = false;
|
|||||||
UINT16 invulntics = 20*TICRATE;
|
UINT16 invulntics = 20*TICRATE;
|
||||||
UINT16 sneakertics = 20*TICRATE;
|
UINT16 sneakertics = 20*TICRATE;
|
||||||
UINT16 flashingtics = 3*TICRATE/2; // SRB2kart
|
UINT16 flashingtics = 3*TICRATE/2; // SRB2kart
|
||||||
UINT16 tailsflytics = 8*TICRATE;
|
|
||||||
UINT16 underwatertics = 30*TICRATE;
|
|
||||||
UINT16 spacetimetics = 11*TICRATE + (TICRATE/2);
|
|
||||||
UINT16 extralifetics = 4*TICRATE;
|
UINT16 extralifetics = 4*TICRATE;
|
||||||
|
|
||||||
// SRB2kart
|
// SRB2kart
|
||||||
@@ -207,10 +198,7 @@ const INT32 wipeoutslowtime = 20;
|
|||||||
const INT32 wantedreduce = 5*TICRATE;
|
const INT32 wantedreduce = 5*TICRATE;
|
||||||
const INT32 wantedfrequency = 10*TICRATE;
|
const INT32 wantedfrequency = 10*TICRATE;
|
||||||
|
|
||||||
INT32 gameovertics = 15*TICRATE;
|
|
||||||
|
|
||||||
UINT8 use1upSound = 0;
|
UINT8 use1upSound = 0;
|
||||||
UINT8 maxXtraLife = 2; // Max extra lives from rings
|
|
||||||
|
|
||||||
UINT8 introtoplay = 0;
|
UINT8 introtoplay = 0;
|
||||||
UINT8 creditscutscene = 0;
|
UINT8 creditscutscene = 0;
|
||||||
@@ -465,34 +453,13 @@ consvar_t cv_driftsparkpulse = {"driftsparkpulse", "1.4", CV_FLOAT | CV_SAVE, dr
|
|||||||
static CV_PossibleValue_t cechotoggle_t[] = {{0, "Off"}, {1, "On"}, {2, "Console"}, {0, NULL}};
|
static CV_PossibleValue_t cechotoggle_t[] = {{0, "Off"}, {1, "On"}, {2, "Console"}, {0, NULL}};
|
||||||
consvar_t cv_cechotoggle = {"show_cecho", "On", CV_SAVE, cechotoggle_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_cechotoggle = {"show_cecho", "On", CV_SAVE, cechotoggle_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
#if MAXPLAYERS > 16
|
|
||||||
#error "please update player_name table using the new value for MAXPLAYERS"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SEENAMES
|
#ifdef SEENAMES
|
||||||
player_t *seenplayer = NULL; // player we're aiming at right now
|
player_t *seenplayer = NULL; // player we're aiming at right now
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char player_names[MAXPLAYERS][MAXPLAYERNAME+1] =
|
// now automatically allocated in D_RegisterServerCommands
|
||||||
{
|
// so that it doesn't have to be updated depending on the value of MAXPLAYERS
|
||||||
"Player 1",
|
char player_names[MAXPLAYERS][MAXPLAYERNAME+1];
|
||||||
"Player 2",
|
|
||||||
"Player 3",
|
|
||||||
"Player 4",
|
|
||||||
"Player 5",
|
|
||||||
"Player 6",
|
|
||||||
"Player 7",
|
|
||||||
"Player 8",
|
|
||||||
"Player 9",
|
|
||||||
"Player 10",
|
|
||||||
"Player 11",
|
|
||||||
"Player 12",
|
|
||||||
"Player 13",
|
|
||||||
"Player 14",
|
|
||||||
"Player 15",
|
|
||||||
"Player 16"
|
|
||||||
}; // SRB2kart - removed Players 17 through 32
|
|
||||||
|
|
||||||
INT32 player_name_changes[MAXPLAYERS] = {};
|
INT32 player_name_changes[MAXPLAYERS] = {};
|
||||||
|
|
||||||
INT16 rw_maximums[NUM_WEAPONS] =
|
INT16 rw_maximums[NUM_WEAPONS] =
|
||||||
@@ -637,14 +604,18 @@ const char *G_BuildMapName(INT32 map)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (map < 100 && map >= 0) // ...but why use signed integer in first place? idk but this prevents warning (and potential buffer overflow lol)
|
if (map < 100 && map >= 0) // ...but why use signed integer in first place? idk but this prevents warning (and potential buffer overflow lol)
|
||||||
sprintf(&mapname[3], "%.2d", map);
|
{
|
||||||
|
snprintf(&mapname[3], sizeof(mapname)-3, "%.2d", map);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mapname[3] = (char)('A' + (char)((map - 100) / 36));
|
mapname[3] = (char)('A' + (char)((map - 100) / 36));
|
||||||
|
|
||||||
if ((map - 100) % 36 < 10)
|
if ((map - 100) % 36 < 10)
|
||||||
mapname[4] = (char)('0' + (char)((map - 100) % 36));
|
mapname[4] = (char)('0' + (char)((map - 100) % 36));
|
||||||
else
|
else
|
||||||
mapname[4] = (char)('A' + (char)((map - 100) % 36) - 10);
|
mapname[4] = (char)('A' + (char)((map - 100) % 36) - 10);
|
||||||
|
|
||||||
mapname[5] = '\0';
|
mapname[5] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -765,7 +736,7 @@ INT32 JoyAxis(axis_input_e axissel, UINT8 player)
|
|||||||
if (retaxis > (+JOYAXISRANGE))
|
if (retaxis > (+JOYAXISRANGE))
|
||||||
retaxis = +JOYAXISRANGE;
|
retaxis = +JOYAXISRANGE;
|
||||||
|
|
||||||
if (!Joystick[pnum].bGamepadStyle && axissel < AXISDEAD)
|
if (!DigitalGamepadStyle(pnum) && axissel < AXISDEAD)
|
||||||
{
|
{
|
||||||
const INT32 jdeadzone = ((JOYAXISRANGE-1) * deadzone) >> FRACBITS;
|
const INT32 jdeadzone = ((JOYAXISRANGE-1) * deadzone) >> FRACBITS;
|
||||||
|
|
||||||
@@ -813,8 +784,8 @@ static void G_HandleLocalDriftturn(ticcmd_t *cmd, UINT8 ssplayer)
|
|||||||
|
|
||||||
const UINT8 forplayer = (ssplayer-1);
|
const UINT8 forplayer = (ssplayer-1);
|
||||||
|
|
||||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle;
|
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !DigitalGamepadStyle(forplayer);
|
||||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle;
|
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && DigitalGamepadStyle(forplayer);
|
||||||
|
|
||||||
turnright = InputDown(gc_turnright, ssplayer);
|
turnright = InputDown(gc_turnright, ssplayer);
|
||||||
turnleft = InputDown(gc_turnleft, ssplayer);
|
turnleft = InputDown(gc_turnleft, ssplayer);
|
||||||
@@ -869,7 +840,8 @@ static void G_HandleLocalDriftturn(ticcmd_t *cmd, UINT8 ssplayer)
|
|||||||
static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam)
|
static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam)
|
||||||
{
|
{
|
||||||
INT32 axis = 0;
|
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
|
// check for inputs and return button commands
|
||||||
// for stuff like joining with item button, saltyhop, honking, etc.
|
// for stuff like joining with item button, saltyhop, honking, etc.
|
||||||
@@ -905,7 +877,7 @@ static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam)
|
|||||||
#undef CHECKINPUT
|
#undef CHECKINPUT
|
||||||
|
|
||||||
axis = JoyAxis(AXISLOOKBACK, ssplayer);
|
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.
|
// Reset to our spec player if we watch someone else.
|
||||||
if ((cmd->driftturn || cmd->buttons)
|
if ((cmd->driftturn || cmd->buttons)
|
||||||
@@ -1002,10 +974,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
|||||||
player_t *player = P_GetLocalPlayerForNum(forplayer);
|
player_t *player = P_GetLocalPlayerForNum(forplayer);
|
||||||
|
|
||||||
camera_t *thiscam = &camera[forplayer];
|
camera_t *thiscam = &camera[forplayer];
|
||||||
const boolean freecam = camera[forplayer].freecam;
|
const boolean freecam = thiscam->freecam;
|
||||||
|
|
||||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle;
|
|
||||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle;
|
|
||||||
|
|
||||||
lang = localangle[forplayer];
|
lang = localangle[forplayer];
|
||||||
laim = localaiming[forplayer];
|
laim = localaiming[forplayer];
|
||||||
@@ -1037,6 +1006,9 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !DigitalGamepadStyle(forplayer);
|
||||||
|
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && DigitalGamepadStyle(forplayer);
|
||||||
|
|
||||||
usejoystick = (analogjoystickmove || gamepadjoystickmove);
|
usejoystick = (analogjoystickmove || gamepadjoystickmove);
|
||||||
turnright = InputDown(gc_turnright, ssplayer);
|
turnright = InputDown(gc_turnright, ssplayer);
|
||||||
turnleft = InputDown(gc_turnleft, ssplayer);
|
turnleft = InputDown(gc_turnleft, ssplayer);
|
||||||
@@ -1300,8 +1272,6 @@ static void G_DoLoadLevel(boolean resetplayer)
|
|||||||
// Make sure objectplace is OFF when you first start the level!
|
// Make sure objectplace is OFF when you first start the level!
|
||||||
OP_ResetObjectplace();
|
OP_ResetObjectplace();
|
||||||
|
|
||||||
levelstarttic = gametic; // for time calculation
|
|
||||||
|
|
||||||
if (wipegamestate == GS_LEVEL)
|
if (wipegamestate == GS_LEVEL)
|
||||||
wipegamestate = -1; // force a wipe
|
wipegamestate = -1; // force a wipe
|
||||||
|
|
||||||
@@ -1323,6 +1293,7 @@ static void G_DoLoadLevel(boolean resetplayer)
|
|||||||
{
|
{
|
||||||
// fail so reset game stuff
|
// fail so reset game stuff
|
||||||
Command_ExitGame_f();
|
Command_ExitGame_f();
|
||||||
|
P_FreeCorruptMapWarnings();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1356,6 +1327,8 @@ static void G_DoLoadLevel(boolean resetplayer)
|
|||||||
|
|
||||||
// clear hud messages remains (usually from game startup)
|
// clear hud messages remains (usually from game startup)
|
||||||
CON_ClearHUD();
|
CON_ClearHUD();
|
||||||
|
// print any map errors now due to clearhud above :chaosleep:
|
||||||
|
P_PrintCorruptMapWarnings();
|
||||||
|
|
||||||
server_lagless = !cv_gentlemens.value;
|
server_lagless = !cv_gentlemens.value;
|
||||||
|
|
||||||
@@ -2657,12 +2630,18 @@ mapthing_t *G_FindRaceStart(INT32 playernum)
|
|||||||
// Just spawn there.
|
// Just spawn there.
|
||||||
//return playerstarts[0];
|
//return playerstarts[0];
|
||||||
|
|
||||||
|
#if MAXPLAYERS > 16
|
||||||
|
//this section courtesy of fickle - v1.1 battle royale
|
||||||
|
// screw collision chex
|
||||||
|
return playerstarts[pos % numcoopstarts];
|
||||||
|
#else
|
||||||
if (P_IsLocalPlayerNum(playernum))
|
if (P_IsLocalPlayerNum(playernum))
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_WARNING, "Could not spawn at any Race starts!\n");
|
CONS_Alert(CONS_WARNING, "Could not spawn at any Race starts!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (P_IsLocalPlayerNum(playernum))
|
if (P_IsLocalPlayerNum(playernum))
|
||||||
@@ -3355,18 +3334,6 @@ static void G_DoStartVote(void)
|
|||||||
gameaction = ga_nothing;
|
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)
|
static void G_DoStartContinue(void)
|
||||||
{
|
{
|
||||||
I_Assert(!netgame && !multiplayer);
|
I_Assert(!netgame && !multiplayer);
|
||||||
@@ -3405,7 +3372,7 @@ static void G_DoContinued(void)
|
|||||||
token = 0;
|
token = 0;
|
||||||
|
|
||||||
// Reset # of lives
|
// Reset # of lives
|
||||||
pl->lives = (ultimatemode) ? 1 : 3;
|
pl->lives = 3;
|
||||||
|
|
||||||
D_MapChange(gamemap, gametype, false, false, 0, false, false);
|
D_MapChange(gamemap, gametype, false, false, 0, false, false);
|
||||||
|
|
||||||
@@ -3809,7 +3776,7 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride)
|
|||||||
startonmapnum = mapoverride;
|
startonmapnum = mapoverride;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sprintf(savename, savegamename, slot);
|
snprintf(savename, sizeof(savename), savegamename, slot);
|
||||||
|
|
||||||
length = FIL_ReadFile(savename, &save.buffer);
|
length = FIL_ReadFile(savename, &save.buffer);
|
||||||
if (!length)
|
if (!length)
|
||||||
@@ -3821,7 +3788,7 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride)
|
|||||||
save.p = save.buffer;
|
save.p = save.buffer;
|
||||||
|
|
||||||
memset(vcheck, 0, sizeof (vcheck));
|
memset(vcheck, 0, sizeof (vcheck));
|
||||||
sprintf(vcheck, "version %d", VERSION);
|
snprintf(vcheck, sizeof(vcheck), "version %d", VERSION);
|
||||||
|
|
||||||
if (!fastcmp((const char *)save.p, (const char *)vcheck))
|
if (!fastcmp((const char *)save.p, (const char *)vcheck))
|
||||||
{
|
{
|
||||||
@@ -3887,8 +3854,8 @@ void G_SaveGame(UINT32 savegameslot)
|
|||||||
const char *backup;
|
const char *backup;
|
||||||
savebuffer_t save = {};
|
savebuffer_t save = {};
|
||||||
|
|
||||||
sprintf(savename, savegamename, savegameslot);
|
snprintf(savename, sizeof(savename), savegamename, savegameslot);
|
||||||
backup = va("%s",savename);
|
backup = va("%s", savename);
|
||||||
|
|
||||||
// save during evaluation or credits? game's over, folks!
|
// save during evaluation or credits? game's over, folks!
|
||||||
if (gamestate == GS_CREDITS || gamestate == GS_EVALUATION)
|
if (gamestate == GS_CREDITS || gamestate == GS_EVALUATION)
|
||||||
@@ -3906,8 +3873,8 @@ void G_SaveGame(UINT32 savegameslot)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(name, 0, sizeof (name));
|
memset(name, 0, sizeof(name));
|
||||||
sprintf(name, "version %d", VERSION);
|
snprintf(name, sizeof(name), "version %d", VERSION);
|
||||||
WRITEMEM(save.p, name, VERSIONSIZE);
|
WRITEMEM(save.p, name, VERSIONSIZE);
|
||||||
|
|
||||||
P_SaveGame(&save);
|
P_SaveGame(&save);
|
||||||
@@ -4049,7 +4016,6 @@ void G_InitNew(UINT8 pencoremode, const char *mapname, boolean resetplayer, bool
|
|||||||
if (W_CheckNumForName(mapname) == LUMPERROR)
|
if (W_CheckNumForName(mapname) == LUMPERROR)
|
||||||
{
|
{
|
||||||
I_Error("Internal game map '%s' not found\n", mapname);
|
I_Error("Internal game map '%s' not found\n", mapname);
|
||||||
Command_ExitGame_f();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4114,6 +4080,7 @@ char *G_BuildMapTitle(INT32 mapnum)
|
|||||||
const char *actnum = NULL;
|
const char *actnum = NULL;
|
||||||
|
|
||||||
len += strlen(mapheaderinfo[mapnum-1]->lvlttl);
|
len += strlen(mapheaderinfo[mapnum-1]->lvlttl);
|
||||||
|
|
||||||
if (strlen(mapheaderinfo[mapnum-1]->zonttl) > 0)
|
if (strlen(mapheaderinfo[mapnum-1]->zonttl) > 0)
|
||||||
{
|
{
|
||||||
zonetext = M_GetText(mapheaderinfo[mapnum-1]->zonttl);
|
zonetext = M_GetText(mapheaderinfo[mapnum-1]->zonttl);
|
||||||
@@ -4124,6 +4091,7 @@ char *G_BuildMapTitle(INT32 mapnum)
|
|||||||
zonetext = M_GetText("Zone");
|
zonetext = M_GetText("Zone");
|
||||||
len += strlen(zonetext) + 1; // ' ' + zonetext
|
len += strlen(zonetext) + 1; // ' ' + zonetext
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strlen(mapheaderinfo[mapnum-1]->actnum) > 0)
|
if (strlen(mapheaderinfo[mapnum-1]->actnum) > 0)
|
||||||
{
|
{
|
||||||
actnum = M_GetText(mapheaderinfo[mapnum-1]->actnum);
|
actnum = M_GetText(mapheaderinfo[mapnum-1]->actnum);
|
||||||
@@ -4135,10 +4103,12 @@ char *G_BuildMapTitle(INT32 mapnum)
|
|||||||
if (!title)
|
if (!title)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sprintf(title, "%s", mapheaderinfo[mapnum-1]->lvlttl);
|
snprintf(title, len, "%s", mapheaderinfo[mapnum-1]->lvlttl);
|
||||||
|
|
||||||
if (zonetext) sprintf(title + strlen(title), " %s", zonetext);
|
if (zonetext)
|
||||||
if (actnum) sprintf(title + strlen(title), " %s", actnum);
|
snprintf(title + strlen(title), len - strlen(title), " %s", zonetext);
|
||||||
|
if (actnum)
|
||||||
|
snprintf(title + strlen(title), len - strlen(title), " %s", actnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
return title;
|
return title;
|
||||||
|
|||||||
+6
-9
@@ -39,12 +39,8 @@ extern INT32 player_name_changes[MAXPLAYERS];
|
|||||||
extern player_t players[MAXPLAYERS];
|
extern player_t players[MAXPLAYERS];
|
||||||
extern boolean playeringame[MAXPLAYERS];
|
extern boolean playeringame[MAXPLAYERS];
|
||||||
|
|
||||||
// gametic at level start
|
|
||||||
extern tic_t levelstarttic;
|
|
||||||
|
|
||||||
// for modding?
|
// for modding?
|
||||||
extern INT16 prevmap, nextmap;
|
extern INT16 prevmap, nextmap;
|
||||||
extern INT32 gameovertics;
|
|
||||||
extern tic_t timeinmap; // Ticker for time spent in level (used for levelcard display)
|
extern tic_t timeinmap; // Ticker for time spent in level (used for levelcard display)
|
||||||
extern INT16 rw_maximums[NUM_WEAPONS];
|
extern INT16 rw_maximums[NUM_WEAPONS];
|
||||||
|
|
||||||
@@ -122,10 +118,11 @@ extern consvar_t cv_driftsparkpulse;
|
|||||||
extern consvar_t cv_gravstretch;
|
extern consvar_t cv_gravstretch;
|
||||||
extern consvar_t cv_sloperoll;
|
extern consvar_t cv_sloperoll;
|
||||||
extern consvar_t cv_sliptideroll;
|
extern consvar_t cv_sliptideroll;
|
||||||
|
extern consvar_t cv_stairjank;
|
||||||
|
extern consvar_t cv_stairjanksfx;
|
||||||
extern consvar_t cv_slamsound;
|
extern consvar_t cv_slamsound;
|
||||||
extern consvar_t cv_sloperolldist;
|
extern consvar_t cv_sloperolldist;
|
||||||
extern consvar_t cv_sparkroll;
|
extern consvar_t cv_sparkroll;
|
||||||
extern consvar_t cv_spinoutroll;
|
|
||||||
|
|
||||||
extern consvar_t cv_squishdance, cv_squishdancespeed;
|
extern consvar_t cv_squishdance, cv_squishdancespeed;
|
||||||
|
|
||||||
@@ -231,10 +228,11 @@ void G_SaveGameData(boolean force);
|
|||||||
|
|
||||||
void G_SaveGame(UINT32 slot);
|
void G_SaveGame(UINT32 slot);
|
||||||
|
|
||||||
#define G_GametypeHasTeams() (G_IsGameType(GT_TEAMMATCH) || G_IsGameType(GT_CTF))
|
|
||||||
#define G_BattleGametype() (G_IsGameType(GT_MATCH))
|
|
||||||
#define G_RaceGametype() (G_IsGameType(GT_RACE))
|
#define G_RaceGametype() (G_IsGameType(GT_RACE))
|
||||||
#define G_TagGametype() (G_IsGameType(GT_TAG) || G_IsGameType(GT_HIDEANDSEEK))
|
#define G_BattleGametype() (G_IsGameType(GT_MATCH))
|
||||||
|
|
||||||
|
#define G_GametypeHasTeams() (UNLIKELY(G_IsGameType(GT_TEAMMATCH) || G_IsGameType(GT_CTF)))
|
||||||
|
#define G_TagGametype() (UNLIKELY(G_IsGameType(GT_TAG) || G_IsGameType(GT_HIDEANDSEEK)))
|
||||||
|
|
||||||
FUNCINLINE static ATTRINLINE boolean G_IsGameType(int type)
|
FUNCINLINE static ATTRINLINE boolean G_IsGameType(int type)
|
||||||
{
|
{
|
||||||
@@ -252,7 +250,6 @@ UINT8 G_GetGametypeColor(INT16 gt);
|
|||||||
void G_ExitLevel(void);
|
void G_ExitLevel(void);
|
||||||
void G_NextLevel(void);
|
void G_NextLevel(void);
|
||||||
void G_Continue(void);
|
void G_Continue(void);
|
||||||
void G_UseContinue(void);
|
|
||||||
void G_AfterIntermission(void);
|
void G_AfterIntermission(void);
|
||||||
void G_EndGame(void); // moved from y_inter.c/h and renamed
|
void G_EndGame(void); // moved from y_inter.c/h and renamed
|
||||||
|
|
||||||
|
|||||||
+72
-13
@@ -66,13 +66,30 @@ consvar_t cv_rumble[MAXSPLITSCREENPLAYERS] = {
|
|||||||
|
|
||||||
static CV_PossibleValue_t rumblestrength_cons_t[] = {{FRACUNIT/4, "MIN"}, {FRACUNIT*4, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t rumblestrength_cons_t[] = {{FRACUNIT/4, "MIN"}, {FRACUNIT*4, "MAX"}, {0, NULL}};
|
||||||
|
|
||||||
consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS] = {
|
consvar_t cv_rumble_strength[MAXSPLITSCREENPLAYERS] = {
|
||||||
{"rumblestrength", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
|
{"rumblestrength", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
|
||||||
{"rumblestrength2", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
|
{"rumblestrength2", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
|
||||||
{"rumblestrength3", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
|
{"rumblestrength3", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
|
||||||
{"rumblestrength4", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}
|
{"rumblestrength4", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define IMPL_RUMBLE_TYPE(type)\
|
||||||
|
consvar_t cv_rumble_##type [MAXSPLITSCREENPLAYERS] = {\
|
||||||
|
{"rumble_" #type, "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},\
|
||||||
|
{"rumble2_" #type, "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},\
|
||||||
|
{"rumble3_" #type, "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},\
|
||||||
|
{"rumble4_" #type, "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}\
|
||||||
|
};
|
||||||
|
|
||||||
|
IMPL_RUMBLE_TYPE(spinout);
|
||||||
|
IMPL_RUMBLE_TYPE(sneakerboost);
|
||||||
|
IMPL_RUMBLE_TYPE(offroad);
|
||||||
|
IMPL_RUMBLE_TYPE(bananadrag);
|
||||||
|
IMPL_RUMBLE_TYPE(stairjank);
|
||||||
|
IMPL_RUMBLE_TYPE(brakedrift);
|
||||||
|
IMPL_RUMBLE_TYPE(driftcharge);
|
||||||
|
|
||||||
|
|
||||||
static CV_PossibleValue_t gamepadled_cons_t[] = {{0, "Off"}, {1, "Skincolor"}, {2, "Mobjcolor"}, {0, NULL}};
|
static CV_PossibleValue_t gamepadled_cons_t[] = {{0, "Off"}, {1, "Skincolor"}, {2, "Mobjcolor"}, {0, NULL}};
|
||||||
consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS] = {
|
consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS] = {
|
||||||
{"gamepadled", "Skincolor", CV_SAVE|CV_CALL|CV_NOINIT, gamepadled_cons_t, led_off_handle, 0, NULL, NULL, 0, 0, NULL},
|
{"gamepadled", "Skincolor", CV_SAVE|CV_CALL|CV_NOINIT, gamepadled_cons_t, led_off_handle, 0, NULL, NULL, 0, 0, NULL},
|
||||||
@@ -81,6 +98,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}
|
{"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_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};
|
consvar_t cv_rumbleifunfocused = {"rumbleifunfocused", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
@@ -939,6 +957,11 @@ void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT8 color)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!I_GamepadHasLED(playernum))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// so we can override this
|
// so we can override this
|
||||||
skincolor = color ? color : G_GetSkinColorForGamepad(playernum);
|
skincolor = color ? color : G_GetSkinColorForGamepad(playernum);
|
||||||
byte_color = V_GetColor(colortranslations[skincolor][8]).s;
|
byte_color = V_GetColor(colortranslations[skincolor][8]).s;
|
||||||
@@ -974,12 +997,22 @@ void G_DeviceLEDTick(void)
|
|||||||
for (i = 0; i <= splitscreen; i++)
|
for (i = 0; i <= splitscreen; i++)
|
||||||
{
|
{
|
||||||
if (!cv_usejoystick[i].value || !cv_gamepadled[i].value)
|
if (!cv_usejoystick[i].value || !cv_gamepadled[i].value)
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// does not have a configurable led! :c
|
||||||
|
if (!I_GamepadHasLED(i))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
newcolor = G_GetSkinColorForGamepad(i);
|
newcolor = G_GetSkinColorForGamepad(i);
|
||||||
|
|
||||||
if (curcolor[i] == newcolor) // dont update if same colour
|
if (curcolor[i] == newcolor) // dont update if same colour
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
G_SetPlayerGamepadIndicatorColor(i, newcolor);
|
G_SetPlayerGamepadIndicatorColor(i, newcolor);
|
||||||
curcolor[i] = newcolor;
|
curcolor[i] = newcolor;
|
||||||
@@ -1020,8 +1053,8 @@ void G_PlayerDeviceRumble(INT32 playernum, UINT16 low_strength, UINT16 high_stre
|
|||||||
// doesent need to be super precise
|
// doesent need to be super precise
|
||||||
// but ensure this is within range (0-65535)
|
// but ensure this is within range (0-65535)
|
||||||
// placed here so it applies to lua aswell
|
// placed here so it applies to lua aswell
|
||||||
low_strength = (UINT16)min(FixedMul(low_strength, cv_rumblestrength[playernum].value), UINT16_MAX);
|
low_strength = (UINT16)min(FixedMul(low_strength, cv_rumble_strength[playernum].value), UINT16_MAX);
|
||||||
high_strength = (UINT16)min(FixedMul(high_strength, cv_rumblestrength[playernum].value), UINT16_MAX);
|
high_strength = (UINT16)min(FixedMul(high_strength, cv_rumble_strength[playernum].value), UINT16_MAX);
|
||||||
|
|
||||||
I_GamepadRumble(playernum, low_strength, high_strength, duration);
|
I_GamepadRumble(playernum, low_strength, high_strength, duration);
|
||||||
}
|
}
|
||||||
@@ -1043,7 +1076,7 @@ void G_DeviceRumbleTick(void)
|
|||||||
{
|
{
|
||||||
UINT8 i;
|
UINT8 i;
|
||||||
|
|
||||||
if (dedicated || numcontrollers == 0 || gamestate != GS_LEVEL)
|
if (dedicated || numcontrollers == 0 || gamestate != GS_LEVEL || demo.playback)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1055,6 +1088,12 @@ void G_DeviceRumbleTick(void)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// does not support rumble! :c
|
||||||
|
if (!I_GamepadHasRumble(i))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (camera[i].freecam)
|
if (camera[i].freecam)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
@@ -1068,6 +1107,11 @@ void G_DeviceRumbleTick(void)
|
|||||||
|
|
||||||
const player_t *player = P_GetLocalPlayerForNum(i);
|
const player_t *player = P_GetLocalPlayerForNum(i);
|
||||||
|
|
||||||
|
if (!player)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// allow lua to do some crap for spectators
|
// allow lua to do some crap for spectators
|
||||||
if (player->spectator || !player->mo)
|
if (player->spectator || !player->mo)
|
||||||
{
|
{
|
||||||
@@ -1083,17 +1127,20 @@ void G_DeviceRumbleTick(void)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player->kartstuff[k_spinouttimer])
|
if (cv_rumble_spinout[i].value
|
||||||
|
&& player->kartstuff[k_spinouttimer])
|
||||||
{
|
{
|
||||||
//low = high = FRACUNIT / 6;
|
//low = high = FRACUNIT / 6;
|
||||||
low = high = FixedMul((RUMBLE_VERYSTRONG), (FixedDiv(player->kartstuff[k_spinouttimer], (3*TICRATE / 2)))); // try do some some kinda fadeout, 3*TICRATE / 2 is the "default" spinout time
|
low = high = FixedMul((RUMBLE_VERYSTRONG), (FixedDiv(player->kartstuff[k_spinouttimer], (3*TICRATE / 2)))); // try do some some kinda fadeout, 3*TICRATE / 2 is the "default" spinout time
|
||||||
}
|
}
|
||||||
else if (player->kartstuff[k_sneakertimer] > (sneakertime-(TICRATE/2)))
|
else if (cv_rumble_sneakerboost[i].value
|
||||||
|
&& (player->kartstuff[k_sneakertimer] > (sneakertime-(TICRATE/2))))
|
||||||
{
|
{
|
||||||
low = high = RUMBLE_STRONG;
|
low = high = RUMBLE_STRONG;
|
||||||
}
|
}
|
||||||
else if ((player->kartstuff[k_offroad])
|
else if (cv_rumble_offroad[i].value
|
||||||
&& player->speed != 0
|
&& (player->kartstuff[k_offroad])
|
||||||
|
&& (player->speed != 0)
|
||||||
&& P_IsObjectOnGround(player->mo))
|
&& P_IsObjectOnGround(player->mo))
|
||||||
{
|
{
|
||||||
// weaken this depending on if you got hyu or invinc
|
// weaken this depending on if you got hyu or invinc
|
||||||
@@ -1110,26 +1157,37 @@ void G_DeviceRumbleTick(void)
|
|||||||
low = high = RUMBLE_MODERATE;
|
low = high = RUMBLE_MODERATE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((player->kartstuff[k_bananadrag] > TICRATE)
|
else if (cv_rumble_bananadrag[i].value
|
||||||
&& player->speed != 0
|
&& (player->kartstuff[k_bananadrag] > TICRATE)
|
||||||
|
&& (player->speed != 0)
|
||||||
&& P_IsObjectOnGround(player->mo))
|
&& P_IsObjectOnGround(player->mo))
|
||||||
{
|
{
|
||||||
if (leveltime & 1) // this is actually funny lel
|
if (leveltime & 1) // this is actually funny lel
|
||||||
high = RUMBLE_MODERATE;
|
high = RUMBLE_MODERATE;
|
||||||
}
|
}
|
||||||
|
else if (cv_rumble_stairjank[i].value
|
||||||
|
&& (player->stairjank > 8)
|
||||||
|
&& (player->speed != 0)
|
||||||
|
&& P_IsObjectOnGround(player->mo))
|
||||||
|
{
|
||||||
|
low = high = RUMBLE_VERYWEAK;
|
||||||
|
}
|
||||||
|
|
||||||
if (player->kartstuff[k_brakedrift])
|
if (cv_rumble_brakedrift[i].value
|
||||||
|
&& player->kartstuff[k_brakedrift])
|
||||||
{
|
{
|
||||||
high = CLAMP((high + RUMBLE_VERYWEAK), 0, UINT16_MAX);
|
high = CLAMP((high + RUMBLE_VERYWEAK), 0, UINT16_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
// pulse when gettin new driftlevel
|
// pulse when gettin new driftlevel
|
||||||
// let this come last
|
// let this come last
|
||||||
if (player->kartstuff[k_driftcharge]
|
if (cv_rumble_driftcharge[i].value
|
||||||
|
&& player->kartstuff[k_driftcharge]
|
||||||
&& player->driftlevel)
|
&& player->driftlevel)
|
||||||
{
|
{
|
||||||
high = CLAMP((high + RUMBLE_VERYWEAK), 0, UINT16_MAX);
|
high = CLAMP((high + RUMBLE_VERYWEAK), 0, UINT16_MAX);
|
||||||
|
|
||||||
|
// make it rumble slightly longer the higher your driftlevel!
|
||||||
if (player->driftlevel == 2)
|
if (player->driftlevel == 2)
|
||||||
lenght = 114;
|
lenght = 114;
|
||||||
else if (player->driftlevel == 3)
|
else if (player->driftlevel == 3)
|
||||||
@@ -1192,7 +1250,8 @@ const char *G_KeynumToString(INT32 keynum)
|
|||||||
return keynames[j].name;
|
return keynames[j].name;
|
||||||
|
|
||||||
// create a name for unknown keys
|
// create a name for unknown keys
|
||||||
sprintf(keynamestr, "KEY%d", keynum);
|
snprintf(keynamestr, sizeof(keynamestr), "KEY%d", keynum);
|
||||||
|
|
||||||
return keynamestr;
|
return keynamestr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+15
-4
@@ -100,9 +100,10 @@ typedef enum
|
|||||||
gc_custom2, // Lua scriptable
|
gc_custom2, // Lua scriptable
|
||||||
gc_custom3, // Lua scriptable
|
gc_custom3, // Lua scriptable
|
||||||
gc_director,
|
gc_director,
|
||||||
|
// freecam specific controls
|
||||||
gc_freecam, // Toggle for freecam while ingame
|
gc_freecam, // Toggle for freecam while ingame
|
||||||
gc_camfloat, // alternative button for raising cam
|
gc_camfloat, // alternative button for raising camera
|
||||||
gc_camsink, // alternative button for sinking
|
gc_camsink, // alternative button for sinking camera
|
||||||
gc_strafeleft,
|
gc_strafeleft,
|
||||||
gc_straferight,
|
gc_straferight,
|
||||||
num_gamecontrols
|
num_gamecontrols
|
||||||
@@ -112,10 +113,20 @@ typedef enum
|
|||||||
extern consvar_t cv_mousexsens, cv_mouseysens;
|
extern consvar_t cv_mousexsens, cv_mouseysens;
|
||||||
extern consvar_t cv_controlperkey;
|
extern consvar_t cv_controlperkey;
|
||||||
extern consvar_t cv_turnsmooth[MAXSPLITSCREENPLAYERS];
|
extern consvar_t cv_turnsmooth[MAXSPLITSCREENPLAYERS];
|
||||||
extern consvar_t cv_rumble[MAXSPLITSCREENPLAYERS];
|
|
||||||
extern consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS];
|
|
||||||
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
|
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
|
||||||
|
|
||||||
|
extern consvar_t cv_rumble[MAXSPLITSCREENPLAYERS];
|
||||||
|
extern consvar_t cv_rumble_strength[MAXSPLITSCREENPLAYERS];
|
||||||
|
extern consvar_t cv_rumble_spinout[MAXSPLITSCREENPLAYERS];
|
||||||
|
extern consvar_t cv_rumble_sneakerboost[MAXSPLITSCREENPLAYERS];
|
||||||
|
extern consvar_t cv_rumble_offroad[MAXSPLITSCREENPLAYERS];
|
||||||
|
extern consvar_t cv_rumble_bananadrag[MAXSPLITSCREENPLAYERS];
|
||||||
|
extern consvar_t cv_rumble_stairjank[MAXSPLITSCREENPLAYERS];
|
||||||
|
extern consvar_t cv_rumble_brakedrift[MAXSPLITSCREENPLAYERS];
|
||||||
|
extern consvar_t cv_rumble_driftcharge[MAXSPLITSCREENPLAYERS];
|
||||||
|
|
||||||
|
extern consvar_t cv_gamepadifunfocused;
|
||||||
extern consvar_t cv_gamepadledifunfocused;
|
extern consvar_t cv_gamepadledifunfocused;
|
||||||
extern consvar_t cv_rumbleifunfocused;
|
extern consvar_t cv_rumbleifunfocused;
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -52,10 +52,10 @@ typedef enum
|
|||||||
} gameaction_t;
|
} gameaction_t;
|
||||||
|
|
||||||
extern gamestate_t gamestate;
|
extern gamestate_t gamestate;
|
||||||
extern UINT8 ultimatemode; // was sk_insane
|
|
||||||
extern gameaction_t gameaction;
|
extern gameaction_t gameaction;
|
||||||
|
|
||||||
extern boolean botingame;
|
extern boolean botingame;
|
||||||
extern UINT8 botskin, botcolor;
|
extern skinnum_t botskin;
|
||||||
|
extern UINT8 botcolor;
|
||||||
|
|
||||||
#endif //__G_STATE__
|
#endif //__G_STATE__
|
||||||
@@ -35,7 +35,7 @@ static int finalVertexArrayAllocSize = 65536;
|
|||||||
// not gonna use this for now, just sort by color and change state when it changes
|
// not gonna use this for now, just sort by color and change state when it changes
|
||||||
// later maybe when using vertex attributes if it's needed
|
// later maybe when using vertex attributes if it's needed
|
||||||
|
|
||||||
static PolygonArrayEntry* polygonArray = NULL ;// contains the polygon data from DrawPolygon, waiting to be processed
|
static PolygonArrayEntry* polygonArray = NULL; // contains the polygon data from DrawPolygon, waiting to be processed
|
||||||
static PolygonArrayEntry **polygonArraySorted = NULL; // contains sorted pointers to polygonArray
|
static PolygonArrayEntry **polygonArraySorted = NULL; // contains sorted pointers to polygonArray
|
||||||
static int polygonArraySize = 0;
|
static int polygonArraySize = 0;
|
||||||
static int polygonArrayAllocSize = 65536;
|
static int polygonArrayAllocSize = 65536;
|
||||||
@@ -171,8 +171,8 @@ static int comparePolygons(const void *p1, const void *p2)
|
|||||||
|
|
||||||
// special case with signedness to prevent overflowing
|
// special case with signedness to prevent overflowing
|
||||||
// FIXME: check for prediction slowdowns!
|
// FIXME: check for prediction slowdowns!
|
||||||
const int shader1 = poly1->hash & 0x80000000 ? -1 : poly1->shader;
|
const int shader1 = (poly1->hash & 0x80000000) ? -1 : poly1->shader;
|
||||||
const int shader2 = poly2->hash & 0x80000000 ? -1 : poly2->shader;
|
const int shader2 = (poly2->hash & 0x80000000) ? -1 : poly2->shader;
|
||||||
|
|
||||||
// skywalls and horizon lines must retain their order for horizon lines to work
|
// skywalls and horizon lines must retain their order for horizon lines to work
|
||||||
if (shader1 == -1 && shader2 == -1)
|
if (shader1 == -1 && shader2 == -1)
|
||||||
@@ -183,6 +183,7 @@ static int comparePolygons(const void *p1, const void *p2)
|
|||||||
|
|
||||||
UINT32 downloaded1 = poly1->texture ? poly1->texture->downloaded : 0; // there should be a opengl texture name here, usable for comparisons
|
UINT32 downloaded1 = poly1->texture ? poly1->texture->downloaded : 0; // there should be a opengl texture name here, usable for comparisons
|
||||||
UINT32 downloaded2 = poly2->texture ? poly2->texture->downloaded : 0;
|
UINT32 downloaded2 = poly2->texture ? poly2->texture->downloaded : 0;
|
||||||
|
|
||||||
diff64 = downloaded1 - downloaded2;
|
diff64 = downloaded1 - downloaded2;
|
||||||
if (diff64 != 0) return diff64;
|
if (diff64 != 0) return diff64;
|
||||||
|
|
||||||
@@ -213,8 +214,8 @@ static int comparePolygonsNoShaders(const void *p1, const void *p2)
|
|||||||
const PolygonArrayEntry *poly1 = *(PolygonArrayEntry *const *)p1;
|
const PolygonArrayEntry *poly1 = *(PolygonArrayEntry *const *)p1;
|
||||||
const PolygonArrayEntry *poly2 = *(PolygonArrayEntry *const *)p2;
|
const PolygonArrayEntry *poly2 = *(PolygonArrayEntry *const *)p2;
|
||||||
|
|
||||||
const GLMipmap_t *texture1 = poly1->hash & 0x80000000 ? NULL : poly1->texture;
|
const GLMipmap_t *texture1 = (poly1->hash & 0x80000000) ? NULL : poly1->texture;
|
||||||
const GLMipmap_t *texture2 = poly2->hash & 0x80000000 ? NULL : poly2->texture;
|
const GLMipmap_t *texture2 = (poly2->hash & 0x80000000) ? NULL : poly2->texture;
|
||||||
|
|
||||||
// skywalls and horizon lines must retain their order for horizon lines to work
|
// skywalls and horizon lines must retain their order for horizon lines to work
|
||||||
if (!texture1 && !texture2)
|
if (!texture1 && !texture2)
|
||||||
|
|||||||
+359
-225
File diff suppressed because it is too large.
Load diff
+40
-37
@@ -446,7 +446,7 @@ typedef struct
|
|||||||
} GLMapTextureSet_t; // idk i suck at naming things
|
} GLMapTextureSet_t; // idk i suck at naming things
|
||||||
|
|
||||||
static size_t gl_numtextures = 0; // Texture count
|
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)
|
static void HWR_FreeTextureData(patch_t *patch)
|
||||||
{
|
{
|
||||||
@@ -555,7 +555,8 @@ static void HWR_FreePatchCache(boolean freeall)
|
|||||||
callback = FreeColormapsCallback;
|
callback = FreeColormapsCallback;
|
||||||
|
|
||||||
//Z_IterateTags(PU_PATCH, PU_PATCH_ROTATED, callback);
|
//Z_IterateTags(PU_PATCH, PU_PATCH_ROTATED, callback);
|
||||||
Z_IterateTags(PU_PATCH, PU_PATCH, callback);
|
//Z_IterateTags(PU_PATCH, PU_PATCH_LOWPRIORITY, callback); // we dont really need to free low priority patches here as P_FreeLevelState takes care of them
|
||||||
|
Z_IterateTag(PU_PATCH, callback);
|
||||||
Z_IterateTags(PU_SPRITE, PU_HUDGFX, callback);
|
Z_IterateTags(PU_SPRITE, PU_HUDGFX, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -570,7 +571,8 @@ void HWR_ClearAllTextures(void)
|
|||||||
/*static void HWR_FreeColormapCache(void)
|
/*static void HWR_FreeColormapCache(void)
|
||||||
{
|
{
|
||||||
HWR_FreePatchCache(false);
|
HWR_FreePatchCache(false);
|
||||||
}*/
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
void HWR_InitMapTextures(void)
|
void HWR_InitMapTextures(void)
|
||||||
{
|
{
|
||||||
@@ -612,27 +614,28 @@ void HWR_FreeMapTextures(void)
|
|||||||
gl_numtextures = 0;
|
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)
|
static void HWR_PrecacheLevelFlats(void)
|
||||||
{
|
{
|
||||||
// lookup for flats that may´ve been already loaded
|
size_t i;
|
||||||
flatcheck flatpresent;
|
|
||||||
flatcheck_init(&flatpresent);
|
|
||||||
size_t i, j;
|
|
||||||
INT32 k;
|
INT32 k;
|
||||||
|
|
||||||
|
// FIXME: this needs to account for FOFs to properly work
|
||||||
|
#ifdef GLENCORE
|
||||||
|
if (encoremap)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// special case for encore
|
// special case for encore
|
||||||
|
#if 0
|
||||||
#ifdef GLENCORE
|
#ifdef GLENCORE
|
||||||
if (encoremap)
|
if (encoremap)
|
||||||
{
|
{
|
||||||
// go through all sectors to determine if it should be remapped for encore
|
// go through all sectors to determine if it should be remapped for encore
|
||||||
for (i = 0; i < numsectors; i++)
|
for (i = 0; i < numsectors; i++)
|
||||||
{
|
{
|
||||||
|
size_t j;
|
||||||
sector_t *sec = §ors[i];
|
sector_t *sec = §ors[i];
|
||||||
|
|
||||||
// gotta check sector floor and ceiling
|
// gotta check sector floor and ceiling
|
||||||
@@ -666,6 +669,7 @@ static void HWR_PrecacheLevelFlats(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
// on non encore we have it simple
|
// on non encore we have it simple
|
||||||
@@ -674,11 +678,7 @@ static void HWR_PrecacheLevelFlats(void)
|
|||||||
{
|
{
|
||||||
const levelflat_t *levelflat = &levelflats[i];
|
const levelflat_t *levelflat = &levelflats[i];
|
||||||
|
|
||||||
if (flatcheck_is_end(flatcheck_get(&flatpresent, levelflat->lumpnum)))
|
|
||||||
{
|
|
||||||
HWR_GetFlat(levelflat->lumpnum, false);
|
HWR_GetFlat(levelflat->lumpnum, false);
|
||||||
flatcheck_insert(&flatpresent, levelflat->lumpnum);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (levelflat->speed) // is it an animated flat ?
|
if (levelflat->speed) // is it an animated flat ?
|
||||||
{
|
{
|
||||||
@@ -686,17 +686,11 @@ static void HWR_PrecacheLevelFlats(void)
|
|||||||
for (k = 0; k < levelflat->numpics; k++)
|
for (k = 0; k < levelflat->numpics; k++)
|
||||||
{
|
{
|
||||||
lumpnum_t lump = levelflat->baselumpnum + k;
|
lumpnum_t lump = levelflat->baselumpnum + k;
|
||||||
if (flatcheck_is_end(flatcheck_get(&flatpresent, lump)))
|
|
||||||
{
|
|
||||||
HWR_GetFlat(lump, false);
|
HWR_GetFlat(lump, false);
|
||||||
flatcheck_insert(&flatpresent, lump);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
flatcheck_cleanup(&flatpresent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HWR_PrecacheLevelTextures(void)
|
static void HWR_PrecacheLevelTextures(void)
|
||||||
@@ -720,13 +714,13 @@ static void HWR_PrecacheLevelTextures(void)
|
|||||||
{
|
{
|
||||||
const line_t *line = &lines[i];
|
const line_t *line = &lines[i];
|
||||||
#ifdef GLENCORE
|
#ifdef GLENCORE
|
||||||
const int noencoremap = ((encoremap && (line->flags & ML_TFERLINE)) ? 2 : 1);
|
const boolean noencoremap = (encoremap && (line->flags & ML_TFERLINE));
|
||||||
#endif
|
#endif
|
||||||
// two sides
|
// two sides
|
||||||
for (j = 0; j < 2; j++)
|
for (j = 0; j < 2; j++)
|
||||||
{
|
{
|
||||||
// check if single-sided linedef
|
// check if single-sided linedef
|
||||||
if (line->sidenum[j] == 0xffff)
|
if (line->sidenum[j] == NO_INDEX)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const side_t *side = &sides[line->sidenum[j]];
|
const side_t *side = &sides[line->sidenum[j]];
|
||||||
@@ -737,25 +731,27 @@ static void HWR_PrecacheLevelTextures(void)
|
|||||||
{
|
{
|
||||||
const INT32 texnum = sidetex[f];
|
const INT32 texnum = sidetex[f];
|
||||||
|
|
||||||
if (texnum < 0 || texnum >= (signed)gl_numtextures)
|
if (texnum <= 0 || (unsigned)texnum >= gl_numtextures)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (texturepresent[texnum])
|
if (!(texturepresent[texnum] & 1))
|
||||||
continue;
|
{
|
||||||
#ifdef GLENCORE
|
texturepresent[texnum] |= 1;
|
||||||
texturepresent[texnum] = 1|noencoremap;
|
|
||||||
#else
|
|
||||||
texturepresent[texnum] = 1;
|
|
||||||
#endif
|
|
||||||
HWR_GetTexture(texnum, false);
|
HWR_GetTexture(texnum, false);
|
||||||
|
}
|
||||||
#ifdef GLENCORE
|
#ifdef GLENCORE
|
||||||
if (noencoremap & 2)
|
if (noencoremap
|
||||||
|
&& !(texturepresent[texnum] & 2))
|
||||||
|
{
|
||||||
|
texturepresent[texnum] |= 2;
|
||||||
HWR_GetTexture(texnum, true);
|
HWR_GetTexture(texnum, true);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check for animated textures
|
||||||
for (anim = anims; anim < lastanim; anim++)
|
for (anim = anims; anim < lastanim; anim++)
|
||||||
{
|
{
|
||||||
if (!anim->istexture)
|
if (!anim->istexture)
|
||||||
@@ -774,6 +770,7 @@ static void HWR_PrecacheLevelTextures(void)
|
|||||||
{
|
{
|
||||||
HWR_GetTexture(animtexnum, false);
|
HWR_GetTexture(animtexnum, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GLENCORE
|
#ifdef GLENCORE
|
||||||
if (texpresent & 2)
|
if (texpresent & 2)
|
||||||
{
|
{
|
||||||
@@ -895,7 +892,7 @@ GLMapTexture_t *HWR_GetTexture(INT32 tex, boolean noencore)
|
|||||||
GLMapTexture_t *gltex;
|
GLMapTexture_t *gltex;
|
||||||
GLMipmap_t *glMipmap;
|
GLMipmap_t *glMipmap;
|
||||||
|
|
||||||
if (tex < 0 || tex >= (signed)gl_numtextures)
|
if (tex < 0 || (unsigned)tex >= gl_numtextures)
|
||||||
{
|
{
|
||||||
#ifdef PARANOIA
|
#ifdef PARANOIA
|
||||||
I_Error("HWR_GetTexture: Invalid texture ID %d", tex);
|
I_Error("HWR_GetTexture: Invalid texture ID %d", tex);
|
||||||
@@ -989,18 +986,18 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum)
|
|||||||
|
|
||||||
flat[steppy] = glMipmap->colormap->source[flat[steppy]];
|
flat[steppy] = glMipmap->colormap->source[flat[steppy]];
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (haschromakey)
|
if (haschromakey)
|
||||||
{
|
{
|
||||||
const char *flatname = W_CheckNameForNum(flatlumpnum);
|
const char *flatname = W_CheckNameForNum(flatlumpnum);
|
||||||
|
|
||||||
// hack for gba rainbow roads cyan floors
|
// hack for gba rainbow roads cyan floors
|
||||||
if (UNLIKELY(memcmp(flatname, "GBA_RRF5", 8) == 0 && flatname[8] == 0))
|
if (UNLIKELY(flatname && memcmp(flatname, "GBA_RRF5", 8) == 0 && flatname[8] == 0))
|
||||||
{
|
{
|
||||||
glMipmap->flags &= ~TF_CHROMAKEYED;
|
glMipmap->flags &= ~TF_CHROMAKEYED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Download a Doom 'flat' to the hardware cache and make it ready for use
|
// Download a Doom 'flat' to the hardware cache and make it ready for use
|
||||||
@@ -1127,7 +1124,9 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
|
|||||||
HWR_UpdatePatchMipmap(patch, glMipmap);
|
HWR_UpdatePatchMipmap(patch, glMipmap);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
HWR_LoadPatchMipmap(patch, glMipmap);
|
HWR_LoadPatchMipmap(patch, glMipmap);
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1309,6 +1308,7 @@ void HWR_SetPalette(RGBA_t *palette)
|
|||||||
crushed_palette[i].s.blue = (UINT8)(fblue / 31.0f * 255.0f);
|
crushed_palette[i].s.blue = (UINT8)(fblue / 31.0f * 255.0f);
|
||||||
crushed_palette[i].s.alpha = 255;
|
crushed_palette[i].s.alpha = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
GL_SetScreenPalette(crushed_palette);
|
GL_SetScreenPalette(crushed_palette);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1386,6 +1386,7 @@ void HWR_SetMapPalette(void)
|
|||||||
I_Error("HWR_SetMapPalette: A programmer assumed palette lumps are at least 768 bytes long, but apparently this was a wrong assumption!\n");
|
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 = (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.
|
// we got the RGB palette now, but we need it in RGBA format.
|
||||||
for (i = 0; i < 256; i++)
|
for (i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
@@ -1394,6 +1395,7 @@ void HWR_SetMapPalette(void)
|
|||||||
RGBA_converted[i].s.blue = *(RGB_data++);
|
RGBA_converted[i].s.blue = *(RGB_data++);
|
||||||
RGBA_converted[i].s.alpha = 255;
|
RGBA_converted[i].s.alpha = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
palette = RGBA_converted;
|
palette = RGBA_converted;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1401,6 +1403,7 @@ void HWR_SetMapPalette(void)
|
|||||||
if (memcmp(mapPalette, palette, sizeof(mapPalette)))
|
if (memcmp(mapPalette, palette, sizeof(mapPalette)))
|
||||||
{
|
{
|
||||||
memcpy(mapPalette, palette, sizeof(mapPalette));
|
memcpy(mapPalette, palette, sizeof(mapPalette));
|
||||||
|
|
||||||
// in palette rendering mode, this means that all rgba textures now have wrong colors
|
// in palette rendering mode, this means that all rgba textures now have wrong colors
|
||||||
// and the lookup table is outdated
|
// and the lookup table is outdated
|
||||||
HWR_SetPaletteLookup(mapPalette);
|
HWR_SetPaletteLookup(mapPalette);
|
||||||
|
|||||||
@@ -319,16 +319,17 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
|
|||||||
double clipfov;
|
double clipfov;
|
||||||
double floatangle;
|
double floatangle;
|
||||||
angle_t a1;
|
angle_t a1;
|
||||||
|
float tilt;
|
||||||
float tilt = fabsf(((float)(int)tiltangle) / (float)ANG1);
|
|
||||||
|
|
||||||
if (tilt > 90.0f)
|
|
||||||
tilt = 90.0f;
|
|
||||||
|
|
||||||
// If the pitch is larger than this you can look all around at a FOV of 90
|
// If the pitch is larger than this you can look all around at a FOV of 90
|
||||||
if (abs((signed)tiltangle) > 46 * ANG1)
|
if (abs((signed)tiltangle) > 46 * ANG1)
|
||||||
return 0xffffffff;
|
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...
|
// ok, this is a gross hack that barely works...
|
||||||
// but at least it doesn't overestimate too much...
|
// but at least it doesn't overestimate too much...
|
||||||
clipfov = atan(1 / (GLdouble)projMatrix[0]) * 360.0 / M_PI;
|
clipfov = atan(1 / (GLdouble)projMatrix[0]) * 360.0 / M_PI;
|
||||||
|
|||||||
@@ -96,7 +96,6 @@ typedef struct
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
fixed_t x2, y2, z2;
|
|
||||||
} polyvertex_t;
|
} polyvertex_t;
|
||||||
|
|
||||||
// a convex 'plane' polygon, clockwise order
|
// a convex 'plane' polygon, clockwise order
|
||||||
|
|||||||
+24
-20
@@ -32,20 +32,6 @@
|
|||||||
|
|
||||||
#include <fcntl.h>
|
#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[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_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};
|
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];
|
FOutVector v[4];
|
||||||
FBITFIELD flags;
|
FBITFIELD flags;
|
||||||
float cx = FIXED_TO_FLOAT(x);
|
float cx, cy;
|
||||||
float cy = FIXED_TO_FLOAT(y);
|
|
||||||
UINT8 alphalevel = ((option & V_ALPHAMASK) >> V_ALPHASHIFT);
|
UINT8 alphalevel = ((option & V_ALPHAMASK) >> V_ALPHASHIFT);
|
||||||
UINT8 blendmode = ((bflags & V_BLENDMASK) >> V_BLENDSHIFT);
|
UINT8 blendmode = ((bflags & V_BLENDMASK) >> V_BLENDSHIFT);
|
||||||
GLPatch_t *hwrPatch;
|
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)
|
if (alphalevel >= 10 && alphalevel < 13)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
cx = FIXED_TO_FLOAT(x);
|
||||||
|
cy = FIXED_TO_FLOAT(y);
|
||||||
|
|
||||||
const float fvw = (float)vid.width;
|
const float fvw = (float)vid.width;
|
||||||
const float fvh = (float)vid.height;
|
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)
|
if (!column->topdelta)
|
||||||
{
|
{
|
||||||
const UINT8 *source = (const UINT8 *)(column) + 3;
|
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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,8 +232,7 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
|||||||
{
|
{
|
||||||
FOutVector v[4];
|
FOutVector v[4];
|
||||||
FBITFIELD flags;
|
FBITFIELD flags;
|
||||||
float cx = FIXED_TO_FLOAT(x);
|
float cx, cy;
|
||||||
float cy = FIXED_TO_FLOAT(y);
|
|
||||||
UINT8 alphalevel = ((option & V_ALPHAMASK) >> V_ALPHASHIFT);
|
UINT8 alphalevel = ((option & V_ALPHAMASK) >> V_ALPHASHIFT);
|
||||||
GLPatch_t *hwrPatch;
|
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)
|
if (alphalevel >= 10 && alphalevel < 13)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
cx = FIXED_TO_FLOAT(x);
|
||||||
|
cy = FIXED_TO_FLOAT(y);
|
||||||
|
|
||||||
const float fvw = (float)vid.width;
|
const float fvw = (float)vid.width;
|
||||||
const float fvh = (float)vid.height;
|
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)
|
if (!column->topdelta)
|
||||||
{
|
{
|
||||||
const UINT8 *source = (const UINT8 *)(column) + 3;
|
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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -964,6 +954,20 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef USE_PNG
|
#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
|
// save screenshots with TGA format
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -32,8 +32,12 @@ void GL_SetSpecialState(hwdspecialstate_t IdState, INT32 Value);
|
|||||||
void GL_SetTransform(FTransform *stransform);
|
void GL_SetTransform(FTransform *stransform);
|
||||||
void GL_SetBlend(FBITFIELD PolyFlags);
|
void GL_SetBlend(FBITFIELD PolyFlags);
|
||||||
void GL_SetPalette(RGBA_t *palette);
|
void GL_SetPalette(RGBA_t *palette);
|
||||||
|
|
||||||
void GL_ClearBuffer(FBOOLEAN ColorMask, FBOOLEAN DepthMask, FBOOLEAN StencilMask, FRGBAFloat * ClearColor);
|
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_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_DrawIndexedTriangles(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags, unsigned int *IndexArray);
|
||||||
void GL_Draw2DLine(F2DCoord *v1, F2DCoord *v2, RGBA_t Color);
|
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_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags);
|
||||||
void GL_DoScreenWipe(int wipeStart, int wipeEnd);
|
void GL_DoScreenWipe(int wipeStart, int wipeEnd);
|
||||||
void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8 downdistort, UINT8 barsize);
|
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]);
|
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);
|
boolean GL_CompileShader(int slot);
|
||||||
void GL_SetShader(int slot);
|
void GL_SetShader(int slot);
|
||||||
void GL_UnSetShader(void);
|
void GL_UnSetShader(void);
|
||||||
|
void GL_EnableShader(void);
|
||||||
|
|
||||||
void GL_SetShaderInfo(hwdshaderinfo_t info, INT32 value);
|
void GL_SetShaderInfo(hwdshaderinfo_t info, INT32 value);
|
||||||
|
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ typedef struct gl_vissprite_s
|
|||||||
float gz, gzt;
|
float gz, gzt;
|
||||||
float tz;
|
float tz;
|
||||||
float scale;
|
float scale;
|
||||||
float spritexscale, spriteyscale;
|
//float spritexscale, spriteyscale;
|
||||||
float spritexoffset, spriteyoffset;
|
//float spritexoffset, spriteyoffset;
|
||||||
patch_t *gpatch;
|
patch_t *gpatch;
|
||||||
boolean flip;
|
boolean flip;
|
||||||
UINT8 translucency; //alpha level 0-255
|
UINT8 translucency; //alpha level 0-255
|
||||||
@@ -54,7 +54,7 @@ void HWR_ObjectLightLevelPost(gl_vissprite_t *spr, const sector_t *sector, INT32
|
|||||||
// --------
|
// --------
|
||||||
extern extrasubsector_t *extrasubsectors;
|
extern extrasubsector_t *extrasubsectors;
|
||||||
#ifdef PARANOIA
|
#ifdef PARANOIA
|
||||||
extern size_t addsubsector;
|
extern size_t num_extra_subsector;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void HWR_FreeExtraSubsectors(void);
|
void HWR_FreeExtraSubsectors(void);
|
||||||
|
|||||||
+488
-500
File diff suppressed because it is too large.
Load diff
@@ -43,7 +43,6 @@ void HWR_Startup(void);
|
|||||||
void HWR_Shutdown(void);
|
void HWR_Shutdown(void);
|
||||||
|
|
||||||
extern unsigned msaa;
|
extern unsigned msaa;
|
||||||
extern boolean a2c;
|
|
||||||
|
|
||||||
extern FTransform atransform;
|
extern FTransform atransform;
|
||||||
extern float gl_viewsin, gl_viewcos;
|
extern float gl_viewsin, gl_viewcos;
|
||||||
@@ -102,7 +101,7 @@ void HWR_SetViewSize(void);
|
|||||||
void HWR_AddCommands(void);
|
void HWR_AddCommands(void);
|
||||||
|
|
||||||
void HWR_RenderPlayerView(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_ClearSkyDome(void);
|
||||||
void HWR_BuildSkyDome(void);
|
void HWR_BuildSkyDome(void);
|
||||||
@@ -151,14 +150,19 @@ FUNCINLINE static ATTRINLINE void HWR_RenderVhsEffect(fixed_t upbary, fixed_t do
|
|||||||
GL_RenderVhsEffect(upbary, downbary, updistort, downdistort, barsize);
|
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)
|
FUNCINLINE static ATTRINLINE void HWR_MakeScreenFinalTexture(void)
|
||||||
{
|
{
|
||||||
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC2);
|
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
|
// hw_main.c: Segs
|
||||||
|
|||||||
+12
-10
@@ -1146,15 +1146,18 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
|
|||||||
|
|
||||||
// Look at HWR_ProjectSprite for more
|
// Look at HWR_ProjectSprite for more
|
||||||
{
|
{
|
||||||
md2_t *md2s;
|
md2_t *md2s = NULL;
|
||||||
int skinnum;
|
int skinnum = 0;
|
||||||
patch_t *gpatch, *blendgpatch;
|
patch_t *gpatch, *blendgpatch;
|
||||||
GLPatch_t *hwrPatch = NULL, *hwrBlendPatch = NULL;
|
GLPatch_t *hwrPatch = NULL, *hwrBlendPatch = NULL;
|
||||||
INT32 durs = spr->mobj->state->tics;
|
INT32 durs = spr->mobj->state->tics;
|
||||||
INT32 tics = spr->mobj->tics;
|
INT32 tics = spr->mobj->tics;
|
||||||
//mdlframe_t *next = NULL;
|
//mdlframe_t *next = NULL;
|
||||||
|
|
||||||
|
//const UINT8 flip = (UINT8)(!(spr->mobj->eflags & MFE_VERTICALFLIP) != !R_ThingVerticallyFlipped(spr->mobj)); // :chaosleep:
|
||||||
const UINT8 flip = (UINT8)((spr->mobj->eflags & MFE_VERTICALFLIP) == MFE_VERTICALFLIP);
|
const UINT8 flip = (UINT8)((spr->mobj->eflags & MFE_VERTICALFLIP) == MFE_VERTICALFLIP);
|
||||||
const UINT8 hflip = (UINT8)(!(spr->mobj->mirrored) != !(spr->mobj->frame & FF_HORIZONTALFLIP));
|
const UINT8 hflip = (UINT8)(!(spr->mobj->mirrored) != !R_ThingHorizontallyFlipped(spr->mobj));
|
||||||
|
|
||||||
spritedef_t *sprdef;
|
spritedef_t *sprdef;
|
||||||
spriteframe_t *sprframe;
|
spriteframe_t *sprframe;
|
||||||
spriteinfo_t *sprinfo;
|
spriteinfo_t *sprinfo;
|
||||||
@@ -1218,7 +1221,7 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
|
|||||||
skinnum = (skin_t *)spr->mobj->localskin - skins;
|
skinnum = (skin_t *)spr->mobj->localskin - skins;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (spr->mobj->skin)
|
||||||
{
|
{
|
||||||
md2s = md2_playermodels;
|
md2s = md2_playermodels;
|
||||||
skinnum = (skin_t *)spr->mobj->skin - skins;
|
skinnum = (skin_t *)spr->mobj->skin - skins;
|
||||||
@@ -1244,7 +1247,7 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
|
|||||||
if (!md2->model)
|
if (!md2->model)
|
||||||
{
|
{
|
||||||
CONS_Debug(DBG_RENDER, "Loading model... (%s, %s)", sprnames[spr->mobj->sprite], md2->filename);
|
CONS_Debug(DBG_RENDER, "Loading model... (%s, %s)", sprnames[spr->mobj->sprite], md2->filename);
|
||||||
sprintf(filename, "mdls/%s", md2->filename);
|
snprintf(filename, sizeof(filename), "mdls/%s", md2->filename);
|
||||||
md2->model = md2_readModel(filename);
|
md2->model = md2_readModel(filename);
|
||||||
|
|
||||||
if (md2->model)
|
if (md2->model)
|
||||||
@@ -1400,12 +1403,11 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
|
|||||||
|
|
||||||
const angle_t sliptideroll = ((cv_sliptideroll.value && spr->mobj->player) ? spr->mobj->player->sliproll : 0);
|
const angle_t sliptideroll = ((cv_sliptideroll.value && spr->mobj->player) ? spr->mobj->player->sliproll : 0);
|
||||||
const SINT8 flipfactor = flip ? -1 : 1;
|
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
|
angle_t rollang = sliptideroll ? (thingrollangle + (sliptideroll * spr->mobj->player->kartstuff[k_aizdriftstrat])) : thingrollangle;
|
||||||
? (spr->mobj->rollangle) + (sliptideroll * spr->mobj->player->kartstuff[k_aizdriftstrat])
|
|
||||||
: (spr->mobj->rollangle);
|
|
||||||
|
|
||||||
rollang *= flipfactor;
|
rollang *= flipfactor;
|
||||||
|
|
||||||
@@ -1481,7 +1483,7 @@ void HWR_Draw2DModel(md2_t *md2, INT32 x, INT32 y, INT32 skinnum, skincolors_t c
|
|||||||
{
|
{
|
||||||
char filename[64];
|
char filename[64];
|
||||||
CONS_Debug(DBG_RENDER, "Loading model... (%s)\n", md2->filename);
|
CONS_Debug(DBG_RENDER, "Loading model... (%s)\n", md2->filename);
|
||||||
sprintf(filename, "mdls/%s", md2->filename);
|
snprintf(filename, sizeof(filename), "mdls/%s", md2->filename);
|
||||||
md2->model = md2_readModel(filename);
|
md2->model = md2_readModel(filename);
|
||||||
|
|
||||||
if (md2->model)
|
if (md2->model)
|
||||||
|
|||||||
@@ -275,13 +275,6 @@ model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
retModel = (model_t*)Z_Calloc(sizeof(model_t), ztag, NULL);
|
retModel = (model_t*)Z_Calloc(sizeof(model_t), ztag, NULL);
|
||||||
|
|
||||||
//size_t fileLen;
|
|
||||||
|
|
||||||
//int i, j;
|
|
||||||
|
|
||||||
//size_t namelen;
|
|
||||||
//char *texturefilename;
|
|
||||||
texPos = strchr(fileName, '/');
|
texPos = strchr(fileName, '/');
|
||||||
|
|
||||||
if (texPos)
|
if (texPos)
|
||||||
@@ -318,8 +311,6 @@ model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
retModel->numMeshes = 1; // MD2 only has one mesh
|
retModel->numMeshes = 1; // MD2 only has one mesh
|
||||||
retModel->meshes = (mesh_t*)Z_Calloc(sizeof(mesh_t) * retModel->numMeshes, ztag, NULL);
|
retModel->meshes = (mesh_t*)Z_Calloc(sizeof(mesh_t) * retModel->numMeshes, ztag, NULL);
|
||||||
retModel->meshes[0].numFrames = header->numFrames;
|
retModel->meshes[0].numFrames = header->numFrames;
|
||||||
// const float WUNITS = 1.0f;
|
|
||||||
// float dataScale = WUNITS;
|
|
||||||
|
|
||||||
// Tris and ST are simple structures that can be straight-copied
|
// Tris and ST are simple structures that can be straight-copied
|
||||||
tris = (md2triangle_t*)&buffer[header->offsetTris];
|
tris = (md2triangle_t*)&buffer[header->offsetTris];
|
||||||
@@ -355,47 +346,6 @@ model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
retModel->materials[t].specular[3] = 1.0f;
|
retModel->materials[t].specular[3] = 1.0f;
|
||||||
retModel->materials[t].shininess = 0.0f;
|
retModel->materials[t].shininess = 0.0f;
|
||||||
retModel->materials[t].spheremap = false;
|
retModel->materials[t].spheremap = false;
|
||||||
|
|
||||||
/* retModel->materials[t].texture = Texture::ReadTexture((char*)texturefilename, ZT_TEXTURE);
|
|
||||||
|
|
||||||
if (!systemSucks)
|
|
||||||
{
|
|
||||||
// Check for a normal map...??
|
|
||||||
char openfilename[1024];
|
|
||||||
char normalMapName[1024];
|
|
||||||
strcpy(normalMapName, texturefilename);
|
|
||||||
size_t len = strlen(normalMapName);
|
|
||||||
char *ptr = &normalMapName[len];
|
|
||||||
ptr--; // z
|
|
||||||
ptr--; // u
|
|
||||||
ptr--; // b
|
|
||||||
ptr--; // .
|
|
||||||
*ptr++ = '_';
|
|
||||||
*ptr++ = 'n';
|
|
||||||
*ptr++ = '.';
|
|
||||||
*ptr++ = 'b';
|
|
||||||
*ptr++ = 'u';
|
|
||||||
*ptr++ = 'z';
|
|
||||||
*ptr++ = '\0';
|
|
||||||
|
|
||||||
sprintf(openfilename, "%s/%s", "textures", normalMapName);
|
|
||||||
// Convert backslashes to forward slashes
|
|
||||||
for (int k = 0; k < 1024; k++)
|
|
||||||
{
|
|
||||||
if (openfilename[k] == '\0')
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (openfilename[k] == '\\')
|
|
||||||
openfilename[k] = '/';
|
|
||||||
}
|
|
||||||
|
|
||||||
Resource::resource_t *res = Resource::Open(openfilename);
|
|
||||||
if (res)
|
|
||||||
{
|
|
||||||
Resource::Close(res);
|
|
||||||
retModel->materials[t].lightmap = Texture::ReadTexture(normalMapName, ZT_TEXTURE);
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
retModel->meshes[0].numTriangles = header->numTris;
|
retModel->meshes[0].numTriangles = header->numTris;
|
||||||
@@ -425,15 +375,11 @@ model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
md2frame_t *framePtr = (md2frame_t*)ptr;
|
md2frame_t *framePtr = (md2frame_t*)ptr;
|
||||||
retModel->meshes[0].tinyframes[i].vertices = (short*)Z_Malloc(sizeof(short) * 3 * header->numXYZ, ztag, NULL);
|
retModel->meshes[0].tinyframes[i].vertices = (short*)Z_Malloc(sizeof(short) * 3 * header->numXYZ, ztag, NULL);
|
||||||
retModel->meshes[0].tinyframes[i].normals = (char*)Z_Malloc(sizeof(char) * 3 * header->numXYZ, ztag, NULL);
|
retModel->meshes[0].tinyframes[i].normals = (char*)Z_Malloc(sizeof(char) * 3 * header->numXYZ, ztag, NULL);
|
||||||
|
|
||||||
// if (retModel->materials[0].lightmap)
|
|
||||||
// retModel->meshes[0].tinyframes[i].tangents = (char*)malloc(sizeof(char));//(char*)Z_Malloc(sizeof(char)*3*header->numVerts, ztag);
|
|
||||||
retModel->meshes[0].indices = (unsigned short*)Z_Malloc(sizeof(unsigned short) * 3 * header->numTris, ztag, NULL);
|
retModel->meshes[0].indices = (unsigned short*)Z_Malloc(sizeof(unsigned short) * 3 * header->numTris, ztag, NULL);
|
||||||
|
|
||||||
vertptr = retModel->meshes[0].tinyframes[i].vertices;
|
vertptr = retModel->meshes[0].tinyframes[i].vertices;
|
||||||
normptr = retModel->meshes[0].tinyframes[i].normals;
|
normptr = retModel->meshes[0].tinyframes[i].normals;
|
||||||
|
|
||||||
// tanptr = retModel->meshes[0].tinyframes[i].tangents;
|
|
||||||
retModel->meshes[0].tinyframes[i].material = &retModel->materials[0];
|
retModel->meshes[0].tinyframes[i].material = &retModel->materials[0];
|
||||||
|
|
||||||
framePtr++; // Advance to vertex list
|
framePtr++; // Advance to vertex list
|
||||||
@@ -509,9 +455,7 @@ model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
md2frame_t *framePtr = (md2frame_t*)ptr;
|
md2frame_t *framePtr = (md2frame_t*)ptr;
|
||||||
retModel->meshes[0].frames[i].normals = (float*)Z_Malloc(sizeof(float) * 3 * header->numTris * 3, ztag, NULL);
|
retModel->meshes[0].frames[i].normals = (float*)Z_Malloc(sizeof(float) * 3 * header->numTris * 3, ztag, NULL);
|
||||||
retModel->meshes[0].frames[i].vertices = (float*)Z_Malloc(sizeof(float) * 3 * header->numTris * 3, ztag, NULL);
|
retModel->meshes[0].frames[i].vertices = (float*)Z_Malloc(sizeof(float) * 3 * header->numTris * 3, ztag, NULL);
|
||||||
// if (retModel->materials[0].lightmap)
|
|
||||||
// retModel->meshes[0].frames[i].tangents = (float*)malloc(sizeof(float));//(float*)Z_Malloc(sizeof(float)*3*header->numTris*3, ztag);
|
|
||||||
//float *vertptr, *normptr;
|
|
||||||
normptr = (float*)retModel->meshes[0].frames[i].normals;
|
normptr = (float*)retModel->meshes[0].frames[i].normals;
|
||||||
vertptr = (float*)retModel->meshes[0].frames[i].vertices;
|
vertptr = (float*)retModel->meshes[0].frames[i].vertices;
|
||||||
trisPtr = tris;
|
trisPtr = tris;
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
char *buffer;
|
char *buffer;
|
||||||
int surfEnd;
|
int surfEnd;
|
||||||
int i, t;
|
int i, t;
|
||||||
int matCount;
|
//int matCount;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
|
||||||
if (!latlnginit)
|
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);
|
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++)
|
for (i = 0, surfEnd = 0; i < mdh->numSurfaces; i++)
|
||||||
{
|
{
|
||||||
int j;
|
int j;
|
||||||
@@ -237,54 +237,12 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
|
|
||||||
mdShader = (md3Shader*)((char*)mdS + mdS->offsetShaders);
|
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);
|
size_t len = strlen(mdShader[j].name);
|
||||||
mdShader[j].name[len-1] = 'z';
|
mdShader[j].name[len-1] = 'z';
|
||||||
mdShader[j].name[len-2] = 'u';
|
mdShader[j].name[len-2] = 'u';
|
||||||
mdShader[j].name[len-3] = 'b';
|
mdShader[j].name[len-3] = 'b';
|
||||||
|
|
||||||
// Load material
|
|
||||||
/* retModel->materials[matCount].texture = Texture::ReadTexture(mdShader[j].name, ZT_TEXTURE);
|
|
||||||
|
|
||||||
if (!systemSucks)
|
|
||||||
{
|
|
||||||
// Check for a normal map...??
|
|
||||||
char openfilename[1024];
|
|
||||||
char normalMapName[1024];
|
|
||||||
strcpy(normalMapName, mdShader[j].name);
|
|
||||||
len = strlen(normalMapName);
|
|
||||||
char *ptr = &normalMapName[len];
|
|
||||||
ptr--; // z
|
|
||||||
ptr--; // u
|
|
||||||
ptr--; // b
|
|
||||||
ptr--; // .
|
|
||||||
*ptr++ = '_';
|
|
||||||
*ptr++ = 'n';
|
|
||||||
*ptr++ = '.';
|
|
||||||
*ptr++ = 'b';
|
|
||||||
*ptr++ = 'u';
|
|
||||||
*ptr++ = 'z';
|
|
||||||
*ptr++ = '\0';
|
|
||||||
|
|
||||||
sprintf(openfilename, "%s/%s", "textures", normalMapName);
|
|
||||||
// Convert backslashes to forward slashes
|
|
||||||
for (int k = 0; k < 1024; k++)
|
|
||||||
{
|
|
||||||
if (openfilename[k] == '\0')
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (openfilename[k] == '\\')
|
|
||||||
openfilename[k] = '/';
|
|
||||||
}
|
|
||||||
|
|
||||||
Resource::resource_t *res = Resource::Open(openfilename);
|
|
||||||
if (res)
|
|
||||||
{
|
|
||||||
Resource::Close(res);
|
|
||||||
retModel->materials[matCount].lightmap = Texture::ReadTexture(normalMapName, ZT_TEXTURE);
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
retModel->meshes[i].numFrames = mdS->numFrames;
|
retModel->meshes[i].numFrames = mdS->numFrames;
|
||||||
@@ -305,19 +263,15 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
{
|
{
|
||||||
short *vertptr;
|
short *vertptr;
|
||||||
char *normptr;
|
char *normptr;
|
||||||
// char *tanptr;
|
|
||||||
int k;
|
int k;
|
||||||
md3Vertex *mdV = (md3Vertex*)((char*)mdS + mdS->offsetXYZNormal + (mdS->numVerts*j*sizeof(md3Vertex)));
|
md3Vertex *mdV = (md3Vertex*)((char*)mdS + mdS->offsetXYZNormal + (mdS->numVerts*j*sizeof(md3Vertex)));
|
||||||
retModel->meshes[i].tinyframes[j].vertices = (short*)Z_Malloc(sizeof(short)*3*mdS->numVerts, ztag, NULL);
|
retModel->meshes[i].tinyframes[j].vertices = (short*)Z_Malloc(sizeof(short)*3*mdS->numVerts, ztag, NULL);
|
||||||
retModel->meshes[i].tinyframes[j].normals = (char*)Z_Malloc(sizeof(char)*3*mdS->numVerts, ztag, NULL);
|
retModel->meshes[i].tinyframes[j].normals = (char*)Z_Malloc(sizeof(char)*3*mdS->numVerts, ztag, NULL);
|
||||||
|
|
||||||
// if (retModel->materials[0].lightmap)
|
|
||||||
// retModel->meshes[i].tinyframes[j].tangents = (char*)malloc(sizeof(char));//(char*)Z_Malloc(sizeof(char)*3*mdS->numVerts, ztag);
|
|
||||||
retModel->meshes[i].indices = (unsigned short*)Z_Malloc(sizeof(unsigned short) * 3 * mdS->numTriangles, ztag, NULL);
|
retModel->meshes[i].indices = (unsigned short*)Z_Malloc(sizeof(unsigned short) * 3 * mdS->numTriangles, ztag, NULL);
|
||||||
vertptr = retModel->meshes[i].tinyframes[j].vertices;
|
vertptr = retModel->meshes[i].tinyframes[j].vertices;
|
||||||
normptr = retModel->meshes[i].tinyframes[j].normals;
|
normptr = retModel->meshes[i].tinyframes[j].normals;
|
||||||
|
|
||||||
// tanptr = retModel->meshes[i].tinyframes[j].tangents;
|
|
||||||
retModel->meshes[i].tinyframes[j].material = &retModel->materials[i];
|
retModel->meshes[i].tinyframes[j].material = &retModel->materials[i];
|
||||||
|
|
||||||
for (k = 0; k < mdS->numVerts; k++)
|
for (k = 0; k < mdS->numVerts; k++)
|
||||||
@@ -384,8 +338,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
md3Vertex *mdV = (md3Vertex*)((char*)mdS + mdS->offsetXYZNormal + (mdS->numVerts*j*sizeof(md3Vertex)));
|
md3Vertex *mdV = (md3Vertex*)((char*)mdS + mdS->offsetXYZNormal + (mdS->numVerts*j*sizeof(md3Vertex)));
|
||||||
retModel->meshes[i].frames[j].vertices = (float*)Z_Malloc(sizeof(float)*3*mdS->numTriangles*3, ztag, NULL);
|
retModel->meshes[i].frames[j].vertices = (float*)Z_Malloc(sizeof(float)*3*mdS->numTriangles*3, ztag, NULL);
|
||||||
retModel->meshes[i].frames[j].normals = (float*)Z_Malloc(sizeof(float)*3*mdS->numTriangles*3, ztag, NULL);
|
retModel->meshes[i].frames[j].normals = (float*)Z_Malloc(sizeof(float)*3*mdS->numTriangles*3, ztag, NULL);
|
||||||
// if (retModel->materials[i].lightmap)
|
|
||||||
// retModel->meshes[i].frames[j].tangents = (float*)malloc(sizeof(float));//(float*)Z_Malloc(sizeof(float)*3*mdS->numTriangles*3, ztag);
|
|
||||||
vertptr = retModel->meshes[i].frames[j].vertices;
|
vertptr = retModel->meshes[i].frames[j].vertices;
|
||||||
normptr = retModel->meshes[i].frames[j].normals;
|
normptr = retModel->meshes[i].frames[j].normals;
|
||||||
retModel->meshes[i].frames[j].material = &retModel->materials[i];
|
retModel->meshes[i].frames[j].material = &retModel->materials[i];
|
||||||
@@ -471,38 +424,6 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
// Tags?
|
|
||||||
retModel->numTags = mdh->numTags;
|
|
||||||
retModel->maxNumFrames = mdh->numFrames;
|
|
||||||
retModel->tags = (tag_t*)Z_Calloc(sizeof(tag_t) * retModel->numTags * mdh->numFrames, ztag);
|
|
||||||
md3Tag *mdTag = (md3Tag*)&buffer[mdh->offsetTags];
|
|
||||||
tag_t *curTag = retModel->tags;
|
|
||||||
for (i = 0; i < mdh->numFrames; i++)
|
|
||||||
{
|
|
||||||
int j;
|
|
||||||
for (j = 0; j < retModel->numTags; j++, mdTag++)
|
|
||||||
{
|
|
||||||
strcpys(curTag->name, mdTag->name, sizeof(curTag->name) / sizeof(char));
|
|
||||||
curTag->transform.m[0][0] = mdTag->axis[0];
|
|
||||||
curTag->transform.m[0][1] = mdTag->axis[1];
|
|
||||||
curTag->transform.m[0][2] = mdTag->axis[2];
|
|
||||||
curTag->transform.m[1][0] = mdTag->axis[3];
|
|
||||||
curTag->transform.m[1][1] = mdTag->axis[4];
|
|
||||||
curTag->transform.m[1][2] = mdTag->axis[5];
|
|
||||||
curTag->transform.m[2][0] = mdTag->axis[6];
|
|
||||||
curTag->transform.m[2][1] = mdTag->axis[7];
|
|
||||||
curTag->transform.m[2][2] = mdTag->axis[8];
|
|
||||||
curTag->transform.m[3][0] = mdTag->origin[0] * WUNITS;
|
|
||||||
curTag->transform.m[3][1] = mdTag->origin[1] * WUNITS;
|
|
||||||
curTag->transform.m[3][2] = mdTag->origin[2] * WUNITS;
|
|
||||||
curTag->transform.m[3][3] = 1.0f;
|
|
||||||
|
|
||||||
Matrix::Rotate(&curTag->transform, 90.0f, &Vector::Xaxis);
|
|
||||||
curTag++;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
free(buffer);
|
free(buffer);
|
||||||
|
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float
|
|||||||
HWR_PortalFrame(portal);
|
HWR_PortalFrame(portal);
|
||||||
|
|
||||||
// call HWR_RenderViewpoint
|
// call HWR_RenderViewpoint
|
||||||
HWR_RenderPortalViewpoint(portal, stencil_level + 1, true);
|
HWR_RenderPortalViewpoint(portal, stencil_level + 1);
|
||||||
|
|
||||||
// return to current frame
|
// return to current frame
|
||||||
if (rootportal)
|
if (rootportal)
|
||||||
|
|||||||
@@ -365,13 +365,17 @@ static void HWR_CompileShader(int index)
|
|||||||
if (vertex_source)
|
if (vertex_source)
|
||||||
{
|
{
|
||||||
char *preprocessed = HWR_PreprocessShader(vertex_source);
|
char *preprocessed = HWR_PreprocessShader(vertex_source);
|
||||||
if (!preprocessed) return;
|
if (!preprocessed)
|
||||||
|
return;
|
||||||
|
|
||||||
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_VERTEX);
|
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_VERTEX);
|
||||||
}
|
}
|
||||||
if (fragment_source)
|
if (fragment_source)
|
||||||
{
|
{
|
||||||
char *preprocessed = HWR_PreprocessShader(fragment_source);
|
char *preprocessed = HWR_PreprocessShader(fragment_source);
|
||||||
if (!preprocessed) return;
|
if (!preprocessed)
|
||||||
|
return;
|
||||||
|
|
||||||
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_FRAGMENT);
|
GL_LoadShader(index, preprocessed, HWD_SHADERSTAGE_FRAGMENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -387,8 +391,10 @@ void HWR_CompileShaders(void)
|
|||||||
{
|
{
|
||||||
int custom_index = gl_shadertargets[i].custom_shader;
|
int custom_index = gl_shadertargets[i].custom_shader;
|
||||||
HWR_CompileShader(i);
|
HWR_CompileShader(i);
|
||||||
|
|
||||||
if (!gl_shaders[i].compiled)
|
if (!gl_shaders[i].compiled)
|
||||||
CONS_Alert(CONS_ERROR, "HWR_CompileShaders: Compilation failed for base %s shader!\n", shaderxlat[i].type);
|
CONS_Alert(CONS_ERROR, "HWR_CompileShaders: Compilation failed for base %s shader!\n", shaderxlat[i].type);
|
||||||
|
|
||||||
if (custom_index != -1)
|
if (custom_index != -1)
|
||||||
{
|
{
|
||||||
HWR_CompileShader(custom_index);
|
HWR_CompileShader(custom_index);
|
||||||
|
|||||||
+14
-39
@@ -76,35 +76,30 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
// Include GLSL_FLOOR_FUDGES or GLSL_WALL_FUDGES or define the fudges in shaders that use this macro.
|
// 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 \
|
#define GLSL_DOOM_COLORMAP_DITHER \
|
||||||
"float baseValue = max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \
|
"float baseValue = max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \
|
||||||
"float endResolutionx = scr_resolution.x;\n" \
|
"float patscale = min(scr_resolution.x / 1280.0, scr_resolution.y / 720.0);\n" \
|
||||||
"float endResolutiony = scr_resolution.y;\n" \
|
"patscale = max(floor(patscale + 0.5), 1.0);\n" \
|
||||||
"if (scr_resolution.x > 1280.0) {\n" \
|
"patscale = 1.0 / patscale;\n" \
|
||||||
"endResolutionx = scr_resolution.x * 0.5;\n" \
|
"ivec2 p = ivec2(mod(floor(position * patscale), 4.0));\n" \
|
||||||
"}\n" \
|
"float depthfactor = clamp((z - 192.0) / (6144.0 - 192.0), 0.0, 1.0);\n" \
|
||||||
"if (scr_resolution.y > 720.0) {\n" \
|
|
||||||
"endResolutiony = scr_resolution.y * 0.5;\n" \
|
|
||||||
"}\n" \
|
|
||||||
"float zFactor = clamp((z - 192.0) / (6144.0 - 192.0), 0.0, 1.0);\n" \
|
|
||||||
"int scaleFactor = int(mix(1.0, 8.0, zFactor));\n" \
|
|
||||||
"endResolutionx = endResolutionx * scaleFactor;\n" \
|
|
||||||
"endResolutiony = endResolutiony * scaleFactor;\n" \
|
|
||||||
"vec2 normalizedPosition = position * vec2(endResolutionx / scr_resolution.x, endResolutiony / scr_resolution.y);\n" \
|
|
||||||
"int x = int(mod(normalizedPosition.x, 4.0));\n" \
|
|
||||||
"int y = int(mod(normalizedPosition.y, 4.0));\n" \
|
|
||||||
"float bayerMatrix[4*4] = float[4*4](\n" \
|
"float bayerMatrix[4*4] = float[4*4](\n" \
|
||||||
"0.0, 8.0, 2.0, 10.0,\n" \
|
"0.0, 8.0, 2.0, 10.0,\n" \
|
||||||
"12.0, 4.0, 14.0, 6.0,\n" \
|
"12.0, 4.0, 14.0, 6.0,\n" \
|
||||||
"3.0, 11.0, 1.0, 9.0,\n" \
|
"3.0, 11.0, 1.0, 9.0,\n" \
|
||||||
"15.0, 7.0, 13.0, 5.0\n" \
|
"15.0, 7.0, 13.0, 5.0\n" \
|
||||||
");\n" \
|
");\n" \
|
||||||
|
"float threshold = 16.0;\n" \
|
||||||
"#ifdef SRB2_PALETTE_RENDERING\n" \
|
"#ifdef SRB2_PALETTE_RENDERING\n" \
|
||||||
"float threshold = (1.0 - pow(zFactor, 2.0)) * (bayerMatrix[y*4 + x] / 11.0);\n" \
|
"threshold = 11.0;\n" \
|
||||||
"#else\n" \
|
|
||||||
"float threshold = (1.0 - pow(zFactor, 2.0)) * (bayerMatrix[y*4 + x] / 16.0);\n" \
|
|
||||||
"#endif\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 \
|
#define GLSL_DOOM_COLORMAP_NODITHER \
|
||||||
"return max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \
|
"return max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \
|
||||||
@@ -198,26 +193,6 @@
|
|||||||
"}\n" \
|
"}\n" \
|
||||||
"#endif\0"
|
"#endif\0"
|
||||||
|
|
||||||
#define GLSL_SOFTWARE_FRAGMENT_SHADER_NOPAL \
|
|
||||||
"uniform sampler2D tex;\n" \
|
|
||||||
"uniform vec4 poly_color;\n" \
|
|
||||||
"uniform vec4 tint_color;\n" \
|
|
||||||
"uniform vec4 fade_color;\n" \
|
|
||||||
"uniform float lighting;\n" \
|
|
||||||
"uniform float fade_start;\n" \
|
|
||||||
"uniform float fade_end;\n" \
|
|
||||||
GLSL_DOOM_COLORMAP \
|
|
||||||
GLSL_DOOM_LIGHT_EQUATION \
|
|
||||||
"void main(void) {\n" \
|
|
||||||
"vec4 texel = texture2D(tex, gl_TexCoord[0].st);\n" \
|
|
||||||
"vec4 base_color = texel * poly_color;\n" \
|
|
||||||
"vec4 final_color = base_color;\n" \
|
|
||||||
GLSL_SOFTWARE_TINT_EQUATION \
|
|
||||||
GLSL_SOFTWARE_FADE_EQUATION \
|
|
||||||
"final_color.a = texel.a * poly_color.a;\n" \
|
|
||||||
"gl_FragColor = final_color;\n" \
|
|
||||||
"}\n" \
|
|
||||||
|
|
||||||
// hand tuned adjustments for light level calculation
|
// hand tuned adjustments for light level calculation
|
||||||
#define GLSL_FLOOR_FUDGES \
|
#define GLSL_FLOOR_FUDGES \
|
||||||
"#define STARTMAP_FUDGE 1.06\n" \
|
"#define STARTMAP_FUDGE 1.06\n" \
|
||||||
|
|||||||
@@ -1,549 +0,0 @@
|
|||||||
// Emacs style mode select -*- C++ -*-
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
|
||||||
//
|
|
||||||
// This program is free software; you can redistribute it and/or
|
|
||||||
// modify it under the terms of the GNU General Public License
|
|
||||||
// as published by the Free Software Foundation; either version 2
|
|
||||||
// of the License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
/// \file
|
|
||||||
/// \brief Windows specific part of the OpenGL API for Doom Legacy
|
|
||||||
///
|
|
||||||
/// TODO:
|
|
||||||
/// - check if windowed mode works
|
|
||||||
/// - support different pixel formats
|
|
||||||
|
|
||||||
|
|
||||||
#if defined (_WIN32)
|
|
||||||
|
|
||||||
//#define WIN32_LEAN_AND_MEAN
|
|
||||||
#define RPC_NO_WINDOWS_H
|
|
||||||
#include <windows.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include "r_opengl.h"
|
|
||||||
|
|
||||||
|
|
||||||
// **************************************************************************
|
|
||||||
// GLOBALS
|
|
||||||
// **************************************************************************
|
|
||||||
|
|
||||||
#ifdef DEBUG_TO_FILE
|
|
||||||
static unsigned long nb_frames = 0;
|
|
||||||
static clock_t my_clock;
|
|
||||||
FILE *gllogstream;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static HDC hDC = NULL; // the window's device context
|
|
||||||
static HGLRC hGLRC = NULL; // the OpenGL rendering context
|
|
||||||
static HWND hWnd = NULL;
|
|
||||||
static BOOL WasFullScreen = FALSE;
|
|
||||||
static void UnSetRes(void);
|
|
||||||
|
|
||||||
#ifdef USE_WGL_SWAP
|
|
||||||
PFNWGLEXTSWAPCONTROLPROC wglSwapIntervalEXT = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PFNglClear pglClear;
|
|
||||||
PFNglGetIntegerv pglGetIntegerv;
|
|
||||||
PFNglGetString pglGetString;
|
|
||||||
|
|
||||||
#define MAX_VIDEO_MODES 32
|
|
||||||
static vmode_t video_modes[MAX_VIDEO_MODES];
|
|
||||||
INT32 oglflags = 0;
|
|
||||||
|
|
||||||
// **************************************************************************
|
|
||||||
// FUNCTIONS
|
|
||||||
// **************************************************************************
|
|
||||||
|
|
||||||
// -----------------+
|
|
||||||
// APIENTRY DllMain : DLL Entry Point,
|
|
||||||
// : open/close debug log
|
|
||||||
// Returns :
|
|
||||||
// -----------------+
|
|
||||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to DLL module
|
|
||||||
DWORD fdwReason, // reason for calling function
|
|
||||||
LPVOID lpvReserved) // reserved
|
|
||||||
{
|
|
||||||
// Perform actions based on the reason for calling.
|
|
||||||
UNREFERENCED_PARAMETER(lpvReserved);
|
|
||||||
switch (fdwReason)
|
|
||||||
{
|
|
||||||
case DLL_PROCESS_ATTACH:
|
|
||||||
// Initialize once for each new process.
|
|
||||||
// Return FALSE to fail DLL load.
|
|
||||||
#ifdef DEBUG_TO_FILE
|
|
||||||
gllogstream = fopen("ogllog.txt", "wt");
|
|
||||||
if (gllogstream == NULL)
|
|
||||||
return FALSE;
|
|
||||||
#endif
|
|
||||||
DisableThreadLibraryCalls(hinstDLL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DLL_THREAD_ATTACH:
|
|
||||||
// Do thread-specific initialization.
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DLL_THREAD_DETACH:
|
|
||||||
// Do thread-specific cleanup.
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DLL_PROCESS_DETACH:
|
|
||||||
// Perform any necessary cleanup.
|
|
||||||
#ifdef DEBUG_TO_FILE
|
|
||||||
if (gllogstream)
|
|
||||||
{
|
|
||||||
fclose(gllogstream);
|
|
||||||
gllogstream = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE; // Successful DLL_PROCESS_ATTACH.
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef STATIC_OPENGL
|
|
||||||
#define pwglGetProcAddress wglGetProcAddress;
|
|
||||||
#define pwglCreateContext wglCreateContext;
|
|
||||||
#define pwglDeleteContext wglDeleteContext;
|
|
||||||
#define pwglMakeCurrent wglMakeCurrent;
|
|
||||||
#else
|
|
||||||
static HMODULE OGL32;
|
|
||||||
typedef void *(WINAPI *PFNwglGetProcAddress) (const char *);
|
|
||||||
static PFNwglGetProcAddress pwglGetProcAddress;
|
|
||||||
typedef HGLRC (WINAPI *PFNwglCreateContext) (HDC hdc);
|
|
||||||
static PFNwglCreateContext pwglCreateContext;
|
|
||||||
typedef BOOL (WINAPI *PFNwglDeleteContext) (HGLRC hglrc);
|
|
||||||
static PFNwglDeleteContext pwglDeleteContext;
|
|
||||||
typedef BOOL (WINAPI *PFNwglMakeCurrent) (HDC hdc, HGLRC hglrc);
|
|
||||||
static PFNwglMakeCurrent pwglMakeCurrent;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef STATIC_OPENGL
|
|
||||||
void *GetGLFunc(const char *proc)
|
|
||||||
{
|
|
||||||
void *func = NULL;
|
|
||||||
if (pwglGetProcAddress)
|
|
||||||
func = pwglGetProcAddress(proc);
|
|
||||||
if (!func)
|
|
||||||
func = GetProcAddress(OGL32, proc);
|
|
||||||
return func;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
boolean LoadGL(void)
|
|
||||||
{
|
|
||||||
#ifndef STATIC_OPENGL
|
|
||||||
OGL32 = LoadLibrary("OPENGL32.DLL");
|
|
||||||
|
|
||||||
if (!OGL32)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
pwglGetProcAddress = GetGLFunc("wglGetProcAddress");
|
|
||||||
pwglCreateContext = GetGLFunc("wglCreateContext");
|
|
||||||
pwglDeleteContext = GetGLFunc("wglDeleteContext");
|
|
||||||
pwglMakeCurrent = GetGLFunc("wglMakeCurrent");
|
|
||||||
#endif
|
|
||||||
return SetupGLfunc();
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------+
|
|
||||||
// SetupPixelFormat : Set the device context's pixel format
|
|
||||||
// Note : Because we currently use only the desktop's BPP format, all the
|
|
||||||
// : video modes in Doom Legacy OpenGL are of the same BPP, thus the
|
|
||||||
// : PixelFormat is set only once.
|
|
||||||
// : Setting the pixel format more than once on the same window
|
|
||||||
// : doesn't work. (ultimately for different pixel formats, we
|
|
||||||
// : should close the window, and re-create it)
|
|
||||||
// -----------------+
|
|
||||||
int SetupPixelFormat(INT32 WantColorBits, INT32 WantStencilBits, INT32 WantDepthBits)
|
|
||||||
{
|
|
||||||
static DWORD iLastPFD = 0;
|
|
||||||
INT32 nPixelFormat;
|
|
||||||
PIXELFORMATDESCRIPTOR pfd =
|
|
||||||
{
|
|
||||||
sizeof (PIXELFORMATDESCRIPTOR), // size
|
|
||||||
1, // version
|
|
||||||
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
|
|
||||||
PFD_TYPE_RGBA, // color type
|
|
||||||
32 /*WantColorBits*/, // cColorBits : prefered color depth
|
|
||||||
0, 0, // cRedBits, cRedShift
|
|
||||||
0, 0, // cGreenBits, cGreenShift
|
|
||||||
0, 0, // cBlueBits, cBlueShift
|
|
||||||
0, 0, // cAlphaBits, cAlphaShift
|
|
||||||
0, // cAccumBits
|
|
||||||
0, 0, 0, 0, // cAccum Red/Green/Blue/Alpha Bits
|
|
||||||
0, // cDepthBits (0,16,24,32)
|
|
||||||
0, // cStencilBits
|
|
||||||
0, // cAuxBuffers
|
|
||||||
PFD_MAIN_PLANE, // iLayerType
|
|
||||||
0, // reserved, must be zero
|
|
||||||
0, 0, 0, // dwLayerMask, dwVisibleMask, dwDamageMask
|
|
||||||
};
|
|
||||||
|
|
||||||
DWORD iPFD = (WantColorBits<<16) | (WantStencilBits<<8) | WantDepthBits;
|
|
||||||
|
|
||||||
pfd.cDepthBits = (BYTE)WantDepthBits;
|
|
||||||
pfd.cStencilBits = (BYTE)WantStencilBits;
|
|
||||||
|
|
||||||
if (iLastPFD)
|
|
||||||
{
|
|
||||||
DBG_Printf("WARNING : SetPixelFormat() called twise not supported by all drivers !\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the pixel format only if different than the current
|
|
||||||
if (iPFD == iLastPFD)
|
|
||||||
return 2;
|
|
||||||
else
|
|
||||||
iLastPFD = iPFD;
|
|
||||||
|
|
||||||
DBG_Printf("SetupPixelFormat() - %d ColorBits - %d StencilBits - %d DepthBits\n",
|
|
||||||
WantColorBits, WantStencilBits, WantDepthBits);
|
|
||||||
|
|
||||||
nPixelFormat = ChoosePixelFormat(hDC, &pfd);
|
|
||||||
|
|
||||||
if (nPixelFormat == 0)
|
|
||||||
DBG_Printf("ChoosePixelFormat() FAILED\n");
|
|
||||||
|
|
||||||
if (SetPixelFormat(hDC, nPixelFormat, &pfd) == 0)
|
|
||||||
{
|
|
||||||
DBG_Printf("SetPixelFormat() FAILED\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------+
|
|
||||||
// SetRes : Set a display mode
|
|
||||||
// Notes : pcurrentmode is actually not used
|
|
||||||
// -----------------+
|
|
||||||
static INT32 WINAPI SetRes(viddef_t *lvid, vmode_t *pcurrentmode)
|
|
||||||
{
|
|
||||||
LPCSTR renderer;
|
|
||||||
BOOL WantFullScreen = !(lvid->u.windowed); //(lvid->u.windowed ? 0 : CDS_FULLSCREEN);
|
|
||||||
|
|
||||||
UNREFERENCED_PARAMETER(pcurrentmode);
|
|
||||||
DBG_Printf ("SetMode(): %dx%d %d bits (%s)\n",
|
|
||||||
lvid->width, lvid->height, lvid->bpp*8,
|
|
||||||
WantFullScreen ? "fullscreen" : "windowed");
|
|
||||||
|
|
||||||
hWnd = lvid->WndParent;
|
|
||||||
|
|
||||||
// BP : why flush texture ?
|
|
||||||
// if important flush also the first one (white texture) and restore it !
|
|
||||||
Flush(); // Flush textures.
|
|
||||||
|
|
||||||
// TODO: if not fullscreen, skip display stuff and just resize viewport stuff ...
|
|
||||||
|
|
||||||
// Exit previous mode
|
|
||||||
//if (hGLRC) //Hurdler: TODO: check if this is valid
|
|
||||||
// UnSetRes();
|
|
||||||
if (WasFullScreen)
|
|
||||||
ChangeDisplaySettings(NULL, CDS_FULLSCREEN); //switch in and out of fullscreen
|
|
||||||
|
|
||||||
// Change display settings.
|
|
||||||
if (WantFullScreen)
|
|
||||||
{
|
|
||||||
DEVMODE dm;
|
|
||||||
ZeroMemory(&dm, sizeof (dm));
|
|
||||||
dm.dmSize = sizeof (dm);
|
|
||||||
dm.dmPelsWidth = lvid->width;
|
|
||||||
dm.dmPelsHeight = lvid->height;
|
|
||||||
dm.dmBitsPerPel = lvid->bpp*8;
|
|
||||||
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;
|
|
||||||
if (ChangeDisplaySettings(&dm, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
|
|
||||||
return -2;
|
|
||||||
if (ChangeDisplaySettings(&dm, CDS_FULLSCREEN) !=DISP_CHANGE_SUCCESSFUL)
|
|
||||||
return -3;
|
|
||||||
|
|
||||||
SetWindowLong(hWnd, GWL_STYLE, WS_POPUP|WS_VISIBLE);
|
|
||||||
// faB : book says to put these, surely for windowed mode
|
|
||||||
//WS_CLIPCHILDREN|WS_CLIPSIBLINGS);
|
|
||||||
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, lvid->width, lvid->height, SWP_NOACTIVATE|SWP_NOZORDER);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RECT bounds;
|
|
||||||
INT32 x, y;
|
|
||||||
INT32 w = lvid->width, h = lvid->height;
|
|
||||||
GetWindowRect(hWnd, &bounds);
|
|
||||||
bounds.right = bounds.left+w;
|
|
||||||
bounds.bottom = bounds.top+h;
|
|
||||||
AdjustWindowRectEx(&bounds, GetWindowLong(hWnd, GWL_STYLE), (GetMenu(hWnd) != NULL), 0);
|
|
||||||
w = bounds.right-bounds.left;
|
|
||||||
h = bounds.bottom-bounds.top;
|
|
||||||
x = (GetSystemMetrics(SM_CXSCREEN)-w)/2;
|
|
||||||
y = (GetSystemMetrics(SM_CYSCREEN)-h)/2;
|
|
||||||
SetWindowPos(hWnd, NULL, x, y, w, h, SWP_NOACTIVATE|SWP_NOZORDER);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hDC)
|
|
||||||
hDC = GetDC(hWnd);
|
|
||||||
if (!hDC)
|
|
||||||
{
|
|
||||||
DBG_Printf("GetDC() FAILED\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
INT32 res;
|
|
||||||
|
|
||||||
// Set res.
|
|
||||||
res = SetupPixelFormat(lvid->bpp*8, 0, 16);
|
|
||||||
|
|
||||||
if (res == 0)
|
|
||||||
return 0;
|
|
||||||
else if (res == 1)
|
|
||||||
{
|
|
||||||
// Exit previous mode
|
|
||||||
if (hGLRC)
|
|
||||||
UnSetRes();
|
|
||||||
hGLRC = pwglCreateContext(hDC);
|
|
||||||
if (!hGLRC)
|
|
||||||
{
|
|
||||||
DBG_Printf("pwglCreateContext() FAILED\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (!pwglMakeCurrent(hDC, hGLRC))
|
|
||||||
{
|
|
||||||
DBG_Printf("wglMakeCurrent() FAILED\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gl_extensions = pglGetString(GL_EXTENSIONS);
|
|
||||||
// Get info and extensions.
|
|
||||||
//BP: why don't we make it earlier ?
|
|
||||||
//Hurdler: we cannot do that before intialising gl context
|
|
||||||
renderer = (LPCSTR)pglGetString(GL_RENDERER);
|
|
||||||
DBG_Printf("Vendor : %s\n", pglGetString(GL_VENDOR));
|
|
||||||
DBG_Printf("Renderer : %s\n", renderer);
|
|
||||||
DBG_Printf("Version : %s\n", pglGetString(GL_VERSION));
|
|
||||||
DBG_Printf("Extensions : %s\n", gl_extensions);
|
|
||||||
|
|
||||||
// BP: disable advenced feature that don't work on somes hardware
|
|
||||||
// Hurdler: Now works on G400 with bios 1.6 and certified drivers 6.04
|
|
||||||
if (strstr(renderer, "810")) oglflags |= GLF_NOZBUFREAD;
|
|
||||||
DBG_Printf("oglflags : 0x%X\n", oglflags);
|
|
||||||
|
|
||||||
#ifdef USE_WGL_SWAP
|
|
||||||
if (isExtAvailable("WGL_EXT_swap_control",gl_extensions))
|
|
||||||
wglSwapIntervalEXT = GetGLFunc("wglSwapIntervalEXT");
|
|
||||||
else
|
|
||||||
wglSwapIntervalEXT = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (isExtAvailable("GL_EXT_texture_filter_anisotropic",gl_extensions))
|
|
||||||
pglGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maximumAnisotropy);
|
|
||||||
else
|
|
||||||
maximumAnisotropy = 0;
|
|
||||||
|
|
||||||
SetupGLFunc13();
|
|
||||||
|
|
||||||
screen_depth = (GLbyte)(lvid->bpp*8);
|
|
||||||
if (screen_depth > 16)
|
|
||||||
textureformatGL = GL_RGBA;
|
|
||||||
else
|
|
||||||
textureformatGL = GL_RGB5_A1;
|
|
||||||
|
|
||||||
GL_SetModelView(lvid->width, lvid->height);
|
|
||||||
GL_SetStates();
|
|
||||||
// we need to clear the depth buffer. Very important!!!
|
|
||||||
pglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
|
|
||||||
|
|
||||||
lvid->buffer = NULL; // unless we use the software view
|
|
||||||
lvid->direct = NULL; // direct access to video memory, old DOS crap
|
|
||||||
|
|
||||||
WasFullScreen = WantFullScreen;
|
|
||||||
|
|
||||||
return 1; // on renvoie une valeur pour dire que cela s'est bien pass�
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------+
|
|
||||||
// UnSetRes : Restore the original display mode
|
|
||||||
// -----------------+
|
|
||||||
static void UnSetRes(void)
|
|
||||||
{
|
|
||||||
DBG_Printf("UnSetRes()\n");
|
|
||||||
|
|
||||||
pwglMakeCurrent(hDC, NULL);
|
|
||||||
pwglDeleteContext(hGLRC);
|
|
||||||
hGLRC = NULL;
|
|
||||||
if (WasFullScreen)
|
|
||||||
ChangeDisplaySettings(NULL, CDS_FULLSCREEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------+
|
|
||||||
// GetModeList : Return the list of available display modes.
|
|
||||||
// Returns : pvidmodes - points to list of detected OpenGL video modes
|
|
||||||
// : numvidmodes - number of detected OpenGL video modes
|
|
||||||
// -----------------+
|
|
||||||
EXPORT void HWRAPI(GetModeList) (vmode_t** pvidmodes, INT32 *numvidmodes)
|
|
||||||
{
|
|
||||||
INT32 i;
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
INT32 iMode;
|
|
||||||
/*
|
|
||||||
faB test code
|
|
||||||
|
|
||||||
Commented out because there might be a problem with combo (Voodoo2 + other card),
|
|
||||||
we need to get the 3D card's display modes only.
|
|
||||||
*/
|
|
||||||
(*pvidmodes) = &video_modes[0];
|
|
||||||
|
|
||||||
// Get list of device modes
|
|
||||||
for (i = 0,iMode = 0; iMode < MAX_VIDEO_MODES; i++)
|
|
||||||
{
|
|
||||||
DEVMODE Tmp;
|
|
||||||
ZeroMemory(&Tmp, sizeof (Tmp));
|
|
||||||
Tmp.dmSize = sizeof (Tmp);
|
|
||||||
if (!EnumDisplaySettings(NULL, i, &Tmp))
|
|
||||||
break;
|
|
||||||
|
|
||||||
// add video mode
|
|
||||||
if (Tmp.dmBitsPerPel == 16 &&
|
|
||||||
(iMode == 0 || !
|
|
||||||
(Tmp.dmPelsWidth == video_modes[iMode-1].width &&
|
|
||||||
Tmp.dmPelsHeight == video_modes[iMode-1].height)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
video_modes[iMode].pnext = &video_modes[iMode+1];
|
|
||||||
video_modes[iMode].windowed = 0; // fullscreen is the default
|
|
||||||
video_modes[iMode].misc = 0;
|
|
||||||
video_modes[iMode].name = malloc(12 * sizeof (CHAR));
|
|
||||||
sprintf(video_modes[iMode].name, "%dx%d", (INT32)Tmp.dmPelsWidth, (INT32)Tmp.dmPelsHeight);
|
|
||||||
DBG_Printf ("Mode: %s\n", video_modes[iMode].name);
|
|
||||||
video_modes[iMode].width = Tmp.dmPelsWidth;
|
|
||||||
video_modes[iMode].height = Tmp.dmPelsHeight;
|
|
||||||
video_modes[iMode].bytesperpixel = Tmp.dmBitsPerPel/8;
|
|
||||||
video_modes[iMode].rowbytes = Tmp.dmPelsWidth * video_modes[iMode].bytesperpixel;
|
|
||||||
video_modes[iMode].pextradata = NULL;
|
|
||||||
video_modes[iMode].setmode = SetRes;
|
|
||||||
iMode++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(*numvidmodes) = iMode;
|
|
||||||
#else
|
|
||||||
|
|
||||||
// classic video modes (fullscreen/windowed)
|
|
||||||
// Added some. Tails
|
|
||||||
INT32 res[][2] = {
|
|
||||||
{ 320, 200},
|
|
||||||
{ 320, 240},
|
|
||||||
{ 400, 300},
|
|
||||||
{ 512, 384},
|
|
||||||
{ 640, 400},
|
|
||||||
{ 640, 480},
|
|
||||||
{ 800, 600},
|
|
||||||
{ 960, 600},
|
|
||||||
{1024, 768},
|
|
||||||
{1152, 864},
|
|
||||||
{1280, 800},
|
|
||||||
{1280, 960},
|
|
||||||
{1280,1024},
|
|
||||||
{1600,1000},
|
|
||||||
{1680,1050},
|
|
||||||
{1920,1200},
|
|
||||||
};
|
|
||||||
|
|
||||||
HDC bpphdc;
|
|
||||||
INT32 iBitsPerPel;
|
|
||||||
|
|
||||||
DBG_Printf ("HWRAPI GetModeList()\n");
|
|
||||||
|
|
||||||
bpphdc = GetDC(NULL); // on obtient le bpp actuel
|
|
||||||
iBitsPerPel = GetDeviceCaps(bpphdc, BITSPIXEL);
|
|
||||||
|
|
||||||
ReleaseDC(NULL, bpphdc);
|
|
||||||
|
|
||||||
(*pvidmodes) = &video_modes[0];
|
|
||||||
(*numvidmodes) = sizeof (res) / sizeof (res[0]);
|
|
||||||
for (i = 0; i < (*numvidmodes); i++)
|
|
||||||
{
|
|
||||||
video_modes[i].pnext = &video_modes[i+1];
|
|
||||||
video_modes[i].windowed = 0; // fullscreen is the default
|
|
||||||
video_modes[i].misc = 0;
|
|
||||||
video_modes[i].name = malloc(12 * sizeof (CHAR));
|
|
||||||
sprintf(video_modes[i].name, "%dx%d", res[i][0], res[i][1]);
|
|
||||||
DBG_Printf ("Mode: %s\n", video_modes[i].name);
|
|
||||||
video_modes[i].width = res[i][0];
|
|
||||||
video_modes[i].height = res[i][1];
|
|
||||||
video_modes[i].bytesperpixel = iBitsPerPel/8;
|
|
||||||
video_modes[i].rowbytes = res[i][0] * video_modes[i].bytesperpixel;
|
|
||||||
video_modes[i].pextradata = NULL;
|
|
||||||
video_modes[i].setmode = SetRes;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
video_modes[(*numvidmodes)-1].pnext = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------+
|
|
||||||
// Shutdown : Shutdown OpenGL, restore the display mode
|
|
||||||
// -----------------+
|
|
||||||
EXPORT void HWRAPI(Shutdown) (void)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG_TO_FILE
|
|
||||||
long nb_centiemes;
|
|
||||||
|
|
||||||
DBG_Printf ("HWRAPI Shutdown()\n");
|
|
||||||
nb_centiemes = ((clock()-my_clock)*100)/CLOCKS_PER_SEC;
|
|
||||||
DBG_Printf("Nb frames: %li; Nb sec: %2.2f -> %2.1f fps\n",
|
|
||||||
nb_frames, nb_centiemes/100.0f, (100*nb_frames)/(double)nb_centiemes);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Flush();
|
|
||||||
|
|
||||||
// Exit previous mode
|
|
||||||
if (hGLRC)
|
|
||||||
UnSetRes();
|
|
||||||
|
|
||||||
if (hDC)
|
|
||||||
{
|
|
||||||
ReleaseDC(hWnd, hDC);
|
|
||||||
hDC = NULL;
|
|
||||||
}
|
|
||||||
FreeLibrary(OGL32);
|
|
||||||
DBG_Printf ("HWRAPI Shutdown(DONE)\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------+
|
|
||||||
// FinishUpdate : Swap front and back buffers
|
|
||||||
// -----------------+
|
|
||||||
void GL_FinishUpdate (INT32 waitvbl)
|
|
||||||
{
|
|
||||||
#ifdef USE_WGL_SWAP
|
|
||||||
static INT32 oldwaitvbl = 0;
|
|
||||||
#else
|
|
||||||
UNREFERENCED_PARAMETER(waitvbl);
|
|
||||||
#endif
|
|
||||||
// DBG_Printf ("FinishUpdate()\n");
|
|
||||||
#ifdef DEBUG_TO_FILE
|
|
||||||
if ((++nb_frames)==2) // on ne commence pas � la premi�re frame
|
|
||||||
my_clock = clock();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_WGL_SWAP
|
|
||||||
if (oldwaitvbl != waitvbl && wglSwapIntervalEXT)
|
|
||||||
wglSwapIntervalEXT(waitvbl);
|
|
||||||
oldwaitvbl = waitvbl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SwapBuffers(hDC);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -136,8 +136,7 @@ enum
|
|||||||
{
|
{
|
||||||
FBO_NONE,
|
FBO_NONE,
|
||||||
FBO_ARB,
|
FBO_ARB,
|
||||||
FBO_EXT,
|
FBO_EXT
|
||||||
FBO_EXT_STENCIL // supports stencil attachment
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -161,7 +160,7 @@ GL_DEPTH24_STENCIL8 GL_DEPTH_COMPONENT_EXT
|
|||||||
GL_DEPTH_STENCIL_ATTACHMENT GL_DEPTH_ATTACHMENT_EXT
|
GL_DEPTH_STENCIL_ATTACHMENT GL_DEPTH_ATTACHMENT_EXT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void GL_Framebuffer_DeleteAttachments(void);
|
static void GL_FBO_DeleteAttachments(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// needed for glportals
|
// needed for glportals
|
||||||
@@ -769,28 +768,22 @@ static GLRGBAFloat shader_defaultcolor = {1.0f, 1.0f, 1.0f, 1.0f};
|
|||||||
#ifdef USE_FBO_OGL
|
#ifdef USE_FBO_OGL
|
||||||
static int GLFramebuffer_CheckExt(void)
|
static int GLFramebuffer_CheckExt(void)
|
||||||
{
|
{
|
||||||
// in opengl 3.0 and up fbos are standart and always supported
|
// check for the standard arb extensions
|
||||||
if (majorGL >= 3)
|
// these should be there from version 3.0 onwards
|
||||||
return FBO_ARB;
|
if (GL_isExtAvailable("GL_ARB_framebuffer_no_attachments", gl_extensions) &&
|
||||||
|
GL_isExtAvailable("GL_ARB_framebuffer_object", gl_extensions) &&
|
||||||
// gl versions from 2.1 may still support framebuffer objects
|
GL_isExtAvailable("GL_ARB_framebuffer_sRGB", gl_extensions))
|
||||||
|
|
||||||
// maybe, just maybe, we support the standart extensions
|
|
||||||
if (GL_isExtAvailable("GL_ARB_framebuffer_no_attachments", gl_extensions)
|
|
||||||
&& GL_isExtAvailable("GL_ARB_framebuffer_object", gl_extensions)
|
|
||||||
&& GL_isExtAvailable("GL_ARB_framebuffer_sRGB", gl_extensions))
|
|
||||||
return FBO_ARB;
|
|
||||||
|
|
||||||
// nope, try the older 2.1 extensions
|
|
||||||
if (GL_isExtAvailable("GL_EXT_framebuffer_no_attachments", gl_extensions)
|
|
||||||
&& GL_isExtAvailable("GL_EXT_framebuffer_object", gl_extensions)
|
|
||||||
&& GL_isExtAvailable("GL_EXT_framebuffer_sRGB", gl_extensions))
|
|
||||||
{
|
{
|
||||||
// perhaps we may even support a stencil attachment
|
return FBO_ARB;
|
||||||
if (GL_isExtAvailable("GL_EXT_packed_depth_stencil", gl_extensions))
|
}
|
||||||
return FBO_EXT_STENCIL;
|
|
||||||
|
|
||||||
// no stencil support, sad
|
// gl versions from 2.1 and older may still support framebuffer objects
|
||||||
|
// depending on vendor and driver support
|
||||||
|
if (GL_isExtAvailable("GL_EXT_framebuffer_no_attachments", gl_extensions) &&
|
||||||
|
GL_isExtAvailable("GL_EXT_framebuffer_object", gl_extensions) &&
|
||||||
|
GL_isExtAvailable("GL_EXT_framebuffer_sRGB", gl_extensions) &&
|
||||||
|
GL_isExtAvailable("GL_EXT_packed_depth_stencil", gl_extensions)) // we use the stencil buffer for stuff like portals, so its better to make stencil extension a requirement
|
||||||
|
{
|
||||||
return FBO_EXT;
|
return FBO_EXT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -885,7 +878,7 @@ void SetupGLFunc4(void)
|
|||||||
{ \
|
{ \
|
||||||
GL_MSG_Warning("failed to get OpenGL FBO function: %s\n", #func); \
|
GL_MSG_Warning("failed to get OpenGL FBO function: %s\n", #func); \
|
||||||
GL_DBG_Printf("\nFBO: No framebuffer object support\n"); \
|
GL_DBG_Printf("\nFBO: No framebuffer object support\n"); \
|
||||||
supportFBO = false; \
|
supportFBO = FBO_NONE; \
|
||||||
return; \
|
return; \
|
||||||
} \
|
} \
|
||||||
|
|
||||||
@@ -908,35 +901,40 @@ void SetupGLFunc4(void)
|
|||||||
|
|
||||||
GL_DBG_Printf("\nFBO: ARB extensions found\n");
|
GL_DBG_Printf("\nFBO: ARB extensions found\n");
|
||||||
}
|
}
|
||||||
else if (fbocheck == FBO_EXT || fbocheck == FBO_EXT_STENCIL) // uh oh only support for EXT prefix fbos...
|
else if (fbocheck == FBO_EXT) // uh oh only support old fbo extensions...
|
||||||
{
|
{
|
||||||
GetGLfunc(glGenFramebuffersEXT);
|
|
||||||
GetGLfunc(glBindFramebufferEXT);
|
|
||||||
GetGLfunc(glDeleteFramebuffersEXT);
|
|
||||||
GetGLfunc(glFramebufferTexture2DEXT);
|
|
||||||
GetGLfunc(glCheckFramebufferStatusEXT);
|
|
||||||
GetGLfunc(glGenRenderbuffersEXT);
|
|
||||||
GetGLfunc(glBindRenderbufferEXT);
|
|
||||||
GetGLfunc(glDeleteRenderbuffersEXT);
|
|
||||||
GetGLfunc(glRenderbufferStorageEXT);
|
|
||||||
GetGLfunc(glFramebufferRenderbufferEXT);
|
|
||||||
|
|
||||||
// remapping galore huehue
|
// remapping galore huehue
|
||||||
// do this so we dont have to dupe half our code
|
// do this so we dont have to dupe half our code
|
||||||
|
GetGLfunc(glGenFramebuffersEXT);
|
||||||
pglGenFramebuffers = pglGenFramebuffersEXT;
|
pglGenFramebuffers = pglGenFramebuffersEXT;
|
||||||
|
|
||||||
|
GetGLfunc(glBindFramebufferEXT);
|
||||||
pglBindFramebuffer = pglBindFramebufferEXT;
|
pglBindFramebuffer = pglBindFramebufferEXT;
|
||||||
|
|
||||||
|
GetGLfunc(glDeleteFramebuffersEXT);
|
||||||
pglDeleteFramebuffers = pglDeleteFramebuffersEXT;
|
pglDeleteFramebuffers = pglDeleteFramebuffersEXT;
|
||||||
|
|
||||||
|
GetGLfunc(glFramebufferTexture2DEXT);
|
||||||
pglFramebufferTexture2D = pglFramebufferTexture2DEXT;
|
pglFramebufferTexture2D = pglFramebufferTexture2DEXT;
|
||||||
|
|
||||||
|
GetGLfunc(glCheckFramebufferStatusEXT);
|
||||||
pglCheckFramebufferStatus = pglCheckFramebufferStatusEXT;
|
pglCheckFramebufferStatus = pglCheckFramebufferStatusEXT;
|
||||||
|
|
||||||
|
GetGLfunc(glGenRenderbuffersEXT);
|
||||||
pglGenRenderbuffers = pglGenRenderbuffersEXT;
|
pglGenRenderbuffers = pglGenRenderbuffersEXT;
|
||||||
|
|
||||||
|
GetGLfunc(glBindRenderbufferEXT);
|
||||||
pglBindRenderbuffer = pglBindRenderbufferEXT;
|
pglBindRenderbuffer = pglBindRenderbufferEXT;
|
||||||
|
|
||||||
|
GetGLfunc(glDeleteRenderbuffersEXT);
|
||||||
pglDeleteRenderbuffers = pglDeleteRenderbuffersEXT;
|
pglDeleteRenderbuffers = pglDeleteRenderbuffersEXT;
|
||||||
|
|
||||||
|
GetGLfunc(glRenderbufferStorageEXT);
|
||||||
pglRenderbufferStorage = pglRenderbufferStorageEXT;
|
pglRenderbufferStorage = pglRenderbufferStorageEXT;
|
||||||
|
|
||||||
|
GetGLfunc(glFramebufferRenderbufferEXT);
|
||||||
pglFramebufferRenderbuffer = pglFramebufferRenderbufferEXT;
|
pglFramebufferRenderbuffer = pglFramebufferRenderbufferEXT;
|
||||||
|
|
||||||
if (fbocheck == FBO_EXT)
|
|
||||||
GL_DBG_Printf("\nFBO: EXT extensions found, no stencil\n");
|
|
||||||
else if (fbocheck == FBO_EXT_STENCIL)
|
|
||||||
GL_DBG_Printf("\nFBO: EXT extensions with packed depth-stencil\n");
|
GL_DBG_Printf("\nFBO: EXT extensions with packed depth-stencil\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1068,6 +1066,13 @@ void GL_SetShader(int slot)
|
|||||||
gl_shadersenabled = false;
|
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)
|
void GL_UnSetShader(void)
|
||||||
{
|
{
|
||||||
if (gl_shadersenabled) // don't repeatedly call glUseProgram if not needed
|
if (gl_shadersenabled) // don't repeatedly call glUseProgram if not needed
|
||||||
@@ -1115,7 +1120,7 @@ static void GL_Perspective(GLfloat fovy, GLfloat aspect)
|
|||||||
|
|
||||||
const GLfloat deltaZ = FAR_CLIPPING_PLANE - NEAR_CLIPPING_PLANE;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1144,7 +1149,7 @@ void GL_SetModelView(GLint w, GLint h)
|
|||||||
GL_FlushScreenTextures();
|
GL_FlushScreenTextures();
|
||||||
|
|
||||||
#ifdef USE_FBO_OGL
|
#ifdef USE_FBO_OGL
|
||||||
GL_Framebuffer_DeleteAttachments();
|
GL_FBO_DeleteAttachments();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1277,7 +1282,7 @@ void GL_SetStates(void)
|
|||||||
|
|
||||||
pglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
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
|
pglEnable(GL_DEPTH_TEST); // check the depth buffer
|
||||||
pglDepthMask(GL_TRUE); // enable writing to depth buffer
|
pglDepthMask(GL_TRUE); // enable writing to depth buffer
|
||||||
pglClearDepth(1.0f);
|
pglClearDepth(1.0f);
|
||||||
@@ -1307,6 +1312,16 @@ void GL_SetStates(void)
|
|||||||
#endif
|
#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
|
// DeleteTexture : Deletes a texture from the GPU and frees its data
|
||||||
// -----------------+
|
// -----------------+
|
||||||
@@ -1448,6 +1463,19 @@ void GL_ReadScreenTexture(int tex, UINT8 *restrict dest, INT32 scale)
|
|||||||
if (tex != HWD_SCREENTEXTURE_GENERIC2)
|
if (tex != HWD_SCREENTEXTURE_GENERIC2)
|
||||||
GL_DrawScreenTexture(tex, NULL, 0);
|
GL_DrawScreenTexture(tex, NULL, 0);
|
||||||
|
|
||||||
|
#ifdef USE_FBO_OGL
|
||||||
|
// FIXME: this is incredibly stupid
|
||||||
|
// but the final screen texture will NOT be drawn in the downsample fbo
|
||||||
|
if (tex == HWD_SCREENTEXTURE_GENERIC2 &&
|
||||||
|
UseScreenFBO() && HWR_ShouldUsePaletteRendering())
|
||||||
|
{
|
||||||
|
GL_SetShader(HWR_GetShaderFromTarget(SHADER_PALETTE_POSTPROCESS));
|
||||||
|
GL_EnableShader();
|
||||||
|
GL_DrawScreenTexture(HWD_SCREENTEXTURE_GENERIC2, NULL, 0);
|
||||||
|
GL_UnSetShader();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
image = malloc(screen_width*screen_height*3);
|
image = malloc(screen_width*screen_height*3);
|
||||||
pglPixelStorei(GL_PACK_ALIGNMENT, 1);
|
pglPixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||||
pglReadPixels(0, 0, screen_width, screen_height, GL_RGB, GL_UNSIGNED_BYTE, image);
|
pglReadPixels(0, 0, screen_width, screen_height, GL_RGB, GL_UNSIGNED_BYTE, image);
|
||||||
@@ -1566,6 +1594,7 @@ void GL_Draw2DLine(F2DCoord * v1, F2DCoord * v2, RGBA_t Color)
|
|||||||
angle = atanf((v2->y-v1->y)/(v2->x-v1->x));
|
angle = atanf((v2->y-v1->y)/(v2->x-v1->x));
|
||||||
else
|
else
|
||||||
angle = (float)N_PI_DEMI;
|
angle = (float)N_PI_DEMI;
|
||||||
|
|
||||||
dx = sinf(angle) / (float)screen_width;
|
dx = sinf(angle) / (float)screen_width;
|
||||||
dy = cosf(angle) / (float)screen_height;
|
dy = cosf(angle) / (float)screen_height;
|
||||||
|
|
||||||
@@ -1680,7 +1709,7 @@ static void GL_SetBlendMode(FBITFIELD flags)
|
|||||||
|
|
||||||
void GL_SetBlend(FBITFIELD PolyFlags)
|
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))
|
if (Xor & (PF_Blending|PF_RemoveYWrap|PF_ForceWrapX|PF_ForceWrapY|PF_Occlude|PF_NoTexture|PF_Modulated|PF_NoDepthTest|PF_Decal|PF_Skydecal|PF_Invisible))
|
||||||
{
|
{
|
||||||
@@ -1900,6 +1929,7 @@ static void GenerateMipmaps(INT32 w, INT32 h, RGBA_t *tex, INT32 maxLOD, UINT32
|
|||||||
{
|
{
|
||||||
if (samplePoint[p].s.alpha == 0)
|
if (samplePoint[p].s.alpha == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
sumR += samplePoint[p].s.red;
|
sumR += samplePoint[p].s.red;
|
||||||
sumG += samplePoint[p].s.green;
|
sumG += samplePoint[p].s.green;
|
||||||
sumB += samplePoint[p].s.blue;
|
sumB += samplePoint[p].s.blue;
|
||||||
@@ -2472,7 +2502,7 @@ void GL_RenderSkyDome(gl_sky_t *sky)
|
|||||||
GL_Shader_SetUniforms(NULL, NULL, NULL, NULL);
|
GL_Shader_SetUniforms(NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
// Build the sky dome! Yes!
|
// Build the sky dome! Yes!
|
||||||
if (sky->rebuild)
|
if (sky->rebuild || !sky->vbo)
|
||||||
{
|
{
|
||||||
// delete VBO when already exists
|
// delete VBO when already exists
|
||||||
if (sky->vbo)
|
if (sky->vbo)
|
||||||
@@ -2609,11 +2639,7 @@ void GL_SetSpecialState(hwdspecialstate_t IdState, INT32 Value)
|
|||||||
|
|
||||||
case HWD_SET_MSAA:
|
case HWD_SET_MSAA:
|
||||||
if (Value)
|
if (Value)
|
||||||
{
|
|
||||||
pglEnable(GL_MULTISAMPLE);
|
pglEnable(GL_MULTISAMPLE);
|
||||||
if (Value == 2)
|
|
||||||
pglEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HWD_SET_TEXTUREANISOTROPICMODE:
|
case HWD_SET_TEXTUREANISOTROPICMODE:
|
||||||
@@ -2897,7 +2923,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)
|
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)
|
||||||
{
|
{
|
||||||
@@ -3190,8 +3216,8 @@ void GL_SetTransform(FTransform *stransform)
|
|||||||
{
|
{
|
||||||
float dy = stransform->viewaiming * 2;
|
float dy = stransform->viewaiming * 2;
|
||||||
|
|
||||||
if (stransform->fliptype == TRANSFORM_FLIP
|
if (stransform->fliptype == TRANSFORM_FLIP ||
|
||||||
|| stransform->fliptype == TRANSFORM_MIRRORFLIP)
|
stransform->fliptype == TRANSFORM_MIRRORFLIP)
|
||||||
dy *= -1.0f;
|
dy *= -1.0f;
|
||||||
|
|
||||||
pglTranslatef(0.0f, -dy/BASEVIDHEIGHT, 0.0f);
|
pglTranslatef(0.0f, -dy/BASEVIDHEIGHT, 0.0f);
|
||||||
@@ -3214,9 +3240,9 @@ void GL_SetTransform(FTransform *stransform)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_FBO_OGL
|
#ifdef USE_FBO_OGL
|
||||||
static void GL_Framebuffer_DeleteAttachments(void)
|
static void GL_FBO_DeleteAttachments(void)
|
||||||
{
|
{
|
||||||
if (!supportFBO || !framebufferobject.init)
|
if (supportFBO == FBO_NONE || !framebufferobject.init)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Unbind the framebuffer
|
// Unbind the framebuffer
|
||||||
@@ -3234,23 +3260,15 @@ static void GL_Framebuffer_DeleteAttachments(void)
|
|||||||
framebufferobject.init = false;
|
framebufferobject.init = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GL_Framebuffer_Generate(void)
|
static void GL_FBO_Generate(void)
|
||||||
{
|
{
|
||||||
if (!supportFBO || framebufferobject.init || !UseScreenFBO())
|
if (supportFBO == FBO_NONE || framebufferobject.init)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Generate the framebuffer
|
// Generate the framebuffer
|
||||||
if (!framebufferobject.fboobj)
|
if (!framebufferobject.fboobj)
|
||||||
pglGenFramebuffers(1, &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
|
// Bind the framebuffer
|
||||||
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj);
|
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj);
|
||||||
|
|
||||||
@@ -3259,15 +3277,15 @@ static void GL_Framebuffer_Generate(void)
|
|||||||
{
|
{
|
||||||
pglGenTextures(1, &framebufferobject.tex);
|
pglGenTextures(1, &framebufferobject.tex);
|
||||||
pglBindTexture(GL_TEXTURE_2D, framebufferobject.tex);
|
pglBindTexture(GL_TEXTURE_2D, framebufferobject.tex);
|
||||||
pglTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, screen_width, screen_height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
|
pglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, screen_width, screen_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
Clamp2D(GL_TEXTURE_WRAP_S);
|
Clamp2D(GL_TEXTURE_WRAP_S);
|
||||||
Clamp2D(GL_TEXTURE_WRAP_T);
|
Clamp2D(GL_TEXTURE_WRAP_T);
|
||||||
pglBindTexture(GL_TEXTURE_2D, 0);
|
|
||||||
|
|
||||||
// Attach the framebuffer texture to the framebuffer
|
// Attach the framebuffer texture to the framebuffer
|
||||||
pglFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, framebufferobject.tex, 0);
|
pglFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, framebufferobject.tex, 0);
|
||||||
|
pglBindTexture(GL_TEXTURE_2D, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate the renderbuffer
|
// Generate the renderbuffer
|
||||||
@@ -3282,19 +3300,14 @@ static void GL_Framebuffer_Generate(void)
|
|||||||
pglRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8, screen_width, screen_height);
|
pglRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8, screen_width, screen_height);
|
||||||
pglFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER_EXT, framebufferobject.rboobj);
|
pglFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER_EXT, framebufferobject.rboobj);
|
||||||
}
|
}
|
||||||
else if (supportFBO == FBO_EXT || supportFBO == FBO_EXT_STENCIL)
|
else if (supportFBO == FBO_EXT)
|
||||||
{
|
{
|
||||||
pglRenderbufferStorage(GL_RENDERBUFFER_EXT, (supportFBO == FBO_EXT_STENCIL) ? GL_DEPTH_STENCIL_EXT : GL_DEPTH_COMPONENT, screen_width, screen_height);
|
pglRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_STENCIL_EXT, screen_width, screen_height);
|
||||||
|
// attach the renderbuffer to depth attachment point
|
||||||
// attach a renderbuffer to depth attachment point
|
|
||||||
pglFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, framebufferobject.rboobj);
|
pglFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, framebufferobject.rboobj);
|
||||||
|
// attach the renderbuffer to stencil attachment point
|
||||||
if (supportFBO == FBO_EXT_STENCIL)
|
|
||||||
{
|
|
||||||
// attach a renderbuffer to stencil attachment point
|
|
||||||
pglFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, framebufferobject.rboobj);
|
pglFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, framebufferobject.rboobj);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Clear the renderbuffer
|
// Clear the renderbuffer
|
||||||
GL_ClearBuffer(true, true, true, NULL);
|
GL_ClearBuffer(true, true, true, NULL);
|
||||||
@@ -3302,35 +3315,51 @@ static void GL_Framebuffer_Generate(void)
|
|||||||
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
|
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pglCheckFramebufferStatus(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
|
||||||
|
{
|
||||||
|
//pglGetError(); TODO:implement this or smth
|
||||||
|
GL_MSG_Error("GL_FBO_Generate: Failed to create Framebuffer Object");
|
||||||
|
|
||||||
|
// if this fails, dont retry it a gazillion times
|
||||||
|
// this wouldnt recover
|
||||||
|
supportFBO = FBO_NONE;
|
||||||
|
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Unbind the framebuffer
|
// Unbind the framebuffer
|
||||||
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
||||||
|
|
||||||
framebufferobject.init = true;
|
framebufferobject.init = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GL_Framebuffer_Unbind(void)
|
void GL_FBO_BindMainFrameBuffer(void)
|
||||||
{
|
{
|
||||||
if (!supportFBO || !framebufferobject.init)
|
if (supportFBO == FBO_NONE || !framebufferobject.init)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
||||||
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
|
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GL_Framebuffer_Enable(void)
|
void GL_FBO_Enable(void)
|
||||||
{
|
{
|
||||||
if (!supportFBO || !UseScreenFBO())
|
if (supportFBO == FBO_NONE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GL_Framebuffer_Generate();
|
GL_FBO_Generate();
|
||||||
|
|
||||||
|
// failed
|
||||||
|
if (!framebufferobject.init)
|
||||||
|
return;
|
||||||
|
|
||||||
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj);
|
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, framebufferobject.fboobj);
|
||||||
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, framebufferobject.rboobj);
|
pglBindRenderbuffer(GL_RENDERBUFFER_EXT, framebufferobject.rboobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GL_Framebuffer_Disable(void)
|
void GL_FBO_Disable(void)
|
||||||
{
|
{
|
||||||
if (!supportFBO || !framebufferobject.init)
|
if (supportFBO == FBO_NONE || !framebufferobject.init)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
pglBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
||||||
@@ -3341,7 +3370,7 @@ void GL_Framebuffer_Disable(void)
|
|||||||
pglDeleteFramebuffers(1, &framebufferobject.fboobj);
|
pglDeleteFramebuffers(1, &framebufferobject.fboobj);
|
||||||
framebufferobject.fboobj = 0;
|
framebufferobject.fboobj = 0;
|
||||||
|
|
||||||
GL_Framebuffer_DeleteAttachments();
|
GL_FBO_DeleteAttachments();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -3692,6 +3721,7 @@ void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8
|
|||||||
void GL_MakeScreenTexture(int tex)
|
void GL_MakeScreenTexture(int tex)
|
||||||
{
|
{
|
||||||
boolean firstTime;
|
boolean firstTime;
|
||||||
|
static GLint lastfiltermode[NUMSCREENTEXTURES] = {-1, -1, -1, -1, -1};
|
||||||
|
|
||||||
if (!gl_enable_screen_textures)
|
if (!gl_enable_screen_textures)
|
||||||
return;
|
return;
|
||||||
@@ -3704,21 +3734,34 @@ void GL_MakeScreenTexture(int tex)
|
|||||||
|
|
||||||
pglBindTexture(GL_TEXTURE_2D, screenTextures[tex]);
|
pglBindTexture(GL_TEXTURE_2D, screenTextures[tex]);
|
||||||
|
|
||||||
|
// if were downsampling, choose to do that with linear filter instead of nearest neighbor
|
||||||
|
// otherwise well get ugly mixels
|
||||||
|
GLint filtermode = I_IsDownsampling() ? GL_LINEAR : GL_NEAREST;
|
||||||
|
|
||||||
|
// avoid redundant calls to this, prob doesent really matter tbh
|
||||||
|
if (filtermode != lastfiltermode[tex] || firstTime)
|
||||||
|
{
|
||||||
|
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtermode);
|
||||||
|
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtermode);
|
||||||
|
|
||||||
|
lastfiltermode[tex] = filtermode;
|
||||||
|
}
|
||||||
|
|
||||||
if (firstTime)
|
if (firstTime)
|
||||||
{
|
{
|
||||||
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
||||||
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
||||||
Clamp2D(GL_TEXTURE_WRAP_S);
|
Clamp2D(GL_TEXTURE_WRAP_S);
|
||||||
Clamp2D(GL_TEXTURE_WRAP_T);
|
Clamp2D(GL_TEXTURE_WRAP_T);
|
||||||
pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, screen_texsizew, screen_texsizeh, 0);
|
pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, screen_texsizew, screen_texsizeh, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
pglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, screen_texsizew, screen_texsizeh);
|
pglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, screen_texsizew, screen_texsizeh);
|
||||||
|
}
|
||||||
|
|
||||||
tex_downloaded = screenTextures[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 xfix, yfix;
|
||||||
float origaspect, newaspect;
|
float origaspect, newaspect;
|
||||||
@@ -3771,9 +3814,6 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean usesh
|
|||||||
|
|
||||||
pglBindTexture(GL_TEXTURE_2D, screenTextures[tex]);
|
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);
|
pglColor4ubv(white);
|
||||||
|
|
||||||
pglTexCoordPointer(2, GL_FLOAT, 0, fix);
|
pglTexCoordPointer(2, GL_FLOAT, 0, fix);
|
||||||
@@ -3781,9 +3821,6 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean usesh
|
|||||||
|
|
||||||
pglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
pglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
||||||
|
|
||||||
if (useshader)
|
|
||||||
pglUseProgram(0);
|
|
||||||
|
|
||||||
tex_downloaded = screenTextures[tex];
|
tex_downloaded = screenTextures[tex];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
[Project]
|
|
||||||
FileName=r_opengl.dev
|
|
||||||
Name=r_opengl
|
|
||||||
Ver=1
|
|
||||||
IsCpp=1
|
|
||||||
Type=3
|
|
||||||
Compiler=-D_M_IX86=500_@@_-Wall_@@_-D_WINDOWS_@@_-DUSE_WGL_SWAP_@@_-Os_@@_-fomit-frame-pointer_@@_
|
|
||||||
CppCompiler=
|
|
||||||
Includes=
|
|
||||||
Linker=--def ../r_mingw.def_@@_-lgdi32_@@_
|
|
||||||
Libs=
|
|
||||||
UnitCount=3
|
|
||||||
Folders=
|
|
||||||
ObjFiles=
|
|
||||||
PrivateResource=
|
|
||||||
ResourceIncludes=
|
|
||||||
MakeIncludes=
|
|
||||||
Icon=
|
|
||||||
ExeOutput=C:\srb2demo2
|
|
||||||
ObjectOutput=..\..\..\objs\Mingw\r_opengl
|
|
||||||
OverrideOutput=1
|
|
||||||
OverrideOutputName=r_opengl.dll
|
|
||||||
HostApplication=
|
|
||||||
CommandLine=
|
|
||||||
IncludeVersionInfo=0
|
|
||||||
SupportXPThemes=0
|
|
||||||
CompilerSet=0
|
|
||||||
CompilerSettings=00000000000000000111d0
|
|
||||||
UseCustomMakefile=0
|
|
||||||
CustomMakefile=
|
|
||||||
|
|
||||||
[Unit1]
|
|
||||||
FileName=ogl_win.c
|
|
||||||
Folder=
|
|
||||||
Compile=1
|
|
||||||
CompileCpp=0
|
|
||||||
Link=1
|
|
||||||
Priority=1000
|
|
||||||
OverrideBuildCmd=0
|
|
||||||
BuildCmd=
|
|
||||||
|
|
||||||
[Unit2]
|
|
||||||
FileName=r_opengl.c
|
|
||||||
Folder=
|
|
||||||
Compile=1
|
|
||||||
CompileCpp=0
|
|
||||||
Link=1
|
|
||||||
Priority=1000
|
|
||||||
OverrideBuildCmd=0
|
|
||||||
BuildCmd=
|
|
||||||
|
|
||||||
[Unit3]
|
|
||||||
FileName=r_opengl.h
|
|
||||||
Folder=
|
|
||||||
Compile=1
|
|
||||||
CompileCpp=1
|
|
||||||
Link=1
|
|
||||||
Priority=1000
|
|
||||||
OverrideBuildCmd=0
|
|
||||||
BuildCmd=
|
|
||||||
|
|
||||||
[VersionInfo]
|
|
||||||
Major=0
|
|
||||||
Minor=1
|
|
||||||
Release=1
|
|
||||||
Build=1
|
|
||||||
LanguageID=1033
|
|
||||||
CharsetID=1252
|
|
||||||
CompanyName=
|
|
||||||
FileVersion=0.1
|
|
||||||
FileDescription=Developed using the Dev-C++ IDE
|
|
||||||
InternalName=
|
|
||||||
LegalCopyright=
|
|
||||||
LegalTrademarks=
|
|
||||||
OriginalFilename=r_opengl.exe
|
|
||||||
ProductName=r_opengl
|
|
||||||
ProductVersion=0.1
|
|
||||||
AutoIncBuildNr=0
|
|
||||||
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="r_opengl" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** DO NOT EDIT **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
|
||||||
|
|
||||||
CFG=r_opengl - Win32 Debug
|
|
||||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
|
||||||
!MESSAGE use the Export Makefile command and run
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "r_opengl.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "r_opengl.mak" CFG="r_opengl - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "r_opengl - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE "r_opengl - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
MTL=midl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "r_opengl - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "r_opengl___Win32_Release"
|
|
||||||
# PROP BASE Intermediate_Dir "r_opengl___Win32_Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "..\..\..\bin\VC\Release\r_opengl"
|
|
||||||
# PROP Intermediate_Dir "..\..\..\objs\VC\Release\r_opengl"
|
|
||||||
# PROP Ignore_Export_Lib 1
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "R_OPENGL_EXPORTS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /G5 /W3 /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "__WIN32__" /D "__MSC__" /D "USE_WGL_SWAP" /FR /FD /c
|
|
||||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x80c /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
|
||||||
# ADD LINK32 user32.lib gdi32.lib /nologo /dll /pdb:"..\..\..\bin\VC\Release\r_opengl.pdb" /machine:I386 /out:"C:\srb2demo2\r_opengl.dll"
|
|
||||||
# SUBTRACT LINK32 /pdb:none /debug
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "r_opengl - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "..\..\..\objs\Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "..\..\..\objs\Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "..\..\..\bin\VC\Debug\r_opengl"
|
|
||||||
# PROP Intermediate_Dir "..\..\..\objs\VC\Debug\r_opengl"
|
|
||||||
# PROP Ignore_Export_Lib 1
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "R_OPENGL_EXPORTS" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /G6 /W4 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "__WIN32__" /D "__MSC__" /D "USE_WGL_SWAP" /FR /FD /GZ /c
|
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x80c /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 user32.lib gdi32.lib /nologo /dll /pdb:"..\..\..\bin\VC\Debug\r_opengl.pdb" /debug /machine:I386 /out:"C:\srb2demo2\r_opengld.dll" /pdbtype:sept
|
|
||||||
# SUBTRACT LINK32 /pdb:none
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "r_opengl - Win32 Release"
|
|
||||||
# Name "r_opengl - Win32 Debug"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\ogl_win.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\r_opengl.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\r_opengl.h
|
|
||||||
# End Source File
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
||||||
@@ -98,9 +98,9 @@ extern PFNglGetString pglGetString;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_FBO_OGL
|
#ifdef USE_FBO_OGL
|
||||||
void GL_Framebuffer_Unbind(void);
|
void GL_FBO_BindMainFrameBuffer(void);
|
||||||
void GL_Framebuffer_Enable(void);
|
void GL_FBO_Enable(void);
|
||||||
void GL_Framebuffer_Disable(void);
|
void GL_FBO_Disable(void);
|
||||||
extern int supportFBO;
|
extern int supportFBO;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+10
-8
@@ -135,8 +135,7 @@ HMS_on_read (char *s, size_t _1, size_t n, void *userdata)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct HMS_buffer *
|
static struct HMS_buffer *HMS_connect(const char *format, ...)
|
||||||
HMS_connect (const char *format, ...)
|
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
CURL *curl;
|
CURL *curl;
|
||||||
@@ -174,7 +173,7 @@ HMS_connect (const char *format, ...)
|
|||||||
if (cv_masterserver_token.string && cv_masterserver_token.string[0])
|
if (cv_masterserver_token.string && cv_masterserver_token.string[0])
|
||||||
{
|
{
|
||||||
quack_token = curl_easy_escape(curl, cv_masterserver_token.string, 0);
|
quack_token = curl_easy_escape(curl, cv_masterserver_token.string, 0);
|
||||||
token_length = ( sizeof "&token="-1 )+ strlen(quack_token);
|
token_length = ( sizeof "&token="-1 ) + strlen(quack_token);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -186,27 +185,30 @@ HMS_connect (const char *format, ...)
|
|||||||
I_lock_mutex(&hms_api_mutex);
|
I_lock_mutex(&hms_api_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
seek = strlen(hms_api) + 1;/* + '/' */
|
seek = strlen(hms_api) + 1; /* + '/' */
|
||||||
|
|
||||||
va_start (ap, format);
|
va_start (ap, format);
|
||||||
url = malloc(seek + vsnprintf(NULL, 0, format, ap) + sizeof HMS_QUERY_VERSION - 1 + token_length + 1);
|
size_t url_size = (seek + vsnprintf(NULL, 0, format, ap) +
|
||||||
|
sizeof HMS_QUERY_VERSION - 1 +
|
||||||
|
token_length + 1);
|
||||||
|
url = malloc(url_size);
|
||||||
va_end (ap);
|
va_end (ap);
|
||||||
|
|
||||||
sprintf(url, "%s/", hms_api);
|
snprintf(url, seek + 1, "%s/", hms_api);
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(hms_api_mutex);
|
I_unlock_mutex(hms_api_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
va_start (ap, format);
|
va_start (ap, format);
|
||||||
seek += vsprintf(&url[seek], format, ap);
|
seek += vsnprintf(&url[seek], url_size - seek, format, ap);
|
||||||
va_end (ap);
|
va_end (ap);
|
||||||
|
|
||||||
strcpy(&url[seek], HMS_QUERY_VERSION);
|
strcpy(&url[seek], HMS_QUERY_VERSION);
|
||||||
seek += sizeof HMS_QUERY_VERSION - 1;
|
seek += sizeof HMS_QUERY_VERSION - 1;
|
||||||
|
|
||||||
if (quack_token)
|
if (quack_token)
|
||||||
sprintf(&url[seek], "&token=%s", quack_token);
|
snprintf(&url[seek], url_size - seek, "&token=%s", quack_token);
|
||||||
|
|
||||||
Printf_url(url);
|
Printf_url(url);
|
||||||
|
|
||||||
|
|||||||
+248
-289
@@ -97,7 +97,6 @@ static textinput_t w_chat;
|
|||||||
static boolean headsupactive = false;
|
static boolean headsupactive = false;
|
||||||
boolean hu_showscores = false; // draw rankings
|
boolean hu_showscores = false; // draw rankings
|
||||||
static char hu_tick;
|
static char hu_tick;
|
||||||
static tic_t hu_emoteanim = 0;
|
|
||||||
emote_autocomplete_t emote_autocomplete = {0};
|
emote_autocomplete_t emote_autocomplete = {0};
|
||||||
|
|
||||||
static huddrawlist_h luahuddrawlist_scores = NULL;
|
static huddrawlist_h luahuddrawlist_scores = NULL;
|
||||||
@@ -116,154 +115,12 @@ static patch_t *songcreditbg = NULL;
|
|||||||
// -------
|
// -------
|
||||||
static void HU_DrawRankings(void);
|
static void HU_DrawRankings(void);
|
||||||
|
|
||||||
|
|
||||||
consvar_t cv_showspecstuff = {"showspecstuff", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_showspecstuff = {"showspecstuff", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
//======================================================================
|
// stuff from SRB2-Banpyura thx alot! :3
|
||||||
// KEYBOARD LAYOUTS FOR ENTERING TEXT
|
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};
|
||||||
char *shiftxform = NULL;
|
|
||||||
|
|
||||||
char english_shiftxform[] =
|
|
||||||
{
|
|
||||||
0,
|
|
||||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
|
||||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
|
||||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
|
||||||
31,
|
|
||||||
' ', '!', '"', '#', '$', '%', '&',
|
|
||||||
'"', // shift-'
|
|
||||||
'(', ')', '*', '+',
|
|
||||||
'<', // shift-,
|
|
||||||
'_', // shift--
|
|
||||||
'>', // shift-.
|
|
||||||
'?', // shift-/
|
|
||||||
')', // shift-0
|
|
||||||
'!', // shift-1
|
|
||||||
'@', // shift-2
|
|
||||||
'#', // shift-3
|
|
||||||
'$', // shift-4
|
|
||||||
'%', // shift-5
|
|
||||||
'^', // shift-6
|
|
||||||
'&', // shift-7
|
|
||||||
'*', // shift-8
|
|
||||||
'(', // shift-9
|
|
||||||
':',
|
|
||||||
':', // shift-;
|
|
||||||
'<',
|
|
||||||
'+', // shift-=
|
|
||||||
'>', '?', '@',
|
|
||||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
|
||||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
|
||||||
'{', // shift-[
|
|
||||||
'|', // shift-backslash - OH MY GOD DOES WATCOM SUCK
|
|
||||||
'}', // shift-]
|
|
||||||
'"', '_',
|
|
||||||
'~', // shift-`
|
|
||||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
|
||||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
|
||||||
'{', '|', '}', '~', 127
|
|
||||||
};
|
|
||||||
|
|
||||||
char french_shiftxform[] =
|
|
||||||
{
|
|
||||||
0,
|
|
||||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
|
||||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
|
||||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
|
||||||
31,
|
|
||||||
' ','$', //shift-!
|
|
||||||
'3', //shift-"
|
|
||||||
'#', '$', '%',
|
|
||||||
'1', //shift-&
|
|
||||||
'4', // shift-'
|
|
||||||
'5', // shift-(
|
|
||||||
')', // shift-)
|
|
||||||
'*', '+',
|
|
||||||
'?', // shift-,
|
|
||||||
'6', // shift--
|
|
||||||
'.', '/',
|
|
||||||
'0', '1', '2', '3', '4', '5',
|
|
||||||
'6', '7', '8', '9',
|
|
||||||
'/', // shitf-:
|
|
||||||
'.', // shift-;
|
|
||||||
'>', // shift-<
|
|
||||||
'+', // shift-=
|
|
||||||
'>', '?', '@',
|
|
||||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
|
||||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
|
||||||
'[', '\\', ']', '^',
|
|
||||||
'8', //shift-_
|
|
||||||
'`',
|
|
||||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
|
||||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
|
||||||
'{', '|', '}', '~', 127,
|
|
||||||
128, 129,
|
|
||||||
'2',
|
|
||||||
131, 132,
|
|
||||||
'0',
|
|
||||||
134,
|
|
||||||
'9',
|
|
||||||
136, 137,
|
|
||||||
'7',
|
|
||||||
139, 140,
|
|
||||||
'%'
|
|
||||||
};
|
|
||||||
|
|
||||||
char french_altgrxform[] =
|
|
||||||
{
|
|
||||||
0,
|
|
||||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
|
||||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
|
||||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
|
||||||
31,
|
|
||||||
' ', '!',
|
|
||||||
'#', //altgr-"
|
|
||||||
'#', '$', '%', '&',
|
|
||||||
'{', //altgr-'
|
|
||||||
'[', //altgr-(
|
|
||||||
']', //altgr-)
|
|
||||||
'*', '+', ',',
|
|
||||||
'|', //altg--
|
|
||||||
'.', '/',
|
|
||||||
'0', '1', '2', '3', '4', '5',
|
|
||||||
'6', '7', '8', '9',
|
|
||||||
':', ';', '<',
|
|
||||||
'}', //altgr-=
|
|
||||||
'>', '?', '@',
|
|
||||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
|
||||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
|
||||||
'[', '\\', ']', '^',
|
|
||||||
'\\', //altgr-backslash
|
|
||||||
'`',
|
|
||||||
'a', 'b', 'c', 'd', 'E', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
|
|
||||||
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
|
||||||
'{', '|', '}', '~', 127,
|
|
||||||
128, 129,
|
|
||||||
'~',
|
|
||||||
131, 132,
|
|
||||||
'@',
|
|
||||||
134,
|
|
||||||
'^',
|
|
||||||
136, 137,
|
|
||||||
'`',
|
|
||||||
139, 140,
|
|
||||||
KEY_FR_U_GRAVE
|
|
||||||
};
|
|
||||||
|
|
||||||
//fallback for special letter non displayable in the game (i.e.: 'é','à',etc.)
|
|
||||||
INT32 HU_FallBackFrSpecialLetter(INT32 key)
|
|
||||||
{
|
|
||||||
switch(key){
|
|
||||||
case KEY_FR_E_AIGUE: return 'e';
|
|
||||||
case KEY_FR_E_GRAVE: return 'e';
|
|
||||||
case KEY_FR_C_CEDILLE: return 'c';
|
|
||||||
case KEY_FR_A_GRAVE: return 'a';
|
|
||||||
case KEY_FR_U_GRAVE: return 'u';
|
|
||||||
default: return key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static char cechotext[1024];
|
static char cechotext[1024];
|
||||||
static tic_t cechotimer = 0;
|
static tic_t cechotimer = 0;
|
||||||
@@ -281,6 +138,7 @@ static void Command_Say_f(void);
|
|||||||
static void Command_Sayto_f(void);
|
static void Command_Sayto_f(void);
|
||||||
static void Command_Sayteam_f(void);
|
static void Command_Sayteam_f(void);
|
||||||
static void Command_CSay_f(void);
|
static void Command_CSay_f(void);
|
||||||
|
static void Command_Mute_f(void);
|
||||||
static void Got_Saycmd(const UINT8 **p, INT32 playernum);
|
static void Got_Saycmd(const UINT8 **p, INT32 playernum);
|
||||||
|
|
||||||
void HU_LoadGraphics(void)
|
void HU_LoadGraphics(void)
|
||||||
@@ -296,14 +154,14 @@ void HU_LoadGraphics(void)
|
|||||||
for (i = 0; i < HU_FONTSIZE; i++, j++)
|
for (i = 0; i < HU_FONTSIZE; i++, j++)
|
||||||
{
|
{
|
||||||
// cache the heads-up font for entire game execution
|
// cache the heads-up font for entire game execution
|
||||||
sprintf(buffer, "STCFN%.3d", j);
|
snprintf(buffer, sizeof(buffer), "STCFN%.3d", j);
|
||||||
if (W_CheckNumForName(buffer) == LUMPERROR)
|
if (W_CheckNumForName(buffer) == LUMPERROR)
|
||||||
hu_font[i] = NULL;
|
hu_font[i] = NULL;
|
||||||
else
|
else
|
||||||
hu_font[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
hu_font[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
|
|
||||||
// tiny version of the heads-up font
|
// tiny version of the heads-up font
|
||||||
sprintf(buffer, "TNYFN%.3d", j);
|
snprintf(buffer, sizeof(buffer), "TNYFN%.3d", j);
|
||||||
if (W_CheckNumForName(buffer) == LUMPERROR)
|
if (W_CheckNumForName(buffer) == LUMPERROR)
|
||||||
tny_font[i] = NULL;
|
tny_font[i] = NULL;
|
||||||
else
|
else
|
||||||
@@ -330,7 +188,7 @@ void HU_LoadGraphics(void)
|
|||||||
for (i = 0; i < KART_FONTSIZE; i++, j++)
|
for (i = 0; i < KART_FONTSIZE; i++, j++)
|
||||||
{
|
{
|
||||||
// cache the heads-up font for entire game execution
|
// cache the heads-up font for entire game execution
|
||||||
sprintf(buffer, "MKFNT%.3d", j);
|
snprintf(buffer, sizeof(buffer), "MKFNT%.3d", j);
|
||||||
if (W_CheckNumForName(buffer) == LUMPERROR)
|
if (W_CheckNumForName(buffer) == LUMPERROR)
|
||||||
kart_font[i] = NULL;
|
kart_font[i] = NULL;
|
||||||
else
|
else
|
||||||
@@ -341,7 +199,7 @@ void HU_LoadGraphics(void)
|
|||||||
j = LT_FONTSTART;
|
j = LT_FONTSTART;
|
||||||
for (i = 0; i < LT_FONTSIZE; i++)
|
for (i = 0; i < LT_FONTSIZE; i++)
|
||||||
{
|
{
|
||||||
sprintf(buffer, "LTFNT%.3d", j);
|
snprintf(buffer, sizeof(buffer), "LTFNT%.3d", j);
|
||||||
j++;
|
j++;
|
||||||
|
|
||||||
if (W_CheckNumForName(buffer) == LUMPERROR)
|
if (W_CheckNumForName(buffer) == LUMPERROR)
|
||||||
@@ -354,7 +212,7 @@ void HU_LoadGraphics(void)
|
|||||||
j = CRED_FONTSTART;
|
j = CRED_FONTSTART;
|
||||||
for (i = 0; i < CRED_FONTSIZE; i++)
|
for (i = 0; i < CRED_FONTSIZE; i++)
|
||||||
{
|
{
|
||||||
sprintf(buffer, "CRFNT%.3d", j);
|
snprintf(buffer, sizeof(buffer), "CRFNT%.3d", j);
|
||||||
j++;
|
j++;
|
||||||
|
|
||||||
if (W_CheckNumForName(buffer) == LUMPERROR)
|
if (W_CheckNumForName(buffer) == LUMPERROR)
|
||||||
@@ -366,11 +224,11 @@ void HU_LoadGraphics(void)
|
|||||||
// cache numbers too!
|
// cache numbers too!
|
||||||
for (i = 0; i < 10; i++)
|
for (i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
sprintf(buffer, "STTNUM%d", i);
|
snprintf(buffer, sizeof(buffer), "STTNUM%d", i);
|
||||||
tallnum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
tallnum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
sprintf(buffer, "PINGN%d", i);
|
snprintf(buffer, sizeof(buffer), "PINGN%d", i);
|
||||||
pingnum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
pingnum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
sprintf(buffer, "OPPRNK0%d", i);
|
snprintf(buffer, sizeof(buffer), "OPPRNK0%d", i);
|
||||||
ranknum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
ranknum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -382,7 +240,7 @@ void HU_LoadGraphics(void)
|
|||||||
// cache ping gfx:
|
// cache ping gfx:
|
||||||
for (i = 0; i < 5; i++)
|
for (i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
sprintf(buffer, "PINGGFX%d", i+1);
|
snprintf(buffer, sizeof(buffer), "PINGGFX%d", i+1);
|
||||||
pinggfx[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
pinggfx[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -408,8 +266,7 @@ void HU_Init(void)
|
|||||||
COM_AddCommand("csay", Command_CSay_f);
|
COM_AddCommand("csay", Command_CSay_f);
|
||||||
RegisterNetXCmd(XD_SAY, Got_Saycmd);
|
RegisterNetXCmd(XD_SAY, Got_Saycmd);
|
||||||
|
|
||||||
// set shift translation table
|
COM_AddCommand("muteplayer", Command_Mute_f);
|
||||||
shiftxform = english_shiftxform;
|
|
||||||
|
|
||||||
if (dedicated || rendermode == render_none)
|
if (dedicated || rendermode == render_none)
|
||||||
return;
|
return;
|
||||||
@@ -436,11 +293,6 @@ void HU_Start(void)
|
|||||||
headsupactive = true;
|
headsupactive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HU_Shiftform(void)
|
|
||||||
{
|
|
||||||
shiftxform = (cv_keyboardlayout.value == 3) ? french_shiftxform : english_shiftxform;
|
|
||||||
}
|
|
||||||
|
|
||||||
//======================================================================
|
//======================================================================
|
||||||
// EXECUTION
|
// EXECUTION
|
||||||
//======================================================================
|
//======================================================================
|
||||||
@@ -544,6 +396,8 @@ void HU_AddChatText(const char *text, boolean playsound)
|
|||||||
HU_removeChatText_Log();
|
HU_removeChatText_Log();
|
||||||
|
|
||||||
chat_log[chat_nummsg_log] = malloc(HU_MSGBUFSIZE);
|
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);
|
strcpy(chat_log[chat_nummsg_log], text);
|
||||||
++chat_nummsg_log;
|
++chat_nummsg_log;
|
||||||
|
|
||||||
@@ -618,15 +472,16 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
|||||||
strlcat(msg, COM_Argv(ix + usedargs), msgspace);
|
strlcat(msg, COM_Argv(ix + usedargs), msgspace);
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t msglength = strlen(msg);
|
if (strlen(msg) > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
|
||||||
|
|
||||||
if (msglength > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
|
|
||||||
{
|
{
|
||||||
// what we're gonna do now is check if the node exists
|
// what we're gonna do now is check if the node exists
|
||||||
// with that logic, characters 4 and 5 are our numbers:
|
// with that logic, characters 4 and 5 are our numbers:
|
||||||
const char *newmsg;
|
const char *newmsg;
|
||||||
INT32 spc = 1; // used if nodenum[1] is a space.
|
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);
|
memcpy(nodenum, msg+3, 2);
|
||||||
nodenum[2] = '\0';
|
nodenum[2] = '\0';
|
||||||
|
|
||||||
@@ -671,7 +526,7 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
|||||||
strlcpy(msg, newmsg, HU_MAXMSGLEN + 1);
|
strlcpy(msg, newmsg, HU_MAXMSGLEN + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
SendNetXCmd(XD_SAY, buf, msglength + 1 + msg-buf);
|
SendNetXCmd(XD_SAY, buf, strlen(msg) + 1 + msg-buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Send a message to everyone.
|
/** Send a message to everyone.
|
||||||
@@ -907,7 +762,7 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
|
|||||||
target = READSINT8(*p);
|
target = READSINT8(*p);
|
||||||
flags = READUINT8(*p);
|
flags = READUINT8(*p);
|
||||||
msg = buf;
|
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)))
|
if ((cv_mute.value || flags & (HU_CSAY|HU_SERVER_SAY)) && playernum != serverplayer && !(IsPlayerAdmin(playernum)))
|
||||||
{
|
{
|
||||||
@@ -922,12 +777,11 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t msglength = strlen(msg);
|
|
||||||
|
|
||||||
//check for invalid characters (0x80 or above)
|
//check for invalid characters (0x80 or above)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
const size_t j = msglength;
|
const size_t j = strlen(msg);
|
||||||
|
|
||||||
for (i = 0; i < j; i++)
|
for (i = 0; i < j; i++)
|
||||||
{
|
{
|
||||||
if (msg[i] & 0x80)
|
if (msg[i] & 0x80)
|
||||||
@@ -974,7 +828,7 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Handle "/me" actions, but only in messages to everyone.
|
// Handle "/me" actions, but only in messages to everyone.
|
||||||
if (target == 0 && msglength > 4 && strnicmp(msg, "/me ", 4) == 0)
|
if (target == 0 && strlen(msg) > 4 && strnicmp(msg, "/me ", 4) == 0)
|
||||||
{
|
{
|
||||||
msg += 4;
|
msg += 4;
|
||||||
action = true;
|
action = true;
|
||||||
@@ -1095,7 +949,6 @@ void HU_Ticker(void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
hu_tick++;
|
hu_tick++;
|
||||||
hu_emoteanim++;
|
|
||||||
hu_tick &= 7; // currently only to blink chat input cursor
|
hu_tick &= 7; // currently only to blink chat input cursor
|
||||||
|
|
||||||
if (PLAYER1INPUTDOWN(gc_scores))
|
if (PLAYER1INPUTDOWN(gc_scores))
|
||||||
@@ -1115,7 +968,7 @@ void HU_Ticker(void)
|
|||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
// handle spam while we're at it:
|
// handle spam while we're at it:
|
||||||
for(; (i < MAXPLAYERS); i++)
|
for (; (i < MAXPLAYERS); i++)
|
||||||
{
|
{
|
||||||
if (stop_spamming[i] > 0)
|
if (stop_spamming[i] > 0)
|
||||||
stop_spamming[i]--;
|
stop_spamming[i]--;
|
||||||
@@ -1131,7 +984,8 @@ void HU_Ticker(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cechotimer > 0) --cechotimer;
|
if (cechotimer > 0)
|
||||||
|
--cechotimer;
|
||||||
|
|
||||||
// Animate the desynch dots
|
// Animate the desynch dots
|
||||||
if (hu_resynching
|
if (hu_resynching
|
||||||
@@ -1173,21 +1027,42 @@ static boolean HU_clearChatSpaces(void)
|
|||||||
return nothingbutspaces;
|
return nothingbutspaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DoMute(const char *name)
|
static void DoMute(const char *name, boolean chat)
|
||||||
{
|
{
|
||||||
INT32 pnum = D_LookupPlayer(name);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
player_muted[pnum] = !player_muted[pnum];
|
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])
|
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)
|
static void HU_SendChatMessage(void)
|
||||||
@@ -1221,7 +1096,7 @@ static void HU_SendChatMessage(void)
|
|||||||
if (msglength >= 5 && strnicmp(msg, "/mute", 5) == 0) // Used /mute
|
if (msglength >= 5 && strnicmp(msg, "/mute", 5) == 0) // Used /mute
|
||||||
{
|
{
|
||||||
if (msglength > 6)
|
if (msglength > 6)
|
||||||
DoMute(msg+6);
|
DoMute(msg+6, true);
|
||||||
else
|
else
|
||||||
HU_AddChatText("\x82NOTICE: \x80Usage: /mute <name|node>", false);
|
HU_AddChatText("\x82NOTICE: \x80Usage: /mute <name|node>", false);
|
||||||
|
|
||||||
@@ -1232,7 +1107,9 @@ static void HU_SendChatMessage(void)
|
|||||||
{
|
{
|
||||||
INT32 spc = 1; // used if nodenum[1] is a space.
|
INT32 spc = 1; // used if nodenum[1] is a space.
|
||||||
const char *newmsg;
|
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
|
// what we're gonna do now is check if the node exists
|
||||||
// with that logic, characters 4 and 5 are our numbers:
|
// with that logic, characters 4 and 5 are our numbers:
|
||||||
@@ -1260,6 +1137,7 @@ static void HU_SendChatMessage(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// I'm very bad at C, I swear I am, additional checks eww!
|
// I'm very bad at C, I swear I am, additional checks eww!
|
||||||
if (spc != 0)
|
if (spc != 0)
|
||||||
{
|
{
|
||||||
@@ -1406,13 +1284,15 @@ boolean HU_Responder(event_t *ev)
|
|||||||
chat_on = false;
|
chat_on = false;
|
||||||
I_SetTextInput(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--;
|
chat_scroll--;
|
||||||
justscrolledup = true;
|
justscrolledup = true;
|
||||||
chat_scrolltime = 4;
|
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++;
|
chat_scroll++;
|
||||||
justscrolleddown = true;
|
justscrolleddown = true;
|
||||||
@@ -1492,7 +1372,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.
|
// 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!
|
// chat stuff by VincyTM LOL XD!
|
||||||
|
|
||||||
@@ -1519,7 +1404,7 @@ static void HU_drawMiniChat(void)
|
|||||||
|
|
||||||
for (; i > 0; i--)
|
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;
|
size_t j = 0;
|
||||||
INT32 linescount = 0;
|
INT32 linescount = 0;
|
||||||
emote_t *emote = NULL;
|
emote_t *emote = NULL;
|
||||||
@@ -1576,15 +1461,14 @@ static void HU_drawMiniChat(void)
|
|||||||
|
|
||||||
y = chaty - charheight*(msglines+1);
|
y = chaty - charheight*(msglines+1);
|
||||||
|
|
||||||
#ifdef NETSPLITSCREEN
|
|
||||||
if (splitscreen)
|
if (splitscreen)
|
||||||
{
|
{
|
||||||
y -= BASEVIDHEIGHT/2;
|
y -= BASEVIDHEIGHT/2;
|
||||||
|
|
||||||
if (splitscreen > 1)
|
if (splitscreen > 1)
|
||||||
y += 16;
|
y += 16;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
y -= (cv_kartspeedometer.value ? 16 : 0);
|
y -= (cv_kartspeedometer.value ? 16 : 0);
|
||||||
|
|
||||||
dx = 0;
|
dx = 0;
|
||||||
@@ -1598,7 +1482,7 @@ static void HU_drawMiniChat(void)
|
|||||||
INT32 timer = ((cv_chattime.value*TICRATE)-chat_timers[i]) - cv_chattime.value*TICRATE+9; // see below...
|
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.
|
INT32 transflag = (timer >= 0 && timer <= 9) ? (timer*V_10TRANS) : 0; // you can make bad jokes out of this one.
|
||||||
size_t j = 0;
|
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;
|
UINT8 *colormap = NULL;
|
||||||
emote_t *emote = NULL;
|
emote_t *emote = NULL;
|
||||||
int emotelen = 0;
|
int emotelen = 0;
|
||||||
@@ -1631,9 +1515,9 @@ static void HU_drawMiniChat(void)
|
|||||||
else if ((emote = M_VerifyEmote(msg+j, &emotelen)))
|
else if ((emote = M_VerifyEmote(msg+j, &emotelen)))
|
||||||
{
|
{
|
||||||
if (cv_chatbacktint.value) // on request of wolfy
|
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;
|
dx += EMOTEWIDTH - charwidth;
|
||||||
|
|
||||||
j += emotelen;
|
j += emotelen;
|
||||||
@@ -1641,9 +1525,9 @@ static void HU_drawMiniChat(void)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (cv_chatbacktint.value) // on request of wolfy
|
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;
|
dx += charwidth;
|
||||||
@@ -1682,18 +1566,15 @@ static void HU_drawChatLog(INT32 offset)
|
|||||||
if (chat_scroll > chat_maxscroll)
|
if (chat_scroll > chat_maxscroll)
|
||||||
chat_scroll = chat_maxscroll;
|
chat_scroll = chat_maxscroll;
|
||||||
|
|
||||||
#ifdef NETSPLITSCREEN
|
|
||||||
if (splitscreen)
|
if (splitscreen)
|
||||||
{
|
{
|
||||||
boxh = max(6, boxh/2);
|
boxh = max(6, boxh/2);
|
||||||
if (splitscreen > 1)
|
if (splitscreen > 1)
|
||||||
boxw = max(64, boxw/2);
|
boxw = max(64, boxw/2);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
y = chaty - offset*charheight - (chat_scroll*charheight) - boxh*charheight - 12;
|
y = chaty - offset*charheight - (chat_scroll*charheight) - boxh*charheight - 12;
|
||||||
|
|
||||||
#ifdef NETSPLITSCREEN
|
|
||||||
if (splitscreen)
|
if (splitscreen)
|
||||||
{
|
{
|
||||||
y -= BASEVIDHEIGHT/2;
|
y -= BASEVIDHEIGHT/2;
|
||||||
@@ -1701,20 +1582,19 @@ static void HU_drawChatLog(INT32 offset)
|
|||||||
y += 16;
|
y += 16;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
y -= (cv_kartspeedometer.value ? 16 : 0);
|
y -= (cv_kartspeedometer.value ? 16 : 0);
|
||||||
|
|
||||||
|
|
||||||
chat_topy = y + chat_scroll*charheight;
|
chat_topy = y + chat_scroll*charheight;
|
||||||
chat_bottomy = chat_topy + boxh*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
|
for (i = 0; i < chat_nummsg_log; i++) // iterate through our chatlog
|
||||||
{
|
{
|
||||||
INT32 clrflag = 0;
|
INT32 clrflag = 0;
|
||||||
INT32 j = 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;
|
UINT8 *colormap = NULL;
|
||||||
emote_t *emote = NULL;
|
emote_t *emote = NULL;
|
||||||
int emotelen = 0;
|
int emotelen = 0;
|
||||||
@@ -1744,7 +1624,7 @@ static void HU_drawChatLog(INT32 offset)
|
|||||||
{
|
{
|
||||||
if ((y+dy+2 >= chat_topy) && (y+dy < (chat_bottomy)))
|
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;
|
dx += EMOTEWIDTH - charwidth;
|
||||||
}
|
}
|
||||||
j += emotelen;
|
j += emotelen;
|
||||||
@@ -1752,7 +1632,7 @@ static void HU_drawChatLog(INT32 offset)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ((y+dy+2 >= chat_topy) && (y+dy < (chat_bottomy)))
|
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
|
else
|
||||||
j++; // don't forget to increment this or we'll get stuck in the limbo.
|
j++; // don't forget to increment this or we'll get stuck in the limbo.
|
||||||
}
|
}
|
||||||
@@ -1789,9 +1669,9 @@ static void HU_drawChatLog(INT32 offset)
|
|||||||
|
|
||||||
// draw arrows to indicate that we can (or not) scroll.
|
// draw arrows to indicate that we can (or not) scroll.
|
||||||
if (chat_scroll > 0)
|
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)
|
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;
|
justscrolleddown = false;
|
||||||
justscrolledup = false;
|
justscrolledup = false;
|
||||||
@@ -1809,13 +1689,14 @@ static void HU_DrawChat(void)
|
|||||||
INT32 boxw = cv_chatwidth.value;
|
INT32 boxw = cv_chatwidth.value;
|
||||||
INT32 t = 0, c = 0, y = chaty - (typelines*charheight);
|
INT32 t = 0, c = 0, y = chaty - (typelines*charheight);
|
||||||
UINT32 i = 0, saylen = strlen(w_chat_buf); // You learn new things everyday!
|
UINT32 i = 0, saylen = strlen(w_chat_buf); // You learn new things everyday!
|
||||||
|
UINT32 charcount = 0;
|
||||||
INT32 cflag = 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;
|
size_t select_start = 0, select_end = 0;
|
||||||
const char *ntalk = "Say: ", *ttalk = "Team: ";
|
const char *ntalk = "Say: ", *ttalk = "Team: ";
|
||||||
const char *talk = ntalk;
|
const char *talk = ntalk;
|
||||||
const char *mute = "Chat has been muted.";
|
const char *mute = "Chat has been muted.";
|
||||||
|
|
||||||
#ifdef NETSPLITSCREEN
|
|
||||||
if (splitscreen)
|
if (splitscreen)
|
||||||
{
|
{
|
||||||
y -= BASEVIDHEIGHT/2;
|
y -= BASEVIDHEIGHT/2;
|
||||||
@@ -1826,7 +1707,6 @@ static void HU_DrawChat(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
y -= (cv_kartspeedometer.value ? 16 : 0);
|
y -= (cv_kartspeedometer.value ? 16 : 0);
|
||||||
|
|
||||||
if (teamtalk)
|
if (teamtalk)
|
||||||
@@ -1841,7 +1721,7 @@ static void HU_DrawChat(void)
|
|||||||
cflag = V_GRAYMAP; // set text in gray if chat is muted.
|
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])
|
while (talk[i])
|
||||||
{
|
{
|
||||||
@@ -1849,7 +1729,7 @@ static void HU_DrawChat(void)
|
|||||||
++i;
|
++i;
|
||||||
else
|
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++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1867,7 +1747,7 @@ static void HU_DrawChat(void)
|
|||||||
typelines = 1;
|
typelines = 1;
|
||||||
|
|
||||||
if ((w_chat.cursor == 0 || w_chat.length == 0) && hu_tick < 4)
|
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)
|
if (w_chat.select != w_chat.cursor)
|
||||||
{
|
{
|
||||||
@@ -1884,17 +1764,23 @@ static void HU_DrawChat(void)
|
|||||||
|
|
||||||
if ((emote = M_VerifyEmote(w_chat_buf+i, &emotelen)))
|
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;
|
c += EMOTEWIDTH - charwidth;
|
||||||
i += emotelen-1;
|
i += emotelen-1;
|
||||||
drawwidth = EMOTEWIDTH;
|
drawwidth = EMOTEWIDTH;
|
||||||
|
if (cv_chat_showlimit.value)
|
||||||
|
charcount += emotelen;
|
||||||
}
|
}
|
||||||
else if (w_chat_buf[i] >= HU_FONTSTART) //Hurdler: isn't it better like that?
|
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
|
// Draw selection
|
||||||
if (i >= select_start && i < select_end)
|
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;
|
++i;
|
||||||
|
|
||||||
@@ -1903,7 +1789,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 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);
|
INT32 cursory = (cursorx != chatx+1) ? (y) : (y+charheight);
|
||||||
if (hu_tick < 4)
|
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
|
if (cursorx == chatx+1 && saylen == i-1) // a weirdo hack
|
||||||
{
|
{
|
||||||
@@ -1921,62 +1807,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;
|
// Limit
|
||||||
int skip = 0;
|
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));
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle /pm list. It's messy, horrible and I don't care.
|
// handle /pm list. It's messy, horrible and I don't care.
|
||||||
@@ -1985,7 +1820,7 @@ static void HU_DrawChat(void)
|
|||||||
INT32 count = 0;
|
INT32 count = 0;
|
||||||
INT32 p_dispy = chaty - charheight - 1;
|
INT32 p_dispy = chaty - charheight - 1;
|
||||||
size_t longest_name_length = 0;
|
size_t longest_name_length = 0;
|
||||||
#ifdef NETSPLITSCREEN
|
|
||||||
if (splitscreen)
|
if (splitscreen)
|
||||||
{
|
{
|
||||||
p_dispy -= BASEVIDHEIGHT/2;
|
p_dispy -= BASEVIDHEIGHT/2;
|
||||||
@@ -1993,13 +1828,13 @@ static void HU_DrawChat(void)
|
|||||||
p_dispy += 16;
|
p_dispy += 16;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
p_dispy -= (cv_kartspeedometer.value ? 16 : 0);
|
p_dispy -= (cv_kartspeedometer.value ? 16 : 0);
|
||||||
|
|
||||||
// Find longest player name, for drawing background for /pm list later
|
// Find longest player name, for drawing background for /pm list later
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
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]));
|
longest_name_length = max(longest_name_length, strlen(player_names[i]));
|
||||||
}
|
}
|
||||||
@@ -2014,6 +1849,7 @@ static void HU_DrawChat(void)
|
|||||||
{
|
{
|
||||||
char nodenum[3];
|
char nodenum[3];
|
||||||
UINT32 n;
|
UINT32 n;
|
||||||
|
|
||||||
// right, that's half important: (w_chat_buf[4] may be a space since /pm0 msg is perfectly acceptable!)
|
// 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)))
|
if (!isdigit(w_chat_buf[3]) || !(isdigit(w_chat_buf[4]) || (w_chat_buf[4] == ' ') || (w_chat_buf[4] == 0)))
|
||||||
break;
|
break;
|
||||||
@@ -2051,16 +1887,79 @@ static void HU_DrawChat(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// fill it like the chat so the text doesn't become hard to read because of the hud.
|
// 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++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count == 0) // no results.
|
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.
|
pm_offset = 48 + 2;
|
||||||
V_DrawSmallString(chatx + boxw + 4, p_dispy - (6*count), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, "NO RESULT.");
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2072,6 +1971,7 @@ static void HU_DrawChat(void)
|
|||||||
static void HU_DrawChat_Old(void)
|
static void HU_DrawChat_Old(void)
|
||||||
{
|
{
|
||||||
INT32 t = 0, c = 0, y = HU_INPUTY;
|
INT32 t = 0, c = 0, y = HU_INPUTY;
|
||||||
|
UINT32 charcount = 0;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
const char *ntalk = "Say: ", *ttalk = "Say-Team: ";
|
const char *ntalk = "Say: ", *ttalk = "Say-Team: ";
|
||||||
const char *talk = ntalk;
|
const char *talk = ntalk;
|
||||||
@@ -2117,11 +2017,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);
|
M_DrawScaledEmote((HU_INPUTX + c)<<FRACBITS, (y+con_scalefactor*2)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART | V_NOSCALEPATCH | t);
|
||||||
i += emotelen-1;
|
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?
|
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;
|
//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);
|
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
|
// Draw selection
|
||||||
@@ -2134,7 +2040,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 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);
|
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;
|
c += charwidth;
|
||||||
@@ -2144,6 +2050,24 @@ static void HU_DrawChat_Old(void)
|
|||||||
y += charheight;
|
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)
|
static void HU_DrawCEcho(void)
|
||||||
@@ -2332,12 +2256,13 @@ static void HU_DrawSongCreditsBox(void)
|
|||||||
y = -BOXCREDITHEIGHT*dup + (FixedMul(BOXCREDITHEIGHT*FRACUNIT, FixedDiv(t*FRACUNIT, TICRATE*FRACUNIT/2))*dup - interpoffset)/FRACUNIT;
|
y = -BOXCREDITHEIGHT*dup + (FixedMul(BOXCREDITHEIGHT*FRACUNIT, FixedDiv(t*FRACUNIT, TICRATE*FRACUNIT/2))*dup - interpoffset)/FRACUNIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
bgt = (NUMTRANSMAPS/2) + (cursongcredit.trans/2);
|
bgt = (NUMTRANSMAPS/2) + (cursongcredit.trans/2) - 2; // arbitrary value, looks a bit better
|
||||||
|
|
||||||
if (bgt < NUMTRANSMAPS)
|
if (bgt < NUMTRANSMAPS)
|
||||||
{
|
{
|
||||||
V_DrawFill(x, y, strwidth*dup, BOXCREDITHEIGHT*dup, 28|flags|(bgt<<V_ALPHASHIFT));
|
const UINT8 accent = colortranslations[K_GetHudColor()][7];
|
||||||
V_DrawFill(x+dup, y+dup, (strwidth-2)*dup, (BOXCREDITHEIGHT-2)*dup, 30|flags|(bgt<<V_ALPHASHIFT));
|
V_DrawFill(x, y, strwidth*dup, BOXCREDITHEIGHT*dup, accent|flags|(bgt<<V_ALPHASHIFT));
|
||||||
|
V_DrawFill(x+dup, y+dup, (strwidth-2)*dup, (BOXCREDITHEIGHT-2)*dup, accent|flags|(bgt<<V_ALPHASHIFT));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cursongcredit.trans < NUMTRANSMAPS)
|
if (cursongcredit.trans < NUMTRANSMAPS)
|
||||||
@@ -2364,6 +2289,21 @@ 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
|
// Heads up displays drawer, call each frame
|
||||||
//
|
//
|
||||||
@@ -2372,6 +2312,8 @@ void HU_Drawer(void)
|
|||||||
if (cv_vhseffect.value && ((paused && !camera[R_GetViewNumber()].freecam) || (demo.playback && cv_playbackspeed.value > 1)))
|
if (cv_vhseffect.value && ((paused && !camera[R_GetViewNumber()].freecam) || (demo.playback && cv_playbackspeed.value > 1)))
|
||||||
V_DrawVhsEffect(demo.rewinding);
|
V_DrawVhsEffect(demo.rewinding);
|
||||||
|
|
||||||
|
HU_ForceShowChat();
|
||||||
|
|
||||||
// draw chat string plus cursor
|
// draw chat string plus cursor
|
||||||
if (chat_on)
|
if (chat_on)
|
||||||
{
|
{
|
||||||
@@ -2451,8 +2393,7 @@ void HU_Drawer(void)
|
|||||||
// IN-LEVEL MULTIPLAYER RANKINGS
|
// IN-LEVEL MULTIPLAYER RANKINGS
|
||||||
//======================================================================
|
//======================================================================
|
||||||
|
|
||||||
static int
|
static int Ping_gfx_num(int lag)
|
||||||
Ping_gfx_num (int lag)
|
|
||||||
{
|
{
|
||||||
if (lag < 2)
|
if (lag < 2)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -2466,8 +2407,7 @@ Ping_gfx_num (int lag)
|
|||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int Ping_gfx_color(UINT32 lag)
|
||||||
Ping_gfx_color (UINT32 lag)
|
|
||||||
{
|
{
|
||||||
if (lag < 2)
|
if (lag < 2)
|
||||||
return SKINCOLOR_JAWZ;
|
return SKINCOLOR_JAWZ;
|
||||||
@@ -2490,8 +2430,7 @@ Ping_gfx_color (UINT32 lag)
|
|||||||
return SKINCOLOR_WHITE; // to make the flashing work
|
return SKINCOLOR_WHITE; // to make the flashing work
|
||||||
}
|
}
|
||||||
|
|
||||||
static const UINT8 *
|
static const UINT8 *Ping_gfx_colormap(UINT32 lag, boolean gentleman)
|
||||||
Ping_gfx_colormap (UINT32 lag, boolean gentleman)
|
|
||||||
{
|
{
|
||||||
const UINT8 *colormap = NULL;
|
const UINT8 *colormap = NULL;
|
||||||
|
|
||||||
@@ -2511,8 +2450,7 @@ Ping_gfx_colormap (UINT32 lag, boolean gentleman)
|
|||||||
return colormap;
|
return colormap;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT32
|
static UINT32 Ping_conversion(UINT32 lag)
|
||||||
Ping_conversion (UINT32 lag)
|
|
||||||
{
|
{
|
||||||
if (cv_pingmeasurement.value)
|
if (cv_pingmeasurement.value)
|
||||||
{
|
{
|
||||||
@@ -2629,6 +2567,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
|
// HU_DrawSpectatorTicker
|
||||||
//
|
//
|
||||||
@@ -2869,8 +2827,9 @@ static void HU_DrawRankings(void)
|
|||||||
scorelines++;
|
scorelines++;
|
||||||
|
|
||||||
#if MAXPLAYERS > 16
|
#if MAXPLAYERS > 16
|
||||||
if (scorelines > 16)
|
// 32 Player TODO: port over and cleanup scoreboard from sat-32p/blankart
|
||||||
break; //dont draw past bottom of screen, show the best only
|
if (scorelines >= 16)
|
||||||
|
break; // dont draw past bottom of screen, show the best only
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-18
@@ -42,15 +42,6 @@
|
|||||||
#define CRED_FONTEND 'Z' // the last font character
|
#define CRED_FONTEND 'Z' // the last font character
|
||||||
#define CRED_FONTSIZE (CRED_FONTEND - CRED_FONTSTART + 1)
|
#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
|
// sorted player lines
|
||||||
//------------------------------------
|
//------------------------------------
|
||||||
@@ -68,12 +59,7 @@ typedef struct
|
|||||||
#define HU_MAXMSGLEN 223
|
#define HU_MAXMSGLEN 223
|
||||||
#define HU_MSGBUFSIZE 255
|
#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 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)
|
#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 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.
|
#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
|
// set true whenever the tab rankings are being shown for any reason
|
||||||
extern boolean hu_showscores;
|
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.
|
// init heads up data at game startup.
|
||||||
void HU_Init(void);
|
void HU_Init(void);
|
||||||
|
|
||||||
@@ -110,8 +100,6 @@ void HU_LoadGraphics(void);
|
|||||||
// reset heads up when consoleplayer respawns.
|
// reset heads up when consoleplayer respawns.
|
||||||
void HU_Start(void);
|
void HU_Start(void);
|
||||||
|
|
||||||
void HU_Shiftform(void);
|
|
||||||
|
|
||||||
boolean HU_Responder(event_t *ev);
|
boolean HU_Responder(event_t *ev);
|
||||||
void HU_Ticker(void);
|
void HU_Ticker(void);
|
||||||
void HU_TickSongCredits(void);
|
void HU_TickSongCredits(void);
|
||||||
@@ -120,8 +108,7 @@ void HU_Drawer(void);
|
|||||||
char HU_dequeueChatChar(void);
|
char HU_dequeueChatChar(void);
|
||||||
void HU_clearChatChars(void);
|
void HU_clearChatChars(void);
|
||||||
void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags); // Lat': Ping drawer for scoreboard.
|
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_drawLocalPlayerPing(INT32 x, INT32 y, INT32 flags);
|
||||||
//void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer);
|
|
||||||
void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 hilicol);
|
void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 hilicol);
|
||||||
void HU_DrawEmeralds(INT32 x, INT32 y, INT32 pemeralds);
|
void HU_DrawEmeralds(INT32 x, INT32 y, INT32 pemeralds);
|
||||||
const char *HU_SkinColorToConsoleColor(skincolors_t color);
|
const char *HU_SkinColorToConsoleColor(skincolors_t color);
|
||||||
|
|||||||
+1
-22
@@ -36,28 +36,7 @@ extern "C" {
|
|||||||
"JOYBUTTONS is greater than INT64 bits can hold"
|
"JOYBUTTONS is greater than INT64 bits can hold"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** \brief The struct JoyType_s
|
#define DigitalGamepadStyle(i) (cv_joyscale[i].value == 0)
|
||||||
|
|
||||||
share some joystick information (maybe 2 for splitscreen), to the game input code,
|
|
||||||
actually, we need to know if it is a gamepad or analog controls
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct JoyType_s
|
|
||||||
{
|
|
||||||
/*! if true, we MUST Poll() to get new joystick data,
|
|
||||||
that is: we NEED the DIRECTINPUTDEVICE2 ! (watchout NT compatibility) */
|
|
||||||
INT32 bJoyNeedPoll;
|
|
||||||
/*! this joystick is a gamepad, read: digital axes
|
|
||||||
if FALSE, interpret the joystick event data as JOYAXISRANGE (see above) */
|
|
||||||
INT32 bGamepadStyle;
|
|
||||||
|
|
||||||
};
|
|
||||||
typedef struct JoyType_s JoyType_t;
|
|
||||||
/** \brief Joystick info
|
|
||||||
for palyer[sic] 1-4's joystick/gamepad
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern JoyType_t Joystick[MAXSPLITSCREENPLAYERS];
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
@@ -14,6 +14,9 @@
|
|||||||
#ifndef __I_SYSTEM__
|
#ifndef __I_SYSTEM__
|
||||||
#define __I_SYSTEM__
|
#define __I_SYSTEM__
|
||||||
|
|
||||||
|
// page for Saturn issue reports
|
||||||
|
#define SATURNISSUEPAGE "https://github.com/Indev450/SRB2Kart-Saturn/issues"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@@ -148,6 +151,11 @@ extern INT32 numcontrollers;
|
|||||||
*/
|
*/
|
||||||
const char *I_GetJoyName(INT32 joyindex);
|
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_GamepadRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration);
|
||||||
void I_SetGamepadIndicatorColor(INT32 playernum, UINT8 red, UINT8 green, UINT8 blue);
|
void I_SetGamepadIndicatorColor(INT32 playernum, UINT8 red, UINT8 green, UINT8 blue);
|
||||||
|
|
||||||
@@ -198,6 +206,15 @@ void I_ShutdownSystem(void);
|
|||||||
/** \brief To check if a Interrupt or Terminate Signal was fired
|
/** \brief To check if a Interrupt or Terminate Signal was fired
|
||||||
*/
|
*/
|
||||||
boolean I_Interrupted(void);
|
boolean I_Interrupted(void);
|
||||||
|
static inline void I_HandleInterrupt(void)
|
||||||
|
{
|
||||||
|
if (I_Interrupted())
|
||||||
|
I_Quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Open A URL
|
||||||
|
*/
|
||||||
|
int I_OpenURL(const char *url);
|
||||||
|
|
||||||
/** \brief The I_GetDiskFreeSpace function
|
/** \brief The I_GetDiskFreeSpace function
|
||||||
|
|
||||||
@@ -220,6 +237,21 @@ char *I_GetUserName(void);
|
|||||||
*/
|
*/
|
||||||
INT32 I_mkdir(const char *dirname, INT32 unixright);
|
INT32 I_mkdir(const char *dirname, INT32 unixright);
|
||||||
|
|
||||||
|
/** \brief Change current working directory
|
||||||
|
|
||||||
|
\param path directory path
|
||||||
|
\return 0 on success, -1 on error
|
||||||
|
*/
|
||||||
|
INT32 I_ChDir(const char *path);
|
||||||
|
|
||||||
|
/** \brief Get current working directory
|
||||||
|
|
||||||
|
\param buf buffer to store path
|
||||||
|
\param size size of buffer
|
||||||
|
\return buf on success, NULL on error
|
||||||
|
*/
|
||||||
|
char *I_GetCwd(char *buf, size_t size);
|
||||||
|
|
||||||
/** \brief Find main WAD
|
/** \brief Find main WAD
|
||||||
\return path to main WAD
|
\return path to main WAD
|
||||||
*/
|
*/
|
||||||
|
|||||||
+8
-5
@@ -213,7 +213,7 @@ static char *get_WSAErrorStr(int e)
|
|||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (!buf[0]) // provide a fallback error message if no message is available for some reason
|
if (!buf[0]) // provide a fallback error message if no message is available for some reason
|
||||||
sprintf(buf, "Unknown error");
|
snprintf(buf, sizeof(buf), "Unknown error");
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
@@ -364,12 +364,12 @@ static const char *SOCK_AddrToStr(mysockaddr_t *sk)
|
|||||||
|
|
||||||
if (addr == NULL)
|
if (addr == NULL)
|
||||||
{
|
{
|
||||||
sprintf(s, "No address");
|
snprintf(s, sizeof(s), "No address");
|
||||||
}
|
}
|
||||||
else if (inet_ntop(sk->any.sa_family, addr, &s[v6], sizeof (s) - v6) == NULL)
|
else if (inet_ntop(sk->any.sa_family, addr, &s[v6], sizeof (s) - v6) == NULL)
|
||||||
{
|
{
|
||||||
e = errno;
|
e = errno;
|
||||||
sprintf(s, "Unknown family type, error #%u: %s", e, strerror(e));
|
snprintf(s, sizeof(s), "Unknown family type, error #%u: %s", e, strerror(e));
|
||||||
}
|
}
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
else if(sk->any.sa_family == AF_INET6)
|
else if(sk->any.sa_family == AF_INET6)
|
||||||
@@ -392,6 +392,9 @@ static const char *SOCK_GetNodeAddress(INT32 node)
|
|||||||
if (node == 0)
|
if (node == 0)
|
||||||
return "self";
|
return "self";
|
||||||
|
|
||||||
|
if (node < 0 || node > MAXNETNODES)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (!nodeconnected[node])
|
if (!nodeconnected[node])
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -413,7 +416,7 @@ static const char *SOCK_GetBanMask(size_t ban)
|
|||||||
if (ban >= numbans)
|
if (ban >= numbans)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (sprintf(s,"%d",banned[ban].mask) > 0)
|
if (snprintf(s, sizeof(s), "%d",banned[ban].mask) > 0)
|
||||||
return s;
|
return s;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -619,7 +622,6 @@ static boolean hole_punch(ssize_t c)
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif //ifdef HOLEPUNCH
|
#endif //ifdef HOLEPUNCH
|
||||||
|
|
||||||
@@ -1691,6 +1693,7 @@ boolean I_InitTcpNetwork(void)
|
|||||||
hardware_MAXPACKETLENGTH = MAXPACKETLENGTH;
|
hardware_MAXPACKETLENGTH = MAXPACKETLENGTH;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (M_CheckProtoParam("ip"))
|
if (M_CheckProtoParam("ip"))
|
||||||
{
|
{
|
||||||
COM_ImmedExecute(va("exec \"%s"PATHSEP"kartexec.cfg\" -noerror\n", srb2home));
|
COM_ImmedExecute(va("exec \"%s"PATHSEP"kartexec.cfg\" -noerror\n", srb2home));
|
||||||
|
|||||||
+2
-4
@@ -126,11 +126,9 @@ boolean I_CheckNativeRes(void);
|
|||||||
void I_SetBorderlessWindow(void);
|
void I_SetBorderlessWindow(void);
|
||||||
|
|
||||||
#ifdef USE_FBO_OGL
|
#ifdef USE_FBO_OGL
|
||||||
|
void I_CheckDownSampleState(boolean forcerefresh);
|
||||||
void RefreshOGLSDLSurface(void);
|
boolean I_IsDownsampling(void);
|
||||||
void I_DownSample(void);
|
|
||||||
boolean UseScreenFBO(void);
|
boolean UseScreenFBO(void);
|
||||||
extern boolean downsample;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// So we can call this from i_video event loop
|
// So we can call this from i_video event loop
|
||||||
|
|||||||
@@ -452,7 +452,11 @@ void A_SpawnFreshCopy(void *actor);
|
|||||||
extern boolean actionsoverridden[NUMACTIONS];
|
extern boolean actionsoverridden[NUMACTIONS];
|
||||||
|
|
||||||
// ratio of states to sprites to mobj types is roughly 6 : 1 : 1
|
// ratio of states to sprites to mobj types is roughly 6 : 1 : 1
|
||||||
|
#ifdef PHOBOS_BUILD
|
||||||
|
#define NUMMOBJFREESLOTS 4096 // should be sufficient
|
||||||
|
#else
|
||||||
#define NUMMOBJFREESLOTS 1024
|
#define NUMMOBJFREESLOTS 1024
|
||||||
|
#endif
|
||||||
#define NUMSPRITEFREESLOTS NUMMOBJFREESLOTS
|
#define NUMSPRITEFREESLOTS NUMMOBJFREESLOTS
|
||||||
#define NUMSTATEFREESLOTS (NUMMOBJFREESLOTS*8)
|
#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];
|
target = directorinfo.sortedplayers[targetposition];
|
||||||
|
|
||||||
// stop here since we're already viewing this player
|
// stop here since we're already viewing this player
|
||||||
|
|||||||
+182
-181
@@ -83,6 +83,7 @@ IMPL_HUD_OFFSET(stat); // Stats
|
|||||||
|
|
||||||
// extra hud things
|
// extra hud things
|
||||||
consvar_t cv_showstats = {"showstats", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
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
|
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}};
|
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_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_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];
|
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_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}};
|
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_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};
|
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_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};
|
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_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
|
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_kartspeedometer);
|
||||||
|
|
||||||
CV_RegisterVar(&cv_showstats);
|
CV_RegisterVar(&cv_showstats);
|
||||||
|
CV_RegisterVar(&cv_showstats_skinname);
|
||||||
CV_RegisterVar(&cv_showinput);
|
CV_RegisterVar(&cv_showinput);
|
||||||
|
|
||||||
CV_RegisterVar(&cv_posanim);
|
CV_RegisterVar(&cv_posanim);
|
||||||
@@ -221,7 +231,9 @@ void K_RegisterKartHudStuff(void)
|
|||||||
|
|
||||||
CV_RegisterVar(&cv_minihead);
|
CV_RegisterVar(&cv_minihead);
|
||||||
CV_RegisterVar(&cv_showminimapnames);
|
CV_RegisterVar(&cv_showminimapnames);
|
||||||
|
CV_RegisterVar(&cv_showminimapfinished);
|
||||||
CV_RegisterVar(&cv_showminimapangle);
|
CV_RegisterVar(&cv_showminimapangle);
|
||||||
|
CV_RegisterVar(&cv_spinoutroll);
|
||||||
|
|
||||||
CV_RegisterVar(&cv_showlapemblem);
|
CV_RegisterVar(&cv_showlapemblem);
|
||||||
|
|
||||||
@@ -239,6 +251,8 @@ void K_RegisterKartHudStuff(void)
|
|||||||
CV_RegisterVar(&cv_multiitemicon);
|
CV_RegisterVar(&cv_multiitemicon);
|
||||||
CV_RegisterVar(&cv_huditemamount);
|
CV_RegisterVar(&cv_huditemamount);
|
||||||
|
|
||||||
|
CV_RegisterVar(&cv_roulettecolor);
|
||||||
|
|
||||||
CV_RegisterVar(&cv_highresportrait);
|
CV_RegisterVar(&cv_highresportrait);
|
||||||
|
|
||||||
CV_RegisterVar(&cv_nametag);
|
CV_RegisterVar(&cv_nametag);
|
||||||
@@ -270,7 +284,6 @@ void K_RegisterKartHudStuff(void)
|
|||||||
|
|
||||||
// Smol speedo
|
// Smol speedo
|
||||||
static patch_t *skp_smallsticker = NULL;
|
static patch_t *skp_smallsticker = NULL;
|
||||||
static patch_t *skp_smallsticker3 = NULL;
|
|
||||||
|
|
||||||
static patch_t *skp_speedpatches[5] = {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_karmastickerclr = NULL;
|
||||||
static patch_t *kp_timeoutstickerclr = NULL;
|
static patch_t *kp_timeoutstickerclr = NULL;
|
||||||
static patch_t *skp_smallstickerclr = NULL;
|
static patch_t *skp_smallstickerclr = NULL;
|
||||||
static patch_t *skp_smallstickerclr3 = NULL;
|
|
||||||
static patch_t *kp_itemmulstickerclr[2] = {NULL};
|
static patch_t *kp_itemmulstickerclr[2] = {NULL};
|
||||||
static patch_t *kp_itembgclr[4] = {NULL};
|
static patch_t *kp_itembgclr[4] = {NULL};
|
||||||
|
|
||||||
@@ -376,7 +388,7 @@ static void K_LoadSaturnHUDGraphics(void)
|
|||||||
skp_speedpatchesdial[3] = (patch_t *)W_CachePatchName("SP_DFRAC", PU_HUDGFX);
|
skp_speedpatchesdial[3] = (patch_t *)W_CachePatchName("SP_DFRAC", PU_HUDGFX);
|
||||||
skp_speedpatchesdial[4] = (patch_t *)W_CachePatchName("SP_DPERC", PU_HUDGFX);
|
skp_speedpatchesdial[4] = (patch_t *)W_CachePatchName("SP_DPERC", PU_HUDGFX);
|
||||||
|
|
||||||
sprintf(buffer, "K_DSPNMx");
|
snprintf(buffer, sizeof(buffer), "K_DSPNMx");
|
||||||
for (i = 0; i < 10; i++)
|
for (i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
buffer[7] = '0'+(i%10);
|
buffer[7] = '0'+(i%10);
|
||||||
@@ -474,11 +486,6 @@ static void K_LoadSaturnHUDGraphics(void)
|
|||||||
skp_smallstickerclr = (patch_t *)W_CachePatchName("SC_SMSTC", PU_HUDGFX);
|
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)
|
if (achi_speedo_clr)
|
||||||
{
|
{
|
||||||
skp_smallstickerachiclr = (patch_t *)W_CachePatchName("SC_AMSTC", PU_HUDGFX);
|
skp_smallstickerachiclr = (patch_t *)W_CachePatchName("SC_AMSTC", PU_HUDGFX);
|
||||||
@@ -500,7 +507,7 @@ static void K_LoadSaturnHUDGraphics(void)
|
|||||||
skp_speedpatchesdialclr[3] = (patch_t *)W_CachePatchName("SC_DFRAC", PU_HUDGFX);
|
skp_speedpatchesdialclr[3] = (patch_t *)W_CachePatchName("SC_DFRAC", PU_HUDGFX);
|
||||||
skp_speedpatchesdialclr[4] = (patch_t *)W_CachePatchName("SC_DPERC", PU_HUDGFX);
|
skp_speedpatchesdialclr[4] = (patch_t *)W_CachePatchName("SC_DPERC", PU_HUDGFX);
|
||||||
|
|
||||||
sprintf(buffer, "K_DSPNCx");
|
snprintf(buffer, sizeof(buffer), "K_DSPNCx");
|
||||||
for (i = 0; i < 10; i++)
|
for (i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
buffer[7] = '0'+(i%10);
|
buffer[7] = '0'+(i%10);
|
||||||
@@ -533,14 +540,6 @@ static void K_LoadSaturnHUDGraphics(void)
|
|||||||
kp_itemmulstickerclr[0] = (patch_t *)W_CachePatchName("K_ITMULC", PU_HUDGFX);
|
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 --
|
// -- Kart patches --
|
||||||
@@ -678,7 +677,7 @@ void K_LoadKartHUDGraphics(void)
|
|||||||
kp_racefinish[5] = (patch_t *)W_CachePatchName("K_2PFINB", PU_HUDGFX);
|
kp_racefinish[5] = (patch_t *)W_CachePatchName("K_2PFINB", PU_HUDGFX);
|
||||||
|
|
||||||
// Position numbers
|
// Position numbers
|
||||||
sprintf(buffer, "K_POSNxx");
|
snprintf(buffer, sizeof(buffer), "K_POSNxx");
|
||||||
for (i = 0; i < NUMPOSNUMS; i++)
|
for (i = 0; i < NUMPOSNUMS; i++)
|
||||||
{
|
{
|
||||||
buffer[6] = '0'+i;
|
buffer[6] = '0'+i;
|
||||||
@@ -689,14 +688,17 @@ void K_LoadKartHUDGraphics(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buffer, "K_POSNWx");
|
snprintf(buffer, sizeof(buffer), "K_POSNWx");
|
||||||
for (i = 0; i < NUMWINFRAMES; i++)
|
for (i = 0; i < NUMWINFRAMES; i++)
|
||||||
{
|
{
|
||||||
buffer[7] = '0'+i;
|
buffer[7] = '0'+i;
|
||||||
kp_winnernum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
kp_winnernum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buffer, "OPPRNKxx");
|
// 32 player note: there are only 16 of those!
|
||||||
|
// so slots after this will just be missing patches!
|
||||||
|
// but keeping like this incase of missed adjustments which might cause crashes otherwise
|
||||||
|
snprintf(buffer, sizeof(buffer), "OPPRNKxx");
|
||||||
for (i = 0; i <= MAXPLAYERS; i++)
|
for (i = 0; i <= MAXPLAYERS; i++)
|
||||||
{
|
{
|
||||||
buffer[6] = '0'+(i/10);
|
buffer[6] = '0'+(i/10);
|
||||||
@@ -704,7 +706,7 @@ void K_LoadKartHUDGraphics(void)
|
|||||||
kp_facenum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
kp_facenum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buffer, "K_CHILIx");
|
snprintf(buffer, sizeof(buffer), "K_CHILIx");
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
buffer[7] = '0'+(i+1);
|
buffer[7] = '0'+(i+1);
|
||||||
@@ -773,21 +775,21 @@ void K_LoadKartHUDGraphics(void)
|
|||||||
kp_kitchensink[1] = (patch_t *)W_CachePatchName("K_ISSINK", PU_HUDGFX);
|
kp_kitchensink[1] = (patch_t *)W_CachePatchName("K_ISSINK", PU_HUDGFX);
|
||||||
kp_sadface[1] = (patch_t *)W_CachePatchName("K_ISSAD", PU_HUDGFX);
|
kp_sadface[1] = (patch_t *)W_CachePatchName("K_ISSAD", PU_HUDGFX);
|
||||||
|
|
||||||
sprintf(buffer, "K_ITINVx");
|
snprintf(buffer, sizeof(buffer), "K_ITINVx");
|
||||||
for (i = 0; i < 7; i++)
|
for (i = 0; i < 7; i++)
|
||||||
{
|
{
|
||||||
buffer[7] = '1'+i;
|
buffer[7] = '1'+i;
|
||||||
kp_invincibility[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
kp_invincibility[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buffer, "K_ITORBx");
|
snprintf(buffer, sizeof(buffer), "K_ITORBx");
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
buffer[7] = '1'+i;
|
buffer[7] = '1'+i;
|
||||||
kp_orbinaut[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
kp_orbinaut[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buffer, "K_ISINVx");
|
snprintf(buffer, sizeof(buffer), "K_ISINVx");
|
||||||
for (i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
buffer[7] = '1'+i;
|
buffer[7] = '1'+i;
|
||||||
@@ -795,7 +797,7 @@ void K_LoadKartHUDGraphics(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CHECK indicators
|
// CHECK indicators
|
||||||
sprintf(buffer, "K_CHECKx");
|
snprintf(buffer, sizeof(buffer), "K_CHECKx");
|
||||||
for (i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
buffer[7] = '1'+i;
|
buffer[7] = '1'+i;
|
||||||
@@ -803,7 +805,7 @@ void K_LoadKartHUDGraphics(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Eggman warning numbers
|
// Eggman warning numbers
|
||||||
sprintf(buffer, "K_EGGNx");
|
snprintf(buffer, sizeof(buffer), "K_EGGNx");
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
buffer[6] = '0'+i;
|
buffer[6] = '0'+i;
|
||||||
@@ -816,7 +818,7 @@ void K_LoadKartHUDGraphics(void)
|
|||||||
kp_fpview[2] = (patch_t *)W_CachePatchName("VIEWC0E0", PU_HUDGFX);
|
kp_fpview[2] = (patch_t *)W_CachePatchName("VIEWC0E0", PU_HUDGFX);
|
||||||
|
|
||||||
// Input UI Wheel
|
// Input UI Wheel
|
||||||
sprintf(buffer, "K_WHEELx");
|
snprintf(buffer, sizeof(buffer), "K_WHEELx");
|
||||||
for (i = 0; i < 5; i++)
|
for (i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
buffer[7] = '0'+i;
|
buffer[7] = '0'+i;
|
||||||
@@ -824,7 +826,7 @@ void K_LoadKartHUDGraphics(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// HERE COMES A NEW CHALLENGER
|
// HERE COMES A NEW CHALLENGER
|
||||||
sprintf(buffer, "K_CHALxx");
|
snprintf(buffer, sizeof(buffer), "K_CHALxx");
|
||||||
for (i = 0; i < 25; i++)
|
for (i = 0; i < 25; i++)
|
||||||
{
|
{
|
||||||
buffer[6] = '0'+((i+1)/10);
|
buffer[6] = '0'+((i+1)/10);
|
||||||
@@ -833,14 +835,14 @@ void K_LoadKartHUDGraphics(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Lap start animation
|
// Lap start animation
|
||||||
sprintf(buffer, "K_LAP0x");
|
snprintf(buffer, sizeof(buffer), "K_LAP0x");
|
||||||
for (i = 0; i < 7; i++)
|
for (i = 0; i < 7; i++)
|
||||||
{
|
{
|
||||||
buffer[6] = '0'+(i+1);
|
buffer[6] = '0'+(i+1);
|
||||||
kp_lapanim_lap[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
kp_lapanim_lap[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buffer, "K_LAPFxx");
|
snprintf(buffer, sizeof(buffer), "K_LAPFxx");
|
||||||
for (i = 0; i < 11; i++)
|
for (i = 0; i < 11; i++)
|
||||||
{
|
{
|
||||||
buffer[6] = '0'+((i+1)/10);
|
buffer[6] = '0'+((i+1)/10);
|
||||||
@@ -848,7 +850,7 @@ void K_LoadKartHUDGraphics(void)
|
|||||||
kp_lapanim_final[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
kp_lapanim_final[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buffer, "K_LAPNxx");
|
snprintf(buffer, sizeof(buffer), "K_LAPNxx");
|
||||||
for (i = 0; i < 10; i++)
|
for (i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
buffer[6] = '0'+i;
|
buffer[6] = '0'+i;
|
||||||
@@ -859,14 +861,14 @@ void K_LoadKartHUDGraphics(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buffer, "K_LAPE0x");
|
snprintf(buffer, sizeof(buffer), "K_LAPE0x");
|
||||||
for (i = 0; i < 2; i++)
|
for (i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
buffer[7] = '0'+(i+1);
|
buffer[7] = '0'+(i+1);
|
||||||
kp_lapanim_emblem[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
kp_lapanim_emblem[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buffer, "K_LAPH0x");
|
snprintf(buffer, sizeof(buffer), "K_LAPH0x");
|
||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
buffer[7] = '0'+(i+1);
|
buffer[7] = '0'+(i+1);
|
||||||
@@ -875,7 +877,7 @@ void K_LoadKartHUDGraphics(void)
|
|||||||
|
|
||||||
kp_yougotem = (patch_t *)W_CachePatchName("YOUGOTEM", PU_HUDGFX);
|
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();
|
K_LoadSaturnHUDGraphics();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1145,10 +1147,9 @@ enum
|
|||||||
SPEEDO_DIAL,
|
SPEEDO_DIAL,
|
||||||
SPEEDO_PMETER,
|
SPEEDO_PMETER,
|
||||||
SPEEDO_PMETERSMOL,
|
SPEEDO_PMETERSMOL,
|
||||||
SPEEDO_EXTRA3,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static SINT8 K_GetSpeedometerStyle(void)
|
static UINT8 K_GetSpeedometerStyle(void)
|
||||||
{
|
{
|
||||||
if (cv_newspeedometer.value == 2 && xtra_speedo)
|
if (cv_newspeedometer.value == 2 && xtra_speedo)
|
||||||
return SPEEDO_EXTRA;
|
return SPEEDO_EXTRA;
|
||||||
@@ -1160,8 +1161,6 @@ static SINT8 K_GetSpeedometerStyle(void)
|
|||||||
return SPEEDO_PMETER;
|
return SPEEDO_PMETER;
|
||||||
else if (cv_newspeedometer.value == 6 && kartz_speedo_smol)
|
else if (cv_newspeedometer.value == 6 && kartz_speedo_smol)
|
||||||
return SPEEDO_PMETERSMOL;
|
return SPEEDO_PMETERSMOL;
|
||||||
else if (cv_newspeedometer.value == 7 && xtra_speedo3)
|
|
||||||
return SPEEDO_EXTRA3;
|
|
||||||
else
|
else
|
||||||
return SPEEDO_VANILLA;
|
return SPEEDO_VANILLA;
|
||||||
}
|
}
|
||||||
@@ -1179,8 +1178,6 @@ static boolean K_UseColorSpeedo(int speedostyle)
|
|||||||
return achi_speedo_clr;
|
return achi_speedo_clr;
|
||||||
case SPEEDO_DIAL:
|
case SPEEDO_DIAL:
|
||||||
return dial_speedo_clr;
|
return dial_speedo_clr;
|
||||||
case SPEEDO_EXTRA3:
|
|
||||||
return xtra_speedo_clr3;
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1192,7 +1189,6 @@ enum
|
|||||||
GAUGE_SMALL,
|
GAUGE_SMALL,
|
||||||
GAUGE_BIGNUM,
|
GAUGE_BIGNUM,
|
||||||
GAUGE_NUMONLY,
|
GAUGE_NUMONLY,
|
||||||
GAUGE_EXTRA,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static SINT8 K_GetDriftgaugeStyle(void)
|
static SINT8 K_GetDriftgaugeStyle(void)
|
||||||
@@ -1205,8 +1201,6 @@ static SINT8 K_GetDriftgaugeStyle(void)
|
|||||||
return GAUGE_SMALL;
|
return GAUGE_SMALL;
|
||||||
else if (cv_driftgaugestyle.value == 3)
|
else if (cv_driftgaugestyle.value == 3)
|
||||||
return GAUGE_BIGNUM;
|
return GAUGE_BIGNUM;
|
||||||
else if (cv_driftgaugestyle.value == 5 && xtra_speedo3)
|
|
||||||
return GAUGE_EXTRA;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fallback
|
// Fallback
|
||||||
@@ -1358,10 +1352,12 @@ INT32 K_getMinimapTrans(void)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (timeinmap <= 113)
|
if (timeinmap <= 113)
|
||||||
|
{
|
||||||
minimaptrans = ((((INT32)timeinmap) - 105)*minimaptrans)/(113-105);
|
minimaptrans = ((((INT32)timeinmap) - 105)*minimaptrans)/(113-105);
|
||||||
|
|
||||||
if (!minimaptrans)
|
if (!minimaptrans)
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return (10-minimaptrans)<<FF_TRANSSHIFT;
|
return (10-minimaptrans)<<FF_TRANSSHIFT;
|
||||||
}
|
}
|
||||||
@@ -1403,7 +1399,6 @@ static void K_drawKartStats(void)
|
|||||||
{
|
{
|
||||||
case SPEEDO_EXTRA:
|
case SPEEDO_EXTRA:
|
||||||
case SPEEDO_ACHII:
|
case SPEEDO_ACHII:
|
||||||
case SPEEDO_EXTRA3:
|
|
||||||
spdoffset = -10;
|
spdoffset = -10;
|
||||||
break;
|
break;
|
||||||
case SPEEDO_DIAL:
|
case SPEEDO_DIAL:
|
||||||
@@ -1434,6 +1429,8 @@ static void K_drawKartStats(void)
|
|||||||
fakeskin = K_GetPlayerSkin(stplyr);
|
fakeskin = K_GetPlayerSkin(stplyr);
|
||||||
|
|
||||||
// Skin name
|
// Skin name
|
||||||
|
if (cv_showstats_skinname.value)
|
||||||
|
{
|
||||||
if (K_IsHighResolution()) // V_DrawSmallString becomes a mess at low resolutions lel
|
if (K_IsHighResolution()) // V_DrawSmallString becomes a mess at low resolutions lel
|
||||||
{
|
{
|
||||||
V_DrawSmallString(x+20, y+12, flags2, fakeskin->realname);
|
V_DrawSmallString(x+20, y+12, flags2, fakeskin->realname);
|
||||||
@@ -1442,6 +1439,7 @@ static void K_drawKartStats(void)
|
|||||||
{
|
{
|
||||||
V_DrawThinString(x+20, y+7, flags2, fakeskin->realname);
|
V_DrawThinString(x+20, y+7, flags2, fakeskin->realname);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Icon and stats
|
// Icon and stats
|
||||||
if (K_UseHighResPortraits())
|
if (K_UseHighResPortraits())
|
||||||
@@ -1522,6 +1520,9 @@ static void K_drawKartItem(void)
|
|||||||
|
|
||||||
if (stplyr->kartstuff[k_itemroulette])
|
if (stplyr->kartstuff[k_itemroulette])
|
||||||
{
|
{
|
||||||
|
if (cv_roulettecolor.value == ROULETTECOLOR_PLAYER)
|
||||||
|
localcolor = stplyr->skincolor;
|
||||||
|
else if (cv_roulettecolor.value != ROULETTECOLOR_NONE)
|
||||||
localcolor = K_GetHudColor();
|
localcolor = K_GetHudColor();
|
||||||
|
|
||||||
switch ((stplyr->kartstuff[k_itemroulette] % (14*3)) / 3)
|
switch ((stplyr->kartstuff[k_itemroulette] % (14*3)) / 3)
|
||||||
@@ -1529,67 +1530,67 @@ static void K_drawKartItem(void)
|
|||||||
// Each case is handled in threes, to give three frames of in-game time to see the item on the roulette
|
// Each case is handled in threes, to give three frames of in-game time to see the item on the roulette
|
||||||
case 0: // Sneaker
|
case 0: // Sneaker
|
||||||
localpatch = kp_sneaker[offset];
|
localpatch = kp_sneaker[offset];
|
||||||
//localcolor = SKINCOLOR_RASPBERRY;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_RASPBERRY;
|
||||||
break;
|
break;
|
||||||
case 1: // Banana
|
case 1: // Banana
|
||||||
localpatch = kp_banana[offset];
|
localpatch = kp_banana[offset];
|
||||||
//localcolor = SKINCOLOR_YELLOW;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_YELLOW;
|
||||||
break;
|
break;
|
||||||
case 2: // Orbinaut
|
case 2: // Orbinaut
|
||||||
localpatch = kp_orbinaut[3+offset];
|
localpatch = kp_orbinaut[3+offset];
|
||||||
//localcolor = SKINCOLOR_STEEL;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_STEEL;
|
||||||
break;
|
break;
|
||||||
case 3: // Mine
|
case 3: // Mine
|
||||||
localpatch = kp_mine[offset];
|
localpatch = kp_mine[offset];
|
||||||
//localcolor = SKINCOLOR_JET;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_JET;
|
||||||
break;
|
break;
|
||||||
case 4: // Grow
|
case 4: // Grow
|
||||||
localpatch = kp_grow[offset];
|
localpatch = kp_grow[offset];
|
||||||
//localcolor = SKINCOLOR_TEAL;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_TEAL;
|
||||||
break;
|
break;
|
||||||
case 5: // Hyudoro
|
case 5: // Hyudoro
|
||||||
localpatch = kp_hyudoro[offset];
|
localpatch = kp_hyudoro[offset];
|
||||||
//localcolor = SKINCOLOR_STEEL;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_STEEL;
|
||||||
break;
|
break;
|
||||||
case 6: // Rocket Sneaker
|
case 6: // Rocket Sneaker
|
||||||
localpatch = kp_rocketsneaker[offset];
|
localpatch = kp_rocketsneaker[offset];
|
||||||
//localcolor = SKINCOLOR_TANGERINE;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_TANGERINE;
|
||||||
break;
|
break;
|
||||||
case 7: // Jawz
|
case 7: // Jawz
|
||||||
localpatch = kp_jawz[offset];
|
localpatch = kp_jawz[offset];
|
||||||
//localcolor = SKINCOLOR_JAWZ;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_JAWZ;
|
||||||
break;
|
break;
|
||||||
case 8: // Self-Propelled Bomb
|
case 8: // Self-Propelled Bomb
|
||||||
localpatch = kp_selfpropelledbomb[offset];
|
localpatch = kp_selfpropelledbomb[offset];
|
||||||
//localcolor = SKINCOLOR_JET;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_JET;
|
||||||
break;
|
break;
|
||||||
case 9: // Shrink
|
case 9: // Shrink
|
||||||
localpatch = kp_shrink[offset];
|
localpatch = kp_shrink[offset];
|
||||||
//localcolor = SKINCOLOR_ORANGE;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_ORANGE;
|
||||||
break;
|
break;
|
||||||
case 10: // Invincibility
|
case 10: // Invincibility
|
||||||
localpatch = localinv;
|
localpatch = localinv;
|
||||||
//localcolor = SKINCOLOR_GREY;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_GREY;
|
||||||
break;
|
break;
|
||||||
case 11: // Eggman Monitor
|
case 11: // Eggman Monitor
|
||||||
localpatch = kp_eggman[offset];
|
localpatch = kp_eggman[offset];
|
||||||
//localcolor = SKINCOLOR_ROSE;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_ROSE;
|
||||||
break;
|
break;
|
||||||
case 12: // Ballhog
|
case 12: // Ballhog
|
||||||
localpatch = kp_ballhog[offset];
|
localpatch = kp_ballhog[offset];
|
||||||
//localcolor = SKINCOLOR_LILAC;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_LILAC;
|
||||||
break;
|
break;
|
||||||
case 13: // Thunder Shield
|
case 13: // Thunder Shield
|
||||||
localpatch = kp_thundershield[offset];
|
localpatch = kp_thundershield[offset];
|
||||||
//localcolor = SKINCOLOR_CYAN;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_CYAN;
|
||||||
break;
|
break;
|
||||||
/*case 14: // Pogo Spring
|
/*case 14: // Pogo Spring
|
||||||
localpatch = kp_pogospring[offset];
|
localpatch = kp_pogospring[offset];
|
||||||
localcolor = SKINCOLOR_TANGERINE;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_TANGERINE;
|
||||||
break;
|
break;
|
||||||
case 15: // Kitchen Sink
|
case 15: // Kitchen Sink
|
||||||
localpatch = kp_kitchensink[offset];
|
localpatch = kp_kitchensink[offset];
|
||||||
localcolor = SKINCOLOR_STEEL;
|
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_STEEL;
|
||||||
break;*/
|
break;*/
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -1976,7 +1977,7 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UI
|
|||||||
goto bademblem;
|
goto bademblem;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(targettext, 9, "%i'%02i\"%02i",
|
snprintf(targettext, sizeof(targettext), "%i'%02i\"%02i",
|
||||||
G_TicsToMinutes(timetoreach, false),
|
G_TicsToMinutes(timetoreach, false),
|
||||||
G_TicsToSeconds(timetoreach),
|
G_TicsToSeconds(timetoreach),
|
||||||
G_TicsToCentiseconds(timetoreach));
|
G_TicsToCentiseconds(timetoreach));
|
||||||
@@ -2094,7 +2095,7 @@ static void K_DrawKartPositionNum(INT32 num)
|
|||||||
fy = POSI_Y;
|
fy = POSI_Y;
|
||||||
fflags = V_SNAPTOLEFT|((stplyrnum == 2) ? V_SPLITSCREEN|V_SNAPTOBOTTOM : 0); // flip P3 to the bottom.
|
fflags = V_SNAPTOLEFT|((stplyrnum == 2) ? V_SPLITSCREEN|V_SNAPTOBOTTOM : 0); // flip P3 to the bottom.
|
||||||
flipdraw = true;
|
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.
|
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.
|
else // else, that means we're P2 or P4.
|
||||||
@@ -2176,8 +2177,9 @@ static boolean K_drawKartPositionFaces(void)
|
|||||||
UINT8 *colormap;
|
UINT8 *colormap;
|
||||||
|
|
||||||
ranklines = 0;
|
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++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
{
|
{
|
||||||
@@ -2192,8 +2194,7 @@ static boolean K_drawKartPositionFaces(void)
|
|||||||
if (numplayersingame <= 1)
|
if (numplayersingame <= 1)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (!LUA_HudEnabled(hud_minirankings))
|
memset(completed, 0, sizeof (completed));
|
||||||
return false; // Don't proceed but still return true for free play above if HUD is disabled.
|
|
||||||
|
|
||||||
for (j = 0; j < numplayersingame; j++)
|
for (j = 0; j < numplayersingame; j++)
|
||||||
{
|
{
|
||||||
@@ -2250,6 +2251,7 @@ static boolean K_drawKartPositionFaces(void)
|
|||||||
|
|
||||||
if (!playeringame[rankplayer[i]])
|
if (!playeringame[rankplayer[i]])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (player->spectator || !player->mo)
|
if (player->spectator || !player->mo)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -2295,6 +2297,11 @@ static boolean K_drawKartPositionFaces(void)
|
|||||||
if (pos < 0 || pos > MAXPLAYERS)
|
if (pos < 0 || pos > MAXPLAYERS)
|
||||||
pos = 0;
|
pos = 0;
|
||||||
|
|
||||||
|
#if MAXPLAYERS > 16
|
||||||
|
if (pos > 16)
|
||||||
|
V_DrawPingNum(FACE_X+2, Y+10, V_HUDTRANS|V_SNAPTOLEFT, pos, NULL);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
// Draws the little number over the face
|
// Draws the little number over the face
|
||||||
V_DrawScaledPatch(FACE_X-5, Y+10, V_HUDTRANS|V_SNAPTOLEFT, kp_facenum[pos]);
|
V_DrawScaledPatch(FACE_X-5, Y+10, V_HUDTRANS|V_SNAPTOLEFT, kp_facenum[pos]);
|
||||||
}
|
}
|
||||||
@@ -2386,6 +2393,12 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
|||||||
INT32 pos = player->kartstuff[k_position];
|
INT32 pos = player->kartstuff[k_position];
|
||||||
if (pos < 0 || pos > MAXPLAYERS)
|
if (pos < 0 || pos > MAXPLAYERS)
|
||||||
pos = 0;
|
pos = 0;
|
||||||
|
|
||||||
|
#if MAXPLAYERS > 16
|
||||||
|
if (pos > 16)
|
||||||
|
V_DrawPingNum(x+2, y+10, 0, pos, NULL);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
// Draws the little number over the face
|
// Draws the little number over the face
|
||||||
V_DrawScaledPatch(x-5, y+6, 0, kp_facenum[pos]);
|
V_DrawScaledPatch(x-5, y+6, 0, kp_facenum[pos]);
|
||||||
}
|
}
|
||||||
@@ -2427,7 +2440,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
|||||||
|
|
||||||
static boolean K_BigLap(void)
|
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)
|
static void K_drawKartLaps(void)
|
||||||
@@ -2636,7 +2649,7 @@ static void K_drawKartSpeedometer(void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// index 0 is the raw value, index 1 is the converted value
|
// 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
|
#ifdef ROTSPRITE
|
||||||
fixed_t dial_divisor = DIALSPDDIV;
|
fixed_t dial_divisor = DIALSPDDIV;
|
||||||
#endif
|
#endif
|
||||||
@@ -2705,34 +2718,28 @@ static void K_drawKartSpeedometer(void)
|
|||||||
|
|
||||||
V_DrawKartString(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, metric);
|
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);
|
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||||
V_DrawMappedPatch(SPDM_X + 1, SPDM_Y + 4, V_HUDTRANS|splitflags, skp_smallstickerclr, colormap);
|
|
||||||
|
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
|
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_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]);
|
V_DrawMappedPatch(SPDM_X + 31, SPDM_Y + 4, V_HUDTRANS|splitflags, speedopat, colormap);
|
||||||
}
|
|
||||||
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]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#ifdef ROTSPRITE
|
#ifdef ROTSPRITE
|
||||||
else if (speedostyle == SPEEDO_DIAL) // why bother if we dont?
|
else if (speedostyle == SPEEDO_DIAL) // why bother if we dont?
|
||||||
@@ -2745,45 +2752,35 @@ static void K_drawKartSpeedometer(void)
|
|||||||
(K_UseColorSpeedo(SPEEDO_DIAL)));
|
(K_UseColorSpeedo(SPEEDO_DIAL)));
|
||||||
}
|
}
|
||||||
#endif
|
#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...
|
// Kart Z speedo bullshit...
|
||||||
// Draw the Speed counter.
|
// Draw the Speed counter.
|
||||||
else if ((speedostyle == SPEEDO_PMETER) || (speedostyle == SPEEDO_PMETERSMOL))
|
else if ((speedostyle == SPEEDO_PMETER) || (speedostyle == SPEEDO_PMETERSMOL))
|
||||||
{
|
{
|
||||||
fixed_t fuspeed = 0;
|
|
||||||
INT32 spdpatch = 0;
|
INT32 spdpatch = 0;
|
||||||
static const INT32 speedIntervals[22] = {2, 5, 7, 10, 12, 15, 17,
|
static const INT32 spdinterval[22] = { 2, 5, 7, 10,
|
||||||
20, 22, 25, 27, 30, 32,
|
12, 15, 17, 20,
|
||||||
35, 37, 40, 42, 45, 47,
|
22, 25, 27, 30,
|
||||||
50, 52, 55};
|
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;
|
||||||
|
|
||||||
|
if (spd > 54)
|
||||||
|
{
|
||||||
|
spdpatch = (leveltime & 4) ? 24 : 23;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
for (INT32 i = 0; i < 22; ++i)
|
for (INT32 i = 0; i < 22; ++i)
|
||||||
{
|
{
|
||||||
if (fuspeed < speedIntervals[i])
|
if (spd < spdinterval[i])
|
||||||
{
|
{
|
||||||
spdpatch = i;
|
spdpatch = i;
|
||||||
break;
|
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]);
|
V_DrawScaledPatch(SPDM_X, SPDM_Y, V_HUDTRANS|splitflags, (speedostyle == SPEEDO_PMETER) ? kp_kartzspeedo[spdpatch] : kp_kartzspeedo_smol[spdpatch]);
|
||||||
}
|
}
|
||||||
@@ -2812,7 +2809,7 @@ static void K_drawKartBumpersOrKarma(void)
|
|||||||
{
|
{
|
||||||
const UINT8 speedostyle = K_GetSpeedometerStyle();
|
const UINT8 speedostyle = K_GetSpeedometerStyle();
|
||||||
|
|
||||||
if ((speedostyle == SPEEDO_EXTRA) || (speedostyle == SPEEDO_ACHII) || (speedostyle == SPEEDO_EXTRA3))
|
if ((speedostyle == SPEEDO_EXTRA) || (speedostyle == SPEEDO_ACHII))
|
||||||
fy += 5;
|
fy += 5;
|
||||||
else
|
else
|
||||||
fy += 7;
|
fy += 7;
|
||||||
@@ -2904,10 +2901,12 @@ static boolean K_GetScreenCoords(vector2_t *vec, player_t *player, mobj_t *targe
|
|||||||
x = (fixed_t)(viewangle - R_PointToAngle(targx, targy));
|
x = (fixed_t)(viewangle - R_PointToAngle(targx, targy));
|
||||||
|
|
||||||
distfact = FINECOSINE((x>>ANGLETOFINESHIFT) & FINEMASK);
|
distfact = FINECOSINE((x>>ANGLETOFINESHIFT) & FINEMASK);
|
||||||
if (!distfact) distfact = 1;
|
if (!distfact)
|
||||||
|
distfact = 1;
|
||||||
|
|
||||||
if (encoremode)
|
if (encoremode)
|
||||||
x = -x;
|
x = -x;
|
||||||
|
|
||||||
if (x < (fixed_t)ANGLE_270 || x > (fixed_t)ANGLE_90)
|
if (x < (fixed_t)ANGLE_270 || x > (fixed_t)ANGLE_90)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -2989,7 +2988,7 @@ static boolean K_GetScreenCoords(vector2_t *vec, player_t *player, mobj_t *targe
|
|||||||
if (stplyrnum > 0)
|
if (stplyrnum > 0)
|
||||||
y = y + yres;
|
y = y + yres;
|
||||||
}
|
}
|
||||||
if (splitscreen >= 2) // 3P or 4P
|
else if (splitscreen >= 2) // 3P or 4P
|
||||||
{
|
{
|
||||||
x = x>>1;
|
x = x>>1;
|
||||||
y = y>>1;
|
y = y>>1;
|
||||||
@@ -3049,9 +3048,11 @@ static void K_drawNameTags(void)
|
|||||||
if (players[i].kartstuff[k_hyudorotimer]) // player is invisible
|
if (players[i].kartstuff[k_hyudorotimer]) // player is invisible
|
||||||
continue;
|
continue;
|
||||||
if (maxdistance)
|
if (maxdistance)
|
||||||
|
{
|
||||||
distance = R_PointToDist(players[i].mo->x, players[i].mo->y);
|
distance = R_PointToDist(players[i].mo->x, players[i].mo->y);
|
||||||
if (distance > maxdistance)
|
if (distance > maxdistance)
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
if (!P_CheckSightFast(stplyr->mo, players[i].mo))
|
if (!P_CheckSightFast(stplyr->mo, players[i].mo))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -3260,13 +3261,12 @@ static void K_drawDriftGauge(void)
|
|||||||
if (!splitscreen && !camera->chase)
|
if (!splitscreen && !camera->chase)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (forceshowhud)
|
// i will skip the drift early return and you cant stop me!
|
||||||
goto skipcrap; // i will skip the drift early return and you cant stop me!
|
if (!forceshowhud)
|
||||||
|
{
|
||||||
if (!stplyr->kartstuff[k_drift])
|
if (!stplyr->kartstuff[k_drift])
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
skipcrap:
|
|
||||||
|
|
||||||
if (P_MobjWasRemoved(stplyr->mo))
|
if (P_MobjWasRemoved(stplyr->mo))
|
||||||
return;
|
return;
|
||||||
@@ -3291,12 +3291,11 @@ skipcrap:
|
|||||||
{
|
{
|
||||||
case GAUGE_DEFAULT:
|
case GAUGE_DEFAULT:
|
||||||
case GAUGE_SMALL:
|
case GAUGE_SMALL:
|
||||||
case GAUGE_EXTRA:
|
|
||||||
case GAUGE_BIGNUM:
|
case GAUGE_BIGNUM:
|
||||||
{
|
{
|
||||||
patch_t *driftpatch = NULL;
|
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;
|
barx = basex - vid.dup*23;
|
||||||
BAR_WIDTH = vid.dup*47;
|
BAR_WIDTH = vid.dup*47;
|
||||||
@@ -3309,20 +3308,6 @@ skipcrap:
|
|||||||
|
|
||||||
bary = basey - vid.dup*2;
|
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_UseColorSpeedo(SPEEDO_EXTRA3)) // We reuse the extra speedometer patch hence this check
|
|
||||||
{
|
|
||||||
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
|
||||||
driftpatch = skp_smallstickerclr3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
driftpatch = skp_smallsticker3;
|
|
||||||
|
|
||||||
V_DrawStretchyFixedPatch((basex - vid.dup*30)<<FRACBITS, ((basey<<FRACBITS) - FixedMul(vid.dup<<FRACBITS, 21*FRACUNIT/10)), XTRA3PSCALE, XTRA3VSCALE, V_NOSCALESTART|V_OFFSET|drifttrans, driftpatch, colormap, 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (K_UseColorHud()) // Colourized hud
|
if (K_UseColorHud()) // Colourized hud
|
||||||
{
|
{
|
||||||
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||||
@@ -3332,7 +3317,6 @@ skipcrap:
|
|||||||
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
|
if (driftcharge >= driftval*4) // rainbow sparks
|
||||||
{
|
{
|
||||||
@@ -3611,6 +3595,10 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
skin = K_GetMobjSkin(mo);
|
skin = K_GetMobjSkin(mo);
|
||||||
|
|
||||||
|
if (!skin)
|
||||||
|
return;
|
||||||
|
|
||||||
minimaphead = (skinlocal ? localfacemmapprefix : facemmapprefix)[K_GetMobjSkinNum(skin, skinlocal)];
|
minimaphead = (skinlocal ? localfacemmapprefix : facemmapprefix)[K_GetMobjSkinNum(skin, skinlocal)];
|
||||||
|
|
||||||
if (minimaphead == NULL)
|
if (minimaphead == NULL)
|
||||||
@@ -3630,7 +3618,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]);
|
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
|
// thx wanted reticle for having weird offsets very cool
|
||||||
wntdamxpos = minihead ? amxpos + (1<<FRACBITS) : amxpos - (4<<FRACBITS);
|
wntdamxpos = minihead ? amxpos + (1<<FRACBITS) : amxpos - (4<<FRACBITS);
|
||||||
@@ -3772,6 +3760,9 @@ static void K_drawKartMinimap(void)
|
|||||||
if (!players[i].mo || players[i].spectator)
|
if (!players[i].mo || players[i].spectator)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!cv_showminimapfinished.value && players[i].exiting)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (P_IsDisplayPlayer(&players[i]))
|
if (P_IsDisplayPlayer(&players[i]))
|
||||||
{
|
{
|
||||||
// Draw display players on top of everything else
|
// Draw display players on top of everything else
|
||||||
@@ -3811,6 +3802,9 @@ static void K_drawKartMinimap(void)
|
|||||||
|
|
||||||
mobj_t *mobj = players[localplayers[i]].mo;
|
mobj_t *mobj = players[localplayers[i]].mo;
|
||||||
|
|
||||||
|
if (!mobj)
|
||||||
|
continue;
|
||||||
|
|
||||||
// dont draw for no contestants
|
// dont draw for no contestants
|
||||||
boolean playertimedout = (mobj->health <= 0 && players[localplayers[i]].pflags & PF_TIMEOVER);
|
boolean playertimedout = (mobj->health <= 0 && players[localplayers[i]].pflags & PF_TIMEOVER);
|
||||||
|
|
||||||
@@ -3835,10 +3829,8 @@ static void K_drawKartMinimap(void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const INT32 skinnum = K_GetMobjLocalSkinNum(mobj->skin, mobj->localskin, mobj->skinlocal);
|
|
||||||
|
|
||||||
// special case if startcolor is not the default (160 / Green)
|
// special case if startcolor is not the default (160 / Green)
|
||||||
if (skinnum && skins[skinnum].starttranscolor != skins[0].starttranscolor)
|
if (K_GetMobjSkin(mobj)->starttranscolor != skins[0].starttranscolor)
|
||||||
{
|
{
|
||||||
colormap = R_GetTranslationColormap(TC_DEFAULT, mobj->color, GTC_CACHE);
|
colormap = R_GetTranslationColormap(TC_DEFAULT, mobj->color, GTC_CACHE);
|
||||||
}
|
}
|
||||||
@@ -3968,10 +3960,23 @@ static void K_drawBattleFullscreen(void)
|
|||||||
|
|
||||||
INT32 x = BASEVIDWIDTH/2;
|
INT32 x = BASEVIDWIDTH/2;
|
||||||
INT32 y = (-64*FRACUNIT) + cardanim; // card animation goes from 0 to 164, 164 is the middle of the screen
|
INT32 y = (-64*FRACUNIT) + cardanim; // card animation goes from 0 to 164, 164 is the middle of the screen
|
||||||
INT32 splitflags = V_SNAPTOTOP; // I don't feel like properly supporting non-green resolutions, so you can have a misuse of SNAPTO instead
|
INT32 splitflags = splitscreen ? V_SNAPTOTOP : 0; // I don't feel like properly supporting non-green resolutions, so you can have a misuse of SNAPTO instead
|
||||||
fixed_t scale = FRACUNIT;
|
fixed_t scale = FRACUNIT;
|
||||||
boolean drawcomebacktimer = true; // lazy hack because it's cleaner in the long run.
|
boolean drawcomebacktimer = true; // lazy hack because it's cleaner in the long run.
|
||||||
|
|
||||||
|
// Small hack, if we're not in splitscreen we will not use V_SNAPTOTOP, instead we will just slightly offset
|
||||||
|
// y position so "attack or protect" doesn't slightly show before popping in
|
||||||
|
// We will also reduce this when is closer to finishing so when its at the bottom, the "hack offset" is 0
|
||||||
|
if (!splitscreen)
|
||||||
|
{
|
||||||
|
fixed_t offset = ((vid.height - vid.dup*BASEVIDHEIGHT)/vid.dup) * FRACUNIT/2;
|
||||||
|
|
||||||
|
// cardanim goes from 0 to 164, so when it is 164 offset will be multiplied by (1 - 164/164) = 0 :3
|
||||||
|
offset = FixedMul(offset, FRACUNIT - FixedDiv(cardanim, 164*FRACUNIT));
|
||||||
|
|
||||||
|
y -= offset;
|
||||||
|
}
|
||||||
|
|
||||||
if (!LUA_HudEnabled(hud_battlecomebacktimer))
|
if (!LUA_HudEnabled(hud_battlecomebacktimer))
|
||||||
drawcomebacktimer = false;
|
drawcomebacktimer = false;
|
||||||
|
|
||||||
@@ -4012,6 +4017,7 @@ static void K_drawBattleFullscreen(void)
|
|||||||
{
|
{
|
||||||
if (stplyrnum == 0)
|
if (stplyrnum == 0)
|
||||||
V_DrawFadeScreen(0xFF00, 16);
|
V_DrawFadeScreen(0xFF00, 16);
|
||||||
|
|
||||||
if (stplyr->exiting < 6*TICRATE && !stplyr->spectator)
|
if (stplyr->exiting < 6*TICRATE && !stplyr->spectator)
|
||||||
{
|
{
|
||||||
if (stplyr->kartstuff[k_position] == 1)
|
if (stplyr->kartstuff[k_position] == 1)
|
||||||
@@ -4058,12 +4064,12 @@ static void K_drawBattleFullscreen(void)
|
|||||||
if (K_UseColorHud()) // Colourized hud
|
if (K_UseColorHud()) // Colourized hud
|
||||||
{
|
{
|
||||||
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||||
V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, 0, kp_timeoutstickerclr, colormap);
|
V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, splitflags, kp_timeoutstickerclr, colormap);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, 0, kp_timeoutsticker, NULL);
|
V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, splitflags, kp_timeoutsticker, NULL);
|
||||||
|
|
||||||
V_DrawKartString(x-txoff, ty, 0, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
|
V_DrawKartString(x-txoff, ty, splitflags, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4076,7 +4082,7 @@ static void K_drawBattleFullscreen(void)
|
|||||||
{
|
{
|
||||||
if (i == displayplayers[0])
|
if (i == displayplayers[0])
|
||||||
continue;
|
continue;
|
||||||
if (playeringame[i] && !stplyr->spectator)
|
if (playeringame[i])
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4293,6 +4299,7 @@ static void K_drawInput(void)
|
|||||||
|
|
||||||
y -= FRACUNIT;
|
y -= FRACUNIT;
|
||||||
|
|
||||||
|
// stick displays
|
||||||
if (cv_showinput.value == 2 || cv_showinput.value == 3)
|
if (cv_showinput.value == 2 || cv_showinput.value == 3)
|
||||||
{
|
{
|
||||||
INT32 axis;
|
INT32 axis;
|
||||||
@@ -4320,38 +4327,19 @@ static void K_drawInput(void)
|
|||||||
// kart does not have anything we can get analogue joystick y axis values from
|
// kart does not have anything we can get analogue joystick y axis values from
|
||||||
// during normal gameplay, so replicate shit here
|
// during normal gameplay, so replicate shit here
|
||||||
|
|
||||||
// this is horrid but we cant get actual input in replays so uhh
|
const boolean analogjoystickmove = (!demo.playback && P_IsLocalPlayer(stplyr) && cv_usejoystick[stplyrnum].value && !DigitalGamepadStyle(stplyrnum));
|
||||||
if (demo.playback || !P_IsLocalPlayer(stplyr)) // yeah...........
|
axis = analogjoystickmove ? JoyAxis(AXISAIM, stplyrnum+1) : 0;
|
||||||
|
|
||||||
|
if (axis != 0)
|
||||||
|
{
|
||||||
|
hudforward -= ((axis * KART_FULLTURN) / JOYAXISRANGE);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
hudforward = stplyr->kartstuff[k_throwdir] * KART_FULLTURN;
|
hudforward = stplyr->kartstuff[k_throwdir] * KART_FULLTURN;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
const boolean analogjoystickmove = cv_usejoystick[stplyrnum].value && !Joystick[stplyrnum].bGamepadStyle;
|
|
||||||
const boolean gamepadjoystickmove = cv_usejoystick[stplyrnum].value && Joystick[stplyrnum].bGamepadStyle;
|
|
||||||
const UINT8 ssplayer = stplyrnum+1;
|
|
||||||
|
|
||||||
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 = CLAMP(hudforward, -KART_FULLTURN, KART_FULLTURN);
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd->driftturn || hudforward)
|
if (cmd->driftturn || hudforward)
|
||||||
{
|
{
|
||||||
@@ -4385,7 +4373,7 @@ static void K_drawInput(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else // wheel
|
||||||
{
|
{
|
||||||
if (!cmd->driftturn) // no turn
|
if (!cmd->driftturn) // no turn
|
||||||
target = 0;
|
target = 0;
|
||||||
@@ -4432,6 +4420,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
|
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
|
21,22,23,24 // frame 22-25, 1 tic: CHALLENGER turns gold
|
||||||
};
|
};
|
||||||
|
|
||||||
const UINT8 offset = min(52-1, (3*TICRATE)-mapreset);
|
const UINT8 offset = min(52-1, (3*TICRATE)-mapreset);
|
||||||
|
|
||||||
V_DrawFadeScreen(0xFF00, 16); // Fade out
|
V_DrawFadeScreen(0xFF00, 16); // Fade out
|
||||||
@@ -4440,6 +4429,9 @@ static void K_drawChallengerScreen(void)
|
|||||||
|
|
||||||
static void K_drawLapStartAnim(void)
|
static void K_drawLapStartAnim(void)
|
||||||
{
|
{
|
||||||
|
if (!cv_showlapemblem.value)
|
||||||
|
return;
|
||||||
|
|
||||||
// This is an EVEN MORE insanely complicated animation.
|
// This is an EVEN MORE insanely complicated animation.
|
||||||
const UINT8 progress = 80-stplyr->kartstuff[k_lapanimation];
|
const UINT8 progress = 80-stplyr->kartstuff[k_lapanimation];
|
||||||
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||||
@@ -4483,9 +4475,10 @@ static void K_drawLapStartAnim(void)
|
|||||||
V_DrawFixedPatch(leftx, y, FRACUNIT, vflags, kp_lapanim_lap[min(progress/2, 6)], NULL);
|
V_DrawFixedPatch(leftx, y, FRACUNIT, vflags, kp_lapanim_lap[min(progress/2, 6)], NULL);
|
||||||
|
|
||||||
char *lapnum = va("%02d", stplyr->laps + 1);
|
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 digit = lapnum[i] - '0';
|
||||||
int frame = min(2, progress/2 - 8 - (i*2));
|
int frame = min(2, progress/2 - 8 - (i*2));
|
||||||
@@ -4533,6 +4526,7 @@ static void K_drawDistributionDebugger(void)
|
|||||||
kp_orbinaut[4],
|
kp_orbinaut[4],
|
||||||
kp_jawz[1]
|
kp_jawz[1]
|
||||||
};
|
};
|
||||||
|
|
||||||
INT32 useodds = 0;
|
INT32 useodds = 0;
|
||||||
INT32 pingame = 0, bestbumper = 0;
|
INT32 pingame = 0, bestbumper = 0;
|
||||||
INT32 i;
|
INT32 i;
|
||||||
@@ -4549,8 +4543,10 @@ static void K_drawDistributionDebugger(void)
|
|||||||
if (!playeringame[i] || players[i].spectator)
|
if (!playeringame[i] || players[i].spectator)
|
||||||
continue;
|
continue;
|
||||||
pingame++;
|
pingame++;
|
||||||
|
|
||||||
if (players[i].exiting)
|
if (players[i].exiting)
|
||||||
dontforcespb = true;
|
dontforcespb = true;
|
||||||
|
|
||||||
if (players[i].kartstuff[k_bumper] > bestbumper)
|
if (players[i].kartstuff[k_bumper] > bestbumper)
|
||||||
bestbumper = players[i].kartstuff[k_bumper];
|
bestbumper = players[i].kartstuff[k_bumper];
|
||||||
}
|
}
|
||||||
@@ -4612,7 +4608,11 @@ static void K_drawCheckpointDebugger(void)
|
|||||||
else
|
else
|
||||||
V_DrawString(8, 184, 0, va("Checkpoint: %d / %d (Skip: %d)", stplyr->starpostnum, numstarposts, ((numstarposts/2) + stplyr->starpostnum)));
|
V_DrawString(8, 184, 0, va("Checkpoint: %d / %d (Skip: %d)", stplyr->starpostnum, numstarposts, ((numstarposts/2) + stplyr->starpostnum)));
|
||||||
|
|
||||||
V_DrawString(8, 192, 0, va("Waypoint dist: Prev %d, Next %d", stplyr->kartstuff[k_prevcheck], stplyr->kartstuff[k_nextcheck]));
|
// really gnarly hack
|
||||||
|
const INT32 prevcheck = (stprevnextchecks[0] != INT32_MAX) ? stprevnextchecks[0]: stplyr->kartstuff[k_prevcheck];
|
||||||
|
const INT32 nextcheck = (stprevnextchecks[1] != INT32_MAX) ? stprevnextchecks[1]: stplyr->kartstuff[k_nextcheck];
|
||||||
|
|
||||||
|
V_DrawString(8, 192, 0, va("Waypoint dist: Prev %d, Next %d", prevcheck, nextcheck));
|
||||||
}
|
}
|
||||||
|
|
||||||
// determines if gametype info (laps/bumpers) should be hidden
|
// determines if gametype info (laps/bumpers) should be hidden
|
||||||
@@ -4704,6 +4704,7 @@ void K_drawKartHUD(void)
|
|||||||
{
|
{
|
||||||
if (LUA_HudEnabled(hud_battlefullscreen))
|
if (LUA_HudEnabled(hud_battlefullscreen))
|
||||||
K_drawBattleFullscreen();
|
K_drawBattleFullscreen();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4863,7 +4864,7 @@ void K_drawKartHUD(void)
|
|||||||
{
|
{
|
||||||
if (stplyr->exiting)
|
if (stplyr->exiting)
|
||||||
K_drawKartFinish();
|
K_drawKartFinish();
|
||||||
else if (stplyr->kartstuff[k_lapanimation] && !splitscreen && cv_showlapemblem.value)
|
else if (stplyr->kartstuff[k_lapanimation] && !splitscreen)
|
||||||
K_drawLapStartAnim();
|
K_drawLapStartAnim();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,11 +35,13 @@ extern consvar_t cv_darkitembox;
|
|||||||
extern consvar_t cv_biglaps;
|
extern consvar_t cv_biglaps;
|
||||||
extern consvar_t cv_highresportrait;
|
extern consvar_t cv_highresportrait;
|
||||||
extern consvar_t cv_showstats;
|
extern consvar_t cv_showstats;
|
||||||
|
extern consvar_t cv_showstats_skinname;
|
||||||
extern consvar_t cv_fancyroulette;
|
extern consvar_t cv_fancyroulette;
|
||||||
extern consvar_t cv_showlaptimes;
|
extern consvar_t cv_showlaptimes;
|
||||||
extern consvar_t cv_battlespeedo;
|
extern consvar_t cv_battlespeedo;
|
||||||
extern consvar_t cv_multiitemicon;
|
extern consvar_t cv_multiitemicon;
|
||||||
extern consvar_t cv_huditemamount;
|
extern consvar_t cv_huditemamount;
|
||||||
|
extern consvar_t cv_roulettecolor;
|
||||||
|
|
||||||
// for use in timeattack menu
|
// for use in timeattack menu
|
||||||
extern patch_t *kp_facenum[MAXPLAYERS+1];
|
extern patch_t *kp_facenum[MAXPLAYERS+1];
|
||||||
|
|||||||
+622
-352
File diff suppressed because it is too large.
Load diff
@@ -32,6 +32,8 @@ extern consvar_t cv_bananajitter;
|
|||||||
extern consvar_t cv_bananthrowroll;
|
extern consvar_t cv_bananthrowroll;
|
||||||
extern consvar_t cv_airsparks;
|
extern consvar_t cv_airsparks;
|
||||||
|
|
||||||
|
extern INT32 stprevnextchecks[2];
|
||||||
|
|
||||||
boolean K_IsPlayerLosing(player_t *player);
|
boolean K_IsPlayerLosing(player_t *player);
|
||||||
boolean K_IsPlayerWanted(player_t *player);
|
boolean K_IsPlayerWanted(player_t *player);
|
||||||
INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean spbrush);
|
INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean spbrush);
|
||||||
|
|||||||
+14
-26
@@ -3055,58 +3055,46 @@ static int lib_kSetHyuCountdown(lua_State *L)
|
|||||||
|
|
||||||
static int lib_gSetPlayerGamepadIndicatorColor(lua_State *L)
|
static int lib_gSetPlayerGamepadIndicatorColor(lua_State *L)
|
||||||
{
|
{
|
||||||
INT32 player = -1;
|
INT32 pnum = -1;
|
||||||
player_t *plr = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); // retrieve player
|
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); // retrieve player
|
||||||
UINT8 color = (UINT8)luaL_checkinteger(L, 2); // skincolor
|
UINT8 color = (UINT8)luaL_checkinteger(L, 2); // skincolor
|
||||||
|
|
||||||
if (!plr)
|
if (!player)
|
||||||
return LUA_ErrInvalid(L, "player_t");
|
return LUA_ErrInvalid(L, "player_t");
|
||||||
|
|
||||||
if (color >= MAXTRANSLATIONS)
|
if (color >= MAXTRANSLATIONS)
|
||||||
return luaL_error(L, "color %d out of range (0 - %d).", color, MAXTRANSLATIONS-1);
|
return luaL_error(L, "color %d out of range (0 - %d).", color, MAXTRANSLATIONS-1);
|
||||||
|
|
||||||
for (int i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
|
pnum = P_GetLocalPlayerNumForPlayer(player);
|
||||||
{
|
|
||||||
if (plr - players == displayplayers[i])
|
|
||||||
{
|
|
||||||
player = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not a local player
|
// Not a local player
|
||||||
if (player == -1) return 0;
|
if (pnum == -1) return 0;
|
||||||
|
|
||||||
// pls update with color 0 when youre done with changing led stuff so it can get player color again
|
// pls update with color 0 when youre done with changing led stuff so it can get player color again
|
||||||
G_SetPlayerGamepadIndicatorColor(player, color);
|
G_SetPlayerGamepadIndicatorColor(pnum, color);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lib_gPlayerDeviceRumble(lua_State *L)
|
static int lib_gPlayerDeviceRumble(lua_State *L)
|
||||||
{
|
{
|
||||||
INT32 player = -1;
|
INT32 pnum = -1;
|
||||||
player_t *plr = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); // retrieve player
|
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); // retrieve player
|
||||||
UINT16 low_strength = (UINT16)luaL_checkinteger(L, 2); // low frequency rumble motor strenght
|
UINT16 low_strength = (UINT16)luaL_checkinteger(L, 2); // low frequency rumble motor strenght
|
||||||
UINT16 high_strength = (UINT16)luaL_checkinteger(L, 3); // high frequency rumble motor strenght
|
UINT16 high_strength = (UINT16)luaL_checkinteger(L, 3); // high frequency rumble motor strenght
|
||||||
UINT32 duration = (UINT32)luaL_optinteger(L, 4, 84); // duration of rumble in ms
|
UINT32 duration = (UINT32)luaL_optinteger(L, 4, 84); // duration of rumble in ms
|
||||||
|
|
||||||
if (!plr)
|
if (!player)
|
||||||
return LUA_ErrInvalid(L, "player_t");
|
return LUA_ErrInvalid(L, "player_t");
|
||||||
|
|
||||||
for (int i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
|
if (demo.playback) return 0;
|
||||||
{
|
|
||||||
if (plr - players == displayplayers[i])
|
pnum = P_GetLocalPlayerNumForPlayer(player);
|
||||||
{
|
|
||||||
player = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not a local player
|
// Not a local player
|
||||||
if (player == -1) return 0;
|
if (pnum == -1) return 0;
|
||||||
|
|
||||||
G_PlayerDeviceRumble(player, low_strength, high_strength, duration);
|
G_PlayerDeviceRumble(pnum, low_strength, high_strength, duration);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
+48
-14
@@ -182,14 +182,19 @@ void COM_Lua_f(void)
|
|||||||
len = (argc+1)*256;
|
len = (argc+1)*256;
|
||||||
|
|
||||||
buf = malloc(len);
|
buf = malloc(len);
|
||||||
|
if (buf == NULL)
|
||||||
|
I_Error("Failed to allocate buffer for COM_Lua_f");
|
||||||
|
|
||||||
p = buf;
|
p = buf;
|
||||||
WRITEUINT8(p, argc);
|
WRITEUINT8(p, argc);
|
||||||
for (i = 0; i < argc; i++)
|
for (i = 0; i < argc; i++)
|
||||||
WRITESTRINGN(p, COM_Argv(i), 255);
|
WRITESTRINGN(p, COM_Argv(i), 255);
|
||||||
if (flags & 2)
|
|
||||||
|
if (flags & COM_SPLITSCREEN)
|
||||||
SendNetXCmdForPlayer(1, XD_LUACMD, buf, p-buf);
|
SendNetXCmdForPlayer(1, XD_LUACMD, buf, p-buf);
|
||||||
else
|
else
|
||||||
SendNetXCmd(XD_LUACMD, buf, p-buf);
|
SendNetXCmd(XD_LUACMD, buf, p-buf);
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -358,7 +363,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)))
|
#define TYPEERROR(f, t) FIELDERROR(f, va("%s expected, got %s", lua_typename(L, t), luaL_typename(L, -1)))
|
||||||
|
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
while (lua_next(L, 1)) {
|
while (lua_next(L, 1))
|
||||||
|
{
|
||||||
// stack: cvar table, cvar userdata, key/index, value
|
// stack: cvar table, cvar userdata, key/index, value
|
||||||
// 1 2 3 4
|
// 1 2 3 4
|
||||||
i = 0;
|
i = 0;
|
||||||
@@ -368,26 +374,40 @@ static int lib_cvRegisterVar(lua_State *L)
|
|||||||
else if (lua_isstring(L, 3))
|
else if (lua_isstring(L, 3))
|
||||||
k = lua_tostring(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))
|
if (!lua_isstring(L, 4))
|
||||||
TYPEERROR("name", LUA_TSTRING)
|
TYPEERROR("name", LUA_TSTRING)
|
||||||
|
|
||||||
cvar->name = Z_StrDup(lua_tostring(L, 4));
|
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))
|
if (!lua_isstring(L, 4))
|
||||||
TYPEERROR("defaultvalue", LUA_TSTRING)
|
TYPEERROR("defaultvalue", LUA_TSTRING)
|
||||||
|
|
||||||
cvar->defaultvalue = Z_StrDup(lua_tostring(L, 4));
|
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))
|
if (!lua_isnumber(L, 4))
|
||||||
TYPEERROR("flags", LUA_TNUMBER)
|
TYPEERROR("flags", LUA_TNUMBER)
|
||||||
|
|
||||||
cvar->flags = (INT32)lua_tointeger(L, 4);
|
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);
|
CV_PossibleValue_t *pv = lua_touserdata(L, 4);
|
||||||
|
|
||||||
if (pv == CV_OnOff || pv == CV_YesNo || pv == CV_Unsigned || pv == CV_Natural)
|
if (pv == CV_OnOff || pv == CV_YesNo || pv == CV_Unsigned || pv == CV_Natural)
|
||||||
cvar->PossibleValue = pv;
|
cvar->PossibleValue = pv;
|
||||||
else
|
else
|
||||||
FIELDERROR("PossibleValue", "CV_PossibleValue_t expected, got unrecognised pointer")
|
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}
|
// 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"}}
|
// and converts them to CV_PossibleValue_t {{0,"MIN"},{9999,"MAX"}} or {{0,"Red"},{1,"Green"},{2,"Blue"}}
|
||||||
//
|
//
|
||||||
@@ -398,7 +418,9 @@ static int lib_cvRegisterVar(lua_State *L)
|
|||||||
CV_PossibleValue_t *cvpv;
|
CV_PossibleValue_t *cvpv;
|
||||||
|
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
while (lua_next(L, 4)) {
|
|
||||||
|
while (lua_next(L, 4))
|
||||||
|
{
|
||||||
count++;
|
count++;
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
}
|
}
|
||||||
@@ -412,7 +434,9 @@ static int lib_cvRegisterVar(lua_State *L)
|
|||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
while (lua_next(L, 4)) {
|
|
||||||
|
while (lua_next(L, 4))
|
||||||
|
{
|
||||||
// stack: [...] PossibleValue table, index, value
|
// stack: [...] PossibleValue table, index, value
|
||||||
// 4 5 6
|
// 4 5 6
|
||||||
if (lua_type(L, 5) != LUA_TSTRING
|
if (lua_type(L, 5) != LUA_TSTRING
|
||||||
@@ -423,14 +447,19 @@ static int lib_cvRegisterVar(lua_State *L)
|
|||||||
i++;
|
i++;
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
cvpv[i].value = 0;
|
cvpv[i].value = 0;
|
||||||
cvpv[i].strvalue = NULL;
|
cvpv[i].strvalue = NULL;
|
||||||
cvar->PossibleValue = cvpv;
|
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)))
|
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))
|
if (!lua_isfunction(L, 4))
|
||||||
TYPEERROR("func", LUA_TFUNCTION)
|
TYPEERROR("func", LUA_TFUNCTION)
|
||||||
|
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, "CV_OnChange");
|
lua_getfield(L, LUA_REGISTRYINDEX, "CV_OnChange");
|
||||||
I_Assert(lua_istable(L, 5));
|
I_Assert(lua_istable(L, 5));
|
||||||
lua_pushlightuserdata(L, cvar);
|
lua_pushlightuserdata(L, cvar);
|
||||||
@@ -438,9 +467,13 @@ static int lib_cvRegisterVar(lua_State *L)
|
|||||||
lua_rawset(L, 5);
|
lua_rawset(L, 5);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
cvar->func = Lua_OnChange;
|
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")))
|
|| (k && fasticmp(k, "category")))
|
||||||
{
|
{
|
||||||
category = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
|
category = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
|
||||||
@@ -451,6 +484,7 @@ static int lib_cvRegisterVar(lua_State *L)
|
|||||||
{
|
{
|
||||||
menu_name = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
|
menu_name = lua_isnoneornil(L, 4) ? NULL : lua_tostring(L, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
}
|
}
|
||||||
#undef FIELDERROR
|
#undef FIELDERROR
|
||||||
|
|||||||
+102
-25
@@ -25,6 +25,7 @@
|
|||||||
#include "lua_libs.h"
|
#include "lua_libs.h"
|
||||||
#include "lua_hook.h"
|
#include "lua_hook.h"
|
||||||
#include "lua_hud.h" // hud_running errors
|
#include "lua_hud.h" // hud_running errors
|
||||||
|
#include "lua_profile.h"
|
||||||
|
|
||||||
/* =========================================================================
|
/* =========================================================================
|
||||||
ABSTRACTION
|
ABSTRACTION
|
||||||
@@ -65,6 +66,8 @@ static stringhook_t stringHooks[STRING_HOOK(MAX)];
|
|||||||
|
|
||||||
bool hook_important = true;
|
bool hook_important = true;
|
||||||
|
|
||||||
|
#define NONMOHOOK ((mobjtype_t)-1)
|
||||||
|
|
||||||
// This will be indexed by hook id, the value of which fetches the registry.
|
// This will be indexed by hook id, the value of which fetches the registry.
|
||||||
static int * hookRefs;
|
static int * hookRefs;
|
||||||
static int nextid;
|
static int nextid;
|
||||||
@@ -293,18 +296,17 @@ typedef struct Hook_State Hook_State;
|
|||||||
typedef void (*Hook_Callback)(Hook_State *);
|
typedef void (*Hook_Callback)(Hook_State *);
|
||||||
|
|
||||||
struct Hook_State {
|
struct Hook_State {
|
||||||
INT32 status;/* return status to calling function */
|
INT32 status; /* return status to calling function */
|
||||||
void * userdata;
|
void * userdata;
|
||||||
int hook_type;
|
int hook_type;
|
||||||
mobjtype_t mobj_type;/* >0 if mobj hook */
|
mobjtype_t mobj_type; /* != NONMOHOOK if mobj hook */
|
||||||
boolean force_mobj;// allows mobj_type equal 0
|
const char * string; /* used to fetch table, ran first if set */
|
||||||
const char * string;/* used to fetch table, ran first if set */
|
int top; /* index of last argument passed to hook */
|
||||||
int top;/* index of last argument passed to hook */
|
int id; /* id to fetch ref */
|
||||||
int id;/* id to fetch ref */
|
bool important; /* is this hook from local addon */
|
||||||
boolean important;/* is this hook from local addon */
|
int values; /* num arguments passed to hook */
|
||||||
int values;/* num arguments passed to hook */
|
int results; /* num values returned by hook */
|
||||||
int results;/* num values returned by hook */
|
Hook_Callback results_handler; /* callback when hook successfully returns */
|
||||||
Hook_Callback results_handler;/* callback when hook successfully returns */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -364,10 +366,8 @@ FUNCINLINE static ATTRINLINE boolean prepare_hook
|
|||||||
int default_status,
|
int default_status,
|
||||||
int hook_type
|
int hook_type
|
||||||
){
|
){
|
||||||
hook->force_mobj = false;
|
|
||||||
|
|
||||||
return init_hook_type(hook, default_status,
|
return init_hook_type(hook, default_status,
|
||||||
hook_type, 0, NULL,
|
hook_type, NONMOHOOK, NULL,
|
||||||
hookIds[hook_type].numHooks);
|
hookIds[hook_type].numHooks);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -381,8 +381,6 @@ FUNCINLINE static ATTRINLINE boolean prepare_mobj_hook
|
|||||||
const mobjtype_t mobj_type =
|
const mobjtype_t mobj_type =
|
||||||
primary_mobj ? primary_mobj->type : NUMMOBJTYPES;
|
primary_mobj ? primary_mobj->type : NUMMOBJTYPES;
|
||||||
|
|
||||||
hook->force_mobj = true;
|
|
||||||
|
|
||||||
return init_hook_type(hook, default_status,
|
return init_hook_type(hook, default_status,
|
||||||
hook_type, mobj_type, NULL,
|
hook_type, mobj_type, NULL,
|
||||||
mobj_hook_available(hook_type, mobj_type));
|
mobj_hook_available(hook_type, mobj_type));
|
||||||
@@ -395,10 +393,8 @@ FUNCINLINE static ATTRINLINE boolean prepare_string_hook
|
|||||||
int hook_type,
|
int hook_type,
|
||||||
const char * string
|
const char * string
|
||||||
){
|
){
|
||||||
hook->force_mobj = false;
|
|
||||||
|
|
||||||
if (init_hook_type(hook, default_status,
|
if (init_hook_type(hook, default_status,
|
||||||
hook_type, 0, string,
|
hook_type, NONMOHOOK, string,
|
||||||
stringHooks[hook_type].ref))
|
stringHooks[hook_type].ref))
|
||||||
{
|
{
|
||||||
lua_pushstring(gL, string);
|
lua_pushstring(gL, string);
|
||||||
@@ -414,7 +410,7 @@ FUNCINLINE static ATTRINLINE boolean prepare_hud_hook
|
|||||||
int hook_type
|
int hook_type
|
||||||
){
|
){
|
||||||
return init_hook_type(hook, 0,
|
return init_hook_type(hook, 0,
|
||||||
hook_type, 0, NULL,
|
hook_type, NONMOHOOK, NULL,
|
||||||
hudHookIds[hook_type].numHooks);
|
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]);
|
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)
|
static int call_single_hook_no_copy(Hook_State *hook)
|
||||||
{
|
{
|
||||||
hook_important = hook->important;
|
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)
|
if (hook->results > 0)
|
||||||
{
|
{
|
||||||
@@ -537,9 +576,45 @@ static int call_string_hooks(Hook_State *hook)
|
|||||||
|
|
||||||
FUNCINLINE static ATTRINLINE int call_mobj_type_hooks(Hook_State *hook, mobjtype_t mobj_type)
|
FUNCINLINE static ATTRINLINE int call_mobj_type_hooks(Hook_State *hook, mobjtype_t mobj_type)
|
||||||
{
|
{
|
||||||
return call_mapped(hook, &mobjHookIds[mobj_type][hook->hook_type]);
|
static UINT8 seen = 0; // so we dont have to check all this shit constantly
|
||||||
|
int numCalls = call_mapped(hook, &mobjHookIds[mobj_type][hook->hook_type]);
|
||||||
|
|
||||||
|
if (!seen && numCalls > 0 && mobj_type == MT_NULL &&
|
||||||
|
( hook->hook_type == MOBJ_HOOK(MobjThinker )
|
||||||
|
|| hook->hook_type == MOBJ_HOOK(MobjCollide )
|
||||||
|
|| hook->hook_type == MOBJ_HOOK(MobjMoveCollide)
|
||||||
|
|| hook->hook_type == MOBJ_HOOK(MobjFuse )
|
||||||
|
|| hook->hook_type == MOBJ_HOOK(BossThinker )
|
||||||
|
))
|
||||||
|
{
|
||||||
|
seen = 1;
|
||||||
|
|
||||||
|
CONS_Alert(
|
||||||
|
CONS_WARNING, "%s\n", va(
|
||||||
|
"%s hooks not attached to a specific mobj type may cause performance issues!",
|
||||||
|
mobjHookNames[hook->hook_type])
|
||||||
|
);
|
||||||
|
|
||||||
|
// print which script triggered it, ty indev <3
|
||||||
|
for (int k = 0; k < mobjHookIds[mobj_type][hook->hook_type].numHooks; ++k)
|
||||||
|
{
|
||||||
|
lua_getref(gL, hookRefs[mobjHookIds[mobj_type][hook->hook_type].ids[k].id]);
|
||||||
|
|
||||||
|
lua_Debug ar;
|
||||||
|
lua_getinfo(gL, ">S", &ar);
|
||||||
|
|
||||||
|
CONS_Printf("%s:%d\n", ar.short_src, ar.linedefined);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return numCalls;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*FUNCINLINE static ATTRINLINE int call_mobj_type_hooks(Hook_State *hook, mobjtype_t mobj_type)
|
||||||
|
{
|
||||||
|
return call_mapped(hook, &mobjHookIds[mobj_type][hook->hook_type]);
|
||||||
|
}*/
|
||||||
|
|
||||||
static int call_hooks
|
static int call_hooks
|
||||||
(
|
(
|
||||||
Hook_State * hook,
|
Hook_State * hook,
|
||||||
@@ -554,14 +629,13 @@ static int call_hooks
|
|||||||
{
|
{
|
||||||
calls += call_string_hooks(hook);
|
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 */
|
/* call generic mobj hooks first */
|
||||||
calls += call_mobj_type_hooks(hook, MT_NULL);
|
calls += call_mobj_type_hooks(hook, MT_NULL);
|
||||||
|
|
||||||
if (hook->mobj_type < NUMMOBJTYPES)
|
if (hook->mobj_type < NUMMOBJTYPES)
|
||||||
calls += call_mobj_type_hooks(hook, hook->mobj_type);
|
calls += call_mobj_type_hooks(hook, hook->mobj_type);
|
||||||
|
|
||||||
ps_lua_mobjhooks.value.i += calls;
|
ps_lua_mobjhooks.value.i += calls;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -728,7 +802,7 @@ static void hook_think_frame(int type)
|
|||||||
const hook_t * map = &hookIds[type];
|
const hook_t * map = &hookIds[type];
|
||||||
int k;
|
int k;
|
||||||
|
|
||||||
const boolean perfstats = (cv_perfstats.value >= 3);
|
const boolean perfstats = (cv_perfstats.value >= PS_THINKFRAME);
|
||||||
|
|
||||||
if (prepare_hook(&hook, 0, type))
|
if (prepare_hook(&hook, 0, type))
|
||||||
{
|
{
|
||||||
@@ -986,6 +1060,9 @@ void LUA_HookNetArchive(lua_CFunction archFunc, savebuffer_t *save)
|
|||||||
lua_pushcclosure(gL, archFunc, 2);
|
lua_pushcclosure(gL, archFunc, 2);
|
||||||
// stack: tables, savebuffer_t, archFunc
|
// stack: tables, savebuffer_t, archFunc
|
||||||
|
|
||||||
|
// Manually set the hook's variables here since we don't call prepare_hook
|
||||||
|
hook.hook_type = HOOK(NetVars);
|
||||||
|
hook.mobj_type = NONMOHOOK; // Force mobj_type to be NONMOHOOK so the mobj_type check get skipped
|
||||||
init_hook_call(&hook, 0, res_none);
|
init_hook_call(&hook, 0, res_none);
|
||||||
call_mapped(&hook, map);
|
call_mapped(&hook, map);
|
||||||
|
|
||||||
|
|||||||
+10
-5
@@ -649,15 +649,17 @@ static int libd_drawOnMinimap(lua_State *L)
|
|||||||
UINT8 *colormap = NULL; // do we want to colormap this patch?
|
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.
|
boolean centered; // the patch is centered and doesn't need readjusting on x/y coordinates.
|
||||||
huddrawlist_h list;
|
huddrawlist_h list;
|
||||||
patch_t *AutomapPic = NULL;
|
|
||||||
drawinfo_t info;
|
drawinfo_t info;
|
||||||
|
|
||||||
|
// variables used to replicate k_kart's mmap drawer:
|
||||||
|
patch_t *AutomapPic;
|
||||||
|
|
||||||
// variables used for actually drawing the icon:
|
// variables used for actually drawing the icon:
|
||||||
INT32 splitflags, minimaptrans;
|
INT32 splitflags, minimaptrans;
|
||||||
fixed_t amnumxpos, amnumypos;
|
fixed_t amnumxpos, amnumypos;
|
||||||
fixed_t amxpos, amypos;
|
fixed_t amxpos, amypos;
|
||||||
INT32 mm_x, mm_y;
|
INT32 mm_x, mm_y;
|
||||||
fixed_t patchw = 0, patchh = 0;
|
fixed_t patchw, patchh;
|
||||||
|
|
||||||
HUDONLY // only run this function in hud hooks
|
HUDONLY // only run this function in hud hooks
|
||||||
|
|
||||||
@@ -722,8 +724,11 @@ static int libd_drawOnMinimap(lua_State *L)
|
|||||||
|
|
||||||
mm_y -= AutomapPic->topoffset;
|
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
|
// scale patch coords
|
||||||
patchw = (patch->width * scale / 2);
|
patchw = (patch->width * scale / 2);
|
||||||
@@ -1297,7 +1302,7 @@ static int lib_hudsetvotebackground(lua_State *L)
|
|||||||
|
|
||||||
if (strlen(prefix) != 4)
|
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);
|
strncpy(VoteScreen.luaPrefix, prefix, 4);
|
||||||
|
|||||||
@@ -690,7 +690,6 @@ void LUA_HUD_DrawList(huddrawlist_h list)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
I_Error("can't draw draw list item: invalid draw list item type");
|
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_script.h"
|
||||||
#include "lua_libs.h"
|
#include "lua_libs.h"
|
||||||
#include "lua_hud.h" // hud_running errors
|
#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);
|
boolean LUA_CallAction(enum actionnum actionnum, mobj_t *actor);
|
||||||
state_t *astate = NULL;
|
state_t *astate = NULL;
|
||||||
@@ -110,7 +111,10 @@ static void A_Lua(mobj_t *actor)
|
|||||||
LUA_PushUserdata(gL, actor, META_MOBJ);
|
LUA_PushUserdata(gL, actor, META_MOBJ);
|
||||||
lua_pushinteger(gL, var1);
|
lua_pushinteger(gL, var1);
|
||||||
lua_pushinteger(gL, var2);
|
lua_pushinteger(gL, var2);
|
||||||
|
|
||||||
|
lua_timer_t *timer = LUA_BeginFunctionTimer(gL, -4, "A_Lua");
|
||||||
LUA_Call(gL, 3, 0, 1);
|
LUA_Call(gL, 3, 0, 1);
|
||||||
|
LUA_EndFunctionTimer(timer);
|
||||||
|
|
||||||
lua_pop(gL, 1); // pop error handler
|
lua_pop(gL, 1); // pop error handler
|
||||||
|
|
||||||
|
|||||||
+15
-25
@@ -18,7 +18,6 @@
|
|||||||
#include "p_slopes.h"
|
#include "p_slopes.h"
|
||||||
#include "r_main.h"
|
#include "r_main.h"
|
||||||
|
|
||||||
#include "lua_udatalib.h"
|
|
||||||
#include "lua_script.h"
|
#include "lua_script.h"
|
||||||
#include "lua_libs.h"
|
#include "lua_libs.h"
|
||||||
#include "lua_hud.h" // hud_running errors
|
#include "lua_hud.h" // hud_running errors
|
||||||
@@ -256,15 +255,6 @@ static const char *const vector_opt[] = {
|
|||||||
static const char *const array_opt[] ={"iterate",NULL};
|
static const char *const array_opt[] ={"iterate",NULL};
|
||||||
static const char *const valid_opt[] ={"valid",NULL};
|
static const char *const valid_opt[] ={"valid",NULL};
|
||||||
|
|
||||||
#define pushsubsector(L, subsector) LUA_PushUserdata(L, subsector, META_SUBSECTOR)
|
|
||||||
int udatalib_getter_subsector(lua_State *L)
|
|
||||||
UDATALIB_SIMPLE_GETTER(subsector_t*, pushsubsector)
|
|
||||||
#undef pushsubsector
|
|
||||||
|
|
||||||
#define pushslope(L, slope) LUA_PushUserdata(L, slope, META_SLOPE)
|
|
||||||
int udatalib_getter_slope(lua_State *L)
|
|
||||||
UDATALIB_SIMPLE_GETTER(pslope_t*, pushslope)
|
|
||||||
#undef pushslope
|
|
||||||
// iterates through a sector's thinglist!
|
// iterates through a sector's thinglist!
|
||||||
static int lib_iterateSectorThinglist(lua_State *L)
|
static int lib_iterateSectorThinglist(lua_State *L)
|
||||||
{
|
{
|
||||||
@@ -652,7 +642,7 @@ static int line_get(lua_State *L)
|
|||||||
LUA_PushUserdata(L, &sides[line->sidenum[0]], META_SIDE);
|
LUA_PushUserdata(L, &sides[line->sidenum[0]], META_SIDE);
|
||||||
return 1;
|
return 1;
|
||||||
case line_backside: // backside
|
case line_backside: // backside
|
||||||
if (line->sidenum[1] == 0xffff)
|
if (line->sidenum[1] == NO_INDEX)
|
||||||
return 0;
|
return 0;
|
||||||
LUA_PushUserdata(L, &sides[line->sidenum[1]], META_SIDE);
|
LUA_PushUserdata(L, &sides[line->sidenum[1]], META_SIDE);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -1506,7 +1496,6 @@ enum mapheaderinfo_e
|
|||||||
mapheaderinfo_saveoverride,
|
mapheaderinfo_saveoverride,
|
||||||
mapheaderinfo_levelflags,
|
mapheaderinfo_levelflags,
|
||||||
mapheaderinfo_menuflags,
|
mapheaderinfo_menuflags,
|
||||||
//mapheaderinfo_automap,
|
|
||||||
mapheaderinfo_mobj_scale,
|
mapheaderinfo_mobj_scale,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1542,7 +1531,6 @@ static const char *const mapheaderinfo_opt[] = {
|
|||||||
"saveoverride",
|
"saveoverride",
|
||||||
"levelflags",
|
"levelflags",
|
||||||
"menuflags",
|
"menuflags",
|
||||||
//"automap",
|
|
||||||
"mobj_scale",
|
"mobj_scale",
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
@@ -1584,10 +1572,11 @@ static int mapheaderinfo_get(lua_State *L)
|
|||||||
lua_pushinteger(L, header->muspos);
|
lua_pushinteger(L, header->muspos);
|
||||||
break;
|
break;
|
||||||
case mapheaderinfo_musinterfadeout:
|
case mapheaderinfo_musinterfadeout:
|
||||||
lua_pushinteger(L, header->musinterfadeout);
|
lua_pushinteger(L, 0); // unused
|
||||||
break;
|
break;
|
||||||
case mapheaderinfo_musintername:
|
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;
|
break;
|
||||||
case mapheaderinfo_forcecharacter:
|
case mapheaderinfo_forcecharacter:
|
||||||
lua_pushstring(L, header->forcecharacter);
|
lua_pushstring(L, header->forcecharacter);
|
||||||
@@ -1641,10 +1630,10 @@ static int mapheaderinfo_get(lua_State *L)
|
|||||||
lua_pushinteger(L, header->levelselect);
|
lua_pushinteger(L, header->levelselect);
|
||||||
break;
|
break;
|
||||||
case mapheaderinfo_bonustype:
|
case mapheaderinfo_bonustype:
|
||||||
lua_pushinteger(L, header->bonustype);
|
lua_pushinteger(L, 0); // unused
|
||||||
break;
|
break;
|
||||||
case mapheaderinfo_saveoverride:
|
case mapheaderinfo_saveoverride:
|
||||||
lua_pushinteger(L, header->saveoverride);
|
lua_pushinteger(L, SAVE_DEFAULT); // unused
|
||||||
break;
|
break;
|
||||||
case mapheaderinfo_levelflags:
|
case mapheaderinfo_levelflags:
|
||||||
lua_pushinteger(L, header->levelflags);
|
lua_pushinteger(L, header->levelflags);
|
||||||
@@ -1652,28 +1641,29 @@ static int mapheaderinfo_get(lua_State *L)
|
|||||||
case mapheaderinfo_menuflags:
|
case mapheaderinfo_menuflags:
|
||||||
lua_pushinteger(L, header->menuflags);
|
lua_pushinteger(L, header->menuflags);
|
||||||
break;
|
break;
|
||||||
/*case mapheaderinfo_automap:
|
|
||||||
lua_pushstring(L, header->selectheading);
|
|
||||||
break;*/
|
|
||||||
case mapheaderinfo_mobj_scale:
|
case mapheaderinfo_mobj_scale:
|
||||||
lua_pushfixed(L, header->mobj_scale);
|
lua_pushfixed(L, header->mobj_scale);
|
||||||
break;
|
break;
|
||||||
// TODO add support for reading numGradedMares and grades
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
// Read custom vars now
|
// Read custom vars now
|
||||||
// (note: don't include the "LUA." in your lua scripts!)
|
// (note: don't include the "LUA." in your lua scripts!)
|
||||||
UINT8 j = 0;
|
if (!header->numCustomOptions) {
|
||||||
for (;j < header->numCustomOptions && !fastcmp(lua_tostring(L, 2), header->customopts[j].option); ++j);
|
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);
|
lua_pushstring(L, header->customopts[j].value);
|
||||||
else
|
else
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int LUA_MapLib(lua_State *L)
|
int LUA_MapLib(lua_State *L)
|
||||||
|
|||||||
+682
-649
File diff suppressed because it is too large.
Load diff
+824
-399
File diff suppressed because it is too large.
Load diff
Loaded 100 of 195 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user