About AGS "memory"

Started by Baguettator, Mon 31/01/2022 13:13:29

Previous topic - Next topic

Baguettator

Hi there !

I wonder how many data can be stored in an AGS game.

In my game, I stock the data for maps that are displayed in-game (it simulates a tabletop game). All the maps have many data, including tokens' x/y/orientation, tiles' positions, etc... often randomized between several possibilities. Currently the game owns about 200 different maps, and I plan to add more and more. The maps are managed within a structure.

As it represents a HUGE amount of data, and because you can imagine easily that the game also manages characters (about 150), GUIS (about 100), other scripts etc... Here's my question :

Is there a limit when the engine is lagging because of too many data stored, or simply can't memorize more data because of limitation ?

Sorry if my question is a bit "noob-style", but I don't know anything about these things... :(

Here is my structure for the maps, to let you see how "huge" it is :

Code: ags
struct Cartes
{
  String titre, histoire, dallesrequises;
  bool sansegout, sanslitbleu, sanslitvert; // vaut true si un de ces types de cartes ne doit pas être mis dans la carte
  int deckzombie[3]; // Les types de zombies qui vont être découverts grâce à l'exploration et donc confirmés
  int nbdalles;
  int hauteur, largeur;
  int x, y; // Permet de connaître le coin haut-gauche de la carte entière
  int dalles[14]; // stocke le "nom" de chaque dalle
  int orientationdalles[14]; // stocke l'orientation de chaque dalle
  int spritedalles[14]; // stocke la sprite de chaque dalle
  int xdalles[14], ydalles[14]; // coordonnées des dalles pour placement de la carte
  bool dallesplacementmanuel[14];
  bool zonesanspionzomb[50];
  int categorie; // stocke les cartes en fonction des boîtes nécessaires
  int nbzonesinvalea; // NECESSAIRE ?
  int tentesalea[11]; // Pour savoir si les tentes sont aléatoires ou non (dans TTS, avec la String)
  bool dallesansobjectif[14]; // Place des pions fouilles sans placer d'objectifs dans les zones de la dalle
  bool dallesansradio[14]; // Ne place pas de pions radio sur cette dalle
  int distance; // indique la distance de la carte par rapport à la colonie, influence le temps de déplacement et la durée de l'exploration
  int niveaudanger; // le niveau de danger de la carte
  
  int nbpionsamasquer;
  Button *pionsamasquer[50]; // Pointeurs vers les boutons qu'il faut masquer pour une raison ou une autre
  
  int spriteprecedente; // Mémorise la carte précédente pour les campagnes avec histoire adaptée
  bool queteenchainee; // Mémorise si ce scénario s'enchaîne, dans le cadre d'une mini-quête
  int objectifvert, objectifbleu, objectifjaune, objectifblanc, objectifviolet, objectifrose, objectifatrouver; // vaut 1 si un obj de couleur est caché
  
