Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Refonte de CalcCity
Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Refonte de CalcCity

Posté le 10/10/2021 10:55

Hey o/

Il y a quelques années, j'étais tombé sur CalcCity, de Menno, un jeu de gestion de ville façon Sim's City. J'avais été très séduit par le jeu, mais il restait quelques problèmes notamment des crash de la calto (plus le programme en Anglais )

J'avais voulu refondre le code pour avoir un truc plus propre, mais j'avais pas le niveau et le code était vraiment horrible. Et puis, ces derniers temps, j'ai eu envie de faire un jeu de gestion façon Sim's City… et je me suis dit que nettoyer CalcCity et le porter pour Gint, pouvait être une bonne idée (le programme final serait posté sur la page du jeu d'origine).

Je promet pas d'avancer vite, mais je pense le faire tranquillement. (Faut déjà que j'arrive à comprendre le code )


Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Citer : Posté le 20/06/2022 15:33 | #


Ah x)
Merci de ta réponse je vais regarder ça
C'est quoi un "world switch" ? ^^'
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Lephenixnoir Hors ligne Administrateur Points: 24235 Défis: 170 Message

Citer : Posté le 20/06/2022 15:35 | #


Un world switch c'est quand tu sors temporairement de gint. On ne peut pas utiliser le système de fichiers en même temps que gint est actif parce que ça fait conflit sur l'usage du matériel. Voilà comment ça marche :

#include <gint/gint.h>

void une_fonction(<arguments>)
{
   ...
}

// comme [une_fonction(<les arguments>)] mais lance la fonction hors de gint
gint_world_switch(GINT_CALL(une_fontion, <les arguments>));

Il y a quelques restrictions sur le nombre et type des arguments, mais on pourra voir ça plus tard.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Mb88 Hors ligne Labélisateur Points: 944 Défis: 3 Message
Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Citer : Posté le 20/06/2022 18:56 | # | Fichier joint


Il me reste encore la sauvegarde à gérer, mais si tu veux t'amuser (sans aucune sauvegarde donc) je te met l'exécutable en fichier joint.
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Mb88 Hors ligne Labélisateur Points: 944 Défis: 3 Message

Citer : Posté le 20/06/2022 18:57 | #


Merci ! Je vais tester et te dire si il y a des bugs :-).
Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Citer : Posté le 20/06/2022 19:09 | #


Merci !
En truc notable pas géré, il y a la rotation des aéroports. L'orientation des ports est automatique. Je suis en train de réfléchir à d'autres trucs qu'il me resterait à gérer, mais je ne vois pas… peut-être surveiller que les ports restent à proximité de l'eau ou ajuster les évènements aléatoires… Et la sauvegarde of course
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Mb88 Hors ligne Labélisateur Points: 944 Défis: 3 Message
Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Citer : Posté le 20/06/2022 20:18 | #


Ah nan mais c'est trivial te prend pas la tête xD En fait, dans le jeu, l'aéroport est un bâtiment qui prend 1 case par 2, mais parfois c'est pratique de le mettre dans l'autre sens pour avoir 2 cases par 1 voila ça je gère pas xD J'ai tous les dessins pour le faire, faut juste que je le programme.
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Mb88 Hors ligne Labélisateur Points: 944 Défis: 3 Message

Citer : Posté le 20/06/2022 20:21 | #


Ah ! Ok !
Je viens de commencer à jouer, et j'ai tout de suite remarqué que tu avais laissé la page de titre comme sur l'original.
Au début, j'ai eu un peu de mal à comprendre ce qu'il y avait dans les menus, et combien d'argent il me reste.
Sinon il marche très bien et est très fluide.
Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Citer : Posté le 20/06/2022 20:24 | #


C'est une refonte de l'original, j'ai pas du tout toucher aux dessins ni rien, juste revu complètement le code pour le rendre plus moderne et rapide. L'argent restant, je peux l'afficher sur la page principale, après le contenu des menus j'ai pas tout communiqué dessus donc normal d'être un peu perdu. Je ferais une petite doc digne de ce nom au moment de la sortie "officielle"
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Citer : Posté le 21/06/2022 08:31 | #


Hey je suis de retour avec quelques questions
Déjà je pensais laisser le world switch un peu de côté, il ne servira que pour les appels aux fonctions de sauvegardes, donc si j'ai bien compris, c'est pas la peine de me prendre la tête avec ça tant que je ne m'occupe que des fonctions de sauvegardes en elles-mêmes.

Pour l'instant j'ai deux fonctions read_save et write_save, j'ai attaqué read_save en premier… La fonction ressemble à ça :
void read_save(struct calccity *calccity, struct camera *camera, struct map *map)
{
    FILE *fp;
    fp = fopen(filename, "r");

    if (fp == NULL)
        default_values(calccity, camera, map);
    else
    {

    }

    fclose(fp);
}

Dans le else il faut donc récupérer le contenu de la sauvegarde existante, mais j'ai pas compris comment fonctionne fgetc, ça ne renvoie qu'un seul caractère du fichier à chaque appel ? Y a-t-il moyen de lire des "blocs" d'une taille donnée pour récupérer les structures ? Faut-il envisager une méta-structure qui contiendrait toutes les autres pour la sauvegarde ?

