if(inc > 0) promo = pieceID[inc - 16]; // move is promotion
else if(castle) to = 2*to - from; // move is castling, and 'to' indicates Rook; calculate King to-square
if(promo == '+' && !perpLoses) promo = 'q';
- if(from%22 > 10) sprintf(buf, "%c@%c%d", pieces[dropType[from]-1&~COLOR], 'a'+(to%22), 1+(to/22)); // move is drop
- else sprintf(buf, "%c%d%c%d%c", 'a'+(from%22), 1+(from/22), 'a'+(to%22), 1+(to/22), promo);
+ if(from%22 > 10) { // move is drop
+ int p = dropType[from] - 1;
+ if(inc) p += 16; // promotion drop
+ sprintf(buf, "%c@%c%d", pieces[p&~COLOR], 'a'+(to%22), 1+(to/22));
+ } else sprintf(buf, "%c%d%c%d%c", 'a'+(from%22), 1+(from/22), 'a'+(to%22), 1+(to/22), promo);
return buf;
}
f -= 'a', r--;
m = 22*r + f;
for(i=0; pieces[i]; i++) if(pieces[i] == piece) break;
- m += handSlot[COLOR - stm + i] << 8;
+ m += handSlot[COLOR - stm + (i & 15)] << 8; // force type to unpromoted before taking from hand
+ if(i > 15) m += 11;
} else {
sscanf(s, "%c%d%c%d%c", &f2, &r2, &f, &r, &prom);
f -= 'a'; f2 -= 'a'; r--, r2--;