You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegames/katomic/gamewidget.cpp

254 lines
6.2 KiB

/* toplevel.cpp
Copyright (C) 1998 Andreas W<>st (AndreasWuest@gmx.de)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "settings.h"
#include "gamewidget.h"
#include "feld.h"
#include "molek.h"
#include <tqscrollbar.h>
#include <tqgroupbox.h>
#include <tqlayout.h>
#include <tqvbox.h>
#include <tqlabel.h>
#include <kapplication.h>
#include <kscoredialog.h>
#include <kmessagebox.h>
#include <klocale.h>
#include <kstandarddirs.h>
#include <kglobal.h>
#include <ksimpleconfig.h>
#include <kglobalsettings.h>
Options settings;
#define MPOSX 480
#define MPOSY 90
// ##########################
// # class GameWidget #
// ##########################
int level;
void GameWidget::moveUp()
{
feld->startAnimation (Feld::MoveUp);
}
void GameWidget::moveDown()
{
feld->startAnimation (Feld::MoveDown);
}
void GameWidget::moveLeft()
{
feld->startAnimation (Feld::MoveLeft);
}
void GameWidget::moveRight()
{
feld->startAnimation (Feld::MoveRight);
}
void GameWidget::nextAtom()
{
feld->nextAtom();
}
void GameWidget::previousAtom()
{
feld->previousAtom();
}
void GameWidget::getButton (int button)
{
feld->startAnimation ((Feld::Direction)button);
}
void GameWidget::doUndo ()
{
feld->doUndo ();
}
void GameWidget::doRedo ()
{
feld->doRedo ();
}
void GameWidget::gameOver(int moves) {
KMessageBox::information(this, i18n("You solved level %1 with %2 moves!").arg(level).arg(moves), i18n("Congratulations"));
KScoreDialog high(KScoreDialog::Name | KScoreDialog::Score, this);
high.setCaption(i18n("Level %1 Highscores").arg(level));
high.setConfigGroup(TQString("Highscores Level %1").arg(level));
KScoreDialog::FieldInfo scoreInfo;
if (high.addScore(moves, scoreInfo, true, true))
{
high.exec();
}
updateLevel(level+1);
}
void GameWidget::getMoves(int moves)
{
current.setNum(moves);
ys->setText(current);
}
void GameWidget::mergeHighScores(int l)
{
KConfigGroup oldConfig(kapp->config(), TQString("High Scores Level %1").arg(l).utf8());
KConfigGroup newConfig(kapp->config(), TQString("Highscores Level %1").arg(l).utf8());
newConfig.writeEntry("LastPlayer", oldConfig.readEntry("LastPlayer"));
TQString num;
for (int i = 1; i <= 10; ++i)
{
num.setNum(i);
TQString key = "Pos" + num + "Name";
newConfig.writeEntry(key, oldConfig.readEntry(key, "-"));
key = "Pos" + num + "Score";
newConfig.writeEntry(key, oldConfig.readEntry(key, "-"));
}
kapp->config()->sync();
}
void GameWidget::updateLevel (int l)
{
level=l;
TQString levelFile = locate("appdata", TQString("levels/level_%1").arg(l));
if (levelFile.isNull()) {
return updateLevel(1);
}
KSimpleConfig cfg(levelFile, true);
cfg.setGroup("Level");
feld->load(cfg);
if (!kapp->config()->hasGroup(TQString("Highscores Level %1").arg(level)) &&
kapp->config()->hasGroup(TQString("High Scores Level %1").arg(level)))
mergeHighScores(level);
highScore->setConfigGroup(TQString("Highscores Level %1").arg(level));
highest.setNum(highScore->highScore());
if (highest != "0" ) hs->setText(highest);
else hs->setText("-");
ys->setText("0");
scrl->setValue(level);
feld->repaint();
}
void GameWidget::restartLevel()
{
updateLevel(level);
}
GameWidget::GameWidget ( TQWidget *parent, const char* name )
: TQWidget( parent, name )
{
level = 1;
nlevels = KGlobal::dirs()->findAllResources("appdata", "levels/level_*",
false, true).count();
TQHBoxLayout *top = new TQHBoxLayout(this, 10);
// spielfeld
feld = new Feld (this, "feld");
feld->setFocus();
top->addWidget(feld);
TQVBox *vb = new TQVBox(this);
vb->setSpacing(20);
top->addWidget(vb);
// scrollbar
scrl = new TQScrollBar(1, nlevels, 1,
5, 1, Qt::Horizontal, vb, "scrl" );
connect (scrl, TQT_SIGNAL (valueChanged (int)), TQT_SLOT (updateLevel (int)));
// molek<65>l
molek = new Molek (vb, "molek");
feld->setMolek(molek);
connect (feld, TQT_SIGNAL (gameOver(int)), TQT_SLOT(gameOver(int)));
connect (feld, TQT_SIGNAL (sendMoves(int)), TQT_SLOT(getMoves(int)));
connect (feld, TQT_SIGNAL (enableRedo(bool)), TQT_SIGNAL(enableRedo(bool)));
connect (feld, TQT_SIGNAL (enableUndo(bool)), TQT_SIGNAL(enableUndo(bool)));
highScore = new KScoreDialog(KScoreDialog::Name | KScoreDialog::Score, this);
// the score group
TQGroupBox *bg = new TQGroupBox (i18n("Score"), vb, "bg");
TQBoxLayout *slay = new TQVBoxLayout (bg, 10);
slay->addSpacing(10);
slay->addWidget(new TQLabel(i18n("Highscore:"), bg));
TQFont headerFont = KGlobalSettings::generalFont();
headerFont.setBold(true);
hs = new TQLabel (highest, bg);
hs->setAlignment(TQt::AlignRight);
hs->setFont(headerFont);
slay->addWidget(hs);
slay->addSpacing(10);
slay->addWidget(new TQLabel(i18n("Your score so far:"), bg));
ys = new TQLabel (current, bg);
ys->setAlignment(TQt::AlignRight);
ys->setFont(headerFont);
slay->addWidget(ys);
updateLevel(1);
KConfig *config = KGlobal::config();
config->setGroup("Options");
settings.anim_speed = config->readNumEntry("Animation Speed", 1);
if (settings.anim_speed < 1 || settings.anim_speed > MAX_SPEED)
settings.anim_speed = 1;
settings.changed = false;
}
GameWidget::~GameWidget()
{
}
void GameWidget::showHighscores ()
{
KScoreDialog high(KScoreDialog::Name | KScoreDialog::Score, this);
high.setCaption(i18n("Level %1 Highscores").arg(level));
high.setConfigGroup(TQString("Highscores Level %1").arg(level));
high.exec();
}
#include "gamewidget.moc"