billr@saab.CNA.TEK.COM (Bill Randle) (11/02/90)
Submitted-by: Rich Burridge <rburridge@sun.COM>
Posting-number: Volume 11, Issue 56
Archive-name: reve/Part05
Environment: SunView, XView, X11, termcap
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 5 (of 7)."
# Contents: FILES boardstuff.c color.h events.c
# images/button.normal.icon rev_iycp.c sunview.c
# Wrapped by billr@saab on Thu Nov 1 14:02:53 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'FILES' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'FILES'\"
else
echo shar: Extracting \"'FILES'\" \(3095 characters\)
sed "s/^X//" >'FILES' <<'END_OF_FILE'
X
X@(#)FILES 1.3 90/10/18
X
XThis file describes all the files that make up the Reve distribution.
X
XDirectory reve: an othello game.
X--------------------------------
X
Xboardstuff.c - various board manipulation routines.
Xevents.c - event handling procedures.
Xitems.c - procedures for manipulating reve panel items.
Xmakemove.c - interface to the computer strategy routines.
Xmain.c - includes variable declarations and main().
Xprocs.c - procedures associated with the panel items.
X
Xrev_eval.c - reve evaluation function.
Xrev_ip.c - return a move and a note for a given color.
Xrev_iycp.c - reve "fast" alpha-beta pruning routines.
X
Xcolor.h - colormap definitions.
Xextern.h - external declaractions.
Ximages.h - include file for all graphic images.
Xreve.h - macro and constant definitions.
Xpatchlevel.h - current patchlevel for this release of reve.
X
XCHANGES - change history. Updated with each new patch.
XREADME - describes what reve is, and how to get started.
XTODO - bugs and suggested enhancements. Volunteers?
Xreve.6 - the reve manual page (troff/nroff -man format).
Xreve.man - plain text version of the reve manual pages.
XMANIFEST - tells you what archive part each file was in.
XFILES - what you're reading now.
Xreve.edge1 - first half of the Reve edge stability table.
Xreve.edge2 - second half of the Reve edge stability table.
XMakefile.dist - master Makefile used to build mp on Unix systems.
X
Xsunview.c - Sun SunView graphics routines.
Xtty.c - dumb tty "graphics" routines.
Xx11.c - X11 (Xlib) graphics routines.
Xxview.c - X11 XView tolkit graphics routines.
X
XSub-directory images: image files used with the graphics versions of reve.
X--------------------------------------------------------------------------
Ximages/black.icon - black reve piece.
Ximages/reve.icon - reve icon (monochrome screens and XView).
Ximages/reve.color.icon - reve icon (color screens).
Ximages/white.icon - white reve piece.
Ximages/button.invert.icon - button panel item in inverted mode.
Ximages/button.normal.icon - button panel item in normal mode.
Ximages/button.stencil.icon - stencil for normal/inverted button panel items.
Ximages/cycle.glyph.icon - cycle panel item in normal mode.
Ximages/cycle.linvert.icon - cycle panel item with left side inverted.
Ximages/cycle.rinvert.icon - cycle panel item with right side inverted.
Ximages/cycle.stencil.icon - stencil for normal/inverted cycle panel items.
Ximages/hglass.cursor - hour glass cursor for computer move.
Ximages/nocur.cursor - no cursor when piece is being dragged.
END_OF_FILE
if test 3095 -ne `wc -c <'FILES'`; then
echo shar: \"'FILES'\" unpacked with wrong size!
fi
# end of 'FILES'
fi
if test -f 'boardstuff.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'boardstuff.c'\"
else
echo shar: Extracting \"'boardstuff.c'\" \(12414 characters\)
sed "s/^X//" >'boardstuff.c' <<'END_OF_FILE'
X/*LINTLIBRARY*/
X
X/* @(#)boardstuff.c 1.9 90/10/20
X *
X * Various board routines used by reve.
X *
X * Copyright (C) 1990 - Rich Burridge & Yves Gallot.
X * All rights reserved.
X *
X * Permission is given to distribute these sources, as long as the
X * introductory messages are not removed, and no monies are exchanged.
X *
X * You are forbidden from using Reve as is, or in a modified state, in
X * any tournaments, without the permission of the authors.
X *
X * No responsibility is taken for any errors on inaccuracies inherent
X * either to the comments or the code of this program, but if reported
X * (see README file), then an attempt will be made to fix them.
X */
X
X#include <stdio.h>
X#include <ctype.h>
X
X#ifndef SYSV
X#include <sys/time.h>
X#endif /*SYSV*/
X
X#include "color.h"
X#include "reve.h"
X#include "extern.h"
X
X
Xvoid
Xanimate_move(move)
Xint move ;
X{
X int x0, y0, x1, y1, x, y, dx, dy, ctr ;
X
X lock_screen(IS_ON) ;
X get_xy(move, &x1, &y1) ;
X dx = x1 ;
X dy = y1 ;
X if (x1 > y1)
X {
X ctr = dx / 2 ;
X x = BBORDER ;
X y = BBORDER ;
X draw_piece(WHITE, x, CY+y, RINV) ;
X while (x < x1)
X {
X#ifndef SYSV
X set_timer() ;
X#endif /*SYSV*/
X x0 = x ;
X y0 = y ;
X x += move_delta ;
X if ((ctr -= dy) < 0)
X {
X ctr += dx ;
X y += move_delta ;
X }
X draw_piece(WHITE, x, CY+y, RINV) ;
X draw_piece(WHITE, x0, CY+y0, RINV) ;
X#ifndef SYSV
X nap_upto(1) ;
X#endif /*SYSV*/
X }
X draw_piece(WHITE, x, CY+y, RINV) ;
X }
X else
X {
X ctr = dy / 2 ;
X x = BBORDER ;
X y = BBORDER ;
X draw_piece(WHITE, x, CY+y, RINV) ;
X while (y < y1)
X {
X#ifndef SYSV
X set_timer() ;
X#endif /*SYSV*/
X x0 = x ;
X y0 = y ;
X y += move_delta ;
X if ((ctr -= dx) < 0)
X {
X ctr += dy ;
X x += move_delta ;
X }
X draw_piece(WHITE, x, CY+y, RINV) ;
X draw_piece(WHITE, x0, CY+y0, RINV) ;
X#ifndef SYSV
X nap_upto(1) ;
X#endif /*SYSV*/
X }
X draw_piece(WHITE, x, CY+y, RINV) ;
X }
X lock_screen(IS_OFF) ;
X}
X
X
X/* This routine checks to see if a move can be made for this player.
X * If not, various checks are made to see if the game is finished.
X * Return value indicates if a move can be made.
X */
X
Xcheck(player)
Xint player ;
X{
X if ((!count(&board, BLACK)) || (!count(&board, WHITE)) ||
X ((count(&board, BLACK) + count(&board, WHITE)) == 64))
X {
X who_wins() ;
X last_cmode = cmode ; /* Save previous value in case of undo. */
X cmode = GAME_OVER ;
X message(PANEL_MES, "Game over") ;
X return(FALSE) ;
X }
X if ((move = valid_move(&board, player)) == FALSE)
X {
X SPRINTF(line, "%s is forced to pass",
X (player == BLACK) ? "Black" : "White") ;
X message(PANEL_MES, line) ;
X set_turn(OPPONENT(player)) ;
X if ((move = valid_move(&board, OPPONENT(player))) == FALSE)
X {
X who_wins() ;
X last_cmode = cmode ;
X cmode = GAME_OVER ;
X message(PANEL_MES, "Game over") ;
X }
X return(FALSE) ;
X }
X return(TRUE) ;
X}
X
X
Xvoid
Xcomputer_move(player)
Xint player ;
X{
X for (;;)
X if (check(player) == TRUE)
X {
X think(player) ;
X if (check(OPPONENT(player)) == TRUE) break ;
X if (cmode == GAME_OVER) break ;
X }
X else
X {
X if (cmode != GAME_OVER) cmode = (enum cantype) ((int) cmode - 1) ;
X return ;
X }
X}
X
X
Xcount(board, player) /* Count the number of player pieces on the board. */
Xint player ;
XBOARD *board ;
X{
X int i, n ;
X
X n = 0 ;
X FOR_BOARD(i)
X if (board->square[i] == player) n++ ;
X return(n) ;
X}
X
X
Xvoid
Xdo_move(player)
Xint player ;
X{
X int taken ; /* Number of pieces flipped this go. */
X
X taken = formfliplist(move, player) ;
X update_board_image(player) ;
X SPRINTF(line, "%s took %d %s", (player == BLACK) ? "Black" : "White",
X taken, (taken == 1) ? "piece" : "pieces") ;
X message(PANEL_MES, line) ;
X}
X
X
Xformfliplist(move, player)
Xint move, player ;
X{
X int cnt, i, n, old_cnt ;
X
X old_cnt = count(&board, player) ;
X FOR_BOARD(i) old_board.square[i] = board.square[i] ;
X old_board.moves_left = board.moves_left ;
X domove(&old_board, move, &board, player) ;
X
X n = 63 - board.moves_left ;
X FOR_BOARD(i) moves[n].square[i] = board.square[i] ;
X moves[n].moves_left = board.moves_left ;
X moves[n].move = move ;
X moves[n].note = note ;
X moves[n].player = player ;
X
X cnt = count(&board, player) ;
X return(cnt - old_cnt - 1) ;
X}
X
X
Xvoid
Xinitboard() /* Initialise the othello board. */
X{
X static int ivals[4] = { 27, 28, 35, 36 } ;
X static int icolors[4] = { WHITE, BLACK, BLACK, WHITE } ;
X int i, j , n ;
X
X for (i = 0; i < 64; i++) moves[i].move = -1 ;
X for (n = 0; n < 4; n++)
X {
X FOR_BOARD(i) moves[n].square[i] = FREE ;
X for (j = 0; j <= n; j++) moves[n].square[ivals[j]] = icolors[j] ;
X moves[n].player = icolors[n] ;
X moves[n].move = ivals[n] ;
X moves[n].moves_left = 63 - n ;
X }
X
X FOR_BOARD(i) old_board.square[i] = board.square[i] = FREE ;
X board.square[27] = WHITE ;
X board.square[28] = BLACK ;
X board.square[35] = BLACK ;
X board.square[36] = WHITE ;
X board.moves_left = 60 ;
X}
X
X
Xvoid
Xload_game()
X{
X
X/* Read in a game from file, and setup internal variables accordingly.
X *
X * Notation in the games file is of the format:
X * 1, <C-4> - [ remarks field ]
X * 2, - <E-3> [ remarks field ]
X *
X * The move number is the field before the comma. This is just used as a
X * consistency check. Next is the black move or the white move (surronded
X * by '<' and '>' characters. Obviously only one piece moves per go, and
X * the '-' character is used to signify which piece doesn't move (in case
X * one player had to miss a turn.
X *
X * As each position is added, the board is redisplayed, and if the game is
X * not over, the next player can commence.
X */
X
X char buf[MAXLINE], col, *lptr, *mptr, row ;
X int moveno, n ;
X FILE *fp ;
X
X if ((fp = fopen(gamefile, "r")) == NULL)
X {
X SPRINTF(buf, "Couldn't open game file: %s", gamefile) ;
X message(PANEL_MES, buf) ;
X return ;
X }
X
X moveno = 0 ;
X initboard() ;
X last_move = -1 ;
X init_canvas() ;
X message(NOTES_MES, "") ;
X while (fgets(buf, MAXLINE, fp) != NULL)
X {
X if (buf[0] == '\n' || buf[0] == '#') continue ;
X moveno++ ;
X SSCANF(buf, "%d", &n) ;
X if (n != moveno || n > 60)
X {
X SPRINTF(buf, "Load error: incorrect move [%d] on line %d", n, move) ;
X message(PANEL_MES, buf) ;
X return ;
X }
X lptr = (char *) index(buf, '<') ;
X mptr = (char *) index(buf, '-') ;
X if (lptr == NULL || mptr == NULL)
X {
X SPRINTF(buf, "Load error: missing < or - on line %d", move) ;
X message(PANEL_MES, buf) ;
X return ;
X }
X if (lptr < mptr) next_player = BLACK ; /* Black move? */
X else next_player = WHITE ;
X SSCANF(lptr, "<%c-%c>", &row, &col) ;
X if (load_move(moveno, row, col) == 0)
X {
X SPRINTF(buf, "Load error: invalid move <%c-%c> on line %d",
X row, col, move) ;
X message(PANEL_MES, buf) ;
X return ;
X }
X SPRINTF(buf, "Loaded move %d for %s",
X moveno, (next_player == BLACK) ? "black" : "white") ;
X message(PANEL_MES, buf) ;
X }
X FCLOSE(fp) ;
X
X set_score() ;
X set_turn(OPPONENT(next_player)) ;
X
X cmode = (enum cantype) (OPPONENT(next_player) + 1) ;
X next_player = OPPONENT(next_player) ;
X if (check(next_player) == TRUE) return ;
X (void) check(OPPONENT(next_player)) ;
X}
X
X
Xload_move(n, col, row)
Xint n, col, row ;
X{
X int i, taken, x, y ;
X
X if (row < '1' || row > '8') return(0) ;
X if (isupper(col)) col = tolower(col) ;
X if (col < 'a' || col > 'h') return(0) ;
X move = (row - '1') * BOARD_SIZE + (col - 'a') ;
X if (legal(move, next_player, &board) == FALSE) return(0) ;
X taken = formfliplist(move, next_player) ;
X batch(IS_ON) ;
X FOR_BOARD(i)
X if (board.square[i] != old_board.square[i])
X {
X get_xy(i, &x, &y) ;
X draw_piece(next_player, x, CY+y, RSRC) ;
X }
X batch(IS_OFF) ;
X return(1) ;
X}
X
X
X#ifndef SYSV
Xvoid
Xnap_upto(n) /* Sleep upto n microseconds from start of timer. */
Xint n ;
X{
X struct timeval ctp ;
X struct timezone ctzp ;
X long elapsed ; /* Number of microseconds since timer started. */
X
X GETTIMEOFDAY(&ctp, &ctzp) ;
X elapsed = ((ctp.tv_usec - tp.tv_usec) +
X (ctp.tv_sec - tp.tv_sec) * 1000000L) / 1000 ;
X if (elapsed > n) return ;
X usleep((unsigned) (n - elapsed)) ;
X}
X#endif /*SYSV*/
X
X
Xvoid
Xsave_game()
X{
X
X/* Save the current game status to file.
X *
X * The notation in the saved games file is of the format:
X * 1, <C-4> - [ note : 12345 ]
X * 2, - <E-3> [ note : 0 ]
X *
X * The move number is the field before the comma. This is just used as a
X * consistency check. Next is the black move or the white move (surronded
X * by '<' and '>' characters. Obviously only one piece moves per go, and
X * the '-' character is used to signify which piece doesn't move (in case
X * one player had to miss a turn.
X */
X
X char buf[MAXLINE] ;
X int n ;
X FILE *fp ;
X
X if ((fp = fopen(gamefile, "w")) == NULL)
X {
X SPRINTF(buf, "Couldn't open game file: %s", gamefile) ;
X message(PANEL_MES, buf) ;
X return ;
X }
X
X for (n = 4; n < 64; n++)
X {
X if (moves[n].move == -1) break ;
X if (moves[n].player == BLACK)
X FPRINTF(fp, "%d, <%c-%c> - [ note : %ld ]\n",
X n-3, (moves[n].move % 8) + 'a',
X (moves[n].move >> 3) + '1', moves[n].note) ;
X else
X FPRINTF(fp, "%d, - <%c-%c> [ note : %ld ]\n",
X n-3, (moves[n].move % 8) + 'a',
X (moves[n].move >> 3) + '1', moves[n].note) ;
X }
X FCLOSE(fp) ;
X SPRINTF(buf, "Current game saved in %s", gamefile) ;
X message(PANEL_MES, buf) ;
X}
X
X
Xvoid
Xset_score()
X{
X SPRINTF(line, "Black: %2d, White: %2d",
X count(&board, BLACK), count(&board, WHITE)) ;
X message(SCORE_MES, line) ;
X}
X
X
Xvoid
Xset_turn(player)
Xint player ;
X{
X SPRINTF(line, "%s to move", (player == BLACK) ? "Black" : "White") ;
X message(TURN_MES, line) ;
X}
X
X
X#ifndef SYSV
Xvoid
Xset_timer()
X{
X struct timezone tzp ;
X
X GETTIMEOFDAY(&tp, &tzp) ;
X}
X#endif /*SYSV*/
X
X
Xvoid
Xshow_suggestion()
X{
X enum optype rop ;
X
X if (suggestion != -1)
X {
X rop = RCLR ;
X color = (iscolor[(int) cur_dpyno]) ? C_LBROWN : C_WHITE ;
X if (iscolor[(int) cur_dpyno]) rop = RSRC ;
X draw_line(suggest_x-5, CY+suggest_y-5,
X suggest_x+5, CY+suggest_y+5, rop, color) ;
X draw_line(suggest_x-5, CY+suggest_y+5,
X suggest_x+5, CY+suggest_y-5, rop, color) ;
X suggestion = -1 ;
X }
X}
X
X
Xvoid
Xupdate_board_image(player)
Xint player ;
X{
X int flips, i, piece, x, y ;
X
X show_suggestion() ;
X for (flips = 0; flips < 4; flips++)
X {
X batch(IS_ON) ;
X FOR_BOARD(i)
X {
X if (board.square[i] != old_board.square[i])
X {
X get_xy(i, &x, &y) ;
X if (i == move) piece = board.square[i] ;
X else
X piece = (flips % 2) ? board.square[i] : board.square[i] * -1 ;
X draw_piece(piece, x, CY+y, RSRC) ;
X }
X }
X batch(IS_OFF) ;
X PAUSE ;
X }
X set_score() ;
X set_turn(OPPONENT(player)) ;
X message(TURN_MES, line) ;
X if (show_notes)
X if ((player == BLACK && items[(int) BLACK_PLAYS].value == COMPUTER) ||
X (player == WHITE && items[(int) WHITE_PLAYS].value == COMPUTER))
X {
X SPRINTF(line, "%s: <%c-%c> note : %ld",
X (player == BLACK) ? "Black" : "White",
X (move & 7) + 'a', (move >> 3) + '1', note) ;
X message(NOTES_MES, line) ;
X }
X}
X
X
Xvoid
Xwho_wins()
X{
X int cs, ps ;
X
X ps = count(&board, WHITE) ;
X cs = count(&board, BLACK) ;
X if (ps > cs)
X {
X SPRINTF(line, "White wins %d-%d", ps, cs) ;
X message(SCORE_MES, line) ;
X }
X else if (ps == cs)
X {
X SPRINTF(line,"A tie %d-%d", ps, cs) ;
X message(SCORE_MES, line) ;
X }
X else
X {
X SPRINTF(line, "Black wins %d-%d", cs, ps) ;
X message(SCORE_MES, line) ;
X }
X}
END_OF_FILE
if test 12414 -ne `wc -c <'boardstuff.c'`; then
echo shar: \"'boardstuff.c'\" unpacked with wrong size!
fi
# end of 'boardstuff.c'
fi
if test -f 'color.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'color.h'\"
else
echo shar: Extracting \"'color.h'\" \(1518 characters\)
sed "s/^X//" >'color.h' <<'END_OF_FILE'
X
X/* @(#)color.h 1.3 90/09/24
X *
X * Colormap definitions used by reve.
X *
X * Copyright (C) 1990 - Rich Burridge & Yves Gallot.
X * All rights reserved.
X *
X * Permission is given to distribute these sources, as long as the
X * introductory messages are not removed, and no monies are exchanged.
X *
X * You are forbidden from using Reve as is, or in a modified state, in
X * any tournaments, without the permission of the authors.
X *
X * No responsibility is taken for any errors or inaccuracies inherent
X * either to the comments or the code of this program, but if reported
X * (see README file), then an attempt will be made to fix them.
X */
X
X#define OTH_COLOR "othcolor"
X#define OTH_COLORSIZE 8
X
X#define C_WHITE 0
X#define C_LGREY 1
X#define C_LBROWN 2
X#define C_BEIGE 3
X#define C_DBROWN 4
X#define C_BLACK 5
X#define C_SPARE6 6
X#define C_SPARE7 7
X
X#define oth_colorsetup(r, g, b) \
X (r)[C_WHITE] = 255 ; (g)[C_WHITE] = 255 ; (b)[C_WHITE] = 255 ; \
X (r)[C_LGREY] = 200 ; (g)[C_LGREY] = 200 ; (b)[C_LGREY] = 200 ; \
X (r)[C_LBROWN] = 200 ; (g)[C_LBROWN] = 150 ; (b)[C_LBROWN] = 100 ; \
X (r)[C_BEIGE] = 255 ; (g)[C_BEIGE] = 240 ; (b)[C_BEIGE] = 220 ; \
X (r)[C_DBROWN] = 185 ; (g)[C_DBROWN] = 145 ; (b)[C_DBROWN] = 100 ; \
X (r)[C_BLACK] = 0 ; (g)[C_BLACK] = 0 ; (b)[C_BLACK] = 0 ; \
X (r)[C_SPARE6] = 0 ; (g)[C_SPARE6] = 0 ; (b)[C_SPARE6] = 0 ; \
X (r)[C_SPARE7] = 0 ; (g)[C_SPARE7] = 0 ; (b)[C_SPARE7] = 0 ;
END_OF_FILE
if test 1518 -ne `wc -c <'color.h'`; then
echo shar: \"'color.h'\" unpacked with wrong size!
fi
# end of 'color.h'
fi
if test -f 'events.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'events.c'\"
else
echo shar: Extracting \"'events.c'\" \(11388 characters\)
sed "s/^X//" >'events.c' <<'END_OF_FILE'
X/*LINTLIBRARY*/
X
X/* @(#)events.c 1.7 90/10/18
X *
X * Procedures for handling various events in reve.
X *
X * Copyright (C) 1990 - Rich Burridge & Yves Gallot.
X * All rights reserved.
X *
X * Permission is given to distribute these sources, as long as the
X * introductory messages are not removed, and no monies are exchanged.
X *
X * You are forbidden from using Reve as is, or in a modified state, in
X * any tournaments, without the permission of the authors.
X *
X * No responsibility is taken for any errors on inaccuracies inherent
X * either to the comments or the code of this program, but if reported
X * (see README file), then an attempt will be made to fix them.
X */
X
X#include <stdio.h>
X#include "reve.h"
X#include "color.h"
X#include "extern.h"
X
X
Xvoid
Xcheck_button_down(item)
Xenum panel_type item ;
X{
X int n ;
X
X n = (int) item ;
X if (items[n].x == -1) return ;
X if ((curx > items[n].x) && (curx < (items[n].x + items[n].width)) &&
X (cury > items[n].y) && (cury < (items[n].y + items[n].height)))
X {
X down = nextc ;
X itemno = n ;
X but_inverted = itemno ;
X draw_button((enum panel_type) itemno, C_LGREY, BUT_INVERT) ;
X }
X}
X
X
Xvoid
Xcheck_cycle_down(item)
Xenum panel_type item ;
X{
X int ix, n, reply ;
X
X n = (int) item ;
X ix = items[n].x + (3 * BWIDTH) + (2 * BGAP) - CWIDTH ;
X if ((curx > ix) && (curx < (ix + (items[n].width / 2))) &&
X (cury > items[n].y) && (cury < (items[n].y + items[n].height)) &&
X nextc != RIGHT_DOWN)
X {
X direction = INCREMENT ;
X down = nextc ;
X itemno = n ;
X draw_cycle((enum panel_type) n, C_LGREY, CY_LINVERT) ;
X }
X else if ((curx > ix) && (curx < (ix + items[n].width)) &&
X (cury > items[n].y) && (cury < (items[n].y + items[n].height)) &&
X nextc != RIGHT_DOWN)
X {
X direction = DECREMENT ;
X down = nextc ;
X itemno = n ;
X draw_cycle((enum panel_type) n, C_LGREY, CY_RINVERT) ;
X }
X else if ((curx > ix) && (curx < (ix + items[n].width)) &&
X (cury > items[n].y) && (cury < (items[n].y + items[n].height)))
X {
X direction = NONE ;
X down = RIGHT_DOWN ;
X itemno = n ;
X reply = do_menu((enum panel_type) itemno) ;
X if (reply)
X {
X nextc = RIGHT_UP ;
X handle_item(reply - 1) ;
X draw_cycle((enum panel_type) itemno, C_LGREY, CY_NORMAL) ;
X }
X }
X}
X
X
Xvoid
Xcheck_item_down()
X{
X int n ;
X
X for (n = 0; n < MAXITEMS; n++)
X switch (items[n].type)
X {
X case P_BUTTON : check_button_down((enum panel_type) n) ;
X break ;
X case P_CYCLE : check_cycle_down((enum panel_type) n) ;
X break ;
X case P_MESSAGE : /* do nothing. */ ;
X }
X}
X
X
Xvoid
Xcheck_item_up()
X{
X if ((nextc == LEFT_UP && down == LEFT_DOWN) ||
X (nextc == MIDDLE_UP && down == MIDDLE_DOWN) ||
X (nextc == RIGHT_UP && down == RIGHT_DOWN))
X {
X if (items[itemno].type == P_BUTTON && but_inverted == -1) return ;
X handle_item(items[itemno].value) ;
X if (items[itemno].type == P_BUTTON && items[itemno].x != -1)
X draw_button((enum panel_type) itemno, C_LGREY, BUT_NORMAL) ;
X else if (items[itemno].type == P_CYCLE)
X draw_cycle((enum panel_type) itemno, C_LGREY, CY_NORMAL) ;
X }
X}
X
X
Xvoid
Xdo_action()
X{
X switch (nextc)
X {
X case MOUSE_MOVING : draw_piece(next_player, piece_x, piece_y, RINV) ;
X piece_x = curx - PIECE_RAD ;
X piece_y = cury - PIECE_RAD ;
X draw_piece(next_player, piece_x, piece_y, RINV) ;
X break ;
X
X case ENTER_WINDOW :
X case EXIT_WINDOW : set_cursor(CANVASCUR) ;
X draw_piece(next_player, piece_x, piece_y, RINV) ;
X cmode = (enum cantype) ((int) cmode - 1) ;
X break ;
X
X case LEFT_DOWN :
X case LEFT_UP :
X case MIDDLE_DOWN :
X case MIDDLE_UP :
X case RIGHT_DOWN :
X case RIGHT_UP : set_cursor(CANVASCUR) ;
X do_selection(nextc) ;
X }
X}
X
X
Xvoid
Xdo_cycle_key(item, ch)
Xenum panel_type item ;
Xint ch ;
X{
X int val ;
X
X if (!validkey)
X {
X validkey = cur_ch ;
X message(PANEL_MES, items[(int) item].text) ;
X }
X else
X {
X val = -1 ;
X switch (item)
X {
X case BLACK_PLAYS :
X WHITE_PLAYS : if (item == BLACK_PLAYS) curx = 0 ;
X else curx = BBORDER + (3*(BWIDTH+BGAP)) ;
X switch (ch)
X {
X case 'c' :
X case 'C' : val = 1 ;
X items[(int) item].value = val ;
X set_cycle(item,
X player_values[val]) ;
X break ;
X case 'h' :
X case 'H' : val = 0 ;
X items[(int) item].value = val ;
X set_cycle(item,
X player_values[val]) ;
X break ;
X default : return ;
X }
X case DIFFICULTY : if (ch >= '1' && ch <= '9') val = ch - '1' ;
X items[(int) item].value = val ;
X set_cycle(item, diff_values[val]) ;
X break ;
X case NOTES : switch (ch)
X {
X case 'n' :
X case 'N' : val = 0 ;
X items[(int) item].value = val ;
X set_cycle(item, notes_values[val]) ;
X break ;
X case 'y' :
X case 'Y' : val = 1 ;
X items[(int) item].value = val ;
X set_cycle(item, notes_values[val]) ;
X break ;
X default : return ;
X }
X }
X if (val != -1)
X {
X validkey = 0 ;
X message(PANEL_MES, "") ;
X items[(int) item].value = item_value = val ;
X direction = NONE ;
X (*items[(int) item].func)() ;
X }
X }
X}
X
X
Xvoid
Xdo_key_move(n1, n2)
Xint n1, n2 ;
X{
X move = (n2 - '1') * BOARD_SIZE + (n1 - 'a') ;
X next_player = (int) cmode - 1 ;
X cmode = (enum cantype) ((int) cmode + 1) ;
X make_move() ;
X validkey = 0 ;
X}
X
X
Xvoid
Xget_xy(n, x, y) /* Return piece coordinates given board index. */
Xint n, *x,*y ;
X{
X *x = (n & 7) * CELL_SIZE + BBORDER + PIECE_MARGIN ;
X *y = (n >> 3) * CELL_SIZE + BBORDER + PIECE_MARGIN ;
X}
X
X
Xvoid
Xhandle_board_event()
X{
X switch (cmode)
X {
X case WHITE_START :
X case BLACK_START : next_player = (int) cmode - 1 ;
X if (nextc == LEFT_DOWN || nextc == MIDDLE_DOWN ||
X nextc == RIGHT_DOWN)
X {
X set_cursor(NOCURSOR) ;
X piece_x = curx - BBORDER - (PIECE_RAD) ;
X piece_y = cury - BBORDER - (PIECE_RAD) ;
X draw_piece(next_player, piece_x, piece_y, RINV) ;
X cmode = (enum cantype) ((int) cmode + 1) ;
X }
X break ;
X case WHITE_MOVING :
X case BLACK_MOVING : do_action() ;
X }
X}
X
X
Xvoid
Xhandle_event()
X{
X process_event() ;
X
X if (nextc == FRAME_REPAINT) init_canvas() ;
X else if (nextc == KEYBOARD) handle_key() ;
X else if (nextc == EXIT_WINDOW && but_inverted != -1)
X {
X draw_button((enum panel_type) but_inverted, C_LGREY, BUT_NORMAL) ;
X but_inverted = -1 ;
X down = 0 ;
X }
X else if (cury > (CY + BBORDER)) handle_board_event() ;
X else if (nextc == LEFT_UP || nextc == MIDDLE_UP || nextc == RIGHT_UP)
X check_item_up() ;
X else if (nextc == LEFT_DOWN || nextc == MIDDLE_DOWN || nextc == RIGHT_DOWN)
X check_item_down() ;
X}
X
X
Xvoid
Xhandle_item(val)
Xint val ;
X{
X items[itemno].value = item_value = val ;
X (*items[itemno].func)() ;
X but_inverted = -1 ;
X down = 0 ;
X}
X
X
Xvoid
Xhandle_key() /* Process the latest key that the user has pressed. */
X{
X char str[9] ; /* To display half move position. */
X int nextc ;
X
X if (tinput)
X {
X get_filename() ;
X return ;
X }
X if (cur_ch == ESCAPE) validkey = 0 ;
X if (validkey)
X {
X nextc = cur_ch ;
X cur_ch = validkey ;
X }
X switch (cur_ch)
X {
X case 'B' : do_cycle_key(BLACK_PLAYS, nextc) ; /* Cycle items. */
X break ;
X case 'D' : do_cycle_key(DIFFICULTY, nextc) ;
X break ;
X case 'N' : do_cycle_key(NOTES, nextc) ;
X break ;
X case 'W' : do_cycle_key(WHITE_PLAYS, nextc) ;
X break ;
X
X case 'l' : last() ; /* Button items. */
X break ;
X case 'L' : curx = 0 ;
X draw_textfield() ;
X break ;
X case 'n' : new_game() ;
X break ;
X case 'S' : curx = BBORDER + (2*(BWIDTH+BGAP)) ;
X draw_textfield() ;
X break ;
X case 's' : suggest() ;
X break ;
X case 'u' : undo() ;
X break ;
X
X case 'q' : destroy_frame() ;
X exit(0) ;
X
X case '1' :
X case '2' :
X case '3' :
X case '4' :
X case '5' :
X case '6' :
X case '7' :
X case '8' : if (!validkey)
X {
X validkey = cur_ch ;
X SPRINTF(str, "Move: %c", cur_ch) ;
X message(PANEL_MES, str) ;
X }
X else if (nextc >= 'a' && nextc <= 'h')
X {
X SPRINTF(str, "Move: %c%c", cur_ch, nextc) ;
X message(PANEL_MES, str) ;
X do_key_move(nextc, cur_ch) ;
X }
X else validkey = 0 ;
X break ;
X case 'a' :
X case 'b' :
X case 'c' :
X case 'd' :
X case 'e' :
X case 'f' :
X case 'g' :
X case 'h' : if (!validkey)
X {
X validkey = cur_ch ;
X SPRINTF(str, "Move: %c", cur_ch) ;
X message(PANEL_MES, str) ;
X }
X else if (nextc >= '1' && nextc <= '8')
X {
X SPRINTF(str, "Move: %c%c", cur_ch, nextc) ;
X message(PANEL_MES, str) ;
X do_key_move(cur_ch, nextc) ;
X }
X else validkey = 0 ;
X break ;
X default : message(PANEL_MES, "") ;
X validkey = 0 ;
X }
X}
END_OF_FILE
if test 11388 -ne `wc -c <'events.c'`; then
echo shar: \"'events.c'\" unpacked with wrong size!
fi
# end of 'events.c'
fi
if test -f 'images/button.normal.icon' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'images/button.normal.icon'\"
else
echo shar: Extracting \"'images/button.normal.icon'\" \(1933 characters\)
sed "s/^X//" >'images/button.normal.icon' <<'END_OF_FILE'
X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
X */
X 0x03FF,0xFFFF,0xFFFF,0xFFC0,0x0C00,0x0000,0x0000,0x0030,
X 0x1000,0x0000,0x0000,0x0008,0x2000,0x0000,0x0000,0x0004,
X 0x4000,0x0000,0x0000,0x0002,0x4000,0x0000,0x0000,0x0002,
X 0x8000,0x0000,0x0000,0x0003,0x8000,0x0000,0x0000,0x0003,
X 0x8000,0x0000,0x0000,0x0003,0x8000,0x0000,0x0000,0x0003,
X 0x8000,0x0000,0x0000,0x0003,0x8000,0x0000,0x0000,0x0003,
X 0x8000,0x0000,0x0000,0x0003,0x8000,0x0000,0x0000,0x0003,
X 0x8000,0x0000,0x0000,0x0003,0x8000,0x0000,0x0000,0x0003,
X 0x8000,0x0000,0x0000,0x0003,0x8000,0x0000,0x0000,0x0003,
X 0x8000,0x0000,0x0000,0x0003,0x8000,0x0000,0x0000,0x0003,
X 0x8000,0x0000,0x0000,0x0003,0x8000,0x0000,0x0000,0x0003,
X 0x8000,0x0000,0x0000,0x0003,0x8000,0x0000,0x0000,0x0003,
X 0x8000,0x0000,0x0000,0x0003,0x8000,0x0000,0x0000,0x0007,
X 0x4000,0x0000,0x0000,0x0006,0x4000,0x0000,0x0000,0x000E,
X 0x2000,0x0000,0x0000,0x001C,0x1000,0x0000,0x0000,0x0038,
X 0x0FFF,0xFFFF,0xFFFF,0xFFF0,0x03FF,0xFFFF,0xFFFF,0xFFC0,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
END_OF_FILE
if test 1933 -ne `wc -c <'images/button.normal.icon'`; then
echo shar: \"'images/button.normal.icon'\" unpacked with wrong size!
fi
# end of 'images/button.normal.icon'
fi
if test -f 'rev_iycp.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'rev_iycp.c'\"
else
echo shar: Extracting \"'rev_iycp.c'\" \(12937 characters\)
sed "s/^X//" >'rev_iycp.c' <<'END_OF_FILE'
X
X/* @(#)rev_iycp.c 1.3 90/09/24
X *
X * Copyright (C) 1990 - Yves Gallot - all rights reserved.
X *
X * Permission is given to distribute these sources, as long as the
X * introductory messages are not removed, and no monies are exchanged.
X *
X * You are forbidden from using Reve as is, or in a modified state, in
X * any tournaments, without the permission of the authors.
X *
X * No responsibility is taken for any errors on inaccuracies inherent
X * either to the comments or the code of this program, but if reported
X * (see README file), then an attempt will be made to fix them.
X */
X
X#include "reve.h"
X
Xextern int damier[NIVEAUMAX][64] ;
Xextern int tacouleur, macouleur ;
Xextern int vp0, vo0 ;
X
X/* Functions used by the "fast" alpha-beta pruning.
X * - JePeuxJouer( niv ) and TuPeuxJouer( niv ) :
X * Test if I Can Play or You Can Play on the Board number niv ( which is
X * current board at depth niv ). "I" is for macouleur value ( my color )
X * and "You" for tacouleur value ( your color ). Return TRUE or FALSE.
X * If TRUE, put JPJ on every squares where I Can Play, or TPJ on every
X * squares where You Can Play.
X * - JeJoueen( x, y, niv ) and TuJouesen( x, y, niv ) :
X * I Play square (x, y) on Board number niv and You Play square (x, y)
X * on Board number niv. It puts piece color macouleur or tacouleur and
X * returns pieces that must be.
X */
X
Xjepeuxjouer(niv)
Xint niv ;
X{
X register int *d ;
X register int x, y, posx, posy, pos8x, poscr, flag ;
X
X d = damier[niv] ;
X flag = FALSE ;
X vp0 = 0 ;
X
X for (posx = 0; posx < 8; posx++)
X {
X pos8x = posx << 3 ;
X for (posy = 0; posy < 8; posy++)
X {
X poscr = pos8x + posy;
X if ((d[poscr] == TPJ) || (d[poscr] == JPJ)) d[poscr] = FREE ;
X if (d[poscr] == FREE)
X {
X
X for (x = posx + 1;
X (x < 7) && (d[(x << 3) + posy] == tacouleur);
X x++) ;
X if ((x != posx + 1) && (d[(x << 3) + posy] == macouleur))
X {
X flag = TRUE ;
X d[poscr] = JPJ ;
X vp0++ ;
X goto endloopj ;
X }
X
X for (x = posx - 1;
X (x > 0) && (d[(x << 3) + posy] == tacouleur);
X x--) ;
X if ((x != posx - 1) && (d[(x << 3) + posy] == macouleur))
X {
X flag = TRUE ;
X d[poscr] = JPJ ;
X vp0++ ;
X goto endloopj ;
X }
X
X for (y = posy + 1;
X (y < 7) && (d[pos8x + y] == tacouleur);
X y++) ;
X if ((y != posy + 1) && (d[pos8x + y] == macouleur))
X {
X flag = TRUE ;
X d[poscr] = JPJ ;
X vp0++ ;
X goto endloopj ;
X }
X
X for (y = posy - 1;
X (y > 0) && (d[pos8x + y] == tacouleur);
X y--) ;
X if ((y != posy - 1) && (d[pos8x + y] == macouleur))
X {
X flag = TRUE ;
X d[poscr] = JPJ ;
X vp0++ ;
X goto endloopj ;
X }
X
X for (x = posx + 1, y = posy + 1;
X (x < 7) && (y < 7) && (d[(x << 3) + y] == tacouleur);
X x++, y++) ;
X if ((x != posx + 1) && (d[(x << 3) + y] == macouleur))
X {
X flag = TRUE ;
X d[poscr] = JPJ ;
X vp0++ ;
X goto endloopj ;
X }
X
X for (x = posx - 1, y = posy + 1;
X (x > 0) && (y < 7) && (d[(x << 3) + y] == tacouleur);
X x--, y++) ;
X if ((x != posx - 1) && (d[(x << 3) + y] == macouleur))
X {
X flag = TRUE ;
X d[poscr] = JPJ ;
X vp0++ ;
X goto endloopj ;
X }
X
X for (x = posx + 1, y = posy - 1;
X (x < 7) && (y > 0) && (d[(x << 3) + y] == tacouleur);
X x++, y--) ;
X if ((x != posx + 1) && (d[(x << 3) + y] == macouleur))
X {
X flag = TRUE ;
X d[poscr] = JPJ ;
X vp0++ ;
X goto endloopj ;
X }
X
X for (x = posx - 1, y = posy - 1;
X (x > 0) && (y > 0) && (d[(x << 3) + y] == tacouleur);
X x--, y--) ;
X if ((x != posx - 1) && (d[(x << 3) + y] == macouleur))
X {
X flag = TRUE ;
X d[poscr] = JPJ ;
X vp0++ ;
X }
Xendloopj: ;
X }
X }
X }
X return flag ;
X}
X
X
Xjejoueen(px, py, niv)
Xint px, py, niv ;
X{
X register int *d ;
X register int x, y, posx, posy, pos8x ;
X
X posx = px ;
X posy = py ;
X pos8x = posx << 3 ;
X
X d = damier[niv] ;
X
X d[pos8x + posy] = macouleur ;
X
X for (x = posx + 1; (x < 7) && (d[(x << 3) + posy] == tacouleur); x++) ;
X if ((x != posx + 1) && (d[(x << 3) + posy] == macouleur))
X {
X for (x = posx + 1; d[(x << 3) + posy] == tacouleur; x++)
X d[(x << 3) + posy] = macouleur ;
X }
X
X for (x = posx - 1; (x > 0) && (d[(x << 3) + posy] == tacouleur); x--) ;
X if ((x != posx - 1) && (d[(x << 3) + posy] == macouleur))
X {
X for (x = posx - 1; d[(x << 3) + posy] == tacouleur; x--)
X d[(x << 3) + posy] = macouleur ;
X }
X
X for (y = posy + 1; (y < 7) && (d[pos8x + y] == tacouleur); y++) ;
X if ((y != posy + 1) && (d[pos8x + y] == macouleur))
X {
X for (y = posy + 1; d[pos8x + y] == tacouleur; y++)
X d[pos8x + y] = macouleur ;
X }
X
X for (y = posy - 1; (y > 0) && (d[pos8x + y] == tacouleur); y--) ;
X if ((y != posy - 1) && (d[pos8x + y] == macouleur))
X {
X for (y = posy - 1; d[pos8x + y] == tacouleur; y--)
X d[pos8x + y] = macouleur ;
X }
X
X for (x = posx + 1, y = posy + 1;
X (x < 7) && (y < 7) && (d[(x << 3) + y] == tacouleur); x++, y++) ;
X if ((x != posx + 1) && (d[(x << 3) + y] == macouleur))
X {
X for (x = posx + 1, y = posy + 1; d[(x << 3) + y] == tacouleur; x++, y++)
X d[(x << 3) + y] = macouleur ;
X }
X
X for (x = posx - 1, y = posy + 1;
X (x > 0) && (y < 7) && (d[(x << 3) + y] == tacouleur); x--, y++) ;
X if ((x != posx - 1) && (d[(x << 3) + y] == macouleur))
X {
X for (x = posx - 1, y = posy + 1; d[(x << 3) + y] == tacouleur; x--, y++)
X d[(x << 3) + y] = macouleur ;
X }
X
X for (x = posx + 1, y = posy - 1;
X (x < 7) && (y > 0) && (d[(x << 3) + y] == tacouleur); x++, y--) ;
X if ((x != posx + 1) && (d[(x << 3) + y] == macouleur))
X {
X for (x = posx + 1, y = posy - 1; d[(x << 3) + y] == tacouleur; x++, y--)
X d[(x << 3) + y] = macouleur ;
X }
X
X for (x = posx - 1, y = posy - 1;
X (x > 0) && (y > 0) && (d[(x << 3) + y] == tacouleur); x--, y--) ;
X if ((x != posx - 1) && (d[(x << 3) + y] == macouleur))
X {
X for (x = posx - 1, y = posy - 1; d[(x << 3) + y] == tacouleur; x--, y--)
X d[(x << 3) + y] = macouleur ;
X }
X}
X
X
Xtupeuxjouer(niv)
Xint niv ;
X{
X register int *d ;
X register int x, y, posx, posy, pos8x, poscr, flag ;
X
X d = damier[niv] ;
X flag = FALSE ;
X vo0 = 0 ;
X
X for (posx = 0; posx < 8; posx++)
X {
X pos8x = posx << 3 ;
X for (posy = 0; posy < 8; posy++)
X {
X poscr = pos8x + posy ;
X if ((d[poscr] == TPJ) || (d[poscr] == JPJ)) d[poscr] = FREE ;
X if (d[poscr] == FREE)
X {
X for (x = posx + 1;
X (x < 7) && (d[(x << 3) + posy] == macouleur);
X x++) ;
X if ((x != posx + 1) && (d[(x << 3) + posy] == tacouleur))
X {
X flag = TRUE ;
X d[poscr] = TPJ ;
X vo0++ ;
X goto endloopt ;
X }
X
X for (x = posx - 1;
X (x > 0) && (d[(x << 3) + posy] == macouleur) ;
X x--) ;
X if ((x != posx - 1) && (d[(x << 3) + posy] == tacouleur))
X {
X flag = TRUE ;
X d[poscr] = TPJ ;
X vo0++ ;
X goto endloopt ;
X }
X
X for (y = posy + 1;
X (y < 7) && (d[pos8x + y] == macouleur);
X y++) ;
X if ((y != posy + 1) && (d[pos8x + y] == tacouleur))
X {
X flag = TRUE ;
X d[poscr] = TPJ ;
X vo0++ ;
X goto endloopt ;
X }
X
X for (y = posy - 1;
X (y > 0) && (d[pos8x + y] == macouleur);
X y--) ;
X if ((y != posy - 1) && (d[pos8x + y] == tacouleur))
X {
X flag = TRUE ;
X d[poscr] = TPJ ;
X vo0++ ;
X goto endloopt ;
X }
X
X for (x = posx + 1, y = posy + 1;
X (x < 7) && (y < 7) && (d[(x << 3) + y] == macouleur);
X x++, y++);
X if ((x != posx + 1) && (d[(x << 3) + y] == tacouleur))
X {
X flag = TRUE ;
X d[poscr] = TPJ ;
X vo0++ ;
X goto endloopt ;
X }
X
X for (x = posx - 1, y = posy + 1;
X (x > 0) && (y < 7) && (d[(x << 3) + y] == macouleur);
X x--, y++) ;
X if ((x != posx - 1) && (d[(x << 3) + y] == tacouleur))
X {
X flag = TRUE ;
X d[poscr] = TPJ ;
X vo0++ ;
X goto endloopt ;
X }
X
X for (x = posx + 1, y = posy - 1;
X (x < 7) && (y > 0) && (d[(x << 3) + y] == macouleur);
X x++, y--) ;
X if ((x != posx + 1) && (d[(x << 3) + y] == tacouleur))
X {
X flag = TRUE ;
X d[poscr] = TPJ ;
X vo0++ ;
X goto endloopt ;
X }
X
X for (x = posx - 1, y = posy - 1;
X (x > 0) && (y > 0) && (d[(x << 3) + y] == macouleur) ;
X x--, y-- ) ;
X if ((x != posx - 1) && (d[(x << 3) + y] == tacouleur))
X {
X flag = TRUE ;
X d[poscr] = TPJ ;
X vo0++ ;
X }
Xendloopt: ;
X }
X }
X }
X return(flag) ;
X}
X
X
Xtujouesen(px, py, niv)
Xint px, py, niv ;
X{
X register int *d ;
X register int x, y, posx, posy, pos8x ;
X
X posx = px ;
X posy = py ;
X
X pos8x = posx << 3 ;
X d = damier[niv] ;
X d[pos8x + posy] = tacouleur ;
X
X for (x = posx + 1; (x < 7) && (d[(x << 3) + posy] == macouleur); x++) ;
X if ((x != posx + 1) && (d[(x << 3) + posy] == tacouleur))
X {
X for (x = posx + 1; d[(x << 3) + posy] == macouleur; x++)
X d[(x << 3) + posy] = tacouleur ;
X }
X
X for (x = posx - 1; (x > 0) && (d[(x << 3) + posy] == macouleur); x--) ;
X if ((x != posx - 1) && (d[(x << 3) + posy] == tacouleur))
X {
X for (x = posx - 1; d[(x << 3) + posy] == macouleur; x--)
X d[(x << 3) + posy] = tacouleur ;
X }
X
X for (y = posy + 1; (y < 7) && (d[pos8x + y] == macouleur); y++) ;
X if ((y != posy + 1) && (d[pos8x + y] == tacouleur))
X {
X for (y = posy + 1; d[pos8x + y] == macouleur; y++)
X d[pos8x + y] = tacouleur ;
X }
X
X for (y = posy - 1; (y > 0) && (d[pos8x + y] == macouleur); y--) ;
X if ((y != posy - 1) && (d[pos8x + y] == tacouleur))
X {
X for (y = posy - 1; d[pos8x + y] == macouleur; y--)
X d[pos8x + y] = tacouleur ;
X }
X
X for (x = posx + 1, y = posy + 1;
X (x < 7) && (y < 7) && (d[(x << 3) + y] == macouleur);
X x++, y++) ;
X if ((x != posx + 1) && (d[(x << 3) + y] == tacouleur))
X {
X for (x = posx + 1, y = posy + 1; d[(x << 3) + y] == macouleur; x++, y++)
X d[(x << 3) + y] = tacouleur ;
X }
X
X for (x = posx - 1, y = posy + 1;
X (x > 0) && (y < 7) && (d[(x << 3) + y] == macouleur);
X x--, y++) ;
X if ((x != posx - 1) && (d[(x << 3) + y] == tacouleur))
X {
X for (x = posx - 1, y = posy + 1; d[(x << 3) + y] == macouleur; x--, y++)
X d[(x << 3) + y] = tacouleur ;
X }
X
X for (x = posx + 1, y = posy - 1;
X (x < 7) && (y > 0) && (d[(x << 3) + y] == macouleur);
X x++, y--) ;
X if ((x != posx + 1) && (d[(x << 3) + y] == tacouleur))
X {
X for (x = posx + 1, y = posy - 1; d[(x << 3) + y] == macouleur; x++, y--)
X d[(x << 3) + y] = tacouleur ;
X }
X
X for (x = posx - 1, y = posy - 1;
X (x > 0) && (y > 0) && (d[(x << 3) + y] == macouleur);
X x--, y--) ;
X if ((x != posx - 1) && (d[(x << 3) + y] == tacouleur))
X {
X for (x = posx - 1, y = posy - 1; d[(x << 3) + y] == macouleur; x--, y--)
X d[(x << 3) + y] = tacouleur ;
X }
X}
END_OF_FILE
if test 12937 -ne `wc -c <'rev_iycp.c'`; then
echo shar: \"'rev_iycp.c'\" unpacked with wrong size!
fi
# end of 'rev_iycp.c'
fi
if test -f 'sunview.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'sunview.c'\"
else
echo shar: Extracting \"'sunview.c'\" \(11208 characters\)
sed "s/^X//" >'sunview.c' <<'END_OF_FILE'
X/*LINTLIBRARY*/
X
X/* @(#)sunview.c 1.5 90/10/15
X *
X * SunView dependent graphics routines used by reve.
X *
X * Copyright (C) 1990 - Rich Burridge & Yves Gallot.
X * All rights reserved.
X *
X * Permission is given to distribute these sources, as long as the
X * introductory messages are not removed, and no monies are exchanged.
X *
X * You are forbidden from using Reve as is, or in a modified state, in
X * any tournaments, without the permission of the authors.
X *
X * No responsibility is taken for any errors or inaccuracies inherent
X * either to the comments or the code of this program, but if reported
X * (see README file), then an attempt will be made to fix them.
X */
X
X#include <stdio.h>
X#include "color.h"
X#include "reve.h"
X#include "extern.h"
X#include "images.h"
X#include <suntool/sunview.h>
X#include <suntool/canvas.h>
X
Xenum gr_type gtype = GSUNVIEW ; /* Graphics type. */
X
X#define CURSOR_SET (void) cursor_set
X#define ICON_SET (void) icon_set
X#define MENU_SET (void) menu_set
X#define PW_LOCK (void) pw_lock
X#define PW_ROP (void) pw_rop
X#define PW_SETCMSNAME (void) pw_setcmsname
X#define PW_STENCIL (void) pw_stencil
X#define PW_PUTCOLORMAP (void) pw_putcolormap
X#define PW_REVERSEVIDEO (void) pw_reversevideo
X#define PW_TTEXT (void) pw_ttext
X#define PW_UNLOCK (void) pw_unlock
X#define PW_VECTOR (void) pw_vector
X#define PW_WRITEBACKGROUND (void) pw_writebackground
X#define WINDOW_DONE (void) window_done
X#define WINDOW_SET (void) window_set
X
X#define NORMALFONT "/usr/lib/fonts/fixedwidthfonts/screen.r.12"
X#define BOLDFONT "/usr/lib/fonts/fixedwidthfonts/screen.b.12"
X
Xmpr_static(button_stencil_pr, 64, 64, 1, button_stencil_image) ;
Xmpr_static(button_invert_pr, 64, 64, 1, button_invert_image) ;
Xmpr_static(button_normal_pr, 64, 64, 1, button_normal_image) ;
Xmpr_static(cycle_glyph_pr, 64, 64, 1, cycle_glyph_image) ;
Xmpr_static(cycle_stencil_pr, 64, 64, 1, cycle_stencil_image) ;
Xmpr_static(cycle_linvert_pr, 64, 64, 1, cycle_linvert_image) ;
Xmpr_static(cycle_rinvert_pr, 64, 64, 1, cycle_rinvert_image) ;
Xmpr_static(icon_pr, 64, 64, 1, icon_image) ;
Xmpr_static(cicon_pr, 64, 64, 8, cicon_image) ;
Xmpr_static(white_icon_pr, 64, 64, 1, white_image) ;
Xmpr_static(black_icon_pr, 64, 64, 1, black_image) ;
X
Xmpr_static(hglass_pr, 16, 16, 1, hglass_image) ;
Xmpr_static(nocur_pr, 16, 16, 1, nocur_image) ;
X
XCanvas canvas ;
XCursor cursor[MAXCURSORS] ;
XEvent *cur_event ;
XFrame frame ;
XIcon reve_icon ;
XMenu menus[MAXMENUS] ;
XPixfont *font[MAXFONTS] ;
XPixrect *images[MAXIMAGES] ;
XPixwin *cpw ;
X
Xvoid pw_batch() ;
Xint opvals[3] ; /* Pixrect rasterop values. */
X
X
Xvoid
Xbatch(state) /* Turn graphics batching on or off. */
Xenum bltype state ;
X{
X switch (state)
X {
X case IS_ON : pw_batch_on(cpw) ;
X break ;
X case IS_OFF : pw_batch_off(cpw) ;
X }
X}
X
X
X/*ARGSUSED*/
Xvoid
Xcanvas_proc(canvas, event)
XCanvas canvas ;
XEvent *event ;
X{
X cur_event = event ;
X process_event() ; /* Determine what kind of event it is. */
X handle_event() ; /* And do the appropriate action. */
X}
X
X
Xvoid
Xclose_frame() /* Iconise reve window. */
X{
X WINDOW_SET(frame, FRAME_CLOSED, TRUE, 0) ;
X}
X
X
Xvoid
Xcolor_area(x, y, width, height, color)
Xint x, y, width, height, color ;
X{
X PW_WRITEBACKGROUND(cpw, x, y, width, height, PIX_SRC | PIX_COLOR(color)) ;
X}
X
X
Xvoid
Xcreate_menu(mtype, values) /* Create popup menus for cycle items. */
Xenum panel_type mtype ;
Xchar *values[] ;
X{
X int i = 0 ;
X int menuno ; /* Current menu number. */
X int more = 1 ; /* Cleared when current menu is complete.*/
X
X menuno = (int) mtype - (int) BLACK_PLAYS ;
X menus[menuno] = menu_create(MENU_FONT, font[(int) NFONT], 0) ;
X do
X {
X if (values[i] != NULL)
X MENU_SET(menus[menuno], MENU_STRING_ITEM, values[i], i+1, 0) ;
X else more = 0 ;
X i++ ;
X }
X while (more) ;
X}
X
X
Xvoid
Xdestroy_frame() /* Destroy Reve window. */
X{
X WINDOW_DONE(frame) ;
X}
X
X
Xdo_menu(mtype) /* Popup appropriate cycle menu and get value. */
Xenum panel_type mtype ;
X{
X int menuno ;
X
X menuno = (int) mtype - (int) BLACK_PLAYS ;
X return((int) menu_show(menus[menuno], canvas,
X canvas_window_event(canvas, cur_event), 0)) ;
X}
X
X
Xvoid
Xdraw_image(x, y, width, height, image)
Xint x, y, width, height ;
Xenum image_type image ;
X{
X PW_ROP(cpw, x, y, width, height, PIX_SRC | PIX_DST,
X images[(int) image], 0, 0) ;
X}
X
X
Xvoid
Xdraw_line(x1, y1, x2, y2, op, color)
Xint x1, y1, x2, y2, color ;
Xenum optype op ;
X{
X int rop ;
X
X rop = opvals[(int) op] ;
X PW_VECTOR(cpw, x1, y1, x2, y2, rop | PIX_COLOR(color), 1) ;
X}
X
X
Xvoid
Xdraw_stencil(x, y, width, height, op, color, stencil, image)
Xint x, y, width, height, color ;
Xenum optype op ;
Xenum image_type stencil, image ;
X{
X int rop ;
X
X rop = opvals[(int) op] | PIX_COLOR(color) ;
X PW_STENCIL(cpw, x, y, width, height, rop,
X images[(int) stencil], 0, 0, images[(int) image], 0, 0) ;
X}
X
X
Xvoid
Xdraw_text(x, y, ftype, color, str)
Xenum font_type ftype ;
Xint x, y, color ;
Xchar *str ;
X{
X PW_TTEXT(cpw, x, y, PIX_SRC | PIX_COLOR(color), font[(int) ftype], str) ;
X}
X
X
XPixfont *
Xget_font(name)
Xchar *name ;
X{
X Pixfont *f ;
X
X f = pf_open(name) ;
X if (f == NULL) f = pf_default() ;
X if (f == NULL)
X {
X perror("couldn't get the default font.") ;
X exit(1) ;
X }
X return f ;
X}
X
X
Xget_strwidth(ftype, str) /* Get width in pixels of string value. */
Xenum font_type ftype ;
Xchar *str ;
X{
X struct pr_size size ;
X
X size = pf_textwidth(strlen(str), font[(int) ftype], str) ;
X return(size.x) ;
X}
X
X
Xvoid
Xinit_fonts() /* Open the normal and bold fonts. */
X{
X font[(int) BFONT] = get_font(BOLDFONT) ;
X font[(int) NFONT] = get_font(NORMALFONT) ;
X bfont_height = font[(int) BFONT]->pf_defaultsize.y ;
X nfont_height = font[(int) NFONT]->pf_defaultsize.y ;
X}
X
X
Xinit_ws_type()
X{
X if (getenv("WINDOW_PARENT") == NULL)
X {
X FPRINTF(stderr,"%s: Not a native SunView window\n", progname) ;
X return -1 ;
X }
X move_delta = 5 ; /* Delta for computer animate move. */
X cur_dpyno = DPY1 ;
X return 0 ;
X}
X
X
Xstatic void
Xload_colors() /* Create and load reve color map. */
X{
X Pixwin *frame_pw ;
X char colorname[CMS_NAMESIZE] ;
X u_char red[OTH_COLORSIZE], green[OTH_COLORSIZE], blue[OTH_COLORSIZE] ;
X
X iscolor[(int) cur_dpyno] = (cpw->pw_pixrect->pr_depth == 8) ? 1 : 0 ;
X SPRINTF(colorname, "%s%D", OTH_COLOR, getpid()) ;
X PW_SETCMSNAME(cpw, colorname) ;
X
X oth_colorsetup(red, green, blue) ;
X PW_PUTCOLORMAP(cpw, 0, OTH_COLORSIZE, red, green, blue) ;
X if (inv_video) PW_REVERSEVIDEO(cpw, 0, OTH_COLORSIZE) ;
X
X if (iscolor)
X {
X frame_pw = (Pixwin *) window_get(frame, WIN_PIXWIN) ;
X PW_SETCMSNAME(frame_pw, colorname) ;
X PW_PUTCOLORMAP(frame_pw, 0, OTH_COLORSIZE, red, green, blue) ;
X }
X}
X
X
Xvoid
Xlock_screen(state) /* Turn graphics locking on or off. */
Xenum bltype state ;
X{
X static struct rect r = { 0, 0, TOTAL_WIDTH+1, TOTAL_WIDTH+1 } ;
X
X switch (state)
X {
X case IS_ON : PW_LOCK(cpw, &r) ;
X break ;
X case IS_OFF : PW_UNLOCK(cpw) ;
X }
X}
X
X
Xvoid
Xmake_canvas() /* Create canvas for game board. */
X{
X canvas = window_create(frame, CANVAS,
X CANVAS_RETAINED, FALSE,
X WIN_HEIGHT, TOTAL_HEIGHT,
X WIN_WIDTH, TOTAL_WIDTH,
X WIN_CONSUME_PICK_EVENTS,
X MS_LEFT, MS_MIDDLE, MS_RIGHT,
X LOC_MOVE, LOC_DRAG, LOC_TRAJECTORY,
X LOC_WINENTER, LOC_WINEXIT,
X 0,
X WIN_CONSUME_KBD_EVENTS,
X KBD_USE, KBD_DONE, WIN_ASCII_EVENTS, WIN_UP_EVENTS,
X 0,
X WIN_EVENT_PROC, canvas_proc,
X 0) ;
X cpw = (Pixwin *) window_get(canvas, CANVAS_PIXWIN) ;
X cursor[(int) CANVASCUR] = window_get(canvas, WIN_CURSOR) ;
X CURSOR_SET(cursor[(int) CANVASCUR], CURSOR_OP, PIX_SRC ^ PIX_DST, 0) ;
X cursor[(int) HOURGLASS] = cursor_create(CURSOR_IMAGE, &hglass_pr, 0) ;
X CURSOR_SET(cursor[(int) HOURGLASS], CURSOR_OP, PIX_SRC ^ PIX_DST, 0) ;
X cursor[(int) NOCURSOR] = cursor_create(CURSOR_IMAGE, &nocur_pr, 0) ;
X CURSOR_SET(cursor[(int) NOCURSOR], CURSOR_OP, PIX_SRC ^ PIX_DST, 0) ;
X load_colors() ;
X
X images[(int) BUT_STENCIL] = &button_stencil_pr ;
X images[(int) BUT_INVERT] = &button_invert_pr ;
X images[(int) BUT_NORMAL] = &button_normal_pr ;
X images[(int) CY_NORMAL] = &cycle_glyph_pr ;
X images[(int) CY_STENCIL] = &cycle_stencil_pr ;
X images[(int) CY_LINVERT] = &cycle_linvert_pr ;
X images[(int) CY_RINVERT] = &cycle_rinvert_pr ;
X images[(int) P_WHITE] = &white_icon_pr ;
X images[(int) P_BLACK] = &black_icon_pr ;
X}
X
X
Xvoid
Xmake_frame(argc, argv) /* Create reve window. */
Xint argc ;
Xchar *argv[] ;
X{
X opvals[(int) RCLR] = PIX_CLR ;
X opvals[(int) RSRC] = PIX_SRC ;
X opvals[(int) RINV] = PIX_SRC ^ PIX_DST ;
X
X frame = window_create((Window) NULL, FRAME,
X FRAME_ICON, reve_icon,
X FRAME_LABEL, line,
X FRAME_NO_CONFIRM, TRUE,
X WIN_ERROR_MSG, "Can't create window.",
X FRAME_ARGS, argc, argv,
X 0) ;
X}
X
X
Xvoid
Xmake_icon()
X{
X reve_icon = icon_create(ICON_IMAGE, &icon_pr, 0) ;
X}
X
X
Xvoid
Xprocess_event() /* Process the next canvas event. */
X{
X int id ;
X
X id = (event_id(cur_event)) ;
X curx = event_x(cur_event) ;
X cury = event_y(cur_event) ;
X
X if (event_is_button(cur_event) && event_is_down(cur_event))
X {
X if (id == MS_LEFT) nextc = LEFT_DOWN ;
X else if (id == MS_MIDDLE) nextc = MIDDLE_DOWN ;
X else if (id == MS_RIGHT) nextc = RIGHT_DOWN ;
X }
X else if (event_is_button(cur_event) && event_is_up(cur_event))
X {
X if (id == MS_LEFT) nextc = LEFT_UP ;
X else if (id == MS_MIDDLE) nextc = MIDDLE_UP ;
X else if (id == MS_RIGHT) nextc = RIGHT_UP ;
X }
X else if (event_is_ascii(cur_event))
X {
X cur_ch = id ;
X nextc = KEYBOARD ;
X }
X else if (id == KBD_DONE || id == LOC_WINEXIT ||
X id == WIN_STOP || id == LOC_RGNEXIT) nextc = EXIT_WINDOW ;
X else if (id == LOC_WINENTER || id == LOC_RGNENTER) nextc = ENTER_WINDOW ;
X else if (id == LOC_MOVE || id == LOC_DRAG || id == LOC_TRAJECTORY)
X nextc = MOUSE_MOVING ;
X else if (id == WIN_REPAINT) nextc = FRAME_REPAINT ;
X}
X
X
Xvoid
Xset_cursor(ctype)
Xenum curtype ctype ;
X{
X WINDOW_SET(canvas, WIN_CURSOR, cursor[(int) ctype], 0) ;
X}
X
X
X/*ARGSUSED*/
Xvoid
Xstart_tool(dtype) /* Display window and start the notifier. */
Xenum disp_type dtype ;
X{
X if (iscolor)
X {
X reve_icon = (Icon) window_get(frame, FRAME_ICON) ;
X ICON_SET(reve_icon, ICON_IMAGE, &cicon_pr, 0) ;
X WINDOW_SET(frame, FRAME_ICON, reve_icon, 0) ;
X }
X window_fit(frame) ;
X window_main_loop(frame) ;
X}
END_OF_FILE
if test 11208 -ne `wc -c <'sunview.c'`; then
echo shar: \"'sunview.c'\" unpacked with wrong size!
fi
# end of 'sunview.c'
fi
echo shar: End of archive 5 \(of 7\).
cp /dev/null ark5isdone
MISSING=""
for I in 1 2 3 4 5 6 7 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 7 archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0