Merci d'avance
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Lephenixnoir Hors ligne Administrateur Points: 24235 Défis: 170 Message

Citer : Posté le 21/06/2022 09:16 | #


Déjà je pensais laisser le world switch un peu de côté, il ne servira que pour les appels aux fonctions de sauvegardes, donc si j'ai bien compris, c'est pas la peine de me prendre la tête avec ça tant que je ne m'occupe que des fonctions de sauvegardes en elles-mêmes.

Correct.

Ton code est très bien. En effet, fgetc() ne renvoie qu'un caractère, ce qui est pas très pratique. Si tu veux lire une structure, tu peux le faire directement avec fread():

void read_save(struct calccity *calccity, struct camera *camera, struct map *map)
{
    FILE *fp;
    fp = fopen(filename, "r");

    if (fp == NULL)
        default_values(calccity, camera, map);
    else
    {
        int count = fread(calccity, 1, sizeof *calccity, fp);
        if(count != 1)
        {
            /* La lecture a échoué */
        }
    }

    fclose(fp);
}

fread() suppose que tu veux lire un tableau ; le deuxième paramètre est le nombre d'éléments à lire, le troisième est la taille d'un élément. fread() renvoie le nombre d'éléments qui ont été entièrement lus. Ici j'ai chargé une seule struct calccity donc le deuxième paramètre vaut 1. Tu peux continuer comme ça avec d'autres structures.

Note que lire/écrire des structures dans des fichiers comme ça ça ne marche que si les structures ne contiennent pas de pointeur. C'est le cas ici, mais ça ne marcherait pas avec struct building par exemple
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Mb88 Hors ligne Labélisateur Points: 944 Défis: 3 Message

Citer : Posté le 21/06/2022 10:46 | #


J'ai remarqué quelque chose de bizarre :
J'avais passé les taxes de 5% à 20%
J'avais baissé les dépenses (de 100% à 5%)
Le bonheur est passé de 4 à 11 !
Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Citer : Posté le 21/06/2022 11:01 | #


Lephé' : Merci je vois ! Et ensuite je peux enchaîner les fread si j'ai plusieurs structures dans le fichier ? Et si j'ai des pointeurs ? (typiquement, dans struct map j'ai deux "matrices" de 50 par 50 à stocker… ^^'

Mb88 : Oui moins il y a de taxes, plus les gens sont heureux

Edit : Après relecture de mon code toute les structures contiennent des pointeurs ^^' (voir le header avec les structures)
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Mb88 Hors ligne Labélisateur Points: 944 Défis: 3 Message

Citer : Posté le 21/06/2022 17:39 | #


Shadow15510 a écrit :
Mb88 : Oui moins il y a de taxes, plus les gens sont heureux

Oui mais là c'était l'inverse : j'ai augmenté les taxes.
Edit : Sinon, il y a une nouvelle version ?
Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Citer : Posté le 21/06/2022 17:43 | #


Ah ok, je reverrais mes calculs alors, merci du retour
Nop aujourd'hui j'ai été un peu pris ailleurs… ^^'
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Citer : Posté le 21/06/2022 18:33 | #


J'ai re-regardé mon code, de quelle taxe s'agissait-il ? Parce que toutes les taxes n'influent pas sur le bonheur, donc les deux évolutions ne sont peut-être pas corrélées en fait.
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Citer : Posté le 23/06/2022 09:39 | #


Voila, j'ai trois structure à sauvegarder dans un fichier, pour la structure camera il n'y a pas de pointeurs donc ça devrait aller (j'ai un seul pointeur en fait, mais je comprends comment fonctionne les autres structures ça ne devrait pas poser de problème…)

Pour les structures calccity et map je n'ai que des listes voir des tableaux et j'arrive pas à me dépêtrer avec ça x)

J'étais plutôt parti pour écrire la fonction de lecture de la sauvegarde en premier et je ne suis pas encore fixé sur l'ordre dans lequel les structures seront stockées, mais pour l'instant j'ai cette fonction :

void read_save(struct calccity *calccity, struct camera *camera, struct map *map)
{
    FILE *fp;
    fp = fopen(filename, "r");

    // If the backup doesn't exist
    if (fp == NULL)
        default_values(calccity, camera, map);
    else
    {
        fread(camera, 1, sizeof *camera, fp);
    }

    fclose(fp);
}

Ce qui permet donc de lire la structure camera dans l'hypothèse où elle ne contient de pas de pointeurs.


Toutes les structures sont définies ici : https://gitea.planet-casio.com/Shadow15510/CalcCity/src/branch/dev/src/calccity.h
Et j'aimerais réussir à lire les deux autres strucutres ^^' qui elles contiennent des pointeurs…

Merci d'avance
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Citer : Posté le 23/06/2022 10:41 | #


Pour Tituya qui voulais savoir comment ça fonctionne, le code que j'ai envoyé juste au dessus est correct en fait.
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Citer : Posté le 23/06/2022 14:28 | # | Fichier joint


Première version complète en fichier joint.
Il ne reste que les aéroports à faire tourner, mais c'est pas très important. La sauvegarde est fonctionnelle (merci Lephé' xD) et toutes les mécaniques du jeu d'origine sont présentes.
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Mb88 Hors ligne Labélisateur Points: 944 Défis: 3 Message

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 118 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd