#include "sjeng.h"
#include "protos.h"
#include "extvars.h"
int hand_value[] = { 0, 100, -100, 210, -210, 0, 0, 250, -250, 450, -450, 230, -230 };
int std_hand_value[] = { 0, 100, -100, 210, -210, 0, 0, 250, -250, 450, -450, 230, -230 };
bool piecedead;
bool partnerdead;
int must_go;
void ResetHandValue(void)
{
memcpy(hand_value, std_hand_value, sizeof(hand_value));
}
void BegForPartner(void)
{
if (xb_mode)
{
}
return;
};
void GreetPartner()
{
printf("tellics ptell Hello! I am Sjeng and hope you enjoy playing with me.\n");
printf("tellics ptell For help on some commands that I understand, ptell me \'help\'\n");
return;
};
void HandlePartner(char *input)
{
if (input[0] == ' ')
{
if (!have_partner)
{
sscanf(input+1, "%s", my_partner);
have_partner = TRUE;
GreetPartner();
printf("tellics set f5 bughouse\n");
printf("tellics unseek\n");
}
}
else
{
memset(my_partner, 0, sizeof(my_partner));
have_partner = FALSE;
BegForPartner();
printf("tellics set f5 1=1\n");
}
};
void HandlePtell(char *input)
{
int change = 0;
char howmuch[80] = "is...uh...what did you say?\n";
if (!strncmp(input+6, "help", 4))
{
printf("tellics ptell Commands that I understand are : sit, go, fast, slow, abort, flag, +/++/+++/-/--/---{p,n,b,r,q,d,h,trades}, x, dead, formula, help.\n");
return;
}
if (Variant != Bughouse && (strncmp(input+6, "sorry", 5)))
{
printf("tellics ptell Sorry, but I'm not playing a bughouse game.\n");
return;
}
if (!strncmp(input+6, "sit", 3))
{
printf("tellics ptell Ok, I sit next move. Tell me when to go.\n");
must_sit = TRUE;
must_go = 0;
}
else if (!strncmp(input+6, "go", 2) || (!strncmp(input+6, "move", 4)))
{
printf("tellics ptell Ok, I'm moving.\n");
must_sit = FALSE;
must_go = 4;
}
else if (!strncmp(input+6, "fast", 4) || (!strncmp(input+6, "time", 4)))
{
printf("tellics ptell Ok, I'm going FAST!\n");
go_fast = TRUE;
must_sit = FALSE;
}
else if (!strncmp(input+6, "slow", 4))
{
printf("tellics ptell Ok, moving normally.\n");
go_fast = FALSE;
must_sit = FALSE;
}
else if (!strncmp(input+6, "abort", 5))
{
printf("tellics ptell Requesting abort...\n");
printf("tellics abort\n");
}
else if (!strncmp(input+6, "flag", 4))
{
printf("tellics ptell Flagging...\n");
printf("tellics flag\n");
}
else if (!strncmp(input+6, "+", 1))
{
if ((strstr(input+6, "trade") != NULL)
|| (
(strstr(input+6, "n") == NULL) &&
(strstr(input+6, "b") == NULL) &&
(strstr(input+6, "p") == NULL) &&
(strstr(input+6, "r") == NULL) &&
(strstr(input+6, "q") == NULL) &&
(strstr(input+6, "d") == NULL) &&
(strstr(input+6, "h") == NULL)))
{
if (comp_color == 1)
{
hand_value[wpawn] += 25;
hand_value[wknight] += 50;
hand_value[wbishop] += 50;
hand_value[wrook] += 50;
hand_value[wqueen] += 100;
}
else
{
hand_value[bpawn] -= 25;
hand_value[bknight] -= 50;
hand_value[bbishop] -= 50;
hand_value[brook] -= 50;
hand_value[bqueen] -= 100;
}
printf("tellics ptell Ok, trading is GOOD\n");
}
else if (strstr(input+6, "+++") != NULL)
{
change = 50000;
strcpy(howmuch, "mates");
}
else if (strstr(input+6, "++") != NULL)
{
change = 1000;
strcpy(howmuch, "is VERY good (ptell me 'x' to play normal again)");
}
else if (strstr(input+6, "+") != NULL)
{
change = 150;
strcpy(howmuch, "is good (ptell me 'x' to play normal again)");
}
else
DIE;
if (strstr(input+6, "n") != NULL)
{
if (comp_color == 1)
hand_value[wknight] = std_hand_value[wknight] + change;
else
hand_value[bknight] = std_hand_value[bknight] - change;
printf("tellics ptell Ok, Knight %s\n", howmuch);
}
if (strstr(input+6, "b") != NULL)
{
if (comp_color == 1)
hand_value[wbishop] = std_hand_value[wbishop] + change;
else
hand_value[bbishop] = std_hand_value[bbishop] - change;
if (comp_color == 1)
hand_value[wqueen] = std_hand_value[wqueen] + change;
else
hand_value[bqueen] = std_hand_value[bqueen] - change;
printf("tellics ptell Ok, Bishop %s\n", howmuch);
}
if (strstr(input+6, "r") != NULL)
{
if (comp_color == 1)
hand_value[wrook] = std_hand_value[wrook] + change;
else
hand_value[brook] = std_hand_value[brook] - change;
if (comp_color == 1)
hand_value[wqueen] = std_hand_value[wqueen] + change;
else
hand_value[bqueen] = std_hand_value[bqueen] - change;
printf("tellics ptell Ok, Rook %s\n", howmuch);
}
if (strstr(input+6, "q") != NULL)
{
if (comp_color == 1)
hand_value[wqueen] = std_hand_value[wqueen] + change;
else
hand_value[bqueen] = std_hand_value[bqueen] - change;
printf("tellics ptell Ok, Queen %s\n", howmuch);
}
if (strstr(input+6, "p") != NULL)
{
if (comp_color == 1)
hand_value[wpawn] = std_hand_value[wpawn] + change;
else
hand_value[bpawn] = std_hand_value[bpawn] - change;
if (comp_color == 1)
{
hand_value[wqueen] = std_hand_value[wqueen] + change;
hand_value[wbishop] = std_hand_value[wbishop] + change;
}
else
{
hand_value[bqueen] = std_hand_value[bqueen] - change;
hand_value[bbishop] = std_hand_value[bbishop] - change;
}
printf("tellics ptell Ok, Pawn %s\n", howmuch);
}
if (strstr(input+6, "d") != NULL)
{
if (comp_color == 1)
{
hand_value[wpawn] = std_hand_value[wpawn] + change;
hand_value[wbishop] = std_hand_value[wbishop] + change;
hand_value[wqueen] = std_hand_value[wqueen] + change;
}
else
{
hand_value[bpawn] = std_hand_value[bpawn] - change;
hand_value[bbishop] = std_hand_value[bbishop] - change;
hand_value[bqueen] = std_hand_value[bqueen] - change;
}
printf("tellics ptell Ok, Diagonal %s\n", howmuch);
}
if (strstr(input+6, "h") != NULL)
{
if (comp_color == 1)
{
hand_value[wrook] = std_hand_value[wrook] + change;
hand_value[wqueen] = std_hand_value[wqueen] + change;
}
else
{
hand_value[brook] = std_hand_value[brook] - change;
hand_value[bqueen] = std_hand_value[bqueen] - change;
}
printf("tellics ptell Ok, Heavy %s\n", howmuch);
}
}
else if (!strncmp(input+6, "-", 1))
{
if ((strstr(input+6, "trade") != NULL)
|| (
(strstr(input+6, "n") == NULL) &&
(strstr(input+6, "b") == NULL) &&
(strstr(input+6, "p") == NULL) &&
(strstr(input+6, "r") == NULL) &&
(strstr(input+6, "q") == NULL) &&
(strstr(input+6, "d") == NULL) &&
(strstr(input+6, "h") == NULL)))
{
if (comp_color == 1)
{
hand_value[bpawn] -= 20;
hand_value[bknight] -= 50;
hand_value[bbishop] -= 50;
hand_value[brook] -= 50;
hand_value[bqueen] -= 100;
}
else
{
hand_value[wpawn] += 20;
hand_value[wknight] += 50;
hand_value[wbishop] += 50;
hand_value[wrook] += 50;
hand_value[wqueen] += 100;
}
printf("tellics ptell Ok, trading is BAD\n");
}
else if (strstr(input+6, "---") != NULL)
{
change = 50000;
strcpy(howmuch, "mates you (ptell me 'x' when it no longer mates you)");
}
else if (strstr(input+6, "--") != NULL)
{
change = 1000;
strcpy(howmuch, "is VERY bad (ptell me 'x' when it is no longer bad)");
}
else if (strstr(input+6, "-") != NULL)
{
change = 150;
strcpy(howmuch, "is bad (ptell me 'x' when it is no longer bad)");
}
else
DIE;
if (strstr(input+6, "n") != NULL)
{
if (comp_color == 1)
hand_value[bknight] = std_hand_value[bknight] - change;
else
hand_value[wknight] = std_hand_value[wknight] + change;
printf("tellics ptell Ok, Knight %s\n", howmuch);
}
if (strstr(input+6, "b") != NULL)
{
if (comp_color == 1)
hand_value[bbishop] = std_hand_value[bbishop] - change;
else
hand_value[wbishop] = std_hand_value[wbishop] + change;
if (comp_color == 1)
hand_value[bqueen] = std_hand_value[bqueen] - change;
else
hand_value[wqueen] = std_hand_value[wqueen] + change;
printf("tellics ptell Ok, Bishop %s\n", howmuch);
}
if (strstr(input+6, "r") != NULL)
{
if (comp_color == 1)
hand_value[brook] = std_hand_value[brook] - change;
else
hand_value[wrook] = std_hand_value[wrook] + change;
if (comp_color == 1)
hand_value[bqueen] = std_hand_value[bqueen] - change;
else
hand_value[wqueen] = std_hand_value[wqueen] + change;
printf("tellics ptell Ok, Rook %s\n", howmuch);
}
if (strstr(input+6, "q") != NULL)
{
if (comp_color == 1)
hand_value[bqueen] = std_hand_value[bqueen] - change;
else
hand_value[wqueen] = std_hand_value[wqueen] + change;
printf("tellics ptell Ok, Queen %s\n", howmuch);
}
if (strstr(input+6, "p") != NULL)
{
if (comp_color == 1)
hand_value[bpawn] = std_hand_value[bpawn] - change;
else
hand_value[wpawn] = std_hand_value[wpawn] + change;
if (comp_color == 1)
{
hand_value[bqueen] = std_hand_value[bqueen] - change;
hand_value[bbishop] = std_hand_value[bbishop] - change;
}
else
{
hand_value[wqueen] = std_hand_value[wqueen] + change;
hand_value[wbishop] = std_hand_value[wbishop] + change;
}
printf("tellics ptell Ok, Pawn %s\n", howmuch);
}
if (strstr(input+6, "d") != NULL)
{
if (comp_color == 1)
{
hand_value[bpawn] = std_hand_value[bpawn] - change;
hand_value[bbishop] = std_hand_value[bbishop] - change;
hand_value[bqueen] = std_hand_value[bqueen] - change;
}
else
{
hand_value[wpawn] = std_hand_value[wpawn] + change;
hand_value[wbishop] = std_hand_value[wbishop] + change;
hand_value[wqueen] = std_hand_value[wqueen] + change;
}
printf("tellics ptell Ok, Diagonal %s\n", howmuch);
}
if (strstr(input+6, "h") != NULL)
{
if (comp_color == 1)
{
hand_value[brook] = std_hand_value[brook] - change;
hand_value[bqueen] = std_hand_value[bqueen] - change;
}
else
{
hand_value[wrook] = std_hand_value[wrook] + change;
hand_value[wqueen] = std_hand_value[wqueen] + change;
}
printf("tellics ptell Ok, Heavy %s\n", howmuch);
}
}
else if (((!strncmp(input+6, "x", 1)
|| (strstr(input+6, "mate me anymore") != NULL)
|| ((strstr(input+6, "never") != NULL) && (strstr(input+6, "mind") != NULL)))
|| (!strncmp(input+6, "=", 1))) && (strstr(input+6, "ptell me") == NULL))
{
printf("tellics ptell Ok, reverting to STANDARD piece values!\n");
ResetHandValue();
must_sit = FALSE;
partnerdead = FALSE;
piecedead = FALSE;
}
else if (!strncmp(input+6, "i'll have to sit...(dead)", 25) ||
!strncmp(input+6, "dead", 4))
{
go_fast = TRUE;
must_sit = FALSE;
partnerdead = TRUE;
}
else if (!strncmp(input+6, "i'll have to sit...(piece)", 26))
{
go_fast = TRUE;
must_sit = FALSE;
piecedead = TRUE;
}
else if (!strncmp(input+6, "sorry", 5))
{
return;
}
else if (!strncmp(input+6, "ok", 2))
{
return;
}
else if (!strncmp(input+6, "hi", 2) || (!strncmp(input+6, "hello", 5)))
{
printf("tellics ptell Greetings.\n");
}
else if (strstr(input+6, "formula") != NULL)
{
printf("tellics ptell Setting formula, if you are still interrupted, complain to my operator.\n");
printf("tellics set f5 bughouse\n");
}
else
{
printf("tellics ptell Sorry, but I don't understand that command.\n");
}
return;
}
#define CANCEL_THRESH 3
void CheckBadFlow(bool reset)
{
move_s hismoves[MOVE_BUFF];
move_s ourmoves[MOVE_BUFF];
int his_num_moves, our_num_moves, j, i, ic, icc;
bool othermove = FALSE;
int
pawnmates = FALSE,
knightmates = FALSE,
bishopmates = FALSE,
rookmates = FALSE,
queenmates = FALSE;
static int
pawnmated = FALSE,
knightmated = FALSE,
bishopmated = FALSE,
rookmated = FALSE,
queenmated = FALSE;
bool
pawnwarn = FALSE,
knightwarn = FALSE,
bishopwarn = FALSE,
rookwarn = FALSE,
queenwarn = FALSE;
if (reset)
{
pawnmated = FALSE;
knightmated = FALSE;
bishopmated = FALSE;
rookmated = FALSE;
queenmated = FALSE;
return;
}
ic = in_check();
if (!holding[!white_to_move][(white_to_move ? wpawn : bpawn)])
{
DropaddHolding((white_to_move ? wpawn : bpawn) , !white_to_move);
gen(&hismoves[0]);
his_num_moves = numb_moves;
for(i = 0; (i < his_num_moves) && (pawnmates == FALSE); i++)
{
make(&hismoves[0], i);
if (check_legal(&hismoves[0], i, ic))
{
pawnmates = CANCEL_THRESH;
icc = in_check();
gen(&ourmoves[0]);
our_num_moves = numb_moves;
for (j = 0; (j < our_num_moves) && (pawnmates != FALSE); j++)
{
make(&ourmoves[0], j);
if (check_legal(&ourmoves[0], j, icc))
pawnmates = FALSE;
unmake(&ourmoves[0], j);
}
}
unmake(&hismoves[0], i);
}
DropremoveHolding((white_to_move ? wpawn : bpawn), !white_to_move);
}
if (!holding[!white_to_move][(white_to_move ? wknight : bknight)])
{
DropaddHolding((white_to_move ? wknight : bknight) , !white_to_move);
gen(&hismoves[0]);
his_num_moves = numb_moves;
for(i = 0; (i < his_num_moves) && (knightmates == FALSE); i++)
{
make(&hismoves[0], i);
if (check_legal(&hismoves[0], i, ic))
{
knightmates = CANCEL_THRESH;
icc = in_check();
gen(&ourmoves[0]);
our_num_moves = numb_moves;
for (j = 0; (j < our_num_moves) && (knightmates != FALSE); j++)
{
make(&ourmoves[0], j);
if (check_legal(&ourmoves[0], j, icc))
knightmates = FALSE;
unmake(&ourmoves[0], j);
}
}
unmake(&hismoves[0], i);
}
DropremoveHolding((white_to_move ? wknight : bknight), !white_to_move);
}
if (!holding[!white_to_move][(white_to_move ? wbishop : bbishop)])
{
DropaddHolding((white_to_move ? wbishop : bbishop) , !white_to_move);
gen(&hismoves[0]);
his_num_moves = numb_moves;
for(i = 0; (i < his_num_moves) && (bishopmates == FALSE); i++)
{
make(&hismoves[0], i);
if (check_legal(&hismoves[0], i, ic))
{
bishopmates = CANCEL_THRESH;
icc = in_check();
gen(&ourmoves[0]);
our_num_moves = numb_moves;
for (j = 0; (j < our_num_moves) && (bishopmates != FALSE); j++)
{
make(&ourmoves[0], j);
if (check_legal(&ourmoves[0], j, icc))
bishopmates = FALSE;
unmake(&ourmoves[0], j);
}
}
unmake(&hismoves[0], i);
}
DropremoveHolding((white_to_move ? wbishop : bbishop), !white_to_move);
}
if (!holding[!white_to_move][(white_to_move ? wrook : brook)])
{
DropaddHolding((white_to_move ? wrook : brook) , !white_to_move);
gen(&hismoves[0]);
his_num_moves= numb_moves;
for(i = 0; (i < his_num_moves) && (rookmates == FALSE); i++)
{
make(&hismoves[0], i);
if (check_legal(&hismoves[0], i, ic))
{
rookmates = CANCEL_THRESH;
icc = in_check();
gen(&ourmoves[0]);
our_num_moves = numb_moves;
for (j = 0; (j < our_num_moves) && (rookmates != FALSE); j++)
{
make(&ourmoves[0], j);
if (check_legal(&ourmoves[0], j, icc))
rookmates = FALSE;
unmake(&ourmoves[0], j);
}
}
unmake(&hismoves[0], i);
}
DropremoveHolding((white_to_move ? wrook : brook), !white_to_move);
}
if (!holding[!white_to_move][(white_to_move ? wqueen : bqueen)])
{
DropaddHolding((white_to_move ? wqueen : bqueen) , !white_to_move);
gen(&hismoves[0]);
his_num_moves= numb_moves;
for(i = 0; (i < his_num_moves) && (queenmates == FALSE); i++)
{
make(&hismoves[0], i);
if (check_legal(&hismoves[0], i, ic))
{
queenmates = CANCEL_THRESH;
icc = in_check();
gen(&ourmoves[0]);
our_num_moves = numb_moves;
for (j = 0; (j < our_num_moves) && (queenmates != FALSE); j++)
{
make(&ourmoves[0], j);
if (check_legal(&ourmoves[0], j, icc))
queenmates = FALSE;
unmake(&ourmoves[0], j);
}
}
unmake(&hismoves[0], i);
}
DropremoveHolding((white_to_move ? wqueen : bqueen), !white_to_move);
}
if (pawnmates != pawnmated)
{
if (pawnmates == CANCEL_THRESH)
pawnwarn = TRUE;
else if (pawnmates == 0 && pawnmated == 0)
{
printf("tellics ptell p doesn't mate me anymore\n");
othermove = TRUE;
}
}
if (knightmates != knightmated)
{
if (knightmates == CANCEL_THRESH)
knightwarn = TRUE;
else if (knightmates == 0 && knightmated == 0)
{
printf("tellics ptell n doesn't mate me anymore\n");
othermove = TRUE;
}
}
if (bishopmates != bishopmated)
{
if (bishopmates == CANCEL_THRESH)
bishopwarn = TRUE;
else if (bishopmates == 0 && bishopmated == 0)
{
printf("tellics ptell b doesn't mate me anymore\n");
othermove = TRUE;
}
}
if (rookmates != rookmated)
{
if (rookmates == CANCEL_THRESH)
rookwarn = TRUE;
else if (rookmates == 0 && rookmated == 0)
{
printf("tellics ptell r doesn't mate me anymore\n");
othermove = TRUE;
}
}
if (queenmates != queenmated)
{
if (queenmates == CANCEL_THRESH)
queenwarn = TRUE;
else if (queenmates == 0 && queenmated == 0)
{
printf("tellics ptell q doesn't mate me anymore\n");
othermove = TRUE;
}
}
if (pawnwarn)
printf("tellics ptell ---p\n");
if (knightwarn)
printf("tellics ptell ---n\n");
if (bishopwarn)
printf("tellics ptell ---b\n");
if (rookwarn)
printf("tellics ptell ---r\n");
if (queenwarn)
printf("tellics ptell ---q\n");
if (piecedead && othermove)
{
piecedead = FALSE;
printf("tellics ptell x\n");
printf("tellics ptell go\n");
go_fast = FALSE;
}
(pawnmates) ? (pawnmated = pawnmates) : (pawnmated--);
(bishopmates) ? (bishopmated = bishopmates) : (bishopmated--);
(rookmates) ? (rookmated = rookmates) : (rookmated--);
(queenmates) ? (queenmated = queenmates) : (queenmated--);
(knightmates) ? (knightmated = knightmates) : (knightmated--);
return;
}