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.