Merge branch 'master' into acz-fixes
This commit is contained in:
commit
77476d27e5
|
@ -196,6 +196,7 @@ typedef enum
|
||||||
SH_PITY = 1, // the world's most basic shield ever, given to players who suck at Match
|
SH_PITY = 1, // the world's most basic shield ever, given to players who suck at Match
|
||||||
SH_WHIRLWIND,
|
SH_WHIRLWIND,
|
||||||
SH_ARMAGEDDON,
|
SH_ARMAGEDDON,
|
||||||
|
SH_PINK, // PITY IN PINK!
|
||||||
|
|
||||||
// Normal shields that use flags
|
// Normal shields that use flags
|
||||||
SH_ATTRACT = SH_PITY|SH_PROTECTELECTRIC,
|
SH_ATTRACT = SH_PITY|SH_PROTECTELECTRIC,
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "p_local.h" // for var1 and var2, and some constants
|
#include "p_local.h" // for var1 and var2, and some constants
|
||||||
#include "p_setup.h"
|
#include "p_setup.h"
|
||||||
#include "r_data.h"
|
#include "r_data.h"
|
||||||
|
#include "r_draw.h"
|
||||||
#include "r_sky.h"
|
#include "r_sky.h"
|
||||||
#include "fastcmp.h"
|
#include "fastcmp.h"
|
||||||
#include "lua_script.h"
|
#include "lua_script.h"
|
||||||
|
@ -4666,6 +4667,11 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
|
|
||||||
// Boss 3
|
// Boss 3
|
||||||
"S_EGGMOBILE3_STND",
|
"S_EGGMOBILE3_STND",
|
||||||
|
"S_EGGMOBILE3_LAUGH1",
|
||||||
|
"S_EGGMOBILE3_LAUGH2",
|
||||||
|
"S_EGGMOBILE3_LAUGH3",
|
||||||
|
"S_EGGMOBILE3_LAUGH4",
|
||||||
|
"S_EGGMOBILE3_LAUGH5",
|
||||||
"S_EGGMOBILE3_ATK1",
|
"S_EGGMOBILE3_ATK1",
|
||||||
"S_EGGMOBILE3_ATK2",
|
"S_EGGMOBILE3_ATK2",
|
||||||
"S_EGGMOBILE3_ATK3A",
|
"S_EGGMOBILE3_ATK3A",
|
||||||
|
@ -4674,11 +4680,6 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_EGGMOBILE3_ATK3D",
|
"S_EGGMOBILE3_ATK3D",
|
||||||
"S_EGGMOBILE3_ATK4",
|
"S_EGGMOBILE3_ATK4",
|
||||||
"S_EGGMOBILE3_ATK5",
|
"S_EGGMOBILE3_ATK5",
|
||||||
"S_EGGMOBILE3_LAUGH1",
|
|
||||||
"S_EGGMOBILE3_LAUGH2",
|
|
||||||
"S_EGGMOBILE3_LAUGH3",
|
|
||||||
"S_EGGMOBILE3_LAUGH4",
|
|
||||||
"S_EGGMOBILE3_LAUGH5",
|
|
||||||
"S_EGGMOBILE3_LAUGH6",
|
"S_EGGMOBILE3_LAUGH6",
|
||||||
"S_EGGMOBILE3_LAUGH7",
|
"S_EGGMOBILE3_LAUGH7",
|
||||||
"S_EGGMOBILE3_LAUGH8",
|
"S_EGGMOBILE3_LAUGH8",
|
||||||
|
@ -4731,8 +4732,8 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_FAKEMOBILE_ATK3B",
|
"S_FAKEMOBILE_ATK3B",
|
||||||
"S_FAKEMOBILE_ATK3C",
|
"S_FAKEMOBILE_ATK3C",
|
||||||
"S_FAKEMOBILE_ATK3D",
|
"S_FAKEMOBILE_ATK3D",
|
||||||
"S_FAKEMOBILE_ATK4",
|
"S_FAKEMOBILE_DIE1",
|
||||||
"S_FAKEMOBILE_ATK5",
|
"S_FAKEMOBILE_DIE2",
|
||||||
|
|
||||||
// Boss 4
|
// Boss 4
|
||||||
"S_EGGMOBILE4_STND",
|
"S_EGGMOBILE4_STND",
|
||||||
|
@ -4750,15 +4751,8 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_EGGMOBILE4_RATK6",
|
"S_EGGMOBILE4_RATK6",
|
||||||
"S_EGGMOBILE4_RAISE1",
|
"S_EGGMOBILE4_RAISE1",
|
||||||
"S_EGGMOBILE4_RAISE2",
|
"S_EGGMOBILE4_RAISE2",
|
||||||
"S_EGGMOBILE4_RAISE3",
|
"S_EGGMOBILE4_PAIN1",
|
||||||
"S_EGGMOBILE4_RAISE4",
|
"S_EGGMOBILE4_PAIN2",
|
||||||
"S_EGGMOBILE4_RAISE5",
|
|
||||||
"S_EGGMOBILE4_RAISE6",
|
|
||||||
"S_EGGMOBILE4_RAISE7",
|
|
||||||
"S_EGGMOBILE4_RAISE8",
|
|
||||||
"S_EGGMOBILE4_RAISE9",
|
|
||||||
"S_EGGMOBILE4_RAISE10",
|
|
||||||
"S_EGGMOBILE4_PAIN",
|
|
||||||
"S_EGGMOBILE4_DIE1",
|
"S_EGGMOBILE4_DIE1",
|
||||||
"S_EGGMOBILE4_DIE2",
|
"S_EGGMOBILE4_DIE2",
|
||||||
"S_EGGMOBILE4_DIE3",
|
"S_EGGMOBILE4_DIE3",
|
||||||
|
@ -4776,10 +4770,21 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_EGGMOBILE4_FLEE1",
|
"S_EGGMOBILE4_FLEE1",
|
||||||
"S_EGGMOBILE4_FLEE2",
|
"S_EGGMOBILE4_FLEE2",
|
||||||
"S_EGGMOBILE4_MACE",
|
"S_EGGMOBILE4_MACE",
|
||||||
|
"S_EGGMOBILE4_MACE_DIE1",
|
||||||
|
"S_EGGMOBILE4_MACE_DIE2",
|
||||||
|
"S_EGGMOBILE4_MACE_DIE3",
|
||||||
|
|
||||||
// Boss 4 jet flame
|
// Boss 4 jet flame
|
||||||
"S_JETFLAME1",
|
"S_JETFLAME",
|
||||||
"S_JETFLAME2",
|
|
||||||
|
// Boss 4 Spectator Eggrobo
|
||||||
|
"S_EGGROBO1_IDLE",
|
||||||
|
"S_EGGROBO1_BSLAP1",
|
||||||
|
"S_EGGROBO2_BSLAP2",
|
||||||
|
"S_EGGROBO1_PISSED",
|
||||||
|
|
||||||
|
// Boss 4 Spectator Eggrobo jet flame
|
||||||
|
"S_EGGROBOJET",
|
||||||
|
|
||||||
// Boss 5
|
// Boss 5
|
||||||
"S_FANG_IDLE1",
|
"S_FANG_IDLE1",
|
||||||
|
@ -5132,7 +5137,10 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_METALSONIC_BADBOUNCE",
|
"S_METALSONIC_BADBOUNCE",
|
||||||
"S_METALSONIC_SHOOT",
|
"S_METALSONIC_SHOOT",
|
||||||
"S_METALSONIC_PAIN",
|
"S_METALSONIC_PAIN",
|
||||||
"S_METALSONIC_DEATH",
|
"S_METALSONIC_DEATH1",
|
||||||
|
"S_METALSONIC_DEATH2",
|
||||||
|
"S_METALSONIC_DEATH3",
|
||||||
|
"S_METALSONIC_DEATH4",
|
||||||
"S_METALSONIC_FLEE1",
|
"S_METALSONIC_FLEE1",
|
||||||
"S_METALSONIC_FLEE2",
|
"S_METALSONIC_FLEE2",
|
||||||
"S_METALSONIC_FLEE3",
|
"S_METALSONIC_FLEE3",
|
||||||
|
@ -6170,6 +6178,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_PITY4",
|
"S_PITY4",
|
||||||
"S_PITY5",
|
"S_PITY5",
|
||||||
"S_PITY6",
|
"S_PITY6",
|
||||||
|
"S_PITY7",
|
||||||
|
"S_PITY8",
|
||||||
|
"S_PITY9",
|
||||||
|
"S_PITY10",
|
||||||
|
"S_PITY11",
|
||||||
|
"S_PITY12",
|
||||||
|
|
||||||
"S_FIRS1",
|
"S_FIRS1",
|
||||||
"S_FIRS2",
|
"S_FIRS2",
|
||||||
|
@ -6654,6 +6668,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
|
|
||||||
"S_LOCKON1",
|
"S_LOCKON1",
|
||||||
"S_LOCKON2",
|
"S_LOCKON2",
|
||||||
|
"S_LOCKON3",
|
||||||
|
"S_LOCKON4",
|
||||||
|
"S_LOCKONINF1",
|
||||||
|
"S_LOCKONINF2",
|
||||||
|
"S_LOCKONINF3",
|
||||||
|
"S_LOCKONINF4",
|
||||||
|
|
||||||
// Tag Sign
|
// Tag Sign
|
||||||
"S_TTAG",
|
"S_TTAG",
|
||||||
|
@ -6662,6 +6682,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_GOTFLAG",
|
"S_GOTFLAG",
|
||||||
|
|
||||||
"S_CORK",
|
"S_CORK",
|
||||||
|
"S_LHRT",
|
||||||
|
|
||||||
// Red Ring
|
// Red Ring
|
||||||
"S_RRNG1",
|
"S_RRNG1",
|
||||||
|
@ -7167,6 +7188,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_ROCKCRUMBLEN",
|
"S_ROCKCRUMBLEN",
|
||||||
"S_ROCKCRUMBLEO",
|
"S_ROCKCRUMBLEO",
|
||||||
"S_ROCKCRUMBLEP",
|
"S_ROCKCRUMBLEP",
|
||||||
|
"S_BRICKDEBRIS",
|
||||||
|
|
||||||
#ifdef SEENAMES
|
#ifdef SEENAMES
|
||||||
"S_NAMECHECK",
|
"S_NAMECHECK",
|
||||||
|
@ -7251,11 +7273,14 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_EGGMOBILE3",
|
"MT_EGGMOBILE3",
|
||||||
"MT_PROPELLER",
|
"MT_PROPELLER",
|
||||||
"MT_FAKEMOBILE",
|
"MT_FAKEMOBILE",
|
||||||
|
"MT_SHOCK",
|
||||||
|
|
||||||
// Boss 4
|
// Boss 4
|
||||||
"MT_EGGMOBILE4",
|
"MT_EGGMOBILE4",
|
||||||
"MT_EGGMOBILE4_MACE",
|
"MT_EGGMOBILE4_MACE",
|
||||||
"MT_JETFLAME",
|
"MT_JETFLAME",
|
||||||
|
"MT_EGGROBO1",
|
||||||
|
"MT_EGGROBO1JET",
|
||||||
|
|
||||||
// Boss 5
|
// Boss 5
|
||||||
"MT_FANG",
|
"MT_FANG",
|
||||||
|
@ -7732,6 +7757,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_DROWNNUMBERS", // Drowning Timer
|
"MT_DROWNNUMBERS", // Drowning Timer
|
||||||
"MT_GOTEMERALD", // Chaos Emerald (intangible)
|
"MT_GOTEMERALD", // Chaos Emerald (intangible)
|
||||||
"MT_LOCKON", // Target
|
"MT_LOCKON", // Target
|
||||||
|
"MT_LOCKONINF", // In-level Target
|
||||||
"MT_TAG", // Tag Sign
|
"MT_TAG", // Tag Sign
|
||||||
"MT_GOTFLAG", // Got Flag sign
|
"MT_GOTFLAG", // Got Flag sign
|
||||||
|
|
||||||
|
@ -7749,6 +7775,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_MACHINEAMBIENCE",
|
"MT_MACHINEAMBIENCE",
|
||||||
|
|
||||||
"MT_CORK",
|
"MT_CORK",
|
||||||
|
"MT_LHRT",
|
||||||
|
|
||||||
// Ring Weapons
|
// Ring Weapons
|
||||||
"MT_REDRING",
|
"MT_REDRING",
|
||||||
|
@ -7881,6 +7908,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_ROCKCRUMBLE14",
|
"MT_ROCKCRUMBLE14",
|
||||||
"MT_ROCKCRUMBLE15",
|
"MT_ROCKCRUMBLE15",
|
||||||
"MT_ROCKCRUMBLE16",
|
"MT_ROCKCRUMBLE16",
|
||||||
|
"MT_BRICKDEBRIS",
|
||||||
|
|
||||||
#ifdef SEENAMES
|
#ifdef SEENAMES
|
||||||
"MT_NAMECHECK",
|
"MT_NAMECHECK",
|
||||||
|
@ -8521,6 +8549,7 @@ struct {
|
||||||
{"SH_PITY",SH_PITY},
|
{"SH_PITY",SH_PITY},
|
||||||
{"SH_WHIRLWIND",SH_WHIRLWIND},
|
{"SH_WHIRLWIND",SH_WHIRLWIND},
|
||||||
{"SH_ARMAGEDDON",SH_ARMAGEDDON},
|
{"SH_ARMAGEDDON",SH_ARMAGEDDON},
|
||||||
|
{"SH_PINK",SH_PINK},
|
||||||
// normal shields that use flags
|
// normal shields that use flags
|
||||||
{"SH_ATTRACT",SH_ATTRACT},
|
{"SH_ATTRACT",SH_ATTRACT},
|
||||||
{"SH_ELEMENTAL",SH_ELEMENTAL},
|
{"SH_ELEMENTAL",SH_ELEMENTAL},
|
||||||
|
@ -8909,6 +8938,14 @@ struct {
|
||||||
{"KR_TIMEOUT",KR_TIMEOUT},
|
{"KR_TIMEOUT",KR_TIMEOUT},
|
||||||
{"KR_BAN",KR_BAN},
|
{"KR_BAN",KR_BAN},
|
||||||
{"KR_LEAVE",KR_LEAVE},
|
{"KR_LEAVE",KR_LEAVE},
|
||||||
|
|
||||||
|
// translation colormaps
|
||||||
|
{"TC_DEFAULT",TC_DEFAULT},
|
||||||
|
{"TC_BOSS",TC_BOSS},
|
||||||
|
{"TC_METALSONIC",TC_METALSONIC},
|
||||||
|
{"TC_ALLWHITE",TC_ALLWHITE},
|
||||||
|
{"TC_RAINBOW",TC_RAINBOW},
|
||||||
|
{"TC_BLINK",TC_BLINK},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
{NULL,0}
|
{NULL,0}
|
||||||
|
@ -9573,11 +9610,6 @@ static inline int lib_getenum(lua_State *L)
|
||||||
lua_pushinteger(L, ((lua_Integer)1<<i));
|
lua_pushinteger(L, ((lua_Integer)1<<i));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (fastcmp(p, "NETONLY"))
|
|
||||||
{
|
|
||||||
lua_pushinteger(L, (lua_Integer)ML_NETONLY);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (mathlib) return luaL_error(L, "linedef flag '%s' could not be found.\n", word);
|
if (mathlib) return luaL_error(L, "linedef flag '%s' could not be found.\n", word);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,11 +130,9 @@ typedef struct
|
||||||
#define ML_EFFECT4 512
|
#define ML_EFFECT4 512
|
||||||
#define ML_EFFECT5 1024
|
#define ML_EFFECT5 1024
|
||||||
|
|
||||||
// New ones to disable lines for characters
|
#define ML_NETONLY 2048 // Apply effect only in netgames
|
||||||
#define ML_NOSONIC 2048
|
#define ML_NONET 4096 // Apply effect only in single player games
|
||||||
#define ML_NOTAILS 4096
|
#define ML_EFFECT6 8192
|
||||||
#define ML_NOKNUX 8192
|
|
||||||
#define ML_NETONLY 14336 // all of the above
|
|
||||||
|
|
||||||
// Bounce off walls!
|
// Bounce off walls!
|
||||||
#define ML_BOUNCY 16384
|
#define ML_BOUNCY 16384
|
||||||
|
|
|
@ -384,7 +384,7 @@ enum {
|
||||||
LE_PINCHPHASE = -2, // A boss entered pinch phase (and, in most cases, is preparing their pinch phase attack!)
|
LE_PINCHPHASE = -2, // A boss entered pinch phase (and, in most cases, is preparing their pinch phase attack!)
|
||||||
LE_ALLBOSSESDEAD = -3, // All bosses in the map are dead (Egg capsule raise)
|
LE_ALLBOSSESDEAD = -3, // All bosses in the map are dead (Egg capsule raise)
|
||||||
LE_BOSSDEAD = -4, // A boss in the map died (Chaos mode boss tally)
|
LE_BOSSDEAD = -4, // A boss in the map died (Chaos mode boss tally)
|
||||||
LE_BOSS4DROP = -5, // CEZ boss dropped its cage
|
LE_BOSS4DROP = -5, // CEZ boss dropped its cage (also subtract the number of hitpoints it's lost)
|
||||||
LE_BRAKVILEATACK = -6, // Brak's doing his LOS attack, oh noes
|
LE_BRAKVILEATACK = -6, // Brak's doing his LOS attack, oh noes
|
||||||
LE_TURRET = 32000, // THZ turret
|
LE_TURRET = 32000, // THZ turret
|
||||||
LE_BRAKPLATFORM = 4200, // v2.0 Black Eggman destroys platform
|
LE_BRAKPLATFORM = 4200, // v2.0 Black Eggman destroys platform
|
||||||
|
|
|
@ -1022,6 +1022,7 @@ static const char *credits[] = {
|
||||||
"",
|
"",
|
||||||
"\1Boss Design",
|
"\1Boss Design",
|
||||||
"Ben \"Mystic\" Geyer",
|
"Ben \"Mystic\" Geyer",
|
||||||
|
"Vivian \"toaster\" Grannell",
|
||||||
"Thomas \"Shadow Hog\" Igoe",
|
"Thomas \"Shadow Hog\" Igoe",
|
||||||
"John \"JTE\" Muniz",
|
"John \"JTE\" Muniz",
|
||||||
"Samuel \"Prime 2.0\" Peters",
|
"Samuel \"Prime 2.0\" Peters",
|
||||||
|
|
|
@ -202,6 +202,7 @@ light_t *t_lspr[NUMSPRITES] =
|
||||||
// Boss 4 (Castle Eggman)
|
// Boss 4 (Castle Eggman)
|
||||||
&lspr[NOLIGHT], // SPR_EGGP
|
&lspr[NOLIGHT], // SPR_EGGP
|
||||||
&lspr[REDBALL_L], // SPR_EFIR
|
&lspr[REDBALL_L], // SPR_EFIR
|
||||||
|
&lspr[NOLIGHT], // SPR_EGR1
|
||||||
|
|
||||||
// Boss 5 (Arid Canyon)
|
// Boss 5 (Arid Canyon)
|
||||||
&lspr[NOLIGHT], //SPR_FANG // replaces EGGQ
|
&lspr[NOLIGHT], //SPR_FANG // replaces EGGQ
|
||||||
|
@ -487,6 +488,7 @@ light_t *t_lspr[NUMSPRITES] =
|
||||||
&lspr[NOLIGHT], // SPR_GFLG
|
&lspr[NOLIGHT], // SPR_GFLG
|
||||||
|
|
||||||
&lspr[NOLIGHT], // SPR_CORK
|
&lspr[NOLIGHT], // SPR_CORK
|
||||||
|
&lspr[NOLIGHT], // SPR_LHRT
|
||||||
|
|
||||||
// Ring Weapons
|
// Ring Weapons
|
||||||
&lspr[RINGLIGHT_L], // SPR_RRNG
|
&lspr[RINGLIGHT_L], // SPR_RRNG
|
||||||
|
@ -580,6 +582,9 @@ light_t *t_lspr[NUMSPRITES] =
|
||||||
&lspr[NOLIGHT], // SPR_ROIO
|
&lspr[NOLIGHT], // SPR_ROIO
|
||||||
&lspr[NOLIGHT], // SPR_ROIP
|
&lspr[NOLIGHT], // SPR_ROIP
|
||||||
|
|
||||||
|
// Bricks
|
||||||
|
&lspr[NOLIGHT], // SPR_BRIC
|
||||||
|
|
||||||
// Gravity Well Objects
|
// Gravity Well Objects
|
||||||
&lspr[NOLIGHT], // SPR_GWLG
|
&lspr[NOLIGHT], // SPR_GWLG
|
||||||
&lspr[NOLIGHT], // SPR_GWLR
|
&lspr[NOLIGHT], // SPR_GWLR
|
||||||
|
|
|
@ -580,7 +580,7 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is
|
||||||
if (nrPlaneVerts < 3) //not even a triangle ?
|
if (nrPlaneVerts < 3) //not even a triangle ?
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (nrPlaneVerts > UINT16_MAX) // FIXME: exceeds plVerts size
|
if (nrPlaneVerts > (INT32)UINT16_MAX) // FIXME: exceeds plVerts size
|
||||||
{
|
{
|
||||||
CONS_Debug(DBG_RENDER, "polygon size of %d exceeds max value of %d vertices\n", nrPlaneVerts, UINT16_MAX);
|
CONS_Debug(DBG_RENDER, "polygon size of %d exceeds max value of %d vertices\n", nrPlaneVerts, UINT16_MAX);
|
||||||
return;
|
return;
|
||||||
|
@ -3190,7 +3190,7 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling,
|
||||||
if (nrPlaneVerts < 3) //not even a triangle ?
|
if (nrPlaneVerts < 3) //not even a triangle ?
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (nrPlaneVerts > UINT16_MAX) // FIXME: exceeds plVerts size
|
if (nrPlaneVerts > (size_t)UINT16_MAX) // FIXME: exceeds plVerts size
|
||||||
{
|
{
|
||||||
CONS_Debug(DBG_RENDER, "polygon size of %s exceeds max value of %d vertices\n", sizeu1(nrPlaneVerts), UINT16_MAX);
|
CONS_Debug(DBG_RENDER, "polygon size of %s exceeds max value of %d vertices\n", sizeu1(nrPlaneVerts), UINT16_MAX);
|
||||||
return;
|
return;
|
||||||
|
@ -5660,9 +5660,9 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||||
vis->z2 = z2;
|
vis->z2 = z2;
|
||||||
|
|
||||||
//Hurdler: 25/04/2000: now support colormap in hardware mode
|
//Hurdler: 25/04/2000: now support colormap in hardware mode
|
||||||
if ((vis->mobj->flags & MF_BOSS) && (vis->mobj->flags2 & MF2_FRET) && (leveltime & 1)) // Bosses "flash"
|
if ((vis->mobj->flags & MF_BOSS) && (vis->mobj->flags2 & MF2_FRET) && !(vis->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
|
||||||
{
|
{
|
||||||
if (vis->mobj->type == MT_CYBRAKDEMON)
|
if (vis->mobj->type == MT_CYBRAKDEMON || vis->mobj->colorized)
|
||||||
vis->colormap = R_GetTranslationColormap(TC_ALLWHITE, 0, GTC_CACHE);
|
vis->colormap = R_GetTranslationColormap(TC_ALLWHITE, 0, GTC_CACHE);
|
||||||
else if (vis->mobj->type == MT_METALSONIC_BATTLE)
|
else if (vis->mobj->type == MT_METALSONIC_BATTLE)
|
||||||
vis->colormap = R_GetTranslationColormap(TC_METALSONIC, 0, GTC_CACHE);
|
vis->colormap = R_GetTranslationColormap(TC_METALSONIC, 0, GTC_CACHE);
|
||||||
|
@ -5672,7 +5672,9 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||||
else if (thing->color)
|
else if (thing->color)
|
||||||
{
|
{
|
||||||
// New colormap stuff for skins Tails 06-07-2002
|
// New colormap stuff for skins Tails 06-07-2002
|
||||||
if (thing->skin && thing->sprite == SPR_PLAY) // This thing is a player!
|
if (thing->colorized)
|
||||||
|
vis->colormap = R_GetTranslationColormap(TC_RAINBOW, thing->color, GTC_CACHE);
|
||||||
|
else if (thing->skin && thing->sprite == SPR_PLAY) // This thing is a player!
|
||||||
{
|
{
|
||||||
size_t skinnum = (skin_t*)thing->skin-skins;
|
size_t skinnum = (skin_t*)thing->skin-skins;
|
||||||
vis->colormap = R_GetTranslationColormap((INT32)skinnum, thing->color, GTC_CACHE);
|
vis->colormap = R_GetTranslationColormap((INT32)skinnum, thing->color, GTC_CACHE);
|
||||||
|
|
|
@ -40,6 +40,8 @@
|
||||||
#include "../w_wad.h"
|
#include "../w_wad.h"
|
||||||
#include "../z_zone.h"
|
#include "../z_zone.h"
|
||||||
#include "../r_things.h"
|
#include "../r_things.h"
|
||||||
|
#include "../r_draw.h"
|
||||||
|
#include "../p_tick.h"
|
||||||
|
|
||||||
#include "hw_main.h"
|
#include "hw_main.h"
|
||||||
#include "../v_video.h"
|
#include "../v_video.h"
|
||||||
|
@ -978,8 +980,18 @@ spritemd2found:
|
||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, GLMipmap_t *grmip, skincolors_t color)
|
// Define for getting accurate color brightness readings according to how the human eye sees them.
|
||||||
|
// https://en.wikipedia.org/wiki/Relative_luminance
|
||||||
|
// 0.2126 to red
|
||||||
|
// 0.7152 to green
|
||||||
|
// 0.0722 to blue
|
||||||
|
// (See this same define in k_kart.c!)
|
||||||
|
#define SETBRIGHTNESS(brightness,r,g,b) \
|
||||||
|
brightness = (UINT8)(((1063*((UINT16)r)/5000) + (3576*((UINT16)g)/5000) + (361*((UINT16)b)/5000)) / 3)
|
||||||
|
|
||||||
|
static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, GLMipmap_t *grmip, INT32 skinnum, skincolors_t color)
|
||||||
{
|
{
|
||||||
|
UINT8 i;
|
||||||
UINT16 w = gpatch->width, h = gpatch->height;
|
UINT16 w = gpatch->width, h = gpatch->height;
|
||||||
UINT32 size = w*h;
|
UINT32 size = w*h;
|
||||||
RGBA_t *image, *blendimage, *cur, blendcolor;
|
RGBA_t *image, *blendimage, *cur, blendcolor;
|
||||||
|
@ -1005,50 +1017,112 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
||||||
image = gpatch->mipmap.grInfo.data;
|
image = gpatch->mipmap.grInfo.data;
|
||||||
blendimage = blendgpatch->mipmap.grInfo.data;
|
blendimage = blendgpatch->mipmap.grInfo.data;
|
||||||
|
|
||||||
|
// Average all of the translation's colors
|
||||||
if (color == SKINCOLOR_NONE || color >= MAXTRANSLATIONS)
|
if (color == SKINCOLOR_NONE || color >= MAXTRANSLATIONS)
|
||||||
blendcolor = V_GetColor(0xff);
|
blendcolor = V_GetColor(0xff);
|
||||||
else
|
else
|
||||||
blendcolor = V_GetColor(Color_Index[color-1][4]);
|
|
||||||
|
|
||||||
while (size--)
|
|
||||||
{
|
{
|
||||||
if (blendimage->s.alpha == 0)
|
const UINT8 div = 6;
|
||||||
{
|
const UINT8 start = 4;
|
||||||
// Don't bother with blending the pixel if the alpha of the blend pixel is 0
|
UINT32 r, g, b;
|
||||||
cur->rgba = image->rgba;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
INT32 tempcolor;
|
|
||||||
INT16 tempmult, tempalpha;
|
|
||||||
tempalpha = -(abs(blendimage->s.red-127)-127)*2;
|
|
||||||
if (tempalpha > 255)
|
|
||||||
tempalpha = 255;
|
|
||||||
else if (tempalpha < 0)
|
|
||||||
tempalpha = 0;
|
|
||||||
|
|
||||||
tempmult = (blendimage->s.red-127)*2;
|
blendcolor = V_GetColor(Color_Index[color-1][start]);
|
||||||
if (tempmult > 255)
|
r = (UINT32)(blendcolor.s.red*blendcolor.s.red);
|
||||||
tempmult = 255;
|
g = (UINT32)(blendcolor.s.green*blendcolor.s.green);
|
||||||
else if (tempmult < 0)
|
b = (UINT32)(blendcolor.s.blue*blendcolor.s.blue);
|
||||||
tempmult = 0;
|
|
||||||
|
|
||||||
tempcolor = (image->s.red*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.red)/255)) * blendimage->s.alpha)/255;
|
for (i = 1; i < div; i++)
|
||||||
cur->s.red = (UINT8)tempcolor;
|
{
|
||||||
tempcolor = (image->s.green*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.green)/255)) * blendimage->s.alpha)/255;
|
RGBA_t nextcolor = V_GetColor(Color_Index[color-1][start+i]);
|
||||||
cur->s.green = (UINT8)tempcolor;
|
r += (UINT32)(nextcolor.s.red*nextcolor.s.red);
|
||||||
tempcolor = (image->s.blue*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.blue)/255)) * blendimage->s.alpha)/255;
|
g += (UINT32)(nextcolor.s.green*nextcolor.s.green);
|
||||||
cur->s.blue = (UINT8)tempcolor;
|
b += (UINT32)(nextcolor.s.blue*nextcolor.s.blue);
|
||||||
cur->s.alpha = image->s.alpha;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cur++; image++; blendimage++;
|
blendcolor.s.red = (UINT8)(FixedSqrt((r/div)<<FRACBITS)>>FRACBITS);
|
||||||
|
blendcolor.s.green = (UINT8)(FixedSqrt((g/div)<<FRACBITS)>>FRACBITS);
|
||||||
|
blendcolor.s.blue = (UINT8)(FixedSqrt((b/div)<<FRACBITS)>>FRACBITS);
|
||||||
|
}
|
||||||
|
|
||||||
|
// rainbow support, could theoretically support boss ones too
|
||||||
|
if (skinnum == TC_RAINBOW)
|
||||||
|
{
|
||||||
|
while (size--)
|
||||||
|
{
|
||||||
|
if (image->s.alpha == 0 && blendimage->s.alpha == 0)
|
||||||
|
{
|
||||||
|
// Don't bother with blending the pixel if the alpha of the blend pixel is 0
|
||||||
|
cur->rgba = image->rgba;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UINT32 tempcolor;
|
||||||
|
UINT16 imagebright, blendbright, finalbright, colorbright;
|
||||||
|
SETBRIGHTNESS(imagebright,image->s.red,image->s.green,image->s.blue);
|
||||||
|
SETBRIGHTNESS(blendbright,blendimage->s.red,blendimage->s.green,blendimage->s.blue);
|
||||||
|
// slightly dumb average between the blend image color and base image colour, usually one or the other will be fully opaque anyway
|
||||||
|
finalbright = (imagebright*(255-blendimage->s.alpha))/255 + (blendbright*blendimage->s.alpha)/255;
|
||||||
|
SETBRIGHTNESS(colorbright,blendcolor.s.red,blendcolor.s.green,blendcolor.s.blue);
|
||||||
|
|
||||||
|
tempcolor = (finalbright*blendcolor.s.red)/colorbright;
|
||||||
|
tempcolor = min(255, tempcolor);
|
||||||
|
cur->s.red = (UINT8)tempcolor;
|
||||||
|
tempcolor = (finalbright*blendcolor.s.green)/colorbright;
|
||||||
|
tempcolor = min(255, tempcolor);
|
||||||
|
cur->s.green = (UINT8)tempcolor;
|
||||||
|
tempcolor = (finalbright*blendcolor.s.blue)/colorbright;
|
||||||
|
tempcolor = min(255, tempcolor);
|
||||||
|
cur->s.blue = (UINT8)tempcolor;
|
||||||
|
cur->s.alpha = image->s.alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
cur++; image++; blendimage++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (size--)
|
||||||
|
{
|
||||||
|
if (blendimage->s.alpha == 0)
|
||||||
|
{
|
||||||
|
// Don't bother with blending the pixel if the alpha of the blend pixel is 0
|
||||||
|
cur->rgba = image->rgba;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
INT32 tempcolor;
|
||||||
|
INT16 tempmult, tempalpha;
|
||||||
|
tempalpha = -(abs(blendimage->s.red-127)-127)*2;
|
||||||
|
if (tempalpha > 255)
|
||||||
|
tempalpha = 255;
|
||||||
|
else if (tempalpha < 0)
|
||||||
|
tempalpha = 0;
|
||||||
|
|
||||||
|
tempmult = (blendimage->s.red-127)*2;
|
||||||
|
if (tempmult > 255)
|
||||||
|
tempmult = 255;
|
||||||
|
else if (tempmult < 0)
|
||||||
|
tempmult = 0;
|
||||||
|
|
||||||
|
tempcolor = (image->s.red*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.red)/255)) * blendimage->s.alpha)/255;
|
||||||
|
cur->s.red = (UINT8)tempcolor;
|
||||||
|
tempcolor = (image->s.green*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.green)/255)) * blendimage->s.alpha)/255;
|
||||||
|
cur->s.green = (UINT8)tempcolor;
|
||||||
|
tempcolor = (image->s.blue*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.blue)/255)) * blendimage->s.alpha)/255;
|
||||||
|
cur->s.blue = (UINT8)tempcolor;
|
||||||
|
cur->s.alpha = image->s.alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
cur++; image++; blendimage++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, const UINT8 *colormap, skincolors_t color)
|
#undef SETBRIGHTNESS
|
||||||
|
|
||||||
|
static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, INT32 skinnum, const UINT8 *colormap, skincolors_t color)
|
||||||
{
|
{
|
||||||
// mostly copied from HWR_GetMappedPatch, hence the similarities and comment
|
// mostly copied from HWR_GetMappedPatch, hence the similarities and comment
|
||||||
GLMipmap_t *grmip, *newmip;
|
GLMipmap_t *grmip, *newmip;
|
||||||
|
@ -1089,13 +1163,14 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, con
|
||||||
grmip->nextcolormap = newmip;
|
grmip->nextcolormap = newmip;
|
||||||
newmip->colormap = colormap;
|
newmip->colormap = colormap;
|
||||||
|
|
||||||
HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, color);
|
HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, skinnum, color);
|
||||||
|
|
||||||
HWD.pfnSetTexture(newmip);
|
HWD.pfnSetTexture(newmip);
|
||||||
Z_ChangeTag(newmip->grInfo.data, PU_HWRCACHE_UNLOCKED);
|
Z_ChangeTag(newmip->grInfo.data, PU_HWRCACHE_UNLOCKED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------+
|
// -----------------+
|
||||||
// HWR_DrawMD2 : Draw MD2
|
// HWR_DrawMD2 : Draw MD2
|
||||||
// : (monsters, bonuses, weapons, lights, ...)
|
// : (monsters, bonuses, weapons, lights, ...)
|
||||||
|
@ -1285,7 +1360,30 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
|
||||||
md2->blendgrpatch && ((GLPatch_t *)md2->blendgrpatch)->mipmap.grInfo.format
|
md2->blendgrpatch && ((GLPatch_t *)md2->blendgrpatch)->mipmap.grInfo.format
|
||||||
&& gpatch->width == ((GLPatch_t *)md2->blendgrpatch)->width && gpatch->height == ((GLPatch_t *)md2->blendgrpatch)->height)
|
&& gpatch->width == ((GLPatch_t *)md2->blendgrpatch)->width && gpatch->height == ((GLPatch_t *)md2->blendgrpatch)->height)
|
||||||
{
|
{
|
||||||
HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, spr->colormap, (skincolors_t)spr->mobj->color);
|
INT32 skinnum = TC_DEFAULT;
|
||||||
|
if ((spr->mobj->flags & (MF_ENEMY|MF_BOSS)) && (spr->mobj->flags2 & MF2_FRET) && !(spr->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
|
||||||
|
{
|
||||||
|
if (spr->mobj->type == MT_CYBRAKDEMON || spr->mobj->colorized)
|
||||||
|
skinnum = TC_ALLWHITE;
|
||||||
|
else if (spr->mobj->type == MT_METALSONIC_BATTLE)
|
||||||
|
skinnum = TC_METALSONIC;
|
||||||
|
else
|
||||||
|
skinnum = TC_BOSS;
|
||||||
|
}
|
||||||
|
else if (spr->mobj->color)
|
||||||
|
{
|
||||||
|
if (spr->mobj->skin && spr->mobj->sprite == SPR_PLAY)
|
||||||
|
{
|
||||||
|
if (spr->mobj->colorized)
|
||||||
|
skinnum = TC_RAINBOW;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
skinnum = (INT32)((skin_t*)spr->mobj->skin-skins);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else skinnum = TC_DEFAULT;
|
||||||
|
}
|
||||||
|
HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, skinnum, spr->colormap, (skincolors_t)spr->mobj->color);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
308
src/info.c
308
src/info.c
|
@ -90,6 +90,7 @@ char sprnames[NUMSPRITES + 1][5] =
|
||||||
// Boss 4 (Castle Eggman)
|
// Boss 4 (Castle Eggman)
|
||||||
"EGGP",
|
"EGGP",
|
||||||
"EFIR", // Boss 4 jet flame
|
"EFIR", // Boss 4 jet flame
|
||||||
|
"EGR1", // Boss 4 Spectator Eggrobo
|
||||||
|
|
||||||
// Boss 5 (Arid Canyon)
|
// Boss 5 (Arid Canyon)
|
||||||
"FANG", // replaces EGGQ
|
"FANG", // replaces EGGQ
|
||||||
|
@ -382,6 +383,7 @@ char sprnames[NUMSPRITES + 1][5] =
|
||||||
"GFLG", // Got Flag sign
|
"GFLG", // Got Flag sign
|
||||||
|
|
||||||
"CORK",
|
"CORK",
|
||||||
|
"LHRT",
|
||||||
|
|
||||||
// Ring Weapons
|
// Ring Weapons
|
||||||
"RRNG", // Red Ring
|
"RRNG", // Red Ring
|
||||||
|
@ -475,6 +477,9 @@ char sprnames[NUMSPRITES + 1][5] =
|
||||||
"ROIO",
|
"ROIO",
|
||||||
"ROIP",
|
"ROIP",
|
||||||
|
|
||||||
|
// Bricks
|
||||||
|
"BRIC",
|
||||||
|
|
||||||
// Gravity Well Objects
|
// Gravity Well Objects
|
||||||
"GWLG",
|
"GWLG",
|
||||||
"GWLR",
|
"GWLR",
|
||||||
|
@ -742,10 +747,10 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_PLAY, SPR2_FIRE, 15, {NULL}, S_PLAY_STND, 0, S_PLAY_STND}, // S_PLAY_FIRE_FINISH
|
{SPR_PLAY, SPR2_FIRE, 15, {NULL}, S_PLAY_STND, 0, S_PLAY_STND}, // S_PLAY_FIRE_FINISH
|
||||||
|
|
||||||
// CA_TWINSPIN
|
// CA_TWINSPIN
|
||||||
{SPR_PLAY, SPR2_TWIN|FF_SPR2ENDSTATE, 1, {NULL}, S_PLAY_JUMP, 0, S_PLAY_TWINSPIN}, // S_PLAY_TWINSPIN
|
{SPR_PLAY, SPR2_TWIN|FF_SPR2ENDSTATE, 2, {NULL}, S_PLAY_JUMP, 0, S_PLAY_TWINSPIN}, // S_PLAY_TWINSPIN
|
||||||
|
|
||||||
// CA2_MELEE
|
// 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|FF_SPR2ENDSTATE, 2, {NULL}, S_PLAY_MELEE_FINISH, 0, S_PLAY_MELEE}, // S_PLAY_MELEE
|
||||||
{SPR_PLAY, SPR2_MLEE, 70, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_MELEE_FINISH
|
{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
|
{SPR_PLAY, SPR2_MLEL, 35, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_MELEE_LANDING
|
||||||
|
|
||||||
|
@ -1268,6 +1273,11 @@ state_t states[NUMSTATES] =
|
||||||
|
|
||||||
// Boss 3
|
// Boss 3
|
||||||
{SPR_EGGO, 0, 1, {NULL}, 0, 0, S_EGGMOBILE3_STND}, // S_EGGMOBILE3_STND
|
{SPR_EGGO, 0, 1, {NULL}, 0, 0, S_EGGMOBILE3_STND}, // S_EGGMOBILE3_STND
|
||||||
|
{SPR_EGGO, 6, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH2}, // S_EGGMOBILE3_LAUGH1
|
||||||
|
{SPR_EGGO, 7, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH3}, // S_EGGMOBILE3_LAUGH2
|
||||||
|
{SPR_EGGO, 6, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH4}, // S_EGGMOBILE3_LAUGH3
|
||||||
|
{SPR_EGGO, 7, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH5}, // S_EGGMOBILE3_LAUGH4
|
||||||
|
{SPR_EGGO, 6, 4, {NULL}, 0, 0, S_EGGMOBILE3_ATK1}, // S_EGGMOBILE3_LAUGH5
|
||||||
{SPR_EGGO, 1, 2, {NULL}, 0, 0, S_EGGMOBILE3_ATK2}, // S_EGGMOBILE3_ATK1
|
{SPR_EGGO, 1, 2, {NULL}, 0, 0, S_EGGMOBILE3_ATK2}, // S_EGGMOBILE3_ATK1
|
||||||
{SPR_EGGO, 2, 2, {NULL}, 0, 0, S_EGGMOBILE3_ATK3A}, // S_EGGMOBILE3_ATK2
|
{SPR_EGGO, 2, 2, {NULL}, 0, 0, S_EGGMOBILE3_ATK3A}, // S_EGGMOBILE3_ATK2
|
||||||
{SPR_EGGO, 3, 2, {A_BossFireShot}, MT_TORPEDO, 2, S_EGGMOBILE3_ATK3B}, // S_EGGMOBILE3_ATK3A
|
{SPR_EGGO, 3, 2, {A_BossFireShot}, MT_TORPEDO, 2, S_EGGMOBILE3_ATK3B}, // S_EGGMOBILE3_ATK3A
|
||||||
|
@ -1275,12 +1285,7 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_EGGO, 3, 2, {A_BossFireShot}, MT_TORPEDO, 3, S_EGGMOBILE3_ATK3D}, // S_EGGMOBILE3_ATK3C
|
{SPR_EGGO, 3, 2, {A_BossFireShot}, MT_TORPEDO, 3, S_EGGMOBILE3_ATK3D}, // S_EGGMOBILE3_ATK3C
|
||||||
{SPR_EGGO, 3, 2, {A_BossFireShot}, MT_TORPEDO, 5, S_EGGMOBILE3_ATK4}, // S_EGGMOBILE3_ATK3D
|
{SPR_EGGO, 3, 2, {A_BossFireShot}, MT_TORPEDO, 5, S_EGGMOBILE3_ATK4}, // S_EGGMOBILE3_ATK3D
|
||||||
{SPR_EGGO, 4, 2, {NULL}, 0, 0, S_EGGMOBILE3_ATK5}, // S_EGGMOBILE3_ATK4
|
{SPR_EGGO, 4, 2, {NULL}, 0, 0, S_EGGMOBILE3_ATK5}, // S_EGGMOBILE3_ATK4
|
||||||
{SPR_EGGO, 5, 2, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH1}, // S_EGGMOBILE3_ATK5
|
{SPR_EGGO, 5, 2, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH6}, // S_EGGMOBILE3_ATK5
|
||||||
{SPR_EGGO, 6, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH2}, // S_EGGMOBILE3_LAUGH1
|
|
||||||
{SPR_EGGO, 7, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH3}, // S_EGGMOBILE3_LAUGH2
|
|
||||||
{SPR_EGGO, 6, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH4}, // S_EGGMOBILE3_LAUGH3
|
|
||||||
{SPR_EGGO, 7, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH5}, // S_EGGMOBILE3_LAUGH4
|
|
||||||
{SPR_EGGO, 6, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH6}, // S_EGGMOBILE3_LAUGH5
|
|
||||||
{SPR_EGGO, 7, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH7}, // S_EGGMOBILE3_LAUGH6
|
{SPR_EGGO, 7, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH7}, // S_EGGMOBILE3_LAUGH6
|
||||||
{SPR_EGGO, 6, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH8}, // S_EGGMOBILE3_LAUGH7
|
{SPR_EGGO, 6, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH8}, // S_EGGMOBILE3_LAUGH7
|
||||||
{SPR_EGGO, 7, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH9}, // S_EGGMOBILE3_LAUGH8
|
{SPR_EGGO, 7, 4, {NULL}, 0, 0, S_EGGMOBILE3_LAUGH9}, // S_EGGMOBILE3_LAUGH8
|
||||||
|
@ -1327,14 +1332,14 @@ state_t states[NUMSTATES] =
|
||||||
// Boss 3 Pinch
|
// Boss 3 Pinch
|
||||||
{SPR_FAKE, 0, 1, {A_BossJetFume}, 1, 0, S_FAKEMOBILE}, // S_FAKEMOBILE_INIT
|
{SPR_FAKE, 0, 1, {A_BossJetFume}, 1, 0, S_FAKEMOBILE}, // S_FAKEMOBILE_INIT
|
||||||
{SPR_FAKE, 0, 1, {A_Boss3Path}, 0, 0, S_FAKEMOBILE}, // S_FAKEMOBILE
|
{SPR_FAKE, 0, 1, {A_Boss3Path}, 0, 0, S_FAKEMOBILE}, // S_FAKEMOBILE
|
||||||
{SPR_FAKE, 0, 2, {NULL}, 0, 0, S_FAKEMOBILE_ATK2}, // S_FAKEMOBILE_ATK1
|
{SPR_FAKE, 0, 22, {NULL}, 0, 0, S_FAKEMOBILE_ATK2}, // S_FAKEMOBILE_ATK1
|
||||||
{SPR_FAKE, 0, 2, {NULL}, 0, 0, S_FAKEMOBILE_ATK3A}, // S_FAKEMOBILE_ATK2
|
{SPR_FAKE, 0, 2, {NULL}, 0, 0, S_FAKEMOBILE_ATK3A}, // S_FAKEMOBILE_ATK2
|
||||||
{SPR_FAKE, 0, 2, {A_BossFireShot}, MT_TORPEDO2, 2, S_FAKEMOBILE_ATK3B}, // S_FAKEMOBILE_ATK3A
|
{SPR_FAKE, 0, 2, {A_BossFireShot}, MT_TORPEDO2, 2, S_FAKEMOBILE_ATK3B}, // S_FAKEMOBILE_ATK3A
|
||||||
{SPR_FAKE, 0, 2, {A_BossFireShot}, MT_TORPEDO2, 4, S_FAKEMOBILE_ATK3C}, // S_FAKEMOBILE_ATK3B
|
{SPR_FAKE, 0, 2, {A_BossFireShot}, MT_TORPEDO2, 4, S_FAKEMOBILE_ATK3C}, // S_FAKEMOBILE_ATK3B
|
||||||
{SPR_FAKE, 0, 2, {A_BossFireShot}, MT_TORPEDO2, 3, S_FAKEMOBILE_ATK3D}, // S_FAKEMOBILE_ATK3C
|
{SPR_FAKE, 0, 2, {A_BossFireShot}, MT_TORPEDO2, 3, S_FAKEMOBILE_ATK3D}, // S_FAKEMOBILE_ATK3C
|
||||||
{SPR_FAKE, 0, 2, {A_BossFireShot}, MT_TORPEDO2, 5, S_FAKEMOBILE_ATK4}, // S_FAKEMOBILE_ATK3D
|
{SPR_FAKE, 0, 2, {A_BossFireShot}, MT_TORPEDO2, 5, S_FAKEMOBILE}, // S_FAKEMOBILE_ATK3D
|
||||||
{SPR_FAKE, 0, 2, {NULL}, 0, 0, S_FAKEMOBILE_ATK5}, // S_FAKEMOBILE_ATK4
|
{SPR_FAKE, 0, 1, {NULL}, 0, 0, S_FAKEMOBILE_DIE2}, // S_FAKEMOBILE_DIE1
|
||||||
{SPR_FAKE, 0, 2, {NULL}, 0, 0, S_FAKEMOBILE}, // S_FAKEMOBILE_ATK5
|
{SPR_NULL, 0, 1, {NULL}, 0, 0, S_FAKEMOBILE_DIE1}, // S_FAKEMOBILE_DIE2
|
||||||
|
|
||||||
// Boss 4
|
// Boss 4
|
||||||
{SPR_EGGP, 0, -1, {NULL}, 0, 0, S_NULL}, // S_EGGMOBILE4_STND
|
{SPR_EGGP, 0, -1, {NULL}, 0, 0, S_NULL}, // S_EGGMOBILE4_STND
|
||||||
|
@ -1351,16 +1356,9 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_EGGP, 9,150, {A_Boss4SpeedUp}, sfx_mswing, 0, S_EGGMOBILE4_RATK6}, // S_EGGMOBILE4_RATK5
|
{SPR_EGGP, 9,150, {A_Boss4SpeedUp}, sfx_mswing, 0, S_EGGMOBILE4_RATK6}, // S_EGGMOBILE4_RATK5
|
||||||
{SPR_EGGP,10, 2, {NULL}, 0, 0, S_EGGMOBILE4_STND}, // S_EGGMOBILE4_RATK6
|
{SPR_EGGP,10, 2, {NULL}, 0, 0, S_EGGMOBILE4_STND}, // S_EGGMOBILE4_RATK6
|
||||||
{SPR_EGGP, 0, 20, {A_Boss4Raise}, sfx_doord1, 0, S_EGGMOBILE4_RAISE2}, // S_EGGMOBILE4_RAISE1
|
{SPR_EGGP, 0, 20, {A_Boss4Raise}, sfx_doord1, 0, S_EGGMOBILE4_RAISE2}, // S_EGGMOBILE4_RAISE1
|
||||||
{SPR_EGGP,13, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE3}, // S_EGGMOBILE4_RAISE2
|
{SPR_EGGP,13|FF_ANIMATE, -1, {NULL}, 1, 10, S_NULL}, // S_EGGMOBILE4_RAISE2
|
||||||
{SPR_EGGP,14, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE4}, // S_EGGMOBILE4_RAISE3
|
{SPR_EGGP,11, 0, {A_Boss4Reverse}, sfx_alarm, sfx_s3k60, S_EGGMOBILE4_PAIN2}, // S_EGGMOBILE4_PAIN1
|
||||||
{SPR_EGGP,13, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE5}, // S_EGGMOBILE4_RAISE4
|
{SPR_EGGP,11, 24, {A_Pain}, 0, 0, S_EGGMOBILE4_STND}, // S_EGGMOBILE4_PAIN2
|
||||||
{SPR_EGGP,14, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE6}, // S_EGGMOBILE4_RAISE5
|
|
||||||
{SPR_EGGP,13, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE7}, // S_EGGMOBILE4_RAISE6
|
|
||||||
{SPR_EGGP,14, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE8}, // S_EGGMOBILE4_RAISE7
|
|
||||||
{SPR_EGGP,13, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE9}, // S_EGGMOBILE4_RAISE8
|
|
||||||
{SPR_EGGP,14, 10, {NULL}, 0, 0, S_EGGMOBILE4_RAISE10},// S_EGGMOBILE4_RAISE9
|
|
||||||
{SPR_EGGP,13, 10, {NULL}, 0, 0, S_EGGMOBILE4_STND}, // S_EGGMOBILE4_RAISE10
|
|
||||||
{SPR_EGGP,11, 24, {A_Pain}, 0, 0, S_EGGMOBILE4_STND}, // S_EGGMOBILE4_PAIN
|
|
||||||
{SPR_EGGP,12, 8, {A_Fall}, 0, 0, S_EGGMOBILE4_DIE2}, // S_EGGMOBILE4_DIE1
|
{SPR_EGGP,12, 8, {A_Fall}, 0, 0, S_EGGMOBILE4_DIE2}, // S_EGGMOBILE4_DIE1
|
||||||
{SPR_EGGP,12, 8, {A_BossScream}, 0, 0, S_EGGMOBILE4_DIE3}, // S_EGGMOBILE4_DIE2
|
{SPR_EGGP,12, 8, {A_BossScream}, 0, 0, S_EGGMOBILE4_DIE3}, // S_EGGMOBILE4_DIE2
|
||||||
{SPR_EGGP,12, 8, {A_BossScream}, 0, 0, S_EGGMOBILE4_DIE4}, // S_EGGMOBILE4_DIE3
|
{SPR_EGGP,12, 8, {A_BossScream}, 0, 0, S_EGGMOBILE4_DIE4}, // S_EGGMOBILE4_DIE3
|
||||||
|
@ -1378,10 +1376,21 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_EGGP,13, 5, {NULL}, 0, 0, S_EGGMOBILE4_FLEE2}, // S_EGGMOBILE4_FLEE1
|
{SPR_EGGP,13, 5, {NULL}, 0, 0, S_EGGMOBILE4_FLEE2}, // S_EGGMOBILE4_FLEE1
|
||||||
{SPR_EGGP,14, 5, {NULL}, 0, 0, S_EGGMOBILE4_FLEE1}, // S_EGGMOBILE4_FLEE2
|
{SPR_EGGP,14, 5, {NULL}, 0, 0, S_EGGMOBILE4_FLEE1}, // S_EGGMOBILE4_FLEE2
|
||||||
{SPR_BMCE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_EGGMOBILE4_MACE
|
{SPR_BMCE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_EGGMOBILE4_MACE
|
||||||
|
{SPR_BMCE, 0, 2, {A_BossScream}, 1, MT_SONIC3KBOSSEXPLODE, S_EGGMOBILE4_MACE_DIE2}, // S_EGGMOBILE4_MACE_DIE1
|
||||||
|
{SPR_NULL, 0, 2, {A_BossScream}, 1, MT_SONIC3KBOSSEXPLODE, S_EGGMOBILE4_MACE_DIE3}, // S_EGGMOBILE4_MACE_DIE2
|
||||||
|
{SPR_NULL, 0, 0, {A_Repeat}, 7, S_EGGMOBILE4_MACE_DIE1, S_BOSSEXPLODE}, // S_EGGMOBILE4_MACE_DIE3
|
||||||
|
|
||||||
// Boss 4 Jet flame
|
// Boss 4 jet flame
|
||||||
{SPR_EFIR, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_JETFLAME2}, // S_JETFLAME1
|
{SPR_EFIR, FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 1, 1, S_NULL}, // S_JETFLAME
|
||||||
{SPR_EFIR, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_JETFLAME1}, // S_JETFLAME2
|
|
||||||
|
// Boss 4 Spectator Eggrobo
|
||||||
|
{SPR_EGR1, 0, -1, {NULL}, 0, 0, S_NULL}, // S_EGGROBO1_STND
|
||||||
|
{SPR_EGR1, 5, 2, {NULL}, 0, 0, S_EGGROBO1_BSLAP2}, // S_EGGROBO1_BSLAP1
|
||||||
|
{SPR_EGR1, FF_ANIMATE|6, 35, {NULL}, 1, 2, S_EGGROBO1_STND}, // S_EGGROBO1_BSLAP2
|
||||||
|
{SPR_EGR1, FF_ANIMATE|3, -1, {NULL}, 1, 2, S_NULL}, // S_EGGROBO1_PISSED
|
||||||
|
|
||||||
|
// Boss 4 Spectator Eggrobo jet flame
|
||||||
|
{SPR_EFIR, FF_FULLBRIGHT|2, -1, {NULL}, 0, 0, S_NULL}, // S_EGGROBOJET
|
||||||
|
|
||||||
// Boss 5
|
// Boss 5
|
||||||
{SPR_FANG, 2, 16, {A_Look}, 1, 0, S_FANG_IDLE2}, // S_FANG_IDLE1
|
{SPR_FANG, 2, 16, {A_Look}, 1, 0, S_FANG_IDLE2}, // S_FANG_IDLE1
|
||||||
|
@ -1746,20 +1755,23 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_METL, 9, 2, {NULL}, 0, 0, S_METALSONIC_RUN1}, // S_METALSONIC_RUN4
|
{SPR_METL, 9, 2, {NULL}, 0, 0, S_METALSONIC_RUN1}, // S_METALSONIC_RUN4
|
||||||
|
|
||||||
{SPR_METL, 4, -1, {NULL}, 0, 0, S_NULL}, // S_METALSONIC_FLOAT
|
{SPR_METL, 4, -1, {NULL}, 0, 0, S_NULL}, // S_METALSONIC_FLOAT
|
||||||
{SPR_METL, 12, -1, {NULL}, 0, 0, S_METALSONIC_STUN}, // S_METALSONIC_VECTOR
|
{SPR_METL, 12|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_METALSONIC_STUN}, // S_METALSONIC_VECTOR
|
||||||
{SPR_METL, 0, -1, {NULL}, 0, 0, S_METALSONIC_FLOAT}, // S_METALSONIC_STUN
|
{SPR_METL, 11, -1, {NULL}, 0, 0, S_METALSONIC_FLOAT}, // S_METALSONIC_STUN
|
||||||
{SPR_METL, 13, 40, {NULL}, 0, 0, S_METALSONIC_GATHER},// S_METALSONIC_RAISE
|
{SPR_METL, 13, 20, {NULL}, 0, 0, S_METALSONIC_GATHER},// S_METALSONIC_RAISE
|
||||||
{SPR_METL, 14, -1, {NULL}, 0, 0, S_NULL}, // S_METALSONIC_GATHER
|
{SPR_METL, 14, -1, {NULL}, 0, 0, S_NULL}, // S_METALSONIC_GATHER
|
||||||
{SPR_METL, 15, -1, {NULL}, 0, 0, S_METALSONIC_BOUNCE},// S_METALSONIC_DASH
|
{SPR_METL, 15, -1, {NULL}, 0, 0, S_METALSONIC_BOUNCE},// S_METALSONIC_DASH
|
||||||
{SPR_METL, 14, -1, {NULL}, 0, 0, S_NULL}, // S_METALSONIC_BOUNCE
|
{SPR_METL, 14, -1, {NULL}, 0, 0, S_NULL}, // S_METALSONIC_BOUNCE
|
||||||
{SPR_METL, 16, -1, {NULL}, 0, 0, S_NULL}, // S_METALSONIC_BADBOUNCE
|
{SPR_METL, 16, -1, {NULL}, 0, 0, S_NULL}, // S_METALSONIC_BADBOUNCE
|
||||||
{SPR_METL, 13, -1, {NULL}, 0, 0, S_METALSONIC_GATHER},// S_METALSONIC_SHOOT
|
{SPR_METL, 13, -1, {NULL}, 0, 0, S_METALSONIC_GATHER},// S_METALSONIC_SHOOT
|
||||||
{SPR_METL, 11, 40, {A_Pain}, 0, 0, S_METALSONIC_FLOAT}, // S_METALSONIC_PAIN
|
{SPR_METL, 11, 40, {A_Pain}, 0, 0, S_METALSONIC_FLOAT}, // S_METALSONIC_PAIN
|
||||||
{SPR_METL, 11, -1, {A_BossDeath}, 0, 0, S_NULL}, // S_METALSONIC_DEATH
|
{SPR_METL, 13, 8, {A_Fall}, 0, 0, S_METALSONIC_DEATH2},// S_METALSONIC_DEATH1
|
||||||
{SPR_METL, 3, 4, {NULL}, 0, 0, S_METALSONIC_FLEE2}, // S_METALSONIC_FLEE1
|
{SPR_METL, 13, 8, {A_BossScream}, 0, 0, S_METALSONIC_DEATH3},// S_METALSONIC_DEATH2
|
||||||
{SPR_METL, 4, 4, {A_BossScream}, 0, 0, S_METALSONIC_FLEE3}, // S_METALSONIC_FLEE2
|
{SPR_METL, 13, 0, {A_Repeat}, 11, S_METALSONIC_DEATH2, S_METALSONIC_DEATH4}, // S_METALSONIC_DEATH3
|
||||||
{SPR_METL, 5, 4, {NULL}, 0, 0, S_METALSONIC_FLEE4}, // S_METALSONIC_FLEE3
|
{SPR_METL, 13, -1, {A_BossDeath}, 0, 0, S_NULL}, // S_METALSONIC_DEATH4
|
||||||
{SPR_METL, 4, 4, {NULL}, 0, 0, S_METALSONIC_FLEE1}, // S_METALSONIC_FLEE4
|
{SPR_METL, 11, 4, {NULL}, 0, 0, S_METALSONIC_FLEE2}, // S_METALSONIC_FLEE1
|
||||||
|
{SPR_METL, 11, 4, {A_BossScream}, 0, 0, S_METALSONIC_FLEE3}, // S_METALSONIC_FLEE2
|
||||||
|
{SPR_METL, 11, 4, {NULL}, 0, 0, S_METALSONIC_FLEE4}, // S_METALSONIC_FLEE3
|
||||||
|
{SPR_METL, 11, 4, {NULL}, 0, 0, S_METALSONIC_FLEE1}, // S_METALSONIC_FLEE4
|
||||||
|
|
||||||
{SPR_MSCF, FF_FULLBRIGHT|FF_TRANS30| 0, 1, {NULL}, 0, 0, S_MSSHIELD_F2}, // S_MSSHIELD_F1
|
{SPR_MSCF, FF_FULLBRIGHT|FF_TRANS30| 0, 1, {NULL}, 0, 0, S_MSSHIELD_F2}, // S_MSSHIELD_F1
|
||||||
{SPR_MSCF, FF_FULLBRIGHT|FF_TRANS30| 1, 1, {NULL}, 0, 0, S_MSSHIELD_F3}, // S_MSSHIELD_F2
|
{SPR_MSCF, FF_FULLBRIGHT|FF_TRANS30| 1, 1, {NULL}, 0, 0, S_MSSHIELD_F3}, // S_MSSHIELD_F2
|
||||||
|
@ -2803,12 +2815,18 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_ELEM, FF_FULLBRIGHT|20, 1, {NULL}, 0, 0, S_ELEMF10}, // S_ELEMF9
|
{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_NULL, 0, 1, {NULL}, 0, 0, S_ELEMF1 }, // S_ELEMF10
|
||||||
|
|
||||||
{SPR_PITY, FF_TRANS30 , 2, {NULL}, 0, 0, S_PITY2}, // S_PITY1
|
{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| 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_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| 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_TRANS30| 4, 2, {NULL}, 0, 0, S_PITY6}, // S_PITY5
|
||||||
{SPR_PITY, FF_TRANS20|5, 2, {NULL}, 0, 0, S_PITY1}, // S_PITY6
|
{SPR_PITY, FF_TRANS30| 5, 2, {NULL}, 0, 0, S_PITY7}, // S_PITY6
|
||||||
|
{SPR_PITY, FF_TRANS30| 6, 2, {NULL}, 0, 0, S_PITY8}, // S_PITY7
|
||||||
|
{SPR_PITY, FF_TRANS30| 7, 2, {NULL}, 0, 0, S_PITY9}, // S_PITY8
|
||||||
|
{SPR_PITY, FF_TRANS30| 8, 2, {NULL}, 0, 0, S_PITY10}, // S_PITY9
|
||||||
|
{SPR_PITY, FF_TRANS30| 9, 2, {NULL}, 0, 0, S_PITY11}, // S_PITY10
|
||||||
|
{SPR_PITY, FF_TRANS30|10, 2, {NULL}, 0, 0, S_PITY12}, // S_PITY11
|
||||||
|
{SPR_PITY, FF_TRANS30|11, 2, {NULL}, 0, 0, S_PITY1}, // S_PITY12
|
||||||
|
|
||||||
{SPR_FIRS, FF_FULLBRIGHT|FF_TRANS40 , 2, {NULL}, 0, 0, S_FIRS2}, // S_FIRS1
|
{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
|
{SPR_FIRS, FF_FULLBRIGHT|FF_TRANS40|1, 2, {NULL}, 0, 0, S_FIRS3}, // S_FIRS2
|
||||||
|
@ -2886,7 +2904,7 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_NULL, 0, 15*2, {NULL}, 0, 0, S_ZAPSB2 }, // S_ZAPSB11
|
{SPR_NULL, 0, 15*2, {NULL}, 0, 0, S_ZAPSB2 }, // S_ZAPSB11
|
||||||
|
|
||||||
// Thunder spark
|
// Thunder spark
|
||||||
{SPR_SSPK, FF_ANIMATE, 18, {NULL}, 1, 2, S_NULL}, // S_THUNDERCOIN_SPARK
|
{SPR_SSPK, FF_ANIMATE, -1, {NULL}, 1, 2, S_NULL}, // S_THUNDERCOIN_SPARK
|
||||||
|
|
||||||
// Invincibility Sparkles
|
// Invincibility Sparkles
|
||||||
{SPR_IVSP, FF_ANIMATE, 32, {NULL}, 31, 1, S_NULL}, // S_IVSP
|
{SPR_IVSP, FF_ANIMATE, 32, {NULL}, 31, 1, S_NULL}, // S_IVSP
|
||||||
|
@ -3187,8 +3205,8 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_SSWB, 1, 1, {NULL}, 0, 0, S_BHORIZ1}, // S_BHORIZ8
|
{SPR_SSWB, 1, 1, {NULL}, 0, 0, S_BHORIZ1}, // S_BHORIZ8
|
||||||
|
|
||||||
// Rain
|
// Rain
|
||||||
{SPR_RAIN, FF_TRANS50, -1, {NULL}, 0, 0, S_NULL}, // S_RAIN1
|
{SPR_RAIN, FF_FULLBRIGHT|FF_TRANS50, -1, {NULL}, 0, 0, S_NULL}, // S_RAIN1
|
||||||
{SPR_RAIN, FF_TRANS50, 1, {NULL}, 0, 0, S_RAIN1}, // S_RAINRETURN
|
{SPR_RAIN, FF_FULLBRIGHT|FF_TRANS50, 1, {NULL}, 0, 0, S_RAIN1}, // S_RAINRETURN
|
||||||
|
|
||||||
// Snowflake
|
// Snowflake
|
||||||
{SPR_SNO1, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SNOW1
|
{SPR_SNO1, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SNOW1
|
||||||
|
@ -3298,13 +3316,21 @@ state_t states[NUMSTATES] =
|
||||||
|
|
||||||
{SPR_LCKN, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_LOCKON1
|
{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_LCKN, 1|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_LOCKON2
|
||||||
|
{SPR_LCKN, 2|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_LOCKON3
|
||||||
|
{SPR_LCKN, 3|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_LOCKON4
|
||||||
|
|
||||||
|
{SPR_LCKN, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LOCKONINF1
|
||||||
|
{SPR_LCKN, 1|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LOCKONINF2
|
||||||
|
{SPR_LCKN, 2|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LOCKONINF3
|
||||||
|
{SPR_LCKN, 3|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LOCKONINF4
|
||||||
|
|
||||||
{SPR_TTAG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_TTAG
|
{SPR_TTAG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_TTAG
|
||||||
|
|
||||||
// CTF Sign
|
// CTF Sign
|
||||||
{SPR_GFLG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_GOTFLAG
|
{SPR_GFLG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_GOTFLAG
|
||||||
|
|
||||||
{SPR_CORK, 0, -1, {NULL}, 0, 0, S_NULL}, // S_CORK
|
{SPR_CORK, 0, -1, {NULL}, 0, 0, S_NULL}, // S_CORK
|
||||||
|
{SPR_LHRT, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LHRT
|
||||||
|
|
||||||
// Red Rings (thrown)
|
// Red Rings (thrown)
|
||||||
{SPR_RRNG, FF_FULLBRIGHT, 1, {A_ThrownRing}, 0, 0, S_RRNG2}, // S_RRNG1
|
{SPR_RRNG, FF_FULLBRIGHT, 1, {A_ThrownRing}, 0, 0, S_RRNG2}, // S_RRNG1
|
||||||
|
@ -3861,6 +3887,8 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_ROIO, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEO
|
{SPR_ROIO, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEO
|
||||||
{SPR_ROIP, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEP
|
{SPR_ROIP, FF_ANIMATE|FF_RANDOMANIM, -1, {NULL}, 4, 2, S_NULL}, // S_ROCKCRUMBLEP
|
||||||
|
|
||||||
|
{SPR_BRIC, FF_ANIMATE, -1, {A_DebrisRandom}, 7, 2, S_NULL}, // S_BRICKDEBRIS
|
||||||
|
|
||||||
#ifdef SEENAMES
|
#ifdef SEENAMES
|
||||||
{SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK
|
{SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK
|
||||||
#endif
|
#endif
|
||||||
|
@ -5500,7 +5528,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
MT_PROPELLER, // painchance
|
MT_PROPELLER, // painchance
|
||||||
sfx_dmpain, // painsound
|
sfx_dmpain, // painsound
|
||||||
S_NULL, // meleestate
|
S_NULL, // meleestate
|
||||||
S_EGGMOBILE3_ATK1, // missilestate
|
S_EGGMOBILE3_LAUGH1,// missilestate
|
||||||
S_EGGMOBILE3_DIE1, // deathstate
|
S_EGGMOBILE3_DIE1, // deathstate
|
||||||
S_EGGMOBILE3_FLEE1, // xdeathstate
|
S_EGGMOBILE3_FLEE1, // xdeathstate
|
||||||
sfx_cybdth, // deathsound
|
sfx_cybdth, // deathsound
|
||||||
|
@ -5555,9 +5583,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
sfx_s3k7b, // painsound
|
sfx_s3k7b, // painsound
|
||||||
S_NULL, // meleestate
|
S_NULL, // meleestate
|
||||||
S_FAKEMOBILE_ATK1, // missilestate
|
S_FAKEMOBILE_ATK1, // missilestate
|
||||||
S_XPLD1, // deathstate
|
S_FAKEMOBILE_DIE1, // deathstate
|
||||||
S_NULL, // xdeathstate
|
S_NULL, // xdeathstate
|
||||||
sfx_pop, // deathsound
|
sfx_mswarp, // deathsound
|
||||||
8*FRACUNIT, // speed
|
8*FRACUNIT, // speed
|
||||||
32*FRACUNIT, // radius
|
32*FRACUNIT, // radius
|
||||||
116*FRACUNIT, // height
|
116*FRACUNIT, // height
|
||||||
|
@ -5569,6 +5597,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ // MT_SHOCK
|
||||||
|
-1, // doomednum
|
||||||
|
S_THUNDERCOIN_SPARK, // spawnstate
|
||||||
|
1000, // spawnhealth
|
||||||
|
S_NULL, // seestate
|
||||||
|
sfx_None, // seesound
|
||||||
|
0, // reactiontime
|
||||||
|
sfx_None, // attacksound
|
||||||
|
S_NULL, // painstate
|
||||||
|
0, // painchance
|
||||||
|
sfx_None, // painsound
|
||||||
|
S_NULL, // meleestate
|
||||||
|
S_NULL, // missilestate
|
||||||
|
S_SPRK1, // deathstate
|
||||||
|
S_NULL, // xdeathstate
|
||||||
|
sfx_None, // deathsound
|
||||||
|
10*FRACUNIT, // speed
|
||||||
|
16*FRACUNIT, // radius
|
||||||
|
35*FRACUNIT, // height
|
||||||
|
0, // display offset
|
||||||
|
DMG_ELECTRIC|(sfx_buzz2<<8), // mass
|
||||||
|
20, // damage
|
||||||
|
sfx_None, // activesound
|
||||||
|
MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY, // flags
|
||||||
|
S_NULL // raisestate
|
||||||
|
},
|
||||||
|
|
||||||
{ // MT_EGGMOBILE4
|
{ // MT_EGGMOBILE4
|
||||||
203, // doomednum
|
203, // doomednum
|
||||||
S_EGGMOBILE4_STND, // spawnstate
|
S_EGGMOBILE4_STND, // spawnstate
|
||||||
|
@ -5577,7 +5632,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
sfx_None, // seesound
|
sfx_None, // seesound
|
||||||
0, // reactiontime
|
0, // reactiontime
|
||||||
sfx_None, // attacksound
|
sfx_None, // attacksound
|
||||||
S_EGGMOBILE4_PAIN, // painstate
|
S_EGGMOBILE4_PAIN1,// painstate
|
||||||
0, // painchance
|
0, // painchance
|
||||||
sfx_dmpain, // painsound
|
sfx_dmpain, // painsound
|
||||||
S_EGGMOBILE4_LATK1,// meleestate
|
S_EGGMOBILE4_LATK1,// meleestate
|
||||||
|
@ -5609,9 +5664,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
sfx_None, // painsound
|
sfx_None, // painsound
|
||||||
S_NULL, // meleestate
|
S_NULL, // meleestate
|
||||||
S_NULL, // missilestate
|
S_NULL, // missilestate
|
||||||
S_BOSSEXPLODE, // deathstate
|
S_EGGMOBILE4_MACE_DIE1, // deathstate
|
||||||
S_NULL, // xdeathstate
|
S_NULL, // xdeathstate
|
||||||
sfx_cybdth, // deathsound
|
sfx_None, // deathsound
|
||||||
48*FRACUNIT, // speed
|
48*FRACUNIT, // speed
|
||||||
34*FRACUNIT, // radius
|
34*FRACUNIT, // radius
|
||||||
68*FRACUNIT, // height
|
68*FRACUNIT, // height
|
||||||
|
@ -5625,7 +5680,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
|
|
||||||
{ // MT_JETFLAME
|
{ // MT_JETFLAME
|
||||||
-1, // doomednum
|
-1, // doomednum
|
||||||
S_JETFLAME1, // spawnstate
|
S_JETFLAME, // spawnstate
|
||||||
1000, // spawnhealth
|
1000, // spawnhealth
|
||||||
S_NULL, // seestate
|
S_NULL, // seestate
|
||||||
sfx_None, // seesound
|
sfx_None, // seesound
|
||||||
|
@ -5646,7 +5701,61 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
DMG_FIRE, // mass
|
DMG_FIRE, // mass
|
||||||
0, // damage
|
0, // damage
|
||||||
sfx_None, // activesound
|
sfx_None, // activesound
|
||||||
MF_NOGRAVITY|MF_PAIN|MF_FIRE, // flags
|
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY, // flags
|
||||||
|
S_NULL // raisestate
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // MT_EGGROBO1
|
||||||
|
1127, // doomednum
|
||||||
|
S_EGGROBO1_STND,// spawnstate
|
||||||
|
1000, // spawnhealth
|
||||||
|
S_NULL, // seestate
|
||||||
|
sfx_s3ka0, // seesound
|
||||||
|
8, // reactiontime
|
||||||
|
sfx_bsnipe, // attacksound
|
||||||
|
S_NULL, // painstate
|
||||||
|
0, // painchance
|
||||||
|
sfx_None, // painsound
|
||||||
|
S_EGGROBO1_BSLAP1, // meleestate
|
||||||
|
S_NULL, // missilestate
|
||||||
|
S_EGGROBO1_PISSED, // deathstate
|
||||||
|
S_NULL, // xdeathstate
|
||||||
|
sfx_s3ka0, // deathsound
|
||||||
|
12*FRACUNIT, // speed
|
||||||
|
20*FRACUNIT, // radius
|
||||||
|
72*FRACUNIT, // height
|
||||||
|
0, // display offset
|
||||||
|
0, // mass
|
||||||
|
0, // damage
|
||||||
|
sfx_None, // activesound
|
||||||
|
MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags
|
||||||
|
S_NULL // raisestate
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // MT_EGGROBOJET
|
||||||
|
-1, // doomednum
|
||||||
|
S_EGGROBOJET, // 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
|
||||||
|
1, // speed
|
||||||
|
10*FRACUNIT, // radius
|
||||||
|
28*FRACUNIT, // height
|
||||||
|
0, // display offset
|
||||||
|
0, // mass
|
||||||
|
0, // damage
|
||||||
|
sfx_None, // activesound
|
||||||
|
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY, // flags
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -5673,7 +5782,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
0, // mass
|
0, // mass
|
||||||
3, // damage
|
3, // damage
|
||||||
sfx_boingf, // activesound
|
sfx_boingf, // activesound
|
||||||
MF_SPECIAL|MF_BOSS|MF_SHOOTABLE, // flags
|
MF_SPECIAL|MF_BOSS|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -6251,13 +6360,13 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_METALSONIC_DASH, // seestate
|
S_METALSONIC_DASH, // seestate
|
||||||
sfx_s3k54, // seesound
|
sfx_s3k54, // seesound
|
||||||
0, // reactiontime
|
0, // reactiontime
|
||||||
sfx_trpowr, // attacksound
|
sfx_bechrg, // attacksound
|
||||||
S_METALSONIC_PAIN, // painstate
|
S_METALSONIC_PAIN, // painstate
|
||||||
S_METALSONIC_VECTOR,// painchance
|
S_METALSONIC_VECTOR,// painchance
|
||||||
sfx_dmpain, // painsound
|
sfx_dmpain, // painsound
|
||||||
S_METALSONIC_BADBOUNCE, // meleestate
|
S_METALSONIC_BADBOUNCE, // meleestate
|
||||||
S_METALSONIC_SHOOT, // missilestate
|
S_METALSONIC_SHOOT, // missilestate
|
||||||
S_METALSONIC_DEATH, // deathstate
|
S_METALSONIC_DEATH1,// deathstate
|
||||||
S_METALSONIC_FLEE1, // xdeathstate
|
S_METALSONIC_FLEE1, // xdeathstate
|
||||||
sfx_s3k6e, // deathsound
|
sfx_s3k6e, // deathsound
|
||||||
MT_ENERGYBALL, // speed
|
MT_ENERGYBALL, // speed
|
||||||
|
@ -6289,7 +6398,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
sfx_None, // deathsound
|
sfx_None, // deathsound
|
||||||
0, // speed
|
0, // speed
|
||||||
32*FRACUNIT, // radius
|
32*FRACUNIT, // radius
|
||||||
64*FRACUNIT, // height
|
52*FRACUNIT, // height
|
||||||
0, // display offset
|
0, // display offset
|
||||||
0, // mass
|
0, // mass
|
||||||
0, // damage
|
0, // damage
|
||||||
|
@ -9086,7 +9195,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
sfx_None, // painsound
|
sfx_None, // painsound
|
||||||
S_NULL, // meleestate
|
S_NULL, // meleestate
|
||||||
S_NULL, // missilestate
|
S_NULL, // missilestate
|
||||||
S_MINE_BOOM1, // deathstate
|
S_XPLD1, // deathstate
|
||||||
S_NULL, // xdeathstate
|
S_NULL, // xdeathstate
|
||||||
sfx_cybdth, // deathsound
|
sfx_cybdth, // deathsound
|
||||||
20*FRACUNIT, // speed
|
20*FRACUNIT, // speed
|
||||||
|
@ -9113,7 +9222,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
sfx_None, // painsound
|
sfx_None, // painsound
|
||||||
S_NULL, // meleestate
|
S_NULL, // meleestate
|
||||||
S_NULL, // missilestate
|
S_NULL, // missilestate
|
||||||
S_MINE_BOOM1, // deathstate
|
S_XPLD1, // deathstate
|
||||||
S_NULL, // xdeathstate
|
S_NULL, // xdeathstate
|
||||||
sfx_cybdth, // deathsound
|
sfx_cybdth, // deathsound
|
||||||
20*FRACUNIT, // speed
|
20*FRACUNIT, // speed
|
||||||
|
@ -9132,7 +9241,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_ENERGYBALL1, // spawnstate
|
S_ENERGYBALL1, // spawnstate
|
||||||
1000, // spawnhealth
|
1000, // spawnhealth
|
||||||
S_NULL, // seestate
|
S_NULL, // seestate
|
||||||
sfx_s3k54, // seesound
|
sfx_bexpld, // seesound
|
||||||
8, // reactiontime
|
8, // reactiontime
|
||||||
sfx_None, // attacksound
|
sfx_None, // attacksound
|
||||||
S_NULL, // painstate
|
S_NULL, // painstate
|
||||||
|
@ -16113,7 +16222,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL, // deathstate
|
S_NULL, // deathstate
|
||||||
S_NULL, // xdeathstate
|
S_NULL, // xdeathstate
|
||||||
sfx_None, // deathsound
|
sfx_None, // deathsound
|
||||||
-24*FRACUNIT, // speed
|
-72*FRACUNIT, // speed
|
||||||
1*FRACUNIT, // radius
|
1*FRACUNIT, // radius
|
||||||
8*FRACUNIT, // height
|
8*FRACUNIT, // height
|
||||||
0, // display offset
|
0, // display offset
|
||||||
|
@ -16529,6 +16638,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ // MT_LOCKONINF
|
||||||
|
1126, // doomednum
|
||||||
|
S_INVISIBLE, // 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
|
||||||
|
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags
|
||||||
|
S_NULL // raisestate
|
||||||
|
},
|
||||||
|
|
||||||
{ // MT_TAG
|
{ // MT_TAG
|
||||||
-1, // doomednum
|
-1, // doomednum
|
||||||
S_TTAG, // spawnstate
|
S_TTAG, // spawnstate
|
||||||
|
@ -16915,6 +17051,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ // MT_LHRT
|
||||||
|
-1, // doomednum
|
||||||
|
S_LHRT, // spawnstate
|
||||||
|
1000, // spawnhealth
|
||||||
|
S_NULL, // seestate
|
||||||
|
sfx_None, // seesound
|
||||||
|
0, // reactiontime
|
||||||
|
sfx_None, // attacksound
|
||||||
|
S_NULL, // painstate
|
||||||
|
0, // painchance
|
||||||
|
sfx_None, // painsound
|
||||||
|
S_NULL, // meleestate
|
||||||
|
S_NULL, // missilestate
|
||||||
|
S_SPRK1, // deathstate
|
||||||
|
S_SPRK1, // xdeathstate
|
||||||
|
sfx_None, // deathsound
|
||||||
|
60*FRACUNIT, // speed
|
||||||
|
16*FRACUNIT, // radius
|
||||||
|
16*FRACUNIT, // height
|
||||||
|
0, // display offset
|
||||||
|
0, // mass
|
||||||
|
1, // damage
|
||||||
|
sfx_None, // activesound
|
||||||
|
MF_NOBLOCKMAP|MF_MISSILE, // flags
|
||||||
|
S_NULL // raisestate
|
||||||
|
},
|
||||||
|
|
||||||
{ // MT_REDRING
|
{ // MT_REDRING
|
||||||
-1, // doomednum
|
-1, // doomednum
|
||||||
S_RRNG1, // spawnstate
|
S_RRNG1, // spawnstate
|
||||||
|
@ -19970,6 +20133,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ // MT_BRICKDEBRIS
|
||||||
|
-1, // doomednum
|
||||||
|
S_BRICKDEBRIS, // spawnstate
|
||||||
|
1, // spawnhealth
|
||||||
|
S_NULL, // seestate
|
||||||
|
sfx_None, // seesound
|
||||||
|
0, // 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
|
||||||
|
16*FRACUNIT, // height
|
||||||
|
0, // display offset
|
||||||
|
100, // mass
|
||||||
|
0, // damage
|
||||||
|
sfx_None, // activesound
|
||||||
|
MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_RUNSPAWNFUNC|MF_NOCLIPHEIGHT|MF_SCENERY, // flags
|
||||||
|
S_NULL // raisestate
|
||||||
|
},
|
||||||
|
|
||||||
#ifdef SEENAMES
|
#ifdef SEENAMES
|
||||||
{ // MT_NAMECHECK
|
{ // MT_NAMECHECK
|
||||||
-1, // doomednum
|
-1, // doomednum
|
||||||
|
|
74
src/info.h
74
src/info.h
|
@ -335,6 +335,7 @@ typedef enum sprite
|
||||||
// Boss 4 (Castle Eggman)
|
// Boss 4 (Castle Eggman)
|
||||||
SPR_EGGP,
|
SPR_EGGP,
|
||||||
SPR_EFIR, // Boss 4 jet flame
|
SPR_EFIR, // Boss 4 jet flame
|
||||||
|
SPR_EGR1, // Boss 4 Spectator Eggrobo
|
||||||
|
|
||||||
// Boss 5 (Arid Canyon)
|
// Boss 5 (Arid Canyon)
|
||||||
SPR_FANG, // replaces EGGQ
|
SPR_FANG, // replaces EGGQ
|
||||||
|
@ -627,6 +628,7 @@ typedef enum sprite
|
||||||
SPR_GFLG, // Got Flag sign
|
SPR_GFLG, // Got Flag sign
|
||||||
|
|
||||||
SPR_CORK,
|
SPR_CORK,
|
||||||
|
SPR_LHRT,
|
||||||
|
|
||||||
// Ring Weapons
|
// Ring Weapons
|
||||||
SPR_RRNG, // Red Ring
|
SPR_RRNG, // Red Ring
|
||||||
|
@ -720,6 +722,9 @@ typedef enum sprite
|
||||||
SPR_ROIO,
|
SPR_ROIO,
|
||||||
SPR_ROIP,
|
SPR_ROIP,
|
||||||
|
|
||||||
|
// Bricks
|
||||||
|
SPR_BRIC,
|
||||||
|
|
||||||
// Gravity Well Objects
|
// Gravity Well Objects
|
||||||
SPR_GWLG,
|
SPR_GWLG,
|
||||||
SPR_GWLR,
|
SPR_GWLR,
|
||||||
|
@ -1421,6 +1426,11 @@ typedef enum state
|
||||||
|
|
||||||
// Boss 3
|
// Boss 3
|
||||||
S_EGGMOBILE3_STND,
|
S_EGGMOBILE3_STND,
|
||||||
|
S_EGGMOBILE3_LAUGH1,
|
||||||
|
S_EGGMOBILE3_LAUGH2,
|
||||||
|
S_EGGMOBILE3_LAUGH3,
|
||||||
|
S_EGGMOBILE3_LAUGH4,
|
||||||
|
S_EGGMOBILE3_LAUGH5,
|
||||||
S_EGGMOBILE3_ATK1,
|
S_EGGMOBILE3_ATK1,
|
||||||
S_EGGMOBILE3_ATK2,
|
S_EGGMOBILE3_ATK2,
|
||||||
S_EGGMOBILE3_ATK3A,
|
S_EGGMOBILE3_ATK3A,
|
||||||
|
@ -1429,11 +1439,6 @@ typedef enum state
|
||||||
S_EGGMOBILE3_ATK3D,
|
S_EGGMOBILE3_ATK3D,
|
||||||
S_EGGMOBILE3_ATK4,
|
S_EGGMOBILE3_ATK4,
|
||||||
S_EGGMOBILE3_ATK5,
|
S_EGGMOBILE3_ATK5,
|
||||||
S_EGGMOBILE3_LAUGH1,
|
|
||||||
S_EGGMOBILE3_LAUGH2,
|
|
||||||
S_EGGMOBILE3_LAUGH3,
|
|
||||||
S_EGGMOBILE3_LAUGH4,
|
|
||||||
S_EGGMOBILE3_LAUGH5,
|
|
||||||
S_EGGMOBILE3_LAUGH6,
|
S_EGGMOBILE3_LAUGH6,
|
||||||
S_EGGMOBILE3_LAUGH7,
|
S_EGGMOBILE3_LAUGH7,
|
||||||
S_EGGMOBILE3_LAUGH8,
|
S_EGGMOBILE3_LAUGH8,
|
||||||
|
@ -1486,8 +1491,8 @@ typedef enum state
|
||||||
S_FAKEMOBILE_ATK3B,
|
S_FAKEMOBILE_ATK3B,
|
||||||
S_FAKEMOBILE_ATK3C,
|
S_FAKEMOBILE_ATK3C,
|
||||||
S_FAKEMOBILE_ATK3D,
|
S_FAKEMOBILE_ATK3D,
|
||||||
S_FAKEMOBILE_ATK4,
|
S_FAKEMOBILE_DIE1,
|
||||||
S_FAKEMOBILE_ATK5,
|
S_FAKEMOBILE_DIE2,
|
||||||
|
|
||||||
// Boss 4
|
// Boss 4
|
||||||
S_EGGMOBILE4_STND,
|
S_EGGMOBILE4_STND,
|
||||||
|
@ -1505,15 +1510,8 @@ typedef enum state
|
||||||
S_EGGMOBILE4_RATK6,
|
S_EGGMOBILE4_RATK6,
|
||||||
S_EGGMOBILE4_RAISE1,
|
S_EGGMOBILE4_RAISE1,
|
||||||
S_EGGMOBILE4_RAISE2,
|
S_EGGMOBILE4_RAISE2,
|
||||||
S_EGGMOBILE4_RAISE3,
|
S_EGGMOBILE4_PAIN1,
|
||||||
S_EGGMOBILE4_RAISE4,
|
S_EGGMOBILE4_PAIN2,
|
||||||
S_EGGMOBILE4_RAISE5,
|
|
||||||
S_EGGMOBILE4_RAISE6,
|
|
||||||
S_EGGMOBILE4_RAISE7,
|
|
||||||
S_EGGMOBILE4_RAISE8,
|
|
||||||
S_EGGMOBILE4_RAISE9,
|
|
||||||
S_EGGMOBILE4_RAISE10,
|
|
||||||
S_EGGMOBILE4_PAIN,
|
|
||||||
S_EGGMOBILE4_DIE1,
|
S_EGGMOBILE4_DIE1,
|
||||||
S_EGGMOBILE4_DIE2,
|
S_EGGMOBILE4_DIE2,
|
||||||
S_EGGMOBILE4_DIE3,
|
S_EGGMOBILE4_DIE3,
|
||||||
|
@ -1531,10 +1529,21 @@ typedef enum state
|
||||||
S_EGGMOBILE4_FLEE1,
|
S_EGGMOBILE4_FLEE1,
|
||||||
S_EGGMOBILE4_FLEE2,
|
S_EGGMOBILE4_FLEE2,
|
||||||
S_EGGMOBILE4_MACE,
|
S_EGGMOBILE4_MACE,
|
||||||
|
S_EGGMOBILE4_MACE_DIE1,
|
||||||
|
S_EGGMOBILE4_MACE_DIE2,
|
||||||
|
S_EGGMOBILE4_MACE_DIE3,
|
||||||
|
|
||||||
// Boss 4 jet flame
|
// Boss 4 jet flame
|
||||||
S_JETFLAME1,
|
S_JETFLAME,
|
||||||
S_JETFLAME2,
|
|
||||||
|
// Boss 4 Spectator Eggrobo
|
||||||
|
S_EGGROBO1_STND,
|
||||||
|
S_EGGROBO1_BSLAP1,
|
||||||
|
S_EGGROBO1_BSLAP2,
|
||||||
|
S_EGGROBO1_PISSED,
|
||||||
|
|
||||||
|
// Boss 4 Spectator Eggrobo jet flame
|
||||||
|
S_EGGROBOJET,
|
||||||
|
|
||||||
// Boss 5
|
// Boss 5
|
||||||
S_FANG_IDLE1,
|
S_FANG_IDLE1,
|
||||||
|
@ -1887,7 +1896,10 @@ typedef enum state
|
||||||
S_METALSONIC_BADBOUNCE,
|
S_METALSONIC_BADBOUNCE,
|
||||||
S_METALSONIC_SHOOT,
|
S_METALSONIC_SHOOT,
|
||||||
S_METALSONIC_PAIN,
|
S_METALSONIC_PAIN,
|
||||||
S_METALSONIC_DEATH,
|
S_METALSONIC_DEATH1,
|
||||||
|
S_METALSONIC_DEATH2,
|
||||||
|
S_METALSONIC_DEATH3,
|
||||||
|
S_METALSONIC_DEATH4,
|
||||||
S_METALSONIC_FLEE1,
|
S_METALSONIC_FLEE1,
|
||||||
S_METALSONIC_FLEE2,
|
S_METALSONIC_FLEE2,
|
||||||
S_METALSONIC_FLEE3,
|
S_METALSONIC_FLEE3,
|
||||||
|
@ -2925,6 +2937,12 @@ typedef enum state
|
||||||
S_PITY4,
|
S_PITY4,
|
||||||
S_PITY5,
|
S_PITY5,
|
||||||
S_PITY6,
|
S_PITY6,
|
||||||
|
S_PITY7,
|
||||||
|
S_PITY8,
|
||||||
|
S_PITY9,
|
||||||
|
S_PITY10,
|
||||||
|
S_PITY11,
|
||||||
|
S_PITY12,
|
||||||
|
|
||||||
S_FIRS1,
|
S_FIRS1,
|
||||||
S_FIRS2,
|
S_FIRS2,
|
||||||
|
@ -3409,6 +3427,12 @@ typedef enum state
|
||||||
|
|
||||||
S_LOCKON1,
|
S_LOCKON1,
|
||||||
S_LOCKON2,
|
S_LOCKON2,
|
||||||
|
S_LOCKON3,
|
||||||
|
S_LOCKON4,
|
||||||
|
S_LOCKONINF1,
|
||||||
|
S_LOCKONINF2,
|
||||||
|
S_LOCKONINF3,
|
||||||
|
S_LOCKONINF4,
|
||||||
|
|
||||||
// Tag Sign
|
// Tag Sign
|
||||||
S_TTAG,
|
S_TTAG,
|
||||||
|
@ -3417,6 +3441,7 @@ typedef enum state
|
||||||
S_GOTFLAG,
|
S_GOTFLAG,
|
||||||
|
|
||||||
S_CORK,
|
S_CORK,
|
||||||
|
S_LHRT,
|
||||||
|
|
||||||
// Red Ring
|
// Red Ring
|
||||||
S_RRNG1,
|
S_RRNG1,
|
||||||
|
@ -3923,6 +3948,9 @@ typedef enum state
|
||||||
S_ROCKCRUMBLEO,
|
S_ROCKCRUMBLEO,
|
||||||
S_ROCKCRUMBLEP,
|
S_ROCKCRUMBLEP,
|
||||||
|
|
||||||
|
// Bricks
|
||||||
|
S_BRICKDEBRIS,
|
||||||
|
|
||||||
#ifdef SEENAMES
|
#ifdef SEENAMES
|
||||||
S_NAMECHECK,
|
S_NAMECHECK,
|
||||||
#endif
|
#endif
|
||||||
|
@ -4026,11 +4054,14 @@ typedef enum mobj_type
|
||||||
MT_EGGMOBILE3,
|
MT_EGGMOBILE3,
|
||||||
MT_PROPELLER,
|
MT_PROPELLER,
|
||||||
MT_FAKEMOBILE,
|
MT_FAKEMOBILE,
|
||||||
|
MT_SHOCK,
|
||||||
|
|
||||||
// Boss 4
|
// Boss 4
|
||||||
MT_EGGMOBILE4,
|
MT_EGGMOBILE4,
|
||||||
MT_EGGMOBILE4_MACE,
|
MT_EGGMOBILE4_MACE,
|
||||||
MT_JETFLAME,
|
MT_JETFLAME,
|
||||||
|
MT_EGGROBO1,
|
||||||
|
MT_EGGROBO1JET,
|
||||||
|
|
||||||
// Boss 5
|
// Boss 5
|
||||||
MT_FANG,
|
MT_FANG,
|
||||||
|
@ -4507,6 +4538,7 @@ typedef enum mobj_type
|
||||||
MT_DROWNNUMBERS, // Drowning Timer
|
MT_DROWNNUMBERS, // Drowning Timer
|
||||||
MT_GOTEMERALD, // Chaos Emerald (intangible)
|
MT_GOTEMERALD, // Chaos Emerald (intangible)
|
||||||
MT_LOCKON, // Target
|
MT_LOCKON, // Target
|
||||||
|
MT_LOCKONINF, // In-level Target
|
||||||
MT_TAG, // Tag Sign
|
MT_TAG, // Tag Sign
|
||||||
MT_GOTFLAG, // Got Flag sign
|
MT_GOTFLAG, // Got Flag sign
|
||||||
|
|
||||||
|
@ -4524,6 +4556,7 @@ typedef enum mobj_type
|
||||||
MT_MACHINEAMBIENCE,
|
MT_MACHINEAMBIENCE,
|
||||||
|
|
||||||
MT_CORK,
|
MT_CORK,
|
||||||
|
MT_LHRT,
|
||||||
|
|
||||||
// Ring Weapons
|
// Ring Weapons
|
||||||
MT_REDRING,
|
MT_REDRING,
|
||||||
|
@ -4657,6 +4690,9 @@ typedef enum mobj_type
|
||||||
MT_ROCKCRUMBLE15,
|
MT_ROCKCRUMBLE15,
|
||||||
MT_ROCKCRUMBLE16,
|
MT_ROCKCRUMBLE16,
|
||||||
|
|
||||||
|
// Bricks
|
||||||
|
MT_BRICKDEBRIS,
|
||||||
|
|
||||||
#ifdef SEENAMES
|
#ifdef SEENAMES
|
||||||
MT_NAMECHECK,
|
MT_NAMECHECK,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -540,6 +540,7 @@ static int lib_pSpawnLockOn(lua_State *L)
|
||||||
{
|
{
|
||||||
mobj_t *visual = P_SpawnMobj(lockon->x, lockon->y, lockon->z, MT_LOCKON); // positioning, flip handled in P_SceneryThinker
|
mobj_t *visual = P_SpawnMobj(lockon->x, lockon->y, lockon->z, MT_LOCKON); // positioning, flip handled in P_SceneryThinker
|
||||||
visual->target = lockon;
|
visual->target = lockon;
|
||||||
|
visual->flags2 |= MF2_DONTDRAW;
|
||||||
P_SetMobjStateNF(visual, state);
|
P_SetMobjStateNF(visual, state);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -951,6 +952,21 @@ static int lib_pResetPlayer(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lib_pPlayerCanDamage(lua_State *L)
|
||||||
|
{
|
||||||
|
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||||
|
mobj_t *thing = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
|
||||||
|
NOHUD // was hud safe but then i added a lua hook
|
||||||
|
INLEVEL
|
||||||
|
if (!player)
|
||||||
|
return LUA_ErrInvalid(L, "player_t");
|
||||||
|
if (!thing)
|
||||||
|
return LUA_ErrInvalid(L, "mobj_t");
|
||||||
|
lua_pushboolean(L, P_PlayerCanDamage(player, thing));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int lib_pIsObjectInGoop(lua_State *L)
|
static int lib_pIsObjectInGoop(lua_State *L)
|
||||||
{
|
{
|
||||||
mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
|
mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
|
||||||
|
@ -1219,8 +1235,8 @@ static int lib_pHomingAttack(lua_State *L)
|
||||||
INLEVEL
|
INLEVEL
|
||||||
if (!source || !enemy)
|
if (!source || !enemy)
|
||||||
return LUA_ErrInvalid(L, "mobj_t");
|
return LUA_ErrInvalid(L, "mobj_t");
|
||||||
P_HomingAttack(source, enemy);
|
lua_pushboolean(L, P_HomingAttack(source, enemy));
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lib_pSuperReady(lua_State *L)
|
static int lib_pSuperReady(lua_State *L)
|
||||||
|
@ -2774,6 +2790,7 @@ static luaL_Reg lib[] = {
|
||||||
{"P_PlayerInPain",lib_pPlayerInPain},
|
{"P_PlayerInPain",lib_pPlayerInPain},
|
||||||
{"P_DoPlayerPain",lib_pDoPlayerPain},
|
{"P_DoPlayerPain",lib_pDoPlayerPain},
|
||||||
{"P_ResetPlayer",lib_pResetPlayer},
|
{"P_ResetPlayer",lib_pResetPlayer},
|
||||||
|
{"P_PlayerCanDamage",lib_pPlayerCanDamage},
|
||||||
{"P_IsObjectInGoop",lib_pIsObjectInGoop},
|
{"P_IsObjectInGoop",lib_pIsObjectInGoop},
|
||||||
{"P_IsObjectOnGround",lib_pIsObjectOnGround},
|
{"P_IsObjectOnGround",lib_pIsObjectOnGround},
|
||||||
{"P_InSpaceSector",lib_pInSpaceSector},
|
{"P_InSpaceSector",lib_pInSpaceSector},
|
||||||
|
|
|
@ -48,6 +48,7 @@ enum hook {
|
||||||
hook_MobjMoveBlocked,
|
hook_MobjMoveBlocked,
|
||||||
hook_MapThingSpawn,
|
hook_MapThingSpawn,
|
||||||
hook_FollowMobj,
|
hook_FollowMobj,
|
||||||
|
hook_PlayerCanDamage,
|
||||||
hook_PlayerQuit,
|
hook_PlayerQuit,
|
||||||
|
|
||||||
hook_MAX // last hook
|
hook_MAX // last hook
|
||||||
|
@ -87,7 +88,8 @@ boolean LUAh_HurtMsg(player_t *player, mobj_t *inflictor, mobj_t *source, UINT8
|
||||||
#define LUAh_ShieldSpecial(player) LUAh_PlayerHook(player, hook_ShieldSpecial) // Hook for shield abilities
|
#define LUAh_ShieldSpecial(player) LUAh_PlayerHook(player, hook_ShieldSpecial) // Hook for shield abilities
|
||||||
#define LUAh_MobjMoveBlocked(mo) LUAh_MobjHook(mo, hook_MobjMoveBlocked) // Hook for P_XYMovement (when movement is blocked)
|
#define LUAh_MobjMoveBlocked(mo) LUAh_MobjHook(mo, hook_MobjMoveBlocked) // Hook for P_XYMovement (when movement is blocked)
|
||||||
boolean LUAh_MapThingSpawn(mobj_t *mo, mapthing_t *mthing); // Hook for P_SpawnMapThing by mobj type
|
boolean LUAh_MapThingSpawn(mobj_t *mo, mapthing_t *mthing); // Hook for P_SpawnMapThing by mobj type
|
||||||
boolean LUAh_FollowMobj(player_t *player, mobj_t *mo); // Hook for P_PlayerAfterThink Smiles mobj-following
|
boolean LUAh_FollowMobj(player_t *player, mobj_t *mobj); // Hook for P_PlayerAfterThink Smiles mobj-following
|
||||||
|
UINT8 LUAh_PlayerCanDamage(player_t *player, mobj_t *mobj); // Hook for P_PlayerCanDamage
|
||||||
void LUAh_PlayerQuit(player_t *plr, int reason); // Hook for player quitting
|
void LUAh_PlayerQuit(player_t *plr, int reason); // Hook for player quitting
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
1182
src/lua_hooklib.c
1182
src/lua_hooklib.c
File diff suppressed because it is too large
Load Diff
|
@ -670,8 +670,8 @@ static int libd_getColormap(lua_State *L)
|
||||||
else if (lua_type(L, 1) == LUA_TNUMBER) // skin number
|
else if (lua_type(L, 1) == LUA_TNUMBER) // skin number
|
||||||
{
|
{
|
||||||
skinnum = (INT32)luaL_checkinteger(L, 1);
|
skinnum = (INT32)luaL_checkinteger(L, 1);
|
||||||
if (skinnum < TC_ALLWHITE || skinnum >= MAXSKINS)
|
if (skinnum < TC_BLINK || skinnum >= MAXSKINS)
|
||||||
return luaL_error(L, "skin number %d is out of range (%d - %d)", skinnum, TC_ALLWHITE, MAXSKINS-1);
|
return luaL_error(L, "skin number %d is out of range (%d - %d)", skinnum, TC_BLINK, MAXSKINS-1);
|
||||||
}
|
}
|
||||||
else // skin name
|
else // skin name
|
||||||
{
|
{
|
||||||
|
|
|
@ -83,12 +83,11 @@ enum mobj_e {
|
||||||
mobj_extravalue1,
|
mobj_extravalue1,
|
||||||
mobj_extravalue2,
|
mobj_extravalue2,
|
||||||
mobj_cusval,
|
mobj_cusval,
|
||||||
#ifdef ESLOPE
|
|
||||||
mobj_cvmem,
|
mobj_cvmem,
|
||||||
mobj_standingslope
|
#ifdef ESLOPE
|
||||||
#else
|
mobj_standingslope,
|
||||||
mobj_cvmem
|
|
||||||
#endif
|
#endif
|
||||||
|
mobj_colorized
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *const mobj_opt[] = {
|
static const char *const mobj_opt[] = {
|
||||||
|
@ -154,6 +153,7 @@ static const char *const mobj_opt[] = {
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
"standingslope",
|
"standingslope",
|
||||||
#endif
|
#endif
|
||||||
|
"colorized",
|
||||||
NULL};
|
NULL};
|
||||||
|
|
||||||
#define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field])
|
#define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field])
|
||||||
|
@ -371,6 +371,9 @@ static int mobj_get(lua_State *L)
|
||||||
LUA_PushUserdata(L, mo->standingslope, META_SLOPE);
|
LUA_PushUserdata(L, mo->standingslope, META_SLOPE);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
case mobj_colorized:
|
||||||
|
lua_pushboolean(L, mo->colorized);
|
||||||
|
break;
|
||||||
default: // extra custom variables in Lua memory
|
default: // extra custom variables in Lua memory
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
||||||
I_Assert(lua_istable(L, -1));
|
I_Assert(lua_istable(L, -1));
|
||||||
|
@ -692,6 +695,9 @@ static int mobj_set(lua_State *L)
|
||||||
case mobj_standingslope:
|
case mobj_standingslope:
|
||||||
return NOSET;
|
return NOSET;
|
||||||
#endif
|
#endif
|
||||||
|
case mobj_colorized:
|
||||||
|
mo->colorized = luaL_checkboolean(L, 3);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
||||||
I_Assert(lua_istable(L, -1));
|
I_Assert(lua_istable(L, -1));
|
||||||
|
|
|
@ -2953,8 +2953,9 @@ boolean M_Responder(event_t *ev)
|
||||||
return true;
|
return true;
|
||||||
M_StartControlPanel();
|
M_StartControlPanel();
|
||||||
M_Options(0);
|
M_Options(0);
|
||||||
currentMenu = &OP_SoundOptionsDef;
|
// Uncomment the below if you want the menu to reset to the top each time like before. M_SetupNextMenu will fix it automatically.
|
||||||
itemOn = 0;
|
//OP_SoundOptionsDef.lastOn = 0;
|
||||||
|
M_SetupNextMenu(&OP_SoundOptionsDef);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case KEY_F5: // Video Mode
|
case KEY_F5: // Video Mode
|
||||||
|
|
183
src/p_enemy.c
183
src/p_enemy.c
|
@ -2348,7 +2348,7 @@ void A_VultureHover(mobj_t *actor)
|
||||||
fixed_t targetz;
|
fixed_t targetz;
|
||||||
fixed_t distdif;
|
fixed_t distdif;
|
||||||
fixed_t memz = actor->z;
|
fixed_t memz = actor->z;
|
||||||
INT8 i;
|
SINT8 i;
|
||||||
|
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
if (LUA_CallAction("A_VultureHover", actor))
|
if (LUA_CallAction("A_VultureHover", actor))
|
||||||
|
@ -2411,6 +2411,8 @@ void A_VultureBlast(mobj_t *actor)
|
||||||
{
|
{
|
||||||
mobj_t *dust;
|
mobj_t *dust;
|
||||||
UINT8 i;
|
UINT8 i;
|
||||||
|
angle_t faa;
|
||||||
|
fixed_t faacos, faasin;
|
||||||
|
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
if (LUA_CallAction("A_VultureBlast", actor))
|
if (LUA_CallAction("A_VultureBlast", actor))
|
||||||
|
@ -2419,18 +2421,21 @@ void A_VultureBlast(mobj_t *actor)
|
||||||
|
|
||||||
S_StartSound(actor, actor->info->attacksound);
|
S_StartSound(actor, actor->info->attacksound);
|
||||||
|
|
||||||
|
faa = (actor->angle >> ANGLETOFINESHIFT) & FINEMASK;
|
||||||
|
faacos = FINECOSINE(faa);
|
||||||
|
faasin = FINESINE(faa);
|
||||||
|
|
||||||
for (i = 0; i <= 7; i++)
|
for (i = 0; i <= 7; i++)
|
||||||
{
|
{
|
||||||
angle_t fa = ((i*(angle_t)ANGLE_45) >> ANGLETOFINESHIFT) & FINEMASK;
|
angle_t fa = ((i*(angle_t)ANGLE_45) >> ANGLETOFINESHIFT) & FINEMASK;
|
||||||
angle_t faa = (actor->angle >> ANGLETOFINESHIFT) & FINEMASK;
|
dust = P_SpawnMobj(actor->x + 48*FixedMul(FINECOSINE(fa), -faasin), actor->y + 48*FixedMul(FINECOSINE(fa), faacos), actor->z + actor->height/2 + 48*FINESINE(fa), MT_PARTICLE);
|
||||||
dust = P_SpawnMobj(actor->x + 48*FixedMul(FINECOSINE(fa), -FINESINE(faa)), actor->y + 48*FixedMul(FINECOSINE(fa), FINECOSINE(faa)), actor->z + actor->height/2 + 48*FINESINE(fa), MT_PARTICLE);
|
|
||||||
|
|
||||||
P_SetScale(dust, 4*FRACUNIT);
|
P_SetScale(dust, 4*FRACUNIT);
|
||||||
dust->destscale = FRACUNIT;
|
dust->destscale = FRACUNIT;
|
||||||
dust->scalespeed = 4*FRACUNIT/TICRATE;
|
dust->scalespeed = 4*FRACUNIT/TICRATE;
|
||||||
dust->fuse = TICRATE;
|
dust->fuse = TICRATE;
|
||||||
dust->momx = FixedMul(FINECOSINE(fa), -FINESINE(faa))*3;
|
dust->momx = FixedMul(FINECOSINE(fa), -faasin)*3;
|
||||||
dust->momy = FixedMul(FINECOSINE(fa), FINECOSINE(faa))*3;
|
dust->momy = FixedMul(FINECOSINE(fa), faacos)*3;
|
||||||
dust->momz = FINESINE(fa)*6;
|
dust->momz = FINESINE(fa)*6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2858,6 +2863,7 @@ void A_BossFireShot(mobj_t *actor)
|
||||||
fixed_t x, y, z;
|
fixed_t x, y, z;
|
||||||
INT32 locvar1 = var1;
|
INT32 locvar1 = var1;
|
||||||
INT32 locvar2 = var2;
|
INT32 locvar2 = var2;
|
||||||
|
mobj_t *missile;
|
||||||
|
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
if (LUA_CallAction("A_BossFireShot", actor))
|
if (LUA_CallAction("A_BossFireShot", actor))
|
||||||
|
@ -2925,7 +2931,10 @@ void A_BossFireShot(mobj_t *actor)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
P_SpawnXYZMissile(actor, actor->target, locvar1, x, y, z);
|
missile = P_SpawnXYZMissile(actor, actor->target, locvar1, x, y, z);
|
||||||
|
|
||||||
|
if (missile && actor->tracer && (actor->tracer->flags & MF_BOSS)) // Don't harm your papa.
|
||||||
|
P_SetTarget(&missile->target, actor->tracer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function: A_Boss7FireMissiles
|
// Function: A_Boss7FireMissiles
|
||||||
|
@ -3154,21 +3163,35 @@ void A_FocusTarget(mobj_t *actor)
|
||||||
// Description: Reverse arms direction.
|
// Description: Reverse arms direction.
|
||||||
//
|
//
|
||||||
// var1 = sfx to play
|
// var1 = sfx to play
|
||||||
// var2 = unused
|
// var2 = sfx to play in pinch
|
||||||
//
|
//
|
||||||
void A_Boss4Reverse(mobj_t *actor)
|
void A_Boss4Reverse(mobj_t *actor)
|
||||||
{
|
{
|
||||||
sfxenum_t locvar1 = (sfxenum_t)var1;
|
sfxenum_t locvar1 = (sfxenum_t)var1;
|
||||||
|
sfxenum_t locvar2 = (sfxenum_t)var2;
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
if (LUA_CallAction("A_Boss4Reverse", actor))
|
if (LUA_CallAction("A_Boss4Reverse", actor))
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
S_StartSound(NULL, locvar1);
|
|
||||||
actor->reactiontime = 0;
|
actor->reactiontime = 0;
|
||||||
if (actor->movedir == 1)
|
if (actor->movedir < 3)
|
||||||
actor->movedir = 2;
|
{
|
||||||
|
S_StartSound(NULL, locvar1);
|
||||||
|
if (actor->movedir == 1)
|
||||||
|
actor->movedir = 2;
|
||||||
|
else
|
||||||
|
actor->movedir = 1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
actor->movedir = 1;
|
{
|
||||||
|
S_StartSound(NULL, locvar2);
|
||||||
|
if (actor->movedir == 4)
|
||||||
|
actor->movedir = 5;
|
||||||
|
else
|
||||||
|
actor->movedir = 4;
|
||||||
|
actor->angle += ANGLE_180;
|
||||||
|
actor->movefactor = -actor->movefactor;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function: A_Boss4SpeedUp
|
// Function: A_Boss4SpeedUp
|
||||||
|
@ -6622,6 +6645,9 @@ void A_RecyclePowers(mobj_t *actor)
|
||||||
players[recv_pl].ringweapons = weapons[send_pl];
|
players[recv_pl].ringweapons = weapons[send_pl];
|
||||||
players[recv_pl].currentweapon = weaponheld[send_pl];
|
players[recv_pl].currentweapon = weaponheld[send_pl];
|
||||||
|
|
||||||
|
if (((players[recv_pl].powers[pw_shield] & SH_NOSTACK) == SH_PINK) && (players[recv_pl].revitem == MT_LHRT || players[recv_pl].spinitem == MT_LHRT || players[recv_pl].thokitem == MT_LHRT)) // Healers can't keep their buff.
|
||||||
|
players[recv_pl].powers[pw_shield] &= SH_STACK;
|
||||||
|
|
||||||
P_SpawnShieldOrb(&players[recv_pl]);
|
P_SpawnShieldOrb(&players[recv_pl]);
|
||||||
if (P_IsLocalPlayer(&players[recv_pl]))
|
if (P_IsLocalPlayer(&players[recv_pl]))
|
||||||
P_RestoreMusic(&players[recv_pl]);
|
P_RestoreMusic(&players[recv_pl]);
|
||||||
|
@ -7753,9 +7779,11 @@ void A_Boss3TakeDamage(mobj_t *actor)
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
actor->movecount = var1;
|
actor->movecount = var1;
|
||||||
|
actor->movefactor = -512*FRACUNIT;
|
||||||
|
|
||||||
|
/*if (actor->target && actor->target->spawnpoint)
|
||||||
|
actor->threshold = actor->target->spawnpoint->extrainfo;*/
|
||||||
|
|
||||||
if (actor->target && actor->target->spawnpoint)
|
|
||||||
actor->threshold = actor->target->spawnpoint->extrainfo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function: A_Boss3Path
|
// Function: A_Boss3Path
|
||||||
|
@ -7792,21 +7820,31 @@ void A_Boss3Path(mobj_t *actor)
|
||||||
}
|
}
|
||||||
else if (actor->threshold >= 0) // Traveling mode
|
else if (actor->threshold >= 0) // Traveling mode
|
||||||
{
|
{
|
||||||
thinker_t *th;
|
fixed_t dist = 0;
|
||||||
mobj_t *mo2;
|
|
||||||
fixed_t dist, dist2;
|
|
||||||
fixed_t speed;
|
fixed_t speed;
|
||||||
|
|
||||||
P_SetTarget(&actor->target, NULL);
|
if (!(actor->flags2 & MF2_STRONGBOX))
|
||||||
|
|
||||||
// scan the thinkers
|
|
||||||
// to find a point that matches
|
|
||||||
// the number
|
|
||||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
|
||||||
{
|
{
|
||||||
mo2 = (mobj_t *)th;
|
thinker_t *th;
|
||||||
if (mo2->type == MT_BOSS3WAYPOINT && mo2->spawnpoint && mo2->spawnpoint->angle == actor->threshold)
|
mobj_t *mo2;
|
||||||
|
|
||||||
|
P_SetTarget(&actor->target, NULL);
|
||||||
|
|
||||||
|
// scan the thinkers
|
||||||
|
// to find a point that matches
|
||||||
|
// the number
|
||||||
|
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||||
{
|
{
|
||||||
|
mo2 = (mobj_t *)th;
|
||||||
|
if (mo2->type != MT_BOSS3WAYPOINT)
|
||||||
|
continue;
|
||||||
|
if (!mo2->spawnpoint)
|
||||||
|
continue;
|
||||||
|
if (mo2->spawnpoint->angle != actor->threshold)
|
||||||
|
continue;
|
||||||
|
if (mo2->spawnpoint->extrainfo != actor->cusval)
|
||||||
|
continue;
|
||||||
|
|
||||||
P_SetTarget(&actor->target, mo2);
|
P_SetTarget(&actor->target, mo2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -7814,67 +7852,62 @@ void A_Boss3Path(mobj_t *actor)
|
||||||
|
|
||||||
if (!actor->target) // Should NEVER happen
|
if (!actor->target) // Should NEVER happen
|
||||||
{
|
{
|
||||||
CONS_Debug(DBG_GAMELOGIC, "Error: Boss 3 Dummy was unable to find specified waypoint: %d\n", actor->threshold);
|
CONS_Debug(DBG_GAMELOGIC, "Error: Boss 3 Dummy was unable to find specified waypoint: %d, %d\n", actor->threshold, actor->cusval);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dist = P_AproxDistance(P_AproxDistance(actor->target->x - actor->x, actor->target->y - actor->y), actor->target->z - actor->z);
|
|
||||||
|
|
||||||
if (dist < 1)
|
|
||||||
dist = 1;
|
|
||||||
|
|
||||||
if (actor->tracer && ((actor->tracer->movedir)
|
if (actor->tracer && ((actor->tracer->movedir)
|
||||||
|| (actor->tracer->health <= actor->tracer->info->damage)))
|
|| (actor->tracer->health <= actor->tracer->info->damage)))
|
||||||
speed = actor->info->speed * 2;
|
speed = actor->info->speed * 2;
|
||||||
else
|
else
|
||||||
speed = actor->info->speed;
|
speed = actor->info->speed;
|
||||||
|
|
||||||
actor->momx = FixedMul(FixedDiv(actor->target->x - actor->x, dist), speed);
|
if (actor->target->x == actor->x && actor->target->y == actor->y)
|
||||||
actor->momy = FixedMul(FixedDiv(actor->target->y - actor->y, dist), speed);
|
{
|
||||||
actor->momz = FixedMul(FixedDiv(actor->target->z - actor->z, dist), speed);
|
dist = P_AproxDistance(P_AproxDistance(actor->target->x - actor->x, actor->target->y - actor->y), actor->target->z + actor->movefactor - actor->z);
|
||||||
|
|
||||||
if (actor->momx != 0 || actor->momy != 0)
|
if (dist < 1)
|
||||||
actor->angle = R_PointToAngle2(0, 0, actor->momx, actor->momy);
|
dist = 1;
|
||||||
|
|
||||||
dist2 = P_AproxDistance(P_AproxDistance(actor->target->x - (actor->x + actor->momx), actor->target->y - (actor->y + actor->momy)), actor->target->z - (actor->z + actor->momz));
|
actor->momx = FixedMul(FixedDiv(actor->target->x - actor->x, dist), speed);
|
||||||
|
actor->momy = FixedMul(FixedDiv(actor->target->y - actor->y, dist), speed);
|
||||||
|
actor->momz = FixedMul(FixedDiv(actor->target->z + actor->movefactor - actor->z, dist), speed);
|
||||||
|
|
||||||
if (dist2 < 1)
|
if (actor->momx != 0 || actor->momy != 0)
|
||||||
dist2 = 1;
|
actor->angle = R_PointToAngle2(0, 0, actor->momx, actor->momy);
|
||||||
|
}
|
||||||
|
|
||||||
if ((dist >> FRACBITS) <= (dist2 >> FRACBITS))
|
if (dist <= speed)
|
||||||
{
|
{
|
||||||
// If further away, set XYZ of mobj to waypoint location
|
// If further away, set XYZ of mobj to waypoint location
|
||||||
P_UnsetThingPosition(actor);
|
P_UnsetThingPosition(actor);
|
||||||
actor->x = actor->target->x;
|
actor->x = actor->target->x;
|
||||||
actor->y = actor->target->y;
|
actor->y = actor->target->y;
|
||||||
actor->z = actor->target->z;
|
actor->z = actor->target->z + actor->movefactor;
|
||||||
actor->momx = actor->momy = actor->momz = 0;
|
actor->momx = actor->momy = actor->momz = 0;
|
||||||
P_SetThingPosition(actor);
|
P_SetThingPosition(actor);
|
||||||
|
|
||||||
if (actor->threshold == 0)
|
if (!actor->movefactor) // firing mode
|
||||||
|
{
|
||||||
|
actor->movecount |= 2;
|
||||||
|
actor->movefactor = -512*FRACUNIT;
|
||||||
|
actor->flags2 &= ~MF2_STRONGBOX;
|
||||||
|
}
|
||||||
|
else if (!(actor->flags2 & MF2_STRONGBOX)) // just spawned or going down
|
||||||
|
{
|
||||||
|
actor->flags2 |= MF2_STRONGBOX;
|
||||||
|
actor->movefactor = -512*FRACUNIT;
|
||||||
|
}
|
||||||
|
else if (!(actor->flags2 & MF2_AMBUSH)) // just shifted tube
|
||||||
|
{
|
||||||
|
actor->flags2 |= MF2_AMBUSH;
|
||||||
|
actor->movefactor = 0;
|
||||||
|
}
|
||||||
|
else // just hit the bottom of your tube
|
||||||
{
|
{
|
||||||
P_RemoveMobj(actor); // Cycle completed. Dummy removed.
|
P_RemoveMobj(actor); // Cycle completed. Dummy removed.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set to next waypoint in sequence
|
|
||||||
if (actor->target->spawnpoint)
|
|
||||||
{
|
|
||||||
// From the center point, choose one of the five paths
|
|
||||||
if (actor->target->spawnpoint->angle == 0)
|
|
||||||
{
|
|
||||||
P_RemoveMobj(actor); // Cycle completed. Dummy removed.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
actor->threshold = actor->target->spawnpoint->extrainfo;
|
|
||||||
|
|
||||||
// If the deaf flag is set, go into firing mode
|
|
||||||
if (actor->target->spawnpoint->options & MTF_AMBUSH)
|
|
||||||
actor->movecount |= 2;
|
|
||||||
}
|
|
||||||
else // This should never happen, as well
|
|
||||||
CONS_Debug(DBG_GAMELOGIC, "Error: Boss 3 Dummy waypoint has no spawnpoint associated with it.\n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8666,8 +8699,8 @@ void A_BossJetFume(mobj_t *actor)
|
||||||
{
|
{
|
||||||
fixed_t jetx, jety, jetz;
|
fixed_t jetx, jety, jetz;
|
||||||
|
|
||||||
jetx = actor->x + P_ReturnThrustX(actor, actor->angle, -FixedMul(60*FRACUNIT, actor->scale));
|
jetx = actor->x + P_ReturnThrustX(actor, actor->angle, -60*actor->scale);
|
||||||
jety = actor->y + P_ReturnThrustY(actor, actor->angle, -FixedMul(60*FRACUNIT, actor->scale));
|
jety = actor->y + P_ReturnThrustY(actor, actor->angle, -60*actor->scale);
|
||||||
if (actor->eflags & MFE_VERTICALFLIP)
|
if (actor->eflags & MFE_VERTICALFLIP)
|
||||||
jetz = actor->z + actor->height - FixedMul(17*FRACUNIT + mobjinfo[MT_PROPELLER].height, actor->scale);
|
jetz = actor->z + actor->height - FixedMul(17*FRACUNIT + mobjinfo[MT_PROPELLER].height, actor->scale);
|
||||||
else
|
else
|
||||||
|
@ -8700,7 +8733,7 @@ void A_BossJetFume(mobj_t *actor)
|
||||||
if (actor->eflags & MFE_VERTICALFLIP)
|
if (actor->eflags & MFE_VERTICALFLIP)
|
||||||
jetz = actor->z + actor->height + FixedMul(50*FRACUNIT - mobjinfo[MT_JETFLAME].height, actor->scale);
|
jetz = actor->z + actor->height + FixedMul(50*FRACUNIT - mobjinfo[MT_JETFLAME].height, actor->scale);
|
||||||
else
|
else
|
||||||
jetz = actor->z - FixedMul(50*FRACUNIT, actor->scale);
|
jetz = actor->z - 50*actor->scale;
|
||||||
filler = P_SpawnMobj(actor->x, actor->y, jetz, MT_JETFLAME);
|
filler = P_SpawnMobj(actor->x, actor->y, jetz, MT_JETFLAME);
|
||||||
P_SetTarget(&filler->target, actor);
|
P_SetTarget(&filler->target, actor);
|
||||||
// Boss 4 already uses its tracer for other things
|
// Boss 4 already uses its tracer for other things
|
||||||
|
@ -8709,6 +8742,30 @@ void A_BossJetFume(mobj_t *actor)
|
||||||
if (actor->eflags & MFE_VERTICALFLIP)
|
if (actor->eflags & MFE_VERTICALFLIP)
|
||||||
filler->flags2 |= MF2_OBJECTFLIP;
|
filler->flags2 |= MF2_OBJECTFLIP;
|
||||||
}
|
}
|
||||||
|
else if (locvar1 == 4) // Boss 4 Spectator Eggrobo jet flame
|
||||||
|
{
|
||||||
|
fixed_t jetx, jety, jetz, movefactor = 12;
|
||||||
|
|
||||||
|
jetz = actor->z;
|
||||||
|
if (actor->eflags & MFE_VERTICALFLIP)
|
||||||
|
jetz += (actor->height - FixedMul(mobjinfo[MT_EGGROBO1JET].height, actor->scale));
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
jetx = actor->x + P_ReturnThrustX(actor, actor->angle+ANGLE_90, movefactor*actor->scale) - P_ReturnThrustX(actor, actor->angle, 19*actor->scale);
|
||||||
|
jety = actor->y + P_ReturnThrustY(actor, actor->angle+ANGLE_90, movefactor*actor->scale) - P_ReturnThrustY(actor, actor->angle, 19*actor->scale);
|
||||||
|
filler = P_SpawnMobj(jetx, jety, jetz, MT_EGGROBO1JET);
|
||||||
|
filler->movefactor = movefactor;
|
||||||
|
P_SetTarget(&filler->target, actor);
|
||||||
|
filler->destscale = actor->scale;
|
||||||
|
P_SetScale(filler, filler->destscale);
|
||||||
|
if (actor->eflags & MFE_VERTICALFLIP)
|
||||||
|
filler->flags2 |= MF2_OBJECTFLIP;
|
||||||
|
if (movefactor <= 0)
|
||||||
|
break;
|
||||||
|
movefactor = -movefactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function: A_RandomState
|
// Function: A_RandomState
|
||||||
|
|
|
@ -3130,7 +3130,7 @@ void EV_CrumbleChain(sector_t *sec, ffloor_t *rover)
|
||||||
// no longer exists (can't collide with again)
|
// no longer exists (can't collide with again)
|
||||||
rover->flags &= ~FF_EXISTS;
|
rover->flags &= ~FF_EXISTS;
|
||||||
rover->master->frontsector->moved = true;
|
rover->master->frontsector->moved = true;
|
||||||
sec->moved = true;
|
P_RecalcPrecipInSector(sec);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Used for bobbing platforms on the water
|
// Used for bobbing platforms on the water
|
||||||
|
|
151
src/p_inter.c
151
src/p_inter.c
|
@ -315,6 +315,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
// Can happen with a sliding player corpse.
|
// Can happen with a sliding player corpse.
|
||||||
if (toucher->health <= 0)
|
if (toucher->health <= 0)
|
||||||
return;
|
return;
|
||||||
|
if (special->health <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
if (heightcheck)
|
if (heightcheck)
|
||||||
{
|
{
|
||||||
|
@ -340,9 +342,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (special->health <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
player = toucher->player;
|
player = toucher->player;
|
||||||
I_Assert(player != NULL); // Only players can touch stuff!
|
I_Assert(player != NULL); // Only players can touch stuff!
|
||||||
|
|
||||||
|
@ -447,13 +446,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((player->powers[pw_carry] == CR_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|
if (P_PlayerCanDamage(player, special)) // Do you possess the ability to subdue the object?
|
||||||
|| ((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 || 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?
|
|
||||||
{
|
{
|
||||||
if ((P_MobjFlip(toucher)*toucher->momz < 0) && (elementalpierce != 1))
|
if ((P_MobjFlip(toucher)*toucher->momz < 0) && (elementalpierce != 1))
|
||||||
{
|
{
|
||||||
|
@ -468,18 +461,12 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
{
|
{
|
||||||
toucher->momx = -toucher->momx;
|
toucher->momx = -toucher->momx;
|
||||||
toucher->momy = -toucher->momy;
|
toucher->momy = -toucher->momy;
|
||||||
|
if (player->charability == CA_FLY && player->panim == PA_ABILITY)
|
||||||
|
toucher->momz = -toucher->momz/2;
|
||||||
}
|
}
|
||||||
P_DamageMobj(special, toucher, toucher, 1, 0);
|
P_DamageMobj(special, toucher, toucher, 1, 0);
|
||||||
}
|
if (player->charability == CA_TWINSPIN && player->panim == PA_ABILITY)
|
||||||
else if (((toucher->z < special->z && !(toucher->eflags & MFE_VERTICALFLIP))
|
P_TwinSpinRejuvenate(player, player->thokitem);
|
||||||
|| (toucher->z + toucher->height > special->z + special->height && (toucher->eflags & MFE_VERTICALFLIP)))
|
|
||||||
&& player->charability == CA_FLY
|
|
||||||
&& (player->powers[pw_tailsfly]
|
|
||||||
|| toucher->state-states == S_PLAY_FLY_TIRED)) // Tails can shred stuff with her propeller.
|
|
||||||
{
|
|
||||||
toucher->momz = -toucher->momz/2;
|
|
||||||
|
|
||||||
P_DamageMobj(special, toucher, toucher, 1, 0);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
P_DamageMobj(toucher, special, special, 1, 0);
|
P_DamageMobj(toucher, special, special, 1, 0);
|
||||||
|
@ -1557,6 +1544,45 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case MT_EGGROBO1:
|
||||||
|
if (special->state == &states[special->info->deathstate])
|
||||||
|
return;
|
||||||
|
if (P_PlayerInPain(player))
|
||||||
|
return;
|
||||||
|
|
||||||
|
P_SetMobjState(special, special->info->meleestate);
|
||||||
|
special->angle = special->movedir;
|
||||||
|
special->momx = special->momy = 0;
|
||||||
|
|
||||||
|
// Buenos Dias Mandy
|
||||||
|
P_SetPlayerMobjState(toucher, S_PLAY_STUN);
|
||||||
|
player->pflags &= ~PF_APPLYAUTOBRAKE;
|
||||||
|
player->drawangle = special->angle + ANGLE_180;
|
||||||
|
P_InstaThrust(toucher, special->angle, FixedMul(3*special->info->speed, special->scale/2));
|
||||||
|
toucher->z += P_MobjFlip(toucher);
|
||||||
|
if (toucher->eflags & MFE_UNDERWATER) // unlikely.
|
||||||
|
P_SetObjectMomZ(toucher, FixedDiv(10511*FRACUNIT,2600*FRACUNIT), false);
|
||||||
|
else
|
||||||
|
P_SetObjectMomZ(toucher, FixedDiv(69*FRACUNIT,10*FRACUNIT), false);
|
||||||
|
if (P_IsLocalPlayer(player))
|
||||||
|
{
|
||||||
|
quake.intensity = 9*FRACUNIT;
|
||||||
|
quake.time = TICRATE/2;
|
||||||
|
quake.epicenter = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0 // camera redirection - deemed unnecessary
|
||||||
|
toucher->angle = special->angle;
|
||||||
|
if (player == &players[consoleplayer])
|
||||||
|
localangle = toucher->angle;
|
||||||
|
else if (player == &players[secondarydisplayplayer])
|
||||||
|
localangle2 = toucher->angle;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
S_StartSound(toucher, special->info->attacksound); // home run
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
case MT_BIGTUMBLEWEED:
|
case MT_BIGTUMBLEWEED:
|
||||||
case MT_LITTLETUMBLEWEED:
|
case MT_LITTLETUMBLEWEED:
|
||||||
if (toucher->momx || toucher->momy)
|
if (toucher->momx || toucher->momy)
|
||||||
|
@ -1798,6 +1824,10 @@ static void P_HitDeathMessages(player_t *player, mobj_t *inflictor, mobj_t *sour
|
||||||
|
|
||||||
deadtarget = (player->mo->health <= 0);
|
deadtarget = (player->mo->health <= 0);
|
||||||
|
|
||||||
|
// Don't log every hazard hit if they don't want us to.
|
||||||
|
if (!deadtarget && !cv_hazardlog.value)
|
||||||
|
return;
|
||||||
|
|
||||||
// Target's name
|
// Target's name
|
||||||
snprintf(targetname, sizeof(targetname), "%s%s%s",
|
snprintf(targetname, sizeof(targetname), "%s%s%s",
|
||||||
CTFTEAMCODE(player),
|
CTFTEAMCODE(player),
|
||||||
|
@ -1901,7 +1931,7 @@ static void P_HitDeathMessages(player_t *player, mobj_t *inflictor, mobj_t *sour
|
||||||
switch (damagetype)
|
switch (damagetype)
|
||||||
{
|
{
|
||||||
case DMG_WATER:
|
case DMG_WATER:
|
||||||
str = M_GetText("%s was %s by chemical water.\n");
|
str = M_GetText("%s was %s by dangerous water.\n");
|
||||||
break;
|
break;
|
||||||
case DMG_FIRE:
|
case DMG_FIRE:
|
||||||
str = M_GetText("%s was %s by molten lava.\n");
|
str = M_GetText("%s was %s by molten lava.\n");
|
||||||
|
@ -1949,10 +1979,6 @@ static void P_HitDeathMessages(player_t *player, mobj_t *inflictor, mobj_t *sour
|
||||||
if (!str) // Should not happen! Unless we missed catching something above.
|
if (!str) // Should not happen! Unless we missed catching something above.
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Don't log every hazard hit if they don't want us to.
|
|
||||||
if (!deadtarget && !cv_hazardlog.value)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (deathonly)
|
if (deathonly)
|
||||||
{
|
{
|
||||||
if (!deadtarget)
|
if (!deadtarget)
|
||||||
|
@ -2550,13 +2576,20 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
||||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||||
{
|
{
|
||||||
mo = (mobj_t *)th;
|
mo = (mobj_t *)th;
|
||||||
if (mo->type == (mobjtype_t)target->info->mass && mo->tracer == target)
|
if (mo->type != (mobjtype_t)target->info->mass)
|
||||||
{
|
continue;
|
||||||
P_RemoveMobj(mo);
|
if (mo->tracer != target)
|
||||||
i++;
|
continue;
|
||||||
}
|
|
||||||
if (i == 2) // we've already removed 2 of these, let's stop now
|
P_KillMobj(mo, inflictor, source, damagetype);
|
||||||
|
mo->destscale = mo->scale/8;
|
||||||
|
mo->scalespeed = (mo->scale - mo->destscale)/(2*TICRATE);
|
||||||
|
mo->momz = mo->info->speed;
|
||||||
|
mo->angle = FixedAngle((P_RandomKey(36)*10)<<FRACBITS);
|
||||||
|
if (++i == 2) // we've already removed 2 of these, let's stop now
|
||||||
break;
|
break;
|
||||||
|
else
|
||||||
|
S_StartSound(mo, mo->info->deathsound); // done once to prevent sound stacking
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2871,26 +2904,47 @@ static inline boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *sou
|
||||||
if (player->powers[pw_flashing] || player->powers[pw_invulnerability])
|
if (player->powers[pw_flashing] || player->powers[pw_invulnerability])
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Ignore IT players shooting each other, unless friendlyfire is on.
|
|
||||||
if ((player->pflags & PF_TAGIT && !((cv_friendlyfire.value || (damagetype & DMG_CANHURTSELF)) &&
|
|
||||||
source && source->player && source->player->pflags & PF_TAGIT)))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Don't allow any damage before the round starts.
|
// Don't allow any damage before the round starts.
|
||||||
if (leveltime <= hidetime * TICRATE)
|
if (leveltime <= hidetime * TICRATE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Ignore IT players shooting each other, unless friendlyfire is on.
|
||||||
|
if ((player->pflags & PF_TAGIT && !((cv_friendlyfire.value || (damagetype & DMG_CANHURTSELF)) &&
|
||||||
|
source && source->player && source->player->pflags & PF_TAGIT)))
|
||||||
|
{
|
||||||
|
if (inflictor->type == MT_LHRT && !(player->powers[pw_shield] & SH_NOSTACK))
|
||||||
|
{
|
||||||
|
if (player->revitem != MT_LHRT && player->spinitem != MT_LHRT && player->thokitem != MT_LHRT) // Healers do not get to heal other healers.
|
||||||
|
{
|
||||||
|
P_SwitchShield(player, SH_PINK);
|
||||||
|
S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Don't allow players on the same team to hurt one another,
|
// Don't allow players on the same team to hurt one another,
|
||||||
// unless cv_friendlyfire is on.
|
// unless cv_friendlyfire is on.
|
||||||
if (!(cv_friendlyfire.value || (damagetype & DMG_CANHURTSELF)) && (player->pflags & PF_TAGIT) == (source->player->pflags & PF_TAGIT))
|
if (!(cv_friendlyfire.value || (damagetype & DMG_CANHURTSELF)) && (player->pflags & PF_TAGIT) == (source->player->pflags & PF_TAGIT))
|
||||||
{
|
{
|
||||||
if (!(inflictor->flags & MF_FIRE))
|
if (inflictor->type == MT_LHRT && !(player->powers[pw_shield] & SH_NOSTACK))
|
||||||
|
{
|
||||||
|
if (player->revitem != MT_LHRT && player->spinitem != MT_LHRT && player->thokitem != MT_LHRT) // Healers do not get to heal other healers.
|
||||||
|
{
|
||||||
|
P_SwitchShield(player, SH_PINK);
|
||||||
|
S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!(inflictor->flags & MF_FIRE))
|
||||||
P_GivePlayerRings(player, 1);
|
P_GivePlayerRings(player, 1);
|
||||||
if (inflictor->flags2 & MF2_BOUNCERING)
|
if (inflictor->flags2 & MF2_BOUNCERING)
|
||||||
inflictor->fuse = 0; // bounce ring disappears at -1 not 0
|
inflictor->fuse = 0; // bounce ring disappears at -1 not 0
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (inflictor->type == MT_LHRT)
|
||||||
|
return false;
|
||||||
|
|
||||||
// The tag occurs so long as you aren't shooting another tagger with friendlyfire on.
|
// The tag occurs so long as you aren't shooting another tagger with friendlyfire on.
|
||||||
if (source->player->pflags & PF_TAGIT && !(player->pflags & PF_TAGIT))
|
if (source->player->pflags & PF_TAGIT && !(player->pflags & PF_TAGIT))
|
||||||
{
|
{
|
||||||
|
@ -2957,7 +3011,17 @@ static inline boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj
|
||||||
|
|
||||||
// In COOP/RACE, you can't hurt other players unless cv_friendlyfire is on
|
// In COOP/RACE, you can't hurt other players unless cv_friendlyfire is on
|
||||||
if (!cv_friendlyfire.value && (G_PlatformGametype()))
|
if (!cv_friendlyfire.value && (G_PlatformGametype()))
|
||||||
|
{
|
||||||
|
if (gametype == GT_COOP && inflictor->type == MT_LHRT && !(player->powers[pw_shield] & SH_NOSTACK)) // co-op only
|
||||||
|
{
|
||||||
|
if (player->revitem != MT_LHRT && player->spinitem != MT_LHRT && player->thokitem != MT_LHRT) // Healers do not get to heal other healers.
|
||||||
|
{
|
||||||
|
P_SwitchShield(player, SH_PINK);
|
||||||
|
S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound);
|
||||||
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tag handling
|
// Tag handling
|
||||||
|
@ -2971,7 +3035,15 @@ static inline boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj
|
||||||
// unless cv_friendlyfire is on.
|
// unless cv_friendlyfire is on.
|
||||||
if (!cv_friendlyfire.value && target->player->ctfteam == source->player->ctfteam)
|
if (!cv_friendlyfire.value && target->player->ctfteam == source->player->ctfteam)
|
||||||
{
|
{
|
||||||
if (!(inflictor->flags & MF_FIRE))
|
if (inflictor->type == MT_LHRT && !(player->powers[pw_shield] & SH_NOSTACK))
|
||||||
|
{
|
||||||
|
if (player->revitem != MT_LHRT && player->spinitem != MT_LHRT && player->thokitem != MT_LHRT) // Healers do not get to heal other healers.
|
||||||
|
{
|
||||||
|
P_SwitchShield(player, SH_PINK);
|
||||||
|
S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!(inflictor->flags & MF_FIRE))
|
||||||
P_GivePlayerRings(target->player, 1);
|
P_GivePlayerRings(target->player, 1);
|
||||||
if (inflictor->flags2 & MF2_BOUNCERING)
|
if (inflictor->flags2 & MF2_BOUNCERING)
|
||||||
inflictor->fuse = 0; // bounce ring disappears at -1 not 0
|
inflictor->fuse = 0; // bounce ring disappears at -1 not 0
|
||||||
|
@ -2980,6 +3052,9 @@ static inline boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (inflictor->type == MT_LHRT)
|
||||||
|
return false;
|
||||||
|
|
||||||
// Add pity.
|
// Add pity.
|
||||||
if (!player->powers[pw_flashing] && !player->powers[pw_invulnerability] && !player->powers[pw_super]
|
if (!player->powers[pw_flashing] && !player->powers[pw_invulnerability] && !player->powers[pw_super]
|
||||||
&& source->player->score > player->score)
|
&& source->player->score > player->score)
|
||||||
|
|
|
@ -134,6 +134,7 @@ pflags_t P_GetJumpFlags(player_t *player);
|
||||||
boolean P_PlayerInPain(player_t *player);
|
boolean P_PlayerInPain(player_t *player);
|
||||||
void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor);
|
void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor);
|
||||||
void P_ResetPlayer(player_t *player);
|
void P_ResetPlayer(player_t *player);
|
||||||
|
boolean P_PlayerCanDamage(player_t *player, mobj_t *thing);
|
||||||
boolean P_IsLocalPlayer(player_t *player);
|
boolean P_IsLocalPlayer(player_t *player);
|
||||||
|
|
||||||
boolean P_IsObjectInGoop(mobj_t *mo);
|
boolean P_IsObjectInGoop(mobj_t *mo);
|
||||||
|
@ -164,6 +165,7 @@ boolean P_AutoPause(void);
|
||||||
void P_DoJumpShield(player_t *player);
|
void P_DoJumpShield(player_t *player);
|
||||||
void P_DoBubbleBounce(player_t *player);
|
void P_DoBubbleBounce(player_t *player);
|
||||||
void P_DoAbilityBounce(player_t *player, boolean changemomz);
|
void P_DoAbilityBounce(player_t *player, boolean changemomz);
|
||||||
|
void P_TwinSpinRejuvenate(player_t *player, mobjtype_t type);
|
||||||
void P_BlackOw(player_t *player);
|
void P_BlackOw(player_t *player);
|
||||||
void P_ElementalFire(player_t *player, boolean cropcircle);
|
void P_ElementalFire(player_t *player, boolean cropcircle);
|
||||||
|
|
||||||
|
@ -180,7 +182,7 @@ void P_InstaThrustEvenIn2D(mobj_t *mo, angle_t angle, fixed_t move);
|
||||||
|
|
||||||
mobj_t *P_LookForEnemies(player_t *player, boolean nonenemies, boolean bullet);
|
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_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_HomingAttack(mobj_t *source, mobj_t *enemy); /// \todo doesn't belong in p_user
|
||||||
boolean P_SuperReady(player_t *player);
|
boolean P_SuperReady(player_t *player);
|
||||||
void P_DoJump(player_t *player, boolean soundandstate);
|
void P_DoJump(player_t *player, boolean soundandstate);
|
||||||
#if 0
|
#if 0
|
||||||
|
|
116
src/p_map.c
116
src/p_map.c
|
@ -135,6 +135,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
||||||
fixed_t vertispeed = spring->info->mass;
|
fixed_t vertispeed = spring->info->mass;
|
||||||
fixed_t horizspeed = spring->info->damage;
|
fixed_t horizspeed = spring->info->damage;
|
||||||
boolean final = false;
|
boolean final = false;
|
||||||
|
UINT8 strong = 0;
|
||||||
|
|
||||||
// Object was already sprung this tic
|
// Object was already sprung this tic
|
||||||
if (object->eflags & MFE_SPRUNG)
|
if (object->eflags & MFE_SPRUNG)
|
||||||
|
@ -148,6 +149,14 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
||||||
if (!spring->health || !object->health)
|
if (!spring->health || !object->health)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (object->player)
|
||||||
|
{
|
||||||
|
if (object->player->charability == CA_TWINSPIN && object->player->panim == PA_ABILITY)
|
||||||
|
strong = 1;
|
||||||
|
else if (object->player->charability2 == CA2_MELEE && object->player->panim == PA_ABILITY2)
|
||||||
|
strong = 2;
|
||||||
|
}
|
||||||
|
|
||||||
if (spring->info->painchance == -1) // Pinball bumper mode.
|
if (spring->info->painchance == -1) // Pinball bumper mode.
|
||||||
{
|
{
|
||||||
// The first of the entirely different spring modes!
|
// The first of the entirely different spring modes!
|
||||||
|
@ -188,6 +197,9 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
||||||
{
|
{
|
||||||
fixed_t playervelocity;
|
fixed_t playervelocity;
|
||||||
|
|
||||||
|
if (strong)
|
||||||
|
vertispeed <<= 1;
|
||||||
|
|
||||||
if (!(object->player->pflags & PF_THOKKED) && !(object->player->homing)
|
if (!(object->player->pflags & PF_THOKKED) && !(object->player->homing)
|
||||||
&& ((playervelocity = FixedDiv(9*FixedHypot(object->player->speed, object->momz), 10<<FRACBITS)) > vertispeed))
|
&& ((playervelocity = FixedDiv(9*FixedHypot(object->player->speed, object->momz), 10<<FRACBITS)) > vertispeed))
|
||||||
vertispeed = playervelocity;
|
vertispeed = playervelocity;
|
||||||
|
@ -260,11 +272,8 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (object->player
|
if (strong)
|
||||||
&& ((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);
|
|
||||||
if (horizspeed)
|
if (horizspeed)
|
||||||
horizspeed = FixedMul(horizspeed, (4*FRACUNIT)/3);
|
horizspeed = FixedMul(horizspeed, (4*FRACUNIT)/3);
|
||||||
if (vertispeed)
|
if (vertispeed)
|
||||||
|
@ -399,6 +408,12 @@ springstate:
|
||||||
P_AddPlayerScore(object->player, 10);
|
P_AddPlayerScore(object->player, 10);
|
||||||
spring->reactiontime--;
|
spring->reactiontime--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strong)
|
||||||
|
{
|
||||||
|
P_TwinSpinRejuvenate(object->player, (strong == 1 ? object->player->thokitem : object->player->revitem));
|
||||||
|
S_StartSound(object, sfx_sprong); // strong spring. sprong.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return final;
|
return final;
|
||||||
|
@ -745,6 +760,27 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// vectorise metal - done in a special case as at this point neither has the right flags for touching
|
||||||
|
if (thing->type == MT_METALSONIC_BATTLE
|
||||||
|
&& (tmthing->flags & MF_MISSILE)
|
||||||
|
&& tmthing->target != thing
|
||||||
|
&& thing->state == &states[thing->info->spawnstate])
|
||||||
|
{
|
||||||
|
blockdist = thing->radius + tmthing->radius;
|
||||||
|
|
||||||
|
if (abs(thing->x - tmx) >= blockdist || abs(thing->y - tmy) >= blockdist)
|
||||||
|
return true; // didn't hit it
|
||||||
|
|
||||||
|
if (tmthing->z > thing->z + thing->height)
|
||||||
|
return true; // overhead
|
||||||
|
if (tmthing->z + tmthing->height < thing->z)
|
||||||
|
return true; // underneath
|
||||||
|
|
||||||
|
thing->flags2 |= MF2_CLASSICPUSH;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(thing->flags & (MF_SOLID|MF_SPECIAL|MF_PAIN|MF_SHOOTABLE|MF_SPRING)))
|
if (!(thing->flags & (MF_SOLID|MF_SPECIAL|MF_PAIN|MF_SHOOTABLE|MF_SPRING)))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -1156,7 +1192,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||||
tmthing->y = thing->y;
|
tmthing->y = thing->y;
|
||||||
P_SetThingPosition(tmthing);
|
P_SetThingPosition(tmthing);
|
||||||
}
|
}
|
||||||
else if (!(tmthing->type == MT_SHELL && thing->player)) // player collision handled in touchspecial
|
else if (!(tmthing->type == MT_SHELL && thing->player)) // player collision handled in touchspecial for shell
|
||||||
{
|
{
|
||||||
UINT8 damagetype = tmthing->info->mass;
|
UINT8 damagetype = tmthing->info->mass;
|
||||||
if (!damagetype && tmthing->flags & MF_FIRE) // BURN!
|
if (!damagetype && tmthing->flags & MF_FIRE) // BURN!
|
||||||
|
@ -1485,51 +1521,45 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||||
}
|
}
|
||||||
// Monitor?
|
// Monitor?
|
||||||
else if (thing->flags & MF_MONITOR
|
else if (thing->flags & MF_MONITOR
|
||||||
&& !((thing->type == MT_RING_REDBOX && tmthing->player->ctfteam != 1) || (thing->type == MT_RING_BLUEBOX && tmthing->player->ctfteam != 2)))
|
&& !((thing->type == MT_RING_REDBOX && tmthing->player->ctfteam != 1) || (thing->type == MT_RING_BLUEBOX && tmthing->player->ctfteam != 2))
|
||||||
|
&& (!(thing->flags & MF_SOLID) || P_PlayerCanDamage(tmthing->player, thing)))
|
||||||
{
|
{
|
||||||
// 0 = none, 1 = elemental pierce, 2 = bubble bounce
|
if (thing->z - thing->scale <= tmthing->z + tmthing->height
|
||||||
UINT8 elementalpierce = (((tmthing->player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL || (tmthing->player->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP) && (tmthing->player->pflags & PF_SHIELDABILITY)
|
&& thing->z + thing->height + thing->scale >= tmthing->z)
|
||||||
? (((tmthing->player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) ? 1 : 2)
|
|
||||||
: 0);
|
|
||||||
if (!(thing->flags & MF_SOLID)
|
|
||||||
|| tmthing->player->pflags & (PF_SPINNING|PF_GLIDING)
|
|
||||||
|| ((tmthing->player->pflags & PF_JUMPED)
|
|
||||||
&& (!(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->pflags & PF_BOUNCING)
|
|
||||||
&& (P_MobjFlip(tmthing)*(tmthing->z - (thing->z + thing->height/2)) > 0) && (P_MobjFlip(tmthing)*tmthing->momz < 0))
|
|
||||||
|| elementalpierce)
|
|
||||||
{
|
{
|
||||||
if (thing->z - thing->scale <= tmthing->z + tmthing->height
|
player_t *player = tmthing->player;
|
||||||
&& thing->z + thing->height + thing->scale >= tmthing->z)
|
// 0 = none, 1 = elemental pierce, 2 = bubble bounce
|
||||||
|
UINT8 elementalpierce = (((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL || (player->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP) && (player->pflags & PF_SHIELDABILITY)
|
||||||
|
? (((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) ? 1 : 2)
|
||||||
|
: 0);
|
||||||
|
SINT8 flipval = P_MobjFlip(thing); // Save this value in case monitor gets removed.
|
||||||
|
fixed_t *momz = &tmthing->momz; // tmthing gets changed by P_DamageMobj, so we need a new pointer?! X_x;;
|
||||||
|
fixed_t *z = &tmthing->z; // aau.
|
||||||
|
// Going down? Then bounce back up.
|
||||||
|
if (P_DamageMobj(thing, tmthing, tmthing, 1, 0) // break the monitor
|
||||||
|
&& (flipval*(*momz) < 0) // monitor is on the floor and you're going down, or on the ceiling and you're going up
|
||||||
|
&& (elementalpierce != 1)) // you're not piercing through the monitor...
|
||||||
{
|
{
|
||||||
player_t *player = tmthing->player;
|
if (elementalpierce == 2)
|
||||||
SINT8 flipval = P_MobjFlip(thing); // Save this value in case monitor gets removed.
|
P_DoBubbleBounce(player);
|
||||||
fixed_t *momz = &tmthing->momz; // tmthing gets changed by P_DamageMobj, so we need a new pointer?! X_x;;
|
else if (!(player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2))
|
||||||
fixed_t *z = &tmthing->z; // aau.
|
|
||||||
// Going down? Then bounce back up.
|
|
||||||
if (P_DamageMobj(thing, tmthing, tmthing, 1, 0) // break the monitor
|
|
||||||
&& (flipval*(*momz) < 0) // monitor is on the floor and you're going down, or on the ceiling and you're going up
|
|
||||||
&& (elementalpierce != 1)) // you're not piercing through the monitor...
|
|
||||||
{
|
{
|
||||||
if (elementalpierce == 2)
|
*momz = -*momz; // Therefore, you should be thrust in the opposite direction, vertically.
|
||||||
P_DoBubbleBounce(player);
|
if (player->charability == CA_TWINSPIN && player->panim == PA_ABILITY)
|
||||||
else if (!(player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2))
|
P_TwinSpinRejuvenate(player, player->thokitem);
|
||||||
*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.
|
|
||||||
}
|
}
|
||||||
|
if (!(elementalpierce == 1 && thing->flags & MF_GRENADEBOUNCE)) // prevent gold monitor clipthrough.
|
||||||
return true;
|
{
|
||||||
|
if (player->pflags & PF_BOUNCING)
|
||||||
|
P_DoAbilityBounce(player, false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*z -= *momz; // to ensure proper collision.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1237
src/p_mobj.c
1237
src/p_mobj.c
File diff suppressed because it is too large
Load Diff
|
@ -371,6 +371,8 @@ typedef struct mobj_s
|
||||||
struct pslope_s *standingslope; // The slope that the object is standing on (shouldn't need synced in savegames, right?)
|
struct pslope_s *standingslope; // The slope that the object is standing on (shouldn't need synced in savegames, right?)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
boolean colorized; // Whether the mobj uses the rainbow colormap
|
||||||
|
|
||||||
// WARNING: New fields must be added separately to savegame and Lua.
|
// WARNING: New fields must be added separately to savegame and Lua.
|
||||||
} mobj_t;
|
} mobj_t;
|
||||||
|
|
||||||
|
|
|
@ -1262,12 +1262,11 @@ typedef enum
|
||||||
MD2_HNEXT = 1<<7,
|
MD2_HNEXT = 1<<7,
|
||||||
MD2_HPREV = 1<<8,
|
MD2_HPREV = 1<<8,
|
||||||
MD2_FLOORROVER = 1<<9,
|
MD2_FLOORROVER = 1<<9,
|
||||||
#ifdef ESLOPE
|
|
||||||
MD2_CEILINGROVER = 1<<10,
|
MD2_CEILINGROVER = 1<<10,
|
||||||
MD2_SLOPE = 1<<11
|
#ifdef ESLOPE
|
||||||
#else
|
MD2_SLOPE = 1<<11,
|
||||||
MD2_CEILINGROVER = 1<<10
|
|
||||||
#endif
|
#endif
|
||||||
|
MD2_COLORIZED = 1<<12,
|
||||||
} mobj_diff2_t;
|
} mobj_diff2_t;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
@ -1485,6 +1484,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
|
||||||
if (mobj->standingslope)
|
if (mobj->standingslope)
|
||||||
diff2 |= MD2_SLOPE;
|
diff2 |= MD2_SLOPE;
|
||||||
#endif
|
#endif
|
||||||
|
if (mobj->colorized)
|
||||||
|
diff2 |= MD2_COLORIZED;
|
||||||
if (diff2 != 0)
|
if (diff2 != 0)
|
||||||
diff |= MD_MORE;
|
diff |= MD_MORE;
|
||||||
|
|
||||||
|
@ -1647,6 +1648,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
|
||||||
if (diff2 & MD2_SLOPE)
|
if (diff2 & MD2_SLOPE)
|
||||||
WRITEUINT16(save_p, mobj->standingslope->id);
|
WRITEUINT16(save_p, mobj->standingslope->id);
|
||||||
#endif
|
#endif
|
||||||
|
if (diff2 & MD2_COLORIZED)
|
||||||
|
WRITEUINT8(save_p, mobj->colorized);
|
||||||
|
|
||||||
WRITEUINT32(save_p, mobj->mobjnum);
|
WRITEUINT32(save_p, mobj->mobjnum);
|
||||||
}
|
}
|
||||||
|
@ -2717,7 +2720,8 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
if (diff2 & MD2_SLOPE)
|
if (diff2 & MD2_SLOPE)
|
||||||
mobj->standingslope = P_SlopeById(READUINT16(save_p));
|
mobj->standingslope = P_SlopeById(READUINT16(save_p));
|
||||||
#endif
|
#endif
|
||||||
|
if (diff2 & MD2_COLORIZED)
|
||||||
|
mobj->colorized = READUINT8(save_p);
|
||||||
|
|
||||||
if (diff & MD_REDFLAG)
|
if (diff & MD_REDFLAG)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1282,6 +1282,9 @@ static void P_LoadLineDefs2(void)
|
||||||
// Compile linedef 'text' from both sidedefs 'text' for appropriate specials.
|
// Compile linedef 'text' from both sidedefs 'text' for appropriate specials.
|
||||||
switch(ld->special)
|
switch(ld->special)
|
||||||
{
|
{
|
||||||
|
case 331: // Trigger linedef executor: Skin - Continuous
|
||||||
|
case 332: // Trigger linedef executor: Skin - Each time
|
||||||
|
case 333: // Trigger linedef executor: Skin - Once
|
||||||
case 443: // Calls a named Lua function
|
case 443: // Calls a named Lua function
|
||||||
if (sides[ld->sidenum[0]].text)
|
if (sides[ld->sidenum[0]].text)
|
||||||
{
|
{
|
||||||
|
@ -1492,6 +1495,9 @@ static void P_LoadRawSideDefs2(void *data)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 331: // Trigger linedef executor: Skin - Continuous
|
||||||
|
case 332: // Trigger linedef executor: Skin - Each time
|
||||||
|
case 333: // Trigger linedef executor: Skin - Once
|
||||||
case 443: // Calls a named Lua function
|
case 443: // Calls a named Lua function
|
||||||
case 459: // Control text prompt (named tag)
|
case 459: // Control text prompt (named tag)
|
||||||
{
|
{
|
||||||
|
|
|
@ -259,9 +259,9 @@ static void line_SpawnViaLine(const int linenum, const boolean spawnthinker)
|
||||||
boolean backceil = (special == 711 || special == 712 || special == 703);
|
boolean backceil = (special == 711 || special == 712 || special == 703);
|
||||||
|
|
||||||
UINT8 flags = 0; // Slope flags
|
UINT8 flags = 0; // Slope flags
|
||||||
if (line->flags & ML_NOSONIC)
|
if (line->flags & ML_NETONLY)
|
||||||
flags |= SL_NOPHYSICS;
|
flags |= SL_NOPHYSICS;
|
||||||
if (line->flags & ML_NOTAILS)
|
if (line->flags & ML_NONET)
|
||||||
flags |= SL_DYNAMIC;
|
flags |= SL_DYNAMIC;
|
||||||
|
|
||||||
if(!frontfloor && !backfloor && !frontceil && !backceil)
|
if(!frontfloor && !backfloor && !frontceil && !backceil)
|
||||||
|
@ -468,9 +468,9 @@ static void line_SpawnViaVertexes(const int linenum, const boolean spawnthinker)
|
||||||
UINT16 tag1, tag2, tag3;
|
UINT16 tag1, tag2, tag3;
|
||||||
|
|
||||||
UINT8 flags = 0;
|
UINT8 flags = 0;
|
||||||
if (line->flags & ML_NOSONIC)
|
if (line->flags & ML_NETONLY)
|
||||||
flags |= SL_NOPHYSICS;
|
flags |= SL_NOPHYSICS;
|
||||||
if (line->flags & ML_NOTAILS)
|
if (line->flags & ML_NONET)
|
||||||
flags |= SL_DYNAMIC;
|
flags |= SL_DYNAMIC;
|
||||||
|
|
||||||
switch(line->special)
|
switch(line->special)
|
||||||
|
@ -494,7 +494,7 @@ static void line_SpawnViaVertexes(const int linenum, const boolean spawnthinker)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (line->flags & ML_NOKNUX)
|
if (line->flags & ML_EFFECT6)
|
||||||
{
|
{
|
||||||
tag1 = line->tag;
|
tag1 = line->tag;
|
||||||
tag2 = side->textureoffset >> FRACBITS;
|
tag2 = side->textureoffset >> FRACBITS;
|
||||||
|
|
209
src/p_spec.c
209
src/p_spec.c
|
@ -36,6 +36,7 @@
|
||||||
#include "m_cond.h" //unlock triggers
|
#include "m_cond.h" //unlock triggers
|
||||||
#include "lua_hook.h" // LUAh_LinedefExecute
|
#include "lua_hook.h" // LUAh_LinedefExecute
|
||||||
#include "f_finale.h" // control text prompt
|
#include "f_finale.h" // control text prompt
|
||||||
|
#include "r_things.h" // skins
|
||||||
|
|
||||||
#ifdef HW3SOUND
|
#ifdef HW3SOUND
|
||||||
#include "hardware/hw3sound.h"
|
#include "hardware/hw3sound.h"
|
||||||
|
@ -98,7 +99,6 @@ typedef struct
|
||||||
thinker_t **thinkers;
|
thinker_t **thinkers;
|
||||||
} thinkerlist_t;
|
} thinkerlist_t;
|
||||||
|
|
||||||
static void P_SearchForDisableLinedefs(void);
|
|
||||||
static void P_SpawnScrollers(void);
|
static void P_SpawnScrollers(void);
|
||||||
static void P_SpawnFriction(void);
|
static void P_SpawnFriction(void);
|
||||||
static void P_SpawnPushers(void);
|
static void P_SpawnPushers(void);
|
||||||
|
@ -2008,7 +2008,12 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||||
if (!P_CheckNightsTriggerLine(triggerline, actor))
|
if (!P_CheckNightsTriggerLine(triggerline, actor))
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
|
case 331: // continuous
|
||||||
|
case 332: // each time
|
||||||
|
case 333: // once
|
||||||
|
if (!(actor && actor->player && ((stricmp(triggerline->text, skins[actor->player->skin].name) == 0) ^ ((triggerline->flags & ML_NOCLIMB) == ML_NOCLIMB))))
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2141,6 +2146,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||||
|| specialtype == 326 // DeNightserize - Once
|
|| specialtype == 326 // DeNightserize - Once
|
||||||
|| specialtype == 328 // Nights lap - Once
|
|| specialtype == 328 // Nights lap - Once
|
||||||
|| specialtype == 330 // Nights Bonus Time - Once
|
|| specialtype == 330 // Nights Bonus Time - Once
|
||||||
|
|| specialtype == 333 // Skin - Once
|
||||||
|| specialtype == 399) // Level Load
|
|| specialtype == 399) // Level Load
|
||||||
triggerline->special = 0; // Clear it out
|
triggerline->special = 0; // Clear it out
|
||||||
|
|
||||||
|
@ -2181,7 +2187,8 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller)
|
||||||
|| lines[masterline].special == 306 // Character ability - Each time
|
|| lines[masterline].special == 306 // Character ability - Each time
|
||||||
|| lines[masterline].special == 310 // CTF Red team - Each time
|
|| lines[masterline].special == 310 // CTF Red team - Each time
|
||||||
|| lines[masterline].special == 312 // CTF Blue team - Each time
|
|| lines[masterline].special == 312 // CTF Blue team - Each time
|
||||||
|| lines[masterline].special == 322) // Trigger on X calls - Each Time
|
|| lines[masterline].special == 322 // Trigger on X calls - Each Time
|
||||||
|
|| lines[masterline].special == 332)// Skin - Each time
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (lines[masterline].special < 300
|
if (lines[masterline].special < 300
|
||||||
|
@ -3382,7 +3389,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||||
|
|
||||||
// if flags changed, reset sector's light list
|
// if flags changed, reset sector's light list
|
||||||
if (rover->flags != oldflags)
|
if (rover->flags != oldflags)
|
||||||
|
{
|
||||||
sec->moved = true;
|
sec->moved = true;
|
||||||
|
P_RecalcPrecipInSector(sec);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5611,26 +5621,26 @@ ffloor_t *P_GetFFloorByID(sector_t *sec, UINT16 id)
|
||||||
/** Adds a newly formed 3Dfloor structure to a sector's ffloors list.
|
/** Adds a newly formed 3Dfloor structure to a sector's ffloors list.
|
||||||
*
|
*
|
||||||
* \param sec Target sector.
|
* \param sec Target sector.
|
||||||
* \param ffloor Newly formed 3Dfloor structure.
|
* \param fflr Newly formed 3Dfloor structure.
|
||||||
* \sa P_AddFakeFloor
|
* \sa P_AddFakeFloor
|
||||||
*/
|
*/
|
||||||
static inline void P_AddFFloorToList(sector_t *sec, ffloor_t *ffloor)
|
static inline void P_AddFFloorToList(sector_t *sec, ffloor_t *fflr)
|
||||||
{
|
{
|
||||||
ffloor_t *rover;
|
ffloor_t *rover;
|
||||||
|
|
||||||
if (!sec->ffloors)
|
if (!sec->ffloors)
|
||||||
{
|
{
|
||||||
sec->ffloors = ffloor;
|
sec->ffloors = fflr;
|
||||||
ffloor->next = 0;
|
fflr->next = 0;
|
||||||
ffloor->prev = 0;
|
fflr->prev = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (rover = sec->ffloors; rover->next; rover = rover->next);
|
for (rover = sec->ffloors; rover->next; rover = rover->next);
|
||||||
|
|
||||||
rover->next = ffloor;
|
rover->next = fflr;
|
||||||
ffloor->prev = rover;
|
fflr->prev = rover;
|
||||||
ffloor->next = 0;
|
fflr->next = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Adds a 3Dfloor.
|
/** Adds a 3Dfloor.
|
||||||
|
@ -5645,7 +5655,7 @@ static inline void P_AddFFloorToList(sector_t *sec, ffloor_t *ffloor)
|
||||||
*/
|
*/
|
||||||
static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, ffloortype_e flags, thinkerlist_t *secthinkers)
|
static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, ffloortype_e flags, thinkerlist_t *secthinkers)
|
||||||
{
|
{
|
||||||
ffloor_t *ffloor;
|
ffloor_t *fflr;
|
||||||
thinker_t *th;
|
thinker_t *th;
|
||||||
friction_t *f;
|
friction_t *f;
|
||||||
pusher_t *p;
|
pusher_t *p;
|
||||||
|
@ -5655,8 +5665,8 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
||||||
|
|
||||||
if (sec == sec2)
|
if (sec == sec2)
|
||||||
return NULL; //Don't need a fake floor on a control sector.
|
return NULL; //Don't need a fake floor on a control sector.
|
||||||
if ((ffloor = (P_GetFFloorBySec(sec, sec2))))
|
if ((fflr = (P_GetFFloorBySec(sec, sec2))))
|
||||||
return ffloor; // If this ffloor already exists, return it
|
return fflr; // If this ffloor already exists, return it
|
||||||
|
|
||||||
if (sec2->ceilingheight < sec2->floorheight)
|
if (sec2->ceilingheight < sec2->floorheight)
|
||||||
{
|
{
|
||||||
|
@ -5695,27 +5705,27 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the floor
|
// Add the floor
|
||||||
ffloor = Z_Calloc(sizeof (*ffloor), PU_LEVEL, NULL);
|
fflr = Z_Calloc(sizeof (*fflr), PU_LEVEL, NULL);
|
||||||
ffloor->secnum = sec2 - sectors;
|
fflr->secnum = sec2 - sectors;
|
||||||
ffloor->target = sec;
|
fflr->target = sec;
|
||||||
ffloor->bottomheight = &sec2->floorheight;
|
fflr->bottomheight = &sec2->floorheight;
|
||||||
ffloor->bottompic = &sec2->floorpic;
|
fflr->bottompic = &sec2->floorpic;
|
||||||
ffloor->bottomxoffs = &sec2->floor_xoffs;
|
fflr->bottomxoffs = &sec2->floor_xoffs;
|
||||||
ffloor->bottomyoffs = &sec2->floor_yoffs;
|
fflr->bottomyoffs = &sec2->floor_yoffs;
|
||||||
ffloor->bottomangle = &sec2->floorpic_angle;
|
fflr->bottomangle = &sec2->floorpic_angle;
|
||||||
|
|
||||||
// Add the ceiling
|
// Add the ceiling
|
||||||
ffloor->topheight = &sec2->ceilingheight;
|
fflr->topheight = &sec2->ceilingheight;
|
||||||
ffloor->toppic = &sec2->ceilingpic;
|
fflr->toppic = &sec2->ceilingpic;
|
||||||
ffloor->toplightlevel = &sec2->lightlevel;
|
fflr->toplightlevel = &sec2->lightlevel;
|
||||||
ffloor->topxoffs = &sec2->ceiling_xoffs;
|
fflr->topxoffs = &sec2->ceiling_xoffs;
|
||||||
ffloor->topyoffs = &sec2->ceiling_yoffs;
|
fflr->topyoffs = &sec2->ceiling_yoffs;
|
||||||
ffloor->topangle = &sec2->ceilingpic_angle;
|
fflr->topangle = &sec2->ceilingpic_angle;
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
// Add slopes
|
// Add slopes
|
||||||
ffloor->t_slope = &sec2->c_slope;
|
fflr->t_slope = &sec2->c_slope;
|
||||||
ffloor->b_slope = &sec2->f_slope;
|
fflr->b_slope = &sec2->f_slope;
|
||||||
// mark the target sector as having slopes, if the FOF has any of its own
|
// mark the target sector as having slopes, if the FOF has any of its own
|
||||||
// (this fixes FOF slopes glitching initially at level load in software mode)
|
// (this fixes FOF slopes glitching initially at level load in software mode)
|
||||||
if (sec2->hasslope)
|
if (sec2->hasslope)
|
||||||
|
@ -5728,10 +5738,10 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
||||||
if ((flags & FF_SOLID) && (master->flags & ML_EFFECT2)) // Block all BUT player
|
if ((flags & FF_SOLID) && (master->flags & ML_EFFECT2)) // Block all BUT player
|
||||||
flags &= ~FF_BLOCKPLAYER;
|
flags &= ~FF_BLOCKPLAYER;
|
||||||
|
|
||||||
ffloor->spawnflags = ffloor->flags = flags;
|
fflr->spawnflags = fflr->flags = flags;
|
||||||
ffloor->master = master;
|
fflr->master = master;
|
||||||
ffloor->norender = INFTICS;
|
fflr->norender = INFTICS;
|
||||||
ffloor->fadingdata = NULL;
|
fflr->fadingdata = NULL;
|
||||||
|
|
||||||
// Scan the thinkers to check for special conditions applying to this FOF.
|
// Scan the thinkers to check for special conditions applying to this FOF.
|
||||||
// If we have thinkers sorted by sector, just check the relevant ones;
|
// If we have thinkers sorted by sector, just check the relevant ones;
|
||||||
|
@ -5787,14 +5797,14 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
||||||
if (flags & FF_TRANSLUCENT)
|
if (flags & FF_TRANSLUCENT)
|
||||||
{
|
{
|
||||||
if (sides[master->sidenum[0]].toptexture > 0)
|
if (sides[master->sidenum[0]].toptexture > 0)
|
||||||
ffloor->alpha = sides[master->sidenum[0]].toptexture; // for future reference, "#0" is 1, and "#255" is 256. Be warned
|
fflr->alpha = sides[master->sidenum[0]].toptexture; // for future reference, "#0" is 1, and "#255" is 256. Be warned
|
||||||
else
|
else
|
||||||
ffloor->alpha = 0x80;
|
fflr->alpha = 0x80;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ffloor->alpha = 0xff;
|
fflr->alpha = 0xff;
|
||||||
|
|
||||||
ffloor->spawnalpha = ffloor->alpha; // save for netgames
|
fflr->spawnalpha = fflr->alpha; // save for netgames
|
||||||
|
|
||||||
if (flags & FF_QUICKSAND)
|
if (flags & FF_QUICKSAND)
|
||||||
CheckForQuicksand = true;
|
CheckForQuicksand = true;
|
||||||
|
@ -5818,9 +5828,9 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
||||||
CheckForFloatBob = true;
|
CheckForFloatBob = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
P_AddFFloorToList(sec, ffloor);
|
P_AddFFloorToList(sec, fflr);
|
||||||
|
|
||||||
return ffloor;
|
return fflr;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -6131,7 +6141,7 @@ static inline void P_AddNoEnemiesThinker(sector_t *sec, line_t *sourceline)
|
||||||
* \sa P_SpawnSpecials, T_EachTimeThinker
|
* \sa P_SpawnSpecials, T_EachTimeThinker
|
||||||
* \author SSNTails <http://www.ssntails.org>
|
* \author SSNTails <http://www.ssntails.org>
|
||||||
*/
|
*/
|
||||||
static inline void P_AddEachTimeThinker(sector_t *sec, line_t *sourceline)
|
static void P_AddEachTimeThinker(sector_t *sec, line_t *sourceline)
|
||||||
{
|
{
|
||||||
levelspecthink_t *eachtime;
|
levelspecthink_t *eachtime;
|
||||||
|
|
||||||
|
@ -6183,30 +6193,30 @@ void T_LaserFlash(laserthink_t *flash)
|
||||||
msecnode_t *node;
|
msecnode_t *node;
|
||||||
mobj_t *thing;
|
mobj_t *thing;
|
||||||
sector_t *sourcesec;
|
sector_t *sourcesec;
|
||||||
ffloor_t *ffloor = flash->ffloor;
|
ffloor_t *fflr = flash->ffloor;
|
||||||
sector_t *sector = flash->sector;
|
sector_t *sector = flash->sector;
|
||||||
fixed_t top, bottom;
|
fixed_t top, bottom;
|
||||||
|
|
||||||
if (!ffloor || !(ffloor->flags & FF_EXISTS))
|
if (!fflr || !(fflr->flags & FF_EXISTS))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (leveltime & 2)
|
if (leveltime & 2)
|
||||||
//ffloor->flags |= FF_RENDERALL;
|
//fflr->flags |= FF_RENDERALL;
|
||||||
ffloor->alpha = 0xB0;
|
fflr->alpha = 0xB0;
|
||||||
else
|
else
|
||||||
//ffloor->flags &= ~FF_RENDERALL;
|
//fflr->flags &= ~FF_RENDERALL;
|
||||||
ffloor->alpha = 0x90;
|
fflr->alpha = 0x90;
|
||||||
|
|
||||||
sourcesec = ffloor->master->frontsector; // Less to type!
|
sourcesec = fflr->master->frontsector; // Less to type!
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
top = (*ffloor->t_slope) ? P_GetZAt(*ffloor->t_slope, sector->soundorg.x, sector->soundorg.y)
|
top = (*fflr->t_slope) ? P_GetZAt(*fflr->t_slope, sector->soundorg.x, sector->soundorg.y)
|
||||||
: *ffloor->topheight;
|
: *fflr->topheight;
|
||||||
bottom = (*ffloor->b_slope) ? P_GetZAt(*ffloor->b_slope, sector->soundorg.x, sector->soundorg.y)
|
bottom = (*fflr->b_slope) ? P_GetZAt(*fflr->b_slope, sector->soundorg.x, sector->soundorg.y)
|
||||||
: *ffloor->bottomheight;
|
: *fflr->bottomheight;
|
||||||
sector->soundorg.z = (top + bottom)/2;
|
sector->soundorg.z = (top + bottom)/2;
|
||||||
#else
|
#else
|
||||||
sector->soundorg.z = (*ffloor->topheight + *ffloor->bottomheight)/2;
|
sector->soundorg.z = (*fflr->topheight + *fflr->bottomheight)/2;
|
||||||
#endif
|
#endif
|
||||||
S_StartSound(§or->soundorg, sfx_laser);
|
S_StartSound(§or->soundorg, sfx_laser);
|
||||||
|
|
||||||
|
@ -6215,7 +6225,7 @@ void T_LaserFlash(laserthink_t *flash)
|
||||||
{
|
{
|
||||||
thing = node->m_thing;
|
thing = node->m_thing;
|
||||||
|
|
||||||
if ((ffloor->master->flags & ML_EFFECT1)
|
if ((fflr->master->flags & ML_EFFECT1)
|
||||||
&& thing->flags & MF_BOSS)
|
&& thing->flags & MF_BOSS)
|
||||||
continue; // Don't hurt bosses
|
continue; // Don't hurt bosses
|
||||||
|
|
||||||
|
@ -6239,7 +6249,7 @@ void T_LaserFlash(laserthink_t *flash)
|
||||||
|
|
||||||
/** Adds a laser thinker to a 3Dfloor.
|
/** Adds a laser thinker to a 3Dfloor.
|
||||||
*
|
*
|
||||||
* \param ffloor 3Dfloor to turn into a laser block.
|
* \param fflr 3Dfloor to turn into a laser block.
|
||||||
* \param sector Target sector.
|
* \param sector Target sector.
|
||||||
* \param secthkiners Lists of thinkers sorted by sector. May be NULL.
|
* \param secthkiners Lists of thinkers sorted by sector. May be NULL.
|
||||||
* \sa T_LaserFlash
|
* \sa T_LaserFlash
|
||||||
|
@ -6248,9 +6258,9 @@ void T_LaserFlash(laserthink_t *flash)
|
||||||
static inline void EV_AddLaserThinker(sector_t *sec, sector_t *sec2, line_t *line, thinkerlist_t *secthinkers)
|
static inline void EV_AddLaserThinker(sector_t *sec, sector_t *sec2, line_t *line, thinkerlist_t *secthinkers)
|
||||||
{
|
{
|
||||||
laserthink_t *flash;
|
laserthink_t *flash;
|
||||||
ffloor_t *ffloor = P_AddFakeFloor(sec, sec2, line, laserflags, secthinkers);
|
ffloor_t *fflr = P_AddFakeFloor(sec, sec2, line, laserflags, secthinkers);
|
||||||
|
|
||||||
if (!ffloor)
|
if (!fflr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
flash = Z_Calloc(sizeof (*flash), PU_LEVSPEC, NULL);
|
flash = Z_Calloc(sizeof (*flash), PU_LEVSPEC, NULL);
|
||||||
|
@ -6258,7 +6268,7 @@ static inline void EV_AddLaserThinker(sector_t *sec, sector_t *sec2, line_t *lin
|
||||||
P_AddThinker(THINK_MAIN, &flash->thinker);
|
P_AddThinker(THINK_MAIN, &flash->thinker);
|
||||||
|
|
||||||
flash->thinker.function.acp1 = (actionf_p1)T_LaserFlash;
|
flash->thinker.function.acp1 = (actionf_p1)T_LaserFlash;
|
||||||
flash->ffloor = ffloor;
|
flash->ffloor = fflr;
|
||||||
flash->sector = sec; // For finding mobjs
|
flash->sector = sec; // For finding mobjs
|
||||||
flash->sec = sec2;
|
flash->sec = sec2;
|
||||||
flash->sourceline = line;
|
flash->sourceline = line;
|
||||||
|
@ -6322,7 +6332,7 @@ void P_InitSpecials(void)
|
||||||
|
|
||||||
static void P_ApplyFlatAlignment(line_t *master, sector_t *sector, angle_t flatangle, fixed_t xoffs, fixed_t yoffs)
|
static void P_ApplyFlatAlignment(line_t *master, sector_t *sector, angle_t flatangle, fixed_t xoffs, fixed_t yoffs)
|
||||||
{
|
{
|
||||||
if (!(master->flags & ML_NOSONIC)) // Modify floor flat alignment unless NOSONIC flag is set
|
if (!(master->flags & ML_NETONLY)) // Modify floor flat alignment unless ML_NETONLY flag is set
|
||||||
{
|
{
|
||||||
sector->spawn_flrpic_angle = sector->floorpic_angle = flatangle;
|
sector->spawn_flrpic_angle = sector->floorpic_angle = flatangle;
|
||||||
sector->floor_xoffs += xoffs;
|
sector->floor_xoffs += xoffs;
|
||||||
|
@ -6332,7 +6342,7 @@ static void P_ApplyFlatAlignment(line_t *master, sector_t *sector, angle_t flata
|
||||||
sector->spawn_flr_yoffs = sector->floor_yoffs;
|
sector->spawn_flr_yoffs = sector->floor_yoffs;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(master->flags & ML_NOTAILS)) // Modify ceiling flat alignment unless NOTAILS flag is set
|
if (!(master->flags & ML_NONET)) // Modify ceiling flat alignment unless ML_NONET flag is set
|
||||||
{
|
{
|
||||||
sector->spawn_ceilpic_angle = sector->ceilingpic_angle = flatangle;
|
sector->spawn_ceilpic_angle = sector->ceilingpic_angle = flatangle;
|
||||||
sector->ceiling_xoffs += xoffs;
|
sector->ceiling_xoffs += xoffs;
|
||||||
|
@ -6413,8 +6423,6 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
P_SearchForDisableLinedefs(); // Disable linedefs are now allowed to disable *any* line
|
|
||||||
|
|
||||||
P_SpawnScrollers(); // Add generalized scrollers
|
P_SpawnScrollers(); // Add generalized scrollers
|
||||||
P_SpawnFriction(); // Friction model using linedefs
|
P_SpawnFriction(); // Friction model using linedefs
|
||||||
P_SpawnPushers(); // Pusher model using linedefs
|
P_SpawnPushers(); // Pusher model using linedefs
|
||||||
|
@ -6463,28 +6471,22 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
||||||
// Init line EFFECTs
|
// Init line EFFECTs
|
||||||
for (i = 0; i < numlines; i++)
|
for (i = 0; i < numlines; i++)
|
||||||
{
|
{
|
||||||
if (lines[i].special != 7) // This is a hack. I can at least hope nobody wants to prevent flat alignment with arbitrary skin setups...
|
if (lines[i].special != 7) // This is a hack. I can at least hope nobody wants to prevent flat alignment in netgames...
|
||||||
{
|
{
|
||||||
// set line specials to 0 here too, same reason as above
|
// set line specials to 0 here too, same reason as above
|
||||||
if (netgame || multiplayer)
|
if (netgame || multiplayer)
|
||||||
{
|
{
|
||||||
// future: nonet flag?
|
if (lines[i].flags & ML_NONET)
|
||||||
}
|
|
||||||
else if ((lines[i].flags & ML_NETONLY) == ML_NETONLY)
|
|
||||||
{
|
|
||||||
lines[i].special = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((players[consoleplayer].charability == CA_THOK && (lines[i].flags & ML_NOSONIC))
|
|
||||||
|| (players[consoleplayer].charability == CA_FLY && (lines[i].flags & ML_NOTAILS))
|
|
||||||
|| (players[consoleplayer].charability == CA_GLIDEANDCLIMB && (lines[i].flags & ML_NOKNUX)))
|
|
||||||
{
|
{
|
||||||
lines[i].special = 0;
|
lines[i].special = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (lines[i].flags & ML_NETONLY)
|
||||||
|
{
|
||||||
|
lines[i].special = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (lines[i].special)
|
switch (lines[i].special)
|
||||||
|
@ -6523,20 +6525,14 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
||||||
P_AddCameraScanner(§ors[sec], §ors[s], R_PointToAngle2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y));
|
P_AddCameraScanner(§ors[sec], §ors[s], R_PointToAngle2(lines[i].v2->x, lines[i].v2->y, lines[i].v1->x, lines[i].v1->y));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef PARANOIA
|
|
||||||
case 6: // Disable tags if level not cleared
|
|
||||||
I_Error("Failed to catch a disable linedef");
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case 7: // Flat alignment - redone by toast
|
case 7: // Flat alignment - redone by toast
|
||||||
if ((lines[i].flags & (ML_NOSONIC|ML_NOTAILS)) != (ML_NOSONIC|ML_NOTAILS)) // If you can do something...
|
if ((lines[i].flags & (ML_NETONLY|ML_NONET)) != (ML_NETONLY|ML_NONET)) // If you can do something...
|
||||||
{
|
{
|
||||||
angle_t flatangle = InvAngle(R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y));
|
angle_t flatangle = InvAngle(R_PointToAngle2(lines[i].v1->x, lines[i].v1->y, lines[i].v2->x, lines[i].v2->y));
|
||||||
fixed_t xoffs;
|
fixed_t xoffs;
|
||||||
fixed_t yoffs;
|
fixed_t yoffs;
|
||||||
|
|
||||||
if (lines[i].flags & ML_NOKNUX) // Set offset through x and y texture offsets if NOKNUX flag is set
|
if (lines[i].flags & ML_EFFECT6) // Set offset through x and y texture offsets if ML_EFFECT6 flag is set
|
||||||
{
|
{
|
||||||
xoffs = sides[lines[i].sidenum[0]].textureoffset;
|
xoffs = sides[lines[i].sidenum[0]].textureoffset;
|
||||||
yoffs = sides[lines[i].sidenum[0]].rowoffset;
|
yoffs = sides[lines[i].sidenum[0]].rowoffset;
|
||||||
|
@ -7175,6 +7171,7 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
||||||
case 301:
|
case 301:
|
||||||
case 310:
|
case 310:
|
||||||
case 312:
|
case 312:
|
||||||
|
case 332:
|
||||||
sec = sides[*lines[i].sidenum].sector - sectors;
|
sec = sides[*lines[i].sidenum].sector - sectors;
|
||||||
P_AddEachTimeThinker(§ors[sec], &lines[i]);
|
P_AddEachTimeThinker(§ors[sec], &lines[i]);
|
||||||
break;
|
break;
|
||||||
|
@ -7223,6 +7220,11 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
||||||
case 330:
|
case 330:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Skin trigger executors
|
||||||
|
case 331:
|
||||||
|
case 333:
|
||||||
|
break;
|
||||||
|
|
||||||
case 399: // Linedef execute on map load
|
case 399: // Linedef execute on map load
|
||||||
// This is handled in P_RunLevelLoadExecutors.
|
// This is handled in P_RunLevelLoadExecutors.
|
||||||
break;
|
break;
|
||||||
|
@ -7879,6 +7881,7 @@ void T_Disappear(disappear_t *d)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sectors[s].moved = true;
|
sectors[s].moved = true;
|
||||||
|
P_RecalcPrecipInSector(§ors[s]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d->exists)
|
if (d->exists)
|
||||||
|
@ -8227,7 +8230,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor
|
||||||
d->ffloornum = (UINT32)ffloornum;
|
d->ffloornum = (UINT32)ffloornum;
|
||||||
|
|
||||||
d->alpha = d->sourcevalue = rover->alpha;
|
d->alpha = d->sourcevalue = rover->alpha;
|
||||||
d->destvalue = max(1, min(256, relative ? rover->alpha + destvalue : destvalue)); // ffloor->alpha is 1-256
|
d->destvalue = max(1, min(256, relative ? rover->alpha + destvalue : destvalue)); // rover->alpha is 1-256
|
||||||
|
|
||||||
if (ticbased)
|
if (ticbased)
|
||||||
{
|
{
|
||||||
|
@ -9177,40 +9180,4 @@ static void P_SpawnPushers(void)
|
||||||
Add_Pusher(p_downwind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
Add_Pusher(p_downwind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void P_SearchForDisableLinedefs(void)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
INT32 j;
|
|
||||||
|
|
||||||
// Look for disable linedefs
|
|
||||||
for (i = 0; i < numlines; i++)
|
|
||||||
{
|
|
||||||
if (lines[i].special == 6)
|
|
||||||
{
|
|
||||||
// Remove special
|
|
||||||
// Do *not* remove tag. That would mess with the tag lists
|
|
||||||
// that P_InitTagLists literally just created!
|
|
||||||
lines[i].special = 0;
|
|
||||||
|
|
||||||
// Ability flags can disable disable linedefs now, lol
|
|
||||||
if (netgame || multiplayer)
|
|
||||||
{
|
|
||||||
// future: nonet flag?
|
|
||||||
}
|
|
||||||
else if ((lines[i].flags & ML_NETONLY) == ML_NETONLY)
|
|
||||||
continue; // Net-only never triggers in single player
|
|
||||||
else if (players[consoleplayer].charability == CA_THOK && (lines[i].flags & ML_NOSONIC))
|
|
||||||
continue;
|
|
||||||
else if (players[consoleplayer].charability == CA_FLY && (lines[i].flags & ML_NOTAILS))
|
|
||||||
continue;
|
|
||||||
else if (players[consoleplayer].charability == CA_GLIDEANDCLIMB && (lines[i].flags & ML_NOKNUX))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Disable any linedef specials with our tag.
|
|
||||||
for (j = -1; (j = P_FindLineFromLineTag(&lines[i], j)) >= 0;)
|
|
||||||
lines[j].special = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
222
src/p_user.c
222
src/p_user.c
|
@ -848,6 +848,9 @@ boolean P_PlayerInPain(player_t *player)
|
||||||
if (!(player->pflags & PF_SLIDING) && player->mo->state == &states[player->mo->info->painstate] && player->powers[pw_flashing])
|
if (!(player->pflags & PF_SLIDING) && player->mo->state == &states[player->mo->info->painstate] && player->powers[pw_flashing])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if (player->mo->state == &states[S_PLAY_STUN])
|
||||||
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -959,6 +962,68 @@ void P_ResetPlayer(player_t *player)
|
||||||
CV_SetValue(&cv_analog2, true);
|
CV_SetValue(&cv_analog2, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// P_PlayerCanDamage
|
||||||
|
//
|
||||||
|
// Can player do damage?
|
||||||
|
//
|
||||||
|
boolean P_PlayerCanDamage(player_t *player, mobj_t *thing)
|
||||||
|
{
|
||||||
|
if (!player->mo || player->spectator || !thing || P_MobjWasRemoved(thing))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
{
|
||||||
|
UINT8 shouldCollide = LUAh_PlayerCanDamage(player, thing);
|
||||||
|
if (P_MobjWasRemoved(thing))
|
||||||
|
return false; // removed???
|
||||||
|
if (shouldCollide == 1)
|
||||||
|
return true; // force yes
|
||||||
|
else if (shouldCollide == 2)
|
||||||
|
return false; // force no
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Invinc/super. Not for Monitors.
|
||||||
|
if (!(thing->flags & MF_MONITOR) && (player->powers[pw_invulnerability] || player->powers[pw_super]))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// NiGHTS drill. Wasn't originally for monitors, but that's more an oversight being corrected than anything else.
|
||||||
|
if ((player->powers[pw_carry] == CR_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Jumping.
|
||||||
|
if ((player->pflags & PF_JUMPED)
|
||||||
|
&& (!(player->pflags & PF_NOJUMPDAMAGE)
|
||||||
|
|| (player->charability == CA_TWINSPIN && player->panim == PA_ABILITY)))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Spinning.
|
||||||
|
if (player->pflags & PF_SPINNING)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// From the front.
|
||||||
|
if (((player->pflags & PF_GLIDING) || (player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2))
|
||||||
|
&& (player->drawangle - R_PointToAngle2(player->mo->x - player->mo->momx, player->mo->y - player->mo->momy, thing->x, thing->y) + + ANGLE_90) < ANGLE_180)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// From the top/bottom.
|
||||||
|
if (P_MobjFlip(player->mo)*(player->mo->z - (thing->z + thing->height/2)) > 0)
|
||||||
|
{
|
||||||
|
if ((player->charflags & SF_STOMPDAMAGE || player->pflags & PF_BOUNCING) && (P_MobjFlip(player->mo)*player->mo->momz < 0))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (player->charability == CA_FLY && player->panim == PA_ABILITY)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Shield stomp.
|
||||||
|
if (((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL || (player->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP) && (player->pflags & PF_SHIELDABILITY))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_GivePlayerRings
|
// P_GivePlayerRings
|
||||||
//
|
//
|
||||||
|
@ -1533,6 +1598,7 @@ void P_SpawnShieldOrb(player_t *player)
|
||||||
orbtype = MT_ARMAGEDDON_ORB;
|
orbtype = MT_ARMAGEDDON_ORB;
|
||||||
break;
|
break;
|
||||||
case SH_PITY:
|
case SH_PITY:
|
||||||
|
case SH_PINK: // PITY IN PINK
|
||||||
orbtype = MT_PITY_ORB;
|
orbtype = MT_PITY_ORB;
|
||||||
break;
|
break;
|
||||||
case SH_FLAMEAURA:
|
case SH_FLAMEAURA:
|
||||||
|
@ -1560,7 +1626,13 @@ void P_SpawnShieldOrb(player_t *player)
|
||||||
shieldobj = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, orbtype);
|
shieldobj = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, orbtype);
|
||||||
shieldobj->flags2 |= MF2_SHIELD;
|
shieldobj->flags2 |= MF2_SHIELD;
|
||||||
P_SetTarget(&shieldobj->target, player->mo);
|
P_SetTarget(&shieldobj->target, player->mo);
|
||||||
shieldobj->color = (UINT8)shieldobj->info->painchance;
|
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_PINK)
|
||||||
|
{
|
||||||
|
shieldobj->color = SKINCOLOR_PINK;
|
||||||
|
shieldobj->colorized = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
shieldobj->color = (UINT8)shieldobj->info->painchance;
|
||||||
shieldobj->threshold = (player->powers[pw_shield] & SH_FORCE) ? SH_FORCE : (player->powers[pw_shield] & SH_NOSTACK);
|
shieldobj->threshold = (player->powers[pw_shield] & SH_FORCE) ? SH_FORCE : (player->powers[pw_shield] & SH_NOSTACK);
|
||||||
|
|
||||||
if (shieldobj->info->seestate)
|
if (shieldobj->info->seestate)
|
||||||
|
@ -1666,6 +1738,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
|
||||||
}
|
}
|
||||||
|
|
||||||
ghost->color = mobj->color;
|
ghost->color = mobj->color;
|
||||||
|
ghost->colorized = mobj->colorized; // alternatively, "true" for sonic advance style colourisation
|
||||||
|
|
||||||
ghost->angle = (mobj->player ? mobj->player->drawangle : mobj->angle);
|
ghost->angle = (mobj->player ? mobj->player->drawangle : mobj->angle);
|
||||||
ghost->sprite = mobj->sprite;
|
ghost->sprite = mobj->sprite;
|
||||||
|
@ -1708,6 +1781,9 @@ void P_SpawnThokMobj(player_t *player)
|
||||||
if (player->spectator)
|
if (player->spectator)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!type)
|
||||||
|
return;
|
||||||
|
|
||||||
if (type == MT_GHOST)
|
if (type == MT_GHOST)
|
||||||
mobj = P_SpawnGhostMobj(player->mo); // virtually does everything here for us
|
mobj = P_SpawnGhostMobj(player->mo); // virtually does everything here for us
|
||||||
else
|
else
|
||||||
|
@ -1768,6 +1844,9 @@ void P_SpawnSpinMobj(player_t *player, mobjtype_t type)
|
||||||
if (player->spectator)
|
if (player->spectator)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!type)
|
||||||
|
return;
|
||||||
|
|
||||||
if (type == MT_GHOST)
|
if (type == MT_GHOST)
|
||||||
mobj = P_SpawnGhostMobj(player->mo); // virtually does everything here for us
|
mobj = P_SpawnGhostMobj(player->mo); // virtually does everything here for us
|
||||||
else
|
else
|
||||||
|
@ -1923,10 +2002,45 @@ boolean P_PlayerHitFloor(player_t *player)
|
||||||
}
|
}
|
||||||
else if (player->charability2 == CA2_MELEE && (player->panim == PA_ABILITY2 && player->mo->state-states != S_PLAY_MELEE_LANDING))
|
else if (player->charability2 == CA2_MELEE && (player->panim == PA_ABILITY2 && player->mo->state-states != S_PLAY_MELEE_LANDING))
|
||||||
{
|
{
|
||||||
|
mobjtype_t type = player->revitem;
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_MELEE_LANDING);
|
P_SetPlayerMobjState(player->mo, S_PLAY_MELEE_LANDING);
|
||||||
player->mo->tics = (player->mo->movefactor == FRACUNIT) ? TICRATE/2 : (FixedDiv(35<<(FRACBITS-1), FixedSqrt(player->mo->movefactor)))>>FRACBITS;
|
player->mo->tics = (player->mo->movefactor == FRACUNIT) ? TICRATE/2 : (FixedDiv(35<<(FRACBITS-1), FixedSqrt(player->mo->movefactor)))>>FRACBITS;
|
||||||
S_StartSound(player->mo, sfx_s3k8b);
|
S_StartSound(player->mo, sfx_s3k8b);
|
||||||
player->pflags |= PF_FULLSTASIS;
|
player->pflags |= PF_FULLSTASIS;
|
||||||
|
|
||||||
|
// hearticles
|
||||||
|
if (type)
|
||||||
|
{
|
||||||
|
UINT8 i = 0;
|
||||||
|
angle_t throwang = -(2*ANG30);
|
||||||
|
fixed_t xo = P_ReturnThrustX(player->mo, player->drawangle, 16*player->mo->scale);
|
||||||
|
fixed_t yo = P_ReturnThrustY(player->mo, player->drawangle, 16*player->mo->scale);
|
||||||
|
fixed_t zo = 6*player->mo->scale;
|
||||||
|
fixed_t mu = FixedMul(player->maxdash, player->mo->scale);
|
||||||
|
fixed_t mu2 = FixedHypot(player->mo->momx, player->mo->momy);
|
||||||
|
fixed_t ev;
|
||||||
|
mobj_t *missile;
|
||||||
|
if (mu2 < mu)
|
||||||
|
mu2 = mu;
|
||||||
|
ev = (50*FRACUNIT - (mu/25))/50;
|
||||||
|
while (i < 5)
|
||||||
|
{
|
||||||
|
missile = P_SpawnMobjFromMobj(player->mo, xo, yo, zo, type);
|
||||||
|
P_SetTarget(&missile->target, player->mo);
|
||||||
|
missile->angle = throwang + player->drawangle;
|
||||||
|
P_Thrust(missile, player->drawangle + ANGLE_90,
|
||||||
|
P_ReturnThrustY(missile, throwang, mu)); // side to side component
|
||||||
|
P_Thrust(missile, player->drawangle, mu2); // forward component
|
||||||
|
P_SetObjectMomZ(missile, (4 + ((i&1)<<1))*FRACUNIT, true);
|
||||||
|
missile->fuse = TICRATE/2;
|
||||||
|
missile->extravalue2 = ev;
|
||||||
|
|
||||||
|
i++;
|
||||||
|
throwang += ANG30;
|
||||||
|
}
|
||||||
|
if (mobjinfo[type].seesound)
|
||||||
|
S_StartSound(missile, missile->info->seesound);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (player->pflags & PF_JUMPED || !(player->pflags & PF_SPINNING)
|
else if (player->pflags & PF_JUMPED || !(player->pflags & PF_SPINNING)
|
||||||
|| player->powers[pw_tailsfly] || player->mo->state-states == S_PLAY_FLY_TIRED)
|
|| player->powers[pw_tailsfly] || player->mo->state-states == S_PLAY_FLY_TIRED)
|
||||||
|
@ -4267,7 +4381,11 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
|
||||||
P_SetObjectMomZ(player->mo, player->mindash, false);
|
P_SetObjectMomZ(player->mo, player->mindash, false);
|
||||||
if (player->mo->eflags & MFE_UNDERWATER)
|
if (player->mo->eflags & MFE_UNDERWATER)
|
||||||
player->mo->momz >>= 1;
|
player->mo->momz >>= 1;
|
||||||
|
#if 0
|
||||||
if (FixedMul(player->speed, FINECOSINE(((player->mo->angle - R_PointToAngle2(0, 0, player->rmomx, player->rmomy)) >> ANGLETOFINESHIFT) & FINEMASK)) < FixedMul(player->maxdash, player->mo->scale))
|
if (FixedMul(player->speed, FINECOSINE(((player->mo->angle - R_PointToAngle2(0, 0, player->rmomx, player->rmomy)) >> ANGLETOFINESHIFT) & FINEMASK)) < FixedMul(player->maxdash, player->mo->scale))
|
||||||
|
#else
|
||||||
|
if (player->speed < FixedMul(player->maxdash, player->mo->scale))
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
player->drawangle = player->mo->angle;
|
player->drawangle = player->mo->angle;
|
||||||
P_InstaThrust(player->mo, player->mo->angle, FixedMul(player->maxdash, player->mo->scale));
|
P_InstaThrust(player->mo, player->mo->angle, FixedMul(player->maxdash, player->mo->scale));
|
||||||
|
@ -4341,6 +4459,7 @@ void P_DoJumpShield(player_t *player)
|
||||||
P_InstaThrust(spark, travelangle + i*(ANGLE_MAX/numangles), FixedMul(4*FRACUNIT, spark->scale));
|
P_InstaThrust(spark, travelangle + i*(ANGLE_MAX/numangles), FixedMul(4*FRACUNIT, spark->scale));
|
||||||
if (i % 2)
|
if (i % 2)
|
||||||
P_SetObjectMomZ(spark, -4*FRACUNIT, false);
|
P_SetObjectMomZ(spark, -4*FRACUNIT, false);
|
||||||
|
spark->fuse = 18;
|
||||||
}
|
}
|
||||||
#undef limitangle
|
#undef limitangle
|
||||||
#undef numangles
|
#undef numangles
|
||||||
|
@ -4401,6 +4520,57 @@ void P_DoAbilityBounce(player_t *player, boolean changemomz)
|
||||||
player->pflags |= PF_BOUNCING|PF_THOKKED;
|
player->pflags |= PF_BOUNCING|PF_THOKKED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// P_TwinSpinRejuvenate
|
||||||
|
//
|
||||||
|
// CA_TWINSPIN landing handling
|
||||||
|
//
|
||||||
|
void P_TwinSpinRejuvenate(player_t *player, mobjtype_t type)
|
||||||
|
{
|
||||||
|
fixed_t actionspd;
|
||||||
|
angle_t movang, ang, fa;
|
||||||
|
fixed_t v, h;
|
||||||
|
UINT8 i;
|
||||||
|
|
||||||
|
if (!player->mo || !type)
|
||||||
|
return;
|
||||||
|
|
||||||
|
actionspd = FixedMul(player->actionspd, player->mo->scale);
|
||||||
|
|
||||||
|
fa = (R_PointToAngle2(0, 0, player->mo->momz, FixedHypot(player->mo->momx, player->mo->momy))>>ANGLETOFINESHIFT) & FINEMASK;
|
||||||
|
movang = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy);
|
||||||
|
ang = 0;
|
||||||
|
|
||||||
|
v = FixedMul(actionspd, FINESINE(fa));
|
||||||
|
h = actionspd - FixedMul(actionspd, FINECOSINE(fa));
|
||||||
|
|
||||||
|
// hearticles
|
||||||
|
for (i = 0; i <= 7; i++)
|
||||||
|
{
|
||||||
|
fixed_t side = actionspd - FixedMul(h, abs(FINESINE((ang>>ANGLETOFINESHIFT) & FINEMASK)));
|
||||||
|
fixed_t xo = P_ReturnThrustX(NULL, ang + movang, side);
|
||||||
|
fixed_t yo = P_ReturnThrustY(NULL, ang + movang, side);
|
||||||
|
fixed_t zo = -FixedMul(FINECOSINE(((ang>>ANGLETOFINESHIFT) & FINEMASK)), v);
|
||||||
|
mobj_t *missile = P_SpawnMobjFromMobj(player->mo,
|
||||||
|
xo,
|
||||||
|
yo,
|
||||||
|
player->mo->height/2 + zo,
|
||||||
|
type);
|
||||||
|
P_SetTarget(&missile->target, player->mo);
|
||||||
|
P_SetScale(missile, (missile->destscale >>= 1));
|
||||||
|
missile->angle = ang + movang;
|
||||||
|
missile->fuse = TICRATE/2;
|
||||||
|
missile->extravalue2 = (99*FRACUNIT)/100;
|
||||||
|
missile->momx = xo;
|
||||||
|
missile->momy = yo;
|
||||||
|
missile->momz = zo;
|
||||||
|
|
||||||
|
ang += ANGLE_45;
|
||||||
|
}
|
||||||
|
|
||||||
|
player->pflags &= ~PF_THOKKED;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_Telekinesis
|
// P_Telekinesis
|
||||||
//
|
//
|
||||||
|
@ -4613,10 +4783,10 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
|
||||||
player->mo->momx /= 2;
|
player->mo->momx /= 2;
|
||||||
player->mo->momy /= 2;
|
player->mo->momy /= 2;
|
||||||
}
|
}
|
||||||
else if (player->charability == CA_HOMINGTHOK)
|
if (player->charability == CA_HOMINGTHOK)
|
||||||
{
|
{
|
||||||
player->mo->momx /= 3;
|
player->mo->momx /= 2;
|
||||||
player->mo->momy /= 3;
|
player->mo->momy /= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player->charability == CA_HOMINGTHOK)
|
if (player->charability == CA_HOMINGTHOK)
|
||||||
|
@ -7718,7 +7888,7 @@ static void P_MovePlayer(player_t *player)
|
||||||
if (!(player->pflags & (PF_USEDOWN|PF_GLIDING|PF_SLIDING|PF_SHIELDABILITY)) // If the player is not holding down BT_USE, or having used an ability previously
|
if (!(player->pflags & (PF_USEDOWN|PF_GLIDING|PF_SLIDING|PF_SHIELDABILITY)) // If the player is not holding down BT_USE, or having used an ability previously
|
||||||
&& (!(player->powers[pw_shield] & SH_NOSTACK) || !(player->pflags & PF_THOKKED) || ((player->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP && player->secondjump == UINT8_MAX))) // thokked is optional if you're bubblewrapped/turning super
|
&& (!(player->powers[pw_shield] & SH_NOSTACK) || !(player->pflags & PF_THOKKED) || ((player->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP && player->secondjump == UINT8_MAX))) // thokked is optional if you're bubblewrapped/turning super
|
||||||
{
|
{
|
||||||
// Force shield activation
|
// Force stop
|
||||||
if ((player->powers[pw_shield] & ~(SH_FORCEHP|SH_STACK)) == SH_FORCE)
|
if ((player->powers[pw_shield] & ~(SH_FORCEHP|SH_STACK)) == SH_FORCE)
|
||||||
{
|
{
|
||||||
player->pflags |= PF_THOKKED|PF_SHIELDABILITY;
|
player->pflags |= PF_THOKKED|PF_SHIELDABILITY;
|
||||||
|
@ -7734,17 +7904,17 @@ static void P_MovePlayer(player_t *player)
|
||||||
if (P_SuperReady(player))
|
if (P_SuperReady(player))
|
||||||
P_DoSuperTransformation(player, false);
|
P_DoSuperTransformation(player, false);
|
||||||
break;
|
break;
|
||||||
// Whirlwind/Thundercoin shield activation
|
// Whirlwind jump/Thunder jump
|
||||||
case SH_WHIRLWIND:
|
case SH_WHIRLWIND:
|
||||||
case SH_THUNDERCOIN:
|
case SH_THUNDERCOIN:
|
||||||
P_DoJumpShield(player);
|
P_DoJumpShield(player);
|
||||||
break;
|
break;
|
||||||
// Armageddon shield activation
|
// Armageddon pow
|
||||||
case SH_ARMAGEDDON:
|
case SH_ARMAGEDDON:
|
||||||
player->pflags |= PF_THOKKED|PF_SHIELDABILITY;
|
player->pflags |= PF_THOKKED|PF_SHIELDABILITY;
|
||||||
P_BlackOw(player);
|
P_BlackOw(player);
|
||||||
break;
|
break;
|
||||||
// Attract shield activation
|
// Attraction blast
|
||||||
case SH_ATTRACT:
|
case SH_ATTRACT:
|
||||||
player->pflags |= PF_THOKKED|PF_SHIELDABILITY;
|
player->pflags |= PF_THOKKED|PF_SHIELDABILITY;
|
||||||
player->homing = 2;
|
player->homing = 2;
|
||||||
|
@ -7753,13 +7923,14 @@ static void P_MovePlayer(player_t *player)
|
||||||
{
|
{
|
||||||
player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, lockon->x, lockon->y);
|
player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, lockon->x, lockon->y);
|
||||||
player->pflags &= ~PF_NOJUMPDAMAGE;
|
player->pflags &= ~PF_NOJUMPDAMAGE;
|
||||||
|
P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
|
||||||
S_StartSound(player->mo, sfx_s3k40);
|
S_StartSound(player->mo, sfx_s3k40);
|
||||||
player->homing = 3*TICRATE;
|
player->homing = 3*TICRATE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
S_StartSound(player->mo, sfx_s3ka6);
|
S_StartSound(player->mo, sfx_s3ka6);
|
||||||
break;
|
break;
|
||||||
// Elemental/Bubblewrap shield activation
|
// Elemental stomp/Bubble bounce
|
||||||
case SH_ELEMENTAL:
|
case SH_ELEMENTAL:
|
||||||
case SH_BUBBLEWRAP:
|
case SH_BUBBLEWRAP:
|
||||||
player->pflags |= PF_THOKKED|PF_SHIELDABILITY;
|
player->pflags |= PF_THOKKED|PF_SHIELDABILITY;
|
||||||
|
@ -7773,7 +7944,7 @@ static void P_MovePlayer(player_t *player)
|
||||||
? sfx_s3k43
|
? sfx_s3k43
|
||||||
: sfx_s3k44);
|
: sfx_s3k44);
|
||||||
break;
|
break;
|
||||||
// Flame shield activation
|
// Flame burst
|
||||||
case SH_FLAMEAURA:
|
case SH_FLAMEAURA:
|
||||||
player->pflags |= PF_THOKKED|PF_SHIELDABILITY;
|
player->pflags |= PF_THOKKED|PF_SHIELDABILITY;
|
||||||
P_Thrust(player->mo, player->mo->angle, FixedMul(30*FRACUNIT - FixedSqrt(FixedDiv(player->speed, player->mo->scale)), player->mo->scale));
|
P_Thrust(player->mo, player->mo->angle, FixedMul(30*FRACUNIT - FixedSqrt(FixedDiv(player->speed, player->mo->scale)), player->mo->scale));
|
||||||
|
@ -7794,8 +7965,7 @@ static void P_MovePlayer(player_t *player)
|
||||||
{
|
{
|
||||||
if (player->homing && player->mo->tracer)
|
if (player->homing && player->mo->tracer)
|
||||||
{
|
{
|
||||||
P_HomingAttack(player->mo, player->mo->tracer);
|
if (!P_HomingAttack(player->mo, player->mo->tracer))
|
||||||
if (player->mo->tracer->health <= 0 || (player->mo->tracer->flags2 & MF2_FRET))
|
|
||||||
{
|
{
|
||||||
P_SetObjectMomZ(player->mo, 6*FRACUNIT, false);
|
P_SetObjectMomZ(player->mo, 6*FRACUNIT, false);
|
||||||
if (player->mo->eflags & MFE_UNDERWATER)
|
if (player->mo->eflags & MFE_UNDERWATER)
|
||||||
|
@ -7814,10 +7984,9 @@ static void P_MovePlayer(player_t *player)
|
||||||
if (player->homing && player->mo->tracer)
|
if (player->homing && player->mo->tracer)
|
||||||
{
|
{
|
||||||
P_SpawnThokMobj(player);
|
P_SpawnThokMobj(player);
|
||||||
P_HomingAttack(player->mo, player->mo->tracer);
|
|
||||||
|
|
||||||
// But if you don't, then stop homing.
|
// But if you don't, then stop homing.
|
||||||
if (player->mo->tracer->health <= 0 || (player->mo->tracer->flags2 & MF2_FRET))
|
if (!P_HomingAttack(player->mo, player->mo->tracer))
|
||||||
{
|
{
|
||||||
if (player->mo->eflags & MFE_UNDERWATER)
|
if (player->mo->eflags & MFE_UNDERWATER)
|
||||||
P_SetObjectMomZ(player->mo, FixedDiv(457*FRACUNIT,72*FRACUNIT), false);
|
P_SetObjectMomZ(player->mo, FixedDiv(457*FRACUNIT,72*FRACUNIT), false);
|
||||||
|
@ -8397,7 +8566,7 @@ mobj_t *P_LookForEnemies(player_t *player, boolean nonenemies, boolean bullet)
|
||||||
for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next)
|
for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next)
|
||||||
{
|
{
|
||||||
mo = (mobj_t *)think;
|
mo = (mobj_t *)think;
|
||||||
if (!(mo->flags & (MF_ENEMY|MF_BOSS|MF_MONITOR|MF_SPRING)) == !(mo->flags2 & MF2_INVERTAIMABLE)) // allows if it has the flags desired XOR it has the invert aimable flag
|
if (!((mo->flags & (MF_ENEMY|MF_BOSS|MF_MONITOR) && (mo->flags & MF_SHOOTABLE)) || (mo->flags & MF_SPRING)) == !(mo->flags2 & MF2_INVERTAIMABLE)) // allows if it has the flags desired XOR it has the invert aimable flag
|
||||||
continue; // not a valid target
|
continue; // not a valid target
|
||||||
|
|
||||||
if (mo->health <= 0) // dead
|
if (mo->health <= 0) // dead
|
||||||
|
@ -8409,9 +8578,6 @@ mobj_t *P_LookForEnemies(player_t *player, boolean nonenemies, boolean bullet)
|
||||||
if (mo->flags2 & MF2_FRET)
|
if (mo->flags2 & MF2_FRET)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((mo->flags & (MF_ENEMY|MF_BOSS)) && !(mo->flags & MF_SHOOTABLE)) // don't aim at something you can't shoot at anyway (see Egg Guard or Minus)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!nonenemies && mo->flags & (MF_MONITOR|MF_SPRING))
|
if (!nonenemies && mo->flags & (MF_MONITOR|MF_SPRING))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -8465,17 +8631,23 @@ mobj_t *P_LookForEnemies(player_t *player, boolean nonenemies, boolean bullet)
|
||||||
return closestmo;
|
return closestmo;
|
||||||
}
|
}
|
||||||
|
|
||||||
void P_HomingAttack(mobj_t *source, mobj_t *enemy) // Home in on your target
|
boolean P_HomingAttack(mobj_t *source, mobj_t *enemy) // Home in on your target
|
||||||
{
|
{
|
||||||
fixed_t zdist;
|
fixed_t zdist;
|
||||||
fixed_t dist;
|
fixed_t dist;
|
||||||
fixed_t ns = 0;
|
fixed_t ns = 0;
|
||||||
|
|
||||||
if (!enemy)
|
if (!enemy)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
if (!(enemy->health))
|
if (!enemy->health)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
|
if (enemy->flags2 & MF2_FRET)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!(enemy->flags & (MF_SHOOTABLE|MF_SPRING)) == !(enemy->flags2 & MF2_INVERTAIMABLE)) // allows if it has the flags desired XOR it has the invert aimable flag
|
||||||
|
return false;
|
||||||
|
|
||||||
// change angle
|
// change angle
|
||||||
source->angle = R_PointToAngle2(source->x, source->y, enemy->x, enemy->y);
|
source->angle = R_PointToAngle2(source->x, source->y, enemy->x, enemy->y);
|
||||||
|
@ -8518,6 +8690,8 @@ void P_HomingAttack(mobj_t *source, mobj_t *enemy) // Home in on your target
|
||||||
source->momx = FixedMul(FixedDiv(enemy->x - source->x, dist), ns);
|
source->momx = FixedMul(FixedDiv(enemy->x - source->x, dist), ns);
|
||||||
source->momy = FixedMul(FixedDiv(enemy->y - source->y, dist), ns);
|
source->momy = FixedMul(FixedDiv(enemy->y - source->y, dist), ns);
|
||||||
source->momz = FixedMul(FixedDiv(zdist, dist), ns);
|
source->momz = FixedMul(FixedDiv(zdist, dist), ns);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Search for emeralds
|
// Search for emeralds
|
||||||
|
@ -9684,12 +9858,12 @@ void P_DoPityCheck(player_t *player)
|
||||||
// Apply pity shield if available.
|
// Apply pity shield if available.
|
||||||
if ((player->pity >= 3 || player->pity < 0) && player->powers[pw_shield] == SH_NONE)
|
if ((player->pity >= 3 || player->pity < 0) && player->powers[pw_shield] == SH_NONE)
|
||||||
{
|
{
|
||||||
|
P_SwitchShield(player, SH_PITY);
|
||||||
|
|
||||||
if (player->pity > 0)
|
if (player->pity > 0)
|
||||||
S_StartSound(player->mo, mobjinfo[MT_PITY_ICON].seesound);
|
S_StartSound(player->mo, mobjinfo[MT_PITY_ICON].seesound);
|
||||||
|
|
||||||
player->pity = 0;
|
player->pity = 0;
|
||||||
player->powers[pw_shield] = SH_PITY;
|
|
||||||
P_SpawnShieldOrb(player);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
84
src/r_draw.c
84
src/r_draw.c
|
@ -126,10 +126,12 @@ UINT32 nflatxshift, nflatyshift, nflatshiftup, nflatmask;
|
||||||
#define BOSS_TT_CACHE_INDEX (MAXSKINS + 1)
|
#define BOSS_TT_CACHE_INDEX (MAXSKINS + 1)
|
||||||
#define METALSONIC_TT_CACHE_INDEX (MAXSKINS + 2)
|
#define METALSONIC_TT_CACHE_INDEX (MAXSKINS + 2)
|
||||||
#define ALLWHITE_TT_CACHE_INDEX (MAXSKINS + 3)
|
#define ALLWHITE_TT_CACHE_INDEX (MAXSKINS + 3)
|
||||||
|
#define RAINBOW_TT_CACHE_INDEX (MAXSKINS + 4)
|
||||||
|
#define BLINK_TT_CACHE_INDEX (MAXSKINS + 5)
|
||||||
#define DEFAULT_STARTTRANSCOLOR 96
|
#define DEFAULT_STARTTRANSCOLOR 96
|
||||||
#define NUM_PALETTE_ENTRIES 256
|
#define NUM_PALETTE_ENTRIES 256
|
||||||
|
|
||||||
static UINT8** translationtablecache[MAXSKINS + 4] = {NULL};
|
static UINT8** translationtablecache[MAXSKINS + 6] = {NULL};
|
||||||
|
|
||||||
const UINT8 Color_Index[MAXTRANSLATIONS-1][16] = {
|
const UINT8 Color_Index[MAXTRANSLATIONS-1][16] = {
|
||||||
// {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // SKINCOLOR_NONE
|
// {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // SKINCOLOR_NONE
|
||||||
|
@ -457,17 +459,82 @@ void R_InitTranslationTables(void)
|
||||||
|
|
||||||
\return void
|
\return void
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Define for getting accurate color brightness readings according to how the human eye sees them.
|
||||||
|
// https://en.wikipedia.org/wiki/Relative_luminance
|
||||||
|
// 0.2126 to red
|
||||||
|
// 0.7152 to green
|
||||||
|
// 0.0722 to blue
|
||||||
|
// (See this same define in hw_md2.c!)
|
||||||
|
#define SETBRIGHTNESS(brightness,r,g,b) \
|
||||||
|
brightness = (UINT8)(((1063*((UINT16)r)/5000) + (3576*((UINT16)g)/5000) + (361*((UINT16)b)/5000)) / 3)
|
||||||
|
|
||||||
|
/** \brief Generates the rainbow colourmaps that are used when a player has the invincibility power... stolen from kart, with permission
|
||||||
|
|
||||||
|
\param dest_colormap colormap to populate
|
||||||
|
\param skincolor translation color
|
||||||
|
*/
|
||||||
|
static void R_RainbowColormap(UINT8 *dest_colormap, UINT8 skincolor)
|
||||||
|
{
|
||||||
|
INT32 i;
|
||||||
|
RGBA_t color;
|
||||||
|
UINT8 brightness;
|
||||||
|
INT32 j;
|
||||||
|
UINT8 colorbrightnesses[16];
|
||||||
|
UINT16 brightdif;
|
||||||
|
INT32 temp;
|
||||||
|
|
||||||
|
// first generate the brightness of all the colours of that skincolour
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
color = V_GetColor(Color_Index[skincolor-1][i]);
|
||||||
|
SETBRIGHTNESS(colorbrightnesses[i], color.s.red, color.s.green, color.s.blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// next, for every colour in the palette, choose the transcolor that has the closest brightness
|
||||||
|
for (i = 0; i < NUM_PALETTE_ENTRIES; i++)
|
||||||
|
{
|
||||||
|
if (i == 0 || i == 31) // pure black and pure white don't change
|
||||||
|
{
|
||||||
|
dest_colormap[i] = (UINT8)i;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
color = V_GetColor(i);
|
||||||
|
SETBRIGHTNESS(brightness, color.s.red, color.s.green, color.s.blue);
|
||||||
|
brightdif = 256;
|
||||||
|
for (j = 0; j < 16; j++)
|
||||||
|
{
|
||||||
|
temp = abs((INT16)brightness - (INT16)colorbrightnesses[j]);
|
||||||
|
if (temp < brightdif)
|
||||||
|
{
|
||||||
|
brightdif = (UINT16)temp;
|
||||||
|
dest_colormap[i] = Color_Index[skincolor-1][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef SETBRIGHTNESS
|
||||||
|
|
||||||
static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color)
|
static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color)
|
||||||
{
|
{
|
||||||
INT32 i, starttranscolor, skinramplength;
|
INT32 i, starttranscolor, skinramplength;
|
||||||
|
|
||||||
// Handle a couple of simple special cases
|
// Handle a couple of simple special cases
|
||||||
if (skinnum == TC_BOSS || skinnum == TC_ALLWHITE || skinnum == TC_METALSONIC || color == SKINCOLOR_NONE)
|
if (skinnum == TC_BOSS
|
||||||
|
|| skinnum == TC_ALLWHITE
|
||||||
|
|| skinnum == TC_METALSONIC
|
||||||
|
|| skinnum == TC_BLINK
|
||||||
|
|| color == SKINCOLOR_NONE)
|
||||||
{
|
{
|
||||||
for (i = 0; i < NUM_PALETTE_ENTRIES; i++)
|
if (skinnum == TC_ALLWHITE)
|
||||||
|
memset(dest_colormap, 0, NUM_PALETTE_ENTRIES * sizeof(UINT8));
|
||||||
|
else if (skinnum == TC_BLINK && color != SKINCOLOR_NONE)
|
||||||
|
memset(dest_colormap, Color_Index[color-1][3], NUM_PALETTE_ENTRIES * sizeof(UINT8));
|
||||||
|
else
|
||||||
{
|
{
|
||||||
if (skinnum == TC_ALLWHITE) dest_colormap[i] = 0;
|
for (i = 0; i < NUM_PALETTE_ENTRIES; i++)
|
||||||
else dest_colormap[i] = (UINT8)i;
|
dest_colormap[i] = (UINT8)i;
|
||||||
}
|
}
|
||||||
|
|
||||||
// White!
|
// White!
|
||||||
|
@ -478,6 +545,11 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (skinnum == TC_RAINBOW)
|
||||||
|
{
|
||||||
|
R_RainbowColormap(dest_colormap, color);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (color >= MAXTRANSLATIONS)
|
if (color >= MAXTRANSLATIONS)
|
||||||
I_Error("Invalid skin color #%hu.", (UINT16)color);
|
I_Error("Invalid skin color #%hu.", (UINT16)color);
|
||||||
|
@ -522,6 +594,8 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags)
|
||||||
else if (skinnum == TC_BOSS) skintableindex = BOSS_TT_CACHE_INDEX;
|
else if (skinnum == TC_BOSS) skintableindex = BOSS_TT_CACHE_INDEX;
|
||||||
else if (skinnum == TC_METALSONIC) skintableindex = METALSONIC_TT_CACHE_INDEX;
|
else if (skinnum == TC_METALSONIC) skintableindex = METALSONIC_TT_CACHE_INDEX;
|
||||||
else if (skinnum == TC_ALLWHITE) skintableindex = ALLWHITE_TT_CACHE_INDEX;
|
else if (skinnum == TC_ALLWHITE) skintableindex = ALLWHITE_TT_CACHE_INDEX;
|
||||||
|
else if (skinnum == TC_RAINBOW) skintableindex = RAINBOW_TT_CACHE_INDEX;
|
||||||
|
else if (skinnum == TC_BLINK) skintableindex = BLINK_TT_CACHE_INDEX;
|
||||||
else skintableindex = skinnum;
|
else skintableindex = skinnum;
|
||||||
|
|
||||||
if (flags & GTC_CACHE)
|
if (flags & GTC_CACHE)
|
||||||
|
|
|
@ -105,6 +105,8 @@ extern lumpnum_t viewborderlump[8];
|
||||||
#define TC_BOSS -2
|
#define TC_BOSS -2
|
||||||
#define TC_METALSONIC -3 // For Metal Sonic battle
|
#define TC_METALSONIC -3 // For Metal Sonic battle
|
||||||
#define TC_ALLWHITE -4 // For Cy-Brak-demon
|
#define TC_ALLWHITE -4 // For Cy-Brak-demon
|
||||||
|
#define TC_RAINBOW -5 // For single colour
|
||||||
|
#define TC_BLINK -6 // For item blinking, according to kart
|
||||||
|
|
||||||
// Initialize color translation tables, for player rendering etc.
|
// Initialize color translation tables, for player rendering etc.
|
||||||
void R_InitTranslationTables(void);
|
void R_InitTranslationTables(void);
|
||||||
|
|
|
@ -719,11 +719,11 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||||
|
|
||||||
colfunc = basecolfunc; // hack: this isn't resetting properly somewhere.
|
colfunc = basecolfunc; // hack: this isn't resetting properly somewhere.
|
||||||
dc_colormap = vis->colormap;
|
dc_colormap = vis->colormap;
|
||||||
if (!(vis->cut & SC_PRECIP) && (vis->mobj->flags & (MF_ENEMY|MF_BOSS)) && (vis->mobj->flags2 & MF2_FRET) && (leveltime & 1)) // Bosses "flash"
|
if (!(vis->cut & SC_PRECIP) && (vis->mobj->flags & (MF_ENEMY|MF_BOSS)) && (vis->mobj->flags2 & MF2_FRET) && !(vis->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
|
||||||
{
|
{
|
||||||
// translate certain pixels to white
|
// translate certain pixels to white
|
||||||
colfunc = transcolfunc;
|
colfunc = transcolfunc;
|
||||||
if (vis->mobj->type == MT_CYBRAKDEMON)
|
if (vis->mobj->type == MT_CYBRAKDEMON || vis->mobj->colorized)
|
||||||
dc_translation = R_GetTranslationColormap(TC_ALLWHITE, 0, GTC_CACHE);
|
dc_translation = R_GetTranslationColormap(TC_ALLWHITE, 0, GTC_CACHE);
|
||||||
else if (vis->mobj->type == MT_METALSONIC_BATTLE)
|
else if (vis->mobj->type == MT_METALSONIC_BATTLE)
|
||||||
dc_translation = R_GetTranslationColormap(TC_METALSONIC, 0, GTC_CACHE);
|
dc_translation = R_GetTranslationColormap(TC_METALSONIC, 0, GTC_CACHE);
|
||||||
|
@ -734,7 +734,9 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||||
{
|
{
|
||||||
colfunc = transtransfunc;
|
colfunc = transtransfunc;
|
||||||
dc_transmap = vis->transmap;
|
dc_transmap = vis->transmap;
|
||||||
if (!(vis->cut & SC_PRECIP) && vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // MT_GHOST LOOKS LIKE A PLAYER SO USE THE PLAYER TRANSLATION TABLES. >_>
|
if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized)
|
||||||
|
dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE);
|
||||||
|
else if (!(vis->cut & SC_PRECIP) && vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // MT_GHOST LOOKS LIKE A PLAYER SO USE THE PLAYER TRANSLATION TABLES. >_>
|
||||||
{
|
{
|
||||||
size_t skinnum = (skin_t*)vis->mobj->skin-skins;
|
size_t skinnum = (skin_t*)vis->mobj->skin-skins;
|
||||||
dc_translation = R_GetTranslationColormap((INT32)skinnum, vis->mobj->color, GTC_CACHE);
|
dc_translation = R_GetTranslationColormap((INT32)skinnum, vis->mobj->color, GTC_CACHE);
|
||||||
|
@ -753,7 +755,9 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||||
colfunc = transcolfunc;
|
colfunc = transcolfunc;
|
||||||
|
|
||||||
// New colormap stuff for skins Tails 06-07-2002
|
// New colormap stuff for skins Tails 06-07-2002
|
||||||
if (!(vis->cut & SC_PRECIP) && vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // This thing is a player!
|
if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized)
|
||||||
|
dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE);
|
||||||
|
else if (!(vis->cut & SC_PRECIP) && vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // This thing is a player!
|
||||||
{
|
{
|
||||||
size_t skinnum = (skin_t*)vis->mobj->skin-skins;
|
size_t skinnum = (skin_t*)vis->mobj->skin-skins;
|
||||||
dc_translation = R_GetTranslationColormap((INT32)skinnum, vis->mobj->color, GTC_CACHE);
|
dc_translation = R_GetTranslationColormap((INT32)skinnum, vis->mobj->color, GTC_CACHE);
|
||||||
|
@ -2443,7 +2447,7 @@ static void R_DrawMaskedList (drawnode_t* head)
|
||||||
void R_DrawMasked(maskcount_t* masks, UINT8 nummasks)
|
void R_DrawMasked(maskcount_t* masks, UINT8 nummasks)
|
||||||
{
|
{
|
||||||
drawnode_t heads[nummasks]; /**< Drawnode lists; as many as number of views/portals. */
|
drawnode_t heads[nummasks]; /**< Drawnode lists; as many as number of views/portals. */
|
||||||
INT8 i;
|
SINT8 i;
|
||||||
|
|
||||||
for (i = 0; i < nummasks; i++)
|
for (i = 0; i < nummasks; i++)
|
||||||
{
|
{
|
||||||
|
@ -2700,6 +2704,9 @@ void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum)
|
||||||
player->revitem = skin->revitem < 0 ? (mobjtype_t)mobjinfo[MT_PLAYER].raisestate : (UINT32)skin->revitem;
|
player->revitem = skin->revitem < 0 ? (mobjtype_t)mobjinfo[MT_PLAYER].raisestate : (UINT32)skin->revitem;
|
||||||
player->followitem = skin->followitem;
|
player->followitem = skin->followitem;
|
||||||
|
|
||||||
|
if (((player->powers[pw_shield] & SH_NOSTACK) == SH_PINK) && (player->revitem == MT_LHRT || player->spinitem == MT_LHRT || player->thokitem == MT_LHRT)) // Healers can't keep their buff.
|
||||||
|
player->powers[pw_shield] &= SH_STACK;
|
||||||
|
|
||||||
player->actionspd = skin->actionspd;
|
player->actionspd = skin->actionspd;
|
||||||
player->mindash = skin->mindash;
|
player->mindash = skin->mindash;
|
||||||
player->maxdash = skin->maxdash;
|
player->maxdash = skin->maxdash;
|
||||||
|
|
12
src/sounds.c
12
src/sounds.c
|
@ -137,7 +137,7 @@ sfxinfo_t S_sfx[NUMSFX] =
|
||||||
|
|
||||||
// Game objects, etc
|
// Game objects, etc
|
||||||
{"appear", false, 127, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Appearing platform"},
|
{"appear", false, 127, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Appearing platform"},
|
||||||
{"bkpoof", false, 70, 8, -1, NULL, 0, -1, -1, LUMPERROR, "Armageddon explosion"},
|
{"bkpoof", false, 70, 8, -1, NULL, 0, -1, -1, LUMPERROR, "Armageddon pow"},
|
||||||
{"bnce1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Bounce"}, // Boing!
|
{"bnce1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Bounce"}, // Boing!
|
||||||
{"bnce2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Scatter"}, // Boing!
|
{"bnce2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Scatter"}, // Boing!
|
||||||
{"cannon", false, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR, "Powerful shot"},
|
{"cannon", false, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR, "Powerful shot"},
|
||||||
|
@ -197,6 +197,8 @@ sfxinfo_t S_sfx[NUMSFX] =
|
||||||
{"corkh", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Cork hit"},
|
{"corkh", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Cork hit"},
|
||||||
{"bowl", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Bowling"},
|
{"bowl", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Bowling"},
|
||||||
{"chuchu", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Train horn"},
|
{"chuchu", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Train horn"},
|
||||||
|
{"bsnipe", false, 200, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Home-run smash"},
|
||||||
|
{"sprong", false, 112, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Power spring"},
|
||||||
|
|
||||||
// Menu, interface
|
// Menu, interface
|
||||||
{"chchng", false, 120, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Score"},
|
{"chchng", false, 120, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Score"},
|
||||||
|
@ -303,7 +305,7 @@ sfxinfo_t S_sfx[NUMSFX] =
|
||||||
{"s3k3e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flame Shield"},
|
{"s3k3e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flame Shield"},
|
||||||
{"s3k3f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Bubble Shield"},
|
{"s3k3f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Bubble Shield"},
|
||||||
{"s3k40", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Attraction blast"},
|
{"s3k40", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Attraction blast"},
|
||||||
{"s3k41", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Lightning Shield"},
|
{"s3k41", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Thunder Shield"},
|
||||||
{"s3k42", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Twinspin"},
|
{"s3k42", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Twinspin"},
|
||||||
{"s3k43", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flame burst"},
|
{"s3k43", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flame burst"},
|
||||||
{"s3k44", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Bubble bounce"},
|
{"s3k44", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Bubble bounce"},
|
||||||
|
@ -334,7 +336,7 @@ sfxinfo_t S_sfx[NUMSFX] =
|
||||||
{"s3k5d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Heavy hit"},
|
{"s3k5d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Heavy hit"},
|
||||||
{"s3k5e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Firing laser"},
|
{"s3k5e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Firing laser"},
|
||||||
{"s3k5f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Crusher stomp"},
|
{"s3k5f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Crusher stomp"},
|
||||||
{"s3k60", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying away"},
|
{"s3k60", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Accelerating"},
|
||||||
{"s3k61", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Drilling"},
|
{"s3k61", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Drilling"},
|
||||||
{"s3k62", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Jump"},
|
{"s3k62", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Jump"},
|
||||||
{"s3k63", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Starpost"},
|
{"s3k63", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Starpost"},
|
||||||
|
@ -430,8 +432,8 @@ sfxinfo_t S_sfx[NUMSFX] =
|
||||||
{"s3kbcl", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // long version of previous
|
{"s3kbcl", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // long version of previous
|
||||||
{"s3kbds", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying fortress"},
|
{"s3kbds", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying fortress"},
|
||||||
{"s3kbdl", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying fortress"}, // ditto
|
{"s3kbdl", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying fortress"}, // ditto
|
||||||
{"s3kbes", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying away"},
|
{"s3kbes", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying"},
|
||||||
{"s3kbel", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying away"}, // ditto
|
{"s3kbel", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flying"}, // ditto
|
||||||
{"s3kbfs", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Turbine"},
|
{"s3kbfs", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Turbine"},
|
||||||
{"s3kbfl", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Turbine"}, // ditto
|
{"s3kbfl", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Turbine"}, // ditto
|
||||||
{"s3kc0s", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Turbine"},
|
{"s3kc0s", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Turbine"},
|
||||||
|
|
|
@ -263,6 +263,8 @@ typedef enum
|
||||||
sfx_corkh,
|
sfx_corkh,
|
||||||
sfx_bowl,
|
sfx_bowl,
|
||||||
sfx_chuchu,
|
sfx_chuchu,
|
||||||
|
sfx_bsnipe,
|
||||||
|
sfx_sprong,
|
||||||
|
|
||||||
// Menu, interface
|
// Menu, interface
|
||||||
sfx_chchng,
|
sfx_chchng,
|
||||||
|
|
|
@ -95,6 +95,7 @@ static patch_t *ringshield;
|
||||||
static patch_t *watershield;
|
static patch_t *watershield;
|
||||||
static patch_t *bombshield;
|
static patch_t *bombshield;
|
||||||
static patch_t *pityshield;
|
static patch_t *pityshield;
|
||||||
|
static patch_t *pinkshield;
|
||||||
static patch_t *flameshield;
|
static patch_t *flameshield;
|
||||||
static patch_t *bubbleshield;
|
static patch_t *bubbleshield;
|
||||||
static patch_t *thundershield;
|
static patch_t *thundershield;
|
||||||
|
@ -285,6 +286,7 @@ void ST_LoadGraphics(void)
|
||||||
watershield = W_CachePatchName("TVELICON", PU_HUDGFX);
|
watershield = W_CachePatchName("TVELICON", PU_HUDGFX);
|
||||||
bombshield = W_CachePatchName("TVARICON", PU_HUDGFX);
|
bombshield = W_CachePatchName("TVARICON", PU_HUDGFX);
|
||||||
pityshield = W_CachePatchName("TVPIICON", PU_HUDGFX);
|
pityshield = W_CachePatchName("TVPIICON", PU_HUDGFX);
|
||||||
|
pinkshield = W_CachePatchName("TVPPICON", PU_HUDGFX);
|
||||||
flameshield = W_CachePatchName("TVFLICON", PU_HUDGFX);
|
flameshield = W_CachePatchName("TVFLICON", PU_HUDGFX);
|
||||||
bubbleshield = W_CachePatchName("TVBBICON", PU_HUDGFX);
|
bubbleshield = W_CachePatchName("TVBBICON", PU_HUDGFX);
|
||||||
thundershield = W_CachePatchName("TVZPICON", PU_HUDGFX);
|
thundershield = W_CachePatchName("TVZPICON", PU_HUDGFX);
|
||||||
|
@ -1250,6 +1252,7 @@ static void ST_drawPowerupHUD(void)
|
||||||
case SH_ARMAGEDDON: p = bombshield; break;
|
case SH_ARMAGEDDON: p = bombshield; break;
|
||||||
case SH_ATTRACT: p = ringshield; break;
|
case SH_ATTRACT: p = ringshield; break;
|
||||||
case SH_PITY: p = pityshield; break;
|
case SH_PITY: p = pityshield; break;
|
||||||
|
case SH_PINK: p = pinkshield; break;
|
||||||
case SH_FLAMEAURA: p = flameshield; break;
|
case SH_FLAMEAURA: p = flameshield; break;
|
||||||
case SH_BUBBLEWRAP: p = bubbleshield; break;
|
case SH_BUBBLEWRAP: p = bubbleshield; break;
|
||||||
case SH_THUNDERCOIN: p = thundershield; break;
|
case SH_THUNDERCOIN: p = thundershield; break;
|
||||||
|
|
Loading…
Reference in New Issue