Merge branch 'master' of http://git.magicalgirl.moe/STJr/SRB2Internal into repeat-monitors

# Conflicts:
#	src/info.c
#	src/p_map.c
This commit is contained in:
Inuyasha 2016-09-29 18:08:50 -07:00
commit f1b8bfcfe7
38 changed files with 2539 additions and 1410 deletions

View File

@ -41,12 +41,13 @@ static inline void B_BuildTailsTiccmd(mobj_t *sonic, mobj_t *tails, ticcmd_t *cm
return; return;
#endif #endif
if (tails->player->pflags & (PF_MACESPIN|PF_ITEMHANG)) if (tails->player->powers[pw_carry] == CR_MACESPIN || tails->player->powers[pw_carry] == CR_GENERIC)
{ {
boolean isrelevant = (sonic->player->powers[pw_carry] == CR_MACESPIN || sonic->player->powers[pw_carry] == CR_GENERIC);
dist = P_AproxDistance(tails->x-sonic->x, tails->y-sonic->y); dist = P_AproxDistance(tails->x-sonic->x, tails->y-sonic->y);
if (sonic->player->cmd.buttons & BT_JUMP && sonic->player->pflags & (PF_JUMPED|PF_MACESPIN|PF_ITEMHANG)) if (sonic->player->cmd.buttons & BT_JUMP && (sonic->player->pflags & PF_JUMPED) && isrelevant)
cmd->buttons |= BT_JUMP; cmd->buttons |= BT_JUMP;
if (sonic->player->pflags & (PF_MACESPIN|PF_ITEMHANG)) if (isrelevant)
{ {
cmd->forwardmove = sonic->player->cmd.forwardmove; cmd->forwardmove = sonic->player->cmd.forwardmove;
cmd->angleturn = abs((signed)(tails->angle - sonic->angle))>>16; cmd->angleturn = abs((signed)(tails->angle - sonic->angle))>>16;
@ -211,8 +212,9 @@ boolean B_CheckRespawn(player_t *player)
// Check if Sonic is busy first. // Check if Sonic is busy first.
// If he's doing any of these things, he probably doesn't want to see us. // If he's doing any of these things, he probably doesn't want to see us.
if (sonic->player->pflags & (PF_ROPEHANG|PF_GLIDING|PF_CARRIED|PF_SLIDING|PF_ITEMHANG|PF_MACESPIN|PF_NIGHTSMODE) if (sonic->player->pflags & (PF_GLIDING|PF_SLIDING|PF_NIGHTSMODE)
|| (sonic->player->panim != PA_IDLE && sonic->player->panim != PA_WALK)) || (sonic->player->panim != PA_IDLE && sonic->player->panim != PA_WALK)
|| (sonic->player->powers[pw_carry]))
return false; return false;
// Low ceiling, do not want! // Low ceiling, do not want!

View File

@ -1161,7 +1161,16 @@ found:
var->value = (INT32)(d * FRACUNIT); var->value = (INT32)(d * FRACUNIT);
} }
else else
var->value = atoi(var->string); {
if (var == &cv_forceskin)
{
var->value = R_SkinAvailable(var->string);
if (!R_SkinUnlock(var->value))
var->value = -1;
}
else
var->value = atoi(var->string);
}
finish: finish:
// See the note above. // See the note above.
@ -1385,6 +1394,30 @@ void CV_StealthSet(consvar_t *var, const char *value)
CV_SetCVar(var, value, true); CV_SetCVar(var, value, true);
} }
/** Sets a numeric value to a variable, sometimes calling its callback
* function.
*
* \param var The variable.
* \param value The numeric value, converted to a string before setting.
* \param stealth Do we call the callback function or not?
*/
static void CV_SetValueMaybeStealth(consvar_t *var, INT32 value, boolean stealth)
{
char val[32];
if (var == &cv_forceskin) // Special handling.
{
if ((value < 0) || (value >= numskins))
sprintf(val, "None");
else
sprintf(val, "%s", skins[value].name);
}
else
sprintf(val, "%d", value);
CV_SetCVar(var, val, stealth);
}
/** Sets a numeric value to a variable without calling its callback /** Sets a numeric value to a variable without calling its callback
* function. * function.
* *
@ -1394,10 +1427,7 @@ void CV_StealthSet(consvar_t *var, const char *value)
*/ */
void CV_StealthSetValue(consvar_t *var, INT32 value) void CV_StealthSetValue(consvar_t *var, INT32 value)
{ {
char val[32]; CV_SetValueMaybeStealth(var, value, true);
sprintf(val, "%d", value);
CV_SetCVar(var, val, true);
} }
// New wrapper for what used to be CV_Set() // New wrapper for what used to be CV_Set()
@ -1415,10 +1445,7 @@ void CV_Set(consvar_t *var, const char *value)
*/ */
void CV_SetValue(consvar_t *var, INT32 value) void CV_SetValue(consvar_t *var, INT32 value)
{ {
char val[32]; CV_SetValueMaybeStealth(var, value, false);
sprintf(val, "%d", value);
CV_SetCVar(var, val, false);
} }
/** Adds a value to a console variable. /** Adds a value to a console variable.
@ -1438,7 +1465,23 @@ void CV_AddValue(consvar_t *var, INT32 increment)
// count pointlimit better // count pointlimit better
if (var == &cv_pointlimit && (gametype == GT_MATCH)) if (var == &cv_pointlimit && (gametype == GT_MATCH))
increment *= 50; increment *= 50;
newvalue = var->value + increment;
if (var == &cv_forceskin) // Special handling.
{
INT32 oldvalue = var->value;
newvalue = oldvalue;
do
{
newvalue += increment;
if (newvalue < -1)
newvalue = (numskins - 1);
else if (newvalue >= numskins)
newvalue = -1;
} while ((oldvalue != newvalue)
&& !(R_SkinUnlock(newvalue)));
}
else
newvalue = var->value + increment;
if (var->PossibleValue) if (var->PossibleValue)
{ {

View File

@ -506,6 +506,8 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
rsp->skin = LONG(players[i].skin); rsp->skin = LONG(players[i].skin);
// Just in case Lua does something like // Just in case Lua does something like
// modify these at runtime // modify these at runtime
rsp->camerascale = (fixed_t)LONG(players[i].camerascale);
rsp->shieldscale = (fixed_t)LONG(players[i].shieldscale);
rsp->normalspeed = (fixed_t)LONG(players[i].normalspeed); rsp->normalspeed = (fixed_t)LONG(players[i].normalspeed);
rsp->runspeed = (fixed_t)LONG(players[i].runspeed); rsp->runspeed = (fixed_t)LONG(players[i].runspeed);
rsp->thrustfactor = players[i].thrustfactor; rsp->thrustfactor = players[i].thrustfactor;
@ -521,6 +523,8 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
rsp->mindash = (fixed_t)LONG(players[i].mindash); rsp->mindash = (fixed_t)LONG(players[i].mindash);
rsp->maxdash = (fixed_t)LONG(players[i].maxdash); rsp->maxdash = (fixed_t)LONG(players[i].maxdash);
rsp->jumpfactor = (fixed_t)LONG(players[i].jumpfactor); rsp->jumpfactor = (fixed_t)LONG(players[i].jumpfactor);
rsp->playerheight = (fixed_t)LONG(players[i].height);
rsp->playerspinheight = (fixed_t)LONG(players[i].spinheight);
rsp->speed = (fixed_t)LONG(players[i].speed); rsp->speed = (fixed_t)LONG(players[i].speed);
rsp->jumping = players[i].jumping; rsp->jumping = players[i].jumping;
@ -550,7 +554,6 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
rsp->maxlink = LONG(players[i].maxlink); rsp->maxlink = LONG(players[i].maxlink);
rsp->dashspeed = (fixed_t)LONG(players[i].dashspeed); rsp->dashspeed = (fixed_t)LONG(players[i].dashspeed);
rsp->dashtime = LONG(players[i].dashtime);
rsp->angle_pos = (angle_t)LONG(players[i].angle_pos); rsp->angle_pos = (angle_t)LONG(players[i].angle_pos);
rsp->old_angle_pos = (angle_t)LONG(players[i].old_angle_pos); rsp->old_angle_pos = (angle_t)LONG(players[i].old_angle_pos);
rsp->bumpertime = (tic_t)LONG(players[i].bumpertime); rsp->bumpertime = (tic_t)LONG(players[i].bumpertime);
@ -633,6 +636,8 @@ static void resynch_read_player(resynch_pak *rsp)
players[i].skin = LONG(rsp->skin); players[i].skin = LONG(rsp->skin);
// Just in case Lua does something like // Just in case Lua does something like
// modify these at runtime // modify these at runtime
players[i].camerascale = (fixed_t)LONG(rsp->camerascale);
players[i].shieldscale = (fixed_t)LONG(rsp->shieldscale);
players[i].normalspeed = (fixed_t)LONG(rsp->normalspeed); players[i].normalspeed = (fixed_t)LONG(rsp->normalspeed);
players[i].runspeed = (fixed_t)LONG(rsp->runspeed); players[i].runspeed = (fixed_t)LONG(rsp->runspeed);
players[i].thrustfactor = rsp->thrustfactor; players[i].thrustfactor = rsp->thrustfactor;
@ -648,6 +653,8 @@ static void resynch_read_player(resynch_pak *rsp)
players[i].mindash = (fixed_t)LONG(rsp->mindash); players[i].mindash = (fixed_t)LONG(rsp->mindash);
players[i].maxdash = (fixed_t)LONG(rsp->maxdash); players[i].maxdash = (fixed_t)LONG(rsp->maxdash);
players[i].jumpfactor = (fixed_t)LONG(rsp->jumpfactor); players[i].jumpfactor = (fixed_t)LONG(rsp->jumpfactor);
players[i].height = (fixed_t)LONG(rsp->playerheight);
players[i].spinheight = (fixed_t)LONG(rsp->playerspinheight);
players[i].speed = (fixed_t)LONG(rsp->speed); players[i].speed = (fixed_t)LONG(rsp->speed);
players[i].jumping = rsp->jumping; players[i].jumping = rsp->jumping;
@ -677,7 +684,6 @@ static void resynch_read_player(resynch_pak *rsp)
players[i].maxlink = LONG(rsp->maxlink); players[i].maxlink = LONG(rsp->maxlink);
players[i].dashspeed = (fixed_t)LONG(rsp->dashspeed); players[i].dashspeed = (fixed_t)LONG(rsp->dashspeed);
players[i].dashtime = LONG(rsp->dashtime);
players[i].angle_pos = (angle_t)LONG(rsp->angle_pos); players[i].angle_pos = (angle_t)LONG(rsp->angle_pos);
players[i].old_angle_pos = (angle_t)LONG(rsp->old_angle_pos); players[i].old_angle_pos = (angle_t)LONG(rsp->old_angle_pos);
players[i].bumpertime = (tic_t)LONG(rsp->bumpertime); players[i].bumpertime = (tic_t)LONG(rsp->bumpertime);

View File

@ -166,6 +166,8 @@ typedef struct
INT32 skin; INT32 skin;
// Just in case Lua does something like // Just in case Lua does something like
// modify these at runtime // modify these at runtime
fixed_t camerascale;
fixed_t shieldscale;
fixed_t normalspeed; fixed_t normalspeed;
fixed_t runspeed; fixed_t runspeed;
UINT8 thrustfactor; UINT8 thrustfactor;
@ -181,6 +183,8 @@ typedef struct
fixed_t mindash; fixed_t mindash;
fixed_t maxdash; fixed_t maxdash;
fixed_t jumpfactor; fixed_t jumpfactor;
fixed_t playerheight;
fixed_t playerspinheight;
fixed_t speed; fixed_t speed;
UINT8 jumping; UINT8 jumping;
@ -210,7 +214,6 @@ typedef struct
INT32 maxlink; INT32 maxlink;
fixed_t dashspeed; fixed_t dashspeed;
INT32 dashtime;
angle_t angle_pos; angle_t angle_pos;
angle_t old_angle_pos; angle_t old_angle_pos;
tic_t bumpertime; tic_t bumpertime;

View File

@ -332,7 +332,7 @@ consvar_t cv_usemapnumlaps = {"usemaplaps", "Yes", CV_NETVAR, CV_YesNo, NULL, 0,
// log elemental hazards -- not a netvar, is local to current player // log elemental hazards -- not a netvar, is local to current player
consvar_t cv_hazardlog = {"hazardlog", "Yes", 0, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_hazardlog = {"hazardlog", "Yes", 0, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_forceskin = {"forceskin", "-1", CV_NETVAR|CV_CALL|CV_CHEAT, NULL, ForceSkin_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_forceskin = {"forceskin", "None", CV_NETVAR|CV_CALL|CV_CHEAT, NULL, ForceSkin_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_downloading = {"downloading", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_downloading = {"downloading", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_allowexitlevel = {"allowexitlevel", "No", CV_NETVAR, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_allowexitlevel = {"allowexitlevel", "No", CV_NETVAR, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
@ -1092,7 +1092,7 @@ static void SendNameAndColor(void)
SetPlayerSkinByNum(consoleplayer, 0); SetPlayerSkinByNum(consoleplayer, 0);
CV_StealthSet(&cv_skin, skins[0].name); CV_StealthSet(&cv_skin, skins[0].name);
} }
else if ((foundskin = R_SkinAvailable(cv_skin.string)) != -1) else if ((foundskin = R_SkinAvailable(cv_skin.string)) != -1 && R_SkinUnlock(foundskin))
{ {
boolean notsame; boolean notsame;
@ -1139,7 +1139,7 @@ static void SendNameAndColor(void)
// check if player has the skin loaded (cv_skin may have // check if player has the skin loaded (cv_skin may have
// the name of a skin that was available in the previous game) // the name of a skin that was available in the previous game)
cv_skin.value = R_SkinAvailable(cv_skin.string); cv_skin.value = R_SkinAvailable(cv_skin.string);
if (cv_skin.value < 0) if ((cv_skin.value < 0) || !R_SkinUnlock(cv_skin.value))
{ {
CV_StealthSet(&cv_skin, DEFAULTSKIN); CV_StealthSet(&cv_skin, DEFAULTSKIN);
cv_skin.value = 0; cv_skin.value = 0;
@ -1217,7 +1217,7 @@ static void SendNameAndColor2(void)
SetPlayerSkinByNum(secondplaya, forcedskin); SetPlayerSkinByNum(secondplaya, forcedskin);
CV_StealthSet(&cv_skin2, skins[forcedskin].name); CV_StealthSet(&cv_skin2, skins[forcedskin].name);
} }
else if ((foundskin = R_SkinAvailable(cv_skin2.string)) != -1) else if ((foundskin = R_SkinAvailable(cv_skin2.string)) != -1 && R_SkinUnlock(foundskin))
{ {
boolean notsame; boolean notsame;
@ -4002,17 +4002,10 @@ static void Command_Archivetest_f(void)
*/ */
static void ForceSkin_OnChange(void) static void ForceSkin_OnChange(void)
{ {
if ((server || adminplayer == consoleplayer) && (cv_forceskin.value < -1 || cv_forceskin.value >= numskins)) if ((server || adminplayer == consoleplayer) && ((cv_forceskin.value == -1 && stricmp(cv_forceskin.string, "None")) || !(R_SkinUnlock(cv_forceskin.value))))
{ {
if (cv_forceskin.value == -2) CONS_Printf("Please provide a valid skin name (\"None\" disables).\n");
CV_SetValue(&cv_forceskin, numskins-1); CV_SetValue(&cv_forceskin, -1);
else
{
// hack because I can't restrict this and still allow added skins to be used with forceskin.
if (!menuactive)
CONS_Printf(M_GetText("Valid skin numbers are 0 to %d (-1 disables)\n"), numskins - 1);
CV_SetValue(&cv_forceskin, -1);
}
return; return;
} }
@ -4024,7 +4017,7 @@ static void ForceSkin_OnChange(void)
CONS_Printf("The server has lifted the forced skin restrictions.\n"); CONS_Printf("The server has lifted the forced skin restrictions.\n");
else else
{ {
CONS_Printf("The server is restricting all players to skin \"%s\".\n",skins[cv_forceskin.value].name); CONS_Printf("The server is restricting all players to skin \"%s\".\n",skins[cv_forceskin.value].realname);
ForceAllSkins(cv_forceskin.value); ForceAllSkins(cv_forceskin.value);
} }
} }

View File

@ -39,6 +39,12 @@ typedef enum
SF_NOSKID = 1<<4, // No skid particles etc SF_NOSKID = 1<<4, // No skid particles etc
SF_NOSPEEDADJUST = 1<<5, // Skin-specific version of disablespeedadjust SF_NOSPEEDADJUST = 1<<5, // Skin-specific version of disablespeedadjust
SF_RUNONWATER = 1<<6, // Run on top of water FOFs? SF_RUNONWATER = 1<<6, // Run on top of water FOFs?
SF_NOJUMPSPIN = 1<<7, // SPR2_JUMP defaults to SPR2_SPRG instead of SPR2_SPIN, falling states used, and player height is full when jumping?
SF_NOJUMPDAMAGE = 1<<8, // Don't damage enemies, etc whilst jumping?
SF_STOMPDAMAGE = 1<<9, // Always damage enemies, etc by landing on them, no matter your vunerability?
SF_MARIODAMAGE = SF_NOJUMPDAMAGE|SF_STOMPDAMAGE, // The Mario method of being able to damage enemies, etc.
SF_MACHINE = 1<<10, // Beep boop. Are you a robot?
// free up to and including 1<<31
} skinflags_t; } skinflags_t;
//Primary and secondary skin abilities //Primary and secondary skin abilities
@ -58,7 +64,8 @@ typedef enum
CA_JUMPBOOST, CA_JUMPBOOST,
CA_AIRDRILL, CA_AIRDRILL,
CA_JUMPTHOK, CA_JUMPTHOK,
CA_DASHMODE CA_DASHMODE,
CA_TWINSPIN
} charability_t; } charability_t;
//Secondary skin abilities //Secondary skin abilities
@ -66,7 +73,8 @@ typedef enum
{ {
CA2_NONE=0, CA2_NONE=0,
CA2_SPINDASH, CA2_SPINDASH,
CA2_MULTIABILITY CA2_MULTIABILITY,
CA2_MELEE
} charability2_t; } charability2_t;
// //
@ -121,40 +129,31 @@ typedef enum
// Are you gliding? // Are you gliding?
PF_GLIDING = 1<<16, PF_GLIDING = 1<<16,
// Tails pickup!
PF_CARRIED = 1<<17,
// Sliding (usually in water) like Labyrinth/Oil Ocean // Sliding (usually in water) like Labyrinth/Oil Ocean
PF_SLIDING = 1<<18, PF_SLIDING = 1<<17,
// Hanging on a rope
PF_ROPEHANG = 1<<19,
// Hanging on an item of some kind - zipline, chain, etc. (->tracer)
PF_ITEMHANG = 1<<20,
// On the mace chain spinning around (->tracer)
PF_MACESPIN = 1<<21,
/*** NIGHTS STUFF ***/ /*** NIGHTS STUFF ***/
// Is the player in NiGHTS mode? // Is the player in NiGHTS mode?
PF_NIGHTSMODE = 1<<22, PF_NIGHTSMODE = 1<<18,
PF_TRANSFERTOCLOSEST = 1<<23, PF_TRANSFERTOCLOSEST = 1<<19,
// Spill rings after falling // Spill rings after falling
PF_NIGHTSFALL = 1<<24, PF_NIGHTSFALL = 1<<20,
PF_DRILLING = 1<<25, PF_DRILLING = 1<<21,
PF_SKIDDOWN = 1<<26, PF_SKIDDOWN = 1<<22,
/*** TAG STUFF ***/ /*** TAG STUFF ***/
PF_TAGGED = 1<<27, // Player has been tagged and awaits the next round in hide and seek. PF_TAGGED = 1<<23, // Player has been tagged and awaits the next round in hide and seek.
PF_TAGIT = 1<<28, // The player is it! For Tag Mode PF_TAGIT = 1<<24, // The player is it! For Tag Mode
/*** misc ***/ /*** misc ***/
PF_FORCESTRAFE = 1<<29, // Turning inputs are translated into strafing inputs PF_FORCESTRAFE = 1<<25, // Turning inputs are translated into strafing inputs
PF_ANALOGMODE = 1<<30, // Analog mode? PF_ANALOGMODE = 1<<26, // Analog mode?
// free: 1<<30 and 1<<31 // Can carry another player?
PF_CANCARRY = 1<<27
// free up to and including 1<<31
} pflags_t; } pflags_t;
typedef enum typedef enum
@ -168,9 +167,11 @@ typedef enum
PA_PEEL, PA_PEEL,
PA_PAIN, PA_PAIN,
PA_ROLL, PA_ROLL,
PA_JUMP,
PA_SPRING, PA_SPRING,
PA_FALL, PA_FALL,
PA_ABILITY, PA_ABILITY,
PA_ABILITY2,
PA_RIDE PA_RIDE
} panim_t; } panim_t;
@ -195,7 +196,20 @@ typedef enum
SH_STACK = SH_FIREFLOWER, SH_STACK = SH_FIREFLOWER,
SH_NOSTACK = ~SH_STACK SH_NOSTACK = ~SH_STACK
} shieldtype_t; } shieldtype_t; // pw_shield
typedef enum
{
CR_NONE = 0,
// The generic case is suitable for most objects.
CR_GENERIC,
// Tails carry.
CR_PLAYER,
// Specific level gimmicks.
CR_ZOOMTUBE,
CR_ROPEHANG,
CR_MACESPIN
} carrytype_t; // pw_carry
// Player powers. (don't edit this comment) // Player powers. (don't edit this comment)
typedef enum typedef enum
@ -204,6 +218,7 @@ typedef enum
pw_sneakers, pw_sneakers,
pw_flashing, pw_flashing,
pw_shield, pw_shield,
pw_carry,
pw_tailsfly, // tails flying pw_tailsfly, // tails flying
pw_underwater, // underwater timer pw_underwater, // underwater timer
pw_spacetime, // In space, no one can hear you spin! pw_spacetime, // In space, no one can hear you spin!
@ -267,6 +282,8 @@ typedef struct player_s
playerstate_t playerstate; playerstate_t playerstate;
// Determine POV, including viewpoint bobbing during movement. // Determine POV, including viewpoint bobbing during movement.
fixed_t camerascale;
fixed_t shieldscale;
// Focal origin above r.z // Focal origin above r.z
fixed_t viewz; fixed_t viewz;
// Base height above floor for viewz. // Base height above floor for viewz.
@ -310,7 +327,6 @@ typedef struct player_s
UINT32 score; // player score UINT32 score; // player score
fixed_t dashspeed; // dashing speed fixed_t dashspeed; // dashing speed
INT32 dashtime; // tics dashing, used for rev sound
fixed_t normalspeed; // Normal ground fixed_t normalspeed; // Normal ground
fixed_t runspeed; // Speed you break into the run animation fixed_t runspeed; // Speed you break into the run animation
@ -335,6 +351,9 @@ typedef struct player_s
fixed_t jumpfactor; // How high can the player jump? fixed_t jumpfactor; // How high can the player jump?
fixed_t height; // Bounding box changes.
fixed_t spinheight;
SINT8 lives; SINT8 lives;
SINT8 continues; // continues that player has acquired SINT8 continues; // continues that player has acquired

View File

