|
|
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.3 $ on $Date: 86/11/26 12:09:54 $ ! 24: * $Source: /users/faustus/xchess/RCS/jail.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: */ ! 30: ! 31: #include "xchess.h" ! 32: ! 33: #include "pawn_small.bitmap" ! 34: #include "rook_small.bitmap" ! 35: #include "knight_small.bitmap" ! 36: #include "bishop_small.bitmap" ! 37: #include "queen_small.bitmap" ! 38: #include "king_small.bitmap" ! 39: ! 40: #include "pawn_small_outline.bitmap" ! 41: #include "rook_small_outline.bitmap" ! 42: #include "knight_small_outline.bitmap" ! 43: #include "bishop_small_outline.bitmap" ! 44: #include "queen_small_outline.bitmap" ! 45: #include "king_small_outline.bitmap" ! 46: ! 47: static bool pos[32]; ! 48: ! 49: static piecetype pcs[] = { KING, QUEEN, ROOK, ROOK, BISHOP, BISHOP, KNIGHT, ! 50: KNIGHT, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN } ; ! 51: ! 52: extern int piecepos(); ! 53: extern char *bitsget(); ! 54: ! 55: void ! 56: jail_init(win) ! 57: windata *win; ! 58: { ! 59: int i; ! 60: ! 61: for (i = 0; i < 32; i++) ! 62: pos[i] = false; ! 63: jail_draw(win); ! 64: return; ! 65: } ! 66: ! 67: #define JAIL_HEADER "Captured Pieces" ! 68: ! 69: void ! 70: jail_draw(win) ! 71: windata *win; ! 72: { ! 73: int i; ! 74: char *bits; ! 75: Pixmap tmpPM; ! 76: piece p; ! 77: ! 78: i = XTextWidth(win->large, JAIL_HEADER, strlen(JAIL_HEADER)); ! 79: XSetFont(win->display, DefaultGC(win->display, 0), ! 80: win->large->fid); ! 81: XSetForeground(win->display, DefaultGC(win->display, 0), ! 82: win->textcolor.pixel); ! 83: XSetBackground(win->display, DefaultGC(win->display, 0), ! 84: win->textback.pixel); ! 85: ! 86: XDrawImageString(win->display, win->jailwin, ! 87: DefaultGC(win->display, 0), ! 88: (JAIL_WIDTH - i) / 2, 20, JAIL_HEADER, ! 89: strlen(JAIL_HEADER)); ! 90: ! 91: XSetForeground(win->display, DefaultGC(win->display, 0), ! 92: win->blackpiece.pixel); ! 93: XSetBackground(win->display, DefaultGC(win->display, 0), ! 94: win->textback.pixel); ! 95: XSetFillStyle(win->display, DefaultGC(win->display, 0), ! 96: FillSolid); ! 97: XSetFunction(win->display, DefaultGC(win->display, 0), ! 98: GXcopy); ! 99: ! 100: for (i = 0; i < 16; i++) ! 101: if (pos[i]) { ! 102: p.color = WHITE; ! 103: p.type = pcs[i]; ! 104: bits = bitsget(&p); ! 105: tmpPM = XCreateBitmapFromData(win->display, ! 106: win->jailwin, bits, ! 107: 32, 32); ! 108: ! 109: XCopyPlane(win->display, tmpPM, win->jailwin, ! 110: DefaultGC(win->display, 0), ! 111: 0, 0, 32, 32, ! 112: 5 + (i % 8) * 32, 25 + (i / 8) * 32, ! 113: 1); ! 114: XFreePixmap(win->display, tmpPM); ! 115: } else { ! 116: XFillRectangle(win->display, win->jailwin, ! 117: DefaultGC(win->display, 0), ! 118: 5 + (i % 8) * 32, ! 119: 25 + (i / 8) * 32, ! 120: 32, 32); ! 121: } ! 122: for (i = 0; i < 16; i++) ! 123: if (pos[i + 16]) { ! 124: p.color = BLACK; ! 125: p.type = pcs[i]; ! 126: bits = bitsget(&p); ! 127: tmpPM = XCreateBitmapFromData(win->display, ! 128: win->jailwin, bits, ! 129: 32, 32); ! 130: ! 131: XCopyPlane(win->display, tmpPM, win->jailwin, ! 132: DefaultGC(win->display, 0), ! 133: 0, 0, 32, 32, ! 134: 5 + (i % 8) * 32, 94 + (i / 8) * 32, ! 135: 1); ! 136: XFreePixmap(win->display, tmpPM); ! 137: } else { ! 138: XFillRectangle(win->display, win->jailwin, ! 139: DefaultGC(win->display, 0), ! 140: 5 + (i % 8) * 32, 94 + (i / 8) * 32, ! 141: 32, 32); ! 142: } ! 143: ! 144: return; ! 145: } ! 146: ! 147: void ! 148: jail_add(p) ! 149: piece *p; ! 150: { ! 151: int i = piecepos(p, false); ! 152: char *bits; ! 153: Pixmap tmpPM; ! 154: ! 155: pos[i] = true; ! 156: ! 157: bits = bitsget(p); ! 158: ! 159: XSetState(win1->display, DefaultGC(win1->display, 0), ! 160: win1->blackpiece.pixel, ! 161: win1->textback.pixel, ! 162: GXcopy, ! 163: AllPlanes); ! 164: ! 165: tmpPM = XCreateBitmapFromData(win1->display, ! 166: win1->jailwin, bits, ! 167: 32, 32); ! 168: ! 169: XCopyPlane(win1->display, tmpPM, win1->jailwin, ! 170: DefaultGC(win1->display, 0), ! 171: 0, 0, 32, 32, ! 172: 5 + (i % 8) * 32, ((i >= 16) ? 30 : 25) + (i / 8) * 32, ! 173: 1); ! 174: XFreePixmap(win1->display, tmpPM); ! 175: ! 176: if (!oneboard) { ! 177: XSetState(win2->display, DefaultGC(win2->display, 0), ! 178: win2->blackpiece.pixel, ! 179: win2->textback.pixel, ! 180: GXcopy, ! 181: AllPlanes); ! 182: ! 183: ! 184: tmpPM = XCreateBitmapFromData(win2->display, ! 185: win2->jailwin, bits, ! 186: 32, 32); ! 187: ! 188: XCopyPlane(win2->display, tmpPM, win2->jailwin, ! 189: DefaultGC(win2->display, 0), ! 190: 0, 0, 32, 32, ! 191: 5 + (i % 8) * 32, ((i >= 16) ? 30 : 25) + (i / 8) * 32, ! 192: 1); ! 193: XFreePixmap(win2->display, tmpPM); ! 194: } ! 195: ! 196: return; ! 197: } ! 198: ! 199: void ! 200: jail_remove(p) ! 201: piece *p; ! 202: { ! 203: int i = piecepos(p, true); ! 204: ! 205: pos[i] = false; ! 206: ! 207: ! 208: XSetForeground(win1->display, ! 209: DefaultGC(win1->display, 0), ! 210: win1->blackpiece.pixel); ! 211: XSetBackground(win1->display, ! 212: DefaultGC(win1->display, 0), ! 213: win1->textback.pixel); ! 214: XSetFillStyle(win1->display, ! 215: DefaultGC(win1->display, 0), ! 216: FillSolid); ! 217: ! 218: XFillRectangle(win1->display, win1->jailwin, ! 219: DefaultGC(win1->display, 0), ! 220: 5 + (i % 8) * 32, ! 221: ((i >= 16) ? 30 : 25) + (i / 8) * 32, ! 222: 32, 32); ! 223: ! 224: if (!oneboard) { ! 225: XSetForeground(win2->display, ! 226: DefaultGC(win2->display, 0), ! 227: win2->blackpiece.pixel); ! 228: XSetBackground(win2->display, ! 229: DefaultGC(win2->display, 0), ! 230: win2->textback.pixel); ! 231: XSetFillStyle(win2->display, ! 232: DefaultGC(win2->display, 0), ! 233: FillSolid); ! 234: ! 235: XFillRectangle(win2->display, win2->jailwin, ! 236: DefaultGC(win2->display, 0), ! 237: 5 + (i % 8) * 32, ! 238: ((i >= 16) ? 30 : 25) + (i / 8) * 32, ! 239: 32, 32); ! 240: } ! 241: ! 242: return; ! 243: } ! 244: ! 245: static char *bitsget(p) ! 246: piece *p; ! 247: { ! 248: char *bits; ! 249: ! 250: switch (p->type) { ! 251: case PAWN: ! 252: bits = (p->color == WHITE) ? pawn_small_outline_bits : ! 253: pawn_small_bits; ! 254: break; ! 255: ! 256: case ROOK: ! 257: bits = (p->color == WHITE) ? rook_small_outline_bits : ! 258: rook_small_bits; ! 259: break; ! 260: ! 261: case KNIGHT: ! 262: bits = (p->color == WHITE) ? knight_small_outline_bits : ! 263: knight_small_bits; ! 264: break; ! 265: ! 266: case BISHOP: ! 267: bits = (p->color == WHITE) ? bishop_small_outline_bits : ! 268: bishop_small_bits; ! 269: break; ! 270: ! 271: case QUEEN: ! 272: bits = (p->color == WHITE) ? queen_small_outline_bits : ! 273: queen_small_bits; ! 274: break; ! 275: ! 276: case KING: ! 277: bits = (p->color == WHITE) ? king_small_outline_bits : ! 278: king_small_bits; ! 279: break; ! 280: } ! 281: return (bits); ! 282: } ! 283: ! 284: static int ! 285: piecepos(p, there) ! 286: piece *p; ! 287: bool there; ! 288: { ! 289: int i, base = (p->color == WHITE) ? 0 : 16; ! 290: ! 291: switch (p->type) { ! 292: case PAWN: ! 293: for (i = base + 8; (i < base + 15) && pos[i]; i++) ! 294: ; ! 295: if (there && !pos[i]) ! 296: i--; ! 297: break; ! 298: ! 299: case KING: ! 300: /* Hmm... */ ! 301: i = base; ! 302: break; ! 303: ! 304: case QUEEN: ! 305: i = base + 1; ! 306: break; ! 307: ! 308: case ROOK: ! 309: i = base + 2; ! 310: if ((there && pos[i + 1]) || (!there && pos[i])) ! 311: i++; ! 312: break; ! 313: ! 314: case BISHOP: ! 315: i = base + 4; ! 316: if ((there && pos[i + 1]) || (!there && pos[i])) ! 317: i++; ! 318: break; ! 319: ! 320: case KNIGHT: ! 321: i = base + 6; ! 322: if ((there && pos[i + 1]) || (!there && pos[i])) ! 323: i++; ! 324: break; ! 325: } ! 326: return (i); ! 327: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.