Make multi-PV mode accessible from XBoard protocol
[bonanza.git] / utility.c
1 #include <assert.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <math.h>
6 #include <limits.h>
7 #include "shogi.h"
8
9
10 int
11 ini_game( tree_t * restrict ptree, const min_posi_t *pmin_posi, int flag,
12           const char *str_name1, const char *str_name2 )
13 {
14   bitboard_t bb;
15   int piece;
16   int sq, iret;
17
18   if ( flag & flag_history )
19     {
20       iret = open_history( str_name1, str_name2 );
21       if ( iret < 0 ) { return iret; }
22     }
23
24   if ( ! ( flag & flag_nofmargin ) )
25     {
26       fmg_misc      = FMG_MISC;
27       fmg_cap       = FMG_CAP;
28       fmg_drop      = FMG_DROP;
29       fmg_mt        = FMG_MT;
30       fmg_misc_king = FMG_MISC_KING;
31       fmg_cap_king  = FMG_CAP_KING;
32     }
33
34   memcpy( ptree->posi.asquare, pmin_posi->asquare, nsquare );
35   ptree->move_last[0]  = ptree->amove;
36   ptree->nsuc_check[0] = 0;
37   ptree->nsuc_check[1] = 0;
38   root_nrep            = 0;
39   root_turn            = pmin_posi->turn_to_move;
40   HAND_B               = pmin_posi->hand_black;
41   HAND_W               = pmin_posi->hand_white;
42   MATERIAL             = 0;
43
44   BBIni( BB_BOCCUPY );
45   BBIni( BB_BPAWN );
46   BBIni( BB_BLANCE );
47   BBIni( BB_BKNIGHT );
48   BBIni( BB_BSILVER );
49   BBIni( BB_BGOLD );
50   BBIni( BB_BBISHOP );
51   BBIni( BB_BROOK );
52   BBIni( BB_BPRO_PAWN );
53   BBIni( BB_BPRO_LANCE );
54   BBIni( BB_BPRO_KNIGHT );
55   BBIni( BB_BPRO_SILVER );
56   BBIni( BB_BHORSE );
57   BBIni( BB_BDRAGON );
58   BBIni( BB_BTGOLD );
59   BBIni( BB_WOCCUPY );
60   BBIni( BB_WPAWN );
61   BBIni( BB_WLANCE );
62   BBIni( BB_WKNIGHT );
63   BBIni( BB_WSILVER );
64   BBIni( BB_WGOLD );
65   BBIni( BB_WBISHOP );
66   BBIni( BB_WROOK );
67   BBIni( BB_WPRO_PAWN );
68   BBIni( BB_WPRO_LANCE );
69   BBIni( BB_WPRO_KNIGHT );
70   BBIni( BB_WPRO_SILVER );
71   BBIni( BB_WHORSE );
72   BBIni( BB_WDRAGON );
73   BBIni( BB_WTGOLD );
74   BBIni( OCCUPIED_FILE );
75   BBIni( OCCUPIED_DIAG1 );
76   BBIni( OCCUPIED_DIAG2 );
77
78   for ( sq = 0; sq < nsquare; sq++ ) {
79     piece = BOARD[sq];
80     if ( piece > 0 ) {
81       Xor( sq, BB_BOCCUPY );
82       XorFile( sq, OCCUPIED_FILE );
83       XorDiag1( sq, OCCUPIED_DIAG1 );
84       XorDiag2( sq, OCCUPIED_DIAG2 );
85       switch ( piece )
86         {
87         case pawn:        Xor( sq, BB_BPAWN );        break;
88         case lance:       Xor( sq, BB_BLANCE );       break;
89         case knight:      Xor( sq, BB_BKNIGHT );      break;
90         case silver:      Xor( sq, BB_BSILVER );      break;
91         case rook:        Xor( sq, BB_BROOK );        break;
92         case bishop:      Xor( sq, BB_BBISHOP );      break;
93         case king:        SQ_BKING = (char)sq;        break;
94         case dragon:      Xor( sq, BB_BDRAGON );      break;
95         case horse:       Xor( sq, BB_BHORSE );       break;
96         case gold:        Xor( sq, BB_BGOLD );        break;
97         case pro_pawn:    Xor( sq, BB_BPRO_PAWN );    break;
98         case pro_lance:   Xor( sq, BB_BPRO_LANCE );   break;
99         case pro_knight:  Xor( sq, BB_BPRO_KNIGHT );  break;
100         case pro_silver:  Xor( sq, BB_BPRO_SILVER );  break;
101         }
102     }
103     else if ( piece < 0 ) {
104       Xor( sq, BB_WOCCUPY );
105       XorFile( sq, OCCUPIED_FILE );
106       XorDiag1( sq, OCCUPIED_DIAG1 );
107       XorDiag2( sq, OCCUPIED_DIAG2 );
108       switch ( - piece )
109         {
110         case pawn:        Xor( sq, BB_WPAWN );        break;
111         case lance:       Xor( sq, BB_WLANCE );       break;
112         case knight:      Xor( sq, BB_WKNIGHT );      break;
113         case silver:      Xor( sq, BB_WSILVER );      break;
114         case rook:        Xor( sq, BB_WROOK );        break;
115         case bishop:      Xor( sq, BB_WBISHOP );      break;
116         case king:        SQ_WKING = (char)sq;        break;
117         case dragon:      Xor( sq, BB_WDRAGON );      break;
118         case horse:       Xor( sq, BB_WHORSE );       break;
119         case gold:        Xor( sq, BB_WGOLD );        break;
120         case pro_pawn:    Xor( sq, BB_WPRO_PAWN );    break;
121         case pro_lance:   Xor( sq, BB_WPRO_LANCE );   break;
122         case pro_knight:  Xor( sq, BB_WPRO_KNIGHT );  break;
123         case pro_silver:  Xor( sq, BB_WPRO_SILVER );  break;
124         }
125     }
126   }
127
128   BBOr( BB_BTGOLD, BB_BPRO_PAWN,   BB_BGOLD );
129   BBOr( BB_BTGOLD, BB_BPRO_LANCE,  BB_BTGOLD );
130   BBOr( BB_BTGOLD, BB_BPRO_KNIGHT, BB_BTGOLD );
131   BBOr( BB_BTGOLD, BB_BPRO_SILVER, BB_BTGOLD );
132   BBOr( BB_B_HDK,  BB_BHORSE,      BB_BDRAGON );
133   BBOr( BB_B_HDK,  BB_BKING,       BB_B_HDK );
134   BBOr( BB_B_BH,   BB_BBISHOP,     BB_BHORSE );
135   BBOr( BB_B_RD,&