@ -430,16 +430,20 @@ static void readAnimTex(MYFILE *f, INT32 num)
} }
*/ */
static boolean findFreeSlot(INT32 *num) static boolean findFreeSlot(INT32 *num, UINT16 wadnum)
{ {
// Send the character select entry to a free slot. // Send the character select entry to a free slot.
while (*num < 32 && PlayerMenu[*num].status != IT_DISABLED) while (*num < 32 && (!(PlayerMenu[*num].status & IT_DISABLED) || description[*num].wadnum == wadnum)) // Will kill hidden characters from other files, but that's okay.
*num = *num+1; *num = *num+1;
// No more free slots. :( // No more free slots. :(
if (*num >= 32) if (*num >= 32)
return false; return false;
PlayerMenu[*num].status = IT_CALL;
description[*num].wadnum = wadnum;
description[*num].picname[0] = '\0'; // Redesign your logo. (See M_DrawSetupChoosePlayerMenu in m_menu.c...)
// Found one! ^_^ // Found one! ^_^
return true; return true;
} }
@ -473,9 +477,8 @@ static void readPlayer(MYFILE *f, INT32 num)
{ {
char *playertext = NULL; char *playertext = NULL;
if (!slotfound && (slotfound = findFreeSlot(&num)) == false) if (!slotfound && (slotfound = findFreeSlot(&num, f->wad)) == false)
goto done; goto done;
PlayerMenu[num].status = IT_CALL;
for (i = 0; i < MAXLINELEN-3; i++) for (i = 0; i < MAXLINELEN-3; i++)
{ {
@ -521,34 +524,12 @@ static void readPlayer(MYFILE *f, INT32 num)
word2[strlen(word2)-1] = '\0'; word2[strlen(word2)-1] = '\0';
i = atoi(word2); i = atoi(word2);
/*if (fastcmp(word, "PLAYERNAME")) if (fastcmp(word, "PICNAME"))
{ {
if (!slotfound && (slotfound = findFreeSlot(&num)) == false) if (!slotfound && (slotfound = findFreeSlot(&num, f->wad)) == false)
goto done;
DEH_WriteUndoline(word, description[num].text, UNDO_NONE);
strlcpy(description[num].text, word2, sizeof (description[num].text));
for (word2 = description[num].text; *word2; word2++)
if (*word2 == '_')
*word2 = ' ';
PlayerMenu[num].text = description[num].text;
}*/
/* else if (fastcmp(word, "MENUPOSITION"))
{ // Make sure you make MENUPOSITION the first thing under CHARACTER if you're using it!
// This is to manually choose a slot and overwrite existing characters! It is NOT necessary for most individual character wads!!
#ifdef DELFILE
if (disableundo)
#endif
{
slotfound = true;
num = i;
}
} */
/*else*/ if (fastcmp(word, "PICNAME"))
{
if (!slotfound && (slotfound = findFreeSlot(&num)) == false)
goto done; goto done;
DEH_WriteUndoline(word, &description[num].picname[0], UNDO_NONE); DEH_WriteUndoline(word, &description[num].picname[0], UNDO_NONE);
PlayerMenu[num].status = IT_CALL;
strncpy(description[num].picname, word2, 8); strncpy(description[num].picname, word2, 8);
} }
else if (fastcmp(word, "STATUS")) else if (fastcmp(word, "STATUS"))
@ -563,13 +544,10 @@ static void readPlayer(MYFILE *f, INT32 num)
You MAY disable previous entries if you so desire... You MAY disable previous entries if you so desire...
But try to enable something that's already enabled and you will be sent to a free slot. But try to enable something that's already enabled and you will be sent to a free slot.
Because of this, you are allowed to edit any previous entrys you like, but only if you Because of this, you are allowed to edit any previous entries you like, but only if you
signal that you are purposely doing so by disabling and then reenabling the slot. signal that you are purposely doing so by disabling and then reenabling the slot.
... Or use MENUPOSITION first, that works too. Hell, you could edit multiple character
slots in a single section that way, due to how SOC editing works.
*/ */
if (i != IT_DISABLED && !slotfound && (slotfound = findFreeSlot(&num)) == false) if (i != IT_DISABLED && !slotfound && (slotfound = findFreeSlot(&num, f->wad)) == false)
goto done; goto done;
DEH_WriteUndoline(word, va("%d", PlayerMenu[num].status), UNDO_NONE); DEH_WriteUndoline(word, va("%d", PlayerMenu[num].status), UNDO_NONE);
PlayerMenu[num].status = (INT16)i; PlayerMenu[num].status = (INT16)i;
@ -577,10 +555,9 @@ static void readPlayer(MYFILE *f, INT32 num)
else if (fastcmp(word, "SKINNAME")) else if (fastcmp(word, "SKINNAME"))
{ {
// Send to free slot. // Send to free slot.
if (!slotfound && (slotfound = findFreeSlot(&num)) == false) if (!slotfound && (slotfound = findFreeSlot(&num, f->wad)) == false)
goto done; goto done;
DEH_WriteUndoline(word, description[num].skinname, UNDO_NONE); DEH_WriteUndoline(word, description[num].skinname, UNDO_NONE);
PlayerMenu[num].status = IT_CALL;
strlcpy(description[num].skinname, word2, sizeof description[num].skinname); strlcpy(description[num].skinname, word2, sizeof description[num].skinname);
strlwr(description[num].skinname); strlwr(description[num].skinname);
@ -3826,8 +3803,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_PLAY_EDGE", "S_PLAY_EDGE",
"S_PLAY_RIDE", "S_PLAY_RIDE",
// CA_FLY // CA_FLY/SWIM
"S_PLAY_FLY", "S_PLAY_FLY",
"S_PLAY_SWIM",
"S_PLAY_FLY_TIRED", "S_PLAY_FLY_TIRED",
// CA_GLIDEANDCLIMB // CA_GLIDEANDCLIMB
@ -3835,6 +3813,13 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_PLAY_CLING", "S_PLAY_CLING",
"S_PLAY_CLIMB", "S_PLAY_CLIMB",
// CA_TWINSPIN
"S_PLAY_TWINSPIN",
// CA2_MELEE
"S_PLAY_MELEE",
"S_PLAY_MELEE_FINISH",
// SF_SUPERANIMS // SF_SUPERANIMS
"S_PLAY_SUPER_STND", "S_PLAY_SUPER_STND",
"S_PLAY_SUPER_WALK", "S_PLAY_SUPER_WALK",
@ -3877,6 +3862,50 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
// Level end sign (uses player sprite) // Level end sign (uses player sprite)
"S_PLAY_SIGN", "S_PLAY_SIGN",
// NiGHTS character (uses player sprite)
"S_PLAY_NIGHTS_TRANS",
"S_PLAY_NIGHTS_TRANS2",
"S_PLAY_NIGHTS_TRANS3",
"S_PLAY_NIGHTS_TRANS4",
"S_PLAY_NIGHTS_TRANS5",
"S_PLAY_NIGHTS_TRANS6",
"S_PLAY_NIGHTS_TRANS7",
"S_PLAY_NIGHTS_TRANS8",
"S_PLAY_NIGHTS_TRANS9",
"S_PLAY_NIGHTS_STAND",
"S_PLAY_NIGHTS_FLOAT",
"S_PLAY_NIGHTS_PAIN",
"S_PLAY_NIGHTS_PULL",
"S_PLAY_NIGHTS_ATTACK",
"S_PLAY_NIGHTS_FLY0",
"S_PLAY_NIGHTS_DRILL0",
"S_PLAY_NIGHTS_FLY1",
"S_PLAY_NIGHTS_DRILL1",
"S_PLAY_NIGHTS_FLY2",
"S_PLAY_NIGHTS_DRILL2",
"S_PLAY_NIGHTS_FLY3",
"S_PLAY_NIGHTS_DRILL3",
"S_PLAY_NIGHTS_FLY4",
"S_PLAY_NIGHTS_DRILL4",
"S_PLAY_NIGHTS_FLY5",
"S_PLAY_NIGHTS_DRILL5",
"S_PLAY_NIGHTS_FLY6",
"S_PLAY_NIGHTS_DRILL6",
"S_PLAY_NIGHTS_FLY7",
"S_PLAY_NIGHTS_DRILL7",
"S_PLAY_NIGHTS_FLY8",
"S_PLAY_NIGHTS_DRILL8",
"S_PLAY_NIGHTS_FLY9",
"S_PLAY_NIGHTS_DRILL9",
"S_PLAY_NIGHTS_FLYA",
"S_PLAY_NIGHTS_DRILLA",
"S_PLAY_NIGHTS_FLYB",
"S_PLAY_NIGHTS_DRILLB",
"S_PLAY_NIGHTS_FLYC",
"S_PLAY_NIGHTS_DRILLC",
// Blue Crawla // Blue Crawla
"S_POSS_STND", "S_POSS_STND",
"S_POSS_RUN1", "S_POSS_RUN1",
@ -4727,6 +4756,8 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
// Bubble Source // Bubble Source
"S_BUBBLES1", "S_BUBBLES1",
"S_BUBBLES2", "S_BUBBLES2",
"S_BUBBLES3",
"S_BUBBLES4",
// Level End Sign // Level End Sign
"S_SIGN1", "S_SIGN1",
@ -5525,14 +5556,15 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
// Bubbles // Bubbles
"S_SMALLBUBBLE", "S_SMALLBUBBLE",
"S_SMALLBUBBLE1",
"S_MEDIUMBUBBLE", "S_MEDIUMBUBBLE",
"S_MEDIUMBUBBLE1", "S_LARGEBUBBLE1",
"S_LARGEBUBBLE", "S_LARGEBUBBLE2",
"S_EXTRALARGEBUBBLE", // breathable "S_EXTRALARGEBUBBLE", // breathable
"S_POP1", // Extra Large bubble goes POP! "S_POP1", // Extra Large bubble goes POP!
"S_WATERZAP",
"S_FOG1", "S_FOG1",
"S_FOG2", "S_FOG2",
"S_FOG3", "S_FOG3",
@ -5574,6 +5606,13 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_FOUR1", "S_FOUR1",
"S_FIVE1", "S_FIVE1",
"S_ZERO2",
"S_ONE2",
"S_TWO2",
"S_THREE2",
"S_FOUR2",
"S_FIVE2",
// Tag Sign // Tag Sign
"S_TTAG1", "S_TTAG1",
@ -5806,93 +5845,6 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_NIGHTSGOAL3", "S_NIGHTSGOAL3",
"S_NIGHTSGOAL4", "S_NIGHTSGOAL4",
"S_NIGHTSFLY1A",
"S_NIGHTSFLY1B",
"S_NIGHTSDRILL1A",
"S_NIGHTSDRILL1B",
"S_NIGHTSDRILL1C",
"S_NIGHTSDRILL1D",
"S_NIGHTSFLY2A",
"S_NIGHTSFLY2B",
"S_NIGHTSDRILL2A",
"S_NIGHTSDRILL2B",
"S_NIGHTSDRILL2C",
"S_NIGHTSDRILL2D",
"S_NIGHTSFLY3A",
"S_NIGHTSFLY3B",
"S_NIGHTSDRILL3A",
"S_NIGHTSDRILL3B",
"S_NIGHTSDRILL3C",
"S_NIGHTSDRILL3D",
"S_NIGHTSFLY4A",
"S_NIGHTSFLY4B",
"S_NIGHTSDRILL4A",
"S_NIGHTSDRILL4B",
"S_NIGHTSDRILL4C",
"S_NIGHTSDRILL4D",
"S_NIGHTSFLY5A",
"S_NIGHTSFLY5B",
"S_NIGHTSDRILL5A",
"S_NIGHTSDRILL5B",
"S_NIGHTSDRILL5C",
"S_NIGHTSDRILL5D",
"S_NIGHTSFLY6A",
"S_NIGHTSFLY6B",
"S_NIGHTSDRILL6A",
"S_NIGHTSDRILL6B",
"S_NIGHTSDRILL6C",
"S_NIGHTSDRILL6D",
"S_NIGHTSFLY7A",
"S_NIGHTSFLY7B",
"S_NIGHTSDRILL7A",
"S_NIGHTSDRILL7B",
"S_NIGHTSDRILL7C",
"S_NIGHTSDRILL7D",
"S_NIGHTSFLY8A",
"S_NIGHTSFLY8B",
"S_NIGHTSDRILL8A",
"S_NIGHTSDRILL8B",
"S_NIGHTSDRILL8C",
"S_NIGHTSDRILL8D",
"S_NIGHTSFLY9A",
"S_NIGHTSFLY9B",
"S_NIGHTSDRILL9A",
"S_NIGHTSDRILL9B",
"S_NIGHTSDRILL9C",
"S_NIGHTSDRILL9D",
"S_NIGHTSHURT1",
"S_NIGHTSHURT2",
"S_NIGHTSHURT3",
"S_NIGHTSHURT4",
"S_NIGHTSHURT5",
"S_NIGHTSHURT6",
"S_NIGHTSHURT7",
"S_NIGHTSHURT8",
"S_NIGHTSHURT9",
"S_NIGHTSHURT10",
"S_NIGHTSHURT11",
"S_NIGHTSHURT12",
"S_NIGHTSHURT13",
"S_NIGHTSHURT14",
"S_NIGHTSHURT15",
"S_NIGHTSHURT16",
"S_NIGHTSHURT17",
"S_NIGHTSHURT18",
"S_NIGHTSHURT19",
"S_NIGHTSHURT20",
"S_NIGHTSHURT21",
"S_NIGHTSHURT22",
"S_NIGHTSHURT23",
"S_NIGHTSHURT24",
"S_NIGHTSHURT25",
"S_NIGHTSHURT26",
"S_NIGHTSHURT27",
"S_NIGHTSHURT28",
"S_NIGHTSHURT29",
"S_NIGHTSHURT30",
"S_NIGHTSHURT31",
"S_NIGHTSHURT32",
"S_NIGHTSPARKLE1", "S_NIGHTSPARKLE1",
"S_NIGHTSPARKLE2", "S_NIGHTSPARKLE2",
"S_NIGHTSPARKLE3", "S_NIGHTSPARKLE3",
@ -5989,16 +5941,6 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_CRUMBLE1", "S_CRUMBLE1",
"S_CRUMBLE2", "S_CRUMBLE2",
"S_SUPERTRANS1",
"S_SUPERTRANS2",
"S_SUPERTRANS3",
"S_SUPERTRANS4",
"S_SUPERTRANS5",
"S_SUPERTRANS6",
"S_SUPERTRANS7",
"S_SUPERTRANS8",
"S_SUPERTRANS9",
// Spark // Spark
"S_SPRK1", "S_SPRK1",
"S_SPRK2", "S_SPRK2",
@ -6495,6 +6437,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_SMALLBUBBLE", // small bubble "MT_SMALLBUBBLE", // small bubble
"MT_MEDIUMBUBBLE", // medium bubble "MT_MEDIUMBUBBLE", // medium bubble
"MT_EXTRALARGEBUBBLE", // extra large bubble "MT_EXTRALARGEBUBBLE", // extra large bubble
"MT_WATERZAP",
"MT_TFOG", "MT_TFOG",
"MT_SEED", "MT_SEED",
"MT_PARTICLE", "MT_PARTICLE",
@ -6567,7 +6510,6 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_AXISTRANSFERLINE", "MT_AXISTRANSFERLINE",
"MT_NIGHTSDRONE", "MT_NIGHTSDRONE",
"MT_NIGHTSGOAL", "MT_NIGHTSGOAL",
"MT_NIGHTSCHAR",
"MT_NIGHTSPARKLE", "MT_NIGHTSPARKLE",
"MT_NIGHTSLOOPHELPER", "MT_NIGHTSLOOPHELPER",
"MT_NIGHTSBUMPER", // NiGHTS Bumper "MT_NIGHTSBUMPER", // NiGHTS Bumper
@ -6768,21 +6710,9 @@ static const char *const PLAYERFLAG_LIST[] = {
// Are you gliding? // Are you gliding?
"GLIDING", "GLIDING",
// Tails pickup!
"CARRIED",
// Sliding (usually in water) like Labyrinth/Oil Ocean // Sliding (usually in water) like Labyrinth/Oil Ocean
"SLIDING", "SLIDING",
// Hanging on a rope
"ROPEHANG",
// Hanging on an item of some kind - zipline, chain, etc. (->tracer)
"ITEMHANG",
// On the mace chain spinning around (->tracer)
"MACESPIN",
/*** NIGHTS STUFF ***/ /*** NIGHTS STUFF ***/
// Is the player in NiGHTS mode? // Is the player in NiGHTS mode?
"NIGHTSMODE", "NIGHTSMODE",
@ -6859,24 +6789,61 @@ static const char *COLOR_ENUMS[] = {
"MAGENTA", // SKINCOLOR_MAGENTA "MAGENTA", // SKINCOLOR_MAGENTA
"PINK", // SKINCOLOR_PINK "PINK", // SKINCOLOR_PINK
"ROSY", // SKINCOLOR_ROSY "ROSY", // SKINCOLOR_ROSY
// Super special awesome Super flashing colors! // Super special awesome Super flashing colors!
"SUPER1", // SKINCOLOR_SUPER1 "SUPERSILVER1", // SKINCOLOR_SUPERSILVER1
"SUPER2", // SKINCOLOR_SUPER2, "SUPERSILVER2", // SKINCOLOR_SUPERSILVER2,
"SUPER3", // SKINCOLOR_SUPER3, "SUPERSILVER3", // SKINCOLOR_SUPERSILVER3,
"SUPER4", // SKINCOLOR_SUPER4, "SUPERSILVER4", // SKINCOLOR_SUPERSILVER4,
"SUPER5", // SKINCOLOR_SUPER5, "SUPERSILVER5", // SKINCOLOR_SUPERSILVER5,
// Super Tails
"TSUPER1", // SKINCOLOR_TSUPER1, "SUPERRED1", // SKINCOLOR_SUPERRED1
"TSUPER2", // SKINCOLOR_TSUPER2, "SUPERRED2", // SKINCOLOR_SUPERRED2,
"TSUPER3", // SKINCOLOR_TSUPER3, "SUPERRED3", // SKINCOLOR_SUPERRED3,
"TSUPER4", // SKINCOLOR_TSUPER4, "SUPERRED4", // SKINCOLOR_SUPERRED4,
"TSUPER5", // SKINCOLOR_TSUPER5, "SUPERRED5", // SKINCOLOR_SUPERRED5,
// Super Knuckles
"KSUPER1", // SKINCOLOR_KSUPER1, "SUPERORANGE1", // SKINCOLOR_SUPERORANGE1
"KSUPER2", // SKINCOLOR_KSUPER2, "SUPERORANGE2", // SKINCOLOR_SUPERORANGE2,
"KSUPER3", // SKINCOLOR_KSUPER3, "SUPERORANGE3", // SKINCOLOR_SUPERORANGE3,
"KSUPER4", // SKINCOLOR_KSUPER4, "SUPERORANGE4", // SKINCOLOR_SUPERORANGE4,
"KSUPER5" // SKINCOLOR_KSUPER5, "SUPERORANGE5", // SKINCOLOR_SUPERORANGE5,
"SUPERGOLD1", // SKINCOLOR_SUPERGOLD1
"SUPERGOLD2", // SKINCOLOR_SUPERGOLD2,
"SUPERGOLD3", // SKINCOLOR_SUPERGOLD3,
"SUPERGOLD4", // SKINCOLOR_SUPERGOLD4,
"SUPERGOLD5", // SKINCOLOR_SUPERGOLD5,
"SUPERPERIDOT1", // SKINCOLOR_SUPERPERIDOT1
"SUPERPERIDOT2", // SKINCOLOR_SUPERPERIDOT2,
"SUPERPERIDOT3", // SKINCOLOR_SUPERPERIDOT3,
"SUPERPERIDOT4", // SKINCOLOR_SUPERPERIDOT4,
"SUPERPERIDOT5", // SKINCOLOR_SUPERPERIDOT5,
"SUPERCYAN1", // SKINCOLOR_SUPERCYAN1
"SUPERCYAN2", // SKINCOLOR_SUPERCYAN2,
"SUPERCYAN3", // SKINCOLOR_SUPERCYAN3,
"SUPERCYAN4", // SKINCOLOR_SUPERCYAN4,
"SUPERCYAN5", // SKINCOLOR_SUPERCYAN5,
"SUPERPURPLE1", // SKINCOLOR_SUPERPURPLE1,
"SUPERPURPLE2", // SKINCOLOR_SUPERPURPLE2,
"SUPERPURPLE3", // SKINCOLOR_SUPERPURPLE3,
"SUPERPURPLE4", // SKINCOLOR_SUPERPURPLE4,
"SUPERPURPLE5", // SKINCOLOR_SUPERPURPLE5,
"SUPERRUST1", // SKINCOLOR_SUPERRUST1
"SUPERRUST2", // SKINCOLOR_SUPERRUST2,
"SUPERRUST3", // SKINCOLOR_SUPERRUST3,
"SUPERRUST4", // SKINCOLOR_SUPERRUST4,
"SUPERRUST5", // SKINCOLOR_SUPERRUST5,
"SUPERTAN1", // SKINCOLOR_SUPERTAN1
"SUPERTAN2", // SKINCOLOR_SUPERTAN2,
"SUPERTAN3", // SKINCOLOR_SUPERTAN3,
"SUPERTAN4", // SKINCOLOR_SUPERTAN4,
"SUPERTAN5" // SKINCOLOR_SUPERTAN5,
}; };
static const char *const POWERS_LIST[] = { static const char *const POWERS_LIST[] = {
@ -6884,6 +6851,7 @@ static const char *const POWERS_LIST[] = {
"SNEAKERS", "SNEAKERS",
"FLASHING", "FLASHING",
"SHIELD", "SHIELD",
"CARRY",
"TAILSFLY", // tails flying "TAILSFLY", // tails flying
"UNDERWATER", // underwater timer "UNDERWATER", // underwater timer
"SPACETIME", // In space, no one can hear you spin! "SPACETIME", // In space, no one can hear you spin!
@ -7003,6 +6971,8 @@ struct {
// Frame settings // Frame settings
{"FF_FRAMEMASK",FF_FRAMEMASK}, {"FF_FRAMEMASK",FF_FRAMEMASK},
{"FF_SPR2ENDSTATE",FF_SPR2ENDSTATE},
{"FF_MIDDLESTARTCHANCE",FF_MIDDLESTARTCHANCE},
{"FF_ANIMATE",FF_ANIMATE}, {"FF_ANIMATE",FF_ANIMATE},
{"FF_FULLBRIGHT",FF_FULLBRIGHT}, {"FF_FULLBRIGHT",FF_FULLBRIGHT},
{"FF_TRANSMASK",FF_TRANSMASK}, {"FF_TRANSMASK",FF_TRANSMASK},
@ -7117,6 +7087,14 @@ struct {
{"SH_STACK",SH_STACK}, {"SH_STACK",SH_STACK},
{"SH_NOSTACK",SH_NOSTACK}, {"SH_NOSTACK",SH_NOSTACK},
// Carrying
{"CR_NONE",CR_NONE},
{"CR_GENERIC",CR_GENERIC},
{"CR_PLAYER",CR_PLAYER},
{"CR_ZOOMTUBE",CR_ZOOMTUBE},
{"CR_ROPEHANG",CR_ROPEHANG},
{"CR_MACESPIN",CR_MACESPIN},
// Ring weapons (ringweapons_t) // Ring weapons (ringweapons_t)
// Useful for A_GiveWeapon // Useful for A_GiveWeapon
{"RW_AUTO",RW_AUTO}, {"RW_AUTO",RW_AUTO},
@ -7134,6 +7112,11 @@ struct {
{"SF_NOSKID",SF_NOSKID}, {"SF_NOSKID",SF_NOSKID},
{"SF_NOSPEEDADJUST",SF_NOSPEEDADJUST}, {"SF_NOSPEEDADJUST",SF_NOSPEEDADJUST},
{"SF_RUNONWATER",SF_RUNONWATER}, {"SF_RUNONWATER",SF_RUNONWATER},
{"SF_NOJUMPSPIN",SF_NOJUMPSPIN},
{"SF_NOJUMPDAMAGE",SF_NOJUMPDAMAGE},
{"SF_STOMPDAMAGE",SF_STOMPDAMAGE},
{"SF_MARIODAMAGE",SF_MARIODAMAGE},
{"SF_MACHINE",SF_MACHINE},
// Character abilities! // Character abilities!
// Primary // Primary
@ -7152,10 +7135,12 @@ struct {
{"CA_AIRDRILL",CA_AIRDRILL}, {"CA_AIRDRILL",CA_AIRDRILL},
{"CA_JUMPTHOK",CA_JUMPTHOK}, {"CA_JUMPTHOK",CA_JUMPTHOK},
{"CA_DASHMODE",CA_DASHMODE}, {"CA_DASHMODE",CA_DASHMODE},
{"CA_TWINSPIN",CA_TWINSPIN},
// Secondary // Secondary
{"CA2_NONE",CA2_NONE}, // now slot 0! {"CA2_NONE",CA2_NONE}, // now slot 0!
{"CA2_SPINDASH",CA2_SPINDASH}, {"CA2_SPINDASH",CA2_SPINDASH},
{"CA2_MULTIABILITY",CA2_MULTIABILITY}, {"CA2_MULTIABILITY",CA2_MULTIABILITY},
{"CA2_MELEE",CA2_MELEE},
// Sound flags // Sound flags
{"SF_TOTALLYSINGLE",SF_TOTALLYSINGLE}, {"SF_TOTALLYSINGLE",SF_TOTALLYSINGLE},
@ -7205,9 +7190,11 @@ struct {
{"PA_PEEL",PA_PEEL}, {"PA_PEEL",PA_PEEL},
{"PA_PAIN",PA_PAIN}, {"PA_PAIN",PA_PAIN},
{"PA_ROLL",PA_ROLL}, {"PA_ROLL",PA_ROLL},
{"PA_JUMP",PA_JUMP},
{"PA_SPRING",PA_SPRING}, {"PA_SPRING",PA_SPRING},
{"PA_FALL",PA_FALL}, {"PA_FALL",PA_FALL},
{"PA_ABILITY",PA_ABILITY}, {"PA_ABILITY",PA_ABILITY},
{"PA_ABILITY2",PA_ABILITY2},
{"PA_RIDE",PA_RIDE}, {"PA_RIDE",PA_RIDE},
// Current weapon // Current weapon

View File

@ -207,7 +207,7 @@ typedef struct
#define ZSHIFT 4 #define ZSHIFT 4
extern const char *Color_Names[MAXSKINCOLORS]; extern const char *Color_Names[MAXSKINCOLORS + NUMSUPERCOLORS];
extern const UINT8 Color_Opposite[MAXSKINCOLORS*2]; extern const UINT8 Color_Opposite[MAXSKINCOLORS*2];
#define NUMMAPS 1035 #define NUMMAPS 1035

View File

@ -159,7 +159,7 @@ extern FILE *logstream;
// Does this version require an added patch file? // Does this version require an added patch file?
// Comment or uncomment this as necessary. // Comment or uncomment this as necessary.
//#define USE_PATCH_DTA #define USE_PATCH_DTA
// Modification options // Modification options
// If you want to take advantage of the Master Server's ability to force clients to update // If you want to take advantage of the Master Server's ability to force clients to update
@ -258,32 +258,69 @@ typedef enum
SKINCOLOR_MAGENTA, SKINCOLOR_MAGENTA,
SKINCOLOR_PINK, SKINCOLOR_PINK,
SKINCOLOR_ROSY, SKINCOLOR_ROSY,
//SKINCOLOR_?
//SKINCOLOR_?
// Careful! MAXSKINCOLORS cannot be greater than 0x20! // Careful! MAXSKINCOLORS cannot be greater than 0x20! Two slots left...
MAXSKINCOLORS, MAXSKINCOLORS,
// Super special awesome Super flashing colors! // Super special awesome Super flashing colors!
SKINCOLOR_SUPER1 = MAXSKINCOLORS, SKINCOLOR_SUPERSILVER1 = MAXSKINCOLORS,
SKINCOLOR_SUPER2, SKINCOLOR_SUPERSILVER2,
SKINCOLOR_SUPER3, SKINCOLOR_SUPERSILVER3,
SKINCOLOR_SUPER4, SKINCOLOR_SUPERSILVER4,
SKINCOLOR_SUPER5, SKINCOLOR_SUPERSILVER5,
// Super Tails SKINCOLOR_SUPERRED1,
SKINCOLOR_TSUPER1, SKINCOLOR_SUPERRED2,
SKINCOLOR_TSUPER2, SKINCOLOR_SUPERRED3,
SKINCOLOR_TSUPER3, SKINCOLOR_SUPERRED4,
SKINCOLOR_TSUPER4, SKINCOLOR_SUPERRED5,
SKINCOLOR_TSUPER5,
// Super Knuckles SKINCOLOR_SUPERORANGE1,
SKINCOLOR_KSUPER1, SKINCOLOR_SUPERORANGE2,
SKINCOLOR_KSUPER2, SKINCOLOR_SUPERORANGE3,
SKINCOLOR_KSUPER3, SKINCOLOR_SUPERORANGE4,
SKINCOLOR_KSUPER4, SKINCOLOR_SUPERORANGE5,
SKINCOLOR_KSUPER5,
MAXTRANSLATIONS SKINCOLOR_SUPERGOLD1,
SKINCOLOR_SUPERGOLD2,
SKINCOLOR_SUPERGOLD3,
SKINCOLOR_SUPERGOLD4,
SKINCOLOR_SUPERGOLD5,
SKINCOLOR_SUPERPERIDOT1,
SKINCOLOR_SUPERPERIDOT2,
SKINCOLOR_SUPERPERIDOT3,
SKINCOLOR_SUPERPERIDOT4,
SKINCOLOR_SUPERPERIDOT5,
SKINCOLOR_SUPERCYAN1,
SKINCOLOR_SUPERCYAN2,
SKINCOLOR_SUPERCYAN3,
SKINCOLOR_SUPERCYAN4,
SKINCOLOR_SUPERCYAN5,
SKINCOLOR_SUPERPURPLE1,
SKINCOLOR_SUPERPURPLE2,
SKINCOLOR_SUPERPURPLE3,
SKINCOLOR_SUPERPURPLE4,
SKINCOLOR_SUPERPURPLE5,
SKINCOLOR_SUPERRUST1,
SKINCOLOR_SUPERRUST2,
SKINCOLOR_SUPERRUST3,
SKINCOLOR_SUPERRUST4,
SKINCOLOR_SUPERRUST5,
SKINCOLOR_SUPERTAN1,
SKINCOLOR_SUPERTAN2,
SKINCOLOR_SUPERTAN3,
SKINCOLOR_SUPERTAN4,
SKINCOLOR_SUPERTAN5,
MAXTRANSLATIONS,
NUMSUPERCOLORS = ((MAXTRANSLATIONS - MAXSKINCOLORS)/5)
} skincolors_t; } skincolors_t;
// State updates, number of tics / second. // State updates, number of tics / second.

View File

@ -2047,6 +2047,8 @@ void G_PlayerReborn(INT32 player)
INT32 score; INT32 score;
INT32 lives; INT32 lives;
INT32 continues; INT32 continues;
fixed_t camerascale;
fixed_t shieldscale;
UINT8 charability; UINT8 charability;
UINT8 charability2; UINT8 charability2;
fixed_t normalspeed; fixed_t normalspeed;
@ -2070,6 +2072,8 @@ void G_PlayerReborn(INT32 player)
INT32 starpostnum; INT32 starpostnum;
INT32 starpostangle; INT32 starpostangle;
fixed_t jumpfactor; fixed_t jumpfactor;
fixed_t height;
fixed_t spinheight;
INT32 exiting; INT32 exiting;
INT16 numboxes; INT16 numboxes;
INT16 totalring; INT16 totalring;
@ -2101,6 +2105,8 @@ void G_PlayerReborn(INT32 player)
skincolor = players[player].skincolor; skincolor = players[player].skincolor;
skin = players[player].skin; skin = players[player].skin;
camerascale = players[player].camerascale;
shieldscale = players[player].shieldscale;
charability = players[player].charability; charability = players[player].charability;
charability2 = players[player].charability2; charability2 = players[player].charability2;
normalspeed = players[player].normalspeed; normalspeed = players[player].normalspeed;
@ -2117,6 +2123,8 @@ void G_PlayerReborn(INT32 player)
starpostnum = players[player].starpostnum; starpostnum = players[player].starpostnum;
starpostangle = players[player].starpostangle; starpostangle = players[player].starpostangle;
jumpfactor = players[player].jumpfactor; jumpfactor = players[player].jumpfactor;
height = players[player].height;
spinheight = players[player].spinheight;
thokitem = players[player].thokitem; thokitem = players[player].thokitem;
spinitem = players[player].spinitem; spinitem = players[player].spinitem;
revitem = players[player].revitem; revitem = players[player].revitem;
@ -2142,6 +2150,8 @@ void G_PlayerReborn(INT32 player)
// save player config truth reborn // save player config truth reborn
p->skincolor = skincolor; p->skincolor = skincolor;
p->skin = skin; p->skin = skin;
p->camerascale = camerascale;
p->shieldscale = shieldscale;
p->charability = charability; p->charability = charability;
p->charability2 = charability2; p->charability2 = charability2;
p->normalspeed = normalspeed; p->normalspeed = normalspeed;
@ -2164,6 +2174,8 @@ void G_PlayerReborn(INT32 player)
p->starpostnum = starpostnum; p->starpostnum = starpostnum;
p->starpostangle = starpostangle; p->starpostangle = starpostangle;
p->jumpfactor = jumpfactor; p->jumpfactor = jumpfactor;
p->height = height;
p->spinheight = spinheight;
p->exiting = exiting; p->exiting = exiting;
p->numboxes = numboxes; p->numboxes = numboxes;
@ -4349,12 +4361,18 @@ void G_GhostTicker(void)
// Tick ghost colors (Super and Mario Invincibility flashing) // Tick ghost colors (Super and Mario Invincibility flashing)
switch(g->color) switch(g->color)
{ {
case GHC_SUPER: // Super Sonic (P_DoSuperStuff) case GHC_SUPER: // Super (P_DoSuperStuff)
g->mo->color = SKINCOLOR_SUPER1; if (g->mo->skin)
{
skin_t *skin = (skin_t *)g->mo->skin;
g->mo->color = skin->supercolor;
}
else
g->mo->color = SKINCOLOR_SUPERGOLD1;
g->mo->color += abs( ( (signed)( (unsigned)leveltime >> 1 ) % 9) - 4); g->mo->color += abs( ( (signed)( (unsigned)leveltime >> 1 ) % 9) - 4);
break; break;
case GHC_INVINCIBLE: // Mario invincibility (P_CheckInvincibilityTimer) case GHC_INVINCIBLE: // Mario invincibility (P_CheckInvincibilityTimer)
g->mo->color = (UINT8)(leveltime % MAXSKINCOLORS); g->mo->color = (UINT8)(SKINCOLOR_RED + (leveltime % (MAXSKINCOLORS - SKINCOLOR_RED))); // Passes through all saturated colours
break; break;
default: default:
break; break;
@ -4690,6 +4708,8 @@ void G_BeginRecording(void)
demo_p += 16; demo_p += 16;
// Stats // Stats
WRITEUINT8(demo_p,player->camerascale>>FRACBITS);
WRITEUINT8(demo_p,player->shieldscale>>FRACBITS);
WRITEUINT8(demo_p,player->charability); WRITEUINT8(demo_p,player->charability);
WRITEUINT8(demo_p,player->charability2); WRITEUINT8(demo_p,player->charability2);
WRITEUINT8(demo_p,player->actionspd>>FRACBITS); WRITEUINT8(demo_p,player->actionspd>>FRACBITS);
@ -4700,6 +4720,8 @@ void G_BeginRecording(void)
WRITEUINT8(demo_p,player->thrustfactor); WRITEUINT8(demo_p,player->thrustfactor);
WRITEUINT8(demo_p,player->accelstart); WRITEUINT8(demo_p,player->accelstart);
WRITEUINT8(demo_p,player->acceleration); WRITEUINT8(demo_p,player->acceleration);
WRITEUINT8(demo_p,player->height>>FRACBITS);
WRITEUINT8(demo_p,player->spinheight>>FRACBITS);
// Trying to convert it back to % causes demo desync due to precision loss. // Trying to convert it back to % causes demo desync due to precision loss.
// Don't do it. // Don't do it.
@ -4930,7 +4952,7 @@ void G_DoPlayDemo(char *defdemoname)
char skin[17],color[17],*n,*pdemoname; char skin[17],color[17],*n,*pdemoname;
UINT8 version,subversion,charability,charability2,thrustfactor,accelstart,acceleration; UINT8 version,subversion,charability,charability2,thrustfactor,accelstart,acceleration;
UINT32 randseed; UINT32 randseed;
fixed_t actionspd,mindash,maxdash,normalspeed,runspeed,jumpfactor; fixed_t camerascale,shieldscale,actionspd,mindash,maxdash,normalspeed,runspeed,jumpfactor,height,spinheight;
char msg[1024]; char msg[1024];
skin[16] = '\0'; skin[16] = '\0';
@ -5066,6 +5088,8 @@ void G_DoPlayDemo(char *defdemoname)
M_Memcpy(color,demo_p,16); M_Memcpy(color,demo_p,16);
demo_p += 16; demo_p += 16;
camerascale = (fixed_t)READUINT8(demo_p)<<FRACBITS;
shieldscale = (fixed_t)READUINT8(demo_p)<<FRACBITS;
charability = READUINT8(demo_p); charability = READUINT8(demo_p);
charability2 = READUINT8(demo_p); charability2 = READUINT8(demo_p);
actionspd = (fixed_t)READUINT8(demo_p)<<FRACBITS; actionspd = (fixed_t)READUINT8(demo_p)<<FRACBITS;
@ -5076,6 +5100,8 @@ void G_DoPlayDemo(char *defdemoname)
thrustfactor = READUINT8(demo_p); thrustfactor = READUINT8(demo_p);
accelstart = READUINT8(demo_p); accelstart = READUINT8(demo_p);
acceleration = READUINT8(demo_p); acceleration = READUINT8(demo_p);
height = (fixed_t)READUINT8(demo_p)<<FRACBITS;
spinheight = (fixed_t)READUINT8(demo_p)<<FRACBITS;
jumpfactor = READFIXED(demo_p); jumpfactor = READFIXED(demo_p);
// net var data // net var data
@ -5139,6 +5165,8 @@ void G_DoPlayDemo(char *defdemoname)
// Set saved attribute values // Set saved attribute values
// No cheat checking here, because even if they ARE wrong... // No cheat checking here, because even if they ARE wrong...
// it would only break the replay if we clipped them. // it would only break the replay if we clipped them.
players[0].camerascale = camerascale;
players[0].shieldscale = shieldscale;
players[0].charability = charability; players[0].charability = charability;
players[0].charability2 = charability2; players[0].charability2 = charability2;
players[0].actionspd = actionspd; players[0].actionspd = actionspd;
@ -5150,6 +5178,8 @@ void G_DoPlayDemo(char *defdemoname)
players[0].accelstart = accelstart; players[0].accelstart = accelstart;
players[0].acceleration = acceleration; players[0].acceleration = acceleration;
players[0].jumpfactor = jumpfactor; players[0].jumpfactor = jumpfactor;
players[0].height = height;
players[0].spinheight = spinheight;
demo_start = true; demo_start = true;
} }

View File

@ -237,7 +237,7 @@ light_t *t_lspr[NUMSPRITES] =
// Interactive Objects // Interactive Objects
&lspr[NOLIGHT], // SPR_FANS &lspr[NOLIGHT], // SPR_FANS
&lspr[NOLIGHT], // SPR_BUBL &lspr[NOLIGHT], // SPR_BBLS
&lspr[NOLIGHT], // SPR_SIGN &lspr[NOLIGHT], // SPR_SIGN
&lspr[NOLIGHT], // SPR_STEM &lspr[NOLIGHT], // SPR_STEM
&lspr[NOLIGHT], // SPR_SPIK &lspr[NOLIGHT], // SPR_SPIK
@ -385,11 +385,8 @@ light_t *t_lspr[NUMSPRITES] =
&lspr[NOLIGHT], // SPR_SPLH &lspr[NOLIGHT], // SPR_SPLH
&lspr[NOLIGHT], // SPR_SPLA &lspr[NOLIGHT], // SPR_SPLA
&lspr[NOLIGHT], // SPR_SMOK &lspr[NOLIGHT], // SPR_SMOK
&lspr[NOLIGHT], // SPR_BUBP &lspr[NOLIGHT], // SPR_BUBL
&lspr[NOLIGHT], // SPR_BUBO &lspr[SUPERSPARK_L], // SPR_WZAP
&lspr[NOLIGHT], // SPR_BUBN
&lspr[NOLIGHT], // SPR_BUBM
&lspr[NOLIGHT], // SPR_POPP
&lspr[SUPERSPARK_L], // SPR_TFOG &lspr[SUPERSPARK_L], // SPR_TFOG
&lspr[NIGHTSLIGHT_L], // SPR_SEED // Sonic CD flower seed &lspr[NIGHTSLIGHT_L], // SPR_SEED // Sonic CD flower seed
&lspr[NOLIGHT], // SPR_PRTL &lspr[NOLIGHT], // SPR_PRTL
@ -440,16 +437,12 @@ light_t *t_lspr[NUMSPRITES] =
// NiGHTS Stuff // NiGHTS Stuff
&lspr[SUPERSONIC_L], // SPR_NDRN // NiGHTS drone &lspr[SUPERSONIC_L], // SPR_NDRN // NiGHTS drone
&lspr[SUPERSONIC_L], // SPR_SUPE // NiGHTS character flying
&lspr[SUPERSONIC_L], // SPR_SUPZ // NiGHTS hurt
&lspr[SUPERSONIC_L], // SPR_NDRL // NiGHTS character drilling
&lspr[NOLIGHT], // SPR_NSPK &lspr[NOLIGHT], // SPR_NSPK
&lspr[NOLIGHT], // SPR_NBMP &lspr[NOLIGHT], // SPR_NBMP
&lspr[NOLIGHT], // SPR_HOOP &lspr[NOLIGHT], // SPR_HOOP
&lspr[NOLIGHT], // SPR_HSCR &lspr[NOLIGHT], // SPR_HSCR
&lspr[NOLIGHT], // SPR_NPRU &lspr[NOLIGHT], // SPR_NPRU
&lspr[NOLIGHT], // SPR_CAPS &lspr[NOLIGHT], // SPR_CAPS
&lspr[SUPERSONIC_L], // SPR_SUPT
// Debris // Debris
&lspr[RINGSPARK_L], // SPR_SPRK &lspr[RINGSPARK_L], // SPR_SPRK

View File

@ -5330,7 +5330,7 @@ static void HWR_DrawSkyBackground(player_t *player)
// 0--1 // 0--1
(void)player; (void)player;
HWR_GetTexture(skytexture); HWR_GetTexture(texturetranslation[skytexture]);
//Hurdler: the sky is the only texture who need 4.0f instead of 1.0 //Hurdler: the sky is the only texture who need 4.0f instead of 1.0
// because it's called just after clearing the screen // because it's called just after clearing the screen
@ -5350,7 +5350,7 @@ static void HWR_DrawSkyBackground(player_t *player)
angle = (dup_viewangle + gr_xtoviewangle[0]); angle = (dup_viewangle + gr_xtoviewangle[0]);
dimensionmultiply = ((float)textures[skytexture]->width/256.0f); dimensionmultiply = ((float)textures[texturetranslation[skytexture]]->width/256.0f);
v[0].sow = v[3].sow = ((float) angle / ((ANGLE_90-1)*dimensionmultiply)); v[0].sow = v[3].sow = ((float) angle / ((ANGLE_90-1)*dimensionmultiply));
v[2].sow = v[1].sow = (-1.0f/dimensionmultiply)+((float) angle / ((ANGLE_90-1)*dimensionmultiply)); v[2].sow = v[1].sow = (-1.0f/dimensionmultiply)+((float) angle / ((ANGLE_90-1)*dimensionmultiply));
@ -5359,7 +5359,7 @@ static void HWR_DrawSkyBackground(player_t *player)
angle = aimingangle; angle = aimingangle;
aspectratio = (float)vid.width/(float)vid.height; aspectratio = (float)vid.width/(float)vid.height;
dimensionmultiply = ((float)textures[skytexture]->height/(128.0f*aspectratio)); dimensionmultiply = ((float)textures[texturetranslation[skytexture]]->height/(128.0f*aspectratio));
angleturn = (((float)ANGLE_45-1.0f)*aspectratio)*dimensionmultiply; angleturn = (((float)ANGLE_45-1.0f)*aspectratio)*dimensionmultiply;
// Middle of the sky should always be at angle 0 // Middle of the sky should always be at angle 0

View File

@ -1035,32 +1035,151 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
case SKINCOLOR_ROSY: case SKINCOLOR_ROSY:
blendcolor = V_GetColor(202); blendcolor = V_GetColor(202);
break; break;
case SKINCOLOR_SUPER1:
case SKINCOLOR_SUPERSILVER1: // Super silver
blendcolor = V_GetColor(0);
break;
case SKINCOLOR_SUPERSILVER2:
blendcolor = V_GetColor(2);
break;
case SKINCOLOR_SUPERSILVER3:
blendcolor = V_GetColor(4);
break;
case SKINCOLOR_SUPERSILVER4:
blendcolor = V_GetColor(7);
break;
case SKINCOLOR_SUPERSILVER5:
blendcolor = V_GetColor(10);
break;
case SKINCOLOR_SUPERRED1: // Super red
blendcolor = V_GetColor(208);
break;
case SKINCOLOR_SUPERRED2:
blendcolor = V_GetColor(210);
break;
case SKINCOLOR_SUPERRED3:
blendcolor = V_GetColor(32);
break;
case SKINCOLOR_SUPERRED4:
blendcolor = V_GetColor(33);
break;
case SKINCOLOR_SUPERRED5:
blendcolor = V_GetColor(35);
break;
case SKINCOLOR_SUPERORANGE1: // Super orange
blendcolor = V_GetColor(208);
break;
case SKINCOLOR_SUPERORANGE2:
blendcolor = V_GetColor(48);
break;
case SKINCOLOR_SUPERORANGE3:
blendcolor = V_GetColor(50);
break;
case SKINCOLOR_SUPERORANGE4:
blendcolor = V_GetColor(54);
break;
case SKINCOLOR_SUPERORANGE5:
blendcolor = V_GetColor(58);
break;
case SKINCOLOR_SUPERGOLD1: // Super gold
blendcolor = V_GetColor(80); blendcolor = V_GetColor(80);
break; break;
case SKINCOLOR_SUPER2: case SKINCOLOR_SUPERGOLD2:
blendcolor = V_GetColor(83); blendcolor = V_GetColor(83);
break; break;
case SKINCOLOR_SUPER3: case SKINCOLOR_SUPERGOLD3:
blendcolor = V_GetColor(73); blendcolor = V_GetColor(73);
break; break;
case SKINCOLOR_SUPER4: case SKINCOLOR_SUPERGOLD4:
blendcolor = V_GetColor(64); blendcolor = V_GetColor(64);
break; break;
case SKINCOLOR_SUPER5: case SKINCOLOR_SUPERGOLD5:
blendcolor = V_GetColor(67); blendcolor = V_GetColor(67);
break; break;
case SKINCOLOR_TSUPER1: case SKINCOLOR_SUPERPERIDOT1: // Super peridot
case SKINCOLOR_TSUPER2: blendcolor = V_GetColor(88);
case SKINCOLOR_TSUPER3: break;
case SKINCOLOR_TSUPER4: case SKINCOLOR_SUPERPERIDOT2:
case SKINCOLOR_TSUPER5: blendcolor = V_GetColor(188);
case SKINCOLOR_KSUPER1: break;
case SKINCOLOR_KSUPER2: case SKINCOLOR_SUPERPERIDOT3:
case SKINCOLOR_KSUPER3: blendcolor = V_GetColor(189);
case SKINCOLOR_KSUPER4: break;
case SKINCOLOR_KSUPER5: case SKINCOLOR_SUPERPERIDOT4:
blendcolor = V_GetColor(190);
break;
case SKINCOLOR_SUPERPERIDOT5:
blendcolor = V_GetColor(191);
break;
case SKINCOLOR_SUPERCYAN1: // Super cyan
blendcolor = V_GetColor(128);
break;
case SKINCOLOR_SUPERCYAN2:
blendcolor = V_GetColor(131);
break;
case SKINCOLOR_SUPERCYAN3:
blendcolor = V_GetColor(133);
break;
case SKINCOLOR_SUPERCYAN4:
blendcolor = V_GetColor(134);
break;
case SKINCOLOR_SUPERCYAN5:
blendcolor = V_GetColor(136);
break;
case SKINCOLOR_SUPERPURPLE1: // Super purple
blendcolor = V_GetColor(144);
break;
case SKINCOLOR_SUPERPURPLE2:
blendcolor = V_GetColor(162);
break;
case SKINCOLOR_SUPERPURPLE3:
blendcolor = V_GetColor(164);
break;
case SKINCOLOR_SUPERPURPLE4:
blendcolor = V_GetColor(166);
break;
case SKINCOLOR_SUPERPURPLE5:
blendcolor = V_GetColor(168);
break;
case SKINCOLOR_SUPERRUST1: // Super rust
blendcolor = V_GetColor(51);
break;
case SKINCOLOR_SUPERRUST2:
blendcolor = V_GetColor(54);
break;
case SKINCOLOR_SUPERRUST3:
blendcolor = V_GetColor(68);
break;
case SKINCOLOR_SUPERRUST4:
blendcolor = V_GetColor(70);
break;
case SKINCOLOR_SUPERRUST5:
blendcolor = V_GetColor(234);
break;
case SKINCOLOR_SUPERTAN1: // Super tan
blendcolor = V_GetColor(80);
break;
case SKINCOLOR_SUPERTAN2:
blendcolor = V_GetColor(82);
break;
case SKINCOLOR_SUPERTAN3:
blendcolor = V_GetColor(84);
break;
case SKINCOLOR_SUPERTAN4:
blendcolor = V_GetColor(87);
break;
case SKINCOLOR_SUPERTAN5:
blendcolor = V_GetColor(247);
break;
default: default:
blendcolor = V_GetColor(255); blendcolor = V_GetColor(255);
break; break;

View File

@ -39,7 +39,7 @@ char sprnames[NUMSPRITES + 1][5] =
"RING","TRNG","EMMY","TOKE","RFLG","BFLG","NWNG","EMBM","CEMG","EMER", "RING","TRNG","EMMY","TOKE","RFLG","BFLG","NWNG","EMBM","CEMG","EMER",
"FANS","BUBL","SIGN","STEM","SPIK","SFLM","USPK","STPT","BMNE", "FANS","BBLS","SIGN","STEM","SPIK","SFLM","USPK","STPT","BMNE",
"MSTV","XLTV","TRRI","TBRI","TVRI","TVPI","TVAT","TVFO","TVAR","TVWW", "MSTV","XLTV","TRRI","TBRI","TVRI","TVPI","TVAT","TVFO","TVAR","TVWW",
"TVEL","TVSS","TVIV","TV1U","TV1P","TVEG","TVMX","TVMY","TVGV","TVRC", "TVEL","TVSS","TVIV","TV1U","TV1P","TVEG","TVMX","TVMY","TVGV","TVRC",
@ -60,8 +60,7 @@ char sprnames[NUMSPRITES + 1][5] =
"SPRY","SPRR","SPRB","YSPR","RSPR","SSWY","SSWR","SSWB", "SPRY","SPRR","SPRB","YSPR","RSPR","SSWY","SSWR","SSWB",
"RAIN","SNO1","SPLH","SPLA","SMOK","BUBP","BUBO","BUBN","BUBM","POPP", "RAIN","SNO1","SPLH","SPLA","SMOK","BUBL","WZAP","TFOG","SEED","PRTL",
"TFOG","SEED","PRTL",
"SCOR","DRWN","TTAG","GFLG", "SCOR","DRWN","TTAG","GFLG",
@ -108,19 +107,24 @@ char spr2names[NUMPLAYERSPRITES][5] =
"LIFE", "LIFE",
"FLY_", "FLY_",
"SWIM",
"TIRE", "TIRE",
"GLID", "GLID",
"CLNG", "CLNG",
"CLMB", "CLMB",
"TWIN",
"MLEE",
"TRNS", "TRNS",
"SSTD", "SSTD",
"SWLK", "SWLK",
"SRUN", "SRUN",
"SPEE", "SPEE",
"SPAN", "SPAN",
"SMSL", "SSTN",
"SDTH", "SDTH",
"SDRN", "SDRN",
"SSPN", "SSPN",
@ -130,7 +134,42 @@ char spr2names[NUMPLAYERSPRITES][5] =
"SFAL", "SFAL",
"SEDG", "SEDG",
"SRID", "SRID",
"SFLT" "SFLT",
"NTRN",
"NSTD",
"NFLT",
"NPAN",
"NPUL",
"NATK",
"NGT0",
"NGT1",
"NGT2",
"NGT3",
"NGT4",
"NGT5",
"NGT6",
"NGT7",
"NGT8",
"NGT9",
"NGTA",
"NGTB",
"NGTC",
"DRL0",
"DRL1",
"DRL2",
"DRL3",
"DRL4",
"DRL5",
"DRL6",
"DRL7",
"DRL8",
"DRL9",
"DRLA",
"DRLB",
"DRLC"
}; };
enum playersprite free_spr2 = SPR2_FIRSTFREESLOT; enum playersprite free_spr2 = SPR2_FIRSTFREESLOT;
@ -177,22 +216,30 @@ state_t states[NUMSTATES] =
{SPR_PLAY, SPR2_EDGE, 12, {NULL}, 0, 0, S_PLAY_EDGE}, // S_PLAY_EDGE {SPR_PLAY, SPR2_EDGE, 12, {NULL}, 0, 0, S_PLAY_EDGE}, // S_PLAY_EDGE
{SPR_PLAY, SPR2_RIDE, 4, {NULL}, 0, 0, S_PLAY_RIDE}, // S_PLAY_RIDE {SPR_PLAY, SPR2_RIDE, 4, {NULL}, 0, 0, S_PLAY_RIDE}, // S_PLAY_RIDE
// Tails abilities // CA_FLY/CA_SWIM
{SPR_PLAY, SPR2_FLY , 2, {NULL}, 0, 0, S_PLAY_FLY}, // S_PLAY_FLY {SPR_PLAY, SPR2_FLY , 2, {NULL}, 0, 0, S_PLAY_FLY}, // S_PLAY_FLY
{SPR_PLAY, SPR2_SWIM, 2, {NULL}, 0, 0, S_PLAY_SWIM}, // S_PLAY_SWIM
{SPR_PLAY, SPR2_TIRE, 12, {NULL}, 0, 0, S_PLAY_FLY_TIRED}, // S_PLAY_FLY_TIRED {SPR_PLAY, SPR2_TIRE, 12, {NULL}, 0, 0, S_PLAY_FLY_TIRED}, // S_PLAY_FLY_TIRED
// Knuckles abilities // CA_GLIDEANDCLIMB
{SPR_PLAY, SPR2_GLID, 2, {NULL}, 0, 0, S_PLAY_GLIDE}, // S_PLAY_GLIDE {SPR_PLAY, SPR2_GLID, 2, {NULL}, 0, 0, S_PLAY_GLIDE}, // S_PLAY_GLIDE
{SPR_PLAY, SPR2_CLNG, 6, {NULL}, 0, 0, S_PLAY_CLING}, // S_PLAY_CLING {SPR_PLAY, SPR2_CLNG, 6, {NULL}, 0, 0, S_PLAY_CLING}, // S_PLAY_CLING
{SPR_PLAY, SPR2_CLMB, 5, {NULL}, 0, 0, S_PLAY_CLIMB}, // S_PLAY_CLIMB {SPR_PLAY, SPR2_CLMB, 5, {NULL}, 0, 0, S_PLAY_CLIMB}, // S_PLAY_CLIMB
// Super Sonic // CA_TWINSPIN
{SPR_PLAY, SPR2_TWIN|FF_SPR2ENDSTATE, 1, {NULL}, S_PLAY_JUMP, 0, S_PLAY_TWINSPIN}, // S_PLAY_TWINSPIN
// CA2_MELEE
{SPR_PLAY, SPR2_MLEE|FF_SPR2ENDSTATE, 1, {NULL}, S_PLAY_MELEE_FINISH, 0, S_PLAY_MELEE}, // S_PLAY_MELEE
{SPR_PLAY, SPR2_MLEE, 20, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_MELEE_FINISH
// SF_SUPERANIMS
{SPR_PLAY, SPR2_SSTD, 7, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_STND {SPR_PLAY, SPR2_SSTD, 7, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_STND
{SPR_PLAY, SPR2_SWLK, 7, {NULL}, 0, 0, S_PLAY_SUPER_WALK}, // S_PLAY_SUPER_WALK {SPR_PLAY, SPR2_SWLK, 7, {NULL}, 0, 0, S_PLAY_SUPER_WALK}, // S_PLAY_SUPER_WALK
{SPR_PLAY, SPR2_SRUN, 7, {NULL}, 0, 0, S_PLAY_SUPER_RUN}, // S_PLAY_SUPER_RUN {SPR_PLAY, SPR2_SRUN, 7, {NULL}, 0, 0, S_PLAY_SUPER_RUN}, // S_PLAY_SUPER_RUN
{SPR_PLAY, SPR2_SPEE, 7, {NULL}, 0, 0, S_PLAY_SUPER_PEEL}, // S_PLAY_SUPER_PEEL {SPR_PLAY, SPR2_SPEE, 7, {NULL}, 0, 0, S_PLAY_SUPER_PEEL}, // S_PLAY_SUPER_PEEL
{SPR_PLAY, SPR2_SPAN, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_PAIN {SPR_PLAY, SPR2_SPAN, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_PAIN
{SPR_PLAY, SPR2_SMSL, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_STUN {SPR_PLAY, SPR2_SSTN, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_STUN
{SPR_PLAY, SPR2_SDTH, 4, {NULL}, 0, 0, S_PLAY_SUPER_DEAD}, // S_PLAY_SUPER_DEAD {SPR_PLAY, SPR2_SDTH, 4, {NULL}, 0, 0, S_PLAY_SUPER_DEAD}, // S_PLAY_SUPER_DEAD
{SPR_PLAY, SPR2_SDRN, 4, {NULL}, 0, 0, S_PLAY_SUPER_DRWN}, // S_PLAY_SUPER_DRWN {SPR_PLAY, SPR2_SDRN, 4, {NULL}, 0, 0, S_PLAY_SUPER_DRWN}, // S_PLAY_SUPER_DRWN
{SPR_PLAY, SPR2_SSPN, 1, {NULL}, 0, 0, S_PLAY_SUPER_SPIN}, // S_PLAY_SUPER_SPIN {SPR_PLAY, SPR2_SSPN, 1, {NULL}, 0, 0, S_PLAY_SUPER_SPIN}, // S_PLAY_SUPER_SPIN
@ -204,16 +251,16 @@ state_t states[NUMSTATES] =
{SPR_PLAY, SPR2_SRID, 4, {NULL}, 0, 0, S_PLAY_SUPER_RIDE}, // S_PLAY_SUPER_RIDE {SPR_PLAY, SPR2_SRID, 4, {NULL}, 0, 0, S_PLAY_SUPER_RIDE}, // S_PLAY_SUPER_RIDE
{SPR_PLAY, SPR2_SFLT, 7, {NULL}, 0, 0, S_PLAY_SUPER_FLOAT}, // S_PLAY_SUPER_FLOAT {SPR_PLAY, SPR2_SFLT, 7, {NULL}, 0, 0, S_PLAY_SUPER_FLOAT}, // S_PLAY_SUPER_FLOAT
// Transforming into Super // SF_SUPER
{SPR_PLAY, SPR2_TRNS, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS2}, // S_PLAY_SUPER_TRANS {SPR_PLAY, SPR2_TRNS, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS2}, // S_PLAY_SUPER_TRANS
{SPR_PLAY, SPR2_TRNS, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS3}, // S_PLAY_SUPER_TRANS2 {SPR_PLAY, SPR2_TRNS, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS3}, // S_PLAY_SUPER_TRANS2
{SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS4}, // S_PLAY_SUPER_TRANS3 {SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS4}, // S_PLAY_SUPER_TRANS3
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS5}, // S_PLAY_SUPER_TRANS4 {SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS5}, // S_PLAY_SUPER_TRANS4
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS6}, // S_PLAY_SUPER_TRANS5 {SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS6}, // S_PLAY_SUPER_TRANS5
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS7}, // S_PLAY_SUPER_TRANS6 {SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS7}, // S_PLAY_SUPER_TRANS6
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS8}, // S_PLAY_SUPER_TRANS7 {SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS8}, // S_PLAY_SUPER_TRANS7
{SPR_PLAY, SPR2_TRNS, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS9}, // S_PLAY_SUPER_TRANS8 {SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_PLAY_SUPER_TRANS9}, // S_PLAY_SUPER_TRANS8
{SPR_PLAY, SPR2_TRNS, 16, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_SUPER_TRANS9 {SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 16, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_SUPER_TRANS9
{SPR_NULL, 0, -1, {NULL}, 0, 0, S_OBJPLACE_DUMMY}, //S_OBJPLACE_DUMMY {SPR_NULL, 0, -1, {NULL}, 0, 0, S_OBJPLACE_DUMMY}, //S_OBJPLACE_DUMMY
@ -227,6 +274,52 @@ state_t states[NUMSTATES] =
// Level end sign (uses player sprite) // Level end sign (uses player sprite)
{SPR_PLAY, SPR2_SIGN, 1, {NULL}, 0, 24, S_PLAY_SIGN}, // S_PLAY_SIGN {SPR_PLAY, SPR2_SIGN, 1, {NULL}, 0, 24, S_PLAY_SIGN}, // S_PLAY_SIGN
// NiGHTS Player, transforming
{SPR_PLAY, SPR2_NTRN, 4, {A_Scream}, 0, 0, S_PLAY_NIGHTS_TRANS2}, // S_PLAY_NIGHTS_TRANS
{SPR_PLAY, SPR2_NTRN, 4, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS3}, // S_PLAY_NIGHTS_TRANS2
{SPR_PLAY, SPR2_NTRN|FF_FULLBRIGHT, 4, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS4}, // S_PLAY_NIGHTS_TRANS3
{SPR_PLAY, SPR2_NTRN, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS5}, // S_PLAY_NIGHTS_TRANS4
{SPR_PLAY, SPR2_NTRN, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS6}, // S_PLAY_NIGHTS_TRANS5
{SPR_PLAY, SPR2_NTRN, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS7}, // S_PLAY_NIGHTS_TRANS6
{SPR_PLAY, SPR2_NTRN, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS8}, // S_PLAY_NIGHTS_TRANS7
{SPR_PLAY, SPR2_NTRN, 3, {NULL}, 0, 0, S_PLAY_NIGHTS_TRANS9}, // S_PLAY_NIGHTS_TRANS8
{SPR_PLAY, SPR2_NTRN, 16, {NULL}, 0, 0, S_PLAY_NIGHTS_FLOAT}, // S_PLAY_NIGHTS_TRANS9
// NiGHTS Player, Stand, Floating, Pain, Pull and Attack
{SPR_PLAY, SPR2_NSTD, 7, {NULL}, 0, 0, S_PLAY_NIGHTS_STAND}, // S_PLAY_NIGHTS_STAND
{SPR_PLAY, SPR2_NFLT, 7, {NULL}, 0, 0, S_PLAY_NIGHTS_FLOAT}, // S_PLAY_NIGHTS_FLOAT
{SPR_PLAY, SPR2_NPAN, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_PAIN}, // S_PLAY_NIGHTS_PAIN
{SPR_PLAY, SPR2_NPUL, 1, {NULL}, 0, 0, S_PLAY_NIGHTS_PULL}, // S_PLAY_NIGHTS_PULL
{SPR_PLAY, SPR2_NATK, 1, {NULL}, 0, 0, S_PLAY_NIGHTS_ATTACK}, // S_PLAY_NIGHTS_ATTACK
// NiGHTS Player, Flying and Drilling
{SPR_PLAY, SPR2_NGT0, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY0}, // S_PLAY_NIGHTS_FLY0
{SPR_PLAY, SPR2_DRL0, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL0}, // S_PLAY_NIGHTS_DRILL0
{SPR_PLAY, SPR2_NGT1, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY1}, // S_PLAY_NIGHTS_FLY1
{SPR_PLAY, SPR2_DRL1, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL1}, // S_PLAY_NIGHTS_DRILL1
{SPR_PLAY, SPR2_NGT2, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY2}, // S_PLAY_NIGHTS_FLY2
{SPR_PLAY, SPR2_DRL2, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL2}, // S_PLAY_NIGHTS_DRILL2
{SPR_PLAY, SPR2_NGT3, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY3}, // S_PLAY_NIGHTS_FLY3
{SPR_PLAY, SPR2_DRL3, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL3}, // S_PLAY_NIGHTS_DRILL3
{SPR_PLAY, SPR2_NGT4, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY4}, // S_PLAY_NIGHTS_FLY4
{SPR_PLAY, SPR2_DRL4, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL4}, // S_PLAY_NIGHTS_DRILL4
{SPR_PLAY, SPR2_NGT5, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY5}, // S_PLAY_NIGHTS_FLY5
{SPR_PLAY, SPR2_DRL5, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL5}, // S_PLAY_NIGHTS_DRILL5
{SPR_PLAY, SPR2_NGT6, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY6}, // S_PLAY_NIGHTS_FLY6
{SPR_PLAY, SPR2_DRL6, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL6}, // S_PLAY_NIGHTS_DRILL6
{SPR_PLAY, SPR2_NGT7, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY7}, // S_PLAY_NIGHTS_FLY7
{SPR_PLAY, SPR2_DRL7, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL7}, // S_PLAY_NIGHTS_DRILL7
{SPR_PLAY, SPR2_NGT8, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY8}, // S_PLAY_NIGHTS_FLY8
{SPR_PLAY, SPR2_DRL8, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL8}, // S_PLAY_NIGHTS_DRILL8
{SPR_PLAY, SPR2_NGT9, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY9}, // S_PLAY_NIGHTS_FLY9
{SPR_PLAY, SPR2_DRL9, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL9}, // S_PLAY_NIGHTS_DRILL9
{SPR_PLAY, SPR2_NGTA, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLYA}, // S_PLAY_NIGHTS_FLYA
{SPR_PLAY, SPR2_DRLA, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILLA}, // S_PLAY_NIGHTS_DRILLA
{SPR_PLAY, SPR2_NGTB, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLYB}, // S_PLAY_NIGHTS_FLYB
{SPR_PLAY, SPR2_DRLB, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILLB}, // S_PLAY_NIGHTS_DRILLB
{SPR_PLAY, SPR2_NGTC, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLYC}, // S_PLAY_NIGHTS_FLYC
{SPR_PLAY, SPR2_DRLC, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILLC}, // S_PLAY_NIGHTS_DRILLC
// Blue Crawla // Blue Crawla
{SPR_POSS, 0, 5, {A_Look}, 0, 0, S_POSS_STND}, // S_POSS_STND {SPR_POSS, 0, 5, {A_Look}, 0, 0, S_POSS_STND}, // S_POSS_STND
{SPR_POSS, 0, 3, {A_Chase}, 0, 0, S_POSS_RUN2}, // S_POSS_RUN1 {SPR_POSS, 0, 3, {A_Chase}, 0, 0, S_POSS_RUN2}, // S_POSS_RUN1
@ -1079,8 +1172,10 @@ state_t states[NUMSTATES] =
{SPR_FANS, 4, 1, {A_FanBubbleSpawn}, 512, 0, S_FAN}, // S_FAN5 {SPR_FANS, 4, 1, {A_FanBubbleSpawn}, 512, 0, S_FAN}, // S_FAN5
// Bubble Source // Bubble Source
{SPR_BUBL, 0, 8, {A_BubbleSpawn}, 2048, 0, S_BUBBLES2}, // S_BUBBLES1 {SPR_BBLS, 0, 8, {A_BubbleSpawn}, 2048, 0, S_BUBBLES2}, // S_BUBBLES1
{SPR_BUBL, 1, 8, {A_BubbleCheck}, 0, 0, S_BUBBLES1}, // S_BUBBLES2 {SPR_BBLS, 1, 8, {A_BubbleCheck}, 0, 0, S_BUBBLES3}, // S_BUBBLES2
{SPR_BBLS, 2, 8, {A_BubbleSpawn}, 2048, 0, S_BUBBLES4}, // S_BUBBLES3
{SPR_BBLS, 3, 8, {A_BubbleCheck}, 0, 0, S_BUBBLES1}, // S_BUBBLES4
// Level End Sign // Level End Sign
{SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN2}, // S_SIGN1 {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN2}, // S_SIGN1
@ -1890,17 +1985,18 @@ state_t states[NUMSTATES] =
{SPR_SMOK, FF_TRANS50|4, 8, {NULL}, 0, 0, S_NULL}, // S_SMOKE5 {SPR_SMOK, FF_TRANS50|4, 8, {NULL}, 0, 0, S_NULL}, // S_SMOKE5
// Bubbles // Bubbles
{SPR_BUBP, FF_TRANS50, 1, {A_BubbleRise}, 0, 1024, S_SMALLBUBBLE1}, // S_SMALLBUBBLE {SPR_BUBL, FF_TRANS50, 1, {A_BubbleRise}, 0, 1024, S_SMALLBUBBLE}, // S_SMALLBUBBLE
{SPR_BUBP, FF_TRANS50, 1, {A_BubbleRise}, 0, 1024, S_SMALLBUBBLE}, // S_SMALLBUBBLE1 {SPR_BUBL, FF_TRANS50|1, 1, {A_BubbleRise}, 0, 1024, S_MEDIUMBUBBLE}, // S_MEDIUMBUBBLE
{SPR_BUBO, FF_TRANS50, 1, {A_BubbleRise}, 0, 1024, S_MEDIUMBUBBLE1}, // S_MEDIUMBUBBLE
{SPR_BUBO, FF_TRANS50, 1, {A_BubbleRise}, 0, 1024, S_MEDIUMBUBBLE}, // S_MEDIUMBUBBLE1
// Extra Large Bubble (breathable) // Extra Large Bubble (breathable)
{SPR_BUBN, FF_TRANS50|FF_FULLBRIGHT, 16, {A_BubbleRise}, 0, 1024, S_EXTRALARGEBUBBLE}, // S_LARGEBUBBLE {SPR_BUBL, FF_TRANS50|FF_FULLBRIGHT|2, 8, {A_BubbleRise}, 0, 1024, S_LARGEBUBBLE2}, // S_LARGEBUBBLE1
{SPR_BUBM, FF_TRANS50|FF_FULLBRIGHT, 16, {A_BubbleRise}, 0, 1024, S_EXTRALARGEBUBBLE}, // S_EXTRALARGEBUBBLE {SPR_BUBL, FF_TRANS50|FF_FULLBRIGHT|3, 8, {A_BubbleRise}, 0, 1024, S_EXTRALARGEBUBBLE}, // S_LARGEBUBBLE2
{SPR_BUBL, FF_TRANS50|FF_FULLBRIGHT|4, 16, {A_BubbleRise}, 0, 1024, S_EXTRALARGEBUBBLE}, // S_EXTRALARGEBUBBLE
// Extra Large Bubble goes POP! // Extra Large Bubble goes POP!
{SPR_POPP, 0, 16, {NULL}, 0, 0, S_NULL}, // S_POP1 {SPR_BUBL, 5, 16, {NULL}, 0, 0, S_NULL}, // S_POP1
{SPR_WZAP, FF_TRANS10|FF_ANIMATE|FF_MIDDLESTARTCHANCE, 4, {NULL}, 3, 2, S_NULL}, // S_WATERZAP
{SPR_TFOG, FF_FULLBRIGHT|FF_TRANS50, 2, {NULL}, 0, 0, S_FOG2}, // S_FOG1 {SPR_TFOG, FF_FULLBRIGHT|FF_TRANS50, 2, {NULL}, 0, 0, S_FOG2}, // S_FOG1
{SPR_TFOG, FF_FULLBRIGHT|FF_TRANS50|1, 2, {NULL}, 0, 0, S_FOG3}, // S_FOG2 {SPR_TFOG, FF_FULLBRIGHT|FF_TRANS50|1, 2, {NULL}, 0, 0, S_FOG3}, // S_FOG2
@ -1944,6 +2040,13 @@ state_t states[NUMSTATES] =
{SPR_DRWN, 4, 40, {NULL}, 0, 0, S_NULL}, // S_FOUR1 {SPR_DRWN, 4, 40, {NULL}, 0, 0, S_NULL}, // S_FOUR1
{SPR_DRWN, 5, 40, {NULL}, 0, 0, S_NULL}, // S_FIVE1 {SPR_DRWN, 5, 40, {NULL}, 0, 0, S_NULL}, // S_FIVE1
{SPR_DRWN, 6, 40, {NULL}, 0, 0, S_NULL}, // S_ZERO2
{SPR_DRWN, 7, 40, {NULL}, 0, 0, S_NULL}, // S_ONE2
{SPR_DRWN, 8, 40, {NULL}, 0, 0, S_NULL}, // S_TWO2
{SPR_DRWN, 9, 40, {NULL}, 0, 0, S_NULL}, // S_THREE2
{SPR_DRWN, 10, 40, {NULL}, 0, 0, S_NULL}, // S_FOUR2
{SPR_DRWN, 11, 40, {NULL}, 0, 0, S_NULL}, // S_FIVE2
{SPR_TTAG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_TTAG1 {SPR_TTAG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_TTAG1
// CTF Sign // CTF Sign
@ -2216,96 +2319,6 @@ state_t states[NUMSTATES] =
{SPR_GOAL, 2, 4, {NULL}, 0, 0, S_NIGHTSGOAL4}, // S_NIGHTSGOAL3 {SPR_GOAL, 2, 4, {NULL}, 0, 0, S_NIGHTSGOAL4}, // S_NIGHTSGOAL3
{SPR_GOAL, 3, 4, {NULL}, 0, 0, S_NIGHTSGOAL1}, // S_NIGHTSGOAL4 {SPR_GOAL, 3, 4, {NULL}, 0, 0, S_NIGHTSGOAL1}, // S_NIGHTSGOAL4
// Nights Player, Flying and Drilling
{SPR_SUPE, 0, 1, {NULL}, 0, 0, S_NIGHTSFLY1B}, // S_NIGHTSFLY1A
{SPR_SUPE, 1, 1, {NULL}, 0, 0, S_NIGHTSFLY1A}, // S_NIGHTSFLY1B
{SPR_NDRL, 0, 2, {NULL}, 0, 0, S_NIGHTSDRILL1B}, // S_NIGHTSDRILL1A
{SPR_NDRL, 1, 2, {NULL}, 0, 0, S_NIGHTSDRILL1C}, // S_NIGHTSDRILL1B
{SPR_NDRL, 2, 2, {NULL}, 0, 0, S_NIGHTSDRILL1D}, // S_NIGHTSDRILL1C
{SPR_NDRL, 3, 2, {NULL}, 0, 0, S_NIGHTSDRILL1A}, // S_NIGHTSDRILL1D
{SPR_SUPE, 2, 1, {NULL}, 0, 0, S_NIGHTSFLY2B}, // S_NIGHTSFLY2A
{SPR_SUPE, 3, 1, {NULL}, 0, 0, S_NIGHTSFLY2A}, // S_NIGHTSFLY2B
{SPR_NDRL, 4, 2, {NULL}, 0, 0, S_NIGHTSDRILL2B}, // S_NIGHTSDRILL2A
{SPR_NDRL, 5, 2, {NULL}, 0, 0, S_NIGHTSDRILL2C}, // S_NIGHTSDRILL2B
{SPR_NDRL, 6, 2, {NULL}, 0, 0, S_NIGHTSDRILL2D}, // S_NIGHTSDRILL2C
{SPR_NDRL, 7, 2, {NULL}, 0, 0, S_NIGHTSDRILL2A}, // S_NIGHTSDRILL2D
{SPR_SUPE, 4, 1, {NULL}, 0, 0, S_NIGHTSFLY3B}, // S_NIGHTSFLY3A
{SPR_SUPE, 5, 1, {NULL}, 0, 0, S_NIGHTSFLY3A}, // S_NIGHTSFLY3B
{SPR_NDRL, 8, 2, {NULL}, 0, 0, S_NIGHTSDRILL3B}, // S_NIGHTSDRILL3A
{SPR_NDRL, 9, 2, {NULL}, 0, 0, S_NIGHTSDRILL3C}, // S_NIGHTSDRILL3B
{SPR_NDRL, 10, 2, {NULL}, 0, 0, S_NIGHTSDRILL3D}, // S_NIGHTSDRILL3C
{SPR_NDRL, 11, 2, {NULL}, 0, 0, S_NIGHTSDRILL3A}, // S_NIGHTSDRILL3D
{SPR_SUPE, 6, 1, {NULL}, 0, 0, S_NIGHTSFLY4B}, // S_NIGHTSFLY4A
{SPR_SUPE, 7, 1, {NULL}, 0, 0, S_NIGHTSFLY4A}, // S_NIGHTSFLY4B
{SPR_NDRL, 12, 2, {NULL}, 0, 0, S_NIGHTSDRILL4B}, // S_NIGHTSDRILL4A
{SPR_NDRL, 13, 2, {NULL}, 0, 0, S_NIGHTSDRILL4C}, // S_NIGHTSDRILL4B
{SPR_NDRL, 14, 2, {NULL}, 0, 0, S_NIGHTSDRILL4D}, // S_NIGHTSDRILL4C
{SPR_NDRL, 15, 2, {NULL}, 0, 0, S_NIGHTSDRILL4A}, // S_NIGHTSDRILL4D
{SPR_SUPE, 8, 1, {NULL}, 0, 0, S_NIGHTSFLY5B}, // S_NIGHTSFLY5A
{SPR_SUPE, 9, 1, {NULL}, 0, 0, S_NIGHTSFLY5A}, // S_NIGHTSFLY5B
{SPR_NDRL, 16, 2, {NULL}, 0, 0, S_NIGHTSDRILL5B}, // S_NIGHTSDRILL5A
{SPR_NDRL, 17, 2, {NULL}, 0, 0, S_NIGHTSDRILL5C}, // S_NIGHTSDRILL5B
{SPR_NDRL, 18, 2, {NULL}, 0, 0, S_NIGHTSDRILL5D}, // S_NIGHTSDRILL5C
{SPR_NDRL, 19, 2, {NULL}, 0, 0, S_NIGHTSDRILL5A}, // S_NIGHTSDRILL5D
{SPR_SUPE, 10, 1, {NULL}, 0, 0, S_NIGHTSFLY6B}, // S_NIGHTSFLY6A
{SPR_SUPE, 11, 1, {NULL}, 0, 0, S_NIGHTSFLY6A}, // S_NIGHTSFLY6B
{SPR_NDRL, 20, 2, {NULL}, 0, 0, S_NIGHTSDRILL6B}, // S_NIGHTSDRILL6A
{SPR_NDRL, 21, 2, {NULL}, 0, 0, S_NIGHTSDRILL6C}, // S_NIGHTSDRILL6B
{SPR_NDRL, 22, 2, {NULL}, 0, 0, S_NIGHTSDRILL6D}, // S_NIGHTSDRILL6C
{SPR_NDRL, 23, 2, {NULL}, 0, 0, S_NIGHTSDRILL6A}, // S_NIGHTSDRILL6D
{SPR_SUPE, 12, 1, {NULL}, 0, 0, S_NIGHTSFLY7B}, // S_NIGHTSFLY7A
{SPR_SUPE, 13, 1, {NULL}, 0, 0, S_NIGHTSFLY7A}, // S_NIGHTSFLY7B
{SPR_NDRL, 24, 2, {NULL}, 0, 0, S_NIGHTSDRILL7B}, // S_NIGHTSDRILL7A
{SPR_NDRL, 25, 2, {NULL}, 0, 0, S_NIGHTSDRILL7C}, // S_NIGHTSDRILL7B
{SPR_NDRL, 26, 2, {NULL}, 0, 0, S_NIGHTSDRILL7D}, // S_NIGHTSDRILL7C
{SPR_NDRL, 27, 2, {NULL}, 0, 0, S_NIGHTSDRILL7A}, // S_NIGHTSDRILL7D
{SPR_SUPE, 14, 1, {NULL}, 0, 0, S_NIGHTSFLY8B}, // S_NIGHTSFLY8A
{SPR_SUPE, 15, 1, {NULL}, 0, 0, S_NIGHTSFLY8A}, // S_NIGHTSFLY8B
{SPR_NDRL, 28, 2, {NULL}, 0, 0, S_NIGHTSDRILL8B}, // S_NIGHTSDRILL8A
{SPR_NDRL, 29, 2, {NULL}, 0, 0, S_NIGHTSDRILL8C}, // S_NIGHTSDRILL8B
{SPR_NDRL, 30, 2, {NULL}, 0, 0, S_NIGHTSDRILL8D}, // S_NIGHTSDRILL8C
{SPR_NDRL, 31, 2, {NULL}, 0, 0, S_NIGHTSDRILL8A}, // S_NIGHTSDRILL8D
{SPR_SUPE, 16, 1, {NULL}, 0, 0, S_NIGHTSFLY9B}, // S_NIGHTSFLY9A
{SPR_SUPE, 17, 1, {NULL}, 0, 0, S_NIGHTSFLY9A}, // S_NIGHTSFLY9B
{SPR_NDRL, 32, 2, {NULL}, 0, 0, S_NIGHTSDRILL9B}, // S_NIGHTSDRILL9A
{SPR_NDRL, 33, 2, {NULL}, 0, 0, S_NIGHTSDRILL9C}, // S_NIGHTSDRILL9B
{SPR_NDRL, 34, 2, {NULL}, 0, 0, S_NIGHTSDRILL9D}, // S_NIGHTSDRILL9C
{SPR_NDRL, 35, 2, {NULL}, 0, 0, S_NIGHTSDRILL9A}, // S_NIGHTSDRILL9D
// Nights Player, Falling
{SPR_SUPZ, 0, 1, {NULL}, 0, 0, S_NIGHTSHURT2}, // S_NIGHTSHURT1
{SPR_SUPZ, 1, 1, {NULL}, 0, 0, S_NIGHTSHURT3}, // S_NIGHTSHURT2
{SPR_SUPZ, 2, 1, {NULL}, 0, 0, S_NIGHTSHURT4}, // S_NIGHTSHURT3
{SPR_SUPZ, 3, 1, {NULL}, 0, 0, S_NIGHTSHURT5}, // S_NIGHTSHURT4
{SPR_SUPZ, 4, 1, {NULL}, 0, 0, S_NIGHTSHURT6}, // S_NIGHTSHURT5
{SPR_SUPZ, 5, 1, {NULL}, 0, 0, S_NIGHTSHURT7}, // S_NIGHTSHURT6
{SPR_SUPZ, 6, 1, {NULL}, 0, 0, S_NIGHTSHURT8}, // S_NIGHTSHURT7
{SPR_SUPZ, 7, 1, {NULL}, 0, 0, S_NIGHTSHURT9}, // S_NIGHTSHURT8
{SPR_SUPZ, 8, 1, {NULL}, 0, 0, S_NIGHTSHURT10}, // S_NIGHTSHURT9
{SPR_SUPZ, 9, 1, {NULL}, 0, 0, S_NIGHTSHURT11}, // S_NIGHTSHURT10
{SPR_SUPZ, 10, 1, {NULL}, 0, 0, S_NIGHTSHURT12}, // S_NIGHTSHURT11
{SPR_SUPZ, 11, 1, {NULL}, 0, 0, S_NIGHTSHURT13}, // S_NIGHTSHURT12
{SPR_SUPZ, 12, 1, {NULL}, 0, 0, S_NIGHTSHURT14}, // S_NIGHTSHURT13
{SPR_SUPZ, 13, 1, {NULL}, 0, 0, S_NIGHTSHURT15}, // S_NIGHTSHURT14
{SPR_SUPZ, 14, 1, {NULL}, 0, 0, S_NIGHTSHURT16}, // S_NIGHTSHURT15
{SPR_SUPZ, 15, 1, {NULL}, 0, 0, S_NIGHTSHURT17}, // S_NIGHTSHURT16
{SPR_SUPZ, 0, 1, {NULL}, 0, 0, S_NIGHTSHURT18}, // S_NIGHTSHURT17
{SPR_SUPZ, 1, 1, {NULL}, 0, 0, S_NIGHTSHURT19}, // S_NIGHTSHURT18
{SPR_SUPZ, 2, 1, {NULL}, 0, 0, S_NIGHTSHURT20}, // S_NIGHTSHURT19
{SPR_SUPZ, 3, 1, {NULL}, 0, 0, S_NIGHTSHURT21}, // S_NIGHTSHURT20
{SPR_SUPZ, 4, 1, {NULL}, 0, 0, S_NIGHTSHURT22}, // S_NIGHTSHURT21
{SPR_SUPZ, 5, 1, {NULL}, 0, 0, S_NIGHTSHURT23}, // S_NIGHTSHURT22
{SPR_SUPZ, 6, 1, {NULL}, 0, 0, S_NIGHTSHURT24}, // S_NIGHTSHURT23
{SPR_SUPZ, 7, 1, {NULL}, 0, 0, S_NIGHTSHURT25}, // S_NIGHTSHURT24
{SPR_SUPZ, 8, 1, {NULL}, 0, 0, S_NIGHTSHURT26}, // S_NIGHTSHURT25
{SPR_SUPZ, 9, 1, {NULL}, 0, 0, S_NIGHTSHURT27}, // S_NIGHTSHURT26
{SPR_SUPZ, 10, 1, {NULL}, 0, 0, S_NIGHTSHURT28}, // S_NIGHTSHURT27
{SPR_SUPZ, 11, 1, {NULL}, 0, 0, S_NIGHTSHURT29}, // S_NIGHTSHURT28
{SPR_SUPZ, 12, 1, {NULL}, 0, 0, S_NIGHTSHURT30}, // S_NIGHTSHURT29
{SPR_SUPZ, 13, 1, {NULL}, 0, 0, S_NIGHTSHURT31}, // S_NIGHTSHURT30
{SPR_SUPZ, 14, 1, {NULL}, 0, 0, S_NIGHTSHURT32}, // S_NIGHTSHURT31
{SPR_SUPZ, 15, 1, {NULL}, 0, 0, S_NIGHTSFLY1A}, // S_NIGHTSHURT32
// Nights Sparkle // Nights Sparkle
{SPR_NSPK, FF_FULLBRIGHT, 140, {NULL}, 0, 0, S_NIGHTSPARKLE2}, // S_NIGHTSPARKLE1 {SPR_NSPK, FF_FULLBRIGHT, 140, {NULL}, 0, 0, S_NIGHTSPARKLE2}, // S_NIGHTSPARKLE1
{SPR_NSPK, FF_FULLBRIGHT|1, 7, {NULL}, 0, 0, S_NIGHTSPARKLE3}, // S_NIGHTSPARKLE2 {SPR_NSPK, FF_FULLBRIGHT|1, 7, {NULL}, 0, 0, S_NIGHTSPARKLE3}, // S_NIGHTSPARKLE2
@ -2408,16 +2421,6 @@ state_t states[NUMSTATES] =
{SPR_NULL, 0, 35, {NULL}, 0, 0, S_CRUMBLE2}, // S_CRUMBLE1 {SPR_NULL, 0, 35, {NULL}, 0, 0, S_CRUMBLE2}, // S_CRUMBLE1
{SPR_NULL, 0, 105, {A_Scream}, 0, 0, S_NULL}, // S_CRUMBLE2 {SPR_NULL, 0, 105, {A_Scream}, 0, 0, S_NULL}, // S_CRUMBLE2
{SPR_SUPT, 0, 4, {A_Scream}, 0, 0, S_SUPERTRANS2}, // S_SUPERTRANS1
{SPR_SUPT, 1, 4, {NULL}, 0, 0, S_SUPERTRANS3}, // S_SUPERTRANS2
{SPR_SUPT, FF_FULLBRIGHT|2, 4, {NULL}, 0, 0, S_SUPERTRANS4}, // S_SUPERTRANS3
{SPR_SUPT, 3, 3, {NULL}, 0, 0, S_SUPERTRANS5}, // S_SUPERTRANS4
{SPR_SUPT, 4, 3, {NULL}, 0, 0, S_SUPERTRANS6}, // S_SUPERTRANS5
{SPR_SUPT, 5, 3, {NULL}, 0, 0, S_SUPERTRANS7}, // S_SUPERTRANS6
{SPR_SUPT, 6, 3, {NULL}, 0, 0, S_SUPERTRANS8}, // S_SUPERTRANS7
{SPR_SUPT, 7, 3, {NULL}, 0, 0, S_SUPERTRANS9}, // S_SUPERTRANS8
{SPR_SUPT, 8, 16, {NULL}, 0, 0, S_NIGHTSDRONE1}, // S_SUPERTRANS9
// Spark // Spark
{SPR_SPRK, FF_TRANS40 , 1, {NULL}, 0, 0, S_SPRK2}, // S_SPRK1 {SPR_SPRK, FF_TRANS40 , 1, {NULL}, 0, 0, S_SPRK2}, // S_SPRK1
{SPR_SPRK, FF_TRANS50|1, 1, {NULL}, 0, 0, S_SPRK3}, // S_SPRK2 {SPR_SPRK, FF_TRANS50|1, 1, {NULL}, 0, 0, S_SPRK3}, // S_SPRK2
@ -2644,7 +2647,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
MT_THOK, // damage MT_THOK, // damage
sfx_None, // activesound sfx_None, // activesound
MF_SOLID|MF_SHOOTABLE, // flags MF_SOLID|MF_SHOOTABLE, // flags
(statenum_t)MT_THOK // raisestate (statenum_t)MT_NULL // raisestate
}, },
{ // MT_BLUECRAWLA { // MT_BLUECRAWLA
@ -10640,7 +10643,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
{ // MT_EXTRALARGEBUBBLE { // MT_EXTRALARGEBUBBLE
-1, // doomednum -1, // doomednum
S_LARGEBUBBLE, // spawnstate S_LARGEBUBBLE1, // spawnstate
1000, // spawnhealth 1000, // spawnhealth
S_NULL, // seestate S_NULL, // seestate
sfx_None, // seesound sfx_None, // seesound
@ -10655,8 +10658,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL, // xdeathstate S_NULL, // xdeathstate
sfx_gasp, // deathsound sfx_gasp, // deathsound
8, // speed 8, // speed
8*FRACUNIT, // radius 23*FRACUNIT, // radius
12*FRACUNIT, // height 43*FRACUNIT, // height
0, // display offset 0, // display offset
16, // mass 16, // mass
0, // damage 0, // damage
@ -10665,6 +10668,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate S_NULL // raisestate
}, },
{ // MT_WATERZAP
-1, // doomednum
S_WATERZAP, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
8, // speed
4*FRACUNIT, // radius
4*FRACUNIT, // height
0, // display offset
16, // mass
0, // damage
sfx_None, // activesound
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_SCENERY, // flags
S_NULL // raisestate
},
{ // MT_TFOG { // MT_TFOG
-1, // doomednum -1, // doomednum
S_FOG1, // spawnstate S_FOG1, // spawnstate
@ -12293,33 +12323,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate S_NULL // raisestate
}, },
{ // MT_NIGHTSCHAR
-1, // doomednum
S_NIGHTSFLY1A, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
0, // reactiontime
sfx_None, // attacksound
S_NIGHTSFLY1A, // painstate
255, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NIGHTSFLY1A, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
0, // speed
16*FRACUNIT, // radius
48*FRACUNIT, // height
0, // display offset
1000, // mass
0, // damage
sfx_None, // activesound
MF_NOCLIP|MF_NOGRAVITY, // flags
S_NULL // raisestate
},
{ // MT_NIGHTSPARKLE { // MT_NIGHTSPARKLE
-1, // doomednum -1, // doomednum
S_NIGHTSPARKLE1,// spawnstate S_NIGHTSPARKLE1,// spawnstate

View File

@ -317,7 +317,7 @@ typedef enum sprite
// Interactive Objects // Interactive Objects
SPR_FANS, SPR_FANS,
SPR_BUBL, // water bubble source SPR_BBLS, // water bubble source
SPR_SIGN, // Level end sign SPR_SIGN, // Level end sign
SPR_STEM, // Steam riser SPR_STEM, // Steam riser
SPR_SPIK, // Spike Ball SPR_SPIK, // Spike Ball
@ -464,11 +464,8 @@ typedef enum sprite
SPR_SPLH, // Water Splish SPR_SPLH, // Water Splish
SPR_SPLA, // Water Splash SPR_SPLA, // Water Splash
SPR_SMOK, SPR_SMOK,
SPR_BUBP, // Small bubble SPR_BUBL, // Bubble
SPR_BUBO, // Medium bubble SPR_WZAP,
SPR_BUBN, // Large bubble
SPR_BUBM, // Extra Large (would you like fries with that?) bubble
SPR_POPP, // Extra Large bubble goes POP!
SPR_TFOG, // Teleport Fog SPR_TFOG, // Teleport Fog
SPR_SEED, // Sonic CD flower seed SPR_SEED, // Sonic CD flower seed
SPR_PRTL, // Particle (for fans, etc.) SPR_PRTL, // Particle (for fans, etc.)
@ -519,16 +516,12 @@ typedef enum sprite
// NiGHTS Stuff // NiGHTS Stuff
SPR_NDRN, // NiGHTS drone SPR_NDRN, // NiGHTS drone
SPR_SUPE, // NiGHTS character flying
SPR_SUPZ, // NiGHTS hurt
SPR_NDRL, // NiGHTS character drilling
SPR_NSPK, // NiGHTS sparkle SPR_NSPK, // NiGHTS sparkle
SPR_NBMP, // NiGHTS Bumper SPR_NBMP, // NiGHTS Bumper
SPR_HOOP, // NiGHTS hoop sprite SPR_HOOP, // NiGHTS hoop sprite
SPR_NSCR, // NiGHTS score sprite SPR_NSCR, // NiGHTS score sprite
SPR_NPRU, // Nights Powerups SPR_NPRU, // Nights Powerups
SPR_CAPS, // Capsule thingy for NiGHTS SPR_CAPS, // Capsule thingy for NiGHTS
SPR_SUPT, // Super Sonic Transformation (NiGHTS)
// Debris // Debris
SPR_SPRK, // spark SPR_SPRK, // spark
@ -584,6 +577,9 @@ typedef enum sprite
NUMSPRITES NUMSPRITES
} spritenum_t; } spritenum_t;
// Make sure to be conscious of FF_FRAMEMASK whenever you change this table.
// Currently, FF_FRAMEMASK is 0x1ff, or 511 - and NUMSPRITEFREESLOTS is 256.
// Since this is zero-based, there can be at most 256 different SPR2_'s without changing that.
enum playersprite enum playersprite
{ {
SPR2_STND = 0, SPR2_STND = 0,
@ -593,9 +589,9 @@ enum playersprite
SPR2_PEEL, SPR2_PEEL,
SPR2_PAIN, SPR2_PAIN,
SPR2_DEAD, SPR2_DEAD,
SPR2_DRWN, SPR2_DRWN, // drown
SPR2_SPIN, SPR2_SPIN,
SPR2_DASH, SPR2_DASH, // spindash charge
SPR2_GASP, SPR2_GASP,
SPR2_JUMP, SPR2_JUMP,
SPR2_SPNG, // spring SPR2_SPNG, // spring
@ -603,33 +599,75 @@ enum playersprite
SPR2_EDGE, SPR2_EDGE,
SPR2_RIDE, SPR2_RIDE,
SPR2_SIGN, SPR2_SIGN, // end sign head
SPR2_LIFE, SPR2_LIFE, // life monitor icon
SPR2_FLY , SPR2_FLY ,
SPR2_TIRE, SPR2_SWIM,
SPR2_TIRE, // tired
SPR2_GLID, SPR2_GLID, // glide
SPR2_CLNG, SPR2_CLNG, // cling
SPR2_CLMB, SPR2_CLMB, // climb
SPR2_TRNS, SPR2_TWIN, // twinspin
SPR2_SSTD,
SPR2_SWLK, SPR2_MLEE, // melee
SPR2_SRUN,
SPR2_SPEE, SPR2_TRNS, // super transformation
SPR2_SPAN, SPR2_SSTD, // super stand
SPR2_SMSL, SPR2_SWLK, // super walk
SPR2_SDTH, SPR2_SRUN, // super run
SPR2_SDRN, SPR2_SPEE, // super peelout
SPR2_SSPN, SPR2_SPAN, // super pain
SPR2_SGSP, SPR2_SSTN, // super stun
SPR2_SJMP, SPR2_SDTH, // super death
SPR2_SSPG, SPR2_SDRN, // super drown
SPR2_SFAL, SPR2_SSPN, // super spin
SPR2_SEDG, SPR2_SGSP, // super gasp
SPR2_SRID, SPR2_SJMP, // super jump
SPR2_SFLT, SPR2_SSPG, // super spring
SPR2_SFAL, // super fall
SPR2_SEDG, // super edge
SPR2_SRID, // super ride
SPR2_SFLT, // super float
SPR2_NTRN, // NiGHTS transformation
SPR2_NSTD, // NiGHTS stand
SPR2_NFLT, // NiGHTS float
SPR2_NPAN, // NiGHTS pain
SPR2_NPUL, // NiGHTS pull
SPR2_NATK, // NiGHTS attack
// NiGHTS flight.
SPR2_NGT0,
SPR2_NGT1,
SPR2_NGT2,
SPR2_NGT3,
SPR2_NGT4,
SPR2_NGT5,
SPR2_NGT6,
SPR2_NGT7,
SPR2_NGT8,
SPR2_NGT9,
SPR2_NGTA,
SPR2_NGTB,
SPR2_NGTC,
// NiGHTS drill.
SPR2_DRL0,
SPR2_DRL1,
SPR2_DRL2,
SPR2_DRL3,
SPR2_DRL4,
SPR2_DRL5,
SPR2_DRL6,
SPR2_DRL7,
SPR2_DRL8,
SPR2_DRL9,
SPR2_DRLA,
SPR2_DRLB,
SPR2_DRLC,
SPR2_FIRSTFREESLOT, SPR2_FIRSTFREESLOT,
SPR2_LASTFREESLOT = SPR2_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1, SPR2_LASTFREESLOT = SPR2_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1,
@ -665,14 +703,15 @@ typedef enum state
S_PLAY_SPIN, S_PLAY_SPIN,
S_PLAY_DASH, S_PLAY_DASH,
S_PLAY_GASP, S_PLAY_GASP,
S_PLAY_JUMP, // spin jump (todo: make jump separate from spring up for non-spin chars too?) S_PLAY_JUMP, // spin jump
S_PLAY_SPRING, S_PLAY_SPRING,
S_PLAY_FALL, S_PLAY_FALL,
S_PLAY_EDGE, S_PLAY_EDGE,
S_PLAY_RIDE, S_PLAY_RIDE,
// CA_FLY // CA_FLY/SWIM
S_PLAY_FLY, S_PLAY_FLY,
S_PLAY_SWIM,
S_PLAY_FLY_TIRED, S_PLAY_FLY_TIRED,
// CA_GLIDEANDCLIMB // CA_GLIDEANDCLIMB
@ -680,6 +719,13 @@ typedef enum state
S_PLAY_CLING, S_PLAY_CLING,
S_PLAY_CLIMB, S_PLAY_CLIMB,
// CA_TWINSPIN
S_PLAY_TWINSPIN,
// CA2_MELEE
S_PLAY_MELEE,
S_PLAY_MELEE_FINISH,
// SF_SUPERANIMS // SF_SUPERANIMS
S_PLAY_SUPER_STND, S_PLAY_SUPER_STND,
S_PLAY_SUPER_WALK, S_PLAY_SUPER_WALK,
@ -722,6 +768,50 @@ typedef enum state
// Level end sign overlay (uses player sprite) // Level end sign overlay (uses player sprite)
S_PLAY_SIGN, S_PLAY_SIGN,
// NiGHTS character (uses player sprite)
S_PLAY_NIGHTS_TRANS,
S_PLAY_NIGHTS_TRANS2,
S_PLAY_NIGHTS_TRANS3,
S_PLAY_NIGHTS_TRANS4,
S_PLAY_NIGHTS_TRANS5,
S_PLAY_NIGHTS_TRANS6,
S_PLAY_NIGHTS_TRANS7,
S_PLAY_NIGHTS_TRANS8,
S_PLAY_NIGHTS_TRANS9,
S_PLAY_NIGHTS_STAND,
S_PLAY_NIGHTS_FLOAT,
S_PLAY_NIGHTS_PAIN,
S_PLAY_NIGHTS_PULL,
S_PLAY_NIGHTS_ATTACK,
S_PLAY_NIGHTS_FLY0,
S_PLAY_NIGHTS_DRILL0,
S_PLAY_NIGHTS_FLY1,
S_PLAY_NIGHTS_DRILL1,
S_PLAY_NIGHTS_FLY2,
S_PLAY_NIGHTS_DRILL2,
S_PLAY_NIGHTS_FLY3,
S_PLAY_NIGHTS_DRILL3,
S_PLAY_NIGHTS_FLY4,
S_PLAY_NIGHTS_DRILL4,
S_PLAY_NIGHTS_FLY5,
S_PLAY_NIGHTS_DRILL5,
S_PLAY_NIGHTS_FLY6,
S_PLAY_NIGHTS_DRILL6,
S_PLAY_NIGHTS_FLY7,
S_PLAY_NIGHTS_DRILL7,
S_PLAY_NIGHTS_FLY8,
S_PLAY_NIGHTS_DRILL8,
S_PLAY_NIGHTS_FLY9,
S_PLAY_NIGHTS_DRILL9,
S_PLAY_NIGHTS_FLYA,
S_PLAY_NIGHTS_DRILLA,
S_PLAY_NIGHTS_FLYB,
S_PLAY_NIGHTS_DRILLB,
S_PLAY_NIGHTS_FLYC,
S_PLAY_NIGHTS_DRILLC,
// Blue Crawla // Blue Crawla
S_POSS_STND, S_POSS_STND,
S_POSS_RUN1, S_POSS_RUN1,
@ -1572,6 +1662,8 @@ typedef enum state
// Bubble Source // Bubble Source
S_BUBBLES1, S_BUBBLES1,
S_BUBBLES2, S_BUBBLES2,
S_BUBBLES3,
S_BUBBLES4,
// Level End Sign // Level End Sign
S_SIGN1, S_SIGN1,
@ -2372,14 +2464,15 @@ typedef enum state
// Bubbles // Bubbles
S_SMALLBUBBLE, S_SMALLBUBBLE,
S_SMALLBUBBLE1,
S_MEDIUMBUBBLE, S_MEDIUMBUBBLE,
S_MEDIUMBUBBLE1, S_LARGEBUBBLE1,
S_LARGEBUBBLE, S_LARGEBUBBLE2,
S_EXTRALARGEBUBBLE, // breathable S_EXTRALARGEBUBBLE, // breathable
S_POP1, // Extra Large bubble goes POP! S_POP1, // Extra Large bubble goes POP!
S_WATERZAP,
S_FOG1, S_FOG1,
S_FOG2, S_FOG2,
S_FOG3, S_FOG3,
@ -2421,6 +2514,13 @@ typedef enum state
S_FOUR1, S_FOUR1,
S_FIVE1, S_FIVE1,
S_ZERO2,
S_ONE2,
S_TWO2,
S_THREE2,
S_FOUR2,
S_FIVE2,
// Tag Sign // Tag Sign
S_TTAG1, S_TTAG1,
@ -2653,93 +2753,6 @@ typedef enum state
S_NIGHTSGOAL3, S_NIGHTSGOAL3,
S_NIGHTSGOAL4, S_NIGHTSGOAL4,
S_NIGHTSFLY1A,
S_NIGHTSFLY1B,
S_NIGHTSDRILL1A,
S_NIGHTSDRILL1B,
S_NIGHTSDRILL1C,
S_NIGHTSDRILL1D,
S_NIGHTSFLY2A,
S_NIGHTSFLY2B,
S_NIGHTSDRILL2A,
S_NIGHTSDRILL2B,
S_NIGHTSDRILL2C,
S_NIGHTSDRILL2D,
S_NIGHTSFLY3A,
S_NIGHTSFLY3B,
S_NIGHTSDRILL3A,
S_NIGHTSDRILL3B,
S_NIGHTSDRILL3C,
S_NIGHTSDRILL3D,
S_NIGHTSFLY4A,
S_NIGHTSFLY4B,
S_NIGHTSDRILL4A,
S_NIGHTSDRILL4B,
S_NIGHTSDRILL4C,
S_NIGHTSDRILL4D,
S_NIGHTSFLY5A,
S_NIGHTSFLY5B,
S_NIGHTSDRILL5A,
S_NIGHTSDRILL5B,
S_NIGHTSDRILL5C,
S_NIGHTSDRILL5D,
S_NIGHTSFLY6A,
S_NIGHTSFLY6B,
S_NIGHTSDRILL6A,
S_NIGHTSDRILL6B,
S_NIGHTSDRILL6C,
S_NIGHTSDRILL6D,
S_NIGHTSFLY7A,
S_NIGHTSFLY7B,
S_NIGHTSDRILL7A,
S_NIGHTSDRILL7B,
S_NIGHTSDRILL7C,
S_NIGHTSDRILL7D,
S_NIGHTSFLY8A,
S_NIGHTSFLY8B,
S_NIGHTSDRILL8A,
S_NIGHTSDRILL8B,
S_NIGHTSDRILL8C,
S_NIGHTSDRILL8D,
S_NIGHTSFLY9A,
S_NIGHTSFLY9B,
S_NIGHTSDRILL9A,
S_NIGHTSDRILL9B,
S_NIGHTSDRILL9C,
S_NIGHTSDRILL9D,
S_NIGHTSHURT1,
S_NIGHTSHURT2,
S_NIGHTSHURT3,
S_NIGHTSHURT4,
S_NIGHTSHURT5,
S_NIGHTSHURT6,
S_NIGHTSHURT7,
S_NIGHTSHURT8,
S_NIGHTSHURT9,
S_NIGHTSHURT10,
S_NIGHTSHURT11,
S_NIGHTSHURT12,
S_NIGHTSHURT13,
S_NIGHTSHURT14,
S_NIGHTSHURT15,
S_NIGHTSHURT16,
S_NIGHTSHURT17,
S_NIGHTSHURT18,
S_NIGHTSHURT19,
S_NIGHTSHURT20,
S_NIGHTSHURT21,
S_NIGHTSHURT22,
S_NIGHTSHURT23,
S_NIGHTSHURT24,
S_NIGHTSHURT25,
S_NIGHTSHURT26,
S_NIGHTSHURT27,
S_NIGHTSHURT28,
S_NIGHTSHURT29,
S_NIGHTSHURT30,
S_NIGHTSHURT31,
S_NIGHTSHURT32,
S_NIGHTSPARKLE1, S_NIGHTSPARKLE1,
S_NIGHTSPARKLE2, S_NIGHTSPARKLE2,
S_NIGHTSPARKLE3, S_NIGHTSPARKLE3,
@ -2836,16 +2849,6 @@ typedef enum state
S_CRUMBLE1, S_CRUMBLE1,
S_CRUMBLE2, S_CRUMBLE2,
S_SUPERTRANS1,
S_SUPERTRANS2,
S_SUPERTRANS3,
S_SUPERTRANS4,
S_SUPERTRANS5,
S_SUPERTRANS6,
S_SUPERTRANS7,
S_SUPERTRANS8,
S_SUPERTRANS9,
// Spark // Spark
S_SPRK1, S_SPRK1,
S_SPRK2, S_SPRK2,
@ -3361,6 +3364,7 @@ typedef enum mobj_type
MT_SMALLBUBBLE, // small bubble MT_SMALLBUBBLE, // small bubble
MT_MEDIUMBUBBLE, // medium bubble MT_MEDIUMBUBBLE, // medium bubble
MT_EXTRALARGEBUBBLE, // extra large bubble MT_EXTRALARGEBUBBLE, // extra large bubble
MT_WATERZAP,
MT_TFOG, MT_TFOG,
MT_SEED, MT_SEED,
MT_PARTICLE, MT_PARTICLE,
@ -3433,7 +3437,6 @@ typedef enum mobj_type
MT_AXISTRANSFERLINE, MT_AXISTRANSFERLINE,
MT_NIGHTSDRONE, MT_NIGHTSDRONE,
MT_NIGHTSGOAL, MT_NIGHTSGOAL,
MT_NIGHTSCHAR,
MT_NIGHTSPARKLE, MT_NIGHTSPARKLE,
MT_NIGHTSLOOPHELPER, MT_NIGHTSLOOPHELPER,
MT_NIGHTSBUMPER, // NiGHTS Bumper MT_NIGHTSBUMPER, // NiGHTS Bumper

View File

@ -1377,11 +1377,6 @@ msgstr ""
msgid "modifiedgame is false, you can unlock secrets\n" msgid "modifiedgame is false, you can unlock secrets\n"
msgstr "" msgstr ""
#: d_netcmd.c:4599
#, c-format
msgid "Valid skin numbers are 0 to %d (-1 disables)\n"
msgstr ""
#: d_netcmd.c:4617 d_netcmd.c:4629 #: d_netcmd.c:4617 d_netcmd.c:4629
msgid "You may not change your name when chat is muted.\n" msgid "You may not change your name when chat is muted.\n"
msgstr "" msgstr ""

View File

@ -1362,11 +1362,6 @@ msgstr ""
msgid "No CHEAT-marked variables are changed -- Cheats are disabled.\n" msgid "No CHEAT-marked variables are changed -- Cheats are disabled.\n"
msgstr "" msgstr ""
#: d_netcmd.c:4439
#, c-format
msgid "Valid skin numbers are 0 to %d (-1 disables)\n"
msgstr ""
#: d_netcmd.c:4457 d_netcmd.c:4469 #: d_netcmd.c:4457 d_netcmd.c:4469
msgid "You may not change your name when chat is muted.\n" msgid "You may not change your name when chat is muted.\n"
msgstr "" msgstr ""

View File

@ -69,7 +69,7 @@ boolean LUAh_MobjDeath(mobj_t *target, mobj_t *inflictor, mobj_t *source); // Ho
#define LUAh_MobjRemoved(mo) LUAh_MobjHook(mo, hook_MobjRemoved) // Hook for P_RemoveMobj by mobj type #define LUAh_MobjRemoved(mo) LUAh_MobjHook(mo, hook_MobjRemoved) // Hook for P_RemoveMobj by mobj type
#define LUAh_JumpSpecial(player) LUAh_PlayerHook(player, hook_JumpSpecial) // Hook for P_DoJumpStuff (Any-jumping) #define LUAh_JumpSpecial(player) LUAh_PlayerHook(player, hook_JumpSpecial) // Hook for P_DoJumpStuff (Any-jumping)
#define LUAh_AbilitySpecial(player) LUAh_PlayerHook(player, hook_AbilitySpecial) // Hook for P_DoJumpStuff (Double-jumping) #define LUAh_AbilitySpecial(player) LUAh_PlayerHook(player, hook_AbilitySpecial) // Hook for P_DoJumpStuff (Double-jumping)
#define LUAh_SpinSpecial(player) LUAh_PlayerHook(player, hook_SpinSpecial) // Hook for P_DoSpinDash (Spin button effect) #define LUAh_SpinSpecial(player) LUAh_PlayerHook(player, hook_SpinSpecial) // Hook for P_DoSpinAbility (Spin button effect)
#define LUAh_JumpSpinSpecial(player) LUAh_PlayerHook(player, hook_JumpSpinSpecial) // Hook for P_DoJumpStuff (Spin button effect (mid-air)) #define LUAh_JumpSpinSpecial(player) LUAh_PlayerHook(player, hook_JumpSpinSpecial) // Hook for P_DoJumpStuff (Spin button effect (mid-air))
boolean LUAh_BotTiccmd(player_t *bot, ticcmd_t *cmd); // Hook for B_BuildTiccmd boolean LUAh_BotTiccmd(player_t *bot, ticcmd_t *cmd); // Hook for B_BuildTiccmd
boolean LUAh_BotAI(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd); // Hook for B_BuildTailsTiccmd by skin name boolean LUAh_BotAI(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd); // Hook for B_BuildTailsTiccmd by skin name

View File

@ -108,6 +108,10 @@ static int player_get(lua_State *L)
LUA_PushUserdata(L, &plr->cmd, META_TICCMD); LUA_PushUserdata(L, &plr->cmd, META_TICCMD);
else if (fastcmp(field,"playerstate")) else if (fastcmp(field,"playerstate"))
lua_pushinteger(L, plr->playerstate); lua_pushinteger(L, plr->playerstate);
else if (fastcmp(field,"camerascale"))
lua_pushfixed(L, plr->camerascale);
else if (fastcmp(field,"shieldscale"))
lua_pushfixed(L, plr->shieldscale);
else if (fastcmp(field,"viewz")) else if (fastcmp(field,"viewz"))
lua_pushfixed(L, plr->viewz); lua_pushfixed(L, plr->viewz);
else if (fastcmp(field,"viewheight")) else if (fastcmp(field,"viewheight"))
@ -142,8 +146,6 @@ static int player_get(lua_State *L)
lua_pushinteger(L, plr->score); lua_pushinteger(L, plr->score);
else if (fastcmp(field,"dashspeed")) else if (fastcmp(field,"dashspeed"))
lua_pushfixed(L, plr->dashspeed); lua_pushfixed(L, plr->dashspeed);
else if (fastcmp(field,"dashtime"))
lua_pushinteger(L, plr->dashtime);
else if (fastcmp(field,"normalspeed")) else if (fastcmp(field,"normalspeed"))
lua_pushfixed(L, plr->normalspeed); lua_pushfixed(L, plr->normalspeed);
else if (fastcmp(field,"runspeed")) else if (fastcmp(field,"runspeed"))
@ -174,6 +176,10 @@ static int player_get(lua_State *L)
lua_pushfixed(L, plr->maxdash); lua_pushfixed(L, plr->maxdash);
else if (fastcmp(field,"jumpfactor")) else if (fastcmp(field,"jumpfactor"))
lua_pushfixed(L, plr->jumpfactor); lua_pushfixed(L, plr->jumpfactor);
else if (fastcmp(field,"height"))
lua_pushfixed(L, plr->height);
else if (fastcmp(field,"spinheight"))
lua_pushfixed(L, plr->spinheight);
else if (fastcmp(field,"lives")) else if (fastcmp(field,"lives"))
lua_pushinteger(L, plr->lives); lua_pushinteger(L, plr->lives);
else if (fastcmp(field,"continues")) else if (fastcmp(field,"continues"))
@ -357,6 +363,10 @@ static int player_set(lua_State *L)
return NOSET; return NOSET;
else if (fastcmp(field,"playerstate")) else if (fastcmp(field,"playerstate"))
plr->playerstate = luaL_checkinteger(L, 3); plr->playerstate = luaL_checkinteger(L, 3);
else if (fastcmp(field,"camerascale"))
plr->camerascale = luaL_checkfixed(L, 3);
else if (fastcmp(field,"shieldscale"))
plr->shieldscale = luaL_checkfixed(L, 3);
else if (fastcmp(field,"viewz")) else if (fastcmp(field,"viewz"))
plr->viewz = luaL_checkfixed(L, 3); plr->viewz = luaL_checkfixed(L, 3);
else if (fastcmp(field,"viewheight")) else if (fastcmp(field,"viewheight"))
@ -401,8 +411,6 @@ static int player_set(lua_State *L)
plr->score = (UINT32)luaL_checkinteger(L, 3); plr->score = (UINT32)luaL_checkinteger(L, 3);
else if (fastcmp(field,"dashspeed")) else if (fastcmp(field,"dashspeed"))
plr->dashspeed = luaL_checkfixed(L, 3); plr->dashspeed = luaL_checkfixed(L, 3);
else if (fastcmp(field,"dashtime"))
plr->dashtime = (INT32)luaL_checkinteger(L, 3);
else if (fastcmp(field,"normalspeed")) else if (fastcmp(field,"normalspeed"))
plr->normalspeed = luaL_checkfixed(L, 3); plr->normalspeed = luaL_checkfixed(L, 3);
else if (fastcmp(field,"runspeed")) else if (fastcmp(field,"runspeed"))
@ -433,6 +441,10 @@ static int player_set(lua_State *L)
plr->maxdash = (INT32)luaL_checkinteger(L, 3); plr->maxdash = (INT32)luaL_checkinteger(L, 3);
else if (fastcmp(field,"jumpfactor")) else if (fastcmp(field,"jumpfactor"))
plr->jumpfactor = (INT32)luaL_checkinteger(L, 3); plr->jumpfactor = (INT32)luaL_checkinteger(L, 3);
else if (fastcmp(field,"height"))
plr->height = luaL_checkfixed(L, 3);
else if (fastcmp(field,"spinheight"))
plr->spinheight = luaL_checkfixed(L, 3);
else if (fastcmp(field,"lives")) else if (fastcmp(field,"lives"))
plr->lives = (SINT8)luaL_checkinteger(L, 3); plr->lives = (SINT8)luaL_checkinteger(L, 3);
else if (fastcmp(field,"continues")) else if (fastcmp(field,"continues"))

View File

@ -44,10 +44,18 @@ enum skin {
skin_accelstart, skin_accelstart,
skin_acceleration, skin_acceleration,
skin_jumpfactor, skin_jumpfactor,
skin_radius,
skin_height,
skin_spinheight,
skin_shieldscale,
skin_camerascale,
skin_starttranscolor, skin_starttranscolor,
skin_prefcolor, skin_prefcolor,
skin_supercolor,
skin_prefoppositecolor,
skin_highresscale, skin_highresscale,
skin_soundsid skin_soundsid,
skin_availability
}; };
static const char *const skin_opt[] = { static const char *const skin_opt[] = {
"valid", "valid",
@ -74,10 +82,18 @@ static const char *const skin_opt[] = {
"accelstart", "accelstart",
"acceleration", "acceleration",
"jumpfactor", "jumpfactor",
"radius",
"height",
"spinheight",
"shieldscale",
"camerascale",
"starttranscolor", "starttranscolor",
"prefcolor", "prefcolor",
"supercolor",
"prefoppositecolor",
"highresscale", "highresscale",
"soundsid", "soundsid",
"availability",
NULL}; NULL};
#define UNIMPLEMENTED luaL_error(L, LUA_QL("skin_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", skin_opt[field]) #define UNIMPLEMENTED luaL_error(L, LUA_QL("skin_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", skin_opt[field])
@ -173,18 +189,42 @@ static int skin_get(lua_State *L)
case skin_jumpfactor: case skin_jumpfactor:
lua_pushfixed(L, skin->jumpfactor); lua_pushfixed(L, skin->jumpfactor);
break; break;
case skin_radius:
lua_pushfixed(L, skin->radius);
break;
case skin_height:
lua_pushfixed(L, skin->height);
break;
case skin_spinheight:
lua_pushfixed(L, skin->spinheight);
break;
case skin_shieldscale:
lua_pushfixed(L, skin->shieldscale);
break;
case skin_camerascale:
lua_pushfixed(L, skin->camerascale);
break;
case skin_starttranscolor: case skin_starttranscolor:
lua_pushinteger(L, skin->starttranscolor); lua_pushinteger(L, skin->starttranscolor);
break; break;
case skin_prefcolor: case skin_prefcolor:
lua_pushinteger(L, skin->prefcolor); lua_pushinteger(L, skin->prefcolor);
break; break;
case skin_supercolor:
lua_pushinteger(L, skin->supercolor);
break;
case skin_prefoppositecolor:
lua_pushinteger(L, skin->prefoppositecolor);
break;
case skin_highresscale: case skin_highresscale:
lua_pushinteger(L, skin->highresscale); lua_pushinteger(L, skin->highresscale);
break; break;
case skin_soundsid: case skin_soundsid:
LUA_PushUserdata(L, skin->soundsid, META_SOUNDSID); LUA_PushUserdata(L, skin->soundsid, META_SOUNDSID);
break; break;
case skin_availability:
lua_pushinteger(L, skin->availability);
break;
} }
return 1; return 1;
} }

View File

@ -110,38 +110,38 @@ const char *quitmsg[NUM_QUITMESSAGES];
// Stuff for customizing the player select screen Tails 09-22-2003 // Stuff for customizing the player select screen Tails 09-22-2003
description_t description[32] = description_t description[32] =
{ {
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""}, {"???", "", "", 0, 0, 0},
{"???", "", ""} {"???", "", "", 0, 0, 0}
}; };
static char *char_notes = NULL; static char *char_notes = NULL;
static fixed_t char_scroll = 0; static fixed_t char_scroll = 0;
@ -170,6 +170,7 @@ static saveinfo_t savegameinfo[MAXSAVEGAMES]; // Extra info about the save games
INT16 startmap; // Mario, NiGHTS, or just a plain old normal game? INT16 startmap; // Mario, NiGHTS, or just a plain old normal game?
static INT16 itemOn = 1; // menu item skull is on, Hack by Tails 09-18-2002 static INT16 itemOn = 1; // menu item skull is on, Hack by Tails 09-18-2002
static boolean lastdirection = true; // toaster - Only You Can Prevent Hacks - true is for forward, false is for backwards
static INT16 skullAnimCounter = 10; // skull animation counter static INT16 skullAnimCounter = 10; // skull animation counter
static boolean setupcontrols_secondaryplayer; static boolean setupcontrols_secondaryplayer;
@ -1342,7 +1343,7 @@ static menuitem_t OP_NetgameOptionsMenu[] =
{IT_STRING | IT_CVAR, NULL, "Sudden Death", &cv_suddendeath, 90}, {IT_STRING | IT_CVAR, NULL, "Sudden Death", &cv_suddendeath, 90},
{IT_STRING | IT_CVAR, NULL, "Player respawn delay", &cv_respawntime, 98}, {IT_STRING | IT_CVAR, NULL, "Player respawn delay", &cv_respawntime, 98},
{IT_STRING | IT_CVAR, NULL, "Force Skin #", &cv_forceskin, 114}, {IT_STRING | IT_CVAR, NULL, "Force Skin", &cv_forceskin, 114},
{IT_STRING | IT_CVAR, NULL, "Restrict skin changes", &cv_restrictskinchange, 122}, {IT_STRING | IT_CVAR, NULL, "Restrict skin changes", &cv_restrictskinchange, 122},
{IT_STRING | IT_CVAR, NULL, "Autobalance Teams", &cv_autobalance, 138}, {IT_STRING | IT_CVAR, NULL, "Autobalance Teams", &cv_autobalance, 138},
@ -2036,6 +2037,7 @@ static boolean M_ChangeStringCvar(INT32 choice)
static void M_NextOpt(void) static void M_NextOpt(void)
{ {
INT16 oldItemOn = itemOn; // prevent infinite loop INT16 oldItemOn = itemOn; // prevent infinite loop
lastdirection = true;
do do
{ {
@ -2049,6 +2051,7 @@ static void M_NextOpt(void)
static void M_PrevOpt(void) static void M_PrevOpt(void)
{ {
INT16 oldItemOn = itemOn; // prevent infinite loop INT16 oldItemOn = itemOn; // prevent infinite loop
lastdirection = false;
do do
{ {
@ -3426,9 +3429,9 @@ static void M_PatchSkinNameTable(void)
for (j = 0; j < MAXSKINS; j++) for (j = 0; j < MAXSKINS; j++)
{ {
if (skins[j].name[0] != '\0') if (skins[j].name[0] != '\0' && R_SkinUnlock(j))
{ {
skins_cons_t[j].strvalue = skins[j].name; skins_cons_t[j].strvalue = skins[j].realname;
skins_cons_t[j].value = j+1; skins_cons_t[j].value = j+1;
} }
else else
@ -4773,14 +4776,63 @@ void M_ForceSaveSlotSelected(INT32 sslot)
static void M_SetupChoosePlayer(INT32 choice) static void M_SetupChoosePlayer(INT32 choice)
{ {
INT32 skinnum;
UINT8 i;
UINT8 firstvalid = 255;
UINT8 lastvalid = 0;
char *name;
(void)choice; (void)choice;
if (mapheaderinfo[startmap-1] && mapheaderinfo[startmap-1]->forcecharacter[0] != '\0') if (PlayerMenu[0].status & (IT_DYBIGSPACE)) // Correcting a hack that may be made below.
PlayerMenu[0].status = (IT_DISABLED|(PlayerMenu[0].status & IT_CENTER));
for (i = 0; i < 32; i++) // Handle charsels, availability, and unlocks.
{ {
M_ChoosePlayer(0); //oh for crying out loud just get STARTED, it doesn't matter! if (PlayerMenu[i].status != IT_DISABLED) // If the character's disabled through SOC, there's nothing we can do for it.
{
name = strtok(Z_StrDup(description[i].skinname), "&");
skinnum = R_SkinAvailable(name);
if ((skinnum != -1) && (R_SkinUnlock(skinnum)))
{
// Handling order.
if (firstvalid == 255)
firstvalid = i;
else
{
description[i].prev = lastvalid;
description[lastvalid].next = i;
}
lastvalid = i;
// Handling visibility.
if (PlayerMenu[i].status & (IT_DISABLED|IT_CENTER))
PlayerMenu[i].status = IT_CALL;
if (description[i].picname[0] == '\0')
strncpy(description[i].picname, skins[skinnum].charsel, 8);
}
else // Technically, character select icons without corresponding skins get bundled away behind this too. Sucks to be them.
PlayerMenu[i].status = (IT_DISABLED|IT_CENTER);
Z_Free(name);
}
}
if ((firstvalid != 255)
&& !(mapheaderinfo[startmap-1]
&& (mapheaderinfo[startmap-1]->forcecharacter[0] != '\0')
)
)
{ // One last bit of order we can't do in the iteration above.
description[firstvalid].prev = lastvalid;
description[lastvalid].next = firstvalid;
}
else // We're being forced into a specific character, so might as well.
{
PlayerMenu[0].status = (IT_CALL|IT_DYBIGSPACE|(PlayerMenu[0].status & IT_CENTER)); // This is a hack to make a non-IT_CALL character in slot 0 not softlock the game. IT_DYBIGSPACE is a dummy flag, whilst IT_CENTER is preserved.
M_ChoosePlayer(0);
return; return;
} }
if (Playing() == false) if (Playing() == false)
{ {
S_StopMusic(); S_StopMusic();
@ -4799,8 +4851,9 @@ static void M_DrawSetupChoosePlayerMenu(void)
{ {
const INT32 my = 24; const INT32 my = 24;
patch_t *patch; patch_t *patch;
INT32 i, o, j; INT32 i, o;
char *picname; UINT8 prev, next;
boolean loophack = false;
// Black BG // Black BG
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31);
@ -4809,91 +4862,76 @@ static void M_DrawSetupChoosePlayerMenu(void)
// Character select profile images!1 // Character select profile images!1
M_DrawTextBox(0, my, 16, 20); M_DrawTextBox(0, my, 16, 20);
if (abs(itemOn*128*FRACUNIT - char_scroll) > 256*FRACUNIT) i = (itemOn*128 - (char_scroll / FRACUNIT));
char_scroll = itemOn*128*FRACUNIT;
else if (itemOn*128*FRACUNIT - char_scroll > 128*FRACUNIT) if (!char_notes)
char_scroll += 48*FRACUNIT; {
else if (itemOn*128*FRACUNIT - char_scroll < -128*FRACUNIT) if (i) // turns out this and the preceding check is better then (abs(i) > 128)
char_scroll -= 48*FRACUNIT; {
else if (itemOn*128*FRACUNIT > char_scroll+16*FRACUNIT) o = (lastdirection) ? -1 : 1;
char_scroll += 16*FRACUNIT; char_scroll = (itemOn + o)*128*FRACUNIT;
else if (itemOn*128*FRACUNIT < char_scroll-16*FRACUNIT) i = -o*128;
char_scroll -= 16*FRACUNIT; }
char_notes = V_WordWrap(0, 21*8, V_ALLOWLOWERCASE, description[itemOn].notes);
}
if (abs(i) > 1)
char_scroll += i*FRACUNIT>>2;
else // close enough. else // close enough.
char_scroll = itemOn*128*FRACUNIT; // just be exact now. char_scroll = itemOn*128*FRACUNIT; // just be exact now.
i = (char_scroll+16*FRACUNIT)/(128*FRACUNIT);
o = ((char_scroll/FRACUNIT)+16)%128;
// prev character o = ((char_scroll / FRACUNIT) + 16);
if (i-1 >= 0 && PlayerMenu[i-1].status != IT_DISABLED
&& o < 32) if (o < 0) // This hack is to prevent visual glitches when looping from the last character to the 1st character.
loophack = true;
if (loophack)
o += 128;
i = (o / 128);
o = (o % 128);
if (loophack)
i = description[i].prev;
// Get prev character...
prev = description[i].prev;
if (prev != i) // If there's more than one character available...
{ {
picname = description[i-1].picname; // Let's get the next character now.
if (picname[0] == '\0') next = description[i].next;
// Draw prev character if it's visible and its number isn't greater than the current one or there's more than two
if (o < 32) // (prev != i) was previously a part of this, but we don't need to check again after above.
{ {
picname = strtok(Z_StrDup(description[i-1].skinname), "&"); patch = W_CachePatchName(description[prev].picname, PU_CACHE);
for (j = 0; j < numskins; j++) if (SHORT(patch->width) >= 256)
if (stricmp(skins[j].name, picname) == 0) V_DrawCroppedPatch(8<<FRACBITS, (my + 8)<<FRACBITS, FRACUNIT/2, 0, patch, 0, SHORT(patch->height) - 64 + o*2, SHORT(patch->width), SHORT(patch->height));
{ else
Z_Free(picname); V_DrawCroppedPatch(8<<FRACBITS, (my + 8)<<FRACBITS, FRACUNIT, 0, patch, 0, SHORT(patch->height) - 32 + o, SHORT(patch->width), SHORT(patch->height));
picname = skins[j].charsel; W_UnlockCachedPatch(patch);
break;
}
if (j == numskins) // AAAAAAAAAA
picname = skins[0].charsel;
} }
patch = W_CachePatchName(picname, PU_CACHE);
if (SHORT(patch->width) >= 256) // Draw next character if it's visible and its number isn't less than the current one or there's more than two
V_DrawCroppedPatch(8<<FRACBITS, (my + 8)<<FRACBITS, FRACUNIT/2, 0, patch, 0, SHORT(patch->height) - 64 + o*2, SHORT(patch->width), SHORT(patch->height)); if (o < 128) // (next != i) was previously a part of this, but it's implicitly true if (prev != i) is true.
else {
V_DrawCroppedPatch(8<<FRACBITS, (my + 8)<<FRACBITS, FRACUNIT, 0, patch, 0, SHORT(patch->height) - 32 + o, SHORT(patch->width), SHORT(patch->height)); patch = W_CachePatchName(description[next].picname, PU_CACHE);
W_UnlockCachedPatch(patch); if (SHORT(patch->width) >= 256)
V_DrawCroppedPatch(8<<FRACBITS, (my + 168 - o)<<FRACBITS, FRACUNIT/2, 0, patch, 0, 0, SHORT(patch->width), o*2);
else
V_DrawCroppedPatch(8<<FRACBITS, (my + 168 - o)<<FRACBITS, FRACUNIT, 0, patch, 0, 0, SHORT(patch->width), o);
W_UnlockCachedPatch(patch);
}
// current character
if (PlayerMenu[i].status & IT_DISABLED) // Prevent flickering.
i = (lastdirection) ? prev : next; // This actually causes duplication at slow scroll speeds (<16FU per tic), but thankfully we always go quickly.
} }
// next character if (!(PlayerMenu[i].status & IT_DISABLED))
if (i+1 < currentMenu->numitems && PlayerMenu[i+1].status != IT_DISABLED
&& o < 128)
{ {
picname = description[i+1].picname; patch = W_CachePatchName(description[i].picname, PU_CACHE);
if (picname[0] == '\0')
{
picname = strtok(Z_StrDup(description[i+1].skinname), "&");
for (j = 0; j < numskins; j++)
if (stricmp(skins[j].name, picname) == 0)
{
Z_Free(picname);
picname = skins[j].charsel;
break;
}
if (j == numskins) // AAAAAAAAAA
picname = skins[0].charsel;
}
patch = W_CachePatchName(picname, PU_CACHE);
if (SHORT(patch->width) >= 256)
V_DrawCroppedPatch(8<<FRACBITS, (my + 168 - o)<<FRACBITS, FRACUNIT/2, 0, patch, 0, 0, SHORT(patch->width), o*2);
else
V_DrawCroppedPatch(8<<FRACBITS, (my + 168 - o)<<FRACBITS, FRACUNIT, 0, patch, 0, 0, SHORT(patch->width), o);
W_UnlockCachedPatch(patch);
}
// current character
if (i < currentMenu->numitems && PlayerMenu[i].status != IT_DISABLED)
{
picname = description[i].picname;
if (picname[0] == '\0')
{
picname = strtok(Z_StrDup(description[i].skinname), "&");
for (j = 0; j < numskins; j++)
if (stricmp(skins[j].name, picname) == 0)
{
Z_Free(picname);
picname = skins[j].charsel;
break;
}
if (j == numskins) // AAAAAAAAAA
picname = skins[0].charsel;
}
patch = W_CachePatchName(picname, PU_CACHE);
if (o >= 0 && o <= 32) if (o >= 0 && o <= 32)
{ {
if (SHORT(patch->width) >= 256) if (SHORT(patch->width) >= 256)
@ -4916,8 +4954,6 @@ static void M_DrawSetupChoosePlayerMenu(void)
// Character description // Character description
M_DrawTextBox(136, my, 21, 20); M_DrawTextBox(136, my, 21, 20);
if (!char_notes)
char_notes = V_WordWrap(0, 21*8, V_ALLOWLOWERCASE, description[itemOn].notes);
V_DrawString(146, my + 9, V_RETURN8|V_ALLOWLOWERCASE, char_notes); V_DrawString(146, my + 9, V_RETURN8|V_ALLOWLOWERCASE, char_notes);
} }
@ -4928,8 +4964,8 @@ static void M_ChoosePlayer(INT32 choice)
INT32 skinnum; INT32 skinnum;
boolean ultmode = (ultimate_selectable && SP_PlayerDef.prevMenu == &SP_LoadDef && saveSlotSelected == NOSAVESLOT); boolean ultmode = (ultimate_selectable && SP_PlayerDef.prevMenu == &SP_LoadDef && saveSlotSelected == NOSAVESLOT);
// skip this if forcecharacter // skip this if forcecharacter or no characters available
if (mapheaderinfo[startmap-1] && mapheaderinfo[startmap-1]->forcecharacter[0] == '\0') if (!(PlayerMenu[choice].status & IT_DYBIGSPACE))
{ {
// M_SetupChoosePlayer didn't call us directly, that means we've been properly set up. // M_SetupChoosePlayer didn't call us directly, that means we've been properly set up.
char_scroll = itemOn*128*FRACUNIT; // finish scrolling the menu char_scroll = itemOn*128*FRACUNIT; // finish scrolling the menu
@ -6475,6 +6511,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
static void M_HandleSetupMultiPlayer(INT32 choice) static void M_HandleSetupMultiPlayer(INT32 choice)
{ {
size_t l; size_t l;
INT32 prev_setupm_fakeskin;
boolean exitmenu = false; // exit to previous menu and send name change boolean exitmenu = false; // exit to previous menu and send name change
switch (choice) switch (choice)
@ -6493,7 +6530,14 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
if (itemOn == 2) //player skin if (itemOn == 2) //player skin
{ {
S_StartSound(NULL,sfx_menu1); // Tails S_StartSound(NULL,sfx_menu1); // Tails
setupm_fakeskin--; prev_setupm_fakeskin = setupm_fakeskin;
do
{
setupm_fakeskin--;
if (setupm_fakeskin < 0)
setupm_fakeskin = numskins-1;
}
while ((prev_setupm_fakeskin != setupm_fakeskin) && !(R_SkinUnlock(setupm_fakeskin)));
} }
else if (itemOn == 1) // player color else if (itemOn == 1) // player color
{ {
@ -6506,7 +6550,14 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
if (itemOn == 2) //player skin if (itemOn == 2) //player skin
{ {
S_StartSound(NULL,sfx_menu1); // Tails S_StartSound(NULL,sfx_menu1); // Tails
setupm_fakeskin++; prev_setupm_fakeskin = setupm_fakeskin;
do
{
setupm_fakeskin++;
if (setupm_fakeskin > numskins-1)
setupm_fakeskin = 0;
}
while ((prev_setupm_fakeskin != setupm_fakeskin) && !(R_SkinUnlock(setupm_fakeskin)));
} }
else if (itemOn == 1) // player color else if (itemOn == 1) // player color
{ {
@ -6540,12 +6591,6 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
break; break;
} }
// check skin
if (setupm_fakeskin < 0)
setupm_fakeskin = numskins-1;
if (setupm_fakeskin > numskins-1)
setupm_fakeskin = 0;
// check color // check color
if (setupm_fakecolor < 1) if (setupm_fakecolor < 1)
setupm_fakecolor = MAXSKINCOLORS-1; setupm_fakecolor = MAXSKINCOLORS-1;

View File

@ -79,7 +79,7 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt);
#define IT_SUBMENU 6 // go to sub menu #define IT_SUBMENU 6 // go to sub menu
#define IT_CVAR 8 // handle as a cvar #define IT_CVAR 8 // handle as a cvar
#define IT_SPACE 10 // no handling #define IT_SPACE 10 // no handling
#define IT_MSGHANDLER 12 // same as key but with event and sometime can handle y/n key (special for message #define IT_MSGHANDLER 12 // same as key but with event and sometime can handle y/n key (special for message)
#define IT_DISPLAY (48+64+128) // 16+32+64+128 #define IT_DISPLAY (48+64+128) // 16+32+64+128
#define IT_NOTHING 0 // space #define IT_NOTHING 0 // space
@ -177,6 +177,9 @@ typedef struct
char notes[441]; char notes[441];
char picname[8]; char picname[8];
char skinname[SKINNAMESIZE*2+2]; // skin&skin\0 char skinname[SKINNAMESIZE*2+2]; // skin&skin\0
UINT16 wadnum; // for duplicate characters
UINT8 prev;
UINT8 next;
} description_t; } description_t;
// mode descriptions for video mode menu // mode descriptions for video mode menu

View File

@ -4046,6 +4046,7 @@ void A_UnsetSolidSteam(mobj_t *actor)
void A_SignPlayer(mobj_t *actor) void A_SignPlayer(mobj_t *actor)
{ {
mobj_t *ov; mobj_t *ov;
skin_t *skin;
#ifdef HAVE_BLUA #ifdef HAVE_BLUA
if (LUA_CallAction("A_SignPlayer", actor)) if (LUA_CallAction("A_SignPlayer", actor))
return; return;
@ -4056,15 +4057,35 @@ void A_SignPlayer(mobj_t *actor)
if (!actor->target->player) if (!actor->target->player)
return; return;
// Set the sign to be an appropriate background color for this player's skincolor. skin = &skins[actor->target->player->skin];
actor->color = Color_Opposite[actor->target->player->skincolor*2];
actor->frame += Color_Opposite[actor->target->player->skincolor*2+1]; if ((actor->target->player->skincolor == skin->prefcolor) && (skin->prefoppositecolor)) // Set it as the skin's preferred oppositecolor?
{
actor->color = skin->prefoppositecolor;
/*
If you're here from the comment above Color_Opposite,
the following line is the one which is dependent on the
array being symmetrical. It gets the opposite of the
opposite of your desired colour just so it can get the
brightness frame for the End Sign. It's not a great
design choice, but it's constant time array access and
the idea that the colours should be OPPOSITES is kind
of in the name. If you have a better idea, feel free
to let me know. ~toast 2016/07/20
*/
actor->frame += Color_Opposite[Color_Opposite[skin->prefoppositecolor*2]*2+1];
}
else // Set the sign to be an appropriate background color for this player's skincolor.
{
actor->color = Color_Opposite[actor->target->player->skincolor*2];
actor->frame += Color_Opposite[actor->target->player->skincolor*2+1];
}
// spawn an overlay of the player's face. // spawn an overlay of the player's face.
ov = P_SpawnMobj(actor->x, actor->y, actor->z, MT_OVERLAY); ov = P_SpawnMobj(actor->x, actor->y, actor->z, MT_OVERLAY);
P_SetTarget(&ov->target, actor); P_SetTarget(&ov->target, actor);
ov->color = actor->target->player->skincolor; ov->color = actor->target->player->skincolor;
ov->skin = &skins[actor->target->player->skin]; ov->skin = skin;
P_SetMobjState(ov, actor->info->seestate); // S_PLAY_SIGN P_SetMobjState(ov, actor->info->seestate); // S_PLAY_SIGN
} }
@ -5504,8 +5525,8 @@ void A_MixUp(mobj_t *actor)
// Zoom tube stuff // Zoom tube stuff
mobj_t *tempthing = NULL; //tracer mobj_t *tempthing = NULL; //tracer
pflags_t flags1,flags2; //player pflags UINT16 carry1,carry2; //carry
INT32 transspeed; //player speed INT32 transspeed; //player speed
// Starpost stuff // Starpost stuff
INT16 starpostx, starposty, starpostz; INT16 starpostx, starposty, starpostz;
@ -5542,8 +5563,8 @@ void A_MixUp(mobj_t *actor)
players[two].speed = transspeed; players[two].speed = transspeed;
//set flags variables now but DON'T set them. //set flags variables now but DON'T set them.
flags1 = (players[one].pflags & (PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG)); carry1 = (players[one].powers[pw_carry] == CR_PLAYER ? CR_NONE : players[one].powers[pw_carry]);
flags2 = (players[two].pflags & (PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG)); carry2 = (players[two].powers[pw_carry] == CR_PLAYER ? CR_NONE : players[two].powers[pw_carry]);
x = players[one].mo->x; x = players[one].mo->x;
y = players[one].mo->y; y = players[one].mo->y;
@ -5568,12 +5589,10 @@ void A_MixUp(mobj_t *actor)
starpostnum, starposttime, starpostangle, starpostnum, starposttime, starpostangle,
mflags2); mflags2);
//flags set after mixup. Stupid P_ResetPlayer() takes away some of the flags we look for... //carry set after mixup. Stupid P_ResetPlayer() takes away some of the stuff we look for...
//but not all of them! So we need to make sure they aren't set wrong or anything. //but not all of it! So we need to make sure they aren't set wrong or anything.
players[one].pflags &= ~(PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG); players[one].powers[pw_carry] = carry2;
players[one].pflags |= flags2; players[two].powers[pw_carry] = carry1;
players[two].pflags &= ~(PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG);
players[two].pflags |= flags1;
teleported[one] = true; teleported[one] = true;
teleported[two] = true; teleported[two] = true;
@ -5585,8 +5604,9 @@ void A_MixUp(mobj_t *actor)
INT32 pindex[MAXPLAYERS], counter = 0, teleportfrom = 0; INT32 pindex[MAXPLAYERS], counter = 0, teleportfrom = 0;
// Zoom tube stuff // Zoom tube stuff
mobj_t *transtracer[MAXPLAYERS]; //tracer mobj_t *transtracer[MAXPLAYERS]; //tracer
pflags_t transflag[MAXPLAYERS]; //player pflags //pflags_t transflag[MAXPLAYERS]; //cyan pink white pink cyan
UINT16 transcarry[MAXPLAYERS]; //player carry
INT32 transspeed[MAXPLAYERS]; //player speed INT32 transspeed[MAXPLAYERS]; //player speed
// Star post stuff // Star post stuff
@ -5620,7 +5640,7 @@ void A_MixUp(mobj_t *actor)
players[i].rmomx = players[i].rmomy = 1; players[i].rmomx = players[i].rmomy = 1;
players[i].cmomx = players[i].cmomy = 0; players[i].cmomx = players[i].cmomy = 0;
transflag[counter] = (players[i].pflags & (PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG)); transcarry[counter] = (players[i].powers[pw_carry] == CR_PLAYER ? CR_NONE : players[i].powers[pw_carry]);
transspeed[counter] = players[i].speed; transspeed[counter] = players[i].speed;
transtracer[counter] = players[i].mo->tracer; transtracer[counter] = players[i].mo->tracer;
@ -5672,9 +5692,8 @@ void A_MixUp(mobj_t *actor)
starpostnum[teleportfrom], starposttime[teleportfrom], starpostangle[teleportfrom], starpostnum[teleportfrom], starposttime[teleportfrom], starpostangle[teleportfrom],
flags2[teleportfrom]); flags2[teleportfrom]);
//...flags after. same reasoning. //...carry after. same reasoning.
players[i].pflags &= ~(PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG); players[i].powers[pw_carry] = transcarry[teleportfrom];
players[i].pflags |= transflag[teleportfrom];
teleported[i] = true; teleported[i] = true;
counter++; counter++;
@ -6241,7 +6260,7 @@ void A_Boss7Chase(mobj_t *actor)
if (actor->health <= actor->info->damage if (actor->health <= actor->info->damage
&& actor->target && actor->target
&& actor->target->player && actor->target->player
&& (actor->target->player->pflags & PF_ITEMHANG)) && (actor->target->player->powers[pw_carry] == CR_GENERIC))
{ {
A_FaceTarget(actor); A_FaceTarget(actor);
P_SetMobjState(actor, S_BLACKEGG_SHOOT1); P_SetMobjState(actor, S_BLACKEGG_SHOOT1);
@ -8115,7 +8134,7 @@ void A_OrbitNights(mobj_t* actor)
#endif #endif
if (!actor->target || !actor->target->player || if (!actor->target || !actor->target->player ||
!actor->target->tracer || !actor->target->player->nightstime !(actor->target->player->pflags & PF_NIGHTSMODE) || !actor->target->player->nightstime
// Also remove this object if they no longer have a NiGHTS helper // Also remove this object if they no longer have a NiGHTS helper
|| (ishelper && !actor->target->player->powers[pw_nights_helper])) || (ishelper && !actor->target->player->powers[pw_nights_helper]))
{ {
@ -8134,14 +8153,23 @@ void A_OrbitNights(mobj_t* actor)
const fixed_t fh = FixedMul(FINECOSINE(ofa),FixedMul(20*FRACUNIT, actor->scale)); const fixed_t fh = FixedMul(FINECOSINE(ofa),FixedMul(20*FRACUNIT, actor->scale));
const fixed_t fs = FixedMul(FINESINE(fa),FixedMul(32*FRACUNIT, actor->scale)); const fixed_t fs = FixedMul(FINESINE(fa),FixedMul(32*FRACUNIT, actor->scale));
actor->x = actor->target->tracer->x + fc; actor->x = actor->target->x + fc;
actor->y = actor->target->tracer->y + fs; actor->y = actor->target->y + fs;
actor->z = actor->target->tracer->z + fh + FixedMul(16*FRACUNIT, actor->scale); actor->z = actor->target->z + fh + FixedMul(16*FRACUNIT, actor->scale);
// Semi-lazy hack // Semi-lazy hack
actor->angle = (angle_t)actor->extravalue1 + ANGLE_90; actor->angle = (angle_t)actor->extravalue1 + ANGLE_90;
} }
P_SetThingPosition(actor); P_SetThingPosition(actor);
if (ishelper) // Flash a helper that's about to be removed.
{
if ((actor->target->player->powers[pw_nights_helper] < TICRATE)
&& (actor->target->player->powers[pw_nights_helper] & 1))
actor->flags2 |= MF2_DONTDRAW;
else
actor->flags2 &= ~MF2_DONTDRAW;
}
} }
} }

View File

@ -300,7 +300,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
} }
if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING)) if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|| (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING)) || ((player->pflags & PF_JUMPED) && !(player->charflags & SF_NOJUMPDAMAGE && !(player->charability == CA_TWINSPIN && player->panim == PA_ABILITY)))
|| (player->pflags & (PF_SPINNING|PF_GLIDING))
|| (player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2)
|| ((player->charflags & SF_STOMPDAMAGE) && (P_MobjFlip(toucher)*(toucher->z - (special->z + special->height/2)) > 0) && (P_MobjFlip(toucher)*toucher->momz < 0))
|| player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object? || player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object?
{ {
if (P_MobjFlip(toucher)*toucher->momz < 0) if (P_MobjFlip(toucher)*toucher->momz < 0)
@ -343,7 +346,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
P_DamageMobj(toucher, special, special, 1, 0); P_DamageMobj(toucher, special, special, 1, 0);
} }
else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING)) else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|| (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING)) || ((player->pflags & PF_JUMPED) && !(player->charflags & SF_NOJUMPDAMAGE && !(player->charability == CA_TWINSPIN && player->panim == PA_ABILITY)))
|| (player->pflags & (PF_SPINNING|PF_GLIDING))
|| (player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2)
|| ((player->charflags & SF_STOMPDAMAGE) && (P_MobjFlip(toucher)*(toucher->z - (special->z + special->height/2)) > 0) && (P_MobjFlip(toucher)*toucher->momz < 0))
|| player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object? || player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object?
{ {
if (P_MobjFlip(toucher)*toucher->momz < 0) if (P_MobjFlip(toucher)*toucher->momz < 0)
@ -646,16 +652,16 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
if (G_IsSpecialStage(gamemap)) //After-mare bonus time/emerald reward in special stages. if (G_IsSpecialStage(gamemap)) //After-mare bonus time/emerald reward in special stages.
{ {
// only allow the player with the emerald in-hand to leave. // only allow the player with the emerald in-hand to leave.
if (toucher->tracer && toucher->tracer->target if (toucher->tracer
&& toucher->tracer->target->type == MT_GOTEMERALD) && toucher->tracer->type == MT_GOTEMERALD)
{ {
} }
else // Make sure that SOMEONE has the emerald, at least! else // Make sure that SOMEONE has the emerald, at least!
{ {
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
if (playeringame[i] && players[i].playerstate == PST_LIVE if (playeringame[i] && players[i].playerstate == PST_LIVE
&& players[i].mo->tracer && players[i].mo->tracer->target && players[i].mo->tracer
&& players[i].mo->tracer->target->type == MT_GOTEMERALD) && players[i].mo->tracer->type == MT_GOTEMERALD)
return; return;
// Well no one has an emerald, so exit anyway! // Well no one has an emerald, so exit anyway!
} }
@ -1243,10 +1249,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
player->powers[pw_ingoop] = 2; player->powers[pw_ingoop] = 2;
if (player->pflags & PF_ITEMHANG) if (player->powers[pw_carry] == CR_GENERIC)
{ {
P_SetTarget(&toucher->tracer, NULL); P_SetTarget(&toucher->tracer, NULL);
player->pflags &= ~PF_ITEMHANG; player->powers[pw_carry] = CR_NONE;
} }
P_ResetPlayer(player); P_ResetPlayer(player);
@ -1298,7 +1304,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
S_StartSound(toucher, special->info->painsound); S_StartSound(toucher, special->info->painsound);
return; return;
} }
else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING)) || (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING)) else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING))
|| ((player->pflags & PF_JUMPED) && !(player->charflags & SF_NOJUMPDAMAGE))
|| ((player->charflags & SF_STOMPDAMAGE) && (P_MobjFlip(toucher)*(toucher->z - (special->z + special->height/2)) > 0) && (P_MobjFlip(toucher)*toucher->momz < 0))
|| (player->pflags & (PF_SPINNING|PF_GLIDING))
|| player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object? || player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object?
{ {
// Shatter the shield! // Shatter the shield!
@ -1328,7 +1337,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
case MT_BIGMACECHAIN: case MT_BIGMACECHAIN:
// Is this the last link in the chain? // Is this the last link in the chain?
if (toucher->momz > 0 || !(special->flags & MF_AMBUSH) if (toucher->momz > 0 || !(special->flags & MF_AMBUSH)
|| (player->pflags & PF_ITEMHANG) || (player->pflags & PF_MACESPIN)) || (player->powers[pw_carry]))
return; return;
if (toucher->z > special->z + special->height/2) if (toucher->z > special->z + special->height/2)
@ -1345,12 +1354,12 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
if (special->target && (special->target->type == MT_SPINMACEPOINT || special->target->type == MT_HIDDEN_SLING)) if (special->target && (special->target->type == MT_SPINMACEPOINT || special->target->type == MT_HIDDEN_SLING))
{ {
player->pflags |= PF_MACESPIN; player->powers[pw_carry] = CR_MACESPIN;
S_StartSound(toucher, sfx_spin); S_StartSound(toucher, sfx_spin);
P_SetPlayerMobjState(toucher, S_PLAY_SPIN); P_SetPlayerMobjState(toucher, S_PLAY_SPIN);
} }
else else
player->pflags |= PF_ITEMHANG; player->powers[pw_carry] = CR_GENERIC;
// Can't jump first frame // Can't jump first frame
player->pflags |= PF_JUMPSTASIS; player->pflags |= PF_JUMPSTASIS;
@ -2253,7 +2262,11 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
target->momx = target->momy = target->momz = 0; target->momx = target->momy = target->momz = 0;
if (damagetype == DMG_DROWNED) // drowned if (damagetype == DMG_DROWNED) // drowned
{ {
S_StartSound(target, sfx_drown); target->movedir = damagetype; // we're MOVING the Damage Into anotheR function... Okay, this is a bit of a hack.
if (target->player->charflags & SF_MACHINE)
S_StartSound(target, sfx_fizzle);
else
S_StartSound(target, sfx_drown);
// Don't jump up when drowning // Don't jump up when drowning
} }
else else
@ -2473,7 +2486,7 @@ static inline void P_NiGHTSDamage(mobj_t *target, mobj_t *source)
} }
player->powers[pw_flashing] = flashingtics; player->powers[pw_flashing] = flashingtics;
P_SetMobjState(target->tracer, S_NIGHTSHURT1); P_SetPlayerMobjState(target, S_PLAY_NIGHTS_PAIN);
S_StartSound(target, sfx_nghurt); S_StartSound(target, sfx_nghurt);
if (oldnightstime > 10*TICRATE if (oldnightstime > 10*TICRATE
@ -2609,7 +2622,9 @@ static inline boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj
static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage) static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage)
{ {
player->pflags &= ~(PF_CARRIED|PF_SLIDING|PF_ITEMHANG|PF_MACESPIN|PF_ROPEHANG|PF_NIGHTSMODE); player->pflags &= ~(PF_SLIDING|PF_NIGHTSMODE);
player->powers[pw_carry] = CR_NONE;
// Burst weapons and emeralds in Match/CTF only // Burst weapons and emeralds in Match/CTF only
if (source && (gametype == GT_MATCH || gametype == GT_TEAMMATCH || gametype == GT_CTF)) if (source && (gametype == GT_MATCH || gametype == GT_TEAMMATCH || gametype == GT_CTF))

View File

@ -62,6 +62,9 @@
#define mariomode (maptol & TOL_MARIO) #define mariomode (maptol & TOL_MARIO)
#define twodlevel (maptol & TOL_2D) #define twodlevel (maptol & TOL_2D)
#define P_GetPlayerHeight(player) FixedMul(player->height, player->mo->scale)
#define P_GetPlayerSpinHeight(player) FixedMul(player->spinheight, player->mo->scale)
// //
// P_TICK // P_TICK
// //
@ -119,8 +122,6 @@ extern consvar_t cv_cam2_speed, cv_cam2_rotate, cv_cam2_rotspeed;
extern fixed_t t_cam_dist, t_cam_height, t_cam_rotate; extern fixed_t t_cam_dist, t_cam_height, t_cam_rotate;
extern fixed_t t_cam2_dist, t_cam2_height, t_cam2_rotate; extern fixed_t t_cam2_dist, t_cam2_height, t_cam2_rotate;
fixed_t P_GetPlayerHeight(player_t *player);
fixed_t P_GetPlayerSpinHeight(player_t *player);
INT32 P_GetPlayerControlDirection(player_t *player); INT32 P_GetPlayerControlDirection(player_t *player);
void P_AddPlayerScore(player_t *player, UINT32 amount); void P_AddPlayerScore(player_t *player, UINT32 amount);
void P_ResetCamera(player_t *player, camera_t *thiscam); void P_ResetCamera(player_t *player, camera_t *thiscam);

View File

@ -211,7 +211,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
P_SetPlayerMobjState(object, S_PLAY_FALL); P_SetPlayerMobjState(object, S_PLAY_FALL);
else // horizontal spring else // horizontal spring
{ {
if (pflags & (PF_JUMPED|PF_SPINNING) && object->player->panim == PA_ROLL) if (pflags & (PF_JUMPED|PF_SPINNING) && (object->player->panim == PA_ROLL || object->player->panim == PA_JUMP || object->player->panim == PA_FALL))
object->player->pflags = pflags; object->player->pflags = pflags;
else else
P_SetPlayerMobjState(object, S_PLAY_WALK); P_SetPlayerMobjState(object, S_PLAY_WALK);
@ -302,12 +302,17 @@ static void P_DoTailsCarry(player_t *sonic, player_t *tails)
INT32 p; INT32 p;
fixed_t zdist; // z distance between the two players' bottoms fixed_t zdist; // z distance between the two players' bottoms
if ((tails->pflags & PF_CARRIED) && tails->mo->tracer == sonic->mo) if (tails->powers[pw_carry])
return; return;
if ((sonic->pflags & PF_CARRIED) && sonic->mo->tracer == tails->mo) if (sonic->powers[pw_carry])
return; return;
if (!tails->powers[pw_tailsfly] && !(tails->charability == CA_FLY && tails->mo->state-states == S_PLAY_FLY_TIRED)) if (tails->spectator)
return;
if (sonic->spectator)
return;
if (!(tails->pflags & PF_CANCARRY))
return; return;
if (tails->bot == 1) if (tails->bot == 1)
@ -316,10 +321,6 @@ static void P_DoTailsCarry(player_t *sonic, player_t *tails)
if (sonic->pflags & PF_NIGHTSMODE) if (sonic->pflags & PF_NIGHTSMODE)
return; return;
if (sonic->mo->tracer && sonic->mo->tracer->type == MT_TUBEWAYPOINT
&& !(sonic->pflags & PF_ROPEHANG))
return; // don't steal players from zoomtubes!
if ((sonic->mo->eflags & MFE_VERTICALFLIP) != (tails->mo->eflags & MFE_VERTICALFLIP)) if ((sonic->mo->eflags & MFE_VERTICALFLIP) != (tails->mo->eflags & MFE_VERTICALFLIP))
return; // Both should be in same gravity return; // Both should be in same gravity
@ -334,47 +335,43 @@ static void P_DoTailsCarry(player_t *sonic, player_t *tails)
// Search in case another player is already being carried by this fox. // Search in case another player is already being carried by this fox.
for (p = 0; p < MAXPLAYERS; p++) for (p = 0; p < MAXPLAYERS; p++)
if (playeringame[p] && players[p].mo if (playeringame[p] && players[p].mo
&& players[p].pflags & PF_CARRIED && players[p].mo->tracer == tails->mo) && players[p].powers[pw_carry] == CR_PLAYER && players[p].mo->tracer == tails->mo)
return; return;
// Why block opposing teams from tailsflying each other?
// Sneaking into the hands of a flying tails player in Race might be a viable strategy, who knows.
/*
if (gametype == GT_RACE || gametype == GT_COMPETITION
|| (netgame && (tails->spectator || sonic->spectator))
|| (G_TagGametype() && (!(tails->pflags & PF_TAGIT) != !(sonic->pflags & PF_TAGIT)))
|| (gametype == GT_MATCH)
|| (G_GametypeHasTeams() && tails->ctfteam != sonic->ctfteam))
return; */
if (tails->mo->eflags & MFE_VERTICALFLIP) if (tails->mo->eflags & MFE_VERTICALFLIP)
zdist = (sonic->mo->z + sonic->mo->height) - (tails->mo->z + tails->mo->height); zdist = (sonic->mo->z + sonic->mo->height) - (tails->mo->z + tails->mo->height);
else else
zdist = tails->mo->z - sonic->mo->z; zdist = tails->mo->z - sonic->mo->z;
if (zdist <= sonic->mo->height + FixedMul(FRACUNIT, sonic->mo->scale) if (zdist <= sonic->mo->height + sonic->mo->scale // FixedMul(FRACUNIT, sonic->mo->scale), but scale == FRACUNIT by default
&& zdist > sonic->mo->height*2/3 && zdist > sonic->mo->height*2/3
&& P_MobjFlip(tails->mo)*sonic->mo->momz <= 0) && P_MobjFlip(tails->mo)*sonic->mo->momz <= 0)
{ {
// Why block opposing teams from tailsflying each other? if (sonic-players == consoleplayer && botingame)
// Sneaking into the hands of a flying tails player in Race might be a viable strategy, who knows. CV_SetValue(&cv_analog2, false);
/* P_ResetPlayer(sonic);
if (gametype == GT_RACE || gametype == GT_COMPETITION P_SetTarget(&sonic->mo->tracer, tails->mo);
|| (netgame && (tails->spectator || sonic->spectator)) sonic->powers[pw_carry] = CR_PLAYER;
|| (G_TagGametype() && (!(tails->pflags & PF_TAGIT) != !(sonic->pflags & PF_TAGIT))) S_StartSound(sonic->mo, sfx_s3k4a);
|| (gametype == GT_MATCH) P_UnsetThingPosition(sonic->mo);
|| (G_GametypeHasTeams() && tails->ctfteam != sonic->ctfteam)) sonic->mo->x = tails->mo->x;
sonic->pflags &= ~PF_CARRIED; */ sonic->mo->y = tails->mo->y;
if (tails->spectator || sonic->spectator) P_SetThingPosition(sonic->mo);
sonic->pflags &= ~PF_CARRIED;
else
{
if (sonic-players == consoleplayer && botingame)
CV_SetValue(&cv_analog2, false);
P_ResetPlayer(sonic);
P_SetTarget(&sonic->mo->tracer, tails->mo);
sonic->pflags |= PF_CARRIED;
S_StartSound(sonic->mo, sfx_s3k4a);
P_UnsetThingPosition(sonic->mo);
sonic->mo->x = tails->mo->x;
sonic->mo->y = tails->mo->y;
P_SetThingPosition(sonic->mo);
}
} }
else { else {
if (sonic-players == consoleplayer && botingame) if (sonic-players == consoleplayer && botingame)
CV_SetValue(&cv_analog2, true); CV_SetValue(&cv_analog2, true);
sonic->pflags &= ~PF_CARRIED; sonic->powers[pw_carry] = CR_NONE;
} }
} }
@ -443,7 +440,8 @@ static boolean PIT_CheckThing(mobj_t *thing)
return true; // underneath return true; // underneath
if (thing->type == MT_SPIKE) if (thing->type == MT_SPIKE)
{ {
S_StartSound(tmthing, thing->info->deathsound); if (thing->flags & MF_SOLID)
S_StartSound(tmthing, thing->info->deathsound);
for (thing = thing->subsector->sector->thinglist; thing; thing = thing->snext) for (thing = thing->subsector->sector->thinglist; thing; thing = thing->snext)
if (thing->type == MT_SPIKE && thing->health > 0 && thing->flags & MF_SOLID && P_AproxDistance(thing->x - tmthing->x, thing->y - tmthing->y) < FixedMul(56*FRACUNIT, thing->scale)) if (thing->type == MT_SPIKE && thing->health > 0 && thing->flags & MF_SOLID && P_AproxDistance(thing->x - tmthing->x, thing->y - tmthing->y) < FixedMul(56*FRACUNIT, thing->scale))
P_KillMobj(thing, tmthing, tmthing, 0); P_KillMobj(thing, tmthing, tmthing, 0);
@ -456,9 +454,13 @@ static boolean PIT_CheckThing(mobj_t *thing)
return true; return true;
} }
// Dashmode users destroy spikes and monitors. // CA_DASHMODE users destroy spikes and monitors, CA_TWINSPIN users and CA2_MELEE users destroy spikes.
if ((tmthing->player) && (tmthing->player->charability == CA_DASHMODE) && (tmthing->player->dashmode >= 3*TICRATE) if ((tmthing->player)
&& (thing->flags & (MF_MONITOR) || thing->type == MT_SPIKE)) && (((tmthing->player->charability == CA_DASHMODE) && (tmthing->player->dashmode >= 3*TICRATE)
&& (thing->flags & (MF_MONITOR) || thing->type == MT_SPIKE))
|| ((((tmthing->player->charability == CA_TWINSPIN) && (tmthing->player->panim == PA_ABILITY))
|| (tmthing->player->charability2 == CA2_MELEE && tmthing->player->panim == PA_ABILITY2))
&& (thing->type == MT_SPIKE))))
{ {
if ((thing->flags & (MF_MONITOR)) && (thing->health <= 0 || !(thing->flags & MF_SHOOTABLE))) if ((thing->flags & (MF_MONITOR)) && (thing->health <= 0 || !(thing->flags & MF_SHOOTABLE)))
return true; return true;
@ -472,7 +474,8 @@ static boolean PIT_CheckThing(mobj_t *thing)
return true; // underneath return true; // underneath
if (thing->type == MT_SPIKE) if (thing->type == MT_SPIKE)
{ {
S_StartSound(tmthing, thing->info->deathsound); if (thing->flags & MF_SOLID)
S_StartSound(tmthing, thing->info->deathsound);
for (thing = thing->subsector->sector->thinglist; thing; thing = thing->snext) for (thing = thing->subsector->sector->thinglist; thing; thing = thing->snext)
if (thing->type == MT_SPIKE && thing->health > 0 && thing->flags & MF_SOLID && P_AproxDistance(thing->x - tmthing->x, thing->y - tmthing->y) < FixedMul(56*FRACUNIT, thing->scale)) if (thing->type == MT_SPIKE && thing->health > 0 && thing->flags & MF_SOLID && P_AproxDistance(thing->x - tmthing->x, thing->y - tmthing->y) < FixedMul(56*FRACUNIT, thing->scale))
P_KillMobj(thing, tmthing, tmthing, 0); P_KillMobj(thing, tmthing, tmthing, 0);
@ -660,7 +663,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (tmthing->flags & MF_MISSILE && thing->player && tmthing->target && tmthing->target->player if (tmthing->flags & MF_MISSILE && thing->player && tmthing->target && tmthing->target->player
&& thing->player->ctfteam == tmthing->target->player->ctfteam && thing->player->ctfteam == tmthing->target->player->ctfteam
&& thing->player->pflags & PF_CARRIED && thing->tracer == tmthing->target) && thing->player->powers[pw_carry] == CR_PLAYER && thing->tracer == tmthing->target)
return true; // Don't give rings to your carry player by accident. return true; // Don't give rings to your carry player by accident.
if (thing->type == MT_EGGSHIELD) if (thing->type == MT_EGGSHIELD)
@ -703,7 +706,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
&& tmthing->target != thing) && tmthing->target != thing)
{ {
// Hop on the missile for a ride! // Hop on the missile for a ride!
thing->player->pflags |= PF_ITEMHANG; thing->player->powers[pw_carry] = CR_GENERIC;
thing->player->pflags &= ~PF_JUMPED; thing->player->pflags &= ~PF_JUMPED;
P_SetTarget(&thing->tracer, tmthing); P_SetTarget(&thing->tracer, tmthing);
P_SetTarget(&tmthing->target, thing); // Set owner to the player P_SetTarget(&tmthing->target, thing); // Set owner to the player
@ -722,7 +725,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
return true; return true;
} }
else if (tmthing->type == MT_BLACKEGGMAN_MISSILE && thing->player && ((thing->player->pflags & PF_ITEMHANG) || (thing->player->pflags & PF_JUMPED))) else if (tmthing->type == MT_BLACKEGGMAN_MISSILE && thing->player && ((thing->player->powers[pw_carry] == CR_GENERIC) || (thing->player->pflags & PF_JUMPED)))
{ {
// Ignore // Ignore
} }
@ -923,7 +926,8 @@ static boolean PIT_CheckThing(mobj_t *thing)
else if (thing->player) { else if (thing->player) {
if (thing->player-players == consoleplayer && botingame) if (thing->player-players == consoleplayer && botingame)
CV_SetValue(&cv_analog2, true); CV_SetValue(&cv_analog2, true);
thing->player->pflags &= ~PF_CARRIED; if (thing->player->powers[pw_carry] == CR_PLAYER)
thing->player->powers[pw_carry] = CR_NONE;
} }
if (thing->player) if (thing->player)
@ -975,7 +979,13 @@ static boolean PIT_CheckThing(mobj_t *thing)
&& thing->z + thing->height + FixedMul(FRACUNIT, thing->scale) >= tmthing->z) && thing->z + thing->height + FixedMul(FRACUNIT, thing->scale) >= tmthing->z)
{ {
if (thing->flags & MF_MONITOR if (thing->flags & MF_MONITOR
&& tmthing->player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING)) && (tmthing->player->pflags & (PF_SPINNING|PF_GLIDING)
|| ((tmthing->player->pflags & PF_JUMPED)
&& !(tmthing->player->charflags & SF_NOJUMPDAMAGE
&& !(tmthing->player->charability == CA_TWINSPIN && tmthing->player->panim == PA_ABILITY)))
|| (tmthing->player->charability2 == CA2_MELEE && tmthing->player->panim == PA_ABILITY2)
|| ((tmthing->player->charflags & SF_STOMPDAMAGE)
&& (P_MobjFlip(tmthing)*(tmthing->z - (thing->z + thing->height/2)) > 0) && (P_MobjFlip(tmthing)*tmthing->momz < 0))))
{ {
SINT8 flipval = P_MobjFlip(thing); // Save this value in case monitor gets removed. 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 *momz = &tmthing->momz; // tmthing gets changed by P_DamageMobj, so we need a new pointer?! X_x;;
@ -997,7 +1007,14 @@ static boolean PIT_CheckThing(mobj_t *thing)
} }
// Monitors are not treated as solid to players who are jumping, spinning or gliding, // Monitors are not treated as solid to players who are jumping, spinning or gliding,
// unless it's a CTF team monitor and you're on the wrong team // unless it's a CTF team monitor and you're on the wrong team
else if (thing->flags & MF_MONITOR && tmthing->player && tmthing->player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING) else if (thing->flags & MF_MONITOR && tmthing->player
&& (tmthing->player->pflags & (PF_SPINNING|PF_GLIDING)
|| ((tmthing->player->pflags & PF_JUMPED)
&& !(tmthing->player->charflags & SF_NOJUMPDAMAGE
&& !(tmthing->player->charability == CA_TWINSPIN && tmthing->player->panim == PA_ABILITY)))
|| (tmthing->player->charability2 == CA2_MELEE && tmthing->player->panim == PA_ABILITY2)
|| ((tmthing->player->charflags & SF_STOMPDAMAGE)
&& (P_MobjFlip(tmthing)*(tmthing->z - (thing->z + thing->height/2)) > 0) && (P_MobjFlip(tmthing)*tmthing->momz < 0)))
&& !((thing->type == MT_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)))
; ;
// z checking at last // z checking at last

View File

@ -163,6 +163,16 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
I_Error("P_SetPlayerMobjState used for non-player mobj. Use P_SetMobjState instead!\n(Mobj type: %d, State: %d)", mobj->type, state); I_Error("P_SetPlayerMobjState used for non-player mobj. Use P_SetMobjState instead!\n(Mobj type: %d, State: %d)", mobj->type, state);
#endif #endif
// Catch falling for nojumpspin
if ((state == S_PLAY_JUMP) && (player->charflags & SF_NOJUMPSPIN) && (P_MobjFlip(mobj)*mobj->momz < 0))
return P_SetPlayerMobjState(mobj, S_PLAY_FALL);
// Catch swimming versus flying
if (state == S_PLAY_FLY && player->mo->eflags & MFE_UNDERWATER)
return P_SetPlayerMobjState(player->mo, S_PLAY_SWIM);
else if (state == S_PLAY_SWIM && !(player->mo->eflags & MFE_UNDERWATER))
return P_SetPlayerMobjState(player->mo, S_PLAY_FLY);
// Catch state changes for Super Sonic // Catch state changes for Super Sonic
if (player->powers[pw_super] && (player->charflags & SF_SUPERANIMS)) if (player->powers[pw_super] && (player->charflags & SF_SUPERANIMS))
{ {
@ -243,12 +253,14 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
player->panim = PA_PAIN; player->panim = PA_PAIN;
break; break;
case S_PLAY_SPIN: case S_PLAY_SPIN:
case S_PLAY_DASH: //case S_PLAY_DASH: -- everyone can ROLL thanks to zoom tubes...
case S_PLAY_JUMP:
case S_PLAY_SUPER_SPIN: case S_PLAY_SUPER_SPIN:
case S_PLAY_SUPER_JUMP:
player->panim = PA_ROLL; player->panim = PA_ROLL;
break; break;
case S_PLAY_JUMP:
case S_PLAY_SUPER_JUMP:
player->panim = PA_JUMP;
break;
case S_PLAY_SPRING: case S_PLAY_SPRING:
case S_PLAY_SUPER_SPRING: case S_PLAY_SUPER_SPRING:
player->panim = PA_SPRING; player->panim = PA_SPRING;
@ -258,9 +270,16 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
player->panim = PA_FALL; player->panim = PA_FALL;
break; break;
case S_PLAY_FLY: case S_PLAY_FLY:
case S_PLAY_SWIM:
case S_PLAY_GLIDE: case S_PLAY_GLIDE:
case S_PLAY_TWINSPIN:
player->panim = PA_ABILITY; player->panim = PA_ABILITY;
break; break;
case S_PLAY_DASH: // ...but the act of SPINDASHING is charability2 specific.
case S_PLAY_MELEE:
case S_PLAY_MELEE_FINISH:
player->panim = PA_ABILITY2;
break;
case S_PLAY_RIDE: case S_PLAY_RIDE:
case S_PLAY_SUPER_RIDE: case S_PLAY_SUPER_RIDE:
player->panim = PA_RIDE; player->panim = PA_RIDE;
@ -291,15 +310,8 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
// Adjust the player's animation speed to match their velocity. // Adjust the player's animation speed to match their velocity.
if (!(disableSpeedAdjust || player->charflags & SF_NOSPEEDADJUST)) if (!(disableSpeedAdjust || player->charflags & SF_NOSPEEDADJUST))
{ {
fixed_t speed = FixedDiv(player->speed, mobj->scale); fixed_t speed;// = FixedDiv(player->speed, mobj->scale);
if (player->panim == PA_ROLL) if (player->panim == PA_FALL)
{
if (speed > 16<<FRACBITS)
mobj->tics = 1;
else
mobj->tics = 2;
}
else if (player->panim == PA_FALL)
{ {
speed = FixedDiv(abs(mobj->momz), mobj->scale); speed = FixedDiv(abs(mobj->momz), mobj->scale);
if (speed < 10<<FRACBITS) if (speed < 10<<FRACBITS)
@ -311,36 +323,61 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
else else
mobj->tics = 1; mobj->tics = 1;
} }
else if (P_IsObjectOnGround(mobj) || player->powers[pw_super]) // Only if on the ground or superflying. else if (player->panim == PA_ABILITY2 && player->charability2 == CA2_SPINDASH)
{ {
if (player->panim == PA_WALK) fixed_t step = (player->maxdash - player->mindash)/4;
speed = (player->dashspeed - player->mindash);
if (speed > 3*step)
mobj->tics = 1;
else if (speed > step)
mobj->tics = 2;
else
mobj->tics = 3;
}
else
{
speed = FixedDiv(player->speed, mobj->scale);
if (player->panim == PA_ROLL || player->panim == PA_JUMP)
{ {
if (speed > 12<<FRACBITS) if (speed > 16<<FRACBITS)
mobj->tics = 2;
else if (speed > 6<<FRACBITS)
mobj->tics = 3;
else
mobj->tics = 4;
}
else if ((player->panim == PA_RUN) || (player->panim == PA_PEEL))
{
if (speed > 52<<FRACBITS)
mobj->tics = 1; mobj->tics = 1;
else else
mobj->tics = 2; mobj->tics = 2;
} }
else if (P_IsObjectOnGround(mobj) || player->powers[pw_super]) // Only if on the ground or superflying.
{
if (player->panim == PA_WALK)
{
if (speed > 12<<FRACBITS)
mobj->tics = 2;
else if (speed > 6<<FRACBITS)
mobj->tics = 3;
else
mobj->tics = 4;
}
else if ((player->panim == PA_RUN) || (player->panim == PA_PEEL))
{
if (speed > 52<<FRACBITS)
mobj->tics = 1;
else
mobj->tics = 2;
}
}
} }
} }
mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set
// Player animations // Player animations
if (st->sprite == SPR_PLAY) if (st->sprite == SPR_PLAY)
{ {
skin_t *skin = ((skin_t *)mobj->skin);
boolean noalt = false; boolean noalt = false;
UINT8 spr2 = st->frame & FF_FRAMEMASK; UINT8 spr2 = st->frame & FF_FRAMEMASK;
UINT16 frame = (mobj->frame & FF_FRAMEMASK)+1; UINT16 frame = (mobj->frame & FF_FRAMEMASK)+1;
mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set UINT8 numframes;
while (((skin_t *)mobj->skin)->sprites[spr2].numframes <= 0 while (skin && ((numframes = skin->sprites[spr2].numframes) <= 0)
&& spr2 != SPR2_STND) && spr2 != SPR2_STND)
{ {
switch(spr2) switch(spr2)
@ -361,7 +398,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
spr2 = SPR2_SPNG; spr2 = SPR2_SPNG;
break; break;
case SPR2_JUMP: case SPR2_JUMP:
spr2 = SPR2_SPIN; spr2 = (player->charflags & SF_NOJUMPSPIN) ? SPR2_SPNG : SPR2_SPIN;
break; break;
case SPR2_SPNG: // spring case SPR2_SPNG: // spring
spr2 = SPR2_FALL; spr2 = SPR2_FALL;
@ -376,23 +413,29 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
case SPR2_FLY: case SPR2_FLY:
spr2 = SPR2_SPNG; spr2 = SPR2_SPNG;
break; break;
case SPR2_TIRE: case SPR2_SWIM:
spr2 = SPR2_FLY; spr2 = SPR2_FLY;
break; break;
case SPR2_TIRE:
spr2 = (player->charability == CA_FLY) ? SPR2_FLY : SPR2_SWIM;
break;
case SPR2_GLID: case SPR2_GLID:
spr2 = SPR2_FLY; spr2 = SPR2_FLY;
break; break;
case SPR2_CLMB: case SPR2_CLMB:
spr2 = SPR2_WALK; spr2 = SPR2_SPIN;
break; break;
case SPR2_CLNG: case SPR2_CLNG:
spr2 = SPR2_CLMB; spr2 = SPR2_CLMB;
break; break;
case SPR2_SIGN: case SPR2_TWIN:
case SPR2_LIFE: spr2 = SPR2_SPIN;
noalt = true; break;
case SPR2_MLEE:
spr2 = SPR2_TWIN;
break; break;
// Super sprites fallback to regular sprites // Super sprites fallback to regular sprites
@ -408,7 +451,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
case SPR2_SPAN: case SPR2_SPAN:
spr2 = SPR2_PAIN; spr2 = SPR2_PAIN;
break; break;
case SPR2_SMSL: case SPR2_SSTN:
spr2 = SPR2_SPAN; spr2 = SPR2_SPAN;
break; break;
case SPR2_SDTH: case SPR2_SDTH:
@ -424,7 +467,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
spr2 = SPR2_GASP; spr2 = SPR2_GASP;
break; break;
case SPR2_SJMP: case SPR2_SJMP:
spr2 = SPR2_JUMP; spr2 = (player->charflags & SF_NOJUMPSPIN) ? SPR2_SSPG : SPR2_SSPN;
break; break;
case SPR2_SSPG: case SPR2_SSPG:
spr2 = SPR2_SPNG; spr2 = SPR2_SPNG;
@ -442,6 +485,87 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
spr2 = SPR2_SWLK; spr2 = SPR2_SWLK;
break; break;
// NiGHTS sprites.
case SPR2_NTRN:
spr2 = SPR2_TRNS;
break;
case SPR2_NSTD:
spr2 = SPR2_SSTD;
break;
case SPR2_NFLT:
spr2 = (skin->flags & SF_SUPERANIMS) ? SPR2_SFLT : SPR2_FALL; // This is skin-exclusive so the default NiGHTS skin changing system plays nice.
break;
case SPR2_NPUL:
spr2 = SPR2_NFLT;
break;
case SPR2_NPAN:
spr2 = SPR2_NPUL;
break;
case SPR2_NATK:
spr2 = SPR2_SSPN;
break;
/*case SPR2_NGT0:
spr2 = SPR2_STND;
break;*/
case SPR2_NGT1:
case SPR2_NGT7:
case SPR2_DRL0:
spr2 = SPR2_NGT0;
break;
case SPR2_NGT2:
case SPR2_DRL1:
spr2 = SPR2_NGT1;
break;
case SPR2_NGT3:
case SPR2_DRL2:
spr2 = SPR2_NGT2;
break;
case SPR2_NGT4:
case SPR2_DRL3:
spr2 = SPR2_NGT3;
break;
case SPR2_NGT5:
case SPR2_DRL4:
spr2 = SPR2_NGT4;
break;
case SPR2_NGT6:
case SPR2_DRL5:
spr2 = SPR2_NGT5;
break;
case SPR2_DRL6:
spr2 = SPR2_NGT6;
break;
case SPR2_NGT8:
case SPR2_DRL7:
spr2 = SPR2_NGT7;
break;
case SPR2_NGT9:
case SPR2_DRL8:
spr2 = SPR2_NGT8;
break;
case SPR2_NGTA:
case SPR2_DRL9:
spr2 = SPR2_NGT9;
break;
case SPR2_NGTB:
case SPR2_DRLA:
spr2 = SPR2_NGTA;
break;
case SPR2_NGTC:
case SPR2_DRLB:
spr2 = SPR2_NGTB;
break;
case SPR2_DRLC:
spr2 = SPR2_NGTC;
break;
// Sprites for non-player objects? There's nothing we can do.
case SPR2_SIGN:
case SPR2_LIFE:
noalt = true;
break;
// Dunno? Just go to standing then. // Dunno? Just go to standing then.
default: default:
spr2 = SPR2_STND; spr2 = SPR2_STND;
@ -451,24 +575,54 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
break; break;
} }
if (!skin)
{
frame = 0;
numframes = 0;
}
if (mobj->sprite != SPR_PLAY) if (mobj->sprite != SPR_PLAY)
{ {
mobj->sprite = SPR_PLAY; mobj->sprite = SPR_PLAY;
frame = 0; frame = 0;
} }
else if (mobj->sprite2 != spr2) else if (mobj->sprite2 != spr2)
frame = 0; {
if ((st->frame & FF_MIDDLESTARTCHANCE) && numframes && P_RandomChance(FRACUNIT/2))
frame = numframes/2;
else
frame = 0;
}
if (frame >= numframes)
{
if (st->frame & FF_SPR2ENDSTATE) // no frame advancement
{
if (st->var1 == S_NULL)
frame--;
else
{
if (mobj->frame & FF_FRAMEMASK)
mobj->frame--;
return P_SetPlayerMobjState(mobj, st->var1);
}
}
else
frame = 0;
}
mobj->sprite2 = spr2; mobj->sprite2 = spr2;
if (!mobj->skin || frame >= ((skin_t *)mobj->skin)->sprites[spr2].numframes)
frame = 0;
mobj->frame = frame|(st->frame&~FF_FRAMEMASK); mobj->frame = frame|(st->frame&~FF_FRAMEMASK);
if (mobj->color >= MAXSKINCOLORS && mobj->color < MAXTRANSLATIONS) // Super colours? Super bright!
mobj->frame |= FF_FULLBRIGHT;
} }
// Regular sprites // Regular sprites
else else
{ {
mobj->sprite = st->sprite; mobj->sprite = st->sprite;
mobj->frame = st->frame; mobj->frame = st->frame;
if ((st->frame & (FF_ANIMATE|FF_MIDDLESTARTCHANCE)) == (FF_ANIMATE|FF_MIDDLESTARTCHANCE))
mobj->frame += P_RandomKey(st->var1+1);
} }
// Modified handling. // Modified handling.
@ -540,18 +694,41 @@ boolean P_SetMobjState(mobj_t *mobj, statenum_t state)
// Player animations // Player animations
if (st->sprite == SPR_PLAY) if (st->sprite == SPR_PLAY)
{ {
skin_t *skin = ((skin_t *)mobj->skin);
UINT8 spr2 = st->frame & FF_FRAMEMASK; UINT8 spr2 = st->frame & FF_FRAMEMASK;
UINT16 frame = (mobj->frame & FF_FRAMEMASK)+1; UINT16 frame = (mobj->frame & FF_FRAMEMASK)+1;
UINT8 numframes;
if (skin)
numframes = skin->sprites[spr2].numframes;
else
{
frame = 0;
numframes = 0;
}
if (mobj->sprite != SPR_PLAY) if (mobj->sprite != SPR_PLAY)
{ {
mobj->sprite = SPR_PLAY; mobj->sprite = SPR_PLAY;
frame = 0; frame = 0;
} }
else if (mobj->sprite2 != spr2) else if (mobj->sprite2 != spr2)
frame = 0; {
if ((st->frame & FF_MIDDLESTARTCHANCE) && numframes && P_RandomChance(FRACUNIT/2))
frame = numframes/2;
else
frame = 0;
}
if (frame >= numframes)
{
if (st->frame & FF_SPR2ENDSTATE)
return P_SetPlayerMobjState(mobj, st->var1); // Differs from P_SetPlayerMobjState - allows object to be removed via S_NULL
else
frame = 0;
}
mobj->sprite2 = spr2; mobj->sprite2 = spr2;
if (!mobj->skin || frame >= ((skin_t *)mobj->skin)->sprites[spr2].numframes)
frame = 0;
mobj->frame = frame|(st->frame&~FF_FRAMEMASK); mobj->frame = frame|(st->frame&~FF_FRAMEMASK);
} }
// Regular sprites // Regular sprites
@ -559,6 +736,8 @@ boolean P_SetMobjState(mobj_t *mobj, statenum_t state)
{ {
mobj->sprite = st->sprite; mobj->sprite = st->sprite;
mobj->frame = st->frame; mobj->frame = st->frame;
if ((st->frame & (FF_ANIMATE|FF_MIDDLESTARTCHANCE)) == (FF_ANIMATE|FF_MIDDLESTARTCHANCE))
mobj->frame += P_RandomKey(st->var1+1);
} }
// Modified handling. // Modified handling.
@ -2970,12 +3149,17 @@ static void P_PlayerZMovement(mobj_t *mo)
mo->player->skidtime = TICRATE; mo->player->skidtime = TICRATE;
mo->tics = -1; mo->tics = -1;
} }
else if (mo->player->charability2 == CA2_MELEE && mo->player->panim == PA_ABILITY2)
{
P_InstaThrust(mo, mo->angle, 0);
P_SetPlayerMobjState(mo, S_PLAY_STND);
}
else if (mo->player->pflags & PF_JUMPED || (mo->player->pflags & (PF_SPINNING|PF_USEDOWN)) != (PF_SPINNING|PF_USEDOWN) else if (mo->player->pflags & PF_JUMPED || (mo->player->pflags & (PF_SPINNING|PF_USEDOWN)) != (PF_SPINNING|PF_USEDOWN)
|| mo->player->powers[pw_tailsfly] || mo->state-states == S_PLAY_FLY_TIRED) || mo->player->powers[pw_tailsfly] || mo->state-states == S_PLAY_FLY_TIRED)
{ {
if (mo->player->cmomx || mo->player->cmomy) if (mo->player->cmomx || mo->player->cmomy)
{ {
if (mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_PEEL) if (mo->player->charability == CA_DASHMODE && mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_PEEL)
P_SetPlayerMobjState(mo, S_PLAY_PEEL); P_SetPlayerMobjState(mo, S_PLAY_PEEL);
else if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) && mo->player->panim != PA_RUN) else if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) && mo->player->panim != PA_RUN)
P_SetPlayerMobjState(mo, S_PLAY_RUN); P_SetPlayerMobjState(mo, S_PLAY_RUN);
@ -2986,7 +3170,7 @@ static void P_PlayerZMovement(mobj_t *mo)
} }
else else
{ {
if (mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_PEEL) if (mo->player->charability == CA_DASHMODE && mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_PEEL)
P_SetPlayerMobjState(mo, S_PLAY_PEEL); P_SetPlayerMobjState(mo, S_PLAY_PEEL);
if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) && mo->player->panim != PA_RUN) if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) && mo->player->panim != PA_RUN)
P_SetPlayerMobjState(mo, S_PLAY_RUN); P_SetPlayerMobjState(mo, S_PLAY_RUN);
@ -3004,8 +3188,7 @@ static void P_PlayerZMovement(mobj_t *mo)
if (!(mo->player->pflags & PF_GLIDING)) if (!(mo->player->pflags & PF_GLIDING))
mo->player->pflags &= ~PF_JUMPED; mo->player->pflags &= ~PF_JUMPED;
mo->player->pflags &= ~PF_THOKKED; mo->player->pflags &= ~(PF_THOKKED|PF_CANCARRY/*|PF_GLIDING*/);
//mo->player->pflags &= ~PF_GLIDING;
mo->player->jumping = 0; mo->player->jumping = 0;
mo->player->secondjump = 0; mo->player->secondjump = 0;
mo->player->glidetime = 0; mo->player->glidetime = 0;
@ -3268,7 +3451,7 @@ static boolean P_SceneryZMovement(mobj_t *mo)
boolean P_CanRunOnWater(player_t *player, ffloor_t *rover) boolean P_CanRunOnWater(player_t *player, ffloor_t *rover)
{ {
if (!(player->pflags & PF_NIGHTSMODE) && !player->homing if (!(player->pflags & PF_NIGHTSMODE) && !player->homing
&& (((player->charability == CA_SWIM) || player->powers[pw_super] || player->charflags & SF_RUNONWATER) && player->mo->ceilingz-*rover->topheight >= player->mo->height) && ((player->powers[pw_super] || player->charflags & SF_RUNONWATER) && player->mo->ceilingz-*rover->topheight >= player->mo->height)
&& (rover->flags & FF_SWIMMABLE) && !(player->pflags & PF_SPINNING) && player->speed > FixedMul(player->runspeed, player->mo->scale) && (rover->flags & FF_SWIMMABLE) && !(player->pflags & PF_SPINNING) && player->speed > FixedMul(player->runspeed, player->mo->scale)
&& !(player->pflags & PF_SLIDING) && !(player->pflags & PF_SLIDING)
&& abs(player->mo->z - *rover->topheight) < FixedMul(30*FRACUNIT, player->mo->scale)) && abs(player->mo->z - *rover->topheight) < FixedMul(30*FRACUNIT, player->mo->scale))
@ -3287,10 +3470,11 @@ void P_MobjCheckWater(mobj_t *mobj)
boolean waterwasnotset = (mobj->watertop == INT32_MAX); boolean waterwasnotset = (mobj->watertop == INT32_MAX);
boolean wasinwater = (mobj->eflags & MFE_UNDERWATER) == MFE_UNDERWATER; boolean wasinwater = (mobj->eflags & MFE_UNDERWATER) == MFE_UNDERWATER;
boolean wasingoo = (mobj->eflags & MFE_GOOWATER) == MFE_GOOWATER; boolean wasingoo = (mobj->eflags & MFE_GOOWATER) == MFE_GOOWATER;
fixed_t thingtop = mobj->z + mobj->height; // especially for players, infotable height does not neccessarily match actual height fixed_t thingtop = mobj->z + mobj->height;
sector_t *sector = mobj->subsector->sector; sector_t *sector = mobj->subsector->sector;
ffloor_t *rover; ffloor_t *rover;
player_t *p = mobj->player; // Will just be null if not a player. player_t *p = mobj->player; // Will just be null if not a player.
fixed_t height = (p ? P_GetPlayerHeight(p) : mobj->height); // for players, calculation height does not necessarily match actual height for gameplay reasons (spin, etc)
// Default if no water exists. // Default if no water exists.
mobj->watertop = mobj->waterbottom = mobj->z - 1000*FRACUNIT; mobj->watertop = mobj->waterbottom = mobj->z - 1000*FRACUNIT;
@ -3319,14 +3503,14 @@ void P_MobjCheckWater(mobj_t *mobj)
if (mobj->eflags & MFE_VERTICALFLIP) if (mobj->eflags & MFE_VERTICALFLIP)
{ {
if (topheight < (thingtop - FixedMul(mobj->info->height/2, mobj->scale)) if (topheight < (thingtop - (height>>1))
|| bottomheight > thingtop) || bottomheight > thingtop)
continue; continue;
} }
else else
{ {
if (topheight < mobj->z if (topheight < mobj->z
|| bottomheight > (mobj->z + FixedMul(mobj->info->height/2, mobj->scale))) || bottomheight > (mobj->z + (height>>1)))
continue; continue;
} }
@ -3335,16 +3519,16 @@ void P_MobjCheckWater(mobj_t *mobj)
mobj->waterbottom = bottomheight; mobj->waterbottom = bottomheight;
// Just touching the water? // Just touching the water?
if (((mobj->eflags & MFE_VERTICALFLIP) && thingtop - FixedMul(mobj->info->height, mobj->scale) < bottomheight) if (((mobj->eflags & MFE_VERTICALFLIP) && thingtop - height < bottomheight)
|| (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z + FixedMul(mobj->info->height, mobj->scale) > topheight)) || (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z + height > topheight))
{ {
mobj->eflags |= MFE_TOUCHWATER; mobj->eflags |= MFE_TOUCHWATER;
if (rover->flags & FF_GOOWATER && !(mobj->flags & MF_NOGRAVITY)) if (rover->flags & FF_GOOWATER && !(mobj->flags & MF_NOGRAVITY))
mobj->eflags |= MFE_GOOWATER; mobj->eflags |= MFE_GOOWATER;
} }
// Actually in the water? // Actually in the water?
if (((mobj->eflags & MFE_VERTICALFLIP) && thingtop - FixedMul(mobj->info->height/2, mobj->scale) > bottomheight) if (((mobj->eflags & MFE_VERTICALFLIP) && thingtop - (height>>1) > bottomheight)
|| (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z + FixedMul(mobj->info->height/2, mobj->scale) < topheight)) || (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z + (height>>1) < topheight))
{ {
mobj->eflags |= MFE_UNDERWATER; mobj->eflags |= MFE_UNDERWATER;
if (rover->flags & FF_GOOWATER && !(mobj->flags & MF_NOGRAVITY)) if (rover->flags & FF_GOOWATER && !(mobj->flags & MF_NOGRAVITY))
@ -3352,6 +3536,10 @@ void P_MobjCheckWater(mobj_t *mobj)
} }
} }
// Spectators and dead players don't get to do any of the things after this.
if (p && (p->spectator || p->playerstate != PST_LIVE))
return;
// Specific things for underwater players // Specific things for underwater players
if (p && (mobj->eflags & MFE_UNDERWATER) == MFE_UNDERWATER) if (p && (mobj->eflags & MFE_UNDERWATER) == MFE_UNDERWATER)
{ {
@ -3384,10 +3572,6 @@ void P_MobjCheckWater(mobj_t *mobj)
if (waterwasnotset || !!(mobj->eflags & MFE_UNDERWATER) == wasinwater) if (waterwasnotset || !!(mobj->eflags & MFE_UNDERWATER) == wasinwater)
return; return;
// Spectators and dead players also don't count.
if (p && (p->spectator || p->playerstate != PST_LIVE))
return;
if ((p) // Players if ((p) // Players
|| (mobj->flags & MF_PUSHABLE) // Pushables || (mobj->flags & MF_PUSHABLE) // Pushables
|| ((mobj->info->flags & MF_PUSHABLE) && mobj->fuse) // Previously pushable, might be moving still || ((mobj->info->flags & MF_PUSHABLE) && mobj->fuse) // Previously pushable, might be moving still
@ -3395,10 +3579,8 @@ void P_MobjCheckWater(mobj_t *mobj)
{ {
// Check to make sure you didn't just cross into a sector to jump out of // Check to make sure you didn't just cross into a sector to jump out of
// that has shallower water than the block you were originally in. // that has shallower water than the block you were originally in.
if (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->watertop-mobj->floorz <= FixedMul(mobj->info->height, mobj->scale)>>1) if ((!(mobj->eflags & MFE_VERTICALFLIP) && mobj->watertop-mobj->floorz <= height>>1)
return; || ((mobj->eflags & MFE_VERTICALFLIP) && mobj->ceilingz-mobj->waterbottom <= height>>1))
if ((mobj->eflags & MFE_VERTICALFLIP) && mobj->ceilingz-mobj->waterbottom <= FixedMul(mobj->info->height, mobj->scale)>>1)
return; return;
if ((mobj->eflags & MFE_GOOWATER || wasingoo)) { // Decide what happens to your momentum when you enter/leave goopy water. if ((mobj->eflags & MFE_GOOWATER || wasingoo)) { // Decide what happens to your momentum when you enter/leave goopy water.
@ -3410,8 +3592,8 @@ void P_MobjCheckWater(mobj_t *mobj)
if (P_MobjFlip(mobj)*mobj->momz < 0) if (P_MobjFlip(mobj)*mobj->momz < 0)
{ {
if ((mobj->eflags & MFE_VERTICALFLIP && thingtop-(FixedMul(mobj->info->height, mobj->scale)>>1)-mobj->momz <= mobj->waterbottom) if ((mobj->eflags & MFE_VERTICALFLIP && thingtop-(height>>1)-mobj->momz <= mobj->waterbottom)
|| (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z+(FixedMul(mobj->info->height, mobj->scale)>>1)-mobj->momz >= mobj->watertop)) || (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z+(height>>1)-mobj->momz >= mobj->watertop))
{ {
// Spawn a splash // Spawn a splash
mobj_t *splish; mobj_t *splish;
@ -3444,8 +3626,8 @@ void P_MobjCheckWater(mobj_t *mobj)
} }
else if (P_MobjFlip(mobj)*mobj->momz > 0) else if (P_MobjFlip(mobj)*mobj->momz > 0)
{ {
if (((mobj->eflags & MFE_VERTICALFLIP && thingtop-(FixedMul(mobj->info->height, mobj->scale)>>1)-mobj->momz > mobj->waterbottom) if (((mobj->eflags & MFE_VERTICALFLIP && thingtop-(height>>1)-mobj->momz > mobj->waterbottom)
|| (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z+(FixedMul(mobj->info->height, mobj->scale)>>1)-mobj->momz < mobj->watertop)) || (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z+(height>>1)-mobj->momz < mobj->watertop))
&& !(mobj->eflags & MFE_UNDERWATER)) // underwater check to prevent splashes on opposite side && !(mobj->eflags & MFE_UNDERWATER)) // underwater check to prevent splashes on opposite side
{ {
// Spawn a splash // Spawn a splash
@ -3550,10 +3732,10 @@ static void P_SceneryCheckWater(mobj_t *mobj)
#endif #endif
if (topheight <= mobj->z if (topheight <= mobj->z
|| bottomheight > (mobj->z + FixedMul(mobj->info->height >> 1, mobj->scale))) || bottomheight > (mobj->z + (mobj->height>>1)))
continue; continue;
if (mobj->z + FixedMul(mobj->info->height, mobj->scale) > topheight) if (mobj->z + mobj->height > topheight)
mobj->eflags |= MFE_TOUCHWATER; mobj->eflags |= MFE_TOUCHWATER;
else else
mobj->eflags &= ~MFE_TOUCHWATER; mobj->eflags &= ~MFE_TOUCHWATER;
@ -3562,7 +3744,7 @@ static void P_SceneryCheckWater(mobj_t *mobj)
mobj->watertop = topheight; mobj->watertop = topheight;
mobj->waterbottom = bottomheight; mobj->waterbottom = bottomheight;
if (mobj->z + FixedMul(mobj->info->height >> 1, mobj->scale) < topheight) if (mobj->z + (mobj->height>>1) < topheight)
mobj->eflags |= MFE_UNDERWATER; mobj->eflags |= MFE_UNDERWATER;
else else
mobj->eflags &= ~MFE_UNDERWATER; mobj->eflags &= ~MFE_UNDERWATER;
@ -3815,20 +3997,23 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
mobj->eflags &= ~MFE_JUSTSTEPPEDDOWN; mobj->eflags &= ~MFE_JUSTSTEPPEDDOWN;
// Zoom tube // Zoom tube
if (mobj->tracer && mobj->tracer->type == MT_TUBEWAYPOINT) if (mobj->tracer)
{ {
P_UnsetThingPosition(mobj); if (mobj->player->powers[pw_carry] == CR_ZOOMTUBE || mobj->player->powers[pw_carry] == CR_ROPEHANG)
mobj->x += mobj->momx; {
mobj->y += mobj->momy; P_UnsetThingPosition(mobj);
mobj->z += mobj->momz; mobj->x += mobj->momx;
P_SetThingPosition(mobj); mobj->y += mobj->momy;
P_CheckPosition(mobj, mobj->x, mobj->y); mobj->z += mobj->momz;
goto animonly; P_SetThingPosition(mobj);
} P_CheckPosition(mobj, mobj->x, mobj->y);
else if (mobj->player->pflags & PF_MACESPIN && mobj->tracer) goto animonly;
{ }
P_CheckPosition(mobj, mobj->x, mobj->y); else if (mobj->player->powers[pw_carry] == CR_MACESPIN)
goto animonly; {
P_CheckPosition(mobj, mobj->x, mobj->y);
goto animonly;
}
} }
// Needed for gravity boots // Needed for gravity boots
@ -5996,8 +6181,8 @@ void P_SetScale(mobj_t *mobj, fixed_t newscale)
mobj->scale = newscale; mobj->scale = newscale;
mobj->radius = FixedMul(mobj->info->radius, newscale); mobj->radius = FixedMul(FixedDiv(mobj->radius, oldscale), newscale);
mobj->height = FixedMul(mobj->info->height, newscale); mobj->height = FixedMul(FixedDiv(mobj->height, oldscale), newscale);
player = mobj->player; player = mobj->player;
@ -6005,7 +6190,6 @@ void P_SetScale(mobj_t *mobj, fixed_t newscale)
{ {
G_GhostAddScale(newscale); G_GhostAddScale(newscale);
player->viewheight = FixedMul(FixedDiv(player->viewheight, oldscale), newscale); // Nonono don't calculate viewheight elsewhere, this is the best place for it! player->viewheight = FixedMul(FixedDiv(player->viewheight, oldscale), newscale); // Nonono don't calculate viewheight elsewhere, this is the best place for it!
player->dashspeed = FixedMul(FixedDiv(player->dashspeed, oldscale), newscale); // Prevents the player from having to re-charge up spindash if the player grew in size
} }
} }
@ -6117,7 +6301,7 @@ static boolean P_ShieldLook(mobj_t *thing, shieldtype_t shield)
thing->flags |= MF_NOCLIPHEIGHT; thing->flags |= MF_NOCLIPHEIGHT;
thing->eflags = (thing->eflags & ~MFE_VERTICALFLIP)|(thing->target->eflags & MFE_VERTICALFLIP); thing->eflags = (thing->eflags & ~MFE_VERTICALFLIP)|(thing->target->eflags & MFE_VERTICALFLIP);
P_SetScale(thing, thing->target->scale); P_SetScale(thing, FixedMul(thing->target->scale, thing->target->player->shieldscale));
P_UnsetThingPosition(thing); P_UnsetThingPosition(thing);
thing->x = thing->target->x; thing->x = thing->target->x;
thing->y = thing->target->y; thing->y = thing->target->y;
@ -6828,7 +7012,22 @@ void P_MobjThinker(mobj_t *mobj)
} }
} }
else // Apply gravity to fall downwards. else // Apply gravity to fall downwards.
P_SetObjectMomZ(mobj, -2*FRACUNIT/3, true); {
if (mobj->player && !(mobj->fuse % 8) && (mobj->player->charflags & SF_MACHINE))
{
fixed_t r = mobj->radius>>FRACBITS;
mobj_t *explosion = P_SpawnMobj(
mobj->x + (P_RandomRange(r, -r)<<FRACBITS),
mobj->y + (P_RandomRange(r, -r)<<FRACBITS),
mobj->z + (P_RandomKey(mobj->height>>FRACBITS)<<FRACBITS),
MT_BOSSEXPLODE);
S_StartSound(explosion, sfx_cybdth);
}
if (mobj->movedir == DMG_DROWNED)
P_SetObjectMomZ(mobj, -FRACUNIT/2, true); // slower fall from drowning
else
P_SetObjectMomZ(mobj, -2*FRACUNIT/3, true);
}
} }
break; break;
default: default:
@ -8616,6 +8815,10 @@ void P_SpawnPlayer(INT32 playernum)
P_SetScale(mobj, mobj->destscale); P_SetScale(mobj, mobj->destscale);
P_FlashPal(p, 0, 0); // Resets P_FlashPal(p, 0, 0); // Resets
// Set bounds accurately.
mobj->radius = FixedMul(skins[p->skin].radius, mobj->scale);
mobj->height = P_GetPlayerHeight(p);
// Spawn with a pity shield if necessary. // Spawn with a pity shield if necessary.
P_DoPityCheck(p); P_DoPityCheck(p);
} }

View File

@ -35,8 +35,12 @@
#pragma interface #pragma interface
#endif #endif
/// \brief Frame flags: only the frame number /// \brief Frame flags: only the frame number - 0 to 511 (Frames from 0 to 63, Sprite2 number uses full range)
#define FF_FRAMEMASK 0x3fff #define FF_FRAMEMASK 0x1ff
/// \brief Frame flags: A change of state at the end of Sprite2 animation
#define FF_SPR2ENDSTATE 0x1000
/// \brief Frame flags: 50% of starting in middle of animation (Sprite2 and FF_ANIMATE)
#define FF_MIDDLESTARTCHANCE 0x2000
/// \brief Frame flags: Simple stateless animation /// \brief Frame flags: Simple stateless animation
#define FF_ANIMATE 0x4000 #define FF_ANIMATE 0x4000
/// \brief Frame flags: frame always appears full bright /// \brief Frame flags: frame always appears full bright

View File

@ -147,7 +147,6 @@ static void P_NetArchivePlayers(void)
WRITEUINT32(save_p, players[i].score); WRITEUINT32(save_p, players[i].score);
WRITEFIXED(save_p, players[i].dashspeed); WRITEFIXED(save_p, players[i].dashspeed);
WRITEINT32(save_p, players[i].dashtime);
WRITESINT8(save_p, players[i].lives); WRITESINT8(save_p, players[i].lives);
WRITESINT8(save_p, players[i].continues); WRITESINT8(save_p, players[i].continues);
WRITESINT8(save_p, players[i].xtralife); WRITESINT8(save_p, players[i].xtralife);
@ -260,6 +259,9 @@ static void P_NetArchivePlayers(void)
if (flags & AWAYVIEW) if (flags & AWAYVIEW)
WRITEUINT32(save_p, players[i].awayviewmobj->mobjnum); WRITEUINT32(save_p, players[i].awayviewmobj->mobjnum);
WRITEFIXED(save_p, players[i].camerascale);
WRITEFIXED(save_p, players[i].shieldscale);
WRITEUINT8(save_p, players[i].charability); WRITEUINT8(save_p, players[i].charability);
WRITEUINT8(save_p, players[i].charability2); WRITEUINT8(save_p, players[i].charability2);
WRITEUINT32(save_p, players[i].charflags); WRITEUINT32(save_p, players[i].charflags);
@ -275,6 +277,8 @@ static void P_NetArchivePlayers(void)
WRITEUINT8(save_p, players[i].accelstart); WRITEUINT8(save_p, players[i].accelstart);
WRITEUINT8(save_p, players[i].acceleration); WRITEUINT8(save_p, players[i].acceleration);
WRITEFIXED(save_p, players[i].jumpfactor); WRITEFIXED(save_p, players[i].jumpfactor);
WRITEFIXED(save_p, players[i].height);
WRITEFIXED(save_p, players[i].spinheight);
} }
} }
@ -323,7 +327,6 @@ static void P_NetUnArchivePlayers(void)
players[i].score = READUINT32(save_p); players[i].score = READUINT32(save_p);
players[i].dashspeed = READFIXED(save_p); // dashing speed players[i].dashspeed = READFIXED(save_p); // dashing speed
players[i].dashtime = READINT32(save_p); // dashing speed
players[i].lives = READSINT8(save_p); players[i].lives = READSINT8(save_p);
players[i].continues = READSINT8(save_p); // continues that player has acquired players[i].continues = READSINT8(save_p); // continues that player has acquired
players[i].xtralife = READSINT8(save_p); // Ring Extra Life counter players[i].xtralife = READSINT8(save_p); // Ring Extra Life counter
@ -426,6 +429,9 @@ static void P_NetUnArchivePlayers(void)
players[i].viewheight = cv_viewheight.value<<FRACBITS; players[i].viewheight = cv_viewheight.value<<FRACBITS;
players[i].camerascale = READFIXED(save_p);
players[i].shieldscale = READFIXED(save_p);
//SetPlayerSkinByNum(i, players[i].skin); //SetPlayerSkinByNum(i, players[i].skin);
players[i].charability = READUINT8(save_p); players[i].charability = READUINT8(save_p);
players[i].charability2 = READUINT8(save_p); players[i].charability2 = READUINT8(save_p);
@ -442,6 +448,8 @@ static void P_NetUnArchivePlayers(void)
players[i].accelstart = READUINT8(save_p); players[i].accelstart = READUINT8(save_p);
players[i].acceleration = READUINT8(save_p); players[i].acceleration = READUINT8(save_p);
players[i].jumpfactor = READFIXED(save_p); players[i].jumpfactor = READFIXED(save_p);
players[i].height = READFIXED(save_p);
players[i].spinheight = READFIXED(save_p);
} }
} }

View File

@ -3889,7 +3889,7 @@ DoneSection2:
mobj_t *mo2; mobj_t *mo2;
angle_t an; angle_t an;
if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT) if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ZOOMTUBE)
break; break;
// Find line #3 tagged to this sector // Find line #3 tagged to this sector
@ -3938,10 +3938,10 @@ DoneSection2:
break; // behind back break; // behind back
P_SetTarget(&player->mo->tracer, waypoint); P_SetTarget(&player->mo->tracer, waypoint);
player->powers[pw_carry] = CR_ZOOMTUBE;
player->speed = speed; player->speed = speed;
player->pflags |= PF_SPINNING; player->pflags |= PF_SPINNING;
player->pflags &= ~PF_JUMPED; player->pflags &= ~(PF_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
player->pflags &= ~PF_GLIDING;
player->climbing = 0; player->climbing = 0;
if (player->mo->state-states != S_PLAY_SPIN) if (player->mo->state-states != S_PLAY_SPIN)
@ -3962,7 +3962,7 @@ DoneSection2:
mobj_t *mo2; mobj_t *mo2;
angle_t an; angle_t an;
if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT) if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ZOOMTUBE)
break; break;
// Find line #3 tagged to this sector // Find line #3 tagged to this sector
@ -4012,9 +4012,10 @@ DoneSection2:
break; // behind back break; // behind back
P_SetTarget(&player->mo->tracer, waypoint); P_SetTarget(&player->mo->tracer, waypoint);
player->powers[pw_carry] = CR_ZOOMTUBE;
player->speed = speed; player->speed = speed;
player->pflags |= PF_SPINNING; player->pflags |= PF_SPINNING;
player->pflags &= ~PF_JUMPED; player->pflags &= ~(PF_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
if (player->mo->state-states != S_PLAY_SPIN) if (player->mo->state-states != S_PLAY_SPIN)
{ {
@ -4084,7 +4085,7 @@ DoneSection2:
vertex_t v1, v2, resulthigh, resultlow; vertex_t v1, v2, resulthigh, resultlow;
mobj_t *highest = NULL; mobj_t *highest = NULL;
if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT) if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT && player->powers[pw_carry] == CR_ROPEHANG)
break; break;
if (player->mo->momz > 0) if (player->mo->momz > 0)
@ -4305,6 +4306,7 @@ DoneSection2:
} }
P_SetTarget(&player->mo->tracer, closest); P_SetTarget(&player->mo->tracer, closest);
player->powers[pw_carry] = CR_ROPEHANG;
// Option for static ropes. // Option for static ropes.
if (lines[lineindex].flags & ML_NOCLIMB) if (lines[lineindex].flags & ML_NOCLIMB)
@ -4312,13 +4314,9 @@ DoneSection2:
else else
player->speed = speed; player->speed = speed;
player->pflags |= PF_ROPEHANG;
S_StartSound(player->mo, sfx_s3k4a); S_StartSound(player->mo, sfx_s3k4a);
player->pflags &= ~PF_JUMPED; player->pflags &= ~(PF_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
player->pflags &= ~PF_GLIDING;
player->pflags &= ~PF_SLIDING;
player->climbing = 0; player->climbing = 0;
P_SetThingPosition(player->mo); P_SetThingPosition(player->mo);
P_SetPlayerMobjState(player->mo, S_PLAY_RIDE); P_SetPlayerMobjState(player->mo, S_PLAY_RIDE);
@ -7165,7 +7163,7 @@ static inline boolean PIT_PushThing(mobj_t *thing)
if (thing->eflags & MFE_PUSHED) if (thing->eflags & MFE_PUSHED)
return false; return false;
if (thing->player && thing->player->pflags & PF_ROPEHANG) if (thing->player && thing->player->powers[pw_carry] == CR_ROPEHANG)
return false; return false;
// Allow this to affect pushable objects at some point? // Allow this to affect pushable objects at some point?
@ -7398,7 +7396,7 @@ void T_Pusher(pusher_t *p)
if (thing->eflags & MFE_PUSHED) if (thing->eflags & MFE_PUSHED)
continue; continue;
if (thing->player && thing->player->pflags & PF_ROPEHANG) if (thing->player && thing->player->powers[pw_carry] == CR_ROPEHANG)
continue; continue;
if (thing->player && (thing->state == &states[thing->info->painstate]) && (thing->player->powers[pw_flashing] > (flashingtics/4)*3 && thing->player->powers[pw_flashing] <= flashingtics)) if (thing->player && (thing->state == &states[thing->info->painstate]) && (thing->player->powers[pw_flashing] > (flashingtics/4)*3 && thing->player->powers[pw_flashing] <= flashingtics))

View File

@ -160,9 +160,9 @@ boolean P_Teleport(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle
INT32 p; INT32 p;
// Search for any players you might be carrying, so you can get them off before they end up being taken with you! // Search for any players you might be carrying, so you can get them off before they end up being taken with you!
for (p = 0; p < MAXPLAYERS; p++) for (p = 0; p < MAXPLAYERS; p++)
if (playeringame[p] && players[p].mo && players[p].pflags & PF_CARRIED && players[p].mo->tracer == thing) if (playeringame[p] && players[p].mo && players[p].powers[pw_carry] == CR_PLAYER && players[p].mo->tracer == thing)
{ {
players[p].pflags &= ~PF_CARRIED; players[p].powers[pw_carry] = CR_NONE;
break; break;
} }
thing->player->cmomx = thing->player->cmomy = 0; thing->player->cmomx = thing->player->cmomy = 0;

File diff suppressed because it is too large Load Diff

View File

@ -135,7 +135,7 @@ static UINT8** translationtablecache[MAXSKINS + 4] = {NULL};
// See also the enum skincolors_t // See also the enum skincolors_t
// TODO Callum: Can this be translated? // TODO Callum: Can this be translated?
const char *Color_Names[MAXSKINCOLORS] = const char *Color_Names[MAXSKINCOLORS + NUMSUPERCOLORS] =
{ {
"None", // SKINCOLOR_NONE "None", // SKINCOLOR_NONE
"White", // SKINCOLOR_WHITE "White", // SKINCOLOR_WHITE
@ -166,9 +166,23 @@ const char *Color_Names[MAXSKINCOLORS] =
"Lavender", // SKINCOLOR_LAVENDER "Lavender", // SKINCOLOR_LAVENDER
"Magenta", // SKINCOLOR_MAGENTA "Magenta", // SKINCOLOR_MAGENTA
"Pink", // SKINCOLOR_PINK "Pink", // SKINCOLOR_PINK
"Rosy" // SKINCOLOR_ROSY "Rosy", // SKINCOLOR_ROSY
// Super behaves by different rules (one name per 5 colours), and will be accessed exclusively via R_GetSuperColorByName instead of R_GetColorByName.
"Silver", // SKINCOLOR_SUPERSILVER1
"Red", // SKINCOLOR_SUPERRED1
"Orange", // SKINCOLOR_SUPERORANGE1
"Gold", // SKINCOLOR_SUPERGOLD1
"Peridot", // SKINCOLOR_SUPERPERIDOT1
"Cyan", // SKINCOLOR_SUPERCYAN1
"Purple", // SKINCOLOR_SUPERPURPLE1
"Rust", // SKINCOLOR_SUPERRUST1
"Tan" // SKINCOLOR_SUPERTAN1
}; };
/*
A word of warning: If the following array is non-symmetrical,
A_SignPlayer's prefoppositecolor behaviour will break.
*/
const UINT8 Color_Opposite[MAXSKINCOLORS*2] = const UINT8 Color_Opposite[MAXSKINCOLORS*2] =
{ {
SKINCOLOR_NONE,8, // SKINCOLOR_NONE SKINCOLOR_NONE,8, // SKINCOLOR_NONE
@ -183,7 +197,7 @@ const UINT8 Color_Opposite[MAXSKINCOLORS*2] =
SKINCOLOR_CYAN,8, // SKINCOLOR_CRIMSON - ditto SKINCOLOR_CYAN,8, // SKINCOLOR_CRIMSON - ditto
SKINCOLOR_BLUE,12, // SKINCOLOR_ORANGE SKINCOLOR_BLUE,12, // SKINCOLOR_ORANGE
SKINCOLOR_TAN,8, // SKINCOLOR_RUST - ditto SKINCOLOR_TAN,8, // SKINCOLOR_RUST - ditto
SKINCOLOR_LAVENDER,8, // SKINCOLOR_GOLD - ditto SKINCOLOR_LAVENDER,8, // SKINCOLOR_GOLD - ditto
SKINCOLOR_TEAL,8, // SKINCOLOR_YELLOW - ditto SKINCOLOR_TEAL,8, // SKINCOLOR_YELLOW - ditto
SKINCOLOR_RUST,8, // SKINCOLOR_TAN - ditto SKINCOLOR_RUST,8, // SKINCOLOR_TAN - ditto
SKINCOLOR_MAGENTA,3, // SKINCOLOR_MOSS SKINCOLOR_MAGENTA,3, // SKINCOLOR_MOSS
@ -196,11 +210,11 @@ const UINT8 Color_Opposite[MAXSKINCOLORS*2] =
SKINCOLOR_ORANGE,9, // SKINCOLOR_BLUE SKINCOLOR_ORANGE,9, // SKINCOLOR_BLUE
SKINCOLOR_PINK,8, // SKINCOLOR_AZURE - ditto SKINCOLOR_PINK,8, // SKINCOLOR_AZURE - ditto
SKINCOLOR_EMERALD,8, // SKINCOLOR_PASTEL - ditto SKINCOLOR_EMERALD,8, // SKINCOLOR_PASTEL - ditto
SKINCOLOR_PERIDOT,8, // SKINCOLOR_PURPLE - ditto SKINCOLOR_PERIDOT,10, // SKINCOLOR_PURPLE - ditto
SKINCOLOR_GOLD,8, // SKINCOLOR_LAVENDER - ditto SKINCOLOR_GOLD,8, // SKINCOLOR_LAVENDER - ditto
SKINCOLOR_MOSS,8, // SKINCOLOR_MAGENTA - ditto SKINCOLOR_MOSS,8, // SKINCOLOR_MAGENTA - ditto
SKINCOLOR_AZURE,8, // SKINCOLOR_PINK - ditto SKINCOLOR_AZURE,8, // SKINCOLOR_PINK - ditto
SKINCOLOR_AQUA,8 // SKINCOLOR_ROSY - ditto SKINCOLOR_AQUA,14 // SKINCOLOR_ROSY - ditto
}; };
CV_PossibleValue_t Color_cons_t[MAXSKINCOLORS+1]; CV_PossibleValue_t Color_cons_t[MAXSKINCOLORS+1];
@ -569,49 +583,186 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
break; break;
// Super colors, from lightest to darkest! // Super colors, from lightest to darkest!
case SKINCOLOR_SUPER1:
// Super White // Super silvers.
case SKINCOLOR_SUPERSILVER1:
for (i = 0; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)0;
for (; i < 14; i++)
dest_colormap[starttranscolor + i] = (UINT8)1;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(i-12);
break;
case SKINCOLOR_SUPERSILVER2:
for (i = 0; i < 3; i++)
dest_colormap[starttranscolor + i] = (UINT8)(i);
dest_colormap[starttranscolor + (i++)] = (UINT8)2;
for (; i < 8; i++)
dest_colormap[starttranscolor + i] = (UINT8)3;
for (; i < 14; i++)
dest_colormap[starttranscolor + i] = (UINT8)4;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(i-9);
break;
case SKINCOLOR_SUPERSILVER3:
dest_colormap[starttranscolor] = (UINT8)1;
for (i = 1; i < 3; i++)
dest_colormap[starttranscolor + i] = (UINT8)2;
for (; i < 6; i++)
dest_colormap[starttranscolor + i] = (UINT8)3;
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)4;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(5 + ((i-12)*2));
break;
case SKINCOLOR_SUPERSILVER4:
dest_colormap[starttranscolor] = (UINT8)2;
for (i = 1; i < 3; i++)
dest_colormap[starttranscolor + i] = (UINT8)3;
for (; i < 9; i++)
dest_colormap[starttranscolor + i] = (UINT8)4;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(5 + ((i-9)*2));
break;
case SKINCOLOR_SUPERSILVER5:
for (i = 0; i < 2; i++)
dest_colormap[starttranscolor + i] = (UINT8)3;
for (; i < 8; i++)
dest_colormap[starttranscolor + i] = (UINT8)4;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(5 + ((i-8)*2));
break;
// Super reds.
case SKINCOLOR_SUPERRED1:
for (i = 0; i < 10; i++)
dest_colormap[starttranscolor + i] = (UINT8)0;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(208 + ((i-10) >> 1));
break;
case SKINCOLOR_SUPERRED2:
for (i = 0; i < 3; i++)
dest_colormap[starttranscolor + i] = (UINT8)0;
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)(208 + ((i-3) / 3));
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(32 + ((i-12) >> 1));
break;
case SKINCOLOR_SUPERRED3:
for (i = 0; i < 2; i++)
dest_colormap[starttranscolor + i] = (UINT8)0;
for (; i < 8; i++)
dest_colormap[starttranscolor + i] = (UINT8)(208 + ((i-2) >> 1));
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(32 + ((i-8) >> 1));
break;
case SKINCOLOR_SUPERRED4:
dest_colormap[starttranscolor] = (UINT8)0;
for (i = 1; i < 6; i++)
dest_colormap[starttranscolor + i] = (UINT8)(208 + (i >> 1));
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(32 + ((i-6) >> 1));
break;
case SKINCOLOR_SUPERRED5:
dest_colormap[starttranscolor] = (UINT8)208;
for (i = 1; i < 4; i++)
dest_colormap[starttranscolor + i] = (UINT8)(209 + (i >> 1));
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(32 + ((i-4) >> 1));
break;
// Super oranges.
case SKINCOLOR_SUPERORANGE1:
for (i = 0; i < 10; i++)
dest_colormap[starttranscolor + i] = (UINT8)0;
dest_colormap[starttranscolor + (i++)] = (UINT8)208;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(48 + (i-11));
break;
case SKINCOLOR_SUPERORANGE2:
for (i = 0; i < 4; i++)
dest_colormap[starttranscolor + i] = (UINT8)0;
for (; i < 6; i++)
dest_colormap[starttranscolor + i] = (UINT8)208;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(48 + ((i-6) >> 1));
break;
case SKINCOLOR_SUPERORANGE3:
for (i = 0; i < 2; i++)
dest_colormap[starttranscolor + i] = (UINT8)0;
for (; i < 4; i++)
dest_colormap[starttranscolor + i] = (UINT8)208;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(48 + ((i-4) >> 1));
break;
case SKINCOLOR_SUPERORANGE4:
dest_colormap[starttranscolor] = (UINT8)0;
dest_colormap[starttranscolor + 1] = (UINT8)208;
for (i = 2; i < 13; i++)
dest_colormap[starttranscolor + i] = (UINT8)(48 + (i-2));
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(68 + (i-13));
break;
case SKINCOLOR_SUPERORANGE5:
dest_colormap[starttranscolor] = (UINT8)208;
for (i = 1; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)(48 + (i-1));
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(68 + (i-12));
break;
// Super golds.
case SKINCOLOR_SUPERGOLD1:
for (i = 0; i < 10; i++) for (i = 0; i < 10; i++)
dest_colormap[starttranscolor + i] = (UINT8)0; // True white dest_colormap[starttranscolor + i] = (UINT8)0; // True white
for (; i < 12; i++) // White-yellow fade for (; i < 12; i++) // White-yellow fade
dest_colormap[starttranscolor + i] = (UINT8)(80); dest_colormap[starttranscolor + i] = (UINT8)80;
for (; i < 15; i++) // White-yellow fade for (; i < 15; i++) // White-yellow fade
dest_colormap[starttranscolor + i] = (UINT8)(81 + (i-12)); dest_colormap[starttranscolor + i] = (UINT8)(81 + (i-12));
dest_colormap[starttranscolor + 15] = (UINT8)(72); dest_colormap[starttranscolor + 15] = (UINT8)72;
break; break;
case SKINCOLOR_SUPER2: case SKINCOLOR_SUPERGOLD2:
// Super Bright
dest_colormap[starttranscolor] = (UINT8)(0); dest_colormap[starttranscolor] = (UINT8)(0);
for (i = 1; i < 4; i++) // White-yellow fade for (i = 1; i < 4; i++) // White-yellow fade
dest_colormap[starttranscolor + i] = (UINT8)(80 + (i-1)); dest_colormap[starttranscolor + i] = (UINT8)(80 + (i-1));
for (; i < 6; i++) // Yellow for (; i < 6; i++) // Yellow
dest_colormap[starttranscolor + i] = (UINT8)(83); dest_colormap[starttranscolor + i] = (UINT8)83;
for (; i < 8; i++) // Yellow for (; i < 8; i++) // Yellow
dest_colormap[starttranscolor + i] = (UINT8)(72); dest_colormap[starttranscolor + i] = (UINT8)72;
for (; i < 14; i++) // Yellow for (; i < 14; i++) // Yellow
dest_colormap[starttranscolor + i] = (UINT8)(73); dest_colormap[starttranscolor + i] = (UINT8)73;
for (; i < 16; i++) // With a fine golden finish! :3 for (; i < 16; i++) // With a fine golden finish! :3
dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-14)); dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-14));
break; break;
case SKINCOLOR_SUPER3: case SKINCOLOR_SUPERGOLD3:
// Super Yellow
for (i = 0; i < 2; i++) // White-yellow fade for (i = 0; i < 2; i++) // White-yellow fade
dest_colormap[starttranscolor + i] = (UINT8)(81 + i); dest_colormap[starttranscolor + i] = (UINT8)(81 + i);
for (; i < 4; i++) for (; i < 4; i++)
dest_colormap[starttranscolor + i] = (UINT8)(83); dest_colormap[starttranscolor + i] = (UINT8)83;
for (; i < 6; i++) // Yellow for (; i < 6; i++) // Yellow
dest_colormap[starttranscolor + i] = (UINT8)(72); dest_colormap[starttranscolor + i] = (UINT8)72;
for (; i < 12; i++) // Yellow for (; i < 12; i++) // Yellow
dest_colormap[starttranscolor + i] = (UINT8)(73); dest_colormap[starttranscolor + i] = (UINT8)73;
for (; i < 16; i++) // With a fine golden finish! :3 for (; i < 16; i++) // With a fine golden finish! :3
dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-12)); dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-12));
break; break;
case SKINCOLOR_SUPER4: case SKINCOLOR_SUPERGOLD4: // "The SSNTails"
// "The SSNTails" dest_colormap[starttranscolor] = (UINT8)83; // Golden shine
dest_colormap[starttranscolor] = 83; // Golden shine
for (i = 1; i < 3; i++) // Yellow for (i = 1; i < 3; i++) // Yellow
dest_colormap[starttranscolor + i] = (UINT8)(72); dest_colormap[starttranscolor + i] = (UINT8)(72);
for (; i < 9; i++) // Yellow for (; i < 9; i++) // Yellow
@ -620,30 +771,310 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-9)); dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-9));
break; break;
case SKINCOLOR_SUPER5: case SKINCOLOR_SUPERGOLD5: // Golden Delicious
// Golden Delicious
for (i = 0; i < 2; i++) // Yellow for (i = 0; i < 2; i++) // Yellow
dest_colormap[starttranscolor + i] = (UINT8)(72); dest_colormap[starttranscolor + i] = (UINT8)(72);
for (; i < 8; i++) // Yellow for (; i < 8; i++) // Yellow
dest_colormap[starttranscolor + i] = (UINT8)(73); dest_colormap[starttranscolor + i] = (UINT8)(73);
for (; i < 15; i++) // With a fine golden finish! :3 for (; i < 16; i++) // With a fine golden finish! :3
dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-8)); dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-8));
dest_colormap[starttranscolor + 15] = (UINT8)63;
break; break;
// Super Tails and Knuckles, who really should be dummied out by now // Super peridots. (nyeheheheh)
case SKINCOLOR_TSUPER1: case SKINCOLOR_SUPERPERIDOT1:
case SKINCOLOR_TSUPER2: for (i = 0; i < 10; i++)
case SKINCOLOR_TSUPER3: dest_colormap[starttranscolor + i] = (UINT8)0;
case SKINCOLOR_TSUPER4: for (; i < 13; i++)
case SKINCOLOR_TSUPER5: dest_colormap[starttranscolor + i] = (UINT8)88;
case SKINCOLOR_KSUPER1: for (; i < 16; i++)
case SKINCOLOR_KSUPER2: dest_colormap[starttranscolor + i] = (UINT8)188;
case SKINCOLOR_KSUPER3: break;
case SKINCOLOR_KSUPER4:
case SKINCOLOR_KSUPER5: case SKINCOLOR_SUPERPERIDOT2:
for (i = 0; i < SKIN_RAMP_LENGTH; i++) dest_colormap[starttranscolor] = (UINT8)(0);
dest_colormap[starttranscolor + i] = 0xFF; for (i = 1; i < 4; i++)
dest_colormap[starttranscolor + i] = (UINT8)88;
for (; i < 8; i++)
dest_colormap[starttranscolor + i] = (UINT8)188;
for (; i < 14; i++)
dest_colormap[starttranscolor + i] = (UINT8)189;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)190;
break;
case SKINCOLOR_SUPERPERIDOT3:
for (i = 0; i < 2; i++)
dest_colormap[starttranscolor + i] = (UINT8)88;
for (; i < 6; i++)
dest_colormap[starttranscolor + i] = (UINT8)188;
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)189;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(190 + ((i-12) >> 1));
break;
case SKINCOLOR_SUPERPERIDOT4:
dest_colormap[starttranscolor] = (UINT8)88;
for (i = 1; i < 3; i++)
dest_colormap[starttranscolor + i] = (UINT8)188;
for (; i < 9; i++)
dest_colormap[starttranscolor + i] = (UINT8)189;
for (; i < 13; i++)
dest_colormap[starttranscolor + i] = (UINT8)(190 + ((i-9) >> 1));
for (; i < 15; i++)
dest_colormap[starttranscolor + i] = (UINT8)94;
dest_colormap[starttranscolor + i] = (UINT8)95;
break;
case SKINCOLOR_SUPERPERIDOT5:
for (i = 0; i < 2; i++)
dest_colormap[starttranscolor + i] = (UINT8)188;
for (; i < 8; i++)
dest_colormap[starttranscolor + i] = (UINT8)189;
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)(190 + ((i-8) >> 1));
for (; i < 14; i++)
dest_colormap[starttranscolor + i] = (UINT8)94;
dest_colormap[starttranscolor + (i++)] = (UINT8)95;
dest_colormap[starttranscolor + i] = (UINT8)119;
break;
// Super cyans.
case SKINCOLOR_SUPERCYAN1:
for (i = 0; i < 10; i++)
dest_colormap[starttranscolor + i] = (UINT8)0;
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)128;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(129 + (i-12));
break;
case SKINCOLOR_SUPERCYAN2:
dest_colormap[starttranscolor] = (UINT8)0;
for (i = 1; i < 4; i++)
dest_colormap[starttranscolor + i] = (UINT8)(128 + (i-1));
for (; i < 8; i++)
dest_colormap[starttranscolor + i] = (UINT8)(131 + ((i-4) >> 1));
for (; i < 14; i++)
dest_colormap[starttranscolor + i] = (UINT8)133;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)134;
break;
case SKINCOLOR_SUPERCYAN3:
for (i = 0; i < 2; i++)
dest_colormap[starttranscolor + i] = (UINT8)(129 + i);
for (; i < 6; i++)
dest_colormap[starttranscolor + i] = (UINT8)(131 + ((i-2) >> 1));
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)133;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(134 + ((i-12) >> 1));
break;
case SKINCOLOR_SUPERCYAN4:
dest_colormap[starttranscolor] = (UINT8)131;
for (i = 1; i < 3; i++)
dest_colormap[starttranscolor + i] = (UINT8)132;
for (; i < 9; i++)
dest_colormap[starttranscolor + i] = (UINT8)133;
for (; i < 13; i++)
dest_colormap[starttranscolor + i] = (UINT8)(134 + ((i-9) >> 1));
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(136 + (i-13));
break;
case SKINCOLOR_SUPERCYAN5:
for (i = 0; i < 2; i++)
dest_colormap[starttranscolor + i] = (UINT8)132;
for (; i < 8; i++)
dest_colormap[starttranscolor + i] = (UINT8)133;
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)(134 + ((i-8) >> 1));
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(136 + (i-12));
break;
// Super purples.
case SKINCOLOR_SUPERPURPLE1:
for (i = 0; i < 10; i++)
dest_colormap[starttranscolor + i] = (UINT8)0;
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)144;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(160 + (i-12));
break;
case SKINCOLOR_SUPERPURPLE2:
dest_colormap[starttranscolor] = (UINT8)0;
dest_colormap[starttranscolor + 1] = (UINT8)144;
for (i = 2; i < 4; i++)
dest_colormap[starttranscolor + i] = (UINT8)(160 + (i-2));
for (; i < 8; i++)
dest_colormap[starttranscolor + i] = (UINT8)(162 + ((i-4) >> 1));
for (; i < 14; i++)
dest_colormap[starttranscolor + i] = (UINT8)164;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)165;
break;
case SKINCOLOR_SUPERPURPLE3:
for (i = 0; i < 2; i++)
dest_colormap[starttranscolor + i] = (UINT8)(160 + i);
for (; i < 6; i++)
dest_colormap[starttranscolor + i] = (UINT8)(162 + ((i-2) >> 1));
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)164;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(165 + ((i-12) >> 1));
break;
case SKINCOLOR_SUPERPURPLE4:
dest_colormap[starttranscolor] = (UINT8)162;
for (i = 1; i < 3; i++)
dest_colormap[starttranscolor + i] = (UINT8)163;
for (; i < 9; i++)
dest_colormap[starttranscolor + i] = (UINT8)164;
for (; i < 13; i++)
dest_colormap[starttranscolor + i] = (UINT8)(165 + ((i-9) >> 1));
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(167 + (i-13));
break;
case SKINCOLOR_SUPERPURPLE5:
for (i = 0; i < 2; i++)
dest_colormap[starttranscolor + i] = (UINT8)163;
for (; i < 8; i++)
dest_colormap[starttranscolor + i] = (UINT8)164;
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)(165 + ((i-8) >> 1));
for (; i < 15; i++)
dest_colormap[starttranscolor + i] = (UINT8)(167 + (i-12));
dest_colormap[starttranscolor + i] = (UINT8)253;
break;
// Super rusts.
case SKINCOLOR_SUPERRUST1:
for (i = 0; i < 2; i++)
dest_colormap[starttranscolor + i] = (UINT8)0;
for (; i < 5; i++)
dest_colormap[starttranscolor + i] = (UINT8)208;
for (; i < 7; i++)
dest_colormap[starttranscolor + i] = (UINT8)48;
for (; i < 10; i++)
dest_colormap[starttranscolor + i] = (UINT8)(49 + (i-7));
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)(55 + ((i-10)*3));
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(68 + (i-11));
break;
case SKINCOLOR_SUPERRUST2:
for (i = 0; i < 4; i++)
dest_colormap[starttranscolor + i] = (UINT8)48;
for (; i < 9; i++)
dest_colormap[starttranscolor + i] = (UINT8)(49 + (i-4));
for (; i < 11; i++)
dest_colormap[starttranscolor + i] = (UINT8)(56 + ((i-9)*2));
for (; i < 15; i++)
dest_colormap[starttranscolor + i] = (UINT8)(68 + (i-11));
dest_colormap[starttranscolor + i] = (UINT8)71;
break;
case SKINCOLOR_SUPERRUST3:
dest_colormap[starttranscolor] = (UINT8)49;
for (i = 1; i < 3; i++)
dest_colormap[starttranscolor + i] = (UINT8)50;
for (; i < 5; i++)
dest_colormap[starttranscolor + i] = (UINT8)(51 + (i-3));
for (; i < 8; i++)
dest_colormap[starttranscolor + i] = (UINT8)(54 + (i-5));
dest_colormap[starttranscolor + (i++)] = (UINT8)58;
for (; i < 15; i++)
dest_colormap[starttranscolor + i] = (UINT8)(68 + ((i-7) >> 1));
dest_colormap[starttranscolor + i] = (UINT8)46;
break;
case SKINCOLOR_SUPERRUST4:
dest_colormap[starttranscolor] = (UINT8)83;
dest_colormap[starttranscolor + 1] = (UINT8)72;
for (i = 2; i < 6; i++)
dest_colormap[starttranscolor + i] = (UINT8)(64 + (i-2));
for (; i < 14; i++)
dest_colormap[starttranscolor + i] = (UINT8)(68 + ((i-6) >> 1));
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)46;
break;
case SKINCOLOR_SUPERRUST5:
for (i = 0; i < 3; i++)
dest_colormap[starttranscolor + i] = (UINT8)(64 + i);
for (; i < 7; i++)
dest_colormap[starttranscolor + i] = (UINT8)(67 + ((i-3) >> 1));
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)(233 + (i-7));
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(238 + ((i-12) >> 1));
break;
// Super tans.
case SKINCOLOR_SUPERTAN1:
for (i = 0; i < 10; i++)
dest_colormap[starttranscolor + i] = (UINT8)0;
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(80 + ((i-10) >> 1));
break;
case SKINCOLOR_SUPERTAN2:
dest_colormap[starttranscolor] = (UINT8)0;
for (i = 1; i < 7; i++)
dest_colormap[starttranscolor + i] = (UINT8)(80 + ((i-1) >> 1));
dest_colormap[starttranscolor + (i++)] = (UINT8)82;
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)84;
for (; i < 15; i++)
dest_colormap[starttranscolor + i] = (UINT8)(85 + (i-12));
dest_colormap[starttranscolor + i] = (UINT8)245;
break;
case SKINCOLOR_SUPERTAN3:
dest_colormap[starttranscolor] = (UINT8)80;
for (i = 1; i < 5; i++)
dest_colormap[starttranscolor + i] = (UINT8)(81 + ((i-1) >> 1));
dest_colormap[starttranscolor + (i++)] = (UINT8)82;
for (; i < 10; i++)
dest_colormap[starttranscolor + i] = (UINT8)84;
for (; i < 13; i++)
dest_colormap[starttranscolor + i] = (UINT8)(85 + (i-10));
for (; i < 16; i++)
dest_colormap[starttranscolor + i] = (UINT8)(245 + ((i-13)*2));
break;
case SKINCOLOR_SUPERTAN4:
dest_colormap[starttranscolor] = (UINT8)81;
for (i = 1; i < 5; i++)
dest_colormap[starttranscolor + i] = (UINT8)82;
for (; i < 8; i++)
dest_colormap[starttranscolor + i] = (UINT8)84;
for (; i < 11; i++)
dest_colormap[starttranscolor + i] = (UINT8)(85 + (i-8));
for (; i < 15; i++)
dest_colormap[starttranscolor + i] = (UINT8)(245 + ((i-11)*2));
dest_colormap[starttranscolor + i] = (UINT8)237;
break;
case SKINCOLOR_SUPERTAN5:
for (i = 0; i < 2; i++)
dest_colormap[starttranscolor + i] = (UINT8)82;
for (; i < 5; i++)
dest_colormap[starttranscolor + i] = (UINT8)84;
for (; i < 8; i++)
dest_colormap[starttranscolor + i] = (UINT8)(85 + (i-5));
for (; i < 12; i++)
dest_colormap[starttranscolor + i] = (UINT8)(245 + (i-8));
for (; i < 15; i++)
dest_colormap[starttranscolor + i] = (UINT8)(237 + (i-12));
dest_colormap[starttranscolor + i] = (UINT8)239;
break; break;
default: default:
@ -727,6 +1158,17 @@ UINT8 R_GetColorByName(const char *name)
return 0; return 0;
} }
UINT8 R_GetSuperColorByName(const char *name)
{
UINT8 color; /* = (UINT8)atoi(name); -- This isn't relevant to S_SKIN, which is the only way it's accessible right now. Let's simplify things.
if (color > MAXSKINCOLORS && color < MAXTRANSLATIONS && !((color - MAXSKINCOLORS) % 5))
return color;*/
for (color = 0; color < NUMSUPERCOLORS; color++)
if (!stricmp(Color_Names[color + MAXSKINCOLORS], name))
return ((color*5) + MAXSKINCOLORS);
return 0;
}
// ========================================================================== // ==========================================================================
// COMMON DRAWER FOR 8 AND 16 BIT COLOR MODES // COMMON DRAWER FOR 8 AND 16 BIT COLOR MODES
// ========================================================================== // ==========================================================================

