-rw-r--r-- | noncore/games/zsame/StoneField.cpp | 4 | ||||
-rw-r--r-- | noncore/games/zsame/StoneField.h | 3 | ||||
-rw-r--r-- | noncore/games/zsame/StoneWidget.cpp | 4 | ||||
-rw-r--r-- | noncore/games/zsame/StoneWidget.h | 1 | ||||
-rw-r--r-- | noncore/games/zsame/ZSameWidget.cpp | 1 |
5 files changed, 12 insertions, 1 deletions
diff --git a/noncore/games/zsame/StoneField.cpp b/noncore/games/zsame/StoneField.cpp index 49d8eca..56e9dc5 100644 --- a/noncore/games/zsame/StoneField.cpp +++ b/noncore/games/zsame/StoneField.cpp | |||
@@ -163,228 +163,232 @@ void | |||
163 | StoneField::mark(int index,unsigned char color) { | 163 | StoneField::mark(int index,unsigned char color) { |
164 | if ( index<0 || index>=maxstone ) return; | 164 | if ( index<0 || index>=maxstone ) return; |
165 | 165 | ||
166 | Stone &stone=field[index]; | 166 | Stone &stone=field[index]; |
167 | 167 | ||
168 | if (stone.marked) return; | 168 | if (stone.marked) return; |
169 | 169 | ||
170 | if (!stone.color || stone.color!=color) return; | 170 | if (!stone.color || stone.color!=color) return; |
171 | 171 | ||
172 | stone.changed=true; | 172 | stone.changed=true; |
173 | stone.marked=true; | 173 | stone.marked=true; |
174 | marked++; | 174 | marked++; |
175 | 175 | ||
176 | // mark left | 176 | // mark left |
177 | if ((index%sizex)!=0) mark(index-1,color); | 177 | if ((index%sizex)!=0) mark(index-1,color); |
178 | // mark right | 178 | // mark right |
179 | if (((index+1)%sizex)!=0) mark(index+1,color); | 179 | if (((index+1)%sizex)!=0) mark(index+1,color); |
180 | // mark upward | 180 | // mark upward |
181 | if (index>=sizex) mark(index-sizex,color); | 181 | if (index>=sizex) mark(index-sizex,color); |
182 | // mark downward | 182 | // mark downward |
183 | if (index<(sizex-1)*sizey) mark(index+sizex,color); | 183 | if (index<(sizex-1)*sizey) mark(index+sizex,color); |
184 | } | 184 | } |
185 | 185 | ||
186 | void | 186 | void |
187 | StoneField::unmark() { | 187 | StoneField::unmark() { |
188 | if (!marked) return; | 188 | if (!marked) return; |
189 | 189 | ||
190 | Stone *stone=field; | 190 | Stone *stone=field; |
191 | for (int i=0;i<maxstone;i++,stone++) { | 191 | for (int i=0;i<maxstone;i++,stone++) { |
192 | stone->marked=false; | 192 | stone->marked=false; |
193 | stone->changed=true; | 193 | stone->changed=true; |
194 | } | 194 | } |
195 | marked=0; | 195 | marked=0; |
196 | } | 196 | } |
197 | 197 | ||
198 | int | 198 | int |
199 | StoneField::remove(int x,int y,bool force) { | 199 | StoneField::remove(int x,int y,bool force) { |
200 | int index=map(x,y); | 200 | int index=map(x,y); |
201 | 201 | ||
202 | if (index<0) return 0; | 202 | if (index<0) return 0; |
203 | 203 | ||
204 | if (!field[index].marked) { | 204 | if (!field[index].marked) { |
205 | mark(x,y,force); | 205 | mark(x,y,force); |
206 | } | 206 | } |
207 | 207 | ||
208 | if (!marked) return 0; | 208 | if (!marked) return 0; |
209 | 209 | ||
210 | // remove a single stone?? | 210 | // remove a single stone?? |
211 | if (marked==1&&!force) return 0; | 211 | if (marked==1&&!force) return 0; |
212 | 212 | ||
213 | // add current field to undolist | 213 | // add current field to undolist |
214 | if (undolist) | 214 | if (undolist) |
215 | undolist->append(new StoneFieldState(*this)); | 215 | undolist->append(new StoneFieldState(*this)); |
216 | 216 | ||
217 | // increase score | 217 | // increase score |
218 | if (marked>2) | 218 | if (marked>2) |
219 | score+=(marked-2)*(marked-2); | 219 | score+=(marked-2)*(marked-2); |
220 | 220 | ||
221 | // remove marked stones | 221 | // remove marked stones |
222 | Stone *stone=field; | 222 | Stone *stone=field; |
223 | for (int i=0;i<maxstone;i++,stone++) { | 223 | for (int i=0;i<maxstone;i++,stone++) { |
224 | if (stone->marked) { | 224 | if (stone->marked) { |
225 | stone->color=0; | 225 | stone->color=0; |
226 | stone->changed=true; | 226 | stone->changed=true; |
227 | stone->marked=false; | 227 | stone->marked=false; |
228 | } | 228 | } |
229 | } | 229 | } |
230 | int removed=marked; | 230 | int removed=marked; |
231 | marked=0; | 231 | marked=0; |
232 | 232 | ||
233 | for (int col=0;col<sizex;col++) { | 233 | for (int col=0;col<sizex;col++) { |
234 | int i1=col+maxstone-sizex; | 234 | int i1=col+maxstone-sizex; |
235 | while ( i1>=0 && field[i1].color ) i1-=sizex; | 235 | while ( i1>=0 && field[i1].color ) i1-=sizex; |
236 | int i2=i1; | 236 | int i2=i1; |
237 | while (i2>=0) { | 237 | while (i2>=0) { |
238 | while ( i2>=0 && !field[i2].color ) i2-=sizex; | 238 | while ( i2>=0 && !field[i2].color ) i2-=sizex; |
239 | while ( i2>=0 && field[i2].color ) { | 239 | while ( i2>=0 && field[i2].color ) { |
240 | field[i1].color=field[i2].color; | 240 | field[i1].color=field[i2].color; |
241 | field[i1].changed=true; | 241 | field[i1].changed=true; |
242 | field[i2].color=0; | 242 | field[i2].color=0; |
243 | field[i2].changed=true; | 243 | field[i2].changed=true; |
244 | i1-=sizex; | 244 | i1-=sizex; |
245 | i2-=sizex; | 245 | i2-=sizex; |
246 | } | 246 | } |
247 | } | 247 | } |
248 | } | 248 | } |
249 | 249 | ||
250 | // find the last column that has something | 250 | // find the last column that has something |
251 | int lastcol = sizex; | 251 | int lastcol = sizex; |
252 | while (lastcol > 0 && !field[map(lastcol-1, sizey-1)].color) { | 252 | while (lastcol > 0 && !field[map(lastcol-1, sizey-1)].color) { |
253 | lastcol--; | 253 | lastcol--; |
254 | } | 254 | } |
255 | 255 | ||
256 | for (int col=0;col<lastcol-1;) { | 256 | for (int col=0;col<lastcol-1;) { |
257 | bool empty = true; | 257 | bool empty = true; |
258 | for (int row = 0; row < sizey; row++) | 258 | for (int row = 0; row < sizey; row++) |
259 | if (field[map(col, row)].color) { | 259 | if (field[map(col, row)].color) { |
260 | empty = false; | 260 | empty = false; |
261 | break; | 261 | break; |
262 | } | 262 | } |
263 | if (!empty) { | 263 | if (!empty) { |
264 | col++; | 264 | col++; |
265 | continue; | 265 | continue; |
266 | } | 266 | } |
267 | int nextfullcol = col + 1; | 267 | int nextfullcol = col + 1; |
268 | while (nextfullcol < sizex && | 268 | while (nextfullcol < sizex && |
269 | !field[map(nextfullcol, sizey - 1)].color) | 269 | !field[map(nextfullcol, sizey - 1)].color) |
270 | nextfullcol++; | 270 | nextfullcol++; |
271 | 271 | ||
272 | if (nextfullcol > sizex - 1) | 272 | if (nextfullcol > sizex - 1) |
273 | break; // we're ready | 273 | break; // we're ready |
274 | 274 | ||
275 | for (int row=0; row < sizey; row++) { | 275 | for (int row=0; row < sizey; row++) { |
276 | int source = map(nextfullcol, row); | 276 | int source = map(nextfullcol, row); |
277 | int dest = map(col, row); | 277 | int dest = map(col, row); |
278 | field[dest].color=field[source].color; | 278 | field[dest].color=field[source].color; |
279 | field[dest].changed=true; | 279 | field[dest].changed=true; |
280 | field[source].color=0; | 280 | field[source].color=0; |
281 | field[source].changed=true; | 281 | field[source].changed=true; |
282 | } | 282 | } |
283 | } | 283 | } |
284 | 284 | ||
285 | // add a bonus, if field is empty | 285 | // add a bonus, if field is empty |
286 | if (!field[map(0, sizey-1)].color) { | 286 | if (!field[map(0, sizey-1)].color) { |
287 | score+=1000; | 287 | score+=1000; |
288 | m_gotBonus= true; | 288 | m_gotBonus= true; |
289 | } | 289 | } |
290 | 290 | ||
291 | // gameover is undefined | 291 | // gameover is undefined |
292 | gameover=-1; | 292 | gameover=-1; |
293 | return removed; | 293 | return removed; |
294 | } | 294 | } |
295 | 295 | ||
296 | bool StoneField::undoPossible() const { | 296 | bool StoneField::undoPossible() const { |
297 | return !(!undolist||undolist->isEmpty()); | 297 | return !(!undolist||undolist->isEmpty()); |
298 | } | 298 | } |
299 | 299 | ||
300 | int | 300 | int |
301 | StoneField::undo(int count) { | 301 | StoneField::undo(int count) { |
302 | if (!undoPossible()) | 302 | if (!undoPossible()) |
303 | return 0; | 303 | return 0; |
304 | if (count <= 0) | 304 | if (count <= 0) |
305 | return 0; | 305 | return 0; |
306 | int undocount=1; | 306 | int undocount=1; |
307 | StoneFieldState *state=0; | 307 | StoneFieldState *state=0; |
308 | undolist->setAutoDelete(true); | 308 | undolist->setAutoDelete(true); |
309 | while (--count>0) { | 309 | while (--count>0) { |
310 | if (undolist->count()==1) break; | 310 | if (undolist->count()==1) break; |
311 | undolist->removeLast(); | 311 | undolist->removeLast(); |
312 | undocount++; | 312 | undocount++; |
313 | } | 313 | } |
314 | state=undolist->getLast(); | 314 | state=undolist->getLast(); |
315 | // Q_ASSERT(state); | 315 | // Q_ASSERT(state); |
316 | state->restore(*this); | 316 | state->restore(*this); |
317 | undolist->removeLast(); | 317 | undolist->removeLast(); |
318 | return undocount; | 318 | return undocount; |
319 | } | 319 | } |
320 | 320 | ||
321 | bool | 321 | bool |
322 | StoneField::isGameover() const { | 322 | StoneField::isGameover() const { |
323 | register int i=maxstone-1;; | 323 | register int i=maxstone-1;; |
324 | register unsigned char color; | 324 | register unsigned char color; |
325 | 325 | ||
326 | if (gameover>=0) return (bool)gameover; | 326 | if (gameover>=0) return (bool)gameover; |
327 | // kdDebug() << "-->gameover" << endl; | 327 | // kdDebug() << "-->gameover" << endl; |
328 | 328 | ||
329 | while (i>=0) { | 329 | while (i>=0) { |
330 | // kdDebug() << i << " " << field[i].color << endl; | 330 | // kdDebug() << i << " " << field[i].color << endl; |
331 | // ignore empty fields | 331 | // ignore empty fields |
332 | while ( i>=0 && field[i].color==0 ) i--; | 332 | while ( i>=0 && field[i].color==0 ) i--; |
333 | // Wenn Stein gefunden, | 333 | // Wenn Stein gefunden, |
334 | // dann die Nachbarn auf gleiche Farbe pruefen. | 334 | // dann die Nachbarn auf gleiche Farbe pruefen. |
335 | while ( i>=0 && (color=field[i].color) ) { | 335 | while ( i>=0 && (color=field[i].color) ) { |
336 | // check left | 336 | // check left |
337 | if ( (i%sizex)!=0 && field[i-1].color==color) | 337 | if ( (i%sizex)!=0 && field[i-1].color==color) |
338 | goto check_gameover; | 338 | goto check_gameover; |
339 | // check upward | 339 | // check upward |
340 | if ( i>=sizex && field[i-sizex].color==color) | 340 | if ( i>=sizex && field[i-sizex].color==color) |
341 | goto check_gameover; | 341 | goto check_gameover; |
342 | i--; | 342 | i--; |
343 | } | 343 | } |
344 | } | 344 | } |
345 | check_gameover: | 345 | check_gameover: |
346 | gameover=(i<0); | 346 | gameover=(i<0); |
347 | // kdDebug() << "<--gameover" << endl; | 347 | // kdDebug() << "<--gameover" << endl; |
348 | return (bool)gameover; | 348 | return (bool)gameover; |
349 | } | 349 | } |
350 | 350 | ||
351 | bool StoneField::gotBonus() const { | 351 | bool StoneField::gotBonus() const { |
352 | return m_gotBonus; | 352 | return m_gotBonus; |
353 | } | 353 | } |
354 | 354 | ||
355 | void StoneField::clearBonus() { | ||
356 | m_gotBonus = false; | ||
357 | } | ||
358 | |||
355 | int | 359 | int |
356 | StoneField::getBoard() const { | 360 | StoneField::getBoard() const { |
357 | return board; | 361 | return board; |
358 | } | 362 | } |
359 | 363 | ||
360 | int | 364 | int |
361 | StoneField::getScore() const { | 365 | StoneField::getScore() const { |
362 | return score; | 366 | return score; |
363 | } | 367 | } |
364 | 368 | ||
365 | int | 369 | int |
366 | StoneField::getColors() const { | 370 | StoneField::getColors() const { |
367 | return colors; | 371 | return colors; |
368 | } | 372 | } |
369 | 373 | ||
370 | int | 374 | int |
371 | StoneField::getMarked() const { | 375 | StoneField::getMarked() const { |
372 | return marked; | 376 | return marked; |
373 | } | 377 | } |
374 | 378 | ||
375 | int | 379 | int |
376 | StoneField::getFieldSize() const { | 380 | StoneField::getFieldSize() const { |
377 | return maxstone; | 381 | return maxstone; |
378 | } | 382 | } |
379 | 383 | ||
380 | struct Stone * | 384 | struct Stone * |
381 | StoneField::getField() const { | 385 | StoneField::getField() const { |
382 | return field; | 386 | return field; |
383 | } | 387 | } |
384 | 388 | ||
385 | 389 | ||
386 | 390 | ||
387 | 391 | ||
388 | 392 | ||
389 | 393 | ||
390 | 394 | ||
diff --git a/noncore/games/zsame/StoneField.h b/noncore/games/zsame/StoneField.h index 80be73a..d32d78d 100644 --- a/noncore/games/zsame/StoneField.h +++ b/noncore/games/zsame/StoneField.h | |||
@@ -1,113 +1,114 @@ | |||
1 | /* Yo Emacs, this is -*- C++ -*- */ | 1 | /* Yo Emacs, this is -*- C++ -*- */ |
2 | /* | 2 | /* |
3 | * ksame 0.4 - simple Game | 3 | * ksame 0.4 - simple Game |
4 | * Copyright (C) 1997,1998 Marcus Kreutzberger | 4 | * Copyright (C) 1997,1998 Marcus Kreutzberger |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
8 | * the Free Software Foundation; either version 2 of the License, or | 8 | * the Free Software Foundation; either version 2 of the License, or |
9 | * (at your option) any later version. | 9 | * (at your option) any later version. |
10 | * | 10 | * |
11 | * This program is distributed in the hope that it will be useful, | 11 | * This program is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. | 14 | * GNU General Public License for more details. |
15 | * | 15 | * |
16 | * You should have received a copy of the GNU General Public License | 16 | * You should have received a copy of the GNU General Public License |
17 | * along with this program; if not, write to the Free Software | 17 | * along with this program; if not, write to the Free Software |
18 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 18 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
19 | * | 19 | * |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #ifndef _STONEFIELD | 22 | #ifndef _STONEFIELD |
23 | #define _STONEFIELD | 23 | #define _STONEFIELD |
24 | 24 | ||
25 | #include <krandomsequence.h> | 25 | #include <krandomsequence.h> |
26 | #include <qlist.h> | 26 | #include <qlist.h> |
27 | 27 | ||
28 | struct Stone { | 28 | struct Stone { |
29 | unsigned char color; | 29 | unsigned char color; |
30 | bool changed; | 30 | bool changed; |
31 | bool marked; | 31 | bool marked; |
32 | }; | 32 | }; |
33 | 33 | ||
34 | class StoneField; | 34 | class StoneField; |
35 | class StoneWidget; | 35 | class StoneWidget; |
36 | 36 | ||
37 | class StoneFieldState { | 37 | class StoneFieldState { |
38 | private: | 38 | private: |
39 | unsigned char *field; | 39 | unsigned char *field; |
40 | 40 | ||
41 | int colors; | 41 | int colors; |
42 | unsigned int board; | 42 | unsigned int board; |
43 | unsigned int score; | 43 | unsigned int score; |
44 | int gameover; | 44 | int gameover; |
45 | 45 | ||
46 | public: | 46 | public: |
47 | StoneFieldState(const StoneField &stonefield); | 47 | StoneFieldState(const StoneField &stonefield); |
48 | ~StoneFieldState(); | 48 | ~StoneFieldState(); |
49 | void restore(StoneField &stonefield) const; | 49 | void restore(StoneField &stonefield) const; |
50 | }; | 50 | }; |
51 | 51 | ||
52 | 52 | ||
53 | class StoneField { | 53 | class StoneField { |
54 | friend class StoneFieldState; | 54 | friend class StoneFieldState; |
55 | friend class StoneWidget; | 55 | friend class StoneWidget; |
56 | private: | 56 | private: |
57 | 57 | ||
58 | int sizex; | 58 | int sizex; |
59 | int sizey; | 59 | int sizey; |
60 | int maxstone; | 60 | int maxstone; |
61 | 61 | ||
62 | struct Stone *field; | 62 | struct Stone *field; |
63 | 63 | ||
64 | int colors; | 64 | int colors; |
65 | unsigned int board; | 65 | unsigned int board; |
66 | unsigned int score; | 66 | unsigned int score; |
67 | mutable int gameover; | 67 | mutable int gameover; |
68 | bool m_gotBonus; | 68 | bool m_gotBonus; |
69 | int marked; | 69 | int marked; |
70 | 70 | ||
71 | KRandomSequence random; | 71 | KRandomSequence random; |
72 | QList<StoneFieldState> *undolist; | 72 | QList<StoneFieldState> *undolist; |
73 | public: | 73 | public: |
74 | StoneField(int width=15,int height=10, | 74 | StoneField(int width=15,int height=10, |
75 | int colors=3,unsigned int board=0, | 75 | int colors=3,unsigned int board=0, |
76 | bool undoenabled=true); | 76 | bool undoenabled=true); |
77 | ~StoneField(); | 77 | ~StoneField(); |
78 | 78 | ||
79 | int width() const; | 79 | int width() const; |
80 | int height() const; | 80 | int height() const; |
81 | 81 | ||
82 | void newGame(unsigned int board,int colors); | 82 | void newGame(unsigned int board,int colors); |
83 | 83 | ||
84 | void reset(); | 84 | void reset(); |
85 | 85 | ||
86 | 86 | ||
87 | int mark(int x,int y,bool force=false); | 87 | int mark(int x,int y,bool force=false); |
88 | void unmark(); | 88 | void unmark(); |
89 | 89 | ||
90 | int remove(int x,int y,bool force=false); | 90 | int remove(int x,int y,bool force=false); |
91 | 91 | ||
92 | int undo(int count=1); | 92 | int undo(int count=1); |
93 | 93 | ||
94 | bool isGameover() const; | 94 | bool isGameover() const; |
95 | bool gotBonus() const; | 95 | bool gotBonus() const; |
96 | void clearBonus(); | ||
96 | bool undoPossible() const; | 97 | bool undoPossible() const; |
97 | int getBoard() const; | 98 | int getBoard() const; |
98 | int getScore() const; | 99 | int getScore() const; |
99 | int getColors() const; | 100 | int getColors() const; |
100 | int getMarked() const; | 101 | int getMarked() const; |
101 | 102 | ||
102 | protected: | 103 | protected: |
103 | int getFieldSize() const; | 104 | int getFieldSize() const; |
104 | struct Stone *getField() const; | 105 | struct Stone *getField() const; |
105 | 106 | ||
106 | int map(int x,int y); | 107 | int map(int x,int y); |
107 | void mark(int index,unsigned char color); | 108 | void mark(int index,unsigned char color); |
108 | }; | 109 | }; |
109 | 110 | ||
110 | #endif | 111 | #endif |
111 | 112 | ||
112 | 113 | ||
113 | 114 | ||
diff --git a/noncore/games/zsame/StoneWidget.cpp b/noncore/games/zsame/StoneWidget.cpp index 646fc9c..5dd0252 100644 --- a/noncore/games/zsame/StoneWidget.cpp +++ b/noncore/games/zsame/StoneWidget.cpp | |||
@@ -1,345 +1,349 @@ | |||
1 | /* | 1 | /* |
2 | * ksame 0.4 - simple Game | 2 | * ksame 0.4 - simple Game |
3 | * Copyright (C) 1997,1998 Marcus Kreutzberger | 3 | * Copyright (C) 1997,1998 Marcus Kreutzberger |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
18 | * | 18 | * |
19 | */ | 19 | */ |
20 | 20 | ||
21 | #include <stdio.h> | 21 | #include <stdio.h> |
22 | #include <stdlib.h> | 22 | #include <stdlib.h> |
23 | 23 | ||
24 | 24 | ||
25 | 25 | ||
26 | #include <qpe/resource.h> | 26 | #include <qpe/resource.h> |
27 | 27 | ||
28 | #include <time.h> | 28 | #include <time.h> |
29 | #include <assert.h> | 29 | #include <assert.h> |
30 | 30 | ||
31 | #include "StoneWidget.h" | 31 | #include "StoneWidget.h" |
32 | 32 | ||
33 | 33 | ||
34 | 34 | ||
35 | struct StoneSlice { | 35 | struct StoneSlice { |
36 | QPixmap stone; | 36 | QPixmap stone; |
37 | }; | 37 | }; |
38 | 38 | ||
39 | 39 | ||
40 | StoneWidget::StoneWidget( QWidget *parent, int x, int y ) | 40 | StoneWidget::StoneWidget( QWidget *parent, int x, int y ) |
41 | : QWidget(parent,"StoneWidget"), stonefield(x,y) | 41 | : QWidget(parent,"StoneWidget"), stonefield(x,y) |
42 | { | 42 | { |
43 | // setBackgroundPixmap(QPixmap(locate("wallpaper", "Time-For-Lunch-2.jpg"))); | 43 | // setBackgroundPixmap(QPixmap(locate("wallpaper", "Time-For-Lunch-2.jpg"))); |
44 | // QPixmap stonemap(locate("appdata", "stones.png")); | 44 | // QPixmap stonemap(locate("appdata", "stones.png")); |
45 | 45 | ||
46 | QPixmap stonemap = Resource::loadPixmap("zsame/stones" ); | 46 | QPixmap stonemap = Resource::loadPixmap("zsame/stones" ); |
47 | assert(!stonemap.isNull()); | 47 | assert(!stonemap.isNull()); |
48 | 48 | ||
49 | slice=0; | 49 | slice=0; |
50 | maxslices=30; | 50 | maxslices=30; |
51 | maxcolors=4; | 51 | maxcolors=4; |
52 | 52 | ||
53 | sizex=x; | 53 | sizex=x; |
54 | sizey=y; | 54 | sizey=y; |
55 | 55 | ||
56 | stone_width=stonemap.width()/(maxslices+1); | 56 | stone_width=stonemap.width()/(maxslices+1); |
57 | stone_height=stonemap.height()/maxcolors; | 57 | stone_height=stonemap.height()/maxcolors; |
58 | 58 | ||
59 | map = new StoneSlice*[maxcolors]; | 59 | map = new StoneSlice*[maxcolors]; |
60 | QBitmap mask; | 60 | QBitmap mask; |
61 | for (int c = 0; c < maxcolors; c++) { | 61 | for (int c = 0; c < maxcolors; c++) { |
62 | map[c] = new StoneSlice[maxslices]; | 62 | map[c] = new StoneSlice[maxslices]; |
63 | 63 | ||
64 | for (int s = 0; s < maxslices; s++) { | 64 | for (int s = 0; s < maxslices; s++) { |
65 | map[c][s].stone.resize(stone_width, stone_height); | 65 | map[c][s].stone.resize(stone_width, stone_height); |
66 | assert(!map[c][s].stone.isNull()); | 66 | assert(!map[c][s].stone.isNull()); |
67 | bitBlt(&map[c][s].stone, 0, 0, | 67 | bitBlt(&map[c][s].stone, 0, 0, |
68 | &stonemap, stone_width * s, | 68 | &stonemap, stone_width * s, |
69 | c*stone_height, | 69 | c*stone_height, |
70 | stone_width,stone_height,CopyROP,false); | 70 | stone_width,stone_height,CopyROP,false); |
71 | QImage im = map[c][s].stone.convertToImage(); | 71 | QImage im = map[c][s].stone.convertToImage(); |
72 | mask = im.createHeuristicMask(); | 72 | mask = im.createHeuristicMask(); |
73 | map[c][s].stone.setMask(mask); | 73 | map[c][s].stone.setMask(mask); |
74 | } | 74 | } |
75 | } | 75 | } |
76 | 76 | ||
77 | field_height=stone_height*sizey; | 77 | field_height=stone_height*sizey; |
78 | field_width=stone_width*sizex; | 78 | field_width=stone_width*sizex; |
79 | 79 | ||
80 | setMouseTracking(true); | 80 | setMouseTracking(true); |
81 | 81 | ||
82 | // QColor c(115,115,115); | 82 | // QColor c(115,115,115); |
83 | // setBackgroundColor(c); | 83 | // setBackgroundColor(c); |
84 | 84 | ||
85 | // emit s_sizechanged(); | 85 | // emit s_sizechanged(); |
86 | startTimer( 100 ); | 86 | startTimer( 100 ); |
87 | history.setAutoDelete(true); | 87 | history.setAutoDelete(true); |
88 | } | 88 | } |
89 | 89 | ||
90 | StoneWidget::~StoneWidget() { | 90 | StoneWidget::~StoneWidget() { |
91 | for (int c = 0; c < maxcolors; c++) { | 91 | for (int c = 0; c < maxcolors; c++) { |
92 | delete [] map[c]; | 92 | delete [] map[c]; |
93 | } | 93 | } |
94 | delete [] map; | 94 | delete [] map; |
95 | 95 | ||
96 | setMouseTracking(false); | 96 | setMouseTracking(false); |
97 | killTimers(); | 97 | killTimers(); |
98 | } | 98 | } |
99 | 99 | ||
100 | unsigned int | 100 | unsigned int |
101 | StoneWidget::board() { | 101 | StoneWidget::board() { |
102 | return stonefield.getBoard(); | 102 | return stonefield.getBoard(); |
103 | } | 103 | } |
104 | 104 | ||
105 | int | 105 | int |
106 | StoneWidget::score() { | 106 | StoneWidget::score() { |
107 | return stonefield.getScore(); | 107 | return stonefield.getScore(); |
108 | } | 108 | } |
109 | 109 | ||
110 | int | 110 | int |
111 | StoneWidget::marked() { | 111 | StoneWidget::marked() { |
112 | return stonefield.getMarked(); | 112 | return stonefield.getMarked(); |
113 | } | 113 | } |
114 | 114 | ||
115 | QSize | 115 | QSize |
116 | StoneWidget::size() { | 116 | StoneWidget::size() { |
117 | return QSize(sizex,sizey); | 117 | return QSize(sizex,sizey); |
118 | } | 118 | } |
119 | 119 | ||
120 | int | 120 | int |
121 | StoneWidget::colors() { | 121 | StoneWidget::colors() { |
122 | return stonefield.getColors(); | 122 | return stonefield.getColors(); |
123 | } | 123 | } |
124 | 124 | ||
125 | QSize | 125 | QSize |
126 | StoneWidget::sizeHint () const { | 126 | StoneWidget::sizeHint () const { |
127 | return QSize(field_width,field_height); | 127 | return QSize(field_width,field_height); |
128 | } | 128 | } |
129 | 129 | ||
130 | void | 130 | void |
131 | StoneWidget::newGame(unsigned int board,int colors) { | 131 | StoneWidget::newGame(unsigned int board,int colors) { |
132 | stonefield.newGame(board,colors); | 132 | stonefield.newGame(board,colors); |
133 | history.clear(); | 133 | history.clear(); |
134 | modified= false; | 134 | modified= false; |
135 | emit s_newgame(); | 135 | emit s_newgame(); |
136 | emit s_colors(stonefield.getColors()); | 136 | emit s_colors(stonefield.getColors()); |
137 | emit s_board(stonefield.getBoard()); | 137 | emit s_board(stonefield.getBoard()); |
138 | } | 138 | } |
139 | 139 | ||
140 | void | 140 | void |
141 | StoneWidget::reset() { | 141 | StoneWidget::reset() { |
142 | stonefield.reset(); | 142 | stonefield.reset(); |
143 | history.clear(); | 143 | history.clear(); |
144 | emit s_newgame(); | 144 | emit s_newgame(); |
145 | } | 145 | } |
146 | 146 | ||
147 | void | 147 | void |
148 | StoneWidget::unmark() { | 148 | StoneWidget::unmark() { |
149 | stonefield.unmark(); | 149 | stonefield.unmark(); |
150 | emit s_marked(0); | 150 | emit s_marked(0); |
151 | } | 151 | } |
152 | 152 | ||
153 | bool StoneWidget::undoPossible() const { | 153 | bool StoneWidget::undoPossible() const { |
154 | if (stonefield.isGameover()) return false; | 154 | if (stonefield.isGameover()) return false; |
155 | return stonefield.undoPossible(); | 155 | return stonefield.undoPossible(); |
156 | } | 156 | } |
157 | 157 | ||
158 | int | 158 | int |
159 | StoneWidget::undo(int count) { | 159 | StoneWidget::undo(int count) { |
160 | if (stonefield.isGameover()) return 0; | 160 | if (stonefield.isGameover()) return 0; |
161 | 161 | ||
162 | int ret_val=stonefield.undo(count); | 162 | int ret_val=stonefield.undo(count); |
163 | 163 | ||
164 | QPoint p=mapFromGlobal(cursor().pos()); | 164 | QPoint p=mapFromGlobal(cursor().pos()); |
165 | int x=p.x(); | 165 | int x=p.x(); |
166 | int y=p.y(); | 166 | int y=p.y(); |
167 | if (x<0||y<0||x>=field_width||y>=field_height) { | 167 | if (x<0||y<0||x>=field_width||y>=field_height) { |
168 | emit s_score(stonefield.getMarked()); | 168 | emit s_score(stonefield.getMarked()); |
169 | return ret_val; | 169 | return ret_val; |
170 | } | 170 | } |
171 | 171 | ||
172 | int marked=stonefield.mark(x/stone_width,y/stone_height); | 172 | int marked=stonefield.mark(x/stone_width,y/stone_height); |
173 | emit s_marked(marked); | 173 | emit s_marked(marked); |
174 | slice=0; | 174 | slice=0; |
175 | emit s_score(stonefield.getScore()); | 175 | emit s_score(stonefield.getScore()); |
176 | modified= (stonefield.getScore()>0); | 176 | modified= (stonefield.getScore()>0); |
177 | return ret_val; | 177 | return ret_val; |
178 | } | 178 | } |
179 | 179 | ||
180 | bool StoneWidget::isGameover() { | 180 | bool StoneWidget::isGameover() { |
181 | return stonefield.isGameover(); | 181 | return stonefield.isGameover(); |
182 | } | 182 | } |
183 | 183 | ||
184 | bool StoneWidget::hasBonus() { | 184 | bool StoneWidget::hasBonus() { |
185 | return stonefield.gotBonus(); // don't ask me why the names differ... ;-| [hlm] | 185 | return stonefield.gotBonus(); // don't ask me why the names differ... ;-| [hlm] |
186 | } | 186 | } |
187 | 187 | ||
188 | void StoneWidget::clearBonus() { | ||
189 | stonefield.clearBonus(); | ||
190 | } | ||
191 | |||
188 | bool StoneWidget::isOriginalBoard() { | 192 | bool StoneWidget::isOriginalBoard() { |
189 | return !modified; | 193 | return !modified; |
190 | } | 194 | } |
191 | 195 | ||
192 | void StoneWidget::readProperties(Config *) { | 196 | void StoneWidget::readProperties(Config *) { |
193 | /* Q_ASSERT(conf); | 197 | /* Q_ASSERT(conf); |
194 | 198 | ||
195 | history.clear(); | 199 | history.clear(); |
196 | 200 | ||
197 | if (!conf->hasKey("Board")|| | 201 | if (!conf->hasKey("Board")|| |
198 | !conf->hasKey("Colors")|| | 202 | !conf->hasKey("Colors")|| |
199 | !conf->hasKey("Stones")) { | 203 | !conf->hasKey("Stones")) { |
200 | return; | 204 | return; |
201 | } | 205 | } |
202 | newGame(conf->readNumEntry("Board"),conf->readNumEntry("Colors")); | 206 | newGame(conf->readNumEntry("Board"),conf->readNumEntry("Colors")); |
203 | 207 | ||
204 | QStrList list; | 208 | QStrList list; |
205 | conf->readListEntry("Stones",list); | 209 | conf->readListEntry("Stones",list); |
206 | 210 | ||
207 | for (const char *item=list.first();item;item=list.next()) { | 211 | for (const char *item=list.first();item;item=list.next()) { |
208 | int x=-1,y=-1; | 212 | int x=-1,y=-1; |
209 | if (sscanf(item,"%02X%02X",&x,&y)!=2) break; | 213 | if (sscanf(item,"%02X%02X",&x,&y)!=2) break; |
210 | history.append(new QPoint(x,y)); | 214 | history.append(new QPoint(x,y)); |
211 | stonefield.remove(x,y); | 215 | stonefield.remove(x,y); |
212 | } | 216 | } |
213 | */ | 217 | */ |
214 | } | 218 | } |
215 | 219 | ||
216 | 220 | ||
217 | void | 221 | void |
218 | StoneWidget::saveProperties(Config *) { | 222 | StoneWidget::saveProperties(Config *) { |
219 | /* | 223 | /* |
220 | Q_ASSERT(conf); | 224 | Q_ASSERT(conf); |
221 | 225 | ||
222 | QStrList list(true); | 226 | QStrList list(true); |
223 | QString tmp; | 227 | QString tmp; |
224 | 228 | ||
225 | for (QPoint *item=history.first();item;item=history.next()) { | 229 | for (QPoint *item=history.first();item;item=history.next()) { |
226 | tmp.sprintf("%02X%02X",item->x(),item->y()); | 230 | tmp.sprintf("%02X%02X",item->x(),item->y()); |
227 | list.append(tmp.ascii()); | 231 | list.append(tmp.ascii()); |
228 | } | 232 | } |
229 | 233 | ||
230 | conf->writeEntry("Stones",list); | 234 | conf->writeEntry("Stones",list); |
231 | conf->writeEntry("Board",stonefield.getBoard()); | 235 | conf->writeEntry("Board",stonefield.getBoard()); |
232 | conf->writeEntry("Colors",stonefield.getColors()); | 236 | conf->writeEntry("Colors",stonefield.getColors()); |
233 | */ | 237 | */ |
234 | } | 238 | } |
235 | 239 | ||
236 | void | 240 | void |
237 | StoneWidget::timerEvent( QTimerEvent * ) { | 241 | StoneWidget::timerEvent( QTimerEvent * ) { |
238 | QPoint p=mapFromGlobal(cursor().pos()); | 242 | QPoint p=mapFromGlobal(cursor().pos()); |
239 | int x=p.x(); | 243 | int x=p.x(); |
240 | int y=p.y(); | 244 | int y=p.y(); |
241 | if (x<0||y<0||x>=field_width||y>=field_height) | 245 | if (x<0||y<0||x>=field_width||y>=field_height) |
242 | stonefield.unmark(); | 246 | stonefield.unmark(); |
243 | slice=(slice+1)%maxslices; | 247 | slice=(slice+1)%maxslices; |
244 | paintEvent(0); | 248 | paintEvent(0); |
245 | } | 249 | } |
246 | 250 | ||
247 | void | 251 | void |
248 | StoneWidget::paintEvent( QPaintEvent *e ) { | 252 | StoneWidget::paintEvent( QPaintEvent *e ) { |
249 | 253 | ||
250 | Stone *stone=stonefield.getField(); | 254 | Stone *stone=stonefield.getField(); |
251 | 255 | ||
252 | for (int y=0;y<sizey;y++) { | 256 | for (int y=0;y<sizey;y++) { |
253 | int cy = y * stone_height; | 257 | int cy = y * stone_height; |
254 | 258 | ||
255 | for (int x=0;x<sizex;x++) { | 259 | for (int x=0;x<sizex;x++) { |
256 | int cx = stone_width * x; | 260 | int cx = stone_width * x; |
257 | 261 | ||
258 | bool redraw=stone->marked||stone->changed; | 262 | bool redraw=stone->marked||stone->changed; |
259 | 263 | ||
260 | if (!redraw&&e) { | 264 | if (!redraw&&e) { |
261 | QRect r(cx,cy,stone_width,stone_height); | 265 | QRect r(cx,cy,stone_width,stone_height); |
262 | redraw=r.intersects(e->rect()); | 266 | redraw=r.intersects(e->rect()); |
263 | } | 267 | } |
264 | if (redraw) { | 268 | if (redraw) { |
265 | stone->changed=false; | 269 | stone->changed=false; |
266 | if (stone->color) { | 270 | if (stone->color) { |
267 | 271 | ||
268 | int tslice = stone->marked?slice:0; | 272 | int tslice = stone->marked?slice:0; |
269 | bitBlt(this,cx,cy, | 273 | bitBlt(this,cx,cy, |
270 | &map[stone->color-1][tslice].stone, | 274 | &map[stone->color-1][tslice].stone, |
271 | 0, 0, | 275 | 0, 0, |
272 | stone_width,stone_height,CopyROP,FALSE); | 276 | stone_width,stone_height,CopyROP,FALSE); |
273 | 277 | ||
274 | } else { | 278 | } else { |
275 | erase(cx, cy, stone_width, stone_height); | 279 | erase(cx, cy, stone_width, stone_height); |
276 | } | 280 | } |
277 | } | 281 | } |
278 | stone++; // naechster Stein. | 282 | stone++; // naechster Stein. |
279 | } | 283 | } |
280 | } | 284 | } |
281 | } | 285 | } |
282 | 286 | ||
283 | void | 287 | void |
284 | StoneWidget::mousePressEvent ( QMouseEvent *e) { | 288 | StoneWidget::mousePressEvent ( QMouseEvent *e) { |
285 | 289 | ||
286 | if (stonefield.isGameover()) return; | 290 | if (stonefield.isGameover()) return; |
287 | 291 | ||
288 | int x=e->pos().x(); | 292 | int x=e->pos().x(); |
289 | int y=e->pos().y(); | 293 | int y=e->pos().y(); |
290 | if (x<0||y<0||x>=field_width||y>=field_height) return; | 294 | if (x<0||y<0||x>=field_width||y>=field_height) return; |
291 | 295 | ||
292 | int sx=x/stone_width; | 296 | int sx=x/stone_width; |
293 | int sy=y/stone_height; | 297 | int sy=y/stone_height; |
294 | 298 | ||
295 | int mar =stonefield.mark(sx, sy); | 299 | int mar =stonefield.mark(sx, sy); |
296 | 300 | ||
297 | if ( mar != -1 ) { | 301 | if ( mar != -1 ) { |
298 | myMoveEvent(e); | 302 | myMoveEvent(e); |
299 | return; | 303 | return; |
300 | } | 304 | } |
301 | 305 | ||
302 | 306 | ||
303 | if (stonefield.remove(sx, sy)) { | 307 | if (stonefield.remove(sx, sy)) { |
304 | history.append(new QPoint(sx, sy)); | 308 | history.append(new QPoint(sx, sy)); |
305 | 309 | ||
306 | emit s_remove(sx, sy); | 310 | emit s_remove(sx, sy); |
307 | 311 | ||
308 | stonefield.mark(sx,sy); | 312 | stonefield.mark(sx,sy); |
309 | emit s_marked(stonefield.getMarked()); | 313 | emit s_marked(stonefield.getMarked()); |
310 | modified= true; | 314 | modified= true; |
311 | 315 | ||
312 | emit s_score(stonefield.getScore()); | 316 | emit s_score(stonefield.getScore()); |
313 | if (stonefield.isGameover()) emit s_gameover(); | 317 | if (stonefield.isGameover()) emit s_gameover(); |
314 | } | 318 | } |
315 | } | 319 | } |
316 | 320 | ||
317 | void | 321 | void |
318 | StoneWidget::myMoveEvent ( QMouseEvent *e) | 322 | StoneWidget::myMoveEvent ( QMouseEvent *e) |
319 | { | 323 | { |
320 | return; | 324 | return; |
321 | 325 | ||
322 | if (stonefield.isGameover()) { | 326 | if (stonefield.isGameover()) { |
323 | stonefield.unmark(); | 327 | stonefield.unmark(); |
324 | emit s_marked(0); | 328 | emit s_marked(0); |
325 | return; | 329 | return; |
326 | } | 330 | } |
327 | 331 | ||
328 | int x=e->pos().x(); | 332 | int x=e->pos().x(); |
329 | int y=e->pos().y(); | 333 | int y=e->pos().y(); |
330 | if (x<0||y<0||x>=field_width||y>=field_height) return; | 334 | if (x<0||y<0||x>=field_width||y>=field_height) return; |
331 | 335 | ||
332 | int marked=stonefield.mark(x/stone_width,y/stone_height); | 336 | int marked=stonefield.mark(x/stone_width,y/stone_height); |
333 | if (marked>=0) { | 337 | if (marked>=0) { |
334 | emit s_marked(marked); | 338 | emit s_marked(marked); |
335 | slice=0; | 339 | slice=0; |
336 | } | 340 | } |
337 | } | 341 | } |
338 | 342 | ||
339 | 343 | ||
340 | 344 | ||
341 | 345 | ||
342 | 346 | ||
343 | 347 | ||
344 | 348 | ||
345 | 349 | ||
diff --git a/noncore/games/zsame/StoneWidget.h b/noncore/games/zsame/StoneWidget.h index 9cd7e10..89a8afc 100644 --- a/noncore/games/zsame/StoneWidget.h +++ b/noncore/games/zsame/StoneWidget.h | |||
@@ -1,115 +1,116 @@ | |||
1 | /* Yo Emacs, this is -*- C++ -*- */ | 1 | /* Yo Emacs, this is -*- C++ -*- */ |
2 | /* | 2 | /* |
3 | * ksame 0.4 - simple Game | 3 | * ksame 0.4 - simple Game |
4 | * Copyright (C) 1997,1998 Marcus Kreutzberger | 4 | * Copyright (C) 1997,1998 Marcus Kreutzberger |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
8 | * the Free Software Foundation; either version 2 of the License, or | 8 | * the Free Software Foundation; either version 2 of the License, or |
9 | * (at your option) any later version. | 9 | * (at your option) any later version. |
10 | * | 10 | * |
11 | * This program is distributed in the hope that it will be useful, | 11 | * This program is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. | 14 | * GNU General Public License for more details. |
15 | * | 15 | * |
16 | * You should have received a copy of the GNU General Public License | 16 | * You should have received a copy of the GNU General Public License |
17 | * along with this program; if not, write to the Free Software | 17 | * along with this program; if not, write to the Free Software |
18 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 18 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
19 | * | 19 | * |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #ifndef _STONEWIDGET | 22 | #ifndef _STONEWIDGET |
23 | #define _STONEWIDGET | 23 | #define _STONEWIDGET |
24 | 24 | ||
25 | #include <qpixmap.h> | 25 | #include <qpixmap.h> |
26 | #include <qwidget.h> | 26 | #include <qwidget.h> |
27 | 27 | ||
28 | #include <qpe/config.h> | 28 | #include <qpe/config.h> |
29 | 29 | ||
30 | #include "StoneField.h" | 30 | #include "StoneField.h" |
31 | 31 | ||
32 | struct StoneSlice; | 32 | struct StoneSlice; |
33 | 33 | ||
34 | class StoneWidget : public QWidget { | 34 | class StoneWidget : public QWidget { |
35 | Q_OBJECT | 35 | Q_OBJECT |
36 | 36 | ||
37 | int modified; | 37 | int modified; |
38 | // int marked; // # of marked stones | 38 | // int marked; // # of marked stones |
39 | 39 | ||
40 | int stones_x, stones_y; | 40 | int stones_x, stones_y; |
41 | int sizex, sizey; | 41 | int sizex, sizey; |
42 | int field_width, field_height; | 42 | int field_width, field_height; |
43 | 43 | ||
44 | QList<QPoint> history; | 44 | QList<QPoint> history; |
45 | StoneField stonefield; | 45 | StoneField stonefield; |
46 | 46 | ||
47 | // picture number of stonemovie | 47 | // picture number of stonemovie |
48 | int slice; | 48 | int slice; |
49 | 49 | ||
50 | StoneSlice **map; | 50 | StoneSlice **map; |
51 | 51 | ||
52 | public: | 52 | public: |
53 | StoneWidget( QWidget *parent=0, int x=10,int y=10); | 53 | StoneWidget( QWidget *parent=0, int x=10,int y=10); |
54 | ~StoneWidget(); | 54 | ~StoneWidget(); |
55 | 55 | ||
56 | unsigned int board(); | 56 | unsigned int board(); |
57 | int score(); | 57 | int score(); |
58 | int marked(); | 58 | int marked(); |
59 | QSize size(); | 59 | QSize size(); |
60 | int colors(); | 60 | int colors(); |
61 | virtual QSize sizeHint() const; | 61 | virtual QSize sizeHint() const; |
62 | 62 | ||
63 | bool undoPossible() const; | 63 | bool undoPossible() const; |
64 | 64 | ||
65 | void newGame(unsigned int board, int colors); | 65 | void newGame(unsigned int board, int colors); |
66 | void reset(); | 66 | void reset(); |
67 | void unmark(); | 67 | void unmark(); |
68 | int undo(int count=1); | 68 | int undo(int count=1); |
69 | 69 | ||
70 | // test for game end | 70 | // test for game end |
71 | bool isGameover(); | 71 | bool isGameover(); |
72 | // if isGameover(): finished with bonus? | 72 | // if isGameover(): finished with bonus? |
73 | bool hasBonus(); | 73 | bool hasBonus(); |
74 | void clearBonus(); | ||
74 | // test for unchanged start position | 75 | // test for unchanged start position |
75 | bool isOriginalBoard(); | 76 | bool isOriginalBoard(); |
76 | 77 | ||
77 | virtual void readProperties(Config *conf); | 78 | virtual void readProperties(Config *conf); |
78 | virtual void saveProperties(Config *conf); | 79 | virtual void saveProperties(Config *conf); |
79 | 80 | ||
80 | protected: | 81 | protected: |
81 | 82 | ||
82 | void timerEvent( QTimerEvent *e ); | 83 | void timerEvent( QTimerEvent *e ); |
83 | void paintEvent( QPaintEvent *e ); | 84 | void paintEvent( QPaintEvent *e ); |
84 | void mousePressEvent ( QMouseEvent *e); | 85 | void mousePressEvent ( QMouseEvent *e); |
85 | void myMoveEvent ( QMouseEvent *e); | 86 | void myMoveEvent ( QMouseEvent *e); |
86 | 87 | ||
87 | // properties of the stone picture | 88 | // properties of the stone picture |
88 | int stone_width,stone_height; // size of one stone | 89 | int stone_width,stone_height; // size of one stone |
89 | int maxcolors; // number of different stones (Y direction) | 90 | int maxcolors; // number of different stones (Y direction) |
90 | int maxslices; // number of pictures per movie (X direction) | 91 | int maxslices; // number of pictures per movie (X direction) |
91 | 92 | ||
92 | signals: | 93 | signals: |
93 | // A new game begins | 94 | // A new game begins |
94 | void s_newgame(); | 95 | void s_newgame(); |
95 | 96 | ||
96 | void s_colors(int colors); | 97 | void s_colors(int colors); |
97 | void s_board(int board); | 98 | void s_board(int board); |
98 | void s_score(int score); | 99 | void s_score(int score); |
99 | void s_marked(int m); | 100 | void s_marked(int m); |
100 | 101 | ||
101 | void s_gameover(); | 102 | void s_gameover(); |
102 | 103 | ||
103 | // The stone (x,y) was clicked(removed), | 104 | // The stone (x,y) was clicked(removed), |
104 | // all neighbor stones disappear without further signals | 105 | // all neighbor stones disappear without further signals |
105 | void s_remove(int x,int y); | 106 | void s_remove(int x,int y); |
106 | 107 | ||
107 | void s_sizechanged(); | 108 | void s_sizechanged(); |
108 | }; | 109 | }; |
109 | 110 | ||
110 | #endif | 111 | #endif |
111 | 112 | ||
112 | 113 | ||
113 | 114 | ||
114 | 115 | ||
115 | 116 | ||
diff --git a/noncore/games/zsame/ZSameWidget.cpp b/noncore/games/zsame/ZSameWidget.cpp index 04ad825..dee4a1c 100644 --- a/noncore/games/zsame/ZSameWidget.cpp +++ b/noncore/games/zsame/ZSameWidget.cpp | |||
@@ -29,216 +29,217 @@ | |||
29 | #include <qmenubar.h> | 29 | #include <qmenubar.h> |
30 | #include <qapplication.h> | 30 | #include <qapplication.h> |
31 | #include <qaction.h> | 31 | #include <qaction.h> |
32 | #include <qmessagebox.h> | 32 | #include <qmessagebox.h> |
33 | 33 | ||
34 | #include <kapplication.h> | 34 | #include <kapplication.h> |
35 | 35 | ||
36 | #include "ZSameWidget.h" | 36 | #include "ZSameWidget.h" |
37 | 37 | ||
38 | static int default_colors=3; | 38 | static int default_colors=3; |
39 | 39 | ||
40 | #define i18n tr | 40 | #define i18n tr |
41 | 41 | ||
42 | 42 | ||
43 | using namespace Opie::Core; | 43 | using namespace Opie::Core; |
44 | OPIE_EXPORT_APP( OApplicationFactory<ZSameWidget> ) | 44 | OPIE_EXPORT_APP( OApplicationFactory<ZSameWidget> ) |
45 | 45 | ||
46 | 46 | ||
47 | 47 | ||
48 | ZSameWidget::ZSameWidget( QWidget* parent, const char* name, WFlags fl ) | 48 | ZSameWidget::ZSameWidget( QWidget* parent, const char* name, WFlags fl ) |
49 | : QMainWindow( parent, name, fl ) | 49 | : QMainWindow( parent, name, fl ) |
50 | { | 50 | { |
51 | setCaption(tr("ZSame")); | 51 | setCaption(tr("ZSame")); |
52 | 52 | ||
53 | setToolBarsMovable( false ); | 53 | setToolBarsMovable( false ); |
54 | QToolBar* con = new QToolBar( this ); | 54 | QToolBar* con = new QToolBar( this ); |
55 | con->setHorizontalStretchable( true ); | 55 | con->setHorizontalStretchable( true ); |
56 | QMenuBar* mb = new QMenuBar( con ); | 56 | QMenuBar* mb = new QMenuBar( con ); |
57 | QToolBar* tb = new QToolBar( this ); | 57 | QToolBar* tb = new QToolBar( this ); |
58 | 58 | ||
59 | QPopupMenu* fileMenu = new QPopupMenu( this ); | 59 | QPopupMenu* fileMenu = new QPopupMenu( this ); |
60 | 60 | ||
61 | QAction* a = new QAction(tr("New Game"), Resource::loadIconSet("new") , | 61 | QAction* a = new QAction(tr("New Game"), Resource::loadIconSet("new") , |
62 | QString::null, 0, this, "new_icon"); | 62 | QString::null, 0, this, "new_icon"); |
63 | a->addTo( fileMenu ); | 63 | a->addTo( fileMenu ); |
64 | a->addTo( tb ); | 64 | a->addTo( tb ); |
65 | connect(a, SIGNAL(activated()), this, SLOT(m_new())); | 65 | connect(a, SIGNAL(activated()), this, SLOT(m_new())); |
66 | 66 | ||
67 | a = new QAction(tr("Restart This Board"), Resource::loadIconSet("redo"), | 67 | a = new QAction(tr("Restart This Board"), Resource::loadIconSet("redo"), |
68 | QString::null, 0, this, "restart_board" ); | 68 | QString::null, 0, this, "restart_board" ); |
69 | a->addTo( fileMenu ); | 69 | a->addTo( fileMenu ); |
70 | connect( a, SIGNAL(activated()), this, SLOT(m_restart())); | 70 | connect( a, SIGNAL(activated()), this, SLOT(m_restart())); |
71 | restart = a; | 71 | restart = a; |
72 | 72 | ||
73 | a = new QAction( tr("Undo"), Resource::loadIconSet("undo"), | 73 | a = new QAction( tr("Undo"), Resource::loadIconSet("undo"), |
74 | QString::null, 0, this, "undo_action" ); | 74 | QString::null, 0, this, "undo_action" ); |
75 | a->addTo( fileMenu ); | 75 | a->addTo( fileMenu ); |
76 | a->addTo( tb ); | 76 | a->addTo( tb ); |
77 | connect( a, SIGNAL(activated()), this, SLOT(m_undo())); | 77 | connect( a, SIGNAL(activated()), this, SLOT(m_undo())); |
78 | 78 | ||
79 | a = new QAction(tr("Quit"), Resource::loadIconSet("quit_icon"), | 79 | a = new QAction(tr("Quit"), Resource::loadIconSet("quit_icon"), |
80 | QString::null, 0, this, "quit_action"); | 80 | QString::null, 0, this, "quit_action"); |
81 | a->addTo( fileMenu ); | 81 | a->addTo( fileMenu ); |
82 | a->addTo( tb ); | 82 | a->addTo( tb ); |
83 | connect(a, SIGNAL(activated()), this, SLOT(m_quit())); | 83 | connect(a, SIGNAL(activated()), this, SLOT(m_quit())); |
84 | 84 | ||
85 | mb->insertItem(tr("Game" ), fileMenu ); | 85 | mb->insertItem(tr("Game" ), fileMenu ); |
86 | 86 | ||
87 | int foo[2]; | 87 | int foo[2]; |
88 | desktop_widget(foo); | 88 | desktop_widget(foo); |
89 | stone = new StoneWidget(this,foo[0],foo[1]); | 89 | stone = new StoneWidget(this,foo[0],foo[1]); |
90 | 90 | ||
91 | connect( stone, SIGNAL(s_gameover()), this, SLOT(gameover())); | 91 | connect( stone, SIGNAL(s_gameover()), this, SLOT(gameover())); |
92 | 92 | ||
93 | connect( stone, SIGNAL(s_colors(int)), this, SLOT(setColors(int))); | 93 | connect( stone, SIGNAL(s_colors(int)), this, SLOT(setColors(int))); |
94 | connect( stone, SIGNAL(s_board(int)), this, SLOT(setBoard(int))); | 94 | connect( stone, SIGNAL(s_board(int)), this, SLOT(setBoard(int))); |
95 | connect( stone, SIGNAL(s_marked(int)), this, SLOT(setMarked(int))); | 95 | connect( stone, SIGNAL(s_marked(int)), this, SLOT(setMarked(int))); |
96 | connect( stone, SIGNAL(s_score(int)), this, SLOT(setScore(int))); | 96 | connect( stone, SIGNAL(s_score(int)), this, SLOT(setScore(int))); |
97 | connect( stone, SIGNAL(s_remove(int,int)), this, SLOT(stonesRemoved(int,int))); | 97 | connect( stone, SIGNAL(s_remove(int,int)), this, SLOT(stonesRemoved(int,int))); |
98 | 98 | ||
99 | connect(stone, SIGNAL(s_sizechanged()), this, SLOT(sizeChanged())); | 99 | connect(stone, SIGNAL(s_sizechanged()), this, SLOT(sizeChanged())); |
100 | 100 | ||
101 | sizeChanged(); | 101 | sizeChanged(); |
102 | setCentralWidget(stone); | 102 | setCentralWidget(stone); |
103 | 103 | ||
104 | 104 | ||
105 | setScore(0); | 105 | setScore(0); |
106 | } | 106 | } |
107 | 107 | ||
108 | ZSameWidget::~ZSameWidget() { | 108 | ZSameWidget::~ZSameWidget() { |
109 | 109 | ||
110 | } | 110 | } |
111 | 111 | ||
112 | void ZSameWidget::readProperties(Config *) { | 112 | void ZSameWidget::readProperties(Config *) { |
113 | /* | 113 | /* |
114 | Q_ASSERT(conf); | 114 | Q_ASSERT(conf); |
115 | stone->readProperties(conf); | 115 | stone->readProperties(conf); |
116 | */ | 116 | */ |
117 | } | 117 | } |
118 | 118 | ||
119 | void ZSameWidget::saveProperties(Config *) { | 119 | void ZSameWidget::saveProperties(Config *) { |
120 | /* | 120 | /* |
121 | Q_ASSERT(conf); | 121 | Q_ASSERT(conf); |
122 | stone->saveProperties(conf); | 122 | stone->saveProperties(conf); |
123 | conf->sync(); | 123 | conf->sync(); |
124 | */ | 124 | */ |
125 | } | 125 | } |
126 | 126 | ||
127 | void ZSameWidget::sizeChanged() { | 127 | void ZSameWidget::sizeChanged() { |
128 | //stone->setFixedSize(stone->sizeHint()); | 128 | //stone->setFixedSize(stone->sizeHint()); |
129 | } | 129 | } |
130 | 130 | ||
131 | void ZSameWidget::newGame(unsigned int board,int colors) { | 131 | void ZSameWidget::newGame(unsigned int board,int colors) { |
132 | while (board>=1000000) board-=1000000; | 132 | while (board>=1000000) board-=1000000; |
133 | // kdDebug() << "newgame board " << board << " colors " << colors << endl; | 133 | // kdDebug() << "newgame board " << board << " colors " << colors << endl; |
134 | stone->newGame(board,colors); | 134 | stone->newGame(board,colors); |
135 | setScore(0); | 135 | setScore(0); |
136 | } | 136 | } |
137 | 137 | ||
138 | bool ZSameWidget::confirmAbort() { | 138 | bool ZSameWidget::confirmAbort() { |
139 | return stone->isGameover() || | 139 | return stone->isGameover() || |
140 | stone->isOriginalBoard() || | 140 | stone->isOriginalBoard() || |
141 | (QMessageBox::warning(this, i18n("Resign"), i18n("<qt>Do you want to resign?</qt>"), | 141 | (QMessageBox::warning(this, i18n("Resign"), i18n("<qt>Do you want to resign?</qt>"), |
142 | QMessageBox::Yes, | 142 | QMessageBox::Yes, |
143 | QMessageBox::No|QMessageBox::Default|QMessageBox::Escape, 0) == QMessageBox::Yes ); | 143 | QMessageBox::No|QMessageBox::Default|QMessageBox::Escape, 0) == QMessageBox::Yes ); |
144 | } | 144 | } |
145 | 145 | ||
146 | void ZSameWidget::m_new() { | 146 | void ZSameWidget::m_new() { |
147 | if (confirmAbort()) | 147 | if (confirmAbort()) |
148 | newGame(_random(),default_colors); | 148 | newGame(_random(),default_colors); |
149 | 149 | ||
150 | } | 150 | } |
151 | 151 | ||
152 | void ZSameWidget::m_restart() { | 152 | void ZSameWidget::m_restart() { |
153 | if (confirmAbort()) | 153 | if (confirmAbort()) |
154 | newGame(stone->board(),default_colors); | 154 | newGame(stone->board(),default_colors); |
155 | } | 155 | } |
156 | 156 | ||
157 | void ZSameWidget::m_load() { | 157 | void ZSameWidget::m_load() { |
158 | // kdDebug() << "menu load not supported" << endl; | 158 | // kdDebug() << "menu load not supported" << endl; |
159 | } | 159 | } |
160 | 160 | ||
161 | void ZSameWidget::m_save() { | 161 | void ZSameWidget::m_save() { |
162 | // kdDebug() << "menu save not supported" << endl; | 162 | // kdDebug() << "menu save not supported" << endl; |
163 | } | 163 | } |
164 | 164 | ||
165 | void ZSameWidget::m_undo() { | 165 | void ZSameWidget::m_undo() { |
166 | //Q_ASSERT(stone); | 166 | //Q_ASSERT(stone); |
167 | stone->undo(); | 167 | stone->undo(); |
168 | } | 168 | } |
169 | 169 | ||
170 | 170 | ||
171 | void ZSameWidget::m_showhs() { | 171 | void ZSameWidget::m_showhs() { |
172 | /* Q_ASSERT(stone); | 172 | /* Q_ASSERT(stone); |
173 | stone->unmark(); | 173 | stone->unmark(); |
174 | KScoreDialog d(KScoreDialog::Name | KScoreDialog::Score, this); | 174 | KScoreDialog d(KScoreDialog::Name | KScoreDialog::Score, this); |
175 | d.addField(Board, i18n("Board"), "Board"); | 175 | d.addField(Board, i18n("Board"), "Board"); |
176 | d.exec(); | 176 | d.exec(); |
177 | */ | 177 | */ |
178 | } | 178 | } |
179 | 179 | ||
180 | void ZSameWidget::m_quit() { | 180 | void ZSameWidget::m_quit() { |
181 | // Q_ASSERT(stone); | 181 | // Q_ASSERT(stone); |
182 | stone->unmark(); | 182 | stone->unmark(); |
183 | qApp->quit(); | 183 | qApp->quit(); |
184 | // delete this; | 184 | // delete this; |
185 | } | 185 | } |
186 | 186 | ||
187 | void ZSameWidget::m_tglboard() { | 187 | void ZSameWidget::m_tglboard() { |
188 | //kdDebug() << "toggled" << endl; | 188 | //kdDebug() << "toggled" << endl; |
189 | } | 189 | } |
190 | 190 | ||
191 | 191 | ||
192 | void ZSameWidget::setColors(int ) { | 192 | void ZSameWidget::setColors(int ) { |
193 | //status->changeItem(i18n("%1 Colors").arg(colors),1); | 193 | //status->changeItem(i18n("%1 Colors").arg(colors),1); |
194 | } | 194 | } |
195 | 195 | ||
196 | void ZSameWidget::setBoard(int ) { | 196 | void ZSameWidget::setBoard(int ) { |
197 | //status->changeItem(i18n("Board: %1").arg(board, 6), 2); | 197 | //status->changeItem(i18n("Board: %1").arg(board, 6), 2); |
198 | } | 198 | } |
199 | 199 | ||
200 | void ZSameWidget::setMarked(int ) { | 200 | void ZSameWidget::setMarked(int ) { |
201 | // status->changeItem(i18n("Marked: %1").arg(m, 6),3); | 201 | // status->changeItem(i18n("Marked: %1").arg(m, 6),3); |
202 | } | 202 | } |
203 | 203 | ||
204 | void ZSameWidget::stonesRemoved(int,int) { | 204 | void ZSameWidget::stonesRemoved(int,int) { |
205 | //KNotifyClient::event("stones removed", | 205 | //KNotifyClient::event("stones removed", |
206 | // i18n("%1 stones removed.").arg(stone->marked())); | 206 | // i18n("%1 stones removed.").arg(stone->marked())); |
207 | } | 207 | } |
208 | 208 | ||
209 | void ZSameWidget::setScore(int ) { | 209 | void ZSameWidget::setScore(int ) { |
210 | // status->changeItem(i18n("Score: %1").arg(score, 6),4); | 210 | // status->changeItem(i18n("Score: %1").arg(score, 6),4); |
211 | // undo->setEnabled(stone->undoPossible()); | 211 | // undo->setEnabled(stone->undoPossible()); |
212 | // restart->setEnabled(!stone->isOriginalBoard()); | 212 | // restart->setEnabled(!stone->isOriginalBoard()); |
213 | } | 213 | } |
214 | 214 | ||
215 | void ZSameWidget::gameover() { | 215 | void ZSameWidget::gameover() { |
216 | // kdDebug() << "GameOver" << endl; | 216 | // kdDebug() << "GameOver" << endl; |
217 | if (stone->hasBonus()) { | 217 | if (stone->hasBonus()) { |
218 | QMessageBox::information(this,i18n("Game won"), | 218 | QMessageBox::information(this,i18n("Game won"), |
219 | i18n("<qt>You even removed the last stone, great job! " | 219 | i18n("<qt>You even removed the last stone, great job! " |
220 | "This gave you a score of %1 in total.</qt>").arg(stone->score())); | 220 | "This gave you a score of %1 in total.</qt>").arg(stone->score())); |
221 | stone->clearBonus(); | ||
221 | } else { | 222 | } else { |
222 | QMessageBox::information(this,i18n("Game over"), | 223 | QMessageBox::information(this,i18n("Game over"), |
223 | i18n("<qt>There are no more removeable stones. " | 224 | i18n("<qt>There are no more removeable stones. " |
224 | "You got a score of %1 in total.</qt>").arg(stone->score())); | 225 | "You got a score of %1 in total.</qt>").arg(stone->score())); |
225 | } | 226 | } |
226 | stone->unmark(); | 227 | stone->unmark(); |
227 | } | 228 | } |
228 | 229 | ||
229 | void ZSameWidget::desktop_widget(int *f)const{ | 230 | void ZSameWidget::desktop_widget(int *f)const{ |
230 | 231 | ||
231 | QWidget* wid = QApplication::desktop(); | 232 | QWidget* wid = QApplication::desktop(); |
232 | /* width > height landscape mode */ | 233 | /* width > height landscape mode */ |
233 | if ( wid->width() > wid->height() ) { | 234 | if ( wid->width() > wid->height() ) { |
234 | f[0]=15; | 235 | f[0]=15; |
235 | f[1]=9; | 236 | f[1]=9; |
236 | } | 237 | } |
237 | /* normal */ | 238 | /* normal */ |
238 | else{ | 239 | else{ |
239 | f[0]=12; | 240 | f[0]=12; |
240 | f[1]=13; | 241 | f[1]=13; |
241 | } | 242 | } |
242 | } | 243 | } |
243 | 244 | ||
244 | 245 | ||