|
|
|
#include <kaction.h>
|
|
|
|
#include <kapplication.h>
|
|
|
|
#include <kconfig.h>
|
|
|
|
#include <kdebug.h>
|
|
|
|
#include <tdeversion.h>
|
|
|
|
#include <kfiledialog.h>
|
|
|
|
#include <kglobal.h>
|
|
|
|
#include <kio/netaccess.h>
|
|
|
|
#include <klocale.h>
|
|
|
|
#include <kmainwindow.h>
|
|
|
|
#include <kmimetype.h>
|
|
|
|
#include <kmessagebox.h>
|
|
|
|
#include <kprinter.h>
|
|
|
|
#include <kscoredialog.h>
|
|
|
|
#include <kstandarddirs.h>
|
|
|
|
#include <kstatusbar.h>
|
|
|
|
#include <kstdaccel.h>
|
|
|
|
#include <kstdaction.h>
|
|
|
|
#include <kstdgameaction.h>
|
|
|
|
#include <kstdguiitem.h>
|
|
|
|
|
|
|
|
#include <tqcolor.h>
|
|
|
|
#include <tqevent.h>
|
|
|
|
#include <tqfile.h>
|
|
|
|
#include <tqobject.h>
|
|
|
|
#include <tqmap.h>
|
|
|
|
#include <tqpoint.h>
|
|
|
|
#include <tqtimer.h>
|
|
|
|
#include <tqptrlist.h>
|
|
|
|
#include <tqpixmap.h>
|
|
|
|
#include <tqpixmapcache.h>
|
|
|
|
#include <tqfileinfo.h>
|
|
|
|
#include <tqstring.h>
|
|
|
|
#include <tqstringlist.h>
|
|
|
|
#include <tqlayout.h>
|
|
|
|
#include <tqwidget.h>
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include "game.h"
|
|
|
|
#include "floater.h"
|
|
|
|
#include "slope.h"
|
|
|
|
#include "newgame.h"
|
|
|
|
#include "scoreboard.h"
|
|
|
|
#include "editor.h"
|
|
|
|
#include "pluginloader.h"
|
|
|
|
#include "printdialogpage.h"
|
|
|
|
#include "kolf.h"
|
|
|
|
|
|
|
|
Kolf::Kolf()
|
|
|
|
: KMainWindow(0, "Kolf")
|
|
|
|
{
|
|
|
|
competition = false;
|
|
|
|
game = 0;
|
|
|
|
editor = 0;
|
|
|
|
spacer = 0;
|
|
|
|
scoreboard = 0;
|
|
|
|
isTutorial = false;
|
|
|
|
|
|
|
|
initGUI();
|
|
|
|
|
|
|
|
obj = new ObjectList;
|
|
|
|
initPlugins();
|
|
|
|
|
|
|
|
filename = TQString();
|
|
|
|
dummy = new TQWidget(this);
|
|
|
|
setCentralWidget(dummy);
|
|
|
|
layout = new TQGridLayout(dummy, 3, 1);
|
|
|
|
|
|
|
|
resize(420, 480);
|
|
|
|
}
|
|
|
|
|
|
|
|
Kolf::~Kolf()
|
|
|
|
{
|
|
|
|
// wipe out our objects
|
|
|
|
obj->setAutoDelete(true);
|
|
|
|
delete obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::initGUI()
|
|
|
|
{
|
|
|
|
newAction = KStdGameAction::gameNew(TQT_TQOBJECT(this), TQT_SLOT(newGame()), actionCollection());
|
|
|
|
newAction->setText(newAction->text() + TQString("..."));
|
|
|
|
|
|
|
|
endAction = KStdGameAction::end(TQT_TQOBJECT(this), TQT_SLOT(closeGame()), actionCollection());
|
|
|
|
printAction = KStdGameAction::print(TQT_TQOBJECT(this), TQT_SLOT(print()), actionCollection());
|
|
|
|
|
|
|
|
(void) KStdGameAction::quit(TQT_TQOBJECT(this), TQT_SLOT(close()), actionCollection());
|
|
|
|
saveAction = KStdAction::save(TQT_TQOBJECT(this), TQT_SLOT(save()), actionCollection(), "game_save");
|
|
|
|
saveAction->setText(i18n("Save &Course"));
|
|
|
|
saveAsAction = KStdAction::saveAs(TQT_TQOBJECT(this), TQT_SLOT(saveAs()), actionCollection(), "game_save_as");
|
|
|
|
saveAsAction->setText(i18n("Save &Course As..."));
|
|
|
|
|
|
|
|
saveGameAction = new KAction(i18n("&Save Game"), 0, TQT_TQOBJECT(this), TQT_SLOT(saveGame()), actionCollection(), "savegame");
|
|
|
|
saveGameAsAction = new KAction(i18n("&Save Game As..."), 0, TQT_TQOBJECT(this), TQT_SLOT(saveGameAs()), actionCollection(), "savegameas");
|
|
|
|
|
|
|
|
loadGameAction = KStdGameAction::load(TQT_TQOBJECT(this), TQT_SLOT(loadGame()), actionCollection());
|
|
|
|
loadGameAction->setText(i18n("Load Saved Game..."));
|
|
|
|
|
|
|
|
highScoreAction = KStdGameAction::highscores(TQT_TQOBJECT(this), TQT_SLOT(showHighScores()), actionCollection());
|
|
|
|
|
|
|
|
editingAction = new KToggleAction(i18n("&Edit"), "pencil", CTRL+Key_E, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "editing");
|
|
|
|
newHoleAction = new KAction(i18n("&New"), "filenew", CTRL+SHIFT+Key_N, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "newhole");
|
|
|
|
clearHoleAction = new KAction(KStdGuiItem::clear().text(), "locationbar_erase", CTRL+Key_Delete, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "clearhole");
|
|
|
|
resetHoleAction = new KAction(i18n("&Reset"), CTRL+Key_R, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "resethole");
|
|
|
|
undoShotAction = KStdAction::undo(TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "undoshot");
|
|
|
|
undoShotAction->setText(i18n("&Undo Shot"));
|
|
|
|
//replayShotAction = new KAction(i18n("&Replay Shot"), 0, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "replay");
|
|
|
|
|
|
|
|
holeAction = new KListAction(i18n("Switch to Hole"), 0, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "switchhole");
|
|
|
|
nextAction = new KAction(i18n("&Next Hole"), "forward", KStdAccel::shortcut(KStdAccel::Forward), TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "nexthole");
|
|
|
|
prevAction = new KAction(i18n("&Previous Hole"), "back", KStdAccel::shortcut(KStdAccel::Back), TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "prevhole");
|
|
|
|
firstAction = new KAction(i18n("&First Hole"), "gohome", KStdAccel::shortcut(KStdAccel::Home), TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "firsthole");
|
|
|
|
lastAction = new KAction(i18n("&Last Hole"), CTRL+SHIFT+Key_End, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "lasthole");
|
|
|
|
randAction = new KAction(i18n("&Random Hole"), "goto", 0, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "randhole");
|
|
|
|
|
|
|
|
useMouseAction = new KToggleAction(i18n("Enable &Mouse for Moving Putter"), 0, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "usemouse");
|
|
|
|
useMouseAction->setCheckedState(i18n("Disable &Mouse for Moving Putter"));
|
|
|
|
connect(useMouseAction, TQT_SIGNAL(toggled(bool)), TQT_TQOBJECT(this), TQT_SLOT(useMouseChanged(bool)));
|
|
|
|
KConfig *config = kapp->config();
|
|
|
|
config->setGroup("Settings");
|
|
|
|
useMouseAction->setChecked(config->readBoolEntry("useMouse", true));
|
|
|
|
|
|
|
|
useAdvancedPuttingAction = new KToggleAction(i18n("Enable &Advanced Putting"), 0, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "useadvancedputting");
|
|
|
|
useAdvancedPuttingAction->setCheckedState(i18n("Disable &Advanced Putting"));
|
|
|
|
connect(useAdvancedPuttingAction, TQT_SIGNAL(toggled(bool)), TQT_TQOBJECT(this), TQT_SLOT(useAdvancedPuttingChanged(bool)));
|
|
|
|
useAdvancedPuttingAction->setChecked(config->readBoolEntry("useAdvancedPutting", false));
|
|
|
|
|
|
|
|
showInfoAction = new KToggleAction(i18n("Show &Info"), "info", CTRL+Key_I, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "showinfo");
|
|
|
|
showInfoAction->setCheckedState(i18n("Hide &Info"));
|
|
|
|
connect(showInfoAction, TQT_SIGNAL(toggled(bool)), TQT_TQOBJECT(this), TQT_SLOT(showInfoChanged(bool)));
|
|
|
|
showInfoAction->setChecked(config->readBoolEntry("showInfo", false));
|
|
|
|
|
|
|
|
showGuideLineAction = new KToggleAction(i18n("Show Putter &Guideline"), 0, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "showguideline");
|
|
|
|
showGuideLineAction->setCheckedState(i18n("Hide Putter &Guideline"));
|
|
|
|
connect(showGuideLineAction, TQT_SIGNAL(toggled(bool)), TQT_TQOBJECT(this), TQT_SLOT(showGuideLineChanged(bool)));
|
|
|
|
showGuideLineAction->setChecked(config->readBoolEntry("showGuideLine", true));
|
|
|
|
|
|
|
|
KToggleAction *act=new KToggleAction(i18n("Enable All Dialog Boxes"), 0, TQT_TQOBJECT(this), TQT_SLOT(enableAllMessages()), actionCollection(), "enableAll");
|
|
|
|
act->setCheckedState(i18n("Disable All Dialog Boxes"));
|
|
|
|
|
|
|
|
soundAction = new KToggleAction(i18n("Play &Sounds"), 0, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "sound");
|
|
|
|
connect(soundAction, TQT_SIGNAL(toggled(bool)), TQT_TQOBJECT(this), TQT_SLOT(soundChanged(bool)));
|
|
|
|
soundAction->setChecked(config->readBoolEntry("sound", true));
|
|
|
|
|
|
|
|
(void) new KAction(i18n("&Reload Plugins"), 0, TQT_TQOBJECT(this), TQT_SLOT(initPlugins()), actionCollection(), "reloadplugins");
|
|
|
|
(void) new KAction(i18n("Show &Plugins"), 0, TQT_TQOBJECT(this), TQT_SLOT(showPlugins()), actionCollection(), "showplugins");
|
|
|
|
|
|
|
|
aboutAction = new KAction(i18n("&About Course"), 0, TQT_TQOBJECT(this), TQT_SLOT(emptySlot()), actionCollection(), "aboutcourse");
|
|
|
|
tutorialAction = new KAction(i18n("&Tutorial"), 0, TQT_TQOBJECT(this), TQT_SLOT(tutorial()), actionCollection(), "tutorial");
|
|
|
|
|
|
|
|
statusBar();
|
|
|
|
setupGUI();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Kolf::queryClose()
|
|
|
|
{
|
|
|
|
if (game)
|
|
|
|
if (game->askSave(true))
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::startNewGame()
|
|
|
|
{
|
|
|
|
NewGameDialog *dialog = 0;
|
|
|
|
int firstHole = 1;
|
|
|
|
|
|
|
|
if (loadedGame.isNull())
|
|
|
|
{
|
|
|
|
dialog = new NewGameDialog(filename.isNull(), dummy, "New Game Dialog");
|
|
|
|
if (dialog->exec() != TQDialog::Accepted)
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
|
|
|
players.clear();
|
|
|
|
delete scoreboard;
|
|
|
|
scoreboard = new ScoreBoard(dummy, "Score Board");
|
|
|
|
layout->addWidget(scoreboard, 1, 0);
|
|
|
|
scoreboard->show();
|
|
|
|
|
|
|
|
if (loadedGame.isNull())
|
|
|
|
{
|
|
|
|
PlayerEditor *curEditor = 0;
|
|
|
|
int newId = 1;
|
|
|
|
for (curEditor = dialog->players()->first(); curEditor; curEditor = dialog->players()->next(), ++newId)
|
|
|
|
{
|
|
|
|
players.append(Player());
|
|
|
|
players.last().ball()->setColor(curEditor->color());
|
|
|
|
players.last().setName(curEditor->name());
|
|
|
|
players.last().setId(newId);
|
|
|
|
}
|
|
|
|
|
|
|
|
competition = dialog->competition();
|
|
|
|
filename = filename.isNull()? dialog->course() : filename;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
KConfig config(loadedGame);
|
|
|
|
config.setGroup("0 Saved Game");
|
|
|
|
|
|
|
|
if (isTutorial)
|
|
|
|
filename = KGlobal::dirs()->findResource("appdata", "tutorial.kolf");
|
|
|
|
else
|
|
|
|
filename = config.readEntry("Course", TQString());
|
|
|
|
|
|
|
|
if (filename.isNull())
|
|
|
|
return;
|
|
|
|
|
|
|
|
competition = config.readBoolEntry("Competition", false);
|
|
|
|
firstHole = config.readNumEntry("Current Hole", 1);
|
|
|
|
|
|
|
|
players.clear();
|
|
|
|
KolfGame::scoresFromSaved(&config, players);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (PlayerList::Iterator it = players.begin(); it != players.end(); ++it)
|
|
|
|
scoreboard->newPlayer((*it).name());
|
|
|
|
|
|
|
|
delete spacer;
|
|
|
|
spacer = 0;
|
|
|
|
delete game;
|
|
|
|
game = new KolfGame(obj, &players, filename, dummy);
|
|
|
|
game->setStrict(competition);
|
|
|
|
|
|
|
|
connect(game, TQT_SIGNAL(newHole(int)), scoreboard, TQT_SLOT(newHole(int)));
|
|
|
|
connect(game, TQT_SIGNAL(scoreChanged(int, int, int)), scoreboard, TQT_SLOT(setScore(int, int, int)));
|
|
|
|
connect(game, TQT_SIGNAL(parChanged(int, int)), scoreboard, TQT_SLOT(parChanged(int, int)));
|
|
|
|
connect(game, TQT_SIGNAL(modifiedChanged(bool)), TQT_TQOBJECT(this), TQT_SLOT(updateModified(bool)));
|
|
|
|
connect(game, TQT_SIGNAL(newPlayersTurn(Player *)), TQT_TQOBJECT(this), TQT_SLOT(newPlayersTurn(Player *)));
|
|
|
|
connect(game, TQT_SIGNAL(holesDone()), TQT_TQOBJECT(this), TQT_SLOT(gameOver()));
|
|
|
|
connect(game, TQT_SIGNAL(checkEditing()), TQT_TQOBJECT(this), TQT_SLOT(checkEditing()));
|
|
|
|
connect(game, TQT_SIGNAL(editingStarted()), TQT_TQOBJECT(this), TQT_SLOT(editingStarted()));
|
|
|
|
connect(game, TQT_SIGNAL(editingEnded()), TQT_TQOBJECT(this), TQT_SLOT(editingEnded()));
|
|
|
|
connect(game, TQT_SIGNAL(inPlayStart()), TQT_TQOBJECT(this), TQT_SLOT(inPlayStart()));
|
|
|
|
connect(game, TQT_SIGNAL(inPlayEnd()), TQT_TQOBJECT(this), TQT_SLOT(inPlayEnd()));
|
|
|
|
connect(game, TQT_SIGNAL(maxStrokesReached(const TQString &)), TQT_TQOBJECT(this), TQT_SLOT(maxStrokesReached(const TQString &)));
|
|
|
|
connect(game, TQT_SIGNAL(largestHole(int)), TQT_TQOBJECT(this), TQT_SLOT(updateHoleMenu(int)));
|
|
|
|
connect(game, TQT_SIGNAL(titleChanged(const TQString &)), TQT_TQOBJECT(this), TQT_SLOT(titleChanged(const TQString &)));
|
|
|
|
connect(game, TQT_SIGNAL(newStatusText(const TQString &)), TQT_TQOBJECT(this), TQT_SLOT(newStatusText(const TQString &)));
|
|
|
|
connect(game, TQT_SIGNAL(currentHole(int)), TQT_TQOBJECT(this), TQT_SLOT(setCurrentHole(int)));
|
|
|
|
connect(holeAction, TQT_SIGNAL(activated(const TQString &)), game, TQT_SLOT(switchHole(const TQString &)));
|
|
|
|
connect(nextAction, TQT_SIGNAL(activated()), game, TQT_SLOT(nextHole()));
|
|
|
|
connect(prevAction, TQT_SIGNAL(activated()), game, TQT_SLOT(prevHole()));
|
|
|
|
connect(firstAction, TQT_SIGNAL(activated()), game, TQT_SLOT(firstHole()));
|
|
|
|
connect(lastAction, TQT_SIGNAL(activated()), game, TQT_SLOT(lastHole()));
|
|
|
|
connect(randAction, TQT_SIGNAL(activated()), game, TQT_SLOT(randHole()));
|
|
|
|
connect(editingAction, TQT_SIGNAL(activated()), game, TQT_SLOT(toggleEditMode()));
|
|
|
|
connect(newHoleAction, TQT_SIGNAL(activated()), game, TQT_SLOT(addNewHole()));
|
|
|
|
connect(clearHoleAction, TQT_SIGNAL(activated()), game, TQT_SLOT(clearHole()));
|
|
|
|
connect(resetHoleAction, TQT_SIGNAL(activated()), game, TQT_SLOT(resetHole()));
|
|
|
|
connect(undoShotAction, TQT_SIGNAL(activated()), game, TQT_SLOT(undoShot()));
|
|
|
|
//connect(replayShotAction, TQT_SIGNAL(activated()), game, TQT_SLOT(replay()));
|
|
|
|
connect(aboutAction, TQT_SIGNAL(activated()), game, TQT_SLOT(showInfoDlg()));
|
|
|
|
connect(useMouseAction, TQT_SIGNAL(toggled(bool)), game, TQT_SLOT(setUseMouse(bool)));
|
|
|
|
connect(useAdvancedPuttingAction, TQT_SIGNAL(toggled(bool)), game, TQT_SLOT(setUseAdvancedPutting(bool)));
|
|
|
|
connect(soundAction, TQT_SIGNAL(toggled(bool)), game, TQT_SLOT(setSound(bool)));
|
|
|
|
connect(showGuideLineAction, TQT_SIGNAL(toggled(bool)), game, TQT_SLOT(setShowGuideLine(bool)));
|
|
|
|
connect(showInfoAction, TQT_SIGNAL(toggled(bool)), game, TQT_SLOT(setShowInfo(bool)));
|
|
|
|
|
|
|
|
game->setUseMouse(useMouseAction->isChecked());
|
|
|
|
game->setUseAdvancedPutting(useAdvancedPuttingAction->isChecked());
|
|
|
|
game->setShowInfo(showInfoAction->isChecked());
|
|
|
|
game->setShowGuideLine(showGuideLineAction->isChecked());
|
|
|
|
game->setSound(soundAction->isChecked());
|
|
|
|
|
|
|
|
layout->addWidget(game, 0, 0, AlignCenter);
|
|
|
|
|
|
|
|
game->show();
|
|
|
|
game->setFocus();
|
|
|
|
|
|
|
|
setEditingEnabled(true);
|
|
|
|
endAction->setEnabled(true);
|
|
|
|
setHoleMovementEnabled(true);
|
|
|
|
setHoleOtherEnabled(true);
|
|
|
|
aboutAction->setEnabled(true);
|
|
|
|
highScoreAction->setEnabled(true);
|
|
|
|
printAction->setEnabled(true);
|
|
|
|
saveAction->setEnabled(true);
|
|
|
|
saveAsAction->setEnabled(true);
|
|
|
|
saveGameAction->setEnabled(true);
|
|
|
|
saveGameAsAction->setEnabled(true);
|
|
|
|
|
|
|
|
clearHoleAction->setEnabled(false);
|
|
|
|
newHoleAction->setEnabled(false);
|
|
|
|
newAction->setEnabled(false);
|
|
|
|
loadGameAction->setEnabled(false);
|
|
|
|
tutorialAction->setEnabled(false);
|
|
|
|
|
|
|
|
|
|
|
|
// so game can do stuff that needs to be done
|
|
|
|
// after things above are connected
|
|
|
|
game->startFirstHole(firstHole);
|
|
|
|
|
|
|
|
end:
|
|
|
|
delete dialog;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::newGame()
|
|
|
|
{
|
|
|
|
isTutorial = false;
|
|
|
|
filename = TQString();
|
|
|
|
startNewGame();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::tutorial()
|
|
|
|
{
|
|
|
|
TQString newfilename = KGlobal::dirs()->findResource("appdata", "tutorial.kolfgame");
|
|
|
|
if (newfilename.isNull())
|
|
|
|
return;
|
|
|
|
|
|
|
|
filename = TQString();
|
|
|
|
loadedGame = newfilename;
|
|
|
|
isTutorial = true;
|
|
|
|
|
|
|
|
startNewGame();
|
|
|
|
|
|
|
|
loadedGame = TQString();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::closeGame()
|
|
|
|
{
|
|
|
|
if (game)
|
|
|
|
{
|
|
|
|
if (game->askSave(true))
|
|
|
|
return;
|
|
|
|
game->pause();
|
|
|
|
}
|
|
|
|
|
|
|
|
filename = TQString();
|
|
|
|
|
|
|
|
editingEnded();
|
|
|
|
delete game;
|
|
|
|
game = 0;
|
|
|
|
loadedGame = TQString();
|
|
|
|
|
|
|
|
editingAction->setChecked(false);
|
|
|
|
setEditingEnabled(false);
|
|
|
|
endAction->setEnabled(false);
|
|
|
|
aboutAction->setEnabled(false);
|
|
|
|
highScoreAction->setEnabled(false);
|
|
|
|
printAction->setEnabled(false);
|
|
|
|
saveAction->setEnabled(false);
|
|
|
|
saveAsAction->setEnabled(false);
|
|
|
|
saveGameAction->setEnabled(false);
|
|
|
|
saveGameAsAction->setEnabled(false);
|
|
|
|
setHoleMovementEnabled(false);
|
|
|
|
setHoleOtherEnabled(false);
|
|
|
|
|
|
|
|
clearHoleAction->setEnabled(false);
|
|
|
|
newHoleAction->setEnabled(false);
|
|
|
|
newAction->setEnabled(true);
|
|
|
|
loadGameAction->setEnabled(true);
|
|
|
|
tutorialAction->setEnabled(true);
|
|
|
|
|
|
|
|
titleChanged(TQString());
|
|
|
|
updateModified(false);
|
|
|
|
|
|
|
|
TQTimer::singleShot(100, TQT_TQOBJECT(this), TQT_SLOT(createSpacer()));
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::createSpacer()
|
|
|
|
{
|
|
|
|
// make a player to play the spacer hole
|
|
|
|
spacerPlayers.clear();
|
|
|
|
spacerPlayers.append(Player());
|
|
|
|
spacerPlayers.last().ball()->setColor(yellow);
|
|
|
|
spacerPlayers.last().setName("player");
|
|
|
|
spacerPlayers.last().setId(1);
|
|
|
|
|
|
|
|
delete spacer;
|
|
|
|
spacer = new KolfGame(obj, &spacerPlayers, KGlobal::dirs()->findResource("appdata", "intro"), dummy);
|
|
|
|
spacer->setSound(false);
|
|
|
|
spacer->startFirstHole(1);
|
|
|
|
layout->addWidget(spacer, 0, 0, AlignCenter);
|
|
|
|
spacer->hidePutter();
|
|
|
|
spacer->ignoreEvents(true);
|
|
|
|
|
|
|
|
spacer->show();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::gameOver()
|
|
|
|
{
|
|
|
|
int curPar = 0;
|
|
|
|
int lowScore = INT_MAX; // let's hope it doesn't stay this way!
|
|
|
|
int curScore = 1;
|
|
|
|
|
|
|
|
// names of people who had the lowest score
|
|
|
|
TQStringList names;
|
|
|
|
|
|
|
|
HighScoreList highScores;
|
|
|
|
int scoreBoardIndex = 1;
|
|
|
|
|
|
|
|
while (curScore != 0)
|
|
|
|
{
|
|
|
|
TQString curName;
|
|
|
|
|
|
|
|
// name taken as a reference and filled out
|
|
|
|
curScore = scoreboard->total(scoreBoardIndex, curName);
|
|
|
|
|
|
|
|
scoreBoardIndex++;
|
|
|
|
|
|
|
|
if (curName == i18n("Par"))
|
|
|
|
{
|
|
|
|
curPar = curScore;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (curScore == 0)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
// attempt to add everybody to the highscore list
|
|
|
|
// (ignored if we aren't competing down below)
|
|
|
|
highScores.append(HighScore(curName, curScore));
|
|
|
|
|
|
|
|
if (curScore < lowScore)
|
|
|
|
{
|
|
|
|
names.clear();
|
|
|
|
lowScore = curScore;
|
|
|
|
names.append(curName);
|
|
|
|
}
|
|
|
|
else if (curScore == lowScore)
|
|
|
|
names.append(curName);
|
|
|
|
}
|
|
|
|
|
|
|
|
// only announce a winner if more than two entries
|
|
|
|
// (player and par) are on the scoreboard + one to go past end
|
|
|
|
// + 1 for koodoo
|
|
|
|
if (scoreBoardIndex > 4)
|
|
|
|
{
|
|
|
|
if (names.count() > 1)
|
|
|
|
{
|
|
|
|
TQString winners = names.join(i18n(" and "));
|
|
|
|
KMessageBox::information(this, i18n("%1 tied").arg(winners));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
KMessageBox::information(this, i18n("%1 won!").arg(names.first()));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (competition)
|
|
|
|
{
|
|
|
|
// deal with highscores
|
|
|
|
// KScoreDialog makes it very easy :-))
|
|
|
|
|
|
|
|
KScoreDialog *scoreDialog = new KScoreDialog(KScoreDialog::Name | KScoreDialog::Custom1 | KScoreDialog::Score, this);
|
|
|
|
scoreDialog->addField(KScoreDialog::Custom1, i18n("Par"), "Par");
|
|
|
|
|
|
|
|
CourseInfo courseInfo;
|
|
|
|
game->courseInfo(courseInfo, game->curFilename());
|
|
|
|
|
|
|
|
scoreDialog->setConfigGroup(courseInfo.untranslatedName + TQString(" Highscores"));
|
|
|
|
|
|
|
|
for (HighScoreList::Iterator it = highScores.begin(); it != highScores.end(); ++it)
|
|
|
|
{
|
|
|
|
KScoreDialog::FieldInfo info;
|
|
|
|
info[KScoreDialog::Name] = (*it).name;
|
|
|
|
info[KScoreDialog::Custom1] = TQString::number(curPar);
|
|
|
|
|
|
|
|
scoreDialog->addScore((*it).score, info, false, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
scoreDialog->setComment(i18n("High Scores for %1").arg(courseInfo.name));
|
|
|
|
scoreDialog->show();
|
|
|
|
}
|
|
|
|
|
|
|
|
TQTimer::singleShot(700, TQT_TQOBJECT(this), TQT_SLOT(closeGame()));
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::showHighScores()
|
|
|
|
{
|
|
|
|
KScoreDialog *scoreDialog = new KScoreDialog(KScoreDialog::Name | KScoreDialog::Custom1 | KScoreDialog::Score, this);
|
|
|
|
scoreDialog->addField(KScoreDialog::Custom1, i18n("Par"), "Par");
|
|
|
|
|
|
|
|
CourseInfo courseInfo;
|
|
|
|
game->courseInfo(courseInfo, game->curFilename());
|
|
|
|
|
|
|
|
scoreDialog->setConfigGroup(courseInfo.untranslatedName + TQString(" Highscores"));
|
|
|
|
scoreDialog->setComment(i18n("High Scores for %1").arg(courseInfo.name));
|
|
|
|
scoreDialog->show();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::save()
|
|
|
|
{
|
|
|
|
if (filename.isNull())
|
|
|
|
{
|
|
|
|
saveAs();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (game)
|
|
|
|
game->save();
|
|
|
|
|
|
|
|
game->setFocus();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::saveAs()
|
|
|
|
{
|
|
|
|
TQString newfilename = KFileDialog::getSaveFileName(":kourses", "application/x-kourse", this, i18n("Pick Kolf Course to Save To"));
|
|
|
|
if (!newfilename.isNull())
|
|
|
|
{
|
|
|
|
filename = newfilename;
|
|
|
|
game->setFilename(filename);
|
|
|
|
game->save();
|
|
|
|
game->setFocus();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::saveGameAs()
|
|
|
|
{
|
|
|
|
TQString newfilename = KFileDialog::getSaveFileName(":savedkolf", "application/x-kolf", this, i18n("Pick Saved Game to Save To"));
|
|
|
|
if (newfilename.isNull())
|
|
|
|
return;
|
|
|
|
|
|
|
|
loadedGame = newfilename;
|
|
|
|
|
|
|
|
saveGame();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::saveGame()
|
|
|
|
{
|
|
|
|
if (loadedGame.isNull())
|
|
|
|
{
|
|
|
|
saveGameAs();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
KConfig config(loadedGame);
|
|
|
|
config.setGroup("0 Saved Game");
|
|
|
|
|
|
|
|
config.writeEntry("Competition", competition);
|
|
|
|
config.writeEntry("Course", filename);
|
|
|
|
|
|
|
|
game->saveScores(&config);
|
|
|
|
|
|
|
|
config.sync();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::loadGame()
|
|
|
|
{
|
|
|
|
loadedGame = KFileDialog::getOpenFileName(":savedkolf", TQString::fromLatin1("application/x-kolf"), this, i18n("Pick Kolf Saved Game"));
|
|
|
|
|
|
|
|
if (loadedGame.isNull())
|
|
|
|
return;
|
|
|
|
|
|
|
|
isTutorial = false;
|
|
|
|
startNewGame();
|
|
|
|
}
|
|
|
|
|
|
|
|
// called by main for commmand line files
|
|
|
|
void Kolf::openURL(KURL url)
|
|
|
|
{
|
|
|
|
TQString target;
|
|
|
|
if (KIO::NetAccess::download(url, target, this))
|
|
|
|
{
|
|
|
|
isTutorial = false;
|
|
|
|
TQString mimeType = KMimeType::findByPath(target)->name();
|
|
|
|
if (mimeType == "application/x-kourse")
|
|
|
|
filename = target;
|
|
|
|
else if (mimeType == "application/x-kolf")
|
|
|
|
loadedGame = target;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
closeGame();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQTimer::singleShot(10, TQT_TQOBJECT(this), TQT_SLOT(startNewGame()));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
closeGame();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::newPlayersTurn(Player *player)
|
|
|
|
{
|
|
|
|
tempStatusBarText = i18n("%1's turn").arg(player->name());
|
|
|
|
|
|
|
|
if (showInfoAction->isChecked())
|
|
|
|
statusBar()->message(tempStatusBarText, 5 * 1000);
|
|
|
|
else
|
|
|
|
statusBar()->message(tempStatusBarText);
|
|
|
|
|
|
|
|
scoreboard->setCurrentCell(player->id() - 1, game->currentHole() - 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::newStatusText(const TQString &text)
|
|
|
|
{
|
|
|
|
if (text.isEmpty())
|
|
|
|
statusBar()->message(tempStatusBarText);
|
|
|
|
else
|
|
|
|
statusBar()->message(text);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::editingStarted()
|
|
|
|
{
|
|
|
|
delete editor;
|
|
|
|
editor = new Editor(obj, dummy, "Editor");
|
|
|
|
connect(editor, TQT_SIGNAL(addNewItem(Object *)), game, TQT_SLOT(addNewObject(Object *)));
|
|
|
|
connect(editor, TQT_SIGNAL(changed()), game, TQT_SLOT(setModified()));
|
|
|
|
connect(editor, TQT_SIGNAL(addNewItem(Object *)), TQT_TQOBJECT(this), TQT_SLOT(setHoleFocus()));
|
|
|
|
connect(game, TQT_SIGNAL(newSelectedItem(CanvasItem *)), editor, TQT_SLOT(setItem(CanvasItem *)));
|
|
|
|
|
|
|
|
scoreboard->hide();
|
|
|
|
|
|
|
|
layout->addWidget(editor, 1, 0);
|
|
|
|
editor->show();
|
|
|
|
|
|
|
|
clearHoleAction->setEnabled(true);
|
|
|
|
newHoleAction->setEnabled(true);
|
|
|
|
setHoleOtherEnabled(false);
|
|
|
|
|
|
|
|
game->setFocus();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::editingEnded()
|
|
|
|
{
|
|
|
|
delete editor;
|
|
|
|
editor = 0;
|
|
|
|
|
|
|
|
if (scoreboard)
|
|
|
|
scoreboard->show();
|
|
|
|
|
|
|
|
clearHoleAction->setEnabled(false);
|
|
|
|
newHoleAction->setEnabled(false);
|
|
|
|
setHoleOtherEnabled(true);
|
|
|
|
|
|
|
|
if (game)
|
|
|
|
game->setFocus();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::inPlayStart()
|
|
|
|
{
|
|
|
|
setEditingEnabled(false);
|
|
|
|
setHoleOtherEnabled(false);
|
|
|
|
setHoleMovementEnabled(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::inPlayEnd()
|
|
|
|
{
|
|
|
|
setEditingEnabled(true);
|
|
|
|
setHoleOtherEnabled(true);
|
|
|
|
setHoleMovementEnabled(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::maxStrokesReached(const TQString &name)
|
|
|
|
{
|
|
|
|
KMessageBox::sorry(this, i18n("%1's score has reached the maximum for this hole.").arg(name));
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::updateHoleMenu(int largest)
|
|
|
|
{
|
|
|
|
TQStringList items;
|
|
|
|
for (int i = 1; i <= largest; ++i)
|
|
|
|
items.append(TQString::number(i));
|
|
|
|
|
|
|
|
// setItems for some reason enables the action
|
|
|
|
bool shouldbe = holeAction->isEnabled();
|
|
|
|
holeAction->setItems(items);
|
|
|
|
holeAction->setEnabled(shouldbe);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::setHoleMovementEnabled(bool yes)
|
|
|
|
{
|
|
|
|
if (competition)
|
|
|
|
yes = false;
|
|
|
|
|
|
|
|
holeAction->setEnabled(yes);
|
|
|
|
|
|
|
|
nextAction->setEnabled(yes);
|
|
|
|
prevAction->setEnabled(yes);
|
|
|
|
firstAction->setEnabled(yes);
|
|
|
|
lastAction->setEnabled(yes);
|
|
|
|
randAction->setEnabled(yes);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::setHoleOtherEnabled(bool yes)
|
|
|
|
{
|
|
|
|
if (competition)
|
|
|
|
yes = false;
|
|
|
|
|
|
|
|
resetHoleAction->setEnabled(yes);
|
|
|
|
undoShotAction->setEnabled(yes);
|
|
|
|
//replayShotAction->setEnabled(yes);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::setEditingEnabled(bool yes)
|
|
|
|
{
|
|
|
|
editingAction->setEnabled(competition? false : yes);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::checkEditing()
|
|
|
|
{
|
|
|
|
editingAction->setChecked(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::print()
|
|
|
|
{
|
|
|
|
KPrinter pr;
|
|
|
|
pr.addDialogPage(new PrintDialogPage());
|
|
|
|
|
|
|
|
if (pr.setup(this, i18n("Print %1 - Hole %2").arg(game->courseName()).arg(game->currentHole())))
|
|
|
|
{
|
|
|
|
pr.newPage();
|
|
|
|
if (game)
|
|
|
|
game->print(pr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::updateModified(bool mod)
|
|
|
|
{
|
|
|
|
courseModified = mod;
|
|
|
|
titleChanged(title);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::titleChanged(const TQString &newTitle)
|
|
|
|
{
|
|
|
|
title = newTitle;
|
|
|
|
setCaption(title, courseModified);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::useMouseChanged(bool yes)
|
|
|
|
{
|
|
|
|
KConfig *config = kapp->config(); config->setGroup("Settings"); config->writeEntry("useMouse", yes); config->sync();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::useAdvancedPuttingChanged(bool yes)
|
|
|
|
{
|
|
|
|
KConfig *config = kapp->config(); config->setGroup("Settings"); config->writeEntry("useAdvancedPutting", yes); config->sync();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::showInfoChanged(bool yes)
|
|
|
|
{
|
|
|
|
KConfig *config = kapp->config(); config->setGroup("Settings"); config->writeEntry("showInfo", yes); config->sync();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::showGuideLineChanged(bool yes)
|
|
|
|
{
|
|
|
|
KConfig *config = kapp->config(); config->setGroup("Settings"); config->writeEntry("showGuideLine", yes); config->sync();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::soundChanged(bool yes)
|
|
|
|
{
|
|
|
|
KConfig *config = kapp->config(); config->setGroup("Settings"); config->writeEntry("sound", yes); config->sync();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::initPlugins()
|
|
|
|
{
|
|
|
|
//kdDebug(12007) << "initPlugins" << endl;
|
|
|
|
if (game)
|
|
|
|
game->pause();
|
|
|
|
|
|
|
|
obj->setAutoDelete(true);
|
|
|
|
obj->clear();
|
|
|
|
plugins.setAutoDelete(false);
|
|
|
|
plugins.clear();
|
|
|
|
|
|
|
|
// add prefab objects
|
|
|
|
obj->append(new SlopeObj());
|
|
|
|
obj->append(new PuddleObj());
|
|
|
|
obj->append(new WallObj());
|
|
|
|
obj->append(new CupObj());
|
|
|
|
obj->append(new SandObj());
|
|
|
|
obj->append(new WindmillObj());
|
|
|
|
obj->append(new BlackHoleObj());
|
|
|
|
obj->append(new FloaterObj());
|
|
|
|
obj->append(new BridgeObj());
|
|
|
|
obj->append(new SignObj());
|
|
|
|
obj->append(new BumperObj());
|
|
|
|
|
|
|
|
ObjectList *other = PluginLoader::loadAll();
|
|
|
|
Object *object = 0;
|
|
|
|
for (object = other->first(); object; object = other->next())
|
|
|
|
{
|
|
|
|
obj->append(object);
|
|
|
|
plugins.append(object);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (game)
|
|
|
|
{
|
|
|
|
game->setObjects(obj);
|
|
|
|
game->unPause();
|
|
|
|
}
|
|
|
|
|
|
|
|
//kdDebug(12007) << "end of initPlugins" << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::showPlugins()
|
|
|
|
{
|
|
|
|
TQString text = TQString("<h2>%1</h2><ol>").arg(i18n("Currently Loaded Plugins"));
|
|
|
|
Object *object = 0;
|
|
|
|
for (object = plugins.first(); object; object = plugins.next())
|
|
|
|
{
|
|
|
|
text.append("<li>");
|
|
|
|
text.append(object->name());
|
|
|
|
text.append(" - ");
|
|
|
|
text.append(i18n("by %1").arg(object->author()));
|
|
|
|
text.append("</li>");
|
|
|
|
}
|
|
|
|
text.append("</ol>");
|
|
|
|
KMessageBox::information(this, text, i18n("Plugins"));
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::enableAllMessages()
|
|
|
|
{
|
|
|
|
KMessageBox::enableAllMessages();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Kolf::setCurrentHole(int hole)
|
|
|
|
{
|
|
|
|
if (!holeAction)
|
|
|
|
return;
|
|
|
|
// Golf is 1-based, KListAction is 0-based
|
|
|
|
holeAction->setCurrentItem(hole - 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "kolf.moc"
|