Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - Baguettator

#1
Thanks Crimson for your answer ! Indeed, it could be SO NICE to have the autocomplete working well, at least for my situation... Let me know :)
#2
Sorry, I didn't thought about it. Excuse me for that...

But I think this is not offtopic : I don't know if it's a problem, but it's a bit annoying for me : in my struct to manage the maps in my game, I have plenty of functions to set up the map. I have a huge function that creates the chosen map (with if/else conditions). The problem is that when my function becomes to big, and if I write something like that :

    function Cartes::Create(int c)
    {
      this.PlaceTokenA(
      // the PlaceTokenA function has parameters like "int tile, int x, int y, int rotation" etc...
    }

Normally, when I hit the "(", AGS shows me the order of the parameters below the editor's text. But it doesn't if the function is too big (I think after a hundred or so lines long). It's a bit annoying because sometimes I have to look in the script in which order are the parameter of the function (like PlaceTokenA), it's a lost of time. Any idea why it happens ? Is it possible to correct it ?

For me, it's a problem, like a problem of memory or I don't know what...
#3
Quote from: Crimson Wizard on 05 Feb 2022, 22:08
You can put multiple variables in a managed struct and pass the instance of that struct as 1 parameter. There may be other solutions, depending on the situation: what the function is for, how do you use it, maybe it can be replaced with just a struct and setting struct members instead? But this is a general scripting topic.

I really don't understand how a managed struct can replace several function parameters, but the thing is I created functions to place some tokens in a map (like a tabletop game), and sometimes 1 function is to set the different possibilities of placement for 1 token. So, for each possibility, I need to tell which tile, which x coordinate of the tile, and which y coordinate of the tile. 3 parameters per possibility. In this case, my function can get only 4 possibilities. Of course I can set up a way to stock these possibilities, then recall the same function with other parameters and increase the number of possibilities, that's what I did. But it could be useful to have a greater limit. Or maybe I'm wrong ?

Quote from: Crimson Wizard on 05 Feb 2022, 22:08
It's currently possible to script your own label or list box that uses several fonts and colors, with DrawingSurface and DynamicSprite functions.
In theory it's possible to implement some kind of a "rich text" control in the engine too, for example one that draws text using html-like tags, but that's a serious work that requires some good design decision first. We have already planned to wrap 3.6.0 version up, and now working towards finishing priority major features. The other features added were ones that cover problems that are too inconvenient for scripting and simple enough to do quickly in the engine at the same time.
If there's an actual interest in such engine feature, you may post it in the engine suggestions forum section, or our issue tracker on github.

Hmm seems complicate for me to do so. Is there any module for that kind of things, existing for the 3.6 ? Or any method to do the same ?

Also, I already mentionned it, but got no answer : I don't know if it's a problem, but it's a bit annoying for me : in my struct to manage the maps in my game, I have plenty of functions to set up the map. I have a huge function that creates the chosen map (with if/else conditions). The problem is that when my function becomes to big, and if I write something like that :

Code: ags
function Cartes::Create(int c)
{
  this.PlaceTokenA(
  // the PlaceTokenA function has parameters like "int tile, int x, int y, int rotation" etc...
}


Normally, when I hit the "(", AGS shows me the order of the parameters below the editor's text. But it doesn't if the function is too big (I think after a hundred or so lines long). It's a bit annoying because sometimes I have to look in the script in which order are the parameter of the function (like PlaceTokenA), it's a lost of time. Any idea why it happens ? Is it possible to correct it ?
#4
Hmm I didn't follow you in your thoughts... I used your formula (with cos and sin) to calculate the width/height of the token after rotating (45° or multipliers), then I simply do that :

Code: ags
//34=width when it's not rotated, 30 is the height when not rotated
int l=FloatToInt(Maths.Cos(Maths.DegreesToRadians(45.0))*IntToFloat(34) + Maths.Sin(Maths.DegreesToRadians(45.0))*IntToFloat(30));
int h=FloatToInt(Maths.Sin(Maths.DegreesToRadians(45.0))*IntToFloat(34) + Maths.Cos(Maths.DegreesToRadians(45.0))*IntToFloat(30));
int x, y; // x is the original x position for the top leftcorner of the token, y is the y position of the top leftcorner
int xporte, yporte; // Also the original coordinates of the token
// The tile width and height are equal to 250
if (nouveau==right) // the tile rotates to right, so 90°
{
  xporte=250-y-h;
  yporte=x;
}
else if (nouveau==down) // the tile rotates to down, so 180°
{
  xporte=250-x-l;
  yporte=250-y-h;
}
else if (nouveau==left) // the tile rotates to left, so 270°
{
  xporte=y;
  yporte=250-x-l;
}
#5
I presume that if I only talk about 45° multipliers (45, 135, 225 and 315), these dynamicsprites should have the same width/heights ?
#6
Thanks a lot Crimson !

I already scripted all the tokens with their top-left corner coordinate (which is the way AGS works for buttons, and tokens are represented by buttons), and it should be very long to change it now... Maybe one day :) Surely it should be better, but it works perfectly for now.

I'm working on the rotation of the tile, will see if it works with the new formula.
#7
Because I use a script to calculate coordinates for tokens (to place on maps, like a tabletop game). And I have "stored" the possible coordinates for the different tiles.

So for example I can place my square at the 1st position of the tile A, with a "up" rotation, and it will automatically set it to x and y coordinates according to my script.

But if I rotate the tile, I have to rotate the tokens too. So they change their rotation (up becomes right for a 90° rotation, or becomes down for a 180° rotation, etc), and their coordinates. To change their coordinates, I need to know their width and height. I have to script it during a time when DynamicSprites are NOT created yet. So I can't use DynamicSprite.Width etc

Is the formula too complex ?
#8
OK thanks !

I just wanted to know the formula to calculate the new height/width of the dynamic sprite.

Is the formula well-known ? I have to use it in scripts, with many things that have different heights and widths, so I need the generical approach.
#9
Hi there !

My question could be very stupid, but I have no idea of how ags handles that...

Imagine I have a DynamicSprite "f" that is a square ("rectangle" ?) with these attributes : f.Width=30, f.Height=34.

If I do : f.Rotate(90)

It makes : f.Width=34 and f.Height=30.

Right :)

