Compare commits
336
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f58772a570 | ||
|
|
f7c065b22e | ||
|
|
55c8546d68 | ||
|
|
1762f18116 | ||
|
|
e4dbf1ce11 | ||
|
|
10b9d96259 | ||
|
|
b23154fd93 | ||
|
|
b0ee972178 | ||
|
|
544e1d3b21 | ||
|
|
0ca6947f99 | ||
|
|
3122c08039 | ||
|
|
7a279a6fd9 | ||
|
|
c4581bd9a6 | ||
|
|
bb47b976a7 | ||
|
|
6c419ff22e | ||
|
|
522904527f | ||
|
|
30539371c2 | ||
|
|
e2ecc315b4 | ||
|
|
eb2f186205 | ||
|
|
bbf06b3376 | ||
|
|
a1f70b0b31 | ||
|
|
2e0f5c02a4 | ||
|
|
0f7001ef5c | ||
|
|
4600da5782 | ||
|
|
a3557fadef | ||
|
|
d9a67faf47 | ||
|
|
96eaf8850e | ||
|
|
e7efd46419 | ||
|
|
346b1456cd | ||
|
|
9f5a5a735b | ||
|
|
8e4b304bed | ||
|
|
607fbc54fc | ||
|
|
276cf0a8cb | ||
|
|
59c9af97c2 | ||
|
|
4e75d99026 | ||
|
|
8e91c16e97 | ||
|
|
186421fe85 | ||
|
|
af952870c3 | ||
|
|
4eeb0b4b20 | ||
|
|
cb2c65e9d9 | ||
|
|
f7bbde3982 | ||
|
|
c9fc3b4820 | ||
|
|
f5195dd137 | ||
|
|
5289f13891 | ||
|
|
073b35690b | ||
|
|
43d3ac102d | ||
|
|
aa96f9ceb3 | ||
|
|
104b8260fb | ||
|
|
edebc728ef | ||
|
|
08e7ce3b5b | ||
|
|
29f187b751 | ||
|
|
ac3a1ad5eb | ||
|
|
1b8d7b1541 | ||
|
|
b812d61da2 | ||
|
|
6fd64383d3 | ||
|
|
e984e7a6c8 | ||
|
|
96f90ff9c4 | ||
|
|
51aec0e012 | ||
|
|
faadd3e89f | ||
|
|
0c091256f4 | ||
|
|
7a0fb01626 | ||
|
|
c01818e2e3 | ||
|
|
e17a8a505c | ||
|
|
ab654deba7 | ||
|
|
b145d7fd0e | ||
|
|
264c9e38ad | ||
|
|
e88773da4e | ||
|
|
310f67a06c | ||
|
|
0914d5b8e2 | ||
|
|
291a4dbb25 | ||
|
|
8fe3d13935 | ||
|
|
bdc326b14e | ||
|
|
d938e38ad3 | ||
|
|
3d4772455b | ||
|
|
e1f0089627 | ||
|
|
edbebbf082 | ||
|
|
242dee499d | ||
|
|
a2de1e24c5 | ||
|
|
c0cce90e60 | ||
|
|
67e74b5874 | ||
|
|
9639ace28a | ||
|
|
a2616778cc | ||
|
|
495c34dd40 | ||
|
|
f38ca9aa28 | ||
|
|
b0bf588c27 | ||
|
|
35e4f35f6e | ||
|
|
7866b769cc | ||
|
|
1af1e42dab | ||
|
|
40bd3e5e19 | ||
|
|
25dd3b4976 | ||
|
|
0fe3086a5a | ||
|
|
c9afd4a2cd | ||
|
|
7518a6f181 | ||
|
|
2bf4c44259 | ||
|
|
1c95e5f40e | ||
|
|
7c848f4be5 | ||
|
|
a4af254643 | ||
|
|
860dc37fe4 | ||
|
|
8b3d55fbc8 | ||
|
|
0540b5656a | ||
|
|
6c98440f27 | ||
|
|
3828a9f8e0 | ||
|
|
2c7c9ec32a | ||
|
|
1ccd3e37bc | ||
|
|
6ad344f65d | ||
|
|
1c289d73ca | ||
|
|
44ba69cf53 | ||
|
|
4cea0c1414 | ||
|
|
4ee468f5c6 | ||
|
|
9a58eb3010 | ||
|
|
59ff5e61bf | ||
|
|
821c061f82 | ||
|
|
eb4d9bbdd5 | ||
|
|
c19c80d797 | ||
|
|
a2feaa7fde | ||
|
|
3cb4e86b48 | ||
|
|
ed758fc921 | ||
|
|
a191c8b71e | ||
|
|
3f2e0bd349 | ||
|
|
3bdc745bd1 | ||
|
|
f578781418 | ||
|
|
0bb63ee0af | ||
|
|
2ae9563ab3 | ||
|
|
6b429e4388 | ||
|
|
0321b0d94a | ||
|
|
ac57b7fd2d | ||
|
|
7013e63142 | ||
|
|
4e1ef7c0cd | ||
|
|
892f2253ea | ||
|
|
bebe62346f | ||
|
|
834a94e429 | ||
|
|
fcf833ff48 | ||
|
|
f2a27539d3 | ||
|
|
05d26654df | ||
|
|
cee6a27340 | ||
|
|
66e35a9d67 | ||
|
|
ad096ccd42 | ||
|
|
7a9e81828a | ||
|
|
71e7dacb56 | ||
|
|
f9c0ee865f | ||
|
|
154eaaf027 | ||
|
|
66f5f9b2a2 | ||
|
|
b27275b887 | ||
|
|
c81c2c1d8d | ||
|
|
ccfab57a8c | ||
|
|
56d1343f1b | ||
|
|
b273bc3ca8 | ||
|
|
d4f58a885b | ||
|
|
04458f18f8 | ||
|
|
64152eea0d | ||
|
|
0e0a690e3c | ||
|
|
f283d3ca43 | ||
|
|
982fff959f | ||
|
|
b0e968e3c3 | ||
|
|
e5bbb14ce0 | ||
|
|
327cca2e8e | ||
|
|
e02e9a12d7 | ||
|
|
9e2fd091a8 | ||
|
|
0a04fca634 | ||
|
|
8a3f793324 | ||
|
|
e91892849c | ||
|
|
6b4e3c9d13 | ||
|
|
5f55b81fbf | ||
|
|
ca68bab002 | ||
|
|
339eb1879e | ||
|
|
1adb49c65c | ||
|
|
1d33a05a85 | ||
|
|
cfcd20d44a | ||
|
|
204607e272 | ||
|
|
b89a8ca6f9 | ||
|
|
d4aa352d59 | ||
|
|
c489841732 | ||
|
|
a6a97b4c4f | ||
|
|
fba070f82e | ||
|
|
10c117f95f | ||
|
|
bceda5beb4 | ||
|
|
c50c936b1f | ||
|
|
22a6be76b5 | ||
|
|
d3d25df3c5 | ||
|
|
2a3f9e9ee6 | ||
|
|
31f01fd5da | ||
|
|
bb9a4a0da0 | ||
|
|
3bac722562 | ||
|
|
3769ab74ac | ||
|
|
c3d6cdd272 | ||
|
|
093602fd6b | ||
|
|
a80d119c58 | ||
|
|
1cdc92a62b | ||
|
|
6b8de308b7 | ||
|
|
310e64d8be | ||
|
|
d2d3afc7f4 | ||
|
|
c26d2faee9 | ||
|
|
1c82c338a5 | ||
|
|
c81cd48552 | ||
|
|
306f7d455e | ||
|
|
dc40befa88 | ||
|
|
2222272d6f | ||
|
|
1849d5aade | ||
|
|
3878c2f72a | ||
|
|
7cf3bceaff | ||
|
|
1e394b0530 | ||
|
|
b09660204a | ||
|
|
7b4592377e | ||
|
|
45ba69a45a | ||
|
|
4d9c345202 | ||
|
|
0437952027 | ||
|
|
d188839d0b | ||
|
|
86ac11f877 | ||
|
|
0f59e0e270 | ||
|
|
cd32270ec0 | ||
|
|
f2a7f9ccaa | ||
|
|
2c2ffe36d7 | ||
|
|
951b880acb | ||
|
|
ecfa973e6b | ||
|
|
749b87b4ca | ||
|
|
7f671e4e30 | ||
|
|
ee0e4836f5 | ||
|
|
a01cd628ab | ||
|
|
4a4e668d21 | ||
|
|
03c579769c | ||
|
|
2e88b6a1dd | ||
|
|
5265b147f5 | ||
|
|
b4a37a2fa4 | ||
|
|
93eb2b336d | ||
|
|
30acdca9d3 | ||
|
|
677b34c174 | ||
|
|
b3be7bcedc | ||
|
|
19c10be76b | ||
|
|
60222f2f00 | ||
|
|
34edd0a2e3 | ||
|
|
46b485df14 | ||
|
|
8d3632caca | ||
|
|
b5ae9ba733 | ||
|
|
2a823ecd60 | ||
|
|
940327210f | ||
|
|
20a08df1e1 | ||
|
|
4cf27d40e9 | ||
|
|
d18c9a257a | ||
|
|
65dc5bb1fd | ||
|
|
e18be33c91 | ||
|
|
9ad6751719 | ||
|
|
86ab994408 | ||
|
|
21f0d603c3 | ||
|
|
971513e7d3 | ||
|
|
03929e551f | ||
|
|
db5ae247b6 | ||
|
|
d46beab34e | ||
|
|
9a794232d7 | ||
|
|
db635e5c5b | ||
|
|
8a105a9679 | ||
|
|
46b968a351 | ||
|
|
a9836307b2 | ||
|
|
b6515bb0ae | ||
|
|
b8257e9037 | ||
|
|
416a2565f9 | ||
|
|
fa75ad4cdd | ||
|
|
cedddaadfc | ||
|
|
43ec517cdd | ||
|
|
495ad5ce06 | ||
|
|
31ce643311 | ||
|
|
b5c1f21ac1 | ||
|
|
86c1b2cbef | ||
|
|
ad828b8f4b | ||
|
|
5dda681c8a | ||
|
|
92df8ffe01 | ||
|
|
2ee8dc09d1 | ||
|
|
b8f9392efd | ||
|
|
99f1166eb1 | ||
|
|
7ab8bf1bbf | ||
|
|
a994d7c050 | ||
|
|
e46d548080 | ||
|
|
3a7108ecfa | ||
|
|
bcf876a4c4 | ||
|
|
8ab15b73a9 | ||
|
|
301d73a30e | ||
|
|
2ef4e7fcba | ||
|
|
7eb118920f | ||
|
|
2f0588355e | ||
|
|
3e6830fc70 | ||
|
|
2faf859e32 | ||
|
|
8c31fd8a34 | ||
|
|
4dd6d52550 | ||
|
|
8524465767 | ||
|
|
91530c61ad | ||
|
|
89f450db27 | ||
|
|
3e212ebaad | ||
|
|
14af9eb82a | ||
|
|
ed5dbf74f4 | ||
|
|
2bf0a24ab6 | ||
|
|
88a9d6c29e | ||
|
|
335b7ba737 | ||
|
|
37cd720dd6 | ||
|
|
a085abe538 | ||
|
|
57dc099641 | ||
|
|
84a3503262 | ||
|
|
5117bf1f85 | ||
|
|
d4a29f2a44 | ||
|
|
6129e7c864 | ||
|
|
51371dce80 | ||
|
|
4814088265 | ||
|
|
2344c391d2 | ||
|
|
105267612b | ||
|
|
69ef78b2e8 | ||
|
|
f4349988c4 | ||
|
|
1b42131c6f | ||
|
|
c8db86379d | ||
|
|
40d2bf816c | ||
|
|
ca3f40ddf1 | ||
|
|
38bfb58f78 | ||
|
|
1fa50e12a8 | ||
|
|
f73e616b97 | ||
|
|
fe0ade1d9c | ||
|
|
1fb60e8230 | ||
|
|
efe7009650 | ||
|
|
19a4e379d7 | ||
|
|
4e8865d495 | ||
|
|
dfca24b370 | ||
|
|
a4c2fd2414 | ||
|
|
aa985823ba | ||
|
|
b779c9e63d | ||
|
|
c58e54544d | ||
|
|
c080fc8732 | ||
|
|
76747b4677 | ||
|
|
5268fc2d19 | ||
|
|
7325c8dbfd | ||
|
|
e5c18ae1f1 | ||
|
|
4bb5b8fa04 | ||
|
|
eb04271c83 | ||
|
|
54e7ad571e | ||
|
|
92ec4e65c1 | ||
|
|
a3e97b90f6 | ||
|
|
6f17ed0883 | ||
|
|
02d6fccfa9 | ||
|
|
0ceaca4b2f | ||
|
|
af9fa77501 | ||
|
|
2049353647 |
No files matched your search
+38
-29
@@ -1,14 +1,46 @@
|
|||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
# DO NOT CHANGE THIS SRB2 STRING! Some variable names depend on this string.
|
|
||||||
# Version change is fine.
|
|
||||||
project(SRB2
|
|
||||||
VERSION 1.6
|
|
||||||
LANGUAGES C)
|
|
||||||
|
|
||||||
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()
|
||||||
|
|
||||||
|
# DO NOT CHANGE THIS SRB2 STRING! Some variable names depend on this string.
|
||||||
|
# Version change is fine.
|
||||||
|
project(SRB2
|
||||||
|
VERSION 1.6
|
||||||
|
LANGUAGES C CXX)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
#set(CMAKE_CXX_EXTENSIONS OFF) # optional but recommended: disables GNU extensions, forces pure ISO C++
|
||||||
|
set(CMAKE_CXX_EXTENSIONS ON)
|
||||||
|
set(CMAKE_C_EXTENSIONS ON)
|
||||||
|
|
||||||
|
##### PACKAGE CONFIGURATION #####
|
||||||
|
|
||||||
|
set(SRB2_CPACK_GENERATOR "" CACHE STRING "Generator to use for making a package. E.g., ZIP, TGZ, DragNDrop (OSX only). Leave blank for default generator.")
|
||||||
|
|
||||||
|
if("${SRB2_CPACK_GENERATOR}" STREQUAL "")
|
||||||
|
if("${CMAKE_SYSTEM_NAME}" MATCHES "Windows")
|
||||||
|
set(SRB2_CPACK_GENERATOR "ZIP")
|
||||||
|
elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
|
||||||
|
set(SRB2_CPACK_GENERATOR "TGZ")
|
||||||
|
elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin")
|
||||||
|
set(SRB2_CPACK_GENERATOR "TGZ")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CPACK_GENERATOR ${SRB2_CPACK_GENERATOR})
|
||||||
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Sonic Robo Blast 2 Kart" CACHE STRING "Program name for display purposes")
|
||||||
|
set(CPACK_PACKAGE_VENDOR "Kart Krew" CACHE STRING "Vendor name for display purposes")
|
||||||
|
#set(CPACK_PACKAGE_DESCRIPTION_FILE )
|
||||||
|
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
|
||||||
|
set(CPACK_PACKAGE_VERSION_MAJOR ${SRB2_VERSION_MAJOR})
|
||||||
|
set(CPACK_PACKAGE_VERSION_MINOR ${SRB2_VERSION_MINOR})
|
||||||
|
set(CPACK_PACKAGE_VERSION_PATCH ${SRB2_VERSION_PATCH})
|
||||||
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMAKE_VERSION_MAJOR}.${CMAKE_VERSION_MINOR}")
|
||||||
|
include(CPack)
|
||||||
|
|
||||||
# Set up CMAKE path
|
# Set up CMAKE path
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
|
||||||
|
|
||||||
@@ -73,6 +105,7 @@ endif()
|
|||||||
# OS macros
|
# OS macros
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
add_definitions(-DUNIXCOMMON)
|
add_definitions(-DUNIXCOMMON)
|
||||||
|
add_link_options(-rdynamic) # Use -rdynamic so a backtrace log shows function names
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_COMPILER_IS_GNUCC)
|
if(CMAKE_COMPILER_IS_GNUCC)
|
||||||
@@ -95,14 +128,12 @@ set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
|||||||
|
|
||||||
# Set EXE names so the assets CMakeLists can refer to its target
|
# Set EXE names so the assets CMakeLists can refer to its target
|
||||||
set(SRB2_SDL2_EXE_NAME srb2kart CACHE STRING "Executable binary output name")
|
set(SRB2_SDL2_EXE_NAME srb2kart CACHE STRING "Executable binary output name")
|
||||||
set(SRB2_WIN_EXE_NAME srb2kartdd CACHE STRING "Executable binary output name for DirectDraw build")
|
|
||||||
|
|
||||||
include_directories(${CMAKE_CURRENT_BINARY_DIR}/src)
|
include_directories(${CMAKE_CURRENT_BINARY_DIR}/src)
|
||||||
|
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
add_subdirectory(assets)
|
add_subdirectory(assets)
|
||||||
|
|
||||||
|
|
||||||
## config.h generation
|
## config.h generation
|
||||||
set(GIT_EXECUTABLE "git" CACHE FILEPATH "Path to git binary")
|
set(GIT_EXECUTABLE "git" CACHE FILEPATH "Path to git binary")
|
||||||
include(GitUtilities)
|
include(GitUtilities)
|
||||||
@@ -111,25 +142,3 @@ git_current_branch(SRB2_GIT_BRANCH "${CMAKE_SOURCE_DIR}")
|
|||||||
set(SRB2_COMP_BRANCH "${SRB2_GIT_BRANCH}")
|
set(SRB2_COMP_BRANCH "${SRB2_GIT_BRANCH}")
|
||||||
set(SRB2_COMP_REVISION "${SRB2_COMP_COMMIT}")
|
set(SRB2_COMP_REVISION "${SRB2_COMP_COMMIT}")
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/config.h)
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/config.h)
|
||||||
|
|
||||||
##### PACKAGE CONFIGURATION #####
|
|
||||||
|
|
||||||
if(${CMAKE_SYSTEM} MATCHES "Windows")
|
|
||||||
set(CPACK_GENERATOR "ZIP")
|
|
||||||
endif()
|
|
||||||
if(${CMAKE_SYSTEM} MATCHES "Linux")
|
|
||||||
set(CPACK_GENERATOR "TGZ")
|
|
||||||
endif()
|
|
||||||
if(${CMAKE_SYSTEM} MATCHES "Darwin")
|
|
||||||
set(CPACK_GENERATOR "DragNDrop")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Sonic Robo Blast 2 Kart" CACHE STRING "Program name for display purposes")
|
|
||||||
set(CPACK_PACKAGE_VENDOR "Kart Krew" CACHE STRING "Vendor name for display purposes")
|
|
||||||
#set(CPACK_PACKAGE_DESCRIPTION_FILE )
|
|
||||||
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
|
|
||||||
set(CPACK_PACKAGE_VERSION_MAJOR ${SRB2_VERSION_MAJOR})
|
|
||||||
set(CPACK_PACKAGE_VERSION_MINOR ${SRB2_VERSION_MINOR})
|
|
||||||
set(CPACK_PACKAGE_VERSION_PATCH ${SRB2_VERSION_PATCH})
|
|
||||||
set(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMAKE_VERSION_MAJOR}.${CMAKE_VERSION_MINOR}")
|
|
||||||
include(CPack)
|
|
||||||
+8
-1
@@ -13,10 +13,12 @@ Mainly for use in visual-only addons like secondcolor.
|
|||||||
|
|
||||||
**Not netsafe**. Returns player's current sliptide roll angle, taking sliptideroll cvar value into account.
|
**Not netsafe**. Returns player's current sliptide roll angle, taking sliptideroll cvar value into account.
|
||||||
|
|
||||||
## hud.setVoteBackground(name)
|
## hud.setVoteBackground(name[, time\_per\_frame])
|
||||||
|
|
||||||
Changes vote background texture prefix (game looks for PREFIX + "W" or "C" (depends on resolution) + FRAME\_NUMBER).
|
Changes vote background texture prefix (game looks for PREFIX + "W" or "C" (depends on resolution) + FRAME\_NUMBER).
|
||||||
|
|
||||||
|
If time\_per\_frame is set, each frame will last this amount of tics, default value is 2
|
||||||
|
|
||||||
## hud.add(fn, "vote") and hud.add(fn, "intermission")
|
## hud.add(fn, "vote") and hud.add(fn, "intermission")
|
||||||
|
|
||||||
Hud hooks for vote screen and intermission screen. They only get drawer (`v`) as argument.
|
Hud hooks for vote screen and intermission screen. They only get drawer (`v`) as argument.
|
||||||
@@ -120,6 +122,11 @@ v.interpLatch(false)
|
|||||||
```
|
```
|
||||||
When using a custom string drawer, enable this mode to avoid interpolation artifacting when the string changes.
|
When using a custom string drawer, enable this mode to avoid interpolation artifacting when the string changes.
|
||||||
|
|
||||||
|
## cameras[] global array
|
||||||
|
|
||||||
|
Local player cameras that can be accessed outside of hud hooks.
|
||||||
|
`#cameras` will return amount of available cameras. (0 on dedicated server, 1 with 1 player, 4 with 4p splitscreen, etc)
|
||||||
|
|
||||||
## mobj.spritexscale, mobj.spriteyscale, mobj.spritexoffset, mobj.spriteyoffset, mobj.rollangle, mobj.sloperoll, mobj.rollmodel fields
|
## mobj.spritexscale, mobj.spriteyscale, mobj.spritexoffset, mobj.spriteyoffset, mobj.rollangle, mobj.sloperoll, mobj.rollmodel fields
|
||||||
|
|
||||||
Same fields as in SRB2 2.2
|
Same fields as in SRB2 2.2
|
||||||
|
|||||||
@@ -22,13 +22,14 @@ We also have a Flatpak available on [Flathub](https://flathub.org/en/apps/org.sr
|
|||||||
|
|
||||||
See [SRB2 Wiki/Source code compiling](http://wiki.srb2.org/wiki/Source_code_compiling). The compiling process for SRB2Kart is largely identical to SRB2.
|
See [SRB2 Wiki/Source code compiling](http://wiki.srb2.org/wiki/Source_code_compiling). The compiling process for SRB2Kart is largely identical to SRB2.
|
||||||
|
|
||||||
Currently only the Makefile build system with GCC or Clang compiler is supported.
|
For Windows only the Makefile build system with GCC or Clang compiler is supported.
|
||||||
|
|
||||||
Visual C++ (MSVC) is unsupported.
|
Visual C++ (MSVC) is unsupported.
|
||||||
|
|
||||||
64-bit Windows builds are supported and recommended over 32-bit builds, they will build automatically when using the MSYS2 MinGW 64-bit executable (requires the mingw-w64-x86_64-gcc package), no extra flags needed!
|
64-bit Windows builds are supported and recommended over 32-bit builds, they will build automatically when using the MSYS2 MinGW 64-bit executable (requires the mingw-w64-x86_64-gcc package), no extra flags needed!
|
||||||
The specific DLLs can be found under /libs/dll-binaries/(i686 for 32bit/x86_64 for 64-bit)/ or in the Release packages
|
The specific DLLs can be found under /libs/dll-binaries/(i686 for 32bit/x86_64 for 64-bit)/ or in the Release packages
|
||||||
|
|
||||||
|
MacOS and Linux can be build with CMake, but it is recommended to use the Makefile for Linux over CMake
|
||||||
|
|
||||||
Alternatively the [srb2bld](https://github.com/Bijman/srb2bld) script by Bijman can be used aswell!
|
Alternatively the [srb2bld](https://github.com/Bijman/srb2bld) script by Bijman can be used aswell!
|
||||||
|
|
||||||
## Disclaimer
|
## Disclaimer
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
## Assets Target Configuration ##
|
## Assets Target Configuration ##
|
||||||
|
|
||||||
|
if(${CMAKE_SYSTEM} MATCHES Linux)
|
||||||
|
# Asset installation isn't part of the Linux target
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
# For prepending the current source path, later
|
# For prepending the current source path, later
|
||||||
FUNCTION(PREPEND var prefix)
|
FUNCTION(PREPEND var prefix)
|
||||||
SET(listVar "")
|
SET(listVar "")
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
include(LibFindMacros)
|
include(LibFindMacros)
|
||||||
|
|
||||||
libfind_pkg_check_modules(GME_PKGCONF GME)
|
libfind_pkg_check_modules(GME_PKGCONF LIBGME)
|
||||||
|
|
||||||
find_path(GME_INCLUDE_DIR
|
find_path(GME_INCLUDE_DIR
|
||||||
NAMES gme.h
|
NAMES gme.h
|
||||||
@@ -8,6 +8,7 @@ find_path(GME_INCLUDE_DIR
|
|||||||
${GME_PKGCONF_INCLUDE_DIRS}
|
${GME_PKGCONF_INCLUDE_DIRS}
|
||||||
"/usr/include/gme"
|
"/usr/include/gme"
|
||||||
"/usr/local/include/gme"
|
"/usr/local/include/gme"
|
||||||
|
PATH_SUFFIXES gme
|
||||||
)
|
)
|
||||||
|
|
||||||
find_library(GME_LIBRARY
|
find_library(GME_LIBRARY
|
||||||
@@ -20,4 +21,4 @@ find_library(GME_LIBRARY
|
|||||||
|
|
||||||
set(GME_PROCESS_INCLUDES GME_INCLUDE_DIR)
|
set(GME_PROCESS_INCLUDES GME_INCLUDE_DIR)
|
||||||
set(GME_PROCESS_LIBS GME_LIBRARY)
|
set(GME_PROCESS_LIBS GME_LIBRARY)
|
||||||
libfind_process(GME)
|
libfind_process(GME)
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
include(LibFindMacros)
|
include(LibFindMacros)
|
||||||
|
|
||||||
libfind_pkg_check_modules(OPENMPT_PKGCONF OPENMPT)
|
libfind_pkg_check_modules(OPENMPT_PKGCONF LIBOPENMPT)
|
||||||
|
|
||||||
find_path(OPENMPT_INCLUDE_DIR
|
find_path(OPENMPT_INCLUDE_DIR
|
||||||
NAMES libopenmpt.h
|
NAMES libopenmpt.h
|
||||||
@@ -8,6 +8,7 @@ find_path(OPENMPT_INCLUDE_DIR
|
|||||||
${OPENMPT_PKGCONF_INCLUDE_DIRS}
|
${OPENMPT_PKGCONF_INCLUDE_DIRS}
|
||||||
"/usr/include/libopenmpt"
|
"/usr/include/libopenmpt"
|
||||||
"/usr/local/include/libopenmpt"
|
"/usr/local/include/libopenmpt"
|
||||||
|
PATH_SUFFIXES libopenmpt
|
||||||
)
|
)
|
||||||
|
|
||||||
find_library(OPENMPT_LIBRARY
|
find_library(OPENMPT_LIBRARY
|
||||||
@@ -20,4 +21,4 @@ find_library(OPENMPT_LIBRARY
|
|||||||
|
|
||||||
set(OPENMPT_PROCESS_INCLUDES OPENMPT_INCLUDE_DIR)
|
set(OPENMPT_PROCESS_INCLUDES OPENMPT_INCLUDE_DIR)
|
||||||
set(OPENMPT_PROCESS_LIBS OPENMPT_LIBRARY)
|
set(OPENMPT_PROCESS_LIBS OPENMPT_LIBRARY)
|
||||||
libfind_process(OPENMPT)
|
libfind_process(OPENMPT)
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
include(LibFindMacros)
|
||||||
|
|
||||||
|
libfind_pkg_check_modules(LIBBACKTRACE_PKGCONF LIBBACKTRACE)
|
||||||
|
|
||||||
|
find_path(LIBBACKTRACE_INCLUDE_DIR
|
||||||
|
NAMES backtrace.h
|
||||||
|
PATHS
|
||||||
|
${LIBBACKTRACE_PKGCONF_INCLUDE_DIRS}
|
||||||
|
"/usr/include"
|
||||||
|
"/usr/local/include"
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(LIBBACKTRACE_LIBRARY
|
||||||
|
NAMES backtrace
|
||||||
|
PATHS
|
||||||
|
${LIBBACKTRACE_PKGCONF_LIBRARY_DIRS}
|
||||||
|
"/usr/lib"
|
||||||
|
"/usr/local/lib"
|
||||||
|
)
|
||||||
|
|
||||||
|
set(LIBBACKTRACE_PROCESS_INCLUDES LIBBACKTRACE_INCLUDE_DIR)
|
||||||
|
set(LIBBACKTRACE_PROCESS_LIBS LIBBACKTRACE_LIBRARY)
|
||||||
|
libfind_process(LIBBACKTRACE)
|
||||||
|
|
||||||
|
if(LIBBACKTRACE_FOUND AND NOT TARGET libbacktrace)
|
||||||
|
add_library(libbacktrace UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(
|
||||||
|
libbacktrace
|
||||||
|
PROPERTIES
|
||||||
|
IMPORTED_LOCATION "${LIBBACKTRACE_LIBRARY}"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${LIBBACKTRACE_INCLUDE_DIR}"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# Version 2.2
|
# Version 2.4
|
||||||
# Public Domain, originally written by Lasse Kärkkäinen <tronic>
|
# Public Domain, originally written by Lasse Kärkkäinen <tronic>
|
||||||
# Maintained at https://github.com/Tronic/cmake-modules
|
# Maintained at https://github.com/Tronic/cmake-modules
|
||||||
# Please send your improvements as pull requests on Github.
|
# Please send your improvements as pull requests on Github.
|
||||||
@@ -52,6 +52,10 @@ function (libfind_pkg_detect PREFIX)
|
|||||||
if (libraryargs)
|
if (libraryargs)
|
||||||
find_library(${PREFIX}_LIBRARY NAMES ${libraryargs} HINTS ${${PREFIX}_PKGCONF_LIBRARY_DIRS})
|
find_library(${PREFIX}_LIBRARY NAMES ${libraryargs} HINTS ${${PREFIX}_PKGCONF_LIBRARY_DIRS})
|
||||||
endif()
|
endif()
|
||||||
|
# Read pkg-config version
|
||||||
|
if (${PREFIX}_PKGCONF_VERSION)
|
||||||
|
set(${PREFIX}_VERSION ${${PREFIX}_PKGCONF_VERSION} PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# Extracts a version #define from a version.h file, output stored to <PREFIX>_VERSION.
|
# Extracts a version #define from a version.h file, output stored to <PREFIX>_VERSION.
|
||||||
@@ -125,24 +129,39 @@ function (libfind_process PREFIX)
|
|||||||
|
|
||||||
# Process deps to add to
|
# Process deps to add to
|
||||||
foreach (i ${PREFIX} ${${PREFIX}_DEPENDENCIES})
|
foreach (i ${PREFIX} ${${PREFIX}_DEPENDENCIES})
|
||||||
if (DEFINED ${i}_INCLUDE_OPTS OR DEFINED ${i}_LIBRARY_OPTS)
|
if (DEFINED ${i}_INCLUDE_OPTS)
|
||||||
# The package seems to export option lists that we can use, woohoo!
|
# The package seems to export option lists that we can use, woohoo!
|
||||||
list(APPEND includeopts ${${i}_INCLUDE_OPTS})
|
list(APPEND includeopts ${${i}_INCLUDE_OPTS})
|
||||||
|
else()
|
||||||
|
if (DEFINED ${i}_INCLUDE_DIR)
|
||||||
|
# Singular forms can be used
|
||||||
|
list(APPEND includeopts ${i}_INCLUDE_DIR)
|
||||||
|
else()
|
||||||
|
if (DEFINED ${i}_INCLUDE_DIRS)
|
||||||
|
# Plural forms can be used
|
||||||
|
list(APPEND includeopts ${i}_INCLUDE_DIRS)
|
||||||
|
else()
|
||||||
|
# Oh no, we don't know the option names
|
||||||
|
message(FATAL_ERROR "We couldn't determine config variable names for ${i} includes. Aieeh!")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (DEFINED ${i}_LIBRARY_OPTS)
|
||||||
|
# The package seems to export option lists that we can use, woohoo!
|
||||||
list(APPEND libraryopts ${${i}_LIBRARY_OPTS})
|
list(APPEND libraryopts ${${i}_LIBRARY_OPTS})
|
||||||
else()
|
else()
|
||||||
# If plural forms don't exist or they equal singular forms
|
if (DEFINED ${i}_LIBRARY)
|
||||||
if ((NOT DEFINED ${i}_INCLUDE_DIRS AND NOT DEFINED ${i}_LIBRARIES) OR
|
|
||||||
({i}_INCLUDE_DIR STREQUAL ${i}_INCLUDE_DIRS AND ${i}_LIBRARY STREQUAL ${i}_LIBRARIES))
|
|
||||||
# Singular forms can be used
|
# Singular forms can be used
|
||||||
if (DEFINED ${i}_INCLUDE_DIR)
|
list(APPEND libraryopts ${i}_LIBRARY)
|
||||||
list(APPEND includeopts ${i}_INCLUDE_DIR)
|
|
||||||
endif()
|
|
||||||
if (DEFINED ${i}_LIBRARY)
|
|
||||||
list(APPEND libraryopts ${i}_LIBRARY)
|
|
||||||
endif()
|
|
||||||
else()
|
else()
|
||||||
# Oh no, we don't know the option names
|
if (DEFINED ${i}_LIBRARIES)
|
||||||
message(FATAL_ERROR "We couldn't determine config variable names for ${i} includes and libs. Aieeh!")
|
# Plural forms can be used
|
||||||
|
list(APPEND libraryopts ${i}_LIBRARIES)
|
||||||
|
else()
|
||||||
|
# Oh no, we don't know the option names
|
||||||
|
message(FATAL_ERROR "We couldn't determine config variable names for ${i} libraries. Aieeh!")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
@@ -209,12 +228,12 @@ function (libfind_process PREFIX)
|
|||||||
message(STATUS " ${PREFIX}_LIBRARY_OPTS=${libraryopts}")
|
message(STATUS " ${PREFIX}_LIBRARY_OPTS=${libraryopts}")
|
||||||
message(STATUS " ${PREFIX}_LIBRARIES=${libs}")
|
message(STATUS " ${PREFIX}_LIBRARIES=${libs}")
|
||||||
endif()
|
endif()
|
||||||
set (${PREFIX}_INCLUDE_OPTS ${includeopts} PARENT_SCOPE)
|
|
||||||
set (${PREFIX}_LIBRARY_OPTS ${libraryopts} PARENT_SCOPE)
|
|
||||||
set (${PREFIX}_INCLUDE_DIRS ${includes} PARENT_SCOPE)
|
|
||||||
set (${PREFIX}_LIBRARIES ${libs} PARENT_SCOPE)
|
|
||||||
set (${PREFIX}_FOUND TRUE PARENT_SCOPE)
|
|
||||||
endif()
|
endif()
|
||||||
|
set (${PREFIX}_INCLUDE_OPTS ${includeopts} PARENT_SCOPE)
|
||||||
|
set (${PREFIX}_LIBRARY_OPTS ${libraryopts} PARENT_SCOPE)
|
||||||
|
set (${PREFIX}_INCLUDE_DIRS ${includes} PARENT_SCOPE)
|
||||||
|
set (${PREFIX}_LIBRARIES ${libs} PARENT_SCOPE)
|
||||||
|
set (${PREFIX}_FOUND TRUE PARENT_SCOPE)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
/cscope.out
|
/cscope.out
|
||||||
*.json
|
*.json
|
||||||
*.idx
|
*.idx
|
||||||
|
*.gdb_history
|
||||||
+88
-31
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
# Core sources
|
# Core sources
|
||||||
set(SRB2_CORE_SOURCES
|
set(SRB2_CORE_SOURCES
|
||||||
|
core/memory.cpp
|
||||||
|
core/thread_pool.cpp
|
||||||
am_map.c
|
am_map.c
|
||||||
b_bot.c
|
b_bot.c
|
||||||
command.c
|
command.c
|
||||||
@@ -18,17 +20,21 @@ set(SRB2_CORE_SOURCES
|
|||||||
f_wipe.c
|
f_wipe.c
|
||||||
filesrch.c
|
filesrch.c
|
||||||
g_game.c
|
g_game.c
|
||||||
|
g_demo.c
|
||||||
g_input.c
|
g_input.c
|
||||||
hu_stuff.c
|
hu_stuff.c
|
||||||
i_tcp.c
|
i_tcp.c
|
||||||
info.c
|
info.c
|
||||||
|
k_hud.c
|
||||||
lzf.c
|
lzf.c
|
||||||
m_aatree.c
|
m_aatree.c
|
||||||
m_anigif.c
|
m_anigif.c
|
||||||
m_argv.c
|
m_argv.c
|
||||||
m_bbox.c
|
m_bbox.c
|
||||||
m_cheat.c
|
m_cheat.c
|
||||||
|
m_curl.c
|
||||||
m_cond.c
|
m_cond.c
|
||||||
|
m_emotes.cpp
|
||||||
m_fixed.c
|
m_fixed.c
|
||||||
m_menu.c
|
m_menu.c
|
||||||
m_textinput.c
|
m_textinput.c
|
||||||
@@ -40,19 +46,25 @@ set(SRB2_CORE_SOURCES
|
|||||||
mserv.c
|
mserv.c
|
||||||
http-mserv.c
|
http-mserv.c
|
||||||
qs22j.c
|
qs22j.c
|
||||||
|
r_skins.c
|
||||||
s_sound.c
|
s_sound.c
|
||||||
screen.c
|
screen.c
|
||||||
sounds.c
|
sounds.c
|
||||||
st_stuff.c
|
st_stuff.c
|
||||||
#string.c
|
string.c
|
||||||
tables.c
|
tables.c
|
||||||
v_video.c
|
v_video.c
|
||||||
w_wad.c
|
w_wad.c
|
||||||
y_inter.c
|
y_inter.c
|
||||||
z_zone.c
|
z_zone.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(SRB2_CORE_HEADERS
|
set(SRB2_CORE_HEADERS
|
||||||
|
core/memory.h
|
||||||
|
core/thread_pool.h
|
||||||
|
m_curl.h
|
||||||
|
m_emotes.h
|
||||||
|
k_hud.h
|
||||||
am_map.h
|
am_map.h
|
||||||
b_bot.h
|
b_bot.h
|
||||||
byteptr.h
|
byteptr.h
|
||||||
@@ -78,6 +90,7 @@ set(SRB2_CORE_HEADERS
|
|||||||
fastcmp.h
|
fastcmp.h
|
||||||
filesrch.h
|
filesrch.h
|
||||||
g_game.h
|
g_game.h
|
||||||
|
g_demo.h
|
||||||
g_input.h
|
g_input.h
|
||||||
g_state.h
|
g_state.h
|
||||||
hu_stuff.h
|
hu_stuff.h
|
||||||
@@ -109,6 +122,7 @@ set(SRB2_CORE_HEADERS
|
|||||||
md5.h
|
md5.h
|
||||||
mserv.h
|
mserv.h
|
||||||
qs22j.h
|
qs22j.h
|
||||||
|
r_skins.h
|
||||||
s_sound.h
|
s_sound.h
|
||||||
screen.h
|
screen.h
|
||||||
sounds.h
|
sounds.h
|
||||||
@@ -123,18 +137,18 @@ set(SRB2_CORE_HEADERS
|
|||||||
)
|
)
|
||||||
|
|
||||||
set(SRB2_CORE_RENDER_SOURCES
|
set(SRB2_CORE_RENDER_SOURCES
|
||||||
r_bsp.c
|
r_bsp.cpp
|
||||||
r_data.c
|
r_data.c
|
||||||
r_draw.c
|
r_draw.cpp
|
||||||
r_fps.c
|
r_fps.cpp
|
||||||
r_main.c
|
r_main.cpp
|
||||||
r_patch.c
|
r_patch.cpp
|
||||||
r_patchrotation.c
|
r_patchrotation.cpp
|
||||||
r_plane.c
|
r_plane.cpp
|
||||||
r_segs.c
|
r_segs.cpp
|
||||||
r_sky.c
|
r_sky.c
|
||||||
r_splats.c
|
r_splats.c
|
||||||
r_things.c
|
r_things.cpp
|
||||||
r_portal.c
|
r_portal.c
|
||||||
|
|
||||||
r_bsp.h
|
r_bsp.h
|
||||||
@@ -162,7 +176,7 @@ set(SRB2_CORE_GAME_SOURCES
|
|||||||
p_inter.c
|
p_inter.c
|
||||||
p_lights.c
|
p_lights.c
|
||||||
p_map.c
|
p_map.c
|
||||||
p_maputl.c
|
p_maputl.cpp
|
||||||
p_mobj.c
|
p_mobj.c
|
||||||
p_polyobj.c
|
p_polyobj.c
|
||||||
p_saveg.c
|
p_saveg.c
|
||||||
@@ -177,6 +191,7 @@ set(SRB2_CORE_GAME_SOURCES
|
|||||||
k_kart.c
|
k_kart.c
|
||||||
k_stats.c
|
k_stats.c
|
||||||
i_time.c
|
i_time.c
|
||||||
|
i_threads.c
|
||||||
|
|
||||||
p_local.h
|
p_local.h
|
||||||
p_maputl.h
|
p_maputl.h
|
||||||
@@ -193,10 +208,6 @@ set(SRB2_CORE_GAME_SOURCES
|
|||||||
k_stats.h
|
k_stats.h
|
||||||
)
|
)
|
||||||
|
|
||||||
if(NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
|
|
||||||
set(SRB2_CORE_SOURCES ${SRB2_CORE_SOURCES} string.c)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
prepend_sources(SRB2_CORE_SOURCES)
|
prepend_sources(SRB2_CORE_SOURCES)
|
||||||
prepend_sources(SRB2_CORE_HEADERS)
|
prepend_sources(SRB2_CORE_HEADERS)
|
||||||
prepend_sources(SRB2_CORE_RENDER_SOURCES)
|
prepend_sources(SRB2_CORE_RENDER_SOURCES)
|
||||||
@@ -226,10 +237,23 @@ set(SRB2_CONFIG_HWRENDER ON CACHE BOOL
|
|||||||
"Enable hardware rendering through OpenGL.")
|
"Enable hardware rendering through OpenGL.")
|
||||||
set(SRB2_CONFIG_STATIC_OPENGL OFF CACHE BOOL
|
set(SRB2_CONFIG_STATIC_OPENGL OFF CACHE BOOL
|
||||||
"Use statically linked OpenGL. NOT RECOMMENDED.")
|
"Use statically linked OpenGL. NOT RECOMMENDED.")
|
||||||
set(SRB2_CONFIG_USE_FBO_OGL ON CACHE BOOL
|
|
||||||
"Enable OpenGL FBO Downsampling support.")
|
|
||||||
set(SRB2_CONFIG_DEDICATED OFF CACHE BOOL
|
set(SRB2_CONFIG_DEDICATED OFF CACHE BOOL
|
||||||
"Build a dedicated server.")
|
"Build a dedicated server.")
|
||||||
|
set(SRB2_CONFIG_LIBBACKTRACE ON CACHE BOOL
|
||||||
|
"Enable using libbacktrace for crashlogs.")
|
||||||
|
set(SRB2_CONFIG_LTO ON CACHE BOOL
|
||||||
|
"Enable link time optimizations, improves performance at the cost of longer link times.")
|
||||||
|
set(SRB2_CONFIG_ASAN OFF CACHE BOOL
|
||||||
|
"Compile with AddressSanitizer (libasan).")
|
||||||
|
set(SRB2_CONFIG_UBSAN OFF CACHE BOOL
|
||||||
|
"Compile with UndefinedBehaviorSanitizer (libubsan).")
|
||||||
|
|
||||||
|
set(SRB2_CONFIG_SATURNPAK ON CACHE BOOL
|
||||||
|
"Enable Saturn specific special packet. Required for using the newer resynch system")
|
||||||
|
set(SRB2_CONFIG_SATURNJOIN ON CACHE BOOL
|
||||||
|
"Enable Saturn specific allowjoin toggle.")
|
||||||
|
set(SRB2_CONFIG_SCREENFBO ON CACHE BOOL
|
||||||
|
"Enable hardware renderer (OpenGL) FBO downsampling support")
|
||||||
|
|
||||||
if(${SRB2_CONFIG_DEDICATED})
|
if(${SRB2_CONFIG_DEDICATED})
|
||||||
set(SRB2_CONFIG_HAVE_GME NO)
|
set(SRB2_CONFIG_HAVE_GME NO)
|
||||||
@@ -469,16 +493,36 @@ if(${SRB2_CONFIG_HAVE_CURL})
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(${SRB2_CONFIG_LIBBACKTRACE})
|
||||||
|
if(${SRB2_CONFIG_USE_INTERNAL_LIBRARIES})
|
||||||
|
if(${SRB2_SYSTEM_BITS} EQUAL 64)
|
||||||
|
set(LIBBACKTRACE_FOUND ON)
|
||||||
|
set(LIBBACKTRACE_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/libs/libbacktrace/include)
|
||||||
|
set(LIBBACKTRACE_LIBRARIES "-L${CMAKE_SOURCE_DIR}/libs/libbacktrace/lib/x86_64 -lbacktrace")
|
||||||
|
else() # 32-bit
|
||||||
|
message(WARNING "libbacktrace is unsupported on 32-bit builds.")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
find_package(libbacktrace)
|
||||||
|
endif()
|
||||||
|
if(${LIBBACKTRACE_FOUND})
|
||||||
|
set(SRB2_HAVE_LIBBACKTRACE ON)
|
||||||
|
add_definitions(-DHAVE_LIBBACKTRACE)
|
||||||
|
else()
|
||||||
|
message(WARNING "You have specified that libbacktrace is available but it was not found.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
if(${SRB2_CONFIG_HWRENDER})
|
if(${SRB2_CONFIG_HWRENDER})
|
||||||
add_definitions(-DHWRENDER)
|
add_definitions(-DHWRENDER)
|
||||||
set(SRB2_HWRENDER_SOURCES
|
set(SRB2_HWRENDER_SOURCES
|
||||||
${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.c
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_cache.cpp
|
||||||
${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.c
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_main.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_portal.c
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_portal.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md2.c
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md2.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md2load.c
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md2load.c
|
||||||
@@ -493,7 +537,6 @@ if(${SRB2_CONFIG_HWRENDER})
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_clip.h
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_clip.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_data.h
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_data.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_defs.h
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_defs.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_dll.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_gl.h
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_gl.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_glob.h
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_glob.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_main.h
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_main.h
|
||||||
@@ -512,7 +555,6 @@ if(${SRB2_CONFIG_HWRENDER})
|
|||||||
set(SRB2_R_OPENGL_HEADERS
|
set(SRB2_R_OPENGL_HEADERS
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/r_opengl/r_opengl.h
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/r_opengl/r_opengl.h
|
||||||
)
|
)
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(${SRB2_CONFIG_HWRENDER} AND ${SRB2_CONFIG_STATIC_OPENGL})
|
if(${SRB2_CONFIG_HWRENDER} AND ${SRB2_CONFIG_STATIC_OPENGL})
|
||||||
@@ -525,25 +567,40 @@ if(${SRB2_CONFIG_HWRENDER} AND ${SRB2_CONFIG_STATIC_OPENGL})
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(${SRB2_CONFIG_HWRENDER})
|
if(${SRB2_CONFIG_HWRENDER} AND ${SRB2_CONFIG_SCREENFBO})
|
||||||
if(${SRB2_CONFIG_USE_FBO_OGL})
|
add_definitions(-DUSE_FBO_OGL)
|
||||||
set(SRB2_USE_FBO_OGL ON)
|
endif()
|
||||||
add_definitions(-DUSE_FBO_OGL)
|
|
||||||
endif()
|
if(${SRB2_CONFIG_SATURNPAK})
|
||||||
|
add_definitions(-DDOSATURNPAK)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(${SRB2_CONFIG_SATURNJOIN})
|
||||||
|
add_definitions(-DDOSATURNJOIN)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Targets
|
# Targets
|
||||||
|
|
||||||
# Compatibility flag with later versions of GCC
|
# Compatibility flag with later versions of GCC
|
||||||
# We should really fix our code to not need this
|
# We should really fix our code to not need this
|
||||||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
||||||
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -mno-ms-bitfields)
|
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|x64|amd64|AMD64|em64t|EM64T)")
|
||||||
|
add_compile_options(-mno-ms-bitfields)
|
||||||
|
endif()
|
||||||
|
add_compile_options(-Wno-trigraphs)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
# TODO: fix prng and P_CreateBlockmap overflow at some point
|
||||||
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -Wno-absolute-value)
|
add_compile_options(-fwrapv)
|
||||||
|
|
||||||
|
if (${CMAKE_BUILD_TYPE} MATCHES Debug)
|
||||||
|
add_compile_options(-O0)
|
||||||
|
else()
|
||||||
|
add_compile_options(-O3)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_compile_options(-g)
|
||||||
|
|
||||||
add_definitions(-DCMAKECONFIG)
|
add_definitions(-DCMAKECONFIG)
|
||||||
|
|
||||||
#add_library(SRB2Core STATIC
|
#add_library(SRB2Core STATIC
|
||||||
|
|||||||
@@ -8,11 +8,6 @@ ifdef MINGW
|
|||||||
libs+=-mconsole
|
libs+=-mconsole
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifndef NOTHREADS
|
|
||||||
opts+=-DHAVE_THREADS
|
|
||||||
sources+=dedicated/i_threads.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
NOOPENMPT=1
|
NOOPENMPT=1
|
||||||
NOLIBGME=1
|
NOLIBGME=1
|
||||||
NOHW=1
|
NOHW=1
|
||||||
|
|||||||
@@ -64,9 +64,9 @@ endif
|
|||||||
|
|
||||||
# This must have high to low order.
|
# This must have high to low order.
|
||||||
gcc_versions:=\
|
gcc_versions:=\
|
||||||
151 150 15\
|
152 151 150 15\
|
||||||
142 141 140 14\
|
142 141 140 14\
|
||||||
132 131 130 13\
|
133 132 131 130 13\
|
||||||
123 122 121 120 12\
|
123 122 121 120 12\
|
||||||
114 113 112 111 110 11\
|
114 113 112 111 110 11\
|
||||||
105 104 103 102 101 100 10\
|
105 104 103 102 101 100 10\
|
||||||
@@ -77,7 +77,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.1.1
|
latest_gcc_version:=15.2
|
||||||
|
|
||||||
# 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
|
||||||
|
|||||||
@@ -27,6 +27,11 @@ endif
|
|||||||
sources+=$(call List,hardware/Sourcefile)
|
sources+=$(call List,hardware/Sourcefile)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifndef NOTHREADS
|
||||||
|
opts+=-DHAVE_THREADS
|
||||||
|
sources+=i_threads.c
|
||||||
|
endif
|
||||||
|
|
||||||
ifndef NOMD5
|
ifndef NOMD5
|
||||||
sources+=md5.c
|
sources+=md5.c
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ sources+=sdl/ogl_sdl.c
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef NOMIXER
|
ifdef NOMIXER
|
||||||
sources+=sdl/sdl_sound.c
|
sources+=sdl/dummy_sound.c
|
||||||
else
|
else
|
||||||
opts+=-DHAVE_MIXER
|
opts+=-DHAVE_MIXER
|
||||||
sources+=sdl/mixer_sound.c
|
sources+=sdl/mixer_sound.c
|
||||||
@@ -40,11 +40,6 @@ sources+=sdl/mixer_sound.c
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifndef NOTHREADS
|
|
||||||
opts+=-DHAVE_THREADS
|
|
||||||
sources+=sdl/i_threads.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef SDL_PKGCONFIG
|
ifdef SDL_PKGCONFIG
|
||||||
$(eval $(call Use_pkg_config,SDL))
|
$(eval $(call Use_pkg_config,SDL))
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -20,7 +20,10 @@ $(foreach v,$(join $(wordlist 2,$(_n),- $(gcc_versions)),\
|
|||||||
CXXFLAGS+= -Wno-aggregate-return
|
CXXFLAGS+= -Wno-aggregate-return
|
||||||
|
|
||||||
# -W -Wno-unused
|
# -W -Wno-unused
|
||||||
WFLAGS:=-Wall -Wno-trigraphs
|
WFLAGS:=-Wall -Wno-trigraphs -Wnull-dereference
|
||||||
|
ifdef GCC152
|
||||||
|
WFLAGS+=-Wzero-as-null-pointer-constant
|
||||||
|
endif
|
||||||
ifndef GCC295
|
ifndef GCC295
|
||||||
#WFLAGS+=-Wno-packed
|
#WFLAGS+=-Wno-packed
|
||||||
endif
|
endif
|
||||||
|
|||||||
+4
-4
@@ -1,3 +1,4 @@
|
|||||||
|
string.c
|
||||||
am_map.c
|
am_map.c
|
||||||
b_bot.c
|
b_bot.c
|
||||||
command.c
|
command.c
|
||||||
@@ -42,19 +43,18 @@ s_sound.c
|
|||||||
screen.c
|
screen.c
|
||||||
sounds.c
|
sounds.c
|
||||||
st_stuff.c
|
st_stuff.c
|
||||||
string.c
|
|
||||||
tables.c
|
tables.c
|
||||||
v_video.c
|
v_video.c
|
||||||
w_wad.c
|
w_wad.c
|
||||||
y_inter.c
|
y_inter.c
|
||||||
z_zone.cpp
|
z_zone.cpp
|
||||||
r_bsp.c
|
r_bsp.cpp
|
||||||
r_data.c
|
r_data.c
|
||||||
r_draw.c
|
r_draw.cpp
|
||||||
r_fps.cpp
|
r_fps.cpp
|
||||||
r_main.cpp
|
r_main.cpp
|
||||||
r_patch.cpp
|
r_patch.cpp
|
||||||
r_patchrotation.c
|
r_patchrotation.cpp
|
||||||
r_plane.cpp
|
r_plane.cpp
|
||||||
r_segs.cpp
|
r_segs.cpp
|
||||||
r_skins.c
|
r_skins.c
|
||||||
|
|||||||
@@ -226,10 +226,6 @@ const char *I_LocateWad(void)
|
|||||||
return "/sdcard/srb2";
|
return "/sdcard/srb2";
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_GetJoystickEvents(void){}
|
|
||||||
|
|
||||||
void I_GetJoystick2Events(void){}
|
|
||||||
|
|
||||||
char *I_GetEnv(const char *name)
|
char *I_GetEnv(const char *name)
|
||||||
{
|
{
|
||||||
LOGW("I_GetEnv() called?!");
|
LOGW("I_GetEnv() called?!");
|
||||||
|
|||||||
+2
-12
@@ -50,25 +50,15 @@ const char *VID_GetModeName(INT32 modenum)
|
|||||||
return "A320x240";
|
return "A320x240";
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_UpdateNoBlit(void){}
|
void I_FinishUpdate(void)
|
||||||
|
{
|
||||||
void I_FinishUpdate(void) {
|
|
||||||
LOGD("FRAME!");
|
LOGD("FRAME!");
|
||||||
(*jni_env)->CallVoidMethod(jni_env, androidVideo, videoFrameCB);
|
(*jni_env)->CallVoidMethod(jni_env, androidVideo, videoFrameCB);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_UpdateNoVsync(void) {}
|
void I_UpdateNoVsync(void) {}
|
||||||
|
|
||||||
void I_WaitVBL(INT32 count)
|
|
||||||
{
|
|
||||||
(void)count;
|
|
||||||
}
|
|
||||||
|
|
||||||
void I_ReadScreen(UINT8 * restrict scr, INT32 scale)
|
void I_ReadScreen(UINT8 * restrict scr, INT32 scale)
|
||||||
{
|
{
|
||||||
(void)scr;
|
(void)scr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_BeginRead(void){}
|
|
||||||
|
|
||||||
void I_EndRead(void){}
|
|
||||||
+11
-11
@@ -47,7 +47,7 @@ static inline void B_BuildTailsTiccmd(mobj_t *sonic, mobj_t *tails, ticcmd_t *cm
|
|||||||
if (sonic->player->pflags & (PF_MACESPIN|PF_ITEMHANG))
|
if (sonic->player->pflags & (PF_MACESPIN|PF_ITEMHANG))
|
||||||
{
|
{
|
||||||
cmd->forwardmove = sonic->player->cmd.forwardmove;
|
cmd->forwardmove = sonic->player->cmd.forwardmove;
|
||||||
cmd->angleturn = abs((signed)(tails->angle - sonic->angle))>>16;
|
cmd->angleturn = abs((signed)(tails->angle - sonic->angle)) >> TICCMD_REDUCE;
|
||||||
if (sonic->angle < tails->angle)
|
if (sonic->angle < tails->angle)
|
||||||
cmd->angleturn = -cmd->angleturn;
|
cmd->angleturn = -cmd->angleturn;
|
||||||
} else if (dist > FixedMul(512*FRACUNIT, tails->scale))
|
} else if (dist > FixedMul(512*FRACUNIT, tails->scale))
|
||||||
@@ -139,13 +139,13 @@ void B_KeysToTiccmd(mobj_t *mo, ticcmd_t *cmd, boolean forward, boolean backward
|
|||||||
// Don't mess with bot inputs during these unhandled movement conditions.
|
// Don't mess with bot inputs during these unhandled movement conditions.
|
||||||
// The normal AI doesn't use abilities, so custom AI should be sending us exactly what it wants anyway.
|
// The normal AI doesn't use abilities, so custom AI should be sending us exactly what it wants anyway.
|
||||||
if (forward)
|
if (forward)
|
||||||
cmd->forwardmove += MAXPLMOVE<<FRACBITS>>16;
|
cmd->forwardmove += MAXPLMOVE << FRACBITS >> TICCMD_REDUCE;
|
||||||
if (backward)
|
if (backward)
|
||||||
cmd->forwardmove -= MAXPLMOVE<<FRACBITS>>16;
|
cmd->forwardmove -= MAXPLMOVE<<FRACBITS >> TICCMD_REDUCE;
|
||||||
if (left || strafeleft)
|
if (left || strafeleft)
|
||||||
cmd->sidemove -= MAXPLMOVE<<FRACBITS>>16;
|
cmd->sidemove -= MAXPLMOVE << FRACBITS >> TICCMD_REDUCE;
|
||||||
if (right || straferight)
|
if (right || straferight)
|
||||||
cmd->sidemove += MAXPLMOVE<<FRACBITS>>16;
|
cmd->sidemove += MAXPLMOVE << FRACBITS >> TICCMD_REDUCE;
|
||||||
} else {
|
} else {
|
||||||
// In standard 2D mode, interpret "forward" as "the way you're facing" and everything else as "the way you're not facing"
|
// In standard 2D mode, interpret "forward" as "the way you're facing" and everything else as "the way you're not facing"
|
||||||
if (left || right)
|
if (left || right)
|
||||||
@@ -163,23 +163,23 @@ void B_KeysToTiccmd(mobj_t *mo, ticcmd_t *cmd, boolean forward, boolean backward
|
|||||||
right = true;
|
right = true;
|
||||||
}
|
}
|
||||||
if (left || strafeleft)
|
if (left || strafeleft)
|
||||||
cmd->sidemove -= MAXPLMOVE<<FRACBITS>>16;
|
cmd->sidemove -= MAXPLMOVE << FRACBITS >> TICCMD_REDUCE;
|
||||||
if (right || straferight)
|
if (right || straferight)
|
||||||
cmd->sidemove += MAXPLMOVE<<FRACBITS>>16;
|
cmd->sidemove += MAXPLMOVE << FRACBITS >> TICCMD_REDUCE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (forward)
|
if (forward)
|
||||||
cmd->forwardmove += MAXPLMOVE<<FRACBITS>>16;
|
cmd->forwardmove += MAXPLMOVE << FRACBITS >> TICCMD_REDUCE;
|
||||||
if (backward)
|
if (backward)
|
||||||
cmd->forwardmove -= MAXPLMOVE<<FRACBITS>>16;
|
cmd->forwardmove -= MAXPLMOVE << FRACBITS >> TICCMD_REDUCE;
|
||||||
if (left)
|
if (left)
|
||||||
cmd->angleturn += 1280;
|
cmd->angleturn += 1280;
|
||||||
if (right)
|
if (right)
|
||||||
cmd->angleturn -= 1280;
|
cmd->angleturn -= 1280;
|
||||||
if (strafeleft)
|
if (strafeleft)
|
||||||
cmd->sidemove -= MAXPLMOVE<<FRACBITS>>16;
|
cmd->sidemove -= MAXPLMOVE << FRACBITS >> TICCMD_REDUCE;
|
||||||
if (straferight)
|
if (straferight)
|
||||||
cmd->sidemove += MAXPLMOVE<<FRACBITS>>16;
|
cmd->sidemove += MAXPLMOVE << FRACBITS >> TICCMD_REDUCE;
|
||||||
}
|
}
|
||||||
if (jump)
|
if (jump)
|
||||||
cmd->buttons |= BT_DRIFT;
|
cmd->buttons |= BT_DRIFT;
|
||||||
|
|||||||
@@ -93,6 +93,57 @@ LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {
|
|||||||
/* }====================================================== */
|
/* }====================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** {======================================================
|
||||||
|
** 'luaL_resourcetryagain'
|
||||||
|
** This function uses 'errno' to check whether the last error was
|
||||||
|
** related to lack of resources (e.g., not enough memory or too many
|
||||||
|
** open files). If so, the function performs a full garbage collection
|
||||||
|
** to try to release resources, and then it returns 1 to signal to
|
||||||
|
** the caller that it is worth trying again the failed operation.
|
||||||
|
** Otherwise, it returns 0. Because error codes are not ANSI C, the
|
||||||
|
** code must handle any combination of error codes that are defined.
|
||||||
|
** =======================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
LUALIB_API int luaL_resourcetryagain (lua_State *L) {
|
||||||
|
|
||||||
|
/* these are the resource-related errors in Linux */
|
||||||
|
#if defined(EMFILE) || defined(ENFILE) || defined(ENOMEM)
|
||||||
|
|
||||||
|
#if !defined(EMFILE) /* too many open files in the process */
|
||||||
|
#define EMFILE -1 /* if not defined, use an impossible value */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ENFILE) /* too many open files in the system */
|
||||||
|
#define ENFILE -1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ENOMEM) /* not enough memory */
|
||||||
|
#define ENOMEM -1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (errno == EMFILE || errno == ENFILE || errno == ENOMEM) {
|
||||||
|
CONS_Alert(CONS_WARNING, "%s, force calling lua garbage collector\n", strerror(errno));
|
||||||
|
lua_gc(L, LUA_GCCOLLECT, 0); /* try to release resources with a full GC */
|
||||||
|
return 1; /* signal to try again the creation */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0; /* else, asume errors are not due to lack of resources */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* }====================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** {======================================================
|
||||||
|
** Userdata's metatable manipulation
|
||||||
|
** =======================================================
|
||||||
|
*/
|
||||||
|
|
||||||
LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def,
|
LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def,
|
||||||
const char *const lst[]) {
|
const char *const lst[]) {
|
||||||
const char *name = (def) ? luaL_optstring(L, narg, def) :
|
const char *name = (def) ? luaL_optstring(L, narg, def) :
|
||||||
|
|||||||
@@ -95,6 +95,8 @@ LUALIB_API FUNCREPORT int (luaL_error) (lua_State *L, const char *fmt, ...);
|
|||||||
LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,
|
LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,
|
||||||
const char *const lst[]);
|
const char *const lst[]);
|
||||||
|
|
||||||
|
LUALIB_API int (luaL_resourcetryagain) (lua_State *L);
|
||||||
|
|
||||||
LUALIB_API int (luaL_ref) (lua_State *L, int t);
|
LUALIB_API int (luaL_ref) (lua_State *L, int t);
|
||||||
LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);
|
LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);
|
||||||
|
|
||||||
|
|||||||
+23
-15
@@ -58,12 +58,6 @@ static int pushresult (lua_State *L, int i, const char *filename) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void fileerror (lua_State *L, int arg, const char *filename) {
|
|
||||||
lua_pushfstring(L, "%s: %s", filename, strerror(errno));
|
|
||||||
luaL_argerror(L, arg, lua_tostring(L, -1));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define tofilep(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE))
|
#define tofilep(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE))
|
||||||
|
|
||||||
|
|
||||||
@@ -165,6 +159,24 @@ static int StartsWith(const char *a, const char *b) // this is wolfs being lazy
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Equivalent to 'fopen', but if it fails due to a lack of resources
|
||||||
|
** (see 'luaL_resourcetryagain'), do an "emergency" garbage collection to try
|
||||||
|
** to close some files and then tries to open the file again.
|
||||||
|
*/
|
||||||
|
static FILE *trytoopen (lua_State *L, const char *path, const char *mode) {
|
||||||
|
FILE *f = fopen(path, mode);
|
||||||
|
if (f == NULL && luaL_resourcetryagain(L)) /* resource failure? */
|
||||||
|
f = fopen(path, mode); /* try to open again */
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void opencheck (lua_State *L, const char *fname, const char *mode) {
|
||||||
|
FILE **p = newfile(L);
|
||||||
|
*p = trytoopen(L, fname, mode);
|
||||||
|
if (l_unlikely(*p == NULL))
|
||||||
|
luaL_error(L, "cannot open file '%s' (%s)", fname, strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
static int io_open(lua_State *L)
|
static int io_open(lua_State *L)
|
||||||
{
|
{
|
||||||
@@ -212,7 +224,7 @@ static int io_open(lua_State *L)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pf = newfile(L);
|
pf = newfile(L);
|
||||||
*pf = fopen(destFilename, mode);
|
*pf = trytoopen(L, destFilename, mode);
|
||||||
return (*pf == NULL) ? pushresult(L, 0, filename) : 1;
|
return (*pf == NULL) ? pushresult(L, 0, filename) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,6 +232,8 @@ static int io_open(lua_State *L)
|
|||||||
static int io_tmpfile (lua_State *L) {
|
static int io_tmpfile (lua_State *L) {
|
||||||
FILE **pf = newfile(L);
|
FILE **pf = newfile(L);
|
||||||
*pf = tmpfile();
|
*pf = tmpfile();
|
||||||
|
if (*pf == NULL && luaL_resourcetryagain(L)) /* resource failure? */
|
||||||
|
*pf = tmpfile(); /* try to open again */
|
||||||
return (*pf == NULL) ? pushresult(L, 0, NULL) : 1;
|
return (*pf == NULL) ? pushresult(L, 0, NULL) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,10 +252,7 @@ static int g_iofile (lua_State *L, int f, const char *mode) {
|
|||||||
if (!lua_isnoneornil(L, 1)) {
|
if (!lua_isnoneornil(L, 1)) {
|
||||||
const char *filename = lua_tostring(L, 1);
|
const char *filename = lua_tostring(L, 1);
|
||||||
if (filename) {
|
if (filename) {
|
||||||
FILE **pf = newfile(L);
|
opencheck(L, filename, mode);
|
||||||
*pf = fopen(filename, mode);
|
|
||||||
if (l_unlikely(*pf == NULL))
|
|
||||||
fileerror(L, 1, filename);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tofile(L); /* check that it's a valid file handle */
|
tofile(L); /* check that it's a valid file handle */
|
||||||
@@ -290,10 +301,7 @@ static int io_lines (lua_State *L) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const char *filename = luaL_checkstring(L, 1);
|
const char *filename = luaL_checkstring(L, 1);
|
||||||
FILE **pf = newfile(L);
|
opencheck(L, filename, "r");
|
||||||
*pf = fopen(filename, "r");
|
|
||||||
if (l_unlikely(*pf == NULL))
|
|
||||||
fileerror(L, 1, filename);
|
|
||||||
aux_lines(L, lua_gettop(L), 1);
|
aux_lines(L, lua_gettop(L), 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -527,7 +527,7 @@ static int str_find_aux (lua_State *L, int find) {
|
|||||||
if (find) {
|
if (find) {
|
||||||
lua_pushinteger(L, s1-s+1); /* start */
|
lua_pushinteger(L, s1-s+1); /* start */
|
||||||
lua_pushinteger(L, res-s); /* end */
|
lua_pushinteger(L, res-s); /* end */
|
||||||
return push_captures(&ms, NULL, 0) + 2;
|
return push_captures(&ms, NULL, NULL) + 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return push_captures(&ms, s1, res);
|
return push_captures(&ms, s1, res);
|
||||||
|
|||||||
+3
-3
@@ -772,10 +772,10 @@ union luai_Cast { double l_d; long l_l; };
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
#define l_likely(x) (__builtin_expect(((x) != 0), 1))
|
#define l_likely(x) (__builtin_expect(!!(x), 1))
|
||||||
#define l_unlikely(x) (__builtin_expect(((x) != 0), 0))
|
#define l_unlikely(x) (__builtin_expect(!!(x), 0))
|
||||||
#else
|
#else
|
||||||
#define l_likely(x) (x)
|
#define l_likely(x) (x)
|
||||||
#define l_unlikely(x) (x)
|
#define l_unlikely(x) (x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+8
-6
@@ -57,7 +57,6 @@ static void CV_EnforceExecVersion(void);
|
|||||||
static boolean CV_FilterVarByVersion(consvar_t *v, const char *valstr);
|
static boolean CV_FilterVarByVersion(consvar_t *v, const char *valstr);
|
||||||
|
|
||||||
static boolean CV_Command(void);
|
static boolean CV_Command(void);
|
||||||
consvar_t *CV_FindVar(const char *name);
|
|
||||||
static const char *CV_StringValue(const char *var_name);
|
static const char *CV_StringValue(const char *var_name);
|
||||||
static consvar_t *consvar_vars; // list of registered console variables
|
static consvar_t *consvar_vars; // list of registered console variables
|
||||||
|
|
||||||
@@ -238,10 +237,13 @@ void COM_ImmedExecute(const char *ptext)
|
|||||||
char line[1024] = "";
|
char line[1024] = "";
|
||||||
INT32 quotes;
|
INT32 quotes;
|
||||||
|
|
||||||
while (i < strlen(ptext))
|
const size_t txtlength = strlen(ptext);
|
||||||
|
|
||||||
|
while (i < txtlength)
|
||||||
{
|
{
|
||||||
quotes = 0;
|
quotes = 0;
|
||||||
for (j = 0; i < strlen(ptext); i++,j++)
|
|
||||||
|
for (j = 0; i < txtlength; i++,j++)
|
||||||
{
|
{
|
||||||
if (ptext[i] == '\"' && !quotes && i > 0 && ptext[i-1] != ' ') // Malformed command
|
if (ptext[i] == '\"' && !quotes && i > 0 && ptext[i-1] != ' ') // Malformed command
|
||||||
return;
|
return;
|
||||||
@@ -277,7 +279,7 @@ static xcommand_t *com_commands = NULL; // current commands
|
|||||||
|
|
||||||
#define MAX_ARGS 80
|
#define MAX_ARGS 80
|
||||||
static size_t com_argc;
|
static size_t com_argc;
|
||||||
char *com_argv[MAX_ARGS];
|
char *com_argv[MAX_ARGS] = {};
|
||||||
static const char *com_null_string = "";
|
static const char *com_null_string = "";
|
||||||
static char *com_args = NULL; // current command args or NULL
|
static char *com_args = NULL; // current command args or NULL
|
||||||
|
|
||||||
@@ -653,7 +655,7 @@ static void COM_Alias_f(void)
|
|||||||
CONS_Printf(M_GetText("All aliases that start with \x87'%s'\x80 are:\n"), begin);
|
CONS_Printf(M_GetText("All aliases that start with \x87'%s'\x80 are:\n"), begin);
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (cmdalias_t *head = com_alias; head->next != NULL; head = head->next)
|
for (cmdalias_t *head = com_alias; head != NULL; head = head->next)
|
||||||
{
|
{
|
||||||
if (strncmp(begin, head->name, szBegin) == 0)
|
if (strncmp(begin, head->name, szBegin) == 0)
|
||||||
{
|
{
|
||||||
@@ -674,7 +676,7 @@ static void COM_Alias_f(void)
|
|||||||
/* Display alias subtext, show all aliases. */
|
/* Display alias subtext, show all aliases. */
|
||||||
CONS_Printf(M_GetText("alias <name> <command>: create a shortcut command that executes other command(s)\n"));
|
CONS_Printf(M_GetText("alias <name> <command>: create a shortcut command that executes other command(s)\n"));
|
||||||
|
|
||||||
for (cmdalias_t *head = com_alias; head->next != NULL; head = head->next)
|
for (cmdalias_t *head = com_alias; head != NULL; head = head->next)
|
||||||
{
|
{
|
||||||
CONS_Printf(alias_format, head->name, head->value);
|
CONS_Printf(alias_format, head->name, head->value);
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -13,13 +13,13 @@
|
|||||||
#ifndef __COMMAND_H__
|
#ifndef __COMMAND_H__
|
||||||
#define __COMMAND_H__
|
#define __COMMAND_H__
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "doomdef.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "doomdef.h"
|
|
||||||
|
|
||||||
//===================================
|
//===================================
|
||||||
// Command buffer & command execution
|
// Command buffer & command execution
|
||||||
//===================================
|
//===================================
|
||||||
|
|||||||
+3
-38
@@ -11,21 +11,6 @@
|
|||||||
|
|
||||||
#ifdef CMAKECONFIG
|
#ifdef CMAKECONFIG
|
||||||
|
|
||||||
// Base SRB2 hashes
|
|
||||||
#define ASSET_HASH_SRB2_SRB "${SRB2_ASSET_srb2.srb_HASH}"
|
|
||||||
#ifdef USE_PATCH_DTA
|
|
||||||
#define ASSET_HASH_PATCH_DTA "${SRB2_ASSET_patch.dta_HASH}"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// SRB2Kart-specific hashes
|
|
||||||
#define ASSET_HASH_GFX_KART "${SRB2_ASSET_gfx.kart_HASH}"
|
|
||||||
#define ASSET_HASH_TEXTURES_KART "${SRB2_ASSET_textures.kart_HASH}"
|
|
||||||
#define ASSET_HASH_CHARS_KART "${SRB2_ASSET_chars.kart_HASH}"
|
|
||||||
#define ASSET_HASH_MAPS_KART "${SRB2_ASSET_maps.kart_HASH}"
|
|
||||||
#ifdef USE_PATCH_KART
|
|
||||||
#define ASSET_HASH_PATCH_KART "00000000000000000000000000000000"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SRB2_COMP_REVISION "${SRB2_COMP_REVISION}"
|
#define SRB2_COMP_REVISION "${SRB2_COMP_REVISION}"
|
||||||
#define SRB2_COMP_BRANCH "${SRB2_COMP_BRANCH}"
|
#define SRB2_COMP_BRANCH "${SRB2_COMP_BRANCH}"
|
||||||
|
|
||||||
@@ -33,30 +18,10 @@
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* Manually defined asset hashes for non-CMake builds
|
#define SRB2_COMP_REVISION ""
|
||||||
* Last updated 2015 / 05 / 03 - SRB2 v2.1.15 - srb2.srb
|
#define SRB2_COMP_BRANCH ""
|
||||||
* Last updated 2018 / 12 / 23 - SRB2 v2.1.22 - patch.dta
|
|
||||||
* Last updated 2019 / 01 / 18 - Kart v1.0.2 - Main assets
|
|
||||||
* Last updated 2020 / 08 / 30 - Kart v1.3 - patch.kart
|
|
||||||
* Last updated 2022 / 08 / 16 - Kart v1.4 - Main assets
|
|
||||||
* Last updated 2022 / 08 / 19 - Kart v1.5 - gfx.kart
|
|
||||||
* Last updated 2022 / 11 / 01 - Kart v1.6 - gfx.kart, maps.kart
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Base SRB2 hashes
|
#define CMAKE_ASSETS_DIR ""
|
||||||
#define ASSET_HASH_SRB2_SRB "c1b9577687f8a795104aef4600720ea7"
|
|
||||||
#ifdef USE_PATCH_DTA
|
|
||||||
#define ASSET_HASH_PATCH_DTA "b04fd9624bfd94dc96dcf4f400f7deb4"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// SRB2Kart-specific hashes
|
|
||||||
#define ASSET_HASH_GFX_KART "06f86ee16136eb8a7043b15001797034"
|
|
||||||
#define ASSET_HASH_TEXTURES_KART "abb53d56aba47c3a8cb0f764da1c8b80"
|
|
||||||
#define ASSET_HASH_CHARS_KART "e2c428347dde52858a3dacd29fc5b964"
|
|
||||||
#define ASSET_HASH_MAPS_KART "d051e55141ba736582228c456953cd98"
|
|
||||||
#ifdef USE_PATCH_KART
|
|
||||||
#define ASSET_HASH_PATCH_KART "00000000000000000000000000000000"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
+46
-13
@@ -33,6 +33,8 @@
|
|||||||
#include "d_main.h"
|
#include "d_main.h"
|
||||||
#include "m_menu.h"
|
#include "m_menu.h"
|
||||||
#include "m_textinput.h"
|
#include "m_textinput.h"
|
||||||
|
#include "m_emotes.h"
|
||||||
|
#include "i_time.h"
|
||||||
#include "filesrch.h"
|
#include "filesrch.h"
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
@@ -42,14 +44,14 @@
|
|||||||
#define MAXHUDLINES 20
|
#define MAXHUDLINES 20
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_mutex con_mutex;
|
I_Mutex con_mutex;
|
||||||
|
|
||||||
// g_in_exiting_signal_handler is an evil hack
|
// g_in_exiting_signal_handler is an evil hack
|
||||||
// to avoid infinite SIGABRT recursion in the signal handler
|
// to avoid infinite SIGABRT recursion in the signal handler
|
||||||
// due to poisoned locks or mach-o kernel not supporting locks in signals
|
// due to poisoned locks or mach-o kernel not supporting locks in signals
|
||||||
// or something like that. idk
|
// or something like that. idk
|
||||||
# define Lock_state() if (!g_in_exiting_signal_handler) { I_lock_mutex(&con_mutex); }
|
# define Lock_state() if (!g_in_exiting_signal_handler) { I_LockMutex(&con_mutex); }
|
||||||
# define Unlock_state() if (!g_in_exiting_signal_handler) { I_unlock_mutex(con_mutex); }
|
# define Unlock_state() if (!g_in_exiting_signal_handler) { I_UnlockMutex(con_mutex); }
|
||||||
#else/*HAVE_THREADS*/
|
#else/*HAVE_THREADS*/
|
||||||
# define Lock_state()
|
# define Lock_state()
|
||||||
# define Unlock_state()
|
# define Unlock_state()
|
||||||
@@ -58,7 +60,7 @@ I_mutex con_mutex;
|
|||||||
static boolean con_started = false; // console has been initialised
|
static boolean con_started = false; // console has been initialised
|
||||||
boolean con_startup = false; // true at game startup, screen need refreshing
|
boolean con_startup = false; // true at game startup, screen need refreshing
|
||||||
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; // 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 anim or blinking prompt cursor
|
||||||
// con_scrollup should use time (currenttime - lasttime)..
|
// con_scrollup should use time (currenttime - lasttime)..
|
||||||
@@ -66,8 +68,8 @@ static tic_t con_tick; // console ticker for anim or blinking prompt cursor
|
|||||||
static boolean consoletoggle; // true when console key pushed, ticker will handle
|
static boolean consoletoggle; // true when console key pushed, ticker will handle
|
||||||
static boolean consoleready; // console prompt is ready
|
static boolean consoleready; // console prompt is ready
|
||||||
|
|
||||||
INT32 con_destlines; // vid lines used by console at final position
|
INT32 con_destlines = 0; // vid lines used by console at final position
|
||||||
static INT32 con_curlines; // vid lines currently used by console
|
static INT32 con_curlines; // vid lines currently used by console
|
||||||
|
|
||||||
static UINT8 con_hudlines; // number of console heads up message lines
|
static UINT8 con_hudlines; // number of console heads up message lines
|
||||||
static UINT32 con_hudtime[MAXHUDLINES]; // remaining time of display for hud msg lines
|
static UINT32 con_hudtime[MAXHUDLINES]; // remaining time of display for hud msg lines
|
||||||
@@ -83,7 +85,7 @@ static size_t con_totallines; // lines of console text into the console buf
|
|||||||
static size_t con_width; // columns of chars, depend on vid mode width
|
static size_t con_width; // columns of chars, depend on vid mode width
|
||||||
|
|
||||||
static size_t con_scrollup; // how many rows of text to scroll up (pgup/pgdn)
|
static size_t con_scrollup; // how many rows of text to scroll up (pgup/pgdn)
|
||||||
UINT32 con_scalefactor; // text size scale factor
|
UINT32 con_scalefactor = 0; // text size scale factor
|
||||||
|
|
||||||
// hold 32 last lines of input for history
|
// hold 32 last lines of input for history
|
||||||
#define CON_MAXPROMPTCHARS 256
|
#define CON_MAXPROMPTCHARS 256
|
||||||
@@ -167,6 +169,8 @@ static CV_PossibleValue_t menuhighlight_cons_t[] =
|
|||||||
};
|
};
|
||||||
consvar_t cons_menuhighlight = {"menuhighlight", "Gametype Default", CV_SAVE, menuhighlight_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cons_menuhighlight = {"menuhighlight", "Gametype Default", CV_SAVE, menuhighlight_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
consvar_t cons_consoleprintinmenu = {"consoleprintinmenu", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
static void CON_Print(char *msg);
|
static void CON_Print(char *msg);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -424,6 +428,7 @@ void CON_Init(void)
|
|||||||
CV_RegisterVar(&cons_backpic);
|
CV_RegisterVar(&cons_backpic);
|
||||||
CV_RegisterVar(&cons_backcolor);
|
CV_RegisterVar(&cons_backcolor);
|
||||||
CV_RegisterVar(&cons_menuhighlight);
|
CV_RegisterVar(&cons_menuhighlight);
|
||||||
|
CV_RegisterVar(&cons_consoleprintinmenu);
|
||||||
COM_AddCommand("bind", CONS_Bind_f);
|
COM_AddCommand("bind", CONS_Bind_f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -584,12 +589,18 @@ static void CON_ChangeHeight(void)
|
|||||||
|
|
||||||
// Handles Console moves in/out of screen (per frame)
|
// Handles Console moves in/out of screen (per frame)
|
||||||
//
|
//
|
||||||
static void CON_MoveConsole(void)
|
void CON_MoveConsole(void)
|
||||||
{
|
{
|
||||||
static fixed_t fracmovement = 0;
|
static fixed_t fracmovement = 0;
|
||||||
|
|
||||||
Lock_state();
|
Lock_state();
|
||||||
|
|
||||||
|
if (con_curlines == con_destlines)
|
||||||
|
{
|
||||||
|
Unlock_state();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// instant
|
// instant
|
||||||
if (!cons_speed.value)
|
if (!cons_speed.value)
|
||||||
{
|
{
|
||||||
@@ -1453,7 +1464,18 @@ static void CON_DrawHudlines(void)
|
|||||||
}
|
}
|
||||||
if (c >= con_width)
|
if (c >= con_width)
|
||||||
break;
|
break;
|
||||||
if (*p < HU_FONTSTART)
|
|
||||||
|
int emotelen;
|
||||||
|
emote_t *emote;
|
||||||
|
|
||||||
|
if ((emote = M_VerifyEmote((const char *)p, &emotelen)))
|
||||||
|
{
|
||||||
|
M_DrawScaledEmote(x<<FRACBITS, (y+2*con_scalefactor)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART|V_NOSCALEPATCH);
|
||||||
|
p += emotelen-1;
|
||||||
|
c += emotelen-1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (*p < HU_FONTSTART)
|
||||||
;//charwidth = 4 * con_scalefactor;
|
;//charwidth = 4 * con_scalefactor;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1485,7 +1507,7 @@ static void CON_DrawConsole(void)
|
|||||||
// draw console background
|
// draw console background
|
||||||
if (cons_backpic.value || con_forcepic)
|
if (cons_backpic.value || con_forcepic)
|
||||||
{
|
{
|
||||||
patch_t *con_backpic = W_CachePatchName("KARTKREW", PU_PATCH_LOWPRIORITY);
|
patch_t *con_backpic = W_CachePatchName("KARTKREW", PU_PATCH);
|
||||||
|
|
||||||
// Jimita: CON_DrawBackpic just called V_DrawScaledPatch
|
// Jimita: CON_DrawBackpic just called V_DrawScaledPatch
|
||||||
V_DrawFixedPatch(0, 0, FRACUNIT/2, 0, con_backpic, NULL);
|
V_DrawFixedPatch(0, 0, FRACUNIT/2, 0, con_backpic, NULL);
|
||||||
@@ -1527,8 +1549,20 @@ static void CON_DrawConsole(void)
|
|||||||
p++;
|
p++;
|
||||||
c++;
|
c++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c >= con_width)
|
if (c >= con_width)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
int emotelen;
|
||||||
|
emote_t *emote;
|
||||||
|
|
||||||
|
if ((emote = M_VerifyEmote((const char *)p, &emotelen)))
|
||||||
|
{
|
||||||
|
M_DrawScaledEmote(x<<FRACBITS, (y+2*con_scalefactor)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART|V_NOSCALEPATCH);
|
||||||
|
p += emotelen-1;
|
||||||
|
c += emotelen-1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1559,13 +1593,12 @@ void CON_Drawer(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// console movement
|
// console movement
|
||||||
if (con_curlines != con_destlines)
|
CON_MoveConsole();
|
||||||
CON_MoveConsole();
|
|
||||||
|
|
||||||
if (con_curlines > 0)
|
if (con_curlines > 0)
|
||||||
CON_DrawConsole();
|
CON_DrawConsole();
|
||||||
else if (gamestate == GS_LEVEL || gamestate == GS_INTERMISSION || gamestate == GS_CUTSCENE || gamestate == GS_CREDITS
|
else if (gamestate == GS_LEVEL || gamestate == GS_INTERMISSION || gamestate == GS_CUTSCENE || gamestate == GS_CREDITS
|
||||||
|| gamestate == GS_VOTING || gamestate == GS_EVALUATION || gamestate == GS_WAITINGPLAYERS)
|
|| gamestate == GS_VOTING || gamestate == GS_EVALUATION || gamestate == GS_WAITINGPLAYERS || (cons_consoleprintinmenu.value && gamestate == GS_TITLESCREEN))
|
||||||
CON_DrawHudlines();
|
CON_DrawHudlines();
|
||||||
|
|
||||||
Unlock_state();
|
Unlock_state();
|
||||||
|
|||||||
+3
-1
@@ -22,7 +22,7 @@ void CON_Init(void);
|
|||||||
boolean CON_Responder(event_t *ev);
|
boolean CON_Responder(event_t *ev);
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
extern I_mutex con_mutex;
|
extern I_Mutex con_mutex;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// set true when screen size has changed, to adapt console
|
// set true when screen size has changed, to adapt console
|
||||||
@@ -36,6 +36,7 @@ extern INT32 con_destlines;
|
|||||||
extern UINT32 con_scalefactor; // console text scale factor
|
extern UINT32 con_scalefactor; // console text scale factor
|
||||||
|
|
||||||
extern consvar_t cons_backcolor, cons_menuhighlight;
|
extern consvar_t cons_backcolor, cons_menuhighlight;
|
||||||
|
extern consvar_t cons_consoleprintinmenu;
|
||||||
|
|
||||||
extern UINT8 *yellowmap, *purplemap, *greenmap, *bluemap, *graymap, *redmap, *orangemap,\
|
extern UINT8 *yellowmap, *purplemap, *greenmap, *bluemap, *graymap, *redmap, *orangemap,\
|
||||||
*skymap, *goldmap, *lavendermap, *teamap, *steelmap, *pinkmap, *brownmap, *peachmap;
|
*skymap, *goldmap, *lavendermap, *teamap, *steelmap, *pinkmap, *brownmap, *peachmap;
|
||||||
@@ -51,6 +52,7 @@ void CON_ClearHUD(void); // clear heads up messages
|
|||||||
|
|
||||||
void CON_Ticker(void);
|
void CON_Ticker(void);
|
||||||
void CON_Drawer(void);
|
void CON_Drawer(void);
|
||||||
|
void CON_MoveConsole(void);
|
||||||
void CONS_Error(const char *msg); // print out error msg, and wait a key
|
void CONS_Error(const char *msg); // print out error msg, and wait a key
|
||||||
|
|
||||||
// force console to move out
|
// force console to move out
|
||||||
|
|||||||
+180
-108
@@ -53,6 +53,8 @@
|
|||||||
#include "m_perfstats.h"
|
#include "m_perfstats.h"
|
||||||
#include "d_main.h"
|
#include "d_main.h"
|
||||||
#include "r_fps.h"
|
#include "r_fps.h"
|
||||||
|
#include "filesrch.h" // refreshdirmenu
|
||||||
|
|
||||||
|
|
||||||
// cl loading screen
|
// cl loading screen
|
||||||
#include "v_video.h"
|
#include "v_video.h"
|
||||||
@@ -121,7 +123,7 @@ UINT32 realpingtable[MAXPLAYERS] = {}; //the base table of ping where an average
|
|||||||
UINT32 playerpingtable[MAXPLAYERS] = {}; //table of player latency values.
|
UINT32 playerpingtable[MAXPLAYERS] = {}; //table of player latency values.
|
||||||
|
|
||||||
#define GENTLEMANSMOOTHING (TICRATE)
|
#define GENTLEMANSMOOTHING (TICRATE)
|
||||||
static tic_t reference_lag;
|
static tic_t reference_lag = 0;
|
||||||
static UINT8 spike_time;
|
static UINT8 spike_time;
|
||||||
tic_t lowest_lag = 0;
|
tic_t lowest_lag = 0;
|
||||||
tic_t simulated_lag = 0;
|
tic_t simulated_lag = 0;
|
||||||
@@ -143,6 +145,11 @@ static CV_PossibleValue_t mindelay_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL
|
|||||||
consvar_t cv_mindelay = {"mindelay", "0", CV_SAVE, mindelay_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_mindelay = {"mindelay", "0", CV_SAVE, mindelay_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_gentlemens = {"gentlemensdelay", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, Lagless_OnChange, 0, NULL, NULL, 0, 0, NULL}; // this should be a netvar Zzz...
|
consvar_t cv_gentlemens = {"gentlemensdelay", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, Lagless_OnChange, 0, NULL, NULL, 0, 0, NULL}; // this should be a netvar Zzz...
|
||||||
|
|
||||||
|
// allows a fake player to appear on the ms and serverlist when your dedi server is empty
|
||||||
|
static void FakeSeed_OnChange(void);
|
||||||
|
consvar_t cv_usefakeseed = {"fakeseed", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, FakeSeed_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_fakeseedname = {"fakeseedname", "Player 1", CV_SAVE|CV_CALL|CV_NOINIT, NULL, FakeSeed_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
SINT8 nodetoplayer[MAXNETNODES] = {};
|
SINT8 nodetoplayer[MAXNETNODES] = {};
|
||||||
SINT8 nodetoplayer2[MAXNETNODES] = {}; // say the numplayer for this node if any (splitscreen)
|
SINT8 nodetoplayer2[MAXNETNODES] = {}; // say the numplayer for this node if any (splitscreen)
|
||||||
SINT8 nodetoplayer3[MAXNETNODES] = {}; // say the numplayer for this node if any (splitscreen == 2)
|
SINT8 nodetoplayer3[MAXNETNODES] = {}; // say the numplayer for this node if any (splitscreen == 2)
|
||||||
@@ -240,6 +247,13 @@ consvar_t cv_httpsource = {"http_source", "", CV_SAVE, NULL, NULL, 0, NULL, NULL
|
|||||||
|
|
||||||
consvar_t cv_kicktime = {"kicktime", "10", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_kicktime = {"kicktime", "10", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
static void FakeSeed_OnChange(void)
|
||||||
|
{
|
||||||
|
#ifdef MASTERSERVER
|
||||||
|
Update_MS();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static boolean UseLocalDelay(void)
|
static boolean UseLocalDelay(void)
|
||||||
{
|
{
|
||||||
if (dedicated || (server && server_lagless && !cv_mindelay.value) || modeattacking == ATTACKING_RECORD)
|
if (dedicated || (server && server_lagless && !cv_mindelay.value) || modeattacking == ATTACKING_RECORD)
|
||||||
@@ -318,7 +332,7 @@ void RegisterNetXCmd(netxcmd_t id, void (*cmd_f)(const UINT8 **p, INT32 playernu
|
|||||||
#ifdef PARANOIA
|
#ifdef PARANOIA
|
||||||
if (id >= MAXNETXCMD)
|
if (id >= MAXNETXCMD)
|
||||||
I_Error("Command id %d too big", id);
|
I_Error("Command id %d too big", id);
|
||||||
if (listnetxcmd[id] != 0)
|
if (listnetxcmd[id] != NULL)
|
||||||
I_Error("Command id %d already used", id);
|
I_Error("Command id %d already used", id);
|
||||||
#endif
|
#endif
|
||||||
listnetxcmd[id] = cmd_f;
|
listnetxcmd[id] = cmd_f;
|
||||||
@@ -351,7 +365,7 @@ void SendNetXCmdForPlayer(UINT8 playerid, netxcmd_t id, const void *param, size_
|
|||||||
CONS_Alert(CONS_NOTICE, M_GetText("NetXCmd buffer full, delaying netcmd %d... (size: %d, needed: %s)\n"), id, localtextcmd[playerid][0], sizeu1(nparam));
|
CONS_Alert(CONS_NOTICE, M_GetText("NetXCmd buffer full, delaying netcmd %d... (size: %d, needed: %s)\n"), id, localtextcmd[playerid][0], sizeu1(nparam));
|
||||||
if (buf == NULL)
|
if (buf == NULL)
|
||||||
{
|
{
|
||||||
textcmdbuf[playerid] = Z_Malloc(sizeof(textcmdbuf_t), PU_STATIC, NULL);
|
textcmdbuf[playerid] = (textcmdbuf_t*)Z_Malloc(sizeof(textcmdbuf_t), PU_STATIC, NULL);
|
||||||
textcmdbuf[playerid]->cmd[0] = 0;
|
textcmdbuf[playerid]->cmd[0] = 0;
|
||||||
textcmdbuf[playerid]->next = NULL;
|
textcmdbuf[playerid]->next = NULL;
|
||||||
WriteNetXCmd(textcmdbuf[playerid]->cmd, id, param, nparam);
|
WriteNetXCmd(textcmdbuf[playerid]->cmd, id, param, nparam);
|
||||||
@@ -363,7 +377,7 @@ void SendNetXCmdForPlayer(UINT8 playerid, netxcmd_t id, const void *param, size_
|
|||||||
|
|
||||||
if (buf->cmd[0]+2+nparam > MAXTEXTCMD)
|
if (buf->cmd[0]+2+nparam > MAXTEXTCMD)
|
||||||
{
|
{
|
||||||
buf->next = Z_Malloc(sizeof(textcmdbuf_t), PU_STATIC, NULL);
|
buf->next = (textcmdbuf_t*)Z_Malloc(sizeof(textcmdbuf_t), PU_STATIC, NULL);
|
||||||
buf->next->cmd[0] = 0;
|
buf->next->cmd[0] = 0;
|
||||||
buf->next->next = NULL;
|
buf->next->next = NULL;
|
||||||
WriteNetXCmd(buf->next->cmd, id, param, nparam);
|
WriteNetXCmd(buf->next->cmd, id, param, nparam);
|
||||||
@@ -440,13 +454,13 @@ static UINT8* D_GetTextcmd(tic_t tic, INT32 playernum)
|
|||||||
// If we don't have an entry for the tic, make it.
|
// If we don't have an entry for the tic, make it.
|
||||||
if (!textcmdtic)
|
if (!textcmdtic)
|
||||||
{
|
{
|
||||||
textcmdtic = *tctprev = Z_Calloc(sizeof (textcmdtic_t), PU_STATIC, NULL);
|
textcmdtic = *tctprev = (textcmdtic_t*)Z_Calloc(sizeof (textcmdtic_t), PU_STATIC, NULL);
|
||||||
textcmdtic->tic = tic;
|
textcmdtic->tic = tic;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we don't have an entry for the player, make it.
|
// If we don't have an entry for the player, make it.
|
||||||
if (!textcmdtic->playercmds[playernum])
|
if (!textcmdtic->playercmds[playernum])
|
||||||
textcmdtic->playercmds[playernum] = Z_Calloc(MAXTEXTCMD, PU_STATIC, NULL);
|
textcmdtic->playercmds[playernum] = (UINT8*)Z_Calloc(MAXTEXTCMD, PU_STATIC, NULL);
|
||||||
|
|
||||||
return textcmdtic->playercmds[playernum];
|
return textcmdtic->playercmds[playernum];
|
||||||
}
|
}
|
||||||
@@ -493,10 +507,12 @@ static void ExtraDataTicker(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If you are a client, you can safely forget the net commands for this tic
|
// If you are a client, you can safely forget the net commands for this tic
|
||||||
// If you are the server, you need to remember them until every client has been aknowledged,
|
// If you are the server, you need to remember them until every client has been acknowledged,
|
||||||
// because if you need to resend a PT_SERVERTICS packet, you need to put the commands in it
|
// because if you need to resend a PT_SERVERTICS packet, you will need to put the commands in it
|
||||||
if (client)
|
if (client)
|
||||||
|
{
|
||||||
D_FreeTextcmd(gametic);
|
D_FreeTextcmd(gametic);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D_Clearticcmd(tic_t tic)
|
static void D_Clearticcmd(tic_t tic)
|
||||||
@@ -1125,7 +1141,7 @@ typedef enum
|
|||||||
static void GetPackets(void);
|
static void GetPackets(void);
|
||||||
|
|
||||||
static cl_mode_t cl_mode = CL_SEARCHING;
|
static cl_mode_t cl_mode = CL_SEARCHING;
|
||||||
static UINT16 cl_lastcheckedfilecount = 0; // used for full file list
|
static UINT16 cl_lastcheckedfilecount = 0; // used for full file list
|
||||||
|
|
||||||
// Player name send/load
|
// Player name send/load
|
||||||
|
|
||||||
@@ -1166,7 +1182,7 @@ static void CV_LoadPlayerNames(UINT8 **p)
|
|||||||
//
|
//
|
||||||
// Keep the local client informed of our status.
|
// Keep the local client informed of our status.
|
||||||
//
|
//
|
||||||
static inline void CL_DrawConnectionStatus(void)
|
static void CL_DrawConnectionStatus(void)
|
||||||
{
|
{
|
||||||
INT32 ccstime = I_GetTime();
|
INT32 ccstime = I_GetTime();
|
||||||
|
|
||||||
@@ -1201,24 +1217,26 @@ static inline void CL_DrawConnectionStatus(void)
|
|||||||
case CL_DOWNLOADSAVEGAME:
|
case CL_DOWNLOADSAVEGAME:
|
||||||
if (filedownload.current != -1)
|
if (filedownload.current != -1)
|
||||||
{
|
{
|
||||||
UINT32 currentsize = fileneeded[filedownload.current].currentsize;
|
INT32 dldlength = 0;
|
||||||
UINT32 totalsize = fileneeded[filedownload.current].totalsize;
|
fileneeded_t *file = &fileneeded[filedownload.current];
|
||||||
INT32 dldlength;
|
UINT32 currentsize = file->currentsize;
|
||||||
|
UINT32 totalsize = file->totalsize;
|
||||||
|
|
||||||
cltext = M_GetText("Downloading game state...");
|
cltext = M_GetText("Downloading game state...");
|
||||||
Net_GetNetStat();
|
Net_GetNetStat();
|
||||||
|
|
||||||
dldlength = (INT32)((currentsize/(double)totalsize) * 256);
|
if (totalsize != 0)
|
||||||
|
dldlength = (INT32)((currentsize/(double)totalsize) * 256);
|
||||||
if (dldlength > 256)
|
if (dldlength > 256)
|
||||||
dldlength = 256;
|
dldlength = 256;
|
||||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 111);
|
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 111);
|
||||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, dldlength, 8, 96);
|
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, dldlength, 8, 96);
|
||||||
|
|
||||||
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE,
|
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE,
|
||||||
va(" %4uK/%4uK",currentsize>>10,totalsize>>10));
|
va(" %4uK/%4uK", currentsize>>10, totalsize>>10));
|
||||||
|
|
||||||
V_DrawRightAlignedString(BASEVIDWIDTH/2+128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE,
|
V_DrawRightAlignedString(BASEVIDWIDTH/2+128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE,
|
||||||
va("%3.1fK/s ", ((double)getbps)/1024));
|
va("%3.1fK/s ", ((double)getbps)/1024.0));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cltext = M_GetText("Waiting to download game state...");
|
cltext = M_GetText("Waiting to download game state...");
|
||||||
@@ -1254,29 +1272,30 @@ static inline void CL_DrawConnectionStatus(void)
|
|||||||
{
|
{
|
||||||
if (cl_mode == CL_CHECKFILES)
|
if (cl_mode == CL_CHECKFILES)
|
||||||
{
|
{
|
||||||
INT32 totalfileslength;
|
INT32 totalfileslength = 0;
|
||||||
INT32 checkednum = 0;
|
INT32 checkednum = 0;
|
||||||
INT32 i;
|
INT32 i;
|
||||||
|
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, V_YELLOWMAP|MENUCAPS, "Press ESC to abort");
|
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, V_YELLOWMAP|MENUCAPS, "Press ESC to abort");
|
||||||
|
|
||||||
//ima just count files here
|
// ima just count files here
|
||||||
for (i = 0; i < fileneedednum; i++)
|
for (i = 0; i < fileneedednum; i++)
|
||||||
if (fileneeded[i].status != FS_NOTCHECKED)
|
if (fileneeded[i].status != FS_NOTCHECKED)
|
||||||
checkednum++;
|
checkednum++;
|
||||||
|
|
||||||
// Loading progress
|
// Loading progress
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, V_YELLOWMAP|MENUCAPS, "Checking server addons...");
|
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, V_YELLOWMAP|MENUCAPS, "Checking server addons...");
|
||||||
totalfileslength = (INT32)((checkednum/(double)(fileneedednum)) * 256);
|
if (fileneedednum != 0)
|
||||||
|
totalfileslength = (INT32)((checkednum/(double)fileneedednum) * 256);
|
||||||
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1);
|
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1);
|
||||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 175);
|
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 175);
|
||||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, totalfileslength, 8, 160);
|
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, totalfileslength, 8, 160);
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
||||||
va(" %2u/%2u Files",checkednum,fileneedednum));
|
va(" %2u/%2u Files", checkednum, fileneedednum));
|
||||||
}
|
}
|
||||||
else if (cl_mode == CL_LOADFILES)
|
else if (cl_mode == CL_LOADFILES)
|
||||||
{
|
{
|
||||||
INT32 totalfileslength;
|
INT32 totalfileslength = 0;
|
||||||
INT32 loadcompletednum = 0;
|
INT32 loadcompletednum = 0;
|
||||||
INT32 i;
|
INT32 i;
|
||||||
|
|
||||||
@@ -1289,12 +1308,13 @@ static inline void CL_DrawConnectionStatus(void)
|
|||||||
|
|
||||||
// Loading progress
|
// Loading progress
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, V_YELLOWMAP|MENUCAPS, "Loading server addons...");
|
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, V_YELLOWMAP|MENUCAPS, "Loading server addons...");
|
||||||
totalfileslength = (INT32)((loadcompletednum/(double)(fileneedednum)) * 256);
|
if (fileneedednum != 0)
|
||||||
|
totalfileslength = (INT32)((loadcompletednum/(double)fileneedednum) * 256);
|
||||||
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1);
|
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1);
|
||||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 175);
|
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 175);
|
||||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, totalfileslength, 8, 160);
|
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, totalfileslength, 8, 160);
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
||||||
va(" %2u/%2u Files",loadcompletednum,fileneedednum));
|
va(" %2u/%2u Files", loadcompletednum, fileneedednum));
|
||||||
}
|
}
|
||||||
else if (cl_mode == CL_VIEWSERVER)
|
else if (cl_mode == CL_VIEWSERVER)
|
||||||
{
|
{
|
||||||
@@ -1355,10 +1375,19 @@ static inline void CL_DrawConnectionStatus(void)
|
|||||||
V_DrawThinString(12 + 80, 58, V_ALLOWLOWERCASE|V_YELLOWMAP, "Vanilla");
|
V_DrawThinString(12 + 80, 58, V_ALLOWLOWERCASE|V_YELLOWMAP, "Vanilla");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (serverlist[joinnode].info.cheatsenabled)
|
const UINT8 serverkartspeed = (serverlist[joinnode].info.kartvars & SV_SPEEDMASK);
|
||||||
|
|
||||||
|
if (serverkartspeed == 2)
|
||||||
|
V_DrawRightAlignedThinString(BASEVIDWIDTH - 12, 58, V_ALLOWLOWERCASE|V_REDMAP, "Hard Speed");
|
||||||
|
else if (serverkartspeed == 1)
|
||||||
|
V_DrawRightAlignedThinString(BASEVIDWIDTH - 12, 58, V_ALLOWLOWERCASE|V_BLUEMAP, "Normal Speed");
|
||||||
|
else
|
||||||
|
V_DrawRightAlignedThinString(BASEVIDWIDTH - 12, 58, V_ALLOWLOWERCASE|V_GREENMAP, "Easy Speed");
|
||||||
|
|
||||||
|
/*if (serverlist[joinnode].info.cheatsenabled)
|
||||||
{
|
{
|
||||||
V_DrawRightAlignedThinString(BASEVIDWIDTH - 12, 58, V_ALLOWLOWERCASE|V_GREENMAP, "Cheats");
|
V_DrawRightAlignedThinString(BASEVIDWIDTH - 12, 58, V_ALLOWLOWERCASE|V_GREENMAP, "Cheats");
|
||||||
}
|
}*/
|
||||||
|
|
||||||
V_DrawFill(8, 72, BASEVIDWIDTH - 16, 112, 239);
|
V_DrawFill(8, 72, BASEVIDWIDTH - 16, 112, 239);
|
||||||
|
|
||||||
@@ -1378,10 +1407,16 @@ static inline void CL_DrawConnectionStatus(void)
|
|||||||
if (playerinfo[i].node < 255)
|
if (playerinfo[i].node < 255)
|
||||||
{
|
{
|
||||||
strncpy(player_name, playerinfo[i].name, MAXPLAYERNAME);
|
strncpy(player_name, playerinfo[i].name, MAXPLAYERNAME);
|
||||||
V_DrawThinString(x + 10, y, V_ALLOWLOWERCASE|V_6WIDTHSPACE, player_name);
|
|
||||||
|
// if we get a skin color
|
||||||
|
// try to colourize the player name
|
||||||
|
if (playerinfo[i].data > 0 && playerinfo[i].data < MAXSKINCOLORS)
|
||||||
|
V_DrawThinString(x + 10, y, V_ALLOWLOWERCASE|V_6WIDTHSPACE, va("%s%s ", HU_SkinColorToConsoleColor(playerinfo[i].data), player_name));
|
||||||
|
else
|
||||||
|
V_DrawThinString(x + 10, y, V_ALLOWLOWERCASE|V_6WIDTHSPACE, player_name);
|
||||||
|
|
||||||
if (playerinfo[i].team == 0) { statuscolor = 184; } // playing
|
if (playerinfo[i].team == 0) { statuscolor = 184; } // playing
|
||||||
if (playerinfo[i].data & 0x20) { statuscolor = 86; } // tag IT
|
//if (playerinfo[i].data & 0x20) { statuscolor = 86; } // tag IT
|
||||||
if (playerinfo[i].team == 1) { statuscolor = 128; } // ctf red team
|
if (playerinfo[i].team == 1) { statuscolor = 128; } // ctf red team
|
||||||
if (playerinfo[i].team == 2) { statuscolor = 232; } // ctf blue team
|
if (playerinfo[i].team == 2) { statuscolor = 232; } // ctf blue team
|
||||||
if (playerinfo[i].team == 255) { statuscolor = 16; } // spectator or non-team
|
if (playerinfo[i].team == 255) { statuscolor = 16; } // spectator or non-team
|
||||||
@@ -1407,31 +1442,36 @@ static inline void CL_DrawConnectionStatus(void)
|
|||||||
}
|
}
|
||||||
else if (filedownload.current != -1)
|
else if (filedownload.current != -1)
|
||||||
{
|
{
|
||||||
INT32 dldlength;
|
INT32 dldlength = 0;
|
||||||
INT32 totalfileslength;
|
INT32 totalfileslength = 0;
|
||||||
UINT32 totaldldsize;
|
UINT32 totaldldsize = 0;
|
||||||
static char tempname[28];
|
static char tempname[28];
|
||||||
fileneeded_t *file = &fileneeded[filedownload.current];
|
fileneeded_t *file = &fileneeded[filedownload.current];
|
||||||
char *filename = file->filename;
|
char *filename = file->filename;
|
||||||
|
UINT32 currentsize = file->currentsize;
|
||||||
|
UINT32 totalsize = file->totalsize;
|
||||||
|
|
||||||
// Draw the bottom box.
|
// Draw the bottom box.
|
||||||
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-58-8, 32, 1);
|
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-58-8, 32, 1);
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-14, V_YELLOWMAP|MENUCAPS, "Press ESC to abort");
|
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-14, V_YELLOWMAP|MENUCAPS, "Press ESC to abort");
|
||||||
|
|
||||||
Net_GetNetStat();
|
Net_GetNetStat();
|
||||||
dldlength = (INT32)((file->currentsize/(double)file->totalsize) * 256);
|
if (totalsize != 0)
|
||||||
|
dldlength = (INT32)((currentsize/(double)totalsize) * 256);
|
||||||
if (dldlength > 256)
|
if (dldlength > 256)
|
||||||
dldlength = 256;
|
dldlength = 256;
|
||||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, 256, 8, 175);
|
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, 256, 8, 175);
|
||||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, dldlength, 8, 160);
|
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, dldlength, 8, 160);
|
||||||
|
|
||||||
memset(tempname, 0, sizeof(tempname));
|
memset(tempname, 0, sizeof(tempname));
|
||||||
|
|
||||||
// offset filename to just the name only part
|
// offset filename to just the name only part
|
||||||
filename += strlen(filename) - nameonlylength(filename);
|
filename += strlen(filename) - nameonlylength(filename);
|
||||||
|
const size_t filenamelength = strlen(filename);
|
||||||
|
|
||||||
if (strlen(filename) > sizeof(tempname)-1) // too long to display fully
|
if (filenamelength > sizeof(tempname)-1) // too long to display fully
|
||||||
{
|
{
|
||||||
size_t endhalfpos = strlen(filename)-10;
|
size_t endhalfpos = filenamelength-10;
|
||||||
// display as first 14 chars + ... + last 10 chars
|
// display as first 14 chars + ... + last 10 chars
|
||||||
// which should add up to 27 if our math(s) is correct
|
// which should add up to 27 if our math(s) is correct
|
||||||
snprintf(tempname, sizeof(tempname), "%.14s...%.10s", filename, filename+endhalfpos);
|
snprintf(tempname, sizeof(tempname), "%.14s...%.10s", filename, filename+endhalfpos);
|
||||||
@@ -1450,29 +1490,30 @@ static inline void CL_DrawConnectionStatus(void)
|
|||||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-22, V_YELLOWMAP|MENUCAPS,
|
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-22, V_YELLOWMAP|MENUCAPS,
|
||||||
va(M_GetText("\"%s\""), tempname));
|
va(M_GetText("\"%s\""), tempname));
|
||||||
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
||||||
va(" %4uK/%4uK",file->currentsize>>10,file->totalsize>>10));
|
va(" %4uK/%4uK", currentsize>>10, totalsize>>10));
|
||||||
V_DrawRightAlignedString(BASEVIDWIDTH/2+128, BASEVIDHEIGHT-58, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
V_DrawRightAlignedString(BASEVIDWIDTH/2+128, BASEVIDHEIGHT-58, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
||||||
va("%3.1fK/s ", ((double)getbps)/1024));
|
va("%3.1fK/s ", ((double)getbps)/1024.0));
|
||||||
|
|
||||||
// Download progress
|
// Download progress
|
||||||
|
|
||||||
if (file->currentsize != file->totalsize)
|
if (currentsize != totalsize)
|
||||||
totaldldsize = filedownload.completedsize+file->currentsize; //Add in single file progress download if applicable
|
totaldldsize = filedownload.completedsize+currentsize; // Add in single file progress download if applicable
|
||||||
else
|
else
|
||||||
totaldldsize = filedownload.completedsize;
|
totaldldsize = filedownload.completedsize;
|
||||||
|
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-14, V_YELLOWMAP|MENUCAPS, "Overall Download Progress");
|
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-14, V_YELLOWMAP|MENUCAPS, "Overall Download Progress");
|
||||||
totalfileslength = (INT32)((totaldldsize/(double)filedownload.totalsize) * 256);
|
if (filedownload.totalsize != 0)
|
||||||
|
totalfileslength = (INT32)((totaldldsize/(double)filedownload.totalsize) * 256);
|
||||||
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1);
|
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1);
|
||||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 175);
|
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 175);
|
||||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, totalfileslength, 8, 160);
|
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, totalfileslength, 8, 160);
|
||||||
|
|
||||||
if (filedownload.totalsize>>20 >= 10) //display in MB if over 10MB
|
if (filedownload.totalsize>>20 >= 10) // display in MB if over 10MB
|
||||||
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
||||||
va(" %4uM/%4uM",totaldldsize>>20,filedownload.totalsize>>20));
|
va(" %4uM/%4uM", totaldldsize>>20, filedownload.totalsize>>20));
|
||||||
else
|
else
|
||||||
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
||||||
va(" %4uK/%4uK",totaldldsize>>10,filedownload.totalsize>>10));
|
va(" %4uK/%4uK", totaldldsize>>10, filedownload.totalsize>>10));
|
||||||
|
|
||||||
V_DrawRightAlignedString(BASEVIDWIDTH/2+128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
V_DrawRightAlignedString(BASEVIDWIDTH/2+128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE|MENUCAPS,
|
||||||
va("%2u/%2u Files ", filedownload.completednum, filedownload.totalnum));
|
va("%2u/%2u Files ", filedownload.completednum, filedownload.totalnum));
|
||||||
@@ -1544,6 +1585,12 @@ static boolean CL_SendJoin(void)
|
|||||||
return HSendPacket(servernode, false, 0, sizeof(clientconfig_pak));
|
return HSendPacket(servernode, false, 0, sizeof(clientconfig_pak));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static boolean UseFakeSeed(void)
|
||||||
|
{
|
||||||
|
// due to complexity this will disable the moment a real player joins
|
||||||
|
return (dedicated && cv_usefakeseed.value && D_NumPlayers() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void SV_SendServerInfo(INT32 node, tic_t servertime)
|
static void SV_SendServerInfo(INT32 node, tic_t servertime)
|
||||||
{
|
{
|
||||||
UINT8 *p;
|
UINT8 *p;
|
||||||
@@ -1566,7 +1613,12 @@ static void SV_SendServerInfo(INT32 node, tic_t servertime)
|
|||||||
netbuffer->u.serverinfo.time = (tic_t)LONG(servertime);
|
netbuffer->u.serverinfo.time = (tic_t)LONG(servertime);
|
||||||
netbuffer->u.serverinfo.leveltime = (tic_t)LONG(leveltime);
|
netbuffer->u.serverinfo.leveltime = (tic_t)LONG(leveltime);
|
||||||
|
|
||||||
netbuffer->u.serverinfo.numberofplayer = (UINT8)D_NumPlayers();
|
// force 1 player
|
||||||
|
if (UseFakeSeed())
|
||||||
|
netbuffer->u.serverinfo.numberofplayer = (UINT8)1;
|
||||||
|
else
|
||||||
|
netbuffer->u.serverinfo.numberofplayer = (UINT8)D_NumPlayers();
|
||||||
|
|
||||||
netbuffer->u.serverinfo.maxplayer = (UINT8)(min((dedicated ? MAXPLAYERS-1 : MAXPLAYERS), cv_maxplayers.value));
|
netbuffer->u.serverinfo.maxplayer = (UINT8)(min((dedicated ? MAXPLAYERS-1 : MAXPLAYERS), cv_maxplayers.value));
|
||||||
|
|
||||||
// SRB2Kart: Vanilla's gametype constants for MS support
|
// SRB2Kart: Vanilla's gametype constants for MS support
|
||||||
@@ -1645,6 +1697,37 @@ static void SV_SendPlayerInfo(INT32 node)
|
|||||||
|
|
||||||
netbuffer->packettype = PT_PLAYERINFO;
|
netbuffer->packettype = PT_PLAYERINFO;
|
||||||
|
|
||||||
|
// send a fake player to trick ms and serverbrowser
|
||||||
|
if (UseFakeSeed())
|
||||||
|
{
|
||||||
|
//printf("sending fake player lmao\n");
|
||||||
|
netbuffer->u.playerinfo[0].node = 0;
|
||||||
|
|
||||||
|
// fallback to smth, make sure this is always set
|
||||||
|
if (!cv_fakeseedname.string[0])
|
||||||
|
CV_Set(&cv_fakeseedname, "Player 1");
|
||||||
|
strlcpy(netbuffer->u.playerinfo[0].name, cv_fakeseedname.string, MAXPLAYERNAME+1);
|
||||||
|
|
||||||
|
memset(netbuffer->u.playerinfo[0].address, 0, 4);
|
||||||
|
|
||||||
|
// make it appear as spectator
|
||||||
|
netbuffer->u.playerinfo[0].team = 255;
|
||||||
|
|
||||||
|
// doesent really matter what we put here lel
|
||||||
|
netbuffer->u.playerinfo[0].score = LONG(42069);
|
||||||
|
netbuffer->u.playerinfo[0].timeinserver = SHORT(42069);
|
||||||
|
netbuffer->u.playerinfo[0].skin = (UINT8)1; // no clue wtf skin 1 is, tails maybe?
|
||||||
|
|
||||||
|
netbuffer->u.playerinfo[0].data = 0;
|
||||||
|
|
||||||
|
// mark every other slot as empty
|
||||||
|
for (i = 1; i < MSCOMPAT_MAXPLAYERS; i++)
|
||||||
|
netbuffer->u.playerinfo[i].node = 255;
|
||||||
|
|
||||||
|
HSendPacket(node, false, 0, sizeof(plrinfo) * MSCOMPAT_MAXPLAYERS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < MSCOMPAT_MAXPLAYERS; i++)
|
for (i = 0; i < MSCOMPAT_MAXPLAYERS; i++)
|
||||||
{
|
{
|
||||||
if ((i >= MAXPLAYERS) || !playeringame[i])
|
if ((i >= MAXPLAYERS) || !playeringame[i])
|
||||||
@@ -1682,16 +1765,19 @@ static void SV_SendPlayerInfo(INT32 node)
|
|||||||
|
|
||||||
// Extra data
|
// Extra data
|
||||||
// Kart has extra skincolors, so we can't use this
|
// Kart has extra skincolors, so we can't use this
|
||||||
netbuffer->u.playerinfo[i].data = 0; //netbuffer->u.playerinfo[i].data = players[i].skincolor;
|
//netbuffer->u.playerinfo[i].data = 0; //netbuffer->u.playerinfo[i].data = players[i].skincolor;
|
||||||
|
|
||||||
if (players[i].pflags & PF_TAGIT)
|
// well why not, we only got like 100 of these?
|
||||||
netbuffer->u.playerinfo[i].data |= 0x20;
|
netbuffer->u.playerinfo[i].data = players[i].skincolor;
|
||||||
|
|
||||||
if (players[i].gotflag)
|
//if (players[i].pflags & PF_TAGIT)
|
||||||
netbuffer->u.playerinfo[i].data |= 0x40;
|
//netbuffer->u.playerinfo[i].data |= 0x20;
|
||||||
|
|
||||||
if (players[i].powers[pw_super])
|
//if (players[i].gotflag)
|
||||||
netbuffer->u.playerinfo[i].data |= 0x80;
|
//netbuffer->u.playerinfo[i].data |= 0x40;
|
||||||
|
|
||||||
|
//if (players[i].powers[pw_super])
|
||||||
|
//netbuffer->u.playerinfo[i].data |= 0x80;
|
||||||
}
|
}
|
||||||
|
|
||||||
HSendPacket(node, false, 0, sizeof(plrinfo) * MSCOMPAT_MAXPLAYERS);
|
HSendPacket(node, false, 0, sizeof(plrinfo) * MSCOMPAT_MAXPLAYERS);
|
||||||
@@ -1699,6 +1785,9 @@ static void SV_SendPlayerInfo(INT32 node)
|
|||||||
|
|
||||||
static void SV_SendMapIcon(INT32 node)
|
static void SV_SendMapIcon(INT32 node)
|
||||||
{
|
{
|
||||||
|
if (node == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
doomdata_t *netbuffer = DOOMCOM_DATA(doomcom);
|
doomdata_t *netbuffer = DOOMCOM_DATA(doomcom);
|
||||||
|
|
||||||
const char *map = va("%sP", G_BuildMapName(gamemap));
|
const char *map = va("%sP", G_BuildMapName(gamemap));
|
||||||
@@ -1874,7 +1963,7 @@ static boolean SV_ResendingSavegameToAnyone(void)
|
|||||||
static void SV_SendSaveGame(INT32 node, boolean resending)
|
static void SV_SendSaveGame(INT32 node, boolean resending)
|
||||||
{
|
{
|
||||||
size_t length, compressedlen;
|
size_t length, compressedlen;
|
||||||
savebuffer_t save;
|
savebuffer_t save = {};
|
||||||
UINT8 *compressedsave;
|
UINT8 *compressedsave;
|
||||||
UINT8 *buffertosend;
|
UINT8 *buffertosend;
|
||||||
|
|
||||||
@@ -1944,7 +2033,7 @@ static consvar_t cv_dumpconsistency = {"dumpconsistency", "Off", CV_NETVAR, CV_O
|
|||||||
static void SV_SavedGame(void)
|
static void SV_SavedGame(void)
|
||||||
{
|
{
|
||||||
size_t length;
|
size_t length;
|
||||||
savebuffer_t save;
|
savebuffer_t save = {};
|
||||||
char tmpsave[264];
|
char tmpsave[264];
|
||||||
|
|
||||||
if (!cv_dumpconsistency.value)
|
if (!cv_dumpconsistency.value)
|
||||||
@@ -1984,7 +2073,7 @@ static void SV_SavedGame(void)
|
|||||||
|
|
||||||
static void CL_LoadReceivedSavegame(boolean reloading)
|
static void CL_LoadReceivedSavegame(boolean reloading)
|
||||||
{
|
{
|
||||||
savebuffer_t save;
|
savebuffer_t save = {};
|
||||||
size_t length, decompressedlen;
|
size_t length, decompressedlen;
|
||||||
char tmpsave[264];
|
char tmpsave[264];
|
||||||
|
|
||||||
@@ -1993,6 +2082,7 @@ static void CL_LoadReceivedSavegame(boolean reloading)
|
|||||||
length = FIL_ReadFile(tmpsave, &save.buffer);
|
length = FIL_ReadFile(tmpsave, &save.buffer);
|
||||||
|
|
||||||
CONS_Printf(M_GetText("Loading savegame length %s\n"), sizeu1(length));
|
CONS_Printf(M_GetText("Loading savegame length %s\n"), sizeu1(length));
|
||||||
|
|
||||||
if (!length)
|
if (!length)
|
||||||
{
|
{
|
||||||
I_Error("Can't read savegame sent");
|
I_Error("Can't read savegame sent");
|
||||||
@@ -2076,7 +2166,7 @@ static void CL_ReloadReceivedSavegame(void)
|
|||||||
// we dont have P_ForceLocalAngle so were setting it manually here
|
// we dont have P_ForceLocalAngle so were setting it manually here
|
||||||
for (i = 0; i <= splitscreen; i++)
|
for (i = 0; i <= splitscreen; i++)
|
||||||
{
|
{
|
||||||
localangle[i] = (angle_t)(players[displayplayers[i]].cmd.angleturn << 16);
|
P_ForceLocalAngle(&players[displayplayers[i]], (angle_t)(players[displayplayers[i]].cmd.angleturn << TICCMD_REDUCE));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||||
@@ -2115,12 +2205,8 @@ static void SendAskInfo(INT32 node)
|
|||||||
HSendPacket(node, false, 0, sizeof (askinfo_pak));
|
HSendPacket(node, false, 0, sizeof (askinfo_pak));
|
||||||
}
|
}
|
||||||
|
|
||||||
serverelem_t serverlist[MAXSERVERLIST];
|
serverelem_t serverlist[MAXSERVERLIST] = {};
|
||||||
UINT32 serverlistcount = 0;
|
UINT32 serverlistcount = 0;
|
||||||
UINT32 serverlistultimatecount = 0;
|
|
||||||
|
|
||||||
static boolean resendserverlistnode[MAXNETNODES];
|
|
||||||
static tic_t serverlistepoch;
|
|
||||||
|
|
||||||
static void SL_ClearServerList(INT32 connectedserver)
|
static void SL_ClearServerList(INT32 connectedserver)
|
||||||
{
|
{
|
||||||
@@ -2133,8 +2219,7 @@ static void SL_ClearServerList(INT32 connectedserver)
|
|||||||
serverlist[i].node = 0;
|
serverlist[i].node = 0;
|
||||||
}
|
}
|
||||||
serverlistcount = 0;
|
serverlistcount = 0;
|
||||||
|
//memset(serverlist, 0, sizeof(serverlist));
|
||||||
memset(resendserverlistnode, 0, sizeof resendserverlistnode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT32 SL_SearchServer(INT32 node)
|
static UINT32 SL_SearchServer(INT32 node)
|
||||||
@@ -2151,8 +2236,6 @@ static void SL_InsertServer(serverinfo_pak* info, SINT8 node)
|
|||||||
{
|
{
|
||||||
UINT32 i;
|
UINT32 i;
|
||||||
|
|
||||||
resendserverlistnode[node] = false;
|
|
||||||
|
|
||||||
// search if not already on it
|
// search if not already on it
|
||||||
i = SL_SearchServer(node);
|
i = SL_SearchServer(node);
|
||||||
if (i == UINT32_MAX)
|
if (i == UINT32_MAX)
|
||||||
@@ -2186,7 +2269,7 @@ static void SL_InsertServer(serverinfo_pak* info, SINT8 node)
|
|||||||
M_SortServerList();
|
M_SortServerList();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CL_UpdateServerList (void)
|
void CL_UpdateServerList(void)
|
||||||
{
|
{
|
||||||
SL_ClearServerList(0);
|
SL_ClearServerList(0);
|
||||||
|
|
||||||
@@ -2204,14 +2287,12 @@ void CL_UpdateServerList (void)
|
|||||||
SendAskInfo(BROADCASTADDR);
|
SendAskInfo(BROADCASTADDR);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CL_QueryServerList (msg_server_t *server_list)
|
void CL_QueryServerList(msg_server_t *server_list)
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
|
|
||||||
CL_UpdateServerList();
|
CL_UpdateServerList();
|
||||||
|
|
||||||
serverlistepoch = I_GetTime();
|
|
||||||
|
|
||||||
for (i = 0; server_list[i].header.buffer[0]; i++)
|
for (i = 0; server_list[i].header.buffer[0]; i++)
|
||||||
{
|
{
|
||||||
// Make sure MS version matches our own, to
|
// Make sure MS version matches our own, to
|
||||||
@@ -2224,42 +2305,20 @@ void CL_QueryServerList (msg_server_t *server_list)
|
|||||||
if (node == -1)
|
if (node == -1)
|
||||||
continue; // no more node free, or resolution failure
|
continue; // no more node free, or resolution failure
|
||||||
SendAskInfo(node);
|
SendAskInfo(node);
|
||||||
resendserverlistnode[node] = true;
|
|
||||||
// Leave this node open. It'll be closed if the
|
|
||||||
// request times out (CL_TimeoutServerList).
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
serverlistultimatecount = i;
|
// Force close the connection so that servers can't eat
|
||||||
}
|
// up nodes forever if we never get a reply back from them
|
||||||
|
// (usually when they've not forwarded their ports).
|
||||||
#define SERVERLISTRESENDRATE NEWTICRATE
|
//
|
||||||
|
// Don't worry, we'll get in contact with the working
|
||||||
void CL_TimeoutServerList(void)
|
// servers again when they send SERVERINFO to us later!
|
||||||
{
|
//
|
||||||
if (netgame && serverlistultimatecount > serverlistcount)
|
// (Note: as a side effect this probably means every
|
||||||
{
|
// server in the list will probably be using the same node (e.g. node 1),
|
||||||
const tic_t timediff = I_GetTime() - serverlistepoch;
|
// not that it matters which nodes they use when
|
||||||
const tic_t timetoresend = timediff % SERVERLISTRESENDRATE;
|
// the connections are closed afterwards anyway)
|
||||||
const boolean timedout = timediff > connectiontimeout;
|
// -- Monster Iestyn 12/11/18
|
||||||
|
Net_CloseConnection(node|FORCECLOSE);
|
||||||
if (timedout || (timediff > 0 && timetoresend == 0))
|
|
||||||
{
|
|
||||||
INT32 node;
|
|
||||||
|
|
||||||
for (node = 1; node < MAXNETNODES; ++node)
|
|
||||||
{
|
|
||||||
if (resendserverlistnode[node])
|
|
||||||
{
|
|
||||||
if (timedout)
|
|
||||||
Net_CloseConnection(node|FORCECLOSE);
|
|
||||||
else
|
|
||||||
SendAskInfo(node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timedout)
|
|
||||||
serverlistultimatecount = serverlistcount;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2771,11 +2830,11 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic
|
|||||||
F_TitleScreenDrawer();
|
F_TitleScreenDrawer();
|
||||||
CL_DrawConnectionStatus();
|
CL_DrawConnectionStatus();
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
M_Drawer(); //Needed for drawing messageboxes on the connection screen
|
M_Drawer(); //Needed for drawing messageboxes on the connection screen
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
I_UpdateNoVsync(); // page flip or blit buffer
|
I_UpdateNoVsync(); // page flip or blit buffer
|
||||||
if (moviemode)
|
if (moviemode)
|
||||||
@@ -3426,6 +3485,9 @@ void CL_Reset(void)
|
|||||||
|
|
||||||
memset(player_muted, 0, sizeof(player_muted));
|
memset(player_muted, 0, sizeof(player_muted));
|
||||||
|
|
||||||
|
for (INT32 i = 0; i < MAXPLAYERS; ++i)
|
||||||
|
playerinfo[i].node = 255;
|
||||||
|
|
||||||
// D_StartTitle should get done now, but the calling function will handle it
|
// D_StartTitle should get done now, but the calling function will handle it
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4214,6 +4276,9 @@ void D_ClientServerInit(void)
|
|||||||
#endif
|
#endif
|
||||||
D_LoadBan(false);
|
D_LoadBan(false);
|
||||||
|
|
||||||
|
for (INT32 i = 0; i < MAXPLAYERS; ++i)
|
||||||
|
playerinfo[i].node = 255;
|
||||||
|
|
||||||
gametic = 0;
|
gametic = 0;
|
||||||
localgametic = 0;
|
localgametic = 0;
|
||||||
|
|
||||||
@@ -4449,6 +4514,8 @@ static void Got_AddPlayer(const UINT8 **p, INT32 playernum)
|
|||||||
DEBFILE("spawning me\n");
|
DEBFILE("spawning me\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
P_ForceLocalAngle(&players[newplayernum], (angle_t)(players[newplayernum].cmd.angleturn << TICCMD_REDUCE));
|
||||||
|
|
||||||
D_SendPlayerConfig();
|
D_SendPlayerConfig();
|
||||||
addedtogame = true;
|
addedtogame = true;
|
||||||
}
|
}
|
||||||
@@ -5854,12 +5921,14 @@ static void PT_FileFragmentFromPlayer(SINT8 node)
|
|||||||
Got_Filetxpak();
|
Got_Filetxpak();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SATURNPAK
|
||||||
static void PT_ReceivedGamestate(SINT8 node)
|
static void PT_ReceivedGamestate(SINT8 node)
|
||||||
{
|
{
|
||||||
sendingsavegame[node] = false;
|
sendingsavegame[node] = false;
|
||||||
resendingsavegame[node] = 0;
|
resendingsavegame[node] = 0;
|
||||||
savegameresendcooldown[node] = I_GetTime() + cv_resynchcooldown.value * TICRATE; // I_GetTime() + 5 * TICRATE;
|
savegameresendcooldown[node] = I_GetTime() + cv_resynchcooldown.value * TICRATE; // I_GetTime() + 5 * TICRATE;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/** Handles a packet received from a node that is in game
|
/** Handles a packet received from a node that is in game
|
||||||
*
|
*
|
||||||
@@ -6392,6 +6461,7 @@ static void SV_SendTics(void)
|
|||||||
continue;
|
continue;
|
||||||
DEBFILE(va("Sent %d anyway\n", realfirsttic));
|
DEBFILE(va("Sent %d anyway\n", realfirsttic));
|
||||||
}
|
}
|
||||||
|
|
||||||
realfirsttic = max(realfirsttic, firstticstosend);
|
realfirsttic = max(realfirsttic, firstticstosend);
|
||||||
|
|
||||||
// compute the length of the packet and cut it if too large
|
// compute the length of the packet and cut it if too large
|
||||||
@@ -6537,7 +6607,8 @@ void SV_SpawnPlayer(INT32 playernum, INT32 x, INT32 y, angle_t angle)
|
|||||||
// -- Monster Iestyn 16/01/18
|
// -- Monster Iestyn 16/01/18
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
netcmds[tic%BACKUPTICS][playernum].angleturn = (INT16)((angle>>16) | TICCMD_RECEIVED);
|
|
||||||
|
netcmds[tic%BACKUPTICS][playernum].angleturn = (INT16)((angle >> TICCMD_REDUCE) | TICCMD_RECEIVED);
|
||||||
|
|
||||||
if (!tic) // failsafe for gametic == 0 -- Monster Iestyn 16/01/18
|
if (!tic) // failsafe for gametic == 0 -- Monster Iestyn 16/01/18
|
||||||
break;
|
break;
|
||||||
@@ -7116,11 +7187,12 @@ void NetUpdate(void)
|
|||||||
{
|
{
|
||||||
resptime = nowtime;
|
resptime = nowtime;
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
M_Ticker();
|
M_Ticker();
|
||||||
|
refreshdirmenu = 0;
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
CON_Ticker();
|
CON_Ticker();
|
||||||
}
|
}
|
||||||
@@ -7165,7 +7237,7 @@ void CL_ClearRewinds(void)
|
|||||||
|
|
||||||
rewind_t *CL_SaveRewindPoint(size_t demopos)
|
rewind_t *CL_SaveRewindPoint(size_t demopos)
|
||||||
{
|
{
|
||||||
savebuffer_t save;
|
savebuffer_t save = {};
|
||||||
rewind_t *rewind;
|
rewind_t *rewind;
|
||||||
|
|
||||||
if (rewindhead && rewindhead->leveltime + REWIND_POINT_INTERVAL > leveltime)
|
if (rewindhead && rewindhead->leveltime + REWIND_POINT_INTERVAL > leveltime)
|
||||||
@@ -7188,7 +7260,7 @@ rewind_t *CL_SaveRewindPoint(size_t demopos)
|
|||||||
|
|
||||||
rewind_t *CL_RewindToTime(tic_t time)
|
rewind_t *CL_RewindToTime(tic_t time)
|
||||||
{
|
{
|
||||||
savebuffer_t save;
|
savebuffer_t save = {};
|
||||||
rewind_t *rewind;
|
rewind_t *rewind;
|
||||||
|
|
||||||
while (rewindhead && rewindhead->leveltime > time)
|
while (rewindhead && rewindhead->leveltime > time)
|
||||||
|
|||||||
+2
-2
@@ -516,7 +516,6 @@ typedef struct
|
|||||||
|
|
||||||
extern serverelem_t serverlist[MAXSERVERLIST];
|
extern serverelem_t serverlist[MAXSERVERLIST];
|
||||||
extern UINT32 serverlistcount;
|
extern UINT32 serverlistcount;
|
||||||
extern UINT32 serverlistultimatecount;
|
|
||||||
extern INT32 mapchangepending;
|
extern INT32 mapchangepending;
|
||||||
|
|
||||||
// Points inside doomcom
|
// Points inside doomcom
|
||||||
@@ -582,6 +581,8 @@ extern tic_t simulated_lag;
|
|||||||
extern tic_t lowest_lag;
|
extern tic_t lowest_lag;
|
||||||
extern consvar_t cv_mindelay, cv_gentlemens;
|
extern consvar_t cv_mindelay, cv_gentlemens;
|
||||||
|
|
||||||
|
extern consvar_t cv_usefakeseed, cv_fakeseedname;
|
||||||
|
|
||||||
extern consvar_t
|
extern consvar_t
|
||||||
cv_netticbuffer, cv_allownewplayer,
|
cv_netticbuffer, cv_allownewplayer,
|
||||||
#ifdef SATURNJOIN
|
#ifdef SATURNJOIN
|
||||||
@@ -625,7 +626,6 @@ void CL_ClearPlayer(INT32 playernum);
|
|||||||
void CL_RemovePlayer(INT32 playernum, INT32 reason);
|
void CL_RemovePlayer(INT32 playernum, INT32 reason);
|
||||||
void CL_QueryServerList(msg_server_t *list);
|
void CL_QueryServerList(msg_server_t *list);
|
||||||
void CL_UpdateServerList(void);
|
void CL_UpdateServerList(void);
|
||||||
void CL_TimeoutServerList(void);
|
|
||||||
|
|
||||||
void CL_AbortConnection(void);
|
void CL_AbortConnection(void);
|
||||||
|
|
||||||
|
|||||||
+77
-76
@@ -46,6 +46,7 @@
|
|||||||
#include "i_time.h"
|
#include "i_time.h"
|
||||||
#include "i_threads.h"
|
#include "i_threads.h"
|
||||||
#include "i_video.h"
|
#include "i_video.h"
|
||||||
|
#include "hu_stuff.h"
|
||||||
#include "m_argv.h"
|
#include "m_argv.h"
|
||||||
#include "m_menu.h"
|
#include "m_menu.h"
|
||||||
#include "m_misc.h"
|
#include "m_misc.h"
|
||||||
@@ -69,7 +70,7 @@
|
|||||||
#include "fastcmp.h"
|
#include "fastcmp.h"
|
||||||
#include "r_fps.h" // Frame interpolation/uncapped
|
#include "r_fps.h" // Frame interpolation/uncapped
|
||||||
#include "keys.h"
|
#include "keys.h"
|
||||||
#include "filesrch.h" // refreshdirmenu, pathisdirectory
|
#include "filesrch.h" // pathisdirectory
|
||||||
#include "d_protocol.h"
|
#include "d_protocol.h"
|
||||||
#include "m_perfstats.h"
|
#include "m_perfstats.h"
|
||||||
#include "k_kart.h"
|
#include "k_kart.h"
|
||||||
@@ -79,6 +80,31 @@
|
|||||||
|
|
||||||
#include "lua_script.h"
|
#include "lua_script.h"
|
||||||
|
|
||||||
|
/* Manually defined asset hashes for non-CMake builds
|
||||||
|
* Last updated 2015 / 05 / 03 - SRB2 v2.1.15 - srb2.srb
|
||||||
|
* Last updated 2018 / 12 / 23 - SRB2 v2.1.22 - patch.dta
|
||||||
|
* Last updated 2019 / 01 / 18 - Kart v1.0.2 - Main assets
|
||||||
|
* Last updated 2020 / 08 / 30 - Kart v1.3 - patch.kart
|
||||||
|
* Last updated 2022 / 08 / 16 - Kart v1.4 - Main assets
|
||||||
|
* Last updated 2022 / 08 / 19 - Kart v1.5 - gfx.kart
|
||||||
|
* Last updated 2022 / 11 / 01 - Kart v1.6 - gfx.kart, maps.kart
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Base SRB2 hashes
|
||||||
|
#define ASSET_HASH_SRB2_SRB "c1b9577687f8a795104aef4600720ea7"
|
||||||
|
#ifdef USE_PATCH_DTA
|
||||||
|
#define ASSET_HASH_PATCH_DTA "b04fd9624bfd94dc96dcf4f400f7deb4"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// SRB2Kart-specific hashes
|
||||||
|
#define ASSET_HASH_GFX_KART "06f86ee16136eb8a7043b15001797034"
|
||||||
|
#define ASSET_HASH_TEXTURES_KART "abb53d56aba47c3a8cb0f764da1c8b80"
|
||||||
|
#define ASSET_HASH_CHARS_KART "e2c428347dde52858a3dacd29fc5b964"
|
||||||
|
#define ASSET_HASH_MAPS_KART "d051e55141ba736582228c456953cd98"
|
||||||
|
#ifdef USE_PATCH_KART
|
||||||
|
#define ASSET_HASH_PATCH_KART "00000000000000000000000000000000"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CMAKECONFIG
|
#ifdef CMAKECONFIG
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#else
|
#else
|
||||||
@@ -166,38 +192,6 @@ UINT8 ctrldown = 0; // 0x1 left, 0x2 right
|
|||||||
UINT8 altdown = 0; // 0x1 left, 0x2 right
|
UINT8 altdown = 0; // 0x1 left, 0x2 right
|
||||||
boolean capslock = 0; // gee i wonder what this does.
|
boolean capslock = 0; // gee i wonder what this does.
|
||||||
|
|
||||||
static UINT16 curcolor[MAXSPLITSCREENPLAYERS] = {};
|
|
||||||
|
|
||||||
static void D_DeviceLEDTick(void)
|
|
||||||
{
|
|
||||||
UINT8 i;
|
|
||||||
static UINT16 color[MAXSPLITSCREENPLAYERS] = {};
|
|
||||||
|
|
||||||
if (numcontrollers == 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i <= splitscreen; i++)
|
|
||||||
{
|
|
||||||
if (!cv_usejoystick[i].value || !cv_gamepadled[i].value)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
color[i] = G_GetSkinColor(i);
|
|
||||||
|
|
||||||
if (curcolor[i] == color[i]) // dont update if same colour
|
|
||||||
continue;
|
|
||||||
|
|
||||||
G_SetPlayerGamepadIndicatorColor(i, color[i]);
|
|
||||||
curcolor[i] = color[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void D_ResetDeviceLED(void)
|
|
||||||
{
|
|
||||||
memset(curcolor, 0, sizeof(curcolor));
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// D_ProcessEvents
|
// D_ProcessEvents
|
||||||
// Send all the events of the given timestamp down the responder chain
|
// Send all the events of the given timestamp down the responder chain
|
||||||
@@ -229,13 +223,13 @@ void D_ProcessEvents(void)
|
|||||||
|
|
||||||
// Menu input
|
// Menu input
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
eaten = M_Responder(ev);
|
eaten = M_Responder(ev);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (eaten)
|
if (eaten)
|
||||||
@@ -250,13 +244,13 @@ void D_ProcessEvents(void)
|
|||||||
|
|
||||||
// console input
|
// console input
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&con_mutex);
|
I_LockMutex(&con_mutex);
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
eaten = CON_Responder(ev);
|
eaten = CON_Responder(ev);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(con_mutex);
|
I_UnlockMutex(con_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (eaten)
|
if (eaten)
|
||||||
@@ -359,13 +353,12 @@ static void D_Renderview(void)
|
|||||||
if (splitscreen == 2)
|
if (splitscreen == 2)
|
||||||
{
|
{
|
||||||
// V_DrawPatchFill, but for the fourth screen only
|
// V_DrawPatchFill, but for the fourth screen only
|
||||||
patch_t *pat = W_CachePatchName("SRB2BACK", PU_PATCH);
|
INT32 x, y, pw = SHORT(srb2back->width) * vid.dup, ph = SHORT(srb2back->height) * vid.dup;
|
||||||
INT32 x, y, pw = SHORT(pat->width) * vid.dup, ph = SHORT(pat->height) * vid.dup;
|
|
||||||
|
|
||||||
for (x = vid.width>>1; x < vid.width; x += pw)
|
for (x = vid.width>>1; x < vid.width; x += pw)
|
||||||
{
|
{
|
||||||
for (y = vid.height>>1; y < vid.height; y += ph)
|
for (y = vid.height>>1; y < vid.height; y += ph)
|
||||||
V_DrawScaledPatch(x, y, V_NOSCALESTART, pat);
|
V_DrawScaledPatch(x, y, V_NOSCALESTART, srb2back);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,10 +400,6 @@ static boolean D_Display(void)
|
|||||||
R_ExecuteSetViewSize();
|
R_ExecuteSetViewSize();
|
||||||
forcerefresh = true; // force background redraw
|
forcerefresh = true; // force background redraw
|
||||||
}
|
}
|
||||||
|
|
||||||
// draw buffered stuff to screen
|
|
||||||
// Used only by linux GGI version
|
|
||||||
I_UpdateNoBlit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// save the current screen if about to wipe
|
// save the current screen if about to wipe
|
||||||
@@ -588,11 +577,11 @@ static boolean D_Display(void)
|
|||||||
vid.recalc = false;
|
vid.recalc = false;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
M_Drawer(); // menu is drawn even on top of everything...
|
M_Drawer(); // menu is drawn even on top of everything...
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
// focus lost moved to M_Drawer
|
// focus lost moved to M_Drawer
|
||||||
|
|
||||||
@@ -675,6 +664,7 @@ void D_SRB2Loop(void)
|
|||||||
tic_t entertic = 0, oldentertics = 0, realtics = 0, rendertimeout = INFTICS;
|
tic_t entertic = 0, oldentertics = 0, realtics = 0, rendertimeout = INFTICS;
|
||||||
double deltatics = 0.0;
|
double deltatics = 0.0;
|
||||||
double deltasecs = 0.0;
|
double deltasecs = 0.0;
|
||||||
|
UINT64 precision = 0;
|
||||||
|
|
||||||
boolean interp = false;
|
boolean interp = false;
|
||||||
boolean doDisplay = false;
|
boolean doDisplay = false;
|
||||||
@@ -707,21 +697,26 @@ void D_SRB2Loop(void)
|
|||||||
COM_ImmedExecute("cls;version");
|
COM_ImmedExecute("cls;version");
|
||||||
|
|
||||||
if (rendermode == render_soft)
|
if (rendermode == render_soft)
|
||||||
V_DrawFixedPatch(0, 0, FRACUNIT/2, 0, W_CachePatchNum(W_GetNumForName("KARTKREW"), PU_PATCH_LOWPRIORITY), NULL);
|
V_DrawFixedPatch(0, 0, FRACUNIT/2, 0, W_CachePatchNum(W_GetNumForName("KARTKREW"), PU_PATCH), NULL);
|
||||||
I_FinishUpdate(); // page flip or blit buffer
|
I_FinishUpdate(); // page flip or blit buffer
|
||||||
|
|
||||||
|
precision = I_GetPrecisePrecision();
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
// 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 enterprecise = I_GetPreciseTime();
|
precise_t elapsed;
|
||||||
|
precise_t enterprecise, finishprecise;
|
||||||
|
|
||||||
|
enterprecise = I_GetPreciseTime();
|
||||||
|
|
||||||
memset(&g_dc, 0, sizeof(g_dc));
|
memset(&g_dc, 0, sizeof(g_dc));
|
||||||
Z_Frame_Reset();
|
Z_Frame_Reset();
|
||||||
|
|
||||||
// Casting the return value of a function is bad practice (apparently)
|
// Casting the return value of a function is bad practice (apparently)
|
||||||
double budget = ((R_GetFramerateCap() == 0) ? 0.0 : round((1.0 / R_GetFramerateCap()) * I_GetPrecisePrecision()));
|
const UINT32 framecap = R_GetFramerateCap();
|
||||||
capbudget = (precise_t)budget;
|
capbudget = (framecap == 0) ? 0 : (precise_t)((double)precision / (double)framecap + 0.5); // + 0.5 instead of round
|
||||||
|
|
||||||
boolean ranwipe = false;
|
boolean ranwipe = false;
|
||||||
|
|
||||||
@@ -755,8 +750,6 @@ void D_SRB2Loop(void)
|
|||||||
|
|
||||||
renderisnewtic = (realtics > 0 || singletics);
|
renderisnewtic = (realtics > 0 || singletics);
|
||||||
|
|
||||||
refreshdirmenu = 0; // not sure where to put this, here as good as any?
|
|
||||||
|
|
||||||
if (renderisnewtic)
|
if (renderisnewtic)
|
||||||
{
|
{
|
||||||
// don't skip more than 10 frames at a time
|
// don't skip more than 10 frames at a time
|
||||||
@@ -793,13 +786,13 @@ void D_SRB2Loop(void)
|
|||||||
|
|
||||||
if (!dedicated)
|
if (!dedicated)
|
||||||
{
|
{
|
||||||
D_DeviceLEDTick();
|
G_DeviceLEDTick();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (interp)
|
if (interp)
|
||||||
{
|
{
|
||||||
renderdeltatics = FloatToFixed(deltatics);
|
renderdeltatics = DoubleToFixed(deltatics);
|
||||||
|
|
||||||
// I looked at the possibility of putting in a float drawer for
|
// I looked at the possibility of putting in a float drawer for
|
||||||
// perfstats and it's very complicated, so we'll just do this instead...
|
// perfstats and it's very complicated, so we'll just do this instead...
|
||||||
@@ -824,9 +817,9 @@ void D_SRB2Loop(void)
|
|||||||
}
|
}
|
||||||
else if (!dedicated)
|
else if (!dedicated)
|
||||||
{
|
{
|
||||||
// always update console and hud
|
// always update console movement
|
||||||
// otherwise it may take minutes to open it
|
// otherwise it will takes literal ages to open
|
||||||
CON_Drawer();
|
CON_MoveConsole();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -848,12 +841,13 @@ void D_SRB2Loop(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// Fully completed frame made.
|
// Fully completed frame made.
|
||||||
precise_t finishprecise = I_GetPreciseTime();
|
finishprecise = I_GetPreciseTime();
|
||||||
|
|
||||||
// Use the time before sleep for frameskip calculations:
|
// Use the time before sleep for frameskip calculations:
|
||||||
// post-sleep time is literally being intentionally wasted
|
// post-sleep time is literally being intentionally wasted
|
||||||
deltasecs = (double)((INT64)(finishprecise - enterprecise)) / I_GetPrecisePrecision();
|
elapsed = finishprecise - enterprecise;
|
||||||
deltatics = deltasecs * NEWTICRATE;
|
deltasecs = (double)elapsed / (double)precision;
|
||||||
|
deltatics = deltasecs * (double)NEWTICRATE;
|
||||||
|
|
||||||
// If time spent this game loop exceeds a single tic,
|
// If time spent this game loop exceeds a single tic,
|
||||||
// it's probably because of rendering.
|
// it's probably because of rendering.
|
||||||
@@ -881,12 +875,10 @@ void D_SRB2Loop(void)
|
|||||||
|
|
||||||
if (!singletics)
|
if (!singletics)
|
||||||
{
|
{
|
||||||
INT64 elapsed = (INT64)(finishprecise - enterprecise);
|
|
||||||
|
|
||||||
// in the case of "match refresh rate" + vsync, don't sleep at all
|
// in the case of "match refresh rate" + vsync, don't sleep at all
|
||||||
const boolean vsync_with_match_refresh = cv_vidwait.value && cv_fpscap.value == 0;
|
const boolean vsync_with_match_refresh = cv_vidwait.value && cv_fpscap.value == 0;
|
||||||
|
|
||||||
if ((elapsed > 0) && ((INT64)capbudget > elapsed) && !vsync_with_match_refresh)
|
if ((elapsed > 0) && (capbudget > elapsed) && !vsync_with_match_refresh)
|
||||||
{
|
{
|
||||||
I_SleepDuration(capbudget - elapsed);
|
I_SleepDuration(capbudget - elapsed);
|
||||||
}
|
}
|
||||||
@@ -894,8 +886,9 @@ void D_SRB2Loop(void)
|
|||||||
|
|
||||||
// Capture the time once more to get the real delta time.
|
// Capture the time once more to get the real delta time.
|
||||||
finishprecise = I_GetPreciseTime();
|
finishprecise = I_GetPreciseTime();
|
||||||
deltasecs = (double)((INT64)(finishprecise - enterprecise)) / I_GetPrecisePrecision();
|
elapsed = finishprecise - enterprecise;
|
||||||
deltatics = deltasecs * NEWTICRATE;
|
deltasecs = (double)elapsed / (double)precision;
|
||||||
|
deltatics = deltasecs * (double)NEWTICRATE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -914,10 +907,11 @@ void D_ClearState(void)
|
|||||||
|
|
||||||
// okay, stop now
|
// okay, stop now
|
||||||
// (otherwise the game still thinks we're playing!)
|
// (otherwise the game still thinks we're playing!)
|
||||||
|
#ifdef HAVE_CURL
|
||||||
CURLAbortFile();
|
CURLAbortFile();
|
||||||
|
#endif
|
||||||
SV_StopServer();
|
SV_StopServer();
|
||||||
SV_ResetServer();
|
SV_ResetServer();
|
||||||
serverlistultimatecount = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
CL_ClearPlayer(i);
|
CL_ClearPlayer(i);
|
||||||
@@ -971,7 +965,7 @@ void D_ClearState(void)
|
|||||||
M_ClearMenus(true);
|
M_ClearMenus(true);
|
||||||
|
|
||||||
// map palettes affect this
|
// map palettes affect this
|
||||||
D_ResetDeviceLED();
|
G_ResetDeviceLED();
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -979,6 +973,9 @@ void D_ClearState(void)
|
|||||||
//
|
//
|
||||||
void D_StartTitle(void)
|
void D_StartTitle(void)
|
||||||
{
|
{
|
||||||
|
if (dedicated)
|
||||||
|
I_Error("D_StartTitle is called on dedicated server");
|
||||||
|
|
||||||
D_ClearState();
|
D_ClearState();
|
||||||
multiplayer = netgame = false; // title menu shouldnt be a netgame or multiplayer lmao
|
multiplayer = netgame = false; // title menu shouldnt be a netgame or multiplayer lmao
|
||||||
F_StartTitleScreen();
|
F_StartTitleScreen();
|
||||||
@@ -1212,22 +1209,20 @@ static void IdentifyVersion(void)
|
|||||||
const char *srb2waddir = NULL;
|
const char *srb2waddir = NULL;
|
||||||
|
|
||||||
#if defined (__unix__) || defined (UNIXCOMMON) || defined (HAVE_SDL)
|
#if defined (__unix__) || defined (UNIXCOMMON) || defined (HAVE_SDL)
|
||||||
|
CLEANUP(pfree) const char *allocwaddir = NULL; // here so we dont potentially free stack memory
|
||||||
// change to the directory where 'srb2.srb' is found
|
// change to the directory where 'srb2.srb' is found
|
||||||
srb2waddir = I_LocateWad();
|
allocwaddir = I_LocateWad();
|
||||||
|
srb2waddir = allocwaddir;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char tempsrb2path[256] = ".";
|
char tempsrb2path[256] = ".";
|
||||||
getcwd(tempsrb2path, 256);
|
if (getcwd(tempsrb2path, 256) == NULL)
|
||||||
|
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)
|
||||||
if (!srb2waddir)
|
if (!srb2waddir)
|
||||||
{
|
{
|
||||||
if (tempsrb2path[0])
|
srb2waddir = tempsrb2path;
|
||||||
srb2waddir = tempsrb2path;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
srb2waddir = ".";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (1) // reduce the amount of findfile by only using full cwd in this func
|
#if (1) // reduce the amount of findfile by only using full cwd in this func
|
||||||
@@ -1900,7 +1895,8 @@ void D_SRB2Main(void)
|
|||||||
if (M_CheckParm("-warp") && M_IsNextParm())
|
if (M_CheckParm("-warp") && M_IsNextParm())
|
||||||
{
|
{
|
||||||
const char *word = M_GetNextParm();
|
const char *word = M_GetNextParm();
|
||||||
pstartmap = G_FindMapByNameOrCode(word, 0);
|
pstartmap = G_FindMapByNameOrCode(word, NULL);
|
||||||
|
|
||||||
if (! pstartmap)
|
if (! pstartmap)
|
||||||
I_Error("Cannot find a map remotely named '%s'\n", word);
|
I_Error("Cannot find a map remotely named '%s'\n", word);
|
||||||
else
|
else
|
||||||
@@ -1920,6 +1916,10 @@ 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
|
||||||
|
sound_disabled = true;
|
||||||
|
music_disabled = true;
|
||||||
|
#else
|
||||||
// setting up sound
|
// setting up sound
|
||||||
if (dedicated || M_CheckParm("-noaudio")) // combines -nosound and -nomusic
|
if (dedicated || M_CheckParm("-noaudio")) // combines -nosound and -nomusic
|
||||||
{
|
{
|
||||||
@@ -1941,6 +1941,7 @@ void D_SRB2Main(void)
|
|||||||
I_InitMusic();
|
I_InitMusic();
|
||||||
S_InitSfxChannels(cv_soundvolume.value);
|
S_InitSfxChannels(cv_soundvolume.value);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
S_InitMusicDefs();
|
S_InitMusicDefs();
|
||||||
|
|
||||||
|
|||||||
@@ -80,8 +80,6 @@ void D_ProcessEvents(void);
|
|||||||
|
|
||||||
const char *D_Home(void);
|
const char *D_Home(void);
|
||||||
|
|
||||||
void D_ResetDeviceLED(void);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// BASE LEVEL
|
// BASE LEVEL
|
||||||
//
|
//
|
||||||
|
|||||||
+13
-7
@@ -59,7 +59,7 @@ static INT16 reboundsize[MAXREBOUND];
|
|||||||
static INT32 rebound_head, rebound_tail;
|
static INT32 rebound_head, rebound_tail;
|
||||||
|
|
||||||
/// \brief max length per packet
|
/// \brief max length per packet
|
||||||
INT16 hardware_MAXPACKETLENGTH;
|
INT16 hardware_MAXPACKETLENGTH = 0;
|
||||||
|
|
||||||
boolean (*I_NetGet)(void) = NULL;
|
boolean (*I_NetGet)(void) = NULL;
|
||||||
void (*I_NetSend)(void) = NULL;
|
void (*I_NetSend)(void) = NULL;
|
||||||
@@ -96,7 +96,7 @@ INT32 ticruned = 0, ticmiss = 0;
|
|||||||
|
|
||||||
// globals
|
// globals
|
||||||
INT32 getbps = 0, sendbps = 0;
|
INT32 getbps = 0, sendbps = 0;
|
||||||
float lostpercent = 0, duppercent = 0, gamelostpercent = 0;
|
float lostpercent = 0.0f, duppercent = 0.0f, gamelostpercent = 0.0f;
|
||||||
INT32 packetheaderlength = 0;
|
INT32 packetheaderlength = 0;
|
||||||
|
|
||||||
boolean Net_GetNetStat(void)
|
boolean Net_GetNetStat(void)
|
||||||
@@ -492,6 +492,7 @@ void Net_AckTicker(void)
|
|||||||
ackpak[i].acknum = 0;
|
ackpak[i].acknum = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBFILE(va("Resend ack %d, %u<%d at %u\n", ackpak[i].acknum, ackpak[i].senttime,
|
DEBFILE(va("Resend ack %d, %u<%d at %u\n", ackpak[i].acknum, ackpak[i].senttime,
|
||||||
NODETIMEOUT, I_GetTime()));
|
NODETIMEOUT, I_GetTime()));
|
||||||
memcpy(netbuffer, ackpak[i].pak.raw, ackpak[i].length);
|
memcpy(netbuffer, ackpak[i].pak.raw, ackpak[i].length);
|
||||||
@@ -805,16 +806,16 @@ const char *packettypename[NUMPACKETTYPE] =
|
|||||||
"TELLFILESNEEDED",
|
"TELLFILESNEEDED",
|
||||||
"MOREFILESNEEDED",
|
"MOREFILESNEEDED",
|
||||||
|
|
||||||
"PING"
|
"PING",
|
||||||
#ifdef SATURNPAK
|
#ifdef SATURNPAK
|
||||||
,
|
|
||||||
|
|
||||||
"WILLRESENDGAMESTATE",
|
"WILLRESENDGAMESTATE",
|
||||||
"CANRECEIVEGAMESTATE",
|
"CANRECEIVEGAMESTATE",
|
||||||
"RECEIVEDGAMESTATE",
|
"RECEIVEDGAMESTATE",
|
||||||
|
|
||||||
"ISSATURN" // special packet to identify saturn clients
|
"ISSATURN", // special packet to identify saturn clients
|
||||||
#endif
|
#endif
|
||||||
|
"MAPICON", // Send map image icon (gamespy).
|
||||||
|
"NEEDMAPICON" // Request missed map icon (gamespy).
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *Net_GetPacketName(UINT8 packettype)
|
const char *Net_GetPacketName(UINT8 packettype)
|
||||||
@@ -1224,7 +1225,7 @@ void D_SetDoomcom(void)
|
|||||||
if (doomcom)
|
if (doomcom)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
doomcom = Z_Calloc(sizeof (doomcom_t), PU_STATIC, NULL);
|
doomcom = Z_Calloc(sizeof(doomcom_t), PU_STATIC, NULL);
|
||||||
doomcom->id = DOOMCOM_ID;
|
doomcom->id = DOOMCOM_ID;
|
||||||
doomcom->numslots = doomcom->numnodes = 1;
|
doomcom->numslots = doomcom->numnodes = 1;
|
||||||
}
|
}
|
||||||
@@ -1266,6 +1267,7 @@ boolean D_CheckNetGame(void)
|
|||||||
ret = true;
|
ret = true;
|
||||||
if (client && netgame)
|
if (client && netgame)
|
||||||
netgame = false;
|
netgame = false;
|
||||||
|
|
||||||
server = true; // WTF? server always true???
|
server = true; // WTF? server always true???
|
||||||
// no! The deault mode is server. Client is set elsewhere
|
// no! The deault mode is server. Client is set elsewhere
|
||||||
// when the client executes connect command.
|
// when the client executes connect command.
|
||||||
@@ -1301,6 +1303,7 @@ boolean D_CheckNetGame(void)
|
|||||||
|
|
||||||
if (doomcom->id != DOOMCOM_ID)
|
if (doomcom->id != DOOMCOM_ID)
|
||||||
I_Error("Doomcom buffer invalid!");
|
I_Error("Doomcom buffer invalid!");
|
||||||
|
|
||||||
if (doomcom->numnodes > MAXNETNODES)
|
if (doomcom->numnodes > MAXNETNODES)
|
||||||
I_Error("Too many nodes (%d), max:%d", doomcom->numnodes, MAXNETNODES);
|
I_Error("Too many nodes (%d), max:%d", doomcom->numnodes, MAXNETNODES);
|
||||||
|
|
||||||
@@ -1309,14 +1312,17 @@ boolean D_CheckNetGame(void)
|
|||||||
{
|
{
|
||||||
char filename[21];
|
char filename[21];
|
||||||
INT32 k = doomcom->consoleplayer - 1;
|
INT32 k = doomcom->consoleplayer - 1;
|
||||||
|
|
||||||
if (M_IsNextParm())
|
if (M_IsNextParm())
|
||||||
k = atoi(M_GetNextParm()) - 1;
|
k = atoi(M_GetNextParm()) - 1;
|
||||||
|
|
||||||
while (!debugfile && k < MAXPLAYERS)
|
while (!debugfile && k < MAXPLAYERS)
|
||||||
{
|
{
|
||||||
k++;
|
k++;
|
||||||
sprintf(filename, "debug%d.txt", k);
|
sprintf(filename, "debug%d.txt", k);
|
||||||
debugfile = fopen(va("%s" PATHSEP "%s", srb2home, filename), "w");
|
debugfile = fopen(va("%s" PATHSEP "%s", srb2home, filename), "w");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debugfile)
|
if (debugfile)
|
||||||
CONS_Printf(M_GetText("debug output to: %s\n"), va("%s" PATHSEP "%s", srb2home, filename));
|
CONS_Printf(M_GetText("debug output to: %s\n"), va("%s" PATHSEP "%s", srb2home, filename));
|
||||||
else
|
else
|
||||||
|
|||||||
+59
-39
@@ -54,6 +54,9 @@
|
|||||||
#include "fastcmp.h"
|
#include "fastcmp.h"
|
||||||
#include "m_perfstats.h"
|
#include "m_perfstats.h"
|
||||||
|
|
||||||
|
#include "r_data.h"
|
||||||
|
#include "r_skins.h"
|
||||||
|
|
||||||
#ifdef NETGAME_DEVMODE
|
#ifdef NETGAME_DEVMODE
|
||||||
#define CV_RESTRICT CV_NETVAR
|
#define CV_RESTRICT CV_NETVAR
|
||||||
#else
|
#else
|
||||||
@@ -144,6 +147,7 @@ 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 Command_ListWADS_f(void);
|
static void Command_ListWADS_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_RunSOC(void);
|
static void Command_RunSOC(void);
|
||||||
@@ -248,7 +252,7 @@ consvar_t cv_competitionboxes = {"competitionboxes", "Random", CV_NETVAR|CV_CHEA
|
|||||||
|
|
||||||
#ifdef SEENAMES
|
#ifdef SEENAMES
|
||||||
static CV_PossibleValue_t seenames_cons_t[] = {{0, "Off"}, {1, "Colorless"}, {2, "Team"}, {3, "Ally/Foe"}, {0, NULL}};
|
static CV_PossibleValue_t seenames_cons_t[] = {{0, "Off"}, {1, "Colorless"}, {2, "Team"}, {3, "Ally/Foe"}, {0, NULL}};
|
||||||
consvar_t cv_seenames = {"seenames", "Off", CV_SAVE, seenames_cons_t, 0, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_seenames = {"seenames", "Off", CV_SAVE, seenames_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_allowseenames = {"allowseenames", "No", CV_NETVAR, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_allowseenames = {"allowseenames", "No", CV_NETVAR, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -270,11 +274,11 @@ consvar_t cv_skin4 = {"skin4", DEFAULTSKIN4, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Sk
|
|||||||
// haha I've beaten you now, ONLINE
|
// haha I've beaten you now, ONLINE
|
||||||
consvar_t cv_localskin = {"internal___localskin", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_localskin = {"internal___localskin", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_showlocalskinmenus = {"showlocalskinmenus", "Yes", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_showlocalskinmenus = {"showlocalskinmenus", "Yes", CV_SAVE|CV_CALL, CV_YesNo, ShowLocalskinMenu_Onchange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_skipmapcheck = {"skipmapcheck", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_skipmapcheck = {"skipmapcheck", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
INT32 cv_debug;
|
INT32 cv_debug = 0;
|
||||||
|
|
||||||
static void UseMouse_OnChange(void);
|
static void UseMouse_OnChange(void);
|
||||||
consvar_t cv_usemouse = {"use_mouse", "Off", CV_SAVE|CV_CALL, usemouse_cons_t, UseMouse_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_usemouse = {"use_mouse", "Off", CV_SAVE|CV_CALL, usemouse_cons_t, UseMouse_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
@@ -457,16 +461,16 @@ consvar_t cv_showping = {"showping", "Always", CV_SAVE, showping_cons_t, NULL, 0
|
|||||||
|
|
||||||
static CV_PossibleValue_t pingmeasurement_cons_t[] = {{0, "Frames"}, {1, "Milliseconds"}, {0, NULL}};
|
static CV_PossibleValue_t pingmeasurement_cons_t[] = {{0, "Frames"}, {1, "Milliseconds"}, {0, NULL}};
|
||||||
consvar_t cv_pingmeasurement = {"pingmeasurement", "Frames", CV_SAVE, pingmeasurement_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_pingmeasurement = {"pingmeasurement", "Frames", CV_SAVE, pingmeasurement_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_pingicon = {"pingicon", "On", CV_SAVE, CV_OnOff, 0, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_pingicon = {"pingicon", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
static CV_PossibleValue_t cv_pingstyle_cons_t[] = {{0, "New"}, {1, "Old"}, {0, NULL}};
|
static CV_PossibleValue_t cv_pingstyle_cons_t[] = {{0, "New"}, {1, "Old"}, {0, NULL}};
|
||||||
consvar_t cv_pingstyle = {"pingstyle", "New", CV_SAVE, cv_pingstyle_cons_t, 0, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_pingstyle = {"pingstyle", "New", CV_SAVE, cv_pingstyle_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_luaimmersion = {"luaimmersion", "On", CV_SAVE, CV_OnOff, 0, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_luaimmersion = {"luaimmersion", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_showviewpointtext = {"showviewpointtext", "On", CV_SAVE, CV_OnOff, 0, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_showviewpointtext = {"showviewpointtext", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_showdownloadprompt = {"showdownloadprompt", "On", CV_SAVE, CV_OnOff, 0, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_showdownloadprompt = {"showdownloadprompt", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
// Intermission time Tails 04-19-2002
|
// Intermission time Tails 04-19-2002
|
||||||
static CV_PossibleValue_t inttime_cons_t[] = {{0, "MIN"}, {3600, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t inttime_cons_t[] = {{0, "MIN"}, {3600, "MAX"}, {0, NULL}};
|
||||||
@@ -531,7 +535,7 @@ boolean forceresetplayers = false;
|
|||||||
boolean deferencoremode = false;
|
boolean deferencoremode = false;
|
||||||
UINT8 splitscreen = 0;
|
UINT8 splitscreen = 0;
|
||||||
boolean circuitmap = true; // SRB2kart
|
boolean circuitmap = true; // SRB2kart
|
||||||
INT32 adminplayers[MAXPLAYERS];
|
INT32 adminplayers[MAXPLAYERS] = {};
|
||||||
|
|
||||||
/// \warning Keep this up-to-date if you add/remove/rename net text commands
|
/// \warning Keep this up-to-date if you add/remove/rename net text commands
|
||||||
const char *netxcmdnames[MAXNETXCMD - 1] =
|
const char *netxcmdnames[MAXNETXCMD - 1] =
|
||||||
@@ -638,6 +642,7 @@ void D_RegisterServerCommands(void)
|
|||||||
COM_AddCommand("addfile", Command_Addfile);
|
COM_AddCommand("addfile", Command_Addfile);
|
||||||
COM_AddCommand("addskins", Command_Addskins);
|
COM_AddCommand("addskins", Command_Addskins);
|
||||||
COM_AddCommand("listwad", Command_ListWADS_f);
|
COM_AddCommand("listwad", Command_ListWADS_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);
|
||||||
|
|
||||||
@@ -760,6 +765,9 @@ void D_RegisterServerCommands(void)
|
|||||||
CV_RegisterVar(&cv_showping);
|
CV_RegisterVar(&cv_showping);
|
||||||
CV_RegisterVar(&cv_pingmeasurement);
|
CV_RegisterVar(&cv_pingmeasurement);
|
||||||
|
|
||||||
|
CV_RegisterVar(&cv_usefakeseed);
|
||||||
|
CV_RegisterVar(&cv_fakeseedname);
|
||||||
|
|
||||||
#ifdef SEENAMES
|
#ifdef SEENAMES
|
||||||
CV_RegisterVar(&cv_allowseenames);
|
CV_RegisterVar(&cv_allowseenames);
|
||||||
#endif
|
#endif
|
||||||
@@ -934,6 +942,7 @@ void D_RegisterClientCommands(void)
|
|||||||
CV_RegisterVar(&cv_chatbacktint);
|
CV_RegisterVar(&cv_chatbacktint);
|
||||||
CV_RegisterVar(&cv_chatcentertext);
|
CV_RegisterVar(&cv_chatcentertext);
|
||||||
CV_RegisterVar(&cv_songcredits);
|
CV_RegisterVar(&cv_songcredits);
|
||||||
|
CV_RegisterVar(&cv_pausesongcredits);
|
||||||
CV_RegisterVar(&cv_showfreeplay);
|
CV_RegisterVar(&cv_showfreeplay);
|
||||||
CV_RegisterVar(&cv_skinselectspin);
|
CV_RegisterVar(&cv_skinselectspin);
|
||||||
CV_RegisterVar(&cv_showallmaps);
|
CV_RegisterVar(&cv_showallmaps);
|
||||||
@@ -991,15 +1000,21 @@ void D_RegisterClientCommands(void)
|
|||||||
|
|
||||||
CV_RegisterVar(&cv_litesteer[i]);
|
CV_RegisterVar(&cv_litesteer[i]);
|
||||||
|
|
||||||
|
CV_RegisterVar(&cv_autoaccel[i]);
|
||||||
|
|
||||||
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_rumble[i]);
|
||||||
|
CV_RegisterVar(&cv_rumblestrength[i]);
|
||||||
CV_RegisterVar(&cv_gamepadled[i]);
|
CV_RegisterVar(&cv_gamepadled[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CV_RegisterVar(&cv_gamepadledifunfocused);
|
||||||
|
CV_RegisterVar(&cv_rumbleifunfocused);
|
||||||
|
|
||||||
CV_RegisterVar(&cv_usemouse);
|
CV_RegisterVar(&cv_usemouse);
|
||||||
CV_RegisterVar(&cv_invertmouse);
|
CV_RegisterVar(&cv_invertmouse);
|
||||||
CV_RegisterVar(&cv_mousesens);
|
CV_RegisterVar(&cv_mousexsens);
|
||||||
CV_RegisterVar(&cv_mouseysens);
|
CV_RegisterVar(&cv_mouseysens);
|
||||||
CV_RegisterVar(&cv_mousevisible);
|
CV_RegisterVar(&cv_mousevisible);
|
||||||
|
|
||||||
@@ -2585,8 +2600,7 @@ void D_PickVote(void)
|
|||||||
SendNetXCmd(XD_PICKVOTE, &buf, 2);
|
SendNetXCmd(XD_PICKVOTE, &buf, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *ConcatCommandArgv(int start, int end)
|
||||||
ConcatCommandArgv (int start, int end)
|
|
||||||
{
|
{
|
||||||
char *final;
|
char *final;
|
||||||
|
|
||||||
@@ -2644,8 +2658,6 @@ static void Command_Map_f(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
M_ClearMenus(true);
|
|
||||||
|
|
||||||
last_map_cmd = I_GetTime();
|
last_map_cmd = I_GetTime();
|
||||||
|
|
||||||
size_t first_option;
|
size_t first_option;
|
||||||
@@ -2659,8 +2671,8 @@ static void Command_Map_f(void)
|
|||||||
|
|
||||||
INT32 newmapnum;
|
INT32 newmapnum;
|
||||||
|
|
||||||
char * mapname;
|
CLEANUP(Z_Pfree) char * mapname = NULL;
|
||||||
char *realmapname = NULL;
|
CLEANUP(Z_Pfree) char *realmapname = NULL;
|
||||||
|
|
||||||
INT32 newgametype = gametype;
|
INT32 newgametype = gametype;
|
||||||
boolean newencoremode = cv_kartencore.value;
|
boolean newencoremode = cv_kartencore.value;
|
||||||
@@ -2729,7 +2741,6 @@ static void Command_Map_f(void)
|
|||||||
if (newmapnum == 0)
|
if (newmapnum == 0)
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("Could not find any map described as '%s'.\n"), mapname);
|
CONS_Alert(CONS_ERROR, M_GetText("Could not find any map described as '%s'.\n"), mapname);
|
||||||
Z_Free(mapname);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2761,8 +2772,6 @@ static void Command_Map_f(void)
|
|||||||
" 0 and %d inclusive. ...Or just use the name. :v\n",
|
" 0 and %d inclusive. ...Or just use the name. :v\n",
|
||||||
d,
|
d,
|
||||||
NUMGAMETYPES-1);
|
NUMGAMETYPES-1);
|
||||||
Z_Free(realmapname);
|
|
||||||
Z_Free(mapname);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2771,8 +2780,6 @@ static void Command_Map_f(void)
|
|||||||
CONS_Alert(CONS_ERROR,
|
CONS_Alert(CONS_ERROR,
|
||||||
"'%s' is not a gametype.\n",
|
"'%s' is not a gametype.\n",
|
||||||
gametypename);
|
gametypename);
|
||||||
Z_Free(realmapname);
|
|
||||||
Z_Free(mapname);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2787,11 +2794,9 @@ static void Command_Map_f(void)
|
|||||||
// G_TOLFlag handles both multiplayer gametype and ignores it for !multiplayer
|
// G_TOLFlag handles both multiplayer gametype and ignores it for !multiplayer
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!mapheaderinfo[newmapnum-1])
|
if (mapheaderinfo[newmapnum-1] == NULL)
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Invalid mapheaderinfo for Course %s (%s)\n"), realmapname, G_BuildMapName(newmapnum));
|
CONS_Alert(CONS_WARNING, M_GetText("Invalid mapheaderinfo for Course %s (%s)\n"), realmapname, G_BuildMapName(newmapnum));
|
||||||
Z_Free(realmapname);
|
|
||||||
Z_Free(mapname);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2799,8 +2804,6 @@ static void Command_Map_f(void)
|
|||||||
{
|
{
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Course %s (%s) doesn't support %s mode!\n(Use -force to override)\n"), realmapname, G_BuildMapName(newmapnum),
|
CONS_Alert(CONS_WARNING, M_GetText("Course %s (%s) doesn't support %s mode!\n(Use -force to override)\n"), realmapname, G_BuildMapName(newmapnum),
|
||||||
(multiplayer ? gametype_cons_t[newgametype].strvalue : "Single Player"));
|
(multiplayer ? gametype_cons_t[newgametype].strvalue : "Single Player"));
|
||||||
Z_Free(realmapname);
|
|
||||||
Z_Free(mapname);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2812,8 +2815,6 @@ static void Command_Map_f(void)
|
|||||||
if (!dedicated && M_MapLocked(newmapnum))
|
if (!dedicated && M_MapLocked(newmapnum))
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_NOTICE, M_GetText("You need to unlock this level before you can warp to it!\n"));
|
CONS_Alert(CONS_NOTICE, M_GetText("You need to unlock this level before you can warp to it!\n"));
|
||||||
Z_Free(realmapname);
|
|
||||||
Z_Free(mapname);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2838,9 +2839,9 @@ static void Command_Map_f(void)
|
|||||||
|
|
||||||
fromlevelselect = false;
|
fromlevelselect = false;
|
||||||
|
|
||||||
D_MapChange(newmapnum, newgametype, newencoremode, newresetplayers, 0, false, false);
|
M_ClearMenus(true);
|
||||||
|
|
||||||
Z_Free(realmapname);
|
D_MapChange(newmapnum, newgametype, newencoremode, newresetplayers, 0, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Receives a map command and changes the map.
|
/** Receives a map command and changes the map.
|
||||||
@@ -3908,6 +3909,7 @@ static void Got_Teamchange(const UINT8 **cp, INT32 playernum)
|
|||||||
if (G_BattleGametype()) // SRB2kart
|
if (G_BattleGametype()) // SRB2kart
|
||||||
{
|
{
|
||||||
players[playernum].marescore = 0;
|
players[playernum].marescore = 0;
|
||||||
|
|
||||||
if (K_IsPlayerWanted(&players[playernum]))
|
if (K_IsPlayerWanted(&players[playernum]))
|
||||||
K_CalculateBattleWanted();
|
K_CalculateBattleWanted();
|
||||||
}
|
}
|
||||||
@@ -4505,7 +4507,7 @@ static void Command_Addskins(void)
|
|||||||
CONS_Printf("addskins has been deprecated\nuse addfilelocal instead!\n");
|
CONS_Printf("addskins has been deprecated\nuse addfilelocal instead!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Command_GLocalSkin (void)
|
static void Command_GLocalSkin(void)
|
||||||
{
|
{
|
||||||
size_t first_option;
|
size_t first_option;
|
||||||
size_t option_display;
|
size_t option_display;
|
||||||
@@ -4516,7 +4518,7 @@ static void Command_GLocalSkin (void)
|
|||||||
option_display = COM_CheckPartialParm("-d");
|
option_display = COM_CheckPartialParm("-d");
|
||||||
option_all = COM_CheckPartialParm("-a");
|
option_all = COM_CheckPartialParm("-a");
|
||||||
|
|
||||||
char* fuck; // local skin name
|
CLEANUP(Z_Pfree) char* fuck = NULL; // local skin name
|
||||||
|
|
||||||
if (!(first_option = COM_FirstOption()))
|
if (!(first_option = COM_FirstOption()))
|
||||||
first_option = COM_Argc();
|
first_option = COM_Argc();
|
||||||
@@ -4557,7 +4559,6 @@ static void Command_GLocalSkin (void)
|
|||||||
|
|
||||||
CONS_Printf("Successfully applied localskin to displayed player.\n");
|
CONS_Printf("Successfully applied localskin to displayed player.\n");
|
||||||
|
|
||||||
Z_Free(fuck);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (option_all) // -all
|
else if (option_all) // -all
|
||||||
@@ -4572,7 +4573,6 @@ static void Command_GLocalSkin (void)
|
|||||||
}
|
}
|
||||||
CONS_Printf("Successfully applied localskin to all players.\n");
|
CONS_Printf("Successfully applied localskin to all players.\n");
|
||||||
|
|
||||||
Z_Free(fuck);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else // -player or no other arguments
|
else // -player or no other arguments
|
||||||
@@ -4589,7 +4589,6 @@ static void Command_GLocalSkin (void)
|
|||||||
}
|
}
|
||||||
CONS_Printf("Successfully applied localskin to specified player.\n");
|
CONS_Printf("Successfully applied localskin to specified player.\n");
|
||||||
|
|
||||||
Z_Free(fuck);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -4597,13 +4596,11 @@ static void Command_GLocalSkin (void)
|
|||||||
SetLocalPlayerSkin(consoleplayer, fuck, &cv_localskin);
|
SetLocalPlayerSkin(consoleplayer, fuck, &cv_localskin);
|
||||||
CONS_Printf("Successfully applied localskin.\n");
|
CONS_Printf("Successfully applied localskin.\n");
|
||||||
|
|
||||||
Z_Free(fuck);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CONS_Printf("Could not apply localskin.\n");
|
CONS_Printf("Could not apply localskin.\n");
|
||||||
|
|
||||||
Z_Free(fuck);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4734,7 +4731,30 @@ static void Command_ListWADS_f(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAXDOOMEDNUM 4095
|
static void Command_LocateLump_f(void)
|
||||||
|
{
|
||||||
|
if (COM_Argc() == 1)
|
||||||
|
{
|
||||||
|
CONS_Printf("Usage: locatelump <lump1>[ <lump2>[ ...]]\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 1; i < COM_Argc(); ++i)
|
||||||
|
{
|
||||||
|
const char *name = COM_Argv(i);
|
||||||
|
|
||||||
|
lumpnum_t num = W_CheckNumForName(name);
|
||||||
|
|
||||||
|
const char *wadname = "(not found)";
|
||||||
|
|
||||||
|
if (num != LUMPERROR)
|
||||||
|
{
|
||||||
|
wadname = wadfiles[WADFILENUM(num)]->filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONS_Printf("%s - %s\n", name, wadname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void Command_ListDoomednums_f(void)
|
static void Command_ListDoomednums_f(void)
|
||||||
{
|
{
|
||||||
@@ -5686,7 +5706,7 @@ static void Command_Togglemodified_f(void)
|
|||||||
|
|
||||||
static void Command_Archivetest_f(void)
|
static void Command_Archivetest_f(void)
|
||||||
{
|
{
|
||||||
savebuffer_t save;
|
savebuffer_t save = {0};
|
||||||
UINT32 i, wrote;
|
UINT32 i, wrote;
|
||||||
thinker_t *th;
|
thinker_t *th;
|
||||||
if (gamestate != GS_LEVEL)
|
if (gamestate != GS_LEVEL)
|
||||||
|
|||||||
+26
-17
@@ -64,7 +64,6 @@
|
|||||||
static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid);
|
static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid);
|
||||||
|
|
||||||
#ifdef HAVE_CURL
|
#ifdef HAVE_CURL
|
||||||
size_t curlwrite_data(void *ptr, size_t size, size_t nmemb, FILE *stream);
|
|
||||||
#if (LIBCURL_VERSION_MAJOR <= 7) && (LIBCURL_VERSION_MINOR < 35)
|
#if (LIBCURL_VERSION_MAJOR <= 7) && (LIBCURL_VERSION_MINOR < 35)
|
||||||
static int curlprogress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);
|
static int curlprogress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);
|
||||||
#else
|
#else
|
||||||
@@ -113,7 +112,7 @@ static fileused_t transferFiles[UINT8_MAX + 1];
|
|||||||
INT32 fileneedednum = 0; // Number of files needed to join the server
|
INT32 fileneedednum = 0; // Number of files needed to join the server
|
||||||
fileneeded_t fileneeded[MAX_WADFILES] = {}; // List of needed files
|
fileneeded_t fileneeded[MAX_WADFILES] = {}; // List of needed files
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
static I_mutex downloadmutex;
|
static I_Mutex downloadmutex;
|
||||||
#endif
|
#endif
|
||||||
char downloaddir[512] = "DOWNLOAD";
|
char downloaddir[512] = "DOWNLOAD";
|
||||||
|
|
||||||
@@ -132,6 +131,8 @@ static UINT32 curl_origtotalfilesize;
|
|||||||
static char *curl_realname = NULL;
|
static char *curl_realname = NULL;
|
||||||
fileneeded_t *curl_curfile = NULL;
|
fileneeded_t *curl_curfile = NULL;
|
||||||
HTTP_login *curl_logins = NULL;
|
HTTP_login *curl_logins = NULL;
|
||||||
|
|
||||||
|
static void CURLGetFile(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** Fills a serverinfo packet with information about wad files loaded.
|
/** Fills a serverinfo packet with information about wad files loaded.
|
||||||
@@ -1080,12 +1081,14 @@ void CloseNetFile(void)
|
|||||||
|
|
||||||
// Receiving a file?
|
// Receiving a file?
|
||||||
for (i = 0; i < MAX_WADFILES; i++)
|
for (i = 0; i < MAX_WADFILES; i++)
|
||||||
|
{
|
||||||
if (fileneeded[i].status == FS_DOWNLOADING && fileneeded[i].file)
|
if (fileneeded[i].status == FS_DOWNLOADING && fileneeded[i].file)
|
||||||
{
|
{
|
||||||
fclose(fileneeded[i].file);
|
fclose(fileneeded[i].file);
|
||||||
// File is not complete delete it
|
// File is not complete delete it
|
||||||
remove(fileneeded[i].filename);
|
remove(fileneeded[i].filename);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Remove PT_FILEFRAGMENT from acknowledge list
|
// Remove PT_FILEFRAGMENT from acknowledge list
|
||||||
Net_AbortPacketType(PT_FILEFRAGMENT);
|
Net_AbortPacketType(PT_FILEFRAGMENT);
|
||||||
@@ -1099,17 +1102,16 @@ void nameonly(char *s)
|
|||||||
void *ns;
|
void *ns;
|
||||||
|
|
||||||
for (j = strlen(s); j != (size_t)-1; j--)
|
for (j = strlen(s); j != (size_t)-1; j--)
|
||||||
|
{
|
||||||
if ((s[j] == '\\') || (s[j] == ':') || (s[j] == '/'))
|
if ((s[j] == '\\') || (s[j] == ':') || (s[j] == '/'))
|
||||||
{
|
{
|
||||||
ns = &(s[j+1]);
|
ns = &(s[j+1]);
|
||||||
len = strlen(ns);
|
len = strlen(ns);
|
||||||
#if 0
|
memmove(s, ns, len+1);
|
||||||
memcpy(s, ns, len+1);
|
|
||||||
#else
|
|
||||||
memmove(s, ns, len+1);
|
|
||||||
#endif
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the length in characters of the last element of a path.
|
// Returns the length in characters of the last element of a path.
|
||||||
@@ -1163,8 +1165,12 @@ filestatus_t findfile(char *filename, const UINT8 *wantedmd5sum, boolean complet
|
|||||||
filestatus_t homecheck; // store result of last file search
|
filestatus_t homecheck; // store result of last file search
|
||||||
boolean badmd5 = false; // store whether md5 was bad from either of the first two searches (if nothing was found in the third)
|
boolean badmd5 = false; // store whether md5 was bad from either of the first two searches (if nothing was found in the third)
|
||||||
|
|
||||||
// skip for startup, our mainwads wont be in there
|
// see IdentifyVersion
|
||||||
if (loaded_config)
|
// Iwads skip findfile due to passing fullpath to W_OpenWadFile
|
||||||
|
#if 0
|
||||||
|
// skip for Iwads, as they wont be in there
|
||||||
|
if (!startupiwadcount)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
if (cv_addons_option.value == 3 && *cv_addons_folder.string != '\0')
|
if (cv_addons_option.value == 3 && *cv_addons_folder.string != '\0')
|
||||||
{
|
{
|
||||||
@@ -1301,6 +1307,7 @@ void CURLPrepareFile(const char* url, int dfilenum)
|
|||||||
if (!multi_handle)
|
if (!multi_handle)
|
||||||
{
|
{
|
||||||
cc = curl_global_init(CURL_GLOBAL_ALL);
|
cc = curl_global_init(CURL_GLOBAL_ALL);
|
||||||
|
|
||||||
if (cc < 0)
|
if (cc < 0)
|
||||||
{
|
{
|
||||||
I_OutputMsg("libcurl: curl_global_init() returned %d\n", cc);
|
I_OutputMsg("libcurl: curl_global_init() returned %d\n", cc);
|
||||||
@@ -1309,6 +1316,7 @@ void CURLPrepareFile(const char* url, int dfilenum)
|
|||||||
{
|
{
|
||||||
multi_handle = curl_multi_init();
|
multi_handle = curl_multi_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!multi_handle)
|
if (!multi_handle)
|
||||||
{
|
{
|
||||||
I_OutputMsg("libcurl: curl_multi_init() failed\n");
|
I_OutputMsg("libcurl: curl_multi_init() failed\n");
|
||||||
@@ -1419,7 +1427,7 @@ void CURLPrepareFile(const char* url, int dfilenum)
|
|||||||
filedownload.http_running = true;
|
filedownload.http_running = true;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_spawn_thread("http-download", (I_thread_fn)CURLGetFile, NULL);
|
(void)!I_SpawnThread("http-download", (I_ThreadFn)CURLGetFile, NULL);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1432,15 +1440,15 @@ void CURLAbortFile(void)
|
|||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
// lock and unlock to wait for the download thread to exit
|
// lock and unlock to wait for the download thread to exit
|
||||||
I_lock_mutex(&downloadmutex);
|
I_LockMutex(&downloadmutex);
|
||||||
I_unlock_mutex(downloadmutex);
|
I_UnlockMutex(downloadmutex);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void CURLGetFile(void)
|
static void CURLGetFile(void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&downloadmutex);
|
I_LockMutex(&downloadmutex);
|
||||||
#endif
|
#endif
|
||||||
CURLMcode mc; /* return code used by curl_multi_wait() */
|
CURLMcode mc; /* return code used by curl_multi_wait() */
|
||||||
CURLcode easyres; /* Return from easy interface */
|
CURLcode easyres; /* Return from easy interface */
|
||||||
@@ -1479,7 +1487,8 @@ void CURLGetFile(void)
|
|||||||
e = m->easy_handle;
|
e = m->easy_handle;
|
||||||
easyres = m->data.result;
|
easyres = m->data.result;
|
||||||
|
|
||||||
char *filename = Z_StrDup(curl_realname);
|
char *filename = malloc(strlen(curl_realname)+1);
|
||||||
|
strcpy(filename, curl_realname);
|
||||||
nameonly(filename);
|
nameonly(filename);
|
||||||
|
|
||||||
if (easyres != CURLE_OK)
|
if (easyres != CURLE_OK)
|
||||||
@@ -1517,7 +1526,7 @@ void CURLGetFile(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Z_Free(filename);
|
free(filename);
|
||||||
curl_curfile->file = NULL;
|
curl_curfile->file = NULL;
|
||||||
filedownload.remaining--;
|
filedownload.remaining--;
|
||||||
mc = curl_multi_remove_handle(multi_handle, e);
|
mc = curl_multi_remove_handle(multi_handle, e);
|
||||||
@@ -1540,7 +1549,7 @@ void CURLGetFile(void)
|
|||||||
|
|
||||||
filedownload.http_running = false;
|
filedownload.http_running = false;
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(downloadmutex);
|
I_UnlockMutex(downloadmutex);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -119,7 +119,6 @@ size_t nameonlylength(const char *s);
|
|||||||
#ifdef HAVE_CURL
|
#ifdef HAVE_CURL
|
||||||
void CURLPrepareFile(const char* url, int dfilenum);
|
void CURLPrepareFile(const char* url, int dfilenum);
|
||||||
void CURLAbortFile(void);
|
void CURLAbortFile(void);
|
||||||
void CURLGetFile(void);
|
|
||||||
HTTP_login * CURLGetLogin (const char *url, HTTP_login ***return_prev_next);
|
HTTP_login * CURLGetLogin (const char *url, HTTP_login ***return_prev_next);
|
||||||
size_t curlwrite_data(void *ptr, size_t size, size_t nmemb, FILE *stream);
|
size_t curlwrite_data(void *ptr, size_t size, size_t nmemb, FILE *stream);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+8
-3
@@ -46,15 +46,20 @@ typedef enum
|
|||||||
// Mainly movements/button commands per game tick,
|
// Mainly movements/button commands per game tick,
|
||||||
// plus a checksum for internal state consistency.
|
// plus a checksum for internal state consistency.
|
||||||
|
|
||||||
|
// ticcmd turning bits
|
||||||
|
#define TICCMD_REDUCE 16
|
||||||
|
|
||||||
|
// ticcmd latency mask
|
||||||
|
#define TICCMD_LATENCYMASK 0xFF
|
||||||
|
|
||||||
// bits in angleturn
|
// bits in angleturn
|
||||||
#define TICCMD_RECEIVED 1
|
#define TICCMD_RECEIVED (0x01) /* Actual tic recieved from client */
|
||||||
#define TICCMD_XY 2
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
SINT8 forwardmove; // -MAXPLMOVE to MAXPLMOVE (50)
|
SINT8 forwardmove; // -MAXPLMOVE to MAXPLMOVE (50)
|
||||||
SINT8 sidemove; // -MAXPLMOVE to MAXPLMOVE (50)
|
SINT8 sidemove; // -MAXPLMOVE to MAXPLMOVE (50)
|
||||||
INT16 angleturn; // <<16 for angle delta - saved as 1 byte into demos
|
INT16 angleturn; // << TICCMD_REDUCE for angle delta - saved as 1 byte into demos
|
||||||
INT16 aiming; // vertical aiming, see G_BuildTicCmd
|
INT16 aiming; // vertical aiming, see G_BuildTicCmd
|
||||||
UINT16 buttons;
|
UINT16 buttons;
|
||||||
INT16 driftturn; // SRB2Kart: Used for getting drift turn speed
|
INT16 driftturn; // SRB2Kart: Used for getting drift turn speed
|
||||||
|
|||||||
@@ -1,21 +1,75 @@
|
|||||||
# Declare dedicated interface sources
|
# Declare dedicated interface sources
|
||||||
|
|
||||||
target_sourcefile(c)
|
set(SRB2_DEDICATED_SOURCES
|
||||||
|
i_system.c
|
||||||
|
i_main.c
|
||||||
|
i_video.c
|
||||||
|
i_sound.c
|
||||||
|
i_threads.c
|
||||||
|
dosstr.c
|
||||||
|
endtxt.c
|
||||||
|
)
|
||||||
|
|
||||||
target_sources(SRB2SDL2 PRIVATE)
|
set(SRB2_DEDICATED_HEADERS
|
||||||
|
endtxt.h
|
||||||
|
)
|
||||||
|
|
||||||
|
source_group("Interface Code" FILES ${SRB2_DEDICATED_SOURCES} ${SRB2_DEDICATED_HEADERS})
|
||||||
|
|
||||||
|
set(SRB2_DEDICATED_TOTAL_SOURCES
|
||||||
|
${SRB2_CORE_SOURCES}
|
||||||
|
${SRB2_CORE_HEADERS}
|
||||||
|
${SRB2_PNG_SOURCES}
|
||||||
|
${SRB2_PNG_HEADERS}
|
||||||
|
${SRB2_CORE_RENDER_SOURCES}
|
||||||
|
${SRB2_CORE_GAME_SOURCES}
|
||||||
|
${SRB2_LUA_SOURCES}
|
||||||
|
${SRB2_LUA_HEADERS}
|
||||||
|
${SRB2_BLUA_SOURCES}
|
||||||
|
${SRB2_BLUA_HEADERS}
|
||||||
|
${SRB2_DEDICATED_SOURCES}
|
||||||
|
${SRB2_DEDICATED_HEADERS}
|
||||||
|
)
|
||||||
|
|
||||||
|
source_group("Main" FILES ${SRB2_CORE_SOURCES} ${SRB2_CORE_HEADERS})
|
||||||
|
source_group("Renderer" FILES ${SRB2_CORE_RENDER_SOURCES})
|
||||||
|
source_group("Game" FILES ${SRB2_CORE_GAME_SOURCES})
|
||||||
|
source_group("LUA" FILES ${SRB2_LUA_SOURCES} ${SRB2_LUA_HEADERS})
|
||||||
|
source_group("LUA\\Interpreter" FILES ${SRB2_BLUA_SOURCES} ${SRB2_BLUA_HEADERS})
|
||||||
|
|
||||||
if(${CMAKE_SYSTEM} MATCHES Windows)
|
if(${CMAKE_SYSTEM} MATCHES Windows)
|
||||||
target_sources(SRB2SDL2 PRIVATE
|
set(SRB2_DEDICATED_TOTAL_SOURCES ${SRB2_DEDICATED_TOTAL_SOURCES}
|
||||||
../win32/win_dbg.c
|
${CMAKE_SOURCE_DIR}/src/win32/win_dbg.c
|
||||||
../win32/Srb2win.rc)
|
${CMAKE_SOURCE_DIR}/src/win32/Srb2win.rc
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_executable(SRB2SDL2 MACOSX_BUNDLE WIN32 ${SRB2_DEDICATED_TOTAL_SOURCES})
|
||||||
|
|
||||||
if(${CMAKE_SYSTEM} MATCHES Windows)
|
if(${CMAKE_SYSTEM} MATCHES Windows)
|
||||||
set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME srb2legacy)
|
set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME srb2kartd)
|
||||||
elseif(${CMAKE_SYSTEM} MATCHES Linux)
|
elseif(${CMAKE_SYSTEM} MATCHES Linux)
|
||||||
set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME lsrb2dlegacy)
|
set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME lsrb2kartd)
|
||||||
else()
|
else()
|
||||||
set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME srb2legacy)
|
set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME srb2kartd)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(${CMAKE_SYSTEM} MATCHES Darwin)
|
||||||
|
find_library(CORE_FOUNDATION_LIBRARY "CoreFoundation")
|
||||||
|
target_link_libraries(SRB2SDL2 PRIVATE
|
||||||
|
${CORE_FOUNDATION_LIBRARY}
|
||||||
|
)
|
||||||
|
set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}")
|
||||||
|
|
||||||
|
# Configure the app bundle icon and plist properties
|
||||||
|
target_sources(SRB2SDL2 PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/macosx/Srb2mac.icns")
|
||||||
|
set_target_properties(SRB2SDL2 PROPERTIES
|
||||||
|
MACOSX_BUNDLE_ICON_FILE "Srb2mac"
|
||||||
|
MACOSX_BUNDLE_BUNDLE_NAME "Sonic Robo Blast 2"
|
||||||
|
MACOSX_BUNDLE_BUNDLE_VERSION ${SRB2_VERSION}
|
||||||
|
|
||||||
|
RESOURCE "${CMAKE_CURRENT_SOURCE_DIR}/macosx/Srb2mac.icns"
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(${CMAKE_SYSTEM} MATCHES Darwin)
|
if(${CMAKE_SYSTEM} MATCHES Darwin)
|
||||||
@@ -24,25 +78,27 @@ if(${CMAKE_SYSTEM} MATCHES Darwin)
|
|||||||
${CORE_LIB}
|
${CORE_LIB}
|
||||||
${PNG_LIBRARIES}
|
${PNG_LIBRARIES}
|
||||||
${ZLIB_LIBRARIES}
|
${ZLIB_LIBRARIES}
|
||||||
|
${CURL_LIBRARIES}
|
||||||
)
|
)
|
||||||
set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}")
|
set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}")
|
||||||
else()
|
else()
|
||||||
target_link_libraries(SRB2SDL2 PRIVATE
|
target_link_libraries(SRB2SDL2 PRIVATE
|
||||||
${PNG_LIBRARIES}
|
${PNG_LIBRARIES}
|
||||||
${ZLIB_LIBRARIES}
|
${ZLIB_LIBRARIES}
|
||||||
|
${CURL_LIBRARIES}
|
||||||
)
|
)
|
||||||
|
|
||||||
if(${CMAKE_SYSTEM} MATCHES Linux)
|
if(${CMAKE_SYSTEM} MATCHES Linux)
|
||||||
target_link_libraries(SRB2SDL2 PRIVATE
|
target_link_libraries(SRB2SDL2 PRIVATE
|
||||||
m
|
m
|
||||||
rt
|
rt
|
||||||
|
pthread
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#target_link_libraries(SRB2SDL2 PRIVATE SRB2Core)
|
if(${SRB2_HAVE_LIBBACKTRACE})
|
||||||
|
target_link_libraries(SRB2SDL2 PRIVATE ${LIBBACKTRACE_LIBRARIES})
|
||||||
set_target_properties(SRB2SDL2 PROPERTIES VERSION ${SRB2_VERSION})
|
endif()
|
||||||
|
|
||||||
if(${CMAKE_SYSTEM} MATCHES Windows)
|
if(${CMAKE_SYSTEM} MATCHES Windows)
|
||||||
target_link_libraries(SRB2SDL2 PRIVATE
|
target_link_libraries(SRB2SDL2 PRIVATE
|
||||||
@@ -60,20 +116,35 @@ target_include_directories(SRB2SDL2 PRIVATE
|
|||||||
|
|
||||||
target_compile_definitions(SRB2SDL2 PRIVATE
|
target_compile_definitions(SRB2SDL2 PRIVATE
|
||||||
-DDEDICATED
|
-DDEDICATED
|
||||||
|
-DHAVE_THREADS
|
||||||
)
|
)
|
||||||
|
|
||||||
## strip debug symbols into separate file when using gcc
|
if(SRB2_CONFIG_LTO AND NOT SRB2_CONFIG_DEBUGMODE)
|
||||||
if(CMAKE_COMPILER_IS_GNUCC)
|
set_property(TARGET SRB2SDL2 PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
|
||||||
if(${CMAKE_BUILD_TYPE} MATCHES Debug)
|
|
||||||
message(STATUS "Will make separate debug symbols in *.debug")
|
|
||||||
add_custom_command(TARGET SRB2SDL2 POST_BUILD
|
|
||||||
COMMAND ${OBJCOPY} --only-keep-debug $<TARGET_FILE:SRB2SDL2> $<TARGET_FILE:SRB2SDL2>.debug
|
|
||||||
COMMAND ${OBJCOPY} --strip-debug $<TARGET_FILE:SRB2SDL2>
|
|
||||||
COMMAND ${OBJCOPY} --add-gnu-debuglink=$<TARGET_FILE_NAME:SRB2SDL2>.debug $<TARGET_FILE:SRB2SDL2>
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(SRB2_CONFIG_ASAN)
|
||||||
|
target_compile_options(SRB2SDL2 PRIVATE -fsanitize=address)
|
||||||
|
target_link_options(SRB2SDL2 PRIVATE -fsanitize=address)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(SRB2_CONFIG_UBSAN)
|
||||||
|
target_compile_options(SRB2SDL2 PRIVATE -fsanitize=undefined)
|
||||||
|
target_link_options(SRB2SDL2 PRIVATE -fsanitize=undefined)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
## strip debug symbols into separate file when using gcc
|
||||||
|
# if(CMAKE_COMPILER_IS_GNUCC)
|
||||||
|
# if(${CMAKE_BUILD_TYPE} MATCHES Debug)
|
||||||
|
# message(STATUS "Will make separate debug symbols in *.debug")
|
||||||
|
# add_custom_command(TARGET SRB2SDL2 POST_BUILD
|
||||||
|
# COMMAND ${OBJCOPY} --only-keep-debug $<TARGET_FILE:SRB2SDL2> $<TARGET_FILE:SRB2SDL2>.debug
|
||||||
|
# COMMAND ${OBJCOPY} --strip-debug $<TARGET_FILE:SRB2SDL2>
|
||||||
|
# COMMAND ${OBJCOPY} --add-gnu-debuglink=$<TARGET_FILE_NAME:SRB2SDL2>.debug $<TARGET_FILE:SRB2SDL2>
|
||||||
|
# )
|
||||||
|
# endif()
|
||||||
|
# endif()
|
||||||
|
|
||||||
#### Installation ####
|
#### Installation ####
|
||||||
if(${CMAKE_SYSTEM} MATCHES Darwin)
|
if(${CMAKE_SYSTEM} MATCHES Darwin)
|
||||||
install(TARGETS SRB2SDL2
|
install(TARGETS SRB2SDL2
|
||||||
|
|||||||
@@ -2,6 +2,5 @@ i_system.c
|
|||||||
i_main.c
|
i_main.c
|
||||||
i_video.c
|
i_video.c
|
||||||
i_sound.c
|
i_sound.c
|
||||||
i_threads.c
|
|
||||||
dosstr.c
|
dosstr.c
|
||||||
endtxt.c
|
endtxt.c
|
||||||
+87
-157
@@ -127,16 +127,32 @@ typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T);
|
|||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
// Locations for searching the srb2.srb
|
/// Locations to directly check for srb2.srb in
|
||||||
|
const char *wadDefaultPaths[] = {
|
||||||
#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)
|
#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)
|
||||||
#define DEFAULTWADLOCATION1 "/usr/local/share/games/SRB2Kart"
|
"/usr/local/share/games/SRB2Kart",
|
||||||
#define DEFAULTWADLOCATION2 "/usr/local/games/SRB2Kart"
|
"/usr/local/games/SRB2Kart",
|
||||||
#define DEFAULTWADLOCATION3 "/usr/share/games/SRB2Kart"
|
"/usr/share/games/SRB2Kart",
|
||||||
#define DEFAULTWADLOCATION4 "/usr/games/SRB2Kart"
|
"/usr/games/SRB2Kart",
|
||||||
#define DEFAULTSEARCHPATH1 "/usr/local/games"
|
#elif defined (_WIN32)
|
||||||
#define DEFAULTSEARCHPATH2 "/usr/games"
|
"c:\\games\\srb2kart",
|
||||||
#define DEFAULTSEARCHPATH3 "/usr/local"
|
"\\games\\srb2kart",
|
||||||
#endif
|
#endif
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
// Folders to recurse through looking for srb2.srb
|
||||||
|
const char *wadSearchPaths[] = {
|
||||||
|
#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)
|
||||||
|
"/usr/local/games",
|
||||||
|
"/usr/games",
|
||||||
|
"/usr/local",
|
||||||
|
#elif defined (_WIN32)
|
||||||
|
"c:\\games",
|
||||||
|
"\\games",
|
||||||
|
#endif
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
/** \brief WAD file to look for
|
/** \brief WAD file to look for
|
||||||
*/
|
*/
|
||||||
@@ -151,6 +167,8 @@ static char returnWadPath[256];
|
|||||||
#include "../i_video.h"
|
#include "../i_video.h"
|
||||||
#include "../i_sound.h"
|
#include "../i_sound.h"
|
||||||
#include "../i_system.h"
|
#include "../i_system.h"
|
||||||
|
#include "../i_time.h"
|
||||||
|
#include "../i_net.h"
|
||||||
#include "../screen.h" //vid.WndParent
|
#include "../screen.h" //vid.WndParent
|
||||||
#include "../d_net.h"
|
#include "../d_net.h"
|
||||||
#include "../g_game.h"
|
#include "../g_game.h"
|
||||||
@@ -162,10 +180,6 @@ static char returnWadPath[256];
|
|||||||
|
|
||||||
#include "../m_argv.h"
|
#include "../m_argv.h"
|
||||||
|
|
||||||
#ifdef MAC_ALERT
|
|
||||||
#include "macosx/mac_alert.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "../d_main.h"
|
#include "../d_main.h"
|
||||||
|
|
||||||
#if !defined(NOMUMBLE) && defined(HAVE_MUMBLE)
|
#if !defined(NOMUMBLE) && defined(HAVE_MUMBLE)
|
||||||
@@ -180,8 +194,6 @@ UINT8 keyboard_started = false;
|
|||||||
|
|
||||||
#ifdef HAVE_TERMIOS
|
#ifdef HAVE_TERMIOS
|
||||||
// TERMIOS console code from Quake3: thank you!
|
// TERMIOS console code from Quake3: thank you!
|
||||||
boolean stdin_active = true;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
size_t cursor;
|
size_t cursor;
|
||||||
@@ -683,11 +695,7 @@ void I_JoyScale4(void)
|
|||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
void I_ShutdownJoystick(void)
|
void I_ShutdownJoystick(UINT8 index)
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void I_GetJoystickEvents(UINT8 index)
|
|
||||||
{
|
{
|
||||||
(void)index;
|
(void)index;
|
||||||
}
|
}
|
||||||
@@ -808,20 +816,23 @@ static void I_SetupMumble(void)
|
|||||||
void I_UpdateMumble(const mobj_t *mobj, const listener_t listener)
|
void I_UpdateMumble(const mobj_t *mobj, const listener_t listener)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_MUMBLE
|
#ifdef HAVE_MUMBLE
|
||||||
double angle;
|
float angle;
|
||||||
fixed_t anglef;
|
fixed_t anglef;
|
||||||
|
|
||||||
if (!mumble)
|
if (!mumble)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (mumble->uiVersion != 2) {
|
if (mumble->uiVersion != 2)
|
||||||
wcsncpy(mumble->name, L"SRB2Kart "VERSIONSTRINGW, 256);
|
{
|
||||||
|
wcsncpy(mumble->name, L"SRB2Kart " VERSIONSTRINGW, 256);
|
||||||
wcsncpy(mumble->description, L"Sonic Robo Blast 2 Kart with integrated Mumble Link support.", 2048);
|
wcsncpy(mumble->description, L"Sonic Robo Blast 2 Kart with integrated Mumble Link support.", 2048);
|
||||||
mumble->uiVersion = 2;
|
mumble->uiVersion = 2;
|
||||||
}
|
}
|
||||||
mumble->uiTick++;
|
mumble->uiTick++;
|
||||||
|
|
||||||
if (!netgame || gamestate != GS_LEVEL) { // Zero out, but never delink.
|
// Zero out, but never delink.
|
||||||
|
if (!netgame || gamestate != GS_LEVEL)
|
||||||
|
{
|
||||||
mumble->fAvatarPosition[0] = mumble->fAvatarPosition[1] = mumble->fAvatarPosition[2] = 0.0f;
|
mumble->fAvatarPosition[0] = mumble->fAvatarPosition[1] = mumble->fAvatarPosition[2] = 0.0f;
|
||||||
mumble->fAvatarFront[0] = 1.0f;
|
mumble->fAvatarFront[0] = 1.0f;
|
||||||
mumble->fAvatarFront[1] = mumble->fAvatarFront[2] = 0.0f;
|
mumble->fAvatarFront[1] = mumble->fAvatarFront[2] = 0.0f;
|
||||||
@@ -838,31 +849,34 @@ void I_UpdateMumble(const mobj_t *mobj, const listener_t listener)
|
|||||||
mumble->context_len = (UINT32)(p - mumble->context);
|
mumble->context_len = (UINT32)(p - mumble->context);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mobj) {
|
if (mobj)
|
||||||
mumble->fAvatarPosition[0] = FIXED_TO_FLOAT(mobj->x) / MUMBLEUNIT;
|
{
|
||||||
mumble->fAvatarPosition[1] = FIXED_TO_FLOAT(mobj->z) / MUMBLEUNIT;
|
mumble->fAvatarPosition[0] = FixedToFloat(mobj->x) / MUMBLEUNIT;
|
||||||
mumble->fAvatarPosition[2] = FIXED_TO_FLOAT(mobj->y) / MUMBLEUNIT;
|
mumble->fAvatarPosition[1] = FixedToFloat(mobj->z) / MUMBLEUNIT;
|
||||||
|
mumble->fAvatarPosition[2] = FixedToFloat(mobj->y) / MUMBLEUNIT;
|
||||||
|
|
||||||
anglef = AngleFixed(mobj->angle);
|
anglef = AngleFixed(mobj->angle);
|
||||||
angle = FIXED_TO_FLOAT(anglef)*DEG2RAD;
|
angle = (float)(FixedToFloat(anglef) * DEG2RAD);
|
||||||
mumble->fAvatarFront[0] = (float)cos(angle);
|
mumble->fAvatarFront[0] = cosf(angle);
|
||||||
mumble->fAvatarFront[1] = 0.0f;
|
mumble->fAvatarFront[1] = 0.0f;
|
||||||
mumble->fAvatarFront[2] = (float)sin(angle);
|
mumble->fAvatarFront[2] = sinf(angle);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
mumble->fAvatarPosition[0] = mumble->fAvatarPosition[1] = mumble->fAvatarPosition[2] = 0.0f;
|
mumble->fAvatarPosition[0] = mumble->fAvatarPosition[1] = mumble->fAvatarPosition[2] = 0.0f;
|
||||||
mumble->fAvatarFront[0] = 1.0f;
|
mumble->fAvatarFront[0] = 1.0f;
|
||||||
mumble->fAvatarFront[1] = mumble->fAvatarFront[2] = 0.0f;
|
mumble->fAvatarFront[1] = mumble->fAvatarFront[2] = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
mumble->fCameraPosition[0] = FIXED_TO_FLOAT(listener.x) / MUMBLEUNIT;
|
mumble->fCameraPosition[0] = FixedToFloat(listener.x) / MUMBLEUNIT;
|
||||||
mumble->fCameraPosition[1] = FIXED_TO_FLOAT(listener.z) / MUMBLEUNIT;
|
mumble->fCameraPosition[1] = FixedToFloat(listener.z) / MUMBLEUNIT;
|
||||||
mumble->fCameraPosition[2] = FIXED_TO_FLOAT(listener.y) / MUMBLEUNIT;
|
mumble->fCameraPosition[2] = FixedToFloat(listener.y) / MUMBLEUNIT;
|
||||||
|
|
||||||
anglef = AngleFixed(listener.angle);
|
anglef = AngleFixed(listener.angle);
|
||||||
angle = FIXED_TO_FLOAT(anglef)*DEG2RAD;
|
angle = (float)(FixedToFloat(anglef) * DEG2RAD);
|
||||||
mumble->fCameraFront[0] = (float)cos(angle);
|
mumble->fCameraFront[0] = cosf(angle);
|
||||||
mumble->fCameraFront[1] = 0.0f;
|
mumble->fCameraFront[1] = 0.0f;
|
||||||
mumble->fCameraFront[2] = (float)sin(angle);
|
mumble->fCameraFront[2] = sinf(angle);
|
||||||
#else
|
#else
|
||||||
(void)mobj;
|
(void)mobj;
|
||||||
(void)listener;
|
(void)listener;
|
||||||
@@ -1367,8 +1381,8 @@ INT32 I_StartupSystem(void)
|
|||||||
I_Fork();
|
I_Fork();
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_start_threads();
|
I_StartThreads();
|
||||||
I_AddExitFunc(I_stop_threads);
|
I_AddExitFunc(I_StopThreads);
|
||||||
#endif
|
#endif
|
||||||
I_RegisterSignals();
|
I_RegisterSignals();
|
||||||
#ifndef NOMUMBLE
|
#ifndef NOMUMBLE
|
||||||
@@ -1417,20 +1431,6 @@ death:
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_WaitVBL(INT32 count)
|
|
||||||
{
|
|
||||||
count = 1;
|
|
||||||
I_Sleep(count);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I_BeginRead(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void I_EndRead(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// I_Error
|
// I_Error
|
||||||
//
|
//
|
||||||
@@ -1821,16 +1821,23 @@ static const char *searchWad(const char *searchDir)
|
|||||||
return tempsw;
|
return tempsw;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(tempsw, WADKEYWORD2);
|
|
||||||
fstemp = filesearch(tempsw, searchDir, NULL, true, 20);
|
|
||||||
if (fstemp == FS_FOUND)
|
|
||||||
{
|
|
||||||
pathonly(tempsw);
|
|
||||||
return tempsw;
|
|
||||||
}
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CHECKWADPATH(ret) \
|
||||||
|
do { \
|
||||||
|
I_OutputMsg(",%s", ret); \
|
||||||
|
if (isWadPathOk(ret)) \
|
||||||
|
return ret; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define SEARCHWAD(str) \
|
||||||
|
do { \
|
||||||
|
WadPath = searchWad(str); \
|
||||||
|
if (WadPath) \
|
||||||
|
return WadPath; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/** \brief go through all possible paths and look for srb2.srb
|
/** \brief go through all possible paths and look for srb2.srb
|
||||||
|
|
||||||
\return path to srb2.srb if any
|
\return path to srb2.srb if any
|
||||||
@@ -1839,6 +1846,7 @@ static const char *locateWad(void)
|
|||||||
{
|
{
|
||||||
const char *envstr;
|
const char *envstr;
|
||||||
const char *WadPath;
|
const char *WadPath;
|
||||||
|
int i;
|
||||||
|
|
||||||
I_OutputMsg("SRB2WADDIR");
|
I_OutputMsg("SRB2WADDIR");
|
||||||
// does SRB2WADDIR exist?
|
// does SRB2WADDIR exist?
|
||||||
@@ -1846,132 +1854,51 @@ static const char *locateWad(void)
|
|||||||
return envstr;
|
return envstr;
|
||||||
|
|
||||||
#ifndef NOCWD
|
#ifndef NOCWD
|
||||||
I_OutputMsg(",.");
|
|
||||||
// examine current dir
|
// examine current dir
|
||||||
strcpy(returnWadPath, ".");
|
strcpy(returnWadPath, ".");
|
||||||
|
I_OutputMsg(",%s", returnWadPath);
|
||||||
if (isWadPathOk(returnWadPath))
|
if (isWadPathOk(returnWadPath))
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef NOHOME
|
||||||
#ifdef DEFAULTDIR
|
#ifdef DEFAULTDIR
|
||||||
I_OutputMsg(",HOME/" DEFAULTDIR);
|
I_OutputMsg(",HOME/" DEFAULTDIR);
|
||||||
// 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);
|
sprintf(returnWadPath, "%s" PATHSEP DEFAULTDIR, envstr);
|
||||||
if (isWadPathOk(returnWadPath))
|
CHECKWADPATH(returnWadPath);
|
||||||
return returnWadPath;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef CMAKECONFIG
|
|
||||||
#ifndef NDEBUG
|
|
||||||
I_OutputMsg(","CMAKE_ASSETS_DIR);
|
|
||||||
strcpy(returnWadPath, CMAKE_ASSETS_DIR);
|
|
||||||
if (isWadPathOk(returnWadPath))
|
|
||||||
{
|
|
||||||
return returnWadPath;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
OSX_GetResourcesPath(returnWadPath);
|
OSX_GetResourcesPath(returnWadPath);
|
||||||
I_OutputMsg(",%s", returnWadPath);
|
CHECKWADPATH(returnWadPath);
|
||||||
if (isWadPathOk(returnWadPath))
|
|
||||||
{
|
|
||||||
return returnWadPath;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// examine default dirs
|
// examine default dirs
|
||||||
#ifdef DEFAULTWADLOCATION1
|
for (i = 0; wadDefaultPaths[i]; i++)
|
||||||
I_OutputMsg(","DEFAULTWADLOCATION1);
|
|
||||||
strcpy(returnWadPath, DEFAULTWADLOCATION1);
|
|
||||||
if (isWadPathOk(returnWadPath))
|
|
||||||
return returnWadPath;
|
|
||||||
#endif
|
|
||||||
#ifdef DEFAULTWADLOCATION2
|
|
||||||
I_OutputMsg(","DEFAULTWADLOCATION2);
|
|
||||||
strcpy(returnWadPath, DEFAULTWADLOCATION2);
|
|
||||||
if (isWadPathOk(returnWadPath))
|
|
||||||
return returnWadPath;
|
|
||||||
#endif
|
|
||||||
#ifdef DEFAULTWADLOCATION3
|
|
||||||
I_OutputMsg(","DEFAULTWADLOCATION3);
|
|
||||||
strcpy(returnWadPath, DEFAULTWADLOCATION3);
|
|
||||||
if (isWadPathOk(returnWadPath))
|
|
||||||
return returnWadPath;
|
|
||||||
#endif
|
|
||||||
#ifdef DEFAULTWADLOCATION4
|
|
||||||
I_OutputMsg(","DEFAULTWADLOCATION4);
|
|
||||||
strcpy(returnWadPath, DEFAULTWADLOCATION4);
|
|
||||||
if (isWadPathOk(returnWadPath))
|
|
||||||
return returnWadPath;
|
|
||||||
#endif
|
|
||||||
#ifdef DEFAULTWADLOCATION5
|
|
||||||
I_OutputMsg(","DEFAULTWADLOCATION5);
|
|
||||||
strcpy(returnWadPath, DEFAULTWADLOCATION5);
|
|
||||||
if (isWadPathOk(returnWadPath))
|
|
||||||
return returnWadPath;
|
|
||||||
#endif
|
|
||||||
#ifdef DEFAULTWADLOCATION6
|
|
||||||
I_OutputMsg(","DEFAULTWADLOCATION6);
|
|
||||||
strcpy(returnWadPath, DEFAULTWADLOCATION6);
|
|
||||||
if (isWadPathOk(returnWadPath))
|
|
||||||
return returnWadPath;
|
|
||||||
#endif
|
|
||||||
#ifdef DEFAULTWADLOCATION7
|
|
||||||
I_OutputMsg(","DEFAULTWADLOCATION7);
|
|
||||||
strcpy(returnWadPath, DEFAULTWADLOCATION7);
|
|
||||||
if (isWadPathOk(returnWadPath))
|
|
||||||
return returnWadPath;
|
|
||||||
#endif
|
|
||||||
#ifndef NOHOME
|
|
||||||
// find in $HOME
|
|
||||||
I_OutputMsg(",HOME/" DEFAULTDIR);
|
|
||||||
if ((envstr = I_GetEnv("HOME")) != NULL)
|
|
||||||
{
|
{
|
||||||
char *tmp = malloc(strlen(envstr) + sizeof(PATHSEP) + sizeof(DEFAULTDIR));
|
strcpy(returnWadPath, wadDefaultPaths[i]);
|
||||||
strcpy(tmp, envstr);
|
CHECKWADPATH(returnWadPath);
|
||||||
strcat(tmp, PATHSEP);
|
|
||||||
strcat(tmp, DEFAULTDIR);
|
|
||||||
WadPath = searchWad(tmp);
|
|
||||||
free(tmp);
|
|
||||||
if (WadPath)
|
|
||||||
return WadPath;
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#ifdef DEFAULTSEARCHPATH1
|
// search paths
|
||||||
// find in /usr/local
|
for (i = 0; wadSearchPaths[i]; i++)
|
||||||
I_OutputMsg(", in:"DEFAULTSEARCHPATH1);
|
{
|
||||||
WadPath = searchWad(DEFAULTSEARCHPATH1);
|
I_OutputMsg(", in:%s", wadSearchPaths[i]);
|
||||||
if (WadPath)
|
SEARCHWAD(wadSearchPaths[i]);
|
||||||
return WadPath;
|
}
|
||||||
#endif
|
|
||||||
#ifdef DEFAULTSEARCHPATH2
|
|
||||||
// find in /usr/games
|
|
||||||
I_OutputMsg(", in:"DEFAULTSEARCHPATH2);
|
|
||||||
WadPath = searchWad(DEFAULTSEARCHPATH2);
|
|
||||||
if (WadPath)
|
|
||||||
return WadPath;
|
|
||||||
#endif
|
|
||||||
#ifdef DEFAULTSEARCHPATH3
|
|
||||||
// find in ???
|
|
||||||
I_OutputMsg(", in:"DEFAULTSEARCHPATH3);
|
|
||||||
WadPath = searchWad(DEFAULTSEARCHPATH3);
|
|
||||||
if (WadPath)
|
|
||||||
return WadPath;
|
|
||||||
#endif
|
|
||||||
// if nothing was found
|
// if nothing was found
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *I_LocateWad(void)
|
const char *I_LocateWad(void)
|
||||||
{
|
{
|
||||||
const char *waddir;
|
const char *waddir = NULL;
|
||||||
|
|
||||||
I_OutputMsg("Looking for WADs in: ");
|
I_OutputMsg("Looking for WADs in: ");
|
||||||
waddir = locateWad();
|
waddir = locateWad();
|
||||||
@@ -1981,12 +1908,15 @@ 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);
|
||||||
SetCurrentDirectoryA(waddir);
|
SetCurrentDirectoryA(waddir);
|
||||||
#else
|
#else
|
||||||
|
waddir = realpath(waddir, NULL);
|
||||||
if (waddir == NULL || chdir(waddir) == -1)
|
if (waddir == NULL || chdir(waddir) == -1)
|
||||||
I_OutputMsg("Couldn't change working directory\n");
|
I_OutputMsg("Couldn't change working directory\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return waddir;
|
return waddir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -65,13 +65,6 @@ void I_OsPolling(void)
|
|||||||
I_GetConsoleEvents();
|
I_GetConsoleEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// I_UpdateNoBlit
|
|
||||||
//
|
|
||||||
void I_UpdateNoBlit(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// I_FinishUpdate
|
// I_FinishUpdate
|
||||||
//
|
//
|
||||||
@@ -155,7 +148,10 @@ boolean I_UseNativeKeyboard(void)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void I_HandleControllerHatRepeat(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void I_SetBorderlessWindow(void)
|
void I_SetBorderlessWindow(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
+3
-3
@@ -47,9 +47,9 @@
|
|||||||
|
|
||||||
// Free slot names
|
// Free slot names
|
||||||
// The crazy word-reading stuff uses these.
|
// The crazy word-reading stuff uses these.
|
||||||
char *FREE_STATES[NUMSTATEFREESLOTS];
|
char *FREE_STATES[NUMSTATEFREESLOTS] = {};
|
||||||
char *FREE_MOBJS[NUMMOBJFREESLOTS];
|
char *FREE_MOBJS[NUMMOBJFREESLOTS] = {};
|
||||||
UINT8 used_spr[(NUMSPRITEFREESLOTS / 8) + 1]; // Bitwise flag for sprite freeslot in use! I would use ceil() here if I could, but it only saves 1 byte of memory anyway.
|
UINT8 used_spr[(NUMSPRITEFREESLOTS / 8) + 1] = {}; // Bitwise flag for sprite freeslot in use! I would use ceil() here if I could, but it only saves 1 byte of memory anyway.
|
||||||
|
|
||||||
#define initfreeslots() {\
|
#define initfreeslots() {\
|
||||||
memset(FREE_STATES,0,sizeof(char *) * NUMSTATEFREESLOTS);\
|
memset(FREE_STATES,0,sizeof(char *) * NUMSTATEFREESLOTS);\
|
||||||
|
|||||||
+44
-24
@@ -19,25 +19,18 @@
|
|||||||
// This should actually be in the makefile,
|
// This should actually be in the makefile,
|
||||||
// but I can't stand that gibberish. D:
|
// but I can't stand that gibberish. D:
|
||||||
#define SOUND_DUMMY 0
|
#define SOUND_DUMMY 0
|
||||||
#define SOUND_SDL 1
|
#define SOUND_MIXER 1
|
||||||
#define SOUND_MIXER 2
|
|
||||||
|
|
||||||
#ifndef SOUND
|
#ifndef SOUND
|
||||||
#ifdef HAVE_SDL
|
#ifdef HAVE_SDL
|
||||||
|
|
||||||
// Use Mixer interface?
|
// Use Mixer interface?
|
||||||
#ifdef HAVE_MIXER
|
#ifdef HAVE_MIXER
|
||||||
#define SOUND SOUND_MIXER
|
#define SOUND SOUND_MIXER
|
||||||
|
#else
|
||||||
|
#define SOUND SOUND_DUMMY
|
||||||
#endif
|
#endif
|
||||||
|
#else
|
||||||
// Use generic SDL interface.
|
#define SOUND SOUND_DUMMY
|
||||||
#ifndef SOUND
|
|
||||||
#define SOUND SOUND_SDL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else // No SDL.
|
|
||||||
// No more interfaces. :(
|
|
||||||
#define SOUND SOUND_DUMMY
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -47,22 +40,45 @@
|
|||||||
#define ASMCALL
|
#define ASMCALL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "doomtype.h"
|
#include "doomtype.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus /* Only when compiled as C++ */
|
||||||
|
#include <algorithm> /* std::min, std::max, std::sort, … */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
// Force libc++ to expose std::min/std::max even when <cmath> is included first (Apple clang quirk)
|
||||||
|
#ifndef _LIBCPP_ENABLE_CXX17_REMOVED_FEATURES
|
||||||
|
#define _LIBCPP_ENABLE_CXX17_REMOVED_FEATURES
|
||||||
|
#endif
|
||||||
|
#ifndef _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS
|
||||||
|
#define _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Optional: only try <version> if it actually exists (newer Xcode)
|
||||||
|
#if __has_include(<version>)
|
||||||
|
#include <version>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define _USE_MATH_DEFINES
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdarg>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstring>
|
||||||
|
#include <climits>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#else
|
||||||
|
#include <math.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define _USE_MATH_DEFINES // fixes M_PI errors in r_plane.c for Visual Studio
|
#include <limits.h>
|
||||||
#ifdef __cplusplus
|
|
||||||
#include <cmath>
|
|
||||||
#else
|
|
||||||
#include <math.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@@ -114,8 +130,8 @@ extern char logfilename[1024];
|
|||||||
#else
|
#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"
|
#define VERSIONSTRING "Saturn v9.2"
|
||||||
#define VERSIONSTRINGW L"Saturn v9"
|
#define VERSIONSTRINGW L"Saturn v9.2"
|
||||||
|
|
||||||
#define SATURN_TESTING // comment out for saturn release builds!
|
#define SATURN_TESTING // comment out for saturn release builds!
|
||||||
|
|
||||||
@@ -484,7 +500,7 @@ extern INT32 cv_debug;
|
|||||||
// Misc stuff for later...
|
// Misc stuff for later...
|
||||||
// =======================
|
// =======================
|
||||||
|
|
||||||
#define ANG2RAD(angle) ((float)((angle)*M_PI)/ANGLE_180)
|
#define ANG2RAD(angle) ((float)((angle)*M_PIf) / (float)ANGLE_180)
|
||||||
|
|
||||||
// Modifier key variables, accessible anywhere
|
// Modifier key variables, accessible anywhere
|
||||||
extern UINT8 shiftdown, ctrldown, altdown;
|
extern UINT8 shiftdown, ctrldown, altdown;
|
||||||
@@ -533,6 +549,10 @@ UINT32 quickncasehash (const char *p, size_t n)
|
|||||||
#define M_PIl 3.1415926535897932384626433832795029L
|
#define M_PIl 3.1415926535897932384626433832795029L
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef M_PIf
|
||||||
|
#define M_PIf 3.14159265f
|
||||||
|
#endif
|
||||||
|
|
||||||
// Floating point comparison epsilons from float.h
|
// Floating point comparison epsilons from float.h
|
||||||
#ifndef FLT_EPSILON
|
#ifndef FLT_EPSILON
|
||||||
#define FLT_EPSILON 1.1920928955078125e-7f
|
#define FLT_EPSILON 1.1920928955078125e-7f
|
||||||
|
|||||||
+1
-1
@@ -542,7 +542,7 @@ extern mapthing_t *redctfstarts[MAXPLAYERS]; // CTF
|
|||||||
#else
|
#else
|
||||||
#define DEBUGFILE
|
#define DEBUGFILE
|
||||||
#ifdef DEBUGFILE
|
#ifdef DEBUGFILE
|
||||||
#define DEBFILE(msg) { if (debugfile) { fputs(msg, debugfile); fflush(debugfile); } }
|
#define DEBFILE(msg) { if (UNLIKELY(debugfile)) { fputs(msg, debugfile); fflush(debugfile); } }
|
||||||
#else
|
#else
|
||||||
#define DEBFILE(msg) {}
|
#define DEBFILE(msg) {}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+11
-4
@@ -68,11 +68,13 @@ extern "C" {
|
|||||||
#define strnicmp(x,y,n) strncasecmp(x,y,n)
|
#define strnicmp(x,y,n) strncasecmp(x,y,n)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __cplusplus
|
char *nongnu_strcasestr(const char *in, const char *what);
|
||||||
char *strcasestr(const char *in, const char *what);
|
#ifndef _GNU_SOURCE
|
||||||
#define stristr strcasestr
|
#define strcasestr nongnu_strcasestr
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define stristr strcasestr
|
||||||
|
|
||||||
#if defined (macintosh) //|| defined (__APPLE__) //skip all boolean/Boolean crap
|
#if defined (macintosh) //|| defined (__APPLE__) //skip all boolean/Boolean crap
|
||||||
#define true 1
|
#define true 1
|
||||||
#define false 0
|
#define false 0
|
||||||
@@ -221,6 +223,8 @@ typedef int32_t boolean;
|
|||||||
|
|
||||||
#define FUNCNOINLINE __attribute__((noinline))
|
#define FUNCNOINLINE __attribute__((noinline))
|
||||||
|
|
||||||
|
#define FUNCWARNRV __attribute__((warn_unused_result))
|
||||||
|
|
||||||
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) // >= GCC 4.4
|
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) // >= GCC 4.4
|
||||||
#ifdef __i386__ // i386 only
|
#ifdef __i386__ // i386 only
|
||||||
#define FUNCTARGET(X) __attribute__ ((__target__ (X)))
|
#define FUNCTARGET(X) __attribute__ ((__target__ (X)))
|
||||||
@@ -266,6 +270,9 @@ typedef int32_t boolean;
|
|||||||
#ifndef FUNCTARGET
|
#ifndef FUNCTARGET
|
||||||
#define FUNCTARGET(x)
|
#define FUNCTARGET(x)
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef FUNCWARNRV
|
||||||
|
#define FUNCWARNRV
|
||||||
|
#endif
|
||||||
#ifndef ATTRPACK
|
#ifndef ATTRPACK
|
||||||
#define ATTRPACK
|
#define ATTRPACK
|
||||||
#endif
|
#endif
|
||||||
@@ -293,7 +300,7 @@ typedef struct
|
|||||||
UINT8 green;
|
UINT8 green;
|
||||||
UINT8 blue;
|
UINT8 blue;
|
||||||
UINT8 alpha;
|
UINT8 alpha;
|
||||||
} byteColor_t;
|
} ATTRPACK byteColor_t;
|
||||||
|
|
||||||
union FColorRGBA
|
union FColorRGBA
|
||||||
{
|
{
|
||||||
|
|||||||
+33
-41
@@ -166,8 +166,8 @@ static void F_SkyScroll(INT32 scrollspeed)
|
|||||||
patch_t *pat, *pat2;
|
patch_t *pat, *pat2;
|
||||||
INT32 anim2 = 0;
|
INT32 anim2 = 0;
|
||||||
|
|
||||||
pat = W_CachePatchName("TITLEBG1", PU_PATCH_LOWPRIORITY);
|
pat = W_CachePatchName("TITLEBG1", PU_PATCH);
|
||||||
pat2 = W_CachePatchName("TITLEBG2", PU_PATCH_LOWPRIORITY);
|
pat2 = W_CachePatchName("TITLEBG2", PU_PATCH);
|
||||||
|
|
||||||
w = (vid.scaledwidth << FRACBITS);
|
w = (vid.scaledwidth << FRACBITS);
|
||||||
|
|
||||||
@@ -208,16 +208,13 @@ static void F_SkyScroll(INT32 scrollspeed)
|
|||||||
INT32 intro_scenenum = 0;
|
INT32 intro_scenenum = 0;
|
||||||
INT32 intro_curtime = 0;
|
INT32 intro_curtime = 0;
|
||||||
|
|
||||||
const char *introtext[NUMINTROSCENES];
|
const char *introtext[NUMINTROSCENES] = {};
|
||||||
|
|
||||||
static tic_t introscenetime[NUMINTROSCENES] =
|
static tic_t introscenetime[NUMINTROSCENES] =
|
||||||
{
|
{
|
||||||
4*TICRATE, // KART KR(eW
|
4*TICRATE, // KART KR(eW
|
||||||
};
|
};
|
||||||
|
|
||||||
// custom intros
|
|
||||||
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer);
|
|
||||||
|
|
||||||
void F_StartIntro(void)
|
void F_StartIntro(void)
|
||||||
{
|
{
|
||||||
if (gamestate)
|
if (gamestate)
|
||||||
@@ -257,26 +254,21 @@ void F_StartIntro(void)
|
|||||||
//
|
//
|
||||||
void F_IntroDrawer(void)
|
void F_IntroDrawer(void)
|
||||||
{
|
{
|
||||||
boolean highres = false;
|
|
||||||
INT32 cx = 8, cy = 128;
|
INT32 cx = 8, cy = 128;
|
||||||
patch_t *background = NULL;
|
patch_t *background = NULL;
|
||||||
INT32 bgxoffs = 0;
|
INT32 bgxoffs = 0;
|
||||||
|
|
||||||
|
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 120);
|
||||||
|
|
||||||
// DRAW A FULL PIC INSTEAD OF FLAT!
|
// DRAW A FULL PIC INSTEAD OF FLAT!
|
||||||
if (intro_scenenum == 0)
|
if (intro_scenenum == 0)
|
||||||
{
|
{
|
||||||
background = W_CachePatchName("KARTKREW", PU_PATCH_LOWPRIORITY);
|
background = W_CachePatchName("KARTKREW", PU_PATCH);
|
||||||
highres = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 120);
|
if (background)
|
||||||
|
{
|
||||||
if (background)
|
|
||||||
{
|
|
||||||
if (highres)
|
|
||||||
V_DrawSmallScaledPatch(bgxoffs, 0, 0, background);
|
V_DrawSmallScaledPatch(bgxoffs, 0, 0, background);
|
||||||
else
|
}
|
||||||
V_DrawScaledPatch(bgxoffs, 0, 0, background);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
W_UnlockCachedPatch(background);
|
W_UnlockCachedPatch(background);
|
||||||
@@ -324,6 +316,7 @@ void F_IntroTicker(void)
|
|||||||
D_StartTitle();
|
D_StartTitle();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (finalecount == 8)
|
if (finalecount == 8)
|
||||||
S_StartSound(NULL, sfx_vroom);
|
S_StartSound(NULL, sfx_vroom);
|
||||||
else if (finalecount == 47)
|
else if (finalecount == 47)
|
||||||
@@ -626,7 +619,6 @@ void F_StartCredits(void)
|
|||||||
timetonext = 2*TICRATE;
|
timetonext = 2*TICRATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void F_CreditDrawer(void)
|
void F_CreditDrawer(void)
|
||||||
{
|
{
|
||||||
UINT16 i;
|
UINT16 i;
|
||||||
@@ -661,22 +653,23 @@ void F_CreditDrawer(void)
|
|||||||
// Draw credits text on top
|
// Draw credits text on top
|
||||||
for (i = 0; credits[i]; i++)
|
for (i = 0; credits[i]; i++)
|
||||||
{
|
{
|
||||||
switch(credits[i][0])
|
switch (credits[i][0])
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
y += 80<<FRACBITS;
|
y += 80<<FRACBITS;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
if (y>>FRACBITS > -20)
|
if (y>>FRACBITS > -20)
|
||||||
V_DrawCreditString((160 - (V_CreditStringWidth(&credits[i][1])>>1))<<FRACBITS, y, 0, &credits[i][1]);
|
V_DrawCreditString((160 - (V_CreditStringWidth(&credits[i][1])>>1))<<FRACBITS, y, 0, &credits[i][1]);
|
||||||
y += 30<<FRACBITS;
|
y += 30<<FRACBITS;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (y>>FRACBITS > -10)
|
if (y>>FRACBITS > -10)
|
||||||
V_DrawStringAtFixed(32<<FRACBITS, y, V_ALLOWLOWERCASE, credits[i]);
|
V_DrawStringAtFixed(32<<FRACBITS, y, V_ALLOWLOWERCASE, credits[i]);
|
||||||
y += 12<<FRACBITS;
|
y += 12<<FRACBITS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((y>>FRACBITS) * vid.dup) > vid.height)
|
if (((y>>FRACBITS) * vid.dup) > vid.height)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -701,7 +694,7 @@ void F_CreditTicker(void)
|
|||||||
// Draw credits text on top
|
// Draw credits text on top
|
||||||
for (i = 0; credits[i]; i++)
|
for (i = 0; credits[i]; i++)
|
||||||
{
|
{
|
||||||
switch(credits[i][0])
|
switch (credits[i][0])
|
||||||
{
|
{
|
||||||
case 0: y += 80<<FRACBITS; break;
|
case 0: y += 80<<FRACBITS; break;
|
||||||
case 1: y += 30<<FRACBITS; break;
|
case 1: y += 30<<FRACBITS; break;
|
||||||
@@ -979,10 +972,10 @@ void F_StartTitleScreen(void)
|
|||||||
demoDelayLeft = demoDelayTime;
|
demoDelayLeft = demoDelayTime;
|
||||||
demoIdleLeft = demoIdleTime;
|
demoIdleLeft = demoIdleTime;
|
||||||
|
|
||||||
ttbanner = W_CachePatchName("TTKBANNR", PU_PATCH_LOWPRIORITY);
|
ttbanner = W_CachePatchName("TTKBANNR", PU_PATCH);
|
||||||
ttkart = W_CachePatchName("TTKART", PU_PATCH_LOWPRIORITY);
|
ttkart = W_CachePatchName("TTKART", PU_PATCH);
|
||||||
ttcheckers = W_CachePatchName("TTCHECK", PU_PATCH_LOWPRIORITY);
|
ttcheckers = W_CachePatchName("TTCHECK", PU_PATCH);
|
||||||
ttkflash = W_CachePatchName("TTKFLASH", PU_PATCH_LOWPRIORITY);
|
ttkflash = W_CachePatchName("TTKFLASH", PU_PATCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
// (no longer) De-Demo'd Title Screen
|
// (no longer) De-Demo'd Title Screen
|
||||||
@@ -1179,9 +1172,7 @@ void F_StartWaitingPlayers(void)
|
|||||||
randskin = M_RandomKey(numskins);
|
randskin = M_RandomKey(numskins);
|
||||||
boolean waithires = skins[randskin].flags && SF_HIRES;
|
boolean waithires = skins[randskin].flags && SF_HIRES;
|
||||||
|
|
||||||
if (waitcolormap)
|
Z_Free(waitcolormap);
|
||||||
Z_Free(waitcolormap);
|
|
||||||
|
|
||||||
waitcolormap = R_GetTranslationColormap(randskin, skins[randskin].prefcolor, 0);
|
waitcolormap = R_GetTranslationColormap(randskin, skins[randskin].prefcolor, 0);
|
||||||
|
|
||||||
if (waithires)
|
if (waithires)
|
||||||
@@ -1325,7 +1316,7 @@ boolean F_ContinueResponder(event_t *event)
|
|||||||
keypressed = true;
|
keypressed = true;
|
||||||
imcontinuing = true;
|
imcontinuing = true;
|
||||||
continuetime = TICRATE;
|
continuetime = TICRATE;
|
||||||
S_StartSound(0, sfx_itemup);
|
S_StartSound(NULL, sfx_itemup);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1419,6 +1410,7 @@ void F_EndCutScene(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// custom intros
|
||||||
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer)
|
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer)
|
||||||
{
|
{
|
||||||
if (!cutscenes[cutscenenum])
|
if (!cutscenes[cutscenenum])
|
||||||
|
|||||||
+8
-5
@@ -98,7 +98,8 @@ static fixed_t paldiv;
|
|||||||
* \param lump Lump name to get data from
|
* \param lump Lump name to get data from
|
||||||
* \return fademask_t for lump
|
* \return fademask_t for lump
|
||||||
*/
|
*/
|
||||||
static fademask_t *F_GetFadeMask(UINT8 masknum, UINT8 scrnnum) {
|
static fademask_t *F_GetFadeMask(UINT8 masknum, UINT8 scrnnum)
|
||||||
|
{
|
||||||
static char lumpname[9] = "FADEmmss";
|
static char lumpname[9] = "FADEmmss";
|
||||||
static fademask_t fm = {NULL,0,0,0,0,0};
|
static fademask_t fm = {NULL,0,0,0,0,0};
|
||||||
lumpnum_t lumpnum;
|
lumpnum_t lumpnum;
|
||||||
@@ -148,6 +149,7 @@ static fademask_t *F_GetFadeMask(UINT8 masknum, UINT8 scrnnum) {
|
|||||||
case 0: // end marker (not bad!, but still need clearing)
|
case 0: // end marker (not bad!, but still need clearing)
|
||||||
goto freemask;
|
goto freemask;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lsize != fm.size)
|
if (lsize != fm.size)
|
||||||
fm.mask = Z_Realloc(fm.mask, lsize, PU_STATIC, NULL);
|
fm.mask = Z_Realloc(fm.mask, lsize, PU_STATIC, NULL);
|
||||||
fm.size = lsize;
|
fm.size = lsize;
|
||||||
@@ -361,6 +363,7 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
|
|||||||
{
|
{
|
||||||
// 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++);
|
||||||
|
|
||||||
if (!fmask)
|
if (!fmask)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -377,20 +380,19 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
|
|||||||
HWR_DoWipe(wipetype, wipeframe-1); // send in the wipe type and wipeframe because we need to cache the graphic
|
HWR_DoWipe(wipetype, wipeframe-1); // send in the wipe type and wipeframe because we need to cache the graphic
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
if (rendermode != render_none) //this allows F_RunWipe to be called in dedicated servers
|
if (rendermode != render_none) // this allows F_RunWipe to be called in dedicated servers
|
||||||
F_DoWipe(fmask);
|
F_DoWipe(fmask);
|
||||||
|
|
||||||
I_OsPolling();
|
I_OsPolling();
|
||||||
I_UpdateNoBlit();
|
|
||||||
|
|
||||||
if (rendermode != render_none && drawMenu)
|
if (rendermode != render_none && drawMenu)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
M_Drawer(); // menu is drawn even on top of wipes
|
M_Drawer(); // menu is drawn even on top of wipes
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -401,6 +403,7 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
|
|||||||
|
|
||||||
NetKeepAlive(); // Update the network so we don't cause timeouts
|
NetKeepAlive(); // Update the network so we don't cause timeouts
|
||||||
}
|
}
|
||||||
|
|
||||||
WipeInAction = false;
|
WipeInAction = false;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
+2
-2
@@ -10,7 +10,7 @@ FUNCINLINE static ATTRINLINE boolean fasticmp(const char *s, const char *c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// case-sensitive of the above
|
// case-sensitive of the above
|
||||||
FUNCINLINE static ATTRINLINE boolean fastcmp(const char *s, const char *c)
|
FUNCINLINE static ATTRINLINE PUREFUNC boolean fastcmp(const char *s, const char *c)
|
||||||
{
|
{
|
||||||
for (; *s && *s == *c; s++, c++) ;
|
for (; *s && *s == *c; s++, c++) ;
|
||||||
return (*s == *c); // make sure both strings ended
|
return (*s == *c); // make sure both strings ended
|
||||||
@@ -18,7 +18,7 @@ FUNCINLINE static ATTRINLINE boolean fastcmp(const char *s, const char *c)
|
|||||||
|
|
||||||
// length-limited of the above
|
// length-limited of the above
|
||||||
// only true if both strings are at least l characters long AND match, case-sensitively!
|
// only true if both strings are at least l characters long AND match, case-sensitively!
|
||||||
FUNCINLINE static ATTRINLINE boolean fastncmp(const char *s, const char *c, UINT16 l)
|
FUNCINLINE static ATTRINLINE PUREFUNC boolean fastncmp(const char *s, const char *c, UINT16 l)
|
||||||
{
|
{
|
||||||
for (; *s && *s == *c && --l; s++, c++) ;
|
for (; *s && *s == *c && --l; s++, c++) ;
|
||||||
return !l; // make sure you reached the end
|
return !l; // make sure you reached the end
|
||||||
|
|||||||
+16
-16
@@ -44,16 +44,16 @@ consvar_t cv_addons_search_case = {"addons_search_case", "No", CV_SAVE, CV_YesNo
|
|||||||
static CV_PossibleValue_t addons_search_type_cons_t[] = {{0, "Start"}, {1, "Anywhere"}, {0, NULL}};
|
static CV_PossibleValue_t addons_search_type_cons_t[] = {{0, "Start"}, {1, "Anywhere"}, {0, NULL}};
|
||||||
consvar_t cv_addons_search_type = {"addons_search_type", "Anywhere", CV_SAVE, addons_search_type_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_addons_search_type = {"addons_search_type", "Anywhere", CV_SAVE, addons_search_type_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
char menupath[MAXFILEPATH];
|
char menupath[MAXFILEPATH] = {};
|
||||||
size_t menupathindex[menudepth];
|
size_t menupathindex[menudepth] = {};
|
||||||
size_t menudepthleft = menudepth;
|
size_t menudepthleft = menudepth;
|
||||||
|
|
||||||
char menusearchbuf[MAXSTRINGLENGTH+1];
|
char menusearchbuf[MAXSTRINGLENGTH+1];
|
||||||
textinput_t menusearch;
|
textinput_t menusearch = {};
|
||||||
|
|
||||||
char **dirmenu, **coredirmenu; // core only local for this file
|
char **dirmenu = NULL, **coredirmenu = NULL; // core only local for this file
|
||||||
size_t sizedirmenu, sizecoredirmenu; // ditto
|
size_t sizedirmenu = 0, sizecoredirmenu = 0; // ditto
|
||||||
size_t dir_on[menudepth];
|
size_t dir_on[menudepth] = {};
|
||||||
UINT8 refreshdirmenu = 0;
|
UINT8 refreshdirmenu = 0;
|
||||||
char *refreshdirname = NULL;
|
char *refreshdirname = NULL;
|
||||||
|
|
||||||
@@ -92,7 +92,6 @@ INT32 pathisdirectory(const char *path)
|
|||||||
// skip those folders, they will not have any addons
|
// skip those folders, they will not have any addons
|
||||||
static const char *exclude_paths[] = {
|
static const char *exclude_paths[] = {
|
||||||
"logs",
|
"logs",
|
||||||
"luafiles",
|
|
||||||
"replay",
|
"replay",
|
||||||
"mdls",
|
"mdls",
|
||||||
"gifs",
|
"gifs",
|
||||||
@@ -272,10 +271,13 @@ static boolean filemenucmp(char *haystack, char *needle)
|
|||||||
{
|
{
|
||||||
static char localhaystack[128];
|
static char localhaystack[128];
|
||||||
strlcpy(localhaystack, haystack, 128);
|
strlcpy(localhaystack, haystack, 128);
|
||||||
|
|
||||||
if (!cv_addons_search_case.value)
|
if (!cv_addons_search_case.value)
|
||||||
strupr(localhaystack);
|
strupr(localhaystack);
|
||||||
|
|
||||||
if (cv_addons_search_type.value)
|
if (cv_addons_search_type.value)
|
||||||
return (strstr(localhaystack, needle) != 0);
|
return (strstr(localhaystack, needle) != NULL);
|
||||||
|
|
||||||
return (!strncmp(localhaystack, needle, menusearch.length));
|
return (!strncmp(localhaystack, needle, menusearch.length));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,8 +317,7 @@ void closefilemenu(boolean validsize)
|
|||||||
coredirmenu = NULL;
|
coredirmenu = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (refreshdirname)
|
Z_Free(refreshdirname);
|
||||||
Z_Free(refreshdirname);
|
|
||||||
refreshdirname = NULL;
|
refreshdirname = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -344,8 +345,7 @@ void searchfilemenu(char *tempname)
|
|||||||
|
|
||||||
if (!menusearch.length)
|
if (!menusearch.length)
|
||||||
{
|
{
|
||||||
if (dirmenu)
|
Z_Free(dirmenu);
|
||||||
Z_Free(dirmenu);
|
|
||||||
dirmenu = coredirmenu;
|
dirmenu = coredirmenu;
|
||||||
sizedirmenu = sizecoredirmenu;
|
sizedirmenu = sizecoredirmenu;
|
||||||
|
|
||||||
@@ -387,8 +387,8 @@ void searchfilemenu(char *tempname)
|
|||||||
I_Error("searchfilemenu(): could not create \"No results...\".");
|
I_Error("searchfilemenu(): could not create \"No results...\".");
|
||||||
sizedirmenu = 1;
|
sizedirmenu = 1;
|
||||||
dir_on[menudepthleft] = 0;
|
dir_on[menudepthleft] = 0;
|
||||||
if (tempname)
|
Z_Free(tempname);
|
||||||
Z_Free(tempname);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -503,8 +503,8 @@ boolean preparefilemenu(boolean samedepth, boolean replayhut)
|
|||||||
{
|
{
|
||||||
closedir(dirhandle);
|
closedir(dirhandle);
|
||||||
closefilemenu(false);
|
closefilemenu(false);
|
||||||
if (tempname)
|
Z_Free(tempname);
|
||||||
Z_Free(tempname);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+158
-88
@@ -55,6 +55,8 @@
|
|||||||
#include "k_stats.h" // SRB2kart
|
#include "k_stats.h" // SRB2kart
|
||||||
#include "r_fps.h" // frame interpolation/uncapped
|
#include "r_fps.h" // frame interpolation/uncapped
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#ifdef HAVE_DISCORDRPC
|
#ifdef HAVE_DISCORDRPC
|
||||||
#include "discord.h"
|
#include "discord.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -74,7 +76,7 @@ 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?
|
||||||
static char demoname[128];
|
static char demoname[128];
|
||||||
savebuffer_t demobuf = {0};
|
savebuffer_t demobuf = {};
|
||||||
static UINT8 *demotime_p, *demoinfo_p;
|
static UINT8 *demotime_p, *demoinfo_p;
|
||||||
static UINT8 *demoend;
|
static UINT8 *demoend;
|
||||||
static UINT8 demoflags;
|
static UINT8 demoflags;
|
||||||
@@ -246,10 +248,12 @@ void G_ReadDemoExtraData(void)
|
|||||||
{
|
{
|
||||||
extradata = READUINT8(demobuf.p);
|
extradata = READUINT8(demobuf.p);
|
||||||
|
|
||||||
|
player_t *player = &players[p];
|
||||||
|
|
||||||
if (extradata & DXD_RESPAWN)
|
if (extradata & DXD_RESPAWN)
|
||||||
{
|
{
|
||||||
if (players[p].mo)
|
if (player->mo)
|
||||||
P_DamageMobj(players[p].mo, NULL, NULL, DMG_INSTAKILL); // Is this how this should work..?
|
P_DamageMobj(player->mo, NULL, NULL, DMG_INSTAKILL); // Is this how this should work..?
|
||||||
}
|
}
|
||||||
|
|
||||||
if (extradata & DXD_SKIN)
|
if (extradata & DXD_SKIN)
|
||||||
@@ -264,11 +268,11 @@ void G_ReadDemoExtraData(void)
|
|||||||
kartspeed = READUINT8(demobuf.p);
|
kartspeed = READUINT8(demobuf.p);
|
||||||
kartweight = READUINT8(demobuf.p);
|
kartweight = READUINT8(demobuf.p);
|
||||||
|
|
||||||
if (!fasticmp(skins[players[p].skin].name, name))
|
if (!fasticmp(skins[player->skin].name, name))
|
||||||
FindClosestSkinForStats(p, kartspeed, kartweight);
|
FindClosestSkinForStats(p, kartspeed, kartweight);
|
||||||
|
|
||||||
players[p].kartspeed = kartspeed;
|
player->kartspeed = kartspeed;
|
||||||
players[p].kartweight = kartweight;
|
player->kartweight = kartweight;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (extradata & DXD_COLOR)
|
if (extradata & DXD_COLOR)
|
||||||
@@ -279,9 +283,9 @@ void G_ReadDemoExtraData(void)
|
|||||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
for (i = 0; i < MAXSKINCOLORS; i++)
|
||||||
if (fasticmp(KartColor_Names[i], name)) // SRB2kart
|
if (fasticmp(KartColor_Names[i], name)) // SRB2kart
|
||||||
{
|
{
|
||||||
players[p].skincolor = i;
|
player->skincolor = i;
|
||||||
if (players[p].mo)
|
if (player->mo)
|
||||||
players[p].mo->color = i;
|
player->mo->color = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -300,17 +304,17 @@ void G_ReadDemoExtraData(void)
|
|||||||
switch (extradata)
|
switch (extradata)
|
||||||
{
|
{
|
||||||
case DXD_PST_PLAYING:
|
case DXD_PST_PLAYING:
|
||||||
players[p].pflags |= PF_WANTSTOJOIN; // fuck you
|
player->pflags |= PF_WANTSTOJOIN; // fuck you
|
||||||
break;
|
break;
|
||||||
case DXD_PST_SPECTATING:
|
case DXD_PST_SPECTATING:
|
||||||
players[p].pflags &= ~PF_WANTSTOJOIN; // double-fuck you
|
player->pflags &= ~PF_WANTSTOJOIN; // double-fuck you
|
||||||
|
|
||||||
if (!playeringame[p])
|
if (!playeringame[p])
|
||||||
{
|
{
|
||||||
CL_ClearPlayer(p);
|
CL_ClearPlayer(p);
|
||||||
playeringame[p] = true;
|
playeringame[p] = true;
|
||||||
G_AddPlayer(p);
|
G_AddPlayer(p);
|
||||||
players[p].spectator = true;
|
player->spectator = true;
|
||||||
|
|
||||||
// There's likely an off-by-one error in timing recording or playback of joins. This hacks around it so I don't have to find out where that is. \o/
|
// There's likely an off-by-one error in timing recording or playback of joins. This hacks around it so I don't have to find out where that is. \o/
|
||||||
if (oldcmd[p].forwardmove)
|
if (oldcmd[p].forwardmove)
|
||||||
@@ -318,11 +322,11 @@ void G_ReadDemoExtraData(void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
players[p].spectator = true;
|
player->spectator = true;
|
||||||
if (players[p].mo)
|
if (player->mo)
|
||||||
P_DamageMobj(players[p].mo, NULL, NULL, DMG_INSTAKILL);
|
P_DamageMobj(player->mo, NULL, NULL, DMG_INSTAKILL);
|
||||||
else
|
else
|
||||||
players[p].playerstate = PST_REBORN;
|
player->playerstate = PST_REBORN;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DXD_PST_LEFT:
|
case DXD_PST_LEFT:
|
||||||
@@ -330,7 +334,7 @@ void G_ReadDemoExtraData(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
G_ResetViews();
|
G_ResetViews(false); // dont reset our freecam pls thx!
|
||||||
|
|
||||||
// maybe these are necessary?
|
// maybe these are necessary?
|
||||||
if (G_BattleGametype())
|
if (G_BattleGametype())
|
||||||
@@ -484,6 +488,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
|||||||
|
|
||||||
G_CopyTiccmd(cmd, &oldcmd[playernum], 1);
|
G_CopyTiccmd(cmd, &oldcmd[playernum], 1);
|
||||||
|
|
||||||
|
// 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
|
if (((players[displayplayers[0]].mo && players[displayplayers[0]].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
|
||||||
@@ -1131,7 +1136,29 @@ void G_GhostTicker(void)
|
|||||||
for (g = ghosts, p = NULL; g; g = g->next)
|
for (g = ghosts, p = NULL; g; g = g->next)
|
||||||
{
|
{
|
||||||
// Skip normal demo data.
|
// Skip normal demo data.
|
||||||
UINT8 ziptic = READUINT8(g->p);
|
UINT8 ziptic;
|
||||||
|
|
||||||
|
if (g->done)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ziptic = READUINT8(g->p);
|
||||||
|
|
||||||
|
fadeghost:
|
||||||
|
// Demo ends after ghost data.
|
||||||
|
if (ziptic == DEMOMARKER)
|
||||||
|
{
|
||||||
|
g->mo->momx = g->mo->momy = g->mo->momz = 0;
|
||||||
|
|
||||||
|
g->done = true;
|
||||||
|
if (p)
|
||||||
|
{
|
||||||
|
p->next = g->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef DEMO_COMPAT_100
|
#ifdef DEMO_COMPAT_100
|
||||||
if (g->version != 0x0001)
|
if (g->version != 0x0001)
|
||||||
@@ -1139,8 +1166,14 @@ void G_GhostTicker(void)
|
|||||||
#endif
|
#endif
|
||||||
while (ziptic != DW_END) // Get rid of extradata stuff
|
while (ziptic != DW_END) // Get rid of extradata stuff
|
||||||
{
|
{
|
||||||
if (ziptic == 0) // Only support player 0 info for now
|
if (ziptic < MAXPLAYERS)
|
||||||
{
|
{
|
||||||
|
#ifdef DEVELOP
|
||||||
|
UINT8 playerid = ziptic;
|
||||||
|
#endif
|
||||||
|
// We want to skip *any* player extradata because some demos have extradata for bogus players,
|
||||||
|
// but if there is tic data later for those players *then* we'll consider it invalid.
|
||||||
|
|
||||||
ziptic = READUINT8(g->p);
|
ziptic = READUINT8(g->p);
|
||||||
|
|
||||||
if (ziptic & DXD_SKIN)
|
if (ziptic & DXD_SKIN)
|
||||||
@@ -1152,13 +1185,26 @@ void G_GhostTicker(void)
|
|||||||
if (ziptic & DXD_NAME)
|
if (ziptic & DXD_NAME)
|
||||||
g->p += 16; // yea
|
g->p += 16; // yea
|
||||||
|
|
||||||
if (ziptic & DXD_PLAYSTATE && READUINT8(g->p) != DXD_PST_PLAYING)
|
if (ziptic & DXD_PLAYSTATE)
|
||||||
I_Error("Ghost is not a record attack ghost"); //@TODO lmao don't blow up like this
|
{
|
||||||
|
UINT8 playstate = READUINT8(g->p);
|
||||||
|
if (playstate != DXD_PST_PLAYING)
|
||||||
|
{
|
||||||
|
#ifdef DEVELOP
|
||||||
|
CONS_Alert(CONS_WARNING, "Ghost demo has non-playing playstate for player %d\n", playerid + 1);
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (ziptic == DW_RNG)
|
else if (ziptic == DW_RNG)
|
||||||
|
{
|
||||||
g->p += 4; // RNG seed
|
g->p += 4; // RNG seed
|
||||||
|
}
|
||||||
else
|
else
|
||||||
I_Error("Ghost is not a record attack ghost"); //@TODO lmao don't blow up like this
|
{
|
||||||
|
I_Error("Ghost is not a record attack ghost DXD (ziptic = %u)", ziptic); //@TODO lmao don't blow up like this
|
||||||
|
}
|
||||||
|
|
||||||
ziptic = READUINT8(g->p);
|
ziptic = READUINT8(g->p);
|
||||||
}
|
}
|
||||||
@@ -1181,7 +1227,7 @@ void G_GhostTicker(void)
|
|||||||
if (ziptic & ZT_DRIFT)
|
if (ziptic & ZT_DRIFT)
|
||||||
g->p += 2;
|
g->p += 2;
|
||||||
if (ziptic & ZT_LATENCY)
|
if (ziptic & ZT_LATENCY)
|
||||||
g->p += 1;
|
g->p++;
|
||||||
|
|
||||||
// Grab ghost data.
|
// Grab ghost data.
|
||||||
ziptic = READUINT8(g->p);
|
ziptic = READUINT8(g->p);
|
||||||
@@ -1190,10 +1236,12 @@ void G_GhostTicker(void)
|
|||||||
if (g->version != 0x0001)
|
if (g->version != 0x0001)
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
if (ziptic == DEMOMARKER) // Had to end early for some reason
|
||||||
|
goto fadeghost;
|
||||||
if (ziptic == 0xFF)
|
if (ziptic == 0xFF)
|
||||||
goto skippedghosttic; // Didn't write ghost info this frame
|
goto skippedghosttic; // Didn't write ghost info this frame
|
||||||
else if (ziptic != 0)
|
if (ziptic != 0)
|
||||||
I_Error("Ghost is not a record attack ghost"); //@TODO lmao don't blow up like this
|
I_Error("Ghost is not a record attack ghost ZIPTIC"); //@TODO lmao don't blow up like this
|
||||||
ziptic = READUINT8(g->p);
|
ziptic = READUINT8(g->p);
|
||||||
#ifdef DEMO_COMPAT_100
|
#ifdef DEMO_COMPAT_100
|
||||||
}
|
}
|
||||||
@@ -1364,7 +1412,7 @@ void G_GhostTicker(void)
|
|||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
if (READUINT8(g->p) != 0xFF) // Make sure there isn't other ghost data here.
|
if (READUINT8(g->p) != 0xFF) // Make sure there isn't other ghost data here.
|
||||||
I_Error("Ghost is not a record attack ghost"); //@TODO lmao don't blow up like this
|
I_Error("Ghost is not a record attack ghost GHOSTEND"); //@TODO lmao don't blow up like this
|
||||||
#ifdef DEMO_COMPAT_100
|
#ifdef DEMO_COMPAT_100
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -1384,20 +1432,6 @@ skippedghosttic:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Demo ends after ghost data.
|
|
||||||
if (*g->p == DEMOMARKER)
|
|
||||||
{
|
|
||||||
g->mo->momx = g->mo->momy = g->mo->momz = 0;
|
|
||||||
|
|
||||||
if (p)
|
|
||||||
p->next = g->next;
|
|
||||||
else
|
|
||||||
ghosts = g->next;
|
|
||||||
|
|
||||||
Z_Free(g);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = g;
|
p = g;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1592,7 +1626,7 @@ void G_ConfirmRewind(tic_t rewindtime)
|
|||||||
displayplayers[2] = olddp3;
|
displayplayers[2] = olddp3;
|
||||||
displayplayers[3] = olddp4;
|
displayplayers[3] = olddp4;
|
||||||
R_ExecuteSetViewSize();
|
R_ExecuteSetViewSize();
|
||||||
G_ResetViews();
|
G_ResetViews(true);
|
||||||
|
|
||||||
for (i = splitscreen; i >= 0; i--)
|
for (i = splitscreen; i >= 0; i--)
|
||||||
P_ResetCamera(&players[displayplayers[i]], &camera[i]);
|
P_ResetCamera(&players[displayplayers[i]], &camera[i]);
|
||||||
@@ -2369,49 +2403,69 @@ static long G_GetCreationTime(char *filepath)
|
|||||||
|
|
||||||
static char *G_GetDemoDate(menudemo_t *pdemo)
|
static char *G_GetDemoDate(menudemo_t *pdemo)
|
||||||
{
|
{
|
||||||
char *datetime;
|
char *endPos = NULL;
|
||||||
datetime = malloc(sizeof(pdemo->date)); // mallocma balls
|
static char datetime[11];
|
||||||
|
|
||||||
// no mallocma balls... :c
|
|
||||||
if (!datetime)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
time_t file_time = 0;
|
time_t file_time = 0;
|
||||||
|
const char *format = NULL;
|
||||||
|
struct tm *tm_buf = NULL;
|
||||||
|
CLEANUP(pfree) char *filename = NULL;
|
||||||
|
|
||||||
// get le filepath
|
// get le filepath
|
||||||
char *filename;
|
|
||||||
filename = strdup(pdemo->filepath);
|
filename = strdup(pdemo->filepath);
|
||||||
|
|
||||||
#if defined (_WIN32)
|
|
||||||
if (!filename)
|
if (!filename)
|
||||||
{
|
{
|
||||||
// if we cant get a filename try just getting the file create time
|
#if defined (_WIN32)
|
||||||
|
// if we cant get a filename try just getting the file creation time
|
||||||
file_time = G_GetCreationTime(pdemo->filepath);
|
file_time = G_GetCreationTime(pdemo->filepath);
|
||||||
goto skipfilenametime;
|
goto skipfilenametime;
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
if (!filename)
|
|
||||||
{
|
|
||||||
free(datetime);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// get the actual filename Zzz...
|
// get the actual filename Zzz...
|
||||||
nameonly(filename);
|
nameonly(filename);
|
||||||
|
|
||||||
// convert it to long Zzz....
|
// the first 10 characters of a replay name usually is a unix timestamp
|
||||||
file_time = strtol(filename, NULL, 10);
|
|
||||||
free(filename); // dont need this anymore a
|
// not long enough to contain a valid timestamp
|
||||||
|
if (strlen(filename) < 10)
|
||||||
|
{
|
||||||
|
#if defined (_WIN32)
|
||||||
|
// try to get file creation time
|
||||||
|
file_time = G_GetCreationTime(pdemo->filepath);
|
||||||
|
goto skipfilenametime;
|
||||||
|
#else
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef AVOID_ERRNO
|
||||||
|
errno = 0;
|
||||||
|
#endif
|
||||||
|
// get the timestamp as actual numbers lul
|
||||||
|
file_time = strtol(filename, &endPos, 10);
|
||||||
|
|
||||||
|
if (endPos == filename // Empty string
|
||||||
|
#ifndef AVOID_ERRNO
|
||||||
|
|| errno == ERANGE // Number out-of-range
|
||||||
|
#endif
|
||||||
|
|| file_time < 0) // Number is not positive
|
||||||
|
{
|
||||||
|
#if defined (_WIN32)
|
||||||
|
// just try and get the creation time then
|
||||||
|
file_time = G_GetCreationTime(pdemo->filepath);
|
||||||
|
#else
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#if defined (_WIN32)
|
#if defined (_WIN32)
|
||||||
skipfilenametime:
|
skipfilenametime:
|
||||||
#endif
|
#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
|
||||||
struct tm *tm_buf = NULL;
|
|
||||||
tm_buf = localtime(&file_time);
|
tm_buf = localtime(&file_time);
|
||||||
|
|
||||||
// cant believe we ended up in 1970
|
// cant believe we ended up in 1970
|
||||||
@@ -2424,14 +2478,10 @@ skipfilenametime:
|
|||||||
tm_buf = localtime(&file_time);
|
tm_buf = localtime(&file_time);
|
||||||
|
|
||||||
if (tm_buf == NULL || tm_buf->tm_year <= 110)
|
if (tm_buf == NULL || tm_buf->tm_year <= 110)
|
||||||
{
|
|
||||||
free(datetime);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
goto gotcreationtime;
|
goto gotcreationtime;
|
||||||
#else
|
#else
|
||||||
free(datetime);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -2440,17 +2490,27 @@ skipfilenametime:
|
|||||||
gotcreationtime:
|
gotcreationtime:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *format;
|
|
||||||
|
|
||||||
// US ppl are special (:
|
// US ppl are special (:
|
||||||
if (cv_demodateformat.value == 2)
|
if (cv_demodateformat.value == 2)
|
||||||
format = "%m.%d.%Y";
|
format = "%m.%d.%Y";
|
||||||
else if (cv_demodateformat.value == 1)
|
else if (cv_demodateformat.value == 1)
|
||||||
format = "%d.%m.%Y";
|
format = "%d.%m.%Y";
|
||||||
else
|
else
|
||||||
format = strstr(setlocale(LC_TIME, NULL), "en_US") ? "%m.%d.%Y" : "%d.%m.%Y";
|
{
|
||||||
|
const char *locale = setlocale(LC_TIME, NULL);
|
||||||
|
|
||||||
strftime(datetime, sizeof(pdemo->date), format, tm_buf);
|
if (locale == NULL)
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return datetime;
|
return datetime;
|
||||||
}
|
}
|
||||||
@@ -2459,6 +2519,7 @@ void G_LoadDemoTitle(menudemo_t *pdemo)
|
|||||||
{
|
{
|
||||||
UINT8 infobuffer[96], *info_p;
|
UINT8 infobuffer[96], *info_p;
|
||||||
UINT16 pdemoversion;
|
UINT16 pdemoversion;
|
||||||
|
char *demodate = NULL;
|
||||||
size_t count;
|
size_t count;
|
||||||
|
|
||||||
FILE *handle = fopen(pdemo->filepath, "rb");
|
FILE *handle = fopen(pdemo->filepath, "rb");
|
||||||
@@ -2497,13 +2558,13 @@ void G_LoadDemoTitle(menudemo_t *pdemo)
|
|||||||
memcpy(pdemo->title, info_p, 64);
|
memcpy(pdemo->title, info_p, 64);
|
||||||
|
|
||||||
// demo date
|
// demo date
|
||||||
char *demodate;
|
|
||||||
demodate = G_GetDemoDate(pdemo);
|
demodate = G_GetDemoDate(pdemo);
|
||||||
|
|
||||||
if (demodate)
|
if (demodate)
|
||||||
strncpy(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:
|
||||||
@@ -2536,7 +2597,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
UINT8 i, p;
|
UINT8 i, p;
|
||||||
lumpnum_t l;
|
lumpnum_t l;
|
||||||
char skin[17], color[17], *n;
|
char skin[17], color[17], *n;
|
||||||
CLEANUP(Z_Pfree) char *pdemoname;
|
CLEANUP(Z_Pfree) char *pdemoname = NULL;
|
||||||
UINT8 version, subversion;
|
UINT8 version, subversion;
|
||||||
UINT32 randseed;
|
UINT32 randseed;
|
||||||
char msg[1024];
|
char msg[1024];
|
||||||
@@ -2580,7 +2641,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
snprintf(msg, 1024, M_GetText("Failed to read file '%s'.\n"), defdemoname);
|
snprintf(msg, 1024, 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, NULL, MM_NOTHING);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2592,7 +2653,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
snprintf(msg, 1024, M_GetText("Failed to read lump '%s'.\n"), defdemoname);
|
snprintf(msg, 1024, 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, NULL, MM_NOTHING);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else // it's an internal demo
|
else // it's an internal demo
|
||||||
@@ -2612,7 +2673,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s is not a SRB2Kart replay file.\n"), pdemoname);
|
snprintf(msg, 1024, 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, NULL, MM_NOTHING);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2638,7 +2699,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
default:
|
default:
|
||||||
snprintf(msg, 1024, M_GetText("%s is an incompatible replay format and cannot be played.\n"), pdemoname);
|
snprintf(msg, 1024, 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, NULL, MM_NOTHING);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2649,7 +2710,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s is the wrong type of recording and cannot be played.\n"), pdemoname);
|
snprintf(msg, 1024, 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, NULL, MM_NOTHING);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2666,7 +2727,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s is an alpha multiplayer replay and cannot be played.\n"), pdemoname);
|
snprintf(msg, 1024, 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, NULL, MM_NOTHING);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2724,7 +2785,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
CONS_Alert(CONS_ERROR, "%s", msg);
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
|
|
||||||
if (!CON_Ready()) // In the console they'll just see the notice there! No point pulling them out.
|
if (!CON_Ready()) // In the console they'll just see the notice there! No point pulling them out.
|
||||||
M_StartMessage(msg, NULL, MM_NOTHING);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
|
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
return;
|
return;
|
||||||
@@ -2762,6 +2823,16 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
#endif
|
#endif
|
||||||
demobuf.p += 4; // Extrainfo location
|
demobuf.p += 4; // Extrainfo location
|
||||||
|
|
||||||
|
// ...*map* not loaded?
|
||||||
|
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);
|
||||||
|
CONS_Alert(CONS_ERROR, "%s", msg);
|
||||||
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
|
G_ResetDemoPlayback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef DEMO_COMPAT_100
|
#ifdef DEMO_COMPAT_100
|
||||||
if (demo.version == 0x0001)
|
if (demo.version == 0x0001)
|
||||||
{
|
{
|
||||||
@@ -2789,7 +2860,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s features a character that is not currently loaded.\n"), pdemoname);
|
snprintf(msg, 1024, 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, NULL, MM_NOTHING);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2799,7 +2870,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s features a course that is not currently loaded.\n"), pdemoname);
|
snprintf(msg, 1024, 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, NULL, MM_NOTHING);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2822,7 +2893,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s contains no data to be played.\n"), pdemoname);
|
snprintf(msg, 1024, 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, NULL, MM_NOTHING);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2860,7 +2931,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s contains no data to be played.\n"), pdemoname);
|
snprintf(msg, 1024, 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, NULL, MM_NOTHING);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2909,7 +2980,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s is a Record Attack replay with spectators, and is thus invalid.\n"), pdemoname);
|
snprintf(msg, 1024, 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, NULL, MM_NOTHING);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2921,7 +2992,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||||||
{
|
{
|
||||||
snprintf(msg, 1024, M_GetText("%s is a Record Attack replay with multiple players, and is thus invalid.\n"), pdemoname);
|
snprintf(msg, 1024, 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, NULL, MM_NOTHING);
|
M_StartMessage(msg, M_ReturnToTitleFromError, MM_EVENTHANDLER);
|
||||||
G_ResetDemoPlayback();
|
G_ResetDemoPlayback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -3531,7 +3602,6 @@ void G_FreeGhosts(void)
|
|||||||
ghosts = NULL;
|
ghosts = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
boolean G_CheckDemoStatus(void)
|
boolean G_CheckDemoStatus(void)
|
||||||
{
|
{
|
||||||
G_FreeGhosts();
|
G_FreeGhosts();
|
||||||
|
|||||||
@@ -149,6 +149,7 @@ typedef struct demoghost {
|
|||||||
UINT8 checksum[16];
|
UINT8 checksum[16];
|
||||||
UINT8 *buffer, *p, color;
|
UINT8 *buffer, *p, color;
|
||||||
UINT16 version;
|
UINT16 version;
|
||||||
|
boolean done;
|
||||||
mobj_t oldmo, *mo;
|
mobj_t oldmo, *mo;
|
||||||
struct demoghost *next;
|
struct demoghost *next;
|
||||||
} demoghost;
|
} demoghost;
|
||||||
|
|||||||
+111
-45
@@ -132,7 +132,7 @@ UINT8 skincolor_bluering = SKINCOLOR_STEEL;
|
|||||||
tic_t countdowntimer = 0;
|
tic_t countdowntimer = 0;
|
||||||
boolean countdowntimeup = false;
|
boolean countdowntimeup = false;
|
||||||
|
|
||||||
cutscene_t *cutscenes[128];
|
cutscene_t *cutscenes[128] = {};
|
||||||
|
|
||||||
INT16 nextmapoverride = 0;
|
INT16 nextmapoverride = 0;
|
||||||
boolean skipstats = false;
|
boolean skipstats = false;
|
||||||
@@ -144,7 +144,7 @@ mobj_t *blueflag = NULL;
|
|||||||
mapthing_t *rflagpoint = NULL;
|
mapthing_t *rflagpoint = NULL;
|
||||||
mapthing_t *bflagpoint = NULL;
|
mapthing_t *bflagpoint = NULL;
|
||||||
|
|
||||||
struct quake quake;
|
struct quake quake = {};
|
||||||
|
|
||||||
// Map Header Information
|
// Map Header Information
|
||||||
mapheader_t* mapheaderinfo[NUMMAPS] = {};
|
mapheader_t* mapheaderinfo[NUMMAPS] = {};
|
||||||
@@ -228,7 +228,7 @@ tic_t racecountdown = 0, exitcountdown = 0; // for racing
|
|||||||
fixed_t gravity = 0;
|
fixed_t gravity = 0;
|
||||||
fixed_t mapobjectscale = FRACUNIT;
|
fixed_t mapobjectscale = FRACUNIT;
|
||||||
|
|
||||||
struct maplighting maplighting;
|
struct maplighting maplighting = {};
|
||||||
|
|
||||||
INT16 autobalance = 0; //for CTF team balance
|
INT16 autobalance = 0; //for CTF team balance
|
||||||
INT16 teamscramble = 0; //for CTF team scramble
|
INT16 teamscramble = 0; //for CTF team scramble
|
||||||
@@ -276,12 +276,6 @@ UINT32 timesBeatenWithEmeralds = 0;
|
|||||||
|
|
||||||
INT16 prevmap = 0, nextmap = 0;
|
INT16 prevmap = 0, nextmap = 0;
|
||||||
|
|
||||||
// Analog Control
|
|
||||||
void SendWeaponPref(void);
|
|
||||||
void SendWeaponPref2(void);
|
|
||||||
void SendWeaponPref3(void);
|
|
||||||
void SendWeaponPref4(void);
|
|
||||||
|
|
||||||
// don't mind me putting these here, I was lazy to figure out where else I could put those without blowing up the compiler.
|
// don't mind me putting these here, I was lazy to figure out where else I could put those without blowing up the compiler.
|
||||||
|
|
||||||
// chat timer thingy
|
// chat timer thingy
|
||||||
@@ -318,6 +312,8 @@ consvar_t cv_pauseifunfocused = {"pauseifunfocused", "Yes", CV_SAVE, CV_YesNo, N
|
|||||||
static CV_PossibleValue_t songcredits_cons_t[] = {{0, "Off"}, {1, "Default"}, {2, "Box"}, {0, NULL}};
|
static CV_PossibleValue_t songcredits_cons_t[] = {{0, "Off"}, {1, "Default"}, {2, "Box"}, {0, NULL}};
|
||||||
consvar_t cv_songcredits = {"songcredits", "Default", CV_SAVE, songcredits_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_songcredits = {"songcredits", "Default", CV_SAVE, songcredits_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
consvar_t cv_pausesongcredits = {"pausesongcredits", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
// Show "FREE PLAY" when you're alone. :(
|
// Show "FREE PLAY" when you're alone. :(
|
||||||
consvar_t cv_showfreeplay = { "showfreeplay", "Yes", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_showfreeplay = { "showfreeplay", "Yes", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
@@ -458,6 +454,14 @@ consvar_t cv_litesteer[MAXSPLITSCREENPLAYERS] = {
|
|||||||
{"litesteer4", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}
|
{"litesteer4", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//static CV_PossibleValue_t autoaccelcons_t[] = {{0, "Off"}, {1, "Manual"}, {2, "Automatic"}, {0, NULL}};
|
||||||
|
consvar_t cv_autoaccel[MAXSPLITSCREENPLAYERS] = {
|
||||||
|
{"kartautoaccel", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},
|
||||||
|
{"kartautoaccel2", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},
|
||||||
|
{"kartautoaccel3", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},
|
||||||
|
{"kartautoaccel4", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
static CV_PossibleValue_t driftsparkpulse_t[] = {{0, "MIN"}, {FRACUNIT*3, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t driftsparkpulse_t[] = {{0, "MIN"}, {FRACUNIT*3, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_driftsparkpulse = {"driftsparkpulse", "1.4", CV_FLOAT | CV_SAVE, driftsparkpulse_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_driftsparkpulse = {"driftsparkpulse", "1.4", CV_FLOAT | CV_SAVE, driftsparkpulse_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
@@ -519,11 +523,8 @@ void G_ClearRecords(void)
|
|||||||
INT16 i;
|
INT16 i;
|
||||||
for (i = 0; i < NUMMAPS; ++i)
|
for (i = 0; i < NUMMAPS; ++i)
|
||||||
{
|
{
|
||||||
if (mainrecords[i])
|
Z_Free(mainrecords[i]);
|
||||||
{
|
mainrecords[i] = NULL;
|
||||||
Z_Free(mainrecords[i]);
|
|
||||||
mainrecords[i] = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -668,7 +669,7 @@ INT16 G_ClipAimingPitch(INT32 *aiming)
|
|||||||
else if (*aiming < -limitangle)
|
else if (*aiming < -limitangle)
|
||||||
*aiming = -limitangle;
|
*aiming = -limitangle;
|
||||||
|
|
||||||
return (INT16)((*aiming)>>16);
|
return (INT16)((*aiming) >> TICCMD_REDUCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
INT16 G_SoftwareClipAimingPitch(INT32 *aiming)
|
INT16 G_SoftwareClipAimingPitch(INT32 *aiming)
|
||||||
@@ -681,7 +682,7 @@ INT16 G_SoftwareClipAimingPitch(INT32 *aiming)
|
|||||||
else if (*aiming < -limitangle)
|
else if (*aiming < -limitangle)
|
||||||
*aiming = -limitangle;
|
*aiming = -limitangle;
|
||||||
|
|
||||||
return (INT16)((*aiming)>>16);
|
return (INT16)((*aiming) >> TICCMD_REDUCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
INT32 JoyAxis(axis_input_e axissel, UINT8 player)
|
INT32 JoyAxis(axis_input_e axissel, UINT8 player)
|
||||||
@@ -804,6 +805,10 @@ static fixed_t forwardmove[2] = {25<<FRACBITS>>16, 50<<FRACBITS>>16};
|
|||||||
static fixed_t sidemove[2] = {2<<FRACBITS>>16, 4<<FRACBITS>>16};
|
static fixed_t sidemove[2] = {2<<FRACBITS>>16, 4<<FRACBITS>>16};
|
||||||
static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn
|
static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn
|
||||||
|
|
||||||
|
//
|
||||||
|
// G_HandleLocalDriftturn
|
||||||
|
// Hack for Lua menus that check directional inputs with driftturn
|
||||||
|
//
|
||||||
static void G_HandleLocalDriftturn(ticcmd_t *cmd, UINT8 ssplayer)
|
static void G_HandleLocalDriftturn(ticcmd_t *cmd, UINT8 ssplayer)
|
||||||
{
|
{
|
||||||
INT32 axis = 0;
|
INT32 axis = 0;
|
||||||
@@ -866,9 +871,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)
|
||||||
{
|
{
|
||||||
boolean moveinput = false;
|
|
||||||
INT32 axis = 0;
|
INT32 axis = 0;
|
||||||
const boolean usejoystick = (cv_usejoystick[(ssplayer-1)].value);
|
const boolean usejoystick = cv_usejoystick[(ssplayer-1)].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.
|
||||||
@@ -903,15 +907,11 @@ static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam)
|
|||||||
|
|
||||||
#undef CHECKINPUT
|
#undef CHECKINPUT
|
||||||
|
|
||||||
moveinput = (InputDown(gc_turnleft, ssplayer) || InputDown(gc_turnright, ssplayer)
|
|
||||||
|| InputDown(gc_aimforward, ssplayer) || InputDown(gc_aimbackward, ssplayer) ||
|
|
||||||
(usejoystick && JoyAxis(AXISAIM, ssplayer) != 0) || (usejoystick && JoyAxis(AXISTURN, ssplayer) != 0));
|
|
||||||
|
|
||||||
axis = JoyAxis(AXISLOOKBACK, ssplayer);
|
axis = JoyAxis(AXISLOOKBACK, ssplayer);
|
||||||
camspin[ssplayer-1] = (InputDown(gc_lookback, ssplayer) || (usejoystick && axis > 0));
|
camspin[ssplayer-1] = (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 ((moveinput || cmd->buttons)
|
if ((cmd->driftturn || cmd->buttons)
|
||||||
&& displayplayers[0] != consoleplayer && ssplayer == 1)
|
&& displayplayers[0] != consoleplayer && ssplayer == 1)
|
||||||
{
|
{
|
||||||
if (cv_director.value)
|
if (cv_director.value)
|
||||||
@@ -923,6 +923,63 @@ static void G_BuildLocalTiccmd(ticcmd_t *cmd, UINT8 ssplayer, boolean freecam)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// G_HandleAutoAcceleration
|
||||||
|
//
|
||||||
|
static void G_HandleAutoAcceleration(ticcmd_t *cmd, player_t *player, UINT8 forplayer)
|
||||||
|
{
|
||||||
|
if (!cv_autoaccel[forplayer].value)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (gamestate != GS_LEVEL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// dont accel before and during countdown
|
||||||
|
if (leveltime <= starttime)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// dont do this in menus or when console is onscreen
|
||||||
|
if (menuactive || CON_Ready())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// gotta have a player that aint respawning
|
||||||
|
if (!player->mo || player->kartstuff[k_respawn])
|
||||||
|
return;
|
||||||
|
|
||||||
|
// dont need for "finished" players
|
||||||
|
if (player->exiting || (player->pflags & PF_TIMEOVER))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// dont do during spinout
|
||||||
|
if (player->kartstuff[k_spinouttimer])
|
||||||
|
return;
|
||||||
|
|
||||||
|
// spectators and freecam dont need special handling, see G_BuildTiccmd
|
||||||
|
|
||||||
|
if (cmd->buttons & BT_BRAKE)
|
||||||
|
{
|
||||||
|
if (cmd->buttons & BT_DRIFT ||
|
||||||
|
player->kartstuff[k_sneakertimer] ||
|
||||||
|
player->kartstuff[k_squishedtimer])
|
||||||
|
{
|
||||||
|
cmd->forwardmove = (SINT8)forwardmove[0];
|
||||||
|
cmd->buttons |= BT_ACCELERATE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// allows us to drive backwards if we need to
|
||||||
|
if (cmd->forwardmove > 0)
|
||||||
|
cmd->forwardmove = 0;
|
||||||
|
cmd->buttons &= ~BT_ACCELERATE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmd->forwardmove = (SINT8)forwardmove[1];
|
||||||
|
cmd->buttons |= BT_ACCELERATE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// G_BuildTiccmd
|
// G_BuildTiccmd
|
||||||
// Builds a ticcmd from all of the available inputs
|
// Builds a ticcmd from all of the available inputs
|
||||||
@@ -965,7 +1022,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
|||||||
// Kart, don't build a ticcmd if someone is resynching or the server is stopped too so we don't fly off course in bad conditions
|
// Kart, don't build a ticcmd if someone is resynching or the server is stopped too so we don't fly off course in bad conditions
|
||||||
if (paused || P_AutoPause() || (gamestate == GS_LEVEL && player->playerstate == PST_REBORN) || hu_resynching)
|
if (paused || P_AutoPause() || (gamestate == GS_LEVEL && player->playerstate == PST_REBORN) || hu_resynching)
|
||||||
{
|
{
|
||||||
cmd->angleturn = (INT16)(lang >> 16);
|
cmd->angleturn = (INT16)(lang >> TICCMD_REDUCE);
|
||||||
cmd->aiming = G_ClipAimingPitch(&laim);
|
cmd->aiming = G_ClipAimingPitch(&laim);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -973,7 +1030,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
|||||||
// dumbass thing so we can use a few buttons but dont accidentally drive away
|
// dumbass thing so we can use a few buttons but dont accidentally drive away
|
||||||
if (player->spectator || freecam)
|
if (player->spectator || freecam)
|
||||||
{
|
{
|
||||||
cmd->angleturn = (INT16)(lang >> 16);
|
cmd->angleturn = (INT16)(lang >> TICCMD_REDUCE);
|
||||||
G_BuildLocalTiccmd(cmd, ssplayer, freecam);
|
G_BuildLocalTiccmd(cmd, ssplayer, freecam);
|
||||||
|
|
||||||
// let lua override everything
|
// let lua override everything
|
||||||
@@ -1070,7 +1127,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
|||||||
if (InputDown(gc_accelerate, ssplayer) || (gamepadjoystickmove && axis > 0) || player->kartstuff[k_sneakertimer])
|
if (InputDown(gc_accelerate, ssplayer) || (gamepadjoystickmove && axis > 0) || player->kartstuff[k_sneakertimer])
|
||||||
{
|
{
|
||||||
cmd->buttons |= BT_ACCELERATE;
|
cmd->buttons |= BT_ACCELERATE;
|
||||||
forward = forwardmove[1]; // 50
|
forward = forwardmove[1]; // 50
|
||||||
}
|
}
|
||||||
else if (analogjoystickmove && axis > 0)
|
else if (analogjoystickmove && axis > 0)
|
||||||
{
|
{
|
||||||
@@ -1133,7 +1190,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
|||||||
|
|
||||||
cmd->aiming = G_ClipAimingPitch(&laim);
|
cmd->aiming = G_ClipAimingPitch(&laim);
|
||||||
|
|
||||||
mousex = mousey = mlooky = 0;
|
mousex = mousey = 0;
|
||||||
|
|
||||||
if (forward > MAXPLMOVE)
|
if (forward > MAXPLMOVE)
|
||||||
forward = MAXPLMOVE;
|
forward = MAXPLMOVE;
|
||||||
@@ -1151,6 +1208,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
|||||||
cmd->sidemove = (SINT8)(cmd->sidemove + side);
|
cmd->sidemove = (SINT8)(cmd->sidemove + side);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
G_HandleAutoAcceleration(cmd, player, forplayer);
|
||||||
|
|
||||||
//{ SRB2kart - Drift support
|
//{ SRB2kart - Drift support
|
||||||
// Not grouped with the rest of turn stuff because it needs to know what buttons you're pressing for rubber-burn turn
|
// Not grouped with the rest of turn stuff because it needs to know what buttons you're pressing for rubber-burn turn
|
||||||
// limit turning to angleturn[1] to stop mouselook letting you look too fast
|
// limit turning to angleturn[1] to stop mouselook letting you look too fast
|
||||||
@@ -1172,10 +1231,10 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
|||||||
|| (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
|
||||||
|| (player->kartstuff[k_respawn]) // Respawning
|
|| (player->kartstuff[k_respawn]) // Respawning
|
||||||
|| (player->spectator || objectplacing))) // Not a physical player
|
|| (player->spectator || objectplacing))) // Not a physical player
|
||||||
lang += (cmd->angleturn<<16);
|
lang += (cmd->angleturn << TICCMD_REDUCE);
|
||||||
|
|
||||||
cmd->angleturn = (INT16)(lang >> 16);
|
cmd->angleturn = (INT16)(lang >> TICCMD_REDUCE);
|
||||||
cmd->latency = modeattacking ? 0 : (leveltime & 0xFF); // Send leveltime when this tic was generated to the server for control lag calculations
|
cmd->latency = modeattacking ? 0 : (leveltime & TICCMD_LATENCYMASK); // Send leveltime when this tic was generated to the server for control lag calculations
|
||||||
|
|
||||||
if (!hu_stopped)
|
if (!hu_stopped)
|
||||||
{
|
{
|
||||||
@@ -1756,14 +1815,15 @@ void G_ResetView(UINT8 viewnum, INT32 playernum, boolean onlyactive)
|
|||||||
// Increment a viewpoint by offset from the current player. A negative value
|
// Increment a viewpoint by offset from the current player. A negative value
|
||||||
// decrements.
|
// decrements.
|
||||||
//
|
//
|
||||||
void G_AdjustView(UINT8 viewnum, INT32 offset, boolean onlyactive)
|
void G_AdjustViewEx(UINT8 viewnum, INT32 offset, boolean onlyactive, boolean resetfreecam)
|
||||||
{
|
{
|
||||||
INT32 *displayplayerp, oldview;
|
INT32 *displayplayerp, oldview;
|
||||||
displayplayerp = &displayplayers[viewnum-1];
|
displayplayerp = &displayplayers[viewnum-1];
|
||||||
oldview = (*displayplayerp);
|
oldview = (*displayplayerp);
|
||||||
|
|
||||||
// turn off the freecam
|
// turn off the freecam
|
||||||
camera[viewnum-1].freecam = false;
|
if (resetfreecam)
|
||||||
|
camera[viewnum-1].freecam = false;
|
||||||
|
|
||||||
G_ResetView(viewnum, ( (*displayplayerp) + offset ), onlyactive);
|
G_ResetView(viewnum, ( (*displayplayerp) + offset ), onlyactive);
|
||||||
|
|
||||||
@@ -1777,7 +1837,7 @@ void G_AdjustView(UINT8 viewnum, INT32 offset, boolean onlyactive)
|
|||||||
// Ensures all viewpoints are valid
|
// Ensures all viewpoints are valid
|
||||||
// Also demotes splitscreen down to one player.
|
// Also demotes splitscreen down to one player.
|
||||||
//
|
//
|
||||||
void G_ResetViews(void)
|
void G_ResetViews(boolean resetfreecam)
|
||||||
{
|
{
|
||||||
UINT8 splits;
|
UINT8 splits;
|
||||||
UINT8 viewd;
|
UINT8 viewd;
|
||||||
@@ -1801,7 +1861,7 @@ void G_ResetViews(void)
|
|||||||
*/
|
*/
|
||||||
for (viewd = 1; viewd <= splits; ++viewd)
|
for (viewd = 1; viewd <= splits; ++viewd)
|
||||||
{
|
{
|
||||||
G_AdjustView(viewd, 0, false);
|
G_AdjustViewEx(viewd, 0, false, resetfreecam);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1882,7 +1942,7 @@ void G_Ticker(boolean run)
|
|||||||
G_CopyTiccmd(cmd, &netcmds[buf][i], 1);
|
G_CopyTiccmd(cmd, &netcmds[buf][i], 1);
|
||||||
|
|
||||||
// Use the leveltime sent in the player's ticcmd to determine control lag
|
// Use the leveltime sent in the player's ticcmd to determine control lag
|
||||||
cmd->latency = modeattacking ? 0 : min(((leveltime & 0xFF) - cmd->latency) & 0xFF, MAXPREDICTTICS-1); //@TODO add a cvar to allow setting this max
|
cmd->latency = modeattacking ? 0 : min(((leveltime & TICCMD_LATENCYMASK) - cmd->latency) & TICCMD_LATENCYMASK, MAXPREDICTTICS-1); //@TODO add a cvar to allow setting this max
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1890,7 +1950,6 @@ void G_Ticker(boolean run)
|
|||||||
switch (gamestate)
|
switch (gamestate)
|
||||||
{
|
{
|
||||||
case GS_LEVEL:
|
case GS_LEVEL:
|
||||||
|
|
||||||
for (; ra_timeskip < starttime - TICRATE*4; ra_timeskip++) // this looks weird but this is done to not break compability with older demos for now.
|
for (; ra_timeskip < starttime - TICRATE*4; ra_timeskip++) // this looks weird but this is done to not break compability with older demos for now.
|
||||||
{
|
{
|
||||||
if (demo.title)
|
if (demo.title)
|
||||||
@@ -2288,7 +2347,7 @@ void G_PlayerReborn(INT32 player)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* I'm putting this here because lol */
|
/* I'm putting this here because lol */
|
||||||
fade = (cv_birdmusic.value && cv_fading.value && P_IsLocalPlayer(p));
|
fade = (cv_fading.value && P_IsLocalPlayer(p));
|
||||||
|
|
||||||
if (fade)
|
if (fade)
|
||||||
{
|
{
|
||||||
@@ -3025,7 +3084,8 @@ tryagain:
|
|||||||
|
|
||||||
void G_AddMapToBuffer(INT16 map)
|
void G_AddMapToBuffer(INT16 map)
|
||||||
{
|
{
|
||||||
INT16 bufx, refreshnum = max(0, TOLMaps(G_TOLFlag(gametype))-3);
|
const INT32 tolmaps = TOLMaps(G_TOLFlag(gametype));
|
||||||
|
INT16 bufx, refreshnum = max(0, tolmaps-3);
|
||||||
|
|
||||||
// Add the map to the buffer.
|
// Add the map to the buffer.
|
||||||
for (bufx = NUMMAPS-1; bufx > 0; bufx--)
|
for (bufx = NUMMAPS-1; bufx > 0; bufx--)
|
||||||
@@ -3438,7 +3498,7 @@ void G_LoadGameData(void)
|
|||||||
INT32 i, j;
|
INT32 i, j;
|
||||||
UINT8 modded = false;
|
UINT8 modded = false;
|
||||||
UINT8 rtemp;
|
UINT8 rtemp;
|
||||||
savebuffer_t save;
|
savebuffer_t save = {};
|
||||||
|
|
||||||
//For records
|
//For records
|
||||||
tic_t rectime;
|
tic_t rectime;
|
||||||
@@ -3571,7 +3631,7 @@ void G_SaveGameData(boolean force)
|
|||||||
size_t length;
|
size_t length;
|
||||||
INT32 i, j;
|
INT32 i, j;
|
||||||
UINT8 btemp;
|
UINT8 btemp;
|
||||||
savebuffer_t save;
|
savebuffer_t save = {};
|
||||||
(void)force;
|
(void)force;
|
||||||
char backupfile[MAX_WADPATH+4];
|
char backupfile[MAX_WADPATH+4];
|
||||||
|
|
||||||
@@ -3742,7 +3802,7 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride)
|
|||||||
size_t length;
|
size_t length;
|
||||||
char vcheck[VERSIONSIZE];
|
char vcheck[VERSIONSIZE];
|
||||||
char savename[255];
|
char savename[255];
|
||||||
savebuffer_t save;
|
savebuffer_t save = {};
|
||||||
|
|
||||||
// memset savedata to all 0, fixes calling perfectly valid saves corrupt because of bots
|
// memset savedata to all 0, fixes calling perfectly valid saves corrupt because of bots
|
||||||
memset(&savedata, 0, sizeof(savedata));
|
memset(&savedata, 0, sizeof(savedata));
|
||||||
@@ -3828,7 +3888,7 @@ void G_SaveGame(UINT32 savegameslot)
|
|||||||
boolean saved;
|
boolean saved;
|
||||||
char savename[256] = "";
|
char savename[256] = "";
|
||||||
const char *backup;
|
const char *backup;
|
||||||
savebuffer_t save;
|
savebuffer_t save = {};
|
||||||
|
|
||||||
sprintf(savename, savegamename, savegameslot);
|
sprintf(savename, savegamename, savegameslot);
|
||||||
backup = va("%s",savename);
|
backup = va("%s",savename);
|
||||||
@@ -4012,6 +4072,12 @@ void G_InitNew(UINT8 pencoremode, const char *mapname, boolean resetplayer, bool
|
|||||||
automapactive = false;
|
automapactive = false;
|
||||||
imcontinuing = false;
|
imcontinuing = false;
|
||||||
|
|
||||||
|
// HACK: this doesent reset if you change the map from within a replay and may cause crashes or the replayhut to be non functional
|
||||||
|
if (!demo.playback && demo.inreplayhut)
|
||||||
|
{
|
||||||
|
M_ResetDemoList();
|
||||||
|
}
|
||||||
|
|
||||||
if (!skipprecutscene && mapheaderinfo[gamemap-1]->precutscenenum && !modeattacking) // Start a custom cutscene.
|
if (!skipprecutscene && mapheaderinfo[gamemap-1]->precutscenenum && !modeattacking) // Start a custom cutscene.
|
||||||
F_StartCustomCutscene(mapheaderinfo[gamemap-1]->precutscenenum-1, true, resetplayer);
|
F_StartCustomCutscene(mapheaderinfo[gamemap-1]->precutscenenum-1, true, resetplayer);
|
||||||
else
|
else
|
||||||
@@ -4092,7 +4158,7 @@ static void measurekeywords(mapsearchfreq_t *fr,
|
|||||||
PU_STATIC, NULL);
|
PU_STATIC, NULL);
|
||||||
for (qp = strtok(va("%s", q), " ");
|
for (qp = strtok(va("%s", q), " ");
|
||||||
qp && fr->total < 255;
|
qp && fr->total < 255;
|
||||||
qp = strtok(0, " "))
|
qp = strtok(NULL, " "))
|
||||||
{
|
{
|
||||||
if (( sp = strcasestr(s, qp) ))
|
if (( sp = strcasestr(s, qp) ))
|
||||||
{
|
{
|
||||||
@@ -4173,7 +4239,7 @@ INT32 G_FindMap(const char *mapname, char **foundmapnamep,
|
|||||||
{
|
{
|
||||||
newmapnum = mapnum;
|
newmapnum = mapnum;
|
||||||
newmapname = realmapname;
|
newmapname = realmapname;
|
||||||
realmapname = 0;
|
realmapname = NULL;
|
||||||
Z_Free(apromapname);
|
Z_Free(apromapname);
|
||||||
if (!wanttable)
|
if (!wanttable)
|
||||||
break;
|
break;
|
||||||
@@ -4194,7 +4260,7 @@ INT32 G_FindMap(const char *mapname, char **foundmapnamep,
|
|||||||
{
|
{
|
||||||
apromapnum = mapnum;
|
apromapnum = mapnum;
|
||||||
apromapname = realmapname;
|
apromapname = realmapname;
|
||||||
realmapname = 0;
|
realmapname = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else/* ...match individual keywords */
|
else/* ...match individual keywords */
|
||||||
|
|||||||
+8
-4
@@ -50,7 +50,7 @@ extern INT16 rw_maximums[NUM_WEAPONS];
|
|||||||
|
|
||||||
// used in game menu
|
// used in game menu
|
||||||
extern consvar_t cv_chatwidth, cv_chatnotifications, cv_chatheight, cv_chattime, cv_consolechat, cv_chatbacktint, cv_chatspamprotection, cv_chatcentertext/*, cv_compactscoreboard*/;
|
extern consvar_t cv_chatwidth, cv_chatnotifications, cv_chatheight, cv_chattime, cv_consolechat, cv_chatbacktint, cv_chatspamprotection, cv_chatcentertext/*, cv_compactscoreboard*/;
|
||||||
extern consvar_t cv_songcredits;
|
extern consvar_t cv_songcredits, cv_pausesongcredits;
|
||||||
extern consvar_t cv_showfreeplay;
|
extern consvar_t cv_showfreeplay;
|
||||||
extern consvar_t cv_growmusic, cv_supermusic;
|
extern consvar_t cv_growmusic, cv_supermusic;
|
||||||
extern consvar_t cv_pauseifunfocused;
|
extern consvar_t cv_pauseifunfocused;
|
||||||
@@ -74,6 +74,8 @@ extern consvar_t cv_ydeadzone[MAXSPLITSCREENPLAYERS];
|
|||||||
|
|
||||||
extern consvar_t cv_litesteer[MAXSPLITSCREENPLAYERS];
|
extern consvar_t cv_litesteer[MAXSPLITSCREENPLAYERS];
|
||||||
|
|
||||||
|
extern consvar_t cv_autoaccel[MAXSPLITSCREENPLAYERS];
|
||||||
|
|
||||||
extern consvar_t cv_ghost_besttime, cv_ghost_bestlap, cv_ghost_last, cv_ghost_guest, cv_ghost_staff;
|
extern consvar_t cv_ghost_besttime, cv_ghost_bestlap, cv_ghost_last, cv_ghost_guest, cv_ghost_staff;
|
||||||
|
|
||||||
// Hud offsets
|
// Hud offsets
|
||||||
@@ -128,6 +130,7 @@ extern consvar_t cv_spinoutroll;
|
|||||||
extern consvar_t cv_squishdance, cv_squishdancespeed;
|
extern consvar_t cv_squishdance, cv_squishdancespeed;
|
||||||
|
|
||||||
extern consvar_t cv_playerblendeffects;
|
extern consvar_t cv_playerblendeffects;
|
||||||
|
extern consvar_t cv_reducevfx;
|
||||||
|
|
||||||
extern consvar_t cv_cechotoggle;
|
extern consvar_t cv_cechotoggle;
|
||||||
|
|
||||||
@@ -160,7 +163,7 @@ typedef enum
|
|||||||
const char *G_BuildMapName(INT32 map);
|
const char *G_BuildMapName(INT32 map);
|
||||||
void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer);
|
void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer);
|
||||||
|
|
||||||
// copy ticcmd_t to and fro the normal way
|
// copy ticcmd_t to and from the normal way
|
||||||
ticcmd_t *G_CopyTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n);
|
ticcmd_t *G_CopyTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n);
|
||||||
// copy ticcmd_t to and fro network packets
|
// copy ticcmd_t to and fro network packets
|
||||||
ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n);
|
ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n);
|
||||||
@@ -262,9 +265,10 @@ boolean G_CanView(INT32 playernum, UINT8 viewnum, boolean onlyactive);
|
|||||||
INT32 G_FindView(INT32 startview, UINT8 viewnum, boolean onlyactive, boolean reverse);
|
INT32 G_FindView(INT32 startview, UINT8 viewnum, boolean onlyactive, boolean reverse);
|
||||||
INT32 G_CountPlayersPotentiallyViewable(boolean active);
|
INT32 G_CountPlayersPotentiallyViewable(boolean active);
|
||||||
|
|
||||||
void G_ResetViews(void);
|
void G_ResetViews(boolean resetfreecam);
|
||||||
void G_ResetView(UINT8 viewnum, INT32 playernum, boolean onlyactive);
|
void G_ResetView(UINT8 viewnum, INT32 playernum, boolean onlyactive);
|
||||||
void G_AdjustView(UINT8 viewnum, INT32 offset, boolean onlyactive);
|
void G_AdjustViewEx(UINT8 viewnum, INT32 offset, boolean onlyactive, boolean resetfreecam);
|
||||||
|
#define G_AdjustView(v,o,oa) G_AdjustViewEx(v,o,oa, true)
|
||||||
|
|
||||||
void G_AddPlayer(INT32 playernum);
|
void G_AddPlayer(INT32 playernum);
|
||||||
|
|
||||||
|
|||||||
+203
-23
@@ -34,7 +34,7 @@ static CV_PossibleValue_t onecontrolperkey_cons_t[] = {{1, "One"}, {2, "Several"
|
|||||||
static CV_PossibleValue_t turnsmooth_cons_t[] = {{2, "Slow"}, {1, "Fast"}, {0, "Off"}, {0, NULL}};
|
static CV_PossibleValue_t turnsmooth_cons_t[] = {{2, "Slow"}, {1, "Fast"}, {0, "Off"}, {0, NULL}};
|
||||||
|
|
||||||
// mouse values are used once
|
// mouse values are used once
|
||||||
consvar_t cv_mousesens = {"mousesens", "20", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_mousexsens = {"mousexsens", "20", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_mouseysens = {"mouseysens", "20", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_mouseysens = {"mouseysens", "20", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_controlperkey = {"controlperkey", "One", CV_SAVE, onecontrolperkey_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_controlperkey = {"controlperkey", "One", CV_SAVE, onecontrolperkey_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
@@ -58,12 +58,21 @@ static void led_off_handle3(void);
|
|||||||
static void led_off_handle4(void);
|
static void led_off_handle4(void);
|
||||||
|
|
||||||
consvar_t cv_rumble[MAXSPLITSCREENPLAYERS] = {
|
consvar_t cv_rumble[MAXSPLITSCREENPLAYERS] = {
|
||||||
{"rumble", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, rumble_off_handle, 0, NULL, NULL, 0, 0, NULL},
|
{"rumble", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, rumble_off_handle, 0, NULL, NULL, 0, 0, NULL},
|
||||||
{"rumble2", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, rumble_off_handle2, 0, NULL, NULL, 0, 0, NULL},
|
{"rumble2", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, rumble_off_handle2, 0, NULL, NULL, 0, 0, NULL},
|
||||||
{"rumble3", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, rumble_off_handle3, 0, NULL, NULL, 0, 0, NULL},
|
{"rumble3", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, rumble_off_handle3, 0, NULL, NULL, 0, 0, NULL},
|
||||||
{"rumble4", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, rumble_off_handle4, 0, NULL, NULL, 0, 0, NULL}
|
{"rumble4", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, rumble_off_handle4, 0, NULL, NULL, 0, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static CV_PossibleValue_t rumblestrength_cons_t[] = {{FRACUNIT/4, "MIN"}, {FRACUNIT*4, "MAX"}, {0, NULL}};
|
||||||
|
|
||||||
|
consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS] = {
|
||||||
|
{"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},
|
||||||
|
{"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}
|
||||||
|
};
|
||||||
|
|
||||||
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},
|
||||||
@@ -72,6 +81,9 @@ 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_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};
|
||||||
|
|
||||||
static void rumble_off_handle(void)
|
static void rumble_off_handle(void)
|
||||||
{
|
{
|
||||||
if (!cv_rumble[0].value)
|
if (!cv_rumble[0].value)
|
||||||
@@ -116,17 +128,17 @@ static void led_off_handle4(void)
|
|||||||
G_ResetPlayerGamepadIndicatorColor(3);
|
G_ResetPlayerGamepadIndicatorColor(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
INT32 mousex, mousey;
|
INT32 mousex = 0, mousey = 0;
|
||||||
INT32 mlooky; // like mousey but with a custom sensitivity for mlook
|
|
||||||
|
|
||||||
// joystick values are repeated
|
// joystick values are repeated
|
||||||
INT32 joyxmove[MAXSPLITSCREENPLAYERS][JOYAXISSET], joyymove[MAXSPLITSCREENPLAYERS][JOYAXISSET];
|
INT32 joyxmove[MAXSPLITSCREENPLAYERS][JOYAXISSET] = {};
|
||||||
|
INT32 joyymove[MAXSPLITSCREENPLAYERS][JOYAXISSET] = {};
|
||||||
|
|
||||||
// current state of the keys: true if pushed
|
// current state of the keys: true if pushed
|
||||||
UINT8 gamekeydown[NUMINPUTS];
|
UINT8 gamekeydown[NUMINPUTS] = {};
|
||||||
|
|
||||||
// two key codes (or virtual key) per game control
|
// two key codes (or virtual key) per game control
|
||||||
INT32 gamecontrol[MAXSPLITSCREENPLAYERS][num_gamecontrols][2];
|
INT32 gamecontrol[MAXSPLITSCREENPLAYERS][num_gamecontrols][2] = {};
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -183,9 +195,8 @@ void G_MapEventsToControls(event_t *ev)
|
|||||||
case ev_mouse: // buttons are virtual keys
|
case ev_mouse: // buttons are virtual keys
|
||||||
if (menuactive || CON_Ready() || chat_on)
|
if (menuactive || CON_Ready() || chat_on)
|
||||||
break;
|
break;
|
||||||
mousex = (INT32)(ev->data2*((cv_mousesens.value*cv_mousesens.value)/110.0f + 0.1f));
|
mousex = (INT32)(ev->data2*((cv_mousexsens.value*cv_mousexsens.value)/110.0f + 0.1f));
|
||||||
mousey = (INT32)(ev->data3*((cv_mousesens.value*cv_mousesens.value)/110.0f + 0.1f));
|
mousey = (INT32)(ev->data3*((cv_mouseysens.value*cv_mouseysens.value)/110.0f + 0.1f));
|
||||||
mlooky = (INT32)(ev->data3*((cv_mouseysens.value*cv_mousesens.value)/110.0f + 0.1f));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ev_joystick: // buttons are virtual keys
|
case ev_joystick: // buttons are virtual keys
|
||||||
@@ -206,7 +217,7 @@ void G_MapEventsToControls(event_t *ev)
|
|||||||
|
|
||||||
case ev_joystick3:
|
case ev_joystick3:
|
||||||
i = ev->data1;
|
i = ev->data1;
|
||||||
if (i >= JOYAXISSET)
|
if (i >= JOYAXISSET || menuactive)
|
||||||
break;
|
break;
|
||||||
if (ev->data2 != INT32_MAX) joyxmove[2][i] = ev->data2;
|
if (ev->data2 != INT32_MAX) joyxmove[2][i] = ev->data2;
|
||||||
if (ev->data3 != INT32_MAX) joyymove[2][i] = ev->data3;
|
if (ev->data3 != INT32_MAX) joyymove[2][i] = ev->data3;
|
||||||
@@ -214,7 +225,7 @@ void G_MapEventsToControls(event_t *ev)
|
|||||||
|
|
||||||
case ev_joystick4:
|
case ev_joystick4:
|
||||||
i = ev->data1;
|
i = ev->data1;
|
||||||
if (i >= JOYAXISSET)
|
if (i >= JOYAXISSET || menuactive)
|
||||||
break;
|
break;
|
||||||
if (ev->data2 != INT32_MAX) joyxmove[3][i] = ev->data2;
|
if (ev->data2 != INT32_MAX) joyxmove[3][i] = ev->data2;
|
||||||
if (ev->data3 != INT32_MAX) joyymove[3][i] = ev->data3;
|
if (ev->data3 != INT32_MAX) joyymove[3][i] = ev->data3;
|
||||||
@@ -875,11 +886,13 @@ static const char *gamecontrolname[num_gamecontrols] =
|
|||||||
|
|
||||||
#include "k_kart.h"
|
#include "k_kart.h"
|
||||||
|
|
||||||
UINT16 G_GetSkinColor(INT32 playernum)
|
UINT8 G_GetSkinColorForGamepad(INT32 playernum)
|
||||||
{
|
{
|
||||||
|
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
|
||||||
|
|
||||||
if (gamestate == GS_LEVEL)
|
if (gamestate == GS_LEVEL)
|
||||||
{
|
{
|
||||||
player_t *player = &players[displayplayers[playernum]];
|
const player_t *player = &players[displayplayers[playernum]];
|
||||||
|
|
||||||
if (player)
|
if (player)
|
||||||
{
|
{
|
||||||
@@ -897,13 +910,13 @@ UINT16 G_GetSkinColor(INT32 playernum)
|
|||||||
switch (playernum)
|
switch (playernum)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
return cv_playercolor.value;
|
return (UINT8)cv_playercolor.value;
|
||||||
case 1:
|
case 1:
|
||||||
return cv_playercolor2.value;
|
return (UINT8)cv_playercolor2.value;
|
||||||
case 2:
|
case 2:
|
||||||
return cv_playercolor3.value;
|
return (UINT8)cv_playercolor3.value;
|
||||||
case 3:
|
case 3:
|
||||||
return cv_playercolor4.value;
|
return (UINT8)cv_playercolor4.value;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -911,19 +924,23 @@ UINT16 G_GetSkinColor(INT32 playernum)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT16 color)
|
// Sets the Indicator LED on supported gamepads to a desired skincolor
|
||||||
|
// pass SKINCOLOR_NONE/0 to set the players skin color
|
||||||
|
void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT8 color)
|
||||||
{
|
{
|
||||||
UINT16 skincolor;
|
UINT8 skincolor;
|
||||||
byteColor_t byte_color;
|
byteColor_t byte_color;
|
||||||
|
|
||||||
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
|
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
|
||||||
|
|
||||||
if (cv_gamepadled[playernum].value == 0)
|
if (cv_gamepadled[playernum].value == 0 || (window_notinfocus && cv_gamepadledifunfocused.value == 0)
|
||||||
|
|| color >= MAXTRANSLATIONS)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
skincolor = color ? color : G_GetSkinColor(playernum);
|
// so we can override this
|
||||||
|
skincolor = color ? color : G_GetSkinColorForGamepad(playernum);
|
||||||
byte_color = V_GetColor(colortranslations[skincolor][8]).s;
|
byte_color = V_GetColor(colortranslations[skincolor][8]).s;
|
||||||
|
|
||||||
I_SetGamepadIndicatorColor(playernum, byte_color.red, byte_color.green, byte_color.blue);
|
I_SetGamepadIndicatorColor(playernum, byte_color.red, byte_color.green, byte_color.blue);
|
||||||
@@ -931,16 +948,53 @@ void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT16 color)
|
|||||||
|
|
||||||
static void G_ResetPlayerGamepadIndicatorColor(INT32 playernum)
|
static void G_ResetPlayerGamepadIndicatorColor(INT32 playernum)
|
||||||
{
|
{
|
||||||
|
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
|
||||||
|
|
||||||
if (cv_gamepadled[playernum].value == 0)
|
if (cv_gamepadled[playernum].value == 0)
|
||||||
{
|
{
|
||||||
I_SetGamepadIndicatorColor(playernum, 0, 0, 255);
|
I_SetGamepadIndicatorColor(playernum, 0, 0, 255);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
G_SetPlayerGamepadIndicatorColor(playernum, 0);
|
G_SetPlayerGamepadIndicatorColor(playernum, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static UINT8 curcolor[MAXSPLITSCREENPLAYERS] = {};
|
||||||
|
|
||||||
|
void G_DeviceLEDTick(void)
|
||||||
|
{
|
||||||
|
UINT8 i, newcolor;
|
||||||
|
|
||||||
|
if (numcontrollers == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i <= splitscreen; i++)
|
||||||
|
{
|
||||||
|
if (!cv_usejoystick[i].value || !cv_gamepadled[i].value)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
newcolor = G_GetSkinColorForGamepad(i);
|
||||||
|
|
||||||
|
if (curcolor[i] == newcolor) // dont update if same colour
|
||||||
|
continue;
|
||||||
|
|
||||||
|
G_SetPlayerGamepadIndicatorColor(i, newcolor);
|
||||||
|
curcolor[i] = newcolor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensures next call to G_DeviceLEDTick will refresh the gamepad led
|
||||||
|
void G_ResetDeviceLED(void)
|
||||||
|
{
|
||||||
|
memset(curcolor, 0, sizeof(curcolor));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void G_ResetPlayerDeviceRumble(INT32 playernum)
|
static void G_ResetPlayerDeviceRumble(INT32 playernum)
|
||||||
{
|
{
|
||||||
|
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
|
||||||
I_GamepadRumble(playernum, 0, 0, 0);
|
I_GamepadRumble(playernum, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -958,14 +1012,140 @@ void G_PlayerDeviceRumble(INT32 playernum, UINT16 low_strength, UINT16 high_stre
|
|||||||
{
|
{
|
||||||
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
|
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
|
||||||
|
|
||||||
if (cv_rumble[playernum].value == 0)
|
if (cv_rumble[playernum].value == 0 || (window_notinfocus && cv_rumbleifunfocused.value == 0))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// doesent need to be super precise
|
||||||
|
// but ensure this is within range (0-65535)
|
||||||
|
// placed here so it applies to lua aswell
|
||||||
|
low_strength = (UINT16)min(FixedMul(low_strength, cv_rumblestrength[playernum].value), UINT16_MAX);
|
||||||
|
high_strength = (UINT16)min(FixedMul(high_strength, cv_rumblestrength[playernum].value), UINT16_MAX);
|
||||||
|
|
||||||
I_GamepadRumble(playernum, low_strength, high_strength, duration);
|
I_GamepadRumble(playernum, low_strength, high_strength, duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// rumble strengths
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
RUMBLE_VERYSTRONG = FRACUNIT / 4, // 16384
|
||||||
|
RUMBLE_STRONG = FRACUNIT / 8, // 8192
|
||||||
|
RUMBLE_MODERATE = FRACUNIT / 64, // 1024
|
||||||
|
RUMBLE_WEAK = FRACUNIT / 128, // 512
|
||||||
|
RUMBLE_VERYWEAK = FRACUNIT / 256, // 256
|
||||||
|
};
|
||||||
|
|
||||||
|
// Controller rumble!
|
||||||
|
// this keeps track of a bunch of things
|
||||||
|
// and makes your controller rumble accordingly
|
||||||
|
void G_DeviceRumbleTick(void)
|
||||||
|
{
|
||||||
|
UINT8 i;
|
||||||
|
|
||||||
|
if (dedicated || numcontrollers == 0 || gamestate != GS_LEVEL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i <= splitscreen; i++)
|
||||||
|
{
|
||||||
|
if (!cv_usejoystick[i].value || !cv_rumble[i].value)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (camera[i].freecam)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SDL rumble strength goes from a range or 0-65535 respectively
|
||||||
|
// the higher, the stronger it is
|
||||||
|
UINT16 low = 0, high = 0;
|
||||||
|
// for how long the action should rumble, in ms
|
||||||
|
UINT16 lenght = 57; // 57ms is a short pulse, matches super well with this updating once per tic
|
||||||
|
|
||||||
|
const player_t *player = P_GetLocalPlayerForNum(i);
|
||||||
|
|
||||||
|
// allow lua to do some crap for spectators
|
||||||
|
if (player->spectator || !player->mo)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset the rumble if you exit or are ded lel
|
||||||
|
if (player->exiting ||
|
||||||
|
player->playerstate == PST_DEAD ||
|
||||||
|
player->kartstuff[k_respawn] > 1)
|
||||||
|
{
|
||||||
|
G_PlayerDeviceRumble(i, low, high, 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player->kartstuff[k_spinouttimer])
|
||||||
|
{
|
||||||
|
//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
|
||||||
|
}
|
||||||
|
else if (player->kartstuff[k_sneakertimer] > (sneakertime-(TICRATE/2)))
|
||||||
|
{
|
||||||
|
low = high = RUMBLE_STRONG;
|
||||||
|
}
|
||||||
|
else if ((player->kartstuff[k_offroad])
|
||||||
|
&& player->speed != 0
|
||||||
|
&& P_IsObjectOnGround(player->mo))
|
||||||
|
{
|
||||||
|
// weaken this depending on if you got hyu or invinc
|
||||||
|
if (player->kartstuff[k_hyudorotimer])
|
||||||
|
{
|
||||||
|
high = RUMBLE_WEAK;
|
||||||
|
}
|
||||||
|
else if (player->kartstuff[k_invincibilitytimer])
|
||||||
|
{
|
||||||
|
high = RUMBLE_MODERATE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
low = high = RUMBLE_MODERATE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((player->kartstuff[k_bananadrag] > TICRATE)
|
||||||
|
&& player->speed != 0
|
||||||
|
&& P_IsObjectOnGround(player->mo))
|
||||||
|
{
|
||||||
|
if (leveltime & 1) // this is actually funny lel
|
||||||
|
high = RUMBLE_MODERATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player->kartstuff[k_brakedrift])
|
||||||
|
{
|
||||||
|
high = CLAMP((high + RUMBLE_VERYWEAK), 0, UINT16_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
// pulse when gettin new driftlevel
|
||||||
|
// let this come last
|
||||||
|
if (player->kartstuff[k_driftcharge]
|
||||||
|
&& player->driftlevel)
|
||||||
|
{
|
||||||
|
high = CLAMP((high + RUMBLE_VERYWEAK), 0, UINT16_MAX);
|
||||||
|
|
||||||
|
if (player->driftlevel == 2)
|
||||||
|
lenght = 114;
|
||||||
|
else if (player->driftlevel == 3)
|
||||||
|
lenght = 174;
|
||||||
|
}
|
||||||
|
|
||||||
|
// hack alert! i just dont want this thing constantly resetting the rumble lol
|
||||||
|
if (low == 0 && high == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
G_PlayerDeviceRumble(i, low, high, lenght);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detach any keys associated to the given game control
|
// Detach any keys associated to the given game control
|
||||||
// - pass the pointer to the gamecontrol table for the player being edited
|
// - pass the pointer to the gamecontrol table for the player being edited
|
||||||
|
|||||||
+13
-6
@@ -109,14 +109,17 @@ typedef enum
|
|||||||
} gamecontrols_e;
|
} gamecontrols_e;
|
||||||
|
|
||||||
// mouse values are used once
|
// mouse values are used once
|
||||||
extern consvar_t cv_mousesens, 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_rumble[MAXSPLITSCREENPLAYERS];
|
||||||
|
extern consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS];
|
||||||
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
|
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
|
||||||
|
|
||||||
|
extern consvar_t cv_gamepadledifunfocused;
|
||||||
|
extern consvar_t cv_rumbleifunfocused;
|
||||||
|
|
||||||
extern INT32 mousex, mousey;
|
extern INT32 mousex, mousey;
|
||||||
extern INT32 mlooky; //mousey with mlookSensitivity
|
|
||||||
|
|
||||||
extern INT32 joyxmove[MAXSPLITSCREENPLAYERS][JOYAXISSET], joyymove[MAXSPLITSCREENPLAYERS][JOYAXISSET];
|
extern INT32 joyxmove[MAXSPLITSCREENPLAYERS][JOYAXISSET], joyymove[MAXSPLITSCREENPLAYERS][JOYAXISSET];
|
||||||
|
|
||||||
@@ -131,13 +134,17 @@ extern INT32 gamecontrol[MAXSPLITSCREENPLAYERS][num_gamecontrols][2];
|
|||||||
#define PLAYER3INPUTDOWN(gc) (gamekeydown[gamecontrol[2][gc][0]] || gamekeydown[gamecontrol[2][gc][1]])
|
#define PLAYER3INPUTDOWN(gc) (gamekeydown[gamecontrol[2][gc][0]] || gamekeydown[gamecontrol[2][gc][1]])
|
||||||
#define PLAYER4INPUTDOWN(gc) (gamekeydown[gamecontrol[3][gc][0]] || gamekeydown[gamecontrol[3][gc][1]])
|
#define PLAYER4INPUTDOWN(gc) (gamekeydown[gamecontrol[3][gc][0]] || gamekeydown[gamecontrol[3][gc][1]])
|
||||||
|
|
||||||
// peace to my little coder fingers!
|
UINT8 G_GetSkinColorForGamepad(INT32 playernum);
|
||||||
// check a gamecontrol being active or not
|
void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT8 color);
|
||||||
|
void G_DeviceLEDTick(void);
|
||||||
|
void G_ResetDeviceLED(void);
|
||||||
|
|
||||||
UINT16 G_GetSkinColor(INT32 playernum);
|
|
||||||
void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT16 color);
|
|
||||||
void G_ResetAllDeviceRumbles(void);
|
void G_ResetAllDeviceRumbles(void);
|
||||||
void G_PlayerDeviceRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration);
|
void G_PlayerDeviceRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration);
|
||||||
|
void G_DeviceRumbleTick(void);
|
||||||
|
|
||||||
|
// peace to my little coder fingers!
|
||||||
|
// check a gamecontrol being active or not
|
||||||
|
|
||||||
// remaps the input event to a game control.
|
// remaps the input event to a game control.
|
||||||
void G_MapEventsToControls(event_t *ev);
|
void G_MapEventsToControls(event_t *ev);
|
||||||
|
|||||||
+31
-25
@@ -21,28 +21,28 @@
|
|||||||
|
|
||||||
// The texture for the next polygon given to HWR_ProcessPolygon.
|
// The texture for the next polygon given to HWR_ProcessPolygon.
|
||||||
// Set with HWR_SetCurrentTexture.
|
// Set with HWR_SetCurrentTexture.
|
||||||
GLMipmap_t *current_texture = NULL;
|
static GLMipmap_t *current_texture = NULL;
|
||||||
|
|
||||||
boolean currently_batching = false;
|
static boolean currently_batching = false;
|
||||||
|
|
||||||
FOutVector* finalVertexArray = NULL;// contains subset of sorted vertices and texture coordinates to be sent to gpu
|
static FOutVector* finalVertexArray = NULL;// contains subset of sorted vertices and texture coordinates to be sent to gpu
|
||||||
UINT32* finalVertexIndexArray = NULL;// contains indexes for glDrawElements, taking into account fan->triangles conversion
|
static UINT32* finalVertexIndexArray = NULL;// contains indexes for glDrawElements, taking into account fan->triangles conversion
|
||||||
// NOTE have this alloced as 3x finalVertexArray size
|
// NOTE have this alloced as 3x finalVertexArray size
|
||||||
int finalVertexArrayAllocSize = 65536;
|
static int finalVertexArrayAllocSize = 65536;
|
||||||
|
|
||||||
//GLubyte* colorArray = NULL;// contains color data to be sent to gpu, if needed
|
//GLubyte* colorArray = NULL;// contains color data to be sent to gpu, if needed
|
||||||
//int colorArrayAllocSize = 65536;
|
//int colorArrayAllocSize = 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
|
||||||
|
|
||||||
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
|
||||||
PolygonArrayEntry **polygonArraySorted = NULL; // contains sorted pointers to polygonArray
|
static PolygonArrayEntry **polygonArraySorted = NULL; // contains sorted pointers to polygonArray
|
||||||
int polygonArraySize = 0;
|
static int polygonArraySize = 0;
|
||||||
int polygonArrayAllocSize = 65536;
|
static int polygonArrayAllocSize = 65536;
|
||||||
|
|
||||||
FOutVector* unsortedVertexArray = NULL; // contains unsorted vertices and texture coordinates from DrawPolygon
|
static FOutVector* unsortedVertexArray = NULL; // contains unsorted vertices and texture coordinates from DrawPolygon
|
||||||
int unsortedVertexArraySize = 0;
|
static int unsortedVertexArraySize = 0;
|
||||||
int unsortedVertexArrayAllocSize = 65536;
|
static int unsortedVertexArrayAllocSize = 65536;
|
||||||
|
|
||||||
// Enables batching mode. HWR_ProcessPolygon will collect polygons instead of passing them directly to the rendering backend.
|
// Enables batching mode. HWR_ProcessPolygon will collect polygons instead of passing them directly to the rendering backend.
|
||||||
// Call HWR_RenderBatches to render all the collected geometry.
|
// Call HWR_RenderBatches to render all the collected geometry.
|
||||||
@@ -126,8 +126,9 @@ void HWR_ProcessPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPt
|
|||||||
if (!(PolyFlags & PF_NoTexture) && !horizonSpecial)
|
if (!(PolyFlags & PF_NoTexture) && !horizonSpecial)
|
||||||
{
|
{
|
||||||
// use FNV-1a to hash polygons for later sorting.
|
// use FNV-1a to hash polygons for later sorting.
|
||||||
INT32 hash = 0x811c9dc5;
|
UINT32 hash = 0x811c9dc5;
|
||||||
#define DIGEST(h, x) h ^= (x); h *= 0x01000193
|
UINT32 prime = 0x1000193;
|
||||||
|
#define DIGEST(h, x) h ^= ((UINT32)(x)); h *= prime
|
||||||
if (current_texture)
|
if (current_texture)
|
||||||
{
|
{
|
||||||
DIGEST(hash, current_texture->downloaded);
|
DIGEST(hash, current_texture->downloaded);
|
||||||
@@ -148,7 +149,7 @@ void HWR_ProcessPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPt
|
|||||||
}
|
}
|
||||||
#undef DIGEST
|
#undef DIGEST
|
||||||
// remove the sign bit to ensure that skybox and horizon line comes first.
|
// remove the sign bit to ensure that skybox and horizon line comes first.
|
||||||
polygonArray[polygonArraySize-1].hash = (hash & INT32_MAX);
|
polygonArray[polygonArraySize-1].hash = (INT32)(hash & INT32_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(&unsortedVertexArray[unsortedVertexArraySize], pOutVerts, iNumPts * sizeof(FOutVector));
|
memcpy(&unsortedVertexArray[unsortedVertexArraySize], pOutVerts, iNumPts * sizeof(FOutVector));
|
||||||
@@ -168,8 +169,10 @@ static int comparePolygons(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 int shader1 = (poly1->polyFlags & PF_NoTexture || poly1->horizonSpecial) ? -1 : poly1->shader;
|
// special case with signedness to prevent overflowing
|
||||||
const int shader2 = (poly2->polyFlags & PF_NoTexture || poly2->horizonSpecial) ? -1 : poly2->shader;
|
// FIXME: check for prediction slowdowns!
|
||||||
|
const int shader1 = poly1->hash & 0x80000000 ? -1 : poly1->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)
|
||||||
@@ -210,8 +213,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->polyFlags & PF_NoTexture || poly1->horizonSpecial) ? NULL : poly1->texture;
|
const GLMipmap_t *texture1 = poly1->hash & 0x80000000 ? NULL : poly1->texture;
|
||||||
const GLMipmap_t *texture2 = (poly2->polyFlags & PF_NoTexture || poly2->horizonSpecial) ? 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)
|
||||||
@@ -219,6 +222,7 @@ static int comparePolygonsNoShaders(const void *p1, const void *p2)
|
|||||||
|
|
||||||
UINT32 downloaded1 = texture1 ? texture1->downloaded : 0; // there should be a opengl texture name here, usable for comparisons
|
UINT32 downloaded1 = texture1 ? texture1->downloaded : 0; // there should be a opengl texture name here, usable for comparisons
|
||||||
UINT32 downloaded2 = texture2 ? texture2->downloaded : 0;
|
UINT32 downloaded2 = texture2 ? texture2->downloaded : 0;
|
||||||
|
|
||||||
diff64 = downloaded1 - downloaded2;
|
diff64 = downloaded1 - downloaded2;
|
||||||
if (diff64 != 0) return diff64;
|
if (diff64 != 0) return diff64;
|
||||||
|
|
||||||
@@ -260,7 +264,7 @@ void HWR_RenderBatches(void)
|
|||||||
nextSurfaceInfo.LightInfo.light_level = 0;
|
nextSurfaceInfo.LightInfo.light_level = 0;
|
||||||
nextSurfaceInfo.LightInfo.directional = false;
|
nextSurfaceInfo.LightInfo.directional = false;
|
||||||
|
|
||||||
currently_batching = false;// no longer collecting batches
|
currently_batching = false; // no longer collecting batches
|
||||||
|
|
||||||
if (!polygonArraySize)
|
if (!polygonArraySize)
|
||||||
{
|
{
|
||||||
@@ -270,6 +274,8 @@ void HWR_RenderBatches(void)
|
|||||||
return;// nothing to draw
|
return;// nothing to draw
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const boolean useshader = HWR_UseShader();
|
||||||
|
|
||||||
// init stats vars
|
// init stats vars
|
||||||
ps_hw_numpolys.value.i = polygonArraySize;
|
ps_hw_numpolys.value.i = polygonArraySize;
|
||||||
ps_hw_numcalls.value.i = ps_hw_numverts.value.i = 0;
|
ps_hw_numcalls.value.i = ps_hw_numverts.value.i = 0;
|
||||||
@@ -284,7 +290,7 @@ void HWR_RenderBatches(void)
|
|||||||
|
|
||||||
// sort polygons
|
// sort polygons
|
||||||
PS_START_TIMING(ps_hw_batchsorttime);
|
PS_START_TIMING(ps_hw_batchsorttime);
|
||||||
qs22j(polygonArraySorted, polygonArraySize, sizeof(PolygonArrayEntry *), (HWR_UseShader() ? comparePolygons : comparePolygonsNoShaders));
|
qs22j(polygonArraySorted, polygonArraySize, sizeof(PolygonArrayEntry *), (useshader ? comparePolygons : comparePolygonsNoShaders));
|
||||||
PS_STOP_TIMING(ps_hw_batchsorttime);
|
PS_STOP_TIMING(ps_hw_batchsorttime);
|
||||||
|
|
||||||
// sort order
|
// sort order
|
||||||
@@ -305,7 +311,7 @@ void HWR_RenderBatches(void)
|
|||||||
|
|
||||||
// set state for first batch
|
// set state for first batch
|
||||||
|
|
||||||
if (HWR_UseShader())
|
if (useshader)
|
||||||
{
|
{
|
||||||
GL_SetShader(currentShader);
|
GL_SetShader(currentShader);
|
||||||
}
|
}
|
||||||
@@ -385,9 +391,9 @@ void HWR_RenderBatches(void)
|
|||||||
nextSurfaceInfo = nextEntry->surf;
|
nextSurfaceInfo = nextEntry->surf;
|
||||||
|
|
||||||
if (nextPolyFlags & PF_NoTexture)
|
if (nextPolyFlags & PF_NoTexture)
|
||||||
nextTexture = 0;
|
nextTexture = NULL;
|
||||||
|
|
||||||
if (currentShader != nextShader && HWR_UseShader())
|
if (useshader && currentShader != nextShader)
|
||||||
{
|
{
|
||||||
changeState = true;
|
changeState = true;
|
||||||
changeShader = true;
|
changeShader = true;
|
||||||
@@ -405,7 +411,7 @@ void HWR_RenderBatches(void)
|
|||||||
changePolyFlags = true;
|
changePolyFlags = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HWR_UseShader())
|
if (useshader)
|
||||||
{
|
{
|
||||||
if (currentSurfaceInfo.PolyColor.rgba != nextSurfaceInfo.PolyColor.rgba ||
|
if (currentSurfaceInfo.PolyColor.rgba != nextSurfaceInfo.PolyColor.rgba ||
|
||||||
currentSurfaceInfo.TintColor.rgba != nextSurfaceInfo.TintColor.rgba ||
|
currentSurfaceInfo.TintColor.rgba != nextSurfaceInfo.TintColor.rgba ||
|
||||||
|
|||||||
@@ -538,7 +538,7 @@ static void loading_status(void)
|
|||||||
x = BASEVIDWIDTH/2;
|
x = BASEVIDWIDTH/2;
|
||||||
y = BASEVIDHEIGHT/2;
|
y = BASEVIDHEIGHT/2;
|
||||||
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); // Black background to match fade in effect
|
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); // Black background to match fade in effect
|
||||||
//V_DrawPatchFill(W_CachePatchName("SRB2BACK", PU_PATCH)); // SRB2 background, ehhh too bright.
|
//V_DrawPatchFill(srb2back); // SRB2 background, ehhh too bright.
|
||||||
M_DrawTextBox(x-58, y-8, 13, 1);
|
M_DrawTextBox(x-58, y-8, 13, 1);
|
||||||
V_DrawString(x-50, y, V_YELLOWMAP, "Loading...");
|
V_DrawString(x-50, y, V_YELLOWMAP, "Loading...");
|
||||||
V_DrawRightAlignedString(x+50, y, V_YELLOWMAP, s);
|
V_DrawRightAlignedString(x+50, y, V_YELLOWMAP, s);
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
|
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
#include "hw_main.h"
|
#include "hw_main.h"
|
||||||
#include "hw_glob.h"
|
#include "hw_glob.h"
|
||||||
#include "hw_gl.h"
|
#include "hw_gl.h"
|
||||||
@@ -36,7 +38,7 @@
|
|||||||
INT32 patchformat = GL_TEXFMT_AP_88; // use alpha for holes
|
INT32 patchformat = GL_TEXFMT_AP_88; // use alpha for holes
|
||||||
INT32 textureformat = GL_TEXFMT_P_8; // use chromakey for hole
|
INT32 textureformat = GL_TEXFMT_P_8; // use chromakey for hole
|
||||||
|
|
||||||
RGBA_t mapPalette[256] = {0}; // the palette for the currently loaded level or menu etc.
|
RGBA_t mapPalette[256] = {}; // the palette for the currently loaded level or menu etc.
|
||||||
|
|
||||||
static void HWR_FreeTextureColormaps(patch_t *patch);
|
static void HWR_FreeTextureColormaps(patch_t *patch);
|
||||||
|
|
||||||
@@ -98,7 +100,7 @@ static void HWR_DrawColumnInCache(const column_t *patchcol, UINT8 *block, GLMipm
|
|||||||
position = 0;
|
position = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
position = max(((position * scale_y) + (FRACUNIT/2)) >> FRACBITS, 0);
|
position = std::max(((position * scale_y) + (FRACUNIT/2)) >> FRACBITS, 0);
|
||||||
|
|
||||||
if (position + count >= pblockheight)
|
if (position + count >= pblockheight)
|
||||||
count = pblockheight - position;
|
count = pblockheight - position;
|
||||||
@@ -162,7 +164,7 @@ static void HWR_DrawPatchInCache(GLMipmap_t *mipmap,
|
|||||||
fixed_t xfrac, xfracstep;
|
fixed_t xfrac, xfracstep;
|
||||||
fixed_t yfracstep, scale_y;
|
fixed_t yfracstep, scale_y;
|
||||||
const column_t *patchcol;
|
const column_t *patchcol;
|
||||||
UINT8 *block = mipmap->data;
|
UINT8 *block = static_cast<UINT8 *>(mipmap->data);
|
||||||
INT32 bpp;
|
INT32 bpp;
|
||||||
INT32 blockmodulo;
|
INT32 blockmodulo;
|
||||||
RGBA_t *palette;
|
RGBA_t *palette;
|
||||||
@@ -212,7 +214,7 @@ static void HWR_DrawTexturePatchInCache(GLMipmap_t *mipmap,
|
|||||||
fixed_t xfrac, xfracstep;
|
fixed_t xfrac, xfracstep;
|
||||||
fixed_t yfracstep, scale_y;
|
fixed_t yfracstep, scale_y;
|
||||||
const column_t *patchcol;
|
const column_t *patchcol;
|
||||||
UINT8 *block = mipmap->data;
|
UINT8 *block = static_cast<UINT8 *>(mipmap->data);
|
||||||
INT32 bpp;
|
INT32 bpp;
|
||||||
INT32 blockmodulo;
|
INT32 blockmodulo;
|
||||||
INT32 width, height;
|
INT32 width, height;
|
||||||
@@ -287,8 +289,8 @@ static UINT8 *MakeBlock(GLMipmap_t *glMipmap)
|
|||||||
UINT16 bu16 = ((0x00 <<8) | HWR_PATCHES_CHROMAKEY_COLORINDEX);
|
UINT16 bu16 = ((0x00 <<8) | HWR_PATCHES_CHROMAKEY_COLORINDEX);
|
||||||
INT32 blocksize = (glMipmap->width * glMipmap->height);
|
INT32 blocksize = (glMipmap->width * glMipmap->height);
|
||||||
|
|
||||||
bpp = format2bpp(glMipmap->format);
|
bpp = format2bpp(glMipmap->format);
|
||||||
block = Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data));
|
block = static_cast<UINT8 *>(Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data)));
|
||||||
|
|
||||||
switch (bpp)
|
switch (bpp)
|
||||||
{
|
{
|
||||||
@@ -325,7 +327,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
|
|||||||
texture = textures[texnum];
|
texture = textures[texnum];
|
||||||
|
|
||||||
gltex->mipmap.flags = TF_CHROMAKEYED | TF_WRAPXY;
|
gltex->mipmap.flags = TF_CHROMAKEYED | TF_WRAPXY;
|
||||||
gltex->mipmap.format = textureformat;
|
gltex->mipmap.format = static_cast<GLTextureFormat_t>(textureformat);
|
||||||
|
|
||||||
// hack the Legacy skies..
|
// hack the Legacy skies..
|
||||||
if (UNLIKELY(memcmp(texture->name, "SKY", 3) == 0 &&
|
if (UNLIKELY(memcmp(texture->name, "SKY", 3) == 0 &&
|
||||||
@@ -344,7 +346,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
|
|||||||
colormap += COLORMAP_REMAPOFFSET;
|
colormap += COLORMAP_REMAPOFFSET;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
gltex->mipmap.colormap = Z_Calloc(sizeof(*gltex->mipmap.colormap), PU_HWRPATCHCOLMIPMAP, NULL);
|
gltex->mipmap.colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*gltex->mipmap.colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||||
gltex->mipmap.colormap->source = colormap;
|
gltex->mipmap.colormap->source = colormap;
|
||||||
memcpy(gltex->mipmap.colormap->data, colormap, 256 * sizeof(UINT8));
|
memcpy(gltex->mipmap.colormap->data, colormap, 256 * sizeof(UINT8));
|
||||||
|
|
||||||
@@ -377,7 +379,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
|
|||||||
// Composite the columns together.
|
// Composite the columns together.
|
||||||
for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++)
|
for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++)
|
||||||
{
|
{
|
||||||
pdata = W_CacheLumpNumPwad(patch->wad, patch->lump, PU_LEVEL);
|
pdata = static_cast<UINT8 *>(W_CacheLumpNumPwad(patch->wad, patch->lump, PU_LEVEL));
|
||||||
realpatch = (softwarepatch_t *)pdata;
|
realpatch = (softwarepatch_t *)pdata;
|
||||||
|
|
||||||
HWR_DrawTexturePatchInCache(&gltex->mipmap, blockwidth, blockheight, texture, patch, realpatch);
|
HWR_DrawTexturePatchInCache(&gltex->mipmap, blockwidth, blockheight, texture, patch, realpatch);
|
||||||
@@ -413,7 +415,7 @@ void HWR_MakePatch(const patch_t *patch, GLPatch_t *glPatch, GLMipmap_t *glMipma
|
|||||||
glMipmap->flags = 0;
|
glMipmap->flags = 0;
|
||||||
|
|
||||||
// setup the texture info
|
// setup the texture info
|
||||||
glMipmap->format = patchformat;
|
glMipmap->format = static_cast<GLTextureFormat_t>(patchformat);
|
||||||
|
|
||||||
glPatch->max_s = (float)patch->width / (float)glMipmap->width;
|
glPatch->max_s = (float)patch->width / (float)glMipmap->width;
|
||||||
glPatch->max_t = (float)patch->height / (float)glMipmap->height;
|
glPatch->max_t = (float)patch->height / (float)glMipmap->height;
|
||||||
@@ -455,12 +457,13 @@ static void HWR_FreeTextureData(patch_t *patch)
|
|||||||
if (!patch || !patch->hardware)
|
if (!patch || !patch->hardware)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
glPatch = patch->hardware;
|
glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||||
|
|
||||||
if (vid.glstate == VID_GL_LIBRARY_LOADED)
|
if (vid.glstate == VID_GL_LIBRARY_LOADED)
|
||||||
GL_DeleteTexture(glPatch->mipmap);
|
GL_DeleteTexture(glPatch->mipmap);
|
||||||
|
|
||||||
Z_Free(glPatch->mipmap->data);
|
Z_Free(glPatch->mipmap->data);
|
||||||
|
glPatch->mipmap->data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HWR_FreeTexture(patch_t *patch)
|
void HWR_FreeTexture(patch_t *patch)
|
||||||
@@ -470,7 +473,7 @@ void HWR_FreeTexture(patch_t *patch)
|
|||||||
|
|
||||||
if (patch->hardware)
|
if (patch->hardware)
|
||||||
{
|
{
|
||||||
GLPatch_t *glPatch = patch->hardware;
|
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||||
|
|
||||||
HWR_FreeTextureColormaps(patch);
|
HWR_FreeTextureColormaps(patch);
|
||||||
|
|
||||||
@@ -478,6 +481,7 @@ void HWR_FreeTexture(patch_t *patch)
|
|||||||
{
|
{
|
||||||
HWR_FreeTextureData(patch);
|
HWR_FreeTextureData(patch);
|
||||||
Z_Free(glPatch->mipmap);
|
Z_Free(glPatch->mipmap);
|
||||||
|
glPatch->mipmap = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Z_Free(patch->hardware);
|
Z_Free(patch->hardware);
|
||||||
@@ -495,7 +499,7 @@ static void HWR_FreeTextureColormaps(patch_t *patch)
|
|||||||
if (!patch)
|
if (!patch)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pat = patch->hardware;
|
pat = static_cast<GLPatch_t *>(patch->hardware);
|
||||||
if (!pat)
|
if (!pat)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -577,6 +581,9 @@ void HWR_InitMapTextures(void)
|
|||||||
|
|
||||||
static void FreeMapTexture(GLMapTexture_t *tex)
|
static void FreeMapTexture(GLMapTexture_t *tex)
|
||||||
{
|
{
|
||||||
|
if (!tex)
|
||||||
|
return;
|
||||||
|
|
||||||
GL_DeleteTexture(&tex->mipmap);
|
GL_DeleteTexture(&tex->mipmap);
|
||||||
Z_Free(tex->mipmap.data);
|
Z_Free(tex->mipmap.data);
|
||||||
tex->mipmap.data = NULL;
|
tex->mipmap.data = NULL;
|
||||||
@@ -586,6 +593,12 @@ void HWR_FreeMapTextures(void)
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
|
if (!gl_textures)
|
||||||
|
{
|
||||||
|
gl_numtextures = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < gl_numtextures; i++)
|
for (i = 0; i < gl_numtextures; i++)
|
||||||
{
|
{
|
||||||
FreeMapTexture(&gl_textures[i].normal);
|
FreeMapTexture(&gl_textures[i].normal);
|
||||||
@@ -596,18 +609,29 @@ void HWR_FreeMapTextures(void)
|
|||||||
|
|
||||||
// now the heap don't have any 'user' pointing to our
|
// now the heap don't have any 'user' pointing to our
|
||||||
// texturecache info, we can free it
|
// texturecache info, we can free it
|
||||||
if (gl_textures)
|
free(gl_textures);
|
||||||
free(gl_textures);
|
|
||||||
gl_textures = NULL;
|
gl_textures = NULL;
|
||||||
gl_numtextures = 0;
|
gl_numtextures = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HWR_PrecacheLevelFlats(void)
|
static void HWR_PrecacheLevelFlats(void)
|
||||||
{
|
{
|
||||||
lumpnum_t lump;
|
// lookup for flats that may´ve been already loaded
|
||||||
|
// too lazy to make a hashtable or smth so unordered set will do :carbuncle:
|
||||||
|
std::unordered_set<UINT32> flatpresent;
|
||||||
size_t i, j;
|
size_t i, j;
|
||||||
INT32 k;
|
INT32 k;
|
||||||
|
|
||||||
|
auto load_flat = [&](lumpnum_t lump, boolean noencoremap)
|
||||||
|
{
|
||||||
|
// flat already loaded?
|
||||||
|
if (flatpresent.count(lump) == 0)
|
||||||
|
{
|
||||||
|
HWR_GetFlat(lump, noencoremap);
|
||||||
|
flatpresent.insert(lump);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// special case for encore
|
// special case for encore
|
||||||
#ifdef GLENCORE
|
#ifdef GLENCORE
|
||||||
if (encoremap)
|
if (encoremap)
|
||||||
@@ -625,15 +649,14 @@ static void HWR_PrecacheLevelFlats(void)
|
|||||||
|
|
||||||
const levelflat_t *levelflat = &levelflats[pic];
|
const levelflat_t *levelflat = &levelflats[pic];
|
||||||
|
|
||||||
lump = levelflat->lumpnum;
|
load_flat(levelflat->lumpnum, R_NoEncore(sec, ceiling));
|
||||||
HWR_GetFlat(lump, R_NoEncore(sec, ceiling));
|
|
||||||
|
|
||||||
if (levelflat->speed) // it is an animated flat
|
if (levelflat->speed) // is it an animated flat ?
|
||||||
{
|
{
|
||||||
for (k = 1; k < levelflat->numpics; k++)
|
// start from 0, occasionally basenumlump != flat->lumpnum
|
||||||
|
for (k = 0; k < levelflat->numpics; k++)
|
||||||
{
|
{
|
||||||
lump = levelflat->baselumpnum + k;
|
load_flat(levelflat->baselumpnum + k, R_NoEncore(sec, ceiling));
|
||||||
HWR_GetFlat(lump, R_NoEncore(sec, ceiling));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -647,17 +670,16 @@ static void HWR_PrecacheLevelFlats(void)
|
|||||||
for (i = 0; i < numlevelflats; i++)
|
for (i = 0; i < numlevelflats; i++)
|
||||||
{
|
{
|
||||||
const levelflat_t *levelflat = &levelflats[i];
|
const levelflat_t *levelflat = &levelflats[i];
|
||||||
lump = levelflat->lumpnum;
|
|
||||||
|
|
||||||
HWR_GetFlat(lump, false);
|
load_flat(levelflat->lumpnum, false);
|
||||||
|
|
||||||
if (!levelflat->speed) // is it an animated flat ?
|
if (levelflat->speed) // is it an animated flat ?
|
||||||
continue;
|
|
||||||
|
|
||||||
for (k = 1; k < levelflat->numpics; k++)
|
|
||||||
{
|
{
|
||||||
lump = levelflat->baselumpnum + k;
|
// start from 0, occasionally basenumlump != flat->lumpnum
|
||||||
HWR_GetFlat(lump, false);
|
for (k = 0; k < levelflat->numpics; k++)
|
||||||
|
{
|
||||||
|
load_flat(levelflat->baselumpnum + k, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -670,7 +692,7 @@ static void HWR_PrecacheLevelTextures(void)
|
|||||||
size_t i, j, f;
|
size_t i, j, f;
|
||||||
INT32 h;
|
INT32 h;
|
||||||
|
|
||||||
texturepresent = calloc(numtextures, sizeof (*texturepresent));
|
texturepresent = static_cast<char *>(calloc(gl_numtextures, sizeof(*texturepresent)));
|
||||||
if (texturepresent == NULL)
|
if (texturepresent == NULL)
|
||||||
I_Error("%s: Out of memory looking up textures", "HWR_PrecacheLevel");
|
I_Error("%s: Out of memory looking up textures", "HWR_PrecacheLevel");
|
||||||
|
|
||||||
@@ -701,7 +723,10 @@ static void HWR_PrecacheLevelTextures(void)
|
|||||||
{
|
{
|
||||||
const INT32 texnum = sidetex[f];
|
const INT32 texnum = sidetex[f];
|
||||||
|
|
||||||
if (texnum < 0 || texnum >= numtextures || texturepresent[texnum])
|
if (texnum < 0 || texnum >= (signed)gl_numtextures)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (texturepresent[texnum])
|
||||||
continue;
|
continue;
|
||||||
#ifdef GLENCORE
|
#ifdef GLENCORE
|
||||||
texturepresent[texnum] = 1|noencoremap;
|
texturepresent[texnum] = 1|noencoremap;
|
||||||
@@ -729,14 +754,16 @@ static void HWR_PrecacheLevelTextures(void)
|
|||||||
|
|
||||||
for (h = 1; h < anim->numpics; h++)
|
for (h = 1; h < anim->numpics; h++)
|
||||||
{
|
{
|
||||||
|
const INT32 animtexnum = anim->basepic+h;
|
||||||
|
|
||||||
if (texpresent & 1)
|
if (texpresent & 1)
|
||||||
{
|
{
|
||||||
HWR_GetTexture(anim->basepic+h, false);
|
HWR_GetTexture(animtexnum, false);
|
||||||
}
|
}
|
||||||
#ifdef GLENCORE
|
#ifdef GLENCORE
|
||||||
if (texpresent & 2)
|
if (texpresent & 2)
|
||||||
{
|
{
|
||||||
HWR_GetTexture(anim->basepic+h, true);
|
HWR_GetTexture(animtexnum, true);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -840,7 +867,7 @@ void HWR_LoadMapTextures(size_t pnumtextures)
|
|||||||
HWR_FreeMapTextures();
|
HWR_FreeMapTextures();
|
||||||
|
|
||||||
gl_numtextures = pnumtextures;
|
gl_numtextures = pnumtextures;
|
||||||
gl_textures = calloc(gl_numtextures, sizeof(*gl_textures)); // *2 - 1 for encore-remapped texture and another for noencore texture (unused when not in encore), see: GLMapTextureSet_t
|
gl_textures = static_cast<GLMapTextureSet_t *>(calloc(gl_numtextures, sizeof(*gl_textures))); // *2 - 1 for encore-remapped texture and another for noencore texture (unused when not in encore), see: GLMapTextureSet_t
|
||||||
|
|
||||||
if (gl_textures == NULL)
|
if (gl_textures == NULL)
|
||||||
I_Error("HWR_LoadMapTextures: ran out of memory for OpenGL textures. Sad!");
|
I_Error("HWR_LoadMapTextures: ran out of memory for OpenGL textures. Sad!");
|
||||||
@@ -852,6 +879,7 @@ void HWR_LoadMapTextures(size_t pnumtextures)
|
|||||||
GLMapTexture_t *HWR_GetTexture(INT32 tex, boolean noencore)
|
GLMapTexture_t *HWR_GetTexture(INT32 tex, boolean noencore)
|
||||||
{
|
{
|
||||||
GLMapTexture_t *gltex;
|
GLMapTexture_t *gltex;
|
||||||
|
GLMipmap_t *glMipmap;
|
||||||
|
|
||||||
if (tex < 0 || tex >= (signed)gl_numtextures)
|
if (tex < 0 || tex >= (signed)gl_numtextures)
|
||||||
{
|
{
|
||||||
@@ -870,19 +898,22 @@ GLMapTexture_t *HWR_GetTexture(INT32 tex, boolean noencore)
|
|||||||
gltex = &gl_textures[tex];
|
gltex = &gl_textures[tex];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
glMipmap = &gltex->mipmap;
|
||||||
|
|
||||||
// Generate texture if missing from the cache
|
// Generate texture if missing from the cache
|
||||||
if (!gltex->mipmap.downloaded)
|
if (!glMipmap->downloaded)
|
||||||
{
|
{
|
||||||
if (!gltex->mipmap.data)
|
if (!gltex->mipmap.data)
|
||||||
HWR_GenerateTexture(tex, gltex, noencore);
|
HWR_GenerateTexture(tex, gltex, noencore);
|
||||||
|
|
||||||
// If hardware does not have the texture, then call GL_SetTexture to upload it
|
// If hardware does not have the texture, then call GL_SetTexture to upload it
|
||||||
GL_SetTexture(&gltex->mipmap);
|
GL_SetTexture(glMipmap);
|
||||||
}
|
}
|
||||||
HWR_SetCurrentTexture(&gltex->mipmap);
|
|
||||||
|
HWR_SetCurrentTexture(glMipmap);
|
||||||
|
|
||||||
// The system-memory data can be purged now.
|
// The system-memory data can be purged now.
|
||||||
Z_ChangeTag(gltex->mipmap.data, PU_HWRCACHE_UNLOCKED);
|
Z_ChangeTag(glMipmap->data, PU_HWRCACHE_UNLOCKED);
|
||||||
|
|
||||||
return gltex;
|
return gltex;
|
||||||
}
|
}
|
||||||
@@ -933,7 +964,7 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum)
|
|||||||
W_ReadLump(flatlumpnum, Z_Malloc(size, PU_HWRCACHE, &glMipmap->data));
|
W_ReadLump(flatlumpnum, Z_Malloc(size, PU_HWRCACHE, &glMipmap->data));
|
||||||
|
|
||||||
#ifdef GLENCORE
|
#ifdef GLENCORE
|
||||||
flat = glMipmap->data;
|
flat = static_cast<UINT8 *>(glMipmap->data);
|
||||||
for (steppy = 0; steppy < size; steppy++)
|
for (steppy = 0; steppy < size; steppy++)
|
||||||
{
|
{
|
||||||
if (flat[steppy] == HWR_PATCHES_CHROMAKEY_COLORINDEX)
|
if (flat[steppy] == HWR_PATCHES_CHROMAKEY_COLORINDEX)
|
||||||
@@ -977,7 +1008,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
|
|||||||
if (!noencoremap && encoremap)
|
if (!noencoremap && encoremap)
|
||||||
colormap += COLORMAP_REMAPOFFSET;
|
colormap += COLORMAP_REMAPOFFSET;
|
||||||
#endif
|
#endif
|
||||||
glMipmap->colormap = Z_Calloc(sizeof(*glMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL);
|
glMipmap->colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*glMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||||
glMipmap->colormap->source = colormap;
|
glMipmap->colormap->source = colormap;
|
||||||
memcpy(glMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
memcpy(glMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
||||||
}
|
}
|
||||||
@@ -1001,7 +1032,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
|
|||||||
// --------------------+
|
// --------------------+
|
||||||
static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
||||||
{
|
{
|
||||||
GLPatch_t *glPatch = patch->hardware;
|
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||||
|
|
||||||
if (!glMipmap->downloaded)
|
if (!glMipmap->downloaded)
|
||||||
{
|
{
|
||||||
@@ -1022,8 +1053,8 @@ static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
|||||||
// ----------------------+
|
// ----------------------+
|
||||||
static void HWR_UpdatePatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
static void HWR_UpdatePatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
||||||
{
|
{
|
||||||
GLPatch_t *grPatch = patch->hardware;
|
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||||
HWR_MakePatch(patch, grPatch, glMipmap, true);
|
HWR_MakePatch(patch, glPatch, glMipmap, true);
|
||||||
|
|
||||||
// If hardware does not have the texture, then call GL_SetTexture to upload it
|
// If hardware does not have the texture, then call GL_SetTexture to upload it
|
||||||
// If it does have the texture, then call GL_UpdateTexture to update it
|
// If it does have the texture, then call GL_UpdateTexture to update it
|
||||||
@@ -1031,6 +1062,7 @@ static void HWR_UpdatePatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
|||||||
GL_SetTexture(glMipmap);
|
GL_SetTexture(glMipmap);
|
||||||
else
|
else
|
||||||
GL_UpdateTexture(glMipmap);
|
GL_UpdateTexture(glMipmap);
|
||||||
|
|
||||||
HWR_SetCurrentTexture(glMipmap);
|
HWR_SetCurrentTexture(glMipmap);
|
||||||
|
|
||||||
// The system-memory data can be purged now.
|
// The system-memory data can be purged now.
|
||||||
@@ -1057,7 +1089,7 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
|
|||||||
|
|
||||||
if (!patch->hardware)
|
if (!patch->hardware)
|
||||||
Patch_CreateGL(patch);
|
Patch_CreateGL(patch);
|
||||||
glPatch = patch->hardware;
|
glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||||
|
|
||||||
// Blatant hack for encore colormapping aside...
|
// Blatant hack for encore colormapping aside...
|
||||||
if (colormap == colormaps || colormap == NULL || colormap == (const UINT8*)(COLORMAP_REMAPOFFSET))
|
if (colormap == colormaps || colormap == NULL || colormap == (const UINT8*)(COLORMAP_REMAPOFFSET))
|
||||||
@@ -1093,12 +1125,12 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
|
|||||||
// (it have a liste of mipmap)
|
// (it have a liste of mipmap)
|
||||||
// this malloc is cleared in HWR_FreeColormapCache
|
// this malloc is cleared in HWR_FreeColormapCache
|
||||||
// (...) unfortunately z_malloc fragment alot the memory :(so malloc is better
|
// (...) unfortunately z_malloc fragment alot the memory :(so malloc is better
|
||||||
newMipmap = calloc(1, sizeof (*newMipmap));
|
newMipmap = static_cast<GLMipmap_t *>(calloc(1, sizeof (*newMipmap)));
|
||||||
if (newMipmap == NULL)
|
if (newMipmap == NULL)
|
||||||
I_Error("%s: Out of memory", "HWR_GetMappedPatch");
|
I_Error("%s: Out of memory", "HWR_GetMappedPatch");
|
||||||
glMipmap->nextcolormap = newMipmap;
|
glMipmap->nextcolormap = newMipmap;
|
||||||
|
|
||||||
newMipmap->colormap = Z_Calloc(sizeof(*newMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL);
|
newMipmap->colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*newMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
|
||||||
newMipmap->colormap->source = colormap;
|
newMipmap->colormap->source = colormap;
|
||||||
memcpy(newMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
memcpy(newMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
||||||
|
|
||||||
@@ -1121,7 +1153,7 @@ patch_t *HWR_GetCachedGLPatchPwad(UINT16 wadnum, UINT16 lumpnum)
|
|||||||
{
|
{
|
||||||
void *ptr = Z_Calloc(sizeof(patch_t), PU_PATCH, &lumpcache[lumpnum]);
|
void *ptr = Z_Calloc(sizeof(patch_t), PU_PATCH, &lumpcache[lumpnum]);
|
||||||
Patch_Create(NULL, 0, ptr);
|
Patch_Create(NULL, 0, ptr);
|
||||||
Patch_AllocateHardwarePatch(ptr);
|
Patch_AllocateHardwarePatch(static_cast<patch_t *>(ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
return (patch_t *)(lumpcache[lumpnum]);
|
return (patch_t *)(lumpcache[lumpnum]);
|
||||||
@@ -1138,7 +1170,7 @@ static void HWR_DrawFadeMaskInCache(GLMipmap_t *mipmap, INT32 pblockwidth, INT32
|
|||||||
{
|
{
|
||||||
INT32 i,j;
|
INT32 i,j;
|
||||||
fixed_t posx, posy, stepx, stepy;
|
fixed_t posx, posy, stepx, stepy;
|
||||||
UINT8 *block = mipmap->data; // places the data directly into here
|
UINT8 *block = static_cast<UINT8 *>(mipmap->data); // places the data directly into here
|
||||||
UINT8 *flat;
|
UINT8 *flat;
|
||||||
UINT8 *dest, *src, texel;
|
UINT8 *dest, *src, texel;
|
||||||
RGBA_t col;
|
RGBA_t col;
|
||||||
@@ -1294,9 +1326,9 @@ void HWR_SetPalette(RGBA_t *palette)
|
|||||||
static void HWR_SetPaletteLookup(RGBA_t *palette)
|
static void HWR_SetPaletteLookup(RGBA_t *palette)
|
||||||
{
|
{
|
||||||
int r, g, b;
|
int r, g, b;
|
||||||
UINT8 *lut = Z_Malloc(
|
UINT8 *lut = static_cast<UINT8 *>(Z_Malloc(
|
||||||
HWR_PALETTE_LUT_SIZE*HWR_PALETTE_LUT_SIZE*HWR_PALETTE_LUT_SIZE*sizeof(UINT8),
|
HWR_PALETTE_LUT_SIZE*HWR_PALETTE_LUT_SIZE*HWR_PALETTE_LUT_SIZE*sizeof(UINT8),
|
||||||
PU_STATIC, NULL);
|
PU_STATIC, NULL));
|
||||||
#define STEP_SIZE (256/HWR_PALETTE_LUT_SIZE)
|
#define STEP_SIZE (256/HWR_PALETTE_LUT_SIZE)
|
||||||
for (b = 0; b < HWR_PALETTE_LUT_SIZE; b++)
|
for (b = 0; b < HWR_PALETTE_LUT_SIZE; b++)
|
||||||
{
|
{
|
||||||
@@ -1339,7 +1371,7 @@ void HWR_SetMapPalette(void)
|
|||||||
if (palsize < 768) // 256 * 3
|
if (palsize < 768) // 256 * 3
|
||||||
I_Error("HWR_SetMapPalette: A programmer assumed palette lumps are at least 768 bytes long, but apparently this was a wrong assumption!\n");
|
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 = W_CacheLumpNum(lumpnum, PU_CACHE);
|
RGB_data = static_cast<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++)
|
||||||
{
|
{
|
||||||
@@ -1374,7 +1406,7 @@ static UINT32 HWR_CreateLightTable(UINT8 *lighttable)
|
|||||||
{
|
{
|
||||||
UINT32 i, id;
|
UINT32 i, id;
|
||||||
RGBA_t *palette = HWR_GetTexturePalette();
|
RGBA_t *palette = HWR_GetTexturePalette();
|
||||||
RGBA_t *hw_lighttable = Z_Malloc(256 * 32 * sizeof(RGBA_t), PU_STATIC, NULL);
|
RGBA_t *hw_lighttable = static_cast<RGBA_t *>(Z_Malloc(256 * 32 * sizeof(RGBA_t), PU_STATIC, NULL));
|
||||||
|
|
||||||
// To make the palette index -> RGBA mapping easier for the shader,
|
// To make the palette index -> RGBA mapping easier for the shader,
|
||||||
// the hardware lighttable is composed of RGBA colors instead of palette indices.
|
// the hardware lighttable is composed of RGBA colors instead of palette indices.
|
||||||
+21
-21
@@ -166,6 +166,7 @@ static void gld_clipper_RemoveRange(clipnode_t *range)
|
|||||||
{
|
{
|
||||||
range->prev->next = range->next;
|
range->prev->next = range->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (range->next)
|
if (range->next)
|
||||||
{
|
{
|
||||||
range->next->prev = range->prev;
|
range->next->prev = range->prev;
|
||||||
@@ -177,7 +178,7 @@ static void gld_clipper_RemoveRange(clipnode_t *range)
|
|||||||
|
|
||||||
void gld_clipper_SafeAddClipRange(angle_t startangle, angle_t endangle)
|
void gld_clipper_SafeAddClipRange(angle_t startangle, angle_t endangle)
|
||||||
{
|
{
|
||||||
if(startangle > endangle)
|
if (startangle > endangle)
|
||||||
{
|
{
|
||||||
// The range has to added in two parts.
|
// The range has to added in two parts.
|
||||||
gld_clipper_AddClipRange(startangle, ANGLE_MAX);
|
gld_clipper_AddClipRange(startangle, ANGLE_MAX);
|
||||||
@@ -319,7 +320,7 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
|
|||||||
double floatangle;
|
double floatangle;
|
||||||
angle_t a1;
|
angle_t a1;
|
||||||
|
|
||||||
float tilt = (float)fabs(((double)(int)tiltangle) / ANG1);
|
float tilt = fabsf(((float)(int)tiltangle) / (float)ANG1);
|
||||||
|
|
||||||
if (tilt > 90.0f)
|
if (tilt > 90.0f)
|
||||||
tilt = 90.0f;
|
tilt = 90.0f;
|
||||||
@@ -330,11 +331,11 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
|
|||||||
|
|
||||||
// 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_PIl;
|
clipfov = atan(1 / (GLdouble)projMatrix[0]) * 360.0 / M_PI;
|
||||||
floatangle = 2.0 + (45.0 + ((double)tilt / 1.9)) * clipfov / 90.0;
|
floatangle = 2.0 + (45.0 + ((double)tilt / 1.9)) * clipfov / 90.0;
|
||||||
if (floatangle >= 180.0)
|
if (floatangle >= 180.0)
|
||||||
return 0xffffffff;
|
return 0xffffffff;
|
||||||
a1 = (angle_t)xs_CRoundToInt(ANG1 * floatangle);
|
a1 = (angle_t)lrint(ANG1 * floatangle);
|
||||||
return a1;
|
return a1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -348,33 +349,32 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
|
|||||||
// gld_FrustumSetup
|
// gld_FrustumSetup
|
||||||
//
|
//
|
||||||
|
|
||||||
static GLdouble viewMatrix[16];
|
static float frustum[6][4];
|
||||||
static GLdouble projMatrix[16];
|
|
||||||
float frustum[6][4];
|
|
||||||
|
|
||||||
#define CALCMATRIX(a, b, c, d, e, f, g, h)\
|
#define CALCMATRIX(a, b, c, d, e, f, g, h)\
|
||||||
(float)(viewMatrix[a] * projMatrix[b] + \
|
(modelMatrix[a] * projMatrix[b] + \
|
||||||
viewMatrix[c] * projMatrix[d] + \
|
modelMatrix[c] * projMatrix[d] + \
|
||||||
viewMatrix[e] * projMatrix[f] + \
|
modelMatrix[e] * projMatrix[f] + \
|
||||||
viewMatrix[g] * projMatrix[h])
|
modelMatrix[g] * projMatrix[h])
|
||||||
|
|
||||||
#define NORMALIZE_PLANE(i)\
|
#define NORMALIZE_PLANE(i)\
|
||||||
t = (float)sqrt(\
|
t = sqrtf(\
|
||||||
frustum[i][0] * frustum[i][0] + \
|
frustum[i][0] * frustum[i][0] + \
|
||||||
frustum[i][1] * frustum[i][1] + \
|
frustum[i][1] * frustum[i][1] + \
|
||||||
frustum[i][2] * frustum[i][2]); \
|
frustum[i][2] * frustum[i][2]); \
|
||||||
frustum[i][0] /= t; \
|
frustum[i][0] /= t; \
|
||||||
frustum[i][1] /= t; \
|
frustum[i][1] /= t; \
|
||||||
frustum[i][2] /= t; \
|
frustum[i][2] /= t; \
|
||||||
frustum[i][3] /= t
|
frustum[i][3] /= t
|
||||||
|
|
||||||
void gld_FrustumSetup(void)
|
void gld_FrustumSetup(void)
|
||||||
{
|
{
|
||||||
float t;
|
float t;
|
||||||
float clip[16];
|
float clip[16];
|
||||||
|
|
||||||
pglGetFloatv(GL_PROJECTION_MATRIX, projMatrix);
|
// HWR_SetTransform will take care of this!
|
||||||
pglGetFloatv(GL_MODELVIEW_MATRIX, viewMatrix);
|
//pglGetFloatv(GL_PROJECTION_MATRIX, projMatrix);
|
||||||
|
//pglGetFloatv(GL_MODELVIEW_MATRIX, modelMatrix);
|
||||||
|
|
||||||
clip[0] = CALCMATRIX(0, 0, 1, 4, 2, 8, 3, 12);
|
clip[0] = CALCMATRIX(0, 0, 1, 4, 2, 8, 3, 12);
|
||||||
clip[1] = CALCMATRIX(0, 1, 1, 5, 2, 9, 3, 13);
|
clip[1] = CALCMATRIX(0, 1, 1, 5, 2, 9, 3, 13);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ extern "C" {
|
|||||||
#include "../tables.h"
|
#include "../tables.h"
|
||||||
#include "../doomtype.h"
|
#include "../doomtype.h"
|
||||||
|
|
||||||
//#define HAVE_SPHEREFRUSTRUM // enable if you want gld_SphereInFrustum and related code
|
#define HAVE_SPHEREFRUSTRUM // enable if you want gld_SphereInFrustum and related code
|
||||||
|
|
||||||
boolean gld_clipper_SafeCheckRange(angle_t startAngle, angle_t endAngle);
|
boolean gld_clipper_SafeCheckRange(angle_t startAngle, angle_t endAngle);
|
||||||
void gld_clipper_SafeAddClipRange(angle_t startangle, angle_t endangle);
|
void gld_clipper_SafeAddClipRange(angle_t startangle, angle_t endangle);
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ typedef struct GLMipmap_s GLMipmap_t;
|
|||||||
struct GLMapTexture_s
|
struct GLMapTexture_s
|
||||||
{
|
{
|
||||||
GLMipmap_t mipmap;
|
GLMipmap_t mipmap;
|
||||||
float scaleX; //used for scaling textures on walls
|
float scaleX; // used for scaling textures on walls
|
||||||
float scaleY;
|
float scaleY;
|
||||||
};
|
};
|
||||||
typedef struct GLMapTexture_s GLMapTexture_t;
|
typedef struct GLMapTexture_s GLMapTexture_t;
|
||||||
@@ -74,7 +74,7 @@ typedef struct GLMapTexture_s GLMapTexture_t;
|
|||||||
struct GLPatch_s
|
struct GLPatch_s
|
||||||
{
|
{
|
||||||
GLMipmap_t *mipmap;
|
GLMipmap_t *mipmap;
|
||||||
float max_s,max_t;
|
float max_s, max_t;
|
||||||
};
|
};
|
||||||
typedef struct GLPatch_s GLPatch_t;
|
typedef struct GLPatch_s GLPatch_t;
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ typedef struct FColorARGB FColorARGB;
|
|||||||
// Simple 2D coordinate
|
// Simple 2D coordinate
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
FLOAT x,y;
|
FLOAT x, y;
|
||||||
} F2DCoord, v2d_t;
|
} F2DCoord, v2d_t;
|
||||||
|
|
||||||
// ======================
|
// ======================
|
||||||
@@ -142,8 +142,8 @@ enum
|
|||||||
// Transformed vector, as passed to HWR API
|
// Transformed vector, as passed to HWR API
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
FLOAT x,y,z;
|
FLOAT x, y, z;
|
||||||
FLOAT s,t;
|
FLOAT s, t;
|
||||||
} FOutVector;
|
} FOutVector;
|
||||||
|
|
||||||
typedef struct vbo_vertex_s
|
typedef struct vbo_vertex_s
|
||||||
@@ -173,7 +173,7 @@ typedef struct
|
|||||||
int rows, columns;
|
int rows, columns;
|
||||||
int loopcount;
|
int loopcount;
|
||||||
|
|
||||||
int detail, vertex_count;
|
int vertex_count;
|
||||||
int texture, width, height;
|
int texture, width, height;
|
||||||
boolean rebuild; // VBO needs to be rebuilt
|
boolean rebuild; // VBO needs to be rebuilt
|
||||||
|
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
// Emacs style mode select -*- C++ -*-
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Copyright (C) 2005 by SRB2 Jr. 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 Win32 DLL and Shared Objects API definitions
|
|
||||||
|
|
||||||
#ifndef __HWR_DLL_H__
|
|
||||||
#define __HWR_DLL_H__
|
|
||||||
|
|
||||||
// Function declaration for exports from the DLL :
|
|
||||||
// EXPORT <return-type> HWRAPI(<function-name>) (<arguments>);
|
|
||||||
// If _CREATE_DLL_ is defined the above declaration translates to :
|
|
||||||
// __declspec(dllexport) <return-type> WINAPI <function-name> (<arguments>);
|
|
||||||
// If _CREATE_DLL_ is NOT DEFINED the above declaration translates to :
|
|
||||||
// __declspec(dllexport) <return->type> (WINAPI *<function-name>) (<arguments>);
|
|
||||||
|
|
||||||
#ifdef _CREATE_DLL_
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#define EXPORT extern "C"
|
|
||||||
#else
|
|
||||||
#define EXPORT
|
|
||||||
#endif
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define HWRAPI(fn) WINAPI fn
|
|
||||||
#else
|
|
||||||
#define HWRAPI(fn) fn
|
|
||||||
#endif
|
|
||||||
#else // _CREATE_DLL_
|
|
||||||
#define EXPORT typedef
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define HWRAPI(fn) (WINAPI *fn)
|
|
||||||
#else
|
|
||||||
#define HWRAPI(fn) (*fn)
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ==========================================================================
|
|
||||||
// MATHS
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
// Constants
|
|
||||||
#define DEGREE (0.017453292519943295769236907684883l) // 2*PI/360
|
|
||||||
|
|
||||||
void GL_DBG_Printf(const char *format, ...) /*FUNCPRINTF*/;
|
|
||||||
#define DBG_Printf GL_DBG_Printf
|
|
||||||
|
|
||||||
#if defined (__CYGWIN__)
|
|
||||||
void _init() __attribute__((constructor));
|
|
||||||
void _fini() __attribute__((destructor));
|
|
||||||
#else
|
|
||||||
void _init();
|
|
||||||
void _fini();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -80,6 +80,9 @@ UINT32 GL_CreateLightTable(RGBA_t *hw_lighttable);
|
|||||||
void GL_ClearLightTables(void);
|
void GL_ClearLightTables(void);
|
||||||
void GL_SetScreenPalette(RGBA_t *palette);
|
void GL_SetScreenPalette(RGBA_t *palette);
|
||||||
|
|
||||||
|
void GL_Draw2DModel(model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex,
|
||||||
|
FTransform *pos, float hscale, float vscale, UINT8 flipped, UINT8 hflipped, FSurfaceInfo *Surface);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+652
-454
File diff suppressed because it is too large.
Load diff
@@ -102,8 +102,7 @@ void HWR_SetViewSize(void);
|
|||||||
void HWR_AddCommands(void);
|
void HWR_AddCommands(void);
|
||||||
|
|
||||||
void HWR_RenderPlayerView(void);
|
void HWR_RenderPlayerView(void);
|
||||||
void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_level, boolean allow_portals);
|
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, int stencil_level, boolean allow_portals);
|
||||||
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_level, boolean allow_portals);
|
|
||||||
|
|
||||||
void HWR_ClearSkyDome(void);
|
void HWR_ClearSkyDome(void);
|
||||||
void HWR_BuildSkyDome(void);
|
void HWR_BuildSkyDome(void);
|
||||||
|
|||||||
+122
-3
@@ -579,7 +579,7 @@ md2found:
|
|||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HWR_AddPlayerMD2(int skin, boolean local) // For MD2's that were added after startup
|
void HWR_AddPlayerMD2(INT32 skin, boolean local) // For MD2's that were added after startup
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
char name[20], filename[32];
|
char name[20], filename[32];
|
||||||
@@ -1198,8 +1198,15 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
|
|||||||
Surf.PolyFlags = HWR_GetBlendModeFlag(blendmode);
|
Surf.PolyFlags = HWR_GetBlendModeFlag(blendmode);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cv_playerfade.value && spr->mobj->player)
|
if (spr->mobj->player)
|
||||||
Surf.PolyColor.s.alpha = FixedMul(R_DoPlayerFade(spr->mobj), Surf.PolyColor.s.alpha);
|
{
|
||||||
|
// make hyu´d players translucent with reducevfx, could be done better, but im lazy as crap
|
||||||
|
if (cv_reducevfx.value && spr->mobj->player->kartstuff[k_hyudorotimer] > 0)
|
||||||
|
Surf.PolyColor.s.alpha = FixedMul(FRACUNIT/2, Surf.PolyColor.s.alpha);
|
||||||
|
|
||||||
|
if (cv_playerfade.value)
|
||||||
|
Surf.PolyColor.s.alpha = FixedMul(R_DoPlayerFade(spr->mobj), Surf.PolyColor.s.alpha);
|
||||||
|
}
|
||||||
|
|
||||||
// dont forget to enabled the depth test because we can't do this like
|
// dont forget to enabled the depth test because we can't do this like
|
||||||
// before: polygons models are not sorted
|
// before: polygons models are not sorted
|
||||||
@@ -1468,4 +1475,116 @@ void HWR_DrawMD2(gl_vissprite_t *spr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// mostly copy paste of HWR_DrawMD2
|
||||||
|
// very ugly but our model code kinda sucks
|
||||||
|
void HWR_Draw2DModel(md2_t *md2, INT32 x, INT32 y, INT32 skinnum, skincolors_t color, const UINT8 *colormap, fixed_t scale, INT32 frame, angle_t angle)
|
||||||
|
{
|
||||||
|
patch_t *gpatch, *blendgpatch;
|
||||||
|
GLPatch_t *hwrPatch = NULL, *hwrBlendPatch = NULL;
|
||||||
|
FTransform p;
|
||||||
|
FSurfaceInfo Surf;
|
||||||
|
|
||||||
|
if (!md2->model)
|
||||||
|
{
|
||||||
|
char filename[64];
|
||||||
|
CONS_Debug(DBG_RENDER, "Loading model... (%s)\n", md2->filename);
|
||||||
|
sprintf(filename, "mdls/%s", md2->filename);
|
||||||
|
md2->model = md2_readModel(filename);
|
||||||
|
|
||||||
|
if (md2->model)
|
||||||
|
{
|
||||||
|
md2_printModelInfo(md2->model);
|
||||||
|
GL_CreateModelVBOs(md2->model);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
md2->error = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (md2->model->meshes[0].numFrames > 0)
|
||||||
|
frame = frame % md2->model->meshes[0].numFrames;
|
||||||
|
else
|
||||||
|
frame = 0;
|
||||||
|
|
||||||
|
gpatch = (patch_t *)(md2->glpatch);
|
||||||
|
if (gpatch)
|
||||||
|
hwrPatch = ((GLPatch_t *)gpatch->hardware);
|
||||||
|
|
||||||
|
if (!gpatch || !hwrPatch ||
|
||||||
|
((!hwrPatch->mipmap->format || !hwrPatch->mipmap->downloaded) && !md2->notexturefile))
|
||||||
|
md2_loadTexture(md2);
|
||||||
|
|
||||||
|
gpatch = (patch_t*)(md2->glpatch);
|
||||||
|
if (gpatch)
|
||||||
|
hwrPatch = ((GLPatch_t *)gpatch->hardware);
|
||||||
|
|
||||||
|
blendgpatch = (patch_t*)(md2->blendglpatch);
|
||||||
|
if (blendgpatch)
|
||||||
|
hwrBlendPatch = ((GLPatch_t *)blendgpatch->hardware);
|
||||||
|
|
||||||
|
if ((gpatch && hwrPatch && hwrPatch->mipmap->format) &&
|
||||||
|
(!blendgpatch || !hwrBlendPatch ||
|
||||||
|
((!hwrBlendPatch->mipmap->format || !hwrBlendPatch->mipmap->downloaded) && !md2->noblendfile)))
|
||||||
|
md2_loadBlendTexture(md2);
|
||||||
|
|
||||||
|
blendgpatch = (patch_t*)(md2->blendglpatch);
|
||||||
|
if (blendgpatch)
|
||||||
|
hwrBlendPatch = ((GLPatch_t *)blendgpatch->hardware);
|
||||||
|
|
||||||
|
memset(&Surf, 0x00, sizeof(FSurfaceInfo));
|
||||||
|
Surf.PolyColor.rgba = 0xFFFFFFFF;
|
||||||
|
Surf.PolyFlags = PF_Occlude | PF_Modulated;
|
||||||
|
|
||||||
|
Surf.LightInfo.light_level = 255;
|
||||||
|
Surf.LightInfo.fade_start = 0;
|
||||||
|
Surf.LightInfo.fade_end = 31;
|
||||||
|
|
||||||
|
if (color != SKINCOLOR_NONE &&
|
||||||
|
blendgpatch && hwrBlendPatch->mipmap->format &&
|
||||||
|
gpatch->width == blendgpatch->width && gpatch->height == blendgpatch->height)
|
||||||
|
{
|
||||||
|
INT32 tcskinnum = TC_DEFAULT;
|
||||||
|
|
||||||
|
if (color)
|
||||||
|
tcskinnum = skinnum;
|
||||||
|
|
||||||
|
HWR_GetBlendedTexture(gpatch, blendgpatch, tcskinnum, colormap, color);
|
||||||
|
}
|
||||||
|
else if (hwrPatch && hwrPatch->mipmap->format)
|
||||||
|
{
|
||||||
|
GL_SetTexture(hwrPatch->mipmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&p, 0x00, sizeof(FTransform));
|
||||||
|
|
||||||
|
p.x = x*vid.dup + (float)(vid.width - BASEVIDWIDTH*vid.dup)/2.f;
|
||||||
|
p.y = -420.f; // push it back to prevent wonky culling, idk lul
|
||||||
|
p.z = y*vid.dup + (float)(vid.height - BASEVIDHEIGHT*vid.dup)/2.f;
|
||||||
|
|
||||||
|
p.angley = FixedToFloat(AngleFixed(angle));
|
||||||
|
p.anglex = 0.f;
|
||||||
|
p.anglez = 0.f;
|
||||||
|
|
||||||
|
p.roll = false;
|
||||||
|
p.fliptype = TRANSFORM_NONE;
|
||||||
|
|
||||||
|
const float fscale = FixedToFloat(scale*vid.dup);
|
||||||
|
|
||||||
|
GL_Draw2DModel(
|
||||||
|
md2->model,
|
||||||
|
frame,
|
||||||
|
0.f,
|
||||||
|
0.f,
|
||||||
|
-1,
|
||||||
|
&p,
|
||||||
|
fscale,
|
||||||
|
fscale,
|
||||||
|
true, // flip it vertically lul
|
||||||
|
false,
|
||||||
|
&Surf
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#endif //HWRENDER
|
#endif //HWRENDER
|
||||||
@@ -45,6 +45,9 @@ void HWR_InitMD2(void);
|
|||||||
void HWR_DrawMD2(gl_vissprite_t *spr);
|
void HWR_DrawMD2(gl_vissprite_t *spr);
|
||||||
void HWR_AddPlayerMD2(INT32 skin, boolean local);
|
void HWR_AddPlayerMD2(INT32 skin, boolean local);
|
||||||
void HWR_AddSpriteMD2(size_t spritenum);
|
void HWR_AddSpriteMD2(size_t spritenum);
|
||||||
|
void HWR_Draw2DModel(md2_t *md2, INT32 x, INT32 y, INT32 skinnum,
|
||||||
|
skincolors_t color, const UINT8 *colormap,
|
||||||
|
fixed_t scale, INT32 frame, angle_t angle);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
+14
-14
@@ -274,7 +274,7 @@ model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
if (!f)
|
if (!f)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
retModel = (model_t*)Z_Calloc(sizeof(model_t), ztag, 0);
|
retModel = (model_t*)Z_Calloc(sizeof(model_t), ztag, NULL);
|
||||||
|
|
||||||
//size_t fileLen;
|
//size_t fileLen;
|
||||||
|
|
||||||
@@ -288,13 +288,13 @@ model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
{
|
{
|
||||||
texPos++;
|
texPos++;
|
||||||
namelen = strlen(texPos) + 1;
|
namelen = strlen(texPos) + 1;
|
||||||
texturefilename = (char*)Z_Malloc(namelen, PU_CACHE, 0);
|
texturefilename = (char*)Z_Malloc(namelen, PU_CACHE, NULL);
|
||||||
strcpy(texturefilename, texPos);
|
strcpy(texturefilename, texPos);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
namelen = strlen(fileName) + 1;
|
namelen = strlen(fileName) + 1;
|
||||||
texturefilename = (char*)Z_Malloc(namelen, PU_CACHE, 0);
|
texturefilename = (char*)Z_Malloc(namelen, PU_CACHE, NULL);
|
||||||
strcpy(texturefilename, fileName);
|
strcpy(texturefilename, fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -316,7 +316,7 @@ model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
header = (md2header_t*)buffer;
|
header = (md2header_t*)buffer;
|
||||||
|
|
||||||
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, 0);
|
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;
|
// const float WUNITS = 1.0f;
|
||||||
// float dataScale = WUNITS;
|
// float dataScale = WUNITS;
|
||||||
@@ -332,7 +332,7 @@ model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
if (retModel->numMaterials <= 0) // Always at least one skin, duh
|
if (retModel->numMaterials <= 0) // Always at least one skin, duh
|
||||||
retModel->numMaterials = 1;
|
retModel->numMaterials = 1;
|
||||||
|
|
||||||
retModel->materials = (material_t*)Z_Calloc(sizeof(material_t)*retModel->numMaterials, ztag, 0);
|
retModel->materials = (material_t*)Z_Calloc(sizeof(material_t)*retModel->numMaterials, ztag, NULL);
|
||||||
|
|
||||||
// int t;
|
// int t;
|
||||||
for (t = 0; t < retModel->numMaterials; t++)
|
for (t = 0; t < retModel->numMaterials; t++)
|
||||||
@@ -409,9 +409,9 @@ model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
float *uvptr;
|
float *uvptr;
|
||||||
|
|
||||||
dataScale = 0.015624f; // 1 / 64.0f
|
dataScale = 0.015624f; // 1 / 64.0f
|
||||||
retModel->meshes[0].tinyframes = (tinyframe_t*)Z_Calloc(sizeof(tinyframe_t)*header->numFrames, ztag, 0);
|
retModel->meshes[0].tinyframes = (tinyframe_t*)Z_Calloc(sizeof(tinyframe_t)*header->numFrames, ztag, NULL);
|
||||||
retModel->meshes[0].numVertices = header->numXYZ;
|
retModel->meshes[0].numVertices = header->numXYZ;
|
||||||
retModel->meshes[0].uvs = (float*)Z_Malloc(sizeof(float) * 2 * retModel->meshes[0].numVertices, ztag, 0);
|
retModel->meshes[0].uvs = (float*)Z_Malloc(sizeof(float) * 2 * retModel->meshes[0].numVertices, ztag, NULL);
|
||||||
|
|
||||||
ptr = (char*)frames;
|
ptr = (char*)frames;
|
||||||
for (i = 0; i < header->numFrames; i++, ptr += header->framesize)
|
for (i = 0; i < header->numFrames; i++, ptr += header->framesize)
|
||||||
@@ -423,12 +423,12 @@ model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
md2vertex_t *vertex;
|
md2vertex_t *vertex;
|
||||||
|
|
||||||
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, 0);
|
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, 0);
|
retModel->meshes[0].tinyframes[i].normals = (char*)Z_Malloc(sizeof(char) * 3 * header->numXYZ, ztag, NULL);
|
||||||
|
|
||||||
// if (retModel->materials[0].lightmap)
|
// 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].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, 0);
|
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;
|
||||||
@@ -484,8 +484,8 @@ model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
retModel->meshes[0].numVertices = header->numTris * 3;
|
retModel->meshes[0].numVertices = header->numTris * 3;
|
||||||
retModel->meshes[0].frames = (mdlframe_t*)Z_Calloc(sizeof(mdlframe_t)*header->numFrames, ztag, 0);
|
retModel->meshes[0].frames = (mdlframe_t*)Z_Calloc(sizeof(mdlframe_t)*header->numFrames, ztag, NULL);
|
||||||
retModel->meshes[0].uvs = (float*)Z_Malloc(sizeof(float) * 2 * retModel->meshes[0].numVertices, ztag, 0);
|
retModel->meshes[0].uvs = (float*)Z_Malloc(sizeof(float) * 2 * retModel->meshes[0].numVertices, ztag, NULL);
|
||||||
|
|
||||||
trisPtr = tris;
|
trisPtr = tris;
|
||||||
uvptr = retModel->meshes[0].uvs;
|
uvptr = retModel->meshes[0].uvs;
|
||||||
@@ -507,8 +507,8 @@ model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
md2vertex_t *vertex;
|
md2vertex_t *vertex;
|
||||||
|
|
||||||
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, 0);
|
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, 0);
|
retModel->meshes[0].frames[i].vertices = (float*)Z_Malloc(sizeof(float) * 3 * header->numTris * 3, ztag, NULL);
|
||||||
// if (retModel->materials[0].lightmap)
|
// 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);
|
// retModel->meshes[0].frames[i].tangents = (float*)malloc(sizeof(float));//(float*)Z_Malloc(sizeof(float)*3*header->numTris*3, ztag);
|
||||||
//float *vertptr, *normptr;
|
//float *vertptr, *normptr;
|
||||||
|
|||||||
+12
-12
@@ -168,7 +168,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
if (!f)
|
if (!f)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
retModel = (model_t*)Z_Calloc(sizeof(model_t), ztag, 0);
|
retModel = (model_t*)Z_Calloc(sizeof(model_t), ztag, NULL);
|
||||||
|
|
||||||
// find length of file
|
// find length of file
|
||||||
fseek(f, 0, SEEK_END);
|
fseek(f, 0, SEEK_END);
|
||||||
@@ -201,7 +201,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
if (retModel->numMaterials <= 0) // Always at least one skin, duh
|
if (retModel->numMaterials <= 0) // Always at least one skin, duh
|
||||||
retModel->numMaterials = 1;
|
retModel->numMaterials = 1;
|
||||||
|
|
||||||
retModel->materials = (material_t*)Z_Calloc(sizeof(material_t)*retModel->numMaterials, ztag, 0);
|
retModel->materials = (material_t*)Z_Calloc(sizeof(material_t)*retModel->numMaterials, ztag, NULL);
|
||||||
|
|
||||||
for (t = 0; t < retModel->numMaterials; t++)
|
for (t = 0; t < retModel->numMaterials; t++)
|
||||||
{
|
{
|
||||||
@@ -225,7 +225,7 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
retModel->materials[t].spheremap = false;
|
retModel->materials[t].spheremap = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
retModel->meshes = (mesh_t*)Z_Calloc(sizeof(mesh_t)*retModel->numMeshes, ztag, 0);
|
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++)
|
||||||
@@ -298,9 +298,9 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
unsigned short *indexptr;
|
unsigned short *indexptr;
|
||||||
md3Triangle *mdT;
|
md3Triangle *mdT;
|
||||||
|
|
||||||
retModel->meshes[i].tinyframes = (tinyframe_t*)Z_Calloc(sizeof(tinyframe_t)*mdS->numFrames, ztag, 0);
|
retModel->meshes[i].tinyframes = (tinyframe_t*)Z_Calloc(sizeof(tinyframe_t)*mdS->numFrames, ztag, NULL);
|
||||||
retModel->meshes[i].numVertices = mdS->numVerts;
|
retModel->meshes[i].numVertices = mdS->numVerts;
|
||||||
retModel->meshes[i].uvs = (float*)Z_Malloc(sizeof(float)*2*mdS->numVerts, ztag, 0);
|
retModel->meshes[i].uvs = (float*)Z_Malloc(sizeof(float)*2*mdS->numVerts, ztag, NULL);
|
||||||
for (j = 0; j < mdS->numFrames; j++)
|
for (j = 0; j < mdS->numFrames; j++)
|
||||||
{
|
{
|
||||||
short *vertptr;
|
short *vertptr;
|
||||||
@@ -308,12 +308,12 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
// char *tanptr;
|
// 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, 0);
|
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, 0);
|
retModel->meshes[i].tinyframes[j].normals = (char*)Z_Malloc(sizeof(char)*3*mdS->numVerts, ztag, NULL);
|
||||||
|
|
||||||
// if (retModel->materials[0].lightmap)
|
// 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].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, 0);
|
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;
|
||||||
|
|
||||||
@@ -374,16 +374,16 @@ model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
|||||||
int k;
|
int k;
|
||||||
|
|
||||||
retModel->meshes[i].numVertices = mdS->numTriangles * 3;//mdS->numVerts;
|
retModel->meshes[i].numVertices = mdS->numTriangles * 3;//mdS->numVerts;
|
||||||
retModel->meshes[i].frames = (mdlframe_t*)Z_Calloc(sizeof(mdlframe_t)*mdS->numFrames, ztag, 0);
|
retModel->meshes[i].frames = (mdlframe_t*)Z_Calloc(sizeof(mdlframe_t)*mdS->numFrames, ztag, NULL);
|
||||||
retModel->meshes[i].uvs = (float*)Z_Malloc(sizeof(float)*2*mdS->numTriangles*3, ztag, 0);
|
retModel->meshes[i].uvs = (float*)Z_Malloc(sizeof(float)*2*mdS->numTriangles*3, ztag, NULL);
|
||||||
|
|
||||||
for (j = 0; j < mdS->numFrames; j++)
|
for (j = 0; j < mdS->numFrames; j++)
|
||||||
{
|
{
|
||||||
float *vertptr;
|
float *vertptr;
|
||||||
float *normptr;
|
float *normptr;
|
||||||
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, 0);
|
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, 0);
|
retModel->meshes[i].frames[j].normals = (float*)Z_Malloc(sizeof(float)*3*mdS->numTriangles*3, ztag, NULL);
|
||||||
// if (retModel->materials[i].lightmap)
|
// 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);
|
// 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;
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ model_t *LoadModel(const char *filename, int ztag)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
model->mdlFilename = (char*)Z_Malloc(strlen(filename)+1, ztag, 0);
|
model->mdlFilename = (char*)Z_Malloc(strlen(filename)+1, ztag, NULL);
|
||||||
strcpy(model->mdlFilename, filename);
|
strcpy(model->mdlFilename, filename);
|
||||||
|
|
||||||
Optimize(model);
|
Optimize(model);
|
||||||
@@ -237,7 +237,7 @@ void GenerateVertexNormals(model_t *model)
|
|||||||
{
|
{
|
||||||
mdlframe_t *frame = &mesh->frames[j];
|
mdlframe_t *frame = &mesh->frames[j];
|
||||||
int memTag = PU_STATIC;
|
int memTag = PU_STATIC;
|
||||||
float *newNormals = (float*)Z_Malloc(sizeof(float)*3*mesh->numTriangles*3, memTag, 0);
|
float *newNormals = (float*)Z_Malloc(sizeof(float)*3*mesh->numTriangles*3, memTag, NULL);
|
||||||
int k;
|
int k;
|
||||||
float *vertPtr = frame->vertices;
|
float *vertPtr = frame->vertices;
|
||||||
float *oldNormals;
|
float *oldNormals;
|
||||||
@@ -309,7 +309,7 @@ static boolean AddMaterialToList(materiallist_t **head, material_t *material)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Didn't find it, so add to the list
|
// Didn't find it, so add to the list
|
||||||
newMatNode = (materiallist_t*)Z_Malloc(sizeof(materiallist_t), PU_CACHE, 0);
|
newMatNode = (materiallist_t*)Z_Malloc(sizeof(materiallist_t), PU_CACHE, NULL);
|
||||||
newMatNode->material = material;
|
newMatNode->material = material;
|
||||||
ListAdd(newMatNode, (listitem_t**)head);
|
ListAdd(newMatNode, (listitem_t**)head);
|
||||||
return true;
|
return true;
|
||||||
@@ -351,7 +351,7 @@ void Optimize(model_t *model)
|
|||||||
}
|
}
|
||||||
|
|
||||||
memTag = PU_STATIC;
|
memTag = PU_STATIC;
|
||||||
newMeshes = (mesh_t*)Z_Calloc(sizeof(mesh_t) * numMeshes, memTag, 0);
|
newMeshes = (mesh_t*)Z_Calloc(sizeof(mesh_t) * numMeshes, memTag, NULL);
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
for (node = matListHead; node; node = node->next)
|
for (node = matListHead; node; node = node->next)
|
||||||
@@ -377,14 +377,14 @@ void Optimize(model_t *model)
|
|||||||
newMesh->numFrames = 1;
|
newMesh->numFrames = 1;
|
||||||
newMesh->numTriangles = numTriangles;
|
newMesh->numTriangles = numTriangles;
|
||||||
newMesh->numVertices = numTriangles * 3;
|
newMesh->numVertices = numTriangles * 3;
|
||||||
newMesh->uvs = (float*)Z_Malloc(sizeof(float)*2*numTriangles*3, memTag, 0);
|
newMesh->uvs = (float*)Z_Malloc(sizeof(float)*2*numTriangles*3, memTag, NULL);
|
||||||
newMesh->frames = (mdlframe_t*)Z_Calloc(sizeof(mdlframe_t), memTag, 0);
|
newMesh->frames = (mdlframe_t*)Z_Calloc(sizeof(mdlframe_t), memTag, NULL);
|
||||||
curFrame = &newMesh->frames[0];
|
curFrame = &newMesh->frames[0];
|
||||||
|
|
||||||
curFrame->material = curMat;
|
curFrame->material = curMat;
|
||||||
curFrame->normals = (float*)Z_Malloc(sizeof(float)*3*numTriangles*3, memTag, 0);
|
curFrame->normals = (float*)Z_Malloc(sizeof(float)*3*numTriangles*3, memTag, NULL);
|
||||||
curFrame->vertices = (float*)Z_Malloc(sizeof(float)*3*numTriangles*3, memTag, 0);
|
curFrame->vertices = (float*)Z_Malloc(sizeof(float)*3*numTriangles*3, memTag, NULL);
|
||||||
curFrame->colors = (char*)Z_Malloc(sizeof(char)*4*numTriangles*3, memTag, 0);
|
curFrame->colors = (char*)Z_Malloc(sizeof(char)*4*numTriangles*3, memTag, NULL);
|
||||||
|
|
||||||
// Now traverse the meshes of the model, adding in
|
// Now traverse the meshes of the model, adding in
|
||||||
// vertices/normals/uvs that match the current material
|
// vertices/normals/uvs that match the current material
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ void HWR_PortalClipping(gl_portal_t *portal)
|
|||||||
gld_clipper_SafeAddClipRange(portal->angle1, portal->angle2);
|
gld_clipper_SafeAddClipRange(portal->angle1, portal->angle2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gl_portal_t* HWR_Portal_Add (seg_t *seg)
|
static gl_portal_t* HWR_Portal_Add(seg_t *seg)
|
||||||
{
|
{
|
||||||
gl_portal_t *portal = Z_Malloc(sizeof(gl_portal_t), PU_STATIC, NULL);
|
gl_portal_t *portal = Z_Malloc(sizeof(gl_portal_t), PU_STATIC, NULL);
|
||||||
|
|
||||||
@@ -120,8 +120,8 @@ void HWR_PortalFrame(gl_portal_t* portal)
|
|||||||
viewz = portal->viewz;
|
viewz = portal->viewz;
|
||||||
|
|
||||||
viewangle = portal->viewangle;
|
viewangle = portal->viewangle;
|
||||||
//viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
|
viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
|
||||||
//viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
|
viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
|
||||||
|
|
||||||
if (portal->clipline != -1)
|
if (portal->clipline != -1)
|
||||||
{
|
{
|
||||||
@@ -157,7 +157,7 @@ static void HWR_RenderPortalSeg(gl_portal_t* portal, SINT8 state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Renders a single portal from the current viewpoint.
|
// Renders a single portal from the current viewpoint.
|
||||||
void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float fpov, player_t *player, int stencil_level)
|
void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float fpov, int stencil_level)
|
||||||
{
|
{
|
||||||
// draw portal seg to stencil buffer with increment
|
// draw portal seg to stencil buffer with increment
|
||||||
HWR_SetTransform(fpov);
|
HWR_SetTransform(fpov);
|
||||||
@@ -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, player, stencil_level + 1, true);
|
HWR_RenderPortalViewpoint(portal, stencil_level + 1, true);
|
||||||
|
|
||||||
// return to current frame
|
// return to current frame
|
||||||
if (rootportal)
|
if (rootportal)
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ extern SINT8 gl_portal_state;
|
|||||||
// new thing
|
// new thing
|
||||||
extern gl_portallist_t *currentportallist;
|
extern gl_portallist_t *currentportallist;
|
||||||
|
|
||||||
static inline void HWR_SetPortalState (SINT8 state)
|
static inline void HWR_SetPortalState(SINT8 state)
|
||||||
{
|
{
|
||||||
gl_portal_state = state;
|
gl_portal_state = state;
|
||||||
}
|
}
|
||||||
@@ -75,7 +75,7 @@ void HWR_PortalClipping(gl_portal_t *portal);
|
|||||||
|
|
||||||
void HWR_Portal_Add2Lines(const INT32 line1, const INT32 line2, seg_t *seg);
|
void HWR_Portal_Add2Lines(const INT32 line1, const INT32 line2, seg_t *seg);
|
||||||
void HWR_PortalFrame(gl_portal_t* portal);
|
void HWR_PortalFrame(gl_portal_t* portal);
|
||||||
void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float fpov, player_t *player, int stencil_level);
|
void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float fpov, int stencil_level);
|
||||||
void HWR_FreePortalList(gl_portallist_t portallist);
|
void HWR_FreePortalList(gl_portallist_t portallist);
|
||||||
|
|
||||||
boolean HWR_PortalCheckPointSide(fixed_t x, fixed_t y);
|
boolean HWR_PortalCheckPointSide(fixed_t x, fixed_t y);
|
||||||
|
|||||||
+184
-182
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
// Eeeeh not sure is this right way, but it works < sry :c < sry again it had to go :c
|
// Eeeeh not sure is this right way, but it works < sry :c < sry again it had to go :c
|
||||||
|
|
||||||
#if defined (HWRENDER) && !defined (NOROPENGL)
|
#if defined (HWRENDER)
|
||||||
|
|
||||||
#include "../../r_fps.h" // For R_GetTimeFrac, used for the leveltime shader uniform
|
#include "../../r_fps.h" // For R_GetTimeFrac, used for the leveltime shader uniform
|
||||||
|
|
||||||
@@ -98,10 +98,10 @@ static size_t textureBufferSize = 0;
|
|||||||
static LTListItem *LightTablesTail = NULL;
|
static LTListItem *LightTablesTail = NULL;
|
||||||
static LTListItem *LightTablesHead = NULL;
|
static LTListItem *LightTablesHead = NULL;
|
||||||
|
|
||||||
static RGBA_t screenPalette[256] = {0}; // the palette for the postprocessing step in palette rendering
|
static RGBA_t screenPalette[256] = {}; // the palette for the postprocessing step in palette rendering
|
||||||
static GLuint screenPaletteTex = 0; // 1D texture containing the screen palette
|
static GLuint screenPaletteTex = 0; // 1D texture containing the screen palette
|
||||||
static GLuint paletteLookupTex = 0; // 3D texture containing RGB -> palette index lookup table
|
static GLuint paletteLookupTex = 0; // 3D texture containing RGB -> palette index lookup table
|
||||||
RGBA_t myPaletteData[256]; // the palette for converting textures to RGBA
|
RGBA_t myPaletteData[256] = {}; // the palette for converting textures to RGBA
|
||||||
|
|
||||||
static GLint gltexformat = GL_RGB5_A1;
|
static GLint gltexformat = GL_RGB5_A1;
|
||||||
GLint screen_width = 0; // used by Draw2DLine()
|
GLint screen_width = 0; // used by Draw2DLine()
|
||||||
@@ -127,9 +127,9 @@ GLuint gl_num_extensions;
|
|||||||
int majorGL = 0, minorGL = 0;
|
int majorGL = 0, minorGL = 0;
|
||||||
|
|
||||||
//Hurdler: 04/10/2000: added for the kick ass coronas as Boris wanted;-)
|
//Hurdler: 04/10/2000: added for the kick ass coronas as Boris wanted;-)
|
||||||
static GLfloat modelMatrix[16];
|
GLfloat modelMatrix[16] = {};
|
||||||
GLfloat projMatrix[16];
|
GLfloat projMatrix[16] = {};
|
||||||
static GLint viewport[4];
|
static GLint viewport[4];
|
||||||
|
|
||||||
#ifdef USE_FBO_OGL
|
#ifdef USE_FBO_OGL
|
||||||
enum
|
enum
|
||||||
@@ -171,43 +171,9 @@ boolean supportstencil = false;
|
|||||||
// flush all of the stored textures, leaving them unavailable at times such as between levels
|
// flush all of the stored textures, leaving them unavailable at times such as between levels
|
||||||
// These need to start at 0 and be set to their number, and be reset to 0 when deleted so that Intel GPUs
|
// These need to start at 0 and be set to their number, and be reset to 0 when deleted so that Intel GPUs
|
||||||
// can know when the textures aren't there, as textures are always considered resident in their virtual memory
|
// can know when the textures aren't there, as textures are always considered resident in their virtual memory
|
||||||
static GLuint screenTextures[NUMSCREENTEXTURES] = {0};
|
static GLuint screenTextures[NUMSCREENTEXTURES] = {};
|
||||||
|
|
||||||
// shortcut for ((float)1/i)
|
#define byte2float(byte) (GLfloat)(byte / 255.0f)
|
||||||
static const GLfloat byte2float[256] = {
|
|
||||||
0.000000f, 0.003922f, 0.007843f, 0.011765f, 0.015686f, 0.019608f, 0.023529f, 0.027451f,
|
|
||||||
0.031373f, 0.035294f, 0.039216f, 0.043137f, 0.047059f, 0.050980f, 0.054902f, 0.058824f,
|
|
||||||
0.062745f, 0.066667f, 0.070588f, 0.074510f, 0.078431f, 0.082353f, 0.086275f, 0.090196f,
|
|
||||||
0.094118f, 0.098039f, 0.101961f, 0.105882f, 0.109804f, 0.113725f, 0.117647f, 0.121569f,
|
|
||||||
0.125490f, 0.129412f, 0.133333f, 0.137255f, 0.141176f, 0.145098f, 0.149020f, 0.152941f,
|
|
||||||
0.156863f, 0.160784f, 0.164706f, 0.168627f, 0.172549f, 0.176471f, 0.180392f, 0.184314f,
|
|
||||||
0.188235f, 0.192157f, 0.196078f, 0.200000f, 0.203922f, 0.207843f, 0.211765f, 0.215686f,
|
|
||||||
0.219608f, 0.223529f, 0.227451f, 0.231373f, 0.235294f, 0.239216f, 0.243137f, 0.247059f,
|
|
||||||
0.250980f, 0.254902f, 0.258824f, 0.262745f, 0.266667f, 0.270588f, 0.274510f, 0.278431f,
|
|
||||||
0.282353f, 0.286275f, 0.290196f, 0.294118f, 0.298039f, 0.301961f, 0.305882f, 0.309804f,
|
|
||||||
0.313726f, 0.317647f, 0.321569f, 0.325490f, 0.329412f, 0.333333f, 0.337255f, 0.341176f,
|
|
||||||
0.345098f, 0.349020f, 0.352941f, 0.356863f, 0.360784f, 0.364706f, 0.368627f, 0.372549f,
|
|
||||||
0.376471f, 0.380392f, 0.384314f, 0.388235f, 0.392157f, 0.396078f, 0.400000f, 0.403922f,
|
|
||||||
0.407843f, 0.411765f, 0.415686f, 0.419608f, 0.423529f, 0.427451f, 0.431373f, 0.435294f,
|
|
||||||
0.439216f, 0.443137f, 0.447059f, 0.450980f, 0.454902f, 0.458824f, 0.462745f, 0.466667f,
|
|
||||||
0.470588f, 0.474510f, 0.478431f, 0.482353f, 0.486275f, 0.490196f, 0.494118f, 0.498039f,
|
|
||||||
0.501961f, 0.505882f, 0.509804f, 0.513726f, 0.517647f, 0.521569f, 0.525490f, 0.529412f,
|
|
||||||
0.533333f, 0.537255f, 0.541177f, 0.545098f, 0.549020f, 0.552941f, 0.556863f, 0.560784f,
|
|
||||||
0.564706f, 0.568627f, 0.572549f, 0.576471f, 0.580392f, 0.584314f, 0.588235f, 0.592157f,
|
|
||||||
0.596078f, 0.600000f, 0.603922f, 0.607843f, 0.611765f, 0.615686f, 0.619608f, 0.623529f,
|
|
||||||
0.627451f, 0.631373f, 0.635294f, 0.639216f, 0.643137f, 0.647059f, 0.650980f, 0.654902f,
|
|
||||||
0.658824f, 0.662745f, 0.666667f, 0.670588f, 0.674510f, 0.678431f, 0.682353f, 0.686275f,
|
|
||||||
0.690196f, 0.694118f, 0.698039f, 0.701961f, 0.705882f, 0.709804f, 0.713726f, 0.717647f,
|
|
||||||
0.721569f, 0.725490f, 0.729412f, 0.733333f, 0.737255f, 0.741177f, 0.745098f, 0.749020f,
|
|
||||||
0.752941f, 0.756863f, 0.760784f, 0.764706f, 0.768627f, 0.772549f, 0.776471f, 0.780392f,
|
|
||||||
0.784314f, 0.788235f, 0.792157f, 0.796078f, 0.800000f, 0.803922f, 0.807843f, 0.811765f,
|
|
||||||
0.815686f, 0.819608f, 0.823529f, 0.827451f, 0.831373f, 0.835294f, 0.839216f, 0.843137f,
|
|
||||||
0.847059f, 0.850980f, 0.854902f, 0.858824f, 0.862745f, 0.866667f, 0.870588f, 0.874510f,
|
|
||||||
0.878431f, 0.882353f, 0.886275f, 0.890196f, 0.894118f, 0.898039f, 0.901961f, 0.905882f,
|
|
||||||
0.909804f, 0.913726f, 0.917647f, 0.921569f, 0.925490f, 0.929412f, 0.933333f, 0.937255f,
|
|
||||||
0.941177f, 0.945098f, 0.949020f, 0.952941f, 0.956863f, 0.960784f, 0.964706f, 0.968628f,
|
|
||||||
0.972549f, 0.976471f, 0.980392f, 0.984314f, 0.988235f, 0.992157f, 0.996078f, 1.000000f
|
|
||||||
};
|
|
||||||
|
|
||||||
// -----------------+
|
// -----------------+
|
||||||
// GL_DBG_Printf : Output debug messages to debug log if DEBUG_TO_FILE is defined,
|
// GL_DBG_Printf : Output debug messages to debug log if DEBUG_TO_FILE is defined,
|
||||||
@@ -216,7 +182,7 @@ static const GLfloat byte2float[256] = {
|
|||||||
// -----------------+
|
// -----------------+
|
||||||
|
|
||||||
#ifdef DEBUG_TO_FILE
|
#ifdef DEBUG_TO_FILE
|
||||||
FILE *gllogstream;
|
FILE *gllogstream = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FUNCPRINTF void GL_DBG_Printf(const char *format, ...)
|
FUNCPRINTF void GL_DBG_Printf(const char *format, ...)
|
||||||
@@ -438,6 +404,14 @@ static PFNglEnableClientState pglEnableClientState;
|
|||||||
typedef void (APIENTRY * PFNglDisableClientState) (GLenum cap);
|
typedef void (APIENTRY * PFNglDisableClientState) (GLenum cap);
|
||||||
static PFNglDisableClientState pglDisableClientState;
|
static PFNglDisableClientState pglDisableClientState;
|
||||||
|
|
||||||
|
typedef void (APIENTRY * PFNglOrtho) (GLdouble left,
|
||||||
|
GLdouble right,
|
||||||
|
GLdouble bottom,
|
||||||
|
GLdouble top,
|
||||||
|
GLdouble nearVal,
|
||||||
|
GLdouble farVal);
|
||||||
|
static PFNglOrtho pglOrtho;
|
||||||
|
|
||||||
/* Lighting */
|
/* Lighting */
|
||||||
typedef void (APIENTRY * PFNglShadeModel) (GLenum mode);
|
typedef void (APIENTRY * PFNglShadeModel) (GLenum mode);
|
||||||
static PFNglShadeModel pglShadeModel;
|
static PFNglShadeModel pglShadeModel;
|
||||||
@@ -779,7 +753,7 @@ typedef struct gl_shaderstate_s
|
|||||||
static gl_shaderstate_t gl_shaderstate;
|
static gl_shaderstate_t gl_shaderstate;
|
||||||
|
|
||||||
// Shader info
|
// Shader info
|
||||||
static float shader_leveltime = 0;
|
static float shader_leveltime = 0.0f;
|
||||||
static float shader_light_x = 0.0f;
|
static float shader_light_x = 0.0f;
|
||||||
static float shader_light_y = 0.0f;
|
static float shader_light_y = 0.0f;
|
||||||
static float shader_light_z = 0.0f;
|
static float shader_light_z = 0.0f;
|
||||||
@@ -892,6 +866,8 @@ void SetupGLFunc4(void)
|
|||||||
GetGLfunc(glUniform3fv);
|
GetGLfunc(glUniform3fv);
|
||||||
GetGLfunc(glGetUniformLocation);
|
GetGLfunc(glGetUniformLocation);
|
||||||
|
|
||||||
|
GetGLfunc(glOrtho);
|
||||||
|
|
||||||
#ifdef GLDEBUGMESSAGE
|
#ifdef GLDEBUGMESSAGE
|
||||||
GetGLfunc(glDebugMessageCallback);
|
GetGLfunc(glDebugMessageCallback);
|
||||||
#endif
|
#endif
|
||||||
@@ -1023,11 +999,9 @@ boolean GL_CompileShader(int slot)
|
|||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
gl_shaders[slot].program = 0;
|
||||||
gl_shaders[slot].program = 0;
|
return false;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1069,6 +1043,7 @@ void GL_SetShader(int slot)
|
|||||||
GL_UnSetShader();
|
GL_UnSetShader();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gl_allowshaders)
|
if (gl_allowshaders)
|
||||||
{
|
{
|
||||||
gl_shader_t *next_shader = &gl_shaders[slot]; // the gl_shader_t we are going to switch to
|
gl_shader_t *next_shader = &gl_shaders[slot]; // the gl_shader_t we are going to switch to
|
||||||
@@ -1130,7 +1105,7 @@ static void GL_SetNoTexture(void)
|
|||||||
// -----------------+
|
// -----------------+
|
||||||
static void GL_Perspective(GLfloat fovy, GLfloat aspect)
|
static void GL_Perspective(GLfloat fovy, GLfloat aspect)
|
||||||
{
|
{
|
||||||
GLfloat m[4][4] =
|
static GLfloat m[4][4] =
|
||||||
{
|
{
|
||||||
{ 1.0f, 0.0f, 0.0f, 0.0f},
|
{ 1.0f, 0.0f, 0.0f, 0.0f},
|
||||||
{ 0.0f, 1.0f, 0.0f, 0.0f},
|
{ 0.0f, 1.0f, 0.0f, 0.0f},
|
||||||
@@ -1138,7 +1113,6 @@ static void GL_Perspective(GLfloat fovy, GLfloat aspect)
|
|||||||
{ 0.0f, 0.0f, 0.0f, 0.0f},
|
{ 0.0f, 0.0f, 0.0f, 0.0f},
|
||||||
};
|
};
|
||||||
|
|
||||||
const GLfloat focallength = (GLfloat)(1.0f / (GLfloat)tan(fovy * (GLfloat)M_PIl / 360.0f));
|
|
||||||
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((float)deltaZ) < 1.0E-36f) || fpclassify(aspect) == FP_ZERO)
|
||||||
@@ -1146,6 +1120,8 @@ static void GL_Perspective(GLfloat fovy, GLfloat aspect)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const GLfloat focallength = (1.0f / tanf(fovy * M_PIf / 360.0f));
|
||||||
|
|
||||||
m[0][0] = focallength / aspect;
|
m[0][0] = focallength / aspect;
|
||||||
m[1][1] = focallength;
|
m[1][1] = focallength;
|
||||||
m[2][2] = -(FAR_CLIPPING_PLANE + NEAR_CLIPPING_PLANE) / deltaZ;
|
m[2][2] = -(FAR_CLIPPING_PLANE + NEAR_CLIPPING_PLANE) / deltaZ;
|
||||||
@@ -1159,7 +1135,7 @@ static void GL_Perspective(GLfloat fovy, GLfloat aspect)
|
|||||||
// -----------------+
|
// -----------------+
|
||||||
void GL_SetModelView(GLint w, GLint h)
|
void GL_SetModelView(GLint w, GLint h)
|
||||||
{
|
{
|
||||||
GLint maxtexsize = 0;
|
static GLint maxtexsize = 0;
|
||||||
//GL_DBG_Printf("SetModelView(): %dx%d\n", (int)w, (int)h);
|
//GL_DBG_Printf("SetModelView(): %dx%d\n", (int)w, (int)h);
|
||||||
|
|
||||||
// The screen textures need to be flushed if the width or height change so that they be remade for the correct size
|
// The screen textures need to be flushed if the width or height change so that they be remade for the correct size
|
||||||
@@ -1192,7 +1168,9 @@ void GL_SetModelView(GLint w, GLint h)
|
|||||||
screen_texsizeh <<= 1;
|
screen_texsizeh <<= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pglGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxtexsize); // Get the maximum supported texture size
|
if (!maxtexsize)
|
||||||
|
pglGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxtexsize); // Get the maximum supported texture size
|
||||||
|
|
||||||
if ((screen_texsizew > maxtexsize || screen_texsizeh > maxtexsize) && maxtexsize > 0)
|
if ((screen_texsizew > maxtexsize || screen_texsizeh > maxtexsize) && maxtexsize > 0)
|
||||||
{
|
{
|
||||||
// The desired screen texture resolution is too big for the player's GPU!
|
// The desired screen texture resolution is too big for the player's GPU!
|
||||||
@@ -1338,7 +1316,8 @@ void GL_DeleteTexture(GLMipmap_t *pTexInfo)
|
|||||||
|
|
||||||
if (!pTexInfo)
|
if (!pTexInfo)
|
||||||
return;
|
return;
|
||||||
else if (pTexInfo->downloaded)
|
|
||||||
|
if (pTexInfo->downloaded)
|
||||||
pglDeleteTextures(1, (GLuint *)&pTexInfo->downloaded);
|
pglDeleteTextures(1, (GLuint *)&pTexInfo->downloaded);
|
||||||
|
|
||||||
while (head)
|
while (head)
|
||||||
@@ -1392,7 +1371,8 @@ void GL_Flush(void)
|
|||||||
TexCacheTail = TexCacheHead = NULL; //Hurdler: well, TexCacheHead is already NULL
|
TexCacheTail = TexCacheHead = NULL; //Hurdler: well, TexCacheHead is already NULL
|
||||||
tex_downloaded = 0;
|
tex_downloaded = 0;
|
||||||
|
|
||||||
free(textureBuffer);
|
if (textureBuffer)
|
||||||
|
free(textureBuffer);
|
||||||
textureBuffer = NULL;
|
textureBuffer = NULL;
|
||||||
textureBufferSize = 0;
|
textureBufferSize = 0;
|
||||||
}
|
}
|
||||||
@@ -1498,14 +1478,14 @@ void GL_ReadScreenTexture(int tex, UINT8 *restrict dest, INT32 scale)
|
|||||||
// -----------------+
|
// -----------------+
|
||||||
void GL_SetPalette(RGBA_t *palette)
|
void GL_SetPalette(RGBA_t *palette)
|
||||||
{
|
{
|
||||||
INT32 i;
|
const size_t palsize = (sizeof(RGBA_t) * 256);
|
||||||
|
|
||||||
for (i = 0; i < 256; i++)
|
// on a palette change, you have to reload all of the textures
|
||||||
|
if (memcmp(myPaletteData, palette, palsize))
|
||||||
{
|
{
|
||||||
myPaletteData[i].s = palette[i].s;
|
memcpy(myPaletteData, palette, palsize);
|
||||||
|
GL_Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
GL_Flush();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------+
|
// -----------------+
|
||||||
@@ -1546,6 +1526,7 @@ void GL_ClearBuffer(FBOOLEAN ColorMask, FBOOLEAN DepthMask, FBOOLEAN StencilMask
|
|||||||
|
|
||||||
ClearMask |= GL_COLOR_BUFFER_BIT;
|
ClearMask |= GL_COLOR_BUFFER_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DepthMask)
|
if (DepthMask)
|
||||||
{
|
{
|
||||||
pglClearDepth(1.0f); //Hurdler: all that are permanen states
|
pglClearDepth(1.0f); //Hurdler: all that are permanen states
|
||||||
@@ -1557,7 +1538,7 @@ void GL_ClearBuffer(FBOOLEAN ColorMask, FBOOLEAN DepthMask, FBOOLEAN StencilMask
|
|||||||
GL_SetBlend(DepthMask ? PF_Occlude | CurrentPolyFlags : CurrentPolyFlags&~PF_Occlude);
|
GL_SetBlend(DepthMask ? PF_Occlude | CurrentPolyFlags : CurrentPolyFlags&~PF_Occlude);
|
||||||
|
|
||||||
if (StencilMask)
|
if (StencilMask)
|
||||||
ClearMask |= GL_STENCIL_BUFFER_BIT;// looks like sometimes stencil buffer needs clearing? had a problem with random black screens
|
ClearMask |= GL_STENCIL_BUFFER_BIT; // looks like sometimes stencil buffer needs clearing? had a problem with random black screens
|
||||||
|
|
||||||
pglClear(ClearMask);
|
pglClear(ClearMask);
|
||||||
pglEnableClientState(GL_VERTEX_ARRAY); // We always use this one
|
pglEnableClientState(GL_VERTEX_ARRAY); // We always use this one
|
||||||
@@ -1582,11 +1563,11 @@ void GL_Draw2DLine(F2DCoord * v1, F2DCoord * v2, RGBA_t Color)
|
|||||||
|
|
||||||
// This is the preferred, 'modern' way of rendering lines -- creating a polygon.
|
// This is the preferred, 'modern' way of rendering lines -- creating a polygon.
|
||||||
if (fabsf(v2->x - v1->x) > FLT_EPSILON)
|
if (fabsf(v2->x - v1->x) > FLT_EPSILON)
|
||||||
angle = (float)atan((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 = (float)sin(angle) / (float)screen_width;
|
dx = sinf(angle) / (float)screen_width;
|
||||||
dy = (float)cos(angle) / (float)screen_height;
|
dy = cosf(angle) / (float)screen_height;
|
||||||
|
|
||||||
p[0] = v1->x - dx; p[1] = -(v1->y + dy); p[2] = 1;
|
p[0] = v1->x - dx; p[1] = -(v1->y + dy); p[2] = 1;
|
||||||
p[3] = v2->x - dx; p[4] = -(v2->y + dy); p[5] = 1;
|
p[3] = v2->x - dx; p[4] = -(v2->y + dy); p[5] = 1;
|
||||||
@@ -1601,18 +1582,21 @@ void GL_Draw2DLine(F2DCoord * v1, F2DCoord * v2, RGBA_t Color)
|
|||||||
pglEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
pglEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
pglEnable(GL_TEXTURE_2D);
|
pglEnable(GL_TEXTURE_2D);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void Clamp2D(GLenum pname)
|
||||||
|
{
|
||||||
|
#ifdef GL_CLAMP_TO_EDGE
|
||||||
|
pglTexParameteri(GL_TEXTURE_2D, pname, GL_CLAMP_TO_EDGE);
|
||||||
|
#else
|
||||||
|
pglTexParameteri(GL_TEXTURE_2D, pname, GL_CLAMP); // fallback clamp
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------+
|
// -----------------+
|
||||||
// SetBlend : Set render mode
|
// SetBlend : Set render mode
|
||||||
// -----------------+
|
// -----------------+
|
||||||
// PF_Masked - we could use an ALPHA_TEST of GL_EQUAL, and alpha ref of 0,
|
// PF_Masked - we could use an ALPHA_TEST of GL_EQUAL, and alpha ref of 0,
|
||||||
// is it faster when pixels are discarded ?
|
// is it faster when pixels are discarded ?
|
||||||
static void Clamp2D(GLenum pname)
|
|
||||||
{
|
|
||||||
pglTexParameteri(GL_TEXTURE_2D, pname, GL_CLAMP); // fallback clamp
|
|
||||||
#ifdef GL_CLAMP_TO_EDGE
|
|
||||||
pglTexParameteri(GL_TEXTURE_2D, pname, GL_CLAMP_TO_EDGE);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void GL_SetBlendEquation(GLenum mode)
|
static void GL_SetBlendEquation(GLenum mode)
|
||||||
{
|
{
|
||||||
@@ -1761,14 +1745,6 @@ void GL_SetBlend(FBITFIELD PolyFlags)
|
|||||||
|
|
||||||
if (Xor & PF_Modulated)
|
if (Xor & PF_Modulated)
|
||||||
{
|
{
|
||||||
#if defined (__unix__) || defined (UNIXCOMMON)
|
|
||||||
if (oglflags & GLF_NOTEXENV)
|
|
||||||
{
|
|
||||||
if (!(PolyFlags & PF_Modulated))
|
|
||||||
pglColor4ubv(white);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
if (PolyFlags & PF_Modulated)
|
if (PolyFlags & PF_Modulated)
|
||||||
{ // mix texture colour with Surface->PolyColor
|
{ // mix texture colour with Surface->PolyColor
|
||||||
pglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
pglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
@@ -2004,7 +1980,7 @@ void GL_UpdateTexture(GLMipmap_t *pTexInfo)
|
|||||||
{
|
{
|
||||||
if (chromakeyed && (*pImgData == HWR_PATCHES_CHROMAKEY_COLORINDEX))
|
if (chromakeyed && (*pImgData == HWR_PATCHES_CHROMAKEY_COLORINDEX))
|
||||||
{
|
{
|
||||||
tex[idx].s = (byteColor_t){0, 0, 0, 0};
|
memset(&tex[idx].s, 0, sizeof(byteColor_t));
|
||||||
pTexInfo->flags |= TF_TRANSPARENT; // there is a hole in it
|
pTexInfo->flags |= TF_TRANSPARENT; // there is a hole in it
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -2016,10 +1992,9 @@ void GL_UpdateTexture(GLMipmap_t *pTexInfo)
|
|||||||
|
|
||||||
if (texinfoformat != GL_TEXFMT_AP_88)
|
if (texinfoformat != GL_TEXFMT_AP_88)
|
||||||
continue;
|
continue;
|
||||||
if (chromakeyed)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
tex[idx].s.alpha = *pImgData;
|
if (!chromakeyed)
|
||||||
|
tex[idx].s.alpha = *pImgData;
|
||||||
pImgData++;
|
pImgData++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2054,9 +2029,9 @@ void GL_UpdateTexture(GLMipmap_t *pTexInfo)
|
|||||||
{
|
{
|
||||||
for (i = 0; i < w; i++, idx++)
|
for (i = 0; i < w; i++, idx++)
|
||||||
{
|
{
|
||||||
tex[idx].s.red = *pImgData;
|
tex[idx].s.red =
|
||||||
tex[idx].s.green = *pImgData;
|
tex[idx].s.green =
|
||||||
tex[idx].s.blue = *pImgData;
|
tex[idx].s.blue = *pImgData;
|
||||||
pImgData++;
|
pImgData++;
|
||||||
tex[idx].s.alpha = *pImgData;
|
tex[idx].s.alpha = *pImgData;
|
||||||
pImgData++;
|
pImgData++;
|
||||||
@@ -2143,7 +2118,8 @@ void GL_SetTexture(GLMipmap_t *pTexInfo)
|
|||||||
GL_SetNoTexture();
|
GL_SetNoTexture();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (pTexInfo->downloaded)
|
|
||||||
|
if (pTexInfo->downloaded)
|
||||||
{
|
{
|
||||||
if (pTexInfo->downloaded != tex_downloaded)
|
if (pTexInfo->downloaded != tex_downloaded)
|
||||||
{
|
{
|
||||||
@@ -2243,16 +2219,10 @@ static void GL_Shader_SetUniforms(FSurfaceInfo *Surface, GLRGBAFloat *poly, GLRG
|
|||||||
UNIFORM_1(shader->uniforms[gluniform_light_contrast], shader_light_contrast, pglUniform1f);
|
UNIFORM_1(shader->uniforms[gluniform_light_contrast], shader_light_contrast, pglUniform1f);
|
||||||
UNIFORM_1(shader->uniforms[gluniform_light_backlight], shader_light_backlight, pglUniform1f);
|
UNIFORM_1(shader->uniforms[gluniform_light_backlight], shader_light_backlight, pglUniform1f);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
UNIFORM_3(shader->uniforms[gluniform_light_dir], 0, 0, 0, pglUniform3f);
|
|
||||||
UNIFORM_1(shader->uniforms[gluniform_light_contrast], 0, pglUniform1f);
|
|
||||||
UNIFORM_1(shader->uniforms[gluniform_light_backlight], 0, pglUniform1f);
|
|
||||||
}
|
|
||||||
|
|
||||||
UNIFORM_1(shader->uniforms[gluniform_leveltime], shader_leveltime, pglUniform1f);
|
UNIFORM_1(shader->uniforms[gluniform_leveltime], shader_leveltime, pglUniform1f);
|
||||||
|
|
||||||
UNIFORM_2(shader->uniforms[gluniform_scr_resolution], vid.width, vid.height, pglUniform2f);
|
UNIFORM_2(shader->uniforms[gluniform_scr_resolution], (GLfloat)vid.width, (GLfloat)vid.height, pglUniform2f);
|
||||||
|
|
||||||
#undef UNIFORM_1
|
#undef UNIFORM_1
|
||||||
#undef UNIFORM_2
|
#undef UNIFORM_2
|
||||||
@@ -2419,38 +2389,38 @@ static void GL_PreparePolygon(FSurfaceInfo *pSurf, FBITFIELD PolyFlags)
|
|||||||
|
|
||||||
if (pSurf)
|
if (pSurf)
|
||||||
{
|
{
|
||||||
// If modulated, mix the surface colour to the texture
|
|
||||||
if (CurrentPolyFlags & PF_Modulated)
|
|
||||||
pglColor4ubv((GLubyte*)&pSurf->PolyColor.s);
|
|
||||||
|
|
||||||
// If the surface is either modulated or colormapped, or both
|
// If the surface is either modulated or colormapped, or both
|
||||||
if (CurrentPolyFlags & (PF_Modulated | PF_ColorMapped))
|
if (CurrentPolyFlags & (PF_Modulated | PF_ColorMapped))
|
||||||
{
|
{
|
||||||
poly.red = byte2float[pSurf->PolyColor.s.red];
|
// If modulated, mix the surface colour to the texture
|
||||||
poly.green = byte2float[pSurf->PolyColor.s.green];
|
if (CurrentPolyFlags & PF_Modulated)
|
||||||
poly.blue = byte2float[pSurf->PolyColor.s.blue];
|
pglColor4ubv((GLubyte*)&pSurf->PolyColor.s);
|
||||||
poly.alpha = byte2float[pSurf->PolyColor.s.alpha];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only if the surface is colormapped
|
poly.red = byte2float(pSurf->PolyColor.s.red);
|
||||||
if (CurrentPolyFlags & PF_ColorMapped)
|
poly.green = byte2float(pSurf->PolyColor.s.green);
|
||||||
{
|
poly.blue = byte2float(pSurf->PolyColor.s.blue);
|
||||||
tint.red = byte2float[pSurf->TintColor.s.red];
|
poly.alpha = byte2float(pSurf->PolyColor.s.alpha);
|
||||||
tint.green = byte2float[pSurf->TintColor.s.green];
|
|
||||||
tint.blue = byte2float[pSurf->TintColor.s.blue];
|
|
||||||
tint.alpha = byte2float[pSurf->TintColor.s.alpha];
|
|
||||||
|
|
||||||
fade.red = byte2float[pSurf->FadeColor.s.red];
|
// Only if the surface is colormapped
|
||||||
fade.green = byte2float[pSurf->FadeColor.s.green];
|
if (CurrentPolyFlags & PF_ColorMapped)
|
||||||
fade.blue = byte2float[pSurf->FadeColor.s.blue];
|
|
||||||
fade.alpha = byte2float[pSurf->FadeColor.s.alpha];
|
|
||||||
|
|
||||||
if (pSurf->LightTableId && pSurf->LightTableId != lt_downloaded)
|
|
||||||
{
|
{
|
||||||
pglActiveTexture(GL_TEXTURE2);
|
tint.red = byte2float(pSurf->TintColor.s.red);
|
||||||
pglBindTexture(GL_TEXTURE_2D, pSurf->LightTableId);
|
tint.green = byte2float(pSurf->TintColor.s.green);
|
||||||
pglActiveTexture(GL_TEXTURE0);
|
tint.blue = byte2float(pSurf->TintColor.s.blue);
|
||||||
lt_downloaded = pSurf->LightTableId;
|
tint.alpha = byte2float(pSurf->TintColor.s.alpha);
|
||||||
|
|
||||||
|
fade.red = byte2float(pSurf->FadeColor.s.red);
|
||||||
|
fade.green = byte2float(pSurf->FadeColor.s.green);
|
||||||
|
fade.blue = byte2float(pSurf->FadeColor.s.blue);
|
||||||
|
fade.alpha = byte2float(pSurf->FadeColor.s.alpha);
|
||||||
|
|
||||||
|
if (pSurf->LightTableId && pSurf->LightTableId != lt_downloaded)
|
||||||
|
{
|
||||||
|
pglActiveTexture(GL_TEXTURE2);
|
||||||
|
pglBindTexture(GL_TEXTURE_2D, pSurf->LightTableId);
|
||||||
|
pglActiveTexture(GL_TEXTURE0);
|
||||||
|
lt_downloaded = pSurf->LightTableId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2962,24 +2932,24 @@ void GL_DrawModelEx(model_t *model, INT32 frameIndex, float duration, float tics
|
|||||||
pol = 0.0f;
|
pol = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
poly.red = byte2float[Surface->PolyColor.s.red];
|
poly.red = byte2float(Surface->PolyColor.s.red);
|
||||||
poly.green = byte2float[Surface->PolyColor.s.green];
|
poly.green = byte2float(Surface->PolyColor.s.green);
|
||||||
poly.blue = byte2float[Surface->PolyColor.s.blue];
|
poly.blue = byte2float(Surface->PolyColor.s.blue);
|
||||||
poly.alpha = byte2float[Surface->PolyColor.s.alpha];
|
poly.alpha = byte2float(Surface->PolyColor.s.alpha);
|
||||||
|
|
||||||
pglColor4ubv((GLubyte*)&Surface->PolyColor.s);
|
pglColor4ubv((GLubyte*)&Surface->PolyColor.s);
|
||||||
|
|
||||||
GL_SetBlend(((poly.alpha < 1) ? Surface->PolyFlags : (PF_Masked|PF_Occlude))|PF_Modulated);
|
GL_SetBlend(((poly.alpha < 1) ? Surface->PolyFlags : (PF_Masked|PF_Occlude))|PF_Modulated);
|
||||||
|
|
||||||
tint.red = byte2float[Surface->TintColor.s.red];
|
tint.red = byte2float(Surface->TintColor.s.red);
|
||||||
tint.green = byte2float[Surface->TintColor.s.green];
|
tint.green = byte2float(Surface->TintColor.s.green);
|
||||||
tint.blue = byte2float[Surface->TintColor.s.blue];
|
tint.blue = byte2float(Surface->TintColor.s.blue);
|
||||||
tint.alpha = byte2float[Surface->TintColor.s.alpha];
|
tint.alpha = byte2float(Surface->TintColor.s.alpha);
|
||||||
|
|
||||||
fade.red = byte2float[Surface->FadeColor.s.red];
|
fade.red = byte2float(Surface->FadeColor.s.red);
|
||||||
fade.green = byte2float[Surface->FadeColor.s.green];
|
fade.green = byte2float(Surface->FadeColor.s.green);
|
||||||
fade.blue = byte2float[Surface->FadeColor.s.blue];
|
fade.blue = byte2float(Surface->FadeColor.s.blue);
|
||||||
fade.alpha = byte2float[Surface->FadeColor.s.alpha];
|
fade.alpha = byte2float(Surface->FadeColor.s.alpha);
|
||||||
|
|
||||||
if (Surface->LightTableId && Surface->LightTableId != lt_downloaded)
|
if (Surface->LightTableId && Surface->LightTableId != lt_downloaded)
|
||||||
{
|
{
|
||||||
@@ -3130,14 +3100,47 @@ void GL_DrawModelEx(model_t *model, INT32 frameIndex, float duration, float tics
|
|||||||
pglDisable(GL_NORMALIZE);
|
pglDisable(GL_NORMALIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GL_Draw2DModel(model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex,
|
||||||
|
FTransform *pos, float hscale, float vscale, UINT8 flipped, UINT8 hflipped, FSurfaceInfo *Surface)
|
||||||
|
{
|
||||||
|
// save our matrix´s
|
||||||
|
pglMatrixMode(GL_PROJECTION);
|
||||||
|
pglPushMatrix();
|
||||||
|
pglMatrixMode(GL_MODELVIEW);
|
||||||
|
pglPushMatrix();
|
||||||
|
|
||||||
|
pglMatrixMode(GL_PROJECTION);
|
||||||
|
pglLoadIdentity();
|
||||||
|
|
||||||
|
// switch to ortho mode to make our lives easier
|
||||||
|
// thisll make sure our coords will be remapped to pixel coords
|
||||||
|
pglOrtho(0.0f, (float)vid.width, (float)vid.height, 0.0f, NZCLIP_PLANE, FAR_ZCLIP_DEFAULT);
|
||||||
|
|
||||||
|
pglMatrixMode(GL_MODELVIEW);
|
||||||
|
pglLoadIdentity();
|
||||||
|
|
||||||
|
pglEnable(GL_DEPTH_TEST);
|
||||||
|
pglDepthMask(GL_TRUE);
|
||||||
|
pglClear(GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
GL_DrawModelEx(model, frameIndex, duration, tics, nextFrameIndex,
|
||||||
|
pos, hscale, vscale, flipped, hflipped, Surface);
|
||||||
|
|
||||||
|
// restore the matrix´s
|
||||||
|
pglMatrixMode(GL_PROJECTION);
|
||||||
|
pglPopMatrix();
|
||||||
|
pglMatrixMode(GL_MODELVIEW);
|
||||||
|
pglPopMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------+
|
// -----------------+
|
||||||
// SetTransform :
|
// SetTransform :
|
||||||
// -----------------+
|
// -----------------+
|
||||||
void GL_SetTransform(FTransform *stransform)
|
void GL_SetTransform(FTransform *stransform)
|
||||||
{
|
{
|
||||||
static boolean special_splitscreen;
|
static boolean special_splitscreen;
|
||||||
GLdouble used_fov;
|
|
||||||
boolean shearing = false;
|
boolean shearing = false;
|
||||||
|
float used_fov;
|
||||||
|
|
||||||
pglLoadIdentity();
|
pglLoadIdentity();
|
||||||
|
|
||||||
@@ -3187,7 +3190,8 @@ void GL_SetTransform(FTransform *stransform)
|
|||||||
{
|
{
|
||||||
float dy = stransform->viewaiming * 2;
|
float dy = stransform->viewaiming * 2;
|
||||||
|
|
||||||
if (stransform->fliptype == TRANSFORM_FLIP || stransform->fliptype == TRANSFORM_MIRRORFLIP)
|
if (stransform->fliptype == TRANSFORM_FLIP
|
||||||
|
|| stransform->fliptype == TRANSFORM_MIRRORFLIP)
|
||||||
dy *= -1.0f;
|
dy *= -1.0f;
|
||||||
|
|
||||||
pglTranslatef(0.0f, -dy/BASEVIDHEIGHT, 0.0f);
|
pglTranslatef(0.0f, -dy/BASEVIDHEIGHT, 0.0f);
|
||||||
@@ -3195,11 +3199,13 @@ void GL_SetTransform(FTransform *stransform)
|
|||||||
|
|
||||||
if (special_splitscreen)
|
if (special_splitscreen)
|
||||||
{
|
{
|
||||||
used_fov = (float)(atan(tan(used_fov * M_PIl / 360) * 0.8) * 360 / M_PIl);
|
used_fov = (atanf(tanf(used_fov * M_PIf / 360.0f) * 0.8f) * 360.0f / M_PIf);
|
||||||
GL_Perspective((GLfloat)used_fov, 2*ASPECT_RATIO);
|
GL_Perspective(used_fov, 2*ASPECT_RATIO);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
GL_Perspective((GLfloat)used_fov, ASPECT_RATIO);
|
{
|
||||||
|
GL_Perspective(used_fov, ASPECT_RATIO);
|
||||||
|
}
|
||||||
|
|
||||||
pglGetFloatv(GL_PROJECTION_MATRIX, projMatrix); // added for new coronas' code (without depth buffer)
|
pglGetFloatv(GL_PROJECTION_MATRIX, projMatrix); // added for new coronas' code (without depth buffer)
|
||||||
pglMatrixMode(GL_MODELVIEW);
|
pglMatrixMode(GL_MODELVIEW);
|
||||||
@@ -3333,8 +3339,8 @@ void GL_Framebuffer_Disable(void)
|
|||||||
// delet our fbo
|
// delet our fbo
|
||||||
if (framebufferobject.fboobj)
|
if (framebufferobject.fboobj)
|
||||||
pglDeleteFramebuffers(1, &framebufferobject.fboobj);
|
pglDeleteFramebuffers(1, &framebufferobject.fboobj);
|
||||||
|
|
||||||
framebufferobject.fboobj = 0;
|
framebufferobject.fboobj = 0;
|
||||||
|
|
||||||
GL_Framebuffer_DeleteAttachments();
|
GL_Framebuffer_DeleteAttachments();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -3464,7 +3470,7 @@ void GL_FlushScreenTextures(void)
|
|||||||
|
|
||||||
void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags)
|
void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags)
|
||||||
{
|
{
|
||||||
float fix[8];
|
static float fix[8];
|
||||||
float xfix, yfix;
|
float xfix, yfix;
|
||||||
|
|
||||||
if (gl_enable_screen_textures != 2)
|
if (gl_enable_screen_textures != 2)
|
||||||
@@ -3473,14 +3479,8 @@ void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags)
|
|||||||
xfix = 1/((float)screen_texsizew/(float)screen_width);
|
xfix = 1/((float)screen_texsizew/(float)screen_width);
|
||||||
yfix = 1/((float)screen_texsizeh/(float)screen_height);
|
yfix = 1/((float)screen_texsizeh/(float)screen_height);
|
||||||
|
|
||||||
fix[0] = 0.0f;
|
fix[3] = fix[5] = yfix;
|
||||||
fix[1] = 0.0f;
|
fix[4] = fix[6] = xfix;
|
||||||
fix[2] = 0.0f;
|
|
||||||
fix[3] = yfix;
|
|
||||||
fix[4] = xfix;
|
|
||||||
fix[5] = yfix;
|
|
||||||
fix[6] = xfix;
|
|
||||||
fix[7] = 0.0f;
|
|
||||||
|
|
||||||
pglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
|
pglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
@@ -3591,22 +3591,30 @@ void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8
|
|||||||
1.0f, -1.0f, 1.0f
|
1.0f, -1.0f, 1.0f
|
||||||
};
|
};
|
||||||
|
|
||||||
xfix = 1/((float)screen_texsizew/(float)screen_width);
|
|
||||||
yfix = 1/((float)screen_texsizeh/(float)screen_height);
|
|
||||||
|
|
||||||
const GLfloat scrwf = (float)screen_width;
|
const GLfloat scrwf = (float)screen_width;
|
||||||
const GLfloat scrwh = (float)screen_height;
|
const GLfloat scrwh = (float)screen_height;
|
||||||
|
|
||||||
|
xfix = 1/((float)screen_texsizew/scrwf);
|
||||||
|
yfix = 1/((float)screen_texsizeh/scrwh);
|
||||||
|
|
||||||
|
GL_SetBlend(PF_Modulated|PF_Translucent|PF_NoDepthTest);
|
||||||
|
|
||||||
// Slight fuzziness
|
// Slight fuzziness
|
||||||
GL_MakeScreenTexture(HWD_SCREENTEXTURE_VHS);
|
GL_MakeScreenTexture(HWD_SCREENTEXTURE_VHS);
|
||||||
GL_SetBlend(PF_Modulated|PF_Translucent|PF_NoDepthTest);
|
|
||||||
pglBindTexture(GL_TEXTURE_2D, screenTextures[HWD_SCREENTEXTURE_VHS]);
|
pglBindTexture(GL_TEXTURE_2D, screenTextures[HWD_SCREENTEXTURE_VHS]);
|
||||||
|
|
||||||
const float stride = 2.f/scrwh;
|
uint32_t r = rand();
|
||||||
|
|
||||||
for (i = 0; i < 1; i += stride)
|
const float ystep = 2.f/scrwh * (float)vid.udup/4.f;
|
||||||
|
|
||||||
|
for (i = 0; i < 1; i += ystep)
|
||||||
{
|
{
|
||||||
fix[2] = (float)(rand() % 128) / -22000.f * xfix;
|
// avoid calling rand thousands of times
|
||||||
|
r ^= r >> 13;
|
||||||
|
r ^= r >> 11;
|
||||||
|
r ^= r << 21;
|
||||||
|
|
||||||
|
fix[2] = (float)(r & 127) / -22000.f * xfix;
|
||||||
fix[0] = fix[2];
|
fix[0] = fix[2];
|
||||||
fix[6] = fix[0] + xfix;
|
fix[6] = fix[0] + xfix;
|
||||||
fix[4] = fix[2] + xfix;
|
fix[4] = fix[2] + xfix;
|
||||||
@@ -3624,8 +3632,8 @@ void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Upward bar
|
// Upward bar
|
||||||
//GL_MakeScreenTexture(HWD_SCREENTEXTURE_VHS);
|
GL_MakeScreenTexture(HWD_SCREENTEXTURE_VHS);
|
||||||
//pglBindTexture(GL_TEXTURE_2D, screenTextures[HWD_SCREENTEXTURE_VHS]);
|
pglBindTexture(GL_TEXTURE_2D, screenTextures[HWD_SCREENTEXTURE_VHS]);
|
||||||
|
|
||||||
color[0] = color[1] = color[2] = 190;
|
color[0] = color[1] = color[2] = 190;
|
||||||
color[3] = 250;
|
color[3] = 250;
|
||||||
@@ -3648,13 +3656,14 @@ void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8
|
|||||||
|
|
||||||
fix[1] = fix[7] += (fix[3] - fix[7])*2;
|
fix[1] = fix[7] += (fix[3] - fix[7])*2;
|
||||||
screenVerts[1] = screenVerts[10] += (screenVerts[4] - screenVerts[1])*2;
|
screenVerts[1] = screenVerts[10] += (screenVerts[4] - screenVerts[1])*2;
|
||||||
|
|
||||||
pglTexCoordPointer(2, GL_FLOAT, 0, fix);
|
pglTexCoordPointer(2, GL_FLOAT, 0, fix);
|
||||||
pglVertexPointer(3, GL_FLOAT, 0, screenVerts);
|
pglVertexPointer(3, GL_FLOAT, 0, screenVerts);
|
||||||
pglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
pglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
||||||
|
|
||||||
// Downward bar
|
// Downward bar
|
||||||
//GL_MakeScreenTexture(HWD_SCREENTEXTURE_VHS);
|
GL_MakeScreenTexture(HWD_SCREENTEXTURE_VHS);
|
||||||
//pglBindTexture(GL_TEXTURE_2D, screenTextures[HWD_SCREENTEXTURE_VHS]);
|
pglBindTexture(GL_TEXTURE_2D, screenTextures[HWD_SCREENTEXTURE_VHS]);
|
||||||
|
|
||||||
fix[0] = 0.0f;
|
fix[0] = 0.0f;
|
||||||
fix[6] = xfix;
|
fix[6] = xfix;
|
||||||
@@ -3673,6 +3682,7 @@ void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8
|
|||||||
|
|
||||||
fix[1] = fix[7] += (fix[3] - fix[7])*2;
|
fix[1] = fix[7] += (fix[3] - fix[7])*2;
|
||||||
screenVerts[1] = screenVerts[10] += (screenVerts[4] - screenVerts[1])*2;
|
screenVerts[1] = screenVerts[10] += (screenVerts[4] - screenVerts[1])*2;
|
||||||
|
|
||||||
pglTexCoordPointer(2, GL_FLOAT, 0, fix);
|
pglTexCoordPointer(2, GL_FLOAT, 0, fix);
|
||||||
pglVertexPointer(3, GL_FLOAT, 0, screenVerts);
|
pglVertexPointer(3, GL_FLOAT, 0, screenVerts);
|
||||||
pglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
pglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
||||||
@@ -3712,9 +3722,15 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean usesh
|
|||||||
{
|
{
|
||||||
float xfix, yfix;
|
float xfix, yfix;
|
||||||
float origaspect, newaspect;
|
float origaspect, newaspect;
|
||||||
float xoff = 1, yoff = 1; // xoffset and yoffset for the polygon to have black bars around the screen
|
float xoff = 1.0f, yoff = 1.0f; // xoffset and yoffset for the polygon to have black bars around the screen
|
||||||
|
|
||||||
|
static float off[12] =
|
||||||
|
{
|
||||||
|
1.0f, 1.0f, 1.0f, 1.0f,
|
||||||
|
1.0f, 1.0f, 1.0f, 1.0f,
|
||||||
|
1.0f, 1.0f, 1.0f, 1.0f
|
||||||
|
};
|
||||||
|
|
||||||
static float off[12];
|
|
||||||
static float fix[8];
|
static float fix[8];
|
||||||
|
|
||||||
if (gl_enable_screen_textures != 2)
|
if (gl_enable_screen_textures != 2)
|
||||||
@@ -3729,37 +3745,23 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean usesh
|
|||||||
if (origaspect < newaspect)
|
if (origaspect < newaspect)
|
||||||
{
|
{
|
||||||
xoff = origaspect / newaspect;
|
xoff = origaspect / newaspect;
|
||||||
yoff = 1;
|
yoff = 1.0f;
|
||||||
}
|
}
|
||||||
else if (origaspect > newaspect)
|
else if (origaspect > newaspect)
|
||||||
{
|
{
|
||||||
xoff = 1;
|
xoff = 1.0f;
|
||||||
yoff = newaspect / origaspect;
|
yoff = newaspect / origaspect;
|
||||||
}
|
}
|
||||||
|
|
||||||
// float off[12];
|
// float off[12];
|
||||||
off[0] = -xoff;
|
off[0] = off[3] = -xoff;
|
||||||
off[1] = -yoff;
|
off[1] = off[10] = -yoff;
|
||||||
off[2] = 1.0f;
|
off[4] = off[7] = yoff;
|
||||||
off[3] = -xoff;
|
off[6] = off[9] = xoff;
|
||||||
off[4] = yoff;
|
|
||||||
off[5] = 1.0f;
|
|
||||||
off[6] = xoff;
|
|
||||||
off[7] = yoff;
|
|
||||||
off[8] = 1.0f;
|
|
||||||
off[9] = xoff;
|
|
||||||
off[10] = -yoff;
|
|
||||||
off[11] = 1.0f;
|
|
||||||
|
|
||||||
// float fix[8];
|
// float fix[8];
|
||||||
fix[0] = 0.0f;
|
fix[3] = fix[5] = yfix;
|
||||||
fix[1] = 0.0f;
|
fix[4] = fix[6] = xfix;
|
||||||
fix[2] = 0.0f;
|
|
||||||
fix[3] = yfix;
|
|
||||||
fix[4] = xfix;
|
|
||||||
fix[5] = yfix;
|
|
||||||
fix[6] = xfix;
|
|
||||||
fix[7] = 0.0f;
|
|
||||||
|
|
||||||
pglViewport(0, 0, width, height);
|
pglViewport(0, 0, width, height);
|
||||||
|
|
||||||
|
|||||||
@@ -38,8 +38,6 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _CREATE_DLL_ // necessary for Unix AND Windows
|
|
||||||
|
|
||||||
#include "../../doomdef.h"
|
#include "../../doomdef.h"
|
||||||
#include "../hw_gl.h"
|
#include "../hw_gl.h"
|
||||||
#include "../../z_zone.h"
|
#include "../../z_zone.h"
|
||||||
@@ -69,7 +67,6 @@ extern boolean supportstencil;
|
|||||||
void *GetGLFunc(const char *proc);
|
void *GetGLFunc(const char *proc);
|
||||||
boolean SetupGLfunc(void);
|
boolean SetupGLfunc(void);
|
||||||
void SetupGLFunc4(void);
|
void SetupGLFunc4(void);
|
||||||
void GL_Flush(void);
|
|
||||||
INT32 GL_isExtAvailable(const char *extension, const GLubyte *start);
|
INT32 GL_isExtAvailable(const char *extension, const GLubyte *start);
|
||||||
void GL_SetModelView(GLint w, GLint h);
|
void GL_SetModelView(GLint w, GLint h);
|
||||||
void GL_SetStates(void);
|
void GL_SetStates(void);
|
||||||
@@ -127,18 +124,9 @@ extern GLint maximumAnisotropy;
|
|||||||
extern boolean supportNPO2tex;
|
extern boolean supportNPO2tex;
|
||||||
extern boolean supportMipMap;
|
extern boolean supportMipMap;
|
||||||
|
|
||||||
/** \brief OpenGL flags for video driver
|
extern GLfloat modelMatrix[16];
|
||||||
*/
|
|
||||||
extern INT32 oglflags;
|
|
||||||
|
|
||||||
extern GLfloat projMatrix[16];
|
extern GLfloat projMatrix[16];
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
GLF_NOZBUFREAD = 0x01,
|
|
||||||
GLF_NOTEXENV = 0x02,
|
|
||||||
} oglflags_t;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+13
-13
@@ -62,7 +62,7 @@ static int hms_started;
|
|||||||
|
|
||||||
static char *hms_api;
|
static char *hms_api;
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
static I_mutex hms_api_mutex;
|
static I_Mutex hms_api_mutex;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static char *hms_server_token;
|
static char *hms_server_token;
|
||||||
@@ -90,9 +90,9 @@ Printf_url (const char *url)
|
|||||||
boolean startup;
|
boolean startup;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&con_mutex);
|
I_LockMutex(&con_mutex);
|
||||||
startup = con_startup;
|
startup = con_startup;
|
||||||
I_unlock_mutex(con_mutex);
|
I_UnlockMutex(con_mutex);
|
||||||
#else
|
#else
|
||||||
startup = con_startup;
|
startup = con_startup;
|
||||||
#endif
|
#endif
|
||||||
@@ -183,19 +183,19 @@ HMS_connect (const char *format, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&hms_api_mutex);
|
I_LockMutex(&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(0, 0, format, ap) + sizeof HMS_QUERY_VERSION - 1 + token_length + 1);
|
url = malloc(seek + vsnprintf(NULL, 0, format, ap) + sizeof HMS_QUERY_VERSION - 1 + token_length + 1);
|
||||||
va_end (ap);
|
va_end (ap);
|
||||||
|
|
||||||
sprintf(url, "%s/", hms_api);
|
sprintf(url, "%s/", hms_api);
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(hms_api_mutex);
|
I_UnlockMutex(hms_api_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
va_start (ap, format);
|
va_start (ap, format);
|
||||||
@@ -471,18 +471,18 @@ HMS_fetch_servers (msg_server_t *list, int query_id)
|
|||||||
*end = '\0';
|
*end = '\0';
|
||||||
|
|
||||||
address = strtok(p, " ");
|
address = strtok(p, " ");
|
||||||
port = strtok(0, " ");
|
port = strtok(NULL, " ");
|
||||||
contact = strtok(0, "");
|
contact = strtok(NULL, "");
|
||||||
|
|
||||||
if (address && port)
|
if (address && port)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&ms_QueryId_mutex);
|
I_LockMutex(&ms_QueryId_mutex);
|
||||||
{
|
{
|
||||||
if (query_id != ms_QueryId)
|
if (query_id != ms_QueryId)
|
||||||
doing_shit = 0;
|
doing_shit = 0;
|
||||||
}
|
}
|
||||||
I_unlock_mutex(ms_QueryId_mutex);
|
I_UnlockMutex(ms_QueryId_mutex);
|
||||||
|
|
||||||
if (! doing_shit)
|
if (! doing_shit)
|
||||||
break;
|
break;
|
||||||
@@ -539,7 +539,7 @@ HMS_compare_mod_version (char *buffer, size_t buffer_size)
|
|||||||
if (HMS_do(hms))
|
if (HMS_do(hms))
|
||||||
{
|
{
|
||||||
version = strtok(hms->buffer, " ");
|
version = strtok(hms->buffer, " ");
|
||||||
version_name = strtok(0, "\n");
|
version_name = strtok(NULL, "\n");
|
||||||
|
|
||||||
if (version && version_name)
|
if (version && version_name)
|
||||||
{
|
{
|
||||||
@@ -611,14 +611,14 @@ void
|
|||||||
HMS_set_api (char *api)
|
HMS_set_api (char *api)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&hms_api_mutex);
|
I_LockMutex(&hms_api_mutex);
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
free(hms_api);
|
free(hms_api);
|
||||||
hms_api = Strip_trailing_slashes(api);
|
hms_api = Strip_trailing_slashes(api);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(hms_api_mutex);
|
I_UnlockMutex(hms_api_mutex);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+138
-86
@@ -68,47 +68,48 @@
|
|||||||
//-------------------------------------------
|
//-------------------------------------------
|
||||||
// heads up font
|
// heads up font
|
||||||
//-------------------------------------------
|
//-------------------------------------------
|
||||||
patch_t *hu_font[HU_FONTSIZE];
|
patch_t *hu_font[HU_FONTSIZE] = {};
|
||||||
patch_t *kart_font[KART_FONTSIZE]; // SRB2kart
|
patch_t *kart_font[KART_FONTSIZE] = {}; // SRB2kart
|
||||||
patch_t *tny_font[HU_FONTSIZE];
|
patch_t *tny_font[HU_FONTSIZE] = {};
|
||||||
patch_t *tallnum[10]; // 0-9
|
patch_t *tallnum[10] = {}; // 0-9
|
||||||
|
|
||||||
// Level title and credits fonts
|
// Level title and credits fonts
|
||||||
patch_t *lt_font[LT_FONTSIZE];
|
patch_t *lt_font[LT_FONTSIZE] = {};
|
||||||
patch_t *cred_font[CRED_FONTSIZE];
|
patch_t *cred_font[CRED_FONTSIZE] = {};
|
||||||
|
|
||||||
// ping font
|
// ping font
|
||||||
// Note: I'd like to adress that at this point we might *REALLY* want to work towards a common drawString function that can take any font we want because this is really turning into a MESS. :V -Lat'
|
// Note: I'd like to adress that at this point we might *REALLY* want to work towards a common drawString function that can take any font we want because this is really turning into a MESS. :V -Lat'
|
||||||
patch_t *pingnum[10];
|
patch_t *pingnum[10] = {};
|
||||||
patch_t *pinggfx[5]; // small ping graphic
|
patch_t *pinggfx[5] = {}; // small ping graphic
|
||||||
patch_t *pingmeasure[2]; // ping measurement graphic
|
patch_t *pingmeasure[2] = {}; // ping measurement graphic
|
||||||
|
|
||||||
patch_t *ranknum[10]; // rank numbers
|
patch_t *ranknum[10] = {}; // rank numbers
|
||||||
|
|
||||||
patch_t *framecounter;
|
patch_t *framecounter = NULL;
|
||||||
patch_t *frameslash; // framerate stuff. Used in screen.c
|
patch_t *frameslash = NULL; // framerate stuff. Used in screen.c
|
||||||
|
|
||||||
static player_t *plr;
|
patch_t *srb2back = NULL;
|
||||||
boolean chat_on; // entering a chat message?
|
|
||||||
|
static player_t *plr = NULL;
|
||||||
|
boolean chat_on = false; // entering a chat message?
|
||||||
static char w_chat_buf[HU_MAXMSGLEN + 1];
|
static char w_chat_buf[HU_MAXMSGLEN + 1];
|
||||||
static textinput_t w_chat;
|
static textinput_t w_chat;
|
||||||
static boolean headsupactive = false;
|
static boolean headsupactive = false;
|
||||||
boolean hu_showscores; // draw rankings
|
boolean hu_showscores = false; // draw rankings
|
||||||
static char hu_tick;
|
static char hu_tick;
|
||||||
static tic_t hu_emoteanim = 0;
|
static tic_t hu_emoteanim = 0;
|
||||||
#define MAXEMOTESUGGESTIONS 8
|
emote_autocomplete_t emote_autocomplete = {0};
|
||||||
static emote_t *emote_suggestions[MAXEMOTESUGGESTIONS] = {0};
|
|
||||||
|
|
||||||
static huddrawlist_h luahuddrawlist_scores;
|
static huddrawlist_h luahuddrawlist_scores = NULL;
|
||||||
|
|
||||||
patch_t *rflagico;
|
patch_t *rflagico = NULL;
|
||||||
patch_t *bflagico;
|
patch_t *bflagico = NULL;
|
||||||
patch_t *rmatcico;
|
patch_t *rmatcico = NULL;
|
||||||
patch_t *bmatcico;
|
patch_t *bmatcico = NULL;
|
||||||
patch_t *tallminus;
|
patch_t *tallminus = NULL;
|
||||||
|
|
||||||
// song credits
|
// song credits
|
||||||
static patch_t *songcreditbg;
|
static patch_t *songcreditbg = NULL;
|
||||||
|
|
||||||
// -------
|
// -------
|
||||||
// protos.
|
// protos.
|
||||||
@@ -122,7 +123,7 @@ consvar_t cv_showspecstuff = {"showspecstuff", "No", CV_SAVE, CV_YesNo, NULL, 0,
|
|||||||
// KEYBOARD LAYOUTS FOR ENTERING TEXT
|
// KEYBOARD LAYOUTS FOR ENTERING TEXT
|
||||||
//======================================================================
|
//======================================================================
|
||||||
|
|
||||||
char *shiftxform;
|
char *shiftxform = NULL;
|
||||||
|
|
||||||
char english_shiftxform[] =
|
char english_shiftxform[] =
|
||||||
{
|
{
|
||||||
@@ -291,6 +292,7 @@ void HU_LoadGraphics(void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
j = HU_FONTSTART;
|
j = HU_FONTSTART;
|
||||||
|
|
||||||
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
|
||||||
@@ -361,21 +363,21 @@ void HU_LoadGraphics(void)
|
|||||||
cred_font[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
cred_font[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
//cache numbers too!
|
// cache numbers too!
|
||||||
for (i = 0; i < 10; i++)
|
for (i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
sprintf(buffer, "STTNUM%d", i);
|
sprintf(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);
|
sprintf(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);
|
sprintf(buffer, "OPPRNK0%d", i);
|
||||||
ranknum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX);
|
ranknum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
// minus for negative tallnums
|
// minus for negative tallnums
|
||||||
tallminus = (patch_t *)W_CachePatchName("STTMINUS", PU_HUDGFX);
|
tallminus = (patch_t *)W_CachePatchName("STTMINUS", PU_HUDGFX);
|
||||||
|
|
||||||
songcreditbg = W_CachePatchName("K_SONGCR", PU_HUDGFX);
|
songcreditbg = (patch_t *)W_CachePatchName("K_SONGCR", PU_HUDGFX);
|
||||||
|
|
||||||
// cache ping gfx:
|
// cache ping gfx:
|
||||||
for (i = 0; i < 5; i++)
|
for (i = 0; i < 5; i++)
|
||||||
@@ -384,12 +386,15 @@ void HU_LoadGraphics(void)
|
|||||||
pinggfx[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
pinggfx[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
pingmeasure[0] = W_CachePatchName("PINGD", PU_HUDGFX);
|
pingmeasure[0] = (patch_t *)W_CachePatchName("PINGD", PU_HUDGFX);
|
||||||
pingmeasure[1] = W_CachePatchName("PINGMS", PU_HUDGFX);
|
pingmeasure[1] = (patch_t *)W_CachePatchName("PINGMS", PU_HUDGFX);
|
||||||
|
|
||||||
// fps stuff
|
// fps stuff
|
||||||
framecounter = W_CachePatchName("FRAMER", PU_HUDGFX);
|
framecounter = (patch_t *)W_CachePatchName("FRAMER", PU_HUDGFX);
|
||||||
frameslash = W_CachePatchName("FRAMESL", PU_HUDGFX);;
|
frameslash = (patch_t *)W_CachePatchName("FRAMESL", PU_HUDGFX);
|
||||||
|
|
||||||
|
// idk where else to put this lul
|
||||||
|
srb2back = (patch_t *)W_CachePatchName("SRB2BACK", PU_HUDGFX);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialise Heads up
|
// Initialise Heads up
|
||||||
@@ -406,8 +411,10 @@ void HU_Init(void)
|
|||||||
// set shift translation table
|
// set shift translation table
|
||||||
shiftxform = english_shiftxform;
|
shiftxform = english_shiftxform;
|
||||||
|
|
||||||
luahuddrawlist_scores = LUA_HUD_CreateDrawList();
|
if (dedicated || rendermode == render_none)
|
||||||
|
return;
|
||||||
|
|
||||||
|
luahuddrawlist_scores = LUA_HUD_CreateDrawList();
|
||||||
HU_LoadGraphics();
|
HU_LoadGraphics();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -589,12 +596,12 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Only servers/admins can CSAY.
|
// Only servers/admins can CSAY.
|
||||||
if(!server && !(IsPlayerAdmin(consoleplayer)))
|
if (!server && !(IsPlayerAdmin(consoleplayer)))
|
||||||
flags &= ~HU_CSAY;
|
flags &= ~HU_CSAY;
|
||||||
|
|
||||||
// We handle HU_SERVER_SAY, not the caller.
|
// We handle HU_SERVER_SAY, not the caller.
|
||||||
flags &= ~HU_SERVER_SAY;
|
flags &= ~HU_SERVER_SAY;
|
||||||
if(dedicated && !(flags & HU_CSAY))
|
if (dedicated && !(flags & HU_CSAY))
|
||||||
flags |= HU_SERVER_SAY;
|
flags |= HU_SERVER_SAY;
|
||||||
|
|
||||||
buf[0] = target;
|
buf[0] = target;
|
||||||
@@ -608,17 +615,20 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
|||||||
strlcat(msg, COM_Argv(ix + usedargs), msgspace);
|
strlcat(msg, COM_Argv(ix + usedargs), msgspace);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strlen(msg) > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
|
const size_t msglength = strlen(msg);
|
||||||
|
|
||||||
|
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.
|
||||||
char *nodenum = (char*) malloc(3);
|
CLEANUP(pfree) char *nodenum = (char*) malloc(3);
|
||||||
memcpy(nodenum, msg+3, 2);
|
memcpy(nodenum, msg+3, 2);
|
||||||
nodenum[2] = '\0';
|
nodenum[2] = '\0';
|
||||||
|
|
||||||
// check for undesirable characters in our "number"
|
// check for undesirable characters in our "number"
|
||||||
if (((nodenum[0] < '0') || (nodenum[0] > '9')) || ((nodenum[1] < '0') || (nodenum[1] > '9')))
|
if (((nodenum[0] < '0') || (nodenum[0] > '9')) || ((nodenum[1] < '0') || (nodenum[1] > '9')))
|
||||||
{
|
{
|
||||||
// check if nodenum[1] is a space
|
// check if nodenum[1] is a space
|
||||||
if (nodenum[1] == ' ')
|
if (nodenum[1] == ' ')
|
||||||
@@ -627,23 +637,21 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
HU_AddChatText("\x82NOTICE: \x80Invalid command format. Correct format is \'/pm<node> \'.", false);
|
HU_AddChatText("\x82NOTICE: \x80Invalid command format. Correct format is \'/pm<node> \'.", false);
|
||||||
free(nodenum);
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
if (msg[5] != ' ')
|
if (msg[5] != ' ')
|
||||||
{
|
{
|
||||||
HU_AddChatText("\x82NOTICE: \x80Invalid command format. Correct format is \'/pm<node> \'.", false);
|
HU_AddChatText("\x82NOTICE: \x80Invalid command format. Correct format is \'/pm<node> \'.", false);
|
||||||
free(nodenum);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
target = atoi((const char*) nodenum); // turn that into a number
|
target = atoi((const char*) nodenum); // turn that into a number
|
||||||
free(nodenum);
|
|
||||||
//CONS_Printf("%d\n", target);
|
//CONS_Printf("%d\n", target);
|
||||||
|
|
||||||
// check for target player, if it doesn't exist then we can't send the message!
|
// check for target player, if it doesn't exist then we can't send the message!
|
||||||
@@ -654,12 +662,13 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
|||||||
HU_AddChatText(va("\x82NOTICE: \x80Player %d does not exist.", target), false); // same
|
HU_AddChatText(va("\x82NOTICE: \x80Player %d does not exist.", target), false); // same
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf[0] = target;
|
buf[0] = target;
|
||||||
newmsg = msg+5+spc;
|
newmsg = msg+5+spc;
|
||||||
strlcpy(msg, newmsg, HU_MAXMSGLEN + 1);
|
strlcpy(msg, newmsg, HU_MAXMSGLEN + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
SendNetXCmd(XD_SAY, buf, strlen(msg) + 1 + msg-buf);
|
SendNetXCmd(XD_SAY, buf, msglength + 1 + msg-buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Send a message to everyone.
|
/** Send a message to everyone.
|
||||||
@@ -910,10 +919,12 @@ 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 = strlen(msg);
|
const size_t j = msglength;
|
||||||
for (i = 0; i < j; i++)
|
for (i = 0; i < j; i++)
|
||||||
{
|
{
|
||||||
if (msg[i] & 0x80)
|
if (msg[i] & 0x80)
|
||||||
@@ -960,7 +971,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 && strlen(msg) > 4 && strnicmp(msg, "/me ", 4) == 0)
|
if (target == 0 && msglength > 4 && strnicmp(msg, "/me ", 4) == 0)
|
||||||
{
|
{
|
||||||
msg += 4;
|
msg += 4;
|
||||||
action = true;
|
action = true;
|
||||||
@@ -1061,8 +1072,7 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
|
|||||||
|
|
||||||
HU_AddChatText(va(fmt2, prefix, cstart, dispname, textcolor, msg), cv_chatnotifications.value); // add to chat
|
HU_AddChatText(va(fmt2, prefix, cstart, dispname, textcolor, msg), cv_chatnotifications.value); // add to chat
|
||||||
|
|
||||||
if (tempchar)
|
Z_Free(tempchar);
|
||||||
Z_Free(tempchar);
|
|
||||||
}
|
}
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
// I just want to point out while I'm here that because the data is still
|
// I just want to point out while I'm here that because the data is still
|
||||||
@@ -1142,10 +1152,12 @@ static boolean HU_clearChatSpaces(void)
|
|||||||
size_t i = 0; // Used to just check our message
|
size_t i = 0; // Used to just check our message
|
||||||
char c; // current character we're iterating.
|
char c; // current character we're iterating.
|
||||||
boolean nothingbutspaces = true;
|
boolean nothingbutspaces = true;
|
||||||
|
const size_t chatlength = strlen(w_chat_buf);
|
||||||
|
|
||||||
for (; i < strlen(w_chat_buf); i++) // iterate through message and eradicate all spaces that don't belong.
|
for (; i < chatlength; i++) // iterate through message and eradicate all spaces that don't belong.
|
||||||
{
|
{
|
||||||
c = w_chat_buf[i];
|
c = w_chat_buf[i];
|
||||||
|
|
||||||
if (!c)
|
if (!c)
|
||||||
break; // if there's nothing, it's safe to assume our message has ended, so let's not waste any more time here.
|
break; // if there's nothing, it's safe to assume our message has ended, so let's not waste any more time here.
|
||||||
|
|
||||||
@@ -1154,6 +1166,7 @@ static boolean HU_clearChatSpaces(void)
|
|||||||
nothingbutspaces = false;
|
nothingbutspaces = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nothingbutspaces;
|
return nothingbutspaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1200,11 +1213,11 @@ static void HU_SendChatMessage(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t len = strlen(msg);
|
const size_t msglength = strlen(msg);
|
||||||
|
|
||||||
if (len >= 5 && strnicmp(msg, "/mute", 5) == 0) // Used /mute
|
if (msglength >= 5 && strnicmp(msg, "/mute", 5) == 0) // Used /mute
|
||||||
{
|
{
|
||||||
if (len > 6)
|
if (msglength > 6)
|
||||||
DoMute(msg+6);
|
DoMute(msg+6);
|
||||||
else
|
else
|
||||||
HU_AddChatText("\x82NOTICE: \x80Usage: /mute <name|node>", false);
|
HU_AddChatText("\x82NOTICE: \x80Usage: /mute <name|node>", false);
|
||||||
@@ -1212,7 +1225,7 @@ static void HU_SendChatMessage(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
|
if (msglength > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
|
||||||
{
|
{
|
||||||
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;
|
||||||
@@ -1334,6 +1347,7 @@ boolean HU_Responder(event_t *ev)
|
|||||||
chat_on = true;
|
chat_on = true;
|
||||||
w_chat_buf[0] = 0;
|
w_chat_buf[0] = 0;
|
||||||
M_TextInputInit(&w_chat, w_chat_buf, sizeof w_chat_buf);
|
M_TextInputInit(&w_chat, w_chat_buf, sizeof w_chat_buf);
|
||||||
|
memset(&emote_autocomplete, 0, sizeof(emote_autocomplete));
|
||||||
teamtalk = false;
|
teamtalk = false;
|
||||||
chat_scrollmedown = true;
|
chat_scrollmedown = true;
|
||||||
typelines = 1;
|
typelines = 1;
|
||||||
@@ -1346,6 +1360,7 @@ boolean HU_Responder(event_t *ev)
|
|||||||
chat_on = true;
|
chat_on = true;
|
||||||
w_chat_buf[0] = 0;
|
w_chat_buf[0] = 0;
|
||||||
M_TextInputInit(&w_chat, w_chat_buf, sizeof w_chat_buf);
|
M_TextInputInit(&w_chat, w_chat_buf, sizeof w_chat_buf);
|
||||||
|
memset(&emote_autocomplete, 0, sizeof(emote_autocomplete));
|
||||||
teamtalk = G_GametypeHasTeams(); // Don't teamtalk if we don't have teams.
|
teamtalk = G_GametypeHasTeams(); // Don't teamtalk if we don't have teams.
|
||||||
chat_scrollmedown = true;
|
chat_scrollmedown = true;
|
||||||
typelines = 1;
|
typelines = 1;
|
||||||
@@ -1371,9 +1386,9 @@ boolean HU_Responder(event_t *ev)
|
|||||||
&& ev->data1 != gamecontrol[0][gc_talkkey][1]))
|
&& ev->data1 != gamecontrol[0][gc_talkkey][1]))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
M_TextInputHandleEmotes(&w_chat, c, emote_suggestions, MAXEMOTESUGGESTIONS);
|
if (M_TextInputHandleEmotes(&w_chat, c, &emote_autocomplete))
|
||||||
|
; // Do nothing
|
||||||
if (c == KEY_ENTER)
|
else if (c == KEY_ENTER)
|
||||||
{
|
{
|
||||||
chat_on = false;
|
chat_on = false;
|
||||||
chat_scrollmedown = true; // you hit enter, so you might wanna autoscroll to see what you just sent. :)
|
chat_scrollmedown = true; // you hit enter, so you might wanna autoscroll to see what you just sent. :)
|
||||||
@@ -1410,8 +1425,6 @@ boolean HU_Responder(event_t *ev)
|
|||||||
// HEADS UP DRAWING
|
// HEADS UP DRAWING
|
||||||
//======================================================================
|
//======================================================================
|
||||||
|
|
||||||
#define HU_DrawEmote(x, y, emote, flags) M_DrawEmote((x), (y), (emote), hu_emoteanim, (flags))
|
|
||||||
|
|
||||||
// Precompile a wordwrapped string to any given width.
|
// Precompile a wordwrapped string to any given width.
|
||||||
// This is a muuuch better method than V_WORDWRAP.
|
// This is a muuuch better method than V_WORDWRAP.
|
||||||
// again stolen and modified a bit from video.c, don't mind me, will need to rearrange this one day.
|
// again stolen and modified a bit from video.c, don't mind me, will need to rearrange this one day.
|
||||||
@@ -1470,6 +1483,7 @@ static char *CHAT_WordWrap(INT32 x, INT32 w, INT32 option, const char *string)
|
|||||||
x = 0;
|
x = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return newstring;
|
return newstring;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1508,7 +1522,7 @@ static void HU_drawMiniChat(void)
|
|||||||
emote_t *emote = NULL;
|
emote_t *emote = NULL;
|
||||||
int emotelen = 0;
|
int emotelen = 0;
|
||||||
|
|
||||||
while(msg[j]) // iterate through msg
|
while (msg[j]) // iterate through msg
|
||||||
{
|
{
|
||||||
if (msg[j] < HU_FONTSTART) // don't draw
|
if (msg[j] < HU_FONTSTART) // don't draw
|
||||||
{
|
{
|
||||||
@@ -1540,19 +1554,21 @@ static void HU_drawMiniChat(void)
|
|||||||
{
|
{
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
|
|
||||||
prev_linereturn = false;
|
prev_linereturn = false;
|
||||||
dx += charwidth;
|
dx += charwidth;
|
||||||
|
|
||||||
if (dx >= boxw)
|
if (dx >= boxw)
|
||||||
{
|
{
|
||||||
dx = 0;
|
dx = 0;
|
||||||
linescount += 1;
|
linescount += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dy = 0;
|
dy = 0;
|
||||||
dx = 0;
|
dx = 0;
|
||||||
msglines += linescount+1;
|
msglines += linescount+1;
|
||||||
if (msg)
|
Z_Free(msg);
|
||||||
Z_Free(msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
y = chaty - charheight*(msglines+1);
|
y = chaty - charheight*(msglines+1);
|
||||||
@@ -1584,7 +1600,7 @@ static void HU_drawMiniChat(void)
|
|||||||
emote_t *emote = NULL;
|
emote_t *emote = NULL;
|
||||||
int emotelen = 0;
|
int emotelen = 0;
|
||||||
|
|
||||||
while(msg[j]) // iterate through msg
|
while (msg[j]) // iterate through msg
|
||||||
{
|
{
|
||||||
if (msg[j] < HU_FONTSTART) // don't draw
|
if (msg[j] < HU_FONTSTART) // don't draw
|
||||||
{
|
{
|
||||||
@@ -1614,7 +1630,7 @@ static void HU_drawMiniChat(void)
|
|||||||
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|V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||||
|
|
||||||
HU_DrawEmote(x+dx+2, y+dy, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT|transflag);
|
M_DrawEmote(x+dx+2, y+dy, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT|transflag);
|
||||||
dx += EMOTEWIDTH - charwidth;
|
dx += EMOTEWIDTH - charwidth;
|
||||||
|
|
||||||
j += emotelen;
|
j += emotelen;
|
||||||
@@ -1629,16 +1645,17 @@ static void HU_drawMiniChat(void)
|
|||||||
|
|
||||||
dx += charwidth;
|
dx += charwidth;
|
||||||
prev_linereturn = false;
|
prev_linereturn = false;
|
||||||
|
|
||||||
if (dx >= boxw)
|
if (dx >= boxw)
|
||||||
{
|
{
|
||||||
dx = 0;
|
dx = 0;
|
||||||
dy += charheight;
|
dy += charheight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dy += charheight;
|
dy += charheight;
|
||||||
dx = 0;
|
dx = 0;
|
||||||
if (msg)
|
Z_Free(msg);
|
||||||
Z_Free(msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// decrement addy and make that shit smooth:
|
// decrement addy and make that shit smooth:
|
||||||
@@ -1690,7 +1707,7 @@ static void HU_drawChatLog(INT32 offset)
|
|||||||
|
|
||||||
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|V_SNAPTOBOTTOM|V_SNAPTOLEFT); // 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;
|
||||||
@@ -1699,7 +1716,7 @@ static void HU_drawChatLog(INT32 offset)
|
|||||||
emote_t *emote = NULL;
|
emote_t *emote = NULL;
|
||||||
int emotelen = 0;
|
int emotelen = 0;
|
||||||
|
|
||||||
while(msg[j]) // iterate through msg
|
while (msg[j]) // iterate through msg
|
||||||
{
|
{
|
||||||
if (msg[j] < HU_FONTSTART) // don't draw
|
if (msg[j] < HU_FONTSTART) // don't draw
|
||||||
{
|
{
|
||||||
@@ -1724,7 +1741,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)))
|
||||||
{
|
{
|
||||||
HU_DrawEmote(x+dx+2, y+dy, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
M_DrawEmote(x+dx+2, y+dy+1, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||||
dx += EMOTEWIDTH - charwidth;
|
dx += EMOTEWIDTH - charwidth;
|
||||||
}
|
}
|
||||||
j += emotelen;
|
j += emotelen;
|
||||||
@@ -1744,10 +1761,10 @@ static void HU_drawChatLog(INT32 offset)
|
|||||||
dy += charheight;
|
dy += charheight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dy += charheight;
|
dy += charheight;
|
||||||
dx = 0;
|
dx = 0;
|
||||||
if (msg)
|
Z_Free(msg);
|
||||||
Z_Free(msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((chat_scroll >= chat_maxscroll) || (chat_scrollmedown)) && !(justscrolleddown || justscrolledup || chat_scrolltime)) // was already at the bottom of the page before new maxscroll calculation and was NOT scrolling.
|
if (((chat_scroll >= chat_maxscroll) || (chat_scrollmedown)) && !(justscrolleddown || justscrolledup || chat_scrolltime)) // was already at the bottom of the page before new maxscroll calculation and was NOT scrolling.
|
||||||
@@ -1864,7 +1881,7 @@ static void HU_DrawChat(void)
|
|||||||
|
|
||||||
if ((emote = M_VerifyEmote(w_chat_buf+i, &emotelen)))
|
if ((emote = M_VerifyEmote(w_chat_buf+i, &emotelen)))
|
||||||
{
|
{
|
||||||
HU_DrawEmote(chatx + c + 2, y-1, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT|t);
|
M_DrawEmote(chatx + c + 2, y-1, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT|t);
|
||||||
c += EMOTEWIDTH - charwidth;
|
c += EMOTEWIDTH - charwidth;
|
||||||
i += emotelen-1;
|
i += emotelen-1;
|
||||||
drawwidth = EMOTEWIDTH;
|
drawwidth = EMOTEWIDTH;
|
||||||
@@ -1901,17 +1918,37 @@ static void HU_DrawChat(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (emote_suggestions[0])
|
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
|
// A bit of copy-paste from /pm code :p
|
||||||
INT32 suggesty = chaty - charheight - 1;
|
INT32 suggesty = chaty - charheight - 1;
|
||||||
size_t longest_suggestion_length = 0;
|
size_t longest_suggestion_length = 0;
|
||||||
|
|
||||||
for (i = 0; i < MAXEMOTESUGGESTIONS && emote_suggestions[i]; ++i)
|
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
||||||
{
|
{
|
||||||
longest_suggestion_length = max(longest_suggestion_length, strlen(emote_suggestions[i]->name));
|
longest_suggestion_length = max(longest_suggestion_length, strlen(suggest->name));
|
||||||
|
++skip;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skip = 0;
|
||||||
|
|
||||||
#ifdef NETSPLITSCREEN
|
#ifdef NETSPLITSCREEN
|
||||||
if (splitscreen)
|
if (splitscreen)
|
||||||
{
|
{
|
||||||
@@ -1923,11 +1960,19 @@ static void HU_DrawChat(void)
|
|||||||
#endif
|
#endif
|
||||||
suggesty -= (cv_kartspeedometer.value ? 16 : 0);
|
suggesty -= (cv_kartspeedometer.value ? 16 : 0);
|
||||||
|
|
||||||
for (i = 0; i < MAXEMOTESUGGESTIONS && emote_suggestions[i]; ++i)
|
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
|
||||||
{
|
{
|
||||||
V_DrawFillConsoleMap(chatx + boxw + 2, suggesty - (7*i), (longest_suggestion_length+2)*4 + EMOTEWIDTH, 6, 239|V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
V_DrawFillConsoleMap(chatx + boxw + 2, suggesty - (7*skip), (longest_suggestion_length+2)*4 + EMOTEWIDTH, 6, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||||
V_DrawSmallString(chatx + boxw + 4 + EMOTEWIDTH, suggesty - (7*i), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, va(":%s:", emote_suggestions[i]->name));
|
|
||||||
HU_DrawEmote(chatx + boxw + 2, suggesty - i*7, emote_suggestions[i], 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1956,7 +2001,7 @@ static void HU_DrawChat(void)
|
|||||||
longest_name_length = max(longest_name_length, strlen(player_names[i]));
|
longest_name_length = max(longest_name_length, strlen(player_names[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
{
|
{
|
||||||
if (!playeringame[i])
|
if (!playeringame[i])
|
||||||
continue;
|
continue;
|
||||||
@@ -2062,15 +2107,15 @@ static void HU_DrawChat_Old(void)
|
|||||||
i = 0;
|
i = 0;
|
||||||
while (w_chat_buf[i])
|
while (w_chat_buf[i])
|
||||||
{
|
{
|
||||||
if (w_chat.cursor == (i+1) && hu_tick < 4)
|
int emotelen;
|
||||||
{
|
emote_t *emote;
|
||||||
INT32 cursorx = (HU_INPUTX+c+charwidth < vid.width) ? (HU_INPUTX + c + charwidth) : (HU_INPUTX); // we may have to go down.
|
|
||||||
INT32 cursory = (cursorx != HU_INPUTX) ? (y) : (y+charheight);
|
|
||||||
V_DrawCharacter(cursorx, cursory+2*con_scalefactor, '_' |cv_constextsize.value | V_NOSCALESTART|t, !cv_allcaps.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Hurdler: isn't it better like that?
|
if ((emote = M_VerifyEmote(w_chat_buf+i, &emotelen)))
|
||||||
if (w_chat_buf[i] >= HU_FONTSTART)
|
{
|
||||||
|
M_DrawScaledEmote((HU_INPUTX + c)<<FRACBITS, (y+con_scalefactor*2)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART | V_NOSCALEPATCH | t);
|
||||||
|
i += emotelen-1;
|
||||||
|
}
|
||||||
|
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);
|
||||||
@@ -2082,6 +2127,13 @@ static void HU_DrawChat_Old(void)
|
|||||||
|
|
||||||
++i;
|
++i;
|
||||||
|
|
||||||
|
if (w_chat.cursor == i && hu_tick < 4)
|
||||||
|
{
|
||||||
|
INT32 cursorx = (HU_INPUTX+c+charwidth < vid.width) ? (HU_INPUTX + c + charwidth) : (HU_INPUTX); // we may have to go down.
|
||||||
|
INT32 cursory = (cursorx != HU_INPUTX) ? (y) : (y+charheight);
|
||||||
|
V_DrawCharacter(cursorx, cursory+2*con_scalefactor, '_' |cv_constextsize.value | V_NOSCALESTART|t, !cv_allcaps.value);
|
||||||
|
}
|
||||||
|
|
||||||
c += charwidth;
|
c += charwidth;
|
||||||
if (c >= vid.width)
|
if (c >= vid.width)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ extern patch_t *pinggfx[5];
|
|||||||
extern patch_t *ranknum[10];
|
extern patch_t *ranknum[10];
|
||||||
extern patch_t *framecounter;
|
extern patch_t *framecounter;
|
||||||
extern patch_t *frameslash;
|
extern patch_t *frameslash;
|
||||||
|
extern patch_t *srb2back;
|
||||||
extern patch_t *lt_font[LT_FONTSIZE];
|
extern patch_t *lt_font[LT_FONTSIZE];
|
||||||
extern patch_t *cred_font[CRED_FONTSIZE];
|
extern patch_t *cred_font[CRED_FONTSIZE];
|
||||||
extern patch_t *rflagico;
|
extern patch_t *rflagico;
|
||||||
|
|||||||
+2
-2
@@ -80,6 +80,8 @@ typedef struct
|
|||||||
|
|
||||||
#define DOOMCOM_DATA(d) (doomdata_t *)&(d)->data
|
#define DOOMCOM_DATA(d) (doomdata_t *)&(d)->data
|
||||||
|
|
||||||
|
extern doomcom_t *doomcom;
|
||||||
|
|
||||||
#ifdef HOLEPUNCH
|
#ifdef HOLEPUNCH
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -91,8 +93,6 @@ typedef struct
|
|||||||
#define HOLEPUNCH_DATA(d) (holepunch_t *)&(d)->data
|
#define HOLEPUNCH_DATA(d) (holepunch_t *)&(d)->data
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern doomcom_t *doomcom;
|
|
||||||
|
|
||||||
/** \brief return packet in doomcom struct
|
/** \brief return packet in doomcom struct
|
||||||
*/
|
*/
|
||||||
extern boolean (*I_NetGet)(void);
|
extern boolean (*I_NetGet)(void);
|
||||||
|
|||||||
@@ -41,11 +41,6 @@ typedef enum {
|
|||||||
*/
|
*/
|
||||||
extern UINT8 sound_started;
|
extern UINT8 sound_started;
|
||||||
|
|
||||||
/** \brief info of samplerate
|
|
||||||
*/
|
|
||||||
#if defined(HAVE_SDL) && SOUND==SOUND_SDL
|
|
||||||
extern consvar_t cv_samplerate;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** \brief The I_GetSfx function
|
/** \brief The I_GetSfx function
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -29,6 +29,10 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define MAX_QUIT_FUNCS 16
|
#define MAX_QUIT_FUNCS 16
|
||||||
|
|
||||||
|
void I_GetConsoleEvents(void);
|
||||||
|
|
||||||
|
extern boolean consolevent;
|
||||||
|
extern boolean framebuffer;
|
||||||
|
|
||||||
/** \brief Graphic system had started up
|
/** \brief Graphic system had started up
|
||||||
*/
|
*/
|
||||||
@@ -61,10 +65,6 @@ precise_t I_GetPreciseTime(void);
|
|||||||
*/
|
*/
|
||||||
UINT64 I_GetPrecisePrecision(void);
|
UINT64 I_GetPrecisePrecision(void);
|
||||||
|
|
||||||
/** \brief Get the current time in rendering tics, including fractions.
|
|
||||||
*/
|
|
||||||
double I_GetFrameTime(void);
|
|
||||||
|
|
||||||
/** \brief Sleeps for the given duration in milliseconds. Depending on the
|
/** \brief Sleeps for the given duration in milliseconds. Depending on the
|
||||||
operating system's scheduler, the calling thread may give up its
|
operating system's scheduler, the calling thread may give up its
|
||||||
time slice for a longer duration. The implementation should give a
|
time slice for a longer duration. The implementation should give a
|
||||||
|
|||||||
+11
-17
@@ -568,13 +568,12 @@ void Command_Numnodes(void)
|
|||||||
|
|
||||||
#ifdef HOLEPUNCH
|
#ifdef HOLEPUNCH
|
||||||
/* not one of the reserved "local" addresses */
|
/* not one of the reserved "local" addresses */
|
||||||
static boolean
|
static boolean is_external_address(UINT32 p)
|
||||||
is_external_address (UINT32 p)
|
|
||||||
{
|
{
|
||||||
UINT8 a = (p & 255);
|
UINT8 a = (p & 255);
|
||||||
UINT8 b = ((p >> 8) & 255);
|
UINT8 b = ((p >> 8) & 255);
|
||||||
|
|
||||||
if (p == (UINT32)~0)/* 255.255.255.255 */
|
if (p == (UINT32)~0) /* 255.255.255.255 */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
switch (a)
|
switch (a)
|
||||||
@@ -584,7 +583,7 @@ is_external_address (UINT32 p)
|
|||||||
case 127:
|
case 127:
|
||||||
return false;
|
return false;
|
||||||
case 172:
|
case 172:
|
||||||
return (b & ~15) != 16;/* 16 - 31 */
|
return (b & ~15) != 16; /* 16 - 31 */
|
||||||
case 192:
|
case 192:
|
||||||
return b != 168;
|
return b != 168;
|
||||||
default:
|
default:
|
||||||
@@ -635,7 +634,7 @@ static boolean SOCK_Get(void)
|
|||||||
c = recvfrom(mysockets[n], (char *)&doomcom->data, MAXPACKETLENGTH, 0,
|
c = recvfrom(mysockets[n], (char *)&doomcom->data, MAXPACKETLENGTH, 0,
|
||||||
(void *)&fromaddress, &fromlen);
|
(void *)&fromaddress, &fromlen);
|
||||||
|
|
||||||
if (c != ERRSOCKET)
|
if (c > 0)
|
||||||
{
|
{
|
||||||
#ifdef USE_STUN
|
#ifdef USE_STUN
|
||||||
if (STUN_got_response(doomcom->data, c))
|
if (STUN_got_response(doomcom->data, c))
|
||||||
@@ -649,7 +648,6 @@ static boolean SOCK_Get(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// find remote node number
|
// find remote node number
|
||||||
for (j = 1; j <= MAXNETNODES; j++) // include LAN
|
for (j = 1; j <= MAXNETNODES; j++) // include LAN
|
||||||
{
|
{
|
||||||
@@ -764,6 +762,7 @@ static void SOCK_Send(void)
|
|||||||
if (myfamily[i] == broadcastaddress[j].any.sa_family)
|
if (myfamily[i] == broadcastaddress[j].any.sa_family)
|
||||||
{
|
{
|
||||||
c = SOCK_SendToAddr(mysockets[i], &broadcastaddress[j]);
|
c = SOCK_SendToAddr(mysockets[i], &broadcastaddress[j]);
|
||||||
|
|
||||||
if (c == ERRSOCKET)
|
if (c == ERRSOCKET)
|
||||||
{
|
{
|
||||||
e = errno;
|
e = errno;
|
||||||
@@ -781,6 +780,7 @@ static void SOCK_Send(void)
|
|||||||
if (myfamily[i] == clientaddress[doomcom->remotenode].any.sa_family)
|
if (myfamily[i] == clientaddress[doomcom->remotenode].any.sa_family)
|
||||||
{
|
{
|
||||||
c = SOCK_SendToAddr(mysockets[i], &clientaddress[doomcom->remotenode]);
|
c = SOCK_SendToAddr(mysockets[i], &clientaddress[doomcom->remotenode]);
|
||||||
|
|
||||||
if (c == ERRSOCKET)
|
if (c == ERRSOCKET)
|
||||||
{
|
{
|
||||||
e = errno;
|
e = errno;
|
||||||
@@ -793,6 +793,7 @@ static void SOCK_Send(void)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
c = SOCK_SendToAddr(nodesocket[doomcom->remotenode], &clientaddress[doomcom->remotenode]);
|
c = SOCK_SendToAddr(nodesocket[doomcom->remotenode], &clientaddress[doomcom->remotenode]);
|
||||||
|
|
||||||
if (c == ERRSOCKET)
|
if (c == ERRSOCKET)
|
||||||
{
|
{
|
||||||
e = errno;
|
e = errno;
|
||||||
@@ -1061,7 +1062,6 @@ static boolean UDP_Socket(void)
|
|||||||
#endif
|
#endif
|
||||||
const char *serv;
|
const char *serv;
|
||||||
|
|
||||||
|
|
||||||
for (s = 0; s < mysocketses; s++)
|
for (s = 0; s < mysocketses; s++)
|
||||||
mysockets[s] = ERRSOCKET;
|
mysockets[s] = ERRSOCKET;
|
||||||
for (s = 0; s < MAXNETNODES+1; s++)
|
for (s = 0; s < MAXNETNODES+1; s++)
|
||||||
@@ -1510,11 +1510,8 @@ static boolean SOCK_SetBanUsername(const char *username)
|
|||||||
username = "Direct IP ban";
|
username = "Direct IP ban";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (banned[numbans - 1].username)
|
Z_Free(banned[numbans - 1].username);
|
||||||
{
|
banned[numbans - 1].username = NULL;
|
||||||
Z_Free(banned[numbans - 1].username);
|
|
||||||
banned[numbans - 1].username = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
banned[numbans - 1].username = Z_StrDup(username);
|
banned[numbans - 1].username = Z_StrDup(username);
|
||||||
|
|
||||||
@@ -1528,11 +1525,8 @@ static boolean SOCK_SetBanReason(const char *reason)
|
|||||||
reason = "No reason given";
|
reason = "No reason given";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (banned[numbans - 1].reason)
|
Z_Free(banned[numbans - 1].reason);
|
||||||
{
|
banned[numbans - 1].reason = NULL;
|
||||||
Z_Free(banned[numbans - 1].reason);
|
|
||||||
banned[numbans - 1].reason = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
banned[numbans - 1].reason = Z_StrDup(reason);
|
banned[numbans - 1].reason = Z_StrDup(reason);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2 KART
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2020-2023 by James R.
|
// Copyright (C) 2020-2023 by James R.
|
||||||
//
|
//
|
||||||
@@ -9,12 +9,14 @@
|
|||||||
/// \file i_threads.c
|
/// \file i_threads.c
|
||||||
/// \brief Multithreading abstraction
|
/// \brief Multithreading abstraction
|
||||||
|
|
||||||
#if defined (__unix__) || (!defined(__APPLE__) && defined (UNIXCOMMON))
|
#ifdef HAVE_THREADS
|
||||||
|
#if defined (__unix__) || defined(UNIXCOMMON)
|
||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
#include "../i_threads.h"
|
#include "i_threads.h"
|
||||||
#include "../doomdef.h"
|
#include "doomdef.h"
|
||||||
|
#include "doomtype.h"
|
||||||
|
|
||||||
typedef struct thread_s thread_t;
|
typedef struct thread_s thread_t;
|
||||||
|
|
||||||
@@ -22,7 +24,7 @@ struct thread_s
|
|||||||
{
|
{
|
||||||
thread_t *next;
|
thread_t *next;
|
||||||
void *userdata;
|
void *userdata;
|
||||||
I_thread_fn func;
|
I_ThreadFn func;
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -41,12 +43,8 @@ static void *HandleThread(void *data)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
FUNCWARNRV
|
||||||
I_spawn_thread (
|
int I_SpawnThread(const char *name, I_ThreadFn entry, void *userdata)
|
||||||
const char * name,
|
|
||||||
I_thread_fn entry,
|
|
||||||
void * userdata
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
thread_t *thread;
|
thread_t *thread;
|
||||||
(void)name;
|
(void)name;
|
||||||
@@ -66,17 +64,20 @@ I_spawn_thread (
|
|||||||
if (thread == NULL)
|
if (thread == NULL)
|
||||||
{
|
{
|
||||||
thread = malloc(sizeof(thread_t));
|
thread = malloc(sizeof(thread_t));
|
||||||
|
if (thread == NULL)
|
||||||
|
return false;
|
||||||
thread->next = thread_list;
|
thread->next = thread_list;
|
||||||
thread_list = thread;
|
thread_list = thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
thread->func = entry;
|
thread->func = entry;
|
||||||
thread->userdata = userdata;
|
thread->userdata = userdata;
|
||||||
pthread_create(&thread->thread, NULL, HandleThread, thread);
|
int err = pthread_create(&thread->thread, NULL, HandleThread, thread);
|
||||||
pthread_mutex_unlock(&thread_lock);
|
pthread_mutex_unlock(&thread_lock);
|
||||||
|
return err == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int I_thread_is_stopped(void)
|
int I_ThreadIsStopped(void)
|
||||||
{
|
{
|
||||||
thread_t *thread;
|
thread_t *thread;
|
||||||
pthread_mutex_lock(&thread_lock);
|
pthread_mutex_lock(&thread_lock);
|
||||||
@@ -94,11 +95,11 @@ int I_thread_is_stopped(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_start_threads(void)
|
void I_StartThreads(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_stop_threads(void)
|
void I_StopThreads(void)
|
||||||
{
|
{
|
||||||
thread_t *thread = thread_list;
|
thread_t *thread = thread_list;
|
||||||
while (thread != NULL)
|
while (thread != NULL)
|
||||||
@@ -109,7 +110,7 @@ void I_stop_threads(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_lock_mutex(I_mutex *anchor)
|
void I_LockMutex(I_Mutex *anchor)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&thread_lock);
|
pthread_mutex_lock(&thread_lock);
|
||||||
if (*anchor == NULL)
|
if (*anchor == NULL)
|
||||||
@@ -127,25 +128,25 @@ void I_lock_mutex(I_mutex *anchor)
|
|||||||
pthread_mutex_lock(*anchor);
|
pthread_mutex_lock(*anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_unlock_mutex(I_mutex id)
|
void I_UnlockMutex(I_Mutex id)
|
||||||
{
|
{
|
||||||
pthread_mutex_unlock(id);
|
pthread_mutex_unlock(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_hold_cond(I_cond *cond_anchor, I_mutex mutex_id)
|
void I_HoldCond(I_Cond *condAnchor, I_Mutex mutexId)
|
||||||
{
|
{
|
||||||
I_Assert(mutex_id != NULL);
|
I_Assert(mutexId != NULL);
|
||||||
pthread_mutex_lock(&thread_lock);
|
pthread_mutex_lock(&thread_lock);
|
||||||
if (*cond_anchor == NULL)
|
if (*condAnchor == NULL)
|
||||||
{
|
{
|
||||||
*cond_anchor = malloc(sizeof(pthread_cond_t));
|
*condAnchor = malloc(sizeof(pthread_cond_t));
|
||||||
pthread_cond_init(*cond_anchor, NULL);
|
pthread_cond_init(*condAnchor, NULL);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&thread_lock);
|
pthread_mutex_unlock(&thread_lock);
|
||||||
pthread_cond_wait(*cond_anchor, mutex_id);
|
pthread_cond_wait(*condAnchor, mutexId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_wake_one_cond(I_cond *anchor)
|
void I_WakeOneCond(I_Cond *anchor)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&thread_lock);
|
pthread_mutex_lock(&thread_lock);
|
||||||
if (*anchor == NULL)
|
if (*anchor == NULL)
|
||||||
@@ -157,7 +158,7 @@ void I_wake_one_cond(I_cond *anchor)
|
|||||||
pthread_cond_signal(*anchor);
|
pthread_cond_signal(*anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_wake_all_cond(I_cond *anchor)
|
void I_WakeAllCond(I_Cond *anchor)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&thread_lock);
|
pthread_mutex_lock(&thread_lock);
|
||||||
if (*anchor == NULL)
|
if (*anchor == NULL)
|
||||||
@@ -168,12 +169,17 @@ void I_wake_all_cond(I_cond *anchor)
|
|||||||
pthread_mutex_unlock(&thread_lock);
|
pthread_mutex_unlock(&thread_lock);
|
||||||
pthread_cond_broadcast(*anchor);
|
pthread_cond_broadcast(*anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
thread_handle_t I_GetCurrentThread(void)
|
||||||
|
{
|
||||||
|
return pthread_self();
|
||||||
|
}
|
||||||
#elif defined (_WIN32)
|
#elif defined (_WIN32)
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include "../i_threads.h"
|
#include "i_threads.h"
|
||||||
#include "../doomdef.h"
|
#include "doomdef.h"
|
||||||
#include "../doomtype.h"
|
#include "doomtype.h"
|
||||||
|
|
||||||
typedef struct thread_s thread_t;
|
typedef struct thread_s thread_t;
|
||||||
|
|
||||||
@@ -181,9 +187,9 @@ struct thread_s
|
|||||||
{
|
{
|
||||||
thread_t *next;
|
thread_t *next;
|
||||||
void *userdata;
|
void *userdata;
|
||||||
I_thread_fn func;
|
I_ThreadFn func;
|
||||||
HANDLE thread;
|
HANDLE thread;
|
||||||
DWORD thread_id;
|
DWORD threadId;
|
||||||
};
|
};
|
||||||
|
|
||||||
// we use a linked list to avoid moving memory blocks when allocating new threads.
|
// we use a linked list to avoid moving memory blocks when allocating new threads.
|
||||||
@@ -201,7 +207,8 @@ static DWORD __stdcall HandleThread(void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_spawn_thread(const char *name, I_thread_fn entry, void *userdata)
|
FUNCWARNRV
|
||||||
|
int I_SpawnThread(const char *name, I_ThreadFn entry, void *userdata)
|
||||||
{
|
{
|
||||||
thread_t *thread;
|
thread_t *thread;
|
||||||
(void)name;
|
(void)name;
|
||||||
@@ -219,17 +226,20 @@ void I_spawn_thread(const char *name, I_thread_fn entry, void *userdata)
|
|||||||
if (thread == NULL)
|
if (thread == NULL)
|
||||||
{
|
{
|
||||||
thread = malloc(sizeof(thread_t));
|
thread = malloc(sizeof(thread_t));
|
||||||
|
if (thread == NULL)
|
||||||
|
return false;
|
||||||
thread->next = thread_list;
|
thread->next = thread_list;
|
||||||
thread_list = thread;
|
thread_list = thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
thread->func = entry;
|
thread->func = entry;
|
||||||
thread->userdata = userdata;
|
thread->userdata = userdata;
|
||||||
thread->thread = CreateThread(NULL, 0, HandleThread, thread, 0, &thread->thread_id);
|
thread->thread = CreateThread(NULL, 0, HandleThread, thread, 0, &thread->threadId);
|
||||||
LeaveCriticalSection(&thread_lock);
|
LeaveCriticalSection(&thread_lock);
|
||||||
|
return thread->thread != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int I_thread_is_stopped(void)
|
int I_ThreadIsStopped(void)
|
||||||
{
|
{
|
||||||
thread_t *thread;
|
thread_t *thread;
|
||||||
EnterCriticalSection(&thread_lock);
|
EnterCriticalSection(&thread_lock);
|
||||||
@@ -247,12 +257,12 @@ int I_thread_is_stopped(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_start_threads(void)
|
void I_StartThreads(void)
|
||||||
{
|
{
|
||||||
InitializeCriticalSection(&thread_lock);
|
InitializeCriticalSection(&thread_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_stop_threads(void)
|
void I_StopThreads(void)
|
||||||
{
|
{
|
||||||
thread_t *thread = thread_list;
|
thread_t *thread = thread_list;
|
||||||
while (thread != NULL)
|
while (thread != NULL)
|
||||||
@@ -264,7 +274,7 @@ void I_stop_threads(void)
|
|||||||
DeleteCriticalSection(&thread_lock);
|
DeleteCriticalSection(&thread_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_lock_mutex(I_mutex *anchor)
|
void I_LockMutex(I_Mutex *anchor)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&thread_lock);
|
EnterCriticalSection(&thread_lock);
|
||||||
if (*anchor == NULL)
|
if (*anchor == NULL)
|
||||||
@@ -276,25 +286,25 @@ void I_lock_mutex(I_mutex *anchor)
|
|||||||
EnterCriticalSection(*anchor);
|
EnterCriticalSection(*anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_unlock_mutex(I_mutex id)
|
void I_UnlockMutex(I_Mutex id)
|
||||||
{
|
{
|
||||||
LeaveCriticalSection(id);
|
LeaveCriticalSection(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_hold_cond(I_cond *cond_anchor, I_mutex mutex_id)
|
void I_HoldCond(I_Cond *condAnchor, I_Mutex mutexId)
|
||||||
{
|
{
|
||||||
I_Assert(mutex_id != NULL);
|
I_Assert(mutexId != NULL);
|
||||||
EnterCriticalSection(&thread_lock);
|
EnterCriticalSection(&thread_lock);
|
||||||
if (*cond_anchor == NULL)
|
if (*condAnchor == NULL)
|
||||||
{
|
{
|
||||||
*cond_anchor = malloc(sizeof(CONDITION_VARIABLE));
|
*condAnchor = malloc(sizeof(CONDITION_VARIABLE));
|
||||||
InitializeConditionVariable(*cond_anchor);
|
InitializeConditionVariable(*condAnchor);
|
||||||
}
|
}
|
||||||
LeaveCriticalSection(&thread_lock);
|
LeaveCriticalSection(&thread_lock);
|
||||||
SleepConditionVariableCS(*cond_anchor, mutex_id, INFINITE);
|
SleepConditionVariableCS(*condAnchor, mutexId, INFINITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_wake_one_cond(I_cond *anchor)
|
void I_WakeOneCond(I_Cond *anchor)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&thread_lock);
|
EnterCriticalSection(&thread_lock);
|
||||||
if (*anchor == NULL)
|
if (*anchor == NULL)
|
||||||
@@ -306,7 +316,7 @@ void I_wake_one_cond(I_cond *anchor)
|
|||||||
WakeConditionVariable(*anchor);
|
WakeConditionVariable(*anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_wake_all_cond(I_cond *anchor)
|
void I_WakeAllCond(I_Cond *anchor)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&thread_lock);
|
EnterCriticalSection(&thread_lock);
|
||||||
if (*anchor == NULL)
|
if (*anchor == NULL)
|
||||||
@@ -317,48 +327,66 @@ void I_wake_all_cond(I_cond *anchor)
|
|||||||
LeaveCriticalSection(&thread_lock);
|
LeaveCriticalSection(&thread_lock);
|
||||||
WakeAllConditionVariable(*anchor);
|
WakeAllConditionVariable(*anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *I_GetCurrentThread(void)
|
||||||
|
{
|
||||||
|
return GetCurrentThread();
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
void I_spawn_thread(const char *name, I_thread_fn entry, void *userdata)
|
#include "i_threads.h"
|
||||||
|
|
||||||
|
FUNCWARNRV
|
||||||
|
int I_SpawnThread(const char *name, I_ThreadFn entry, void *userdata)
|
||||||
{
|
{
|
||||||
(void)name;
|
(void)name;
|
||||||
entry(userdata);
|
entry(userdata);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int I_thread_is_stopped(void)
|
int I_ThreadIsStopped(void)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I_StartThreads(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_start_threads(void)
|
void I_StopThreads(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_stop_threads(void)
|
void I_LockMutex(I_Mutex *anchor)
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void I_lock_mutex(I_mutex *anchor)
|
|
||||||
{
|
{
|
||||||
(void)anchor;
|
(void)anchor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_unlock_mutex(I_mutex id)
|
void I_UnlockMutex(I_Mutex id)
|
||||||
{
|
{
|
||||||
(void)id;
|
(void)id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_hold_cond(I_cond *cond_anchor, I_mutex mutex_id)
|
void I_HoldCond(I_Cond *condAnchor, I_Mutex mutexId)
|
||||||
{
|
{
|
||||||
(void)cond_anchor;
|
(void)condAnchor;
|
||||||
(void)mutex_id;
|
(void)mutexId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_wake_one_cond(I_cond *anchor)
|
void I_WakeOneCond(I_Cond *anchor)
|
||||||
{
|
{
|
||||||
(void)anchor;
|
(void)anchor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_wake_all_cond(I_cond *anchor)
|
void I_WakeAllCond(I_Cond *anchor)
|
||||||
{
|
{
|
||||||
(void)anchor;
|
(void)anchor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *I_GetCurrentThread(void)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HAVE_THREADS
|
||||||
+25
-13
@@ -1,6 +1,6 @@
|
|||||||
// SONIC ROBO BLAST 2 KART
|
// SONIC ROBO BLAST 2 KART
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2020 by James R.
|
// Copyright (C) 2020-2023 by James R.
|
||||||
//
|
//
|
||||||
// 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.
|
||||||
@@ -14,34 +14,46 @@
|
|||||||
#ifndef I_THREADS_H
|
#ifndef I_THREADS_H
|
||||||
#define I_THREADS_H
|
#define I_THREADS_H
|
||||||
|
|
||||||
|
#include "doomtype.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef void (*I_thread_fn)(void *userdata);
|
typedef void (*I_ThreadFn)(void *userdata);
|
||||||
|
|
||||||
typedef void * I_mutex;
|
typedef void * I_Mutex;
|
||||||
typedef void * I_cond;
|
typedef void * I_Cond;
|
||||||
|
|
||||||
void I_start_threads (void);
|
#ifdef __linux__
|
||||||
void I_stop_threads (void);
|
typedef long unsigned int thread_handle_t;
|
||||||
|
#else
|
||||||
|
typedef void *thread_handle_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
void I_spawn_thread (const char *name, I_thread_fn, void *userdata);
|
void I_StartThreads (void);
|
||||||
|
void I_StopThreads (void);
|
||||||
|
|
||||||
|
FUNCWARNRV
|
||||||
|
int I_SpawnThread (const char *name, I_ThreadFn, void *userdata);
|
||||||
|
|
||||||
/* check in your thread whether to return early */
|
/* check in your thread whether to return early */
|
||||||
int I_thread_is_stopped (void);
|
int I_ThreadIsStopped (void);
|
||||||
|
|
||||||
void I_lock_mutex (I_mutex *);
|
void I_LockMutex (I_Mutex *);
|
||||||
void I_unlock_mutex (I_mutex);
|
void I_UnlockMutex (I_Mutex);
|
||||||
|
|
||||||
void I_hold_cond (I_cond *, I_mutex);
|
void I_HoldCond (I_Cond *, I_Mutex);
|
||||||
|
|
||||||
void I_wake_one_cond (I_cond *);
|
void I_WakeOneCond (I_Cond *);
|
||||||
void I_wake_all_cond (I_cond *);
|
void I_WakeAllCond (I_Cond *);
|
||||||
|
|
||||||
|
thread_handle_t I_GetCurrentThread(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif/*I_THREADS_H*/
|
#endif/*I_THREADS_H*/
|
||||||
|
|
||||||
#endif/*HAVE_THREADS*/
|
#endif/*HAVE_THREADS*/
|
||||||
+5
-2
@@ -21,7 +21,7 @@
|
|||||||
#include "m_fixed.h"
|
#include "m_fixed.h"
|
||||||
#include "i_system.h"
|
#include "i_system.h"
|
||||||
|
|
||||||
timestate_t g_time;
|
timestate_t g_time = {};
|
||||||
|
|
||||||
static CV_PossibleValue_t timescale_cons_t[] = {{FRACUNIT/20, "MIN"}, {20*FRACUNIT, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t timescale_cons_t[] = {{FRACUNIT/20, "MIN"}, {20*FRACUNIT, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_timescale = {"timescale", "1.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, timescale_cons_t, NULL, FRACUNIT, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_timescale = {"timescale", "1.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, timescale_cons_t, NULL, FRACUNIT, NULL, NULL, 0, 0, NULL};
|
||||||
@@ -63,7 +63,10 @@ void I_UpdateTime(fixed_t timescale)
|
|||||||
ticratescaled = (double)((float)TICRATE * FixedToFloat(timescale));
|
ticratescaled = (double)((float)TICRATE * FixedToFloat(timescale));
|
||||||
|
|
||||||
enterprecise = I_GetPreciseTime();
|
enterprecise = I_GetPreciseTime();
|
||||||
elapsedseconds = (double)(enterprecise - oldenterprecise) / I_GetPrecisePrecision();
|
const precise_t elapsed = enterprecise - oldenterprecise;
|
||||||
|
const UINT64 precision = I_GetPrecisePrecision();
|
||||||
|
// explictily do this in double precision
|
||||||
|
elapsedseconds = (double)elapsed / (double)precision;
|
||||||
tictimer += elapsedseconds;
|
tictimer += elapsedseconds;
|
||||||
while (tictimer > 1.0/ticratescaled)
|
while (tictimer > 1.0/ticratescaled)
|
||||||
{
|
{
|
||||||
|
|||||||
+9
-20
@@ -101,10 +101,6 @@ void VID_PrepareModeList(void);
|
|||||||
*/
|
*/
|
||||||
extern boolean allow_fullscreen;
|
extern boolean allow_fullscreen;
|
||||||
|
|
||||||
/** \brief Update video system without updating frame
|
|
||||||
*/
|
|
||||||
void I_UpdateNoBlit(void);
|
|
||||||
|
|
||||||
/** \brief Update video system with updating frame
|
/** \brief Update video system with updating frame
|
||||||
*/
|
*/
|
||||||
void I_FinishUpdate(void);
|
void I_FinishUpdate(void);
|
||||||
@@ -113,13 +109,6 @@ void I_FinishUpdate(void);
|
|||||||
*/
|
*/
|
||||||
void I_UpdateNoVsync(void);
|
void I_UpdateNoVsync(void);
|
||||||
|
|
||||||
/** \brief Wait for vertical retrace or pause a bit.
|
|
||||||
|
|
||||||
\param count max wait
|
|
||||||
|
|
||||||
\return void
|
|
||||||
*/
|
|
||||||
void I_WaitVBL(INT32 count);
|
|
||||||
|
|
||||||
/** \brief The I_ReadScreen function
|
/** \brief The I_ReadScreen function
|
||||||
|
|
||||||
@@ -129,13 +118,6 @@ void I_WaitVBL(INT32 count);
|
|||||||
*/
|
*/
|
||||||
void I_ReadScreen(UINT8 * restrict scr, INT32 scale);
|
void I_ReadScreen(UINT8 * restrict scr, INT32 scale);
|
||||||
|
|
||||||
/** \brief Start disk icon
|
|
||||||
*/
|
|
||||||
void I_BeginRead(void);
|
|
||||||
|
|
||||||
/** \brief Stop disk icon
|
|
||||||
*/
|
|
||||||
void I_EndRead(void);
|
|
||||||
|
|
||||||
UINT32 I_GetRefreshRate(void);
|
UINT32 I_GetRefreshRate(void);
|
||||||
|
|
||||||
@@ -143,8 +125,6 @@ boolean I_CheckNativeRes(void);
|
|||||||
|
|
||||||
void I_SetBorderlessWindow(void);
|
void I_SetBorderlessWindow(void);
|
||||||
|
|
||||||
void I_HandleControllerHatRepeat(void);
|
|
||||||
|
|
||||||
#ifdef USE_FBO_OGL
|
#ifdef USE_FBO_OGL
|
||||||
|
|
||||||
void RefreshOGLSDLSurface(void);
|
void RefreshOGLSDLSurface(void);
|
||||||
@@ -153,6 +133,15 @@ boolean UseScreenFBO(void);
|
|||||||
extern boolean downsample;
|
extern boolean downsample;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// So we can call this from i_video event loop
|
||||||
|
void I_ShutdownJoystick(UINT8 index);
|
||||||
|
|
||||||
|
// Quick thing to make SDL_JOYDEVICEADDED events less of an abomination
|
||||||
|
void I_UpdateJoystickDeviceIndex(UINT8 player);
|
||||||
|
void I_UpdateJoystickDeviceIndices(UINT8 excludePlayer);
|
||||||
|
|
||||||
|
void I_HandleControllerHatRepeat(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
#include "sounds.h"
|
#include "sounds.h"
|
||||||
#include "m_fixed.h"
|
#include "m_fixed.h"
|
||||||
|
|
||||||
|
#define MAXDOOMEDNUM 4095
|
||||||
|
|
||||||
// dehacked.c now has lists for the more named enums! PLEASE keep them up to date!
|
// dehacked.c now has lists for the more named enums! PLEASE keep them up to date!
|
||||||
// For great modding!!
|
// For great modding!!
|
||||||
|
|
||||||
|
|||||||
+57
-10
@@ -568,7 +568,7 @@ static patch_t *kp_racefinish[6];
|
|||||||
static patch_t *kp_positionnum[NUMPOSNUMS][NUMPOSFRAMES];
|
static patch_t *kp_positionnum[NUMPOSNUMS][NUMPOSFRAMES];
|
||||||
static patch_t *kp_winnernum[NUMPOSFRAMES];
|
static patch_t *kp_winnernum[NUMPOSFRAMES];
|
||||||
|
|
||||||
static patch_t *kp_facenum[MAXPLAYERS+1];
|
patch_t *kp_facenum[MAXPLAYERS+1] = {};
|
||||||
static patch_t *kp_facehighlight[8];
|
static patch_t *kp_facehighlight[8];
|
||||||
|
|
||||||
static patch_t *kp_rankbumper;
|
static patch_t *kp_rankbumper;
|
||||||
@@ -1065,7 +1065,7 @@ static void K_initKartHUD(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (timeinmap > 113 || forceshowhud)
|
if (timeinmap > 113 || forceshowhud)
|
||||||
hudtrans = cv_translucenthud.value;
|
hudtrans = (UINT8)cv_translucenthud.value;
|
||||||
else if (timeinmap > 105)
|
else if (timeinmap > 105)
|
||||||
hudtrans = ((((INT32)timeinmap) - 105)*cv_translucenthud.value)/(113-105);
|
hudtrans = ((((INT32)timeinmap) - 105)*cv_translucenthud.value)/(113-105);
|
||||||
else
|
else
|
||||||
@@ -1076,12 +1076,55 @@ static void K_initKartHUD(void)
|
|||||||
R_InterpolateView(R_GetTimeFrac(RTF_CAMERA), !cv_uncappedhud.value);
|
R_InterpolateView(R_GetTimeFrac(RTF_CAMERA), !cv_uncappedhud.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void K_KartPlayerHUDUpdate(player_t *player)
|
||||||
|
{
|
||||||
|
if (player->kartstuff[k_lapanimation])
|
||||||
|
player->kartstuff[k_lapanimation]--;
|
||||||
|
|
||||||
|
if (player->kartstuff[k_yougotem])
|
||||||
|
player->kartstuff[k_yougotem]--;
|
||||||
|
|
||||||
|
if (G_BattleGametype() && (player->exiting || player->kartstuff[k_comebacktimer]))
|
||||||
|
{
|
||||||
|
if (player->exiting)
|
||||||
|
{
|
||||||
|
if (player->exiting < 6*TICRATE)
|
||||||
|
player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1;
|
||||||
|
else if (player->exiting == 6*TICRATE)
|
||||||
|
player->kartstuff[k_cardanimation] = 0;
|
||||||
|
else if (player->kartstuff[k_cardanimation] < 2*TICRATE)
|
||||||
|
player->kartstuff[k_cardanimation]++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (player->kartstuff[k_comebacktimer] < 6*TICRATE)
|
||||||
|
player->kartstuff[k_cardanimation] -= ((164-player->kartstuff[k_cardanimation])/8)+1;
|
||||||
|
else if (player->kartstuff[k_comebacktimer] < 9*TICRATE)
|
||||||
|
player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player->kartstuff[k_cardanimation] > 164)
|
||||||
|
player->kartstuff[k_cardanimation] = 164;
|
||||||
|
if (player->kartstuff[k_cardanimation] < 0)
|
||||||
|
player->kartstuff[k_cardanimation] = 0;
|
||||||
|
}
|
||||||
|
else if (G_RaceGametype() && player->exiting)
|
||||||
|
{
|
||||||
|
if (player->kartstuff[k_cardanimation] < 2*TICRATE)
|
||||||
|
player->kartstuff[k_cardanimation]++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player->kartstuff[k_cardanimation] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UINT8 K_GetHudColor(void)
|
UINT8 K_GetHudColor(void)
|
||||||
{
|
{
|
||||||
if (cv_colorizedhud.value && cv_colorizedhudcolor.value)
|
if (cv_colorizedhud.value && cv_colorizedhudcolor.value)
|
||||||
return cv_colorizedhudcolor.value;
|
return (UINT8)cv_colorizedhudcolor.value;
|
||||||
|
|
||||||
return ((stplyr && gamestate == GS_LEVEL) ? stplyr->skincolor : cv_playercolor.value);
|
return ((stplyr && gamestate == GS_LEVEL) ? stplyr->skincolor : (UINT8)cv_playercolor.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean K_UseColorHud(void)
|
boolean K_UseColorHud(void)
|
||||||
@@ -1483,7 +1526,7 @@ static void K_drawKartItem(void)
|
|||||||
{
|
{
|
||||||
localcolor = K_GetHudColor();
|
localcolor = K_GetHudColor();
|
||||||
|
|
||||||
switch((stplyr->kartstuff[k_itemroulette] % (14*3)) / 3)
|
switch ((stplyr->kartstuff[k_itemroulette] % (14*3)) / 3)
|
||||||
{
|
{
|
||||||
// Each case is handled in threes, to give three frames of in-game time to see the item on the roulette
|
// 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
|
||||||
@@ -2152,7 +2195,7 @@ static boolean K_drawKartPositionFaces(void)
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (!LUA_HudEnabled(hud_minirankings))
|
if (!LUA_HudEnabled(hud_minirankings))
|
||||||
return false; // Don't proceed but still return true for free play above if HUD is disabled.
|
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++)
|
||||||
{
|
{
|
||||||
@@ -2860,7 +2903,7 @@ static boolean K_GetScreenCoords(vector2_t *vec, player_t *player, mobj_t *targe
|
|||||||
|
|
||||||
// X coordinate
|
// X coordinate
|
||||||
// get difference between camangle and angle towards target
|
// get difference between camangle and angle towards target
|
||||||
x = (INT32)viewangle - (INT32)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;
|
||||||
@@ -4387,8 +4430,10 @@ static void K_drawLapStartAnim(void)
|
|||||||
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||||
INT32 vflags = V_SNAPTOTOP|V_HUDTRANS;
|
INT32 vflags = V_SNAPTOTOP|V_HUDTRANS;
|
||||||
|
|
||||||
fixed_t slideout = max(0, 32*(((progress - 76)*FRACUNIT) + R_GetTimeFrac(RTF_LEVEL)));
|
fixed_t slideout = 32*(((progress - 76)*FRACUNIT) + R_GetTimeFrac(RTF_LEVEL));
|
||||||
fixed_t slidein = max(0, 32*(((stplyr->kartstuff[k_lapanimation] - 76)*FRACUNIT) - R_GetTimeFrac(RTF_LEVEL)));
|
slideout = max(0, slideout);
|
||||||
|
fixed_t slidein = 32*(((stplyr->kartstuff[k_lapanimation] - 76)*FRACUNIT) - R_GetTimeFrac(RTF_LEVEL));
|
||||||
|
slidein = max(0, slidein);
|
||||||
|
|
||||||
// First, draw the emblem and hand
|
// First, draw the emblem and hand
|
||||||
INT32 emblemx = (BASEVIDWIDTH << (FRACBITS - 1)) + slidein;
|
INT32 emblemx = (BASEVIDWIDTH << (FRACBITS - 1)) + slidein;
|
||||||
@@ -4423,7 +4468,9 @@ 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);
|
||||||
for (int i = 0; i < (int)strlen(lapnum); i++)
|
const size_t laplength = strlen(lapnum);
|
||||||
|
|
||||||
|
for (int i = 0; i < (int)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));
|
||||||
|
|||||||
+5
-2
@@ -24,7 +24,6 @@ extern "C" {
|
|||||||
UINT8 K_GetHudColor(void);
|
UINT8 K_GetHudColor(void);
|
||||||
boolean K_UseColorHud(void);
|
boolean K_UseColorHud(void);
|
||||||
boolean K_UseHighResPortraits(void);
|
boolean K_UseHighResPortraits(void);
|
||||||
patch_t *K_GetFacePrefix(player_t *player, INT32 skinnum);
|
|
||||||
|
|
||||||
void K_RegisterKartHudStuff(void);
|
void K_RegisterKartHudStuff(void);
|
||||||
|
|
||||||
@@ -35,7 +34,6 @@ extern consvar_t cv_colorizedhud,
|
|||||||
extern consvar_t cv_darkitembox;
|
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_stat_xoffset, cv_stat_yoffset;
|
|
||||||
extern consvar_t cv_showstats;
|
extern consvar_t cv_showstats;
|
||||||
extern consvar_t cv_fancyroulette;
|
extern consvar_t cv_fancyroulette;
|
||||||
extern consvar_t cv_showlaptimes;
|
extern consvar_t cv_showlaptimes;
|
||||||
@@ -43,6 +41,9 @@ 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;
|
||||||
|
|
||||||
|
// for use in timeattack menu
|
||||||
|
extern patch_t *kp_facenum[MAXPLAYERS+1];
|
||||||
|
|
||||||
#define NUMSPEEDOSTUFF 8
|
#define NUMSPEEDOSTUFF 8
|
||||||
extern CV_PossibleValue_t speedo_cons_t[NUMSPEEDOSTUFF];
|
extern CV_PossibleValue_t speedo_cons_t[NUMSPEEDOSTUFF];
|
||||||
#define NUMDGAUGESTUFF 6
|
#define NUMDGAUGESTUFF 6
|
||||||
@@ -52,6 +53,8 @@ extern CV_PossibleValue_t inputdisplay_cons_t[NUMINPUTDISPLAYSTUFF];
|
|||||||
#define NUMMINIMAPDOTSTUFF 5
|
#define NUMMINIMAPDOTSTUFF 5
|
||||||
extern CV_PossibleValue_t minimapdot_cons_t[NUMMINIMAPDOTSTUFF];
|
extern CV_PossibleValue_t minimapdot_cons_t[NUMMINIMAPDOTSTUFF];
|
||||||
|
|
||||||
|
void K_KartPlayerHUDUpdate(player_t *player);
|
||||||
|
|
||||||
const char *K_GetItemPatch(UINT8 item, boolean tiny);
|
const char *K_GetItemPatch(UINT8 item, boolean tiny);
|
||||||
INT32 K_calcSplitFlags(INT32 snapflags);
|
INT32 K_calcSplitFlags(INT32 snapflags);
|
||||||
void K_LoadKartHUDGraphics(void);
|
void K_LoadKartHUDGraphics(void);
|
||||||
|
|||||||
+114
-134
@@ -47,6 +47,8 @@ consvar_t cv_airsparks = {"airdriftsparks", "Off", CV_SAVE, CV_OnOff, NULL, 0, N
|
|||||||
|
|
||||||
consvar_t cv_playerblendeffects = {"playerblendeffects", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_playerblendeffects = {"playerblendeffects", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
consvar_t cv_reducevfx = {"reducevfx", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
// funn-E streeetch
|
// funn-E streeetch
|
||||||
static CV_PossibleValue_t stretchfactor_t[] = {{0, "MIN"}, {FRACUNIT, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t stretchfactor_t[] = {{0, "MIN"}, {FRACUNIT, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_gravstretch = {"gravstretch", "MIN", CV_SAVE|CV_FLOAT, stretchfactor_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_gravstretch = {"gravstretch", "MIN", CV_SAVE|CV_FLOAT, stretchfactor_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
@@ -98,8 +100,6 @@ static void saltyhop_onchange(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean K_SpeedLinesShouldBlend(player_t *player);
|
|
||||||
|
|
||||||
// SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H:
|
// SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H:
|
||||||
// gamespeed is cc (0 for easy, 1 for normal, 2 for hard)
|
// gamespeed is cc (0 for easy, 1 for normal, 2 for hard)
|
||||||
// franticitems is Frantic Mode items, bool
|
// franticitems is Frantic Mode items, bool
|
||||||
@@ -484,7 +484,8 @@ UINT8 colortranslations[MAXTRANSLATIONS][16] = {
|
|||||||
//
|
//
|
||||||
UINT8 K_RainbowColor(void)
|
UINT8 K_RainbowColor(void)
|
||||||
{
|
{
|
||||||
return (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1)));
|
const tic_t time = cv_reducevfx.value ? (leveltime >> 3) : leveltime;
|
||||||
|
return (UINT8)(1 + (time % (MAXSKINCOLORS-1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define for getting accurate color brightness readings according to how the human eye sees them.
|
// Define for getting accurate color brightness readings according to how the human eye sees them.
|
||||||
@@ -766,6 +767,8 @@ void K_RegisterClientKartStuff(void)
|
|||||||
|
|
||||||
CV_RegisterVar(&cv_playerblendeffects);
|
CV_RegisterVar(&cv_playerblendeffects);
|
||||||
|
|
||||||
|
CV_RegisterVar(&cv_reducevfx);
|
||||||
|
|
||||||
CV_RegisterVar(&cv_saltyhop);
|
CV_RegisterVar(&cv_saltyhop);
|
||||||
CV_RegisterVar(&cv_saltyhopsfx);
|
CV_RegisterVar(&cv_saltyhopsfx);
|
||||||
CV_RegisterVar(&cv_saltysquish);
|
CV_RegisterVar(&cv_saltysquish);
|
||||||
@@ -811,8 +814,10 @@ boolean K_IsPlayerLosing(player_t *player)
|
|||||||
boolean K_IsPlayerWanted(player_t *player)
|
boolean K_IsPlayerWanted(player_t *player)
|
||||||
{
|
{
|
||||||
UINT8 i;
|
UINT8 i;
|
||||||
if (!(G_BattleGametype()))
|
|
||||||
|
if (!G_BattleGametype())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
if (battlewanted[i] == -1)
|
if (battlewanted[i] == -1)
|
||||||
@@ -820,6 +825,7 @@ boolean K_IsPlayerWanted(player_t *player)
|
|||||||
if (player == &players[battlewanted[i]])
|
if (player == &players[battlewanted[i]])
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1244,7 +1250,9 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
|||||||
{
|
{
|
||||||
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)
|
||||||
@@ -1258,13 +1266,11 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
|||||||
// This makes the roulette produce the random noises.
|
// This makes the roulette produce the random noises.
|
||||||
if ((player->kartstuff[k_itemroulette] % 3) == 1 && P_IsDisplayPlayer(player))
|
if ((player->kartstuff[k_itemroulette] % 3) == 1 && P_IsDisplayPlayer(player))
|
||||||
{
|
{
|
||||||
#define PLAYROULETTESND S_StartSound(NULL, sfx_itrol1 + ((player->kartstuff[k_itemroulette] / 3) % 8))
|
|
||||||
for (i = 0; i <= splitscreen; i++)
|
for (i = 0; i <= splitscreen; i++)
|
||||||
{
|
{
|
||||||
if (player == &players[displayplayers[i]] && players[displayplayers[i]].kartstuff[k_itemroulette])
|
if (player == &players[displayplayers[i]] && players[displayplayers[i]].kartstuff[k_itemroulette])
|
||||||
PLAYROULETTESND;
|
S_StartSound(NULL, sfx_itrol1 + ((player->kartstuff[k_itemroulette] / 3) % 8));
|
||||||
}
|
}
|
||||||
#undef PLAYROULETTESND
|
|
||||||
}
|
}
|
||||||
|
|
||||||
roulettestop = TICRATE + (3*(pingame - player->kartstuff[k_position]));
|
roulettestop = TICRATE + (3*(pingame - player->kartstuff[k_position]));
|
||||||
@@ -1363,8 +1369,9 @@ static fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
weight = (mobj->player->kartweight)<<FRACBITS;
|
weight = (mobj->player->kartweight)<<FRACBITS;
|
||||||
if (mobj->player->speed > K_GetKartSpeed(mobj->player, false))
|
const fixed_t kartspeed = K_GetKartSpeed(mobj->player, false);
|
||||||
weight += (mobj->player->speed - K_GetKartSpeed(mobj->player, false))/8;
|
if (mobj->player->speed > kartspeed)
|
||||||
|
weight += (mobj->player->speed - kartspeed)/8;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MT_FALLINGROCK:
|
case MT_FALLINGROCK:
|
||||||
@@ -1486,9 +1493,9 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// if the speed difference is less than this let's assume they're going proportionately faster from each other
|
// if the speed difference is less than this let's assume they're going proportionately faster from each other
|
||||||
if (P_AproxDistance(momdifx, momdify) < (25*mapobjectscale))
|
const fixed_t momdiflength = P_AproxDistance(momdifx, momdify);
|
||||||
|
if (momdiflength < (25*mapobjectscale))
|
||||||
{
|
{
|
||||||
fixed_t momdiflength = P_AproxDistance(momdifx, momdify);
|
|
||||||
fixed_t normalisedx = FixedDiv(momdifx, momdiflength);
|
fixed_t normalisedx = FixedDiv(momdifx, momdiflength);
|
||||||
fixed_t normalisedy = FixedDiv(momdify, momdiflength);
|
fixed_t normalisedy = FixedDiv(momdify, momdiflength);
|
||||||
momdifx = FixedMul((25*mapobjectscale), normalisedx);
|
momdifx = FixedMul((25*mapobjectscale), normalisedx);
|
||||||
@@ -1652,7 +1659,7 @@ static void K_UpdateOffroad(player_t *player)
|
|||||||
// If you are in offroad, a timer starts.
|
// If you are in offroad, a timer starts.
|
||||||
if (offroadstrength)
|
if (offroadstrength)
|
||||||
{
|
{
|
||||||
if (/*K_CheckOffroadCollide(player->mo) &&*/ player->kartstuff[k_offroad] == 0) // With the way offroad is detected now that first check is no longer necessary. -Lat'
|
if (/*K_CheckOffroadCollide(player->mo) &&*/ player->kartstuff[k_offroad] == 0) // With the way offroad is detected now that first check is no longer necessary. -Lat'
|
||||||
player->kartstuff[k_offroad] = (TICRATE/2);
|
player->kartstuff[k_offroad] = (TICRATE/2);
|
||||||
|
|
||||||
if (player->kartstuff[k_offroad] > 0)
|
if (player->kartstuff[k_offroad] > 0)
|
||||||
@@ -2396,7 +2403,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
|
|||||||
|| player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0
|
|| player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0
|
||||||
|| (G_BattleGametype() && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
|| (G_BattleGametype() && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
||||||
{
|
{
|
||||||
if (!force) // if shoulddamage force, we go THROUGH that.
|
if (!force) // if shoulddamage force, we go THROUGH that.
|
||||||
{
|
{
|
||||||
K_DoInstashield(player);
|
K_DoInstashield(player);
|
||||||
return;
|
return;
|
||||||
@@ -2441,6 +2448,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
|
|||||||
P_SetScale(karmahitbox, player->mo->scale);
|
P_SetScale(karmahitbox, player->mo->scale);
|
||||||
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
||||||
}
|
}
|
||||||
|
|
||||||
player->kartstuff[k_bumper]--;
|
player->kartstuff[k_bumper]--;
|
||||||
if (K_IsPlayerWanted(player))
|
if (K_IsPlayerWanted(player))
|
||||||
K_CalculateBattleWanted();
|
K_CalculateBattleWanted();
|
||||||
@@ -2575,6 +2583,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor)
|
|||||||
P_SetScale(karmahitbox, player->mo->scale);
|
P_SetScale(karmahitbox, player->mo->scale);
|
||||||
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
||||||
}
|
}
|
||||||
|
|
||||||
player->kartstuff[k_bumper]--;
|
player->kartstuff[k_bumper]--;
|
||||||
if (K_IsPlayerWanted(player))
|
if (K_IsPlayerWanted(player))
|
||||||
K_CalculateBattleWanted();
|
K_CalculateBattleWanted();
|
||||||
@@ -2694,6 +2703,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
|
|||||||
P_SetScale(karmahitbox, player->mo->scale);
|
P_SetScale(karmahitbox, player->mo->scale);
|
||||||
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
||||||
}
|
}
|
||||||
|
|
||||||
player->kartstuff[k_bumper]--;
|
player->kartstuff[k_bumper]--;
|
||||||
if (K_IsPlayerWanted(player))
|
if (K_IsPlayerWanted(player))
|
||||||
K_CalculateBattleWanted();
|
K_CalculateBattleWanted();
|
||||||
@@ -2854,9 +2864,9 @@ void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32
|
|||||||
for (i = 0; i < number; i++)
|
for (i = 0; i < number; i++)
|
||||||
{
|
{
|
||||||
fa = (i*degrees);
|
fa = (i*degrees);
|
||||||
v[0] = FixedMul(FINECOSINE(fa),radius);
|
v[0] = FixedMul(FINECOSINE(fa), radius);
|
||||||
v[1] = 0;
|
v[1] = 0;
|
||||||
v[2] = FixedMul(FINESINE(fa),radius);
|
v[2] = FixedMul(FINESINE(fa), radius);
|
||||||
v[3] = FRACUNIT;
|
v[3] = FRACUNIT;
|
||||||
|
|
||||||
res = VectorMatrixMultiply(v, *RotateXMatrix(rotangle));
|
res = VectorMatrixMultiply(v, *RotateXMatrix(rotangle));
|
||||||
@@ -3098,17 +3108,18 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT16 K_DriftSparkColor(player_t *player, INT32 charge)
|
static UINT8 K_DriftSparkColor(player_t *player, INT32 charge)
|
||||||
{
|
{
|
||||||
UINT16 color = SKINCOLOR_NONE;
|
UINT8 color = SKINCOLOR_NONE;
|
||||||
|
const INT32 sparkval = K_GetKartDriftSparkValue(player);
|
||||||
|
|
||||||
if (charge >= K_GetKartDriftSparkValue(player)*4)
|
if (charge >= sparkval*4)
|
||||||
{
|
{
|
||||||
color = K_RainbowColor();
|
color = K_RainbowColor();
|
||||||
}
|
}
|
||||||
else if (charge >= K_GetKartDriftSparkValue(player)*2)
|
else if (charge >= sparkval*2)
|
||||||
{
|
{
|
||||||
if (charge <= (K_GetKartDriftSparkValue(player)*2)+(24*3))
|
if (charge <= (sparkval*2)+(24*3))
|
||||||
color = SKINCOLOR_RASPBERRY; // transition
|
color = SKINCOLOR_RASPBERRY; // transition
|
||||||
else
|
else
|
||||||
color = SKINCOLOR_KETCHUP;
|
color = SKINCOLOR_KETCHUP;
|
||||||
@@ -3425,7 +3436,7 @@ boolean K_CheckSlopeRollDist(mobj_t *mobj)
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
const fixed_t rolldist = (cv_sloperolldist.value * mapobjectscale);
|
const fixed_t rolldist = (cv_sloperolldist.value * mapobjectscale);
|
||||||
const fixed_t m_dist = (R_QuickCamDist(mobj->x, mobj->y) << FRACBITS);
|
const fixed_t m_dist = R_QuickCamDist(mobj->x, mobj->y);
|
||||||
|
|
||||||
return (m_dist <= rolldist);
|
return (m_dist <= rolldist);
|
||||||
}
|
}
|
||||||
@@ -3589,6 +3600,8 @@ void K_SpawnSparkleTrail(mobj_t *mo)
|
|||||||
I_Assert(mo != NULL);
|
I_Assert(mo != NULL);
|
||||||
I_Assert(!P_MobjWasRemoved(mo));
|
I_Assert(!P_MobjWasRemoved(mo));
|
||||||
|
|
||||||
|
const boolean shouldblend = (mo->player && K_PlayerEffectsShouldBlend(mo->player));
|
||||||
|
|
||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
fixed_t newx = mo->x + mo->momx + (P_RandomRange(-rad, rad)<<FRACBITS);
|
fixed_t newx = mo->x + mo->momx + (P_RandomRange(-rad, rad)<<FRACBITS);
|
||||||
@@ -3606,7 +3619,7 @@ void K_SpawnSparkleTrail(mobj_t *mo)
|
|||||||
|
|
||||||
sparkle->color = mo->color;
|
sparkle->color = mo->color;
|
||||||
|
|
||||||
if (cv_playerblendeffects.value && mo->player && K_SpeedLinesShouldBlend(mo->player))
|
if (shouldblend)
|
||||||
sparkle->blendmode = AST_ADD;
|
sparkle->blendmode = AST_ADD;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3980,15 +3993,19 @@ void K_PuntMine(mobj_t *thismine, mobj_t *punter)
|
|||||||
mine->floorz = thismine->floorz;
|
mine->floorz = thismine->floorz;
|
||||||
mine->ceilingz = thismine->ceilingz;
|
mine->ceilingz = thismine->ceilingz;
|
||||||
|
|
||||||
//Since we aren't using P_KillMobj, we need to clean up the hnext reference
|
// Copy interp data
|
||||||
{
|
mine->old_angle = thismine->old_angle;
|
||||||
P_SetTarget(&thismine->target->hnext, NULL); //target is the player who owns the mine
|
mine->old_x = thismine->old_x;
|
||||||
thismine->target->player->kartstuff[k_bananadrag] = 0;
|
mine->old_y = thismine->old_y;
|
||||||
thismine->target->player->kartstuff[k_itemheld] = 0;
|
mine->old_z = thismine->old_z;
|
||||||
|
|
||||||
if (--thismine->target->player->kartstuff[k_itemamount] <= 0)
|
// Since we aren't using P_KillMobj, we need to clean up the hnext reference
|
||||||
thismine->target->player->kartstuff[k_itemtype] = KITEM_NONE;
|
P_SetTarget(&thismine->target->hnext, NULL); // target is the player who owns the mine
|
||||||
}
|
thismine->target->player->kartstuff[k_bananadrag] = 0;
|
||||||
|
thismine->target->player->kartstuff[k_itemheld] = 0;
|
||||||
|
|
||||||
|
if (--thismine->target->player->kartstuff[k_itemamount] <= 0)
|
||||||
|
thismine->target->player->kartstuff[k_itemtype] = KITEM_NONE;
|
||||||
|
|
||||||
P_RemoveMobj(thismine);
|
P_RemoveMobj(thismine);
|
||||||
|
|
||||||
@@ -4424,6 +4441,12 @@ void K_DropHnextList(player_t *player)
|
|||||||
dropwork->floorz = work->floorz;
|
dropwork->floorz = work->floorz;
|
||||||
dropwork->ceilingz = work->ceilingz;
|
dropwork->ceilingz = work->ceilingz;
|
||||||
|
|
||||||
|
// Copy interp data
|
||||||
|
dropwork->old_angle = work->old_angle;
|
||||||
|
dropwork->old_x = work->old_x;
|
||||||
|
dropwork->old_y = work->old_y;
|
||||||
|
dropwork->old_z = work->old_z;
|
||||||
|
|
||||||
if (ponground)
|
if (ponground)
|
||||||
{
|
{
|
||||||
// floorz and ceilingz aren't properly set to account for FOFs and Polyobjects on spawn
|
// floorz and ceilingz aren't properly set to account for FOFs and Polyobjects on spawn
|
||||||
@@ -4506,7 +4529,7 @@ void K_DropItems(player_t *player)
|
|||||||
{
|
{
|
||||||
mobj_t *drop = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_FLOATINGITEM);
|
mobj_t *drop = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_FLOATINGITEM);
|
||||||
P_SetScale(drop, drop->scale>>4);
|
P_SetScale(drop, drop->scale>>4);
|
||||||
drop->destscale = (3*drop->destscale)/2;;
|
drop->destscale = (3*drop->destscale)/2;
|
||||||
|
|
||||||
drop->angle = player->mo->angle + ANGLE_90;
|
drop->angle = player->mo->angle + ANGLE_90;
|
||||||
P_Thrust(drop,
|
P_Thrust(drop,
|
||||||
@@ -5164,6 +5187,24 @@ player_t *K_FindJawzTarget(mobj_t *actor, player_t *source)
|
|||||||
return wtarg;
|
return wtarg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static INT32 K_GetEngineClass(const player_t *player)
|
||||||
|
{
|
||||||
|
INT32 speed, weight;
|
||||||
|
|
||||||
|
speed = (player->kartspeed - 1) / 3;
|
||||||
|
weight = (player->kartweight - 1) / 3;
|
||||||
|
|
||||||
|
#define LOCKSTAT(stat) \
|
||||||
|
if (stat < 0) { stat = 0; } \
|
||||||
|
if (stat > 2) { stat = 2; }
|
||||||
|
LOCKSTAT(speed);
|
||||||
|
LOCKSTAT(weight);
|
||||||
|
#undef LOCKSTAT
|
||||||
|
|
||||||
|
return (speed + (3*weight));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Engine Sounds.
|
// Engine Sounds.
|
||||||
static void K_UpdateEngineSounds(player_t *player, ticcmd_t *cmd)
|
static void K_UpdateEngineSounds(player_t *player, ticcmd_t *cmd)
|
||||||
{
|
{
|
||||||
@@ -5174,7 +5215,7 @@ static void K_UpdateEngineSounds(player_t *player, ticcmd_t *cmd)
|
|||||||
|
|
||||||
static const UINT8 dampenval = 48; // 255 * 48 = close enough to FRACUNIT/6
|
static const UINT8 dampenval = 48; // 255 * 48 = close enough to FRACUNIT/6
|
||||||
|
|
||||||
INT32 class, s, w; // engine class number
|
INT32 class; // engine class number
|
||||||
|
|
||||||
UINT8 volume = 255;
|
UINT8 volume = 255;
|
||||||
fixed_t volumedampen = FRACUNIT;
|
fixed_t volumedampen = FRACUNIT;
|
||||||
@@ -5210,7 +5251,7 @@ static void K_UpdateEngineSounds(player_t *player, ticcmd_t *cmd)
|
|||||||
targetsnd = (((6 * cmd->forwardmove) / 25) + ((player->speed / mapobjectscale) / 5)) / 2;
|
targetsnd = (((6 * cmd->forwardmove) / 25) + ((player->speed / mapobjectscale) / 5)) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (targetsnd < 0) { targetsnd = 0; }
|
if (targetsnd < 0) { targetsnd = 0; }
|
||||||
if (targetsnd > 12) { targetsnd = 12; }
|
if (targetsnd > 12) { targetsnd = 12; }
|
||||||
|
|
||||||
if (player->kartstuff[k_enginesnd] < targetsnd) { player->kartstuff[k_enginesnd]++; }
|
if (player->kartstuff[k_enginesnd] < targetsnd) { player->kartstuff[k_enginesnd]++; }
|
||||||
@@ -5287,17 +5328,7 @@ static void K_UpdateEngineSounds(player_t *player, ticcmd_t *cmd)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
s = (player->kartspeed - 1) / 3;
|
class = K_GetEngineClass(player);
|
||||||
w = (player->kartweight - 1) / 3;
|
|
||||||
|
|
||||||
#define LOCKSTAT(stat) \
|
|
||||||
if (stat < 0) { stat = 0; } \
|
|
||||||
if (stat > 2) { stat = 2; }
|
|
||||||
LOCKSTAT(s);
|
|
||||||
LOCKSTAT(w);
|
|
||||||
#undef LOCKSTAT
|
|
||||||
|
|
||||||
class = s + (3*w);
|
|
||||||
|
|
||||||
S_StartSoundAtVolume(player->mo, (sfx_krta00 + player->kartstuff[k_enginesnd]) + (class * numsnds), volume);
|
S_StartSoundAtVolume(player->mo, (sfx_krta00 + player->kartstuff[k_enginesnd]) + (class * numsnds), volume);
|
||||||
}
|
}
|
||||||
@@ -5329,53 +5360,13 @@ static void K_UpdateInvincibilitySounds(player_t *player)
|
|||||||
#undef STOPTHIS
|
#undef STOPTHIS
|
||||||
}
|
}
|
||||||
|
|
||||||
void K_KartPlayerHUDUpdate(player_t *player)
|
boolean K_PlayerEffectsShouldBlend(player_t *player)
|
||||||
{
|
|
||||||
if (player->kartstuff[k_lapanimation])
|
|
||||||
player->kartstuff[k_lapanimation]--;
|
|
||||||
|
|
||||||
if (player->kartstuff[k_yougotem])
|
|
||||||
player->kartstuff[k_yougotem]--;
|
|
||||||
|
|
||||||
if (G_BattleGametype() && (player->exiting || player->kartstuff[k_comebacktimer]))
|
|
||||||
{
|
|
||||||
if (player->exiting)
|
|
||||||
{
|
|
||||||
if (player->exiting < 6*TICRATE)
|
|
||||||
player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1;
|
|
||||||
else if (player->exiting == 6*TICRATE)
|
|
||||||
player->kartstuff[k_cardanimation] = 0;
|
|
||||||
else if (player->kartstuff[k_cardanimation] < 2*TICRATE)
|
|
||||||
player->kartstuff[k_cardanimation]++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (player->kartstuff[k_comebacktimer] < 6*TICRATE)
|
|
||||||
player->kartstuff[k_cardanimation] -= ((164-player->kartstuff[k_cardanimation])/8)+1;
|
|
||||||
else if (player->kartstuff[k_comebacktimer] < 9*TICRATE)
|
|
||||||
player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player->kartstuff[k_cardanimation] > 164)
|
|
||||||
player->kartstuff[k_cardanimation] = 164;
|
|
||||||
if (player->kartstuff[k_cardanimation] < 0)
|
|
||||||
player->kartstuff[k_cardanimation] = 0;
|
|
||||||
}
|
|
||||||
else if (G_RaceGametype() && player->exiting)
|
|
||||||
{
|
|
||||||
if (player->kartstuff[k_cardanimation] < 2*TICRATE)
|
|
||||||
player->kartstuff[k_cardanimation]++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
player->kartstuff[k_cardanimation] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static boolean K_SpeedLinesShouldBlend(player_t *player)
|
|
||||||
{
|
{
|
||||||
if (!cv_playerblendeffects.value || !player->mo)
|
if (!cv_playerblendeffects.value || !player->mo)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (player->kartstuff[k_sneakertimer])
|
if (player->kartstuff[k_sneakertimer] ||
|
||||||
|
player->kartstuff[k_invincibilitytimer])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// this is how the percentage speedometer calcs, i suck at maths so this was the easiest thing to do lmao
|
// this is how the percentage speedometer calcs, i suck at maths so this was the easiest thing to do lmao
|
||||||
@@ -5460,7 +5451,7 @@ FUNCINLINE static ATTRINLINE void K_SpawnNormalSpeedLines(player_t *player, bool
|
|||||||
fast->colorized = true;
|
fast->colorized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (colorSpeed && K_SpeedLinesShouldBlend(player))
|
if (colorSpeed && K_PlayerEffectsShouldBlend(player))
|
||||||
fast->blendmode = AST_ADD;
|
fast->blendmode = AST_ADD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5756,7 +5747,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||||||
K_UpdateInvincibilitySounds(player); // Also thanks, VAda!
|
K_UpdateInvincibilitySounds(player); // Also thanks, VAda!
|
||||||
|
|
||||||
// Plays the music during and after the starting countdown.
|
// Plays the music during and after the starting countdown.
|
||||||
if (P_IsLocalPlayer(player))
|
if ((leveltime <= MUSICSTARTTIME) && P_IsLocalPlayer(player))
|
||||||
S_StartMapMusic();
|
S_StartMapMusic();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5936,45 +5927,33 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||||||
// Holding the Jump button will enable drifting.
|
// Holding the Jump button will enable drifting.
|
||||||
|
|
||||||
// Drift Release (Moved here so you can't "chain" drifts)
|
// Drift Release (Moved here so you can't "chain" drifts)
|
||||||
if ((player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5)
|
if (onground && player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5)
|
||||||
// || (player->kartstuff[k_drift] >= 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] <= -1 && player->kartstuff[k_turndir] != -1))
|
|
||||||
&& player->kartstuff[k_driftcharge] < dsone
|
|
||||||
&& onground)
|
|
||||||
{
|
{
|
||||||
player->kartstuff[k_driftcharge] = 0;
|
if (player->kartstuff[k_driftcharge] < dsone)
|
||||||
}
|
{
|
||||||
else if ((player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5)
|
player->kartstuff[k_driftcharge] = 0;
|
||||||
// || (player->kartstuff[k_drift] >= 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] <= -1 && player->kartstuff[k_turndir] != -1))
|
}
|
||||||
&& (player->kartstuff[k_driftcharge] >= dsone && player->kartstuff[k_driftcharge] < dstwo)
|
else if (player->kartstuff[k_driftcharge] >= dsone && player->kartstuff[k_driftcharge] < dstwo)
|
||||||
&& onground)
|
{
|
||||||
{
|
if (player->kartstuff[k_driftboost] < 20)
|
||||||
if (player->kartstuff[k_driftboost] < 20)
|
player->kartstuff[k_driftboost] = 20;
|
||||||
player->kartstuff[k_driftboost] = 20;
|
S_StartSound(player->mo, sfx_s23c);
|
||||||
S_StartSound(player->mo, sfx_s23c);
|
player->kartstuff[k_driftcharge] = 0;
|
||||||
//K_SpawnDashDustRelease(player);
|
}
|
||||||
player->kartstuff[k_driftcharge] = 0;
|
else if (player->kartstuff[k_driftcharge] < dsthree)
|
||||||
}
|
{
|
||||||
else if ((player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5)
|
if (player->kartstuff[k_driftboost] < 50)
|
||||||
// || (player->kartstuff[k_drift] >= 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] <= -1 && player->kartstuff[k_turndir] != -1))
|
player->kartstuff[k_driftboost] = 50;
|
||||||
&& player->kartstuff[k_driftcharge] < dsthree
|
S_StartSound(player->mo, sfx_s23c);
|
||||||
&& onground)
|
player->kartstuff[k_driftcharge] = 0;
|
||||||
{
|
}
|
||||||
if (player->kartstuff[k_driftboost] < 50)
|
else if (player->kartstuff[k_driftcharge] >= dsthree)
|
||||||
player->kartstuff[k_driftboost] = 50;
|
{
|
||||||
S_StartSound(player->mo, sfx_s23c);
|
if (player->kartstuff[k_driftboost] < 125)
|
||||||
//K_SpawnDashDustRelease(player);
|
player->kartstuff[k_driftboost] = 125;
|
||||||
player->kartstuff[k_driftcharge] = 0;
|
S_StartSound(player->mo, sfx_s23c);
|
||||||
}
|
player->kartstuff[k_driftcharge] = 0;
|
||||||
else if ((player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5)
|
}
|
||||||
// || (player->kartstuff[k_drift] >= 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] <= -1 && player->kartstuff[k_turndir] != -1))
|
|
||||||
&& player->kartstuff[k_driftcharge] >= dsthree
|
|
||||||
&& onground)
|
|
||||||
{
|
|
||||||
if (player->kartstuff[k_driftboost] < 125)
|
|
||||||
player->kartstuff[k_driftboost] = 125;
|
|
||||||
S_StartSound(player->mo, sfx_s23c);
|
|
||||||
//K_SpawnDashDustRelease(player);
|
|
||||||
player->kartstuff[k_driftcharge] = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Drifting: left or right?
|
// Drifting: left or right?
|
||||||
@@ -6052,8 +6031,8 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||||||
|
|
||||||
// Sound whenever you get a different tier of sparks
|
// Sound whenever you get a different tier of sparks
|
||||||
if (driftblue
|
if (driftblue
|
||||||
|| driftred
|
|| driftred
|
||||||
|| driftrainbow)
|
|| driftrainbow)
|
||||||
{
|
{
|
||||||
//S_StartSound(player->mo, sfx_s3ka2);
|
//S_StartSound(player->mo, sfx_s3ka2);
|
||||||
if (P_IsLocalPlayer(player)) // UGHGHGH...
|
if (P_IsLocalPlayer(player)) // UGHGHGH...
|
||||||
@@ -6128,6 +6107,7 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||||||
else
|
else
|
||||||
player->kartstuff[k_brakedrift] = 0;
|
player->kartstuff[k_brakedrift] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// K_KartUpdatePosition
|
// K_KartUpdatePosition
|
||||||
//
|
//
|
||||||
@@ -6316,7 +6296,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
|||||||
|
|
||||||
K_KartUpdatePosition(player);
|
K_KartUpdatePosition(player);
|
||||||
|
|
||||||
if (LIKELY(!player->exiting))
|
if (!player->exiting)
|
||||||
{
|
{
|
||||||
if (player->kartstuff[k_oldposition] < player->kartstuff[k_position]) // But first, if you lost a place,
|
if (player->kartstuff[k_oldposition] < player->kartstuff[k_position]) // But first, if you lost a place,
|
||||||
{
|
{
|
||||||
@@ -6479,7 +6459,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
|||||||
}
|
}
|
||||||
player->kartstuff[k_invincibilitytimer] = itemtime+(2*TICRATE); // 10 seconds
|
player->kartstuff[k_invincibilitytimer] = itemtime+(2*TICRATE); // 10 seconds
|
||||||
|
|
||||||
if (P_IsLocalPlayer(player) && cv_supermusic.value == 1 && cv_birdmusic.value)
|
if (cv_supermusic.value == 1 && P_IsLocalPlayer(player))
|
||||||
S_ChangeMusicSpecial("kinvnc");
|
S_ChangeMusicSpecial("kinvnc");
|
||||||
|
|
||||||
P_RestoreMusic(player);
|
P_RestoreMusic(player);
|
||||||
@@ -6683,7 +6663,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
|||||||
if (cv_kartdebugshrink.value && !modeattacking && !player->bot)
|
if (cv_kartdebugshrink.value && !modeattacking && !player->bot)
|
||||||
player->mo->destscale = (6*player->mo->destscale)/8;
|
player->mo->destscale = (6*player->mo->destscale)/8;
|
||||||
player->kartstuff[k_growshrinktimer] = itemtime+(4*TICRATE); // 12 seconds
|
player->kartstuff[k_growshrinktimer] = itemtime+(4*TICRATE); // 12 seconds
|
||||||
if (P_IsLocalPlayer(player) && cv_growmusic.value == 1 && cv_birdmusic.value )
|
if (cv_growmusic.value == 1 && P_IsLocalPlayer(player))
|
||||||
S_ChangeMusicSpecial("kgrow");
|
S_ChangeMusicSpecial("kgrow");
|
||||||
P_RestoreMusic(player);
|
P_RestoreMusic(player);
|
||||||
S_StartSound(player->mo, sfx_kc5a);
|
S_StartSound(player->mo, sfx_kc5a);
|
||||||
@@ -6793,7 +6773,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
|||||||
{
|
{
|
||||||
if (splitscreen)
|
if (splitscreen)
|
||||||
{
|
{
|
||||||
if (leveltime & 1)
|
if (!cv_reducevfx.value && leveltime & 1)
|
||||||
player->mo->flags2 |= MF2_DONTDRAW;
|
player->mo->flags2 |= MF2_DONTDRAW;
|
||||||
else
|
else
|
||||||
player->mo->flags2 &= ~MF2_DONTDRAW;
|
player->mo->flags2 &= ~MF2_DONTDRAW;
|
||||||
@@ -6819,7 +6799,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
|||||||
if (P_IsDisplayPlayer(player)
|
if (P_IsDisplayPlayer(player)
|
||||||
|| (!P_IsDisplayPlayer(player) && (player->kartstuff[k_hyudorotimer] < (1*TICRATE/2) || player->kartstuff[k_hyudorotimer] > hyudorotime-(1*TICRATE/2))))
|
|| (!P_IsDisplayPlayer(player) && (player->kartstuff[k_hyudorotimer] < (1*TICRATE/2) || player->kartstuff[k_hyudorotimer] > hyudorotime-(1*TICRATE/2))))
|
||||||
{
|
{
|
||||||
if (leveltime & 1)
|
if (!cv_reducevfx.value && leveltime & 1)
|
||||||
player->mo->flags2 |= MF2_DONTDRAW;
|
player->mo->flags2 |= MF2_DONTDRAW;
|
||||||
else
|
else
|
||||||
player->mo->flags2 &= ~MF2_DONTDRAW;
|
player->mo->flags2 &= ~MF2_DONTDRAW;
|
||||||
|
|||||||
+1
-1
@@ -41,7 +41,7 @@ void K_FlipFromObject(mobj_t *mo, mobj_t *master);
|
|||||||
void K_MatchGenericExtraFlags(mobj_t *mo, mobj_t *master);
|
void K_MatchGenericExtraFlags(mobj_t *mo, mobj_t *master);
|
||||||
void K_RespawnChecker(player_t *player);
|
void K_RespawnChecker(player_t *player);
|
||||||
void K_KartMoveAnimation(player_t *player);
|
void K_KartMoveAnimation(player_t *player);
|
||||||
void K_KartPlayerHUDUpdate(player_t *player);
|
boolean K_PlayerEffectsShouldBlend(player_t *player);
|
||||||
void K_KartPlayerThink(player_t *player, ticcmd_t *cmd);
|
void K_KartPlayerThink(player_t *player, ticcmd_t *cmd);
|
||||||
void K_KartPlayerAfterThink(player_t *player);
|
void K_KartPlayerAfterThink(player_t *player);
|
||||||
void K_DoInstashield(player_t *player);
|
void K_DoInstashield(player_t *player);
|
||||||
|
|||||||
+1
-2
@@ -99,8 +99,7 @@ void K_EraseStats(void)
|
|||||||
// The only field we want to remember
|
// The only field we want to remember
|
||||||
boolean vanilla = kartstats.vanilla;
|
boolean vanilla = kartstats.vanilla;
|
||||||
|
|
||||||
if (kartstats.copy)
|
Z_Free(kartstats.copy);
|
||||||
Z_Free(kartstats.copy);
|
|
||||||
|
|
||||||
memset(&kartstats, 0, sizeof(kartstats_t));
|
memset(&kartstats, 0, sizeof(kartstats_t));
|
||||||
|
|
||||||
|
|||||||
+32
-8
@@ -384,7 +384,9 @@ static int lib_pSpawnMobj(lua_State *L)
|
|||||||
NOHUD
|
NOHUD
|
||||||
if (type >= NUMMOBJTYPES)
|
if (type >= NUMMOBJTYPES)
|
||||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||||
LUA_PushUserdata(L, P_SpawnMobj(x, y, z, type), META_MOBJ);
|
mobj_t *th = P_SpawnMobj(x, y, z, type);
|
||||||
|
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||||
|
LUA_PushUserdata(L, th, META_MOBJ);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -410,7 +412,9 @@ static int lib_pSpawnMissile(lua_State *L)
|
|||||||
return LUA_ErrInvalid(L, "mobj_t");
|
return LUA_ErrInvalid(L, "mobj_t");
|
||||||
if (type >= NUMMOBJTYPES)
|
if (type >= NUMMOBJTYPES)
|
||||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||||
LUA_PushUserdata(L, P_SpawnMissile(source, dest, type), META_MOBJ);
|
mobj_t *th = P_SpawnMissile(source, dest, type);
|
||||||
|
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||||
|
LUA_PushUserdata(L, th, META_MOBJ);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -427,7 +431,9 @@ static int lib_pSpawnXYZMissile(lua_State *L)
|
|||||||
return LUA_ErrInvalid(L, "mobj_t");
|
return LUA_ErrInvalid(L, "mobj_t");
|
||||||
if (type >= NUMMOBJTYPES)
|
if (type >= NUMMOBJTYPES)
|
||||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||||
LUA_PushUserdata(L, P_SpawnXYZMissile(source, dest, type, x, y, z), META_MOBJ);
|
mobj_t *th = P_SpawnXYZMissile(source, dest, type, x, y, z);
|
||||||
|
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||||
|
LUA_PushUserdata(L, th, META_MOBJ);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -446,7 +452,9 @@ static int lib_pSpawnPointMissile(lua_State *L)
|
|||||||
return LUA_ErrInvalid(L, "mobj_t");
|
return LUA_ErrInvalid(L, "mobj_t");
|
||||||
if (type >= NUMMOBJTYPES)
|
if (type >= NUMMOBJTYPES)
|
||||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||||
LUA_PushUserdata(L, P_SpawnPointMissile(source, xa, ya, za, type, x, y, z), META_MOBJ);
|
mobj_t *th = P_SpawnPointMissile(source, xa, ya, za, type, x, y, z);
|
||||||
|
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||||
|
LUA_PushUserdata(L, th, META_MOBJ);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -463,7 +471,9 @@ static int lib_pSpawnAlteredDirectionMissile(lua_State *L)
|
|||||||
return LUA_ErrInvalid(L, "mobj_t");
|
return LUA_ErrInvalid(L, "mobj_t");
|
||||||
if (type >= NUMMOBJTYPES)
|
if (type >= NUMMOBJTYPES)
|
||||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||||
LUA_PushUserdata(L, P_SpawnAlteredDirectionMissile(source, type, x, y, z, shiftingAngle), META_MOBJ);
|
mobj_t *th = P_SpawnAlteredDirectionMissile(source, type, x, y, z, shiftingAngle);
|
||||||
|
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||||
|
LUA_PushUserdata(L, th, META_MOBJ);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -492,7 +502,9 @@ static int lib_pSPMAngle(lua_State *L)
|
|||||||
return LUA_ErrInvalid(L, "mobj_t");
|
return LUA_ErrInvalid(L, "mobj_t");
|
||||||
if (type >= NUMMOBJTYPES)
|
if (type >= NUMMOBJTYPES)
|
||||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||||
LUA_PushUserdata(L, P_SPMAngle(source, type, angle, allowaim, flags2), META_MOBJ);
|
mobj_t *th = P_SPMAngle(source, type, angle, allowaim, flags2);
|
||||||
|
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||||
|
LUA_PushUserdata(L, th, META_MOBJ);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -506,7 +518,9 @@ static int lib_pSpawnPlayerMissile(lua_State *L)
|
|||||||
return LUA_ErrInvalid(L, "mobj_t");
|
return LUA_ErrInvalid(L, "mobj_t");
|
||||||
if (type >= NUMMOBJTYPES)
|
if (type >= NUMMOBJTYPES)
|
||||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||||
LUA_PushUserdata(L, P_SpawnPlayerMissile(source, type, flags2), META_MOBJ);
|
mobj_t *th = P_SpawnPlayerMissile(source, type, flags2);
|
||||||
|
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||||
|
LUA_PushUserdata(L, th, META_MOBJ);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1279,6 +1293,7 @@ static int lib_pPlayRinglossSound(lua_State *L)
|
|||||||
player_t *player = NULL;
|
player_t *player = NULL;
|
||||||
mobj_t *damager = NULL;
|
mobj_t *damager = NULL;
|
||||||
NOHUD
|
NOHUD
|
||||||
|
LUA_UsageWarning(L, "P_PlayRinglossSound: using this function from lua might cause desynchs, consider using S_StartSound(origin, sfx_khurt1 + P_RandomKey(2)) as workaround");
|
||||||
if (!source)
|
if (!source)
|
||||||
return LUA_ErrInvalid(L, "mobj_t");
|
return LUA_ErrInvalid(L, "mobj_t");
|
||||||
if (!lua_isnone(L, 2) && lua_isuserdata(L, 2))
|
if (!lua_isnone(L, 2) && lua_isuserdata(L, 2))
|
||||||
@@ -3042,7 +3057,13 @@ static int lib_gSetPlayerGamepadIndicatorColor(lua_State *L)
|
|||||||
{
|
{
|
||||||
INT32 player = -1;
|
INT32 player = -1;
|
||||||
player_t *plr = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); // retrieve player
|
player_t *plr = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); // retrieve player
|
||||||
UINT16 color = (UINT16)luaL_checkinteger(L, 2); // skincolor
|
UINT8 color = (UINT8)luaL_checkinteger(L, 2); // skincolor
|
||||||
|
|
||||||
|
if (!plr)
|
||||||
|
return LUA_ErrInvalid(L, "player_t");
|
||||||
|
|
||||||
|
if (color >= MAXTRANSLATIONS)
|
||||||
|
return luaL_error(L, "color %d out of range (0 - %d).", color, MAXTRANSLATIONS-1);
|
||||||
|
|
||||||
for (int i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
|
for (int i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
|
||||||
{
|
{
|
||||||
@@ -3070,6 +3091,9 @@ static int lib_gPlayerDeviceRumble(lua_State *L)
|
|||||||
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)
|
||||||
|
return LUA_ErrInvalid(L, "player_t");
|
||||||
|
|
||||||
for (int i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
|
for (int i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
|
||||||
{
|
{
|
||||||
if (plr - players == displayplayers[i])
|
if (plr - players == displayplayers[i])
|
||||||
|
|||||||
@@ -109,6 +109,7 @@ ENUM (STRING_HOOK);
|
|||||||
|
|
||||||
extern boolean hook_cmd_running; // This is used by PlayerCmd and lua_playerlib to prevent anything from being wirtten to player while we run PlayerCmd.
|
extern boolean hook_cmd_running; // This is used by PlayerCmd and lua_playerlib to prevent anything from being wirtten to player while we run PlayerCmd.
|
||||||
extern int hook_defrosting;
|
extern int hook_defrosting;
|
||||||
|
extern bool hook_important;
|
||||||
|
|
||||||
void LUA_HookVoid(int hook);
|
void LUA_HookVoid(int hook);
|
||||||
void LUA_HookHUD(int hook, huddrawlist_h drawlist);
|
void LUA_HookHUD(int hook, huddrawlist_h drawlist);
|
||||||
|
|||||||
+26
-4
@@ -19,6 +19,7 @@
|
|||||||
#include "b_bot.h"
|
#include "b_bot.h"
|
||||||
#include "z_zone.h"
|
#include "z_zone.h"
|
||||||
#include "m_perfstats.h"
|
#include "m_perfstats.h"
|
||||||
|
#include "w_wad.h"
|
||||||
|
|
||||||
#include "lua_script.h"
|
#include "lua_script.h"
|
||||||
#include "lua_libs.h"
|
#include "lua_libs.h"
|
||||||
@@ -39,14 +40,20 @@ LIST (stringHookNames, STRING_HOOK_LIST);
|
|||||||
|
|
||||||
#undef LIST
|
#undef LIST
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int id;
|
||||||
|
bool important;
|
||||||
|
} hookinfo_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int numHooks;
|
int numHooks;
|
||||||
int *ids;
|
hookinfo_t *ids;
|
||||||
} hook_t;
|
} hook_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int numGeneric;
|
int numGeneric;
|
||||||
int ref;
|
int ref;
|
||||||
|
bool important;
|
||||||
} stringhook_t;
|
} stringhook_t;
|
||||||
|
|
||||||
static hook_t hookIds[HOOK(MAX)];
|
static hook_t hookIds[HOOK(MAX)];
|
||||||
@@ -56,6 +63,8 @@ static hook_t mobjHookIds[NUMMOBJTYPES][MOBJ_HOOK(MAX)];
|
|||||||
// Lua tables are used to lookup string hook ids.
|
// Lua tables are used to lookup string hook ids.
|
||||||
static stringhook_t stringHooks[STRING_HOOK(MAX)];
|
static stringhook_t stringHooks[STRING_HOOK(MAX)];
|
||||||
|
|
||||||
|
bool hook_important = true;
|
||||||
|
|
||||||
// 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;
|
||||||
@@ -109,7 +118,11 @@ static void get_table(lua_State *L)
|
|||||||
|
|
||||||
FUNCINLINE static ATTRINLINE void add_hook_to_table(lua_State *L, int n)
|
FUNCINLINE static ATTRINLINE void add_hook_to_table(lua_State *L, int n)
|
||||||
{
|
{
|
||||||
|
lua_newtable(L);
|
||||||
lua_pushnumber(L, nextid);
|
lua_pushnumber(L, nextid);
|
||||||
|
lua_rawseti(L, -2, 1);
|
||||||
|
lua_pushboolean(L, wadfiles[numwadfiles-1]->important);
|
||||||
|
lua_rawseti(L, -2, 2);
|
||||||
lua_rawseti(L, -2, n);
|
lua_rawseti(L, -2, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,7 +193,8 @@ FUNCINLINE static ATTRINLINE void add_hook(hook_t *map)
|
|||||||
{
|
{
|
||||||
Z_Realloc(map->ids, (map->numHooks + 1) * sizeof *map->ids,
|
Z_Realloc(map->ids, (map->numHooks + 1) * sizeof *map->ids,
|
||||||
PU_STATIC, &map->ids);
|
PU_STATIC, &map->ids);
|
||||||
map->ids[map->numHooks++] = nextid;
|
map->ids[map->numHooks].important = wadfiles[numwadfiles-1]->important;
|
||||||
|
map->ids[map->numHooks++].id = nextid;
|
||||||
}
|
}
|
||||||
|
|
||||||
FUNCINLINE static ATTRINLINE void add_mobj_hook(lua_State *L, int hook_type)
|
FUNCINLINE static ATTRINLINE void add_mobj_hook(lua_State *L, int hook_type)
|
||||||
@@ -287,6 +301,7 @@ struct Hook_State {
|
|||||||
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 */
|
||||||
|
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 */
|
||||||
@@ -416,22 +431,29 @@ FUNCINLINE static ATTRINLINE void init_hook_call
|
|||||||
hook->results_handler = results_handler;
|
hook->results_handler = results_handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
FUNCINLINE static ATTRINLINE void get_hook(Hook_State *hook, const int *ids, int n)
|
FUNCINLINE static ATTRINLINE void get_hook(Hook_State *hook, const hookinfo_t *ids, int n)
|
||||||
{
|
{
|
||||||
hook->id = ids[n];
|
hook->id = ids[n].id;
|
||||||
|
hook->important = ids[n].important;
|
||||||
lua_getref(gL, hookRefs[hook->id]);
|
lua_getref(gL, hookRefs[hook->id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
FUNCINLINE static ATTRINLINE void get_hook_from_table(Hook_State *hook, int n)
|
FUNCINLINE static ATTRINLINE void get_hook_from_table(Hook_State *hook, int n)
|
||||||
{
|
{
|
||||||
lua_rawgeti(gL, -1, n);
|
lua_rawgeti(gL, -1, n);
|
||||||
|
lua_rawgeti(gL, -1, 1);
|
||||||
hook->id = lua_tonumber(gL, -1);
|
hook->id = lua_tonumber(gL, -1);
|
||||||
lua_pop(gL, 1);
|
lua_pop(gL, 1);
|
||||||
|
lua_rawgeti(gL, -2, 2);
|
||||||
|
hook->important = lua_toboolean(gL, -1);
|
||||||
|
lua_pop(gL, 2);
|
||||||
lua_getref(gL, hookRefs[hook->id]);
|
lua_getref(gL, hookRefs[hook->id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int call_single_hook_no_copy(Hook_State *hook)
|
static int call_single_hook_no_copy(Hook_State *hook)
|
||||||
{
|
{
|
||||||
|
hook_important = hook->important;
|
||||||
|
|
||||||
if (lua_pcall(gL, hook->values, hook->results, EINDEX) == 0)
|
if (lua_pcall(gL, hook->values, hook->results, EINDEX) == 0)
|
||||||
{
|
{
|
||||||
if (hook->results > 0)
|
if (hook->results > 0)
|
||||||
|
|||||||
+65
-10
@@ -149,7 +149,8 @@ enum cameraf {
|
|||||||
camera_momx,
|
camera_momx,
|
||||||
camera_momy,
|
camera_momy,
|
||||||
camera_momz,
|
camera_momz,
|
||||||
camera_pnum
|
camera_pnum,
|
||||||
|
camera_freecam,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -169,6 +170,7 @@ static const char *const camera_opt[] = {
|
|||||||
"momy",
|
"momy",
|
||||||
"momz",
|
"momz",
|
||||||
"pnum",
|
"pnum",
|
||||||
|
"freecam",
|
||||||
NULL};
|
NULL};
|
||||||
|
|
||||||
enum hudpatch {
|
enum hudpatch {
|
||||||
@@ -387,10 +389,43 @@ static int camera_get(lua_State *L)
|
|||||||
case camera_pnum:
|
case camera_pnum:
|
||||||
lua_pushinteger(L, camnum);
|
lua_pushinteger(L, camnum);
|
||||||
break;
|
break;
|
||||||
|
case camera_freecam:
|
||||||
|
lua_pushboolean(L, cam->freecam);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lib_getCamera(lua_State *L)
|
||||||
|
{
|
||||||
|
// No cameras on dedicated
|
||||||
|
if (dedicated)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (lua_type(L, 2) == LUA_TNUMBER)
|
||||||
|
{
|
||||||
|
int i = lua_tonumber(L, 2);
|
||||||
|
|
||||||
|
if (i < 0 || i > splitscreen)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
LUA_PushUserdata(L, &camera[i], META_CAMERA);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int lib_lenCamera(lua_State *L)
|
||||||
|
{
|
||||||
|
if (dedicated)
|
||||||
|
lua_pushinteger(L, 0);
|
||||||
|
else
|
||||||
|
lua_pushinteger(L, splitscreen+1); // splitscreen == 0 -> 1 active camera, splitscreen == 1 -> 2 cameras and so on
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// lib_draw
|
// lib_draw
|
||||||
//
|
//
|
||||||
@@ -1252,22 +1287,32 @@ extern int lib_hudadd(lua_State *L);
|
|||||||
|
|
||||||
static int lib_hudsetvotebackground(lua_State *L)
|
static int lib_hudsetvotebackground(lua_State *L)
|
||||||
{
|
{
|
||||||
|
// Reset to default
|
||||||
memset(VoteScreen.luaPrefix, 0, sizeof(VoteScreen.luaPrefix));
|
memset(VoteScreen.luaPrefix, 0, sizeof(VoteScreen.luaPrefix));
|
||||||
|
VoteScreen.timePerAnimFrame = 2;
|
||||||
|
|
||||||
if (lua_isnoneornil(L, 1))
|
if (!lua_isnoneornil(L, 1))
|
||||||
{
|
{
|
||||||
return 0;
|
const char *prefix = luaL_checkstring(L, 1);
|
||||||
|
|
||||||
|
if (strlen(prefix) != 4)
|
||||||
|
{
|
||||||
|
return luaL_argerror(L, 1, "prefix should 4 characters wide");
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(VoteScreen.luaPrefix, prefix, 4);
|
||||||
|
strupr(VoteScreen.luaPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *prefix = luaL_checkstring(L, 1);
|
if (!lua_isnoneornil(L, 2))
|
||||||
|
|
||||||
if (strlen(prefix) != 4)
|
|
||||||
{
|
{
|
||||||
return luaL_argerror(L, 1, "prefix should 4 characters wide");
|
INT32 time_per_frame = luaL_checkinteger(L, 2);
|
||||||
}
|
|
||||||
|
|
||||||
strncpy(VoteScreen.luaPrefix, prefix, 4);
|
if (time_per_frame <= 0)
|
||||||
strupr(VoteScreen.luaPrefix);
|
return luaL_argerror(L, 2, "time per frame should be 1 or more");
|
||||||
|
|
||||||
|
VoteScreen.timePerAnimFrame = time_per_frame;
|
||||||
|
}
|
||||||
|
|
||||||
// Update background if we're already on vote screen
|
// Update background if we're already on vote screen
|
||||||
if (gamestate == GS_VOTING)
|
if (gamestate == GS_VOTING)
|
||||||
@@ -1371,6 +1416,16 @@ int LUA_HudLib(lua_State *L)
|
|||||||
lua_setfield(L, -2, "__index");
|
lua_setfield(L, -2, "__index");
|
||||||
lua_pop(L,1);
|
lua_pop(L,1);
|
||||||
|
|
||||||
|
lua_newuserdata(L, 0);
|
||||||
|
lua_createtable(L, 0, 2);
|
||||||
|
lua_pushcfunction(L, lib_getCamera);
|
||||||
|
lua_setfield(L, -2, "__index");
|
||||||
|
|
||||||
|
lua_pushcfunction(L, lib_lenCamera);
|
||||||
|
lua_setfield(L, -2, "__len");
|
||||||
|
lua_setmetatable(L, -2);
|
||||||
|
lua_setglobal(L, "cameras");
|
||||||
|
|
||||||
camera_fields_ref = Lua_CreateFieldTable(L, camera_opt);
|
camera_fields_ref = Lua_CreateFieldTable(L, camera_opt);
|
||||||
|
|
||||||
luaL_register(L, "hud", lib_hud);
|
luaL_register(L, "hud", lib_hud);
|
||||||
|
|||||||
@@ -136,18 +136,9 @@ void LUA_HUD_DestroyDrawList(huddrawlist_h list)
|
|||||||
{
|
{
|
||||||
if (list == NULL) return;
|
if (list == NULL) return;
|
||||||
|
|
||||||
if (list->items)
|
Z_Free(list->items);
|
||||||
{
|
Z_Free(list->olditems);
|
||||||
Z_Free(list->items);
|
Z_Free(list->strbuf);
|
||||||
}
|
|
||||||
if (list->olditems)
|
|
||||||
{
|
|
||||||
Z_Free(list->olditems);
|
|
||||||
}
|
|
||||||
if (list->strbuf)
|
|
||||||
{
|
|
||||||
Z_Free(list->strbuf);
|
|
||||||
}
|
|
||||||
Z_Free(list);
|
Z_Free(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -25,7 +25,7 @@
|
|||||||
#include "lua_hook.h" // cmd errors
|
#include "lua_hook.h" // cmd errors
|
||||||
|
|
||||||
boolean LUA_CallAction(enum actionnum actionnum, mobj_t *actor);
|
boolean LUA_CallAction(enum actionnum actionnum, mobj_t *actor);
|
||||||
state_t *astate;
|
state_t *astate = NULL;
|
||||||
|
|
||||||
boolean actionsoverridden[NUMACTIONS] = {false};
|
boolean actionsoverridden[NUMACTIONS] = {false};
|
||||||
|
|
||||||
|
|||||||
+3
-9
@@ -251,14 +251,8 @@ int mobj_angle_setter(lua_State *L)
|
|||||||
mobj_t *mo = GETMO();
|
mobj_t *mo = GETMO();
|
||||||
|
|
||||||
mo->angle = luaL_checkangle(L, 2);
|
mo->angle = luaL_checkangle(L, 2);
|
||||||
for (UINT8 i = 0; i <= splitscreen; i++)
|
if (mo->player)
|
||||||
{
|
P_ForceLocalAngle(mo->player, mo->angle);
|
||||||
if (mo->player == P_GetLocalPlayerForNum(i))
|
|
||||||
{
|
|
||||||
localangle[i] = mo->angle;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -481,7 +475,7 @@ int mobj_localskin_setter(lua_State *L)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mo->localskin = 0;
|
mo->localskin = NULL;
|
||||||
mo->skinlocal = false;
|
mo->skinlocal = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loaded 100 of 185 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user