  int nbzonebatiment; // compte le nb de zones de bâtiment de la carte
  int xzonebatiment[100], yzonebatiment[100], typezonebatiment[100]; // Stocke toutes les zones de bâtiment de la carte
  int nbpionsfouille;
  int xpionsfouille[100], ypionsfouille[100], typepionsfouille[100];
  int nbobjectifs;
  int zonesobjectifs[100]; // indique pour chaque zone du batiment à quel objectif cela peut correspondre
  int changementtypesalle[30]; // Permet de changer le type de salle du pion objectif (PAS du pion fouille situé dessous !)
  int nbobjectifsmanuel;
  int indexobjectifsmanuel[50]; // on leur donne la valeur de l'objectif pour attribuer les infos ci-dessous à cet objectif
  int xobjectifsmanuel[50], yobjectifsmanuel[50]; // on stocke les infos pour des objectifs placés manuellement
  int xobjectifseul[30], yobjectifseul[30]; // coordonnées des objectifs placés seuls
  int nbobjectifscouleur;
  int xobjectifscouleur[10], yobjectifscouleur[10], couleurobjectifscouleur[10];
  int sansobjvert[50], sansobjbleu[50], sansobjviolet[50], sansobjjaune[50], sansobjblanc[50], sansobjrose[50]; // si vaut 1, l'objectif de couleur sera pas trouvé dans le pion fouille concerné
  int xobjectifspecial, yobjectifspecial; // coordonnées de l'objectifspecial
  int nbpionsdeclencheurs;
  int xpionsdeclencheurs[20], ypionsdeclencheurs[20];
  int nbinvasion;
  int xinvasion[10], yinvasion[10], sensinvasion[10];
  int nbinvasioncouleur;
  int xinvasioncouleur[10], yinvasioncouleur[10], couleurinvasion[10], sensinvasioncouleur[10];
  int nbinvasionfixe;
  int xinvasionfixe[10], yinvasionfixe[10], sensinvasionfixe[10];
  int nbinvasionalea;
  int xinvalea[100], yinvalea[100], sensinvalea[100];
  int nbexit;
  int xexit[30], yexit[30], sensexit[30];
  int nbdepart;
  int xdepart[30], ydepart[30];
  int nbvoitures; // Compte le nombre de voitures qui peuvent apparaître dans la carte
  int nbvoiture1, probavoiture1, indexvoiture1; // Index=index du véhicule si découvert en exploration. Vaut -1 si aléatoire. Le véhicule indexé de cette manière est transporté en room 11 avec son jumeau, tant que la mission n'est pas jouée
  int xvoiture1[10], yvoiture1[10], sensvoiture1[10]; 
  int nbvoiture2, probavoiture2, indexvoiture2;
  int xvoiture2[10], yvoiture2[10], sensvoiture2[10];
  int nbvoiture3, probavoiture3, indexvoiture3;
  int xvoiture3[10], yvoiture3[10], sensvoiture3[10];
  int nbvoiture4, probavoiture4, indexvoiture4;
  int xvoiture4[10], yvoiture4[10], sensvoiture4[10];
  int nbhelicoheliport, probahelicoheliport, indexhelicoheliport; // Index=idem que pour les voitures, mais pour l'hélico
  int xhelicoheliport[10], yhelicoheliport[10];
  int nbhelicorue, probahelicorue, indexhelicorue;
  int xhelicorue[10], yhelicorue[10];
  int nbvehiculespec;
  int xvehiculespec[5], yvehiculespec[5], sensvehiculespec[5], spritevehiculespec[5];
  int zoneexpcount; // compte les zones extérieures (rues)
  int typezoneexp[100], xzoneexp[100], yzoneexp[100]; // tableaux pour les zones extérieures (rue)
  int nbdecombres;
  int xdecombres[8], ydecombres[8], couleurdecombres[8], sensdecombres[8], tailledecombres[8]; // taille : 0 petit, 1 grand
  int nbportes;
  int xportes[50], yportes[50], couleurportes[50], sensportes[50], ouvertureporte[50]; // ouverture : 0 fermée, 1 ouverte
  bool portesinversees[50]; // vaut true si le pion porte correspondant doit être inversé
  int nbmirador;
  int xmirador[5], ymirador[5], sensmirador[5];
  int nbbarricades;
  int xbarricades[5], ybarricades[5], sensbarricades[5], ouverturebarricades[5];
  int nbsallecachee;
  int xsallecachee[5], ysallecachee[5], senssallecachee[5];
  int xsas, ysas, senssas, facesas; // SAS ROTATIF, face sas : 1 droit, 2 angle
  int xechelle, yechelle, sensechelle;
  int nbbarbeles;
  int xbarbeles[5], ybarbeles[5], sensbarbeles[5];
  int nbpionpersos;
  int xpionpersos[5], ypionpersos[5];
  int nbinterrupteurjaune;
  int xinterrupteurjaune[5], yinterrupteurjaune[5], sensinterrupteurjaune[5], lienbatimentinterrupteurjaune[5]; // indique si le bâtiment révèle un interrupteur
  int nbinterrupteurblanc;
  int xinterrupteurblanc[5], yinterrupteurblanc[5], sensinterrupteurblanc[5], lienbatimentinterrupteurblanc[5];
  int nbinterrupteurviolet;
  int xinterrupteurviolet[5], yinterrupteurviolet[5], sensinterrupteurviolet[5], lienbatimentinterrupteurviolet[5];
  int nbpionapparitions;
  int xpionapparitions[10], ypionapparitions[10], numeropionapparition[10];
  int nbindicateursinv;
  int xindicateursinv[10], yindicateursinv[10], numeroindicateursinv[10];
  int nbpiondepartsurv;
  int xpiondepartsurv[20], ypiondepartsurv[20];
  int nbpiondepartsurvsiege;
  int xpiondepartsurvsiege[50], ypiondepartsurvsiege[50];
  int nbpionzomb;
  int xpionzomb[50], ypionzomb[50];
  // TENTES
  int nbtentes;
  int xtentes[15], ytentes[15], senstentes[15], spritetentes[15];
  // Batiments
  // Batiments de 0 à 13, interrupteurs sont stockés en 14 (blanc), 15 (jaune) et 16 (violet)
  int xouvbat[17], youvbat[17]; // coordonnées des pions ouverture bâtiment
  int lieninterrupteurjaune[17], lieninterrupteurblanc[17], lieninterrupteurviolet[17]; // Vaut 1 si l'interrupteur est géré par le bâtiment
  int lienobjectifspec[17], lienobjectifbleu[17], lienobjectifvert[17], lienobjectifjaune[17], lienobjectifblanc[17], lienobjectifviolet[17], lienobjectifrose[17]; // idem pour objectifs couleur
  Button *lienvehicule1[17]; // idem pour un véhicule
  int zonesbatiment[100]; // indique pour chaque zone de bâtiments à quel bâtiment ça correspond
  int zonesinterrupteurjaune[100], zonesinterrupteurviolet[100], zonesinterrupteurblanc[100]; // idem pour les interrupteurs. Vaut 1 si cette zone est attribuée à l'interrupteur
  bool generationbatimentmanuelle[100]; // si vaut true, on génère dans ce bâtiment dès le début de l'expédition
  
