V7/usr/src/games/chess/agen.c
#include "old.h"
bagen()
{
int *p1, *p2, v;
p1 = lmp;
if((flag&010)!=0)
if(board[5]==0 && board[6]==0 && board[7]==4)
if(wattack(4) && wattack(5) && wattack(6))
btry(4, 0, 2); /* kingside castle */
if((flag&020)!=0)
if(board[0]==4 && board[1]==0 && board[2]==0 && board[3]==0)
if(wattack(2) && wattack(3) && wattack(4))
btry(4, 0, -2); /* queenside castle */
bgen();
p2 = p1;
while(p2 != lmp) {
v = *p2++;
bmove(*p2);
if(wattack(bkpos)) {
*p1++ = v;
*p1++ = *p2;
}
p2++;
bremove();
}
lmp = p1;
}
btry(from, mask, offset)
int from, mask, offset;
{
if((dir[from]&mask)==0)
bcheck(from, from+offset);
}
bcheck(from, to)
int from, to;
{
if(board[to]>0) return(1);
*lmp++ = (pval+6)[board[to]]-value;
*lmp++ = (from<<8)|to;
return(board[to] != 0);
}
wagen()
{
int *p1, *p2, v;
p1 = lmp;
if((flag&1)!=0)
if(board[61]==0 && board[62]==0 && board[63]== -4)
if(battack(60) && battack(61) && battack(62))
wtry(60, 0, 2); /* kingside castle */
if((flag&2)!=0)
if(board[56]== -4 && board[57]==0 && board[58]==0 && board[59]==0)
if(battack(58) && battack(59) && battack(60))
wtry(60, 0, -2); /* queenside castle */
wgen();
p2 = p1;
while(p2 != lmp) {
v = *p2++;
wmove(*p2);
if(battack(wkpos)) {
*p1++ = v;
*p1++ = *p2;
}
p2++;
wremove();
}
lmp = p1;
}
wtry(from, mask, offset)
int from, mask, offset;
{
if((dir[from]&mask)==0)
wcheck(from, from+offset);
}
wcheck(from, to)
int from, to;
{
if(board[to]<0) return(1);
*lmp++ = value-(pval+6)[board[to]];
*lmp++ = (from<<8)|to;
return(board[to] != 0);
}