Super smile

J'ai terminé de coder les nouvelles formules, sauf qu'avec la rom call _convop1 j'ai un "ERR:DIM"... D'après le wikiti :
This routine is used to convert a floating-point number OP1 to a hex value in DE, but if the number in OP1 is greater than 9999, an error will occur.

Encore heureux que j'apprends ça ici, vu que le SDK n'en dit rien roll

Donc il faut que je trouve un autre moyen de copier le contenu entier d'un OP dans un registre 16-bit... Je vais voir s'il y a d'autres rom calls, parce que j'ai un peu du mal à comprendre comment sont organisés les OP en mémoire :/

edit : enfaite c'est parfaitement expliqué ici : http://z80-heaven.wikidot.com/floating-point-stuff , donc je peux faire :
; mes calculs bcall(_int) ld a,(op1+2) ld d,a ld a,(op1+3) ld e,a
Sauf que ça me donne le résultat en décimal... Y'a-t-il une façons rapide de le convertir en héxa ?

edit 2 : De toute façons ça buggera aussi au delà de 9999 cheeky

Pourquoi stocker ça sous forme décimale aussi ? :/

Mais il doit y avoir des rom calls, je vais chercher.

edit 3 : Bon je ne trouve rien, et faire une conversion décimal->hexadécimal à la main avec des divisions euclidiennes risque d'être très prise de tête...

Je pense que je vais faire les calculs avec des routines plutôt que les rom calls, quitte à perdre un peu de place.

edit 4 : Les nouvelles formules sont codées (et dispo sur le repo), à priori ça marche, mais je ne sais pas pourquoi l'animation avec la barre d'XP est super lente... confus

En plus ça a l'air de rebugger avec les changements de pokémons en cours de combats sick

Bref je verrais ça en semaine si j'ai 5min :/
Je bosse toujours sur la routine de menu mais je voudrais demander, as-tu une routine de multiplication ? hl*a ou un truc comme ça ? Ce serait plus efficace que faire pas mal de add hl,hl's :P
J'ai rajouté récemment une routine "de_times_bc" dans maths.inc pour mon histoire de calcul d'XP, mais si tu as besoin d'en rajouter une plus rapide avec hl et a, vas-y smile

Et de mon côté je pense que c'est le fait de faire des calculs trop "grands" avec les OP qui ralentit tout (par exemple, pour la longueur de la barre d'XP, j'ai (XP actuelle/XPmax*longueur de la barre)=200/2200*44=4 pixels, et on dirait que la TI met 10 fois plus de temps à calculer ça que si XPmax=200 par exemple...) :/

Je ne sais pas ce que je peux y faire, je vais y réfléchir dès que j'ai 5min.
J'ai ajouté slowMultHLB tongue
slowMultHLB:
	dec b
	ld e,l
	ld d,h
	add hl,de
	djnz $-1
	ret

EDIT : Tes routines de math limitent le résultat à 8 bits (bon, la valeur est mise dans "a"). Tu penses les limites à 8 bits ? C'est à dire, PV, ATT, DEF, etc. ne pourront jamais être plus de 255...

Je crois qu'il serait mieux de simplement utiliser quelques routines de wikiTI / z80bits pour les multiplications/divisions, ce seront beaucoup plus rapide.
Enfaite la valeur est aussi mise dans "de", sauf que puisque dans les données les PV/ATT/DEF sont codés sur 1 octet seulement, j'utilise la valeur de l'accu. Dans tous les cas si on décide de les coder sur 2 octets, leur valeur ne pourra pas dépasser 9999 (à cause de _convop1, cf ./90).

Et je ne peux pas me passer des calculs avec les OP, certaines étapes de calcul ont des valeurs bien supérieures à ce que peuvent contenir 2 octets.

Mais de toute façons il faut voir, je ne sais même pas quelles sont les valeurs maximales dans la version originale de ces stats cheeky
Bon alors on verra plus tard smile Mais pour le moment je ne sais pas si tu as une routine que retourne la valeur des autres stats (attaque/défense), il me parait que l'on laisse la valeur dans les op's ... ?

