1/*
2    Sjeng - a chess variants playing program
3    Copyright (C) 2000 Gian-Carlo Pascutto
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2 of the License, or
8    (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software
17    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
19    File: partner.c
20    Purpose: handle partner communication
21
22*/
23
24#include "sjeng.h"
25#include "protos.h"
26#include "extvars.h"
27
28int hand_value[] = { 0, 100, -100, 210, -210, 0, 0, 250, -250, 450, -450, 230, -230 };
29int std_hand_value[] = { 0, 100, -100, 210, -210, 0, 0, 250, -250, 450, -450, 230, -230 };
30
31bool piecedead;
32bool partnerdead;
33
34int must_go;
35
36void ResetHandValue(void)
37{
38  memcpy(hand_value, std_hand_value, sizeof(hand_value));
39}
40
41void BegForPartner(void)
42{
43  if (xb_mode)
44    {
45      /* printf("tellics tell 24 partner please\n"); */
46    }
47  return;
48};
49
50void GreetPartner()
51{
52  printf("tellics ptell Hello! I am Sjeng and hope you enjoy playing with me.\n");
53  printf("tellics ptell For help on some commands that I understand, ptell me \'help\'\n");
54
55  return;
56};
57
58void HandlePartner(char *input)
59{
60  if (input[0] == ' ')
61    {
62      if (!have_partner)
63	{
64	  /* catch bogus xboard repartnering */
65	  sscanf(input+1, "%s", my_partner);
66	  have_partner = TRUE;
67	  GreetPartner();
68	  printf("tellics set f5 bughouse\n");
69	  printf("tellics unseek\n");
70	}
71    }
72  else
73    {
74      memset(my_partner, 0, sizeof(my_partner));
75      have_partner = FALSE;
76      BegForPartner();
77      printf("tellics set f5 1=1\n");
78    }
79};
80
81void HandlePtell(char *input)
82{
83  int change = 0;
84  char howmuch[80] = "is...uh...what did you say?\n";
85
86  if (!strncmp(input+6, "help", 4))
87      {
88	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");
89	return;
90    }
91
92  if (Variant != Bughouse && (strncmp(input+6, "sorry", 5)))
93  {
94    printf("tellics ptell Sorry, but I'm not playing a bughouse game.\n");
95    return;
96  }
97
98  if (!strncmp(input+6, "sit", 3))
99    {
100      printf("tellics ptell Ok, I sit next move. Tell me when to go.\n");
101      must_sit = TRUE;
102      must_go = 0;
103    }
104  else if (!strncmp(input+6, "go", 2) || (!strncmp(input+6, "move", 4)))
105    {
106      printf("tellics ptell Ok, I'm moving.\n");
107      must_sit = FALSE;
108      must_go = 4;
109    }
110  else if (!strncmp(input+6, "fast", 4) || (!strncmp(input+6, "time", 4)))
111    {
112      printf("tellics ptell Ok, I'm going FAST!\n");
113      go_fast = TRUE;
114      must_sit = FALSE;
115    }
116  else if (!strncmp(input+6, "slow", 4))
117    {
118      printf("tellics ptell Ok, moving normally.\n");
119      go_fast = FALSE;
120      must_sit = FALSE;
121    }
122  else if (!strncmp(input+6, "abort", 5))
123    {
124      printf("tellics ptell Requesting abort...\n");
125      printf("tellics abort\n");
126    }
127  else if (!strncmp(input+6, "flag", 4))
128    {
129      printf("tellics ptell Flagging...\n");
130      printf("tellics flag\n");
131    }
132  else if (!strncmp(input+6, "+", 1))
133    {
134      /* trades are handled seperately */
135      if ((strstr(input+6, "trade") != NULL)   /* either an explicit trade request */
136	  || (                                 /* or there's just no piece in the string */
137	      (strstr(input+6, "n") == NULL) &&
138	      (strstr(input+6, "b") == NULL) &&
139	      (strstr(input+6, "p") == NULL) &&
140	      (strstr(input+6, "r") == NULL) &&
141	      (strstr(input+6, "q") == NULL) &&
142	      (strstr(input+6, "d") == NULL) &&
143	      (strstr(input+6, "h") == NULL)))
144	{
145	  if (comp_color == 1)
146	    {
147	      hand_value[wpawn] += 25;
148	      hand_value[wknight] += 50;
149	      hand_value[wbishop] += 50;
150	      hand_value[wrook] += 50;
151	      hand_value[wqueen] += 100;
152	    }
153	  else
154	    {
155	      hand_value[bpawn] -= 25;
156	      hand_value[bknight] -= 50;
157	      hand_value[bbishop] -= 50;
158	      hand_value[brook] -= 50;
159	      hand_value[bqueen] -= 100;
160	    }
161	  printf("tellics ptell Ok, trading is GOOD\n");
162	}
163      /* first, find how much we want that piece */
164      else if (strstr(input+6, "+++") != NULL)
165	{
166	  change = 50000;
167	  strcpy(howmuch, "mates");
168	}
169      else if (strstr(input+6, "++") != NULL)
170	{
171	  change = 1000;
172	  strcpy(howmuch, "is VERY good (ptell me 'x' to play normal again)");
173	}
174      else if (strstr(input+6, "+") != NULL)
175	{
176	  change = 150;
177	  strcpy(howmuch, "is good (ptell me 'x' to play normal again)");
178	}
179      else
180	DIE;
181
182      /* now find which piece we want */
183      if (strstr(input+6, "n") != NULL)
184	{
185	  if (comp_color == 1)
186	    /* we want a black knight-> the value for holding a white knight rises */
187	    hand_value[wknight] = std_hand_value[wknight] + change;
188	  else
189	    /* we want a white knight */
190	    hand_value[bknight] = std_hand_value[bknight] - change;
191
192	  printf("tellics ptell Ok, Knight %s\n", howmuch);
193	}
194      if (strstr(input+6, "b") != NULL)
195	{
196	  if (comp_color == 1)
197	    hand_value[wbishop] = std_hand_value[wbishop] + change;
198	  else
199	    hand_value[bbishop] = std_hand_value[bbishop] - change;
200
201	  /* b is good, so q is good too */
202	  if (comp_color == 1)
203	    hand_value[wqueen] = std_hand_value[wqueen] + change;
204	  else
205	    hand_value[bqueen] = std_hand_value[bqueen] - change;
206
207	  printf("tellics ptell Ok, Bishop %s\n", howmuch);
208	}
209     if (strstr(input+6, "r") != NULL)
210	{
211	  if (comp_color == 1)
212	    hand_value[wrook] = std_hand_value[wrook] + change;
213	  else
214	    hand_value[brook] = std_hand_value[brook] - change;
215
216	  /* r is good, so q is good too */
217	  if (comp_color == 1)
218	    hand_value[wqueen] = std_hand_value[wqueen] + change;
219	  else
220	    hand_value[bqueen] = std_hand_value[bqueen] - change;
221
222	  printf("tellics ptell Ok, Rook %s\n", howmuch);
223	}
224     if (strstr(input+6, "q") != NULL)
225	{
226	  if (comp_color == 1)
227	    hand_value[wqueen] = std_hand_value[wqueen] + change;
228	  else
229	    hand_value[bqueen] = std_hand_value[bqueen] - change;
230
231	  printf("tellics ptell Ok, Queen %s\n", howmuch);
232	}
233     if (strstr(input+6, "p") != NULL)
234	{
235	  if (comp_color == 1)
236	    hand_value[wpawn] = std_hand_value[wpawn] + change;
237	  else
238	    hand_value[bpawn] = std_hand_value[bpawn] - change;
239
240	  /* p is good, so b and q are good too */
241	  if (comp_color == 1)
242	    {
243	      hand_value[wqueen] = std_hand_value[wqueen] + change;
244	      hand_value[wbishop] = std_hand_value[wbishop] + change;
245	    }
246	  else
247	    {
248	      hand_value[bqueen] = std_hand_value[bqueen] - change;
249	      hand_value[bbishop] = std_hand_value[bbishop] - change;
250	    }
251
252	  printf("tellics ptell Ok, Pawn %s\n", howmuch);
253	}
254     if (strstr(input+6, "d") != NULL)
255	{
256	  if (comp_color == 1)
257	    {
258	      hand_value[wpawn] = std_hand_value[wpawn] + change;
259	      hand_value[wbishop] = std_hand_value[wbishop] + change;
260	      hand_value[wqueen] = std_hand_value[wqueen] + change;
261	    }
262	  else
263	    {
264	      hand_value[bpawn] = std_hand_value[bpawn] - change;
265	      hand_value[bbishop] = std_hand_value[bbishop] - change;
266	      hand_value[bqueen] = std_hand_value[bqueen] - change;
267	    }
268
269	  printf("tellics ptell Ok, Diagonal %s\n", howmuch);
270	}
271     if (strstr(input+6, "h") != NULL)
272	{
273	  if (comp_color == 1)
274	    {
275	      hand_value[wrook] = std_hand_value[wrook] + change;
276	      hand_value[wqueen] = std_hand_value[wqueen] + change;
277	    }
278	  else
279	    {
280	      hand_value[brook] = std_hand_value[brook] - change;
281	      hand_value[bqueen] = std_hand_value[bqueen] - change;
282	    }
283
284	  printf("tellics ptell Ok, Heavy %s\n", howmuch);
285	}
286    }
287  else if (!strncmp(input+6, "-", 1))
288    {
289      /* trades are handled seperately */
290      if ((strstr(input+6, "trade") != NULL)   /* either an explicit trade request */
291	  || (                                 /* or there's just no piece in the string */
292	      (strstr(input+6, "n") == NULL) &&
293	      (strstr(input+6, "b") == NULL) &&
294	      (strstr(input+6, "p") == NULL) &&
295	      (strstr(input+6, "r") == NULL) &&
296	      (strstr(input+6, "q") == NULL) &&
297	      (strstr(input+6, "d") == NULL) &&
298	      (strstr(input+6, "h") == NULL)))
299	{
300      	  if (comp_color == 1)
301	    {
302	      hand_value[bpawn] -= 20;
303	      hand_value[bknight] -= 50;
304	      hand_value[bbishop] -= 50;
305	      hand_value[brook] -= 50;
306	      hand_value[bqueen] -= 100;
307	    }
308	  else
309	    {
310	      hand_value[wpawn] += 20;
311	      hand_value[wknight] += 50;
312	      hand_value[wbishop] += 50;
313	      hand_value[wrook] += 50;
314	      hand_value[wqueen] += 100;
315	    }
316	  printf("tellics ptell Ok, trading is BAD\n");
317	}
318      /* first, find how bad we want to avoid losing that piece */
319      else if (strstr(input+6, "---") != NULL)
320	{
321	  change = 50000;
322	  strcpy(howmuch, "mates you (ptell me 'x' when it no longer mates you)");
323	}
324      else if (strstr(input+6, "--") != NULL)
325	{
326	  change = 1000;
327	  strcpy(howmuch, "is VERY bad (ptell me 'x' when it is no longer bad)");
328	}
329      else if (strstr(input+6, "-") != NULL)
330	{
331	  change = 150;
332	  strcpy(howmuch, "is bad (ptell me 'x' when it is no longer bad)");
333	}
334      else
335	DIE;
336
337      if (strstr(input+6, "n") != NULL)
338	{
339	  if (comp_color == 1)
340	    hand_value[bknight] = std_hand_value[bknight] - change;
341	  else
342	    hand_value[wknight] = std_hand_value[wknight] + change;
343
344	  printf("tellics ptell Ok, Knight %s\n", howmuch);
345	}
346      if (strstr(input+6, "b") != NULL)
347	{
348	  if (comp_color == 1)
349	    hand_value[bbishop] = std_hand_value[bbishop] - change;
350	  else
351	    hand_value[wbishop] = std_hand_value[wbishop] + change;
352
353	  /* b is bad, so q is bad too */
354	  if (comp_color == 1)
355	    hand_value[bqueen] = std_hand_value[bqueen] - change;
356	  else
357	    hand_value[wqueen] = std_hand_value[wqueen] + change;
358
359	  printf("tellics ptell Ok, Bishop %s\n", howmuch);
360	}
361     if (strstr(input+6, "r") != NULL)
362	{
363	  if (comp_color == 1)
364	    hand_value[brook] = std_hand_value[brook] - change;
365	  else
366	    hand_value[wrook] = std_hand_value[wrook] + change;
367
368	  /* r is bad, so q is bad too */
369	  if (comp_color == 1)
370	    hand_value[bqueen] = std_hand_value[bqueen] - change;
371	  else
372	    hand_value[wqueen] = std_hand_value[wqueen] + change;
373
374	  printf("tellics ptell Ok, Rook %s\n", howmuch);
375	}
376     if (strstr(input+6, "q") != NULL)
377	{
378	  if (comp_color == 1)
379	    hand_value[bqueen] = std_hand_value[bqueen] - change;
380	  else
381	    hand_value[wqueen] = std_hand_value[wqueen] + change;
382
383	  printf("tellics ptell Ok, Queen %s\n", howmuch);
384	}
385     if (strstr(input+6, "p") != NULL)
386	{
387	  if (comp_color == 1)
388	    hand_value[bpawn] = std_hand_value[bpawn] - change;
389	  else
390	    hand_value[wpawn] = std_hand_value[wpawn] + change;
391
392	  /* p is bad, so b and q are bad too */
393	  if (comp_color == 1)
394	    {
395	      hand_value[bqueen] = std_hand_value[bqueen] - change;
396	      hand_value[bbishop] = std_hand_value[bbishop] - change;
397	    }
398	  else
399	    {
400	      hand_value[wqueen] = std_hand_value[wqueen] + change;
401	      hand_value[wbishop] = std_hand_value[wbishop] + change;
402	    }
403
404	  printf("tellics ptell Ok, Pawn %s\n", howmuch);
405	}
406     if (strstr(input+6, "d") != NULL)
407	{
408	  if (comp_color == 1)
409	    {
410	      hand_value[bpawn] = std_hand_value[bpawn] - change;
411	      hand_value[bbishop] = std_hand_value[bbishop] - change;
412	      hand_value[bqueen] = std_hand_value[bqueen] - change;
413	    }
414	  else
415	    {
416	      hand_value[wpawn] = std_hand_value[wpawn] + change;
417	      hand_value[wbishop] = std_hand_value[wbishop] + change;
418	      hand_value[wqueen] = std_hand_value[wqueen] + change;
419	    }
420
421	  printf("tellics ptell Ok, Diagonal %s\n", howmuch);
422	}
423     if (strstr(input+6, "h") != NULL)
424	{
425	  if (comp_color == 1)
426	    {
427	      hand_value[brook] = std_hand_value[brook] - change;
428	      hand_value[bqueen] = std_hand_value[bqueen] - change;
429	    }
430	  else
431	    {
432	      hand_value[wrook] = std_hand_value[wrook] + change;
433	      hand_value[wqueen] = std_hand_value[wqueen] + change;
434	    }
435
436	  printf("tellics ptell Ok, Heavy %s\n", howmuch);
437	}
438    }
439  else if (((!strncmp(input+6, "x", 1)
440       || (strstr(input+6, "mate me anymore") != NULL)
441       || ((strstr(input+6, "never") != NULL) && (strstr(input+6, "mind") != NULL)))
442       || (!strncmp(input+6, "=", 1))) && (strstr(input+6, "ptell me") == NULL))
443    {
444      printf("tellics ptell Ok, reverting to STANDARD piece values!\n");
445      ResetHandValue();
446      must_sit = FALSE;
447      partnerdead = FALSE;
448      piecedead = FALSE;
449    }
450  else if (!strncmp(input+6, "i'll have to sit...(dead)", 25) ||
451	   !strncmp(input+6, "dead", 4))
452    {
453      /* fellow sjeng is dead -> give it all we've got */
454      go_fast = TRUE;
455      must_sit = FALSE;
456      partnerdead = TRUE;
457
458      /* maybe also here tell go if partner is sjeng ? */
459    }
460  else if (!strncmp(input+6, "i'll have to sit...(piece)", 26))
461    {
462      /* fellow sjeng is dead -> get safe fast */
463      go_fast = TRUE;
464      must_sit = FALSE;
465      piecedead = TRUE;
466    }
467  else if (!strncmp(input+6, "sorry", 5))
468    {
469      return;
470    }
471  else if (!strncmp(input+6, "ok", 2))
472    {
473      return;
474    }
475  else if (!strncmp(input+6, "hi", 2) || (!strncmp(input+6, "hello", 5)))
476    {
477      printf("tellics ptell Greetings.\n");
478    }
479  else if (strstr(input+6, "formula") != NULL)
480  {
481     printf("tellics ptell Setting formula, if you are still interrupted, complain to my operator.\n");
482     printf("tellics set f5 bughouse\n");
483  }
484  else
485    {
486      printf("tellics ptell Sorry, but I don't understand that command.\n");
487    }
488  return;
489}
490
491#define CANCEL_THRESH 3
492
493void CheckBadFlow(bool reset)
494{
495  move_s hismoves[MOVE_BUFF];
496  move_s ourmoves[MOVE_BUFF];
497  int his_num_moves, our_num_moves, j, i, ic, icc;
498
499  bool othermove = FALSE;
500
501  int
502    pawnmates = FALSE,
503    knightmates = FALSE,
504    bishopmates = FALSE,
505    rookmates = FALSE,
506    queenmates = FALSE;
507
508  static int
509    pawnmated = FALSE,
510    knightmated = FALSE,
511    bishopmated = FALSE,
512    rookmated = FALSE,
513    queenmated = FALSE;
514
515  bool
516    pawnwarn = FALSE,
517    knightwarn = FALSE,
518    bishopwarn = FALSE,
519    rookwarn = FALSE,
520    queenwarn = FALSE;
521
522  if (reset)
523    {
524      pawnmated = FALSE;
525      knightmated = FALSE;
526      bishopmated = FALSE;
527      rookmated = FALSE;
528      queenmated = FALSE;
529      return;
530    }
531
532  ic = in_check();
533
534  if (!holding[!white_to_move][(white_to_move ? wpawn : bpawn)])
535    {
536
537      DropaddHolding((white_to_move ? wpawn : bpawn) , !white_to_move);
538
539      gen(&hismoves[0]);
540      his_num_moves = numb_moves;
541
542      for(i = 0; (i < his_num_moves) && (pawnmates == FALSE); i++)
543	{
544	  make(&hismoves[0], i);
545
546	  if (check_legal(&hismoves[0], i, ic))
547	    {
548	      pawnmates = CANCEL_THRESH;
549
550	      icc = in_check();
551
552	      gen(&ourmoves[0]);
553	      our_num_moves = numb_moves;
554
555	      for (j = 0; (j < our_num_moves) && (pawnmates != FALSE); j++)
556		{
557
558		  make(&ourmoves[0], j);
559
560		  if (check_legal(&ourmoves[0], j, icc))
561		    pawnmates = FALSE;
562
563		  unmake(&ourmoves[0], j);
564
565		}
566	    }
567	  unmake(&hismoves[0], i);
568	}
569      DropremoveHolding((white_to_move ? wpawn : bpawn), !white_to_move);
570    }
571
572  if (!holding[!white_to_move][(white_to_move ? wknight : bknight)])
573    {
574
575      DropaddHolding((white_to_move ? wknight : bknight) , !white_to_move);
576
577      gen(&hismoves[0]);
578      his_num_moves = numb_moves;
579
580      for(i = 0; (i < his_num_moves) && (knightmates == FALSE); i++)
581	{
582
583	  make(&hismoves[0], i);
584
585	  if (check_legal(&hismoves[0], i, ic))
586	    {
587	      knightmates = CANCEL_THRESH;
588
589	      icc = in_check();
590
591	      gen(&ourmoves[0]);
592	      our_num_moves = numb_moves;
593
594	      for (j = 0; (j < our_num_moves) && (knightmates != FALSE); j++)
595		{
596		  make(&ourmoves[0], j);
597
598		  if (check_legal(&ourmoves[0], j, icc))
599		    knightmates = FALSE;
600
601		  unmake(&ourmoves[0], j);
602		}
603	    }
604	  unmake(&hismoves[0], i);
605	}
606      DropremoveHolding((white_to_move ? wknight : bknight), !white_to_move);
607    }
608
609  if (!holding[!white_to_move][(white_to_move ? wbishop : bbishop)])
610    {
611
612      DropaddHolding((white_to_move ? wbishop : bbishop) , !white_to_move);
613
614      gen(&hismoves[0]);
615      his_num_moves = numb_moves;
616
617      for(i = 0; (i < his_num_moves) && (bishopmates == FALSE); i++)
618	{
619	  make(&hismoves[0], i);
620
621	  if (check_legal(&hismoves[0], i, ic))
622	    {
623	      bishopmates = CANCEL_THRESH;
624
625	      icc = in_check();
626
627	      gen(&ourmoves[0]);
628	      our_num_moves = numb_moves;
629
630	      for (j = 0; (j < our_num_moves) && (bishopmates != FALSE); j++)
631		{
632		  make(&ourmoves[0], j);
633
634		  if (check_legal(&ourmoves[0], j, icc))
635		    bishopmates = FALSE;
636
637		  unmake(&ourmoves[0], j);
638		}
639	    }
640	  unmake(&hismoves[0], i);
641	}
642      DropremoveHolding((white_to_move ? wbishop : bbishop), !white_to_move);
643    }
644
645  if (!holding[!white_to_move][(white_to_move ? wrook : brook)])
646    {
647
648      DropaddHolding((white_to_move ? wrook : brook) , !white_to_move);
649
650      gen(&hismoves[0]);
651      his_num_moves= numb_moves;
652
653      for(i = 0; (i < his_num_moves) && (rookmates == FALSE); i++)
654	{
655	  make(&hismoves[0], i);
656
657	  if (check_legal(&hismoves[0], i, ic))
658	    {
659	      rookmates = CANCEL_THRESH;
660
661	      icc = in_check();
662
663	      gen(&ourmoves[0]);
664	      our_num_moves = numb_moves;
665
666	      for (j = 0; (j < our_num_moves) && (rookmates != FALSE); j++)
667		{
668		  make(&ourmoves[0], j);
669
670		  if (check_legal(&ourmoves[0], j, icc))
671		    rookmates = FALSE;
672
673		  unmake(&ourmoves[0], j);
674		}
675	    }
676	  unmake(&hismoves[0], i);
677	}
678      DropremoveHolding((white_to_move ? wrook : brook), !white_to_move);
679    }
680
681  if (!holding[!white_to_move][(white_to_move ? wqueen : bqueen)])
682    {
683
684      DropaddHolding((white_to_move ? wqueen : bqueen) , !white_to_move);
685
686      gen(&hismoves[0]);
687      his_num_moves= numb_moves;
688
689      for(i = 0; (i < his_num_moves) && (queenmates == FALSE); i++)
690	{
691	  make(&hismoves[0], i);
692
693	  if (check_legal(&hismoves[0], i, ic))
694	    {
695	      queenmates = CANCEL_THRESH;
696
697	      icc = in_check();
698
699	      gen(&ourmoves[0]);
700	      our_num_moves = numb_moves;
701
702	      for (j = 0; (j < our_num_moves) && (queenmates != FALSE); j++)
703		{
704		  make(&ourmoves[0], j);
705
706		  if (check_legal(&ourmoves[0], j, icc))
707		    queenmates = FALSE;
708
709		  unmake(&ourmoves[0], j);
710		}
711	    }
712	  unmake(&hismoves[0], i);
713	}
714      DropremoveHolding((white_to_move ? wqueen : bqueen), !white_to_move);
715    }
716
717  /* order in which we tell things is important if we partner ourselves */
718
719  /* only update if changed */
720  if (pawnmates != pawnmated)
721    {
722      if (pawnmates == CANCEL_THRESH)
723	  pawnwarn = TRUE;
724      else if (pawnmates == 0 && pawnmated == 0)
725	{
726	  printf("tellics ptell p doesn't mate me anymore\n");
727	  othermove = TRUE;
728	}
729    }
730
731  if (knightmates != knightmated)
732    {
733      if (knightmates == CANCEL_THRESH)
734	  knightwarn = TRUE;
735      else if (knightmates == 0 && knightmated == 0)
736	{
737	  printf("tellics ptell n doesn't mate me anymore\n");
738	  othermove = TRUE;
739	}
740    }
741
742  if (bishopmates != bishopmated)
743    {
744      if (bishopmates == CANCEL_THRESH)
745	  bishopwarn = TRUE;
746      else if (bishopmates == 0 && bishopmated == 0)
747	{
748	  printf("tellics ptell b doesn't mate me anymore\n");
749	  othermove = TRUE;
750	}
751    }
752  if (rookmates != rookmated)
753    {
754      if (rookmates == CANCEL_THRESH)
755	  rookwarn = TRUE;
756      else if (rookmates == 0 && rookmated == 0)
757	{
758	  printf("tellics ptell r doesn't mate me anymore\n");
759	  othermove = TRUE;
760	}
761    }
762  if (queenmates != queenmated)
763    {
764      if (queenmates == CANCEL_THRESH)
765	  queenwarn = TRUE;
766      else if (queenmates == 0 && queenmated == 0)
767	{
768	  printf("tellics ptell q doesn't mate me anymore\n");
769	  othermove = TRUE;
770	}
771    }
772
773  if (pawnwarn)
774	printf("tellics ptell ---p\n");
775  if (knightwarn)
776	printf("tellics ptell ---n\n");
777  if (bishopwarn)
778	printf("tellics ptell ---b\n");
779  if (rookwarn)
780	printf("tellics ptell ---r\n");
781  if (queenwarn)
782	printf("tellics ptell ---q\n");
783
784  /* if other sjeng had to sit because of piece-loss, he
785     may be able to go now */
786
787  if (piecedead && othermove)
788    {
789      piecedead = FALSE;
790      printf("tellics ptell x\n");
791      printf("tellics ptell go\n");
792      go_fast = FALSE;
793    }
794
795  (pawnmates) ? (pawnmated = pawnmates) : (pawnmated--);
796  (bishopmates) ? (bishopmated = bishopmates) : (bishopmated--);
797  (rookmates) ? (rookmated = rookmates) : (rookmated--);
798  (queenmates) ? (queenmated = queenmates) : (queenmated--);
799  (knightmates) ? (knightmated = knightmates) : (knightmated--);
800
801  return;
802}
803
804