summaryrefslogtreecommitdiff
path: root/noncore/games/minesweep/minesweep.cpp
Side-by-side diff
Diffstat (limited to 'noncore/games/minesweep/minesweep.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/minesweep/minesweep.cpp390
1 files changed, 390 insertions, 0 deletions
diff --git a/noncore/games/minesweep/minesweep.cpp b/noncore/games/minesweep/minesweep.cpp
new file mode 100644
index 0000000..6492462
--- a/dev/null
+++ b/noncore/games/minesweep/minesweep.cpp
@@ -0,0 +1,390 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
+**
+** This file is part of Qtopia Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "minesweep.h"
+#include "minefield.h"
+
+#include <qpe/resource.h>
+#include <qpe/config.h>
+
+#include <qpe/qpetoolbar.h>
+#include <qpe/qpemenubar.h>
+#include <qpopupmenu.h>
+#include <qpushbutton.h>
+#include <qlcdnumber.h>
+#include <qmessagebox.h>
+#include <qtimer.h>
+#include <qpalette.h>
+#include <qapplication.h>
+#include <qlayout.h>
+#include <qlabel.h>
+
+#include <stdlib.h>
+#include <time.h>
+
+
+
+
+static const char *pix_new[]={
+"20 20 3 1",
+" c None",
+"# c #00FF00",
+". c #000000",
+" ",
+" ...... ",
+" ..######.. ",
+" .##########. ",
+" .############. ",
+" .##############. ",
+" .##############. ",
+" .################. ",
+" .################. ",
+" .################. ",
+" .################. ",
+" .################. ",
+" .################. ",
+" .##############. ",
+" .##############. ",
+" .############. ",
+" .##########. ",
+" ..######.. ",
+" ...... ",
+" "};
+
+
+/* XPM */
+static const char * happy_xpm[] = {
+"20 20 3 1",
+" c None",
+". c #ffff3f ",
+"# c #000000",
+" ",
+" ###### ",
+" ##......## ",
+" #..........# ",
+" #............# ",
+" #..............# ",
+" #..............# ",
+" #....##....##....# ",
+" #....##....##....# ",
+" #................# ",
+" #................# ",
+" #................# ",
+" #...#........#...# ",
+" #.##........##.# ",
+" #...########...# ",
+" #...######...# ",
+" #..........# ",
+" ##......## ",
+" ###### ",
+" "};
+
+
+/* XPM */
+static const char * worried_xpm[] = {
+"20 20 3 1",
+" c None",
+". c #ffff3f",
+"# c #000000",
+" ",
+" ###### ",
+" ##......## ",
+" #..........# ",
+" #............# ",
+" #..............# ",
+" #..............# ",
+" #....##....##....# ",
+" #....##....##....# ",
+" #................# ",
+" #................# ",
+" #................# ",
+" #................# ",
+" #....######....# ",
+" #..............# ",
+" #............# ",
+" #..........# ",
+" ##......## ",
+" ###### ",
+" "};
+
+
+/* XPM */
+static const char * dead_xpm[] = {
+"20 20 3 1",
+" c None",
+". c #ffff3f",
+"# c #000000",
+" ",
+" ###### ",
+" ##......## ",
+" #..........# ",
+" #............# ",
+" #..............# ",
+" #..#.#...#.#...# ",
+" #....#.....#.....# ",
+" #...#.#...#.#....# ",
+" #................# ",
+" #................# ",
+" #................# ",
+" #......####......# ",
+" #....# #....# ",
+" #...#......#...# ",
+" #............# ",
+" #..........# ",
+" ##......## ",
+" ###### ",
+" "};
+
+
+class ResultIndicator : private QLabel
+{
+public:
+ static void showResult( QWidget *ref, bool won );
+private:
+ ResultIndicator( QWidget *parent, const char *name, WFlags f)
+ :QLabel( parent, name, f ) {}
+
+ void timerEvent( QTimerEvent *);
+ void center();
+ bool twoStage;
+ int timerId;
+};
+
+void ResultIndicator::showResult( QWidget *ref, bool won )
+{
+ ResultIndicator *r = new ResultIndicator( ref, 0, WStyle_Customize | WStyle_Tool | WType_TopLevel );
+
+ r->setAlignment( AlignCenter );
+ r->setFrameStyle( Sunken|StyledPanel );
+ if ( won ) {
+ r->setText( MineSweep::tr("You won!") );
+ r->center();
+ r->show();
+ r->twoStage = FALSE;
+ r->timerId = r->startTimer(1500);
+ } else {
+ QPalette p( red );
+ r->setPalette( p );
+ r->setText( MineSweep::tr("You exploded!") );
+ r->resize( ref->size() );
+ r->move( ref->mapToGlobal(QPoint(0,0)) );
+ r->show();
+ r->twoStage = TRUE;
+ r->timerId =r->startTimer(200);
+ }
+}
+
+void ResultIndicator::center()
+{
+ QWidget *w = parentWidget();
+
+ QPoint pp = w->mapToGlobal( QPoint(0,0) );
+ QSize s = sizeHint()*3;
+ pp = QPoint( pp.x() + w->width()/2 - s.width()/2,
+ pp.y() + w->height()/ 2 - s.height()/2 );
+
+ setGeometry( QRect(pp, s) );
+
+}
+
+void ResultIndicator::timerEvent( QTimerEvent *te )
+{
+ if ( te->timerId() != timerId )
+ return;
+ killTimer( timerId );
+ if ( twoStage ) {
+ center();
+ twoStage = FALSE;
+ timerId = startTimer( 1000 );
+ } else {
+ delete this;
+ }
+}
+
+
+MineSweep::MineSweep( QWidget* parent, const char* name, WFlags f )
+: QMainWindow( parent, name, f )
+{
+ srand(::time(0));
+ setCaption( tr("Mine Hunt") );
+ setIcon( Resource::loadPixmap( "minesweep_icon" ) );
+
+ QPEToolBar *menuToolBar = new QPEToolBar( this );
+ QPEMenuBar *menuBar = new QPEMenuBar( menuToolBar );
+
+ QPopupMenu *gameMenu = new QPopupMenu( this );
+ gameMenu->insertItem( tr("Beginner"), this, SLOT( beginner() ) );
+ gameMenu->insertItem( tr("Advanced"), this, SLOT( advanced() ) );
+ gameMenu->insertItem( tr("Expert"), this, SLOT( expert() ) );
+
+ menuBar->insertItem( tr("Game"), gameMenu );
+
+ QPEToolBar *toolBar = new QPEToolBar( this );
+ toolBar->setHorizontalStretchable( TRUE );
+
+ guessLCD = new QLCDNumber( toolBar );
+ toolBar->setStretchableWidget( guessLCD );
+
+ QPalette lcdPal( red );
+ lcdPal.setColor( QColorGroup::Background, QApplication::palette().active().background() );
+ lcdPal.setColor( QColorGroup::Button, QApplication::palette().active().button() );
+
+// guessLCD->setPalette( lcdPal );
+ guessLCD->setSegmentStyle( QLCDNumber::Flat );
+ guessLCD->setFrameStyle( QFrame::NoFrame );
+ guessLCD->setNumDigits( 2 );
+ guessLCD->setBackgroundMode( PaletteButton );
+ newGameButton = new QPushButton( toolBar );
+ newGameButton->setPixmap( QPixmap( pix_new ) );
+ newGameButton->setFocusPolicy(QWidget::NoFocus);
+ connect( newGameButton, SIGNAL(clicked()), this, SLOT(newGame()) );
+
+ timeLCD = new QLCDNumber( toolBar );
+// timeLCD->setPalette( lcdPal );
+ timeLCD->setSegmentStyle( QLCDNumber::Flat );
+ timeLCD->setFrameStyle( QFrame::NoFrame );
+ timeLCD->setNumDigits( 5 ); // "mm:ss"
+ timeLCD->setBackgroundMode( PaletteButton );
+
+ setToolBarsMovable ( FALSE );
+
+ addToolBar( menuToolBar );
+ addToolBar( toolBar );
+
+ QFrame *mainframe = new QFrame( this );
+ mainframe->setFrameShape( QFrame::Box );
+ mainframe->setFrameShadow( QFrame::Raised );
+ mainframe->setMargin(5);
+ mainframe->setLineWidth(2);
+ QBoxLayout *box = new QVBoxLayout( mainframe );
+ field = new MineField( mainframe );
+ box->addWidget( field, 0, AlignCenter );
+ QFont fnt = field->font();
+ fnt.setBold( TRUE );
+ field->setFont( QFont( fnt ) );
+ field->setFocus();
+ setCentralWidget( mainframe );
+
+ connect( field, SIGNAL( gameOver( bool ) ), this, SLOT( gameOver( bool ) ) );
+ connect( field, SIGNAL( mineCount( int ) ), this, SLOT( setCounter( int ) ) );
+ connect( field, SIGNAL( gameStarted()), this, SLOT( startPlaying() ) );
+
+ timer = new QTimer( this );
+
+ connect( timer, SIGNAL( timeout() ), this, SLOT( updateTime() ) );
+
+ readConfig();
+}
+
+MineSweep::~MineSweep()
+{
+ writeConfig();
+}
+
+void MineSweep::gameOver( bool won )
+{
+ field->showMines();
+ if ( won ) {
+ newGameButton->setPixmap( QPixmap( happy_xpm ) );
+ } else {
+ newGameButton->setPixmap( QPixmap( dead_xpm ) );
+ }
+ ResultIndicator::showResult( this, won );
+ timer->stop();
+}
+
+void MineSweep::newGame()
+{
+ newGame(field->level());
+}
+
+void MineSweep::newGame(int level)
+{
+ timeLCD->display( "0:00" );
+ field->setup( level );
+ newGameButton->setPixmap( QPixmap( pix_new ) );
+ timer->stop();
+}
+
+void MineSweep::startPlaying()
+{
+ newGameButton->setPixmap( QPixmap( worried_xpm ) );
+ starttime = QDateTime::currentDateTime();
+ timer->start( 1000 );
+}
+
+void MineSweep::beginner()
+{
+ newGame(1);
+}
+
+void MineSweep::advanced()
+{
+ newGame(2);
+}
+
+void MineSweep::expert()
+{
+ newGame(3);
+}
+
+void MineSweep::setCounter( int c )
+{
+ if ( !guessLCD )
+ return;
+
+ guessLCD->display( c );
+}
+
+void MineSweep::updateTime()
+{
+ if ( !timeLCD )
+ return;
+
+ int s = starttime.secsTo(QDateTime::currentDateTime());
+ if ( s/60 > 99 )
+ timeLCD->display( "-----" );
+ else
+ timeLCD->display( QString().sprintf("%2d:%02d",s/60,s%60) );
+}
+
+void MineSweep::writeConfig() const
+{
+ Config cfg("MineSweep");
+ cfg.setGroup("Panel");
+ cfg.writeEntry("Time",
+ timer->isActive() ? starttime.secsTo(QDateTime::currentDateTime()) : -1);
+ field->writeConfig(cfg);
+}
+
+void MineSweep::readConfig()
+{
+ Config cfg("MineSweep");
+ field->readConfig(cfg);
+ cfg.setGroup("Panel");
+ int s = cfg.readNumEntry("Time",-1);
+ if ( s<0 ) {
+ newGame();
+ } else {
+ startPlaying();
+ starttime = QDateTime::currentDateTime().addSecs(-s);
+ updateTime();
+ }
+}