|
|
|
|
/*
|
|
|
|
|
* Copyright (C) 2003 Ian Wadham and Marco Kr<EFBFBD>ger <ianw2@optusnet.com.au>
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <kprinter.h>
|
|
|
|
|
#include <tqpainter.h>
|
|
|
|
|
#include <tqpaintdevicemetrics.h>
|
|
|
|
|
|
|
|
|
|
#include <kglobal.h>
|
|
|
|
|
#include <klocale.h>
|
|
|
|
|
#include <kiconloader.h>
|
|
|
|
|
#include <kmenubar.h>
|
|
|
|
|
#include <kstatusbar.h>
|
|
|
|
|
#include <kkeydialog.h>
|
|
|
|
|
#include <kaccel.h>
|
|
|
|
|
#include <kio/netaccess.h>
|
|
|
|
|
#include <kfiledialog.h>
|
|
|
|
|
#include <kconfig.h>
|
|
|
|
|
|
|
|
|
|
#include <kedittoolbar.h>
|
|
|
|
|
#include <ktoolbar.h>
|
|
|
|
|
|
|
|
|
|
#include <kstdaccel.h>
|
|
|
|
|
#include <kaction.h>
|
|
|
|
|
#include <kstdaction.h>
|
|
|
|
|
#include <kstdgameaction.h>
|
|
|
|
|
|
|
|
|
|
#include "kgrconsts.h"
|
|
|
|
|
#include "kgrobject.h"
|
|
|
|
|
#include "kgrfigure.h"
|
|
|
|
|
#include "kgrcanvas.h"
|
|
|
|
|
#include "kgrdialog.h"
|
|
|
|
|
#include "kgrgame.h"
|
|
|
|
|
#include "kgoldrunner.h"
|
|
|
|
|
|
|
|
|
|
KGoldrunner::KGoldrunner()
|
|
|
|
|
: KMainWindow (0, "KGoldrunner"),
|
|
|
|
|
view (new KGrCanvas (this))
|
|
|
|
|
{
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/************* FIND WHERE THE GAMES DATA AND HANDBOOK SHOULD BE *************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Avoid "saveOK()" check if an error-exit occurs during the file checks.
|
|
|
|
|
startupOK = TRUE;
|
|
|
|
|
|
|
|
|
|
// Get directory paths for the system levels, user levels and manual.
|
|
|
|
|
if (! getDirectories()) {
|
|
|
|
|
fprintf (stderr, "getDirectories() FAILED\n");
|
|
|
|
|
startupOK = FALSE;
|
|
|
|
|
return; // If games directory not found, abort.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This message is to help diagnose distribution or installation problems.
|
|
|
|
|
printf
|
|
|
|
|
("The games data and handbook should be in the following locations:\n");
|
|
|
|
|
printf ("System games: %s\nUser data: %s\nHandbook: %s\n",
|
|
|
|
|
systemDataDir.myStr(), userDataDir.myStr(), systemHTMLDir.myStr());
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/************************ SET PLAYFIELD AND GAME DATA ***********************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
game = new KGrGame (view, systemDataDir, userDataDir);
|
|
|
|
|
|
|
|
|
|
// Initialise the collections of levels (i.e. the list of games).
|
|
|
|
|
if (! game->initCollections()) {
|
|
|
|
|
startupOK = FALSE;
|
|
|
|
|
return; // If no game files, abort.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
hero = game->getHero(); // Get a pointer to the hero.
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/************************* SET UP THE USER INTERFACE ************************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Get catalog for translation
|
|
|
|
|
KGlobal::locale()->insertCatalogue("libtdegames");
|
|
|
|
|
|
|
|
|
|
// Tell the KMainWindow that this is the main widget
|
|
|
|
|
setCentralWidget (view);
|
|
|
|
|
|
|
|
|
|
// Set up our actions (menu, toolbar and keystrokes) ...
|
|
|
|
|
setupActions();
|
|
|
|
|
|
|
|
|
|
// and a status bar.
|
|
|
|
|
initStatusBar();
|
|
|
|
|
|
|
|
|
|
// Connect the game actions to the menu and toolbar displays.
|
|
|
|
|
connect(game, TQT_SIGNAL (setEditMenu (bool)), TQT_SLOT (setEditMenu (bool)));
|
|
|
|
|
connect(game, TQT_SIGNAL (markRuleType (char)), TQT_SLOT (markRuleType (char)));
|
|
|
|
|
connect(game, TQT_SIGNAL (hintAvailable(bool)), TQT_SLOT (adjustHintAction(bool)));
|
|
|
|
|
connect(game, TQT_SIGNAL (defaultEditObj()), TQT_SLOT (defaultEditObj()));
|
|
|
|
|
|
|
|
|
|
// Apply the saved mainwindow settings, if any, and ask the mainwindow
|
|
|
|
|
// to automatically save settings if changed: window size, toolbar
|
|
|
|
|
// position, icon size, etc.
|
|
|
|
|
setAutoSaveSettings();
|
|
|
|
|
|
|
|
|
|
#ifdef QT3
|
|
|
|
|
// Base size of playing-area and widgets on the monitor resolution.
|
|
|
|
|
int dw = KApplication::desktop()->width();
|
|
|
|
|
if (dw > 800) { // More than 800x600.
|
|
|
|
|
view->changeSize (+1); // Scale 1.25:1.
|
|
|
|
|
}
|
|
|
|
|
if (dw > 1024) { // More than 1024x768.
|
|
|
|
|
view->changeSize (+1);
|
|
|
|
|
view->changeSize (+1); // Scale 1.75:1.
|
|
|
|
|
setUsesBigPixmaps (TRUE); // Use big toolbar buttons.
|
|
|
|
|
}
|
|
|
|
|
view->setBaseScale(); // Set scale for level-names.
|
|
|
|
|
#endif
|
|
|
|
|
setFixedSize (view->size());
|
|
|
|
|
|
|
|
|
|
makeEditToolbar(); // Uses pixmaps from "view".
|
|
|
|
|
editToolbar->hide();
|
|
|
|
|
setDockEnabled (DockBottom, FALSE);
|
|
|
|
|
setDockEnabled (DockLeft, FALSE);
|
|
|
|
|
setDockEnabled (DockRight, FALSE);
|
|
|
|
|
|
|
|
|
|
// Make it impossible to turn off the editor toolbar.
|
|
|
|
|
// Accidentally hiding it would make editing impossible.
|
|
|
|
|
setDockMenuEnabled (FALSE);
|
|
|
|
|
|
|
|
|
|
// Set mouse control of the hero as the default.
|
|
|
|
|
game->setMouseMode (TRUE);
|
|
|
|
|
|
|
|
|
|
// Paint the main widget (title, menu, status bar, blank playfield).
|
|
|
|
|
show();
|
|
|
|
|
|
|
|
|
|
// Force the main widget to appear before the "Start Game" dialog does.
|
|
|
|
|
tqApp->processEvents();
|
|
|
|
|
|
|
|
|
|
// Call the "Start Game" function and pop up the "Start Game" dialog.
|
|
|
|
|
game->startLevelOne();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
KGoldrunner::~KGoldrunner()
|
|
|
|
|
{
|
|
|
|
|
delete editToolbar;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::setupActions()
|
|
|
|
|
{
|
|
|
|
|
/**************************************************************************/
|
|
|
|
|
/****************************** GAME MENU ******************************/
|
|
|
|
|
/**************************************************************************/
|
|
|
|
|
|
|
|
|
|
// New Game...
|
|
|
|
|
// Load Saved Game...
|
|
|
|
|
// Play Any Level...
|
|
|
|
|
// Play Next Level...
|
|
|
|
|
// Tutorial
|
|
|
|
|
// --------------------------
|
|
|
|
|
|
|
|
|
|
KAction * newAction = KStdGameAction::
|
|
|
|
|
gameNew (
|
|
|
|
|
game,
|
|
|
|
|
TQT_SLOT(startLevelOne()), actionCollection());
|
|
|
|
|
newAction-> setText (i18n("&New Game..."));
|
|
|
|
|
KAction * loadGame = KStdGameAction::
|
|
|
|
|
load (
|
|
|
|
|
game, TQT_SLOT(loadGame()), actionCollection());
|
|
|
|
|
loadGame-> setText (i18n("&Load Saved Game..."));
|
|
|
|
|
(void) new KAction (
|
|
|
|
|
i18n("&Play Any Level..."),
|
|
|
|
|
0,
|
|
|
|
|
game, TQT_SLOT(startAnyLevel()), actionCollection(),
|
|
|
|
|
"play_any");
|
|
|
|
|
(void) new KAction (
|
|
|
|
|
i18n("Play &Next Level..."),
|
|
|
|
|
0,
|
|
|
|
|
game,
|
|
|
|
|
TQT_SLOT(startNextLevel()), actionCollection(),
|
|
|
|
|
"play_next");
|
|
|
|
|
|
|
|
|
|
// Save Game...
|
|
|
|
|
// Save Edits... (extra copy)
|
|
|
|
|
// --------------------------
|
|
|
|
|
|
|
|
|
|
saveGame = KStdGameAction::
|
|
|
|
|
save (
|
|
|
|
|
game, TQT_SLOT(saveGame()), actionCollection());
|
|
|
|
|
saveGame-> setText (i18n("&Save Game..."));
|
|
|
|
|
saveGame-> setShortcut (Key_S); // Alternate key.
|
|
|
|
|
|
|
|
|
|
// Pause
|
|
|
|
|
// Show High Scores
|
|
|
|
|
// Get a Hint
|
|
|
|
|
// Kill the Hero
|
|
|
|
|
// --------------------------
|
|
|
|
|
|
|
|
|
|
myPause = KStdGameAction::
|
|
|
|
|
pause (
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(stopStart()), actionCollection());
|
|
|
|
|
myPause-> setShortcut (Key_Escape); // Alternate key.
|
|
|
|
|
highScore = KStdGameAction::
|
|
|
|
|
highscores (
|
|
|
|
|
game, TQT_SLOT(showHighScores()), actionCollection());
|
|
|
|
|
hintAction = new KAction (
|
|
|
|
|
i18n("&Get Hint"), "ktip",
|
|
|
|
|
0,
|
|
|
|
|
game, TQT_SLOT(showHint()), actionCollection(),
|
|
|
|
|
"get_hint");
|
|
|
|
|
killHero = new KAction (
|
|
|
|
|
i18n("&Kill Hero"),
|
|
|
|
|
Key_Q,
|
|
|
|
|
game, TQT_SLOT(herosDead()), actionCollection(),
|
|
|
|
|
"kill_hero");
|
|
|
|
|
|
|
|
|
|
// Quit
|
|
|
|
|
// --------------------------
|
|
|
|
|
|
|
|
|
|
(void) KStdGameAction::
|
|
|
|
|
quit (
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(close()), actionCollection());
|
|
|
|
|
|
|
|
|
|
/**************************************************************************/
|
|
|
|
|
/*************************** GAME EDITOR MENU **************************/
|
|
|
|
|
/**************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Create a Level
|
|
|
|
|
// Edit Any Level...
|
|
|
|
|
// Edit Next Level...
|
|
|
|
|
// --------------------------
|
|
|
|
|
|
|
|
|
|
(void) new KAction (
|
|
|
|
|
i18n("&Create Level"),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(game), TQT_SLOT(createLevel()), actionCollection(),
|
|
|
|
|
"create");
|
|
|
|
|
(void) new KAction (
|
|
|
|
|
i18n("&Edit Any Level..."),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(game), TQT_SLOT(updateLevel()), actionCollection(),
|
|
|
|
|
"edit_any");
|
|
|
|
|
(void) new KAction (
|
|
|
|
|
i18n("Edit &Next Level..."),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(game), TQT_SLOT(updateNext()), actionCollection(),
|
|
|
|
|
"edit_next");
|
|
|
|
|
|
|
|
|
|
// Save Edits...
|
|
|
|
|
// Move Level...
|
|
|
|
|
// Delete Level...
|
|
|
|
|
// --------------------------
|
|
|
|
|
|
|
|
|
|
saveEdits = new KAction (
|
|
|
|
|
i18n("&Save Edits..."),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(game), TQT_SLOT(saveLevelFile()), actionCollection(),
|
|
|
|
|
"save_edits");
|
|
|
|
|
saveEdits->setEnabled (FALSE); // Nothing to save, yet.
|
|
|
|
|
|
|
|
|
|
(void) new KAction (
|
|
|
|
|
i18n("&Move Level..."),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(game), TQT_SLOT(moveLevelFile()), actionCollection(),
|
|
|
|
|
"move_level");
|
|
|
|
|
(void) new KAction (
|
|
|
|
|
i18n("&Delete Level..."),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(game),
|
|
|
|
|
TQT_SLOT(deleteLevelFile()), actionCollection(),
|
|
|
|
|
"delete_level");
|
|
|
|
|
|
|
|
|
|
// Create a Game
|
|
|
|
|
// Edit Game Info...
|
|
|
|
|
// --------------------------
|
|
|
|
|
|
|
|
|
|
(void) new KAction (
|
|
|
|
|
i18n("Create Game..."),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(createGame()), actionCollection(),
|
|
|
|
|
"create_game");
|
|
|
|
|
(void) new KAction (
|
|
|
|
|
i18n("Edit Game Info..."),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(this),
|
|
|
|
|
TQT_SLOT(editGameInfo()), actionCollection(),
|
|
|
|
|
"edit_game");
|
|
|
|
|
|
|
|
|
|
/**************************************************************************/
|
|
|
|
|
/*************************** LANDSCAPES MENU ***************************/
|
|
|
|
|
/**************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Default shortcut keys are set by "kgoldrunnerui.rc".
|
|
|
|
|
|
|
|
|
|
setKGoldrunner = new KRadioAction (
|
|
|
|
|
"K&Goldrunner",
|
|
|
|
|
0, // Default Shift+G
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(lsKGoldrunner()), actionCollection(),
|
|
|
|
|
"kgoldrunner");
|
|
|
|
|
setAppleII = new KRadioAction (
|
|
|
|
|
"&Apple II",
|
|
|
|
|
0, // Default Shift+A
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(lsApple2()), actionCollection(),
|
|
|
|
|
"apple_2");
|
|
|
|
|
setIceCave = new KRadioAction (
|
|
|
|
|
i18n("&Ice Cave"),
|
|
|
|
|
0, // Default Shift+I
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(lsIceCave()), actionCollection(),
|
|
|
|
|
"ice_cave");
|
|
|
|
|
setMidnight = new KRadioAction (
|
|
|
|
|
i18n("&Midnight"),
|
|
|
|
|
0, // Default Shift+M
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(lsMidnight()), actionCollection(),
|
|
|
|
|
"midnight");
|
|
|
|
|
setKDEKool = new KRadioAction (
|
|
|
|
|
i18n("&KDE Kool"),
|
|
|
|
|
0, // Default Shift+K
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(lsKDEKool()), actionCollection(),
|
|
|
|
|
"kde_kool");
|
|
|
|
|
|
|
|
|
|
setKGoldrunner-> setExclusiveGroup ("landscapes");
|
|
|
|
|
setAppleII-> setExclusiveGroup ("landscapes");
|
|
|
|
|
setIceCave-> setExclusiveGroup ("landscapes");
|
|
|
|
|
setMidnight-> setExclusiveGroup ("landscapes");
|
|
|
|
|
setKDEKool-> setExclusiveGroup ("landscapes");
|
|
|
|
|
setKGoldrunner-> setChecked (TRUE);
|
|
|
|
|
|
|
|
|
|
/**************************************************************************/
|
|
|
|
|
/**************************** SETTINGS MENU ****************************/
|
|
|
|
|
/**************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Mouse Controls Hero
|
|
|
|
|
// Keyboard Controls Hero
|
|
|
|
|
// --------------------------
|
|
|
|
|
|
|
|
|
|
setMouse = new KRadioAction (
|
|
|
|
|
i18n("&Mouse Controls Hero"),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(this),
|
|
|
|
|
TQT_SLOT(setMouseMode()), actionCollection(),
|
|
|
|
|
"mouse_mode");
|
|
|
|
|
setKeyboard = new KRadioAction (
|
|
|
|
|
i18n("&Keyboard Controls Hero"),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(this),
|
|
|
|
|
TQT_SLOT(setKeyBoardMode()), actionCollection(),
|
|
|
|
|
"keyboard_mode");
|
|
|
|
|
|
|
|
|
|
setMouse-> setExclusiveGroup ("control");
|
|
|
|
|
setKeyboard-> setExclusiveGroup ("control");
|
|
|
|
|
setMouse-> setChecked (TRUE);
|
|
|
|
|
|
|
|
|
|
// Normal Speed
|
|
|
|
|
// Beginner Speed
|
|
|
|
|
// Champion Speed
|
|
|
|
|
// Increase Speed
|
|
|
|
|
// Decrease Speed
|
|
|
|
|
// --------------------------
|
|
|
|
|
|
|
|
|
|
KRadioAction * nSpeed = new KRadioAction (
|
|
|
|
|
i18n("Normal Speed"),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(normalSpeed()), actionCollection(),
|
|
|
|
|
"normal_speed");
|
|
|
|
|
KRadioAction * bSpeed = new KRadioAction (
|
|
|
|
|
i18n("Beginner Speed"),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(beginSpeed()), actionCollection(),
|
|
|
|
|
"beginner_speed");
|
|
|
|
|
KRadioAction * cSpeed = new KRadioAction (
|
|
|
|
|
i18n("Champion Speed"),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(champSpeed()), actionCollection(),
|
|
|
|
|
"champion_speed");
|
|
|
|
|
(void) new KAction ( // Repeatable action.
|
|
|
|
|
i18n("Increase Speed"),
|
|
|
|
|
Key_Plus,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(incSpeed()), actionCollection(),
|
|
|
|
|
"increase_speed");
|
|
|
|
|
(void) new KAction ( // Repeatable action.
|
|
|
|
|
i18n("Decrease Speed"),
|
|
|
|
|
Key_Minus,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(decSpeed()), actionCollection(),
|
|
|
|
|
"decrease_speed");
|
|
|
|
|
|
|
|
|
|
nSpeed-> setExclusiveGroup ("speed");
|
|
|
|
|
bSpeed-> setExclusiveGroup ("speed");
|
|
|
|
|
cSpeed-> setExclusiveGroup ("speed");
|
|
|
|
|
nSpeed-> setChecked (TRUE);
|
|
|
|
|
|
|
|
|
|
// Traditional Rules
|
|
|
|
|
// KGoldrunner Rules
|
|
|
|
|
// --------------------------
|
|
|
|
|
|
|
|
|
|
tradRules = new KRadioAction (
|
|
|
|
|
i18n("&Traditional Rules"),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(setTradRules()), actionCollection(),
|
|
|
|
|
"trad_rules");
|
|
|
|
|
kgrRules = new KRadioAction (
|
|
|
|
|
i18n("K&Goldrunner Rules"),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(setKGrRules()), actionCollection(),
|
|
|
|
|
"kgr_rules");
|
|
|
|
|
|
|
|
|
|
tradRules-> setExclusiveGroup ("rules");
|
|
|
|
|
kgrRules-> setExclusiveGroup ("rules");
|
|
|
|
|
tradRules-> setChecked (TRUE);
|
|
|
|
|
|
|
|
|
|
// Larger Playing Area
|
|
|
|
|
// Smaller Playing Area
|
|
|
|
|
// --------------------------
|
|
|
|
|
|
|
|
|
|
(void) new KAction (
|
|
|
|
|
i18n("Larger Playing Area"),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(makeLarger()), actionCollection(),
|
|
|
|
|
"larger_area");
|
|
|
|
|
(void) new KAction (
|
|
|
|
|
i18n("Smaller Playing Area"),
|
|
|
|
|
0,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(makeSmaller()), actionCollection(),
|
|
|
|
|
"smaller_area");
|
|
|
|
|
|
|
|
|
|
// Configure Shortcuts...
|
|
|
|
|
// Configure Toolbars...
|
|
|
|
|
// --------------------------
|
|
|
|
|
|
|
|
|
|
KStdAction::keyBindings (
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(optionsConfigureKeys()),
|
|
|
|
|
actionCollection());
|
|
|
|
|
// KStdAction::configureToolbars (
|
|
|
|
|
// this, TQT_SLOT(optionsConfigureToolbars()),
|
|
|
|
|
// actionCollection());
|
|
|
|
|
|
|
|
|
|
/**************************************************************************/
|
|
|
|
|
/************************** KEYSTROKE ACTIONS **************************/
|
|
|
|
|
/**************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Two-handed KB controls and alternate one-handed controls for the hero.
|
|
|
|
|
|
|
|
|
|
(void) new KAction (i18n("Move Up"), Key_Up,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(goUp()), actionCollection(), "move_up");
|
|
|
|
|
(void) new KAction (i18n("Move Right"), Key_Right,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(goR()), actionCollection(), "move_right");
|
|
|
|
|
(void) new KAction (i18n("Move Down"), Key_Down,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(goDown()), actionCollection(), "move_down");
|
|
|
|
|
(void) new KAction (i18n("Move Left"), Key_Left,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(goL()), actionCollection(), "move_left");
|
|
|
|
|
(void) new KAction (i18n("Stop"), Key_Space,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(stop()), actionCollection(), "stop");
|
|
|
|
|
(void) new KAction (i18n("Dig Right"), Key_C,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(digR()), actionCollection(), "dig_right");
|
|
|
|
|
(void) new KAction (i18n("Dig Left"), Key_Z,
|
|
|
|
|
TQT_TQOBJECT(this), TQT_SLOT(digL()), actionCollection(), "dig_left");
|
|
|
|
|
|
|
|
|
|
// Alternate one-handed controls. Set up in "kgoldrunnerui.rc".
|
|
|
|
|
|
|
|
|
|
// Key_I, "move_up"
|
|
|
|
|
// Key_L, "move_right"
|
|
|
|
|
// Key_K, "move_down"
|
|
|
|
|
// Key_J, "move_left"
|
|
|
|
|
// Key_Space, "stop" (as above)
|
|
|
|
|
// Key_O, "dig_right"
|
|
|
|
|
// Key_U, "dig_left"
|
|
|
|
|
|
|
|
|
|
#ifdef KGR_DEBUG
|
|
|
|
|
// Authors' debugging aids.
|
|
|
|
|
|
|
|
|
|
(void) new KAction (i18n("Step"), Key_Period,
|
|
|
|
|
game, TQT_SLOT(doStep()), actionCollection(), "do_step");
|
|
|
|
|
(void) new KAction (i18n("Test Bug Fix"), Key_B,
|
|
|
|
|
game, TQT_SLOT(bugFix()), actionCollection(), "bug_fix");
|
|
|
|
|
(void) new KAction (i18n("Show Positions"), Key_D,
|
|
|
|
|
game, TQT_SLOT(showFigurePositions()), actionCollection(), "step");
|
|
|
|
|
(void) new KAction (i18n("Start Logging"), Key_G,
|
|
|
|
|
game, TQT_SLOT(startLogging()), actionCollection(), "logging");
|
|
|
|
|
(void) new KAction (i18n("Show Hero"), Key_H,
|
|
|
|
|
game, TQT_SLOT(showHeroState()), actionCollection(), "show_hero");
|
|
|
|
|
(void) new KAction (i18n("Show Object"), Key_Question,
|
|
|
|
|
game, TQT_SLOT(showObjectState()), actionCollection(), "show_obj");
|
|
|
|
|
(void) new KAction (i18n("Show Enemy") + "0", Key_0,
|
|
|
|
|
this, TQT_SLOT(showEnemy0()), actionCollection(), "show_enemy_0");
|
|
|
|
|
(void) new KAction (i18n("Show Enemy") + "1", Key_1,
|
|
|
|
|
this, TQT_SLOT(showEnemy1()), actionCollection(), "show_enemy_1");
|
|
|
|
|
(void) new KAction (i18n("Show Enemy") + "2", Key_2,
|
|
|
|
|
this, TQT_SLOT(showEnemy2()), actionCollection(), "show_enemy_2");
|
|
|
|
|
(void) new KAction (i18n("Show Enemy") + "3", Key_3,
|
|
|
|
|
this, TQT_SLOT(showEnemy3()), actionCollection(), "show_enemy_3");
|
|
|
|
|
(void) new KAction (i18n("Show Enemy") + "4", Key_4,
|
|
|
|
|
this, TQT_SLOT(showEnemy4()), actionCollection(), "show_enemy_4");
|
|
|
|
|
(void) new KAction (i18n("Show Enemy") + "5", Key_5,
|
|
|
|
|
this, TQT_SLOT(showEnemy5()), actionCollection(), "show_enemy_5");
|
|
|
|
|
(void) new KAction (i18n("Show Enemy") + "6", Key_6,
|
|
|
|
|
this, TQT_SLOT(showEnemy6()), actionCollection(), "show_enemy_6");
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/**************************************************************************/
|
|
|
|
|
/************************** NOW SET IT ALL UP **************************/
|
|
|
|
|
/**************************************************************************/
|
|
|
|
|
|
|
|
|
|
createGUI();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/********************** SLOTS FOR STATUS BAR UPDATES ************************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::initStatusBar()
|
|
|
|
|
{
|
|
|
|
|
TQString s = statusBar()->fontInfo().family(); // Set bold font.
|
|
|
|
|
int i = statusBar()->fontInfo().pointSize();
|
|
|
|
|
statusBar()->setFont (TQFont (s, i, TQFont::Bold));
|
|
|
|
|
|
|
|
|
|
statusBar()->setSizeGripEnabled (FALSE); // Use Settings menu ...
|
|
|
|
|
|
|
|
|
|
statusBar()->insertItem ("", ID_LIVES);
|
|
|
|
|
statusBar()->insertItem ("", ID_SCORE);
|
|
|
|
|
statusBar()->insertItem ("", ID_LEVEL);
|
|
|
|
|
statusBar()->insertItem ("", ID_HINTAVL);
|
|
|
|
|
statusBar()->insertItem ("", ID_MSG, TQSizePolicy::Horizontally);
|
|
|
|
|
|
|
|
|
|
showLives (5); // Start with 5 lives.
|
|
|
|
|
showScore (0);
|
|
|
|
|
showLevel (0);
|
|
|
|
|
adjustHintAction (FALSE);
|
|
|
|
|
|
|
|
|
|
// Set the PAUSE/RESUME key-names into the status bar message.
|
|
|
|
|
pauseKeys = myPause->shortcut().toString();
|
|
|
|
|
pauseKeys = pauseKeys.replace (';', "\" " + i18n("or") + " \"");
|
|
|
|
|
gameFreeze (FALSE);
|
|
|
|
|
|
|
|
|
|
statusBar()->setItemFixed (ID_LIVES, -1); // Fix current sizes.
|
|
|
|
|
statusBar()->setItemFixed (ID_SCORE, -1);
|
|
|
|
|
statusBar()->setItemFixed (ID_LEVEL, -1);
|
|
|
|
|
|
|
|
|
|
connect(game, TQT_SIGNAL (showLives (long)), TQT_SLOT (showLives (long)));
|
|
|
|
|
connect(game, TQT_SIGNAL (showScore (long)), TQT_SLOT (showScore (long)));
|
|
|
|
|
connect(game, TQT_SIGNAL (showLevel (int)), TQT_SLOT (showLevel (int)));
|
|
|
|
|
connect(game, TQT_SIGNAL (gameFreeze (bool)), TQT_SLOT (gameFreeze (bool)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::showLives (long newLives)
|
|
|
|
|
{
|
|
|
|
|
TQString tmp;
|
|
|
|
|
tmp.setNum (newLives);
|
|
|
|
|
if (newLives < 100)
|
|
|
|
|
tmp = tmp.rightJustify (3, '0');
|
|
|
|
|
tmp.insert (0, i18n(" Lives: "));
|
|
|
|
|
tmp.append (" ");
|
|
|
|
|
statusBar()->changeItem (tmp, ID_LIVES);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::showScore (long newScore)
|
|
|
|
|
{
|
|
|
|
|
TQString tmp;
|
|
|
|
|
tmp.setNum (newScore);
|
|
|
|
|
if (newScore < 10000)
|
|
|
|
|
tmp = tmp.rightJustify (5, '0');
|
|
|
|
|
tmp.insert (0, i18n(" Score: "));
|
|
|
|
|
tmp.append (" ");
|
|
|
|
|
statusBar()->changeItem (tmp, ID_SCORE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::showLevel (int newLevelNo)
|
|
|
|
|
{
|
|
|
|
|
TQString tmp;
|
|
|
|
|
tmp.setNum (newLevelNo);
|
|
|
|
|
if (newLevelNo < 100)
|
|
|
|
|
tmp = tmp.rightJustify (3, '0');
|
|
|
|
|
tmp.insert (0, i18n(" Level: "));
|
|
|
|
|
tmp.append (" ");
|
|
|
|
|
statusBar()->changeItem (tmp, ID_LEVEL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::gameFreeze (bool on_off)
|
|
|
|
|
{
|
|
|
|
|
if (on_off)
|
|
|
|
|
statusBar()->changeItem
|
|
|
|
|
(i18n("Press \"%1\" to RESUME").tqarg(pauseKeys), ID_MSG);
|
|
|
|
|
else
|
|
|
|
|
statusBar()->changeItem
|
|
|
|
|
(i18n("Press \"%1\" to PAUSE").tqarg(pauseKeys), ID_MSG);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::adjustHintAction (bool hintAvailable)
|
|
|
|
|
{
|
|
|
|
|
hintAction->setEnabled (hintAvailable);
|
|
|
|
|
|
|
|
|
|
if (hintAvailable) {
|
|
|
|
|
statusBar()->changeItem (i18n(" Has hint "), ID_HINTAVL);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
statusBar()->changeItem (i18n(" No hint "), ID_HINTAVL);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::markRuleType (char ruleType)
|
|
|
|
|
{
|
|
|
|
|
if (ruleType == 'T')
|
|
|
|
|
tradRules->activate();
|
|
|
|
|
else
|
|
|
|
|
kgrRules->activate();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::setEditMenu (bool on_off)
|
|
|
|
|
{
|
|
|
|
|
saveEdits->setEnabled (on_off);
|
|
|
|
|
|
|
|
|
|
saveGame->setEnabled (! on_off);
|
|
|
|
|
hintAction->setEnabled (! on_off);
|
|
|
|
|
killHero->setEnabled (! on_off);
|
|
|
|
|
highScore->setEnabled (! on_off);
|
|
|
|
|
|
|
|
|
|
if (on_off){
|
|
|
|
|
editToolbar->show();
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
editToolbar->hide();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/******************* SLOTS FOR MENU AND KEYBOARD ACTIONS *******************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Slot to halt (pause) or restart the game play.
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::stopStart()
|
|
|
|
|
{
|
|
|
|
|
if (! (KGrObject::frozen)) {
|
|
|
|
|
game->freeze();
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
game->unfreeze();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Local slots to create or edit game information.
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::createGame() {game->editCollection (SL_CR_GAME);}
|
|
|
|
|
void KGoldrunner::editGameInfo() {game->editCollection (SL_UPD_GAME);}
|
|
|
|
|
|
|
|
|
|
// Local slots to set the landscape (colour scheme).
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::lsKGoldrunner() {view->changeLandscape ("KGoldrunner");}
|
|
|
|
|
void KGoldrunner::lsApple2() {view->changeLandscape ("Apple II");}
|
|
|
|
|
void KGoldrunner::lsIceCave() {view->changeLandscape ("Ice Cave");}
|
|
|
|
|
void KGoldrunner::lsMidnight() {view->changeLandscape ("Midnight");}
|
|
|
|
|
void KGoldrunner::lsKDEKool() {view->changeLandscape ("KDE Kool");}
|
|
|
|
|
|
|
|
|
|
// Local slots to set mouse or keyboard control of the hero.
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::setMouseMode() {game->setMouseMode (TRUE);}
|
|
|
|
|
void KGoldrunner::setKeyBoardMode() {game->setMouseMode (FALSE);}
|
|
|
|
|
|
|
|
|
|
// Local slots to set game speed.
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::normalSpeed() {hero->setSpeed (NSPEED);}
|
|
|
|
|
void KGoldrunner::beginSpeed() {hero->setSpeed (BEGINSPEED);}
|
|
|
|
|
void KGoldrunner::champSpeed() {hero->setSpeed (CHAMPSPEED);}
|
|
|
|
|
void KGoldrunner::incSpeed() {hero->setSpeed (+1);}
|
|
|
|
|
void KGoldrunner::decSpeed() {hero->setSpeed (-1);}
|
|
|
|
|
|
|
|
|
|
// Slots to set Traditional or KGoldrunner rules.
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::setTradRules()
|
|
|
|
|
{
|
|
|
|
|
KGrFigure::variableTiming = TRUE;
|
|
|
|
|
KGrFigure::alwaysCollectNugget = TRUE;
|
|
|
|
|
KGrFigure::runThruHole = TRUE;
|
|
|
|
|
KGrFigure::reappearAtTop = TRUE;
|
|
|
|
|
KGrFigure::searchStrategy = LOW;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::setKGrRules()
|
|
|
|
|
{
|
|
|
|
|
KGrFigure::variableTiming = FALSE;
|
|
|
|
|
KGrFigure::alwaysCollectNugget = FALSE;
|
|
|
|
|
KGrFigure::runThruHole = FALSE;
|
|
|
|
|
KGrFigure::reappearAtTop = FALSE;
|
|
|
|
|
KGrFigure::searchStrategy = MEDIUM;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Local slots to make playing area larger or smaller.
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::makeLarger()
|
|
|
|
|
{
|
|
|
|
|
if (view->changeSize (+1))
|
|
|
|
|
setFixedSize (view->size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::makeSmaller()
|
|
|
|
|
{
|
|
|
|
|
if (view->changeSize (-1))
|
|
|
|
|
setFixedSize (view->size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Local slots for hero control keys.
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::goUp() {setKey (KB_UP);}
|
|
|
|
|
void KGoldrunner::goR() {setKey (KB_RIGHT);}
|
|
|
|
|
void KGoldrunner::goDown() {setKey (KB_DOWN);}
|
|
|
|
|
void KGoldrunner::goL() {setKey (KB_LEFT);}
|
|
|
|
|
void KGoldrunner::stop() {setKey (KB_STOP);}
|
|
|
|
|
void KGoldrunner::digR() {setKey (KB_DIGRIGHT);}
|
|
|
|
|
void KGoldrunner::digL() {setKey (KB_DIGLEFT);}
|
|
|
|
|
|
|
|
|
|
// Local slots for authors' debugging aids.
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::showEnemy0() {game->showEnemyState (0);}
|
|
|
|
|
void KGoldrunner::showEnemy1() {game->showEnemyState (1);}
|
|
|
|
|
void KGoldrunner::showEnemy2() {game->showEnemyState (2);}
|
|
|
|
|
void KGoldrunner::showEnemy3() {game->showEnemyState (3);}
|
|
|
|
|
void KGoldrunner::showEnemy4() {game->showEnemyState (4);}
|
|
|
|
|
void KGoldrunner::showEnemy5() {game->showEnemyState (5);}
|
|
|
|
|
void KGoldrunner::showEnemy6() {game->showEnemyState (6);}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::saveProperties(KConfig *config)
|
|
|
|
|
{
|
|
|
|
|
// The 'config' object points to the session managed
|
|
|
|
|
// config file. Anything you write here will be available
|
|
|
|
|
// later when this app is restored.
|
|
|
|
|
|
|
|
|
|
config->setGroup ("Game"); // Prevents a compiler warning.
|
|
|
|
|
printf ("I am in KGoldrunner::saveProperties.\n");
|
|
|
|
|
// config->writeEntry("qqq", qqq);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::readProperties(KConfig *config)
|
|
|
|
|
{
|
|
|
|
|
// The 'config' object points to the session managed
|
|
|
|
|
// config file. This function is automatically called whenever
|
|
|
|
|
// the app is being restored. Read in here whatever you wrote
|
|
|
|
|
// in 'saveProperties'
|
|
|
|
|
|
|
|
|
|
config->setGroup ("Game"); // Prevents a compiler warning.
|
|
|
|
|
printf ("I am in KGoldrunner::readProperties.\n");
|
|
|
|
|
// TQString qqq = config->readEntry("qqq");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::optionsShowToolbar()
|
|
|
|
|
{
|
|
|
|
|
// this is all very cut and paste code for showing/hiding the
|
|
|
|
|
// toolbar
|
|
|
|
|
// if (m_toolbarAction->isChecked())
|
|
|
|
|
// toolBar()->show();
|
|
|
|
|
// else
|
|
|
|
|
// toolBar()->hide();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::optionsShowStatusbar()
|
|
|
|
|
{
|
|
|
|
|
// this is all very cut and paste code for showing/hiding the
|
|
|
|
|
// statusbar
|
|
|
|
|
// if (m_statusbarAction->isChecked())
|
|
|
|
|
// statusBar()->show();
|
|
|
|
|
// else
|
|
|
|
|
// statusBar()->hide();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::optionsConfigureKeys()
|
|
|
|
|
{
|
|
|
|
|
KKeyDialog::configure(actionCollection());
|
|
|
|
|
|
|
|
|
|
// Update the PAUSE/RESUME message in the status bar.
|
|
|
|
|
pauseKeys = myPause->shortcut().toString();
|
|
|
|
|
pauseKeys = pauseKeys.replace (';', "\" " + i18n("or") + " \"");
|
|
|
|
|
gameFreeze (KGrObject::frozen); // Refresh the status bar text.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::optionsConfigureToolbars()
|
|
|
|
|
{
|
|
|
|
|
// use the standard toolbar editor
|
|
|
|
|
#if defined(KDE_MAKE_VERSION)
|
|
|
|
|
# if KDE_VERSION >= KDE_MAKE_VERSION(3,1,0)
|
|
|
|
|
saveMainWindowSettings(KGlobal::config(), autoSaveGroup());
|
|
|
|
|
# else
|
|
|
|
|
saveMainWindowSettings(KGlobal::config());
|
|
|
|
|
# endif
|
|
|
|
|
#else
|
|
|
|
|
saveMainWindowSettings(KGlobal::config());
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::newToolbarConfig()
|
|
|
|
|
{
|
|
|
|
|
// this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
|
|
|
|
|
// recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
|
|
|
|
|
createGUI();
|
|
|
|
|
|
|
|
|
|
#if defined(KDE_MAKE_VERSION)
|
|
|
|
|
# if KDE_VERSION >= KDE_MAKE_VERSION(3,1,0)
|
|
|
|
|
applyMainWindowSettings(KGlobal::config(), autoSaveGroup());
|
|
|
|
|
# else
|
|
|
|
|
applyMainWindowSettings(KGlobal::config());
|
|
|
|
|
# endif
|
|
|
|
|
#else
|
|
|
|
|
applyMainWindowSettings(KGlobal::config());
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::optionsPreferences()
|
|
|
|
|
{
|
|
|
|
|
// popup some sort of preference dialog, here
|
|
|
|
|
// KGoldrunnerPreferences dlg;
|
|
|
|
|
// if (dlg.exec())
|
|
|
|
|
// {
|
|
|
|
|
// redo your settings
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::changeStatusbar(const TQString& text)
|
|
|
|
|
{
|
|
|
|
|
// display the text on the statusbar
|
|
|
|
|
statusBar()->message(text);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::changeCaption(const TQString& text)
|
|
|
|
|
{
|
|
|
|
|
// display the text on the caption
|
|
|
|
|
setCaption(text);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool KGoldrunner::getDirectories()
|
|
|
|
|
{
|
|
|
|
|
bool result = TRUE;
|
|
|
|
|
|
|
|
|
|
// WHERE THINGS ARE: In the KDE 3 environment (Release 3.1.1), application
|
|
|
|
|
// documentation and data files are in a directory structure given by
|
|
|
|
|
// $KDEDIRS (e.g. "/usr/local/kde" or "/opt/trinity/"). Application user data
|
|
|
|
|
// files are in a directory structure given by $KDEHOME ("$HOME/.kde").
|
|
|
|
|
// Within those two structures, the three sub-directories will typically be
|
|
|
|
|
// "share/doc/HTML/en/kgoldrunner/", "share/apps/kgoldrunner/system/" and
|
|
|
|
|
// "share/apps/kgoldrunner/user/". Note that it is necessary to have
|
|
|
|
|
// an extra path level ("system" or "user") after "kgoldrunner", otherwise
|
|
|
|
|
// all the KGoldrunner files have similar path names (after "apps") and
|
|
|
|
|
// KDE always locates directories in $KDEHOME and never the released games.
|
|
|
|
|
|
|
|
|
|
// The directory strings are set by KDE at run time and might change in
|
|
|
|
|
// later releases, so use them with caution and only if something gets lost.
|
|
|
|
|
|
|
|
|
|
KStandardDirs * dirs = new KStandardDirs();
|
|
|
|
|
|
|
|
|
|
#ifdef QT3
|
|
|
|
|
TQString myDir = "kgoldrunner";
|
|
|
|
|
#else
|
|
|
|
|
TQString myDir = "kgoldrun";
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Find the KGoldrunner Users' Guide, English version (en).
|
|
|
|
|
systemHTMLDir = dirs->findResourceDir ("html", "en/" + myDir + "/");
|
|
|
|
|
if (systemHTMLDir.length() <= 0) {
|
|
|
|
|
KGrMessage::information (this, i18n("Get Folders"),
|
|
|
|
|
i18n("Cannot find documentation sub-folder 'en/%1/' "
|
|
|
|
|
"in area '%2' of the KDE folder ($KDEDIRS).")
|
|
|
|
|
.tqarg(myDir).tqarg(dirs->kde_default ("html")));
|
|
|
|
|
// result = FALSE; // Don't abort if the doc is missing.
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
systemHTMLDir.append ("en/" + myDir + "/");
|
|
|
|
|
|
|
|
|
|
// Find the system collections in a directory of the required KDE type.
|
|
|
|
|
systemDataDir = dirs->findResourceDir ("data", myDir + "/system/");
|
|
|
|
|
if (systemDataDir.length() <= 0) {
|
|
|
|
|
KGrMessage::information (this, i18n("Get Folders"),
|
|
|
|
|
i18n("Cannot find system games sub-folder '%1/system/' "
|
|
|
|
|
"in area '%2' of the KDE folder ($KDEDIRS).")
|
|
|
|
|
.tqarg(myDir).tqarg(dirs->kde_default ("data")));
|
|
|
|
|
result = FALSE; // ABORT if the games data is missing.
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
systemDataDir.append (myDir + "/system/");
|
|
|
|
|
|
|
|
|
|
// Locate and optionally create directories for user collections and levels.
|
|
|
|
|
bool create = TRUE;
|
|
|
|
|
userDataDir = dirs->saveLocation ("data", myDir + "/user/", create);
|
|
|
|
|
if (userDataDir.length() <= 0) {
|
|
|
|
|
KGrMessage::information (this, i18n("Get Folders"),
|
|
|
|
|
i18n("Cannot find or create user games sub-folder '%1/user/' "
|
|
|
|
|
"in area '%2' of the KDE user area ($KDEHOME).")
|
|
|
|
|
.tqarg(myDir).tqarg(dirs->kde_default ("data")));
|
|
|
|
|
// result = FALSE; // Don't abort if user area is missing.
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
create = dirs->makeDir (userDataDir + "levels/");
|
|
|
|
|
if (! create) {
|
|
|
|
|
KGrMessage::information (this, i18n("Get Folders"),
|
|
|
|
|
i18n("Cannot find or create 'levels/' folder in "
|
|
|
|
|
"sub-folder '%1/user/' in the KDE user area ($KDEHOME).").tqarg(myDir));
|
|
|
|
|
// result = FALSE; // Don't abort if user area is missing.
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This method is invoked when top-level window is closed, whether by selecting
|
|
|
|
|
// "Quit" from the menu or by clicking the "X" at the top right of the window.
|
|
|
|
|
|
|
|
|
|
bool KGoldrunner::queryClose ()
|
|
|
|
|
{
|
|
|
|
|
// Last chance to save: user has clicked "X" widget or menu-Quit.
|
|
|
|
|
bool cannotContinue = TRUE;
|
|
|
|
|
game->saveOK (cannotContinue);
|
|
|
|
|
return (TRUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::setKey (KBAction movement)
|
|
|
|
|
{
|
|
|
|
|
if (game->inEditMode()) return;
|
|
|
|
|
|
|
|
|
|
// Using keyboard control can automatically disable mouse control.
|
|
|
|
|
if (game->inMouseMode()) {
|
|
|
|
|
// Halt the game while a message is displayed.
|
|
|
|
|
game->setMessageFreeze (TRUE);
|
|
|
|
|
|
|
|
|
|
switch (KGrMessage::warning (this, i18n("Switch to Keyboard Mode"),
|
|
|
|
|
i18n("You have pressed a key that can be used to move the "
|
|
|
|
|
"Hero. Do you want to switch automatically to keyboard "
|
|
|
|
|
"control? Mouse control is easier to use in the long term "
|
|
|
|
|
"- like riding a bike rather than walking!"),
|
|
|
|
|
i18n("Switch to &Keyboard Mode"), i18n("Stay in &Mouse Mode")))
|
|
|
|
|
{
|
|
|
|
|
case 0: game->setMouseMode (FALSE); // Set internal mouse mode OFF.
|
|
|
|
|
setMouse->setChecked (FALSE); // Adjust the Settings menu.
|
|
|
|
|
setKeyboard->setChecked (TRUE);
|
|
|
|
|
break;
|
|
|
|
|
case 1: break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Unfreeze the game, but only if it was previously unfrozen.
|
|
|
|
|
game->setMessageFreeze (FALSE);
|
|
|
|
|
|
|
|
|
|
if (game->inMouseMode())
|
|
|
|
|
return; // Stay in Mouse Mode.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( game->getLevel() != 0 )
|
|
|
|
|
{
|
|
|
|
|
if (! hero->started ) // Start when first movement
|
|
|
|
|
game->startPlaying(); // key is pressed ...
|
|
|
|
|
game->heroAction (movement);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/********************** MAKE A TOOLBAR FOR THE EDITOR **********************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
#include <tqwmatrix.h>
|
|
|
|
|
void KGoldrunner::makeEditToolbar()
|
|
|
|
|
{
|
|
|
|
|
// Set up the pixmaps for the editable objects.
|
|
|
|
|
TQPixmap pixmap;
|
|
|
|
|
TQImage image;
|
|
|
|
|
|
|
|
|
|
TQPixmap brickbg = view->getPixmap (BRICK);
|
|
|
|
|
TQPixmap fbrickbg = view->getPixmap (FBRICK);
|
|
|
|
|
|
|
|
|
|
TQPixmap freebg = view->getPixmap (FREE);
|
|
|
|
|
TQPixmap nuggetbg = view->getPixmap (NUGGET);
|
|
|
|
|
TQPixmap polebg = view->getPixmap (POLE);
|
|
|
|
|
TQPixmap betonbg = view->getPixmap (BETON);
|
|
|
|
|
TQPixmap ladderbg = view->getPixmap (LADDER);
|
|
|
|
|
TQPixmap hladderbg = view->getPixmap (HLADDER);
|
|
|
|
|
TQPixmap edherobg = view->getPixmap (HERO);
|
|
|
|
|
TQPixmap edenemybg = view->getPixmap (ENEMY);
|
|
|
|
|
|
|
|
|
|
if (usesBigPixmaps()) { // Scale up the pixmaps (to give cleaner looking
|
|
|
|
|
// icons than leaving it for TQToolButton to do).
|
|
|
|
|
TQWMatrix w;
|
|
|
|
|
w = w.scale (2.0, 2.0);
|
|
|
|
|
|
|
|
|
|
// The pixmaps shown on the buttons used to remain small and incorrectly
|
|
|
|
|
// painted, in KDE, in spite of the 2x (32x32) scaling. "insertButton"
|
|
|
|
|
// calls TQIconSet, to generate a set of icons from each pixmapx, then
|
|
|
|
|
// seems to select the small size to paint on the button. The following
|
|
|
|
|
// line forces all icons, large and small, to be size 32x32 in advance.
|
|
|
|
|
TQIconSet::setIconSize (TQIconSet::Small, TQSize (32, 32));
|
|
|
|
|
|
|
|
|
|
brickbg = brickbg.xForm (w);
|
|
|
|
|
fbrickbg = fbrickbg.xForm (w);
|
|
|
|
|
|
|
|
|
|
freebg = freebg.xForm (w);
|
|
|
|
|
nuggetbg = nuggetbg.xForm (w);
|
|
|
|
|
polebg = polebg.xForm (w);
|
|
|
|
|
betonbg = betonbg.xForm (w);
|
|
|
|
|
ladderbg = ladderbg.xForm (w);
|
|
|
|
|
hladderbg = hladderbg.xForm (w);
|
|
|
|
|
edherobg = edherobg.xForm (w);
|
|
|
|
|
edenemybg = edenemybg.xForm (w);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
editToolbar = new KToolBar (this, TQt::DockTop, TRUE, "Editor", TRUE);
|
|
|
|
|
|
|
|
|
|
// Choose a colour that enhances visibility of the KGoldrunner pixmaps.
|
|
|
|
|
// editToolbar->setPalette (TQPalette (TQColor (150, 150, 230)));
|
|
|
|
|
|
|
|
|
|
// editToolbar->setHorizontallyStretchable (TRUE); // Not effective in KDE.
|
|
|
|
|
|
|
|
|
|
// All those separators are just to get reasonable visual spacing of the
|
|
|
|
|
// pixmaps in KDE. "setHorizontallyStretchable(TRUE)" does it in TQt.
|
|
|
|
|
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
|
|
|
|
|
editToolbar->insertButton ("filenew", 0, TQT_SIGNAL(clicked()), game,
|
|
|
|
|
TQT_SLOT(createLevel()), TRUE, i18n("&Create a Level"));
|
|
|
|
|
editToolbar->insertButton ("fileopen", 1, TQT_SIGNAL(clicked()), game,
|
|
|
|
|
TQT_SLOT(updateLevel()), TRUE, i18n("&Edit Any Level..."));
|
|
|
|
|
editToolbar->insertButton ("filesave", 2, TQT_SIGNAL(clicked()), game,
|
|
|
|
|
TQT_SLOT(saveLevelFile()),TRUE, i18n("&Save Edits..."));
|
|
|
|
|
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
|
|
|
|
|
editToolbar->insertButton ("ktip", 3, TQT_SIGNAL(clicked()), game,
|
|
|
|
|
TQT_SLOT(editNameAndHint()),TRUE,i18n("Edit Name/Hint"));
|
|
|
|
|
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
|
|
|
|
|
editToolbar->insertButton (freebg, (int)FREE, TQT_SIGNAL(clicked()), TQT_TQOBJECT(this),
|
|
|
|
|
TQT_SLOT(freeSlot()), TRUE, i18n("Empty space"));
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
editToolbar->insertButton (edherobg, (int)HERO, TQT_SIGNAL(clicked()), TQT_TQOBJECT(this),
|
|
|
|
|
TQT_SLOT (edheroSlot()), TRUE, i18n("Hero"));
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
editToolbar->insertButton (edenemybg, (int)ENEMY, TQT_SIGNAL(clicked()), TQT_TQOBJECT(this),
|
|
|
|
|
TQT_SLOT (edenemySlot()), TRUE, i18n("Enemy"));
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
editToolbar->insertButton (brickbg, (int)BRICK, TQT_SIGNAL(clicked()), TQT_TQOBJECT(this),
|
|
|
|
|
TQT_SLOT (brickSlot()), TRUE, i18n("Brick (can dig)"));
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
editToolbar->insertButton (betonbg, (int)BETON, TQT_SIGNAL(clicked()), TQT_TQOBJECT(this),
|
|
|
|
|
TQT_SLOT (betonSlot()), TRUE, i18n("Concrete (cannot dig)"));
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
editToolbar->insertButton (fbrickbg, (int)FBRICK, TQT_SIGNAL(clicked()), TQT_TQOBJECT(this),
|
|
|
|
|
TQT_SLOT (fbrickSlot()), TRUE, i18n("Trap (can fall through)"));
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
editToolbar->insertButton (ladderbg, (int)LADDER, TQT_SIGNAL(clicked()), TQT_TQOBJECT(this),
|
|
|
|
|
TQT_SLOT (ladderSlot()), TRUE, i18n("Ladder"));
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
editToolbar->insertButton (hladderbg, (int)HLADDER, TQT_SIGNAL(clicked()), TQT_TQOBJECT(this),
|
|
|
|
|
TQT_SLOT (hladderSlot()), TRUE, i18n("Hidden ladder"));
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
editToolbar->insertButton (polebg, (int)POLE, TQT_SIGNAL(clicked()), TQT_TQOBJECT(this),
|
|
|
|
|
TQT_SLOT (poleSlot()), TRUE, i18n("Pole (or bar)"));
|
|
|
|
|
editToolbar->insertSeparator();
|
|
|
|
|
editToolbar->insertButton (nuggetbg, (int)NUGGET, TQT_SIGNAL(clicked()), TQT_TQOBJECT(this),
|
|
|
|
|
TQT_SLOT (nuggetSlot()), TRUE, i18n("Gold nugget"));
|
|
|
|
|
|
|
|
|
|
editToolbar->setToggle ((int) FREE, TRUE);
|
|
|
|
|
editToolbar->setToggle ((int) HERO, TRUE);
|
|
|
|
|
editToolbar->setToggle ((int) ENEMY, TRUE);
|
|
|
|
|
editToolbar->setToggle ((int) BRICK, TRUE);
|
|
|
|
|
editToolbar->setToggle ((int) BETON, TRUE);
|
|
|
|
|
editToolbar->setToggle ((int) FBRICK, TRUE);
|
|
|
|
|
editToolbar->setToggle ((int) LADDER, TRUE);
|
|
|
|
|
editToolbar->setToggle ((int) HLADDER, TRUE);
|
|
|
|
|
editToolbar->setToggle ((int) POLE, TRUE);
|
|
|
|
|
editToolbar->setToggle ((int) NUGGET, TRUE);
|
|
|
|
|
|
|
|
|
|
pressedButton = (int) BRICK;
|
|
|
|
|
editToolbar->setButton (pressedButton, TRUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/********************* EDIT-BUTTON SLOTS **********************************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::freeSlot()
|
|
|
|
|
{ game->setEditObj (FREE); setButton ((int) FREE); }
|
|
|
|
|
void KGoldrunner::edheroSlot()
|
|
|
|
|
{ game->setEditObj (HERO); setButton ((int) HERO); }
|
|
|
|
|
void KGoldrunner::edenemySlot()
|
|
|
|
|
{ game->setEditObj (ENEMY); setButton ((int) ENEMY); }
|
|
|
|
|
void KGoldrunner::brickSlot()
|
|
|
|
|
{ game->setEditObj (BRICK); setButton ((int) BRICK); }
|
|
|
|
|
void KGoldrunner::betonSlot()
|
|
|
|
|
{ game->setEditObj (BETON); setButton ((int) BETON); }
|
|
|
|
|
void KGoldrunner::fbrickSlot()
|
|
|
|
|
{ game->setEditObj (FBRICK); setButton ((int) FBRICK); }
|
|
|
|
|
void KGoldrunner::ladderSlot()
|
|
|
|
|
{ game->setEditObj (LADDER); setButton ((int) LADDER); }
|
|
|
|
|
void KGoldrunner::hladderSlot()
|
|
|
|
|
{ game->setEditObj (HLADDER); setButton ((int) HLADDER); }
|
|
|
|
|
void KGoldrunner::poleSlot()
|
|
|
|
|
{ game->setEditObj (POLE); setButton ((int) POLE); }
|
|
|
|
|
void KGoldrunner::nuggetSlot()
|
|
|
|
|
{ game->setEditObj (NUGGET); setButton ((int) NUGGET); }
|
|
|
|
|
void KGoldrunner::defaultEditObj()
|
|
|
|
|
{ setButton ((int) BRICK); }
|
|
|
|
|
|
|
|
|
|
void KGoldrunner::setButton (int btn)
|
|
|
|
|
{
|
|
|
|
|
editToolbar->setButton (pressedButton, FALSE);
|
|
|
|
|
pressedButton = btn;
|
|
|
|
|
editToolbar->setButton (pressedButton, TRUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#include "kgoldrunner.moc"
|