summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/chess/chess.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/noncore/games/chess/chess.cpp b/noncore/games/chess/chess.cpp
index 96a838a..29c96bb 100644
--- a/noncore/games/chess/chess.cpp
+++ b/noncore/games/chess/chess.cpp
@@ -1,358 +1,360 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21 21
22// human is not offered a promotion yet 22// human is not offered a promotion yet
23 23
24#include <stdlib.h>
25
24#include <qcanvas.h> 26#include <qcanvas.h>
25#include <qmainwindow.h> 27#include <qmainwindow.h>
26#include <qlist.h> 28#include <qlist.h>
27#include <qimage.h> 29#include <qimage.h>
28#include <qpainter.h> 30#include <qpainter.h>
29#include <qmessagebox.h> 31#include <qmessagebox.h>
30#include <qregexp.h> 32#include <qregexp.h>
31 33
32#include <qpe/config.h> 34#include <qpe/config.h>
33#include <qpe/resource.h> 35#include <qpe/resource.h>
34 36
35#include "chess.h" 37#include "chess.h"
36 38
37#define CHESS_DEBUG 39#define CHESS_DEBUG
38 40
39int pieceSize = 40; 41int pieceSize = 40;
40static QVector < QImage > imgList; 42static QVector < QImage > imgList;
41int timeMoves, timeTime; 43int timeMoves, timeTime;
42 44
43int BoardView::convertToRank(int r) 45int BoardView::convertToRank(int r)
44{ 46{
45 r = r / pieceSize; 47 r = r / pieceSize;
46 if (humanSide == sideWhite) 48 if (humanSide == sideWhite)
47 r = 8 - r; 49 r = 8 - r;
48 else 50 else
49 r++; 51 r++;
50 return r; 52 return r;
51} 53}
52 54
53char BoardView::convertToFile(int f) 55char BoardView::convertToFile(int f)
54{ 56{
55 f = f / pieceSize; 57 f = f / pieceSize;
56 if (humanSide == sideWhite) 58 if (humanSide == sideWhite)
57 return f + 'a'; 59 return f + 'a';
58 else 60 else
59 return 'h' - f; 61 return 'h' - f;
60} 62}
61 63
62int BoardView::convertFromFile(char f) 64int BoardView::convertFromFile(char f)
63{ 65{
64 if (humanSide == sideWhite) 66 if (humanSide == sideWhite)
65 f = f - 'a'; 67 f = f - 'a';
66 else 68 else
67 f = 'h' - f; 69 f = 'h' - f;
68 return f * pieceSize; 70 return f * pieceSize;
69} 71}
70 72
71int BoardView::convertFromRank(int r) 73int BoardView::convertFromRank(int r)
72{ 74{
73 if (humanSide == sideWhite) 75 if (humanSide == sideWhite)
74 r = 8 - r; 76 r = 8 - r;
75 else 77 else
76 r--; 78 r--;
77 return r * pieceSize; 79 return r * pieceSize;
78} 80}
79 81
80// Pieces 82// Pieces
81Piece::Piece(QCanvas * canvas, int t):QCanvasRectangle(canvas) 83Piece::Piece(QCanvas * canvas, int t):QCanvasRectangle(canvas)
82{ 84{
83 type = t; 85 type = t;
84 setSize(pieceSize, pieceSize); 86 setSize(pieceSize, pieceSize);
85 show(); 87 show();
86} 88}
87 89
88Piece *BoardView::newPiece(int t, char f, int r) 90Piece *BoardView::newPiece(int t, char f, int r)
89{ 91{
90 Piece *tmpPiece = new Piece(canvas(), t); 92 Piece *tmpPiece = new Piece(canvas(), t);
91 tmpPiece->move(convertFromFile(f), convertFromRank(r)); 93 tmpPiece->move(convertFromFile(f), convertFromRank(r));
92 list.append(tmpPiece); 94 list.append(tmpPiece);
93 return tmpPiece; 95 return tmpPiece;
94} 96}
95 97
96void BoardView::deletePiece(Piece * p) 98void BoardView::deletePiece(Piece * p)
97{ 99{
98 list.remove(p); 100 list.remove(p);
99 canvas()->update(); 101 canvas()->update();
100} 102}
101 103
102void Piece::drawShape(QPainter & p) 104void Piece::drawShape(QPainter & p)
103{ 105{
104 p.drawImage(int (x()), int (y()), *(imgList[type])); 106 p.drawImage(int (x()), int (y()), *(imgList[type]));
105} 107}
106 108
107void BoardView::buildImages(QImage theme) 109void BoardView::buildImages(QImage theme)
108{ 110{
109 imgList.resize(12); 111 imgList.resize(12);
110 int x; 112 int x;
111 int y = 0; 113 int y = 0;
112 114
113 for (int j = 0; j < 2; j++) { 115 for (int j = 0; j < 2; j++) {
114 x = 0; 116 x = 0;
115 for (int i = 0; i < 6; i++) { 117 for (int i = 0; i < 6; i++) {
116 imgList.insert(i + (j * 6), 118 imgList.insert(i + (j * 6),
117 new QImage(theme. 119 new QImage(theme.
118 copy(x, y, pieceSize, pieceSize))); 120 copy(x, y, pieceSize, pieceSize)));
119 x += pieceSize; 121 x += pieceSize;
120 } 122 }
121 y += pieceSize; 123 y += pieceSize;
122 } 124 }
123} 125}
124 126
125void BoardView::readStdout() 127void BoardView::readStdout()
126{ 128{
127 QString input( crafty->readStdout() ); 129 QString input( crafty->readStdout() );
128#ifdef CHESS_DEBUG 130#ifdef CHESS_DEBUG
129 qDebug("received this string from crafty->\n%s\n", input.latin1()); 131 qDebug("received this string from crafty->\n%s\n", input.latin1());
130#endif 132#endif
131 133
132 int startPosition = input.find("setboard"); 134 int startPosition = input.find("setboard");
133 if (startPosition != -1) 135 if (startPosition != -1)
134 decodePosition(input.remove(0, startPosition + 9)); 136 decodePosition(input.remove(0, startPosition + 9));
135 137
136 if (input.contains("Black mates")) { 138 if (input.contains("Black mates")) {
137 playingGame = FALSE; 139 playingGame = FALSE;
138 emit(showMessage("Black mates")); 140 emit(showMessage("Black mates"));
139 } else if (input.contains("White mates")) { 141 } else if (input.contains("White mates")) {
140 playingGame = FALSE; 142 playingGame = FALSE;
141 emit(showMessage("White mates")); 143 emit(showMessage("White mates"));
142 } else if (input.contains(" resigns")) { 144 } else if (input.contains(" resigns")) {
143 playingGame = FALSE; 145 playingGame = FALSE;
144 emit(showMessage("Computer resigns")); 146 emit(showMessage("Computer resigns"));
145 } else if (input.contains("Draw")) { 147 } else if (input.contains("Draw")) {
146 playingGame = FALSE; 148 playingGame = FALSE;
147 emit(showMessage("Draw")); 149 emit(showMessage("Draw"));
148 } 150 }
149} 151}
150 152
151// this is pretty close to getting done right 153// this is pretty close to getting done right
152// maybe dont use sprites and just draw a picture 154// maybe dont use sprites and just draw a picture
153// there'll be lots of drawing done anyway 155// there'll be lots of drawing done anyway
154// eg creating pictures for the webpages, 156// eg creating pictures for the webpages,
155// and presenting options for promotions 157// and presenting options for promotions
156void BoardView::decodePosition(const QString & t) 158void BoardView::decodePosition(const QString & t)
157{ 159{
158 qDebug("decode copped %s \n", t.latin1()); 160 qDebug("decode copped %s \n", t.latin1());
159 161
160 int count = 0; 162 int count = 0;
161 int stringPos = 0; 163 int stringPos = 0;
162 for (int file = 0; file < 8; file++) { 164 for (int file = 0; file < 8; file++) {
163 for (int rank = 0; rank < 8; rank++) { 165 for (int rank = 0; rank < 8; rank++) {
164 if (count) 166 if (count)
165 count--; 167 count--;
166 else { 168 else {
167 if (t.at(stringPos).isNumber()) 169 if (t.at(stringPos).isNumber())
168 count = t.at(stringPos).digitValue(); 170 count = t.at(stringPos).digitValue();
169 else { 171 else {
170 newPiece(t.at(stringPos).latin1(), 'a' + file, 172 newPiece(t.at(stringPos).latin1(), 'a' + file,
171 rank + 1); 173 rank + 1);
172 } 174 }
173 } 175 }
174 } 176 }
175 } 177 }
176} 178}
177 179
178void BoardView::undo() 180void BoardView::undo()
179{ 181{
180 crafty->writeToStdin("undo\n"); 182 crafty->writeToStdin("undo\n");
181 crafty->writeToStdin("savepos\nclock\n"); 183 crafty->writeToStdin("savepos\nclock\n");
182} 184}
183 185
184void BoardView::emitErrorMessage() 186void BoardView::emitErrorMessage()
185{ 187{
186 if (activeSide != humanSide) 188 if (activeSide != humanSide)
187 emit(showMessage("Not your move")); 189 emit(showMessage("Not your move"));
188 else 190 else
189 emit(showMessage("You are not playing a game")); 191 emit(showMessage("You are not playing a game"));
190} 192}
191 193
192void BoardView::annotateGame() 194void BoardView::annotateGame()
193{ 195{
194 crafty-> 196 crafty->
195 writeToStdin 197 writeToStdin
196 ("savegame game.save\nannotateh game.save bw 0 1.0 1\n"); 198 ("savegame game.save\nannotateh game.save bw 0 1.0 1\n");
197 emit(showMessage("Annotating game")); 199 emit(showMessage("Annotating game"));
198} 200}
199 201
200Piece *BoardView::findPiece(char f, int r) 202Piece *BoardView::findPiece(char f, int r)
201{ 203{
202 QListIterator < Piece > it(list); 204 QListIterator < Piece > it(list);
203 Piece *tmpPiece; 205 Piece *tmpPiece;
204 for (; it.current(); ++it) { 206 for (; it.current(); ++it) {
205 tmpPiece = it.current(); 207 tmpPiece = it.current();
206 if (convertToRank(tmpPiece->x()) == r 208 if (convertToRank(tmpPiece->x()) == r
207 && convertToFile(tmpPiece->y()) == f) 209 && convertToFile(tmpPiece->y()) == f)
208 return tmpPiece; 210 return tmpPiece;
209 } 211 }
210 return 0; 212 return 0;
211} 213}
212 214
213void BoardView::newGame() 215void BoardView::newGame()
214{ 216{
215 activeSide = sideWhite; 217 activeSide = sideWhite;
216 emit(showMessage("New game")); 218 emit(showMessage("New game"));
217 crafty->writeToStdin("new\n"); 219 crafty->writeToStdin("new\n");
218 crafty->writeToStdin("savepos\n"); 220 crafty->writeToStdin("savepos\n");
219 crafty->writeToStdin("time " + 221 crafty->writeToStdin("time " +
220 QString::number(timeMoves) + 222 QString::number(timeMoves) +
221 "/" + QString::number(timeTime) + "\n"); 223 "/" + QString::number(timeTime) + "\n");
222 activeSide = sideWhite; 224 activeSide = sideWhite;
223 if (humanSide == sideBlack) 225 if (humanSide == sideBlack)
224 crafty->writeToStdin("go\n"); 226 crafty->writeToStdin("go\n");
225} 227}
226 228
227void BoardView::setTheme(QString filename) 229void BoardView::setTheme(QString filename)
228{ 230{
229 QImage theme = Resource::loadImage(QString("chess/") + filename); 231 QImage theme = Resource::loadImage(QString("chess/") + filename);
230 pieceSize = theme.height() / 2; 232 pieceSize = theme.height() / 2;
231 setFrameStyle(QFrame::Plain); 233 setFrameStyle(QFrame::Plain);
232 setFixedSize(8 * pieceSize, 8 * pieceSize); 234 setFixedSize(8 * pieceSize, 8 * pieceSize);
233 canvas()->setBackgroundColor(Qt::red); 235 canvas()->setBackgroundColor(Qt::red);
234 canvas()->resize(8 * pieceSize, 8 * pieceSize); 236 canvas()->resize(8 * pieceSize, 8 * pieceSize);
235 whiteSquare = theme.copy(6 * pieceSize, 0, pieceSize, pieceSize); 237 whiteSquare = theme.copy(6 * pieceSize, 0, pieceSize, pieceSize);
236 activeWhiteSquare = theme.copy(7 * pieceSize, 0, pieceSize, pieceSize); 238 activeWhiteSquare = theme.copy(7 * pieceSize, 0, pieceSize, pieceSize);
237 blackSquare = 239 blackSquare =
238 theme.copy(6 * pieceSize, pieceSize, pieceSize, pieceSize); 240 theme.copy(6 * pieceSize, pieceSize, pieceSize, pieceSize);
239 activeBlackSquare = 241 activeBlackSquare =
240 theme.copy(7 * pieceSize, pieceSize, pieceSize, pieceSize); 242 theme.copy(7 * pieceSize, pieceSize, pieceSize, pieceSize);
241 buildImages(theme); 243 buildImages(theme);
242 drawBackgroundImage(QPoint(-1, -1)); 244 drawBackgroundImage(QPoint(-1, -1));
243} 245}
244 246
245 247
246// sets the bg to the default background image for the current theme 248// sets the bg to the default background image for the current theme
247// also resposible for drawing the "active" marker 249// also resposible for drawing the "active" marker
248void BoardView::drawBackgroundImage(QPoint activeSquare) 250void BoardView::drawBackgroundImage(QPoint activeSquare)
249{ 251{
250 bg = QPixmap(8 * pieceSize, 8 * pieceSize); 252 bg = QPixmap(8 * pieceSize, 8 * pieceSize);
251 QPainter p(&bg); 253 QPainter p(&bg);
252 bool col = FALSE; 254 bool col = FALSE;
253 for (int i = 0; i < 8; i++) { 255 for (int i = 0; i < 8; i++) {
254 for (int j = 0; j < 8; j++) { 256 for (int j = 0; j < 8; j++) {
255 QPoint point(i * pieceSize, j * pieceSize); 257 QPoint point(i * pieceSize, j * pieceSize);
256 if (col) { 258 if (col) {
257 if (point.x() == activeSquare.x() 259 if (point.x() == activeSquare.x()
258 && point.y() == activeSquare.y()) 260 && point.y() == activeSquare.y())
259 p.drawImage(point, activeBlackSquare); 261 p.drawImage(point, activeBlackSquare);
260 else 262 else
261 p.drawImage(point, blackSquare); 263 p.drawImage(point, blackSquare);
262 col = FALSE; 264 col = FALSE;
263 } else { 265 } else {
264 if (point.x() == activeSquare.x() 266 if (point.x() == activeSquare.x()
265 && point.y() == activeSquare.y()) 267 && point.y() == activeSquare.y())
266 p.drawImage(point, activeWhiteSquare); 268 p.drawImage(point, activeWhiteSquare);
267 else 269 else
268 p.drawImage(point, whiteSquare); 270 p.drawImage(point, whiteSquare);
269 col = TRUE; 271 col = TRUE;
270 } 272 }
271 } 273 }
272 col = !col; 274 col = !col;
273 } 275 }
274 canvas()->setBackgroundPixmap(bg); 276 canvas()->setBackgroundPixmap(bg);
275 canvas()->update(); 277 canvas()->update();
276} 278}
277 279
278 280
279// Board view widget 281// Board view widget
280void BoardView::contentsMousePressEvent(QMouseEvent * e) 282void BoardView::contentsMousePressEvent(QMouseEvent * e)
281{ 283{
282 QCanvasItemList cList = canvas()->collisions(e->pos()); 284 QCanvasItemList cList = canvas()->collisions(e->pos());
283 if (activeSide == humanSide && playingGame) { 285 if (activeSide == humanSide && playingGame) {
284 if (!activePiece) { 286 if (!activePiece) {
285 if (cList.count()) { 287 if (cList.count()) {
286 activePiece = (Piece *) (*(cList.at(0))); 288 activePiece = (Piece *) (*(cList.at(0)));
287 drawBackgroundImage(QPoint 289 drawBackgroundImage(QPoint
288 (activePiece->x(), activePiece->y())); 290 (activePiece->x(), activePiece->y()));
289 } 291 }
290 } else { 292 } else {
291 if (!(activePiece == (Piece *) (*(cList.at(0))))) { 293 if (!(activePiece == (Piece *) (*(cList.at(0))))) {
292 char fromFile = convertToFile(activePiece->x()); 294 char fromFile = convertToFile(activePiece->x());
293 int fromRank = convertToRank(activePiece->y()); 295 int fromRank = convertToRank(activePiece->y());
294 char toFile = convertToFile(e->pos().x()); 296 char toFile = convertToFile(e->pos().x());
295 int toRank = convertToRank(e->pos().y()); 297 int toRank = convertToRank(e->pos().y());
296 QString moveS; 298 QString moveS;
297 moveS.append(fromFile); 299 moveS.append(fromFile);
298 moveS.append(moveS.number(fromRank)); 300 moveS.append(moveS.number(fromRank));
299 moveS.append(toFile); 301 moveS.append(toFile);
300 moveS.append(moveS.number(toRank)); 302 moveS.append(moveS.number(toRank));
301 if ((activePiece->type == wPawn 303 if ((activePiece->type == wPawn
302 && fromRank == 7 && toRank == 8) 304 && fromRank == 7 && toRank == 8)
303 || (activePiece->type == bPawn 305 || (activePiece->type == bPawn
304 && fromRank == 2 && toRank == 1)) { 306 && fromRank == 2 && toRank == 1)) {
305 // offer a promotion 307 // offer a promotion
306 emit(showMessage 308 emit(showMessage
307 ("you are meant to be offered a promotion here")); 309 ("you are meant to be offered a promotion here"));
308 char promoteTo = wQueen;// doesnt matter for now 310 char promoteTo = wQueen;// doesnt matter for now
309 moveS.append(promoteTo); 311 moveS.append(promoteTo);
310 moveS.append("\n"); 312 moveS.append("\n");
311 crafty->writeToStdin(moveS.latin1()); 313 crafty->writeToStdin(moveS.latin1());
312 } 314 }
313 } 315 }
314 activePiece = 0; 316 activePiece = 0;
315 drawBackgroundImage(QPoint(-1, -1)); 317 drawBackgroundImage(QPoint(-1, -1));
316 } 318 }
317 } 319 }
318 320
319 else { 321 else {
320 emitErrorMessage(); 322 emitErrorMessage();
321 } 323 }
322} 324}
323 325
324void BoardView::swapSides() 326void BoardView::swapSides()
325{ 327{
326 if (activeSide == humanSide && playingGame) { 328 if (activeSide == humanSide && playingGame) {
327 humanSide = !humanSide; 329 humanSide = !humanSide;
328 crafty->writeToStdin("savepos\ngo\n"); 330 crafty->writeToStdin("savepos\ngo\n");
329 } else 331 } else
330 emitErrorMessage(); 332 emitErrorMessage();
331} 333}
332 334
333BoardView::BoardView(QCanvas *c, QWidget *w, const char *name) 335BoardView::BoardView(QCanvas *c, QWidget *w, const char *name)
334 : QCanvasView(c, w, name) { 336 : QCanvasView(c, w, name) {
335 humanSide = sideWhite; 337 humanSide = sideWhite;
336 activeSide = sideWhite; 338 activeSide = sideWhite;
337 playingGame = TRUE; 339 playingGame = TRUE;
338 activePiece = 0; 340 activePiece = 0;
339 list.setAutoDelete(TRUE); 341 list.setAutoDelete(TRUE);
340 setCanvas(new QCanvas()); 342 setCanvas(new QCanvas());
341 Config c("Chess", Config::User); 343 Config conf("Chess", Config::User);
342 c.setGroup("Theme"); 344 conf.setGroup("Theme");
343 QString theme = c.readEntry("imagefile", "simple-28"); 345 QString theme = conf.readEntry("imagefile", "simple-28");
344 setTheme(theme); 346 setTheme(theme);
345 crafty = new CraftyProcess(this); 347 crafty = new CraftyProcess(this);
346 crafty->addArgument("crafty"); 348 crafty->addArgument("crafty");
347 if (!crafty->start()) { 349 if (!crafty->start()) {
348 QMessageBox::critical(0, 350 QMessageBox::critical(0,
349 tr("Could not find crafty chess engine"), 351 tr("Could not find crafty chess engine"),
350 tr("Quit")); 352 tr("Quit"));
351 exit(-1); 353 exit(-1);
352 } 354 }
353 355
354 connect(crafty, SIGNAL(readyReadStdout()), this, SLOT(readStdout())); 356 connect(crafty, SIGNAL(readyReadStdout()), this, SLOT(readStdout()));
355 connect(crafty, SIGNAL(processExited()), this, SLOT(craftyDied())); 357 connect(crafty, SIGNAL(processExited()), this, SLOT(craftyDied()));
356// crafty->writeToStdin("xboard\nics\nkibitz=2\n"); 358// crafty->writeToStdin("xboard\nics\nkibitz=2\n");
357 newGame(); 359 newGame();
358} 360}