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;
}
players[i].bumpers = 0;
P_DoPlayerExit(&players[i]);
}
K_CheckBumpers();
}
UINT16 K_GetChaosEmeraldColor(UINT32 emeraldType)
@ -791,7 +789,14 @@ void K_BattleInit(boolean singleplayercontext)
{
if (!playeringame[i] || players[i].spectator)
continue;
players[i].bumpers = maxbumpers;
if (players[i].mo)
{
players[i].mo->health = maxbumpers;
}
K_SpawnPlayerBattleBumpers(players+i);
}
}

View file

@ -4188,35 +4188,35 @@ void K_HandleBumperChanges(player_t *player, UINT8 prevBumpers)
{
player->pflags |= (PF_NOCONTEST|PF_ELIMINATED);
}
P_KillMobj(player->mo, NULL, NULL, DMG_NORMAL);
}
K_CalculateBattleWanted();
K_CheckBumpers();
}
void K_DestroyBumpers(player_t *player, UINT8 amount)
UINT8 K_DestroyBumpers(player_t *player, UINT8 amount)
{
UINT8 oldBumpers = player->bumpers;
if (!(gametyperules & GTR_BUMPERS))
{
return;
return 0;
}
amount = min(amount, player->bumpers);
if (amount == 0)
{
return;
return 0;
}
player->bumpers -= amount;
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 oldVictimBumpers = victim->bumpers;
@ -4225,14 +4225,14 @@ void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount)
if (!(gametyperules & GTR_BUMPERS))
{
return;
return 0;
}
amount = min(amount, victim->bumpers);
if (amount == 0)
{
return;
return 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)
{
// No change occured.
return;
return 0;
}
// Play steal sound
@ -4295,6 +4295,8 @@ void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount)
K_HandleBumperChanges(player, oldPlayerBumpers);
K_HandleBumperChanges(victim, oldVictimBumpers);
return tookBumpers;
}
#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);
void K_DebtStingPlayer(player_t *player, mobj_t *source);
void K_HandleBumperChanges(player_t *player, UINT8 prevBumpers);
void K_DestroyBumpers(player_t *player, UINT8 amount);
void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount);
UINT8 K_DestroyBumpers(player_t *player, UINT8 amount);
UINT8 K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount);
void K_MineFlashScreen(mobj_t *source);
void K_SpawnMineExplosion(mobj_t *source, UINT8 color, tic_t delay);
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
INT16 ringburst = 5;
// Do not die from damage outside of bumpers health system
damage = 0;
// Check if the player is allowed to be damaged!
// If not, then spawn the instashield effect instead.
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_BattleAwardHit(source->player, player, inflictor, takeBumpers);
K_TakeBumpersFromPlayer(source->player, player, takeBumpers);
damage = K_TakeBumpersFromPlayer(source->player, player, takeBumpers);
if (type == DMG_KARMA)
{
// Destroy any remainder bumpers from the player for karma comeback damage
K_DestroyBumpers(player, player->bumpers);
damage = K_DestroyBumpers(player, player->bumpers);
}
else
{
@ -2303,7 +2306,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
}
else
{
K_DestroyBumpers(player, takeBumpers);
damage = K_DestroyBumpers(player, takeBumpers);
}
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)
{
player->instashield = 15;
K_SetHitLagForObjects(target, inflictor, laglength, true);
}
if (inflictor && !P_MobjWasRemoved(inflictor) && inflictor->type == MT_BANANA)
{
player->flipDI = true;
}
return true;
}
}
else
@ -2433,16 +2433,16 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
//K_SetHitLagForObjects(target, inflictor, laglength, true);
if (player)
P_ResetPlayer(target->player);
else
if (!player)
{
P_SetMobjState(target, target->info->painstate);
if (!P_MobjWasRemoved(target))
{
// if not intent on another player,
// chase after this one
P_SetTarget(&target->target, source);
if (!P_MobjWasRemoved(target))
{
// if not intent on another player,
// chase after this one
P_SetTarget(&target->target, source);
}
}
return true;

View file

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