SNShell - Fallout 3 Computerterminals | Code and Create

SNShell - Fallout 3 Computerterminals

Fallout 3 - Fans kennen das, Computer im Spiel zu hacken ist ein recht alltägliches Handwerk. Die Oberfläche der Computer lehnt sich sehr an alten Computern mit VMS an und hat einen gewissen Charme. Für eine SSH-Tunnel Remote Shell habe ich mich dazu hinreißen lassen die Textausgaben dem Unified Operating System nachzuempfinden. Für C-Freunde hier ein paar Codeschnippsel für eigene Projekte:

Variablen

SCREEN_CHAR_SET_TIME wird für usleep benötigt um die Wartezeit zu bestimmen zwischen der Ausgabe einzelner Buchstaben.
HEADERINFO* enthält den typischen Header auf Terminals in Fallout 3.

#define SCREEN_CHAR_SET_TIME 20000
char *HEADERINFO1 = "ROBCO INDUSTRIES UNIFIED OPERATING SYSTEM\n";
char *HEADERINFO2 = "COPYRIGHT 2075-2077 ROBCO INDUSTRIES\n";
char *HEADERINFO3 = "-Server 1-\n";

printText und printCenteredText

Die beiden Funktionen sind das eigentliche Herzstück der Ausgabe. PrintCenteredText ist im Endeffekt nur ein Wrapper für printText, der aber zum Beispiel für den Header benutzt wird um Text, wie der Name schon sagt, zentriert auszugeben

printText

der Parameter fast ist nur für zeilenbasierte Ausgabe. Optisch ändert sich nichts dazu als wenn man Text mit printf direkt ausgeben würde, wenn fast auf 1 steht. Zum Beispiel für Trennlinien relevant.

void printText(char *dynamicText, int fast) {
   int i;
   for (i = 0; dynamicText[i] != 0; i++){
      printf("%c", dynamicText[i]);
      if (fast != 1) {
         usleep(SCREEN_CHAR_SET_TIME);
      }
      fflush (NULL);
   }
}

printCenteredText

void printCenteredText(char *dynamicText, int fast) {
   int paddingRight = 0;
   if (getTerminalSize(1) >= strlen(dynamicText)) {
      paddingRight = (snshell_getTerminalSize(1) - strlen(dynamicText)) / 2;
      int i;
      for (i = 0; i < paddingRight; i++) {
         printText(" ", 1);
      }
   }
   printText(dynamicText, fast);
}

getTerminalSize

Dies ist eine Support-Funktion um die aktuelle Größe des Terminal-Fensters zu bestimmen, was für printCenteredText() gebraucht wird.

int getTerminalSize(int type) {
   int cols = 80;
   int lines = 24;
   #ifdef TIOCGSIZE
      struct ttysize ts;
      ioctl(STDIN_FILENO, TIOCGSIZE, &ts);
      cols = ts.ts_cols;
      lines = ts.ts_lines;
   #elif defined(TIOCGWINSZ)
      struct winsize ts;
      ioctl(STDIN_FILENO, TIOCGWINSZ, &ts);
      cols = ts.ws_col;
      lines = ts.ws_row;
   #endif /* TIOCGSIZE */
   switch (type) {
      case 0:
         return lines;
         break;
      case 1:
         return cols;
         break;
      default:
         return -1;
   }
}

Der gesamte Quellcode ist auf Github zu finden.