mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-18 07:22:28 +00:00
Merge branch 'master' of http://git.magicalgirl.moe/STJr/SRB2Internal.git into titlemap
# Conflicts: # src/r_main.c
This commit is contained in:
commit
dd57e47574
110 changed files with 6453 additions and 3506 deletions
63
.circleci/config.yml
Normal file
63
.circleci/config.yml
Normal file
|
@ -0,0 +1,63 @@
|
|||
version: 2
|
||||
jobs:
|
||||
build:
|
||||
working_directory: /root/SRB2
|
||||
docker:
|
||||
- image: debian:jessie
|
||||
environment:
|
||||
CC: ccache gcc -m32
|
||||
PKG_CONFIG_LIBDIR: /usr/lib/i386-linux-gnu/pkgconfig
|
||||
LIBGME_CFLAGS: -I/usr/include
|
||||
LIBGME_LDFLAGS: -lgme
|
||||
CCACHE_COMPRESS: true
|
||||
WFLAGS: -Wno-unsuffixed-float-constants
|
||||
GCC49: true
|
||||
#- image: ubuntu:trusty
|
||||
# environment:
|
||||
# CC: ccache gcc -m32
|
||||
# PKG_CONFIG_LIBDIR: /usr/lib/i386-linux-gnu/pkgconfig
|
||||
# LIBGME_CFLAGS: -I/usr/include
|
||||
# LIBGME_LDFLAGS: -lgme
|
||||
# CCACHE_COMPRESS: true
|
||||
# WFLAGS: -Wno-unsuffixed-float-constants
|
||||
# GCC48: true
|
||||
steps:
|
||||
- run:
|
||||
name: Add i386 arch
|
||||
command: dpkg --add-architecture i386
|
||||
- run:
|
||||
name: Update APT listing
|
||||
command: apt-get -qq update
|
||||
- run:
|
||||
name: Support S3 upload
|
||||
command: apt-get -qq -y install ca-certificates
|
||||
- restore_cache:
|
||||
keys:
|
||||
- v1-SRB2-APT
|
||||
- run:
|
||||
name: Install SDK
|
||||
command: apt-get -qq -y install git build-essential nasm libpng12-dev:i386 libsdl2-mixer-dev:i386 libgme-dev:i386 gettext ccache wget gcc-multilib upx
|
||||
- save_cache:
|
||||
key: v1-SRB2-APT
|
||||
paths:
|
||||
- /var/cache/apt/archives
|
||||
- checkout
|
||||
- run:
|
||||
name: Clean build
|
||||
command: make -C src LINUX=1 clean
|
||||
- restore_cache:
|
||||
keys:
|
||||
- v1-SRB2-{{ .Branch }}-{{ checksum "objs/Linux/SDL/Release/depend.dep" }}
|
||||
- run:
|
||||
name: Compile
|
||||
command: make -C src LINUX=1 ERRORMODE=1 -k
|
||||
- store_artifacts:
|
||||
path: /root/SRB2/bin/Linux/Release/
|
||||
destination: bin
|
||||
- save_cache:
|
||||
key: v1-SRB2-{{ .Branch }}-{{ checksum "objs/Linux/SDL/Release/depend.dep" }}
|
||||
paths:
|
||||
- /root/.ccache
|
||||
|
||||
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
[![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)
|
||||
[![CircleCI](https://circleci.com/gh/STJr/SRB2/tree/master.svg?style=svg)](https://circleci.com/gh/STJr/SRB2/tree/master)
|
||||
|
||||
[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/).
|
||||
|
||||
|
|
6
bin/Mingw/Debug/.gitignore
vendored
6
bin/Mingw/Debug/.gitignore
vendored
|
@ -1,3 +1,3 @@
|
|||
/srb2sdl.exe
|
||||
/srb2win.exe
|
||||
/r_opengl.dll
|
||||
*.exe
|
||||
*.mo
|
||||
r_opengl.dll
|
||||
|
|
6
bin/Mingw/Release/.gitignore
vendored
6
bin/Mingw/Release/.gitignore
vendored
|
@ -1,3 +1,3 @@
|
|||
/srb2sdl.exe
|
||||
/srb2win.exe
|
||||
/r_opengl.dll
|
||||
*.exe
|
||||
*.mo
|
||||
r_opengl.dll
|
||||
|
|
8
objs/.gitignore
vendored
Normal file
8
objs/.gitignore
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
#All folders
|
||||
SRB2.res
|
||||
depend.dep
|
||||
depend.ped
|
||||
*.o
|
||||
#VC9 folder only
|
||||
/VC9/Win32
|
||||
/VC9/x64
|
3
objs/DC/SDL/Debug/.gitignore
vendored
3
objs/DC/SDL/Debug/.gitignore
vendored
|
@ -1 +1,2 @@
|
|||
/depend.dep
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
3
objs/DC/SDL/Release/.gitignore
vendored
3
objs/DC/SDL/Release/.gitignore
vendored
|
@ -1 +1,2 @@
|
|||
/depend.dep
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
4
objs/Linux/SDL/Debug/.gitignore
vendored
4
objs/Linux/SDL/Debug/.gitignore
vendored
|
@ -1,2 +1,2 @@
|
|||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
4
objs/Linux/SDL/Release/.gitignore
vendored
4
objs/Linux/SDL/Release/.gitignore
vendored
|
@ -1,2 +1,2 @@
|
|||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
4
objs/Linux64/SDL/Debug/.gitignore
vendored
4
objs/Linux64/SDL/Debug/.gitignore
vendored
|
@ -1,2 +1,2 @@
|
|||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
4
objs/Linux64/SDL/Release/.gitignore
vendored
4
objs/Linux64/SDL/Release/.gitignore
vendored
|
@ -1,2 +1,2 @@
|
|||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
5
objs/Mingw/Debug/.gitignore
vendored
5
objs/Mingw/Debug/.gitignore
vendored
|
@ -1,3 +1,2 @@
|
|||
/SRB2.res
|
||||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
5
objs/Mingw/Release/.gitignore
vendored
5
objs/Mingw/Release/.gitignore
vendored
|
@ -1,3 +1,2 @@
|
|||
/SRB2.res
|
||||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
5
objs/Mingw/SDL/Debug/.gitignore
vendored
5
objs/Mingw/SDL/Debug/.gitignore
vendored
|
@ -1,3 +1,2 @@
|
|||
/SRB2.res
|
||||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
5
objs/Mingw/SDL/Release/.gitignore
vendored
5
objs/Mingw/SDL/Release/.gitignore
vendored
|
@ -1,3 +1,2 @@
|
|||
/SRB2.res
|
||||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
5
objs/Mingw64/Debug/.gitignore
vendored
5
objs/Mingw64/Debug/.gitignore
vendored
|
@ -1,3 +1,2 @@
|
|||
/SRB2.res
|
||||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
5
objs/Mingw64/Release/.gitignore
vendored
5
objs/Mingw64/Release/.gitignore
vendored
|
@ -1,3 +1,2 @@
|
|||
/SRB2.res
|
||||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
5
objs/Mingw64/SDL/Debug/.gitignore
vendored
5
objs/Mingw64/SDL/Debug/.gitignore
vendored
|
@ -1,3 +1,2 @@
|
|||
/SRB2.res
|
||||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
5
objs/Mingw64/SDL/Release/.gitignore
vendored
5
objs/Mingw64/SDL/Release/.gitignore
vendored
|
@ -1,3 +1,2 @@
|
|||
/SRB2.res
|
||||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
4
objs/PS3/SDL/Debug/.gitignore
vendored
4
objs/PS3/SDL/Debug/.gitignore
vendored
|
@ -1,2 +1,2 @@
|
|||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
4
objs/PS3/SDL/Release/.gitignore
vendored
4
objs/PS3/SDL/Release/.gitignore
vendored
|
@ -1,2 +1,2 @@
|
|||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
3
objs/PSP/SDL/Release/.gitignore
vendored
3
objs/PSP/SDL/Release/.gitignore
vendored
|
@ -1 +1,2 @@
|
|||
/depend.dep
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
3
objs/SDL/Release/.gitignore
vendored
3
objs/SDL/Release/.gitignore
vendored
|
@ -1 +1,2 @@
|
|||
/depend.ped
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
2
objs/VC/.gitignore
vendored
2
objs/VC/.gitignore
vendored
|
@ -0,0 +1,2 @@
|
|||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
4
objs/VC9/.gitignore
vendored
4
objs/VC9/.gitignore
vendored
|
@ -1,2 +1,2 @@
|
|||
/Win32
|
||||
/x64
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
4
objs/Wii/SDL/Debug/.gitignore
vendored
4
objs/Wii/SDL/Debug/.gitignore
vendored
|
@ -1,2 +1,2 @@
|
|||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
4
objs/Wii/SDL/Release/.gitignore
vendored
4
objs/Wii/SDL/Release/.gitignore
vendored
|
@ -1,2 +1,2 @@
|
|||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
3
objs/WinCE/SDL/Release/.gitignore
vendored
3
objs/WinCE/SDL/Release/.gitignore
vendored
|
@ -1 +1,2 @@
|
|||
/depend.dep
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
3
objs/djgppdos/Debug/.gitignore
vendored
3
objs/djgppdos/Debug/.gitignore
vendored
|
@ -1 +1,2 @@
|
|||
/depend.dep
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
3
objs/djgppdos/Release/.gitignore
vendored
3
objs/djgppdos/Release/.gitignore
vendored
|
@ -1 +1,2 @@
|
|||
/depend.dep
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
4
objs/nds/Debug/.gitignore
vendored
4
objs/nds/Debug/.gitignore
vendored
|
@ -1,2 +1,2 @@
|
|||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
4
objs/nds/Release/.gitignore
vendored
4
objs/nds/Release/.gitignore
vendored
|
@ -1,2 +1,2 @@
|
|||
/depend.dep
|
||||
/*.o
|
||||
# DON'T REMOVE
|
||||
# This keeps the folder from disappearing
|
||||
|
|
|
@ -212,7 +212,7 @@ 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_GLIDING|PF_SLIDING|PF_NIGHTSMODE)
|
||||
if (sonic->player->pflags & (PF_GLIDING|PF_SLIDING|PF_BOUNCING)
|
||||
|| (sonic->player->panim != PA_IDLE && sonic->player->panim != PA_WALK)
|
||||
|| (sonic->player->powers[pw_carry]))
|
||||
return false;
|
||||
|
|
|
@ -1165,7 +1165,7 @@ found:
|
|||
if (var == &cv_forceskin)
|
||||
{
|
||||
var->value = R_SkinAvailable(var->string);
|
||||
if (!R_SkinUnlock(var->value))
|
||||
if (!R_SkinUsable(-1, var->value))
|
||||
var->value = -1;
|
||||
}
|
||||
else
|
||||
|
@ -1361,6 +1361,16 @@ static void CV_SetCVar(consvar_t *var, const char *value, boolean stealth)
|
|||
return;
|
||||
}
|
||||
|
||||
if (var == &cv_forceskin)
|
||||
{
|
||||
INT32 skin = R_SkinAvailable(value);
|
||||
if ((stricmp(value, "None")) && ((skin == -1) || !R_SkinUsable(-1, skin)))
|
||||
{
|
||||
CONS_Printf("Please provide a valid skin name (\"None\" disables).\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Only add to netcmd buffer if in a netgame, otherwise, just change it.
|
||||
if (netgame || multiplayer)
|
||||
{
|
||||
|
@ -1478,7 +1488,7 @@ void CV_AddValue(consvar_t *var, INT32 increment)
|
|||
else if (newvalue >= numskins)
|
||||
newvalue = -1;
|
||||
} while ((oldvalue != newvalue)
|
||||
&& !(R_SkinUnlock(newvalue)));
|
||||
&& !(R_SkinUsable(-1, newvalue)));
|
||||
}
|
||||
else
|
||||
newvalue = var->value + increment;
|
||||
|
@ -1551,34 +1561,27 @@ void CV_AddValue(consvar_t *var, INT32 increment)
|
|||
if (var == &cv_chooseskin)
|
||||
{
|
||||
// Special case for the chooseskin variable, used only directly from the menu
|
||||
if (increment > 0) // Going up!
|
||||
newvalue = var->value - 1;
|
||||
do
|
||||
{
|
||||
newvalue = var->value - 1;
|
||||
do
|
||||
if (increment > 0) // Going up!
|
||||
{
|
||||
newvalue++;
|
||||
if (newvalue == MAXSKINS)
|
||||
newvalue = 0;
|
||||
} while (var->PossibleValue[newvalue].strvalue == NULL);
|
||||
var->value = newvalue + 1;
|
||||
var->string = var->PossibleValue[newvalue].strvalue;
|
||||
var->func();
|
||||
return;
|
||||
}
|
||||
else if (increment < 0) // Going down!
|
||||
{
|
||||
newvalue = var->value - 1;
|
||||
do
|
||||
}
|
||||
else if (increment < 0) // Going down!
|
||||
{
|
||||
newvalue--;
|
||||
if (newvalue == -1)
|
||||
newvalue = MAXSKINS-1;
|
||||
} while (var->PossibleValue[newvalue].strvalue == NULL);
|
||||
var->value = newvalue + 1;
|
||||
var->string = var->PossibleValue[newvalue].strvalue;
|
||||
var->func();
|
||||
return;
|
||||
}
|
||||
}
|
||||
} while (var->PossibleValue[newvalue].strvalue == NULL);
|
||||
|
||||
var->value = newvalue + 1;
|
||||
var->string = var->PossibleValue[newvalue].strvalue;
|
||||
var->func();
|
||||
return;
|
||||
}
|
||||
#ifdef PARANOIA
|
||||
if (currentindice == -1)
|
||||
|
|
|
@ -1394,32 +1394,32 @@ static void CON_DrawInput(void)
|
|||
if (input_sel < c)
|
||||
V_DrawFill(x, y, charwidth*3, (10 * con_scalefactor), 77 | V_NOSCALESTART);
|
||||
for (i = 0; i < 3; ++i, x += charwidth)
|
||||
V_DrawCharacter(x, y, '.' | cv_constextsize.value | V_GRAYMAP | V_NOSCALESTART, !cv_allcaps.value);
|
||||
V_DrawCharacter(x, y, '.' | cv_constextsize.value | V_GRAYMAP | V_NOSCALESTART, true);
|
||||
}
|
||||
else
|
||||
V_DrawCharacter(x-charwidth, y, CON_PROMPTCHAR | cv_constextsize.value | V_GRAYMAP | V_NOSCALESTART, !cv_allcaps.value);
|
||||
V_DrawCharacter(x-charwidth, y, CON_PROMPTCHAR | cv_constextsize.value | V_GRAYMAP | V_NOSCALESTART, true);
|
||||
|
||||
for (cend = c + clen; c < cend; ++c, x += charwidth)
|
||||
{
|
||||
if ((input_sel > c && input_cur <= c) || (input_sel <= c && input_cur > c))
|
||||
{
|
||||
V_DrawFill(x, y, charwidth, (10 * con_scalefactor), 77 | V_NOSCALESTART);
|
||||
V_DrawCharacter(x, y, p[c] | cv_constextsize.value | V_YELLOWMAP | V_NOSCALESTART, !cv_allcaps.value);
|
||||
V_DrawCharacter(x, y, p[c] | cv_constextsize.value | V_YELLOWMAP | V_NOSCALESTART, true);
|
||||
}
|
||||
else
|
||||
V_DrawCharacter(x, y, p[c] | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
||||
V_DrawCharacter(x, y, p[c] | cv_constextsize.value | V_NOSCALESTART, true);
|
||||
|
||||
if (c == input_cur && con_tick >= 4)
|
||||
V_DrawCharacter(x, y + (con_scalefactor*2), '_' | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
||||
V_DrawCharacter(x, y + (con_scalefactor*2), '_' | cv_constextsize.value | V_NOSCALESTART, true);
|
||||
}
|
||||
if (cend == input_cur && con_tick >= 4)
|
||||
V_DrawCharacter(x, y + (con_scalefactor*2), '_' | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
||||
V_DrawCharacter(x, y + (con_scalefactor*2), '_' | cv_constextsize.value | V_NOSCALESTART, true);
|
||||
if (rellip)
|
||||
{
|
||||
if (input_sel > cend)
|
||||
V_DrawFill(x, y, charwidth*3, (10 * con_scalefactor), 77 | V_NOSCALESTART);
|
||||
for (i = 0; i < 3; ++i, x += charwidth)
|
||||
V_DrawCharacter(x, y, '.' | cv_constextsize.value | V_GRAYMAP | V_NOSCALESTART, !cv_allcaps.value);
|
||||
V_DrawCharacter(x, y, '.' | cv_constextsize.value | V_GRAYMAP | V_NOSCALESTART, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1465,11 +1465,11 @@ static void CON_DrawHudlines(void)
|
|||
else
|
||||
{
|
||||
//charwidth = SHORT(hu_font['A'-HU_FONTSTART]->width) * con_scalefactor;
|
||||
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
||||
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, true);
|
||||
}
|
||||
}
|
||||
|
||||
//V_DrawCharacter(x, y, (p[c]&0xff) | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
||||
//V_DrawCharacter(x, y, (p[c]&0xff) | cv_constextsize.value | V_NOSCALESTART, true);
|
||||
y += charheight;
|
||||
}
|
||||
|
||||
|
@ -1607,7 +1607,7 @@ static void CON_DrawConsole(void)
|
|||
charflags = (*p & 0x7f) << V_CHARCOLORSHIFT;
|
||||
p++;
|
||||
}
|
||||
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
||||
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -528,6 +528,7 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
|
|||
|
||||
rsp->skincolor = players[i].skincolor;
|
||||
rsp->skin = LONG(players[i].skin);
|
||||
rsp->availabilities = LONG(players[i].availabilities);
|
||||
// Just in case Lua does something like
|
||||
// modify these at runtime
|
||||
rsp->camerascale = (fixed_t)LONG(players[i].camerascale);
|
||||
|
@ -551,7 +552,6 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
|
|||
rsp->playerspinheight = (fixed_t)LONG(players[i].spinheight);
|
||||
|
||||
rsp->speed = (fixed_t)LONG(players[i].speed);
|
||||
rsp->jumping = players[i].jumping;
|
||||
rsp->secondjump = players[i].secondjump;
|
||||
rsp->fly1 = players[i].fly1;
|
||||
rsp->glidetime = (tic_t)LONG(players[i].glidetime);
|
||||
|
@ -657,6 +657,7 @@ static void resynch_read_player(resynch_pak *rsp)
|
|||
|
||||
players[i].skincolor = rsp->skincolor;
|
||||
players[i].skin = LONG(rsp->skin);
|
||||
players[i].availabilities = LONG(rsp->availabilities);
|
||||
// Just in case Lua does something like
|
||||
// modify these at runtime
|
||||
players[i].camerascale = (fixed_t)LONG(rsp->camerascale);
|
||||
|
@ -680,7 +681,6 @@ static void resynch_read_player(resynch_pak *rsp)
|
|||
players[i].spinheight = (fixed_t)LONG(rsp->playerspinheight);
|
||||
|
||||
players[i].speed = (fixed_t)LONG(rsp->speed);
|
||||
players[i].jumping = rsp->jumping;
|
||||
players[i].secondjump = rsp->secondjump;
|
||||
players[i].fly1 = rsp->fly1;
|
||||
players[i].glidetime = (tic_t)LONG(rsp->glidetime);
|
||||
|
@ -1364,6 +1364,7 @@ static boolean SV_SendServerConfig(INT32 node)
|
|||
// which is nice and easy for us to detect
|
||||
memset(netbuffer->u.servercfg.playerskins, 0xFF, sizeof(netbuffer->u.servercfg.playerskins));
|
||||
memset(netbuffer->u.servercfg.playercolor, 0xFF, sizeof(netbuffer->u.servercfg.playercolor));
|
||||
memset(netbuffer->u.servercfg.playeravailabilities, 0xFF, sizeof(netbuffer->u.servercfg.playeravailabilities));
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
|
@ -1371,6 +1372,7 @@ static boolean SV_SendServerConfig(INT32 node)
|
|||
continue;
|
||||
netbuffer->u.servercfg.playerskins[i] = (UINT8)players[i].skin;
|
||||
netbuffer->u.servercfg.playercolor[i] = (UINT8)players[i].skincolor;
|
||||
netbuffer->u.servercfg.playeravailabilities[i] = (UINT32)LONG(players[i].availabilities);
|
||||
}
|
||||
|
||||
memcpy(netbuffer->u.servercfg.server_context, server_context, 8);
|
||||
|
@ -1561,8 +1563,6 @@ static void CL_LoadReceivedSavegame(void)
|
|||
automapactive = false;
|
||||
|
||||
// load a base level
|
||||
playerdeadview = false;
|
||||
|
||||
if (P_LoadNetGame())
|
||||
{
|
||||
const INT32 actnum = mapheaderinfo[gamemap-1]->actnum;
|
||||
|
@ -2308,12 +2308,7 @@ static void ResetNode(INT32 node);
|
|||
void CL_ClearPlayer(INT32 playernum)
|
||||
{
|
||||
if (players[playernum].mo)
|
||||
{
|
||||
// Don't leave a NiGHTS ghost!
|
||||
if ((players[playernum].pflags & PF_NIGHTSMODE) && players[playernum].mo->tracer)
|
||||
P_RemoveMobj(players[playernum].mo->tracer);
|
||||
P_RemoveMobj(players[playernum].mo);
|
||||
}
|
||||
memset(&players[playernum], 0, sizeof (player_t));
|
||||
}
|
||||
|
||||
|
@ -2538,7 +2533,7 @@ static void Command_Ban(void)
|
|||
return;
|
||||
else
|
||||
WRITEUINT8(p, pn);
|
||||
if (I_Ban && !I_Ban(node))
|
||||
if (server && I_Ban && !I_Ban(node)) // only the server is allowed to do this right now
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Too many bans! Geez, that's a lot of people you're excluding...\n"));
|
||||
WRITEUINT8(p, KICK_MSG_GO_AWAY);
|
||||
|
@ -2546,7 +2541,8 @@ static void Command_Ban(void)
|
|||
}
|
||||
else
|
||||
{
|
||||
Ban_Add(COM_Argv(2));
|
||||
if (server) // only the server is allowed to do this right now
|
||||
Ban_Add(COM_Argv(2));
|
||||
|
||||
if (COM_Argc() == 2)
|
||||
{
|
||||
|
@ -2703,12 +2699,14 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
|
|||
|
||||
// If a verified admin banned someone, the server needs to know about it.
|
||||
// If the playernum isn't zero (the server) then the server needs to record the ban.
|
||||
if (server && playernum && msg == KICK_MSG_BANNED)
|
||||
if (server && playernum && (msg == KICK_MSG_BANNED || msg == KICK_MSG_CUSTOM_BAN))
|
||||
{
|
||||
if (I_Ban && !I_Ban(playernode[(INT32)pnum]))
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Too many bans! Geez, that's a lot of people you're excluding...\n"));
|
||||
}
|
||||
#ifndef NONET
|
||||
else
|
||||
Ban_Add(reason);
|
||||
#endif
|
||||
}
|
||||
|
||||
switch (msg)
|
||||
|
@ -3497,10 +3495,12 @@ static void HandlePacketFromAwayNode(SINT8 node)
|
|||
for (j = 0; j < MAXPLAYERS; j++)
|
||||
{
|
||||
if (netbuffer->u.servercfg.playerskins[j] == 0xFF
|
||||
&& netbuffer->u.servercfg.playercolor[j] == 0xFF)
|
||||
&& netbuffer->u.servercfg.playercolor[j] == 0xFF
|
||||
&& netbuffer->u.servercfg.playeravailabilities[j] == 0xFFFFFFFF)
|
||||
continue; // not in game
|
||||
|
||||
playeringame[j] = true;
|
||||
players[j].availabilities = (UINT32)LONG(netbuffer->u.servercfg.playeravailabilities[j]);
|
||||
SetPlayerSkinByNum(j, (INT32)netbuffer->u.servercfg.playerskins[j]);
|
||||
players[j].skincolor = netbuffer->u.servercfg.playercolor[j];
|
||||
}
|
||||
|
|
|
@ -172,6 +172,7 @@ typedef struct
|
|||
|
||||
UINT8 skincolor;
|
||||
INT32 skin;
|
||||
UINT32 availabilities;
|
||||
// Just in case Lua does something like
|
||||
// modify these at runtime
|
||||
fixed_t camerascale;
|
||||
|
@ -195,7 +196,6 @@ typedef struct
|
|||
fixed_t playerspinheight;
|
||||
|
||||
fixed_t speed;
|
||||
UINT8 jumping;
|
||||
UINT8 secondjump;
|
||||
UINT8 fly1;
|
||||
tic_t glidetime;
|
||||
|
@ -284,6 +284,7 @@ typedef struct
|
|||
// 0xFF == not in game; else player skin num
|
||||
UINT8 playerskins[MAXPLAYERS];
|
||||
UINT8 playercolor[MAXPLAYERS];
|
||||
UINT32 playeravailabilities[MAXPLAYERS];
|
||||
|
||||
UINT8 gametype;
|
||||
UINT8 modifiedgame;
|
||||
|
|
|
@ -727,7 +727,6 @@ void D_StartTitle(void)
|
|||
maptol = 0;
|
||||
|
||||
gameaction = ga_nothing;
|
||||
playerdeadview = false;
|
||||
displayplayer = consoleplayer = 0;
|
||||
//demosequence = -1;
|
||||
gametype = GT_COOP;
|
||||
|
|
|
@ -34,7 +34,7 @@ void D_SRB2Loop(void) FUNCNORETURN;
|
|||
// D_SRB2Main()
|
||||
// Not a globally visible function, just included for source reference,
|
||||
// calls all startup code, parses command line options.
|
||||
// If not overrided by user input, calls N_AdvanceDemo.
|
||||
// If not overrided by user input, calls D_AdvanceDemo.
|
||||
//
|
||||
void D_SRB2Main(void);
|
||||
|
||||
|
@ -51,9 +51,6 @@ const char *D_Home(void);
|
|||
//
|
||||
// BASE LEVEL
|
||||
//
|
||||
void D_PageTicker(void);
|
||||
// pagename is lumpname of a 320x200 patch to fill the screen
|
||||
void D_PageDrawer(const char *pagename);
|
||||
void D_AdvanceDemo(void);
|
||||
void D_StartTitle(void);
|
||||
|
||||
|
|
|
@ -49,7 +49,9 @@ doomcom_t *doomcom = NULL;
|
|||
/// \brief network packet data, points inside doomcom
|
||||
doomdata_t *netbuffer = NULL;
|
||||
|
||||
#ifdef DEBUGFILE
|
||||
FILE *debugfile = NULL; // put some net info in a file during the game
|
||||
#endif
|
||||
|
||||
#define MAXREBOUND 8
|
||||
static doomdata_t reboundstore[MAXREBOUND];
|
||||
|
|
133
src/d_netcmd.c
133
src/d_netcmd.c
|
@ -189,14 +189,13 @@ static CV_PossibleValue_t teamscramble_cons_t[] = {{0, "Off"}, {1, "Random"}, {2
|
|||
|
||||
static CV_PossibleValue_t startingliveslimit_cons_t[] = {{1, "MIN"}, {99, "MAX"}, {0, NULL}};
|
||||
static CV_PossibleValue_t sleeping_cons_t[] = {{-1, "MIN"}, {1000/TICRATE, "MAX"}, {0, NULL}};
|
||||
static CV_PossibleValue_t competitionboxes_cons_t[] = {{0, "Normal"}, {1, "Random"}, {2, "Teleports"},
|
||||
static CV_PossibleValue_t competitionboxes_cons_t[] = {{0, "Normal"}, {1, "Random"}, //{2, "Teleports"},
|
||||
{3, "None"}, {0, NULL}};
|
||||
|
||||
static CV_PossibleValue_t matchboxes_cons_t[] = {{0, "Normal"}, {1, "Random"}, {2, "Non-Random"},
|
||||
{3, "None"}, {0, NULL}};
|
||||
|
||||
static CV_PossibleValue_t chances_cons_t[] = {{0, "MIN"}, {9, "MAX"}, {0, NULL}};
|
||||
static CV_PossibleValue_t match_scoring_cons_t[] = {{0, "Normal"}, {1, "Classic"}, {0, NULL}};
|
||||
static CV_PossibleValue_t pause_cons_t[] = {{0, "Server"}, {1, "All"}, {0, NULL}};
|
||||
|
||||
static CV_PossibleValue_t timetic_cons_t[] = {{0, "Normal"}, {1, "Tics"}, {2, "Centiseconds"}, {0, NULL}};
|
||||
|
@ -311,7 +310,6 @@ consvar_t cv_friendlyfire = {"friendlyfire", "Off", CV_NETVAR, CV_OnOff, NULL, 0
|
|||
consvar_t cv_itemfinder = {"itemfinder", "Off", CV_CALL, CV_OnOff, ItemFinder_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
// Scoring type options
|
||||
consvar_t cv_match_scoring = {"matchscoring", "Normal", CV_NETVAR|CV_CHEAT, match_scoring_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_overtime = {"overtime", "Yes", CV_NETVAR, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_rollingdemos = {"rollingdemos", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
@ -485,7 +483,6 @@ void D_RegisterServerCommands(void)
|
|||
CV_RegisterVar(&cv_itemrespawntime);
|
||||
CV_RegisterVar(&cv_itemrespawn);
|
||||
CV_RegisterVar(&cv_flagtime);
|
||||
CV_RegisterVar(&cv_suddendeath);
|
||||
|
||||
// misc
|
||||
CV_RegisterVar(&cv_friendlyfire);
|
||||
|
@ -533,7 +530,6 @@ void D_RegisterServerCommands(void)
|
|||
CV_RegisterVar(&cv_startinglives);
|
||||
CV_RegisterVar(&cv_countdowntime);
|
||||
CV_RegisterVar(&cv_runscripts);
|
||||
CV_RegisterVar(&cv_match_scoring);
|
||||
CV_RegisterVar(&cv_overtime);
|
||||
CV_RegisterVar(&cv_pause);
|
||||
CV_RegisterVar(&cv_mute);
|
||||
|
@ -616,6 +612,7 @@ void D_RegisterClientCommands(void)
|
|||
|
||||
CV_RegisterVar(&cv_screenshot_option);
|
||||
CV_RegisterVar(&cv_screenshot_folder);
|
||||
CV_RegisterVar(&cv_screenshot_colorprofile);
|
||||
CV_RegisterVar(&cv_moviemode);
|
||||
// PNG variables
|
||||
CV_RegisterVar(&cv_zlib_level);
|
||||
|
@ -673,7 +670,29 @@ void D_RegisterClientCommands(void)
|
|||
CV_RegisterVar(&cv_resetmusic);
|
||||
|
||||
// FIXME: not to be here.. but needs be done for config loading
|
||||
CV_RegisterVar(&cv_usegamma);
|
||||
CV_RegisterVar(&cv_globalgamma);
|
||||
CV_RegisterVar(&cv_globalsaturation);
|
||||
|
||||
CV_RegisterVar(&cv_rhue);
|
||||
CV_RegisterVar(&cv_yhue);
|
||||
CV_RegisterVar(&cv_ghue);
|
||||
CV_RegisterVar(&cv_chue);
|
||||
CV_RegisterVar(&cv_bhue);
|
||||
CV_RegisterVar(&cv_mhue);
|
||||
|
||||
CV_RegisterVar(&cv_rgamma);
|
||||
CV_RegisterVar(&cv_ygamma);
|
||||
CV_RegisterVar(&cv_ggamma);
|
||||
CV_RegisterVar(&cv_cgamma);
|
||||
CV_RegisterVar(&cv_bgamma);
|
||||
CV_RegisterVar(&cv_mgamma);
|
||||
|
||||
CV_RegisterVar(&cv_rsaturation);
|
||||
CV_RegisterVar(&cv_ysaturation);
|
||||
CV_RegisterVar(&cv_gsaturation);
|
||||
CV_RegisterVar(&cv_csaturation);
|
||||
CV_RegisterVar(&cv_bsaturation);
|
||||
CV_RegisterVar(&cv_msaturation);
|
||||
|
||||
// m_menu.c
|
||||
CV_RegisterVar(&cv_crosshair);
|
||||
|
@ -731,6 +750,7 @@ void D_RegisterClientCommands(void)
|
|||
|
||||
// s_sound.c
|
||||
CV_RegisterVar(&cv_soundvolume);
|
||||
CV_RegisterVar(&cv_closedcaptioning);
|
||||
CV_RegisterVar(&cv_digmusicvolume);
|
||||
CV_RegisterVar(&cv_midimusicvolume);
|
||||
CV_RegisterVar(&cv_numChannels);
|
||||
|
@ -1011,7 +1031,7 @@ UINT8 CanChangeSkin(INT32 playernum)
|
|||
return true;
|
||||
|
||||
// Force skin in effect.
|
||||
if (client && (cv_forceskin.value != -1) && !(adminplayer == playernum && serverplayer == -1))
|
||||
if ((cv_forceskin.value != -1) || (mapheaderinfo[gamemap-1] && mapheaderinfo[gamemap-1]->forcecharacter[0] != '\0'))
|
||||
return false;
|
||||
|
||||
// Can change skin in intermission and whatnot.
|
||||
|
@ -1109,6 +1129,8 @@ static void SendNameAndColor(void)
|
|||
if (!Playing())
|
||||
return;
|
||||
|
||||
players[consoleplayer].availabilities = R_GetSkinAvailabilities();
|
||||
|
||||
// If you're not in a netgame, merely update the skin, color, and name.
|
||||
if (!netgame)
|
||||
{
|
||||
|
@ -1127,7 +1149,7 @@ static void SendNameAndColor(void)
|
|||
SetPlayerSkinByNum(consoleplayer, 0);
|
||||
CV_StealthSet(&cv_skin, skins[0].name);
|
||||
}
|
||||
else if ((foundskin = R_SkinAvailable(cv_skin.string)) != -1 && R_SkinUnlock(foundskin))
|
||||
else if ((foundskin = R_SkinAvailable(cv_skin.string)) != -1 && R_SkinUsable(consoleplayer, foundskin))
|
||||
{
|
||||
boolean notsame;
|
||||
|
||||
|
@ -1174,7 +1196,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) || !R_SkinUnlock(cv_skin.value))
|
||||
if ((cv_skin.value < 0) || !R_SkinUsable(consoleplayer, cv_skin.value))
|
||||
{
|
||||
CV_StealthSet(&cv_skin, DEFAULTSKIN);
|
||||
cv_skin.value = 0;
|
||||
|
@ -1182,6 +1204,7 @@ static void SendNameAndColor(void)
|
|||
|
||||
// Finally write out the complete packet and send it off.
|
||||
WRITESTRINGN(p, cv_playername.zstring, MAXPLAYERNAME);
|
||||
WRITEUINT32(p, (UINT32)players[consoleplayer].availabilities);
|
||||
WRITEUINT8(p, (UINT8)cv_playercolor.value);
|
||||
WRITEUINT8(p, (UINT8)cv_skin.value);
|
||||
SendNetXCmd(XD_NAMEANDCOLOR, buf, p - buf);
|
||||
|
@ -1224,6 +1247,8 @@ static void SendNameAndColor2(void)
|
|||
if (!Playing())
|
||||
return;
|
||||
|
||||
players[secondplaya].availabilities = R_GetSkinAvailabilities();
|
||||
|
||||
// If you're not in a netgame, merely update the skin, color, and name.
|
||||
if (botingame)
|
||||
{
|
||||
|
@ -1252,7 +1277,7 @@ static void SendNameAndColor2(void)
|
|||
SetPlayerSkinByNum(secondplaya, forcedskin);
|
||||
CV_StealthSet(&cv_skin2, skins[forcedskin].name);
|
||||
}
|
||||
else if ((foundskin = R_SkinAvailable(cv_skin2.string)) != -1 && R_SkinUnlock(foundskin))
|
||||
else if ((foundskin = R_SkinAvailable(cv_skin2.string)) != -1 && R_SkinUsable(secondplaya, foundskin))
|
||||
{
|
||||
boolean notsame;
|
||||
|
||||
|
@ -1307,6 +1332,7 @@ static void Got_NameAndColor(UINT8 **cp, INT32 playernum)
|
|||
#endif
|
||||
|
||||
READSTRINGN(*cp, name, MAXPLAYERNAME);
|
||||
p->availabilities = READUINT32(*cp);
|
||||
color = READUINT8(*cp);
|
||||
skin = READUINT8(*cp);
|
||||
|
||||
|
@ -1323,6 +1349,7 @@ static void Got_NameAndColor(UINT8 **cp, INT32 playernum)
|
|||
if (server && (p != &players[consoleplayer] && p != &players[secondarydisplayplayer]))
|
||||
{
|
||||
boolean kick = false;
|
||||
INT32 s;
|
||||
|
||||
// team colors
|
||||
if (G_GametypeHasTeams())
|
||||
|
@ -1337,6 +1364,16 @@ static void Got_NameAndColor(UINT8 **cp, INT32 playernum)
|
|||
if (!p->skincolor)
|
||||
kick = true;
|
||||
|
||||
// availabilities
|
||||
for (s = 0; s < MAXSKINS; s++)
|
||||
{
|
||||
if (!skins[s].availability && (p->availabilities & (1 << s)))
|
||||
{
|
||||
kick = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (kick)
|
||||
{
|
||||
XBOXSTATIC UINT8 buf[2];
|
||||
|
@ -1532,10 +1569,13 @@ void D_MapChange(INT32 mapnum, INT32 newgametype, boolean pultmode, boolean rese
|
|||
// The supplied data are assumed to be good.
|
||||
I_Assert(delay >= 0 && delay <= 2);
|
||||
|
||||
if (mapnum != -1)
|
||||
CV_SetValue(&cv_nextmap, mapnum);
|
||||
|
||||
CONS_Debug(DBG_GAMELOGIC, "Map change: mapnum=%d gametype=%d ultmode=%d resetplayers=%d delay=%d skipprecutscene=%d\n",
|
||||
mapnum, newgametype, pultmode, resetplayers, delay, skipprecutscene);
|
||||
|
||||
if (netgame || multiplayer)
|
||||
if ((netgame || multiplayer) && !((gametype == newgametype) && (newgametype == GT_COOP)))
|
||||
FLS = false;
|
||||
|
||||
if (delay != 2)
|
||||
|
@ -1701,9 +1741,19 @@ static void Command_Map_f(void)
|
|||
}
|
||||
}
|
||||
|
||||
// Prevent warping to locked levels
|
||||
// ... unless you're in a dedicated server. Yes, technically this means you can view any level by
|
||||
// running a dedicated server and joining it yourself, but that's better than making dedicated server's
|
||||
// lives hell.
|
||||
if (!dedicated && M_MapLocked(newmapnum))
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You need to unlock this level before you can warp to it!\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
// don't use a gametype the map doesn't support
|
||||
if (cv_debug || COM_CheckParm("-force") || cv_skipmapcheck.value)
|
||||
; // The player wants us to trek on anyway. Do so.
|
||||
fromlevelselect = false; // The player wants us to trek on anyway. Do so.
|
||||
// G_TOLFlag handles both multiplayer gametype and ignores it for !multiplayer
|
||||
// Alternatively, bail if the map header is completely missing anyway.
|
||||
else if (!mapheaderinfo[newmapnum-1]
|
||||
|
@ -1722,19 +1772,10 @@ static void Command_Map_f(void)
|
|||
CONS_Alert(CONS_WARNING, M_GetText("%s doesn't support %s mode!\n(Use -force to override)\n"), mapname, gametypestring);
|
||||
return;
|
||||
}
|
||||
else
|
||||
fromlevelselect = ((netgame || multiplayer) && ((gametype == newgametype) && (newgametype == GT_COOP)));
|
||||
|
||||
// Prevent warping to locked levels
|
||||
// ... unless you're in a dedicated server. Yes, technically this means you can view any level by
|
||||
// running a dedicated server and joining it yourself, but that's better than making dedicated server's
|
||||
// lives hell.
|
||||
if (!dedicated && M_MapLocked(newmapnum))
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You need to unlock this level before you can warp to it!\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
fromlevelselect = false;
|
||||
D_MapChange(newmapnum, newgametype, false, newresetplayers, 0, false, false);
|
||||
D_MapChange(newmapnum, newgametype, false, newresetplayers, 0, false, fromlevelselect);
|
||||
}
|
||||
|
||||
/** Receives a map command and changes the map.
|
||||
|
@ -1800,17 +1841,14 @@ static void Got_Mapcmd(UINT8 **cp, INT32 playernum)
|
|||
if (demoplayback && !timingdemo)
|
||||
precache = false;
|
||||
|
||||
if (resetplayer)
|
||||
{
|
||||
if (!FLS || (netgame || multiplayer))
|
||||
emeralds = 0;
|
||||
}
|
||||
if (resetplayer && !FLS)
|
||||
emeralds = 0;
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
LUAh_MapChange();
|
||||
#endif
|
||||
|
||||
G_InitNew(ultimatemode, mapname, resetplayer, skipprecutscene);
|
||||
G_InitNew(ultimatemode, mapname, resetplayer, skipprecutscene, FLS);
|
||||
if (demoplayback && !timingdemo)
|
||||
precache = true;
|
||||
CON_ToggleOff();
|
||||
|
@ -2116,7 +2154,7 @@ static void Command_Teamchange_f(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!cv_allowteamchange.value && !NetPacket.packet.newteam) // allow swapping to spectator even in locked teams.
|
||||
if (!cv_allowteamchange.value && NetPacket.packet.newteam) // allow swapping to spectator even in locked teams.
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("The server is not allowing team changes at the moment.\n"));
|
||||
return;
|
||||
|
@ -2213,7 +2251,7 @@ static void Command_Teamchange2_f(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!cv_allowteamchange.value && !NetPacket.packet.newteam) // allow swapping to spectator even in locked teams.
|
||||
if (!cv_allowteamchange.value && NetPacket.packet.newteam) // allow swapping to spectator even in locked teams.
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("The server is not allowing team changes at the moment.\n"));
|
||||
return;
|
||||
|
@ -2967,6 +3005,7 @@ static void Command_Addfile(void)
|
|||
XBOXSTATIC char buf[256];
|
||||
char *buf_p = buf;
|
||||
INT32 i;
|
||||
int musiconly; // W_VerifyNMUSlumps isn't boolean
|
||||
|
||||
if (COM_Argc() != 2)
|
||||
{
|
||||
|
@ -2981,7 +3020,9 @@ static void Command_Addfile(void)
|
|||
if (!isprint(fn[i]) || fn[i] == ';')
|
||||
return;
|
||||
|
||||
if (!W_VerifyNMUSlumps(fn))
|
||||
musiconly = W_VerifyNMUSlumps(fn);
|
||||
|
||||
if (!musiconly)
|
||||
{
|
||||
// ... But only so long as they contain nothing more then music and sprites.
|
||||
if (netgame && !(server || adminplayer == consoleplayer))
|
||||
|
@ -2993,7 +3034,7 @@ static void Command_Addfile(void)
|
|||
}
|
||||
|
||||
// Add file on your client directly if it is trivial, or you aren't in a netgame.
|
||||
if (!(netgame || multiplayer) || W_VerifyNMUSlumps(fn))
|
||||
if (!(netgame || multiplayer) || musiconly)
|
||||
{
|
||||
P_AddWadFile(fn, NULL);
|
||||
return;
|
||||
|
@ -3013,9 +3054,7 @@ static void Command_Addfile(void)
|
|||
#else
|
||||
FILE *fhandle;
|
||||
|
||||
fhandle = fopen(fn, "rb");
|
||||
|
||||
if (fhandle)
|
||||
if ((fhandle = W_OpenWadFile(&fn, true)) != NULL)
|
||||
{
|
||||
tic_t t = I_GetTime();
|
||||
CONS_Debug(DBG_SETUP, "Making MD5 for %s\n",fn);
|
||||
|
@ -3023,11 +3062,8 @@ static void Command_Addfile(void)
|
|||
CONS_Debug(DBG_SETUP, "MD5 calc for %s took %f second\n", fn, (float)(I_GetTime() - t)/TICRATE);
|
||||
fclose(fhandle);
|
||||
}
|
||||
else
|
||||
{
|
||||
CONS_Printf(M_GetText("File %s not found.\n"), fn);
|
||||
else // file not found
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
WRITEMEM(buf_p, md5sum, 16);
|
||||
}
|
||||
|
@ -4042,13 +4078,6 @@ static void Command_Archivetest_f(void)
|
|||
*/
|
||||
static void ForceSkin_OnChange(void)
|
||||
{
|
||||
if ((server || adminplayer == consoleplayer) && ((cv_forceskin.value == -1 && stricmp(cv_forceskin.string, "None")) || !(R_SkinUnlock(cv_forceskin.value))))
|
||||
{
|
||||
CONS_Printf("Please provide a valid skin name (\"None\" disables).\n");
|
||||
CV_SetValue(&cv_forceskin, -1);
|
||||
return;
|
||||
}
|
||||
|
||||
// NOT in SP, silly!
|
||||
if (!(netgame || multiplayer))
|
||||
return;
|
||||
|
@ -4057,7 +4086,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].realname);
|
||||
CONS_Printf("The server is restricting all players to skin \"%s\".\n",skins[cv_forceskin.value].name);
|
||||
ForceAllSkins(cv_forceskin.value);
|
||||
}
|
||||
}
|
||||
|
@ -4095,7 +4124,8 @@ static void Skin_OnChange(void)
|
|||
if (!Playing())
|
||||
return; // do whatever you want
|
||||
|
||||
if (!(cv_debug || devparm) && !(multiplayer || netgame)) // In single player.
|
||||
if (!(cv_debug || devparm) && !(multiplayer || netgame) // In single player.
|
||||
&& (gamestate != GS_WAITINGPLAYERS)) // allows command line -warp x +skin y
|
||||
{
|
||||
CV_StealthSet(&cv_skin, skins[players[consoleplayer].skin].name);
|
||||
return;
|
||||
|
@ -4138,8 +4168,7 @@ static void Color_OnChange(void)
|
|||
if (!Playing())
|
||||
return; // do whatever you want
|
||||
|
||||
if (!(cv_debug || devparm) && !(multiplayer || netgame) // In single player.
|
||||
&& (gamestate == GS_LEVEL || gamestate == GS_INTERMISSION || gamestate == GS_CONTINUING))
|
||||
if (!(cv_debug || devparm) && !(multiplayer || netgame)) // In single player.
|
||||
{
|
||||
CV_StealthSet(&cv_skin, skins[players[consoleplayer].skin].name);
|
||||
return;
|
||||
|
|
|
@ -20,6 +20,12 @@
|
|||
// console vars
|
||||
extern consvar_t cv_playername;
|
||||
extern consvar_t cv_playercolor;
|
||||
extern consvar_t cv_skin;
|
||||
// secondary splitscreen player
|
||||
extern consvar_t cv_playername2;
|
||||
extern consvar_t cv_playercolor2;
|
||||
extern consvar_t cv_skin2;
|
||||
|
||||
#ifdef SEENAMES
|
||||
extern consvar_t cv_seenames, cv_allowseenames;
|
||||
#endif
|
||||
|
@ -32,7 +38,6 @@ extern consvar_t cv_joyport2;
|
|||
#endif
|
||||
extern consvar_t cv_joyscale;
|
||||
extern consvar_t cv_joyscale2;
|
||||
extern consvar_t cv_controlperkey;
|
||||
|
||||
// splitscreen with second mouse
|
||||
extern consvar_t cv_mouse2port;
|
||||
|
@ -40,25 +45,12 @@ extern consvar_t cv_usemouse2;
|
|||
#if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON)
|
||||
extern consvar_t cv_mouse2opt;
|
||||
#endif
|
||||
extern consvar_t cv_invertmouse2;
|
||||
extern consvar_t cv_alwaysfreelook2;
|
||||
extern consvar_t cv_mousemove2;
|
||||
extern consvar_t cv_mousesens2;
|
||||
extern consvar_t cv_mouseysens2;
|
||||
|
||||
// normally in p_mobj but the .h is not read
|
||||
extern consvar_t cv_itemrespawntime;
|
||||
extern consvar_t cv_itemrespawn;
|
||||
|
||||
extern consvar_t cv_flagtime;
|
||||
extern consvar_t cv_suddendeath;
|
||||
|
||||
extern consvar_t cv_skin;
|
||||
|
||||
// secondary splitscreen player
|
||||
extern consvar_t cv_playername2;
|
||||
extern consvar_t cv_playercolor2;
|
||||
extern consvar_t cv_skin2;
|
||||
|
||||
extern consvar_t cv_touchtag;
|
||||
extern consvar_t cv_hidetime;
|
||||
|
@ -77,9 +69,6 @@ extern consvar_t cv_autobalance;
|
|||
extern consvar_t cv_teamscramble;
|
||||
extern consvar_t cv_scrambleonchange;
|
||||
|
||||
extern consvar_t cv_useranalog, cv_useranalog2;
|
||||
extern consvar_t cv_analog, cv_analog2;
|
||||
|
||||
extern consvar_t cv_netstat;
|
||||
#ifdef WALLSPLATS
|
||||
extern consvar_t cv_splats;
|
||||
|
@ -101,7 +90,6 @@ extern consvar_t cv_recycler;
|
|||
extern consvar_t cv_itemfinder;
|
||||
|
||||
extern consvar_t cv_inttime, cv_advancemap, cv_playersforexit;
|
||||
extern consvar_t cv_match_scoring;
|
||||
extern consvar_t cv_overtime;
|
||||
extern consvar_t cv_startinglives;
|
||||
|
||||
|
@ -120,17 +108,7 @@ extern consvar_t cv_maxping;
|
|||
|
||||
extern consvar_t cv_skipmapcheck;
|
||||
|
||||
extern consvar_t cv_sleep, cv_screenshot_option, cv_screenshot_folder;
|
||||
|
||||
extern consvar_t cv_moviemode;
|
||||
|
||||
extern consvar_t cv_zlib_level, cv_zlib_memory, cv_zlib_strategy;
|
||||
|
||||
extern consvar_t cv_zlib_window_bits, cv_zlib_levela, cv_zlib_memorya;
|
||||
|
||||
extern consvar_t cv_zlib_strategya, cv_zlib_window_bitsa;
|
||||
|
||||
extern consvar_t cv_apng_delay;
|
||||
extern consvar_t cv_sleep;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
|
@ -211,7 +189,6 @@ void Command_ExitGame_f(void);
|
|||
void Command_Retry_f(void);
|
||||
void D_GameTypeChanged(INT32 lastgametype); // not a real _OnChange function anymore
|
||||
void D_MapChange(INT32 pmapnum, INT32 pgametype, boolean pultmode, boolean presetplayers, INT32 pdelay, boolean pskipprecutscene, boolean pfromlevelselect);
|
||||
void ObjectPlace_OnChange(void);
|
||||
void ItemFinder_OnChange(void);
|
||||
void D_SetPassword(const char *pw);
|
||||
|
||||
|
|
|
@ -32,19 +32,21 @@
|
|||
// Extra abilities/settings for skins (combinable stuff)
|
||||
typedef enum
|
||||
{
|
||||
SF_SUPER = 1, // Can turn super in singleplayer/co-op mode.
|
||||
SF_SUPERANIMS = 1<<1, // If super, use the super sonic animations
|
||||
SF_SUPERSPIN = 1<<2, // Should spin frames be played while super?
|
||||
SF_HIRES = 1<<3, // Draw the sprite 2x as small?
|
||||
SF_SUPER = 1, // Can turn super in singleplayer/co-op mode?
|
||||
SF_NOSUPERSPIN = 1<<1, // Should spin frames be played while super?
|
||||
SF_NOSPINDASHDUST = 1<<2, // Spawn dust particles when charging a spindash?
|
||||
SF_HIRES = 1<<3, // Draw the sprite at different size?
|
||||
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_NOJUMPSPIN = 1<<7, // SPR2_JUMP defaults to SPR2_SPRG instead of SPR2_ROLL, 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?
|
||||
SF_NOSPINDASHDUST = 1<<11, // Don't spawn dust particles when charging a spindash
|
||||
SF_DASHMODE = 1<<11, // Sonic Advance 2 style top speed increase?
|
||||
SF_FASTEDGE = 1<<12, // Faster edge teeter?
|
||||
SF_MULTIABILITY = 1<<13, // Revenge of Final Demo.
|
||||
// free up to and including 1<<31
|
||||
} skinflags_t;
|
||||
|
||||
|
@ -65,7 +67,7 @@ typedef enum
|
|||
CA_JUMPBOOST,
|
||||
CA_AIRDRILL,
|
||||
CA_JUMPTHOK,
|
||||
CA_DASHMODE,
|
||||
CA_BOUNCE,
|
||||
CA_TWINSPIN
|
||||
} charability_t;
|
||||
|
||||
|
@ -74,7 +76,7 @@ typedef enum
|
|||
{
|
||||
CA2_NONE=0,
|
||||
CA2_SPINDASH,
|
||||
CA2_MULTIABILITY,
|
||||
CA2_GUNSLINGER,
|
||||
CA2_MELEE
|
||||
} charability2_t;
|
||||
|
||||
|
@ -118,10 +120,8 @@ typedef enum
|
|||
// Did you get a time-over?
|
||||
PF_TIMEOVER = 1<<10,
|
||||
|
||||
// Ready for Super?
|
||||
PF_SUPERREADY = 1<<11,
|
||||
|
||||
// Character action status
|
||||
PF_STARTJUMP = 1<<11,
|
||||
PF_JUMPED = 1<<12,
|
||||
PF_SPINNING = 1<<13,
|
||||
PF_STARTDASH = 1<<14,
|
||||
|
@ -133,12 +133,11 @@ typedef enum
|
|||
// Sliding (usually in water) like Labyrinth/Oil Ocean
|
||||
PF_SLIDING = 1<<17,
|
||||
|
||||
/*** NIGHTS STUFF ***/
|
||||
// Is the player in NiGHTS mode?
|
||||
PF_NIGHTSMODE = 1<<18,
|
||||
PF_TRANSFERTOCLOSEST = 1<<19,
|
||||
// Bouncing
|
||||
PF_BOUNCING = 1<<18,
|
||||
|
||||
// Spill rings after falling
|
||||
/*** NIGHTS STUFF ***/
|
||||
PF_TRANSFERTOCLOSEST = 1<<19,
|
||||
PF_NIGHTSFALL = 1<<20,
|
||||
PF_DRILLING = 1<<21,
|
||||
PF_SKIDDOWN = 1<<22,
|
||||
|
@ -157,10 +156,10 @@ typedef enum
|
|||
// Used shield ability
|
||||
PF_SHIELDABILITY = 1<<28,
|
||||
|
||||
// Force jump damage?
|
||||
PF_FORCEJUMPDAMAGE = 1<<29
|
||||
// Jump damage?
|
||||
PF_NOJUMPDAMAGE = 1<<29,
|
||||
|
||||
// free up to and including 1<<31
|
||||
// up to 1<<31 is free
|
||||
} pflags_t;
|
||||
|
||||
typedef enum
|
||||
|
@ -171,7 +170,7 @@ typedef enum
|
|||
PA_EDGE,
|
||||
PA_WALK,
|
||||
PA_RUN,
|
||||
PA_PEEL,
|
||||
PA_DASH,
|
||||
PA_PAIN,
|
||||
PA_ROLL,
|
||||
PA_JUMP,
|
||||
|
@ -223,6 +222,10 @@ typedef enum
|
|||
CR_GENERIC,
|
||||
// Tails carry.
|
||||
CR_PLAYER,
|
||||
// NiGHTS mode. Not technically a CARRYING, but doesn't stack with any of the others, so might as well go here.
|
||||
CR_NIGHTSMODE,
|
||||
// Old Brak sucks hard, but this gimmick could be used for something better, so we might as well continue supporting it.
|
||||
CR_BRAKGOOP,
|
||||
// Specific level gimmicks.
|
||||
CR_ZOOMTUBE,
|
||||
CR_ROPEHANG,
|
||||
|
@ -262,9 +265,7 @@ typedef enum
|
|||
pw_nights_helper,
|
||||
pw_nights_linkfreeze,
|
||||
|
||||
//for linedef exec 427
|
||||
pw_nocontrol,
|
||||
pw_ingoop, // In goop
|
||||
pw_nocontrol, //for linedef exec 427
|
||||
|
||||
NUMPOWERS
|
||||
} powertype_t;
|
||||
|
@ -340,6 +341,7 @@ typedef struct player_s
|
|||
UINT8 skincolor;
|
||||
|
||||
INT32 skin;
|
||||
UINT32 availabilities;
|
||||
|
||||
UINT32 score; // player score
|
||||
fixed_t dashspeed; // dashing speed
|
||||
|
@ -377,7 +379,6 @@ typedef struct player_s
|
|||
UINT8 gotcontinue; // Got continue from this stage?
|
||||
|
||||
fixed_t speed; // Player's speed (distance formula of MOMX and MOMY values)
|
||||
UINT8 jumping; // Holding down jump button
|
||||
UINT8 secondjump; // Jump counter
|
||||
|
||||
UINT8 fly1; // Tails flying
|
||||
|
|
197
src/dehacked.c
197
src/dehacked.c
|
@ -432,22 +432,20 @@ static void readAnimTex(MYFILE *f, INT32 num)
|
|||
}
|
||||
*/
|
||||
|
||||
static boolean findFreeSlot(INT32 *num, UINT16 wadnum)
|
||||
static boolean findFreeSlot(INT32 *num)
|
||||
{
|
||||
// Send the character select entry to a free slot.
|
||||
while (*num < 32 && (!(PlayerMenu[*num].status & IT_DISABLED) || description[*num].wadnum == wadnum)) // Will kill hidden characters from other files, but that's okay.
|
||||
while (*num < 32 && (description[*num].used))
|
||||
*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;
|
||||
return (description[*num].used = true);
|
||||
}
|
||||
|
||||
// Reads a player.
|
||||
|
@ -479,7 +477,7 @@ static void readPlayer(MYFILE *f, INT32 num)
|
|||
{
|
||||
char *playertext = NULL;
|
||||
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num, f->wad)) == false)
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
goto done;
|
||||
|
||||
for (i = 0; i < MAXLINELEN-3; i++)
|
||||
|
@ -528,7 +526,7 @@ static void readPlayer(MYFILE *f, INT32 num)
|
|||
|
||||
if (fastcmp(word, "PICNAME"))
|
||||
{
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num, f->wad)) == false)
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
goto done;
|
||||
DEH_WriteUndoline(word, &description[num].picname[0], UNDO_NONE);
|
||||
|
||||
|
@ -536,12 +534,6 @@ static void readPlayer(MYFILE *f, INT32 num)
|
|||
}
|
||||
else if (fastcmp(word, "STATUS"))
|
||||
{
|
||||
// Limit the status to only IT_DISABLED and IT_CALL
|
||||
if (i)
|
||||
i = IT_CALL;
|
||||
else
|
||||
i = IT_DISABLED;
|
||||
|
||||
/*
|
||||
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.
|
||||
|
@ -549,15 +541,15 @@ static void readPlayer(MYFILE *f, INT32 num)
|
|||
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.
|
||||
*/
|
||||
if (i != IT_DISABLED && !slotfound && (slotfound = findFreeSlot(&num, f->wad)) == false)
|
||||
if (i && !slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
goto done;
|
||||
DEH_WriteUndoline(word, va("%d", PlayerMenu[num].status), UNDO_NONE);
|
||||
PlayerMenu[num].status = (INT16)i;
|
||||
DEH_WriteUndoline(word, va("%d", description[num].used), UNDO_NONE);
|
||||
description[num].used = (!!i);
|
||||
}
|
||||
else if (fastcmp(word, "SKINNAME"))
|
||||
{
|
||||
// Send to free slot.
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num, f->wad)) == false)
|
||||
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
|
||||
goto done;
|
||||
DEH_WriteUndoline(word, description[num].skinname, UNDO_NONE);
|
||||
|
||||
|
@ -1211,6 +1203,12 @@ static void readlevelheader(MYFILE *f, INT32 num)
|
|||
{
|
||||
deh_strlcpy(mapheaderinfo[num-1]->lvlttl, word2,
|
||||
sizeof(mapheaderinfo[num-1]->lvlttl), va("Level header %d: levelname", num));
|
||||
strlcpy(mapheaderinfo[num-1]->selectheading, word2, sizeof(mapheaderinfo[num-1]->selectheading)); // not deh_ so only complains once
|
||||
}
|
||||
else if (fastcmp(word, "SELECTHEADING"))
|
||||
{
|
||||
deh_strlcpy(mapheaderinfo[num-1]->selectheading, word2,
|
||||
sizeof(mapheaderinfo[num-1]->selectheading), va("Level header %d: selectheading", num));
|
||||
}
|
||||
else if (fastcmp(word, "SCRIPTNAME"))
|
||||
{
|
||||
|
@ -1418,6 +1416,13 @@ static void readlevelheader(MYFILE *f, INT32 num)
|
|||
else
|
||||
mapheaderinfo[num-1]->menuflags &= ~LF2_NOVISITNEEDED;
|
||||
}
|
||||
else if (fastcmp(word, "WIDEICON"))
|
||||
{
|
||||
if (i || word2[0] == 'T' || word2[0] == 'Y')
|
||||
mapheaderinfo[num-1]->menuflags |= LF2_WIDEICON;
|
||||
else
|
||||
mapheaderinfo[num-1]->menuflags &= ~LF2_WIDEICON;
|
||||
}
|
||||
else
|
||||
deh_warning("Level header %d: unknown word '%s'", num, word);
|
||||
}
|
||||
|
@ -2105,6 +2110,7 @@ static void readsound(MYFILE *f, INT32 num, const char *savesfxnames[])
|
|||
{
|
||||
char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL);
|
||||
char *word;
|
||||
char *word2;
|
||||
char *tmp;
|
||||
INT32 value;
|
||||
|
||||
|
@ -2118,8 +2124,8 @@ static void readsound(MYFILE *f, INT32 num, const char *savesfxnames[])
|
|||
tmp = strchr(s, '#');
|
||||
if (tmp)
|
||||
*tmp = '\0';
|
||||
|
||||
value = searchvalue(s);
|
||||
if (s == tmp)
|
||||
continue; // Skip comment lines, but don't break.
|
||||
|
||||
word = strtok(s, " ");
|
||||
if (word)
|
||||
|
@ -2127,6 +2133,15 @@ static void readsound(MYFILE *f, INT32 num, const char *savesfxnames[])
|
|||
else
|
||||
break;
|
||||
|
||||
word2 = strtok(NULL, " ");
|
||||
if (word2)
|
||||
value = atoi(word2);
|
||||
else
|
||||
{
|
||||
deh_warning("No value for token %s", word);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* if (fastcmp(word, "OFFSET"))
|
||||
{
|
||||
value -= 150360;
|
||||
|
@ -2156,6 +2171,11 @@ static void readsound(MYFILE *f, INT32 num, const char *savesfxnames[])
|
|||
DEH_WriteUndoline(word, va("%d", S_sfx[num].pitch), UNDO_NONE);
|
||||
S_sfx[num].pitch = value;
|
||||
}
|
||||
else if (fastcmp(word, "CAPTION") || fastcmp(word, "DESCRIPTION"))
|
||||
{
|
||||
deh_strlcpy(S_sfx[num].caption, word2,
|
||||
sizeof(S_sfx[num].caption), va("Sound effect %d: caption", num));
|
||||
}
|
||||
else
|
||||
deh_warning("Sound %d : unknown word '%s'",num,word);
|
||||
}
|
||||
|
@ -2277,6 +2297,8 @@ static void reademblemdata(MYFILE *f, INT32 num)
|
|||
emblemlocations[num-1].type = ET_NGRADE;
|
||||
else if (fastcmp(word2, "NTIME"))
|
||||
emblemlocations[num-1].type = ET_NTIME;
|
||||
else if (fastcmp(word2, "MAP"))
|
||||
emblemlocations[num-1].type = ET_MAP;
|
||||
else
|
||||
emblemlocations[num-1].type = (UINT8)value;
|
||||
}
|
||||
|
@ -2447,6 +2469,7 @@ static void readunlockable(MYFILE *f, INT32 num)
|
|||
DEH_WriteUndoline("VAR", va("%d", unlockables[num].variable), UNDO_NONE);
|
||||
|
||||
memset(&unlockables[num], 0, sizeof(unlockable_t));
|
||||
unlockables[num].objective[0] = '/';
|
||||
|
||||
do
|
||||
{
|
||||
|
@ -3627,11 +3650,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
|
|||
{
|
||||
if (i == 0 && word2[0] != '0') // If word2 isn't a number
|
||||
i = get_sfx(word2); // find a sound by name
|
||||
if (i < NUMSFX && i >= 0)
|
||||
if (i < NUMSFX && i > 0)
|
||||
readsound(f, i, savesfxnames);
|
||||
else
|
||||
{
|
||||
deh_warning("Sound %d out of range (0 - %d)", i, NUMSFX-1);
|
||||
deh_warning("Sound %d out of range (1 - %d)", i, NUMSFX-1);
|
||||
ignorelines(f);
|
||||
}
|
||||
DEH_WriteUndoline(word, word2, UNDO_HEADER);
|
||||
|
@ -3929,12 +3952,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_PLAY_WAIT",
|
||||
"S_PLAY_WALK",
|
||||
"S_PLAY_RUN",
|
||||
"S_PLAY_PEEL",
|
||||
"S_PLAY_DASH",
|
||||
"S_PLAY_PAIN",
|
||||
"S_PLAY_STUN",
|
||||
"S_PLAY_DEAD",
|
||||
"S_PLAY_DRWN",
|
||||
"S_PLAY_SPIN",
|
||||
"S_PLAY_DASH",
|
||||
"S_PLAY_ROLL",
|
||||
"S_PLAY_GASP",
|
||||
"S_PLAY_JUMP",
|
||||
"S_PLAY_SPRING",
|
||||
|
@ -3942,6 +3965,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_PLAY_EDGE",
|
||||
"S_PLAY_RIDE",
|
||||
|
||||
// CA2_SPINDASH
|
||||
"S_PLAY_SPINDASH",
|
||||
|
||||
// CA_FLY/SWIM
|
||||
"S_PLAY_FLY",
|
||||
"S_PLAY_SWIM",
|
||||
|
@ -3952,30 +3978,25 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_PLAY_CLING",
|
||||
"S_PLAY_CLIMB",
|
||||
|
||||
// CA_FLOAT/CA_SLOWFALL
|
||||
"S_PLAY_FLOAT",
|
||||
"S_PLAY_FLOAT_RUN",
|
||||
|
||||
// CA_BOUNCE
|
||||
"S_PLAY_BOUNCE",
|
||||
"S_PLAY_BOUNCE_LANDING",
|
||||
|
||||
// CA2_GUNSLINGER
|
||||
"S_PLAY_FIRE",
|
||||
"S_PLAY_FIRE_FINISH",
|
||||
|
||||
// CA_TWINSPIN
|
||||
"S_PLAY_TWINSPIN",
|
||||
|
||||
// CA2_MELEE
|
||||
"S_PLAY_MELEE",
|
||||
"S_PLAY_MELEE_FINISH",
|
||||
|
||||
// SF_SUPERANIMS
|
||||
"S_PLAY_SUPER_STND",
|
||||
"S_PLAY_SUPER_WALK",
|
||||
"S_PLAY_SUPER_RUN",
|
||||
"S_PLAY_SUPER_PEEL",
|
||||
"S_PLAY_SUPER_PAIN",
|
||||
"S_PLAY_SUPER_STUN",
|
||||
"S_PLAY_SUPER_DEAD",
|
||||
"S_PLAY_SUPER_DRWN",
|
||||
"S_PLAY_SUPER_SPIN",
|
||||
"S_PLAY_SUPER_GASP",
|
||||
"S_PLAY_SUPER_JUMP",
|
||||
"S_PLAY_SUPER_SPRING",
|
||||
"S_PLAY_SUPER_FALL",
|
||||
"S_PLAY_SUPER_EDGE",
|
||||
"S_PLAY_SUPER_RIDE",
|
||||
"S_PLAY_SUPER_FLOAT",
|
||||
"S_PLAY_MELEE_LANDING",
|
||||
|
||||
// SF_SUPER
|
||||
"S_PLAY_SUPERTRANS1",
|
||||
|
@ -4014,7 +4035,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
|
||||
"S_PLAY_NIGHTS_STAND",
|
||||
"S_PLAY_NIGHTS_FLOAT",
|
||||
"S_PLAY_NIGHTS_PAIN",
|
||||
"S_PLAY_NIGHTS_STUN",
|
||||
"S_PLAY_NIGHTS_PULL",
|
||||
"S_PLAY_NIGHTS_ATTACK",
|
||||
|
||||
|
@ -5194,6 +5215,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
|
||||
// Deep Sea Gargoyle
|
||||
"S_GARGOYLE",
|
||||
"S_BIGGARGOYLE",
|
||||
|
||||
// DSZ Seaweed
|
||||
"S_SEAWEED1",
|
||||
|
@ -5352,7 +5374,14 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
// Xmas-specific stuff
|
||||
"S_XMASPOLE",
|
||||
"S_CANDYCANE",
|
||||
"S_SNOWMAN",
|
||||
"S_SNOWMAN", // normal
|
||||
"S_SNOWMANHAT", // with hat + scarf
|
||||
"S_LAMPPOST1", // normal
|
||||
"S_LAMPPOST2", // with snow
|
||||
"S_HANGSTAR",
|
||||
// Xmas GFZ bushes
|
||||
"S_XMASBERRYBUSH",
|
||||
"S_XMASBUSH",
|
||||
|
||||
// Botanic Serenity's loads of scenery states
|
||||
"S_BSZTALLFLOWER_RED",
|
||||
|
@ -5544,10 +5573,6 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_PITY4",
|
||||
"S_PITY5",
|
||||
"S_PITY6",
|
||||
"S_PITY7",
|
||||
"S_PITY8",
|
||||
"S_PITY9",
|
||||
"S_PITY10",
|
||||
|
||||
"S_FIRS1",
|
||||
"S_FIRS2",
|
||||
|
@ -5939,14 +5964,18 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_FOUR2",
|
||||
"S_FIVE2",
|
||||
|
||||
"S_LOCKON1",
|
||||
"S_LOCKON2",
|
||||
|
||||
// Tag Sign
|
||||
"S_TTAG1",
|
||||
"S_TTAG",
|
||||
|
||||
// Got Flag Sign
|
||||
"S_GOTFLAG1",
|
||||
"S_GOTFLAG2",
|
||||
"S_GOTFLAG3",
|
||||
"S_GOTFLAG4",
|
||||
"S_GOTFLAG",
|
||||
"S_GOTREDFLAG",
|
||||
"S_GOTBLUEFLAG",
|
||||
|
||||
"S_CORK",
|
||||
|
||||
// Red Ring
|
||||
"S_RRNG1",
|
||||
|
@ -6562,6 +6591,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
|||
|
||||
// Deep Sea Scenery
|
||||
"MT_GARGOYLE", // Deep Sea Gargoyle
|
||||
"MT_BIGGARGOYLE", // Deep Sea Gargoyle (Big)
|
||||
"MT_SEAWEED", // DSZ Seaweed
|
||||
"MT_WATERDRIP", // Dripping Water source
|
||||
"MT_WATERDROP", // Water drop from dripping water
|
||||
|
@ -6630,7 +6660,14 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
|||
// Christmas Scenery
|
||||
"MT_XMASPOLE",
|
||||
"MT_CANDYCANE",
|
||||
"MT_SNOWMAN",
|
||||
"MT_SNOWMAN", // normal
|
||||
"MT_SNOWMANHAT", // with hat + scarf
|
||||
"MT_LAMPPOST1", // normal
|
||||
"MT_LAMPPOST2", // with snow
|
||||
"MT_HANGSTAR",
|
||||
// Xmas GFZ bushes
|
||||
"MT_XMASBERRYBUSH",
|
||||
"MT_XMASBUSH",
|
||||
|
||||
// Botanic Serenity
|
||||
"MT_BSZTALLFLOWER_RED",
|
||||
|
@ -6737,9 +6774,9 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
|||
"MT_SCORE", // score logo
|
||||
"MT_DROWNNUMBERS", // Drowning Timer
|
||||
"MT_GOTEMERALD", // Chaos Emerald (intangible)
|
||||
"MT_LOCKON", // Target
|
||||
"MT_TAG", // Tag Sign
|
||||
"MT_GOTFLAG", // Got Flag sign
|
||||
"MT_GOTFLAG2", // Got Flag sign
|
||||
|
||||
// Ambient Sounds
|
||||
"MT_AWATERA", // Ambient Water Sound 1
|
||||
|
@ -6753,6 +6790,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
|||
"MT_RANDOMAMBIENT",
|
||||
"MT_RANDOMAMBIENT2",
|
||||
|
||||
"MT_CORK",
|
||||
|
||||
// Ring Weapons
|
||||
"MT_REDRING",
|
||||
"MT_BOUNCERING",
|
||||
|
@ -6976,10 +7015,8 @@ static const char *const PLAYERFLAG_LIST[] = {
|
|||
// Did you get a time-over?
|
||||
"TIMEOVER",
|
||||
|
||||
// Ready for Super?
|
||||
"SUPERREADY",
|
||||
|
||||
// Character action status
|
||||
"STARTJUMP",
|
||||
"JUMPED",
|
||||
"SPINNING",
|
||||
"STARTDASH",
|
||||
|
@ -6991,12 +7028,11 @@ static const char *const PLAYERFLAG_LIST[] = {
|
|||
// Sliding (usually in water) like Labyrinth/Oil Ocean
|
||||
"SLIDING",
|
||||
|
||||
/*** NIGHTS STUFF ***/
|
||||
// Is the player in NiGHTS mode?
|
||||
"NIGHTSMODE",
|
||||
"TRANSFERTOCLOSEST",
|
||||
// Bouncing
|
||||
"BOUNCING",
|
||||
|
||||
// Spill rings after falling
|
||||
/*** NIGHTS STUFF ***/
|
||||
"TRANSFERTOCLOSEST",
|
||||
"NIGHTSFALL",
|
||||
"DRILLING",
|
||||
"SKIDDOWN",
|
||||
|
@ -7010,7 +7046,7 @@ static const char *const PLAYERFLAG_LIST[] = {
|
|||
"ANALOGMODE", // Analog mode?
|
||||
"CANCARRY", // Can carry?
|
||||
"SHIELDABILITY", // Thokked with shield ability
|
||||
"FORCEJUMPDAMAGE", // Force jump damage
|
||||
"NOJUMPDAMAGE", // No jump damage
|
||||
|
||||
NULL // stop loop here.
|
||||
};
|
||||
|
@ -7159,8 +7195,7 @@ static const char *const POWERS_LIST[] = {
|
|||
"NIGHTS_LINKFREEZE",
|
||||
|
||||
//for linedef exec 427
|
||||
"NOCONTROL",
|
||||
"INGOOP" // In goop
|
||||
"NOCONTROL"
|
||||
};
|
||||
|
||||
static const char *const HUDITEMS_LIST[] = {
|
||||
|
@ -7252,14 +7287,15 @@ struct {
|
|||
|
||||
// Frame settings
|
||||
{"FF_FRAMEMASK",FF_FRAMEMASK},
|
||||
{"FF_VERTICALFLIP",FF_VERTICALFLIP},
|
||||
{"FF_PAPERSPRITE",FF_PAPERSPRITE},
|
||||
{"FF_SPR2SUPER",FF_SPR2SUPER},
|
||||
{"FF_SPR2ENDSTATE",FF_SPR2ENDSTATE},
|
||||
{"FF_SPR2MIDSTART",FF_SPR2MIDSTART},
|
||||
{"FF_ANIMATE",FF_ANIMATE},
|
||||
{"FF_RANDOMANIM",FF_RANDOMANIM},
|
||||
{"FF_GLOBALANIM",FF_GLOBALANIM},
|
||||
{"FF_FULLBRIGHT",FF_FULLBRIGHT},
|
||||
{"FF_VERTICALFLIP",FF_VERTICALFLIP},
|
||||
{"FF_PAPERSPRITE",FF_PAPERSPRITE},
|
||||
{"FF_TRANSMASK",FF_TRANSMASK},
|
||||
{"FF_TRANSSHIFT",FF_TRANSSHIFT},
|
||||
// new preshifted translucency (used in source)
|
||||
|
@ -7322,6 +7358,7 @@ struct {
|
|||
{"LF2_RECORDATTACK",LF2_RECORDATTACK},
|
||||
{"LF2_NIGHTSATTACK",LF2_NIGHTSATTACK},
|
||||
{"LF2_NOVISITNEEDED",LF2_NOVISITNEEDED},
|
||||
{"LF2_WIDEICON",LF2_WIDEICON},
|
||||
|
||||
// NiGHTS grades
|
||||
{"GRADE_F",GRADE_F},
|
||||
|
@ -7383,6 +7420,8 @@ struct {
|
|||
{"CR_NONE",CR_NONE},
|
||||
{"CR_GENERIC",CR_GENERIC},
|
||||
{"CR_PLAYER",CR_PLAYER},
|
||||
{"CR_NIGHTSMODE",CR_NIGHTSMODE},
|
||||
{"CR_BRAKGOOP",CR_BRAKGOOP},
|
||||
{"CR_ZOOMTUBE",CR_ZOOMTUBE},
|
||||
{"CR_ROPEHANG",CR_ROPEHANG},
|
||||
{"CR_MACESPIN",CR_MACESPIN},
|
||||
|
@ -7398,8 +7437,8 @@ struct {
|
|||
|
||||
// Character flags (skinflags_t)
|
||||
{"SF_SUPER",SF_SUPER},
|
||||
{"SF_SUPERANIMS",SF_SUPERANIMS},
|
||||
{"SF_SUPERSPIN",SF_SUPERSPIN},
|
||||
{"SF_NOSUPERSPIN",SF_NOSUPERSPIN},
|
||||
{"SF_NOSPINDASHDUST",SF_NOSPINDASHDUST},
|
||||
{"SF_HIRES",SF_HIRES},
|
||||
{"SF_NOSKID",SF_NOSKID},
|
||||
{"SF_NOSPEEDADJUST",SF_NOSPEEDADJUST},
|
||||
|
@ -7409,7 +7448,9 @@ struct {
|
|||
{"SF_STOMPDAMAGE",SF_STOMPDAMAGE},
|
||||
{"SF_MARIODAMAGE",SF_MARIODAMAGE},
|
||||
{"SF_MACHINE",SF_MACHINE},
|
||||
{"SF_NOSPINDASHDUST",SF_NOSPINDASHDUST},
|
||||
{"SF_DASHMODE",SF_DASHMODE},
|
||||
{"SF_FASTEDGE",SF_FASTEDGE},
|
||||
{"SF_MULTIABILITY",SF_MULTIABILITY},
|
||||
|
||||
// Character abilities!
|
||||
// Primary
|
||||
|
@ -7427,12 +7468,12 @@ struct {
|
|||
{"CA_JUMPBOOST",CA_JUMPBOOST},
|
||||
{"CA_AIRDRILL",CA_AIRDRILL},
|
||||
{"CA_JUMPTHOK",CA_JUMPTHOK},
|
||||
{"CA_DASHMODE",CA_DASHMODE},
|
||||
{"CA_BOUNCE",CA_BOUNCE},
|
||||
{"CA_TWINSPIN",CA_TWINSPIN},
|
||||
// Secondary
|
||||
{"CA2_NONE",CA2_NONE}, // now slot 0!
|
||||
{"CA2_SPINDASH",CA2_SPINDASH},
|
||||
{"CA2_MULTIABILITY",CA2_MULTIABILITY},
|
||||
{"CA2_GUNSLINGER",CA2_GUNSLINGER},
|
||||
{"CA2_MELEE",CA2_MELEE},
|
||||
|
||||
// Sound flags
|
||||
|
@ -7443,7 +7484,12 @@ struct {
|
|||
{"SF_X8AWAYSOUND",SF_X8AWAYSOUND},
|
||||
{"SF_NOINTERRUPT",SF_NOINTERRUPT},
|
||||
{"SF_X2AWAYSOUND",SF_X2AWAYSOUND},
|
||||
|
||||
|
||||
// Map emblem var flags
|
||||
{"ME_ALLEMERALDS",ME_ALLEMERALDS},
|
||||
{"ME_ULTIMATE",ME_ULTIMATE},
|
||||
{"ME_PERFECT",ME_PERFECT},
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
// p_local.h constants
|
||||
{"FLOATSPEED",FLOATSPEED},
|
||||
|
@ -7496,7 +7542,7 @@ struct {
|
|||
{"PA_EDGE",PA_EDGE},
|
||||
{"PA_WALK",PA_WALK},
|
||||
{"PA_RUN",PA_RUN},
|
||||
{"PA_PEEL",PA_PEEL},
|
||||
{"PA_DASH",PA_DASH},
|
||||
{"PA_PAIN",PA_PAIN},
|
||||
{"PA_ROLL",PA_ROLL},
|
||||
{"PA_JUMP",PA_JUMP},
|
||||
|
@ -7685,6 +7731,7 @@ struct {
|
|||
{"V_70TRANS",V_70TRANS},
|
||||
{"V_80TRANS",V_80TRANS},
|
||||
{"V_90TRANS",V_90TRANS},
|
||||
{"V_STATIC",V_STATIC},
|
||||
{"V_HUDTRANSHALF",V_HUDTRANSHALF},
|
||||
{"V_HUDTRANS",V_HUDTRANS},
|
||||
{"V_HUDTRANSDOUBLE",V_HUDTRANSDOUBLE},
|
||||
|
|
|
@ -90,6 +90,10 @@ static unsigned long nombre = NEWTICRATE*10;
|
|||
static void I_BlitScreenVesa1(void); //see later
|
||||
void I_FinishUpdate (void)
|
||||
{
|
||||
// draw captions if enabled
|
||||
if (cv_closedcaptioning.value)
|
||||
SCR_ClosedCaptions();
|
||||
|
||||
// draw FPS if enabled
|
||||
if (cv_ticrate.value)
|
||||
SCR_DisplayTicRate();
|
||||
|
|
|
@ -222,7 +222,7 @@ extern FILE *logstream;
|
|||
// NOTE: it needs more than this to increase the number of players...
|
||||
|
||||
#define MAXPLAYERS 32
|
||||
#define MAXSKINS MAXPLAYERS
|
||||
#define MAXSKINS 32
|
||||
#define PLAYERSMASK (MAXPLAYERS-1)
|
||||
#define MAXPLAYERNAME 21
|
||||
|
||||
|
@ -543,4 +543,7 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
|||
/// Experimental attempts at preventing MF_PAPERCOLLISION objects from getting stuck in walls.
|
||||
//#define PAPER_COLLISIONCORRECTION
|
||||
|
||||
/// Hudname padding.
|
||||
#define SKINNAMEPADDING
|
||||
|
||||
#endif // __DOOMDEF__
|
||||
|
|
|
@ -244,6 +244,8 @@ typedef struct
|
|||
UINT8 levelflags; ///< LF_flags: merged eight booleans into one UINT8 for space, see below
|
||||
UINT8 menuflags; ///< LF2_flags: options that affect record attack / nights mode menus
|
||||
|
||||
char selectheading[22]; ///< Level select heading. Allows for controllable grouping.
|
||||
|
||||
// Freed animals stuff.
|
||||
UINT8 numFlickies; ///< Internal. For freed flicky support.
|
||||
mobjtype_t *flickies; ///< List of freeable flickies in this level. Allocated dynamically for space reasons. Be careful.
|
||||
|
@ -270,6 +272,7 @@ typedef struct
|
|||
#define LF2_RECORDATTACK 4 ///< Show this map in Time Attack
|
||||
#define LF2_NIGHTSATTACK 8 ///< Show this map in NiGHTS mode menu
|
||||
#define LF2_NOVISITNEEDED 16 ///< Available in time attack/nights mode without visiting the level
|
||||
#define LF2_WIDEICON 32 ///< If you're in a circumstance where it fits, use a wide map icon
|
||||
|
||||
extern mapheader_t* mapheaderinfo[NUMMAPS];
|
||||
|
||||
|
@ -314,7 +317,7 @@ enum GameType
|
|||
|
||||
NUMGAMETYPES
|
||||
};
|
||||
// If you alter this list, update gametype_cons_t in m_menu.c
|
||||
// If you alter this list, update dehacked.c, and gametype_cons_t and MISC_ChangeGameTypeMenu in m_menu.c
|
||||
|
||||
extern tic_t totalplaytime;
|
||||
|
||||
|
@ -379,6 +382,7 @@ nightsdata_t ntemprecords;
|
|||
|
||||
extern UINT32 token; ///< Number of tokens collected in a level
|
||||
extern UINT32 tokenlist; ///< List of tokens collected
|
||||
extern boolean gottoken; ///< Did you get a token? Used for end of act
|
||||
extern INT32 tokenbits; ///< Used for setting token bits
|
||||
extern INT32 sstimer; ///< Time allotted in the special stage
|
||||
extern UINT32 bluescore; ///< Blue Team Scores
|
||||
|
@ -452,19 +456,17 @@ extern mapthing_t *redctfstarts[MAXPLAYERS]; // CTF
|
|||
|
||||
#if defined (macintosh)
|
||||
#define DEBFILE(msg) I_OutputMsg(msg)
|
||||
extern FILE *debugfile;
|
||||
#else
|
||||
#define DEBUGFILE
|
||||
#ifdef DEBUGFILE
|
||||
#define DEBFILE(msg) { if (debugfile) { fputs(msg, debugfile); fflush(debugfile); } }
|
||||
extern FILE *debugfile;
|
||||
#else
|
||||
#define DEBFILE(msg) {}
|
||||
extern FILE *debugfile;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef DEBUGFILE
|
||||
extern FILE *debugfile;
|
||||
extern INT32 debugload;
|
||||
#endif
|
||||
|
||||
|
|
|
@ -437,7 +437,6 @@ void F_StartIntro(void)
|
|||
|
||||
G_SetGamestate(GS_INTRO);
|
||||
gameaction = ga_nothing;
|
||||
playerdeadview = false;
|
||||
paused = false;
|
||||
CON_ToggleOff();
|
||||
CON_ClearHUD();
|
||||
|
@ -1128,7 +1127,6 @@ void F_StartCredits(void)
|
|||
}
|
||||
|
||||
gameaction = ga_nothing;
|
||||
playerdeadview = false;
|
||||
paused = false;
|
||||
CON_ToggleOff();
|
||||
CON_ClearHUD();
|
||||
|
@ -1275,7 +1273,6 @@ void F_StartGameEvaluation(void)
|
|||
G_SaveGame((UINT32)cursaveslot);
|
||||
|
||||
gameaction = ga_nothing;
|
||||
playerdeadview = false;
|
||||
paused = false;
|
||||
CON_ToggleOff();
|
||||
CON_ClearHUD();
|
||||
|
@ -1386,7 +1383,6 @@ void F_StartGameEnd(void)
|
|||
G_SetGamestate(GS_GAMEEND);
|
||||
|
||||
gameaction = ga_nothing;
|
||||
playerdeadview = false;
|
||||
paused = false;
|
||||
CON_ToggleOff();
|
||||
CON_ClearHUD();
|
||||
|
@ -1690,7 +1686,6 @@ void F_StartContinue(void)
|
|||
gameaction = ga_nothing;
|
||||
|
||||
keypressed = false;
|
||||
playerdeadview = false;
|
||||
paused = false;
|
||||
CON_ToggleOff();
|
||||
CON_ClearHUD();
|
||||
|
@ -1859,7 +1854,6 @@ void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean reset
|
|||
G_SetGamestate(GS_CUTSCENE);
|
||||
|
||||
gameaction = ga_nothing;
|
||||
playerdeadview = false;
|
||||
paused = false;
|
||||
CON_ToggleOff();
|
||||
|
||||
|
|
|
@ -86,7 +86,7 @@ INT32 lastwipetic = 0;
|
|||
static UINT8 *wipe_scr_start; //screen 3
|
||||
static UINT8 *wipe_scr_end; //screen 4
|
||||
static UINT8 *wipe_scr; //screen 0 (main drawing)
|
||||
static fixed_t paldiv;
|
||||
static fixed_t paldiv = 0;
|
||||
|
||||
/** Create fademask_t from lump
|
||||
*
|
||||
|
@ -145,7 +145,7 @@ static fademask_t *F_GetFadeMask(UINT8 masknum, UINT8 scrnnum) {
|
|||
while (lsize--)
|
||||
{
|
||||
// Determine pixel to use from fademask
|
||||
pcolor = &pLocalPalette[*lump++];
|
||||
pcolor = &pMasterPalette[*lump++];
|
||||
*mask++ = FixedDiv((pcolor->s.red+1)<<FRACBITS, paldiv)>>FRACBITS;
|
||||
}
|
||||
|
||||
|
@ -337,7 +337,8 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
|
|||
UINT8 wipeframe = 0;
|
||||
fademask_t *fmask;
|
||||
|
||||
paldiv = FixedDiv(257<<FRACBITS, 11<<FRACBITS);
|
||||
if (!paldiv)
|
||||
paldiv = FixedDiv(257<<FRACBITS, 11<<FRACBITS);
|
||||
|
||||
// Init the wipe
|
||||
WipeInAction = true;
|
||||
|
|
128
src/g_game.c
128
src/g_game.c
|
@ -159,6 +159,7 @@ UINT8 stagefailed; // Used for GEMS BONUS? Also to see if you beat the stage.
|
|||
UINT16 emeralds;
|
||||
UINT32 token; // Number of tokens collected in a level
|
||||
UINT32 tokenlist; // List of tokens collected
|
||||
boolean gottoken; // Did you get a token? Used for end of act
|
||||
INT32 tokenbits; // Used for setting token bits
|
||||
|
||||
// Old Special Stage
|
||||
|
@ -700,8 +701,7 @@ void G_SetNightsRecords(void)
|
|||
free(gpath);
|
||||
|
||||
// If the mare count changed, this will update the score display
|
||||
CV_AddValue(&cv_nextmap, 1);
|
||||
CV_AddValue(&cv_nextmap, -1);
|
||||
Nextmap_OnChange();
|
||||
}
|
||||
|
||||
// for consistency among messages: this modifies the game and removes savemoddata.
|
||||
|
@ -1015,14 +1015,13 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics)
|
|||
if (turnleft)
|
||||
cmd->angleturn = (INT16)(cmd->angleturn + angleturn[tspeed]);
|
||||
}
|
||||
if (cv_analog.value || twodlevel
|
||||
if (twodlevel
|
||||
|| (player->mo && (player->mo->flags2 & MF2_TWOD))
|
||||
|| (!demoplayback && (player->climbing
|
||||
|| (player->pflags & PF_NIGHTSMODE)
|
||||
|| (player->pflags & PF_SLIDING)
|
||||
|| (player->pflags & PF_FORCESTRAFE)))) // Analog
|
||||
|| (player->powers[pw_carry] == CR_NIGHTSMODE)
|
||||
|| (player->pflags & (PF_SLIDING|PF_FORCESTRAFE))))) // Analog
|
||||
forcestrafe = true;
|
||||
if (forcestrafe) // Analog
|
||||
if (forcestrafe)
|
||||
{
|
||||
if (turnright)
|
||||
side += sidemove[speed];
|
||||
|
@ -1035,6 +1034,13 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics)
|
|||
side += ((axis * sidemove[1]) >> 10);
|
||||
}
|
||||
}
|
||||
else if (cv_analog.value) // Analog
|
||||
{
|
||||
if (turnright)
|
||||
cmd->buttons |= BT_CAMRIGHT;
|
||||
if (turnleft)
|
||||
cmd->buttons |= BT_CAMLEFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (turnright)
|
||||
|
@ -1122,15 +1128,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics)
|
|||
if (PLAYER1INPUTDOWN(gc_use))
|
||||
cmd->buttons |= BT_USE;
|
||||
|
||||
// Camera Controls
|
||||
if (cv_debug || cv_analog.value || demoplayback || objectplacing || player->pflags & PF_NIGHTSMODE)
|
||||
{
|
||||
if (PLAYER1INPUTDOWN(gc_camleft))
|
||||
cmd->buttons |= BT_CAMLEFT;
|
||||
if (PLAYER1INPUTDOWN(gc_camright))
|
||||
cmd->buttons |= BT_CAMRIGHT;
|
||||
}
|
||||
|
||||
if (PLAYER1INPUTDOWN(gc_camreset))
|
||||
{
|
||||
if (camera.chase && !resetdown)
|
||||
|
@ -1192,10 +1189,19 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics)
|
|||
if (!mouseaiming && cv_mousemove.value)
|
||||
forward += mousey;
|
||||
|
||||
if (cv_analog.value ||
|
||||
(!demoplayback && (player->climbing
|
||||
if ((!demoplayback && (player->climbing
|
||||
|| (player->pflags & PF_SLIDING)))) // Analog for mouse
|
||||
side += mousex*2;
|
||||
else if (cv_analog.value)
|
||||
{
|
||||
if (mousex)
|
||||
{
|
||||
if (mousex > 0)
|
||||
cmd->buttons |= BT_CAMRIGHT;
|
||||
else
|
||||
cmd->buttons |= BT_CAMLEFT;
|
||||
}
|
||||
}
|
||||
else
|
||||
cmd->angleturn = (INT16)(cmd->angleturn - (mousex*8));
|
||||
|
||||
|
@ -1230,9 +1236,10 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics)
|
|||
cmd->sidemove = (SINT8)(cmd->sidemove + side);
|
||||
|
||||
if (cv_analog.value) {
|
||||
cmd->angleturn = (INT16)(thiscam->angle >> 16);
|
||||
if (player->awayviewtics)
|
||||
cmd->angleturn = (INT16)(player->awayviewmobj->angle >> 16);
|
||||
else
|
||||
cmd->angleturn = (INT16)(thiscam->angle >> 16);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1306,12 +1313,11 @@ void G_BuildTiccmd2(ticcmd_t *cmd, INT32 realtics)
|
|||
if (turnleft)
|
||||
cmd->angleturn = (INT16)(cmd->angleturn + angleturn[tspeed]);
|
||||
}
|
||||
if (cv_analog2.value || twodlevel
|
||||
if (twodlevel
|
||||
|| (player->mo && (player->mo->flags2 & MF2_TWOD))
|
||||
|| player->climbing
|
||||
|| (player->pflags & PF_NIGHTSMODE)
|
||||
|| (player->pflags & PF_SLIDING)
|
||||
|| (player->pflags & PF_FORCESTRAFE)) // Analog
|
||||
|| (player->powers[pw_carry] == CR_NIGHTSMODE)
|
||||
|| (player->pflags & (PF_SLIDING|PF_FORCESTRAFE))) // Analog
|
||||
forcestrafe = true;
|
||||
if (forcestrafe) // Analog
|
||||
{
|
||||
|
@ -1326,6 +1332,13 @@ void G_BuildTiccmd2(ticcmd_t *cmd, INT32 realtics)
|
|||
side += ((axis * sidemove[1]) >> 10);
|
||||
}
|
||||
}
|
||||
else if (cv_analog2.value) // Analog
|
||||
{
|
||||
if (turnright)
|
||||
cmd->buttons |= BT_CAMRIGHT;
|
||||
if (turnleft)
|
||||
cmd->buttons |= BT_CAMLEFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (turnright)
|
||||
|
@ -1410,15 +1423,6 @@ void G_BuildTiccmd2(ticcmd_t *cmd, INT32 realtics)
|
|||
if (PLAYER2INPUTDOWN(gc_use))
|
||||
cmd->buttons |= BT_USE;
|
||||
|
||||
// Camera Controls
|
||||
if (cv_debug || cv_analog2.value || player->pflags & PF_NIGHTSMODE)
|
||||
{
|
||||
if (PLAYER2INPUTDOWN(gc_camleft))
|
||||
cmd->buttons |= BT_CAMLEFT;
|
||||
if (PLAYER2INPUTDOWN(gc_camright))
|
||||
cmd->buttons |= BT_CAMRIGHT;
|
||||
}
|
||||
|
||||
if (PLAYER2INPUTDOWN(gc_camreset))
|
||||
{
|
||||
if (camera2.chase && !resetdown)
|
||||
|
@ -1480,9 +1484,19 @@ void G_BuildTiccmd2(ticcmd_t *cmd, INT32 realtics)
|
|||
if (!mouseaiming && cv_mousemove2.value)
|
||||
forward += mouse2y;
|
||||
|
||||
if (cv_analog2.value || player->climbing
|
||||
if (player->climbing
|
||||
|| (player->pflags & PF_SLIDING)) // Analog for mouse
|
||||
side += mouse2x*2;
|
||||
else if (cv_analog2.value)
|
||||
{
|
||||
if (mouse2x)
|
||||
{
|
||||
if (mouse2x > 0)
|
||||
cmd->buttons |= BT_CAMRIGHT;
|
||||
else
|
||||
cmd->buttons |= BT_CAMLEFT;
|
||||
}
|
||||
}
|
||||
else
|
||||
cmd->angleturn = (INT16)(cmd->angleturn - (mouse2x*8));
|
||||
|
||||
|
@ -1530,9 +1544,10 @@ void G_BuildTiccmd2(ticcmd_t *cmd, INT32 realtics)
|
|||
}
|
||||
|
||||
if (cv_analog2.value) {
|
||||
cmd->angleturn = (INT16)(thiscam->angle >> 16);
|
||||
if (player->awayviewtics)
|
||||
cmd->angleturn = (INT16)(player->awayviewmobj->angle >> 16);
|
||||
else
|
||||
cmd->angleturn = (INT16)(thiscam->angle >> 16);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1569,11 +1584,6 @@ static void Analog_OnChange(void)
|
|||
|
||||
// cameras are not initialized at this point
|
||||
|
||||
if (leveltime > 1)
|
||||
CV_SetValue(&cv_cam_dist, 128);
|
||||
if (cv_analog.value || demoplayback)
|
||||
CV_SetValue(&cv_cam_dist, 192);
|
||||
|
||||
if (!cv_chasecam.value && cv_analog.value) {
|
||||
CV_SetValue(&cv_analog, 0);
|
||||
return;
|
||||
|
@ -1594,11 +1604,6 @@ static void Analog2_OnChange(void)
|
|||
|
||||
// cameras are not initialized at this point
|
||||
|
||||
if (leveltime > 1)
|
||||
CV_SetValue(&cv_cam2_dist, 128);
|
||||
if (cv_analog2.value)
|
||||
CV_SetValue(&cv_cam2_dist, 192);
|
||||
|
||||
if (!cv_chasecam2.value && cv_analog2.value) {
|
||||
CV_SetValue(&cv_analog2, 0);
|
||||
return;
|
||||
|
@ -2086,6 +2091,7 @@ void G_PlayerReborn(INT32 player)
|
|||
UINT8 mare;
|
||||
UINT8 skincolor;
|
||||
INT32 skin;
|
||||
UINT32 availabilities;
|
||||
tic_t jointime;
|
||||
boolean spectator;
|
||||
INT16 bot;
|
||||
|
@ -2110,6 +2116,7 @@ void G_PlayerReborn(INT32 player)
|
|||
|
||||
skincolor = players[player].skincolor;
|
||||
skin = players[player].skin;
|
||||
availabilities = players[player].availabilities;
|
||||
camerascale = players[player].camerascale;
|
||||
shieldscale = players[player].shieldscale;
|
||||
charability = players[player].charability;
|
||||
|
@ -2155,6 +2162,7 @@ void G_PlayerReborn(INT32 player)
|
|||
// save player config truth reborn
|
||||
p->skincolor = skincolor;
|
||||
p->skin = skin;
|
||||
p->availabilities = availabilities;
|
||||
p->camerascale = camerascale;
|
||||
p->shieldscale = shieldscale;
|
||||
p->charability = charability;
|
||||
|
@ -2777,7 +2785,6 @@ static INT16 RandMap(INT16 tolflags, INT16 pprevmap)
|
|||
static void G_DoCompleted(void)
|
||||
{
|
||||
INT32 i;
|
||||
boolean gottoken = false;
|
||||
|
||||
tokenlist = 0; // Reset the list
|
||||
|
||||
|
@ -2863,10 +2870,9 @@ static void G_DoCompleted(void)
|
|||
if (nextmap >= 1100-1 && nextmap <= 1102-1 && (gametype == GT_RACE || gametype == GT_COMPETITION))
|
||||
nextmap = (INT16)(spstage_start-1);
|
||||
|
||||
if (gametype == GT_COOP && token)
|
||||
if ((gottoken = (gametype == GT_COOP && token)))
|
||||
{
|
||||
token--;
|
||||
gottoken = true;
|
||||
|
||||
if (!(emeralds & EMERALD1))
|
||||
nextmap = (INT16)(sstage_start - 1); // Special Stage 1
|
||||
|
@ -3545,7 +3551,7 @@ void G_DeferedInitNew(boolean pultmode, const char *mapname, INT32 pickedchar, b
|
|||
// This is the map command interpretation something like Command_Map_f
|
||||
//
|
||||
// called at: map cmd execution, doloadgame, doplaydemo
|
||||
void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean skipprecutscene)
|
||||
void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean skipprecutscene, boolean FLS)
|
||||
{
|
||||
INT32 i;
|
||||
|
||||
|
@ -3575,7 +3581,8 @@ void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean
|
|||
|
||||
if (netgame || multiplayer)
|
||||
{
|
||||
players[i].lives = cv_startinglives.value;
|
||||
if (!FLS || (players[i].lives < cv_startinglives.value))
|
||||
players[i].lives = cv_startinglives.value;
|
||||
players[i].continues = 0;
|
||||
}
|
||||
else if (pultmode)
|
||||
|
@ -3589,13 +3596,16 @@ void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean
|
|||
players[i].continues = 1;
|
||||
}
|
||||
|
||||
if (!((netgame || multiplayer) && (FLS)))
|
||||
players[i].score = 0;
|
||||
|
||||
// The latter two should clear by themselves, but just in case
|
||||
players[i].pflags &= ~(PF_TAGIT|PF_TAGGED|PF_FULLSTASIS);
|
||||
|
||||
// Clear cheatcodes too, just in case.
|
||||
players[i].pflags &= ~(PF_GODMODE|PF_NOCLIP|PF_INVIS);
|
||||
|
||||
players[i].score = players[i].xtralife = 0;
|
||||
players[i].xtralife = 0;
|
||||
}
|
||||
|
||||
// Reset unlockable triggers
|
||||
|
@ -3629,7 +3639,6 @@ void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean
|
|||
mapmusflags |= MUSIC_RELOADRESET;
|
||||
|
||||
ultimatemode = pultmode;
|
||||
playerdeadview = false;
|
||||
automapactive = false;
|
||||
imcontinuing = false;
|
||||
|
||||
|
@ -3657,6 +3666,9 @@ char *G_BuildMapTitle(INT32 mapnum)
|
|||
{
|
||||
char *title = NULL;
|
||||
|
||||
if (!mapheaderinfo[mapnum-1])
|
||||
P_AllocMapHeader(mapnum-1);
|
||||
|
||||
if (strcmp(mapheaderinfo[mapnum-1]->lvlttl, ""))
|
||||
{
|
||||
size_t len = 1;
|
||||
|
@ -3924,12 +3936,8 @@ void G_WriteGhostTic(mobj_t *ghost)
|
|||
if (!(demoflags & DF_GHOST))
|
||||
return; // No ghost data to write.
|
||||
|
||||
if (ghost->player && ghost->player->pflags & PF_NIGHTSMODE && ghost->tracer)
|
||||
{
|
||||
// We're talking about the NiGHTS thing, not the normal platforming thing!
|
||||
if (ghost->player && ghost->player->powers[pw_carry] == CR_NIGHTSMODE) // We're talking about the NiGHTS thing, not the normal platforming thing!
|
||||
ziptic |= GZT_NIGHTS;
|
||||
ghost = ghost->tracer;
|
||||
}
|
||||
|
||||
ziptic_p = demo_p++; // the ziptic, written at the end of this function
|
||||
|
||||
|
@ -4111,11 +4119,9 @@ void G_ConsGhostTic(void)
|
|||
demo_p++;
|
||||
if (ziptic & GZT_SPR2)
|
||||
demo_p++;
|
||||
if(ziptic & GZT_NIGHTS) {
|
||||
if (!testmo->player || !(testmo->player->pflags & PF_NIGHTSMODE) || !testmo->tracer)
|
||||
if (ziptic & GZT_NIGHTS) {
|
||||
if (!testmo->player || !(testmo->player->powers[pw_carry] == CR_NIGHTSMODE))
|
||||
nightsfail = true;
|
||||
else
|
||||
testmo = testmo->tracer;
|
||||
}
|
||||
|
||||
if (ziptic & GZT_EXTRA)
|
||||
|
@ -5146,7 +5152,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
memset(playeringame,0,sizeof(playeringame));
|
||||
playeringame[0] = true;
|
||||
P_SetRandSeed(randseed);
|
||||
G_InitNew(false, G_BuildMapName(gamemap), true, true);
|
||||
G_InitNew(false, G_BuildMapName(gamemap), true, true, false);
|
||||
|
||||
// Set skin
|
||||
SetPlayerSkin(0, skin);
|
||||
|
|
|
@ -56,6 +56,9 @@ extern INT16 rw_maximums[NUM_WEAPONS];
|
|||
// used in game menu
|
||||
extern consvar_t cv_crosshair, cv_crosshair2;
|
||||
extern consvar_t cv_invertmouse, cv_alwaysfreelook, cv_mousemove;
|
||||
extern consvar_t cv_invertmouse2, cv_alwaysfreelook2, cv_mousemove2;
|
||||
extern consvar_t cv_useranalog, cv_useranalog2;
|
||||
extern consvar_t cv_analog, cv_analog2;
|
||||
extern consvar_t cv_sideaxis,cv_turnaxis,cv_moveaxis,cv_lookaxis,cv_fireaxis,cv_firenaxis;
|
||||
extern consvar_t cv_sideaxis2,cv_turnaxis2,cv_moveaxis2,cv_lookaxis2,cv_fireaxis2,cv_firenaxis2;
|
||||
extern consvar_t cv_ghost_bestscore, cv_ghost_besttime, cv_ghost_bestrings, cv_ghost_last, cv_ghost_guest;
|
||||
|
@ -89,7 +92,7 @@ void G_ChangePlayerReferences(mobj_t *oldmo, mobj_t *newmo);
|
|||
void G_DoReborn(INT32 playernum);
|
||||
void G_PlayerReborn(INT32 player);
|
||||
void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer,
|
||||
boolean skipprecutscene);
|
||||
boolean skipprecutscene, boolean FLS);
|
||||
char *G_BuildMapTitle(INT32 mapnum);
|
||||
|
||||
// XMOD spawning
|
||||
|
|
|
@ -25,10 +25,10 @@ static CV_PossibleValue_t mousesens_cons_t[] = {{1, "MIN"}, {MAXMOUSESENSITIVITY
|
|||
static CV_PossibleValue_t onecontrolperkey_cons_t[] = {{1, "One"}, {2, "Several"}, {0, NULL}};
|
||||
|
||||
// mouse values are used once
|
||||
consvar_t cv_mousesens = {"mousesens", "35", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_mousesens2 = {"mousesens2", "35", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_mouseysens = {"mouseysens", "35", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_mouseysens2 = {"mouseysens2", "35", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_mousesens = {"mousesens", "12", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_mousesens2 = {"mousesens2", "12", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_mouseysens = {"mouseysens", "12", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_mouseysens2 = {"mouseysens2", "12", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_controlperkey = {"controlperkey", "One", CV_SAVE, onecontrolperkey_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
INT32 mousex, mousey;
|
||||
|
@ -977,8 +977,6 @@ static const char *gamecontrolname[num_gamecontrols] =
|
|||
"tossflag",
|
||||
"use",
|
||||
"camtoggle",
|
||||
"camleft",
|
||||
"camright",
|
||||
"camreset",
|
||||
"lookup",
|
||||
"lookdown",
|
||||
|
@ -1074,8 +1072,6 @@ void G_Controldefault(void)
|
|||
gamecontrol[gc_use ][0] = KEY_JOY1+1; //B
|
||||
gamecontrol[gc_use ][1] = '.';
|
||||
gamecontrol[gc_camtoggle ][1] = ',';
|
||||
gamecontrol[gc_camleft ][0] = 'o';
|
||||
gamecontrol[gc_camright ][0] = 'p';
|
||||
gamecontrol[gc_camreset ][0] = 'c';
|
||||
gamecontrol[gc_lookup ][0] = KEY_PGUP;
|
||||
gamecontrol[gc_lookdown ][0] = KEY_PGDN;
|
||||
|
@ -1154,10 +1150,8 @@ void G_Controldefault(void)
|
|||
#else
|
||||
void G_Controldefault(void)
|
||||
{
|
||||
gamecontrol[gc_forward ][0] = KEY_UPARROW;
|
||||
gamecontrol[gc_forward ][1] = 'w';
|
||||
gamecontrol[gc_backward ][0] = KEY_DOWNARROW;
|
||||
gamecontrol[gc_backward ][1] = 's';
|
||||
gamecontrol[gc_forward ][0] = 'w';
|
||||
gamecontrol[gc_backward ][0] = 's';
|
||||
gamecontrol[gc_strafeleft ][0] = 'a';
|
||||
gamecontrol[gc_straferight][0] = 'd';
|
||||
gamecontrol[gc_turnleft ][0] = KEY_LEFTARROW;
|
||||
|
@ -1178,19 +1172,16 @@ void G_Controldefault(void)
|
|||
gamecontrol[gc_fire ][1] = KEY_MOUSE1+0;
|
||||
gamecontrol[gc_firenormal ][0] = 'c';
|
||||
gamecontrol[gc_tossflag ][0] = '\'';
|
||||
gamecontrol[gc_use ][0] = 'x';
|
||||
gamecontrol[gc_use ][0] = KEY_LSHIFT;
|
||||
gamecontrol[gc_camtoggle ][0] = 'v';
|
||||
gamecontrol[gc_camleft ][0] = '[';
|
||||
gamecontrol[gc_camright ][0] = ']';
|
||||
gamecontrol[gc_camreset ][0] = 'r';
|
||||
gamecontrol[gc_lookup ][0] = KEY_PGUP;
|
||||
gamecontrol[gc_lookdown ][0] = KEY_PGDN;
|
||||
gamecontrol[gc_lookup ][0] = KEY_UPARROW;
|
||||
gamecontrol[gc_lookdown ][0] = KEY_DOWNARROW;
|
||||
gamecontrol[gc_centerview ][0] = KEY_END;
|
||||
gamecontrol[gc_talkkey ][0] = 't';
|
||||
gamecontrol[gc_teamkey ][0] = 'y';
|
||||
gamecontrol[gc_scores ][0] = KEY_TAB;
|
||||
gamecontrol[gc_jump ][0] = 'z';
|
||||
gamecontrol[gc_jump ][1] = KEY_MOUSE1+1;
|
||||
gamecontrol[gc_jump ][0] = KEY_SPACE;
|
||||
gamecontrol[gc_console ][0] = KEY_CONSOLE;
|
||||
gamecontrol[gc_pause ][0] = KEY_PAUSE;
|
||||
#ifdef WMINPUT
|
||||
|
|
|
@ -105,8 +105,6 @@ typedef enum
|
|||
gc_tossflag,
|
||||
gc_use,
|
||||
gc_camtoggle,
|
||||
gc_camleft,
|
||||
gc_camright,
|
||||
gc_camreset,
|
||||
gc_lookup,
|
||||
gc_lookdown,
|
||||
|
@ -126,6 +124,8 @@ typedef enum
|
|||
|
||||
// mouse values are used once
|
||||
extern consvar_t cv_mousesens, cv_mouseysens;
|
||||
extern consvar_t cv_mousesens2, cv_mouseysens2;
|
||||
extern consvar_t cv_controlperkey;
|
||||
|
||||
extern INT32 mousex, mousey;
|
||||
extern INT32 mlooky; //mousey with mlookSensitivity
|
||||
|
|
|
@ -564,8 +564,6 @@ static inline void HWR_SubsecPoly(INT32 num, poly_t *poly)
|
|||
subsector_t *sub;
|
||||
seg_t *lseg;
|
||||
|
||||
sscount++;
|
||||
|
||||
sub = &subsectors[num];
|
||||
count = sub->numlines;
|
||||
lseg = &segs[sub->firstline];
|
||||
|
|
|
@ -152,7 +152,9 @@ void HWR_DrawFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
|||
float pdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f*FIXED_TO_FLOAT(pscale);
|
||||
float pdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f*FIXED_TO_FLOAT(pscale);
|
||||
|
||||
if (alphalevel >= 10 && alphalevel < 13)
|
||||
if (alphalevel == 12)
|
||||
alphalevel = 0;
|
||||
else if (alphalevel >= 10 && alphalevel < 13)
|
||||
return;
|
||||
|
||||
// make patch ready in hardware cache
|
||||
|
@ -252,7 +254,9 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal
|
|||
float pdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f*FIXED_TO_FLOAT(pscale);
|
||||
float pdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f*FIXED_TO_FLOAT(pscale);
|
||||
|
||||
if (alphalevel >= 10 && alphalevel < 13)
|
||||
if (alphalevel == 12)
|
||||
alphalevel = 0;
|
||||
else if (alphalevel >= 10 && alphalevel < 13)
|
||||
return;
|
||||
|
||||
// make patch ready in hardware cache
|
||||
|
@ -785,7 +789,7 @@ boolean HWR_Screenshot(const char *lbmname)
|
|||
HWD.pfnReadRect(0, 0, vid.width, vid.height, vid.width * 3, (void *)buf);
|
||||
|
||||
#ifdef USE_PNG
|
||||
ret = M_SavePNG(lbmname, buf, vid.width, vid.height, NULL);
|
||||
ret = M_SavePNG(lbmname, buf, vid.width, vid.height, false);
|
||||
#else
|
||||
ret = saveTGA(lbmname, buf, vid.width, vid.height);
|
||||
#endif
|
||||
|
|
|
@ -404,7 +404,7 @@ light_t *t_lspr[NUMSPRITES] =
|
|||
&lspr[NOLIGHT], // SPR_SPLA
|
||||
&lspr[NOLIGHT], // SPR_SMOK
|
||||
&lspr[NOLIGHT], // SPR_BUBL
|
||||
&lspr[SUPERSPARK_L], // SPR_WZAP
|
||||
&lspr[RINGLIGHT_L], // SPR_WZAP
|
||||
&lspr[SUPERSPARK_L], // SPR_TFOG
|
||||
&lspr[NIGHTSLIGHT_L], // SPR_SEED // Sonic CD flower seed
|
||||
&lspr[NOLIGHT], // SPR_PRTL
|
||||
|
@ -412,9 +412,12 @@ light_t *t_lspr[NUMSPRITES] =
|
|||
// Game Indicators
|
||||
&lspr[NOLIGHT], // SPR_SCOR
|
||||
&lspr[NOLIGHT], // SPR_DRWN
|
||||
&lspr[NOLIGHT], // SPR_LCKN
|
||||
&lspr[NOLIGHT], // SPR_TTAG
|
||||
&lspr[NOLIGHT], // SPR_GFLG
|
||||
|
||||
&lspr[NOLIGHT], // SPR_CORK
|
||||
|
||||
// Ring Weapons
|
||||
&lspr[RINGLIGHT_L], // SPR_RRNG
|
||||
&lspr[RINGLIGHT_L], // SPR_RNGB
|
||||
|
|
|
@ -3367,7 +3367,6 @@ static void HWR_Subsector(size_t num)
|
|||
|
||||
if (num < numsubsectors)
|
||||
{
|
||||
sscount++;
|
||||
// subsector
|
||||
sub = &subsectors[num];
|
||||
// sector
|
||||
|
|
|
@ -91,7 +91,7 @@ patch_t *tallminus;
|
|||
patch_t *emeraldpics[7];
|
||||
patch_t *tinyemeraldpics[7];
|
||||
static patch_t *emblemicon;
|
||||
static patch_t *tokenicon;
|
||||
patch_t *tokenicon;
|
||||
|
||||
//-------------------------------------------
|
||||
// misc vars
|
||||
|
@ -840,7 +840,7 @@ static void HU_DrawChat(void)
|
|||
else
|
||||
{
|
||||
//charwidth = SHORT(hu_font[talk[i]-HU_FONTSTART]->width) * con_scalefactor;
|
||||
V_DrawCharacter(HU_INPUTX + c, y, talk[i++] | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
|
||||
V_DrawCharacter(HU_INPUTX + c, y, talk[i++] | cv_constextsize.value | V_NOSCALESTART, true);
|
||||
}
|
||||
c += charwidth;
|
||||
}
|
||||
|
@ -857,7 +857,7 @@ static void HU_DrawChat(void)
|
|||
else
|
||||
{
|
||||
//charwidth = SHORT(hu_font[w_chat[i]-HU_FONTSTART]->width) * con_scalefactor;
|
||||
V_DrawCharacter(HU_INPUTX + c, y, w_chat[i++] | cv_constextsize.value | V_NOSCALESTART | t, !cv_allcaps.value);
|
||||
V_DrawCharacter(HU_INPUTX + c, y, w_chat[i++] | cv_constextsize.value | V_NOSCALESTART | t, true);
|
||||
}
|
||||
|
||||
c += charwidth;
|
||||
|
@ -869,7 +869,7 @@ static void HU_DrawChat(void)
|
|||
}
|
||||
|
||||
if (hu_tick < 4)
|
||||
V_DrawCharacter(HU_INPUTX + c, y, '_' | cv_constextsize.value |V_NOSCALESTART|t, !cv_allcaps.value);
|
||||
V_DrawCharacter(HU_INPUTX + c, y, '_' | cv_constextsize.value |V_NOSCALESTART|t, true);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1226,9 +1226,9 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
|||
}
|
||||
else
|
||||
{
|
||||
if (players[tab[i].num].powers[pw_super])
|
||||
if (players[tab[i].num].powers[pw_super] && players[tab[i].num].mo && (players[tab[i].num].mo->state < &states[S_PLAY_SUPER_TRANS] || players[tab[i].num].mo->state > &states[S_PLAY_SUPER_TRANS9]))
|
||||
{
|
||||
colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE);
|
||||
colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo->color, GTC_CACHE);
|
||||
V_DrawSmallMappedPatch (x, y-4, 0, superprefix[players[tab[i].num].skin], colormap);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
//------------------------------------
|
||||
// heads up font
|
||||
//------------------------------------
|
||||
#define HU_FONTSTART '\x1F' // the first font character
|
||||
#define HU_FONTSTART '\x19' // the first font character
|
||||
#define HU_FONTEND '~'
|
||||
|
||||
#define HU_FONTSIZE (HU_FONTEND - HU_FONTSTART + 1)
|
||||
|
@ -71,6 +71,7 @@ extern patch_t *rmatcico;
|
|||
extern patch_t *bmatcico;
|
||||
extern patch_t *tagico;
|
||||
extern patch_t *tallminus;
|
||||
extern patch_t *tokenicon;
|
||||
|
||||
// set true when entering a chat message
|
||||
extern boolean chat_on;
|
||||
|
@ -78,9 +79,6 @@ extern boolean chat_on;
|
|||
// set true whenever the tab rankings are being shown for any reason
|
||||
extern boolean hu_showscores;
|
||||
|
||||
// P_DeathThink sets this true to show scores while dead, in multiplayer
|
||||
extern boolean playerdeadview;
|
||||
|
||||
// init heads up data at game startup.
|
||||
void HU_Init(void);
|
||||
|
||||
|
|
557
src/info.c
557
src/info.c
|
@ -219,9 +219,11 @@ char sprnames[NUMSPRITES + 1][5] =
|
|||
// Egg Rock Scenery
|
||||
|
||||
// Christmas Scenery
|
||||
"XMS1",
|
||||
"XMS2",
|
||||
"XMS3",
|
||||
"XMS1", // Christmas Pole
|
||||
"XMS2", // Candy Cane
|
||||
"XMS3", // Snowman
|
||||
"XMS4", // Lamppost
|
||||
"XMS5", // Hanging Star
|
||||
|
||||
// Botanic Serenity Scenery
|
||||
"BSZ1", // Tall flowers
|
||||
|
@ -301,9 +303,12 @@ char sprnames[NUMSPRITES + 1][5] =
|
|||
// Game Indicators
|
||||
"SCOR", // Score logo
|
||||
"DRWN", // Drowning Timer
|
||||
"LCKN", // Target
|
||||
"TTAG", // Tag Sign
|
||||
"GFLG", // Got Flag sign
|
||||
|
||||
"CORK",
|
||||
|
||||
// Ring Weapons
|
||||
"RRNG", // Red Ring
|
||||
"RNGB", // Bounce Ring
|
||||
|
@ -390,12 +395,12 @@ char spr2names[NUMPLAYERSPRITES][5] =
|
|||
"WAIT",
|
||||
"WALK",
|
||||
"RUN_",
|
||||
"PEEL",
|
||||
"DASH",
|
||||
"PAIN",
|
||||
"STUN",
|
||||
"DEAD",
|
||||
"DRWN",
|
||||
"SPIN",
|
||||
"DASH",
|
||||
"ROLL",
|
||||
"GASP",
|
||||
"JUMP",
|
||||
"SPNG",
|
||||
|
@ -403,8 +408,7 @@ char spr2names[NUMPLAYERSPRITES][5] =
|
|||
"EDGE",
|
||||
"RIDE",
|
||||
|
||||
"SIGN",
|
||||
"LIFE",
|
||||
"SPIN",
|
||||
|
||||
"FLY_",
|
||||
"SWIM",
|
||||
|
@ -414,32 +418,24 @@ char spr2names[NUMPLAYERSPRITES][5] =
|
|||
"CLNG",
|
||||
"CLMB",
|
||||
|
||||
"FLT_",
|
||||
"FRUN",
|
||||
|
||||
"BNCE",
|
||||
"BLND",
|
||||
|
||||
"FIRE",
|
||||
|
||||
"TWIN",
|
||||
|
||||
"MLEE",
|
||||
"MLEL",
|
||||
|
||||
"TRNS",
|
||||
"SSTD",
|
||||
"SWLK",
|
||||
"SRUN",
|
||||
"SPEE",
|
||||
"SPAN",
|
||||
"SSTN",
|
||||
"SDTH",
|
||||
"SDRN",
|
||||
"SSPN",
|
||||
"SGSP",
|
||||
"SJMP",
|
||||
"SSPG",
|
||||
"SFAL",
|
||||
"SEDG",
|
||||
"SRID",
|
||||
"SFLT",
|
||||
|
||||
"NTRN",
|
||||
"NSTD",
|
||||
"NFLT",
|
||||
"NPAN",
|
||||
"NSTN",
|
||||
"NPUL",
|
||||
"NATK",
|
||||
|
||||
|
@ -469,7 +465,10 @@ char spr2names[NUMPLAYERSPRITES][5] =
|
|||
"DRL9",
|
||||
"DRLA",
|
||||
"DRLB",
|
||||
"DRLC"
|
||||
"DRLC",
|
||||
|
||||
"SIGN",
|
||||
"LIFE"
|
||||
};
|
||||
enum playersprite free_spr2 = SPR2_FIRSTFREESLOT;
|
||||
|
||||
|
@ -503,19 +502,22 @@ state_t states[NUMSTATES] =
|
|||
{SPR_PLAY, SPR2_WAIT|FF_ANIMATE, -1, {NULL}, 0, 16, S_NULL}, // S_PLAY_WAIT
|
||||
{SPR_PLAY, SPR2_WALK, 4, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_WALK
|
||||
{SPR_PLAY, SPR2_RUN , 2, {NULL}, 0, 0, S_PLAY_RUN}, // S_PLAY_RUN
|
||||
{SPR_PLAY, SPR2_PEEL, 2, {NULL}, 0, 0, S_PLAY_PEEL}, // S_PLAY_PEEL
|
||||
{SPR_PLAY, SPR2_DASH, 2, {NULL}, 0, 0, S_PLAY_DASH}, // S_PLAY_DASH
|
||||
{SPR_PLAY, SPR2_PAIN|FF_ANIMATE, 350, {NULL}, 0, 4, S_PLAY_FALL}, // S_PLAY_PAIN
|
||||
{SPR_PLAY, SPR2_STUN|FF_ANIMATE, 350, {NULL}, 0, 4, S_PLAY_FALL}, // S_PLAY_STUN
|
||||
{SPR_PLAY, SPR2_DEAD|FF_ANIMATE, -1, {NULL}, 0, 4, S_NULL}, // S_PLAY_DEAD
|
||||
{SPR_PLAY, SPR2_DRWN|FF_ANIMATE, -1, {NULL}, 0, 4, S_NULL}, // S_PLAY_DRWN
|
||||
{SPR_PLAY, SPR2_SPIN, 1, {NULL}, 0, 0, S_PLAY_SPIN}, // S_PLAY_SPIN
|
||||
{SPR_PLAY, SPR2_DASH, 2, {NULL}, 0, 0, S_PLAY_DASH}, // S_PLAY_DASH
|
||||
{SPR_PLAY, SPR2_ROLL, 1, {NULL}, 0, 0, S_PLAY_ROLL}, // S_PLAY_ROLL
|
||||
{SPR_PLAY, SPR2_GASP|FF_ANIMATE, 14, {NULL}, 0, 4, S_PLAY_WALK}, // S_PLAY_GASP
|
||||
{SPR_PLAY, SPR2_JUMP, 1, {NULL}, 0, 0, S_PLAY_JUMP}, // S_PLAY_JUMP
|
||||
{SPR_PLAY, SPR2_SPNG, 2, {NULL}, 0, 0, S_PLAY_SPRING}, // S_PLAY_SPRING
|
||||
{SPR_PLAY, SPR2_FALL, 2, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_FALL
|
||||
{SPR_PLAY, SPR2_EDGE|FF_ANIMATE, -1, {NULL}, 0, 12, S_NULL}, // S_PLAY_EDGE
|
||||
{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
|
||||
|
||||
// CA2_SPINDASH
|
||||
{SPR_PLAY, SPR2_SPIN, 2, {NULL}, 0, 0, S_PLAY_SPINDASH}, // S_PLAY_SPINDASH
|
||||
|
||||
// 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
|
||||
|
@ -526,45 +528,40 @@ state_t states[NUMSTATES] =
|
|||
{SPR_PLAY, SPR2_CLNG|FF_ANIMATE, -1, {NULL}, 0, 4, S_NULL}, // S_PLAY_CLING
|
||||
{SPR_PLAY, SPR2_CLMB, 5, {NULL}, 0, 0, S_PLAY_CLIMB}, // S_PLAY_CLIMB
|
||||
|
||||
// CA_FLOAT/CA_SLOWFALL
|
||||
{SPR_PLAY, SPR2_FLT , 7, {NULL}, 0, 0, S_PLAY_FLOAT}, // S_PLAY_FLOAT
|
||||
{SPR_PLAY, SPR2_FRUN, 7, {NULL}, 0, 0, S_PLAY_FLOAT_RUN}, // S_PLAY_FLOAT_RUN
|
||||
|
||||
// CA_BOUNCE
|
||||
{SPR_PLAY, SPR2_BNCE|FF_ANIMATE, -1, {NULL}, 0, 0, S_NULL}, // S_PLAY_BOUNCE
|
||||
{SPR_PLAY, SPR2_BLND|FF_SPR2ENDSTATE, 2, {NULL}, S_PLAY_BOUNCE, 0, S_PLAY_BOUNCE_LANDING}, // S_PLAY_BOUNCE_LANDING
|
||||
|
||||
// CA2_GUNSLINGER
|
||||
{SPR_PLAY, SPR2_FIRE|FF_SPR2ENDSTATE, 2, {NULL}, S_PLAY_FIRE_FINISH, 0, S_PLAY_FIRE}, // S_PLAY_FIRE
|
||||
{SPR_PLAY, SPR2_FIRE, 15, {NULL}, S_PLAY_STND, 0, S_PLAY_STND}, // S_PLAY_FIRE_FINISH
|
||||
|
||||
// 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|FF_ANIMATE, -1, {NULL}, 0, 7, S_NULL}, // 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|FF_ANIMATE, 350, {NULL}, 0, 4, S_PLAY_SUPER_FALL}, // S_PLAY_SUPER_PAIN
|
||||
{SPR_PLAY, SPR2_SSTN|FF_ANIMATE, 350, {NULL}, 0, 4, S_PLAY_SUPER_FALL}, // S_PLAY_SUPER_STUN
|
||||
{SPR_PLAY, SPR2_SDTH|FF_ANIMATE, -1, {NULL}, 0, 4, S_NULL}, // S_PLAY_SUPER_DEAD
|
||||
{SPR_PLAY, SPR2_SDRN|FF_ANIMATE, -1, {NULL}, 0, 4, S_NULL}, // S_PLAY_SUPER_DRWN
|
||||
{SPR_PLAY, SPR2_SSPN, 1, {NULL}, 0, 0, S_PLAY_SUPER_SPIN}, // S_PLAY_SUPER_SPIN
|
||||
{SPR_PLAY, SPR2_SGSP|FF_ANIMATE, 14, {NULL}, 0, 4, S_PLAY_SUPER_WALK}, // S_PLAY_SUPER_GASP
|
||||
{SPR_PLAY, SPR2_SJMP, 1, {NULL}, 0, 0, S_PLAY_SUPER_JUMP}, // S_PLAY_SUPER_JUMP
|
||||
{SPR_PLAY, SPR2_SSPG, 2, {NULL}, 0, 0, S_PLAY_SUPER_SPRING}, // S_PLAY_SUPER_SPRING
|
||||
{SPR_PLAY, SPR2_SFAL, 2, {NULL}, 0, 0, S_PLAY_SUPER_FALL}, // S_PLAY_SUPER_FALL
|
||||
{SPR_PLAY, SPR2_SEDG|FF_ANIMATE, -1, {NULL}, 0, 12, S_NULL}, // S_PLAY_SUPER_EDGE
|
||||
{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
|
||||
{SPR_PLAY, SPR2_MLEE, 70, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_MELEE_FINISH
|
||||
{SPR_PLAY, SPR2_MLEL, 35, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_MELEE_LANDING
|
||||
|
||||
// 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|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_PLAY, SPR2_TRNS|FF_SPR2SUPER, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS2}, // S_PLAY_SUPER_TRANS
|
||||
{SPR_PLAY, SPR2_TRNS|FF_SPR2SUPER, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS3}, // S_PLAY_SUPER_TRANS2
|
||||
{SPR_PLAY, SPR2_TRNS|FF_SPR2SUPER|FF_FULLBRIGHT, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS4}, // S_PLAY_SUPER_TRANS3
|
||||
{SPR_PLAY, SPR2_TRNS|FF_SPR2SUPER|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS5}, // S_PLAY_SUPER_TRANS4
|
||||
{SPR_PLAY, SPR2_TRNS|FF_SPR2SUPER|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS6}, // S_PLAY_SUPER_TRANS5
|
||||
{SPR_PLAY, SPR2_TRNS|FF_SPR2SUPER|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS7}, // S_PLAY_SUPER_TRANS6
|
||||
{SPR_PLAY, SPR2_TRNS|FF_SPR2SUPER|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS8}, // S_PLAY_SUPER_TRANS7
|
||||
{SPR_PLAY, SPR2_TRNS|FF_SPR2SUPER|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS9}, // S_PLAY_SUPER_TRANS8
|
||||
{SPR_PLAY, SPR2_TRNS|FF_SPR2SUPER|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
|
||||
|
||||
// 1-Up Box Sprites (uses player sprite)
|
||||
// 1-Up box sprites (uses player sprite)
|
||||
{SPR_PLAY, SPR2_LIFE, 2, {NULL}, 0, 16, S_PLAY_BOX2}, // S_PLAY_BOX1
|
||||
{SPR_NULL, 0, 1, {NULL}, 0, 0, S_PLAY_BOX1}, // S_PLAY_BOX2
|
||||
{SPR_PLAY, SPR2_LIFE, 4, {NULL}, 0, 4, S_PLAY_ICON2}, // S_PLAY_ICON1
|
||||
|
@ -575,50 +572,50 @@ state_t states[NUMSTATES] =
|
|||
{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
|
||||
{SPR_PLAY, SPR2_TRNS, 4, {A_Scream}, 0, 0, S_PLAY_NIGHTS_TRANS2}, // S_PLAY_NIGHTS_TRANS
|
||||
{SPR_PLAY, SPR2_TRNS, 4, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS3}, // S_PLAY_NIGHTS_TRANS2
|
||||
{SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 4, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS4}, // S_PLAY_NIGHTS_TRANS3
|
||||
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS5}, // S_PLAY_NIGHTS_TRANS4
|
||||
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS6}, // S_PLAY_NIGHTS_TRANS5
|
||||
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS7}, // S_PLAY_NIGHTS_TRANS6
|
||||
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS8}, // S_PLAY_NIGHTS_TRANS7
|
||||
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS9}, // S_PLAY_NIGHTS_TRANS8
|
||||
{SPR_PLAY, SPR2_TRNS, 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
|
||||
// NiGHTS Player, stand, float, 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_NSTN, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_STUN}, // S_PLAY_NIGHTS_STUN
|
||||
{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
|
||||
// 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
|
||||
|
@ -929,13 +926,13 @@ state_t states[NUMSTATES] =
|
|||
{SPR_EGGM, 20, 2, {NULL}, 0, 0, S_EGGMOBILE_STND}, // S_EGGMOBILE_RATK10
|
||||
{SPR_EGGM, 3, 12, {NULL}, 0, 0, S_EGGMOBILE_PANIC2}, // S_EGGMOBILE_PANIC1
|
||||
{SPR_EGGM, 4, 4, {A_Boss1Spikeballs}, 0, 4, S_EGGMOBILE_PANIC3}, // S_EGGMOBILE_PANIC2
|
||||
{SPR_EGGM, 3, 5, {NULL}, 0, 0, S_EGGMOBILE_PANIC4}, // S_EGGMOBILE_PANIC3
|
||||
{SPR_EGGM, 3, 8, {NULL}, 0, 0, S_EGGMOBILE_PANIC4}, // S_EGGMOBILE_PANIC3
|
||||
{SPR_EGGM, 4, 4, {A_Boss1Spikeballs}, 1, 4, S_EGGMOBILE_PANIC5}, // S_EGGMOBILE_PANIC4
|
||||
{SPR_EGGM, 3, 5, {NULL}, 0, 0, S_EGGMOBILE_PANIC6}, // S_EGGMOBILE_PANIC5
|
||||
{SPR_EGGM, 3, 8, {NULL}, 0, 0, S_EGGMOBILE_PANIC6}, // S_EGGMOBILE_PANIC5
|
||||
{SPR_EGGM, 4, 4, {A_Boss1Spikeballs}, 2, 4, S_EGGMOBILE_PANIC7}, // S_EGGMOBILE_PANIC6
|
||||
{SPR_EGGM, 3, 5, {NULL}, 0, 0, S_EGGMOBILE_PANIC8}, // S_EGGMOBILE_PANIC7
|
||||
{SPR_EGGM, 3, 8, {NULL}, 0, 0, S_EGGMOBILE_PANIC8}, // S_EGGMOBILE_PANIC7
|
||||
{SPR_EGGM, 4, 4, {A_Boss1Spikeballs}, 3, 4, S_EGGMOBILE_PANIC9}, // S_EGGMOBILE_PANIC8
|
||||
{SPR_EGGM, 3, 5, {NULL}, 0, 0, S_EGGMOBILE_PANIC10},// S_EGGMOBILE_PANIC9
|
||||
{SPR_EGGM, 3, 8, {NULL}, 0, 0, S_EGGMOBILE_PANIC10},// S_EGGMOBILE_PANIC9
|
||||
{SPR_EGGM, 0, 35, {A_SkullAttack}, 0, 0, S_EGGMOBILE_STND}, // S_EGGMOBILE_PANIC10
|
||||
{SPR_EGGM, 21, 24, {A_Pain}, 0, 0, S_EGGMOBILE_PAIN2}, // S_EGGMOBILE_PAIN
|
||||
{SPR_EGGM, 21, 16, {A_SkullAttack}, 1, 1, S_EGGMOBILE_STND}, // S_EGGMOBILE_PAIN2
|
||||
|
@ -1772,6 +1769,7 @@ state_t states[NUMSTATES] =
|
|||
|
||||
// Deep Sea Gargoyle
|
||||
{SPR_GARG, 0, -1, {NULL}, 0, 0, S_NULL}, // S_GARGOYLE
|
||||
{SPR_GARG, 1, -1, {NULL}, 0, 0, S_NULL}, // S_BIGGARGOYLE
|
||||
|
||||
// DSZ Seaweed
|
||||
{SPR_SEWE, 0, -1, {NULL}, 0, 0, S_SEAWEED2}, // S_SEAWEED1
|
||||
|
@ -1938,6 +1936,13 @@ state_t states[NUMSTATES] =
|
|||
{SPR_XMS1, 0, -1, {NULL}, 0, 0, S_NULL}, // S_XMASPOLE
|
||||
{SPR_XMS2, 0, -1, {NULL}, 0, 0, S_NULL}, // S_CANDYCANE
|
||||
{SPR_XMS3, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SNOWMAN
|
||||
{SPR_XMS3, 1, -1, {NULL}, 0, 0, S_NULL}, // S_SNOWMANHAT
|
||||
{SPR_XMS4, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LAMPPOST1
|
||||
{SPR_XMS4, 1, -1, {NULL}, 0, 0, S_NULL}, // S_LAMPPOST2
|
||||
{SPR_XMS5, 0, -1, {NULL}, 0, 0, S_NULL}, // S_HANGSTAR
|
||||
// Xmas GFZ bushes
|
||||
{SPR_BUS1, 1, -1, {NULL}, 0, 0, S_NULL}, // S_BERRYBUSH
|
||||
{SPR_BUS2, 1, -1, {NULL}, 0, 0, S_NULL}, // S_BUSH
|
||||
|
||||
// Loads of Botanic Serenity bullshit
|
||||
{SPR_BSZ1, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BSZTALLFLOWER_RED
|
||||
|
@ -2127,16 +2132,12 @@ state_t states[NUMSTATES] =
|
|||
{SPR_ELEM, FF_FULLBRIGHT|20, 1, {NULL}, 0, 0, S_ELEMF10}, // S_ELEMF9
|
||||
{SPR_NULL, 0, 1, {NULL}, 0, 0, S_ELEMF1 }, // S_ELEMF10
|
||||
|
||||
{SPR_PITY, FF_TRANS20 , 1, {NULL}, 0, 0, S_PITY2 }, // S_PITY1
|
||||
{SPR_PITY, FF_TRANS20|1, 1, {NULL}, 0, 0, S_PITY3 }, // S_PITY2
|
||||
{SPR_PITY, FF_TRANS20 , 1, {NULL}, 0, 0, S_PITY4 }, // S_PITY3
|
||||
{SPR_PITY, FF_TRANS20|2, 1, {NULL}, 0, 0, S_PITY5 }, // S_PITY4
|
||||
{SPR_PITY, FF_TRANS20 , 1, {NULL}, 0, 0, S_PITY6 }, // S_PITY5
|
||||
{SPR_PITY, FF_TRANS20|3, 1, {NULL}, 0, 0, S_PITY7 }, // S_PITY6
|
||||
{SPR_PITY, FF_TRANS20 , 1, {NULL}, 0, 0, S_PITY8 }, // S_PITY7
|
||||
{SPR_PITY, FF_TRANS20|4, 1, {NULL}, 0, 0, S_PITY9 }, // S_PITY8
|
||||
{SPR_PITY, FF_TRANS20 , 1, {NULL}, 0, 0, S_PITY10}, // S_PITY9
|
||||
{SPR_PITY, FF_TRANS20|5, 1, {NULL}, 0, 0, S_PITY1 }, // S_PITY10
|
||||
{SPR_PITY, FF_TRANS30 , 2, {NULL}, 0, 0, S_PITY2}, // S_PITY1
|
||||
{SPR_PITY, FF_TRANS30|1, 2, {NULL}, 0, 0, S_PITY3}, // S_PITY2
|
||||
{SPR_PITY, FF_TRANS30|2, 2, {NULL}, 0, 0, S_PITY4}, // S_PITY3
|
||||
{SPR_PITY, FF_TRANS20|3, 2, {NULL}, 0, 0, S_PITY5}, // S_PITY4
|
||||
{SPR_PITY, FF_TRANS30|4, 2, {NULL}, 0, 0, S_PITY6}, // S_PITY5
|
||||
{SPR_PITY, FF_TRANS20|5, 2, {NULL}, 0, 0, S_PITY1}, // S_PITY6
|
||||
|
||||
{SPR_FIRS, FF_FULLBRIGHT|FF_TRANS40 , 2, {NULL}, 0, 0, S_FIRS2}, // S_FIRS1
|
||||
{SPR_FIRS, FF_FULLBRIGHT|FF_TRANS40|1, 2, {NULL}, 0, 0, S_FIRS3}, // S_FIRS2
|
||||
|
@ -2535,13 +2536,17 @@ state_t states[NUMSTATES] =
|
|||
{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
|
||||
{SPR_LCKN, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_LOCKON1
|
||||
{SPR_LCKN, 1|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_LOCKON2
|
||||
|
||||
{SPR_TTAG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_TTAG
|
||||
|
||||
// CTF Sign
|
||||
{SPR_GFLG, 0, 1, {NULL}, 0, 0, S_GOTFLAG2}, // S_GOTFLAG1
|
||||
{SPR_GFLG, 1, 1, {NULL}, 0, 0, S_NULL}, // S_GOTFLAG2
|
||||
{SPR_GFLG, 0, 1, {NULL}, 0, 0, S_GOTFLAG4}, // S_GOTFLAG3
|
||||
{SPR_GFLG, 2, 1, {NULL}, 0, 0, S_NULL}, // S_GOTFLAG4
|
||||
{SPR_GFLG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_GOTFLAG
|
||||
{SPR_GFLG, 1|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_GOTREDFLAG
|
||||
{SPR_GFLG, 2|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_GOTBLUEFLAG
|
||||
|
||||
{SPR_CORK, 0, -1, {NULL}, 0, 0, S_NULL}, // S_CORK
|
||||
|
||||
// Red Rings (thrown)
|
||||
{SPR_RRNG, FF_FULLBRIGHT, 1, {A_ThrownRing}, 0, 0, S_RRNG2}, // S_RRNG1
|
||||
|
@ -3062,7 +3067,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
MT_THOK, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_PLAY_SPIN, // missilestate
|
||||
S_PLAY_ROLL, // missilestate
|
||||
S_PLAY_DEAD, // deathstate
|
||||
S_PLAY_DRWN, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
|
@ -4092,7 +4097,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
2*FRACUNIT, // speed
|
||||
4*FRACUNIT, // speed
|
||||
13*FRACUNIT, // radius
|
||||
26*FRACUNIT, // height
|
||||
0, // display offset
|
||||
|
@ -4581,7 +4586,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
30*FRACUNIT, // speed
|
||||
11*FRACUNIT, // radius
|
||||
8*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
|
@ -6448,7 +6453,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
},
|
||||
|
||||
{ // MT_MYSTERY_BOX
|
||||
412, // doomednum
|
||||
-1, //412, // doomednum
|
||||
S_MYSTERY_BOX, // spawnstate
|
||||
1, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
|
@ -7100,7 +7105,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_PITY_ICON1, // spawnstate
|
||||
1, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_s3k3a, // seesound
|
||||
sfx_shield, // seesound
|
||||
8, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
|
@ -7127,7 +7132,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_ATTRACT_ICON1, // spawnstate
|
||||
1, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_s3k41, // seesound
|
||||
sfx_attrsg, // seesound
|
||||
8, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
|
@ -7451,7 +7456,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_SCORE1K_ICON1, // spawnstate
|
||||
1, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_token, // seesound
|
||||
sfx_chchng, // seesound
|
||||
1000, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
|
@ -7478,7 +7483,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_SCORE10K_ICON1, // spawnstate
|
||||
1, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_token, // seesound
|
||||
sfx_chchng, // seesound
|
||||
10000, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
|
@ -8148,6 +8153,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_BIGGARGOYLE
|
||||
1009, // doomednum
|
||||
S_BIGGARGOYLE, // 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
|
||||
12*FRACUNIT, // speed
|
||||
32*FRACUNIT, // radius
|
||||
80*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
1, // damage
|
||||
sfx_statu2, // activesound
|
||||
MF_SLIDEME|MF_SOLID|MF_PUSHABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_SEAWEED
|
||||
1001, // doomednum
|
||||
S_SEAWEED1, // spawnstate
|
||||
|
@ -9516,7 +9548,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
sfx_None, // deathsound
|
||||
25*FRACUNIT, // speed
|
||||
16*FRACUNIT, // radius
|
||||
40*FRACUNIT, // height
|
||||
64*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
1, // damage
|
||||
|
@ -9525,6 +9557,168 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_SNOWMANHAT
|
||||
1853, // doomednum
|
||||
S_SNOWMANHAT, // 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
|
||||
25*FRACUNIT, // speed
|
||||
16*FRACUNIT, // radius
|
||||
80*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SLIDEME|MF_SOLID|MF_PUSHABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_LAMPPOST1
|
||||
1854, // doomednum
|
||||
S_LAMPPOST1, // 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
|
||||
0, // speed
|
||||
8*FRACUNIT, // radius
|
||||
120*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_LAMPPOST2
|
||||
1855, // doomednum
|
||||
S_LAMPPOST2, // 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
|
||||
0, // speed
|
||||
8*FRACUNIT, // radius
|
||||
120*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_HANGSTAR
|
||||
1856, // doomednum
|
||||
S_HANGSTAR, // 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
|
||||
0, // speed
|
||||
4*FRACUNIT, // radius
|
||||
80*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOBLOCKMAP|MF_NOCLIP|MF_SPAWNCEILING|MF_NOGRAVITY|MF_SCENERY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_XMASBERRYBUSH
|
||||
1857, // doomednum
|
||||
S_XMASBERRYBUSH, // 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
|
||||
0, // speed
|
||||
16*FRACUNIT, // radius
|
||||
32*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_XMASBUSH
|
||||
1858, // doomednum
|
||||
S_XMASBUSH, // 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
|
||||
0, // speed
|
||||
16*FRACUNIT, // radius
|
||||
32*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
// No, I did not do all of this by hand.
|
||||
// I made a script to make all of these for me.
|
||||
// Ha HA. ~Inuyasha
|
||||
|
@ -12032,7 +12226,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
8, // speed
|
||||
8*FRACUNIT, // radius
|
||||
8*FRACUNIT, // height
|
||||
0, // display offset
|
||||
113, // display offset
|
||||
16, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
|
@ -12059,7 +12253,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
8, // speed
|
||||
8*FRACUNIT, // radius
|
||||
16*FRACUNIT, // height
|
||||
0, // display offset
|
||||
112, // display offset
|
||||
16, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
|
@ -12067,9 +12261,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_TAG
|
||||
{ // MT_LOCKON
|
||||
-1, // doomednum
|
||||
S_TTAG1, // spawnstate
|
||||
S_LOCKON1, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
|
@ -12086,7 +12280,34 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
8, // speed
|
||||
16*FRACUNIT, // radius
|
||||
32*FRACUNIT, // height
|
||||
0, // display offset
|
||||
111, // display offset
|
||||
16, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_TAG
|
||||
-1, // doomednum
|
||||
S_TTAG, // 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
|
||||
16*FRACUNIT, // radius
|
||||
32*FRACUNIT, // height
|
||||
111, // display offset
|
||||
16, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
|
@ -12096,7 +12317,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
|
||||
{ // MT_GOTFLAG
|
||||
-1, // doomednum
|
||||
S_GOTFLAG1, // spawnstate
|
||||
S_GOTFLAG, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
|
@ -12113,34 +12334,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
8, // speed
|
||||
64*FRACUNIT, // radius
|
||||
32*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_GOTFLAG2
|
||||
-1, // doomednum
|
||||
S_GOTFLAG3, // 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
|
||||
64*FRACUNIT, // radius
|
||||
32*FRACUNIT, // height
|
||||
0, // display offset
|
||||
111, // display offset
|
||||
16, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
|
@ -12426,12 +12620,39 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_CORK
|
||||
-1, // doomednum
|
||||
S_CORK, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_corkp, // seesound
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_SMOKE1, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_corkh, // deathsound
|
||||
60*FRACUNIT, // speed
|
||||
16*FRACUNIT, // radius
|
||||
16*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_REDRING
|
||||
-1, // doomednum
|
||||
S_RRNG1, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_thok, // seesound
|
||||
sfx_wepfir, // seesound
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
|
@ -12838,7 +13059,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_THROWNINFINITY1, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_thok, // seesound
|
||||
sfx_wepfir, // seesound
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
|
@ -12865,7 +13086,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_THROWNAUTOMATIC1, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_thok, // seesound
|
||||
sfx_wepfir, // seesound
|
||||
8, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
|
@ -12946,7 +13167,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_THROWNGRENADE1, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_thok, // seesound
|
||||
sfx_wepfir, // seesound
|
||||
8, // reactiontime
|
||||
sfx_gbeep, // attacksound
|
||||
S_NULL, // painstate
|
||||
|
@ -13733,7 +13954,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_itemup, // painsound
|
||||
sfx_s3k33, // painsound
|
||||
S_RING, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_SPRK1, // deathstate
|
||||
|
|
153
src/info.h
153
src/info.h
|
@ -425,9 +425,11 @@ typedef enum sprite
|
|||
// Egg Rock Scenery
|
||||
|
||||
// Christmas Scenery
|
||||
SPR_XMS1,
|
||||
SPR_XMS2,
|
||||
SPR_XMS3,
|
||||
SPR_XMS1, // Christmas Pole
|
||||
SPR_XMS2, // Candy Cane
|
||||
SPR_XMS3, // Snowman
|
||||
SPR_XMS4, // Lamppost
|
||||
SPR_XMS5, // Hanging Star
|
||||
|
||||
// Botanic Serenity Scenery
|
||||
SPR_BSZ1, // Tall flowers
|
||||
|
@ -450,7 +452,7 @@ typedef enum sprite
|
|||
SPR_ARMB, // Armageddon Shield Ring, Back
|
||||
SPR_WIND, // Whirlwind Shield Orb
|
||||
SPR_MAGN, // Attract Shield Orb
|
||||
SPR_ELEM, // Elemental Shield Orb and Fire
|
||||
SPR_ELEM, // Elemental Shield Orb
|
||||
SPR_FORC, // Force Shield Orb
|
||||
SPR_PITY, // Pity Shield Orb
|
||||
SPR_FIRS, // Flame Shield Orb
|
||||
|
@ -507,9 +509,12 @@ typedef enum sprite
|
|||
// Game Indicators
|
||||
SPR_SCOR, // Score logo
|
||||
SPR_DRWN, // Drowning Timer
|
||||
SPR_LCKN, // Target
|
||||
SPR_TTAG, // Tag Sign
|
||||
SPR_GFLG, // Got Flag sign
|
||||
|
||||
SPR_CORK,
|
||||
|
||||
// Ring Weapons
|
||||
SPR_RRNG, // Red Ring
|
||||
SPR_RNGB, // Bounce Ring
|
||||
|
@ -594,21 +599,21 @@ 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.
|
||||
// Make sure to be conscious of FF_FRAMEMASK and the fact sprite2 is stored as a UINT8 whenever you change this table.
|
||||
// Currently, FF_FRAMEMASK is 0xff, or 255 - but the second half is used by FF_SPR2SUPER, so the limitation is 0x7f.
|
||||
// Since this is zero-based, there can be at most 128 different SPR2_'s without changing that.
|
||||
enum playersprite
|
||||
{
|
||||
SPR2_STND = 0,
|
||||
SPR2_WAIT,
|
||||
SPR2_WALK,
|
||||
SPR2_RUN ,
|
||||
SPR2_PEEL,
|
||||
SPR2_DASH,
|
||||
SPR2_PAIN,
|
||||
SPR2_STUN,
|
||||
SPR2_DEAD,
|
||||
SPR2_DRWN, // drown
|
||||
SPR2_SPIN,
|
||||
SPR2_DASH, // spindash charge
|
||||
SPR2_ROLL,
|
||||
SPR2_GASP,
|
||||
SPR2_JUMP,
|
||||
SPR2_SPNG, // spring
|
||||
|
@ -616,8 +621,7 @@ enum playersprite
|
|||
SPR2_EDGE,
|
||||
SPR2_RIDE,
|
||||
|
||||
SPR2_SIGN, // end sign head
|
||||
SPR2_LIFE, // life monitor icon
|
||||
SPR2_SPIN, // spindash
|
||||
|
||||
SPR2_FLY ,
|
||||
SPR2_SWIM,
|
||||
|
@ -627,36 +631,28 @@ enum playersprite
|
|||
SPR2_CLNG, // cling
|
||||
SPR2_CLMB, // climb
|
||||
|
||||
SPR2_FLT , // float
|
||||
SPR2_FRUN, // float run
|
||||
|
||||
SPR2_BNCE, // bounce
|
||||
SPR2_BLND, // bounce landing
|
||||
|
||||
SPR2_FIRE, // fire
|
||||
|
||||
SPR2_TWIN, // twinspin
|
||||
|
||||
SPR2_MLEE, // melee
|
||||
SPR2_MLEL, // melee land
|
||||
|
||||
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_TRNS, // transformation
|
||||
|
||||
SPR2_NTRN, // NiGHTS transformation
|
||||
SPR2_NSTD, // NiGHTS stand
|
||||
SPR2_NFLT, // NiGHTS float
|
||||
SPR2_NPAN, // NiGHTS pain
|
||||
SPR2_NSTN, // NiGHTS stun
|
||||
SPR2_NPUL, // NiGHTS pull
|
||||
SPR2_NATK, // NiGHTS attack
|
||||
|
||||
// NiGHTS flight.
|
||||
// NiGHTS flight
|
||||
SPR2_NGT0,
|
||||
SPR2_NGT1,
|
||||
SPR2_NGT2,
|
||||
|
@ -671,7 +667,7 @@ enum playersprite
|
|||
SPR2_NGTB,
|
||||
SPR2_NGTC,
|
||||
|
||||
// NiGHTS drill.
|
||||
// NiGHTS drill
|
||||
SPR2_DRL0,
|
||||
SPR2_DRL1,
|
||||
SPR2_DRL2,
|
||||
|
@ -686,8 +682,11 @@ enum playersprite
|
|||
SPR2_DRLB,
|
||||
SPR2_DRLC,
|
||||
|
||||
SPR2_SIGN, // end sign head
|
||||
SPR2_LIFE, // life monitor icon
|
||||
|
||||
SPR2_FIRSTFREESLOT,
|
||||
SPR2_LASTFREESLOT = SPR2_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1,
|
||||
SPR2_LASTFREESLOT = 0x7f,
|
||||
NUMPLAYERSPRITES
|
||||
};
|
||||
|
||||
|
@ -713,19 +712,22 @@ typedef enum state
|
|||
S_PLAY_WAIT,
|
||||
S_PLAY_WALK,
|
||||
S_PLAY_RUN,
|
||||
S_PLAY_PEEL,
|
||||
S_PLAY_DASH,
|
||||
S_PLAY_PAIN,
|
||||
S_PLAY_STUN,
|
||||
S_PLAY_DEAD,
|
||||
S_PLAY_DRWN,
|
||||
S_PLAY_SPIN,
|
||||
S_PLAY_DASH,
|
||||
S_PLAY_ROLL,
|
||||
S_PLAY_GASP,
|
||||
S_PLAY_JUMP, // spin jump
|
||||
S_PLAY_JUMP,
|
||||
S_PLAY_SPRING,
|
||||
S_PLAY_FALL,
|
||||
S_PLAY_EDGE,
|
||||
S_PLAY_RIDE,
|
||||
|
||||
// CA2_SPINDASH
|
||||
S_PLAY_SPINDASH,
|
||||
|
||||
// CA_FLY/SWIM
|
||||
S_PLAY_FLY,
|
||||
S_PLAY_SWIM,
|
||||
|
@ -736,30 +738,25 @@ typedef enum state
|
|||
S_PLAY_CLING,
|
||||
S_PLAY_CLIMB,
|
||||
|
||||
// CA_FLOAT/CA_SLOWFALL
|
||||
S_PLAY_FLOAT,
|
||||
S_PLAY_FLOAT_RUN,
|
||||
|
||||
// CA_BOUNCE
|
||||
S_PLAY_BOUNCE,
|
||||
S_PLAY_BOUNCE_LANDING,
|
||||
|
||||
// CA2_GUNSLINGER
|
||||
S_PLAY_FIRE,
|
||||
S_PLAY_FIRE_FINISH,
|
||||
|
||||
// CA_TWINSPIN
|
||||
S_PLAY_TWINSPIN,
|
||||
|
||||
// CA2_MELEE
|
||||
S_PLAY_MELEE,
|
||||
S_PLAY_MELEE_FINISH,
|
||||
|
||||
// SF_SUPERANIMS
|
||||
S_PLAY_SUPER_STND,
|
||||
S_PLAY_SUPER_WALK,
|
||||
S_PLAY_SUPER_RUN,
|
||||
S_PLAY_SUPER_PEEL,
|
||||
S_PLAY_SUPER_PAIN,
|
||||
S_PLAY_SUPER_STUN,
|
||||
S_PLAY_SUPER_DEAD,
|
||||
S_PLAY_SUPER_DRWN,
|
||||
S_PLAY_SUPER_SPIN,
|
||||
S_PLAY_SUPER_GASP,
|
||||
S_PLAY_SUPER_JUMP, // see note above
|
||||
S_PLAY_SUPER_SPRING,
|
||||
S_PLAY_SUPER_FALL,
|
||||
S_PLAY_SUPER_EDGE,
|
||||
S_PLAY_SUPER_RIDE,
|
||||
S_PLAY_SUPER_FLOAT,
|
||||
S_PLAY_MELEE_LANDING,
|
||||
|
||||
// SF_SUPER
|
||||
S_PLAY_SUPER_TRANS,
|
||||
|
@ -798,7 +795,7 @@ typedef enum state
|
|||
|
||||
S_PLAY_NIGHTS_STAND,
|
||||
S_PLAY_NIGHTS_FLOAT,
|
||||
S_PLAY_NIGHTS_PAIN,
|
||||
S_PLAY_NIGHTS_STUN,
|
||||
S_PLAY_NIGHTS_PULL,
|
||||
S_PLAY_NIGHTS_ATTACK,
|
||||
|
||||
|
@ -1980,6 +1977,7 @@ typedef enum state
|
|||
|
||||
// Deep Sea Gargoyle
|
||||
S_GARGOYLE,
|
||||
S_BIGGARGOYLE,
|
||||
|
||||
// DSZ Seaweed
|
||||
S_SEAWEED1,
|
||||
|
@ -2138,7 +2136,14 @@ typedef enum state
|
|||
// Xmas-specific stuff
|
||||
S_XMASPOLE,
|
||||
S_CANDYCANE,
|
||||
S_SNOWMAN,
|
||||
S_SNOWMAN, // normal
|
||||
S_SNOWMANHAT, // with hat + scarf
|
||||
S_LAMPPOST1, // normal
|
||||
S_LAMPPOST2, // with snow
|
||||
S_HANGSTAR,
|
||||
// Xmas GFZ bushes
|
||||
S_XMASBERRYBUSH,
|
||||
S_XMASBUSH,
|
||||
|
||||
// Botanic Serenity's loads of scenery states
|
||||
S_BSZTALLFLOWER_RED,
|
||||
|
@ -2330,10 +2335,6 @@ typedef enum state
|
|||
S_PITY4,
|
||||
S_PITY5,
|
||||
S_PITY6,
|
||||
S_PITY7,
|
||||
S_PITY8,
|
||||
S_PITY9,
|
||||
S_PITY10,
|
||||
|
||||
S_FIRS1,
|
||||
S_FIRS2,
|
||||
|
@ -2725,14 +2726,18 @@ typedef enum state
|
|||
S_FOUR2,
|
||||
S_FIVE2,
|
||||
|
||||
S_LOCKON1,
|
||||
S_LOCKON2,
|
||||
|
||||
// Tag Sign
|
||||
S_TTAG1,
|
||||
S_TTAG,
|
||||
|
||||
// Got Flag Sign
|
||||
S_GOTFLAG1,
|
||||
S_GOTFLAG2,
|
||||
S_GOTFLAG3,
|
||||
S_GOTFLAG4,
|
||||
S_GOTFLAG,
|
||||
S_GOTREDFLAG,
|
||||
S_GOTBLUEFLAG,
|
||||
|
||||
S_CORK,
|
||||
|
||||
// Red Ring
|
||||
S_RRNG1,
|
||||
|
@ -3367,6 +3372,7 @@ typedef enum mobj_type
|
|||
|
||||
// Deep Sea Scenery
|
||||
MT_GARGOYLE, // Deep Sea Gargoyle
|
||||
MT_BIGGARGOYLE, // Deep Sea Gargoyle (Big)
|
||||
MT_SEAWEED, // DSZ Seaweed
|
||||
MT_WATERDRIP, // Dripping Water source
|
||||
MT_WATERDROP, // Water drop from dripping water
|
||||
|
@ -3435,7 +3441,14 @@ typedef enum mobj_type
|
|||
// Christmas Scenery
|
||||
MT_XMASPOLE,
|
||||
MT_CANDYCANE,
|
||||
MT_SNOWMAN,
|
||||
MT_SNOWMAN, // normal
|
||||
MT_SNOWMANHAT, // with hat + scarf
|
||||
MT_LAMPPOST1, // normal
|
||||
MT_LAMPPOST2, // with snow
|
||||
MT_HANGSTAR,
|
||||
// Xmas GFZ bushes
|
||||
MT_XMASBERRYBUSH,
|
||||
MT_XMASBUSH,
|
||||
|
||||
// Botanic Serenity scenery
|
||||
MT_BSZTALLFLOWER_RED,
|
||||
|
@ -3542,9 +3555,9 @@ typedef enum mobj_type
|
|||
MT_SCORE, // score logo
|
||||
MT_DROWNNUMBERS, // Drowning Timer
|
||||
MT_GOTEMERALD, // Chaos Emerald (intangible)
|
||||
MT_LOCKON, // Target
|
||||
MT_TAG, // Tag Sign
|
||||
MT_GOTFLAG, // Got Flag sign
|
||||
MT_GOTFLAG2, // Got Flag sign
|
||||
|
||||
// Ambient Sounds
|
||||
MT_AWATERA, // Ambient Water Sound 1
|
||||
|
@ -3558,6 +3571,8 @@ typedef enum mobj_type
|
|||
MT_RANDOMAMBIENT,
|
||||
MT_RANDOMAMBIENT2,
|
||||
|
||||
MT_CORK,
|
||||
|
||||
// Ring Weapons
|
||||
MT_REDRING,
|
||||
MT_BOUNCERING,
|
||||
|
|
|
@ -445,10 +445,32 @@ static int lib_pIsValidSprite2(lua_State *L)
|
|||
INLEVEL
|
||||
if (!mobj)
|
||||
return LUA_ErrInvalid(L, "mobj_t");
|
||||
lua_pushboolean(L, (mobj->skin && (((skin_t *)mobj->skin)->sprites[spr2].numframes > 0)));
|
||||
lua_pushboolean(L, (mobj->skin && (((skin_t *)mobj->skin)->sprites[spr2].numframes)));
|
||||
return 1;
|
||||
}
|
||||
|
||||
// P_SpawnLockOn doesn't exist either, but we want to expose making a local mobj without encouraging hacks.
|
||||
|
||||
static int lib_pSpawnLockOn(lua_State *L)
|
||||
{
|
||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||
mobj_t *lockon = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
|
||||
statenum_t state = luaL_checkinteger(L, 3);
|
||||
NOHUD
|
||||
INLEVEL
|
||||
if (!lockon)
|
||||
return LUA_ErrInvalid(L, "mobj_t");
|
||||
if (!player)
|
||||
return LUA_ErrInvalid(L, "player_t");
|
||||
if (P_IsLocalPlayer(player)) // Only display it on your own view.
|
||||
{
|
||||
mobj_t *visual = P_SpawnMobj(lockon->x, lockon->y, lockon->z, MT_LOCKON); // positioning, flip handled in P_SceneryThinker
|
||||
visual->target = lockon;
|
||||
P_SetMobjStateNF(visual, state);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lib_pSpawnMissile(lua_State *L)
|
||||
{
|
||||
mobj_t *source = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
|
||||
|
@ -793,6 +815,17 @@ static int lib_pStealPlayerScore(lua_State *L)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int lib_pGetJumpFlags(lua_State *L)
|
||||
{
|
||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||
NOHUD
|
||||
INLEVEL
|
||||
if (!player)
|
||||
return LUA_ErrInvalid(L, "player_t");
|
||||
lua_pushinteger(L, P_GetJumpFlags(player));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lib_pPlayerInPain(lua_State *L)
|
||||
{
|
||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||
|
@ -1055,11 +1088,12 @@ static int lib_pLookForEnemies(lua_State *L)
|
|||
{
|
||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||
boolean nonenemies = lua_opttrueboolean(L, 2);
|
||||
boolean bullet = lua_optboolean(L, 3);
|
||||
NOHUD
|
||||
INLEVEL
|
||||
if (!player)
|
||||
return LUA_ErrInvalid(L, "player_t");
|
||||
lua_pushboolean(L, P_LookForEnemies(player, nonenemies));
|
||||
LUA_PushUserdata(L, P_LookForEnemies(player, nonenemies, bullet), META_MOBJ);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -2147,6 +2181,31 @@ static int lib_sSoundPlaying(lua_State *L)
|
|||
return 1;
|
||||
}
|
||||
|
||||
// This doesn't really exist, but we're providing it as a handy netgame-safe wrapper for stuff that should be locally handled.
|
||||
|
||||
static int lib_sStartMusicCaption(lua_State *L)
|
||||
{
|
||||
player_t *player = NULL;
|
||||
const char *caption = luaL_checkstring(L, 1);
|
||||
UINT16 lifespan = (UINT16)luaL_checkinteger(L, 2);
|
||||
//HUDSAFE
|
||||
INLEVEL
|
||||
|
||||
if (!lua_isnone(L, 3) && lua_isuserdata(L, 3))
|
||||
{
|
||||
player = *((player_t **)luaL_checkudata(L, 3, META_PLAYER));
|
||||
if (!player)
|
||||
return LUA_ErrInvalid(L, "player_t");
|
||||
}
|
||||
|
||||
if (lifespan && (!player || P_IsLocalPlayer(player)))
|
||||
{
|
||||
strlcpy(S_sfx[sfx_None].caption, caption, sizeof(S_sfx[sfx_None].caption));
|
||||
S_StartCaption(sfx_None, -1, lifespan);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// G_GAME
|
||||
////////////
|
||||
|
||||
|
@ -2327,6 +2386,7 @@ static luaL_Reg lib[] = {
|
|||
{"P_SpawnMobj",lib_pSpawnMobj},
|
||||
{"P_RemoveMobj",lib_pRemoveMobj},
|
||||
{"P_IsValidSprite2", lib_pIsValidSprite2},
|
||||
{"P_SpawnLockOn", lib_pSpawnLockOn},
|
||||
{"P_SpawnMissile",lib_pSpawnMissile},
|
||||
{"P_SpawnXYZMissile",lib_pSpawnXYZMissile},
|
||||
{"P_SpawnPointMissile",lib_pSpawnPointMissile},
|
||||
|
@ -2354,6 +2414,7 @@ static luaL_Reg lib[] = {
|
|||
{"P_GetPlayerControlDirection",lib_pGetPlayerControlDirection},
|
||||
{"P_AddPlayerScore",lib_pAddPlayerScore},
|
||||
{"P_StealPlayerScore",lib_pStealPlayerScore},
|
||||
{"P_GetJumpFlags",lib_pGetJumpFlags},
|
||||
{"P_PlayerInPain",lib_pPlayerInPain},
|
||||
{"P_DoPlayerPain",lib_pDoPlayerPain},
|
||||
{"P_ResetPlayer",lib_pResetPlayer},
|
||||
|
@ -2457,6 +2518,7 @@ static luaL_Reg lib[] = {
|
|||
{"S_OriginPlaying",lib_sOriginPlaying},
|
||||
{"S_IdPlaying",lib_sIdPlaying},
|
||||
{"S_SoundPlaying",lib_sSoundPlaying},
|
||||
{"S_StartMusicCaption", lib_sStartMusicCaption},
|
||||
|
||||
// g_game
|
||||
{"G_BuildMapName",lib_gBuildMapName},
|
||||
|
|
|
@ -31,6 +31,7 @@ enum sfxinfo_read {
|
|||
sfxinfor_singular,
|
||||
sfxinfor_priority,
|
||||
sfxinfor_flags, // "pitch"
|
||||
sfxinfor_caption,
|
||||
sfxinfor_skinsound
|
||||
};
|
||||
const char *const sfxinfo_ropt[] = {
|
||||
|
@ -38,18 +39,21 @@ const char *const sfxinfo_ropt[] = {
|
|||
"singular",
|
||||
"priority",
|
||||
"flags",
|
||||
"caption",
|
||||
"skinsound",
|
||||
NULL};
|
||||
|
||||
enum sfxinfo_write {
|
||||
sfxinfow_singular = 0,
|
||||
sfxinfow_priority,
|
||||
sfxinfow_flags // "pitch"
|
||||
sfxinfow_flags, // "pitch"
|
||||
sfxinfow_caption
|
||||
};
|
||||
const char *const sfxinfo_wopt[] = {
|
||||
"singular",
|
||||
"priority",
|
||||
"flags",
|
||||
"caption",
|
||||
NULL};
|
||||
|
||||
//
|
||||
|
@ -769,8 +773,8 @@ static int lib_getSfxInfo(lua_State *L)
|
|||
lua_remove(L, 1);
|
||||
|
||||
i = luaL_checkinteger(L, 1);
|
||||
if (i >= NUMSFX)
|
||||
return luaL_error(L, "sfxinfo[] index %d out of range (0 - %d)", i, NUMSFX-1);
|
||||
if (i == 0 || i >= NUMSFX)
|
||||
return luaL_error(L, "sfxinfo[] index %d out of range (1 - %d)", i, NUMSFX-1);
|
||||
LUA_PushUserdata(L, &S_sfx[i], META_SFXINFO);
|
||||
return 1;
|
||||
}
|
||||
|
@ -783,9 +787,9 @@ static int lib_setSfxInfo(lua_State *L)
|
|||
lua_remove(L, 1);
|
||||
{
|
||||
UINT32 i = luaL_checkinteger(L, 1);
|
||||
if (i >= NUMSFX)
|
||||
return luaL_error(L, "sfxinfo[] index %d out of range (0 - %d)", i, NUMSFX-1);
|
||||
info = &S_sfx[i]; // get the mobjinfo to assign to.
|
||||
if (i == 0 || i >= NUMSFX)
|
||||
return luaL_error(L, "sfxinfo[] index %d out of range (1 - %d)", i, NUMSFX-1);
|
||||
info = &S_sfx[i]; // get the sfxinfo to assign to.
|
||||
}
|
||||
luaL_checktype(L, 2, LUA_TTABLE); // check that we've been passed a table.
|
||||
lua_remove(L, 1); // pop mobjtype num, don't need it any more.
|
||||
|
@ -814,6 +818,9 @@ static int lib_setSfxInfo(lua_State *L)
|
|||
case sfxinfow_flags:
|
||||
info->pitch = (INT32)luaL_checkinteger(L, 3);
|
||||
break;
|
||||
case sfxinfow_caption:
|
||||
strlcpy(info->caption, luaL_checkstring(L, 3), sizeof(info->caption));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -851,11 +858,14 @@ static int sfxinfo_get(lua_State *L)
|
|||
case sfxinfor_flags:
|
||||
lua_pushinteger(L, sfx->pitch);
|
||||
return 1;
|
||||
case sfxinfor_caption:
|
||||
lua_pushstring(L, sfx->caption);
|
||||
return 1;
|
||||
case sfxinfor_skinsound:
|
||||
lua_pushinteger(L, sfx->skinsound);
|
||||
return 1;
|
||||
default:
|
||||
return luaL_error(L, "impossible error");
|
||||
return luaL_error(L, "Field does not exist in sfxinfo_t");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -886,8 +896,11 @@ static int sfxinfo_set(lua_State *L)
|
|||
case sfxinfow_flags:
|
||||
sfx->pitch = luaL_checkinteger(L, 1);
|
||||
break;
|
||||
case sfxinfow_caption:
|
||||
strlcpy(sfx->caption, luaL_checkstring(L, 1), sizeof(sfx->caption));
|
||||
break;
|
||||
default:
|
||||
return luaL_error(L, "impossible error");
|
||||
return luaL_error(L, "Field does not exist in sfxinfo_t");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -511,7 +511,8 @@ static int mobj_set(lua_State *L)
|
|||
for (i = 0; i < numskins; i++)
|
||||
if (fastcmp(skins[i].name, skin))
|
||||
{
|
||||
mo->skin = &skins[i];
|
||||
if (!mo->player || R_SkinUsable(mo->player-players, i))
|
||||
mo->skin = &skins[i];
|
||||
return 0;
|
||||
}
|
||||
return luaL_error(L, "mobj.skin '%s' not found!", skin);
|
||||
|
|
|
@ -194,8 +194,6 @@ static int player_get(lua_State *L)
|
|||
lua_pushinteger(L, plr->gotcontinue);
|
||||
else if (fastcmp(field,"speed"))
|
||||
lua_pushfixed(L, plr->speed);
|
||||
else if (fastcmp(field,"jumping"))
|
||||
lua_pushboolean(L, plr->jumping);
|
||||
else if (fastcmp(field,"secondjump"))
|
||||
lua_pushinteger(L, plr->secondjump);
|
||||
else if (fastcmp(field,"fly1"))
|
||||
|
@ -459,8 +457,6 @@ static int player_set(lua_State *L)
|
|||
plr->gotcontinue = (UINT8)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"speed"))
|
||||
plr->speed = luaL_checkfixed(L, 3);
|
||||
else if (fastcmp(field,"jumping"))
|
||||
plr->jumping = luaL_checkboolean(L, 3);
|
||||
else if (fastcmp(field,"secondjump"))
|
||||
plr->secondjump = (UINT8)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"fly1"))
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include "z_zone.h"
|
||||
#include "v_video.h"
|
||||
#include "i_video.h"
|
||||
#include "m_misc.h"
|
||||
|
||||
// GIFs are always little-endian
|
||||
#include "byteptr.h"
|
||||
|
@ -396,7 +397,6 @@ static void GIF_headwrite(void)
|
|||
{
|
||||
UINT8 *gifhead = Z_Malloc(800, PU_STATIC, NULL);
|
||||
UINT8 *p = gifhead;
|
||||
RGBA_t *c;
|
||||
INT32 i;
|
||||
UINT16 rwidth, rheight;
|
||||
|
||||
|
@ -427,12 +427,17 @@ static void GIF_headwrite(void)
|
|||
WRITEUINT8(p, 0x00);
|
||||
|
||||
// write color table
|
||||
for (i = 0; i < 256; ++i)
|
||||
{
|
||||
c = &pLocalPalette[i];
|
||||
WRITEUINT8(p, c->s.red);
|
||||
WRITEUINT8(p, c->s.green);
|
||||
WRITEUINT8(p, c->s.blue);
|
||||
RGBA_t *pal = ((cv_screenshot_colorprofile.value)
|
||||
? pLocalPalette
|
||||
: pMasterPalette);
|
||||
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
WRITEUINT8(p, pal[i].s.red);
|
||||
WRITEUINT8(p, pal[i].s.green);
|
||||
WRITEUINT8(p, pal[i].s.blue);
|
||||
}
|
||||
}
|
||||
|
||||
// write extension block
|
||||
|
|
|
@ -942,7 +942,7 @@ boolean OP_FreezeObjectplace(void)
|
|||
if (!objectplacing)
|
||||
return false;
|
||||
|
||||
if ((maptol & TOL_NIGHTS) && (players[consoleplayer].pflags & PF_NIGHTSMODE))
|
||||
if ((maptol & TOL_NIGHTS) && (players[consoleplayer].powers[pw_carry] == CR_NIGHTSMODE))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
@ -968,7 +968,7 @@ void OP_NightsObjectplace(player_t *player)
|
|||
if (player->pflags & PF_ATTACKDOWN)
|
||||
{
|
||||
// Are ANY objectplace buttons pressed? If no, remove flag.
|
||||
if (!(cmd->buttons & (BT_ATTACK|BT_TOSSFLAG|BT_USE|BT_CAMRIGHT|BT_CAMLEFT)))
|
||||
if (!(cmd->buttons & (BT_ATTACK|BT_TOSSFLAG|BT_USE|BT_WEAPONNEXT|BT_WEAPONPREV)))
|
||||
player->pflags &= ~PF_ATTACKDOWN;
|
||||
|
||||
// Do nothing.
|
||||
|
@ -1019,7 +1019,7 @@ void OP_NightsObjectplace(player_t *player)
|
|||
}
|
||||
|
||||
// This places a ring!
|
||||
if (cmd->buttons & BT_CAMRIGHT)
|
||||
if (cmd->buttons & BT_WEAPONNEXT)
|
||||
{
|
||||
player->pflags |= PF_ATTACKDOWN;
|
||||
if (!OP_HeightOkay(player, false))
|
||||
|
@ -1030,7 +1030,7 @@ void OP_NightsObjectplace(player_t *player)
|
|||
}
|
||||
|
||||
// This places a wing item!
|
||||
if (cmd->buttons & BT_CAMLEFT)
|
||||
if (cmd->buttons & BT_WEAPONPREV)
|
||||
{
|
||||
player->pflags |= PF_ATTACKDOWN;
|
||||
if (!OP_HeightOkay(player, false))
|
||||
|
@ -1255,7 +1255,7 @@ void Command_ObjectPlace_f(void)
|
|||
{
|
||||
objectplacing = true;
|
||||
|
||||
if ((players[0].pflags & PF_NIGHTSMODE))
|
||||
if ((players[0].powers[pw_carry] == CR_NIGHTSMODE))
|
||||
return;
|
||||
|
||||
if (!COM_CheckParm("-silent"))
|
||||
|
@ -1326,7 +1326,7 @@ void Command_ObjectPlace_f(void)
|
|||
|
||||
// Don't touch the NiGHTS Objectplace stuff.
|
||||
// ... or if the mo mysteriously vanished.
|
||||
if (!players[0].mo || (players[0].pflags & PF_NIGHTSMODE))
|
||||
if (!players[0].mo || (players[0].powers[pw_carry] == CR_NIGHTSMODE))
|
||||
return;
|
||||
|
||||
// If still in dummy state, get out of it.
|
||||
|
|
72
src/m_cond.c
72
src/m_cond.c
|
@ -573,31 +573,31 @@ extraemblem_t extraemblems[MAXEXTRAEMBLEMS] =
|
|||
unlockable_t unlockables[MAXUNLOCKABLES] =
|
||||
{
|
||||
// Name, Objective, Menu Height, ConditionSet, Unlock Type, Variable, NoCecho, NoChecklist
|
||||
/* 01 */ {"Record Attack", "Complete Greenflower Zone, Act 1", 0, 1, SECRET_RECORDATTACK, 0, true, true, 0},
|
||||
/* 02 */ {"NiGHTS Mode", "Complete Floral Field", 0, 2, SECRET_NIGHTSMODE, 0, true, true, 0},
|
||||
/* 01 */ {"Record Attack", "/", 0, 1, SECRET_RECORDATTACK, 0, true, true, 0},
|
||||
/* 02 */ {"NiGHTS Mode", "/", 0, 2, SECRET_NIGHTSMODE, 0, true, true, 0},
|
||||
|
||||
/* 03 */ {"Play Credits", "Complete 1P Mode", 30, 10, SECRET_CREDITS, 0, true, true, 0},
|
||||
/* 04 */ {"Sound Test", "Complete 1P Mode", 40, 10, SECRET_SOUNDTEST, 0, false, false, 0},
|
||||
/* 03 */ {"Play Credits", "/", 30, 10, SECRET_CREDITS, 0, true, true, 0},
|
||||
/* 04 */ {"Sound Test", "/", 40, 10, SECRET_SOUNDTEST, 0, false, false, 0},
|
||||
|
||||
/* 05 */ {"EXTRA LEVELS", "", 60, 0, SECRET_HEADER, 0, true, true, 0},
|
||||
/* 05 */ {"EXTRA LEVELS", "/", 58, 0, SECRET_HEADER, 0, true, true, 0},
|
||||
|
||||
/* 06 */ {"Aerial Garden Zone", "Complete 1P Mode w/ all emeralds", 70, 11, SECRET_WARP, 40, false, false, 0},
|
||||
/* 07 */ {"Azure Temple Zone", "Complete Aerial Garden Zone", 80, 20, SECRET_WARP, 41, false, false, 0},
|
||||
/* 06 */ {"Aerial Garden Zone", "/", 70, 11, SECRET_WARP, 40, false, false, 0},
|
||||
/* 07 */ {"Azure Temple Zone", "/", 80, 20, SECRET_WARP, 41, false, false, 0},
|
||||
|
||||
/* 08 */ {"BONUS LEVELS", "", 100, 0, SECRET_HEADER, 0, true, true, 0},
|
||||
/* 08 */ {"BONUS LEVELS", "/", 98, 0, SECRET_HEADER, 0, true, true, 0},
|
||||
|
||||
/* 09 */ {"PLACEHOLDER", "PLACEHOLDER", 0, 0, SECRET_NONE, 0, true, true, 0},
|
||||
/* 10 */ {"Mario Koopa Blast", "Collect 60 Emblems", 110, 42, SECRET_WARP, 30, false, false, 0},
|
||||
/* 11 */ {"PLACEHOLDER", "PLACEHOLDER", 0, 0, SECRET_NONE, 0, true, true, 0},
|
||||
/* 09 */ {"PLACEHOLDER", "/", 0, 0, SECRET_NONE, 0, true, true, 0},
|
||||
/* 10 */ {"Mario Koopa Blast", "/", 110, 42, SECRET_WARP, 30, false, false, 0},
|
||||
/* 11 */ {"PLACEHOLDER", "/", 0, 0, SECRET_NONE, 0, true, true, 0},
|
||||
|
||||
/* 12 */ {"Spring Hill Zone", "Collect 100 Emblems", 0, 44, SECRET_NONE, 0, false, false, 0},
|
||||
/* 13 */ {"Black Hole", "A Rank in all Special Stages", 0, 50, SECRET_NONE, 0, false, true, 0},
|
||||
/* 12 */ {"Spring Hill Zone", "/", 0, 44, SECRET_NONE, 0, false, false, 0},
|
||||
/* 13 */ {"Black Hole", "Get grade A in all Special Stages", 0, 50, SECRET_NONE, 0, false, true, 0},
|
||||
|
||||
/* 14 */ {"Emblem Hints", "Collect 40 Emblems", 0, 41, SECRET_EMBLEMHINTS, 0, false, true, 0},
|
||||
/* 15 */ {"Emblem Radar", "Collect 80 Emblems", 0, 43, SECRET_ITEMFINDER, 0, false, true, 0},
|
||||
/* 14 */ {"Emblem Hints", "/", 0, 41, SECRET_EMBLEMHINTS, 0, false, true, 0},
|
||||
/* 15 */ {"Emblem Radar", "/", 0, 43, SECRET_ITEMFINDER, 0, false, true, 0},
|
||||
|
||||
/* 16 */ {"Pandora's Box", "Collect All Emblems", 0, 45, SECRET_PANDORA, 0, false, false, 0},
|
||||
/* 17 */ {"Level Select", "Collect All Emblems", 20, 45, SECRET_LEVELSELECT, 1, false, true, 0},
|
||||
/* 16 */ {"Pandora's Box", "/", 0, 45, SECRET_PANDORA, 0, false, false, 0},
|
||||
/* 17 */ {"Level Select", "/", 20, 45, SECRET_LEVELSELECT, 1, false, true, 0},
|
||||
};
|
||||
|
||||
// Default number of emblems and extra emblems
|
||||
|
@ -929,7 +929,7 @@ UINT8 M_CheckLevelEmblems(void)
|
|||
// Update Score, Time, Rings emblems
|
||||
for (i = 0; i < numemblems; ++i)
|
||||
{
|
||||
if (emblemlocations[i].type <= ET_SKIN || emblemlocations[i].collected)
|
||||
if (emblemlocations[i].type <= ET_SKIN || emblemlocations[i].type == ET_MAP || emblemlocations[i].collected)
|
||||
continue;
|
||||
|
||||
levelnum = emblemlocations[i].level;
|
||||
|
@ -963,6 +963,42 @@ UINT8 M_CheckLevelEmblems(void)
|
|||
return somethingUnlocked;
|
||||
}
|
||||
|
||||
UINT8 M_CompletionEmblems(void) // Bah! Duplication sucks, but it's for a separate print when awarding emblems and it's sorta different enough.
|
||||
{
|
||||
INT32 i;
|
||||
INT32 embtype;
|
||||
INT16 levelnum;
|
||||
UINT8 res;
|
||||
UINT8 somethingUnlocked = 0;
|
||||
UINT8 flags;
|
||||
|
||||
for (i = 0; i < numemblems; ++i)
|
||||
{
|
||||
if (emblemlocations[i].type != ET_MAP || emblemlocations[i].collected)
|
||||
continue;
|
||||
|
||||
levelnum = emblemlocations[i].level;
|
||||
embtype = emblemlocations[i].var;
|
||||
flags = MV_BEATEN;
|
||||
|
||||
if (embtype & ME_ALLEMERALDS)
|
||||
flags |= MV_ALLEMERALDS;
|
||||
|
||||
if (embtype & ME_ULTIMATE)
|
||||
flags |= MV_ULTIMATE;
|
||||
|
||||
if (embtype & ME_PERFECT)
|
||||
flags |= MV_PERFECT;
|
||||
|
||||
res = ((mapvisited[levelnum - 1] & flags) == flags);
|
||||
|
||||
emblemlocations[i].collected = res;
|
||||
if (res)
|
||||
++somethingUnlocked;
|
||||
}
|
||||
return somethingUnlocked;
|
||||
}
|
||||
|
||||
// -------------------
|
||||
// Quick unlock checks
|
||||
// -------------------
|
||||
|
|
|
@ -73,6 +73,12 @@ typedef struct
|
|||
#define ET_RINGS 4
|
||||
#define ET_NGRADE 5
|
||||
#define ET_NTIME 6
|
||||
#define ET_MAP 7
|
||||
|
||||
// Map emblem flags
|
||||
#define ME_ALLEMERALDS 1
|
||||
#define ME_ULTIMATE 2
|
||||
#define ME_PERFECT 4
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
@ -153,6 +159,7 @@ void M_CheckUnlockConditions(void);
|
|||
UINT8 M_UpdateUnlockablesAndExtraEmblems(void);
|
||||
void M_SilentUpdateUnlockablesAndEmblems(void);
|
||||
UINT8 M_CheckLevelEmblems(void);
|
||||
UINT8 M_CompletionEmblems(void);
|
||||
|
||||
// Checking unlockable status
|
||||
UINT8 M_AnySecretUnlocked(void);
|
||||
|
|
3546
src/m_menu.c
3546
src/m_menu.c
File diff suppressed because it is too large
Load diff
39
src/m_menu.h
39
src/m_menu.h
|
@ -66,7 +66,7 @@ void M_StartMessage(const char *string, void *routine, menumessagetype_t itemtyp
|
|||
// Called by linux_x/i_video_xshm.c
|
||||
void M_QuitResponse(INT32 ch);
|
||||
|
||||
// Determines whether to show a level in the list
|
||||
// Determines whether to show a level in the list (platter version does not need to be exposed)
|
||||
boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt);
|
||||
|
||||
|
||||
|
@ -149,8 +149,6 @@ typedef struct menuitem_s
|
|||
UINT8 alphaKey;
|
||||
} menuitem_t;
|
||||
|
||||
extern menuitem_t PlayerMenu[32];
|
||||
|
||||
typedef struct menu_s
|
||||
{
|
||||
const char *menutitlepic;
|
||||
|
@ -174,14 +172,36 @@ extern menu_t SP_LoadDef;
|
|||
// Stuff for customizing the player select screen
|
||||
typedef struct
|
||||
{
|
||||
boolean used;
|
||||
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;
|
||||
|
||||
// level select platter
|
||||
typedef struct
|
||||
{
|
||||
char header[22+5]; // mapheader_t lvltttl max length + " ZONE"
|
||||
INT32 maplist[3];
|
||||
char mapnames[3][17+1];
|
||||
boolean mapavailable[4]; // mapavailable[3] == wide or not
|
||||
} levelselectrow_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UINT8 numrows;
|
||||
levelselectrow_t *rows;
|
||||
} levelselect_t;
|
||||
// experimental level select end
|
||||
|
||||
// descriptions for gametype select screen
|
||||
typedef struct
|
||||
{
|
||||
char notes[441];
|
||||
} gtdesc_t;
|
||||
|
||||
// mode descriptions for video mode menu
|
||||
typedef struct
|
||||
{
|
||||
|
@ -222,6 +242,9 @@ void M_ForceSaveSlotSelected(INT32 sslot);
|
|||
|
||||
void M_CheatActivationResponder(INT32 ch);
|
||||
|
||||
// Level select updating
|
||||
void Nextmap_OnChange(void);
|
||||
|
||||
// Screenshot menu updating
|
||||
void Moviemode_mode_Onchange(void);
|
||||
void Screenshot_option_Onchange(void);
|
||||
|
@ -263,14 +286,14 @@ void Screenshot_option_Onchange(void);
|
|||
NULL\
|
||||
}
|
||||
|
||||
#define MAPICONMENUSTYLE(header, source, prev)\
|
||||
#define MAPPLATTERMENUSTYLE(header, source)\
|
||||
{\
|
||||
header,\
|
||||
sizeof (source)/sizeof (menuitem_t),\
|
||||
prev,\
|
||||
&MainDef,\
|
||||
source,\
|
||||
M_DrawServerMenu,\
|
||||
27,40,\
|
||||
M_DrawLevelPlatterMenu,\
|
||||
0,0,\
|
||||
0,\
|
||||
NULL\
|
||||
}
|
||||
|
|
56
src/m_misc.c
56
src/m_misc.c
|
@ -100,6 +100,8 @@ static CV_PossibleValue_t screenshot_cons_t[] = {{0, "Default"}, {1, "HOME"}, {2
|
|||
consvar_t cv_screenshot_option = {"screenshot_option", "Default", CV_SAVE|CV_CALL, screenshot_cons_t, Screenshot_option_Onchange, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_screenshot_folder = {"screenshot_folder", "", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_screenshot_colorprofile = {"screenshot_colorprofile", "Yes", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
static CV_PossibleValue_t moviemode_cons_t[] = {{MM_GIF, "GIF"}, {MM_APNG, "aPNG"}, {MM_SCREENSHOT, "Screenshots"}, {0, NULL}};
|
||||
consvar_t cv_moviemode = {"moviemode_mode", "GIF", CV_SAVE|CV_CALL, moviemode_cons_t, Moviemode_mode_Onchange, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
|
@ -585,7 +587,7 @@ static const char *Newsnapshotfile(const char *pathname, const char *ext)
|
|||
|
||||
i += add * result;
|
||||
|
||||
if (add < 0 || add > 9999)
|
||||
if (i < 0 || i > 9999)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -610,20 +612,25 @@ static void PNG_warn(png_structp PNG, png_const_charp pngtext)
|
|||
CONS_Debug(DBG_RENDER, "libpng warning at %p: %s", PNG, pngtext);
|
||||
}
|
||||
|
||||
static void M_PNGhdr(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png_uint_32 width, PNG_CONST png_uint_32 height, PNG_CONST png_byte *palette)
|
||||
static void M_PNGhdr(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png_uint_32 width, PNG_CONST png_uint_32 height, const boolean palette)
|
||||
{
|
||||
const png_byte png_interlace = PNG_INTERLACE_NONE; //PNG_INTERLACE_ADAM7
|
||||
if (palette)
|
||||
{
|
||||
png_colorp png_PLTE = png_malloc(png_ptr, sizeof(png_color)*256); //palette
|
||||
const png_byte *pal = palette;
|
||||
png_uint_16 i;
|
||||
|
||||
RGBA_t *pal = ((cv_screenshot_colorprofile.value)
|
||||
? pLocalPalette
|
||||
: pMasterPalette);
|
||||
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
png_PLTE[i].red = *pal; pal++;
|
||||
png_PLTE[i].green = *pal; pal++;
|
||||
png_PLTE[i].blue = *pal; pal++;
|
||||
png_PLTE[i].red = pal[i].s.red;
|
||||
png_PLTE[i].green = pal[i].s.green;
|
||||
png_PLTE[i].blue = pal[i].s.blue;
|
||||
}
|
||||
|
||||
png_set_IHDR(png_ptr, png_info_ptr, width, height, 8, PNG_COLOR_TYPE_PALETTE,
|
||||
png_interlace, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
|
||||
png_write_info_before_PLTE(png_ptr, png_info_ptr);
|
||||
|
@ -924,7 +931,7 @@ static void M_PNGfix_acTL(png_structp png_ptr, png_infop png_info_ptr)
|
|||
fseek(apng_FILE, oldpos, SEEK_SET);
|
||||
}
|
||||
|
||||
static boolean M_SetupaPNG(png_const_charp filename, png_bytep pal)
|
||||
static boolean M_SetupaPNG(png_const_charp filename, boolean palette)
|
||||
{
|
||||
apng_FILE = fopen(filename,"wb+"); // + mode for reading
|
||||
if (!apng_FILE)
|
||||
|
@ -966,7 +973,7 @@ static boolean M_SetupaPNG(png_const_charp filename, png_bytep pal)
|
|||
png_set_compression_strategy(apng_ptr, cv_zlib_strategya.value);
|
||||
png_set_compression_window_bits(apng_ptr, cv_zlib_window_bitsa.value);
|
||||
|
||||
M_PNGhdr(apng_ptr, apng_info_ptr, vid.width, vid.height, pal);
|
||||
M_PNGhdr(apng_ptr, apng_info_ptr, vid.width, vid.height, palette);
|
||||
|
||||
M_PNGText(apng_ptr, apng_info_ptr, true);
|
||||
|
||||
|
@ -1007,9 +1014,9 @@ static inline moviemode_t M_StartMovieAPNG(const char *pathname)
|
|||
}
|
||||
|
||||
if (rendermode == render_soft)
|
||||
ret = M_SetupaPNG(va(pandf,pathname,freename), W_CacheLumpName(GetPalette(), PU_CACHE));
|
||||
ret = M_SetupaPNG(va(pandf,pathname,freename), true);
|
||||
else
|
||||
ret = M_SetupaPNG(va(pandf,pathname,freename), NULL);
|
||||
ret = M_SetupaPNG(va(pandf,pathname,freename), false);
|
||||
|
||||
if (!ret)
|
||||
{
|
||||
|
@ -1215,11 +1222,10 @@ void M_StopMovie(void)
|
|||
* \param palette Palette of image data
|
||||
* \note if palette is NULL, BGR888 format
|
||||
*/
|
||||
boolean M_SavePNG(const char *filename, void *data, int width, int height, const UINT8 *palette)
|
||||
boolean M_SavePNG(const char *filename, void *data, int width, int height, const boolean palette)
|
||||
{
|
||||
png_structp png_ptr;
|
||||
png_infop png_info_ptr;
|
||||
PNG_CONST png_byte *PLTE = (const png_byte *)palette;
|
||||
#ifdef PNG_SETJMP_SUPPORTED
|
||||
#ifdef USE_FAR_KEYWORD
|
||||
jmp_buf jmpbuf;
|
||||
|
@ -1282,7 +1288,7 @@ boolean M_SavePNG(const char *filename, void *data, int width, int height, const
|
|||
png_set_compression_strategy(png_ptr, cv_zlib_strategy.value);
|
||||
png_set_compression_window_bits(png_ptr, cv_zlib_window_bits.value);
|
||||
|
||||
M_PNGhdr(png_ptr, png_info_ptr, width, height, PLTE);
|
||||
M_PNGhdr(png_ptr, png_info_ptr, width, height, palette);
|
||||
|
||||
M_PNGText(png_ptr, png_info_ptr, false);
|
||||
|
||||
|
@ -1329,7 +1335,7 @@ typedef struct
|
|||
* \param palette Palette of image data
|
||||
*/
|
||||
#if NUMSCREENS > 2
|
||||
static boolean WritePCXfile(const char *filename, const UINT8 *data, int width, int height, const UINT8 *palette)
|
||||
static boolean WritePCXfile(const char *filename, const UINT8 *data, int width, int height)
|
||||
{
|
||||
int i;
|
||||
size_t length;
|
||||
|
@ -1370,8 +1376,20 @@ static boolean WritePCXfile(const char *filename, const UINT8 *data, int width,
|
|||
|
||||
// write the palette
|
||||
*pack++ = 0x0c; // palette ID byte
|
||||
for (i = 0; i < 768; i++)
|
||||
*pack++ = *palette++;
|
||||
|
||||
// write color table
|
||||
{
|
||||
RGBA_t *pal = ((cv_screenshot_colorprofile.value)
|
||||
? pLocalPalette
|
||||
: pMasterPalette);
|
||||
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
*pack++ = pal[i].s.red;
|
||||
*pack++ = pal[i].s.green;
|
||||
*pack++ = pal[i].s.blue;
|
||||
}
|
||||
}
|
||||
|
||||
// write output file
|
||||
length = pack - (UINT8 *)pcx;
|
||||
|
@ -1445,11 +1463,9 @@ void M_DoScreenShot(void)
|
|||
if (rendermode != render_none)
|
||||
{
|
||||
#ifdef USE_PNG
|
||||
ret = M_SavePNG(va(pandf,pathname,freename), linear, vid.width, vid.height,
|
||||
W_CacheLumpName(GetPalette(), PU_CACHE));
|
||||
ret = M_SavePNG(va(pandf,pathname,freename), linear, vid.width, vid.height, true);
|
||||
#else
|
||||
ret = WritePCXfile(va(pandf,pathname,freename), linear, vid.width, vid.height,
|
||||
W_CacheLumpName(GetPalette(), PU_CACHE));
|
||||
ret = WritePCXfile(va(pandf,pathname,freename), linear, vid.width, vid.height);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "tables.h"
|
||||
|
||||
#include "d_event.h" // Screenshot responder
|
||||
#include "command.h"
|
||||
|
||||
typedef enum {
|
||||
MM_OFF = 0,
|
||||
|
@ -28,6 +29,12 @@ typedef enum {
|
|||
} moviemode_t;
|
||||
extern moviemode_t moviemode;
|
||||
|
||||
extern consvar_t cv_screenshot_option, cv_screenshot_folder, cv_screenshot_colorprofile;
|
||||
extern consvar_t cv_moviemode;
|
||||
extern consvar_t cv_zlib_memory, cv_zlib_level, cv_zlib_strategy, cv_zlib_window_bits;
|
||||
extern consvar_t cv_zlib_memorya, cv_zlib_levela, cv_zlib_strategya, cv_zlib_window_bitsa;
|
||||
extern consvar_t cv_apng_delay;
|
||||
|
||||
void M_StartMovie(void);
|
||||
void M_SaveFrame(void);
|
||||
void M_StopMovie(void);
|
||||
|
@ -57,7 +64,7 @@ void FIL_ForceExtension(char *path, const char *extension);
|
|||
boolean FIL_CheckExtension(const char *in);
|
||||
|
||||
#ifdef HAVE_PNG
|
||||
boolean M_SavePNG(const char *filename, void *data, int width, int height, const UINT8 *palette);
|
||||
boolean M_SavePNG(const char *filename, void *data, int width, int height, const boolean palette);
|
||||
#endif
|
||||
|
||||
extern boolean takescreenshot;
|
||||
|
|
|
@ -3170,6 +3170,8 @@ void A_Invincibility(mobj_t *actor)
|
|||
S_StopMusic();
|
||||
if (mariomode)
|
||||
G_GhostAddColor(GHC_INVINCIBLE);
|
||||
strlcpy(S_sfx[sfx_None].caption, "Invincibility", 14);
|
||||
S_StartCaption(sfx_None, -1, player->powers[pw_invulnerability]);
|
||||
S_ChangeMusicInternal((mariomode) ? "_minv" : "_inv", false);
|
||||
}
|
||||
}
|
||||
|
@ -3208,6 +3210,8 @@ void A_SuperSneakers(mobj_t *actor)
|
|||
S_StopMusic();
|
||||
S_ChangeMusicInternal("_shoes", false);
|
||||
}
|
||||
strlcpy(S_sfx[sfx_None].caption, "Speed shoes", 12);
|
||||
S_StartCaption(sfx_None, -1, player->powers[pw_sneakers]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4182,12 +4186,15 @@ void A_SignPlayer(mobj_t *actor)
|
|||
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 = skin;
|
||||
P_SetMobjState(ov, actor->info->seestate); // S_PLAY_SIGN
|
||||
if (skin->sprites[SPR2_SIGN].numframes)
|
||||
{
|
||||
// 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 = skin;
|
||||
P_SetMobjState(ov, actor->info->seestate); // S_PLAY_SIGN
|
||||
}
|
||||
}
|
||||
|
||||
// Function: A_OverlayThink
|
||||
|
@ -4517,7 +4524,7 @@ void A_MinusDigging(mobj_t *actor)
|
|||
|
||||
// If we're close enough to our target, pop out of the ground
|
||||
if (P_AproxDistance(actor->target->x-actor->x, actor->target->y-actor->y) < actor->radius
|
||||
&& abs(actor->target->z - actor->z) < actor->height)
|
||||
&& abs(actor->target->z - actor->z) < 2*actor->height)
|
||||
P_SetMobjState(actor, actor->info->missilestate);
|
||||
|
||||
// Snap to ground
|
||||
|
@ -5599,7 +5606,10 @@ void A_MixUp(mobj_t *actor)
|
|||
// No mix-up monitors in hide and seek or time only race.
|
||||
// The random factor is okay for other game modes, but in these, it is cripplingly unfair.
|
||||
if (gametype == GT_HIDEANDSEEK || gametype == GT_RACE)
|
||||
{
|
||||
S_StartSound(actor, sfx_lose);
|
||||
return;
|
||||
}
|
||||
|
||||
numplayers = 0;
|
||||
memset(teleported, 0, sizeof (teleported));
|
||||
|
@ -5608,7 +5618,7 @@ void A_MixUp(mobj_t *actor)
|
|||
// and grab their xyz coords
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE
|
||||
&& !players[i].exiting && !players[i].powers[pw_super])
|
||||
&& !players[i].exiting && !players[i].powers[pw_super] && players[i].powers[pw_carry] != CR_NIGHTSMODE)
|
||||
{
|
||||
if ((netgame || multiplayer) && players[i].spectator) // Ignore spectators
|
||||
continue;
|
||||
|
@ -5727,7 +5737,7 @@ void A_MixUp(mobj_t *actor)
|
|||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (playeringame[i] && players[i].playerstate == PST_LIVE
|
||||
&& players[i].mo && players[i].mo->health > 0 && !players[i].exiting && !players[i].powers[pw_super])
|
||||
&& players[i].mo && players[i].mo->health > 0 && !players[i].exiting && !players[i].powers[pw_super] && players[i].powers[pw_carry] != CR_NIGHTSMODE)
|
||||
{
|
||||
if ((netgame || multiplayer) && players[i].spectator)// Ignore spectators
|
||||
continue;
|
||||
|
@ -5777,7 +5787,7 @@ void A_MixUp(mobj_t *actor)
|
|||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (playeringame[i] && players[i].playerstate == PST_LIVE
|
||||
&& players[i].mo && players[i].mo->health > 0 && !players[i].exiting && !players[i].powers[pw_super])
|
||||
&& players[i].mo && players[i].mo->health > 0 && !players[i].exiting && !players[i].powers[pw_super] && players[i].powers[pw_carry] != CR_NIGHTSMODE)
|
||||
{
|
||||
if ((netgame || multiplayer) && players[i].spectator)// Ignore spectators
|
||||
continue;
|
||||
|
@ -5807,7 +5817,7 @@ void A_MixUp(mobj_t *actor)
|
|||
if (teleported[i])
|
||||
{
|
||||
if (playeringame[i] && players[i].playerstate == PST_LIVE
|
||||
&& players[i].mo && players[i].mo->health > 0 && !players[i].exiting && !players[i].powers[pw_super])
|
||||
&& players[i].mo && players[i].mo->health > 0 && !players[i].exiting && !players[i].powers[pw_super] && players[i].powers[pw_carry] != CR_NIGHTSMODE)
|
||||
{
|
||||
if ((netgame || multiplayer) && players[i].spectator)// Ignore spectators
|
||||
continue;
|
||||
|
@ -5949,7 +5959,7 @@ void A_RecyclePowers(mobj_t *actor)
|
|||
|
||||
for (j = 0; j < NUMPOWERS; j++)
|
||||
{
|
||||
if (j == pw_flashing || j == pw_underwater || j == pw_spacetime
|
||||
if (j == pw_flashing || j == pw_underwater || j == pw_spacetime || j == pw_carry
|
||||
|| j == pw_tailsfly || j == pw_extralife || j == pw_nocontrol || j == pw_super)
|
||||
continue;
|
||||
players[recv_pl].powers[j] = powers[send_pl][j];
|
||||
|
@ -8235,7 +8245,7 @@ void A_OrbitNights(mobj_t* actor)
|
|||
#endif
|
||||
|
||||
if (!actor->target || !actor->target->player ||
|
||||
!(actor->target->player->pflags & PF_NIGHTSMODE) || !actor->target->player->nightstime
|
||||
!(actor->target->player->powers[pw_carry] == CR_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]))
|
||||
{
|
||||
|
|
|
@ -1776,9 +1776,9 @@ static mobj_t *SearchMarioNode(msecnode_t *node)
|
|||
case MT_SCORE:
|
||||
case MT_DROWNNUMBERS:
|
||||
case MT_GOTEMERALD:
|
||||
case MT_LOCKON:
|
||||
case MT_TAG:
|
||||
case MT_GOTFLAG:
|
||||
case MT_GOTFLAG2:
|
||||
case MT_HOOP:
|
||||
case MT_HOOPCOLLIDE:
|
||||
case MT_NIGHTSCORE:
|
||||
|
@ -2557,6 +2557,12 @@ void T_PlaneDisplace(planedisplace_t *pd)
|
|||
direction = (control->floorheight > pd->last_height) ? 1 : -1;
|
||||
diff = FixedMul(control->floorheight-pd->last_height, pd->speed);
|
||||
|
||||
if (pd->reverse) // reverse direction?
|
||||
{
|
||||
direction *= -1;
|
||||
diff *= -1;
|
||||
}
|
||||
|
||||
if (pd->type == pd_floor || pd->type == pd_both)
|
||||
T_MovePlane(target, INT32_MAX/2, target->floorheight+diff, 0, 0, direction); // move floor
|
||||
if (pd->type == pd_ceiling || pd->type == pd_both)
|
||||
|
|
128
src/p_inter.c
128
src/p_inter.c
|
@ -257,6 +257,8 @@ void P_DoMatchSuper(player_t *player)
|
|||
S_StopMusic();
|
||||
if (mariomode)
|
||||
G_GhostAddColor(GHC_INVINCIBLE);
|
||||
strlcpy(S_sfx[sfx_None].caption, "Invincibility", 14);
|
||||
S_StartCaption(sfx_None, -1, player->powers[pw_invulnerability]);
|
||||
S_ChangeMusicInternal((mariomode) ? "_minv" : "_inv", false);
|
||||
}
|
||||
|
||||
|
@ -278,6 +280,8 @@ void P_DoMatchSuper(player_t *player)
|
|||
S_StopMusic();
|
||||
if (mariomode)
|
||||
G_GhostAddColor(GHC_INVINCIBLE);
|
||||
strlcpy(S_sfx[sfx_None].caption, "Invincibility", 14);
|
||||
S_StartCaption(sfx_None, -1, player->powers[pw_invulnerability]);
|
||||
S_ChangeMusicInternal((mariomode) ? "_minv" : "_inv", false);
|
||||
}
|
||||
}
|
||||
|
@ -367,11 +371,11 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
return;
|
||||
}
|
||||
|
||||
if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|
||||
|| ((player->pflags & PF_JUMPED) && (player->pflags & PF_FORCEJUMPDAMAGE || !(player->charflags & SF_NOJUMPSPIN) || (player->charability == CA_TWINSPIN && player->panim == PA_ABILITY)))
|
||||
if (((player->powers[pw_carry] == CR_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|
||||
|| ((player->pflags & PF_JUMPED) && (!(player->pflags & PF_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->charflags & SF_STOMPDAMAGE || player->pflags & PF_BOUNCING) && (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]
|
||||
|| elementalpierce) // Do you possess the ability to subdue the object?
|
||||
{
|
||||
|
@ -379,9 +383,11 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
{
|
||||
if (elementalpierce == 2)
|
||||
P_DoBubbleBounce(player);
|
||||
else
|
||||
else if (!(player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2))
|
||||
toucher->momz = -toucher->momz;
|
||||
}
|
||||
if (player->pflags & PF_BOUNCING)
|
||||
P_DoAbilityBounce(player, false);
|
||||
toucher->momx = -toucher->momx;
|
||||
toucher->momy = -toucher->momy;
|
||||
P_DamageMobj(special, toucher, toucher, 1, 0);
|
||||
|
@ -406,7 +412,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
////////////////////////////////////////////////////////
|
||||
/////ENEMIES!!//////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////
|
||||
if (special->type == MT_GSNAPPER && !(((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|
||||
if (special->type == MT_GSNAPPER && !(((player->powers[pw_carry] == CR_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|
||||
|| player->powers[pw_invulnerability] || player->powers[pw_super] || elementalpierce)
|
||||
&& toucher->z < special->z + special->height && toucher->z + toucher->height > special->z)
|
||||
{
|
||||
|
@ -416,23 +422,30 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
else if (special->type == MT_SHARP
|
||||
&& ((special->state == &states[special->info->xdeathstate]) || (toucher->z > special->z + special->height/2)))
|
||||
{
|
||||
// Cannot hit sharp from above or when red and angry
|
||||
P_DamageMobj(toucher, special, special, 1, 0);
|
||||
if (player->pflags & PF_BOUNCING)
|
||||
{
|
||||
toucher->momz = -toucher->momz;
|
||||
P_DoAbilityBounce(player, false);
|
||||
}
|
||||
else // Cannot hit sharp from above or when red and angry
|
||||
P_DamageMobj(toucher, special, special, 1, 0);
|
||||
}
|
||||
else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|
||||
|| ((player->pflags & PF_JUMPED) && (player->pflags & PF_FORCEJUMPDAMAGE || !(player->charflags & SF_NOJUMPSPIN) || (player->charability == CA_TWINSPIN && player->panim == PA_ABILITY)))
|
||||
else if (((player->powers[pw_carry] == CR_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|
||||
|| ((player->pflags & PF_JUMPED) && (!(player->pflags & PF_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->charflags & SF_STOMPDAMAGE || player->pflags & PF_BOUNCING) && (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) && (elementalpierce != 1))
|
||||
{
|
||||
if (elementalpierce == 2)
|
||||
P_DoBubbleBounce(player);
|
||||
else
|
||||
else if (!(player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2))
|
||||
toucher->momz = -toucher->momz;
|
||||
}
|
||||
if (player->pflags & PF_BOUNCING)
|
||||
P_DoAbilityBounce(player, false);
|
||||
|
||||
P_DamageMobj(special, toucher, toucher, 1, 0);
|
||||
}
|
||||
|
@ -562,10 +575,17 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
return;
|
||||
tokenlist += special->health;
|
||||
|
||||
P_AddPlayerScore(player, 1000);
|
||||
|
||||
if (ALL7EMERALDS(emeralds)) // Got all 7
|
||||
{
|
||||
P_GivePlayerRings(player, 50);
|
||||
nummaprings += 50; // no cheating towards Perfect!
|
||||
if (!(netgame || multiplayer))
|
||||
{
|
||||
player->continues += 1;
|
||||
players->gotcontinue = true;
|
||||
if (P_IsLocalPlayer(player))
|
||||
S_StartSound(NULL, sfx_s3kac);
|
||||
}
|
||||
}
|
||||
else
|
||||
token++;
|
||||
|
@ -756,12 +776,12 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
}
|
||||
else //Initial transformation. Don't allow second chances in special stages!
|
||||
{
|
||||
if (player->pflags & PF_NIGHTSMODE)
|
||||
if (player->powers[pw_carry] == CR_NIGHTSMODE)
|
||||
return;
|
||||
|
||||
S_StartSound(toucher, sfx_supert);
|
||||
}
|
||||
if (!(netgame || multiplayer) && !(player->pflags & PF_NIGHTSMODE))
|
||||
if (!(netgame || multiplayer) && !(player->powers[pw_carry] == CR_NIGHTSMODE))
|
||||
P_SetTarget(&special->tracer, toucher);
|
||||
P_NightserizePlayer(player, special->health); // Transform!
|
||||
return;
|
||||
|
@ -885,7 +905,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
return;
|
||||
|
||||
// make sure everything is as it should be, THEN take rings from players in special stages
|
||||
if (player->pflags & PF_NIGHTSMODE && !toucher->target)
|
||||
if (player->powers[pw_carry] == CR_NIGHTSMODE && !toucher->target)
|
||||
return;
|
||||
|
||||
if (player->mare != special->threshold) // wrong mare
|
||||
|
@ -923,7 +943,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
if (player->bumpertime < TICRATE/4)
|
||||
{
|
||||
S_StartSound(toucher, special->info->seesound);
|
||||
if (player->pflags & PF_NIGHTSMODE)
|
||||
if (player->powers[pw_carry] == CR_NIGHTSMODE)
|
||||
{
|
||||
player->bumpertime = TICRATE/2;
|
||||
if (special->threshold > 0)
|
||||
|
@ -979,14 +999,14 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
}
|
||||
return;
|
||||
case MT_NIGHTSSUPERLOOP:
|
||||
if (player->bot || !(player->pflags & PF_NIGHTSMODE))
|
||||
if (player->bot || !(player->powers[pw_carry] == CR_NIGHTSMODE))
|
||||
return;
|
||||
if (!G_IsSpecialStage(gamemap))
|
||||
player->powers[pw_nights_superloop] = (UINT16)special->info->speed;
|
||||
else
|
||||
{
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && players[i].pflags & PF_NIGHTSMODE)
|
||||
if (playeringame[i] && players[i].powers[pw_carry] == CR_NIGHTSMODE)
|
||||
players[i].powers[pw_nights_superloop] = (UINT16)special->info->speed;
|
||||
if (special->info->deathsound != sfx_None)
|
||||
S_StartSound(NULL, special->info->deathsound);
|
||||
|
@ -1001,14 +1021,14 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
}
|
||||
break;
|
||||
case MT_NIGHTSDRILLREFILL:
|
||||
if (player->bot || !(player->pflags & PF_NIGHTSMODE))
|
||||
if (player->bot || !(player->powers[pw_carry] == CR_NIGHTSMODE))
|
||||
return;
|
||||
if (!G_IsSpecialStage(gamemap))
|
||||
player->drillmeter = special->info->speed;
|
||||
else
|
||||
{
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && players[i].pflags & PF_NIGHTSMODE)
|
||||
if (playeringame[i] && players[i].powers[pw_carry] == CR_NIGHTSMODE)
|
||||
players[i].drillmeter = special->info->speed;
|
||||
if (special->info->deathsound != sfx_None)
|
||||
S_StartSound(NULL, special->info->deathsound);
|
||||
|
@ -1023,7 +1043,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
}
|
||||
break;
|
||||
case MT_NIGHTSHELPER:
|
||||
if (player->bot || !(player->pflags & PF_NIGHTSMODE))
|
||||
if (player->bot || !(player->powers[pw_carry] == CR_NIGHTSMODE))
|
||||
return;
|
||||
if (!G_IsSpecialStage(gamemap))
|
||||
{
|
||||
|
@ -1037,7 +1057,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
{
|
||||
mobj_t *flickyobj;
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && players[i].mo && players[i].pflags & PF_NIGHTSMODE) {
|
||||
if (playeringame[i] && players[i].mo && players[i].powers[pw_carry] == CR_NIGHTSMODE) {
|
||||
players[i].powers[pw_nights_helper] = (UINT16)special->info->speed;
|
||||
flickyobj = P_SpawnMobj(players[i].mo->x, players[i].mo->y, players[i].mo->z + players[i].mo->info->height, MT_NIGHTOPIANHELPER);
|
||||
P_SetTarget(&flickyobj->target, players[i].mo);
|
||||
|
@ -1055,7 +1075,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
}
|
||||
break;
|
||||
case MT_NIGHTSEXTRATIME:
|
||||
if (player->bot || !(player->pflags & PF_NIGHTSMODE))
|
||||
if (player->bot || !(player->powers[pw_carry] == CR_NIGHTSMODE))
|
||||
return;
|
||||
if (!G_IsSpecialStage(gamemap))
|
||||
{
|
||||
|
@ -1066,7 +1086,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
else
|
||||
{
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && players[i].pflags & PF_NIGHTSMODE)
|
||||
if (playeringame[i] && players[i].powers[pw_carry] == CR_NIGHTSMODE)
|
||||
{
|
||||
players[i].nightstime += special->info->speed;
|
||||
players[i].startedtime += special->info->speed;
|
||||
|
@ -1085,7 +1105,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
}
|
||||
break;
|
||||
case MT_NIGHTSLINKFREEZE:
|
||||
if (player->bot || !(player->pflags & PF_NIGHTSMODE))
|
||||
if (player->bot || !(player->powers[pw_carry] == CR_NIGHTSMODE))
|
||||
return;
|
||||
if (!G_IsSpecialStage(gamemap))
|
||||
{
|
||||
|
@ -1095,7 +1115,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
else
|
||||
{
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && players[i].pflags & PF_NIGHTSMODE)
|
||||
if (playeringame[i] && players[i].powers[pw_carry] == CR_NIGHTSMODE)
|
||||
{
|
||||
players[i].powers[pw_nights_linkfreeze] += (UINT16)special->info->speed;
|
||||
players[i].linktimer = 2*TICRATE;
|
||||
|
@ -1153,7 +1173,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
if (G_IsSpecialStage(gamemap))
|
||||
{
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && players[i].pflags & PF_NIGHTSMODE)
|
||||
if (playeringame[i] && players[i].powers[pw_carry] == CR_NIGHTSMODE)
|
||||
players[i].drillmeter += TICRATE/2;
|
||||
}
|
||||
else if (player->bot)
|
||||
|
@ -1336,9 +1356,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
toucher->momz = -toucher->momz;
|
||||
if (player->pflags & PF_GLIDING)
|
||||
{
|
||||
player->pflags &= ~(PF_GLIDING|PF_JUMPED);
|
||||
player->pflags &= ~(PF_GLIDING|PF_JUMPED|PF_NOJUMPDAMAGE);
|
||||
P_SetPlayerMobjState(toucher, S_PLAY_FALL);
|
||||
}
|
||||
player->homing = 0;
|
||||
|
||||
// Play a bounce sound?
|
||||
S_StartSound(toucher, special->info->painsound);
|
||||
|
@ -1346,7 +1367,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
return;
|
||||
|
||||
case MT_BLACKEGGMAN_GOOPFIRE:
|
||||
if (toucher->state != &states[S_PLAY_PAIN] && !player->powers[pw_flashing])
|
||||
if (!player->powers[pw_flashing])
|
||||
{
|
||||
toucher->momx = 0;
|
||||
toucher->momy = 0;
|
||||
|
@ -1354,13 +1375,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
if (toucher->momz != 0)
|
||||
special->momz = toucher->momz;
|
||||
|
||||
player->powers[pw_ingoop] = 2;
|
||||
|
||||
if (player->powers[pw_carry] == CR_GENERIC)
|
||||
{
|
||||
P_SetTarget(&toucher->tracer, NULL);
|
||||
player->powers[pw_carry] = CR_NONE;
|
||||
}
|
||||
player->powers[pw_carry] = CR_BRAKGOOP;
|
||||
P_SetTarget(&toucher->tracer, special);
|
||||
|
||||
P_ResetPlayer(player);
|
||||
|
||||
|
@ -1372,8 +1388,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
P_SetMobjState(special->target, special->target->info->raisestate);
|
||||
}
|
||||
}
|
||||
else
|
||||
player->powers[pw_ingoop] = 0;
|
||||
return;
|
||||
case MT_EGGSHIELD:
|
||||
{
|
||||
|
@ -1403,17 +1417,18 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
toucher->momz = -toucher->momz;
|
||||
if (player->pflags & PF_GLIDING)
|
||||
{
|
||||
player->pflags &= ~(PF_GLIDING|PF_JUMPED);
|
||||
player->pflags &= ~(PF_GLIDING|PF_JUMPED|PF_NOJUMPDAMAGE);
|
||||
P_SetPlayerMobjState(toucher, S_PLAY_FALL);
|
||||
}
|
||||
player->homing = 0;
|
||||
|
||||
// Play a bounce sound?
|
||||
S_StartSound(toucher, special->info->painsound);
|
||||
return;
|
||||
}
|
||||
else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|
||||
|| ((player->pflags & PF_JUMPED) && (player->pflags & PF_FORCEJUMPDAMAGE || !(player->charflags & SF_NOJUMPSPIN) || (player->charability == CA_TWINSPIN && player->panim == PA_ABILITY)))
|
||||
|| ((player->charflags & SF_STOMPDAMAGE) && (P_MobjFlip(toucher)*(toucher->z - (special->z + special->height/2)) > 0) && (P_MobjFlip(toucher)*toucher->momz < 0))
|
||||
else if (((player->powers[pw_carry] == CR_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|
||||
|| ((player->pflags & PF_JUMPED) && (!(player->pflags & PF_NOJUMPDAMAGE) || (player->charability == CA_TWINSPIN && player->panim == PA_ABILITY)))
|
||||
|| ((player->charflags & SF_STOMPDAMAGE || player->pflags & PF_BOUNCING) && (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?
|
||||
{
|
||||
|
@ -1463,7 +1478,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
{
|
||||
player->powers[pw_carry] = CR_MACESPIN;
|
||||
S_StartSound(toucher, sfx_spin);
|
||||
P_SetPlayerMobjState(toucher, S_PLAY_SPIN);
|
||||
P_SetPlayerMobjState(toucher, S_PLAY_ROLL);
|
||||
}
|
||||
else
|
||||
player->powers[pw_carry] = CR_GENERIC;
|
||||
|
@ -2093,7 +2108,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
{
|
||||
if (metalrecording) // Ack! Metal Sonic shouldn't die! Cut the tape, end recording!
|
||||
G_StopMetalRecording();
|
||||
if (gametype == GT_MATCH && cv_match_scoring.value == 0 // note, no team match suicide penalty
|
||||
if (gametype == GT_MATCH // note, no team match suicide penalty
|
||||
&& ((target == source) || (source == NULL && inflictor == NULL) || (source && !source->player)))
|
||||
{ // Suicide penalty
|
||||
if (target->player->score >= 50)
|
||||
|
@ -2597,7 +2612,7 @@ static inline void P_NiGHTSDamage(mobj_t *target, mobj_t *source)
|
|||
}
|
||||
|
||||
player->powers[pw_flashing] = flashingtics;
|
||||
P_SetPlayerMobjState(target, S_PLAY_NIGHTS_PAIN);
|
||||
P_SetPlayerMobjState(target, S_PLAY_NIGHTS_STUN);
|
||||
S_StartSound(target, sfx_nghurt);
|
||||
|
||||
if (oldnightstime > 10*TICRATE
|
||||
|
@ -2724,7 +2739,7 @@ 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_SLIDING|PF_NIGHTSMODE);
|
||||
player->pflags &= ~PF_SLIDING;
|
||||
|
||||
player->powers[pw_carry] = CR_NONE;
|
||||
|
||||
|
@ -2820,10 +2835,7 @@ static inline void P_SuperDamage(player_t *player, mobj_t *inflictor, mobj_t *so
|
|||
|
||||
P_InstaThrust(player->mo, ang, fallbackspeed);
|
||||
|
||||
if (player->charflags & SF_SUPERANIMS)
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_SUPER_STUN);
|
||||
else
|
||||
P_SetPlayerMobjState(player->mo, player->mo->info->painstate);
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_STUN);
|
||||
|
||||
P_ResetPlayer(player);
|
||||
|
||||
|
@ -2886,7 +2898,7 @@ static void P_ShieldDamage(player_t *player, mobj_t *inflictor, mobj_t *source,
|
|||
{
|
||||
// Award no points when players shoot each other when cv_friendlyfire is on.
|
||||
if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo))
|
||||
P_AddPlayerScore(source->player, cv_match_scoring.value == 1 ? 25 : 50);
|
||||
P_AddPlayerScore(source->player, 50);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3069,7 +3081,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
if (player->pflags & PF_GODMODE)
|
||||
return false;
|
||||
|
||||
if (!(target->player->pflags & (PF_NIGHTSMODE|PF_NIGHTSFALL)) && (maptol & TOL_NIGHTS))
|
||||
if (!(target->player->powers[pw_carry] == CR_NIGHTSMODE || target->player->pflags & PF_NIGHTSFALL) && (maptol & TOL_NIGHTS))
|
||||
return false;
|
||||
|
||||
switch (damagetype)
|
||||
|
@ -3091,7 +3103,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
}
|
||||
}
|
||||
|
||||
if (player->pflags & PF_NIGHTSMODE) // NiGHTS damage handling
|
||||
if (player->powers[pw_carry] == CR_NIGHTSMODE) // NiGHTS damage handling
|
||||
{
|
||||
if (!force)
|
||||
{
|
||||
|
@ -3119,14 +3131,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
return false; // Don't get hurt by fire generated from friends.
|
||||
}
|
||||
|
||||
// Sudden-Death mode
|
||||
if (source && source->type == MT_PLAYER)
|
||||
{
|
||||
if ((gametype == GT_MATCH || gametype == GT_TEAMMATCH || gametype == GT_CTF) && cv_suddendeath.value
|
||||
&& !player->powers[pw_flashing] && !player->powers[pw_invulnerability])
|
||||
damagetype = DMG_INSTAKILL;
|
||||
}
|
||||
|
||||
// Player hits another player
|
||||
if (!force && source && source->player)
|
||||
{
|
||||
|
|
|
@ -72,7 +72,6 @@
|
|||
|
||||
// both the head and tail of the thinker list
|
||||
extern thinker_t thinkercap;
|
||||
extern INT32 runcount;
|
||||
|
||||
void P_InitThinkers(void);
|
||||
void P_AddThinker(thinker_t *thinker);
|
||||
|
@ -130,6 +129,7 @@ void P_ResetCamera(player_t *player, camera_t *thiscam);
|
|||
boolean P_TryCameraMove(fixed_t x, fixed_t y, camera_t *thiscam);
|
||||
void P_SlideCameraMove(camera_t *thiscam);
|
||||
boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled);
|
||||
pflags_t P_GetJumpFlags(player_t *player);
|
||||
boolean P_PlayerInPain(player_t *player);
|
||||
void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor);
|
||||
void P_ResetPlayer(player_t *player);
|
||||
|
@ -150,11 +150,16 @@ void P_GivePlayerRings(player_t *player, INT32 num_rings);
|
|||
void P_GivePlayerLives(player_t *player, INT32 numlives);
|
||||
UINT8 P_GetNextEmerald(void);
|
||||
void P_GiveEmerald(boolean spawnObj);
|
||||
#if 0
|
||||
void P_ResetScore(player_t *player);
|
||||
#else
|
||||
#define P_ResetScore(player) player->scoreadd = 0
|
||||
#endif
|
||||
boolean P_AutoPause(void);
|
||||
|
||||
void P_DoJumpShield(player_t *player);
|
||||
void P_DoBubbleBounce(player_t *player);
|
||||
void P_DoAbilityBounce(player_t *player, boolean changemomz);
|
||||
void P_BlackOw(player_t *player);
|
||||
void P_ElementalFire(player_t *player, boolean cropcircle);
|
||||
|
||||
|
@ -169,12 +174,16 @@ fixed_t P_ReturnThrustX(mobj_t *mo, angle_t angle, fixed_t move);
|
|||
fixed_t P_ReturnThrustY(mobj_t *mo, angle_t angle, fixed_t move);
|
||||
void P_InstaThrustEvenIn2D(mobj_t *mo, angle_t angle, fixed_t move);
|
||||
|
||||
boolean P_LookForEnemies(player_t *player, boolean nonenemies);
|
||||
mobj_t *P_LookForEnemies(player_t *player, boolean nonenemies, boolean bullet);
|
||||
void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius);
|
||||
void P_HomingAttack(mobj_t *source, mobj_t *enemy); /// \todo doesn't belong in p_user
|
||||
boolean P_SuperReady(player_t *player);
|
||||
void P_DoJump(player_t *player, boolean soundandstate);
|
||||
#if 0
|
||||
boolean P_AnalogMove(player_t *player);
|
||||
#else
|
||||
#define P_AnalogMove(player) (player->pflags & PF_ANALOGMODE)
|
||||
#endif
|
||||
boolean P_TransferToNextMare(player_t *player);
|
||||
UINT8 P_FindLowestMare(void);
|
||||
void P_FindEmerald(void);
|
||||
|
|
90
src/p_map.c
90
src/p_map.c
|
@ -115,7 +115,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
|||
fixed_t offx, offy;
|
||||
fixed_t vertispeed = spring->info->mass;
|
||||
fixed_t horizspeed = spring->info->damage;
|
||||
UINT8 jumping, secondjump;
|
||||
UINT8 secondjump;
|
||||
|
||||
if (object->eflags & MFE_SPRUNG) // Object was already sprung this tic
|
||||
return false;
|
||||
|
@ -124,20 +124,25 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
|||
if (object->player && object->player->spectator)
|
||||
return false;
|
||||
|
||||
if (object->player && (object->player->pflags & PF_NIGHTSMODE))
|
||||
if (object->player && (object->player->powers[pw_carry] == CR_NIGHTSMODE))
|
||||
{
|
||||
/*Someone want to make these work like bumpers?*/
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef ESLOPE
|
||||
object->standingslope = NULL; // Okay, now we can't return - no launching off at silly angles for you.
|
||||
#endif
|
||||
if (object->player
|
||||
&& ((object->player->charability == CA_TWINSPIN && object->player->panim == PA_ABILITY)
|
||||
|| (object->player->charability2 == CA2_MELEE && object->player->panim == PA_ABILITY2)))
|
||||
{
|
||||
S_StartSound(object, sfx_s3k8b);
|
||||
horizspeed = FixedMul(horizspeed, (4*FRACUNIT)/3);
|
||||
vertispeed = FixedMul(vertispeed, (6*FRACUNIT)/5); // aprox square root of above
|
||||
}
|
||||
|
||||
object->eflags |= MFE_SPRUNG; // apply this flag asap!
|
||||
spring->flags &= ~(MF_SOLID|MF_SPECIAL); // De-solidify
|
||||
|
||||
if (horizspeed && vertispeed) // Mimic SA
|
||||
if ((horizspeed && vertispeed) || (object->player && object->player->homing)) // Mimic SA
|
||||
{
|
||||
object->momx = object->momy = 0;
|
||||
P_TryMove(object, spring->x, spring->y, true);
|
||||
|
@ -203,32 +208,36 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
|||
}
|
||||
}
|
||||
|
||||
pflags = object->player->pflags & (PF_JUMPED|PF_SPINNING|PF_THOKKED|PF_SHIELDABILITY); // I still need these.
|
||||
jumping = object->player->jumping;
|
||||
pflags = object->player->pflags & (PF_STARTJUMP|PF_JUMPED|PF_NOJUMPDAMAGE|PF_SPINNING|PF_THOKKED|PF_SHIELDABILITY|PF_BOUNCING); // I still need these.
|
||||
secondjump = object->player->secondjump;
|
||||
P_ResetPlayer(object->player);
|
||||
|
||||
if (spring->info->painchance)
|
||||
{
|
||||
object->player->pflags |= PF_JUMPED;
|
||||
object->player->pflags |= P_GetJumpFlags(object->player);
|
||||
P_SetPlayerMobjState(object, S_PLAY_JUMP);
|
||||
}
|
||||
else if (P_MobjFlip(object)*vertispeed > 0)
|
||||
P_SetPlayerMobjState(object, S_PLAY_SPRING);
|
||||
else if (P_MobjFlip(object)*vertispeed < 0)
|
||||
P_SetPlayerMobjState(object, S_PLAY_FALL);
|
||||
else // horizontal spring
|
||||
else if (!vertispeed || (pflags & PF_BOUNCING)) // horizontal spring or bouncing
|
||||
{
|
||||
if (pflags & (PF_JUMPED|PF_SPINNING) && (object->player->panim == PA_ROLL || object->player->panim == PA_JUMP || object->player->panim == PA_FALL))
|
||||
if ((pflags & PF_BOUNCING)
|
||||
|| (pflags & (PF_JUMPED|PF_SPINNING) && (object->player->panim == PA_ROLL || object->player->panim == PA_JUMP || object->player->panim == PA_FALL)))
|
||||
{
|
||||
object->player->pflags |= pflags;
|
||||
object->player->jumping = jumping;
|
||||
object->player->secondjump = secondjump;
|
||||
}
|
||||
else
|
||||
P_SetPlayerMobjState(object, S_PLAY_WALK);
|
||||
}
|
||||
else if (P_MobjFlip(object)*vertispeed > 0)
|
||||
P_SetPlayerMobjState(object, S_PLAY_SPRING);
|
||||
else
|
||||
P_SetPlayerMobjState(object, S_PLAY_FALL);
|
||||
}
|
||||
|
||||
#ifdef ESLOPE
|
||||
object->standingslope = NULL; // Okay, now we know it's not going to be relevant - no launching off at silly angles for you.
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -324,9 +333,6 @@ static void P_DoTailsCarry(player_t *sonic, player_t *tails)
|
|||
if (tails->bot == 1)
|
||||
return;
|
||||
|
||||
if (sonic->pflags & PF_NIGHTSMODE)
|
||||
return;
|
||||
|
||||
if ((sonic->mo->eflags & MFE_VERTICALFLIP) != (tails->mo->eflags & MFE_VERTICALFLIP))
|
||||
return; // Both should be in same gravity
|
||||
|
||||
|
@ -377,6 +383,7 @@ static void P_DoTailsCarry(player_t *sonic, player_t *tails)
|
|||
else {
|
||||
if (sonic-players == consoleplayer && botingame)
|
||||
CV_SetValue(&cv_analog2, true);
|
||||
P_SetTarget(&sonic->mo->tracer, NULL);
|
||||
sonic->powers[pw_carry] = CR_NONE;
|
||||
}
|
||||
}
|
||||
|
@ -460,9 +467,9 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
return true;
|
||||
}
|
||||
|
||||
// CA_DASHMODE users destroy spikes and monitors, CA_TWINSPIN users and CA2_MELEE users destroy spikes.
|
||||
// SF_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)
|
||||
&& (((tmthing->player->charflags & SF_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))
|
||||
|
@ -499,7 +506,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
|
||||
// Don't collide with your buddies while NiGHTS-flying.
|
||||
if (tmthing->player && thing->player && (maptol & TOL_NIGHTS)
|
||||
&& ((tmthing->player->pflags & PF_NIGHTSMODE) || (thing->player->pflags & PF_NIGHTSMODE)))
|
||||
&& ((tmthing->player->powers[pw_carry] == CR_NIGHTSMODE) || (thing->player->powers[pw_carry] == CR_NIGHTSMODE)))
|
||||
return true;
|
||||
|
||||
blockdist = thing->radius + tmthing->radius;
|
||||
|
@ -785,7 +792,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
{
|
||||
// Hop on the missile for a ride!
|
||||
thing->player->powers[pw_carry] = CR_GENERIC;
|
||||
thing->player->pflags &= ~PF_JUMPED;
|
||||
thing->player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE);
|
||||
P_SetTarget(&thing->tracer, tmthing);
|
||||
P_SetTarget(&tmthing->target, thing); // Set owner to the player
|
||||
P_SetTarget(&tmthing->tracer, NULL); // Disable homing-ness
|
||||
|
@ -896,7 +903,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
// must be flying in the SAME DIRECTION as the last time you came through.
|
||||
// not (your direction) xor (stored direction)
|
||||
// In other words, you can't u-turn and respawn rings near the drone.
|
||||
if (pl->bonustime && (pl->pflags & PF_NIGHTSMODE) && (INT32)leveltime > droneobj->extravalue2 && (
|
||||
if (pl->bonustime && (pl->powers[pw_carry] == CR_NIGHTSMODE) && (INT32)leveltime > droneobj->extravalue2 && (
|
||||
!(pl->anotherflyangle >= 90 && pl->anotherflyangle <= 270)
|
||||
^ (droneobj->extravalue1 >= 90 && droneobj->extravalue1 <= 270)
|
||||
))
|
||||
|
@ -928,11 +935,13 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
if (tmthing->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
if (thing->z + thing->height <= tmthing->z + FixedMul(FRACUNIT, tmthing->scale)
|
||||
&& thing->z + thing->height + thing->momz >= tmthing->z + FixedMul(FRACUNIT, tmthing->scale) + tmthing->momz)
|
||||
&& thing->z + thing->height + thing->momz >= tmthing->z + FixedMul(FRACUNIT, tmthing->scale) + tmthing->momz
|
||||
&& !(thing->player->charability == CA_BOUNCE && thing->player->panim == PA_ABILITY && thing->eflags & MFE_VERTICALFLIP))
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, 0);
|
||||
}
|
||||
else if (thing->z >= tmthing->z + tmthing->height - FixedMul(FRACUNIT, tmthing->scale)
|
||||
&& thing->z + thing->momz <= tmthing->z + tmthing->height - FixedMul(FRACUNIT, tmthing->scale) + tmthing->momz)
|
||||
&& thing->z + thing->momz <= tmthing->z + tmthing->height - FixedMul(FRACUNIT, tmthing->scale) + tmthing->momz
|
||||
&& !(thing->player->charability == CA_BOUNCE && thing->player->panim == PA_ABILITY && !(thing->eflags & MFE_VERTICALFLIP)))
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, 0);
|
||||
}
|
||||
else if (thing->type == MT_SPIKE && thing->flags & MF_SOLID && tmthing->player) // unfortunate player falls into spike?!
|
||||
|
@ -940,11 +949,13 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
if (thing->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
if (tmthing->z + tmthing->height <= thing->z - FixedMul(FRACUNIT, thing->scale)
|
||||
&& tmthing->z + tmthing->height + tmthing->momz >= thing->z - FixedMul(FRACUNIT, thing->scale))
|
||||
&& tmthing->z + tmthing->height + tmthing->momz >= thing->z - FixedMul(FRACUNIT, thing->scale)
|
||||
&& !(tmthing->player->charability == CA_BOUNCE && tmthing->player->panim == PA_ABILITY && tmthing->eflags & MFE_VERTICALFLIP))
|
||||
P_DamageMobj(tmthing, thing, thing, 1, 0);
|
||||
}
|
||||
else if (tmthing->z >= thing->z + thing->height + FixedMul(FRACUNIT, thing->scale)
|
||||
&& tmthing->z + tmthing->momz <= thing->z + thing->height + FixedMul(FRACUNIT, thing->scale))
|
||||
&& tmthing->z + tmthing->momz <= thing->z + thing->height + FixedMul(FRACUNIT, thing->scale)
|
||||
&& !(tmthing->player->charability == CA_BOUNCE && tmthing->player->panim == PA_ABILITY && !(tmthing->eflags & MFE_VERTICALFLIP)))
|
||||
P_DamageMobj(tmthing, thing, thing, 1, 0);
|
||||
}
|
||||
|
||||
|
@ -1005,7 +1016,10 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
if (thing->player-players == consoleplayer && botingame)
|
||||
CV_SetValue(&cv_analog2, true);
|
||||
if (thing->player->powers[pw_carry] == CR_PLAYER)
|
||||
{
|
||||
P_SetTarget(&thing->tracer, NULL);
|
||||
thing->player->powers[pw_carry] = CR_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
if (thing->player)
|
||||
|
@ -1063,11 +1077,10 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
if (thing->flags & MF_MONITOR
|
||||
&& (tmthing->player->pflags & (PF_SPINNING|PF_GLIDING)
|
||||
|| ((tmthing->player->pflags & PF_JUMPED)
|
||||
&& (tmthing->player->pflags & PF_FORCEJUMPDAMAGE
|
||||
|| !(tmthing->player->charflags & SF_NOJUMPSPIN)
|
||||
&& (!(tmthing->player->pflags & PF_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)
|
||||
|| ((tmthing->player->charflags & SF_STOMPDAMAGE || tmthing->player->pflags & PF_BOUNCING)
|
||||
&& (P_MobjFlip(tmthing)*(tmthing->z - (thing->z + thing->height/2)) > 0) && (P_MobjFlip(tmthing)*tmthing->momz < 0))
|
||||
|| elementalpierce))
|
||||
{
|
||||
|
@ -1084,11 +1097,15 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
{
|
||||
if (elementalpierce == 2)
|
||||
P_DoBubbleBounce(player);
|
||||
else
|
||||
else if (!(player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2))
|
||||
*momz = -*momz; // Therefore, you should be thrust in the opposite direction, vertically.
|
||||
}
|
||||
if (!(elementalpierce == 1 && thing->flags & MF_GRENADEBOUNCE)) // prevent gold monitor clipthrough.
|
||||
{
|
||||
if (player->pflags & PF_BOUNCING)
|
||||
P_DoAbilityBounce(player, false);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
*z -= *momz; // to ensure proper collision.
|
||||
}
|
||||
|
@ -1105,11 +1122,10 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
else if (thing->flags & MF_MONITOR && tmthing->player
|
||||
&& (tmthing->player->pflags & (PF_SPINNING|PF_GLIDING)
|
||||
|| ((tmthing->player->pflags & PF_JUMPED)
|
||||
&& (tmthing->player->pflags & PF_FORCEJUMPDAMAGE
|
||||
|| !(tmthing->player->charflags & SF_NOJUMPSPIN)
|
||||
&& (!(tmthing->player->pflags & PF_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)
|
||||
|| ((tmthing->player->charflags & SF_STOMPDAMAGE || tmthing->player->pflags & PF_BOUNCING)
|
||||
&& (P_MobjFlip(tmthing)*(tmthing->z - (thing->z + thing->height/2)) > 0) && (P_MobjFlip(tmthing)*tmthing->momz < 0)))
|
||||
&& !((thing->type == MT_RING_REDBOX && tmthing->player->ctfteam != 1) || (thing->type == MT_RING_BLUEBOX && tmthing->player->ctfteam != 2)))
|
||||
;
|
||||
|
@ -1512,7 +1528,7 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y)
|
|||
else if (thing->type == MT_SKIM && (rover->flags & FF_SWIMMABLE))
|
||||
;
|
||||
else if (!((rover->flags & FF_BLOCKPLAYER && thing->player)
|
||||
|| (rover->flags & FF_BLOCKOTHERS && !thing->player)
|
||||
|| (rover->flags & FF_BLOCKOTHERS && !thing->player)
|
||||
|| rover->flags & FF_QUICKSAND))
|
||||
continue;
|
||||
|
||||
|
@ -2890,7 +2906,7 @@ isblocking:
|
|||
slidemo->player->climbing = 5;
|
||||
}
|
||||
|
||||
slidemo->player->pflags &= ~(PF_GLIDING|PF_SPINNING|PF_JUMPED|PF_THOKKED);
|
||||
slidemo->player->pflags &= ~(PF_GLIDING|PF_SPINNING|PF_JUMPED|PF_NOJUMPDAMAGE|PF_THOKKED);
|
||||
slidemo->player->glidetime = 0;
|
||||
slidemo->player->secondjump = 0;
|
||||
|
||||
|
|
401
src/p_mobj.c
401
src/p_mobj.c
|
@ -188,32 +188,41 @@ static void P_CyclePlayerMobjState(mobj_t *mobj)
|
|||
|
||||
//
|
||||
// P_GetMobjSprite2
|
||||
// For non-super players, tries each sprite2's immediate predecessor until it finds one with a number of frames or ends up at standing.
|
||||
// For super players, does the same as above - but tries the super equivalent for each sprite2 before the non-super version.
|
||||
//
|
||||
|
||||
UINT8 P_GetMobjSprite2(mobj_t *mobj, UINT8 spr2)
|
||||
{
|
||||
player_t *player = mobj->player;
|
||||
skin_t *skin = ((skin_t *)mobj->skin);
|
||||
UINT8 super = (spr2 & FF_SPR2SUPER);
|
||||
|
||||
if (!skin)
|
||||
return 0;
|
||||
|
||||
while ((skin->sprites[spr2].numframes <= 0)
|
||||
while (!(skin->sprites[spr2].numframes)
|
||||
&& spr2 != SPR2_STND)
|
||||
{
|
||||
if (spr2 & FF_SPR2SUPER)
|
||||
{
|
||||
spr2 &= ~FF_SPR2SUPER;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch(spr2)
|
||||
{
|
||||
case SPR2_PEEL:
|
||||
spr2 = SPR2_RUN;
|
||||
break;
|
||||
case SPR2_RUN:
|
||||
spr2 = SPR2_WALK;
|
||||
break;
|
||||
case SPR2_STUN:
|
||||
spr2 = SPR2_PAIN;
|
||||
break;
|
||||
case SPR2_DRWN:
|
||||
spr2 = SPR2_DEAD;
|
||||
break;
|
||||
case SPR2_DASH:
|
||||
spr2 = SPR2_SPIN;
|
||||
case SPR2_SPIN:
|
||||
spr2 = SPR2_ROLL;
|
||||
break;
|
||||
case SPR2_GASP:
|
||||
spr2 = SPR2_SPNG;
|
||||
|
@ -222,7 +231,7 @@ UINT8 P_GetMobjSprite2(mobj_t *mobj, UINT8 spr2)
|
|||
spr2 = ((player
|
||||
? player->charflags
|
||||
: skin->flags)
|
||||
& SF_NOJUMPSPIN) ? SPR2_SPNG : SPR2_SPIN;
|
||||
& SF_NOJUMPSPIN) ? SPR2_SPNG : SPR2_ROLL;
|
||||
break;
|
||||
case SPR2_SPNG: // spring
|
||||
spr2 = SPR2_FALL;
|
||||
|
@ -234,11 +243,11 @@ UINT8 P_GetMobjSprite2(mobj_t *mobj, UINT8 spr2)
|
|||
spr2 = SPR2_FALL;
|
||||
break;
|
||||
|
||||
case SPR2_FLY:
|
||||
case SPR2_FLY :
|
||||
spr2 = SPR2_SPNG;
|
||||
break;
|
||||
case SPR2_SWIM:
|
||||
spr2 = SPR2_FLY;
|
||||
spr2 = SPR2_FLY ;
|
||||
break;
|
||||
case SPR2_TIRE:
|
||||
spr2 = (player && player->charability == CA_SWIM) ? SPR2_SWIM : SPR2_FLY;
|
||||
|
@ -248,91 +257,59 @@ UINT8 P_GetMobjSprite2(mobj_t *mobj, UINT8 spr2)
|
|||
spr2 = SPR2_FLY;
|
||||
break;
|
||||
case SPR2_CLMB:
|
||||
spr2 = SPR2_SPIN;
|
||||
spr2 = SPR2_ROLL;
|
||||
break;
|
||||
case SPR2_CLNG:
|
||||
spr2 = SPR2_CLMB;
|
||||
break;
|
||||
|
||||
case SPR2_FLT :
|
||||
spr2 = SPR2_WALK;
|
||||
break;
|
||||
case SPR2_FRUN:
|
||||
spr2 = SPR2_RUN ;
|
||||
break;
|
||||
|
||||
case SPR2_DASH:
|
||||
spr2 = SPR2_FRUN;
|
||||
break;
|
||||
|
||||
case SPR2_BNCE:
|
||||
spr2 = SPR2_FALL;
|
||||
break;
|
||||
case SPR2_BLND:
|
||||
spr2 = SPR2_ROLL;
|
||||
break;
|
||||
|
||||
case SPR2_TWIN:
|
||||
spr2 = SPR2_SPIN;
|
||||
spr2 = SPR2_ROLL;
|
||||
break;
|
||||
|
||||
case SPR2_MLEE:
|
||||
spr2 = SPR2_TWIN;
|
||||
break;
|
||||
|
||||
// Super sprites fallback to regular sprites
|
||||
case SPR2_SWLK:
|
||||
spr2 = SPR2_WALK;
|
||||
break;
|
||||
case SPR2_SRUN:
|
||||
spr2 = SPR2_RUN;
|
||||
break;
|
||||
case SPR2_SPEE:
|
||||
spr2 = SPR2_PEEL;
|
||||
break;
|
||||
case SPR2_SPAN:
|
||||
spr2 = SPR2_PAIN;
|
||||
break;
|
||||
case SPR2_SSTN:
|
||||
spr2 = SPR2_SPAN;
|
||||
break;
|
||||
case SPR2_SDTH:
|
||||
spr2 = SPR2_DEAD;
|
||||
break;
|
||||
case SPR2_SDRN:
|
||||
spr2 = SPR2_DRWN;
|
||||
break;
|
||||
case SPR2_SSPN:
|
||||
spr2 = SPR2_SPIN;
|
||||
break;
|
||||
case SPR2_SGSP:
|
||||
spr2 = SPR2_GASP;
|
||||
break;
|
||||
case SPR2_SJMP:
|
||||
spr2 = ((player
|
||||
? player->charflags
|
||||
: skin->flags)
|
||||
& SF_NOJUMPSPIN) ? SPR2_SSPG : SPR2_SSPN;
|
||||
break;
|
||||
case SPR2_SSPG:
|
||||
spr2 = SPR2_SPNG;
|
||||
break;
|
||||
case SPR2_SFAL:
|
||||
spr2 = SPR2_FALL;
|
||||
break;
|
||||
case SPR2_SEDG:
|
||||
spr2 = SPR2_EDGE;
|
||||
break;
|
||||
case SPR2_SRID:
|
||||
spr2 = SPR2_RIDE;
|
||||
break;
|
||||
case SPR2_SFLT:
|
||||
spr2 = SPR2_SWLK;
|
||||
break;
|
||||
|
||||
// NiGHTS sprites.
|
||||
case SPR2_NTRN:
|
||||
spr2 = SPR2_TRNS;
|
||||
break;
|
||||
case SPR2_NSTD:
|
||||
spr2 = SPR2_SSTD;
|
||||
spr2 = SPR2_STND;
|
||||
super = FF_SPR2SUPER;
|
||||
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.
|
||||
spr2 = SPR2_FLT ;
|
||||
super = FF_SPR2SUPER;
|
||||
break;
|
||||
case SPR2_NSTN:
|
||||
spr2 = SPR2_STUN;
|
||||
break;
|
||||
case SPR2_NPUL:
|
||||
spr2 = SPR2_NFLT;
|
||||
break;
|
||||
case SPR2_NPAN:
|
||||
spr2 = SPR2_NPUL;
|
||||
spr2 = SPR2_NSTN;
|
||||
break;
|
||||
case SPR2_NATK:
|
||||
spr2 = SPR2_SSPN;
|
||||
spr2 = SPR2_ROLL;
|
||||
super = FF_SPR2SUPER;
|
||||
break;
|
||||
/*case SPR2_NGT0:
|
||||
spr2 = SPR2_STND;
|
||||
spr2 = SPR2_NFLT;
|
||||
break;*/
|
||||
case SPR2_NGT1:
|
||||
case SPR2_NGT7:
|
||||
|
@ -391,7 +368,10 @@ UINT8 P_GetMobjSprite2(mobj_t *mobj, UINT8 spr2)
|
|||
spr2 = SPR2_STND;
|
||||
break;
|
||||
}
|
||||
|
||||
spr2 |= super;
|
||||
}
|
||||
|
||||
return spr2;
|
||||
}
|
||||
|
||||
|
@ -428,45 +408,17 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
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))
|
||||
// Catch SF_NOSUPERSPIN jumps for Supers
|
||||
if (player->powers[pw_super] && (player->charflags & SF_NOSUPERSPIN))
|
||||
{
|
||||
switch (state)
|
||||
if (state == S_PLAY_JUMP)
|
||||
{
|
||||
case S_PLAY_STND:
|
||||
case S_PLAY_WAIT:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_STND);
|
||||
case S_PLAY_WALK:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_WALK);
|
||||
case S_PLAY_RUN:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_RUN);
|
||||
case S_PLAY_PEEL:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_PEEL);
|
||||
case S_PLAY_PAIN:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_PAIN);
|
||||
case S_PLAY_DEAD:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_DEAD);
|
||||
case S_PLAY_DRWN:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_DRWN);
|
||||
case S_PLAY_SPIN:
|
||||
if (!(player->charflags & SF_SUPERSPIN))
|
||||
return true;
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_SPIN);
|
||||
case S_PLAY_GASP:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_GASP);
|
||||
case S_PLAY_JUMP:
|
||||
if (!(player->charflags & SF_SUPERSPIN))
|
||||
return true;
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_JUMP);
|
||||
case S_PLAY_SPRING:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_SPRING);
|
||||
case S_PLAY_FALL:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_FALL);
|
||||
case S_PLAY_EDGE:
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_EDGE);
|
||||
default:
|
||||
break;
|
||||
if (player->mo->state-states == S_PLAY_WALK)
|
||||
return P_SetPlayerMobjState(mobj, S_PLAY_FLOAT);
|
||||
return true;
|
||||
}
|
||||
else if (player->mo->state-states == S_PLAY_FLOAT && state == S_PLAY_STND)
|
||||
return true;
|
||||
}
|
||||
// You were in pain state after taking a hit, and you're moving out of pain state now?
|
||||
else if (mobj->state == &states[mobj->info->painstate] && player->powers[pw_flashing] == flashingtics && state != mobj->info->painstate)
|
||||
|
@ -482,61 +434,56 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
{
|
||||
case S_PLAY_STND:
|
||||
case S_PLAY_WAIT:
|
||||
case S_PLAY_SUPER_STND:
|
||||
player->panim = PA_IDLE;
|
||||
break;
|
||||
case S_PLAY_EDGE:
|
||||
case S_PLAY_SUPER_EDGE:
|
||||
player->panim = PA_EDGE;
|
||||
break;
|
||||
case S_PLAY_WALK:
|
||||
case S_PLAY_SUPER_WALK:
|
||||
case S_PLAY_SUPER_FLOAT:
|
||||
case S_PLAY_FLOAT:
|
||||
player->panim = PA_WALK;
|
||||
break;
|
||||
case S_PLAY_RUN:
|
||||
case S_PLAY_SUPER_RUN:
|
||||
case S_PLAY_FLOAT_RUN:
|
||||
player->panim = PA_RUN;
|
||||
break;
|
||||
case S_PLAY_PEEL:
|
||||
case S_PLAY_SUPER_PEEL:
|
||||
player->panim = PA_PEEL;
|
||||
case S_PLAY_DASH:
|
||||
player->panim = PA_DASH;
|
||||
break;
|
||||
case S_PLAY_PAIN:
|
||||
case S_PLAY_SUPER_PAIN:
|
||||
case S_PLAY_SUPER_STUN:
|
||||
case S_PLAY_STUN:
|
||||
player->panim = PA_PAIN;
|
||||
break;
|
||||
case S_PLAY_SPIN:
|
||||
//case S_PLAY_DASH: -- everyone can ROLL thanks to zoom tubes...
|
||||
case S_PLAY_SUPER_SPIN:
|
||||
case S_PLAY_ROLL:
|
||||
//case S_PLAY_SPINDASH: -- everyone can ROLL thanks to zoom tubes...
|
||||
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;
|
||||
break;
|
||||
case S_PLAY_FALL:
|
||||
case S_PLAY_SUPER_FALL:
|
||||
player->panim = PA_FALL;
|
||||
break;
|
||||
case S_PLAY_FLY:
|
||||
case S_PLAY_SWIM:
|
||||
case S_PLAY_GLIDE:
|
||||
case S_PLAY_BOUNCE:
|
||||
case S_PLAY_BOUNCE_LANDING:
|
||||
case S_PLAY_TWINSPIN:
|
||||
player->panim = PA_ABILITY;
|
||||
break;
|
||||
case S_PLAY_DASH: // ...but the act of SPINDASHING is charability2 specific.
|
||||
case S_PLAY_SPINDASH: // ...but the act of SPINDASHING is charability2 specific.
|
||||
case S_PLAY_FIRE:
|
||||
case S_PLAY_FIRE_FINISH:
|
||||
case S_PLAY_MELEE:
|
||||
case S_PLAY_MELEE_FINISH:
|
||||
case S_PLAY_MELEE_LANDING:
|
||||
player->panim = PA_ABILITY2;
|
||||
break;
|
||||
case S_PLAY_RIDE:
|
||||
case S_PLAY_SUPER_RIDE:
|
||||
player->panim = PA_RIDE;
|
||||
break;
|
||||
default:
|
||||
|
@ -563,7 +510,9 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
mobj->tics = st->tics;
|
||||
|
||||
// Adjust the player's animation speed to match their velocity.
|
||||
if (!(disableSpeedAdjust || player->charflags & SF_NOSPEEDADJUST))
|
||||
if (player->panim == PA_EDGE && (player->charflags & SF_FASTEDGE))
|
||||
mobj->tics = 2;
|
||||
else if (!(disableSpeedAdjust || player->charflags & SF_NOSPEEDADJUST))
|
||||
{
|
||||
fixed_t speed;// = FixedDiv(player->speed, FixedMul(mobj->scale, player->mo->movefactor));
|
||||
if (player->panim == PA_FALL)
|
||||
|
@ -599,7 +548,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
else
|
||||
mobj->tics = 2;
|
||||
}
|
||||
else if (P_IsObjectOnGround(mobj) || player->powers[pw_super]) // Only if on the ground or superflying.
|
||||
else if (P_IsObjectOnGround(mobj) || ((player->charability == CA_FLOAT || player->charability == CA_SLOWFALL) && player->secondjump == 1) || player->powers[pw_super]) // Only if on the ground or superflying.
|
||||
{
|
||||
if (player->panim == PA_WALK)
|
||||
{
|
||||
|
@ -610,7 +559,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
else
|
||||
mobj->tics = 4;
|
||||
}
|
||||
else if ((player->panim == PA_RUN) || (player->panim == PA_PEEL))
|
||||
else if ((player->panim == PA_RUN) || (player->panim == PA_DASH))
|
||||
{
|
||||
if (speed > 52<<FRACBITS)
|
||||
mobj->tics = 1;
|
||||
|
@ -628,7 +577,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
UINT16 frame = (mobj->frame & FF_FRAMEMASK)+1;
|
||||
UINT8 numframes;
|
||||
|
||||
UINT8 spr2 = P_GetMobjSprite2(mobj, st->frame & FF_FRAMEMASK);
|
||||
UINT8 spr2 = P_GetMobjSprite2(mobj, (((player->powers[pw_super]) ? FF_SPR2SUPER : 0)|st->frame) & FF_FRAMEMASK);
|
||||
|
||||
if (skin)
|
||||
numframes = skin->sprites[spr2].numframes;
|
||||
|
@ -1647,11 +1596,8 @@ static void P_PlayerFlip(mobj_t *mo)
|
|||
G_GhostAddFlip();
|
||||
// Flip aiming to match!
|
||||
|
||||
if (mo->player->pflags & PF_NIGHTSMODE) // NiGHTS doesn't use flipcam
|
||||
{
|
||||
if (mo->tracer)
|
||||
mo->tracer->eflags ^= MFE_VERTICALFLIP;
|
||||
}
|
||||
if (mo->player->powers[pw_carry] == CR_NIGHTSMODE) // NiGHTS doesn't use flipcam
|
||||
;
|
||||
else if (mo->player->pflags & PF_FLIPCAM)
|
||||
{
|
||||
mo->player->aiming = InvAngle(mo->player->aiming);
|
||||
|
@ -1747,7 +1693,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
|
|||
|| (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))
|
||||
if (mo->player->climbing || (mo->player->powers[pw_carry] == CR_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
|
||||
|
@ -1899,9 +1845,12 @@ static void P_XYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy)
|
|||
// spinning friction
|
||||
if (player->pflags & PF_SPINNING && (player->rmomx || player->rmomy) && !(player->pflags & PF_STARTDASH))
|
||||
{
|
||||
const fixed_t ns = FixedDiv(549*ORIG_FRICTION,500*FRACUNIT);
|
||||
mo->momx = FixedMul(mo->momx, ns);
|
||||
mo->momy = FixedMul(mo->momy, ns);
|
||||
if (twodlevel || player->mo->flags2 & MF2_TWOD) // Otherwise handled in P_3DMovement
|
||||
{
|
||||
const fixed_t ns = FixedDiv(549*ORIG_FRICTION,500*FRACUNIT);
|
||||
mo->momx = FixedMul(mo->momx, ns);
|
||||
mo->momy = FixedMul(mo->momy, ns);
|
||||
}
|
||||
}
|
||||
else if (abs(player->rmomx) < FixedMul(STOPSPEED, mo->scale)
|
||||
&& abs(player->rmomy) < FixedMul(STOPSPEED, mo->scale)
|
||||
|
@ -2327,7 +2276,7 @@ void P_XYMovement(mobj_t *mo)
|
|||
// Check the gravity status.
|
||||
P_CheckGravity(mo, false);
|
||||
|
||||
if (player && !moved && player->pflags & PF_NIGHTSMODE && mo->target)
|
||||
if (player && !moved && player->powers[pw_carry] == CR_NIGHTSMODE && mo->target)
|
||||
{
|
||||
angle_t fa;
|
||||
|
||||
|
@ -2370,7 +2319,7 @@ void P_XYMovement(mobj_t *mo)
|
|||
if (player && player->homing) // no friction for homing
|
||||
return;
|
||||
|
||||
if (player && player->pflags & PF_NIGHTSMODE)
|
||||
if (player && player->powers[pw_carry] == CR_NIGHTSMODE)
|
||||
return; // no friction for NiGHTS players
|
||||
|
||||
#ifdef ESLOPE
|
||||
|
@ -2593,6 +2542,9 @@ boolean P_CheckDeathPitCollide(mobj_t *mo)
|
|||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
if (mo->player && mo->player->pflags & PF_GODMODE)
|
||||
return false;
|
||||
|
||||
if (((mo->z <= mo->subsector->sector->floorheight
|
||||
&& !(mo->eflags & MFE_VERTICALFLIP) && (mo->subsector->sector->flags & SF_FLIPSPECIAL_FLOOR))
|
||||
|| (mo->z + mo->height >= mo->subsector->sector->ceilingheight
|
||||
|
@ -3152,7 +3104,7 @@ static void P_PlayerZMovement(mobj_t *mo)
|
|||
else
|
||||
mo->z = mo->floorz;
|
||||
|
||||
if (mo->player->pflags & PF_NIGHTSMODE)
|
||||
if (mo->player->powers[pw_carry] == CR_NIGHTSMODE)
|
||||
{
|
||||
// bounce off floor if you were flying towards it
|
||||
if ((mo->eflags & MFE_VERTICALFLIP && mo->player->flyangle > 0 && mo->player->flyangle < 180)
|
||||
|
@ -3260,60 +3212,69 @@ static void P_PlayerZMovement(mobj_t *mo)
|
|||
// aren't pressing any controls.
|
||||
if (!(mo->player->cmd.forwardmove || mo->player->cmd.sidemove) && !mo->player->cmomx && !mo->player->cmomy && !(mo->player->pflags & PF_SPINNING))
|
||||
{
|
||||
mo->momx = mo->momx/2;
|
||||
mo->momy = mo->momy/2;
|
||||
mo->momx >>= 1;
|
||||
mo->momy >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (mo->health)
|
||||
if (mo->health && !P_CheckDeathPitCollide(mo))
|
||||
{
|
||||
if (mo->player->pflags & PF_GLIDING) // ground gliding
|
||||
{
|
||||
mo->player->skidtime = TICRATE;
|
||||
mo->tics = -1;
|
||||
}
|
||||
else if (mo->player->charability2 == CA2_MELEE && mo->player->panim == PA_ABILITY2)
|
||||
else if (mo->player->charability2 == CA2_MELEE && (mo->player->panim == PA_ABILITY2 && mo->state-states != S_PLAY_MELEE_LANDING))
|
||||
{
|
||||
P_InstaThrust(mo, mo->angle, 0);
|
||||
P_SetPlayerMobjState(mo, S_PLAY_STND);
|
||||
P_SetPlayerMobjState(mo, S_PLAY_MELEE_LANDING);
|
||||
mo->tics = (mo->movefactor == FRACUNIT) ? TICRATE/2 : (FixedDiv(35<<(FRACBITS-1), FixedSqrt(mo->movefactor)))>>FRACBITS;
|
||||
S_StartSound(mo, sfx_s3k8b);
|
||||
mo->player->pflags |= PF_FULLSTASIS;
|
||||
}
|
||||
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->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)
|
||||
if (mo->player->charflags & SF_DASHMODE && mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_DASH)
|
||||
P_SetPlayerMobjState(mo, S_PLAY_DASH);
|
||||
else if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale)
|
||||
&& (mo->player->panim != PA_RUN || mo->state-states == S_PLAY_FLOAT_RUN))
|
||||
P_SetPlayerMobjState(mo, S_PLAY_RUN);
|
||||
else if ((mo->player->rmomx || mo->player->rmomy) && (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_SUPER_FLOAT))
|
||||
else if ((mo->player->rmomx || mo->player->rmomy)
|
||||
&& (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_FLOAT))
|
||||
P_SetPlayerMobjState(mo, S_PLAY_WALK);
|
||||
else if (!mo->player->rmomx && !mo->player->rmomy && mo->player->panim != PA_IDLE)
|
||||
P_SetPlayerMobjState(mo, S_PLAY_STND);
|
||||
}
|
||||
else
|
||||
{
|
||||
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)
|
||||
if (mo->player->charflags & SF_DASHMODE && mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_DASH)
|
||||
P_SetPlayerMobjState(mo, S_PLAY_DASH);
|
||||
else if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale)
|
||||
&& (mo->player->panim != PA_RUN || mo->state-states == S_PLAY_FLOAT_RUN))
|
||||
P_SetPlayerMobjState(mo, S_PLAY_RUN);
|
||||
else if ((mo->momx || mo->momy) && (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_SUPER_FLOAT))
|
||||
else if ((mo->momx || mo->momy)
|
||||
&& (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_FLOAT))
|
||||
P_SetPlayerMobjState(mo, S_PLAY_WALK);
|
||||
else if (!mo->momx && !mo->momy && mo->player->panim != PA_IDLE)
|
||||
P_SetPlayerMobjState(mo, S_PLAY_STND);
|
||||
}
|
||||
}
|
||||
|
||||
if (mo->player->pflags & PF_JUMPED)
|
||||
mo->player->pflags &= ~PF_SPINNING;
|
||||
else if (!(mo->player->pflags & PF_USEDOWN))
|
||||
if ((mo->player->charability2 == CA2_SPINDASH) && !(mo->player->pflags & PF_THOKKED) && (mo->player->cmd.buttons & BT_USE) && (FixedHypot(mo->momx, mo->momy) > (5*mo->scale)))
|
||||
{
|
||||
mo->player->pflags |= PF_SPINNING;
|
||||
P_SetPlayerMobjState(mo, S_PLAY_ROLL);
|
||||
S_StartSound(mo, sfx_spin);
|
||||
}
|
||||
else
|
||||
mo->player->pflags &= ~PF_SPINNING;
|
||||
|
||||
if (!(mo->player->pflags & PF_GLIDING))
|
||||
mo->player->pflags &= ~(PF_JUMPED|PF_FORCEJUMPDAMAGE);
|
||||
mo->player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE);
|
||||
|
||||
mo->player->pflags &= ~(PF_THOKKED|PF_CANCARRY/*|PF_GLIDING*/);
|
||||
mo->player->jumping = 0;
|
||||
mo->player->pflags &= ~(PF_STARTJUMP|PF_THOKKED|PF_CANCARRY/*|PF_GLIDING*/);
|
||||
mo->player->secondjump = 0;
|
||||
mo->player->glidetime = 0;
|
||||
mo->player->climbing = 0;
|
||||
|
@ -3347,6 +3308,16 @@ static void P_PlayerZMovement(mobj_t *mo)
|
|||
clipmomz = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (mo->player->pflags & PF_BOUNCING)
|
||||
{
|
||||
P_MobjCheckWater(mo);
|
||||
mo->momz *= -1;
|
||||
P_DoAbilityBounce(mo->player, true);
|
||||
if (mo->player->scoreadd)
|
||||
mo->player->scoreadd--;
|
||||
clipmomz = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!(mo->player->pflags & PF_SPINNING))
|
||||
|
@ -3395,7 +3366,7 @@ nightsdone:
|
|||
else
|
||||
mo->z = mo->ceilingz - mo->height;
|
||||
|
||||
if (mo->player->pflags & PF_NIGHTSMODE)
|
||||
if (mo->player->powers[pw_carry] == CR_NIGHTSMODE)
|
||||
{
|
||||
// bounce off ceiling if you were flying towards it
|
||||
if ((mo->eflags & MFE_VERTICALFLIP && mo->player->flyangle > 180 && mo->player->flyangle <= 359)
|
||||
|
@ -3608,8 +3579,8 @@ static boolean P_SceneryZMovement(mobj_t *mo)
|
|||
//
|
||||
boolean P_CanRunOnWater(player_t *player, ffloor_t *rover)
|
||||
{
|
||||
if (!(player->pflags & PF_NIGHTSMODE) && !player->homing
|
||||
&& ((player->powers[pw_super] || player->charflags & SF_RUNONWATER) && player->mo->ceilingz-*rover->topheight >= player->mo->height)
|
||||
if (!player->powers[pw_carry] && !player->homing
|
||||
&& ((player->powers[pw_super] || player->charflags & SF_RUNONWATER || player->dashmode >= 3*TICRATE) && 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))
|
||||
|
@ -4014,7 +3985,7 @@ void P_DestroyRobots(void)
|
|||
continue; // not a mobj thinker
|
||||
|
||||
mo = (mobj_t *)think;
|
||||
if (mo->health <= 0 || !(mo->flags & MF_ENEMY || mo->flags & MF_BOSS))
|
||||
if (mo->health <= 0 || !(mo->flags & (MF_ENEMY|MF_BOSS)))
|
||||
continue; // not a valid enemy
|
||||
|
||||
if (mo->type == MT_PLAYER) // Don't chase after other players!
|
||||
|
@ -4037,7 +4008,7 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled
|
|||
|| (thiscam == &camera2 && players[secondarydisplayplayer].mo && (players[secondarydisplayplayer].mo->flags2 & MF2_TWOD)))
|
||||
itsatwodlevel = true;
|
||||
|
||||
if (player->pflags & PF_FLIPCAM && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP)
|
||||
if (player->pflags & PF_FLIPCAM && !(player->powers[pw_carry] == CR_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP)
|
||||
postimg = postimg_flip;
|
||||
else if (player->awayviewtics)
|
||||
{
|
||||
|
@ -4170,6 +4141,9 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
|||
// momentum movement
|
||||
mobj->eflags &= ~MFE_JUSTSTEPPEDDOWN;
|
||||
|
||||
if (mobj->state-states == S_PLAY_BOUNCE_LANDING)
|
||||
goto animonly; // no need for checkposition - doesn't move at ALL
|
||||
|
||||
// Zoom tube
|
||||
if (mobj->tracer)
|
||||
{
|
||||
|
@ -4290,9 +4264,9 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (!(mobj->player->pflags & PF_NIGHTSMODE)) // "jumping" is used for drilling
|
||||
mobj->player->jumping = 0;
|
||||
mobj->player->pflags &= ~PF_JUMPED;
|
||||
if (!(mobj->player->powers[pw_carry] == CR_NIGHTSMODE)) // used for drilling
|
||||
mobj->player->pflags &= ~PF_STARTJUMP;
|
||||
mobj->player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE);
|
||||
if (mobj->player->secondjump || mobj->player->powers[pw_tailsfly])
|
||||
{
|
||||
mobj->player->secondjump = 0;
|
||||
|
@ -5492,10 +5466,10 @@ static void P_Boss7Thinker(mobj_t *mobj)
|
|||
if (players[i].mo->health <= 0)
|
||||
continue;
|
||||
|
||||
if (players[i].powers[pw_ingoop])
|
||||
if (players[i].powers[pw_carry] == CR_BRAKGOOP)
|
||||
{
|
||||
closestNum = -1;
|
||||
closestdist = 16384*FRACUNIT; // Just in case...
|
||||
closestdist = INT32_MAX; // Just in case...
|
||||
|
||||
// Find waypoint he is closest to
|
||||
for (th = thinkercap.next; th != &thinkercap; th = th->next)
|
||||
|
@ -6904,7 +6878,7 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
return;
|
||||
if (/*(mobj->target) -- the following is implicit by P_AddShield
|
||||
&& (mobj->target->player)
|
||||
&& */ (mobj->target->player->homing))
|
||||
&& */ (mobj->target->player->homing) && (mobj->target->player->pflags & PF_SHIELDABILITY))
|
||||
{
|
||||
P_SetMobjState(mobj, mobj->info->painstate);
|
||||
mobj->tics++;
|
||||
|
@ -7039,6 +7013,25 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
return;
|
||||
}
|
||||
break;
|
||||
case MT_LOCKON:
|
||||
if (!mobj->target)
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return;
|
||||
}
|
||||
mobj->x = mobj->target->x;
|
||||
mobj->y = mobj->target->y;
|
||||
|
||||
mobj->eflags |= (mobj->target->eflags & MFE_VERTICALFLIP);
|
||||
|
||||
mobj->destscale = mobj->target->destscale;
|
||||
P_SetScale(mobj, mobj->target->scale);
|
||||
|
||||
if (!(mobj->eflags & MFE_VERTICALFLIP))
|
||||
mobj->z = mobj->target->z + mobj->target->height + FixedMul((16 + abs((leveltime % TICRATE) - TICRATE/2))*FRACUNIT, mobj->target->scale);
|
||||
else
|
||||
mobj->z = mobj->target->z - FixedMul((16 + abs((leveltime % TICRATE) - TICRATE/2))*FRACUNIT, mobj->target->scale) - mobj->height;
|
||||
break;
|
||||
case MT_DROWNNUMBERS:
|
||||
if (!mobj->target)
|
||||
{
|
||||
|
@ -7310,7 +7303,6 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
ns = 4 * FRACUNIT;
|
||||
mo2->momx = FixedMul(FINESINE(fa),ns);
|
||||
mo2->momy = FixedMul(FINECOSINE(fa),ns);
|
||||
mo2->angle = fa << ANGLETOFINESHIFT;
|
||||
|
||||
if (P_RandomChance(FRACUNIT/4)) // I filled a spreadsheet trying to get the equivalent chance to the original P_RandomByte hack!
|
||||
S_StartSound(mo2, mobj->info->deathsound);
|
||||
|
@ -7322,6 +7314,7 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
P_SetTarget(&flicky->target, mo2);
|
||||
flicky->momx = mo2->momx;
|
||||
flicky->momy = mo2->momy;
|
||||
flicky->angle = fa << ANGLETOFINESHIFT;
|
||||
}
|
||||
|
||||
mobj->fuse--;
|
||||
|
@ -7367,6 +7360,18 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
}
|
||||
else switch (mobj->type)
|
||||
{
|
||||
case MT_FALLINGROCK:
|
||||
// Despawn rocks here in case zmovement code can't do so (blame slopes)
|
||||
if (!mobj->momx && !mobj->momy && !mobj->momz
|
||||
&& ((mobj->eflags & MFE_VERTICALFLIP) ?
|
||||
mobj->z + mobj->height >= mobj->ceilingz
|
||||
: mobj->z <= mobj->floorz))
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return;
|
||||
}
|
||||
P_MobjCheckWater(mobj);
|
||||
break;
|
||||
case MT_EMERALDSPAWN:
|
||||
if (mobj->threshold)
|
||||
{
|
||||
|
@ -7653,7 +7658,7 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
}
|
||||
else if (mobj->tracer && mobj->tracer->player)
|
||||
{
|
||||
if (!(mobj->tracer->player->pflags & PF_NIGHTSMODE))
|
||||
if (!(mobj->tracer->player->powers[pw_carry] == CR_NIGHTSMODE))
|
||||
{
|
||||
mobj->flags &= ~MF_NOGRAVITY;
|
||||
mobj->flags2 &= ~MF2_DONTDRAW;
|
||||
|
@ -7705,7 +7710,7 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
P_SetTarget(&mobj->target, NULL);
|
||||
}
|
||||
|
||||
if (mobj->tracer->player->pflags & PF_NIGHTSMODE)
|
||||
if (mobj->tracer->player->powers[pw_carry] == CR_NIGHTSMODE)
|
||||
{
|
||||
if (mobj->tracer->player->bonustime)
|
||||
{
|
||||
|
@ -8445,6 +8450,10 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
|||
case MT_SPIKE:
|
||||
mobj->flags2 |= MF2_STANDONME;
|
||||
break;
|
||||
case MT_LAMPPOST1:
|
||||
case MT_LAMPPOST2:
|
||||
mobj->flags2 |= MF2_STANDONME;
|
||||
break;
|
||||
case MT_DETON:
|
||||
mobj->movedir = 0;
|
||||
break;
|
||||
|
@ -8774,7 +8783,6 @@ consvar_t cv_itemrespawntime = {"respawnitemtime", "30", CV_NETVAR|CV_CHEAT, res
|
|||
consvar_t cv_itemrespawn = {"respawnitem", "On", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
static CV_PossibleValue_t flagtime_cons_t[] = {{0, "MIN"}, {300, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_flagtime = {"flagtime", "30", CV_NETVAR|CV_CHEAT, flagtime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_suddendeath = {"suddendeath", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
void P_SpawnPrecipitation(void)
|
||||
{
|
||||
|
@ -9517,7 +9525,7 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
|||
// Yeah, this is a dirty hack.
|
||||
if ((mobjinfo[i].flags & (MF_MONITOR|MF_GRENADEBOUNCE)) == MF_MONITOR)
|
||||
{
|
||||
if (gametype == GT_COMPETITION)
|
||||
if (gametype == GT_COMPETITION || gametype == GT_RACE)
|
||||
{
|
||||
// Set powerup boxes to user settings for competition.
|
||||
if (cv_competitionboxes.value == 1) // Random
|
||||
|
@ -9590,7 +9598,8 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
|||
if (ultimatemode)
|
||||
{
|
||||
if (i == MT_PITY_BOX || i == MT_ELEMENTAL_BOX || i == MT_ATTRACT_BOX
|
||||
|| i == MT_FORCE_BOX || i == MT_ARMAGEDDON_BOX || i == MT_WHIRLWIND_BOX)
|
||||
|| i == MT_FORCE_BOX || i == MT_ARMAGEDDON_BOX || i == MT_WHIRLWIND_BOX
|
||||
|| i == MT_FLAMEAURA_BOX || i == MT_BUBBLEWRAP_BOX || i == MT_THUNDERCOIN_BOX)
|
||||
return; // No shields in Ultimate mode
|
||||
|
||||
if (i == MT_RING_BOX && !G_IsSpecialStage(gamemap))
|
||||
|
@ -9712,11 +9721,10 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
|||
switch(mobj->type)
|
||||
{
|
||||
case MT_SKYBOX:
|
||||
mobj->angle = 0;
|
||||
if (mthing->options & MTF_OBJECTSPECIAL)
|
||||
skyboxmo[1] = mobj;
|
||||
skyboxcenterpnts[mthing->extrainfo] = mobj;
|
||||
else
|
||||
skyboxmo[0] = mobj;
|
||||
skyboxviewpnts[mthing->extrainfo] = mobj;
|
||||
break;
|
||||
case MT_FAN:
|
||||
if (mthing->options & MTF_OBJECTSPECIAL)
|
||||
|
@ -9761,20 +9769,16 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
|||
mobjtype_t macetype = MT_SMALLMACE;
|
||||
boolean firsttime;
|
||||
mobj_t *spawnee;
|
||||
size_t line;
|
||||
INT32 line;
|
||||
const size_t mthingi = (size_t)(mthing - mapthings);
|
||||
|
||||
// Why does P_FindSpecialLineFromTag not work here?!?
|
||||
// Monster Iestyn: tag lists haven't been initialised yet for the map, that's why
|
||||
for (line = 0; line < numlines; line++)
|
||||
{
|
||||
if (lines[line].special == 9 && lines[line].tag == mthing->angle)
|
||||
break;
|
||||
}
|
||||
// Find the corresponding linedef special, using angle as tag
|
||||
// P_FindSpecialLineFromTag works here now =D
|
||||
line = P_FindSpecialLineFromTag(9, mthing->angle, -1);
|
||||
|
||||
if (line == numlines)
|
||||
if (line == -1)
|
||||
{
|
||||
CONS_Debug(DBG_GAMELOGIC, "Mace chain (mapthing #%s) needs tagged to a #9 parameter line (trying to find tag %d).\n", sizeu1(mthingi), mthing->angle);
|
||||
CONS_Debug(DBG_GAMELOGIC, "Mace chain (mapthing #%s) needs to be tagged to a #9 parameter line (trying to find tag %d).\n", sizeu1(mthingi), mthing->angle);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
|
@ -9872,18 +9876,15 @@ ML_NOCLIMB : Direction not controllable
|
|||
fixed_t radius, speed, bottomheight, topheight;
|
||||
INT32 type, numdivisions, time, anglespeed;
|
||||
angle_t angledivision;
|
||||
size_t line;
|
||||
INT32 line;
|
||||
const size_t mthingi = (size_t)(mthing - mapthings);
|
||||
|
||||
for (line = 0; line < numlines; line++)
|
||||
{
|
||||
if (lines[line].special == 15 && lines[line].tag == mthing->angle)
|
||||
break;
|
||||
}
|
||||
// Find the corresponding linedef special, using angle as tag
|
||||
line = P_FindSpecialLineFromTag(15, mthing->angle, -1);
|
||||
|
||||
if (line == numlines)
|
||||
if (line == -1)
|
||||
{
|
||||
CONS_Debug(DBG_GAMELOGIC, "Particle generator (mapthing #%s) needs tagged to a #15 parameter line (trying to find tag %d).\n", sizeu1(mthingi), mthing->angle);
|
||||
CONS_Debug(DBG_GAMELOGIC, "Particle generator (mapthing #%s) needs to be tagged to a #15 parameter line (trying to find tag %d).\n", sizeu1(mthingi), mthing->angle);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -35,9 +35,11 @@
|
|||
#pragma interface
|
||||
#endif
|
||||
|
||||
/// \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: only the frame number - 0 to 256 (Frames from 0 to 63, Sprite2 number uses 0 to 127 plus FF_SPR2SUPER)
|
||||
#define FF_FRAMEMASK 0xff
|
||||
|
||||
/// \brief Frame flags - SPR2: Super sprite2
|
||||
#define FF_SPR2SUPER 0x80
|
||||
/// \brief Frame flags - SPR2: A change of state at the end of Sprite2 animation
|
||||
#define FF_SPR2ENDSTATE 0x1000
|
||||
/// \brief Frame flags - SPR2: 50% of starting in middle of Sprite2 animation
|
||||
|
|
|
@ -152,7 +152,6 @@ static void P_NetArchivePlayers(void)
|
|||
WRITESINT8(save_p, players[i].xtralife);
|
||||
WRITEUINT8(save_p, players[i].gotcontinue);
|
||||
WRITEFIXED(save_p, players[i].speed);
|
||||
WRITEUINT8(save_p, players[i].jumping);
|
||||
WRITEUINT8(save_p, players[i].secondjump);
|
||||
WRITEUINT8(save_p, players[i].fly1);
|
||||
WRITEUINT8(save_p, players[i].scoreadd);
|
||||
|
@ -332,7 +331,6 @@ static void P_NetUnArchivePlayers(void)
|
|||
players[i].xtralife = READSINT8(save_p); // Ring Extra Life counter
|
||||
players[i].gotcontinue = READUINT8(save_p); // got continue from stage
|
||||
players[i].speed = READFIXED(save_p); // Player's speed (distance formula of MOMX and MOMY values)
|
||||
players[i].jumping = READUINT8(save_p); // Jump counter
|
||||
players[i].secondjump = READUINT8(save_p);
|
||||
players[i].fly1 = READUINT8(save_p); // Tails flying
|
||||
players[i].scoreadd = READUINT8(save_p); // Used for multiple enemy attack bonus
|
||||
|
|
|
@ -199,6 +199,8 @@ static void P_ClearSingleMapHeaderInfo(INT16 i)
|
|||
const INT16 num = (INT16)(i-1);
|
||||
DEH_WriteUndoline("LEVELNAME", mapheaderinfo[num]->lvlttl, UNDO_NONE);
|
||||
mapheaderinfo[num]->lvlttl[0] = '\0';
|
||||
DEH_WriteUndoline("SELECTHEADING", mapheaderinfo[num]->selectheading, UNDO_NONE);
|
||||
mapheaderinfo[num]->selectheading[0] = '\0';
|
||||
DEH_WriteUndoline("SUBTITLE", mapheaderinfo[num]->subttl, UNDO_NONE);
|
||||
mapheaderinfo[num]->subttl[0] = '\0';
|
||||
DEH_WriteUndoline("ACT", va("%d", mapheaderinfo[num]->actnum), UNDO_NONE);
|
||||
|
@ -2274,6 +2276,17 @@ void P_LoadThingsOnly(void)
|
|||
// Search through all the thinkers.
|
||||
mobj_t *mo;
|
||||
thinker_t *think;
|
||||
INT32 i, viewid = -1, centerid = -1; // for skyboxes
|
||||
|
||||
// check if these are any of the normal viewpoint/centerpoint mobjs in the level or not
|
||||
if (skyboxmo[0] || skyboxmo[1])
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
if (skyboxmo[0] && skyboxmo[0] == skyboxviewpnts[i])
|
||||
viewid = i; // save id just in case
|
||||
if (skyboxmo[1] && skyboxmo[1] == skyboxcenterpnts[i])
|
||||
centerid = i; // save id just in case
|
||||
}
|
||||
|
||||
for (think = thinkercap.next; think != &thinkercap; think = think->next)
|
||||
{
|
||||
|
@ -2291,6 +2304,10 @@ void P_LoadThingsOnly(void)
|
|||
P_PrepareThings(lastloadedmaplumpnum + ML_THINGS);
|
||||
P_LoadThings();
|
||||
|
||||
// restore skybox viewpoint/centerpoint if necessary, set them to defaults if we can't do that
|
||||
skyboxmo[0] = skyboxviewpnts[(viewid >= 0) ? viewid : 0];
|
||||
skyboxmo[1] = skyboxcenterpnts[(centerid >= 0) ? centerid : 0];
|
||||
|
||||
P_SpawnSecretItems(true);
|
||||
}
|
||||
|
||||
|
@ -2572,8 +2589,7 @@ boolean P_SetupLevel(boolean skipprecip)
|
|||
|
||||
postimgtype = postimgtype2 = postimg_none;
|
||||
|
||||
if (mapheaderinfo[gamemap-1]->forcecharacter[0] != '\0'
|
||||
&& atoi(mapheaderinfo[gamemap-1]->forcecharacter) != 255)
|
||||
if (mapheaderinfo[gamemap-1]->forcecharacter[0] != '\0')
|
||||
P_ForceCharacter(mapheaderinfo[gamemap-1]->forcecharacter);
|
||||
|
||||
// chasecam on in chaos, race, coop
|
||||
|
@ -2583,8 +2599,9 @@ boolean P_SetupLevel(boolean skipprecip)
|
|||
|
||||
if (!dedicated)
|
||||
{
|
||||
if (!cv_cam_speed.changed)
|
||||
CV_Set(&cv_cam_speed, cv_cam_speed.defaultvalue);
|
||||
// Salt: CV_ClearChangedFlags() messes with your settings :(
|
||||
/*if (!cv_cam_speed.changed)
|
||||
CV_Set(&cv_cam_speed, cv_cam_speed.defaultvalue);*/
|
||||
|
||||
if (!cv_chasecam.changed)
|
||||
CV_SetValue(&cv_chasecam, chase);
|
||||
|
@ -2725,15 +2742,25 @@ boolean P_SetupLevel(boolean skipprecip)
|
|||
for (i = 0; i < 2; i++)
|
||||
skyboxmo[i] = NULL;
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
skyboxviewpnts[i] = skyboxcenterpnts[i] = NULL;
|
||||
|
||||
P_MapStart();
|
||||
|
||||
P_PrepareThings(lastloadedmaplumpnum + ML_THINGS);
|
||||
|
||||
// init gravity, tag lists,
|
||||
// anything that P_ResetDynamicSlopes/P_LoadThings needs to know
|
||||
P_InitSpecials();
|
||||
|
||||
#ifdef ESLOPE
|
||||
P_ResetDynamicSlopes();
|
||||
#endif
|
||||
|
||||
P_LoadThings();
|
||||
// skybox mobj defaults
|
||||
skyboxmo[0] = skyboxviewpnts[0];
|
||||
skyboxmo[1] = skyboxcenterpnts[0];
|
||||
|
||||
P_SpawnSecretItems(loademblems);
|
||||
|
||||
|
@ -2747,8 +2774,6 @@ boolean P_SetupLevel(boolean skipprecip)
|
|||
if (loadprecip) // ugly hack for P_NetUnArchiveMisc (and P_LoadNetGame)
|
||||
P_SpawnPrecipitation();
|
||||
|
||||
globalweather = mapheaderinfo[gamemap-1]->weather;
|
||||
|
||||
#ifdef HWRENDER // not win32 only 19990829 by Kin
|
||||
if (rendermode != render_soft && rendermode != render_none)
|
||||
{
|
||||
|
@ -2774,8 +2799,6 @@ boolean P_SetupLevel(boolean skipprecip)
|
|||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i])
|
||||
{
|
||||
players[i].pflags &= ~PF_NIGHTSMODE;
|
||||
|
||||
// Start players with pity shields if possible
|
||||
players[i].pity = -1;
|
||||
|
||||
|
@ -2880,22 +2903,21 @@ boolean P_SetupLevel(boolean skipprecip)
|
|||
camera.angle = FixedAngle((fixed_t)thing->angle << FRACBITS);
|
||||
}
|
||||
}
|
||||
|
||||
if (!cv_cam_height.changed)
|
||||
|
||||
// Salt: CV_ClearChangedFlags() messes with your settings :(
|
||||
/*if (!cv_cam_height.changed)
|
||||
CV_Set(&cv_cam_height, cv_cam_height.defaultvalue);
|
||||
|
||||
if (!cv_cam_dist.changed)
|
||||
CV_Set(&cv_cam_dist, cv_cam_dist.defaultvalue);
|
||||
|
||||
if (!cv_cam_rotate.changed)
|
||||
CV_Set(&cv_cam_rotate, cv_cam_rotate.defaultvalue);
|
||||
|
||||
if (!cv_cam2_height.changed)
|
||||
CV_Set(&cv_cam2_height, cv_cam2_height.defaultvalue);
|
||||
|
||||
if (!cv_cam_dist.changed)
|
||||
CV_Set(&cv_cam_dist, cv_cam_dist.defaultvalue);
|
||||
if (!cv_cam2_dist.changed)
|
||||
CV_Set(&cv_cam2_dist, cv_cam2_dist.defaultvalue);
|
||||
CV_Set(&cv_cam2_dist, cv_cam2_dist.defaultvalue);*/
|
||||
|
||||
// Though, I don't think anyone would care about cam_rotate being reset back to the only value that makes sense :P
|
||||
if (!cv_cam_rotate.changed)
|
||||
CV_Set(&cv_cam_rotate, cv_cam_rotate.defaultvalue);
|
||||
if (!cv_cam2_rotate.changed)
|
||||
CV_Set(&cv_cam2_rotate, cv_cam2_rotate.defaultvalue);
|
||||
|
||||
|
|
|
@ -103,12 +103,20 @@ static fixed_t P_InterceptVector2(divline_t *v2, divline_t *v1)
|
|||
static boolean P_CrossSubsecPolyObj(polyobj_t *po, register los_t *los)
|
||||
{
|
||||
size_t i;
|
||||
sector_t *polysec;
|
||||
|
||||
if (!(po->flags & POF_RENDERALL))
|
||||
return true; // the polyobject isn't visible, so we can ignore it
|
||||
|
||||
polysec = po->lines[0]->backsector;
|
||||
|
||||
for (i = 0; i < po->numLines; ++i)
|
||||
{
|
||||
line_t *line = po->lines[i];
|
||||
divline_t divl;
|
||||
const vertex_t *v1,*v2;
|
||||
fixed_t frac;
|
||||
fixed_t topslope, bottomslope;
|
||||
|
||||
// already checked other side?
|
||||
if (line->validcount == validcount)
|
||||
|
@ -140,7 +148,22 @@ static boolean P_CrossSubsecPolyObj(polyobj_t *po, register los_t *los)
|
|||
continue;
|
||||
|
||||
// stop because it is not two sided
|
||||
return false;
|
||||
//if (!(po->flags & POF_TESTHEIGHT))
|
||||
//return false;
|
||||
|
||||
frac = P_InterceptVector2(&los->strace, &divl);
|
||||
|
||||
// get slopes of top and bottom of this polyobject line
|
||||
topslope = FixedDiv(polysec->ceilingheight - los->sightzstart , frac);
|
||||
bottomslope = FixedDiv(polysec->floorheight - los->sightzstart , frac);
|
||||
|
||||
if (topslope >= los->topslope && bottomslope <= los->bottomslope)
|
||||
return false; // view completely blocked
|
||||
|
||||
// TODO: figure out if it's worth considering partially blocked cases or not?
|
||||
// maybe to adjust los's top/bottom slopes if needed
|
||||
//if (los->topslope <= los->bottomslope)
|
||||
//return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
154
src/p_spec.c
154
src/p_spec.c
|
@ -46,7 +46,9 @@
|
|||
#include <errno.h>
|
||||
#endif
|
||||
|
||||
mobj_t *skyboxmo[2];
|
||||
mobj_t *skyboxmo[2]; // current skybox mobjs: 0 = viewpoint, 1 = centerpoint
|
||||
mobj_t *skyboxviewpnts[16]; // array of MT_SKYBOX viewpoint mobjs
|
||||
mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs
|
||||
|
||||
// Amount (dx, dy) vector linedef is shifted right to get scroll amount
|
||||
#define SCROLL_SHIFT 5
|
||||
|
@ -111,7 +113,7 @@ static void P_AddFakeFloorsByLine(size_t line, ffloortype_e ffloorflags, thinker
|
|||
static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec);
|
||||
static void Add_Friction(INT32 friction, INT32 movefactor, INT32 affectee, INT32 referrer);
|
||||
static void P_AddSpikeThinker(sector_t *sec, INT32 referrer);
|
||||
static void P_AddPlaneDisplaceThinker(INT32 type, fixed_t speed, INT32 control, INT32 affectee);
|
||||
static void P_AddPlaneDisplaceThinker(INT32 type, fixed_t speed, INT32 control, INT32 affectee, UINT8 reverse);
|
||||
|
||||
|
||||
//SoM: 3/7/2000: New sturcture without limits.
|
||||
|
@ -3044,7 +3046,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
|||
|
||||
case 443: // Calls a named Lua function
|
||||
#ifdef HAVE_BLUA
|
||||
LUAh_LinedefExecute(line, mo, callsec);
|
||||
if (line->text)
|
||||
LUAh_LinedefExecute(line, mo, callsec);
|
||||
else
|
||||
CONS_Alert(CONS_WARNING, "Linedef %s is missing the hook name of the Lua function to call! (This should be given in the front texture fields)\n", sizeu1(line-lines));
|
||||
#else
|
||||
CONS_Alert(CONS_ERROR, "The map is trying to run a Lua script, but this exe was not compiled with Lua support!\n");
|
||||
#endif
|
||||
|
@ -3156,6 +3161,47 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
|||
}
|
||||
break;
|
||||
|
||||
case 448: // Change skybox viewpoint/centerpoint
|
||||
if ((mo && mo->player && P_IsLocalPlayer(mo->player)) || (line->flags & ML_NOCLIMB))
|
||||
{
|
||||
INT32 viewid = sides[line->sidenum[0]].textureoffset>>FRACBITS;
|
||||
INT32 centerid = sides[line->sidenum[0]].rowoffset>>FRACBITS;
|
||||
|
||||
if ((line->flags & (ML_EFFECT4|ML_BLOCKMONSTERS)) == ML_EFFECT4) // Solid Midtexture is on but Block Enemies is off?
|
||||
{
|
||||
CONS_Alert(CONS_WARNING,
|
||||
M_GetText("Skybox switch linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"),
|
||||
line->tag);
|
||||
}
|
||||
else
|
||||
{
|
||||
// set viewpoint mobj
|
||||
if (!(line->flags & ML_EFFECT4)) // Solid Midtexture turns off viewpoint setting
|
||||
{
|
||||
if (viewid >= 0 && viewid < 16)
|
||||
skyboxmo[0] = skyboxviewpnts[viewid];
|
||||
else
|
||||
skyboxmo[0] = NULL;
|
||||
}
|
||||
|
||||
// set centerpoint mobj
|
||||
if (line->flags & ML_BLOCKMONSTERS) // Block Enemies turns ON centerpoint setting
|
||||
{
|
||||
if (centerid >= 0 && centerid < 16)
|
||||
skyboxmo[1] = skyboxcenterpnts[centerid];
|
||||
else
|
||||
skyboxmo[1] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
CONS_Debug(DBG_GAMELOGIC, "Line type 448 Executor: viewid = %d, centerid = %d, viewpoint? = %s, centerpoint? = %s\n",
|
||||
viewid,
|
||||
centerid,
|
||||
((line->flags & ML_EFFECT4) ? "no" : "yes"),
|
||||
((line->flags & ML_BLOCKMONSTERS) ? "yes" : "no"));
|
||||
}
|
||||
break;
|
||||
|
||||
case 450: // Execute Linedef Executor - for recursion
|
||||
P_LinedefExecute(line->tag, mo, NULL);
|
||||
break;
|
||||
|
@ -3575,7 +3621,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
|||
P_DamageMobj(player->mo, NULL, NULL, 1, 0);
|
||||
break;
|
||||
case 2: // Damage (Water)
|
||||
if ((roversector || P_MobjReadyToTrigger(player->mo, sector)) && (player->powers[pw_underwater] || player->pflags & PF_NIGHTSMODE))
|
||||
if ((roversector || P_MobjReadyToTrigger(player->mo, sector)) && (player->powers[pw_underwater] || player->powers[pw_carry] == CR_NIGHTSMODE))
|
||||
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_WATER);
|
||||
break;
|
||||
case 3: // Damage (Fire)
|
||||
|
@ -3792,7 +3838,7 @@ DoneSection2:
|
|||
if (!(player->pflags & PF_SPINNING))
|
||||
player->pflags |= PF_SPINNING;
|
||||
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN);
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
|
||||
}
|
||||
|
||||
player->powers[pw_flashing] = TICRATE/3;
|
||||
|
@ -3953,7 +3999,7 @@ DoneSection2:
|
|||
if (!(player->pflags & PF_SPINNING) && P_IsObjectOnGround(player->mo) && (player->charability2 == CA2_SPINDASH))
|
||||
{
|
||||
player->pflags |= PF_SPINNING;
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN);
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
|
||||
S_StartAttackSound(player->mo, sfx_spin);
|
||||
|
||||
if (abs(player->rmomx) < FixedMul(5*FRACUNIT, player->mo->scale)
|
||||
|
@ -4030,12 +4076,12 @@ DoneSection2:
|
|||
player->powers[pw_carry] = CR_ZOOMTUBE;
|
||||
player->speed = speed;
|
||||
player->pflags |= PF_SPINNING;
|
||||
player->pflags &= ~(PF_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
|
||||
player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
|
||||
player->climbing = 0;
|
||||
|
||||
if (player->mo->state-states != S_PLAY_SPIN)
|
||||
if (player->mo->state-states != S_PLAY_ROLL)
|
||||
{
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN);
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
|
||||
S_StartSound(player->mo, sfx_spin);
|
||||
}
|
||||
}
|
||||
|
@ -4110,12 +4156,12 @@ DoneSection2:
|
|||
player->powers[pw_carry] = CR_ZOOMTUBE;
|
||||
player->speed = speed;
|
||||
player->pflags |= PF_SPINNING;
|
||||
player->pflags &= ~(PF_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
|
||||
player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
|
||||
player->climbing = 0;
|
||||
|
||||
if (player->mo->state-states != S_PLAY_SPIN)
|
||||
if (player->mo->state-states != S_PLAY_ROLL)
|
||||
{
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN);
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
|
||||
S_StartSound(player->mo, sfx_spin);
|
||||
}
|
||||
}
|
||||
|
@ -4128,7 +4174,7 @@ DoneSection2:
|
|||
{
|
||||
player->laps++;
|
||||
|
||||
if (player->pflags & PF_NIGHTSMODE)
|
||||
if (player->powers[pw_carry] == CR_NIGHTSMODE)
|
||||
player->drillmeter += 48*20;
|
||||
|
||||
if (player->laps >= (UINT8)cv_numlaps.value)
|
||||
|
@ -4418,7 +4464,7 @@ DoneSection2:
|
|||
|
||||
S_StartSound(player->mo, sfx_s3k4a);
|
||||
|
||||
player->pflags &= ~(PF_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
|
||||
player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
|
||||
player->climbing = 0;
|
||||
P_SetThingPosition(player->mo);
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_RIDE);
|
||||
|
@ -5173,10 +5219,11 @@ static inline void P_AddBridgeThinker(line_t *sourceline, sector_t *sec)
|
|||
* \param speed Rate of movement relative to control sector
|
||||
* \param control Control sector.
|
||||
* \param affectee Target sector.
|
||||
* \param reverse Reverse direction?
|
||||
* \sa P_SpawnSpecials, T_PlaneDisplace
|
||||
* \author Monster Iestyn
|
||||
*/
|
||||
static void P_AddPlaneDisplaceThinker(INT32 type, fixed_t speed, INT32 control, INT32 affectee)
|
||||
static void P_AddPlaneDisplaceThinker(INT32 type, fixed_t speed, INT32 control, INT32 affectee, UINT8 reverse)
|
||||
{
|
||||
planedisplace_t *displace;
|
||||
|
||||
|
@ -5190,6 +5237,7 @@ static void P_AddPlaneDisplaceThinker(INT32 type, fixed_t speed, INT32 control,
|
|||
displace->last_height = sectors[control].floorheight;
|
||||
displace->speed = speed;
|
||||
displace->type = type;
|
||||
displace->reverse = reverse;
|
||||
}
|
||||
|
||||
/** Adds a Mario block thinker, which changes the block's texture between blank
|
||||
|
@ -5541,6 +5589,45 @@ static void P_RunLevelLoadExecutors(void)
|
|||
}
|
||||
}
|
||||
|
||||
/** Before things are loaded, initialises certain stuff in case they're needed
|
||||
* by P_ResetDynamicSlopes or P_LoadThings. This was split off from
|
||||
* P_SpawnSpecials, in case you couldn't tell.
|
||||
*
|
||||
* \sa P_SpawnSpecials, P_InitTagLists
|
||||
* \author Monster Iestyn
|
||||
*/
|
||||
void P_InitSpecials(void)
|
||||
{
|
||||
// Set the default gravity. Custom gravity overrides this setting.
|
||||
gravity = FRACUNIT/2;
|
||||
|
||||
// Defaults in case levels don't have them set.
|
||||
sstimer = 90*TICRATE + 6;
|
||||
totalrings = 1;
|
||||
|
||||
CheckForBustableBlocks = CheckForBouncySector = CheckForQuicksand = CheckForMarioBlocks = CheckForFloatBob = CheckForReverseGravity = false;
|
||||
|
||||
// Set curWeather
|
||||
switch (mapheaderinfo[gamemap-1]->weather)
|
||||
{
|
||||
case PRECIP_SNOW: // snow
|
||||
case PRECIP_RAIN: // rain
|
||||
case PRECIP_STORM: // storm
|
||||
case PRECIP_STORM_NORAIN: // storm w/o rain
|
||||
case PRECIP_STORM_NOSTRIKES: // storm w/o lightning
|
||||
curWeather = mapheaderinfo[gamemap-1]->weather;
|
||||
break;
|
||||
default: // blank/none
|
||||
curWeather = PRECIP_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
// Set globalweather
|
||||
globalweather = mapheaderinfo[gamemap-1]->weather;
|
||||
|
||||
P_InitTagLists(); // Create xref tables for tags
|
||||
}
|
||||
|
||||
/** After the map has loaded, scans for specials that spawn 3Dfloors and
|
||||
* thinkers.
|
||||
*
|
||||
|
@ -5562,15 +5649,6 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
// but currently isn't.
|
||||
(void)fromnetsave;
|
||||
|
||||
// Set the default gravity. Custom gravity overrides this setting.
|
||||
gravity = FRACUNIT/2;
|
||||
|
||||
// Defaults in case levels don't have them set.
|
||||
sstimer = 90*TICRATE + 6;
|
||||
totalrings = 1;
|
||||
|
||||
CheckForBustableBlocks = CheckForBouncySector = CheckForQuicksand = CheckForMarioBlocks = CheckForFloatBob = CheckForReverseGravity = false;
|
||||
|
||||
// Init special SECTORs.
|
||||
sector = sectors;
|
||||
for (i = 0; i < numsectors; i++, sector++)
|
||||
|
@ -5619,20 +5697,6 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
}
|
||||
}
|
||||
|
||||
if (mapheaderinfo[gamemap-1]->weather == 2) // snow
|
||||
curWeather = PRECIP_SNOW;
|
||||
else if (mapheaderinfo[gamemap-1]->weather == 3) // rain
|
||||
curWeather = PRECIP_RAIN;
|
||||
else if (mapheaderinfo[gamemap-1]->weather == 1) // storm
|
||||
curWeather = PRECIP_STORM;
|
||||
else if (mapheaderinfo[gamemap-1]->weather == 5) // storm w/o rain
|
||||
curWeather = PRECIP_STORM_NORAIN;
|
||||
else if (mapheaderinfo[gamemap-1]->weather == 6) // storm w/o lightning
|
||||
curWeather = PRECIP_STORM_NOSTRIKES;
|
||||
else
|
||||
curWeather = PRECIP_NONE;
|
||||
|
||||
P_InitTagLists(); // Create xref tables for tags
|
||||
P_SearchForDisableLinedefs(); // Disable linedefs are now allowed to disable *any* line
|
||||
|
||||
P_SpawnScrollers(); // Add generalized scrollers
|
||||
|
@ -5909,15 +5973,15 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
|
||||
case 66: // Displace floor by front sector
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
|
||||
P_AddPlaneDisplaceThinker(pd_floor, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s);
|
||||
P_AddPlaneDisplaceThinker(pd_floor, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB));
|
||||
break;
|
||||
case 67: // Displace ceiling by front sector
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
|
||||
P_AddPlaneDisplaceThinker(pd_ceiling, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s);
|
||||
P_AddPlaneDisplaceThinker(pd_ceiling, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB));
|
||||
break;
|
||||
case 68: // Displace both floor AND ceiling by front sector
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
|
||||
P_AddPlaneDisplaceThinker(pd_both, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s);
|
||||
P_AddPlaneDisplaceThinker(pd_both, P_AproxDistance(lines[i].dx, lines[i].dy)>>8, sides[lines[i].sidenum[0]].sector-sectors, s, !!(lines[i].flags & ML_NOCLIMB));
|
||||
break;
|
||||
|
||||
case 100: // FOF (solid, opaque, shadows)
|
||||
|
@ -7301,7 +7365,7 @@ static inline boolean PIT_PushThing(mobj_t *thing)
|
|||
return false;
|
||||
|
||||
// Allow this to affect pushable objects at some point?
|
||||
if (thing->player && (!(thing->flags & (MF_NOGRAVITY | MF_NOCLIP)) || thing->player->pflags & PF_NIGHTSMODE))
|
||||
if (thing->player && (!(thing->flags & (MF_NOGRAVITY | MF_NOCLIP)) || thing->player->powers[pw_carry] == CR_NIGHTSMODE))
|
||||
{
|
||||
INT32 dist;
|
||||
INT32 speed;
|
||||
|
@ -7332,7 +7396,7 @@ static inline boolean PIT_PushThing(mobj_t *thing)
|
|||
// Written with bits and pieces of P_HomingAttack
|
||||
if ((speed > 0) && (P_CheckSight(thing, tmpusher->source)))
|
||||
{
|
||||
if (!(thing->player->pflags & PF_NIGHTSMODE))
|
||||
if (thing->player->powers[pw_carry] != CR_NIGHTSMODE)
|
||||
{
|
||||
// only push wrt Z if health & 1 (mapthing has ambush flag)
|
||||
if (tmpusher->source->health & 1)
|
||||
|
@ -7661,11 +7725,11 @@ void T_Pusher(pusher_t *p)
|
|||
{
|
||||
if (p->slider && thing->player)
|
||||
{
|
||||
boolean jumped = (thing->player->pflags & PF_JUMPED);
|
||||
pflags_t jumped = (thing->player->pflags & (PF_JUMPED|PF_NOJUMPDAMAGE));
|
||||
P_ResetPlayer (thing->player);
|
||||
|
||||
if (jumped)
|
||||
thing->player->pflags |= PF_JUMPED;
|
||||
thing->player->pflags |= jumped;
|
||||
|
||||
thing->player->pflags |= PF_SLIDING;
|
||||
P_SetPlayerMobjState (thing, thing->info->painstate); // Whee!
|
||||
|
|
|
@ -17,7 +17,9 @@
|
|||
#ifndef __P_SPEC__
|
||||
#define __P_SPEC__
|
||||
|
||||
extern mobj_t *skyboxmo[2];
|
||||
extern mobj_t *skyboxmo[2]; // current skybox mobjs: 0 = viewpoint, 1 = centerpoint
|
||||
extern mobj_t *skyboxviewpnts[16]; // array of MT_SKYBOX viewpoint mobjs
|
||||
extern mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs
|
||||
|
||||
// GETSECSPECIAL (specialval, section)
|
||||
//
|
||||
|
@ -32,6 +34,7 @@ void P_InitPicAnims(void);
|
|||
void P_SetupLevelFlatAnims(void);
|
||||
|
||||
// at map load
|
||||
void P_InitSpecials(void);
|
||||
void P_SpawnSpecials(INT32 fromnetsave);
|
||||
|
||||
// every tic
|
||||
|
@ -458,6 +461,7 @@ typedef struct
|
|||
INT32 control; ///< Control sector used to control plane positions.
|
||||
fixed_t last_height; ///< Last known height of control sector.
|
||||
fixed_t speed; ///< Plane movement speed.
|
||||
UINT8 reverse; ///< Move in reverse direction to control sector?
|
||||
/** Types of plane displacement effects.
|
||||
*/
|
||||
enum
|
||||
|
|
|
@ -163,6 +163,7 @@ boolean P_Teleport(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle
|
|||
if (playeringame[p] && players[p].mo && players[p].powers[pw_carry] == CR_PLAYER && players[p].mo->tracer == thing)
|
||||
{
|
||||
players[p].powers[pw_carry] = CR_NONE;
|
||||
P_SetTarget(&players[p].mo->tracer, NULL);
|
||||
break;
|
||||
}
|
||||
thing->player->cmomx = thing->player->cmomy = 0;
|
||||
|
|
1145
src/p_user.c
1145
src/p_user.c
File diff suppressed because it is too large
Load diff
|
@ -210,7 +210,7 @@ void R_PortalClearClipSegs(INT32 start, INT32 end)
|
|||
//
|
||||
// It assumes that Doom has already ruled out a door being closed because
|
||||
// of front-back closure (e.g. front floor is taller than back ceiling).
|
||||
static inline INT32 R_DoorClosed(void)
|
||||
static INT32 R_DoorClosed(void)
|
||||
{
|
||||
return
|
||||
|
||||
|
|
54
src/r_data.c
54
src/r_data.c
|
@ -22,7 +22,7 @@
|
|||
#include "w_wad.h"
|
||||
#include "z_zone.h"
|
||||
#include "p_setup.h" // levelflats
|
||||
#include "v_video.h" // pLocalPalette
|
||||
#include "v_video.h" // pMasterPalette
|
||||
#include "dehacked.h"
|
||||
|
||||
#if defined (_WIN32) || defined (_WIN32_WCE)
|
||||
|
@ -635,42 +635,24 @@ void R_LoadTextures(void)
|
|||
}
|
||||
else
|
||||
{
|
||||
UINT16 patchcount = 1;
|
||||
//CONS_Printf("\n\"%s\" is a single patch, dimensions %d x %d",W_CheckNameForNumPwad((UINT16)w,texstart+j),patchlump->width, patchlump->height);
|
||||
if (SHORT(patchlump->width) == 64
|
||||
&& SHORT(patchlump->height) == 64)
|
||||
{ // 64x64 patch
|
||||
const column_t *column;
|
||||
for (k = 0; k < SHORT(patchlump->width); k++)
|
||||
{ // Find use of transparency.
|
||||
column = (const column_t *)((const UINT8 *)patchlump + LONG(patchlump->columnofs[k]));
|
||||
if (column->length != SHORT(patchlump->height))
|
||||
break;
|
||||
}
|
||||
if (k == SHORT(patchlump->width))
|
||||
patchcount = 2; // No transparency? 64x128 texture.
|
||||
}
|
||||
texture = textures[i] = Z_Calloc(sizeof(texture_t) + (sizeof(texpatch_t) * patchcount), PU_STATIC, NULL);
|
||||
texture = textures[i] = Z_Calloc(sizeof(texture_t) + sizeof(texpatch_t), PU_STATIC, NULL);
|
||||
|
||||
// Set texture properties.
|
||||
M_Memcpy(texture->name, W_CheckNameForNumPwad((UINT16)w, texstart + j), sizeof(texture->name));
|
||||
texture->width = SHORT(patchlump->width);
|
||||
texture->height = SHORT(patchlump->height)*patchcount;
|
||||
texture->patchcount = patchcount;
|
||||
texture->height = SHORT(patchlump->height);
|
||||
texture->patchcount = 1;
|
||||
texture->holes = false;
|
||||
texture->flip = 0;
|
||||
|
||||
// Allocate information for the texture's patches.
|
||||
for (k = 0; k < patchcount; k++)
|
||||
{
|
||||
patch = &texture->patches[k];
|
||||
patch = &texture->patches[0];
|
||||
|
||||
patch->originx = 0;
|
||||
patch->originy = (INT16)(k*patchlump->height);
|
||||
patch->wad = (UINT16)w;
|
||||
patch->lump = texstart + j;
|
||||
patch->flip = 0;
|
||||
}
|
||||
patch->originx = patch->originy = 0;
|
||||
patch->wad = (UINT16)w;
|
||||
patch->lump = texstart + j;
|
||||
patch->flip = 0;
|
||||
|
||||
Z_Unlock(patchlump);
|
||||
|
||||
|
@ -1428,9 +1410,9 @@ INT32 R_CreateColormap(char *p1, char *p2, char *p3)
|
|||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
r = pLocalPalette[i].s.red;
|
||||
g = pLocalPalette[i].s.green;
|
||||
b = pLocalPalette[i].s.blue;
|
||||
r = pMasterPalette[i].s.red;
|
||||
g = pMasterPalette[i].s.green;
|
||||
b = pMasterPalette[i].s.blue;
|
||||
cbrightness = sqrt((r*r) + (g*g) + (b*b));
|
||||
|
||||
map[i][0] = (cbrightness * cmaskr) + (r * othermask);
|
||||
|
@ -1571,9 +1553,9 @@ void R_CreateColormap2(char *p1, char *p2, char *p3)
|
|||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
r = pLocalPalette[i].s.red;
|
||||
g = pLocalPalette[i].s.green;
|
||||
b = pLocalPalette[i].s.blue;
|
||||
r = pMasterPalette[i].s.red;
|
||||
g = pMasterPalette[i].s.green;
|
||||
b = pMasterPalette[i].s.blue;
|
||||
cbrightness = sqrt((r*r) + (g*g) + (b*b));
|
||||
|
||||
map[i][0] = (cbrightness * cmaskr) + (r * othermask);
|
||||
|
@ -1653,9 +1635,9 @@ static UINT8 NearestColor(UINT8 r, UINT8 g, UINT8 b)
|
|||
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
dr = r - pLocalPalette[i].s.red;
|
||||
dg = g - pLocalPalette[i].s.green;
|
||||
db = b - pLocalPalette[i].s.blue;
|
||||
dr = r - pMasterPalette[i].s.red;
|
||||
dg = g - pMasterPalette[i].s.green;
|
||||
db = b - pMasterPalette[i].s.blue;
|
||||
distortion = dr*dr + dg*dg + db*db;
|
||||
if (distortion < bestdistortion)
|
||||
{
|
||||
|
|
24
src/r_draw.c
24
src/r_draw.c
|
@ -194,10 +194,10 @@ const UINT8 Color_Opposite[MAXSKINCOLORS*2] =
|
|||
SKINCOLOR_BROWN,8, // SKINCOLOR_PEACH - ditto
|
||||
SKINCOLOR_PEACH,8, // SKINCOLOR_BROWN - ditto
|
||||
SKINCOLOR_GREEN,5, // SKINCOLOR_RED
|
||||
SKINCOLOR_CYAN,8, // SKINCOLOR_CRIMSON - ditto
|
||||
SKINCOLOR_BLUE,12, // SKINCOLOR_ORANGE
|
||||
SKINCOLOR_CYAN,8, // SKINCOLOR_CRIMSON - ditto
|
||||
SKINCOLOR_BLUE,11, // SKINCOLOR_ORANGE
|
||||
SKINCOLOR_TAN,8, // SKINCOLOR_RUST - ditto
|
||||
SKINCOLOR_LAVENDER,8, // SKINCOLOR_GOLD - ditto
|
||||
SKINCOLOR_LAVENDER,8, // SKINCOLOR_GOLD
|
||||
SKINCOLOR_TEAL,8, // SKINCOLOR_YELLOW - ditto
|
||||
SKINCOLOR_RUST,8, // SKINCOLOR_TAN - ditto
|
||||
SKINCOLOR_MAGENTA,3, // SKINCOLOR_MOSS
|
||||
|
@ -206,15 +206,15 @@ const UINT8 Color_Opposite[MAXSKINCOLORS*2] =
|
|||
SKINCOLOR_PASTEL,8, // SKINCOLOR_EMERALD - ditto
|
||||
SKINCOLOR_ROSY,8, // SKINCOLOR_AQUA - ditto
|
||||
SKINCOLOR_YELLOW,8, // SKINCOLOR_TEAL - ditto
|
||||
SKINCOLOR_CRIMSON,8, // SKINCOLOR_CYAN - ditto
|
||||
SKINCOLOR_CRIMSON,8, // SKINCOLOR_CYAN - ditto
|
||||
SKINCOLOR_ORANGE,9, // SKINCOLOR_BLUE
|
||||
SKINCOLOR_PINK,8, // SKINCOLOR_AZURE - ditto
|
||||
SKINCOLOR_EMERALD,8, // SKINCOLOR_PASTEL - ditto
|
||||
SKINCOLOR_PERIDOT,10, // SKINCOLOR_PURPLE - ditto
|
||||
SKINCOLOR_GOLD,8, // SKINCOLOR_LAVENDER - ditto
|
||||
SKINCOLOR_PERIDOT,10, // SKINCOLOR_PURPLE
|
||||
SKINCOLOR_GOLD,10, // SKINCOLOR_LAVENDER
|
||||
SKINCOLOR_MOSS,8, // SKINCOLOR_MAGENTA - ditto
|
||||
SKINCOLOR_AZURE,8, // SKINCOLOR_PINK - ditto
|
||||
SKINCOLOR_AQUA,14 // SKINCOLOR_ROSY - ditto
|
||||
SKINCOLOR_AQUA,14 // SKINCOLOR_ROSY
|
||||
};
|
||||
|
||||
CV_PossibleValue_t Color_cons_t[MAXSKINCOLORS+1];
|
||||
|
@ -420,11 +420,11 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
|
|||
if (i <= 11)
|
||||
dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (i >> 1));
|
||||
else if (i == 12)
|
||||
dest_colormap[starttranscolor + i] = 0x2c; // Darkest 4
|
||||
else if (i == 13)
|
||||
dest_colormap[starttranscolor + i] = 0xfe; // Darkest 3
|
||||
dest_colormap[starttranscolor + i] = 0x2c;
|
||||
else if (i <= 14)
|
||||
dest_colormap[starttranscolor + i] = 0x2d;
|
||||
else
|
||||
dest_colormap[starttranscolor + i] = 0x2d + i - 14; // Darkest 2 and 1
|
||||
dest_colormap[starttranscolor + i] = 0x48;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -530,7 +530,7 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
|
|||
for (i = 0; i < SKIN_RAMP_LENGTH; i++)
|
||||
{
|
||||
if (i == 15)
|
||||
dest_colormap[starttranscolor + i] = 0x1F; //Darkest 1
|
||||
dest_colormap[starttranscolor + i] = 0xfe; //Darkest 1
|
||||
else if (i == 14)
|
||||
dest_colormap[starttranscolor + i] = 0xfd; //Darkest 2
|
||||
else
|
||||
|
|
208
src/r_main.c
208
src/r_main.c
|
@ -60,7 +60,6 @@ fixed_t projectiony; // aspect ratio
|
|||
// just for profiling purposes
|
||||
size_t framecount;
|
||||
|
||||
size_t sscount;
|
||||
size_t loopcount;
|
||||
|
||||
fixed_t viewx, viewy, viewz;
|
||||
|
@ -491,9 +490,6 @@ static void R_InitTextureMapping(void)
|
|||
// Take out the fencepost cases from viewangletox.
|
||||
for (i = 0; i < FINEANGLES/2; i++)
|
||||
{
|
||||
t = FixedMul(FINETANGENT(i), focallength);
|
||||
t = centerx - t;
|
||||
|
||||
if (viewangletox[i] == -1)
|
||||
viewangletox[i] = 0;
|
||||
else if (viewangletox[i] == viewwidth+1)
|
||||
|
@ -802,157 +798,77 @@ void R_SkyboxFrame(player_t *player)
|
|||
|
||||
viewx = viewmobj->x;
|
||||
viewy = viewmobj->y;
|
||||
viewz = 0;
|
||||
if (viewmobj->spawnpoint)
|
||||
viewz = ((fixed_t)viewmobj->spawnpoint->angle)<<FRACBITS;
|
||||
|
||||
viewx += quake.x;
|
||||
viewy += quake.y;
|
||||
viewz += quake.z;
|
||||
viewz = viewmobj->z; // 26/04/17: use actual Z position instead of spawnpoint angle!
|
||||
|
||||
if (mapheaderinfo[gamemap-1])
|
||||
{
|
||||
mapheader_t *mh = mapheaderinfo[gamemap-1];
|
||||
if (player->awayviewtics)
|
||||
{
|
||||
if (skyboxmo[1])
|
||||
{
|
||||
fixed_t x = 0, y = 0;
|
||||
if (mh->skybox_scalex > 0)
|
||||
x = (player->awayviewmobj->x - skyboxmo[1]->x) / mh->skybox_scalex;
|
||||
else if (mh->skybox_scalex < 0)
|
||||
x = (player->awayviewmobj->x - skyboxmo[1]->x) * -mh->skybox_scalex;
|
||||
vector3_t campos = {0,0,0}; // Position of player's actual view point
|
||||
|
||||
if (mh->skybox_scaley > 0)
|
||||
y = (player->awayviewmobj->y - skyboxmo[1]->y) / mh->skybox_scaley;
|
||||
else if (mh->skybox_scaley < 0)
|
||||
y = (player->awayviewmobj->y - skyboxmo[1]->y) * -mh->skybox_scaley;
|
||||
|
||||
if (viewmobj->angle == 0)
|
||||
{
|
||||
viewx += x;
|
||||
viewy += y;
|
||||
}
|
||||
else if (viewmobj->angle == ANGLE_90)
|
||||
{
|
||||
viewx -= y;
|
||||
viewy += x;
|
||||
}
|
||||
else if (viewmobj->angle == ANGLE_180)
|
||||
{
|
||||
viewx -= x;
|
||||
viewy -= y;
|
||||
}
|
||||
else if (viewmobj->angle == ANGLE_270)
|
||||
{
|
||||
viewx += y;
|
||||
viewy -= x;
|
||||
}
|
||||
else
|
||||
{
|
||||
angle_t ang = viewmobj->angle>>ANGLETOFINESHIFT;
|
||||
viewx += FixedMul(x,FINECOSINE(ang)) - FixedMul(y, FINESINE(ang));
|
||||
viewy += FixedMul(x, FINESINE(ang)) + FixedMul(y,FINECOSINE(ang));
|
||||
}
|
||||
}
|
||||
if (mh->skybox_scalez > 0)
|
||||
viewz += (player->awayviewmobj->z + 20*FRACUNIT) / mh->skybox_scalez;
|
||||
else if (mh->skybox_scalez < 0)
|
||||
viewz += (player->awayviewmobj->z + 20*FRACUNIT) * -mh->skybox_scalez;
|
||||
if (player->awayviewtics) {
|
||||
campos.x = player->awayviewmobj->x;
|
||||
campos.y = player->awayviewmobj->y;
|
||||
campos.z = player->awayviewmobj->z + 20*FRACUNIT;
|
||||
} else if (thiscam->chase) {
|
||||
campos.x = thiscam->x;
|
||||
campos.y = thiscam->y;
|
||||
campos.z = thiscam->z + (thiscam->height>>1);
|
||||
} else {
|
||||
campos.x = player->mo->x;
|
||||
campos.y = player->mo->y;
|
||||
campos.z = player->viewz;
|
||||
}
|
||||
else if (thiscam->chase)
|
||||
|
||||
// Earthquake effects should be scaled in the skybox
|
||||
// (if an axis isn't used, the skybox won't shake in that direction)
|
||||
campos.x += quake.x;
|
||||
campos.y += quake.y;
|
||||
campos.z += quake.z;
|
||||
|
||||
if (skyboxmo[1]) // Is there a viewpoint?
|
||||
{
|
||||
if (skyboxmo[1])
|
||||
fixed_t x = 0, y = 0;
|
||||
if (mh->skybox_scalex > 0)
|
||||
x = (campos.x - skyboxmo[1]->x) / mh->skybox_scalex;
|
||||
else if (mh->skybox_scalex < 0)
|
||||
x = (campos.x - skyboxmo[1]->x) * -mh->skybox_scalex;
|
||||
|
||||
if (mh->skybox_scaley > 0)
|
||||
y = (campos.y - skyboxmo[1]->y) / mh->skybox_scaley;
|
||||
else if (mh->skybox_scaley < 0)
|
||||
y = (campos.y - skyboxmo[1]->y) * -mh->skybox_scaley;
|
||||
|
||||
if (viewmobj->angle == 0)
|
||||
{
|
||||
fixed_t x = 0, y = 0;
|
||||
if (mh->skybox_scalex > 0)
|
||||
x = (thiscam->x - skyboxmo[1]->x) / mh->skybox_scalex;
|
||||
else if (mh->skybox_scalex < 0)
|
||||
x = (thiscam->x - skyboxmo[1]->x) * -mh->skybox_scalex;
|
||||
|
||||
if (mh->skybox_scaley > 0)
|
||||
y = (thiscam->y - skyboxmo[1]->y) / mh->skybox_scaley;
|
||||
else if (mh->skybox_scaley < 0)
|
||||
y = (thiscam->y - skyboxmo[1]->y) * -mh->skybox_scaley;
|
||||
|
||||
if (viewmobj->angle == 0)
|
||||
{
|
||||
viewx += x;
|
||||
viewy += y;
|
||||
}
|
||||
else if (viewmobj->angle == ANGLE_90)
|
||||
{
|
||||
viewx -= y;
|
||||
viewy += x;
|
||||
}
|
||||
else if (viewmobj->angle == ANGLE_180)
|
||||
{
|
||||
viewx -= x;
|
||||
viewy -= y;
|
||||
}
|
||||
else if (viewmobj->angle == ANGLE_270)
|
||||
{
|
||||
viewx += y;
|
||||
viewy -= x;
|
||||
}
|
||||
else
|
||||
{
|
||||
angle_t ang = viewmobj->angle>>ANGLETOFINESHIFT;
|
||||
viewx += FixedMul(x,FINECOSINE(ang)) - FixedMul(y, FINESINE(ang));
|
||||
viewy += FixedMul(x, FINESINE(ang)) + FixedMul(y,FINECOSINE(ang));
|
||||
}
|
||||
viewx += x;
|
||||
viewy += y;
|
||||
}
|
||||
if (mh->skybox_scalez > 0)
|
||||
viewz += (thiscam->z + (thiscam->height>>1)) / mh->skybox_scalez;
|
||||
else if (mh->skybox_scalez < 0)
|
||||
viewz += (thiscam->z + (thiscam->height>>1)) * -mh->skybox_scalez;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (skyboxmo[1])
|
||||
else if (viewmobj->angle == ANGLE_90)
|
||||
{
|
||||
fixed_t x = 0, y = 0;
|
||||
if (mh->skybox_scalex > 0)
|
||||
x = (player->mo->x - skyboxmo[1]->x) / mh->skybox_scalex;
|
||||
else if (mh->skybox_scalex < 0)
|
||||
x = (player->mo->x - skyboxmo[1]->x) * -mh->skybox_scalex;
|
||||
if (mh->skybox_scaley > 0)
|
||||
y = (player->mo->y - skyboxmo[1]->y) / mh->skybox_scaley;
|
||||
else if (mh->skybox_scaley < 0)
|
||||
y = (player->mo->y - skyboxmo[1]->y) * -mh->skybox_scaley;
|
||||
|
||||
if (viewmobj->angle == 0)
|
||||
{
|
||||
viewx += x;
|
||||
viewy += y;
|
||||
}
|
||||
else if (viewmobj->angle == ANGLE_90)
|
||||
{
|
||||
viewx -= y;
|
||||
viewy += x;
|
||||
}
|
||||
else if (viewmobj->angle == ANGLE_180)
|
||||
{
|
||||
viewx -= x;
|
||||
viewy -= y;
|
||||
}
|
||||
else if (viewmobj->angle == ANGLE_270)
|
||||
{
|
||||
viewx += y;
|
||||
viewy -= x;
|
||||
}
|
||||
else
|
||||
{
|
||||
angle_t ang = viewmobj->angle>>ANGLETOFINESHIFT;
|
||||
viewx += FixedMul(x,FINECOSINE(ang)) - FixedMul(y, FINESINE(ang));
|
||||
viewy += FixedMul(x, FINESINE(ang)) + FixedMul(y,FINECOSINE(ang));
|
||||
}
|
||||
viewx -= y;
|
||||
viewy += x;
|
||||
}
|
||||
else if (viewmobj->angle == ANGLE_180)
|
||||
{
|
||||
viewx -= x;
|
||||
viewy -= y;
|
||||
}
|
||||
else if (viewmobj->angle == ANGLE_270)
|
||||
{
|
||||
viewx += y;
|
||||
viewy -= x;
|
||||
}
|
||||
else
|
||||
{
|
||||
angle_t ang = viewmobj->angle>>ANGLETOFINESHIFT;
|
||||
viewx += FixedMul(x,FINECOSINE(ang)) - FixedMul(y, FINESINE(ang));
|
||||
viewy += FixedMul(x, FINESINE(ang)) + FixedMul(y,FINECOSINE(ang));
|
||||
}
|
||||
if (mh->skybox_scalez > 0)
|
||||
viewz += player->viewz / mh->skybox_scalez;
|
||||
else if (mh->skybox_scalez < 0)
|
||||
viewz += player->viewz * -mh->skybox_scalez;
|
||||
}
|
||||
if (mh->skybox_scalez > 0)
|
||||
viewz += campos.z / mh->skybox_scalez;
|
||||
else if (mh->skybox_scalez < 0)
|
||||
viewz += campos.z * -mh->skybox_scalez;
|
||||
}
|
||||
|
||||
if (viewmobj->subsector)
|
||||
|
@ -963,8 +879,6 @@ void R_SkyboxFrame(player_t *player)
|
|||
viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
|
||||
viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
|
||||
|
||||
sscount = 0;
|
||||
|
||||
// recalc necessary stuff for mouseaiming
|
||||
// slopes are already calculated for the full possible view (which is 4*viewheight).
|
||||
|
||||
|
@ -1000,7 +914,7 @@ void R_SetupFrame(player_t *player, boolean skybox)
|
|||
chasecam = (cv_chasecam.value != 0);
|
||||
}
|
||||
|
||||
if (player->climbing || (player->pflags & PF_NIGHTSMODE) || player->playerstate == PST_DEAD || gamestate == GS_TITLESCREEN)
|
||||
if (player->climbing || (player->powers[pw_carry] == CR_NIGHTSMODE) || player->playerstate == PST_DEAD || gamestate == GS_TITLESCREEN)
|
||||
chasecam = true; // force chasecam on
|
||||
else if (player->spectator) // no spectator chasecam
|
||||
chasecam = false; // force chasecam off
|
||||
|
@ -1088,8 +1002,6 @@ void R_SetupFrame(player_t *player, boolean skybox)
|
|||
viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
|
||||
viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
|
||||
|
||||
sscount = 0;
|
||||
|
||||
// recalc necessary stuff for mouseaiming
|
||||
// slopes are already calculated for the full possible view (which is 4*viewheight).
|
||||
|
||||
|
|
|
@ -108,7 +108,4 @@ extern angle_t rw_normalangle;
|
|||
// angle to line origin
|
||||
extern angle_t rw_angle1;
|
||||
|
||||
// Segs count?
|
||||
extern size_t sscount;
|
||||
|
||||
#endif
|
||||
|
|
103
src/r_things.c
103
src/r_things.c
|
@ -1182,7 +1182,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
|||
{
|
||||
sprdef = &((skin_t *)thing->skin)->sprites[thing->sprite2];
|
||||
if (rot >= sprdef->numframes) {
|
||||
CONS_Alert(CONS_ERROR, M_GetText("R_ProjectSprite: invalid skins[\"%s\"].sprites[SPR2_%s] frame %s\n"), ((skin_t *)thing->skin)->name, spr2names[thing->sprite2], sizeu5(rot));
|
||||
CONS_Alert(CONS_ERROR, M_GetText("R_ProjectSprite: invalid skins[\"%s\"].sprites[%sSPR2_%s] frame %s\n"), ((skin_t *)thing->skin)->name, ((thing->sprite2 & FF_SPR2SUPER) ? "FF_SPR2SUPER|": ""), spr2names[(thing->sprite2 & ~FF_SPR2SUPER)], sizeu5(rot));
|
||||
thing->sprite = states[S_UNKNOWN].sprite;
|
||||
thing->frame = states[S_UNKNOWN].frame;
|
||||
sprdef = &sprites[thing->sprite];
|
||||
|
@ -2492,7 +2492,11 @@ static void Sk_SetDefaultValue(skin_t *skin)
|
|||
skin->flags = 0;
|
||||
|
||||
strcpy(skin->realname, "Someone");
|
||||
#ifdef SKINNAMEPADDING
|
||||
strcpy(skin->hudname, " ???");
|
||||
#else
|
||||
strcpy(skin->hudname, "???");
|
||||
#endif
|
||||
strncpy(skin->charsel, "CHRSONIC", 8);
|
||||
strncpy(skin->face, "MISSING", 8);
|
||||
strncpy(skin->superface, "MISSING", 8);
|
||||
|
@ -2554,16 +2558,29 @@ void R_InitSkins(void)
|
|||
numskins = 0;
|
||||
}
|
||||
|
||||
UINT32 R_GetSkinAvailabilities(void)
|
||||
{
|
||||
INT32 s;
|
||||
UINT32 response = 0;
|
||||
|
||||
for (s = 0; s < MAXSKINS; s++)
|
||||
{
|
||||
if (skins[s].availability && unlockables[skins[s].availability - 1].unlocked)
|
||||
response |= (1 << s);
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
// 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)
|
||||
boolean R_SkinUsable(INT32 playernum, 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)
|
||||
|| ((playernum != -1) ? (players[playernum].availabilities & (1 << skinnum)) : (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.
|
||||
|| (netgame && (cv_forceskin.value == skinnum)) // Force 2.
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -2588,7 +2605,7 @@ void SetPlayerSkin(INT32 playernum, const char *skinname)
|
|||
INT32 i = R_SkinAvailable(skinname);
|
||||
player_t *player = &players[playernum];
|
||||
|
||||
if ((i != -1) && (!P_IsLocalPlayer(player) || R_SkinUnlock(i)))
|
||||
if ((i != -1) && R_SkinUsable(playernum, i))
|
||||
{
|
||||
SetPlayerSkinByNum(playernum, i);
|
||||
return;
|
||||
|
@ -2610,8 +2627,7 @@ void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum)
|
|||
skin_t *skin = &skins[skinnum];
|
||||
UINT8 newcolor = 0;
|
||||
|
||||
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...
|
||||
if (skinnum >= 0 && skinnum < numskins && R_SkinUsable(playernum, skinnum)) // Make sure it exists!
|
||||
{
|
||||
player->skin = skinnum;
|
||||
|
||||
|
@ -2653,7 +2669,7 @@ void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum)
|
|||
|
||||
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.
|
||||
if ((player->powers[pw_carry] == CR_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);
|
||||
|
@ -2663,16 +2679,16 @@ void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum)
|
|||
player->mo->color = newcolor;
|
||||
P_SetScale(player->mo, player->mo->scale);
|
||||
player->mo->radius = FixedMul(skin->radius, player->mo->scale);
|
||||
|
||||
P_SetPlayerMobjState(player->mo, player->mo->state-states); // Prevent visual errors when switching between skins with differing number of frames
|
||||
}
|
||||
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);
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Requested skin not found\n"));
|
||||
else if(server || adminplayer == consoleplayer)
|
||||
CONS_Alert(CONS_WARNING, "Player %d (%s) skin %d not found\n", playernum, player_names[playernum], skinnum);
|
||||
CONS_Alert(CONS_WARNING, "Player %d (%s) skin not found\n", playernum, player_names[playernum]);
|
||||
SetPlayerSkinByNum(playernum, 0); // not found put the sonic skin
|
||||
}
|
||||
|
||||
|
@ -2701,6 +2717,12 @@ static UINT16 W_CheckForSkinMarkerInPwad(UINT16 wadid, UINT16 startlump)
|
|||
return INT16_MAX; // not found
|
||||
}
|
||||
|
||||
#ifdef SKINNAMEPADDING
|
||||
#define HUDNAMEWRITE(value) snprintf(skin->hudname, sizeof(skin->hudname), "%5s", value)
|
||||
#else
|
||||
#define HUDNAMEWRITE(value) STRBUFCPY(skin->hudname, value)
|
||||
#endif
|
||||
|
||||
//
|
||||
// Find skin sprites, sounds & optional status bar face, & add them
|
||||
//
|
||||
|
@ -2789,14 +2811,20 @@ void R_AddSkins(UINT16 wadnum)
|
|||
{
|
||||
STRBUFCPY(skin->realname, skin->name);
|
||||
for (value = skin->realname; *value; value++)
|
||||
{
|
||||
if (*value == '_') *value = ' '; // turn _ into spaces.
|
||||
else if (*value == '.') *value = '\x1E'; // turn . into katana dot.
|
||||
}
|
||||
}
|
||||
if (!hudname)
|
||||
{
|
||||
STRBUFCPY(skin->hudname, skin->name);
|
||||
HUDNAMEWRITE(skin->name);
|
||||
strupr(skin->hudname);
|
||||
for (value = skin->hudname; *value; value++)
|
||||
{
|
||||
if (*value == '_') *value = ' '; // turn _ into spaces.
|
||||
else if (*value == '.') *value = '\x1E'; // turn . into katana dot.
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!stricmp(stoken, "realname"))
|
||||
|
@ -2804,16 +2832,22 @@ void R_AddSkins(UINT16 wadnum)
|
|||
realname = true;
|
||||
STRBUFCPY(skin->realname, value);
|
||||
for (value = skin->realname; *value; value++)
|
||||
{
|
||||
if (*value == '_') *value = ' '; // turn _ into spaces.
|
||||
else if (*value == '.') *value = '\x1E'; // turn . into katana dot.
|
||||
}
|
||||
if (!hudname)
|
||||
STRBUFCPY(skin->hudname, skin->realname);
|
||||
HUDNAMEWRITE(skin->realname);
|
||||
}
|
||||
else if (!stricmp(stoken, "hudname"))
|
||||
{ // Life icon name (eg. "K.T.E")
|
||||
hudname = true;
|
||||
STRBUFCPY(skin->hudname, value);
|
||||
HUDNAMEWRITE(value);
|
||||
for (value = skin->hudname; *value; value++)
|
||||
{
|
||||
if (*value == '_') *value = ' '; // turn _ into spaces.
|
||||
else if (*value == '.') *value = '\x1E'; // turn . into katana dot.
|
||||
}
|
||||
if (!realname)
|
||||
STRBUFCPY(skin->realname, skin->hudname);
|
||||
}
|
||||
|
@ -2905,8 +2939,8 @@ void R_AddSkins(UINT16 wadnum)
|
|||
// these are uppercase so they can be concatenated with SF_
|
||||
// 1, true, yes are all valid values
|
||||
GETFLAG(SUPER)
|
||||
GETFLAG(SUPERANIMS)
|
||||
GETFLAG(SUPERSPIN)
|
||||
GETFLAG(NOSUPERSPIN)
|
||||
GETFLAG(NOSPINDASHDUST)
|
||||
GETFLAG(HIRES)
|
||||
GETFLAG(NOSKID)
|
||||
GETFLAG(NOSPEEDADJUST)
|
||||
|
@ -2916,7 +2950,9 @@ void R_AddSkins(UINT16 wadnum)
|
|||
GETFLAG(STOMPDAMAGE)
|
||||
GETFLAG(MARIODAMAGE)
|
||||
GETFLAG(MACHINE)
|
||||
GETFLAG(NOSPINDASHDUST)
|
||||
GETFLAG(DASHMODE)
|
||||
GETFLAG(FASTEDGE)
|
||||
GETFLAG(MULTIABILITY)
|
||||
#undef GETFLAG
|
||||
|
||||
else // let's check if it's a sound, otherwise error out
|
||||
|
@ -2962,20 +2998,35 @@ next_token:
|
|||
|
||||
// Add sprites
|
||||
{
|
||||
UINT16 z;
|
||||
UINT16 newlastlump;
|
||||
UINT8 sprite2;
|
||||
|
||||
lump++; // start after S_SKIN
|
||||
lastlump = W_CheckNumForNamePwad("S_END",wadnum,lump); // stop at S_END
|
||||
// old wadding practices die hard -- stop at S_SKIN or S_START if they come before S_END.
|
||||
z = W_CheckNumForNamePwad("S_SKIN",wadnum,lump);
|
||||
if (z < lastlump) lastlump = z;
|
||||
z = W_CheckNumForNamePwad("S_START",wadnum,lump);
|
||||
if (z < lastlump) lastlump = z;
|
||||
|
||||
// load all sprite sets we are aware of.
|
||||
// old wadding practices die hard -- stop at S_SKIN or S_START if they come before S_END.
|
||||
newlastlump = W_CheckNumForNamePwad("S_SKIN",wadnum,lump);
|
||||
if (newlastlump < lastlump) lastlump = newlastlump;
|
||||
newlastlump = W_CheckNumForNamePwad("S_START",wadnum,lump);
|
||||
if (newlastlump < lastlump) lastlump = newlastlump;
|
||||
|
||||
// ...and let's handle super, too
|
||||
newlastlump = W_CheckNumForNamePwad("S_SUPER",wadnum,lump);
|
||||
if (newlastlump < lastlump)
|
||||
{
|
||||
newlastlump++;
|
||||
// load all sprite sets we are aware of... for super!
|
||||
for (sprite2 = 0; sprite2 < free_spr2; sprite2++)
|
||||
R_AddSingleSpriteDef(spr2names[sprite2], &skin->sprites[FF_SPR2SUPER|sprite2], wadnum, newlastlump, lastlump);
|
||||
|
||||
newlastlump--;
|
||||
lastlump = newlastlump; // okay, make the normal sprite set loading end there
|
||||
}
|
||||
|
||||
// load all sprite sets we are aware of... for normal stuff.
|
||||
for (sprite2 = 0; sprite2 < free_spr2; sprite2++)
|
||||
R_AddSingleSpriteDef(spr2names[sprite2], &skin->sprites[sprite2], wadnum, lump, lastlump);
|
||||
|
||||
}
|
||||
|
||||
R_FlushTranslationColormapCache();
|
||||
|
@ -3000,6 +3051,8 @@ next_token:
|
|||
return;
|
||||
}
|
||||
|
||||
#undef HUDNAMEWRITE
|
||||
|
||||
#ifdef DELFILE
|
||||
void R_DelSkins(UINT16 wadnum)
|
||||
{
|
||||
|
|
|
@ -29,8 +29,6 @@
|
|||
#define VISSPRITESPERCHUNK (1 << VISSPRITECHUNKBITS)
|
||||
#define VISSPRITEINDEXMASK (VISSPRITESPERCHUNK - 1)
|
||||
|
||||
#define DEFAULTNIGHTSSKIN 0
|
||||
|
||||
// Constant arrays used for psprite clipping
|
||||
// and initializing clipping.
|
||||
extern INT16 negonearray[MAXVIDWIDTH];
|
||||
|
@ -71,6 +69,7 @@ void R_DrawMasked(void);
|
|||
// should be all lowercase!! S_SKIN processing does a strlwr
|
||||
#define DEFAULTSKIN "sonic"
|
||||
#define DEFAULTSKIN2 "tails" // secondary player
|
||||
#define DEFAULTNIGHTSSKIN 0
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
@ -118,7 +117,7 @@ typedef struct
|
|||
// specific sounds per skin
|
||||
sfxenum_t soundsid[NUMSKINSOUNDS]; // sound # in S_sfx table
|
||||
|
||||
spritedef_t sprites[NUMPLAYERSPRITES];
|
||||
spritedef_t sprites[NUMPLAYERSPRITES*2]; // contains super versions too
|
||||
|
||||
UINT8 availability; // lock?
|
||||
} skin_t;
|
||||
|
@ -204,7 +203,8 @@ 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);
|
||||
boolean R_SkinUsable(INT32 playernum, INT32 skinnum);
|
||||
UINT32 R_GetSkinAvailabilities(void);
|
||||
INT32 R_SkinAvailable(const char *name);
|
||||
void R_AddSkins(UINT16 wadnum);
|
||||
|
||||
|
|
169
src/s_sound.c
169
src/s_sound.c
|
@ -36,6 +36,7 @@ extern INT32 msg_id;
|
|||
#include "d_main.h"
|
||||
#include "r_sky.h" // skyflatnum
|
||||
#include "p_local.h" // camera info
|
||||
#include "fastcmp.h"
|
||||
|
||||
#ifdef HW3SOUND
|
||||
// 3D Sound Interface
|
||||
|
@ -81,6 +82,16 @@ static consvar_t precachesound = {"precachesound", "Off", CV_SAVE, CV_OnOff, NUL
|
|||
consvar_t cv_soundvolume = {"soundvolume", "31", CV_SAVE, soundvolume_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_digmusicvolume = {"digmusicvolume", "18", CV_SAVE, soundvolume_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_midimusicvolume = {"midimusicvolume", "18", CV_SAVE, soundvolume_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
static void Captioning_OnChange(void)
|
||||
{
|
||||
S_ResetCaptions();
|
||||
if (cv_closedcaptioning.value)
|
||||
S_StartSound(NULL, sfx_menu1);
|
||||
}
|
||||
|
||||
consvar_t cv_closedcaptioning = {"closedcaptioning", "Off", CV_SAVE|CV_CALL, CV_OnOff, Captioning_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
// number of channels available
|
||||
#if defined (_WIN32_WCE) || defined (DC) || defined (PSP) || defined(GP2X)
|
||||
consvar_t cv_numChannels = {"snd_channels", "8", CV_SAVE|CV_CALL, CV_Unsigned, SetChannelsNum, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
@ -124,23 +135,24 @@ static consvar_t surround = {"surround", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL
|
|||
// percent attenuation from front to back
|
||||
#define S_IFRACVOL 30
|
||||
|
||||
typedef struct
|
||||
{
|
||||
// sound information (if null, channel avail.)
|
||||
sfxinfo_t *sfxinfo;
|
||||
|
||||
// origin of sound
|
||||
const void *origin;
|
||||
|
||||
// handle of the sound being played
|
||||
INT32 handle;
|
||||
|
||||
} channel_t;
|
||||
|
||||
// the set of channels available
|
||||
static channel_t *channels = NULL;
|
||||
static INT32 numofchannels = 0;
|
||||
|
||||
caption_t closedcaptions[NUMCAPTIONS];
|
||||
|
||||
void S_ResetCaptions(void)
|
||||
{
|
||||
UINT8 i;
|
||||
for (i = 0; i < NUMCAPTIONS; i++)
|
||||
{
|
||||
closedcaptions[i].c = NULL;
|
||||
closedcaptions[i].s = NULL;
|
||||
closedcaptions[i].t = 0;
|
||||
closedcaptions[i].b = 0;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Internals.
|
||||
//
|
||||
|
@ -297,6 +309,8 @@ static void SetChannelsNum(void)
|
|||
// Free all channels for use
|
||||
for (i = 0; i < numofchannels; i++)
|
||||
channels[i].sfxinfo = 0;
|
||||
|
||||
S_ResetCaptions();
|
||||
}
|
||||
|
||||
|
||||
|
@ -339,6 +353,8 @@ void S_StopSounds(void)
|
|||
for (cnum = 0; cnum < numofchannels; cnum++)
|
||||
if (channels[cnum].sfxinfo)
|
||||
S_StopChannel(cnum);
|
||||
|
||||
S_ResetCaptions();
|
||||
}
|
||||
|
||||
void S_StopSoundByID(void *origin, sfxenum_t sfx_id)
|
||||
|
@ -387,6 +403,92 @@ void S_StopSoundByNum(sfxenum_t sfxnum)
|
|||
}
|
||||
}
|
||||
|
||||
void S_StartCaption(sfxenum_t sfx_id, INT32 cnum, UINT16 lifespan)
|
||||
{
|
||||
UINT8 i, set, moveup, start;
|
||||
boolean same;
|
||||
sfxinfo_t *sfx;
|
||||
|
||||
if (!cv_closedcaptioning.value) // no captions at all
|
||||
return;
|
||||
|
||||
// check for bogus sound #
|
||||
I_Assert(sfx_id >= 0); // allows sfx_None; this shouldn't be allowed directly if S_StartCaption is ever exposed to Lua by itself
|
||||
I_Assert(sfx_id < NUMSFX);
|
||||
|
||||
sfx = &S_sfx[sfx_id];
|
||||
|
||||
if (sfx->caption[0] == '/') // no caption for this one
|
||||
return;
|
||||
|
||||
start = ((closedcaptions[0].s && (closedcaptions[0].s-S_sfx == sfx_None)) ? 1 : 0);
|
||||
|
||||
if (sfx_id)
|
||||
{
|
||||
for (i = start; i < (set = NUMCAPTIONS-1); i++)
|
||||
{
|
||||
same = ((sfx == closedcaptions[i].s) || (closedcaptions[i].s && fastcmp(sfx->caption, closedcaptions[i].s->caption)));
|
||||
if (same)
|
||||
{
|
||||
set = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
set = 0;
|
||||
same = (closedcaptions[0].s == sfx);
|
||||
}
|
||||
|
||||
moveup = 255;
|
||||
|
||||
if (!same)
|
||||
{
|
||||
for (i = start; i < set; i++)
|
||||
{
|
||||
if (!(closedcaptions[i].c || closedcaptions[i].s) || (sfx->priority >= closedcaptions[i].s->priority))
|
||||
{
|
||||
set = i;
|
||||
if (closedcaptions[i].s && (sfx->priority >= closedcaptions[i].s->priority))
|
||||
moveup = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (i = NUMCAPTIONS-1; i > set; i--)
|
||||
{
|
||||
if (sfx == closedcaptions[i].s)
|
||||
{
|
||||
closedcaptions[i].c = NULL;
|
||||
closedcaptions[i].s = NULL;
|
||||
closedcaptions[i].t = 0;
|
||||
closedcaptions[i].b = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (moveup != 255)
|
||||
{
|
||||
for (i = moveup; i < NUMCAPTIONS-1; i++)
|
||||
{
|
||||
if (!(closedcaptions[i].c || closedcaptions[i].s))
|
||||
break;
|
||||
}
|
||||
for (; i > set; i--)
|
||||
{
|
||||
closedcaptions[i].c = closedcaptions[i-1].c;
|
||||
closedcaptions[i].s = closedcaptions[i-1].s;
|
||||
closedcaptions[i].t = closedcaptions[i-1].t;
|
||||
closedcaptions[i].b = closedcaptions[i-1].b;
|
||||
}
|
||||
}
|
||||
|
||||
closedcaptions[set].c = ((cnum == -1) ? NULL : &channels[cnum]);
|
||||
closedcaptions[set].s = sfx;
|
||||
closedcaptions[set].t = lifespan;
|
||||
closedcaptions[set].b = 2; // bob
|
||||
}
|
||||
|
||||
void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
|
||||
{
|
||||
INT32 sep, pitch, priority, cnum;
|
||||
|
@ -527,6 +629,9 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
|
|||
sep = (~sep) & 255;
|
||||
#endif
|
||||
|
||||
// Handle closed caption input.
|
||||
S_StartCaption(sfx_id, cnum, MAXCAPTIONTICS);
|
||||
|
||||
// Assigns the handle to one of the channels in the
|
||||
// mix/output buffer.
|
||||
channels[cnum].handle = I_StartSound(sfx_id, volume, sep, pitch, priority);
|
||||
|
@ -577,6 +682,9 @@ dontplay:
|
|||
sep = (~sep) & 255;
|
||||
#endif
|
||||
|
||||
// Handle closed caption input.
|
||||
S_StartCaption(sfx_id, cnum, MAXCAPTIONTICS);
|
||||
|
||||
// Assigns the handle to one of the channels in the
|
||||
// mix/output buffer.
|
||||
channels[cnum].handle = I_StartSound(sfx_id, volume, sep, pitch, priority);
|
||||
|
@ -598,6 +706,7 @@ void S_StartSound(const void *origin, sfxenum_t sfx_id)
|
|||
// sfx_id = sfx_mario8;
|
||||
// break;
|
||||
case sfx_thok:
|
||||
case sfx_wepfir:
|
||||
sfx_id = sfx_mario7;
|
||||
break;
|
||||
case sfx_pop:
|
||||
|
@ -611,6 +720,7 @@ void S_StartSound(const void *origin, sfxenum_t sfx_id)
|
|||
case sfx_forcsg:
|
||||
case sfx_elemsg:
|
||||
case sfx_armasg:
|
||||
case sfx_attrsg:
|
||||
case sfx_s3k3e:
|
||||
case sfx_s3k3f:
|
||||
case sfx_s3k41:
|
||||
|
@ -691,6 +801,7 @@ static INT32 actualmidimusicvolume;
|
|||
void S_UpdateSounds(void)
|
||||
{
|
||||
INT32 audible, cnum, volume, sep, pitch;
|
||||
UINT8 i;
|
||||
channel_t *c;
|
||||
|
||||
listener_t listener;
|
||||
|
@ -718,9 +829,7 @@ void S_UpdateSounds(void)
|
|||
I_UpdateMumble(NULL, listener);
|
||||
#endif
|
||||
|
||||
// Stop cutting FMOD out. WE'RE sick of it.
|
||||
I_UpdateSound();
|
||||
return;
|
||||
goto notinlevel;
|
||||
}
|
||||
|
||||
if (dedicated || nosound)
|
||||
|
@ -759,8 +868,7 @@ void S_UpdateSounds(void)
|
|||
if (hws_mode != HWS_DEFAULT_MODE)
|
||||
{
|
||||
HW3S_UpdateSources();
|
||||
I_UpdateSound();
|
||||
return;
|
||||
goto notinlevel;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -848,7 +956,26 @@ void S_UpdateSounds(void)
|
|||
}
|
||||
}
|
||||
|
||||
notinlevel:
|
||||
I_UpdateSound();
|
||||
|
||||
for (i = 0; i < NUMCAPTIONS; i++) // update captions
|
||||
{
|
||||
if (!closedcaptions[i].s)
|
||||
continue;
|
||||
|
||||
if (!(--closedcaptions[i].t))
|
||||
{
|
||||
closedcaptions[i].c = NULL;
|
||||
closedcaptions[i].s = NULL;
|
||||
}
|
||||
else if (closedcaptions[i].c && !I_SoundIsPlaying(closedcaptions[i].c->handle))
|
||||
{
|
||||
closedcaptions[i].c = NULL;
|
||||
if (closedcaptions[i].t > CAPTIONFADETICS)
|
||||
closedcaptions[i].t = CAPTIONFADETICS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void S_SetSfxVolume(INT32 volume)
|
||||
|
@ -1304,6 +1431,12 @@ void S_StopMusic(void)
|
|||
|
||||
music_data = NULL;
|
||||
music_name[0] = 0;
|
||||
|
||||
if (cv_closedcaptioning.value)
|
||||
{
|
||||
if (closedcaptions[0].s-S_sfx == sfx_None)
|
||||
closedcaptions[0].t = CAPTIONFADETICS;
|
||||
}
|
||||
}
|
||||
|
||||
void S_SetDigMusicVolume(INT32 volume)
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#define PICKUP_SOUND 0x8000
|
||||
|
||||
extern consvar_t stereoreverse;
|
||||
extern consvar_t cv_soundvolume, cv_digmusicvolume, cv_midimusicvolume;
|
||||
extern consvar_t cv_soundvolume, cv_closedcaptioning, cv_digmusicvolume, cv_midimusicvolume;
|
||||
extern consvar_t cv_numChannels;
|
||||
|
||||
#ifdef SNDSERV
|
||||
|
@ -64,6 +64,34 @@ typedef struct {
|
|||
angle_t angle;
|
||||
} listener_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
// sound information (if null, channel avail.)
|
||||
sfxinfo_t *sfxinfo;
|
||||
|
||||
// origin of sound
|
||||
const void *origin;
|
||||
|
||||
// handle of the sound being played
|
||||
INT32 handle;
|
||||
|
||||
} channel_t;
|
||||
|
||||
typedef struct {
|
||||
channel_t *c;
|
||||
sfxinfo_t *s;
|
||||
UINT16 t;
|
||||
UINT8 b;
|
||||
} caption_t;
|
||||
|
||||
#define NUMCAPTIONS 8
|
||||
#define MAXCAPTIONTICS (2*TICRATE)
|
||||
#define CAPTIONFADETICS 20
|
||||
|
||||
extern caption_t closedcaptions[NUMCAPTIONS];
|
||||
void S_StartCaption(sfxenum_t sfx_id, INT32 cnum, UINT16 lifespan);
|
||||
void S_ResetCaptions(void);
|
||||
|
||||
// register sound vars and commands at game startup
|
||||
void S_RegisterSoundStuff(void);
|
||||
|
||||
|
|
39
src/screen.c
39
src/screen.c
|
@ -28,6 +28,9 @@
|
|||
#include "d_main.h"
|
||||
#include "d_clisrv.h"
|
||||
#include "f_finale.h"
|
||||
#include "i_sound.h" // closed captions
|
||||
#include "s_sound.h" // ditto
|
||||
#include "g_game.h" // ditto
|
||||
|
||||
|
||||
#if defined (USEASM) && !defined (NORUSEASM)//&& (!defined (_MSC_VER) || (_MSC_VER <= 1200))
|
||||
|
@ -437,3 +440,39 @@ void SCR_DisplayTicRate(void)
|
|||
|
||||
lasttic = ontic;
|
||||
}
|
||||
|
||||
void SCR_ClosedCaptions(void)
|
||||
{
|
||||
UINT8 i;
|
||||
|
||||
for (i = 0; i < NUMCAPTIONS; i++)
|
||||
{
|
||||
INT32 flags, y;
|
||||
char dot;
|
||||
boolean music;
|
||||
|
||||
if (!closedcaptions[i].s)
|
||||
continue;
|
||||
|
||||
if ((music = (closedcaptions[i].s-S_sfx == sfx_None)) && (closedcaptions[i].t < flashingtics) && (closedcaptions[i].t & 1))
|
||||
continue;
|
||||
|
||||
flags = V_NOSCALESTART|V_ALLOWLOWERCASE;
|
||||
y = vid.height-((i + 2)*10*vid.dupy);
|
||||
dot = ' ';
|
||||
|
||||
if (closedcaptions[i].b)
|
||||
y -= (closedcaptions[i].b--)*vid.dupy;
|
||||
|
||||
if (closedcaptions[i].t < CAPTIONFADETICS)
|
||||
flags |= (((CAPTIONFADETICS-closedcaptions[i].t)/2)*V_10TRANS);
|
||||
|
||||
if (music)
|
||||
dot = '\x19';
|
||||
else if (closedcaptions[i].c && closedcaptions[i].c->origin)
|
||||
dot = '\x1E';
|
||||
|
||||
V_DrawRightAlignedString(vid.width-(20*vid.dupx), y,
|
||||
flags, va("%c [%s]", dot, (closedcaptions[i].s->caption[0] ? closedcaptions[i].s->caption : closedcaptions[i].s->name)));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -180,5 +180,6 @@ FUNCMATH boolean SCR_IsAspectCorrect(INT32 width, INT32 height);
|
|||
|
||||
// move out to main code for consistency
|
||||
void SCR_DisplayTicRate(void);
|
||||
void SCR_ClosedCaptions(void);
|
||||
#undef DNWH
|
||||
#endif //__SCREEN_H__
|
||||
|
|
|
@ -909,7 +909,7 @@ static inline boolean I_SkipFrame(void)
|
|||
case GS_LEVEL:
|
||||
if (!paused)
|
||||
return false;
|
||||
case GS_TIMEATTACK:
|
||||
//case GS_TIMEATTACK: -- sorry optimisation but now we have a cool level platter and that being laggardly looks terrible
|
||||
case GS_WAITINGPLAYERS:
|
||||
return skip; // Skip odd frames
|
||||
default:
|
||||
|
@ -928,6 +928,10 @@ void I_FinishUpdate(void)
|
|||
if (I_SkipFrame())
|
||||
return;
|
||||
|
||||
// draw captions if enabled
|
||||
if (cv_closedcaptioning.value)
|
||||
SCR_ClosedCaptions();
|
||||
|
||||
if (cv_ticrate.value)
|
||||
SCR_DisplayTicRate();
|
||||
|
||||
|
|
|
@ -1311,7 +1311,7 @@ static inline boolean I_SkipFrame(void)
|
|||
case GS_LEVEL:
|
||||
if (!paused)
|
||||
return false;
|
||||
case GS_TIMEATTACK:
|
||||
//case GS_TIMEATTACK: -- sorry optimisation but now we have a cool level platter and that being laggardly looks terrible
|
||||
case GS_WAITINGPLAYERS:
|
||||
return skip; // Skip odd frames
|
||||
default:
|
||||
|
@ -1341,6 +1341,10 @@ void I_FinishUpdate(void)
|
|||
if (I_SkipFrame())
|
||||
return;
|
||||
|
||||
// draw captions if enabled
|
||||
if (cv_closedcaptioning.value)
|
||||
SCR_ClosedCaptions();
|
||||
|
||||
if (cv_ticrate.value)
|
||||
SCR_DisplayTicRate();
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue