-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 @@ -323,64 +323,68 @@ StoneField::isGameover() const { register int i=maxstone-1;; register unsigned char color; if (gameover>=0) return (bool)gameover; // kdDebug() << "-->gameover" << endl; while (i>=0) { // kdDebug() << i << " " << field[i].color << endl; // ignore empty fields while ( i>=0 && field[i].color==0 ) i--; // Wenn Stein gefunden, // dann die Nachbarn auf gleiche Farbe pruefen. while ( i>=0 && (color=field[i].color) ) { // check left if ( (i%sizex)!=0 && field[i-1].color==color) goto check_gameover; // check upward if ( i>=sizex && field[i-sizex].color==color) goto check_gameover; i--; } } check_gameover: gameover=(i<0); // kdDebug() << "<--gameover" << endl; return (bool)gameover; } bool StoneField::gotBonus() const { return m_gotBonus; } +void StoneField::clearBonus() { + m_gotBonus = false; +} + int StoneField::getBoard() const { return board; } int StoneField::getScore() const { return score; } int StoneField::getColors() const { return colors; } int StoneField::getMarked() const { return marked; } int StoneField::getFieldSize() const { return maxstone; } struct Stone * StoneField::getField() const { return field; } 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 @@ -62,52 +62,53 @@ private: struct Stone *field; int colors; unsigned int board; unsigned int score; mutable int gameover; bool m_gotBonus; int marked; KRandomSequence random; QList<StoneFieldState> *undolist; public: StoneField(int width=15,int height=10, int colors=3,unsigned int board=0, bool undoenabled=true); ~StoneField(); int width() const; int height() const; void newGame(unsigned int board,int colors); void reset(); int mark(int x,int y,bool force=false); void unmark(); int remove(int x,int y,bool force=false); int undo(int count=1); - bool isGameover() const; + bool isGameover() const; bool gotBonus() const; + void clearBonus(); bool undoPossible() const; int getBoard() const; int getScore() const; int getColors() const; int getMarked() const; protected: int getFieldSize() const; struct Stone *getField() const; int map(int x,int y); void mark(int index,unsigned char color); }; #endif 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 @@ -156,64 +156,68 @@ bool StoneWidget::undoPossible() const { } int StoneWidget::undo(int count) { if (stonefield.isGameover()) return 0; int ret_val=stonefield.undo(count); QPoint p=mapFromGlobal(cursor().pos()); int x=p.x(); int y=p.y(); if (x<0||y<0||x>=field_width||y>=field_height) { emit s_score(stonefield.getMarked()); return ret_val; } int marked=stonefield.mark(x/stone_width,y/stone_height); emit s_marked(marked); slice=0; emit s_score(stonefield.getScore()); modified= (stonefield.getScore()>0); return ret_val; } bool StoneWidget::isGameover() { return stonefield.isGameover(); } bool StoneWidget::hasBonus() { return stonefield.gotBonus(); // don't ask me why the names differ... ;-| [hlm] } +void StoneWidget::clearBonus() { + stonefield.clearBonus(); +} + bool StoneWidget::isOriginalBoard() { return !modified; } void StoneWidget::readProperties(Config *) { /* Q_ASSERT(conf); history.clear(); if (!conf->hasKey("Board")|| !conf->hasKey("Colors")|| !conf->hasKey("Stones")) { return; } newGame(conf->readNumEntry("Board"),conf->readNumEntry("Colors")); QStrList list; conf->readListEntry("Stones",list); for (const char *item=list.first();item;item=list.next()) { int x=-1,y=-1; if (sscanf(item,"%02X%02X",&x,&y)!=2) break; history.append(new QPoint(x,y)); stonefield.remove(x,y); } */ } void StoneWidget::saveProperties(Config *) { /* 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 @@ -42,64 +42,65 @@ class StoneWidget : public QWidget { int field_width, field_height; QList<QPoint> history; StoneField stonefield; // picture number of stonemovie int slice; StoneSlice **map; public: StoneWidget( QWidget *parent=0, int x=10,int y=10); ~StoneWidget(); unsigned int board(); int score(); int marked(); QSize size(); int colors(); virtual QSize sizeHint() const; bool undoPossible() const; void newGame(unsigned int board, int colors); void reset(); void unmark(); int undo(int count=1); // test for game end bool isGameover(); // if isGameover(): finished with bonus? bool hasBonus(); + void clearBonus(); // test for unchanged start position bool isOriginalBoard(); virtual void readProperties(Config *conf); virtual void saveProperties(Config *conf); protected: void timerEvent( QTimerEvent *e ); void paintEvent( QPaintEvent *e ); void mousePressEvent ( QMouseEvent *e); void myMoveEvent ( QMouseEvent *e); // properties of the stone picture int stone_width,stone_height; // size of one stone int maxcolors; // number of different stones (Y direction) int maxslices; // number of pictures per movie (X direction) signals: // A new game begins void s_newgame(); void s_colors(int colors); void s_board(int board); void s_score(int score); void s_marked(int m); void s_gameover(); // The stone (x,y) was clicked(removed), // all neighbor stones disappear without further signals void s_remove(int x,int y); 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 @@ -189,56 +189,57 @@ void ZSameWidget::m_tglboard() { } void ZSameWidget::setColors(int ) { // status->changeItem(i18n("%1 Colors").arg(colors),1); } void ZSameWidget::setBoard(int ) { // status->changeItem(i18n("Board: %1").arg(board, 6), 2); } void ZSameWidget::setMarked(int ) { // status->changeItem(i18n("Marked: %1").arg(m, 6),3); } void ZSameWidget::stonesRemoved(int,int) { // KNotifyClient::event("stones removed", // i18n("%1 stones removed.").arg(stone->marked())); } void ZSameWidget::setScore(int ) { // status->changeItem(i18n("Score: %1").arg(score, 6),4); // undo->setEnabled(stone->undoPossible()); // restart->setEnabled(!stone->isOriginalBoard()); } void ZSameWidget::gameover() { // kdDebug() << "GameOver" << endl; if (stone->hasBonus()) { QMessageBox::information(this,i18n("Game won"), i18n("<qt>You even removed the last stone, great job! " "This gave you a score of %1 in total.</qt>").arg(stone->score())); + stone->clearBonus(); } else { QMessageBox::information(this,i18n("Game over"), i18n("<qt>There are no more removeable stones. " "You got a score of %1 in total.</qt>").arg(stone->score())); } stone->unmark(); } void ZSameWidget::desktop_widget(int *f)const{ QWidget* wid = QApplication::desktop(); /* width > height landscape mode */ if ( wid->width() > wid->height() ) { f[0]=15; f[1]=9; } /* normal */ else{ f[0]=12; f[1]=13; } } |