-
Notifications
You must be signed in to change notification settings - Fork 5
/
undo.php
96 lines (80 loc) · 3.22 KB
/
undo.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php
// $Id: undo.php,v 1.5 2010/08/14 16:57:54 sandking Exp $
/*
This file is part of WebChess. http://webchess.sourceforge.net
Copyright 2010 Jonathan Evraire, Rodrigo Flores
WebChess is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
WebChess is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with WebChess. If not, see <http://www.gnu.org/licenses/>.
*/
/* these functions deal specifically with undoing a move */
function doUndo()
{
global $CFG_TABLE;
global $board, $numMoves;
/* old PHP versions don't have _POST, _GET and _SESSION as auto_globals */
if (!minimum_version("4.1.0"))
global $_POST, $_GET, $_SESSION;
/* get the last move from the history */
/* NOTE: MySQL currently has no support for subqueries */
$tmpMaxTime = mysql_query("SELECT Max(timeOfMove) FROM " . $CFG_TABLE[history] . " WHERE gameID = ".$_SESSION['gameID']);
$maxTime = mysql_result($tmpMaxTime,0);
$moves = mysql_query("SELECT * FROM " . $CFG_TABLE[history] . " WHERE gameID = ".$_SESSION['gameID']." AND timeOfMove = '$maxTime'");
/* if there actually is a move... */
if ($lastMove = mysql_fetch_array($moves, MYSQL_ASSOC))
{
/* if the last move was played by this player */
/* undo move */
$fromRow = $lastMove['fromRow'];
$fromCol = $lastMove['fromCol'];
$toRow = $lastMove['toRow'];
$toCol = $lastMove['toCol'];
$board[$fromRow][$fromCol] = getPieceCode($lastMove['curColor'], $lastMove['curPiece']);
$board[$toRow][$toCol] = 0;
/* check for en-passant */
/* if pawn moves diagonally without replacing a piece, it's en passant */
if (($lastMove['curPiece'] == "pawn") && ($toCol != $fromCol) && is_null($lastMove['replaced']))
{
if ($lastMove['curColor'] == "black")
$board[$fromRow][$toCol] = getPieceCode("white", "pawn");
else
$board[$fromRow][$toCol] = getPieceCode("black", "pawn");
}
/* check for castling */
if ((($board[$fromRow][$fromCol] & COLOR_MASK) == KING) && (abs($toCol - $fromCol) == 2))
{
/* move rook back as well */
if (($toCol - $fromCol) == 2)
{
$board[$fromRow][7] = $board[$fromRow][5];
$board[$fromRow][5] = 0;
}
else
{
$board[$fromRow][0] = $board[$fromRow][3];
$board[$fromRow][3] = 0;
}
}
/* restore lost piece */
if (!is_null($lastMove['replaced']))
{
if ($lastMove['curColor'] == "black")
$board[$toRow][$toCol] = getPieceCode("white", $lastMove['replaced']);
else
$board[$toRow][$toCol] = getPieceCode("black", $lastMove['replaced']);
}
/* remove last move from history */
$numMoves--;
mysql_query("DELETE FROM " . $CFG_TABLE[history] . " WHERE gameID = ".$_SESSION['gameID']." AND timeOfMove = '$maxTime'");
/* else */
/* output error message */
}
}
?>