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 18/08/2018 16:57 | #
Effectivement le point-virgule était de trop
La compilation ne veut toujours pas à cause du return dans le void... je vire le return tout simplement ou c'est plus compliquer que cela
Ajouté le 18/08/2018 à 17:08 :
Le rapport me note une erreur ici :
void RTC_GetTime (uint *hours, uint *mins, uint *secs, uint *msecs)
a priori ce sont les * qui lui pose problème...
J'ai jeter un œil aux Sources de Fourmizzz pour constater que la fonction que Fourmizzz utilise colle plus à ce que je voudrais avoir... à savoir une heure qui tourne en permanence... Je sais que cela implique des risque comme un dérèglement dus à une reset ou a un autre add-in...
Ajouté le 18/08/2018 à 17:12 :
j'ai trouvé un bout de code issu de Fourmizzz dans le quel il créer un dossier et enregistre vraisemblablement le temps à l'intérieur :
if(!memory_exists("\\\\fls0\\FOURMIZ\\TEMPS.txt")){
creation[5] = 1;
memory_createfile("\\\\fls0\\FOURMIZ\\TEMPS.txt",datal[5]*sizeof(int));
// ponte - chasse - convoi - constru - labo - ressources+
for(i=0; i<datal[5]; i++)
data[5][i] = 0;
data[5][5] = temps_min()+30;
memory_save("\\\\fls0\\FOURMIZ\\TEMPS.txt",data[5],datal[5]*sizeof(int));
}
Ne pourrais-t-on pas faire comme cela aussi ?
Citer : Posté le 18/08/2018 17:15 | #
Mais ! Ce n'est pas un dossier, bien un fichier. La différence ne te parle pas ?
Tu peux faire comme ça, il utilise ma bibliothèque "memory" que Darks a linkée plus haut.
Citer : Posté le 18/08/2018 17:18 | #
buh... Je suis complément paumé... j'ai l'impression de ne rien savoir faire (ce qui est loin d'être une simple impression )... j'en peux puuuuuhuu
sinon j'ai trouvé la doc sur RTC_GetDateTime de SimLo :
https://bible.planet-casio.com/simlo/chm/v20/fxCG20_RTC.htm
Citer : Posté le 18/08/2018 17:21 | #
D'abord, tu t'es trompé de page, elle est ici celle que tu cherches
https://bible.planet-casio.com/simlo/chm/v20/fx_legacy_RTC.htm
Ensuite, le protocole est comme ça...
En cas de nouvelle partie
Tu recrées le fichier et tu enregistres dedans une durée de 0.
Quand tu joues normalement
Tu démarres ton add-in, tu mesures l'heure.
Quand tu quittes l'add-in, tu mesures l'heure et tu calcules combien de temps l'utilisateur a joué.
Tu ouvre le fichiers, tu y lis l'ancien temps de jeu. Tu y ajoutes le temps de jeu du jour.
Tu supprimes puis tu recrées le fichier. (*)
Tu y écris le nouveau temps de jeu.
(*) Obligatoire pour le modifier, c'est bizarre mais on va dire que c'est comme ça.
Citer : Posté le 18/08/2018 17:27 | #
Yup l'enchainement je l'ai à peu près ou du moins c'est clair...
je vais essayer de faire façon liste de course :
mesurer l'heure ? je ne connais pas la syntaxe de la fonction RTC_GetTime...
créer un fichier je sais faire.
determiner le temps de jeu c'est une simple soustraction
supprimer un fichier je ne sais pas faire
écrire le nouveau temps de jeu revient à enregistrer le nouveau temps.. donc c'est ok
Désolé Lephé je voulais dire la fonction RTC_DateTime depuis tout à l'heure, j'ai confondu les deux noms...
Citer : Posté le 18/08/2018 17:32 | #
Pourquoi la syntaxe ? Tous les fonctions s'appellent pareil, fonction(argument, argument, ...).
Ben c'est Bfile_CreateFile().
Ben oui, mais quand tu as deux dates avec 6 champs (année, mois, jour, heure, minute, second) ce n'est pas totalement trivial de compter combien il s'est écoulé de secondes entre les deux.
Bfile_DeleteFile().
Citer : Posté le 18/08/2018 17:33 | #
ok ok ok merci
j'ai retrouvé la doc de simlo sur la fonction qui m'intéresse
syscall 0x11E2: void RTC_GetDateTime( unsigned char timestr[ 8 ] );
Gets the RTC time.
timestr[0] and timestr[1]: year in BCD (f. i. 0x20 0x08)
timestr[2]: month in BCD (f. i. 0x03)
timestr[3]: day in BCD (f. i. 0x02)
timestr[4]: hour in BCD (f. i. 0x19)
timestr[5]: minute in BCD (f. i. 0x47)
timestr[6]: second in BCD (f. i. 0x03)
timestr[7]: day of week is set to zero.
BCD signifie quoi ?
Citer : Posté le 18/08/2018 17:39 | #
Ça signifie Binary Coded Decimal, et ça signifie que les nombres à plusieurs chiffres sont représentés avec 4 bits par chiffre.
Par exemple, si le nombre des secondes est 47, timestr[7] vaudra 0x47 soit 71. Si c'est 12, timestr[7] vaudra 0x12 soit 18. Il faut que tu penses à décoder.
Citer : Posté le 18/08/2018 17:45 | #
AH... Je ne sais pas décoder ça moi...
sachant que RTC_getDateTime est un void... comment je peux faire pour récupérer mes données ?
Là j'ai déclaré en global :"int annee=0,mois=0,jour=0,heure=0,minute=0,seconde=0;"
si je met un peu plus loin :
"RTC_GetDateTime(annee,mois,jour,heure,minute,seconde);"
ma variable année aura-t-elle la bonne valeur dans le main ou restera t-elle à 0 ?
Citer : Posté le 18/08/2018 17:51 | #
Non mais moi oui.
int dec = 10 * ((bcd >> 4) & 0xf) + (bcd & 0xf);
/* dec = 47 */
Bonne question. Je pense que tu devrais plutôt utiliser cette fonction-là :
{
SysCall(hours, mins, secs, msecs, 0x03a);
}
Tu vois les arguments de la fonction ? Ils ont un étoile à côté des noms. Ça veut dire que c'est des pointeurs. L'idée, c'est que toi tu vas créer des variables et tu vas dire à la fonction où tu les as mises dans la mémoire. Le pointeur sert à ça, il indique où est la variable dans la mémoire.
Ensuite la fonction, connaissant la position en mémoire de tes variables, va les remplir à ta place. Une fois la fonction appelée, tes variables auront pris la bonne valeur, toutes seules.
RTC_GetTime(&hours, &mins, &secs, &msecs);
/* hours = 17, mins = 50, secs = 47, msecs = 375 */
Le symbole & dit au compilateur « ce n'est pas la valeur de la variable qui m'intéresse, mais bien sa position en mémoire ». On dit aussi son adresse.
si je met un peu plus loin :
"RTC_GetDateTime(annee,mois,jour,heure,minute,seconde);"
ma variable année aura-t-elle la bonne valeur dans le main ou restera t-elle à 0 ?
Elle aura la bonne valeur !
De plus, il est très probable que RTC_GetTime() fasse la conversion de BCD à décimal pour toi, donc tu n'as pas à la faire. Tu peux oublier le code que j'ai mis au tout début de mon message.
Citer : Posté le 18/08/2018 17:57 | #
vérifions ma bonne compréhension...
{
SysCall(hours, mins, secs, msecs, 0x03a);
}
//ce code est à placer avant mon main()
uint hours, mins, secs, msecs;
RTC_GetTime(&hours, &mins, &secs, &msecs);
//celui-là permet de mesurer l'heure
C'est cela ?
Citer : Posté le 18/08/2018 18:04 | #
Exactement !
Citer : Posté le 18/08/2018 18:06 | #
je remplace les "uint" par "unsigned int" et hop
bon il reste encore une belle liste de bugs... mais ça avance
Merci beaucoup
Citer : Posté le 18/08/2018 18:06 | #
Oui, ou alors tu peux ajouter :
en haut de ton fichier pour déclarer l'alias.
Citer : Posté le 18/08/2018 18:08 | #
j'ai déjà tout remplacé j'ai essayé de déclarer mon dossier (mon fichier) en global mais j'ai l'impression que cela ne marche pas très bien
Ajouté le 18/08/2018 à 18:12 :
il me reste un petit problème :
fd=Bfile_OpenFile(PathName,_OPENMODE_WRITE);//1
Bfile_WriteFile(fd,&hours,&mins,&secs,&msecs,sizeof(hours+mins+secs+msecs));//2
Bfile_CloseFile(fd);//3
il me dit que le nombre de paramètres ne va pas sur la 2 comment je peux faire pour le sizeof ?
Citer : Posté le 18/08/2018 18:16 | #
Ouh là, ça ne va pas trop trop ça.
Dans Bfile_WriteFile(), tu dois indiquer une adresse de la mémoire, et une taille. Cela définit une région. La fonction enregistre dans le fichier les octets de la région, c'est-à-dire les taille octets qui sont situés à l'adresse indiquée.
Tu dois donc :
- Soit enregistrer une seule variable.
- Soit t'arranger pour que toutes les variables soient les unes à la suite des autres dans la mémoire.
Dans ton cas tu n'es pas supposé enregistre la date de création de ton Tamagotchi mais bien le temps qu'il a vécu, que tu peux compter en secondes. Donc tu ne devrais avoir à enregistre qu'un seul nombre entier.
Citer : Posté le 18/08/2018 18:18 | #
il faudrait donc tout convertir en secondes ou faire un tableau
Il faut aussi que je sache combien de temps c'est écoulé pour les "envies" de l'animal...
Ajouté le 18/08/2018 à 18:28 :
si je fais un tableau comment dois-je m'y prendre ?
j'arrive a ce code code qui est est entièrement buggé :
static int SysCallCode[] = { 0xD201422B, 0x60F20000, 0x80010070 };
static int (*SysCall)(int R4, int R5, int R6, int R7, int FNo ) = (void *)&SysCallCode;
void RTC_GetTime (unsigned int *time[0], unsigned int *time[1], unsigned int *time[2], unsigned int *time[3])
{
SysCall(time[0],time[1],time[2],time[3], 0x03a);
}
int eq=50,en=100,f=100,hu=100,hy=100,key=0,fd=0;
unsigned int hours, mins, secs, msecs;
unsigned int time[]={0,0,0,0};
int AddIn_main(int isAppli, unsigned short OptionNum)
{
FONTCHARACTER PathName[]={'\\','\\','f','l','s','0','\\','t','e','m','p','s','.','e','x','t',0};
BFile_CreateFile(PathName, 1000);
RTC_GetTime(&time[0],&time[1],&time[2],&time[3]);
fd=Bfile_OpenFile(PathName,_OPENMODE_WRITE);
Bfile_WriteFile(fd,&time[0],&time[1],&time[2],&time[3],sizeof(4));
Bfile_CloseFile(fd);
return 1;
}
Citer : Posté le 18/08/2018 18:35 | #
Je pense que le tableau n'est pas ce dont tu as besoin. Voilà tout de même le code :
static int (*SysCall)(int R4, int R5, int R6, int R7, int FNo ) = (void *)&SysCallCode;
void RTC_GetTime (unsigned *hours, unsigned *mins, unsigned *secs, unsigned *msecs)
{
SysCall(hours, mins, secs, msecs, 0x03a);
}
int eq=50,en=100,f=100,hu=100,hy=100,key=0,fd=0;
int AddIn_main(int isAppli, unsigned short OptionNum)
{
unsigned int hours, mins, secs, msecs;
RTC_GetTime(&hours, &mins, &secs, &msecs);
unsigned int time[4]={ hours, mins, secs, msecs };
FONTCHARACTER PathName[]={'\\','\\','f','l','s','0','\\','t','e','m','p','s','.','e','x','t',0};
BFile_CreateFile(PathName, 1000);
fd=Bfile_OpenFile(PathName, _OPENMODE_WRITE);
Bfile_WriteFile(fd, &time, sizeof(time));
Bfile_CloseFile(fd);
return 1;
}
Citer : Posté le 18/08/2018 18:41 | #
merci beaucoup
Ajouté le 18/08/2018 à 20:17 :
Il reste deux erreurs :
Une ici :
et l'autre là :
Ce sont les deux dernières erreurs de ce bout de code
Citer : Posté le 18/08/2018 20:21 | #
time[0] = hours;
time[1] = mins;
time[2] = secs;
time[3] = msecs;
Citer : Posté le 18/08/2018 20:30 | #
Je checke ça demain ou après demain
pour le tableau c'est nickel merci
Ajouté le 19/08/2018 à 16:34 :
Les deux erreurs précédentes ont été réglée au profit d'une troisième : une L2310(E) Undefined external symbol "_BFile_CreateFile" referenced in "C:\user\..."
Si j'ai bine compris il s'agit d'une fonction non-déclarée (ici BFile_CreateFile) mais comment je peux faire pour la déclarer ?