  // MARQUEURS POUR L'EXPLORATION
  // Si >1 ou = à la valeur maximale de la carte, tout a été trouvé
  int exit, pionsobjectif, vehicules, typeszombie, danger;
  
  import void PresentationExp();
  import void StringTTS();
  
  import void Invasionaleatoire();
  
  import void PlacementPionZombies();
  import void ZonesExpedition();
  import void ZonesBatiment();
  
  import void CreationCartes(int sprite);
  import function T(int d, int p);
  import function X(int d, int p);
  import function Y(int d, int p);
  import void Reset();
  import void OrientationDalles(sens s0, sens s1=-1, sens s2=-1, sens s3=-1, sens s4=-1, sens s5=-1, sens s6=-1, sens s7=-1, sens s8=-1, sens s9=-1, sens s10=-1, sens s11=-1, sens s12=-1, sens s13=-1);
  import void Composition(NumDalles d1, NumDalles d2=-1, NumDalles d3=-1, NumDalles d4=-1, NumDalles d5=-1, NumDalles d6=-1, NumDalles d7=-1, NumDalles d8=-1, NumDalles d9=-1, NumDalles d10=-1, NumDalles d11=-1, NumDalles d12=-1, NumDalles d13=-1, NumDalles d14=-1);
  import void PortesCouleursOuvertesManuel(int d1, int x1, int y1, couleur c1, sens s1, int d2=-1, int x2=-1, int y2=-1, couleur c2=-1, sens s2=-1);
  import void PionDepartSurv(int n1, int n2=-1, int n3=-1, int n4=-1, int n5=-1, int n6=-1, int n7=-1, int n8=-1, int n9=-1, int n10=-1);
  import void IndicateursInvasionS3Manuel(int numero1, int d1, int x1, int y1, int numero2=-1, int d2=-1, int x2=-1, int y2=-1, int numero3=-1, int d3=-1, int x3=-1, int y3=-1);
  import void ChangementTypesSalles(int n1, types t1, int n2=-1, types t2=-1, int n3=-1, types t3=-1, int n4=-1, types t4=-1, int n5=-1, types t5=-1, int n6=-1, types t6=-1, int n7=-1, types t7=-1);
  import void DecombresPetitsManuel(int d1, int x1, int y1, couleur c1, sens s1, int d2=-1, int x2=-1, int y2=-1, couleur c2=-1, sens s2=-1);
  import void DecombresGrandsManuel(int d1, int x1, int y1, couleur c1, sens s1, int d2=-1, int x2=-1, int y2=-1, couleur c2=-1, sens s2=-1);
  import void PortesMallFermees(int d1, int n1, int d2=-1, int n2=-1, int d3=-1, int n3=-1, int d4=-1, int n4=-1, int d5=-1, int n5=-1, int d6=-1, int n6=-1, int d7=-1, int n7=-1);
  import void DoublePorteMallFermee(int d1, int n1, couleur c1, int d2=-1, int n2=-1, couleur c2=-1, int d3=-1, int n3=-1, couleur c3=-1);
  import void DoublePorteMallOuverte(int d1, int n1, couleur c1, int d2=-1, int n2=-1, couleur c2=-1, int d3=-1, int n3=-1, couleur c3=-1);
  import void TentesAlea(int t0=-1, int t1=-1, int t2=-1, int t3=-1, int t4=-1, int t5=-1, int t6=-1, int t7=-1, int t8=-1, int t9=-1, int t10=-1);
  import void ZoneSansPionZomb(int n1, int n2=-1, int n3=-1, int n4=-1, int n5=-1, int n6=-1, int n7=-1, int n8=-1, int n9=-1, int n10=-1, int n11=-1, int n12=-1, int n13=-1, int n14=-1);
  import void ZoneSansObjCouleur(couleur c, int n1, int n2=-1, int n3=-1, int n4=-1, int n5=-1, int n6=-1, int n7=-1, int n8=-1, int n9=-1, int n10=-1, int n11=-1, int n12=-1, int n13=-1);
  import void PionsFouillesSemiManuel(int d1, int n1, int d2=-1, int n2=-1, int d3=-1, int n3=-1, int d4=-1, int n4=-1, int d5=-1, int n5=-1, int d6=-1, int n6=-1, int d7=-1, int n7=-1);
  import void PionsFouillesVidesSemiManuel(int d1, int n1, int d2=-1, int n2=-1, int d3=-1, int n3=-1, int d4=-1, int n4=-1, int d5=-1, int n5=-1, int d6=-1, int n6=-1, int d7=-1, int n7=-1);
  import void PionsFouillesVidesManuel(int d1, int x1, int y1, int d2=-1, int x2=-1, int y2=-1, int d3=-1, int x3=-1, int y3=-1, int d4=-1, int x4=-1, int y4=-1);
  import void PionsFouillesManuel(int d1, types t1, int x1, int y1, int d2=-1, types t2=-1, int x2=-1, int y2=-1, int d3=-1, types t3=-1, int x3=-1, int y3=-1);
  import void DallePlacementManuel(int d1, int d2=-1, int d3=-1, int d4=-1, int d5=-1, int d6=-1, int d7=-1, int d8=-1, int d9=-1, int d10=-1, int d11=-1, int d12=-1, int d13=-1, int d14=-1);
  import void DalleSansObjectifs(int d1, int d2=-1, int d3=-1, int d4=-1, int d5=-1, int d6=-1, int d7=-1, int d8=-1, int d9=-1, int d10=-1, int d11=-1, int d12=-1, int d13=-1, int d14=-1);
  import void PortesPrisonFermeesManuel(int d1, int x1, int y1, couleur c1, sens s1, int d2=-1, int x2=-1, int y2=-1, couleur c2=-1, sens s2=-1);
  import void PortesPrisonOuvertesManuel(int d1, int x1, int y1, couleur c1, sens s1, int d2=-1, int x2=-1, int y2=-1, couleur c2=-1, sens s2=-1);
  import void PortesStandardsFermeesManuel(int d1, int x1, int y1, sens s1, int d2=-1, int x2=-1, int y2=-1, sens s2=-1, int d3=-1, int x3=-1, int y3=-1, sens s3=-1);
  import void PortesStandardsOuvertesManuel(int d1, int x1, int y1, sens s1, int d2=-1, int x2=-1, int y2=-1, sens s2=-1, int d3=-1, int x3=-1, int y3=-1, sens s3=-1);
  import void CellulesBlancFermeesManuel(int d1, int x1, int y1, sens s1, int d2=-1, int x2=-1, int y2=-1, sens s2=-1, int d3=-1, int x3=-1, int y3=-1, sens s3=-1);
  import void CellulesVioletFermeesManuel(int d1, int x1, int y1, sens s1, int d2=-1, int x2=-1, int y2=-1, sens s2=-1, int d3=-1, int x3=-1, int y3=-1, sens s3=-1);
  import void PionExitManuel(int d1, int x1, int y1, sens s1, int d2=-1, int x2=-1, int y2=-1, sens s2=-1, int d3=-1, int x3=-1, int y3=-1, sens s3=-1);
  import void SalleCachee(int d1, int x1, int y1, sens s1, int obj1, int d2=-1, int x2=-1, int y2=-1, sens s2=-1, int obj2=-1);
  import void PionDepart(int n1, sens s1, int n2=-1, sens s2=-1, int n3=-1, sens s3=-1, int n4=-1, sens s4=-1, int n5=-1, sens s5=-1, int n6=-1, sens s6=-1, int n7=-1, sens s7=-1);
  import void PlacementBarricades(int d1, int x1, int y1, int ouverture1, sens s1, int d2=-1, int x2=-1, int y2=-1, int ouverture2=-1, sens s2=-1);
  import void PortesCouleursFermeesManuel(int d1, int x1, int y1, couleur c1, sens s1, int d2=-1, int x2=-1, int y2=-1, couleur c2=-1, sens s2=-1);
  import void Tentes(int sprite1, int d1, int n1, sens s1, int sprite2=-1, int d2=-1, int n2=-1, sens s2=-1, int sprite3=-1, int d3=-1, int n3=-1, sens s3=-1);
  import function IndicateursInvasionS3(int zone, int numero1, int numero2=-1, int numero3=-1, int numero4=-1, int numero5=-1, int numero6=-1);
  import void ObjectifsCouleur(int d1, int x1, int y1, couleur c1, int d2=-1, int x2=-1, int y2=-1, couleur c2=-1, int d3=-1, int x3=-1, int y3=-1, couleur c3=-1);
  import void InverserPortes(int p1, int p2=-1, int p3=-1, int p4=-1, int p5=-1, int p6=-1, int p7=-1, int p8=-1, int p9=-1, int p10=-1, int p11=-1, int p12=-1, int p13=-1, int p14=-1);
  import void PionExit(int n1, sens s1, int n2=-1, sens s2=-1, int n3=-1, sens s3=-1, int n4=-1, sens s4=-1, int n5=-1, sens s5=-1, int n6=-1, sens s6=-1, int n7=-1, sens s7=-1);
  import void SASManuel(int d, int x, int y, int face, sens s);
  import void SAS(int d, int face, sens s);
  import void PionsDeclencheurs(int d1, int d2=-1, int d3=-1, int d4=-1, int d5=-1, int d6=-1, int d7=-1, int d8=-1, int d9=-1, int d10=-1, int d11=-1, int d12=-1, int d13=-1, int d14=-1);
  import void VehiculesRue(int proba, int n1, sens s1, int n2=-1, sens s2=-1, int n3=-1, sens s3=-1, int n4=-1, sens s4=-1, int n5=-1, sens s5=-1, int n6=-1, sens s6=-1);
  import void VehiculesGarage(int proba, int n1, sens s1, int n2=-1, sens s2=-1, int n3=-1, sens s3=-1, int n4=-1, sens s4=-1, int n5=-1, sens s5=-1, int n6=-1, sens s6=-1);
  import void HelicoptereRue(int proba, int n1, int n2=-1, int n3=-1, int n4=-1, int n5=-1, int n6=-1);
  import void HelicoptereHeliport(int proba, int n1, int n2=-1, int n3=-1, int n4=-1, int n5=-1, int n6=-1);
  import void ZonesInvasionAlea(int n1, sens s1, int n2=-1, sens s2=-1, int n3=-1, sens s3=-1, int n4=-1, sens s4=-1, int n5=-1, sens s5=-1, int n6=-1, sens s6=-1, int n7=-1, sens s7=-1);
  import void ZonesInvasionAleaManuel(int d1, int x1, int y1, sens s1, int d2=-1, int x2=-1, int y2=-1, sens s2=-1, int d3=-1, int x3=-1, int y3=-1, sens s3=-1);
  import void ZonesInvasionRougesFixesManuel(int d1, int x1, int y1, sens s1, int d2=-1, int x2=-1, int y2=-1, sens s2=-1, int d3=-1, int x3=-1, int y3=-1, sens s3=-1);
  import void PionDepartManuel(int d1, int x1, int y1, int d2=-1, int x2=-1, int y2=-1, int d3=-1, int x3=-1, int y3=-1, int d4=-1, int x4=-1, int y4=-1);
  import void PionsRecherche(int d1, int x1, int y1, int d2=-1, int x2=-1, int y2=-1, int d3=-1, int x3=-1, int y3=-1, int d4=-1, int x4=-1, int y4=-1);
  import void ZonesInvasionRouges(int n1, sens s1, int n2=-1, sens s2=-1, int n3=-1, sens s3=-1, int n4=-1, sens s4=-1, int n5=-1, sens s5=-1, int n6=-1, sens s6=-1, int n7=-1, sens s7=-1);
  import void ZonesInvasionRougesManuel(int d1, int x1, int y1, sens s1, int d2=-1, int x2=-1, int y2=-1, sens s2=-1, int d3=-1, int x3=-1, int y3=-1, sens s3=-1);
  import void ZonesInvasionRougesFixes(int n1, sens s1, int n2=-1, sens s2=-1, int n3=-1, sens s3=-1, int n4=-1, sens s4=-1, int n5=-1, sens s5=-1, int n6=-1, sens s6=-1, int n7=-1, sens s7=-1);
  import void ZonesInvasionCouleur(int n1, couleur c1, sens s1, int n2=-1, couleur c2=-1, sens s2=-1, int n3=-1, couleur c3=-1, sens s3=-1, int n4=-1, couleur c4=-1, sens s4=-1);
  import void ZonesInvasionCouleurManuel(int d1, int x1, int y1, couleur c1, sens s1, int d2=-1, int x2=-1, int y2=-1, couleur c2=-1, sens s2=-1);
  import void PortesExtStandardsFermees(int d1, int n1, int d2=-1, int n2=-1, int d3=-1, int n3=-1, int d4=-1, int n4=-1, int d5=-1, int n5=-1, int d6=-1, int n6=-1, int d7=-1, int n7=-1);
  import void PortesExtStandardsOuvertes(int d1, int n1, int d2=-1, int n2=-1, int d3=-1, int n3=-1, int d4=-1, int n4=-1, int d5=-1, int n5=-1, int d6=-1, int n6=-1, int d7=-1, int n7=-1);
  import void PortesIntStandardsFermees(int d1, int n1, int d2=-1, int n2=-1, int d3=-1, int n3=-1, int d4=-1, int n4=-1, int d5=-1, int n5=-1, int d6=-1, int n6=-1, int d7=-1, int n7=-1);
  import void PortesIntStandardsOuvertes(int d1, int n1, int d2=-1, int n2=-1, int d3=-1, int n3=-1, int d4=-1, int n4=-1, int d5=-1, int n5=-1, int d6=-1, int n6=-1, int d7=-1, int n7=-1);
  import void CellulesIntVioletFermees(int d1, int n1, int d2=-1, int n2=-1, int d3=-1, int n3=-1, int d4=-1, int n4=-1, int d5=-1, int n5=-1, int d6=-1, int n6=-1, int d7=-1, int n7=-1);
  import void CellulesIntBlancFermees(int d1, int n1, int d2=-1, int n2=-1, int d3=-1, int n3=-1, int d4=-1, int n4=-1, int d5=-1, int n5=-1, int d6=-1, int n6=-1, int d7=-1, int n7=-1);
  import void PortesPrisonIntFermees(int d1, int n1, couleur c1, int d2=-1, int n2=-1, couleur c2=-1, int d3=-1, int n3=-1, couleur c3=-1, int d4=-1, int n4=-1, couleur c4=-1);
  import void PortesPrisonIntOuvertes(int d1, int n1, couleur c1, int d2=-1, int n2=-1, couleur c2=-1, int d3=-1, int n3=-1, couleur c3=-1, int d4=-1, int n4=-1, couleur c4=-1);
  import void PortesPrisonExtFermees(int d1, int n1, couleur c1, int d2=-1, int n2=-1, couleur c2=-1, int d3=-1, int n3=-1, couleur c3=-1, int d4=-1, int n4=-1, couleur c4=-1);
  import void PortesIntCouleursFermees(int d1, int n1, couleur c1, int d2=-1, int n2=-1, couleur c2=-1, int d3=-1, int n3=-1, couleur c3=-1, int d4=-1, int n4=-1, couleur c4=-1);
  import void PortesExtCouleursFermees(int d1, int n1, couleur c1, int d2=-1, int n2=-1, couleur c2=-1, int d3=-1, int n3=-1, couleur c3=-1, int d4=-1, int n4=-1, couleur c4=-1);
  import void Mirador(int d1, int x1, int y1, sens s1, int fouille1, int d2=-1, int x2=-1, int y2=-1, sens s2=-1, int fouille2=-1);
  import void Pionapparition(int numero1, int d1, int x1, int y1, int numero2=-1, int d2=-1, int x2=-1, int y2=-1, int numero3=-1, int d3=-1, int x3=-1, int y3=-1);
  import void LienPionsSpeciauxBatiment(int numerobatiment, int n1, int n2=-1, int n3=-1, int n4=-1, int n5=-1, int n6=-1, int n7=-1, int n8=-1, int n9=-1, int n10=-1, int n11=-1, int n12=-1, int n13=-1);
  import void FormationBatiment(int numero, int n1, int n2=-1, int n3=-1, int n4=-1, int n5=-1, int n6=-1, int n7=-1, int n8=-1, int n9=-1, int n10=-1, int n11=-1, int n12=-1, int n13=-1);
  import void FormationBatimentInterrupteur(couleur c, int n1, int n2=-1, int n3=-1, int n4=-1, int n5=-1, int n6=-1, int n7=-1, int n8=-1, int n9=-1, int n10=-1, int n11=-1, int n12=-1, int n13=-1); 
  import void PlacementPionsFouilles(int d);
  import void PlacementObjectifs(int d);
  import void PlacementObjectifSpecialManuel(int d, int x, int y);
  import void GenerationBatimentManuel(int n1, int n2=-1, int n3=-1, int n4=-1, int n5=-1, int n6=-1, int n7=-1, int n8=-1, int n9=-1, int n10=-1, int n11=-1, int n12=-1, int n13=-1, int n14=-1);
  import void PionOuvertureBatimentSemiManuel(int numerobatiment1, int z1, int numerobatiment2=-1, int z2=-1, int numerobatiment3=-1, int z3=-1, int numerobatiment4=-1, int z4=-1, int numerobatiment5=-1, int z5=-1, int numerobatiment6=-1, int z6=-1, int numerobatiment7=-1, int z7=-1);
  import void PionOuvertureBatiment(int n1, int d1, int n2=-1, int d2=-1, int n3=-1, int d3=-1, int n4=-1, int d4=-1, int n5=-1, int d5=-1, int n6=-1, int d6=-1, int n7=-1, int d7=-1);
  import void PionOuvertureBatimentManuel(int numerobatiment1, int d1, int x1, int y1, int numerobatiment2=-1, int d2=-1, int x2=-1, int y2=-1, int numerobatiment3=-1, int d3=-1, int x3=-1, int y3=-1);
  import void PlacementObjectifsManuel(int numero, types type1, int xtype1, int ytype1, types type2=-1, int xtype2=-1, int ytype2=-1, types type3=-1, int xtype3=-1, int ytype3=-1, types type4=-1, int xtype4=-1, int ytype4=-1);
  import void PlacementObjectifsSemiManuel(int numero, int d1, int z1, int d2=-1, int z2=-1, int d3=-1, int z3=-1, int d4=-1, int z4=-1, int d5=-1, int z5=-1, int d6=-1, int z6=-1);
  import void PlacementObjectifsSeulsManuel(int d1, int xtype1, int ytype1, int d2=-1, int xtype2=-1, int ytype2=-1, int d3=-1, int xtype3=-1, int ytype3=-1, int d4=-1, int xtype4=-1, int ytype4=-1);
  import void PionDepartSurvSiege();
  import void EchelleHeliport(int d, int n);
  import void Barbeles(int d1, int x1, int y1, sens s1, int d2=-1, int x2=-1, int y2=-1, sens s2=-1);
  import void VehiculeSpecManuel(TypeVehiculeSpec type, int d, int x, int y, sens s);
  import void VehiculeSpecGarage(TypeVehiculeSpec type, int d, sens s);
  import void VehiculeSpecRue(TypeVehiculeSpec type, int n, sens s);
  import void PionPersonnage(int d, int x, int y);
  import void InterrupteursManuel(couleur c, int d1, int x1, int y1, sens s1, int numerobatiment1=-1, int d2=-1, int x2=-1, int y2=-1, sens s2=-1, int numerobatiment2=-1);
  import void MasquerPions(Button *b1, Button *b2=0, Button *b3=0, Button *b4=0, Button *b5=0, Button *b6=0, Button *b7=0, Button *b8=0, Button *b9=0, Button *b10=0, Button *b11=0, Button *b12=0, Button *b13=0, Button *b14=0);
  import void TirageCarte();
};

