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 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.
Citer : Posté le 23/08/2018 13:59 | #
je vais essayé le code de Zz mais j'ai pas tout compris :
En gros je créer un fichier source genre syscall.c et dedans je met :
.export _monSyscall
_monSyscall:
mov.l syscall_table, r2
mov.l monSyscall_code, r0
jmp @r2
nop
monSyscall_code:
.data.l H'03A
syscall_table:
.data.l H'80010070
.end
Citer : Posté le 23/08/2018 14:04 | #
C'est ça, tu remplaces _monSyscall par le nom de ta fonction avec un _, par exemple _RTC_GetTime. Il faut le faire à deux (trois) endroits. Le numéro du syscall (H'03A) est déjà juste.
Citer : Posté le 23/08/2018 14:06 | #
Je sais que le numéro est juste : je l'ai modifié
et ensuite j'inclus le *.c comme un *.h dans mon projet ?
Il faut que je vire la déclaration de RTC_GetTime qui l'appelle du coup , non ?
Citer : Posté le 23/08/2018 14:13 | #
syscall.src de préférence.
Citer : Posté le 23/08/2018 14:14 | #
J'obtient donc ce code :
.export _RTC_GetTime
_RTC_GetTime:
mov.l syscall_table, r2
mov.l monSyscall_code, r0
jmp @r2
nop
_RTC_GetTime_code:
.data.l H'03A
syscall_table:
.data.l H'80010070
.end
Ok il est en *.src
Citer : Posté le 23/08/2018 14:15 | #
Non, non, et non ! Non. Juste non. On n'inclue JAMAIS au grand jamais un .c ! Tu ajoutes le .src à la liste des fichiers sources (comme MonochromeLib par exemple), tu définis un prototype dans un .h, et tu inclue le .h.
Citer : Posté le 23/08/2018 14:16 | #
Ah ok... et comment je fais le prototype de ce *.src ?
Citer : Posté le 23/08/2018 14:16 | #
My bad, c'était deux (quatre) occurrences. Tu as laissé un monSyscall_code qui devrait être identique au _RTC_GetTime_code plus bas.
Le code assembleur va dans des fichiers .src (ou .s sous Linux) et se comporte comme un fichier .c. Tu ne l'inclus pas... !
Citer : Posté le 23/08/2018 14:17 | #
Comme un .h normal.
void RTC_GetTime(int* a, int* b, int* c, int*d);
Citer : Posté le 23/08/2018 14:18 | #
Celui en face mov.1 ....,r0 ?
Citer : Posté le 23/08/2018 14:20 | #
Oui, celui en face de mov.l ..., r0.
Citer : Posté le 23/08/2018 14:20 | #
Fait !!
Ajouté le 23/08/2018 à 14:34 :
Donc j'ai un fichier syscall.src qui contient
.export _RTC_GetTime
_RTC_GetTime:
mov.l syscall_table, r2
mov.l RTC_GetTime_code, r0
jmp @r2
nop
_RTC_GetTime_code:
.data.l H'03A
syscall_table:
.data.l H'80010070
.end
(mon fichier .src ne contient rien d'autre que ce qui est là, rien du tout c'est bon ?)
Et mon fichier syscall.h qui ne contient que :
#ifndef syscall_h
#define syscall_h
void RTC_GetTime(unsigned int*hours,unsigned int*mins,unsigned int*secs,unsigned int*msecs);
#endif
J'ajoute le *.src comme un .c et le .h comme les autres en l'incluant en haut de mon code mère... Et c'est tout ?
Citer : Posté le 23/08/2018 14:44 | #
C'est tout. Il manque un underscore à mov.l RTC_GetTime_code, r0 toutefois.
Citer : Posté le 23/08/2018 14:46 | #
Ah c'est pour cela que cela ne marche... merci
Ajouté le 23/08/2018 à 14:57 :
Ah non ça ne vient pas que de là : la compilation ne fonctionne pas à cause d'erreurs dans le fichier syscall.src... Le rapport me dit que j'en ai une à chaque ligne...
"ILLEGAL SYMBAL OR SECTION NAME" sur les lignes 1, 4, 5, 9, 12 et 14
"ILLEGAL MNEMONIC" sur les lignes 1, 4, 5, 6, 9, et 12
".END NOT FOUND" sur la 14
Citer : Posté le 23/08/2018 15:00 | #
Toutes les lignes qui ne comportent pas un : doivent commencer par une espace ou une tabulation.
Citer : Posté le 23/08/2018 15:02 | #
soit l'un soir l'autre ?
Citer : Posté le 23/08/2018 15:02 | #
Yup, ou plusieurs même.
Citer : Posté le 23/08/2018 15:04 | #
Nickel c'est bon : la compilation marche...
maintenant voyons le on calc...
Ajouté le 24/08/2018 à 11:00 :
Je viens de me rendre compte qu'il faudrait que le programme connaisse le jour : imaginons que le joueur éteigne le Tamagotchi à 18h00 le samedi et le reprenne à 17h00 le dimanche... le code va penser qu'il s'est écoulé -1 heures... alors qu'il y en eu 25 il faudrait donc prendre la fonction RTC_GetDateTime
Ce qui implique deux problèmes : le BCD Lephe m'avait filé un code pour décoder :
int bcd = 0x47;
int dec = 10 * ((bcd >> 4) & 0xf) + (bcd & 0xf);
/* dec = 47 */
Comment fonctionne-t-il et cela suffit-il pour tout décoder ou faudra-t-il que je pense à le mettre plusieurs fois pour chaque données ?
Et l'autre problème RTC_GetDateTime est un void et le tableau n'est pas un pointeur... Donc comment puis-je faire pour récupérer mes données ?
Citer : Posté le 24/08/2018 11:35 | #
Ce serait bien mais il n'y a pas de syscall de ce genre d'après SimLo. Ce qui te laisse effectivement comme seule possibilité d'utiliser directement la RTC.
Pour ça tu peux récupérer directement le code approprié dans gint, ce sera plus simple... il y a des fonctions toutes faites qui te renvoient des structures. Par contre tu es sur le SDK si je ne me trompe pas ?
Citer : Posté le 24/08/2018 11:39 | #
C'est cela : je suis sur le SDK Et si le syscall RTC_GetDateTime existe : ici