EDIT : Et faire l'autre menu dessous avec les attaques du pokémon va être un peu compliqué, si tu vas utiliser ce style de menu plus d'une fois on peu l'implementer mais sinon je ne sais pas s'il vaut le peine... Bon j'ai une idée, je vais voir si elle peut fonctionner.

EDIT2 : Ah c'est plus facile que j'avais pensé :
lHvP
chickendude (./95) :
Mais pour le moment je ne sais pas si tu as une routine que retourne la valeur des autres stats (attaque/défense), il me parait que l'on laisse la valeur dans les op's ... ?

Non enfaite je les récupère facilement car ces valeurs suivent celles qu'on demande en paramètres (un pointeur vers l'ID des stats des pokémons souvent), je ne sais pas si ça vaut la peine d'en faire des routines. Enfin c'est toi qui voit.
chickendude (./95) :
Et faire l'autre menu dessous avec les attaques du pokémon va être un peu compliqué, si tu vas utiliser ce style de menu plus d'une fois on peu l'implementer mais sinon je ne sais pas s'il vaut le peine... Bon j'ai une idée, je vais voir si elle peut fonctionner.

Je sais qu'il est mal foutu ce menu tongue

On pourrait tenter de caser les attaques dans le menu des stats (comme ça on pourrait visualiser les 4 en même temps, quitte à faire un système de "pages" pour passer des stats aux attaques, comme dans l'original), mais celui-ci deviendrait très vide...?

Autrement, j'ai l'impression que ton curseur est décalé d'un pixel trop haut par rapport au texte, non ?

En tout cas beau travail, ça va sûrement beaucoup plus faciliter la création des autres menus/dialogues top
Maintenant il y a deux menus, un submenu qui change selon l'option chosie :
DpaN
	ld bc,$1860			;b = height, c = width
	ld de,$0028			;d = x, e = y
	ld hl,subMenu
	call setupSubMenu

	xor a
	ld de,$0005
	ld hl,menu_noAction
	call drawMenuReturn
	call menuKeyReturn	;pas d'actions, retourner ici	
;...

menu_noAction:
	.db 3				;nombre de choix
	.db "Nom",NEWX,47,"Niv",NEWX,59,"PV",NEWL
	.db MN,PKMN,3,_NAME,5,_LVL,47,_HP,59,$2F,_HPTOT,77,NEWL
	.db MN,PKMN,2,_NAME,5,_LVL,47,_HP,59,$2F,_HPTOT,77,NEWL
	.db MN,PKMN,1,_NAME,5,_LVL,47,_HP,59,$2F,_HPTOT,77,0

subMenu:
	.db PKMN,3,_NAME,2,0
	.db PKMN,2,_NAME,2,0
	.db PKMN,1,_NAME,2,0

On peut utiliser le submenu de la même manière que le menu principal, mais le submenu n'a pas d'options (le curseur ne peux pas y entrer) smile Maintenant je vais ajouter un autre menu pour les touches gauche/droite smile

EDIT : Mais une chose, pour le moment on peut seulement charger un pokémon de ton équipe. Après il faudra pouvoir charger d'autres pokémon, mes je ne sais pas encore comment tu charge les pokémon ennemis d'un bataille, par exemple.
Niquel, par contre, le '/' est décalé si les PV<10, c'est pour ça que je l'affiche avant les nombres.

De mon côté je pense pouvoir accélérer la barre d'XP en divisant par 10 voire 100 l'XP et l'XPmax avant de faire le calcul de proportionnalité.
Bon c'est fini, mais il y a un problème quand on n'a pas un attaque dans ce slot :
MOZj

Je ne sais pas comment résoudre ce problème :/

Mais le deuxième menu réutilise tout le code du menu principal, donc c'est plus compact smile
Quel est le problème ?

Moi j'arrêtai de scanner les attaques dès que l'ID=0. D'ailleurs ça me fait penser, je pense que l'ID 0 des pokémons ne pointera plus vers le premier pokémon, mais signifiera qu'il n'y en a pas, comme ça ça ce sera plus simple pour faire la différence entre rien et le pokémon #1.

En tout cas c'est très prometteur, je pense juste réaligner quelques trucs sur l'écran, mais à part ça c'est nickel happy
Ahhhh oui, c'est vrai! J'avais pas y pensé, alors pas de problème ! Aujourd'hui je veux sortir de voyage pour une semaine, (si j'arrive à acheter le billet :P) il se peut que je ne fasse rien de programmation jusqu'à retourner wink
Ok, bon voyage alors smile

