Fermer2
deephLe 19/06/2011 à 12:19
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 :

05-05-11.gif


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 ! smile

Plus d'info ici : http://deeph.servhome.org/?a=entrie&id=11