summaryrefslogtreecommitdiffstats
path: root/ksmiletris/gamewindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ksmiletris/gamewindow.cpp')
-rw-r--r--ksmiletris/gamewindow.cpp204
1 files changed, 204 insertions, 0 deletions
diff --git a/ksmiletris/gamewindow.cpp b/ksmiletris/gamewindow.cpp
new file mode 100644
index 00000000..60973530
--- /dev/null
+++ b/ksmiletris/gamewindow.cpp
@@ -0,0 +1,204 @@
+/****************************************************************
+Copyright (c) 1998 Sandro Sigala <[email protected]>.
+All rights reserved.
+
+Permission to use, copy, modify, and distribute this software
+and its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of the author not be used in
+advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+The author disclaim all warranties with regard to this
+software, including all implied warranties of merchantability
+and fitness. In no event shall the author be liable for any
+special, indirect or consequential damages or any damages
+whatsoever resulting from loss of use, data or profits, whether
+in an action of contract, negligence or other tortious action,
+arising out of or in connection with the use or performance of
+this software.
+****************************************************************/
+
+#include "config.h"
+
+#include <kapplication.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kmenubar.h>
+#include <kstatusbar.h>
+
+#include "ksmiletris.h"
+#include "gamewindow.h"
+#include "gamewidget.h"
+#include "kscoredialog.h"
+
+#include <kaction.h>
+#include <kstdgameaction.h>
+
+
+
+const int default_width = 362;
+const int default_height = 460;
+
+GameWindow::GameWindow(QWidget *, const char *name)
+ : KMainWindow(0, name)
+{
+ //New Games
+ (void)KStdGameAction::gameNew(this,
+ SLOT(menu_newGame()),
+ actionCollection());
+
+ //Pause Game
+ (void)KStdGameAction::pause(this,
+ SLOT(menu_pause()),
+ actionCollection());
+
+ //End Game
+ (void)KStdGameAction::end(this,
+ SLOT(menu_endGame()),
+ actionCollection());
+
+ //Highscores
+ (void)KStdGameAction::highscores(this,
+ SLOT(menu_highScores()),
+ actionCollection());
+
+ //Quit
+ (void)KStdGameAction::quit(this,
+ SLOT(close()),
+ actionCollection());
+
+ QStringList list;
+ KSelectAction* piecesAct =
+ new KSelectAction(i18n("&Pieces"), 0, this, SLOT(menu_pieces()),
+ actionCollection(), "settings_pieces");
+ list.append(i18n("&Smiles"));
+ list.append(i18n("S&ymbols"));
+ list.append(i18n("&Icons"));
+ piecesAct->setItems(list);
+
+ (void)new KToggleAction(i18n("&Sounds"), 0, this,
+ SLOT(menu_sounds()), actionCollection(), "settings_sounds");
+
+
+
+
+
+ //connect(menu, SIGNAL(moved(menuPosition)),
+ // this, SLOT(movedMenu(menuPosition))); ?
+
+ status = new KStatusBar(this);
+ status->insertItem(i18n("Level: 99"), 1);
+ status->insertItem(i18n("Score: 999999"), 2);
+ status->changeItem("", 1);
+ status->changeItem("", 2);
+
+ game = new GameWidget(this);
+ setCentralWidget(game);
+ connect(game, SIGNAL(changedStats(int, int)),
+ this, SLOT(updateStats(int, int)));
+ connect(game, SIGNAL(gameOver()), this, SLOT(gameOver()));
+
+ //keys
+ (void)new KAction(i18n("Move Left"), Key_Left, game, SLOT(keyLeft()), actionCollection(), "left");
+ (void)new KAction(i18n("Move Right"), Key_Right, game, SLOT(keyRight()), actionCollection(), "right");
+ (void)new KAction(i18n("Rotate Left"), Key_Up, game, SLOT(keyUp()), actionCollection(), "up");
+ (void)new KAction(i18n("Rotate Right"), Key_Down, game, SLOT(keyDown()), actionCollection(), "down");
+ (void)new KAction(i18n("Drop Down"), Key_Space, game, SLOT(keySpace()), actionCollection(), "space");
+
+ game->setFixedSize(default_width, default_height);
+ adjustSize();
+ setFixedSize(size());
+
+ // Read configuration
+ KConfig *config = kapp->config();
+ config->setGroup("Options");
+ PiecesType pieces_type = (PiecesType)config->readNumEntry("Pieces", static_cast<int>(Pieces_Smiles));
+ game->setPieces(pieces_type);
+ ((KSelectAction*)actionCollection()->action("settings_pieces"))->setCurrentItem((int)pieces_type);
+
+
+ game->do_sounds = config->readBoolEntry("Sounds", true);
+ ((KToggleAction*)actionCollection()->action("settings_sounds"))->setChecked(game->do_sounds);
+
+ setupGUI(KMainWindow::Save | Keys | StatusBar | Create);
+}
+
+void GameWindow::menu_newGame()
+{
+ ((KToggleAction*)actionCollection()->action(KStdGameAction::stdName(KStdGameAction::Pause)))->setChecked(false);
+ game->newGame();
+}
+
+void GameWindow::menu_pause()
+{
+ if (game->in_game) {
+ game->in_pause = !game->in_pause;
+ ((KToggleAction*)actionCollection()->action(KStdGameAction::stdName(KStdGameAction::Pause)))->setChecked(game->in_pause);
+ game->repaintChilds();
+ }
+}
+
+void GameWindow::menu_endGame()
+{
+ if (game->in_game) {
+ game->in_game = false;
+ game->repaintChilds();
+ ((KToggleAction*)actionCollection()->action(KStdGameAction::stdName(KStdGameAction::Pause)))->setChecked(false);
+ gameOver();
+ }
+}
+
+void GameWindow::menu_highScores()
+{
+ KScoreDialog d(KScoreDialog::Name | KScoreDialog::Level | KScoreDialog::Score, this);
+ d.exec();
+}
+
+void GameWindow::menu_pieces()
+{
+ int index = ((KSelectAction*)actionCollection()->action("settings_pieces"))->currentItem();
+ game->setPieces((PiecesType)index);
+
+ KConfig *config = kapp->config();
+ config->setGroup("Options");
+ config->writeEntry("Pieces", index);
+}
+
+void GameWindow::menu_sounds()
+{
+ game->do_sounds = !game->do_sounds;
+ ((KToggleAction*)actionCollection()->action("settings_sounds"))->setChecked(game->do_sounds);
+
+ KConfig *config = kapp->config();
+ config->setGroup("Options");
+ config->writeEntry("Sounds", game->do_sounds);
+}
+
+void GameWindow::updateStats(int level, int points)
+{
+ QString l, p;
+ l.setNum(level);
+ p.setNum(points);
+ status->changeItem(i18n("Level: %1").arg(l), 1);
+ status->changeItem(i18n("Score: %1").arg(p), 2);
+}
+
+void GameWindow::gameOver()
+{
+ KScoreDialog d(KScoreDialog::Name | KScoreDialog::Level | KScoreDialog::Score, this);
+
+ KScoreDialog::FieldInfo scoreInfo;
+
+ scoreInfo[KScoreDialog::Level].setNum(game->num_level);
+
+ if (!d.addScore(game->num_points, scoreInfo))
+ return;
+
+ // Show highscore & ask for name.
+ d.exec();
+}
+
+#include "gamewindow.moc"