Subversion Repositories Games.Chess Giants

Rev

Rev 96 | Rev 169 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 96 Rev 154
Line 121... Line 121...
121
        result = INVALID;
121
        result = INVALID;
122
 
122
 
123
    // Immediate win if a pawn can be promoted without getting captured
123
    // Immediate win if a pawn can be promoted without getting captured
124
    else if (   us == WHITE
124
    else if (   us == WHITE
125
             && rank_of(psq) == RANK_7
125
             && rank_of(psq) == RANK_7
126
             && ksq[us] != psq + DELTA_N
126
             && ksq[us] != psq + NORTH
127
             && (    distance(ksq[~us], psq + DELTA_N) > 1
127
             && (    distance(ksq[~us], psq + NORTH) > 1
128
                 || (StepAttacksBB[KING][ksq[us]] & (psq + DELTA_N))))
128
                 || (StepAttacksBB[KING][ksq[us]] & (psq + NORTH))))
129
        result = WIN;
129
        result = WIN;
130
 
130
 
131
    // Immediate draw if it is a stalemate or a king captures undefended pawn
131
    // Immediate draw if it is a stalemate or a king captures undefended pawn
132
    else if (   us == BLACK
132
    else if (   us == BLACK
133
             && (  !(StepAttacksBB[KING][ksq[us]] & ~(StepAttacksBB[KING][ksq[~us]] | StepAttacksBB[PAWN][psq]))
133
             && (  !(StepAttacksBB[KING][ksq[us]] & ~(StepAttacksBB[KING][ksq[~us]] | StepAttacksBB[PAWN][psq]))
Line 164... Line 164...
164
                         : db[index(Them, pop_lsb(&b), ksq[Them]  , psq)];
164
                         : db[index(Them, pop_lsb(&b), ksq[Them]  , psq)];
165
 
165
 
166
    if (Us == WHITE)
166
    if (Us == WHITE)
167
    {
167
    {
168
        if (rank_of(psq) < RANK_7)      // Single push
168
        if (rank_of(psq) < RANK_7)      // Single push
169
            r |= db[index(Them, ksq[Them], ksq[Us], psq + DELTA_N)];
169
            r |= db[index(Them, ksq[Them], ksq[Us], psq + NORTH)];
170
 
170
 
171
        if (   rank_of(psq) == RANK_2   // Double push
171
        if (   rank_of(psq) == RANK_2   // Double push
172
            && psq + DELTA_N != ksq[Us]
172
            && psq + NORTH != ksq[Us]
173
            && psq + DELTA_N != ksq[Them])
173
            && psq + NORTH != ksq[Them])
174
            r |= db[index(Them, ksq[Them], ksq[Us], psq + DELTA_N + DELTA_N)];
174
            r |= db[index(Them, ksq[Them], ksq[Us], psq + NORTH + NORTH)];
175
    }
175
    }
176
 
176
 
177
    return result = r & Good  ? Good  : r & UNKNOWN ? UNKNOWN : Bad;
177
    return result = r & Good  ? Good  : r & UNKNOWN ? UNKNOWN : Bad;
178
  }
178
  }
179
 
179