Crimson Wizard

#1
QuoteI wonder how many data can be stored in an AGS game.
This depends on the system you're running it on.

E.g. on Windows the engine is still distributed as a 32-bit app, which means that it cannot exceed 3 GB of RAM (iirc). If we build a 64-bit program, then it will allow much more. But it will never be able to surpass what the player has on their computer, obviously. If player has 2 GB RAM, that's it (and portion of that RAM will always be used by an operating system).

If you have a plain struct, then you dont have to guess, instead calculate the size of the struct. Your struct is mostly ints. One integer is 4 bytes. Sum up all the ints and arrays of ints you have, and you'll know how much it takes exactly.

If you have too much data, the general approach, for engines and games, is not to have literally everything loaded at the same time. Instead, have only 1 instance of a struct representing current location, and have actual data saved in files. Load one part of your world at a time, and replace it when the player moves outside.

In memory keep only things that may change. If that's convenient, you may make a second struct for that, having only data that can be changed, and have such structs for each "left" area where player may return to later. When player leaves the area, copy respective data from the "main" struct to the "memory" struct. When player enters previously visited area again, copy from "memory" struct to the "main" struct.

If that is also too much, there's still a resort: use disk cache. Basically, write the data for the inactive parts of the world to files, and read from these as player returns to them.