View File

@ -111,6 +111,7 @@ void R_InitTranslationTables(void);
UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags); UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags);
void R_FlushTranslationColormapCache(void); void R_FlushTranslationColormapCache(void);
UINT8 R_GetColorByName(const char *name); UINT8 R_GetColorByName(const char *name);
UINT8 R_GetSuperColorByName(const char *name);
// Custom player skin translation // Custom player skin translation
void R_InitViewBuffer(INT32 width, INT32 height); void R_InitViewBuffer(INT32 width, INT32 height);

View File

@ -711,7 +711,7 @@ void R_DrawPlanes(void)
angle = (pl->viewangle + xtoviewangle[x])>>ANGLETOSKYSHIFT; angle = (pl->viewangle + xtoviewangle[x])>>ANGLETOSKYSHIFT;
dc_x = x; dc_x = x;
dc_source = dc_source =
R_GetColumn(skytexture, R_GetColumn(texturetranslation[skytexture],
angle); angle);
wallcolfunc(); wallcolfunc();
} }

View File

@ -18,6 +18,7 @@
#include "st_stuff.h" #include "st_stuff.h"
#include "w_wad.h" #include "w_wad.h"
#include "z_zone.h" #include "z_zone.h"
#include "m_menu.h" // character select
#include "m_misc.h" #include "m_misc.h"
#include "i_video.h" // rendermode #include "i_video.h" // rendermode
#include "r_things.h" #include "r_things.h"
@ -28,6 +29,7 @@
#include "dehacked.h" // get_number (for thok) #include "dehacked.h" // get_number (for thok)
#include "d_netfil.h" // blargh. for nameonly(). #include "d_netfil.h" // blargh. for nameonly().
#include "m_cheat.h" // objectplace #include "m_cheat.h" // objectplace
#include "m_cond.h"
#ifdef HWRENDER #ifdef HWRENDER
#include "hardware/hw_md2.h" #include "hardware/hw_md2.h"
#endif #endif
@ -2341,6 +2343,8 @@ static void Sk_SetDefaultValue(skin_t *skin)
skin->starttranscolor = 96; skin->starttranscolor = 96;
skin->prefcolor = SKINCOLOR_GREEN; skin->prefcolor = SKINCOLOR_GREEN;
skin->supercolor = SKINCOLOR_SUPERGOLD1;
skin->prefoppositecolor = 0; // use tables
skin->normalspeed = 36<<FRACBITS; skin->normalspeed = 36<<FRACBITS;
skin->runspeed = 28<<FRACBITS; skin->runspeed = 28<<FRACBITS;
@ -2353,7 +2357,14 @@ static void Sk_SetDefaultValue(skin_t *skin)
skin->jumpfactor = FRACUNIT; skin->jumpfactor = FRACUNIT;
skin->actionspd = 30<<FRACBITS; skin->actionspd = 30<<FRACBITS;
skin->mindash = 15<<FRACBITS; skin->mindash = 15<<FRACBITS;
skin->maxdash = 90<<FRACBITS; skin->maxdash = 70<<FRACBITS;
skin->radius = mobjinfo[MT_PLAYER].radius;
skin->height = mobjinfo[MT_PLAYER].height;
skin->spinheight = FixedMul(skin->height, 2*FRACUNIT/3);
skin->shieldscale = FRACUNIT;
skin->camerascale = FRACUNIT;
skin->thokitem = -1; skin->thokitem = -1;
skin->spinitem = -1; skin->spinitem = -1;
@ -2361,6 +2372,8 @@ static void Sk_SetDefaultValue(skin_t *skin)
skin->highresscale = FRACUNIT>>1; skin->highresscale = FRACUNIT>>1;
skin->availability = 0;
for (i = 0; i < sfx_skinsoundslot0; i++) for (i = 0; i < sfx_skinsoundslot0; i++)
if (S_sfx[i].skinsound != -1) if (S_sfx[i].skinsound != -1)
skin->soundsid[S_sfx[i].skinsound] = i; skin->soundsid[S_sfx[i].skinsound] = i;
@ -2385,6 +2398,19 @@ void R_InitSkins(void)
numskins = 0; numskins = 0;
} }
// returns true if available in circumstances, otherwise nope
// warning don't use with an invalid skinnum other than -1 which always returns true
boolean R_SkinUnlock(INT32 skinnum)
{
return ((skinnum == -1) // Simplifies things elsewhere, since there's already plenty of checks for less-than-0...
|| (!skins[skinnum].availability)
|| (unlockables[skins[skinnum].availability - 1].unlocked)
|| (modeattacking) // If you have someone else's run you might as well take a look
|| (Playing() && (R_SkinAvailable(mapheaderinfo[gamemap-1]->forcecharacter) == skinnum)) // Force 1.
|| (netgame && !(server || adminplayer == consoleplayer) && (cv_forceskin.value == skinnum)) // Force 2.
);
}
// returns true if the skin name is found (loaded from pwad) // returns true if the skin name is found (loaded from pwad)
// warning return -1 if not found // warning return -1 if not found
INT32 R_SkinAvailable(const char *name) INT32 R_SkinAvailable(const char *name)
@ -2393,6 +2419,7 @@ INT32 R_SkinAvailable(const char *name)
for (i = 0; i < numskins; i++) for (i = 0; i < numskins; i++)
{ {
// search in the skin list
if (stricmp(skins[i].name,name)==0) if (stricmp(skins[i].name,name)==0)
return i; return i;
} }
@ -2402,17 +2429,13 @@ INT32 R_SkinAvailable(const char *name)
// network code calls this when a 'skin change' is received // network code calls this when a 'skin change' is received
void SetPlayerSkin(INT32 playernum, const char *skinname) void SetPlayerSkin(INT32 playernum, const char *skinname)
{ {
INT32 i; INT32 i = R_SkinAvailable(skinname);
player_t *player = &players[playernum]; player_t *player = &players[playernum];
for (i = 0; i < numskins; i++) if ((i != -1) && (!P_IsLocalPlayer(player) || R_SkinUnlock(i)))
{ {
// search in the skin list SetPlayerSkinByNum(playernum, i);
if (stricmp(skins[i].name, skinname) == 0) return;
{
SetPlayerSkinByNum(playernum, i);
return;
}
} }
if (P_IsLocalPlayer(player)) if (P_IsLocalPlayer(player))
@ -2429,12 +2452,15 @@ void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum)
{ {
player_t *player = &players[playernum]; player_t *player = &players[playernum];
skin_t *skin = &skins[skinnum]; skin_t *skin = &skins[skinnum];
UINT8 newcolor = 0;
if (skinnum >= 0 && skinnum < numskins) // Make sure it exists! if ((skinnum >= 0 && skinnum < numskins) // Make sure it exists!
&& (!P_IsLocalPlayer(player) || R_SkinUnlock(skinnum))) // ...but is it allowed? We must always allow external players to change skin. The server should vet that...
{ {
player->skin = skinnum; player->skin = skinnum;
if (player->mo)
player->mo->skin = skin; player->camerascale = skin->camerascale;
player->shieldscale = skin->shieldscale;
player->charability = (UINT8)skin->ability; player->charability = (UINT8)skin->ability;
player->charability2 = (UINT8)skin->ability2; player->charability2 = (UINT8)skin->ability2;
@ -2457,21 +2483,35 @@ void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum)
player->jumpfactor = skin->jumpfactor; player->jumpfactor = skin->jumpfactor;
player->height = skin->height;
player->spinheight = skin->spinheight;
if (!(cv_debug || devparm) && !(netgame || multiplayer || demoplayback)) if (!(cv_debug || devparm) && !(netgame || multiplayer || demoplayback))
{ {
if (playernum == consoleplayer) if (playernum == consoleplayer)
CV_StealthSetValue(&cv_playercolor, skin->prefcolor); CV_StealthSetValue(&cv_playercolor, skin->prefcolor);
else if (playernum == secondarydisplayplayer) else if (playernum == secondarydisplayplayer)
CV_StealthSetValue(&cv_playercolor2, skin->prefcolor); CV_StealthSetValue(&cv_playercolor2, skin->prefcolor);
player->skincolor = skin->prefcolor; player->skincolor = newcolor = skin->prefcolor;
if (player->mo)
player->mo->color = player->skincolor;
} }
if (player->mo) if (player->mo)
{
if ((player->pflags & PF_NIGHTSMODE) && (skin->sprites[SPR2_NGT0].numframes == 0)) // If you don't have a sprite for flying horizontally, use the default NiGHTS skin.
{
skin = &skins[DEFAULTNIGHTSSKIN];
newcolor = ((skin->flags & SF_SUPER) ? skin->supercolor : skin->prefcolor);
}
player->mo->skin = skin;
if (newcolor)
player->mo->color = newcolor;
P_SetScale(player->mo, player->mo->scale); P_SetScale(player->mo, player->mo->scale);
player->mo->radius = FixedMul(skin->radius, player->mo->scale);
}
return; return;
} }
else if (skinnum >= 0 && skinnum < numskins)
skinnum = 255; // Cheeky emulation.
if (P_IsLocalPlayer(player)) if (P_IsLocalPlayer(player))
CONS_Alert(CONS_WARNING, M_GetText("Skin %d not found\n"), skinnum); CONS_Alert(CONS_WARNING, M_GetText("Skin %d not found\n"), skinnum);
@ -2566,15 +2606,12 @@ void R_AddSkins(UINT16 wadnum)
if (!stricmp(stoken, "name")) if (!stricmp(stoken, "name"))
{ {
// the skin name must uniquely identify a single skin INT32 skinnum = R_SkinAvailable(value);
// I'm lazy so if name is already used I leave the 'skin x' strlwr(value);
// default skin name set in Sk_SetDefaultValue if (skinnum == -1)
if (R_SkinAvailable(value) == -1)
{
STRBUFCPY(skin->name, value); STRBUFCPY(skin->name, value);
strlwr(skin->name); // the skin name must uniquely identify a single skin
} // if the name is already used I make the name 'namex'
// I'm not lazy, so if the name is already used I make the name 'namex'
// using the default skin name's number set above // using the default skin name's number set above
else else
{ {
@ -2585,11 +2622,9 @@ void R_AddSkins(UINT16 wadnum)
"%s%d", value, numskins); "%s%d", value, numskins);
value2[stringspace - 1] = '\0'; value2[stringspace - 1] = '\0';
if (R_SkinAvailable(value2) == -1) if (R_SkinAvailable(value2) == -1)
{ // I'm lazy so if NEW name is already used I leave the 'skin x'
STRBUFCPY(skin->name, // default skin name set in Sk_SetDefaultValue
value2); STRBUFCPY(skin->name, value2);
strlwr(skin->name);
}
Z_Free(value2); Z_Free(value2);
} }
@ -2657,13 +2692,18 @@ void R_AddSkins(UINT16 wadnum)
FULLPROCESS(revitem) FULLPROCESS(revitem)
#undef FULLPROCESS #undef FULLPROCESS
#define GETSPEED(field) else if (!stricmp(stoken, #field)) skin->field = atoi(value)<<FRACBITS; #define GETFRACBITS(field) else if (!stricmp(stoken, #field)) skin->field = atoi(value)<<FRACBITS;
GETSPEED(normalspeed) GETFRACBITS(normalspeed)
GETSPEED(runspeed) GETFRACBITS(runspeed)
GETSPEED(mindash)
GETSPEED(maxdash) GETFRACBITS(mindash)
GETSPEED(actionspd) GETFRACBITS(maxdash)
#undef GETSPEED GETFRACBITS(actionspd)
GETFRACBITS(radius)
GETFRACBITS(height)
GETFRACBITS(spinheight)
#undef GETFRACBITS
#define GETINT(field) else if (!stricmp(stoken, #field)) skin->field = atoi(value); #define GETINT(field) else if (!stricmp(stoken, #field)) skin->field = atoi(value);
GETINT(thrustfactor) GETINT(thrustfactor)
@ -2671,20 +2711,75 @@ void R_AddSkins(UINT16 wadnum)
GETINT(acceleration) GETINT(acceleration)
#undef GETINT #undef GETINT
else if (!stricmp(stoken, "availability"))
{
skin->availability = atoi(value);
if (skin->availability >= MAXUNLOCKABLES)
skin->availability = 0;
if (skin->availability)
STRBUFCPY(unlockables[skin->availability - 1].name, skin->realname);
}
// custom translation table // custom translation table
else if (!stricmp(stoken, "startcolor")) else if (!stricmp(stoken, "startcolor"))
skin->starttranscolor = atoi(value); skin->starttranscolor = atoi(value);
else if (!stricmp(stoken, "prefcolor")) #define GETSKINCOLOR(field) else if (!stricmp(stoken, #field)) skin->field = R_GetColorByName(value);
skin->prefcolor = R_GetColorByName(value); GETSKINCOLOR(prefcolor)
else if (!stricmp(stoken, "jumpfactor")) GETSKINCOLOR(prefoppositecolor)
skin->jumpfactor = FLOAT_TO_FIXED(atof(value)); #undef GETSKINCOLOR
else if (!stricmp(stoken, "highresscale")) else if (!stricmp(stoken, "supercolor"))
skin->highresscale = FLOAT_TO_FIXED(atof(value)); skin->supercolor = R_GetSuperColorByName(value);
else
#define GETFLOAT(field) else if (!stricmp(stoken, #field)) skin->field = FLOAT_TO_FIXED(atof(value));
GETFLOAT(jumpfactor)
GETFLOAT(highresscale)
GETFLOAT(shieldscale)
GETFLOAT(camerascale)
#undef GETFLOAT
#define GETFLAG(field) else if (!stricmp(stoken, #field)) { \
strupr(value); \
if (atoi(value) || value[0] == 'T' || value[0] == 'Y') \
skin->flags |= (SF_##field); \
else \
skin->flags &= ~(SF_##field); \
}
// parameters for individual character flags
// these are uppercase so they can be concatenated with SF_
// 1, true, yes are all valid values
GETFLAG(SUPER)
GETFLAG(SUPERANIMS)
GETFLAG(SUPERSPIN)
GETFLAG(HIRES)
GETFLAG(NOSKID)
GETFLAG(NOSPEEDADJUST)
GETFLAG(RUNONWATER)
GETFLAG(NOJUMPSPIN)
GETFLAG(NOJUMPDAMAGE)
GETFLAG(STOMPDAMAGE)
GETFLAG(MARIODAMAGE)
GETFLAG(MACHINE)
#undef GETFLAG
else // let's check if it's a sound, otherwise error out
{ {
INT32 found = false; boolean found = false;
sfxenum_t i; sfxenum_t i;
size_t stokenadjust;
// Remove the prefix. (We need to affect an adjusting variable so that we can print error messages if it's not actually a sound.)
if ((stoken[0] == 'D' || stoken[0] == 'd') && (stoken[1] == 'S' || stoken[1] == 's')) // DS*
stokenadjust = 2;
else // sfx_*
stokenadjust = 4;
// Remove the prefix. (We can affect this directly since we're not going to use it again.)
if ((value[0] == 'D' || value[0] == 'd') && (value[1] == 'S' || value[1] == 's')) // DS*
value += 2;
else // sfx_*
value += 4;
// copy name of sounds that are remapped // copy name of sounds that are remapped
// for this skin // for this skin
for (i = 0; i < sfx_skinsoundslot0; i++) for (i = 0; i < sfx_skinsoundslot0; i++)
@ -2693,15 +2788,15 @@ void R_AddSkins(UINT16 wadnum)
continue; continue;
if (S_sfx[i].skinsound != -1 if (S_sfx[i].skinsound != -1
&& !stricmp(S_sfx[i].name, && !stricmp(S_sfx[i].name,
stoken + 2)) stoken + stokenadjust))
{ {
skin->soundsid[S_sfx[i].skinsound] = skin->soundsid[S_sfx[i].skinsound] =
S_AddSoundFx(value+2, S_sfx[i].singularity, S_sfx[i].pitch, true); S_AddSoundFx(value, S_sfx[i].singularity, S_sfx[i].pitch, true);
found = true; found = true;
} }
} }
if (!found) if (!found)
CONS_Debug(DBG_SETUP, "R_AddSkins: Unknown keyword '%s' in S_SKIN lump# %d (WAD %s)\n", stoken, lump, wadfiles[wadnum]->filename); CONS_Debug(DBG_SETUP, "R_AddSkins: Unknown keyword '%s' in S_SKIN lump #%d (WAD %s)\n", stoken, lump, wadfiles[wadnum]->filename);
} }
next_token: next_token:
stoken = strtok(NULL, "\r\n= "); stoken = strtok(NULL, "\r\n= ");
@ -2728,7 +2823,8 @@ next_token:
R_FlushTranslationColormapCache(); R_FlushTranslationColormapCache();
CONS_Printf(M_GetText("Added skin '%s'\n"), skin->name); if (!skin->availability) // Safe to print...
CONS_Printf(M_GetText("Added skin '%s'\n"), skin->name);
#ifdef SKINVALUES #ifdef SKINVALUES
skin_cons_t[numskins].value = numskins; skin_cons_t[numskins].value = numskins;
skin_cons_t[numskins].strvalue = skin->name; skin_cons_t[numskins].strvalue = skin->name;

