Level selection menu: print landmark level and name (#12)

This commit is contained in:
xCrystal 2024-01-21 17:01:44 +01:00
parent 2e5546f828
commit ce2f5f3822
10 changed files with 139 additions and 17 deletions

View File

@ -175,6 +175,9 @@
charmap "└", $f4
charmap "┘", $f5
; level selection menu
charmap "<LSMTEXTBOX_BLACK_TILE>", $1f
; ASCII charmap, for mobile functions
pushc
newcharmap ascii

View File

@ -11,6 +11,16 @@ endc
DEF NUM_LANDMARKS EQU const_value
assert NUM_LANDMARKS <= 254
; constants used in Level Selection Menu
DEF LSMTEXTBOX_WIDTH EQU 18
DEF LSMTEXTBOX_HEIGHT EQU 2
DEF LSMTEXTBOX_X_COORD EQU 1
DEF LSMTEXTBOX_Y_COORD EQU 15
DEF LSMTEXTBOX_MAX_TEXT_ROW_LENGTH EQU LSMTEXTBOX_WIDTH - 5
DEF LSMTEXTBOX_BLACK_TILE EQU "<LSMTEXTBOX_BLACK_TILE>"
DEF LSMTEXTBOX_LEVEL_INDICATOR_TILE EQU $30
DEF LSMTEXTBOX_LEVEL_NUMBERS_FIRST_TILE EQU $31
; used in CaughtData (legacy)
const_def $7f, -1
const LANDMARK_EVENT ; $7f

View File

@ -16,6 +16,12 @@ MACRO level_selection_menu_landmark
db \5
ENDM
MACRO level_selection_menu_landmark_name
assert STRLEN(\1) == LSMTEXTBOX_MAX_TEXT_ROW_LENGTH
assert STRLEN(\2) == LSMTEXTBOX_MAX_TEXT_ROW_LENGTH
db STRRPL(\1, " ", "<LSMTEXTBOX_BLACK_TILE>"), STRRPL(\2, " ", "<LSMTEXTBOX_BLACK_TILE>"),
ENDM
LevelSelectionMenu_Landmarks:
table_width 6, LevelSelectionMenu_Landmarks
.landmark1
@ -30,13 +36,13 @@ if DEF(_DEBUG)
endc
assert_table_length NUM_LANDMARKS
.Level1LandmarkName: db "LEVEL 1@"
.Level1LandmarkName: level_selection_menu_landmark_name " THE FIRST ", " LEVEL "
if DEF(_DEBUG)
.DebugLevel1LandmarkName: db "DEBUG LEVEL 1@"
.DebugLevel2LandmarkName: db "DEBUG LEVEL 2@"
.DebugLevel3LandmarkName: db "DEBUG LEVEL 3@"
.DebugLevel4LandmarkName: db "DEBUG LEVEL 4@"
.DebugLevel5LandmarkName: db "DEBUG LEVEL 5@"
.DebugLevel1LandmarkName: level_selection_menu_landmark_name " DEBUG ", " DUMMY "
.DebugLevel2LandmarkName: level_selection_menu_landmark_name " DEBUG ", " CAVE "
.DebugLevel3LandmarkName: level_selection_menu_landmark_name " DEBUG ", " FOREST "
.DebugLevel4LandmarkName: level_selection_menu_landmark_name " DEBUG ", " TEST2 "
.DebugLevel5LandmarkName: level_selection_menu_landmark_name " DEBUG ", " TEST1 "
endc
MACRO level_selection_menu_landmark_transition

View File

@ -100,3 +100,29 @@ LoadStatsScreenPageTilesGFX:
lb bc, BANK(StatsScreenPageTilesGFX), 17
call Get2bppViaHDMA
ret
LoadInversedFont::
ld de, FontInversed
ld hl, vTiles1
lb bc, BANK(FontInversed), 112 ; "A" to "9"
ldh a, [rLCDC]
bit rLCDC_ENABLE, a
jp z, Copy1bpp
ld de, FontInversed
ld hl, vTiles1
lb bc, BANK(FontInversed), 32 ; "A" to...
call Get1bppViaHDMA
ld de, FontInversed + 32 * LEN_1BPP_TILE
ld hl, vTiles1 tile $20
lb bc, BANK(FontInversed), 32
call Get1bppViaHDMA
ld de, FontInversed + 64 * LEN_1BPP_TILE
ld hl, vTiles1 tile $40
lb bc, BANK(FontInversed), 32
call Get1bppViaHDMA
ld de, FontInversed + 96 * LEN_1BPP_TILE
ld hl, vTiles1 tile $60
lb bc, BANK(FontInversed), 16 ; ..."9"
call Get1bppViaHDMA
ret

View File

@ -40,6 +40,7 @@ LevelSelectionMenu::
ld a, [wLevelSelectionMenuCurrentLandmark]
call LevelSelectionMenu_InitPlayerSprite
call LevelSelectionMenu_InitLandmark
call LevelSelectionMenu_PrintLevelAndLandmarkName
call LevelSelectionMenu_DrawDirectionalArrows
.main_loop
@ -78,8 +79,8 @@ LevelSelectionMenu::
jr .start_movement
.start_movement
ld e, c ; copy direction to e for later (for LevelSelectionMenu_SetAnimSeqAndFrameset)
; make hl point to the beginning of the transition data for the chosen direction at c
ld e, c ; also copy direction to e for later
ld hl, wLevelSelectionMenuLandmarkTransitionsPointer
ld a, [hli]
ld h, [hl]
@ -93,8 +94,10 @@ LevelSelectionMenu::
ld a, h
ld [bc], a
; begin transition
; clear textbox as we are about to move out of current landmark
call LevelSelectionMenu_Delay10Frames
call LevelSelectionMenu_ClearTextbox ; preserves e
; begin transition
xor a ; FALSE
ld [wLevelSelectionMenuStandingStill], a
ld a, 1 << 7 ; "first step of movement" flag
@ -114,8 +117,9 @@ LevelSelectionMenu::
jr z, .wait_transition_loop
call LevelSelectionMenu_InitLandmark
call LevelSelectionMenu_PrintLevelAndLandmarkName
call LevelSelectionMenu_DrawDirectionalArrows
jr .main_loop
jp .main_loop
.enter_level
ld a, [wLevelSelectionMenuCurrentLandmark]
@ -151,6 +155,8 @@ LevelSelectionMenu::
ret ; nc
LevelSelectionMenu_LoadGFX:
; load inverted font
farcall LoadInversedFont
; load gfx for the background tiles, and for the player and directional arrow sprites
ld hl, LevelSelectionMenuGFX
ld de, vTiles2
@ -262,6 +268,71 @@ endr
ld [de], a
ret
LevelSelectionMenu_PrintLevelAndLandmarkName:
; level indicator and level numbers are 8x16.
; botton half of their graphics are $10 tiles after the top half.
hlcoord LSMTEXTBOX_X_COORD, LSMTEXTBOX_Y_COORD
ld a, LSMTEXTBOX_LEVEL_INDICATOR_TILE
ld [hl], a
add $10
ld bc, SCREEN_WIDTH
add hl, bc
ld [hl], a
ld a, [wLevelSelectionMenuCurrentLandmark]
ld e, a
ld d, 0
ld hl, LandmarkToLevelTable
add hl, de
ld a, [hl]
ld c, 0
.loop1
ld e, a
sub 10
jr c, .next1
inc c
jr .loop1
.next1
; c = first digit ; e = second digit
hlcoord LSMTEXTBOX_X_COORD + 1, LSMTEXTBOX_Y_COORD
ld a, LSMTEXTBOX_LEVEL_NUMBERS_FIRST_TILE
add c
ld [hli], a
ld a, LSMTEXTBOX_LEVEL_NUMBERS_FIRST_TILE
add e
ld [hl], a
hlcoord LSMTEXTBOX_X_COORD + 1, LSMTEXTBOX_Y_COORD + 1
ld a, LSMTEXTBOX_LEVEL_NUMBERS_FIRST_TILE + $10
add c
ld [hli], a
ld a, LSMTEXTBOX_LEVEL_NUMBERS_FIRST_TILE + $10
add e
ld [hl], a
call LevelSelectionMenu_GetLandmarkName
ld hl, wStringBuffer1
decoord LSMTEXTBOX_X_COORD + 4, LSMTEXTBOX_Y_COORD
ld bc, LSMTEXTBOX_MAX_TEXT_ROW_LENGTH
call CopyBytes
ld hl, wStringBuffer2
decoord LSMTEXTBOX_X_COORD + 4, LSMTEXTBOX_Y_COORD + 1
ld bc, LSMTEXTBOX_MAX_TEXT_ROW_LENGTH
call CopyBytes
call WaitBGMap
xor a
ld [hBGMapMode], a
ret
LevelSelectionMenu_ClearTextbox:
hlcoord LSMTEXTBOX_X_COORD, LSMTEXTBOX_Y_COORD
ld a, LSMTEXTBOX_BLACK_TILE
lb bc, LSMTEXTBOX_HEIGHT, LSMTEXTBOX_WIDTH
call FillBoxWithByte
call WaitBGMap
xor a
ld [hBGMapMode], a
ret
LevelSelectionMenu_DrawDirectionalArrows:
; Draw directional arrows OAM around player sprite for the valid directions.
; Objects are drawn in OAM after player sprite objects in wWalkingDirection order.
@ -499,7 +570,7 @@ LevelSelectionMenu_GetLandmarkCoords::
ret
LevelSelectionMenu_GetLandmarkName::
; Copy the name of landmark e to wStringBuffer1.
; Copy the name of landmark e to wStringBuffer1 (tow row) and wStringBuffer2 (bottom row).
push hl
push de
push bc
@ -513,19 +584,25 @@ LevelSelectionMenu_GetLandmarkName::
ld l, a
ld de, wStringBuffer1
ld c, 18
.copy
ld a, [hli]
ld [de], a
inc de
dec c
jr nz, .copy
call .copy
ld de, wStringBuffer2
call .copy
pop bc
pop de
pop hl
ret
.copy
ld c, LSMTEXTBOX_MAX_TEXT_ROW_LENGTH
.copy_loop
ld a, [hli]
ld [de], a
inc de
dec c
jr nz, .copy_loop
ret
LevelSelectionMenu_GetLandmarkSpawnPoint:
; Return SPAWN_* (a) of landmark a.
ld hl, LevelSelectionMenu_Landmarks + $5

Binary file not shown.

Before

Width:  |  Height:  |  Size: 885 B

After

Width:  |  Height:  |  Size: 1.1 KiB