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.
247 lines
7.7 KiB
247 lines
7.7 KiB
/* Yo Emacs, this is -*- C++ -*- */
|
|
/*
|
|
* ksame 0.4 - simple Game
|
|
* Copyright (C) 1997,1998 Marcus Kreutzberger
|
|
*
|
|
* 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 "KSameWidget.h"
|
|
|
|
#include <tqwidget.h>
|
|
#include <tqvbox.h>
|
|
|
|
#include <kapplication.h>
|
|
#include <kiconloader.h>
|
|
#include <kdialogbase.h>
|
|
#include <kscoredialog.h>
|
|
#include <kstatusbar.h>
|
|
#include <knuminput.h>
|
|
#include <klocale.h>
|
|
#include <knotifyclient.h>
|
|
#include <knotifydialog.h>
|
|
#include <kfiledialog.h>
|
|
#include <kmessagebox.h>
|
|
#include <kconfig.h>
|
|
#include <kstdgameaction.h>
|
|
#include <kaction.h>
|
|
#include <kdebug.h>
|
|
|
|
#include "StoneWidget.h"
|
|
|
|
static int default_colors=3;
|
|
|
|
#define Board KScoreDialog::Custom1
|
|
|
|
KSameWidget::KSameWidget(TQWidget *parent, const char* name, WFlags fl) :
|
|
KMainWindow(parent,name,fl)
|
|
{
|
|
KStdGameAction::gameNew(TQT_TQOBJECT(this), TQT_SLOT(m_new()), actionCollection(), "game_new");
|
|
restart = new KAction(i18n("&Restart This Board"), CTRL+Key_R, TQT_TQOBJECT(this),
|
|
TQT_SLOT(m_restart()), actionCollection(), "game_restart");
|
|
KStdGameAction::highscores(TQT_TQOBJECT(this), TQT_SLOT(m_showhs()), actionCollection(), "game_highscores");
|
|
KStdGameAction::quit(TQT_TQOBJECT(this), TQT_SLOT(close()), actionCollection(), "game_quit");
|
|
undo = KStdGameAction::undo(TQT_TQOBJECT(this), TQT_SLOT(m_undo()), actionCollection(), "edit_undo");
|
|
|
|
random = new KToggleAction(i18n("&Random Board"), 0, 0, 0, actionCollection(), "random_board");
|
|
showNumberRemaining = new KToggleAction(i18n("&Show Number Remaining"), 0, TQT_TQOBJECT(this), TQT_SLOT(showNumberRemainingToggled()), actionCollection(), "showNumberRemaining");
|
|
|
|
KStdAction::configureNotifications(TQT_TQOBJECT(this), TQT_SLOT(configureNotifications()),
|
|
actionCollection());
|
|
|
|
status=statusBar();
|
|
status->insertItem(i18n("Colors: XX"),1,1);
|
|
status->insertItem(i18n("Board: XXXXXX"),2,1);
|
|
status->insertItem(i18n("Marked: XXXXXX"),3,1);
|
|
status->insertItem(i18n("Score: XXXXXX"),4,1);
|
|
|
|
stone = new StoneWidget(this,15,10);
|
|
|
|
connect( stone, TQT_SIGNAL(s_gameover()), TQT_TQOBJECT(this), TQT_SLOT(gameover()));
|
|
connect( stone, TQT_SIGNAL(s_colors(int)), TQT_TQOBJECT(this), TQT_SLOT(setColors(int)));
|
|
connect( stone, TQT_SIGNAL(s_board(int)), TQT_TQOBJECT(this), TQT_SLOT(setBoard(int)));
|
|
connect( stone, TQT_SIGNAL(s_marked(int)), TQT_TQOBJECT(this), TQT_SLOT(setMarked(int)));
|
|
connect( stone, TQT_SIGNAL(s_score(int)), TQT_TQOBJECT(this), TQT_SLOT(setScore(int)));
|
|
connect( stone, TQT_SIGNAL(s_remove(int,int)), TQT_TQOBJECT(this), TQT_SLOT(stonesRemoved(int,int)));
|
|
|
|
connect(stone, TQT_SIGNAL(s_sizechanged()), TQT_TQOBJECT(this), TQT_SLOT(sizeChanged()));
|
|
|
|
sizeChanged();
|
|
setCentralWidget(stone);
|
|
|
|
// Once the main view can scale then use defualt setupGUI() and remove the
|
|
// noMerge="1" from the uirc file
|
|
// StatusBar | ToolBar
|
|
setupGUI(KMainWindow::Save | Keys | Create );
|
|
|
|
random->setChecked(true);
|
|
setScore(0);
|
|
|
|
if (!kapp->isRestored())
|
|
newGame(kapp->random(),default_colors);
|
|
|
|
KConfig *cfg = kapp->config();
|
|
if (cfg->readBoolEntry("showRemaining"))
|
|
{
|
|
showNumberRemaining->setChecked(true);
|
|
showNumberRemainingToggled();
|
|
}
|
|
}
|
|
|
|
void KSameWidget::readProperties(KConfig *conf) {
|
|
Q_ASSERT(conf);
|
|
stone->readProperties(conf);
|
|
}
|
|
|
|
void KSameWidget::saveProperties(KConfig *conf) {
|
|
Q_ASSERT(conf);
|
|
stone->saveProperties(conf);
|
|
conf->sync();
|
|
}
|
|
|
|
void KSameWidget::sizeChanged() {
|
|
stone->setFixedSize(stone->tqsizeHint());
|
|
}
|
|
|
|
void KSameWidget::showNumberRemainingToggled()
|
|
{
|
|
if(showNumberRemaining->isChecked()){
|
|
TQStringList list;
|
|
for(int i=1;i<=stone->colors();i++)
|
|
list.append(TQString("%1").tqarg(stone->count(i)));
|
|
TQString count = TQString(" (%1)").tqarg(list.join(","));
|
|
status->changeItem(i18n("%1 Colors%2").tqarg(stone->colors()).tqarg(count),1);
|
|
}
|
|
else status->changeItem(i18n("%1 Colors").tqarg(stone->colors()),1);
|
|
|
|
KConfig *cfg = kapp->config();
|
|
cfg->writeEntry("showRemaining", showNumberRemaining->isChecked());
|
|
cfg->sync();
|
|
}
|
|
|
|
void KSameWidget::newGame(unsigned int board,int colors) {
|
|
while (board>=1000000) board-=1000000;
|
|
// kdDebug() << "newgame board " << board << " colors " << colors << endl;
|
|
stone->newGame(board,colors);
|
|
setScore(0);
|
|
}
|
|
|
|
bool KSameWidget::confirmAbort() {
|
|
return stone->isGameover() ||
|
|
stone->isOriginalBoard() ||
|
|
(KMessageBox::questionYesNo(this, i18n("Do you want to resign?"),
|
|
i18n("New Game"),i18n("Resign"),KStdGuiItem::cancel()) == KMessageBox::Yes);
|
|
}
|
|
|
|
void KSameWidget::m_new() {
|
|
if (random->isChecked()) {
|
|
if (confirmAbort())
|
|
newGame(kapp->random(),default_colors);
|
|
} else {
|
|
KDialogBase dlg(this, "boardchooser", true,
|
|
i18n("Select Board"),
|
|
KDialogBase::Ok | KDialogBase::Cancel,
|
|
KDialogBase::Ok);
|
|
|
|
TQVBox *page = dlg.makeVBoxMainWidget();
|
|
|
|
KIntNumInput bno(0, page);
|
|
bno.setRange(0, 1000000, 1);
|
|
bno.setLabel(i18n("Select a board:"));
|
|
bno.setFocus();
|
|
bno.setFixedSize(bno.tqsizeHint());
|
|
bno.setValue(stone->board());
|
|
|
|
if (dlg.exec()) newGame(bno.value(),default_colors);
|
|
}
|
|
}
|
|
|
|
void KSameWidget::m_restart() {
|
|
if (confirmAbort())
|
|
newGame(stone->board(),default_colors);
|
|
}
|
|
|
|
void KSameWidget::m_undo() {
|
|
Q_ASSERT(stone);
|
|
stone->undo();
|
|
}
|
|
|
|
void KSameWidget::m_showhs() {
|
|
Q_ASSERT(stone);
|
|
stone->unmark();
|
|
KScoreDialog d(KScoreDialog::Name | KScoreDialog::Score, this);
|
|
d.addField(Board, i18n("Board"), "Board");
|
|
d.exec();
|
|
}
|
|
|
|
void KSameWidget::setColors(int colors) {
|
|
status->changeItem(i18n("%1 Colors").tqarg(colors),1);
|
|
}
|
|
|
|
void KSameWidget::setBoard(int board) {
|
|
status->changeItem(i18n("Board: %1").tqarg(board, 6), 2);
|
|
}
|
|
|
|
void KSameWidget::setMarked(int m) {
|
|
status->changeItem(i18n("Marked: %1").tqarg(m, 6),3);
|
|
m_markedStones=m;
|
|
}
|
|
|
|
void KSameWidget::stonesRemoved(int,int) {
|
|
KNotifyClient::event(winId(),"stones removed",
|
|
i18n("One stone removed.","%n stones removed.",m_markedStones));
|
|
}
|
|
|
|
void KSameWidget::setScore(int score) {
|
|
if(showNumberRemaining->isChecked()){
|
|
TQStringList list;
|
|
for(int i=1;i<=stone->colors();i++)
|
|
list.append(TQString("%1").tqarg(stone->count(i)));
|
|
TQString count = TQString(" (%1)").tqarg(list.join(","));
|
|
status->changeItem(i18n("%1 Colors%2").tqarg(stone->colors()).tqarg(count),1);
|
|
}
|
|
status->changeItem(i18n("Score: %1").tqarg(score, 6),4);
|
|
undo->setEnabled(stone->undoPossible());
|
|
restart->setEnabled(!stone->isOriginalBoard());
|
|
}
|
|
|
|
void KSameWidget::gameover() {
|
|
if (stone->hasBonus()) {
|
|
KNotifyClient::event(winId(), "game won",
|
|
i18n("You even removed the last stone, great job! "
|
|
"This gave you a score of %1 in total.").tqarg(stone->score()));
|
|
} else {
|
|
KNotifyClient::event(winId(), "game over",
|
|
i18n("There are no more removeable stones. "
|
|
"You got a score of %1 in total.").tqarg(stone->score()));
|
|
}
|
|
stone->unmark();
|
|
KScoreDialog d(KScoreDialog::Name | KScoreDialog::Score, this);
|
|
d.addField(Board, i18n("Board"), "Board");
|
|
|
|
KScoreDialog::FieldInfo scoreInfo;
|
|
scoreInfo[Board].setNum(stone->board());
|
|
|
|
if (d.addScore(stone->score(), scoreInfo))
|
|
d.exec();
|
|
}
|
|
|
|
void KSameWidget::configureNotifications() {
|
|
KNotifyDialog::configure(this);
|
|
}
|
|
|
|
#include "KSameWidget.moc"
|