Petit coup de nostalgie, j'ai eu envie de reprendre un peu l'asm z80 dans l'espoir peut être de terminer pour de bon un jeu cette fois (et confirmer que je n'ai pas rejoint la
TIFT pour rien)...
Gurk est un RPG sortit à la base sur les nokia s30 (J2ME) puis porté sur android. J'y ai pas mal joué et je doit dire que c'est assez intuitif malgré sa sobriété (menu et combats très simplifiés), mais c'est en partit ça qui m'a convaincu que c'est un jeu plus ou moins "portable" facilement sur les TI z80.
Donc après quelques heures à galérer pour rassembler tout ce que j'avais besoin (tiles surtout, et notez la superbe façons dont
spasm me permet les inclure), je me suis attaqué au tilemapper. En effet il n'y a pas à proprement parler de menu d'accueil, le jeu est reset sur la carte du monde à chaque lancement mais on peut charger une partie parmi les 3 emplacements disponibles pour sauver.
Devant l'énorme carte du monde (80*80 tiles si mes souvenirs sont bons) j'ai dû réfléchir au meilleur moyen de compression. Enfin ça c'était après avoir dû trouver un moyen rapide de
convertir les
cartes rippées du jeu en
assembleur grâce à
PureBasic.
J'ai donc opté pour un système se rapprochant du
RLE, me permettant un gros gain de place et la possibilité de décompresser à la volé les tiles. Ceux-ci sont donc indexés par longueur d'enchaînement jusqu'à 255, ce qui m'a permis une compression de 60%. Bien-sûr cela sous entend une vitesse plus ou moins rapide de décompression selon la distance des tiles recherchés... Pour le moment je pense me tourner vers les interruptions pour maintenir un
FPS constant selon cette distance.
Donc voilà mon tilemapper est prêt :
map_display:
bcall _grbufclr
ld c,5
map_display_y:
ld b,6
map_display_x:
push bc
call tile_display
pop bc
djnz map_display_x
dec c
ld b,c
djnz map_display_y
call ionFastCopy
ret
tile_display:
dec c
push bc
ld a,(map_x)
add a,b
ld h,0
ld l,a
ld a,(map_y)
pop bc
push bc
add a,c
push af
ld a,(map_w)
ld d,0
ld e,a
pop af
call addhlde_a
ld de,world_map
call tile_decompress
pop bc
push bc
xor a
call adda16_b
pop bc
push af
ld b,c
xor a
call adda16_b
ld l,a
pop af
ld b,16
ld c,2
call ionLargeSprite
ret
tile_decompress:
ld a,(de)
ld b,0
ld c,a
or a
sbc hl,bc
jr z,tile_decompress_ok
jp m,tile_decompress_ok
inc de
inc de
jr tile_decompress
tile_decompress_ok:
inc de
ld a,(de)
ld hl,tiles
ld de,32
call addhlde_a
push hl
pop ix
ret
adda16_b:
add a,16
djnz adda16_b
sub 16
ret
addhlde_a:
or a \ ret z
ld b,a
addhlde_a_loop:
add hl,de
djnz addhlde_a_loop
ret
Y'a sûrement des optimisations donc je suis preneur de toute remarque !
Bon voilà le plus dur était d'avoir les bases maintenant c'est plus que du remplissage... A la limite ce qui m'emmerde un peu c'est de ne pas avoir les statistiques pour les monstres et donc de ne pas pouvoir calculer exactement les même dégâts que l'original mais bon ça je ferai au mieux...
En espérant avoir le temps et l'envie de le continuer !
Plus d'info ici :
http://deeph.servhome.org/?a=entrie&id=11