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 :/
J'ai rajouté des tiles (et il manque encore ceux des grottes/tunnels), mais normalement les nouvelles maps en tiennent compte.

Autrement je peux m'occuper d'adapter tes routines aux dialogues/menus restant si ça te prend trop la tête (surtout pour tout ce qui est dans battle.inc & co j'imagine) tongue

edit : oups par contre je n'ai pas changé la praticabilité des tiles... :/
Bon ce soir je vais commit ce que j'ai fait, mais il reste beaucoup de choses qui ne marchent pas encore wink Mais je crois que les attaques sont presque finis. J'ai récrit quelques de tes routines qui me paraissaient un peu trop compliquées et j'ai essayé de nettoyer et commenter le code un peu smile
Ok, merci top

Tant mieux pour les routines, certaines sont effectivement assez peu optimisées puisque je ne faisait que leur rajouter des trucs au fur et à mesure smile

(Donc si j'ai bien compris il est ~17h en Chine là ?)
Oui, maintenant il est 18:05 smile Je vais faire le commit maintenant, mais le code est toujours dans un grand désordre, quelques de tes routines vieilles y reste (bien qu'il ne servent plus à rien), j'en ai pas mis à jour d'autres, et il semble que le jeu plante au lancement, mais seulement parfois. Je crois que c'est à cause de tes vieilles routines qui ne sont pas (encore) compatibles avec les nouvelles que j'ai écrites. Et peut-être tu peux résoudre ce mystère des nouveaux maps !

Mais les menus sont plus facile à coder maintenant, beaucoup plus flexibles et (ce qui est mieux !) occupent moins d'espace ! Je vais continuer à mettre à jour les autres parties du jeu (et commit au fur et à mesure). Comme ci tu pourras continuer à travailler (mais pour le moment pas mal de choses sont rompues et le système de batailles me parait trop complexe, mais je ne vois pas une façon facile de le simplifier).

Et une autre chose, tu crois qu'avoir tous les calculs va bénéficier ton jeu ? Comme tu fais les calculs et très complexe, bien que tu as déjà fais la plupart des calculs. Mais je me demande s'il ne serait peut-être mieux de simplifier tes calculs un peu pour ne pas avoir à te servir des OPs/calculs FPs...

EDIT : et le commit est fini !
Ok je regarde tout ça smile

Pour les combats, je peux m'occuper d'adapter ta routine (et tenter de rendre le code plus clair et commenté tongue).

Pour les menus tant mieux, car il en reste pas mal à coder !

chickendude (./124) :
Et une autre chose, tu crois qu'avoir tous les calculs va bénéficier ton jeu ?

Comment ça ?

Je suis obligé de passer par les OP pour certaines formules car certaines étapes de calcul ont des résultats à virgule ou bien supérieurs à ce que peuvent contenir deux octets... Mais de toute façons les utiliser n'est pas si lent que ça, et faire autrement prendrait plus de place.

edit : j'ai fait un nouveau commit : spasm accepte maintenant de compiler le projet avec l'option -A (sensible à la casse), j'ai réparé la carte et les tiles et là je vais commencer à réparer ce qui a été cassé (j'ai l'impression que le menu start bug, non ?).
Je veux dire changer de formules, créer tes propres qui se paraissent aux originales mais qui sont plus... simples... et non pas besoin de résultats si exacts. Je crois que même utilisant des valeurs 24 bits seraient plus simple, mais c'est comme tu veux !
Je ne sais pas, elles sont quand même assez simples, non ? D'ailleurs j'hésite à ajouter les autres stats des attaques/pokémons (vitesse etc...) si on en fait une application.
Par exemple:
int(((([attacking pokémon level]*0.4+2)*[Attack power])*[attacking pokémon ATT at his level]/([Pokémon being attacked DEF at his level]*50+2)*CE)

On peut faire:
AP = attacking pokémon
1. (AP_lvl*2/5)+2 (s'il y a une fraction, peu importe, ou utiliser des numéros 24-bit)
2. *ATK_pwr
3. *AP_atk
4. *CE
...etc., comme ça on n'a pas besoin des calculs FP. Mais je suppose que vraiment ce n'est pas très important. C'est juste qu'il semble y avoir pas mal de code dédiés aux calculs.
Je ne sais pas si les résultats seront sensiblement les mêmes ?

Enfin je n'en suis pas encore là, pour l'instant je lis ton code avant d'essayer de réparer le reste des combats smile
Je crois que la différence serait très peu, les attaques des pokémons avec un niveau plus haut serait parfois un petit peu plus faible (1-5 PV?).

Et j'ai trouvé la cause des plantages, je vais la régler tout de suite smile
Ok, ça te dérange si je change quelques noms de labels ?

Autrement je suis en train de lire ton code, et je ne comprend pas trop pourquoi mettre un compteur pour la détection des touches directionnelles ?
;********************************* ld hl,menu_key_loop ;* push hl ;* where to jump ;********************************* ld a,$fe ;check arrows call get_key or $f0 ;erase bits 4-7 ld b,a inc b ;if b+1 = 0, b = $FF then no arrows have been pushed ld hl,cursor_wait ;the counter jr nz,$+4 ;jump if a key has been pushed ld (hl),b ;reset the counter ret dec (hl) ;counter-1 ret p ;quit if plus (>=0) ld (hl),cursor_speed ;refill the counter

Autant ralentir un peu la boucle avec un "ld b,cursor_speed\ call wait", non ?
Parce que comme ça tu peux pousser une touche et le curseur avancera lentement si tu ne la relâches pas, mais si tu la pousses plusieurs fois le curseur avancera chaque fois que tu la pousse (après avoir la relâchée) smile

Et change les labels comme tu voudras.

EDIT : Et j'ai réglé la bogue / commit.
Oui mais faire une simple pause avec des "halt" n'aurait pas suffit ? Je crois que c'est ce que je faisait avant.

Enfin ça marche aussi comme ça, donc c'est comme tu veux.
Mais si on fait la pause, si tu pousses une autre touche pendant la pause le curseur n'avancera pas.

EDIT : Et comment devraient être les valeurs de CE ?
0 = not effective
1 = normal
2 = super effective
3 = no effect
?
Je ne vois pas ton commit, c'est normal ?
chickendude (./134) :
Mais si on fait la pause, si tu pousses une autre touche pendant la pause le curseur n'avancera pas.

Oui mais la pause est très courte, par exemple :
#define cursor_speed 20 menu_key_loop: ld b,cursor_speed call wait ;slow down the cursor ld a,$df ;check ALPHA call get_key rla ret nc ld a,$bf ;check 2nd ($bf = key group #7 : Y=, WINDOW, ZOOM, TRACE, GRAPH, 2nd, MODE, DEL) call get_key cp 223 ;2nd jr z,menu_select ;************************* ld hl,menu_key_loop ;* push hl ;* where to jump ;************************* ld a,$fe ;check arrows call get_key or $f0 ;erase bits 4-7 ld b,a inc b ;if b+1 = 0, b = $FF then no arrows have been pushed ret p ;quit if plus (>=0) ; etc...

Ça marche tout autant et c'est plus petit, non ? Autrement, dans les menus à une dimension (haut/bas), si on appui sur gauche/droite ça fait monter/descendre le curseur, je trouve ça un peu gênant... Je vais voir si je peux y faire quelque chose.

En tout cas bravo, ton code est quand même plus propre et optimisé que le mien tongue
chickendude (./134) :
Et comment devraient être les valeurs de CE ?
0 = not effective
1 = normal
2 = super effective
3 = no effect?

Oui c'est ça smile
Je ne sais pas, peut-être je n'ai pas compris mais je vais le tester. Quant au commit, c'est parce qu'en Chine on n'aime pas Google, la plupart des fois mes commits sont bloqués :/ Je vais le faire de nouveau smile La routine "calculate_damage" est presque près, aussi, mais il faut que je me couche dans quelques minutes wink

EDIT : Ok, j'ai pu faire le commit !
chickendude (./136) :
Quant au commit, c'est parce qu'en Chine on n'aime pas Google, la plupart des fois mes commits sont bloqués :/

Ça doit être pénible à force cheeky
chickendude (./136) :
La routine "calculate_damage" est presque près, aussi, mais il faut que je me couche dans quelques minutes wink

Cool, de mon côté je recode la sélection du personnage au début du jeu : je trouvais la "mise en page" trop moche. Bonne nuit !
Bon j'ai fait quelques petites modifications, mais je continue demain. Pour que je m'en souvienne, je veux régler le clignotement des pokémons quand on les attaque et le menu de pokémon (accessible du menu start). A demain !
J'ai changés quelques trucs avec les dialogues : on ne peut les valider qu'avec 2nd et les accélérer qu'avec Alpha. Le curseur de certains menus clignotait lorsqu'on était en "limite de choix", donc j'ai réglé ça aussi (ceux qui bug je n'ai pas encore vérifié).

J'ai aussi changé la "mise en page" du choix du personnage (avec les sprites des dresseurs adverses) :

9PUq

Si vous avez de meilleurs sprites n'hésitez pas, c'est le mieux que j'ai pu faire en 24*26 pixels.

J'hésite à débugger les combats sachant qu'apparemment tu es en plein dedans... Enfin après on pourra virer pas mal d'anciennes routines et gagner quelques octets smile

Ah et j'ai changé beaucoup de noms de labels, j'espère que ça ne va pas trop te déranger...

edit :

co7c

J'ai continué un peu l'éditeur, fait quelques petits modifications (dont la vitesse du joueur, que je trouvais un peu trop rapide, mais maintenant je me demande si ce n'est pas légèrement trop lent ?) et débuté le système des dresseurs. Il fonctionne comme ça : au delà d'un certain tile (trainer_tile), ce ne sont plus que des tiles relatifs aux dresseurs. Si le joueur marche dessus alors on va vérifier grâce à la liste map_trainers quel dresseur c'est par rapport à la carte, puis on choppe ses données et ensuite on débute le combat (ce que je n'ai pas encore fait tongue). Pour l'instant tous les dresseurs sont du même type (on ne peut les battre qu'une fois, mais je pense ajouter un octet par dresseur pour définir ça). Et je pense définir leur état sur 1 bit comme je disais plus haut.

C'est la solution la plus optimisée à laquelle je pense, je ne sais pas si vous en voyez d'autre ?
Je crois qu'il serait mieux d'utiliser 2nd en lieu d'Alpha (ou les deux) pour accélérer les textes, mais j'ai pas testé oncalc alors il se peut que oncalc ce soit plus pratique. Mais bon c'est facile à changer et pas tellement important. Je vais avancer un peu plus avec la routine de batailles smile
Dans l'original c'est bien la touche B (=alpha) pour accélérer les textes il me semble.

Autrement c'est à mon tour d'avoir des emmerdes avec mon PC portable, le disque dur mécanique est mort apparemment mad

Du coup je vais m'en commander un autre vu qu'il n'est plus sous garantie (un SSD cette fois, marre de ces disques mécaniques merdiques qui se cassent au bout de 2 ans, même en y prenant vraiment soin mad mad mad mad), donc je pense être coupé d'internet une bonne semaine... :/

Heureusement j'ai des sauvegardes sur disque dur externe, mais je me demande si je ne pourrais pas tenter de récupérer mes autres données... Je ferais peut être un topic dans la rubrique adaptée de yN quand j'aurais le temps et accès à internet...
Ah je regrette d'entendre ça sad J'espère que tu puisses récupérer toutes tes données (ou au moins celles qui sont les plus importantes) !

EDIT : J'ai simplifié les calculs des barres de PV : ld c,(hl) ;max HP dec hl ld h,(hl) ;cur HP ld l,0 call hl_div_c ;curHP/maxHP (l will hold the remainder, aka the fraction) ld b,50 call slow_mult_hl_b ;the bar takes up 50 pixelsMaintenant la routine est plus rapide et plus petite smile

EDIT2 : On peut attaquer l'autre pokémon smile

EDIT3 : J'ai presque fini les batailles :
ET7u

Mais il est tard, je les fini demain !
Bon il y a peut être une chance que je récupère certains fichiers : j'ai une erreur "unmountable boot volume" qu'on peut apparemment régler si on accède à l'invité de commande, sauf que je n'y arrive pas encore (j'ai même pas eut de CD de windows XP avec mon netbook... :/), mais j'y travail. Autrement comme j'avais deux partitions (l'une pour windows, l'autre pour la plupart de mes fichiers), si j'arrive à réinstaller windows sur la première je pourrais sans doute conserver certains fichiers...

Bref c'est pénible sad
J'ai simplifié les calculs des barres de PV :

Mais du coup ça buggera au delà de 255, non ?
J'ai presque fini les batailles ::

Génial smile

D'ailleurs j'ai mis les noms des pokémons/attaques en majuscules car c'est comme ça dans l'original (et pas forcément moche non plus), je ne sais pas ce que tu en penses.
Oui, mais les PVs ne sont-elles limitées (pour le moment) à 255 ? Plus tard on peut utiliser une valeur 24-bit pour le faire, si tu veux augmenter la gamme de valeurs.

J'ai mis quelques noms en minuscules parce qu'ils étaient trop large pour aller dans la boîte de texte (je crois que c'était "Léchouille"). Personnellement je crois qu'il se voit mieux en minuscules, mais si tu veux rester fidèle à l'originale c'est bon aussi, le plus important c'est qu'il marche :P

Oh, et j'avais ajouté la liste d'attaques pour "Squirtle" (le petit pokémon d'eau). J'espère bien avoir le temps de finir la routine de batailles ce soir !
Bon j'ai réglé mon problème avec l'"Hiren's boot cd" fou

Maintenant je vais faire un tas de copies juste au cas où...
chickendude (./144) :
Oui, mais les PVs ne sont-elles limitées (pour le moment) à 255 ? Plus tard on peut utiliser une valeur 24-bit pour le faire, si tu veux augmenter la gamme de valeurs.

Une valeur 16-bit suffira même (on ira pas au delà de 999 je pense, je crois que c'est ça dans l'original).
chickendude (./144) :
Personnellement je crois qu'il se voit mieux en minuscules, mais si tu veux rester fidèle à l'originale c'est bon aussi, le plus important c'est qu'il marche :P

J'aime bien l'idée de rester proche de l'original, et je trouve que ça fait moins bizarre que d'avoir un nom de pokémon/attaque avec une majuscule au milieux d'une phrase.
Je crois qu'il serait mieux d'extraire les données de tous les pokémons dans une bataille dans la RAM. Donc pour chaque pokémon on aurait :
-son ID pokédex
-son niveau
-son HP actuelle/totale
-ses stats à son niveau actuel (atk, def, etc.)
-pointeur vers le string qui contient son nom et peut-être même son sprite
-liste d'attaques/leurs PP

Comme ça, on calcule une fois les stats du pokémon et après on peut les utiliser dans tous les calculs, les strings, etc. Pour le moment c'est pas très important, mais je crois que quand tu travailleras avec les dresseurs ça va te simplifier beaucoup la vie. Au finale d'une bataille tu peux recopier les données nécessaires à ton équipe (HP, niveau, état, ...). Qu'en penses-tu ? Je vais regarder ton système de gérer les dresseurs après finir la conversion des batailles, mais je crois que ton idée pour les dresseurs est bonne. Quant à la vitesse, je suis d'accord, avant c'était trop rapide, peut-être on pourra s'acheter un vélo ou des chaussures de course ?
chickendude (./146) :
Comme ça, on calcule une fois les stats du pokémon et après on peut les utiliser dans tous les calculs, les strings, etc. Pour le moment c'est pas très important, mais je crois que quand tu travailleras avec les dresseurs ça va te simplifier beaucoup la vie. Au finale d'une bataille tu peux recopier les données nécessaires à ton équipe (HP, niveau, état, ...). Qu'en penses-tu ?

Oui c'est vrai que ça facilitera la récupération des données dans le cas des dresseurs. Mais je ne pense pas que recopier le nom/le sprite du pokémon en RAM soit obligatoire : ce sont des données "statiques" qu'on peut retrouver si on a son ID pokédex.
chickendude (./146) :
Quant à la vitesse, je suis d'accord, avant c'était trop rapide, peut-être on pourra s'acheter un vélo ou des chaussures de course ?

Oui mais il faudra ajouter un (petit) système de dialogue avec les npc dans ce cas. On pourra s'inspirer de ce qu'on fait avec les dresseurs (avoir des tiles propres aux npc et une table par map).
deeph (./147) :
Oui c'est vrai que ça facilitera la récupération des données dans le cas des dresseurs. Mais je ne pense pas que recopier le nom/le sprite du pokémon en RAM soit obligatoire : ce sont des données "statiques" qu'on peut retrouver si on a son ID pokédex.
Je les ajoute seulement parce que je m'en sers dans la routine de menu, mais oui c'est facile à les trouver avec l'id pokédex. A propos, dans gbavar.inc il dit : backBuffer = saferam1

Est-ce que l'on utilise saferam1 aussi ?
deeph (./147) :
Oui mais il faudra ajouter un (petit) système de dialogue avec les npc dans ce cas. On pourra s'inspirer de ce qu'on fait avec les dresseurs (avoir des tiles propres aux npc et une table par map).
Qu'est-ce que tu veux dire ? Tu ne pensais pas ajouter de dialogues avec les npcs ? Je parlais simplement d'une méthode pour marcher plus vitement, comme le vélo dans l'original.

EDIT : et pour les attaques comme "growl" qui ne font aucun dommage, je crois que l'on peut utiliser un "effet d'état" pour les gérer, par exemple 5 = baisser la défense, 6 = baisser la défense beaucoup, 7 = augmenter la défense, etc.

EDIT2 : La plupart des batailles est faite :
2hTI

Il reste encore :
-gérer l'expérience
-les attaques spéciaux (super effective, not effective)
-changer de pokémon / utiliser items :P

Je crois que je pourrai optimiser un peu tes routines pour calculer l'expérience gagné, mais pour le moment l'expérience ne marche pas.
chickendude (./148) :
Est-ce que l'on utilise saferam1 aussi ?


Actuellement non, et je pense que gbalib2 l'utilise entièrement (j'ai pas vérifié par contre).
chickendude (./148) :
Qu'est-ce que tu veux dire ? Tu ne pensais pas ajouter de dialogues avec les npcs ? Je parlais simplement d'une méthode pour marcher plus vitement, comme le vélo dans l'original.

Jusque là je n'y ai pas trop réfléchi mais ce sera surement nécessaire (mais par exemple, d'un autre côté Pokémon Topaze n'a pas de dialogues avec les npcs). Pour le vélo j'ai compris, mais c'est juste que ce sera nécessaire de l'acheter/l'obtenir auprès d'un npc tongue
chickendude (./148) :
et pour les attaques comme "growl" qui ne font aucun dommage, je crois que l'on peut utiliser un "effet d'état" pour les gérer, par exemple 5 = baisser la défense, 6 = baisser la défense beaucoup, 7 = augmenter la défense, etc.

Je pensais à la même chose, sauf qu'il va falloir stocker temporairement les stats des 6 pokémons du joueur et des dresseurs : quand on "switch" de pokémon durant un combat il ne faut pas que ça "oublie" les altérations de stats...
chickendude (./148) :
Je crois que je pourrai optimiser un peu tes routines pour calculer l'expérience gagné, mais pour le moment l'expérience ne marche pas.

À la base ça marchait lorsque seulement 1 pokémon a combattu, mais ça bug au delà il me semble sorry

Si tu peut les optimiser tant mieux smile
chickendude > je sais que tout comme moi tu n'as sans doute pas beaucoup de temps pour programmer (ou d'autres projets), mais est-ce que ce serait possible que tu m'explique rapidement comment marche le menu pokémon (est-ce qu'il faut modifier les ID des pokémons via du SMC dans la string du menu avec les tokens ?). Je n'y ai pas trop regardé enfaite, mais j'aimerai bien revenir au point où j'en étais avant toutes les optimisations pour pouvoir avancer smile

Si j'ai 5min je vais reprendre le développement des combats.

edit : j'ai commencé à y regarder, il y avait un problème dans le chargement du bon pokémon (l'ID des pokémons du joueur commence à 1 et non à 0 comme les ID du pokédex), mais pour le reste je ne sais pas trop ce qui cloche : je crois que les nouvelles coordonnées X qui suivent certains tokens (dont _NAME et _LVL) sont mal chargées ou du moins mal affichées (mais je ne vois pas trop où dans le code elles sont chargées justement).