Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
89cecb88f5 | ||
|
|
baf5c8d66b | ||
|
|
72000c4546 | ||
|
|
82b774b2c3 | ||
|
|
3818b9ad1a | ||
|
|
ca8e811bd9 | ||
|
|
97ca034037 | ||
|
|
ac46f7ed00 | ||
|
|
0afed59329 | ||
|
|
ec3a1fee70 | ||
|
|
5e8c0c3806 | ||
|
|
05ea898345 | ||
|
|
0c1fdc0be8 | ||
|
|
0e4c72e6f6 | ||
|
|
29b83903ef | ||
|
|
1cae09fa11 | ||
|
|
4a56819bc3 | ||
|
|
567a48aac3 | ||
|
|
d100401c5f | ||
|
|
6dee9fa561 | ||
|
|
5bd7a09d9f | ||
|
|
47477c2d03 | ||
|
|
cd128a1084 | ||
|
|
34f2afa3d9 | ||
|
|
22f285edec | ||
|
|
592abdef96 | ||
|
|
a27eee8e2f | ||
|
|
904019d24b | ||
|
|
c6ca5a6f0f | ||
|
|
2392f0484c | ||
|
|
986a131a36 | ||
|
|
e9685ef3e8 | ||
|
|
59f194cb9d | ||
|
|
99d5590435 | ||
|
|
22a6be76b5 | ||
|
|
d3d25df3c5 | ||
|
|
2a3f9e9ee6 | ||
|
|
31f01fd5da | ||
|
|
bb9a4a0da0 | ||
|
|
3bac722562 | ||
|
|
3769ab74ac | ||
|
|
c3d6cdd272 | ||
|
|
093602fd6b | ||
|
|
9b2cfe51d6 | ||
|
|
a80d119c58 | ||
|
|
66619f42f9 | ||
|
|
1cdc92a62b | ||
|
|
6b8de308b7 | ||
|
|
310e64d8be | ||
|
|
890677e2b5 | ||
|
|
d2d3afc7f4 | ||
|
|
c26d2faee9 | ||
|
|
1c82c338a5 | ||
|
|
c81cd48552 | ||
|
|
306f7d455e | ||
|
|
dc40befa88 | ||
|
|
2222272d6f | ||
|
|
1849d5aade | ||
|
|
3878c2f72a | ||
|
|
7cf3bceaff | ||
|
|
1e394b0530 | ||
|
|
b09660204a | ||
|
|
7b4592377e | ||
|
|
45ba69a45a | ||
|
|
4d9c345202 | ||
|
|
1105526eb1 | ||
|
|
d963df36f1 | ||
|
|
0437952027 | ||
|
|
d188839d0b | ||
|
|
86ac11f877 | ||
|
|
0f59e0e270 | ||
|
|
cd32270ec0 | ||
|
|
f2a7f9ccaa | ||
|
|
846967cb91 | ||
|
|
6c8862ee4b | ||
|
|
2c2ffe36d7 | ||
|
|
951b880acb | ||
|
|
ecfa973e6b | ||
|
|
749b87b4ca | ||
|
|
7f671e4e30 | ||
|
|
ee0e4836f5 | ||
|
|
a01cd628ab | ||
|
|
4a4e668d21 | ||
|
|
03c579769c | ||
|
|
2e88b6a1dd | ||
|
|
a49ea4defd | ||
|
|
5265b147f5 | ||
|
|
b4a37a2fa4 | ||
|
|
93eb2b336d | ||
|
|
30acdca9d3 | ||
|
|
677b34c174 | ||
|
|
3c776b321d | ||
|
|
1ed9bfc9b4 | ||
|
|
a05413d925 | ||
|
|
fa9637fba4 | ||
|
|
b3be7bcedc | ||
|
|
19c10be76b | ||
|
|
60222f2f00 | ||
|
|
34edd0a2e3 | ||
|
|
46b485df14 | ||
|
|
8d3632caca | ||
|
|
b5ae9ba733 | ||
|
|
7f50a09bcd | ||
|
|
2a823ecd60 | ||
|
|
940327210f | ||
|
|
e25191d7df | ||
|
|
20a08df1e1 | ||
|
|
4cf27d40e9 | ||
|
|
d18c9a257a | ||
|
|
f4d8a903e8 | ||
|
|
8a8cbffd12 | ||
|
|
0adf356325 | ||
|
|
0fef290858 | ||
|
|
65dc5bb1fd | ||
|
|
e18be33c91 | ||
|
|
9ad6751719 | ||
|
|
86ab994408 | ||
|
|
21f0d603c3 | ||
|
|
971513e7d3 | ||
|
|
03929e551f | ||
|
|
db5ae247b6 | ||
|
|
d46beab34e | ||
|
|
2516873ba1 | ||
|
|
c650394c31 | ||
|
|
9a794232d7 | ||
|
|
db635e5c5b | ||
|
|
8a105a9679 | ||
|
|
46b968a351 | ||
|
|
a9836307b2 | ||
|
|
b6515bb0ae | ||
|
|
b8257e9037 | ||
|
|
1fb6c63097 | ||
|
|
e95382075c | ||
|
|
416a2565f9 | ||
|
|
fa75ad4cdd | ||
|
|
cedddaadfc | ||
|
|
43ec517cdd | ||
|
|
495ad5ce06 | ||
|
|
31ce643311 | ||
|
|
2d9776d792 | ||
|
|
7fa3d119e8 | ||
|
|
b5c1f21ac1 | ||
|
|
86c1b2cbef | ||
|
|
ad828b8f4b | ||
|
|
5dda681c8a | ||
|
|
92df8ffe01 | ||
|
|
2ee8dc09d1 | ||
|
|
b8f9392efd | ||
|
|
e65741acaa | ||
|
|
b36ab31a56 | ||
|
|
99f1166eb1 | ||
|
|
a335da3473 | ||
|
|
7ab8bf1bbf | ||
|
|
c312380944 | ||
|
|
b5bb2b42bf | ||
|
|
d074f375ca | ||
|
|
6fd14f0a80 | ||
|
|
d6bbb2c1b3 | ||
|
|
fa66b87965 | ||
|
|
c59d5db03e | ||
|
|
a994d7c050 | ||
|
|
d2f3d5aa4d | ||
|
|
913b8878d8 | ||
|
|
f02b9f953e | ||
|
|
e46d548080 | ||
|
|
3a7108ecfa | ||
|
|
b6edc90553 | ||
|
|
23735121ff | ||
|
|
20950b698f | ||
|
|
44df85d6a4 | ||
|
|
42d53f1f6f | ||
|
|
48f2d0ff83 | ||
|
|
517723f9c1 | ||
|
|
6915077e0f | ||
|
|
406dbf333d | ||
|
|
a730dfd212 | ||
|
|
3058d365f3 | ||
|
|
ccc453e0b0 | ||
|
|
c3d02090e4 | ||
|
|
20cd7621c3 |
No files matched your search
@@ -972,6 +972,14 @@ Public License instead of this License. But first, please read
|
||||
Copyright (C) 1995-2018 Free Software Foundation, Inc.
|
||||
https://www.gnu.org/software/gettext/
|
||||
|
||||
- FluidSynth
|
||||
Copyright (C) 2000-2025 Peter Hanappe and others.
|
||||
https://www.fluidsynth.org/
|
||||
|
||||
- libsndfile
|
||||
Copyright (C) 1999-2016 Erik de Castro Lopo
|
||||
https://libsndfile.github.io/libsndfile/
|
||||
|
||||
- mpg123
|
||||
Copyright (c) 1995-2013 by Michael Hipp and others,
|
||||
free software under the terms of the LGPL v2.1
|
||||
@@ -1699,12 +1707,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
zlib License
|
||||
applies to:
|
||||
- Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
https://www.libsdl.org/hg.php
|
||||
|
||||
- SDL_mixer: An audio mixer library based on the SDL library
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
https://www.libsdl.org/projects/SDL_mixer/
|
||||
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||
https://libsdl.org/
|
||||
|
||||
- zlib
|
||||
Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
# Find FluidSynth
|
||||
# Once done, this will define
|
||||
#
|
||||
# FLUIDSYNTH_FOUND - system has FluidSynth
|
||||
# FLUIDSYNTH_INCLUDE_DIRS - FluidSynth include directories
|
||||
# FLUIDSYNTH_LIBRARIES - link libraries
|
||||
|
||||
include(LibFindMacros)
|
||||
|
||||
libfind_pkg_check_modules(FLUIDSYNTH_PKGCONF FLUIDSYNTH)
|
||||
|
||||
# includes
|
||||
find_path(FLUIDSYNTH_INCLUDE_DIR
|
||||
NAMES fluidsynth.h
|
||||
PATHS
|
||||
${FLUIDSYNTH_PKGCONF_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
# library
|
||||
find_library(FLUIDSYNTH_LIBRARY
|
||||
NAMES fluidsynth
|
||||
PATHS
|
||||
${FLUIDSYNTH_PKGCONF_LIBRARY_DIRS}
|
||||
"/usr/lib"
|
||||
"/usr/local/lib"
|
||||
)
|
||||
|
||||
# set include dir variables
|
||||
set(FLUIDSYNTH_PROCESS_INCLUDES FLUIDSYNTH_INCLUDE_DIR)
|
||||
set(FLUIDSYNTH_PROCESS_LIBS FLUIDSYNTH_LIBRARY)
|
||||
libfind_process(FLUIDSYNTH)
|
||||
|
||||
if(FLUIDSYNTH_FOUND AND NOT TARGET FluidSynth::libfluidsynth)
|
||||
add_library(FluidSynth::libfluidsynth UNKNOWN IMPORTED)
|
||||
set_target_properties(
|
||||
FluidSynth::libfluidsynth
|
||||
PROPERTIES
|
||||
IMPORTED_LOCATION "${FLUIDSYNTH_LIBRARY}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${FLUIDSYNTH_INCLUDE_DIR}"
|
||||
)
|
||||
endif()
|
||||
+15
-20
@@ -1,20 +1,15 @@
|
||||
# SDL Development Libaries
|
||||
|
||||
Download both the VC and MinGW packages and extract them here.
|
||||
|
||||
https://www.libsdl.org/download-2.0.php
|
||||
|
||||
## VC Package
|
||||
|
||||
* include
|
||||
* lib
|
||||
|
||||
## MinGW Package
|
||||
|
||||
* i686-w64-mingw32
|
||||
* x86_64-w64-mingw32
|
||||
|
||||
# SRB2Kart Saturn note:
|
||||
Due to a good amount of issues with newer SDL releases, we decided to ship our own Version of the library.
|
||||
This version is just the 2.28.5 release with a fix backported for non US keyboard layouts that prevented the right ALT GR key from working properly.
|
||||
It can be found under: https://github.com/alufolie91/SDL/tree/backportaltgrfix
|
||||
# SDL Development Libaries
|
||||
|
||||
Download both the VC and MinGW packages and extract them here.
|
||||
|
||||
https://www.libsdl.org/download-2.0.php
|
||||
|
||||
## VC Package
|
||||
|
||||
* include
|
||||
* lib
|
||||
|
||||
## MinGW Package
|
||||
|
||||
* i686-w64-mingw32
|
||||
* x86_64-w64-mingw32
|
||||
Binary file not shown.
@@ -1,65 +1,65 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Get the canonical path of the folder containing this script
|
||||
bindir=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")
|
||||
|
||||
# Calculate the canonical path of the prefix, relative to the folder of this script
|
||||
prefix=$(cd -P -- "$bindir/.." && printf '%s\n' "$(pwd -P)")
|
||||
exec_prefix=${prefix}
|
||||
exec_prefix_set=no
|
||||
libdir=${exec_prefix}/lib
|
||||
|
||||
#usage="\
|
||||
#Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]"
|
||||
usage="\
|
||||
Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--static-libs]"
|
||||
|
||||
if test $# -eq 0; then
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while test $# -gt 0; do
|
||||
case "$1" in
|
||||
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
||||
*) optarg= ;;
|
||||
esac
|
||||
|
||||
case $1 in
|
||||
--prefix=*)
|
||||
prefix=$optarg
|
||||
if test $exec_prefix_set = no ; then
|
||||
exec_prefix=$optarg
|
||||
fi
|
||||
;;
|
||||
--prefix)
|
||||
echo $prefix
|
||||
;;
|
||||
--exec-prefix=*)
|
||||
exec_prefix=$optarg
|
||||
exec_prefix_set=yes
|
||||
;;
|
||||
--exec-prefix)
|
||||
echo $exec_prefix
|
||||
;;
|
||||
--version)
|
||||
echo 2.28.5
|
||||
;;
|
||||
--cflags)
|
||||
echo -I${prefix}/include/SDL2 -Dmain=SDL_main
|
||||
;;
|
||||
--libs)
|
||||
echo -L${exec_prefix}/lib -lmingw32 -lSDL2main -lSDL2 -mwindows
|
||||
;;
|
||||
--static-libs)
|
||||
# --libs|--static-libs)
|
||||
sdl_static_libs=$(echo "-lmingw32 -lSDL2main -lSDL2 -mwindows -Wl,--dynamicbase -Wl,--nxcompat -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid" | sed -E "s#-lSDL2[ $]#$libdir/libSDL2.a #g")
|
||||
echo -L${exec_prefix}/lib $sdl_static_libs
|
||||
;;
|
||||
*)
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
#!/bin/sh
|
||||
|
||||
# Get the canonical path of the folder containing this script
|
||||
bindir=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")
|
||||
|
||||
# Calculate the canonical path of the prefix, relative to the folder of this script
|
||||
prefix=$(cd -P -- "$bindir/.." && printf '%s\n' "$(pwd -P)")
|
||||
exec_prefix=${prefix}
|
||||
exec_prefix_set=no
|
||||
libdir=${exec_prefix}/lib
|
||||
|
||||
#usage="\
|
||||
#Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]"
|
||||
usage="\
|
||||
Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--static-libs]"
|
||||
|
||||
if test $# -eq 0; then
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while test $# -gt 0; do
|
||||
case "$1" in
|
||||
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
||||
*) optarg= ;;
|
||||
esac
|
||||
|
||||
case $1 in
|
||||
--prefix=*)
|
||||
prefix=$optarg
|
||||
if test $exec_prefix_set = no ; then
|
||||
exec_prefix=$optarg
|
||||
fi
|
||||
;;
|
||||
--prefix)
|
||||
echo $prefix
|
||||
;;
|
||||
--exec-prefix=*)
|
||||
exec_prefix=$optarg
|
||||
exec_prefix_set=yes
|
||||
;;
|
||||
--exec-prefix)
|
||||
echo $exec_prefix
|
||||
;;
|
||||
--version)
|
||||
echo 2.28.5
|
||||
;;
|
||||
--cflags)
|
||||
echo -I${prefix}/include/SDL2 -Dmain=SDL_main
|
||||
;;
|
||||
--libs)
|
||||
echo -L${exec_prefix}/lib -lmingw32 -lSDL2main -lSDL2 -mwindows
|
||||
;;
|
||||
--static-libs)
|
||||
# --libs|--static-libs)
|
||||
sdl_static_libs=$(echo "-lmingw32 -lSDL2main -lSDL2 -mwindows -Wl,--dynamicbase -Wl,--nxcompat -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid" | sed -E "s#-lSDL2[ $]#$libdir/libSDL2.a #g")
|
||||
echo -L${exec_prefix}/lib $sdl_static_libs
|
||||
;;
|
||||
*)
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
Binary file not shown.
@@ -1,65 +1,65 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Get the canonical path of the folder containing this script
|
||||
bindir=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")
|
||||
|
||||
# Calculate the canonical path of the prefix, relative to the folder of this script
|
||||
prefix=$(cd -P -- "$bindir/.." && printf '%s\n' "$(pwd -P)")
|
||||
exec_prefix=${prefix}
|
||||
exec_prefix_set=no
|
||||
libdir=${exec_prefix}/lib
|
||||
|
||||
#usage="\
|
||||
#Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]"
|
||||
usage="\
|
||||
Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--static-libs]"
|
||||
|
||||
if test $# -eq 0; then
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while test $# -gt 0; do
|
||||
case "$1" in
|
||||
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
||||
*) optarg= ;;
|
||||
esac
|
||||
|
||||
case $1 in
|
||||
--prefix=*)
|
||||
prefix=$optarg
|
||||
if test $exec_prefix_set = no ; then
|
||||
exec_prefix=$optarg
|
||||
fi
|
||||
;;
|
||||
--prefix)
|
||||
echo $prefix
|
||||
;;
|
||||
--exec-prefix=*)
|
||||
exec_prefix=$optarg
|
||||
exec_prefix_set=yes
|
||||
;;
|
||||
--exec-prefix)
|
||||
echo $exec_prefix
|
||||
;;
|
||||
--version)
|
||||
echo 2.28.5
|
||||
;;
|
||||
--cflags)
|
||||
echo -I${prefix}/include/SDL2 -Dmain=SDL_main
|
||||
;;
|
||||
--libs)
|
||||
echo -L${exec_prefix}/lib -lmingw32 -lSDL2main -lSDL2 -mwindows
|
||||
;;
|
||||
--static-libs)
|
||||
# --libs|--static-libs)
|
||||
sdl_static_libs=$(echo "-lmingw32 -lSDL2main -lSDL2 -mwindows -Wl,--dynamicbase -Wl,--nxcompat -Wl,--high-entropy-va -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid" | sed -E "s#-lSDL2[ $]#$libdir/libSDL2.a #g")
|
||||
echo -L${exec_prefix}/lib $sdl_static_libs
|
||||
;;
|
||||
*)
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
#!/bin/sh
|
||||
|
||||
# Get the canonical path of the folder containing this script
|
||||
bindir=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")
|
||||
|
||||
# Calculate the canonical path of the prefix, relative to the folder of this script
|
||||
prefix=$(cd -P -- "$bindir/.." && printf '%s\n' "$(pwd -P)")
|
||||
exec_prefix=${prefix}
|
||||
exec_prefix_set=no
|
||||
libdir=${exec_prefix}/lib
|
||||
|
||||
#usage="\
|
||||
#Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]"
|
||||
usage="\
|
||||
Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--static-libs]"
|
||||
|
||||
if test $# -eq 0; then
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while test $# -gt 0; do
|
||||
case "$1" in
|
||||
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
||||
*) optarg= ;;
|
||||
esac
|
||||
|
||||
case $1 in
|
||||
--prefix=*)
|
||||
prefix=$optarg
|
||||
if test $exec_prefix_set = no ; then
|
||||
exec_prefix=$optarg
|
||||
fi
|
||||
;;
|
||||
--prefix)
|
||||
echo $prefix
|
||||
;;
|
||||
--exec-prefix=*)
|
||||
exec_prefix=$optarg
|
||||
exec_prefix_set=yes
|
||||
;;
|
||||
--exec-prefix)
|
||||
echo $exec_prefix
|
||||
;;
|
||||
--version)
|
||||
echo 2.28.5
|
||||
;;
|
||||
--cflags)
|
||||
echo -I${prefix}/include/SDL2 -Dmain=SDL_main
|
||||
;;
|
||||
--libs)
|
||||
echo -L${exec_prefix}/lib -lmingw32 -lSDL2main -lSDL2 -mwindows
|
||||
;;
|
||||
--static-libs)
|
||||
# --libs|--static-libs)
|
||||
sdl_static_libs=$(echo "-lmingw32 -lSDL2main -lSDL2 -mwindows -Wl,--dynamicbase -Wl,--nxcompat -Wl,--high-entropy-va -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid" | sed -E "s#-lSDL2[ $]#$libdir/libSDL2.a #g")
|
||||
echo -L${exec_prefix}/lib $sdl_static_libs
|
||||
;;
|
||||
*)
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
Binary file not shown.
Binary file not shown.
@@ -8,6 +8,7 @@ passthru_opts+=\
|
||||
HAVE_MINIUPNPC\
|
||||
HAVE_DISCORDRPC DEVELOP\
|
||||
NOHOLEPUNCH\
|
||||
NOOPENMPT\
|
||||
|
||||
# build with debugging information
|
||||
ifdef DEBUGMODE
|
||||
@@ -91,7 +92,6 @@ endif
|
||||
|
||||
default_packages:=\
|
||||
LIBGME/libgme/LIBGME\
|
||||
OPENMPT/libopenmpt/LIBOPENMPT\
|
||||
ZLIB/zlib\
|
||||
|
||||
$(foreach p,$(default_packages),\
|
||||
|
||||
+13
-9
@@ -29,8 +29,19 @@ ifndef NOHW
|
||||
sources+=sdl/ogl_sdl.c
|
||||
endif
|
||||
|
||||
ifndef NOOPENMPT
|
||||
LIBOPENMPT_PKGCONFIG?=libopenmpt
|
||||
$(eval $(call Use_pkg_config,LIBOPENMPT))
|
||||
opts+=-DHAVE_OPENMPT
|
||||
endif
|
||||
|
||||
NOMIXER=1
|
||||
|
||||
ifdef NOMIXER
|
||||
sources+=sdl/dummy_sound.c
|
||||
#sources+=sdl/dummy_sound.c
|
||||
sources+=sdl/sdl_sound.c
|
||||
SNDFILE_PKGCONFIG?=sndfile
|
||||
$(eval $(call Use_pkg_config,SNDFILE))
|
||||
else
|
||||
opts+=-DHAVE_MIXER
|
||||
sources+=sdl/mixer_sound.c
|
||||
@@ -45,15 +56,8 @@ opts+=-DHAVE_THREADS
|
||||
sources+=sdl/i_threads.c
|
||||
endif
|
||||
|
||||
ifdef SDL_PKGCONFIG
|
||||
SDL_PKGCONFIG?=sdl3
|
||||
$(eval $(call Use_pkg_config,SDL))
|
||||
else
|
||||
SDL_CONFIG?=$(call Prefix,sdl2-config)
|
||||
SDL_CFLAGS?=$(shell $(SDL_CONFIG) --cflags)
|
||||
SDL_LDFLAGS?=$(shell $(SDL_CONFIG) \
|
||||
$(if $(STATIC),--static-libs,--libs))
|
||||
$(eval $(call Propogate_flags,SDL))
|
||||
endif
|
||||
|
||||
ifdef MINGW
|
||||
ifndef NOSDLMAIN
|
||||
|
||||
@@ -79,14 +79,14 @@ $(eval $(call _set,LIBOPENMPT))
|
||||
lib:=../libs/SDL2_mixer/$(mingw)
|
||||
|
||||
ifdef SDL
|
||||
mixer_opts:=-I$(lib)/include/SDL2
|
||||
mixer_opts:=-I$(lib)/include/SDL3
|
||||
mixer_libs:=-L$(lib)/lib
|
||||
|
||||
lib:=../libs/SDL2/$(mingw)
|
||||
SDL_opts:=-I$(lib)/include/SDL2\
|
||||
SDL_opts:=-I$(lib)/include/SDL3\
|
||||
$(mixer_opts) -Dmain=SDL_main
|
||||
SDL_libs:=-L$(lib)/lib $(mixer_libs)\
|
||||
-lmingw32 -lSDL2main -lSDL2 -mwindows
|
||||
-lmingw32 -lSDL3main -lSDL3 -mwindows
|
||||
$(eval $(call _set,SDL))
|
||||
endif
|
||||
|
||||
|
||||
+2
-12
@@ -50,25 +50,15 @@ const char *VID_GetModeName(INT32 modenum)
|
||||
return "A320x240";
|
||||
}
|
||||
|
||||
void I_UpdateNoBlit(void){}
|
||||
|
||||
void I_FinishUpdate(void) {
|
||||
void I_FinishUpdate(void)
|
||||
{
|
||||
LOGD("FRAME!");
|
||||
(*jni_env)->CallVoidMethod(jni_env, androidVideo, videoFrameCB);
|
||||
}
|
||||
|
||||
void I_UpdateNoVsync(void) {}
|
||||
|
||||
void I_WaitVBL(INT32 count)
|
||||
{
|
||||
(void)count;
|
||||
}
|
||||
|
||||
void I_ReadScreen(UINT8 * restrict scr, INT32 scale)
|
||||
{
|
||||
(void)scr;
|
||||
}
|
||||
|
||||
void I_BeginRead(void){}
|
||||
|
||||
void I_EndRead(void){}
|
||||
+5
-3
@@ -57,7 +57,6 @@ static void CV_EnforceExecVersion(void);
|
||||
static boolean CV_FilterVarByVersion(consvar_t *v, const char *valstr);
|
||||
|
||||
static boolean CV_Command(void);
|
||||
consvar_t *CV_FindVar(const char *name);
|
||||
static const char *CV_StringValue(const char *var_name);
|
||||
static consvar_t *consvar_vars; // list of registered console variables
|
||||
|
||||
@@ -238,10 +237,13 @@ void COM_ImmedExecute(const char *ptext)
|
||||
char line[1024] = "";
|
||||
INT32 quotes;
|
||||
|
||||
while (i < strlen(ptext))
|
||||
const size_t txtlength = strlen(ptext);
|
||||
|
||||
while (i < txtlength)
|
||||
{
|
||||
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
|
||||
return;
|
||||
|
||||
+27
-2
@@ -33,6 +33,8 @@
|
||||
#include "d_main.h"
|
||||
#include "m_menu.h"
|
||||
#include "m_textinput.h"
|
||||
#include "m_emotes.h"
|
||||
#include "i_time.h"
|
||||
#include "filesrch.h"
|
||||
|
||||
#ifdef HWRENDER
|
||||
@@ -1453,7 +1455,18 @@ static void CON_DrawHudlines(void)
|
||||
}
|
||||
if (c >= con_width)
|
||||
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;
|
||||
else
|
||||
{
|
||||
@@ -1485,7 +1498,7 @@ static void CON_DrawConsole(void)
|
||||
// draw console background
|
||||
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
|
||||
V_DrawFixedPatch(0, 0, FRACUNIT/2, 0, con_backpic, NULL);
|
||||
@@ -1527,8 +1540,20 @@ static void CON_DrawConsole(void)
|
||||
p++;
|
||||
c++;
|
||||
}
|
||||
|
||||
if (c >= con_width)
|
||||
break;
|
||||
|
||||
int emotelen;
|
||||
emote_t *emote;
|
||||
|
||||
if ((emote = M_VerifyEmote((const char *)p, &emotelen)))
|
||||
{
|
||||
M_DrawScaledEmote(x<<FRACBITS, (y+2*con_scalefactor)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART|V_NOSCALEPATCH);
|
||||
p += emotelen-1;
|
||||
c += emotelen-1;
|
||||
continue;
|
||||
}
|
||||
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
||||
}
|
||||
}
|
||||
|
||||
+49
-22
@@ -53,6 +53,8 @@
|
||||
#include "m_perfstats.h"
|
||||
#include "d_main.h"
|
||||
#include "r_fps.h"
|
||||
#include "filesrch.h" // refreshdirmenu
|
||||
|
||||
|
||||
// cl loading screen
|
||||
#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.
|
||||
|
||||
#define GENTLEMANSMOOTHING (TICRATE)
|
||||
static tic_t reference_lag;
|
||||
static tic_t reference_lag = 0;
|
||||
static UINT8 spike_time;
|
||||
tic_t lowest_lag = 0;
|
||||
tic_t simulated_lag = 0;
|
||||
@@ -505,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 the server, you need to remember them until every client has been aknowledged,
|
||||
// because if you need to resend a PT_SERVERTICS packet, you need to put the commands in it
|
||||
// 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 will need to put the commands in it
|
||||
if (client)
|
||||
{
|
||||
D_FreeTextcmd(gametic);
|
||||
}
|
||||
}
|
||||
|
||||
static void D_Clearticcmd(tic_t tic)
|
||||
@@ -1367,10 +1371,19 @@ static inline void CL_DrawConnectionStatus(void)
|
||||
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_DrawFill(8, 72, BASEVIDWIDTH - 16, 112, 239);
|
||||
|
||||
@@ -1390,10 +1403,16 @@ static inline void CL_DrawConnectionStatus(void)
|
||||
if (playerinfo[i].node < 255)
|
||||
{
|
||||
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].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 == 2) { statuscolor = 232; } // ctf blue team
|
||||
if (playerinfo[i].team == 255) { statuscolor = 16; } // spectator or non-team
|
||||
@@ -1438,12 +1457,14 @@ static inline void CL_DrawConnectionStatus(void)
|
||||
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, dldlength, 8, 160);
|
||||
|
||||
memset(tempname, 0, sizeof(tempname));
|
||||
|
||||
// offset filename to just the name only part
|
||||
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
|
||||
// which should add up to 27 if our math(s) is correct
|
||||
snprintf(tempname, sizeof(tempname), "%.14s...%.10s", filename, filename+endhalfpos);
|
||||
@@ -1736,16 +1757,19 @@ static void SV_SendPlayerInfo(INT32 node)
|
||||
|
||||
// Extra data
|
||||
// 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)
|
||||
netbuffer->u.playerinfo[i].data |= 0x20;
|
||||
// well why not, we only got like 100 of these?
|
||||
netbuffer->u.playerinfo[i].data = players[i].skincolor;
|
||||
|
||||
if (players[i].gotflag)
|
||||
netbuffer->u.playerinfo[i].data |= 0x40;
|
||||
//if (players[i].pflags & PF_TAGIT)
|
||||
//netbuffer->u.playerinfo[i].data |= 0x20;
|
||||
|
||||
if (players[i].powers[pw_super])
|
||||
netbuffer->u.playerinfo[i].data |= 0x80;
|
||||
//if (players[i].gotflag)
|
||||
//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);
|
||||
@@ -1928,7 +1952,7 @@ static boolean SV_ResendingSavegameToAnyone(void)
|
||||
static void SV_SendSaveGame(INT32 node, boolean resending)
|
||||
{
|
||||
size_t length, compressedlen;
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
UINT8 *compressedsave;
|
||||
UINT8 *buffertosend;
|
||||
|
||||
@@ -1998,7 +2022,7 @@ static consvar_t cv_dumpconsistency = {"dumpconsistency", "Off", CV_NETVAR, CV_O
|
||||
static void SV_SavedGame(void)
|
||||
{
|
||||
size_t length;
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
char tmpsave[264];
|
||||
|
||||
if (!cv_dumpconsistency.value)
|
||||
@@ -2038,7 +2062,7 @@ static void SV_SavedGame(void)
|
||||
|
||||
static void CL_LoadReceivedSavegame(boolean reloading)
|
||||
{
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
size_t length, decompressedlen;
|
||||
char tmpsave[264];
|
||||
|
||||
@@ -2130,7 +2154,7 @@ static void CL_ReloadReceivedSavegame(void)
|
||||
// we dont have P_ForceLocalAngle so were setting it manually here
|
||||
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 << 16));
|
||||
}
|
||||
|
||||
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||
@@ -4503,6 +4527,8 @@ static void Got_AddPlayer(const UINT8 **p, INT32 playernum)
|
||||
DEBFILE("spawning me\n");
|
||||
}
|
||||
|
||||
P_ForceLocalAngle(&players[newplayernum], (angle_t)(players[newplayernum].cmd.angleturn << 16));
|
||||
|
||||
D_SendPlayerConfig();
|
||||
addedtogame = true;
|
||||
}
|
||||
@@ -7175,6 +7201,7 @@ void NetUpdate(void)
|
||||
I_lock_mutex(&m_menu_mutex);
|
||||
#endif
|
||||
M_Ticker();
|
||||
refreshdirmenu = 0;
|
||||
#ifdef HAVE_THREADS
|
||||
I_unlock_mutex(m_menu_mutex);
|
||||
#endif
|
||||
@@ -7221,7 +7248,7 @@ void CL_ClearRewinds(void)
|
||||
|
||||
rewind_t *CL_SaveRewindPoint(size_t demopos)
|
||||
{
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
rewind_t *rewind;
|
||||
|
||||
if (rewindhead && rewindhead->leveltime + REWIND_POINT_INTERVAL > leveltime)
|
||||
@@ -7244,7 +7271,7 @@ rewind_t *CL_SaveRewindPoint(size_t demopos)
|
||||
|
||||
rewind_t *CL_RewindToTime(tic_t time)
|
||||
{
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
rewind_t *rewind;
|
||||
|
||||
while (rewindhead && rewindhead->leveltime > time)
|
||||
|
||||
+11
-47
@@ -46,6 +46,7 @@
|
||||
#include "i_time.h"
|
||||
#include "i_threads.h"
|
||||
#include "i_video.h"
|
||||
#include "hu_stuff.h"
|
||||
#include "m_argv.h"
|
||||
#include "m_menu.h"
|
||||
#include "m_misc.h"
|
||||
@@ -69,7 +70,7 @@
|
||||
#include "fastcmp.h"
|
||||
#include "r_fps.h" // Frame interpolation/uncapped
|
||||
#include "keys.h"
|
||||
#include "filesrch.h" // refreshdirmenu, pathisdirectory
|
||||
#include "filesrch.h" // pathisdirectory
|
||||
#include "d_protocol.h"
|
||||
#include "m_perfstats.h"
|
||||
#include "k_kart.h"
|
||||
@@ -166,38 +167,6 @@ UINT8 ctrldown = 0; // 0x1 left, 0x2 right
|
||||
UINT8 altdown = 0; // 0x1 left, 0x2 right
|
||||
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
|
||||
// Send all the events of the given timestamp down the responder chain
|
||||
@@ -359,13 +328,12 @@ static void D_Renderview(void)
|
||||
if (splitscreen == 2)
|
||||
{
|
||||
// V_DrawPatchFill, but for the fourth screen only
|
||||
patch_t *pat = W_CachePatchName("SRB2BACK", PU_PATCH);
|
||||
INT32 x, y, pw = SHORT(pat->width) * vid.dup, ph = SHORT(pat->height) * vid.dup;
|
||||
INT32 x, y, pw = SHORT(srb2back->width) * vid.dup, ph = SHORT(srb2back->height) * vid.dup;
|
||||
|
||||
for (x = vid.width>>1; x < vid.width; x += pw)
|
||||
{
|
||||
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 +375,6 @@ static boolean D_Display(void)
|
||||
R_ExecuteSetViewSize();
|
||||
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
|
||||
@@ -708,7 +672,7 @@ void D_SRB2Loop(void)
|
||||
COM_ImmedExecute("cls;version");
|
||||
|
||||
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
|
||||
|
||||
precision = I_GetPrecisePrecision();
|
||||
@@ -761,8 +725,6 @@ void D_SRB2Loop(void)
|
||||
|
||||
renderisnewtic = (realtics > 0 || singletics);
|
||||
|
||||
refreshdirmenu = 0; // not sure where to put this, here as good as any?
|
||||
|
||||
if (renderisnewtic)
|
||||
{
|
||||
// don't skip more than 10 frames at a time
|
||||
@@ -799,7 +761,7 @@ void D_SRB2Loop(void)
|
||||
|
||||
if (!dedicated)
|
||||
{
|
||||
D_DeviceLEDTick();
|
||||
G_DeviceLEDTick();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -977,7 +939,7 @@ void D_ClearState(void)
|
||||
M_ClearMenus(true);
|
||||
|
||||
// map palettes affect this
|
||||
D_ResetDeviceLED();
|
||||
G_ResetDeviceLED();
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1218,8 +1180,10 @@ static void IdentifyVersion(void)
|
||||
const char *srb2waddir = NULL;
|
||||
|
||||
#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
|
||||
srb2waddir = I_LocateWad();
|
||||
allocwaddir = I_LocateWad();
|
||||
srb2waddir = allocwaddir;
|
||||
#endif
|
||||
|
||||
char tempsrb2path[256] = ".";
|
||||
@@ -1300,7 +1264,7 @@ static void IdentifyVersion(void)
|
||||
if (AddIWAD("extra3.kart", srb2waddir))
|
||||
found_extra3_kart = true;
|
||||
|
||||
#if !defined (HAVE_SDL) || defined (HAVE_MIXER)
|
||||
#if defined (HAVE_SDL)
|
||||
#define MUSICTEST(str) \
|
||||
musicpath = va(pandf, srb2waddir, str);\
|
||||
handle = W_OpenWadFile(&musicpath, false); \
|
||||
|
||||
@@ -80,8 +80,6 @@ void D_ProcessEvents(void);
|
||||
|
||||
const char *D_Home(void);
|
||||
|
||||
void D_ResetDeviceLED(void);
|
||||
|
||||
//
|
||||
// BASE LEVEL
|
||||
//
|
||||
|
||||
+10
-27
@@ -274,7 +274,7 @@ consvar_t cv_showlocalskinmenus = {"showlocalskinmenus", "Yes", CV_SAVE, CV_YesN
|
||||
|
||||
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);
|
||||
consvar_t cv_usemouse = {"use_mouse", "Off", CV_SAVE|CV_CALL, usemouse_cons_t, UseMouse_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
@@ -531,7 +531,7 @@ boolean forceresetplayers = false;
|
||||
boolean deferencoremode = false;
|
||||
UINT8 splitscreen = 0;
|
||||
boolean circuitmap = true; // SRB2kart
|
||||
INT32 adminplayers[MAXPLAYERS];
|
||||
INT32 adminplayers[MAXPLAYERS] = {};
|
||||
|
||||
/// \warning Keep this up-to-date if you add/remove/rename net text commands
|
||||
const char *netxcmdnames[MAXNETXCMD - 1] =
|
||||
@@ -997,6 +997,7 @@ void D_RegisterClientCommands(void)
|
||||
CV_RegisterVar(&cv_usejoystick[i]);
|
||||
CV_RegisterVar(&cv_joyscale[i]);
|
||||
CV_RegisterVar(&cv_rumble[i]);
|
||||
CV_RegisterVar(&cv_rumblestrength[i]);
|
||||
CV_RegisterVar(&cv_gamepadled[i]);
|
||||
}
|
||||
|
||||
@@ -2588,8 +2589,7 @@ void D_PickVote(void)
|
||||
SendNetXCmd(XD_PICKVOTE, &buf, 2);
|
||||
}
|
||||
|
||||
static char *
|
||||
ConcatCommandArgv (int start, int end)
|
||||
static char *ConcatCommandArgv(int start, int end)
|
||||
{
|
||||
char *final;
|
||||
|
||||
@@ -2662,8 +2662,8 @@ static void Command_Map_f(void)
|
||||
|
||||
INT32 newmapnum;
|
||||
|
||||
char * mapname;
|
||||
char *realmapname = NULL;
|
||||
CLEANUP(Z_Pfree) char * mapname = NULL;
|
||||
CLEANUP(Z_Pfree) char *realmapname = NULL;
|
||||
|
||||
INT32 newgametype = gametype;
|
||||
boolean newencoremode = cv_kartencore.value;
|
||||
@@ -2732,7 +2732,6 @@ static void Command_Map_f(void)
|
||||
if (newmapnum == 0)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("Could not find any map described as '%s'.\n"), mapname);
|
||||
Z_Free(mapname);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2764,8 +2763,6 @@ static void Command_Map_f(void)
|
||||
" 0 and %d inclusive. ...Or just use the name. :v\n",
|
||||
d,
|
||||
NUMGAMETYPES-1);
|
||||
Z_Free(realmapname);
|
||||
Z_Free(mapname);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -2774,8 +2771,6 @@ static void Command_Map_f(void)
|
||||
CONS_Alert(CONS_ERROR,
|
||||
"'%s' is not a gametype.\n",
|
||||
gametypename);
|
||||
Z_Free(realmapname);
|
||||
Z_Free(mapname);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -2793,8 +2788,6 @@ static void Command_Map_f(void)
|
||||
if (!mapheaderinfo[newmapnum-1])
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Invalid mapheaderinfo for Course %s (%s)\n"), realmapname, G_BuildMapName(newmapnum));
|
||||
Z_Free(realmapname);
|
||||
Z_Free(mapname);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2802,8 +2795,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),
|
||||
(multiplayer ? gametype_cons_t[newgametype].strvalue : "Single Player"));
|
||||
Z_Free(realmapname);
|
||||
Z_Free(mapname);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -2815,8 +2806,6 @@ static void Command_Map_f(void)
|
||||
if (!dedicated && M_MapLocked(newmapnum))
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -2842,8 +2831,6 @@ static void Command_Map_f(void)
|
||||
fromlevelselect = false;
|
||||
|
||||
D_MapChange(newmapnum, newgametype, newencoremode, newresetplayers, 0, false, false);
|
||||
|
||||
Z_Free(realmapname);
|
||||
}
|
||||
|
||||
/** Receives a map command and changes the map.
|
||||
@@ -3911,6 +3898,7 @@ static void Got_Teamchange(const UINT8 **cp, INT32 playernum)
|
||||
if (G_BattleGametype()) // SRB2kart
|
||||
{
|
||||
players[playernum].marescore = 0;
|
||||
|
||||
if (K_IsPlayerWanted(&players[playernum]))
|
||||
K_CalculateBattleWanted();
|
||||
}
|
||||
@@ -4508,7 +4496,7 @@ static void Command_Addskins(void)
|
||||
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 option_display;
|
||||
@@ -4519,7 +4507,7 @@ static void Command_GLocalSkin (void)
|
||||
option_display = COM_CheckPartialParm("-d");
|
||||
option_all = COM_CheckPartialParm("-a");
|
||||
|
||||
char* fuck; // local skin name
|
||||
CLEANUP(Z_Pfree) char* fuck = NULL; // local skin name
|
||||
|
||||
if (!(first_option = COM_FirstOption()))
|
||||
first_option = COM_Argc();
|
||||
@@ -4560,7 +4548,6 @@ static void Command_GLocalSkin (void)
|
||||
|
||||
CONS_Printf("Successfully applied localskin to displayed player.\n");
|
||||
|
||||
Z_Free(fuck);
|
||||
return;
|
||||
}
|
||||
else if (option_all) // -all
|
||||
@@ -4575,7 +4562,6 @@ static void Command_GLocalSkin (void)
|
||||
}
|
||||
CONS_Printf("Successfully applied localskin to all players.\n");
|
||||
|
||||
Z_Free(fuck);
|
||||
return;
|
||||
}
|
||||
else // -player or no other arguments
|
||||
@@ -4592,7 +4578,6 @@ static void Command_GLocalSkin (void)
|
||||
}
|
||||
CONS_Printf("Successfully applied localskin to specified player.\n");
|
||||
|
||||
Z_Free(fuck);
|
||||
return;
|
||||
}
|
||||
else
|
||||
@@ -4600,13 +4585,11 @@ static void Command_GLocalSkin (void)
|
||||
SetLocalPlayerSkin(consoleplayer, fuck, &cv_localskin);
|
||||
CONS_Printf("Successfully applied localskin.\n");
|
||||
|
||||
Z_Free(fuck);
|
||||
return;
|
||||
}
|
||||
|
||||
CONS_Printf("Could not apply localskin.\n");
|
||||
|
||||
Z_Free(fuck);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -5689,7 +5672,7 @@ static void Command_Togglemodified_f(void)
|
||||
|
||||
static void Command_Archivetest_f(void)
|
||||
{
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
UINT32 i, wrote;
|
||||
thinker_t *th;
|
||||
if (gamestate != GS_LEVEL)
|
||||
|
||||
+6
-6
@@ -64,7 +64,6 @@
|
||||
static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid);
|
||||
|
||||
#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)
|
||||
static int curlprogress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);
|
||||
#else
|
||||
@@ -1080,12 +1079,14 @@ void CloseNetFile(void)
|
||||
|
||||
// Receiving a file?
|
||||
for (i = 0; i < MAX_WADFILES; i++)
|
||||
{
|
||||
if (fileneeded[i].status == FS_DOWNLOADING && fileneeded[i].file)
|
||||
{
|
||||
fclose(fileneeded[i].file);
|
||||
// File is not complete delete it
|
||||
remove(fileneeded[i].filename);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove PT_FILEFRAGMENT from acknowledge list
|
||||
Net_AbortPacketType(PT_FILEFRAGMENT);
|
||||
@@ -1099,17 +1100,16 @@ void nameonly(char *s)
|
||||
void *ns;
|
||||
|
||||
for (j = strlen(s); j != (size_t)-1; j--)
|
||||
{
|
||||
if ((s[j] == '\\') || (s[j] == ':') || (s[j] == '/'))
|
||||
{
|
||||
ns = &(s[j+1]);
|
||||
len = strlen(ns);
|
||||
#if 0
|
||||
memcpy(s, ns, len+1);
|
||||
#else
|
||||
memmove(s, ns, len+1);
|
||||
#endif
|
||||
memmove(s, ns, len+1);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the length in characters of the last element of a path.
|
||||
|
||||
+58
-126
@@ -127,16 +127,32 @@ typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T);
|
||||
|
||||
#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)
|
||||
#define DEFAULTWADLOCATION1 "/usr/local/share/games/SRB2Kart"
|
||||
#define DEFAULTWADLOCATION2 "/usr/local/games/SRB2Kart"
|
||||
#define DEFAULTWADLOCATION3 "/usr/share/games/SRB2Kart"
|
||||
#define DEFAULTWADLOCATION4 "/usr/games/SRB2Kart"
|
||||
#define DEFAULTSEARCHPATH1 "/usr/local/games"
|
||||
#define DEFAULTSEARCHPATH2 "/usr/games"
|
||||
#define DEFAULTSEARCHPATH3 "/usr/local"
|
||||
"/usr/local/share/games/SRB2Kart",
|
||||
"/usr/local/games/SRB2Kart",
|
||||
"/usr/share/games/SRB2Kart",
|
||||
"/usr/games/SRB2Kart",
|
||||
#elif defined (_WIN32)
|
||||
"c:\\games\\srb2kart",
|
||||
"\\games\\srb2kart",
|
||||
#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
|
||||
*/
|
||||
@@ -1423,20 +1439,6 @@ death:
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void I_WaitVBL(INT32 count)
|
||||
{
|
||||
count = 1;
|
||||
I_Sleep(count);
|
||||
}
|
||||
|
||||
void I_BeginRead(void)
|
||||
{
|
||||
}
|
||||
|
||||
void I_EndRead(void)
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
// I_Error
|
||||
//
|
||||
@@ -1827,16 +1829,23 @@ static const char *searchWad(const char *searchDir)
|
||||
return tempsw;
|
||||
}
|
||||
|
||||
strcpy(tempsw, WADKEYWORD2);
|
||||
fstemp = filesearch(tempsw, searchDir, NULL, true, 20);
|
||||
if (fstemp == FS_FOUND)
|
||||
{
|
||||
pathonly(tempsw);
|
||||
return tempsw;
|
||||
}
|
||||
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
|
||||
|
||||
\return path to srb2.srb if any
|
||||
@@ -1845,6 +1854,7 @@ static const char *locateWad(void)
|
||||
{
|
||||
const char *envstr;
|
||||
const char *WadPath;
|
||||
int i;
|
||||
|
||||
I_OutputMsg("SRB2WADDIR");
|
||||
// does SRB2WADDIR exist?
|
||||
@@ -1852,132 +1862,51 @@ static const char *locateWad(void)
|
||||
return envstr;
|
||||
|
||||
#ifndef NOCWD
|
||||
I_OutputMsg(",.");
|
||||
// examine current dir
|
||||
strcpy(returnWadPath, ".");
|
||||
I_OutputMsg(",%s", returnWadPath);
|
||||
if (isWadPathOk(returnWadPath))
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef NOHOME
|
||||
#ifdef DEFAULTDIR
|
||||
I_OutputMsg(",HOME/" DEFAULTDIR);
|
||||
// examine user jart directory
|
||||
if ((envstr = I_GetEnv("HOME")) != NULL)
|
||||
{
|
||||
sprintf(returnWadPath, "%s" PATHSEP DEFAULTDIR, envstr);
|
||||
if (isWadPathOk(returnWadPath))
|
||||
return returnWadPath;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CMAKECONFIG
|
||||
#ifndef NDEBUG
|
||||
I_OutputMsg(","CMAKE_ASSETS_DIR);
|
||||
strcpy(returnWadPath, CMAKE_ASSETS_DIR);
|
||||
if (isWadPathOk(returnWadPath))
|
||||
{
|
||||
return returnWadPath;
|
||||
CHECKWADPATH(returnWadPath);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
OSX_GetResourcesPath(returnWadPath);
|
||||
I_OutputMsg(",%s", returnWadPath);
|
||||
if (isWadPathOk(returnWadPath))
|
||||
{
|
||||
return returnWadPath;
|
||||
}
|
||||
CHECKWADPATH(returnWadPath);
|
||||
#endif
|
||||
|
||||
// examine default dirs
|
||||
#ifdef DEFAULTWADLOCATION1
|
||||
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)
|
||||
for (i = 0; wadDefaultPaths[i]; i++)
|
||||
{
|
||||
char *tmp = malloc(strlen(envstr) + sizeof(PATHSEP) + sizeof(DEFAULTDIR));
|
||||
strcpy(tmp, envstr);
|
||||
strcat(tmp, PATHSEP);
|
||||
strcat(tmp, DEFAULTDIR);
|
||||
WadPath = searchWad(tmp);
|
||||
free(tmp);
|
||||
if (WadPath)
|
||||
return WadPath;
|
||||
strcpy(returnWadPath, wadDefaultPaths[i]);
|
||||
CHECKWADPATH(returnWadPath);
|
||||
}
|
||||
#endif
|
||||
#ifdef DEFAULTSEARCHPATH1
|
||||
// find in /usr/local
|
||||
I_OutputMsg(", in:"DEFAULTSEARCHPATH1);
|
||||
WadPath = searchWad(DEFAULTSEARCHPATH1);
|
||||
if (WadPath)
|
||||
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
|
||||
|
||||
// search paths
|
||||
for (i = 0; wadSearchPaths[i]; i++)
|
||||
{
|
||||
I_OutputMsg(", in:%s", wadSearchPaths[i]);
|
||||
SEARCHWAD(wadSearchPaths[i]);
|
||||
}
|
||||
|
||||
// if nothing was found
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *I_LocateWad(void)
|
||||
{
|
||||
const char *waddir;
|
||||
const char *waddir = NULL;
|
||||
|
||||
I_OutputMsg("Looking for WADs in: ");
|
||||
waddir = locateWad();
|
||||
@@ -1987,12 +1916,15 @@ const char *I_LocateWad(void)
|
||||
{
|
||||
// change to the directory where we found srb2.srb
|
||||
#if defined (_WIN32)
|
||||
waddir = _fullpath(NULL, waddir, MAX_PATH);
|
||||
SetCurrentDirectoryA(waddir);
|
||||
#else
|
||||
waddir = realpath(waddir, NULL);
|
||||
if (waddir == NULL || chdir(waddir) == -1)
|
||||
I_OutputMsg("Couldn't change working directory\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
return waddir;
|
||||
}
|
||||
|
||||
|
||||
@@ -65,13 +65,6 @@ void I_OsPolling(void)
|
||||
I_GetConsoleEvents();
|
||||
}
|
||||
|
||||
//
|
||||
// I_UpdateNoBlit
|
||||
//
|
||||
void I_UpdateNoBlit(void)
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
// I_FinishUpdate
|
||||
//
|
||||
@@ -122,6 +115,10 @@ INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
||||
return -1;
|
||||
}
|
||||
|
||||
void VID_RefreshModeList(void)
|
||||
{
|
||||
}
|
||||
|
||||
void VID_PrepareModeList(void)
|
||||
{
|
||||
}
|
||||
|
||||
+10
-5
@@ -20,6 +20,7 @@
|
||||
// but I can't stand that gibberish. D:
|
||||
#define SOUND_DUMMY 0
|
||||
#define SOUND_MIXER 1
|
||||
#define SOUND_SDL 2
|
||||
|
||||
#ifndef SOUND
|
||||
#ifdef HAVE_SDL
|
||||
@@ -27,7 +28,7 @@
|
||||
#ifdef HAVE_MIXER
|
||||
#define SOUND SOUND_MIXER
|
||||
#else
|
||||
#define SOUND SOUND_DUMMY
|
||||
#define SOUND SOUND_SDL
|
||||
#endif
|
||||
#else
|
||||
#define SOUND SOUND_DUMMY
|
||||
@@ -107,10 +108,10 @@ extern char logfilename[1024];
|
||||
#else
|
||||
#define VERSION 1 // Game version
|
||||
#define SUBVERSION 6 // more precise version number
|
||||
#define VERSIONSTRING "Saturn v9.1"
|
||||
#define VERSIONSTRINGW L"Saturn v9.1"
|
||||
#define VERSIONSTRING "Saturn v9.x - Testing"
|
||||
#define VERSIONSTRINGW L"Saturn v9.x - Testing "
|
||||
|
||||
//#define SATURN_TESTING // comment out for saturn release builds!
|
||||
#define SATURN_TESTING // comment out for saturn release builds!
|
||||
|
||||
// Hey! If you change this, add 1 to the MODVERSION below! Otherwise we can't force updates!
|
||||
// And change CMakeLists.txt (not src/, but in root), for CMake users!
|
||||
@@ -477,7 +478,7 @@ extern INT32 cv_debug;
|
||||
// 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
|
||||
extern UINT8 shiftdown, ctrldown, altdown;
|
||||
@@ -526,6 +527,10 @@ UINT32 quickncasehash (const char *p, size_t n)
|
||||
#define M_PIl 3.1415926535897932384626433832795029L
|
||||
#endif
|
||||
|
||||
#ifndef M_PIf
|
||||
#define M_PIf 3.14159265f
|
||||
#endif
|
||||
|
||||
// Floating point comparison epsilons from float.h
|
||||
#ifndef FLT_EPSILON
|
||||
#define FLT_EPSILON 1.1920928955078125e-7f
|
||||
|
||||
+5
-3
@@ -68,11 +68,13 @@ extern "C" {
|
||||
#define strnicmp(x,y,n) strncasecmp(x,y,n)
|
||||
#endif
|
||||
|
||||
#ifndef __cplusplus
|
||||
char *strcasestr(const char *in, const char *what);
|
||||
#define stristr strcasestr
|
||||
char *nongnu_strcasestr(const char *in, const char *what);
|
||||
#ifndef _GNU_SOURCE
|
||||
#define strcasestr nongnu_strcasestr
|
||||
#endif
|
||||
|
||||
#define stristr strcasestr
|
||||
|
||||
#if defined (macintosh) //|| defined (__APPLE__) //skip all boolean/Boolean crap
|
||||
#define true 1
|
||||
#define false 0
|
||||
|
||||
+31
-37
@@ -166,8 +166,8 @@ static void F_SkyScroll(INT32 scrollspeed)
|
||||
patch_t *pat, *pat2;
|
||||
INT32 anim2 = 0;
|
||||
|
||||
pat = W_CachePatchName("TITLEBG1", PU_PATCH_LOWPRIORITY);
|
||||
pat2 = W_CachePatchName("TITLEBG2", PU_PATCH_LOWPRIORITY);
|
||||
pat = W_CachePatchName("TITLEBG1", PU_PATCH);
|
||||
pat2 = W_CachePatchName("TITLEBG2", PU_PATCH);
|
||||
|
||||
w = (vid.scaledwidth << FRACBITS);
|
||||
|
||||
@@ -215,9 +215,6 @@ static tic_t introscenetime[NUMINTROSCENES] =
|
||||
4*TICRATE, // KART KR(eW
|
||||
};
|
||||
|
||||
// custom intros
|
||||
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer);
|
||||
|
||||
void F_StartIntro(void)
|
||||
{
|
||||
if (gamestate)
|
||||
@@ -257,26 +254,21 @@ void F_StartIntro(void)
|
||||
//
|
||||
void F_IntroDrawer(void)
|
||||
{
|
||||
boolean highres = false;
|
||||
INT32 cx = 8, cy = 128;
|
||||
patch_t *background = NULL;
|
||||
INT32 bgxoffs = 0;
|
||||
|
||||
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 120);
|
||||
|
||||
// DRAW A FULL PIC INSTEAD OF FLAT!
|
||||
if (intro_scenenum == 0)
|
||||
{
|
||||
background = W_CachePatchName("KARTKREW", PU_PATCH_LOWPRIORITY);
|
||||
highres = true;
|
||||
}
|
||||
background = W_CachePatchName("KARTKREW", PU_PATCH);
|
||||
|
||||
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 120);
|
||||
|
||||
if (background)
|
||||
{
|
||||
if (highres)
|
||||
if (background)
|
||||
{
|
||||
V_DrawSmallScaledPatch(bgxoffs, 0, 0, background);
|
||||
else
|
||||
V_DrawScaledPatch(bgxoffs, 0, 0, background);
|
||||
}
|
||||
}
|
||||
|
||||
W_UnlockCachedPatch(background);
|
||||
@@ -324,6 +316,7 @@ void F_IntroTicker(void)
|
||||
D_StartTitle();
|
||||
return;
|
||||
}
|
||||
|
||||
if (finalecount == 8)
|
||||
S_StartSound(NULL, sfx_vroom);
|
||||
else if (finalecount == 47)
|
||||
@@ -626,7 +619,6 @@ void F_StartCredits(void)
|
||||
timetonext = 2*TICRATE;
|
||||
}
|
||||
|
||||
|
||||
void F_CreditDrawer(void)
|
||||
{
|
||||
UINT16 i;
|
||||
@@ -652,7 +644,7 @@ void F_CreditDrawer(void)
|
||||
sc = FRACUNIT; // quick hack so I don't have to add another field to credits_pics
|
||||
}
|
||||
|
||||
V_DrawFixedPatch(credits_pics[i].x<<FRACBITS, (credits_pics[i].y<<FRACBITS) - 4*(animtimer<<FRACBITS)/5, sc, 0, W_CachePatchName(credits_pics[i].patch, PU_PATCH), colormap);
|
||||
V_DrawFixedPatch(credits_pics[i].x<<FRACBITS, (credits_pics[i].y<<FRACBITS) - 4*(animtimer<<FRACBITS)/5, sc, 0, W_CachePatchName(credits_pics[i].patch, PU_PATCH_LOWPRIORITY), colormap);
|
||||
}
|
||||
|
||||
// Dim the background
|
||||
@@ -661,22 +653,23 @@ void F_CreditDrawer(void)
|
||||
// Draw credits text on top
|
||||
for (i = 0; credits[i]; i++)
|
||||
{
|
||||
switch(credits[i][0])
|
||||
switch (credits[i][0])
|
||||
{
|
||||
case 0:
|
||||
y += 80<<FRACBITS;
|
||||
break;
|
||||
case 1:
|
||||
if (y>>FRACBITS > -20)
|
||||
V_DrawCreditString((160 - (V_CreditStringWidth(&credits[i][1])>>1))<<FRACBITS, y, 0, &credits[i][1]);
|
||||
y += 30<<FRACBITS;
|
||||
break;
|
||||
default:
|
||||
if (y>>FRACBITS > -10)
|
||||
V_DrawStringAtFixed(32<<FRACBITS, y, V_ALLOWLOWERCASE, credits[i]);
|
||||
y += 12<<FRACBITS;
|
||||
break;
|
||||
case 0:
|
||||
y += 80<<FRACBITS;
|
||||
break;
|
||||
case 1:
|
||||
if (y>>FRACBITS > -20)
|
||||
V_DrawCreditString((160 - (V_CreditStringWidth(&credits[i][1])>>1))<<FRACBITS, y, 0, &credits[i][1]);
|
||||
y += 30<<FRACBITS;
|
||||
break;
|
||||
default:
|
||||
if (y>>FRACBITS > -10)
|
||||
V_DrawStringAtFixed(32<<FRACBITS, y, V_ALLOWLOWERCASE, credits[i]);
|
||||
y += 12<<FRACBITS;
|
||||
break;
|
||||
}
|
||||
|
||||
if (((y>>FRACBITS) * vid.dup) > vid.height)
|
||||
break;
|
||||
}
|
||||
@@ -701,7 +694,7 @@ void F_CreditTicker(void)
|
||||
// Draw credits text on top
|
||||
for (i = 0; credits[i]; i++)
|
||||
{
|
||||
switch(credits[i][0])
|
||||
switch (credits[i][0])
|
||||
{
|
||||
case 0: y += 80<<FRACBITS; break;
|
||||
case 1: y += 30<<FRACBITS; break;
|
||||
@@ -979,10 +972,10 @@ void F_StartTitleScreen(void)
|
||||
demoDelayLeft = demoDelayTime;
|
||||
demoIdleLeft = demoIdleTime;
|
||||
|
||||
ttbanner = W_CachePatchName("TTKBANNR", PU_PATCH_LOWPRIORITY);
|
||||
ttkart = W_CachePatchName("TTKART", PU_PATCH_LOWPRIORITY);
|
||||
ttcheckers = W_CachePatchName("TTCHECK", PU_PATCH_LOWPRIORITY);
|
||||
ttkflash = W_CachePatchName("TTKFLASH", PU_PATCH_LOWPRIORITY);
|
||||
ttbanner = W_CachePatchName("TTKBANNR", PU_PATCH);
|
||||
ttkart = W_CachePatchName("TTKART", PU_PATCH);
|
||||
ttcheckers = W_CachePatchName("TTCHECK", PU_PATCH);
|
||||
ttkflash = W_CachePatchName("TTKFLASH", PU_PATCH);
|
||||
}
|
||||
|
||||
// (no longer) De-Demo'd Title Screen
|
||||
@@ -1419,6 +1412,7 @@ void F_EndCutScene(void)
|
||||
}
|
||||
}
|
||||
|
||||
// custom intros
|
||||
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer)
|
||||
{
|
||||
if (!cutscenes[cutscenenum])
|
||||
|
||||
@@ -384,7 +384,6 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
|
||||
F_DoWipe(fmask);
|
||||
|
||||
I_OsPolling();
|
||||
I_UpdateNoBlit();
|
||||
|
||||
if (rendermode != render_none && drawMenu)
|
||||
{
|
||||
|
||||
+2
-1
@@ -484,6 +484,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
||||
|
||||
G_CopyTiccmd(cmd, &oldcmd[playernum], 1);
|
||||
|
||||
// what in the actual fuck is this???
|
||||
// SRB2kart: Copy-pasted from ticcmd building, removes that crappy demo cam
|
||||
if (((players[displayplayers[0]].mo && players[displayplayers[0]].speed > 0) // Moving
|
||||
|| (leveltime > starttime && (cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE)) // Rubber-burn turn
|
||||
@@ -2536,7 +2537,7 @@ void G_DoPlayDemo(char *defdemoname)
|
||||
UINT8 i, p;
|
||||
lumpnum_t l;
|
||||
char skin[17], color[17], *n;
|
||||
CLEANUP(Z_Pfree) char *pdemoname;
|
||||
CLEANUP(Z_Pfree) char *pdemoname = NULL;
|
||||
UINT8 version, subversion;
|
||||
UINT32 randseed;
|
||||
char msg[1024];
|
||||
|
||||
+12
-11
@@ -276,12 +276,6 @@ UINT32 timesBeatenWithEmeralds = 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.
|
||||
|
||||
// chat timer thingy
|
||||
@@ -3025,7 +3019,8 @@ tryagain:
|
||||
|
||||
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.
|
||||
for (bufx = NUMMAPS-1; bufx > 0; bufx--)
|
||||
@@ -3438,7 +3433,7 @@ void G_LoadGameData(void)
|
||||
INT32 i, j;
|
||||
UINT8 modded = false;
|
||||
UINT8 rtemp;
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
|
||||
//For records
|
||||
tic_t rectime;
|
||||
@@ -3571,7 +3566,7 @@ void G_SaveGameData(boolean force)
|
||||
size_t length;
|
||||
INT32 i, j;
|
||||
UINT8 btemp;
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
(void)force;
|
||||
char backupfile[MAX_WADPATH+4];
|
||||
|
||||
@@ -3742,7 +3737,7 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride)
|
||||
size_t length;
|
||||
char vcheck[VERSIONSIZE];
|
||||
char savename[255];
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
|
||||
// memset savedata to all 0, fixes calling perfectly valid saves corrupt because of bots
|
||||
memset(&savedata, 0, sizeof(savedata));
|
||||
@@ -3828,7 +3823,7 @@ void G_SaveGame(UINT32 savegameslot)
|
||||
boolean saved;
|
||||
char savename[256] = "";
|
||||
const char *backup;
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
|
||||
sprintf(savename, savegamename, savegameslot);
|
||||
backup = va("%s",savename);
|
||||
@@ -4012,6 +4007,12 @@ void G_InitNew(UINT8 pencoremode, const char *mapname, boolean resetplayer, bool
|
||||
automapactive = 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.
|
||||
F_StartCustomCutscene(mapheaderinfo[gamemap-1]->precutscenenum-1, true, resetplayer);
|
||||
else
|
||||
|
||||
+1
-1
@@ -160,7 +160,7 @@ typedef enum
|
||||
const char *G_BuildMapName(INT32 map);
|
||||
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);
|
||||
// copy ticcmd_t to and fro network packets
|
||||
ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n);
|
||||
|
||||
+186
-11
@@ -58,12 +58,21 @@ static void led_off_handle3(void);
|
||||
static void led_off_handle4(void);
|
||||
|
||||
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},
|
||||
{"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}
|
||||
};
|
||||
|
||||
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}};
|
||||
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},
|
||||
@@ -875,11 +884,13 @@ static const char *gamecontrolname[num_gamecontrols] =
|
||||
|
||||
#include "k_kart.h"
|
||||
|
||||
UINT16 G_GetSkinColor(INT32 playernum)
|
||||
UINT8 G_GetSkinColorForGamepad(INT32 playernum)
|
||||
{
|
||||
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
|
||||
|
||||
if (gamestate == GS_LEVEL)
|
||||
{
|
||||
player_t *player = &players[displayplayers[playernum]];
|
||||
const player_t *player = &players[displayplayers[playernum]];
|
||||
|
||||
if (player)
|
||||
{
|
||||
@@ -897,13 +908,13 @@ UINT16 G_GetSkinColor(INT32 playernum)
|
||||
switch (playernum)
|
||||
{
|
||||
case 0:
|
||||
return cv_playercolor.value;
|
||||
return (UINT8)cv_playercolor.value;
|
||||
case 1:
|
||||
return cv_playercolor2.value;
|
||||
return (UINT8)cv_playercolor2.value;
|
||||
case 2:
|
||||
return cv_playercolor3.value;
|
||||
return (UINT8)cv_playercolor3.value;
|
||||
case 3:
|
||||
return cv_playercolor4.value;
|
||||
return (UINT8)cv_playercolor4.value;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -911,19 +922,23 @@ UINT16 G_GetSkinColor(INT32 playernum)
|
||||
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;
|
||||
|
||||
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
|
||||
|
||||
if (cv_gamepadled[playernum].value == 0)
|
||||
if (cv_gamepadled[playernum].value == 0
|
||||
|| color >= MAXTRANSLATIONS)
|
||||
{
|
||||
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;
|
||||
|
||||
I_SetGamepadIndicatorColor(playernum, byte_color.red, byte_color.green, byte_color.blue);
|
||||
@@ -936,7 +951,41 @@ static void G_ResetPlayerGamepadIndicatorColor(INT32 playernum)
|
||||
I_SetGamepadIndicatorColor(playernum, 0, 0, 255);
|
||||
}
|
||||
else
|
||||
{
|
||||
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)
|
||||
@@ -963,9 +1012,135 @@ void G_PlayerDeviceRumble(INT32 playernum, UINT16 low_strength, UINT16 high_stre
|
||||
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);
|
||||
}
|
||||
|
||||
// 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
|
||||
// - pass the pointer to the gamecontrol table for the player being edited
|
||||
|
||||
+9
-4
@@ -113,6 +113,7 @@ extern consvar_t cv_mousesens, cv_mouseysens;
|
||||
extern consvar_t cv_controlperkey;
|
||||
extern consvar_t cv_turnsmooth[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_rumble[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
|
||||
|
||||
extern INT32 mousex, mousey;
|
||||
@@ -131,13 +132,17 @@ extern INT32 gamecontrol[MAXSPLITSCREENPLAYERS][num_gamecontrols][2];
|
||||
#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]])
|
||||
|
||||
// peace to my little coder fingers!
|
||||
// check a gamecontrol being active or not
|
||||
UINT8 G_GetSkinColorForGamepad(INT32 playernum);
|
||||
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_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.
|
||||
void G_MapEventsToControls(event_t *ev);
|
||||
|
||||
+42
-30
@@ -21,28 +21,28 @@
|
||||
|
||||
// The texture for the next polygon given to HWR_ProcessPolygon.
|
||||
// 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
|
||||
UINT32* finalVertexIndexArray = NULL;// contains indexes for glDrawElements, taking into account fan->triangles conversion
|
||||
static FOutVector* finalVertexArray = NULL;// contains subset of sorted vertices and texture coordinates to be sent to gpu
|
||||
static UINT32* finalVertexIndexArray = NULL;// contains indexes for glDrawElements, taking into account fan->triangles conversion
|
||||
// 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
|
||||
//int colorArrayAllocSize = 65536;
|
||||
// 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
|
||||
|
||||
PolygonArrayEntry* polygonArray = NULL ;// contains the polygon data from DrawPolygon, waiting to be processed
|
||||
PolygonArrayEntry **polygonArraySorted = NULL; // contains sorted pointers to polygonArray
|
||||
int polygonArraySize = 0;
|
||||
int polygonArrayAllocSize = 65536;
|
||||
static PolygonArrayEntry* polygonArray = NULL ;// contains the polygon data from DrawPolygon, waiting to be processed
|
||||
static PolygonArrayEntry **polygonArraySorted = NULL; // contains sorted pointers to polygonArray
|
||||
static int polygonArraySize = 0;
|
||||
static int polygonArrayAllocSize = 65536;
|
||||
|
||||
FOutVector* unsortedVertexArray = NULL; // contains unsorted vertices and texture coordinates from DrawPolygon
|
||||
int unsortedVertexArraySize = 0;
|
||||
int unsortedVertexArrayAllocSize = 65536;
|
||||
static FOutVector* unsortedVertexArray = NULL; // contains unsorted vertices and texture coordinates from DrawPolygon
|
||||
static int unsortedVertexArraySize = 0;
|
||||
static int unsortedVertexArrayAllocSize = 65536;
|
||||
|
||||
// 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.
|
||||
@@ -126,8 +126,9 @@ void HWR_ProcessPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPt
|
||||
if (!(PolyFlags & PF_NoTexture) && !horizonSpecial)
|
||||
{
|
||||
// use FNV-1a to hash polygons for later sorting.
|
||||
INT32 hash = 0x811c9dc5;
|
||||
#define DIGEST(h, x) h ^= (x); h *= 0x01000193
|
||||
UINT32 hash = 0x811c9dc5;
|
||||
UINT32 prime = 0x1000193;
|
||||
#define DIGEST(h, x) h ^= ((UINT32)(x)); h *= prime
|
||||
if (current_texture)
|
||||
{
|
||||
DIGEST(hash, current_texture->downloaded);
|
||||
@@ -148,7 +149,7 @@ void HWR_ProcessPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPt
|
||||
}
|
||||
#undef DIGEST
|
||||
// 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));
|
||||
@@ -168,8 +169,10 @@ static int comparePolygons(const void *p1, const void *p2)
|
||||
const PolygonArrayEntry *poly1 = *(PolygonArrayEntry *const *)p1;
|
||||
const PolygonArrayEntry *poly2 = *(PolygonArrayEntry *const *)p2;
|
||||
|
||||
const int shader1 = (poly1->polyFlags & PF_NoTexture || poly1->horizonSpecial) ? -1 : poly1->shader;
|
||||
const int shader2 = (poly2->polyFlags & PF_NoTexture || poly2->horizonSpecial) ? -1 : poly2->shader;
|
||||
// special case with signedness to prevent overflowing
|
||||
// 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
|
||||
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 *poly2 = *(PolygonArrayEntry *const *)p2;
|
||||
|
||||
const GLMipmap_t *texture1 = (poly1->polyFlags & PF_NoTexture || poly1->horizonSpecial) ? NULL : poly1->texture;
|
||||
const GLMipmap_t *texture2 = (poly2->polyFlags & PF_NoTexture || poly2->horizonSpecial) ? NULL : poly2->texture;
|
||||
const GLMipmap_t *texture1 = poly1->hash & 0x80000000 ? NULL : poly1->texture;
|
||||
const GLMipmap_t *texture2 = poly1->hash & 0x80000000 ? NULL : poly2->texture;
|
||||
|
||||
// skywalls and horizon lines must retain their order for horizon lines to work
|
||||
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 downloaded2 = texture2 ? texture2->downloaded : 0;
|
||||
|
||||
diff64 = downloaded1 - downloaded2;
|
||||
if (diff64 != 0) return diff64;
|
||||
|
||||
@@ -233,7 +237,7 @@ static int comparePolygonsNoShaders(const void *p1, const void *p2)
|
||||
|
||||
// This function organizes the geometry collected by HWR_ProcessPolygon calls into batches and uses
|
||||
// the rendering backend to draw them.
|
||||
void HWR_RenderBatches(void)
|
||||
void HWR_RenderBatches(boolean sort)
|
||||
{
|
||||
int finalVertexWritePos = 0; // position in finalVertexArray
|
||||
int finalIndexWritePos = 0; // position in finalVertexIndexArray
|
||||
@@ -260,7 +264,7 @@ void HWR_RenderBatches(void)
|
||||
nextSurfaceInfo.LightInfo.light_level = 0;
|
||||
nextSurfaceInfo.LightInfo.directional = false;
|
||||
|
||||
currently_batching = false;// no longer collecting batches
|
||||
currently_batching = false; // no longer collecting batches
|
||||
|
||||
if (!polygonArraySize)
|
||||
{
|
||||
@@ -270,6 +274,8 @@ void HWR_RenderBatches(void)
|
||||
return;// nothing to draw
|
||||
}
|
||||
|
||||
const boolean useshader = HWR_UseShader();
|
||||
|
||||
// init stats vars
|
||||
ps_hw_numpolys.value.i = polygonArraySize;
|
||||
ps_hw_numcalls.value.i = ps_hw_numverts.value.i = 0;
|
||||
@@ -282,10 +288,13 @@ void HWR_RenderBatches(void)
|
||||
polygonArraySorted[i] = &polygonArray[i];
|
||||
}
|
||||
|
||||
// sort polygons
|
||||
PS_START_TIMING(ps_hw_batchsorttime);
|
||||
qs22j(polygonArraySorted, polygonArraySize, sizeof(PolygonArrayEntry *), (HWR_UseShader() ? comparePolygons : comparePolygonsNoShaders));
|
||||
PS_STOP_TIMING(ps_hw_batchsorttime);
|
||||
if (sort)
|
||||
{
|
||||
// sort polygons
|
||||
PS_START_TIMING(ps_hw_batchsorttime);
|
||||
qs22j(polygonArraySorted, polygonArraySize, sizeof(PolygonArrayEntry *), (useshader ? comparePolygons : comparePolygonsNoShaders));
|
||||
PS_STOP_TIMING(ps_hw_batchsorttime);
|
||||
}
|
||||
|
||||
// sort order
|
||||
// 1. shader
|
||||
@@ -294,7 +303,9 @@ void HWR_RenderBatches(void)
|
||||
// 4. colors + light level
|
||||
// not sure about what order of the last 2 should be, or if it even matters
|
||||
|
||||
PS_START_TIMING(ps_hw_batchdrawtime);
|
||||
// dont overwrite this on consecutive calls
|
||||
if (!sort)
|
||||
PS_START_TIMING(ps_hw_batchdrawtime);
|
||||
|
||||
currentShader = polygonArraySorted[0]->shader;
|
||||
currentTexture = polygonArraySorted[0]->texture;
|
||||
@@ -305,7 +316,7 @@ void HWR_RenderBatches(void)
|
||||
|
||||
// set state for first batch
|
||||
|
||||
if (HWR_UseShader())
|
||||
if (useshader)
|
||||
{
|
||||
GL_SetShader(currentShader);
|
||||
}
|
||||
@@ -387,7 +398,7 @@ void HWR_RenderBatches(void)
|
||||
if (nextPolyFlags & PF_NoTexture)
|
||||
nextTexture = 0;
|
||||
|
||||
if (currentShader != nextShader && HWR_UseShader())
|
||||
if (useshader && currentShader != nextShader)
|
||||
{
|
||||
changeState = true;
|
||||
changeShader = true;
|
||||
@@ -405,7 +416,7 @@ void HWR_RenderBatches(void)
|
||||
changePolyFlags = true;
|
||||
}
|
||||
|
||||
if (HWR_UseShader())
|
||||
if (useshader)
|
||||
{
|
||||
if (currentSurfaceInfo.PolyColor.rgba != nextSurfaceInfo.PolyColor.rgba ||
|
||||
currentSurfaceInfo.TintColor.rgba != nextSurfaceInfo.TintColor.rgba ||
|
||||
@@ -489,7 +500,8 @@ void HWR_RenderBatches(void)
|
||||
polygonArraySize = 0;
|
||||
unsortedVertexArraySize = 0;
|
||||
|
||||
PS_STOP_TIMING(ps_hw_batchdrawtime);
|
||||
if (!sort)
|
||||
PS_STOP_TIMING(ps_hw_batchdrawtime);
|
||||
}
|
||||
|
||||
#endif // HWRENDER
|
||||
@@ -37,7 +37,7 @@ typedef struct
|
||||
void HWR_StartBatching(void);
|
||||
void HWR_SetCurrentTexture(GLMipmap_t *texture);
|
||||
void HWR_ProcessPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags, int shader, boolean horizonSpecial);
|
||||
void HWR_RenderBatches(void);
|
||||
void HWR_RenderBatches(boolean sort);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
|
||||
@@ -538,7 +538,7 @@ static void loading_status(void)
|
||||
x = BASEVIDWIDTH/2;
|
||||
y = BASEVIDHEIGHT/2;
|
||||
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);
|
||||
V_DrawString(x-50, y, V_YELLOWMAP, "Loading...");
|
||||
V_DrawRightAlignedString(x+50, y, V_YELLOWMAP, s);
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
|
||||
#ifdef HWRENDER
|
||||
|
||||
#include <unordered_set>
|
||||
|
||||
#include "hw_main.h"
|
||||
#include "hw_glob.h"
|
||||
#include "hw_gl.h"
|
||||
@@ -36,7 +38,7 @@
|
||||
INT32 patchformat = GL_TEXFMT_AP_88; // use alpha for holes
|
||||
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);
|
||||
|
||||
@@ -98,7 +100,7 @@ static void HWR_DrawColumnInCache(const column_t *patchcol, UINT8 *block, GLMipm
|
||||
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)
|
||||
count = pblockheight - position;
|
||||
@@ -162,7 +164,7 @@ static void HWR_DrawPatchInCache(GLMipmap_t *mipmap,
|
||||
fixed_t xfrac, xfracstep;
|
||||
fixed_t yfracstep, scale_y;
|
||||
const column_t *patchcol;
|
||||
UINT8 *block = mipmap->data;
|
||||
UINT8 *block = static_cast<UINT8 *>(mipmap->data);
|
||||
INT32 bpp;
|
||||
INT32 blockmodulo;
|
||||
RGBA_t *palette;
|
||||
@@ -212,7 +214,7 @@ static void HWR_DrawTexturePatchInCache(GLMipmap_t *mipmap,
|
||||
fixed_t xfrac, xfracstep;
|
||||
fixed_t yfracstep, scale_y;
|
||||
const column_t *patchcol;
|
||||
UINT8 *block = mipmap->data;
|
||||
UINT8 *block = static_cast<UINT8 *>(mipmap->data);
|
||||
INT32 bpp;
|
||||
INT32 blockmodulo;
|
||||
INT32 width, height;
|
||||
@@ -287,8 +289,8 @@ static UINT8 *MakeBlock(GLMipmap_t *glMipmap)
|
||||
UINT16 bu16 = ((0x00 <<8) | HWR_PATCHES_CHROMAKEY_COLORINDEX);
|
||||
INT32 blocksize = (glMipmap->width * glMipmap->height);
|
||||
|
||||
bpp = format2bpp(glMipmap->format);
|
||||
block = Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data));
|
||||
bpp = format2bpp(glMipmap->format);
|
||||
block = static_cast<UINT8 *>(Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data)));
|
||||
|
||||
switch (bpp)
|
||||
{
|
||||
@@ -325,7 +327,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
|
||||
texture = textures[texnum];
|
||||
|
||||
gltex->mipmap.flags = TF_CHROMAKEYED | TF_WRAPXY;
|
||||
gltex->mipmap.format = textureformat;
|
||||
gltex->mipmap.format = static_cast<GLTextureFormat_t>(textureformat);
|
||||
|
||||
// hack the Legacy skies..
|
||||
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;
|
||||
#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;
|
||||
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.
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
// 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_t = (float)patch->height / (float)glMipmap->height;
|
||||
@@ -455,12 +457,13 @@ static void HWR_FreeTextureData(patch_t *patch)
|
||||
if (!patch || !patch->hardware)
|
||||
return;
|
||||
|
||||
glPatch = patch->hardware;
|
||||
glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
|
||||
if (vid.glstate == VID_GL_LIBRARY_LOADED)
|
||||
GL_DeleteTexture(glPatch->mipmap);
|
||||
|
||||
Z_Free(glPatch->mipmap->data);
|
||||
glPatch->mipmap->data = NULL;
|
||||
}
|
||||
|
||||
void HWR_FreeTexture(patch_t *patch)
|
||||
@@ -470,7 +473,7 @@ void HWR_FreeTexture(patch_t *patch)
|
||||
|
||||
if (patch->hardware)
|
||||
{
|
||||
GLPatch_t *glPatch = patch->hardware;
|
||||
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
|
||||
HWR_FreeTextureColormaps(patch);
|
||||
|
||||
@@ -478,6 +481,7 @@ void HWR_FreeTexture(patch_t *patch)
|
||||
{
|
||||
HWR_FreeTextureData(patch);
|
||||
Z_Free(glPatch->mipmap);
|
||||
glPatch->mipmap = NULL;
|
||||
}
|
||||
|
||||
Z_Free(patch->hardware);
|
||||
@@ -495,7 +499,7 @@ static void HWR_FreeTextureColormaps(patch_t *patch)
|
||||
if (!patch)
|
||||
return;
|
||||
|
||||
pat = patch->hardware;
|
||||
pat = static_cast<GLPatch_t *>(patch->hardware);
|
||||
if (!pat)
|
||||
return;
|
||||
|
||||
@@ -577,6 +581,9 @@ void HWR_InitMapTextures(void)
|
||||
|
||||
static void FreeMapTexture(GLMapTexture_t *tex)
|
||||
{
|
||||
if (!tex)
|
||||
return;
|
||||
|
||||
GL_DeleteTexture(&tex->mipmap);
|
||||
Z_Free(tex->mipmap.data);
|
||||
tex->mipmap.data = NULL;
|
||||
@@ -586,6 +593,12 @@ void HWR_FreeMapTextures(void)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!gl_textures)
|
||||
{
|
||||
gl_numtextures = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < gl_numtextures; i++)
|
||||
{
|
||||
FreeMapTexture(&gl_textures[i].normal);
|
||||
@@ -596,18 +609,30 @@ void HWR_FreeMapTextures(void)
|
||||
|
||||
// now the heap don't have any 'user' pointing to our
|
||||
// texturecache info, we can free it
|
||||
if (gl_textures)
|
||||
free(gl_textures);
|
||||
free(gl_textures);
|
||||
gl_textures = NULL;
|
||||
gl_numtextures = 0;
|
||||
}
|
||||
|
||||
static void HWR_PrecacheLevelFlats(void)
|
||||
{
|
||||
// lookup for flats that may´ve been already loaded
|
||||
// too lazy to make a hashtable or smth so unordered set will do :carbuncle:
|
||||
std::unordered_set<UINT32> flatpresent;
|
||||
lumpnum_t lump;
|
||||
size_t i, j;
|
||||
INT32 k;
|
||||
|
||||
auto load_flat = [&](lumpnum_t lump, boolean noencoremap)
|
||||
{
|
||||
// flat already loaded?
|
||||
if (flatpresent.count(lump) == 0)
|
||||
{
|
||||
HWR_GetFlat(lump, noencoremap);
|
||||
flatpresent.insert(lump);
|
||||
}
|
||||
};
|
||||
|
||||
// special case for encore
|
||||
#ifdef GLENCORE
|
||||
if (encoremap)
|
||||
@@ -624,16 +649,16 @@ static void HWR_PrecacheLevelFlats(void)
|
||||
const INT32 pic = ceiling ? sec->ceilingpic : sec->floorpic;
|
||||
|
||||
const levelflat_t *levelflat = &levelflats[pic];
|
||||
|
||||
lump = levelflat->lumpnum;
|
||||
HWR_GetFlat(lump, R_NoEncore(sec, ceiling));
|
||||
|
||||
if (levelflat->speed) // it is an animated flat
|
||||
load_flat(lump, R_NoEncore(sec, ceiling));
|
||||
|
||||
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;
|
||||
HWR_GetFlat(lump, R_NoEncore(sec, ceiling));
|
||||
load_flat(levelflat->baselumpnum + k, R_NoEncore(sec, ceiling));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -649,15 +674,15 @@ static void HWR_PrecacheLevelFlats(void)
|
||||
const levelflat_t *levelflat = &levelflats[i];
|
||||
lump = levelflat->lumpnum;
|
||||
|
||||
HWR_GetFlat(lump, false);
|
||||
load_flat(lump, false);
|
||||
|
||||
if (!levelflat->speed) // is it an animated flat ?
|
||||
continue;
|
||||
|
||||
for (k = 1; k < levelflat->numpics; k++)
|
||||
if (levelflat->speed) // is it an animated flat ?
|
||||
{
|
||||
lump = levelflat->baselumpnum + k;
|
||||
HWR_GetFlat(lump, false);
|
||||
// start from 0, occasionally basenumlump != flat->lumpnum
|
||||
for (k = 0; k < levelflat->numpics; k++)
|
||||
{
|
||||
load_flat(levelflat->baselumpnum + k, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -670,7 +695,7 @@ static void HWR_PrecacheLevelTextures(void)
|
||||
size_t i, j, f;
|
||||
INT32 h;
|
||||
|
||||
texturepresent = calloc(numtextures, sizeof (*texturepresent));
|
||||
texturepresent = static_cast<char *>(calloc(gl_numtextures, sizeof(*texturepresent)));
|
||||
if (texturepresent == NULL)
|
||||
I_Error("%s: Out of memory looking up textures", "HWR_PrecacheLevel");
|
||||
|
||||
@@ -701,7 +726,10 @@ static void HWR_PrecacheLevelTextures(void)
|
||||
{
|
||||
const INT32 texnum = sidetex[f];
|
||||
|
||||
if (texnum < 0 || texnum >= numtextures || texturepresent[texnum])
|
||||
if (texnum < 0 || texnum >= (signed)gl_numtextures)
|
||||
continue;
|
||||
|
||||
if (texturepresent[texnum])
|
||||
continue;
|
||||
#ifdef GLENCORE
|
||||
texturepresent[texnum] = 1|noencoremap;
|
||||
@@ -729,14 +757,16 @@ static void HWR_PrecacheLevelTextures(void)
|
||||
|
||||
for (h = 1; h < anim->numpics; h++)
|
||||
{
|
||||
const INT32 animtexnum = anim->basepic+h;
|
||||
|
||||
if (texpresent & 1)
|
||||
{
|
||||
HWR_GetTexture(anim->basepic+h, false);
|
||||
HWR_GetTexture(animtexnum, false);
|
||||
}
|
||||
#ifdef GLENCORE
|
||||
if (texpresent & 2)
|
||||
{
|
||||
HWR_GetTexture(anim->basepic+h, true);
|
||||
HWR_GetTexture(animtexnum, true);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -840,7 +870,7 @@ void HWR_LoadMapTextures(size_t pnumtextures)
|
||||
HWR_FreeMapTextures();
|
||||
|
||||
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)
|
||||
I_Error("HWR_LoadMapTextures: ran out of memory for OpenGL textures. Sad!");
|
||||
@@ -852,6 +882,7 @@ void HWR_LoadMapTextures(size_t pnumtextures)
|
||||
GLMapTexture_t *HWR_GetTexture(INT32 tex, boolean noencore)
|
||||
{
|
||||
GLMapTexture_t *gltex;
|
||||
GLMipmap_t *glMipmap;
|
||||
|
||||
if (tex < 0 || tex >= (signed)gl_numtextures)
|
||||
{
|
||||
@@ -870,19 +901,22 @@ GLMapTexture_t *HWR_GetTexture(INT32 tex, boolean noencore)
|
||||
gltex = &gl_textures[tex];
|
||||
#endif
|
||||
|
||||
glMipmap = &gltex->mipmap;
|
||||
|
||||
// Generate texture if missing from the cache
|
||||
if (!gltex->mipmap.downloaded)
|
||||
if (!glMipmap->downloaded)
|
||||
{
|
||||
if (!gltex->mipmap.data)
|
||||
HWR_GenerateTexture(tex, gltex, noencore);
|
||||
|
||||
// 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.
|
||||
Z_ChangeTag(gltex->mipmap.data, PU_HWRCACHE_UNLOCKED);
|
||||
Z_ChangeTag(glMipmap->data, PU_HWRCACHE_UNLOCKED);
|
||||
|
||||
return gltex;
|
||||
}
|
||||
@@ -933,7 +967,7 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum)
|
||||
W_ReadLump(flatlumpnum, Z_Malloc(size, PU_HWRCACHE, &glMipmap->data));
|
||||
|
||||
#ifdef GLENCORE
|
||||
flat = glMipmap->data;
|
||||
flat = static_cast<UINT8 *>(glMipmap->data);
|
||||
for (steppy = 0; steppy < size; steppy++)
|
||||
{
|
||||
if (flat[steppy] == HWR_PATCHES_CHROMAKEY_COLORINDEX)
|
||||
@@ -977,7 +1011,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
|
||||
if (!noencoremap && encoremap)
|
||||
colormap += COLORMAP_REMAPOFFSET;
|
||||
#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;
|
||||
memcpy(glMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
||||
}
|
||||
@@ -1001,7 +1035,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
|
||||
// --------------------+
|
||||
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)
|
||||
{
|
||||
@@ -1022,8 +1056,8 @@ static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
||||
// ----------------------+
|
||||
static void HWR_UpdatePatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
||||
{
|
||||
GLPatch_t *grPatch = patch->hardware;
|
||||
HWR_MakePatch(patch, grPatch, glMipmap, true);
|
||||
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
HWR_MakePatch(patch, glPatch, glMipmap, true);
|
||||
|
||||
// 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
|
||||
@@ -1031,6 +1065,7 @@ static void HWR_UpdatePatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
|
||||
GL_SetTexture(glMipmap);
|
||||
else
|
||||
GL_UpdateTexture(glMipmap);
|
||||
|
||||
HWR_SetCurrentTexture(glMipmap);
|
||||
|
||||
// The system-memory data can be purged now.
|
||||
@@ -1057,7 +1092,7 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
|
||||
|
||||
if (!patch->hardware)
|
||||
Patch_CreateGL(patch);
|
||||
glPatch = patch->hardware;
|
||||
glPatch = static_cast<GLPatch_t *>(patch->hardware);
|
||||
|
||||
// Blatant hack for encore colormapping aside...
|
||||
if (colormap == colormaps || colormap == NULL || colormap == (const UINT8*)(COLORMAP_REMAPOFFSET))
|
||||
@@ -1093,12 +1128,12 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
|
||||
// (it have a liste of mipmap)
|
||||
// this malloc is cleared in HWR_FreeColormapCache
|
||||
// (...) unfortunately z_malloc fragment alot the memory :(so malloc is better
|
||||
newMipmap = calloc(1, sizeof (*newMipmap));
|
||||
newMipmap = static_cast<GLMipmap_t *>(calloc(1, sizeof (*newMipmap)));
|
||||
if (newMipmap == NULL)
|
||||
I_Error("%s: Out of memory", "HWR_GetMappedPatch");
|
||||
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;
|
||||
memcpy(newMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
|
||||
|
||||
@@ -1121,7 +1156,7 @@ patch_t *HWR_GetCachedGLPatchPwad(UINT16 wadnum, UINT16 lumpnum)
|
||||
{
|
||||
void *ptr = Z_Calloc(sizeof(patch_t), PU_PATCH, &lumpcache[lumpnum]);
|
||||
Patch_Create(NULL, 0, ptr);
|
||||
Patch_AllocateHardwarePatch(ptr);
|
||||
Patch_AllocateHardwarePatch(static_cast<patch_t *>(ptr));
|
||||
}
|
||||
|
||||
return (patch_t *)(lumpcache[lumpnum]);
|
||||
@@ -1138,7 +1173,7 @@ static void HWR_DrawFadeMaskInCache(GLMipmap_t *mipmap, INT32 pblockwidth, INT32
|
||||
{
|
||||
INT32 i,j;
|
||||
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 *dest, *src, texel;
|
||||
RGBA_t col;
|
||||
@@ -1294,9 +1329,9 @@ void HWR_SetPalette(RGBA_t *palette)
|
||||
static void HWR_SetPaletteLookup(RGBA_t *palette)
|
||||
{
|
||||
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),
|
||||
PU_STATIC, NULL);
|
||||
PU_STATIC, NULL));
|
||||
#define STEP_SIZE (256/HWR_PALETTE_LUT_SIZE)
|
||||
for (b = 0; b < HWR_PALETTE_LUT_SIZE; b++)
|
||||
{
|
||||
@@ -1339,7 +1374,7 @@ void HWR_SetMapPalette(void)
|
||||
if (palsize < 768) // 256 * 3
|
||||
I_Error("HWR_SetMapPalette: A programmer assumed palette lumps are at least 768 bytes long, but apparently this was a wrong assumption!\n");
|
||||
|
||||
RGB_data = 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.
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
@@ -1374,7 +1409,7 @@ static UINT32 HWR_CreateLightTable(UINT8 *lighttable)
|
||||
{
|
||||
UINT32 i, id;
|
||||
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,
|
||||
// the hardware lighttable is composed of RGBA colors instead of palette indices.
|
||||
+20
-20
@@ -166,6 +166,7 @@ static void gld_clipper_RemoveRange(clipnode_t *range)
|
||||
{
|
||||
range->prev->next = range->next;
|
||||
}
|
||||
|
||||
if (range->next)
|
||||
{
|
||||
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)
|
||||
{
|
||||
if(startangle > endangle)
|
||||
if (startangle > endangle)
|
||||
{
|
||||
// The range has to added in two parts.
|
||||
gld_clipper_AddClipRange(startangle, ANGLE_MAX);
|
||||
@@ -319,7 +320,7 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
|
||||
double floatangle;
|
||||
angle_t a1;
|
||||
|
||||
float tilt = (float)fabs(((double)(int)tiltangle) / ANG1);
|
||||
float tilt = fabsf(((float)(int)tiltangle) / (float)ANG1);
|
||||
|
||||
if (tilt > 90.0f)
|
||||
tilt = 90.0f;
|
||||
@@ -330,7 +331,7 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
|
||||
|
||||
// ok, this is a gross hack that barely works...
|
||||
// but at least it doesn't overestimate too much...
|
||||
clipfov = atan(1 / (GLdouble)projMatrix[0]) * 360.0 / M_PIl;
|
||||
clipfov = atan(1 / (GLdouble)projMatrix[0]) * 360.0 / M_PI;
|
||||
floatangle = 2.0 + (45.0 + ((double)tilt / 1.9)) * clipfov / 90.0;
|
||||
if (floatangle >= 180.0)
|
||||
return 0xffffffff;
|
||||
@@ -348,33 +349,32 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
|
||||
// gld_FrustumSetup
|
||||
//
|
||||
|
||||
static GLdouble viewMatrix[16];
|
||||
static GLdouble projMatrix[16];
|
||||
float frustum[6][4];
|
||||
static float frustum[6][4];
|
||||
|
||||
#define CALCMATRIX(a, b, c, d, e, f, g, h)\
|
||||
(float)(viewMatrix[a] * projMatrix[b] + \
|
||||
viewMatrix[c] * projMatrix[d] + \
|
||||
viewMatrix[e] * projMatrix[f] + \
|
||||
viewMatrix[g] * projMatrix[h])
|
||||
(modelMatrix[a] * projMatrix[b] + \
|
||||
modelMatrix[c] * projMatrix[d] + \
|
||||
modelMatrix[e] * projMatrix[f] + \
|
||||
modelMatrix[g] * projMatrix[h])
|
||||
|
||||
#define NORMALIZE_PLANE(i)\
|
||||
t = (float)sqrt(\
|
||||
frustum[i][0] * frustum[i][0] + \
|
||||
frustum[i][1] * frustum[i][1] + \
|
||||
frustum[i][2] * frustum[i][2]); \
|
||||
frustum[i][0] /= t; \
|
||||
frustum[i][1] /= t; \
|
||||
frustum[i][2] /= t; \
|
||||
frustum[i][3] /= t
|
||||
t = sqrtf(\
|
||||
frustum[i][0] * frustum[i][0] + \
|
||||
frustum[i][1] * frustum[i][1] + \
|
||||
frustum[i][2] * frustum[i][2]); \
|
||||
frustum[i][0] /= t; \
|
||||
frustum[i][1] /= t; \
|
||||
frustum[i][2] /= t; \
|
||||
frustum[i][3] /= t
|
||||
|
||||
void gld_FrustumSetup(void)
|
||||
{
|
||||
float t;
|
||||
float clip[16];
|
||||
|
||||
pglGetFloatv(GL_PROJECTION_MATRIX, projMatrix);
|
||||
pglGetFloatv(GL_MODELVIEW_MATRIX, viewMatrix);
|
||||
// HWR_SetTransform will take care of this!
|
||||
//pglGetFloatv(GL_PROJECTION_MATRIX, projMatrix);
|
||||
//pglGetFloatv(GL_MODELVIEW_MATRIX, modelMatrix);
|
||||
|
||||
clip[0] = CALCMATRIX(0, 0, 1, 4, 2, 8, 3, 12);
|
||||
clip[1] = CALCMATRIX(0, 1, 1, 5, 2, 9, 3, 13);
|
||||
|
||||
@@ -16,7 +16,7 @@ extern "C" {
|
||||
#include "../tables.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);
|
||||
void gld_clipper_SafeAddClipRange(angle_t startangle, angle_t endangle);
|
||||
|
||||
@@ -65,7 +65,7 @@ typedef struct GLMipmap_s GLMipmap_t;
|
||||
struct GLMapTexture_s
|
||||
{
|
||||
GLMipmap_t mipmap;
|
||||
float scaleX; //used for scaling textures on walls
|
||||
float scaleX; // used for scaling textures on walls
|
||||
float scaleY;
|
||||
};
|
||||
typedef struct GLMapTexture_s GLMapTexture_t;
|
||||
@@ -74,7 +74,7 @@ typedef struct GLMapTexture_s GLMapTexture_t;
|
||||
struct GLPatch_s
|
||||
{
|
||||
GLMipmap_t *mipmap;
|
||||
float max_s,max_t;
|
||||
float max_s, max_t;
|
||||
};
|
||||
typedef struct GLPatch_s GLPatch_t;
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ typedef struct FColorARGB FColorARGB;
|
||||
// Simple 2D coordinate
|
||||
typedef struct
|
||||
{
|
||||
FLOAT x,y;
|
||||
FLOAT x, y;
|
||||
} F2DCoord, v2d_t;
|
||||
|
||||
// ======================
|
||||
@@ -142,8 +142,8 @@ enum
|
||||
// Transformed vector, as passed to HWR API
|
||||
typedef struct
|
||||
{
|
||||
FLOAT x,y,z;
|
||||
FLOAT s,t;
|
||||
FLOAT x, y, z;
|
||||
FLOAT s, t;
|
||||
} FOutVector;
|
||||
|
||||
typedef struct vbo_vertex_s
|
||||
@@ -173,7 +173,7 @@ typedef struct
|
||||
int rows, columns;
|
||||
int loopcount;
|
||||
|
||||
int detail, vertex_count;
|
||||
int vertex_count;
|
||||
int texture, width, height;
|
||||
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
|
||||
+278
-182
@@ -14,6 +14,7 @@
|
||||
#ifdef HWRENDER
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
#include "../doomstat.h"
|
||||
#include "../doomdef.h"
|
||||
@@ -83,6 +84,13 @@ float gl_viewsin = 0.0f, gl_viewcos = 0.0f;
|
||||
static float gl_viewludsin, gl_viewludcos;
|
||||
static angle_t gl_aimingangle;
|
||||
|
||||
static float yaw = 0.0f;
|
||||
static float inv_yaw = 0.0f;
|
||||
static float cos_inv_yaw = 0.0f;
|
||||
static float sin_inv_yaw = 0.0f;
|
||||
|
||||
static constexpr float deg2radians = (M_PIf / 180.0f);
|
||||
|
||||
seg_t *gl_curline = NULL;
|
||||
side_t *gl_sidedef = NULL;
|
||||
line_t *gl_linedef = NULL;
|
||||
@@ -138,7 +146,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing);
|
||||
static void HWR_SetTransformAiming(FTransform *trans);
|
||||
static void HWR_RollTransform(FTransform *tr, angle_t roll);
|
||||
|
||||
static void HWR_DoPostProcessor(player_t *player);
|
||||
static void HWR_DoPostProcessor(void);
|
||||
|
||||
static void HWR_SetShaderState(void);
|
||||
static void HWR_TogglePaletteRendering(void);
|
||||
@@ -260,7 +268,8 @@ static void CV_screentextures_OnChange(void)
|
||||
static void CV_glframebuffer_OnChange(void)
|
||||
{
|
||||
ONLY_IF_GL_LOADED
|
||||
if ((cv_glframebuffer.value != 0 && cv_glscreentextures.value != 2) || (!supportFBO && cv_glframebuffer.value != 0)) // screen FBO needs screen textures
|
||||
if ((cv_glframebuffer.value != 0 && cv_glscreentextures.value != 2)
|
||||
|| (!supportFBO && cv_glframebuffer.value != 0)) // screen FBO needs screen textures
|
||||
CV_SetValue(&cv_glframebuffer, 0);
|
||||
|
||||
I_DownSample();
|
||||
@@ -379,7 +388,7 @@ void HWR_ObjectLightLevelPost(gl_vissprite_t *spr, const sector_t *sector, INT32
|
||||
extralight = FixedMul(extralight, std::min(std::max(0, *lightlevel), 255) * FRACUNIT / 255);
|
||||
|
||||
// simple OGL approximation
|
||||
fixed_t tr = R_QuickCamDist(spr->mobj->x, spr->mobj->y) << FRACBITS;
|
||||
fixed_t tr = R_QuickCamDist(spr->mobj->x, spr->mobj->y);
|
||||
fixed_t xscale = FixedDiv((vid.width / 2) << FRACBITS, tr);
|
||||
|
||||
// Less change in contrast at further distances, to counteract DOOM diminished light
|
||||
@@ -1233,6 +1242,9 @@ static inline boolean HWR_BlendMidtextureSurface(FSurfaceInfo *pSurf)
|
||||
|
||||
if (LIKELY(!gl_curline->polyseg))
|
||||
{
|
||||
// check if linedef alpha is within range
|
||||
const boolean linealpha = (gl_linedef->alpha >= 0 && gl_linedef->alpha < FRACUNIT);
|
||||
|
||||
// set alpha for transparent walls
|
||||
switch (gl_linedef->special)
|
||||
{
|
||||
@@ -1247,19 +1259,23 @@ static inline boolean HWR_BlendMidtextureSurface(FSurfaceInfo *pSurf)
|
||||
case 221:
|
||||
case 253:
|
||||
case 256:
|
||||
if (gl_linedef->blendmode)
|
||||
if (gl_linedef->blendmode && linealpha)
|
||||
blendmode = HWR_SurfaceBlend(gl_linedef->blendmode, R_GetLinedefTransTable(gl_linedef->alpha), pSurf);
|
||||
else
|
||||
blendmode = PF_Translucent;
|
||||
break;
|
||||
default:
|
||||
if (gl_linedef->blendmode)
|
||||
{
|
||||
if (gl_linedef->alpha >= 0 && gl_linedef->alpha < FRACUNIT)
|
||||
if (linealpha)
|
||||
blendmode = HWR_SurfaceBlend(gl_linedef->blendmode, R_GetLinedefTransTable(gl_linedef->alpha), pSurf);
|
||||
else
|
||||
blendmode = HWR_GetBlendModeFlag(gl_linedef->blendmode);
|
||||
}
|
||||
else if (gl_linedef->alpha >= 0 && gl_linedef->alpha < FRACUNIT)
|
||||
else if (linealpha)
|
||||
blendmode = HWR_TranstableToAlpha(R_GetLinedefTransTable(gl_linedef->alpha), pSurf);
|
||||
else
|
||||
blendmode = PF_Masked;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1351,7 +1367,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
// x offset the texture
|
||||
const fixed_t texturehpeg = gl_sidedef->textureoffset + gl_curline->offset;
|
||||
const float cliplow = (float)texturehpeg;
|
||||
const float cliphigh = (float)(texturehpeg + gl_curline->length);
|
||||
const float cliphigh = ((float)texturehpeg + (float)gl_curline->length);
|
||||
|
||||
FUINT lightnum = gl_frontsector->lightlevel;
|
||||
extracolormap_t *colormap = gl_frontsector->extra_colormap;
|
||||
@@ -1365,8 +1381,8 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
const INT32 gl_midtexture = R_GetTextureNum(gl_sidedef->midtexture);
|
||||
GLMapTexture_t *glTex = NULL;
|
||||
|
||||
static constexpr float FLOATMAX = INT32_MAX / (float)FRACUNIT;
|
||||
static constexpr float FLOATMIN = INT32_MIN / (float)FRACUNIT;
|
||||
static constexpr float FLOATMAX = (float)INT32_MAX / (float)FRACUNIT;
|
||||
static constexpr float FLOATMIN = (float)INT32_MIN / (float)FRACUNIT;
|
||||
|
||||
// two sided line
|
||||
if (gl_backsector)
|
||||
@@ -2339,12 +2355,22 @@ static inline void DoAddLine(seg_t* line, angle_t angle1, angle_t angle2)
|
||||
static sector_t tempsec;
|
||||
|
||||
auto do_addline = [&](bool dontdraw) {
|
||||
// Single sided line?
|
||||
if (!line->backsector)
|
||||
{
|
||||
gld_clipper_SafeAddClipRange(angle2, angle1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (line->frontsector == line->backsector)
|
||||
{
|
||||
if (R_GetTextureNum(line->sidedef->midtexture) == 0)
|
||||
{
|
||||
//e6y: nothing to do here!
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
gl_backsector = R_FakeFlat(gl_backsector, &tempsec, NULL, NULL, true);
|
||||
|
||||
if (CheckClip(gl_frontsector, gl_backsector))
|
||||
@@ -2511,25 +2537,25 @@ static boolean HWR_CheckBBox(const fixed_t *bspcoord)
|
||||
// one if statement will split the space in two for one coordinate
|
||||
// for example:
|
||||
// x < BOXLEFT || BOXLEFT || !(x < BOXLEFT) <-- (same as x >= BOXLEFT)
|
||||
fixed_t mindist;// = min(min(mindist1, mindist2), min(mindist3, mindist4));
|
||||
fixed_t mindist = 0;// = min(min(mindist1, mindist2), min(mindist3, mindist4));
|
||||
|
||||
// new thing
|
||||
// calculate distance to axis aligned bounding box.
|
||||
if (viewx < bspcoord[BOXLEFT]) // 1,4,6
|
||||
{
|
||||
if (viewy > bspcoord[BOXTOP]) // 1
|
||||
mindist = R_QuickCamDist(bspcoord[BOXLEFT], bspcoord[BOXTOP]) << FRACBITS;
|
||||
mindist = R_QuickCamDist(bspcoord[BOXLEFT], bspcoord[BOXTOP]);
|
||||
else if (viewy < bspcoord[BOXBOTTOM]) // 6
|
||||
mindist = R_QuickCamDist(bspcoord[BOXLEFT], bspcoord[BOXBOTTOM]) << FRACBITS;
|
||||
mindist = R_QuickCamDist(bspcoord[BOXLEFT], bspcoord[BOXBOTTOM]);
|
||||
else // 4
|
||||
mindist = bspcoord[BOXLEFT] - viewx;
|
||||
}
|
||||
else if (viewx > bspcoord[BOXRIGHT]) // 3,5,8
|
||||
{
|
||||
if (viewy > bspcoord[BOXTOP]) // 3
|
||||
mindist = R_QuickCamDist(bspcoord[BOXRIGHT], bspcoord[BOXTOP]) << FRACBITS;
|
||||
mindist = R_QuickCamDist(bspcoord[BOXRIGHT], bspcoord[BOXTOP]);
|
||||
else if (viewy < bspcoord[BOXBOTTOM]) // 8
|
||||
mindist = R_QuickCamDist(bspcoord[BOXRIGHT], bspcoord[BOXBOTTOM]) << FRACBITS;
|
||||
mindist = R_QuickCamDist(bspcoord[BOXRIGHT], bspcoord[BOXBOTTOM]);
|
||||
else // 5
|
||||
mindist = viewx - bspcoord[BOXRIGHT];
|
||||
}
|
||||
@@ -2956,7 +2982,7 @@ static void HWR_Subsector(size_t num)
|
||||
if (anyMoved == true)
|
||||
{
|
||||
gl_frontsector->numlights = sub->sector->numlights = 0;
|
||||
R_Prep3DFloors(gl_frontsector);
|
||||
R_Prep3DFloors(gl_frontsector, locCeilingHeight);
|
||||
sub->sector->lightlist = gl_frontsector->lightlist;
|
||||
sub->sector->numlights = gl_frontsector->numlights;
|
||||
sub->sector->moved = gl_frontsector->moved = false;
|
||||
@@ -3004,7 +3030,7 @@ static void HWR_Subsector(size_t num)
|
||||
// Hack to make things continue to work around slopes.
|
||||
locCeilingHeight == cullCeilingHeight ? locCeilingHeight : gl_frontsector->ceilingheight,
|
||||
// We now return you to your regularly scheduled rendering.
|
||||
PF_Occlude, ceilinglightlevel, levelflats[gl_frontsector->ceilingpic].lumpnum,NULL, 255, ceilingcolormap);
|
||||
PF_Occlude, ceilinglightlevel, levelflats[gl_frontsector->ceilingpic].lumpnum, NULL, 255, ceilingcolormap);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3036,8 +3062,8 @@ static void HWR_Subsector(size_t num)
|
||||
centerHeight = P_GetFFloorBottomZAt(rover, gl_frontsector->soundorg.x, gl_frontsector->soundorg.y);
|
||||
|
||||
if (centerHeight <= locCeilingHeight && centerHeight >= locFloorHeight &&
|
||||
((viewz < bottomCullHeight && !(rover->flags & FF_INVERTPLANES)) ||
|
||||
(viewz > bottomCullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
|
||||
((viewz < bottomCullHeight && !(rover->flags & FF_INVERTPLANES)) ||
|
||||
(viewz > bottomCullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
|
||||
{
|
||||
if (rover->flags & FF_FOG)
|
||||
{
|
||||
@@ -3081,9 +3107,9 @@ static void HWR_Subsector(size_t num)
|
||||
centerHeight = P_GetFFloorTopZAt(rover, gl_frontsector->soundorg.x, gl_frontsector->soundorg.y);
|
||||
|
||||
if (centerHeight >= locFloorHeight &&
|
||||
centerHeight <= locCeilingHeight &&
|
||||
((viewz > topCullHeight && !(rover->flags & FF_INVERTPLANES)) ||
|
||||
(viewz < topCullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
|
||||
centerHeight <= locCeilingHeight &&
|
||||
((viewz > topCullHeight && !(rover->flags & FF_INVERTPLANES)) ||
|
||||
(viewz < topCullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
|
||||
{
|
||||
if (rover->flags & FF_FOG)
|
||||
{
|
||||
@@ -3162,12 +3188,15 @@ doaddline:
|
||||
// hurdler: false: we only add the sprites, the walls are drawn first
|
||||
if (line)
|
||||
{
|
||||
// draw sprites first, coz they are clipped to the solidsegs of
|
||||
// subsectors more 'in front'
|
||||
if (cv_drawdist.value || current_bsp_culling_distance)
|
||||
HWR_AddSprites<AddSpritesType::kLimitDist>(gl_frontsector);
|
||||
else
|
||||
HWR_AddSprites<AddSpritesType::kNoLimitDist>(gl_frontsector);
|
||||
if (sub->sector->validcount != validcount)
|
||||
{
|
||||
// draw sprites first, coz they are clipped to the solidsegs of
|
||||
// subsectors more 'in front'
|
||||
if (cv_drawdist.value || current_bsp_culling_distance)
|
||||
HWR_AddSprites<AddSpritesType::kLimitDist>(gl_frontsector);
|
||||
else
|
||||
HWR_AddSprites<AddSpritesType::kNoLimitDist>(gl_frontsector);
|
||||
}
|
||||
|
||||
//Hurdler: at this point validcount must be the same, but is not because
|
||||
// gl_frontsector doesn't point anymore to sub->sector due to
|
||||
@@ -4157,6 +4186,7 @@ static int CompareVisSprites(const void *p1, const void *p2)
|
||||
static void HWR_SortVisSprites(void)
|
||||
{
|
||||
UINT32 i;
|
||||
|
||||
for (i = 0; i < gl_visspritecount; i++)
|
||||
{
|
||||
gl_vsprorder[i] = HWR_GetVisSprite(i);
|
||||
@@ -4225,38 +4255,29 @@ typedef struct
|
||||
|
||||
// initial size of drawnode array
|
||||
#define DRAWNODES_INIT_SIZE 64
|
||||
gl_drawnode_t *drawnodes = NULL;
|
||||
INT32 numdrawnodes = 0;
|
||||
INT32 alloceddrawnodes = 0;
|
||||
// no reason to waste all the allocations since every map will have atleast one translucent thing
|
||||
static std::vector<gl_drawnode_t> drawnodes;
|
||||
|
||||
static void *HWR_CreateDrawNode(gl_drawnode_type_t type)
|
||||
{
|
||||
gl_drawnode_t *drawnode;
|
||||
// if we didnt alloc anything yet, reserve atleast 64 nodes
|
||||
// dont declare with it as we want our size to be 0!
|
||||
drawnodes.reserve(DRAWNODES_INIT_SIZE);
|
||||
|
||||
if (!drawnodes)
|
||||
{
|
||||
alloceddrawnodes = DRAWNODES_INIT_SIZE;
|
||||
drawnodes = static_cast<gl_drawnode_t*>(Z_Malloc(alloceddrawnodes * sizeof(gl_drawnode_t), PU_LEVEL, &drawnodes));
|
||||
}
|
||||
else if (numdrawnodes >= alloceddrawnodes)
|
||||
{
|
||||
alloceddrawnodes *= 2;
|
||||
Z_Realloc(drawnodes, alloceddrawnodes * sizeof(gl_drawnode_t), PU_LEVEL, &drawnodes);
|
||||
}
|
||||
|
||||
drawnode = &drawnodes[numdrawnodes++];
|
||||
drawnode->type = type;
|
||||
drawnodes.emplace_back();
|
||||
drawnodes.back().type = type;
|
||||
|
||||
// not sure if returning different pointers to a union is necessary
|
||||
switch (type)
|
||||
{
|
||||
case DRAWNODE_PLANE:
|
||||
return &drawnode->u.plane;
|
||||
return &drawnodes.back().u.plane;
|
||||
case DRAWNODE_POLYOBJECT_PLANE:
|
||||
return &drawnode->u.polyplane;
|
||||
return &drawnodes.back().u.polyplane;
|
||||
case DRAWNODE_WALL:
|
||||
return &drawnode->u.wall;
|
||||
return &drawnodes.back().u.wall;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -4320,11 +4341,15 @@ static int CompareDrawNodePlanes(const void *p1, const void *p2)
|
||||
// Sorts and renders the list of drawnodes for the scene being rendered.
|
||||
static void HWR_RenderDrawNodes(void)
|
||||
{
|
||||
INT32 i = 0, run_start = 0;
|
||||
size_t i = 0, run_start = 0;
|
||||
static std::vector<INT32> sortindex;
|
||||
|
||||
sortindex.reserve(DRAWNODES_INIT_SIZE);
|
||||
|
||||
// Array for storing the rendering order.
|
||||
// A list of indices into the drawnodes array.
|
||||
INT32 *sortindex;
|
||||
|
||||
const size_t numdrawnodes = drawnodes.size();
|
||||
|
||||
if (!numdrawnodes)
|
||||
return;
|
||||
@@ -4333,7 +4358,7 @@ static void HWR_RenderDrawNodes(void)
|
||||
|
||||
PS_START_TIMING(ps_hw_nodesorttime);
|
||||
|
||||
sortindex = static_cast<INT32*>(Z_Malloc(sizeof(INT32) * numdrawnodes, PU_STATIC, NULL));
|
||||
sortindex.resize(numdrawnodes);
|
||||
|
||||
// Reversed order
|
||||
for (i = 0; i < numdrawnodes; i++)
|
||||
@@ -4349,7 +4374,7 @@ static void HWR_RenderDrawNodes(void)
|
||||
if (drawnodes[sortindex[run_start]].type == DRAWNODE_PLANE)
|
||||
{
|
||||
// found it, now look for run end
|
||||
INT32 run_end; // (inclusive)
|
||||
size_t run_end; // (inclusive)
|
||||
|
||||
for (i = run_start+1; i < numdrawnodes; i++)
|
||||
{
|
||||
@@ -4362,7 +4387,7 @@ static void HWR_RenderDrawNodes(void)
|
||||
if (run_end > run_start) // if there are multiple consecutive planes, not just one
|
||||
{
|
||||
// consecutive run of planes found, now sort it
|
||||
qs22j(sortindex + run_start, run_end - run_start + 1, sizeof(INT32), CompareDrawNodePlanes);
|
||||
qs22j(sortindex.data() + run_start, run_end - run_start + 1, sizeof(INT32), CompareDrawNodePlanes);
|
||||
}
|
||||
|
||||
run_start = run_end + 1; // continue looking for runs coming right after this one
|
||||
@@ -4381,6 +4406,9 @@ static void HWR_RenderDrawNodes(void)
|
||||
// Okay! Let's draw it all! Woo!
|
||||
GL_SetTransform(&atransform);
|
||||
|
||||
if (LIKELY(cv_glbatching.value))
|
||||
HWR_StartBatching();
|
||||
|
||||
for (i = 0; i < numdrawnodes; i++)
|
||||
{
|
||||
gl_drawnode_t *drawnode = &drawnodes[sortindex[i]];
|
||||
@@ -4434,9 +4462,10 @@ static void HWR_RenderDrawNodes(void)
|
||||
|
||||
PS_STOP_TIMING(ps_hw_nodedrawtime);
|
||||
|
||||
numdrawnodes = 0;
|
||||
if (LIKELY(cv_glbatching.value))
|
||||
HWR_RenderBatches(false);
|
||||
|
||||
Z_Free(sortindex);
|
||||
drawnodes.clear(); // clear so our size is 0 again!
|
||||
}
|
||||
|
||||
|
||||
@@ -4624,9 +4653,10 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||
float tr_x, tr_y;
|
||||
float tz;
|
||||
float x1, x2;
|
||||
float y1, y2;
|
||||
float z1, z2;
|
||||
float rightsin, rightcos;
|
||||
float this_scale;
|
||||
float thing_scale;
|
||||
float spritexscale, spriteyscale;
|
||||
float gz, gzt;
|
||||
spritedef_t *sprdef;
|
||||
@@ -4695,10 +4725,6 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||
const boolean vflip = (thing->eflags & MFE_VERTICALFLIP);
|
||||
const boolean hflip = (!(thing->frame & FF_HORIZONTALFLIP) != !mirrored);
|
||||
|
||||
this_scale = FixedToFloat(interp.scale);
|
||||
spritexscale = FixedToFloat(interp.spritexscale);
|
||||
spriteyscale = FixedToFloat(interp.spriteyscale);
|
||||
|
||||
// decide which patch to use for sprite relative to player
|
||||
#ifdef RANGECHECK
|
||||
if ((unsigned)thing->sprite >= numsprites)
|
||||
@@ -4799,9 +4825,6 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||
flip ^= (1<<rot);
|
||||
}
|
||||
|
||||
if (sprskin && (sprskin->flags & SF_HIRES))
|
||||
this_scale *= FixedToFloat(sprskin->highresscale);
|
||||
|
||||
spr_width = spritecachedinfo[lumpoff].width;
|
||||
spr_height = spritecachedinfo[lumpoff].height;
|
||||
spr_offset = spritecachedinfo[lumpoff].offset;
|
||||
@@ -4846,19 +4869,13 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||
spr_offset += interp.spritexoffset;
|
||||
spr_topoffset += interp.spriteyoffset;
|
||||
|
||||
if (papersprite)
|
||||
{
|
||||
rightsin = FixedToFloat(FINESINE(interp.angle >> ANGLETOFINESHIFT));
|
||||
rightcos = FixedToFloat(FINECOSINE(interp.angle >> ANGLETOFINESHIFT));
|
||||
}
|
||||
else
|
||||
{
|
||||
rightsin = FixedToFloat(FINESINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
|
||||
rightcos = FixedToFloat(FINECOSINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
|
||||
}
|
||||
thing_scale = FixedToFloat(interp.scale);
|
||||
|
||||
spritexscale *= this_scale;
|
||||
spriteyscale *= this_scale;
|
||||
if (sprskin && (sprskin->flags & SF_HIRES))
|
||||
thing_scale *= FixedToFloat(sprskin->highresscale);
|
||||
|
||||
spritexscale = FixedToFloat(interp.spritexscale) * thing_scale;
|
||||
spriteyscale = FixedToFloat(interp.spriteyscale) * thing_scale;
|
||||
|
||||
flip = !flip != !hflip;
|
||||
|
||||
@@ -4873,19 +4890,17 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||
x2 = (FixedToFloat(spr_width - spr_offset) * spritexscale);
|
||||
}
|
||||
|
||||
z1 = tr_y + x1 * rightsin;
|
||||
z2 = tr_y - x2 * rightsin;
|
||||
x1 = tr_x + x1 * rightcos;
|
||||
x2 = tr_x - x2 * rightcos;
|
||||
y1 = (FixedToFloat(spr_topoffset) * spriteyscale);
|
||||
y2 = (FixedToFloat(spr_height - spr_topoffset) * spriteyscale);
|
||||
|
||||
if (vflip)
|
||||
{
|
||||
gz = FixedToFloat(interp.z + thing->height) - (FixedToFloat(spr_topoffset) * spriteyscale);
|
||||
gz = FixedToFloat(interp.z + thing->height) - y1;
|
||||
gzt = gz + (FixedToFloat(spr_height) * spriteyscale);
|
||||
}
|
||||
else
|
||||
{
|
||||
gzt = FixedToFloat(interp.z) + (FixedToFloat(spr_topoffset) * spriteyscale);
|
||||
gzt = FixedToFloat(interp.z) + y1;
|
||||
gz = gzt - (FixedToFloat(spr_height) * spriteyscale);
|
||||
}
|
||||
|
||||
@@ -4895,6 +4910,18 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||
return;
|
||||
}
|
||||
|
||||
// if the sprite is out of our view, dont need to draw it X)
|
||||
if (!gld_SphereInFrustum(
|
||||
(FixedToFloat(interp.x)) + cos_inv_yaw * (x1 + x2) / 2.0f,
|
||||
FixedToFloat(interp.z) + (y1 + y2) / 2.0f,
|
||||
FixedToFloat(interp.y) - sin_inv_yaw * (x1 + x2) / 2.0f,
|
||||
//1.5 == sqrt(2) + small delta for MF_FOREGROUND
|
||||
std::max<float>(FixedToFloat(spr_width) * spritexscale,
|
||||
FixedToFloat(spr_height) * spriteyscale) / 2.0f * 1.5f))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
heightsec = thing->subsector->sector->heightsec;
|
||||
if (viewplayer && viewplayer->mo && viewplayer->mo->subsector)
|
||||
phs = viewplayer->mo->subsector->sector->heightsec;
|
||||
@@ -4903,16 +4930,39 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||
|
||||
if (heightsec != -1 && phs != -1) // only clip things which are in special sectors
|
||||
{
|
||||
if (gl_viewz < FixedToFloat(sectors[phs].floorheight) ?
|
||||
FixedToFloat(interp.z) >= FixedToFloat(sectors[heightsec].floorheight) :
|
||||
gzt < FixedToFloat(sectors[heightsec].floorheight))
|
||||
fixed_t secheight;
|
||||
|
||||
secheight = P_GetSectorFloorZAt(§ors[heightsec], viewx, viewy);
|
||||
if (viewz < P_GetSectorFloorZAt(§ors[phs], interp.x, interp.y) ?
|
||||
interp.z >= secheight :
|
||||
FloatToFixed(gzt) < secheight)
|
||||
return;
|
||||
if (gl_viewz > FixedToFloat(sectors[phs].ceilingheight) ?
|
||||
gzt < FixedToFloat(sectors[heightsec].ceilingheight) && gl_viewz >= FixedToFloat(sectors[heightsec].ceilingheight) :
|
||||
FixedToFloat(interp.z) >= FixedToFloat(sectors[heightsec].ceilingheight))
|
||||
|
||||
secheight = P_GetSectorCeilingZAt(§ors[heightsec], viewx, viewy);
|
||||
if (viewz > P_GetSectorCeilingZAt(§ors[phs], interp.x, interp.y) ?
|
||||
FloatToFixed(gzt) < secheight && viewz >= secheight :
|
||||
interp.z >= secheight)
|
||||
return;
|
||||
}
|
||||
|
||||
if (papersprite)
|
||||
{
|
||||
rightsin = FixedToFloat(FINESINE(interp.angle >> ANGLETOFINESHIFT));
|
||||
rightcos = FixedToFloat(FINECOSINE(interp.angle >> ANGLETOFINESHIFT));
|
||||
}
|
||||
else
|
||||
{
|
||||
rightsin = FixedToFloat(FINESINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
|
||||
rightcos = FixedToFloat(FINECOSINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
|
||||
}
|
||||
|
||||
z1 = tr_y + x1 * rightsin;
|
||||
z2 = tr_y - x2 * rightsin;
|
||||
x1 = tr_x + x1 * rightcos;
|
||||
x2 = tr_x - x2 * rightcos;
|
||||
//y1 = tr_y + y1 * rightcos;
|
||||
//y2 = tr_y - y2 * rightcos;
|
||||
|
||||
// store information in a vissprite
|
||||
vis = HWR_NewVisSprite();
|
||||
vis->x1 = x1;
|
||||
@@ -4925,7 +4975,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||
vis->dispoffset = thing->info->dispoffset; // Monster Iestyn: 23/11/15: HARDWARE SUPPORT AT LAST
|
||||
vis->flip = flip;
|
||||
|
||||
vis->scale = this_scale;
|
||||
vis->scale = thing_scale;
|
||||
vis->spritexscale = spritexscale;
|
||||
vis->spriteyscale = spriteyscale;
|
||||
vis->spritexoffset = FixedToFloat(spr_offset);
|
||||
@@ -4933,10 +4983,10 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||
|
||||
#ifdef ROTSPRITE
|
||||
if (rotsprite != NULL)
|
||||
vis->gpatch = (patch_t *)rotsprite;
|
||||
vis->gpatch = static_cast<patch_t *>(rotsprite);
|
||||
else
|
||||
#endif
|
||||
vis->gpatch = (patch_t *)W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE);
|
||||
vis->gpatch = static_cast<patch_t *>(W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE));
|
||||
|
||||
vis->mobj = thing;
|
||||
|
||||
@@ -4988,12 +5038,16 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
|
||||
float tr_x, tr_y;
|
||||
float tz;
|
||||
float x1, x2;
|
||||
float y1, y2;
|
||||
float z1, z2;
|
||||
float gz, gzt;
|
||||
float rightsin, rightcos;
|
||||
float this_scale;
|
||||
float thing_scale;
|
||||
spritedef_t *sprdef;
|
||||
spriteframe_t *sprframe;
|
||||
size_t lumpoff;
|
||||
fixed_t spr_width, spr_height;
|
||||
fixed_t spr_offset, spr_topoffset;
|
||||
unsigned rot = 0;
|
||||
UINT8 flip;
|
||||
|
||||
@@ -5024,7 +5078,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
|
||||
return;
|
||||
|
||||
// decide which patch to use for sprite relative to player
|
||||
if ((unsigned)thing->sprite >= numsprites)
|
||||
if (static_cast<unsigned>(thing->sprite) >= numsprites)
|
||||
{
|
||||
#ifdef RANGECHECK
|
||||
I_Error("HWR_ProjectPrecipitationSprite: invalid sprite number %i ",
|
||||
@@ -5036,7 +5090,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
|
||||
|
||||
sprdef = &sprites[thing->sprite];
|
||||
|
||||
if ((size_t)(thing->frame&FF_FRAMEMASK) >= sprdef->numframes)
|
||||
if (static_cast<size_t>((thing->frame&FF_FRAMEMASK)) >= sprdef->numframes)
|
||||
{
|
||||
#ifdef RANGECHECK
|
||||
I_Error("HWR_ProjectPrecipitationSprite: invalid sprite frame %i : %i for %s",
|
||||
@@ -5046,7 +5100,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
|
||||
#endif
|
||||
}
|
||||
|
||||
this_scale = FixedToFloat(interp.scale);
|
||||
thing_scale = FixedToFloat(interp.scale);
|
||||
|
||||
sprframe = &sprdef->spriteframes[thing->frame & FF_FRAMEMASK];
|
||||
|
||||
@@ -5054,22 +5108,46 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
|
||||
lumpoff = sprframe->lumpid[0];
|
||||
flip = sprframe->flip; // Will only be 0x00 or 0xFF
|
||||
|
||||
rightsin = FixedToFloat(FINESINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
|
||||
rightcos = FixedToFloat(FINECOSINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
|
||||
spr_width = spritecachedinfo[lumpoff].width;
|
||||
spr_height = spritecachedinfo[lumpoff].height;
|
||||
spr_offset = spritecachedinfo[lumpoff].offset;
|
||||
spr_topoffset = spritecachedinfo[lumpoff].topoffset;
|
||||
|
||||
if (flip)
|
||||
{
|
||||
x1 = FixedToFloat(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset);
|
||||
x2 = FixedToFloat(spritecachedinfo[lumpoff].offset);
|
||||
x1 = FixedToFloat(spr_width - spr_offset);
|
||||
x2 = FixedToFloat(spr_offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
x1 = FixedToFloat(spritecachedinfo[lumpoff].offset);
|
||||
x2 = FixedToFloat(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset);
|
||||
x1 = x2 = FixedToFloat(spr_offset);
|
||||
}
|
||||
|
||||
x1 *= this_scale;
|
||||
x2 *= this_scale;
|
||||
y1 = (FixedToFloat(spr_topoffset));
|
||||
y2 = (FixedToFloat(spr_height - spr_topoffset));
|
||||
|
||||
x1 *= thing_scale;
|
||||
x2 *= thing_scale;
|
||||
y1 *= thing_scale;
|
||||
y2 *= thing_scale;
|
||||
|
||||
if (!gld_SphereInFrustum(
|
||||
(FixedToFloat(interp.x)) + cos_inv_yaw * (x1 + x2) / 2.0f,
|
||||
FixedToFloat(interp.z) + (y1 + y2) / 2.0f,
|
||||
FixedToFloat(interp.y) - sin_inv_yaw * (x1 + x2) / 2.0f,
|
||||
//1.5 == sqrt(2) + small delta for MF_FOREGROUND
|
||||
std::max<float>(FixedToFloat(spr_width) * thing_scale,
|
||||
FixedToFloat(spr_height) * thing_scale) / 2.0f * 1.5f))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// set top/bottom coords
|
||||
gzt = FixedToFloat(interp.z) + y1;
|
||||
gz = gzt - (FixedToFloat(spr_height) * thing_scale);
|
||||
|
||||
rightsin = FixedToFloat(FINESINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
|
||||
rightcos = FixedToFloat(FINECOSINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
|
||||
|
||||
z1 = tr_y + x1 * rightsin;
|
||||
z2 = tr_y - x2 * rightsin;
|
||||
@@ -5086,7 +5164,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
|
||||
vis->z2 = z2;
|
||||
vis->tz = tz;
|
||||
vis->dispoffset = 0; // Monster Iestyn: 23/11/15: HARDWARE SUPPORT AT LAST
|
||||
vis->gpatch = (patch_t *)W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE);
|
||||
vis->gpatch = static_cast<patch_t *>(W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE));
|
||||
vis->flip = flip;
|
||||
vis->mobj = NULL;
|
||||
|
||||
@@ -5098,8 +5176,8 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
|
||||
#endif
|
||||
|
||||
// set top/bottom coords
|
||||
vis->gzt = FixedToFloat(interp.z) + (FixedToFloat(spritecachedinfo[lumpoff].topoffset) * this_scale);
|
||||
vis->gz = vis->gzt - (FixedToFloat(spritecachedinfo[lumpoff].height) * this_scale);
|
||||
vis->gzt = gzt;
|
||||
vis->gz = gz;
|
||||
|
||||
vis->precip = thing;
|
||||
}
|
||||
@@ -5113,11 +5191,10 @@ static gl_sky_t gl_sky;
|
||||
|
||||
static void HWR_SkyDomeVertex(gl_sky_t *sky, gl_skyvertex_t *vbo, int r, int c, signed char yflip, float delta, boolean foglayer)
|
||||
{
|
||||
static constexpr float radians = (float)(M_PIl / 180.0f);
|
||||
static constexpr float scale = 10000.0f;
|
||||
static constexpr float maxSideAngle = 60.0f * radians;
|
||||
static constexpr float maxSideAngle = 60.0f * deg2radians;
|
||||
|
||||
float topAngle = ((float)c / (float)sky->columns * 360.0f) * radians;
|
||||
float topAngle = ((float)c / (float)sky->columns * 360.0f) * deg2radians;
|
||||
float sideAngle = (maxSideAngle * (float)(sky->rows - r) / (float)sky->rows);
|
||||
float height = sinf(sideAngle);
|
||||
float realRadius = (scale * cosf(sideAngle));
|
||||
@@ -5175,7 +5252,6 @@ void HWR_ClearSkyDome(void)
|
||||
sky->rows = sky->columns = 0;
|
||||
sky->loopcount = 0;
|
||||
|
||||
sky->detail = 0;
|
||||
sky->texture = -1;
|
||||
sky->width = sky->height = 0;
|
||||
|
||||
@@ -5194,8 +5270,7 @@ void HWR_BuildSkyDome(void)
|
||||
gl_skyvertex_t *vertex_p;
|
||||
const texture_t *texture = textures[texturetranslation[skytexture]];
|
||||
|
||||
sky->detail = 16;
|
||||
col_count *= sky->detail;
|
||||
col_count *= 16;
|
||||
|
||||
if ((sky->columns != col_count) || (sky->rows != row_count))
|
||||
HWR_ClearSkyDome();
|
||||
@@ -5255,8 +5330,6 @@ void HWR_BuildSkyDome(void)
|
||||
}
|
||||
}
|
||||
|
||||
static boolean drewsky = false;
|
||||
|
||||
// precompute to save a bit of division
|
||||
static constexpr float FINEDEGREE = (360.0f/(float)FINEANGLES);
|
||||
|
||||
@@ -5264,7 +5337,7 @@ static void HWR_DrawSkyBackground(void)
|
||||
{
|
||||
FTransform dometransform;
|
||||
|
||||
if (drewsky || HWR_IsWireframeMode())
|
||||
if (HWR_IsWireframeMode())
|
||||
return;
|
||||
|
||||
GL_SetBlend(PF_Translucent|PF_NoDepthTest|PF_Modulated);
|
||||
@@ -5358,6 +5431,12 @@ void HWR_SetTransform(float fpov)
|
||||
HWR_SetTransformAiming(&atransform);
|
||||
atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(FINEDEGREE);
|
||||
|
||||
yaw = 270.0f - atransform.angley;
|
||||
inv_yaw = 180.0f - yaw;
|
||||
const float inv_yaw_radians = inv_yaw * deg2radians;
|
||||
cos_inv_yaw = cosf(inv_yaw_radians);
|
||||
sin_inv_yaw = sinf(inv_yaw_radians);
|
||||
|
||||
// only needed for sprite billboarding
|
||||
if (cv_glspritebillboarding.value && !cv_glshearing.value)
|
||||
{
|
||||
@@ -5390,6 +5469,7 @@ void HWR_SetTransform(float fpov)
|
||||
void HWR_ClearClipper(void)
|
||||
{
|
||||
const angle_t a1 = gld_FrustumAngle(gl_aimingangle);
|
||||
|
||||
gld_clipper_Clear();
|
||||
gld_clipper_SafeAddClipRange(viewangle + a1, viewangle - a1);
|
||||
#ifdef HAVE_SPHEREFRUSTRUM
|
||||
@@ -5415,15 +5495,22 @@ namespace
|
||||
};
|
||||
|
||||
template <RenderViewpointType Type>
|
||||
void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_level, boolean allow_portals)
|
||||
static void HWR_RenderViewpoint(gl_portal_t *rootportal, int stencil_level, boolean allow_portals)
|
||||
{
|
||||
gl_portallist_t portallist;
|
||||
|
||||
const float fpov = FixedToFloat(R_GetPlayerFov(player));
|
||||
const boolean skybox = (skyboxmo[0] && cv_skybox.value);
|
||||
player_t *viewplayer = &players[displayplayers[viewssnum]];
|
||||
const float fpov = FixedToFloat(R_GetPlayerFov(viewplayer));
|
||||
|
||||
auto reset_viewstate = [&](const float fpov)
|
||||
{
|
||||
HWR_SetTransform(fpov);
|
||||
HWR_ClearSprites();
|
||||
HWR_ClearClipper();
|
||||
};
|
||||
|
||||
portallist.base = portallist.cap = NULL;
|
||||
HWR_SetPortalState(GLPORTAL_OFF); // there may be portals and they need to be drawn as regural walls
|
||||
HWR_SetPortalState(GLPORTAL_OFF); // there may be portals and they need to be drawn as regular walls
|
||||
|
||||
if constexpr (Type == RenderViewpointType::kPortal)
|
||||
{
|
||||
@@ -5435,10 +5522,12 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
|
||||
currentportallist = &portallist;
|
||||
HWR_SetPortalState(GLPORTAL_SEARCH);
|
||||
|
||||
HWR_ClearClipper();
|
||||
reset_viewstate(fpov);
|
||||
|
||||
if (rootportal)
|
||||
{
|
||||
HWR_PortalClipping(rootportal);
|
||||
}
|
||||
|
||||
validcount++;
|
||||
|
||||
@@ -5449,7 +5538,7 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
|
||||
// note: if necessary, could sort the portals here?
|
||||
for (portal = portallist.base; portal; portal = portal->next)
|
||||
{
|
||||
HWR_RenderPortal(portal, rootportal, fpov, player, stencil_level);
|
||||
HWR_RenderPortal(portal, rootportal, fpov, stencil_level);
|
||||
}
|
||||
|
||||
HWR_SetPortalState(GLPORTAL_INSIDE); // when portal walls are encountered in following bsp traversal, nothing should be drawn
|
||||
@@ -5459,16 +5548,13 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
|
||||
// draw normal things in current frame in current incremented stencil buffer area
|
||||
HWR_SetStencilState(HWR_STENCIL_NORMAL, stencil_level);
|
||||
|
||||
HWR_SetTransform(fpov);
|
||||
|
||||
HWR_ClearSprites();
|
||||
HWR_ClearClipper();
|
||||
reset_viewstate(fpov);
|
||||
|
||||
if constexpr (Type == RenderViewpointType::kPortal)
|
||||
{
|
||||
if (allow_portals && rootportal)
|
||||
{
|
||||
HWR_PortalFrame(rootportal);// for portalclipsector, it could have gone null from search
|
||||
HWR_PortalFrame(rootportal); // for portalclipsector, it could have gone null from search
|
||||
HWR_PortalClipping(rootportal);
|
||||
}
|
||||
}
|
||||
@@ -5476,6 +5562,7 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
|
||||
if (HWR_IsWireframeMode())
|
||||
GL_SetSpecialState(HWD_SET_WIREFRAME, 1);
|
||||
|
||||
// FIXME: perfstats does not account for portal rendering!
|
||||
ps_numbspcalls.value.i = 0;
|
||||
ps_numpolyobjects.value.i = 0;
|
||||
PS_START_TIMING(ps_bsptime);
|
||||
@@ -5487,8 +5574,7 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
|
||||
|
||||
if constexpr (Type == RenderViewpointType::kPortal)
|
||||
{
|
||||
if (allow_portals && !rootportal && portallist.base && !skybox) // if portals have been drawn in the main view, then render skywalls differently
|
||||
gl_collect_skywalls = true;
|
||||
gl_collect_skywalls = (allow_portals && !rootportal && portallist.base && (!skyboxmo[0] || !cv_skybox.value)); // if portals have been drawn in the main view, then render skywalls differently
|
||||
|
||||
// HAYA: Save the old portal state, and turn portals off while normally rendering the BSP tree.
|
||||
// This fixes specific effects not working, such as horizon lines.
|
||||
@@ -5518,7 +5604,10 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
|
||||
PS_STOP_TIMING(ps_bsptime);
|
||||
|
||||
if (LIKELY(cv_glbatching.value))
|
||||
HWR_RenderBatches();
|
||||
HWR_RenderBatches(true);
|
||||
|
||||
// Check for new console commands.
|
||||
NetUpdate();
|
||||
|
||||
if constexpr (Type == RenderViewpointType::kPortal)
|
||||
{
|
||||
@@ -5528,13 +5617,13 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
|
||||
HWR_DrawSkyWallList();
|
||||
HWR_SkyWallList_Clear();
|
||||
HWR_SetStencilState(HWR_STENCIL_NORMAL, 1);
|
||||
drewsky = false;
|
||||
HWR_DrawSkyBackground();
|
||||
HWR_SetStencilState(HWR_STENCIL_NORMAL, 0);
|
||||
GL_ClearBuffer(false, false, true, NULL);// clear skywall markings from the stencil buffer
|
||||
HWR_SetTransform(fpov);// restore transform
|
||||
GL_ClearBuffer(false, false, true, NULL); // clear skywall markings from the stencil buffer
|
||||
HWR_SetTransform(fpov); // restore transform
|
||||
}
|
||||
}
|
||||
|
||||
gl_collect_skywalls = false;
|
||||
|
||||
ps_numsprites.value.i = gl_visspritecount;
|
||||
@@ -5542,15 +5631,20 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
|
||||
HWR_SortVisSprites();
|
||||
PS_STOP_TIMING(ps_hw_spritesorttime);
|
||||
PS_START_TIMING(ps_hw_spritedrawtime);
|
||||
if (LIKELY(cv_glbatching.value))
|
||||
HWR_StartBatching();
|
||||
if (UNLIKELY(cv_glmdls.value))
|
||||
HWR_DrawSprites<DrawSpritesType::kModels>();
|
||||
else
|
||||
HWR_DrawSprites<DrawSpritesType::kSprites>();
|
||||
PS_STOP_TIMING(ps_hw_spritedrawtime);
|
||||
if (LIKELY(cv_glbatching.value))
|
||||
HWR_RenderBatches(false);
|
||||
|
||||
ps_numdrawnodes.value.i = 0;
|
||||
ps_hw_nodesorttime.value.p = 0;
|
||||
ps_hw_nodedrawtime.value.p = 0;
|
||||
|
||||
HWR_RenderDrawNodes();
|
||||
|
||||
if (HWR_IsWireframeMode())
|
||||
@@ -5561,26 +5655,22 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
|
||||
};
|
||||
|
||||
extern "C" {
|
||||
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_level, boolean allow_portals) {
|
||||
HWR_RenderViewpoint<RenderViewpointType::kPortal>(rootportal, player, stencil_level, allow_portals);
|
||||
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, int stencil_level, boolean allow_portals) {
|
||||
HWR_RenderViewpoint<RenderViewpointType::kPortal>(rootportal, stencil_level, allow_portals);
|
||||
}
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
// Render the current frame.
|
||||
// ==========================================================================
|
||||
static void HWR_RenderFrame(player_t *player, boolean skybox)
|
||||
static void HWR_RenderFrame(boolean skybox, boolean drawsky)
|
||||
{
|
||||
// check for new console commands.
|
||||
NetUpdate();
|
||||
|
||||
// Clear view, set viewport (glViewport), set perspective...
|
||||
HWR_ClearView();
|
||||
|
||||
// Draw the sky background.
|
||||
HWR_DrawSkyBackground();
|
||||
if (skybox)
|
||||
drewsky = true;
|
||||
if (drawsky)
|
||||
HWR_DrawSkyBackground();
|
||||
|
||||
current_bsp_culling_distance = 0;
|
||||
|
||||
@@ -5596,26 +5686,17 @@ static void HWR_RenderFrame(player_t *player, boolean skybox)
|
||||
current_bsp_culling_distance = bsp_culling_distances[renderdist- 1];
|
||||
}
|
||||
|
||||
portalclipline = NULL;
|
||||
if (UNLIKELY(HWR_UsePortals()))
|
||||
HWR_RenderViewpoint<RenderViewpointType::kPortal>(NULL, player, 0, !skybox);
|
||||
else
|
||||
HWR_RenderViewpoint<RenderViewpointType::kNormal>(NULL, player, 0, !skybox);
|
||||
|
||||
// Unset transform and shader
|
||||
GL_SetTransform(NULL);
|
||||
GL_UnSetShader();
|
||||
|
||||
// Run post processor effects
|
||||
if (!skybox)
|
||||
HWR_DoPostProcessor(player);
|
||||
|
||||
// Check for new console commands.
|
||||
NetUpdate();
|
||||
|
||||
// added by Hurdler for correct splitscreen
|
||||
// moved here by hurdler so it works with the new near clipping plane
|
||||
GL_GClipRect(0, 0, vid.width, vid.height, NZCLIP_PLANE, FAR_ZCLIP_DEFAULT);
|
||||
portalclipline = NULL;
|
||||
if (UNLIKELY(HWR_UsePortals()))
|
||||
HWR_RenderViewpoint<RenderViewpointType::kPortal>(NULL, 0, !skybox);
|
||||
else
|
||||
HWR_RenderViewpoint<RenderViewpointType::kNormal>(NULL, 0, !skybox);
|
||||
|
||||
// Check for new console commands.
|
||||
NetUpdate();
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
@@ -5665,22 +5746,31 @@ void HWR_RenderPlayerView(void)
|
||||
if (viewssnum > 3)
|
||||
return;
|
||||
|
||||
player_t * player = &players[displayplayers[viewssnum]];
|
||||
const boolean skybox = (skyboxmo[0] && cv_skybox.value); // True if there's a skybox object and skyboxes are on
|
||||
|
||||
// Render the skybox if there is one.
|
||||
PS_START_TIMING(ps_skyboxtime);
|
||||
drewsky = false;
|
||||
if (skybox)
|
||||
{
|
||||
R_SkyboxFrame(viewssnum);
|
||||
HWR_RenderFrame(player, true);
|
||||
HWR_RenderFrame(true, true);
|
||||
}
|
||||
PS_STOP_TIMING(ps_skyboxtime);
|
||||
|
||||
R_SetupFrame(viewssnum, false); // This can stay false because it is only used to set viewsky in r_main.c, which isn't used here
|
||||
framecount++; // for timedemo
|
||||
HWR_RenderFrame(player, false);
|
||||
HWR_RenderFrame(false, !skybox);
|
||||
|
||||
// Unset transform and shader
|
||||
GL_SetTransform(NULL);
|
||||
GL_UnSetShader();
|
||||
|
||||
// Run post processor effects
|
||||
HWR_DoPostProcessor();
|
||||
|
||||
// added by Hurdler for correct splitscreen
|
||||
// moved here by hurdler so it works with the new near clipping plane
|
||||
GL_GClipRect(0, 0, vid.width, vid.height, NZCLIP_PLANE, FAR_ZCLIP_DEFAULT);
|
||||
}
|
||||
|
||||
void HWR_LoadLevel(void)
|
||||
@@ -5891,6 +5981,7 @@ void HWR_Shutdown(void)
|
||||
HWR_FreeExtraSubsectors();
|
||||
HWR_FreeMapTextures();
|
||||
GL_FlushScreenTextures();
|
||||
HWR_ClearAllTextures();
|
||||
#ifdef USE_FBO_OGL
|
||||
GL_Framebuffer_Disable();
|
||||
#endif
|
||||
@@ -5933,35 +6024,40 @@ static void HWR_RenderWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, FBITFIELD
|
||||
#endif
|
||||
}
|
||||
|
||||
static void HWR_DoPostProcessor(player_t *player)
|
||||
static void HWR_DoPostProcessor(void)
|
||||
{
|
||||
GL_UnSetShader();
|
||||
|
||||
// Armageddon Blast Flash!
|
||||
// Could this even be considered postprocessor?
|
||||
if (!HWR_PalRenderFlashpal() && player->flashcount)
|
||||
if (!HWR_PalRenderFlashpal())
|
||||
{
|
||||
FOutVector v[4];
|
||||
FSurfaceInfo Surf;
|
||||
const player_t *player = &players[displayplayers[viewssnum]];
|
||||
|
||||
v[0].x = v[2].y = v[3].x = v[3].y = -4.0f;
|
||||
v[0].y = v[1].x = v[1].y = v[2].x = 4.0f;
|
||||
v[0].z = v[1].z = v[2].z = v[3].z = 4.0f; // 4.0 because of the same reason as with the sky, just after the screen is cleared so near clipping plane is 3.99
|
||||
|
||||
// This won't change if the flash palettes are changed unfortunately, but it works for its purpose
|
||||
if (player->flashpal == PAL_NUKE)
|
||||
if (player->flashcount)
|
||||
{
|
||||
Surf.PolyColor.s.red = 0xff;
|
||||
Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0x7F; // The nuke palette is kind of pink-ish
|
||||
static FOutVector v[4] = {
|
||||
{-4.0f, 4.0f, 4.0f, 0.0f, 0.0f},
|
||||
{ 4.0f, 4.0f, 4.0f, 0.0f, 0.0f}, // 4.0 because of the same reason as with the sky, just after the screen is cleared so near clipping plane is 3.99
|
||||
{ 4.0f, -4.0f, 4.0f, 0.0f, 0.0f},
|
||||
{-4.0f, -4.0f, 4.0f, 0.0f, 0.0f}
|
||||
};
|
||||
|
||||
FSurfaceInfo Surf;
|
||||
|
||||
// This won't change if the flash palettes are changed unfortunately, but it works for its purpose
|
||||
if (player->flashpal == PAL_NUKE)
|
||||
{
|
||||
Surf.PolyColor.s.red = 0xff;
|
||||
Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0x7F; // The nuke palette is kind of pink-ish
|
||||
}
|
||||
else
|
||||
Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff;
|
||||
|
||||
Surf.PolyColor.s.alpha = 0xc0; // match software mode
|
||||
|
||||
V_CubeApply(&Surf.PolyColor);
|
||||
|
||||
GL_DrawPolygon(&Surf, v, 4, PF_Modulated|PF_Translucent|PF_NoTexture|PF_NoDepthTest);
|
||||
}
|
||||
else
|
||||
Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff;
|
||||
|
||||
Surf.PolyColor.s.alpha = 0xc0; // match software mode
|
||||
|
||||
V_CubeApply(&Surf.PolyColor);
|
||||
|
||||
GL_DrawPolygon(&Surf, v, 4, PF_Modulated|PF_Translucent|PF_NoTexture|PF_NoDepthTest);
|
||||
}
|
||||
|
||||
if (cv_glscreentextures.value != 2) // screen textures are needed for the rest of the effects
|
||||
|
||||
@@ -102,8 +102,7 @@ void HWR_SetViewSize(void);
|
||||
void HWR_AddCommands(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, player_t *player, int stencil_level, boolean allow_portals);
|
||||
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, int stencil_level, boolean allow_portals);
|
||||
|
||||
void HWR_ClearSkyDome(void);
|
||||
void HWR_BuildSkyDome(void);
|
||||
|
||||
@@ -38,7 +38,7 @@ void HWR_PortalClipping(gl_portal_t *portal)
|
||||
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);
|
||||
|
||||
@@ -120,8 +120,8 @@ void HWR_PortalFrame(gl_portal_t* portal)
|
||||
viewz = portal->viewz;
|
||||
|
||||
viewangle = portal->viewangle;
|
||||
//viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
|
||||
//viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
|
||||
viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
|
||||
viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
|
||||
|
||||
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.
|
||||
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
|
||||
HWR_SetTransform(fpov);
|
||||
@@ -170,7 +170,7 @@ void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float
|
||||
HWR_PortalFrame(portal);
|
||||
|
||||
// call HWR_RenderViewpoint
|
||||
HWR_RenderPortalViewpoint(portal, player, stencil_level + 1, true);
|
||||
HWR_RenderPortalViewpoint(portal, stencil_level + 1, true);
|
||||
|
||||
// return to current frame
|
||||
if (rootportal)
|
||||
|
||||
@@ -65,7 +65,7 @@ extern SINT8 gl_portal_state;
|
||||
// new thing
|
||||
extern gl_portallist_t *currentportallist;
|
||||
|
||||
static inline void HWR_SetPortalState (SINT8 state)
|
||||
static inline void HWR_SetPortalState(SINT8 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_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);
|
||||
|
||||
boolean HWR_PortalCheckPointSide(fixed_t x, fixed_t y);
|
||||
|
||||
@@ -127,7 +127,7 @@ GLuint gl_num_extensions;
|
||||
int majorGL = 0, minorGL = 0;
|
||||
|
||||
//Hurdler: 04/10/2000: added for the kick ass coronas as Boris wanted;-)
|
||||
static GLfloat modelMatrix[16];
|
||||
GLfloat modelMatrix[16] = {0};
|
||||
GLfloat projMatrix[16] = {0};
|
||||
static GLint viewport[4];
|
||||
|
||||
@@ -173,41 +173,7 @@ boolean supportstencil = false;
|
||||
// can know when the textures aren't there, as textures are always considered resident in their virtual memory
|
||||
static GLuint screenTextures[NUMSCREENTEXTURES] = {0};
|
||||
|
||||
// shortcut for ((float)1/i)
|
||||
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
|
||||
};
|
||||
#define byte2float(byte) (GLfloat)(byte / 255.0f)
|
||||
|
||||
// -----------------+
|
||||
// GL_DBG_Printf : Output debug messages to debug log if DEBUG_TO_FILE is defined,
|
||||
@@ -1023,11 +989,9 @@ boolean GL_CompileShader(int slot)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
gl_shaders[slot].program = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
gl_shaders[slot].program = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1069,6 +1033,7 @@ void GL_SetShader(int slot)
|
||||
GL_UnSetShader();
|
||||
return;
|
||||
}
|
||||
|
||||
if (gl_allowshaders)
|
||||
{
|
||||
gl_shader_t *next_shader = &gl_shaders[slot]; // the gl_shader_t we are going to switch to
|
||||
@@ -1130,7 +1095,7 @@ static void GL_SetNoTexture(void)
|
||||
// -----------------+
|
||||
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},
|
||||
{ 0.0f, 1.0f, 0.0f, 0.0f},
|
||||
@@ -1145,7 +1110,7 @@ static void GL_Perspective(GLfloat fovy, GLfloat aspect)
|
||||
return;
|
||||
}
|
||||
|
||||
const GLfloat focallength = (GLfloat)(1.0f / (GLfloat)tan(fovy * (GLfloat)M_PIl / 360.0f));
|
||||
const GLfloat focallength = (1.0f / tanf(fovy * M_PIf / 360.0f));
|
||||
|
||||
m[0][0] = focallength / aspect;
|
||||
m[1][1] = focallength;
|
||||
@@ -1160,7 +1125,7 @@ static void GL_Perspective(GLfloat fovy, GLfloat aspect)
|
||||
// -----------------+
|
||||
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);
|
||||
|
||||
// The screen textures need to be flushed if the width or height change so that they be remade for the correct size
|
||||
@@ -1193,7 +1158,9 @@ void GL_SetModelView(GLint w, GLint h)
|
||||
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)
|
||||
{
|
||||
// The desired screen texture resolution is too big for the player's GPU!
|
||||
@@ -1339,7 +1306,8 @@ void GL_DeleteTexture(GLMipmap_t *pTexInfo)
|
||||
|
||||
if (!pTexInfo)
|
||||
return;
|
||||
else if (pTexInfo->downloaded)
|
||||
|
||||
if (pTexInfo->downloaded)
|
||||
pglDeleteTextures(1, (GLuint *)&pTexInfo->downloaded);
|
||||
|
||||
while (head)
|
||||
@@ -1393,7 +1361,8 @@ void GL_Flush(void)
|
||||
TexCacheTail = TexCacheHead = NULL; //Hurdler: well, TexCacheHead is already NULL
|
||||
tex_downloaded = 0;
|
||||
|
||||
free(textureBuffer);
|
||||
if (textureBuffer)
|
||||
free(textureBuffer);
|
||||
textureBuffer = NULL;
|
||||
textureBufferSize = 0;
|
||||
}
|
||||
@@ -1547,6 +1516,7 @@ void GL_ClearBuffer(FBOOLEAN ColorMask, FBOOLEAN DepthMask, FBOOLEAN StencilMask
|
||||
|
||||
ClearMask |= GL_COLOR_BUFFER_BIT;
|
||||
}
|
||||
|
||||
if (DepthMask)
|
||||
{
|
||||
pglClearDepth(1.0f); //Hurdler: all that are permanen states
|
||||
@@ -1558,7 +1528,7 @@ void GL_ClearBuffer(FBOOLEAN ColorMask, FBOOLEAN DepthMask, FBOOLEAN StencilMask
|
||||
GL_SetBlend(DepthMask ? PF_Occlude | CurrentPolyFlags : CurrentPolyFlags&~PF_Occlude);
|
||||
|
||||
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);
|
||||
pglEnableClientState(GL_VERTEX_ARRAY); // We always use this one
|
||||
@@ -1602,18 +1572,21 @@ void GL_Draw2DLine(F2DCoord * v1, F2DCoord * v2, RGBA_t Color)
|
||||
pglEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
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
|
||||
// -----------------+
|
||||
// PF_Masked - we could use an ALPHA_TEST of GL_EQUAL, and alpha ref of 0,
|
||||
// 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)
|
||||
{
|
||||
@@ -1762,14 +1735,6 @@ void GL_SetBlend(FBITFIELD PolyFlags)
|
||||
|
||||
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)
|
||||
{ // mix texture colour with Surface->PolyColor
|
||||
pglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||
@@ -2143,7 +2108,8 @@ void GL_SetTexture(GLMipmap_t *pTexInfo)
|
||||
GL_SetNoTexture();
|
||||
return;
|
||||
}
|
||||
else if (pTexInfo->downloaded)
|
||||
|
||||
if (pTexInfo->downloaded)
|
||||
{
|
||||
if (pTexInfo->downloaded != tex_downloaded)
|
||||
{
|
||||
@@ -2419,38 +2385,38 @@ static void GL_PreparePolygon(FSurfaceInfo *pSurf, FBITFIELD PolyFlags)
|
||||
|
||||
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 (CurrentPolyFlags & (PF_Modulated | PF_ColorMapped))
|
||||
{
|
||||
poly.red = byte2float[pSurf->PolyColor.s.red];
|
||||
poly.green = byte2float[pSurf->PolyColor.s.green];
|
||||
poly.blue = byte2float[pSurf->PolyColor.s.blue];
|
||||
poly.alpha = byte2float[pSurf->PolyColor.s.alpha];
|
||||
}
|
||||
// If modulated, mix the surface colour to the texture
|
||||
if (CurrentPolyFlags & PF_Modulated)
|
||||
pglColor4ubv((GLubyte*)&pSurf->PolyColor.s);
|
||||
|
||||
// Only if the surface is colormapped
|
||||
if (CurrentPolyFlags & PF_ColorMapped)
|
||||
{
|
||||
tint.red = byte2float[pSurf->TintColor.s.red];
|
||||
tint.green = byte2float[pSurf->TintColor.s.green];
|
||||
tint.blue = byte2float[pSurf->TintColor.s.blue];
|
||||
tint.alpha = byte2float[pSurf->TintColor.s.alpha];
|
||||
poly.red = byte2float(pSurf->PolyColor.s.red);
|
||||
poly.green = byte2float(pSurf->PolyColor.s.green);
|
||||
poly.blue = byte2float(pSurf->PolyColor.s.blue);
|
||||
poly.alpha = byte2float(pSurf->PolyColor.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)
|
||||
// Only if the surface is colormapped
|
||||
if (CurrentPolyFlags & PF_ColorMapped)
|
||||
{
|
||||
pglActiveTexture(GL_TEXTURE2);
|
||||
pglBindTexture(GL_TEXTURE_2D, pSurf->LightTableId);
|
||||
pglActiveTexture(GL_TEXTURE0);
|
||||
lt_downloaded = pSurf->LightTableId;
|
||||
tint.red = byte2float(pSurf->TintColor.s.red);
|
||||
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);
|
||||
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 +2928,24 @@ void GL_DrawModelEx(model_t *model, INT32 frameIndex, float duration, float tics
|
||||
pol = 0.0f;
|
||||
}
|
||||
|
||||
poly.red = byte2float[Surface->PolyColor.s.red];
|
||||
poly.green = byte2float[Surface->PolyColor.s.green];
|
||||
poly.blue = byte2float[Surface->PolyColor.s.blue];
|
||||
poly.alpha = byte2float[Surface->PolyColor.s.alpha];
|
||||
poly.red = byte2float(Surface->PolyColor.s.red);
|
||||
poly.green = byte2float(Surface->PolyColor.s.green);
|
||||
poly.blue = byte2float(Surface->PolyColor.s.blue);
|
||||
poly.alpha = byte2float(Surface->PolyColor.s.alpha);
|
||||
|
||||
pglColor4ubv((GLubyte*)&Surface->PolyColor.s);
|
||||
|
||||
GL_SetBlend(((poly.alpha < 1) ? Surface->PolyFlags : (PF_Masked|PF_Occlude))|PF_Modulated);
|
||||
|
||||
tint.red = byte2float[Surface->TintColor.s.red];
|
||||
tint.green = byte2float[Surface->TintColor.s.green];
|
||||
tint.blue = byte2float[Surface->TintColor.s.blue];
|
||||
tint.alpha = byte2float[Surface->TintColor.s.alpha];
|
||||
tint.red = byte2float(Surface->TintColor.s.red);
|
||||
tint.green = byte2float(Surface->TintColor.s.green);
|
||||
tint.blue = byte2float(Surface->TintColor.s.blue);
|
||||
tint.alpha = byte2float(Surface->TintColor.s.alpha);
|
||||
|
||||
fade.red = byte2float[Surface->FadeColor.s.red];
|
||||
fade.green = byte2float[Surface->FadeColor.s.green];
|
||||
fade.blue = byte2float[Surface->FadeColor.s.blue];
|
||||
fade.alpha = byte2float[Surface->FadeColor.s.alpha];
|
||||
fade.red = byte2float(Surface->FadeColor.s.red);
|
||||
fade.green = byte2float(Surface->FadeColor.s.green);
|
||||
fade.blue = byte2float(Surface->FadeColor.s.blue);
|
||||
fade.alpha = byte2float(Surface->FadeColor.s.alpha);
|
||||
|
||||
if (Surface->LightTableId && Surface->LightTableId != lt_downloaded)
|
||||
{
|
||||
@@ -3196,11 +3162,13 @@ void GL_SetTransform(FTransform *stransform)
|
||||
|
||||
if (special_splitscreen)
|
||||
{
|
||||
used_fov = (atanf(tanf(used_fov * (float)M_PI / 360.0f) * 0.8f) * 360.0f / (float)M_PI);
|
||||
used_fov = (atanf(tanf(used_fov * M_PIf / 360.0f) * 0.8f) * 360.0f / M_PIf);
|
||||
GL_Perspective(used_fov, 2*ASPECT_RATIO);
|
||||
}
|
||||
else
|
||||
{
|
||||
GL_Perspective(used_fov, ASPECT_RATIO);
|
||||
}
|
||||
|
||||
pglGetFloatv(GL_PROJECTION_MATRIX, projMatrix); // added for new coronas' code (without depth buffer)
|
||||
pglMatrixMode(GL_MODELVIEW);
|
||||
@@ -3334,8 +3302,8 @@ void GL_Framebuffer_Disable(void)
|
||||
// delet our fbo
|
||||
if (framebufferobject.fboobj)
|
||||
pglDeleteFramebuffers(1, &framebufferobject.fboobj);
|
||||
|
||||
framebufferobject.fboobj = 0;
|
||||
|
||||
GL_Framebuffer_DeleteAttachments();
|
||||
}
|
||||
#endif
|
||||
@@ -3465,7 +3433,7 @@ void GL_FlushScreenTextures(void)
|
||||
|
||||
void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags)
|
||||
{
|
||||
float fix[8];
|
||||
static float fix[8];
|
||||
float xfix, yfix;
|
||||
|
||||
if (gl_enable_screen_textures != 2)
|
||||
@@ -3474,14 +3442,8 @@ void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags)
|
||||
xfix = 1/((float)screen_texsizew/(float)screen_width);
|
||||
yfix = 1/((float)screen_texsizeh/(float)screen_height);
|
||||
|
||||
fix[0] = 0.0f;
|
||||
fix[1] = 0.0f;
|
||||
fix[2] = 0.0f;
|
||||
fix[3] = yfix;
|
||||
fix[4] = xfix;
|
||||
fix[5] = yfix;
|
||||
fix[6] = xfix;
|
||||
fix[7] = 0.0f;
|
||||
fix[3] = fix[5] = yfix;
|
||||
fix[4] = fix[6] = xfix;
|
||||
|
||||
pglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
@@ -3715,7 +3677,13 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean usesh
|
||||
float origaspect, newaspect;
|
||||
float xoff = 1, yoff = 1; // xoffset and yoffset for the polygon to have black bars around the screen
|
||||
|
||||
static float off[12];
|
||||
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 fix[8];
|
||||
|
||||
if (gl_enable_screen_textures != 2)
|
||||
@@ -3739,28 +3707,14 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean usesh
|
||||
}
|
||||
|
||||
// float off[12];
|
||||
off[0] = -xoff;
|
||||
off[1] = -yoff;
|
||||
off[2] = 1.0f;
|
||||
off[3] = -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;
|
||||
off[0] = off[3] = -xoff;
|
||||
off[1] = off[10] = -yoff;
|
||||
off[4] = off[7] = yoff;
|
||||
off[6] = off[9] = xoff;
|
||||
|
||||
// float fix[8];
|
||||
fix[0] = 0.0f;
|
||||
fix[1] = 0.0f;
|
||||
fix[2] = 0.0f;
|
||||
fix[3] = yfix;
|
||||
fix[4] = xfix;
|
||||
fix[5] = yfix;
|
||||
fix[6] = xfix;
|
||||
fix[7] = 0.0f;
|
||||
fix[3] = fix[5] = yfix;
|
||||
fix[4] = fix[6] = xfix;
|
||||
|
||||
pglViewport(0, 0, width, height);
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ extern "C" {
|
||||
#ifdef HAVE_SDL
|
||||
#define _MATH_DEFINES_DEFINED
|
||||
|
||||
#include "SDL_opengl.h" //Alam_GBC: Simple, yes?
|
||||
#include <SDL3/SDL_opengl.h> //Alam_GBC: Simple, yes?
|
||||
|
||||
#else
|
||||
#include <GL/gl.h>
|
||||
@@ -38,8 +38,6 @@ extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define _CREATE_DLL_ // necessary for Unix AND Windows
|
||||
|
||||
#include "../../doomdef.h"
|
||||
#include "../hw_gl.h"
|
||||
#include "../../z_zone.h"
|
||||
@@ -69,7 +67,6 @@ extern boolean supportstencil;
|
||||
void *GetGLFunc(const char *proc);
|
||||
boolean SetupGLfunc(void);
|
||||
void SetupGLFunc4(void);
|
||||
void GL_Flush(void);
|
||||
INT32 GL_isExtAvailable(const char *extension, const GLubyte *start);
|
||||
void GL_SetModelView(GLint w, GLint h);
|
||||
void GL_SetStates(void);
|
||||
@@ -127,18 +124,9 @@ extern GLint maximumAnisotropy;
|
||||
extern boolean supportNPO2tex;
|
||||
extern boolean supportMipMap;
|
||||
|
||||
/** \brief OpenGL flags for video driver
|
||||
*/
|
||||
extern INT32 oglflags;
|
||||
|
||||
extern GLfloat modelMatrix[16];
|
||||
extern GLfloat projMatrix[16];
|
||||
|
||||
typedef enum
|
||||
{
|
||||
GLF_NOZBUFREAD = 0x01,
|
||||
GLF_NOTEXENV = 0x02,
|
||||
} oglflags_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
+101
-52
@@ -88,6 +88,8 @@ patch_t *ranknum[10] = {}; // rank numbers
|
||||
patch_t *framecounter = NULL;
|
||||
patch_t *frameslash = NULL; // framerate stuff. Used in screen.c
|
||||
|
||||
patch_t *srb2back = NULL;
|
||||
|
||||
static player_t *plr = NULL;
|
||||
boolean chat_on = false; // entering a chat message?
|
||||
static char w_chat_buf[HU_MAXMSGLEN + 1];
|
||||
@@ -96,10 +98,9 @@ static boolean headsupactive = false;
|
||||
boolean hu_showscores = false; // draw rankings
|
||||
static char hu_tick;
|
||||
static tic_t hu_emoteanim = 0;
|
||||
#define MAXEMOTESUGGESTIONS 8
|
||||
static emote_t *emote_suggestions[MAXEMOTESUGGESTIONS] = {0};
|
||||
emote_autocomplete_t emote_autocomplete = {0};
|
||||
|
||||
static huddrawlist_h luahuddrawlist_scores;
|
||||
static huddrawlist_h luahuddrawlist_scores = NULL;
|
||||
|
||||
patch_t *rflagico = NULL;
|
||||
patch_t *bflagico = NULL;
|
||||
@@ -291,6 +292,7 @@ void HU_LoadGraphics(void)
|
||||
return;
|
||||
|
||||
j = HU_FONTSTART;
|
||||
|
||||
for (i = 0; i < HU_FONTSIZE; i++, j++)
|
||||
{
|
||||
// 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);
|
||||
}
|
||||
|
||||
//cache numbers too!
|
||||
// cache numbers too!
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
sprintf(buffer, "STTNUM%d", i);
|
||||
tallnum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||
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);
|
||||
ranknum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX);
|
||||
ranknum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||
}
|
||||
|
||||
// minus for negative tallnums
|
||||
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:
|
||||
for (i = 0; i < 5; i++)
|
||||
@@ -384,12 +386,15 @@ void HU_LoadGraphics(void)
|
||||
pinggfx[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||
}
|
||||
|
||||
pingmeasure[0] = W_CachePatchName("PINGD", PU_HUDGFX);
|
||||
pingmeasure[1] = W_CachePatchName("PINGMS", PU_HUDGFX);
|
||||
pingmeasure[0] = (patch_t *)W_CachePatchName("PINGD", PU_HUDGFX);
|
||||
pingmeasure[1] = (patch_t *)W_CachePatchName("PINGMS", PU_HUDGFX);
|
||||
|
||||
// fps stuff
|
||||
framecounter = W_CachePatchName("FRAMER", PU_HUDGFX);
|
||||
frameslash = W_CachePatchName("FRAMESL", PU_HUDGFX);;
|
||||
framecounter = (patch_t *)W_CachePatchName("FRAMER", 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
|
||||
@@ -406,8 +411,10 @@ void HU_Init(void)
|
||||
// set shift translation table
|
||||
shiftxform = english_shiftxform;
|
||||
|
||||
luahuddrawlist_scores = LUA_HUD_CreateDrawList();
|
||||
if (dedicated || rendermode == render_none)
|
||||
return;
|
||||
|
||||
luahuddrawlist_scores = LUA_HUD_CreateDrawList();
|
||||
HU_LoadGraphics();
|
||||
}
|
||||
|
||||
@@ -589,12 +596,12 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
||||
}
|
||||
|
||||
// Only servers/admins can CSAY.
|
||||
if(!server && !(IsPlayerAdmin(consoleplayer)))
|
||||
if (!server && !(IsPlayerAdmin(consoleplayer)))
|
||||
flags &= ~HU_CSAY;
|
||||
|
||||
// We handle HU_SERVER_SAY, not the caller.
|
||||
flags &= ~HU_SERVER_SAY;
|
||||
if(dedicated && !(flags & HU_CSAY))
|
||||
if (dedicated && !(flags & HU_CSAY))
|
||||
flags |= HU_SERVER_SAY;
|
||||
|
||||
buf[0] = target;
|
||||
@@ -608,17 +615,20 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
||||
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
|
||||
// with that logic, characters 4 and 5 are our numbers:
|
||||
const char *newmsg;
|
||||
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);
|
||||
nodenum[2] = '\0';
|
||||
|
||||
// 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
|
||||
if (nodenum[1] == ' ')
|
||||
@@ -627,23 +637,21 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
|
||||
else
|
||||
{
|
||||
HU_AddChatText("\x82NOTICE: \x80Invalid command format. Correct format is \'/pm<node> \'.", false);
|
||||
free(nodenum);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// I'm very bad at C, I swear I am, additional checks eww!
|
||||
if (spc != 0)
|
||||
{
|
||||
if (msg[5] != ' ')
|
||||
{
|
||||
HU_AddChatText("\x82NOTICE: \x80Invalid command format. Correct format is \'/pm<node> \'.", false);
|
||||
free(nodenum);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
target = atoi((const char*) nodenum); // turn that into a number
|
||||
free(nodenum);
|
||||
//CONS_Printf("%d\n", target);
|
||||
|
||||
// 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
|
||||
return;
|
||||
}
|
||||
|
||||
buf[0] = target;
|
||||
newmsg = msg+5+spc;
|
||||
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.
|
||||
@@ -910,10 +919,12 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
|
||||
return;
|
||||
}
|
||||
|
||||
const size_t msglength = strlen(msg);
|
||||
|
||||
//check for invalid characters (0x80 or above)
|
||||
{
|
||||
size_t i;
|
||||
const size_t j = strlen(msg);
|
||||
const size_t j = msglength;
|
||||
for (i = 0; i < j; i++)
|
||||
{
|
||||
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.
|
||||
if (target == 0 && strlen(msg) > 4 && strnicmp(msg, "/me ", 4) == 0)
|
||||
if (target == 0 && msglength > 4 && strnicmp(msg, "/me ", 4) == 0)
|
||||
{
|
||||
msg += 4;
|
||||
action = true;
|
||||
@@ -1142,10 +1153,12 @@ static boolean HU_clearChatSpaces(void)
|
||||
size_t i = 0; // Used to just check our message
|
||||
char c; // current character we're iterating.
|
||||
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];
|
||||
|
||||
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.
|
||||
|
||||
@@ -1154,6 +1167,7 @@ static boolean HU_clearChatSpaces(void)
|
||||
nothingbutspaces = false;
|
||||
}
|
||||
}
|
||||
|
||||
return nothingbutspaces;
|
||||
}
|
||||
|
||||
@@ -1200,11 +1214,11 @@ static void HU_SendChatMessage(void)
|
||||
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);
|
||||
else
|
||||
HU_AddChatText("\x82NOTICE: \x80Usage: /mute <name|node>", false);
|
||||
@@ -1212,7 +1226,7 @@ static void HU_SendChatMessage(void)
|
||||
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.
|
||||
const char *newmsg;
|
||||
@@ -1334,6 +1348,7 @@ boolean HU_Responder(event_t *ev)
|
||||
chat_on = true;
|
||||
w_chat_buf[0] = 0;
|
||||
M_TextInputInit(&w_chat, w_chat_buf, sizeof w_chat_buf);
|
||||
memset(&emote_autocomplete, 0, sizeof(emote_autocomplete));
|
||||
teamtalk = false;
|
||||
chat_scrollmedown = true;
|
||||
typelines = 1;
|
||||
@@ -1346,6 +1361,7 @@ boolean HU_Responder(event_t *ev)
|
||||
chat_on = true;
|
||||
w_chat_buf[0] = 0;
|
||||
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.
|
||||
chat_scrollmedown = true;
|
||||
typelines = 1;
|
||||
@@ -1371,9 +1387,9 @@ boolean HU_Responder(event_t *ev)
|
||||
&& ev->data1 != gamecontrol[0][gc_talkkey][1]))
|
||||
return false;
|
||||
|
||||
M_TextInputHandleEmotes(&w_chat, c, emote_suggestions, MAXEMOTESUGGESTIONS);
|
||||
|
||||
if (c == KEY_ENTER)
|
||||
if (M_TextInputHandleEmotes(&w_chat, c, &emote_autocomplete))
|
||||
; // Do nothing
|
||||
else if (c == KEY_ENTER)
|
||||
{
|
||||
chat_on = false;
|
||||
chat_scrollmedown = true; // you hit enter, so you might wanna autoscroll to see what you just sent. :)
|
||||
@@ -1410,8 +1426,6 @@ boolean HU_Responder(event_t *ev)
|
||||
// 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.
|
||||
// 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.
|
||||
@@ -1614,7 +1628,7 @@ static void HU_drawMiniChat(void)
|
||||
if (cv_chatbacktint.value) // on request of wolfy
|
||||
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;
|
||||
|
||||
j += emotelen;
|
||||
@@ -1724,7 +1738,7 @@ static void HU_drawChatLog(INT32 offset)
|
||||
{
|
||||
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, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||
dx += EMOTEWIDTH - charwidth;
|
||||
}
|
||||
j += emotelen;
|
||||
@@ -1864,7 +1878,7 @@ static void HU_DrawChat(void)
|
||||
|
||||
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;
|
||||
i += emotelen-1;
|
||||
drawwidth = EMOTEWIDTH;
|
||||
@@ -1901,17 +1915,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
|
||||
INT32 suggesty = chaty - charheight - 1;
|
||||
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
|
||||
if (splitscreen)
|
||||
{
|
||||
@@ -1923,11 +1957,19 @@ static void HU_DrawChat(void)
|
||||
#endif
|
||||
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_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);
|
||||
V_DrawFillConsoleMap(chatx + boxw + 2, suggesty - (7*skip), (longest_suggestion_length+2)*4 + EMOTEWIDTH, 6, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||
|
||||
// Highlight currently suggested emote
|
||||
int hlflag = 0;
|
||||
if (skip == emote_autocomplete.skip && emote_autocomplete.complete[0])
|
||||
hlflag = V_YELLOWMAP;
|
||||
|
||||
V_DrawSmallString(chatx + boxw + 4 + EMOTEWIDTH, suggesty - (7*skip), hlflag|V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, va(":%s:", suggest->name));
|
||||
M_DrawEmote(chatx + boxw + 2, suggesty - skip*7, suggest, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
|
||||
|
||||
++skip;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1956,7 +1998,7 @@ static void HU_DrawChat(void)
|
||||
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])
|
||||
continue;
|
||||
@@ -2062,15 +2104,15 @@ static void HU_DrawChat_Old(void)
|
||||
i = 0;
|
||||
while (w_chat_buf[i])
|
||||
{
|
||||
if (w_chat.cursor == (i+1) && 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);
|
||||
}
|
||||
int emotelen;
|
||||
emote_t *emote;
|
||||
|
||||
//Hurdler: isn't it better like that?
|
||||
if (w_chat_buf[i] >= HU_FONTSTART)
|
||||
if ((emote = M_VerifyEmote(w_chat_buf+i, &emotelen)))
|
||||
{
|
||||
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;
|
||||
V_DrawCharacter(HU_INPUTX + c, y, w_chat_buf[i] | cv_constextsize.value | V_NOSCALESTART | t, !cv_allcaps.value);
|
||||
@@ -2082,6 +2124,13 @@ static void HU_DrawChat_Old(void)
|
||||
|
||||
++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;
|
||||
if (c >= vid.width)
|
||||
{
|
||||
|
||||
@@ -90,6 +90,7 @@ extern patch_t *pinggfx[5];
|
||||
extern patch_t *ranknum[10];
|
||||
extern patch_t *framecounter;
|
||||
extern patch_t *frameslash;
|
||||
extern patch_t *srb2back;
|
||||
extern patch_t *lt_font[LT_FONTSIZE];
|
||||
extern patch_t *cred_font[CRED_FONTSIZE];
|
||||
extern patch_t *rflagico;
|
||||
|
||||
@@ -158,8 +158,6 @@ UINT32 I_GetSongLoopPoint(void);
|
||||
boolean I_SetSongPosition(UINT32 position);
|
||||
UINT32 I_GetSongPosition(void);
|
||||
|
||||
void I_UpdateSongLagThreshold (void);
|
||||
|
||||
/// ------------------------
|
||||
// MUSIC PLAYBACK
|
||||
/// ------------------------
|
||||
|
||||
+2
-18
@@ -95,16 +95,13 @@ INT32 VID_SetMode(INT32 modenum);
|
||||
*/
|
||||
const char *VID_GetModeName(INT32 modenum);
|
||||
|
||||
void VID_RefreshModeList(void);
|
||||
void VID_PrepareModeList(void);
|
||||
|
||||
/** \brief can video system do fullscreen
|
||||
*/
|
||||
extern boolean allow_fullscreen;
|
||||
|
||||
/** \brief Update video system without updating frame
|
||||
*/
|
||||
void I_UpdateNoBlit(void);
|
||||
|
||||
/** \brief Update video system with updating frame
|
||||
*/
|
||||
void I_FinishUpdate(void);
|
||||
@@ -113,13 +110,6 @@ void I_FinishUpdate(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
|
||||
|
||||
@@ -129,16 +119,10 @@ void I_WaitVBL(INT32 count);
|
||||
*/
|
||||
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);
|
||||
|
||||
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height);
|
||||
boolean I_CheckNativeRes(void);
|
||||
|
||||
void I_SetBorderlessWindow(void);
|
||||
|
||||
+51
-4
@@ -1076,6 +1076,49 @@ static void K_initKartHUD(void)
|
||||
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)
|
||||
{
|
||||
if (cv_colorizedhud.value && cv_colorizedhudcolor.value)
|
||||
@@ -2860,7 +2903,7 @@ static boolean K_GetScreenCoords(vector2_t *vec, player_t *player, mobj_t *targe
|
||||
|
||||
// X coordinate
|
||||
// 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);
|
||||
if (!distfact) distfact = 1;
|
||||
@@ -4387,8 +4430,10 @@ static void K_drawLapStartAnim(void)
|
||||
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
|
||||
INT32 vflags = V_SNAPTOTOP|V_HUDTRANS;
|
||||
|
||||
fixed_t slideout = max(0, 32*(((progress - 76)*FRACUNIT) + R_GetTimeFrac(RTF_LEVEL)));
|
||||
fixed_t slidein = max(0, 32*(((stplyr->kartstuff[k_lapanimation] - 76)*FRACUNIT) - R_GetTimeFrac(RTF_LEVEL)));
|
||||
fixed_t slideout = 32*(((progress - 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
|
||||
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);
|
||||
|
||||
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 frame = min(2, progress/2 - 8 - (i*2));
|
||||
|
||||
+2
-2
@@ -24,7 +24,6 @@ extern "C" {
|
||||
UINT8 K_GetHudColor(void);
|
||||
boolean K_UseColorHud(void);
|
||||
boolean K_UseHighResPortraits(void);
|
||||
patch_t *K_GetFacePrefix(player_t *player, INT32 skinnum);
|
||||
|
||||
void K_RegisterKartHudStuff(void);
|
||||
|
||||
@@ -35,7 +34,6 @@ extern consvar_t cv_colorizedhud,
|
||||
extern consvar_t cv_darkitembox;
|
||||
extern consvar_t cv_biglaps;
|
||||
extern consvar_t cv_highresportrait;
|
||||
extern consvar_t cv_stat_xoffset, cv_stat_yoffset;
|
||||
extern consvar_t cv_showstats;
|
||||
extern consvar_t cv_fancyroulette;
|
||||
extern consvar_t cv_showlaptimes;
|
||||
@@ -52,6 +50,8 @@ extern CV_PossibleValue_t inputdisplay_cons_t[NUMINPUTDISPLAYSTUFF];
|
||||
#define NUMMINIMAPDOTSTUFF 5
|
||||
extern CV_PossibleValue_t minimapdot_cons_t[NUMMINIMAPDOTSTUFF];
|
||||
|
||||
void K_KartPlayerHUDUpdate(player_t *player);
|
||||
|
||||
const char *K_GetItemPatch(UINT8 item, boolean tiny);
|
||||
INT32 K_calcSplitFlags(INT32 snapflags);
|
||||
void K_LoadKartHUDGraphics(void);
|
||||
|
||||
+46
-70
@@ -98,8 +98,6 @@ static void saltyhop_onchange(void)
|
||||
}
|
||||
}
|
||||
|
||||
static boolean K_SpeedLinesShouldBlend(player_t *player);
|
||||
|
||||
// SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H:
|
||||
// gamespeed is cc (0 for easy, 1 for normal, 2 for hard)
|
||||
// franticitems is Frantic Mode items, bool
|
||||
@@ -811,8 +809,10 @@ boolean K_IsPlayerLosing(player_t *player)
|
||||
boolean K_IsPlayerWanted(player_t *player)
|
||||
{
|
||||
UINT8 i;
|
||||
if (!(G_BattleGametype()))
|
||||
|
||||
if (!G_BattleGametype())
|
||||
return false;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if (battlewanted[i] == -1)
|
||||
@@ -820,6 +820,7 @@ boolean K_IsPlayerWanted(player_t *player)
|
||||
if (player == &players[battlewanted[i]])
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1244,7 +1245,9 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
||||
{
|
||||
if (!playeringame[i] || players[i].spectator)
|
||||
continue;
|
||||
|
||||
pingame++;
|
||||
|
||||
if (players[i].exiting)
|
||||
dontforcespb = true;
|
||||
if (players[i].kartstuff[k_bumper] > bestbumper)
|
||||
@@ -1258,13 +1261,11 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
||||
// This makes the roulette produce the random noises.
|
||||
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++)
|
||||
{
|
||||
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]));
|
||||
@@ -1363,8 +1364,9 @@ static fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against)
|
||||
else
|
||||
{
|
||||
weight = (mobj->player->kartweight)<<FRACBITS;
|
||||
if (mobj->player->speed > K_GetKartSpeed(mobj->player, false))
|
||||
weight += (mobj->player->speed - K_GetKartSpeed(mobj->player, false))/8;
|
||||
const fixed_t kartspeed = K_GetKartSpeed(mobj->player, false);
|
||||
if (mobj->player->speed > kartspeed)
|
||||
weight += (mobj->player->speed - kartspeed)/8;
|
||||
}
|
||||
break;
|
||||
case MT_FALLINGROCK:
|
||||
@@ -1486,9 +1488,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 (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 normalisedy = FixedDiv(momdify, momdiflength);
|
||||
momdifx = FixedMul((25*mapobjectscale), normalisedx);
|
||||
@@ -1652,7 +1654,7 @@ static void K_UpdateOffroad(player_t *player)
|
||||
// If you are in offroad, a timer starts.
|
||||
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);
|
||||
|
||||
if (player->kartstuff[k_offroad] > 0)
|
||||
@@ -2396,7 +2398,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
|
||||
|| (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);
|
||||
return;
|
||||
@@ -2441,6 +2443,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
|
||||
P_SetScale(karmahitbox, player->mo->scale);
|
||||
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
||||
}
|
||||
|
||||
player->kartstuff[k_bumper]--;
|
||||
if (K_IsPlayerWanted(player))
|
||||
K_CalculateBattleWanted();
|
||||
@@ -2575,6 +2578,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor)
|
||||
P_SetScale(karmahitbox, player->mo->scale);
|
||||
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
||||
}
|
||||
|
||||
player->kartstuff[k_bumper]--;
|
||||
if (K_IsPlayerWanted(player))
|
||||
K_CalculateBattleWanted();
|
||||
@@ -2694,6 +2698,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
|
||||
P_SetScale(karmahitbox, player->mo->scale);
|
||||
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
||||
}
|
||||
|
||||
player->kartstuff[k_bumper]--;
|
||||
if (K_IsPlayerWanted(player))
|
||||
K_CalculateBattleWanted();
|
||||
@@ -2854,9 +2859,9 @@ void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32
|
||||
for (i = 0; i < number; i++)
|
||||
{
|
||||
fa = (i*degrees);
|
||||
v[0] = FixedMul(FINECOSINE(fa),radius);
|
||||
v[0] = FixedMul(FINECOSINE(fa), radius);
|
||||
v[1] = 0;
|
||||
v[2] = FixedMul(FINESINE(fa),radius);
|
||||
v[2] = FixedMul(FINESINE(fa), radius);
|
||||
v[3] = FRACUNIT;
|
||||
|
||||
res = VectorMatrixMultiply(v, *RotateXMatrix(rotangle));
|
||||
@@ -3425,7 +3430,7 @@ boolean K_CheckSlopeRollDist(mobj_t *mobj)
|
||||
return true;
|
||||
|
||||
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);
|
||||
}
|
||||
@@ -3606,7 +3611,7 @@ void K_SpawnSparkleTrail(mobj_t *mo)
|
||||
|
||||
sparkle->color = mo->color;
|
||||
|
||||
if (cv_playerblendeffects.value && mo->player && K_SpeedLinesShouldBlend(mo->player))
|
||||
if (mo->player && K_PlayerEffectsShouldBlend(mo->player))
|
||||
sparkle->blendmode = AST_ADD;
|
||||
}
|
||||
|
||||
@@ -3980,15 +3985,19 @@ void K_PuntMine(mobj_t *thismine, mobj_t *punter)
|
||||
mine->floorz = thismine->floorz;
|
||||
mine->ceilingz = thismine->ceilingz;
|
||||
|
||||
//Since we aren't using P_KillMobj, we need to clean up the hnext reference
|
||||
{
|
||||
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;
|
||||
// Copy interp data
|
||||
mine->old_angle = thismine->old_angle;
|
||||
mine->old_x = thismine->old_x;
|
||||
mine->old_y = thismine->old_y;
|
||||
mine->old_z = thismine->old_z;
|
||||
|
||||
if (--thismine->target->player->kartstuff[k_itemamount] <= 0)
|
||||
thismine->target->player->kartstuff[k_itemtype] = KITEM_NONE;
|
||||
}
|
||||
// Since we aren't using P_KillMobj, we need to clean up the hnext reference
|
||||
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);
|
||||
|
||||
@@ -4424,6 +4433,12 @@ void K_DropHnextList(player_t *player)
|
||||
dropwork->floorz = work->floorz;
|
||||
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)
|
||||
{
|
||||
// floorz and ceilingz aren't properly set to account for FOFs and Polyobjects on spawn
|
||||
@@ -4506,7 +4521,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);
|
||||
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;
|
||||
P_Thrust(drop,
|
||||
@@ -5329,53 +5344,13 @@ static void K_UpdateInvincibilitySounds(player_t *player)
|
||||
#undef STOPTHIS
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static boolean K_SpeedLinesShouldBlend(player_t *player)
|
||||
boolean K_PlayerEffectsShouldBlend(player_t *player)
|
||||
{
|
||||
if (!cv_playerblendeffects.value || !player->mo)
|
||||
return false;
|
||||
|
||||
if (player->kartstuff[k_sneakertimer])
|
||||
if (player->kartstuff[k_sneakertimer] ||
|
||||
player->kartstuff[k_invincibilitytimer])
|
||||
return true;
|
||||
|
||||
// this is how the percentage speedometer calcs, i suck at maths so this was the easiest thing to do lmao
|
||||
@@ -5460,7 +5435,7 @@ FUNCINLINE static ATTRINLINE void K_SpawnNormalSpeedLines(player_t *player, bool
|
||||
fast->colorized = true;
|
||||
}
|
||||
|
||||
if (colorSpeed && K_SpeedLinesShouldBlend(player))
|
||||
if (colorSpeed && K_PlayerEffectsShouldBlend(player))
|
||||
fast->blendmode = AST_ADD;
|
||||
}
|
||||
}
|
||||
@@ -6128,6 +6103,7 @@ static void K_KartDrift(player_t *player, boolean onground)
|
||||
else
|
||||
player->kartstuff[k_brakedrift] = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// K_KartUpdatePosition
|
||||
//
|
||||
@@ -6316,7 +6292,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
||||
|
||||
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,
|
||||
{
|
||||
|
||||
+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_RespawnChecker(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_KartPlayerAfterThink(player_t *player);
|
||||
void K_DoInstashield(player_t *player);
|
||||
|
||||
+17
-8
@@ -385,7 +385,7 @@ static int lib_pSpawnMobj(lua_State *L)
|
||||
if (type >= NUMMOBJTYPES)
|
||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||
mobj_t *th = P_SpawnMobj(x, y, z, type);
|
||||
th->islocal = !hook_important;
|
||||
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||
LUA_PushUserdata(L, th, META_MOBJ);
|
||||
return 1;
|
||||
}
|
||||
@@ -413,7 +413,7 @@ static int lib_pSpawnMissile(lua_State *L)
|
||||
if (type >= NUMMOBJTYPES)
|
||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||
mobj_t *th = P_SpawnMissile(source, dest, type);
|
||||
th->islocal = !hook_important;
|
||||
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||
LUA_PushUserdata(L, th, META_MOBJ);
|
||||
return 1;
|
||||
}
|
||||
@@ -432,7 +432,7 @@ static int lib_pSpawnXYZMissile(lua_State *L)
|
||||
if (type >= NUMMOBJTYPES)
|
||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||
mobj_t *th = P_SpawnXYZMissile(source, dest, type, x, y, z);
|
||||
th->islocal = !hook_important;
|
||||
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||
LUA_PushUserdata(L, th, META_MOBJ);
|
||||
return 1;
|
||||
}
|
||||
@@ -453,7 +453,7 @@ static int lib_pSpawnPointMissile(lua_State *L)
|
||||
if (type >= NUMMOBJTYPES)
|
||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||
mobj_t *th = P_SpawnPointMissile(source, xa, ya, za, type, x, y, z);
|
||||
th->islocal = !hook_important;
|
||||
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||
LUA_PushUserdata(L, th, META_MOBJ);
|
||||
return 1;
|
||||
}
|
||||
@@ -472,7 +472,7 @@ static int lib_pSpawnAlteredDirectionMissile(lua_State *L)
|
||||
if (type >= NUMMOBJTYPES)
|
||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||
mobj_t *th = P_SpawnAlteredDirectionMissile(source, type, x, y, z, shiftingAngle);
|
||||
th->islocal = !hook_important;
|
||||
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||
LUA_PushUserdata(L, th, META_MOBJ);
|
||||
return 1;
|
||||
}
|
||||
@@ -503,7 +503,7 @@ static int lib_pSPMAngle(lua_State *L)
|
||||
if (type >= NUMMOBJTYPES)
|
||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||
mobj_t *th = P_SPMAngle(source, type, angle, allowaim, flags2);
|
||||
th->islocal = !hook_important;
|
||||
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||
LUA_PushUserdata(L, th, META_MOBJ);
|
||||
return 1;
|
||||
}
|
||||
@@ -519,7 +519,7 @@ static int lib_pSpawnPlayerMissile(lua_State *L)
|
||||
if (type >= NUMMOBJTYPES)
|
||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
||||
mobj_t *th = P_SpawnPlayerMissile(source, type, flags2);
|
||||
th->islocal = !hook_important;
|
||||
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
|
||||
LUA_PushUserdata(L, th, META_MOBJ);
|
||||
return 1;
|
||||
}
|
||||
@@ -3056,7 +3056,13 @@ static int lib_gSetPlayerGamepadIndicatorColor(lua_State *L)
|
||||
{
|
||||
INT32 player = -1;
|
||||
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)
|
||||
{
|
||||
@@ -3084,6 +3090,9 @@ static int lib_gPlayerDeviceRumble(lua_State *L)
|
||||
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
|
||||
|
||||
if (!plr)
|
||||
return LUA_ErrInvalid(L, "player_t");
|
||||
|
||||
for (int i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
|
||||
{
|
||||
if (plr - players == displayplayers[i])
|
||||
|
||||
+2
-8
@@ -251,14 +251,8 @@ int mobj_angle_setter(lua_State *L)
|
||||
mobj_t *mo = GETMO();
|
||||
|
||||
mo->angle = luaL_checkangle(L, 2);
|
||||
for (UINT8 i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (mo->player == P_GetLocalPlayerForNum(i))
|
||||
{
|
||||
localangle[i] = mo->angle;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (mo->player)
|
||||
P_ForceLocalAngle(mo->player, mo->angle);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+6
-4
@@ -49,17 +49,19 @@ aatree_t *M_AATreeAlloc(UINT32 flags)
|
||||
return aatree;
|
||||
}
|
||||
|
||||
static void M_AATreeFree_Node(aatree_node_t *node)
|
||||
static void M_AATreeFree_Node(aatree_node_t *node, bool is_string)
|
||||
{
|
||||
if (node->left) M_AATreeFree_Node(node->left);
|
||||
if (node->right) M_AATreeFree_Node(node->right);
|
||||
if (node->left) M_AATreeFree_Node(node->left, is_string);
|
||||
if (node->right) M_AATreeFree_Node(node->right, is_string);
|
||||
if (is_string)
|
||||
Z_Free(node->value);
|
||||
Z_Free(node);
|
||||
}
|
||||
|
||||
void M_AATreeFree(aatree_t *aatree)
|
||||
{
|
||||
if (aatree->root)
|
||||
M_AATreeFree_Node(aatree->root);
|
||||
M_AATreeFree_Node(aatree->root, (aatree->flags & AATREE_STRING) == AATREE_STRING);
|
||||
|
||||
Z_Free(aatree);
|
||||
}
|
||||
|
||||
+57
-20
@@ -10,20 +10,25 @@
|
||||
/// \brief Chat emotes handling
|
||||
|
||||
#include <map>
|
||||
#include <list>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <cstring>
|
||||
|
||||
#include "m_emotes.h"
|
||||
#include "i_time.h" // I_GetTime
|
||||
|
||||
extern "C" {
|
||||
#include "w_wad.h"
|
||||
#include "z_zone.h"
|
||||
#include "hu_stuff.h"
|
||||
#include "v_video.h"
|
||||
#include "command.h"
|
||||
}
|
||||
|
||||
consvar_t cv_emotes = {"emotes", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};;
|
||||
static void Command_ListEmotes_f(void);
|
||||
|
||||
consvar_t cv_emotes = {"emotes", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
static std::map<std::string, emote_t> emotes;
|
||||
|
||||
@@ -117,12 +122,6 @@ void M_LoadEmotes(UINT16 wadnum)
|
||||
UINT8 numframes = 0;
|
||||
|
||||
auto copy_frame = [&] {
|
||||
if (numframes == MAXEMOTEFRAMES)
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, "EMOTES: Too many frames. (file %s, line %d)", wadfiles[wadnum]->filename, linenum);
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t list_split = value.find(',');
|
||||
std::string framelumpname = value.substr(0, list_split);
|
||||
trim(framelumpname);
|
||||
@@ -136,9 +135,16 @@ void M_LoadEmotes(UINT16 wadnum)
|
||||
if (framelumpname.size() == 0)
|
||||
return false;
|
||||
|
||||
// Only print this warning if we actually got new frame
|
||||
if (numframes == MAXEMOTEFRAMES)
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, "EMOTES: Too many frames. (file %s, line %d)\n", wadfiles[wadnum]->filename, linenum);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (framelumpname.size() > 8)
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, "EMOTES: Frame %d name is too long. (file %s, line %d)", numframes, wadfiles[wadnum]->filename, linenum);
|
||||
CONS_Alert(CONS_WARNING, "EMOTES: Frame %d name is too long. (file %s, line %d)\n", numframes, wadfiles[wadnum]->filename, linenum);
|
||||
framelumpname.resize(8);
|
||||
}
|
||||
|
||||
@@ -153,7 +159,7 @@ void M_LoadEmotes(UINT16 wadnum)
|
||||
|
||||
if (numframes == 0)
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, "EMOTES: Expected list of frames. (file %s, line %d)", wadfiles[wadnum]->filename, linenum);
|
||||
CONS_Alert(CONS_WARNING, "EMOTES: Expected list of frames. (file %s, line %d)\n", wadfiles[wadnum]->filename, linenum);
|
||||
}
|
||||
|
||||
emote->numframes = numframes;
|
||||
@@ -165,12 +171,12 @@ void M_LoadEmotes(UINT16 wadnum)
|
||||
if (emote->timeperframe <= 0)
|
||||
{
|
||||
emote->timeperframe = 1;
|
||||
CONS_Alert(CONS_WARNING, "EMOTES: Bad value for 'timeperframe'. (file %s, line %d)", wadfiles[wadnum]->filename, linenum);
|
||||
CONS_Alert(CONS_WARNING, "EMOTES: Bad value for 'timeperframe'. (file %s, line %d)\n", wadfiles[wadnum]->filename, linenum);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, "EMOTES: Unrecognized field '%s'. (file %s, line %d)", field.c_str(), wadfiles[wadnum]->filename, linenum);
|
||||
CONS_Alert(CONS_WARNING, "EMOTES: Unrecognized field '%s'. (file %s, line %d)\n", field.c_str(), wadfiles[wadnum]->filename, linenum);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -187,6 +193,8 @@ void M_InitEmotes(void)
|
||||
UINT16 i;
|
||||
for (i = 0; i < numwadfiles; i++)
|
||||
M_LoadEmotes(i);
|
||||
|
||||
COM_AddCommand("listemotes", Command_ListEmotes_f);
|
||||
}
|
||||
|
||||
emote_t *M_FindEmote(const char *name, int len, int skip)
|
||||
@@ -199,7 +207,7 @@ emote_t *M_FindEmote(const char *name, int len, int skip)
|
||||
|
||||
for (auto &pair: emotes)
|
||||
{
|
||||
if (pair.first.rfind(query, 0, std::min(len, MAXEMOTENAME)) != 0)
|
||||
if (strcasestr(pair.first.c_str(), query) == NULL)
|
||||
continue;
|
||||
|
||||
if (skip > 0)
|
||||
@@ -247,23 +255,18 @@ emote_t *M_VerifyEmote(const char *name, int *emotelen)
|
||||
return match;
|
||||
}
|
||||
|
||||
void M_DrawEmote(INT32 x, INT32 y, emote_t *emote, tic_t anim, INT32 flags)
|
||||
void M_DrawScaledEmote(fixed_t x, fixed_t y, fixed_t scale, emote_t *emote, INT32 flags)
|
||||
{
|
||||
if (emote->numframes == 0)
|
||||
return;
|
||||
|
||||
const char *lumpname = emote->frames[(anim/emote->timeperframe) % emote->numframes];
|
||||
const char *lumpname = emote->frames[(I_GetTime()/emote->timeperframe) % emote->numframes];
|
||||
patch_t *emotepatch = (patch_t*)W_CachePatchName(lumpname, PU_CACHE);
|
||||
|
||||
const int CHARHEIGHT = 6;
|
||||
|
||||
fixed_t scale = FRACUNIT;
|
||||
|
||||
x *= FRACUNIT;
|
||||
y *= FRACUNIT;
|
||||
|
||||
if (emotepatch->width > EMOTEWIDTH)
|
||||
scale = (FRACUNIT/emotepatch->width)*EMOTEWIDTH;
|
||||
scale = FixedMul(scale, (FRACUNIT/emotepatch->width)*EMOTEWIDTH);
|
||||
else if (emotepatch->width < EMOTEWIDTH)
|
||||
x += (EMOTEWIDTH-emotepatch->width)*FRACUNIT/2;
|
||||
|
||||
@@ -271,3 +274,37 @@ void M_DrawEmote(INT32 x, INT32 y, emote_t *emote, tic_t anim, INT32 flags)
|
||||
|
||||
V_DrawFixedPatch(x, y, scale, flags, emotepatch, NULL);
|
||||
}
|
||||
|
||||
static void Command_ListEmotes_f(void)
|
||||
{
|
||||
const int EMOTES_PER_PAGE = 24;
|
||||
const int NUMPAGES = std::max<int>(emotes.size()/EMOTES_PER_PAGE, 1);
|
||||
int page = 1;
|
||||
|
||||
if (COM_Argc() > 1)
|
||||
page = std::atoi(COM_Argv(1));
|
||||
|
||||
if (page <= 0 || page > NUMPAGES)
|
||||
{
|
||||
if (NUMPAGES > 1)
|
||||
CONS_Printf("Enter page number between 1 and %d\n", NUMPAGES);
|
||||
else
|
||||
CONS_Printf("Bad page number, try using this command without arguments\n");
|
||||
return;
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
for (auto &pair: emotes)
|
||||
{
|
||||
++i;
|
||||
|
||||
if (i <= (page-1)*EMOTES_PER_PAGE)
|
||||
continue;
|
||||
if (i > page*EMOTES_PER_PAGE)
|
||||
break;
|
||||
|
||||
CONS_Printf("%s - :%s:\n", pair.first.c_str(), pair.first.c_str());
|
||||
}
|
||||
|
||||
CONS_Printf("Page %d/%d\n", page, NUMPAGES);
|
||||
}
|
||||
+4
-3
@@ -17,6 +17,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#include "doomdef.h"
|
||||
#include "m_fixed.h"
|
||||
#include "command.h"
|
||||
|
||||
extern consvar_t cv_emotes;
|
||||
@@ -48,9 +49,9 @@ emote_t *M_FindEmote(const char *name, int len, int skips);
|
||||
// needs to be skipped to get past emote name
|
||||
emote_t *M_VerifyEmote(const char *name, int *emotelen);
|
||||
|
||||
// Draw the emote, anim should be some kind of timer ticking every game tic
|
||||
// for animated emotes
|
||||
void M_DrawEmote(INT32 x, INT32 y, emote_t *emote, tic_t anim, INT32 flags);
|
||||
// Draw the emote, animation for animated emotes is done via I_GetTime
|
||||
#define M_DrawEmote(x, y, emote, flags) M_DrawScaledEmote((x)<<FRACBITS, (y)<<FRACBITS, FRACUNIT, emote, flags)
|
||||
void M_DrawScaledEmote(fixed_t x, fixed_t y, fixed_t scale, emote_t *emote, INT32 flags);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
|
||||
+398
-197
File diff suppressed because it is too large.
Load diff
@@ -204,6 +204,7 @@ typedef struct menu_s
|
||||
struct menu_s *prevMenu; // previous menu
|
||||
menuitem_t *menuitems; // menu items
|
||||
void (*drawroutine)(void); // draw routine
|
||||
void (*tickroutine)(void); // ticker routine
|
||||
INT16 x, y; // x, y of menu
|
||||
INT16 lastOn; // last item user was on in menu
|
||||
boolean (*quitroutine)(void); // called before quit a menu return true if we can
|
||||
@@ -222,6 +223,11 @@ extern menu_t *currentMenu;
|
||||
extern menu_t MainDef;
|
||||
extern menu_t SP_LoadDef;
|
||||
|
||||
#define MAXCOLUMNMODES 12 //max modes displayed in one column
|
||||
#define MAXMODEDESCS (MAXCOLUMNMODES*3)
|
||||
extern menu_t OP_VideoModeDef;
|
||||
void M_VideoModeMenu(INT32 choice);
|
||||
|
||||
// Call upon joystick hotplug
|
||||
void M_SetupJoystickMenu(INT32 choice);
|
||||
extern menu_t OP_JoystickSetDef;
|
||||
@@ -308,6 +314,8 @@ void M_ResetDemoList(void);
|
||||
void M_ReplayHut(INT32 choice);
|
||||
void M_SetPlaybackMenuPointer(void);
|
||||
|
||||
void Nextmap_OnChange(void);
|
||||
|
||||
void M_RefreshPauseMenu(void);
|
||||
|
||||
INT32 HU_GetHighlightColor(void);
|
||||
@@ -328,6 +336,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
|
||||
prev,\
|
||||
source,\
|
||||
M_DrawGenericMenu,\
|
||||
NULL,\
|
||||
x, y,\
|
||||
0,\
|
||||
NULL,\
|
||||
@@ -341,6 +350,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
|
||||
prev,\
|
||||
source,\
|
||||
M_DrawGenericScrollMenu,\
|
||||
NULL,\
|
||||
x, y,\
|
||||
0,\
|
||||
NULL,\
|
||||
@@ -355,6 +365,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
|
||||
NULL,\
|
||||
source,\
|
||||
M_DrawPauseMenu,\
|
||||
NULL,\
|
||||
x, y,\
|
||||
0,\
|
||||
NULL,\
|
||||
@@ -368,6 +379,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
|
||||
prev,\
|
||||
source,\
|
||||
M_DrawCenteredMenu,\
|
||||
NULL,\
|
||||
BASEVIDWIDTH/2, y,\
|
||||
0,\
|
||||
NULL,\
|
||||
@@ -381,6 +393,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
|
||||
prev,\
|
||||
source,\
|
||||
M_DrawServerMenu,\
|
||||
NULL,\
|
||||
24,40,\
|
||||
0,\
|
||||
NULL,\
|
||||
@@ -394,6 +407,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
|
||||
prev,\
|
||||
source,\
|
||||
M_DrawControl,\
|
||||
NULL,\
|
||||
26, 40,\
|
||||
0,\
|
||||
NULL,\
|
||||
@@ -407,6 +421,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
|
||||
NULL,\
|
||||
source,\
|
||||
M_DrawImageDef,\
|
||||
NULL,\
|
||||
0, 0,\
|
||||
0,\
|
||||
NULL,\
|
||||
|
||||
+58
-211
@@ -735,26 +735,27 @@ static menuitem_t OP_AllControlsMenu[] =
|
||||
|
||||
#define OP_JOYMENU(pnum) \
|
||||
{IT_HEADER, NULL, "Gameplay Controls", NULL, 7}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[pnum] , 15}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[pnum] , 20}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[pnum] , 25}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[pnum] , 30}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[pnum] , 35}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[pnum] , 40}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[pnum] , 45}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[pnum] , 50}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[pnum] , 55}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[pnum] , 60}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[pnum] , 15}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[pnum] , 20}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[pnum] , 25}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[pnum] , 30}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[pnum] , 35}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[pnum] , 40}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[pnum] , 45}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[pnum] , 50}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[pnum] , 55}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[pnum] , 60}, \
|
||||
{IT_HEADER, NULL, "Camera Controls", NULL, 67}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[pnum] , 75}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_camturnaxis[pnum] , 80}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Strafe Left/Right" , &cv_camstrafeaxis[pnum] , 85}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[pnum] , 75}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_camturnaxis[pnum] , 80}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Strafe Left/Right" , &cv_camstrafeaxis[pnum] , 85}, \
|
||||
{IT_HEADER, NULL, "Deadzones", NULL, 92}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[pnum] , 100}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[pnum] , 105}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[pnum] , 100}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[pnum] , 105}, \
|
||||
{IT_HEADER, NULL, "Miscellaneous", NULL, 112}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[pnum] , 120}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Set LED to Player color", &cv_gamepadled[pnum] , 125},
|
||||
{IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[pnum] , 120}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Controller Rumble Strength" , &cv_rumblestrength[pnum] , 125}, \
|
||||
{IT_STRING | IT_CVAR, NULL, "Set LED to Player color" , &cv_gamepadled[pnum] , 130},
|
||||
|
||||
static menuitem_t OP_Joystick1Menu[] =
|
||||
{
|
||||
@@ -1152,6 +1153,13 @@ static menuitem_t OP_SoundAdvancedMenu[] =
|
||||
{IT_STRING | IT_CVAR, NULL, "Stereo Seperation", &cv_stereosep, 35},
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_FLUIDSYNTH
|
||||
{IT_HEADER, NULL, "MIDI Settings", NULL, NULL, OPENMPT_MENUOFFSET},
|
||||
{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "Sound Font File", NULL, &cv_midisoundfontpath, OPENMPT_MENUOFFSET+12},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Chorus", NULL, &cv_midichorus, OPENMPT_MENUOFFSET+40},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Reverb", NULL, &cv_midireverb, OPENMPT_MENUOFFSET+50},
|
||||
#endif
|
||||
|
||||
{IT_HEADER, NULL, "Misc", NULL, 45},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Same Sound Limit", &cv_samesoundlimit, 55},
|
||||
@@ -1179,6 +1187,11 @@ static const char* OP_SoundAdvancedTooltips[] =
|
||||
"Which Amiga should be used for .mod playback?",
|
||||
#endif
|
||||
"How far should the four channels in .mod be panned?",
|
||||
#endif
|
||||
#ifdef HAVE_FLUIDSYNTH
|
||||
"Which MIDI soundfont to use",
|
||||
"Controls the chorus of MIDI playback\n setting this too high might cause some instruments to be overexposed",
|
||||
"Controls the reverb of MIDI playback\n setting this too high might cause notes to be drawn out",
|
||||
#endif
|
||||
NULL,
|
||||
"How many times is the same sound allowed to play at once?\nIf 0 theres no limit.",
|
||||
@@ -1873,7 +1886,7 @@ static const char* OP_SaturnHudTooltips[] =
|
||||
"Disable the animation of the Positionnumber\nwhen overtaking someone.",
|
||||
"Flash current Lap Time when doing a Lap on the Timer.",
|
||||
"Use extra graphics for multiple sneakers, bananas and jawz.",
|
||||
"Change when the item amount is to be displayed\nMultiple will always display the number.\nwhen you have multiple of the same Item.\nAlways will always display the number regardless of Item amount.",
|
||||
"Change when the item amount is to be displayed.\nMultiple will always display the number.\nWhen you have multiple of the same Item.\nAlways will always display the number regardless of Item amount.",
|
||||
"Enables an animation while the roulette is active.",
|
||||
"Show the big 'LAP' text on a lap change.",
|
||||
"Show the big Cecho Messages.",
|
||||
@@ -2179,9 +2192,6 @@ static menuitem_t OP_AdvancedBirdMenu[] =
|
||||
{IT_STRING | IT_CVAR, NULL, "Fade Back from Grow", &cv_growmusicfade, 20},
|
||||
{IT_STRING | IT_CVAR, NULL, "Fade Out Before Respawning", &cv_respawnfademusicout, 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Fade Back In While Respawning", &cv_respawnfademusicback, 40},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Resync Threshold", &cv_music_resync_threshold, 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Resync Special Music Only", &cv_music_resync_powerups_only, 70},
|
||||
};
|
||||
|
||||
static const char* OP_AdvancedBirdTooltips[] =
|
||||
@@ -2191,8 +2201,6 @@ static const char* OP_AdvancedBirdTooltips[] =
|
||||
"Fade in music after Grow.",
|
||||
"Fade out music before respawning.",
|
||||
"Fade in music while respawning.",
|
||||
"Threshold for syncing music.",
|
||||
"Only sync special music.",
|
||||
};
|
||||
|
||||
enum
|
||||
@@ -2202,8 +2210,6 @@ enum
|
||||
fadegrow,
|
||||
respawnfadeout,
|
||||
respawnfadein,
|
||||
syncthreshold,
|
||||
syncspecialonly,
|
||||
};
|
||||
|
||||
menuitem_t OP_CustomCvarMenu[MAXMENUCCVARS];
|
||||
@@ -2222,6 +2228,7 @@ menu_t MISC_AddonsDef =
|
||||
&OP_DataOptionsDef,
|
||||
MISC_AddonsMenu,
|
||||
M_DrawAddons,
|
||||
M_AddonsRefresh,
|
||||
50, 28,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2235,6 +2242,7 @@ menu_t MISC_ReplayHutDef =
|
||||
NULL,
|
||||
MISC_ReplayHutMenu,
|
||||
M_DrawReplayHut,
|
||||
NULL,
|
||||
30, 80,
|
||||
0,
|
||||
M_QuitReplayHut,
|
||||
@@ -2248,6 +2256,7 @@ menu_t MISC_ReplayOptionsDef =
|
||||
&OP_DataOptionsDef,
|
||||
MISC_ReplayOptionsMenu,
|
||||
M_DrawGenericMenu,
|
||||
NULL,
|
||||
27, 40,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2261,6 +2270,7 @@ menu_t MISC_ReplayStartDef =
|
||||
&MISC_ReplayHutDef,
|
||||
MISC_ReplayStartMenu,
|
||||
M_DrawReplayStartMenu,
|
||||
NULL,
|
||||
30, 90,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2273,6 +2283,7 @@ menu_t PlaybackMenuDef = {
|
||||
NULL,
|
||||
PlaybackMenu,
|
||||
M_DrawPlaybackMenu,
|
||||
NULL,
|
||||
//BASEVIDWIDTH/2 - 94, 2,
|
||||
BASEVIDWIDTH/2 - 88, 2,
|
||||
0,
|
||||
@@ -2291,6 +2302,7 @@ menu_t MISC_DiscordRequestsDef = {
|
||||
&MPauseDef,
|
||||
MISC_DiscordRequestsMenu,
|
||||
M_DrawDiscordRequests,
|
||||
NULL,
|
||||
0, 0,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2315,6 +2327,7 @@ menu_t SR_UnlockChecklistDef =
|
||||
&SR_MainDef,
|
||||
SR_UnlockChecklistMenu,
|
||||
M_DrawChecklist,
|
||||
NULL,
|
||||
280, 185,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2328,6 +2341,7 @@ menu_t SR_MusicTestDef =
|
||||
&OP_SoundOptionsDef,
|
||||
SR_MusicTestMenu,
|
||||
M_DrawMusicTest,
|
||||
NULL,
|
||||
60, 150,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2344,6 +2358,7 @@ menu_t SP_LevelStatsDef =
|
||||
&SR_MainDef,
|
||||
SP_LevelStatsMenu,
|
||||
M_DrawLevelStats,
|
||||
NULL,
|
||||
280, 185,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2357,6 +2372,7 @@ static menu_t SP_TimeAttackDef =
|
||||
&MainDef, // Doesn't matter.
|
||||
SP_TimeAttackMenu,
|
||||
M_DrawTimeAttackMenu,
|
||||
NULL,
|
||||
34, 40,
|
||||
0,
|
||||
M_QuitTimeAttackMenu,
|
||||
@@ -2369,6 +2385,7 @@ static menu_t SP_ReplayDef =
|
||||
&SP_TimeAttackDef,
|
||||
SP_ReplayMenu,
|
||||
M_DrawTimeAttackMenu,
|
||||
NULL,
|
||||
34, 40,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2381,6 +2398,7 @@ static menu_t SP_GuestReplayDef =
|
||||
&SP_TimeAttackDef,
|
||||
SP_GuestReplayMenu,
|
||||
M_DrawTimeAttackMenu,
|
||||
NULL,
|
||||
34, 40,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2393,6 +2411,7 @@ static menu_t SP_GhostDef =
|
||||
&SP_TimeAttackDef,
|
||||
SP_GhostMenu,
|
||||
M_DrawTimeAttackMenu,
|
||||
NULL,
|
||||
34, 40,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2407,6 +2426,7 @@ menu_t MP_MainDef =
|
||||
&MainDef,
|
||||
MP_MainMenu,
|
||||
M_DrawMPMainMenu,
|
||||
NULL,
|
||||
42, 30,
|
||||
0,
|
||||
M_CancelConnect,
|
||||
@@ -2424,6 +2444,7 @@ menu_t MP_ConnectDef =
|
||||
&MP_MainDef,
|
||||
MP_ConnectMenu,
|
||||
M_DrawConnectMenu,
|
||||
NULL,
|
||||
27,24,
|
||||
0,
|
||||
M_CancelConnect,
|
||||
@@ -2437,6 +2458,7 @@ menu_t MP_PlayerSetupDef =
|
||||
&MP_MainDef,
|
||||
MP_PlayerSetupMenu,
|
||||
M_DrawSetupMultiPlayerMenu,
|
||||
NULL,
|
||||
36, 14,
|
||||
0,
|
||||
M_QuitMultiPlayerMenu,
|
||||
@@ -2451,6 +2473,7 @@ menu_t OP_MainDef =
|
||||
&MainDef,
|
||||
OP_MainMenu,
|
||||
M_DrawGenericMenu,
|
||||
NULL,
|
||||
60, 25,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2473,6 +2496,7 @@ menu_t OP_JoystickSetDef =
|
||||
&OP_Joystick1Def,
|
||||
OP_JoystickSetMenu,
|
||||
M_DrawJoystick,
|
||||
NULL,
|
||||
50, 40,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2486,6 +2510,7 @@ menu_t OP_VideoOptionsDef =
|
||||
&OP_MainDef,
|
||||
OP_VideoOptionsMenu,
|
||||
M_DrawVideoMenu,
|
||||
NULL,
|
||||
30, 15,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2499,6 +2524,7 @@ menu_t OP_VideoModeDef =
|
||||
&OP_VideoOptionsDef,
|
||||
OP_VideoModeMenu,
|
||||
M_DrawVideoMode,
|
||||
NULL,
|
||||
48, 26,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2512,6 +2538,7 @@ menu_t OP_ColorOptionsDef =
|
||||
&OP_VideoOptionsDef,
|
||||
OP_ColorOptionsMenu,
|
||||
M_DrawColorMenu,
|
||||
NULL,
|
||||
30, 30,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2525,6 +2552,7 @@ menu_t OP_SoundOptionsDef =
|
||||
&OP_MainDef,
|
||||
OP_SoundOptionsMenu,
|
||||
M_DrawSkyRoom,
|
||||
NULL,
|
||||
30, 20,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2539,6 +2567,7 @@ menu_t OP_HUDOptionsDef =
|
||||
&OP_MainDef,
|
||||
OP_HUDOptionsMenu,
|
||||
M_DrawHUDOptions,
|
||||
NULL,
|
||||
30, 20,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2568,6 +2597,7 @@ menu_t OP_MonitorToggleDef =
|
||||
&OP_GameOptionsDef,
|
||||
OP_MonitorToggleMenu,
|
||||
M_DrawMonitorToggles,
|
||||
NULL,
|
||||
47, 30,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2615,6 +2645,7 @@ menu_t OP_ForkedBirdDef = {
|
||||
&OP_MainDef,
|
||||
OP_ForkedBirdMenu,
|
||||
M_DrawLocalSkinMenu,
|
||||
NULL,
|
||||
30, 6,
|
||||
0,
|
||||
NULL,
|
||||
@@ -2623,191 +2654,7 @@ menu_t OP_ForkedBirdDef = {
|
||||
|
||||
menu_t OP_LocalSkinDef = DEFAULTMENUSTYLE(NULL, OP_TiltMenu, &OP_ForkedBirdDef, 30, 60, NULL);
|
||||
|
||||
|
||||
// ==========================================================================
|
||||
// CVAR ONCHANGE EVENTS GO HERE
|
||||
// ==========================================================================
|
||||
// (there's only a couple anyway)
|
||||
|
||||
// Nextmap. Used for Time Attack.
|
||||
static void Nextmap_OnChange(void)
|
||||
{
|
||||
char *leveltitle;
|
||||
UINT8 active;
|
||||
|
||||
// Update the string in the consvar.
|
||||
Z_Free(cv_nextmap.zstring);
|
||||
leveltitle = G_BuildMapTitle(cv_nextmap.value);
|
||||
cv_nextmap.string = cv_nextmap.zstring = leveltitle ? leveltitle : Z_StrDup(G_BuildMapName(cv_nextmap.value));
|
||||
|
||||
if (currentMenu == &SP_TimeAttackDef)
|
||||
{
|
||||
// see also p_setup.c's P_LoadRecordGhosts
|
||||
const size_t glen = strlen(srb2home)+1+strlen("replay")+1+strlen(timeattackfolder)+1+strlen("MAPXX")+1;
|
||||
char *gpath = malloc(glen);
|
||||
INT32 i;
|
||||
|
||||
if (!gpath)
|
||||
return;
|
||||
|
||||
sprintf(gpath,"%s"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s", srb2home, timeattackfolder, G_BuildMapName(cv_nextmap.value));
|
||||
|
||||
CV_StealthSetValue(&cv_dummystaff, 0);
|
||||
|
||||
active = false;
|
||||
SP_TimeAttackMenu[taguest].status = IT_DISABLED;
|
||||
SP_TimeAttackMenu[tareplay].status = IT_DISABLED;
|
||||
|
||||
// Check if file exists, if not, disable REPLAY option
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
SP_ReplayMenu[i].status = IT_DISABLED;
|
||||
SP_GuestReplayMenu[i].status = IT_DISABLED;
|
||||
}
|
||||
SP_ReplayMenu[4].status = IT_DISABLED;
|
||||
|
||||
SP_GhostMenu[3].status = IT_DISABLED;
|
||||
SP_GhostMenu[4].status = IT_DISABLED;
|
||||
|
||||
if (FIL_FileExists(va("%s-%s-time-best.lmp", gpath, cv_chooseskin.string))) {
|
||||
SP_ReplayMenu[0].status = IT_WHITESTRING|IT_CALL;
|
||||
SP_GuestReplayMenu[0].status = IT_WHITESTRING|IT_CALL;
|
||||
active |= 3;
|
||||
}
|
||||
if (FIL_FileExists(va("%s-%s-lap-best.lmp", gpath, cv_chooseskin.string))) {
|
||||
SP_ReplayMenu[1].status = IT_WHITESTRING|IT_CALL;
|
||||
SP_GuestReplayMenu[1].status = IT_WHITESTRING|IT_CALL;
|
||||
active |= 3;
|
||||
}
|
||||
if (FIL_FileExists(va("%s-%s-last.lmp", gpath, cv_chooseskin.string))) {
|
||||
SP_ReplayMenu[2].status = IT_WHITESTRING|IT_CALL;
|
||||
SP_GuestReplayMenu[2].status = IT_WHITESTRING|IT_CALL;
|
||||
active |= 3;
|
||||
}
|
||||
|
||||
if (FIL_FileExists(va("%s-guest.lmp", gpath)))
|
||||
{
|
||||
SP_ReplayMenu[3].status = IT_WHITESTRING|IT_CALL;
|
||||
SP_GuestReplayMenu[3].status = IT_WHITESTRING|IT_CALL;
|
||||
SP_GhostMenu[3].status = IT_STRING|IT_CVAR;
|
||||
active |= 3;
|
||||
}
|
||||
|
||||
CV_SetValue(&cv_dummystaff, 1);
|
||||
if (cv_dummystaff.value)
|
||||
{
|
||||
SP_ReplayMenu[4].status = IT_WHITESTRING|IT_KEYHANDLER;
|
||||
SP_GhostMenu[4].status = IT_STRING|IT_CVAR;
|
||||
CV_StealthSetValue(&cv_dummystaff, 1);
|
||||
active |= 1;
|
||||
}
|
||||
|
||||
if (active) {
|
||||
if (active & 1)
|
||||
SP_TimeAttackMenu[tareplay].status = IT_WHITESTRING|IT_SUBMENU;
|
||||
if (active & 2)
|
||||
SP_TimeAttackMenu[taguest].status = IT_WHITESTRING|IT_SUBMENU;
|
||||
}
|
||||
else if (itemOn == tareplay) // Reset lastOn so replay isn't still selected when not available.
|
||||
{
|
||||
currentMenu->lastOn = itemOn;
|
||||
itemOn = tastart;
|
||||
}
|
||||
|
||||
if (mapheaderinfo[cv_nextmap.value-1] && mapheaderinfo[cv_nextmap.value-1]->forcecharacter[0] != '\0')
|
||||
CV_Set(&cv_chooseskin, mapheaderinfo[cv_nextmap.value-1]->forcecharacter);
|
||||
|
||||
free(gpath);
|
||||
}
|
||||
}
|
||||
|
||||
static void Dummymenuplayer_OnChange(void)
|
||||
{
|
||||
if (cv_dummymenuplayer.value < 1)
|
||||
CV_StealthSetValue(&cv_dummymenuplayer, splitscreen+1);
|
||||
else if (cv_dummymenuplayer.value > splitscreen+1)
|
||||
CV_StealthSetValue(&cv_dummymenuplayer, 1);
|
||||
}
|
||||
|
||||
char dummystaffname[22];
|
||||
|
||||
static void Dummystaff_OnChange(void)
|
||||
{
|
||||
lumpnum_t l;
|
||||
|
||||
dummystaffname[0] = '\0';
|
||||
|
||||
if ((l = W_CheckNumForName(va("%sS01",G_BuildMapName(cv_nextmap.value)))) == LUMPERROR)
|
||||
{
|
||||
CV_StealthSetValue(&cv_dummystaff, 0);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
char *temp = dummystaffname;
|
||||
UINT8 numstaff = 1;
|
||||
while (numstaff < 99 && (l = W_CheckNumForName(va("%sS%02u",G_BuildMapName(cv_nextmap.value),numstaff+1))) != LUMPERROR)
|
||||
numstaff++;
|
||||
|
||||
if (cv_dummystaff.value < 1)
|
||||
CV_StealthSetValue(&cv_dummystaff, numstaff);
|
||||
else if (cv_dummystaff.value > numstaff)
|
||||
CV_StealthSetValue(&cv_dummystaff, 1);
|
||||
|
||||
if ((l = W_CheckNumForName(va("%sS%02u",G_BuildMapName(cv_nextmap.value), cv_dummystaff.value))) == LUMPERROR)
|
||||
return; // shouldn't happen but might as well check...
|
||||
|
||||
G_UpdateStaffGhostName(l);
|
||||
|
||||
while (*temp)
|
||||
temp++;
|
||||
|
||||
sprintf(temp, " - %d", cv_dummystaff.value);
|
||||
}
|
||||
}
|
||||
|
||||
// Newgametype. Used for gametype changes.
|
||||
static void Newgametype_OnChange(void)
|
||||
{
|
||||
if (cv_nextmap.value && menuactive)
|
||||
{
|
||||
if (!mapheaderinfo[cv_nextmap.value-1])
|
||||
P_AllocMapHeader((INT16)(cv_nextmap.value-1));
|
||||
|
||||
if ((cv_newgametype.value == GT_RACE && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_RACE)) || // SRB2kart
|
||||
((cv_newgametype.value == GT_MATCH || cv_newgametype.value == GT_TEAMMATCH) && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_MATCH)))
|
||||
{
|
||||
INT32 value = 0;
|
||||
|
||||
switch (cv_newgametype.value)
|
||||
{
|
||||
case GT_COOP:
|
||||
value = TOL_RACE; // SRB2kart
|
||||
break;
|
||||
case GT_COMPETITION:
|
||||
value = TOL_COMPETITION;
|
||||
break;
|
||||
case GT_RACE:
|
||||
value = TOL_RACE;
|
||||
break;
|
||||
case GT_MATCH:
|
||||
case GT_TEAMMATCH:
|
||||
value = TOL_MATCH;
|
||||
break;
|
||||
case GT_TAG:
|
||||
case GT_HIDEANDSEEK:
|
||||
value = TOL_TAG;
|
||||
break;
|
||||
case GT_CTF:
|
||||
value = TOL_CTF;
|
||||
break;
|
||||
}
|
||||
|
||||
CV_SetValue(&cv_nextmap, M_FindFirstMap(value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Onchange functions to show/hide/move things in menus
|
||||
void Screenshot_option_Onchange(void)
|
||||
{
|
||||
OP_ScreenshotOptionsMenu[op_screenshot_folder].status =
|
||||
@@ -2884,7 +2731,7 @@ void Bird_menu_Onchange(void)
|
||||
OP_AdvancedBirdMenu[respawnfadein].status = status;
|
||||
}
|
||||
|
||||
//menu code is nice
|
||||
// menu code is nice
|
||||
void SaturnHud_menu_Onchange(void)
|
||||
{
|
||||
UINT16 status;
|
||||
|
||||
+7
-6
@@ -1693,22 +1693,23 @@ char *M_GetToken(const char *inputString)
|
||||
}
|
||||
|
||||
|
||||
const char * M_Ftrim (double f)
|
||||
const char * M_Ftrim(double f)
|
||||
{
|
||||
static char dig[9];/* "0." + 6 digits (6 is printf's default) */
|
||||
int i;
|
||||
|
||||
/* I know I said it's the default, but just in case... */
|
||||
sprintf(dig, "%.6f", fabs(modf(f, &f)));
|
||||
|
||||
/* trim trailing zeroes */
|
||||
for (i = strlen(dig)-1; dig[i] == '0'; --i)
|
||||
;
|
||||
|
||||
if (dig[i] == '.')/* :NOTHING: */
|
||||
return "";
|
||||
else
|
||||
{
|
||||
dig[i + 1] = '\0';
|
||||
return &dig[1];/* skip the 0 */
|
||||
}
|
||||
|
||||
dig[i + 1] = '\0';
|
||||
return &dig[1];/* skip the 0 */
|
||||
}
|
||||
|
||||
/** Count bits in a number.
|
||||
|
||||
+79
-56
@@ -411,21 +411,13 @@ boolean M_TextInputHandle(textinput_t *input, INT32 key)
|
||||
return M_TextInputHandleBase(input, key, false);
|
||||
}
|
||||
|
||||
boolean M_TextInputHandleEmotes(textinput_t *input, INT32 key, emote_t *suggestions[], int maxsuggestions)
|
||||
static int M_TextInputEmoteStart(textinput_t *input)
|
||||
{
|
||||
boolean ret = M_TextInputHandleBase(input, key, true);
|
||||
if (input->cursor == 0)
|
||||
return -1;
|
||||
|
||||
// After this handled key we ended up inside an emote, lets fix that
|
||||
if (M_TextInputCheckEmote(input))
|
||||
M_TextInputToWordEnd(input, !shiftdown);
|
||||
int emotestart = -1;
|
||||
|
||||
// Always clear the first entry
|
||||
suggestions[0] = NULL;
|
||||
|
||||
// For autocomplete
|
||||
int emotestart = 0;
|
||||
|
||||
// Try find suggestions for emote names
|
||||
for (int i = input->cursor-1; i >= 0 && input->cursor-i <= MAXEMOTENAME; --i)
|
||||
{
|
||||
// Space can't be part of emote name
|
||||
@@ -436,62 +428,93 @@ boolean M_TextInputHandleEmotes(textinput_t *input, INT32 key, emote_t *suggesti
|
||||
if (input->buffer[i] == ':')
|
||||
{
|
||||
emotestart = i+1;
|
||||
// ...But only if we typed at least something
|
||||
if ((int)input->cursor-(i-1) < 3)
|
||||
break;
|
||||
|
||||
for (int skip = 0; skip < maxsuggestions; ++skip)
|
||||
{
|
||||
suggestions[skip] = M_FindEmote(input->buffer+i+1, input->cursor-i-1, skip);
|
||||
|
||||
// No more suggestions
|
||||
if (!suggestions[skip])
|
||||
break;
|
||||
}
|
||||
|
||||
// In any case, we found what we wanted, can exit the loop now
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// If we suggest emotes, try autocomplete
|
||||
if (key == '\t' && suggestions[0])
|
||||
return emotestart;
|
||||
}
|
||||
|
||||
static boolean M_TextInputCompleteEmote(textinput_t *input, emote_autocomplete_t *autocomplete)
|
||||
{
|
||||
if (input->cursor == 0)
|
||||
return false;
|
||||
|
||||
// If we're in "autocomplete" state, delete ':' for latest autocompleted emote
|
||||
if (autocomplete->complete[0])
|
||||
{
|
||||
int pos = (input->cursor-emotestart);
|
||||
boolean autocomplete = true;
|
||||
|
||||
while (autocomplete)
|
||||
if (input->buffer[input->cursor-1] == ':')
|
||||
{
|
||||
// Check if current character matches for all suggestions
|
||||
char c = suggestions[0]->name[pos];
|
||||
|
||||
// End of string reached
|
||||
if (!c)
|
||||
break;
|
||||
|
||||
for (int i = 1; i < maxsuggestions && suggestions[i]; ++i)
|
||||
{
|
||||
if (suggestions[i]->name[pos] != c)
|
||||
{
|
||||
autocomplete = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
++pos;
|
||||
|
||||
if (autocomplete)
|
||||
M_TextInputAddChar(input, c);
|
||||
M_TextInputDelChar(input);
|
||||
}
|
||||
|
||||
// This was the only suggestion, finish autocomplete with a ':' and clear suggestions
|
||||
if (maxsuggestions == 1 || !suggestions[1])
|
||||
autocomplete->skip++;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Try to find emote to autocomplete
|
||||
|
||||
int emotestart = autocomplete->emotestart;
|
||||
|
||||
// No emote - no autocomplete
|
||||
if (emotestart == -1 || input->cursor - emotestart < 2)
|
||||
return false;
|
||||
|
||||
strlcpy(autocomplete->complete, &input->buffer[emotestart], input->cursor-emotestart+1);
|
||||
}
|
||||
|
||||
emote_t *completed = M_FindEmote(autocomplete->complete, strlen(autocomplete->complete), autocomplete->skip);
|
||||
|
||||
// We hit end of list of suggested emotes
|
||||
if (completed == NULL)
|
||||
{
|
||||
autocomplete->skip = 0;
|
||||
completed = M_FindEmote(autocomplete->complete, strlen(autocomplete->complete), autocomplete->skip);
|
||||
|
||||
// NULL again, list was empty to begin with
|
||||
if (completed == NULL)
|
||||
{
|
||||
M_TextInputAddChar(input, ':');
|
||||
suggestions[0] = NULL;
|
||||
// Clear autocompletion state
|
||||
autocomplete->complete[0] = 0;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Erase previously typed emote. Not really efficent but too lazy to count chars and do M_TextInputDel()
|
||||
while (input->buffer[input->cursor-1] != ':')
|
||||
{
|
||||
M_TextInputDelChar(input);
|
||||
}
|
||||
|
||||
M_TextInputAddString(input, completed->name);
|
||||
M_TextInputAddChar(input, ':');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean M_TextInputHandleEmotes(textinput_t *input, INT32 key, emote_autocomplete_t *autocomplete)
|
||||
{
|
||||
boolean ret = M_TextInputHandleBase(input, key, true);
|
||||
|
||||
// After this handled key we ended up inside an emote, lets fix that
|
||||
if (M_TextInputCheckEmote(input))
|
||||
M_TextInputToWordEnd(input, !shiftdown);
|
||||
|
||||
// Always update it
|
||||
autocomplete->emotestart = M_TextInputEmoteStart(input);
|
||||
|
||||
if (key == '\t' || (autocomplete->complete[0] == 0 && key == KEY_ENTER))
|
||||
{
|
||||
if (M_TextInputCompleteEmote(input, autocomplete) && key == KEY_ENTER) // Don't send message if we've autocompleted an emote
|
||||
ret = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Reset state just in case
|
||||
autocomplete->complete[0] = 0;
|
||||
autocomplete->skip = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
+7
-1
@@ -26,6 +26,12 @@ typedef struct textinput_s {
|
||||
unsigned skull;
|
||||
} textinput_t;
|
||||
|
||||
typedef struct emote_autocomplete_s {
|
||||
char complete[MAXEMOTENAME+1];
|
||||
int skip;
|
||||
int emotestart;
|
||||
} emote_autocomplete_t;
|
||||
|
||||
void M_TextInputInit(textinput_t *input, char *buffer, size_t buffer_size);
|
||||
|
||||
void M_TextInputClear(textinput_t *input);
|
||||
@@ -36,7 +42,7 @@ boolean M_TextInputHandle(textinput_t *input, INT32 key);
|
||||
|
||||
// Does everything same as M_TextInputHandle, but also handles emotes in input string
|
||||
// If currently typing something that looks like an existing emote, return suggestions for it
|
||||
boolean M_TextInputHandleEmotes(textinput_t *input, INT32 key, emote_t *suggestions[], int maxsuggestions);
|
||||
boolean M_TextInputHandleEmotes(textinput_t *input, INT32 key, emote_autocomplete_t *autocomplete);
|
||||
|
||||
#define M_DrawTextInput(x, y, input, flags) M_DrawTextInputScroll((x), (y), (input), (flags), ((input)->buffer_size-1)*8)
|
||||
void M_DrawTextInputScroll(INT32 x, INT32 y, textinput_t *input, INT32 flags, INT32 MAXINPUTWIDTH);
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
void T_MoveCeiling(ceiling_t *ceiling)
|
||||
{
|
||||
result_e res;
|
||||
boolean dontupdate = false;
|
||||
|
||||
if (ceiling->delaytimer)
|
||||
{
|
||||
@@ -69,9 +68,7 @@ void T_MoveCeiling(ceiling_t *ceiling)
|
||||
case instantMoveCeilingByFrontSector:
|
||||
ceiling->sector->ceilingpic = ceiling->texture;
|
||||
ceiling->sector->ceilingdata = NULL;
|
||||
ceiling->sector->ceilspeed = 0;
|
||||
P_RemoveThinker(&ceiling->thinker);
|
||||
dontupdate = true;
|
||||
break;
|
||||
case moveCeilingByFrontSector:
|
||||
if (ceiling->texture < -1) // chained linedef executing
|
||||
@@ -83,9 +80,7 @@ void T_MoveCeiling(ceiling_t *ceiling)
|
||||
// case raiseCeilingByLine:
|
||||
case moveCeilingByFrontTexture:
|
||||
ceiling->sector->ceilingdata = NULL;
|
||||
ceiling->sector->ceilspeed = 0;
|
||||
P_RemoveThinker(&ceiling->thinker);
|
||||
dontupdate = true;
|
||||
break;
|
||||
|
||||
case fastCrushAndRaise:
|
||||
@@ -189,9 +184,7 @@ void T_MoveCeiling(ceiling_t *ceiling)
|
||||
case instantMoveCeilingByFrontSector:
|
||||
ceiling->sector->ceilingpic = ceiling->texture;
|
||||
ceiling->sector->ceilingdata = NULL;
|
||||
ceiling->sector->ceilspeed = 0;
|
||||
P_RemoveThinker(&ceiling->thinker);
|
||||
dontupdate = true;
|
||||
break;
|
||||
|
||||
case moveCeilingByFrontSector:
|
||||
@@ -209,9 +202,7 @@ void T_MoveCeiling(ceiling_t *ceiling)
|
||||
// case lowerCeilingByLine:
|
||||
case moveCeilingByFrontTexture:
|
||||
ceiling->sector->ceilingdata = NULL;
|
||||
ceiling->sector->ceilspeed = 0;
|
||||
P_RemoveThinker(&ceiling->thinker);
|
||||
dontupdate = true;
|
||||
break;
|
||||
case bounceCeiling:
|
||||
{
|
||||
@@ -290,10 +281,6 @@ void T_MoveCeiling(ceiling_t *ceiling)
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (!dontupdate)
|
||||
ceiling->sector->ceilspeed = ceiling->speed*ceiling->direction;
|
||||
else
|
||||
ceiling->sector->ceilspeed = 0;
|
||||
}
|
||||
|
||||
/** Moves a ceiling crusher.
|
||||
@@ -335,12 +322,9 @@ void T_CrushCeiling(ceiling_t *ceiling)
|
||||
switch(ceiling->type)
|
||||
{
|
||||
case crushCeilOnce:
|
||||
ceiling->sector->ceilspeed = 0;
|
||||
ceiling->sector->ceilingdata = NULL;
|
||||
break;
|
||||
case crushBothOnce:
|
||||
ceiling->sector->floorspeed = 0;
|
||||
ceiling->sector->ceilspeed = 0;
|
||||
ceiling->sector->ceilingdata = NULL;
|
||||
break;
|
||||
default:
|
||||
@@ -377,11 +361,6 @@ void T_CrushCeiling(ceiling_t *ceiling)
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (ceiling->type == crushBothOnce)
|
||||
ceiling->sector->floorspeed = ceiling->speed*(-ceiling->direction);
|
||||
|
||||
ceiling->sector->ceilspeed = ceiling->speed*ceiling->direction;
|
||||
}
|
||||
|
||||
/** Starts a ceiling mover.
|
||||
|
||||
+19
-8
@@ -8176,13 +8176,16 @@ void A_SPBChase(void *thing)
|
||||
// Smoothly rotate horz angle
|
||||
angle_t input = hang - actor->angle;
|
||||
boolean invert = (input > ANGLE_180);
|
||||
fixed_t fixedinput;
|
||||
if (invert)
|
||||
input = InvAngle(input);
|
||||
fixedinput = AngleFixed(input);
|
||||
|
||||
// Slow down when turning; it looks better and makes U-turns not unfair
|
||||
xyspeed = FixedMul(actor->cvmem, max(0, (((180<<FRACBITS) - AngleFixed(input)) / 90) - FRACUNIT));
|
||||
xyspeed = (((180<<FRACBITS) - fixedinput) / 90) - FRACUNIT;
|
||||
xyspeed = FixedMul(actor->cvmem, max(0, xyspeed));
|
||||
|
||||
input = FixedAngle(AngleFixed(input)/4);
|
||||
input = FixedAngle(fixedinput/4);
|
||||
if (invert)
|
||||
input = InvAngle(input);
|
||||
|
||||
@@ -8193,11 +8196,13 @@ void A_SPBChase(void *thing)
|
||||
invert = (input > ANGLE_180);
|
||||
if (invert)
|
||||
input = InvAngle(input);
|
||||
fixedinput = AngleFixed(input);
|
||||
|
||||
// Slow down when turning; might as well do it for momz, since we do it above too
|
||||
zspeed = FixedMul(actor->cvmem, max(0, (((180<<FRACBITS) - AngleFixed(input)) / 90) - FRACUNIT));
|
||||
zspeed = (((180<<FRACBITS) - fixedinput) / 90) - FRACUNIT;
|
||||
zspeed = FixedMul(actor->cvmem, max(0, zspeed));
|
||||
|
||||
input = FixedAngle(AngleFixed(input)/4);
|
||||
input = FixedAngle(fixedinput/4);
|
||||
if (invert)
|
||||
input = InvAngle(input);
|
||||
|
||||
@@ -8301,13 +8306,17 @@ void A_SPBChase(void *thing)
|
||||
// Smoothly rotate horz angle
|
||||
angle_t input = hang - actor->angle;
|
||||
boolean invert = (input > ANGLE_180);
|
||||
fixed_t fixedinput;
|
||||
|
||||
if (invert)
|
||||
input = InvAngle(input);
|
||||
fixedinput = AngleFixed(input);
|
||||
|
||||
// Slow down when turning; it looks better and makes U-turns not unfair
|
||||
xyspeed = FixedMul(wspeed, max(0, (((180<<FRACBITS) - AngleFixed(input)) / 90) - FRACUNIT));
|
||||
xyspeed = (((180<<FRACBITS) - fixedinput) / 90) - FRACUNIT;
|
||||
xyspeed = FixedMul(wspeed, max(0, xyspeed));
|
||||
|
||||
input = FixedAngle(AngleFixed(input)/4);
|
||||
input = FixedAngle(fixedinput/4);
|
||||
if (invert)
|
||||
input = InvAngle(input);
|
||||
|
||||
@@ -8318,11 +8327,13 @@ void A_SPBChase(void *thing)
|
||||
invert = (input > ANGLE_180);
|
||||
if (invert)
|
||||
input = InvAngle(input);
|
||||
fixedinput = AngleFixed(input);
|
||||
|
||||
// Slow down when turning; might as well do it for momz, since we do it above too
|
||||
zspeed = FixedMul(wspeed, max(0, (((180<<FRACBITS) - AngleFixed(input)) / 90) - FRACUNIT));
|
||||
zspeed = max(0, (((180<<FRACBITS) - fixedinput) / 90) - FRACUNIT);
|
||||
zspeed = FixedMul(wspeed, zspeed);
|
||||
|
||||
input = FixedAngle(AngleFixed(input)/4);
|
||||
input = FixedAngle(fixedinput/4);
|
||||
if (invert)
|
||||
input = InvAngle(input);
|
||||
|
||||
|
||||
+2
-90
@@ -279,7 +279,6 @@ result_e T_MovePlane(sector_t *sector, fixed_t speed, fixed_t dest, boolean crus
|
||||
void T_MoveFloor(floormove_t *movefloor)
|
||||
{
|
||||
result_e res = 0;
|
||||
boolean dontupdate = false;
|
||||
|
||||
if (movefloor->delaytimer)
|
||||
{
|
||||
@@ -325,7 +324,6 @@ void T_MoveFloor(floormove_t *movefloor)
|
||||
else
|
||||
movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight;
|
||||
movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1;
|
||||
movefloor->sector->floorspeed = movefloor->speed * movefloor->direction;
|
||||
movefloor->delaytimer = movefloor->delay;
|
||||
movefloor->sector->moved = true;
|
||||
return; // not break, why did this work? Graue 04-03-2004
|
||||
@@ -341,7 +339,6 @@ void T_MoveFloor(floormove_t *movefloor)
|
||||
movefloor->speed = movefloor->origspeed = FixedDiv(abs(lines[movefloor->texture].dx),4*FRACUNIT); // forward again, use dx
|
||||
}
|
||||
movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1;
|
||||
movefloor->sector->floorspeed = movefloor->speed * movefloor->direction;
|
||||
movefloor->delaytimer = movefloor->delay;
|
||||
movefloor->sector->moved = true;
|
||||
return; // not break, why did this work? Graue 04-03-2004
|
||||
@@ -374,7 +371,6 @@ void T_MoveFloor(floormove_t *movefloor)
|
||||
else
|
||||
movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight;
|
||||
movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1;
|
||||
movefloor->sector->floorspeed = movefloor->speed * movefloor->direction;
|
||||
movefloor->delaytimer = movefloor->delay;
|
||||
movefloor->sector->moved = true;
|
||||
return; // not break, why did this work? Graue 04-03-2004
|
||||
@@ -390,14 +386,12 @@ void T_MoveFloor(floormove_t *movefloor)
|
||||
movefloor->speed = movefloor->origspeed = FixedDiv(abs(lines[movefloor->texture].dx),4*FRACUNIT); // forward again, use dx
|
||||
}
|
||||
movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1;
|
||||
movefloor->sector->floorspeed = movefloor->speed * movefloor->direction;
|
||||
movefloor->delaytimer = movefloor->delay;
|
||||
movefloor->sector->moved = true;
|
||||
return; // not break, why did this work? Graue 04-03-2004
|
||||
case crushFloorOnce:
|
||||
movefloor->sector->floordata = NULL; // Clear up the thinker so others can use it
|
||||
P_RemoveThinker(&movefloor->thinker);
|
||||
movefloor->sector->floorspeed = 0;
|
||||
movefloor->sector->moved = true;
|
||||
return;
|
||||
default:
|
||||
@@ -406,14 +400,8 @@ void T_MoveFloor(floormove_t *movefloor)
|
||||
}
|
||||
|
||||
movefloor->sector->floordata = NULL; // Clear up the thinker so others can use it
|
||||
movefloor->sector->floorspeed = 0;
|
||||
P_RemoveThinker(&movefloor->thinker);
|
||||
dontupdate = true;
|
||||
}
|
||||
if (!dontupdate)
|
||||
movefloor->sector->floorspeed = movefloor->speed*movefloor->direction;
|
||||
else
|
||||
movefloor->sector->floorspeed = 0;
|
||||
|
||||
movefloor->sector->moved = true;
|
||||
}
|
||||
@@ -623,22 +611,13 @@ void T_MoveElevator(elevator_t *elevator)
|
||||
{
|
||||
elevator->sector->floordata = NULL; //jff 2/22/98
|
||||
elevator->sector->ceilingdata = NULL; //jff 2/22/98
|
||||
elevator->sector->ceilspeed = 0;
|
||||
elevator->sector->floorspeed = 0;
|
||||
P_RemoveThinker(&elevator->thinker); // remove elevator from actives
|
||||
dontupdate = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!dontupdate)
|
||||
if (dontupdate)
|
||||
{
|
||||
elevator->sector->floorspeed = elevator->speed*elevator->direction;
|
||||
elevator->sector->ceilspeed = 42;
|
||||
}
|
||||
else
|
||||
{
|
||||
elevator->sector->floorspeed = 0;
|
||||
elevator->sector->ceilspeed = 0;
|
||||
elevator->sector->floordata = NULL;
|
||||
elevator->sector->ceilingdata = NULL;
|
||||
}
|
||||
@@ -695,8 +674,6 @@ void T_ContinuousFalling(levelspecthink_t *faller)
|
||||
}
|
||||
}
|
||||
|
||||
faller->sector->floorspeed = faller->speed*faller->direction;
|
||||
faller->sector->ceilspeed = 42;
|
||||
faller->sector->moved = true;
|
||||
#undef speed
|
||||
#undef direction
|
||||
@@ -767,9 +744,7 @@ void T_BounceCheese(levelspecthink_t *bouncer)
|
||||
{
|
||||
bouncer->sector->crumblestate = 1;
|
||||
bouncer->sector->ceilingdata = NULL;
|
||||
bouncer->sector->ceilspeed = 0;
|
||||
bouncer->sector->floordata = NULL;
|
||||
bouncer->sector->floorspeed = 0;
|
||||
P_RemoveThinker(&bouncer->thinker); // remove bouncer from actives
|
||||
return;
|
||||
}
|
||||
@@ -795,8 +770,6 @@ void T_BounceCheese(levelspecthink_t *bouncer)
|
||||
T_MovePlane(bouncer->sector, 0, bouncer->sector->floorheight, 0, 0, -1); // update things on floor
|
||||
bouncer->sector->ceilingdata = NULL;
|
||||
bouncer->sector->floordata = NULL;
|
||||
bouncer->sector->floorspeed = 0;
|
||||
bouncer->sector->ceilspeed = 0;
|
||||
bouncer->sector->moved = true;
|
||||
P_RemoveThinker(&bouncer->thinker); // remove bouncer from actives
|
||||
return;
|
||||
@@ -810,8 +783,6 @@ void T_BounceCheese(levelspecthink_t *bouncer)
|
||||
T_MovePlane(bouncer->sector, 0, bouncer->sector->floorheight, 0, 0, -1); // update things on floor
|
||||
bouncer->sector->ceilingdata = NULL;
|
||||
bouncer->sector->floordata = NULL;
|
||||
bouncer->sector->floorspeed = 0;
|
||||
bouncer->sector->ceilspeed = 0;
|
||||
bouncer->sector->moved = true;
|
||||
P_RemoveThinker(&bouncer->thinker); // remove bouncer from actives
|
||||
return;
|
||||
@@ -827,9 +798,6 @@ void T_BounceCheese(levelspecthink_t *bouncer)
|
||||
T_MovePlane(bouncer->sector, bouncer->speed/2, bouncer->sector->floorheight - 70*FRACUNIT,
|
||||
0, 0, -1); // move floor
|
||||
|
||||
bouncer->sector->floorspeed = -bouncer->speed/2;
|
||||
bouncer->sector->ceilspeed = 42;
|
||||
|
||||
if (bouncer->sector->ceilingheight < bouncer->ceilingwasheight && bouncer->low == 0) // Down
|
||||
{
|
||||
if (abs(bouncer->speed) < 6*FRACUNIT)
|
||||
@@ -878,9 +846,7 @@ void T_BounceCheese(levelspecthink_t *bouncer)
|
||||
T_MovePlane(bouncer->sector, 0, bouncer->sector->ceilingheight, 0, 1, -1); // update things on ceiling
|
||||
T_MovePlane(bouncer->sector, 0, bouncer->sector->floorheight, 0, 0, -1); // update things on floor
|
||||
bouncer->sector->ceilingdata = NULL;
|
||||
bouncer->sector->floordata = NULL;
|
||||
bouncer->sector->floorspeed = 0;
|
||||
bouncer->sector->ceilspeed = 0;
|
||||
bouncer->sector->floordata = NULL;;
|
||||
bouncer->sector->moved = true;
|
||||
P_RemoveThinker(&bouncer->thinker); // remove bouncer from actives
|
||||
}
|
||||
@@ -920,8 +886,6 @@ void T_StartCrumble(elevator_t *elevator)
|
||||
|| (elevator->floordestheight == 0 && elevator->direction == 1))
|
||||
&& elevator->type == elevateContinuous) // No return crumbler
|
||||
{
|
||||
elevator->sector->ceilspeed = 0;
|
||||
elevator->sector->floorspeed = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -934,9 +898,6 @@ void T_StartCrumble(elevator_t *elevator)
|
||||
elevator->distance = -15*TICRATE; // Timer until platform returns to original position.
|
||||
else
|
||||
{
|
||||
// Timer isn't up yet, so just keep waiting.
|
||||
elevator->sector->ceilspeed = 0;
|
||||
elevator->sector->floorspeed = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -965,8 +926,6 @@ void T_StartCrumble(elevator_t *elevator)
|
||||
else
|
||||
elevator->direction = 1;
|
||||
|
||||
elevator->sector->ceilspeed = 0;
|
||||
elevator->sector->floorspeed = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1050,9 +1009,6 @@ void T_StartCrumble(elevator_t *elevator)
|
||||
0, // move ceiling
|
||||
elevator->direction
|
||||
);
|
||||
|
||||
elevator->sector->ceilspeed = 42;
|
||||
elevator->sector->floorspeed = elevator->speed*elevator->direction;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1063,8 +1019,6 @@ void T_StartCrumble(elevator_t *elevator)
|
||||
elevator->sector->floorheight = elevator->floorwasheight;
|
||||
elevator->sector->floordata = NULL;
|
||||
elevator->sector->ceilingdata = NULL;
|
||||
elevator->sector->ceilspeed = 0;
|
||||
elevator->sector->floorspeed = 0;
|
||||
elevator->sector->moved = true;
|
||||
P_RemoveThinker(&elevator->thinker);
|
||||
}
|
||||
@@ -1121,8 +1075,6 @@ void T_MarioBlock(levelspecthink_t *block)
|
||||
P_RemoveThinker(&block->thinker);
|
||||
block->sector->floordata = NULL;
|
||||
block->sector->ceilingdata = NULL;
|
||||
block->sector->floorspeed = 0;
|
||||
block->sector->ceilspeed = 0;
|
||||
}
|
||||
|
||||
for (i = -1; (i = P_FindSectorFromTag((INT16)block->vars[0], i)) >= 0 ;)
|
||||
@@ -1365,8 +1317,6 @@ wegotit:
|
||||
{
|
||||
bridge->sector->floorheight = LOWCEILINGHEIGHT - (bridge->sector->ceilingheight - bridge->sector->floorheight);
|
||||
bridge->sector->ceilingheight = LOWCEILINGHEIGHT;
|
||||
bridge->sector->ceilspeed = 0;
|
||||
bridge->sector->floorspeed = 0;
|
||||
goto dorest;
|
||||
}
|
||||
|
||||
@@ -1422,9 +1372,6 @@ wegotit:
|
||||
DIRECTION // direction
|
||||
);
|
||||
|
||||
bridge->sector->ceilspeed = 42;
|
||||
bridge->sector->floorspeed = CURSPEED*DIRECTION;
|
||||
|
||||
dorest:
|
||||
// Adjust joined sector heights
|
||||
{
|
||||
@@ -1463,8 +1410,6 @@ wegotit:
|
||||
{
|
||||
bridge->sector->floorheight = ORIGCEILINGHEIGHT - (bridge->sector->ceilingheight - bridge->sector->floorheight);
|
||||
bridge->sector->ceilingheight = ORIGCEILINGHEIGHT;
|
||||
bridge->sector->ceilspeed = 0;
|
||||
bridge->sector->floorspeed = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1519,9 +1464,6 @@ wegotit:
|
||||
0, // floor or ceiling (0 for floor)
|
||||
DIRECTION // direction
|
||||
);
|
||||
|
||||
bridge->sector->ceilspeed = 42;
|
||||
bridge->sector->floorspeed = CURSPEED*DIRECTION;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1558,8 +1500,6 @@ wegotit:
|
||||
{
|
||||
bridge->sector->floorheight = ORIGCEILINGHEIGHT - (bridge->sector->ceilingheight - bridge->sector->floorheight);
|
||||
bridge->sector->ceilingheight = ORIGCEILINGHEIGHT;
|
||||
bridge->sector->ceilspeed = 0;
|
||||
bridge->sector->floorspeed = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1614,9 +1554,6 @@ wegotit:
|
||||
0, // floor or ceiling (0 for floor)
|
||||
DIRECTION // direction
|
||||
);
|
||||
|
||||
bridge->sector->ceilspeed = 42;
|
||||
bridge->sector->floorspeed = CURSPEED*DIRECTION;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1642,8 +1579,6 @@ wegotit:
|
||||
{
|
||||
bridge->sector->floorheight = ORIGCEILINGHEIGHT - (bridge->sector->ceilingheight - bridge->sector->floorheight);
|
||||
bridge->sector->ceilingheight = ORIGCEILINGHEIGHT;
|
||||
bridge->sector->ceilspeed = 0;
|
||||
bridge->sector->floorspeed = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1698,9 +1633,6 @@ wegotit:
|
||||
0, // floor or ceiling (0 for floor)
|
||||
DIRECTION // direction
|
||||
);
|
||||
|
||||
bridge->sector->ceilspeed = 42;
|
||||
bridge->sector->floorspeed = CURSPEED*DIRECTION;
|
||||
}
|
||||
}
|
||||
// Update precip
|
||||
@@ -1875,9 +1807,6 @@ void T_ThwompSector(levelspecthink_t *thwomp)
|
||||
|
||||
if (res == pastdest)
|
||||
thwomp->direction = 0; // stop moving
|
||||
|
||||
thwomp->sector->ceilspeed = 42;
|
||||
thwomp->sector->floorspeed = thwomp->speed*thwomp->direction;
|
||||
}
|
||||
else if (thwomp->direction < 0) // Crashing down!
|
||||
{
|
||||
@@ -1932,16 +1861,10 @@ void T_ThwompSector(levelspecthink_t *thwomp)
|
||||
thwomp->direction = 1; // start heading back up
|
||||
thwomp->distance = TICRATE; // but only after a small delay
|
||||
}
|
||||
|
||||
thwomp->sector->ceilspeed = 42;
|
||||
thwomp->sector->floorspeed = thwomp->speed*thwomp->direction;
|
||||
}
|
||||
else // Not going anywhere, so look for players.
|
||||
{
|
||||
thwomp->direction = -1;
|
||||
|
||||
thwomp->sector->ceilspeed = 0;
|
||||
thwomp->sector->floorspeed = 0;
|
||||
}
|
||||
|
||||
actionsector->moved = true;
|
||||
@@ -2355,8 +2278,6 @@ void T_RaiseSector(levelspecthink_t *raise)
|
||||
{
|
||||
raise->sector->floorheight = raise->vars[7] - (raise->sector->ceilingheight - raise->sector->floorheight);
|
||||
raise->sector->ceilingheight = raise->vars[7];
|
||||
raise->sector->ceilspeed = 0;
|
||||
raise->sector->floorspeed = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2370,8 +2291,6 @@ void T_RaiseSector(levelspecthink_t *raise)
|
||||
{
|
||||
raise->sector->floorheight = raise->vars[5] - (raise->sector->ceilingheight - raise->sector->floorheight);
|
||||
raise->sector->ceilingheight = raise->vars[5];
|
||||
raise->sector->ceilspeed = 0;
|
||||
raise->sector->floorspeed = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2390,8 +2309,6 @@ void T_RaiseSector(levelspecthink_t *raise)
|
||||
{
|
||||
raise->sector->floorheight = raise->vars[5] - (raise->sector->ceilingheight - raise->sector->floorheight);
|
||||
raise->sector->ceilingheight = raise->vars[5];
|
||||
raise->sector->ceilspeed = 0;
|
||||
raise->sector->floorspeed = 0;
|
||||
return;
|
||||
}
|
||||
raise->vars[8] = 1;
|
||||
@@ -2404,8 +2321,6 @@ void T_RaiseSector(levelspecthink_t *raise)
|
||||
{
|
||||
raise->sector->floorheight = raise->vars[7] - (raise->sector->ceilingheight - raise->sector->floorheight);
|
||||
raise->sector->ceilingheight = raise->vars[7];
|
||||
raise->sector->ceilspeed = 0;
|
||||
raise->sector->floorspeed = 0;
|
||||
return;
|
||||
}
|
||||
raise->vars[8] = -1;
|
||||
@@ -2460,9 +2375,6 @@ void T_RaiseSector(levelspecthink_t *raise)
|
||||
raise->vars[8] // direction
|
||||
);
|
||||
|
||||
raise->sector->ceilspeed = 42;
|
||||
raise->sector->floorspeed = raise->vars[3]*raise->vars[8];
|
||||
|
||||
for (i = -1; (i = P_FindSectorFromTag(raise->sourceline->tag, i)) >= 0 ;)
|
||||
sectors[i].moved = true;
|
||||
}
|
||||
|
||||
+3
-8
@@ -869,14 +869,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||
|
||||
toucher->angle = special->angle;
|
||||
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (player == P_GetLocalPlayerForNum(i))
|
||||
{
|
||||
localangle[i] = toucher->angle;
|
||||
break;
|
||||
}
|
||||
}
|
||||
P_ForceLocalAngle(player, toucher->angle);
|
||||
|
||||
P_ResetPlayer(player);
|
||||
|
||||
@@ -2171,7 +2164,9 @@ static void P_KillPlayer(player_t *player, mobj_t *source)
|
||||
P_SetScale(karmahitbox, player->mo->scale);
|
||||
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
||||
}
|
||||
|
||||
player->kartstuff[k_bumper]--;
|
||||
|
||||
if (K_IsPlayerWanted(player))
|
||||
K_CalculateBattleWanted();
|
||||
}
|
||||
|
||||
+7
-1
@@ -192,6 +192,7 @@ void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor);
|
||||
void P_ResetPlayer(player_t *player);
|
||||
player_t *P_GetLocalPlayerForNum(UINT8 pnum);
|
||||
INT32 P_GetLocalPlayerNumForNum(UINT8 pnum);
|
||||
INT32 P_GetLocalPlayerNumForPlayer(const player_t *player);
|
||||
boolean P_IsLocalPlayer(const player_t *player);
|
||||
boolean P_IsLocalPlayerNum(UINT8 pnum);
|
||||
boolean P_IsDisplayPlayer(const player_t *player);
|
||||
@@ -226,7 +227,9 @@ void P_PlayerThink(player_t *player);
|
||||
void P_PlayerAfterThink(player_t *player);
|
||||
void P_DoPlayerExit(player_t *player);
|
||||
void P_DoTimeOver(player_t *player);
|
||||
//void P_NightserizePlayer(player_t *player, INT32 ptime);
|
||||
|
||||
angle_t P_GetLocalAngle(player_t *player);
|
||||
void P_ForceLocalAngle(player_t *player, angle_t angle);
|
||||
|
||||
void P_InstaThrust(mobj_t *mo, angle_t angle, fixed_t move);
|
||||
fixed_t P_ReturnThrustX(mobj_t *mo, angle_t angle, fixed_t move);
|
||||
@@ -269,6 +272,9 @@ extern consvar_t cv_gravity;
|
||||
|
||||
void P_RespawnSpecials(void);
|
||||
|
||||
extern mobjtype_t g_doomednum_to_mobjtype[UINT16_MAX];
|
||||
void CalculateDoomednumToMobjtype(void);
|
||||
|
||||
mobj_t *P_AllocateMobj(void);
|
||||
mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type);
|
||||
|
||||
|
||||
+1
-8
@@ -223,14 +223,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
||||
|
||||
if (!demo.playback || P_AnalogMove(object->player))
|
||||
{
|
||||
for (UINT8 j = 0; j <= splitscreen; ++j)
|
||||
{
|
||||
if (object->player == P_GetLocalPlayerForNum(j))
|
||||
{
|
||||
localangle[j] = spring->angle;
|
||||
break;
|
||||
}
|
||||
}
|
||||
P_ForceLocalAngle(object->player, spring->angle);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -230,8 +230,8 @@ PUREFUNC fixed_t P_InterceptVector(divline_t *v2, divline_t *v1)
|
||||
// Sets opentop and openbottom to the window through a two sided line.
|
||||
// OPTIMIZE: keep this precalculated
|
||||
//
|
||||
fixed_t opentop, openbottom, openrange, lowfloor, highceiling;
|
||||
pslope_t *opentopslope, *openbottomslope;
|
||||
fixed_t opentop = 0, openbottom = 0, openrange = 0, lowfloor = 0, highceiling = 0;
|
||||
pslope_t *opentopslope = NULL, *openbottomslope = NULL;
|
||||
|
||||
// P_CameraLineOpening
|
||||
// P_LineOpening, but for camera
|
||||
@@ -985,7 +985,7 @@ boolean P_BlockThingsIterator(INT32 x, INT32 y, boolean (*func)(mobj_t *))
|
||||
static intercept_t *intercepts = NULL;
|
||||
static intercept_t *intercept_p = NULL;
|
||||
|
||||
divline_t trace;
|
||||
divline_t trace = {};
|
||||
static boolean earlyout;
|
||||
|
||||
//SoM: 4/6/2000: Remove limit on intercepts.
|
||||
|
||||
+1109
-1102
File diff suppressed because it is too large.
Load diff
+3
-6
@@ -1383,13 +1383,10 @@ static void Polyobj_rotateThings(polyobj_t *po, vector2_t origin, angle_t delta,
|
||||
{
|
||||
mo->angle += delta;
|
||||
|
||||
for (UINT8 i = 0; i <= splitscreen; i++)
|
||||
if (mo->player)
|
||||
{
|
||||
if (mo->player == P_GetLocalPlayerForNum(i))
|
||||
{
|
||||
localangle[i] += delta;
|
||||
break;
|
||||
}
|
||||
angle_t localangle = P_GetLocalAngle(mo->player);
|
||||
P_ForceLocalAngle(mo->player, localangle + delta);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+7
-32
@@ -339,7 +339,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save, boolean reloading)
|
||||
for (j = 0; j < NUMKARTSTUFF; j++)
|
||||
player->kartstuff[j] = READINT32(save->p);
|
||||
|
||||
player->frameangle = READANGLE(save->p);
|
||||
player->frameangle = player->old_frameangle = READANGLE(save->p);
|
||||
|
||||
player->playerstate = READUINT8(save->p);
|
||||
player->pflags = READUINT32(save->p);
|
||||
@@ -1965,21 +1965,6 @@ FUNCINLINE static ATTRINLINE player_t *LoadPlayer(UINT32 player)
|
||||
// Loads a mobj_t from a save game
|
||||
//
|
||||
|
||||
static mobjtype_t g_doomednum_to_mobjtype[UINT16_MAX];
|
||||
|
||||
static void CalculateDoomednumToMobjtype(void)
|
||||
{
|
||||
memset(g_doomednum_to_mobjtype, MT_NULL, sizeof(g_doomednum_to_mobjtype));
|
||||
|
||||
for (size_t i = MT_NULL+1; i < NUMMOBJTYPES; i++)
|
||||
{
|
||||
if (mobjinfo[i].doomednum > 0 && mobjinfo[i].doomednum <= UINT16_MAX)
|
||||
{
|
||||
g_doomednum_to_mobjtype[ mobjinfo[i].doomednum ] = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
|
||||
{
|
||||
mobj_t *mobj;
|
||||
@@ -2052,15 +2037,15 @@ static void LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
|
||||
|
||||
if (diff & MD_POS)
|
||||
{
|
||||
mobj->x = READFIXED(save->p);
|
||||
mobj->y = READFIXED(save->p);
|
||||
mobj->angle = READANGLE(save->p);
|
||||
mobj->x = mobj->old_x = READFIXED(save->p);
|
||||
mobj->y = mobj->old_y = READFIXED(save->p);
|
||||
mobj->angle = mobj->old_angle = READANGLE(save->p);
|
||||
}
|
||||
else
|
||||
{
|
||||
mobj->x = mobj->spawnpoint->x << FRACBITS;
|
||||
mobj->y = mobj->spawnpoint->y << FRACBITS;
|
||||
mobj->angle = FixedAngle(mobj->spawnpoint->angle*FRACUNIT);
|
||||
mobj->x = mobj->old_x = mobj->spawnpoint->x << FRACBITS;
|
||||
mobj->y = mobj->old_y = mobj->spawnpoint->y << FRACBITS;
|
||||
mobj->angle = mobj->old_angle = FixedAngle(mobj->spawnpoint->angle*FRACUNIT);
|
||||
}
|
||||
|
||||
if (diff & MD_MOM)
|
||||
@@ -2122,12 +2107,6 @@ static void LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
|
||||
i = READUINT8(save->p);
|
||||
mobj->player = &players[i];
|
||||
mobj->player->mo = mobj;
|
||||
|
||||
// added for angle prediction
|
||||
if (i == P_GetLocalPlayerNumForNum(i))
|
||||
{
|
||||
localangle[i] = mobj->angle;
|
||||
}
|
||||
}
|
||||
if (diff & MD_MOVEDIR)
|
||||
mobj->movedir = READANGLE(save->p);
|
||||
@@ -2885,10 +2864,6 @@ static void P_NetUnArchiveThinkers(savebuffer_t *save)
|
||||
if (READUINT32(save->p) != ARCHIVEBLOCK_THINKERS)
|
||||
I_Error("Bad $$$.sav at archive block Thinkers");
|
||||
|
||||
// Pre-calculate this lookup, because it was wasting
|
||||
// a shit ton of time loading mobj thinkers.
|
||||
CalculateDoomednumToMobjtype();
|
||||
|
||||
// remove all the current thinkers
|
||||
for (currentthinker = thinkercap.next; currentthinker != &thinkercap; currentthinker = next)
|
||||
{
|
||||
|
||||
+24
-18
@@ -15,6 +15,7 @@
|
||||
#include "d_main.h"
|
||||
#include "byteptr.h"
|
||||
#include "g_game.h"
|
||||
#include "g_input.h"
|
||||
|
||||
#include "p_local.h"
|
||||
#include "p_setup.h"
|
||||
@@ -596,8 +597,8 @@ FUNCINLINE static ATTRINLINE void P_LoadSubsectors(void *data)
|
||||
//
|
||||
#define MAXLEVELFLATS 256
|
||||
|
||||
size_t numlevelflats;
|
||||
levelflat_t *levelflats;
|
||||
size_t numlevelflats = 0;
|
||||
levelflat_t *levelflats = NULL;
|
||||
|
||||
//SoM: Other files want this info.
|
||||
size_t P_PrecacheLevelFlats(void)
|
||||
@@ -811,6 +812,8 @@ static void P_LoadSectors(UINT8 *data)
|
||||
ss->tag = SHORT(ms->tag);
|
||||
|
||||
ss->flags |= SF_FLIPSPECIAL_FLOOR;
|
||||
|
||||
ss->soundorg.thinker.function = (actionf_p1)P_MobjThinker;
|
||||
}
|
||||
|
||||
// set the sky flat num
|
||||
@@ -1021,7 +1024,7 @@ void P_WriteThings(lumpnum_t lumpnum)
|
||||
size_t i, length;
|
||||
mapthing_t *mt;
|
||||
UINT8 *data;
|
||||
savebuffer_t save;
|
||||
savebuffer_t save = {0};
|
||||
INT16 temp;
|
||||
|
||||
data = W_CacheLumpNum(lumpnum, PU_LEVEL);
|
||||
@@ -2029,8 +2032,8 @@ void P_SetupLevelSky(INT32 skynum, boolean global)
|
||||
R_SetupSkyDraw();
|
||||
}
|
||||
|
||||
static const char *maplumpname;
|
||||
lumpnum_t lastloadedmaplumpnum; // for comparative savegame
|
||||
static const char *maplumpname = NULL;
|
||||
lumpnum_t lastloadedmaplumpnum = LUMPERROR; // for comparative savegame
|
||||
|
||||
//
|
||||
// P_LevelInitStuff
|
||||
@@ -2414,7 +2417,7 @@ static void P_InitCamera(void)
|
||||
displayplayers[0] = consoleplayer; // Start with your OWN view, please!
|
||||
}
|
||||
|
||||
struct minimapinfo minimapinfo;
|
||||
struct minimapinfo minimapinfo = {};
|
||||
static void P_InitMinimapInfo(void)
|
||||
{
|
||||
lumpnum_t lumpnum;
|
||||
@@ -2708,8 +2711,12 @@ void P_FreeLevelState(void)
|
||||
|
||||
G_FreeGhosts(); // ghosts are allocated with PU_LEVEL
|
||||
|
||||
Patch_FreeTag(PU_PATCH_LOWPRIORITY);
|
||||
//Patch_FreeTag(PU_PATCH_ROTATED); // we keep those ty!
|
||||
if (rendermode != render_none)
|
||||
{
|
||||
Patch_FreeTag(PU_PATCH_LOWPRIORITY);
|
||||
//Patch_FreeTag(PU_PATCH_ROTATED); // we keep those ty!
|
||||
}
|
||||
|
||||
Z_FreeTags(PU_LEVEL, PU_PURGELEVEL - 1);
|
||||
|
||||
Y_VoteClear();
|
||||
@@ -2718,6 +2725,9 @@ void P_FreeLevelState(void)
|
||||
// clear the splats from previous level
|
||||
R_ClearLevelSplats();
|
||||
#endif
|
||||
|
||||
R_InitMobjInterpolators();
|
||||
R_InitializeLevelInterpolators();
|
||||
}
|
||||
|
||||
/** Loads a level from a lump or external wad.
|
||||
@@ -2735,13 +2745,8 @@ boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate)
|
||||
lumpnum_t encoreLump = LUMPERROR;
|
||||
UINT8 levelfadecol;
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
midgamejoin = fromnetsave; // makes dynslopes run in P_Ticker/P_PreTicker to avoid synch issues and other stuff
|
||||
midgamejoin = fromnetsave; // makes dynslopes run in P_Ticker to avoid synch issues and other stuff
|
||||
|
||||
levelloading = true;
|
||||
|
||||
@@ -2827,10 +2832,7 @@ boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate)
|
||||
|
||||
P_FreeLevelState();
|
||||
|
||||
R_InitializeLevelInterpolators();
|
||||
|
||||
P_InitThinkers();
|
||||
R_InitMobjInterpolators();
|
||||
P_InitCachedActions();
|
||||
|
||||
// internal game map
|
||||
@@ -2861,6 +2863,10 @@ boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate)
|
||||
|
||||
P_ResetDynamicSlopes();
|
||||
|
||||
// Pre-calculate this lookup, because it was wasting
|
||||
// a shit ton of time loading mobj thinkers.
|
||||
CalculateDoomednumToMobjtype();
|
||||
|
||||
P_SpawnMapThings();
|
||||
|
||||
P_SpawnEmblems(!fromnetsave);
|
||||
@@ -2979,7 +2985,7 @@ boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate)
|
||||
|
||||
G_AddMapToBuffer(gamemap-1);
|
||||
|
||||
D_ResetDeviceLED();
|
||||
G_ResetDeviceLED();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
+13
-13
@@ -338,19 +338,12 @@ void P_SpawnSlope_Line(int linenum)
|
||||
vector3_t origin, point;
|
||||
vector2_t direction;
|
||||
fixed_t nx, ny, dz, extent;
|
||||
|
||||
boolean frontfloor = (special == 700 || special == 702 || special == 703);
|
||||
boolean backfloor = (special == 710 || special == 712 || special == 713);
|
||||
boolean frontceil = (special == 701 || special == 702 || special == 713);
|
||||
boolean backceil = (special == 711 || special == 712 || special == 703);
|
||||
|
||||
UINT8 flags = 0; // Slope flags
|
||||
if (line->flags & ML_NOSONIC)
|
||||
flags |= SL_NOPHYSICS;
|
||||
if (!(line->flags & ML_NOTAILS))
|
||||
flags |= SL_NODYNAMIC;
|
||||
if (line->flags & ML_NOKNUX)
|
||||
flags |= SL_ANCHORVERTEX;
|
||||
|
||||
const boolean frontfloor = (special == 700 || special == 702 || special == 703);
|
||||
const boolean backfloor = (special == 710 || special == 712 || special == 713);
|
||||
const boolean frontceil = (special == 701 || special == 702 || special == 713);
|
||||
const boolean backceil = (special == 711 || special == 712 || special == 703);
|
||||
|
||||
if (!frontfloor && !backfloor && !frontceil && !backceil)
|
||||
{
|
||||
@@ -364,6 +357,13 @@ void P_SpawnSlope_Line(int linenum)
|
||||
return;
|
||||
}
|
||||
|
||||
if (line->flags & ML_NOSONIC)
|
||||
flags |= SL_NOPHYSICS;
|
||||
if (!(line->flags & ML_NOTAILS))
|
||||
flags |= SL_NODYNAMIC;
|
||||
if (line->flags & ML_NOKNUX)
|
||||
flags |= SL_ANCHORVERTEX;
|
||||
|
||||
fixed_t len = R_PointToDist2(0, 0, line->dx, line->dy);
|
||||
nx = FixedDiv(line->dy, len);
|
||||
ny = -FixedDiv(line->dx, len);
|
||||
@@ -809,7 +809,7 @@ void P_ResetDynamicSlopes(void)
|
||||
|
||||
if (lines[i].flags & ML_NOKNUX)
|
||||
*slopetoset = P_NewVertexSlope(lines[i].tag, sides[lines[i].sidenum[which]].textureoffset >> FRACBITS,
|
||||
sides[lines[i].sidenum[which]].rowoffset >> FRACBITS, flags);
|
||||
sides[lines[i].sidenum[which]].rowoffset >> FRACBITS, flags);
|
||||
else
|
||||
*slopetoset = P_NewVertexSlope(lines[i].tag, lines[i].tag, lines[i].tag, flags);
|
||||
|
||||
|
||||
+24
-29
@@ -1978,13 +1978,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
{
|
||||
P_RemoveThinker(&((elevator_t *)sectors[secnum].floordata)->thinker);
|
||||
sectors[secnum].floordata = sectors[secnum].ceilingdata = NULL;
|
||||
sectors[secnum].floorspeed = sectors[secnum].ceilspeed = 0;
|
||||
}
|
||||
else // floormove
|
||||
{
|
||||
P_RemoveThinker(&((floormove_t *)sectors[secnum].floordata)->thinker);
|
||||
sectors[secnum].floordata = NULL;
|
||||
sectors[secnum].floorspeed = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1992,7 +1990,6 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
{
|
||||
P_RemoveThinker(&((ceiling_t *)sectors[secnum].ceilingdata)->thinker);
|
||||
sectors[secnum].ceilingdata = NULL;
|
||||
sectors[secnum].ceilspeed = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2087,13 +2084,17 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
// Seek offset from current song position
|
||||
if (line->flags & ML_EFFECT1)
|
||||
{
|
||||
const UINT32 muslength = S_GetMusicLength();
|
||||
const UINT32 muspos = S_GetMusicPosition();
|
||||
const UINT32 muslooppoint = S_GetMusicLoopPoint();
|
||||
|
||||
// adjust for loop point if subtracting
|
||||
if (position < 0 && S_GetMusicLength() &&
|
||||
S_GetMusicPosition() > S_GetMusicLoopPoint() &&
|
||||
S_GetMusicPosition() + position < S_GetMusicLoopPoint())
|
||||
position = max(S_GetMusicLength() - (S_GetMusicLoopPoint() - (S_GetMusicPosition() + position)), 0);
|
||||
if (position < 0 && muslength &&
|
||||
muspos > muslooppoint &&
|
||||
muspos + position < muslooppoint)
|
||||
position = max(muslength - (muslooppoint - (muspos + position)), 0);
|
||||
else
|
||||
position = max(S_GetMusicPosition() + position, 0);
|
||||
position = max(muspos + position, 0);
|
||||
}
|
||||
|
||||
// Fade current music to target volume (if music won't be changed)
|
||||
@@ -2160,11 +2161,13 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
|
||||
if (sfxnum == sfx_None)
|
||||
return; // Do nothing!
|
||||
|
||||
if (sfxnum < sfx_None || sfxnum >= NUMSFX)
|
||||
{
|
||||
CONS_Debug(DBG_GAMELOGIC, "Line type 414 Executor: sfx number %d is invalid!\n", sfxnum);
|
||||
return;
|
||||
}
|
||||
|
||||
if (line->tag != 0) // Do special stuff only if a non-zero linedef tag is set
|
||||
{
|
||||
if (line->flags & ML_EFFECT5) // Repeat Midtexture
|
||||
@@ -3553,14 +3556,7 @@ DoneSection2:
|
||||
|
||||
if (!demo.playback || P_AnalogMove(player))
|
||||
{
|
||||
for (UINT8 j = 0; j <= splitscreen; ++j)
|
||||
{
|
||||
if (player == P_GetLocalPlayerForNum(j))
|
||||
{
|
||||
localangle[j] = player->mo->angle;
|
||||
break;
|
||||
}
|
||||
}
|
||||
P_ForceLocalAngle(player, player->mo->angle);
|
||||
}
|
||||
|
||||
if (!(lines[i].flags & ML_EFFECT4))
|
||||
@@ -3990,7 +3986,12 @@ DoneSection2:
|
||||
|
||||
player->tossdelay = 3;
|
||||
}
|
||||
|
||||
#if 0
|
||||
// Event - Final Lap
|
||||
// Still works for GME, but disabled for consistency
|
||||
if (G_RaceGametype() && player->laps >= (UINT8)(cv_numlaps.value - 1))
|
||||
S_SpeedMusic(1.2f);
|
||||
#endif
|
||||
if (player->laps >= (unsigned)cv_numlaps.value)
|
||||
{
|
||||
if (P_IsLocalPlayer(player))
|
||||
@@ -7511,22 +7512,16 @@ void T_Pusher(pusher_t *p)
|
||||
thing->player->pflags |= PF_JUMPED;
|
||||
|
||||
thing->player->pflags |= PF_SLIDING;
|
||||
thing->angle = R_PointToAngle2 (0, 0, xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR));
|
||||
thing->angle = R_PointToAngle2(0, 0, xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR));
|
||||
|
||||
if (!demo.playback || P_AnalogMove(thing->player))
|
||||
{
|
||||
for (UINT8 i = 0; i <= splitscreen; ++i)
|
||||
{
|
||||
if (thing->player == P_GetLocalPlayerForNum(i))
|
||||
{
|
||||
if (thing->angle - localangle[i] > ANGLE_180)
|
||||
localangle[i] -= (localangle[i] - thing->angle) / 8;
|
||||
else
|
||||
localangle[i] += (thing->angle - localangle[i]) / 8;
|
||||
angle_t angle = P_GetLocalAngle(thing->player);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (thing->angle - angle > ANGLE_180)
|
||||
P_ForceLocalAngle(thing->player, angle - (angle - thing->angle) / 8);
|
||||
else
|
||||
P_ForceLocalAngle(thing->player, angle + (thing->angle - angle) / 8);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-10
@@ -65,14 +65,7 @@ void P_MixUp(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle,
|
||||
thing->reactiontime = TICRATE/2; // don't move for about half a second
|
||||
|
||||
// absolute angle position
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (thing == P_GetLocalPlayerForNum(i)->mo)
|
||||
{
|
||||
localangle[i] = angle;
|
||||
break;
|
||||
}
|
||||
}
|
||||
P_ForceLocalAngle(thing->player, angle);
|
||||
|
||||
// move chasecam at new player location
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
@@ -106,6 +99,7 @@ void P_MixUp(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle,
|
||||
P_FlashPal(thing->player, PAL_MIXUP, 10);
|
||||
}
|
||||
|
||||
thing->old_angle += (angle-thing->angle);
|
||||
thing->angle = angle;
|
||||
|
||||
thing->momx = thing->momy = thing->momz = 0;
|
||||
@@ -150,18 +144,18 @@ boolean P_Teleport(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle
|
||||
thing->reactiontime = TICRATE/2; // don't move for about half a second
|
||||
|
||||
// absolute angle position
|
||||
P_ForceLocalAngle(thing->player, angle);
|
||||
|
||||
// move chasecam at new player location
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (thing->player != &players[displayplayers[i]])
|
||||
continue;
|
||||
|
||||
localangle[i] = angle;
|
||||
if (camera[i].chase)
|
||||
P_ResetCamera(thing->player, &camera[i]);
|
||||
|
||||
R_ResetViewInterpolation(i + 1);
|
||||
break;
|
||||
}
|
||||
|
||||
// don't run in place after a teleport
|
||||
|
||||
+1
-112
@@ -457,113 +457,6 @@ static inline void P_RunThinkers(void)
|
||||
}
|
||||
}
|
||||
|
||||
// Controller rumble!
|
||||
// this keeps track of a bunch of things
|
||||
// and makes your controller rumble accordingly
|
||||
static void P_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;
|
||||
}
|
||||
|
||||
UINT16 low = 0, high = 0;
|
||||
UINT16 lenght = 57; // in ms
|
||||
|
||||
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((FRACUNIT / 4), (FixedDiv(player->kartstuff[k_spinouttimer], (3*TICRATE / 2)))); // try do some some kinda fadeout
|
||||
}
|
||||
else if (player->kartstuff[k_sneakertimer] > (sneakertime-(TICRATE/2)))
|
||||
{
|
||||
low = high = FRACUNIT / 8;
|
||||
}
|
||||
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 = FRACUNIT / 128;
|
||||
}
|
||||
else if (player->kartstuff[k_invincibilitytimer])
|
||||
{
|
||||
high = FRACUNIT / 64;
|
||||
}
|
||||
else
|
||||
{
|
||||
low = high = FRACUNIT / 64;
|
||||
}
|
||||
}
|
||||
else if ((player->kartstuff[k_bananadrag] > TICRATE)
|
||||
&& player->speed != 0
|
||||
&& P_IsObjectOnGround(player->mo))
|
||||
{
|
||||
if (leveltime & 1) // this is actually funny lel
|
||||
high = FRACUNIT / 64;
|
||||
}
|
||||
|
||||
if (player->kartstuff[k_brakedrift])
|
||||
{
|
||||
high = CLAMP((high + FRACUNIT / 256), 0, UINT16_MAX);
|
||||
}
|
||||
|
||||
// pulse when gettin new driftlevel
|
||||
// let this come last
|
||||
if (player->kartstuff[k_driftcharge]
|
||||
&& player->driftlevel)
|
||||
{
|
||||
high = CLAMP((high + FRACUNIT / 256), 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);
|
||||
}
|
||||
}
|
||||
|
||||
void P_RunChaseCameras(void)
|
||||
{
|
||||
UINT8 i;
|
||||
@@ -763,7 +656,7 @@ void P_Ticker(boolean run)
|
||||
// Apply rumble to local players
|
||||
if (!demo.playback)
|
||||
{
|
||||
P_DeviceRumbleTick();
|
||||
G_DeviceRumbleTick();
|
||||
}
|
||||
|
||||
PS_START_TIMING(ps_lua_thinkframe_time);
|
||||
@@ -943,10 +836,6 @@ void P_PreTicker(INT32 frames)
|
||||
}
|
||||
}
|
||||
|
||||
// Dynamic slopeness
|
||||
if (midgamejoin)
|
||||
P_RunDynamicSlopes();
|
||||
|
||||
P_RunThinkers();
|
||||
|
||||
// Run any "after all the other thinkers" stuff
|
||||
|
||||
+69
-40
@@ -47,6 +47,7 @@
|
||||
// SRB2kart
|
||||
#include "m_cond.h" // M_UpdateUnlockablesAndExtraEmblems
|
||||
#include "k_kart.h"
|
||||
#include "k_hud.h"
|
||||
#include "console.h" // CON_LogMessage
|
||||
#include "m_menu.h"
|
||||
|
||||
@@ -213,12 +214,11 @@ UINT8 P_GetNextEmerald(void)
|
||||
if (!(emeralds & EMERALD6)) return 5;
|
||||
return 6;
|
||||
}
|
||||
else // Depends on stage
|
||||
{
|
||||
if (gamemap < sstage_start || gamemap > sstage_end)
|
||||
return 0;
|
||||
return (UINT8)(gamemap - sstage_start);
|
||||
}
|
||||
|
||||
// Depends on stage
|
||||
if (gamemap < sstage_start || gamemap > sstage_end)
|
||||
return 0;
|
||||
return (UINT8)(gamemap - sstage_start);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -434,8 +434,8 @@ void P_GivePlayerRings(player_t *player, INT32 num_rings)
|
||||
if (!player->mo)
|
||||
return;
|
||||
|
||||
player->mo->health += num_rings;
|
||||
player->health += num_rings;
|
||||
//player->mo->health += num_rings;
|
||||
//player->health += num_rings;
|
||||
player->totalring += num_rings;
|
||||
|
||||
//{ SRB2kart - rings don't really do anything, but we don't want the player spilling them later.
|
||||
@@ -581,7 +581,8 @@ static boolean isPlayerLosing(player_t *player)
|
||||
if (players[i].marescore > player->marescore)
|
||||
++pos;
|
||||
|
||||
maxpos = max(getPlayerPos(&players[i]), maxpos);
|
||||
const UINT8 playerpos = getPlayerPos(&players[i]);
|
||||
maxpos = max(playerpos, maxpos);
|
||||
}
|
||||
|
||||
if (maxpos == 1)
|
||||
@@ -995,6 +996,19 @@ INT32 P_GetLocalPlayerNumForNum(UINT8 pnum)
|
||||
return (pnum == 0 ? consoleplayer : displayplayers[pnum]);
|
||||
}
|
||||
|
||||
INT32 P_GetLocalPlayerNumForPlayer(const player_t *player)
|
||||
{
|
||||
for (UINT8 i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (player == P_GetLocalPlayerForNum(i))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
//
|
||||
// P_IsLocalPlayer
|
||||
//
|
||||
@@ -1161,6 +1175,9 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
|
||||
|
||||
ghost = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_GHOST);
|
||||
|
||||
// not sure if this is safe to do...........
|
||||
//P_SetTarget(&ghost->target, mobj);
|
||||
|
||||
P_SetScale(ghost, mobj->scale);
|
||||
ghost->scalespeed = mobj->scalespeed;
|
||||
ghost->destscale = mobj->scale;
|
||||
@@ -1174,10 +1191,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
|
||||
ghost->color = mobj->color;
|
||||
ghost->colorized = mobj->colorized; // Kart: they should also be colorized if their origin is
|
||||
|
||||
if (mobj->player)
|
||||
ghost->angle = mobj->player->frameangle;
|
||||
else
|
||||
ghost->angle = mobj->angle;
|
||||
ghost->angle = (mobj->player ? mobj->player->frameangle : mobj->angle);
|
||||
|
||||
ghost->sprite = mobj->sprite;
|
||||
ghost->frame = mobj->frame;
|
||||
@@ -1190,11 +1204,17 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
|
||||
ghost->localskin = mobj->localskin;
|
||||
ghost->skinlocal = mobj->skinlocal;
|
||||
|
||||
// same deal...
|
||||
//ghost->standingslope = mobj->standingslope;
|
||||
|
||||
ghost->spritexscale = mobj->spritexscale;
|
||||
ghost->spriteyscale = mobj->spriteyscale;
|
||||
ghost->spritexoffset = mobj->spritexoffset;
|
||||
ghost->spriteyoffset = mobj->spriteyoffset;
|
||||
|
||||
if (mobj->player && K_PlayerEffectsShouldBlend(mobj->player))
|
||||
ghost->blendmode = AST_ADD;
|
||||
|
||||
ghost->pitch = mobj->pitch;
|
||||
ghost->roll = mobj->roll;
|
||||
ghost->sloperoll = mobj->sloperoll;
|
||||
@@ -1859,7 +1879,6 @@ boolean P_AnalogMove(player_t *player)
|
||||
return player->pflags & PF_ANALOGMODE;
|
||||
}
|
||||
|
||||
|
||||
//#define OLD_MOVEMENT_CODE 1
|
||||
static void P_3dMovement(player_t *player)
|
||||
{
|
||||
@@ -2597,15 +2616,7 @@ static void P_DoZoomTube(player_t *player)
|
||||
if (player->mo->tracer)
|
||||
{
|
||||
player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, player->mo->tracer->x, player->mo->tracer->y);
|
||||
|
||||
for (UINT8 i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (player == P_GetLocalPlayerForNum(i))
|
||||
{
|
||||
localangle[i] = player->mo->angle;
|
||||
break;
|
||||
}
|
||||
}
|
||||
P_ForceLocalAngle(player, player->mo->angle);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2791,14 +2802,7 @@ void P_HomingAttack(mobj_t *source, mobj_t *enemy) // Home in on your target
|
||||
|
||||
if (source->player)
|
||||
{
|
||||
for (UINT8 i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (source->player == P_GetLocalPlayerForNum(i))
|
||||
{
|
||||
localangle[i] = source->angle;
|
||||
break;
|
||||
}
|
||||
}
|
||||
P_ForceLocalAngle(source->player, source->angle);
|
||||
}
|
||||
|
||||
// change slope
|
||||
@@ -2927,7 +2931,7 @@ notrealplayer:
|
||||
// P_MoveCamera: make sure the camera is not outside the world and looks at the player avatar
|
||||
//
|
||||
|
||||
camera_t camera[MAXSPLITSCREENPLAYERS]; // Four cameras, three for splitscreen
|
||||
camera_t camera[MAXSPLITSCREENPLAYERS] = {}; // Four cameras, three for splitscreen
|
||||
|
||||
static void CV_CamRotate_OnChange(void)
|
||||
{
|
||||
@@ -5194,14 +5198,8 @@ void P_PlayerAfterThink(player_t *player)
|
||||
player->mo->tracer->target->health += cmd->sidemove;
|
||||
player->mo->angle += cmd->sidemove << ANGLETOFINESHIFT; // 2048 --> ANGLE_MAX
|
||||
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (player == P_GetLocalPlayerForNum(i))
|
||||
{
|
||||
localangle[i] = player->mo->angle; // Adjust the local control angle.
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Adjust the local control angle.
|
||||
P_ForceLocalAngle(player, player->mo->angle);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5240,3 +5238,34 @@ void P_PlayerAfterThink(player_t *player)
|
||||
|
||||
K_KartPlayerAfterThink(player);
|
||||
}
|
||||
|
||||
angle_t P_GetLocalAngle(player_t *player)
|
||||
{
|
||||
// this function is from vanilla srb2. can you tell?
|
||||
// (hint: they have separate variables for all of this shit instead of arrays)
|
||||
UINT8 i;
|
||||
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (player == &players[displayplayers[i]])
|
||||
return localangle[i];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void P_ForceLocalAngle(player_t *player, angle_t angle)
|
||||
{
|
||||
UINT8 i;
|
||||
|
||||
angle = angle & ~UINT16_MAX;
|
||||
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (player == &players[displayplayers[i]])
|
||||
{
|
||||
localangle[i] = angle;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+19
-11
@@ -322,9 +322,6 @@ static void R_AddLine(seg_t *line)
|
||||
|
||||
g_portal = NULL;
|
||||
|
||||
if (line->polyseg && !(line->polyseg->flags & POF_RENDERSIDES))
|
||||
return;
|
||||
|
||||
// big room fix
|
||||
angle1 = R_PointToAngle64(line->v1->x, line->v1->y);
|
||||
angle2 = R_PointToAngle64(line->v2->x, line->v2->y);
|
||||
@@ -500,7 +497,7 @@ clipsolid:
|
||||
// 0 | 0 | 1 | 2
|
||||
// 1 | 4 | 5 | 6
|
||||
// 2 | 8 | 9 | A
|
||||
INT32 checkcoord[12][4] =
|
||||
const INT32 checkcoord[12][4] =
|
||||
{
|
||||
{3, 0, 2, 1},
|
||||
{3, 0, 2, 0},
|
||||
@@ -722,6 +719,8 @@ static void R_AddPolyObjects(subsector_t *sub)
|
||||
po = (polyobj_t *)(po->link.next);
|
||||
}
|
||||
|
||||
g_portal = NULL;
|
||||
|
||||
// for render stats
|
||||
ps_numpolyobjects.value.i += numpolys;
|
||||
|
||||
@@ -732,8 +731,16 @@ static void R_AddPolyObjects(subsector_t *sub)
|
||||
for (i = 0; i < numpolys; ++i)
|
||||
{
|
||||
qs22j(po_ptrs[i]->segs, po_ptrs[i]->segCount, sizeof(seg_t *), R_PolysegCompare);
|
||||
|
||||
for (j = 0; j < po_ptrs[i]->segCount; ++j)
|
||||
R_AddLine(po_ptrs[i]->segs[j]);
|
||||
{
|
||||
seg_t *seg = po_ptrs[i]->segs[j];
|
||||
|
||||
if (!(seg->polyseg->flags & POF_RENDERSIDES))
|
||||
continue;
|
||||
|
||||
R_AddLine(seg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -805,7 +812,7 @@ static void R_Subsector(size_t num)
|
||||
if (anyMoved == true)
|
||||
{
|
||||
frontsector->numlights = sub->sector->numlights = 0;
|
||||
R_Prep3DFloors(frontsector);
|
||||
R_Prep3DFloors(frontsector, ceilingcenterz);
|
||||
sub->sector->lightlist = frontsector->lightlist;
|
||||
sub->sector->numlights = frontsector->numlights;
|
||||
sub->sector->moved = frontsector->moved = false;
|
||||
@@ -1055,7 +1062,7 @@ static void R_Subsector(size_t num)
|
||||
//
|
||||
// This function creates the lightlists that the given sector uses to light
|
||||
// floors/ceilings/walls according to the 3D floors.
|
||||
void R_Prep3DFloors(sector_t *sector)
|
||||
void R_Prep3DFloors(sector_t *sector, fixed_t secceilz)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
ffloor_t *best;
|
||||
@@ -1081,13 +1088,13 @@ void R_Prep3DFloors(sector_t *sector)
|
||||
if (count != sector->numlights)
|
||||
{
|
||||
Z_Free(sector->lightlist);
|
||||
sector->lightlist = static_cast<lightlist_t*>(Z_Calloc(sizeof (*sector->lightlist) * count, PU_LEVEL, NULL));
|
||||
sector->lightlist = static_cast<lightlist_t*>(Z_Malloc(sizeof(*sector->lightlist) * count, PU_LEVEL, NULL));
|
||||
sector->numlights = count;
|
||||
}
|
||||
else
|
||||
memset(sector->lightlist, 0, sizeof (lightlist_t) * count);
|
||||
|
||||
heighttest = P_GetSectorCeilingZAt(sector, sector->soundorg.x, sector->soundorg.y);
|
||||
memset(sector->lightlist, 0, sizeof(lightlist_t) * count);
|
||||
|
||||
heighttest = secceilz; // sector ceiling z
|
||||
|
||||
sector->lightlist[0].height = heighttest + 1;
|
||||
sector->lightlist[0].slope = sector->c_slope;
|
||||
@@ -1117,6 +1124,7 @@ void R_Prep3DFloors(sector_t *sector)
|
||||
bestslope = *rover->t_slope;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (rover->flags & FF_DOUBLESHADOW)
|
||||
{
|
||||
heighttest = P_GetFFloorBottomZAt(rover, sector->soundorg.x, sector->soundorg.y);
|
||||
|
||||
+2
-2
@@ -34,7 +34,7 @@ extern portal_t *g_portal; // is curline a portal seg?
|
||||
|
||||
// drawsegs are allocated on the fly... see r_segs.c
|
||||
|
||||
extern INT32 checkcoord[12][4];
|
||||
extern const INT32 checkcoord[12][4];
|
||||
|
||||
extern drawseg_t *curdrawsegs;
|
||||
extern drawseg_t *drawsegs;
|
||||
@@ -65,7 +65,7 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel,
|
||||
boolean R_IsEmptyLine(seg_t *line, const sector_t *front, const sector_t *back);
|
||||
|
||||
INT32 R_GetPlaneLight(sector_t *sector, fixed_t planeheight, boolean underside);
|
||||
void R_Prep3DFloors(sector_t *sector);
|
||||
void R_Prep3DFloors(sector_t *sector, fixed_t secceilz);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
|
||||
+14
-113
@@ -307,10 +307,10 @@ static boolean R_CheckTextureLumpLength(texture_t *texture, size_t patch)
|
||||
CONS_Alert(
|
||||
CONS_ERROR,
|
||||
"%.8s: texture lump data is too small. Expected %s bytes, got %s. (%s)\n",
|
||||
texture->name,
|
||||
sizeu1(offsetof(softwarepatch_t, columnofs)),
|
||||
sizeu2(lumplength),
|
||||
wadfiles[wadnum]->lumpinfo[lumpnum].fullname
|
||||
texture->name,
|
||||
sizeu1(offsetof(softwarepatch_t, columnofs)),
|
||||
sizeu2(lumplength),
|
||||
wadfiles[wadnum]->lumpinfo[lumpnum].fullname
|
||||
);
|
||||
|
||||
return false;
|
||||
@@ -717,38 +717,25 @@ static INT32 R_CountTextures(UINT16 wadnum)
|
||||
return count;
|
||||
}
|
||||
|
||||
static void
|
||||
recallocuser
|
||||
( void * user,
|
||||
size_t old,
|
||||
size_t new)
|
||||
{
|
||||
char *p = Z_Realloc(*(void**)user,
|
||||
new, PU_STATIC, user);
|
||||
|
||||
if (new > old)
|
||||
memset(&p[old], 0, (new - old));
|
||||
}
|
||||
|
||||
static void R_AllocateTextures(INT32 add)
|
||||
{
|
||||
const INT32 newtextures = (numtextures + add);
|
||||
const size_t newsize = newtextures * sizeof (void*);
|
||||
const size_t oldsize = numtextures * sizeof (void*);
|
||||
//const size_t oldsize = numtextures * sizeof (void*);
|
||||
|
||||
INT32 i;
|
||||
|
||||
// Allocate memory and initialize to 0 for all the textures we are initialising.
|
||||
recallocuser(&textures, oldsize, newsize);
|
||||
Z_Realloc(textures, newsize, PU_STATIC, &textures);
|
||||
|
||||
// Allocate texture column offset table.
|
||||
recallocuser(&texturecolumnofs, oldsize, newsize);
|
||||
Z_Realloc(texturecolumnofs, newsize, PU_STATIC, &texturecolumnofs);
|
||||
// Allocate texture referencing cache.
|
||||
recallocuser(&texturecache, oldsize, newsize);
|
||||
Z_Realloc(texturecache, newsize, PU_STATIC, &texturecache);
|
||||
// Allocate texture width table.
|
||||
recallocuser(&texturewidth, oldsize, newsize);
|
||||
Z_Realloc(texturewidth, newsize, PU_STATIC, &texturewidth);
|
||||
// Allocate texture height table.
|
||||
recallocuser(&textureheight, oldsize, newsize);
|
||||
Z_Realloc(textureheight, newsize, PU_STATIC, &textureheight);
|
||||
// Create translation table for global animation.
|
||||
Z_Realloc(texturetranslation, (newtextures + 1) * sizeof(*texturetranslation), PU_STATIC, &texturetranslation);
|
||||
|
||||
@@ -853,6 +840,7 @@ static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
|
||||
{
|
||||
Z_Free(patchName);
|
||||
}
|
||||
|
||||
patchName = (char *)Z_Malloc((texturesTokenLength+1)*sizeof(char),PU_STATIC,NULL);
|
||||
memcpy(patchName,texturesToken,texturesTokenLength*sizeof(char));
|
||||
patchName[texturesTokenLength] = '\0';
|
||||
@@ -1249,60 +1237,6 @@ void R_ParseTEXTURESLump(UINT16 wadNum, UINT16 lumpNum, INT32 *texindex)
|
||||
Z_Free((void *)texturesText);
|
||||
}
|
||||
|
||||
/*
|
||||
static inline lumpnum_t R_CheckNumForNameList(const char *name, lumplist_t *list, size_t listsize) // SRB2kart - unused.
|
||||
{
|
||||
size_t i;
|
||||
UINT16 lump;
|
||||
|
||||
for (i = listsize - 1; i < INT16_MAX; i--)
|
||||
{
|
||||
lump = W_CheckNumForNamePwad(name, list[i].wadfile, list[i].firstlump);
|
||||
if (lump == INT16_MAX || lump > (list[i].firstlump + list[i].numlumps))
|
||||
continue;
|
||||
else
|
||||
return (list[i].wadfile<<16)+lump;
|
||||
}
|
||||
return LUMPERROR;
|
||||
}
|
||||
*/
|
||||
|
||||
/*static lumplist_t *colormaplumps = NULL; ///\todo free leak
|
||||
static size_t numcolormaplumps = 0;
|
||||
|
||||
static void R_InitExtraColormaps(void)
|
||||
{
|
||||
lumpnum_t startnum, endnum;
|
||||
UINT16 cfile, clump;
|
||||
static size_t maxcolormaplumps = 16;
|
||||
|
||||
for (cfile = clump = 0; cfile < numwadfiles; cfile++, clump = 0)
|
||||
{
|
||||
startnum = W_CheckNumForNamePwad("C_START", cfile, clump);
|
||||
if (startnum == INT16_MAX)
|
||||
continue;
|
||||
|
||||
endnum = W_CheckNumForNamePwad("C_END", cfile, clump);
|
||||
|
||||
if (endnum == INT16_MAX)
|
||||
I_Error("R_InitExtraColormaps: C_START without C_END\n");
|
||||
|
||||
// This shouldn't be possible when you use the Pwad function, silly
|
||||
//if (WADFILENUM(startnum) != WADFILENUM(endnum))
|
||||
//I_Error("R_InitExtraColormaps: C_START and C_END in different wad files!\n");
|
||||
|
||||
if (numcolormaplumps >= maxcolormaplumps)
|
||||
maxcolormaplumps *= 2;
|
||||
colormaplumps = Z_Realloc(colormaplumps,
|
||||
sizeof (*colormaplumps) * maxcolormaplumps, PU_STATIC, NULL);
|
||||
colormaplumps[numcolormaplumps].wadfile = cfile;
|
||||
colormaplumps[numcolormaplumps].firstlump = startnum+1;
|
||||
colormaplumps[numcolormaplumps].numlumps = endnum - (startnum + 1);
|
||||
numcolormaplumps++;
|
||||
}
|
||||
CONS_Printf(M_GetText("Number of Extra Colormaps: %s\n"), sizeu1(numcolormaplumps));
|
||||
}*/
|
||||
|
||||
// Search for flat name.
|
||||
lumpnum_t R_GetFlatNumForName(const char *name)
|
||||
{
|
||||
@@ -1430,7 +1364,7 @@ void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap)
|
||||
encoremap = Z_Malloc(256 + 10, PU_LEVEL, NULL);
|
||||
W_ReadLump(newencoremap, encoremap);
|
||||
colormap_p = colormap_p2 = colormaps;
|
||||
colormap_p += (256 * 32);
|
||||
colormap_p += COLORMAP_REMAPOFFSET;
|
||||
|
||||
for (p = 0; p < 32; p++)
|
||||
{
|
||||
@@ -1439,6 +1373,7 @@ void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap)
|
||||
*colormap_p = colormap_p2[encoremap[i]];
|
||||
colormap_p++;
|
||||
}
|
||||
|
||||
colormap_p2 += 256;
|
||||
}
|
||||
}
|
||||
@@ -1465,43 +1400,9 @@ void R_ClearColormaps(void)
|
||||
for (i = 0; i < MAXCOLORMAPS; i++)
|
||||
foundcolormaps[i] = LUMPERROR;
|
||||
|
||||
memset(extra_colormaps, 0, sizeof (extra_colormaps));
|
||||
memset(extra_colormaps, 0, sizeof(extra_colormaps));
|
||||
}
|
||||
|
||||
/*INT32 R_ColormapNumForName(char *name)
|
||||
{
|
||||
lumpnum_t lump, i;
|
||||
|
||||
if (num_extra_colormaps == MAXCOLORMAPS)
|
||||
I_Error("R_ColormapNumForName: Too many colormaps! the limit is %d\n", MAXCOLORMAPS);
|
||||
|
||||
lump = R_CheckNumForNameList(name, colormaplumps, numcolormaplumps);
|
||||
if (lump == LUMPERROR)
|
||||
I_Error("R_ColormapNumForName: Cannot find colormap lump %.8s\n", name);
|
||||
|
||||
for (i = 0; i < num_extra_colormaps; i++)
|
||||
if (lump == foundcolormaps[i])
|
||||
return i;
|
||||
|
||||
foundcolormaps[num_extra_colormaps] = lump;
|
||||
|
||||
// aligned on 8 bit for asm code
|
||||
extra_colormaps[num_extra_colormaps].colormap = Z_Malloc(W_LumpLength(lump), PU_LEVEL, NULL);
|
||||
W_ReadLump(lump, extra_colormaps[num_extra_colormaps].colormap);
|
||||
|
||||
// We set all params of the colormap to normal because there
|
||||
// is no real way to tell how GL should handle a colormap lump anyway..
|
||||
extra_colormaps[num_extra_colormaps].maskcolor = 0xffff;
|
||||
extra_colormaps[num_extra_colormaps].fadecolor = 0x0;
|
||||
extra_colormaps[num_extra_colormaps].maskamt = 0x0;
|
||||
extra_colormaps[num_extra_colormaps].fadestart = 0;
|
||||
extra_colormaps[num_extra_colormaps].fadeend = 31;
|
||||
extra_colormaps[num_extra_colormaps].fog = 0;
|
||||
|
||||
num_extra_colormaps++;
|
||||
return (INT32)num_extra_colormaps - 1;
|
||||
}*/
|
||||
|
||||
//
|
||||
// R_CreateColormap
|
||||
//
|
||||
|
||||
+2
-7
@@ -397,9 +397,6 @@ typedef struct sector_s
|
||||
// Sprite culling feature
|
||||
struct line_s *cullheight;
|
||||
|
||||
// Current speed of ceiling/floor. For Knuckles to hold onto stuff.
|
||||
fixed_t floorspeed, ceilspeed;
|
||||
|
||||
// Eternity engine slope
|
||||
boolean hasslope; // The sector, or one of its visible FOFs, contains a slope
|
||||
} sector_t;
|
||||
@@ -549,12 +546,10 @@ typedef struct seg_s
|
||||
sector_t *backsector;
|
||||
|
||||
fixed_t length; // precalculated seg length
|
||||
|
||||
#ifdef HWRENDER
|
||||
floatvertex_t fv1;
|
||||
floatvertex_t fv2;
|
||||
floatvertex_t fv1; // v1 in floats - precalculated
|
||||
floatvertex_t fv2; // v2 in floats - precalculated
|
||||
#endif
|
||||
|
||||
polyobj_t *polyseg;
|
||||
|
||||
// Fake contrast calculated on level load
|
||||
|
||||
+29
-17
@@ -355,13 +355,14 @@ UINT8 *R_GetBlendTable(int style, INT32 alphalevel)
|
||||
// Return a normal translucency table
|
||||
if (--alphalevel >= 0)
|
||||
return transtables + (ClipTransLevel(alphalevel) << FF_TRANSSHIFT);
|
||||
else
|
||||
return NULL;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
boolean R_BlendLevelVisible(INT32 blendmode, INT32 alphalevel)
|
||||
{
|
||||
if (blendmode <= AST_COPY || blendmode == AST_SUBTRACT || blendmode == AST_MODULATE || blendmode >= AST_OVERLAY)
|
||||
if (blendmode <= AST_COPY || blendmode == AST_SUBTRACT ||
|
||||
blendmode == AST_MODULATE || blendmode >= AST_OVERLAY)
|
||||
return true;
|
||||
|
||||
return (alphalevel < BlendTab_Count[BlendTab_FromStyle[blendmode]]);
|
||||
@@ -412,7 +413,8 @@ static UINT8* RGetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 f
|
||||
// Get colormap
|
||||
ret = tt[skintableindex][color];
|
||||
}
|
||||
else ret = NULL;
|
||||
else
|
||||
ret = NULL;
|
||||
|
||||
// Generate the colormap if necessary
|
||||
if (!ret)
|
||||
@@ -435,36 +437,46 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags)
|
||||
|
||||
UINT8* R_GetLocalTranslationColormap(skin_t *skin, skin_t *localskin, skincolors_t color, UINT8 flags, boolean local)
|
||||
{
|
||||
if (localskin)
|
||||
return RGetTranslationColormap(localskin - K_GetSkinArray(local), color, flags, local);
|
||||
else
|
||||
return RGetTranslationColormap((skin - skins), color, flags, false);
|
||||
const INT32 skinnum = localskin ? (localskin - K_GetSkinArray(local)) : (skin - skins);
|
||||
return RGetTranslationColormap(skinnum, color, flags, (localskin && local));
|
||||
}
|
||||
|
||||
patch_t* R_GetSkinFaceRank(player_t* ply)
|
||||
{
|
||||
if (ply->skinlocal && ply->localskin)
|
||||
return localfacerankprefix[ply->localskin - 1];
|
||||
else if (ply->localskin)
|
||||
if (ply->localskin)
|
||||
{
|
||||
if (ply->skinlocal)
|
||||
return localfacerankprefix[ply->localskin - 1];
|
||||
|
||||
return facerankprefix[ply->localskin - 1];
|
||||
}
|
||||
|
||||
return facerankprefix[ply->skin];
|
||||
}
|
||||
|
||||
patch_t* R_GetSkinFaceWant(player_t* ply)
|
||||
{
|
||||
if (ply->skinlocal && ply->localskin)
|
||||
return localfacewantprefix[ply->localskin - 1];
|
||||
else if (ply->localskin)
|
||||
if (ply->localskin)
|
||||
{
|
||||
if (ply->skinlocal)
|
||||
return localfacewantprefix[ply->localskin - 1];
|
||||
|
||||
return facewantprefix[ply->localskin - 1];
|
||||
}
|
||||
|
||||
return facewantprefix[ply->skin];
|
||||
}
|
||||
|
||||
patch_t* R_GetSkinFaceMini(player_t* ply)
|
||||
{
|
||||
if (ply->skinlocal && ply->localskin)
|
||||
return localfacemmapprefix[ply->localskin - 1];
|
||||
else if (ply->localskin)
|
||||
if (ply->localskin)
|
||||
{
|
||||
if (ply->skinlocal)
|
||||
return localfacemmapprefix[ply->localskin - 1];
|
||||
|
||||
return facemmapprefix[ply->localskin - 1];
|
||||
}
|
||||
|
||||
return facemmapprefix[ply->skin];
|
||||
}
|
||||
|
||||
|
||||
+2
-12
@@ -14,13 +14,7 @@
|
||||
/// \note no includes because this is included as part of r_draw.cpp
|
||||
|
||||
#ifdef HAVE_THREADS
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#define local_for_thread static __thread
|
||||
#else
|
||||
#include <threads.h>
|
||||
#define local_for_thread thread_local static
|
||||
#endif
|
||||
#define local_for_thread static thread_local
|
||||
#else
|
||||
#define local_for_thread static
|
||||
#endif
|
||||
@@ -221,11 +215,7 @@ static void R_GetTiltedLighting(std::vector<INT32>& tiltlighting, const drawspan
|
||||
const float planelightfloat = PLANELIGHTFLOAT;
|
||||
const fixed_t lightstart = FloatToFixed(iz * planelightfloat);
|
||||
const fixed_t lightend = FloatToFixed((iz + ds->szp.x * width) * planelightfloat);
|
||||
|
||||
if (tiltlighting.size() != (size_t)viewwidth)
|
||||
{
|
||||
tiltlighting.resize(viewwidth);
|
||||
}
|
||||
tiltlighting.resize((size_t)viewwidth);
|
||||
|
||||
R_CalcTiltedLighting(tiltlighting, ds->x1, ds->x2, lightstart, lightend);
|
||||
//CONS_Printf("tilted lighting %f to %f (foc %f)\n", FixedToFloat(lightstart), FixedToFloat(lightend), focallengthf);
|
||||
|
||||
+2
-6
@@ -75,15 +75,11 @@ typedef struct {
|
||||
fixed_t y;
|
||||
fixed_t z;
|
||||
boolean sky;
|
||||
sector_t *sector;
|
||||
player_t *player;
|
||||
|
||||
angle_t angle;
|
||||
angle_t aim;
|
||||
angle_t roll;
|
||||
fixed_t cos;
|
||||
fixed_t sin;
|
||||
mobj_t *mobj;
|
||||
} viewvars_t;
|
||||
|
||||
extern viewvars_t *newview;
|
||||
@@ -142,12 +138,12 @@ typedef struct levelinterpolator_s {
|
||||
fixed_t oldcx, oldcy, bakcx, bakcy;
|
||||
angle_t oldangle, bakangle;
|
||||
} polyobj;
|
||||
struct {
|
||||
/*struct {
|
||||
pslope_t *slope;
|
||||
vector3_t oldo, bako;
|
||||
vector2_t oldd, bakd;
|
||||
fixed_t oldzdelta, bakzdelta;
|
||||
} dynslope;
|
||||
} dynslope;*/
|
||||
};
|
||||
} levelinterpolator_t;
|
||||
|
||||
|
||||
+28
-47
@@ -433,10 +433,7 @@ fixed_t R_ScaleFromGlobalAngle(angle_t visangle)
|
||||
if (den > num>>16)
|
||||
{
|
||||
num = FixedDiv(num, den);
|
||||
if (num > 64*FRACUNIT)
|
||||
return 64*FRACUNIT;
|
||||
if (num < 256)
|
||||
return 256;
|
||||
num = CLAMP(num, 256, 64*FRACUNIT);
|
||||
return num;
|
||||
}
|
||||
return 64*FRACUNIT;
|
||||
@@ -449,8 +446,8 @@ line_t *R_GetFFloorLine(const line_t *line, const ffloor_t *pfloor, const sector
|
||||
size_t linenum = std::min<size_t>((size_t)(line - sector->lines[0]), pfloor->master->frontsector->linecount);
|
||||
return pfloor->master->frontsector->lines[0] + linenum;
|
||||
}
|
||||
else
|
||||
return pfloor->master;
|
||||
|
||||
return pfloor->master;
|
||||
}
|
||||
|
||||
side_t *R_GetFFloorSide(const line_t *line, const ffloor_t *pfloor, const sector_t *sector)
|
||||
@@ -460,8 +457,8 @@ side_t *R_GetFFloorSide(const line_t *line, const ffloor_t *pfloor, const sector
|
||||
line_t *newline = R_GetFFloorLine(line, pfloor, sector);
|
||||
return &sides[newline->sidenum[0]];
|
||||
}
|
||||
else
|
||||
return &sides[pfloor->master->sidenum[0]];
|
||||
|
||||
return &sides[pfloor->master->sidenum[0]];
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1095,9 +1092,9 @@ subsector_t *R_IsPointInSubsector(fixed_t x, fixed_t y)
|
||||
// R_SetupFrame
|
||||
//
|
||||
|
||||
mobj_t *viewmobj;
|
||||
mobj_t *viewmobj = NULL;
|
||||
|
||||
static void R_SetupCommonFrame(player_t * player, sector_t * sector)
|
||||
static void R_SetupCommonFrame(player_t * player)
|
||||
{
|
||||
newview->player = player;
|
||||
|
||||
@@ -1107,11 +1104,6 @@ static void R_SetupCommonFrame(player_t * player, sector_t * sector)
|
||||
|
||||
newview->roll = R_ViewRollAngle(player);
|
||||
|
||||
if (sector != NULL)
|
||||
newview->sector = sector;
|
||||
else
|
||||
newview->sector = R_PointInSubsectorFast(newview->x, newview->y)->sector;
|
||||
|
||||
R_InterpolateView(R_GetTimeFrac(RTF_CAMERA), false);
|
||||
}
|
||||
|
||||
@@ -1210,7 +1202,6 @@ void R_SkyboxFrame(UINT8 pnum)
|
||||
{
|
||||
player_t *player = &players[displayplayers[pnum]];
|
||||
camera_t *thiscam = &camera[pnum];
|
||||
sector_t *viewsec = NULL;
|
||||
mapheader_t *mh = mapheaderinfo[gamemap-1];
|
||||
|
||||
R_SetViewContext(static_cast<viewcontext_e>(VIEWCONTEXT_SKY1 + pnum));
|
||||
@@ -1236,9 +1227,6 @@ void R_SkyboxFrame(UINT8 pnum)
|
||||
newview->x = viewmobj->x;
|
||||
newview->y = viewmobj->y;
|
||||
newview->z = (viewmobj->spawnpoint) ? (((fixed_t)viewmobj->spawnpoint->angle) << FRACBITS) : 0;
|
||||
|
||||
if (viewmobj->subsector)
|
||||
viewsec = viewmobj->subsector->sector;
|
||||
}
|
||||
|
||||
if (mh)
|
||||
@@ -1246,7 +1234,7 @@ void R_SkyboxFrame(UINT8 pnum)
|
||||
R_SetupSkyScale(player, thiscam, mh);
|
||||
}
|
||||
|
||||
R_SetupCommonFrame(player, viewsec);
|
||||
R_SetupCommonFrame(player);
|
||||
}
|
||||
|
||||
void R_SetupFrame(UINT8 pnum, boolean skybox)
|
||||
@@ -1254,17 +1242,10 @@ void R_SetupFrame(UINT8 pnum, boolean skybox)
|
||||
player_t *player = &players[displayplayers[pnum]];
|
||||
camera_t *thiscam = &camera[pnum];
|
||||
boolean chasecam = (cv_chasecam[pnum].value);
|
||||
sector_t *viewsec = NULL;
|
||||
|
||||
R_SetViewContext(static_cast<viewcontext_e>(VIEWCONTEXT_PLAYER1 + pnum));
|
||||
|
||||
if (thiscam->reset)
|
||||
{
|
||||
R_ResetViewInterpolation(pnum);
|
||||
thiscam->reset = false;
|
||||
}
|
||||
|
||||
if (player->spectator || thiscam->freecam)
|
||||
if (player->spectator || (thiscam && thiscam->freecam))
|
||||
{
|
||||
// Free flying spectator uses demo freecam. This
|
||||
// requires chasecam to be enabled.
|
||||
@@ -1274,13 +1255,22 @@ void R_SetupFrame(UINT8 pnum, boolean skybox)
|
||||
if (player->playerstate == PST_DEAD || player->exiting)
|
||||
chasecam = true; // force chasecam on
|
||||
|
||||
if (chasecam && (thiscam && !thiscam->chase))
|
||||
if (thiscam)
|
||||
{
|
||||
P_ResetCamera(player, thiscam);
|
||||
thiscam->chase = true;
|
||||
if (thiscam->reset)
|
||||
{
|
||||
R_ResetViewInterpolation(pnum);
|
||||
thiscam->reset = false;
|
||||
}
|
||||
|
||||
if (chasecam && !thiscam->chase)
|
||||
{
|
||||
P_ResetCamera(player, thiscam);
|
||||
thiscam->chase = true;
|
||||
}
|
||||
else if (!chasecam)
|
||||
thiscam->chase = false;
|
||||
}
|
||||
else if (thiscam && !chasecam)
|
||||
thiscam->chase = false;
|
||||
|
||||
newview->sky = !skybox;
|
||||
|
||||
@@ -1295,10 +1285,7 @@ void R_SetupFrame(UINT8 pnum, boolean skybox)
|
||||
newview->y = viewmobj->y;
|
||||
newview->z = viewmobj->z + 20*FRACUNIT;
|
||||
|
||||
if (viewmobj->subsector)
|
||||
viewsec = viewmobj->subsector->sector;
|
||||
|
||||
R_SetupCommonFrame(player, viewsec);
|
||||
R_SetupCommonFrame(player);
|
||||
}
|
||||
else if (thiscam && chasecam) // use outside cam view
|
||||
{
|
||||
@@ -1309,10 +1296,7 @@ void R_SetupFrame(UINT8 pnum, boolean skybox)
|
||||
newview->y = thiscam->y;
|
||||
newview->z = thiscam->z + (thiscam->height>>1);
|
||||
|
||||
if (thiscam->subsector)
|
||||
viewsec = thiscam->subsector->sector;
|
||||
|
||||
R_SetupCommonFrame(player, viewsec);
|
||||
R_SetupCommonFrame(player);
|
||||
}
|
||||
else if (player->mo) // use the player's eyes view
|
||||
{
|
||||
@@ -1323,10 +1307,7 @@ void R_SetupFrame(UINT8 pnum, boolean skybox)
|
||||
newview->y = viewmobj->y;
|
||||
newview->z = player->viewz;
|
||||
|
||||
if (viewmobj->subsector)
|
||||
viewsec = viewmobj->subsector->sector;
|
||||
|
||||
R_SetupCommonFrame(player, viewsec);
|
||||
R_SetupCommonFrame(player);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1337,8 +1318,8 @@ static void R_PortalFrame(portal_t *portal)
|
||||
viewz = portal->viewz;
|
||||
|
||||
viewangle = portal->viewangle;
|
||||
//viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
|
||||
//viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
|
||||
viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
|
||||
viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
|
||||
|
||||
portalclipstart = portal->start;
|
||||
portalclipend = portal->end;
|
||||
|
||||
@@ -150,6 +150,26 @@ subsector_t *R_IsPointInSubsector(fixed_t x, fixed_t y);
|
||||
#define R_PointToDist(x, y) R_PointToDist2(viewx, viewy, x, y)
|
||||
#define R_PointToDist2(px2, py2, px1, py1) FixedHypot((px1) - (px2), (py1) - (py2))
|
||||
|
||||
FUNCMATH FUNCINLINE static ATTRINLINE fixed_t R_QuickDist(fixed_t x1, fixed_t y1, fixed_t x, fixed_t y)
|
||||
{
|
||||
const fixed_t absx = abs(x - x1);
|
||||
const fixed_t absy = abs(y - y1);
|
||||
#ifdef __cplusplus
|
||||
return std::max<fixed_t>(absx, absy);
|
||||
#else
|
||||
return max(absx, absy);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Takes 2 fixed-point coordinates, returns "distance" between them and camera,
|
||||
// as an fixed-point integer.
|
||||
// It is very rough, tho it is used only for optimizing out unnecessary
|
||||
// interpolation, so it is kinda ok on big distances.
|
||||
FUNCINLINE static ATTRINLINE PUREFUNC fixed_t R_QuickCamDist(fixed_t x, fixed_t y)
|
||||
{
|
||||
return R_QuickDist(viewx, viewy, x, y);
|
||||
}
|
||||
|
||||
line_t *R_GetFFloorLine(const line_t *line, const ffloor_t *pfloor, const sector_t *sector);
|
||||
side_t *R_GetFFloorSide(const line_t *line, const ffloor_t *pfloor, const sector_t *sector);
|
||||
|
||||
|
||||
+2
-8
@@ -487,11 +487,8 @@ void *R_PixelsToPatch(UINT8 *raw, INT16 width, INT16 height, INT16 leftoffset, I
|
||||
size_t maxoutsize = maxcolumnsize * width + (8 + 4 * width);
|
||||
// so, a 512x512 flat should maximally need 393,760 (384.53 KiB) bytes.
|
||||
// quite a bit smaller than 64 megabytes, and much less annoying to the windows debug allocator!
|
||||
while (imgbuf.size() < maxoutsize)
|
||||
{
|
||||
imgbuf.resize(imgbuf.size() * 2);
|
||||
}
|
||||
|
||||
imgbuf.resize(maxoutsize);
|
||||
imgptr = imgbuf.data();
|
||||
|
||||
// Write image size and offset
|
||||
@@ -621,11 +618,8 @@ void *R_MaskedFlatToPatch(UINT16 *raw, INT16 width, INT16 height, INT16 leftoffs
|
||||
size_t maxoutsize = maxcolumnsize * width + (8 + 4 * width);
|
||||
// so, a 512x512 flat should maximally need 393,760 (384.53 KiB) bytes.
|
||||
// quite a bit smaller than 64 megabytes, and much less annoying to the windows debug allocator!
|
||||
while (imgbuf.size() < maxoutsize)
|
||||
{
|
||||
imgbuf.resize(imgbuf.size() * 2);
|
||||
}
|
||||
|
||||
imgbuf.resize(maxoutsize);
|
||||
imgptr = imgbuf.data();
|
||||
|
||||
// Write image size and offset
|
||||
|
||||
@@ -128,7 +128,7 @@ void RotatedPatch_DoRotation(rotsprite_t *rotsprite, patch_t *patch, INT32 angle
|
||||
UINT32 i;
|
||||
patch_t *rotated;
|
||||
|
||||
static std::vector<UINT16> rawdst(1024 * 1024), rawconv(1024 * 1024); // 1 MB should be enough for most cases
|
||||
static std::vector<UINT16> rawdst(512 * 1024), rawconv(512 * 1024); // 1 MB should be enough for most cases
|
||||
|
||||
UINT16 *rawout;
|
||||
size_t size;
|
||||
@@ -185,10 +185,7 @@ void RotatedPatch_DoRotation(rotsprite_t *rotsprite, patch_t *patch, INT32 angle
|
||||
if (!size)
|
||||
size = (width * height);
|
||||
|
||||
while (rawdst.size() < size)
|
||||
{
|
||||
rawdst.resize(rawdst.size() * 2);
|
||||
}
|
||||
rawdst.resize(size);
|
||||
|
||||
for (i = 0; i < size; i++)
|
||||
rawdst[i] = 0xFF00;
|
||||
|
||||
+5
-6
@@ -220,21 +220,20 @@ static void Portal_ClipVisplane (const visplane_t* plane, portal_t* portal)
|
||||
for (i = 0; i < end - start; i++)
|
||||
{
|
||||
// Invalid column.
|
||||
if (plane->top[i + start] == 65535)
|
||||
if (plane->top[i + start] == UINT16_MAX)
|
||||
{
|
||||
portal->ceilingclip[i] = -1;
|
||||
portal->floorclip[i] = -1;
|
||||
continue;
|
||||
}
|
||||
|
||||
portal->ceilingclip[i] = plane->top[i + start] - 1;
|
||||
portal->floorclip[i] = plane->bottom[i + start] + 1;
|
||||
portal->frontscale[i] = INT32_MAX;
|
||||
}
|
||||
}
|
||||
|
||||
extern INT32 viewwidth;
|
||||
|
||||
static boolean TrimVisplaneBounds (const visplane_t* plane, INT16* start, INT16* end)
|
||||
static boolean TrimVisplaneBounds(const visplane_t* plane, INT16* start, INT16* end)
|
||||
{
|
||||
*start = plane->minx;
|
||||
*end = plane->maxx + 1;
|
||||
@@ -255,13 +254,13 @@ static boolean TrimVisplaneBounds (const visplane_t* plane, INT16* start, INT16*
|
||||
* valid area.
|
||||
*/
|
||||
|
||||
while (plane->bottom[*start] == 0 && plane->top[*start] == 65535 && *start < *end)
|
||||
while (plane->bottom[*start] == 0 && plane->top[*start] == UINT16_MAX && *start < *end)
|
||||
{
|
||||
(*start)++;
|
||||
}
|
||||
|
||||
|
||||
while (plane->bottom[*end - 1] == 0 && plane->top[*start] == 65535 && *end > *start)
|
||||
while (plane->bottom[*end - 1] == 0 && plane->top[*start] == UINT16_MAX && *end > *start)
|
||||
{
|
||||
(*end)--;
|
||||
}
|
||||
|
||||
+54
-20
@@ -1612,6 +1612,47 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!papersprite)
|
||||
{
|
||||
// killough 4/9/98: clip things which are out of view due to height
|
||||
// e6y: fix of hanging decoration disappearing in Batman Doom MAP02
|
||||
// centeryfrac -> viewheightfrac
|
||||
// [kb] add +1 so sprites are shown even with the extended freelook
|
||||
// lug: attempt to account for freelook properly
|
||||
if (interp.z > viewz + FixedMul(FixedDiv(centeryfrac, projectiony), tz) ||
|
||||
gzt < viewz + FixedMul(FixedDiv(centeryfrac - (viewheight << FRACBITS), projectiony), tz))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// killough 3/27/98: exclude things totally separated
|
||||
// from the viewer, by either water or fake ceilings
|
||||
// killough 4/11/98: improve sprite clipping for underwater/fake ceilings
|
||||
|
||||
heightsec = thing->subsector->sector->heightsec;
|
||||
if (viewplayer && viewplayer->mo && viewplayer->mo->subsector)
|
||||
phs = viewplayer->mo->subsector->sector->heightsec;
|
||||
else
|
||||
phs = -1;
|
||||
|
||||
if (heightsec != -1 && phs != -1) // only clip things which are in special sectors
|
||||
{
|
||||
fixed_t secheight;
|
||||
|
||||
secheight = P_GetSectorFloorZAt(§ors[heightsec], viewx, viewy);
|
||||
if (viewz < P_GetSectorFloorZAt(§ors[phs], interp.x, interp.y) ?
|
||||
interp.z >= secheight :
|
||||
gzt < secheight)
|
||||
return;
|
||||
|
||||
secheight = P_GetSectorCeilingZAt(§ors[heightsec], viewx, viewy);
|
||||
if (viewz > P_GetSectorCeilingZAt(§ors[phs], interp.x, interp.y) ?
|
||||
gzt < secheight && viewz >= secheight :
|
||||
interp.z >= secheight)
|
||||
return;
|
||||
}
|
||||
|
||||
if (thing->frame & FF_ABSOLUTELIGHTLEVEL)
|
||||
{
|
||||
const UINT8 n = R_ThingLightLevel(thing);
|
||||
@@ -1689,24 +1730,6 @@ static void R_ProjectSprite(mobj_t *thing)
|
||||
lights_array = scalelight[lightnum];
|
||||
}
|
||||
|
||||
heightsec = thing->subsector->sector->heightsec;
|
||||
if (viewplayer && viewplayer->mo && viewplayer->mo->subsector)
|
||||
phs = viewplayer->mo->subsector->sector->heightsec;
|
||||
else
|
||||
phs = -1;
|
||||
|
||||
if (heightsec != -1 && phs != -1) // only clip things which are in special sectors
|
||||
{
|
||||
if (viewz < sectors[phs].floorheight ?
|
||||
interp.z >= sectors[heightsec].floorheight :
|
||||
gzt < sectors[heightsec].floorheight)
|
||||
return;
|
||||
if (viewz > sectors[phs].ceilingheight ?
|
||||
gzt < sectors[heightsec].ceilingheight && viewz >= sectors[heightsec].ceilingheight :
|
||||
interp.z >= sectors[heightsec].ceilingheight)
|
||||
return;
|
||||
}
|
||||
|
||||
// store information in a vissprite
|
||||
vis = R_NewVisSprite();
|
||||
vis->heightsec = heightsec; //SoM: 3/17/2000
|
||||
@@ -1952,6 +1975,17 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing)
|
||||
return;
|
||||
}
|
||||
|
||||
// killough 4/9/98: clip things which are out of view due to height
|
||||
// e6y: fix of hanging decoration disappearing in Batman Doom MAP02
|
||||
// centeryfrac -> viewheightfrac
|
||||
// [kb] add +1 so sprites are shown even with the extended freelook
|
||||
// lug: attempt to account for freelook properly
|
||||
if (interp.z > viewz + FixedMul(FixedDiv(centeryfrac, projectiony), tz) ||
|
||||
gzt < viewz + FixedMul(FixedDiv(centeryfrac - (viewheight << FRACBITS), projectiony), tz))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// aspect ratio stuff :
|
||||
yscale = FixedDiv(projectiony, tz);
|
||||
|
||||
@@ -2908,7 +2942,7 @@ boolean R_ThingWithinDist(mobj_t *thing, INT32 limit_dist)
|
||||
{
|
||||
if (limit_dist)
|
||||
{
|
||||
if ((R_QuickCamDist(thing->x, thing->y) << FRACBITS)/mapobjectscale > limit_dist)
|
||||
if (R_QuickCamDist(thing->x, thing->y)/mapobjectscale > limit_dist)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -2952,7 +2986,7 @@ static boolean R_CheckInterpDist(T *thing)
|
||||
if (!R_UsingFrameInterpolation())
|
||||
return false;
|
||||
|
||||
const INT32 dist = R_QuickCamDist(thing->x, thing->y);
|
||||
const INT32 dist = R_QuickCamDist(thing->x, thing->y) >> FRACBITS;
|
||||
|
||||
return (dist < cv_maxinterpdist.value);
|
||||
}
|
||||
|
||||
+1
-13
@@ -35,19 +35,6 @@ extern "C" {
|
||||
|
||||
#define FEETADJUST (4<<FRACBITS) // R_AddSingleSpriteDef
|
||||
|
||||
// Takes 2 fixed-point coordinates, returns "distance" between them and camera,
|
||||
// as an non-fixed-point integer.
|
||||
// It is very rough, tho it is used only for optimizing out unnecessary
|
||||
// interpolation, so it is kinda ok on big distances.
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define R_QuickCamDist(x, y) std::max(std::abs(((x)>>FRACBITS) - (viewx>>FRACBITS)), std::abs(((y)>>FRACBITS) - (viewy>>FRACBITS)))
|
||||
#define R_QuickDist(x1, y1, x, y) std::max(std::abs(((x)>>FRACBITS) - (x1>>FRACBITS)), std::abs(((y)>>FRACBITS) - (y1>>FRACBITS)))
|
||||
#else
|
||||
#define R_QuickCamDist(x, y) max(abs(((x)>>FRACBITS) - (viewx>>FRACBITS)), abs(((y)>>FRACBITS) - (viewy>>FRACBITS)))
|
||||
#define R_QuickDist(x1, y1, x, y) max(abs(((x)>>FRACBITS) - (x1>>FRACBITS)), abs(((y)>>FRACBITS) - (y1>>FRACBITS)))
|
||||
#endif
|
||||
|
||||
// Constant arrays used for psprite clipping
|
||||
// and initializing clipping.
|
||||
extern INT16 *negonearray;
|
||||
@@ -67,6 +54,7 @@ FUNCINLINE static ATTRINLINE INT32 R_ThingLightLevel(mobj_t* thing)
|
||||
{
|
||||
return (INT32)thing->lightlevel;
|
||||
}
|
||||
|
||||
fixed_t R_GetSpriteDirectionalLighting(angle_t angle);
|
||||
|
||||
fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope);
|
||||
|
||||
+23
-25
@@ -58,7 +58,7 @@ static void AmigaType_OnChange(void);
|
||||
#endif
|
||||
|
||||
static CV_PossibleValue_t audbuffersize_cons_t[] = {{128, "128"}, {256, "256"}, {512, "512"}, {1024, "1024"}, {2048, "2048"}, {4096, "4096"}, {0, NULL}};
|
||||
consvar_t cv_audbuffersize = {"audiobuffersize", "2048", CV_SAVE|CV_CALL, audbuffersize_cons_t, BufferSize_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_audbuffersize = {"audiobuffersize", "2048", CV_SAVE|CV_CALL|CV_NOINIT, audbuffersize_cons_t, BufferSize_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
// stereo reverse
|
||||
consvar_t stereoreverse = {"stereoreverse", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
@@ -94,15 +94,6 @@ consvar_t cv_playsoundifunfocused = {"playsoundsifunfocused", "No", CV_SAVE, CV_
|
||||
consvar_t cv_pausemusic = {"playmusicifpaused", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
//bird music stuff
|
||||
static CV_PossibleValue_t music_resync_threshold_cons_t[] = {
|
||||
{0, "MIN"},
|
||||
{1000, "MAX"},
|
||||
|
||||
{0}
|
||||
};
|
||||
consvar_t cv_music_resync_threshold = {"music_resync_threshold", "0", CV_SAVE|CV_CALL, music_resync_threshold_cons_t, I_UpdateSongLagThreshold, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_music_resync_powerups_only = {"music_resync_powerups_only", "No", CV_SAVE|CV_CALL, CV_YesNo, I_UpdateSongLagThreshold, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_invincmusicfade = {"invincmusicfade", "300", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_growmusicfade = {"growmusicfade", "500", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_respawnfademusicout = {"respawnfademusicout", "1000", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
@@ -282,6 +273,12 @@ void S_RegisterSoundStuff(void)
|
||||
CV_RegisterVar(&cv_gamesounds);
|
||||
CV_RegisterVar(&cv_gamedigimusic);
|
||||
|
||||
#ifdef HAVE_FLUIDSYNTH
|
||||
CV_RegisterVar(&cv_midisoundfontpath);
|
||||
CV_RegisterVar(&cv_midichorus);
|
||||
CV_RegisterVar(&cv_midireverb);
|
||||
#endif
|
||||
|
||||
CV_RegisterVar(&cv_samesoundlimit);
|
||||
|
||||
// bird music stuff
|
||||
@@ -289,9 +286,6 @@ void S_RegisterSoundStuff(void)
|
||||
CV_RegisterVar(&cv_playsoundifunfocused);
|
||||
CV_RegisterVar(&cv_pausemusic);
|
||||
|
||||
CV_RegisterVar(&cv_music_resync_threshold);
|
||||
CV_RegisterVar(&cv_music_resync_powerups_only);
|
||||
|
||||
CV_RegisterVar(&cv_invincmusicfade);
|
||||
CV_RegisterVar(&cv_growmusicfade);
|
||||
|
||||
@@ -363,6 +357,7 @@ boolean S_SoundDisabled(void)
|
||||
|
||||
int S_CacheSound(void)
|
||||
{
|
||||
#if SOUND == SOUND_MIXER
|
||||
if (sound_disabled)
|
||||
return SOUNDCACHE_OFF;
|
||||
|
||||
@@ -370,6 +365,9 @@ int S_CacheSound(void)
|
||||
return SOUNDCACHE_PRECACHE;
|
||||
|
||||
return cv_cachesound.value;
|
||||
#else
|
||||
return SOUNDCACHE_OFF;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Stop all sounds, load level info, THEN start sounds.
|
||||
@@ -773,9 +771,14 @@ void S_UpdateSounds(void)
|
||||
volume = c->volume; // 8 bits internal volume precision
|
||||
sep = NORM_SEP;
|
||||
|
||||
if (P_MobjWasRemoved(c->origin))
|
||||
{
|
||||
// origin was removed, stop the music
|
||||
S_StopChannel(cnum);
|
||||
}
|
||||
// check non-local sounds for distance clipping
|
||||
// or modify their params
|
||||
if (c->origin)
|
||||
else
|
||||
{
|
||||
boolean itsUs = false;
|
||||
|
||||
@@ -1643,7 +1646,7 @@ UINT32 S_GetMusicPosition(void)
|
||||
static lumpnum_t S_GetMusicLumpNum(const char *mname)
|
||||
{
|
||||
if (S_MusicExists(mname, false, true)) // check non midis first
|
||||
return W_GetNumForName(va("o_%s", mname));
|
||||
return W_GetNumForName(va("O_%s", mname));
|
||||
|
||||
if (S_MusicExists(mname, true, false))
|
||||
{
|
||||
@@ -1651,7 +1654,7 @@ static lumpnum_t S_GetMusicLumpNum(const char *mname)
|
||||
CONS_Alert(CONS_ERROR, "A MIDI music lump %.6s was found,\nbut SRB2Kart does not support MIDI output.\nWe apologise for the inconvenience.\n", mname);
|
||||
return LUMPERROR;
|
||||
#else
|
||||
return W_GetNumForName(va("d_%s", mname));
|
||||
return W_GetNumForName(va("D_%s", mname));
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1710,8 +1713,6 @@ static boolean S_PlayMusic(boolean looping, UINT32 fadeinms)
|
||||
if (S_MusicDisabled())
|
||||
return false;
|
||||
|
||||
I_UpdateSongLagThreshold();
|
||||
|
||||
if ((!fadeinms && !I_PlaySong(looping)) ||
|
||||
(fadeinms && !I_FadeInPlaySong(fadeinms, looping)))
|
||||
{
|
||||
@@ -1951,13 +1952,13 @@ static const char *musicexception_list[] = {
|
||||
// check if the current music is smth we dont want to keep (vote music, etc)
|
||||
static boolean S_CheckMusicException(void)
|
||||
{
|
||||
if (!fasticmp(music.name, mapmusic.name))
|
||||
return true;
|
||||
|
||||
// dumb hack but dont keepmusic music that is supposed to reset
|
||||
if (music.flags & MUSIC_RELOADRESET)
|
||||
return true;
|
||||
|
||||
if (!fasticmp(music.name, mapmusic.name))
|
||||
return true;
|
||||
|
||||
// in case somehow the mapmusic was replaced with smth we dont want to keep
|
||||
for (size_t i = 0; i < sizeof(musicexception_list)/sizeof(musicexception_list[0]); i++)
|
||||
{
|
||||
@@ -2050,16 +2051,13 @@ static boolean S_SkipIntroMusic(void)
|
||||
if (fasticmp(music.name, "titles"))
|
||||
return false;
|
||||
|
||||
char *maptitle = G_BuildMapTitle(gamemap); // Zzz...
|
||||
CLEANUP(Z_Pfree) char *maptitle = G_BuildMapTitle(gamemap); // Zzz...
|
||||
|
||||
if (maptitle && fasticmp(maptitle, "Wandering Falls")) // wandering balls changes its song when the race starts Zzz...
|
||||
{
|
||||
Z_Free(maptitle);
|
||||
return false;
|
||||
}
|
||||
|
||||
Z_Free(maptitle);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
+6
-3
@@ -54,10 +54,13 @@ extern consvar_t cv_amigatype;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//bird music stuff
|
||||
extern consvar_t cv_music_resync_threshold;
|
||||
extern consvar_t cv_music_resync_powerups_only;
|
||||
#ifdef HAVE_FLUIDSYNTH
|
||||
extern consvar_t cv_midisoundfontpath;
|
||||
extern consvar_t cv_midichorus;
|
||||
extern consvar_t cv_midireverb;
|
||||
#endif
|
||||
|
||||
//bird music stuff
|
||||
extern consvar_t cv_invincmusicfade;
|
||||
extern consvar_t cv_growmusicfade;
|
||||
|
||||
|
||||
+6
-8
@@ -42,8 +42,8 @@ INT32 setmodeneeded = 0; // video mode change needed if > 0 (the mode number to
|
||||
static CV_PossibleValue_t shittyscreen_cons_t[] = {{0, "Okay"}, {1, "Shitty"}, {2, "Extra Shitty"}, {0, NULL}};
|
||||
|
||||
//added : 03-02-98: default screen mode, as loaded/saved in config
|
||||
consvar_t cv_scr_width = {"scr_width", "1280", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_scr_width = {"scr_width", "1280", CV_SAVE|CV_CALL, CV_Unsigned, VID_RefreshModeList, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE|CV_CALL, CV_Unsigned, VID_RefreshModeList, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_renderview = {"renderview", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_frameskip = {"frameskip", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
@@ -343,8 +343,6 @@ boolean SCR_IsAspectCorrect(INT32 width, INT32 height)
|
||||
return (width % BASEVIDWIDTH == 0 && height % BASEVIDHEIGHT == 0 && width / BASEVIDWIDTH == height / BASEVIDHEIGHT);
|
||||
}
|
||||
|
||||
double averageFPS = 0.0f;
|
||||
|
||||
#define USE_FPS_SAMPLES
|
||||
|
||||
#ifdef USE_FPS_SAMPLES
|
||||
@@ -352,16 +350,16 @@ double averageFPS = 0.0f;
|
||||
#define NUM_FPS_SAMPLES (32) // Number of samples to store
|
||||
|
||||
static double total_frame_time = 0.0;
|
||||
static int frame_index;
|
||||
|
||||
static double fps_samples[NUM_FPS_SAMPLES];
|
||||
#endif
|
||||
|
||||
static boolean fps_init = false;
|
||||
static precise_t fps_enter = 0;
|
||||
static double averageFPS = 0.0f;
|
||||
|
||||
void SCR_CalculateFPS(void)
|
||||
{
|
||||
static boolean fps_init = false;
|
||||
static int frame_index = 0;
|
||||
static precise_t fps_enter = 0;
|
||||
precise_t fps_finish = 0;
|
||||
|
||||
double frameElapsed = 0.0;
|
||||
|
||||
+25
-24
@@ -46,8 +46,8 @@
|
||||
#include "SDL_image.h"
|
||||
#else
|
||||
// SDLCALL terms removed from original SDL_image declarations
|
||||
int IMG_isXPM(SDL_RWops *src);
|
||||
SDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src);
|
||||
int IMG_isXPM(SDL_IOStream *src);
|
||||
SDL_Surface *IMG_LoadXPM_RW(SDL_IOStream *src);
|
||||
SDL_Surface *IMG_ReadXPMFromArray(const char **xpm);
|
||||
#define IMG_SetError SDL_SetError
|
||||
#define IMG_GetError SDL_GetError
|
||||
@@ -56,7 +56,7 @@ SDL_Surface *IMG_ReadXPMFromArray(const char **xpm);
|
||||
#ifdef LOAD_XPM
|
||||
|
||||
/* See if an image is contained in a data source */
|
||||
int IMG_isXPM(SDL_RWops *src)
|
||||
int IMG_isXPM(SDL_IOStream *src)
|
||||
{
|
||||
Sint64 start;
|
||||
int is_XPM;
|
||||
@@ -64,14 +64,14 @@ int IMG_isXPM(SDL_RWops *src)
|
||||
|
||||
if ( !src )
|
||||
return 0;
|
||||
start = SDL_RWtell(src);
|
||||
start = SDL_TellIO(src);
|
||||
is_XPM = 0;
|
||||
if ( SDL_RWread(src, magic, sizeof(magic), 1) ) {
|
||||
if ( SDL_ReadIO(src, magic, sizeof(magic)) ) {
|
||||
if ( SDL_memcmp(magic, "/* XPM */", sizeof(magic)) == 0 ) {
|
||||
is_XPM = 1;
|
||||
}
|
||||
}
|
||||
SDL_RWseek(src, start, RW_SEEK_SET);
|
||||
SDL_SeekIO(src, start, SDL_IO_SEEK_SET);
|
||||
return(is_XPM);
|
||||
}
|
||||
|
||||
@@ -933,7 +933,7 @@ static const char *error;
|
||||
* If len > 0, it's assumed to be at least len chars (for efficiency).
|
||||
* Return NULL and set error upon EOF or parse error.
|
||||
*/
|
||||
static const char *get_next_line(const char ***lines, SDL_RWops *src, int len)
|
||||
static const char *get_next_line(const char ***lines, SDL_IOStream *src, int len)
|
||||
{
|
||||
char *linebufnew;
|
||||
|
||||
@@ -943,7 +943,7 @@ static const char *get_next_line(const char ***lines, SDL_RWops *src, int len)
|
||||
char c;
|
||||
int n;
|
||||
do {
|
||||
if (SDL_RWread(src, &c, 1, 1) <= 0) {
|
||||
if (SDL_ReadIO(src, &c, 1) <= 0) {
|
||||
error = "Premature end of data";
|
||||
return NULL;
|
||||
}
|
||||
@@ -960,7 +960,7 @@ static const char *get_next_line(const char ***lines, SDL_RWops *src, int len)
|
||||
}
|
||||
linebuf = linebufnew;
|
||||
}
|
||||
if (SDL_RWread(src, linebuf, len - 1, 1) <= 0) {
|
||||
if (SDL_ReadIO(src, linebuf, len - 1) <= 0) {
|
||||
error = "Premature end of data";
|
||||
return NULL;
|
||||
}
|
||||
@@ -980,7 +980,7 @@ static const char *get_next_line(const char ***lines, SDL_RWops *src, int len)
|
||||
}
|
||||
linebuf = linebufnew;
|
||||
}
|
||||
if (SDL_RWread(src, linebuf + n, 1, 1) <= 0) {
|
||||
if (SDL_ReadIO(src, linebuf + n, 1) <= 0) {
|
||||
error = "Premature end of data";
|
||||
return NULL;
|
||||
}
|
||||
@@ -1005,7 +1005,7 @@ do { \
|
||||
} while (0)
|
||||
|
||||
/* read XPM from either array or RWops */
|
||||
static SDL_Surface *load_xpm(const char **xpm, SDL_RWops *src)
|
||||
static SDL_Surface *load_xpm(const char **xpm, SDL_IOStream *src)
|
||||
{
|
||||
Sint64 start = 0;
|
||||
SDL_Surface *image = NULL;
|
||||
@@ -1027,7 +1027,7 @@ static SDL_Surface *load_xpm(const char **xpm, SDL_RWops *src)
|
||||
buflen = 0;
|
||||
|
||||
if (src)
|
||||
start = SDL_RWtell(src);
|
||||
start = SDL_TellIO(src);
|
||||
|
||||
if (xpm)
|
||||
xpmlines = &xpm;
|
||||
@@ -1065,14 +1065,15 @@ static SDL_Surface *load_xpm(const char **xpm, SDL_RWops *src)
|
||||
/* Create the new surface */
|
||||
if (ncolors <= 256) {
|
||||
indexed = 1;
|
||||
image = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 8,
|
||||
0, 0, 0, 0);
|
||||
im_colors = image->format->palette->colors;
|
||||
image->format->palette->ncolors = ncolors;
|
||||
image = SDL_CreateSurface(w, h,
|
||||
SDL_PIXELFORMAT_INDEX8);
|
||||
SDL_Palette *palette = SDL_CreateSurfacePalette(image);
|
||||
im_colors = palette->colors;
|
||||
palette->ncolors = ncolors;
|
||||
} else {
|
||||
indexed = 0;
|
||||
image = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32,
|
||||
0xff0000, 0x00ff00, 0x0000ff, 0);
|
||||
image = SDL_CreateSurface(w, h,
|
||||
SDL_GetPixelFormatForMasks(32, 0xff0000, 0x00ff00, 0x0000ff, 0));
|
||||
}
|
||||
if (!image) {
|
||||
/* Hmm, some SDL error (out of memory?) */
|
||||
@@ -1128,7 +1129,7 @@ static SDL_Surface *load_xpm(const char **xpm, SDL_RWops *src)
|
||||
add_colorhash(colors, nextkey, cpp, pixel);
|
||||
nextkey += cpp;
|
||||
if (rgb == 0xffffffff)
|
||||
SDL_SetColorKey(image, SDL_TRUE, pixel);
|
||||
SDL_SetSurfaceColorKey(image, true, pixel);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1164,9 +1165,9 @@ static SDL_Surface *load_xpm(const char **xpm, SDL_RWops *src)
|
||||
done:
|
||||
if (error) {
|
||||
if ( src )
|
||||
SDL_RWseek(src, start, RW_SEEK_SET);
|
||||
SDL_SeekIO(src, start, SDL_IO_SEEK_SET);
|
||||
if ( image ) {
|
||||
SDL_FreeSurface(image);
|
||||
SDL_DestroySurface(image);
|
||||
image = NULL;
|
||||
}
|
||||
IMG_SetError("%s", error);
|
||||
@@ -1180,7 +1181,7 @@ done:
|
||||
}
|
||||
|
||||
/* Load a XPM type image from an RWops datasource */
|
||||
SDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src)
|
||||
SDL_Surface *IMG_LoadXPM_RW(SDL_IOStream *src)
|
||||
{
|
||||
if ( !src ) {
|
||||
/* The error message has been set in SDL_RWFromFile */
|
||||
@@ -1203,14 +1204,14 @@ SDL_Surface *IMG_ReadXPMFromArray(const char **xpm)
|
||||
#else /* not LOAD_XPM */
|
||||
|
||||
/* See if an image is contained in a data source */
|
||||
int IMG_isXPM(SDL_RWops *src)
|
||||
int IMG_isXPM(SDL_IOStream *src)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/* Load a XPM type image from an SDL datasource */
|
||||
SDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src)
|
||||
SDL_Surface *IMG_LoadXPM_RW(SDL_IOStream *src)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
+2
-2
@@ -27,10 +27,10 @@
|
||||
|
||||
#ifdef HAVE_SDL
|
||||
|
||||
#include "SDL.h"
|
||||
#include <SDL3/SDL.h>
|
||||
|
||||
#ifndef NOLOADSO
|
||||
#include "SDL_loadso.h"
|
||||
#include <SDL3/SDL_loadso.h>
|
||||
#endif
|
||||
|
||||
#define _CREATE_DLL_ // necessary for Unix AND Windows
|
||||
|
||||
Loaded 100 of 111 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user