You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
284 lines
6.3 KiB
284 lines
6.3 KiB
;; ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ |
|
;; █▄░▄█░▄▄▀██▄██▄░▄██▄██░▄▄▀█░███▄██▄▄░█░▄▄▀█▄░▄██▄██▀▄▄▀█░▄▄▀██ |
|
;; ██░██░██░██░▄██░███░▄█░▀▀░█░███░▄█▀▄██░▀▀░██░███░▄█░██░█░██░██ |
|
;; █▀░▀█▄██▄█▄▄▄██▄██▄▄▄█▄██▄█▄▄█▄▄▄█▄▄▄█▄██▄██▄██▄▄▄██▄▄██▄██▄██ |
|
;; ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ |
|
;; Establish a defined initial state |
|
|
|
|
|
; Initialize everything for the main game state |
|
; <- [current_state] |
|
; <- [sub_state] |
|
; <- [BKG_POS_X_REGISTER] |
|
; <- [BKG_POS_Y_REGISTER] |
|
; <- [LCD_CONTROL_REGISTER] |
|
; <- [message_objs] |
|
init_state_menu: |
|
ld a, STATE_MENU |
|
ld [current_state], a |
|
ld a, STATE_MENU_START |
|
ld [sub_state], a |
|
|
|
; set the background position |
|
ld a, 0 |
|
ld [BKG_POS_X_REGISTER], a |
|
ld [BKG_POS_Y_REGISTER], a |
|
|
|
call show_message_menu_start |
|
|
|
; turn the screen on |
|
ld a, DISPLAY_ON + TLS_USE_LOC_8000 \ |
|
+ BKG_DISPLAY_ON + BKG_USE_LOC_9800 \ |
|
+ WND_DISPLAY_OFF + WND_USE_LOC_9C00 \ |
|
+ OBJ_DISPLAY_ON + OBJ_SIZE_8X8 |
|
ld [LCD_CONTROL_REGISTER], a |
|
ret |
|
|
|
|
|
|
|
; Initialize everything for the help screen |
|
; <- [current_state] |
|
; <- [BKG_POS_X_REGISTER] |
|
; <- [BKG_POS_Y_REGISTER] |
|
; <- [WND_POS_X_REGISTER] |
|
; <- [WND_POS_Y_REGISTER] |
|
; <- [LCD_CONTROL_REGISTER] |
|
; <- [current_word] |
|
; <- [guess] |
|
; <- [guess_hints] |
|
; <- [message_objs] |
|
init_state_help: |
|
ld a, STATE_HELP |
|
ld [current_state], a |
|
|
|
; turn the screen off |
|
ld a, DISPLAY_OFF |
|
ld [LCD_CONTROL_REGISTER], a |
|
|
|
call clear_message |
|
|
|
; set the background position |
|
ld a, 0 |
|
ld [BKG_POS_X_REGISTER], a |
|
ld a, $9a |
|
ld [BKG_POS_Y_REGISTER], a |
|
|
|
; set the window position |
|
ld a, 3 |
|
ld [WND_POS_X_REGISTER], a |
|
ld a, $70 |
|
ld [WND_POS_Y_REGISTER], a |
|
|
|
; load the window data |
|
ld hl, window_help |
|
call load_window_map |
|
|
|
; Set a fixed and actually impossible game state. |
|
; containing: [current_word], [guess] and [guess_hints] |
|
; |
|
; This is only possible because the memory space of these |
|
; three variables is located directly after each other. |
|
ld hl, current_word |
|
ld de, help_word |
|
ld c, 65 |
|
.copy_gamestate: |
|
ld a, [de] |
|
ld [hl], a |
|
inc de |
|
inc hl |
|
dec c |
|
jp nz, .copy_gamestate |
|
|
|
; for the rest we can use the default functions |
|
call update_hint_markings |
|
call update_guess_objects |
|
|
|
; turn the screen on |
|
ld a, DISPLAY_ON + TLS_USE_LOC_8000 \ |
|
+ BKG_DISPLAY_ON + BKG_USE_LOC_9800 \ |
|
+ WND_DISPLAY_ON + WND_USE_LOC_9C00 \ |
|
+ OBJ_DISPLAY_ON + OBJ_SIZE_8X8 |
|
ld [LCD_CONTROL_REGISTER], a |
|
ret |
|
|
|
|
|
|
|
; Initialize everything for the main game state |
|
; <- [current_state] |
|
; <- [BKG_POS_X_REGISTER] |
|
; <- [BKG_POS_Y_REGISTER] |
|
; <- [WND_POS_X_REGISTER] |
|
; <- [WND_POS_Y_REGISTER] |
|
; <- [LCD_CONTROL_REGISTER] |
|
; <- [current_word] |
|
; <- [current_guess] |
|
; <- [current_char] |
|
; <- [guess] |
|
; <- [guess_hints] |
|
; <- [selected_letter_x] |
|
; <- [selected_letter_y] |
|
; <- [message_objs] |
|
init_state_game: |
|
; set the current state |
|
ld a, STATE_GAME |
|
ld [current_state], a |
|
|
|
; turn the screen off |
|
ld a, DISPLAY_OFF |
|
ld [LCD_CONTROL_REGISTER], a |
|
|
|
call select_word |
|
call clear_message |
|
|
|
; set the background position |
|
ld a, 0 |
|
ld [BKG_POS_X_REGISTER], a |
|
ld a, $9a |
|
ld [BKG_POS_Y_REGISTER], a |
|
|
|
; set the window position |
|
ld a, 3 |
|
ld [WND_POS_X_REGISTER], a |
|
ld a, $68 |
|
ld [WND_POS_Y_REGISTER], a |
|
|
|
; load the window data |
|
ld hl, window_game |
|
call load_window_map |
|
|
|
; initialize some more variables |
|
ld a, 0 |
|
ld [selected_letter_x], a |
|
ld [selected_letter_y], a |
|
ld [current_guess], a |
|
ld [current_char], a |
|
|
|
.reset_guesses |
|
ld hl, guesses |
|
ld a, NULL |
|
ld d, 30 |
|
.loop1: |
|
ld [hl+], a |
|
dec d |
|
jp nz, .loop1 |
|
|
|
.reset_hints |
|
ld hl, guesses_hints |
|
ld a, TILE_WHITE |
|
ld d, 30 |
|
.loop2: |
|
ld [hl+], a |
|
dec d |
|
jp nz, .loop2 |
|
|
|
; turn the screen on |
|
ld a, DISPLAY_ON + TLS_USE_LOC_8000 \ |
|
+ BKG_DISPLAY_ON + BKG_USE_LOC_9800 \ |
|
+ WND_DISPLAY_ON + WND_USE_LOC_9C00 \ |
|
+ OBJ_DISPLAY_ON + OBJ_SIZE_8X8 |
|
ld [LCD_CONTROL_REGISTER], a |
|
ret |
|
|
|
|
|
|
|
; Switches to the state when the player has lost |
|
; <- [current_state] |
|
; <- [message_objs] |
|
init_state_lost: |
|
ld a, STATE_LOST |
|
ld [current_state], a |
|
call show_message_lost |
|
ret |
|
|
|
|
|
|
|
; Switches to the state when the player has won |
|
; <- [current_state] |
|
; <- [message_objs] |
|
init_state_won: |
|
ld a, STATE_WON |
|
ld [current_state], a |
|
call show_message_won |
|
ret |
|
|
|
|
|
|
|
; Initialize the DMG color palettes |
|
; <- [PALETTE_BKG_REGISTER] |
|
; <- [PALETTE_OBJ0_REGISTER] |
|
; <- [PALETTE_OBJ1_REGISTER] |
|
init_palettes: |
|
ld a, %10010011 |
|
ld [PALETTE_BKG_REGISTER], a |
|
ld [PALETTE_OBJ0_REGISTER], a |
|
ld [PALETTE_OBJ1_REGISTER], a |
|
ret |
|
|
|
|
|
|
|
; Copy the tile data into the vram |
|
; -> [tiles] |
|
; <- [TLS_LOC_8000] |
|
load_tiles: |
|
ld bc, tiles_start |
|
ld hl, TLS_LOC_8000 |
|
ld d, $10 |
|
ld e, (tiles_end - tiles_start) / $10 |
|
|
|
.loop: |
|
ld a, [bc] |
|
ld [hl], a |
|
inc bc |
|
inc hl |
|
|
|
dec d |
|
jp nz, .loop |
|
dec e |
|
jp nz, .loop |
|
ret |
|
|
|
|
|
|
|
; Copy the background map into the vram |
|
; -> [background] |
|
; <- [BKG_LOC_9800] |
|
load_background_map: |
|
ld bc, background |
|
ld hl, BKG_LOC_9800 |
|
ld d, 32 |
|
ld e, 32 |
|
|
|
.loop: |
|
ld a, [bc] |
|
ld [hl], a |
|
inc bc |
|
inc hl |
|
|
|
dec d |
|
jp nz, .loop |
|
dec e |
|
jp nz, .loop |
|
ret |
|
|
|
|
|
|
|
; Copy a window map into the vram |
|
; -> hl: address of the desired window map |
|
; <- [WND_LOC_9C00] |
|
load_window_map: |
|
ld bc, WND_LOC_9C00 |
|
ld d, 32 |
|
ld e, 5 |
|
|
|
.loop: |
|
ld a, [hl] |
|
ld [bc], a |
|
inc hl |
|
inc bc |
|
|
|
dec d |
|
jp nz, .loop |
|
dec e |
|
jp nz, .loop |
|
ret |
|
|
|
|