And since you are doing your own type of game, I strongly recommend considering custom saves instead of using AGS own saves: this way you will only save what your game actually needs.

Baguettator

#2
Wow, thanks Crimson for your explanation !

If I consider I have 150 maps in my app, and if I calculate with 1 int = 4 byte, it means my 150 maps= 2482800bytes, so 2,5MB. Right ?

I don't know if it's a lot, and I should have to calculate for the whole data of my game. But is there an easy way to have this value (the total data of a game) displayed somewhere ?

Having very long script files is also impacting the RAM ?

When you talk about disk cache : what do you mean ? How to use that in AGS ?

If I understand you well, instead of having an array like cartes[150] that is initialized at game_start, I should have instead only one 'cartes' instance, and a function like :

Code: ags
function Creationcarte(int c)
{
  if (c==1) // code the map #1
  else if (c==2) // code the map #2
  // etc

  // Then, display the chosen map
}


This function could be called when a map has to be chosen, instead of creating 150 maps at game_start, and when needed, choosing 1 map and displaying it.

EDIT : when I run my game, I just had a look at the Task Manager, and it displays 408,5Mo in the Memory Section. Does it mean I'm using 408,5Mo over 3GB ? (I don't know the conversion from Mo to MB...).

EDIT 2 : I imagine that the main thing that takes place in memory are the sprites, right ? Maybe my struct, as it is, is very insignificant about my worries, even if I had 2000 instances of 'cartes' ?

