|
|
1.1 ! root 1: ! 2: /* This file contains code for X-CHESS. ! 3: Copyright (C) 1986 Free Software Foundation, Inc. ! 4: ! 5: This file is part of X-CHESS. ! 6: ! 7: X-CHESS is distributed in the hope that it will be useful, ! 8: but WITHOUT ANY WARRANTY. No author or distributor ! 9: accepts responsibility to anyone for the consequences of using it ! 10: or for whether it serves any particular purpose or works at all, ! 11: unless he says so in writing. Refer to the X-CHESS General Public ! 12: License for full details. ! 13: ! 14: Everyone is granted permission to copy, modify and redistribute ! 15: X-CHESS, but only under the conditions described in the ! 16: X-CHESS General Public License. A copy of this license is ! 17: supposed to have been given to you along with X-CHESS so you ! 18: can know your rights and responsibilities. It should be in a ! 19: file named COPYING. Among other things, the copyright notice ! 20: and this notice must be preserved on all copies. */ ! 21: ! 22: ! 23: /* RCS Info: $Revision: 1.4 $ on $Date: 86/11/23 17:18:20 $ ! 24: * $Source: /users/faustus/xchess/RCS/record.c,v $ ! 25: * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group ! 26: * Permission is granted to do anything with this code except sell it ! 27: * or remove this message. ! 28: * ! 29: * Deal with recording moves. ! 30: */ ! 31: ! 32: #include "xchess.h" ! 33: ! 34: #undef smartass ! 35: ! 36: bool record_english = true; ! 37: char *record_file = DEF_RECORD_FILE; ! 38: int movenum = 0; ! 39: bool saveflag = false; ! 40: ! 41: static char *colnames[] = { "qr", "qn", "qb", "q", "k", "kb", "kn", "kr" } ; ! 42: static char *pcnames[] = { "P", "R", "N", "B", "Q", "K" } ; ! 43: ! 44: static char *movestring(); ! 45: static char *tstring(); ! 46: static FILE *backup; ! 47: ! 48: #define RECORD_HEADER "\n1 XChess Game Record0\n" ! 49: ! 50: void ! 51: record_init(win) ! 52: windata *win; ! 53: { ! 54: int i; ! 55: ! 56: i = XTextWidth(win->medium, RECORD_HEADER, ! 57: sizeof(RECORD_HEADER) - 1); ! 58: i = (40 * win->small->max_bounds.width - i * ! 59: win->medium->max_bounds.width) / ! 60: win->medium->max_bounds.width / 2; ! 61: TxtGrab(win->display, win->recwin, "xchess", win->small, win->textback.pixel, ! 62: win->textcolor.pixel, win->cursorcolor.pixel); ! 63: TxtAddFont(win->display, win->recwin, 1, win->medium, win->textcolor.pixel); ! 64: for (; i > 0; i++) ! 65: TxtWriteStr(win->display, win->recwin, " "); ! 66: TxtWriteStr(win->display, win->recwin, RECORD_HEADER); ! 67: ! 68: if (saveflag) { ! 69: if (!(backup = fopen(record_file, "w"))) { ! 70: perror(record_file); ! 71: saveflag = false; ! 72: } else { ! 73: fprintf(backup, "X Chess -- %s\n", datestring()); ! 74: if (dispname2) ! 75: fprintf(backup, "\tWhite on %s, black on %s\n", ! 76: dispname1, dispname2); ! 77: else ! 78: fprintf(backup, "\tGame played on %s\n", ! 79: dispname1); ! 80: fprintf(backup, "\t%s\n", record_english ? "english" : ! 81: "algebraic"); ! 82: fflush(backup); ! 83: } ! 84: } ! 85: ! 86: movenum = 0; ! 87: return; ! 88: } ! 89: ! 90: void ! 91: record_reset() ! 92: { ! 93: TxtWriteStr(win1->display, win1->recwin, "\n\n1 New Game0\n\n"); ! 94: if (!oneboard) { ! 95: TxtWriteStr(win2->display, win2->recwin, "\n\n1 New Game0\n\n"); ! 96: } ! 97: movenum = 0; ! 98: if (saveflag) { ! 99: fprintf(backup, "\n\nNew Game\n\n"); ! 100: fflush(backup); ! 101: } ! 102: return; ! 103: } ! 104: ! 105: void ! 106: record_end(s) ! 107: char *s; ! 108: { ! 109: char buf[BSIZE]; ! 110: ! 111: sprintf(buf, "\n%s\n", s); ! 112: TxtWriteStr(win1->display, win1->recwin, s); ! 113: if (!oneboard) { ! 114: TxtWriteStr(win2->display, win2->recwin, s); ! 115: } ! 116: if (saveflag) { ! 117: fprintf(backup, "\n%s\n", s); ! 118: fprintf(backup, "Time: white: %s, ", tstring(whiteseconds)); ! 119: fprintf(backup, "black: %s\n", tstring(blackseconds)); ! 120: fclose(backup); ! 121: } ! 122: return; ! 123: } ! 124: ! 125: void ! 126: record_save() ! 127: { ! 128: move *m; ! 129: FILE *fp; ! 130: int i; ! 131: char *s; ! 132: ! 133: if (!(fp = fopen(record_file, "w"))) { ! 134: perror(record_file); ! 135: return; ! 136: } ! 137: fprintf(fp, "X Chess -- %s\n", datestring()); ! 138: if (dispname2) ! 139: fprintf(fp, "\tWhite on %s, black on %s\n", ! 140: dispname1, dispname2); ! 141: else ! 142: fprintf(fp, "\tGame played on %s\n", dispname1); ! 143: fprintf(fp, "\t%s\n", record_english ? "english" : "algebraic"); ! 144: ! 145: for (m = moves, i = 1; m; i++) { ! 146: s = movestring(m); ! 147: fprintf(fp, "%2d. %-16s ", i, s); ! 148: m = m->next; ! 149: if (m) ! 150: s = movestring(m); ! 151: else ! 152: s = ""; ! 153: fprintf(fp, "%s\n", s); ! 154: if (m) ! 155: m = m->next; ! 156: } ! 157: fclose(fp); ! 158: return; ! 159: } ! 160: ! 161: void ! 162: record_move(m) ! 163: move *m; ! 164: { ! 165: char *s, buf[BSIZE]; ! 166: ! 167: s = movestring(m); ! 168: ! 169: if (m->piece.color == WHITE) { ! 170: movenum++; ! 171: sprintf(buf, "%2d. %-16s ", movenum, s); ! 172: } else { ! 173: sprintf(buf, "%s\n", s); ! 174: } ! 175: TxtWriteStr(win1->display, win1->recwin, buf); ! 176: if (!oneboard) { ! 177: TxtWriteStr(win2->display, win2->recwin, buf); ! 178: } ! 179: if (saveflag) { ! 180: fprintf(backup, "%s", buf); ! 181: fflush(backup); ! 182: } ! 183: ! 184: return; ! 185: } ! 186: ! 187: void ! 188: record_back() ! 189: { ! 190: extern move *lastmove; ! 191: move *m = lastmove; ! 192: char *s = movestring(m); ! 193: char buf[BSIZE]; ! 194: long i; ! 195: ! 196: if (m->piece.color == WHITE) { ! 197: sprintf(buf, "%2d. %-16s ", movenum, s); ! 198: } else { ! 199: sprintf(buf, "%s\n", s); ! 200: } ! 201: s = buf; ! 202: for (i = 0; *s != '\0'; i++) ! 203: *s++ = ''; /* control H, backspace */ ! 204: ! 205: TxtWriteStr(win1->display, win1->recwin, buf); ! 206: if (!oneboard) { ! 207: TxtWriteStr(win2->display, win2->recwin, buf); ! 208: } ! 209: ! 210: if (nexttomove == BLACK) ! 211: movenum--; ! 212: if (saveflag) { ! 213: fseek(backup, -i, 1); ! 214: fflush(backup); ! 215: } ! 216: ! 217: return; ! 218: } ! 219: ! 220: static char * ! 221: movestring(m) ! 222: move *m; ! 223: { ! 224: int fy, ty; ! 225: static char buf[BSIZE]; ! 226: ! 227: if (!record_english || (m->piece.color == WHITE)) { ! 228: fy = SIZE - m->fromy; ! 229: ty = SIZE - m->toy; ! 230: } else { ! 231: fy = m->fromy + 1; ! 232: ty = m->toy + 1; ! 233: } ! 234: ! 235: switch (m->type) { ! 236: case MOVE: ! 237: if (record_english) ! 238: sprintf(buf, "%s/%s%d-%s%d%s", pcnames[(int) m->piece. ! 239: type], colnames[m->fromx], fy, ! 240: colnames[m->tox], ty, m->check ? "+" : ! 241: ""); ! 242: else ! 243: sprintf(buf, "%c%d%c%d", 'a' + m->fromx, fy, 'a' + ! 244: m->tox, ty); ! 245: break; ! 246: case CAPTURE: ! 247: if (record_english) ! 248: sprintf(buf, "%s/%s%dx%s/%s%d%s%s", ! 249: pcnames[(int) m->piece.type], ! 250: colnames[m->fromx], fy, ! 251: pcnames[(int) m->taken.type], ! 252: colnames[m->tox], ty, ! 253: m->enpassant ? "e.p." : "", ! 254: m->check ? "+" : ""); ! 255: else ! 256: sprintf(buf, "%c%d%c%d", 'a' + m->fromx, fy, 'a' + ! 257: m->tox, ty); ! 258: break; ! 259: ! 260: case KCASTLE: ! 261: if (record_english) ! 262: sprintf(buf, "O-O%s", m->check ? "ch" : ""); ! 263: else if (m->piece.color == WHITE) ! 264: strcpy(buf, "e1g1"); ! 265: else ! 266: strcpy(buf, "e8g8"); ! 267: break; ! 268: ! 269: case QCASTLE: ! 270: if (record_english) ! 271: sprintf(buf, "O-O-O%s", m->check ? "ch" : ""); ! 272: else if (m->piece.color == WHITE) ! 273: strcpy(buf, "e1c1"); ! 274: else ! 275: strcpy(buf, "e8c8"); ! 276: break; ! 277: ! 278: default: ! 279: sprintf(buf, "something strange"); ! 280: break; ! 281: } ! 282: if ((m->piece.type == PAWN) && (((m->piece.color == BLACK) && ! 283: (m->toy == 7)) || ((m->piece.color == WHITE) && ! 284: (m->toy == 0)))) ! 285: strcat(buf, "(Q)"); ! 286: ! 287: #ifdef smartass ! 288: if (!(random() % 50)) ! 289: strcat(buf, "?"); ! 290: else if (!(random() % 50)) ! 291: strcat(buf, "!"); ! 292: else if (!(random() % 500)) ! 293: strcat(buf, "???"); ! 294: else if (!(random() % 500)) ! 295: strcat(buf, "!!!"); ! 296: #endif smartass ! 297: ! 298: return (buf); ! 299: } ! 300: ! 301: static char * ! 302: tstring(s) ! 303: int s; ! 304: { ! 305: static char buf[64]; ! 306: ! 307: if (s > 3600) ! 308: sprintf(buf, "%dh %dm %ds", s / 3600, (s % 3600) / 60, s % 60); ! 309: else if (s > 60) ! 310: sprintf(buf, "%dm %ds", (s % 3600) / 60, s % 60); ! 311: else ! 312: sprintf(buf, "%ds", s); ! 313: return (buf); ! 314: } ! 315:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.