Si vous avez des idées, je vais déjà commencer par un peu l'optimiser de mon côté.
Y a pas mal de choses qui sont facilement optimisables
"code horrible"
; Init le menu
MENU_INIT:
; Remettre le booleen a vrai
ld a, 1
ld (menu_run), a
; Mettre une valeur de base pour la duree
ld a, 3
ld (duree_level), a
; De base pas de decalage
ld a, 0
ld (bool_decalage), a
ld a, 16
ld (modulo_liste), a
; Ecrire les vputs dans le buffer (pas de clignotement)
set textWrite, (iy + sGrFlags)
ret
; Afficher le menu
MENU_PRINT:
; Effacer l'ecran
call BUFCLR
call FASTCOPY
; Par défaut il y aura des murs sauf si on force le contraire
call MUR_INIT
; Afficher le focus
call FOCUS_INIT
; Afficher les cases
call CASE_PRINT
; Afficher les labels "easy" "medium" "hard"
call DIFFICULTY_PRINT
; Afficher le label "press clear to quit"
call HOWTO_QUIT_PRINT
mp_loop:
call MENU_SCAN_KEY
call MENU_SCAN_ENTER
ld a, (menu_run)
or a
jp nz, mp_loop
call MENU_IS_SELECTED
call BUFCLR
call FASTCOPY
; Lorsqu'on sort du menu, remettre le flag à son état normal
res textWrite, (iy + sGrFlags)
ret
; Executé lorsque l'on selectionne un level
MENU_IS_SELECTED:
ld a, (ycoord)
sub 10
jp z, mis_easy
sub 19
jp z, mis_medium
sub 19
jp z, mis_hard
mis_easy:
ld a, (xcoord)
sub 40
jp z, mis_level1
sub 8
jp z, mis_level2
sub 8
jp z, mis_level3
sub 8
jp z, mis_level4
sub 8
jp z, mis_level5
sub 8
jp z, mis_level6
mis_level1:
ld hl, level1
jp mis_fin
mis_level2:
ld hl, level2
jp mis_fin
mis_level3:
ld hl, level3
jp mis_fin
mis_level4:
ld hl, level4
jp mis_fin
mis_level5:
ld hl, level5
jp mis_fin
mis_level6:
ld hl, level6
jp mis_fin
mis_medium:
ld a, (xcoord)
sub 40
jp z, mis_level7
sub 8
jp z, mis_level8
sub 8
jp z, mis_level9
sub 8
jp z, mis_level10
sub 8
jp z, mis_level11
sub 8
jp z, mis_level12
mis_level7:
ld hl, level7
jp mis_fin
mis_level8:
ld hl, level8
jp mis_fin
mis_level9:
ld hl, level9
jp mis_fin
mis_level10:
ld hl, level10
jp mis_fin
mis_level11:
ld hl, level11
jp mis_fin
mis_level12:
ld hl, level12
jp mis_fin
mis_hard:
ld a, 1
ld (bool_decalage), a
ld a, 20
ld (duree_level), a
call MUR_DEL ; On vire les mur au bord pour les decalage c'est vraiment trop hard
ld a, (xcoord)
sub 40
jp z, mis_level13
sub 8
jp z, mis_level14
sub 8
jp z, mis_level15
sub 8
jp z, mis_level16
sub 8
jp z, mis_level17
sub 8
jp z, mis_level18
mis_level13:
call MUR_INIT
ld a, 0
ld (bool_decalage), a
ld a, 16
ld (modulo_liste), a
ld a, 3
ld (duree_level), a
ld hl, level13
jp mis_fin
mis_level14:
ld a, 1
ld (bool_decalage), a
ld hl, level14
jp mis_fin
mis_level15:
ld a, 1
ld (bool_decalage), a
ld hl, level15
jp mis_fin
mis_level16:
call MUR_DEL
ld a, 1
ld (bool_decalage), a
ld hl, level16
jp mis_fin
mis_level17:
ld a, 1
ld (bool_decalage), a
ld hl, level17
jp mis_fin
mis_level18:
call MUR_INIT
ld a, 0
ld (bool_decalage), a
ld a, 218
ld (modulo_liste), a
ld a, 1
ld (duree_level), a
ld hl, level1
jp mis_fin
mis_fin:
ld (pointeur_sur_liste), hl
ret
; Si on fait un decalage, mettre bool_decalage a 1
bool_decalage:
.db 0
; Affichage de la difficulté
DIFFICULTY_PRINT:
; afficher "easy"
ld a,3
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a, 10
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,easy ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
; afficher "medium"
ld a,3
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,29
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,medium ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
; afficher "hard"
ld a,3
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,48
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,hard ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ret
; Affichage du label "press clear to quit"
HOWTO_QUIT_PRINT:
; afficher "clear to quit"
ld a,56
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a, 1
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,clear_to_quit ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ret
clear_to_quit:
.db "exit = clear",0
; Afficher les cases
CASE_PRINT:
ld b, 3
ld de, 10
cp_categorie:
push bc
ld b, 6 ; 6 niveaux par categorie
ld a, 40
cp_easy:
push bc
push af
push de
ld hl, case
call DRWSPR
pop de
pop af
add a,8
pop bc
djnz cp_easy
ld a, e
add a, 19
ld e, a
pop bc
djnz cp_categorie
call FASTCOPY
call NUM_PRINT
ret
; Afficher les numéros de level dans les cases
NUM_PRINT:
ld a,43
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,un ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,51
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,deux ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,59
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,trois ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,67
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,quatre ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,75
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,cinq ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,83
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,six ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
; medium
ld a,43
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,un ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,51
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,deux ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,59
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,trois ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,67
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,quatre ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,75
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,cinq ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,83
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,six ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
; hard
ld a,43
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,un ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,51
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,deux ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,59
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,trois ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,67
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,quatre ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,75
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,cinq ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ld a,83
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,six ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts
ret
;; Scan key using direct input
MENU_SCAN_KEY:
ld a,$FF ; Before any action, reset the keyport
out (1),a ; ...by sending to the port 1 the value 255 (FF
ld a,$FE ; select the keyboard group to scan (here the arrow keys)
out (1),a ; ...by sending to the keyboard port (1) the value FE.
in a,(1) ; Get the port value, which says wich keys was pressed
cp 254 ;\
jp z,msk_bot ;|
cp 253 ;| Look for the key which was pressed and jump to the correct label.
jp z,msk_left ;|
cp 251 ;|
jp z,msk_right ;|
cp 247 ;|
jp z,msk_top ;/
jp msk_finloop
; Callback depending on key pressed
msk_top:
ld a,(ycoord)
sub 19
ld (ycoord),a
jp msk_print
msk_bot:
ld a,(ycoord)
add a,19
ld (ycoord),a
jp msk_print
msk_right:
ld a,(xcoord)
add a,8
ld (xcoord),a
jp msk_print
msk_left:
ld a,(xcoord)
sub 8
ld (xcoord),a
jp msk_print
; Passe ici seulement si key press
msk_print:
ld a,(xcoord)
ld e,(ycoord)
call MENU_PROTECT_ARENA
call FOCUS_PRINT
msk_finloop:
ret
; Lorsqu'on presse enter
MENU_SCAN_ENTER:
ld a,$FF ; Before any action, reset the keyport
out (1),a ; ...by sending to the port 1 the value 255 (FF
ld a,$FD ; select the keyboard group to scan (here the arrow keys)
out (1),a ; ...by sending to the keyboard port (1) the value FE.
in a,(1) ; Get the port value, which says wich keys was pressed
cp 254 ;\
jp z, mse_pressed ;|
cp 191 ;\
jp z, mse_clear_pressed ;|
jp mse_finloop
mse_pressed:
ld a, 0
ld (menu_run), a
jp mse_finloop
mse_clear_pressed:
pop af
pop af
jp fin_jeu
mse_finloop:
ret
; Savoir si on presse enter
menu_run:
.db 1
; On affiche le curseur
FOCUS_PRINT:
; effacer la tout le sprite (on l'affichera un pixel plus loin apres)
ld a,(oldxcoord)
ld de,(oldycoord)
ld d,0
ld hl, focus
call CLRSPR
; afficher nouveau sprite
ld hl,(xcoord)
ld de,(ycoord)
ld (oldxcoord),hl
ld (oldycoord),de
ld a,l
ld hl, focus
call DRWSPR
call FASTCOPY
call CASE_PRINT
call DIFFICULTY_PRINT
call HOWTO_QUIT_PRINT
ret
; Init the start position of the focus
FOCUS_INIT:
; start at (16, 16)
ld a, 40
ld (xcoord), a
ld (oldxcoord), a
ld a, 10
ld (ycoord), a
ld (oldycoord), a
; print the focus
call FOCUS_PRINT
ret
; Cette routine permet d'eviter qu'on sorte de l'arene
MENU_PROTECT_ARENA:
ld a,(xcoord)
cp 40
jp m, mpa_hors_arene
cp 81
jp p, mpa_hors_arene
ld a,(ycoord)
cp 10
jp m, mpa_hors_arene
cp 50
jp p, mpa_hors_arene
jp place_valide
mpa_hors_arene:
; Ici on restaure l'ancien placement (pour eviter la sortie d'arene)
ld a, (oldxcoord)
ld (xcoord), a
ld a, (oldycoord)
ld (ycoord), a
mpa_place_valide:
ret
; Une routine pour convertir entier vers texte serait mieux
un:
.db "1", 0
deux:
.db "2", 0
trois:
.db "3", 0
quatre:
.db "4", 0
cinq:
.db "5", 0
six:
.db "6", 0
easy:
.db "easy ",$05, 0
medium:
.db "medium ",$05, 0
hard:
.db "hard ",$05, 0
; Srpite du focus (utilise OR routines)
focus:
.db 00000000b
.db 00000000b
.db 00000000b
.db 00000000b
.db 01000000b
.db 01100000b
.db 01100000b
.db 00000000b
; Les cases
case:
.db 11111111b
.db 10000001b
.db 10000001b
.db 10000001b
.db 10000001b
.db 10000001b
.db 10000001b .db 11111111b