EDIT 3 : I don't understand what are the custom saves. What's about ? Instead of AGS saves ?

Crimson Wizard

#3
Quote from: Baguettator on Mon 31/01/2022 14:44:55
I don't know if it's a lot, and I should have to calculate for the whole data of my game.

I must admit that 2.5 MB is not a lot today, especially compared to the rest of the game data.

Quote from: Baguettator on Mon 31/01/2022 14:44:55
Having very long script files is also impacting the RAM ?

Yes, script are compiled, and compiled scripts are loaded by the engine fully. The bigger script is, the bigger memory it requires.
Usually script sizes are in kilobytes though, but this may be more if they also include large global arrays of fixed size.

Quote from: Baguettator on Mon 31/01/2022 14:44:55
When you talk about disk cache : what do you mean ? How to use that in AGS ?
Save data into the custom file, remove it from the variables. When necessary - load it back. There are file commands in ags script:
https://adventuregamestudio.github.io/ags-manual/File.html
But the disk cache is the last resort, you probably won't need this. Unless you are close to the game completion and found that your script data takes too much memory.

Quote from: Baguettator on Mon 31/01/2022 14:44:55
If I understand you well, instead of having an array like cartes[150] that is initialized at game_start, I should have instead only one 'cartes' instance, and a function like :