edit : oups j'ai loupé ton edit :
chickendude (./97) :
Mais une chose, pour le moment on peut seulement charger un pokémon de ton équipe. Après il faudra pouvoir charger d'autres pokémon, mes je ne sais pas encore comment tu charge les pokémon ennemis d'un bataille, par exemple.

Pour le moment les pokémons ennemis sont stockés temporairement quelque part à la fin de battle.inc si mes souvenirs sont bons, afin de pouvoir facilement les gérer avec les routines de l'IA.

Autrement, ce que j'avais prévu en ./98 ne fonctionne absolument pas, c'est toujours aussi lent :/

Donc soit je trouve un autre moyen de réaccélerer tout ça, soit la barre de progression ne progressera plus pixel par pixel mais d'un seul coup. En fin de compte c'est juste un détail, mais c'est en train de vraiment me faire chier parce que je perd du temps à essayer des trucs qui ne fonctionnent pas mad
Je suis en train de débuter le système des dresseurs, je pense faire comme ça : avoir un tableau avec leurs données (type de dresseur : normal/spécial (qui peut être battu tout le temps)/champion d'arène/etc..., pokémons, fric qu'il donne et surtout ID de la map où il est et celle de son tile sur la carte), et mettre un switch pour chacun dans les données du joueur (pour savoir s'il ont été battus).

Par exemple, avec ces tiles :

XcVF

Il pourrait y avoir 10 dresseurs différents par carte (les 10 points à la fin), chaque fois que le joueur marchera sur ces tiles, il suffira de regarder quel dresseur c'est par rapport à la carte, et si le joueur essai de parler directement au sprite (tile) du dresseur, ce sera plus simple de ne rien faire.

Voilà par exemple ce que ça donnerait :

N9Yn

Vous en pensez quoi ? smile

edit : d'ailleurs je peux même coder le switch sur 1 bit avec quelque chose du genre (pour 32 dresseurs) :
get_trainer_state: ; le carry flag est mis si le dresseur a déjà été battu ld a,(trainer_id) push af srl a srl a srl a ; a/8 ld (de),a ld hl,trainers_state add hl,de pop af and %00000111 ld b,a ld a,(hl) get_trainer_state_loop: sla a djnz get_trainer_state_loop ret trainers_state: .db 0,0,0,0
(J'ai pas testé par contre et il y a surement plus optimisé, et une routine "set_trainer_state" risque d'être un peu plus chiante à faire, vu qu'on ne peut pas choisir "dynamiquement" le numéro du bit qu'on change avec l'instruction set...)

edit 2 : j'ai changé la taille des sprites des pokémons, on passe de 40*26 pixels à 32*26.

edit 3 : bon c'est à mon tour de partir une petite semaine sans internet, j'ai commencé l'ajout de nouvelles fonctions à l'éditeur de maps : la gestion des données des pokémons, des attaques et de quelques paramètres globaux (où le joueur est placé lors d'une nouvelle partie etc...), donc je compte continuer ça de mon côté. J'attends ton (vos ?) avis sur le système des dresseurs, et si c'est bon je pense commencer à coder ça ensuite.

Pour les combats, il ne manque en gros que l'ajout des objets (pokéballs surtout), la gestion de la fuite, l'IA des dresseurs et le réglage de quelques bugs (répartition de l'XP toujours sick).
Je ne sais pas si je comprends ton code pour les dresseurs. D'où vient le numéro 32 ? Mais ton idée pour les dresseurs est bonne, seulement que je ne sais pas comment tu vas extraire l'ID du dresseur quand tu parles avec le dresseur. Je crois aussi qu'il ne faut pas mettre le numéro du map, tu peux les organiser par map :
map1:
.dw m1_dresseur0
.dw m1_dresseur1
.dw m1_dresseur2
;...
map2:
.dw m2_dresseur0
.dw m2_dresseur1
;...

Je vais essayer de finir la routine de menu, pardon d'avoir tardé si longtemps !
32 c'est juste le nombre max de dresseur qu'on pourra caser dans 4 octets.
chickendude (./104) :
seulement que je ne sais pas comment tu vas extraire l'ID du dresseur quand tu parles avec le dresseur

Justement, je pense que les combats ne pourront se déclencher que lorsqu'on passera devant un dresseur (on ne pourra pas leur parler).
chickendude (./104) :
Je crois aussi qu'il ne faut pas mettre le numéro du map, tu peux les organiser par map

Oui on peut aussi faire comme ça.
chickendude (./104) :
Je vais essayer de finir la routine de menu, pardon d'avoir tardé si longtemps !

De mon côté je n'ai pas plus avancé de toute façons tongue

J'ai juste continué (mais pas finit) l'éditeur de cartes pour pouvoir modifier plus de données du jeu facilement (cf ./103).

Ton voyage était bien ?
Très bien, merci smile J'ai un peu de temps ce soir, je vais voir ce que je peux faire, si je peux me retrouver dans le code.

EDIT : J'ai ajouté pas mal de données, tous les noms des pokémon (en anglais), une liste des attaques, etc. Je crois que j'ai rompu pas mal de tes calculs, mais on peut régler tout ça après. Je suis presque prêt à faire le commit, il faut que je convertisse encore quelques choses et teste que tout marche comme il faut, mais c'est presque fini. Peut-être demain je pourrai le finir.

EDIT2 : J'ai ajouté un sprite vide pour tous les pokémons qui n'ont pas de sprite, mais la taille du programme est trop grande sad
Tu as mis les 151 pokémons ? C'est sur, ça fait trop tongue

À mon avis une quarantaine aurait été suffisant (sauf si on en fait une APPS, mais ça va demander pas mal de modifications). Enfin je ne sais pas, il faut voir.
chickendude (./106) :
Je crois que j'ai rompu pas mal de tes calculs, mais on peut régler tout ça après.

Oui c'est pas grave, autant repartir sur des "bases saines" smile

Et prend ton temps, ça n'est pas pressé.
Bon, 150 pokémons mais oui :P

Je crois qu'il serait mieux de mettre les données du pokémon méchant/de ton équipe dans RAM pendant les batailles, le code serait plus clair, mais d'abord je vais le nettoyer pour un premier release wink
Dans ce cas on en fait une application ou pas ? Je veux bien, de toute façons rien ne m'empêchera d'en faire une version allégée pour la TI 83 (par contre les échanges/combats par le link ne seront pas possibles entre 83/83+ du coup).

De mon côté j'en suis à me demander si je ne pourrais pas faire en sorte que l'éditeur de carte soit carrément un "pokémon maker" (un peu comme RPG Maker), avec lequel tout le monde pourrait faire son propre jeu. En gros, il suffirait que je rajoute une liste des cartes (avec la gestion des dresseurs/téléportations/autres évènements liés), l'éditeur des pokémons/attaques/de quelques données spécifiques à chaque version (un ID unique pour ne pas mélanger les versions avec les échanges link, etc...) et ça pourrait le faire. Bien sûr, le code source (du jeu et de l'éditeur) sera fourni donc de toute manière tout le monde pourra le bidouiller davantage. Qu'est-ce que tu en penses ?
Je crois que c'est une bonne idée, je ne sais pas si sera trop difficile ou non, mais c'est intéressant tout de même.

Et oui, une version 83 va être plus compliquée, il faudra utiliser un type de compression ou comme tu dis faire une version allégée.
Je veux bien m'occuper d'une version pour ti83 si ça vous intéresse. A la base, je suis un développeur ti83 smile
Ok, je t'ai ajouté dans les committers smile

Actuellement le projet est cross-compilable entre 83/83+, mais si on en fait une application il va falloir bouger pas mal de choses en RAM, mais pour la version 83 autant continuer à faire du SMC quand c'est possible.

Le code source risque d'être pas mal modifié avec les ajouts de chickendude, donc pour le moment mieux ne vaut pas trop ajouter de choses à partir du code actuel.

Ah oui, et je pense qu'il est préférable qu'on commente le code en anglais, comme ça il sera à la portée de plus de monde.

Autrement je pense que des routines set_bit/get_bit (mettre on/off et connaitre l'état du nième bit à partir d'une adresse) pourront être utiles, mais comme ça je ne vois pas trop comment faire la routine set_bit de manière assez optimisée. Pour get_bit je pense à quelque chose du genre de ce que j'ai posté en ./103, sauf si vous trouvez mieux tongue
Le problème le plus grave sera la taille des données, surtout les sprites. Peut-être la version 83 pourrait utiliser des sprites 16x16 ou un certain sprite pour chaque type de pokémon (comme l'on voit dans le menu de pokémon Gold/Silver, il y a un petit icon à côté du nom du pokémon). Comme ça nous n'aurons que 10 sprites pour les pokémons.
Ok, je t'ai ajouté dans les committers


Cool smile

Il fait quelle taille le programme actuellement?
J'en étais à ~10,5 ko avec seulement 4 ou 5 pokémons de codés.

chickendude > ce sera beaucoup moins beau graphiquement tongue

Enfin pourquoi pas, de toute façons si je rend l'éditeur assez flexible on pourra faire autant de version qu'on veut. Mais c'est sûr que sur 83 il va falloir faire des concessions...

Pour les maps, je pense qu'on peut dans tous les cas les encoder en RLE, et peut être les sprites des pokémons aussi (étant donné qu'il faudra les copier en RAM), non ?
Je ne sais pas comment tu veux l'utiliser, mais set_bit est facile aussi avec du smc :
;a = bit que l'on veux armer
set_bit_HL:
	rlca
	rlca
	rlca
	or %11000110 ;%110 = (hl), %111 = a
	ld (setBit),a
setBit = $+1
	set 0,(hl)  ;set x,(hl) = 11001011 : 11XXX110
	ret


EDIT : Quant aux commentaires, comme tu veux, j'ai fait la plupart en (mon assez mauvais) français, mais maintenant je peux commencer à les écrire en anglais wink
Ah ouais pas bête le SMC, sauf qu'il faudra la copier en RAM tongue

En gros je voudrais pouvoir m'en servir comme ça (chaque bit=une variable booléenne) :
ld hl,bit_field ld a,12 call res_bit ; reset le 12ème bit ld a,3 call get_bit ; prendre l'état du 3ème bit (qui est mis dans cet exemple) ; etc... ret bit_field: .db %00010000,%00001000,%00000000,%00000000

edit : d'ailleurs que la routine lise l'octet de gauche à droite ou inversement n'est pas important dans notre cas (du moment que toutes les routines procèdent pareil).

edit 2 : tiens on est pas les seuls à coder un Pokémon pour calc :

4153.gif

http://www.planet-casio.com/Fr/forums/topic12013-1-pokemon.html

Ça a l'air plus simple en C (rien que pour les calculs j'imagine) tongue

Par contre je trouve la résolution de l'écran de la casio un peu trop "horizontale".

Il y a même une chaine yt : http://www.youtube.com/watch?v=DZYio5ZT_Hw&list=PLUUkYAR3PmLXtVA7YN1KYzYzHtkz93Z82&index=1

edit 3 : j'ai fait un commit pour réorganiser le dossier, ajouter le début du nouvel éditeur et fait quelque changements dans le code relatifs aux nouveaux sprites.
Maintenant je bosse sur la partie de batailles et il faut dire que les noms de tes labels son très longs ! "battle_attack_calculate_opponent_damages_skip" ? Haha, quand je veux chercher un label ça prend pas mal de temps seulement d'écrire son nom :P Mais ça avance, je crois que je vais faire un commit bientôt, même si j'ai pas encore fini de convertir tout au nouveau formate.

EDIT : Et avec le nouveau commit pas mal de choses se sont rompues de nouveau sad
Normalement il n'y a pas tellement de changements avec le nouveau commit (seulement quelques bugs de réglés à cause du nouveau format des sprites) confus

Autrement oui, les labels sont assez long, mais c'est pour m'y retrouver entre toutes les routines tongue

Et puis tu n'as qu'a les copier/coller (avec ":") dans le moteur de recherche de ton éditeur de code, et ça t'envoie à la routine directement tongue
Je ne sais pas, il faut justement les chercher après finir cette partie de la routine de bataille.

Est-ce que tu as fait quelque chose avec les maps ? Tous les tiles sont incorrects :/