mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-17 23:21:22 +00:00
Merge branch 'master' of http://git.magicalgirl.moe/STJr/SRB2Internal.git into flat_sprites
# Conflicts: # src/dehacked.c # src/p_inter.c # src/p_pspr.h
This commit is contained in:
commit
c70661186a
46 changed files with 2759 additions and 1716 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
|
||||
|
||||
[![Build status](https://ci.appveyor.com/api/projects/status/399d4hcw9yy7hg2y?svg=true)](https://ci.appveyor.com/project/STJr/srb2)
|
||||
[![Build status](https://travis-ci.org/STJr/SRB2.svg?branch=master)](https://travis-ci.org/STJr/SRB2)
|
||||
|
||||
[Sonic Robo Blast 2](https://srb2.org/) is a 3D Sonic the Hedgehog fangame based on a modified version of [Doom Legacy](http://doomlegacy.sourceforge.net/).
|
||||
|
||||
## Dependencies
|
||||
- NASM (x86 builds only)
|
||||
- SDL2 (Linux/OS X only)
|
||||
- SDL2-Mixer (Linux/OS X only)
|
||||
- libupnp (Linux/OS X only)
|
||||
- libgme (Linux/OS X only)
|
||||
|
||||
Warning: 64-bit builds are not netgame compatible with 32-bit builds. Use at your own risk.
|
||||
|
||||
## Compiling
|
||||
|
||||
See [SRB2 Wiki/Source code compiling](http://wiki.srb2.org/wiki/Source_code_compiling)
|
||||
|
||||
## Disclaimer
|
||||
Sonic Team Junior is in no way affiliated with SEGA or Sonic Team. We do not claim ownership of any of SEGA's intellectual property used in SRB2.
|
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
|
||||
|
@ -6811,21 +6753,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",
|
||||
|
@ -6902,24 +6832,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[] = {
|
||||
|
@ -6927,6 +6894,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!
|
||||
|
@ -7048,6 +7016,8 @@ struct {
|
|||
{"FF_FRAMEMASK",FF_FRAMEMASK},
|
||||
{"FF_VERTICALFLIP",FF_VERTICALFLIP},
|
||||
{"FF_PAPERSPRITE",FF_PAPERSPRITE},
|
||||
{"FF_SPR2ENDSTATE",FF_SPR2ENDSTATE},
|
||||
{"FF_MIDDLESTARTCHANCE",FF_MIDDLESTARTCHANCE},
|
||||
{"FF_ANIMATE",FF_ANIMATE},
|
||||
{"FF_FULLBRIGHT",FF_FULLBRIGHT},
|
||||
{"FF_TRANSMASK",FF_TRANSMASK},
|
||||
|
@ -7162,6 +7132,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},
|
||||
|
@ -7179,6 +7157,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
|
||||
|
@ -7197,10 +7180,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},
|
||||
|
@ -7250,9 +7235,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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -3949,6 +3949,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;
|
||||
|
@ -3959,15 +3960,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
|
||||
}
|
||||
|
||||
|
@ -5407,8 +5428,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;
|
||||
|
@ -5445,8 +5466,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;
|
||||
|
@ -5471,12 +5492,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;
|
||||
|
@ -5488,8 +5507,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
|
||||
|
@ -5523,7 +5543,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;
|
||||
|
||||
|
@ -5575,9 +5595,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++;
|
||||
|
@ -6144,7 +6163,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);
|
||||
|
@ -8018,7 +8037,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]))
|
||||
{
|
||||
|
@ -8037,14 +8056,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->flags2 & MF2_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);
|
||||
|
@ -728,7 +731,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)
|
||||
|
@ -771,7 +774,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
|
||||
|
@ -790,7 +793,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
|
||||
}
|
||||
|
@ -991,7 +994,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)
|
||||
|
@ -1043,7 +1047,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;;
|
||||
|
@ -1065,7 +1075,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
|
||||
|
@ -1286,7 +1303,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)
|
||||
|
@ -1404,7 +1421,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);
|
||||
|
@ -2103,8 +2120,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.
|
||||
|
@ -2714,7 +2735,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
|
||||
|
@ -2790,7 +2811,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 *));
|
||||
|
|
468
src/p_mobj.c
468
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,15 +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, mobj->scale);
|
||||
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, mobj->scale);
|
||||
if (player->panim == PA_FALL)
|
||||
{
|
||||
speed = FixedDiv(abs(mobj->momz), mobj->scale);
|
||||
if (speed < 10<<FRACBITS)
|
||||
|
@ -311,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, mobj->scale);
|
||||
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)
|
||||
|
@ -361,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;
|
||||
|
@ -376,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
|
||||
|
@ -408,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:
|
||||
|
@ -424,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;
|
||||
|
@ -442,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;
|
||||
|
@ -451,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.
|
||||
|
@ -540,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
|
||||
|
@ -559,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.
|
||||
|
@ -1465,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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1505,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
|
||||
{
|
||||
|
@ -1534,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.
|
||||
{
|
||||
|
@ -1583,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;
|
||||
|
@ -1740,6 +1906,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)
|
||||
{
|
||||
|
@ -1752,37 +1919,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;
|
||||
}
|
||||
|
||||
|
@ -1837,8 +2006,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)
|
||||
{
|
||||
|
@ -1895,9 +2062,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);
|
||||
}
|
||||
|
@ -2002,7 +2169,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;;
|
||||
|
@ -2562,6 +2729,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))
|
||||
{
|
||||
|
@ -2976,12 +3149,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);
|
||||
|
@ -2992,7 +3170,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);
|
||||
|
@ -3010,8 +3188,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;
|
||||
|
@ -3274,7 +3451,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))
|
||||
|
@ -3293,10 +3470,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;
|
||||
|
@ -3325,14 +3503,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;
|
||||
}
|
||||
|
||||
|
@ -3341,16 +3519,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))
|
||||
|
@ -3358,6 +3536,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)
|
||||
{
|
||||
|
@ -3390,10 +3572,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
|
||||
|
@ -3401,10 +3579,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.
|
||||
|
@ -3416,8 +3592,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;
|
||||
|
@ -3450,8 +3626,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
|
||||
|
@ -3556,10 +3732,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;
|
||||
|
@ -3568,7 +3744,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;
|
||||
|
@ -3821,20 +3997,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
|
||||
|
@ -6002,8 +6181,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;
|
||||
|
||||
|
@ -6011,7 +6190,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
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6123,7 +6301,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;
|
||||
|
@ -6834,7 +7012,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:
|
||||
|
@ -7121,6 +7314,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)
|
||||
|
@ -8627,6 +8821,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,12 +35,16 @@
|
|||
#pragma interface
|
||||
#endif
|
||||
|
||||
/// \brief Frame flags: only the frame number
|
||||
/// \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: Flip sprite vertically (relative to what it should be for its gravity)
|
||||
#define FF_VERTICALFLIP 0x400
|
||||
/// \brief Frame flags: Thin, paper-like sprite (for collision equivalent, see MF_PAPERCOLLISION)
|
||||
#define FF_PAPERSPRITE 0x800
|
||||
/// \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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
24
src/p_spec.c
24
src/p_spec.c
|
@ -3889,7 +3889,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
|
||||
|
@ -3938,10 +3938,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)
|
||||
|
@ -3962,7 +3962,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
|
||||
|
@ -4012,9 +4012,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_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
|
||||
|
||||
if (player->mo->state-states != S_PLAY_SPIN)
|
||||
{
|
||||
|
@ -4084,7 +4085,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)
|
||||
|
@ -4305,6 +4306,7 @@ DoneSection2:
|
|||
}
|
||||
|
||||
P_SetTarget(&player->mo->tracer, closest);
|
||||
player->powers[pw_carry] = CR_ROPEHANG;
|
||||
|
||||
// Option for static ropes.
|
||||
if (lines[lineindex].flags & ML_NOCLIMB)
|
||||
|
@ -4312,13 +4314,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);
|
||||
|
@ -7165,7 +7163,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?
|
||||
|
@ -7398,7 +7396,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
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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
190
src/r_things.c
190
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
|
||||
|
@ -2456,6 +2458,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;
|
||||
|
@ -2468,7 +2472,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;
|
||||
|
@ -2476,6 +2487,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;
|
||||
|
@ -2500,6 +2513,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)
|
||||
|
@ -2508,6 +2534,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;
|
||||
}
|
||||
|
@ -2517,17 +2544,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))
|
||||
|
@ -2544,12 +2567,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;
|
||||
|
@ -2572,21 +2598,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);
|
||||
|
@ -2681,15 +2721,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
|
||||
{
|
||||
|
@ -2700,11 +2737,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);
|
||||
}
|
||||
|
||||
|
@ -2772,13 +2807,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)
|
||||
|
@ -2786,20 +2826,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++)
|
||||
|
@ -2808,15 +2903,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= ");
|
||||
|
@ -2843,7 +2938,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;
|
||||
|
|
|
@ -29,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];
|
||||
|
@ -97,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;
|
||||
|
||||
// -----------
|
||||
|
@ -189,6 +203,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);
|
||||
|
||||
|
|
|
@ -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…
Reference in a new issue