Cleanup of boss info in anticipation of merger.

* Actually add descriptions for the boss-related functions into k_boss.h.
* Introduce K_ResetBossInfo, an internal-only function for handling situations where it needs to be cleared.
* Fix a bug where bossinfo wasn't reset when using the map command to go to a battle map after having been in a boss.
* Fix some bugs where you could provide magnitudes out of the desired range to K_InitBossHealthBar and K_UpdateBossHealthBar.
This commit is contained in:
toaster 2022-03-07 13:08:46 +00:00
parent 590d236b66
commit 5c77516aab
5 changed files with 77 additions and 19 deletions

View file

@ -930,11 +930,7 @@ void D_StartTitle(void)
memset(&grandprixinfo, 0, sizeof(struct grandprixinfo));
// Reset boss info
if (bossinfo.enemyname)
Z_Free(bossinfo.enemyname);
if (bossinfo.subtitle)
Z_Free(bossinfo.subtitle);
memset(&bossinfo, 0, sizeof(struct bossinfo));
K_ResetBossInfo();
// empty maptol so mario/etc sounds don't play in sound test when they shouldn't
maptol = 0;

View file

@ -2749,17 +2749,11 @@ static void Command_Map_f(void)
if (newgametype == GT_BATTLE)
{
grandprixinfo.gp = false;
K_ResetBossInfo();
if (mapheaderinfo[newmapnum-1] &&
mapheaderinfo[newmapnum-1]->typeoflevel & TOL_BOSS)
{
// Reset boss info
if (bossinfo.enemyname)
Z_Free(bossinfo.enemyname);
if (bossinfo.subtitle)
Z_Free(bossinfo.subtitle);
memset(&bossinfo, 0, sizeof(struct bossinfo));
bossinfo.boss = true;
bossinfo.encore = newencoremode;
}

View file

@ -22,6 +22,18 @@
struct bossinfo bossinfo;
/*--------------------------------------------------
void K_ClearBossInfo(void)
See header file for description.
--------------------------------------------------*/
void K_ResetBossInfo(void)
{
Z_Free(bossinfo.enemyname);
Z_Free(bossinfo.subtitle);
memset(&bossinfo, 0, sizeof(struct bossinfo));
}
/*--------------------------------------------------
void K_BossInfoTicker(void)
@ -118,6 +130,11 @@ void K_InitBossHealthBar(const char *enemyname, const char *subtitle, sfxenum_t
bossinfo.barlen = BOSSHEALTHBARLEN;
K_UpdateBossHealthBar(FRACUNIT, 0);
if (pinchmagnitude > FRACUNIT)
pinchmagnitude = FRACUNIT;
else if (pinchmagnitude < 0)
pinchmagnitude = 0;
bossinfo.healthbarpinch = FixedMul(pinchmagnitude, BOSSHEALTHBARLEN*FRACUNIT)>>FRACBITS;
// we do this here so we can fudge our working a bit
@ -143,6 +160,11 @@ void K_InitBossHealthBar(const char *enemyname, const char *subtitle, sfxenum_t
void K_UpdateBossHealthBar(fixed_t magnitude, tic_t jitterlen)
{
if (magnitude > FRACUNIT)
magnitude = FRACUNIT;
else if (magnitude < 0)
magnitude = 0;
if (jitterlen > bossinfo.visualbarimpact)
bossinfo.visualbarimpact = jitterlen;
bossinfo.healthbar = FixedMul(magnitude, BOSSHEALTHBARLEN);

View file

@ -55,9 +55,61 @@ extern struct bossinfo
char *subtitle; ///< The subtitle under the titlecard
} bossinfo;
/*--------------------------------------------------
void K_ResetBossInfo(void);
Resets boss information to a clean slate.
--------------------------------------------------*/
void K_ResetBossInfo(void);
/*--------------------------------------------------
void K_ResetBossInfo(void);
Updates boss information and timers for this level tic.
--------------------------------------------------*/
void K_BossInfoTicker(void);
/*--------------------------------------------------
void K_InitBossHealthBar(const char *enemyname, const char *subtitle, sfxenum_t titlesound, fixed_t pinchmagnitude, UINT8 divisions);
Initialises boss information for opponent spawn, including filling the health bar.
Input Arguments:-
enemyname - Zone memory string for HUD/titlecard name.
subtitle - Zone memory string for titlecard subtitle.
titlesound - Sound effect enum for titlecard typewriting.
pinchmagnitude - 0-FRACUNIT range for healthbar to display pinch status at.
divisions - # of segments on healthbar.
--------------------------------------------------*/
void K_InitBossHealthBar(const char *enemyname, const char *subtitle, sfxenum_t titlesound, fixed_t pinchmagnitude, UINT8 divisions);
/*--------------------------------------------------
void K_UpdateBossHealthBar(fixed_t magnitude, tic_t jitterlen);
Updates boss healthbar to a new magnitude.
Input Arguments:-
magnitude - 0-FRACUNIT range for healthbar to update to.
jitterlen - Duration healthbar should vibrate for.
--------------------------------------------------*/
void K_UpdateBossHealthBar(fixed_t magnitude, tic_t jitterlen);
/*--------------------------------------------------
void K_DeclareWeakspot(mobj_t *spot, spottype_t spottype, UINT16 color, boolean minimap);
Updates the list of Weakspots for the HUD/minimap object tracking.
Input Arguments:-
spot - mobj_t reference.
spottype - Type of spot.
color - Color of associated UI elements.
minimap - If true, appear on minimap.
--------------------------------------------------*/
void K_DeclareWeakspot(mobj_t *spot, spottype_t spottype, UINT16 color, boolean minimap);
#endif

View file

@ -7839,13 +7839,7 @@ static void M_StartBoss(INT32 choice)
M_ClearMenus(true);
// Reset boss info
if (bossinfo.enemyname)
Z_Free(bossinfo.enemyname);
if (bossinfo.subtitle)
Z_Free(bossinfo.subtitle);
memset(&bossinfo, 0, sizeof(struct bossinfo));
K_ResetBossInfo();
bossinfo.boss = true;
bossinfo.encore = (boolean)(cv_dummygpencore.value);