mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-13 06:13:18 +00:00
Merge branch 'master' into hud-n-menu-tidbits
This commit is contained in:
commit
5eddb1f455
19 changed files with 373 additions and 181 deletions
|
@ -823,7 +823,6 @@ void D_RegisterClientCommands(void)
|
||||||
COM_AddCommand("getallemeralds", Command_Getallemeralds_f);
|
COM_AddCommand("getallemeralds", Command_Getallemeralds_f);
|
||||||
COM_AddCommand("resetemeralds", Command_Resetemeralds_f);
|
COM_AddCommand("resetemeralds", Command_Resetemeralds_f);
|
||||||
COM_AddCommand("setrings", Command_Setrings_f);
|
COM_AddCommand("setrings", Command_Setrings_f);
|
||||||
COM_AddCommand("setspheres", Command_Setspheres_f);
|
|
||||||
COM_AddCommand("setlives", Command_Setlives_f);
|
COM_AddCommand("setlives", Command_Setlives_f);
|
||||||
COM_AddCommand("setcontinues", Command_Setcontinues_f);
|
COM_AddCommand("setcontinues", Command_Setcontinues_f);
|
||||||
COM_AddCommand("devmode", Command_Devmode_f);
|
COM_AddCommand("devmode", Command_Devmode_f);
|
||||||
|
|
|
@ -382,7 +382,7 @@ typedef struct player_s
|
||||||
fixed_t height; // Bounding box changes.
|
fixed_t height; // Bounding box changes.
|
||||||
fixed_t spinheight;
|
fixed_t spinheight;
|
||||||
|
|
||||||
SINT8 lives;
|
SINT8 lives; // number of lives - if == INFLIVES, the player has infinite lives
|
||||||
SINT8 continues; // continues that player has acquired
|
SINT8 continues; // continues that player has acquired
|
||||||
|
|
||||||
SINT8 xtralife; // Ring Extra Life counter
|
SINT8 xtralife; // Ring Extra Life counter
|
||||||
|
@ -456,16 +456,25 @@ typedef struct player_s
|
||||||
boolean bonustime; // Capsule destroyed, now it's bonus time!
|
boolean bonustime; // Capsule destroyed, now it's bonus time!
|
||||||
mobj_t *capsule; // Go inside the capsule
|
mobj_t *capsule; // Go inside the capsule
|
||||||
UINT8 mare; // Current mare
|
UINT8 mare; // Current mare
|
||||||
|
UINT8 marelap; // Current mare lap
|
||||||
|
UINT8 marebonuslap; // Current mare lap starting from bonus time
|
||||||
|
|
||||||
// Statistical purposes.
|
// Statistical purposes.
|
||||||
tic_t marebegunat; // Leveltime when mare begun
|
tic_t marebegunat; // Leveltime when mare begun
|
||||||
tic_t startedtime; // Time which you started this mare with.
|
tic_t startedtime; // Time which you started this mare with.
|
||||||
tic_t finishedtime; // Time it took you to finish the mare (used for display)
|
tic_t finishedtime; // Time it took you to finish the mare (used for display)
|
||||||
|
tic_t lapbegunat; // Leveltime when lap begun
|
||||||
|
tic_t lapstartedtime; // Time which you started this lap with.
|
||||||
INT16 finishedspheres; // The spheres you had left upon finishing the mare
|
INT16 finishedspheres; // The spheres you had left upon finishing the mare
|
||||||
INT16 finishedrings; // The rings/stars you had left upon finishing the mare
|
INT16 finishedrings; // The rings/stars you had left upon finishing the mare
|
||||||
UINT32 marescore; // score for this nights stage
|
UINT32 marescore; // score for this nights stage
|
||||||
UINT32 lastmarescore; // score for the last mare
|
UINT32 lastmarescore; // score for the last mare
|
||||||
|
UINT32 totalmarescore; // score for all mares
|
||||||
UINT8 lastmare; // previous mare
|
UINT8 lastmare; // previous mare
|
||||||
|
UINT8 lastmarelap; // previous mare lap
|
||||||
|
UINT8 lastmarebonuslap; // previous mare bonus lap
|
||||||
|
UINT8 totalmarelap; // total mare lap
|
||||||
|
UINT8 totalmarebonuslap; // total mare bonus lap
|
||||||
INT32 maxlink; // maximum link obtained
|
INT32 maxlink; // maximum link obtained
|
||||||
UINT8 texttimer; // nights_texttime should not be local
|
UINT8 texttimer; // nights_texttime should not be local
|
||||||
UINT8 textvar; // which line of NiGHTS text to show -- let's not use cheap hacks
|
UINT8 textvar; // which line of NiGHTS text to show -- let's not use cheap hacks
|
||||||
|
@ -491,4 +500,7 @@ typedef struct player_s
|
||||||
#endif
|
#endif
|
||||||
} player_t;
|
} player_t;
|
||||||
|
|
||||||
|
// Value for infinite lives
|
||||||
|
#define INFLIVES 0x7F
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1203,6 +1203,8 @@ static void readlevelheader(MYFILE *f, INT32 num)
|
||||||
deh_warning("Level header %d: invalid bonus type number %d", num, i);
|
deh_warning("Level header %d: invalid bonus type number %d", num, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (fastcmp(word, "MAXBONUSLIVES"))
|
||||||
|
mapheaderinfo[num-1]->maxbonuslives = (SINT8)i;
|
||||||
else if (fastcmp(word, "LEVELFLAGS"))
|
else if (fastcmp(word, "LEVELFLAGS"))
|
||||||
mapheaderinfo[num-1]->levelflags = (UINT8)i;
|
mapheaderinfo[num-1]->levelflags = (UINT8)i;
|
||||||
else if (fastcmp(word, "MENUFLAGS"))
|
else if (fastcmp(word, "MENUFLAGS"))
|
||||||
|
@ -7612,6 +7614,9 @@ struct {
|
||||||
{"WEP_RAIL",WEP_RAIL},
|
{"WEP_RAIL",WEP_RAIL},
|
||||||
{"NUM_WEAPONS",NUM_WEAPONS},
|
{"NUM_WEAPONS",NUM_WEAPONS},
|
||||||
|
|
||||||
|
// Value for infinite lives
|
||||||
|
{"INFLIVES", INFLIVES},
|
||||||
|
|
||||||
// Got Flags, for player->gotflag!
|
// Got Flags, for player->gotflag!
|
||||||
// Used to be MF_ for some stupid reason, now they're GF_ to stop them looking like mobjflags
|
// Used to be MF_ for some stupid reason, now they're GF_ to stop them looking like mobjflags
|
||||||
{"GF_REDFLAG",GF_REDFLAG},
|
{"GF_REDFLAG",GF_REDFLAG},
|
||||||
|
|
|
@ -244,6 +244,7 @@ typedef struct
|
||||||
SINT8 unlockrequired; ///< Is an unlockable required to play this level? -1 if no.
|
SINT8 unlockrequired; ///< Is an unlockable required to play this level? -1 if no.
|
||||||
UINT8 levelselect; ///< Is this map available in the level select? If so, which map list is it available in?
|
UINT8 levelselect; ///< Is this map available in the level select? If so, which map list is it available in?
|
||||||
SINT8 bonustype; ///< What type of bonus does this level have? (-1 for null.)
|
SINT8 bonustype; ///< What type of bonus does this level have? (-1 for null.)
|
||||||
|
SINT8 maxbonuslives; ///< How many bonus lives to award at Intermission? (-1 for unlimited.)
|
||||||
|
|
||||||
UINT8 levelflags; ///< LF_flags: merged eight booleans into one UINT8 for space, see below
|
UINT8 levelflags; ///< LF_flags: merged eight booleans into one UINT8 for space, see below
|
||||||
UINT8 menuflags; ///< LF2_flags: options that affect record attack / nights mode menus
|
UINT8 menuflags; ///< LF2_flags: options that affect record attack / nights mode menus
|
||||||
|
|
|
@ -2259,6 +2259,8 @@ void G_PlayerReborn(INT32 player)
|
||||||
if (p->mare == 255)
|
if (p->mare == 255)
|
||||||
p->mare = 0;
|
p->mare = 0;
|
||||||
|
|
||||||
|
p->marelap = p->marebonuslap = 0;
|
||||||
|
|
||||||
// Check to make sure their color didn't change somehow...
|
// Check to make sure their color didn't change somehow...
|
||||||
if (G_GametypeHasTeams())
|
if (G_GametypeHasTeams())
|
||||||
{
|
{
|
||||||
|
|
|
@ -1304,7 +1304,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (G_GametypeUsesLives() && !(gametype == GT_COOP && (cv_cooplives.value == 0 || cv_cooplives.value == 3)) && (players[tab[i].num].lives != 0x7f)) //show lives
|
if (G_GametypeUsesLives() && !(gametype == GT_COOP && (cv_cooplives.value == 0 || cv_cooplives.value == 3)) && (players[tab[i].num].lives != INFLIVES)) //show lives
|
||||||
V_DrawRightAlignedString(x, y+4, V_ALLOWLOWERCASE|(greycheck ? V_60TRANS : 0), va("%dx", players[tab[i].num].lives));
|
V_DrawRightAlignedString(x, y+4, V_ALLOWLOWERCASE|(greycheck ? V_60TRANS : 0), va("%dx", players[tab[i].num].lives));
|
||||||
else if (G_TagGametype() && players[tab[i].num].pflags & PF_TAGIT)
|
else if (G_TagGametype() && players[tab[i].num].pflags & PF_TAGIT)
|
||||||
{
|
{
|
||||||
|
@ -1442,7 +1442,7 @@ void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scoreline
|
||||||
| (greycheck ? V_TRANSLUCENT : 0)
|
| (greycheck ? V_TRANSLUCENT : 0)
|
||||||
| V_ALLOWLOWERCASE, name);
|
| V_ALLOWLOWERCASE, name);
|
||||||
|
|
||||||
if (G_GametypeUsesLives() && !(gametype == GT_COOP && (cv_cooplives.value == 0 || cv_cooplives.value == 3)) && (players[tab[i].num].lives != 0x7f)) //show lives
|
if (G_GametypeUsesLives() && !(gametype == GT_COOP && (cv_cooplives.value == 0 || cv_cooplives.value == 3)) && (players[tab[i].num].lives != INFLIVES)) //show lives
|
||||||
V_DrawRightAlignedString(x, y+4, V_ALLOWLOWERCASE, va("%dx", players[tab[i].num].lives));
|
V_DrawRightAlignedString(x, y+4, V_ALLOWLOWERCASE, va("%dx", players[tab[i].num].lives));
|
||||||
else if (G_TagGametype() && players[tab[i].num].pflags & PF_TAGIT)
|
else if (G_TagGametype() && players[tab[i].num].pflags & PF_TAGIT)
|
||||||
V_DrawSmallScaledPatch(x-28, y-4, 0, tagico);
|
V_DrawSmallScaledPatch(x-28, y-4, 0, tagico);
|
||||||
|
|
|
@ -1797,6 +1797,8 @@ static int mapheaderinfo_get(lua_State *L)
|
||||||
lua_pushinteger(L, header->levelselect);
|
lua_pushinteger(L, header->levelselect);
|
||||||
else if (fastcmp(field,"bonustype"))
|
else if (fastcmp(field,"bonustype"))
|
||||||
lua_pushinteger(L, header->bonustype);
|
lua_pushinteger(L, header->bonustype);
|
||||||
|
else if (fastcmp(field,"maxbonuslives"))
|
||||||
|
lua_pushinteger(L, header->maxbonuslives);
|
||||||
else if (fastcmp(field,"levelflags"))
|
else if (fastcmp(field,"levelflags"))
|
||||||
lua_pushinteger(L, header->levelflags);
|
lua_pushinteger(L, header->levelflags);
|
||||||
else if (fastcmp(field,"menuflags"))
|
else if (fastcmp(field,"menuflags"))
|
||||||
|
|
|
@ -290,12 +290,20 @@ static int player_get(lua_State *L)
|
||||||
LUA_PushUserdata(L, plr->capsule, META_MOBJ);
|
LUA_PushUserdata(L, plr->capsule, META_MOBJ);
|
||||||
else if (fastcmp(field,"mare"))
|
else if (fastcmp(field,"mare"))
|
||||||
lua_pushinteger(L, plr->mare);
|
lua_pushinteger(L, plr->mare);
|
||||||
|
else if (fastcmp(field,"marelap"))
|
||||||
|
lua_pushinteger(L, plr->marelap);
|
||||||
|
else if (fastcmp(field,"marebonuslap"))
|
||||||
|
lua_pushinteger(L, plr->marebonuslap);
|
||||||
else if (fastcmp(field,"marebegunat"))
|
else if (fastcmp(field,"marebegunat"))
|
||||||
lua_pushinteger(L, plr->marebegunat);
|
lua_pushinteger(L, plr->marebegunat);
|
||||||
else if (fastcmp(field,"startedtime"))
|
else if (fastcmp(field,"startedtime"))
|
||||||
lua_pushinteger(L, plr->startedtime);
|
lua_pushinteger(L, plr->startedtime);
|
||||||
else if (fastcmp(field,"finishedtime"))
|
else if (fastcmp(field,"finishedtime"))
|
||||||
lua_pushinteger(L, plr->finishedtime);
|
lua_pushinteger(L, plr->finishedtime);
|
||||||
|
else if (fastcmp(field,"lapbegunat"))
|
||||||
|
lua_pushinteger(L, plr->lapbegunat);
|
||||||
|
else if (fastcmp(field,"lapstartedtime"))
|
||||||
|
lua_pushinteger(L, plr->lapstartedtime);
|
||||||
else if (fastcmp(field,"finishedspheres"))
|
else if (fastcmp(field,"finishedspheres"))
|
||||||
lua_pushinteger(L, plr->finishedspheres);
|
lua_pushinteger(L, plr->finishedspheres);
|
||||||
else if (fastcmp(field,"finishedrings"))
|
else if (fastcmp(field,"finishedrings"))
|
||||||
|
@ -304,8 +312,18 @@ static int player_get(lua_State *L)
|
||||||
lua_pushinteger(L, plr->marescore);
|
lua_pushinteger(L, plr->marescore);
|
||||||
else if (fastcmp(field,"lastmarescore"))
|
else if (fastcmp(field,"lastmarescore"))
|
||||||
lua_pushinteger(L, plr->lastmarescore);
|
lua_pushinteger(L, plr->lastmarescore);
|
||||||
|
else if (fastcmp(field,"totalmarescore"))
|
||||||
|
lua_pushinteger(L, plr->totalmarescore);
|
||||||
else if (fastcmp(field,"lastmare"))
|
else if (fastcmp(field,"lastmare"))
|
||||||
lua_pushinteger(L, plr->lastmare);
|
lua_pushinteger(L, plr->lastmare);
|
||||||
|
else if (fastcmp(field,"lastmarelap"))
|
||||||
|
lua_pushinteger(L, plr->lastmarelap);
|
||||||
|
else if (fastcmp(field,"lastmarebonuslap"))
|
||||||
|
lua_pushinteger(L, plr->lastmarebonuslap);
|
||||||
|
else if (fastcmp(field,"totalmarelap"))
|
||||||
|
lua_pushinteger(L, plr->totalmarelap);
|
||||||
|
else if (fastcmp(field,"totalmarebonuslap"))
|
||||||
|
lua_pushinteger(L, plr->totalmarebonuslap);
|
||||||
else if (fastcmp(field,"maxlink"))
|
else if (fastcmp(field,"maxlink"))
|
||||||
lua_pushinteger(L, plr->maxlink);
|
lua_pushinteger(L, plr->maxlink);
|
||||||
else if (fastcmp(field,"texttimer"))
|
else if (fastcmp(field,"texttimer"))
|
||||||
|
@ -570,12 +588,20 @@ static int player_set(lua_State *L)
|
||||||
}
|
}
|
||||||
else if (fastcmp(field,"mare"))
|
else if (fastcmp(field,"mare"))
|
||||||
plr->mare = (UINT8)luaL_checkinteger(L, 3);
|
plr->mare = (UINT8)luaL_checkinteger(L, 3);
|
||||||
|
else if (fastcmp(field,"marelap"))
|
||||||
|
plr->marelap = (UINT8)luaL_checkinteger(L, 3);
|
||||||
|
else if (fastcmp(field,"marebonuslap"))
|
||||||
|
plr->marebonuslap = (UINT8)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"marebegunat"))
|
else if (fastcmp(field,"marebegunat"))
|
||||||
plr->marebegunat = (tic_t)luaL_checkinteger(L, 3);
|
plr->marebegunat = (tic_t)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"startedtime"))
|
else if (fastcmp(field,"startedtime"))
|
||||||
plr->startedtime = (tic_t)luaL_checkinteger(L, 3);
|
plr->startedtime = (tic_t)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"finishedtime"))
|
else if (fastcmp(field,"finishedtime"))
|
||||||
plr->finishedtime = (tic_t)luaL_checkinteger(L, 3);
|
plr->finishedtime = (tic_t)luaL_checkinteger(L, 3);
|
||||||
|
else if (fastcmp(field,"lapbegunat"))
|
||||||
|
plr->lapbegunat = (tic_t)luaL_checkinteger(L, 3);
|
||||||
|
else if (fastcmp(field,"lapstartedtime"))
|
||||||
|
plr->lapstartedtime = (tic_t)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"finishedspheres"))
|
else if (fastcmp(field,"finishedspheres"))
|
||||||
plr->finishedspheres = (INT16)luaL_checkinteger(L, 3);
|
plr->finishedspheres = (INT16)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"finishedrings"))
|
else if (fastcmp(field,"finishedrings"))
|
||||||
|
@ -584,8 +610,18 @@ static int player_set(lua_State *L)
|
||||||
plr->marescore = (UINT32)luaL_checkinteger(L, 3);
|
plr->marescore = (UINT32)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"lastmarescore"))
|
else if (fastcmp(field,"lastmarescore"))
|
||||||
plr->lastmarescore = (UINT32)luaL_checkinteger(L, 3);
|
plr->lastmarescore = (UINT32)luaL_checkinteger(L, 3);
|
||||||
|
else if (fastcmp(field,"totalmarescore"))
|
||||||
|
plr->totalmarescore = (UINT32)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"lastmare"))
|
else if (fastcmp(field,"lastmare"))
|
||||||
plr->lastmare = (UINT8)luaL_checkinteger(L, 3);
|
plr->lastmare = (UINT8)luaL_checkinteger(L, 3);
|
||||||
|
else if (fastcmp(field,"lastmarelap"))
|
||||||
|
plr->lastmarelap = (UINT8)luaL_checkinteger(L, 3);
|
||||||
|
else if (fastcmp(field,"lastmarebonuslap"))
|
||||||
|
plr->lastmarebonuslap = (UINT8)luaL_checkinteger(L, 3);
|
||||||
|
else if (fastcmp(field,"totalmarelap"))
|
||||||
|
plr->totalmarelap = (UINT8)luaL_checkinteger(L, 3);
|
||||||
|
else if (fastcmp(field,"totalmarebonuslap"))
|
||||||
|
plr->totalmarebonuslap = (UINT8)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"maxlink"))
|
else if (fastcmp(field,"maxlink"))
|
||||||
plr->maxlink = (INT32)luaL_checkinteger(L, 3);
|
plr->maxlink = (INT32)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"texttimer"))
|
else if (fastcmp(field,"texttimer"))
|
||||||
|
|
|
@ -879,29 +879,20 @@ void Command_Setrings_f(void)
|
||||||
REQUIRE_PANDORA;
|
REQUIRE_PANDORA;
|
||||||
|
|
||||||
if (COM_Argc() > 1)
|
if (COM_Argc() > 1)
|
||||||
|
{
|
||||||
|
if (!(maptol & TOL_NIGHTS))
|
||||||
{
|
{
|
||||||
// P_GivePlayerRings does value clamping
|
// P_GivePlayerRings does value clamping
|
||||||
players[consoleplayer].rings = 0;
|
players[consoleplayer].rings = 0;
|
||||||
P_GivePlayerRings(&players[consoleplayer], atoi(COM_Argv(1)));
|
P_GivePlayerRings(&players[consoleplayer], atoi(COM_Argv(1)));
|
||||||
if (!G_IsSpecialStage(gamemap) || !(maptol & TOL_NIGHTS))
|
|
||||||
players[consoleplayer].totalring -= atoi(COM_Argv(1)); //undo totalring addition done in P_GivePlayerRings
|
players[consoleplayer].totalring -= atoi(COM_Argv(1)); //undo totalring addition done in P_GivePlayerRings
|
||||||
|
|
||||||
G_SetGameModified(multiplayer);
|
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
|
|
||||||
void Command_Setspheres_f(void)
|
|
||||||
{
|
|
||||||
REQUIRE_INLEVEL;
|
|
||||||
REQUIRE_SINGLEPLAYER;
|
|
||||||
REQUIRE_NOULTIMATE;
|
|
||||||
REQUIRE_PANDORA;
|
|
||||||
|
|
||||||
if (COM_Argc() > 1)
|
|
||||||
{
|
{
|
||||||
// P_GivePlayerRings does value clamping
|
|
||||||
players[consoleplayer].spheres = 0;
|
players[consoleplayer].spheres = 0;
|
||||||
P_GivePlayerSpheres(&players[consoleplayer], atoi(COM_Argv(1)));
|
P_GivePlayerSpheres(&players[consoleplayer], atoi(COM_Argv(1)));
|
||||||
|
// no totalsphere addition to revert
|
||||||
|
}
|
||||||
|
|
||||||
G_SetGameModified(multiplayer);
|
G_SetGameModified(multiplayer);
|
||||||
}
|
}
|
||||||
|
@ -918,7 +909,7 @@ void Command_Setlives_f(void)
|
||||||
{
|
{
|
||||||
SINT8 lives = atoi(COM_Argv(1));
|
SINT8 lives = atoi(COM_Argv(1));
|
||||||
if (lives == -1)
|
if (lives == -1)
|
||||||
players[consoleplayer].lives = 0x7f; // infinity!
|
players[consoleplayer].lives = INFLIVES; // infinity!
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// P_GivePlayerLives does value clamping
|
// P_GivePlayerLives does value clamping
|
||||||
|
@ -1189,11 +1180,52 @@ void OP_NightsObjectplace(player_t *player)
|
||||||
// This places a bumper!
|
// This places a bumper!
|
||||||
if (cmd->buttons & BT_TOSSFLAG)
|
if (cmd->buttons & BT_TOSSFLAG)
|
||||||
{
|
{
|
||||||
|
UINT16 vertangle = (UINT16)(player->anotherflyangle % 360);
|
||||||
|
UINT16 newflags, newz;
|
||||||
|
|
||||||
player->pflags |= PF_ATTACKDOWN;
|
player->pflags |= PF_ATTACKDOWN;
|
||||||
if (!OP_HeightOkay(player, false))
|
if (!OP_HeightOkay(player, false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mt = OP_CreateNewMapThing(player, (UINT16)mobjinfo[MT_NIGHTSBUMPER].doomednum, false);
|
mt = OP_CreateNewMapThing(player, (UINT16)mobjinfo[MT_NIGHTSBUMPER].doomednum, false);
|
||||||
|
newz = min((mt->options >> ZSHIFT) - (mobjinfo[MT_NIGHTSBUMPER].height/4), 0);
|
||||||
|
// height offset: from P_TouchSpecialThing case MT_NIGHTSBUMPER
|
||||||
|
|
||||||
|
// clockwise
|
||||||
|
if (vertangle >= 75 && vertangle < 105) // up
|
||||||
|
newflags = 3;
|
||||||
|
else if (vertangle >= 105 && vertangle < 135) // 60 upward tilt
|
||||||
|
newflags = 2;
|
||||||
|
else if (vertangle >= 135 && vertangle < 165) // 30 upward tilt
|
||||||
|
newflags = 1;
|
||||||
|
//else if (vertangle >= 165 && vertangle < 195) // forward, see else case
|
||||||
|
// newflags = 0;
|
||||||
|
else if (vertangle >= 195 && vertangle < 225) // 30 downward tilt
|
||||||
|
newflags = 11;
|
||||||
|
else if (vertangle >= 225 && vertangle < 255) // 60 downward tilt
|
||||||
|
newflags = 10;
|
||||||
|
else if (vertangle >= 255 && vertangle < 285) // down
|
||||||
|
newflags = 9;
|
||||||
|
else if (vertangle >= 285 && vertangle < 315) // 60 downward tilt backwards
|
||||||
|
newflags = 8;
|
||||||
|
else if (vertangle >= 315 && vertangle < 345) // 30 downward tilt backwards
|
||||||
|
newflags = 7;
|
||||||
|
else if (vertangle >= 345 || vertangle < 15) // backwards
|
||||||
|
newflags = 6;
|
||||||
|
else if (vertangle >= 15 && vertangle < 45) // 30 upward tilt backwards
|
||||||
|
newflags = 5;
|
||||||
|
else if (vertangle >= 45 && vertangle < 75) // 60 upward tilt backwards
|
||||||
|
newflags = 4;
|
||||||
|
else // forward
|
||||||
|
newflags = 0;
|
||||||
|
|
||||||
|
mt->options = (newz << ZSHIFT) | newflags;
|
||||||
|
|
||||||
|
// if NiGHTS is facing backwards, orient the Thing angle forwards so that the sprite angle
|
||||||
|
// displays correctly. Backwards movement via the Thing flags is unaffected.
|
||||||
|
if (vertangle < 90 || vertangle > 270)
|
||||||
|
mt->angle = (mt->angle + 180) % 360;
|
||||||
|
|
||||||
P_SpawnMapThing(mt);
|
P_SpawnMapThing(mt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,6 @@ void Command_Savecheckpoint_f(void);
|
||||||
void Command_Getallemeralds_f(void);
|
void Command_Getallemeralds_f(void);
|
||||||
void Command_Resetemeralds_f(void);
|
void Command_Resetemeralds_f(void);
|
||||||
void Command_Setrings_f(void);
|
void Command_Setrings_f(void);
|
||||||
void Command_Setspheres_f(void);
|
|
||||||
void Command_Setlives_f(void);
|
void Command_Setlives_f(void);
|
||||||
void Command_Setcontinues_f(void);
|
void Command_Setcontinues_f(void);
|
||||||
void Command_Devmode_f(void);
|
void Command_Devmode_f(void);
|
||||||
|
|
|
@ -5275,7 +5275,7 @@ static void M_PandorasBox(INT32 choice)
|
||||||
CV_StealthSetValue(&cv_dummyrings, max(players[consoleplayer].spheres, 0));
|
CV_StealthSetValue(&cv_dummyrings, max(players[consoleplayer].spheres, 0));
|
||||||
else
|
else
|
||||||
CV_StealthSetValue(&cv_dummyrings, max(players[consoleplayer].rings, 0));
|
CV_StealthSetValue(&cv_dummyrings, max(players[consoleplayer].rings, 0));
|
||||||
if (players[consoleplayer].lives == 0x7f)
|
if (players[consoleplayer].lives == INFLIVES)
|
||||||
CV_StealthSetValue(&cv_dummylives, -1);
|
CV_StealthSetValue(&cv_dummylives, -1);
|
||||||
else
|
else
|
||||||
CV_StealthSetValue(&cv_dummylives, players[consoleplayer].lives);
|
CV_StealthSetValue(&cv_dummylives, players[consoleplayer].lives);
|
||||||
|
@ -6332,7 +6332,7 @@ skipsign:
|
||||||
y += 25;
|
y += 25;
|
||||||
|
|
||||||
tempx = x + 10;
|
tempx = x + 10;
|
||||||
if (savegameinfo[savetodraw].lives != 0x7f
|
if (savegameinfo[savetodraw].lives != INFLIVES
|
||||||
&& savegameinfo[savetodraw].lives > 9)
|
&& savegameinfo[savetodraw].lives > 9)
|
||||||
tempx -= 4;
|
tempx -= 4;
|
||||||
|
|
||||||
|
@ -6359,7 +6359,7 @@ skiplife:
|
||||||
|
|
||||||
V_DrawScaledPatch(tempx + 9, y + 2, 0, patch);
|
V_DrawScaledPatch(tempx + 9, y + 2, 0, patch);
|
||||||
tempx += 16;
|
tempx += 16;
|
||||||
if (savegameinfo[savetodraw].lives == 0x7f)
|
if (savegameinfo[savetodraw].lives == INFLIVES)
|
||||||
V_DrawCharacter(tempx, y + 1, '\x16', false);
|
V_DrawCharacter(tempx, y + 1, '\x16', false);
|
||||||
else
|
else
|
||||||
V_DrawString(tempx, y, 0, va("%d", savegameinfo[savetodraw].lives));
|
V_DrawString(tempx, y, 0, va("%d", savegameinfo[savetodraw].lives));
|
||||||
|
|
|
@ -1005,13 +1005,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
player->flyangle = special->threshold;
|
player->flyangle = special->threshold;
|
||||||
|
|
||||||
player->speed = FixedMul(special->info->speed, special->scale);
|
player->speed = FixedMul(special->info->speed, special->scale);
|
||||||
// Potentially causes axis transfer failures.
|
P_SetTarget(&player->mo->hnext, special); // Reference bumper for position correction on next tic
|
||||||
// Also rarely worked properly anyway.
|
|
||||||
//P_UnsetThingPosition(player->mo);
|
|
||||||
//player->mo->x = special->x;
|
|
||||||
//player->mo->y = special->y;
|
|
||||||
//P_SetThingPosition(player->mo);
|
|
||||||
toucher->z = special->z+(special->height/4);
|
|
||||||
}
|
}
|
||||||
else // More like a spring
|
else // More like a spring
|
||||||
{
|
{
|
||||||
|
@ -1134,6 +1128,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
{
|
{
|
||||||
player->nightstime += special->info->speed;
|
player->nightstime += special->info->speed;
|
||||||
player->startedtime += special->info->speed;
|
player->startedtime += special->info->speed;
|
||||||
|
player->lapstartedtime += special->info->speed;
|
||||||
P_RestoreMusic(player);
|
P_RestoreMusic(player);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1143,6 +1138,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
{
|
{
|
||||||
players[i].nightstime += special->info->speed;
|
players[i].nightstime += special->info->speed;
|
||||||
players[i].startedtime += special->info->speed;
|
players[i].startedtime += special->info->speed;
|
||||||
|
players[i].lapstartedtime += special->info->speed;
|
||||||
P_RestoreMusic(&players[i]);
|
P_RestoreMusic(&players[i]);
|
||||||
}
|
}
|
||||||
if (special->info->deathsound != sfx_None)
|
if (special->info->deathsound != sfx_None)
|
||||||
|
@ -2253,7 +2249,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
||||||
|
|
||||||
if ((target->player->lives <= 1) && (netgame || multiplayer) && (gametype == GT_COOP) && (cv_cooplives.value == 0))
|
if ((target->player->lives <= 1) && (netgame || multiplayer) && (gametype == GT_COOP) && (cv_cooplives.value == 0))
|
||||||
;
|
;
|
||||||
else if (!target->player->bot && !target->player->spectator && !G_IsSpecialStage(gamemap) && (target->player->lives != 0x7f)
|
else if (!target->player->bot && !target->player->spectator && !G_IsSpecialStage(gamemap) && (target->player->lives != INFLIVES)
|
||||||
&& G_GametypeUsesLives())
|
&& G_GametypeUsesLives())
|
||||||
{
|
{
|
||||||
target->player->lives -= 1; // Lose a life Tails 03-11-2000
|
target->player->lives -= 1; // Lose a life Tails 03-11-2000
|
||||||
|
|
19
src/p_map.c
19
src/p_map.c
|
@ -1097,25 +1097,36 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||||
P_SetTarget(&thing->target, tmthing);
|
P_SetTarget(&thing->target, tmthing);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Respawn rings and items
|
// NiGHTS lap logic
|
||||||
if ((tmthing->type == MT_NIGHTSDRONE || thing->type == MT_NIGHTSDRONE)
|
if ((tmthing->type == MT_NIGHTSDRONE || thing->type == MT_NIGHTSDRONE)
|
||||||
&& (tmthing->player || thing->player))
|
&& (tmthing->player || thing->player))
|
||||||
{
|
{
|
||||||
mobj_t *droneobj = (tmthing->type == MT_NIGHTSDRONE) ? tmthing : thing;
|
mobj_t *droneobj = (tmthing->type == MT_NIGHTSDRONE) ? tmthing : thing;
|
||||||
player_t *pl = (droneobj == thing) ? tmthing->player : thing->player;
|
player_t *pl = (droneobj == thing) ? tmthing->player : thing->player;
|
||||||
|
|
||||||
// Must be in bonus time, and must be NiGHTS, must wait about a second
|
// Must be NiGHTS, must wait about a second
|
||||||
// must be flying in the SAME DIRECTION as the last time you came through.
|
// must be flying in the SAME DIRECTION as the last time you came through.
|
||||||
// not (your direction) xor (stored direction)
|
// not (your direction) xor (stored direction)
|
||||||
// In other words, you can't u-turn and respawn rings near the drone.
|
// In other words, you can't u-turn and respawn rings near the drone.
|
||||||
if (pl->bonustime && (pl->powers[pw_carry] == CR_NIGHTSMODE) && (INT32)leveltime > droneobj->extravalue2 && (
|
if ((pl->powers[pw_carry] == CR_NIGHTSMODE) && (INT32)leveltime > droneobj->extravalue2 && (
|
||||||
!(pl->flyangle > 90 && pl->flyangle < 270)
|
!(pl->flyangle > 90 && pl->flyangle < 270)
|
||||||
^ (droneobj->extravalue1 > 90 && droneobj->extravalue1 < 270)
|
^ (droneobj->extravalue1 > 90 && droneobj->extravalue1 < 270)
|
||||||
))
|
))
|
||||||
{
|
{
|
||||||
// Reload all the fancy ring stuff!
|
pl->marelap++;
|
||||||
|
pl->totalmarelap++;
|
||||||
|
pl->lapbegunat = leveltime;
|
||||||
|
pl->lapstartedtime = pl->nightstime;
|
||||||
|
|
||||||
|
if (pl->bonustime)
|
||||||
|
{
|
||||||
|
pl->marebonuslap++;
|
||||||
|
pl->totalmarebonuslap++;
|
||||||
|
|
||||||
|
// Respawn rings and items
|
||||||
P_ReloadRings();
|
P_ReloadRings();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
droneobj->extravalue1 = pl->flyangle;
|
droneobj->extravalue1 = pl->flyangle;
|
||||||
droneobj->extravalue2 = (INT32)leveltime + TICRATE;
|
droneobj->extravalue2 = (INT32)leveltime + TICRATE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,15 +198,24 @@ static void P_NetArchivePlayers(void)
|
||||||
WRITEUINT8(save_p, players[i].drilldelay);
|
WRITEUINT8(save_p, players[i].drilldelay);
|
||||||
WRITEUINT8(save_p, players[i].bonustime);
|
WRITEUINT8(save_p, players[i].bonustime);
|
||||||
WRITEUINT8(save_p, players[i].mare);
|
WRITEUINT8(save_p, players[i].mare);
|
||||||
|
WRITEUINT8(save_p, players[i].marelap);
|
||||||
|
WRITEUINT8(save_p, players[i].marebonuslap);
|
||||||
|
|
||||||
WRITEUINT32(save_p, players[i].marebegunat);
|
WRITEUINT32(save_p, players[i].marebegunat);
|
||||||
WRITEUINT32(save_p, players[i].startedtime);
|
WRITEUINT32(save_p, players[i].startedtime);
|
||||||
WRITEUINT32(save_p, players[i].finishedtime);
|
WRITEUINT32(save_p, players[i].finishedtime);
|
||||||
|
WRITEUINT32(save_p, players[i].lapbegunat);
|
||||||
|
WRITEUINT32(save_p, players[i].lapstartedtime);
|
||||||
WRITEINT16(save_p, players[i].finishedspheres);
|
WRITEINT16(save_p, players[i].finishedspheres);
|
||||||
WRITEINT16(save_p, players[i].finishedrings);
|
WRITEINT16(save_p, players[i].finishedrings);
|
||||||
WRITEUINT32(save_p, players[i].marescore);
|
WRITEUINT32(save_p, players[i].marescore);
|
||||||
WRITEUINT32(save_p, players[i].lastmarescore);
|
WRITEUINT32(save_p, players[i].lastmarescore);
|
||||||
|
WRITEUINT32(save_p, players[i].totalmarescore);
|
||||||
WRITEUINT8(save_p, players[i].lastmare);
|
WRITEUINT8(save_p, players[i].lastmare);
|
||||||
|
WRITEUINT8(save_p, players[i].lastmarelap);
|
||||||
|
WRITEUINT8(save_p, players[i].lastmarebonuslap);
|
||||||
|
WRITEUINT8(save_p, players[i].totalmarelap);
|
||||||
|
WRITEUINT8(save_p, players[i].totalmarebonuslap);
|
||||||
WRITEINT32(save_p, players[i].maxlink);
|
WRITEINT32(save_p, players[i].maxlink);
|
||||||
WRITEUINT8(save_p, players[i].texttimer);
|
WRITEUINT8(save_p, players[i].texttimer);
|
||||||
WRITEUINT8(save_p, players[i].textvar);
|
WRITEUINT8(save_p, players[i].textvar);
|
||||||
|
@ -387,15 +396,24 @@ static void P_NetUnArchivePlayers(void)
|
||||||
players[i].drilldelay = READUINT8(save_p);
|
players[i].drilldelay = READUINT8(save_p);
|
||||||
players[i].bonustime = (boolean)READUINT8(save_p);
|
players[i].bonustime = (boolean)READUINT8(save_p);
|
||||||
players[i].mare = READUINT8(save_p);
|
players[i].mare = READUINT8(save_p);
|
||||||
|
players[i].marelap = READUINT8(save_p);
|
||||||
|
players[i].marebonuslap = READUINT8(save_p);
|
||||||
|
|
||||||
players[i].marebegunat = READUINT32(save_p);
|
players[i].marebegunat = READUINT32(save_p);
|
||||||
players[i].startedtime = READUINT32(save_p);
|
players[i].startedtime = READUINT32(save_p);
|
||||||
players[i].finishedtime = READUINT32(save_p);
|
players[i].finishedtime = READUINT32(save_p);
|
||||||
|
players[i].lapbegunat = READUINT32(save_p);
|
||||||
|
players[i].lapstartedtime = READUINT32(save_p);
|
||||||
players[i].finishedspheres = READINT16(save_p);
|
players[i].finishedspheres = READINT16(save_p);
|
||||||
players[i].finishedrings = READINT16(save_p);
|
players[i].finishedrings = READINT16(save_p);
|
||||||
players[i].marescore = READUINT32(save_p);
|
players[i].marescore = READUINT32(save_p);
|
||||||
players[i].lastmarescore = READUINT32(save_p);
|
players[i].lastmarescore = READUINT32(save_p);
|
||||||
|
players[i].totalmarescore = READUINT32(save_p);
|
||||||
players[i].lastmare = READUINT8(save_p);
|
players[i].lastmare = READUINT8(save_p);
|
||||||
|
players[i].lastmarelap = READUINT8(save_p);
|
||||||
|
players[i].lastmarebonuslap = READUINT8(save_p);
|
||||||
|
players[i].totalmarelap = READUINT8(save_p);
|
||||||
|
players[i].totalmarebonuslap = READUINT8(save_p);
|
||||||
players[i].maxlink = READINT32(save_p);
|
players[i].maxlink = READINT32(save_p);
|
||||||
players[i].texttimer = READUINT8(save_p);
|
players[i].texttimer = READUINT8(save_p);
|
||||||
players[i].textvar = READUINT8(save_p);
|
players[i].textvar = READUINT8(save_p);
|
||||||
|
|
|
@ -229,6 +229,7 @@ static void P_ClearSingleMapHeaderInfo(INT16 i)
|
||||||
mapheaderinfo[num]->unlockrequired = -1;
|
mapheaderinfo[num]->unlockrequired = -1;
|
||||||
mapheaderinfo[num]->levelselect = 0;
|
mapheaderinfo[num]->levelselect = 0;
|
||||||
mapheaderinfo[num]->bonustype = 0;
|
mapheaderinfo[num]->bonustype = 0;
|
||||||
|
mapheaderinfo[num]->maxbonuslives = -1;
|
||||||
mapheaderinfo[num]->levelflags = 0;
|
mapheaderinfo[num]->levelflags = 0;
|
||||||
mapheaderinfo[num]->menuflags = 0;
|
mapheaderinfo[num]->menuflags = 0;
|
||||||
#if 1 // equivalent to "FlickyList = DEMO"
|
#if 1 // equivalent to "FlickyList = DEMO"
|
||||||
|
@ -2385,12 +2386,16 @@ static void P_LevelInitStuff(void)
|
||||||
players[i].maxlink = players[i].startedtime =\
|
players[i].maxlink = players[i].startedtime =\
|
||||||
players[i].finishedtime = players[i].finishedspheres =\
|
players[i].finishedtime = players[i].finishedspheres =\
|
||||||
players[i].finishedrings = players[i].lastmare =\
|
players[i].finishedrings = players[i].lastmare =\
|
||||||
|
players[i].lastmarelap = players[i].lastmarebonuslap =\
|
||||||
|
players[i].totalmarelap = players[i].totalmarebonuslap =\
|
||||||
players[i].marebegunat = players[i].textvar =\
|
players[i].marebegunat = players[i].textvar =\
|
||||||
players[i].texttimer = players[i].linkcount =\
|
players[i].texttimer = players[i].linkcount =\
|
||||||
players[i].linktimer = players[i].flyangle =\
|
players[i].linktimer = players[i].flyangle =\
|
||||||
players[i].anotherflyangle = players[i].nightstime =\
|
players[i].anotherflyangle = players[i].nightstime =\
|
||||||
players[i].mare = players[i].realtime =\
|
players[i].mare = players[i].marelap =\
|
||||||
players[i].exiting = 0;
|
players[i].marebonuslap = players[i].lapbegunat =\
|
||||||
|
players[i].lapstartedtime = players[i].totalmarescore =\
|
||||||
|
players[i].realtime = players[i].exiting = 0;
|
||||||
|
|
||||||
// i guess this could be part of the above but i feel mildly uncomfortable implicitly casting
|
// i guess this could be part of the above but i feel mildly uncomfortable implicitly casting
|
||||||
players[i].gotcontinue = false;
|
players[i].gotcontinue = false;
|
||||||
|
|
|
@ -1493,10 +1493,10 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||||
if (!playeringame[i] || players[i].spectator)
|
if (!playeringame[i] || players[i].spectator)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!players[i].mo || players[i].rings <= 0)
|
if (!players[i].mo || ((maptol & TOL_NIGHTS) ? players[i].spheres : players[i].rings) <= 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
rings += players[i].rings;
|
rings += (maptol & TOL_NIGHTS) ? players[i].spheres : players[i].rings;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1504,7 +1504,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||||
if (!(actor && actor->player))
|
if (!(actor && actor->player))
|
||||||
return false; // no player to count rings from here, sorry
|
return false; // no player to count rings from here, sorry
|
||||||
|
|
||||||
rings = actor->player->rings;
|
rings = (maptol & TOL_NIGHTS) ? actor->player->spheres : actor->player->rings;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (triggerline->flags & ML_NOCLIMB)
|
if (triggerline->flags & ML_NOCLIMB)
|
||||||
|
|
55
src/p_user.c
55
src/p_user.c
|
@ -387,6 +387,8 @@ boolean P_TransferToNextMare(player_t *player)
|
||||||
CONS_Debug(DBG_NIGHTS, "Mare is %d\n", mare);
|
CONS_Debug(DBG_NIGHTS, "Mare is %d\n", mare);
|
||||||
|
|
||||||
player->mare = mare;
|
player->mare = mare;
|
||||||
|
player->marelap = 0;
|
||||||
|
player->marebonuslap = 0;
|
||||||
|
|
||||||
// scan the thinkers
|
// scan the thinkers
|
||||||
// to find the closest axis point
|
// to find the closest axis point
|
||||||
|
@ -574,6 +576,10 @@ static void P_DeNightserizePlayer(player_t *player)
|
||||||
player->climbing = 0;
|
player->climbing = 0;
|
||||||
player->mo->fuse = 0;
|
player->mo->fuse = 0;
|
||||||
player->speed = 0;
|
player->speed = 0;
|
||||||
|
player->marelap = 0;
|
||||||
|
player->marebonuslap = 0;
|
||||||
|
player->flyangle = 0;
|
||||||
|
player->anotherflyangle = 0;
|
||||||
P_SetTarget(&player->mo->target, NULL);
|
P_SetTarget(&player->mo->target, NULL);
|
||||||
P_SetTarget(&player->axis1, P_SetTarget(&player->axis2, NULL));
|
P_SetTarget(&player->axis1, P_SetTarget(&player->axis2, NULL));
|
||||||
|
|
||||||
|
@ -633,7 +639,7 @@ static void P_DeNightserizePlayer(player_t *player)
|
||||||
// NiGHTS Time!
|
// NiGHTS Time!
|
||||||
void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
||||||
{
|
{
|
||||||
INT32 oldmare;
|
UINT8 oldmare, oldmarelap, oldmarebonuslap;
|
||||||
|
|
||||||
// Bots can't be NiGHTSerized, silly!1 :P
|
// Bots can't be NiGHTSerized, silly!1 :P
|
||||||
if (player->bot)
|
if (player->bot)
|
||||||
|
@ -648,6 +654,8 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
||||||
player->speed = 0;
|
player->speed = 0;
|
||||||
player->climbing = 0;
|
player->climbing = 0;
|
||||||
player->secondjump = 0;
|
player->secondjump = 0;
|
||||||
|
player->flyangle = 0;
|
||||||
|
player->anotherflyangle = 0;
|
||||||
|
|
||||||
player->powers[pw_shield] = SH_NONE;
|
player->powers[pw_shield] = SH_NONE;
|
||||||
player->powers[pw_super] = 0;
|
player->powers[pw_super] = 0;
|
||||||
|
@ -662,7 +670,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
||||||
player->followitem = skins[DEFAULTNIGHTSSKIN].followitem;
|
player->followitem = skins[DEFAULTNIGHTSSKIN].followitem;
|
||||||
}
|
}
|
||||||
|
|
||||||
player->nightstime = player->startedtime = nighttime*TICRATE;
|
player->nightstime = player->startedtime = player->lapstartedtime = nighttime*TICRATE;
|
||||||
player->bonustime = false;
|
player->bonustime = false;
|
||||||
|
|
||||||
P_RestoreMusic(player);
|
P_RestoreMusic(player);
|
||||||
|
@ -680,6 +688,8 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
||||||
}
|
}
|
||||||
|
|
||||||
oldmare = player->mare;
|
oldmare = player->mare;
|
||||||
|
oldmarelap = player->marelap;
|
||||||
|
oldmarebonuslap = player->marebonuslap;
|
||||||
|
|
||||||
if (!P_TransferToNextMare(player))
|
if (!P_TransferToNextMare(player))
|
||||||
{
|
{
|
||||||
|
@ -707,6 +717,8 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
||||||
players[i].texttimer = (3 * TICRATE) - 10;
|
players[i].texttimer = (3 * TICRATE) - 10;
|
||||||
players[i].textvar = 4; // Score and grades
|
players[i].textvar = 4; // Score and grades
|
||||||
players[i].lastmare = players[i].mare;
|
players[i].lastmare = players[i].mare;
|
||||||
|
players[i].lastmarelap = players[i].marelap;
|
||||||
|
players[i].lastmarebonuslap = players[i].marebonuslap;
|
||||||
if (G_IsSpecialStage(gamemap))
|
if (G_IsSpecialStage(gamemap))
|
||||||
{
|
{
|
||||||
players[i].finishedspheres = (INT16)total_spheres;
|
players[i].finishedspheres = (INT16)total_spheres;
|
||||||
|
@ -725,6 +737,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
||||||
G_AddTempNightsRecords(players[i].marescore, leveltime - player->marebegunat, players[i].mare + 1);
|
G_AddTempNightsRecords(players[i].marescore, leveltime - player->marebegunat, players[i].mare + 1);
|
||||||
|
|
||||||
// transfer scores anyway
|
// transfer scores anyway
|
||||||
|
players[i].totalmarescore += players[i].marescore;
|
||||||
players[i].lastmarescore = players[i].marescore;
|
players[i].lastmarescore = players[i].marescore;
|
||||||
players[i].marescore = 0;
|
players[i].marescore = 0;
|
||||||
|
|
||||||
|
@ -738,19 +751,24 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
||||||
// Spheres bonus
|
// Spheres bonus
|
||||||
P_AddPlayerScore(player, (player->spheres) * 50);
|
P_AddPlayerScore(player, (player->spheres) * 50);
|
||||||
|
|
||||||
player->lastmare = (UINT8)oldmare;
|
player->lastmare = oldmare;
|
||||||
|
player->lastmarelap = oldmarelap;
|
||||||
|
player->lastmarebonuslap = oldmarebonuslap;
|
||||||
player->texttimer = 4*TICRATE;
|
player->texttimer = 4*TICRATE;
|
||||||
player->textvar = 4; // Score and grades
|
player->textvar = 4; // Score and grades
|
||||||
player->finishedspheres = (INT16)(player->spheres);
|
player->finishedspheres = (INT16)(player->spheres);
|
||||||
|
player->finishedrings = (INT16)(player->rings);
|
||||||
|
|
||||||
// Add score to temp leaderboards
|
// Add score to temp leaderboards
|
||||||
if (!(netgame||multiplayer) && P_IsLocalPlayer(player))
|
if (!(netgame||multiplayer) && P_IsLocalPlayer(player))
|
||||||
G_AddTempNightsRecords(player->marescore, leveltime - player->marebegunat, (UINT8)(oldmare + 1));
|
G_AddTempNightsRecords(player->marescore, leveltime - player->marebegunat, (UINT8)(oldmare + 1));
|
||||||
|
|
||||||
// Starting a new mare, transfer scores
|
// Starting a new mare, transfer scores
|
||||||
|
player->totalmarescore += player->marescore;
|
||||||
player->lastmarescore = player->marescore;
|
player->lastmarescore = player->marescore;
|
||||||
player->marescore = 0;
|
player->marescore = 0;
|
||||||
player->marebegunat = leveltime;
|
player->marebegunat = leveltime;
|
||||||
|
player->lapbegunat = leveltime;
|
||||||
|
|
||||||
player->spheres = player->rings = 0;
|
player->spheres = player->rings = 0;
|
||||||
}
|
}
|
||||||
|
@ -765,6 +783,13 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
||||||
player->texttimer = (UINT8)((110 - 70) - timeinmap);
|
player->texttimer = (UINT8)((110 - 70) - timeinmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// force NiGHTS to face forward or backward
|
||||||
|
if (player->mo->target)
|
||||||
|
player->mo->angle = R_PointToAngle2(player->mo->target->x, player->mo->target->y, player->mo->x, player->mo->y) // player->angle_pos, won't be set on first instance
|
||||||
|
+ ((player->mo->target->flags2 & MF2_AMBUSH) ? // if axis is invert, take the opposite right angle
|
||||||
|
(player->flyangle > 90 && player->flyangle < 270 ? ANGLE_90 : -ANGLE_90)
|
||||||
|
: (player->flyangle > 90 && player->flyangle < 270 ? -ANGLE_90 : ANGLE_90));
|
||||||
|
|
||||||
player->powers[pw_carry] = CR_NIGHTSMODE;
|
player->powers[pw_carry] = CR_NIGHTSMODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -927,7 +952,7 @@ void P_GivePlayerRings(player_t *player, INT32 num_rings)
|
||||||
player->rings = 0;
|
player->rings = 0;
|
||||||
|
|
||||||
// Now extra life bonuses are handled here instead of in P_MovePlayer, since why not?
|
// Now extra life bonuses are handled here instead of in P_MovePlayer, since why not?
|
||||||
if (!ultimatemode && !modeattacking && !G_IsSpecialStage(gamemap) && G_GametypeUsesLives() && player->lives != 0x7f)
|
if (!ultimatemode && !modeattacking && !G_IsSpecialStage(gamemap) && G_GametypeUsesLives() && player->lives != INFLIVES)
|
||||||
{
|
{
|
||||||
INT32 gainlives = 0;
|
INT32 gainlives = 0;
|
||||||
|
|
||||||
|
@ -986,7 +1011,7 @@ void P_GivePlayerLives(player_t *player, INT32 numlives)
|
||||||
|
|
||||||
if (gamestate == GS_LEVEL)
|
if (gamestate == GS_LEVEL)
|
||||||
{
|
{
|
||||||
if (player->lives == 0x7f || (gametype != GT_COOP && gametype != GT_COMPETITION))
|
if (player->lives == INFLIVES || (gametype != GT_COOP && gametype != GT_COMPETITION))
|
||||||
{
|
{
|
||||||
P_GivePlayerRings(player, 100*numlives);
|
P_GivePlayerRings(player, 100*numlives);
|
||||||
return;
|
return;
|
||||||
|
@ -6174,7 +6199,6 @@ static void P_NiGHTSMovement(player_t *player)
|
||||||
// S_StartSound(NULL, sfx_timeup); // that creepy "out of time" music from NiGHTS. Dummied out, as some on the dev team thought it wasn't Sonic-y enough (Mystic, notably). Uncomment to restore. -SH
|
// S_StartSound(NULL, sfx_timeup); // that creepy "out of time" music from NiGHTS. Dummied out, as some on the dev team thought it wasn't Sonic-y enough (Mystic, notably). Uncomment to restore. -SH
|
||||||
S_ChangeMusicInternal((((maptol & TOL_NIGHTS) && !G_IsSpecialStage(gamemap)) ? "_ntime" : "_drown"), false);
|
S_ChangeMusicInternal((((maptol & TOL_NIGHTS) && !G_IsSpecialStage(gamemap)) ? "_ntime" : "_drown"), false);
|
||||||
|
|
||||||
|
|
||||||
if (player->mo->z < player->mo->floorz)
|
if (player->mo->z < player->mo->floorz)
|
||||||
player->mo->z = player->mo->floorz;
|
player->mo->z = player->mo->floorz;
|
||||||
|
|
||||||
|
@ -8377,7 +8401,7 @@ boolean P_GetLives(player_t *player)
|
||||||
if (!(netgame || multiplayer)
|
if (!(netgame || multiplayer)
|
||||||
|| (gametype != GT_COOP)
|
|| (gametype != GT_COOP)
|
||||||
|| (cv_cooplives.value == 1)
|
|| (cv_cooplives.value == 1)
|
||||||
|| (player->lives == 0x7f))
|
|| (player->lives == INFLIVES))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if ((cv_cooplives.value == 2 || cv_cooplives.value == 0) && player->lives > 0)
|
if ((cv_cooplives.value == 2 || cv_cooplives.value == 0) && player->lives > 0)
|
||||||
|
@ -8404,7 +8428,7 @@ boolean P_GetLives(player_t *player)
|
||||||
{
|
{
|
||||||
if (cv_cooplives.value == 2 && (P_IsLocalPlayer(player) || P_IsLocalPlayer(&players[maxlivesplayer])))
|
if (cv_cooplives.value == 2 && (P_IsLocalPlayer(player) || P_IsLocalPlayer(&players[maxlivesplayer])))
|
||||||
S_StartSound(NULL, sfx_jshard); // placeholder
|
S_StartSound(NULL, sfx_jshard); // placeholder
|
||||||
if (players[maxlivesplayer].lives != 0x7f)
|
if (players[maxlivesplayer].lives != INFLIVES)
|
||||||
players[maxlivesplayer].lives--;
|
players[maxlivesplayer].lives--;
|
||||||
player->lives++;
|
player->lives++;
|
||||||
if (player->lives < 1)
|
if (player->lives < 1)
|
||||||
|
@ -9808,7 +9832,19 @@ void P_PlayerThink(player_t *player)
|
||||||
P_ResetScore(player);
|
P_ResetScore(player);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (player->bumpertime == TICRATE/2 && player->mo->hnext)
|
||||||
|
{
|
||||||
|
// Center player to NiGHTS bumper here because if you try to set player's position in
|
||||||
|
// P_TouchSpecialThing case MT_NIGHTSBUMPER, that position is fudged in the time
|
||||||
|
// between that routine in the previous tic
|
||||||
|
// and reaching here in the current tic
|
||||||
|
P_TeleportMove(player->mo, player->mo->hnext->x, player->mo->hnext->y
|
||||||
|
, player->mo->hnext->z + FixedMul(player->mo->hnext->height/4, player->mo->hnext->scale));
|
||||||
|
P_SetTarget(&player->mo->hnext, NULL);
|
||||||
|
}
|
||||||
P_MovePlayer(player);
|
P_MovePlayer(player);
|
||||||
|
}
|
||||||
|
|
||||||
if (!player->mo)
|
if (!player->mo)
|
||||||
return; // P_MovePlayer removed player->mo.
|
return; // P_MovePlayer removed player->mo.
|
||||||
|
@ -9932,7 +9968,8 @@ void P_PlayerThink(player_t *player)
|
||||||
|| player->panim == PA_PAIN
|
|| player->panim == PA_PAIN
|
||||||
|| !player->mo->health
|
|| !player->mo->health
|
||||||
|| player->climbing
|
|| player->climbing
|
||||||
|| player->pflags & (PF_SPINNING|PF_SLIDING))
|
|| player->pflags & (PF_SPINNING|PF_SLIDING)
|
||||||
|
|| player->bumpertime)
|
||||||
player->pflags &= ~PF_APPLYAUTOBRAKE;
|
player->pflags &= ~PF_APPLYAUTOBRAKE;
|
||||||
else if (currentlyonground || player->powers[pw_tailsfly])
|
else if (currentlyonground || player->powers[pw_tailsfly])
|
||||||
player->pflags |= PF_APPLYAUTOBRAKE;
|
player->pflags |= PF_APPLYAUTOBRAKE;
|
||||||
|
|
197
src/st_stuff.c
197
src/st_stuff.c
|
@ -807,7 +807,7 @@ static void ST_drawLivesArea(void)
|
||||||
// lives number
|
// lives number
|
||||||
if (gametype == GT_RACE)
|
if (gametype == GT_RACE)
|
||||||
{
|
{
|
||||||
livescount = 0x7f;
|
livescount = INFLIVES;
|
||||||
notgreyedout = true;
|
notgreyedout = true;
|
||||||
}
|
}
|
||||||
else if ((netgame || multiplayer) && gametype == GT_COOP && cv_cooplives.value == 3)
|
else if ((netgame || multiplayer) && gametype == GT_COOP && cv_cooplives.value == 3)
|
||||||
|
@ -826,9 +826,9 @@ static void ST_drawLivesArea(void)
|
||||||
if (players[i].lives > 1)
|
if (players[i].lives > 1)
|
||||||
notgreyedout = true;
|
notgreyedout = true;
|
||||||
|
|
||||||
if (players[i].lives == 0x7f)
|
if (players[i].lives == INFLIVES)
|
||||||
{
|
{
|
||||||
livescount = 0x7f;
|
livescount = INFLIVES;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (livescount < 99)
|
else if (livescount < 99)
|
||||||
|
@ -837,11 +837,11 @@ static void ST_drawLivesArea(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
livescount = (((netgame || multiplayer) && gametype == GT_COOP && cv_cooplives.value == 0) ? 0x7f : stplyr->lives);
|
livescount = (((netgame || multiplayer) && gametype == GT_COOP && cv_cooplives.value == 0) ? INFLIVES : stplyr->lives);
|
||||||
notgreyedout = true;
|
notgreyedout = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (livescount == 0x7f)
|
if (livescount == INFLIVES)
|
||||||
V_DrawCharacter(hudinfo[HUD_LIVES].x+50, hudinfo[HUD_LIVES].y+8,
|
V_DrawCharacter(hudinfo[HUD_LIVES].x+50, hudinfo[HUD_LIVES].y+8,
|
||||||
'\x16' | 0x80 | hudinfo[HUD_LIVES].f|V_PERPLAYER|V_HUDTRANS, false);
|
'\x16' | 0x80 | hudinfo[HUD_LIVES].f|V_PERPLAYER|V_HUDTRANS, false);
|
||||||
else
|
else
|
||||||
|
@ -1205,6 +1205,10 @@ static void ST_drawPowerupHUD(void)
|
||||||
if (stplyr->spectator || stplyr->playerstate != PST_LIVE)
|
if (stplyr->spectator || stplyr->playerstate != PST_LIVE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// -------
|
||||||
|
// Shields
|
||||||
|
// -------
|
||||||
|
|
||||||
// Graue 06-18-2004: no V_NOSCALESTART, no SCX, no SCY, snap to right
|
// Graue 06-18-2004: no V_NOSCALESTART, no SCX, no SCY, snap to right
|
||||||
if (stplyr->powers[pw_shield] & SH_NOSTACK)
|
if (stplyr->powers[pw_shield] & SH_NOSTACK)
|
||||||
{
|
{
|
||||||
|
@ -1247,6 +1251,10 @@ static void ST_drawPowerupHUD(void)
|
||||||
|
|
||||||
offs -= shieldoffs[q];
|
offs -= shieldoffs[q];
|
||||||
|
|
||||||
|
// ---------
|
||||||
|
// CTF flags
|
||||||
|
// ---------
|
||||||
|
|
||||||
// YOU have a flag. Display a monitor-like icon for it.
|
// YOU have a flag. Display a monitor-like icon for it.
|
||||||
if (stplyr->gotflag)
|
if (stplyr->gotflag)
|
||||||
{
|
{
|
||||||
|
@ -1264,11 +1272,20 @@ static void ST_drawPowerupHUD(void)
|
||||||
|
|
||||||
offs -= flagoffs[q];
|
offs -= flagoffs[q];
|
||||||
|
|
||||||
|
// --------------------
|
||||||
|
// Timer-based powerups
|
||||||
|
// --------------------
|
||||||
|
|
||||||
|
#define DRAWTIMERICON(patch, timer) \
|
||||||
|
V_DrawSmallScaledPatch(offs, hudinfo[HUD_POWERUPS].y, V_PERPLAYER|hudinfo[HUD_POWERUPS].f|V_HUDTRANS, patch); \
|
||||||
|
V_DrawRightAlignedThinString(offs + 16, hudinfo[HUD_POWERUPS].y + 8, V_PERPLAYER|hudinfo[HUD_POWERUPS].f, va("%d", timer/TICRATE));
|
||||||
|
|
||||||
|
// Invincibility, both from monitor and after being hit
|
||||||
invulntime = stplyr->powers[pw_flashing] ? stplyr->powers[pw_flashing] : stplyr->powers[pw_invulnerability];
|
invulntime = stplyr->powers[pw_flashing] ? stplyr->powers[pw_flashing] : stplyr->powers[pw_invulnerability];
|
||||||
|
// Note: pw_flashing always makes the icon flicker regardless of time, unlike pw_invulnerability
|
||||||
if (stplyr->powers[pw_invulnerability] > 3*TICRATE || (invulntime && leveltime & 1))
|
if (stplyr->powers[pw_invulnerability] > 3*TICRATE || (invulntime && leveltime & 1))
|
||||||
{
|
{
|
||||||
V_DrawSmallScaledPatch(offs, hudinfo[HUD_POWERUPS].y, V_PERPLAYER|hudinfo[HUD_POWERUPS].f|V_HUDTRANS, invincibility);
|
DRAWTIMERICON(invincibility, invulntime)
|
||||||
V_DrawRightAlignedThinString(offs + 16, hudinfo[HUD_POWERUPS].y + 8, V_PERPLAYER|hudinfo[HUD_POWERUPS].f, va("%d", invulntime/TICRATE));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (invulntime > 7)
|
if (invulntime > 7)
|
||||||
|
@ -1281,10 +1298,10 @@ static void ST_drawPowerupHUD(void)
|
||||||
offs -= a;
|
offs -= a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Super Sneakers
|
||||||
if (stplyr->powers[pw_sneakers] > 3*TICRATE || (stplyr->powers[pw_sneakers] && leveltime & 1))
|
if (stplyr->powers[pw_sneakers] > 3*TICRATE || (stplyr->powers[pw_sneakers] && leveltime & 1))
|
||||||
{
|
{
|
||||||
V_DrawSmallScaledPatch(offs, hudinfo[HUD_POWERUPS].y, V_PERPLAYER|hudinfo[HUD_POWERUPS].f|V_HUDTRANS, sneakers);
|
DRAWTIMERICON(sneakers, stplyr->powers[pw_sneakers])
|
||||||
V_DrawRightAlignedThinString(offs + 16, hudinfo[HUD_POWERUPS].y + 8, V_PERPLAYER|hudinfo[HUD_POWERUPS].f, va("%d", stplyr->powers[pw_sneakers]/TICRATE));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stplyr->powers[pw_sneakers] > 7)
|
if (stplyr->powers[pw_sneakers] > 7)
|
||||||
|
@ -1297,12 +1314,13 @@ static void ST_drawPowerupHUD(void)
|
||||||
offs -= a;
|
offs -= a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Gravity Boots
|
||||||
if (stplyr->powers[pw_gravityboots] > 3*TICRATE || (stplyr->powers[pw_gravityboots] && leveltime & 1))
|
if (stplyr->powers[pw_gravityboots] > 3*TICRATE || (stplyr->powers[pw_gravityboots] && leveltime & 1))
|
||||||
{
|
{
|
||||||
V_DrawSmallScaledPatch(offs, hudinfo[HUD_POWERUPS].y, V_PERPLAYER|hudinfo[HUD_POWERUPS].f|V_HUDTRANS, gravboots);
|
DRAWTIMERICON(gravboots, stplyr->powers[pw_gravityboots])
|
||||||
V_DrawRightAlignedThinString(offs + 16, hudinfo[HUD_POWERUPS].y + 8, V_PERPLAYER|hudinfo[HUD_POWERUPS].f, va("%d", stplyr->powers[pw_gravityboots]/TICRATE));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef DRAWTIMERICON
|
||||||
#undef ICONSEP
|
#undef ICONSEP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1361,8 +1379,9 @@ static void ST_drawNightsRecords(void)
|
||||||
if (stplyr->texttimer < TICRATE/2)
|
if (stplyr->texttimer < TICRATE/2)
|
||||||
aflag |= (9 - 9*stplyr->texttimer/(TICRATE/2)) << V_ALPHASHIFT;
|
aflag |= (9 - 9*stplyr->texttimer/(TICRATE/2)) << V_ALPHASHIFT;
|
||||||
|
|
||||||
// A "Bonus Time Start" by any other name...
|
switch (stplyr->textvar)
|
||||||
if (stplyr->textvar == 1)
|
{
|
||||||
|
case 1: // A "Bonus Time Start" by any other name...
|
||||||
{
|
{
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, 52, V_GREENMAP|aflag, M_GetText("GET TO THE GOAL!"));
|
V_DrawCenteredString(BASEVIDWIDTH/2, 52, V_GREENMAP|aflag, M_GetText("GET TO THE GOAL!"));
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, 60, aflag, M_GetText("SCORE MULTIPLIER START!"));
|
V_DrawCenteredString(BASEVIDWIDTH/2, 60, aflag, M_GetText("SCORE MULTIPLIER START!"));
|
||||||
|
@ -1374,10 +1393,10 @@ static void ST_drawNightsRecords(void)
|
||||||
V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 140, V_ORANGEMAP|aflag, va("%d", (stplyr->startedtime - stplyr->finishedtime)/TICRATE));
|
V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 140, V_ORANGEMAP|aflag, va("%d", (stplyr->startedtime - stplyr->finishedtime)/TICRATE));
|
||||||
V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 148, V_ORANGEMAP|aflag, va("%d", (stplyr->finishedtime/TICRATE) * 100));
|
V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 148, V_ORANGEMAP|aflag, va("%d", (stplyr->finishedtime/TICRATE) * 100));
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
case 2: // Get n Spheres
|
||||||
// Get n [more] Spheres
|
case 3: // Get n more Spheres
|
||||||
else if (stplyr->textvar <= 3 && stplyr->textvar >= 2)
|
|
||||||
{
|
{
|
||||||
if (!stplyr->capsule)
|
if (!stplyr->capsule)
|
||||||
return;
|
return;
|
||||||
|
@ -1388,10 +1407,9 @@ static void ST_drawNightsRecords(void)
|
||||||
(stplyr->textvar == 3) ? M_GetText("MORE ") : "",
|
(stplyr->textvar == 3) ? M_GetText("MORE ") : "",
|
||||||
(G_IsSpecialStage(gamemap)) ? "SPHERE" : "CHIP",
|
(G_IsSpecialStage(gamemap)) ? "SPHERE" : "CHIP",
|
||||||
(stplyr->capsule->health > 1) ? "S" : ""));
|
(stplyr->capsule->health > 1) ? "S" : ""));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
case 4: // End Bonus
|
||||||
// End Bonus
|
|
||||||
else if (stplyr->textvar == 4)
|
|
||||||
{
|
{
|
||||||
V_DrawString(BASEVIDWIDTH/2 - 56, 140, aflag, (G_IsSpecialStage(gamemap)) ? "SPHERES:" : "CHIPS:");
|
V_DrawString(BASEVIDWIDTH/2 - 56, 140, aflag, (G_IsSpecialStage(gamemap)) ? "SPHERES:" : "CHIPS:");
|
||||||
V_DrawString(BASEVIDWIDTH/2 - 56, 148, aflag, "BONUS:");
|
V_DrawString(BASEVIDWIDTH/2 - 56, 148, aflag, "BONUS:");
|
||||||
|
@ -1415,6 +1433,10 @@ static void ST_drawNightsRecords(void)
|
||||||
V_DrawScaledPatch(BASEVIDWIDTH/2 + 60, 160, 0,
|
V_DrawScaledPatch(BASEVIDWIDTH/2 + 60, 160, 0,
|
||||||
ngradeletters[P_GetGrade(stplyr->lastmarescore, gamemap, stplyr->lastmare)]);
|
ngradeletters[P_GetGrade(stplyr->lastmarescore, gamemap, stplyr->lastmare)]);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1450,20 +1472,60 @@ static skincolors_t linkColor[2][NUMLINKCOLORS] = {
|
||||||
{SKINCOLOR_SEAFOAM, SKINCOLOR_CYAN, SKINCOLOR_WAVE, SKINCOLOR_SAPPHIRE, SKINCOLOR_VAPOR, SKINCOLOR_BUBBLEGUM,
|
{SKINCOLOR_SEAFOAM, SKINCOLOR_CYAN, SKINCOLOR_WAVE, SKINCOLOR_SAPPHIRE, SKINCOLOR_VAPOR, SKINCOLOR_BUBBLEGUM,
|
||||||
SKINCOLOR_VIOLET, SKINCOLOR_RUBY, SKINCOLOR_FLAME, SKINCOLOR_SUNSET, SKINCOLOR_SANDY, SKINCOLOR_LIME}};
|
SKINCOLOR_VIOLET, SKINCOLOR_RUBY, SKINCOLOR_FLAME, SKINCOLOR_SUNSET, SKINCOLOR_SANDY, SKINCOLOR_LIME}};
|
||||||
|
|
||||||
|
static void ST_drawNiGHTSLink(void)
|
||||||
|
{
|
||||||
|
static INT32 prevsel[2] = {0, 0}, prevtime[2] = {0, 0};
|
||||||
|
const UINT8 q = ((splitscreen && stplyr == &players[secondarydisplayplayer]) ? 1 : 0);
|
||||||
|
INT32 sel = ((stplyr->linkcount-1) / 5) % NUMLINKCOLORS, aflag = V_PERPLAYER, mag = ((stplyr->linkcount-1 >= 300) ? 1 : 0);
|
||||||
|
skincolors_t colornum;
|
||||||
|
fixed_t x, y, scale;
|
||||||
|
|
||||||
|
if (sel != prevsel[q])
|
||||||
|
{
|
||||||
|
prevsel[q] = sel;
|
||||||
|
prevtime[q] = 2 + mag;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stplyr->powers[pw_nights_linkfreeze] && (!(stplyr->powers[pw_nights_linkfreeze] & 2) || (stplyr->powers[pw_nights_linkfreeze] > flashingtics)))
|
||||||
|
colornum = SKINCOLOR_ICY;
|
||||||
|
else
|
||||||
|
colornum = linkColor[mag][sel];
|
||||||
|
|
||||||
|
aflag |= ((stplyr->linktimer < 2*TICRATE/3)
|
||||||
|
? (9 - 9*stplyr->linktimer/(2*TICRATE/3)) << V_ALPHASHIFT
|
||||||
|
: 0);
|
||||||
|
|
||||||
|
y = (160+11)<<FRACBITS;
|
||||||
|
aflag |= V_SNAPTOBOTTOM;
|
||||||
|
|
||||||
|
x = (160+4)<<FRACBITS;
|
||||||
|
|
||||||
|
if (prevtime[q])
|
||||||
|
{
|
||||||
|
scale = ((32 + prevtime[q])<<FRACBITS)/32;
|
||||||
|
prevtime[q]--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
scale = FRACUNIT;
|
||||||
|
|
||||||
|
y -= (11*scale);
|
||||||
|
|
||||||
|
ST_DrawNightsOverlayNum(x-(4*scale), y, scale, aflag, (stplyr->linkcount-1), nightsnum, colornum);
|
||||||
|
V_DrawFixedPatch(x+(4*scale), y, scale, aflag, nightslink,
|
||||||
|
colornum == 0 ? colormaps : R_GetTranslationColormap(TC_DEFAULT, colornum, GTC_CACHE));
|
||||||
|
|
||||||
|
// Show remaining link time left in debug
|
||||||
|
if (cv_debug & DBG_NIGHTSBASIC)
|
||||||
|
V_DrawCenteredString(BASEVIDWIDTH/2, 180, V_SNAPTOBOTTOM, va("End in %d.%02d", stplyr->linktimer/TICRATE, G_TicsToCentiseconds(stplyr->linktimer)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void ST_drawNiGHTSHUD(void)
|
static void ST_drawNiGHTSHUD(void)
|
||||||
{
|
{
|
||||||
INT32 origamount;
|
INT32 origamount;
|
||||||
INT32 minlink = 1;
|
|
||||||
INT32 total_spherecount;
|
INT32 total_spherecount;
|
||||||
const boolean oldspecialstage = (G_IsSpecialStage(gamemap) && !(maptol & TOL_NIGHTS));
|
const boolean oldspecialstage = (G_IsSpecialStage(gamemap) && !(maptol & TOL_NIGHTS));
|
||||||
|
|
||||||
// Cheap hack: don't display when the score is showing (it popping up for a split second when exiting a map is intentional)
|
|
||||||
if (oldspecialstage || (stplyr->texttimer && stplyr->textvar == 4))
|
|
||||||
minlink = INT32_MAX;
|
|
||||||
// When debugging, show "0 Link".
|
|
||||||
else if (cv_debug & DBG_NIGHTSBASIC)
|
|
||||||
minlink = 0;
|
|
||||||
|
|
||||||
// Drill meter
|
// Drill meter
|
||||||
if (
|
if (
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
|
@ -1508,55 +1570,15 @@ static void ST_drawNiGHTSHUD(void)
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
// Link drawing
|
// Link drawing
|
||||||
if (
|
if (!oldspecialstage
|
||||||
|
// Don't display when the score is showing (it popping up for a split second when exiting a map is intentional)
|
||||||
|
&& !(stplyr->texttimer && stplyr->textvar == 4)
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
LUA_HudEnabled(hud_nightslink) &&
|
&& LUA_HudEnabled(hud_nightslink)
|
||||||
#endif
|
#endif
|
||||||
stplyr->linkcount > minlink)
|
&& ((cv_debug & DBG_NIGHTSBASIC) || stplyr->linkcount > 1)) // When debugging, show "0 Link".
|
||||||
{
|
{
|
||||||
static INT32 prevsel[2] = {0, 0}, prevtime[2] = {0, 0};
|
ST_drawNiGHTSLink();
|
||||||
const UINT8 q = ((splitscreen && stplyr == &players[secondarydisplayplayer]) ? 1 : 0);
|
|
||||||
INT32 sel = ((stplyr->linkcount-1) / 5) % NUMLINKCOLORS, aflag = V_PERPLAYER, mag = ((stplyr->linkcount-1 >= 300) ? 1 : 0);
|
|
||||||
skincolors_t colornum;
|
|
||||||
fixed_t x, y, scale;
|
|
||||||
|
|
||||||
if (sel != prevsel[q])
|
|
||||||
{
|
|
||||||
prevsel[q] = sel;
|
|
||||||
prevtime[q] = 2 + mag;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stplyr->powers[pw_nights_linkfreeze] && (!(stplyr->powers[pw_nights_linkfreeze] & 2) || (stplyr->powers[pw_nights_linkfreeze] > flashingtics)))
|
|
||||||
colornum = SKINCOLOR_ICY;
|
|
||||||
else
|
|
||||||
colornum = linkColor[mag][sel];
|
|
||||||
|
|
||||||
aflag |= ((stplyr->linktimer < 2*TICRATE/3)
|
|
||||||
? (9 - 9*stplyr->linktimer/(2*TICRATE/3)) << V_ALPHASHIFT
|
|
||||||
: 0);
|
|
||||||
|
|
||||||
y = (160+11)<<FRACBITS;
|
|
||||||
aflag |= V_SNAPTOBOTTOM;
|
|
||||||
|
|
||||||
x = (160+4)<<FRACBITS;
|
|
||||||
|
|
||||||
if (prevtime[q])
|
|
||||||
{
|
|
||||||
scale = ((32 + prevtime[q])<<FRACBITS)/32;
|
|
||||||
prevtime[q]--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
scale = FRACUNIT;
|
|
||||||
|
|
||||||
y -= (11*scale);
|
|
||||||
|
|
||||||
ST_DrawNightsOverlayNum(x-(4*scale), y, scale, aflag, (stplyr->linkcount-1), nightsnum, colornum);
|
|
||||||
V_DrawFixedPatch(x+(4*scale), y, scale, aflag, nightslink,
|
|
||||||
colornum == 0 ? colormaps : R_GetTranslationColormap(TC_DEFAULT, colornum, GTC_CACHE));
|
|
||||||
|
|
||||||
// Show remaining link time left in debug
|
|
||||||
if (cv_debug & DBG_NIGHTSBASIC)
|
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, 180, V_SNAPTOBOTTOM, va("End in %d.%02d", stplyr->linktimer/TICRATE, G_TicsToCentiseconds(stplyr->linktimer)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gametype == GT_RACE || gametype == GT_COMPETITION)
|
if (gametype == GT_RACE || gametype == GT_COMPETITION)
|
||||||
|
@ -2450,15 +2472,26 @@ void ST_Drawer(void)
|
||||||
#ifdef SEENAMES
|
#ifdef SEENAMES
|
||||||
if (cv_seenames.value && cv_allowseenames.value && displayplayer == consoleplayer && seenplayer && seenplayer->mo)
|
if (cv_seenames.value && cv_allowseenames.value && displayplayer == consoleplayer && seenplayer && seenplayer->mo)
|
||||||
{
|
{
|
||||||
if (cv_seenames.value == 1)
|
INT32 c = 0;
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2 + 15, V_HUDTRANSHALF, player_names[seenplayer-players]);
|
switch (cv_seenames.value)
|
||||||
else if (cv_seenames.value == 2)
|
{
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2 + 15, V_HUDTRANSHALF,
|
case 1: // Colorless
|
||||||
va("%s%s", G_GametypeHasTeams() ? ((seenplayer->ctfteam == 1) ? "\x85" : "\x84") : "", player_names[seenplayer-players]));
|
break;
|
||||||
else //if (cv_seenames.value == 3)
|
case 2: // Team
|
||||||
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2 + 15, V_HUDTRANSHALF,
|
if (G_GametypeHasTeams())
|
||||||
va("%s%s", !G_RingSlingerGametype() || (G_GametypeHasTeams() && players[consoleplayer].ctfteam == seenplayer->ctfteam)
|
c = (seenplayer->ctfteam == 1) ? V_REDMAP : V_BLUEMAP;
|
||||||
? "\x83" : "\x85", player_names[seenplayer-players]));
|
break;
|
||||||
|
case 3: // Ally/Foe
|
||||||
|
default:
|
||||||
|
// Green = Ally, Red = Foe
|
||||||
|
if (G_GametypeHasTeams())
|
||||||
|
c = (players[consoleplayer].ctfteam == seenplayer->ctfteam) ? V_GREENMAP : V_REDMAP;
|
||||||
|
else // Everyone is an ally, or everyone is a foe!
|
||||||
|
c = (G_RingSlingerGametype()) ? V_REDMAP : V_GREENMAP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2 + 15, V_HUDTRANSHALF|c, player_names[seenplayer-players]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1874,7 +1874,9 @@ static void Y_AwardCoopBonuses(void)
|
||||||
players[i].score = MAXSCORE;
|
players[i].score = MAXSCORE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptlives = (!ultimatemode && !modeattacking && players[i].lives != 0x7f) ? max((players[i].score/50000) - (oldscore/50000), 0) : 0;
|
ptlives = min(
|
||||||
|
((!ultimatemode && !modeattacking && players[i].lives != INFLIVES) ? max((players[i].score/50000) - (oldscore/50000), 0) : 0),
|
||||||
|
(mapheaderinfo[prevmap]->maxbonuslives < 0 ? INT32_MAX : mapheaderinfo[prevmap]->maxbonuslives));
|
||||||
if (ptlives)
|
if (ptlives)
|
||||||
P_GivePlayerLives(&players[i], ptlives);
|
P_GivePlayerLives(&players[i], ptlives);
|
||||||
|
|
||||||
|
@ -1918,7 +1920,9 @@ static void Y_AwardSpecialStageBonus(void)
|
||||||
players[i].score = MAXSCORE;
|
players[i].score = MAXSCORE;
|
||||||
|
|
||||||
// grant extra lives right away since tally is faked
|
// grant extra lives right away since tally is faked
|
||||||
ptlives = (!ultimatemode && !modeattacking && players[i].lives != 0x7f) ? max((players[i].score/50000) - (oldscore/50000), 0) : 0;
|
ptlives = min(
|
||||||
|
((!ultimatemode && !modeattacking && players[i].lives != INFLIVES) ? max((players[i].score/50000) - (oldscore/50000), 0) : 0),
|
||||||
|
(mapheaderinfo[prevmap]->maxbonuslives < 0 ? INT32_MAX : mapheaderinfo[prevmap]->maxbonuslives));
|
||||||
if (ptlives)
|
if (ptlives)
|
||||||
P_GivePlayerLives(&players[i], ptlives);
|
P_GivePlayerLives(&players[i], ptlives);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue