Galactic empire

# Idées

## Conteurs

Ajouter des conteur ?

* La distance parcourue
* Les pirates rencontrés
* Les missions menées
* ...

# Fonctions

## Brouillon : PrintStatus

Une fonction pour montrer l'état (montant d'argent, etc) sur l'écran à tout temps.

#### Version 1 (2018-08-06)

```
   static void PrintStatus(int montant) {
       int StatusX = 0;                // On met la ligne de status au debut du ligne...
       int StatusY = 0;                // sur la première ligne de la console (en haut)
       string fillerPlace = "{0}";     // On remplacera ça avec le separateur plus tard
       char statusFiller = '=';        // On construira le separateur avec ce symbole
       char moneyChar = '$';           // Le symbole de l'argent
       // Ici on construit notre bar de status
       string statusLine = "[Argent " + moneyChar.ToString() + montant.ToString() + "]" + fillerPlace + "[F1 Aide]";
       // Et on calcule la longueur de separateurs (fillers)
       string fillerString = new string(statusFiller, (Console.WindowWidth - StatusX - statusLine.Length + fillerPlace.Length) );
       // On position le cursor
       Console.CursorLeft = StatusX;
       Console.CursorTop = StatusY;
       // Et finalement on fait sortir la ligne de status
       Console.WriteLine(statusLine, fillerString);
   }

```

#### Version 2 (2018-08-06)

Avec plusieurs paramètres (attaque, bouclier, etc)

```
   static void PrintStatus(int money, int attack, int shield, int reactor) {
       int StatusX = 0;                // On met la ligne de status au debut du ligne...
       int StatusY = 0;                // sur la première ligne de la console (en haut)
       string fillerPlace = "{0}";     // On remplacera ça avec le separateur plus tard
       char statusFiller = '=';        // On construira le separateur avec ce symbole
       char moneyChar =    '$';        // Le symbole de l'argent
       char attackChar =   '⚔';
       char shieldChar =   '⛉';
       char reactorChar =  '☢';
       char fuelChar =     '⚗';
       // Ici on construit notre bar de status
       string statusLine = "[Argent " + moneyChar.ToString() + money.ToString() + " " +  attackChar.ToString() + attack.ToString() + " " + shieldChar.ToString() + shield.ToString() + " " + reactorChar.ToString() + reactor.ToString() + "]" + fillerPlace + "[F1 Aide]";
       // Et on calcule la longueur de separateurs (fillers)
       string fillerString = new string(statusFiller, (Console.WindowWidth - StatusX - statusLine.Length + fillerPlace.Length) );
       // On position le cursor
       Console.CursorLeft = StatusX;
       Console.CursorTop = StatusY;
       // Et finalement on fait sortir la ligne de status
       Console.Write(statusLine, fillerString);
   }

```

#### Version 3 (2018-08-06)

Sans les symboles Unicode qu'on ne obtiens pas dans la console Windows

```
   static void PrintStatus(int money, int attack, int shield, int reactor) {
       int StatusX = 0;                // On met la ligne de status au debut du ligne...
       int StatusY = 0;                // sur la première ligne de la console (en haut)
       string fillerPlace = "{0}";     // On remplacera ça avec le separateur plus tard
       char statusFiller = '=';        // On construira le separateur avec ce symbole
       string moneySymbol =   "$";
       string attackSymbol =  "A:";
       string shieldSymbol =  "S:";
       string reactorSymbol = "R:";
       string fuelSymbol =    "F:";
       // Ici on construit notre bar de status
       string statusLine = "[Argent " + moneySymbol + money.ToString() + " " +  attackSymbol + attack.ToString() + " " + shieldSymbol + shield.ToString() + " " + reactorSymbol + reactor.ToString() + "]" + fillerPlace + "[F1 Aide]";
       // Et on calcule la longueur de separateurs (fillers)
       string fillerString = new string(statusFiller, (Console.WindowWidth - StatusX - statusLine.Length + fillerPlace.Length) );
       // On position le cursor
       Console.CursorLeft = StatusX;
       Console.CursorTop = StatusY;
       // Et finalement on fait sortir la ligne de status
       System.Console.OutputEncoding = System.Text.Encoding.UTF8;
       Console.Write(statusLine, fillerString);
   }

```

