|
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 p
Length: 3768 (0xeb8) Types: TextFile Names: »person.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Dots/person.c«
/* PERSON.C */ #include "dots.h" #define ever (;;) personmove() { char c; int fd = ((mover == US) ? 0 : sd); Cursor(xposit, yposit); /* do this so raw mode won't destroy screen */ raw(); noraw(); /* flush type-ahead */ bottom_line(); do { for ever { if (read(fd, &c, 1) <= 0) onintr(SIGPIPE); /* someone terminated */ if (mode == TWOPLAYER) if (c == '!' || c == 'S' || c == '.' || c == '/' || c == 'Q') continue; else if (c != 'r' && fd != sd) (void) write(sd, &c, 1); /* send info to other player */ if (c == '\n' || c == ' ') break; Cursor(xposit, yposit); switch (c) { case ESC: if (mode == TWOPLAYER) talk(); when '?': if (mover == US) readinst(0), drawboard(); if (mode == TWOPLAYER) if (mover == THEM) { msg("%s is reading the instructions.", opponent); if (read(fd, &c, 1) <= 0) /* wait for a char */ onintr(SIGPIPE); } else (void) write(sd, &c, sizeof(c)); bottom_line(); when '!': if (shell() == -1) perror("shell"); when 'Q': if (mode != TWOPLAYER) end_of_game(); else onintr(SIGPIPE); when 'S': Save_game(); when 'r': redraw(); when '7': case 'q': case 'y': if (is_on_board(xposit - 1, yposit - 1)) xposit -= 1, yposit -= 1; when '8': case 'w': case 'k': if (is_on_board(xposit, yposit - 2)) yposit -= 2; when '9': case 'e': case 'u': if (is_on_board(xposit + 1, yposit - 1)) xposit += 1, yposit -= 1; when '4': case 'a': case 'h': if (is_on_board(xposit - 2, yposit)) xposit -= 2; when '6': case 'd': case 'l': if (is_on_board(xposit + 2, yposit)) xposit += 2; when '1': case 'z': case 'b': if (is_on_board(xposit - 1, yposit + 1)) xposit -= 1, yposit += 1; when '2': case 'x': case 'j': if (is_on_board(xposit, yposit + 2)) yposit += 2; when '3': case 'c': case 'n': if (is_on_board(xposit + 1, yposit + 1)) xposit += 1, yposit += 1; when '.': chlevel(c); } Cursor(xposit, yposit); } if (board[xposit][yposit] == USED && mover == US) { mvaddstr(LINES - 1, 0, "It's taken. "); Cursor(xposit, yposit); } } while (board[xposit][yposit] == USED); return entermove(); } #define Addch(c) addch(c); if (mode == TWOPLAYER) (void) write(sd, &c, 1) #define backspace() Addch(back_char); Addch(space); Addch(back_char); refresh() Getstr(String, length) char *String; int length; { char garbage, space = ' ', back_char = erase_char; int count = 0; while ((garbage = getchar()) != '\n' && garbage != 4 && garbage != ESC) if (garbage == _tty.sg_erase && count) { backspace(); String[count--] = 0; } else if (garbage == _tty.sg_kill && count) do { backspace(); } while (--count); else if (garbage == '\027' && count) /* ^W */ do { backspace(); String[count--] = 0; if (!count || (String[count-1]==' ' && !isspace(String[count]))) break; } while (count); else if (count == length) fputc('\007', stderr); else if (garbage > 31 && garbage != 127) { String[count++] = garbage; Addch(garbage); refresh(); } String[count] = 0; } talk() { char c, dummy[128], cr = '\n'; int nread = 0; if (mover == US) { move(LINES - 3, 15); clrtoeol(), refresh(); Getstr(dummy, COLS - 16); (void) write(sd, &cr, 1); } else { move(LINES - 2, strlen(opponent) + 3 + strlen("Messages: ")); clrtoeol(); refresh(); while ((nread = read(sd, &c, 1)) > 0 && c != cr) addch(c), refresh(); if (nread == -1) oops("bad socket read"); } }