From 06bad2f194f72d427f604f3a8d6da07f4cd369c8 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Sat, 31 May 2025 15:25:12 +0200 Subject: [PATCH] HiScore sort and update --- lumber.asm | 107 +++++++++++++++++++++++++++++++++++++++++++++++------ lumber.xex | Bin 32329 -> 32482 bytes 2 files changed, 96 insertions(+), 11 deletions(-) diff --git a/lumber.asm b/lumber.asm index 5763bf7..9bc6da3 100644 --- a/lumber.asm +++ b/lumber.asm @@ -1296,7 +1296,6 @@ gameloop ;jsr NextLevel ; RMTSong song_ingame jsr AudioInit ; after I/O - jsr ScoreToTable jmp gameOver EndOfLife ;dec Lives ; decrease Lives @@ -1406,10 +1405,15 @@ EndOfStartScreen .proc GameOverScreen ;-------------------------------------------------- mva #$ff StateFlag + jsr ScoreToBuffer jsr MakeDarkScreen jsr ClearPM jsr HidePM jsr PrepareOverPM + lda Difficulty + bne training_mode + jsr ScoreToTable ; score saving only in normal game mode +training_mode jsr PrepareScores mva #4 StateFlag mva #>font_over CHBAS @@ -1685,10 +1689,20 @@ skip_char .proc PrepareScores ;-------------------------------------------------- ; display all scores table on Game Over screen - mva #0 ScorePosition + mva #0 ScorePosition ; HiScore table position (0-4) print_loop + jsr InMemoryCacl ; position in temp (word) + jsr OnScreenCacl ; positiom in temp2 (word) + ldx #10 ; 10 characters ( result(4) + space(1) + name(5) ) + jsr TextToScreen + inc ScorePosition + lda ScorePosition + cmp #5 + bne print_loop + rts + +InMemoryCacl ; calculate position in memory (result in temp) mwa #(hs_pos1+6) temp - mwa #scores_on_screen temp2 lda ScorePosition :4 asl ; *16 clc @@ -1696,7 +1710,9 @@ print_loop sta temp bcc @+ inc temp+1 -@ +@ rts +OnScreenCacl ; calculate position on screen (result in temp2) + mwa #scores_on_screen temp2 lda ScorePosition :5 asl ; *32 clc @@ -1704,15 +1720,82 @@ print_loop sta temp2 bcc @+ inc temp2+1 -@ - ldx #10 - jsr TextToScreen +@ rts +.endp +;-------------------------------------------------- +.proc ScoreToTable +;-------------------------------------------------- +; moving last score from buffer to HiScore table +; in ScorePosition returns position in HiScore +; if ScorePosition=5 then not in HiScore + mva #4 ScorePosition ; starting from last (4) HiScore position +compare_next_position + jsr PrepareScores.InMemoryCacl ; score address in temp (word) + ldy #0 + ; compare last score (buffer) to HiScore in ScorePosition +compare_loop + lda hs_posX+6,y ; buffer + cmp (temp),y ; score in table + beq next_digit + bcc is_lower +is_bigger + ldx ScorePosition + dex + bmi new_record + stx ScorePosition + bpl compare_next_position +next_digit + iny + cpy #4 + bne compare_loop + ; last score is equal to HiScore position ScorePosition +is_lower inc ScorePosition +new_record + ; now we have position of last score in HiScore (ScorePosition) lda ScorePosition + sta NewHiScorePosition ; save position for new name input cmp #5 - bne print_loop + beq no_in_hiscore ; last score is lower than last HiScore score + cmp #4 + beq move_score_to_table ; last hi score position, then we dont moving lower scores down in table + ; move down lower scores + mva #4 ScorePosition ; startig from penultimate position in HiScore +moving_loop + dec ScorePosition + ; now calculate position of overwritten score + inc ScorePosition + jsr PrepareScores.InMemoryCacl ; score address in temp (word) + sbw temp #6 temp2 ; time in hiscore correction save to temp2 + ; calculate position of score to write + dec ScorePosition + jsr PrepareScores.InMemoryCacl ; score address in temp (word) + sbw temp #6 ; time in hiscore correction + ; move one position down + ldy #15 ; 16bytes +@ lda (temp),y + sta (temp2),y + dey + bpl @- + ; one score moved + lda ScorePosition + cmp NewHiScorePosition + bne moving_loop + ; we have prepared space in HiScore +move_score_to_table + ;mva NewHiScorePosition ScorePosition ; unnecessary ? + jsr PrepareScores.InMemoryCacl ; score address in temp (word) + sbw temp #6 ; time in hiscore correction + ldy #15 ; 16bytes +@ lda hs_posX,y + sta (temp),y + dey + bpl @- +no_in_hiscore + ; great success!! rts .endp + ;-------------------------------------------------- .proc AudioInit ;-------------------------------------------------- @@ -2625,6 +2708,8 @@ TimeCount .ds 1 ; 00 - time stopped , $ff - time count ScorePosition .ds 1 ; line number in hi-score list (0-4) +NewHiScorePosition + .ds 1 ; line number in hi-score list (0-4) ;-------------------------------------------------- .proc MenuAnimationsReset ;-------------------------------------------------- @@ -2712,7 +2797,7 @@ ScoreReady rts .endp ;-------------------------------------------------- -.proc ScoreToTable +.proc ScoreToBuffer ;-------------------------------------------------- ; points lda score @@ -3564,7 +3649,7 @@ char_byte3 .by $31 ; Y .by $31 ; Z .by $31 ; 0 - .by $31 ; 1 + .by $58 ; 1 .by $31 ; 2 .by $31 ; 3 .by $31 ; 4 @@ -3608,7 +3693,7 @@ hs_pos4 hs_pos5 .by "0000000090 TDC " hs_posX - .by "0000000000 " ;reserved + .by "0000000000 NEW " ; buffer for last score ;------------------------------------------------- ;RMT PLAYER variables track_variables diff --git a/lumber.xex b/lumber.xex index 6178da5e338df09b199339fc7c8fffeac44959b0..154cf17dc7c3419f7fd70e5d3ad074541b2c84f2 100644 GIT binary patch delta 4068 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 X35$K0H-tqW=3~QRKR&&%R*wH4%|s3z