①〜③については全て同じ問題が原因のように見えますね
ビット演算についての理解が間違っているように思います
// L7~
//駒の名前
var nametbl = [
"王", "飛", "角", "金", "銀", "歩",
"", "龍", "馬", "", "全", "と",
];
と駒の情報を定義していますがこの配列だと,
[0]〜[5]: 成る前
[6]〜[11]: 成ったあと
の駒を表現しています
// L202~
//駒が「成る」「成らない」の処理
if (isinside(startx, starty, ofsx, ofsy, 5, 5) == true) {
exist1 = isinside(startx, starty, ofsx, ofsy + 4 * player, 5, 1);
exist2 = isinside(endx, endy, ofsx, ofsy + 4 * player, 5, 1);
if (exist1 == true || exist2 == true) {
//敵陣に入るor出る
if ((id < 6) && (nametbl[id | 6] != "")) {
if (confirm("成りますか?")) {
board[starty][startx].id |= 6; //成る
}
}
}
}
この部分で nametbl[id | 6] != ""
は, 成ったあとの駒の情報を取得して裏面が存在しない駒 (王と金) を除外しようとしたように思えますが
for(i=0;i<6;i++) console.log(i|6)
------
6
7
6
7
6
7
となるので裏面の情報を正しく取得できていないようです
この場合だと,単純に6を足してあげるだけで良さそうです
if ((id < 6) && (nametbl[id + 6] != "")) {
if (confirm("成りますか?")) {
board[starty][startx].id += 6; //成る
}
}
↑のような変更で①②は解決できると思います
同様に③も,
// L227
board[y][x].id = (board[endy][endx].id >=6 ? board[endy][endx].id - 6 : board[endy][endx].id); //持ち駒の追加
このようにidが6以上なら6減らして持ち駒に追加,みたいな形にすることで解消できると思います