ReC98/th02/main/score.cpp

124 lines
2.8 KiB
C++
Raw Normal View History

#include "th02/main/score.hpp"
// State
// -----
// Amount of points transferred from [score_delta] to [score] during the
// previous frame.
extern unsigned int score_delta_transferred_prev;
// -----
void near score_extend_init(void)
{
extends_gained = 0;
while(EXTEND_SCORES[extends_gained] <= score) {
extends_gained++;
}
score_delta = 0;
}
void score_delta_commit(void)
{
score += score_delta;
score_delta = 0;
score_delta_transferred_prev = 0;
}
void near score_reset(void)
{
extern int32_t score_reset_unknown_40000;
score = 0;
score_delta = 0;
score_delta_transferred_prev = 0;
score_reset_unknown_40000 = 40000;
}
// Due to how the branches below are nested, it's not worth it to try working
// around these warnings.
#if defined(__TURBOC__) && defined(__MSDOS__)
#pragma warn -rch
#pragma warn -ccc
#endif
#define score_render_and_process_hiscore_and_extends( \
turn_capped_lives_into_bombs \
) { \
hud_score_put(HUD_SCORE_Y, score); \
if(score > hiscore) { \
hiscore = score; \
hud_score_put(HUD_HISCORE_Y, hiscore); \
} \
if(EXTEND_SCORES[extends_gained] <= score) { \
if(lives < LIVES_MAX) { \
lives++; \
hud_lives_put(); \
snd_se_play(8); \
} else if(turn_capped_lives_into_bombs) { \
if(bombs < BOMBS_MAX) { \
bombs++; \
hud_bombs_put(); \
} \
\
/* ZUN quirk: Playing a sound even if the player got nothing? */ \
snd_se_play(8); \
} \
extends_gained++; \
} \
}
void near score_update_and_render(void)
{
if(score_delta != 0) {
if(!reduce_effects) {
// ZUN bloat: score_delta_transferred_prev = max(
// score_delta_transferred_prev,
// min(max((score_delta / 32), 1), 1111)
// );
score_t to_transfer = score_delta;
if(to_transfer < 32) {
to_transfer = 32;
}
to_transfer >>= 5;
if(score_delta_transferred_prev < to_transfer) {
if(to_transfer > 1111) {
to_transfer = 1111;
}
score_delta_transferred_prev = to_transfer;
}
} else {
score_delta_transferred_prev = 3111;
}
// ZUN bloat: score_delta_transferred_prev = max(
// score_delta_transferred_prev, score_delta
// );
// score_delta -= score_delta_transferred_prev;
//
// (In fact, the original algorithm requires `score_t` to be signed.)
score_t delta_rem = score_delta;
delta_rem -= score_delta_transferred_prev;
if(delta_rem < 0) {
score_delta_transferred_prev = score_delta;
delta_rem = 0;
}
score_delta = delta_rem;
score += score_delta_transferred_prev;
score_render_and_process_hiscore_and_extends(true);
} else {
score_delta_transferred_prev = 0;
}
}
void score_grant_current_delta_as_bonus(void)
{
score += score_delta;
score_render_and_process_hiscore_and_extends(false);
}
#if defined(__TURBOC__) && defined(__MSDOS__)
#pragma warn .rch
#pragma warn .ccc
#endif