#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)extra.c 8.1 (Berkeley) 5/31/93";
#else
__RCSID("$NetBSD: extra.c,v 1.7 2009/08/12 05:17:57 dholland Exp $");
#endif
#endif
#include "back.h"
#include "backlocal.h"
#ifdef DEBUG
FILE *trace;
#endif
static int eval(void);
void
dble(void)
{
int resp;
for (;;) {
writel(" doubles.");
if (cturn == -pnum) {
if (dblgood()) {
writel(" Declined.\n");
nexturn();
cturn *= -2;
return;
} else {
writel(" Accepted.\n");
gvalue *= 2;
dlast = cturn;
if (tflag)
gwrite();
return;
}
}
writel(" Does ");
writel(cturn == 1 ? color[2] : color[3]);
writel(" accept?");
if ((resp = yorn('R')) == 2) {
writel(" Reprint.\n");
buflush();
wrboard();
writel(*Colorptr);
continue;
}
if (resp) {
gvalue *= 2;
dlast = cturn;
if (tflag)
gwrite();
return;
}
nexturn();
cturn *= -2;
return;
}
}
int
dblgood(void)
{
int n;
int OFFC = *offptr;
int OFFO = *offopp;
#ifdef DEBUG
int i;
if (trace == NULL)
trace = fopen("bgtrace", "w");
#endif
n = eval() * cturn;
#ifdef DEBUG
fputs("\nDoubles:\nBoard: ", trace);
for (i = 0; i < 26; i++)
fprintf(trace, " %d", board[i]);
fprintf(trace, "\n\tpip = %d, ", n);
#endif
if (OFFC > -15 || OFFO > -15) {
if (OFFC < 0 && OFFO < 0) {
OFFC += 15;
OFFO += 15;
n += ((OFFC - OFFO) * 7) / 2;
} else
if (OFFC < 0) {
OFFC += 15;
n -= OFFO * 7 / 2;
} else
if (OFFO < 0) {
OFFO += 15;
n += OFFC * 7 / 2;
}
if (OFFC < 8 && OFFO > 8)
n -= 7;
if (OFFC < 10 && OFFO > 10)
n -= 7;
if (OFFC < 12 && OFFO > 12)
n -= 7;
if (OFFO < 8 && OFFC > 8)
n += 7;
if (OFFO < 10 && OFFC > 10)
n += 7;
if (OFFO < 12 && OFFC > 12)
n += 7;
n += ((OFFC - OFFO) * 7) / 2;
}
#ifdef DEBUG
fprintf(trace, "off = %d, ", n);
#endif
n -= freemen(bar);
n += freemen(home);
n += trapped(home, -cturn);
n -= trapped(bar, cturn);
#ifdef DEBUG
fprintf(trace, "free = %d\n", n);
fprintf(trace, "\tOFFC = %d, OFFO = %d\n", OFFC, OFFO);
fflush(trace);
#endif
if (n > 10 + rnum(7))
return (1);
return (0);
}
int
freemen(int b)
{
int i, inc, lim;
odds(0, 0, 0);
if (board[b] == 0)
return (0);
inc = (b == 0 ? 1 : -1);
lim = (b == 0 ? 7 : 18);
for (i = b + inc; i != lim; i += inc)
if (board[i] * inc < -1)
odds(abs(b - i), 0, abs(board[b]));
if (abs(board[b]) == 1)
return ((36 - count()) / 5);
return (count() / 5);
}
int
trapped(int n, int inc)
{
int i, j, k;
int c, l, ct;
ct = 0;
l = n + 7 * inc;
for (i = n + inc; i != l; i += inc) {
odds(0, 0, 0);
c = abs(i - l);
if (board[i] * inc > 0) {
for (j = c; j < 13; j++)
if (board[i + inc * j] * inc < -1) {
if (j < 7)
odds(j, 0, 1);
for (k = 1; k < 7 && k < j; k++)
if (j - k < 7)
odds(k, j - k, 1);
}
ct += abs(board[i]) * (36 - count());
}
}
return (ct / 5);
}
static int
eval(void)
{
int i, j;
for (j = i = 0; i < 26; i++)
j += (board[i] >= 0 ? i * board[i] : (25 - i) * board[i]);
if (off[1] >= 0)
j += 25 * off[1];
else
j += 25 * (off[1] + 15);
if (off[0] >= 0)
j -= 25 * off[0];
else
j -= 25 * (off[0] + 15);
return (j);
}