Back to Page
Revision 2 (current)
Edited by adelikat on 9/2/2023 2:48 PM
!!! RAM addresses
http://www.romdetectives.com/Wiki/index.php?title=Arkanoid_(NES)_-_RAM
!!! Score tally algorithm
When you score points, the points don't immediately go into the player's score
(which is an array of 6 decimal digits starting at 0x0370).
Instead they go into a "score increment" array (6 decimal digits starting at 0x037c).
The points are moved from the score increment to the player's score
a little each frame.
10 points are transferred per frame while the tens digits of the score increment is nonzero;
otherwise 100 points are transferred.
You cannot advance to the next level until all points have been transferred out of the score increment.
See also [6347S#ImprovementsOverThePreviousTas] "Why time the score tally?…"
The score tally algorithm starts at 0x8dcb in the ROM.
In pseudocode, it works like this:
%%SRC_EMBED
const DELTA_10 = [0, 0, 0, 0, 1, 0];
const DELTA_100 = [0, 0, 0, 1, 0, 0];
if (score_increment == [0, 0, 0, 0, 0, 0]) { // 0x037c
// Early exit if the increment is zero.
return;
}
if (score_increment[4] != 0) { // Tens digit
delta = DELTA_10; // 0x8e59
} else {
delta = DELTA_100; // 0x8e5f
}
// Subtract delta from score_increment, store result in score_increment.
decimal_subtract(score_increment, delta, score_increment);
if (current_player == 0) { // 0x0019
player_score = p1_score; // 0x0370
} else {
player_score = p2_score; // 0x0376
}
// Add delta to player_score, store result in player_score.
decimal_add(player_score, delta, player_score);
%%END_EMBED