Merci ! Mais si tu es pressé ne t'en inquiète pas..
Pour le moment, le structure des cartes est ainsi :
Chaque carte a cinq sections :
1. le nombre d'événements qu'il faut charger en chargeant la carte
1b. si ce nombre est 1 ou plus, le suit une liste des événements
2. la largeur et la hauteur (un octet)
3. un mot (.dw) avec l'addresse de la liste d'évènements intéractifs dans la carte
4. un mot pour l'addresse de la liste de NPCs
5. et finalement, la carte
to Emily?",0
Un exemple :B_INN:
.org MAP_ADDR
.db 1 ;number of events that can change what should be displayed here
.db 1 \ .dw B_INN_EVENT1 ;OK, this says that if event 1 is set, we should run B_INN_EVENT1
.db 12,8 ;width,height
.dw B_INN_EVT ;inn event list
.dw B_INN_NPC ;list of npcs
.db 25,0,0,18,19,0,0,0,0,0,0,25
.db 0,0,0,0,0,0,0,0,0,0,13,15
.db 0,0,0,0,0,0,0,0,0,0,14,16
.db 0,0,0,0,21,22,0,0,0,0,0,17
.db 0,0,0,0,24,23,0,0,0,0,13,15
.db 0,0,0,0,0,0,0,0,0,0,14,16
.db 17,0,0,0,0,0,0,0,0,0,0,25
.db 52,52,52,20,20,52,52,52,52,52,52,52
B_INN_EVT:
.db 3,7 \ .dw B_INN_TOWN ;x,y,event addr
.db 4,7 \ .dw B_INN_TOWN ;x,y,event addr
.db $FF ;end of touch events
.db $FF ;end of [2nd] events
B_INN_NPC:
.db ALICE_U,3,2 \ .dw b_inn_txt1
.db CALVIN_U,5,2 \ .dw b_inn_txt2
.db $FF ;end of list
;texts
b_inn_txt1:
.db T_ALICE ;alice's text(s)
.db 0 ;always the same text
.dw $+2
.db "Sounds good, see you at ",EVENTTEXT \ .dw your_house_safehouse_txt \ .db ".",0
b_inn_txt2:
.db T_CALVIN
.db 3 ;after talking 3 times, change texts
.dw +_
.db "I still can't believe it...",0
_ .db "Shouldn't you be going to talk
Chaque carte de la même planète est précédée par une lettre, ici la "B" signifie "Berga", le nom de la planète. Les noms des labels pour les événements et les NPCs suivent toujours la même formule : _EVT et _NPC.
Dans B_INN_EVT, avant le premier $FF, il y a les événements qui s'activent quand on touche une tuile. Avant le deuxième $FF, les événements qui s'activent en touchant [2nd].
Dans B_INN_NPC, il y a l'id du NPC, ses coordonnées (X,Y), puis le texte qui s'affichera si l'on parle avec l'NPC.
Dans b_inn_txt1, le premier octet t'annonce qui parle (il y a une petite boîte au-dessus du text avec le nom du locuteur). Puis le nombre de fois qu'il faut parler avec l'NPC pour changer son texte. Puis l'addresse du deuxième texte une fois le compteur = à 0. Pour Alice, le compteur commence à zéro donc il n'y a qu'un texte, mais pour Calvin il y en a deux.
Je sais que mes explications ne sont pas très claires, mais les cartes mêmes sont assez simples, chaque numéro correspond avec un sprite (pas avec un brush, comme les autres).
Je peux t'expliquer le système d'événements (j'utilise le même mot pour les événements du jeu (pour faire avancer le jeu) et pour ceux de les cartes, comme les panneaux, les portes, les NPCs, etc., c'est assez embrouillant :P) plus tard, si tu veux. Essentielment j'y ai consacré 20 octets dont chaque bit corréspond avec un événement. J'ai trois routines : set_event, reset_event, et check_event :
;a = event to set
set_event:
ld c,a
srl c
srl c
srl c
and $7
ld b,a
ld a,%10000000
jr z,+_
rrca
djnz $-1
_ ld b,0
ld hl,event_array
add hl,bc
or (hl)
ld (hl),a
ret
;a = event to set
reset_event:
ld c,a
srl c
srl c
srl c
and $7
ld b,a
ld a,%10000000
jr z,+_
rrca
djnz $-1
_ ld b,0
ld hl,event_array
add hl,bc
ld c,a
or (hl)
xor c
ld (hl),a
ret
;a = event id to check
;returns z if bit is 0, nz if bit s set
check_event:
push hl
ld c,a
srl c
srl c
srl c
and $7
ld b,a
ld a,%10000000
jr z,+_
rrca
djnz $-1
_ ld b,0
ld hl,event_array
add hl,bc
and (hl)
pop hl
ret