mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-17 23:21:22 +00:00
Merge branch 'master' of http://git.magicalgirl.moe/STJr/SRB2Internal into repeat-monitors
# Conflicts: # src/info.c
This commit is contained in:
commit
1a4b894589
81 changed files with 1936 additions and 1562 deletions
46
.travis.yml
46
.travis.yml
|
@ -98,7 +98,7 @@ matrix:
|
|||
- p7zip-full
|
||||
- gcc-6
|
||||
compiler: gcc-6
|
||||
env: WFLAGS="-Wno-error=tautological-compare"
|
||||
env: WFLAGS="-Wno-tautological-compare"
|
||||
#gcc-6 (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511
|
||||
- os: linux
|
||||
compiler: clang
|
||||
|
@ -162,28 +162,28 @@ matrix:
|
|||
- clang-3.8
|
||||
compiler: clang-3.8
|
||||
#clang version 3.8.1-svn271127-1~exp1 (branches/release_38)
|
||||
- os: osx
|
||||
osx_image: beta-xcode6.1
|
||||
#Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn)
|
||||
- os: osx
|
||||
osx_image: beta-xcode6.2
|
||||
compiler: gcc
|
||||
#Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
|
||||
# - os: osx
|
||||
# osx_image: beta-xcode6.3
|
||||
# #I think xcode.6.3 VM is broken, it does not boot
|
||||
- os: osx
|
||||
osx_image: xcode6.4
|
||||
#Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
|
||||
- os: osx
|
||||
osx_image: xcode7
|
||||
#Apple LLVM version 7.0.0 (clang-700.0.72)
|
||||
- os: osx
|
||||
osx_image: xcode7.1
|
||||
#Apple LLVM version 7.0.0 (clang-700.1.76)
|
||||
- os: osx
|
||||
osx_image: xcode7.2
|
||||
#Apple LLVM version 7.0.2 (clang-700.1.81)
|
||||
# osx_image: beta-xcode6.1
|
||||
# #Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn)
|
||||
# - os: osx
|
||||
# osx_image: beta-xcode6.2
|
||||
# compiler: gcc
|
||||
# #Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
|
||||
## - os: osx
|
||||
## osx_image: beta-xcode6.3
|
||||
## #I think xcode.6.3 VM is broken, it does not boot
|
||||
# - os: osx
|
||||
# osx_image: xcode6.4
|
||||
# #Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
|
||||
# - os: osx
|
||||
# osx_image: xcode7
|
||||
# #Apple LLVM version 7.0.0 (clang-700.0.72)
|
||||
# - os: osx
|
||||
# osx_image: xcode7.1
|
||||
# #Apple LLVM version 7.0.0 (clang-700.1.76)
|
||||
# - os: osx
|
||||
# osx_image: xcode7.2
|
||||
# #Apple LLVM version 7.0.2 (clang-700.1.81)
|
||||
- os: osx
|
||||
osx_image: xcode7.3
|
||||
#Apple LLVM version 7.3.0 (clang-703.0.31)
|
||||
|
@ -213,7 +213,7 @@ before_script:
|
|||
- 7z x $HOME/srb2_cache/SRB2-v2115-assets-2.7z -oassets
|
||||
- mkdir build
|
||||
- cd build
|
||||
- export CFLAGS="-Wall -W $WFLAGS"
|
||||
- export CFLAGS="-Wall -W -Werror $WFLAGS"
|
||||
- export CCACHE_COMPRESS=true
|
||||
- cmake .. -DCMAKE_BUILD_TYPE=Release
|
||||
|
||||
|
|
22
README.md
Normal file
22
README.md
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Sonic Robo Blast 2
|
||||
|
||||
[![Build status](https://ci.appveyor.com/api/projects/status/399d4hcw9yy7hg2y?svg=true)](https://ci.appveyor.com/project/STJr/srb2)
|
||||
[![Build status](https://travis-ci.org/STJr/SRB2.svg?branch=master)](https://travis-ci.org/STJr/SRB2)
|
||||
|
||||
[Sonic Robo Blast 2](https://srb2.org/) is a 3D Sonic the Hedgehog fangame based on a modified version of [Doom Legacy](http://doomlegacy.sourceforge.net/).
|
||||
|
||||
## Dependencies
|
||||
- NASM (x86 builds only)
|
||||
- SDL2 (Linux/OS X only)
|
||||
- SDL2-Mixer (Linux/OS X only)
|
||||
- libupnp (Linux/OS X only)
|
||||
- libgme (Linux/OS X only)
|
||||
|
||||
Warning: 64-bit builds are not netgame compatible with 32-bit builds. Use at your own risk.
|
||||
|
||||
## Compiling
|
||||
|
||||
See [SRB2 Wiki/Source code compiling](http://wiki.srb2.org/wiki/Source_code_compiling)
|
||||
|
||||
## Disclaimer
|
||||
Sonic Team Junior is in no way affiliated with SEGA or Sonic Team. We do not claim ownership of any of SEGA's intellectual property used in SRB2.
|
33
SRB2.cbp
33
SRB2.cbp
|
@ -2815,6 +2815,39 @@ HW3SOUND for 3D hardware sound support
|
|||
<Option target="Debug Mingw64/DirectX" />
|
||||
<Option target="Release Mingw64/DirectX" />
|
||||
</Unit>
|
||||
<Unit filename="src/m_aatree.c">
|
||||
<Option compilerVar="CC" />
|
||||
<Option target="Debug Native/SDL" />
|
||||
<Option target="Release Native/SDL" />
|
||||
<Option target="Debug Mingw/SDL" />
|
||||
<Option target="Release Mingw/SDL" />
|
||||
<Option target="Debug Mingw/DirectX" />
|
||||
<Option target="Release Mingw/DirectX" />
|
||||
<Option target="Debug Any/Dummy" />
|
||||
<Option target="Release Any/Dummy" />
|
||||
<Option target="Debug Linux/SDL" />
|
||||
<Option target="Release Linux/SDL" />
|
||||
<Option target="Debug Mingw64/SDL" />
|
||||
<Option target="Release Mingw64/SDL" />
|
||||
<Option target="Debug Mingw64/DirectX" />
|
||||
<Option target="Release Mingw64/DirectX" />
|
||||
</Unit>
|
||||
<Unit filename="src/m_aatree.h">
|
||||
<Option target="Debug Native/SDL" />
|
||||
<Option target="Release Native/SDL" />
|
||||
<Option target="Debug Mingw/SDL" />
|
||||
<Option target="Release Mingw/SDL" />
|
||||
<Option target="Debug Mingw/DirectX" />
|
||||
<Option target="Release Mingw/DirectX" />
|
||||
<Option target="Debug Any/Dummy" />
|
||||
<Option target="Release Any/Dummy" />
|
||||
<Option target="Debug Linux/SDL" />
|
||||
<Option target="Release Linux/SDL" />
|
||||
<Option target="Debug Mingw64/SDL" />
|
||||
<Option target="Release Mingw64/SDL" />
|
||||
<Option target="Debug Mingw64/DirectX" />
|
||||
<Option target="Release Mingw64/DirectX" />
|
||||
</Unit>
|
||||
<Unit filename="src/m_anigif.c">
|
||||
<Option compilerVar="CC" />
|
||||
<Option target="Debug Native/SDL" />
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
version: 2.1.14.{branch}-{build}
|
||||
version: 2.1.16.{branch}-{build}
|
||||
os: MinGW
|
||||
|
||||
environment:
|
||||
|
|
155
readme.txt
155
readme.txt
|
@ -1,155 +0,0 @@
|
|||
Here it is! SRB2 v2.1.14 source code!
|
||||
(why do we keep the version number up to date
|
||||
when everything else in this file is hilariously old?
|
||||
- Inuyasha)
|
||||
|
||||
|
||||
Win32 with Visual C (6SP6+Processor Pack OR 7)
|
||||
~~~
|
||||
|
||||
2 VC++ 6.0 project files are included:
|
||||
|
||||
Win32/DirectX/FMOD
|
||||
src\win32\wLegacy.dsw
|
||||
You'll need FMOD to compile this version (www.fmod.org)
|
||||
or
|
||||
Win32/SDL/SDL_mixer
|
||||
src\sdl\Win32SDL.dsp
|
||||
You'll need SDL and SDL_mixer for this version (www.libsdl.org)
|
||||
|
||||
Both needs NASM (http://sourceforge.net/projects/nasm)
|
||||
For PNG screenshot, libPNG, and Zlib (from http://gnuwin32.sourceforge.net/)
|
||||
|
||||
No warranty, support, etc. of any kind is offered,
|
||||
just plain old as is.
|
||||
Some bits of code are still really scary.
|
||||
Go nuts!
|
||||
|
||||
|
||||
Win32 with Dev-C++ (http://bloodshed.net/ free!)
|
||||
~~~
|
||||
2 Dev-C++ project files are included:
|
||||
|
||||
Win32/DirectX/FMOD
|
||||
src\win32\SRB2.dev
|
||||
or
|
||||
Win32/SDL/SDL_mixer
|
||||
src\sdl\Win32SDL.dev
|
||||
You'll need SDL and SDL_mixer for this version (www.libsdl.org)
|
||||
libPNG and Zlib (from http://gnuwin32.sourceforge.net/)
|
||||
Note there are precompiled libpng.a and libz.a for Mingw
|
||||
|
||||
you will need NASM for both SDL/SDL_mixer and DirectX/FMOD
|
||||
and you need DirectX 6 (or up) Dev-Paks to compile DirectX version
|
||||
|
||||
GNU/Linux
|
||||
~~~
|
||||
|
||||
Dependencies:
|
||||
SDL 1.2.7 or better (from libsdl.org)
|
||||
SDL_Mixer 1.2.2(.7 for file-less music playback) (from libsdl.org)
|
||||
Nasm (use NOASM=1 if you don't have it or have an non-i386 system, I think)
|
||||
libPNG 1.2.7
|
||||
Zlib 1.2.3
|
||||
The Xiph.org libogg and libvorbis libraries
|
||||
The OpenGL headers (from Mesa, usually shipped with your X.org or XFree
|
||||
installation, so you needn't worry, most likely)
|
||||
GCC 3.x toolchain and binutils
|
||||
GNU Make
|
||||
|
||||
Build instructions:
|
||||
|
||||
make -C src LINUX=1
|
||||
|
||||
Build instructions (64 bit):
|
||||
|
||||
make -C src LINUX64=1
|
||||
|
||||
Build instructions to build for Wii Linux/SRB2Wii on a PowerPC system,
|
||||
follow cross-compiling instructions for cross-compiling on a x86 system:
|
||||
|
||||
make -C src LINUX=1 WIILINUX=1
|
||||
|
||||
Build instructions to build for Pandora (Linux) on a ARM system,
|
||||
follow cross-compiling instructions for cross-compiling on a x86 system:
|
||||
|
||||
make -C src PANDORA=1
|
||||
|
||||
Solaris
|
||||
~~~
|
||||
|
||||
Dependencies:
|
||||
SDL 1.2.5 or better (from libsdl.org)
|
||||
SDL_Mixer 1.2.2(.7 for file-less music playback) (from libsdl.org)
|
||||
libPNG 1.2.7
|
||||
Zlib 1.2.3
|
||||
The Xiph.org libogg and libvorbis libraries
|
||||
The OpenGL headers (from Mesa, usually shipped with your X.org or XFree
|
||||
installation, so you needn't worry, most likely)
|
||||
GCC 3.x toolchain and binutils
|
||||
GNU Make
|
||||
|
||||
You can get all these programs/libraries from the Companion CD (except SDL_mixer and OpenGL)
|
||||
|
||||
Build instructions:
|
||||
|
||||
gmake -C src SOLARIS=1
|
||||
|
||||
FreeBSD
|
||||
~~~
|
||||
|
||||
Dependencies:
|
||||
SDL 1.2.7 or better (from libsdl.org)
|
||||
SDL_Mixer 1.2.2(.7 for file-less music playback) (from libsdl.org)
|
||||
Nasm (use NOASM=1 if you don't have it or have an non-i386 system, I think)
|
||||
libPNG 1.2.7
|
||||
Zlib 1.2.3
|
||||
The Xiph.org libogg and libvorbis libraries
|
||||
The OpenGL headers (from Mesa, usually shipped with your X.org or XFree
|
||||
installation, so you needn't worry, most likely)
|
||||
GCC 3.x toolchain and binutils
|
||||
GNU Make
|
||||
|
||||
Build instructions:
|
||||
|
||||
gmake -C src FREEBSD=1
|
||||
|
||||
DJGPP/DOS
|
||||
~~~
|
||||
|
||||
Dependencies:
|
||||
Allegro 3.12 game programming library, (from
|
||||
http://alleg.sourceforge.net/index.html)
|
||||
Nasm (use NOASM=1 if you don't have it)
|
||||
libsocket (from http://homepages.nildram.co.uk/~phekda/richdawe/lsck/) or
|
||||
Watt-32 (from http://www.bgnett.no/~giva/)
|
||||
GCC 3.x toolchain and binutils
|
||||
GNU Make
|
||||
|
||||
Build instructions:
|
||||
|
||||
make -C src # to link with Watt-32, add WATTCP=1
|
||||
# for remote debugging over the COM port, add RDB=1
|
||||
|
||||
Notes:
|
||||
use tools\djgpp\all313.diff to update Allegro to a "more usable" version ;)
|
||||
Example: E:\djgpp\allegro>patch -p# < D:\SRB2Code\1.1\srb2\tools\djgpp\all313.diff
|
||||
|
||||
Windows CE
|
||||
~~~
|
||||
|
||||
Dependencies:
|
||||
SDL 1.27
|
||||
|
||||
Build instructions:
|
||||
|
||||
use src\SDL\WinCE\SRB2CE.vcw
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
binaries will turn in up in bin/
|
||||
|
||||
note: read the src/makefile for more options
|
||||
|
||||
- Sonic Team Junior
|
||||
http://www.srb2.org
|
|
@ -22,6 +22,7 @@ set(SRB2_CORE_SOURCES
|
|||
i_tcp.c
|
||||
info.c
|
||||
lzf.c
|
||||
m_aatree.c
|
||||
m_anigif.c
|
||||
m_argv.c
|
||||
m_bbox.c
|
||||
|
@ -83,6 +84,7 @@ set(SRB2_CORE_HEADERS
|
|||
info.h
|
||||
keys.h
|
||||
lzf.h
|
||||
m_aatree.h
|
||||
m_anigif.h
|
||||
m_argv.h
|
||||
m_bbox.h
|
||||
|
|
14
src/Makefile
14
src/Makefile
|
@ -189,6 +189,10 @@ ifdef FREEBSD
|
|||
UNIXCOMMON=1
|
||||
endif
|
||||
|
||||
ifdef MACOSX
|
||||
UNIXCOMMON=1
|
||||
endif
|
||||
|
||||
ifdef NDS
|
||||
NOPNG=1
|
||||
NONET=1
|
||||
|
@ -429,6 +433,7 @@ OBJS:=$(i_main_o) \
|
|||
$(OBJDIR)/hu_stuff.o \
|
||||
$(OBJDIR)/y_inter.o \
|
||||
$(OBJDIR)/st_stuff.o \
|
||||
$(OBJDIR)/m_aatree.o \
|
||||
$(OBJDIR)/m_anigif.o \
|
||||
$(OBJDIR)/m_argv.o \
|
||||
$(OBJDIR)/m_bbox.o \
|
||||
|
@ -593,11 +598,15 @@ ifndef WINDOWSHELL
|
|||
-$(GZIP) $(GZIP_OPT2) $(BIN)/$(DBGNAME).txt
|
||||
endif
|
||||
endif
|
||||
|
||||
# mac os x lsdlsrb2 does not like objcopy
|
||||
ifndef MACOSX
|
||||
ifndef PSP
|
||||
$(OBJCOPY) $(BIN)/$(EXENAME) $(BIN)/$(DBGNAME)
|
||||
$(OBJCOPY) --strip-debug $(BIN)/$(EXENAME)
|
||||
-$(OBJCOPY) --add-gnu-debuglink=$(BIN)/$(DBGNAME) $(BIN)/$(EXENAME)
|
||||
endif
|
||||
endif
|
||||
ifndef NOUPX
|
||||
-$(UPX) $(UPX_OPTS) $(BIN)/$(EXENAME)
|
||||
endif
|
||||
|
@ -745,6 +754,11 @@ $(OBJDIR)/%.o: %.c
|
|||
$(OBJDIR)/%.o: $(INTERFACE)/%.c
|
||||
$(CC) $(CFLAGS) $(WFLAGS) -c $< -o $@
|
||||
|
||||
ifdef MACOSX
|
||||
$(OBJDIR)/%.o: sdl/macosx/%.c
|
||||
$(CC) $(CFLAGS) $(WFLAGS) -c $< -o $@
|
||||
endif
|
||||
|
||||
$(OBJDIR)/%.o: hardware/%.c
|
||||
$(CC) $(CFLAGS) $(WFLAGS) -c $< -o $@
|
||||
|
||||
|
|
|
@ -406,6 +406,15 @@ else
|
|||
WINDRES=windres
|
||||
endif
|
||||
|
||||
# because Apple screws with us on this
|
||||
# need to get bintools from homebrew
|
||||
ifdef MACOSX
|
||||
CC=clang
|
||||
CXX=clang
|
||||
OBJCOPY=gobjcopy
|
||||
OBJDUMP=gobjdump
|
||||
endif
|
||||
|
||||
OBJDUMP_OPTS?=--wide --source --line-numbers
|
||||
LD=$(CC)
|
||||
|
||||
|
|
|
@ -732,6 +732,7 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
|||
luaG_runerror(L, LUA_QL("for") " limit must be a number");
|
||||
else if (!tonumber(pstep, ra+2))
|
||||
luaG_runerror(L, LUA_QL("for") " step must be a number");
|
||||
if (ra && pstep)
|
||||
setnvalue(ra, luai_numsub(nvalue(ra), nvalue(pstep)));
|
||||
dojump(L, pc, GETARG_sBx(i));
|
||||
continue;
|
||||
|
|
|
@ -966,9 +966,11 @@ void CV_RegisterVar(consvar_t *variable)
|
|||
// check net variables
|
||||
if (variable->flags & CV_NETVAR)
|
||||
{
|
||||
const consvar_t *netvar;
|
||||
variable->netid = CV_ComputeNetid(variable->name);
|
||||
if (CV_FindNetVar(variable->netid))
|
||||
I_Error("Variables %s and %s have same netid\n", variable->name, CV_FindNetVar(variable->netid)->name);
|
||||
netvar = CV_FindNetVar(variable->netid);
|
||||
if (netvar)
|
||||
I_Error("Variables %s and %s have same netid\n", variable->name, netvar->name);
|
||||
}
|
||||
|
||||
// link the variable in
|
||||
|
|
|
@ -531,6 +531,7 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
|
|||
rsp->deadtimer = players[i].deadtimer;
|
||||
rsp->exiting = (tic_t)LONG(players[i].exiting);
|
||||
rsp->homing = players[i].homing;
|
||||
rsp->dashmode = (tic_t)LONG(players[i].dashmode);
|
||||
rsp->skidtime = (tic_t)LONG(players[i].skidtime);
|
||||
rsp->cmomx = (fixed_t)LONG(players[i].cmomx);
|
||||
rsp->cmomy = (fixed_t)LONG(players[i].cmomy);
|
||||
|
@ -657,6 +658,7 @@ static void resynch_read_player(resynch_pak *rsp)
|
|||
players[i].deadtimer = rsp->deadtimer;
|
||||
players[i].exiting = (tic_t)LONG(rsp->exiting);
|
||||
players[i].homing = rsp->homing;
|
||||
players[i].dashmode = (tic_t)LONG(rsp->dashmode);
|
||||
players[i].skidtime = (tic_t)LONG(rsp->skidtime);
|
||||
players[i].cmomx = (fixed_t)LONG(rsp->cmomx);
|
||||
players[i].cmomy = (fixed_t)LONG(rsp->cmomy);
|
||||
|
|
|
@ -191,6 +191,7 @@ typedef struct
|
|||
INT32 deadtimer;
|
||||
tic_t exiting;
|
||||
UINT8 homing;
|
||||
tic_t dashmode;
|
||||
tic_t skidtime;
|
||||
fixed_t cmomx;
|
||||
fixed_t cmomy;
|
||||
|
|
|
@ -1060,10 +1060,11 @@ void D_SRB2Main(void)
|
|||
if (M_CheckParm("-warp") && M_IsNextParm())
|
||||
{
|
||||
const char *word = M_GetNextParm();
|
||||
if (fastncmp(word, "MAP", 3))
|
||||
char ch; // use this with sscanf to catch non-digits with
|
||||
if (fastncmp(word, "MAP", 3)) // MAPxx name
|
||||
pstartmap = M_MapNumber(word[3], word[4]);
|
||||
else
|
||||
pstartmap = atoi(word);
|
||||
else if (sscanf(word, "%d%c", &pstartmap, &ch) != 1) // a plain number
|
||||
I_Error("Cannot warp to map %s (invalid map name)\n", word);
|
||||
// Don't check if lump exists just yet because the wads haven't been loaded!
|
||||
// Just do a basic range check here.
|
||||
if (pstartmap < 1 || pstartmap > NUMMAPS)
|
||||
|
|
|
@ -41,7 +41,7 @@ void D_SRB2Main(void);
|
|||
// Called by IO functions when input is detected.
|
||||
void D_PostEvent(const event_t *ev);
|
||||
#ifndef DOXYGEN
|
||||
void D_PostEvent_end(void); // delimiter for locking memory
|
||||
FUNCMATH void D_PostEvent_end(void); // delimiter for locking memory
|
||||
#endif
|
||||
|
||||
void D_ProcessEvents(void);
|
||||
|
|
|
@ -57,7 +57,8 @@ typedef enum
|
|||
CA_FALLSWITCH,
|
||||
CA_JUMPBOOST,
|
||||
CA_AIRDRILL,
|
||||
CA_JUMPTHOK
|
||||
CA_JUMPTHOK,
|
||||
CA_DASHMODE
|
||||
} charability_t;
|
||||
|
||||
//Secondary skin abilities
|
||||
|
@ -164,6 +165,7 @@ typedef enum
|
|||
PA_EDGE,
|
||||
PA_WALK,
|
||||
PA_RUN,
|
||||
PA_PEEL,
|
||||
PA_PAIN,
|
||||
PA_ROLL,
|
||||
PA_SPRING,
|
||||
|
@ -351,6 +353,7 @@ typedef struct player_s
|
|||
tic_t exiting; // Exitlevel timer
|
||||
|
||||
UINT8 homing; // Are you homing?
|
||||
tic_t dashmode; // counter for dashmode ability
|
||||
|
||||
tic_t skidtime; // Skid timer
|
||||
|
||||
|
|
|
@ -673,6 +673,22 @@ static void readfreeslots(MYFILE *f)
|
|||
break;
|
||||
}
|
||||
}
|
||||
else if (fastcmp(type, "SPR2"))
|
||||
{
|
||||
// Search if we already have an SPR2 by that name...
|
||||
for (i = SPR2_FIRSTFREESLOT; i < (int)free_spr2; i++)
|
||||
if (memcmp(spr2names[i],word,4) == 0)
|
||||
break;
|
||||
// We found it? (Two mods using the same SPR2 name?) Then don't allocate another one.
|
||||
if (i < (int)free_spr2)
|
||||
continue;
|
||||
// Copy in the spr2 name and increment free_spr2.
|
||||
if (free_spr2 < NUMPLAYERSPRITES) {
|
||||
strncpy(spr2names[free_spr2],word,4);
|
||||
spr2names[free_spr2++][4] = 0;
|
||||
} else
|
||||
CONS_Alert(CONS_WARNING, "Ran out of free SPR2 slots!\n");
|
||||
}
|
||||
else
|
||||
deh_warning("Freeslots: unknown enum class '%s' for '%s_%s'", type, type, word);
|
||||
}
|
||||
|
@ -3797,6 +3813,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_PLAY_WAIT",
|
||||
"S_PLAY_WALK",
|
||||
"S_PLAY_RUN",
|
||||
"S_PLAY_PEEL",
|
||||
"S_PLAY_PAIN",
|
||||
"S_PLAY_DEAD",
|
||||
"S_PLAY_DRWN",
|
||||
|
@ -3822,6 +3839,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_PLAY_SUPER_STND",
|
||||
"S_PLAY_SUPER_WALK",
|
||||
"S_PLAY_SUPER_RUN",
|
||||
"S_PLAY_SUPER_PEEL",
|
||||
"S_PLAY_SUPER_PAIN",
|
||||
"S_PLAY_SUPER_STUN",
|
||||
"S_PLAY_SUPER_DEAD",
|
||||
|
@ -5491,6 +5509,36 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_RDIAG7",
|
||||
"S_RDIAG8",
|
||||
|
||||
// Yellow Side Spring
|
||||
"S_YHORIZ1",
|
||||
"S_YHORIZ2",
|
||||
"S_YHORIZ3",
|
||||
"S_YHORIZ4",
|
||||
"S_YHORIZ5",
|
||||
"S_YHORIZ6",
|
||||
"S_YHORIZ7",
|
||||
"S_YHORIZ8",
|
||||
|
||||
// Red Side Spring
|
||||
"S_RHORIZ1",
|
||||
"S_RHORIZ2",
|
||||
"S_RHORIZ3",
|
||||
"S_RHORIZ4",
|
||||
"S_RHORIZ5",
|
||||
"S_RHORIZ6",
|
||||
"S_RHORIZ7",
|
||||
"S_RHORIZ8",
|
||||
|
||||
// Blue Side Spring
|
||||
"S_BHORIZ1",
|
||||
"S_BHORIZ2",
|
||||
"S_BHORIZ3",
|
||||
"S_BHORIZ4",
|
||||
"S_BHORIZ5",
|
||||
"S_BHORIZ6",
|
||||
"S_BHORIZ7",
|
||||
"S_BHORIZ8",
|
||||
|
||||
// Rain
|
||||
"S_RAIN1",
|
||||
"S_RAINRETURN",
|
||||
|
@ -6248,6 +6296,9 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
|||
"MT_REDSPRING",
|
||||
"MT_YELLOWDIAG", // Yellow Diagonal Spring
|
||||
"MT_REDDIAG", // Red Diagonal Spring
|
||||
"MT_YELLOWHORIZ", // Yellow Side Spring
|
||||
"MT_REDHORIZ", // Red Side Spring
|
||||
"MT_BLUEHORIZ", // Blue Side Spring
|
||||
|
||||
// Interactive Objects
|
||||
"MT_BUBBLES", // Bubble source
|
||||
|
@ -6721,12 +6772,14 @@ static const char *const MOBJEFLAG_LIST[] = {
|
|||
NULL
|
||||
};
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
static const char *const MAPTHINGFLAG_LIST[4] = {
|
||||
NULL,
|
||||
"OBJECTFLIP", // Reverse gravity flag for objects.
|
||||
"OBJECTSPECIAL", // Special flag used with certain objects.
|
||||
"AMBUSH" // Deaf monsters/do not react to sound.
|
||||
};
|
||||
#endif
|
||||
|
||||
static const char *const PLAYERFLAG_LIST[] = {
|
||||
// Flip camera angle with gravity flip prefrence.
|
||||
|
@ -6799,6 +6852,7 @@ static const char *const PLAYERFLAG_LIST[] = {
|
|||
NULL // stop loop here.
|
||||
};
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
// Linedef flags
|
||||
static const char *const ML_LIST[16] = {
|
||||
"IMPASSIBLE",
|
||||
|
@ -6818,6 +6872,7 @@ static const char *const ML_LIST[16] = {
|
|||
"BOUNCY",
|
||||
"TFERLINE"
|
||||
};
|
||||
#endif
|
||||
|
||||
// This DOES differ from r_draw's Color_Names, unfortunately.
|
||||
// Also includes Super colors
|
||||
|
@ -7144,6 +7199,7 @@ struct {
|
|||
{"CA_JUMPBOOST",CA_JUMPBOOST},
|
||||
{"CA_AIRDRILL",CA_AIRDRILL},
|
||||
{"CA_JUMPTHOK",CA_JUMPTHOK},
|
||||
{"CA_DASHMODE",CA_DASHMODE},
|
||||
// Secondary
|
||||
{"CA2_NONE",CA2_NONE}, // now slot 0!
|
||||
{"CA2_SPINDASH",CA2_SPINDASH},
|
||||
|
@ -7194,6 +7250,7 @@ struct {
|
|||
{"PA_EDGE",PA_EDGE},
|
||||
{"PA_WALK",PA_WALK},
|
||||
{"PA_RUN",PA_RUN},
|
||||
{"PA_PEEL",PA_PEEL},
|
||||
{"PA_PAIN",PA_PAIN},
|
||||
{"PA_ROLL",PA_ROLL},
|
||||
{"PA_SPRING",PA_SPRING},
|
||||
|
@ -7774,7 +7831,7 @@ fixed_t get_number(const char *word)
|
|||
#endif
|
||||
}
|
||||
|
||||
void DEH_Check(void)
|
||||
void FUNCMATH DEH_Check(void)
|
||||
{
|
||||
#if defined(_DEBUG) || defined(PARANOIA)
|
||||
const size_t dehstates = sizeof(STATE_LIST)/sizeof(const char*);
|
||||
|
@ -7839,7 +7896,7 @@ static inline int lib_freeslot(lua_State *L)
|
|||
lua_pushinteger(L, sfx);
|
||||
r++;
|
||||
} else
|
||||
return r;
|
||||
CONS_Alert(CONS_WARNING, "Ran out of free SFX slots!\n");
|
||||
}
|
||||
else if (fastcmp(type, "SPR"))
|
||||
{
|
||||
|
@ -7866,7 +7923,7 @@ static inline int lib_freeslot(lua_State *L)
|
|||
break;
|
||||
}
|
||||
if (j > SPR_LASTFREESLOT)
|
||||
return r;
|
||||
CONS_Alert(CONS_WARNING, "Ran out of free sprite slots!\n");
|
||||
}
|
||||
else if (fastcmp(type, "S"))
|
||||
{
|
||||
|
@ -7881,7 +7938,7 @@ static inline int lib_freeslot(lua_State *L)
|
|||
break;
|
||||
}
|
||||
if (i == NUMSTATEFREESLOTS)
|
||||
return r;
|
||||
CONS_Alert(CONS_WARNING, "Ran out of free State slots!\n");
|
||||
}
|
||||
else if (fastcmp(type, "MT"))
|
||||
{
|
||||
|
@ -7896,7 +7953,26 @@ static inline int lib_freeslot(lua_State *L)
|
|||
break;
|
||||
}
|
||||
if (i == NUMMOBJFREESLOTS)
|
||||
return r;
|
||||
CONS_Alert(CONS_WARNING, "Ran out of free MobjType slots!\n");
|
||||
}
|
||||
else if (fastcmp(type, "SPR2"))
|
||||
{
|
||||
// Search if we already have an SPR2 by that name...
|
||||
enum playersprite i;
|
||||
for (i = SPR2_FIRSTFREESLOT; i < free_spr2; i++)
|
||||
if (memcmp(spr2names[i],word,4) == 0)
|
||||
break;
|
||||
// We don't, so allocate a new one.
|
||||
if (i >= free_spr2) {
|
||||
if (free_spr2 < NUMPLAYERSPRITES)
|
||||
{
|
||||
CONS_Printf("Sprite SPR2_%s allocated.\n",word);
|
||||
strncpy(spr2names[free_spr2],word,4);
|
||||
spr2names[free_spr2++][4] = 0;
|
||||
} else
|
||||
CONS_Alert(CONS_WARNING, "Ran out of free SPR2 slots!\n");
|
||||
}
|
||||
r++;
|
||||
}
|
||||
Z_Free(s);
|
||||
lua_remove(L, 1);
|
||||
|
@ -8063,7 +8139,7 @@ static inline int lib_getenum(lua_State *L)
|
|||
}
|
||||
else if (fastncmp("SPR2_",word,4)) {
|
||||
p = word+5;
|
||||
for (i = 0; i < NUMPLAYERSPRITES; i++)
|
||||
for (i = 0; i < (fixed_t)free_spr2; i++)
|
||||
if (!spr2names[i][4])
|
||||
{
|
||||
// special 3-char cases, e.g. SPR2_RUN
|
||||
|
|
|
@ -60,6 +60,7 @@
|
|||
#endif
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#define NONET
|
||||
#if !defined (HWRENDER) && !defined (NOHW)
|
||||
#define HWRENDER
|
||||
#endif
|
||||
|
@ -213,7 +214,7 @@ extern FILE *logstream;
|
|||
// it's only for detection of the version the player is using so the MS can alert them of an update.
|
||||
// Only set it higher, not lower, obviously.
|
||||
// Note that we use this to help keep internal testing in check; this is why v2.1.0 is not version "1".
|
||||
#define MODVERSION 20
|
||||
#define MODVERSION 21
|
||||
|
||||
// =========================================================================
|
||||
|
||||
|
@ -435,6 +436,12 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
|||
/// Kalaron/Eternity Engine slope code (SRB2CB ported)
|
||||
#define ESLOPE
|
||||
|
||||
#ifdef ESLOPE
|
||||
/// Backwards compatibility with SRB2CB's slope linedef types.
|
||||
/// \note A simple shim that prints a warning.
|
||||
#define ESLOPE_TYPESHIM
|
||||
#endif
|
||||
|
||||
/// Delete file while the game is running.
|
||||
/// \note EXTREMELY buggy, tends to crash game.
|
||||
//#define DELFILE
|
||||
|
|
|
@ -92,7 +92,7 @@ typedef long ssize_t;
|
|||
#endif
|
||||
|
||||
#ifdef __APPLE_CC__
|
||||
#define DIRECTFULLSCREEN
|
||||
#define DIRECTFULLSCREEN 1
|
||||
#define DEBUG_LOG
|
||||
#define NOIPX
|
||||
#endif
|
||||
|
|
|
@ -1727,6 +1727,7 @@ static void F_AdvanceToNextScene(void)
|
|||
|
||||
void F_EndCutScene(void)
|
||||
{
|
||||
cutsceneover = true; // do this first, just in case Y_EndGame or something wants to turn it back false later
|
||||
if (runningprecutscene)
|
||||
{
|
||||
if (server)
|
||||
|
@ -1743,7 +1744,6 @@ void F_EndCutScene(void)
|
|||
else
|
||||
Y_EndGame();
|
||||
}
|
||||
cutsceneover = true;
|
||||
}
|
||||
|
||||
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer)
|
||||
|
|
|
@ -35,7 +35,7 @@ void F_CutsceneTicker(void);
|
|||
void F_TitleDemoTicker(void);
|
||||
|
||||
// Called by main loop.
|
||||
void F_GameEndDrawer(void);
|
||||
FUNCMATH void F_GameEndDrawer(void);
|
||||
void F_IntroDrawer(void);
|
||||
void F_TitleScreenDrawer(void);
|
||||
|
||||
|
|
|
@ -711,6 +711,10 @@ void G_SetGameModified(boolean silent)
|
|||
|
||||
if (!silent)
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("Game must be restarted to record statistics.\n"));
|
||||
|
||||
// If in record attack recording, cancel it.
|
||||
if (modeattacking)
|
||||
M_EndModeAttackRun();
|
||||
}
|
||||
|
||||
/** Builds an original game map name from a map number.
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
#endif
|
||||
#endif
|
||||
|
||||
typedef void (*I_Error_t) (const char *error, ...);
|
||||
typedef void (*I_Error_t) (const char *error, ...) FUNCIERROR;
|
||||
|
||||
// ==========================================================================
|
||||
// MATHS
|
||||
|
|
|
@ -66,9 +66,9 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing);
|
|||
#endif
|
||||
|
||||
#ifdef SORTING
|
||||
void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub, fixed_t fixedheight,
|
||||
void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight,
|
||||
INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap);
|
||||
void HWR_AddTransparentPolyobjectFloor(lumpnum_t lumpnum, polyobj_t *polysector, fixed_t fixedheight,
|
||||
void HWR_AddTransparentPolyobjectFloor(lumpnum_t lumpnum, polyobj_t *polysector, boolean isceiling, fixed_t fixedheight,
|
||||
INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, extracolormap_t *planecolormap);
|
||||
#else
|
||||
static void HWR_Add3DWater(lumpnum_t lumpnum, extrasubsector_t *xsub, fixed_t fixedheight,
|
||||
|
@ -521,7 +521,7 @@ static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color, UINT32 fadecolor) // L
|
|||
// -----------------+
|
||||
// HWR_RenderPlane : Render a floor or ceiling convex polygon
|
||||
// -----------------+
|
||||
static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fixedheight,
|
||||
static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight,
|
||||
FBITFIELD PolyFlags, INT32 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector, UINT8 alpha, boolean fogplane, extracolormap_t *planecolormap)
|
||||
{
|
||||
polyvertex_t * pv;
|
||||
|
@ -554,17 +554,16 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fi
|
|||
// Get the slope pointer to simplify future code
|
||||
if (FOFsector)
|
||||
{
|
||||
if (FOFsector->f_slope && FOFsector->floorheight == fixedheight)
|
||||
if (FOFsector->f_slope && !isceiling)
|
||||
slope = FOFsector->f_slope;
|
||||
else if (FOFsector->c_slope && FOFsector->ceilingheight == fixedheight)
|
||||
else if (FOFsector->c_slope && isceiling)
|
||||
slope = FOFsector->c_slope;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Use fixedheight to determine whether to check floor or ceiling because I hate my life
|
||||
if (gr_frontsector->f_slope && gr_frontsector->floorheight == fixedheight)
|
||||
if (gr_frontsector->f_slope && !isceiling)
|
||||
slope = gr_frontsector->f_slope;
|
||||
else if (gr_frontsector->c_slope && gr_frontsector->ceilingheight == fixedheight)
|
||||
else if (gr_frontsector->c_slope && isceiling)
|
||||
slope = gr_frontsector->c_slope;
|
||||
}
|
||||
|
||||
|
@ -638,12 +637,7 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fi
|
|||
|
||||
if (FOFsector != NULL)
|
||||
{
|
||||
#ifdef ESLOPE
|
||||
if ((slope && slope == FOFsector->f_slope)
|
||||
|| fixedheight == FOFsector->floorheight) // it's a floor
|
||||
#else
|
||||
if (fixedheight == FOFsector->floorheight) // it's a floor
|
||||
#endif
|
||||
if (!isceiling) // it's a floor
|
||||
{
|
||||
scrollx = FIXED_TO_FLOAT(FOFsector->floor_xoffs)/fflatsize;
|
||||
scrolly = FIXED_TO_FLOAT(FOFsector->floor_yoffs)/fflatsize;
|
||||
|
@ -658,12 +652,7 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fi
|
|||
}
|
||||
else if (gr_frontsector)
|
||||
{
|
||||
#ifdef ESLOPE
|
||||
if ((slope && slope == gr_frontsector->f_slope)
|
||||
|| fixedheight == gr_frontsector->floorheight) // it's a floor
|
||||
#else
|
||||
if (fixedheight < dup_viewz) // it's a floor
|
||||
#endif
|
||||
if (!isceiling) // it's a floor
|
||||
{
|
||||
scrollx = FIXED_TO_FLOAT(gr_frontsector->floor_xoffs)/fflatsize;
|
||||
scrolly = FIXED_TO_FLOAT(gr_frontsector->floor_yoffs)/fflatsize;
|
||||
|
@ -3111,7 +3100,7 @@ static inline void HWR_AddPolyObjectSegs(void)
|
|||
}
|
||||
|
||||
#ifdef POLYOBJECTS_PLANES
|
||||
static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, fixed_t fixedheight,
|
||||
static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling, fixed_t fixedheight,
|
||||
FBITFIELD blendmode, UINT8 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector,
|
||||
UINT8 alpha, extracolormap_t *planecolormap)
|
||||
{
|
||||
|
@ -3195,7 +3184,7 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, fixed_t fixedheight
|
|||
|
||||
if (FOFsector != NULL)
|
||||
{
|
||||
if (fixedheight == FOFsector->floorheight) // it's a floor
|
||||
if (!isceiling) // it's a floor
|
||||
{
|
||||
scrollx = FIXED_TO_FLOAT(FOFsector->floor_xoffs)/fflatsize;
|
||||
scrolly = FIXED_TO_FLOAT(FOFsector->floor_yoffs)/fflatsize;
|
||||
|
@ -3210,7 +3199,7 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, fixed_t fixedheight
|
|||
}
|
||||
else if (gr_frontsector)
|
||||
{
|
||||
if (fixedheight < dup_viewz) // it's a floor
|
||||
if (!isceiling) // it's a floor
|
||||
{
|
||||
scrollx = FIXED_TO_FLOAT(gr_frontsector->floor_xoffs)/fflatsize;
|
||||
scrolly = FIXED_TO_FLOAT(gr_frontsector->floor_yoffs)/fflatsize;
|
||||
|
@ -3303,13 +3292,13 @@ static void HWR_AddPolyObjectPlanes(void)
|
|||
{
|
||||
FSurfaceInfo Surf;
|
||||
FBITFIELD blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf);
|
||||
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->floorpic].lumpnum, po_ptrs[i], polyobjsector->floorheight,
|
||||
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->floorpic].lumpnum, po_ptrs[i], false, polyobjsector->floorheight,
|
||||
polyobjsector->lightlevel, Surf.FlatColor.s.alpha, polyobjsector, blendmode, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
HWR_GetFlat(levelflats[polyobjsector->floorpic].lumpnum);
|
||||
HWR_RenderPolyObjectPlane(po_ptrs[i], polyobjsector->floorheight, PF_Occlude,
|
||||
HWR_RenderPolyObjectPlane(po_ptrs[i], false, polyobjsector->floorheight, PF_Occlude,
|
||||
polyobjsector->lightlevel, levelflats[polyobjsector->floorpic].lumpnum,
|
||||
polyobjsector, 255, NULL);
|
||||
}
|
||||
|
@ -3325,13 +3314,13 @@ static void HWR_AddPolyObjectPlanes(void)
|
|||
FBITFIELD blendmode;
|
||||
memset(&Surf, 0x00, sizeof(Surf));
|
||||
blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf);
|
||||
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->ceilingpic].lumpnum, po_ptrs[i], polyobjsector->ceilingheight,
|
||||
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->ceilingpic].lumpnum, po_ptrs[i], true, polyobjsector->ceilingheight,
|
||||
polyobjsector->lightlevel, Surf.FlatColor.s.alpha, polyobjsector, blendmode, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
HWR_GetFlat(levelflats[polyobjsector->ceilingpic].lumpnum);
|
||||
HWR_RenderPolyObjectPlane(po_ptrs[i], polyobjsector->ceilingheight, PF_Occlude,
|
||||
HWR_RenderPolyObjectPlane(po_ptrs[i], true, polyobjsector->ceilingheight, PF_Occlude,
|
||||
polyobjsector->lightlevel, levelflats[polyobjsector->floorpic].lumpnum,
|
||||
polyobjsector, 255, NULL);
|
||||
}
|
||||
|
@ -3485,7 +3474,7 @@ static void HWR_Subsector(size_t num)
|
|||
if (sub->validcount != validcount)
|
||||
{
|
||||
HWR_GetFlat(levelflats[gr_frontsector->floorpic].lumpnum);
|
||||
HWR_RenderPlane(gr_frontsector, &extrasubsectors[num],
|
||||
HWR_RenderPlane(gr_frontsector, &extrasubsectors[num], false,
|
||||
// Hack to make things continue to work around slopes.
|
||||
locFloorHeight == cullFloorHeight ? locFloorHeight : gr_frontsector->floorheight,
|
||||
// We now return you to your regularly scheduled rendering.
|
||||
|
@ -3507,7 +3496,7 @@ static void HWR_Subsector(size_t num)
|
|||
if (sub->validcount != validcount)
|
||||
{
|
||||
HWR_GetFlat(levelflats[gr_frontsector->ceilingpic].lumpnum);
|
||||
HWR_RenderPlane(NULL, &extrasubsectors[num],
|
||||
HWR_RenderPlane(NULL, &extrasubsectors[num], true,
|
||||
// Hack to make things continue to work around slopes.
|
||||
locCeilingHeight == cullCeilingHeight ? locCeilingHeight : gr_frontsector->ceilingheight,
|
||||
// We now return you to your regularly scheduled rendering.
|
||||
|
@ -3576,6 +3565,7 @@ static void HWR_Subsector(size_t num)
|
|||
|
||||
HWR_AddTransparentFloor(0,
|
||||
&extrasubsectors[num],
|
||||
false,
|
||||
*rover->bottomheight,
|
||||
*gr_frontsector->lightlist[light].lightlevel,
|
||||
alpha, rover->master->frontsector, PF_Translucent|PF_NoTexture,
|
||||
|
@ -3593,6 +3583,7 @@ static void HWR_Subsector(size_t num)
|
|||
#else
|
||||
HWR_AddTransparentFloor(levelflats[*rover->bottompic].lumpnum,
|
||||
&extrasubsectors[num],
|
||||
false,
|
||||
*rover->bottomheight,
|
||||
*gr_frontsector->lightlist[light].lightlevel,
|
||||
rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, PF_Translucent,
|
||||
|
@ -3603,7 +3594,7 @@ static void HWR_Subsector(size_t num)
|
|||
{
|
||||
HWR_GetFlat(levelflats[*rover->bottompic].lumpnum);
|
||||
light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
|
||||
HWR_RenderPlane(NULL, &extrasubsectors[num], *rover->bottomheight, PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, levelflats[*rover->bottompic].lumpnum,
|
||||
HWR_RenderPlane(NULL, &extrasubsectors[num], false, *rover->bottomheight, PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, levelflats[*rover->bottompic].lumpnum,
|
||||
rover->master->frontsector, 255, false, gr_frontsector->lightlist[light].extra_colormap);
|
||||
}
|
||||
}
|
||||
|
@ -3637,6 +3628,7 @@ static void HWR_Subsector(size_t num)
|
|||
|
||||
HWR_AddTransparentFloor(0,
|
||||
&extrasubsectors[num],
|
||||
true,
|
||||
*rover->topheight,
|
||||
*gr_frontsector->lightlist[light].lightlevel,
|
||||
alpha, rover->master->frontsector, PF_Translucent|PF_NoTexture,
|
||||
|
@ -3654,6 +3646,7 @@ static void HWR_Subsector(size_t num)
|
|||
#else
|
||||
HWR_AddTransparentFloor(levelflats[*rover->toppic].lumpnum,
|
||||
&extrasubsectors[num],
|
||||
true,
|
||||
*rover->topheight,
|
||||
*gr_frontsector->lightlist[light].lightlevel,
|
||||
rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, PF_Translucent,
|
||||
|
@ -3665,7 +3658,7 @@ static void HWR_Subsector(size_t num)
|
|||
{
|
||||
HWR_GetFlat(levelflats[*rover->toppic].lumpnum);
|
||||
light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
|
||||
HWR_RenderPlane(NULL, &extrasubsectors[num], *rover->topheight, PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, levelflats[*rover->toppic].lumpnum,
|
||||
HWR_RenderPlane(NULL, &extrasubsectors[num], true, *rover->topheight, PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, levelflats[*rover->toppic].lumpnum,
|
||||
rover->master->frontsector, 255, false, gr_frontsector->lightlist[light].extra_colormap);
|
||||
}
|
||||
}
|
||||
|
@ -4529,6 +4522,7 @@ static void HWR_SortVisSprites(void)
|
|||
// Fix first and last. ds still points to the last one after the loop
|
||||
dsfirst->prev = &unsorted;
|
||||
unsorted.next = dsfirst;
|
||||
if (ds)
|
||||
ds->next = &unsorted;
|
||||
unsorted.prev = ds;
|
||||
|
||||
|
@ -4552,10 +4546,13 @@ static void HWR_SortVisSprites(void)
|
|||
best = ds;
|
||||
}
|
||||
}
|
||||
if (best)
|
||||
{
|
||||
best->next->prev = best->prev;
|
||||
best->prev->next = best->next;
|
||||
best->next = &gr_vsprsortedhead;
|
||||
best->prev = gr_vsprsortedhead.prev;
|
||||
}
|
||||
gr_vsprsortedhead.prev->next = best;
|
||||
gr_vsprsortedhead.prev = best;
|
||||
}
|
||||
|
@ -4588,6 +4585,7 @@ static void HWR_RenderWall(wallVert3D *wallVerts, FSurfaceInfo *pSurf, FBITFIE
|
|||
typedef struct
|
||||
{
|
||||
extrasubsector_t *xsub;
|
||||
boolean isceiling;
|
||||
fixed_t fixedheight;
|
||||
INT32 lightlevel;
|
||||
lumpnum_t lumpnum;
|
||||
|
@ -4605,6 +4603,7 @@ static planeinfo_t *planeinfo = NULL;
|
|||
typedef struct
|
||||
{
|
||||
polyobj_t *polysector;
|
||||
boolean isceiling;
|
||||
fixed_t fixedheight;
|
||||
INT32 lightlevel;
|
||||
lumpnum_t lumpnum;
|
||||
|
@ -4640,7 +4639,7 @@ static INT32 drawcount = 0;
|
|||
#define MAX_TRANSPARENTFLOOR 512
|
||||
|
||||
// This will likely turn into a copy of HWR_Add3DWater and replace it.
|
||||
void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub,
|
||||
void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub, boolean isceiling,
|
||||
fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap)
|
||||
{
|
||||
static size_t allocedplanes = 0;
|
||||
|
@ -4655,6 +4654,7 @@ void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub,
|
|||
Z_Realloc(planeinfo, allocedplanes * sizeof (*planeinfo), PU_LEVEL, &planeinfo);
|
||||
}
|
||||
|
||||
planeinfo[numplanes].isceiling = isceiling;
|
||||
planeinfo[numplanes].fixedheight = fixedheight;
|
||||
planeinfo[numplanes].lightlevel = lightlevel;
|
||||
planeinfo[numplanes].lumpnum = lumpnum;
|
||||
|
@ -4665,12 +4665,13 @@ void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub,
|
|||
planeinfo[numplanes].fogplane = fogplane;
|
||||
planeinfo[numplanes].planecolormap = planecolormap;
|
||||
planeinfo[numplanes].drawcount = drawcount++;
|
||||
|
||||
numplanes++;
|
||||
}
|
||||
|
||||
// Adding this for now until I can create extrasubsector info for polyobjects
|
||||
// When that happens it'll just be done through HWR_AddTransparentFloor and HWR_RenderPlane
|
||||
void HWR_AddTransparentPolyobjectFloor(lumpnum_t lumpnum, polyobj_t *polysector,
|
||||
void HWR_AddTransparentPolyobjectFloor(lumpnum_t lumpnum, polyobj_t *polysector, boolean isceiling,
|
||||
fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, extracolormap_t *planecolormap)
|
||||
{
|
||||
static size_t allocedpolyplanes = 0;
|
||||
|
@ -4685,6 +4686,7 @@ void HWR_AddTransparentPolyobjectFloor(lumpnum_t lumpnum, polyobj_t *polysector,
|
|||
Z_Realloc(polyplaneinfo, allocedpolyplanes * sizeof (*polyplaneinfo), PU_LEVEL, &polyplaneinfo);
|
||||
}
|
||||
|
||||
polyplaneinfo[numpolyplanes].isceiling = isceiling;
|
||||
polyplaneinfo[numpolyplanes].fixedheight = fixedheight;
|
||||
polyplaneinfo[numpolyplanes].lightlevel = lightlevel;
|
||||
polyplaneinfo[numpolyplanes].lumpnum = lumpnum;
|
||||
|
@ -4850,7 +4852,7 @@ static void HWR_CreateDrawNodes(void)
|
|||
|
||||
if (!(sortnode[sortindex[i]].plane->blend & PF_NoTexture))
|
||||
HWR_GetFlat(sortnode[sortindex[i]].plane->lumpnum);
|
||||
HWR_RenderPlane(NULL, sortnode[sortindex[i]].plane->xsub, sortnode[sortindex[i]].plane->fixedheight, sortnode[sortindex[i]].plane->blend, sortnode[sortindex[i]].plane->lightlevel,
|
||||
HWR_RenderPlane(NULL, sortnode[sortindex[i]].plane->xsub, sortnode[sortindex[i]].plane->isceiling, sortnode[sortindex[i]].plane->fixedheight, sortnode[sortindex[i]].plane->blend, sortnode[sortindex[i]].plane->lightlevel,
|
||||
sortnode[sortindex[i]].plane->lumpnum, sortnode[sortindex[i]].plane->FOFSector, sortnode[sortindex[i]].plane->alpha, sortnode[sortindex[i]].plane->fogplane, sortnode[sortindex[i]].plane->planecolormap);
|
||||
}
|
||||
else if (sortnode[sortindex[i]].polyplane)
|
||||
|
@ -4860,7 +4862,7 @@ static void HWR_CreateDrawNodes(void)
|
|||
|
||||
if (!(sortnode[sortindex[i]].polyplane->blend & PF_NoTexture))
|
||||
HWR_GetFlat(sortnode[sortindex[i]].polyplane->lumpnum);
|
||||
HWR_RenderPolyObjectPlane(sortnode[sortindex[i]].polyplane->polysector, sortnode[sortindex[i]].polyplane->fixedheight, sortnode[sortindex[i]].polyplane->blend, sortnode[sortindex[i]].polyplane->lightlevel,
|
||||
HWR_RenderPolyObjectPlane(sortnode[sortindex[i]].polyplane->polysector, sortnode[sortindex[i]].polyplane->isceiling, sortnode[sortindex[i]].polyplane->fixedheight, sortnode[sortindex[i]].polyplane->blend, sortnode[sortindex[i]].polyplane->lightlevel,
|
||||
sortnode[sortindex[i]].polyplane->lumpnum, sortnode[sortindex[i]].polyplane->FOFSector, sortnode[sortindex[i]].polyplane->alpha, sortnode[sortindex[i]].polyplane->planecolormap);
|
||||
}
|
||||
else if (sortnode[sortindex[i]].wall)
|
||||
|
@ -5092,22 +5094,29 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
|||
I_Error("sprframes NULL for sprite %d\n", thing->sprite);
|
||||
#endif
|
||||
|
||||
if (sprframe->rotate)
|
||||
{
|
||||
// choose a different rotation based on player view
|
||||
ang = R_PointToAngle(thing->x, thing->y); // uses viewx,viewy
|
||||
rot = (ang-thing->angle+ANGLE_202h)>>29;
|
||||
//Fab: lumpid is the index for spritewidth,spriteoffset... tables
|
||||
lumpoff = sprframe->lumpid[rot];
|
||||
flip = sprframe->flip & (1<<rot);
|
||||
}
|
||||
else
|
||||
if (sprframe->rotate == SRF_SINGLE)
|
||||
{
|
||||
// use single rotation for all views
|
||||
rot = 0; //Fab: for vis->patch below
|
||||
lumpoff = sprframe->lumpid[0]; //Fab: see note above
|
||||
flip = sprframe->flip; // Will only be 0x00 or 0xFF
|
||||
}
|
||||
else
|
||||
{
|
||||
// choose a different rotation based on player view
|
||||
ang = R_PointToAngle (thing->x, thing->y) - thing->angle;
|
||||
|
||||
if ((sprframe->rotate & SRF_RIGHT) && (ang < ANGLE_180)) // See from right
|
||||
rot = 6; // F7 slot
|
||||
else if ((sprframe->rotate & SRF_LEFT) && (ang >= ANGLE_180)) // See from left
|
||||
rot = 2; // F3 slot
|
||||
else // Normal behaviour
|
||||
rot = (ang+ANGLE_202h)>>29;
|
||||
|
||||
//Fab: lumpid is the index for spritewidth,spriteoffset... tables
|
||||
lumpoff = sprframe->lumpid[rot];
|
||||
flip = sprframe->flip & (1<<rot);
|
||||
}
|
||||
|
||||
if (thing->skin && ((skin_t *)thing->skin)->flags & SF_HIRES)
|
||||
this_scale = this_scale * FIXED_TO_FLOAT(((skin_t *)thing->skin)->highresscale);
|
||||
|
@ -6157,7 +6166,7 @@ static void HWR_Render3DWater(void)
|
|||
for (i = 0; i < numfloors; i++)
|
||||
{
|
||||
HWR_GetFlat(planeinfo[i].lumpnum);
|
||||
HWR_RenderPlane(NULL, planeinfo[i].xsub, planeinfo[i].fixedheight, PF_Translucent, planeinfo[i].lightlevel, planeinfo[i].lumpnum,
|
||||
HWR_RenderPlane(NULL, planeinfo[i].xsub, planeinfo[i].isceiling, planeinfo[i].fixedheight, PF_Translucent, planeinfo[i].lightlevel, planeinfo[i].lumpnum,
|
||||
planeinfo[i].FOFSector, planeinfo[i].alpha, planeinfo[i].fogplane, planeinfo[i].planecolormap);
|
||||
}
|
||||
numfloors = 0;
|
||||
|
|
|
@ -1836,10 +1836,7 @@ EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value)
|
|||
}
|
||||
}
|
||||
|
||||
// -----------------+
|
||||
// HWRAPI DrawMD2 : Draw an MD2 model with glcommands
|
||||
// -----------------+
|
||||
EXPORT void HWRAPI(DrawMD2i) (INT32 *gl_cmd_buffer, md2_frame_t *frame, UINT32 duration, UINT32 tics, md2_frame_t *nextframe, FTransform *pos, float scale, UINT8 flipped, UINT8 *color)
|
||||
static inline void DrawMD2Ex(INT32 *gl_cmd_buffer, md2_frame_t *frame, UINT32 duration, UINT32 tics, md2_frame_t *nextframe, FTransform *pos, float scale, UINT8 flipped, UINT8 *color)
|
||||
{
|
||||
INT32 val, count, pindex;
|
||||
GLfloat s, t;
|
||||
|
@ -1931,7 +1928,7 @@ EXPORT void HWRAPI(DrawMD2i) (INT32 *gl_cmd_buffer, md2_frame_t *frame, UINT32 d
|
|||
//pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency
|
||||
|
||||
// Remove depth mask when the model is transparent so it doesn't cut thorugh sprites // SRB2CBTODO: For all stuff too?!
|
||||
if (color[3] < 255)
|
||||
if (color && color[3] < 255)
|
||||
{
|
||||
pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency
|
||||
pglDepthMask(GL_FALSE);
|
||||
|
@ -2007,11 +2004,20 @@ EXPORT void HWRAPI(DrawMD2i) (INT32 *gl_cmd_buffer, md2_frame_t *frame, UINT32 d
|
|||
pglDisable(GL_CULL_FACE);
|
||||
}
|
||||
|
||||
// -----------------+
|
||||
// HWRAPI DrawMD2 : Draw an MD2 model with glcommands
|
||||
// -----------------+
|
||||
EXPORT void HWRAPI(DrawMD2i) (INT32 *gl_cmd_buffer, md2_frame_t *frame, UINT32 duration, UINT32 tics, md2_frame_t *nextframe, FTransform *pos, float scale, UINT8 flipped, UINT8 *color)
|
||||
{
|
||||
DrawMD2Ex(gl_cmd_buffer, frame, duration, tics, nextframe, pos, scale, flipped, color);
|
||||
}
|
||||
|
||||
EXPORT void HWRAPI(DrawMD2) (INT32 *gl_cmd_buffer, md2_frame_t *frame, FTransform *pos, float scale)
|
||||
{
|
||||
DrawMD2i(gl_cmd_buffer, frame, 0, 0, NULL, pos, scale, false, NULL);
|
||||
DrawMD2Ex(gl_cmd_buffer, frame, 0, 0, NULL, pos, scale, false, NULL);
|
||||
}
|
||||
|
||||
|
||||
// -----------------+
|
||||
// SetTransform :
|
||||
// -----------------+
|
||||
|
|
|
@ -87,7 +87,7 @@ void HU_Init(void);
|
|||
void HU_LoadGraphics(void);
|
||||
|
||||
// reset heads up when consoleplayer respawns.
|
||||
void HU_Start(void);
|
||||
FUNCMATH void HU_Start(void);
|
||||
|
||||
boolean HU_Responder(event_t *ev);
|
||||
|
||||
|
|
|
@ -56,7 +56,9 @@
|
|||
//#define NONET
|
||||
#endif
|
||||
|
||||
#ifndef NONET
|
||||
#ifdef NONET
|
||||
#undef HAVE_MINIUPNPC
|
||||
#else
|
||||
#ifdef USE_WINSOCK1
|
||||
#include <winsock.h>
|
||||
#elif !defined (SCOUW2) && !defined (SCOUW7) && !defined (__OS2__)
|
||||
|
|
195
src/info.c
195
src/info.c
|
@ -27,33 +27,62 @@
|
|||
// Hey, moron! If you change this table, don't forget about the sprite enum in info.h and the sprite lights in hw_light.c!
|
||||
char sprnames[NUMSPRITES + 1][5] =
|
||||
{
|
||||
"NULL","UNKN","THOK","PLAY","POSS","SPOS","FISH","BUZZ","RBUZ","JETB",
|
||||
"JETW","JETG","CCOM","DETN","SKIM","TRET","TURR","SHRP","JJAW","SNLR",
|
||||
"VLTR","PNTY","ARCH","CBFS","SPSH","ESHI","GSNP","MNUS","SSHL","UNID",
|
||||
"BBUZ","JETF","EGGM","EGGN","TNKA","TNKB","SPNK","GOOP","EGGO","PRPL",
|
||||
"FAKE","EGGP","EFIR","EGGQ","EGGR","BRAK","BGOO","BMSL","EGGT","RCKT",
|
||||
"ELEC","TARG","NPLM","MNPL","METL","MSCF","MSCB","RING","TRNG","EMMY",
|
||||
"TOKE","RFLG","BFLG","NWNG","EMBM","CEMG","EMER","FANS","BUBL","SIGN",
|
||||
"STEM","SPIK","SFLM","USPK","STPT","BMNE","MSTV","XLTV","TRRI","TBRI",
|
||||
"TVRI","TVPI","TVAT","TVFO","TVAR","TVWW","TVEL","TVSS","TVIV","TV1U",
|
||||
"TV1P","TVEG","TVMX","TVMY","TVGV","TVRC","TV1K","TVTK","MISL","TORP",
|
||||
"ENRG","MINE","JBUL","TRLS","CBLL","AROW","CFIR","FWR1","FWR2","FWR3",
|
||||
"FWR4","BUS1","BUS2","THZP","ALRM","GARG","SEWE","DRIP","CRL1","CRL2",
|
||||
"CRL3","BCRY","CHAN","FLAM","ESTA","SMCH","BMCH","SMCE","BMCE","BTBL",
|
||||
"STBL","CACT","FLME","DFLM","XMS1","XMS2","XMS3","BSZ1","BSZ2","BSZ3",
|
||||
"BSZ4","BSZ5","BSZ6","BSZ7","BSZ8","STLG","DBAL","RCRY","ARMA","ARMF",
|
||||
"ARMB","WIND","MAGN","ELEM","FORC","PITY","IVSP","SSPK","GOAL","BIRD",
|
||||
"BUNY","MOUS","CHIC","COWZ","RBRD","SPRY","SPRR","SPRB","YSPR","RSPR",
|
||||
"NULL","UNKN","THOK","PLAY",
|
||||
|
||||
"POSS","SPOS","FISH","BUZZ","RBUZ","JETB","JETW","JETG","CCOM","DETN",
|
||||
"SKIM","TRET","TURR","SHRP","JJAW","SNLR","VLTR","PNTY","ARCH","CBFS",
|
||||
"SPSH","ESHI","GSNP","MNUS","SSHL","UNID","BBUZ",
|
||||
|
||||
"JETF","EGGM","EGGN","TNKA","TNKB","SPNK","GOOP","EGGO","PRPL","FAKE",
|
||||
"EGGP","EFIR","EGGQ","EGGR","BRAK","BGOO","BMSL","EGGT","RCKT","ELEC",
|
||||
"TARG","NPLM","MNPL","METL","MSCF","MSCB",
|
||||
|
||||
"RING","TRNG","EMMY","TOKE","RFLG","BFLG","NWNG","EMBM","CEMG","EMER",
|
||||
|
||||
"FANS","BUBL","SIGN","STEM","SPIK","SFLM","USPK","STPT","BMNE",
|
||||
|
||||
"MSTV","XLTV","TRRI","TBRI","TVRI","TVPI","TVAT","TVFO","TVAR","TVWW",
|
||||
"TVEL","TVSS","TVIV","TV1U","TV1P","TVEG","TVMX","TVMY","TVGV","TVRC",
|
||||
"TV1K","TVTK",
|
||||
|
||||
"MISL","TORP","ENRG","MINE","JBUL","TRLS","CBLL","AROW","CFIR",
|
||||
|
||||
"FWR1","FWR2","FWR3","FWR4","BUS1","BUS2","THZP","ALRM","GARG","SEWE",
|
||||
"DRIP","CRL1","CRL2","CRL3","BCRY","CHAN","FLAM","ESTA","SMCH","BMCH",
|
||||
"SMCE","BMCE","BTBL","STBL","CACT","FLME","DFLM","XMS1","XMS2","XMS3",
|
||||
"BSZ1","BSZ2","BSZ3","BSZ4","BSZ5","BSZ6","BSZ7","BSZ8","STLG","DBAL",
|
||||
"RCRY",
|
||||
|
||||
"ARMA","ARMF","ARMB","WIND","MAGN","ELEM","FORC","PITY","IVSP","SSPK",
|
||||
"GOAL",
|
||||
|
||||
"BIRD","BUNY","MOUS","CHIC","COWZ","RBRD",
|
||||
|
||||
"SPRY","SPRR","SPRB","YSPR","RSPR","SSWY","SSWR","SSWB",
|
||||
|
||||
"RAIN","SNO1","SPLH","SPLA","SMOK","BUBP","BUBO","BUBN","BUBM","POPP",
|
||||
"TFOG","SEED","PRTL","SCOR","DRWN","TTAG","GFLG","RRNG","RNGB","RNGR",
|
||||
"RNGI","RNGA","RNGE","RNGS","RNGG","PIKB","PIKR","PIKA","PIKE","PIKS",
|
||||
"PIKG","TAUT","TGRE","TSCR","COIN","CPRK","GOOM","BGOM","FFWR","FBLL",
|
||||
"SHLL","PUMA","HAMM","KOOP","BFLM","MAXE","MUS1","MUS2","TOAD","NDRN",
|
||||
"TFOG","SEED","PRTL",
|
||||
|
||||
"SCOR","DRWN","TTAG","GFLG",
|
||||
|
||||
"RRNG","RNGB","RNGR","RNGI","RNGA","RNGE","RNGS","RNGG","PIKB","PIKR",
|
||||
"PIKA","PIKE","PIKS","PIKG","TAUT","TGRE","TSCR",
|
||||
|
||||
"COIN","CPRK","GOOM","BGOM","FFWR","FBLL","SHLL","PUMA","HAMM","KOOP",
|
||||
"BFLM","MAXE","MUS1","MUS2","TOAD","NDRN",
|
||||
|
||||
"SUPE","SUPZ","NDRL","NSPK","NBMP","HOOP","NSCR","NPRU","CAPS","SUPT",
|
||||
"SPRK","BOM1","BOM2","BOM3","BOM4","ROIA","ROIB","ROIC","ROID","ROIE",
|
||||
"ROIF","ROIG","ROIH","ROII","ROIJ","ROIK","ROIL","ROIM","ROIN","ROIO",
|
||||
"ROIP","BBAL","GWLG","GWLR","SRBA","SRBB","SRBC","SRBD","SRBE","SRBF",
|
||||
"SRBG","SRBH","SRBI","SRBJ","SRBK","SRBL","SRBM","SRBN","SRBO",
|
||||
"SPRK",
|
||||
|
||||
"BOM1","BOM2","BOM3","BOM4",
|
||||
|
||||
"ROIA","ROIB","ROIC","ROID","ROIE","ROIF","ROIG","ROIH","ROII","ROIJ",
|
||||
"ROIK","ROIL","ROIM","ROIN","ROIO","ROIP",
|
||||
|
||||
"BBAL","GWLG","GWLR",
|
||||
|
||||
"SRBA","SRBB","SRBC","SRBD","SRBE","SRBF","SRBG","SRBH","SRBI","SRBJ",
|
||||
"SRBK","SRBL","SRBM","SRBN","SRBO",
|
||||
};
|
||||
|
||||
char spr2names[NUMPLAYERSPRITES][5] =
|
||||
|
@ -62,6 +91,7 @@ char spr2names[NUMPLAYERSPRITES][5] =
|
|||
"WAIT",
|
||||
"WALK",
|
||||
"RUN_",
|
||||
"PEEL",
|
||||
"PAIN",
|
||||
"DEAD",
|
||||
"DRWN",
|
||||
|
@ -88,6 +118,7 @@ char spr2names[NUMPLAYERSPRITES][5] =
|
|||
"SSTD",
|
||||
"SWLK",
|
||||
"SRUN",
|
||||
"SPEE",
|
||||
"SPAN",
|
||||
"SMSL",
|
||||
"SDTH",
|
||||
|
@ -101,6 +132,7 @@ char spr2names[NUMPLAYERSPRITES][5] =
|
|||
"SRID",
|
||||
"SFLT"
|
||||
};
|
||||
enum playersprite free_spr2 = SPR2_FIRSTFREESLOT;
|
||||
|
||||
// Doesn't work with g++, needs actionf_p1 (don't modify this comment)
|
||||
state_t states[NUMSTATES] =
|
||||
|
@ -132,6 +164,7 @@ state_t states[NUMSTATES] =
|
|||
{SPR_PLAY, SPR2_WAIT, 16, {NULL}, 0, 0, S_PLAY_WAIT}, // S_PLAY_WAIT
|
||||
{SPR_PLAY, SPR2_WALK, 4, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_WALK
|
||||
{SPR_PLAY, SPR2_RUN , 2, {NULL}, 0, 0, S_PLAY_RUN}, // S_PLAY_RUN
|
||||
{SPR_PLAY, SPR2_PEEL, 2, {NULL}, 0, 0, S_PLAY_PEEL}, // S_PLAY_PEEL
|
||||
{SPR_PLAY, SPR2_PAIN, 350, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_PAIN
|
||||
{SPR_PLAY, SPR2_DEAD, 4, {NULL}, 0, 0, S_PLAY_DEAD}, // S_PLAY_DEAD
|
||||
{SPR_PLAY, SPR2_DRWN, 4, {NULL}, 0, 0, S_PLAY_DRWN}, // S_PLAY_DRWN
|
||||
|
@ -157,6 +190,7 @@ state_t states[NUMSTATES] =
|
|||
{SPR_PLAY, SPR2_SSTD, 7, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_STND
|
||||
{SPR_PLAY, SPR2_SWLK, 7, {NULL}, 0, 0, S_PLAY_SUPER_WALK}, // S_PLAY_SUPER_WALK
|
||||
{SPR_PLAY, SPR2_SRUN, 7, {NULL}, 0, 0, S_PLAY_SUPER_RUN}, // S_PLAY_SUPER_RUN
|
||||
{SPR_PLAY, SPR2_SPEE, 7, {NULL}, 0, 0, S_PLAY_SUPER_PEEL}, // S_PLAY_SUPER_PEEL
|
||||
{SPR_PLAY, SPR2_SPAN, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_PAIN
|
||||
{SPR_PLAY, SPR2_SMSL, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_STUN
|
||||
{SPR_PLAY, SPR2_SDTH, 4, {NULL}, 0, 0, S_PLAY_SUPER_DEAD}, // S_PLAY_SUPER_DEAD
|
||||
|
@ -1841,6 +1875,36 @@ state_t states[NUMSTATES] =
|
|||
{SPR_RSPR, 2, 1, {NULL}, 0, 0, S_RDIAG8}, // S_RDIAG7
|
||||
{SPR_RSPR, 1, 1, {NULL}, 0, 0, S_RDIAG1}, // S_RDIAG8
|
||||
|
||||
// Yellow Side Spring
|
||||
{SPR_SSWY, 0, -1, {NULL}, 0, 0, S_NULL}, // S_YHORIZ1
|
||||
{SPR_SSWY, 1, 1, {A_Pain}, 0, 0, S_YHORIZ3}, // S_YHORIZ2
|
||||
{SPR_SSWY, 2, 1, {NULL}, 0, 0, S_YHORIZ4}, // S_YHORIZ3
|
||||
{SPR_SSWY, 3, 1, {NULL}, 0, 0, S_YHORIZ5}, // S_YHORIZ4
|
||||
{SPR_SSWY, 4, 1, {NULL}, 0, 0, S_YHORIZ6}, // S_YHORIZ5
|
||||
{SPR_SSWY, 3, 1, {NULL}, 0, 0, S_YHORIZ7}, // S_YHORIZ6
|
||||
{SPR_SSWY, 2, 1, {NULL}, 0, 0, S_YHORIZ8}, // S_YHORIZ7
|
||||
{SPR_SSWY, 1, 1, {NULL}, 0, 0, S_YHORIZ1}, // S_YHORIZ8
|
||||
|
||||
// Red Side Spring
|
||||
{SPR_SSWR, 0, -1, {NULL}, 0, 0, S_NULL}, // S_RHORIZ1
|
||||
{SPR_SSWR, 1, 1, {A_Pain}, 0, 0, S_RHORIZ3}, // S_RHORIZ2
|
||||
{SPR_SSWR, 2, 1, {NULL}, 0, 0, S_RHORIZ4}, // S_RHORIZ3
|
||||
{SPR_SSWR, 3, 1, {NULL}, 0, 0, S_RHORIZ5}, // S_RHORIZ4
|
||||
{SPR_SSWR, 4, 1, {NULL}, 0, 0, S_RHORIZ6}, // S_RHORIZ5
|
||||
{SPR_SSWR, 3, 1, {NULL}, 0, 0, S_RHORIZ7}, // S_RHORIZ6
|
||||
{SPR_SSWR, 2, 1, {NULL}, 0, 0, S_RHORIZ8}, // S_RHORIZ7
|
||||
{SPR_SSWR, 1, 1, {NULL}, 0, 0, S_RHORIZ1}, // S_RHORIZ8
|
||||
|
||||
// Blue Side Spring
|
||||
{SPR_SSWB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BHORIZ1
|
||||
{SPR_SSWB, 1, 1, {A_Pain}, 0, 0, S_BHORIZ3}, // S_BHORIZ2
|
||||
{SPR_SSWB, 2, 1, {NULL}, 0, 0, S_BHORIZ4}, // S_BHORIZ3
|
||||
{SPR_SSWB, 3, 1, {NULL}, 0, 0, S_BHORIZ5}, // S_BHORIZ4
|
||||
{SPR_SSWB, 4, 1, {NULL}, 0, 0, S_BHORIZ6}, // S_BHORIZ5
|
||||
{SPR_SSWB, 3, 1, {NULL}, 0, 0, S_BHORIZ7}, // S_BHORIZ6
|
||||
{SPR_SSWB, 2, 1, {NULL}, 0, 0, S_BHORIZ8}, // S_BHORIZ7
|
||||
{SPR_SSWB, 1, 1, {NULL}, 0, 0, S_BHORIZ1}, // S_BHORIZ8
|
||||
|
||||
// Rain
|
||||
{SPR_RAIN, FF_TRANS50, -1, {NULL}, 0, 0, S_NULL}, // S_RAIN1
|
||||
{SPR_RAIN, FF_TRANS50, 1, {NULL}, 0, 0, S_RAIN1}, // S_RAINRETURN
|
||||
|
@ -5272,6 +5336,87 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_RDIAG2 // raisestate
|
||||
},
|
||||
|
||||
{ // MT_YELLOWHORIZ
|
||||
558, // doomednum
|
||||
S_YHORIZ1, // spawnstate
|
||||
1, // spawnhealth
|
||||
S_YHORIZ2, // seestate
|
||||
sfx_None, // seesound
|
||||
8, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_spring, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
0, // speed
|
||||
16*FRACUNIT, // radius
|
||||
32*FRACUNIT, // height
|
||||
0, // display offset
|
||||
0, // mass
|
||||
16*FRACUNIT, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SPRING|MF_NOGRAVITY, // flags
|
||||
S_YHORIZ2 // raisestate
|
||||
},
|
||||
|
||||
{ // MT_REDHORIZ
|
||||
559, // doomednum
|
||||
S_RHORIZ1, // spawnstate
|
||||
1, // spawnhealth
|
||||
S_RHORIZ2, // seestate
|
||||
sfx_None, // seesound
|
||||
8, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_spring, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
0, // speed
|
||||
16*FRACUNIT, // radius
|
||||
32*FRACUNIT, // height
|
||||
0, // display offset
|
||||
0, // mass
|
||||
64*FRACUNIT, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SPRING|MF_NOGRAVITY, // flags
|
||||
S_RHORIZ2 // raisestate
|
||||
},
|
||||
|
||||
{ // MT_BLUEHORIZ
|
||||
560, // doomednum
|
||||
S_BHORIZ1, // spawnstate
|
||||
1, // spawnhealth
|
||||
S_BHORIZ2, // seestate
|
||||
sfx_None, // seesound
|
||||
8, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_spring, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
0, // speed
|
||||
16*FRACUNIT, // radius
|
||||
32*FRACUNIT, // height
|
||||
0, // display offset
|
||||
0, // mass
|
||||
4*FRACUNIT, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SPRING|MF_NOGRAVITY, // flags
|
||||
S_BHORIZ2 // raisestate
|
||||
},
|
||||
|
||||
{ // MT_BUBBLES
|
||||
500, // doomednum
|
||||
S_BUBBLES1, // spawnstate
|
||||
|
|
45
src/info.h
45
src/info.h
|
@ -454,6 +454,9 @@ typedef enum sprite
|
|||
SPR_SPRB, // Blue springs
|
||||
SPR_YSPR, // Yellow Diagonal Spring
|
||||
SPR_RSPR, // Red Diagonal Spring
|
||||
SPR_SSWY, // Yellow Side Spring
|
||||
SPR_SSWR, // Red Side Spring
|
||||
SPR_SSWB, // Blue Side Spring
|
||||
|
||||
// Environmental Effects
|
||||
SPR_RAIN, // Rain
|
||||
|
@ -587,6 +590,7 @@ enum playersprite
|
|||
SPR2_WAIT,
|
||||
SPR2_WALK,
|
||||
SPR2_RUN ,
|
||||
SPR2_PEEL,
|
||||
SPR2_PAIN,
|
||||
SPR2_DEAD,
|
||||
SPR2_DRWN,
|
||||
|
@ -613,6 +617,7 @@ enum playersprite
|
|||
SPR2_SSTD,
|
||||
SPR2_SWLK,
|
||||
SPR2_SRUN,
|
||||
SPR2_SPEE,
|
||||
SPR2_SPAN,
|
||||
SPR2_SMSL,
|
||||
SPR2_SDTH,
|
||||
|
@ -626,6 +631,8 @@ enum playersprite
|
|||
SPR2_SRID,
|
||||
SPR2_SFLT,
|
||||
|
||||
SPR2_FIRSTFREESLOT,
|
||||
SPR2_LASTFREESLOT = SPR2_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1,
|
||||
NUMPLAYERSPRITES
|
||||
};
|
||||
|
||||
|
@ -651,6 +658,7 @@ typedef enum state
|
|||
S_PLAY_WAIT,
|
||||
S_PLAY_WALK,
|
||||
S_PLAY_RUN,
|
||||
S_PLAY_PEEL,
|
||||
S_PLAY_PAIN,
|
||||
S_PLAY_DEAD,
|
||||
S_PLAY_DRWN,
|
||||
|
@ -676,6 +684,7 @@ typedef enum state
|
|||
S_PLAY_SUPER_STND,
|
||||
S_PLAY_SUPER_WALK,
|
||||
S_PLAY_SUPER_RUN,
|
||||
S_PLAY_SUPER_PEEL,
|
||||
S_PLAY_SUPER_PAIN,
|
||||
S_PLAY_SUPER_STUN,
|
||||
S_PLAY_SUPER_DEAD,
|
||||
|
@ -2347,6 +2356,36 @@ typedef enum state
|
|||
S_RDIAG7,
|
||||
S_RDIAG8,
|
||||
|
||||
// Yellow Side Spring
|
||||
S_YHORIZ1,
|
||||
S_YHORIZ2,
|
||||
S_YHORIZ3,
|
||||
S_YHORIZ4,
|
||||
S_YHORIZ5,
|
||||
S_YHORIZ6,
|
||||
S_YHORIZ7,
|
||||
S_YHORIZ8,
|
||||
|
||||
// Red Side Spring
|
||||
S_RHORIZ1,
|
||||
S_RHORIZ2,
|
||||
S_RHORIZ3,
|
||||
S_RHORIZ4,
|
||||
S_RHORIZ5,
|
||||
S_RHORIZ6,
|
||||
S_RHORIZ7,
|
||||
S_RHORIZ8,
|
||||
|
||||
// Blue Side Spring
|
||||
S_BHORIZ1,
|
||||
S_BHORIZ2,
|
||||
S_BHORIZ3,
|
||||
S_BHORIZ4,
|
||||
S_BHORIZ5,
|
||||
S_BHORIZ6,
|
||||
S_BHORIZ7,
|
||||
S_BHORIZ8,
|
||||
|
||||
// Rain
|
||||
S_RAIN1,
|
||||
S_RAINRETURN,
|
||||
|
@ -2992,8 +3031,9 @@ typedef struct
|
|||
|
||||
extern state_t states[NUMSTATES];
|
||||
extern char sprnames[NUMSPRITES + 1][5];
|
||||
char spr2names[NUMPLAYERSPRITES][5];
|
||||
extern char spr2names[NUMPLAYERSPRITES][5];
|
||||
extern state_t *astate;
|
||||
extern enum playersprite free_spr2;
|
||||
|
||||
typedef enum mobj_type
|
||||
{
|
||||
|
@ -3122,6 +3162,9 @@ typedef enum mobj_type
|
|||
MT_REDSPRING,
|
||||
MT_YELLOWDIAG, // Yellow Diagonal Spring
|
||||
MT_REDDIAG, // Red Diagonal Spring
|
||||
MT_YELLOWHORIZ, // Yellow Side Spring
|
||||
MT_REDHORIZ, // Red Side Spring
|
||||
MT_BLUEHORIZ, // Blue Side Spring
|
||||
|
||||
// Interactive Objects
|
||||
MT_BUBBLES, // Bubble source
|
||||
|
|
|
@ -429,6 +429,16 @@ static int lib_pMobjFlip(lua_State *L)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int lib_pGetMobjGravity(lua_State *L)
|
||||
{
|
||||
mobj_t *mobj = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
|
||||
//HUDSAFE
|
||||
if (!mobj)
|
||||
return LUA_ErrInvalid(L, "mobj_t");
|
||||
lua_pushfixed(L, P_GetMobjGravity(mobj));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lib_pWeaponOrPanel(lua_State *L)
|
||||
{
|
||||
mobjtype_t type = luaL_checkinteger(L, 1);
|
||||
|
@ -2003,6 +2013,7 @@ static luaL_Reg lib[] = {
|
|||
{"P_SPMAngle",lib_pSPMAngle},
|
||||
{"P_SpawnPlayerMissile",lib_pSpawnPlayerMissile},
|
||||
{"P_MobjFlip",lib_pMobjFlip},
|
||||
{"P_GetMobjGravity",lib_pGetMobjGravity},
|
||||
{"P_WeaponOrPanel",lib_pWeaponOrPanel},
|
||||
{"P_FlashPal",lib_pFlashPal},
|
||||
{"P_GetClosestAxis",lib_pGetClosestAxis},
|
||||
|
|
|
@ -18,6 +18,9 @@ enum hud {
|
|||
hud_time,
|
||||
hud_rings,
|
||||
hud_lives,
|
||||
// Match / CTF / Tag / Ringslinger
|
||||
hud_weaponrings,
|
||||
hud_powerstones,
|
||||
// NiGHTS mode
|
||||
hud_nightslink,
|
||||
hud_nightsdrill,
|
||||
|
|
|
@ -44,6 +44,9 @@ static const char *const hud_disable_options[] = {
|
|||
"rings",
|
||||
"lives",
|
||||
|
||||
"weaponrings",
|
||||
"powerstones",
|
||||
|
||||
"nightslink",
|
||||
"nightsdrill",
|
||||
"nightsrings",
|
||||
|
|
|
@ -105,7 +105,7 @@ static int lib_getSpr2name(lua_State *L)
|
|||
if (lua_isnumber(L, 1))
|
||||
{
|
||||
i = lua_tonumber(L, 1);
|
||||
if (i > NUMPLAYERSPRITES)
|
||||
if (i >= free_spr2)
|
||||
return 0;
|
||||
lua_pushlstring(L, spr2names[i], 4);
|
||||
return 1;
|
||||
|
@ -113,7 +113,7 @@ static int lib_getSpr2name(lua_State *L)
|
|||
else if (lua_isstring(L, 1))
|
||||
{
|
||||
const char *name = lua_tostring(L, 1);
|
||||
for (i = 0; i < NUMPLAYERSPRITES; i++)
|
||||
for (i = 0; i < free_spr2; i++)
|
||||
if (fastcmp(name, spr2names[i]))
|
||||
{
|
||||
lua_pushinteger(L, i);
|
||||
|
@ -125,7 +125,7 @@ static int lib_getSpr2name(lua_State *L)
|
|||
|
||||
static int lib_spr2namelen(lua_State *L)
|
||||
{
|
||||
lua_pushinteger(L, NUMPLAYERSPRITES);
|
||||
lua_pushinteger(L, free_spr2);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -202,6 +202,8 @@ static int player_get(lua_State *L)
|
|||
lua_pushinteger(L, plr->exiting);
|
||||
else if (fastcmp(field,"homing"))
|
||||
lua_pushinteger(L, plr->homing);
|
||||
else if (fastcmp(field,"dashmode"))
|
||||
lua_pushinteger(L, plr->dashmode);
|
||||
else if (fastcmp(field,"skidtime"))
|
||||
lua_pushinteger(L, plr->skidtime);
|
||||
else if (fastcmp(field,"cmomx"))
|
||||
|
@ -459,6 +461,8 @@ static int player_set(lua_State *L)
|
|||
plr->exiting = (tic_t)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"homing"))
|
||||
plr->homing = (UINT8)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"dashmode"))
|
||||
plr->dashmode = (tic_t)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"skidtime"))
|
||||
plr->skidtime = (tic_t)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"cmomx"))
|
||||
|
|
|
@ -59,7 +59,11 @@
|
|||
* Unconditionally aligning does not cost very much, so do it if unsure
|
||||
*/
|
||||
#ifndef STRICT_ALIGN
|
||||
# define STRICT_ALIGN !(defined(__i386) || defined (__amd64)) || defined (__clang__)
|
||||
#if !(defined(__i386) || defined (__amd64)) || defined (__clang__)
|
||||
#define STRICT_ALIGN 1
|
||||
#else
|
||||
#define STRICT_ALIGN 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
167
src/m_aatree.c
Normal file
167
src/m_aatree.c
Normal file
|
@ -0,0 +1,167 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2016 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
// See the 'LICENSE' file for more details.
|
||||
//-----------------------------------------------------------------------------
|
||||
/// \file m_aatree.h
|
||||
/// \brief AA trees code
|
||||
|
||||
#include "m_aatree.h"
|
||||
#include "z_zone.h"
|
||||
|
||||
// A partial implementation of AA trees,
|
||||
// according to the algorithms given on Wikipedia.
|
||||
// http://en.wikipedia.org/wiki/AA_tree
|
||||
|
||||
typedef struct aatree_node_s
|
||||
{
|
||||
INT32 level;
|
||||
INT32 key;
|
||||
void* value;
|
||||
|
||||
struct aatree_node_s *left, *right;
|
||||
} aatree_node_t;
|
||||
|
||||
struct aatree_s
|
||||
{
|
||||
aatree_node_t *root;
|
||||
UINT32 flags;
|
||||
};
|
||||
|
||||
aatree_t *M_AATreeAlloc(UINT32 flags)
|
||||
{
|
||||
aatree_t *aatree = Z_Malloc(sizeof (aatree_t), PU_STATIC, NULL);
|
||||
aatree->root = NULL;
|
||||
aatree->flags = flags;
|
||||
return aatree;
|
||||
}
|
||||
|
||||
static void M_AATreeFree_Node(aatree_node_t *node)
|
||||
{
|
||||
if (node->left) M_AATreeFree_Node(node->left);
|
||||
if (node->right) M_AATreeFree_Node(node->right);
|
||||
Z_Free(node);
|
||||
}
|
||||
|
||||
void M_AATreeFree(aatree_t *aatree)
|
||||
{
|
||||
if (aatree->root)
|
||||
M_AATreeFree_Node(aatree->root);
|
||||
|
||||
Z_Free(aatree);
|
||||
}
|
||||
|
||||
static aatree_node_t *M_AATreeSkew(aatree_node_t *node)
|
||||
{
|
||||
if (node && node->left && node->left->level == node->level)
|
||||
{
|
||||
// Not allowed: horizontal left-link. Reverse the
|
||||
// horizontal link and hook the orphan back in.
|
||||
aatree_node_t *oldleft = node->left;
|
||||
node->left = oldleft->right;
|
||||
oldleft->right = node;
|
||||
|
||||
return oldleft;
|
||||
}
|
||||
|
||||
// No change needed.
|
||||
return node;
|
||||
}
|
||||
|
||||
static aatree_node_t *M_AATreeSplit(aatree_node_t *node)
|
||||
{
|
||||
if (node && node->right && node->right->right && node->level == node->right->right->level)
|
||||
{
|
||||
// Not allowed: two consecutive horizontal right-links.
|
||||
// The middle one becomes the new root at this point,
|
||||
// with suitable adjustments below.
|
||||
|
||||
aatree_node_t *oldright = node->right;
|
||||
node->right = oldright->left;
|
||||
oldright->left = node;
|
||||
oldright->level++;
|
||||
|
||||
return oldright;
|
||||
}
|
||||
|
||||
// No change needed.
|
||||
return node;
|
||||
}
|
||||
|
||||
static aatree_node_t *M_AATreeSet_Node(aatree_node_t *node, UINT32 flags, INT32 key, void* value)
|
||||
{
|
||||
if (!node)
|
||||
{
|
||||
// Nothing here, so just add where we are
|
||||
|
||||
node = Z_Malloc(sizeof (aatree_node_t), PU_STATIC, NULL);
|
||||
node->level = 1;
|
||||
node->key = key;
|
||||
if (value && (flags & AATREE_ZUSER)) Z_SetUser(value, &node->value);
|
||||
else node->value = value;
|
||||
node->left = node->right = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (key < node->key)
|
||||
node->left = M_AATreeSet_Node(node->left, flags, key, value);
|
||||
else if (key > node->key)
|
||||
node->right = M_AATreeSet_Node(node->right, flags, key, value);
|
||||
else
|
||||
{
|
||||
if (value && (flags & AATREE_ZUSER)) Z_SetUser(value, &node->value);
|
||||
else node->value = value;
|
||||
}
|
||||
|
||||
node = M_AATreeSkew(node);
|
||||
node = M_AATreeSplit(node);
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
void M_AATreeSet(aatree_t *aatree, INT32 key, void* value)
|
||||
{
|
||||
aatree->root = M_AATreeSet_Node(aatree->root, aatree->flags, key, value);
|
||||
}
|
||||
|
||||
// Caveat: we don't distinguish between nodes that don't exists
|
||||
// and nodes with value == NULL.
|
||||
static void *M_AATreeGet_Node(aatree_node_t *node, INT32 key)
|
||||
{
|
||||
if (node)
|
||||
{
|
||||
if (node->key == key)
|
||||
return node->value;
|
||||
else if(node->key < key)
|
||||
return M_AATreeGet_Node(node->right, key);
|
||||
else
|
||||
return M_AATreeGet_Node(node->left, key);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *M_AATreeGet(aatree_t *aatree, INT32 key)
|
||||
{
|
||||
return M_AATreeGet_Node(aatree->root, key);
|
||||
}
|
||||
|
||||
|
||||
static void M_AATreeIterate_Node(aatree_node_t *node, aatree_iter_t callback)
|
||||
{
|
||||
if (node->left) M_AATreeIterate_Node(node->left, callback);
|
||||
callback(node->key, node->value);
|
||||
if (node->right) M_AATreeIterate_Node(node->right, callback);
|
||||
}
|
||||
|
||||
void M_AATreeIterate(aatree_t *aatree, aatree_iter_t callback)
|
||||
{
|
||||
if (aatree->root)
|
||||
M_AATreeIterate_Node(aatree->root, callback);
|
||||
}
|
31
src/m_aatree.h
Normal file
31
src/m_aatree.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2016 by Sonic Team Junior.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
// See the 'LICENSE' file for more details.
|
||||
//-----------------------------------------------------------------------------
|
||||
/// \file m_aatree.h
|
||||
/// \brief AA trees code
|
||||
|
||||
#ifndef __M_AATREE__
|
||||
#define __M_AATREE__
|
||||
|
||||
#include "doomtype.h"
|
||||
|
||||
// Flags for AA trees.
|
||||
#define AATREE_ZUSER 1 // Treat values as z_zone-allocated blocks and set their user fields
|
||||
|
||||
typedef struct aatree_s aatree_t;
|
||||
typedef void (*aatree_iter_t)(INT32 key, void *value);
|
||||
|
||||
aatree_t *M_AATreeAlloc(UINT32 flags);
|
||||
void M_AATreeFree(aatree_t *aatree);
|
||||
void M_AATreeSet(aatree_t *aatree, INT32 key, void* value);
|
||||
void *M_AATreeGet(aatree_t *aatree, INT32 key);
|
||||
void M_AATreeIterate(aatree_t *aatree, aatree_iter_t callback);
|
||||
|
||||
#endif
|
13
src/m_menu.c
13
src/m_menu.c
|
@ -705,7 +705,7 @@ static menuitem_t SP_TimeAttackMenu[] =
|
|||
{IT_DISABLED, NULL, "Guest Option...", &SP_GuestReplayDef, 100},
|
||||
{IT_DISABLED, NULL, "Replay...", &SP_ReplayDef, 110},
|
||||
{IT_DISABLED, NULL, "Ghosts...", &SP_GhostDef, 120},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Start", M_ChooseTimeAttack, 130},
|
||||
{IT_WHITESTRING|IT_CALL|IT_CALL_NOTMODIFIED, NULL, "Start", M_ChooseTimeAttack, 130},
|
||||
};
|
||||
|
||||
enum
|
||||
|
@ -797,7 +797,7 @@ static menuitem_t SP_NightsAttackMenu[] =
|
|||
{IT_DISABLED, NULL, "Guest Option...", &SP_NightsGuestReplayDef, 108},
|
||||
{IT_DISABLED, NULL, "Replay...", &SP_NightsReplayDef, 118},
|
||||
{IT_DISABLED, NULL, "Ghosts...", &SP_NightsGhostDef, 128},
|
||||
{IT_WHITESTRING|IT_CALL, NULL, "Start", M_ChooseNightsAttack, 138},
|
||||
{IT_WHITESTRING|IT_CALL|IT_CALL_NOTMODIFIED, NULL, "Start", M_ChooseNightsAttack, 138},
|
||||
};
|
||||
|
||||
enum
|
||||
|
@ -3702,6 +3702,11 @@ static void M_DrawMessageMenu(void)
|
|||
|
||||
mlines = currentMenu->lastOn>>8;
|
||||
max = (INT16)((UINT8)(currentMenu->lastOn & 0xFF)*8);
|
||||
|
||||
// hack: draw RA background in RA menus
|
||||
if (gamestate == GS_TIMEATTACK)
|
||||
V_DrawPatchFill(W_CachePatchName("SRB2BACK", PU_CACHE));
|
||||
|
||||
M_DrawTextBox(currentMenu->x, y - 8, (max+7)>>3, mlines);
|
||||
|
||||
while (*(msg+start))
|
||||
|
@ -4310,9 +4315,9 @@ static void M_SinglePlayerMenu(INT32 choice)
|
|||
{
|
||||
(void)choice;
|
||||
SP_MainMenu[sprecordattack].status =
|
||||
(M_SecretUnlocked(SECRET_RECORDATTACK)) ? IT_CALL|IT_STRING|IT_CALL_NOTMODIFIED : IT_SECRET;
|
||||
(M_SecretUnlocked(SECRET_RECORDATTACK)) ? IT_CALL|IT_STRING : IT_SECRET;
|
||||
SP_MainMenu[spnightsmode].status =
|
||||
(M_SecretUnlocked(SECRET_NIGHTSMODE)) ? IT_CALL|IT_STRING|IT_CALL_NOTMODIFIED : IT_SECRET;
|
||||
(M_SecretUnlocked(SECRET_NIGHTSMODE)) ? IT_CALL|IT_STRING : IT_SECRET;
|
||||
|
||||
M_SetupNextMenu(&SP_MainDef);
|
||||
}
|
||||
|
|
155
src/m_misc.c
155
src/m_misc.c
|
@ -2323,158 +2323,3 @@ void M_SetupMemcpy(void)
|
|||
M_Memcpy = cpu_cpy;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
// A partial implementation of AA trees,
|
||||
// according to the algorithms given on Wikipedia.
|
||||
// http://en.wikipedia.org/wiki/AA_tree
|
||||
|
||||
|
||||
|
||||
typedef struct aatree_node_s
|
||||
{
|
||||
INT32 level;
|
||||
INT32 key;
|
||||
void* value;
|
||||
|
||||
struct aatree_node_s *left, *right;
|
||||
} aatree_node_t;
|
||||
|
||||
struct aatree_s
|
||||
{
|
||||
aatree_node_t *root;
|
||||
UINT32 flags;
|
||||
};
|
||||
|
||||
aatree_t *M_AATreeAlloc(UINT32 flags)
|
||||
{
|
||||
aatree_t *aatree = Z_Malloc(sizeof (aatree_t), PU_STATIC, NULL);
|
||||
aatree->root = NULL;
|
||||
aatree->flags = flags;
|
||||
return aatree;
|
||||
}
|
||||
|
||||
static void M_AATreeFree_Node(aatree_node_t *node)
|
||||
{
|
||||
if (node->left) M_AATreeFree_Node(node->left);
|
||||
if (node->right) M_AATreeFree_Node(node->right);
|
||||
Z_Free(node);
|
||||
}
|
||||
|
||||
void M_AATreeFree(aatree_t *aatree)
|
||||
{
|
||||
if (aatree->root)
|
||||
M_AATreeFree_Node(aatree->root);
|
||||
|
||||
Z_Free(aatree);
|
||||
}
|
||||
|
||||
static aatree_node_t *M_AATreeSkew(aatree_node_t *node)
|
||||
{
|
||||
if (node && node->left && node->left->level == node->level)
|
||||
{
|
||||
// Not allowed: horizontal left-link. Reverse the
|
||||
// horizontal link and hook the orphan back in.
|
||||
aatree_node_t *oldleft = node->left;
|
||||
node->left = oldleft->right;
|
||||
oldleft->right = node;
|
||||
|
||||
return oldleft;
|
||||
}
|
||||
|
||||
// No change needed.
|
||||
return node;
|
||||
}
|
||||
|
||||
static aatree_node_t *M_AATreeSplit(aatree_node_t *node)
|
||||
{
|
||||
if (node && node->right && node->right->right && node->level == node->right->right->level)
|
||||
{
|
||||
// Not allowed: two consecutive horizontal right-links.
|
||||
// The middle one becomes the new root at this point,
|
||||
// with suitable adjustments below.
|
||||
|
||||
aatree_node_t *oldright = node->right;
|
||||
node->right = oldright->left;
|
||||
oldright->left = node;
|
||||
oldright->level++;
|
||||
|
||||
return oldright;
|
||||
}
|
||||
|
||||
// No change needed.
|
||||
return node;
|
||||
}
|
||||
|
||||
static aatree_node_t *M_AATreeSet_Node(aatree_node_t *node, UINT32 flags, INT32 key, void* value)
|
||||
{
|
||||
if (!node)
|
||||
{
|
||||
// Nothing here, so just add where we are
|
||||
|
||||
node = Z_Malloc(sizeof (aatree_node_t), PU_STATIC, NULL);
|
||||
node->level = 1;
|
||||
node->key = key;
|
||||
if (value && (flags & AATREE_ZUSER)) Z_SetUser(value, &node->value);
|
||||
else node->value = value;
|
||||
node->left = node->right = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (key < node->key)
|
||||
node->left = M_AATreeSet_Node(node->left, flags, key, value);
|
||||
else if (key > node->key)
|
||||
node->right = M_AATreeSet_Node(node->right, flags, key, value);
|
||||
else
|
||||
{
|
||||
if (value && (flags & AATREE_ZUSER)) Z_SetUser(value, &node->value);
|
||||
else node->value = value;
|
||||
}
|
||||
|
||||
node = M_AATreeSkew(node);
|
||||
node = M_AATreeSplit(node);
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
void M_AATreeSet(aatree_t *aatree, INT32 key, void* value)
|
||||
{
|
||||
aatree->root = M_AATreeSet_Node(aatree->root, aatree->flags, key, value);
|
||||
}
|
||||
|
||||
// Caveat: we don't distinguish between nodes that don't exists
|
||||
// and nodes with value == NULL.
|
||||
static void *M_AATreeGet_Node(aatree_node_t *node, INT32 key)
|
||||
{
|
||||
if (node)
|
||||
{
|
||||
if (node->key == key)
|
||||
return node->value;
|
||||
else if(node->key < key)
|
||||
return M_AATreeGet_Node(node->right, key);
|
||||
else
|
||||
return M_AATreeGet_Node(node->left, key);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *M_AATreeGet(aatree_t *aatree, INT32 key)
|
||||
{
|
||||
return M_AATreeGet_Node(aatree->root, key);
|
||||
}
|
||||
|
||||
|
||||
static void M_AATreeIterate_Node(aatree_node_t *node, aatree_iter_t callback)
|
||||
{
|
||||
if (node->left) M_AATreeIterate_Node(node->left, callback);
|
||||
callback(node->key, node->value);
|
||||
if (node->right) M_AATreeIterate_Node(node->right, callback);
|
||||
}
|
||||
|
||||
void M_AATreeIterate(aatree_t *aatree, aatree_iter_t callback)
|
||||
{
|
||||
if (aatree->root)
|
||||
M_AATreeIterate_Node(aatree->root, callback);
|
||||
}
|
||||
|
|
13
src/m_misc.h
13
src/m_misc.h
|
@ -96,19 +96,6 @@ void M_SetupMemcpy(void);
|
|||
// counting bits, for weapon ammo code, usually
|
||||
FUNCMATH UINT8 M_CountBits(UINT32 num, UINT8 size);
|
||||
|
||||
// Flags for AA trees.
|
||||
#define AATREE_ZUSER 1 // Treat values as z_zone-allocated blocks and set their user fields
|
||||
|
||||
typedef struct aatree_s aatree_t;
|
||||
typedef void (*aatree_iter_t)(INT32 key, void *value);
|
||||
|
||||
aatree_t *M_AATreeAlloc(UINT32 flags);
|
||||
void M_AATreeFree(aatree_t *aatree);
|
||||
void M_AATreeSet(aatree_t *aatree, INT32 key, void* value);
|
||||
void *M_AATreeGet(aatree_t *aatree, INT32 key);
|
||||
void M_AATreeIterate(aatree_t *aatree, aatree_iter_t callback);
|
||||
|
||||
// Nasty cyclic dependency workaround. This must come after aatree stuff.
|
||||
#include "w_wad.h"
|
||||
extern char configfile[MAX_WADPATH];
|
||||
|
||||
|
|
|
@ -1163,7 +1163,7 @@ void T_SpikeSector(levelspecthink_t *spikes)
|
|||
|
||||
node = spikes->sector->touching_thinglist; // things touching this sector
|
||||
|
||||
for (; node; node = node->m_snext)
|
||||
for (; node; node = node->m_thinglist_next)
|
||||
{
|
||||
thing = node->m_thing;
|
||||
if (!thing->player)
|
||||
|
@ -1314,7 +1314,7 @@ void T_BridgeThinker(levelspecthink_t *bridge)
|
|||
controlsec = §ors[k];
|
||||
|
||||
// Is a player standing on me?
|
||||
for (node = sector->touching_thinglist; node; node = node->m_snext)
|
||||
for (node = sector->touching_thinglist; node; node = node->m_thinglist_next)
|
||||
{
|
||||
thing = node->m_thing;
|
||||
|
||||
|
@ -1737,7 +1737,7 @@ wegotit:
|
|||
static mobj_t *SearchMarioNode(msecnode_t *node)
|
||||
{
|
||||
mobj_t *thing = NULL;
|
||||
for (; node; node = node->m_snext)
|
||||
for (; node; node = node->m_thinglist_next)
|
||||
{
|
||||
// Things which should NEVER be ejected from a MarioBlock, by type.
|
||||
switch (node->m_thing->type)
|
||||
|
@ -2009,7 +2009,7 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies)
|
|||
&& thing->z < upperbound && thing->z+thing->height > lowerbound)
|
||||
return;
|
||||
|
||||
node = node->m_snext;
|
||||
node = node->m_thinglist_next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2027,7 +2027,7 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies)
|
|||
&& thing->z < upperbound && thing->z+thing->height > lowerbound)
|
||||
return;
|
||||
|
||||
node = node->m_snext;
|
||||
node = node->m_thinglist_next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2306,7 +2306,7 @@ void T_RaiseSector(levelspecthink_t *raise)
|
|||
sector = §ors[i];
|
||||
|
||||
// Is a player standing on me?
|
||||
for (node = sector->touching_thinglist; node; node = node->m_snext)
|
||||
for (node = sector->touching_thinglist; node; node = node->m_thinglist_next)
|
||||
{
|
||||
thing = node->m_thing;
|
||||
|
||||
|
|
|
@ -3656,7 +3656,7 @@ void P_PlayerFlagBurst(player_t *player, boolean toss)
|
|||
// Flag text
|
||||
{
|
||||
char plname[MAXPLAYERNAME+4];
|
||||
char *flagtext;
|
||||
const char *flagtext;
|
||||
char flagcolor;
|
||||
|
||||
snprintf(plname, sizeof(plname), "%s%s%s",
|
||||
|
|
|
@ -253,7 +253,8 @@ mobj_t *P_SPMAngle(mobj_t *source, mobjtype_t type, angle_t angle, UINT8 aimtype
|
|||
#endif
|
||||
void P_ColorTeamMissile(mobj_t *missile, player_t *source);
|
||||
SINT8 P_MobjFlip(mobj_t *mobj);
|
||||
boolean P_WeaponOrPanel(mobjtype_t type);
|
||||
fixed_t P_GetMobjGravity(mobj_t *mo);
|
||||
FUNCMATH boolean P_WeaponOrPanel(mobjtype_t type);
|
||||
|
||||
boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled);
|
||||
|
||||
|
|
160
src/p_map.c
160
src/p_map.c
|
@ -129,6 +129,10 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
|||
return false;
|
||||
}
|
||||
|
||||
#ifdef ESLOPE
|
||||
object->standingslope = NULL; // Okay, now we can't return - no launching off at silly angles for you.
|
||||
#endif
|
||||
|
||||
object->eflags |= MFE_SPRUNG; // apply this flag asap!
|
||||
spring->flags &= ~(MF_SOLID|MF_SPECIAL); // De-solidify
|
||||
|
||||
|
@ -232,20 +236,24 @@ static void P_DoFanAndGasJet(mobj_t *spring, mobj_t *object)
|
|||
if (p && object->state == &states[object->info->painstate]) // can't use fans and gas jets when player is in pain!
|
||||
return;
|
||||
|
||||
// is object below thruster's position? if not, calculate distance between their bottoms
|
||||
// is object's top below thruster's position? if not, calculate distance between their bottoms
|
||||
if (spring->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
if (object->z + object->height > spring->z + spring->height)
|
||||
if (object->z > spring->z + spring->height)
|
||||
return;
|
||||
zdist = (spring->z + spring->height) - (object->z + object->height);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (object->z < spring->z)
|
||||
if (object->z + object->height < spring->z)
|
||||
return;
|
||||
zdist = object->z - spring->z;
|
||||
}
|
||||
|
||||
#ifdef ESLOPE
|
||||
object->standingslope = NULL; // No launching off at silly angles for you.
|
||||
#endif
|
||||
|
||||
switch (spring->type)
|
||||
{
|
||||
case MT_FAN: // fan
|
||||
|
@ -448,6 +456,35 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
return true;
|
||||
}
|
||||
|
||||
// Dashmode users destroy spikes and monitors.
|
||||
if ((tmthing->player) && (tmthing->player->charability == CA_DASHMODE) && (tmthing->player->dashmode >= 3*TICRATE)
|
||||
&& (thing->flags & (MF_MONITOR) || thing->type == MT_SPIKE))
|
||||
{
|
||||
if ((thing->flags & (MF_MONITOR)) && (thing->health <= 0 || !(thing->flags & MF_SHOOTABLE)))
|
||||
return true;
|
||||
blockdist = thing->radius + tmthing->radius;
|
||||
if (abs(thing->x - tmx) >= blockdist || abs(thing->y - tmy) >= blockdist)
|
||||
return true; // didn't hit it
|
||||
// see if it went over / under
|
||||
if (tmthing->z > thing->z + thing->height)
|
||||
return true; // overhead
|
||||
if (tmthing->z + tmthing->height < thing->z)
|
||||
return true; // underneath
|
||||
if (thing->type == MT_SPIKE)
|
||||
{
|
||||
S_StartSound(tmthing, thing->info->deathsound);
|
||||
for (thing = thing->subsector->sector->thinglist; thing; thing = thing->snext)
|
||||
if (thing->type == MT_SPIKE && thing->health > 0 && thing->flags & MF_SOLID && P_AproxDistance(thing->x - tmthing->x, thing->y - tmthing->y) < FixedMul(56*FRACUNIT, thing->scale))
|
||||
P_KillMobj(thing, tmthing, tmthing, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
thing->health = 0;
|
||||
P_KillMobj(thing, tmthing, tmthing, 0);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!(thing->flags & (MF_SOLID|MF_SPECIAL|MF_PAIN|MF_SHOOTABLE)))
|
||||
return true;
|
||||
|
||||
|
@ -1155,7 +1192,7 @@ static boolean PIT_CheckLine(line_t *ld)
|
|||
}
|
||||
|
||||
// set openrange, opentop, openbottom
|
||||
P_LineOpening(ld);
|
||||
P_LineOpening(ld, tmthing);
|
||||
|
||||
// adjust floor / ceiling heights
|
||||
if (opentop < tmceilingz)
|
||||
|
@ -1273,7 +1310,7 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y)
|
|||
topheight = P_GetFOFTopZ(thing, newsubsec->sector, rover, x, y, NULL);
|
||||
bottomheight = P_GetFOFBottomZ(thing, newsubsec->sector, rover, x, y, NULL);
|
||||
|
||||
if (rover->flags & FF_GOOWATER && !(thing->flags & MF_NOGRAVITY))
|
||||
if ((rover->flags & (FF_SWIMMABLE|FF_GOOWATER)) == (FF_SWIMMABLE|FF_GOOWATER) && !(thing->flags & MF_NOGRAVITY))
|
||||
{
|
||||
// If you're inside goowater and slowing down
|
||||
fixed_t sinklevel = FixedMul(thing->info->height/6, thing->scale);
|
||||
|
@ -1972,8 +2009,12 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
|
|||
}
|
||||
|
||||
// Ramp test
|
||||
if (thing->player && maxstep > 0
|
||||
&& !(P_PlayerTouchingSectorSpecial(thing->player, 1, 14) || GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1) == 14))
|
||||
if (maxstep > 0 && !(
|
||||
thing->player && (
|
||||
P_PlayerTouchingSectorSpecial(thing->player, 1, 14)
|
||||
|| GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1) == 14)
|
||||
)
|
||||
)
|
||||
{
|
||||
// If the floor difference is MAXSTEPMOVE or less, and the sector isn't Section1:14, ALWAYS
|
||||
// step down! Formerly required a Section1:13 sector for the full MAXSTEPMOVE, but no more.
|
||||
|
@ -2433,6 +2474,8 @@ isblocking:
|
|||
//
|
||||
// P_IsClimbingValid
|
||||
//
|
||||
// Unlike P_DoClimbing, don't use when up against a one-sided linedef.
|
||||
//
|
||||
static boolean P_IsClimbingValid(player_t *player, angle_t angle)
|
||||
{
|
||||
fixed_t platx, platy;
|
||||
|
@ -2581,7 +2624,7 @@ static boolean PTR_SlideTraverse(intercept_t *in)
|
|||
}
|
||||
|
||||
// set openrange, opentop, openbottom
|
||||
P_LineOpening(li);
|
||||
P_LineOpening(li, slidemo);
|
||||
|
||||
if (openrange < slidemo->height)
|
||||
goto isblocking; // doesn't fit
|
||||
|
@ -2657,6 +2700,7 @@ isblocking:
|
|||
// see about climbing on the wall
|
||||
if (!(checkline->flags & ML_NOCLIMB))
|
||||
{
|
||||
boolean canclimb;
|
||||
angle_t climbangle, climbline;
|
||||
INT32 whichside = P_PointOnLineSide(slidemo->x, slidemo->y, li);
|
||||
|
||||
|
@ -2667,9 +2711,11 @@ isblocking:
|
|||
|
||||
climbangle += (ANGLE_90 * (whichside ? -1 : 1));
|
||||
|
||||
canclimb = (li->backsector ? P_IsClimbingValid(slidemo->player, climbangle) : true);
|
||||
|
||||
if (((!slidemo->player->climbing && abs((signed)(slidemo->angle - ANGLE_90 - climbline)) < ANGLE_45)
|
||||
|| (slidemo->player->climbing == 1 && abs((signed)(slidemo->angle - climbline)) < ANGLE_135))
|
||||
&& P_IsClimbingValid(slidemo->player, climbangle))
|
||||
&& canclimb)
|
||||
{
|
||||
slidemo->angle = climbangle;
|
||||
if (!demoplayback || P_AnalogMove(slidemo->player))
|
||||
|
@ -3368,7 +3414,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch)
|
|||
for (i = 0; i < sector->numattached; i++)
|
||||
{
|
||||
sec = §ors[sector->attached[i]];
|
||||
for (n = sec->touching_thinglist; n; n = n->m_snext)
|
||||
for (n = sec->touching_thinglist; n; n = n->m_thinglist_next)
|
||||
n->visited = false;
|
||||
|
||||
sec->moved = true;
|
||||
|
@ -3380,7 +3426,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch)
|
|||
|
||||
do
|
||||
{
|
||||
for (n = sec->touching_thinglist; n; n = n->m_snext)
|
||||
for (n = sec->touching_thinglist; n; n = n->m_thinglist_next)
|
||||
if (!n->visited)
|
||||
{
|
||||
n->visited = true;
|
||||
|
@ -3401,12 +3447,12 @@ boolean P_CheckSector(sector_t *sector, boolean crunch)
|
|||
// Mark all things invalid
|
||||
sector->moved = true;
|
||||
|
||||
for (n = sector->touching_thinglist; n; n = n->m_snext)
|
||||
for (n = sector->touching_thinglist; n; n = n->m_thinglist_next)
|
||||
n->visited = false;
|
||||
|
||||
do
|
||||
{
|
||||
for (n = sector->touching_thinglist; n; n = n->m_snext) // go through list
|
||||
for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) // go through list
|
||||
if (!n->visited) // unprocessed thing found
|
||||
{
|
||||
n->visited = true; // mark thing as processed
|
||||
|
@ -3430,7 +3476,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch)
|
|||
for (i = 0; i < sector->numattached; i++)
|
||||
{
|
||||
sec = §ors[sector->attached[i]];
|
||||
for (n = sec->touching_thinglist; n; n = n->m_snext)
|
||||
for (n = sec->touching_thinglist; n; n = n->m_thinglist_next)
|
||||
n->visited = false;
|
||||
|
||||
sec->moved = true;
|
||||
|
@ -3442,7 +3488,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch)
|
|||
|
||||
do
|
||||
{
|
||||
for (n = sec->touching_thinglist; n; n = n->m_snext)
|
||||
for (n = sec->touching_thinglist; n; n = n->m_thinglist_next)
|
||||
if (!n->visited)
|
||||
{
|
||||
n->visited = true;
|
||||
|
@ -3460,12 +3506,12 @@ boolean P_CheckSector(sector_t *sector, boolean crunch)
|
|||
// Mark all things invalid
|
||||
sector->moved = true;
|
||||
|
||||
for (n = sector->touching_thinglist; n; n = n->m_snext)
|
||||
for (n = sector->touching_thinglist; n; n = n->m_thinglist_next)
|
||||
n->visited = false;
|
||||
|
||||
do
|
||||
{
|
||||
for (n = sector->touching_thinglist; n; n = n->m_snext) // go through list
|
||||
for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) // go through list
|
||||
if (!n->visited) // unprocessed thing found
|
||||
{
|
||||
n->visited = true; // mark thing as processed
|
||||
|
@ -3505,7 +3551,7 @@ static msecnode_t *P_GetSecnode(void)
|
|||
if (headsecnode)
|
||||
{
|
||||
node = headsecnode;
|
||||
headsecnode = headsecnode->m_snext;
|
||||
headsecnode = headsecnode->m_thinglist_next;
|
||||
}
|
||||
else
|
||||
node = Z_Calloc(sizeof (*node), PU_LEVEL, NULL);
|
||||
|
@ -3519,7 +3565,7 @@ static mprecipsecnode_t *P_GetPrecipSecnode(void)
|
|||
if (headprecipsecnode)
|
||||
{
|
||||
node = headprecipsecnode;
|
||||
headprecipsecnode = headprecipsecnode->m_snext;
|
||||
headprecipsecnode = headprecipsecnode->m_thinglist_next;
|
||||
}
|
||||
else
|
||||
node = Z_Calloc(sizeof (*node), PU_LEVEL, NULL);
|
||||
|
@ -3530,14 +3576,14 @@ static mprecipsecnode_t *P_GetPrecipSecnode(void)
|
|||
|
||||
static inline void P_PutSecnode(msecnode_t *node)
|
||||
{
|
||||
node->m_snext = headsecnode;
|
||||
node->m_thinglist_next = headsecnode;
|
||||
headsecnode = node;
|
||||
}
|
||||
|
||||
// Tails 08-25-2002
|
||||
static inline void P_PutPrecipSecnode(mprecipsecnode_t *node)
|
||||
{
|
||||
node->m_snext = headprecipsecnode;
|
||||
node->m_thinglist_next = headprecipsecnode;
|
||||
headprecipsecnode = node;
|
||||
}
|
||||
|
||||
|
@ -3558,7 +3604,7 @@ static msecnode_t *P_AddSecnode(sector_t *s, mobj_t *thing, msecnode_t *nextnode
|
|||
node->m_thing = thing; // Yes. Setting m_thing says 'keep it'.
|
||||
return nextnode;
|
||||
}
|
||||
node = node->m_tnext;
|
||||
node = node->m_sectorlist_next;
|
||||
}
|
||||
|
||||
// Couldn't find an existing node for this sector. Add one at the head
|
||||
|
@ -3571,17 +3617,17 @@ static msecnode_t *P_AddSecnode(sector_t *s, mobj_t *thing, msecnode_t *nextnode
|
|||
|
||||
node->m_sector = s; // sector
|
||||
node->m_thing = thing; // mobj
|
||||
node->m_tprev = NULL; // prev node on Thing thread
|
||||
node->m_tnext = nextnode; // next node on Thing thread
|
||||
node->m_sectorlist_prev = NULL; // prev node on Thing thread
|
||||
node->m_sectorlist_next = nextnode; // next node on Thing thread
|
||||
if (nextnode)
|
||||
nextnode->m_tprev = node; // set back link on Thing
|
||||
nextnode->m_sectorlist_prev = node; // set back link on Thing
|
||||
|
||||
// Add new node at head of sector thread starting at s->touching_thinglist
|
||||
|
||||
node->m_sprev = NULL; // prev node on sector thread
|
||||
node->m_snext = s->touching_thinglist; // next node on sector thread
|
||||
node->m_thinglist_prev = NULL; // prev node on sector thread
|
||||
node->m_thinglist_next = s->touching_thinglist; // next node on sector thread
|
||||
if (s->touching_thinglist)
|
||||
node->m_snext->m_sprev = node;
|
||||
node->m_thinglist_next->m_thinglist_prev = node;
|
||||
s->touching_thinglist = node;
|
||||
return node;
|
||||
}
|
||||
|
@ -3599,7 +3645,7 @@ static mprecipsecnode_t *P_AddPrecipSecnode(sector_t *s, precipmobj_t *thing, mp
|
|||
node->m_thing = thing; // Yes. Setting m_thing says 'keep it'.
|
||||
return nextnode;
|
||||
}
|
||||
node = node->m_tnext;
|
||||
node = node->m_sectorlist_next;
|
||||
}
|
||||
|
||||
// Couldn't find an existing node for this sector. Add one at the head
|
||||
|
@ -3612,17 +3658,17 @@ static mprecipsecnode_t *P_AddPrecipSecnode(sector_t *s, precipmobj_t *thing, mp
|
|||
|
||||
node->m_sector = s; // sector
|
||||
node->m_thing = thing; // mobj
|
||||
node->m_tprev = NULL; // prev node on Thing thread
|
||||
node->m_tnext = nextnode; // next node on Thing thread
|
||||
node->m_sectorlist_prev = NULL; // prev node on Thing thread
|
||||
node->m_sectorlist_next = nextnode; // next node on Thing thread
|
||||
if (nextnode)
|
||||
nextnode->m_tprev = node; // set back link on Thing
|
||||
nextnode->m_sectorlist_prev = node; // set back link on Thing
|
||||
|
||||
// Add new node at head of sector thread starting at s->touching_thinglist
|
||||
|
||||
node->m_sprev = NULL; // prev node on sector thread
|
||||
node->m_snext = s->touching_preciplist; // next node on sector thread
|
||||
node->m_thinglist_prev = NULL; // prev node on sector thread
|
||||
node->m_thinglist_next = s->touching_preciplist; // next node on sector thread
|
||||
if (s->touching_preciplist)
|
||||
node->m_snext->m_sprev = node;
|
||||
node->m_thinglist_next->m_thinglist_prev = node;
|
||||
s->touching_preciplist = node;
|
||||
return node;
|
||||
}
|
||||
|
@ -3644,24 +3690,24 @@ static msecnode_t *P_DelSecnode(msecnode_t *node)
|
|||
// Unlink from the Thing thread. The Thing thread begins at
|
||||
// sector_list and not from mobj_t->touching_sectorlist.
|
||||
|
||||
tp = node->m_tprev;
|
||||
tn = node->m_tnext;
|
||||
tp = node->m_sectorlist_prev;
|
||||
tn = node->m_sectorlist_next;
|
||||
if (tp)
|
||||
tp->m_tnext = tn;
|
||||
tp->m_sectorlist_next = tn;
|
||||
if (tn)
|
||||
tn->m_tprev = tp;
|
||||
tn->m_sectorlist_prev = tp;
|
||||
|
||||
// Unlink from the sector thread. This thread begins at
|
||||
// sector_t->touching_thinglist.
|
||||
|
||||
sp = node->m_sprev;
|
||||
sn = node->m_snext;
|
||||
sp = node->m_thinglist_prev;
|
||||
sn = node->m_thinglist_next;
|
||||
if (sp)
|
||||
sp->m_snext = sn;
|
||||
sp->m_thinglist_next = sn;
|
||||
else
|
||||
node->m_sector->touching_thinglist = sn;
|
||||
if (sn)
|
||||
sn->m_sprev = sp;
|
||||
sn->m_thinglist_prev = sp;
|
||||
|
||||
// Return this node to the freelist
|
||||
|
||||
|
@ -3683,24 +3729,24 @@ static mprecipsecnode_t *P_DelPrecipSecnode(mprecipsecnode_t *node)
|
|||
// Unlink from the Thing thread. The Thing thread begins at
|
||||
// sector_list and not from mobj_t->touching_sectorlist.
|
||||
|
||||
tp = node->m_tprev;
|
||||
tn = node->m_tnext;
|
||||
tp = node->m_sectorlist_prev;
|
||||
tn = node->m_sectorlist_next;
|
||||
if (tp)
|
||||
tp->m_tnext = tn;
|
||||
tp->m_sectorlist_next = tn;
|
||||
if (tn)
|
||||
tn->m_tprev = tp;
|
||||
tn->m_sectorlist_prev = tp;
|
||||
|
||||
// Unlink from the sector thread. This thread begins at
|
||||
// sector_t->touching_thinglist.
|
||||
|
||||
sp = node->m_sprev;
|
||||
sn = node->m_snext;
|
||||
sp = node->m_thinglist_prev;
|
||||
sn = node->m_thinglist_next;
|
||||
if (sp)
|
||||
sp->m_snext = sn;
|
||||
sp->m_thinglist_next = sn;
|
||||
else
|
||||
node->m_sector->touching_preciplist = sn;
|
||||
if (sn)
|
||||
sn->m_sprev = sp;
|
||||
sn->m_thinglist_prev = sp;
|
||||
|
||||
// Return this node to the freelist
|
||||
|
||||
|
@ -3815,7 +3861,7 @@ void P_CreateSecNodeList(mobj_t *thing, fixed_t x, fixed_t y)
|
|||
while (node)
|
||||
{
|
||||
node->m_thing = NULL;
|
||||
node = node->m_tnext;
|
||||
node = node->m_sectorlist_next;
|
||||
}
|
||||
|
||||
P_SetTarget(&tmthing, thing);
|
||||
|
@ -3853,11 +3899,11 @@ void P_CreateSecNodeList(mobj_t *thing, fixed_t x, fixed_t y)
|
|||
if (!node->m_thing)
|
||||
{
|
||||
if (node == sector_list)
|
||||
sector_list = node->m_tnext;
|
||||
sector_list = node->m_sectorlist_next;
|
||||
node = P_DelSecnode(node);
|
||||
}
|
||||
else
|
||||
node = node->m_tnext;
|
||||
node = node->m_sectorlist_next;
|
||||
}
|
||||
|
||||
/* cph -
|
||||
|
@ -3898,7 +3944,7 @@ void P_CreatePrecipSecNodeList(precipmobj_t *thing,fixed_t x,fixed_t y)
|
|||
while (node)
|
||||
{
|
||||
node->m_thing = NULL;
|
||||
node = node->m_tnext;
|
||||
node = node->m_sectorlist_next;
|
||||
}
|
||||
|
||||
tmprecipthing = thing;
|
||||
|
@ -3932,11 +3978,11 @@ void P_CreatePrecipSecNodeList(precipmobj_t *thing,fixed_t x,fixed_t y)
|
|||
if (!node->m_thing)
|
||||
{
|
||||
if (node == precipsector_list)
|
||||
precipsector_list = node->m_tnext;
|
||||
precipsector_list = node->m_sectorlist_next;
|
||||
node = P_DelPrecipSecnode(node);
|
||||
}
|
||||
else
|
||||
node = node->m_tnext;
|
||||
node = node->m_sectorlist_next;
|
||||
}
|
||||
|
||||
/* cph -
|
||||
|
|
|
@ -489,7 +489,7 @@ void P_CameraLineOpening(line_t *linedef)
|
|||
}
|
||||
}
|
||||
|
||||
void P_LineOpening(line_t *linedef)
|
||||
void P_LineOpening(line_t *linedef, mobj_t *mobj)
|
||||
{
|
||||
sector_t *front, *back;
|
||||
|
||||
|
@ -520,8 +520,8 @@ void P_LineOpening(line_t *linedef)
|
|||
{ // Set open and high/low values here
|
||||
fixed_t frontheight, backheight;
|
||||
|
||||
frontheight = P_GetCeilingZ(tmthing, front, tmx, tmy, linedef);
|
||||
backheight = P_GetCeilingZ(tmthing, back, tmx, tmy, linedef);
|
||||
frontheight = P_GetCeilingZ(mobj, front, tmx, tmy, linedef);
|
||||
backheight = P_GetCeilingZ(mobj, back, tmx, tmy, linedef);
|
||||
|
||||
if (frontheight < backheight)
|
||||
{
|
||||
|
@ -540,8 +540,8 @@ void P_LineOpening(line_t *linedef)
|
|||
#endif
|
||||
}
|
||||
|
||||
frontheight = P_GetFloorZ(tmthing, front, tmx, tmy, linedef);
|
||||
backheight = P_GetFloorZ(tmthing, back, tmx, tmy, linedef);
|
||||
frontheight = P_GetFloorZ(mobj, front, tmx, tmy, linedef);
|
||||
backheight = P_GetFloorZ(mobj, back, tmx, tmy, linedef);
|
||||
|
||||
if (frontheight > backheight)
|
||||
{
|
||||
|
@ -561,12 +561,14 @@ void P_LineOpening(line_t *linedef)
|
|||
}
|
||||
}
|
||||
|
||||
if (tmthing)
|
||||
if (mobj)
|
||||
{
|
||||
fixed_t thingtop = tmthing->z + tmthing->height;
|
||||
fixed_t thingtop = mobj->z + mobj->height;
|
||||
|
||||
// Check for collision with front side's midtexture if Effect 4 is set
|
||||
if (linedef->flags & ML_EFFECT4) {
|
||||
if (linedef->flags & ML_EFFECT4
|
||||
&& !linedef->polyobj // don't do anything for polyobjects! ...for now
|
||||
) {
|
||||
side_t *side = &sides[linedef->sidenum[0]];
|
||||
fixed_t textop, texbottom, texheight;
|
||||
fixed_t texmid, delta1, delta2;
|
||||
|
@ -575,30 +577,38 @@ void P_LineOpening(line_t *linedef)
|
|||
texheight = textures[texturetranslation[side->midtexture]]->height << FRACBITS;
|
||||
|
||||
// Set texbottom and textop to the Z coordinates of the texture's boundaries
|
||||
#ifdef POLYOBJECTS
|
||||
#if 0 // #ifdef POLYOBJECTS
|
||||
// don't remove this code unless solid midtextures
|
||||
// on non-solid polyobjects should NEVER happen in the future
|
||||
if (linedef->polyobj && (linedef->polyobj->flags & POF_TESTHEIGHT)) {
|
||||
if (linedef->flags & ML_DONTPEGBOTTOM) {
|
||||
if (linedef->flags & ML_EFFECT5 && !side->repeatcnt) { // "infinite" repeat
|
||||
texbottom = back->floorheight + side->rowoffset;
|
||||
textop = back->ceilingheight + side->rowoffset;
|
||||
} else if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) {
|
||||
texbottom = back->floorheight + side->rowoffset;
|
||||
textop = texbottom + texheight*(side->repeatcnt+1);
|
||||
} else {
|
||||
textop = back->ceilingheight - side->rowoffset;
|
||||
textop = back->ceilingheight + side->rowoffset;
|
||||
texbottom = textop - texheight*(side->repeatcnt+1);
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
if (linedef->flags & ML_DONTPEGBOTTOM) {
|
||||
if (linedef->flags & ML_EFFECT5 && !side->repeatcnt) { // "infinite" repeat
|
||||
texbottom = openbottom + side->rowoffset;
|
||||
textop = opentop + side->rowoffset;
|
||||
} else if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) {
|
||||
texbottom = openbottom + side->rowoffset;
|
||||
textop = texbottom + texheight*(side->repeatcnt+1);
|
||||
} else {
|
||||
textop = opentop - side->rowoffset;
|
||||
textop = opentop + side->rowoffset;
|
||||
texbottom = textop - texheight*(side->repeatcnt+1);
|
||||
}
|
||||
}
|
||||
|
||||
texmid = texbottom+(textop-texbottom)/2;
|
||||
|
||||
delta1 = abs(tmthing->z - texmid);
|
||||
delta1 = abs(mobj->z - texmid);
|
||||
delta2 = abs(thingtop - texmid);
|
||||
|
||||
if (delta1 > delta2) { // Below
|
||||
|
@ -636,16 +646,16 @@ void P_LineOpening(line_t *linedef)
|
|||
if (!(rover->flags & FF_EXISTS))
|
||||
continue;
|
||||
|
||||
if (tmthing->player && (P_CheckSolidLava(tmthing, rover) || P_CanRunOnWater(tmthing->player, rover)))
|
||||
if (mobj->player && (P_CheckSolidLava(mobj, rover) || P_CanRunOnWater(mobj->player, rover)))
|
||||
;
|
||||
else if (!((rover->flags & FF_BLOCKPLAYER && tmthing->player)
|
||||
|| (rover->flags & FF_BLOCKOTHERS && !tmthing->player)))
|
||||
else if (!((rover->flags & FF_BLOCKPLAYER && mobj->player)
|
||||
|| (rover->flags & FF_BLOCKOTHERS && !mobj->player)))
|
||||
continue;
|
||||
|
||||
topheight = P_GetFOFTopZ(tmthing, front, rover, tmx, tmy, linedef);
|
||||
bottomheight = P_GetFOFBottomZ(tmthing, front, rover, tmx, tmy, linedef);
|
||||
topheight = P_GetFOFTopZ(mobj, front, rover, tmx, tmy, linedef);
|
||||
bottomheight = P_GetFOFBottomZ(mobj, front, rover, tmx, tmy, linedef);
|
||||
|
||||
delta1 = abs(tmthing->z - (bottomheight + ((topheight - bottomheight)/2)));
|
||||
delta1 = abs(mobj->z - (bottomheight + ((topheight - bottomheight)/2)));
|
||||
delta2 = abs(thingtop - (bottomheight + ((topheight - bottomheight)/2)));
|
||||
|
||||
if (delta1 >= delta2 && !(rover->flags & FF_PLATFORM)) // thing is below FOF
|
||||
|
@ -680,16 +690,16 @@ void P_LineOpening(line_t *linedef)
|
|||
if (!(rover->flags & FF_EXISTS))
|
||||
continue;
|
||||
|
||||
if (tmthing->player && (P_CheckSolidLava(tmthing, rover) || P_CanRunOnWater(tmthing->player, rover)))
|
||||
if (mobj->player && (P_CheckSolidLava(mobj, rover) || P_CanRunOnWater(mobj->player, rover)))
|
||||
;
|
||||
else if (!((rover->flags & FF_BLOCKPLAYER && tmthing->player)
|
||||
|| (rover->flags & FF_BLOCKOTHERS && !tmthing->player)))
|
||||
else if (!((rover->flags & FF_BLOCKPLAYER && mobj->player)
|
||||
|| (rover->flags & FF_BLOCKOTHERS && !mobj->player)))
|
||||
continue;
|
||||
|
||||
topheight = P_GetFOFTopZ(tmthing, back, rover, tmx, tmy, linedef);
|
||||
bottomheight = P_GetFOFBottomZ(tmthing, back, rover, tmx, tmy, linedef);
|
||||
topheight = P_GetFOFTopZ(mobj, back, rover, tmx, tmy, linedef);
|
||||
bottomheight = P_GetFOFBottomZ(mobj, back, rover, tmx, tmy, linedef);
|
||||
|
||||
delta1 = abs(tmthing->z - (bottomheight + ((topheight - bottomheight)/2)));
|
||||
delta1 = abs(mobj->z - (bottomheight + ((topheight - bottomheight)/2)));
|
||||
delta2 = abs(thingtop - (bottomheight + ((topheight - bottomheight)/2)));
|
||||
|
||||
if (delta1 >= delta2 && !(rover->flags & FF_PLATFORM)) // thing is below FOF
|
||||
|
@ -723,7 +733,7 @@ void P_LineOpening(line_t *linedef)
|
|||
{
|
||||
const sector_t *polysec = linedef->backsector;
|
||||
|
||||
delta1 = abs(tmthing->z - (polysec->floorheight + ((polysec->ceilingheight - polysec->floorheight)/2)));
|
||||
delta1 = abs(mobj->z - (polysec->floorheight + ((polysec->ceilingheight - polysec->floorheight)/2)));
|
||||
delta2 = abs(thingtop - (polysec->floorheight + ((polysec->ceilingheight - polysec->floorheight)/2)));
|
||||
if (polysec->floorheight < lowestceiling && delta1 >= delta2) {
|
||||
lowestceiling = polysec->floorheight;
|
||||
|
|
|
@ -59,7 +59,7 @@ extern fixed_t opentop, openbottom, openrange, lowfloor, highceiling;
|
|||
extern pslope_t *opentopslope, *openbottomslope;
|
||||
#endif
|
||||
|
||||
void P_LineOpening(line_t *plinedef);
|
||||
void P_LineOpening(line_t *plinedef, mobj_t *mobj);
|
||||
|
||||
boolean P_BlockLinesIterator(INT32 x, INT32 y, boolean(*func)(line_t *));
|
||||
boolean P_BlockThingsIterator(INT32 x, INT32 y, boolean(*func)(mobj_t *));
|
||||
|
|
183
src/p_mobj.c
183
src/p_mobj.c
|
@ -175,6 +175,8 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_WALK);
|
||||
case S_PLAY_RUN:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_RUN);
|
||||
case S_PLAY_PEEL:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_PEEL);
|
||||
case S_PLAY_PAIN:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_PAIN);
|
||||
case S_PLAY_DEAD:
|
||||
|
@ -231,6 +233,10 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
case S_PLAY_SUPER_RUN:
|
||||
player->panim = PA_RUN;
|
||||
break;
|
||||
case S_PLAY_PEEL:
|
||||
case S_PLAY_SUPER_PEEL:
|
||||
player->panim = PA_PEEL;
|
||||
break;
|
||||
case S_PLAY_PAIN:
|
||||
case S_PLAY_SUPER_PAIN:
|
||||
case S_PLAY_SUPER_STUN:
|
||||
|
@ -316,7 +322,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
else
|
||||
mobj->tics = 4;
|
||||
}
|
||||
else if (player->panim == PA_RUN)
|
||||
else if ((player->panim == PA_RUN) || (player->panim == PA_PEEL))
|
||||
{
|
||||
if (speed > 52<<FRACBITS)
|
||||
mobj->tics = 1;
|
||||
|
@ -339,6 +345,9 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
{
|
||||
switch(spr2)
|
||||
{
|
||||
case SPR2_PEEL:
|
||||
spr2 = SPR2_RUN;
|
||||
break;
|
||||
case SPR2_RUN:
|
||||
spr2 = SPR2_WALK;
|
||||
break;
|
||||
|
@ -393,6 +402,9 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
case SPR2_SRUN:
|
||||
spr2 = SPR2_RUN;
|
||||
break;
|
||||
case SPR2_SPEE:
|
||||
spr2 = SPR2_PEEL;
|
||||
break;
|
||||
case SPR2_SPAN:
|
||||
spr2 = SPR2_PAIN;
|
||||
break;
|
||||
|
@ -1427,13 +1439,12 @@ static void P_PlayerFlip(mobj_t *mo)
|
|||
}
|
||||
|
||||
//
|
||||
// P_CheckGravity
|
||||
// P_GetMobjGravity
|
||||
//
|
||||
// Checks the current gravity state
|
||||
// of the object. If affect is true,
|
||||
// a gravity force will be applied.
|
||||
// Returns the current gravity
|
||||
// value of the object.
|
||||
//
|
||||
void P_CheckGravity(mobj_t *mo, boolean affect)
|
||||
fixed_t P_GetMobjGravity(mobj_t *mo)
|
||||
{
|
||||
fixed_t gravityadd = 0;
|
||||
boolean no3dfloorgrav = true; // Custom gravity
|
||||
|
@ -1454,15 +1465,15 @@ void P_CheckGravity(mobj_t *mo, boolean affect)
|
|||
|
||||
for (rover = mo->subsector->sector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
if (!(rover->flags & FF_EXISTS))
|
||||
if (!(rover->flags & FF_EXISTS) || !P_InsideANonSolidFFloor(mo, rover)) // P_InsideANonSolidFFloor checks for FF_EXISTS itself, but let's not always call this function
|
||||
continue;
|
||||
|
||||
if (P_InsideANonSolidFFloor(mo, rover))
|
||||
{
|
||||
if ((rover->flags & (FF_SWIMMABLE|FF_GOOWATER)) == (FF_SWIMMABLE|FF_GOOWATER))
|
||||
goopgravity = true;
|
||||
if (rover->master->frontsector->gravity)
|
||||
{
|
||||
|
||||
if (!(rover->master->frontsector->gravity))
|
||||
continue;
|
||||
|
||||
gravityadd = -FixedMul(gravity,
|
||||
(FixedDiv(*rover->master->frontsector->gravity>>FRACBITS, 1000)));
|
||||
|
||||
|
@ -1473,8 +1484,6 @@ void P_CheckGravity(mobj_t *mo, boolean affect)
|
|||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (no3dfloorgrav)
|
||||
{
|
||||
|
@ -1492,33 +1501,22 @@ void P_CheckGravity(mobj_t *mo, boolean affect)
|
|||
if (mo->eflags & MFE_UNDERWATER && !goopgravity)
|
||||
gravityadd = gravityadd/3;
|
||||
|
||||
if (!mo->momz) // mobj at stop, no floor, so feel the push of gravity!
|
||||
gravityadd <<= 1;
|
||||
|
||||
if (mo->player)
|
||||
{
|
||||
if (mo->player->charability == CA_FLY && (mo->player->powers[pw_tailsfly]
|
||||
|| mo->state-states == S_PLAY_FLY_TIRED))
|
||||
gravityadd = gravityadd/3; // less gravity while flying
|
||||
if (mo->player->pflags & PF_GLIDING)
|
||||
gravityadd = gravityadd/3; // less gravity while gliding
|
||||
if (mo->player->climbing)
|
||||
gravityadd = 0;
|
||||
if (mo->player->pflags & PF_NIGHTSMODE)
|
||||
if ((mo->player->pflags & PF_GLIDING)
|
||||
|| (mo->player->charability == CA_FLY && (mo->player->powers[pw_tailsfly]
|
||||
|| mo->state-states == S_PLAY_FLY_TIRED)))
|
||||
gravityadd = gravityadd/3; // less gravity while flying/gliding
|
||||
if (mo->player->climbing || (mo->player->pflags & PF_NIGHTSMODE))
|
||||
gravityadd = 0;
|
||||
|
||||
{
|
||||
UINT8 bits = 0;
|
||||
if (mo->flags2 & MF2_OBJECTFLIP)
|
||||
bits ^= 1;
|
||||
if (mo->player->powers[pw_gravityboots])
|
||||
bits ^= 1;
|
||||
if (bits & 1)
|
||||
if (!(mo->flags2 & MF2_OBJECTFLIP) != !(mo->player->powers[pw_gravityboots])) // negated to turn numeric into bool - would be double negated, but not needed if both would be
|
||||
{
|
||||
gravityadd = -gravityadd;
|
||||
mo->eflags ^= MFE_VERTICALFLIP;
|
||||
}
|
||||
}
|
||||
if (wasflip == !(mo->eflags & MFE_VERTICALFLIP)) // note!! == ! is not equivalent to != here - turns numeric into bool this way
|
||||
P_PlayerFlip(mo);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1526,10 +1524,10 @@ void P_CheckGravity(mobj_t *mo, boolean affect)
|
|||
if (mo->flags2 & MF2_OBJECTFLIP)
|
||||
{
|
||||
mo->eflags |= MFE_VERTICALFLIP;
|
||||
if (gravityadd < 0) // Don't sink, only rise up
|
||||
gravityadd *= -1;
|
||||
if (mo->z + mo->height >= mo->ceilingz)
|
||||
gravityadd = 0;
|
||||
else if (gravityadd < 0) // Don't sink, only rise up
|
||||
gravityadd *= -1;
|
||||
}
|
||||
else //Otherwise, sort through the other exceptions.
|
||||
{
|
||||
|
@ -1575,11 +1573,27 @@ void P_CheckGravity(mobj_t *mo, boolean affect)
|
|||
if (goopgravity)
|
||||
gravityadd = -gravityadd/5;
|
||||
|
||||
if (affect)
|
||||
mo->momz += FixedMul(gravityadd, mo->scale);
|
||||
gravityadd = FixedMul(gravityadd, mo->scale);
|
||||
|
||||
if (mo->player && !!(mo->eflags & MFE_VERTICALFLIP) != wasflip)
|
||||
P_PlayerFlip(mo);
|
||||
return gravityadd;
|
||||
}
|
||||
|
||||
//
|
||||
// P_CheckGravity
|
||||
//
|
||||
// Checks the current gravity state
|
||||
// of the object. If affect is true,
|
||||
// a gravity force will be applied.
|
||||
//
|
||||
void P_CheckGravity(mobj_t *mo, boolean affect)
|
||||
{
|
||||
fixed_t gravityadd = P_GetMobjGravity(mo);
|
||||
|
||||
if (!mo->momz) // mobj at stop, no floor, so feel the push of gravity!
|
||||
gravityadd <<= 1;
|
||||
|
||||
if (affect)
|
||||
mo->momz += gravityadd;
|
||||
|
||||
if (mo->type == MT_SKIM && mo->z + mo->momz <= mo->watertop && mo->z >= mo->watertop)
|
||||
{
|
||||
|
@ -1655,7 +1669,7 @@ static void P_XYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy)
|
|||
&& abs(player->rmomy) < FixedMul(STOPSPEED, mo->scale)
|
||||
&& (!(player->cmd.forwardmove && !(twodlevel || mo->flags2 & MF2_TWOD)) && !player->cmd.sidemove && !(player->pflags & PF_SPINNING))
|
||||
#ifdef ESLOPE
|
||||
&& !(player->mo->standingslope && abs(player->mo->standingslope->zdelta) >= FRACUNIT/2)
|
||||
&& !(player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)) && (abs(player->mo->standingslope->zdelta) >= FRACUNIT/2))
|
||||
#endif
|
||||
)
|
||||
{
|
||||
|
@ -1705,7 +1719,7 @@ static void P_PushableCheckBustables(mobj_t *mo)
|
|||
mo->y += mo->momy;
|
||||
P_SetThingPosition(mo);
|
||||
|
||||
for (node = mo->touching_sectorlist; node; node = node->m_snext)
|
||||
for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||
{
|
||||
if (!node->m_sector)
|
||||
break;
|
||||
|
@ -1713,6 +1727,7 @@ static void P_PushableCheckBustables(mobj_t *mo)
|
|||
if (node->m_sector->ffloors)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
fixed_t topheight, bottomheight;
|
||||
|
||||
for (rover = node->m_sector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
|
@ -1725,37 +1740,39 @@ static void P_PushableCheckBustables(mobj_t *mo)
|
|||
|
||||
if (!rover->master->frontsector->crumblestate)
|
||||
{
|
||||
topheight = P_GetFOFTopZ(mo, node->m_sector, rover, mo->x, mo->y, NULL);
|
||||
bottomheight = P_GetFOFBottomZ(mo, node->m_sector, rover, mo->x, mo->y, NULL);
|
||||
// Height checks
|
||||
if (rover->flags & FF_SHATTERBOTTOM)
|
||||
{
|
||||
if (mo->z+mo->momz + mo->height < *rover->bottomheight)
|
||||
if (mo->z+mo->momz + mo->height < bottomheight)
|
||||
continue;
|
||||
|
||||
if (mo->z+mo->height > *rover->bottomheight)
|
||||
if (mo->z+mo->height > bottomheight)
|
||||
continue;
|
||||
}
|
||||
else if (rover->flags & FF_SPINBUST)
|
||||
{
|
||||
if (mo->z+mo->momz > *rover->topheight)
|
||||
if (mo->z+mo->momz > topheight)
|
||||
continue;
|
||||
|
||||
if (mo->z+mo->height < *rover->bottomheight)
|
||||
if (mo->z+mo->height < bottomheight)
|
||||
continue;
|
||||
}
|
||||
else if (rover->flags & FF_SHATTER)
|
||||
{
|
||||
if (mo->z+mo->momz > *rover->topheight)
|
||||
if (mo->z+mo->momz > topheight)
|
||||
continue;
|
||||
|
||||
if (mo->z+mo->momz + mo->height < *rover->bottomheight)
|
||||
if (mo->z+mo->momz + mo->height < bottomheight)
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mo->z >= *rover->topheight)
|
||||
if (mo->z >= topheight)
|
||||
continue;
|
||||
|
||||
if (mo->z+mo->height < *rover->bottomheight)
|
||||
if (mo->z+mo->height < bottomheight)
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1810,8 +1827,6 @@ void P_XYMovement(mobj_t *mo)
|
|||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
moved = true;
|
||||
|
||||
// if it's stopped
|
||||
if (!mo->momx && !mo->momy)
|
||||
{
|
||||
|
@ -1868,9 +1883,9 @@ void P_XYMovement(mobj_t *mo)
|
|||
if (!P_TryMove(mo, mo->x + xmove, mo->y + ymove, true) && !(mo->eflags & MFE_SPRUNG))
|
||||
{
|
||||
// blocked move
|
||||
moved = false;
|
||||
|
||||
if (player) {
|
||||
moved = false;
|
||||
if (player->bot)
|
||||
B_MoveBlocked(player);
|
||||
}
|
||||
|
@ -1975,7 +1990,7 @@ void P_XYMovement(mobj_t *mo)
|
|||
else
|
||||
mo->momx = mo->momy = 0;
|
||||
}
|
||||
else if (player)
|
||||
else
|
||||
moved = true;
|
||||
|
||||
if (P_MobjWasRemoved(mo)) // MF_SPECIAL touched a player! O_o;;
|
||||
|
@ -2188,12 +2203,14 @@ static void P_AdjustMobjFloorZ_FFloors(mobj_t *mo, sector_t *sector, UINT8 motyp
|
|||
delta1 = mo->z - (bottomheight + ((topheight - bottomheight)/2));
|
||||
delta2 = thingtop - (bottomheight + ((topheight - bottomheight)/2));
|
||||
if (topheight > mo->floorz && abs(delta1) < abs(delta2)
|
||||
&& !(rover->flags & FF_REVERSEPLATFORM))
|
||||
&& !(rover->flags & FF_REVERSEPLATFORM)
|
||||
&& ((P_MobjFlip(mo)*mo->momz > 0) || (!(rover->flags & FF_PLATFORM)))) // In reverse gravity, only clip for FOFs that are intangible from their bottom (the "top" you're falling through) if you're coming from above ("below" in your frame of reference)
|
||||
{
|
||||
mo->floorz = topheight;
|
||||
}
|
||||
if (bottomheight < mo->ceilingz && abs(delta1) >= abs(delta2)
|
||||
&& !(rover->flags & FF_PLATFORM))
|
||||
&& !(rover->flags & FF_PLATFORM)
|
||||
&& ((P_MobjFlip(mo)*mo->momz > 0) || (!(rover->flags & FF_REVERSEPLATFORM)))) // In normal gravity, only clip for FOFs that are intangible from the top if you're coming from below
|
||||
{
|
||||
mo->ceilingz = bottomheight;
|
||||
}
|
||||
|
@ -2327,16 +2344,6 @@ static boolean P_ZMovement(mobj_t *mo)
|
|||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
#ifdef ESLOPE
|
||||
if (mo->standingslope)
|
||||
{
|
||||
if (mo->flags & MF_NOCLIPHEIGHT)
|
||||
mo->standingslope = NULL;
|
||||
else if (!P_IsObjectOnGround(mo))
|
||||
P_SlopeLaunch(mo);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Intercept the stupid 'fall through 3dfloors' bug
|
||||
if (mo->subsector->sector->ffloors)
|
||||
P_AdjustMobjFloorZ_FFloors(mo, mo->subsector->sector, 0);
|
||||
|
@ -2351,6 +2358,16 @@ static boolean P_ZMovement(mobj_t *mo)
|
|||
}
|
||||
mo->z += mo->momz;
|
||||
|
||||
#ifdef ESLOPE
|
||||
if (mo->standingslope)
|
||||
{
|
||||
if (mo->flags & MF_NOCLIPHEIGHT)
|
||||
mo->standingslope = NULL;
|
||||
else if (!P_IsObjectOnGround(mo))
|
||||
P_SlopeLaunch(mo);
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (mo->type)
|
||||
{
|
||||
case MT_THROWNBOUNCE:
|
||||
|
@ -2533,14 +2550,17 @@ static boolean P_ZMovement(mobj_t *mo)
|
|||
mo->z = mo->floorz;
|
||||
|
||||
#ifdef ESLOPE
|
||||
P_CheckPosition(mo, mo->x, mo->y); // Sets mo->standingslope correctly
|
||||
if ((mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope) {
|
||||
mo->standingslope = (mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope;
|
||||
if (mo->standingslope) // You're still on the ground; why are we here?
|
||||
{
|
||||
mo->momz = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Reverse quantizing might could use its own function later
|
||||
mo->standingslope->zangle = ANGLE_MAX-mo->standingslope->zangle;
|
||||
P_QuantizeMomentumToSlope(&mom, mo->standingslope);
|
||||
mo->standingslope->zangle = ANGLE_MAX-mo->standingslope->zangle;
|
||||
P_CheckPosition(mo, mo->x, mo->y); // Sets mo->standingslope correctly
|
||||
if (((mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope) && (mo->type != MT_STEAM))
|
||||
{
|
||||
mo->standingslope = (mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope;
|
||||
P_ReverseQuantizeMomentumToSlope(&mom, mo->standingslope);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -2693,7 +2713,7 @@ static boolean P_ZMovement(mobj_t *mo)
|
|||
mom.z = tmfloorthing->momz;
|
||||
|
||||
#ifdef ESLOPE
|
||||
if (mo->standingslope) {
|
||||
if (mo->standingslope) { // MT_STEAM will never have a standingslope, see above.
|
||||
P_QuantizeMomentumToSlope(&mom, mo->standingslope);
|
||||
}
|
||||
#endif
|
||||
|
@ -2878,7 +2898,7 @@ static void P_PlayerZMovement(mobj_t *mo)
|
|||
msecnode_t *node;
|
||||
boolean stopmovecut = false;
|
||||
|
||||
for (node = mo->touching_sectorlist; node; node = node->m_snext)
|
||||
for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||
{
|
||||
sector_t *sec = node->m_sector;
|
||||
subsector_t *newsubsec;
|
||||
|
@ -2955,7 +2975,9 @@ static void P_PlayerZMovement(mobj_t *mo)
|
|||
{
|
||||
if (mo->player->cmomx || mo->player->cmomy)
|
||||
{
|
||||
if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) && mo->player->panim != PA_RUN)
|
||||
if (mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_PEEL)
|
||||
P_SetPlayerMobjState(mo, S_PLAY_PEEL);
|
||||
else if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) && mo->player->panim != PA_RUN)
|
||||
P_SetPlayerMobjState(mo, S_PLAY_RUN);
|
||||
else if ((mo->player->rmomx || mo->player->rmomy) && (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_SUPER_FLOAT))
|
||||
P_SetPlayerMobjState(mo, S_PLAY_WALK);
|
||||
|
@ -2964,6 +2986,8 @@ static void P_PlayerZMovement(mobj_t *mo)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_PEEL)
|
||||
P_SetPlayerMobjState(mo, S_PLAY_PEEL);
|
||||
if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) && mo->player->panim != PA_RUN)
|
||||
P_SetPlayerMobjState(mo, S_PLAY_RUN);
|
||||
else if ((mo->momx || mo->momy) && (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_SUPER_FLOAT))
|
||||
|
@ -3055,7 +3079,7 @@ nightsdone:
|
|||
if (CheckForMarioBlocks && !(netgame && mo->player->spectator)) // Only let the player punch
|
||||
{
|
||||
// Search the touching sectors, from side-to-side...
|
||||
for (node = mo->touching_sectorlist; node; node = node->m_snext)
|
||||
for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
if (!node->m_sector->ffloors)
|
||||
|
@ -3823,7 +3847,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
|||
if (!(netgame && mobj->player->spectator))
|
||||
{
|
||||
// Crumbling platforms
|
||||
for (node = mobj->touching_sectorlist; node; node = node->m_snext)
|
||||
for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||
{
|
||||
fixed_t topheight, bottomheight;
|
||||
ffloor_t *rover;
|
||||
|
@ -3848,7 +3872,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
|||
{
|
||||
boolean thereiswater = false;
|
||||
|
||||
for (node = mobj->touching_sectorlist; node; node = node->m_snext)
|
||||
for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||
{
|
||||
if (node->m_sector->ffloors)
|
||||
{
|
||||
|
@ -3869,7 +3893,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
|||
}
|
||||
if (thereiswater)
|
||||
{
|
||||
for (node = mobj->touching_sectorlist; node; node = node->m_snext)
|
||||
for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||
{
|
||||
if (node->m_sector->ffloors)
|
||||
{
|
||||
|
@ -3982,7 +4006,7 @@ void P_RecalcPrecipInSector(sector_t *sector)
|
|||
|
||||
sector->moved = true; // Recalc lighting and things too, maybe
|
||||
|
||||
for (psecnode = sector->touching_preciplist; psecnode; psecnode = psecnode->m_snext)
|
||||
for (psecnode = sector->touching_preciplist; psecnode; psecnode = psecnode->m_thinglist_next)
|
||||
CalculatePrecipFloor(psecnode->m_thing);
|
||||
}
|
||||
|
||||
|
@ -7091,6 +7115,7 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
{
|
||||
mobj->flags &= ~MF_NOGRAVITY;
|
||||
P_SetMobjState(mobj, S_NIGHTSDRONE1);
|
||||
mobj->flags2 |= MF2_DONTDRAW;
|
||||
}
|
||||
}
|
||||
else if (mobj->tracer && mobj->tracer->player)
|
||||
|
|
|
@ -442,7 +442,7 @@ boolean P_SupermanLook4Players(mobj_t *actor);
|
|||
void P_DestroyRobots(void);
|
||||
void P_SnowThinker(precipmobj_t *mobj);
|
||||
void P_RainThinker(precipmobj_t *mobj);
|
||||
void P_NullPrecipThinker(precipmobj_t *mobj);
|
||||
FUNCMATH void P_NullPrecipThinker(precipmobj_t *mobj);
|
||||
void P_RemovePrecipMobj(precipmobj_t *mobj);
|
||||
void P_SetScale(mobj_t *mobj, fixed_t newscale);
|
||||
void P_XYMovement(mobj_t *mo);
|
||||
|
|
|
@ -162,6 +162,7 @@ static void P_NetArchivePlayers(void)
|
|||
WRITEINT32(save_p, players[i].deadtimer);
|
||||
WRITEUINT32(save_p, players[i].exiting);
|
||||
WRITEUINT8(save_p, players[i].homing);
|
||||
WRITEUINT32(save_p, players[i].dashmode);
|
||||
WRITEUINT32(save_p, players[i].skidtime);
|
||||
|
||||
////////////////////////////
|
||||
|
@ -337,6 +338,7 @@ static void P_NetUnArchivePlayers(void)
|
|||
players[i].deadtimer = READINT32(save_p); // End game if game over lasts too long
|
||||
players[i].exiting = READUINT32(save_p); // Exitlevel timer
|
||||
players[i].homing = READUINT8(save_p); // Are you homing?
|
||||
players[i].dashmode = READUINT32(save_p); // counter for dashmode ability
|
||||
players[i].skidtime = READUINT32(save_p); // Skid timer
|
||||
|
||||
////////////////////////////
|
||||
|
|
|
@ -1930,12 +1930,20 @@ static void P_GroupLines(void)
|
|||
|
||||
// allocate linebuffers for each sector
|
||||
for (i = 0, sector = sectors; i < numsectors; i++, sector++)
|
||||
{
|
||||
if (sector->linecount == 0) // no lines found?
|
||||
{
|
||||
sector->lines = NULL;
|
||||
CONS_Debug(DBG_SETUP, "P_GroupLines: sector %s has no lines\n", sizeu1(i));
|
||||
}
|
||||
else
|
||||
{
|
||||
sector->lines = Z_Calloc(sector->linecount * sizeof(line_t*), PU_LEVEL, NULL);
|
||||
|
||||
// zero the count, since we'll later use this to track how many we've recorded
|
||||
sector->linecount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// iterate through lines, assigning them to sectors' linebuffers,
|
||||
// and recalculate the counts in the process
|
||||
|
@ -1952,12 +1960,15 @@ static void P_GroupLines(void)
|
|||
{
|
||||
M_ClearBox(bbox);
|
||||
|
||||
if (sector->linecount != 0)
|
||||
{
|
||||
for (j = 0; j < sector->linecount; j++)
|
||||
{
|
||||
li = sector->lines[j];
|
||||
M_AddToBox(bbox, li->v1->x, li->v1->y);
|
||||
M_AddToBox(bbox, li->v2->x, li->v2->y);
|
||||
}
|
||||
}
|
||||
|
||||
// set the degenmobj_t to the middle of the bounding box
|
||||
sector->soundorg.x = (((bbox[BOXRIGHT]>>FRACBITS) + (bbox[BOXLEFT]>>FRACBITS))/2)<<FRACBITS;
|
||||
|
@ -1966,6 +1977,35 @@ static void P_GroupLines(void)
|
|||
}
|
||||
}
|
||||
|
||||
//
|
||||
// P_LoadReject
|
||||
//
|
||||
// Detect if the REJECT lump is valid,
|
||||
// if not, rejectmatrix will be NULL
|
||||
static void P_LoadReject(lumpnum_t lumpnum)
|
||||
{
|
||||
size_t count;
|
||||
const char *lumpname = W_CheckNameForNum(lumpnum);
|
||||
|
||||
// Check if the lump exists, and if it's named "REJECT"
|
||||
if (!lumpname || memcmp(lumpname, "REJECT\0\0", 8) != 0)
|
||||
{
|
||||
rejectmatrix = NULL;
|
||||
CONS_Debug(DBG_SETUP, "P_LoadReject: No valid REJECT lump found\n");
|
||||
return;
|
||||
}
|
||||
|
||||
count = W_LumpLength(lumpnum);
|
||||
|
||||
if (!count) // zero length, someone probably used ZDBSP
|
||||
{
|
||||
rejectmatrix = NULL;
|
||||
CONS_Debug(DBG_SETUP, "P_LoadReject: REJECT lump has size 0, will not be loaded\n");
|
||||
}
|
||||
else
|
||||
rejectmatrix = W_CacheLumpNum(lumpnum, PU_LEVEL);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static char *levellumps[] =
|
||||
{
|
||||
|
@ -2574,7 +2614,7 @@ boolean P_SetupLevel(boolean skipprecip)
|
|||
P_LoadSubsectors(lastloadedmaplumpnum + ML_SSECTORS);
|
||||
P_LoadNodes(lastloadedmaplumpnum + ML_NODES);
|
||||
P_LoadSegs(lastloadedmaplumpnum + ML_SEGS);
|
||||
rejectmatrix = W_CacheLumpNum(lastloadedmaplumpnum + ML_REJECT, PU_LEVEL);
|
||||
P_LoadReject(lastloadedmaplumpnum + ML_REJECT);
|
||||
P_GroupLines();
|
||||
|
||||
numdmstarts = numredctfstarts = numbluectfstarts = 0;
|
||||
|
|
|
@ -325,9 +325,12 @@ boolean P_CheckSight(mobj_t *t1, mobj_t *t2)
|
|||
s2 = t2->subsector->sector;
|
||||
pnum = (s1-sectors)*numsectors + (s2-sectors);
|
||||
|
||||
if (rejectmatrix != NULL)
|
||||
{
|
||||
// Check in REJECT table.
|
||||
if (rejectmatrix[pnum>>3] & (1 << (pnum&7))) // can't possibly be connected
|
||||
return false;
|
||||
}
|
||||
|
||||
// killough 11/98: shortcut for melee situations
|
||||
// same subsector? obviously visible
|
||||
|
|
331
src/p_slopes.c
331
src/p_slopes.c
|
@ -199,7 +199,6 @@ static fixed_t P_GetExtent(sector_t *sector, line_t *line)
|
|||
|
||||
// Find furthest vertex from the reference line. It, along with the two ends
|
||||
// of the line, will define the plane.
|
||||
// SRB2CBTODO: Use a formula to get the slope to slide objects depending on how steep
|
||||
for(i = 0; i < sector->linecount; i++)
|
||||
{
|
||||
line_t *li = sector->lines[i];
|
||||
|
@ -231,7 +230,6 @@ static fixed_t P_GetExtent(sector_t *sector, line_t *line)
|
|||
//
|
||||
// Creates one or more slopes based on the given line type and front/back
|
||||
// sectors.
|
||||
// Kalaron: Check if dynamic slopes need recalculation
|
||||
//
|
||||
void P_SpawnSlope_Line(int linenum)
|
||||
{
|
||||
|
@ -276,7 +274,6 @@ void P_SpawnSlope_Line(int linenum)
|
|||
ny = -FixedDiv(line->dx, len);
|
||||
}
|
||||
|
||||
// SRB2CBTODO: Transform origin relative to the bounds of an individual FOF
|
||||
origin.x = line->v1->x + (line->v2->x - line->v1->x)/2;
|
||||
origin.y = line->v1->y + (line->v2->y - line->v1->y)/2;
|
||||
|
||||
|
@ -327,7 +324,7 @@ void P_SpawnSlope_Line(int linenum)
|
|||
// fslope->normal is a 3D line perpendicular to the 3D vector
|
||||
|
||||
// Sync the linedata of the line that started this slope
|
||||
// SRB2CBTODO: Anything special for remote(control sector)-based slopes later?
|
||||
// TODO: Anything special for control sector based slopes later?
|
||||
fslope->sourceline = line;
|
||||
|
||||
// To find the real highz/lowz of a slope, you need to check all the vertexes
|
||||
|
@ -379,7 +376,7 @@ void P_SpawnSlope_Line(int linenum)
|
|||
cslope->refpos = 2;
|
||||
|
||||
// Sync the linedata of the line that started this slope
|
||||
// SRB2CBTODO: Anything special for remote(control sector)-based slopes later?
|
||||
// TODO: Anything special for control sector based slopes later?
|
||||
cslope->sourceline = line;
|
||||
|
||||
// Remember the way the slope is formed
|
||||
|
@ -445,7 +442,7 @@ void P_SpawnSlope_Line(int linenum)
|
|||
fslope->refpos = 3;
|
||||
|
||||
// Sync the linedata of the line that started this slope
|
||||
// SRB2CBTODO: Anything special for remote(control sector)-based slopes later?
|
||||
// TODO: Anything special for control sector based slopes later?
|
||||
fslope->sourceline = line;
|
||||
|
||||
// Remember the way the slope is formed
|
||||
|
@ -488,7 +485,7 @@ void P_SpawnSlope_Line(int linenum)
|
|||
cslope->refpos = 4;
|
||||
|
||||
// Sync the linedata of the line that started this slope
|
||||
// SRB2CBTODO: Anything special for remote(control sector)-based slopes later?
|
||||
// TODO: Anything special for control sector based slopes later?
|
||||
cslope->sourceline = line;
|
||||
|
||||
// Remember the way the slope is formed
|
||||
|
@ -554,16 +551,11 @@ static pslope_t *P_NewVertexSlope(INT16 tag1, INT16 tag2, INT16 tag3, UINT8 flag
|
|||
ret->vertices[2] = mt;
|
||||
}
|
||||
|
||||
if (!ret->vertices[0])
|
||||
CONS_Printf("PANIC 0\n");
|
||||
if (!ret->vertices[1])
|
||||
CONS_Printf("PANIC 1\n");
|
||||
if (!ret->vertices[2])
|
||||
CONS_Printf("PANIC 2\n");
|
||||
|
||||
// Now set heights for each vertex, because they haven't been set yet
|
||||
for (i = 0; i < 3; i++) {
|
||||
mt = ret->vertices[i];
|
||||
if (!mt) // If a vertex wasn't found, it's game over. There's nothing you can do to recover (except maybe try and kill the slope instead - TODO?)
|
||||
I_Error("P_NewVertexSlope: Slope vertex %s (for linedef tag %d) not found!", sizeu1(i), tag1);
|
||||
if (mt->extrainfo)
|
||||
mt->z = mt->options;
|
||||
else
|
||||
|
@ -623,265 +615,10 @@ pslope_t *P_SlopeById(UINT16 id)
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef SPRINGCLEAN
|
||||
#include "byteptr.h"
|
||||
|
||||
#include "p_setup.h"
|
||||
#include "p_local.h"
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// P_SetSlopesFromVertexHeights
|
||||
//
|
||||
//==========================================================================
|
||||
void P_SetSlopesFromVertexHeights(lumpnum_t lumpnum)
|
||||
{
|
||||
mapthing_t *mt;
|
||||
boolean vt_found = false;
|
||||
size_t i, j, k, l, q;
|
||||
|
||||
//size_t i;
|
||||
//mapthing_t *mt;
|
||||
char *data;
|
||||
char *datastart;
|
||||
|
||||
// SRB2CBTODO: WHAT IS (5 * sizeof (short))?! It = 10
|
||||
// anything else seems to make a map not load properly,
|
||||
// but this hard-coded value MUST have some reason for being what it is
|
||||
size_t snummapthings = W_LumpLength(lumpnum) / (5 * sizeof (short));
|
||||
mapthing_t *smapthings = Z_Calloc(snummapthings * sizeof (*smapthings), PU_LEVEL, NULL);
|
||||
fixed_t x, y;
|
||||
sector_t *sector;
|
||||
// Spawn axis points first so they are
|
||||
// at the front of the list for fast searching.
|
||||
data = datastart = W_CacheLumpNum(lumpnum, PU_LEVEL);
|
||||
mt = smapthings;
|
||||
for (i = 0; i < snummapthings; i++, mt++)
|
||||
{
|
||||
mt->x = READINT16(data);
|
||||
mt->y = READINT16(data);
|
||||
mt->angle = READINT16(data);
|
||||
mt->type = READINT16(data);
|
||||
mt->options = READINT16(data);
|
||||
// mt->z hasn't been set yet!
|
||||
//mt->extrainfo = (byte)(mt->type >> 12); // slope things are special, they have a bigger range of types
|
||||
|
||||
//mt->type &= 4095; // SRB2CBTODO: WHAT IS THIS???? Mobj type limits?!!!!
|
||||
x = mt->x*FRACUNIT;
|
||||
y = mt->y*FRACUNIT;
|
||||
sector = R_PointInSubsector(x, y)->sector;
|
||||
// Z for objects
|
||||
#ifdef ESLOPE
|
||||
if (sector->f_slope)
|
||||
mt->z = (short)(P_GetZAt(sector->f_slope, x, y)>>FRACBITS);
|
||||
else
|
||||
#endif
|
||||
mt->z = (short)(sector->floorheight>>FRACBITS);
|
||||
|
||||
mt->z = mt->z + (mt->options >> ZSHIFT);
|
||||
|
||||
if (mt->type == THING_VertexFloorZ || mt->type == THING_VertexCeilingZ) // THING_VertexFloorZ
|
||||
{
|
||||
for(l = 0; l < numvertexes; l++)
|
||||
{
|
||||
if (vertexes[l].x == mt->x*FRACUNIT && vertexes[l].y == mt->y*FRACUNIT)
|
||||
{
|
||||
if (mt->type == THING_VertexFloorZ)
|
||||
{
|
||||
vertexes[l].z = mt->z*FRACUNIT;
|
||||
//I_Error("Z value: %i", vertexes[l].z/FRACUNIT);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
vertexes[l].z = mt->z*FRACUNIT; // celing floor
|
||||
}
|
||||
vt_found = true;
|
||||
}
|
||||
}
|
||||
//mt->type = 0; // VPHYSICS: Dynamic slopes
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (vt_found)
|
||||
{
|
||||
for (k = 0; k < numsectors; k++)
|
||||
{
|
||||
sector_t *sec = §ors[k];
|
||||
if (sec->linecount != 3) continue; // only works with triangular sectors
|
||||
|
||||
v3float_t vt1, vt2, vt3; // cross = ret->normalf
|
||||
v3float_t vec1, vec2;
|
||||
|
||||
int vi1, vi2, vi3;
|
||||
|
||||
vi1 = (int)(sec->lines[0]->v1 - vertexes);
|
||||
vi2 = (int)(sec->lines[0]->v2 - vertexes);
|
||||
vi3 = (sec->lines[1]->v1 == sec->lines[0]->v1 || sec->lines[1]->v1 == sec->lines[0]->v2)?
|
||||
(int)(sec->lines[1]->v2 - vertexes) : (int)(sec->lines[1]->v1 - vertexes);
|
||||
|
||||
//if (vertexes[vi1].z)
|
||||
// I_Error("OSNAP %i", vertexes[vi1].z/FRACUNIT);
|
||||
//if (vertexes[vi2].z)
|
||||
// I_Error("OSNAP %i", vertexes[vi2].z/FRACUNIT);
|
||||
//if (vertexes[vi3].z)
|
||||
// I_Error("OSNAP %i", vertexes[vi3].z/FRACUNIT);
|
||||
|
||||
//I_Error("%i, %i", mt->z*FRACUNIT, vertexes[vi1].z);
|
||||
|
||||
//I_Error("%i, %i, %i", mt->x, mt->y, mt->z);
|
||||
//P_SpawnMobj(mt->x*FRACUNIT, mt->y*FRACUNIT, mt->z*FRACUNIT, MT_RING);
|
||||
|
||||
// TODO: Make sure not to spawn in the same place 2x! (we need an object in every vertex of the
|
||||
// triangle sector to setup the real vertex slopes
|
||||
// Check for the vertexes of all sectors
|
||||
for(q = 0; q < numvertexes; q++)
|
||||
{
|
||||
if (vertexes[q].x == mt->x*FRACUNIT && vertexes[q].y == mt->y*FRACUNIT)
|
||||
{
|
||||
//I_Error("yeah %i", vertexes[q].z);
|
||||
P_SpawnMobj(vertexes[q].x, vertexes[q].y, vertexes[q].z, MT_RING);
|
||||
#if 0
|
||||
if ((mt->y*FRACUNIT == vertexes[vi1].y && mt->x*FRACUNIT == vertexes[vi1].x && mt->z*FRACUNIT == vertexes[vi1].z)
|
||||
&& !(mt->y*FRACUNIT == vertexes[vi2].y && mt->x*FRACUNIT == vertexes[vi2].x && mt->z*FRACUNIT == vertexes[vi2].z)
|
||||
&& !(mt->y*FRACUNIT == vertexes[vi3].y && mt->x*FRACUNIT == vertexes[vi3].x && mt->z*FRACUNIT == vertexes[vi3].z))
|
||||
P_SpawnMobj(vertexes[vi1].x, vertexes[vi1].y, vertexes[vi1].z, MT_RING);
|
||||
else if ((mt->y*FRACUNIT == vertexes[vi2].y && mt->x*FRACUNIT == vertexes[vi2].x && mt->z*FRACUNIT == vertexes[vi2].z)
|
||||
&& !(mt->y*FRACUNIT == vertexes[vi1].y && mt->x*FRACUNIT == vertexes[vi1].x && mt->z*FRACUNIT == vertexes[vi1].z)
|
||||
&& !(mt->y*FRACUNIT == vertexes[vi3].y && mt->x*FRACUNIT == vertexes[vi3].x && mt->z*FRACUNIT == vertexes[vi3].z))
|
||||
P_SpawnMobj(vertexes[vi2].x, vertexes[vi2].y, vertexes[vi2].z, MT_BOUNCETV);
|
||||
else if ((mt->y*FRACUNIT == vertexes[vi3].y && mt->x*FRACUNIT == vertexes[vi3].x && mt->z*FRACUNIT == vertexes[vi3].z)
|
||||
&& !(mt->y*FRACUNIT == vertexes[vi2].y && mt->x*FRACUNIT == vertexes[vi2].x && mt->z*FRACUNIT == vertexes[vi2].z)
|
||||
&& !(mt->y*FRACUNIT == vertexes[vi1].y && mt->x*FRACUNIT == vertexes[vi1].x && mt->z*FRACUNIT == vertexes[vi1].z))
|
||||
P_SpawnMobj(vertexes[vi3].x, vertexes[vi3].y, vertexes[vi3].z, MT_GFZFLOWER1);
|
||||
else
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
vt1.x = FIXED_TO_FLOAT(vertexes[vi1].x);
|
||||
vt1.y = FIXED_TO_FLOAT(vertexes[vi1].y);
|
||||
vt2.x = FIXED_TO_FLOAT(vertexes[vi2].x);
|
||||
vt2.y = FIXED_TO_FLOAT(vertexes[vi2].y);
|
||||
vt3.x = FIXED_TO_FLOAT(vertexes[vi3].x);
|
||||
vt3.y = FIXED_TO_FLOAT(vertexes[vi3].y);
|
||||
|
||||
for(j = 0; j < 2; j++)
|
||||
{
|
||||
|
||||
fixed_t z3;
|
||||
//I_Error("Lo hicimos");
|
||||
|
||||
vt1.z = mt->z;//FIXED_TO_FLOAT(j==0 ? sec->floorheight : sec->ceilingheight);
|
||||
vt2.z = mt->z;//FIXED_TO_FLOAT(j==0? sec->floorheight : sec->ceilingheight);
|
||||
z3 = mt->z;//j==0? sec->floorheight : sec->ceilingheight; // Destination height
|
||||
vt3.z = FIXED_TO_FLOAT(z3);
|
||||
|
||||
if (P_PointOnLineSide(vertexes[vi3].x, vertexes[vi3].y, sec->lines[0]) == 0)
|
||||
{
|
||||
vec1.x = vt2.x - vt3.x;
|
||||
vec1.y = vt2.y - vt3.y;
|
||||
vec1.z = vt2.z - vt3.z;
|
||||
|
||||
vec2.x = vt1.x - vt3.x;
|
||||
vec2.y = vt1.y - vt3.y;
|
||||
vec2.z = vt1.z - vt3.z;
|
||||
}
|
||||
else
|
||||
{
|
||||
vec1.x = vt1.x - vt3.x;
|
||||
vec1.y = vt1.y - vt3.y;
|
||||
vec1.z = vt1.z - vt3.z;
|
||||
|
||||
vec2.x = vt2.x - vt3.x;
|
||||
vec2.y = vt2.y - vt3.y;
|
||||
vec2.z = vt2.z - vt3.z;
|
||||
}
|
||||
|
||||
|
||||
pslope_t *ret = Z_Malloc(sizeof(pslope_t), PU_LEVEL, NULL);
|
||||
memset(ret, 0, sizeof(*ret));
|
||||
|
||||
{
|
||||
M_CrossProduct3f(&ret->normalf, &vec1, &vec2);
|
||||
|
||||
// Cross product length
|
||||
float len = (float)sqrt(ret->normalf.x * ret->normalf.x +
|
||||
ret->normalf.y * ret->normalf.y +
|
||||
ret->normalf.z * ret->normalf.z);
|
||||
|
||||
if (len == 0)
|
||||
{
|
||||
// Only happens when all vertices in this sector are on the same line.
|
||||
// Let's just ignore this case.
|
||||
//CONS_Printf("Slope thing at (%d,%d) lies directly on its target line.\n", (int)(x>>16), (int)(y>>16));
|
||||
return;
|
||||
}
|
||||
// cross/len
|
||||
ret->normalf.x /= len;
|
||||
ret->normalf.y /= len;
|
||||
ret->normalf.z /= len;
|
||||
|
||||
// ZDoom cross = ret->normalf
|
||||
// Fix backward normals
|
||||
if ((ret->normalf.z < 0 && j == 0) || (ret->normalf.z > 0 && j == 1))
|
||||
{
|
||||
// cross = -cross
|
||||
ret->normalf.x = -ret->normalf.x;
|
||||
ret->normalf.y = -ret->normalf.x;
|
||||
ret->normalf.z = -ret->normalf.x;
|
||||
}
|
||||
}
|
||||
|
||||
secplane_t *srcplane = Z_Calloc(sizeof(*srcplane), PU_LEVEL, NULL);
|
||||
|
||||
srcplane->a = FLOAT_TO_FIXED (ret->normalf.x);
|
||||
srcplane->b = FLOAT_TO_FIXED (ret->normalf.y);
|
||||
srcplane->c = FLOAT_TO_FIXED (ret->normalf.z);
|
||||
//srcplane->ic = FixedDiv(FRACUNIT, srcplane->c);
|
||||
srcplane->d = -TMulScale16 (srcplane->a, vertexes[vi3].x,
|
||||
srcplane->b, vertexes[vi3].y,
|
||||
srcplane->c, z3);
|
||||
|
||||
if (j == 0)
|
||||
{
|
||||
sec->f_slope = ret;
|
||||
sec->f_slope->secplane = *srcplane;
|
||||
}
|
||||
else if (j == 1)
|
||||
{
|
||||
sec->c_slope = ret;
|
||||
sec->c_slope->secplane = *srcplane;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Z_Free(datastart);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
// Reset the dynamic slopes pointer, and read all of the fancy schmancy slopes
|
||||
void P_ResetDynamicSlopes(void) {
|
||||
size_t i;
|
||||
#if 1 // Rewrite old specials to new ones, and give a console warning
|
||||
#ifdef ESLOPE_TYPESHIM // Rewrite old specials to new ones, and give a console warning
|
||||
boolean warned = false;
|
||||
#endif
|
||||
|
||||
|
@ -894,7 +631,7 @@ void P_ResetDynamicSlopes(void) {
|
|||
{
|
||||
switch (lines[i].special)
|
||||
{
|
||||
#if 1 // Rewrite old specials to new ones, and give a console warning
|
||||
#ifdef ESLOPE_TYPESHIM // Rewrite old specials to new ones, and give a console warning
|
||||
#define WARNME if (!warned) {warned = true; CONS_Alert(CONS_WARNING, "This level uses old slope specials.\nA conversion will be needed before 2.2's release.\n");}
|
||||
case 386:
|
||||
case 387:
|
||||
|
@ -1018,7 +755,11 @@ fixed_t P_GetZAt(pslope_t *slope, fixed_t x, fixed_t y)
|
|||
// When given a vector, rotates it and aligns it to a slope
|
||||
void P_QuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope)
|
||||
{
|
||||
vector3_t axis;
|
||||
vector3_t axis; // Fuck you, C90.
|
||||
|
||||
if (slope->flags & SL_NOPHYSICS)
|
||||
return; // No physics, no quantizing.
|
||||
|
||||
axis.x = -slope->d.y;
|
||||
axis.y = slope->d.x;
|
||||
axis.z = 0;
|
||||
|
@ -1026,11 +767,24 @@ void P_QuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope)
|
|||
FV3_Rotate(momentum, &axis, slope->zangle >> ANGLETOFINESHIFT);
|
||||
}
|
||||
|
||||
//
|
||||
// P_ReverseQuantizeMomentumToSlope
|
||||
//
|
||||
// When given a vector, rotates and aligns it to a flat surface (from being relative to a given slope)
|
||||
void P_ReverseQuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope)
|
||||
{
|
||||
slope->zangle = InvAngle(slope->zangle);
|
||||
P_QuantizeMomentumToSlope(momentum, slope);
|
||||
slope->zangle = InvAngle(slope->zangle);
|
||||
}
|
||||
|
||||
//
|
||||
// P_SlopeLaunch
|
||||
//
|
||||
// Handles slope ejection for objects
|
||||
void P_SlopeLaunch(mobj_t *mo)
|
||||
{
|
||||
if (!(mo->standingslope->flags & SL_NOPHYSICS)) // If there's physics, time for launching.
|
||||
{
|
||||
// Double the pre-rotation Z, then halve the post-rotation Z. This reduces the
|
||||
// vertical launch given from slopes while increasing the horizontal launch
|
||||
|
@ -1044,6 +798,7 @@ void P_SlopeLaunch(mobj_t *mo)
|
|||
mo->momx = slopemom.x;
|
||||
mo->momy = slopemom.y;
|
||||
mo->momz = slopemom.z/2;
|
||||
}
|
||||
|
||||
//CONS_Printf("Launched off of slope.\n");
|
||||
mo->standingslope = NULL;
|
||||
|
@ -1052,17 +807,21 @@ void P_SlopeLaunch(mobj_t *mo)
|
|||
// Function to help handle landing on slopes
|
||||
void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope)
|
||||
{
|
||||
vector3_t mom;
|
||||
vector3_t mom; // Ditto.
|
||||
|
||||
if (slope->flags & SL_NOPHYSICS) { // No physics, no need to make anything complicated.
|
||||
if (P_MobjFlip(thing)*(thing->momz) < 0) { // falling, land on slope
|
||||
thing->momz = -P_MobjFlip(thing);
|
||||
thing->standingslope = slope;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
mom.x = thing->momx;
|
||||
mom.y = thing->momy;
|
||||
mom.z = thing->momz*2;
|
||||
|
||||
//CONS_Printf("langing on slope\n");
|
||||
|
||||
// Reverse quantizing might could use its own function later
|
||||
slope->zangle = ANGLE_MAX-slope->zangle;
|
||||
P_QuantizeMomentumToSlope(&mom, slope);
|
||||
slope->zangle = ANGLE_MAX-slope->zangle;
|
||||
P_ReverseQuantizeMomentumToSlope(&mom, slope);
|
||||
|
||||
if (P_MobjFlip(thing)*mom.z < 0) { // falling, land on slope
|
||||
thing->momx = mom.x;
|
||||
|
@ -1082,6 +841,9 @@ void P_ButteredSlope(mobj_t *mo)
|
|||
if (!mo->standingslope)
|
||||
return;
|
||||
|
||||
if (mo->standingslope->flags & SL_NOPHYSICS)
|
||||
return; // No physics, no butter.
|
||||
|
||||
if (mo->flags & (MF_NOCLIPHEIGHT|MF_NOGRAVITY))
|
||||
return; // don't slide down slopes if you can't touch them or you're not affected by gravity
|
||||
|
||||
|
@ -1106,8 +868,6 @@ void P_ButteredSlope(mobj_t *mo)
|
|||
mult = FINECOSINE(angle >> ANGLETOFINESHIFT);
|
||||
}
|
||||
|
||||
//CONS_Printf("%d\n", mult);
|
||||
|
||||
thrust = FixedMul(thrust, FRACUNIT*2/3 + mult/8);
|
||||
}
|
||||
|
||||
|
@ -1115,10 +875,11 @@ void P_ButteredSlope(mobj_t *mo)
|
|||
thrust = FixedMul(thrust, FRACUNIT+P_AproxDistance(mo->momx, mo->momy)/16);
|
||||
// This makes it harder to zigzag up steep slopes, as well as allows greater top speed when rolling down
|
||||
|
||||
// Multiply by gravity
|
||||
thrust = FixedMul(thrust, gravity); // TODO account for per-sector gravity etc
|
||||
// Multiply by scale (gravity strength depends on mobj scale)
|
||||
thrust = FixedMul(thrust, mo->scale);
|
||||
// Let's get the gravity strength for the object...
|
||||
thrust = FixedMul(thrust, abs(P_GetMobjGravity(mo)));
|
||||
|
||||
// ... and its friction against the ground for good measure (divided by original friction to keep behaviour for normal slopes the same).
|
||||
thrust = FixedMul(thrust, FixedDiv(mo->friction, ORIG_FRICTION));
|
||||
|
||||
P_Thrust(mo, mo->standingslope->xydirection, thrust);
|
||||
}
|
||||
|
|
|
@ -21,26 +21,6 @@ void P_RunDynamicSlopes(void);
|
|||
// sectors.
|
||||
void P_SpawnSlope_Line(int linenum);
|
||||
|
||||
#ifdef SPRINGCLEAN
|
||||
// Loads just map objects that make slopes,
|
||||
// terrain affecting objects have to be spawned first
|
||||
void P_SetSlopesFromVertexHeights(lumpnum_t lumpnum);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
THING_SlopeFloorPointLine = 9500,
|
||||
THING_SlopeCeilingPointLine = 9501,
|
||||
THING_SetFloorSlope = 9502,
|
||||
THING_SetCeilingSlope = 9503,
|
||||
THING_CopyFloorPlane = 9510,
|
||||
THING_CopyCeilingPlane = 9511,
|
||||
THING_VavoomFloor=1500,
|
||||
THING_VavoomCeiling=1501,
|
||||
THING_VertexFloorZ=1504,
|
||||
THING_VertexCeilingZ=1505,
|
||||
} slopething_e;
|
||||
#endif
|
||||
|
||||
//
|
||||
// P_CopySectorSlope
|
||||
//
|
||||
|
@ -55,6 +35,7 @@ fixed_t P_GetZAt(pslope_t *slope, fixed_t x, fixed_t y);
|
|||
|
||||
// Lots of physics-based bullshit
|
||||
void P_QuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope);
|
||||
void P_ReverseQuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope);
|
||||
void P_SlopeLaunch(mobj_t *mo);
|
||||
void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope);
|
||||
void P_ButteredSlope(mobj_t *mo);
|
||||
|
|
31
src/p_spec.c
31
src/p_spec.c
|
@ -1188,7 +1188,12 @@ INT32 P_FindSpecialLineFromTag(INT16 special, INT16 tag, INT32 start)
|
|||
{
|
||||
start++;
|
||||
|
||||
while (lines[start].special != special)
|
||||
// This redundant check stops the compiler from complaining about function expansion
|
||||
// elsewhere for some reason and everything is awful
|
||||
if (start >= (INT32)numlines)
|
||||
return -1;
|
||||
|
||||
while (start < (INT32)numlines && lines[start].special != special)
|
||||
start++;
|
||||
|
||||
if (start >= (INT32)numlines)
|
||||
|
@ -1642,7 +1647,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
|||
mo = node->m_thing;
|
||||
if (mo->flags & MF_PUSHABLE)
|
||||
numpush++;
|
||||
node = node->m_snext;
|
||||
node = node->m_thinglist_next;
|
||||
}
|
||||
|
||||
if (triggerline->flags & ML_NOCLIMB) // Need at least or more
|
||||
|
@ -3145,7 +3150,7 @@ void P_SetupSignExit(player_t *player)
|
|||
thinker_t *think;
|
||||
INT32 numfound = 0;
|
||||
|
||||
for (; node; node = node->m_snext)
|
||||
for (; node; node = node->m_thinglist_next)
|
||||
{
|
||||
thing = node->m_thing;
|
||||
if (thing->type != MT_SIGN)
|
||||
|
@ -3309,7 +3314,7 @@ sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 n
|
|||
return rover->master->frontsector;
|
||||
}
|
||||
|
||||
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
|
||||
for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||
{
|
||||
if (GETSECSPECIAL(node->m_sector->special, section) == number)
|
||||
{
|
||||
|
@ -4658,7 +4663,7 @@ void P_PlayerInSpecialSector(player_t *player)
|
|||
P_RunSpecialSectorCheck(player, sector);
|
||||
|
||||
// Iterate through touching_sectorlist
|
||||
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
|
||||
for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||
{
|
||||
sector = node->m_sector;
|
||||
|
||||
|
@ -5309,7 +5314,7 @@ void T_LaserFlash(laserthink_t *flash)
|
|||
S_StartSound(§or->soundorg, sfx_laser);
|
||||
|
||||
// Seek out objects to DESTROY! MUAHAHHAHAHAA!!!*cough*
|
||||
for (node = sector->touching_thinglist; node && node->m_thing; node = node->m_snext)
|
||||
for (node = sector->touching_thinglist; node && node->m_thing; node = node->m_thinglist_next)
|
||||
{
|
||||
thing = node->m_thing;
|
||||
|
||||
|
@ -6580,7 +6585,7 @@ void T_Scroll(scroll_t *s)
|
|||
sector_t *psec;
|
||||
psec = sectors + sect;
|
||||
|
||||
for (node = psec->touching_thinglist; node; node = node->m_snext)
|
||||
for (node = psec->touching_thinglist; node; node = node->m_thinglist_next)
|
||||
{
|
||||
thing = node->m_thing;
|
||||
|
||||
|
@ -6602,7 +6607,7 @@ void T_Scroll(scroll_t *s)
|
|||
|
||||
if (!is3dblock)
|
||||
{
|
||||
for (node = sec->touching_thinglist; node; node = node->m_snext)
|
||||
for (node = sec->touching_thinglist; node; node = node->m_thinglist_next)
|
||||
{
|
||||
thing = node->m_thing;
|
||||
|
||||
|
@ -6643,7 +6648,7 @@ void T_Scroll(scroll_t *s)
|
|||
sector_t *psec;
|
||||
psec = sectors + sect;
|
||||
|
||||
for (node = psec->touching_thinglist; node; node = node->m_snext)
|
||||
for (node = psec->touching_thinglist; node; node = node->m_thinglist_next)
|
||||
{
|
||||
thing = node->m_thing;
|
||||
|
||||
|
@ -6665,7 +6670,7 @@ void T_Scroll(scroll_t *s)
|
|||
|
||||
if (!is3dblock)
|
||||
{
|
||||
for (node = sec->touching_thinglist; node; node = node->m_snext)
|
||||
for (node = sec->touching_thinglist; node; node = node->m_thinglist_next)
|
||||
{
|
||||
thing = node->m_thing;
|
||||
|
||||
|
@ -7015,7 +7020,7 @@ void T_Friction(friction_t *f)
|
|||
{
|
||||
if (thing->floorz != P_GetSpecialTopZ(thing, referrer, sec))
|
||||
{
|
||||
node = node->m_snext;
|
||||
node = node->m_thinglist_next;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -7033,7 +7038,7 @@ void T_Friction(friction_t *f)
|
|||
thing->movefactor = f->movefactor;
|
||||
}
|
||||
}
|
||||
node = node->m_snext;
|
||||
node = node->m_thinglist_next;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7373,7 +7378,7 @@ void T_Pusher(pusher_t *p)
|
|||
|
||||
// constant pushers p_wind and p_current
|
||||
node = sec->touching_thinglist; // things touching this sector
|
||||
for (; node; node = node->m_snext)
|
||||
for (; node; node = node->m_thinglist_next)
|
||||
{
|
||||
thing = node->m_thing;
|
||||
if (thing->flags & (MF_NOGRAVITY | MF_NOCLIP)
|
||||
|
|
299
src/p_user.c
299
src/p_user.c
|
@ -1685,7 +1685,7 @@ static void P_CheckBustableBlocks(player_t *player)
|
|||
player->mo->y += player->mo->momy;
|
||||
P_SetThingPosition(player->mo);
|
||||
|
||||
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
|
||||
for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||
{
|
||||
if (!node->m_sector)
|
||||
break;
|
||||
|
@ -1693,6 +1693,7 @@ static void P_CheckBustableBlocks(player_t *player)
|
|||
if (node->m_sector->ffloors)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
fixed_t topheight, bottomheight;
|
||||
|
||||
for (rover = node->m_sector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
|
@ -1718,42 +1719,45 @@ static void P_CheckBustableBlocks(player_t *player)
|
|||
if (!(rover->flags & FF_SHATTER) && (rover->flags & FF_ONLYKNUX) && !(player->charability == CA_GLIDEANDCLIMB))
|
||||
continue;
|
||||
|
||||
topheight = P_GetFOFTopZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL);
|
||||
bottomheight = P_GetFOFBottomZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL);
|
||||
|
||||
// Height checks
|
||||
if (rover->flags & FF_SHATTERBOTTOM)
|
||||
{
|
||||
if (player->mo->z+player->mo->momz + player->mo->height < *rover->bottomheight)
|
||||
if (player->mo->z+player->mo->momz + player->mo->height < bottomheight)
|
||||
continue;
|
||||
|
||||
if (player->mo->z+player->mo->height > *rover->bottomheight)
|
||||
if (player->mo->z+player->mo->height > bottomheight)
|
||||
continue;
|
||||
}
|
||||
else if (rover->flags & FF_SPINBUST)
|
||||
{
|
||||
if (player->mo->z+player->mo->momz > *rover->topheight)
|
||||
if (player->mo->z+player->mo->momz > topheight)
|
||||
continue;
|
||||
|
||||
if (player->mo->z + player->mo->height < *rover->bottomheight)
|
||||
if (player->mo->z + player->mo->height < bottomheight)
|
||||
continue;
|
||||
}
|
||||
else if (rover->flags & FF_SHATTER)
|
||||
{
|
||||
if (player->mo->z + player->mo->momz > *rover->topheight)
|
||||
if (player->mo->z + player->mo->momz > topheight)
|
||||
continue;
|
||||
|
||||
if (player->mo->z+player->mo->momz + player->mo->height < *rover->bottomheight)
|
||||
if (player->mo->z+player->mo->momz + player->mo->height < bottomheight)
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (player->mo->z >= *rover->topheight)
|
||||
if (player->mo->z >= topheight)
|
||||
continue;
|
||||
|
||||
if (player->mo->z + player->mo->height < *rover->bottomheight)
|
||||
if (player->mo->z + player->mo->height < bottomheight)
|
||||
continue;
|
||||
}
|
||||
|
||||
// Impede the player's fall a bit
|
||||
if (((rover->flags & FF_SPINBUST) || (rover->flags & FF_SHATTER)) && player->mo->z >= *rover->topheight)
|
||||
if (((rover->flags & FF_SPINBUST) || (rover->flags & FF_SHATTER)) && player->mo->z >= topheight)
|
||||
player->mo->momz >>= 1;
|
||||
else if (rover->flags & FF_SHATTER)
|
||||
{
|
||||
|
@ -1802,7 +1806,7 @@ static void P_CheckBouncySectors(player_t *player)
|
|||
player->mo->z += player->mo->momz;
|
||||
P_SetThingPosition(player->mo);
|
||||
|
||||
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
|
||||
for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||
{
|
||||
if (!node->m_sector)
|
||||
break;
|
||||
|
@ -1852,12 +1856,8 @@ static void P_CheckBouncySectors(player_t *player)
|
|||
momentum.y = player->mo->momy;
|
||||
momentum.z = player->mo->momz*2;
|
||||
|
||||
if (slope) {
|
||||
// Reverse quantizing might could use its own function later
|
||||
slope->zangle = ANGLE_MAX-slope->zangle;
|
||||
P_QuantizeMomentumToSlope(&momentum, slope);
|
||||
slope->zangle = ANGLE_MAX-slope->zangle;
|
||||
}
|
||||
if (slope)
|
||||
P_ReverseQuantizeMomentumToSlope(&momentum, slope);
|
||||
|
||||
newmom = momentum.z = -FixedMul(momentum.z,linedist)/2;
|
||||
#else
|
||||
|
@ -2275,24 +2275,25 @@ static void P_DoClimbing(player_t *player)
|
|||
fixed_t platy;
|
||||
subsector_t *glidesector;
|
||||
boolean climb = true;
|
||||
boolean onesided = ((player->lastsidehit != -1 && player->lastlinehit != -1) && !(lines[player->lastlinehit].backsector));
|
||||
|
||||
platx = P_ReturnThrustX(player->mo, player->mo->angle, player->mo->radius + FixedMul(8*FRACUNIT, player->mo->scale));
|
||||
platy = P_ReturnThrustY(player->mo, player->mo->angle, player->mo->radius + FixedMul(8*FRACUNIT, player->mo->scale));
|
||||
|
||||
glidesector = R_PointInSubsector(player->mo->x + platx, player->mo->y + platy);
|
||||
|
||||
if (glidesector->sector != player->mo->subsector->sector)
|
||||
if (onesided || glidesector->sector != player->mo->subsector->sector)
|
||||
{
|
||||
boolean floorclimb;
|
||||
boolean thrust;
|
||||
boolean boostup;
|
||||
boolean skyclimber;
|
||||
boolean floorclimb = false;
|
||||
boolean thrust = false;
|
||||
boolean boostup = false;
|
||||
boolean skyclimber = false;
|
||||
fixed_t floorheight, ceilingheight; // ESLOPE
|
||||
thrust = false;
|
||||
floorclimb = false;
|
||||
boostup = false;
|
||||
skyclimber = false;
|
||||
|
||||
if (onesided)
|
||||
floorclimb = true;
|
||||
else
|
||||
{
|
||||
#ifdef ESLOPE
|
||||
floorheight = glidesector->sector->f_slope ? P_GetZAt(glidesector->sector->f_slope, player->mo->x, player->mo->y)
|
||||
: glidesector->sector->floorheight;
|
||||
|
@ -2585,6 +2586,7 @@ static void P_DoClimbing(player_t *player)
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (player->lastsidehit != -1 && player->lastlinehit != -1)
|
||||
{
|
||||
|
@ -2844,94 +2846,20 @@ static boolean PIT_CheckSolidsTeeter(mobj_t *thing)
|
|||
//
|
||||
static void P_DoTeeter(player_t *player)
|
||||
{
|
||||
msecnode_t *node;
|
||||
boolean teeter = false;
|
||||
boolean roverfloor; // solid 3d floors?
|
||||
boolean checkedforteeter = false;
|
||||
fixed_t floorheight, ceilingheight;
|
||||
fixed_t topheight, bottomheight; // for 3d floor usage
|
||||
const fixed_t tiptop = FixedMul(MAXSTEPMOVE, player->mo->scale); // Distance you have to be above the ground in order to teeter.
|
||||
|
||||
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
|
||||
{
|
||||
// Ledge teetering. Check if any nearby sectors are low enough from your current one.
|
||||
checkedforteeter = true;
|
||||
roverfloor = false;
|
||||
if (node->m_sector->ffloors)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
for (rover = node->m_sector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
if (!(rover->flags & FF_EXISTS)) continue;
|
||||
|
||||
if (P_CheckSolidLava(player->mo, rover))
|
||||
;
|
||||
else if (!(rover->flags & FF_BLOCKPLAYER || rover->flags & FF_QUICKSAND))
|
||||
continue; // intangible 3d floor
|
||||
|
||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
if (*rover->bottomheight > node->m_sector->ceilingheight) // Above the ceiling
|
||||
continue;
|
||||
|
||||
if (*rover->bottomheight > player->mo->z + player->mo->height + tiptop
|
||||
|| (*rover->topheight < player->mo->z
|
||||
&& player->mo->z + player->mo->height < node->m_sector->ceilingheight - tiptop))
|
||||
{
|
||||
if (player->mo->standingslope && player->mo->standingslope->zdelta >= (FRACUNIT/2)) // Always teeter if the slope is too steep.
|
||||
teeter = true;
|
||||
roverfloor = true;
|
||||
}
|
||||
else
|
||||
else // Let's do some checks...
|
||||
{
|
||||
teeter = false;
|
||||
roverfloor = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (*rover->topheight < node->m_sector->floorheight) // Below the floor
|
||||
continue;
|
||||
|
||||
if (*rover->topheight < player->mo->z - tiptop
|
||||
|| (*rover->bottomheight > player->mo->z + player->mo->height
|
||||
&& player->mo->z > node->m_sector->floorheight + tiptop))
|
||||
{
|
||||
teeter = true;
|
||||
roverfloor = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
teeter = false;
|
||||
roverfloor = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!teeter && !roverfloor)
|
||||
{
|
||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
if (node->m_sector->ceilingheight > player->mo->z + player->mo->height + tiptop)
|
||||
teeter = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (node->m_sector->floorheight < player->mo->z - tiptop)
|
||||
teeter = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (checkedforteeter && !teeter) // Backup code
|
||||
{
|
||||
subsector_t *subsec[4]; // changed abcd into array instead
|
||||
UINT8 i;
|
||||
|
||||
subsec[0] = R_PointInSubsector(player->mo->x + FixedMul(5*FRACUNIT, player->mo->scale), player->mo->y + FixedMul(5*FRACUNIT, player->mo->scale));
|
||||
subsec[1] = R_PointInSubsector(player->mo->x - FixedMul(5*FRACUNIT, player->mo->scale), player->mo->y + FixedMul(5*FRACUNIT, player->mo->scale));
|
||||
subsec[2] = R_PointInSubsector(player->mo->x + FixedMul(5*FRACUNIT, player->mo->scale), player->mo->y - FixedMul(5*FRACUNIT, player->mo->scale));
|
||||
subsec[3] = R_PointInSubsector(player->mo->x - FixedMul(5*FRACUNIT, player->mo->scale), player->mo->y - FixedMul(5*FRACUNIT, player->mo->scale));
|
||||
sector_t *sec;
|
||||
fixed_t highestceilingheight = INT32_MIN;
|
||||
fixed_t lowestfloorheight = INT32_MAX;
|
||||
|
||||
teeter = false;
|
||||
roverfloor = false;
|
||||
|
@ -2939,13 +2867,43 @@ static void P_DoTeeter(player_t *player)
|
|||
{
|
||||
ffloor_t *rover;
|
||||
|
||||
if (!(subsec[i]->sector->ffloors))
|
||||
#define xsign ((i & 1) ? -1 : 1) // 0 -> 1 | 1 -> -1 | 2 -> 1 | 3 -> -1
|
||||
#define ysign ((i & 2) ? 1 : -1) // 0 -> 1 | 1 -> 1 | 2 -> -1 | 3 -> -1
|
||||
fixed_t checkx = player->mo->x + (xsign*FixedMul(5*FRACUNIT, player->mo->scale));
|
||||
fixed_t checky = player->mo->y + (ysign*FixedMul(5*FRACUNIT, player->mo->scale));
|
||||
#undef xsign
|
||||
#undef ysign
|
||||
|
||||
sec = R_PointInSubsector(checkx, checky)->sector;
|
||||
|
||||
ceilingheight = sec->ceilingheight;
|
||||
floorheight = sec->floorheight;
|
||||
#ifdef ESLOPE
|
||||
if (sec->c_slope)
|
||||
ceilingheight = P_GetZAt(sec->c_slope, checkx, checky);
|
||||
if (sec->f_slope)
|
||||
floorheight = P_GetZAt(sec->f_slope, checkx, checky);
|
||||
#endif
|
||||
highestceilingheight = (ceilingheight > highestceilingheight) ? ceilingheight : highestceilingheight;
|
||||
lowestfloorheight = (floorheight < lowestfloorheight) ? floorheight : lowestfloorheight;
|
||||
|
||||
if (!(sec->ffloors))
|
||||
continue; // move on to the next subsector
|
||||
|
||||
for (rover = subsec[i]->sector->ffloors; rover; rover = rover->next)
|
||||
for (rover = sec->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
if (!(rover->flags & FF_EXISTS)) continue;
|
||||
|
||||
topheight = *rover->topheight;
|
||||
bottomheight = *rover->bottomheight;
|
||||
|
||||
#ifdef ESLOPE
|
||||
if (*rover->t_slope)
|
||||
topheight = P_GetZAt(*rover->t_slope, player->mo->x, player->mo->y);
|
||||
if (*rover->b_slope)
|
||||
bottomheight = P_GetZAt(*rover->b_slope, player->mo->x, player->mo->y);
|
||||
#endif
|
||||
|
||||
if (P_CheckSolidLava(player->mo, rover))
|
||||
;
|
||||
else if (!(rover->flags & FF_BLOCKPLAYER || rover->flags & FF_QUICKSAND))
|
||||
|
@ -2953,12 +2911,12 @@ static void P_DoTeeter(player_t *player)
|
|||
|
||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
if (*rover->bottomheight > subsec[i]->sector->ceilingheight) // Above the ceiling
|
||||
if (bottomheight > ceilingheight) // Above the ceiling
|
||||
continue;
|
||||
|
||||
if (*rover->bottomheight > player->mo->z + player->mo->height + tiptop
|
||||
|| (*rover->topheight < player->mo->z
|
||||
&& player->mo->z + player->mo->height < subsec[i]->sector->ceilingheight - tiptop))
|
||||
if (bottomheight > player->mo->z + player->mo->height + tiptop
|
||||
|| (topheight < player->mo->z
|
||||
&& player->mo->z + player->mo->height < ceilingheight - tiptop))
|
||||
{
|
||||
teeter = true;
|
||||
roverfloor = true;
|
||||
|
@ -2972,12 +2930,12 @@ static void P_DoTeeter(player_t *player)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (*rover->topheight < subsec[i]->sector->floorheight) // Below the floor
|
||||
if (topheight < floorheight) // Below the floor
|
||||
continue;
|
||||
|
||||
if (*rover->topheight < player->mo->z - tiptop
|
||||
|| (*rover->bottomheight > player->mo->z + player->mo->height
|
||||
&& player->mo->z > subsec[i]->sector->floorheight + tiptop))
|
||||
if (topheight < player->mo->z - tiptop
|
||||
|| (bottomheight > player->mo->z + player->mo->height
|
||||
&& player->mo->z > floorheight + tiptop))
|
||||
{
|
||||
teeter = true;
|
||||
roverfloor = true;
|
||||
|
@ -2995,18 +2953,12 @@ static void P_DoTeeter(player_t *player)
|
|||
|
||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
if (!teeter && !roverfloor && (subsec[0]->sector->ceilingheight > player->mo->ceilingz + tiptop
|
||||
|| subsec[1]->sector->ceilingheight > player->mo->ceilingz + tiptop
|
||||
|| subsec[2]->sector->ceilingheight > player->mo->ceilingz + tiptop
|
||||
|| subsec[3]->sector->ceilingheight > player->mo->ceilingz + tiptop))
|
||||
if (!teeter && !roverfloor && (highestceilingheight > player->mo->ceilingz + tiptop))
|
||||
teeter = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!teeter && !roverfloor && (subsec[0]->sector->floorheight < player->mo->floorz - tiptop
|
||||
|| subsec[1]->sector->floorheight < player->mo->floorz - tiptop
|
||||
|| subsec[2]->sector->floorheight < player->mo->floorz - tiptop
|
||||
|| subsec[3]->sector->floorheight < player->mo->floorz - tiptop))
|
||||
if (!teeter && !roverfloor && (lowestfloorheight < player->mo->floorz - tiptop))
|
||||
teeter = true;
|
||||
}
|
||||
}
|
||||
|
@ -3142,7 +3094,7 @@ teeterdone:
|
|||
if (player->panim == PA_IDLE)
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_EDGE);
|
||||
}
|
||||
else if (checkedforteeter && player->panim == PA_EDGE)
|
||||
else if (player->panim == PA_EDGE)
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_STND);
|
||||
}
|
||||
|
||||
|
@ -3501,6 +3453,9 @@ static void P_DoSuperStuff(player_t *player)
|
|||
case S_PLAY_SUPER_RUN:
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_RUN);
|
||||
break;
|
||||
case S_PLAY_SUPER_PEEL:
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_PEEL);
|
||||
break;
|
||||
case S_PLAY_SUPER_PAIN:
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_PAIN);
|
||||
break;
|
||||
|
@ -3758,7 +3713,7 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd)
|
|||
{
|
||||
if ((cmd->buttons & BT_USE) && player->speed < FixedMul(5<<FRACBITS, player->mo->scale) && !player->mo->momz && onground && !(player->pflags & PF_USEDOWN) && !(player->pflags & PF_SPINNING)
|
||||
#ifdef ESLOPE
|
||||
&& (!player->mo->standingslope || abs(player->mo->standingslope->zdelta) < FRACUNIT/2)
|
||||
&& (!player->mo->standingslope || (player->mo->standingslope->flags & SL_NOPHYSICS) || abs(player->mo->standingslope->zdelta) < FRACUNIT/2)
|
||||
#endif
|
||||
)
|
||||
{
|
||||
|
@ -3794,7 +3749,7 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd)
|
|||
else if ((cmd->buttons & BT_USE || ((twodlevel || (player->mo->flags2 & MF2_TWOD)) && cmd->forwardmove < -20))
|
||||
&& !player->climbing && !player->mo->momz && onground && (player->speed > FixedMul(5<<FRACBITS, player->mo->scale)
|
||||
#ifdef ESLOPE
|
||||
|| (player->mo->standingslope && abs(player->mo->standingslope->zdelta) >= FRACUNIT/2)
|
||||
|| (player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)) && abs(player->mo->standingslope->zdelta) >= FRACUNIT/2)
|
||||
#endif
|
||||
) && !(player->pflags & PF_USEDOWN) && !(player->pflags & PF_SPINNING))
|
||||
{
|
||||
|
@ -3810,7 +3765,7 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd)
|
|||
if (onground && player->pflags & PF_SPINNING && !(player->pflags & PF_STARTDASH)
|
||||
&& player->speed < FixedMul(5*FRACUNIT,player->mo->scale)
|
||||
#ifdef ESLOPE
|
||||
&& (!player->mo->standingslope || abs(player->mo->standingslope->zdelta) < FRACUNIT/2)
|
||||
&& (!player->mo->standingslope || (player->mo->standingslope->flags & SL_NOPHYSICS) || abs(player->mo->standingslope->zdelta) < FRACUNIT/2)
|
||||
#endif
|
||||
)
|
||||
{
|
||||
|
@ -4040,19 +3995,26 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
|
|||
case CA_THOK:
|
||||
case CA_HOMINGTHOK:
|
||||
case CA_JUMPTHOK: // Credit goes to CZ64 and Sryder13 for the original
|
||||
case CA_DASHMODE: // Credit goes to Iceman404
|
||||
// Now it's Sonic's abilities turn!
|
||||
// THOK!
|
||||
if (!(player->pflags & PF_THOKKED) || (player->charability2 == CA2_MULTIABILITY))
|
||||
{
|
||||
// Catapult the player
|
||||
fixed_t actionspd = player->actionspd;
|
||||
|
||||
if (player->charability == CA_DASHMODE)
|
||||
actionspd = max(player->normalspeed, FixedDiv(player->speed, player->mo->scale));
|
||||
|
||||
if (player->mo->eflags & MFE_UNDERWATER)
|
||||
actionspd >>= 1;
|
||||
|
||||
if ((player->charability == CA_JUMPTHOK) && !(player->pflags & PF_THOKKED))
|
||||
{
|
||||
player->pflags &= ~PF_JUMPED;
|
||||
P_DoJump(player, false);
|
||||
}
|
||||
|
||||
P_InstaThrust(player->mo, player->mo->angle, FixedMul(actionspd, player->mo->scale));
|
||||
|
||||
if (maptol & TOL_2D)
|
||||
|
@ -4799,7 +4761,7 @@ static void P_3dMovement(player_t *player)
|
|||
|
||||
#ifdef ESLOPE
|
||||
if ((totalthrust.x || totalthrust.y)
|
||||
&& player->mo->standingslope && abs(player->mo->standingslope->zdelta) > FRACUNIT/2) {
|
||||
&& player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)) && abs(player->mo->standingslope->zdelta) > FRACUNIT/2) {
|
||||
// Factor thrust to slope, but only for the part pushing up it!
|
||||
// The rest is unaffected.
|
||||
angle_t thrustangle = R_PointToAngle2(0, 0, totalthrust.x, totalthrust.y)-player->mo->standingslope->xydirection;
|
||||
|
@ -6500,9 +6462,12 @@ static void P_MovePlayer(player_t *player)
|
|||
|
||||
if ((cmd->forwardmove != 0 || cmd->sidemove != 0) || (player->powers[pw_super] && !onground))
|
||||
{
|
||||
// If the player is in dashmode, here's their peelout.
|
||||
if (player->charability == CA_DASHMODE && player->dashmode >= 3*TICRATE && player->panim == PA_RUN && !player->skidtime && (onground || player->powers[pw_super]))
|
||||
P_SetPlayerMobjState (player->mo, S_PLAY_PEEL);
|
||||
// If the player is moving fast enough,
|
||||
// break into a run!
|
||||
if (player->speed >= runspd && player->panim == PA_WALK && !player->skidtime && (onground || player->powers[pw_super]))
|
||||
else if (player->speed >= runspd && player->panim == PA_WALK && !player->skidtime && (onground || player->powers[pw_super]))
|
||||
P_SetPlayerMobjState (player->mo, S_PLAY_RUN);
|
||||
|
||||
// Super floating at slow speeds has its own special animation.
|
||||
|
@ -6514,6 +6479,11 @@ static void P_MovePlayer(player_t *player)
|
|||
P_SetPlayerMobjState (player->mo, S_PLAY_WALK);
|
||||
}
|
||||
|
||||
// If your peelout animation is playing, and you're
|
||||
// going too slow, switch back to the run.
|
||||
if (player->panim == PA_PEEL && player->dashmode < 3*TICRATE)
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_RUN);
|
||||
|
||||
// If your running animation is playing, and you're
|
||||
// going too slow, switch back to the walking frames.
|
||||
if (player->panim == PA_RUN && player->speed < runspd)
|
||||
|
@ -6844,7 +6814,7 @@ static void P_MovePlayer(player_t *player)
|
|||
#endif
|
||||
}
|
||||
// Otherwise, face the direction you're travelling.
|
||||
else if (player->panim == PA_WALK || player->panim == PA_RUN || player->panim == PA_ROLL
|
||||
else if (player->panim == PA_WALK || player->panim == PA_RUN || player->panim == PA_PEEL || player->panim == PA_ROLL
|
||||
|| (player->mo->state-states == S_PLAY_FLY || player->mo->state-states == S_PLAY_FLY_TIRED))
|
||||
player->mo->angle = R_PointToAngle2(0, 0, player->rmomx, player->rmomy);
|
||||
|
||||
|
@ -7055,6 +7025,7 @@ static void P_MovePlayer(player_t *player)
|
|||
msecnode_t *node; // only place it's being used in P_MovePlayer now
|
||||
fixed_t oldx;
|
||||
fixed_t oldy;
|
||||
fixed_t floorz, ceilingz;
|
||||
|
||||
oldx = player->mo->x;
|
||||
oldy = player->mo->y;
|
||||
|
@ -7064,7 +7035,7 @@ static void P_MovePlayer(player_t *player)
|
|||
player->mo->y += player->mo->momy;
|
||||
P_SetThingPosition(player->mo);
|
||||
|
||||
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
|
||||
for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||
{
|
||||
if (!node->m_sector)
|
||||
break;
|
||||
|
@ -7072,14 +7043,16 @@ static void P_MovePlayer(player_t *player)
|
|||
if (node->m_sector->ffloors)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
fixed_t topheight, bottomheight;
|
||||
|
||||
for (rover = node->m_sector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
if (!(rover->flags & FF_EXISTS)) continue;
|
||||
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER))
|
||||
continue;
|
||||
|
||||
if ((rover->flags & FF_BLOCKPLAYER))
|
||||
{
|
||||
if (*rover->topheight > player->mo->z && *rover->bottomheight < player->mo->z)
|
||||
topheight = P_GetFOFTopZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL);
|
||||
bottomheight = P_GetFOFBottomZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL);
|
||||
if (topheight > player->mo->z && bottomheight < player->mo->z)
|
||||
{
|
||||
P_ResetPlayer(player);
|
||||
S_StartSound(player->mo, sfx_s3k4a);
|
||||
|
@ -7089,14 +7062,15 @@ static void P_MovePlayer(player_t *player)
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (player->mo->z+player->mo->height > node->m_sector->ceilingheight
|
||||
floorz = P_GetFloorZ(player->mo, node->m_sector, player->mo->x, player->mo->y, NULL);
|
||||
ceilingz = P_GetCeilingZ(player->mo, node->m_sector, player->mo->x, player->mo->y, NULL);
|
||||
|
||||
if (player->mo->z+player->mo->height > ceilingz
|
||||
&& node->m_sector->ceilingpic == skyflatnum)
|
||||
continue;
|
||||
|
||||
if (node->m_sector->floorheight > player->mo->z
|
||||
|| node->m_sector->ceilingheight < player->mo->z)
|
||||
if (floorz > player->mo->z || ceilingz < player->mo->z)
|
||||
{
|
||||
P_ResetPlayer(player);
|
||||
S_StartSound(player->mo, sfx_s3k4a);
|
||||
|
@ -9162,6 +9136,49 @@ void P_PlayerThink(player_t *player)
|
|||
|
||||
player->pflags &= ~PF_SLIDING;
|
||||
|
||||
#define dashmode player->dashmode
|
||||
// Dash mode ability for Metal Sonic
|
||||
if ((player->charability == CA_DASHMODE) && !(maptol & TOL_NIGHTS)) // woo, dashmode! no nights tho.
|
||||
{
|
||||
if (player->speed >= FixedMul(player->runspeed, player->mo->scale) || (player->pflags & PF_STARTDASH))
|
||||
{
|
||||
dashmode++; // Counter. Adds 1 to dash mode per tic in top speed.
|
||||
if (dashmode == 3*TICRATE) // This isn't in the ">=" equation because it'd cause the sound to play infinitely.
|
||||
S_StartSound(player->mo, sfx_s3ka2); // If the player enters dashmode, play this sound on the the tic it starts.
|
||||
}
|
||||
else if (!(player->pflags & PF_SPINNING))
|
||||
{
|
||||
if (dashmode > 3)
|
||||
dashmode -= 3; // Rather than lose it all, it gently counts back down!
|
||||
else
|
||||
dashmode = 0;
|
||||
}
|
||||
|
||||
if (dashmode < 3*TICRATE) // Exits Dash Mode if you drop below speed/dash counter tics. Not in the above block so it doesn't keep disabling in midair.
|
||||
{
|
||||
player->normalspeed = skins[player->skin].normalspeed; // Reset to default if not capable of entering dash mode.
|
||||
player->jumpfactor = skins[player->skin].jumpfactor;
|
||||
}
|
||||
else if (P_IsObjectOnGround(player->mo)) // Activate dash mode if we're on the ground.
|
||||
{
|
||||
if (player->normalspeed < skins[player->skin].actionspd) // If the player normalspeed is not currently at actionspd in dash mode, add speed each tic
|
||||
player->normalspeed = player->normalspeed + 1*FRACUNIT/5; // Enter Dash Mode smoothly.
|
||||
|
||||
if (player->jumpfactor < FixedMul(skins[player->skin].jumpfactor, 5*FRACUNIT/4)) // Boost jump height.
|
||||
player->jumpfactor = player->jumpfactor + 1*FRACUNIT/300;
|
||||
}
|
||||
|
||||
dashmode = min(dashmode, 3*TICRATE + 3);
|
||||
|
||||
if (player->normalspeed >= skins[player->skin].actionspd)
|
||||
{
|
||||
mobj_t *ghost = P_SpawnGhostMobj(player->mo); // Spawns afterimages
|
||||
ghost->fuse = 2; // Makes the images fade quickly
|
||||
}
|
||||
}
|
||||
else
|
||||
dashmode = 0;
|
||||
#undef dashmode
|
||||
/*
|
||||
// Colormap verification
|
||||
{
|
||||
|
|
|
@ -30,7 +30,7 @@ typedef struct
|
|||
{
|
||||
// Block origin (always UL), which has already accounted for the internal origin of the patch.
|
||||
INT16 originx, originy;
|
||||
INT16 wad, lump;
|
||||
UINT16 wad, lump;
|
||||
} texpatch_t;
|
||||
|
||||
// A maptexturedef_t describes a rectangular texture,
|
||||
|
|
37
src/r_defs.h
37
src/r_defs.h
|
@ -500,10 +500,10 @@ typedef struct subsector_s
|
|||
// Sector list node showing all sectors an object appears in.
|
||||
//
|
||||
// There are two threads that flow through these nodes. The first thread
|
||||
// starts at touching_thinglist in a sector_t and flows through the m_snext
|
||||
// starts at touching_thinglist in a sector_t and flows through the m_thinglist_next
|
||||
// links to find all mobjs that are entirely or partially in the sector.
|
||||
// The second thread starts at touching_sectorlist in an mobj_t and flows
|
||||
// through the m_tnext links to find all sectors a thing touches. This is
|
||||
// through the m_sectorlist_next links to find all sectors a thing touches. This is
|
||||
// useful when applying friction or push effects to sectors. These effects
|
||||
// can be done as thinkers that act upon all objects touching their sectors.
|
||||
// As an mobj moves through the world, these nodes are created and
|
||||
|
@ -515,10 +515,10 @@ typedef struct msecnode_s
|
|||
{
|
||||
sector_t *m_sector; // a sector containing this object
|
||||
struct mobj_s *m_thing; // this object
|
||||
struct msecnode_s *m_tprev; // prev msecnode_t for this thing
|
||||
struct msecnode_s *m_tnext; // next msecnode_t for this thing
|
||||
struct msecnode_s *m_sprev; // prev msecnode_t for this sector
|
||||
struct msecnode_s *m_snext; // next msecnode_t for this sector
|
||||
struct msecnode_s *m_sectorlist_prev; // prev msecnode_t for this thing
|
||||
struct msecnode_s *m_sectorlist_next; // next msecnode_t for this thing
|
||||
struct msecnode_s *m_thinglist_prev; // prev msecnode_t for this sector
|
||||
struct msecnode_s *m_thinglist_next; // next msecnode_t for this sector
|
||||
boolean visited; // used in search algorithms
|
||||
} msecnode_t;
|
||||
|
||||
|
@ -526,10 +526,10 @@ typedef struct mprecipsecnode_s
|
|||
{
|
||||
sector_t *m_sector; // a sector containing this object
|
||||
struct precipmobj_s *m_thing; // this object
|
||||
struct mprecipsecnode_s *m_tprev; // prev msecnode_t for this thing
|
||||
struct mprecipsecnode_s *m_tnext; // next msecnode_t for this thing
|
||||
struct mprecipsecnode_s *m_sprev; // prev msecnode_t for this sector
|
||||
struct mprecipsecnode_s *m_snext; // next msecnode_t for this sector
|
||||
struct mprecipsecnode_s *m_sectorlist_prev; // prev msecnode_t for this thing
|
||||
struct mprecipsecnode_s *m_sectorlist_next; // next msecnode_t for this thing
|
||||
struct mprecipsecnode_s *m_thinglist_prev; // prev msecnode_t for this sector
|
||||
struct mprecipsecnode_s *m_thinglist_next; // next msecnode_t for this sector
|
||||
boolean visited; // used in search algorithms
|
||||
} mprecipsecnode_t;
|
||||
|
||||
|
@ -729,23 +729,36 @@ typedef struct
|
|||
#pragma pack()
|
||||
#endif
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SRF_SINGLE = 0, // 0-angle for all rotations
|
||||
SRF_3D = 1, // Angles 1-8
|
||||
SRF_LEFT = 2, // Left side uses single patch
|
||||
SRF_RIGHT = 4, // Right side uses single patch
|
||||
SRF_2D = SRF_LEFT|SRF_RIGHT, // 6
|
||||
SRF_NONE = 0xff // Initial value
|
||||
} spriterotateflags_t; // SRF's up!
|
||||
|
||||
//
|
||||
// Sprites are patches with a special naming convention so they can be
|
||||
// recognized by R_InitSprites.
|
||||
// The base name is NNNNFx or NNNNFxFx, with x indicating the rotation,
|
||||
// x = 0, 1-7.
|
||||
// x = 0, 1-8, L/R
|
||||
// The sprite and frame specified by a thing_t is range checked at run time.
|
||||
// A sprite is a patch_t that is assumed to represent a three dimensional
|
||||
// object and may have multiple rotations predrawn.
|
||||
// Horizontal flipping is used to save space, thus NNNNF2F5 defines a mirrored patch.
|
||||
// Some sprites will only have one picture used for all views: NNNNF0
|
||||
// Some sprites will take the entirety of the left side: NNNNFL
|
||||
// Or the right side: NNNNFR
|
||||
// Or both, mirrored: NNNNFLFR
|
||||
//
|
||||
typedef struct
|
||||
{
|
||||
// If false use 0 for any position.
|
||||
// Note: as eight entries are available, we might as well insert the same
|
||||
// name eight times.
|
||||
UINT8 rotate;
|
||||
UINT8 rotate; // see spriterotateflags_t above
|
||||
|
||||
// Lump to use for view angles 0-7.
|
||||
lumpnum_t lumppat[8]; // lump number 16 : 16 wad : lump
|
||||
|
|
|
@ -874,9 +874,9 @@ void R_DrawTiltedSplat_8(void)
|
|||
|
||||
colormap = planezlight[tiltlighting[ds_x1++]] + (ds_colormap - colormaps);
|
||||
|
||||
val = colormap[source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)]];
|
||||
val = source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)];
|
||||
if (val != TRANSPARENTPIXEL)
|
||||
*dest = val;
|
||||
*dest = colormap[val];
|
||||
dest++;
|
||||
iz += ds_sz.x;
|
||||
uz += ds_su.x;
|
||||
|
@ -913,9 +913,9 @@ void R_DrawTiltedSplat_8(void)
|
|||
for (i = SPANSIZE-1; i >= 0; i--)
|
||||
{
|
||||
colormap = planezlight[tiltlighting[ds_x1++]] + (ds_colormap - colormaps);
|
||||
val = colormap[source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)]];
|
||||
val = source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)];
|
||||
if (val != TRANSPARENTPIXEL)
|
||||
*dest = val;
|
||||
*dest = colormap[val];
|
||||
dest++;
|
||||
u += stepu;
|
||||
v += stepv;
|
||||
|
@ -931,9 +931,9 @@ void R_DrawTiltedSplat_8(void)
|
|||
u = (INT64)(startu);
|
||||
v = (INT64)(startv);
|
||||
colormap = planezlight[tiltlighting[ds_x1++]] + (ds_colormap - colormaps);
|
||||
val = colormap[source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)]];
|
||||
val = source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)];
|
||||
if (val != TRANSPARENTPIXEL)
|
||||
*dest = val;
|
||||
*dest = colormap[val];
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -954,9 +954,9 @@ void R_DrawTiltedSplat_8(void)
|
|||
for (; width != 0; width--)
|
||||
{
|
||||
colormap = planezlight[tiltlighting[ds_x1++]] + (ds_colormap - colormaps);
|
||||
val = colormap[source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)]];
|
||||
val = source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)];
|
||||
if (val != TRANSPARENTPIXEL)
|
||||
*dest = val;
|
||||
*dest = colormap[val];
|
||||
dest++;
|
||||
u += stepu;
|
||||
v += stepv;
|
||||
|
@ -1124,49 +1124,49 @@ void R_DrawTranslucentSplat_8 (void)
|
|||
// need!
|
||||
val = source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)];
|
||||
if (val != TRANSPARENTPIXEL)
|
||||
dest[0] = colormap[*(ds_transmap + (source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)] << 8) + dest[0])];
|
||||
dest[0] = colormap[*(ds_transmap + (val << 8) + dest[0])];
|
||||
xposition += xstep;
|
||||
yposition += ystep;
|
||||
|
||||
val = source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)];
|
||||
if (val != TRANSPARENTPIXEL)
|
||||
dest[1] = colormap[*(ds_transmap + (source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)] << 8) + dest[1])];
|
||||
dest[1] = colormap[*(ds_transmap + (val << 8) + dest[1])];
|
||||
xposition += xstep;
|
||||
yposition += ystep;
|
||||
|
||||
val = source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)];
|
||||
if (val != TRANSPARENTPIXEL)
|
||||
dest[2] = colormap[*(ds_transmap + (source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)] << 8) + dest[2])];
|
||||
dest[2] = colormap[*(ds_transmap + (val << 8) + dest[2])];
|
||||
xposition += xstep;
|
||||
yposition += ystep;
|
||||
|
||||
val = source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)];
|
||||
if (val != TRANSPARENTPIXEL)
|
||||
dest[3] = colormap[*(ds_transmap + (source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)] << 8) + dest[3])];
|
||||
dest[3] = colormap[*(ds_transmap + (val << 8) + dest[3])];
|
||||
xposition += xstep;
|
||||
yposition += ystep;
|
||||
|
||||
val = source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)];
|
||||
if (val != TRANSPARENTPIXEL)
|
||||
dest[4] = colormap[*(ds_transmap + (source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)] << 8) + dest[4])];
|
||||
dest[4] = colormap[*(ds_transmap + (val << 8) + dest[4])];
|
||||
xposition += xstep;
|
||||
yposition += ystep;
|
||||
|
||||
val = source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)];
|
||||
if (val != TRANSPARENTPIXEL)
|
||||
dest[5] = colormap[*(ds_transmap + (source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)] << 8) + dest[5])];
|
||||
dest[5] = colormap[*(ds_transmap + (val << 8) + dest[5])];
|
||||
xposition += xstep;
|
||||
yposition += ystep;
|
||||
|
||||
val = source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)];
|
||||
if (val != TRANSPARENTPIXEL)
|
||||
dest[6] = colormap[*(ds_transmap + (source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)] << 8) + dest[6])];
|
||||
dest[6] = colormap[*(ds_transmap + (val << 8) + dest[6])];
|
||||
xposition += xstep;
|
||||
yposition += ystep;
|
||||
|
||||
val = source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)];
|
||||
if (val != TRANSPARENTPIXEL)
|
||||
dest[7] = colormap[*(ds_transmap + (source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)] << 8) + dest[7])];
|
||||
dest[7] = colormap[*(ds_transmap + (val << 8) + dest[7])];
|
||||
xposition += xstep;
|
||||
yposition += ystep;
|
||||
|
||||
|
@ -1175,9 +1175,9 @@ void R_DrawTranslucentSplat_8 (void)
|
|||
}
|
||||
while (count--)
|
||||
{
|
||||
val =colormap[source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)]];
|
||||
val = source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)];
|
||||
if (val != TRANSPARENTPIXEL)
|
||||
*dest = colormap[*(ds_transmap + (source[((yposition >> nflatyshift) & nflatmask) | (xposition >> nflatxshift)] << 8) + *dest)];
|
||||
*dest = colormap[*(ds_transmap + (val << 8) + *dest)];
|
||||
|
||||
dest++;
|
||||
xposition += xstep;
|
||||
|
@ -1363,7 +1363,19 @@ void R_DrawColumnShadowed_8(void)
|
|||
|
||||
height = dc_lightlist[i].height >> LIGHTSCALESHIFT;
|
||||
if (solid)
|
||||
{
|
||||
bheight = dc_lightlist[i].botheight >> LIGHTSCALESHIFT;
|
||||
if (bheight < height)
|
||||
{
|
||||
// confounded slopes sometimes allow partial invertedness,
|
||||
// even including cases where the top and bottom heights
|
||||
// should actually be the same!
|
||||
// swap the height values as a workaround for this quirk
|
||||
INT32 temp = height;
|
||||
height = bheight;
|
||||
bheight = temp;
|
||||
}
|
||||
}
|
||||
if (height <= dc_yl)
|
||||
{
|
||||
dc_colormap = dc_lightlist[i].rcolormap;
|
||||
|
|
10
src/r_main.c
10
src/r_main.c
|
@ -771,7 +771,7 @@ subsector_t *R_PointInSubsector(fixed_t x, fixed_t y)
|
|||
}
|
||||
|
||||
//
|
||||
// R_IsPointInSubsector, same as above but returns 0 if not in subsector
|
||||
// R_IsPointInSubsector, same as above but returns 0 if not in subsector - this does not work in opengl because of polyvertex_t
|
||||
//
|
||||
subsector_t *R_IsPointInSubsector(fixed_t x, fixed_t y)
|
||||
{
|
||||
|
@ -919,9 +919,9 @@ void R_SkyboxFrame(player_t *player)
|
|||
}
|
||||
}
|
||||
if (mh->skybox_scalez > 0)
|
||||
viewz += player->awayviewmobj->z / mh->skybox_scalez;
|
||||
viewz += (player->awayviewmobj->z + 20*FRACUNIT) / mh->skybox_scalez;
|
||||
else if (mh->skybox_scalez < 0)
|
||||
viewz += player->awayviewmobj->z * -mh->skybox_scalez;
|
||||
viewz += (player->awayviewmobj->z + 20*FRACUNIT) * -mh->skybox_scalez;
|
||||
}
|
||||
else if (thiscam->chase)
|
||||
{
|
||||
|
@ -966,9 +966,9 @@ void R_SkyboxFrame(player_t *player)
|
|||
}
|
||||
}
|
||||
if (mh->skybox_scalez > 0)
|
||||
viewz += thiscam->z / mh->skybox_scalez;
|
||||
viewz += (thiscam->z + (thiscam->height>>1)) / mh->skybox_scalez;
|
||||
else if (mh->skybox_scalez < 0)
|
||||
viewz += thiscam->z * -mh->skybox_scalez;
|
||||
viewz += (thiscam->z + (thiscam->height>>1)) * -mh->skybox_scalez;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -87,7 +87,7 @@ extern lighttable_t **planezlight;
|
|||
extern fixed_t *yslope;
|
||||
extern fixed_t distscale[MAXVIDWIDTH];
|
||||
|
||||
void R_InitPlanes(void);
|
||||
FUNCMATH void R_InitPlanes(void);
|
||||
void R_PortalStoreClipValues(INT32 start, INT32 end, INT16 *ceil, INT16 *floor, fixed_t *scale);
|
||||
void R_PortalRestoreClipValues(INT32 start, INT32 end, INT16 *ceil, INT16 *floor, fixed_t *scale);
|
||||
void R_ClearPlanes(void);
|
||||
|
|
53
src/r_segs.c
53
src/r_segs.c
|
@ -1453,9 +1453,11 @@ static void R_RenderSegLoop (void)
|
|||
frontscale[rw_x] = rw_scale;
|
||||
|
||||
// draw the wall tiers
|
||||
if (midtexture && yl <= yh && yh < vid.height && yh > 0)
|
||||
if (midtexture)
|
||||
{
|
||||
// single sided line
|
||||
if (yl <= yh && yh >= 0 && yl < viewheight)
|
||||
{
|
||||
dc_yl = yl;
|
||||
dc_yh = yh;
|
||||
dc_texturemid = rw_midtexturemid;
|
||||
|
@ -1483,6 +1485,15 @@ static void R_RenderSegLoop (void)
|
|||
floorclip[rw_x] = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// note: don't use min/max macros, since casting from INT32 to INT16 is involved here
|
||||
if (markceiling)
|
||||
ceilingclip[rw_x] = (yl >= 0) ? ((yl > viewheight) ? (INT16)viewheight : (INT16)((INT16)yl - 1)) : -1;
|
||||
if (markfloor)
|
||||
floorclip[rw_x] = (yh < viewheight) ? ((yh < -1) ? -1 : (INT16)((INT16)yh + 1)) : (INT16)viewheight;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// two sided line
|
||||
if (toptexture)
|
||||
|
@ -1494,7 +1505,11 @@ static void R_RenderSegLoop (void)
|
|||
if (mid >= floorclip[rw_x])
|
||||
mid = floorclip[rw_x]-1;
|
||||
|
||||
if (mid >= yl && yh < vid.height && yh > 0)
|
||||
if (mid >= yl) // back ceiling lower than front ceiling ?
|
||||
{
|
||||
if (yl >= viewheight) // entirely off bottom of screen
|
||||
ceilingclip[rw_x] = (INT16)viewheight;
|
||||
else if (mid >= 0) // safe to draw top texture
|
||||
{
|
||||
dc_yl = yl;
|
||||
dc_yh = mid;
|
||||
|
@ -1504,11 +1519,14 @@ static void R_RenderSegLoop (void)
|
|||
colfunc();
|
||||
ceilingclip[rw_x] = (INT16)mid;
|
||||
}
|
||||
else // entirely off top of screen
|
||||
ceilingclip[rw_x] = -1;
|
||||
}
|
||||
else
|
||||
ceilingclip[rw_x] = (INT16)((INT16)yl - 1);
|
||||
ceilingclip[rw_x] = (yl >= 0) ? ((yl > viewheight) ? (INT16)viewheight : (INT16)((INT16)yl - 1)) : -1;
|
||||
}
|
||||
else if (markceiling) // no top wall
|
||||
ceilingclip[rw_x] = (INT16)((INT16)yl - 1);
|
||||
ceilingclip[rw_x] = (yl >= 0) ? ((yl > viewheight) ? (INT16)viewheight : (INT16)((INT16)yl - 1)) : -1;
|
||||
|
||||
if (bottomtexture)
|
||||
{
|
||||
|
@ -1520,7 +1538,11 @@ static void R_RenderSegLoop (void)
|
|||
if (mid <= ceilingclip[rw_x])
|
||||
mid = ceilingclip[rw_x]+1;
|
||||
|
||||
if (mid <= yh && yh < vid.height && yh > 0)
|
||||
if (mid <= yh) // back floor higher than front floor ?
|
||||
{
|
||||
if (yh < 0) // entirely off top of screen
|
||||
floorclip[rw_x] = -1;
|
||||
else if (mid < viewheight) // safe to draw bottom texture
|
||||
{
|
||||
dc_yl = mid;
|
||||
dc_yh = yh;
|
||||
|
@ -1531,11 +1553,14 @@ static void R_RenderSegLoop (void)
|
|||
colfunc();
|
||||
floorclip[rw_x] = (INT16)mid;
|
||||
}
|
||||
else // entirely off bottom of screen
|
||||
floorclip[rw_x] = (INT16)viewheight;
|
||||
}
|
||||
else
|
||||
floorclip[rw_x] = (INT16)((INT16)yh + 1);
|
||||
floorclip[rw_x] = (yh < viewheight) ? ((yh < -1) ? -1 : (INT16)((INT16)yh + 1)) : (INT16)viewheight;
|
||||
}
|
||||
else if (markfloor) // no bottom wall
|
||||
floorclip[rw_x] = (INT16)((INT16)yh + 1);
|
||||
floorclip[rw_x] = (yh < viewheight) ? ((yh < -1) ? -1 : (INT16)((INT16)yh + 1)) : (INT16)viewheight;
|
||||
}
|
||||
|
||||
if (maskedtexture || numthicksides)
|
||||
|
@ -1858,12 +1883,13 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
// a single sided line is terminal, so it must mark ends
|
||||
markfloor = markceiling = true;
|
||||
#ifdef ESLOPE
|
||||
if (!(linedef->flags & ML_EFFECT1)) {
|
||||
if (linedef->flags & ML_EFFECT2) {
|
||||
if (linedef->flags & ML_DONTPEGBOTTOM)
|
||||
rw_midtexturemid = frontsector->floorheight + textureheight[sidedef->midtexture] - viewz;
|
||||
else
|
||||
rw_midtexturemid = frontsector->ceilingheight;
|
||||
rw_midtexturemid = frontsector->ceilingheight - viewz;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (linedef->flags & ML_DONTPEGBOTTOM)
|
||||
{
|
||||
|
@ -2482,6 +2508,15 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
#ifdef ESLOPE
|
||||
maskedtextureheight = ds_p->maskedtextureheight; // note to red, this == &(ds_p->maskedtextureheight[0])
|
||||
|
||||
#ifdef POLYOBJECTS
|
||||
if (curline->polyseg) { // use REAL front and back floors please, so midtexture rendering isn't mucked up
|
||||
rw_midtextureslide = rw_midtexturebackslide = 0;
|
||||
if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3))
|
||||
rw_midtexturemid = rw_midtextureback = max(curline->frontsector->floorheight, curline->backsector->floorheight) - viewz;
|
||||
else
|
||||
rw_midtexturemid = rw_midtextureback = min(curline->frontsector->ceilingheight, curline->backsector->ceilingheight) - viewz;
|
||||
} else
|
||||
#endif
|
||||
// Set midtexture starting height
|
||||
if (linedef->flags & ML_EFFECT2) { // Ignore slopes when texturing
|
||||
rw_midtextureslide = rw_midtexturebackslide = 0;
|
||||
|
|
|
@ -63,7 +63,11 @@ typedef struct floorsplat_s
|
|||
fixed_t P_SegLength(seg_t *seg);
|
||||
|
||||
// call at P_SetupLevel()
|
||||
#if !(defined (WALLSPLATS) || defined (FLOORSPLATS))
|
||||
FUNCMATH void R_ClearLevelSplats(void);
|
||||
#else
|
||||
void R_ClearLevelSplats(void);
|
||||
#endif
|
||||
|
||||
#ifdef WALLSPLATS
|
||||
void R_AddWallSplat(line_t *wallline, INT16 sectorside, const char *patchname, fixed_t top,
|
||||
|
|
110
src/r_things.c
110
src/r_things.c
|
@ -100,7 +100,7 @@ static void R_InstallSpriteLump(UINT16 wad, // graphics patch
|
|||
lumppat <<= 16;
|
||||
lumppat += lump;
|
||||
|
||||
if (frame >= 64 || rotation > 8)
|
||||
if (frame >= 64 || !(R_ValidSpriteAngle(rotation)))
|
||||
I_Error("R_InstallSpriteLump: Bad frame characters in lump %s", W_CheckNameForNum(lumppat));
|
||||
|
||||
if (maxframe ==(size_t)-1 || frame > maxframe)
|
||||
|
@ -109,31 +109,72 @@ static void R_InstallSpriteLump(UINT16 wad, // graphics patch
|
|||
if (rotation == 0)
|
||||
{
|
||||
// the lump should be used for all rotations
|
||||
if (sprtemp[frame].rotate == 0)
|
||||
if (sprtemp[frame].rotate == SRF_SINGLE)
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has multiple rot = 0 lump\n", spritename, cn);
|
||||
|
||||
if (sprtemp[frame].rotate == 1)
|
||||
else if (sprtemp[frame].rotate != SRF_NONE) // Let's bundle 1-8 and L/R rotations into one debug message.
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has rotations and a rot = 0 lump\n", spritename, cn);
|
||||
|
||||
sprtemp[frame].rotate = 0;
|
||||
sprtemp[frame].rotate = SRF_SINGLE;
|
||||
for (r = 0; r < 8; r++)
|
||||
{
|
||||
sprtemp[frame].lumppat[r] = lumppat;
|
||||
sprtemp[frame].lumpid[r] = lumpid;
|
||||
}
|
||||
sprtemp[frame].flip = flipped ? UINT8_MAX : 0;
|
||||
sprtemp[frame].flip = flipped ? 0xFF : 0; // 11111111 in binary
|
||||
return;
|
||||
}
|
||||
|
||||
if (rotation == ROT_L || rotation == ROT_R)
|
||||
{
|
||||
UINT8 rightfactor = ((rotation == ROT_R) ? 4 : 0);
|
||||
|
||||
// the lump should be used for half of all rotations
|
||||
if (sprtemp[frame].rotate == SRF_SINGLE)
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has L/R rotations and a rot = 0 lump\n", spritename, cn);
|
||||
else if (sprtemp[frame].rotate == SRF_3D)
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has both L/R and 1-8 rotations\n", spritename, cn);
|
||||
else if ((sprtemp[frame].rotate & SRF_LEFT) && (rotation == ROT_L))
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has multiple L rotations\n", spritename, cn);
|
||||
else if ((sprtemp[frame].rotate & SRF_RIGHT) && (rotation == ROT_R))
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has multiple R rotations\n", spritename, cn);
|
||||
|
||||
if (sprtemp[frame].rotate == SRF_NONE)
|
||||
sprtemp[frame].rotate = SRF_SINGLE;
|
||||
|
||||
sprtemp[frame].rotate |= ((rotation == ROT_R) ? SRF_RIGHT : SRF_LEFT);
|
||||
if (sprtemp[frame].rotate == (SRF_3D|SRF_2D))
|
||||
sprtemp[frame].rotate = SRF_2D; // SRF_3D|SRF_2D being enabled at the same time doesn't HURT in the current sprite angle implementation, but it DOES mean more to check in some of the helper functions. Let's not allow this scenario to happen.
|
||||
|
||||
for (r = 0; r < 4; r++) // Thanks to R_PrecacheLevel, we can't leave sprtemp[*].lumppat[*] == LUMPERROR... so we load into the front/back angle too.
|
||||
{
|
||||
sprtemp[frame].lumppat[r + rightfactor] = lumppat;
|
||||
sprtemp[frame].lumpid[r + rightfactor] = lumpid;
|
||||
}
|
||||
|
||||
if (flipped)
|
||||
sprtemp[frame].flip |= (0x0F<<rightfactor); // 00001111 or 11110000 in binary, depending on rotation being ROT_L or ROT_R
|
||||
else
|
||||
sprtemp[frame].flip &= ~(0x0F<<rightfactor); // ditto
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// the lump is only used for one rotation
|
||||
if (sprtemp[frame].rotate == 0)
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has rotations and a rot = 0 lump\n", spritename, cn);
|
||||
|
||||
sprtemp[frame].rotate = 1;
|
||||
if (sprtemp[frame].rotate == SRF_SINGLE)
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has 1-8 rotations and a rot = 0 lump\n", spritename, cn);
|
||||
else if ((sprtemp[frame].rotate != SRF_3D) && (sprtemp[frame].rotate != SRF_NONE))
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has both L/R and 1-8 rotations\n", spritename, cn);
|
||||
|
||||
// make 0 based
|
||||
rotation--;
|
||||
|
||||
if (rotation == 0 || rotation == 4) // Front or back...
|
||||
sprtemp[frame].rotate = SRF_3D; // Prevent L and R changeover
|
||||
else if (rotation > 3) // Right side
|
||||
sprtemp[frame].rotate = (SRF_3D | (sprtemp[frame].rotate & SRF_LEFT)); // Continue allowing L frame changeover
|
||||
else // if (rotation <= 3) // Left side
|
||||
sprtemp[frame].rotate = (SRF_3D | (sprtemp[frame].rotate & SRF_RIGHT)); // Continue allowing R frame changeover
|
||||
|
||||
if (sprtemp[frame].lumppat[rotation] != LUMPERROR)
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s: %c%c has two lumps mapped to it\n", spritename, cn, '1'+rotation);
|
||||
|
||||
|
@ -195,7 +236,7 @@ static boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef,
|
|||
frame = R_Char2Frame(lumpinfo[l].name[4]);
|
||||
rotation = (UINT8)(lumpinfo[l].name[5] - '0');
|
||||
|
||||
if (frame >= 64 || rotation > 8) // Give an actual NAME error -_-...
|
||||
if (frame >= 64 || !(R_ValidSpriteAngle(rotation))) // Give an actual NAME error -_-...
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Bad sprite name: %s\n"), W_CheckNameForNumPwad(wadnum,l));
|
||||
continue;
|
||||
|
@ -278,22 +319,29 @@ static boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef,
|
|||
{
|
||||
switch (sprtemp[frame].rotate)
|
||||
{
|
||||
case 0xff:
|
||||
case SRF_NONE:
|
||||
// no rotations were found for that frame at all
|
||||
I_Error("R_AddSingleSpriteDef: No patches found for %s frame %c", sprname, R_Frame2Char(frame));
|
||||
I_Error("R_AddSingleSpriteDef: No patches found for %.4s frame %c", sprname, R_Frame2Char(frame));
|
||||
break;
|
||||
|
||||
case 0:
|
||||
case SRF_SINGLE:
|
||||
// only the first rotation is needed
|
||||
break;
|
||||
|
||||
case 1:
|
||||
case SRF_2D: // both Left and Right rotations
|
||||
// we test to see whether the left and right slots are present
|
||||
if ((sprtemp[frame].lumppat[2] == LUMPERROR) || (sprtemp[frame].lumppat[6] == LUMPERROR))
|
||||
I_Error("R_AddSingleSpriteDef: Sprite %.4s frame %c is missing rotations",
|
||||
sprname, R_Frame2Char(frame));
|
||||
break;
|
||||
|
||||
default:
|
||||
// must have all 8 frames
|
||||
for (rotation = 0; rotation < 8; rotation++)
|
||||
// we test the patch lump, or the id lump whatever
|
||||
// if it was not loaded the two are LUMPERROR
|
||||
if (sprtemp[frame].lumppat[rotation] == LUMPERROR)
|
||||
I_Error("R_AddSingleSpriteDef: Sprite %s frame %c is missing rotations",
|
||||
I_Error("R_AddSingleSpriteDef: Sprite %.4s frame %c is missing rotations",
|
||||
sprname, R_Frame2Char(frame));
|
||||
break;
|
||||
}
|
||||
|
@ -1138,22 +1186,29 @@ static void R_ProjectSprite(mobj_t *thing)
|
|||
I_Error("R_ProjectSprite: sprframes NULL for sprite %d\n", thing->sprite);
|
||||
#endif
|
||||
|
||||
if (sprframe->rotate)
|
||||
{
|
||||
// choose a different rotation based on player view
|
||||
ang = R_PointToAngle (thing->x, thing->y);
|
||||
rot = (ang-thing->angle+ANGLE_202h)>>29;
|
||||
//Fab: lumpid is the index for spritewidth,spriteoffset... tables
|
||||
lump = sprframe->lumpid[rot];
|
||||
flip = sprframe->flip & (1<<rot);
|
||||
}
|
||||
else
|
||||
if (sprframe->rotate == SRF_SINGLE)
|
||||
{
|
||||
// use single rotation for all views
|
||||
rot = 0; //Fab: for vis->patch below
|
||||
lump = sprframe->lumpid[0]; //Fab: see note above
|
||||
flip = sprframe->flip; // Will only be 0x00 or 0xFF
|
||||
}
|
||||
else
|
||||
{
|
||||
// choose a different rotation based on player view
|
||||
ang = R_PointToAngle (thing->x, thing->y) - thing->angle;
|
||||
|
||||
if ((sprframe->rotate & SRF_RIGHT) && (ang < ANGLE_180)) // See from right
|
||||
rot = 6; // F7 slot
|
||||
else if ((sprframe->rotate & SRF_LEFT) && (ang >= ANGLE_180)) // See from left
|
||||
rot = 2; // F3 slot
|
||||
else // Normal behaviour
|
||||
rot = (ang+ANGLE_202h)>>29;
|
||||
|
||||
//Fab: lumpid is the index for spritewidth,spriteoffset... tables
|
||||
lump = sprframe->lumpid[rot];
|
||||
flip = sprframe->flip & (1<<rot);
|
||||
}
|
||||
|
||||
I_Assert(lump < max_spritelumps);
|
||||
|
||||
|
@ -1643,6 +1698,7 @@ void R_SortVisSprites(void)
|
|||
// Fix first and last. ds still points to the last one after the loop
|
||||
dsfirst->prev = &unsorted;
|
||||
unsorted.next = dsfirst;
|
||||
if (ds)
|
||||
ds->next = &unsorted;
|
||||
unsorted.prev = ds;
|
||||
|
||||
|
@ -2666,7 +2722,7 @@ next_token:
|
|||
if (z < lastlump) lastlump = z;
|
||||
|
||||
// load all sprite sets we are aware of.
|
||||
for (sprite2 = 0; sprite2 < NUMPLAYERSPRITES; sprite2++)
|
||||
for (sprite2 = 0; sprite2 < free_spr2; sprite2++)
|
||||
R_AddSingleSpriteDef(spr2names[sprite2], &skin->sprites[sprite2], wadnum, lump, lastlump);
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,10 @@
|
|||
#include "sounds.h"
|
||||
#include "r_plane.h"
|
||||
|
||||
// "Left" and "Right" character symbols for additional rotation functionality
|
||||
#define ROT_L ('L' - '0')
|
||||
#define ROT_R ('R' - '0')
|
||||
|
||||
// number of sprite lumps for spritewidth,offset,topoffset lookup tables
|
||||
// Fab: this is a hack : should allocate the lookup tables per sprite
|
||||
#define MAXVISSPRITES 2048 // added 2-2-98 was 128
|
||||
|
@ -230,4 +234,9 @@ FUNCMATH FUNCINLINE static ATTRINLINE UINT8 R_Char2Frame(char cn)
|
|||
#endif
|
||||
}
|
||||
|
||||
FUNCMATH FUNCINLINE static ATTRINLINE boolean R_ValidSpriteAngle(UINT8 rotation)
|
||||
{
|
||||
return ((rotation <= 8) || (rotation == ROT_L) || (rotation == ROT_R));
|
||||
}
|
||||
|
||||
#endif //__R_THINGS__
|
||||
|
|
|
@ -119,7 +119,7 @@ void S_ResumeAudio(void);
|
|||
//
|
||||
void S_UpdateSounds(void);
|
||||
|
||||
fixed_t S_CalculateSoundDistance(fixed_t px1, fixed_t py1, fixed_t pz1, fixed_t px2, fixed_t py2, fixed_t pz2);
|
||||
FUNCMATH fixed_t S_CalculateSoundDistance(fixed_t px1, fixed_t py1, fixed_t pz1, fixed_t px2, fixed_t py2, fixed_t pz2);
|
||||
|
||||
void S_SetDigMusicVolume(INT32 volume);
|
||||
void S_SetMIDIMusicVolume(INT32 volume);
|
||||
|
|
|
@ -69,6 +69,13 @@ consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE, CV_Unsigned, NULL, 0, N
|
|||
consvar_t cv_scr_depth = {"scr_depth", "16 bits", CV_SAVE, scr_depth_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
#endif
|
||||
consvar_t cv_renderview = {"renderview", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
#ifdef DIRECTFULLSCREEN
|
||||
static FUNCMATH void SCR_ChangeFullscreen (void);
|
||||
#else
|
||||
static void SCR_ChangeFullscreen (void);
|
||||
#endif
|
||||
|
||||
consvar_t cv_fullscreen = {"fullscreen", "Yes", CV_SAVE|CV_CALL, CV_YesNo, SCR_ChangeFullscreen, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
// =========================================================================
|
||||
|
|
|
@ -175,9 +175,7 @@ void SCR_SetDefaultMode (void);
|
|||
|
||||
void SCR_Startup (void);
|
||||
|
||||
void SCR_ChangeFullscreen (void);
|
||||
|
||||
boolean SCR_IsAspectCorrect(INT32 width, INT32 height);
|
||||
FUNCMATH boolean SCR_IsAspectCorrect(INT32 width, INT32 height);
|
||||
|
||||
// move out to main code for consistency
|
||||
void SCR_DisplayTicRate(void);
|
||||
|
|
|
@ -56,6 +56,15 @@ ifdef FREEBSD
|
|||
LIBS+=-lipx -lkvm
|
||||
endif
|
||||
|
||||
#
|
||||
#here is Mac OS X
|
||||
#
|
||||
ifdef MACOSX
|
||||
OBJS+=$(OBJDIR)/mac_resources.o
|
||||
OBJS+=$(OBJDIR)/mac_alert.o
|
||||
LIBS+=-framework CoreFoundation
|
||||
endif
|
||||
|
||||
#
|
||||
#here is GP2x (arm-gp2x-linux)
|
||||
#
|
||||
|
|
|
@ -167,6 +167,7 @@
|
|||
<ClInclude Include="..\lzf.h" />
|
||||
<ClInclude Include="..\md5.h" />
|
||||
<ClInclude Include="..\mserv.h" />
|
||||
<ClInclude Include="..\m_aatree.h" />
|
||||
<ClInclude Include="..\m_anigif.h" />
|
||||
<ClInclude Include="..\m_argv.h" />
|
||||
<ClInclude Include="..\m_bbox.h" />
|
||||
|
@ -308,6 +309,7 @@
|
|||
<ClCompile Include="..\lzf.c" />
|
||||
<ClCompile Include="..\md5.c" />
|
||||
<ClCompile Include="..\mserv.c" />
|
||||
<ClCompile Include="..\m_aatree.c" />
|
||||
<ClCompile Include="..\m_anigif.c" />
|
||||
<ClCompile Include="..\m_argv.c" />
|
||||
<ClCompile Include="..\m_bbox.c" />
|
||||
|
|
|
@ -294,6 +294,9 @@
|
|||
<ClInclude Include="..\md5.h">
|
||||
<Filter>M_Misc</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\m_aatree.h">
|
||||
<Filter>M_Misc</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\m_anigif.h">
|
||||
<Filter>M_Misc</Filter>
|
||||
</ClInclude>
|
||||
|
@ -666,6 +669,9 @@
|
|||
<ClCompile Include="..\md5.c">
|
||||
<Filter>M_Misc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\m_aatree.c">
|
||||
<Filter>M_Misc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\m_anigif.c">
|
||||
<Filter>M_Misc</Filter>
|
||||
</ClCompile>
|
||||
|
|
|
@ -12,25 +12,25 @@ consvar_t cd_volume = {"cd_volume","31",CV_SAVE,soundvolume_cons_t, NULL, 0, NUL
|
|||
consvar_t cdUpdate = {"cd_update","1",CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
|
||||
void I_InitCD(void){}
|
||||
FUNCMATH void I_InitCD(void){}
|
||||
|
||||
void I_StopCD(void){}
|
||||
FUNCMATH void I_StopCD(void){}
|
||||
|
||||
void I_PauseCD(void){}
|
||||
FUNCMATH void I_PauseCD(void){}
|
||||
|
||||
void I_ResumeCD(void){}
|
||||
FUNCMATH void I_ResumeCD(void){}
|
||||
|
||||
void I_ShutdownCD(void){}
|
||||
FUNCMATH void I_ShutdownCD(void){}
|
||||
|
||||
void I_UpdateCD(void){}
|
||||
FUNCMATH void I_UpdateCD(void){}
|
||||
|
||||
void I_PlayCD(UINT8 track, UINT8 looping)
|
||||
FUNCMATH void I_PlayCD(UINT8 track, UINT8 looping)
|
||||
{
|
||||
(void)track;
|
||||
(void)looping;
|
||||
}
|
||||
|
||||
boolean I_SetVolumeCD(int volume)
|
||||
FUNCMATH boolean I_SetVolumeCD(int volume)
|
||||
{
|
||||
(void)volume;
|
||||
return false;
|
||||
|
|
|
@ -2049,14 +2049,14 @@ void I_StartupMouse2(void)
|
|||
//
|
||||
// I_Tactile
|
||||
//
|
||||
void I_Tactile(FFType pFFType, const JoyFF_t *FFEffect)
|
||||
FUNCMATH void I_Tactile(FFType pFFType, const JoyFF_t *FFEffect)
|
||||
{
|
||||
// UNUSED.
|
||||
(void)pFFType;
|
||||
(void)FFEffect;
|
||||
}
|
||||
|
||||
void I_Tactile2(FFType pFFType, const JoyFF_t *FFEffect)
|
||||
FUNCMATH void I_Tactile2(FFType pFFType, const JoyFF_t *FFEffect)
|
||||
{
|
||||
// UNUSED.
|
||||
(void)pFFType;
|
||||
|
@ -2067,7 +2067,7 @@ void I_Tactile2(FFType pFFType, const JoyFF_t *FFEffect)
|
|||
*/
|
||||
static ticcmd_t emptycmd;
|
||||
|
||||
ticcmd_t *I_BaseTiccmd(void)
|
||||
FUNCMATH ticcmd_t *I_BaseTiccmd(void)
|
||||
{
|
||||
return &emptycmd;
|
||||
}
|
||||
|
@ -2076,7 +2076,7 @@ ticcmd_t *I_BaseTiccmd(void)
|
|||
*/
|
||||
static ticcmd_t emptycmd2;
|
||||
|
||||
ticcmd_t *I_BaseTiccmd2(void)
|
||||
FUNCMATH ticcmd_t *I_BaseTiccmd2(void)
|
||||
{
|
||||
return &emptycmd2;
|
||||
}
|
||||
|
@ -2179,7 +2179,7 @@ tic_t I_GetTime (void)
|
|||
//
|
||||
//I_StartupTimer
|
||||
//
|
||||
void I_StartupTimer(void)
|
||||
FUNCMATH void I_StartupTimer(void)
|
||||
{
|
||||
#if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX)
|
||||
// for win2k time bug
|
||||
|
@ -2313,11 +2313,11 @@ void I_WaitVBL(INT32 count)
|
|||
SDL_Delay(count);
|
||||
}
|
||||
|
||||
void I_BeginRead(void)
|
||||
FUNCMATH void I_BeginRead(void)
|
||||
{
|
||||
}
|
||||
|
||||
void I_EndRead(void)
|
||||
FUNCMATH void I_EndRead(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -3067,5 +3067,5 @@ const CPUInfoFlags *I_CPUInfo(void)
|
|||
}
|
||||
|
||||
// note CPUAFFINITY code used to reside here
|
||||
void I_RegisterSysCommands(void) {}
|
||||
FUNCMATH void I_RegisterSysCommands(void) {}
|
||||
#endif
|
||||
|
|
|
@ -1346,7 +1346,7 @@ void I_SetPalette(RGBA_t *palette)
|
|||
}
|
||||
|
||||
// return number of fullscreen + X11 modes
|
||||
INT32 VID_NumModes(void)
|
||||
FUNCMATH INT32 VID_NumModes(void)
|
||||
{
|
||||
if (USE_FULLSCREEN && numVidModes != -1)
|
||||
return numVidModes - firstEntry;
|
||||
|
@ -1354,7 +1354,7 @@ INT32 VID_NumModes(void)
|
|||
return MAXWINMODES;
|
||||
}
|
||||
|
||||
const char *VID_GetModeName(INT32 modeNum)
|
||||
FUNCMATH const char *VID_GetModeName(INT32 modeNum)
|
||||
{
|
||||
#if 0
|
||||
if (USE_FULLSCREEN && numVidModes != -1) // fullscreen modes
|
||||
|
@ -1384,7 +1384,7 @@ const char *VID_GetModeName(INT32 modeNum)
|
|||
return &vidModeName[modeNum][0];
|
||||
}
|
||||
|
||||
INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
||||
FUNCMATH INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MAXWINMODES; i++)
|
||||
|
|
|
@ -25,19 +25,38 @@
|
|||
#include "mac_alert.h"
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
|
||||
#define CFSTRINGIFY(x) CFStringCreateWithCString(NULL, x, kCFStringEncodingASCII)
|
||||
|
||||
int MacShowAlert(const char *title, const char *message, const char *button1, const char *button2, const char *button3)
|
||||
{
|
||||
CFOptionFlags results;
|
||||
|
||||
CFUserNotificationDisplayAlert(0,
|
||||
kCFUserNotificationStopAlertLevel | kCFUserNotificationNoDefaultButtonFlag,
|
||||
NULL, NULL, NULL,
|
||||
CFStringCreateWithCString(NULL, title, kCFStringEncodingASCII),
|
||||
CFStringCreateWithCString(NULL, message, kCFStringEncodingASCII),
|
||||
button1 != NULL ? CFStringCreateWithCString(NULL, button1, kCFStringEncodingASCII) : NULL,
|
||||
button2 != NULL ? CFStringCreateWithCString(NULL, button2, kCFStringEncodingASCII) : NULL,
|
||||
button3 != NULL ? CFStringCreateWithCString(NULL, button3, kCFStringEncodingASCII) : NULL,
|
||||
&results);
|
||||
CFStringRef cf_title = CFSTRINGIFY(title);
|
||||
CFStringRef cf_message = CFSTRINGIFY(message);
|
||||
CFStringRef cf_button1 = NULL;
|
||||
CFStringRef cf_button2 = NULL;
|
||||
CFStringRef cf_button3 = NULL;
|
||||
|
||||
if (button1 != NULL)
|
||||
cf_button1 = CFSTRINGIFY(button1);
|
||||
if (button2 != NULL)
|
||||
cf_button2 = CFSTRINGIFY(button2);
|
||||
if (button3 != NULL)
|
||||
cf_button3 = CFSTRINGIFY(button3);
|
||||
|
||||
CFOptionFlags alert_flags = kCFUserNotificationStopAlertLevel | kCFUserNotificationNoDefaultButtonFlag;
|
||||
|
||||
CFUserNotificationDisplayAlert(0, alert_flags, NULL, NULL, NULL, cf_title, cf_message,
|
||||
cf_button1, cf_button2, cf_button3, &results);
|
||||
|
||||
if (cf_button1 != NULL)
|
||||
CFRelease(cf_button1);
|
||||
if (cf_button2 != NULL)
|
||||
CFRelease(cf_button2);
|
||||
if (cf_button3 != NULL)
|
||||
CFRelease(cf_button3);
|
||||
CFRelease(cf_message);
|
||||
CFRelease(cf_title);
|
||||
|
||||
return (int)results;
|
||||
}
|
||||
|
|
|
@ -9,23 +9,29 @@ void OSX_GetResourcesPath(char * buffer)
|
|||
mainBundle = CFBundleGetMainBundle();
|
||||
if (mainBundle)
|
||||
{
|
||||
const int BUF_SIZE = 256; // because we somehow always know that
|
||||
|
||||
CFURLRef appUrlRef = CFBundleCopyBundleURL(mainBundle);
|
||||
CFStringRef macPath = CFURLCopyFileSystemPath(appUrlRef, kCFURLPOSIXPathStyle);
|
||||
CFStringRef resources = CFStringCreateWithCString(kCFAllocatorMalloc, "/Contents/Resources", kCFStringEncodingASCII);
|
||||
const void* rawarray[2] = {macPath, resources};
|
||||
CFArrayRef array = CFArrayCreate(kCFAllocatorMalloc, rawarray, 2, NULL);
|
||||
CFStringRef separator = CFStringCreateWithCString(kCFAllocatorMalloc, "", kCFStringEncodingASCII);
|
||||
CFStringRef fullPath = CFStringCreateByCombiningStrings(kCFAllocatorMalloc, array, separator);
|
||||
const char * path = CFStringGetCStringPtr(fullPath, kCFStringEncodingASCII);
|
||||
strcpy(buffer, path);
|
||||
CFRelease(fullPath);
|
||||
path = NULL;
|
||||
CFRelease(array);
|
||||
CFRelease(resources);
|
||||
CFRelease(macPath);
|
||||
CFRelease(appUrlRef);
|
||||
//CFRelease(mainBundle);
|
||||
CFRelease(separator);
|
||||
CFStringRef macPath;
|
||||
if (appUrlRef != NULL)
|
||||
macPath = CFURLCopyFileSystemPath(appUrlRef, kCFURLPOSIXPathStyle);
|
||||
else
|
||||
macPath = NULL;
|
||||
|
||||
const char* rawPath;
|
||||
|
||||
if (macPath != NULL)
|
||||
rawPath = CFStringGetCStringPtr(macPath, kCFStringEncodingASCII);
|
||||
else
|
||||
rawPath = NULL;
|
||||
|
||||
if (rawPath != NULL && (CFStringGetLength(macPath) + strlen("/Contents/Resources") < BUF_SIZE))
|
||||
{
|
||||
strcpy(buffer, rawPath);
|
||||
strcat(buffer, "/Contents/Resources");
|
||||
}
|
||||
|
||||
CFRelease(macPath);
|
||||
CFRelease(appUrlRef);
|
||||
}
|
||||
}
|
|
@ -126,7 +126,7 @@ void I_ShutdownSound(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
void I_UpdateSound(void)
|
||||
FUNCMATH void I_UpdateSound(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -464,7 +464,7 @@ static void mix_gme(void *udata, Uint8 *stream, int len)
|
|||
}
|
||||
#endif
|
||||
|
||||
void I_InitMusic(void)
|
||||
FUNCMATH void I_InitMusic(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -769,7 +769,7 @@ boolean I_SetSongTrack(int track)
|
|||
// MIDI Music
|
||||
//
|
||||
|
||||
void I_InitMIDIMusic(void)
|
||||
FUNCMATH void I_InitMIDIMusic(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -974,7 +974,7 @@ static void ST_drawNiGHTSHUD(void)
|
|||
if (cv_debug & DBG_NIGHTSBASIC)
|
||||
minlink = 0;
|
||||
|
||||
// Cheap hack: don't display when the score is showing
|
||||
// Cheap hack: don't display when the score is showing (it popping up for a split second when exiting a map is intentional)
|
||||
if (stplyr->texttimer && stplyr->textvar == 4)
|
||||
minlink = INT32_MAX;
|
||||
|
||||
|
@ -1385,6 +1385,10 @@ static void ST_drawMatchHUD(void)
|
|||
if (G_TagGametype() && !(stplyr->pflags & PF_TAGIT))
|
||||
return;
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_weaponrings)) {
|
||||
#endif
|
||||
|
||||
if (stplyr->powers[pw_infinityring])
|
||||
ST_drawWeaponRing(pw_infinityring, 0, 0, offset, infinityring);
|
||||
else if (stplyr->health > 1)
|
||||
|
@ -1408,6 +1412,12 @@ static void ST_drawMatchHUD(void)
|
|||
offset += 20;
|
||||
ST_drawWeaponRing(pw_railring, RW_RAIL, WEP_RAIL, offset, railring);
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
}
|
||||
|
||||
if (LUA_HudEnabled(hud_powerstones)) {
|
||||
#endif
|
||||
|
||||
// Power Stones collected
|
||||
offset = 136; // Used for Y now
|
||||
|
||||
|
@ -1439,6 +1449,10 @@ static void ST_drawMatchHUD(void)
|
|||
|
||||
if (stplyr->powers[pw_emeralds] & EMERALD7)
|
||||
V_DrawScaledPatch(28, STRINGY(offset), V_SNAPTOLEFT, tinyemeraldpics[6]);
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void ST_drawRaceHUD(void)
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
//
|
||||
|
||||
// Called by main loop.
|
||||
void ST_Ticker(void);
|
||||
FUNCMATH void ST_Ticker(void);
|
||||
|
||||
// Called by main loop.
|
||||
void ST_Drawer(void);
|
||||
|
|
|
@ -82,7 +82,7 @@ typedef UINT32 angle_t;
|
|||
extern angle_t tantoangle[SLOPERANGE+1];
|
||||
|
||||
// Utility function, called by R_PointToAngle.
|
||||
unsigned SlopeDiv(unsigned num, unsigned den);
|
||||
FUNCMATH unsigned SlopeDiv(unsigned num, unsigned den);
|
||||
|
||||
// 360 - angle_t(ANGLE_45) = ANGLE_315
|
||||
FUNCMATH FUNCINLINE static ATTRINLINE angle_t InvAngle(angle_t a)
|
||||
|
|
|
@ -54,10 +54,8 @@ typedef struct
|
|||
|
||||
#define lumpcache_t void *
|
||||
|
||||
// Annoying cyclic dependency workaround: this inlcusion must come after
|
||||
// the definition of MAX_WADPATH.
|
||||
#ifdef HWRENDER
|
||||
#include "m_misc.h"
|
||||
#include "m_aatree.h"
|
||||
#endif
|
||||
|
||||
typedef struct wadfile_s
|
||||
|
|
|
@ -145,6 +145,7 @@
|
|||
<ClCompile Include="..\lzf.c" />
|
||||
<ClCompile Include="..\md5.c" />
|
||||
<ClCompile Include="..\mserv.c" />
|
||||
<ClCompile Include="..\m_aatree.c" />
|
||||
<ClCompile Include="..\m_anigif.c" />
|
||||
<ClCompile Include="..\m_argv.c" />
|
||||
<ClCompile Include="..\m_bbox.c" />
|
||||
|
@ -300,6 +301,7 @@
|
|||
<ClInclude Include="..\lzf.h" />
|
||||
<ClInclude Include="..\md5.h" />
|
||||
<ClInclude Include="..\mserv.h" />
|
||||
<ClInclude Include="..\m_aatree.h" />
|
||||
<ClInclude Include="..\m_anigif.h" />
|
||||
<ClInclude Include="..\m_argv.h" />
|
||||
<ClInclude Include="..\m_bbox.h" />
|
||||
|
|
|
@ -255,6 +255,9 @@
|
|||
<ClCompile Include="..\lua_skinlib.c">
|
||||
<Filter>LUA</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\m_aatree.c">
|
||||
<Filter>M_Misc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\m_anigif.c">
|
||||
<Filter>M_Misc</Filter>
|
||||
</ClCompile>
|
||||
|
@ -662,6 +665,9 @@
|
|||
<ClInclude Include="..\md5.h">
|
||||
<Filter>M_Misc</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\m_aatree.h">
|
||||
<Filter>M_Misc</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\m_anigif.h">
|
||||
<Filter>M_Misc</Filter>
|
||||
</ClInclude>
|
||||
|
|
Loading…
Reference in a new issue