|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 7239 (0x1c47) Types: TextFile Names: »midway.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Midway/midway.c«
#include "globals.h" #define VAX main(argc) int argc; { int pr, pc; int interrupt(); register int n; int vec[3]; int uid; /* check the load */ #ifndef VAX uid = getuid(); wizard = uid == 25898 || uid == 25978; gldav(vec); if ((vec[2] >> 8) > 7 && !wizard) { fprintf(stderr, "Load average is too high.\n"); execl("/usr/public/wotd","/usr/public/wotd","-a", 0); exit(1); } #endif if (argc > 1) { for (n=0; n < MAXSHIPS; n++) if (shiplist[n].type == CV || shiplist[n].type == FT) shiplist[n].f4f = shiplist[n].tbf = shiplist[n].sbd = 0; } /* lots of stuff */ /* Ken arnold stuff */ srand(getpid()); initscr(); view = newwin(24, 48, 0, 0); leaveok(view, TRUE); notes = newwin(12, 31, 0, 49); hole = newwin(1, 1, 13, 48); leaveok(hole, TRUE); date = newwin(1, 15, 13, 60); leaveok(date, TRUE); panel1 = newwin(9, 1, 15, 48); leaveok(panel1, TRUE); panel2 = newwin(9, 1, 15, 54); bridge = newwin(9, 5, 15, 49); leaveok(bridge, TRUE); stats = newwin(4, 24, 20, 55); leaveok(stats, TRUE); initialize(); signal(SIGINT, interrupt); crmode(); noecho(); for (n=0; n < MAXSHIPS; n++) { /* slightly random positions */ if (shiplist[n].flagship == n) { if (!rnd(4)) { /* 25% of the time */ pr = shiplist[MIDWAY].row - shiplist[n].row + rnd(3000) - 1500; /* centered on MIDWAY */ pc = shiplist[MIDWAY].col - shiplist[n].col + rnd(3000) - 1500; } else { pr = rnd(3000) - rnd(1500); /* off centered on the ship's starting location */ pc = rnd(3000) - rnd(1500); } } if (n != MIDWAY) { shiplist[n].row += pr; shiplist[n].col += pc; } } sighted[MIDWAY] = 1; /* launch CAP */ for (n=0; n < MAXSHIPS; n++) if (n != player && shiplist[n].f4f) { capplanes[n] = shiplist[n].f4f/2; shiplist[n].f4f -= capplanes[n]; } drawboard(); screen(); if (Japanese(player)) { inform("Begin launching first wave", 0); inform("of Midway attack. -- Nagumo", 0); } else { inform("Japanese fleet expected to", 0); inform("be approx. 300 miles NW of", 0); inform("Midway. -- Nimitz", 0); } playit(); } playit() { register int n; int pr, pc; int ran, tar; int c; char buf[32]; for (;;) { switch (c = getchar()) { case 'h': flack(270, player); wrefresh(view); break; case 'l': flack(90, player); wrefresh(view); break; case 'j': flack(180, player); wrefresh(view); break; case 'k': flack(0, player); wrefresh(view); break; case 'i': case 'o': flack(45, player); wrefresh(view); break; case '.': case ',': flack(135, player); wrefresh(view); break; case 'n': case 'm': flack(225, player); wrefresh(view); break; case 'y': case 'u': flack(315, player); wrefresh(view); break; case 'H': shiplist[player].course = 270; break; case 'L': shiplist[player].course = 90; break; case 'J': shiplist[player].course = 180; break; case 'K': shiplist[player].course = 0; break; case 'I': case 'O': shiplist[player].course = 45; break; case '>': case '<': shiplist[player].course = 135; break; case 'N': case 'M': shiplist[player].course = 225; break; case 'Y': case 'U': shiplist[player].course = 315; break; case '\n': pc = Japanese(player) ? JAPANESE : MAXSHIPS; ran = 35; /* give player an advantage */ tar = -1; for (n = (Japanese(player) ? 0 : JAPANESE); n < pc; n++) { if (shiplist[n].hits && shiplist[n].torps && (pr = range(shiplist[player].row, shiplist[player].col, shiplist[n].row, shiplist[n].col)) < ran) { ran = pr; tar = n; } } if (tar != -1) { fireguns(player, tar); wrefresh(view); } break; case 'c': launch(CAP); break; case '@': launch(SUPER); break; case 'r': launch(RECOVER); break; case 's': launch(SCOUT); break; case 't': launch(TBF); break; case 'f': launch(F4F); break; case 'b': launch(SBD); break; case 'w': inform("waiting...", 0); automatic = -2; break; case 'A': inform("Rig for silent running? ", 0); wreadstr(notes, buf); if (*buf == 'y') automatic = -1; break; case 'a': automatic = 1; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': scale = c - '0'; virtual = player; break; case 'S': inform("Scan whom? ",0); wreadstr(notes, buf); if ((n = scanwho(buf)) != -1) { scale = 0; virtual = n; } break; case '\f': redraw(); break; case 'q': inform("Really quit? ", 0); wreadstr(notes, buf); if (*buf == 'y') die(); break; } do { clock++; airstrike(); moveships(); movebombs(); if (automatic >= 0) screen(); } while (automatic); } } drawboard() { register int n, k; clear(); for (n=0; n < 15; n++) mvaddch(n, 48, '|'); for (k=12; k < 15; k += 2) for (n=49; n < COLS; n++) mvaddch(k, n, '-'); mvaddstr(13, 50, shiplist[player].name); mvaddstr(13, 76, "1942"); mvprintw(15, 55, "%s %ld tons", describe[shiplist[player].type], (long) shiplist[player].value * 1000L); mvaddstr(17, 55, "Guns:"); mvaddstr(18, 55, "Armor:"); mvwputs(stats, 0, 0, "CAP"); if (Japanese(player)) { mvwputs(stats, 1, 0, "00F"); mvwputs(stats, 2, 0, "97T"); mvwputs(stats, 3, 0, "97B"); } else { mvwputs(stats, 1, 0, "F4F"); mvwputs(stats, 2, 0, "TBF"); mvwputs(stats, 3, 0, "SBD"); } mvwputs(stats, 0, 8, "Hits"); mvwputs(stats, 1, 8, "Torps"); mvwputs(stats, 3, 8, "Score"); mvwputs(stats, 0, 18, "Row"); mvwputs(stats, 2, 18, "Col"); move(17, 61); if (shiplist[player].turrets) printw("%d %d\", ", shiplist[player].turrets, shiplist[player].calibre); printw("%d 5\" AA", shiplist[player].aa); move(18, 62); if (!shiplist[player].belt && !shiplist[player].deck) addstr("none"); else printw("%d\" belt, %d\" deck", shiplist[player].belt, shiplist[player].deck); refresh(); wrefresh(stats); } initialize() { int c, s; char r[20]; register int n; char **mess; int *table; printf("Choose a side (Japanese or American) ? "); gets(r); if (*r == 'J' || *r == 'j') { mess = jmess; table = japtable; } else { mess = amess; table = amtable; } for (n=0; mess[n]; n++) puts(mess[n]); printf("\nWhich force do you like? "); scanf("%d", &c); printf("\n"); for (n = table[c]; shiplist[n].flagship == table[c]; n++) printf("%d) %s %s (%d Kilotons)\n", n - table[c], describe[shiplist[n].type], shiplist[n].name, shiplist[n].value); printf("\nWhich ship do you like? "); scanf("%d", &s); if ((virtual = player = s + table[c]) >= MAXSHIPS || player < 0) { fprintf(stderr, "Ship not found.\n"); exit(1); } } scanwho(buf) char buf[]; { register int n; for (n=0; n < MAXSHIPS; n++) if ((sighted[n] || (Japanese(player) == Japanese(n))) && !strcmp(buf, shiplist[n].name) && shiplist[n].hits && shiplist[n].torps) break; if (n < MAXSHIPS) { return(n); } else { inform("Ship not found.", 0); return(-1); } }