#### Version 4 (2018-08-07)

Plus d'info dans le bar de status : laser (attack), armure (armor), bouclier (shield), réacteur (reactor), agent de propulsion (fuel) et cargo (utilisé/totale). Aussi le nom du vaisseau, just for fun =)

```
   static void PrintStatus(string  shipName,
                           int     money,
                           int     attack,
                           int     armor,
                           int     shield,
                           int     reactor,
                           int     fuel,
                           int     cargoLoaded,
                           int     cargoTotal) {
       int StatusX = 0;                // On met la ligne de status au debut du ligne...
       int StatusY = 0;                // sur la première ligne de la console (en haut)
       string fillerPlace = "{0}";     // On remplacera ça avec le separateur plus tard
       char statusFiller = '=';        // On construira le separateur avec ce symbole
       string moneySymbol =   "$";
       string attackSymbol =  "L:";    // Parce que Laser
       string armorSymbol =   "A:";
       string shieldSymbol =  "S:";
       string reactorSymbol = "R:";
       string fuelSymbol =    "F:";
       string cargoSymbol =   "C:";
       // Ici on construit notre bar de status
       string statusLine = "[" + shipName + " "
                               + moneySymbol + money.ToString() + " "
                               + attackSymbol + attack.ToString() + " "
                               + shieldSymbol + shield.ToString() + " "
                               + reactorSymbol + reactor.ToString() + " "
                               + fuelSymbol + fuel.ToString() + " "
                               + cargoSymbol + cargoLoaded + "/" + cargoTotal
                               + "]" + fillerPlace + "[F1 Aide]";
       // Et on calcule la longueur de separateurs (fillers)
       string fillerString = new string(statusFiller, (Console.WindowWidth - StatusX - statusLine.Length + fillerPlace.Length) );
       // On position le cursor
       Console.CursorLeft = StatusX;
       Console.CursorTop = StatusY;
       // Et finalement on fait sortir la ligne de status
       System.Console.OutputEncoding = System.Text.Encoding.UTF8;
       Console.Write(statusLine, fillerString);
   }

```

## Brouillon : fonction PrintMenu

Une fonction pour montrer un menu et obtenir le numéro d'une ligne choisie.

### Version 1 (2018-08-06)

Pas de sélection direct (en tapant les numéro ou lettres)

```
   static int PrintMenu (string[] menu)
   {
       // On sauvegarde la position du curseur sur l'écran
       int CursorX = Console.CursorLeft;
       int CursorY = Console.CursorTop;
       // La ligne sélectionnée de menu
       int selection = 1;
       int last = 1;           // La ligne sélectionnée avant
       // La fonction soutienne deux façons de selection :
       //   on peut bouger la selecteur (>) par les touches de courseur (up/down);
       //   ou on peut taper la sélection (selectorKeys) directement sur le clavier
       string selector = "> ";
       string selectorKeys = "123456789ABCDEFGHIJKLMNOPRSTUVXYZ";
       // On utilise ça pour lire l'entrée sur clavier
       ConsoleKeyInfo key;
       // Vérifier si on a assez des lignes sur l'écran pour le menu :
       //   on a (Console.WindowHeight - Console.CursorTop) lignes sur l'écran,
       //   et menu.Length lignes dans le menu...
       // Vérifier aussi s'il y a plus de lignes dans le menu que de selectorKeys !
       if ( (Console.WindowHeight - Console.CursorTop) < menu.Length || menu.Length > selectorKeys.Length) {
           // Pas assez de lignes sur l'écran
           // ou trop de lignes de menu :
           // la fonction retourne 0 au lieux de selection et sort tout de suite
           return 0;
       }
       // Afficher le menu
       for (int i = 1; i <= menu.Length; i++) {
           Console.CursorLeft = CursorX;
           Console.CursorTop = CursorY + i - 1;
           Console.Write(selectorKeys[i-1] + (i == selection ? selector : new string(' ', selector.Length) ) + menu[i - 1]);
       }
       // Choisir la ligne
       do {
           // Effacer le selecteur sur la ligne précédente...
           Console.CursorLeft = CursorX + 1;
           Console.CursorTop = CursorY + last - 1;
           Console.Write(new String(' ', selector.Length));
           // Et imprimer le selecteur sur la ligne sélectionnée
           Console.CursorLeft = CursorX + 1;
           Console.CursorTop = CursorY + selection - 1;
           Console.Write(selector);
           // Répositionner le curseur sur le selecteur
           Console.CursorLeft = CursorX;
           key = Console.ReadKey(true);
           // On lit l'entrée
           if (key.Key == ConsoleKey.DownArrow && selection < menu.Length) {
               last = selection++;
           } else if (key.Key == ConsoleKey.UpArrow && selection > 1) {
               last = selection--;
           }
       } while (key.Key != ConsoleKey.Enter);
       // On a la selection,
       //   il faut re-positionner le curseur et retourner le numéro
       Console.CursorLeft = CursorX;
       Console.CursorTop = CursorY + menu.Length;
       return selection;
   }

```

