mirror of https://github.com/nmlgc/ReC98.git
124 lines
2.8 KiB
C++
124 lines
2.8 KiB
C++
#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
|