mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-20 01:43:50 +00:00
Okay, major overhaul time!
*player->health (formerly the "HUD" health) is now to be known as player->rings, and now acts as the player's actual ring count *player->mo->health (formerly rings + 1) is now always 1 when alive, regardless of ring count; if player with rings is damaged, this is untouched Damage in normal SP/Coop gameplay has been tested and still works fine; still a lot of mess to clear up though Tag damaging probably is broken now, I'll fix this later
This commit is contained in:
parent
4369ba2a21
commit
6bc1a5fdef
20 changed files with 164 additions and 201 deletions
|
@ -495,7 +495,7 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
|
|||
rsp->powers[j] = (UINT16)SHORT(players[i].powers[j]);
|
||||
|
||||
// Score is resynched in the rspfirm resync packet
|
||||
rsp->health = 0; // resynched with mo health
|
||||
rsp->rings = LONG(players[i].rings);
|
||||
rsp->lives = players[i].lives;
|
||||
rsp->continues = players[i].continues;
|
||||
rsp->scoreadd = players[i].scoreadd;
|
||||
|
@ -577,7 +577,6 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
|
|||
rsp->hasmo = true;
|
||||
|
||||
rsp->health = LONG(players[i].mo->health);
|
||||
|
||||
rsp->angle = (angle_t)LONG(players[i].mo->angle);
|
||||
rsp->x = LONG(players[i].mo->x);
|
||||
rsp->y = LONG(players[i].mo->y);
|
||||
|
@ -620,7 +619,7 @@ static void resynch_read_player(resynch_pak *rsp)
|
|||
players[i].powers[j] = (UINT16)SHORT(rsp->powers[j]);
|
||||
|
||||
// Score is resynched in the rspfirm resync packet
|
||||
players[i].health = rsp->health;
|
||||
players[i].rings = LONG(rsp->rings);
|
||||
players[i].lives = rsp->lives;
|
||||
players[i].continues = rsp->continues;
|
||||
players[i].scoreadd = rsp->scoreadd;
|
||||
|
@ -2244,7 +2243,7 @@ static void CL_RemovePlayer(INT32 playernum)
|
|||
}
|
||||
|
||||
count--;
|
||||
rings = players[playernum].health - 1;
|
||||
rings = players[playernum].rings;
|
||||
increment = rings/count;
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
|
|
|
@ -155,7 +155,7 @@ typedef struct
|
|||
UINT16 powers[NUMPOWERS];
|
||||
|
||||
// Score is resynched in the confirm resync packet
|
||||
INT32 health;
|
||||
INT32 rings;
|
||||
SINT8 lives;
|
||||
SINT8 continues;
|
||||
UINT8 scoreadd;
|
||||
|
@ -231,6 +231,7 @@ typedef struct
|
|||
//player->mo stuff
|
||||
UINT8 hasmo; //boolean
|
||||
|
||||
INT32 health;
|
||||
angle_t angle;
|
||||
fixed_t x;
|
||||
fixed_t y;
|
||||
|
|
|
@ -2558,7 +2558,7 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum)
|
|||
if (players[playernum].spectator)
|
||||
{
|
||||
players[playernum].score = 0;
|
||||
players[playernum].health = 1;
|
||||
players[playernum].rings = 0;
|
||||
if (players[playernum].mo)
|
||||
players[playernum].mo->health = 1;
|
||||
}
|
||||
|
|
|
@ -278,10 +278,8 @@ typedef struct player_s
|
|||
// It is updated with cmd->aiming.
|
||||
angle_t aiming;
|
||||
|
||||
// This is only used between levels,
|
||||
// mo->health is used during levels.
|
||||
/// \todo Remove this. We don't need a second health definition for players.
|
||||
INT32 health;
|
||||
// player's ring count
|
||||
INT32 rings;
|
||||
|
||||
SINT8 pity; // i pity the fool.
|
||||
INT32 currentweapon; // current weapon selected.
|
||||
|
|
|
@ -2177,7 +2177,7 @@ void G_PlayerReborn(INT32 player)
|
|||
p->pflags |= PF_JUMPDOWN;
|
||||
|
||||
p->playerstate = PST_LIVE;
|
||||
p->health = 1; // 0 rings
|
||||
p->rings = 0; // 0 rings
|
||||
p->panim = PA_IDLE; // standing animation
|
||||
|
||||
if ((netgame || multiplayer) && !p->spectator)
|
||||
|
|
|
@ -1198,7 +1198,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
|||
|
||||
V_DrawString(x + 20, y,
|
||||
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
||||
| ((players[tab[i].num].health > 0) ? 0 : V_60TRANS)
|
||||
| ((players[tab[i].num].mo && players[tab[i].num].mo->health > 0) ? 0 : V_60TRANS)
|
||||
| V_ALLOWLOWERCASE, tab[i].name);
|
||||
|
||||
// Draw emeralds
|
||||
|
@ -1208,7 +1208,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
|||
HU_DrawEmeralds(x-12,y+2,tab[i].emeralds);
|
||||
}
|
||||
|
||||
if (players[tab[i].num].health <= 0)
|
||||
if (players[tab[i].num].mo && players[tab[i].num].mo->health <= 0)
|
||||
V_DrawSmallTranslucentPatch (x, y-4, V_80TRANS, livesback);
|
||||
else
|
||||
V_DrawSmallScaledPatch (x, y-4, 0, livesback);
|
||||
|
@ -1220,7 +1220,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
|||
V_DrawSmallScaledPatch(x, y-4, 0, superprefix[players[tab[i].num].skin]);
|
||||
else
|
||||
{
|
||||
if (players[tab[i].num].health <= 0)
|
||||
if (players[tab[i].num].mo && players[tab[i].num].mo->health <= 0)
|
||||
V_DrawSmallTranslucentPatch(x, y-4, V_80TRANS, faceprefix[players[tab[i].num].skin]);
|
||||
else
|
||||
V_DrawSmallScaledPatch(x, y-4, 0, faceprefix[players[tab[i].num].skin]);
|
||||
|
@ -1236,7 +1236,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
|||
else
|
||||
{
|
||||
colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE);
|
||||
if (players[tab[i].num].health <= 0)
|
||||
if (players[tab[i].num].mo && players[tab[i].num].mo->health <= 0)
|
||||
V_DrawSmallTranslucentMappedPatch (x, y-4, V_80TRANS, faceprefix[players[tab[i].num].skin], colormap);
|
||||
else
|
||||
V_DrawSmallMappedPatch (x, y-4, 0, faceprefix[players[tab[i].num].skin], colormap);
|
||||
|
@ -1244,10 +1244,10 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
|||
}
|
||||
|
||||
if (G_GametypeUsesLives()) //show lives
|
||||
V_DrawRightAlignedString(x, y+4, V_ALLOWLOWERCASE|((players[tab[i].num].health > 0) ? 0 : V_60TRANS), va("%dx", players[tab[i].num].lives));
|
||||
V_DrawRightAlignedString(x, y+4, V_ALLOWLOWERCASE|((players[tab[i].num].mo && players[tab[i].num].mo->health > 0) ? 0 : V_60TRANS), va("%dx", players[tab[i].num].lives));
|
||||
else if (G_TagGametype() && players[tab[i].num].pflags & PF_TAGIT)
|
||||
{
|
||||
if (players[tab[i].num].health <= 0)
|
||||
if (players[tab[i].num].mo && players[tab[i].num].mo->health <= 0)
|
||||
V_DrawSmallTranslucentPatch(x-32, y-4, V_60TRANS, tagico);
|
||||
else
|
||||
V_DrawSmallScaledPatch(x-32, y-4, 0, tagico);
|
||||
|
@ -1260,13 +1260,13 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
|||
if (players[tab[i].num].exiting)
|
||||
V_DrawRightAlignedString(x+240, y, 0, va("%i:%02i.%02i", G_TicsToMinutes(players[tab[i].num].realtime,true), G_TicsToSeconds(players[tab[i].num].realtime), G_TicsToCentiseconds(players[tab[i].num].realtime)));
|
||||
else
|
||||
V_DrawRightAlignedString(x+240, y, ((players[tab[i].num].health > 0) ? 0 : V_60TRANS), va("%u", tab[i].count));
|
||||
V_DrawRightAlignedString(x+240, y, ((players[tab[i].num].mo && players[tab[i].num].mo->health > 0) ? 0 : V_60TRANS), va("%u", tab[i].count));
|
||||
}
|
||||
else
|
||||
V_DrawRightAlignedString(x+240, y, ((players[tab[i].num].health > 0) ? 0 : V_60TRANS), va("%i:%02i.%02i", G_TicsToMinutes(tab[i].count,true), G_TicsToSeconds(tab[i].count), G_TicsToCentiseconds(tab[i].count)));
|
||||
V_DrawRightAlignedString(x+240, y, ((players[tab[i].num].mo && players[tab[i].num].mo->health > 0) ? 0 : V_60TRANS), va("%i:%02i.%02i", G_TicsToMinutes(tab[i].count,true), G_TicsToSeconds(tab[i].count), G_TicsToCentiseconds(tab[i].count)));
|
||||
}
|
||||
else
|
||||
V_DrawRightAlignedString(x+240, y, ((players[tab[i].num].health > 0) ? 0 : V_60TRANS), va("%u", tab[i].count));
|
||||
V_DrawRightAlignedString(x+240, y, ((players[tab[i].num].mo && players[tab[i].num].mo->health > 0) ? 0 : V_60TRANS), va("%u", tab[i].count));
|
||||
|
||||
y += 16;
|
||||
}
|
||||
|
@ -1311,7 +1311,7 @@ void HU_DrawTeamTabRankings(playersort_t *tab, INT32 whiteplayer)
|
|||
strlcpy(name, tab[i].name, 9);
|
||||
V_DrawString(x + 20, y,
|
||||
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
||||
| ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT)
|
||||
| ((players[tab[i].num].mo && players[tab[i].num].mo->health > 0) ? 0 : V_TRANSLUCENT)
|
||||
| V_ALLOWLOWERCASE, name);
|
||||
|
||||
if (gametype == GT_CTF)
|
||||
|
@ -1337,12 +1337,12 @@ void HU_DrawTeamTabRankings(playersort_t *tab, INT32 whiteplayer)
|
|||
else
|
||||
{
|
||||
colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE);
|
||||
if (players[tab[i].num].health <= 0)
|
||||
if (players[tab[i].num].mo && players[tab[i].num].mo->health <= 0)
|
||||
V_DrawSmallTranslucentMappedPatch (x, y-4, 0, faceprefix[players[tab[i].num].skin], colormap);
|
||||
else
|
||||
V_DrawSmallMappedPatch (x, y-4, 0, faceprefix[players[tab[i].num].skin], colormap);
|
||||
}
|
||||
V_DrawRightAlignedThinString(x+120, y, ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
||||
V_DrawRightAlignedThinString(x+120, y, ((players[tab[i].num].mo && players[tab[i].num].mo->health > 0) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1367,7 +1367,7 @@ void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scoreline
|
|||
strlcpy(name, tab[i].name, 9);
|
||||
V_DrawString(x + 20, y,
|
||||
((tab[i].num == whiteplayer) ? V_YELLOWMAP : 0)
|
||||
| ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT)
|
||||
| ((players[tab[i].num].mo && players[tab[i].num].mo->health > 0) ? 0 : V_TRANSLUCENT)
|
||||
| V_ALLOWLOWERCASE, name);
|
||||
|
||||
if (G_GametypeUsesLives()) //show lives
|
||||
|
@ -1390,7 +1390,7 @@ void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scoreline
|
|||
V_DrawSmallScaledPatch (x, y-4, 0, superprefix[players[tab[i].num].skin]);
|
||||
else
|
||||
{
|
||||
if (players[tab[i].num].health <= 0)
|
||||
if (players[tab[i].num].mo && players[tab[i].num].mo->health <= 0)
|
||||
V_DrawSmallTranslucentPatch (x, y-4, 0, faceprefix[players[tab[i].num].skin]);
|
||||
else
|
||||
V_DrawSmallScaledPatch (x, y-4, 0, faceprefix[players[tab[i].num].skin]);
|
||||
|
@ -1406,7 +1406,7 @@ void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scoreline
|
|||
else
|
||||
{
|
||||
colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE);
|
||||
if (players[tab[i].num].health <= 0)
|
||||
if (players[tab[i].num].mo && players[tab[i].num].mo->health <= 0)
|
||||
V_DrawSmallTranslucentMappedPatch (x, y-4, 0, faceprefix[players[tab[i].num].skin], colormap);
|
||||
else
|
||||
V_DrawSmallMappedPatch (x, y-4, 0, faceprefix[players[tab[i].num].skin], colormap);
|
||||
|
@ -1421,13 +1421,13 @@ void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scoreline
|
|||
if (players[tab[i].num].exiting)
|
||||
V_DrawRightAlignedThinString(x+156, y, 0, va("%i:%02i.%02i", G_TicsToMinutes(players[tab[i].num].realtime,true), G_TicsToSeconds(players[tab[i].num].realtime), G_TicsToCentiseconds(players[tab[i].num].realtime)));
|
||||
else
|
||||
V_DrawRightAlignedThinString(x+156, y, ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
||||
V_DrawRightAlignedThinString(x+156, y, ((players[tab[i].num].mo && players[tab[i].num].mo->health > 0) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
||||
}
|
||||
else
|
||||
V_DrawRightAlignedThinString(x+156, y, ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT), va("%i:%02i.%02i", G_TicsToMinutes(tab[i].count,true), G_TicsToSeconds(tab[i].count), G_TicsToCentiseconds(tab[i].count)));
|
||||
V_DrawRightAlignedThinString(x+156, y, ((players[tab[i].num].mo && players[tab[i].num].mo->health > 0) ? 0 : V_TRANSLUCENT), va("%i:%02i.%02i", G_TicsToMinutes(tab[i].count,true), G_TicsToSeconds(tab[i].count), G_TicsToCentiseconds(tab[i].count)));
|
||||
}
|
||||
else
|
||||
V_DrawRightAlignedThinString(x+120, y, ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
||||
V_DrawRightAlignedThinString(x+120, y, ((players[tab[i].num].mo && players[tab[i].num].mo->health > 0) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count));
|
||||
|
||||
y += 16;
|
||||
if (y > 160)
|
||||
|
|
|
@ -1068,7 +1068,7 @@ static int lib_pPlayerRingBurst(lua_State *L)
|
|||
if (!player)
|
||||
return LUA_ErrInvalid(L, "player_t");
|
||||
if (num_rings == -1)
|
||||
num_rings = player->health - 1;
|
||||
num_rings = player->rings;
|
||||
P_PlayerRingBurst(player, num_rings);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -118,8 +118,8 @@ static int player_get(lua_State *L)
|
|||
lua_pushfixed(L, plr->bob);
|
||||
else if (fastcmp(field,"aiming"))
|
||||
lua_pushangle(L, plr->aiming);
|
||||
else if (fastcmp(field,"health"))
|
||||
lua_pushinteger(L, plr->health);
|
||||
else if (fastcmp(field,"rings"))
|
||||
lua_pushinteger(L, plr->rings);
|
||||
else if (fastcmp(field,"pity"))
|
||||
lua_pushinteger(L, plr->pity);
|
||||
else if (fastcmp(field,"currentweapon"))
|
||||
|
@ -368,8 +368,8 @@ static int player_set(lua_State *L)
|
|||
else if (plr == &players[secondarydisplayplayer])
|
||||
localaiming2 = plr->aiming;
|
||||
}
|
||||
else if (fastcmp(field,"health"))
|
||||
plr->health = (INT32)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"rings"))
|
||||
plr->rings = (INT32)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"pity"))
|
||||
plr->pity = (SINT8)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"currentweapon"))
|
||||
|
|
|
@ -625,7 +625,7 @@ void Command_CauseCfail_f(void)
|
|||
players[consoleplayer].mo->y = 123311; //cfail cansuled kthxbye
|
||||
players[consoleplayer].mo->z = 123311;
|
||||
players[consoleplayer].score = 1337;
|
||||
players[consoleplayer].health = 1337;
|
||||
players[consoleplayer].rings = 1337;
|
||||
players[consoleplayer].mo->destscale = 25;
|
||||
P_SetThingPosition(players[consoleplayer].mo);
|
||||
|
||||
|
@ -739,7 +739,7 @@ void Command_Setrings_f(void)
|
|||
if (COM_Argc() > 1)
|
||||
{
|
||||
// P_GivePlayerRings does value clamping
|
||||
players[consoleplayer].health = players[consoleplayer].mo->health = 1;
|
||||
players[consoleplayer].rings = 0;
|
||||
P_GivePlayerRings(&players[consoleplayer], atoi(COM_Argv(1)));
|
||||
if (!G_IsSpecialStage(gamemap) || !useNightsSS)
|
||||
players[consoleplayer].totalring -= atoi(COM_Argv(1)); //undo totalring addition done in P_GivePlayerRings
|
||||
|
@ -1241,7 +1241,7 @@ void Command_ObjectPlace_f(void)
|
|||
// Like the classics, recover from death by entering objectplace
|
||||
if (players[0].mo->health <= 0)
|
||||
{
|
||||
players[0].mo->health = players[0].health = 1;
|
||||
players[0].mo->health = 1;
|
||||
players[0].deadtimer = 0;
|
||||
op_oldflags1 = mobjinfo[MT_PLAYER].flags;
|
||||
++players[0].lives;
|
||||
|
|
|
@ -3789,7 +3789,7 @@ static void M_HandleImageDef(INT32 choice)
|
|||
static void M_PandorasBox(INT32 choice)
|
||||
{
|
||||
(void)choice;
|
||||
CV_StealthSetValue(&cv_dummyrings, max(players[consoleplayer].health - 1, 0));
|
||||
CV_StealthSetValue(&cv_dummyrings, max(players[consoleplayer].rings, 0));
|
||||
CV_StealthSetValue(&cv_dummylives, players[consoleplayer].lives);
|
||||
CV_StealthSetValue(&cv_dummycontinues, players[consoleplayer].continues);
|
||||
M_SetupNextMenu(&SR_PandoraDef);
|
||||
|
@ -3797,7 +3797,7 @@ static void M_PandorasBox(INT32 choice)
|
|||
|
||||
static boolean M_ExitPandorasBox(void)
|
||||
{
|
||||
if (cv_dummyrings.value != max(players[consoleplayer].health - 1, 0))
|
||||
if (cv_dummyrings.value != max(players[consoleplayer].rings, 0))
|
||||
COM_ImmedExecute(va("setrings %d", cv_dummyrings.value));
|
||||
if (cv_dummylives.value != players[consoleplayer].lives)
|
||||
COM_ImmedExecute(va("setlives %d", cv_dummylives.value));
|
||||
|
|
|
@ -655,15 +655,15 @@ boolean P_LookForPlayers(mobj_t *actor, boolean allaround, boolean tracer, fixed
|
|||
if ((netgame || multiplayer) && player->spectator)
|
||||
continue;
|
||||
|
||||
if (player->health <= 0)
|
||||
continue; // dead
|
||||
|
||||
if (player->pflags & PF_INVIS)
|
||||
continue; // ignore notarget
|
||||
|
||||
if (!player->mo || P_MobjWasRemoved(player->mo))
|
||||
continue;
|
||||
|
||||
if (player->mo->health <= 0)
|
||||
continue; // dead
|
||||
|
||||
if (dist > 0
|
||||
&& P_AproxDistance(P_AproxDistance(player->mo->x - actor->x, player->mo->y - actor->y), player->mo->z - actor->z) > dist)
|
||||
continue; // Too far away
|
||||
|
@ -727,7 +727,7 @@ static boolean P_LookForShield(mobj_t *actor)
|
|||
|
||||
player = &players[actor->lastlook];
|
||||
|
||||
if (player->health <= 0 || !player->mo)
|
||||
if (!player->mo || player->mo->health <= 0)
|
||||
continue; // dead
|
||||
|
||||
//When in CTF, don't pull rings that you cannot pick up.
|
||||
|
@ -2721,7 +2721,7 @@ void A_BossDeath(mobj_t *mo)
|
|||
|
||||
// make sure there is a player alive for victory
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && (players[i].health > 0
|
||||
if (playeringame[i] && ((players[i].mo && players[i].mo->health > 0)
|
||||
|| ((netgame || multiplayer) && (players[i].lives > 0 || players[i].continues > 0))))
|
||||
break;
|
||||
|
||||
|
@ -8268,7 +8268,7 @@ void A_RingDrain(mobj_t *actor)
|
|||
}
|
||||
|
||||
player = actor->target->player;
|
||||
P_GivePlayerRings(player, -min(locvar1, player->mo->health-1));
|
||||
P_GivePlayerRings(player, -min(locvar1, player->rings));
|
||||
}
|
||||
|
||||
// Function: A_SplitShot
|
||||
|
@ -8578,7 +8578,7 @@ void A_CheckTargetRings(mobj_t *actor)
|
|||
if (!(actor->target) || !(actor->target->player))
|
||||
return;
|
||||
|
||||
if (actor->target->player->health >= locvar1)
|
||||
if (actor->target->player->rings >= locvar1)
|
||||
P_SetMobjState(actor, locvar2);
|
||||
}
|
||||
|
||||
|
@ -8600,7 +8600,7 @@ void A_CheckRings(mobj_t *actor)
|
|||
#endif
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
cntr += players[i].health-1;
|
||||
cntr += players[i].rings;
|
||||
|
||||
if (cntr >= locvar1)
|
||||
P_SetMobjState(actor, locvar2);
|
||||
|
@ -9172,7 +9172,7 @@ void A_ForceWin(mobj_t *actor)
|
|||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (playeringame[i] && (players[i].health > 0
|
||||
if (playeringame[i] && ((players[i].mo && players[i].mo->health > 0)
|
||||
|| ((netgame || multiplayer) && (players[i].lives > 0 || players[i].continues > 0))))
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -796,16 +796,14 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
if (G_IsSpecialStage(gamemap) && !player->exiting)
|
||||
{ // In special stages, share rings. Everyone gives up theirs to the player who touched the capsule
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && (&players[i] != player) && players[i].mo->health > 1)
|
||||
if (playeringame[i] && (&players[i] != player) && players[i].rings > 0)
|
||||
{
|
||||
toucher->health += players[i].mo->health-1;
|
||||
player->health = toucher->health;
|
||||
players[i].mo->health = 1;
|
||||
players[i].health = players[i].mo->health;
|
||||
player->rings += players[i].rings;
|
||||
players[i].rings = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(player->health > 1) || player->exiting)
|
||||
if (player->rings <= 0 || player->exiting)
|
||||
return;
|
||||
|
||||
// Mark the player as 'pull into the capsule'
|
||||
|
@ -1366,11 +1364,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
else
|
||||
{
|
||||
P_PlayRinglossSound(toucher);
|
||||
if (toucher->health > 10)
|
||||
toucher->health -= 10;
|
||||
if (player->rings >= 10)
|
||||
player->rings -= 10;
|
||||
else
|
||||
toucher->health = 1;
|
||||
player->health = toucher->health;
|
||||
player->rings = 0;
|
||||
}
|
||||
|
||||
P_DoPlayerPain(player, special, NULL);
|
||||
|
@ -1475,6 +1472,9 @@ static void P_HitDeathMessages(player_t *player, mobj_t *inflictor, mobj_t *sour
|
|||
if (!player)
|
||||
return; // Impossible!
|
||||
|
||||
if (!player->mo)
|
||||
return; // Also impossible!
|
||||
|
||||
if (!netgame)
|
||||
return; // Presumably it's obvious what's happening in splitscreen.
|
||||
|
||||
|
@ -1483,7 +1483,7 @@ static void P_HitDeathMessages(player_t *player, mobj_t *inflictor, mobj_t *sour
|
|||
return;
|
||||
#endif
|
||||
|
||||
deadtarget = (player->health <= 0);
|
||||
deadtarget = (player->mo->health <= 0);
|
||||
|
||||
// Target's name
|
||||
snprintf(targetname, sizeof(targetname), "%s%s%s",
|
||||
|
@ -2428,26 +2428,25 @@ static inline boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *sou
|
|||
return true;
|
||||
}
|
||||
|
||||
if (target->health <= 1) // Death
|
||||
if (player->rings > 0) // Ring loss
|
||||
{
|
||||
P_PlayRinglossSound(target);
|
||||
P_PlayerRingBurst(player, player->rings);
|
||||
}
|
||||
else // Death
|
||||
{
|
||||
P_PlayDeathSound(target);
|
||||
P_PlayVictorySound(source); // Killer laughs at you! LAUGHS! BWAHAHAHHAHAA!!
|
||||
}
|
||||
else if (target->health > 1) // Ring loss
|
||||
{
|
||||
P_PlayRinglossSound(target);
|
||||
P_PlayerRingBurst(player, player->mo->health - 1);
|
||||
}
|
||||
|
||||
if (inflictor && ((inflictor->flags & MF_MISSILE) || inflictor->player) && player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))
|
||||
{
|
||||
player->health -= 10;
|
||||
if (player->health < 2)
|
||||
player->health = 2;
|
||||
target->health = player->health;
|
||||
player->rings -= 10;
|
||||
if (player->rings < 1)
|
||||
player->rings = 1;
|
||||
}
|
||||
else
|
||||
player->health = target->health = 1;
|
||||
player->rings = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -2497,7 +2496,7 @@ static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage)
|
|||
// Burst weapons and emeralds in Match/CTF only
|
||||
if (source && (gametype == GT_MATCH || gametype == GT_TEAMMATCH || gametype == GT_CTF))
|
||||
{
|
||||
P_PlayerRingBurst(player, player->health - 1);
|
||||
P_PlayerRingBurst(player, player->rings);
|
||||
P_PlayerEmeraldBurst(player, false);
|
||||
}
|
||||
|
||||
|
@ -2942,9 +2941,9 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
P_ShieldDamage(player, inflictor, source, damage);
|
||||
damage = 0;
|
||||
}
|
||||
else if (player->mo->health > 1) // No shield but have rings.
|
||||
else if (player->rings > 0) // No shield but have rings.
|
||||
{
|
||||
damage = player->mo->health - 1;
|
||||
damage = player->rings;
|
||||
P_RingDamage(player, inflictor, source, damage, damagetype);
|
||||
}
|
||||
else // No shield, no rings, no invincibility.
|
||||
|
@ -2974,26 +2973,28 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
}
|
||||
else
|
||||
{
|
||||
player->health -= (10 * (1 << (INT32)(player->powers[pw_super] / 10500)));
|
||||
if (player->health < 2)
|
||||
player->health = 2;
|
||||
player->rings -= (10 * (1 << (INT32)(player->powers[pw_super] / 10500)));
|
||||
if (player->rings < 1)
|
||||
player->rings = 1;
|
||||
}
|
||||
|
||||
if (gametype == GT_CTF && (player->gotflag & (GF_REDFLAG|GF_BLUEFLAG)))
|
||||
P_PlayerFlagBurst(player, false);
|
||||
damage = 0;
|
||||
}
|
||||
else if (damagetype & DMG_DEATHMASK)
|
||||
player->health = 0;
|
||||
else
|
||||
player->rings = 0;
|
||||
else if (damage == 0 || player->rings) //quickfix to just get things back to normal ...for now (sans Tag, I'll deal with that later)
|
||||
{
|
||||
player->health -= damage; // mirror mobj health here
|
||||
target->player->powers[pw_flashing] = flashingtics;
|
||||
if (damage > 0) // don't spill emeralds/ammo/panels for shield damage
|
||||
P_PlayerRingBurst(player, damage);
|
||||
player->rings -= damage;
|
||||
target->player->powers[pw_flashing] = flashingtics;
|
||||
damage = 0;
|
||||
}
|
||||
|
||||
if (player->health < 0)
|
||||
player->health = 0;
|
||||
if (player->rings < 0)
|
||||
player->rings = 0;
|
||||
|
||||
P_HitDeathMessages(player, inflictor, source, damagetype);
|
||||
|
||||
|
@ -3006,13 +3007,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
P_DamageMobj(source, target, target, 1, 0);
|
||||
|
||||
// do the damage
|
||||
if (player && player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]) && inflictor && ((inflictor->flags & MF_MISSILE) || inflictor->player))
|
||||
{
|
||||
target->health -= (10 * (1 << (INT32)(player->powers[pw_super] / 10500)));
|
||||
if (target->health < 2)
|
||||
target->health = 2;
|
||||
}
|
||||
else if (damagetype & DMG_DEATHMASK)
|
||||
if (damagetype & DMG_DEATHMASK)
|
||||
target->health = 0;
|
||||
else
|
||||
target->health -= damage;
|
||||
|
@ -3078,7 +3073,7 @@ void P_PlayerRingBurst(player_t *player, INT32 num_rings)
|
|||
return;
|
||||
|
||||
// If no health, don't spawn ring!
|
||||
if (player->mo->health <= 1)
|
||||
if (player->rings <= 0)
|
||||
num_rings = 0;
|
||||
|
||||
if (num_rings > 32 && !(player->pflags & PF_NIGHTSFALL))
|
||||
|
|
17
src/p_mobj.c
17
src/p_mobj.c
|
@ -3357,15 +3357,15 @@ boolean P_BossTargetPlayer(mobj_t *actor, boolean closest)
|
|||
|
||||
player = &players[actor->lastlook];
|
||||
|
||||
if (player->health <= 0)
|
||||
continue; // dead
|
||||
|
||||
if (player->pflags & PF_INVIS || player->bot || player->spectator)
|
||||
continue; // ignore notarget
|
||||
|
||||
if (!player->mo || P_MobjWasRemoved(player->mo))
|
||||
continue;
|
||||
|
||||
if (player->mo->health <= 0)
|
||||
continue; //dead
|
||||
|
||||
if (!P_CheckSight(actor, player->mo))
|
||||
continue; // out of sight
|
||||
|
||||
|
@ -3395,15 +3395,15 @@ boolean P_SupermanLook4Players(mobj_t *actor)
|
|||
{
|
||||
if (playeringame[c])
|
||||
{
|
||||
if (players[c].health <= 0)
|
||||
continue; // dead
|
||||
|
||||
if (players[c].pflags & PF_INVIS)
|
||||
continue; // ignore notarget
|
||||
|
||||
if (!players[c].mo || players[c].bot)
|
||||
continue;
|
||||
|
||||
if (players[c].mo->health <= 0)
|
||||
continue; // dead
|
||||
|
||||
playersinthegame[stop] = &players[c];
|
||||
stop++;
|
||||
}
|
||||
|
@ -6175,7 +6175,7 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
P_SetTarget(&mobj->target, NULL);
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && players[i].mo
|
||||
&& players[i].mare == mobj->threshold && players[i].health > 1)
|
||||
&& players[i].mare == mobj->threshold && players[i].rings > 0)
|
||||
{
|
||||
fixed_t dist = P_AproxDistance(players[i].mo->x - mobj->x, players[i].mo->y - mobj->y);
|
||||
if (dist < shortest)
|
||||
|
@ -7819,7 +7819,8 @@ void P_SpawnPlayer(INT32 playernum)
|
|||
// the dead body mobj retains the skin through the 'spritedef' override).
|
||||
mobj->skin = &skins[p->skin];
|
||||
|
||||
mobj->health = p->health;
|
||||
mobj->health = 1;
|
||||
p->rings = 0;
|
||||
p->playerstate = PST_LIVE;
|
||||
|
||||
p->bonustime = false;
|
||||
|
|
|
@ -125,7 +125,7 @@ static inline void P_NetArchivePlayers(void)
|
|||
WRITEANGLE(save_p, players[i].aiming);
|
||||
WRITEANGLE(save_p, players[i].awayviewaiming);
|
||||
WRITEINT32(save_p, players[i].awayviewtics);
|
||||
WRITEINT32(save_p, players[i].health);
|
||||
WRITEINT32(save_p, players[i].rings);
|
||||
|
||||
WRITESINT8(save_p, players[i].pity);
|
||||
WRITEINT32(save_p, players[i].currentweapon);
|
||||
|
@ -300,7 +300,7 @@ static inline void P_NetUnArchivePlayers(void)
|
|||
players[i].aiming = READANGLE(save_p);
|
||||
players[i].awayviewaiming = READANGLE(save_p);
|
||||
players[i].awayviewtics = READINT32(save_p);
|
||||
players[i].health = READINT32(save_p);
|
||||
players[i].rings = READINT32(save_p);
|
||||
|
||||
players[i].pity = READSINT8(save_p);
|
||||
players[i].currentweapon = READINT32(save_p);
|
||||
|
|
|
@ -2057,7 +2057,7 @@ static void P_LevelInitStuff(void)
|
|||
players[i].gotcontinue = false;
|
||||
|
||||
players[i].xtralife = players[i].deadtimer = players[i].numboxes = players[i].totalring = players[i].laps = 0;
|
||||
players[i].health = 1;
|
||||
players[i].rings = 0;
|
||||
players[i].aiming = 0;
|
||||
players[i].pflags &= ~PF_TIMEOVER;
|
||||
|
||||
|
|
22
src/p_spec.c
22
src/p_spec.c
|
@ -1592,10 +1592,10 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
|||
if (!playeringame[i] || players[i].spectator)
|
||||
continue;
|
||||
|
||||
if (!players[i].mo || players[i].mo->health < 1)
|
||||
if (!players[i].mo || players[i].rings <= 0)
|
||||
continue;
|
||||
|
||||
rings += players[i].mo->health-1;
|
||||
rings += players[i].rings;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -1603,7 +1603,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
|||
if (!(actor && actor->player))
|
||||
return false; // no player to count rings from here, sorry
|
||||
|
||||
rings = actor->health-1;
|
||||
rings = actor->player->rings;
|
||||
}
|
||||
|
||||
if (triggerline->flags & ML_NOCLIMB)
|
||||
|
@ -3499,10 +3499,9 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
|||
break;
|
||||
case 9: // Ring Drainer (Floor Touch)
|
||||
case 10: // Ring Drainer (No Floor Touch)
|
||||
if (leveltime % (TICRATE/2) == 0 && player->mo->health > 1)
|
||||
if (leveltime % (TICRATE/2) == 0 && player->rings > 0)
|
||||
{
|
||||
player->mo->health--;
|
||||
player->health--;
|
||||
player->rings--;
|
||||
S_StartSound(player->mo, sfx_itemup);
|
||||
}
|
||||
break;
|
||||
|
@ -3510,7 +3509,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
|||
if (player->powers[pw_invulnerability] || player->powers[pw_flashing] || player->powers[pw_super] || player->exiting || player->bot)
|
||||
break;
|
||||
|
||||
if (!(player->powers[pw_shield] || player->mo->health > 1)) // Don't do anything if no shield or rings anyway
|
||||
if (!(player->powers[pw_shield] || player->rings > 0)) // Don't do anything if no shield or rings anyway
|
||||
break;
|
||||
|
||||
if (player->powers[pw_shield])
|
||||
|
@ -3518,14 +3517,13 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
|||
P_RemoveShield(player);
|
||||
S_StartSound(player->mo, sfx_shldls); // Ba-Dum! Shield loss.
|
||||
}
|
||||
else if (player->mo->health > 1)
|
||||
else if (player->rings > 0)
|
||||
{
|
||||
P_PlayRinglossSound(player->mo);
|
||||
if (player->mo->health > 10)
|
||||
player->mo->health -= 10;
|
||||
if (player->rings >= 10)
|
||||
player->rings -= 10;
|
||||
else
|
||||
player->mo->health = 1;
|
||||
player->health = player->mo->health;
|
||||
player->rings = 0;
|
||||
}
|
||||
|
||||
P_DoPlayerPain(player, NULL, NULL); // this does basically everything that was here before
|
||||
|
|
|
@ -469,7 +469,7 @@ static inline void P_DoSpecialStageStuff(void)
|
|||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i])
|
||||
{
|
||||
ssrings += (players[i].mo->health-1);
|
||||
ssrings += players[i].rings;
|
||||
|
||||
// If in water, deplete timer 6x as fast.
|
||||
if ((players[i].mo->eflags & MFE_TOUCHWATER)
|
||||
|
|
113
src/p_user.c
113
src/p_user.c
|
@ -704,7 +704,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
|||
{
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i]/* && players[i].pflags & PF_NIGHTSMODE*/)
|
||||
total_rings += players[i].health-1;
|
||||
total_rings += players[i].rings;
|
||||
}
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
|
@ -722,8 +722,8 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
|||
}
|
||||
else
|
||||
{
|
||||
players[i].finishedrings = (INT16)(players[i].health - 1);
|
||||
P_AddPlayerScore(&players[i], (players[i].health - 1) * 50);
|
||||
players[i].finishedrings = (INT16)(players[i].rings);
|
||||
P_AddPlayerScore(&players[i], (players[i].rings) * 50);
|
||||
}
|
||||
|
||||
// Add score to leaderboards now
|
||||
|
@ -734,7 +734,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
|||
players[i].lastmarescore = players[i].marescore;
|
||||
players[i].marescore = 0;
|
||||
|
||||
players[i].mo->health = players[i].health = 1;
|
||||
players[i].rings = 0;
|
||||
P_DoPlayerExit(&players[i]);
|
||||
}
|
||||
}
|
||||
|
@ -742,12 +742,12 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
|||
{
|
||||
/// \todo Handle multi-mare special stages.
|
||||
// Ring bonus
|
||||
P_AddPlayerScore(player, (player->health - 1) * 50);
|
||||
P_AddPlayerScore(player, (player->rings) * 50);
|
||||
|
||||
player->lastmare = (UINT8)oldmare;
|
||||
player->texttimer = 4*TICRATE;
|
||||
player->textvar = 4; // Score and grades
|
||||
player->finishedrings = (INT16)(player->health - 1);
|
||||
player->finishedrings = (INT16)(player->rings);
|
||||
|
||||
// Add score to temp leaderboards
|
||||
if (!(netgame||multiplayer) && P_IsLocalPlayer(player))
|
||||
|
@ -758,7 +758,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
|||
player->marescore = 0;
|
||||
player->marebegunat = leveltime;
|
||||
|
||||
player->mo->health = player->health = 1;
|
||||
player->rings = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -901,30 +901,23 @@ void P_GivePlayerRings(player_t *player, INT32 num_rings)
|
|||
if (!player->mo)
|
||||
return;
|
||||
|
||||
player->mo->health += num_rings;
|
||||
player->health += num_rings;
|
||||
player->rings += num_rings;
|
||||
|
||||
if (!G_IsSpecialStage(gamemap) || !useNightsSS)
|
||||
player->totalring += num_rings;
|
||||
|
||||
// Can only get up to 9999 rings, sorry!
|
||||
if (player->mo->health > 10000)
|
||||
{
|
||||
player->mo->health = 10000;
|
||||
player->health = 10000;
|
||||
}
|
||||
else if (player->mo->health < 1)
|
||||
{
|
||||
player->mo->health = 1;
|
||||
player->health = 1;
|
||||
}
|
||||
if (player->rings > 9999)
|
||||
player->rings = 9999;
|
||||
else if (player->rings < 0)
|
||||
player->rings = 0;
|
||||
|
||||
// Now extra life bonuses are handled here instead of in P_MovePlayer, since why not?
|
||||
if (!ultimatemode && !modeattacking && !G_IsSpecialStage(gamemap) && G_GametypeUsesLives())
|
||||
{
|
||||
INT32 gainlives = 0;
|
||||
|
||||
while (player->xtralife < maxXtraLife && player->health > 100 * (player->xtralife+1))
|
||||
while (player->xtralife < maxXtraLife && player->rings >= 100 * (player->xtralife+1))
|
||||
{
|
||||
++gainlives;
|
||||
++player->xtralife;
|
||||
|
@ -975,10 +968,7 @@ void P_DoSuperTransformation(player_t *player, boolean giverings)
|
|||
player->mo->momx = player->mo->momy = player->mo->momz = 0;
|
||||
|
||||
if (giverings)
|
||||
{
|
||||
player->mo->health = 51;
|
||||
player->health = player->mo->health;
|
||||
}
|
||||
player->rings = 50;
|
||||
|
||||
// Just in case.
|
||||
if (!(mapheaderinfo[gamemap-1]->levelflags & LF_NOSSMUSIC))
|
||||
|
@ -3135,7 +3125,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
// Bounce ring
|
||||
else if (player->currentweapon == WEP_BOUNCE && player->powers[pw_bouncering])
|
||||
{
|
||||
if (player->health <= 1)
|
||||
if (player->rings <= 0)
|
||||
return;
|
||||
P_SetWeaponDelay(player, TICRATE/4);
|
||||
|
||||
|
@ -3145,13 +3135,12 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
mo->fuse = 3*TICRATE; // Bounce Ring time
|
||||
|
||||
player->powers[pw_bouncering]--;
|
||||
player->mo->health--;
|
||||
player->health--;
|
||||
player->rings--;
|
||||
}
|
||||
// Rail ring
|
||||
else if (player->currentweapon == WEP_RAIL && player->powers[pw_railring])
|
||||
{
|
||||
if (player->health <= 1)
|
||||
if (player->rings <= 0)
|
||||
return;
|
||||
P_SetWeaponDelay(player, (3*TICRATE)/2);
|
||||
|
||||
|
@ -3161,13 +3150,12 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
S_StartSound(player->mo, sfx_rail1);
|
||||
|
||||
player->powers[pw_railring]--;
|
||||
player->mo->health--;
|
||||
player->health--;
|
||||
player->rings--;
|
||||
}
|
||||
// Automatic
|
||||
else if (player->currentweapon == WEP_AUTO && player->powers[pw_automaticring])
|
||||
{
|
||||
if (player->health <= 1)
|
||||
if (player->rings <= 0)
|
||||
return;
|
||||
player->pflags &= ~PF_ATTACKDOWN;
|
||||
P_SetWeaponDelay(player, 2);
|
||||
|
@ -3175,26 +3163,24 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNAUTOMATIC, MF2_AUTOMATIC);
|
||||
|
||||
player->powers[pw_automaticring]--;
|
||||
player->mo->health--;
|
||||
player->health--;
|
||||
player->rings--;
|
||||
}
|
||||
// Explosion
|
||||
else if (player->currentweapon == WEP_EXPLODE && player->powers[pw_explosionring])
|
||||
{
|
||||
if (player->health <= 1)
|
||||
if (player->rings <= 0)
|
||||
return;
|
||||
P_SetWeaponDelay(player, (3*TICRATE)/2);
|
||||
|
||||
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNEXPLOSION, MF2_EXPLOSION);
|
||||
|
||||
player->powers[pw_explosionring]--;
|
||||
player->mo->health--;
|
||||
player->health--;
|
||||
player->rings--;
|
||||
}
|
||||
// Grenade
|
||||
else if (player->currentweapon == WEP_GRENADE && player->powers[pw_grenadering])
|
||||
{
|
||||
if (player->health <= 1)
|
||||
if (player->rings <= 0)
|
||||
return;
|
||||
P_SetWeaponDelay(player, TICRATE/3);
|
||||
|
||||
|
@ -3207,8 +3193,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
}
|
||||
|
||||
player->powers[pw_grenadering]--;
|
||||
player->mo->health--;
|
||||
player->health--;
|
||||
player->rings--;
|
||||
}
|
||||
// Scatter
|
||||
// Note: Ignores MF2_RAILRING
|
||||
|
@ -3218,7 +3203,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
angle_t shotangle = player->mo->angle;
|
||||
angle_t oldaiming = player->aiming;
|
||||
|
||||
if (player->health <= 1)
|
||||
if (player->rings <= 0)
|
||||
return;
|
||||
P_SetWeaponDelay(player, (2*TICRATE)/3);
|
||||
|
||||
|
@ -3247,8 +3232,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
player->aiming = oldaiming;
|
||||
|
||||
player->powers[pw_scatterring]--;
|
||||
player->mo->health--;
|
||||
player->health--;
|
||||
player->rings--;
|
||||
return;
|
||||
}
|
||||
// No powers, just a regular ring.
|
||||
|
@ -3272,7 +3256,7 @@ firenormal:
|
|||
// Red Ring
|
||||
else
|
||||
{
|
||||
if (player->health <= 1)
|
||||
if (player->rings <= 0)
|
||||
return;
|
||||
P_SetWeaponDelay(player, TICRATE/4);
|
||||
|
||||
|
@ -3281,8 +3265,7 @@ firenormal:
|
|||
if (mo)
|
||||
P_ColorTeamMissile(mo, player);
|
||||
|
||||
player->mo->health--;
|
||||
player->health--;
|
||||
player->rings--;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3336,7 +3319,7 @@ static void P_DoSuperStuff(player_t *player)
|
|||
return; // NiGHTS Super doesn't mix with normal super
|
||||
|
||||
// Does player have all emeralds? If so, flag the "Ready For Super!"
|
||||
if ((ALL7EMERALDS(emeralds) || ALL7EMERALDS(player->powers[pw_emeralds])) && player->health > 50)
|
||||
if ((ALL7EMERALDS(emeralds) || ALL7EMERALDS(player->powers[pw_emeralds])) && player->rings >= 50)
|
||||
player->pflags |= PF_SUPERREADY;
|
||||
else
|
||||
player->pflags &= ~PF_SUPERREADY;
|
||||
|
@ -3374,10 +3357,7 @@ static void P_DoSuperStuff(player_t *player)
|
|||
|
||||
// Deplete one ring every second while super
|
||||
if ((leveltime % TICRATE == 0) && !(player->exiting))
|
||||
{
|
||||
player->health--;
|
||||
player->mo->health--;
|
||||
}
|
||||
player->rings--;
|
||||
|
||||
switch (player->skin)
|
||||
{
|
||||
|
@ -3412,7 +3392,7 @@ static void P_DoSuperStuff(player_t *player)
|
|||
G_GhostAddColor(GHC_SUPER);
|
||||
|
||||
// Ran out of rings while super!
|
||||
if (player->health <= 1 || player->exiting)
|
||||
if (player->rings <= 0 || player->exiting)
|
||||
{
|
||||
player->powers[pw_emeralds] = 0; // lost the power stones
|
||||
P_SpawnGhostMobj(player->mo);
|
||||
|
@ -3465,12 +3445,6 @@ static void P_DoSuperStuff(player_t *player)
|
|||
P_SetPlayerMobjState(player->mo, S_PLAY_RIDE);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!player->exiting)
|
||||
{
|
||||
player->health = 1;
|
||||
player->mo->health = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Inform the netgame that the champion has fallen in the heat of battle.
|
||||
|
@ -5392,12 +5366,10 @@ static void P_DoNiGHTSCapsule(player_t *player)
|
|||
if (G_IsSpecialStage(gamemap))
|
||||
{ // In special stages, share rings. Everyone gives up theirs to the capsule player always, because we can't have any individualism here!
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && (&players[i] != player) && players[i].mo->health > 1)
|
||||
if (playeringame[i] && (&players[i] != player) && players[i].rings > 0)
|
||||
{
|
||||
player->mo->health += players[i].mo->health-1;
|
||||
player->health = player->mo->health;
|
||||
players[i].mo->health = 1;
|
||||
players[i].health = players[i].mo->health;
|
||||
player->rings += players[i].rings;
|
||||
players[i].rings = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5406,10 +5378,9 @@ static void P_DoNiGHTSCapsule(player_t *player)
|
|||
&& player->mo->y == player->capsule->y
|
||||
&& player->mo->z == player->capsule->z+(player->capsule->height/3))
|
||||
{
|
||||
if (player->mo->health > 1)
|
||||
if (player->rings > 0)
|
||||
{
|
||||
player->mo->health--;
|
||||
player->health--;
|
||||
player->rings--;
|
||||
player->capsule->health--;
|
||||
player->capsule->extravalue1++;
|
||||
|
||||
|
@ -6129,7 +6100,7 @@ static void P_PlayerDropWeapon(player_t *player)
|
|||
|
||||
if (mo)
|
||||
{
|
||||
player->mo->health--;
|
||||
player->rings--;
|
||||
P_InstaThrust(mo, player->mo->angle-ANGLE_180, 8*FRACUNIT);
|
||||
P_SetObjectMomZ(mo, 4*FRACUNIT, false);
|
||||
mo->flags2 |= MF2_DONTRESPAWN;
|
||||
|
@ -6416,7 +6387,7 @@ static void P_MovePlayer(player_t *player)
|
|||
if (playeringame[i])
|
||||
players[i].exiting = (14*TICRATE)/5 + 1;
|
||||
}
|
||||
else if (player->health > 1)
|
||||
else if (player->rings > 0)
|
||||
P_DamageMobj(player->mo, NULL, NULL, 1, 0);
|
||||
player->pflags &= ~PF_NIGHTSFALL;
|
||||
}
|
||||
|
@ -8613,7 +8584,7 @@ void P_PlayerThink(player_t *player)
|
|||
#endif
|
||||
|
||||
// todo: Figure out what is actually causing these problems in the first place...
|
||||
if ((player->health <= 0 || player->mo->health <= 0) && player->playerstate == PST_LIVE) //you should be DEAD!
|
||||
if (player->mo->health <= 0 && player->playerstate == PST_LIVE) //you should be DEAD!
|
||||
{
|
||||
CONS_Debug(DBG_GAMELOGIC, "P_PlayerThink: Player %s in PST_LIVE with 0 health. (\"Zombie bug\")\n", sizeu1(playeri));
|
||||
player->playerstate = PST_DEAD;
|
||||
|
@ -8713,7 +8684,7 @@ void P_PlayerThink(player_t *player)
|
|||
// it to the exit, you're a goner!
|
||||
else if (countdown == 1 && !player->exiting && player->lives > 0)
|
||||
{
|
||||
if (netgame && player->health > 0)
|
||||
if (netgame && player->mo->health > 0)
|
||||
CONS_Printf(M_GetText("%s ran out of time.\n"), player_names[player-players]);
|
||||
|
||||
player->pflags |= PF_TIMEOVER;
|
||||
|
@ -8802,7 +8773,7 @@ void P_PlayerThink(player_t *player)
|
|||
{
|
||||
player->score = 0;
|
||||
player->mo->health = 1;
|
||||
player->health = 1;
|
||||
player->rings = 0;
|
||||
}
|
||||
|
||||
if ((netgame || multiplayer) && player->lives <= 0)
|
||||
|
@ -9270,7 +9241,7 @@ void P_PlayerAfterThink(player_t *player)
|
|||
player->currentweapon = 0;
|
||||
|
||||
// If you're out of rings, but have Infinity Rings left, switch to that.
|
||||
if (player->currentweapon != 0 && player->health <= 1 && player->powers[pw_infinityring])
|
||||
if (player->currentweapon != 0 && player->rings <= 0 && player->powers[pw_infinityring])
|
||||
player->currentweapon = 0;
|
||||
|
||||
if (P_IsLocalPlayer(player) && (player->pflags & PF_WPNDOWN) && player->currentweapon != oldweapon)
|
||||
|
|
|
@ -660,9 +660,9 @@ static void ST_drawTime(void)
|
|||
|
||||
static inline void ST_drawRings(void)
|
||||
{
|
||||
INT32 ringnum = max(stplyr->health-1, 0);
|
||||
INT32 ringnum = max(stplyr->rings, 0);
|
||||
|
||||
ST_DrawPatchFromHudWS(HUD_RINGS, ((stplyr->health <= 1 && leveltime/5 & 1) ? rrings : sborings));
|
||||
ST_DrawPatchFromHudWS(HUD_RINGS, ((stplyr->rings <= 0 && leveltime/5 & 1) ? rrings : sborings));
|
||||
|
||||
if (objectplacing)
|
||||
ringnum = op_currentdoomednum;
|
||||
|
@ -671,8 +671,8 @@ static inline void ST_drawRings(void)
|
|||
INT32 i;
|
||||
ringnum = 0;
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && players[i].mo && players[i].mo->health > 1)
|
||||
ringnum += players[i].mo->health - 1;
|
||||
if (playeringame[i] && players[i].mo && players[i].rings > 0)
|
||||
ringnum += players[i].rings;
|
||||
}
|
||||
|
||||
ST_DrawNumFromHudWS(HUD_RINGSNUM, ringnum);
|
||||
|
@ -1133,11 +1133,11 @@ static void ST_drawNiGHTSHUD(void)
|
|||
INT32 i;
|
||||
total_ringcount = 0;
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] /*&& players[i].pflags & PF_NIGHTSMODE*/ && players[i].health)
|
||||
total_ringcount += players[i].health - 1;
|
||||
if (playeringame[i] /*&& players[i].pflags & PF_NIGHTSMODE*/ && players[i].rings)
|
||||
total_ringcount += players[i].rings;
|
||||
}
|
||||
else
|
||||
total_ringcount = stplyr->health-1;
|
||||
total_ringcount = stplyr->rings;
|
||||
|
||||
if (stplyr->capsule)
|
||||
{
|
||||
|
@ -1349,7 +1349,7 @@ static void ST_drawWeaponRing(powertype_t weapon, INT32 rwflag, INT32 wepflag, I
|
|||
txtflags |= V_YELLOWMAP;
|
||||
|
||||
if (weapon == pw_infinityring
|
||||
|| (stplyr->ringweapons & rwflag && stplyr->health > 1))
|
||||
|| (stplyr->ringweapons & rwflag && stplyr->rings > 0))
|
||||
txtflags |= V_20TRANS;
|
||||
else
|
||||
{
|
||||
|
@ -1383,7 +1383,7 @@ static void ST_drawMatchHUD(void)
|
|||
|
||||
if (stplyr->powers[pw_infinityring])
|
||||
ST_drawWeaponRing(pw_infinityring, 0, 0, offset, infinityring);
|
||||
else if (stplyr->health > 1)
|
||||
else if (stplyr->rings > 0)
|
||||
V_DrawScaledPatch(8 + offset, STRINGY(162), V_SNAPTOLEFT, normring);
|
||||
else
|
||||
V_DrawTranslucentPatch(8 + offset, STRINGY(162), V_SNAPTOLEFT|V_80TRANS, normring);
|
||||
|
|
|
@ -792,13 +792,13 @@ static void Y_UpdateRecordReplays(void)
|
|||
if ((mainrecords[gamemap-1]->time == 0) || (players[consoleplayer].realtime < mainrecords[gamemap-1]->time))
|
||||
mainrecords[gamemap-1]->time = players[consoleplayer].realtime;
|
||||
|
||||
if ((UINT16)(players[consoleplayer].health - 1) > mainrecords[gamemap-1]->rings)
|
||||
mainrecords[gamemap-1]->rings = (UINT16)(players[consoleplayer].health - 1);
|
||||
if ((UINT16)(players[consoleplayer].rings) > mainrecords[gamemap-1]->rings)
|
||||
mainrecords[gamemap-1]->rings = (UINT16)(players[consoleplayer].rings);
|
||||
|
||||
// Save demo!
|
||||
bestdemo[255] = '\0';
|
||||
lastdemo[255] = '\0';
|
||||
G_SetDemoTime(players[consoleplayer].realtime, players[consoleplayer].score, (UINT16)(players[consoleplayer].health-1));
|
||||
G_SetDemoTime(players[consoleplayer].realtime, players[consoleplayer].score, (UINT16)(players[consoleplayer].rings));
|
||||
G_CheckDemoStatus();
|
||||
|
||||
I_mkdir(va("%s"PATHSEP"replay", srb2home), 0755);
|
||||
|
@ -1373,7 +1373,7 @@ static void Y_CalculateCompetitionWinners(void)
|
|||
bestat[j] = true;
|
||||
|
||||
times[i] = players[i].realtime;
|
||||
rings[i] = (UINT32)max(players[i].health-1, 0);
|
||||
rings[i] = (UINT32)max(players[i].rings, 0);
|
||||
maxrings[i] = (UINT32)players[i].totalring;
|
||||
monitors[i] = (UINT32)players[i].numboxes;
|
||||
scores[i] = (UINT32)min(players[i].score, 99999990);
|
||||
|
@ -1388,7 +1388,7 @@ static void Y_CalculateCompetitionWinners(void)
|
|||
else
|
||||
bestat[0] = false;
|
||||
|
||||
if (max(players[i].health-1, 0) >= max(players[j].health-1, 0))
|
||||
if (max(players[i].rings, 0) >= max(players[j].rings, 0))
|
||||
points[i]++;
|
||||
else
|
||||
bestat[1] = false;
|
||||
|
@ -1511,7 +1511,7 @@ static void Y_SetRingBonus(player_t *player, y_bonus_t *bstruct)
|
|||
{
|
||||
strncpy(bstruct->patch, "YB_RING", sizeof(bstruct->patch));
|
||||
bstruct->display = true;
|
||||
bstruct->points = max(0, (player->health-1) * 100);
|
||||
bstruct->points = max(0, (player->rings) * 100);
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -1559,7 +1559,7 @@ static void Y_SetPerfectBonus(player_t *player, y_bonus_t *bstruct)
|
|||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (!playeringame[i]) continue;
|
||||
sharedringtotal += players[i].health - 1;
|
||||
sharedringtotal += players[i].rings;
|
||||
}
|
||||
if (!sharedringtotal || sharedringtotal < nummaprings)
|
||||
data.coop.gotperfbonus = 0;
|
||||
|
|
Loading…
Reference in a new issue