Merge branch 'bumpers-use-health' into 'master'

Sync player mobj health to bumper count

See merge request KartKrew/Kart!1003
This commit is contained in:
James R 2023-03-06 15:43:24 +00:00
commit feb70916c1
5 changed files with 40 additions and 28 deletions

View file

@ -183,10 +183,8 @@ void K_CheckEmeralds(player_t *player)
continue; continue;
} }
players[i].bumpers = 0; P_DoPlayerExit(&players[i]);
} }
K_CheckBumpers();
} }
UINT16 K_GetChaosEmeraldColor(UINT32 emeraldType) UINT16 K_GetChaosEmeraldColor(UINT32 emeraldType)
@ -791,7 +789,14 @@ void K_BattleInit(boolean singleplayercontext)
{ {
if (!playeringame[i] || players[i].spectator) if (!playeringame[i] || players[i].spectator)
continue; continue;
players[i].bumpers = maxbumpers; players[i].bumpers = maxbumpers;
if (players[i].mo)
{
players[i].mo->health = maxbumpers;
}
K_SpawnPlayerBattleBumpers(players+i); K_SpawnPlayerBattleBumpers(players+i);
} }
} }

View file

@ -4188,35 +4188,35 @@ void K_HandleBumperChanges(player_t *player, UINT8 prevBumpers)
{ {
player->pflags |= (PF_NOCONTEST|PF_ELIMINATED); player->pflags |= (PF_NOCONTEST|PF_ELIMINATED);
} }
P_KillMobj(player->mo, NULL, NULL, DMG_NORMAL);
} }
K_CalculateBattleWanted(); K_CalculateBattleWanted();
K_CheckBumpers(); K_CheckBumpers();
} }
void K_DestroyBumpers(player_t *player, UINT8 amount) UINT8 K_DestroyBumpers(player_t *player, UINT8 amount)
{ {
UINT8 oldBumpers = player->bumpers; UINT8 oldBumpers = player->bumpers;
if (!(gametyperules & GTR_BUMPERS)) if (!(gametyperules & GTR_BUMPERS))
{ {
return; return 0;
} }
amount = min(amount, player->bumpers); amount = min(amount, player->bumpers);
if (amount == 0) if (amount == 0)
{ {
return; return 0;
} }
player->bumpers -= amount; player->bumpers -= amount;
K_HandleBumperChanges(player, oldBumpers); K_HandleBumperChanges(player, oldBumpers);
return amount;
} }
void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount) UINT8 K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount)
{ {
UINT8 oldPlayerBumpers = player->bumpers; UINT8 oldPlayerBumpers = player->bumpers;
UINT8 oldVictimBumpers = victim->bumpers; UINT8 oldVictimBumpers = victim->bumpers;
@ -4225,14 +4225,14 @@ void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount)
if (!(gametyperules & GTR_BUMPERS)) if (!(gametyperules & GTR_BUMPERS))
{ {
return; return 0;
} }
amount = min(amount, victim->bumpers); amount = min(amount, victim->bumpers);
if (amount == 0) if (amount == 0)
{ {
return; return 0;
} }
while ((tookBumpers < amount) && (victim->bumpers > 0)) while ((tookBumpers < amount) && (victim->bumpers > 0))
@ -4287,7 +4287,7 @@ void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount)
if (tookBumpers == 0) if (tookBumpers == 0)
{ {
// No change occured. // No change occured.
return; return 0;
} }
// Play steal sound // Play steal sound
@ -4295,6 +4295,8 @@ void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount)
K_HandleBumperChanges(player, oldPlayerBumpers); K_HandleBumperChanges(player, oldPlayerBumpers);
K_HandleBumperChanges(victim, oldVictimBumpers); K_HandleBumperChanges(victim, oldVictimBumpers);
return tookBumpers;
} }
#define MINEQUAKEDIST 4096 #define MINEQUAKEDIST 4096

View file