I mean rather - have these cartes stored in files, and loaded, as scripting everything in a function will likely require same memory. The point of this solution is to not have all of this data mentioned in script.
But this solution comes with extra problem: you need to save these files prior to using them in game. This means that you also need some kind of a "map editor", either scripted as a AGS game, or separate tool.
Alternatively, you may describe maps in a text format and parse them in script, for instance using IniFile module.

Quote from: Baguettator on Mon 31/01/2022 14:44:55
EDIT : when I run my game, I just had a look at the Task Manager, and it displays 408,5Mo in the Memory Section. Does it mean I'm using 408,5Mo over 3GB ?

That likely means your active process(es) are using 408 Mb total.
I think "Mo" is "Megabytes" in French?


Quote from: Baguettator on Mon 31/01/2022 14:44:55
EDIT 3 : I don't understand what are the custom saves. What's about ? Instead of AGS saves ?

You may save and load your own files from script. This way you can write only data that you need for your game to remember.
How to work with custom files in AGS:
https://adventuregamestudio.github.io/ags-manual/File.html

Again, this is an option, and you may look into this after you deal with other problems.

Baguettator

Oh, ok, I understand better.

QuoteYes, script are compiled, and compiled scripts are loaded by the engine fully. The bigger script is, the bigger memory it requires.
Usually script sizes are in kilobytes though, but this may be more if they also include large global arrays of fixed size.

