Tamagotchi ou la gestion du temps en C
Posté le 17/08/2018 14:37
Bonjour à tous !!
Oui oui je sais je ferais mieux d'arrêter les conneries et de terminer mes anciens projets... Mais je le avance petit à petit dans l'ombre et le silence
(mais si c'est vrai !)
Désireux de progresser en C j'ai eu l'idée de me familiariser avec le système de tics inclus dans la calto et qui permet de mesurer le temps (comme vous en savez plus que moi sur le sujet je demanderais sans doute un peu d'aide )
oui oui c'est bon : j'ai déjà vu, lu signé et approuvé le tuto qui en parle.
Passons au cœur du projet : vous connaissez tous les Tamagotchi : ces petites consoles vendu au Japon vers la moitié des années 90 (1996 au Japon et 97 en Europe pour être précis). Le but et de chouchouter, pouponner et nourrir un petit animal virtuel dans le but de le faire... vivre...
oui oui c'est ça le but ultime par le tuer en un minimum de temps... je vois votre déception d'ici.
Bon pour mon premier jet je vais essayer de faire un truc le plus basique possible (mais je le fait en C) J'ai déjà mis sur pied mon systèmes de points et tout je fais mes sprites prochaines étape : le code.
J'ai hiérarchisé mes idées en plusieurs catégories :
les Actions
On fait des actions grâce au touche F1~F5
F1 : lui donner à manger
F2 : aller au Wc (j'invente rien c'est dans le jeu original...)
F3 : le laver
F4 : jouer
F5 : le faire dormir
Voila pour les Actions disponibles
les Points
Je les ai subdivisé en 5 catégories :
-Pts d'équilibre (eq) correspond à l'équilibre de son alimentation
-Pts d'énergie (en) rien d'extraordinaire vous savez à quoi ça sert l'énergie...
-Pts de faim (f) correspond à la satiété : plus on a de Pts de faim moins il a faim...
-Pts d'humeur (hu) Si il en a beaucoup il est sympa sinon il te fait la gueule
-Pts d'hygiène (hy) Comprenez la propreté.
gestion du temps
Avec les temps les points évolue.
Les points :
-d'énergie
-de faim
-d'humeur
-d'hygiène
perdent 2 par heures
Le temps intervient également dans les envies du moment attention : ces envies relèvent non pas des besoins de l'animal mais de sa "volonté" ainsi il aura envie :
-de manger toutes les heures
-de jouer toutes les deux heures
-d'aller au Wc toutes les 2h30
-de se laver toutes les 4 heures
-et de dormir toutes les 5 heures
les Stats
Elles seront composées de jauges aves un petit logo devant qui indiques quel points la jauge représente.
Un petit éclair pour l'énergie, un savon avec des bulles pour l'hygiène, une fourchette pour la faim, et une balance pour l'équilibre.
Les stats pourrons être appelées via [OPTN]
Manger
Cette action m'étant fort sympathique j'ai décider d'étayer les choix...
Le joueur pourra choisir entre plusieurs mets ayant chacun leurs bon et les mauvais points...
-Le bol de riz : eq+2 / en+80 / f+100 / hu-5 / hy-30
-le burger : eq-10 / en+80 / f+80 / hu+10 / hy-30
-le gâteau : eq-5 / en+50 / f+100 / hu+10 / hy-30
-la soupe : eq+10 / en+50 / f+80 / hu-5 / hy-30
-le lait : eq+5 / en+20 / f+20 / hu+5 / hy-30
-le soda : eq-2 / en+10 / f+10 / hu+5 / hy-30
Voila
Lorsque la touche F1 est pressée, le bord droit de l'image se décale vers la gauche ménageant ainsi un espace dans lequel vous aurez deux flèches de part et d'autre du logo de la nourriture place au milieu. En dessous le nom de la nourriture apparaitra et en haut un indication : "[F1]⇒Ok [F6]⇒Non"
les autre Actions et les Points
Toutes action interagissent avec les points :
-manger (déjà fait)
-aller au Wc : en-5 / hy+20
-jouer : eq+5 / en-20 / f-20 / hu+20 / hy-20
-dormir : en
au max / f-80 / hu+60 / hy-60
-le laver : en-20 / f-20 / hu+20 / hy+80
les Jeux
Le menu des jeux se présente de la même manière que celui pour manger sauf que le logo est celui du jeu en question et le nom de la nourriture est remplacer par une règle succincte du jeu.
Exemple : le logo est une balle qui tombe et la règle est "Attrapez les balles".
Les points pourrait varier d'un jeu à l'autre mais je n'en suis pas là.
J'ajouterais surement "faire une balade" et "caresser" et pis après je m'en remet à vous
Dans les améliorations à venir noter que j'ai l'intention de mettre sur pied un système qui permet de faire communiquer les Tamagotchi entre eux comme les vrais...
Je pense que j'ai fait le tour de l'état du projet théorique actuel.
Etat du projet...
...en ruines
Le code de compatibilité SH4 doit être nettoyé
la créations de fonctions pour l'affichages des animations fait !
utilisation des matrices Inutile
Fichier joint
Citer : Posté le 22/08/2018 18:26 | #
Mais ça veut dire quoi "Address (R) " le problème vient de quoi j'ai touché à une partie mémoire protégée, j'ai fait quoi ??
Citer : Posté le 22/08/2018 18:41 | #
Soit tu as accédé à une adresse interdite, soit tu as poussé une fonction que tu appelles à le faire en lui fournissant de mauvais paramètres... basiquement c'est ça.
Citer : Posté le 22/08/2018 18:59 | #
ok... donc il faut que je checks toutes mes fonctions une par une... Mais comment je reconnais un "mauvais paramètre" ?
Citer : Posté le 22/08/2018 19:07 | #
Tu vérifies tes pointeurs et tes adresses... tu peux aussi débugger en affichant du texte ou en mettant des GetKey() pour trouver à quel moment le bug se produit. Ou tu peux commenter du code jusqu'à ce qu'il disparaisse. Ton imagination est la seule limite. (Hint : breakpoints)
Citer : Posté le 22/08/2018 19:43 | #
Je ferais cela demain... les douces joies du code passer 12 heures sur un problème pour comprendre qu'il faut que la seule soluce et de mettre un breakpoints à chaque ligne... bon ça se fait mais l'émulateur ne la voit pas l'erreur [le SDK et son émulateur]
FA-124 va chauffer
Ajouté le 23/08/2018 à 09:45 :
Je pense que j'ai réussi à localiser l'erreur sans même l'utilisation des breakpoints :
Les dossiers sont créés donc le programme bug après...
L'animation de l'œuf n'est pas encore passée donc le bug est avant
je passe de 800 lignes à 11 ce qui est plus agréable...
timeref[0]=hours;
timeref[1]=mins;
timeref[2]=secs;
timeref[3]=msecs;
fd=Bfile_OpenFile(PathName, _OPENMODE_WRITE);
Bfile_WriteFile(fd, &timeref, sizeof(timeref));
Bfile_CloseFile(fd);
fdbis=Bfile_OpenFile(Points, _OPENMODE_WRITE);
Bfile_WriteFile(fdbis, &points, sizeof(points));
Bfile_CloseFile(fdbis);
Ce sont dans ces lignes que je touche un truc quel ne faut pas toucher...
Je penche pour une erreur avec l'écriture des fichiers
Ajouté le 23/08/2018 à 12:07 :
J'ai réussi à affiner j'ai trouvé la ligne :
les variable "hours, mins, secs, et msecs" sont initialisées en unsigned int et prennent la valeur de 0 Si vous savez comment résoudre ce problème merci d'avance
Citer : Posté le 23/08/2018 13:24 | #
Comme t'as déclaré RTC_GetTime ?
Citer : Posté le 23/08/2018 13:26 | #
je l'ai déclaré juste avant le main :
void RTC_GetTime (unsigned int *hours, unsigned int *mins, unsigned int *secs, unsigned int *msecs)
{
SysCall((unsigned int)hours,(unsigned int)mins,(unsigned int)secs,(unsigned int)msecs, 0x03A);
}
Citer : Posté le 23/08/2018 13:28 | #
Ah bah voilà
Faut pas toucher aux valeurs de SysCall, mis à part le code du syscall. Enfin, Lephe sait mieux que moi comment appeler les syscalls en C, mais je suis sûr que ça vient de là
Citer : Posté le 23/08/2018 13:29 | #
Mais du coup... comment faudrait-il que je le déclare ?
Citer : Posté le 23/08/2018 13:37 | #
Poke @Lephenixnoir
Citer : Posté le 23/08/2018 13:38 | #
Tu peux essayer de la manière dont je le fais dans mon tuto (c'est une autre façon tout à fait valide).
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 23/08/2018 13:40 | #
Ben pour moi c'est exactement ce qu'il faut faire. Si tu ne passes pas les arguments, il ne vont pas arriver tous seuls...
Citer : Posté le 23/08/2018 13:41 | #
Comment t'explique la systerr dans ce cas ?
Citer : Posté le 23/08/2018 13:42 | #
Si ça marche sur émulateur mais pas sur calto, ça m'étonnerait que le problème vienne du code en lui même :/
J'imagine que le syscall du RTC marche sur SH3 mais pas sur SH4, un truc comme ça.
Faudrait regarder comment gint fait son rtc (ou sinon utiliser gint )
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 23/08/2018 13:46 | #
Faudrait regarder comment gint fait son rtc (ou sinon utiliser gint )
Je ne peux pas dire pour le syscall, par contre la RTC est l'un des rares objets qui fonctionne exactement pareil sur SH3 et SH4 (seule son adresse change), donc ça paraît curieux.
gint a son driver custom et si tu y tiens tu peux l'utiliser out-of-the-gint dans fxlib.
Citer : Posté le 23/08/2018 13:52 | #
Pour gint... chuis pas très chaud les niveaux de gris et tout j'aurais adoré mais je tiens les VMs en horreur j'en ai une qui a Win 7 c'est une catastrophe : ça bug, ça répond pas, ça s'éteint tout seul quand je transfère un truc, c'est impossible je m'imagine pas coder sur un ordi qui s'éteint à chaque retour à la ligne je code suffisamment lentement comme ça...
Citer : Posté le 23/08/2018 13:53 | #
En gros tu peux réutiliser le driver uniquement.
Citer : Posté le 23/08/2018 13:54 | #
Pas besoin de VM, tu peux utiliser cygwin (comme je fais actuellement pour casiopython)
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 23/08/2018 13:54 | #
Tu oublies que je commence tout juste : je ne sais pas faire ça moi...
Citer : Posté le 23/08/2018 13:55 | #
Naaaaon, la VM est bien plus simple que Cygwin :')
(et une VM Linux c'est pas comme une VM Windows 7 )
Citer : Posté le 23/08/2018 13:58 | #
Je ne dis pas que tu devrais utiliser gint, plutôt le contraire. Je répondais juste à Zezombye.
Je reste persuadé que le syscall marche très bien sous SH4 et je t'invite à essayer la version assembleur de l'appel, que Zezombye a posté dans le tuto GCC il y tout juste plus d'un quart d'heure, en ajustant les valeurs.