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

;; ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
;; █▄░▄█░▄▄▀██▄██▄░▄██▄██░▄▄▀█░███▄██▄▄░█░▄▄▀█▄░▄██▄██▀▄▄▀█░▄▄▀██
;; ██░██░██░██░▄██░███░▄█░▀▀░█░███░▄█▀▄██░▀▀░██░███░▄█░██░█░██░██
;; █▀░▀█▄██▄█▄▄▄██▄██▄▄▄█▄██▄█▄▄█▄▄▄█▄▄▄█▄██▄██▄██▄▄▄██▄▄██▄██▄██
;; ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;; 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