no problem, the greatest arrays in my game or < to 300, and there are not so much. So it shouldn't hurt the RAM.

QuoteSave data into the custom file, remove it from the variables. When necessary - load it back. There are file commands in ags script:
https://adventuregamestudio.github.io/ags-manual/File.html
But the disk cache is the last resort, you probably won't need this. Unless you are close to the game completion and found that your script data takes too much memory.

Understood ! I use that to store the parameters for custom characters the player can create to play with.

QuoteI mean rather - have these cartes stored in files, and loaded, as scripting everything in a function will likely require same memory. The point of this solution is to not have all of this data mentioned in script.
But this solution comes with extra problem: you need to save these files prior to using them in game. This means that you also need some kind of a "map editor", either scripted as a AGS game, or separate tool.
Alternatively, you may describe maps in a text format and parse them in script, for instance using IniFile module

Well finally it will be very easier for me to store them directly in the app, until it doesn't hurt so much the RAM (and it seems to be a very small impact on it).

QuoteThat likely means your active process(es) are using 408 Mb total.
I think "Mo" is "Megabytes" in French?

Yes, I believe MB is the same as Mo. So, if my game, when it's running, is using 430Mo (or MB), it means it's remaining 2.570GB (or Mo) ? That's so huuuuuuge :)

SMF spam blocked by CleanTalk