#### Version 2 (2018-08-06)

Cette version devrait accepter les deux façons de sélection : par les touches curseur et en direct.

```
   static int PrintMenu (string[] menu)
   {
       // On sauvegarde la position du curseur sur l'écran
       int CursorX = Console.CursorLeft;
       int CursorY = Console.CursorTop;
       // La ligne sélectionnée de menu
       int selection = 1;
       int last = 1;           // La ligne sélectionnée avant
       bool selectionDone = false;
       // La fonction soutienne deux façons de selection :
       //   on peut bouger la selecteur (>) par les touches de courseur (up/down);
       //   ou on peut taper la sélection (selectorKeys) directement sur le clavier
       string selector = "> ";
       string selectorKeys = "123456789ABCDEFGHIJKLMNOPRSTUVXYZ";
       // On utilise ça pour lire l'entrée sur clavier
       ConsoleKeyInfo key;
       // Vérifier si on a assez des lignes sur l'écran pour le menu :
       //   on a (Console.WindowHeight - Console.CursorTop) lignes sur l'écran,
       //   et menu.Length lignes dans le menu...
       // Vérifier aussi s'il y a plus de lignes dans le menu que de selectorKeys !
       if ( (Console.WindowHeight - Console.CursorTop) < menu.Length || menu.Length > selectorKeys.Length) {
           // Pas assez de lignes sur l'écran
           // ou trop de lignes de menu :
           // la fonction retourne 0 au lieux de selection et sort tout de suite
           return 0;
       }
       // Afficher le menu
       for (int i = 1; i <= menu.Length; i++) {
           Console.CursorLeft = CursorX;
           Console.CursorTop = CursorY + i - 1;
           Console.Write(selectorKeys[i-1] + (i == selection ? selector : new string(' ', selector.Length) ) + menu[i - 1]);
       }
       // Choisir la ligne
       do {
           // Effacer le selecteur sur la ligne précédente...
           Console.CursorLeft = CursorX + 1;
           Console.CursorTop = CursorY + last - 1;
           Console.Write(new String(' ', selector.Length));
           // Et imprimer le selecteur sur la ligne sélectionnée
           Console.CursorLeft = CursorX + 1;
           Console.CursorTop = CursorY + selection - 1;
           Console.Write(selector);
           // Répositionner le curseur sur le selecteur
           Console.CursorLeft = CursorX;
           key = Console.ReadKey(true);
           // On lit l'entrée
           if (key.Key == ConsoleKey.DownArrow && selection < menu.Length) {
               last = selection++;
           } else if (key.Key == ConsoleKey.UpArrow && selection > 1) {
               last = selection--;
           } else {
               // Vérifie pour la selection directe
               for (int i = 1; i <= selectorKeys.Length; i++) {
                   if (Char.ToUpper(key.KeyChar) == selectorKeys[i-1]) {
                       selection = i;
                       selectionDone = true;
                   }
               }
           }
       } while (key.Key != ConsoleKey.Enter && !selectionDone);
       // On a la selection,
       //   il faut re-positionner le curseur et retourner le numéro
       Console.CursorLeft = CursorX;
       Console.CursorTop = CursorY + menu.Length;
       return selection;
   }

```