@ -103,8 +103,8 @@ void K_UpdateStumbleIndicator(player_t *player);
INT32 K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source); INT32 K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source);
void K_DebtStingPlayer(player_t *player, mobj_t *source); void K_DebtStingPlayer(player_t *player, mobj_t *source);
void K_HandleBumperChanges(player_t *player, UINT8 prevBumpers); void K_HandleBumperChanges(player_t *player, UINT8 prevBumpers);
void K_DestroyBumpers(player_t *player, UINT8 amount); UINT8 K_DestroyBumpers(player_t *player, UINT8 amount);
void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount); UINT8 K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount);
void K_MineFlashScreen(mobj_t *source); void K_MineFlashScreen(mobj_t *source);
void K_SpawnMineExplosion(mobj_t *source, UINT8 color, tic_t delay); void K_SpawnMineExplosion(mobj_t *source, UINT8 color, tic_t delay);
void K_RunFinishLineBeam(void); void K_RunFinishLineBeam(void);

View file

@ -2146,6 +2146,9 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
const boolean hardhit = (type == DMG_EXPLODE || type == DMG_KARMA || type == DMG_TUMBLE); // This damage type can do evil stuff like ALWAYS combo const boolean hardhit = (type == DMG_EXPLODE || type == DMG_KARMA || type == DMG_TUMBLE); // This damage type can do evil stuff like ALWAYS combo
INT16 ringburst = 5; INT16 ringburst = 5;
// Do not die from damage outside of bumpers health system
damage = 0;
// Check if the player is allowed to be damaged! // Check if the player is allowed to be damaged!
// If not, then spawn the instashield effect instead. // If not, then spawn the instashield effect instead.
if (!force) if (!force)
@ -2275,12 +2278,12 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
K_TryHurtSoundExchange(target, source); K_TryHurtSoundExchange(target, source);
K_BattleAwardHit(source->player, player, inflictor, takeBumpers); K_BattleAwardHit(source->player, player, inflictor, takeBumpers);
K_TakeBumpersFromPlayer(source->player, player, takeBumpers); damage = K_TakeBumpersFromPlayer(source->player, player, takeBumpers);
if (type == DMG_KARMA) if (type == DMG_KARMA)
{ {
// Destroy any remainder bumpers from the player for karma comeback damage // Destroy any remainder bumpers from the player for karma comeback damage
K_DestroyBumpers(player, player->bumpers); damage = K_DestroyBumpers(player, player->bumpers);
} }
else else
{ {
@ -2303,7 +2306,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
} }
else else
{ {
K_DestroyBumpers(player, takeBumpers); damage = K_DestroyBumpers(player, takeBumpers);
} }
if (!(damagetype & DMG_STEAL)) if (!(damagetype & DMG_STEAL))
@ -2389,15 +2392,12 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
if (type != DMG_STUMBLE) if (type != DMG_STUMBLE)
{ {
player->instashield = 15; player->instashield = 15;
K_SetHitLagForObjects(target, inflictor, laglength, true);
} }
if (inflictor && !P_MobjWasRemoved(inflictor) && inflictor->type == MT_BANANA) if (inflictor && !P_MobjWasRemoved(inflictor) && inflictor->type == MT_BANANA)
{ {
player->flipDI = true; player->flipDI = true;
} }
return true;
} }
} }
else else
@ -2433,9 +2433,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
//K_SetHitLagForObjects(target, inflictor, laglength, true); //K_SetHitLagForObjects(target, inflictor, laglength, true);
if (player) if (!player)
P_ResetPlayer(target->player); {
else
P_SetMobjState(target, target->info->painstate); P_SetMobjState(target, target->info->painstate);
if (!P_MobjWasRemoved(target)) if (!P_MobjWasRemoved(target))
@ -2444,6 +2443,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
// chase after this one // chase after this one
P_SetTarget(&target->target, source); P_SetTarget(&target->target, source);
} }
}
return true; return true;
} }

View file

@ -11829,6 +11829,11 @@ void P_SpawnPlayer(INT32 playernum)
p->bumpers = K_StartingBumperCount(); p->bumpers = K_StartingBumperCount();
K_SpawnPlayerBattleBumpers(p); K_SpawnPlayerBattleBumpers(p);
} }
if (p->bumpers > 0)
{
mobj->health = p->bumpers;
}
} }
// I'm not refactoring the loop at the top of this file. // I'm not refactoring the loop at the top of this file.