mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-02-03 20:26:05 +00:00
Merge branch 'master' of http://git.magicalgirl.moe/STJr/SRB2Internal.git into flat_alignment_revamp
# Conflicts: # src/p_mobj.c # src/p_spec.c
This commit is contained in:
commit
8f181abbb2
49 changed files with 2926 additions and 1791 deletions
42
.travis.yml
42
.travis.yml
|
|
@ -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)
|
||||
|
|
|
|||
22
README.md
Normal file
22
README.md
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
# Sonic Robo Blast 2
|
||||
|
||||
[](https://ci.appveyor.com/project/STJr/srb2)
|
||||
[](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.
|
||||
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
|
||||
12
src/b_bot.c
12
src/b_bot.c
|
|
@ -41,12 +41,13 @@ static inline void B_BuildTailsTiccmd(mobj_t *sonic, mobj_t *tails, ticcmd_t *cm
|
|||
return;
|
||||
#endif
|
||||
|
||||
if (tails->player->pflags & (PF_MACESPIN|PF_ITEMHANG))
|
||||
if (tails->player->powers[pw_carry] == CR_MACESPIN || tails->player->powers[pw_carry] == CR_GENERIC)
|
||||
{
|
||||
boolean isrelevant = (sonic->player->powers[pw_carry] == CR_MACESPIN || sonic->player->powers[pw_carry] == CR_GENERIC);
|
||||
dist = P_AproxDistance(tails->x-sonic->x, tails->y-sonic->y);
|
||||
if (sonic->player->cmd.buttons & BT_JUMP && sonic->player->pflags & (PF_JUMPED|PF_MACESPIN|PF_ITEMHANG))
|
||||
if (sonic->player->cmd.buttons & BT_JUMP && (sonic->player->pflags & PF_JUMPED) && isrelevant)
|
||||
cmd->buttons |= BT_JUMP;
|
||||
if (sonic->player->pflags & (PF_MACESPIN|PF_ITEMHANG))
|
||||
if (isrelevant)
|
||||
{
|
||||
cmd->forwardmove = sonic->player->cmd.forwardmove;
|
||||
cmd->angleturn = abs((signed)(tails->angle - sonic->angle))>>16;
|
||||
|
|
@ -211,8 +212,9 @@ boolean B_CheckRespawn(player_t *player)
|
|||
|
||||
// Check if Sonic is busy first.
|
||||
// If he's doing any of these things, he probably doesn't want to see us.
|
||||
if (sonic->player->pflags & (PF_ROPEHANG|PF_GLIDING|PF_CARRIED|PF_SLIDING|PF_ITEMHANG|PF_MACESPIN|PF_NIGHTSMODE)
|
||||
|| (sonic->player->panim != PA_IDLE && sonic->player->panim != PA_WALK))
|
||||
if (sonic->player->pflags & (PF_GLIDING|PF_SLIDING|PF_NIGHTSMODE)
|
||||
|| (sonic->player->panim != PA_IDLE && sonic->player->panim != PA_WALK)
|
||||
|| (sonic->player->powers[pw_carry]))
|
||||
return false;
|
||||
|
||||
// Low ceiling, do not want!
|
||||
|
|
|
|||
|
|
@ -1161,7 +1161,16 @@ found:
|
|||
var->value = (INT32)(d * FRACUNIT);
|
||||
}
|
||||
else
|
||||
var->value = atoi(var->string);
|
||||
{
|
||||
if (var == &cv_forceskin)
|
||||
{
|
||||
var->value = R_SkinAvailable(var->string);
|
||||
if (!R_SkinUnlock(var->value))
|
||||
var->value = -1;
|
||||
}
|
||||
else
|
||||
var->value = atoi(var->string);
|
||||
}
|
||||
|
||||
finish:
|
||||
// See the note above.
|
||||
|
|
@ -1385,6 +1394,30 @@ void CV_StealthSet(consvar_t *var, const char *value)
|
|||
CV_SetCVar(var, value, true);
|
||||
}
|
||||
|
||||
/** Sets a numeric value to a variable, sometimes calling its callback
|
||||
* function.
|
||||
*
|
||||
* \param var The variable.
|
||||
* \param value The numeric value, converted to a string before setting.
|
||||
* \param stealth Do we call the callback function or not?
|
||||
*/
|
||||
static void CV_SetValueMaybeStealth(consvar_t *var, INT32 value, boolean stealth)
|
||||
{
|
||||
char val[32];
|
||||
|
||||
if (var == &cv_forceskin) // Special handling.
|
||||
{
|
||||
if ((value < 0) || (value >= numskins))
|
||||
sprintf(val, "None");
|
||||
else
|
||||
sprintf(val, "%s", skins[value].name);
|
||||
}
|
||||
else
|
||||
sprintf(val, "%d", value);
|
||||
|
||||
CV_SetCVar(var, val, stealth);
|
||||
}
|
||||
|
||||
/** Sets a numeric value to a variable without calling its callback
|
||||
* function.
|
||||
*
|
||||
|
|
@ -1394,10 +1427,7 @@ void CV_StealthSet(consvar_t *var, const char *value)
|
|||
*/
|
||||
void CV_StealthSetValue(consvar_t *var, INT32 value)
|
||||
{
|
||||
char val[32];
|
||||
|
||||
sprintf(val, "%d", value);
|
||||
CV_SetCVar(var, val, true);
|
||||
CV_SetValueMaybeStealth(var, value, true);
|
||||
}
|
||||
|
||||
// New wrapper for what used to be CV_Set()
|
||||
|
|
@ -1415,10 +1445,7 @@ void CV_Set(consvar_t *var, const char *value)
|
|||
*/
|
||||
void CV_SetValue(consvar_t *var, INT32 value)
|
||||
{
|
||||
char val[32];
|
||||
|
||||
sprintf(val, "%d", value);
|
||||
CV_SetCVar(var, val, false);
|
||||
CV_SetValueMaybeStealth(var, value, false);
|
||||
}
|
||||
|
||||
/** Adds a value to a console variable.
|
||||
|
|
@ -1438,7 +1465,23 @@ void CV_AddValue(consvar_t *var, INT32 increment)
|
|||
// count pointlimit better
|
||||
if (var == &cv_pointlimit && (gametype == GT_MATCH))
|
||||
increment *= 50;
|
||||
newvalue = var->value + increment;
|
||||
|
||||
if (var == &cv_forceskin) // Special handling.
|
||||
{
|
||||
INT32 oldvalue = var->value;
|
||||
newvalue = oldvalue;
|
||||
do
|
||||
{
|
||||
newvalue += increment;
|
||||
if (newvalue < -1)
|
||||
newvalue = (numskins - 1);
|
||||
else if (newvalue >= numskins)
|
||||
newvalue = -1;
|
||||
} while ((oldvalue != newvalue)
|
||||
&& !(R_SkinUnlock(newvalue)));
|
||||
}
|
||||
else
|
||||
newvalue = var->value + increment;
|
||||
|
||||
if (var->PossibleValue)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -506,6 +506,8 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
|
|||
rsp->skin = LONG(players[i].skin);
|
||||
// Just in case Lua does something like
|
||||
// modify these at runtime
|
||||
rsp->camerascale = (fixed_t)LONG(players[i].camerascale);
|
||||
rsp->shieldscale = (fixed_t)LONG(players[i].shieldscale);
|
||||
rsp->normalspeed = (fixed_t)LONG(players[i].normalspeed);
|
||||
rsp->runspeed = (fixed_t)LONG(players[i].runspeed);
|
||||
rsp->thrustfactor = players[i].thrustfactor;
|
||||
|
|
@ -521,6 +523,8 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
|
|||
rsp->mindash = (fixed_t)LONG(players[i].mindash);
|
||||
rsp->maxdash = (fixed_t)LONG(players[i].maxdash);
|
||||
rsp->jumpfactor = (fixed_t)LONG(players[i].jumpfactor);
|
||||
rsp->playerheight = (fixed_t)LONG(players[i].height);
|
||||
rsp->playerspinheight = (fixed_t)LONG(players[i].spinheight);
|
||||
|
||||
rsp->speed = (fixed_t)LONG(players[i].speed);
|
||||
rsp->jumping = players[i].jumping;
|
||||
|
|
@ -550,7 +554,6 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
|
|||
|
||||
rsp->maxlink = LONG(players[i].maxlink);
|
||||
rsp->dashspeed = (fixed_t)LONG(players[i].dashspeed);
|
||||
rsp->dashtime = LONG(players[i].dashtime);
|
||||
rsp->angle_pos = (angle_t)LONG(players[i].angle_pos);
|
||||
rsp->old_angle_pos = (angle_t)LONG(players[i].old_angle_pos);
|
||||
rsp->bumpertime = (tic_t)LONG(players[i].bumpertime);
|
||||
|
|
@ -633,6 +636,8 @@ static void resynch_read_player(resynch_pak *rsp)
|
|||
players[i].skin = LONG(rsp->skin);
|
||||
// Just in case Lua does something like
|
||||
// modify these at runtime
|
||||
players[i].camerascale = (fixed_t)LONG(rsp->camerascale);
|
||||
players[i].shieldscale = (fixed_t)LONG(rsp->shieldscale);
|
||||
players[i].normalspeed = (fixed_t)LONG(rsp->normalspeed);
|
||||
players[i].runspeed = (fixed_t)LONG(rsp->runspeed);
|
||||
players[i].thrustfactor = rsp->thrustfactor;
|
||||
|
|
@ -648,6 +653,8 @@ static void resynch_read_player(resynch_pak *rsp)
|
|||
players[i].mindash = (fixed_t)LONG(rsp->mindash);
|
||||
players[i].maxdash = (fixed_t)LONG(rsp->maxdash);
|
||||
players[i].jumpfactor = (fixed_t)LONG(rsp->jumpfactor);
|
||||
players[i].height = (fixed_t)LONG(rsp->playerheight);
|
||||
players[i].spinheight = (fixed_t)LONG(rsp->playerspinheight);
|
||||
|
||||
players[i].speed = (fixed_t)LONG(rsp->speed);
|
||||
players[i].jumping = rsp->jumping;
|
||||
|
|
@ -677,7 +684,6 @@ static void resynch_read_player(resynch_pak *rsp)
|
|||
|
||||
players[i].maxlink = LONG(rsp->maxlink);
|
||||
players[i].dashspeed = (fixed_t)LONG(rsp->dashspeed);
|
||||
players[i].dashtime = LONG(rsp->dashtime);
|
||||
players[i].angle_pos = (angle_t)LONG(rsp->angle_pos);
|
||||
players[i].old_angle_pos = (angle_t)LONG(rsp->old_angle_pos);
|
||||
players[i].bumpertime = (tic_t)LONG(rsp->bumpertime);
|
||||
|
|
|
|||
|
|
@ -166,6 +166,8 @@ typedef struct
|
|||
INT32 skin;
|
||||
// Just in case Lua does something like
|
||||
// modify these at runtime
|
||||
fixed_t camerascale;
|
||||
fixed_t shieldscale;
|
||||
fixed_t normalspeed;
|
||||
fixed_t runspeed;
|
||||
UINT8 thrustfactor;
|
||||
|
|
@ -181,6 +183,8 @@ typedef struct
|
|||
fixed_t mindash;
|
||||
fixed_t maxdash;
|
||||
fixed_t jumpfactor;
|
||||
fixed_t playerheight;
|
||||
fixed_t playerspinheight;
|
||||
|
||||
fixed_t speed;
|
||||
UINT8 jumping;
|
||||
|
|
@ -210,7 +214,6 @@ typedef struct
|
|||
|
||||
INT32 maxlink;
|
||||
fixed_t dashspeed;
|
||||
INT32 dashtime;
|
||||
angle_t angle_pos;
|
||||
angle_t old_angle_pos;
|
||||
tic_t bumpertime;
|
||||
|
|
|
|||
|
|
@ -332,7 +332,7 @@ consvar_t cv_usemapnumlaps = {"usemaplaps", "Yes", CV_NETVAR, CV_YesNo, NULL, 0,
|
|||
// log elemental hazards -- not a netvar, is local to current player
|
||||
consvar_t cv_hazardlog = {"hazardlog", "Yes", 0, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_forceskin = {"forceskin", "-1", CV_NETVAR|CV_CALL|CV_CHEAT, NULL, ForceSkin_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_forceskin = {"forceskin", "None", CV_NETVAR|CV_CALL|CV_CHEAT, NULL, ForceSkin_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_downloading = {"downloading", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_allowexitlevel = {"allowexitlevel", "No", CV_NETVAR, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
|
|
@ -1092,7 +1092,7 @@ static void SendNameAndColor(void)
|
|||
SetPlayerSkinByNum(consoleplayer, 0);
|
||||
CV_StealthSet(&cv_skin, skins[0].name);
|
||||
}
|
||||
else if ((foundskin = R_SkinAvailable(cv_skin.string)) != -1)
|
||||
else if ((foundskin = R_SkinAvailable(cv_skin.string)) != -1 && R_SkinUnlock(foundskin))
|
||||
{
|
||||
boolean notsame;
|
||||
|
||||
|
|
@ -1139,7 +1139,7 @@ static void SendNameAndColor(void)
|
|||
// check if player has the skin loaded (cv_skin may have
|
||||
// the name of a skin that was available in the previous game)
|
||||
cv_skin.value = R_SkinAvailable(cv_skin.string);
|
||||
if (cv_skin.value < 0)
|
||||
if ((cv_skin.value < 0) || !R_SkinUnlock(cv_skin.value))
|
||||
{
|
||||
CV_StealthSet(&cv_skin, DEFAULTSKIN);
|
||||
cv_skin.value = 0;
|
||||
|
|
@ -1217,7 +1217,7 @@ static void SendNameAndColor2(void)
|
|||
SetPlayerSkinByNum(secondplaya, forcedskin);
|
||||
CV_StealthSet(&cv_skin2, skins[forcedskin].name);
|
||||
}
|
||||
else if ((foundskin = R_SkinAvailable(cv_skin2.string)) != -1)
|
||||
else if ((foundskin = R_SkinAvailable(cv_skin2.string)) != -1 && R_SkinUnlock(foundskin))
|
||||
{
|
||||
boolean notsame;
|
||||
|
||||
|
|
@ -4002,17 +4002,10 @@ static void Command_Archivetest_f(void)
|
|||
*/
|
||||
static void ForceSkin_OnChange(void)
|
||||
{
|
||||
if ((server || adminplayer == consoleplayer) && (cv_forceskin.value < -1 || cv_forceskin.value >= numskins))
|
||||
if ((server || adminplayer == consoleplayer) && ((cv_forceskin.value == -1 && stricmp(cv_forceskin.string, "None")) || !(R_SkinUnlock(cv_forceskin.value))))
|
||||
{
|
||||
if (cv_forceskin.value == -2)
|
||||
CV_SetValue(&cv_forceskin, numskins-1);
|
||||
else
|
||||
{
|
||||
// hack because I can't restrict this and still allow added skins to be used with forceskin.
|
||||
if (!menuactive)
|
||||
CONS_Printf(M_GetText("Valid skin numbers are 0 to %d (-1 disables)\n"), numskins - 1);
|
||||
CV_SetValue(&cv_forceskin, -1);
|
||||
}
|
||||
CONS_Printf("Please provide a valid skin name (\"None\" disables).\n");
|
||||
CV_SetValue(&cv_forceskin, -1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -4024,7 +4017,7 @@ static void ForceSkin_OnChange(void)
|
|||
CONS_Printf("The server has lifted the forced skin restrictions.\n");
|
||||
else
|
||||
{
|
||||
CONS_Printf("The server is restricting all players to skin \"%s\".\n",skins[cv_forceskin.value].name);
|
||||
CONS_Printf("The server is restricting all players to skin \"%s\".\n",skins[cv_forceskin.value].realname);
|
||||
ForceAllSkins(cv_forceskin.value);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,6 +39,12 @@ typedef enum
|
|||
SF_NOSKID = 1<<4, // No skid particles etc
|
||||
SF_NOSPEEDADJUST = 1<<5, // Skin-specific version of disablespeedadjust
|
||||
SF_RUNONWATER = 1<<6, // Run on top of water FOFs?
|
||||
SF_NOJUMPSPIN = 1<<7, // SPR2_JUMP defaults to SPR2_SPRG instead of SPR2_SPIN, falling states used, and player height is full when jumping?
|
||||
SF_NOJUMPDAMAGE = 1<<8, // Don't damage enemies, etc whilst jumping?
|
||||
SF_STOMPDAMAGE = 1<<9, // Always damage enemies, etc by landing on them, no matter your vunerability?
|
||||
SF_MARIODAMAGE = SF_NOJUMPDAMAGE|SF_STOMPDAMAGE, // The Mario method of being able to damage enemies, etc.
|
||||
SF_MACHINE = 1<<10, // Beep boop. Are you a robot?
|
||||
// free up to and including 1<<31
|
||||
} skinflags_t;
|
||||
|
||||
//Primary and secondary skin abilities
|
||||
|
|
@ -58,7 +64,8 @@ typedef enum
|
|||
CA_JUMPBOOST,
|
||||
CA_AIRDRILL,
|
||||
CA_JUMPTHOK,
|
||||
CA_DASHMODE
|
||||
CA_DASHMODE,
|
||||
CA_TWINSPIN
|
||||
} charability_t;
|
||||
|
||||
//Secondary skin abilities
|
||||
|
|
@ -66,7 +73,8 @@ typedef enum
|
|||
{
|
||||
CA2_NONE=0,
|
||||
CA2_SPINDASH,
|
||||
CA2_MULTIABILITY
|
||||
CA2_MULTIABILITY,
|
||||
CA2_MELEE
|
||||
} charability2_t;
|
||||
|
||||
//
|
||||
|
|
@ -121,40 +129,31 @@ typedef enum
|
|||
// Are you gliding?
|
||||
PF_GLIDING = 1<<16,
|
||||
|
||||
// Tails pickup!
|
||||
PF_CARRIED = 1<<17,
|
||||
|
||||
// Sliding (usually in water) like Labyrinth/Oil Ocean
|
||||
PF_SLIDING = 1<<18,
|
||||
|
||||
// Hanging on a rope
|
||||
PF_ROPEHANG = 1<<19,
|
||||
|
||||
// Hanging on an item of some kind - zipline, chain, etc. (->tracer)
|
||||
PF_ITEMHANG = 1<<20,
|
||||
|
||||
// On the mace chain spinning around (->tracer)
|
||||
PF_MACESPIN = 1<<21,
|
||||
PF_SLIDING = 1<<17,
|
||||
|
||||
/*** NIGHTS STUFF ***/
|
||||
// Is the player in NiGHTS mode?
|
||||
PF_NIGHTSMODE = 1<<22,
|
||||
PF_TRANSFERTOCLOSEST = 1<<23,
|
||||
PF_NIGHTSMODE = 1<<18,
|
||||
PF_TRANSFERTOCLOSEST = 1<<19,
|
||||
|
||||
// Spill rings after falling
|
||||
PF_NIGHTSFALL = 1<<24,
|
||||
PF_DRILLING = 1<<25,
|
||||
PF_SKIDDOWN = 1<<26,
|
||||
PF_NIGHTSFALL = 1<<20,
|
||||
PF_DRILLING = 1<<21,
|
||||
PF_SKIDDOWN = 1<<22,
|
||||
|
||||
/*** TAG STUFF ***/
|
||||
PF_TAGGED = 1<<27, // Player has been tagged and awaits the next round in hide and seek.
|
||||
PF_TAGIT = 1<<28, // The player is it! For Tag Mode
|
||||
PF_TAGGED = 1<<23, // Player has been tagged and awaits the next round in hide and seek.
|
||||
PF_TAGIT = 1<<24, // The player is it! For Tag Mode
|
||||
|
||||
/*** misc ***/
|
||||
PF_FORCESTRAFE = 1<<29, // Turning inputs are translated into strafing inputs
|
||||
PF_ANALOGMODE = 1<<30, // Analog mode?
|
||||
PF_FORCESTRAFE = 1<<25, // Turning inputs are translated into strafing inputs
|
||||
PF_ANALOGMODE = 1<<26, // Analog mode?
|
||||
|
||||
// free: 1<<30 and 1<<31
|
||||
// Can carry another player?
|
||||
PF_CANCARRY = 1<<27
|
||||
|
||||
// free up to and including 1<<31
|
||||
} pflags_t;
|
||||
|
||||
typedef enum
|
||||
|
|
@ -168,9 +167,11 @@ typedef enum
|
|||
PA_PEEL,
|
||||
PA_PAIN,
|
||||
PA_ROLL,
|
||||
PA_JUMP,
|
||||
PA_SPRING,
|
||||
PA_FALL,
|
||||
PA_ABILITY,
|
||||
PA_ABILITY2,
|
||||
PA_RIDE
|
||||
} panim_t;
|
||||
|
||||
|
|
@ -195,7 +196,20 @@ typedef enum
|
|||
|
||||
SH_STACK = SH_FIREFLOWER,
|
||||
SH_NOSTACK = ~SH_STACK
|
||||
} shieldtype_t;
|
||||
} shieldtype_t; // pw_shield
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CR_NONE = 0,
|
||||
// The generic case is suitable for most objects.
|
||||
CR_GENERIC,
|
||||
// Tails carry.
|
||||
CR_PLAYER,
|
||||
// Specific level gimmicks.
|
||||
CR_ZOOMTUBE,
|
||||
CR_ROPEHANG,
|
||||
CR_MACESPIN
|
||||
} carrytype_t; // pw_carry
|
||||
|
||||
// Player powers. (don't edit this comment)
|
||||
typedef enum
|
||||
|
|
@ -204,6 +218,7 @@ typedef enum
|
|||
pw_sneakers,
|
||||
pw_flashing,
|
||||
pw_shield,
|
||||
pw_carry,
|
||||
pw_tailsfly, // tails flying
|
||||
pw_underwater, // underwater timer
|
||||
pw_spacetime, // In space, no one can hear you spin!
|
||||
|
|
@ -267,6 +282,8 @@ typedef struct player_s
|
|||
playerstate_t playerstate;
|
||||
|
||||
// Determine POV, including viewpoint bobbing during movement.
|
||||
fixed_t camerascale;
|
||||
fixed_t shieldscale;
|
||||
// Focal origin above r.z
|
||||
fixed_t viewz;
|
||||
// Base height above floor for viewz.
|
||||
|
|
@ -310,7 +327,6 @@ typedef struct player_s
|
|||
|
||||
UINT32 score; // player score
|
||||
fixed_t dashspeed; // dashing speed
|
||||
INT32 dashtime; // tics dashing, used for rev sound
|
||||
|
||||
fixed_t normalspeed; // Normal ground
|
||||
fixed_t runspeed; // Speed you break into the run animation
|
||||
|
|
@ -335,6 +351,9 @@ typedef struct player_s
|
|||
|
||||
fixed_t jumpfactor; // How high can the player jump?
|
||||
|
||||
fixed_t height; // Bounding box changes.
|
||||
fixed_t spinheight;
|
||||
|
||||
SINT8 lives;
|
||||
SINT8 continues; // continues that player has acquired
|
||||
|
||||
|
|
|
|||
321
src/dehacked.c
321
src/dehacked.c
|
|
@ -430,16 +430,20 @@ static void readAnimTex(MYFILE *f, INT32 num)
|
|||
}
|
||||
*/
|
||||
|
||||
static boolean findFreeSlot(INT32 *num)
|
||||
static boolean findFreeSlot(INT32 *num, UINT16 wadnum)
|
||||
{
|
||||
// Send the character select entry to a free slot.
|
||||
while (*num < 32 && PlayerMenu[*num].status != IT_DISABLED)
|
||||
while (*num < 32 && (!(PlayerMenu[*num].status & IT_DISABLED) || description[*num].wadnum == wadnum)) // Will kill hidden characters from other files, but that's okay.
|
||||
*num = *num+1;
|
||||
|
||||
// No more free slots. :(
|
||||
if (*num >= 32)
|
||||
return false;
|
||||
|
||||
PlayerMenu[*num].status = IT_CALL;
|
||||
description[*num].wadnum = wadnum;
|
||||
description[*num].picname[0] = '\0'; // Redesign your logo. (See M_DrawSetupChoosePlayerMenu in m_menu.c...)
|
||||
|
||||
// Found one! ^_^
|
||||
return true;
|
||||
}
|
||||
|
|
@ -473,9 +477,8 @@ static void readPlayer(MYFILE *f, INT32 num)
|
|||
{
|
||||
char *playertext = NULL;
|
||||
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num, f->wad)) == false)
|
||||
goto done;
|
||||
PlayerMenu[num].status = IT_CALL;
|
||||
|
||||
for (i = 0; i < MAXLINELEN-3; i++)
|
||||
{
|
||||
|
|
@ -521,34 +524,12 @@ static void readPlayer(MYFILE *f, INT32 num)
|
|||
word2[strlen(word2)-1] = '\0';
|
||||
i = atoi(word2);
|
||||
|
||||
/*if (fastcmp(word, "PLAYERNAME"))
|
||||
if (fastcmp(word, "PICNAME"))
|
||||
{
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
goto done;
|
||||
DEH_WriteUndoline(word, description[num].text, UNDO_NONE);
|
||||
strlcpy(description[num].text, word2, sizeof (description[num].text));
|
||||
for (word2 = description[num].text; *word2; word2++)
|
||||
if (*word2 == '_')
|
||||
*word2 = ' ';
|
||||
PlayerMenu[num].text = description[num].text;
|
||||
}*/
|
||||
/* else if (fastcmp(word, "MENUPOSITION"))
|
||||
{ // Make sure you make MENUPOSITION the first thing under CHARACTER if you're using it!
|
||||
// This is to manually choose a slot and overwrite existing characters! It is NOT necessary for most individual character wads!!
|
||||
#ifdef DELFILE
|
||||
if (disableundo)
|
||||
#endif
|
||||
{
|
||||
slotfound = true;
|
||||
num = i;
|
||||
}
|
||||
} */
|
||||
/*else*/ if (fastcmp(word, "PICNAME"))
|
||||
{
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num, f->wad)) == false)
|
||||
goto done;
|
||||
DEH_WriteUndoline(word, &description[num].picname[0], UNDO_NONE);
|
||||
PlayerMenu[num].status = IT_CALL;
|
||||
|
||||
strncpy(description[num].picname, word2, 8);
|
||||
}
|
||||
else if (fastcmp(word, "STATUS"))
|
||||
|
|
@ -563,13 +544,10 @@ static void readPlayer(MYFILE *f, INT32 num)
|
|||
You MAY disable previous entries if you so desire...
|
||||
But try to enable something that's already enabled and you will be sent to a free slot.
|
||||
|
||||
Because of this, you are allowed to edit any previous entrys you like, but only if you
|
||||
Because of this, you are allowed to edit any previous entries you like, but only if you
|
||||
signal that you are purposely doing so by disabling and then reenabling the slot.
|
||||
|
||||
... Or use MENUPOSITION first, that works too. Hell, you could edit multiple character
|
||||
slots in a single section that way, due to how SOC editing works.
|
||||
*/
|
||||
if (i != IT_DISABLED && !slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
if (i != IT_DISABLED && !slotfound && (slotfound = findFreeSlot(&num, f->wad)) == false)
|
||||
goto done;
|
||||
DEH_WriteUndoline(word, va("%d", PlayerMenu[num].status), UNDO_NONE);
|
||||
PlayerMenu[num].status = (INT16)i;
|
||||
|
|
@ -577,10 +555,9 @@ static void readPlayer(MYFILE *f, INT32 num)
|
|||
else if (fastcmp(word, "SKINNAME"))
|
||||
{
|
||||
// Send to free slot.
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num, f->wad)) == false)
|
||||
goto done;
|
||||
DEH_WriteUndoline(word, description[num].skinname, UNDO_NONE);
|
||||
PlayerMenu[num].status = IT_CALL;
|
||||
|
||||
strlcpy(description[num].skinname, word2, sizeof description[num].skinname);
|
||||
strlwr(description[num].skinname);
|
||||
|
|
@ -3823,8 +3800,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_PLAY_EDGE",
|
||||
"S_PLAY_RIDE",
|
||||
|
||||
// CA_FLY
|
||||
// CA_FLY/SWIM
|
||||
"S_PLAY_FLY",
|
||||
"S_PLAY_SWIM",
|
||||
"S_PLAY_FLY_TIRED",
|
||||
|
||||
// CA_GLIDEANDCLIMB
|
||||
|
|
@ -3832,6 +3810,13 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_PLAY_CLING",
|
||||
"S_PLAY_CLIMB",
|
||||
|
||||
// CA_TWINSPIN
|
||||
"S_PLAY_TWINSPIN",
|
||||
|
||||
// CA2_MELEE
|
||||
"S_PLAY_MELEE",
|
||||
"S_PLAY_MELEE_FINISH",
|
||||
|
||||
// SF_SUPERANIMS
|
||||
"S_PLAY_SUPER_STND",
|
||||
"S_PLAY_SUPER_WALK",
|
||||
|
|
@ -3874,6 +3859,50 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
// Level end sign (uses player sprite)
|
||||
"S_PLAY_SIGN",
|
||||
|
||||
// NiGHTS character (uses player sprite)
|
||||
"S_PLAY_NIGHTS_TRANS",
|
||||
"S_PLAY_NIGHTS_TRANS2",
|
||||
"S_PLAY_NIGHTS_TRANS3",
|
||||
"S_PLAY_NIGHTS_TRANS4",
|
||||
"S_PLAY_NIGHTS_TRANS5",
|
||||
"S_PLAY_NIGHTS_TRANS6",
|
||||
"S_PLAY_NIGHTS_TRANS7",
|
||||
"S_PLAY_NIGHTS_TRANS8",
|
||||
"S_PLAY_NIGHTS_TRANS9",
|
||||
|
||||
"S_PLAY_NIGHTS_STAND",
|
||||
"S_PLAY_NIGHTS_FLOAT",
|
||||
"S_PLAY_NIGHTS_PAIN",
|
||||
"S_PLAY_NIGHTS_PULL",
|
||||
"S_PLAY_NIGHTS_ATTACK",
|
||||
|
||||
"S_PLAY_NIGHTS_FLY0",
|
||||
"S_PLAY_NIGHTS_DRILL0",
|
||||
"S_PLAY_NIGHTS_FLY1",
|
||||
"S_PLAY_NIGHTS_DRILL1",
|
||||
"S_PLAY_NIGHTS_FLY2",
|
||||
"S_PLAY_NIGHTS_DRILL2",
|
||||
"S_PLAY_NIGHTS_FLY3",
|
||||
"S_PLAY_NIGHTS_DRILL3",
|
||||
"S_PLAY_NIGHTS_FLY4",
|
||||
"S_PLAY_NIGHTS_DRILL4",
|
||||
"S_PLAY_NIGHTS_FLY5",
|
||||
"S_PLAY_NIGHTS_DRILL5",
|
||||
"S_PLAY_NIGHTS_FLY6",
|
||||
"S_PLAY_NIGHTS_DRILL6",
|
||||
"S_PLAY_NIGHTS_FLY7",
|
||||
"S_PLAY_NIGHTS_DRILL7",
|
||||
"S_PLAY_NIGHTS_FLY8",
|
||||
"S_PLAY_NIGHTS_DRILL8",
|
||||
"S_PLAY_NIGHTS_FLY9",
|
||||
"S_PLAY_NIGHTS_DRILL9",
|
||||
"S_PLAY_NIGHTS_FLYA",
|
||||
"S_PLAY_NIGHTS_DRILLA",
|
||||
"S_PLAY_NIGHTS_FLYB",
|
||||
"S_PLAY_NIGHTS_DRILLB",
|
||||
"S_PLAY_NIGHTS_FLYC",
|
||||
"S_PLAY_NIGHTS_DRILLC",
|
||||
|
||||
// Blue Crawla
|
||||
"S_POSS_STND",
|
||||
"S_POSS_RUN1",
|
||||
|
|
@ -4724,6 +4753,8 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
// Bubble Source
|
||||
"S_BUBBLES1",
|
||||
"S_BUBBLES2",
|
||||
"S_BUBBLES3",
|
||||
"S_BUBBLES4",
|
||||
|
||||
// Level End Sign
|
||||
"S_SIGN1",
|
||||
|
|
@ -5579,14 +5610,15 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
|
||||
// Bubbles
|
||||
"S_SMALLBUBBLE",
|
||||
"S_SMALLBUBBLE1",
|
||||
"S_MEDIUMBUBBLE",
|
||||
"S_MEDIUMBUBBLE1",
|
||||
"S_LARGEBUBBLE",
|
||||
"S_LARGEBUBBLE1",
|
||||
"S_LARGEBUBBLE2",
|
||||
"S_EXTRALARGEBUBBLE", // breathable
|
||||
|
||||
"S_POP1", // Extra Large bubble goes POP!
|
||||
|
||||
"S_WATERZAP",
|
||||
|
||||
"S_FOG1",
|
||||
"S_FOG2",
|
||||
"S_FOG3",
|
||||
|
|
@ -5628,6 +5660,13 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_FOUR1",
|
||||
"S_FIVE1",
|
||||
|
||||
"S_ZERO2",
|
||||
"S_ONE2",
|
||||
"S_TWO2",
|
||||
"S_THREE2",
|
||||
"S_FOUR2",
|
||||
"S_FIVE2",
|
||||
|
||||
// Tag Sign
|
||||
"S_TTAG1",
|
||||
|
||||
|
|
@ -5860,93 +5899,6 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_NIGHTSGOAL3",
|
||||
"S_NIGHTSGOAL4",
|
||||
|
||||
"S_NIGHTSFLY1A",
|
||||
"S_NIGHTSFLY1B",
|
||||
"S_NIGHTSDRILL1A",
|
||||
"S_NIGHTSDRILL1B",
|
||||
"S_NIGHTSDRILL1C",
|
||||
"S_NIGHTSDRILL1D",
|
||||
"S_NIGHTSFLY2A",
|
||||
"S_NIGHTSFLY2B",
|
||||
"S_NIGHTSDRILL2A",
|
||||
"S_NIGHTSDRILL2B",
|
||||
"S_NIGHTSDRILL2C",
|
||||
"S_NIGHTSDRILL2D",
|
||||
"S_NIGHTSFLY3A",
|
||||
"S_NIGHTSFLY3B",
|
||||
"S_NIGHTSDRILL3A",
|
||||
"S_NIGHTSDRILL3B",
|
||||
"S_NIGHTSDRILL3C",
|
||||
"S_NIGHTSDRILL3D",
|
||||
"S_NIGHTSFLY4A",
|
||||
"S_NIGHTSFLY4B",
|
||||
"S_NIGHTSDRILL4A",
|
||||
"S_NIGHTSDRILL4B",
|
||||
"S_NIGHTSDRILL4C",
|
||||
"S_NIGHTSDRILL4D",
|
||||
"S_NIGHTSFLY5A",
|
||||
"S_NIGHTSFLY5B",
|
||||
"S_NIGHTSDRILL5A",
|
||||
"S_NIGHTSDRILL5B",
|
||||
"S_NIGHTSDRILL5C",
|
||||
"S_NIGHTSDRILL5D",
|
||||
"S_NIGHTSFLY6A",
|
||||
"S_NIGHTSFLY6B",
|
||||
"S_NIGHTSDRILL6A",
|
||||
"S_NIGHTSDRILL6B",
|
||||
"S_NIGHTSDRILL6C",
|
||||
"S_NIGHTSDRILL6D",
|
||||
"S_NIGHTSFLY7A",
|
||||
"S_NIGHTSFLY7B",
|
||||
"S_NIGHTSDRILL7A",
|
||||
"S_NIGHTSDRILL7B",
|
||||
"S_NIGHTSDRILL7C",
|
||||
"S_NIGHTSDRILL7D",
|
||||
"S_NIGHTSFLY8A",
|
||||
"S_NIGHTSFLY8B",
|
||||
"S_NIGHTSDRILL8A",
|
||||
"S_NIGHTSDRILL8B",
|
||||
"S_NIGHTSDRILL8C",
|
||||
"S_NIGHTSDRILL8D",
|
||||
"S_NIGHTSFLY9A",
|
||||
"S_NIGHTSFLY9B",
|
||||
"S_NIGHTSDRILL9A",
|
||||
"S_NIGHTSDRILL9B",
|
||||
"S_NIGHTSDRILL9C",
|
||||
"S_NIGHTSDRILL9D",
|
||||
"S_NIGHTSHURT1",
|
||||
"S_NIGHTSHURT2",
|
||||
"S_NIGHTSHURT3",
|
||||
"S_NIGHTSHURT4",
|
||||
"S_NIGHTSHURT5",
|
||||
"S_NIGHTSHURT6",
|
||||
"S_NIGHTSHURT7",
|
||||
"S_NIGHTSHURT8",
|
||||
"S_NIGHTSHURT9",
|
||||
"S_NIGHTSHURT10",
|
||||
"S_NIGHTSHURT11",
|
||||
"S_NIGHTSHURT12",
|
||||
"S_NIGHTSHURT13",
|
||||
"S_NIGHTSHURT14",
|
||||
"S_NIGHTSHURT15",
|
||||
"S_NIGHTSHURT16",
|
||||
"S_NIGHTSHURT17",
|
||||
"S_NIGHTSHURT18",
|
||||
"S_NIGHTSHURT19",
|
||||
"S_NIGHTSHURT20",
|
||||
"S_NIGHTSHURT21",
|
||||
"S_NIGHTSHURT22",
|
||||
"S_NIGHTSHURT23",
|
||||
"S_NIGHTSHURT24",
|
||||
"S_NIGHTSHURT25",
|
||||
"S_NIGHTSHURT26",
|
||||
"S_NIGHTSHURT27",
|
||||
"S_NIGHTSHURT28",
|
||||
"S_NIGHTSHURT29",
|
||||
"S_NIGHTSHURT30",
|
||||
"S_NIGHTSHURT31",
|
||||
"S_NIGHTSHURT32",
|
||||
|
||||
"S_NIGHTSPARKLE1",
|
||||
"S_NIGHTSPARKLE2",
|
||||
"S_NIGHTSPARKLE3",
|
||||
|
|
@ -6043,16 +5995,6 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_CRUMBLE1",
|
||||
"S_CRUMBLE2",
|
||||
|
||||
"S_SUPERTRANS1",
|
||||
"S_SUPERTRANS2",
|
||||
"S_SUPERTRANS3",
|
||||
"S_SUPERTRANS4",
|
||||
"S_SUPERTRANS5",
|
||||
"S_SUPERTRANS6",
|
||||
"S_SUPERTRANS7",
|
||||
"S_SUPERTRANS8",
|
||||
"S_SUPERTRANS9",
|
||||
|
||||
// Spark
|
||||
"S_SPRK1",
|
||||
"S_SPRK2",
|
||||
|
|
@ -6536,6 +6478,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
|||
"MT_SMALLBUBBLE", // small bubble
|
||||
"MT_MEDIUMBUBBLE", // medium bubble
|
||||
"MT_EXTRALARGEBUBBLE", // extra large bubble
|
||||
"MT_WATERZAP",
|
||||
"MT_TFOG",
|
||||
"MT_SEED",
|
||||
"MT_PARTICLE",
|
||||
|
|
@ -6608,7 +6551,6 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
|||
"MT_AXISTRANSFERLINE",
|
||||
"MT_NIGHTSDRONE",
|
||||
"MT_NIGHTSGOAL",
|
||||
"MT_NIGHTSCHAR",
|
||||
"MT_NIGHTSPARKLE",
|
||||
"MT_NIGHTSLOOPHELPER",
|
||||
"MT_NIGHTSBUMPER", // NiGHTS Bumper
|
||||
|
|
@ -6809,21 +6751,9 @@ static const char *const PLAYERFLAG_LIST[] = {
|
|||
// Are you gliding?
|
||||
"GLIDING",
|
||||
|
||||
// Tails pickup!
|
||||
"CARRIED",
|
||||
|
||||
// Sliding (usually in water) like Labyrinth/Oil Ocean
|
||||
"SLIDING",
|
||||
|
||||
// Hanging on a rope
|
||||
"ROPEHANG",
|
||||
|
||||
// Hanging on an item of some kind - zipline, chain, etc. (->tracer)
|
||||
"ITEMHANG",
|
||||
|
||||
// On the mace chain spinning around (->tracer)
|
||||
"MACESPIN",
|
||||
|
||||
/*** NIGHTS STUFF ***/
|
||||
// Is the player in NiGHTS mode?
|
||||
"NIGHTSMODE",
|
||||
|
|
@ -6900,24 +6830,61 @@ static const char *COLOR_ENUMS[] = {
|
|||
"MAGENTA", // SKINCOLOR_MAGENTA
|
||||
"PINK", // SKINCOLOR_PINK
|
||||
"ROSY", // SKINCOLOR_ROSY
|
||||
|
||||
// Super special awesome Super flashing colors!
|
||||
"SUPER1", // SKINCOLOR_SUPER1
|
||||
"SUPER2", // SKINCOLOR_SUPER2,
|
||||
"SUPER3", // SKINCOLOR_SUPER3,
|
||||
"SUPER4", // SKINCOLOR_SUPER4,
|
||||
"SUPER5", // SKINCOLOR_SUPER5,
|
||||
// Super Tails
|
||||
"TSUPER1", // SKINCOLOR_TSUPER1,
|
||||
"TSUPER2", // SKINCOLOR_TSUPER2,
|
||||
"TSUPER3", // SKINCOLOR_TSUPER3,
|
||||
"TSUPER4", // SKINCOLOR_TSUPER4,
|
||||
"TSUPER5", // SKINCOLOR_TSUPER5,
|
||||
// Super Knuckles
|
||||
"KSUPER1", // SKINCOLOR_KSUPER1,
|
||||
"KSUPER2", // SKINCOLOR_KSUPER2,
|
||||
"KSUPER3", // SKINCOLOR_KSUPER3,
|
||||
"KSUPER4", // SKINCOLOR_KSUPER4,
|
||||
"KSUPER5" // SKINCOLOR_KSUPER5,
|
||||
"SUPERSILVER1", // SKINCOLOR_SUPERSILVER1
|
||||
"SUPERSILVER2", // SKINCOLOR_SUPERSILVER2,
|
||||
"SUPERSILVER3", // SKINCOLOR_SUPERSILVER3,
|
||||
"SUPERSILVER4", // SKINCOLOR_SUPERSILVER4,
|
||||
"SUPERSILVER5", // SKINCOLOR_SUPERSILVER5,
|
||||
|
||||
"SUPERRED1", // SKINCOLOR_SUPERRED1
|
||||
"SUPERRED2", // SKINCOLOR_SUPERRED2,
|
||||
"SUPERRED3", // SKINCOLOR_SUPERRED3,
|
||||
"SUPERRED4", // SKINCOLOR_SUPERRED4,
|
||||
"SUPERRED5", // SKINCOLOR_SUPERRED5,
|
||||
|
||||
"SUPERORANGE1", // SKINCOLOR_SUPERORANGE1
|
||||
"SUPERORANGE2", // SKINCOLOR_SUPERORANGE2,
|
||||
"SUPERORANGE3", // SKINCOLOR_SUPERORANGE3,
|
||||
"SUPERORANGE4", // SKINCOLOR_SUPERORANGE4,
|
||||
"SUPERORANGE5", // SKINCOLOR_SUPERORANGE5,
|
||||
|
||||
"SUPERGOLD1", // SKINCOLOR_SUPERGOLD1
|
||||
"SUPERGOLD2", // SKINCOLOR_SUPERGOLD2,
|
||||
"SUPERGOLD3", // SKINCOLOR_SUPERGOLD3,
|
||||
"SUPERGOLD4", // SKINCOLOR_SUPERGOLD4,
|
||||
"SUPERGOLD5", // SKINCOLOR_SUPERGOLD5,
|
||||
|
||||
"SUPERPERIDOT1", // SKINCOLOR_SUPERPERIDOT1
|
||||
"SUPERPERIDOT2", // SKINCOLOR_SUPERPERIDOT2,
|
||||
"SUPERPERIDOT3", // SKINCOLOR_SUPERPERIDOT3,
|
||||
"SUPERPERIDOT4", // SKINCOLOR_SUPERPERIDOT4,
|
||||
"SUPERPERIDOT5", // SKINCOLOR_SUPERPERIDOT5,
|
||||
|
||||
"SUPERCYAN1", // SKINCOLOR_SUPERCYAN1
|
||||
"SUPERCYAN2", // SKINCOLOR_SUPERCYAN2,
|
||||
"SUPERCYAN3", // SKINCOLOR_SUPERCYAN3,
|
||||
"SUPERCYAN4", // SKINCOLOR_SUPERCYAN4,
|
||||
"SUPERCYAN5", // SKINCOLOR_SUPERCYAN5,
|
||||
|
||||
"SUPERPURPLE1", // SKINCOLOR_SUPERPURPLE1,
|
||||
"SUPERPURPLE2", // SKINCOLOR_SUPERPURPLE2,
|
||||
"SUPERPURPLE3", // SKINCOLOR_SUPERPURPLE3,
|
||||
"SUPERPURPLE4", // SKINCOLOR_SUPERPURPLE4,
|
||||
"SUPERPURPLE5", // SKINCOLOR_SUPERPURPLE5,
|
||||
|
||||
"SUPERRUST1", // SKINCOLOR_SUPERRUST1
|
||||
"SUPERRUST2", // SKINCOLOR_SUPERRUST2,
|
||||
"SUPERRUST3", // SKINCOLOR_SUPERRUST3,
|
||||
"SUPERRUST4", // SKINCOLOR_SUPERRUST4,
|
||||
"SUPERRUST5", // SKINCOLOR_SUPERRUST5,
|
||||
|
||||
"SUPERTAN1", // SKINCOLOR_SUPERTAN1
|
||||
"SUPERTAN2", // SKINCOLOR_SUPERTAN2,
|
||||
"SUPERTAN3", // SKINCOLOR_SUPERTAN3,
|
||||
"SUPERTAN4", // SKINCOLOR_SUPERTAN4,
|
||||
"SUPERTAN5" // SKINCOLOR_SUPERTAN5,
|
||||
};
|
||||
|
||||
static const char *const POWERS_LIST[] = {
|
||||
|
|
@ -6925,6 +6892,7 @@ static const char *const POWERS_LIST[] = {
|
|||
"SNEAKERS",
|
||||
"FLASHING",
|
||||
"SHIELD",
|
||||
"CARRY",
|
||||
"TAILSFLY", // tails flying
|
||||
"UNDERWATER", // underwater timer
|
||||
"SPACETIME", // In space, no one can hear you spin!
|
||||
|
|
@ -7044,6 +7012,8 @@ struct {
|
|||
|
||||
// Frame settings
|
||||
{"FF_FRAMEMASK",FF_FRAMEMASK},
|
||||
{"FF_SPR2ENDSTATE",FF_SPR2ENDSTATE},
|
||||
{"FF_MIDDLESTARTCHANCE",FF_MIDDLESTARTCHANCE},
|
||||
{"FF_ANIMATE",FF_ANIMATE},
|
||||
{"FF_FULLBRIGHT",FF_FULLBRIGHT},
|
||||
{"FF_TRANSMASK",FF_TRANSMASK},
|
||||
|
|
@ -7158,6 +7128,14 @@ struct {
|
|||
{"SH_STACK",SH_STACK},
|
||||
{"SH_NOSTACK",SH_NOSTACK},
|
||||
|
||||
// Carrying
|
||||
{"CR_NONE",CR_NONE},
|
||||
{"CR_GENERIC",CR_GENERIC},
|
||||
{"CR_PLAYER",CR_PLAYER},
|
||||
{"CR_ZOOMTUBE",CR_ZOOMTUBE},
|
||||
{"CR_ROPEHANG",CR_ROPEHANG},
|
||||
{"CR_MACESPIN",CR_MACESPIN},
|
||||
|
||||
// Ring weapons (ringweapons_t)
|
||||
// Useful for A_GiveWeapon
|
||||
{"RW_AUTO",RW_AUTO},
|
||||
|
|
@ -7175,6 +7153,11 @@ struct {
|
|||
{"SF_NOSKID",SF_NOSKID},
|
||||
{"SF_NOSPEEDADJUST",SF_NOSPEEDADJUST},
|
||||
{"SF_RUNONWATER",SF_RUNONWATER},
|
||||
{"SF_NOJUMPSPIN",SF_NOJUMPSPIN},
|
||||
{"SF_NOJUMPDAMAGE",SF_NOJUMPDAMAGE},
|
||||
{"SF_STOMPDAMAGE",SF_STOMPDAMAGE},
|
||||
{"SF_MARIODAMAGE",SF_MARIODAMAGE},
|
||||
{"SF_MACHINE",SF_MACHINE},
|
||||
|
||||
// Character abilities!
|
||||
// Primary
|
||||
|
|
@ -7193,10 +7176,12 @@ struct {
|
|||
{"CA_AIRDRILL",CA_AIRDRILL},
|
||||
{"CA_JUMPTHOK",CA_JUMPTHOK},
|
||||
{"CA_DASHMODE",CA_DASHMODE},
|
||||
{"CA_TWINSPIN",CA_TWINSPIN},
|
||||
// Secondary
|
||||
{"CA2_NONE",CA2_NONE}, // now slot 0!
|
||||
{"CA2_SPINDASH",CA2_SPINDASH},
|
||||
{"CA2_MULTIABILITY",CA2_MULTIABILITY},
|
||||
{"CA2_MELEE",CA2_MELEE},
|
||||
|
||||
// Sound flags
|
||||
{"SF_TOTALLYSINGLE",SF_TOTALLYSINGLE},
|
||||
|
|
@ -7246,9 +7231,11 @@ struct {
|
|||
{"PA_PEEL",PA_PEEL},
|
||||
{"PA_PAIN",PA_PAIN},
|
||||
{"PA_ROLL",PA_ROLL},
|
||||
{"PA_JUMP",PA_JUMP},
|
||||
{"PA_SPRING",PA_SPRING},
|
||||
{"PA_FALL",PA_FALL},
|
||||
{"PA_ABILITY",PA_ABILITY},
|
||||
{"PA_ABILITY2",PA_ABILITY2},
|
||||
{"PA_RIDE",PA_RIDE},
|
||||
|
||||
// Current weapon
|
||||
|
|
|
|||
|
|
@ -207,7 +207,7 @@ typedef struct
|
|||
|
||||
#define ZSHIFT 4
|
||||
|
||||
extern const char *Color_Names[MAXSKINCOLORS];
|
||||
extern const char *Color_Names[MAXSKINCOLORS + NUMSUPERCOLORS];
|
||||
extern const UINT8 Color_Opposite[MAXSKINCOLORS*2];
|
||||
|
||||
#define NUMMAPS 1035
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@
|
|||
#endif
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#define NONET
|
||||
#if !defined (HWRENDER) && !defined (NOHW)
|
||||
#define HWRENDER
|
||||
#endif
|
||||
|
|
@ -158,7 +159,7 @@ extern FILE *logstream;
|
|||
|
||||
// Does this version require an added patch file?
|
||||
// Comment or uncomment this as necessary.
|
||||
//#define USE_PATCH_DTA
|
||||
#define USE_PATCH_DTA
|
||||
|
||||
// Modification options
|
||||
// If you want to take advantage of the Master Server's ability to force clients to update
|
||||
|
|
@ -257,32 +258,69 @@ typedef enum
|
|||
SKINCOLOR_MAGENTA,
|
||||
SKINCOLOR_PINK,
|
||||
SKINCOLOR_ROSY,
|
||||
//SKINCOLOR_?
|
||||
//SKINCOLOR_?
|
||||
|
||||
// Careful! MAXSKINCOLORS cannot be greater than 0x20!
|
||||
// Careful! MAXSKINCOLORS cannot be greater than 0x20! Two slots left...
|
||||
MAXSKINCOLORS,
|
||||
|
||||
// Super special awesome Super flashing colors!
|
||||
SKINCOLOR_SUPER1 = MAXSKINCOLORS,
|
||||
SKINCOLOR_SUPER2,
|
||||
SKINCOLOR_SUPER3,
|
||||
SKINCOLOR_SUPER4,
|
||||
SKINCOLOR_SUPER5,
|
||||
SKINCOLOR_SUPERSILVER1 = MAXSKINCOLORS,
|
||||
SKINCOLOR_SUPERSILVER2,
|
||||
SKINCOLOR_SUPERSILVER3,
|
||||
SKINCOLOR_SUPERSILVER4,
|
||||
SKINCOLOR_SUPERSILVER5,
|
||||
|
||||
// Super Tails
|
||||
SKINCOLOR_TSUPER1,
|
||||
SKINCOLOR_TSUPER2,
|
||||
SKINCOLOR_TSUPER3,
|
||||
SKINCOLOR_TSUPER4,
|
||||
SKINCOLOR_TSUPER5,
|
||||
SKINCOLOR_SUPERRED1,
|
||||
SKINCOLOR_SUPERRED2,
|
||||
SKINCOLOR_SUPERRED3,
|
||||
SKINCOLOR_SUPERRED4,
|
||||
SKINCOLOR_SUPERRED5,
|
||||
|
||||
// Super Knuckles
|
||||
SKINCOLOR_KSUPER1,
|
||||
SKINCOLOR_KSUPER2,
|
||||
SKINCOLOR_KSUPER3,
|
||||
SKINCOLOR_KSUPER4,
|
||||
SKINCOLOR_KSUPER5,
|
||||
SKINCOLOR_SUPERORANGE1,
|
||||
SKINCOLOR_SUPERORANGE2,
|
||||
SKINCOLOR_SUPERORANGE3,
|
||||
SKINCOLOR_SUPERORANGE4,
|
||||
SKINCOLOR_SUPERORANGE5,
|
||||
|
||||
MAXTRANSLATIONS
|
||||
SKINCOLOR_SUPERGOLD1,
|
||||
SKINCOLOR_SUPERGOLD2,
|
||||
SKINCOLOR_SUPERGOLD3,
|
||||
SKINCOLOR_SUPERGOLD4,
|
||||
SKINCOLOR_SUPERGOLD5,
|
||||
|
||||
SKINCOLOR_SUPERPERIDOT1,
|
||||
SKINCOLOR_SUPERPERIDOT2,
|
||||
SKINCOLOR_SUPERPERIDOT3,
|
||||
SKINCOLOR_SUPERPERIDOT4,
|
||||
SKINCOLOR_SUPERPERIDOT5,
|
||||
|
||||
SKINCOLOR_SUPERCYAN1,
|
||||
SKINCOLOR_SUPERCYAN2,
|
||||
SKINCOLOR_SUPERCYAN3,
|
||||
SKINCOLOR_SUPERCYAN4,
|
||||
SKINCOLOR_SUPERCYAN5,
|
||||
|
||||
SKINCOLOR_SUPERPURPLE1,
|
||||
SKINCOLOR_SUPERPURPLE2,
|
||||
SKINCOLOR_SUPERPURPLE3,
|
||||
SKINCOLOR_SUPERPURPLE4,
|
||||
SKINCOLOR_SUPERPURPLE5,
|
||||
|
||||
SKINCOLOR_SUPERRUST1,
|
||||
SKINCOLOR_SUPERRUST2,
|
||||
SKINCOLOR_SUPERRUST3,
|
||||
SKINCOLOR_SUPERRUST4,
|
||||
SKINCOLOR_SUPERRUST5,
|
||||
|
||||
SKINCOLOR_SUPERTAN1,
|
||||
SKINCOLOR_SUPERTAN2,
|
||||
SKINCOLOR_SUPERTAN3,
|
||||
SKINCOLOR_SUPERTAN4,
|
||||
SKINCOLOR_SUPERTAN5,
|
||||
|
||||
MAXTRANSLATIONS,
|
||||
NUMSUPERCOLORS = ((MAXTRANSLATIONS - MAXSKINCOLORS)/5)
|
||||
} skincolors_t;
|
||||
|
||||
// State updates, number of tics / second.
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
42
src/g_game.c
42
src/g_game.c
|
|
@ -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.
|
||||
|
|
@ -2043,6 +2047,8 @@ void G_PlayerReborn(INT32 player)
|
|||
INT32 score;
|
||||
INT32 lives;
|
||||
INT32 continues;
|
||||
fixed_t camerascale;
|
||||
fixed_t shieldscale;
|
||||
UINT8 charability;
|
||||
UINT8 charability2;
|
||||
fixed_t normalspeed;
|
||||
|
|
@ -2066,6 +2072,8 @@ void G_PlayerReborn(INT32 player)
|
|||
INT32 starpostnum;
|
||||
INT32 starpostangle;
|
||||
fixed_t jumpfactor;
|
||||
fixed_t height;
|
||||
fixed_t spinheight;
|
||||
INT32 exiting;
|
||||
INT16 numboxes;
|
||||
INT16 totalring;
|
||||
|
|
@ -2097,6 +2105,8 @@ void G_PlayerReborn(INT32 player)
|
|||
|
||||
skincolor = players[player].skincolor;
|
||||
skin = players[player].skin;
|
||||
camerascale = players[player].camerascale;
|
||||
shieldscale = players[player].shieldscale;
|
||||
charability = players[player].charability;
|
||||
charability2 = players[player].charability2;
|
||||
normalspeed = players[player].normalspeed;
|
||||
|
|
@ -2113,6 +2123,8 @@ void G_PlayerReborn(INT32 player)
|
|||
starpostnum = players[player].starpostnum;
|
||||
starpostangle = players[player].starpostangle;
|
||||
jumpfactor = players[player].jumpfactor;
|
||||
height = players[player].height;
|
||||
spinheight = players[player].spinheight;
|
||||
thokitem = players[player].thokitem;
|
||||
spinitem = players[player].spinitem;
|
||||
revitem = players[player].revitem;
|
||||
|
|
@ -2138,6 +2150,8 @@ void G_PlayerReborn(INT32 player)
|
|||
// save player config truth reborn
|
||||
p->skincolor = skincolor;
|
||||
p->skin = skin;
|
||||
p->camerascale = camerascale;
|
||||
p->shieldscale = shieldscale;
|
||||
p->charability = charability;
|
||||
p->charability2 = charability2;
|
||||
p->normalspeed = normalspeed;
|
||||
|
|
@ -2160,6 +2174,8 @@ void G_PlayerReborn(INT32 player)
|
|||
p->starpostnum = starpostnum;
|
||||
p->starpostangle = starpostangle;
|
||||
p->jumpfactor = jumpfactor;
|
||||
p->height = height;
|
||||
p->spinheight = spinheight;
|
||||
p->exiting = exiting;
|
||||
|
||||
p->numboxes = numboxes;
|
||||
|
|
@ -4345,12 +4361,18 @@ void G_GhostTicker(void)
|
|||
// Tick ghost colors (Super and Mario Invincibility flashing)
|
||||
switch(g->color)
|
||||
{
|
||||
case GHC_SUPER: // Super Sonic (P_DoSuperStuff)
|
||||
g->mo->color = SKINCOLOR_SUPER1;
|
||||
case GHC_SUPER: // Super (P_DoSuperStuff)
|
||||
if (g->mo->skin)
|
||||
{
|
||||
skin_t *skin = (skin_t *)g->mo->skin;
|
||||
g->mo->color = skin->supercolor;
|
||||
}
|
||||
else
|
||||
g->mo->color = SKINCOLOR_SUPERGOLD1;
|
||||
g->mo->color += abs( ( (signed)( (unsigned)leveltime >> 1 ) % 9) - 4);
|
||||
break;
|
||||
case GHC_INVINCIBLE: // Mario invincibility (P_CheckInvincibilityTimer)
|
||||
g->mo->color = (UINT8)(leveltime % MAXSKINCOLORS);
|
||||
g->mo->color = (UINT8)(SKINCOLOR_RED + (leveltime % (MAXSKINCOLORS - SKINCOLOR_RED))); // Passes through all saturated colours
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
@ -4686,6 +4708,8 @@ void G_BeginRecording(void)
|
|||
demo_p += 16;
|
||||
|
||||
// Stats
|
||||
WRITEUINT8(demo_p,player->camerascale>>FRACBITS);
|
||||
WRITEUINT8(demo_p,player->shieldscale>>FRACBITS);
|
||||
WRITEUINT8(demo_p,player->charability);
|
||||
WRITEUINT8(demo_p,player->charability2);
|
||||
WRITEUINT8(demo_p,player->actionspd>>FRACBITS);
|
||||
|
|
@ -4696,6 +4720,8 @@ void G_BeginRecording(void)
|
|||
WRITEUINT8(demo_p,player->thrustfactor);
|
||||
WRITEUINT8(demo_p,player->accelstart);
|
||||
WRITEUINT8(demo_p,player->acceleration);
|
||||
WRITEUINT8(demo_p,player->height>>FRACBITS);
|
||||
WRITEUINT8(demo_p,player->spinheight>>FRACBITS);
|
||||
|
||||
// Trying to convert it back to % causes demo desync due to precision loss.
|
||||
// Don't do it.
|
||||
|
|
@ -4926,7 +4952,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
char skin[17],color[17],*n,*pdemoname;
|
||||
UINT8 version,subversion,charability,charability2,thrustfactor,accelstart,acceleration;
|
||||
UINT32 randseed;
|
||||
fixed_t actionspd,mindash,maxdash,normalspeed,runspeed,jumpfactor;
|
||||
fixed_t camerascale,shieldscale,actionspd,mindash,maxdash,normalspeed,runspeed,jumpfactor,height,spinheight;
|
||||
char msg[1024];
|
||||
|
||||
skin[16] = '\0';
|
||||
|
|
@ -5062,6 +5088,8 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
M_Memcpy(color,demo_p,16);
|
||||
demo_p += 16;
|
||||
|
||||
camerascale = (fixed_t)READUINT8(demo_p)<<FRACBITS;
|
||||
shieldscale = (fixed_t)READUINT8(demo_p)<<FRACBITS;
|
||||
charability = READUINT8(demo_p);
|
||||
charability2 = READUINT8(demo_p);
|
||||
actionspd = (fixed_t)READUINT8(demo_p)<<FRACBITS;
|
||||
|
|
@ -5072,6 +5100,8 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
thrustfactor = READUINT8(demo_p);
|
||||
accelstart = READUINT8(demo_p);
|
||||
acceleration = READUINT8(demo_p);
|
||||
height = (fixed_t)READUINT8(demo_p)<<FRACBITS;
|
||||
spinheight = (fixed_t)READUINT8(demo_p)<<FRACBITS;
|
||||
jumpfactor = READFIXED(demo_p);
|
||||
|
||||
// net var data
|
||||
|
|
@ -5135,6 +5165,8 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
// Set saved attribute values
|
||||
// No cheat checking here, because even if they ARE wrong...
|
||||
// it would only break the replay if we clipped them.
|
||||
players[0].camerascale = camerascale;
|
||||
players[0].shieldscale = shieldscale;
|
||||
players[0].charability = charability;
|
||||
players[0].charability2 = charability2;
|
||||
players[0].actionspd = actionspd;
|
||||
|
|
@ -5146,6 +5178,8 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
players[0].accelstart = accelstart;
|
||||
players[0].acceleration = acceleration;
|
||||
players[0].jumpfactor = jumpfactor;
|
||||
players[0].height = height;
|
||||
players[0].spinheight = spinheight;
|
||||
|
||||
demo_start = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -237,7 +237,7 @@ light_t *t_lspr[NUMSPRITES] =
|
|||
|
||||
// Interactive Objects
|
||||
&lspr[NOLIGHT], // SPR_FANS
|
||||
&lspr[NOLIGHT], // SPR_BUBL
|
||||
&lspr[NOLIGHT], // SPR_BBLS
|
||||
&lspr[NOLIGHT], // SPR_SIGN
|
||||
&lspr[NOLIGHT], // SPR_STEM
|
||||
&lspr[NOLIGHT], // SPR_SPIK
|
||||
|
|
@ -382,11 +382,8 @@ light_t *t_lspr[NUMSPRITES] =
|
|||
&lspr[NOLIGHT], // SPR_SPLH
|
||||
&lspr[NOLIGHT], // SPR_SPLA
|
||||
&lspr[NOLIGHT], // SPR_SMOK
|
||||
&lspr[NOLIGHT], // SPR_BUBP
|
||||
&lspr[NOLIGHT], // SPR_BUBO
|
||||
&lspr[NOLIGHT], // SPR_BUBN
|
||||
&lspr[NOLIGHT], // SPR_BUBM
|
||||
&lspr[NOLIGHT], // SPR_POPP
|
||||
&lspr[NOLIGHT], // SPR_BUBL
|
||||
&lspr[SUPERSPARK_L], // SPR_WZAP
|
||||
&lspr[SUPERSPARK_L], // SPR_TFOG
|
||||
&lspr[NIGHTSLIGHT_L], // SPR_SEED // Sonic CD flower seed
|
||||
&lspr[NOLIGHT], // SPR_PRTL
|
||||
|
|
@ -437,16 +434,12 @@ light_t *t_lspr[NUMSPRITES] =
|
|||
|
||||
// NiGHTS Stuff
|
||||
&lspr[SUPERSONIC_L], // SPR_NDRN // NiGHTS drone
|
||||
&lspr[SUPERSONIC_L], // SPR_SUPE // NiGHTS character flying
|
||||
&lspr[SUPERSONIC_L], // SPR_SUPZ // NiGHTS hurt
|
||||
&lspr[SUPERSONIC_L], // SPR_NDRL // NiGHTS character drilling
|
||||
&lspr[NOLIGHT], // SPR_NSPK
|
||||
&lspr[NOLIGHT], // SPR_NBMP
|
||||
&lspr[NOLIGHT], // SPR_HOOP
|
||||
&lspr[NOLIGHT], // SPR_HSCR
|
||||
&lspr[NOLIGHT], // SPR_NPRU
|
||||
&lspr[NOLIGHT], // SPR_CAPS
|
||||
&lspr[SUPERSONIC_L], // SPR_SUPT
|
||||
|
||||
// Debris
|
||||
&lspr[RINGSPARK_L], // SPR_SPRK
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -4592,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;
|
||||
|
|
@ -4609,6 +4603,7 @@ static planeinfo_t *planeinfo = NULL;
|
|||
typedef struct
|
||||
{
|
||||
polyobj_t *polysector;
|
||||
boolean isceiling;
|
||||
fixed_t fixedheight;
|
||||
INT32 lightlevel;
|
||||
lumpnum_t lumpnum;
|
||||
|
|
@ -4644,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;
|
||||
|
|
@ -4659,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;
|
||||
|
|
@ -4669,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;
|
||||
|
|
@ -4689,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;
|
||||
|
|
@ -4854,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)
|
||||
|
|
@ -4864,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)
|
||||
|
|
@ -5096,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);
|
||||
|
|
@ -6161,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;
|
||||
|
|
|
|||
|
|
@ -1035,32 +1035,151 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
|||
case SKINCOLOR_ROSY:
|
||||
blendcolor = V_GetColor(202);
|
||||
break;
|
||||
case SKINCOLOR_SUPER1:
|
||||
|
||||
case SKINCOLOR_SUPERSILVER1: // Super silver
|
||||
blendcolor = V_GetColor(0);
|
||||
break;
|
||||
case SKINCOLOR_SUPERSILVER2:
|
||||
blendcolor = V_GetColor(2);
|
||||
break;
|
||||
case SKINCOLOR_SUPERSILVER3:
|
||||
blendcolor = V_GetColor(4);
|
||||
break;
|
||||
case SKINCOLOR_SUPERSILVER4:
|
||||
blendcolor = V_GetColor(7);
|
||||
break;
|
||||
case SKINCOLOR_SUPERSILVER5:
|
||||
blendcolor = V_GetColor(10);
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERRED1: // Super red
|
||||
blendcolor = V_GetColor(208);
|
||||
break;
|
||||
case SKINCOLOR_SUPERRED2:
|
||||
blendcolor = V_GetColor(210);
|
||||
break;
|
||||
case SKINCOLOR_SUPERRED3:
|
||||
blendcolor = V_GetColor(32);
|
||||
break;
|
||||
case SKINCOLOR_SUPERRED4:
|
||||
blendcolor = V_GetColor(33);
|
||||
break;
|
||||
case SKINCOLOR_SUPERRED5:
|
||||
blendcolor = V_GetColor(35);
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERORANGE1: // Super orange
|
||||
blendcolor = V_GetColor(208);
|
||||
break;
|
||||
case SKINCOLOR_SUPERORANGE2:
|
||||
blendcolor = V_GetColor(48);
|
||||
break;
|
||||
case SKINCOLOR_SUPERORANGE3:
|
||||
blendcolor = V_GetColor(50);
|
||||
break;
|
||||
case SKINCOLOR_SUPERORANGE4:
|
||||
blendcolor = V_GetColor(54);
|
||||
break;
|
||||
case SKINCOLOR_SUPERORANGE5:
|
||||
blendcolor = V_GetColor(58);
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERGOLD1: // Super gold
|
||||
blendcolor = V_GetColor(80);
|
||||
break;
|
||||
case SKINCOLOR_SUPER2:
|
||||
case SKINCOLOR_SUPERGOLD2:
|
||||
blendcolor = V_GetColor(83);
|
||||
break;
|
||||
case SKINCOLOR_SUPER3:
|
||||
case SKINCOLOR_SUPERGOLD3:
|
||||
blendcolor = V_GetColor(73);
|
||||
break;
|
||||
case SKINCOLOR_SUPER4:
|
||||
case SKINCOLOR_SUPERGOLD4:
|
||||
blendcolor = V_GetColor(64);
|
||||
break;
|
||||
case SKINCOLOR_SUPER5:
|
||||
case SKINCOLOR_SUPERGOLD5:
|
||||
blendcolor = V_GetColor(67);
|
||||
break;
|
||||
|
||||
case SKINCOLOR_TSUPER1:
|
||||
case SKINCOLOR_TSUPER2:
|
||||
case SKINCOLOR_TSUPER3:
|
||||
case SKINCOLOR_TSUPER4:
|
||||
case SKINCOLOR_TSUPER5:
|
||||
case SKINCOLOR_KSUPER1:
|
||||
case SKINCOLOR_KSUPER2:
|
||||
case SKINCOLOR_KSUPER3:
|
||||
case SKINCOLOR_KSUPER4:
|
||||
case SKINCOLOR_KSUPER5:
|
||||
case SKINCOLOR_SUPERPERIDOT1: // Super peridot
|
||||
blendcolor = V_GetColor(88);
|
||||
break;
|
||||
case SKINCOLOR_SUPERPERIDOT2:
|
||||
blendcolor = V_GetColor(188);
|
||||
break;
|
||||
case SKINCOLOR_SUPERPERIDOT3:
|
||||
blendcolor = V_GetColor(189);
|
||||
break;
|
||||
case SKINCOLOR_SUPERPERIDOT4:
|
||||
blendcolor = V_GetColor(190);
|
||||
break;
|
||||
case SKINCOLOR_SUPERPERIDOT5:
|
||||
blendcolor = V_GetColor(191);
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERCYAN1: // Super cyan
|
||||
blendcolor = V_GetColor(128);
|
||||
break;
|
||||
case SKINCOLOR_SUPERCYAN2:
|
||||
blendcolor = V_GetColor(131);
|
||||
break;
|
||||
case SKINCOLOR_SUPERCYAN3:
|
||||
blendcolor = V_GetColor(133);
|
||||
break;
|
||||
case SKINCOLOR_SUPERCYAN4:
|
||||
blendcolor = V_GetColor(134);
|
||||
break;
|
||||
case SKINCOLOR_SUPERCYAN5:
|
||||
blendcolor = V_GetColor(136);
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERPURPLE1: // Super purple
|
||||
blendcolor = V_GetColor(144);
|
||||
break;
|
||||
case SKINCOLOR_SUPERPURPLE2:
|
||||
blendcolor = V_GetColor(162);
|
||||
break;
|
||||
case SKINCOLOR_SUPERPURPLE3:
|
||||
blendcolor = V_GetColor(164);
|
||||
break;
|
||||
case SKINCOLOR_SUPERPURPLE4:
|
||||
blendcolor = V_GetColor(166);
|
||||
break;
|
||||
case SKINCOLOR_SUPERPURPLE5:
|
||||
blendcolor = V_GetColor(168);
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERRUST1: // Super rust
|
||||
blendcolor = V_GetColor(51);
|
||||
break;
|
||||
case SKINCOLOR_SUPERRUST2:
|
||||
blendcolor = V_GetColor(54);
|
||||
break;
|
||||
case SKINCOLOR_SUPERRUST3:
|
||||
blendcolor = V_GetColor(68);
|
||||
break;
|
||||
case SKINCOLOR_SUPERRUST4:
|
||||
blendcolor = V_GetColor(70);
|
||||
break;
|
||||
case SKINCOLOR_SUPERRUST5:
|
||||
blendcolor = V_GetColor(234);
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERTAN1: // Super tan
|
||||
blendcolor = V_GetColor(80);
|
||||
break;
|
||||
case SKINCOLOR_SUPERTAN2:
|
||||
blendcolor = V_GetColor(82);
|
||||
break;
|
||||
case SKINCOLOR_SUPERTAN3:
|
||||
blendcolor = V_GetColor(84);
|
||||
break;
|
||||
case SKINCOLOR_SUPERTAN4:
|
||||
blendcolor = V_GetColor(87);
|
||||
break;
|
||||
case SKINCOLOR_SUPERTAN5:
|
||||
blendcolor = V_GetColor(247);
|
||||
break;
|
||||
|
||||
default:
|
||||
blendcolor = V_GetColor(255);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -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__)
|
||||
|
|
|
|||
332
src/info.c
332
src/info.c
|
|
@ -33,7 +33,7 @@ char sprnames[NUMSPRITES + 1][5] =
|
|||
"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",
|
||||
"TOKE","RFLG","BFLG","NWNG","EMBM","CEMG","EMER","FANS","BBLS","SIGN",
|
||||
"STEM","SPIK","SFLM","USPK","STPT","BMNE","SRBX","RRBX","BRBX","SHTV",
|
||||
"PINV","YLTV","BLTV","BKTV","WHTV","GRTV","ELTV","EGGB","MIXU","RECY",
|
||||
"QUES","GBTV","PRUP","PTTV","MTEX","MISL","TORP","ENRG","MINE","JBUL",
|
||||
|
|
@ -44,16 +44,16 @@ char sprnames[NUMSPRITES + 1][5] =
|
|||
"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",
|
||||
"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",
|
||||
"RAIN","SNO1","SPLH","SPLA","SMOK","BUBL","WZAP","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","NSPK","NBMP","HOOP",
|
||||
"NSCR","NPRU","CAPS","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] =
|
||||
|
|
@ -79,19 +79,24 @@ char spr2names[NUMPLAYERSPRITES][5] =
|
|||
"LIFE",
|
||||
|
||||
"FLY_",
|
||||
"SWIM",
|
||||
"TIRE",
|
||||
|
||||
"GLID",
|
||||
"CLNG",
|
||||
"CLMB",
|
||||
|
||||
"TWIN",
|
||||
|
||||
"MLEE",
|
||||
|
||||
"TRNS",
|
||||
"SSTD",
|
||||
"SWLK",
|
||||
"SRUN",
|
||||
"SPEE",
|
||||
"SPAN",
|
||||
"SMSL",
|
||||
"SSTN",
|
||||
"SDTH",
|
||||
"SDRN",
|
||||
"SSPN",
|
||||
|
|
@ -101,7 +106,42 @@ char spr2names[NUMPLAYERSPRITES][5] =
|
|||
"SFAL",
|
||||
"SEDG",
|
||||
"SRID",
|
||||
"SFLT"
|
||||
"SFLT",
|
||||
|
||||
"NTRN",
|
||||
"NSTD",
|
||||
"NFLT",
|
||||
"NPAN",
|
||||
"NPUL",
|
||||
"NATK",
|
||||
|
||||
"NGT0",
|
||||
"NGT1",
|
||||
"NGT2",
|
||||
"NGT3",
|
||||
"NGT4",
|
||||
"NGT5",
|
||||
"NGT6",
|
||||
"NGT7",
|
||||
"NGT8",
|
||||
"NGT9",
|
||||
"NGTA",
|
||||
"NGTB",
|
||||
"NGTC",
|
||||
|
||||
"DRL0",
|
||||
"DRL1",
|
||||
"DRL2",
|
||||
"DRL3",
|
||||
"DRL4",
|
||||
"DRL5",
|
||||
"DRL6",
|
||||
"DRL7",
|
||||
"DRL8",
|
||||
"DRL9",
|
||||
"DRLA",
|
||||
"DRLB",
|
||||
"DRLC"
|
||||
};
|
||||
enum playersprite free_spr2 = SPR2_FIRSTFREESLOT;
|
||||
|
||||
|
|
@ -148,22 +188,30 @@ state_t states[NUMSTATES] =
|
|||
{SPR_PLAY, SPR2_EDGE, 12, {NULL}, 0, 0, S_PLAY_EDGE}, // S_PLAY_EDGE
|
||||
{SPR_PLAY, SPR2_RIDE, 4, {NULL}, 0, 0, S_PLAY_RIDE}, // S_PLAY_RIDE
|
||||
|
||||
// Tails abilities
|
||||
// CA_FLY/CA_SWIM
|
||||
{SPR_PLAY, SPR2_FLY , 2, {NULL}, 0, 0, S_PLAY_FLY}, // S_PLAY_FLY
|
||||
{SPR_PLAY, SPR2_SWIM, 2, {NULL}, 0, 0, S_PLAY_SWIM}, // S_PLAY_SWIM
|
||||
{SPR_PLAY, SPR2_TIRE, 12, {NULL}, 0, 0, S_PLAY_FLY_TIRED}, // S_PLAY_FLY_TIRED
|
||||
|
||||
// Knuckles abilities
|
||||
// CA_GLIDEANDCLIMB
|
||||
{SPR_PLAY, SPR2_GLID, 2, {NULL}, 0, 0, S_PLAY_GLIDE}, // S_PLAY_GLIDE
|
||||
{SPR_PLAY, SPR2_CLNG, 6, {NULL}, 0, 0, S_PLAY_CLING}, // S_PLAY_CLING
|
||||
{SPR_PLAY, SPR2_CLMB, 5, {NULL}, 0, 0, S_PLAY_CLIMB}, // S_PLAY_CLIMB
|
||||
|
||||
// Super Sonic
|
||||
// CA_TWINSPIN
|
||||
{SPR_PLAY, SPR2_TWIN|FF_SPR2ENDSTATE, 1, {NULL}, S_PLAY_JUMP, 0, S_PLAY_TWINSPIN}, // S_PLAY_TWINSPIN
|
||||
|
||||
// CA2_MELEE
|
||||
{SPR_PLAY, SPR2_MLEE|FF_SPR2ENDSTATE, 1, {NULL}, S_PLAY_MELEE_FINISH, 0, S_PLAY_MELEE}, // S_PLAY_MELEE
|
||||
{SPR_PLAY, SPR2_MLEE, 20, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_MELEE_FINISH
|
||||
|
||||
// SF_SUPERANIMS
|
||||
{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_SSTN, -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
|
||||
{SPR_PLAY, SPR2_SDRN, 4, {NULL}, 0, 0, S_PLAY_SUPER_DRWN}, // S_PLAY_SUPER_DRWN
|
||||
{SPR_PLAY, SPR2_SSPN, 1, {NULL}, 0, 0, S_PLAY_SUPER_SPIN}, // S_PLAY_SUPER_SPIN
|
||||
|
|
@ -175,16 +223,16 @@ state_t states[NUMSTATES] =
|
|||
{SPR_PLAY, SPR2_SRID, 4, {NULL}, 0, 0, S_PLAY_SUPER_RIDE}, // S_PLAY_SUPER_RIDE
|
||||
{SPR_PLAY, SPR2_SFLT, 7, {NULL}, 0, 0, S_PLAY_SUPER_FLOAT}, // S_PLAY_SUPER_FLOAT
|
||||
|
||||
// Transforming into Super
|
||||
// SF_SUPER
|
||||
{SPR_PLAY, SPR2_TRNS, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS2}, // S_PLAY_SUPER_TRANS
|
||||
{SPR_PLAY, SPR2_TRNS, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS3}, // S_PLAY_SUPER_TRANS2
|
||||
{SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS4}, // S_PLAY_SUPER_TRANS3
|
||||
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS5}, // S_PLAY_SUPER_TRANS4
|
||||
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS6}, // S_PLAY_SUPER_TRANS5
|
||||
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS7}, // S_PLAY_SUPER_TRANS6
|
||||
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS8}, // S_PLAY_SUPER_TRANS7
|
||||
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS9}, // S_PLAY_SUPER_TRANS8
|
||||
{SPR_PLAY, SPR2_TRNS, 16, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_SUPER_TRANS9
|
||||
{SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS5}, // S_PLAY_SUPER_TRANS4
|
||||
{SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS6}, // S_PLAY_SUPER_TRANS5
|
||||
{SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS7}, // S_PLAY_SUPER_TRANS6
|
||||
{SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS8}, // S_PLAY_SUPER_TRANS7
|
||||
{SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS9}, // S_PLAY_SUPER_TRANS8
|
||||
{SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 16, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_SUPER_TRANS9
|
||||
|
||||
{SPR_NULL, 0, -1, {NULL}, 0, 0, S_OBJPLACE_DUMMY}, //S_OBJPLACE_DUMMY
|
||||
|
||||
|
|
@ -198,6 +246,52 @@ state_t states[NUMSTATES] =
|
|||
// Level end sign (uses player sprite)
|
||||
{SPR_PLAY, SPR2_SIGN, 1, {NULL}, 0, 24, S_PLAY_SIGN}, // S_PLAY_SIGN
|
||||
|
||||
// NiGHTS Player, transforming
|
||||
{SPR_PLAY, SPR2_NTRN, 4, {A_Scream}, 0, 0, S_PLAY_NIGHTS_TRANS2}, // S_PLAY_NIGHTS_TRANS
|
||||
{SPR_PLAY, SPR2_NTRN, 4, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS3}, // S_PLAY_NIGHTS_TRANS2
|
||||
{SPR_PLAY, SPR2_NTRN|FF_FULLBRIGHT, 4, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS4}, // S_PLAY_NIGHTS_TRANS3
|
||||
{SPR_PLAY, SPR2_NTRN, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS5}, // S_PLAY_NIGHTS_TRANS4
|
||||
{SPR_PLAY, SPR2_NTRN, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS6}, // S_PLAY_NIGHTS_TRANS5
|
||||
{SPR_PLAY, SPR2_NTRN, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS7}, // S_PLAY_NIGHTS_TRANS6
|
||||
{SPR_PLAY, SPR2_NTRN, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS8}, // S_PLAY_NIGHTS_TRANS7
|
||||
{SPR_PLAY, SPR2_NTRN, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS9}, // S_PLAY_NIGHTS_TRANS8
|
||||
{SPR_PLAY, SPR2_NTRN, 16, {NULL}, 0, 0, S_PLAY_NIGHTS_FLOAT}, // S_PLAY_NIGHTS_TRANS9
|
||||
|
||||
// NiGHTS Player, Stand, Floating, Pain, Pull and Attack
|
||||
{SPR_PLAY, SPR2_NSTD, 7, {NULL}, 0, 0, S_PLAY_NIGHTS_STAND}, // S_PLAY_NIGHTS_STAND
|
||||
{SPR_PLAY, SPR2_NFLT, 7, {NULL}, 0, 0, S_PLAY_NIGHTS_FLOAT}, // S_PLAY_NIGHTS_FLOAT
|
||||
{SPR_PLAY, SPR2_NPAN, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_PAIN}, // S_PLAY_NIGHTS_PAIN
|
||||
{SPR_PLAY, SPR2_NPUL, 1, {NULL}, 0, 0, S_PLAY_NIGHTS_PULL}, // S_PLAY_NIGHTS_PULL
|
||||
{SPR_PLAY, SPR2_NATK, 1, {NULL}, 0, 0, S_PLAY_NIGHTS_ATTACK}, // S_PLAY_NIGHTS_ATTACK
|
||||
|
||||
// NiGHTS Player, Flying and Drilling
|
||||
{SPR_PLAY, SPR2_NGT0, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY0}, // S_PLAY_NIGHTS_FLY0
|
||||
{SPR_PLAY, SPR2_DRL0, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL0}, // S_PLAY_NIGHTS_DRILL0
|
||||
{SPR_PLAY, SPR2_NGT1, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY1}, // S_PLAY_NIGHTS_FLY1
|
||||
{SPR_PLAY, SPR2_DRL1, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL1}, // S_PLAY_NIGHTS_DRILL1
|
||||
{SPR_PLAY, SPR2_NGT2, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY2}, // S_PLAY_NIGHTS_FLY2
|
||||
{SPR_PLAY, SPR2_DRL2, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL2}, // S_PLAY_NIGHTS_DRILL2
|
||||
{SPR_PLAY, SPR2_NGT3, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY3}, // S_PLAY_NIGHTS_FLY3
|
||||
{SPR_PLAY, SPR2_DRL3, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL3}, // S_PLAY_NIGHTS_DRILL3
|
||||
{SPR_PLAY, SPR2_NGT4, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY4}, // S_PLAY_NIGHTS_FLY4
|
||||
{SPR_PLAY, SPR2_DRL4, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL4}, // S_PLAY_NIGHTS_DRILL4
|
||||
{SPR_PLAY, SPR2_NGT5, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY5}, // S_PLAY_NIGHTS_FLY5
|
||||
{SPR_PLAY, SPR2_DRL5, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL5}, // S_PLAY_NIGHTS_DRILL5
|
||||
{SPR_PLAY, SPR2_NGT6, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY6}, // S_PLAY_NIGHTS_FLY6
|
||||
{SPR_PLAY, SPR2_DRL6, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL6}, // S_PLAY_NIGHTS_DRILL6
|
||||
{SPR_PLAY, SPR2_NGT7, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY7}, // S_PLAY_NIGHTS_FLY7
|
||||
{SPR_PLAY, SPR2_DRL7, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL7}, // S_PLAY_NIGHTS_DRILL7
|
||||
{SPR_PLAY, SPR2_NGT8, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY8}, // S_PLAY_NIGHTS_FLY8
|
||||
{SPR_PLAY, SPR2_DRL8, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL8}, // S_PLAY_NIGHTS_DRILL8
|
||||
{SPR_PLAY, SPR2_NGT9, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY9}, // S_PLAY_NIGHTS_FLY9
|
||||
{SPR_PLAY, SPR2_DRL9, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL9}, // S_PLAY_NIGHTS_DRILL9
|
||||
{SPR_PLAY, SPR2_NGTA, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLYA}, // S_PLAY_NIGHTS_FLYA
|
||||
{SPR_PLAY, SPR2_DRLA, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILLA}, // S_PLAY_NIGHTS_DRILLA
|
||||
{SPR_PLAY, SPR2_NGTB, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLYB}, // S_PLAY_NIGHTS_FLYB
|
||||
{SPR_PLAY, SPR2_DRLB, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILLB}, // S_PLAY_NIGHTS_DRILLB
|
||||
{SPR_PLAY, SPR2_NGTC, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLYC}, // S_PLAY_NIGHTS_FLYC
|
||||
{SPR_PLAY, SPR2_DRLC, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILLC}, // S_PLAY_NIGHTS_DRILLC
|
||||
|
||||
// Blue Crawla
|
||||
{SPR_POSS, 0, 5, {A_Look}, 0, 0, S_POSS_STND}, // S_POSS_STND
|
||||
{SPR_POSS, 0, 3, {A_Chase}, 0, 0, S_POSS_RUN2}, // S_POSS_RUN1
|
||||
|
|
@ -1050,8 +1144,10 @@ state_t states[NUMSTATES] =
|
|||
{SPR_FANS, 4, 1, {A_FanBubbleSpawn}, 512, 0, S_FAN}, // S_FAN5
|
||||
|
||||
// Bubble Source
|
||||
{SPR_BUBL, 0, 8, {A_BubbleSpawn}, 2048, 0, S_BUBBLES2}, // S_BUBBLES1
|
||||
{SPR_BUBL, 1, 8, {A_BubbleCheck}, 0, 0, S_BUBBLES1}, // S_BUBBLES2
|
||||
{SPR_BBLS, 0, 8, {A_BubbleSpawn}, 2048, 0, S_BUBBLES2}, // S_BUBBLES1
|
||||
{SPR_BBLS, 1, 8, {A_BubbleCheck}, 0, 0, S_BUBBLES3}, // S_BUBBLES2
|
||||
{SPR_BBLS, 2, 8, {A_BubbleSpawn}, 2048, 0, S_BUBBLES4}, // S_BUBBLES3
|
||||
{SPR_BBLS, 3, 8, {A_BubbleCheck}, 0, 0, S_BUBBLES1}, // S_BUBBLES4
|
||||
|
||||
// Level End Sign
|
||||
{SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN2}, // S_SIGN1
|
||||
|
|
@ -1918,17 +2014,18 @@ state_t states[NUMSTATES] =
|
|||
{SPR_SMOK, FF_TRANS50|4, 8, {NULL}, 0, 0, S_NULL}, // S_SMOKE5
|
||||
|
||||
// Bubbles
|
||||
{SPR_BUBP, FF_TRANS50, 1, {A_BubbleRise}, 0, 1024, S_SMALLBUBBLE1}, // S_SMALLBUBBLE
|
||||
{SPR_BUBP, FF_TRANS50, 1, {A_BubbleRise}, 0, 1024, S_SMALLBUBBLE}, // S_SMALLBUBBLE1
|
||||
{SPR_BUBO, FF_TRANS50, 1, {A_BubbleRise}, 0, 1024, S_MEDIUMBUBBLE1}, // S_MEDIUMBUBBLE
|
||||
{SPR_BUBO, FF_TRANS50, 1, {A_BubbleRise}, 0, 1024, S_MEDIUMBUBBLE}, // S_MEDIUMBUBBLE1
|
||||
{SPR_BUBL, FF_TRANS50, 1, {A_BubbleRise}, 0, 1024, S_SMALLBUBBLE}, // S_SMALLBUBBLE
|
||||
{SPR_BUBL, FF_TRANS50|1, 1, {A_BubbleRise}, 0, 1024, S_MEDIUMBUBBLE}, // S_MEDIUMBUBBLE
|
||||
|
||||
// Extra Large Bubble (breathable)
|
||||
{SPR_BUBN, FF_TRANS50|FF_FULLBRIGHT, 16, {A_BubbleRise}, 0, 1024, S_EXTRALARGEBUBBLE}, // S_LARGEBUBBLE
|
||||
{SPR_BUBM, FF_TRANS50|FF_FULLBRIGHT, 16, {A_BubbleRise}, 0, 1024, S_EXTRALARGEBUBBLE}, // S_EXTRALARGEBUBBLE
|
||||
{SPR_BUBL, FF_TRANS50|FF_FULLBRIGHT|2, 8, {A_BubbleRise}, 0, 1024, S_LARGEBUBBLE2}, // S_LARGEBUBBLE1
|
||||
{SPR_BUBL, FF_TRANS50|FF_FULLBRIGHT|3, 8, {A_BubbleRise}, 0, 1024, S_EXTRALARGEBUBBLE}, // S_LARGEBUBBLE2
|
||||
{SPR_BUBL, FF_TRANS50|FF_FULLBRIGHT|4, 16, {A_BubbleRise}, 0, 1024, S_EXTRALARGEBUBBLE}, // S_EXTRALARGEBUBBLE
|
||||
|
||||
// Extra Large Bubble goes POP!
|
||||
{SPR_POPP, 0, 16, {NULL}, 0, 0, S_NULL}, // S_POP1
|
||||
{SPR_BUBL, 5, 16, {NULL}, 0, 0, S_NULL}, // S_POP1
|
||||
|
||||
{SPR_WZAP, FF_TRANS10|FF_ANIMATE|FF_MIDDLESTARTCHANCE, 4, {NULL}, 3, 2, S_NULL}, // S_WATERZAP
|
||||
|
||||
{SPR_TFOG, FF_FULLBRIGHT|FF_TRANS50, 2, {NULL}, 0, 0, S_FOG2}, // S_FOG1
|
||||
{SPR_TFOG, FF_FULLBRIGHT|FF_TRANS50|1, 2, {NULL}, 0, 0, S_FOG3}, // S_FOG2
|
||||
|
|
@ -1972,6 +2069,13 @@ state_t states[NUMSTATES] =
|
|||
{SPR_DRWN, 4, 40, {NULL}, 0, 0, S_NULL}, // S_FOUR1
|
||||
{SPR_DRWN, 5, 40, {NULL}, 0, 0, S_NULL}, // S_FIVE1
|
||||
|
||||
{SPR_DRWN, 6, 40, {NULL}, 0, 0, S_NULL}, // S_ZERO2
|
||||
{SPR_DRWN, 7, 40, {NULL}, 0, 0, S_NULL}, // S_ONE2
|
||||
{SPR_DRWN, 8, 40, {NULL}, 0, 0, S_NULL}, // S_TWO2
|
||||
{SPR_DRWN, 9, 40, {NULL}, 0, 0, S_NULL}, // S_THREE2
|
||||
{SPR_DRWN, 10, 40, {NULL}, 0, 0, S_NULL}, // S_FOUR2
|
||||
{SPR_DRWN, 11, 40, {NULL}, 0, 0, S_NULL}, // S_FIVE2
|
||||
|
||||
{SPR_TTAG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_TTAG1
|
||||
|
||||
// CTF Sign
|
||||
|
|
@ -2244,96 +2348,6 @@ state_t states[NUMSTATES] =
|
|||
{SPR_GOAL, 2, 4, {NULL}, 0, 0, S_NIGHTSGOAL4}, // S_NIGHTSGOAL3
|
||||
{SPR_GOAL, 3, 4, {NULL}, 0, 0, S_NIGHTSGOAL1}, // S_NIGHTSGOAL4
|
||||
|
||||
// Nights Player, Flying and Drilling
|
||||
{SPR_SUPE, 0, 1, {NULL}, 0, 0, S_NIGHTSFLY1B}, // S_NIGHTSFLY1A
|
||||
{SPR_SUPE, 1, 1, {NULL}, 0, 0, S_NIGHTSFLY1A}, // S_NIGHTSFLY1B
|
||||
{SPR_NDRL, 0, 2, {NULL}, 0, 0, S_NIGHTSDRILL1B}, // S_NIGHTSDRILL1A
|
||||
{SPR_NDRL, 1, 2, {NULL}, 0, 0, S_NIGHTSDRILL1C}, // S_NIGHTSDRILL1B
|
||||
{SPR_NDRL, 2, 2, {NULL}, 0, 0, S_NIGHTSDRILL1D}, // S_NIGHTSDRILL1C
|
||||
{SPR_NDRL, 3, 2, {NULL}, 0, 0, S_NIGHTSDRILL1A}, // S_NIGHTSDRILL1D
|
||||
{SPR_SUPE, 2, 1, {NULL}, 0, 0, S_NIGHTSFLY2B}, // S_NIGHTSFLY2A
|
||||
{SPR_SUPE, 3, 1, {NULL}, 0, 0, S_NIGHTSFLY2A}, // S_NIGHTSFLY2B
|
||||
{SPR_NDRL, 4, 2, {NULL}, 0, 0, S_NIGHTSDRILL2B}, // S_NIGHTSDRILL2A
|
||||
{SPR_NDRL, 5, 2, {NULL}, 0, 0, S_NIGHTSDRILL2C}, // S_NIGHTSDRILL2B
|
||||
{SPR_NDRL, 6, 2, {NULL}, 0, 0, S_NIGHTSDRILL2D}, // S_NIGHTSDRILL2C
|
||||
{SPR_NDRL, 7, 2, {NULL}, 0, 0, S_NIGHTSDRILL2A}, // S_NIGHTSDRILL2D
|
||||
{SPR_SUPE, 4, 1, {NULL}, 0, 0, S_NIGHTSFLY3B}, // S_NIGHTSFLY3A
|
||||
{SPR_SUPE, 5, 1, {NULL}, 0, 0, S_NIGHTSFLY3A}, // S_NIGHTSFLY3B
|
||||
{SPR_NDRL, 8, 2, {NULL}, 0, 0, S_NIGHTSDRILL3B}, // S_NIGHTSDRILL3A
|
||||
{SPR_NDRL, 9, 2, {NULL}, 0, 0, S_NIGHTSDRILL3C}, // S_NIGHTSDRILL3B
|
||||
{SPR_NDRL, 10, 2, {NULL}, 0, 0, S_NIGHTSDRILL3D}, // S_NIGHTSDRILL3C
|
||||
{SPR_NDRL, 11, 2, {NULL}, 0, 0, S_NIGHTSDRILL3A}, // S_NIGHTSDRILL3D
|
||||
{SPR_SUPE, 6, 1, {NULL}, 0, 0, S_NIGHTSFLY4B}, // S_NIGHTSFLY4A
|
||||
{SPR_SUPE, 7, 1, {NULL}, 0, 0, S_NIGHTSFLY4A}, // S_NIGHTSFLY4B
|
||||
{SPR_NDRL, 12, 2, {NULL}, 0, 0, S_NIGHTSDRILL4B}, // S_NIGHTSDRILL4A
|
||||
{SPR_NDRL, 13, 2, {NULL}, 0, 0, S_NIGHTSDRILL4C}, // S_NIGHTSDRILL4B
|
||||
{SPR_NDRL, 14, 2, {NULL}, 0, 0, S_NIGHTSDRILL4D}, // S_NIGHTSDRILL4C
|
||||
{SPR_NDRL, 15, 2, {NULL}, 0, 0, S_NIGHTSDRILL4A}, // S_NIGHTSDRILL4D
|
||||
{SPR_SUPE, 8, 1, {NULL}, 0, 0, S_NIGHTSFLY5B}, // S_NIGHTSFLY5A
|
||||
{SPR_SUPE, 9, 1, {NULL}, 0, 0, S_NIGHTSFLY5A}, // S_NIGHTSFLY5B
|
||||
{SPR_NDRL, 16, 2, {NULL}, 0, 0, S_NIGHTSDRILL5B}, // S_NIGHTSDRILL5A
|
||||
{SPR_NDRL, 17, 2, {NULL}, 0, 0, S_NIGHTSDRILL5C}, // S_NIGHTSDRILL5B
|
||||
{SPR_NDRL, 18, 2, {NULL}, 0, 0, S_NIGHTSDRILL5D}, // S_NIGHTSDRILL5C
|
||||
{SPR_NDRL, 19, 2, {NULL}, 0, 0, S_NIGHTSDRILL5A}, // S_NIGHTSDRILL5D
|
||||
{SPR_SUPE, 10, 1, {NULL}, 0, 0, S_NIGHTSFLY6B}, // S_NIGHTSFLY6A
|
||||
{SPR_SUPE, 11, 1, {NULL}, 0, 0, S_NIGHTSFLY6A}, // S_NIGHTSFLY6B
|
||||
{SPR_NDRL, 20, 2, {NULL}, 0, 0, S_NIGHTSDRILL6B}, // S_NIGHTSDRILL6A
|
||||
{SPR_NDRL, 21, 2, {NULL}, 0, 0, S_NIGHTSDRILL6C}, // S_NIGHTSDRILL6B
|
||||
{SPR_NDRL, 22, 2, {NULL}, 0, 0, S_NIGHTSDRILL6D}, // S_NIGHTSDRILL6C
|
||||
{SPR_NDRL, 23, 2, {NULL}, 0, 0, S_NIGHTSDRILL6A}, // S_NIGHTSDRILL6D
|
||||
{SPR_SUPE, 12, 1, {NULL}, 0, 0, S_NIGHTSFLY7B}, // S_NIGHTSFLY7A
|
||||
{SPR_SUPE, 13, 1, {NULL}, 0, 0, S_NIGHTSFLY7A}, // S_NIGHTSFLY7B
|
||||
{SPR_NDRL, 24, 2, {NULL}, 0, 0, S_NIGHTSDRILL7B}, // S_NIGHTSDRILL7A
|
||||
{SPR_NDRL, 25, 2, {NULL}, 0, 0, S_NIGHTSDRILL7C}, // S_NIGHTSDRILL7B
|
||||
{SPR_NDRL, 26, 2, {NULL}, 0, 0, S_NIGHTSDRILL7D}, // S_NIGHTSDRILL7C
|
||||
{SPR_NDRL, 27, 2, {NULL}, 0, 0, S_NIGHTSDRILL7A}, // S_NIGHTSDRILL7D
|
||||
{SPR_SUPE, 14, 1, {NULL}, 0, 0, S_NIGHTSFLY8B}, // S_NIGHTSFLY8A
|
||||
{SPR_SUPE, 15, 1, {NULL}, 0, 0, S_NIGHTSFLY8A}, // S_NIGHTSFLY8B
|
||||
{SPR_NDRL, 28, 2, {NULL}, 0, 0, S_NIGHTSDRILL8B}, // S_NIGHTSDRILL8A
|
||||
{SPR_NDRL, 29, 2, {NULL}, 0, 0, S_NIGHTSDRILL8C}, // S_NIGHTSDRILL8B
|
||||
{SPR_NDRL, 30, 2, {NULL}, 0, 0, S_NIGHTSDRILL8D}, // S_NIGHTSDRILL8C
|
||||
{SPR_NDRL, 31, 2, {NULL}, 0, 0, S_NIGHTSDRILL8A}, // S_NIGHTSDRILL8D
|
||||
{SPR_SUPE, 16, 1, {NULL}, 0, 0, S_NIGHTSFLY9B}, // S_NIGHTSFLY9A
|
||||
{SPR_SUPE, 17, 1, {NULL}, 0, 0, S_NIGHTSFLY9A}, // S_NIGHTSFLY9B
|
||||
{SPR_NDRL, 32, 2, {NULL}, 0, 0, S_NIGHTSDRILL9B}, // S_NIGHTSDRILL9A
|
||||
{SPR_NDRL, 33, 2, {NULL}, 0, 0, S_NIGHTSDRILL9C}, // S_NIGHTSDRILL9B
|
||||
{SPR_NDRL, 34, 2, {NULL}, 0, 0, S_NIGHTSDRILL9D}, // S_NIGHTSDRILL9C
|
||||
{SPR_NDRL, 35, 2, {NULL}, 0, 0, S_NIGHTSDRILL9A}, // S_NIGHTSDRILL9D
|
||||
|
||||
// Nights Player, Falling
|
||||
{SPR_SUPZ, 0, 1, {NULL}, 0, 0, S_NIGHTSHURT2}, // S_NIGHTSHURT1
|
||||
{SPR_SUPZ, 1, 1, {NULL}, 0, 0, S_NIGHTSHURT3}, // S_NIGHTSHURT2
|
||||
{SPR_SUPZ, 2, 1, {NULL}, 0, 0, S_NIGHTSHURT4}, // S_NIGHTSHURT3
|
||||
{SPR_SUPZ, 3, 1, {NULL}, 0, 0, S_NIGHTSHURT5}, // S_NIGHTSHURT4
|
||||
{SPR_SUPZ, 4, 1, {NULL}, 0, 0, S_NIGHTSHURT6}, // S_NIGHTSHURT5
|
||||
{SPR_SUPZ, 5, 1, {NULL}, 0, 0, S_NIGHTSHURT7}, // S_NIGHTSHURT6
|
||||
{SPR_SUPZ, 6, 1, {NULL}, 0, 0, S_NIGHTSHURT8}, // S_NIGHTSHURT7
|
||||
{SPR_SUPZ, 7, 1, {NULL}, 0, 0, S_NIGHTSHURT9}, // S_NIGHTSHURT8
|
||||
{SPR_SUPZ, 8, 1, {NULL}, 0, 0, S_NIGHTSHURT10}, // S_NIGHTSHURT9
|
||||
{SPR_SUPZ, 9, 1, {NULL}, 0, 0, S_NIGHTSHURT11}, // S_NIGHTSHURT10
|
||||
{SPR_SUPZ, 10, 1, {NULL}, 0, 0, S_NIGHTSHURT12}, // S_NIGHTSHURT11
|
||||
{SPR_SUPZ, 11, 1, {NULL}, 0, 0, S_NIGHTSHURT13}, // S_NIGHTSHURT12
|
||||
{SPR_SUPZ, 12, 1, {NULL}, 0, 0, S_NIGHTSHURT14}, // S_NIGHTSHURT13
|
||||
{SPR_SUPZ, 13, 1, {NULL}, 0, 0, S_NIGHTSHURT15}, // S_NIGHTSHURT14
|
||||
{SPR_SUPZ, 14, 1, {NULL}, 0, 0, S_NIGHTSHURT16}, // S_NIGHTSHURT15
|
||||
{SPR_SUPZ, 15, 1, {NULL}, 0, 0, S_NIGHTSHURT17}, // S_NIGHTSHURT16
|
||||
{SPR_SUPZ, 0, 1, {NULL}, 0, 0, S_NIGHTSHURT18}, // S_NIGHTSHURT17
|
||||
{SPR_SUPZ, 1, 1, {NULL}, 0, 0, S_NIGHTSHURT19}, // S_NIGHTSHURT18
|
||||
{SPR_SUPZ, 2, 1, {NULL}, 0, 0, S_NIGHTSHURT20}, // S_NIGHTSHURT19
|
||||
{SPR_SUPZ, 3, 1, {NULL}, 0, 0, S_NIGHTSHURT21}, // S_NIGHTSHURT20
|
||||
{SPR_SUPZ, 4, 1, {NULL}, 0, 0, S_NIGHTSHURT22}, // S_NIGHTSHURT21
|
||||
{SPR_SUPZ, 5, 1, {NULL}, 0, 0, S_NIGHTSHURT23}, // S_NIGHTSHURT22
|
||||
{SPR_SUPZ, 6, 1, {NULL}, 0, 0, S_NIGHTSHURT24}, // S_NIGHTSHURT23
|
||||
{SPR_SUPZ, 7, 1, {NULL}, 0, 0, S_NIGHTSHURT25}, // S_NIGHTSHURT24
|
||||
{SPR_SUPZ, 8, 1, {NULL}, 0, 0, S_NIGHTSHURT26}, // S_NIGHTSHURT25
|
||||
{SPR_SUPZ, 9, 1, {NULL}, 0, 0, S_NIGHTSHURT27}, // S_NIGHTSHURT26
|
||||
{SPR_SUPZ, 10, 1, {NULL}, 0, 0, S_NIGHTSHURT28}, // S_NIGHTSHURT27
|
||||
{SPR_SUPZ, 11, 1, {NULL}, 0, 0, S_NIGHTSHURT29}, // S_NIGHTSHURT28
|
||||
{SPR_SUPZ, 12, 1, {NULL}, 0, 0, S_NIGHTSHURT30}, // S_NIGHTSHURT29
|
||||
{SPR_SUPZ, 13, 1, {NULL}, 0, 0, S_NIGHTSHURT31}, // S_NIGHTSHURT30
|
||||
{SPR_SUPZ, 14, 1, {NULL}, 0, 0, S_NIGHTSHURT32}, // S_NIGHTSHURT31
|
||||
{SPR_SUPZ, 15, 1, {NULL}, 0, 0, S_NIGHTSFLY1A}, // S_NIGHTSHURT32
|
||||
|
||||
// Nights Sparkle
|
||||
{SPR_NSPK, FF_FULLBRIGHT, 140, {NULL}, 0, 0, S_NIGHTSPARKLE2}, // S_NIGHTSPARKLE1
|
||||
{SPR_NSPK, FF_FULLBRIGHT|1, 7, {NULL}, 0, 0, S_NIGHTSPARKLE3}, // S_NIGHTSPARKLE2
|
||||
|
|
@ -2436,16 +2450,6 @@ state_t states[NUMSTATES] =
|
|||
{SPR_NULL, 0, 35, {NULL}, 0, 0, S_CRUMBLE2}, // S_CRUMBLE1
|
||||
{SPR_NULL, 0, 105, {A_Scream}, 0, 0, S_NULL}, // S_CRUMBLE2
|
||||
|
||||
{SPR_SUPT, 0, 4, {A_Scream}, 0, 0, S_SUPERTRANS2}, // S_SUPERTRANS1
|
||||
{SPR_SUPT, 1, 4, {NULL}, 0, 0, S_SUPERTRANS3}, // S_SUPERTRANS2
|
||||
{SPR_SUPT, FF_FULLBRIGHT|2, 4, {NULL}, 0, 0, S_SUPERTRANS4}, // S_SUPERTRANS3
|
||||
{SPR_SUPT, 3, 3, {NULL}, 0, 0, S_SUPERTRANS5}, // S_SUPERTRANS4
|
||||
{SPR_SUPT, 4, 3, {NULL}, 0, 0, S_SUPERTRANS6}, // S_SUPERTRANS5
|
||||
{SPR_SUPT, 5, 3, {NULL}, 0, 0, S_SUPERTRANS7}, // S_SUPERTRANS6
|
||||
{SPR_SUPT, 6, 3, {NULL}, 0, 0, S_SUPERTRANS8}, // S_SUPERTRANS7
|
||||
{SPR_SUPT, 7, 3, {NULL}, 0, 0, S_SUPERTRANS9}, // S_SUPERTRANS8
|
||||
{SPR_SUPT, 8, 16, {NULL}, 0, 0, S_NIGHTSDRONE1}, // S_SUPERTRANS9
|
||||
|
||||
// Spark
|
||||
{SPR_SPRK, FF_TRANS40 , 1, {NULL}, 0, 0, S_SPRK2}, // S_SPRK1
|
||||
{SPR_SPRK, FF_TRANS50|1, 1, {NULL}, 0, 0, S_SPRK3}, // S_SPRK2
|
||||
|
|
@ -2672,7 +2676,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
MT_THOK, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
(statenum_t)MT_THOK // raisestate
|
||||
(statenum_t)MT_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_BLUECRAWLA
|
||||
|
|
@ -10483,7 +10487,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
|
||||
{ // MT_EXTRALARGEBUBBLE
|
||||
-1, // doomednum
|
||||
S_LARGEBUBBLE, // spawnstate
|
||||
S_LARGEBUBBLE1, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
|
|
@ -10498,8 +10502,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL, // xdeathstate
|
||||
sfx_gasp, // deathsound
|
||||
8, // speed
|
||||
8*FRACUNIT, // radius
|
||||
12*FRACUNIT, // height
|
||||
23*FRACUNIT, // radius
|
||||
43*FRACUNIT, // height
|
||||
0, // display offset
|
||||
16, // mass
|
||||
0, // damage
|
||||
|
|
@ -10508,6 +10512,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_WATERZAP
|
||||
-1, // doomednum
|
||||
S_WATERZAP, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
8, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
8, // speed
|
||||
4*FRACUNIT, // radius
|
||||
4*FRACUNIT, // height
|
||||
0, // display offset
|
||||
16, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_SCENERY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_TFOG
|
||||
-1, // doomednum
|
||||
S_FOG1, // spawnstate
|
||||
|
|
@ -12136,33 +12167,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_NIGHTSCHAR
|
||||
-1, // doomednum
|
||||
S_NIGHTSFLY1A, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NIGHTSFLY1A, // painstate
|
||||
255, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NIGHTSFLY1A, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
0, // speed
|
||||
16*FRACUNIT, // radius
|
||||
48*FRACUNIT, // height
|
||||
0, // display offset
|
||||
1000, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOCLIP|MF_NOGRAVITY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_NIGHTSPARKLE
|
||||
-1, // doomednum
|
||||
S_NIGHTSPARKLE1,// spawnstate
|
||||
|
|
|
|||
279
src/info.h
279
src/info.h
|
|
@ -314,7 +314,7 @@ typedef enum sprite
|
|||
|
||||
// Interactive Objects
|
||||
SPR_FANS,
|
||||
SPR_BUBL, // water bubble source
|
||||
SPR_BBLS, // water bubble source
|
||||
SPR_SIGN, // Level end sign
|
||||
SPR_STEM, // Steam riser
|
||||
SPR_SPIK, // Spike Ball
|
||||
|
|
@ -458,11 +458,8 @@ typedef enum sprite
|
|||
SPR_SPLH, // Water Splish
|
||||
SPR_SPLA, // Water Splash
|
||||
SPR_SMOK,
|
||||
SPR_BUBP, // Small bubble
|
||||
SPR_BUBO, // Medium bubble
|
||||
SPR_BUBN, // Large bubble
|
||||
SPR_BUBM, // Extra Large (would you like fries with that?) bubble
|
||||
SPR_POPP, // Extra Large bubble goes POP!
|
||||
SPR_BUBL, // Bubble
|
||||
SPR_WZAP,
|
||||
SPR_TFOG, // Teleport Fog
|
||||
SPR_SEED, // Sonic CD flower seed
|
||||
SPR_PRTL, // Particle (for fans, etc.)
|
||||
|
|
@ -513,16 +510,12 @@ typedef enum sprite
|
|||
|
||||
// NiGHTS Stuff
|
||||
SPR_NDRN, // NiGHTS drone
|
||||
SPR_SUPE, // NiGHTS character flying
|
||||
SPR_SUPZ, // NiGHTS hurt
|
||||
SPR_NDRL, // NiGHTS character drilling
|
||||
SPR_NSPK, // NiGHTS sparkle
|
||||
SPR_NBMP, // NiGHTS Bumper
|
||||
SPR_HOOP, // NiGHTS hoop sprite
|
||||
SPR_NSCR, // NiGHTS score sprite
|
||||
SPR_NPRU, // Nights Powerups
|
||||
SPR_CAPS, // Capsule thingy for NiGHTS
|
||||
SPR_SUPT, // Super Sonic Transformation (NiGHTS)
|
||||
|
||||
// Debris
|
||||
SPR_SPRK, // spark
|
||||
|
|
@ -578,6 +571,9 @@ typedef enum sprite
|
|||
NUMSPRITES
|
||||
} spritenum_t;
|
||||
|
||||
// Make sure to be conscious of FF_FRAMEMASK whenever you change this table.
|
||||
// Currently, FF_FRAMEMASK is 0x1ff, or 511 - and NUMSPRITEFREESLOTS is 256.
|
||||
// Since this is zero-based, there can be at most 256 different SPR2_'s without changing that.
|
||||
enum playersprite
|
||||
{
|
||||
SPR2_STND = 0,
|
||||
|
|
@ -587,9 +583,9 @@ enum playersprite
|
|||
SPR2_PEEL,
|
||||
SPR2_PAIN,
|
||||
SPR2_DEAD,
|
||||
SPR2_DRWN,
|
||||
SPR2_DRWN, // drown
|
||||
SPR2_SPIN,
|
||||
SPR2_DASH,
|
||||
SPR2_DASH, // spindash charge
|
||||
SPR2_GASP,
|
||||
SPR2_JUMP,
|
||||
SPR2_SPNG, // spring
|
||||
|
|
@ -597,33 +593,75 @@ enum playersprite
|
|||
SPR2_EDGE,
|
||||
SPR2_RIDE,
|
||||
|
||||
SPR2_SIGN,
|
||||
SPR2_LIFE,
|
||||
SPR2_SIGN, // end sign head
|
||||
SPR2_LIFE, // life monitor icon
|
||||
|
||||
SPR2_FLY ,
|
||||
SPR2_TIRE,
|
||||
SPR2_SWIM,
|
||||
SPR2_TIRE, // tired
|
||||
|
||||
SPR2_GLID,
|
||||
SPR2_CLNG,
|
||||
SPR2_CLMB,
|
||||
SPR2_GLID, // glide
|
||||
SPR2_CLNG, // cling
|
||||
SPR2_CLMB, // climb
|
||||
|
||||
SPR2_TRNS,
|
||||
SPR2_SSTD,
|
||||
SPR2_SWLK,
|
||||
SPR2_SRUN,
|
||||
SPR2_SPEE,
|
||||
SPR2_SPAN,
|
||||
SPR2_SMSL,
|
||||
SPR2_SDTH,
|
||||
SPR2_SDRN,
|
||||
SPR2_SSPN,
|
||||
SPR2_SGSP,
|
||||
SPR2_SJMP,
|
||||
SPR2_SSPG,
|
||||
SPR2_SFAL,
|
||||
SPR2_SEDG,
|
||||
SPR2_SRID,
|
||||
SPR2_SFLT,
|
||||
SPR2_TWIN, // twinspin
|
||||
|
||||
SPR2_MLEE, // melee
|
||||
|
||||
SPR2_TRNS, // super transformation
|
||||
SPR2_SSTD, // super stand
|
||||
SPR2_SWLK, // super walk
|
||||
SPR2_SRUN, // super run
|
||||
SPR2_SPEE, // super peelout
|
||||
SPR2_SPAN, // super pain
|
||||
SPR2_SSTN, // super stun
|
||||
SPR2_SDTH, // super death
|
||||
SPR2_SDRN, // super drown
|
||||
SPR2_SSPN, // super spin
|
||||
SPR2_SGSP, // super gasp
|
||||
SPR2_SJMP, // super jump
|
||||
SPR2_SSPG, // super spring
|
||||
SPR2_SFAL, // super fall
|
||||
SPR2_SEDG, // super edge
|
||||
SPR2_SRID, // super ride
|
||||
SPR2_SFLT, // super float
|
||||
|
||||
SPR2_NTRN, // NiGHTS transformation
|
||||
SPR2_NSTD, // NiGHTS stand
|
||||
SPR2_NFLT, // NiGHTS float
|
||||
SPR2_NPAN, // NiGHTS pain
|
||||
SPR2_NPUL, // NiGHTS pull
|
||||
SPR2_NATK, // NiGHTS attack
|
||||
|
||||
// NiGHTS flight.
|
||||
SPR2_NGT0,
|
||||
SPR2_NGT1,
|
||||
SPR2_NGT2,
|
||||
SPR2_NGT3,
|
||||
SPR2_NGT4,
|
||||
SPR2_NGT5,
|
||||
SPR2_NGT6,
|
||||
SPR2_NGT7,
|
||||
SPR2_NGT8,
|
||||
SPR2_NGT9,
|
||||
SPR2_NGTA,
|
||||
SPR2_NGTB,
|
||||
SPR2_NGTC,
|
||||
|
||||
// NiGHTS drill.
|
||||
SPR2_DRL0,
|
||||
SPR2_DRL1,
|
||||
SPR2_DRL2,
|
||||
SPR2_DRL3,
|
||||
SPR2_DRL4,
|
||||
SPR2_DRL5,
|
||||
SPR2_DRL6,
|
||||
SPR2_DRL7,
|
||||
SPR2_DRL8,
|
||||
SPR2_DRL9,
|
||||
SPR2_DRLA,
|
||||
SPR2_DRLB,
|
||||
SPR2_DRLC,
|
||||
|
||||
SPR2_FIRSTFREESLOT,
|
||||
SPR2_LASTFREESLOT = SPR2_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1,
|
||||
|
|
@ -659,14 +697,15 @@ typedef enum state
|
|||
S_PLAY_SPIN,
|
||||
S_PLAY_DASH,
|
||||
S_PLAY_GASP,
|
||||
S_PLAY_JUMP, // spin jump (todo: make jump separate from spring up for non-spin chars too?)
|
||||
S_PLAY_JUMP, // spin jump
|
||||
S_PLAY_SPRING,
|
||||
S_PLAY_FALL,
|
||||
S_PLAY_EDGE,
|
||||
S_PLAY_RIDE,
|
||||
|
||||
// CA_FLY
|
||||
// CA_FLY/SWIM
|
||||
S_PLAY_FLY,
|
||||
S_PLAY_SWIM,
|
||||
S_PLAY_FLY_TIRED,
|
||||
|
||||
// CA_GLIDEANDCLIMB
|
||||
|
|
@ -674,6 +713,13 @@ typedef enum state
|
|||
S_PLAY_CLING,
|
||||
S_PLAY_CLIMB,
|
||||
|
||||
// CA_TWINSPIN
|
||||
S_PLAY_TWINSPIN,
|
||||
|
||||
// CA2_MELEE
|
||||
S_PLAY_MELEE,
|
||||
S_PLAY_MELEE_FINISH,
|
||||
|
||||
// SF_SUPERANIMS
|
||||
S_PLAY_SUPER_STND,
|
||||
S_PLAY_SUPER_WALK,
|
||||
|
|
@ -716,6 +762,50 @@ typedef enum state
|
|||
// Level end sign overlay (uses player sprite)
|
||||
S_PLAY_SIGN,
|
||||
|
||||
// NiGHTS character (uses player sprite)
|
||||
S_PLAY_NIGHTS_TRANS,
|
||||
S_PLAY_NIGHTS_TRANS2,
|
||||
S_PLAY_NIGHTS_TRANS3,
|
||||
S_PLAY_NIGHTS_TRANS4,
|
||||
S_PLAY_NIGHTS_TRANS5,
|
||||
S_PLAY_NIGHTS_TRANS6,
|
||||
S_PLAY_NIGHTS_TRANS7,
|
||||
S_PLAY_NIGHTS_TRANS8,
|
||||
S_PLAY_NIGHTS_TRANS9,
|
||||
|
||||
S_PLAY_NIGHTS_STAND,
|
||||
S_PLAY_NIGHTS_FLOAT,
|
||||
S_PLAY_NIGHTS_PAIN,
|
||||
S_PLAY_NIGHTS_PULL,
|
||||
S_PLAY_NIGHTS_ATTACK,
|
||||
|
||||
S_PLAY_NIGHTS_FLY0,
|
||||
S_PLAY_NIGHTS_DRILL0,
|
||||
S_PLAY_NIGHTS_FLY1,
|
||||
S_PLAY_NIGHTS_DRILL1,
|
||||
S_PLAY_NIGHTS_FLY2,
|
||||
S_PLAY_NIGHTS_DRILL2,
|
||||
S_PLAY_NIGHTS_FLY3,
|
||||
S_PLAY_NIGHTS_DRILL3,
|
||||
S_PLAY_NIGHTS_FLY4,
|
||||
S_PLAY_NIGHTS_DRILL4,
|
||||
S_PLAY_NIGHTS_FLY5,
|
||||
S_PLAY_NIGHTS_DRILL5,
|
||||
S_PLAY_NIGHTS_FLY6,
|
||||
S_PLAY_NIGHTS_DRILL6,
|
||||
S_PLAY_NIGHTS_FLY7,
|
||||
S_PLAY_NIGHTS_DRILL7,
|
||||
S_PLAY_NIGHTS_FLY8,
|
||||
S_PLAY_NIGHTS_DRILL8,
|
||||
S_PLAY_NIGHTS_FLY9,
|
||||
S_PLAY_NIGHTS_DRILL9,
|
||||
S_PLAY_NIGHTS_FLYA,
|
||||
S_PLAY_NIGHTS_DRILLA,
|
||||
S_PLAY_NIGHTS_FLYB,
|
||||
S_PLAY_NIGHTS_DRILLB,
|
||||
S_PLAY_NIGHTS_FLYC,
|
||||
S_PLAY_NIGHTS_DRILLC,
|
||||
|
||||
// Blue Crawla
|
||||
S_POSS_STND,
|
||||
S_POSS_RUN1,
|
||||
|
|
@ -1566,6 +1656,8 @@ typedef enum state
|
|||
// Bubble Source
|
||||
S_BUBBLES1,
|
||||
S_BUBBLES2,
|
||||
S_BUBBLES3,
|
||||
S_BUBBLES4,
|
||||
|
||||
// Level End Sign
|
||||
S_SIGN1,
|
||||
|
|
@ -2421,14 +2513,15 @@ typedef enum state
|
|||
|
||||
// Bubbles
|
||||
S_SMALLBUBBLE,
|
||||
S_SMALLBUBBLE1,
|
||||
S_MEDIUMBUBBLE,
|
||||
S_MEDIUMBUBBLE1,
|
||||
S_LARGEBUBBLE,
|
||||
S_LARGEBUBBLE1,
|
||||
S_LARGEBUBBLE2,
|
||||
S_EXTRALARGEBUBBLE, // breathable
|
||||
|
||||
S_POP1, // Extra Large bubble goes POP!
|
||||
|
||||
S_WATERZAP,
|
||||
|
||||
S_FOG1,
|
||||
S_FOG2,
|
||||
S_FOG3,
|
||||
|
|
@ -2470,6 +2563,13 @@ typedef enum state
|
|||
S_FOUR1,
|
||||
S_FIVE1,
|
||||
|
||||
S_ZERO2,
|
||||
S_ONE2,
|
||||
S_TWO2,
|
||||
S_THREE2,
|
||||
S_FOUR2,
|
||||
S_FIVE2,
|
||||
|
||||
// Tag Sign
|
||||
S_TTAG1,
|
||||
|
||||
|
|
@ -2702,93 +2802,6 @@ typedef enum state
|
|||
S_NIGHTSGOAL3,
|
||||
S_NIGHTSGOAL4,
|
||||
|
||||
S_NIGHTSFLY1A,
|
||||
S_NIGHTSFLY1B,
|
||||
S_NIGHTSDRILL1A,
|
||||
S_NIGHTSDRILL1B,
|
||||
S_NIGHTSDRILL1C,
|
||||
S_NIGHTSDRILL1D,
|
||||
S_NIGHTSFLY2A,
|
||||
S_NIGHTSFLY2B,
|
||||
S_NIGHTSDRILL2A,
|
||||
S_NIGHTSDRILL2B,
|
||||
S_NIGHTSDRILL2C,
|
||||
S_NIGHTSDRILL2D,
|
||||
S_NIGHTSFLY3A,
|
||||
S_NIGHTSFLY3B,
|
||||
S_NIGHTSDRILL3A,
|
||||
S_NIGHTSDRILL3B,
|
||||
S_NIGHTSDRILL3C,
|
||||
S_NIGHTSDRILL3D,
|
||||
S_NIGHTSFLY4A,
|
||||
S_NIGHTSFLY4B,
|
||||
S_NIGHTSDRILL4A,
|
||||
S_NIGHTSDRILL4B,
|
||||
S_NIGHTSDRILL4C,
|
||||
S_NIGHTSDRILL4D,
|
||||
S_NIGHTSFLY5A,
|
||||
S_NIGHTSFLY5B,
|
||||
S_NIGHTSDRILL5A,
|
||||
S_NIGHTSDRILL5B,
|
||||
S_NIGHTSDRILL5C,
|
||||
S_NIGHTSDRILL5D,
|
||||
S_NIGHTSFLY6A,
|
||||
S_NIGHTSFLY6B,
|
||||
S_NIGHTSDRILL6A,
|
||||
S_NIGHTSDRILL6B,
|
||||
S_NIGHTSDRILL6C,
|
||||
S_NIGHTSDRILL6D,
|
||||
S_NIGHTSFLY7A,
|
||||
S_NIGHTSFLY7B,
|
||||
S_NIGHTSDRILL7A,
|
||||
S_NIGHTSDRILL7B,
|
||||
S_NIGHTSDRILL7C,
|
||||
S_NIGHTSDRILL7D,
|
||||
S_NIGHTSFLY8A,
|
||||
S_NIGHTSFLY8B,
|
||||
S_NIGHTSDRILL8A,
|
||||
S_NIGHTSDRILL8B,
|
||||
S_NIGHTSDRILL8C,
|
||||
S_NIGHTSDRILL8D,
|
||||
S_NIGHTSFLY9A,
|
||||
S_NIGHTSFLY9B,
|
||||
S_NIGHTSDRILL9A,
|
||||
S_NIGHTSDRILL9B,
|
||||
S_NIGHTSDRILL9C,
|
||||
S_NIGHTSDRILL9D,
|
||||
S_NIGHTSHURT1,
|
||||
S_NIGHTSHURT2,
|
||||
S_NIGHTSHURT3,
|
||||
S_NIGHTSHURT4,
|
||||
S_NIGHTSHURT5,
|
||||
S_NIGHTSHURT6,
|
||||
S_NIGHTSHURT7,
|
||||
S_NIGHTSHURT8,
|
||||
S_NIGHTSHURT9,
|
||||
S_NIGHTSHURT10,
|
||||
S_NIGHTSHURT11,
|
||||
S_NIGHTSHURT12,
|
||||
S_NIGHTSHURT13,
|
||||
S_NIGHTSHURT14,
|
||||
S_NIGHTSHURT15,
|
||||
S_NIGHTSHURT16,
|
||||
S_NIGHTSHURT17,
|
||||
S_NIGHTSHURT18,
|
||||
S_NIGHTSHURT19,
|
||||
S_NIGHTSHURT20,
|
||||
S_NIGHTSHURT21,
|
||||
S_NIGHTSHURT22,
|
||||
S_NIGHTSHURT23,
|
||||
S_NIGHTSHURT24,
|
||||
S_NIGHTSHURT25,
|
||||
S_NIGHTSHURT26,
|
||||
S_NIGHTSHURT27,
|
||||
S_NIGHTSHURT28,
|
||||
S_NIGHTSHURT29,
|
||||
S_NIGHTSHURT30,
|
||||
S_NIGHTSHURT31,
|
||||
S_NIGHTSHURT32,
|
||||
|
||||
S_NIGHTSPARKLE1,
|
||||
S_NIGHTSPARKLE2,
|
||||
S_NIGHTSPARKLE3,
|
||||
|
|
@ -2885,16 +2898,6 @@ typedef enum state
|
|||
S_CRUMBLE1,
|
||||
S_CRUMBLE2,
|
||||
|
||||
S_SUPERTRANS1,
|
||||
S_SUPERTRANS2,
|
||||
S_SUPERTRANS3,
|
||||
S_SUPERTRANS4,
|
||||
S_SUPERTRANS5,
|
||||
S_SUPERTRANS6,
|
||||
S_SUPERTRANS7,
|
||||
S_SUPERTRANS8,
|
||||
S_SUPERTRANS9,
|
||||
|
||||
// Spark
|
||||
S_SPRK1,
|
||||
S_SPRK2,
|
||||
|
|
@ -3397,6 +3400,7 @@ typedef enum mobj_type
|
|||
MT_SMALLBUBBLE, // small bubble
|
||||
MT_MEDIUMBUBBLE, // medium bubble
|
||||
MT_EXTRALARGEBUBBLE, // extra large bubble
|
||||
MT_WATERZAP,
|
||||
MT_TFOG,
|
||||
MT_SEED,
|
||||
MT_PARTICLE,
|
||||
|
|
@ -3469,7 +3473,6 @@ typedef enum mobj_type
|
|||
MT_AXISTRANSFERLINE,
|
||||
MT_NIGHTSDRONE,
|
||||
MT_NIGHTSGOAL,
|
||||
MT_NIGHTSCHAR,
|
||||
MT_NIGHTSPARKLE,
|
||||
MT_NIGHTSLOOPHELPER,
|
||||
MT_NIGHTSBUMPER, // NiGHTS Bumper
|
||||
|
|
|
|||
|
|
@ -1377,11 +1377,6 @@ msgstr ""
|
|||
msgid "modifiedgame is false, you can unlock secrets\n"
|
||||
msgstr ""
|
||||
|
||||
#: d_netcmd.c:4599
|
||||
#, c-format
|
||||
msgid "Valid skin numbers are 0 to %d (-1 disables)\n"
|
||||
msgstr ""
|
||||
|
||||
#: d_netcmd.c:4617 d_netcmd.c:4629
|
||||
msgid "You may not change your name when chat is muted.\n"
|
||||
msgstr ""
|
||||
|
|
|
|||
|
|
@ -1362,11 +1362,6 @@ msgstr ""
|
|||
msgid "No CHEAT-marked variables are changed -- Cheats are disabled.\n"
|
||||
msgstr ""
|
||||
|
||||
#: d_netcmd.c:4439
|
||||
#, c-format
|
||||
msgid "Valid skin numbers are 0 to %d (-1 disables)\n"
|
||||
msgstr ""
|
||||
|
||||
#: d_netcmd.c:4457 d_netcmd.c:4469
|
||||
msgid "You may not change your name when chat is muted.\n"
|
||||
msgstr ""
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ boolean LUAh_MobjDeath(mobj_t *target, mobj_t *inflictor, mobj_t *source); // Ho
|
|||
#define LUAh_MobjRemoved(mo) LUAh_MobjHook(mo, hook_MobjRemoved) // Hook for P_RemoveMobj by mobj type
|
||||
#define LUAh_JumpSpecial(player) LUAh_PlayerHook(player, hook_JumpSpecial) // Hook for P_DoJumpStuff (Any-jumping)
|
||||
#define LUAh_AbilitySpecial(player) LUAh_PlayerHook(player, hook_AbilitySpecial) // Hook for P_DoJumpStuff (Double-jumping)
|
||||
#define LUAh_SpinSpecial(player) LUAh_PlayerHook(player, hook_SpinSpecial) // Hook for P_DoSpinDash (Spin button effect)
|
||||
#define LUAh_SpinSpecial(player) LUAh_PlayerHook(player, hook_SpinSpecial) // Hook for P_DoSpinAbility (Spin button effect)
|
||||
#define LUAh_JumpSpinSpecial(player) LUAh_PlayerHook(player, hook_JumpSpinSpecial) // Hook for P_DoJumpStuff (Spin button effect (mid-air))
|
||||
boolean LUAh_BotTiccmd(player_t *bot, ticcmd_t *cmd); // Hook for B_BuildTiccmd
|
||||
boolean LUAh_BotAI(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd); // Hook for B_BuildTailsTiccmd by skin name
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -108,6 +108,10 @@ static int player_get(lua_State *L)
|
|||
LUA_PushUserdata(L, &plr->cmd, META_TICCMD);
|
||||
else if (fastcmp(field,"playerstate"))
|
||||
lua_pushinteger(L, plr->playerstate);
|
||||
else if (fastcmp(field,"camerascale"))
|
||||
lua_pushfixed(L, plr->camerascale);
|
||||
else if (fastcmp(field,"shieldscale"))
|
||||
lua_pushfixed(L, plr->shieldscale);
|
||||
else if (fastcmp(field,"viewz"))
|
||||
lua_pushfixed(L, plr->viewz);
|
||||
else if (fastcmp(field,"viewheight"))
|
||||
|
|
@ -142,8 +146,6 @@ static int player_get(lua_State *L)
|
|||
lua_pushinteger(L, plr->score);
|
||||
else if (fastcmp(field,"dashspeed"))
|
||||
lua_pushfixed(L, plr->dashspeed);
|
||||
else if (fastcmp(field,"dashtime"))
|
||||
lua_pushinteger(L, plr->dashtime);
|
||||
else if (fastcmp(field,"normalspeed"))
|
||||
lua_pushfixed(L, plr->normalspeed);
|
||||
else if (fastcmp(field,"runspeed"))
|
||||
|
|
@ -174,6 +176,10 @@ static int player_get(lua_State *L)
|
|||
lua_pushfixed(L, plr->maxdash);
|
||||
else if (fastcmp(field,"jumpfactor"))
|
||||
lua_pushfixed(L, plr->jumpfactor);
|
||||
else if (fastcmp(field,"height"))
|
||||
lua_pushfixed(L, plr->height);
|
||||
else if (fastcmp(field,"spinheight"))
|
||||
lua_pushfixed(L, plr->spinheight);
|
||||
else if (fastcmp(field,"lives"))
|
||||
lua_pushinteger(L, plr->lives);
|
||||
else if (fastcmp(field,"continues"))
|
||||
|
|
@ -357,6 +363,10 @@ static int player_set(lua_State *L)
|
|||
return NOSET;
|
||||
else if (fastcmp(field,"playerstate"))
|
||||
plr->playerstate = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"camerascale"))
|
||||
plr->camerascale = luaL_checkfixed(L, 3);
|
||||
else if (fastcmp(field,"shieldscale"))
|
||||
plr->shieldscale = luaL_checkfixed(L, 3);
|
||||
else if (fastcmp(field,"viewz"))
|
||||
plr->viewz = luaL_checkfixed(L, 3);
|
||||
else if (fastcmp(field,"viewheight"))
|
||||
|
|
@ -401,8 +411,6 @@ static int player_set(lua_State *L)
|
|||
plr->score = (UINT32)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"dashspeed"))
|
||||
plr->dashspeed = luaL_checkfixed(L, 3);
|
||||
else if (fastcmp(field,"dashtime"))
|
||||
plr->dashtime = (INT32)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"normalspeed"))
|
||||
plr->normalspeed = luaL_checkfixed(L, 3);
|
||||
else if (fastcmp(field,"runspeed"))
|
||||
|
|
@ -433,6 +441,10 @@ static int player_set(lua_State *L)
|
|||
plr->maxdash = (INT32)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"jumpfactor"))
|
||||
plr->jumpfactor = (INT32)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"height"))
|
||||
plr->height = luaL_checkfixed(L, 3);
|
||||
else if (fastcmp(field,"spinheight"))
|
||||
plr->spinheight = luaL_checkfixed(L, 3);
|
||||
else if (fastcmp(field,"lives"))
|
||||
plr->lives = (SINT8)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"continues"))
|
||||
|
|
|
|||
|
|
@ -44,10 +44,18 @@ enum skin {
|
|||
skin_accelstart,
|
||||
skin_acceleration,
|
||||
skin_jumpfactor,
|
||||
skin_radius,
|
||||
skin_height,
|
||||
skin_spinheight,
|
||||
skin_shieldscale,
|
||||
skin_camerascale,
|
||||
skin_starttranscolor,
|
||||
skin_prefcolor,
|
||||
skin_supercolor,
|
||||
skin_prefoppositecolor,
|
||||
skin_highresscale,
|
||||
skin_soundsid
|
||||
skin_soundsid,
|
||||
skin_availability
|
||||
};
|
||||
static const char *const skin_opt[] = {
|
||||
"valid",
|
||||
|
|
@ -74,10 +82,18 @@ static const char *const skin_opt[] = {
|
|||
"accelstart",
|
||||
"acceleration",
|
||||
"jumpfactor",
|
||||
"radius",
|
||||
"height",
|
||||
"spinheight",
|
||||
"shieldscale",
|
||||
"camerascale",
|
||||
"starttranscolor",
|
||||
"prefcolor",
|
||||
"supercolor",
|
||||
"prefoppositecolor",
|
||||
"highresscale",
|
||||
"soundsid",
|
||||
"availability",
|
||||
NULL};
|
||||
|
||||
#define UNIMPLEMENTED luaL_error(L, LUA_QL("skin_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", skin_opt[field])
|
||||
|
|
@ -173,18 +189,42 @@ static int skin_get(lua_State *L)
|
|||
case skin_jumpfactor:
|
||||
lua_pushfixed(L, skin->jumpfactor);
|
||||
break;
|
||||
case skin_radius:
|
||||
lua_pushfixed(L, skin->radius);
|
||||
break;
|
||||
case skin_height:
|
||||
lua_pushfixed(L, skin->height);
|
||||
break;
|
||||
case skin_spinheight:
|
||||
lua_pushfixed(L, skin->spinheight);
|
||||
break;
|
||||
case skin_shieldscale:
|
||||
lua_pushfixed(L, skin->shieldscale);
|
||||
break;
|
||||
case skin_camerascale:
|
||||
lua_pushfixed(L, skin->camerascale);
|
||||
break;
|
||||
case skin_starttranscolor:
|
||||
lua_pushinteger(L, skin->starttranscolor);
|
||||
break;
|
||||
case skin_prefcolor:
|
||||
lua_pushinteger(L, skin->prefcolor);
|
||||
break;
|
||||
case skin_supercolor:
|
||||
lua_pushinteger(L, skin->supercolor);
|
||||
break;
|
||||
case skin_prefoppositecolor:
|
||||
lua_pushinteger(L, skin->prefoppositecolor);
|
||||
break;
|
||||
case skin_highresscale:
|
||||
lua_pushinteger(L, skin->highresscale);
|
||||
break;
|
||||
case skin_soundsid:
|
||||
LUA_PushUserdata(L, skin->soundsid, META_SOUNDSID);
|
||||
break;
|
||||
case skin_availability:
|
||||
lua_pushinteger(L, skin->availability);
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
312
src/m_menu.c
312
src/m_menu.c
|
|
@ -110,38 +110,38 @@ const char *quitmsg[NUM_QUITMESSAGES];
|
|||
// Stuff for customizing the player select screen Tails 09-22-2003
|
||||
description_t description[32] =
|
||||
{
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""},
|
||||
{"???", "", ""}
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0},
|
||||
{"???", "", "", 0, 0, 0}
|
||||
};
|
||||
static char *char_notes = NULL;
|
||||
static fixed_t char_scroll = 0;
|
||||
|
|
@ -170,6 +170,7 @@ static saveinfo_t savegameinfo[MAXSAVEGAMES]; // Extra info about the save games
|
|||
INT16 startmap; // Mario, NiGHTS, or just a plain old normal game?
|
||||
|
||||
static INT16 itemOn = 1; // menu item skull is on, Hack by Tails 09-18-2002
|
||||
static boolean lastdirection = true; // toaster - Only You Can Prevent Hacks - true is for forward, false is for backwards
|
||||
static INT16 skullAnimCounter = 10; // skull animation counter
|
||||
|
||||
static boolean setupcontrols_secondaryplayer;
|
||||
|
|
@ -705,7 +706,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 +798,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
|
||||
|
|
@ -1342,7 +1343,7 @@ static menuitem_t OP_NetgameOptionsMenu[] =
|
|||
{IT_STRING | IT_CVAR, NULL, "Sudden Death", &cv_suddendeath, 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Player respawn delay", &cv_respawntime, 98},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Force Skin #", &cv_forceskin, 114},
|
||||
{IT_STRING | IT_CVAR, NULL, "Force Skin", &cv_forceskin, 114},
|
||||
{IT_STRING | IT_CVAR, NULL, "Restrict skin changes", &cv_restrictskinchange, 122},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Autobalance Teams", &cv_autobalance, 138},
|
||||
|
|
@ -2036,6 +2037,7 @@ static boolean M_ChangeStringCvar(INT32 choice)
|
|||
static void M_NextOpt(void)
|
||||
{
|
||||
INT16 oldItemOn = itemOn; // prevent infinite loop
|
||||
lastdirection = true;
|
||||
|
||||
do
|
||||
{
|
||||
|
|
@ -2049,6 +2051,7 @@ static void M_NextOpt(void)
|
|||
static void M_PrevOpt(void)
|
||||
{
|
||||
INT16 oldItemOn = itemOn; // prevent infinite loop
|
||||
lastdirection = false;
|
||||
|
||||
do
|
||||
{
|
||||
|
|
@ -3426,9 +3429,9 @@ static void M_PatchSkinNameTable(void)
|
|||
|
||||
for (j = 0; j < MAXSKINS; j++)
|
||||
{
|
||||
if (skins[j].name[0] != '\0')
|
||||
if (skins[j].name[0] != '\0' && R_SkinUnlock(j))
|
||||
{
|
||||
skins_cons_t[j].strvalue = skins[j].name;
|
||||
skins_cons_t[j].strvalue = skins[j].realname;
|
||||
skins_cons_t[j].value = j+1;
|
||||
}
|
||||
else
|
||||
|
|
@ -3702,6 +3705,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 +4318,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);
|
||||
}
|
||||
|
|
@ -4768,14 +4776,63 @@ void M_ForceSaveSlotSelected(INT32 sslot)
|
|||
|
||||
static void M_SetupChoosePlayer(INT32 choice)
|
||||
{
|
||||
INT32 skinnum;
|
||||
UINT8 i;
|
||||
UINT8 firstvalid = 255;
|
||||
UINT8 lastvalid = 0;
|
||||
char *name;
|
||||
(void)choice;
|
||||
|
||||
if (mapheaderinfo[startmap-1] && mapheaderinfo[startmap-1]->forcecharacter[0] != '\0')
|
||||
if (PlayerMenu[0].status & (IT_DYBIGSPACE)) // Correcting a hack that may be made below.
|
||||
PlayerMenu[0].status = (IT_DISABLED|(PlayerMenu[0].status & IT_CENTER));
|
||||
|
||||
for (i = 0; i < 32; i++) // Handle charsels, availability, and unlocks.
|
||||
{
|
||||
M_ChoosePlayer(0); //oh for crying out loud just get STARTED, it doesn't matter!
|
||||
if (PlayerMenu[i].status != IT_DISABLED) // If the character's disabled through SOC, there's nothing we can do for it.
|
||||
{
|
||||
name = strtok(Z_StrDup(description[i].skinname), "&");
|
||||
skinnum = R_SkinAvailable(name);
|
||||
if ((skinnum != -1) && (R_SkinUnlock(skinnum)))
|
||||
{
|
||||
// Handling order.
|
||||
if (firstvalid == 255)
|
||||
firstvalid = i;
|
||||
else
|
||||
{
|
||||
description[i].prev = lastvalid;
|
||||
description[lastvalid].next = i;
|
||||
}
|
||||
lastvalid = i;
|
||||
|
||||
// Handling visibility.
|
||||
if (PlayerMenu[i].status & (IT_DISABLED|IT_CENTER))
|
||||
PlayerMenu[i].status = IT_CALL;
|
||||
if (description[i].picname[0] == '\0')
|
||||
strncpy(description[i].picname, skins[skinnum].charsel, 8);
|
||||
}
|
||||
else // Technically, character select icons without corresponding skins get bundled away behind this too. Sucks to be them.
|
||||
PlayerMenu[i].status = (IT_DISABLED|IT_CENTER);
|
||||
Z_Free(name);
|
||||
}
|
||||
}
|
||||
|
||||
if ((firstvalid != 255)
|
||||
&& !(mapheaderinfo[startmap-1]
|
||||
&& (mapheaderinfo[startmap-1]->forcecharacter[0] != '\0')
|
||||
)
|
||||
)
|
||||
{ // One last bit of order we can't do in the iteration above.
|
||||
description[firstvalid].prev = lastvalid;
|
||||
description[lastvalid].next = firstvalid;
|
||||
}
|
||||
else // We're being forced into a specific character, so might as well.
|
||||
{
|
||||
PlayerMenu[0].status = (IT_CALL|IT_DYBIGSPACE|(PlayerMenu[0].status & IT_CENTER)); // This is a hack to make a non-IT_CALL character in slot 0 not softlock the game. IT_DYBIGSPACE is a dummy flag, whilst IT_CENTER is preserved.
|
||||
M_ChoosePlayer(0);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (Playing() == false)
|
||||
{
|
||||
S_StopMusic();
|
||||
|
|
@ -4794,8 +4851,9 @@ static void M_DrawSetupChoosePlayerMenu(void)
|
|||
{
|
||||
const INT32 my = 24;
|
||||
patch_t *patch;
|
||||
INT32 i, o, j;
|
||||
char *picname;
|
||||
INT32 i, o;
|
||||
UINT8 prev, next;
|
||||
boolean loophack = false;
|
||||
|
||||
// Black BG
|
||||
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31);
|
||||
|
|
@ -4804,91 +4862,76 @@ static void M_DrawSetupChoosePlayerMenu(void)
|
|||
// Character select profile images!1
|
||||
M_DrawTextBox(0, my, 16, 20);
|
||||
|
||||
if (abs(itemOn*128*FRACUNIT - char_scroll) > 256*FRACUNIT)
|
||||
char_scroll = itemOn*128*FRACUNIT;
|
||||
else if (itemOn*128*FRACUNIT - char_scroll > 128*FRACUNIT)
|
||||
char_scroll += 48*FRACUNIT;
|
||||
else if (itemOn*128*FRACUNIT - char_scroll < -128*FRACUNIT)
|
||||
char_scroll -= 48*FRACUNIT;
|
||||
else if (itemOn*128*FRACUNIT > char_scroll+16*FRACUNIT)
|
||||
char_scroll += 16*FRACUNIT;
|
||||
else if (itemOn*128*FRACUNIT < char_scroll-16*FRACUNIT)
|
||||
char_scroll -= 16*FRACUNIT;
|
||||
i = (itemOn*128 - (char_scroll / FRACUNIT));
|
||||
|
||||
if (!char_notes)
|
||||
{
|
||||
if (i) // turns out this and the preceding check is better then (abs(i) > 128)
|
||||
{
|
||||
o = (lastdirection) ? -1 : 1;
|
||||
char_scroll = (itemOn + o)*128*FRACUNIT;
|
||||
i = -o*128;
|
||||
}
|
||||
char_notes = V_WordWrap(0, 21*8, V_ALLOWLOWERCASE, description[itemOn].notes);
|
||||
}
|
||||
|
||||
if (abs(i) > 1)
|
||||
char_scroll += i*FRACUNIT>>2;
|
||||
else // close enough.
|
||||
char_scroll = itemOn*128*FRACUNIT; // just be exact now.
|
||||
i = (char_scroll+16*FRACUNIT)/(128*FRACUNIT);
|
||||
o = ((char_scroll/FRACUNIT)+16)%128;
|
||||
|
||||
// prev character
|
||||
if (i-1 >= 0 && PlayerMenu[i-1].status != IT_DISABLED
|
||||
&& o < 32)
|
||||
o = ((char_scroll / FRACUNIT) + 16);
|
||||
|
||||
if (o < 0) // This hack is to prevent visual glitches when looping from the last character to the 1st character.
|
||||
loophack = true;
|
||||
|
||||
if (loophack)
|
||||
o += 128;
|
||||
|
||||
i = (o / 128);
|
||||
o = (o % 128);
|
||||
|
||||
if (loophack)
|
||||
i = description[i].prev;
|
||||
|
||||
// Get prev character...
|
||||
prev = description[i].prev;
|
||||
|
||||
if (prev != i) // If there's more than one character available...
|
||||
{
|
||||
picname = description[i-1].picname;
|
||||
if (picname[0] == '\0')
|
||||
// Let's get the next character now.
|
||||
next = description[i].next;
|
||||
|
||||
// Draw prev character if it's visible and its number isn't greater than the current one or there's more than two
|
||||
if (o < 32) // (prev != i) was previously a part of this, but we don't need to check again after above.
|
||||
{
|
||||
picname = strtok(Z_StrDup(description[i-1].skinname), "&");
|
||||
for (j = 0; j < numskins; j++)
|
||||
if (stricmp(skins[j].name, picname) == 0)
|
||||
{
|
||||
Z_Free(picname);
|
||||
picname = skins[j].charsel;
|
||||
break;
|
||||
}
|
||||
if (j == numskins) // AAAAAAAAAA
|
||||
picname = skins[0].charsel;
|
||||
patch = W_CachePatchName(description[prev].picname, PU_CACHE);
|
||||
if (SHORT(patch->width) >= 256)
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 8)<<FRACBITS, FRACUNIT/2, 0, patch, 0, SHORT(patch->height) - 64 + o*2, SHORT(patch->width), SHORT(patch->height));
|
||||
else
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 8)<<FRACBITS, FRACUNIT, 0, patch, 0, SHORT(patch->height) - 32 + o, SHORT(patch->width), SHORT(patch->height));
|
||||
W_UnlockCachedPatch(patch);
|
||||
}
|
||||
patch = W_CachePatchName(picname, PU_CACHE);
|
||||
if (SHORT(patch->width) >= 256)
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 8)<<FRACBITS, FRACUNIT/2, 0, patch, 0, SHORT(patch->height) - 64 + o*2, SHORT(patch->width), SHORT(patch->height));
|
||||
else
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 8)<<FRACBITS, FRACUNIT, 0, patch, 0, SHORT(patch->height) - 32 + o, SHORT(patch->width), SHORT(patch->height));
|
||||
W_UnlockCachedPatch(patch);
|
||||
|
||||
// Draw next character if it's visible and its number isn't less than the current one or there's more than two
|
||||
if (o < 128) // (next != i) was previously a part of this, but it's implicitly true if (prev != i) is true.
|
||||
{
|
||||
patch = W_CachePatchName(description[next].picname, PU_CACHE);
|
||||
if (SHORT(patch->width) >= 256)
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 168 - o)<<FRACBITS, FRACUNIT/2, 0, patch, 0, 0, SHORT(patch->width), o*2);
|
||||
else
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 168 - o)<<FRACBITS, FRACUNIT, 0, patch, 0, 0, SHORT(patch->width), o);
|
||||
W_UnlockCachedPatch(patch);
|
||||
}
|
||||
|
||||
// current character
|
||||
if (PlayerMenu[i].status & IT_DISABLED) // Prevent flickering.
|
||||
i = (lastdirection) ? prev : next; // This actually causes duplication at slow scroll speeds (<16FU per tic), but thankfully we always go quickly.
|
||||
}
|
||||
|
||||
// next character
|
||||
if (i+1 < currentMenu->numitems && PlayerMenu[i+1].status != IT_DISABLED
|
||||
&& o < 128)
|
||||
if (!(PlayerMenu[i].status & IT_DISABLED))
|
||||
{
|
||||
picname = description[i+1].picname;
|
||||
if (picname[0] == '\0')
|
||||
{
|
||||
picname = strtok(Z_StrDup(description[i+1].skinname), "&");
|
||||
for (j = 0; j < numskins; j++)
|
||||
if (stricmp(skins[j].name, picname) == 0)
|
||||
{
|
||||
Z_Free(picname);
|
||||
picname = skins[j].charsel;
|
||||
break;
|
||||
}
|
||||
if (j == numskins) // AAAAAAAAAA
|
||||
picname = skins[0].charsel;
|
||||
}
|
||||
patch = W_CachePatchName(picname, PU_CACHE);
|
||||
if (SHORT(patch->width) >= 256)
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 168 - o)<<FRACBITS, FRACUNIT/2, 0, patch, 0, 0, SHORT(patch->width), o*2);
|
||||
else
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 168 - o)<<FRACBITS, FRACUNIT, 0, patch, 0, 0, SHORT(patch->width), o);
|
||||
W_UnlockCachedPatch(patch);
|
||||
}
|
||||
|
||||
// current character
|
||||
if (i < currentMenu->numitems && PlayerMenu[i].status != IT_DISABLED)
|
||||
{
|
||||
picname = description[i].picname;
|
||||
if (picname[0] == '\0')
|
||||
{
|
||||
picname = strtok(Z_StrDup(description[i].skinname), "&");
|
||||
for (j = 0; j < numskins; j++)
|
||||
if (stricmp(skins[j].name, picname) == 0)
|
||||
{
|
||||
Z_Free(picname);
|
||||
picname = skins[j].charsel;
|
||||
break;
|
||||
}
|
||||
if (j == numskins) // AAAAAAAAAA
|
||||
picname = skins[0].charsel;
|
||||
}
|
||||
patch = W_CachePatchName(picname, PU_CACHE);
|
||||
patch = W_CachePatchName(description[i].picname, PU_CACHE);
|
||||
if (o >= 0 && o <= 32)
|
||||
{
|
||||
if (SHORT(patch->width) >= 256)
|
||||
|
|
@ -4911,8 +4954,6 @@ static void M_DrawSetupChoosePlayerMenu(void)
|
|||
|
||||
// Character description
|
||||
M_DrawTextBox(136, my, 21, 20);
|
||||
if (!char_notes)
|
||||
char_notes = V_WordWrap(0, 21*8, V_ALLOWLOWERCASE, description[itemOn].notes);
|
||||
V_DrawString(146, my + 9, V_RETURN8|V_ALLOWLOWERCASE, char_notes);
|
||||
}
|
||||
|
||||
|
|
@ -4923,8 +4964,8 @@ static void M_ChoosePlayer(INT32 choice)
|
|||
INT32 skinnum;
|
||||
boolean ultmode = (ultimate_selectable && SP_PlayerDef.prevMenu == &SP_LoadDef && saveSlotSelected == NOSAVESLOT);
|
||||
|
||||
// skip this if forcecharacter
|
||||
if (mapheaderinfo[startmap-1] && mapheaderinfo[startmap-1]->forcecharacter[0] == '\0')
|
||||
// skip this if forcecharacter or no characters available
|
||||
if (!(PlayerMenu[choice].status & IT_DYBIGSPACE))
|
||||
{
|
||||
// M_SetupChoosePlayer didn't call us directly, that means we've been properly set up.
|
||||
char_scroll = itemOn*128*FRACUNIT; // finish scrolling the menu
|
||||
|
|
@ -6470,6 +6511,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
|||
static void M_HandleSetupMultiPlayer(INT32 choice)
|
||||
{
|
||||
size_t l;
|
||||
INT32 prev_setupm_fakeskin;
|
||||
boolean exitmenu = false; // exit to previous menu and send name change
|
||||
|
||||
switch (choice)
|
||||
|
|
@ -6488,7 +6530,14 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
|
|||
if (itemOn == 2) //player skin
|
||||
{
|
||||
S_StartSound(NULL,sfx_menu1); // Tails
|
||||
setupm_fakeskin--;
|
||||
prev_setupm_fakeskin = setupm_fakeskin;
|
||||
do
|
||||
{
|
||||
setupm_fakeskin--;
|
||||
if (setupm_fakeskin < 0)
|
||||
setupm_fakeskin = numskins-1;
|
||||
}
|
||||
while ((prev_setupm_fakeskin != setupm_fakeskin) && !(R_SkinUnlock(setupm_fakeskin)));
|
||||
}
|
||||
else if (itemOn == 1) // player color
|
||||
{
|
||||
|
|
@ -6501,7 +6550,14 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
|
|||
if (itemOn == 2) //player skin
|
||||
{
|
||||
S_StartSound(NULL,sfx_menu1); // Tails
|
||||
setupm_fakeskin++;
|
||||
prev_setupm_fakeskin = setupm_fakeskin;
|
||||
do
|
||||
{
|
||||
setupm_fakeskin++;
|
||||
if (setupm_fakeskin > numskins-1)
|
||||
setupm_fakeskin = 0;
|
||||
}
|
||||
while ((prev_setupm_fakeskin != setupm_fakeskin) && !(R_SkinUnlock(setupm_fakeskin)));
|
||||
}
|
||||
else if (itemOn == 1) // player color
|
||||
{
|
||||
|
|
@ -6535,12 +6591,6 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
|
|||
break;
|
||||
}
|
||||
|
||||
// check skin
|
||||
if (setupm_fakeskin < 0)
|
||||
setupm_fakeskin = numskins-1;
|
||||
if (setupm_fakeskin > numskins-1)
|
||||
setupm_fakeskin = 0;
|
||||
|
||||
// check color
|
||||
if (setupm_fakecolor < 1)
|
||||
setupm_fakecolor = MAXSKINCOLORS-1;
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt);
|
|||
#define IT_SUBMENU 6 // go to sub menu
|
||||
#define IT_CVAR 8 // handle as a cvar
|
||||
#define IT_SPACE 10 // no handling
|
||||
#define IT_MSGHANDLER 12 // same as key but with event and sometime can handle y/n key (special for message
|
||||
#define IT_MSGHANDLER 12 // same as key but with event and sometime can handle y/n key (special for message)
|
||||
|
||||
#define IT_DISPLAY (48+64+128) // 16+32+64+128
|
||||
#define IT_NOTHING 0 // space
|
||||
|
|
@ -177,6 +177,9 @@ typedef struct
|
|||
char notes[441];
|
||||
char picname[8];
|
||||
char skinname[SKINNAMESIZE*2+2]; // skin&skin\0
|
||||
UINT16 wadnum; // for duplicate characters
|
||||
UINT8 prev;
|
||||
UINT8 next;
|
||||
} description_t;
|
||||
|
||||
// mode descriptions for video mode menu
|
||||
|
|
|
|||
|
|
@ -3954,6 +3954,7 @@ void A_UnsetSolidSteam(mobj_t *actor)
|
|||
void A_SignPlayer(mobj_t *actor)
|
||||
{
|
||||
mobj_t *ov;
|
||||
skin_t *skin;
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_CallAction("A_SignPlayer", actor))
|
||||
return;
|
||||
|
|
@ -3964,15 +3965,35 @@ void A_SignPlayer(mobj_t *actor)
|
|||
if (!actor->target->player)
|
||||
return;
|
||||
|
||||
// Set the sign to be an appropriate background color for this player's skincolor.
|
||||
actor->color = Color_Opposite[actor->target->player->skincolor*2];
|
||||
actor->frame += Color_Opposite[actor->target->player->skincolor*2+1];
|
||||
skin = &skins[actor->target->player->skin];
|
||||
|
||||
if ((actor->target->player->skincolor == skin->prefcolor) && (skin->prefoppositecolor)) // Set it as the skin's preferred oppositecolor?
|
||||
{
|
||||
actor->color = skin->prefoppositecolor;
|
||||
/*
|
||||
If you're here from the comment above Color_Opposite,
|
||||
the following line is the one which is dependent on the
|
||||
array being symmetrical. It gets the opposite of the
|
||||
opposite of your desired colour just so it can get the
|
||||
brightness frame for the End Sign. It's not a great
|
||||
design choice, but it's constant time array access and
|
||||
the idea that the colours should be OPPOSITES is kind
|
||||
of in the name. If you have a better idea, feel free
|
||||
to let me know. ~toast 2016/07/20
|
||||
*/
|
||||
actor->frame += Color_Opposite[Color_Opposite[skin->prefoppositecolor*2]*2+1];
|
||||
}
|
||||
else // Set the sign to be an appropriate background color for this player's skincolor.
|
||||
{
|
||||
actor->color = Color_Opposite[actor->target->player->skincolor*2];
|
||||
actor->frame += Color_Opposite[actor->target->player->skincolor*2+1];
|
||||
}
|
||||
|
||||
// spawn an overlay of the player's face.
|
||||
ov = P_SpawnMobj(actor->x, actor->y, actor->z, MT_OVERLAY);
|
||||
P_SetTarget(&ov->target, actor);
|
||||
ov->color = actor->target->player->skincolor;
|
||||
ov->skin = &skins[actor->target->player->skin];
|
||||
ov->skin = skin;
|
||||
P_SetMobjState(ov, actor->info->seestate); // S_PLAY_SIGN
|
||||
}
|
||||
|
||||
|
|
@ -5412,8 +5433,8 @@ void A_MixUp(mobj_t *actor)
|
|||
|
||||
// Zoom tube stuff
|
||||
mobj_t *tempthing = NULL; //tracer
|
||||
pflags_t flags1,flags2; //player pflags
|
||||
INT32 transspeed; //player speed
|
||||
UINT16 carry1,carry2; //carry
|
||||
INT32 transspeed; //player speed
|
||||
|
||||
// Starpost stuff
|
||||
INT16 starpostx, starposty, starpostz;
|
||||
|
|
@ -5450,8 +5471,8 @@ void A_MixUp(mobj_t *actor)
|
|||
players[two].speed = transspeed;
|
||||
|
||||
//set flags variables now but DON'T set them.
|
||||
flags1 = (players[one].pflags & (PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG));
|
||||
flags2 = (players[two].pflags & (PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG));
|
||||
carry1 = (players[one].powers[pw_carry] == CR_PLAYER ? CR_NONE : players[one].powers[pw_carry]);
|
||||
carry2 = (players[two].powers[pw_carry] == CR_PLAYER ? CR_NONE : players[two].powers[pw_carry]);
|
||||
|
||||
x = players[one].mo->x;
|
||||
y = players[one].mo->y;
|
||||
|
|
@ -5476,12 +5497,10 @@ void A_MixUp(mobj_t *actor)
|
|||
starpostnum, starposttime, starpostangle,
|
||||
mflags2);
|
||||
|
||||
//flags set after mixup. Stupid P_ResetPlayer() takes away some of the flags we look for...
|
||||
//but not all of them! So we need to make sure they aren't set wrong or anything.
|
||||
players[one].pflags &= ~(PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG);
|
||||
players[one].pflags |= flags2;
|
||||
players[two].pflags &= ~(PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG);
|
||||
players[two].pflags |= flags1;
|
||||
//carry set after mixup. Stupid P_ResetPlayer() takes away some of the stuff we look for...
|
||||
//but not all of it! So we need to make sure they aren't set wrong or anything.
|
||||
players[one].powers[pw_carry] = carry2;
|
||||
players[two].powers[pw_carry] = carry1;
|
||||
|
||||
teleported[one] = true;
|
||||
teleported[two] = true;
|
||||
|
|
@ -5493,8 +5512,9 @@ void A_MixUp(mobj_t *actor)
|
|||
INT32 pindex[MAXPLAYERS], counter = 0, teleportfrom = 0;
|
||||
|
||||
// Zoom tube stuff
|
||||
mobj_t *transtracer[MAXPLAYERS]; //tracer
|
||||
pflags_t transflag[MAXPLAYERS]; //player pflags
|
||||
mobj_t *transtracer[MAXPLAYERS]; //tracer
|
||||
//pflags_t transflag[MAXPLAYERS]; //cyan pink white pink cyan
|
||||
UINT16 transcarry[MAXPLAYERS]; //player carry
|
||||
INT32 transspeed[MAXPLAYERS]; //player speed
|
||||
|
||||
// Star post stuff
|
||||
|
|
@ -5528,7 +5548,7 @@ void A_MixUp(mobj_t *actor)
|
|||
players[i].rmomx = players[i].rmomy = 1;
|
||||
players[i].cmomx = players[i].cmomy = 0;
|
||||
|
||||
transflag[counter] = (players[i].pflags & (PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG));
|
||||
transcarry[counter] = (players[i].powers[pw_carry] == CR_PLAYER ? CR_NONE : players[i].powers[pw_carry]);
|
||||
transspeed[counter] = players[i].speed;
|
||||
transtracer[counter] = players[i].mo->tracer;
|
||||
|
||||
|
|
@ -5580,9 +5600,8 @@ void A_MixUp(mobj_t *actor)
|
|||
starpostnum[teleportfrom], starposttime[teleportfrom], starpostangle[teleportfrom],
|
||||
flags2[teleportfrom]);
|
||||
|
||||
//...flags after. same reasoning.
|
||||
players[i].pflags &= ~(PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG);
|
||||
players[i].pflags |= transflag[teleportfrom];
|
||||
//...carry after. same reasoning.
|
||||
players[i].powers[pw_carry] = transcarry[teleportfrom];
|
||||
|
||||
teleported[i] = true;
|
||||
counter++;
|
||||
|
|
@ -6149,7 +6168,7 @@ void A_Boss7Chase(mobj_t *actor)
|
|||
if (actor->health <= actor->info->damage
|
||||
&& actor->target
|
||||
&& actor->target->player
|
||||
&& (actor->target->player->pflags & PF_ITEMHANG))
|
||||
&& (actor->target->player->powers[pw_carry] == CR_GENERIC))
|
||||
{
|
||||
A_FaceTarget(actor);
|
||||
P_SetMobjState(actor, S_BLACKEGG_SHOOT1);
|
||||
|
|
@ -8023,7 +8042,7 @@ void A_OrbitNights(mobj_t* actor)
|
|||
#endif
|
||||
|
||||
if (!actor->target || !actor->target->player ||
|
||||
!actor->target->tracer || !actor->target->player->nightstime
|
||||
!(actor->target->player->pflags & PF_NIGHTSMODE) || !actor->target->player->nightstime
|
||||
// Also remove this object if they no longer have a NiGHTS helper
|
||||
|| (ishelper && !actor->target->player->powers[pw_nights_helper]))
|
||||
{
|
||||
|
|
@ -8042,14 +8061,23 @@ void A_OrbitNights(mobj_t* actor)
|
|||
const fixed_t fh = FixedMul(FINECOSINE(ofa),FixedMul(20*FRACUNIT, actor->scale));
|
||||
const fixed_t fs = FixedMul(FINESINE(fa),FixedMul(32*FRACUNIT, actor->scale));
|
||||
|
||||
actor->x = actor->target->tracer->x + fc;
|
||||
actor->y = actor->target->tracer->y + fs;
|
||||
actor->z = actor->target->tracer->z + fh + FixedMul(16*FRACUNIT, actor->scale);
|
||||
actor->x = actor->target->x + fc;
|
||||
actor->y = actor->target->y + fs;
|
||||
actor->z = actor->target->z + fh + FixedMul(16*FRACUNIT, actor->scale);
|
||||
|
||||
// Semi-lazy hack
|
||||
actor->angle = (angle_t)actor->extravalue1 + ANGLE_90;
|
||||
}
|
||||
P_SetThingPosition(actor);
|
||||
|
||||
if (ishelper) // Flash a helper that's about to be removed.
|
||||
{
|
||||
if ((actor->target->player->powers[pw_nights_helper] < TICRATE)
|
||||
&& (actor->target->player->powers[pw_nights_helper] & 1))
|
||||
actor->flags2 |= MF2_DONTDRAW;
|
||||
else
|
||||
actor->flags2 &= ~MF2_DONTDRAW;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -300,7 +300,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
}
|
||||
|
||||
if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|
||||
|| (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING))
|
||||
|| ((player->pflags & PF_JUMPED) && !(player->charflags & SF_NOJUMPDAMAGE && !(player->charability == CA_TWINSPIN && player->panim == PA_ABILITY)))
|
||||
|| (player->pflags & (PF_SPINNING|PF_GLIDING))
|
||||
|| (player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2)
|
||||
|| ((player->charflags & SF_STOMPDAMAGE) && (P_MobjFlip(toucher)*(toucher->z - (special->z + special->height/2)) > 0) && (P_MobjFlip(toucher)*toucher->momz < 0))
|
||||
|| player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object?
|
||||
{
|
||||
if (P_MobjFlip(toucher)*toucher->momz < 0)
|
||||
|
|
@ -343,7 +346,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
P_DamageMobj(toucher, special, special, 1, 0);
|
||||
}
|
||||
else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|
||||
|| (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING))
|
||||
|| ((player->pflags & PF_JUMPED) && !(player->charflags & SF_NOJUMPDAMAGE && !(player->charability == CA_TWINSPIN && player->panim == PA_ABILITY)))
|
||||
|| (player->pflags & (PF_SPINNING|PF_GLIDING))
|
||||
|| (player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2)
|
||||
|| ((player->charflags & SF_STOMPDAMAGE) && (P_MobjFlip(toucher)*(toucher->z - (special->z + special->height/2)) > 0) && (P_MobjFlip(toucher)*toucher->momz < 0))
|
||||
|| player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object?
|
||||
{
|
||||
if (P_MobjFlip(toucher)*toucher->momz < 0)
|
||||
|
|
@ -646,16 +652,16 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
if (G_IsSpecialStage(gamemap)) //After-mare bonus time/emerald reward in special stages.
|
||||
{
|
||||
// only allow the player with the emerald in-hand to leave.
|
||||
if (toucher->tracer && toucher->tracer->target
|
||||
&& toucher->tracer->target->type == MT_GOTEMERALD)
|
||||
if (toucher->tracer
|
||||
&& toucher->tracer->type == MT_GOTEMERALD)
|
||||
{
|
||||
}
|
||||
else // Make sure that SOMEONE has the emerald, at least!
|
||||
{
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && players[i].playerstate == PST_LIVE
|
||||
&& players[i].mo->tracer && players[i].mo->tracer->target
|
||||
&& players[i].mo->tracer->target->type == MT_GOTEMERALD)
|
||||
&& players[i].mo->tracer
|
||||
&& players[i].mo->tracer->type == MT_GOTEMERALD)
|
||||
return;
|
||||
// Well no one has an emerald, so exit anyway!
|
||||
}
|
||||
|
|
@ -1243,10 +1249,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
|
||||
player->powers[pw_ingoop] = 2;
|
||||
|
||||
if (player->pflags & PF_ITEMHANG)
|
||||
if (player->powers[pw_carry] == CR_GENERIC)
|
||||
{
|
||||
P_SetTarget(&toucher->tracer, NULL);
|
||||
player->pflags &= ~PF_ITEMHANG;
|
||||
player->powers[pw_carry] = CR_NONE;
|
||||
}
|
||||
|
||||
P_ResetPlayer(player);
|
||||
|
|
@ -1298,7 +1304,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
S_StartSound(toucher, special->info->painsound);
|
||||
return;
|
||||
}
|
||||
else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING)) || (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING))
|
||||
else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|
||||
|| ((player->pflags & PF_JUMPED) && !(player->charflags & SF_NOJUMPDAMAGE))
|
||||
|| ((player->charflags & SF_STOMPDAMAGE) && (P_MobjFlip(toucher)*(toucher->z - (special->z + special->height/2)) > 0) && (P_MobjFlip(toucher)*toucher->momz < 0))
|
||||
|| (player->pflags & (PF_SPINNING|PF_GLIDING))
|
||||
|| player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object?
|
||||
{
|
||||
// Shatter the shield!
|
||||
|
|
@ -1328,7 +1337,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
case MT_BIGMACECHAIN:
|
||||
// Is this the last link in the chain?
|
||||
if (toucher->momz > 0 || !(special->flags & MF_AMBUSH)
|
||||
|| (player->pflags & PF_ITEMHANG) || (player->pflags & PF_MACESPIN))
|
||||
|| (player->powers[pw_carry]))
|
||||
return;
|
||||
|
||||
if (toucher->z > special->z + special->height/2)
|
||||
|
|
@ -1345,12 +1354,12 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
|
||||
if (special->target && (special->target->type == MT_SPINMACEPOINT || special->target->type == MT_HIDDEN_SLING))
|
||||
{
|
||||
player->pflags |= PF_MACESPIN;
|
||||
player->powers[pw_carry] = CR_MACESPIN;
|
||||
S_StartSound(toucher, sfx_spin);
|
||||
P_SetPlayerMobjState(toucher, S_PLAY_SPIN);
|
||||
}
|
||||
else
|
||||
player->pflags |= PF_ITEMHANG;
|
||||
player->powers[pw_carry] = CR_GENERIC;
|
||||
|
||||
// Can't jump first frame
|
||||
player->pflags |= PF_JUMPSTASIS;
|
||||
|
|
@ -2254,7 +2263,11 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
target->momx = target->momy = target->momz = 0;
|
||||
if (damagetype == DMG_DROWNED) // drowned
|
||||
{
|
||||
S_StartSound(target, sfx_drown);
|
||||
target->movedir = damagetype; // we're MOVING the Damage Into anotheR function... Okay, this is a bit of a hack.
|
||||
if (target->player->charflags & SF_MACHINE)
|
||||
S_StartSound(target, sfx_fizzle);
|
||||
else
|
||||
S_StartSound(target, sfx_drown);
|
||||
// Don't jump up when drowning
|
||||
}
|
||||
else
|
||||
|
|
@ -2474,7 +2487,7 @@ static inline void P_NiGHTSDamage(mobj_t *target, mobj_t *source)
|
|||
}
|
||||
|
||||
player->powers[pw_flashing] = flashingtics;
|
||||
P_SetMobjState(target->tracer, S_NIGHTSHURT1);
|
||||
P_SetPlayerMobjState(target, S_PLAY_NIGHTS_PAIN);
|
||||
S_StartSound(target, sfx_nghurt);
|
||||
|
||||
if (oldnightstime > 10*TICRATE
|
||||
|
|
@ -2610,7 +2623,9 @@ static inline boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj
|
|||
|
||||
static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage)
|
||||
{
|
||||
player->pflags &= ~(PF_CARRIED|PF_SLIDING|PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG|PF_NIGHTSMODE);
|
||||
player->pflags &= ~(PF_SLIDING|PF_NIGHTSMODE);
|
||||
|
||||
player->powers[pw_carry] = CR_NONE;
|
||||
|
||||
// Burst weapons and emeralds in Match/CTF only
|
||||
if (source && (gametype == GT_MATCH || gametype == GT_TEAMMATCH || gametype == GT_CTF))
|
||||
|
|
|
|||
|
|
@ -62,6 +62,9 @@
|
|||
#define mariomode (maptol & TOL_MARIO)
|
||||
#define twodlevel (maptol & TOL_2D)
|
||||
|
||||
#define P_GetPlayerHeight(player) FixedMul(player->height, player->mo->scale)
|
||||
#define P_GetPlayerSpinHeight(player) FixedMul(player->spinheight, player->mo->scale)
|
||||
|
||||
//
|
||||
// P_TICK
|
||||
//
|
||||
|
|
@ -119,8 +122,6 @@ extern consvar_t cv_cam2_speed, cv_cam2_rotate, cv_cam2_rotspeed;
|
|||
extern fixed_t t_cam_dist, t_cam_height, t_cam_rotate;
|
||||
extern fixed_t t_cam2_dist, t_cam2_height, t_cam2_rotate;
|
||||
|
||||
fixed_t P_GetPlayerHeight(player_t *player);
|
||||
fixed_t P_GetPlayerSpinHeight(player_t *player);
|
||||
INT32 P_GetPlayerControlDirection(player_t *player);
|
||||
void P_AddPlayerScore(player_t *player, UINT32 amount);
|
||||
void P_ResetCamera(player_t *player, camera_t *thiscam);
|
||||
|
|
|
|||
125
src/p_map.c
125
src/p_map.c
|
|
@ -211,7 +211,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
|||
P_SetPlayerMobjState(object, S_PLAY_FALL);
|
||||
else // horizontal spring
|
||||
{
|
||||
if (pflags & (PF_JUMPED|PF_SPINNING) && object->player->panim == PA_ROLL)
|
||||
if (pflags & (PF_JUMPED|PF_SPINNING) && (object->player->panim == PA_ROLL || object->player->panim == PA_JUMP || object->player->panim == PA_FALL))
|
||||
object->player->pflags = pflags;
|
||||
else
|
||||
P_SetPlayerMobjState(object, S_PLAY_WALK);
|
||||
|
|
@ -302,12 +302,17 @@ static void P_DoTailsCarry(player_t *sonic, player_t *tails)
|
|||
INT32 p;
|
||||
fixed_t zdist; // z distance between the two players' bottoms
|
||||
|
||||
if ((tails->pflags & PF_CARRIED) && tails->mo->tracer == sonic->mo)
|
||||
if (tails->powers[pw_carry])
|
||||
return;
|
||||
if ((sonic->pflags & PF_CARRIED) && sonic->mo->tracer == tails->mo)
|
||||
if (sonic->powers[pw_carry])
|
||||
return;
|
||||
|
||||
if (!tails->powers[pw_tailsfly] && !(tails->charability == CA_FLY && tails->mo->state-states == S_PLAY_FLY_TIRED))
|
||||
if (tails->spectator)
|
||||
return;
|
||||
if (sonic->spectator)
|
||||
return;
|
||||
|
||||
if (!(tails->pflags & PF_CANCARRY))
|
||||
return;
|
||||
|
||||
if (tails->bot == 1)
|
||||
|
|
@ -316,10 +321,6 @@ static void P_DoTailsCarry(player_t *sonic, player_t *tails)
|
|||
if (sonic->pflags & PF_NIGHTSMODE)
|
||||
return;
|
||||
|
||||
if (sonic->mo->tracer && sonic->mo->tracer->type == MT_TUBEWAYPOINT
|
||||
&& !(sonic->pflags & PF_ROPEHANG))
|
||||
return; // don't steal players from zoomtubes!
|
||||
|
||||
if ((sonic->mo->eflags & MFE_VERTICALFLIP) != (tails->mo->eflags & MFE_VERTICALFLIP))
|
||||
return; // Both should be in same gravity
|
||||
|
||||
|
|
@ -334,47 +335,43 @@ static void P_DoTailsCarry(player_t *sonic, player_t *tails)
|
|||
// Search in case another player is already being carried by this fox.
|
||||
for (p = 0; p < MAXPLAYERS; p++)
|
||||
if (playeringame[p] && players[p].mo
|
||||
&& players[p].pflags & PF_CARRIED && players[p].mo->tracer == tails->mo)
|
||||
&& players[p].powers[pw_carry] == CR_PLAYER && players[p].mo->tracer == tails->mo)
|
||||
return;
|
||||
|
||||
// Why block opposing teams from tailsflying each other?
|
||||
// Sneaking into the hands of a flying tails player in Race might be a viable strategy, who knows.
|
||||
/*
|
||||
if (gametype == GT_RACE || gametype == GT_COMPETITION
|
||||
|| (netgame && (tails->spectator || sonic->spectator))
|
||||
|| (G_TagGametype() && (!(tails->pflags & PF_TAGIT) != !(sonic->pflags & PF_TAGIT)))
|
||||
|| (gametype == GT_MATCH)
|
||||
|| (G_GametypeHasTeams() && tails->ctfteam != sonic->ctfteam))
|
||||
return; */
|
||||
|
||||
if (tails->mo->eflags & MFE_VERTICALFLIP)
|
||||
zdist = (sonic->mo->z + sonic->mo->height) - (tails->mo->z + tails->mo->height);
|
||||
else
|
||||
zdist = tails->mo->z - sonic->mo->z;
|
||||
|
||||
if (zdist <= sonic->mo->height + FixedMul(FRACUNIT, sonic->mo->scale)
|
||||
if (zdist <= sonic->mo->height + sonic->mo->scale // FixedMul(FRACUNIT, sonic->mo->scale), but scale == FRACUNIT by default
|
||||
&& zdist > sonic->mo->height*2/3
|
||||
&& P_MobjFlip(tails->mo)*sonic->mo->momz <= 0)
|
||||
{
|
||||
// Why block opposing teams from tailsflying each other?
|
||||
// Sneaking into the hands of a flying tails player in Race might be a viable strategy, who knows.
|
||||
/*
|
||||
if (gametype == GT_RACE || gametype == GT_COMPETITION
|
||||
|| (netgame && (tails->spectator || sonic->spectator))
|
||||
|| (G_TagGametype() && (!(tails->pflags & PF_TAGIT) != !(sonic->pflags & PF_TAGIT)))
|
||||
|| (gametype == GT_MATCH)
|
||||
|| (G_GametypeHasTeams() && tails->ctfteam != sonic->ctfteam))
|
||||
sonic->pflags &= ~PF_CARRIED; */
|
||||
if (tails->spectator || sonic->spectator)
|
||||
sonic->pflags &= ~PF_CARRIED;
|
||||
else
|
||||
{
|
||||
if (sonic-players == consoleplayer && botingame)
|
||||
CV_SetValue(&cv_analog2, false);
|
||||
P_ResetPlayer(sonic);
|
||||
P_SetTarget(&sonic->mo->tracer, tails->mo);
|
||||
sonic->pflags |= PF_CARRIED;
|
||||
S_StartSound(sonic->mo, sfx_s3k4a);
|
||||
P_UnsetThingPosition(sonic->mo);
|
||||
sonic->mo->x = tails->mo->x;
|
||||
sonic->mo->y = tails->mo->y;
|
||||
P_SetThingPosition(sonic->mo);
|
||||
}
|
||||
if (sonic-players == consoleplayer && botingame)
|
||||
CV_SetValue(&cv_analog2, false);
|
||||
P_ResetPlayer(sonic);
|
||||
P_SetTarget(&sonic->mo->tracer, tails->mo);
|
||||
sonic->powers[pw_carry] = CR_PLAYER;
|
||||
S_StartSound(sonic->mo, sfx_s3k4a);
|
||||
P_UnsetThingPosition(sonic->mo);
|
||||
sonic->mo->x = tails->mo->x;
|
||||
sonic->mo->y = tails->mo->y;
|
||||
P_SetThingPosition(sonic->mo);
|
||||
}
|
||||
else {
|
||||
if (sonic-players == consoleplayer && botingame)
|
||||
CV_SetValue(&cv_analog2, true);
|
||||
sonic->pflags &= ~PF_CARRIED;
|
||||
sonic->powers[pw_carry] = CR_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -443,7 +440,8 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
return true; // underneath
|
||||
if (thing->type == MT_SPIKE)
|
||||
{
|
||||
S_StartSound(tmthing, thing->info->deathsound);
|
||||
if (thing->flags & MF_SOLID)
|
||||
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);
|
||||
|
|
@ -456,9 +454,13 @@ 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))
|
||||
// CA_DASHMODE users destroy spikes and monitors, CA_TWINSPIN users and CA2_MELEE users destroy spikes.
|
||||
if ((tmthing->player)
|
||||
&& (((tmthing->player->charability == CA_DASHMODE) && (tmthing->player->dashmode >= 3*TICRATE)
|
||||
&& (thing->flags & (MF_MONITOR) || thing->type == MT_SPIKE))
|
||||
|| ((((tmthing->player->charability == CA_TWINSPIN) && (tmthing->player->panim == PA_ABILITY))
|
||||
|| (tmthing->player->charability2 == CA2_MELEE && tmthing->player->panim == PA_ABILITY2))
|
||||
&& (thing->type == MT_SPIKE))))
|
||||
{
|
||||
if ((thing->flags & (MF_MONITOR)) && (thing->health <= 0 || !(thing->flags & MF_SHOOTABLE)))
|
||||
return true;
|
||||
|
|
@ -472,7 +474,8 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
return true; // underneath
|
||||
if (thing->type == MT_SPIKE)
|
||||
{
|
||||
S_StartSound(tmthing, thing->info->deathsound);
|
||||
if (thing->flags & MF_SOLID)
|
||||
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);
|
||||
|
|
@ -660,7 +663,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
|
||||
if (tmthing->flags & MF_MISSILE && thing->player && tmthing->target && tmthing->target->player
|
||||
&& thing->player->ctfteam == tmthing->target->player->ctfteam
|
||||
&& thing->player->pflags & PF_CARRIED && thing->tracer == tmthing->target)
|
||||
&& thing->player->powers[pw_carry] == CR_PLAYER && thing->tracer == tmthing->target)
|
||||
return true; // Don't give rings to your carry player by accident.
|
||||
|
||||
if (thing->type == MT_EGGSHIELD)
|
||||
|
|
@ -703,7 +706,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
&& tmthing->target != thing)
|
||||
{
|
||||
// Hop on the missile for a ride!
|
||||
thing->player->pflags |= PF_ITEMHANG;
|
||||
thing->player->powers[pw_carry] = CR_GENERIC;
|
||||
thing->player->pflags &= ~PF_JUMPED;
|
||||
P_SetTarget(&thing->tracer, tmthing);
|
||||
P_SetTarget(&tmthing->target, thing); // Set owner to the player
|
||||
|
|
@ -722,7 +725,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
|
||||
return true;
|
||||
}
|
||||
else if (tmthing->type == MT_BLACKEGGMAN_MISSILE && thing->player && ((thing->player->pflags & PF_ITEMHANG) || (thing->player->pflags & PF_JUMPED)))
|
||||
else if (tmthing->type == MT_BLACKEGGMAN_MISSILE && thing->player && ((thing->player->powers[pw_carry] == CR_GENERIC) || (thing->player->pflags & PF_JUMPED)))
|
||||
{
|
||||
// Ignore
|
||||
}
|
||||
|
|
@ -923,7 +926,8 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
else if (thing->player) {
|
||||
if (thing->player-players == consoleplayer && botingame)
|
||||
CV_SetValue(&cv_analog2, true);
|
||||
thing->player->pflags &= ~PF_CARRIED;
|
||||
if (thing->player->powers[pw_carry] == CR_PLAYER)
|
||||
thing->player->powers[pw_carry] = CR_NONE;
|
||||
}
|
||||
|
||||
if (thing->player)
|
||||
|
|
@ -975,7 +979,13 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
&& thing->z + thing->height + FixedMul(FRACUNIT, thing->scale) >= tmthing->z)
|
||||
{
|
||||
if (thing->flags & MF_MONITOR
|
||||
&& tmthing->player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING))
|
||||
&& (tmthing->player->pflags & (PF_SPINNING|PF_GLIDING)
|
||||
|| ((tmthing->player->pflags & PF_JUMPED)
|
||||
&& !(tmthing->player->charflags & SF_NOJUMPDAMAGE
|
||||
&& !(tmthing->player->charability == CA_TWINSPIN && tmthing->player->panim == PA_ABILITY)))
|
||||
|| (tmthing->player->charability2 == CA2_MELEE && tmthing->player->panim == PA_ABILITY2)
|
||||
|| ((tmthing->player->charflags & SF_STOMPDAMAGE)
|
||||
&& (P_MobjFlip(tmthing)*(tmthing->z - (thing->z + thing->height/2)) > 0) && (P_MobjFlip(tmthing)*tmthing->momz < 0))))
|
||||
{
|
||||
SINT8 flipval = P_MobjFlip(thing); // Save this value in case monitor gets removed.
|
||||
fixed_t *momz = &tmthing->momz; // tmthing gets changed by P_DamageMobj, so we need a new pointer?! X_x;;
|
||||
|
|
@ -997,7 +1007,14 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
}
|
||||
// Monitors are not treated as solid to players who are jumping, spinning or gliding,
|
||||
// unless it's a CTF team monitor and you're on the wrong team
|
||||
else if (thing->flags & MF_MONITOR && tmthing->player && tmthing->player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING)
|
||||
else if (thing->flags & MF_MONITOR && tmthing->player
|
||||
&& (tmthing->player->pflags & (PF_SPINNING|PF_GLIDING)
|
||||
|| ((tmthing->player->pflags & PF_JUMPED)
|
||||
&& !(tmthing->player->charflags & SF_NOJUMPDAMAGE
|
||||
&& !(tmthing->player->charability == CA_TWINSPIN && tmthing->player->panim == PA_ABILITY)))
|
||||
|| (tmthing->player->charability2 == CA2_MELEE && tmthing->player->panim == PA_ABILITY2)
|
||||
|| ((tmthing->player->charflags & SF_STOMPDAMAGE)
|
||||
&& (P_MobjFlip(tmthing)*(tmthing->z - (thing->z + thing->height/2)) > 0) && (P_MobjFlip(tmthing)*tmthing->momz < 0)))
|
||||
&& !((thing->type == MT_REDRINGBOX && tmthing->player->ctfteam != 1) || (thing->type == MT_BLUERINGBOX && tmthing->player->ctfteam != 2)))
|
||||
;
|
||||
// z checking at last
|
||||
|
|
@ -1192,7 +1209,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)
|
||||
|
|
@ -1310,7 +1327,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);
|
||||
|
|
@ -2009,8 +2026,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.
|
||||
|
|
@ -2620,7 +2641,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
|
||||
|
|
@ -2696,7 +2717,7 @@ isblocking:
|
|||
// see about climbing on the wall
|
||||
if (!(checkline->flags & ML_NOCLIMB))
|
||||
{
|
||||
boolean canclimb; // FUCK C90
|
||||
boolean canclimb;
|
||||
angle_t climbangle, climbline;
|
||||
INT32 whichside = P_PointOnLineSide(slidemo->x, slidemo->y, li);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 *));
|
||||
|
|
|
|||
469
src/p_mobj.c
469
src/p_mobj.c
|
|
@ -163,6 +163,16 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
I_Error("P_SetPlayerMobjState used for non-player mobj. Use P_SetMobjState instead!\n(Mobj type: %d, State: %d)", mobj->type, state);
|
||||
#endif
|
||||
|
||||
// Catch falling for nojumpspin
|
||||
if ((state == S_PLAY_JUMP) && (player->charflags & SF_NOJUMPSPIN) && (P_MobjFlip(mobj)*mobj->momz < 0))
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_FALL);
|
||||
|
||||
// Catch swimming versus flying
|
||||
if (state == S_PLAY_FLY && player->mo->eflags & MFE_UNDERWATER)
|
||||
return P_SetPlayerMobjState(player->mo, S_PLAY_SWIM);
|
||||
else if (state == S_PLAY_SWIM && !(player->mo->eflags & MFE_UNDERWATER))
|
||||
return P_SetPlayerMobjState(player->mo, S_PLAY_FLY);
|
||||
|
||||
// Catch state changes for Super Sonic
|
||||
if (player->powers[pw_super] && (player->charflags & SF_SUPERANIMS))
|
||||
{
|
||||
|
|
@ -243,12 +253,14 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
player->panim = PA_PAIN;
|
||||
break;
|
||||
case S_PLAY_SPIN:
|
||||
case S_PLAY_DASH:
|
||||
case S_PLAY_JUMP:
|
||||
//case S_PLAY_DASH: -- everyone can ROLL thanks to zoom tubes...
|
||||
case S_PLAY_SUPER_SPIN:
|
||||
case S_PLAY_SUPER_JUMP:
|
||||
player->panim = PA_ROLL;
|
||||
break;
|
||||
case S_PLAY_JUMP:
|
||||
case S_PLAY_SUPER_JUMP:
|
||||
player->panim = PA_JUMP;
|
||||
break;
|
||||
case S_PLAY_SPRING:
|
||||
case S_PLAY_SUPER_SPRING:
|
||||
player->panim = PA_SPRING;
|
||||
|
|
@ -258,9 +270,16 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
player->panim = PA_FALL;
|
||||
break;
|
||||
case S_PLAY_FLY:
|
||||
case S_PLAY_SWIM:
|
||||
case S_PLAY_GLIDE:
|
||||
case S_PLAY_TWINSPIN:
|
||||
player->panim = PA_ABILITY;
|
||||
break;
|
||||
case S_PLAY_DASH: // ...but the act of SPINDASHING is charability2 specific.
|
||||
case S_PLAY_MELEE:
|
||||
case S_PLAY_MELEE_FINISH:
|
||||
player->panim = PA_ABILITY2;
|
||||
break;
|
||||
case S_PLAY_RIDE:
|
||||
case S_PLAY_SUPER_RIDE:
|
||||
player->panim = PA_RIDE;
|
||||
|
|
@ -291,16 +310,8 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
// Adjust the player's animation speed to match their velocity.
|
||||
if (!(disableSpeedAdjust || player->charflags & SF_NOSPEEDADJUST))
|
||||
{
|
||||
fixed_t speed = FixedDiv(player->speed, FixedMul(mobj->scale, player->mo->movefactor));
|
||||
|
||||
if (player->panim == PA_ROLL)
|
||||
{
|
||||
if (speed > 16<<FRACBITS)
|
||||
mobj->tics = 1;
|
||||
else
|
||||
mobj->tics = 2;
|
||||
}
|
||||
else if (player->panim == PA_FALL)
|
||||
fixed_t speed;// = FixedDiv(player->speed, FixedMul(mobj->scale, player->mo->movefactor));
|
||||
if (player->panim == PA_FALL)
|
||||
{
|
||||
speed = FixedDiv(abs(mobj->momz), mobj->scale);
|
||||
if (speed < 10<<FRACBITS)
|
||||
|
|
@ -312,36 +323,61 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
else
|
||||
mobj->tics = 1;
|
||||
}
|
||||
else if (P_IsObjectOnGround(mobj) || player->powers[pw_super]) // Only if on the ground or superflying.
|
||||
else if (player->panim == PA_ABILITY2 && player->charability2 == CA2_SPINDASH)
|
||||
{
|
||||
if (player->panim == PA_WALK)
|
||||
fixed_t step = (player->maxdash - player->mindash)/4;
|
||||
speed = (player->dashspeed - player->mindash);
|
||||
if (speed > 3*step)
|
||||
mobj->tics = 1;
|
||||
else if (speed > step)
|
||||
mobj->tics = 2;
|
||||
else
|
||||
mobj->tics = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
speed = FixedDiv(player->speed, FixedMul(mobj->scale, player->mo->movefactor));
|
||||
if (player->panim == PA_ROLL || player->panim == PA_JUMP)
|
||||
{
|
||||
if (speed > 12<<FRACBITS)
|
||||
mobj->tics = 2;
|
||||
else if (speed > 6<<FRACBITS)
|
||||
mobj->tics = 3;
|
||||
else
|
||||
mobj->tics = 4;
|
||||
}
|
||||
else if ((player->panim == PA_RUN) || (player->panim == PA_PEEL))
|
||||
{
|
||||
if (speed > 52<<FRACBITS)
|
||||
if (speed > 16<<FRACBITS)
|
||||
mobj->tics = 1;
|
||||
else
|
||||
mobj->tics = 2;
|
||||
}
|
||||
else if (P_IsObjectOnGround(mobj) || player->powers[pw_super]) // Only if on the ground or superflying.
|
||||
{
|
||||
if (player->panim == PA_WALK)
|
||||
{
|
||||
if (speed > 12<<FRACBITS)
|
||||
mobj->tics = 2;
|
||||
else if (speed > 6<<FRACBITS)
|
||||
mobj->tics = 3;
|
||||
else
|
||||
mobj->tics = 4;
|
||||
}
|
||||
else if ((player->panim == PA_RUN) || (player->panim == PA_PEEL))
|
||||
{
|
||||
if (speed > 52<<FRACBITS)
|
||||
mobj->tics = 1;
|
||||
else
|
||||
mobj->tics = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set
|
||||
|
||||
// Player animations
|
||||
if (st->sprite == SPR_PLAY)
|
||||
{
|
||||
skin_t *skin = ((skin_t *)mobj->skin);
|
||||
boolean noalt = false;
|
||||
UINT8 spr2 = st->frame & FF_FRAMEMASK;
|
||||
UINT16 frame = (mobj->frame & FF_FRAMEMASK)+1;
|
||||
mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set
|
||||
UINT8 numframes;
|
||||
|
||||
while (((skin_t *)mobj->skin)->sprites[spr2].numframes <= 0
|
||||
while (skin && ((numframes = skin->sprites[spr2].numframes) <= 0)
|
||||
&& spr2 != SPR2_STND)
|
||||
{
|
||||
switch(spr2)
|
||||
|
|
@ -362,7 +398,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
spr2 = SPR2_SPNG;
|
||||
break;
|
||||
case SPR2_JUMP:
|
||||
spr2 = SPR2_SPIN;
|
||||
spr2 = (player->charflags & SF_NOJUMPSPIN) ? SPR2_SPNG : SPR2_SPIN;
|
||||
break;
|
||||
case SPR2_SPNG: // spring
|
||||
spr2 = SPR2_FALL;
|
||||
|
|
@ -377,23 +413,29 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
case SPR2_FLY:
|
||||
spr2 = SPR2_SPNG;
|
||||
break;
|
||||
case SPR2_TIRE:
|
||||
case SPR2_SWIM:
|
||||
spr2 = SPR2_FLY;
|
||||
break;
|
||||
case SPR2_TIRE:
|
||||
spr2 = (player->charability == CA_FLY) ? SPR2_FLY : SPR2_SWIM;
|
||||
break;
|
||||
|
||||
case SPR2_GLID:
|
||||
spr2 = SPR2_FLY;
|
||||
break;
|
||||
case SPR2_CLMB:
|
||||
spr2 = SPR2_WALK;
|
||||
spr2 = SPR2_SPIN;
|
||||
break;
|
||||
case SPR2_CLNG:
|
||||
spr2 = SPR2_CLMB;
|
||||
break;
|
||||
|
||||
case SPR2_SIGN:
|
||||
case SPR2_LIFE:
|
||||
noalt = true;
|
||||
case SPR2_TWIN:
|
||||
spr2 = SPR2_SPIN;
|
||||
break;
|
||||
|
||||
case SPR2_MLEE:
|
||||
spr2 = SPR2_TWIN;
|
||||
break;
|
||||
|
||||
// Super sprites fallback to regular sprites
|
||||
|
|
@ -409,7 +451,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
case SPR2_SPAN:
|
||||
spr2 = SPR2_PAIN;
|
||||
break;
|
||||
case SPR2_SMSL:
|
||||
case SPR2_SSTN:
|
||||
spr2 = SPR2_SPAN;
|
||||
break;
|
||||
case SPR2_SDTH:
|
||||
|
|
@ -425,7 +467,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
spr2 = SPR2_GASP;
|
||||
break;
|
||||
case SPR2_SJMP:
|
||||
spr2 = SPR2_JUMP;
|
||||
spr2 = (player->charflags & SF_NOJUMPSPIN) ? SPR2_SSPG : SPR2_SSPN;
|
||||
break;
|
||||
case SPR2_SSPG:
|
||||
spr2 = SPR2_SPNG;
|
||||
|
|
@ -443,6 +485,87 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
spr2 = SPR2_SWLK;
|
||||
break;
|
||||
|
||||
// NiGHTS sprites.
|
||||
case SPR2_NTRN:
|
||||
spr2 = SPR2_TRNS;
|
||||
break;
|
||||
case SPR2_NSTD:
|
||||
spr2 = SPR2_SSTD;
|
||||
break;
|
||||
case SPR2_NFLT:
|
||||
spr2 = (skin->flags & SF_SUPERANIMS) ? SPR2_SFLT : SPR2_FALL; // This is skin-exclusive so the default NiGHTS skin changing system plays nice.
|
||||
break;
|
||||
case SPR2_NPUL:
|
||||
spr2 = SPR2_NFLT;
|
||||
break;
|
||||
case SPR2_NPAN:
|
||||
spr2 = SPR2_NPUL;
|
||||
break;
|
||||
case SPR2_NATK:
|
||||
spr2 = SPR2_SSPN;
|
||||
break;
|
||||
/*case SPR2_NGT0:
|
||||
spr2 = SPR2_STND;
|
||||
break;*/
|
||||
case SPR2_NGT1:
|
||||
case SPR2_NGT7:
|
||||
case SPR2_DRL0:
|
||||
spr2 = SPR2_NGT0;
|
||||
break;
|
||||
case SPR2_NGT2:
|
||||
case SPR2_DRL1:
|
||||
spr2 = SPR2_NGT1;
|
||||
break;
|
||||
case SPR2_NGT3:
|
||||
case SPR2_DRL2:
|
||||
spr2 = SPR2_NGT2;
|
||||
break;
|
||||
case SPR2_NGT4:
|
||||
case SPR2_DRL3:
|
||||
spr2 = SPR2_NGT3;
|
||||
break;
|
||||
case SPR2_NGT5:
|
||||
case SPR2_DRL4:
|
||||
spr2 = SPR2_NGT4;
|
||||
break;
|
||||
case SPR2_NGT6:
|
||||
case SPR2_DRL5:
|
||||
spr2 = SPR2_NGT5;
|
||||
break;
|
||||
case SPR2_DRL6:
|
||||
spr2 = SPR2_NGT6;
|
||||
break;
|
||||
case SPR2_NGT8:
|
||||
case SPR2_DRL7:
|
||||
spr2 = SPR2_NGT7;
|
||||
break;
|
||||
case SPR2_NGT9:
|
||||
case SPR2_DRL8:
|
||||
spr2 = SPR2_NGT8;
|
||||
break;
|
||||
case SPR2_NGTA:
|
||||
case SPR2_DRL9:
|
||||
spr2 = SPR2_NGT9;
|
||||
break;
|
||||
case SPR2_NGTB:
|
||||
case SPR2_DRLA:
|
||||
spr2 = SPR2_NGTA;
|
||||
break;
|
||||
case SPR2_NGTC:
|
||||
case SPR2_DRLB:
|
||||
spr2 = SPR2_NGTB;
|
||||
break;
|
||||
case SPR2_DRLC:
|
||||
spr2 = SPR2_NGTC;
|
||||
break;
|
||||
|
||||
|
||||
// Sprites for non-player objects? There's nothing we can do.
|
||||
case SPR2_SIGN:
|
||||
case SPR2_LIFE:
|
||||
noalt = true;
|
||||
break;
|
||||
|
||||
// Dunno? Just go to standing then.
|
||||
default:
|
||||
spr2 = SPR2_STND;
|
||||
|
|
@ -452,24 +575,54 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
break;
|
||||
}
|
||||
|
||||
if (!skin)
|
||||
{
|
||||
frame = 0;
|
||||
numframes = 0;
|
||||
}
|
||||
|
||||
if (mobj->sprite != SPR_PLAY)
|
||||
{
|
||||
mobj->sprite = SPR_PLAY;
|
||||
frame = 0;
|
||||
}
|
||||
else if (mobj->sprite2 != spr2)
|
||||
frame = 0;
|
||||
{
|
||||
if ((st->frame & FF_MIDDLESTARTCHANCE) && numframes && P_RandomChance(FRACUNIT/2))
|
||||
frame = numframes/2;
|
||||
else
|
||||
frame = 0;
|
||||
}
|
||||
|
||||
if (frame >= numframes)
|
||||
{
|
||||
if (st->frame & FF_SPR2ENDSTATE) // no frame advancement
|
||||
{
|
||||
if (st->var1 == S_NULL)
|
||||
frame--;
|
||||
else
|
||||
{
|
||||
if (mobj->frame & FF_FRAMEMASK)
|
||||
mobj->frame--;
|
||||
return P_SetPlayerMobjState(mobj, st->var1);
|
||||
}
|
||||
}
|
||||
else
|
||||
frame = 0;
|
||||
}
|
||||
|
||||
mobj->sprite2 = spr2;
|
||||
if (!mobj->skin || frame >= ((skin_t *)mobj->skin)->sprites[spr2].numframes)
|
||||
frame = 0;
|
||||
mobj->frame = frame|(st->frame&~FF_FRAMEMASK);
|
||||
if (mobj->color >= MAXSKINCOLORS && mobj->color < MAXTRANSLATIONS) // Super colours? Super bright!
|
||||
mobj->frame |= FF_FULLBRIGHT;
|
||||
}
|
||||
// Regular sprites
|
||||
else
|
||||
{
|
||||
mobj->sprite = st->sprite;
|
||||
mobj->frame = st->frame;
|
||||
if ((st->frame & (FF_ANIMATE|FF_MIDDLESTARTCHANCE)) == (FF_ANIMATE|FF_MIDDLESTARTCHANCE))
|
||||
mobj->frame += P_RandomKey(st->var1+1);
|
||||
}
|
||||
|
||||
// Modified handling.
|
||||
|
|
@ -541,18 +694,41 @@ boolean P_SetMobjState(mobj_t *mobj, statenum_t state)
|
|||
// Player animations
|
||||
if (st->sprite == SPR_PLAY)
|
||||
{
|
||||
skin_t *skin = ((skin_t *)mobj->skin);
|
||||
UINT8 spr2 = st->frame & FF_FRAMEMASK;
|
||||
UINT16 frame = (mobj->frame & FF_FRAMEMASK)+1;
|
||||
UINT8 numframes;
|
||||
|
||||
if (skin)
|
||||
numframes = skin->sprites[spr2].numframes;
|
||||
else
|
||||
{
|
||||
frame = 0;
|
||||
numframes = 0;
|
||||
}
|
||||
|
||||
if (mobj->sprite != SPR_PLAY)
|
||||
{
|
||||
mobj->sprite = SPR_PLAY;
|
||||
frame = 0;
|
||||
}
|
||||
else if (mobj->sprite2 != spr2)
|
||||
frame = 0;
|
||||
{
|
||||
if ((st->frame & FF_MIDDLESTARTCHANCE) && numframes && P_RandomChance(FRACUNIT/2))
|
||||
frame = numframes/2;
|
||||
else
|
||||
frame = 0;
|
||||
}
|
||||
|
||||
if (frame >= numframes)
|
||||
{
|
||||
if (st->frame & FF_SPR2ENDSTATE)
|
||||
return P_SetPlayerMobjState(mobj, st->var1); // Differs from P_SetPlayerMobjState - allows object to be removed via S_NULL
|
||||
else
|
||||
frame = 0;
|
||||
}
|
||||
|
||||
mobj->sprite2 = spr2;
|
||||
if (!mobj->skin || frame >= ((skin_t *)mobj->skin)->sprites[spr2].numframes)
|
||||
frame = 0;
|
||||
mobj->frame = frame|(st->frame&~FF_FRAMEMASK);
|
||||
}
|
||||
// Regular sprites
|
||||
|
|
@ -560,6 +736,8 @@ boolean P_SetMobjState(mobj_t *mobj, statenum_t state)
|
|||
{
|
||||
mobj->sprite = st->sprite;
|
||||
mobj->frame = st->frame;
|
||||
if ((st->frame & (FF_ANIMATE|FF_MIDDLESTARTCHANCE)) == (FF_ANIMATE|FF_MIDDLESTARTCHANCE))
|
||||
mobj->frame += P_RandomKey(st->var1+1);
|
||||
}
|
||||
|
||||
// Modified handling.
|
||||
|
|
@ -1466,25 +1644,23 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
|
|||
|
||||
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)
|
||||
{
|
||||
gravityadd = -FixedMul(gravity,
|
||||
(FixedDiv(*rover->master->frontsector->gravity>>FRACBITS, 1000)));
|
||||
if ((rover->flags & (FF_SWIMMABLE|FF_GOOWATER)) == (FF_SWIMMABLE|FF_GOOWATER))
|
||||
goopgravity = true;
|
||||
|
||||
if (rover->master->frontsector->verticalflip && gravityadd > 0)
|
||||
mo->eflags |= MFE_VERTICALFLIP;
|
||||
if (!(rover->master->frontsector->gravity))
|
||||
continue;
|
||||
|
||||
no3dfloorgrav = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
gravityadd = -FixedMul(gravity,
|
||||
(FixedDiv(*rover->master->frontsector->gravity>>FRACBITS, 1000)));
|
||||
|
||||
if (rover->master->frontsector->verticalflip && gravityadd > 0)
|
||||
mo->eflags |= MFE_VERTICALFLIP;
|
||||
|
||||
no3dfloorgrav = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1506,28 +1682,20 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
|
|||
|
||||
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;
|
||||
|
||||
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
|
||||
{
|
||||
UINT8 bits = 0;
|
||||
if (mo->flags2 & MF2_OBJECTFLIP)
|
||||
bits ^= 1;
|
||||
if (mo->player->powers[pw_gravityboots])
|
||||
bits ^= 1;
|
||||
if (bits & 1)
|
||||
{
|
||||
gravityadd = -gravityadd;
|
||||
mo->eflags ^= MFE_VERTICALFLIP;
|
||||
}
|
||||
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
|
||||
{
|
||||
|
|
@ -1535,10 +1703,10 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
|
|||
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.
|
||||
{
|
||||
|
|
@ -1584,9 +1752,6 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
|
|||
if (goopgravity)
|
||||
gravityadd = -gravityadd/5;
|
||||
|
||||
if (mo->player && !!(mo->eflags & MFE_VERTICALFLIP) != wasflip)
|
||||
P_PlayerFlip(mo);
|
||||
|
||||
gravityadd = FixedMul(gravityadd, mo->scale);
|
||||
|
||||
return gravityadd;
|
||||
|
|
@ -1739,6 +1904,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)
|
||||
{
|
||||
|
|
@ -1751,37 +1917,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;
|
||||
}
|
||||
|
||||
|
|
@ -1836,8 +2004,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)
|
||||
{
|
||||
|
|
@ -1894,9 +2060,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);
|
||||
}
|
||||
|
|
@ -2001,7 +2167,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;;
|
||||
|
|
@ -2565,6 +2731,12 @@ static boolean P_ZMovement(mobj_t *mo)
|
|||
mo->z = mo->floorz;
|
||||
|
||||
#ifdef ESLOPE
|
||||
if (mo->standingslope) // You're still on the ground; why are we here?
|
||||
{
|
||||
mo->momz = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
P_CheckPosition(mo, mo->x, mo->y); // Sets mo->standingslope correctly
|
||||
if (((mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope) && (mo->type != MT_STEAM))
|
||||
{
|
||||
|
|
@ -2978,12 +3150,17 @@ static void P_PlayerZMovement(mobj_t *mo)
|
|||
mo->player->skidtime = TICRATE;
|
||||
mo->tics = -1;
|
||||
}
|
||||
else if (mo->player->charability2 == CA2_MELEE && mo->player->panim == PA_ABILITY2)
|
||||
{
|
||||
P_InstaThrust(mo, mo->angle, 0);
|
||||
P_SetPlayerMobjState(mo, S_PLAY_STND);
|
||||
}
|
||||
else if (mo->player->pflags & PF_JUMPED || (mo->player->pflags & (PF_SPINNING|PF_USEDOWN)) != (PF_SPINNING|PF_USEDOWN)
|
||||
|| mo->player->powers[pw_tailsfly] || mo->state-states == S_PLAY_FLY_TIRED)
|
||||
{
|
||||
if (mo->player->cmomx || mo->player->cmomy)
|
||||
{
|
||||
if (mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_PEEL)
|
||||
if (mo->player->charability == CA_DASHMODE && 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);
|
||||
|
|
@ -2994,7 +3171,7 @@ static void P_PlayerZMovement(mobj_t *mo)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_PEEL)
|
||||
if (mo->player->charability == CA_DASHMODE && 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);
|
||||
|
|
@ -3012,8 +3189,7 @@ static void P_PlayerZMovement(mobj_t *mo)
|
|||
|
||||
if (!(mo->player->pflags & PF_GLIDING))
|
||||
mo->player->pflags &= ~PF_JUMPED;
|
||||
mo->player->pflags &= ~PF_THOKKED;
|
||||
//mo->player->pflags &= ~PF_GLIDING;
|
||||
mo->player->pflags &= ~(PF_THOKKED|PF_CANCARRY/*|PF_GLIDING*/);
|
||||
mo->player->jumping = 0;
|
||||
mo->player->secondjump = 0;
|
||||
mo->player->glidetime = 0;
|
||||
|
|
@ -3281,7 +3457,7 @@ static boolean P_SceneryZMovement(mobj_t *mo)
|
|||
boolean P_CanRunOnWater(player_t *player, ffloor_t *rover)
|
||||
{
|
||||
if (!(player->pflags & PF_NIGHTSMODE) && !player->homing
|
||||
&& (((player->charability == CA_SWIM) || player->powers[pw_super] || player->charflags & SF_RUNONWATER) && player->mo->ceilingz-*rover->topheight >= player->mo->height)
|
||||
&& ((player->powers[pw_super] || player->charflags & SF_RUNONWATER) && player->mo->ceilingz-*rover->topheight >= player->mo->height)
|
||||
&& (rover->flags & FF_SWIMMABLE) && !(player->pflags & PF_SPINNING) && player->speed > FixedMul(player->runspeed, player->mo->scale)
|
||||
&& !(player->pflags & PF_SLIDING)
|
||||
&& abs(player->mo->z - *rover->topheight) < FixedMul(30*FRACUNIT, player->mo->scale))
|
||||
|
|
@ -3300,10 +3476,11 @@ void P_MobjCheckWater(mobj_t *mobj)
|
|||
boolean waterwasnotset = (mobj->watertop == INT32_MAX);
|
||||
boolean wasinwater = (mobj->eflags & MFE_UNDERWATER) == MFE_UNDERWATER;
|
||||
boolean wasingoo = (mobj->eflags & MFE_GOOWATER) == MFE_GOOWATER;
|
||||
fixed_t thingtop = mobj->z + mobj->height; // especially for players, infotable height does not neccessarily match actual height
|
||||
fixed_t thingtop = mobj->z + mobj->height;
|
||||
sector_t *sector = mobj->subsector->sector;
|
||||
ffloor_t *rover;
|
||||
player_t *p = mobj->player; // Will just be null if not a player.
|
||||
fixed_t height = (p ? P_GetPlayerHeight(p) : mobj->height); // for players, calculation height does not necessarily match actual height for gameplay reasons (spin, etc)
|
||||
|
||||
// Default if no water exists.
|
||||
mobj->watertop = mobj->waterbottom = mobj->z - 1000*FRACUNIT;
|
||||
|
|
@ -3332,14 +3509,14 @@ void P_MobjCheckWater(mobj_t *mobj)
|
|||
|
||||
if (mobj->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
if (topheight < (thingtop - FixedMul(mobj->info->height/2, mobj->scale))
|
||||
if (topheight < (thingtop - (height>>1))
|
||||
|| bottomheight > thingtop)
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (topheight < mobj->z
|
||||
|| bottomheight > (mobj->z + FixedMul(mobj->info->height/2, mobj->scale)))
|
||||
|| bottomheight > (mobj->z + (height>>1)))
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -3348,16 +3525,16 @@ void P_MobjCheckWater(mobj_t *mobj)
|
|||
mobj->waterbottom = bottomheight;
|
||||
|
||||
// Just touching the water?
|
||||
if (((mobj->eflags & MFE_VERTICALFLIP) && thingtop - FixedMul(mobj->info->height, mobj->scale) < bottomheight)
|
||||
|| (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z + FixedMul(mobj->info->height, mobj->scale) > topheight))
|
||||
if (((mobj->eflags & MFE_VERTICALFLIP) && thingtop - height < bottomheight)
|
||||
|| (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z + height > topheight))
|
||||
{
|
||||
mobj->eflags |= MFE_TOUCHWATER;
|
||||
if (rover->flags & FF_GOOWATER && !(mobj->flags & MF_NOGRAVITY))
|
||||
mobj->eflags |= MFE_GOOWATER;
|
||||
}
|
||||
// Actually in the water?
|
||||
if (((mobj->eflags & MFE_VERTICALFLIP) && thingtop - FixedMul(mobj->info->height/2, mobj->scale) > bottomheight)
|
||||
|| (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z + FixedMul(mobj->info->height/2, mobj->scale) < topheight))
|
||||
if (((mobj->eflags & MFE_VERTICALFLIP) && thingtop - (height>>1) > bottomheight)
|
||||
|| (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z + (height>>1) < topheight))
|
||||
{
|
||||
mobj->eflags |= MFE_UNDERWATER;
|
||||
if (rover->flags & FF_GOOWATER && !(mobj->flags & MF_NOGRAVITY))
|
||||
|
|
@ -3365,6 +3542,10 @@ void P_MobjCheckWater(mobj_t *mobj)
|
|||
}
|
||||
}
|
||||
|
||||
// Spectators and dead players don't get to do any of the things after this.
|
||||
if (p && (p->spectator || p->playerstate != PST_LIVE))
|
||||
return;
|
||||
|
||||
// Specific things for underwater players
|
||||
if (p && (mobj->eflags & MFE_UNDERWATER) == MFE_UNDERWATER)
|
||||
{
|
||||
|
|
@ -3397,10 +3578,6 @@ void P_MobjCheckWater(mobj_t *mobj)
|
|||
if (waterwasnotset || !!(mobj->eflags & MFE_UNDERWATER) == wasinwater)
|
||||
return;
|
||||
|
||||
// Spectators and dead players also don't count.
|
||||
if (p && (p->spectator || p->playerstate != PST_LIVE))
|
||||
return;
|
||||
|
||||
if ((p) // Players
|
||||
|| (mobj->flags & MF_PUSHABLE) // Pushables
|
||||
|| ((mobj->info->flags & MF_PUSHABLE) && mobj->fuse) // Previously pushable, might be moving still
|
||||
|
|
@ -3408,10 +3585,8 @@ void P_MobjCheckWater(mobj_t *mobj)
|
|||
{
|
||||
// Check to make sure you didn't just cross into a sector to jump out of
|
||||
// that has shallower water than the block you were originally in.
|
||||
if (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->watertop-mobj->floorz <= FixedMul(mobj->info->height, mobj->scale)>>1)
|
||||
return;
|
||||
|
||||
if ((mobj->eflags & MFE_VERTICALFLIP) && mobj->ceilingz-mobj->waterbottom <= FixedMul(mobj->info->height, mobj->scale)>>1)
|
||||
if ((!(mobj->eflags & MFE_VERTICALFLIP) && mobj->watertop-mobj->floorz <= height>>1)
|
||||
|| ((mobj->eflags & MFE_VERTICALFLIP) && mobj->ceilingz-mobj->waterbottom <= height>>1))
|
||||
return;
|
||||
|
||||
if ((mobj->eflags & MFE_GOOWATER || wasingoo)) { // Decide what happens to your momentum when you enter/leave goopy water.
|
||||
|
|
@ -3423,8 +3598,8 @@ void P_MobjCheckWater(mobj_t *mobj)
|
|||
|
||||
if (P_MobjFlip(mobj)*mobj->momz < 0)
|
||||
{
|
||||
if ((mobj->eflags & MFE_VERTICALFLIP && thingtop-(FixedMul(mobj->info->height, mobj->scale)>>1)-mobj->momz <= mobj->waterbottom)
|
||||
|| (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z+(FixedMul(mobj->info->height, mobj->scale)>>1)-mobj->momz >= mobj->watertop))
|
||||
if ((mobj->eflags & MFE_VERTICALFLIP && thingtop-(height>>1)-mobj->momz <= mobj->waterbottom)
|
||||
|| (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z+(height>>1)-mobj->momz >= mobj->watertop))
|
||||
{
|
||||
// Spawn a splash
|
||||
mobj_t *splish;
|
||||
|
|
@ -3457,8 +3632,8 @@ void P_MobjCheckWater(mobj_t *mobj)
|
|||
}
|
||||
else if (P_MobjFlip(mobj)*mobj->momz > 0)
|
||||
{
|
||||
if (((mobj->eflags & MFE_VERTICALFLIP && thingtop-(FixedMul(mobj->info->height, mobj->scale)>>1)-mobj->momz > mobj->waterbottom)
|
||||
|| (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z+(FixedMul(mobj->info->height, mobj->scale)>>1)-mobj->momz < mobj->watertop))
|
||||
if (((mobj->eflags & MFE_VERTICALFLIP && thingtop-(height>>1)-mobj->momz > mobj->waterbottom)
|
||||
|| (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z+(height>>1)-mobj->momz < mobj->watertop))
|
||||
&& !(mobj->eflags & MFE_UNDERWATER)) // underwater check to prevent splashes on opposite side
|
||||
{
|
||||
// Spawn a splash
|
||||
|
|
@ -3563,10 +3738,10 @@ static void P_SceneryCheckWater(mobj_t *mobj)
|
|||
#endif
|
||||
|
||||
if (topheight <= mobj->z
|
||||
|| bottomheight > (mobj->z + FixedMul(mobj->info->height >> 1, mobj->scale)))
|
||||
|| bottomheight > (mobj->z + (mobj->height>>1)))
|
||||
continue;
|
||||
|
||||
if (mobj->z + FixedMul(mobj->info->height, mobj->scale) > topheight)
|
||||
if (mobj->z + mobj->height > topheight)
|
||||
mobj->eflags |= MFE_TOUCHWATER;
|
||||
else
|
||||
mobj->eflags &= ~MFE_TOUCHWATER;
|
||||
|
|
@ -3575,7 +3750,7 @@ static void P_SceneryCheckWater(mobj_t *mobj)
|
|||
mobj->watertop = topheight;
|
||||
mobj->waterbottom = bottomheight;
|
||||
|
||||
if (mobj->z + FixedMul(mobj->info->height >> 1, mobj->scale) < topheight)
|
||||
if (mobj->z + (mobj->height>>1) < topheight)
|
||||
mobj->eflags |= MFE_UNDERWATER;
|
||||
else
|
||||
mobj->eflags &= ~MFE_UNDERWATER;
|
||||
|
|
@ -3828,20 +4003,23 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
|||
mobj->eflags &= ~MFE_JUSTSTEPPEDDOWN;
|
||||
|
||||
// Zoom tube
|
||||
if (mobj->tracer && mobj->tracer->type == MT_TUBEWAYPOINT)
|
||||
if (mobj->tracer)
|
||||
{
|
||||
P_UnsetThingPosition(mobj);
|
||||
mobj->x += mobj->momx;
|
||||
mobj->y += mobj->momy;
|
||||
mobj->z += mobj->momz;
|
||||
P_SetThingPosition(mobj);
|
||||
P_CheckPosition(mobj, mobj->x, mobj->y);
|
||||
goto animonly;
|
||||
}
|
||||
else if (mobj->player->pflags & PF_MACESPIN && mobj->tracer)
|
||||
{
|
||||
P_CheckPosition(mobj, mobj->x, mobj->y);
|
||||
goto animonly;
|
||||
if (mobj->player->powers[pw_carry] == CR_ZOOMTUBE || mobj->player->powers[pw_carry] == CR_ROPEHANG)
|
||||
{
|
||||
P_UnsetThingPosition(mobj);
|
||||
mobj->x += mobj->momx;
|
||||
mobj->y += mobj->momy;
|
||||
mobj->z += mobj->momz;
|
||||
P_SetThingPosition(mobj);
|
||||
P_CheckPosition(mobj, mobj->x, mobj->y);
|
||||
goto animonly;
|
||||
}
|
||||
else if (mobj->player->powers[pw_carry] == CR_MACESPIN)
|
||||
{
|
||||
P_CheckPosition(mobj, mobj->x, mobj->y);
|
||||
goto animonly;
|
||||
}
|
||||
}
|
||||
|
||||
// Needed for gravity boots
|
||||
|
|
@ -6009,8 +6187,8 @@ void P_SetScale(mobj_t *mobj, fixed_t newscale)
|
|||
|
||||
mobj->scale = newscale;
|
||||
|
||||
mobj->radius = FixedMul(mobj->info->radius, newscale);
|
||||
mobj->height = FixedMul(mobj->info->height, newscale);
|
||||
mobj->radius = FixedMul(FixedDiv(mobj->radius, oldscale), newscale);
|
||||
mobj->height = FixedMul(FixedDiv(mobj->height, oldscale), newscale);
|
||||
|
||||
player = mobj->player;
|
||||
|
||||
|
|
@ -6018,7 +6196,6 @@ void P_SetScale(mobj_t *mobj, fixed_t newscale)
|
|||
{
|
||||
G_GhostAddScale(newscale);
|
||||
player->viewheight = FixedMul(FixedDiv(player->viewheight, oldscale), newscale); // Nonono don't calculate viewheight elsewhere, this is the best place for it!
|
||||
player->dashspeed = FixedMul(FixedDiv(player->dashspeed, oldscale), newscale); // Prevents the player from having to re-charge up spindash if the player grew in size
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -6130,7 +6307,7 @@ static boolean P_ShieldLook(mobj_t *thing, shieldtype_t shield)
|
|||
thing->flags |= MF_NOCLIPHEIGHT;
|
||||
thing->eflags = (thing->eflags & ~MFE_VERTICALFLIP)|(thing->target->eflags & MFE_VERTICALFLIP);
|
||||
|
||||
P_SetScale(thing, thing->target->scale);
|
||||
P_SetScale(thing, FixedMul(thing->target->scale, thing->target->player->shieldscale));
|
||||
P_UnsetThingPosition(thing);
|
||||
thing->x = thing->target->x;
|
||||
thing->y = thing->target->y;
|
||||
|
|
@ -6841,7 +7018,22 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
}
|
||||
}
|
||||
else // Apply gravity to fall downwards.
|
||||
P_SetObjectMomZ(mobj, -2*FRACUNIT/3, true);
|
||||
{
|
||||
if (mobj->player && !(mobj->fuse % 8) && (mobj->player->charflags & SF_MACHINE))
|
||||
{
|
||||
fixed_t r = mobj->radius>>FRACBITS;
|
||||
mobj_t *explosion = P_SpawnMobj(
|
||||
mobj->x + (P_RandomRange(r, -r)<<FRACBITS),
|
||||
mobj->y + (P_RandomRange(r, -r)<<FRACBITS),
|
||||
mobj->z + (P_RandomKey(mobj->height>>FRACBITS)<<FRACBITS),
|
||||
MT_BOSSEXPLODE);
|
||||
S_StartSound(explosion, sfx_cybdth);
|
||||
}
|
||||
if (mobj->movedir == DMG_DROWNED)
|
||||
P_SetObjectMomZ(mobj, -FRACUNIT/2, true); // slower fall from drowning
|
||||
else
|
||||
P_SetObjectMomZ(mobj, -2*FRACUNIT/3, true);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
@ -7128,6 +7320,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)
|
||||
|
|
@ -8638,6 +8831,10 @@ void P_SpawnPlayer(INT32 playernum)
|
|||
P_SetScale(mobj, mobj->destscale);
|
||||
P_FlashPal(p, 0, 0); // Resets
|
||||
|
||||
// Set bounds accurately.
|
||||
mobj->radius = FixedMul(skins[p->skin].radius, mobj->scale);
|
||||
mobj->height = P_GetPlayerHeight(p);
|
||||
|
||||
// Spawn with a pity shield if necessary.
|
||||
P_DoPityCheck(p);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,8 +35,12 @@
|
|||
#pragma interface
|
||||
#endif
|
||||
|
||||
/// \brief Frame flags: only the frame number
|
||||
#define FF_FRAMEMASK 0x3fff
|
||||
/// \brief Frame flags: only the frame number - 0 to 511 (Frames from 0 to 63, Sprite2 number uses full range)
|
||||
#define FF_FRAMEMASK 0x1ff
|
||||
/// \brief Frame flags: A change of state at the end of Sprite2 animation
|
||||
#define FF_SPR2ENDSTATE 0x1000
|
||||
/// \brief Frame flags: 50% of starting in middle of animation (Sprite2 and FF_ANIMATE)
|
||||
#define FF_MIDDLESTARTCHANCE 0x2000
|
||||
/// \brief Frame flags: Simple stateless animation
|
||||
#define FF_ANIMATE 0x4000
|
||||
/// \brief Frame flags: frame always appears full bright
|
||||
|
|
|
|||
|
|
@ -147,7 +147,6 @@ static void P_NetArchivePlayers(void)
|
|||
|
||||
WRITEUINT32(save_p, players[i].score);
|
||||
WRITEFIXED(save_p, players[i].dashspeed);
|
||||
WRITEINT32(save_p, players[i].dashtime);
|
||||
WRITESINT8(save_p, players[i].lives);
|
||||
WRITESINT8(save_p, players[i].continues);
|
||||
WRITESINT8(save_p, players[i].xtralife);
|
||||
|
|
@ -260,6 +259,9 @@ static void P_NetArchivePlayers(void)
|
|||
if (flags & AWAYVIEW)
|
||||
WRITEUINT32(save_p, players[i].awayviewmobj->mobjnum);
|
||||
|
||||
WRITEFIXED(save_p, players[i].camerascale);
|
||||
WRITEFIXED(save_p, players[i].shieldscale);
|
||||
|
||||
WRITEUINT8(save_p, players[i].charability);
|
||||
WRITEUINT8(save_p, players[i].charability2);
|
||||
WRITEUINT32(save_p, players[i].charflags);
|
||||
|
|
@ -275,6 +277,8 @@ static void P_NetArchivePlayers(void)
|
|||
WRITEUINT8(save_p, players[i].accelstart);
|
||||
WRITEUINT8(save_p, players[i].acceleration);
|
||||
WRITEFIXED(save_p, players[i].jumpfactor);
|
||||
WRITEFIXED(save_p, players[i].height);
|
||||
WRITEFIXED(save_p, players[i].spinheight);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -323,7 +327,6 @@ static void P_NetUnArchivePlayers(void)
|
|||
|
||||
players[i].score = READUINT32(save_p);
|
||||
players[i].dashspeed = READFIXED(save_p); // dashing speed
|
||||
players[i].dashtime = READINT32(save_p); // dashing speed
|
||||
players[i].lives = READSINT8(save_p);
|
||||
players[i].continues = READSINT8(save_p); // continues that player has acquired
|
||||
players[i].xtralife = READSINT8(save_p); // Ring Extra Life counter
|
||||
|
|
@ -426,6 +429,9 @@ static void P_NetUnArchivePlayers(void)
|
|||
|
||||
players[i].viewheight = cv_viewheight.value<<FRACBITS;
|
||||
|
||||
players[i].camerascale = READFIXED(save_p);
|
||||
players[i].shieldscale = READFIXED(save_p);
|
||||
|
||||
//SetPlayerSkinByNum(i, players[i].skin);
|
||||
players[i].charability = READUINT8(save_p);
|
||||
players[i].charability2 = READUINT8(save_p);
|
||||
|
|
@ -442,6 +448,8 @@ static void P_NetUnArchivePlayers(void)
|
|||
players[i].accelstart = READUINT8(save_p);
|
||||
players[i].acceleration = READUINT8(save_p);
|
||||
players[i].jumpfactor = READFIXED(save_p);
|
||||
players[i].height = READFIXED(save_p);
|
||||
players[i].spinheight = READFIXED(save_p);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
25
src/p_spec.c
25
src/p_spec.c
|
|
@ -3905,7 +3905,7 @@ DoneSection2:
|
|||
mobj_t *mo2;
|
||||
angle_t an;
|
||||
|
||||
if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT)
|
||||
if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ZOOMTUBE)
|
||||
break;
|
||||
|
||||
// Find line #3 tagged to this sector
|
||||
|
|
@ -3960,10 +3960,10 @@ DoneSection2:
|
|||
break; // behind back
|
||||
|
||||
P_SetTarget(&player->mo->tracer, waypoint);
|
||||
player->powers[pw_carry] = CR_ZOOMTUBE;
|
||||
player->speed = speed;
|
||||
player->pflags |= PF_SPINNING;
|
||||
player->pflags &= ~PF_JUMPED;
|
||||
player->pflags &= ~PF_GLIDING;
|
||||
player->pflags &= ~(PF_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
|
||||
player->climbing = 0;
|
||||
|
||||
if (player->mo->state-states != S_PLAY_SPIN)
|
||||
|
|
@ -3984,7 +3984,7 @@ DoneSection2:
|
|||
mobj_t *mo2;
|
||||
angle_t an;
|
||||
|
||||
if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT)
|
||||
if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ZOOMTUBE)
|
||||
break;
|
||||
|
||||
// Find line #3 tagged to this sector
|
||||
|
|
@ -4040,10 +4040,10 @@ DoneSection2:
|
|||
break; // behind back
|
||||
|
||||
P_SetTarget(&player->mo->tracer, waypoint);
|
||||
player->powers[pw_carry] = CR_ZOOMTUBE;
|
||||
player->speed = speed;
|
||||
player->pflags |= PF_SPINNING;
|
||||
player->pflags &= ~PF_JUMPED;
|
||||
player->pflags &= ~PF_GLIDING;
|
||||
player->pflags &= ~(PF_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
|
||||
player->climbing = 0;
|
||||
|
||||
if (player->mo->state-states != S_PLAY_SPIN)
|
||||
|
|
@ -4114,7 +4114,7 @@ DoneSection2:
|
|||
vertex_t v1, v2, resulthigh, resultlow;
|
||||
mobj_t *highest = NULL;
|
||||
|
||||
if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT)
|
||||
if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ROPEHANG)
|
||||
break;
|
||||
|
||||
if (player->mo->momz > 0)
|
||||
|
|
@ -4341,6 +4341,7 @@ DoneSection2:
|
|||
}
|
||||
|
||||
P_SetTarget(&player->mo->tracer, closest);
|
||||
player->powers[pw_carry] = CR_ROPEHANG;
|
||||
|
||||
// Option for static ropes.
|
||||
if (lines[lineindex].flags & ML_NOCLIMB)
|
||||
|
|
@ -4348,13 +4349,9 @@ DoneSection2:
|
|||
else
|
||||
player->speed = speed;
|
||||
|
||||
player->pflags |= PF_ROPEHANG;
|
||||
|
||||
S_StartSound(player->mo, sfx_s3k4a);
|
||||
|
||||
player->pflags &= ~PF_JUMPED;
|
||||
player->pflags &= ~PF_GLIDING;
|
||||
player->pflags &= ~PF_SLIDING;
|
||||
player->pflags &= ~(PF_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
|
||||
player->climbing = 0;
|
||||
P_SetThingPosition(player->mo);
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_RIDE);
|
||||
|
|
@ -7187,7 +7184,7 @@ static inline boolean PIT_PushThing(mobj_t *thing)
|
|||
if (thing->eflags & MFE_PUSHED)
|
||||
return false;
|
||||
|
||||
if (thing->player && thing->player->pflags & PF_ROPEHANG)
|
||||
if (thing->player && thing->player->powers[pw_carry] == CR_ROPEHANG)
|
||||
return false;
|
||||
|
||||
// Allow this to affect pushable objects at some point?
|
||||
|
|
@ -7418,7 +7415,7 @@ void T_Pusher(pusher_t *p)
|
|||
if (thing->eflags & MFE_PUSHED)
|
||||
continue;
|
||||
|
||||
if (thing->player && thing->player->pflags & PF_ROPEHANG)
|
||||
if (thing->player && thing->player->powers[pw_carry] == CR_ROPEHANG)
|
||||
continue;
|
||||
|
||||
if (thing->player && (thing->state == &states[thing->info->painstate]) && (thing->player->powers[pw_flashing] > (flashingtics/4)*3 && thing->player->powers[pw_flashing] <= flashingtics))
|
||||
|
|
|
|||
|
|
@ -160,9 +160,9 @@ boolean P_Teleport(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle
|
|||
INT32 p;
|
||||
// Search for any players you might be carrying, so you can get them off before they end up being taken with you!
|
||||
for (p = 0; p < MAXPLAYERS; p++)
|
||||
if (playeringame[p] && players[p].mo && players[p].pflags & PF_CARRIED && players[p].mo->tracer == thing)
|
||||
if (playeringame[p] && players[p].mo && players[p].powers[pw_carry] == CR_PLAYER && players[p].mo->tracer == thing)
|
||||
{
|
||||
players[p].pflags &= ~PF_CARRIED;
|
||||
players[p].powers[pw_carry] = CR_NONE;
|
||||
break;
|
||||
}
|
||||
thing->player->cmomx = thing->player->cmomy = 0;
|
||||
|
|
|
|||
852
src/p_user.c
852
src/p_user.c
File diff suppressed because it is too large
Load diff
17
src/r_defs.h
17
src/r_defs.h
|
|
@ -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
|
||||
|
|
|
|||
520
src/r_draw.c
520
src/r_draw.c
|
|
@ -135,7 +135,7 @@ static UINT8** translationtablecache[MAXSKINS + 4] = {NULL};
|
|||
|
||||
// See also the enum skincolors_t
|
||||
// TODO Callum: Can this be translated?
|
||||
const char *Color_Names[MAXSKINCOLORS] =
|
||||
const char *Color_Names[MAXSKINCOLORS + NUMSUPERCOLORS] =
|
||||
{
|
||||
"None", // SKINCOLOR_NONE
|
||||
"White", // SKINCOLOR_WHITE
|
||||
|
|
@ -166,9 +166,23 @@ const char *Color_Names[MAXSKINCOLORS] =
|
|||
"Lavender", // SKINCOLOR_LAVENDER
|
||||
"Magenta", // SKINCOLOR_MAGENTA
|
||||
"Pink", // SKINCOLOR_PINK
|
||||
"Rosy" // SKINCOLOR_ROSY
|
||||
"Rosy", // SKINCOLOR_ROSY
|
||||
// Super behaves by different rules (one name per 5 colours), and will be accessed exclusively via R_GetSuperColorByName instead of R_GetColorByName.
|
||||
"Silver", // SKINCOLOR_SUPERSILVER1
|
||||
"Red", // SKINCOLOR_SUPERRED1
|
||||
"Orange", // SKINCOLOR_SUPERORANGE1
|
||||
"Gold", // SKINCOLOR_SUPERGOLD1
|
||||
"Peridot", // SKINCOLOR_SUPERPERIDOT1
|
||||
"Cyan", // SKINCOLOR_SUPERCYAN1
|
||||
"Purple", // SKINCOLOR_SUPERPURPLE1
|
||||
"Rust", // SKINCOLOR_SUPERRUST1
|
||||
"Tan" // SKINCOLOR_SUPERTAN1
|
||||
};
|
||||
|
||||
/*
|
||||
A word of warning: If the following array is non-symmetrical,
|
||||
A_SignPlayer's prefoppositecolor behaviour will break.
|
||||
*/
|
||||
const UINT8 Color_Opposite[MAXSKINCOLORS*2] =
|
||||
{
|
||||
SKINCOLOR_NONE,8, // SKINCOLOR_NONE
|
||||
|
|
@ -183,7 +197,7 @@ const UINT8 Color_Opposite[MAXSKINCOLORS*2] =
|
|||
SKINCOLOR_CYAN,8, // SKINCOLOR_CRIMSON - ditto
|
||||
SKINCOLOR_BLUE,12, // SKINCOLOR_ORANGE
|
||||
SKINCOLOR_TAN,8, // SKINCOLOR_RUST - ditto
|
||||
SKINCOLOR_LAVENDER,8, // SKINCOLOR_GOLD - ditto
|
||||
SKINCOLOR_LAVENDER,8, // SKINCOLOR_GOLD - ditto
|
||||
SKINCOLOR_TEAL,8, // SKINCOLOR_YELLOW - ditto
|
||||
SKINCOLOR_RUST,8, // SKINCOLOR_TAN - ditto
|
||||
SKINCOLOR_MAGENTA,3, // SKINCOLOR_MOSS
|
||||
|
|
@ -196,11 +210,11 @@ const UINT8 Color_Opposite[MAXSKINCOLORS*2] =
|
|||
SKINCOLOR_ORANGE,9, // SKINCOLOR_BLUE
|
||||
SKINCOLOR_PINK,8, // SKINCOLOR_AZURE - ditto
|
||||
SKINCOLOR_EMERALD,8, // SKINCOLOR_PASTEL - ditto
|
||||
SKINCOLOR_PERIDOT,8, // SKINCOLOR_PURPLE - ditto
|
||||
SKINCOLOR_PERIDOT,10, // SKINCOLOR_PURPLE - ditto
|
||||
SKINCOLOR_GOLD,8, // SKINCOLOR_LAVENDER - ditto
|
||||
SKINCOLOR_MOSS,8, // SKINCOLOR_MAGENTA - ditto
|
||||
SKINCOLOR_AZURE,8, // SKINCOLOR_PINK - ditto
|
||||
SKINCOLOR_AQUA,8 // SKINCOLOR_ROSY - ditto
|
||||
SKINCOLOR_AQUA,14 // SKINCOLOR_ROSY - ditto
|
||||
};
|
||||
|
||||
CV_PossibleValue_t Color_cons_t[MAXSKINCOLORS+1];
|
||||
|
|
@ -569,49 +583,186 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
|
|||
break;
|
||||
|
||||
// Super colors, from lightest to darkest!
|
||||
case SKINCOLOR_SUPER1:
|
||||
// Super White
|
||||
|
||||
// Super silvers.
|
||||
case SKINCOLOR_SUPERSILVER1:
|
||||
for (i = 0; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)0;
|
||||
for (; i < 14; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)1;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(i-12);
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERSILVER2:
|
||||
for (i = 0; i < 3; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(i);
|
||||
dest_colormap[starttranscolor + (i++)] = (UINT8)2;
|
||||
for (; i < 8; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)3;
|
||||
for (; i < 14; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)4;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(i-9);
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERSILVER3:
|
||||
dest_colormap[starttranscolor] = (UINT8)1;
|
||||
for (i = 1; i < 3; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)2;
|
||||
for (; i < 6; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)3;
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)4;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(5 + ((i-12)*2));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERSILVER4:
|
||||
dest_colormap[starttranscolor] = (UINT8)2;
|
||||
for (i = 1; i < 3; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)3;
|
||||
for (; i < 9; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)4;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(5 + ((i-9)*2));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERSILVER5:
|
||||
for (i = 0; i < 2; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)3;
|
||||
for (; i < 8; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)4;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(5 + ((i-8)*2));
|
||||
break;
|
||||
|
||||
// Super reds.
|
||||
case SKINCOLOR_SUPERRED1:
|
||||
for (i = 0; i < 10; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)0;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(208 + ((i-10) >> 1));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERRED2:
|
||||
for (i = 0; i < 3; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)0;
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(208 + ((i-3) / 3));
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(32 + ((i-12) >> 1));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERRED3:
|
||||
for (i = 0; i < 2; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)0;
|
||||
for (; i < 8; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(208 + ((i-2) >> 1));
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(32 + ((i-8) >> 1));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERRED4:
|
||||
dest_colormap[starttranscolor] = (UINT8)0;
|
||||
for (i = 1; i < 6; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(208 + (i >> 1));
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(32 + ((i-6) >> 1));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERRED5:
|
||||
dest_colormap[starttranscolor] = (UINT8)208;
|
||||
for (i = 1; i < 4; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(209 + (i >> 1));
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(32 + ((i-4) >> 1));
|
||||
break;
|
||||
|
||||
// Super oranges.
|
||||
case SKINCOLOR_SUPERORANGE1:
|
||||
for (i = 0; i < 10; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)0;
|
||||
dest_colormap[starttranscolor + (i++)] = (UINT8)208;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(48 + (i-11));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERORANGE2:
|
||||
for (i = 0; i < 4; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)0;
|
||||
for (; i < 6; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)208;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(48 + ((i-6) >> 1));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERORANGE3:
|
||||
for (i = 0; i < 2; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)0;
|
||||
for (; i < 4; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)208;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(48 + ((i-4) >> 1));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERORANGE4:
|
||||
dest_colormap[starttranscolor] = (UINT8)0;
|
||||
dest_colormap[starttranscolor + 1] = (UINT8)208;
|
||||
for (i = 2; i < 13; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(48 + (i-2));
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(68 + (i-13));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERORANGE5:
|
||||
dest_colormap[starttranscolor] = (UINT8)208;
|
||||
for (i = 1; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(48 + (i-1));
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(68 + (i-12));
|
||||
break;
|
||||
|
||||
// Super golds.
|
||||
case SKINCOLOR_SUPERGOLD1:
|
||||
for (i = 0; i < 10; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)0; // True white
|
||||
for (; i < 12; i++) // White-yellow fade
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(80);
|
||||
dest_colormap[starttranscolor + i] = (UINT8)80;
|
||||
for (; i < 15; i++) // White-yellow fade
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(81 + (i-12));
|
||||
dest_colormap[starttranscolor + 15] = (UINT8)(72);
|
||||
dest_colormap[starttranscolor + 15] = (UINT8)72;
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPER2:
|
||||
// Super Bright
|
||||
case SKINCOLOR_SUPERGOLD2:
|
||||
dest_colormap[starttranscolor] = (UINT8)(0);
|
||||
for (i = 1; i < 4; i++) // White-yellow fade
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(80 + (i-1));
|
||||
for (; i < 6; i++) // Yellow
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(83);
|
||||
dest_colormap[starttranscolor + i] = (UINT8)83;
|
||||
for (; i < 8; i++) // Yellow
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(72);
|
||||
dest_colormap[starttranscolor + i] = (UINT8)72;
|
||||
for (; i < 14; i++) // Yellow
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(73);
|
||||
dest_colormap[starttranscolor + i] = (UINT8)73;
|
||||
for (; i < 16; i++) // With a fine golden finish! :3
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-14));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPER3:
|
||||
// Super Yellow
|
||||
case SKINCOLOR_SUPERGOLD3:
|
||||
for (i = 0; i < 2; i++) // White-yellow fade
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(81 + i);
|
||||
for (; i < 4; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(83);
|
||||
dest_colormap[starttranscolor + i] = (UINT8)83;
|
||||
for (; i < 6; i++) // Yellow
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(72);
|
||||
dest_colormap[starttranscolor + i] = (UINT8)72;
|
||||
for (; i < 12; i++) // Yellow
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(73);
|
||||
dest_colormap[starttranscolor + i] = (UINT8)73;
|
||||
for (; i < 16; i++) // With a fine golden finish! :3
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-12));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPER4:
|
||||
// "The SSNTails"
|
||||
dest_colormap[starttranscolor] = 83; // Golden shine
|
||||
case SKINCOLOR_SUPERGOLD4: // "The SSNTails"
|
||||
dest_colormap[starttranscolor] = (UINT8)83; // Golden shine
|
||||
for (i = 1; i < 3; i++) // Yellow
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(72);
|
||||
for (; i < 9; i++) // Yellow
|
||||
|
|
@ -620,30 +771,310 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
|
|||
dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-9));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPER5:
|
||||
// Golden Delicious
|
||||
case SKINCOLOR_SUPERGOLD5: // Golden Delicious
|
||||
for (i = 0; i < 2; i++) // Yellow
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(72);
|
||||
for (; i < 8; i++) // Yellow
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(73);
|
||||
for (; i < 15; i++) // With a fine golden finish! :3
|
||||
for (; i < 16; i++) // With a fine golden finish! :3
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-8));
|
||||
dest_colormap[starttranscolor + 15] = (UINT8)63;
|
||||
break;
|
||||
|
||||
// Super Tails and Knuckles, who really should be dummied out by now
|
||||
case SKINCOLOR_TSUPER1:
|
||||
case SKINCOLOR_TSUPER2:
|
||||
case SKINCOLOR_TSUPER3:
|
||||
case SKINCOLOR_TSUPER4:
|
||||
case SKINCOLOR_TSUPER5:
|
||||
case SKINCOLOR_KSUPER1:
|
||||
case SKINCOLOR_KSUPER2:
|
||||
case SKINCOLOR_KSUPER3:
|
||||
case SKINCOLOR_KSUPER4:
|
||||
case SKINCOLOR_KSUPER5:
|
||||
for (i = 0; i < SKIN_RAMP_LENGTH; i++)
|
||||
dest_colormap[starttranscolor + i] = 0xFF;
|
||||
// Super peridots. (nyeheheheh)
|
||||
case SKINCOLOR_SUPERPERIDOT1:
|
||||
for (i = 0; i < 10; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)0;
|
||||
for (; i < 13; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)88;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)188;
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERPERIDOT2:
|
||||
dest_colormap[starttranscolor] = (UINT8)(0);
|
||||
for (i = 1; i < 4; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)88;
|
||||
for (; i < 8; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)188;
|
||||
for (; i < 14; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)189;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)190;
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERPERIDOT3:
|
||||
for (i = 0; i < 2; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)88;
|
||||
for (; i < 6; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)188;
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)189;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(190 + ((i-12) >> 1));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERPERIDOT4:
|
||||
dest_colormap[starttranscolor] = (UINT8)88;
|
||||
for (i = 1; i < 3; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)188;
|
||||
for (; i < 9; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)189;
|
||||
for (; i < 13; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(190 + ((i-9) >> 1));
|
||||
for (; i < 15; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)94;
|
||||
dest_colormap[starttranscolor + i] = (UINT8)95;
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERPERIDOT5:
|
||||
for (i = 0; i < 2; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)188;
|
||||
for (; i < 8; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)189;
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(190 + ((i-8) >> 1));
|
||||
for (; i < 14; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)94;
|
||||
dest_colormap[starttranscolor + (i++)] = (UINT8)95;
|
||||
dest_colormap[starttranscolor + i] = (UINT8)119;
|
||||
break;
|
||||
|
||||
// Super cyans.
|
||||
case SKINCOLOR_SUPERCYAN1:
|
||||
for (i = 0; i < 10; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)0;
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)128;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(129 + (i-12));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERCYAN2:
|
||||
dest_colormap[starttranscolor] = (UINT8)0;
|
||||
for (i = 1; i < 4; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(128 + (i-1));
|
||||
for (; i < 8; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(131 + ((i-4) >> 1));
|
||||
for (; i < 14; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)133;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)134;
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERCYAN3:
|
||||
for (i = 0; i < 2; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(129 + i);
|
||||
for (; i < 6; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(131 + ((i-2) >> 1));
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)133;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(134 + ((i-12) >> 1));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERCYAN4:
|
||||
dest_colormap[starttranscolor] = (UINT8)131;
|
||||
for (i = 1; i < 3; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)132;
|
||||
for (; i < 9; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)133;
|
||||
for (; i < 13; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(134 + ((i-9) >> 1));
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(136 + (i-13));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERCYAN5:
|
||||
for (i = 0; i < 2; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)132;
|
||||
for (; i < 8; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)133;
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(134 + ((i-8) >> 1));
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(136 + (i-12));
|
||||
break;
|
||||
|
||||
// Super purples.
|
||||
case SKINCOLOR_SUPERPURPLE1:
|
||||
for (i = 0; i < 10; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)0;
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)144;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(160 + (i-12));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERPURPLE2:
|
||||
dest_colormap[starttranscolor] = (UINT8)0;
|
||||
dest_colormap[starttranscolor + 1] = (UINT8)144;
|
||||
for (i = 2; i < 4; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(160 + (i-2));
|
||||
for (; i < 8; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(162 + ((i-4) >> 1));
|
||||
for (; i < 14; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)164;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)165;
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERPURPLE3:
|
||||
for (i = 0; i < 2; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(160 + i);
|
||||
for (; i < 6; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(162 + ((i-2) >> 1));
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)164;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(165 + ((i-12) >> 1));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERPURPLE4:
|
||||
dest_colormap[starttranscolor] = (UINT8)162;
|
||||
for (i = 1; i < 3; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)163;
|
||||
for (; i < 9; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)164;
|
||||
for (; i < 13; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(165 + ((i-9) >> 1));
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(167 + (i-13));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERPURPLE5:
|
||||
for (i = 0; i < 2; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)163;
|
||||
for (; i < 8; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)164;
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(165 + ((i-8) >> 1));
|
||||
for (; i < 15; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(167 + (i-12));
|
||||
dest_colormap[starttranscolor + i] = (UINT8)253;
|
||||
break;
|
||||
|
||||
// Super rusts.
|
||||
case SKINCOLOR_SUPERRUST1:
|
||||
for (i = 0; i < 2; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)0;
|
||||
for (; i < 5; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)208;
|
||||
for (; i < 7; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)48;
|
||||
for (; i < 10; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(49 + (i-7));
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(55 + ((i-10)*3));
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(68 + (i-11));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERRUST2:
|
||||
for (i = 0; i < 4; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)48;
|
||||
for (; i < 9; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(49 + (i-4));
|
||||
for (; i < 11; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(56 + ((i-9)*2));
|
||||
for (; i < 15; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(68 + (i-11));
|
||||
dest_colormap[starttranscolor + i] = (UINT8)71;
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERRUST3:
|
||||
dest_colormap[starttranscolor] = (UINT8)49;
|
||||
for (i = 1; i < 3; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)50;
|
||||
for (; i < 5; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(51 + (i-3));
|
||||
for (; i < 8; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(54 + (i-5));
|
||||
dest_colormap[starttranscolor + (i++)] = (UINT8)58;
|
||||
for (; i < 15; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(68 + ((i-7) >> 1));
|
||||
dest_colormap[starttranscolor + i] = (UINT8)46;
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERRUST4:
|
||||
dest_colormap[starttranscolor] = (UINT8)83;
|
||||
dest_colormap[starttranscolor + 1] = (UINT8)72;
|
||||
for (i = 2; i < 6; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-2));
|
||||
for (; i < 14; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(68 + ((i-6) >> 1));
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)46;
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERRUST5:
|
||||
for (i = 0; i < 3; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(64 + i);
|
||||
for (; i < 7; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(67 + ((i-3) >> 1));
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(233 + (i-7));
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(238 + ((i-12) >> 1));
|
||||
break;
|
||||
|
||||
// Super tans.
|
||||
case SKINCOLOR_SUPERTAN1:
|
||||
for (i = 0; i < 10; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)0;
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(80 + ((i-10) >> 1));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERTAN2:
|
||||
dest_colormap[starttranscolor] = (UINT8)0;
|
||||
for (i = 1; i < 7; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(80 + ((i-1) >> 1));
|
||||
dest_colormap[starttranscolor + (i++)] = (UINT8)82;
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)84;
|
||||
for (; i < 15; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(85 + (i-12));
|
||||
dest_colormap[starttranscolor + i] = (UINT8)245;
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERTAN3:
|
||||
dest_colormap[starttranscolor] = (UINT8)80;
|
||||
for (i = 1; i < 5; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(81 + ((i-1) >> 1));
|
||||
dest_colormap[starttranscolor + (i++)] = (UINT8)82;
|
||||
for (; i < 10; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)84;
|
||||
for (; i < 13; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(85 + (i-10));
|
||||
for (; i < 16; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(245 + ((i-13)*2));
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERTAN4:
|
||||
dest_colormap[starttranscolor] = (UINT8)81;
|
||||
for (i = 1; i < 5; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)82;
|
||||
for (; i < 8; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)84;
|
||||
for (; i < 11; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(85 + (i-8));
|
||||
for (; i < 15; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(245 + ((i-11)*2));
|
||||
dest_colormap[starttranscolor + i] = (UINT8)237;
|
||||
break;
|
||||
|
||||
case SKINCOLOR_SUPERTAN5:
|
||||
for (i = 0; i < 2; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)82;
|
||||
for (; i < 5; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)84;
|
||||
for (; i < 8; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(85 + (i-5));
|
||||
for (; i < 12; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(245 + (i-8));
|
||||
for (; i < 15; i++)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(237 + (i-12));
|
||||
dest_colormap[starttranscolor + i] = (UINT8)239;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
@ -727,6 +1158,17 @@ UINT8 R_GetColorByName(const char *name)
|
|||
return 0;
|
||||
}
|
||||
|
||||
UINT8 R_GetSuperColorByName(const char *name)
|
||||
{
|
||||
UINT8 color; /* = (UINT8)atoi(name); -- This isn't relevant to S_SKIN, which is the only way it's accessible right now. Let's simplify things.
|
||||
if (color > MAXSKINCOLORS && color < MAXTRANSLATIONS && !((color - MAXSKINCOLORS) % 5))
|
||||
return color;*/
|
||||
for (color = 0; color < NUMSUPERCOLORS; color++)
|
||||
if (!stricmp(Color_Names[color + MAXSKINCOLORS], name))
|
||||
return ((color*5) + MAXSKINCOLORS);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
// COMMON DRAWER FOR 8 AND 16 BIT COLOR MODES
|
||||
// ==========================================================================
|
||||
|
|
|
|||
|
|
@ -111,6 +111,7 @@ void R_InitTranslationTables(void);
|
|||
UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags);
|
||||
void R_FlushTranslationColormapCache(void);
|
||||
UINT8 R_GetColorByName(const char *name);
|
||||
UINT8 R_GetSuperColorByName(const char *name);
|
||||
|
||||
// Custom player skin translation
|
||||
void R_InitViewBuffer(INT32 width, INT32 height);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
293
src/r_things.c
293
src/r_things.c
|
|
@ -18,6 +18,7 @@
|
|||
#include "st_stuff.h"
|
||||
#include "w_wad.h"
|
||||
#include "z_zone.h"
|
||||
#include "m_menu.h" // character select
|
||||
#include "m_misc.h"
|
||||
#include "i_video.h" // rendermode
|
||||
#include "r_things.h"
|
||||
|
|
@ -28,6 +29,7 @@
|
|||
#include "dehacked.h" // get_number (for thok)
|
||||
#include "d_netfil.h" // blargh. for nameonly().
|
||||
#include "m_cheat.h" // objectplace
|
||||
#include "m_cond.h"
|
||||
#ifdef HWRENDER
|
||||
#include "hardware/hw_md2.h"
|
||||
#endif
|
||||
|
|
@ -100,7 +102,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 +111,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 +238,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,16 +321,23 @@ 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 %.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
|
||||
|
|
@ -1138,22 +1188,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);
|
||||
|
||||
|
|
@ -2286,6 +2343,8 @@ static void Sk_SetDefaultValue(skin_t *skin)
|
|||
|
||||
skin->starttranscolor = 96;
|
||||
skin->prefcolor = SKINCOLOR_GREEN;
|
||||
skin->supercolor = SKINCOLOR_SUPERGOLD1;
|
||||
skin->prefoppositecolor = 0; // use tables
|
||||
|
||||
skin->normalspeed = 36<<FRACBITS;
|
||||
skin->runspeed = 28<<FRACBITS;
|
||||
|
|
@ -2298,7 +2357,14 @@ static void Sk_SetDefaultValue(skin_t *skin)
|
|||
skin->jumpfactor = FRACUNIT;
|
||||
skin->actionspd = 30<<FRACBITS;
|
||||
skin->mindash = 15<<FRACBITS;
|
||||
skin->maxdash = 90<<FRACBITS;
|
||||
skin->maxdash = 70<<FRACBITS;
|
||||
|
||||
skin->radius = mobjinfo[MT_PLAYER].radius;
|
||||
skin->height = mobjinfo[MT_PLAYER].height;
|
||||
skin->spinheight = FixedMul(skin->height, 2*FRACUNIT/3);
|
||||
|
||||
skin->shieldscale = FRACUNIT;
|
||||
skin->camerascale = FRACUNIT;
|
||||
|
||||
skin->thokitem = -1;
|
||||
skin->spinitem = -1;
|
||||
|
|
@ -2306,6 +2372,8 @@ static void Sk_SetDefaultValue(skin_t *skin)
|
|||
|
||||
skin->highresscale = FRACUNIT>>1;
|
||||
|
||||
skin->availability = 0;
|
||||
|
||||
for (i = 0; i < sfx_skinsoundslot0; i++)
|
||||
if (S_sfx[i].skinsound != -1)
|
||||
skin->soundsid[S_sfx[i].skinsound] = i;
|
||||
|
|
@ -2330,6 +2398,19 @@ void R_InitSkins(void)
|
|||
numskins = 0;
|
||||
}
|
||||
|
||||
// returns true if available in circumstances, otherwise nope
|
||||
// warning don't use with an invalid skinnum other than -1 which always returns true
|
||||
boolean R_SkinUnlock(INT32 skinnum)
|
||||
{
|
||||
return ((skinnum == -1) // Simplifies things elsewhere, since there's already plenty of checks for less-than-0...
|
||||
|| (!skins[skinnum].availability)
|
||||
|| (unlockables[skins[skinnum].availability - 1].unlocked)
|
||||
|| (modeattacking) // If you have someone else's run you might as well take a look
|
||||
|| (Playing() && (R_SkinAvailable(mapheaderinfo[gamemap-1]->forcecharacter) == skinnum)) // Force 1.
|
||||
|| (netgame && !(server || adminplayer == consoleplayer) && (cv_forceskin.value == skinnum)) // Force 2.
|
||||
);
|
||||
}
|
||||
|
||||
// returns true if the skin name is found (loaded from pwad)
|
||||
// warning return -1 if not found
|
||||
INT32 R_SkinAvailable(const char *name)
|
||||
|
|
@ -2338,6 +2419,7 @@ INT32 R_SkinAvailable(const char *name)
|
|||
|
||||
for (i = 0; i < numskins; i++)
|
||||
{
|
||||
// search in the skin list
|
||||
if (stricmp(skins[i].name,name)==0)
|
||||
return i;
|
||||
}
|
||||
|
|
@ -2347,17 +2429,13 @@ INT32 R_SkinAvailable(const char *name)
|
|||
// network code calls this when a 'skin change' is received
|
||||
void SetPlayerSkin(INT32 playernum, const char *skinname)
|
||||
{
|
||||
INT32 i;
|
||||
INT32 i = R_SkinAvailable(skinname);
|
||||
player_t *player = &players[playernum];
|
||||
|
||||
for (i = 0; i < numskins; i++)
|
||||
if ((i != -1) && (!P_IsLocalPlayer(player) || R_SkinUnlock(i)))
|
||||
{
|
||||
// search in the skin list
|
||||
if (stricmp(skins[i].name, skinname) == 0)
|
||||
{
|
||||
SetPlayerSkinByNum(playernum, i);
|
||||
return;
|
||||
}
|
||||
SetPlayerSkinByNum(playernum, i);
|
||||
return;
|
||||
}
|
||||
|
||||
if (P_IsLocalPlayer(player))
|
||||
|
|
@ -2374,12 +2452,15 @@ void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum)
|
|||
{
|
||||
player_t *player = &players[playernum];
|
||||
skin_t *skin = &skins[skinnum];
|
||||
UINT8 newcolor = 0;
|
||||
|
||||
if (skinnum >= 0 && skinnum < numskins) // Make sure it exists!
|
||||
if ((skinnum >= 0 && skinnum < numskins) // Make sure it exists!
|
||||
&& (!P_IsLocalPlayer(player) || R_SkinUnlock(skinnum))) // ...but is it allowed? We must always allow external players to change skin. The server should vet that...
|
||||
{
|
||||
player->skin = skinnum;
|
||||
if (player->mo)
|
||||
player->mo->skin = skin;
|
||||
|
||||
player->camerascale = skin->camerascale;
|
||||
player->shieldscale = skin->shieldscale;
|
||||
|
||||
player->charability = (UINT8)skin->ability;
|
||||
player->charability2 = (UINT8)skin->ability2;
|
||||
|
|
@ -2402,21 +2483,35 @@ void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum)
|
|||
|
||||
player->jumpfactor = skin->jumpfactor;
|
||||
|
||||
player->height = skin->height;
|
||||
player->spinheight = skin->spinheight;
|
||||
|
||||
if (!(cv_debug || devparm) && !(netgame || multiplayer || demoplayback))
|
||||
{
|
||||
if (playernum == consoleplayer)
|
||||
CV_StealthSetValue(&cv_playercolor, skin->prefcolor);
|
||||
else if (playernum == secondarydisplayplayer)
|
||||
CV_StealthSetValue(&cv_playercolor2, skin->prefcolor);
|
||||
player->skincolor = skin->prefcolor;
|
||||
if (player->mo)
|
||||
player->mo->color = player->skincolor;
|
||||
player->skincolor = newcolor = skin->prefcolor;
|
||||
}
|
||||
|
||||
if (player->mo)
|
||||
{
|
||||
if ((player->pflags & PF_NIGHTSMODE) && (skin->sprites[SPR2_NGT0].numframes == 0)) // If you don't have a sprite for flying horizontally, use the default NiGHTS skin.
|
||||
{
|
||||
skin = &skins[DEFAULTNIGHTSSKIN];
|
||||
newcolor = ((skin->flags & SF_SUPER) ? skin->supercolor : skin->prefcolor);
|
||||
}
|
||||
player->mo->skin = skin;
|
||||
if (newcolor)
|
||||
player->mo->color = newcolor;
|
||||
P_SetScale(player->mo, player->mo->scale);
|
||||
player->mo->radius = FixedMul(skin->radius, player->mo->scale);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if (skinnum >= 0 && skinnum < numskins)
|
||||
skinnum = 255; // Cheeky emulation.
|
||||
|
||||
if (P_IsLocalPlayer(player))
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Skin %d not found\n"), skinnum);
|
||||
|
|
@ -2511,15 +2606,12 @@ void R_AddSkins(UINT16 wadnum)
|
|||
|
||||
if (!stricmp(stoken, "name"))
|
||||
{
|
||||
// the skin name must uniquely identify a single skin
|
||||
// I'm lazy so if name is already used I leave the 'skin x'
|
||||
// default skin name set in Sk_SetDefaultValue
|
||||
if (R_SkinAvailable(value) == -1)
|
||||
{
|
||||
INT32 skinnum = R_SkinAvailable(value);
|
||||
strlwr(value);
|
||||
if (skinnum == -1)
|
||||
STRBUFCPY(skin->name, value);
|
||||
strlwr(skin->name);
|
||||
}
|
||||
// I'm not lazy, so if the name is already used I make the name 'namex'
|
||||
// the skin name must uniquely identify a single skin
|
||||
// if the name is already used I make the name 'namex'
|
||||
// using the default skin name's number set above
|
||||
else
|
||||
{
|
||||
|
|
@ -2530,11 +2622,9 @@ void R_AddSkins(UINT16 wadnum)
|
|||
"%s%d", value, numskins);
|
||||
value2[stringspace - 1] = '\0';
|
||||
if (R_SkinAvailable(value2) == -1)
|
||||
{
|
||||
STRBUFCPY(skin->name,
|
||||
value2);
|
||||
strlwr(skin->name);
|
||||
}
|
||||
// I'm lazy so if NEW name is already used I leave the 'skin x'
|
||||
// default skin name set in Sk_SetDefaultValue
|
||||
STRBUFCPY(skin->name, value2);
|
||||
Z_Free(value2);
|
||||
}
|
||||
|
||||
|
|
@ -2602,13 +2692,18 @@ void R_AddSkins(UINT16 wadnum)
|
|||
FULLPROCESS(revitem)
|
||||
#undef FULLPROCESS
|
||||
|
||||
#define GETSPEED(field) else if (!stricmp(stoken, #field)) skin->field = atoi(value)<<FRACBITS;
|
||||
GETSPEED(normalspeed)
|
||||
GETSPEED(runspeed)
|
||||
GETSPEED(mindash)
|
||||
GETSPEED(maxdash)
|
||||
GETSPEED(actionspd)
|
||||
#undef GETSPEED
|
||||
#define GETFRACBITS(field) else if (!stricmp(stoken, #field)) skin->field = atoi(value)<<FRACBITS;
|
||||
GETFRACBITS(normalspeed)
|
||||
GETFRACBITS(runspeed)
|
||||
|
||||
GETFRACBITS(mindash)
|
||||
GETFRACBITS(maxdash)
|
||||
GETFRACBITS(actionspd)
|
||||
|
||||
GETFRACBITS(radius)
|
||||
GETFRACBITS(height)
|
||||
GETFRACBITS(spinheight)
|
||||
#undef GETFRACBITS
|
||||
|
||||
#define GETINT(field) else if (!stricmp(stoken, #field)) skin->field = atoi(value);
|
||||
GETINT(thrustfactor)
|
||||
|
|
@ -2616,20 +2711,75 @@ void R_AddSkins(UINT16 wadnum)
|
|||
GETINT(acceleration)
|
||||
#undef GETINT
|
||||
|
||||
else if (!stricmp(stoken, "availability"))
|
||||
{
|
||||
skin->availability = atoi(value);
|
||||
if (skin->availability >= MAXUNLOCKABLES)
|
||||
skin->availability = 0;
|
||||
if (skin->availability)
|
||||
STRBUFCPY(unlockables[skin->availability - 1].name, skin->realname);
|
||||
}
|
||||
|
||||
// custom translation table
|
||||
else if (!stricmp(stoken, "startcolor"))
|
||||
skin->starttranscolor = atoi(value);
|
||||
|
||||
else if (!stricmp(stoken, "prefcolor"))
|
||||
skin->prefcolor = R_GetColorByName(value);
|
||||
else if (!stricmp(stoken, "jumpfactor"))
|
||||
skin->jumpfactor = FLOAT_TO_FIXED(atof(value));
|
||||
else if (!stricmp(stoken, "highresscale"))
|
||||
skin->highresscale = FLOAT_TO_FIXED(atof(value));
|
||||
else
|
||||
#define GETSKINCOLOR(field) else if (!stricmp(stoken, #field)) skin->field = R_GetColorByName(value);
|
||||
GETSKINCOLOR(prefcolor)
|
||||
GETSKINCOLOR(prefoppositecolor)
|
||||
#undef GETSKINCOLOR
|
||||
else if (!stricmp(stoken, "supercolor"))
|
||||
skin->supercolor = R_GetSuperColorByName(value);
|
||||
|
||||
#define GETFLOAT(field) else if (!stricmp(stoken, #field)) skin->field = FLOAT_TO_FIXED(atof(value));
|
||||
GETFLOAT(jumpfactor)
|
||||
GETFLOAT(highresscale)
|
||||
GETFLOAT(shieldscale)
|
||||
GETFLOAT(camerascale)
|
||||
#undef GETFLOAT
|
||||
|
||||
#define GETFLAG(field) else if (!stricmp(stoken, #field)) { \
|
||||
strupr(value); \
|
||||
if (atoi(value) || value[0] == 'T' || value[0] == 'Y') \
|
||||
skin->flags |= (SF_##field); \
|
||||
else \
|
||||
skin->flags &= ~(SF_##field); \
|
||||
}
|
||||
// parameters for individual character flags
|
||||
// these are uppercase so they can be concatenated with SF_
|
||||
// 1, true, yes are all valid values
|
||||
GETFLAG(SUPER)
|
||||
GETFLAG(SUPERANIMS)
|
||||
GETFLAG(SUPERSPIN)
|
||||
GETFLAG(HIRES)
|
||||
GETFLAG(NOSKID)
|
||||
GETFLAG(NOSPEEDADJUST)
|
||||
GETFLAG(RUNONWATER)
|
||||
GETFLAG(NOJUMPSPIN)
|
||||
GETFLAG(NOJUMPDAMAGE)
|
||||
GETFLAG(STOMPDAMAGE)
|
||||
GETFLAG(MARIODAMAGE)
|
||||
GETFLAG(MACHINE)
|
||||
#undef GETFLAG
|
||||
|
||||
else // let's check if it's a sound, otherwise error out
|
||||
{
|
||||
INT32 found = false;
|
||||
boolean found = false;
|
||||
sfxenum_t i;
|
||||
size_t stokenadjust;
|
||||
|
||||
// Remove the prefix. (We need to affect an adjusting variable so that we can print error messages if it's not actually a sound.)
|
||||
if ((stoken[0] == 'D' || stoken[0] == 'd') && (stoken[1] == 'S' || stoken[1] == 's')) // DS*
|
||||
stokenadjust = 2;
|
||||
else // sfx_*
|
||||
stokenadjust = 4;
|
||||
|
||||
// Remove the prefix. (We can affect this directly since we're not going to use it again.)
|
||||
if ((value[0] == 'D' || value[0] == 'd') && (value[1] == 'S' || value[1] == 's')) // DS*
|
||||
value += 2;
|
||||
else // sfx_*
|
||||
value += 4;
|
||||
|
||||
// copy name of sounds that are remapped
|
||||
// for this skin
|
||||
for (i = 0; i < sfx_skinsoundslot0; i++)
|
||||
|
|
@ -2638,15 +2788,15 @@ void R_AddSkins(UINT16 wadnum)
|
|||
continue;
|
||||
if (S_sfx[i].skinsound != -1
|
||||
&& !stricmp(S_sfx[i].name,
|
||||
stoken + 2))
|
||||
stoken + stokenadjust))
|
||||
{
|
||||
skin->soundsid[S_sfx[i].skinsound] =
|
||||
S_AddSoundFx(value+2, S_sfx[i].singularity, S_sfx[i].pitch, true);
|
||||
S_AddSoundFx(value, S_sfx[i].singularity, S_sfx[i].pitch, true);
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
CONS_Debug(DBG_SETUP, "R_AddSkins: Unknown keyword '%s' in S_SKIN lump# %d (WAD %s)\n", stoken, lump, wadfiles[wadnum]->filename);
|
||||
CONS_Debug(DBG_SETUP, "R_AddSkins: Unknown keyword '%s' in S_SKIN lump #%d (WAD %s)\n", stoken, lump, wadfiles[wadnum]->filename);
|
||||
}
|
||||
next_token:
|
||||
stoken = strtok(NULL, "\r\n= ");
|
||||
|
|
@ -2673,7 +2823,8 @@ next_token:
|
|||
|
||||
R_FlushTranslationColormapCache();
|
||||
|
||||
CONS_Printf(M_GetText("Added skin '%s'\n"), skin->name);
|
||||
if (!skin->availability) // Safe to print...
|
||||
CONS_Printf(M_GetText("Added skin '%s'\n"), skin->name);
|
||||
#ifdef SKINVALUES
|
||||
skin_cons_t[numskins].value = numskins;
|
||||
skin_cons_t[numskins].strvalue = skin->name;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -25,6 +29,8 @@
|
|||
#define VISSPRITESPERCHUNK (1 << VISSPRITECHUNKBITS)
|
||||
#define VISSPRITEINDEXMASK (VISSPRITESPERCHUNK - 1)
|
||||
|
||||
#define DEFAULTNIGHTSSKIN 0
|
||||
|
||||
// Constant arrays used for psprite clipping
|
||||
// and initializing clipping.
|
||||
extern INT16 negonearray[MAXVIDWIDTH];
|
||||
|
|
@ -93,15 +99,27 @@ typedef struct
|
|||
|
||||
fixed_t jumpfactor; // multiple of standard jump height
|
||||
|
||||
fixed_t radius; // Bounding box changes.
|
||||
fixed_t height;
|
||||
fixed_t spinheight;
|
||||
|
||||
fixed_t shieldscale; // no change to bounding box, but helps set the shield's sprite size
|
||||
fixed_t camerascale;
|
||||
|
||||
// Definable color translation table
|
||||
UINT8 starttranscolor;
|
||||
UINT8 prefcolor;
|
||||
UINT8 supercolor;
|
||||
UINT8 prefoppositecolor; // if 0 use tables instead
|
||||
|
||||
fixed_t highresscale; // scale of highres, default is 0.5
|
||||
|
||||
// specific sounds per skin
|
||||
sfxenum_t soundsid[NUMSKINSOUNDS]; // sound # in S_sfx table
|
||||
|
||||
spritedef_t sprites[NUMPLAYERSPRITES];
|
||||
|
||||
UINT8 availability; // lock?
|
||||
} skin_t;
|
||||
|
||||
// -----------
|
||||
|
|
@ -184,6 +202,7 @@ extern skin_t skins[MAXSKINS + 1];
|
|||
|
||||
void SetPlayerSkin(INT32 playernum,const char *skinname);
|
||||
void SetPlayerSkinByNum(INT32 playernum,INT32 skinnum); // Tails 03-16-2002
|
||||
boolean R_SkinUnlock(INT32 skinnum);
|
||||
INT32 R_SkinAvailable(const char *name);
|
||||
void R_AddSkins(UINT16 wadnum);
|
||||
|
||||
|
|
@ -230,4 +249,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__
|
||||
|
|
|
|||
|
|
@ -565,7 +565,7 @@ static void ST_drawDebugInfo(void)
|
|||
{
|
||||
V_DrawRightAlignedString(320, height - 104, V_MONOSPACE, va("SHIELD: %5x", stplyr->powers[pw_shield]));
|
||||
V_DrawRightAlignedString(320, height - 96, V_MONOSPACE, va("SCALE: %5d%%", (stplyr->mo->scale*100)/FRACUNIT));
|
||||
V_DrawRightAlignedString(320, height - 88, V_MONOSPACE, va("DASH: %3d/%3d", stplyr->dashspeed>>FRACBITS, FixedMul(stplyr->maxdash,stplyr->mo->scale)>>FRACBITS));
|
||||
V_DrawRightAlignedString(320, height - 88, V_MONOSPACE, va("DASH: %3d/%3d", stplyr->dashspeed>>FRACBITS, stplyr->maxdash>>FRACBITS));
|
||||
V_DrawRightAlignedString(320, height - 80, V_MONOSPACE, va("AIR: %4d, %3d", stplyr->powers[pw_underwater], stplyr->powers[pw_spacetime]));
|
||||
|
||||
// Flags
|
||||
|
|
@ -890,11 +890,19 @@ static void ST_drawFirstPersonHUD(void)
|
|||
V_NOSCALESTART|V_OFFSET|V_TRANSLUCENT, p);
|
||||
}
|
||||
|
||||
// [21:42] <+Rob> Beige - Lavender - Steel Blue - Peach - Orange - Purple - Silver - Yellow - Pink - Red - Blue - Green - Cyan - Gold
|
||||
static skincolors_t linkColor[14] =
|
||||
// 2.0-1: [21:42] <+Rob> Beige - Lavender - Steel Blue - Peach - Orange - Purple - Silver - Yellow - Pink - Red - Blue - Green - Cyan - Gold
|
||||
/*#define NUMLINKCOLORS 14
|
||||
static skincolors_t linkColor[NUMLINKCOLORS] =
|
||||
{SKINCOLOR_BEIGE, SKINCOLOR_LAVENDER, SKINCOLOR_AZURE, SKINCOLOR_PEACH, SKINCOLOR_ORANGE,
|
||||
SKINCOLOR_MAGENTA, SKINCOLOR_SILVER, SKINCOLOR_SUPER4, SKINCOLOR_PINK, SKINCOLOR_RED,
|
||||
SKINCOLOR_BLUE, SKINCOLOR_GREEN, SKINCOLOR_CYAN, SKINCOLOR_GOLD};
|
||||
SKINCOLOR_MAGENTA, SKINCOLOR_SILVER, SKINCOLOR_SUPERGOLD4, SKINCOLOR_PINK, SKINCOLOR_RED,
|
||||
SKINCOLOR_BLUE, SKINCOLOR_GREEN, SKINCOLOR_CYAN, SKINCOLOR_GOLD};*/
|
||||
|
||||
// 2.2+: (unix time 1470866042) <Rob> Emerald, Aqua, Cyan, Blue, Pastel, Purple, Magenta, Rosy, Red, Orange, Gold, Yellow, Peridot
|
||||
#define NUMLINKCOLORS 13
|
||||
static skincolors_t linkColor[NUMLINKCOLORS] =
|
||||
{SKINCOLOR_EMERALD, SKINCOLOR_AQUA, SKINCOLOR_CYAN, SKINCOLOR_BLUE, SKINCOLOR_PASTEL,
|
||||
SKINCOLOR_PURPLE, SKINCOLOR_MAGENTA, SKINCOLOR_ROSY, SKINCOLOR_RED, SKINCOLOR_ORANGE,
|
||||
SKINCOLOR_GOLD, SKINCOLOR_YELLOW, SKINCOLOR_PERIDOT};
|
||||
|
||||
static void ST_drawNightsRecords(void)
|
||||
{
|
||||
|
|
@ -974,7 +982,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;
|
||||
|
||||
|
|
@ -994,7 +1002,7 @@ static void ST_drawNiGHTSHUD(void)
|
|||
#endif
|
||||
stplyr->linkcount > minlink)
|
||||
{
|
||||
skincolors_t colornum = linkColor[((stplyr->linkcount-1) / 5) % (sizeof(linkColor) / sizeof(skincolors_t))];
|
||||
skincolors_t colornum = linkColor[((stplyr->linkcount-1) / 5) % NUMLINKCOLORS];
|
||||
if (stplyr->powers[pw_nights_linkfreeze])
|
||||
colornum = SKINCOLOR_WHITE;
|
||||
|
||||
|
|
@ -1299,7 +1307,7 @@ static void ST_drawNiGHTSHUD(void)
|
|||
nightsnum, SKINCOLOR_RED);
|
||||
else
|
||||
ST_DrawNightsOverlayNum(160 + numbersize, STRINGY(12), SPLITFLAGS(V_SNAPTOTOP), realnightstime,
|
||||
nightsnum, SKINCOLOR_SUPER4);
|
||||
nightsnum, SKINCOLOR_SUPERGOLD4);
|
||||
|
||||
// Show exact time in debug
|
||||
if (cv_debug & DBG_NIGHTSBASIC)
|
||||
|
|
@ -1385,6 +1393,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 +1420,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 +1457,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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue