|
|
|
|
/***************************************************************************
|
|
|
|
|
* Copyright (C) 2003 by Ian Wadham and Marco Kr<EFBFBD>ger *
|
|
|
|
|
* ianw2@optusnet.com.au *
|
|
|
|
|
* *
|
|
|
|
|
* 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. *
|
|
|
|
|
***************************************************************************/
|
|
|
|
|
#ifndef KGRGAME_H
|
|
|
|
|
#define KGRGAME_H
|
|
|
|
|
|
|
|
|
|
// Macros to smooth out the differences between TQt 1 and TQt 2 classes.
|
|
|
|
|
//
|
|
|
|
|
// "myStr" converts a TQString object to a C language "char*" character string.
|
|
|
|
|
// "myChar" extracts a C language character (type "char") from a TQString object.
|
|
|
|
|
// "endData" checks for an end-of-file condition.
|
|
|
|
|
//
|
|
|
|
|
#define myStr latin1
|
|
|
|
|
#define myChar(i) at((i)).latin1()
|
|
|
|
|
#define endData atEnd
|
|
|
|
|
|
|
|
|
|
#include <tqobject.h>
|
|
|
|
|
|
|
|
|
|
#ifdef QT3
|
|
|
|
|
#include <tqptrlist.h>
|
|
|
|
|
#else
|
|
|
|
|
#include <tqlist.h>
|
|
|
|
|
#endif
|
|
|
|
|
#include <tqstring.h>
|
|
|
|
|
|
|
|
|
|
#include <tqdir.h>
|
|
|
|
|
#include <tqfile.h>
|
|
|
|
|
#include <tqtextstream.h>
|
|
|
|
|
#include <tqdatastream.h>
|
|
|
|
|
|
|
|
|
|
#include <tqcolor.h>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Sets up games and levels in KGoldrunner and controls the play.
|
|
|
|
|
|
|
|
|
|
@author Ian Wadham
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
class KGrObject;
|
|
|
|
|
class KGrHero;
|
|
|
|
|
class KGrEnemy;
|
|
|
|
|
class KGrCollection;
|
|
|
|
|
|
|
|
|
|
class KGrGame : public TQObject
|
|
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
KGrGame (KGrCanvas * theView, TQString theSystemDir, TQString theUserDir);
|
|
|
|
|
~KGrGame();
|
|
|
|
|
|
|
|
|
|
bool initCollections();
|
|
|
|
|
KGrHero * getHero();
|
|
|
|
|
|
|
|
|
|
int getLevel();
|
|
|
|
|
|
|
|
|
|
void startPlaying();
|
|
|
|
|
|
|
|
|
|
bool inMouseMode(); // True if the game is in mouse mode.
|
|
|
|
|
bool inEditMode(); // True if the game is in editor mode.
|
|
|
|
|
bool isLoading(); // True if a level is being loaded.
|
|
|
|
|
|
|
|
|
|
bool saveOK (bool exiting); // Check if edits were saved.
|
|
|
|
|
|
|
|
|
|
TQString getTitle(); // Collection - Level NNN, Name.
|
|
|
|
|
|
|
|
|
|
void setEditObj (char newEditObj); // Set object for editor to paint.
|
|
|
|
|
|
|
|
|
|
TQString getFilePath (Owner o, KGrCollection * colln, int lev);
|
|
|
|
|
|
|
|
|
|
public slots:
|
|
|
|
|
void startLevelOne(); // Start any game from level 1.
|
|
|
|
|
void startAnyLevel(); // Start any game from any level.
|
|
|
|
|
void startNextLevel(); // Start next level of current game.
|
|
|
|
|
|
|
|
|
|
void setMouseMode (bool on_off); // Set mouse OR keyboard control.
|
|
|
|
|
void startLevel (int startingAt, int requestedLevel);
|
|
|
|
|
void newGame (const int lev, const int gameIndex);
|
|
|
|
|
void startTutorial(); // Start tutorial game.
|
|
|
|
|
void showHint(); // Show hint for current level.
|
|
|
|
|
|
|
|
|
|
void showHighScores(); // Show high scores for current game.
|
|
|
|
|
|
|
|
|
|
void incScore(int); // Update the score.
|
|
|
|
|
void herosDead(); // Hero was caught or he quit (key Q).
|
|
|
|
|
void showHiddenLadders(); // Show hidden ladders (nuggets gone).
|
|
|
|
|
void goUpOneLevel(); // Hero completed the level.
|
|
|
|
|
void loseNugget(); // Nugget destroyed (not collected).
|
|
|
|
|
void heroAction (KBAction movement);// Move hero under keyboard control.
|
|
|
|
|
|
|
|
|
|
void saveGame(); // Save game ID, score and level.
|
|
|
|
|
void loadGame(); // Re-load game, score and level.
|
|
|
|
|
|
|
|
|
|
signals:
|
|
|
|
|
void showScore (long); // For main window to show the score.
|
|
|
|
|
void showLives (long); // For main window to show lives left.
|
|
|
|
|
void showLevel (int); // For main window to show the level.
|
|
|
|
|
|
|
|
|
|
void hintAvailable (bool); // For main window to adjust menu text.
|
|
|
|
|
|
|
|
|
|
void setEditMenu (bool); // Enable/Disable edit menu items.
|
|
|
|
|
void defaultEditObj(); // Set default edit-toolbar button.
|
|
|
|
|
|
|
|
|
|
void markRuleType (char); // Mark KGoldrunner/Traditional rules.
|
|
|
|
|
void gameFreeze (bool); // Do visual feedback in the GUI.
|
|
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
|
void finalBreath (); // Hero is dead: re-start the level.
|
|
|
|
|
void readMousePos (); // Timed reading of mouse position.
|
|
|
|
|
void doDig (int button); // Dig when under mouse-button control.
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
void setBlankLevel (bool playable);
|
|
|
|
|
int loadLevel (int levelNo);
|
|
|
|
|
bool openLevelFile (int levelNo, TQFile & openlevel);
|
|
|
|
|
void changeObject (unsigned char kind, int i, int j);
|
|
|
|
|
void createObject (KGrObject *o, char picType, int x, int y);
|
|
|
|
|
void setTimings ();
|
|
|
|
|
void initSearchMatrix();
|
|
|
|
|
|
|
|
|
|
void checkHighScore(); // Check if high score for current game.
|
|
|
|
|
|
|
|
|
|
int selectLevel (int action, int requestedLevel);
|
|
|
|
|
int selectedGame;
|
|
|
|
|
|
|
|
|
|
void restart(); // Kickstart the game action.
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/************************** PLAYFIELD AND GAME DATA *************************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
KGrCanvas * view; // Where the game is displayed.
|
|
|
|
|
TQString systemDataDir; // System games are stored here.
|
|
|
|
|
TQString userDataDir; // User games are stored here.
|
|
|
|
|
|
|
|
|
|
KGrObject * playfield[30][22]; // Array of playfield objects.
|
|
|
|
|
char editObjArray[30][22]; // Character-code equivalent.
|
|
|
|
|
char lastSaveArray[30][22]; // Copy for use in "saveOK()".
|
|
|
|
|
|
|
|
|
|
int level; // Current play/edit level.
|
|
|
|
|
TQString levelName; // Level name (optional).
|
|
|
|
|
TQString levelHint; // Level hint (optional).
|
|
|
|
|
|
|
|
|
|
long lives; // Lives remaining.
|
|
|
|
|
long score; // Current score.
|
|
|
|
|
long startScore; // Score at start of level.
|
|
|
|
|
|
|
|
|
|
KGrHero * hero; // The HERO figure !! Yay !!!
|
|
|
|
|
int startI, startJ; // The hero's starting position.
|
|
|
|
|
|
|
|
|
|
#ifdef QT3
|
|
|
|
|
TQPtrList<KGrEnemy> enemies; // The list of enemies.
|
|
|
|
|
#else
|
|
|
|
|
TQPtrList<KGrEnemy> enemies; // The list of enemies.
|
|
|
|
|
#endif
|
|
|
|
|
int enemyCount; // How many enemies.
|
|
|
|
|
KGrEnemy * enemy; // One of the enemies.
|
|
|
|
|
|
|
|
|
|
int nuggets; // How many gold nuggets.
|
|
|
|
|
|
|
|
|
|
bool newLevel; // Next level will be a new one.
|
|
|
|
|
bool loading; // Stop input until it's loaded.
|
|
|
|
|
|
|
|
|
|
bool modalFreeze; // Stop game during dialog.
|
|
|
|
|
bool messageFreeze; // Stop game during message.
|
|
|
|
|
|
|
|
|
|
TQTimer * mouseSampler; // Timer for mouse tracking.
|
|
|
|
|
TQTimer * dyingTimer; // For pause when the hero dies.
|
|
|
|
|
|
|
|
|
|
int lgHighlight; // Row selected in "loadGame()".
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/************************** AUTHORS' DEBUGGING AIDS **************************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
public slots:
|
|
|
|
|
void doStep(); // Do one animation step.
|
|
|
|
|
void showFigurePositions(); // Show everybody's co-ordinates.
|
|
|
|
|
void showHeroState(); // Show hero's co-ordinates and state.
|
|
|
|
|
void showEnemyState (int); // Show enemy's co-ordinates and state.
|
|
|
|
|
void showObjectState(); // Show an object's state.
|
|
|
|
|
void bugFix(); // Turn a bug fix on/off dynamically.
|
|
|
|
|
void startLogging(); // Turn logging on/off.
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/******************** GAME EDITOR PROPERTIES AND METHODS ********************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
public slots: // Slots connected to the Menu and Edit Toolbar.
|
|
|
|
|
void createLevel(); // Set up a blank level-display for edit.
|
|
|
|
|
void updateLevel(); // Update an existing level.
|
|
|
|
|
void updateNext(); // Update the current level + 1.
|
|
|
|
|
void editNameAndHint(); // Run a dialog to edit the level name and hint.
|
|
|
|
|
bool saveLevelFile(); // Save the edited level in a text file (.grl).
|
|
|
|
|
void moveLevelFile(); // Move level to another collection or number.
|
|
|
|
|
void deleteLevelFile(); // Delete a level file.
|
|
|
|
|
|
|
|
|
|
void editCollection (int action);
|
|
|
|
|
|
|
|
|
|
void setLevel (int lev); // Set level to be edited.
|
|
|
|
|
|
|
|
|
|
void freeze(); // Stop the gameplay action.
|
|
|
|
|
void unfreeze(); // Restart the gameplay action.
|
|
|
|
|
void setMessageFreeze (bool);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
bool mouseMode; // Flag to set up keyboard OR mouse control.
|
|
|
|
|
bool editMode; // Flag to change keyboard and mouse functions.
|
|
|
|
|
char editObj; // Type of object to be painted by the mouse.
|
|
|
|
|
bool paintEditObj; // Sets painting on/off (toggled by clicking).
|
|
|
|
|
int oldI, oldJ; // Last mouse position painted.
|
|
|
|
|
int editLevel; // Level to be edited (= 0 for new level).
|
|
|
|
|
int heroCount; // Can enter at most one hero.
|
|
|
|
|
bool shouldSave; // True if name or hint was edited.
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
void loadEditLevel (int); // Load and display an existing level for edit.
|
|
|
|
|
void initEdit();
|
|
|
|
|
void deleteLevel();
|
|
|
|
|
void insertEditObj (int, int);
|
|
|
|
|
void setEditableCell (int, int, char);
|
|
|
|
|
void showEditLevel();
|
|
|
|
|
bool reNumberLevels (int, int, int, int);
|
|
|
|
|
bool ownerOK (Owner o);
|
|
|
|
|
|
|
|
|
|
// Pixmaps for repainting objects as they are edited.
|
|
|
|
|
TQPixmap digpix[10];
|
|
|
|
|
TQPixmap brickbg, fbrickbg;
|
|
|
|
|
TQPixmap freebg, nuggetbg, polebg, betonbg, ladderbg, hladderbg;
|
|
|
|
|
TQPixmap edherobg, edenemybg;
|
|
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
|
void doEdit(int); // For mouse-click when in edit-mode.
|
|
|
|
|
void endEdit(int); // For mouse-release when in edit-mode.
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/******************** COLLECTION PROPERTIES AND METHODS *******************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
// Note that a collection of KGoldrunner levels is the same thing as a "game".
|
|
|
|
|
#ifdef QT3
|
|
|
|
|
TQPtrList<KGrCollection> collections; // List of ALL collections.
|
|
|
|
|
#else
|
|
|
|
|
TQPtrList<KGrCollection> collections; // List of ALL collections.
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
KGrCollection * collection; // Collection currently in use.
|
|
|
|
|
Owner owner; // Collection owner.
|
|
|
|
|
int collnIndex; // Index in collections list.
|
|
|
|
|
|
|
|
|
|
void mapCollections();
|
|
|
|
|
bool loadCollections (Owner);
|
|
|
|
|
bool saveCollections (Owner);
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/********************** WORD-WRAPPED MESSAGE BOX ************************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
void myMessage (TQWidget * parent, TQString title, TQString contents);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/********************** CLASS TO DISPLAY THUMBNAIL ***********************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
class KGrThumbNail : public TQFrame
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
KGrThumbNail (TQWidget *parent = 0, const char *name = 0);
|
|
|
|
|
void setFilePath (TQString &, TQLabel *); // Set filepath and name field.
|
|
|
|
|
|
|
|
|
|
static TQColor backgroundColor;
|
|
|
|
|
static TQColor brickColor;
|
|
|
|
|
static TQColor ladderColor;
|
|
|
|
|
static TQColor poleColor;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
void drawContents (TQPainter *); // Draw a preview of a level.
|
|
|
|
|
TQString filePath;
|
|
|
|
|
TQLabel * lName;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/*********************** COLLECTION DATA CLASS **************************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Note that a collection of KGoldrunner levels is the same thing as a "game".
|
|
|
|
|
class KGrCollection
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
KGrCollection (Owner o, const TQString & n, const TQString & p,
|
|
|
|
|
const char s, int nl, const TQString & a);
|
|
|
|
|
Owner owner; // Collection owner: "System" or "User".
|
|
|
|
|
TQString name; // Collection name.
|
|
|
|
|
TQString prefix; // Collection's filename prefix.
|
|
|
|
|
char settings; // Collection rules: KGoldrunner or Traditional.
|
|
|
|
|
int nLevels; // Number of levels in the collection.
|
|
|
|
|
TQString about; // Optional text about the collection.
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif
|