View File

@ -29,6 +29,8 @@
#define VISSPRITESPERCHUNK (1 << VISSPRITECHUNKBITS) #define VISSPRITESPERCHUNK (1 << VISSPRITECHUNKBITS)
#define VISSPRITEINDEXMASK (VISSPRITESPERCHUNK - 1) #define VISSPRITEINDEXMASK (VISSPRITESPERCHUNK - 1)
#define DEFAULTNIGHTSSKIN 0
// Constant arrays used for psprite clipping // Constant arrays used for psprite clipping
// and initializing clipping. // and initializing clipping.
extern INT16 negonearray[MAXVIDWIDTH]; extern INT16 negonearray[MAXVIDWIDTH];
@ -97,15 +99,27 @@ typedef struct
fixed_t jumpfactor; // multiple of standard jump height fixed_t jumpfactor; // multiple of standard jump height
fixed_t radius; // Bounding box changes.
fixed_t height;
fixed_t spinheight;
fixed_t shieldscale; // no change to bounding box, but helps set the shield's sprite size
fixed_t camerascale;
// Definable color translation table // Definable color translation table
UINT8 starttranscolor; UINT8 starttranscolor;
UINT8 prefcolor; UINT8 prefcolor;
UINT8 supercolor;
UINT8 prefoppositecolor; // if 0 use tables instead
fixed_t highresscale; // scale of highres, default is 0.5 fixed_t highresscale; // scale of highres, default is 0.5
// specific sounds per skin // specific sounds per skin
sfxenum_t soundsid[NUMSKINSOUNDS]; // sound # in S_sfx table sfxenum_t soundsid[NUMSKINSOUNDS]; // sound # in S_sfx table
spritedef_t sprites[NUMPLAYERSPRITES]; spritedef_t sprites[NUMPLAYERSPRITES];
UINT8 availability; // lock?
} skin_t; } skin_t;
// ----------- // -----------
@ -188,6 +202,7 @@ extern skin_t skins[MAXSKINS + 1];
void SetPlayerSkin(INT32 playernum,const char *skinname); void SetPlayerSkin(INT32 playernum,const char *skinname);
void SetPlayerSkinByNum(INT32 playernum,INT32 skinnum); // Tails 03-16-2002 void SetPlayerSkinByNum(INT32 playernum,INT32 skinnum); // Tails 03-16-2002
boolean R_SkinUnlock(INT32 skinnum);
INT32 R_SkinAvailable(const char *name); INT32 R_SkinAvailable(const char *name);
void R_AddSkins(UINT16 wadnum); void R_AddSkins(UINT16 wadnum);

