|
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 c
Length: 10994 (0x2af2) Types: TextFile Names: »curses_ui.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/X/Xmille/curses_ui.c«
/* * ui.c * * curses interface routines for mille */ # include "mille.h" #undef TRUE #undef FALSE # include "ui.h" #ifdef CTRL # undef CTRL #endif #define CTRL(x) (x - 'A' + 1) WINDOW *Board, *Miles, *Score; char *C_fmt = "%-18.18s"; /* format for printing cards */ char Initstr[100]; /* initial string for error field */ char *_cn[NUM_CARDS] = { /* Card name buffer */ "", "25", "50", "75", "100", "200", "Out of Gas", "Flat Tire", "Accident", "Stop", "Speed Limit", "Gasoline", "Spare Tire", "Repairs", "Go", "End of Limit", "Extra Tank", "Puncture Proof", "Driving Ace", "Right of Way" }, **C_name = &_cn[1]; /* Card names */ Message (string) char *string; { wmove (Score, ERR_Y, ERR_X); waddstr (Score, string); wclrtoeol (Score); } debug (pos, string, a0, a1, a2) { mvprintw (pos+6, 2, string, a0, a1, a2); } ComputerStatus (string) { mvaddstr (MOVE_Y + 1, MOVE_X, string); } ComputerCard (type) int type; { mvprintw (MOVE_Y + 2, MOVE_X, "%16s", C_name[type]); } Prompt (string) char *string; { mvaddstr (MOVE_Y, MOVE_X, string); clrtoeol (); refresh (); } char * GetpromptedInput (string) char *string; { static char buf[1024]; char *sp; sp = buf; Prompt (string); leaveok (Board, FALSE); while ((*sp = readch()) != '\n') { if (*sp == _tty.sg_kill) { sp = buf; break; } else if (*sp == _tty.sg_erase) { if (--sp < buf) sp = buf; else { addch('\b'); /* * if the previous char was a control * char, cover up two characters. */ if (*sp < ' ') addch('\b'); clrtoeol(); } } else addstr(unctrl(*sp++)); refresh(); } *sp = '\0'; leaveok (Board, TRUE); return buf; } newboard() { werase(Board); werase(Score); mvaddstr(5, 0, "--HAND--"); mvaddch(6, 0, 'P'); mvaddch(7, 0, '1'); mvaddch(8, 0, '2'); mvaddch(9, 0, '3'); mvaddch(10, 0, '4'); mvaddch(11, 0, '5'); mvaddch(12, 0, '6'); mvaddstr(13, 0, "--BATTLE--"); mvaddstr(15, 0, "--SPEED--"); mvaddstr(5, 20, "--DECK--"); mvaddstr(7, 20, "--DISCARD--"); mvaddstr(13, 20, "--BATTLE--"); mvaddstr(15, 20, "--SPEED--"); wmove(Miles, 0, 0); if (winch(Miles) != '-') { werase(Miles); mvwaddstr(Miles, 0, 0, "--MILEAGE--"); mvwaddstr(Miles, 0, 41, "--MILEAGE--"); } else { wmove(Miles, 1, 0); wclrtobot(Miles); } newscore(); stdscr = Board; } newscore() { reg int i; stdscr = Score; move(0, 22); if (inch() != 'Y') { erase(); mvaddstr(0, 22, "You Comp Value"); mvaddstr(1, 2, "Milestones Played"); mvaddstr(2, 8, "Each Safety"); mvaddstr(3, 5, "All 4 Safeties"); mvaddstr(4, 3, "Each Coup Fourre"); mvaddstr(2, 37, "100"); mvaddstr(3, 37, "300"); mvaddstr(4, 37, "300"); } else { move(5, 1); clrtobot(); } for (i = 0; i < SCORE_Y; i++) mvaddch(i, 0, '|'); move(SCORE_Y - 1, 1); while (addch('_') != ERR) continue; if (WIndow == W_FULL || Finished) { mvaddstr(5, 5, "Trip Completed"); mvaddstr(6, 10, "Safe Trip"); mvaddstr(7, 5, "Delayed Action"); mvaddstr(8, 10, "Extension"); mvaddstr(9, 11, "Shut-Out"); mvaddstr(10, 21, "---- ---- -----"); mvaddstr(11, 9, "Hand Total"); mvaddstr(12, 20, "----- -----"); mvaddstr(13, 6, "Overall Total"); mvaddstr(14, 15, "Games"); mvaddstr(5, 37, "400"); mvaddstr(6, 37, "300"); mvaddstr(7, 37, "300"); mvaddstr(8, 37, "200"); mvaddstr(9, 37, "500"); } else { mvaddstr(5, 21, "---- ---- -----"); mvaddstr(6, 9, "Hand Total"); mvaddstr(7, 20, "----- -----"); mvaddstr(8, 6, "Overall Total"); mvaddstr(9, 15, "Games"); mvaddstr(11, 2, "p: pick"); mvaddstr(12, 2, "u: use #"); mvaddstr(13, 2, "d: discard #"); mvaddstr(14, 2, "w: toggle window"); mvaddstr(11, 21, "q: quit"); mvaddstr(12, 21, "o: order hand"); mvaddstr(13, 21, "s: save"); mvaddstr(14, 21, "r: reprint"); } stdscr = Board; } init_ui () { initscr(); # ifdef attron # define CA cursor_address # endif if (!CA) { printf("Sorry. Need cursor addressing to play mille\n"); exit(-1); } delwin(stdscr); stdscr = Board = newwin(BOARD_Y, BOARD_X, 0, 0); Score = newwin(SCORE_Y, SCORE_X, 0, 40); Miles = newwin(MILES_Y, MILES_X, 17, 0); #ifdef attron idlok(Board, TRUE); idlok(Score, TRUE); idlok(Miles, TRUE); #endif leaveok(Score, TRUE); leaveok(Miles, TRUE); clearok(curscr, TRUE); crmode(); noecho(); } Error (string, arg) char *string; { stdscr = Score; mvprintw (Score, ERR_Y, ERR_X, string, arg); clrtoeol (); stdscr = Board; } finish_ui () { mvcur(0, COLS - 1, LINES - 1, 0); endwin(); } update_ui () { refresh (); } Beep () { putchar ('\007'); } CARD getcard() { reg char c, c1; for (;;) { while ((c = readch()) == '\n' || c == '\r' || c == ' ') continue; if (islower(c)) c = toupper(c); if (c == _tty.sg_kill || c == _tty.sg_erase) return -1; addstr(unctrl(c)); clrtoeol(); switch (c) { case '1': case '2': case '3': case '4': case '5': case '6': c -= '0'; break; case '0': case 'P': case 'p': c = 0; break; default: putchar(''); addch('\b'); if (!isprint(c)) addch('\b'); c = -1; break; } refresh(); if (c >= 0) { while ((c1=readch()) != '\r' && c1 != '\n' && c1 != ' ') if (c1 == _tty.sg_kill) return -1; else if (c1 == _tty.sg_erase) { addch('\b'); clrtoeol(); refresh(); goto cont; } else write(0, "", 1); return c; } cont: ; } } /* * Get a yes or no answer to the given question. Saves are * also allowed. Return TRUE if the answer was yes, FALSE if no. */ getyn(prompt) reg char *prompt; { reg char c; Saved = FALSE; for (;;) { leaveok(Board, FALSE); mvaddstr(MOVE_Y, MOVE_X, prompt); clrtoeol(); refresh(); switch (c = readch()) { case 'n': case 'N': addch('N'); refresh(); leaveok(Board, TRUE); return FALSE; case 'y': case 'Y': addch('Y'); refresh(); leaveok(Board, TRUE); return TRUE; case 's': case 'S': addch('S'); refresh(); Saved = save(); continue; default: addstr(unctrl(c)); refresh(); putchar(''); break; } } } readch() { reg int cnt; static char c; for (cnt = 0; read(0, &c, 1) <= 0; cnt++) if (cnt > 100) exit(1); return c; } getmove() { reg char c, *sp; static char moveprompt[] = ">>:Move:"; #ifdef EXTRAP static bool last_ex = FALSE; /* set if last command was E */ if (last_ex) { undoex(); prboard(); last_ex = FALSE; } #endif for (;;) { stand(MOVE_Y, MOVE_X, moveprompt); clrtoeol(); move(MOVE_Y, MOVE_X + sizeof moveprompt); leaveok(Board, FALSE); refresh(); while ((c = readch()) == _tty.sg_kill || c == _tty.sg_erase) continue; if (islower(c)) c = toupper(c); if (isprint(c) && !isspace(c)) { addch(c); refresh(); } switch (c) { case 'P': /* Pick */ Movetype = M_DRAW; goto ret; case 'U': /* Use Card */ case 'D': /* Discard Card */ if ((Card_no = getcard()) < 0) break; Movetype = (c == 'U' ? M_PLAY : M_DISCARD); goto ret; case 'O': /* Order */ Order = !Order; Movetype = M_ORDER; goto ret; case 'Q': /* Quit */ rub(); /* Same as a rubout */ break; case 'W': /* WIndow toggle */ WIndow = nextwin(WIndow); newscore(); prscore(TRUE); wrefresh(Score); break; case 'R': /* Redraw screen */ case CTRL('L'): clearok(curscr, TRUE); newboard(); prboard(); break; case 'S': /* Save game */ On_exit = FALSE; save(); break; case 'E': /* Extrapolate */ #ifdef EXTRAP if (last_ex) break; Finished = TRUE; if (WIndow != W_FULL) newscore(); prscore(FALSE); wrefresh(Score); last_ex = TRUE; Finished = FALSE; #else error("%c: command not implemented", c); #endif break; case '\r': /* Ignore RETURNs and */ case '\n': /* Line Feeds */ case ' ': /* Spaces */ case '\0': /* and nulls */ break; case 'Z': /* Debug code */ if (geteuid() == ARNOLD) { if (!Debug && outf == NULL) { char buf[40]; over: mvaddstr(MOVE_Y, MOVE_X, "file: "); clrtoeol(); leaveok(Board, FALSE); refresh(); sp = buf; while ((*sp = readch()) != '\n') { if (*sp == _tty.sg_kill) goto over; else if (*sp == _tty.sg_erase) { if (--sp < buf) sp = buf; else { addch('\b'); if (*sp < ' ') addch('\b'); clrtoeol(); } } else addstr(unctrl(*sp++)); refresh(); } *sp = '\0'; leaveok(Board, TRUE); if ((outf = fopen(buf, "w")) == NULL) perror(buf); setbuf(outf, 0); } Debug = !Debug; break; } /* FALLTHROUGH */ default: error("unknown command: %s", unctrl(c)); break; } } ret: leaveok(Board, TRUE); } # define COMP_STRT 20 # define CARD_STRT 2 prboard() { reg PLAY *pp; reg int i, j, k, temp; for (k = 0; k < 2; k++) { pp = &Player[k]; temp = k * COMP_STRT + CARD_STRT; for (i = 0; i < NUM_SAFE; i++) if (pp->safety[i] == S_PLAYED) { mvaddstr(i, temp, C_name[i + S_CONV]); if (pp->coups[i]) mvaddch(i, temp - CARD_STRT, '*'); } mvprintw(14, temp, C_fmt, C_name[pp->battle]); mvprintw(16, temp, C_fmt, C_name[pp->speed]); for (i = C_25; i <= C_200; ) { reg char *name; reg int end; name = C_name[i]; temp = k * 40; end = pp->nummiles[i++]; for (j = 0; j < end; j++) mvwaddstr(Miles, i, (j << 2) + temp, name); } } prscore(TRUE); temp = CARD_STRT; pp = &Player[PLAYER]; for (i = 0; i < HAND_SZ; i++) mvprintw(i + 6, temp, C_fmt, C_name[pp->hand[i]]); mvprintw(6, COMP_STRT + CARD_STRT, "%2d", Topcard - Deck); mvprintw(8, COMP_STRT + CARD_STRT, C_fmt, C_name[Discard]); if (End == 1000) { static char ext[] = "Extension"; stand(EXT_Y, EXT_X, ext); } wrefresh(Board); wrefresh(Miles); wrefresh(Score); } /* * Put str at (y,x) in standout mode */ stand(y, x, str) reg int y, x; reg char *str; { standout(); mvaddstr(y, x, str); standend(); return TRUE; } prscore(for_real) reg bool for_real; { reg PLAY *pp; reg int x; reg char *Score_fmt = "%4d"; stdscr = Score; for (pp = Player; pp < &Player[2]; pp++) { x = (pp - Player) * 6 + 21; mvprintw(1, x, Score_fmt, pp->mileage); mvprintw(2, x, Score_fmt, pp->safescore); if (pp->safescore == 400) mvaddstr(3, x + 1, "300"); else mvaddch(3, x + 3, '0'); mvprintw(4, x, Score_fmt, pp->coupscore); if (WIndow == W_FULL || Finished) { #ifdef EXTRAP if (for_real) finalscore(pp); else extrapolate(pp); #else finalscore(pp); #endif mvprintw(11, x, Score_fmt, pp->hand_tot); mvprintw(13, x, Score_fmt, pp->total); mvprintw(14, x, Score_fmt, pp->games); } else { mvprintw(6, x, Score_fmt, pp->hand_tot); mvprintw(8, x, Score_fmt, pp->total); mvprintw(9, x, Score_fmt, pp->games); } } stdscr = Board; } FlushInput () { raw(); /* Flush input */ noraw(); }