BUT, if I do : f.Rotate(45)

What will be the width and height of f ?
#10
Hmm... I can't vizualize your solution. How could it "increase" the number of parameters in a function by passing a struct ?
#11
Thanks ErioO !

Also, I just thought about something I encountered before, and maybe it could be changed in new versions of AGS : now, the maximum number of parameters in a function is 14. Could this limit be removed/pushed away ? It could be useful :)

EDIT : also new suggestion : would it be possible and technically possible to have a text in a label that uses different fonts ? Also for ListBox Items in different colors ? It could be useful ;) But I don't know if it's technically possible in AGS ?
#12
Hey !

Is it possible to manage in-game the windowed mode ? It could be pleasant to decide in-game to switch from full screen to windowed mode and vice-versa, or adjust the size of the windowed mode.
#13
Perfect ! It works great !! Thanks a LOT :)
#14
OK, but the ReadRawLineBack function is used in another .txt file, not the one for the translation. So are we talking about the same thing ?

Sorry if I misunderstand you, english is not my 1st language :(
#15
Does that mean that I need to put this :

// Text encoding hint
//#Encoding=UTF-8
// Source text encoding hint
//#GameEncoding=UTF-8

At the top of my translation file, then save the file where I have to read something using the ReadRawLineBack function in UTF-8, and then it will work as expected ?
#16
PROBLEM !! :)

I installed the 3.6 last version, and I encountered a problem using the ReadRawLine function.

I use this function to read some attributes for characters and custom things players can create to play with in the game. So I read these informations in a .txt file, and store that in a struct.

I have to read this line :

0;NomVéhicCréé0;null;null;null;0;25;25;25;25;55;35;10;10;90;10;null;0;null;0;null;0;0;

and it crashes !

I debugged the situation and found that, using this function, it meant that :

String s=File.ReadRawLineBack();
Display(s);
// Displayed : "0;NomV"

It seems that "é" was causing an error in the ReadRawLineBack function. I changed into the .txt file and replaced all the "é" with "e", and it worked perfectly.

Any idea what's happenning ? It was NOT happenning with the 3.5.1 version I used before :)

EDIT : was the limit of 199 removed for the ReadRawLineBack function ? I thought that yes, but I'm not sure...

EDIT 2 : just managed to launch the game with the 3.6, and I found that scrolling with the finger pad works perfectly ! (it was one of my previous questions).
#17
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 :)
#18
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 ?
#19
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();
};
#20
OK, will see in 3.6 !

And what about the ekeyCtrlLeft and ekeyCtrlRight ? Have they been deleted ?
SMF spam blocked by CleanTalk