View File

@ -565,7 +565,7 @@ static void ST_drawDebugInfo(void)
{ {
V_DrawRightAlignedString(320, height - 104, V_MONOSPACE, va("SHIELD: %5x", stplyr->powers[pw_shield])); V_DrawRightAlignedString(320, height - 104, V_MONOSPACE, va("SHIELD: %5x", stplyr->powers[pw_shield]));
V_DrawRightAlignedString(320, height - 96, V_MONOSPACE, va("SCALE: %5d%%", (stplyr->mo->scale*100)/FRACUNIT)); V_DrawRightAlignedString(320, height - 96, V_MONOSPACE, va("SCALE: %5d%%", (stplyr->mo->scale*100)/FRACUNIT));
V_DrawRightAlignedString(320, height - 88, V_MONOSPACE, va("DASH: %3d/%3d", stplyr->dashspeed>>FRACBITS, FixedMul(stplyr->maxdash,stplyr->mo->scale)>>FRACBITS)); V_DrawRightAlignedString(320, height - 88, V_MONOSPACE, va("DASH: %3d/%3d", stplyr->dashspeed>>FRACBITS, stplyr->maxdash>>FRACBITS));
V_DrawRightAlignedString(320, height - 80, V_MONOSPACE, va("AIR: %4d, %3d", stplyr->powers[pw_underwater], stplyr->powers[pw_spacetime])); V_DrawRightAlignedString(320, height - 80, V_MONOSPACE, va("AIR: %4d, %3d", stplyr->powers[pw_underwater], stplyr->powers[pw_spacetime]));
// Flags // Flags
@ -890,11 +890,19 @@ static void ST_drawFirstPersonHUD(void)
V_NOSCALESTART|V_OFFSET|V_TRANSLUCENT, p); V_NOSCALESTART|V_OFFSET|V_TRANSLUCENT, p);
} }
// [21:42] <+Rob> Beige - Lavender - Steel Blue - Peach - Orange - Purple - Silver - Yellow - Pink - Red - Blue - Green - Cyan - Gold // 2.0-1: [21:42] <+Rob> Beige - Lavender - Steel Blue - Peach - Orange - Purple - Silver - Yellow - Pink - Red - Blue - Green - Cyan - Gold
static skincolors_t linkColor[14] = /*#define NUMLINKCOLORS 14
static skincolors_t linkColor[NUMLINKCOLORS] =
{SKINCOLOR_BEIGE, SKINCOLOR_LAVENDER, SKINCOLOR_AZURE, SKINCOLOR_PEACH, SKINCOLOR_ORANGE, {SKINCOLOR_BEIGE, SKINCOLOR_LAVENDER, SKINCOLOR_AZURE, SKINCOLOR_PEACH, SKINCOLOR_ORANGE,
SKINCOLOR_MAGENTA, SKINCOLOR_SILVER, SKINCOLOR_SUPER4, SKINCOLOR_PINK, SKINCOLOR_RED, SKINCOLOR_MAGENTA, SKINCOLOR_SILVER, SKINCOLOR_SUPERGOLD4, SKINCOLOR_PINK, SKINCOLOR_RED,
SKINCOLOR_BLUE, SKINCOLOR_GREEN, SKINCOLOR_CYAN, SKINCOLOR_GOLD}; SKINCOLOR_BLUE, SKINCOLOR_GREEN, SKINCOLOR_CYAN, SKINCOLOR_GOLD};*/
// 2.2+: (unix time 1470866042) <Rob> Emerald, Aqua, Cyan, Blue, Pastel, Purple, Magenta, Rosy, Red, Orange, Gold, Yellow, Peridot
#define NUMLINKCOLORS 13
static skincolors_t linkColor[NUMLINKCOLORS] =
{SKINCOLOR_EMERALD, SKINCOLOR_AQUA, SKINCOLOR_CYAN, SKINCOLOR_BLUE, SKINCOLOR_PASTEL,
SKINCOLOR_PURPLE, SKINCOLOR_MAGENTA, SKINCOLOR_ROSY, SKINCOLOR_RED, SKINCOLOR_ORANGE,
SKINCOLOR_GOLD, SKINCOLOR_YELLOW, SKINCOLOR_PERIDOT};
static void ST_drawNightsRecords(void) static void ST_drawNightsRecords(void)
{ {
@ -994,7 +1002,7 @@ static void ST_drawNiGHTSHUD(void)
#endif #endif
stplyr->linkcount > minlink) stplyr->linkcount > minlink)
{ {
skincolors_t colornum = linkColor[((stplyr->linkcount-1) / 5) % (sizeof(linkColor) / sizeof(skincolors_t))]; skincolors_t colornum = linkColor[((stplyr->linkcount-1) / 5) % NUMLINKCOLORS];
if (stplyr->powers[pw_nights_linkfreeze]) if (stplyr->powers[pw_nights_linkfreeze])
colornum = SKINCOLOR_WHITE; colornum = SKINCOLOR_WHITE;
@ -1299,7 +1307,7 @@ static void ST_drawNiGHTSHUD(void)
nightsnum, SKINCOLOR_RED); nightsnum, SKINCOLOR_RED);
else else
ST_DrawNightsOverlayNum(160 + numbersize, STRINGY(12), SPLITFLAGS(V_SNAPTOTOP), realnightstime, ST_DrawNightsOverlayNum(160 + numbersize, STRINGY(12), SPLITFLAGS(V_SNAPTOTOP), realnightstime,
nightsnum, SKINCOLOR_SUPER4); nightsnum, SKINCOLOR_SUPERGOLD4);
// Show exact time in debug // Show exact time in debug
if (cv_debug & DBG_NIGHTSBASIC) if (cv_debug & DBG_NIGHTSBASIC)