summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/kpacman/config.cpp394
-rw-r--r--noncore/games/kpacman/config.h74
-rw-r--r--noncore/games/kpacman/keys.cpp4
-rw-r--r--noncore/games/kpacman/kpacman.cpp18
-rw-r--r--noncore/games/kpacman/kpacman.pro2
-rw-r--r--noncore/games/kpacman/kpacmanwidget.cpp2
-rw-r--r--noncore/games/kpacman/painter.cpp2
-rw-r--r--noncore/games/kpacman/referee.cpp2
-rw-r--r--noncore/games/kpacman/status.cpp4
9 files changed, 19 insertions, 483 deletions
diff --git a/noncore/games/kpacman/config.cpp b/noncore/games/kpacman/config.cpp
deleted file mode 100644
index b9e3607..0000000
--- a/noncore/games/kpacman/config.cpp
+++ b/dev/null
@@ -1,394 +0,0 @@
-/**********************************************************************
-** Copyright (C) 2000 Trolltech AS. All rights reserved.
-**
-** This file is part of Qt Palmtop Environment.
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU General Public License version 2 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** See http://www.trolltech.com/gpl/ for GPL licensing information.
-**
-** Contact info@trolltech.com if any conditions of this licensing are
-** not clear to you.
-**
-** $Id$
-**
-**********************************************************************/
-
-#include "config.h"
-
-#include <qfile.h>
-#include <qdir.h>
-#include <qfileinfo.h>
-#include <qtextstream.h>
-#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
-#include <qtextcodec.h>
-#endif
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-/*!
- \internal
-*/
-QString Config::configFilename(const QString& name, Domain d)
-{
- switch (d) {
- case File:
- return name;
- case User: {
- QDir dir = (QString(getenv("HOME")) + "/Settings");
- if ( !dir.exists() )
- mkdir(dir.path().local8Bit(),0700);
- return dir.path() + "/" + name + ".conf";
- }
- }
- return name;
-}
-
-/*!
- \class Config config.h
- \brief The Config class provides for saving application cofniguration state.
-
- You should keep a Config in existence only while you do not want others
- to be able to change the state. There is no locking currently, but there
- may be in the future.
-*/
-
-/*!
- \enum Config::ConfigGroup
- \internal
-*/
-
-/*!
- \enum Config::Domain
-
- \value File
- \value User
-
- See Config for details.
-*/
-
-/*!
- Constructs a config that will load or create a configuration with the
- given \a name in the given \a domain.
-
- You must call setGroup() before doing much else with the Config.
-
- In the default Domain, \e User,
- the configuration is user-specific. \a name should not contain "/" in
- this case, and in general should be the name of the C++ class that is
- primarily responsible for maintaining the configuration.
-
- In the File Domain, \a name is an absolute filename.
-*/
-Config::Config( const QString &name, Domain domain )
- : filename( configFilename(name,domain) )
-{
- git = groups.end();
- read();
-
- lang = getenv("LANG");
- int i = lang.find(".");
- if ( i > 0 )
- lang = lang.left( i );
- i = lang.find( "_" );
- if ( i > 0 )
- glang = lang.left(i);
-}
-
-/*!
- Writes any changes to disk and destroys the in-memory object.
-*/
-Config::~Config()
-{
- if ( changed )
- write();
-}
-
-/*!
- Returns whether the current group has an entry called \a key.
-*/
-bool Config::hasKey( const QString &key ) const
-{
- if ( groups.end() == git )
- return FALSE;
- ConfigGroup::ConstIterator it = ( *git ).find( key );
- return it != ( *git ).end();
-}
-
-/*!
- Sets the current group for subsequent reading and writing of
- entries to \a gname. Grouping allows the application to partition the namespace.
-
- This function must be called prior to any reading or writing
- of entries.
-
- The \a gname must not be empty.
-*/
-void Config::setGroup( const QString &gname )
-{
- QMap< QString, ConfigGroup>::Iterator it = groups.find( gname );
- if ( it == groups.end() ) {
- ConfigGroup *grp = new ConfigGroup;
- git = groups.insert( gname, *grp );
- changed = TRUE;
- return;
- }
- git = it;
-}
-
-/*!
- Writes a (\a key, \a value) entry to the current group.
-
- \sa readEntry()
-*/
-void Config::writeEntry( const QString &key, const QString &value )
-{
- if ( git == groups.end() ) {
- qWarning( "no group set" );
- return;
- }
- if ( (*git)[key] != value ) {
- ( *git ).insert( key, value );
- changed = TRUE;
- }
-}
-
-/*!
- Writes a (\a key, \a num) entry to the current group.
-
- \sa readNumEntry()
-*/
-void Config::writeEntry( const QString &key, int num )
-{
- QString s;
- s.setNum( num );
- writeEntry( key, s );
-}
-
-#ifdef Q_HAS_BOOL_TYPE
-/*!
- Writes a (\a key, \a b) entry to the current group.
-
- \sa readBoolEntry()
-*/
-void Config::writeEntry( const QString &key, bool b )
-{
- QString s;
- s.setNum( ( int )b );
- writeEntry( key, s );
-}
-#endif
-
-/*!
- Writes a (\a key, \a lst) entry to the current group. The list
- is separated by \a sep, so the strings must not contain that character.
-
- \sa readListEntry()
-*/
-void Config::writeEntry( const QString &key, const QStringList &lst, const QChar &sep )
-{
- QString s;
- QStringList::ConstIterator it = lst.begin();
- for ( ; it != lst.end(); ++it )
- s += *it + sep;
- writeEntry( key, s );
-}
-
-
-
-/*!
- Reads a string entry stored with \a key, defaulting to \a deflt if there is no entry.
-*/
-QString Config::readEntry( const QString &key, const QString &deflt )
-{
- QString res = readEntryDirect( key+"["+lang+"]" );
- if ( !res.isNull() )
- return res;
- if ( !glang.isEmpty() ) {
- res = readEntryDirect( key+"["+glang+"]" );
- if ( !res.isNull() )
- return res;
- }
- return readEntryDirect( key, deflt );
-}
-
-/*!
- \internal
-*/
-QString Config::readEntryDirect( const QString &key, const QString &deflt )
-{
- if ( git == groups.end() ) {
- //qWarning( "no group set" );
- return deflt;
- }
- ConfigGroup::Iterator it = ( *git ).find( key );
- if ( it != ( *git ).end() )
- return *it;
- else
- return deflt;
-}
-
-/*!
- Reads a numeric entry stored with \a key, defaulting to \a deflt if there is no entry.
-*/
-int Config::readNumEntry( const QString &key, int deflt )
-{
- QString s = readEntry( key );
- if ( s.isEmpty() )
- return deflt;
- else
- return s.toInt();
-}
-
-/*!
- Reads a bool entry stored with \a key, defaulting to \a deflt if there is no entry.
-*/
-bool Config::readBoolEntry( const QString &key, bool deflt )
-{
- QString s = readEntry( key );
- if ( s.isEmpty() )
- return deflt;
- else
- return (bool)s.toInt();
-}
-
-/*!
- Reads a string list entry stored with \a key, and with \a sep as the separator.
-*/
-QStringList Config::readListEntry( const QString &key, const QChar &sep )
-{
- QString s = readEntry( key );
- if ( s.isEmpty() )
- return QStringList();
- else
- return QStringList::split( sep, s );
-}
-
-/*!
- Removes all entries from the current group.
-*/
-void Config::clearGroup()
-{
- if ( git == groups.end() ) {
- qWarning( "no group set" );
- return;
- }
- if ( !(*git).isEmpty() ) {
- ( *git ).clear();
- changed = TRUE;
- }
-}
-
-/*!
- \internal
-*/
-void Config::write( const QString &fn )
-{
- if ( !fn.isEmpty() )
- filename = fn;
-
- QFile f( filename );
- if ( !f.open( IO_WriteOnly ) ) {
- qWarning( "could not open for writing `%s'", filename.latin1() );
- git = groups.end();
- return;
- }
-
- QTextStream s( &f );
-#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
- // The below should work, but doesn't in Qt 2.3.0
- s.setCodec( QTextCodec::codecForMib( 106 ) );
-#else
- s.setEncoding( QTextStream::UnicodeUTF8 );
-#endif
- QMap< QString, ConfigGroup >::Iterator g_it = groups.begin();
- for ( ; g_it != groups.end(); ++g_it ) {
- s << "[" << g_it.key() << "]" << "\n";
- ConfigGroup::Iterator e_it = ( *g_it ).begin();
- for ( ; e_it != ( *g_it ).end(); ++e_it )
- s << e_it.key() << " = " << *e_it << "\n";
- }
-
- f.close();
-}
-
-/*!
- Returns whether the Config is in a valid state.
-*/
-bool Config::isValid() const
-{
- return groups.end() != git;
-}
-
-/*!
- \internal
-*/
-void Config::read()
-{
- changed = FALSE;
-
- if ( !QFileInfo( filename ).exists() ) {
- git = groups.end();
- return;
- }
-
- QFile f( filename );
- if ( !f.open( IO_ReadOnly ) ) {
- git = groups.end();
- return;
- }
-
- QTextStream s( &f );
-#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
- // The below should work, but doesn't in Qt 2.3.0
- s.setCodec( QTextCodec::codecForMib( 106 ) );
-#else
- s.setEncoding( QTextStream::UnicodeUTF8 );
-#endif
-
- QString line;
- while ( !s.atEnd() ) {
- line = s.readLine();
- if ( !parse( line ) ) {
- git = groups.end();
- return;
- }
- }
-
- f.close();
-}
-
-/*!
- \internal
-*/
-bool Config::parse( const QString &l )
-{
- QString line = l.stripWhiteSpace();
- if ( line[ 0 ] == QChar( '[' ) ) {
- QString gname = line;
- gname = gname.remove( 0, 1 );
- if ( gname[ (int)gname.length() - 1 ] == QChar( ']' ) )
- gname = gname.remove( gname.length() - 1, 1 );
- ConfigGroup *grp = new ConfigGroup;
- git = groups.insert( gname, *grp );
- } else if ( !line.isEmpty() ) {
- if ( git == groups.end() )
- return FALSE;
- int eq = line.find( '=' );
- if ( eq == -1 )
- return FALSE;
- QString key = line.left(eq).stripWhiteSpace();
- QString value = line.mid(eq+1).stripWhiteSpace();
- ( *git ).insert( key, value );
- }
- return TRUE;
-}
diff --git a/noncore/games/kpacman/config.h b/noncore/games/kpacman/config.h
deleted file mode 100644
index 3c26b5d..0000000
--- a/noncore/games/kpacman/config.h
+++ b/dev/null
@@ -1,74 +0,0 @@
-/**********************************************************************
-** Copyright (C) 2000 Trolltech AS. All rights reserved.
-**
-** This file is part of Qt Designer.
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU General Public License version 2 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** See http://www.trolltech.com/gpl/ for GPL licensing information.
-**
-** Contact info@trolltech.com if any conditions of this licensing are
-** not clear to you.
-**
-**********************************************************************/
-
-#ifndef CONFIG_H
-#define CONFIG_H
-
-// ##### could use QSettings with Qt 3.0
-
-#include <qmap.h>
-#include <qstringlist.h>
-
-class ConfigPrivate;
-class Config
-{
-public:
- typedef QMap< QString, QString > ConfigGroup;
-
- enum Domain { File, User };
- Config( const QString &name, Domain domain=User );
- ~Config();
-
- bool isValid() const;
- bool hasKey( const QString &key ) const;
-
- void setGroup( const QString &gname );
- void writeEntry( const QString &key, const QString &value );
- void writeEntry( const QString &key, int num );
-#ifdef Q_HAS_BOOL_TYPE
- void writeEntry( const QString &key, bool b );
-#endif
- void writeEntry( const QString &key, const QStringList &lst, const QChar &sep );
-
- QString readEntry( const QString &key, const QString &deflt = QString::null );
- QString readEntryDirect( const QString &key, const QString &deflt = QString::null );
- int readNumEntry( const QString &key, int deflt = -1 );
- bool readBoolEntry( const QString &key, bool deflt = FALSE );
- QStringList readListEntry( const QString &key, const QChar &sep );
-
- void clearGroup();
-
- void write( const QString &fn = QString::null );
-
-protected:
- void read();
- bool parse( const QString &line );
-
- QMap< QString, ConfigGroup > groups;
- QMap< QString, ConfigGroup >::Iterator git;
- QString filename;
- QString lang;
- QString glang;
- bool changed;
- ConfigPrivate *d;
- static QString configFilename(const QString& name, Domain);
-};
-
-#endif
diff --git a/noncore/games/kpacman/keys.cpp b/noncore/games/kpacman/keys.cpp
index 8b17785..07ce135 100644
--- a/noncore/games/kpacman/keys.cpp
+++ b/noncore/games/kpacman/keys.cpp
@@ -1,203 +1,205 @@
#include "portable.h"
#if defined( KDE2_PORT )
#include <kapp.h>
#include <kconfig.h>
#include <klocale.h>
#include <kstddirs.h>
#include <kaccel.h>
#include <keys.h>
#include <keys.moc>
#elif defined( QPE_PORT )
#include <qaccel.h>
#include <qpe/qpeapplication.h>
-#include "config.h"
+#include <qpe/config.h>
#include "keys.h"
#endif
#include <qpushbt.h>
#include <qlabel.h>
#include <qframe.h>
#include <qkeycode.h>
#include <qpixmap.h>
#include <qstring.h>
Keys::Keys( QWidget *parent, const char *name)
: QDialog( parent, name, TRUE )
{
//KStandardDirs *dirs = KGlobal::dirs();
QPushButton *okButton = new QPushButton(this);
okButton->setText(tr("Ok"));
okButton->setFixedSize(okButton->size());
connect( okButton, SIGNAL(clicked()),this, SLOT(ok()) );
okButton->move(20,210);
QPushButton *defaultButton = new QPushButton(this);
defaultButton->setText(tr("Defaults"));
defaultButton->setFixedSize(defaultButton->size());
connect( defaultButton, SIGNAL(clicked()),this, SLOT(defaults()) );
defaultButton->move(140,210);
QPushButton *cancelButton = new QPushButton(this);
cancelButton->setText(tr("Cancel"));
cancelButton->setFixedSize(cancelButton->size());
connect( cancelButton, SIGNAL(clicked()),this, SLOT(reject()) );
cancelButton->move(260,210);
QFrame *separator = new QFrame(this);
separator->setFrameStyle( QFrame::HLine | QFrame::Sunken );
separator->setGeometry( 20, 190, 340, 4 );
for ( int x = 0; x < 4; x++) {
QLabel *l = new QLabel(this);
l->setAlignment(AlignCenter);
labels[x] = l;
}
labels[0]->setGeometry(120, 20, 140, 20 );
labels[1]->setGeometry(120,160, 140, 20 );
labels[2]->setGeometry( 20, 92, 100, 20 );
labels[3]->setGeometry(265, 92, 100, 20 );
QString pixPath;
QPushButton *up = new QPushButton(this);
pixPath = FIND_APP_DATA( "pics/up.xpm" );
up->setPixmap( QPixmap(pixPath));
up->setFixedSize(up->pixmap()->size());
connect( up, SIGNAL(clicked()),this, SLOT(butUp()) );
up->move(180, 50);
QPushButton *down = new QPushButton(this);
pixPath = FIND_APP_DATA( "pics/down.xpm");
down->setPixmap( QPixmap(pixPath));
down->setFixedSize(down->pixmap()->size());
connect( down, SIGNAL(clicked()),this, SLOT(butDown()) );
down->move(180, 130);
QPushButton *left = new QPushButton(this);
pixPath = FIND_APP_DATA( "pics/left.xpm");
left->setPixmap( QPixmap(pixPath));
left->setFixedSize(left->pixmap()->size());
connect( left, SIGNAL(clicked()),this, SLOT(butLeft()) );
left->move(140, 90);
QPushButton *right = new QPushButton(this);
pixPath = FIND_APP_DATA( "pics/right.xpm");
right->setPixmap( QPixmap(pixPath));
right->setFixedSize(right->pixmap()->size());
connect( right, SIGNAL(clicked()),this, SLOT(butRight()) );
right->move(220, 90);
setCaption(tr("Change Direction Keys"));
setFixedSize(380, 260);
lab = 0;
init();
}
void Keys::keyPressEvent( QKeyEvent *e )
{
uint kCode = e->key() & ~(SHIFT | CTRL | ALT);
QString string = KAccel::keyToString(kCode);
if (lab != 0) {
if ( string.isNull() )
lab->setText(tr("Undefined key"));
else
lab->setText(string);
}
else if ( lab == 0 && e->key() == Key_Escape)
reject();
}
void Keys::butUp()
{
getKey(0);
}
void Keys::butDown()
{
getKey(1);
}
void Keys::butLeft()
{
getKey(2);
}
void Keys::butRight()
{
getKey(3);
}
void Keys::getKey(int i)
{
if ( lab != 0)
focusOut(lab);
focusIn(labels[i]);
}
void Keys::focusOut(QLabel *l)
{
l->setFrameStyle( QFrame::NoFrame );
l->setBackgroundColor(backgroundColor());
l->repaint();
}
void Keys::focusIn(QLabel *l)
{
lab = l;
lab->setFrameStyle( QFrame::Panel | QFrame::Sunken );
lab->setBackgroundColor(white);
lab->repaint();
}
void Keys::defaults()
{
if ( lab != 0)
focusOut(lab);
lab = 0;
labels[0]->setText("Up");
labels[1]->setText("Down");
labels[2]->setText("Left");
labels[3]->setText("Right");
}
void Keys::init()
{
APP_CONFIG_BEGIN( cfg );
QString up("Up");
up = cfg->readEntry("upKey", (const char*) up);
labels[0]->setText(up);
QString down("Down");
down = cfg->readEntry("downKey", (const char*) down);
labels[1]->setText(down);
QString left("Left");
left = cfg->readEntry("leftKey", (const char*) left);
labels[2]->setText(left);
QString right("Right");
right = cfg->readEntry("rightKey", (const char*) right);
labels[3]->setText(right);
APP_CONFIG_END( cfg );
}
void Keys::ok()
{
+ /*
APP_CONFIG_BEGIN( cfg );
cfg->writeEntry("upKey", (const char*) labels[0]->text() );
cfg->writeEntry("downKey", (const char*) labels[1]->text() );
cfg->writeEntry("leftKey", (const char*) labels[2]->text() );
cfg->writeEntry("rightKey",(const char*) labels[3]->text() );
APP_CONFIG_END( cfg );
+ */
accept();
}
diff --git a/noncore/games/kpacman/kpacman.cpp b/noncore/games/kpacman/kpacman.cpp
index aee8eea..812e9ea 100644
--- a/noncore/games/kpacman/kpacman.cpp
+++ b/noncore/games/kpacman/kpacman.cpp
@@ -1,364 +1,368 @@
#include "portable.h"
#if defined( KDE2_PORT )
#include <kpacman.h>
#include <kpacman.moc>
#include <kcolordlg.h>
#elif defined( QPE_PORT )
#include <qmenubar.h>
-#include "config.h"
+#include <qpe/config.h>
#include <qapplication.h>
#include "kpacman.h"
#endif
#include <qkeycode.h>
#include <qcolor.h>
#include <qstring.h>
#include <qpopmenu.h>
#include <qmsgbox.h>
Kpacman::Kpacman(QWidget *parent, const char *name)
: KTMainWindow(parent, name)
{
schemesPopup = new QList<QPopupMenu>;
schemesPopup->setAutoDelete(TRUE);
menu();
m_view = new QWidget( this, "m_view" );
m_view->setBackgroundColor( black );
m_layout = new QGridLayout( m_view );
m_layout->setMargin( 7 );
view = new KpacmanWidget( this, QString(name)+"widget");
m_layout->addWidget( view, 0, 0 );
setCaption( "KPacman" );
view->referee->setFocus();
connect(view->referee, SIGNAL(setScore(int, int)),
view->score, SLOT(setScore(int, int)));
connect(view->referee, SIGNAL(setPoints(int)),
view->score, SLOT(set(int)));
connect(view->referee, SIGNAL(setLifes(int)),
view->status, SLOT(setLifes(int)));
connect(view->referee, SIGNAL(setLevel(int)),
view->status, SLOT(setLevel(int)));
connect(view->referee, SIGNAL(forcedHallOfFame(bool)),
this, SLOT(forcedHallOfFame(bool)));
connect(view->referee, SIGNAL(togglePaused()), this, SLOT(togglePaused()));
connect(view->referee, SIGNAL(toggleNew()), this, SLOT(toggleNew()));
connect(view->score, SIGNAL(toggleNew()), this, SLOT(toggleNew()));
connect(view->score, SIGNAL(forcedHallOfFame(bool)),
this, SLOT(forcedHallOfFame(bool)));
APP_CONFIG_BEGIN( cfg );
focusOutPause = !cfg->readBoolEntry("FocusOutPause", TRUE);
focusInContinue = !cfg->readBoolEntry("FocusInContinue", TRUE);
hideMouseCursor = !cfg->readBoolEntry("HideMouseCursor", TRUE);
APP_CONFIG_END( cfg );
toggleFocusOutPause();
toggleFocusInContinue();
toggleHideMouseCursor();
setCentralWidget( m_view );
}
Kpacman::~Kpacman()
{
- APP_CONFIG_BEGIN( cfg );
+ /* APP_CONFIG_BEGIN( cfg );
cfg->writeEntry("FocusOutPause", focusOutPause);
cfg->writeEntry("FocusInContinue", focusInContinue);
cfg->writeEntry("HideMouseCursor", hideMouseCursor);
APP_CONFIG_END( cfg );
+ */
delete _menuBar;
}
void Kpacman::menu()
{
gamePopup = new QPopupMenu();
CHECK_PTR( gamePopup );
newID = gamePopup->insertItem(tr("&New"), this, SLOT(newKpacman()),Key_F2);
pauseID = gamePopup->insertItem(tr("&Pause"),
this, SLOT(pauseKpacman()), Key_F3);
hofID = gamePopup->insertItem(tr("&Hall of fame"),
this, SLOT(toggleHallOfFame()), Key_F4);
gamePopup->insertSeparator();
gamePopup->insertItem(tr("&Quit"), this, SLOT(quitKpacman()), CTRL+Key_Q);
gamePopup->setCheckable(TRUE);
optionsPopup = new QPopupMenu();
CHECK_PTR(optionsPopup);
modesPopup = new QPopupMenu();
CHECK_PTR(modesPopup);
hideMouseCursorID = optionsPopup->insertItem(tr("&Hide Mousecursor"),
this, SLOT(toggleHideMouseCursor()),
CTRL+Key_H);
optionsPopup->insertSeparator();
if (lookupSchemes() > 0) {
optionsPopup->insertItem(tr("&Select graphic scheme"), modesPopup);
optionsPopup->insertSeparator();
}
focusOutPauseID = optionsPopup->insertItem(tr("&Pause in Background"),
this, SLOT(toggleFocusOutPause()));
focusInContinueID = optionsPopup->insertItem(tr("&Continue in Foreground"),
this, SLOT(toggleFocusInContinue()));
optionsPopup->insertSeparator();
optionsPopup->insertItem(tr("Change &keys..."), this, SLOT(confKeys()));
#ifndef QPE_PORT
QString aboutText = tr("@PACKAGE@ - @VERSION@\n\n"
"Joerg Thoennissen (joe@dsite.de)\n\n"
"A pacman game for the KDE Desktop\n\n"
"The program based on the source of ksnake\n"
"by Michel Filippi (mfilippi@sade.rhein-main.de).\n"
"The design was strongly influenced by the pacman\n"
"(c) 1980 MIDWAY MFG.CO.\n\n"
"I like to thank my girlfriend Elke Krueers for\n"
"the last 10 years of her friendship.\n");
aboutText.replace(QRegExp("@PACKAGE@"), PACKAGE);
aboutText.replace(QRegExp("@VERSION@"), VERSION);
QPopupMenu *helpPopup = helpMenu(aboutText, FALSE);
#endif
//_menuBar = new KMenuBar(this);
//CHECK_PTR( _menuBar );
//_menuBar->insertItem(tr("&Game"), gamePopup);
//_menuBar->insertItem(tr("&Options"), optionsPopup);
//_menuBar->insertSeparator();
#ifndef QPE_PORT
_menuBar->insertItem(tr("&Help"), helpPopup);
#endif
}
int Kpacman::lookupSchemes()
{
APP_CONFIG_BEGIN( cfg );
- int ModeCount = cfg->readNumEntry("ModeCount", -1);
- int Mode = cfg->readNumEntry("Mode", -1);
- int SchemeCount = cfg->readNumEntry("SchemeCount");
- int Scheme = cfg->readNumEntry("Scheme", -1);
+ int ModeCount = cfg->readNumEntry("ModeCount", 0);
+ int Mode = cfg->readNumEntry("Mode", 0);
+ int SchemeCount = cfg->readNumEntry("SchemeCount", 0);
+ int Scheme = cfg->readNumEntry("Scheme", 0);
+ /*
if (SchemeCount == 0 || Scheme == -1) {
QMessageBox::warning(this, tr("Configuration Error"),
tr("There are no schemes defined,\n"
"or no scheme is selected."));
APP_CONFIG_END( cfg );
return 0;
}
+ */
connect(modesPopup, SIGNAL(activated(int)), this, SLOT(schemeChecked(int)));
modeID.resize(ModeCount > 0 ? ModeCount : 0);
if (!schemesPopup->isEmpty())
schemesPopup->clear();
SAVE_CONFIG_GROUP( cfg, oldgroup );
QString ModeGroup;
QString ModeName;
for (int m = 0; m < ModeCount; m++) {
ModeGroup.sprintf("Mode %d", m);
cfg->setGroup(ModeGroup);
ModeName = cfg->readEntry("Description", ModeGroup);
QPopupMenu *p = new QPopupMenu;
p->setCheckable(TRUE);
connect(p, SIGNAL(activated(int)), this, SLOT(schemeChecked(int)));
schemesPopup->append(p);
modeID[m] = modesPopup->insertItem(ModeName, schemesPopup->at(m));
modesPopup->setItemEnabled(modeID[m], FALSE);
modesPopup->setItemChecked(modeID[m], m == Mode);
}
schemeID.resize(SchemeCount);
schemeMode.resize(SchemeCount);
QString SchemeGroup;
QString SchemeName;
int SchemeMode;
for (int i = 0; i < SchemeCount; i++) {
SchemeGroup.sprintf("Scheme %d", i);
cfg->setGroup(SchemeGroup);
SchemeName = cfg->readEntry("Description", SchemeGroup);
SchemeMode = cfg->readNumEntry("Mode", -1);
schemeMode[i] = SchemeMode;
if (SchemeMode == -1) {
schemeID[i] = modesPopup->insertItem(SchemeName);
modesPopup->setItemChecked(schemeID[i], i == Scheme);
} else {
schemeID[i] = schemesPopup->at(SchemeMode)->insertItem(SchemeName);
schemesPopup->at(SchemeMode)->
setItemChecked(schemeID[i], i == Scheme);
modesPopup->setItemEnabled(modeID[SchemeMode], TRUE);
}
}
RESTORE_CONFIG_GROUP( cfg, oldgroup );
APP_CONFIG_END( cfg );
return SchemeCount;
}
void Kpacman::quitKpacman()
{
APP_QUIT();
}
void Kpacman::newKpacman()
{
if (!gamePopup->isItemEnabled(hofID))
gamePopup->setItemEnabled(hofID, TRUE);
if (gamePopup->isItemChecked(hofID))
toggleHallOfFame();
if (gamePopup->isItemChecked(pauseID))
pauseKpacman();
view->referee->play();
}
void Kpacman::pauseKpacman()
{
view->referee->pause();
view->score->setPause(gamePopup->isItemChecked(pauseID));
}
void Kpacman::toggleHallOfFame()
{
gamePopup->setItemChecked(hofID, !gamePopup->isItemChecked(hofID));
view->referee->toggleHallOfFame();
if (gamePopup->isItemChecked(hofID)) {
view->referee->lower();
view->status->lower();
} else {
view->status->raise();
view->referee->raise();
view->referee->setFocus();
}
}
/*
* Disable or enable the "Hall of fame"-menuitem if the referee says so.
* This is done, to disable turning off the "hall of fame"-display, in the automated
* sequence of displaying the introduction, the demonstration (or playing) and the
* hall of fame.
* If on == TRUE then also lower the referee and the status widgets.
*/
void Kpacman::forcedHallOfFame(bool on)
{
if (!on && !gamePopup->isItemChecked(hofID))
return;
gamePopup->setItemEnabled(hofID, !on);
gamePopup->setItemChecked(hofID, on);
view->referee->toggleHallOfFame();
if (on) {
view->referee->lower();
view->status->lower();
} else {
view->status->raise();
view->referee->raise();
view->referee->setFocus();
view->referee->intro();
}
}
void Kpacman::togglePaused()
{
static bool checked = FALSE;
checked = !checked;
gamePopup->setItemChecked( pauseID, checked );
view->score->setPause(gamePopup->isItemChecked(pauseID));
}
/*
* This disables the "New Game" menuitem to prevent interruptions of the current
* play.
*/
void Kpacman::toggleNew()
{
gamePopup->setItemEnabled(newID, !gamePopup->isItemEnabled(newID));
}
void Kpacman::toggleHideMouseCursor()
{
hideMouseCursor = !hideMouseCursor;
optionsPopup->setItemChecked(hideMouseCursorID, hideMouseCursor);
if (hideMouseCursor)
view->setCursor(blankCursor);
else
view->setCursor(arrowCursor);
}
void Kpacman::toggleFocusOutPause()
{
focusOutPause = !focusOutPause;
optionsPopup->setItemChecked(focusOutPauseID, focusOutPause);
view->referee->setFocusOutPause(focusOutPause);
}
void Kpacman::toggleFocusInContinue()
{
focusInContinue = !focusInContinue;
optionsPopup->setItemChecked(focusInContinueID, focusInContinue);
view->referee->setFocusInContinue(focusInContinue);
}
void Kpacman::confKeys()
{
Keys *keys = new Keys();
if (keys->exec() == QDialog::Accepted) {
view->referee->initKeys();
view->score->initKeys();
}
delete keys;
}
void Kpacman::schemeChecked(int id)
{
int mode = 0, scheme = -1;
for (uint s = 0; s < schemeID.size(); s++) {
if (schemeID[s] == id) {
scheme = s;
mode = schemeMode[s];
}
if (schemeMode[s] == -1) {
modesPopup->setItemChecked(schemeID[s], schemeID[s] == id);
} else {
modesPopup->setItemChecked(modeID[schemeMode[s]], schemeMode[s] == mode);
schemesPopup->at(schemeMode[s])->setItemChecked(schemeID[s], schemeID[s] == id);
}
}
-
+ /*
APP_CONFIG_BEGIN( cfg );
cfg->writeEntry("Scheme", scheme);
cfg->writeEntry("Mode", mode);
APP_CONFIG_END( cfg );
+ */
view->setScheme(scheme, mode);
view->updateGeometry();
updateGeometry();
update();
repaint(TRUE);
show();
}
diff --git a/noncore/games/kpacman/kpacman.pro b/noncore/games/kpacman/kpacman.pro
index e193ebc..81d369a 100644
--- a/noncore/games/kpacman/kpacman.pro
+++ b/noncore/games/kpacman/kpacman.pro
@@ -1,63 +1,61 @@
TEMPLATE = app
#CONFIG = qt warn_on debug
CONFIG = qt warn_on release
#TMAKE_CXXFLAGS +=
HEADERS = kpacmanwidget.h \
referee.h \
status.h \
painter.h \
score.h \
pacman.h \
monster.h \
keys.h \
fruit.h \
energizer.h \
board.h \
bitfont.h \
kpacman.h \
bitmaps.h \
colors.h \
- config.h \
portable.h
SOURCES = kpacmanwidget.cpp \
referee.cpp \
status.cpp \
painter.cpp \
score.cpp \
pacman.cpp \
monster.cpp \
keys.cpp \
fruit.cpp \
energizer.cpp \
board.cpp \
bitfont.cpp \
kpacman.cpp \
- config.cpp \
main.cpp
INCLUDEPATH += $(OPIEDIR)/include
DEPENDPATH += $(OPIEDIR)/include
LIBS += -lqpe
DESTDIR = $(OPIEDIR)/bin
TARGET = kpacman
TRANSLATIONS = ../../../i18n/de/kpacman.ts \
../../../i18n/nl/kpacman.ts \
../../../i18n/da/kpacman.ts \
../../../i18n/xx/kpacman.ts \
../../../i18n/en/kpacman.ts \
../../../i18n/es/kpacman.ts \
../../../i18n/fr/kpacman.ts \
../../../i18n/hu/kpacman.ts \
../../../i18n/ja/kpacman.ts \
../../../i18n/ko/kpacman.ts \
../../../i18n/no/kpacman.ts \
../../../i18n/pl/kpacman.ts \
../../../i18n/pt/kpacman.ts \
../../../i18n/pt_BR/kpacman.ts \
../../../i18n/sl/kpacman.ts \
../../../i18n/zh_CN/kpacman.ts \
../../../i18n/zh_TW/kpacman.ts
include ( $(OPIEDIR)/include.pro )
diff --git a/noncore/games/kpacman/kpacmanwidget.cpp b/noncore/games/kpacman/kpacmanwidget.cpp
index cf2aed9..823d2bf 100644
--- a/noncore/games/kpacman/kpacmanwidget.cpp
+++ b/noncore/games/kpacman/kpacmanwidget.cpp
@@ -1,158 +1,158 @@
#include "portable.h"
#if defined( KDE2_PORT )
#include <kapp.h>
#include <kconfig.h>
#include <kstddirs.h>
#include <kpacmanwidget.h>
#include <kpacmanwidget.moc>
#elif defined( QPE_PORT )
#include <qpe/qpeapplication.h>
-#include "config.h"
+#include <qpe/config.h>
#include "kpacmanwidget.h"
#endif
#include <qmessagebox.h>
#include "bitfont.h"
#include "score.h"
#include "referee.h"
#include "status.h"
KpacmanWidget::KpacmanWidget( QWidget *parent, const char *name)
: QWidget( parent, name )
{
score = 0l;
referee = 0l;
status = 0l;
bitfont = NULL;
fontName = "";
scheme = mode = -1;
confScheme();
score = new Score(this, name, scheme, mode, bitfont);
referee = new Referee( this, name, scheme, mode, bitfont);
status = new Status(this, name, scheme, mode);
setBackgroundColor( black );
}
KpacmanWidget::~KpacmanWidget()
{
}
void KpacmanWidget::confMisc(bool defGroup)
{
APP_CONFIG_BEGIN( cfg );
//KStandardDirs *dirs = KGlobal::dirs();
QString findPath;
if (defGroup || cfg->hasKey("Font")) {
fontName = cfg->readEntry("Font");
if (fontName.left(1) != "/" && fontName.left(1) != "~")
fontName.insert(0, "fonts/");
if (fontName.right(1) == "/")
fontName.append("font.xbm");
//findPath = dirs->findResource("appdata", fontName);
findPath = FIND_APP_DATA( fontName );
if (!findPath.isEmpty())
fontName = findPath;
bitfontFirstChar = cfg->readNumEntry("FontFirstChar", 0x0e);
bitfontLastChar = cfg->readNumEntry("FontLastChar", 0x5f);
}
APP_CONFIG_END( cfg );
}
void KpacmanWidget::confScheme()
{
APP_CONFIG_BEGIN( cfg );
QString lastFontName = fontName;
SAVE_CONFIG_GROUP( cfg, oldgroup );
QString newgroup;
// if not set, read mode and scheme from the configfile
if (mode == -1 && scheme == -1) {
scheme = cfg->readNumEntry("Scheme", -1);
mode = cfg->readNumEntry("Mode", -1);
// if mode is not set in the defGroup-group, lookup the scheme group
if (scheme != -1 || mode == -1) {
newgroup.sprintf("Scheme %d", scheme);
cfg->setGroup(newgroup);
mode = cfg->readNumEntry("Mode", -1);
RESTORE_CONFIG_GROUP( cfg, oldgroup );
}
}
confMisc();
if (mode != -1) {
newgroup.sprintf("Mode %d", mode);
cfg->setGroup(newgroup);
confMisc(FALSE);
}
if (scheme != -1) {
newgroup.sprintf("Scheme %d", scheme);
cfg->setGroup(newgroup);
confMisc(FALSE);
}
if (lastFontName != fontName) {
if (bitfont != 0)
delete bitfont;
bitfont = new Bitfont(fontName, bitfontFirstChar, bitfontLastChar);
if (bitfont->width() == 0 || bitfont->height() == 0) {
QString msg = tr("The bitfont could not be contructed.\n\n"
"The file '@FONTNAME@' does not exist,\n"
"or is of an unknown format.");
msg.replace(QRegExp("@FONTNAME@"), fontName);
// QMessageBox::critical(this, tr("Initialization Error"), msg);
printf("%s\n", msg.data());
}
}
RESTORE_CONFIG_GROUP( cfg, oldgroup );
APP_CONFIG_END( cfg );
}
void KpacmanWidget::setScheme(int Scheme, int Mode)
{
mode = Mode;
scheme = Scheme;
confScheme();
score->setScheme(Scheme, Mode, bitfont);
referee->setScheme(Scheme, Mode, bitfont);
status->setScheme(Scheme, Mode);
score->repaint(FALSE);
referee->repaint(FALSE);
status->repaint(FALSE);
}
void KpacmanWidget::resizeEvent( QResizeEvent * )
{
qWarning("Resize");
referee->setGeometry(0, bitfont->height()*3, referee->width(), referee->height());
referee->setBackgroundColor(BLACK);
if(!status ) return;
status->setGeometry(0, bitfont->height()*3+referee->height(), referee->width(),
status->height());
status->setBackgroundColor(BLACK);
score->setGeometry(0, 0, referee->width(), bitfont->height()*3+referee->height()+status->height());
score->setBackgroundColor(BLACK);
}
diff --git a/noncore/games/kpacman/painter.cpp b/noncore/games/kpacman/painter.cpp
index 80aeab0..d8c7460 100644
--- a/noncore/games/kpacman/painter.cpp
+++ b/noncore/games/kpacman/painter.cpp
@@ -1,972 +1,972 @@
#include "portable.h"
#if defined( KDE2_PORT )
#include <kapp.h>
#include <kconfig.h>
#include <kstddirs.h>
#elif defined( QPE_PORT )
#include <qpe/qpeapplication.h>
-#include "config.h"
+#include <qpe/config.h>
#endif
#include <qcolor.h>
#include <qpainter.h>
#include <qpixmap.h>
#include <qbitmap.h>
#include <qrect.h>
#include <qstring.h>
#include <qmessagebox.h>
#include <qfileinfo.h>
#include "painter.h"
#include "board.h"
Painter::Painter( Board *b, QWidget *parent, int Scheme, int Mode, Bitfont *font)
{
w = parent;
board = b;
pointPix = NULL;
wallPix = NULL;
prisonPix = NULL;
energizerPix = NULL;
fruitPix = NULL;
pacmanPix = NULL;
dyingPix = NULL;
eyesPix = NULL;
monsterPix = NULL;
fruitScorePix = NULL;
monsterScorePix = NULL;
lastPointPixmapName = "";
lastWallPixmapName = "";
lastPrisonPixmapName = "";
lastEnergizerPixmapName = "";
lastFruitPixmapName = "";
lastPacmanPixmapName = "";
lastDyingPixmapName = "";
lastEyesPixmapName = "";
lastMonsterPixmapName = "";
lastFruitScorePixmapName = "";
lastMonsterScorePixmapName = "";
bitfont = font;
scheme = Scheme;
mode = Mode;
level = 0;
confScheme();
}
QList<QPixmap> *Painter::loadPixmap(QWidget*, QString pixmapName,
QList<QPixmap> *pixmaps)
{
if (pixmaps == NULL) {
pixmaps = new QList<QPixmap>;
pixmaps->setAutoDelete(TRUE);
}
if (!pixmaps->isEmpty())
pixmaps->clear();
QPixmap PIXMAP(pixmapName);
if (PIXMAP.isNull() || PIXMAP.mask() == NULL) {
QString msg = "The pixmap could not be contructed.\n\n"
"The file '@PIXMAPNAME@' does not exist,\n"
"or is of an unknown format.";
msg.replace(QRegExp("@PIXMAPNAME@"), pixmapName);
// QMessageBox::critical(parent, tr("Initialization Error"), msg);
printf("%s\n", msg.data());
return 0;
}
int height = PIXMAP.height();
int width = (height == 0) ? 0 : PIXMAP.width()/(PIXMAP.width()/height);
QBitmap BITMAP;
QBitmap MASK;
BITMAP = *PIXMAP.mask();
MASK.resize(width, height);
for (int x = 0; x < PIXMAP.width()/width; x++) {
QPixmap *pixmap = new QPixmap(width, height);
pixmaps->append(pixmap);
bitBlt(pixmap, 0, 0, &PIXMAP, x*width, 0, width, height, QPixmap::CopyROP, TRUE);
bitBlt(&MASK, 0, 0, &BITMAP, x*width, 0, width, height, QPixmap::CopyROP, TRUE);
pixmap->setMask(MASK);
}
return pixmaps;
}
QList<QPixmap> *Painter::textPixmap(QStrList &str, QList<QPixmap> *pixmaps,
QColor fg, QColor bg)
{
if (pixmaps == NULL) {
pixmaps = new QList<QPixmap>;
pixmaps->setAutoDelete(TRUE);
}
if (!pixmaps->isEmpty())
pixmaps->clear();
for (uint s = 0; s < str.count(); s++) {
QPixmap *pixmap = new QPixmap(bitfont->text(str.at(s), fg, bg));
pixmaps->append(pixmap);
}
return pixmaps;
}
QList<QPixmap> *Painter::textPixmap(QString str, QList<QPixmap> *pixmaps,
QColor fg, QColor bg)
{
if (pixmaps == NULL) {
pixmaps = new QList<QPixmap>;
pixmaps->setAutoDelete(TRUE);
}
if (!pixmaps->isEmpty())
pixmaps->clear();
QPixmap *pixmap = new QPixmap(bitfont->text(str, fg, bg));
pixmaps->append(pixmap);
return pixmaps;
}
/* Return the point of the upperleft pixel of the block representing that position
* on the board.
*/
QPoint Painter::point(int pos)
{
return QPoint((board->x(pos)-1)*BlockWidth, (board->y(pos)-1)*BlockHeight);
}
QRect Painter::rect(int pos, PixMap pix, uint i)
{
if (pos == OUT)
return QRect();
QPixmap *PIXMAP = NULL;
switch (pix) {
case PacmanPix : PIXMAP = pacmanPix->
at(checkRange(i, pacmanPix->count()-1));
break;
case DyingPix : PIXMAP = dyingPix->
at(checkRange(i, dyingPix->count()-1));
break;
case MonsterPix : PIXMAP = monsterPix->
at(checkRange(i, monsterPix->count()-1));
break;
case EyesPix : PIXMAP = eyesPix->
at(checkRange(i, eyesPix->count()-1));
break;
case FruitPix : PIXMAP = fruitPix->
at(checkRange(i, fruitPix->count()-1));
break;
case PointPix : PIXMAP = pointPix->
at(checkRange(i, pointPix->count()-1));
break;
case EnergizerPix : PIXMAP = energizerPix->
at(checkRange(i, energizerPix->count()-1));
break;
case FruitScorePix : PIXMAP = fruitScorePix->
at(checkRange(i, fruitScorePix->count()-1));
break;
case MonsterScorePix : PIXMAP = monsterScorePix->
at(checkRange(i,monsterScorePix->count()-1));
break;
default : PIXMAP = wallPix->
at(checkRange(i, wallPix->count()-1));
}
if (PIXMAP == NULL)
return QRect();
QRect rect = PIXMAP->rect();
QPoint point = this->point(pos);
rect.moveCenter(QPoint(point.x()-1, point.y()-1));
return rect;
}
QRect Painter::rect(int pos, QString str, int align)
{
if (pos == OUT) // return an empty rect if the position
return QRect(); // is invalid
QPoint point = this->point(pos);
QRect rect = bitfont->rect(str);
rect.moveCenter(QPoint(point.x()-1, point.y()-1));
int dx = 0;
int dy = 0;
if (align & QLabel::AlignLeft || align & QLabel::AlignRight) {
dx = (str.length()-1) * (bitfont->width()/2);
if (align & QLabel::AlignRight)
dx *= -1;
}
if (align & QLabel::AlignTop || align & QLabel::AlignBottom) {
dy = bitfont->height()/2;
if (align & QLabel::AlignBottom)
dy *= -1;
}
if (dx != 0 || dy != 0)
rect.moveBy(dx, dy);
return rect;
}
QRect Painter::rect(QRect r1, QRect r2)
{
QRect rect;
rect.setLeft(r1.left() < r2.left() ? r1.left() : r2.left());
rect.setTop(r1.top() < r2.top() ? r1.top() : r2.top());
rect.setRight(r1.right() > r2.right() ? r1.right() : r2.right());
rect.setBottom(r1.bottom() > r2.bottom() ? r1.bottom() : r2.bottom());
return rect;
}
void Painter::erase(int pos, PixMap pix, uint i)
{
if (pos == OUT)
return;
QRect rect = this->rect(pos, pix, i);
bitBlt(&roomPix, rect.x(), rect.y(), &backPix,
rect.x(), rect.y(), rect.width(), rect.height());
}
int Painter::maxPixmaps(PixMap pix)
{
switch (pix) {
case WallPix : return (int) wallPix->count();
case PrisonPix : return (int) prisonPix->count();
case PointPix : return (int) pointPix->count();
case EnergizerPix : return (int) energizerPix->count();
case FruitPix : return (int) fruitPix->count();
case PacmanPix : return (int) pacmanPix->count();
case DyingPix : return (int) dyingPix->count();
case EyesPix : return (int) eyesPix->count();
case MonsterPix : return (int) monsterPix->count();
case FruitScorePix : return (int) fruitScorePix->count();
case MonsterScorePix : return (int) monsterScorePix->count();
default : return 0;
}
}
void Painter::draw(QPoint point, DrawWidget where, QPixmap pix)
{
switch (where) {
case Widget : bitBlt(w, point.x(), point.y(), &pix);
break;
case RoomPix : bitBlt(&roomPix, point.x(), point.y(), &pix);
break;
case BackPix : bitBlt(&backPix, point.x(), point.y(), &pix);
break;
}
}
void Painter::draw(QRect rect, DrawWidget where, QPixmap pix)
{
draw(QPoint(rect.x(), rect.y()), where, pix);
}
void Painter::draw(int pos, DrawWidget where, PixMap pix, uint i)
{
QPixmap *PIXMAP = NULL;
switch (pix) {
case PacmanPix : PIXMAP = pacmanPix->
at(checkRange(i, pacmanPix->count()-1));
break;
case DyingPix : PIXMAP = dyingPix->
at(checkRange(i, dyingPix->count()-1));
break;
case MonsterPix : PIXMAP = monsterPix->
at(checkRange(i, monsterPix->count()-1));
break;
case EyesPix : PIXMAP = eyesPix->
at(checkRange(i, eyesPix->count()-1));
break;
case FruitPix : PIXMAP = fruitPix->
at(checkRange(i, fruitPix->count()-1));
break;
case EnergizerPix : PIXMAP = energizerPix->
at(checkRange(i, energizerPix->count()-1));
break;
case FruitScorePix : PIXMAP = fruitScorePix->
at(checkRange(i, fruitScorePix->count()-1));
break;
case MonsterScorePix : PIXMAP = monsterScorePix->
at(checkRange(i,monsterScorePix->count()-1));
break;
default : ;
}
if (PIXMAP == NULL)
return;
QRect rect = PIXMAP->rect();
QPoint point = this->point(pos);
rect.moveCenter(QPoint(point.x()-1, point.y()-1));
switch (where) {
case Widget : bitBlt(w, rect.x(), rect.y(), PIXMAP);
break;
case RoomPix : bitBlt(&roomPix, rect.x(), rect.y(), PIXMAP);
break;
case BackPix : bitBlt(&backPix, rect.x(), rect.y(), PIXMAP);
break;
}
}
QPixmap Painter::draw(int pos, DrawWidget where,
QString str, QColor fg, QColor bg, int align)
{
QPixmap TEXT = bitfont->text(str, fg, bg);
QRect rect = this->rect(pos, str, align);
QPixmap SAVE = QPixmap(rect.width(), rect.height());
switch (where) {
case Widget : bitBlt(&SAVE, 0, 0, w, rect.x(), rect.y());
bitBlt(w, rect.x(), rect.y(), &TEXT);
break;
case RoomPix : bitBlt(&SAVE, 0, 0, &roomPix, rect.x(), rect.y());
bitBlt(&roomPix, rect.x(), rect.y(), &TEXT);
break;
case BackPix : bitBlt(&SAVE, 0, 0, &backPix, rect.x(), rect.y());
bitBlt(&backPix, rect.x(), rect.y(), &TEXT);
break;
}
return SAVE;
}
QRect Painter::draw(int col, int row, DrawWidget where,
QString str, QColor fg, QColor bg, int align)
{
QPixmap TEXT = bitfont->text(str, fg, bg);
QRect rect = this->rect(row*BoardWidth+col, str, align);
draw(rect, where, TEXT);
return rect;
}
void Painter::initPixmaps()
{
if (lastPointPixmapName != pointPixmapName.at(level)) {
pointPix = loadPixmap(w, pointPixmapName.at(level), pointPix);
lastPointPixmapName = pointPixmapName.at(level);
}
if (lastPrisonPixmapName != prisonPixmapName.at(level)) {
prisonPix = loadPixmap(w, prisonPixmapName.at(level), prisonPix);
lastPrisonPixmapName = prisonPixmapName.at(level);
}
if (lastEnergizerPixmapName != energizerPixmapName.at(level)) {
energizerPix = loadPixmap(w, energizerPixmapName.at(level), energizerPix);
lastEnergizerPixmapName = energizerPixmapName.at(level);
}
if (lastFruitPixmapName != fruitPixmapName.at(level)) {
fruitPix = loadPixmap(w, fruitPixmapName.at(level), fruitPix);
lastFruitPixmapName = fruitPixmapName.at(level);
}
if (lastPacmanPixmapName != pacmanPixmapName.at(level)) {
pacmanPix = loadPixmap(w, pacmanPixmapName.at(level), pacmanPix);
lastPacmanPixmapName = pacmanPixmapName.at(level);
}
if (lastDyingPixmapName != dyingPixmapName.at(level)) {
dyingPix = loadPixmap(w, dyingPixmapName.at(level), dyingPix);
lastDyingPixmapName = dyingPixmapName.at(level);
}
if (lastEyesPixmapName != eyesPixmapName.at(level)) {
eyesPix = loadPixmap(w, eyesPixmapName.at(level), eyesPix);
lastEyesPixmapName = eyesPixmapName.at(level);
}
if (lastMonsterPixmapName != monsterPixmapName.at(level)) {
monsterPix = loadPixmap(w, monsterPixmapName.at(level), monsterPix);
lastMonsterPixmapName = monsterPixmapName.at(level);
}
if (lastFruitScorePixmapName != fruitScorePixmapName.at(level) ||
(const char *) *fruitScorePixmapName.at(level) == '\0') {
if ((const char *) *fruitScorePixmapName.at(level) == '\0') {
fruitScorePix = textPixmap(fruitScoreString, fruitScorePix, PINK);
} else {
fruitScorePix = loadPixmap(w, fruitScorePixmapName.at(level),
fruitScorePix);
lastFruitScorePixmapName = fruitScorePixmapName.at(level);
}
}
if (lastMonsterScorePixmapName != monsterScorePixmapName.at(level) ||
(const char *) *monsterScorePixmapName.at(level) == '\0') {
if ((const char *) *monsterScorePixmapName.at(level) == '\0') {
monsterScorePix = textPixmap(monsterScoreString, monsterScorePix, CYAN);
} else {
monsterScorePix = loadPixmap(w, monsterScorePixmapName.at(level),
monsterScorePix);
lastMonsterScorePixmapName = monsterScorePixmapName.at(level);
}
}
if (lastWallPixmapName != wallPixmapName.at(level)) {
wallPix = loadPixmap(w, wallPixmapName.at(level), wallPix);
if (wallPix->isEmpty()) {
BlockWidth = 0;
BlockHeight = 0;
} else {
BlockWidth = wallPix->at(0)->width();
BlockHeight = wallPix->at(0)->height();
}
lastWallPixmapName = wallPixmapName.at(level);
}
}
void Painter::initbackPixmaps()
{
backgroundColor = BLACK;
backPix.resize((BoardWidth-3)*BlockWidth, (BoardHeight-3)*BlockHeight );
backPix.fill(backgroundColor);
}
void Painter::initRoomPixmap()
{
roomPix.resize((BoardWidth-3)*BlockWidth, (BoardHeight-3)*BlockHeight );
bitBlt(&roomPix,0,0, &backPix);
for (unsigned int x = 0; x < board->size(); x++) {
if (board->isBrick(x))
drawBrick(x);
if (board->isPrison(x) || board->isGate(x))
drawPrison(x);
if (board->isPoint(x))
drawPoint(x);
}
}
void Painter::drawBrick(int pos)
{
int border = 0;
if (board->isBrick(board->move(pos, N ))) border |= (1 << 0);
if (board->isBrick(board->move(pos, NE))) border |= (1 << 1);
if (board->isBrick(board->move(pos, E ))) border |= (1 << 2);
if (board->isBrick(board->move(pos, SE))) border |= (1 << 3);
if (board->isBrick(board->move(pos, S ))) border |= (1 << 4);
if (board->isBrick(board->move(pos, SW))) border |= (1 << 5);
if (board->isBrick(board->move(pos, W ))) border |= (1 << 6);
if (board->isBrick(board->move(pos, NW))) border |= (1 << 7);
if (board->isOut(board->move(pos, N ))) border |= (1 << 8);
if (board->isOut(board->move(pos, NE))) border |= (1 << 9);
if (board->isOut(board->move(pos, E ))) border |= (1 << 10);
if (board->isOut(board->move(pos, SE))) border |= (1 << 11);
if (board->isOut(board->move(pos, S ))) border |= (1 << 12);
if (board->isOut(board->move(pos, SW))) border |= (1 << 13);
if (board->isOut(board->move(pos, W ))) border |= (1 << 14);
if (board->isOut(board->move(pos, NW))) border |= (1 << 15);
switch (border & 0xFF) {
case 31 : border = 0; break;
case 159 : border = 0; break;
case 63 : border = 0; break;
case 191 : border = 0; break;
case 241 : border = 1; break;
case 249 : border = 1; break;
case 243 : border = 1; break;
case 251 : border = 1; break;
case 124 : border = 2; break;
case 252 : border = 2; break;
case 126 : border = 2; break;
case 199 : border = 3; break;
case 231 : border = 3; break;
case 207 : border = 3; break;
case 28 : if ((border >> 8) > 0)
border = 24;
else
border = 4;
break;
case 112 : if ((border >> 8) > 0)
border = 27;
else
border = 5;
break;
case 7 : if ((border >> 8) > 0)
border = 25;
else
border = 6;
break;
case 193 : if ((border >> 8) > 0)
border = 26;
else
border = 7;
break;
case 247 : if ((border & (1 << 11)) > 0)
border = 23;
else
border = 8;
break;
case 119 : if ((border & (1 << 15)) > 0)
border = 8;
if ((border & (1 << 11)) > 0)
border = 11;
break;
case 223 : if ((border & (1 << 13)) > 0)
border = 20;
else
border = 9;
break;
case 221 : if ((border & (1 << 13)) > 0)
border = 10;
if ((border & (1 << 9)) > 0)
border = 9;
break;
case 253 : if ((border & (1 << 9)) > 0)
border = 21;
else
border = 10;
break;
case 127 : if ((border & (1 << 15)) > 0)
border = 22;
else
border = 11;
break;
case 30 : border = 12; break;
case 240 : border = 13; break;
case 15 : border = 14; break;
case 225 : border = 15; break;
case 135 : border = 16; break;
case 195 : border = 17; break;
case 60 : border = 18; break;
case 120 : border = 19; break;
case 255 : border = 28; break;
default : border = -1;
}
if (border != -1 && border < (int) wallPix->count()) {
QRect rect = this->rect(pos, WallPix);
bitBlt(&roomPix, rect.x(), rect.y(), wallPix->at((uint) border));
}
}
void Painter::drawPrison(int pos)
{
int border = 0;
if (board->isPrison(board->move(pos, N ))) border |= (1 << 0);
if (board->isPrison(board->move(pos, NE))) border |= (1 << 1);
if (board->isPrison(board->move(pos, E ))) border |= (1 << 2);
if (board->isPrison(board->move(pos, SE))) border |= (1 << 3);
if (board->isPrison(board->move(pos, S ))) border |= (1 << 4);
if (board->isPrison(board->move(pos, SW))) border |= (1 << 5);
if (board->isPrison(board->move(pos, W ))) border |= (1 << 6);
if (board->isPrison(board->move(pos, NW))) border |= (1 << 7);
if (board->isGate(board->move(pos, N ))) border |= (1 << 8);
if (board->isGate(board->move(pos, NE))) border |= (1 << 9);
if (board->isGate(board->move(pos, E ))) border |= (1 << 10);
if (board->isGate(board->move(pos, SE))) border |= (1 << 11);
if (board->isGate(board->move(pos, S ))) border |= (1 << 12);
if (board->isGate(board->move(pos, SW))) border |= (1 << 13);
if (board->isGate(board->move(pos, W ))) border |= (1 << 14);
if (board->isGate(board->move(pos, NW))) border |= (1 << 15);
switch (border & 0xFF) {
case 31 : border = 0; break;
case 159 : border = 0; break;
case 63 : border = 0; break;
case 241 : border = 1; break;
case 249 : border = 1; break;
case 243 : border = 1; break;
case 124 : border = 2; break;
case 252 : border = 2; break;
case 126 : border = 2; break;
case 199 : border = 3; break;
case 231 : border = 3; break;
case 207 : border = 3; break;
case 28 : if ((border >> 8) != 0)
border = 12;
else
border = 4;
break;
case 112 : if ((border >> 8) != 0)
border = 13;
else
border = 5;
break;
case 7 : if ((border >> 8) != 0)
border = 14;
else
border = 6;
break;
case 193 : if ((border >> 8) != 0)
border = 15;
else
border = 7;
break;
case 247 : border = 8; break;
case 223 : border = 9; break;
case 253 : border = 10; break;
case 127 : border = 11; break;
default : border = -1;
}
if (board->isGate(pos)) {
if (board->isGate(board->move(pos, N)))
border = 17;
else
border = 16;
}
if (border != -1 && border < (int) prisonPix->count()) {
QRect rect = this->rect(pos, PrisonPix);
bitBlt(&roomPix, rect.x(), rect.y(), prisonPix->at((uint) border));
}
}
void Painter::drawPoint(int pos)
{
if (!pointPix->isEmpty()) {
QRect rect = this->rect(pos, PointPix);
bitBlt(&roomPix, rect.x(), rect.y(), pointPix->at(0));
}
}
QString Painter::decodeHexOctString(QString s)
{
QString value;
QString valids;
int pos, xpos = 0, opos = 0;
int v, len, leadin;
const char *ptr;
uchar c;
while (((xpos = s.find(QRegExp("\\\\x[0-9a-fA-F]+"), xpos)) != -1) ||
((opos = s.find(QRegExp("\\\\[0-7]+"), opos)) != -1)) {
if (xpos != -1) {
valids = "0123456789abcdef";
leadin = 2;
pos = xpos;
} else {
valids = "01234567";
leadin = 1;
pos = opos;
}
c = '\0';
len = 0;
value = s.mid(pos+leadin, 3);
ptr = (const char *) value;
while (*ptr != '\0' && (v = valids.find(*ptr++, 0, FALSE)) != -1) {
c = (c * valids.length()) + v;
len++;
}
value.fill(c, 1);
s.replace(pos, len+leadin, value);
}
return s;
}
void Painter::fillScoreString(QStrList &list, QArray<int> &values)
{
if( !list.isEmpty())
list.clear();
QString s;
for (uint i = 0; i < values.size(); i++) {
if (values[i] < 10 || values[i] > 10000)
s = "?";
else if (values[i] == 1600)
s = "\x1a\x1b";
else if (values[i] < 100) {
s = "\x0e";
s.insert(0, char (values[i] / 10 + 0x10));
} else if (values[i] < 1000) {
s = "\x0f";
s.insert(0, char (values[i] / 100 + 0x10));
} else {
s = "\x0f\x10";
s.insert(0, char (values[i] / 1000 + 0x10));
}
list.append(s.data());
}
}
void Painter::fillArray(QArray<int> &array, QString values, int max)
{
array.resize(max);
int last = 0;
bool ok;
QString value;
for (uint i = 0; i < array.size(); i++) {
if (values.find(',') < 0 && values.length() > 0) {
value = values;
values = "";
}
if (values.find(',') >= 0) {
value = values.left(values.find(','));
values.remove(0,values.find(',')+1);
}
array[i] = value.toInt(&ok);
if (ok)
last = array[i];
else
array[i] = last;
}
}
void Painter::fillStrList(QStrList &list, QString values, int max)
{
if (!list.isEmpty())
list.clear();
QString last = "";
QString value;
for (uint i = 0; i < (uint) max; i++) {
if (values.find(',') < 0 && values.length() > 0) {
value = values;
values = "";
}
if (values.find(',') >= 0) {
value = values.left(values.find(','));
values.remove(0,values.find(',')+1);
}
if (!value.isEmpty())
last = decodeHexOctString(value);
list.append(last);
}
}
void Painter::fillPixmapName(QStrList &pixmapName)
{
QStrList list = pixmapName;
if (!pixmapName.isEmpty())
pixmapName.clear();
QString pixmap;
QFileInfo fileInfo;
for (uint i = 0; i < list.count(); i++) {
pixmap = list.at(i);
if (pixmap.left(1) != "/" && pixmap.left(1) != "~")
pixmap = FIND_APP_DATA( pixmapDirectory+pixmap );
fileInfo.setFile(pixmap);
if (!fileInfo.isReadable() || !fileInfo.isFile())
pixmap = "";
pixmapName.append(pixmap);
}
}
void Painter::confLevels(bool defGroup)
{
APP_CONFIG_BEGIN( cfg );
if (defGroup || cfg->hasKey("Levels"))
maxLevel = cfg->readNumEntry("Levels", 13);
APP_CONFIG_END( cfg );
}
void Painter::confMisc(bool defGroup)
{
APP_CONFIG_BEGIN( cfg );
if (defGroup || cfg->hasKey("PixmapDirectory")) {
pixmapDirectory = cfg->readEntry("PixmapDirectory");
if (pixmapDirectory.left(1) != "/" && pixmapDirectory.left(1) != "~")
pixmapDirectory.insert(0, "pics/");
if (pixmapDirectory.right(1) != "/")
pixmapDirectory.append("/");
}
if (defGroup || cfg->hasKey("PointPixmapName"))
fillStrList(pointPixmapName,
cfg->readEntry("PointPixmapName", "point.xpm"), maxLevel+1);
if (defGroup || cfg->hasKey("WallPixmapName"))
fillStrList(wallPixmapName,
cfg->readEntry("WallPixmapName", "wall.xpm"), maxLevel+1);
if (defGroup || cfg->hasKey("PrisonPixmapName"))
fillStrList(prisonPixmapName,
cfg->readEntry("PrisonPixmapName", "prison.xpm"), maxLevel+1);
if (defGroup || cfg->hasKey("EnergizerPixmapName"))
fillStrList(energizerPixmapName,
cfg->readEntry("EnergizerPixmapName", "switch.xpm"),maxLevel+1);
if (defGroup || cfg->hasKey("FruitPixmapName"))
fillStrList(fruitPixmapName,
cfg->readEntry("FruitPixmapName", "fruit.xpm"), maxLevel+1);
if (defGroup || cfg->hasKey("PacmanPixmapName"))
fillStrList(pacmanPixmapName,
cfg->readEntry("PacmanPixmapName", "pacman.xpm"), maxLevel+1);
if (defGroup || cfg->hasKey("DyingPixmapName"))
fillStrList(dyingPixmapName,
cfg->readEntry("DyingPixmapName", "dying.xpm"), maxLevel+1);
if (defGroup || cfg->hasKey("EyesPixmapName"))
fillStrList(eyesPixmapName,
cfg->readEntry("EyesPixmapName", "eyes.xpm"), maxLevel+1);
if (defGroup || cfg->hasKey("MonsterPixmapName"))
fillStrList(monsterPixmapName,
cfg->readEntry("MonsterPixmapName", "monster.xpm"), maxLevel+1);
if (defGroup || cfg->hasKey("FruitScorePixmapName"))
fillStrList(fruitScorePixmapName,
cfg->readEntry("FruitScorePixmapName"), maxLevel+1);
if (defGroup || cfg->hasKey("MonsterScorePixmapName"))
fillStrList(monsterScorePixmapName,
cfg->readEntry("MonsterScorePixmapName"), maxLevel+1);
APP_CONFIG_END( cfg );
}
void Painter::confScoring(bool defGroup)
{
APP_CONFIG_BEGIN( cfg );
if (defGroup || cfg->hasKey("FruitScore"))
fillArray(fruitScore,
cfg->readEntry("FruitScore",
"100,300,500,,700,,1000,,2000,,3000,,5000"),
maxLevel+1);
if (defGroup || cfg->hasKey("MonsterScore"))
fillArray(monsterScore,
cfg->readEntry("MonsterScore", "200,400,800,1600"), 4);
if (defGroup || cfg->hasKey("FruitScoreString"))
fillStrList(fruitScoreString,
cfg->readEntry("FruitScoreString"), maxLevel+1);
if (defGroup || cfg->hasKey("MonsterScoreString"))
fillStrList(monsterScoreString,
cfg->readEntry("MonsterScoreString"), 4);
APP_CONFIG_END( cfg );
}
void Painter::confScheme()
{
APP_CONFIG_BEGIN( cfg );
SAVE_CONFIG_GROUP( cfg, oldgroup );
QString newgroup;
// if not set, read mode and scheme from the configfile
if (mode == -1 && scheme == -1) {
scheme = cfg->readNumEntry("Scheme", -1);
mode = cfg->readNumEntry("Mode", -1);
// if mode is not set in the defGroup-group, lookup the scheme group
if (scheme != -1 || mode == -1) {
newgroup.sprintf("Scheme %d", scheme);
cfg->setGroup(newgroup);
mode = cfg->readNumEntry("Mode", -1);
RESTORE_CONFIG_GROUP( cfg, oldgroup );
}
}
confLevels();
if (mode != -1) {
newgroup.sprintf("Mode %d", mode);
cfg->setGroup(newgroup);
confLevels(FALSE);
}
if (scheme != -1) {
newgroup.sprintf("Scheme %d", scheme);
cfg->setGroup(newgroup);
confLevels(FALSE);
}
RESTORE_CONFIG_GROUP( cfg, oldgroup );
confMisc();
confScoring();
if (mode != -1) {
newgroup.sprintf("Mode %d", mode);
cfg->setGroup(newgroup);
confMisc(FALSE);
confScoring(FALSE);
}
if (scheme != -1) {
newgroup.sprintf("Scheme %d", scheme);
cfg->setGroup(newgroup);
confMisc(FALSE);
confScoring(FALSE);
}
if ((const char *) *fruitScoreString.at(0) == '\0')
fillScoreString(fruitScoreString, fruitScore);
if ((const char *) *monsterScoreString.at(0) == '\0')
fillScoreString(monsterScoreString, monsterScore);
fillPixmapName(pointPixmapName);
fillPixmapName(wallPixmapName);
fillPixmapName(prisonPixmapName);
fillPixmapName(energizerPixmapName);
fillPixmapName(fruitPixmapName);
fillPixmapName(pacmanPixmapName);
fillPixmapName(dyingPixmapName);
fillPixmapName(eyesPixmapName);
fillPixmapName(monsterPixmapName);
fillPixmapName(fruitScorePixmapName);
fillPixmapName(monsterScorePixmapName);
initPixmaps();
initbackPixmaps();
initRoomPixmap();
RESTORE_CONFIG_GROUP( cfg, oldgroup );
APP_CONFIG_END( cfg );
}
void Painter::setScheme(int Scheme, int Mode, Bitfont *font)
{
bitfont = font;
mode = Mode;
scheme = Scheme;
confScheme();
}
void Painter::setLevel(int Level)
{
level = Level;
initPixmaps();
initbackPixmaps();
initRoomPixmap();
}
int Painter::checkRange(int value, int max, int min)
{
if (value < min) {
printf("Painter::checkRange (value = %d, max = %d, min = %d)\n",
value, max, min);
return min;
} else if (value > max) {
printf("Painter::checkRange (value = %d, max = %d, min = %d)\n",
value, max, min);
return max;
} else
return value;
}
diff --git a/noncore/games/kpacman/referee.cpp b/noncore/games/kpacman/referee.cpp
index 6d8f3fb..1b810d8 100644
--- a/noncore/games/kpacman/referee.cpp
+++ b/noncore/games/kpacman/referee.cpp
@@ -1,1417 +1,1417 @@
#include "portable.h"
#if defined( KDE2_PORT )
#include <kapp.h>
#include <kconfig.h>
#include <kstddirs.h>
#include <kaccel.h>
#include <referee.h>
#include <referee.moc>
#elif defined( QPE_PORT )
#include <qaccel.h>
#include <qpe/qpeapplication.h>
-#include "config.h"
+#include <qpe/config.h>
#include "referee.h"
#endif
#include <qdatetm.h>
#include <stdlib.h>
#include <qtimer.h>
#include <qevent.h>
#include <qcolor.h>
#include <qkeycode.h>
#include <qfileinfo.h>
#include "board.h"
#include "pacman.h"
#include "monster.h"
#include "fruit.h"
#include "painter.h"
Referee::Referee( QWidget *parent, const char *name, int Scheme, int Mode, Bitfont *font)
: QWidget( parent, name )
{
gameState.resize(12);
gameTimer = 0;
energizerTimer = 0;
focusedPause = FALSE;
setFocusPolicy(QWidget::StrongFocus);
initKeys();
scheme = Scheme;
mode = Mode;
confScheme();
board = new Board(BoardWidth*BoardHeight);
pix = new Painter(board, this, scheme, mode, font);
setFixedSize(pix->levelPix().size());
pacman = new Pacman(board);
fruit = new Fruit(board);
monsters = new QList<Monster>;
monsters->setAutoDelete(TRUE);
monsterRect = new QList<QRect>;
monsterRect->setAutoDelete(TRUE);
energizers = new QList<Energizer>;
energizers->setAutoDelete(TRUE);
energizerRect = new QList<QRect>;
energizerRect->setAutoDelete(TRUE);
pacmanRect.setRect(0, 0, 0, 0);
fruitRect.setRect(0, 0, 0, 0);
QTime midnight( 0, 0, 0 );
srand( midnight.secsTo(QTime::currentTime()) );
lifes = 0;
points = 0;
emit setLifes(lifes);
emit setPoints(points);
intro();
}
void Referee::paintEvent( QPaintEvent *e)
{
if (gameState.testBit(HallOfFame))
return;
QRect rect = e->rect();
if (!rect.isEmpty()) {
QPixmap p = pix->levelPix();
bitBlt(this, rect.x(), rect.y(),
&p, rect.x(), rect.y(), rect.width(), rect.height());
}
if ((gameState.testBit(GameOver) || gameState.testBit(Demonstration)) &&
rect.intersects(pix->rect(board->position(fruithome), tr("GAME OVER"))))
pix->draw(board->position(fruithome), Widget, tr("GAME OVER"), RED);
for (Energizer *e = energizers->first(); e != 0; e = energizers->next()) {
if (e && e->state() == on &&
rect.intersects(pix->rect(e->position(), EnergizerPix)) &&
!(e->position() == pacman->position() && gameState.testBit(Scoring))) {
if (e->pix() != -1)
pix->draw(e->position(), Widget, EnergizerPix, e->pix());
}
}
if (!gameState.testBit(Init)) {
if (!gameState.testBit(Dying) && (fruit->pix() != -1))
if (fruit->state() != active) {
if (rect.intersects(pix->rect(fruit->position(), FruitScorePix, fruit->pix())))
pix->draw(fruit->position(), Widget, FruitScorePix, fruit->pix());
} else {
if (rect.intersects(pix->rect(fruit->position(), FruitPix, fruit->pix())))
pix->draw(fruit->position(), Widget, FruitPix, fruit->pix());
}
for (Monster *m = monsters->first(); m != 0; m = monsters->next())
if (m && m->state() == harmless &&
rect.intersects(pix->rect(m->position(), MonsterPix)) &&
!(m->position() == pacman->position() && gameState.testBit(Scoring))) {
if (m->body() != -1)
pix->draw(m->position(), Widget, MonsterPix, m->body());
if (m->eyes() != -1)
pix->draw(m->position(), Widget, EyesPix, m->eyes());
}
if (!gameState.testBit(Scoring) && !gameState.testBit(LevelDone) &&
rect.intersects(pix->rect(pacman->position(), PacmanPix)) && pacman->pix() != -1)
pix->draw(pacman->position(), Widget, PacmanPix, pacman->pix());
for (Monster *m = monsters->first(); m != 0; m = monsters->next())
if (m && m->state() != harmless &&
rect.intersects(pix->rect(m->position(), MonsterPix)) &&
!(m->position() == pacman->position() && gameState.testBit(Scoring))) {
if (m->body() != -1)
pix->draw(m->position(), Widget, MonsterPix, m->body());
if (m->eyes() != -1)
pix->draw(m->position(), Widget, EyesPix, m->eyes());
}
}
if (gameState.testBit(Scoring) &&
rect.intersects(pix->rect(pacman->position(), MonsterScorePix, monstersEaten-1)))
pix->draw(pacman->position(), Widget, MonsterScorePix, monstersEaten-1);
if (gameState.testBit(Init) && gameState.testBit(Dying) &&
timerCount < pix->maxPixmaps(DyingPix) &&
rect.intersects(pix->rect(pacman->position(), PacmanPix)))
pix->draw(pacman->position(), Widget, DyingPix, timerCount);
if (gameState.testBit(LevelDone) &&
rect.intersects(pix->rect(pacman->position(), PacmanPix)))
pix->draw(pacman->position(), Widget, PacmanPix, pacman->pix());
if (gameState.testBit(Player) &&
rect.intersects(pix->rect(board->position(monsterhome, 0), tr("PLAYER ONE"))))
pix->draw(board->position(monsterhome, 0), Widget, tr("PLAYER ONE"), CYAN);
if (gameState.testBit(Ready) &&
rect.intersects(pix->rect(board->position(fruithome), tr("READY!"))))
pix->draw(board->position(fruithome), Widget, tr("READY!"), YELLOW);
if (gameState.testBit(Paused) &&
rect.intersects(pix->rect((BoardWidth*BoardHeight)/2-BoardWidth, tr("PAUSED"))))
pix->draw((BoardWidth*BoardHeight)/2-BoardWidth, Widget, tr("PAUSED"), RED, BLACK);
}
void Referee::timerEvent( QTimerEvent *e )
{
if (gameState.testBit(HallOfFame))
return;
QRect lastRect;
int lastPix;
bool moved = FALSE;
int eated = 0;
if (e->timerId() == energizerTimer) {
for (int e = 0; e < board->energizers(); e++) {
lastRect = pix->rect(energizers->at(e)->position(), EnergizerPix);
lastPix = energizers->at(e)->pix();
if (energizers->at(e)->move()) {
moved = TRUE;
*energizerRect->at(e) = pix->rect(energizers->at(e)->position(), EnergizerPix);
if (lastPix == energizers->at(e)->pix() &&
lastRect == pix->rect(energizers->at(e)->position(), EnergizerPix))
energizerRect->at(e)->setRect(0, 0, 0, 0);
else
*energizerRect->at(e) = pix->rect(*energizerRect->at(e), lastRect);
}
}
for (int e = 0; e < board->energizers(); e++)
if (!energizerRect->at(e)->isNull())
repaint(*energizerRect->at(e), FALSE);
return;
}
timerCount++;
lastRect = pix->rect(pacman->position(), PacmanPix);
lastPix = pacman->pix();
if (moved = pacman->move()) { // pacman really moved
pacmanRect = pix->rect(pacman->position(), PacmanPix);
if (lastPix == pacman->pix() &&
lastRect == pix->rect(pacman->position(), PacmanPix))
pacmanRect.setRect(0, 0, 0, 0); // nothing to do, because the pixmap
else // and the position isn't changed.
pacmanRect = pix->rect(pacmanRect, lastRect);
} else
pacmanRect.setRect(0, 0, 0, 0);
int pos = pacman->position();
if (moved && board->isMonster(pos) && !gameState.testBit(Dying)) {
for (Monster *m = monsters->first(); m != 0; m = monsters->next())
if (m && m->position() == pos) {
if (m->state() == harmless && !gameState.testBit(Dying)) {
m->setREM(remTicks[level]);
m->setDirection(X); // prevent movement before eaten()
eated++;
if (gameState.testBit(Introducing))
m->setPosition(OUT);
}
if (m->state() == dangerous && !gameState.testBit(Dying))
killed();
}
}
if (moved && !gameState.testBit(Dying)) {
if (board->isPoint(pos)) {
board->reset(pos, Point);
score(pointScore);
pix->erase(pos, PointPix);
}
if (board->isEnergizer(pos)) {
for (int e = 0; e < board->energizers();e++) {
if (energizers->at(e)->position() == pos) {
energizers->at(e)->setOff();
energizers->remove(e);
energizerRect->remove(e);
e = board->energizers();
}
}
board->reset(pos, energizer);
score(energizerScore);
monstersEaten = 0;
for (Monster *m = monsters->first(); m != 0; m = monsters->next())
if (m && m->state() != rem) {
m->setHarmless(harmlessTicks[level], harmlessDurTicks[level],
harmlessWarnTicks[level]);
if (gameState.testBit(Introducing))
m->setDirection(board->turn(m->direction()));
}
}
if (pos == fruit->position() && fruit->state() == active) {
fruit->setEaten(fruitScoreDurTicks[level]);
initFruit(FALSE);
score(fruitScore[fruit->pix()]);
}
}
if (!gameState.testBit(Introducing)) {
if (fruit->state() != active && fruit->pix() >= 0)
lastRect = pix->rect(fruit->position(), FruitScorePix, fruit->pix());
else
lastRect = pix->rect(fruit->position(), FruitPix, fruit->pix());
lastPix = fruit->pix();
if (fruit->move()) {
if (pos == fruit->position() && fruit->state() == active) {
fruit->setEaten(fruitScoreDurTicks[level]);
initFruit(FALSE);
score(fruitScore[fruit->pix()]);
}
if (fruit->state() != active && fruit->pix() >= 0)
fruitRect = pix->rect(fruit->position(), FruitScorePix, fruit->pix());
else
fruitRect = pix->rect(fruit->position(), FruitPix, fruit->pix());
if (lastPix == fruit->pix() && lastRect == fruitRect)
fruitRect.setRect(0, 0, 0, 0);
else
fruitRect = pix->rect(fruitRect, lastRect);
} else
fruitRect.setRect(0, 0, 0, 0);
} else
fruitRect.setRect(0, 0, 0, 0);
int lastBodyPix;
int lastEyesPix;
for (Monster *m = monsters->first(); m != 0; m = monsters->next())
if (m) {
lastRect = pix->rect(m->position(), MonsterPix);
lastBodyPix = m->body();
lastEyesPix = m->eyes();
if (m->move()) {
moved = TRUE;
*monsterRect->at(m->id()) = pix->rect(m->position(), MonsterPix);
if (lastBodyPix == m->body() && lastEyesPix == m->eyes() &&
lastRect == pix->rect(m->position(), MonsterPix))
monsterRect->at(m->id())->setRect(0, 0, 0, 0);
else
*monsterRect->at(m->id()) = pix->rect(*monsterRect->at(m->id()), lastRect);
if (m->position() == pos && !gameState.testBit(Dying)) {
if (m->state() == harmless && !gameState.testBit(Dying)) {
m->setREM(remTicks[level]);
eated++;
if (gameState.testBit(Introducing)) {
m->setPosition(OUT);
m->setDirection(X);
}
}
if (m->state() == dangerous && !gameState.testBit(Dying))
killed();
}
} else
monsterRect->at(m->id())->setRect(0, 0, 0, 0);
}
for (int m = 0; m < board->monsters(); m++)
if (pacmanRect.intersects(*monsterRect->at(m))) {
pacmanRect = pix->rect(pacmanRect, *monsterRect->at(m));
monsterRect->at(m)->setRect(0, 0, 0, 0);
} else
for (int im = m+1; im < board->monsters(); im++)
if (monsterRect->at(m)->intersects(*monsterRect->at(im))) {
*monsterRect->at(m) = pix->rect(*monsterRect->at(m), *monsterRect->at(im));
monsterRect->at(im)->setRect(0, 0, 0, 0);
}
if (!pacmanRect.isNull())
repaint(pacmanRect, FALSE);
if (!fruitRect.isNull())
repaint(fruitRect, FALSE);
for (int m = 0; m < board->monsters(); m++)
if (!monsterRect->at(m)->isNull())
repaint(*monsterRect->at(m), FALSE);
if (board->points() == 0 && !gameState.testBit(Dying))
levelUp();
if (eated > 0 && !gameState.testBit(Dying)) {
timerCount = eated;
eaten();
}
if (gameState.testBit(Introducing) && moved)
introPlay();
}
void Referee::repaintFigures()
{
pacmanRect = pix->rect(pacman->position(), PacmanPix);
for (int e = 0; e < board->energizers(); e++) {
*energizerRect->at(e) = pix->rect(board->position(energizer, e), EnergizerPix);
if (pacmanRect.intersects(*energizerRect->at(e))) {
pacmanRect = pix->rect(pacmanRect, *energizerRect->at(e));
energizerRect->at(e)->setRect(0, 0, 0, 0);
} else
for (int ie = e+1; ie < board->energizers(); ie++)
if (energizerRect->at(e)->intersects(*energizerRect->at(ie))) {
*energizerRect->at(e) = pix->rect(*energizerRect->at(e), *energizerRect->at(ie));
energizerRect->at(ie)->setRect(0, 0, 0, 0);
}
}
if (fruit->pix() != -1 && fruit->state() != active)
fruitRect = pix->rect(fruit->position(), FruitScorePix, fruit->pix());
else
fruitRect = pix->rect(fruit->position(), FruitPix, fruit->pix());
if (pacmanRect.intersects(fruitRect)) {
pacmanRect = pix->rect(pacmanRect, fruitRect);
fruitRect.setRect(0, 0, 0, 0);
}
for (int m = 0; m < board->monsters(); m++) {
*monsterRect->at(m) = pix->rect(board->position(monster, m), MonsterPix);
if (pacmanRect.intersects(*monsterRect->at(m))) {
pacmanRect = pix->rect(pacmanRect, *monsterRect->at(m));
monsterRect->at(m)->setRect(0, 0, 0, 0);
} else
for (int im = m+1; im < board->monsters(); im++)
if (monsterRect->at(m)->intersects(*monsterRect->at(im))) {
*monsterRect->at(m) = pix->rect(*monsterRect->at(m), *monsterRect->at(im));
monsterRect->at(im)->setRect(0, 0, 0, 0);
}
}
if (!pacmanRect.isNull())
repaint(pacmanRect, FALSE);
if (!fruitRect.isNull())
repaint(fruitRect, FALSE);
for (int m = 0; m < board->monsters(); m++)
if (!monsterRect->at(m)->isNull())
repaint(*monsterRect->at(m), FALSE);
for (int e = 0; e < board->energizers(); e++)
if (!energizerRect->at(e)->isNull())
repaint(*energizerRect->at(e), FALSE);
}
void Referee::initKeys()
{
APP_CONFIG_BEGIN( cfg );
QString up("Up");
up = cfg->readEntry("upKey", (const char*) up);
UpKey = KAccel::stringToKey(up);
QString down("Down");
down = cfg->readEntry("downKey", (const char*) down);
DownKey = KAccel::stringToKey(down);
QString left("Left");
left = cfg->readEntry("leftKey", (const char*) left);
LeftKey = KAccel::stringToKey(left);
QString right("Right");
right = cfg->readEntry("rightKey", (const char*) right);
RightKey = KAccel::stringToKey(right);
APP_CONFIG_END( cfg );
}
void Referee::fillArray(QArray<int> &array, QString values, int max)
{
if (max < 0)
max = values.contains(',')+1;
array.resize(max);
int last = 0;
bool ok;
QString value;
for (uint i = 0; i < array.size(); i++) {
if (values.find(',') < 0 && values.length() > 0) {
value = values;
values = "";
}
if (values.find(',') >= 0) {
value = values.left(values.find(','));
values.remove(0,values.find(',')+1);
}
array[i] = value.toInt(&ok);
if (ok)
last = array[i];
else
array[i] = last;
}
}
void Referee::fillStrList(QStrList &list, QString values, int max)
{
if (!list.isEmpty())
list.clear();
QString last = "";
QString value;
for (uint i = 0; i < (uint) max; i++) {
if (values.find(',') < 0 && values.length() > 0) {
value = values;
values = "";
}
if (values.find(',') >= 0) {
value = values.left(values.find(','));
values.remove(0,values.find(',')+1);
}
if (!value.isEmpty())
last = value;
list.append(last);
}
}
void Referee::fillMapName()
{
QStrList list = mapName;
if (!mapName.isEmpty())
mapName.clear();
QString map;
QFileInfo fileInfo;
for (uint i = 0; i < list.count(); i++) {
map = list.at(i);
if (map.left(1) != "/" && map.left(1) != "~")
map = FIND_APP_DATA( mapDirectory+map );
fileInfo.setFile(map);
if (!fileInfo.isReadable())
map = "";
mapName.append(map);
}
}
void Referee::confLevels(bool defGroup)
{
APP_CONFIG_BEGIN( cfg );
if (defGroup || cfg->hasKey("Levels"))
maxLevel = cfg->readNumEntry("Levels", 13);
APP_CONFIG_END( cfg );
}
void Referee::confMisc(bool defGroup)
{
APP_CONFIG_BEGIN( cfg );
if (defGroup || cfg->hasKey("PixmapDirectory")) {
pixmapDirectory = cfg->readEntry("PixmapDirectory");
if (pixmapDirectory.left(1) != "/" && pixmapDirectory.left(1) != "~")
pixmapDirectory.insert(0, "pics/");
if (pixmapDirectory.right(1) != "/")
pixmapDirectory.append("/");
}
if (defGroup || cfg->hasKey("MapDirectory")) {
mapDirectory = cfg->readEntry("MapDirectory");
if (mapDirectory.left(1) != "/" && mapDirectory.left(1) != "~")
mapDirectory.insert(0, "maps/");
if (mapDirectory.right(1) != "/")
mapDirectory.append("/");
}
if (defGroup || cfg->hasKey("MapName"))
fillStrList(mapName, cfg->readEntry("MapName", "map"), maxLevel+1);
if (defGroup || cfg->hasKey("MonsterIQ"))
fillArray(monsterIQ, cfg->readEntry("MonsterIQ", "0,170,180,170,180,170,180"), maxLevel+1);
if (defGroup || cfg->hasKey("FruitIQ"))
fillArray(fruitIQ, cfg->readEntry("FruitIQ", "0,170,180,170,180,170,180"), maxLevel+1);
if (defGroup || cfg->hasKey("FruitIndex"))
fillArray(fruitIndex, cfg->readEntry("FruitIndex", "0"), maxLevel+1);
APP_CONFIG_END( cfg );
}
void Referee::confTiming(bool defGroup)
{
APP_CONFIG_BEGIN( cfg );
if (defGroup || cfg->hasKey("SpeedMS"))
fillArray(speed, cfg->readEntry("SpeedMS", "20"), maxLevel+1);
if (defGroup || cfg->hasKey("PacmanTicks"))
fillArray(pacmanTicks,cfg->readEntry("PacmanTicks", "3"), maxLevel+1);
if (defGroup || cfg->hasKey("RemTicks"))
fillArray(remTicks, cfg->readEntry("RemTicks", "1"), maxLevel+1);
if (defGroup || cfg->hasKey("DangerousTicks"))
fillArray(dangerousTicks, cfg->readEntry("DangerousTicks", "3"), maxLevel+1);
if (defGroup || cfg->hasKey("HarmlessTicks"))
fillArray(harmlessTicks, cfg->readEntry("HarmlessTicks", "7,6,,5,,4"), maxLevel+1);
if (defGroup || cfg->hasKey("HarmlessDurationTicks"))
fillArray(harmlessDurTicks, cfg->readEntry("HarmlessDurationTicks", "375,,,300,,250,200,150"), maxLevel+1);
if (defGroup || cfg->hasKey("HarmlessWarningTicks"))
fillArray(harmlessWarnTicks, cfg->readEntry("HarmlessWarningTicks", "135"), maxLevel+1);
if (defGroup || cfg->hasKey("ArrestTicks"))
fillArray(arrestTicks, cfg->readEntry("ArrestTicks", "6"), maxLevel+1);
if (defGroup || cfg->hasKey("ArrestDurationTicks"))
fillArray(arrestDurTicks, cfg->readEntry("ArrestDurationTicks", "200,,,150"), maxLevel+1);
if (defGroup || cfg->hasKey("FruitTicks"))
fillArray(fruitTicks, cfg->readEntry("FruitTicks", "7,6,,5,,4"), maxLevel+1);
if (defGroup || cfg->hasKey("FruitAppearsTicks"))
fillArray(fruitAppearsTicks, cfg->readEntry("FruitAppearsTicks", "1000,,1500,2000,2500,3000,3500,4000"), maxLevel+1);
if (defGroup || cfg->hasKey("FruitDurationTicks"))
fillArray(fruitDurTicks, cfg->readEntry("FruitDurationTicks", "500,,,400,350,300,,250,200,150"), maxLevel+1);
if (defGroup || cfg->hasKey("FruitScoreDurationTicks"))
fillArray(fruitScoreDurTicks, cfg->readEntry("FruitScoreDurationTicks", "150"), maxLevel+1);
if (defGroup || cfg->hasKey("MonsterScoreDurationMS"))
monsterScoreDurMS = cfg->readNumEntry("MonsterScoreDurationMS", 1000);
if (defGroup || cfg->hasKey("PlayerDurationMS"))
playerDurMS = cfg->readNumEntry("PlayerDurationMS", 3000);
if (defGroup || cfg->hasKey("ReadyDurationMS"))
readyDurMS = cfg->readNumEntry("ReadyDurationMS", 2000);
if (defGroup || cfg->hasKey("GameOverDurationMS"))
gameOverDurMS = cfg->readNumEntry("GameOverDurationMS", 3000);
if (defGroup || cfg->hasKey("AfterPauseMS"))
afterPauseMS = cfg->readNumEntry("AfterPauseMS", 1000);
if (defGroup || cfg->hasKey("DyingPreAnimationMS"))
dyingPreAnimationMS = cfg->readNumEntry("DyingPreAnimationMS", 1000);
if (defGroup || cfg->hasKey("DyingAnimationMS"))
dyingAnimationMS = cfg->readNumEntry("DyingAnimationMS", 100);
if (defGroup || cfg->hasKey("DyingPostAnimationMS"))
dyingPostAnimationMS = cfg->readNumEntry("DyingPostAnimationMS", 500);
if (defGroup || cfg->hasKey("IntroAnimationMS"))
introAnimationMS = cfg->readNumEntry("IntroAnimationMS", 800);
if (defGroup || cfg->hasKey("IntroPostAnimationMS"))
introPostAnimationMS = cfg->readNumEntry("IntroPostAnimationMS", 1000);
if (defGroup || cfg->hasKey("LevelUpPreAnimationMS"))
levelUpPreAnimationMS = cfg->readNumEntry("LevelUpPreAnimationMS", 2000);
if (defGroup || cfg->hasKey("LevelUpAnimationMS"))
levelUpAnimationMS = cfg->readNumEntry("LevelUpAnimationMS", 2000);
if (defGroup || cfg->hasKey("EnergizerAnimationMS"))
energizerAnimationMS = cfg->readNumEntry("EnergizerAnimationMS", 200);
APP_CONFIG_END( cfg );
}
void Referee::confScoring(bool defGroup)
{
APP_CONFIG_BEGIN( cfg );
if (defGroup || cfg->hasKey("PointScore"))
pointScore = cfg->readNumEntry("PointScore", 10);
if (defGroup || cfg->hasKey("EnergizerScore"))
energizerScore = cfg->readNumEntry("EnergizerScore", 50);
if (defGroup || cfg->hasKey("FruitScore"))
fillArray(fruitScore, cfg->readEntry("FruitScore", "100,300,500,,700,,1000,,2000,,3000,,5000"), maxLevel+1);
if (defGroup || cfg->hasKey("MonsterScore"))
fillArray(monsterScore, cfg->readEntry("MonsterScore", "200,400,800,1600"), 4);
if (defGroup || cfg->hasKey("ExtraLifeScore"))
fillArray(extraLifeScore, cfg->readEntry("ExtraLifeScore", "10000"), -1);
APP_CONFIG_END( cfg );
}
void Referee::confScheme()
{
APP_CONFIG_BEGIN( cfg );
SAVE_CONFIG_GROUP( cfg, oldgroup );
QString newgroup;
// if not set, read mode and scheme from the configfile
if (mode == -1 && scheme == -1) {
scheme = cfg->readNumEntry("Scheme", -1);
mode = cfg->readNumEntry("Mode", -1);
// if mode is not set in the defGroup-group, lookup the scheme group
if (scheme != -1 || mode == -1) {
newgroup.sprintf("Scheme %d", scheme);
cfg->setGroup(newgroup);
mode = cfg->readNumEntry("Mode", -1);
RESTORE_CONFIG_GROUP( cfg, oldgroup );
}
}
confLevels();
if (mode != -1) {
newgroup.sprintf("Mode %d", mode);
cfg->setGroup(newgroup);
confLevels(FALSE);
}
if (scheme != -1) {
newgroup.sprintf("Scheme %d", scheme);
cfg->setGroup(newgroup);
confLevels(FALSE);
}
RESTORE_CONFIG_GROUP( cfg, oldgroup );
confMisc();
confTiming();
confScoring();
if (mode != -1) {
newgroup.sprintf("Mode %d", mode);
cfg->setGroup(newgroup);
confMisc(FALSE);
confTiming(FALSE);
confScoring(FALSE);
}
if (scheme != -1) {
newgroup.sprintf("Scheme %d", scheme);
cfg->setGroup(newgroup);
confMisc(FALSE);
confTiming(FALSE);
confScoring(FALSE);
}
fillMapName();
RESTORE_CONFIG_GROUP( cfg, oldgroup );
APP_CONFIG_END( cfg );
}
void Referee::setScheme(int Scheme, int Mode, Bitfont *font)
{
mode = Mode;
scheme = Scheme;
confScheme();
pix->setScheme(scheme, mode, font);
pacman->setMaxPixmaps(pix->maxPixmaps(PacmanPix));
fruit->setMaxPixmaps(pix->maxPixmaps(FruitPix));
for (Monster *m = monsters->first(); m != 0; m = monsters->next())
if (m)
m->setMaxPixmaps(pix->maxPixmaps(MonsterPix), pix->maxPixmaps(EyesPix));
for (Energizer *e = energizers->first(); e != 0; e = energizers->next())
if (e)
e->setMaxPixmaps(pix->maxPixmaps(EnergizerPix));
if (gameState.testBit(Introducing))
for (int i = 0; i < (gameState.testBit(Init) ? timerCount : 15); i++)
introPaint(i);
setFixedSize(pix->levelPix().size());
repaint();
}
void Referee::keyPressEvent( QKeyEvent *k )
{
uint key = k->key();
if ( !gameState.testBit(Playing) && ( key == Key_Up || key == Key_Down || key == Key_Left || key == Key_Right ) )
play();
if (gameState.testBit(Paused) || gameState.testBit(HallOfFame) ||
gameState.testBit(Demonstration) || gameState.testBit(Dying) ||
gameState.testBit(Ready) || gameState.testBit(LevelDone) ||
!gameState.testBit(Playing))
return;
if (key == UpKey)
pacman->setDirection(N);
else if (key == DownKey)
pacman->setDirection(S);
else if (key == RightKey)
pacman->setDirection(E);
else if (key == LeftKey)
pacman->setDirection(W);
#ifdef CHEATS
else if (key == Key_L) { printf("levelUp()\n"); levelUp(); }
else if (key == Key_F) { printf("fruit->move(TRUE)\n"); fruit->move(TRUE); repaint(FALSE); }
else if (key == Key_E) { printf("setLifes(++lifes)\n"); emit setLifes(++lifes); }
#endif
else {
k->ignore();
return;
}
k->accept();
}
void Referee::score(int p)
{
if (!gameState.testBit(Playing))
return;
if ((points += p) < 0)
points = 0;
emit setPoints(points);
if (points >= nextExtraLifeScore) {
emit setLifes(++lifes);
if (extraLifeScoreIndex < (int) extraLifeScore.size()-1)
extraLifeScoreIndex++;
if (extraLifeScore[extraLifeScoreIndex] < 0)
nextExtraLifeScore = extraLifeScore[extraLifeScoreIndex] * -1;
else
nextExtraLifeScore += extraLifeScore[extraLifeScoreIndex];
}
}
void Referee::eaten()
{
if (gameState.testBit(Ready))
return;
stop();
if (monstersEaten < 4)
monstersEaten++;
gameState.setBit(Scoring);
score(monsterScore[monstersEaten-1]);
repaint(pix->rect(pix->rect(pacman->position(), MonsterPix),
pix->rect(pacman->position(), MonsterScorePix, monstersEaten-1)));
if (--timerCount > 0)
QTimer::singleShot( monsterScoreDurMS, this, SLOT(eaten()));
else {
for (Monster *m = monsters->first(); m != 0; m = monsters->next())
if (m && m->direction() == X && !gameState.testBit(Introducing))
m->setDirection(N);
if (monstersEaten != 4 || !gameState.testBit(Introducing))
QTimer::singleShot( monsterScoreDurMS, this, SLOT(start()));
}
}
void Referee::toggleHallOfFame()
{
gameState.toggleBit(HallOfFame);
}
void Referee::hallOfFame()
{
if (gameState.testBit(HallOfFame)) // If the HallOfFame is switched on manually, toggle the
toggleHallOfFame(); // bit twice.
emit setLevel(0); // Clear status display for hall of fame
emit setScore(level, 0);
emit forcedHallOfFame(TRUE);
}
void Referee::pause()
{
static int pausedTimer = 0;
if (!gameState.testBit(Paused)) {
pausedTimer = gameTimer;
stop();
stopEnergizer();
gameState.setBit(Paused);
repaint(pix->rect((BoardWidth*BoardHeight)/2-BoardWidth, tr("PAUSED")), FALSE);
} else {
gameState.clearBit(Paused);
repaint(pix->rect((BoardWidth*BoardHeight)/2-BoardWidth, tr("PAUSED")), FALSE);
if (pausedTimer) {
pausedTimer = 0;
start();
}
}
emit togglePaused();
}
void Referee::intro()
{
stop();
stopEnergizer();
bool paused = gameState.testBit(Paused);
gameState.fill(FALSE);
gameState.setBit(Introducing);
gameState.setBit(Init);
if (paused)
gameState.setBit(Paused);
level = 0;
emit setLevel(level);
board->init(Intro);
pix->setLevel(level);
initPacman();
initFruit();
initMonsters();
initEnergizers();
repaint();
monstersEaten = 0;
timerCount = 0;
introPlay();
}
void Referee::introMonster(int id)
{
Monster *m = new Monster(board, id);
m->setPosition((10+id*6)*BoardWidth+10);
m->setDirection(E);
m->setDangerous(dangerousTicks[level], monsterIQ[level]);
m->setMaxPixmaps(pix->maxPixmaps(MonsterPix), pix->maxPixmaps(EyesPix));
if (m->body() != -1)
pix->draw(m->position(), RoomPix, MonsterPix, m->body());
if (m->eyes() != -1)
pix->draw(m->position(), RoomPix, EyesPix, m->eyes());
repaint(pix->rect(m->position(), MonsterPix), FALSE);
m->setPosition(OUT);
}
void Referee::introPaint(int t)
{
QString pts;
switch (t) {
case 0 : repaint(pix->draw(16, 6, RoomPix, tr("CHARACTER"), WHITE, QColor(), AlignLeft), FALSE);
repaint(pix->draw(36, 6, RoomPix, tr("/"), WHITE, QColor(), AlignLeft), FALSE);
repaint(pix->draw(40, 6, RoomPix, tr("NICKNAME"), WHITE, QColor(), AlignLeft), FALSE);
break;
case 1 : introMonster(0);
break;
case 2 : repaint(pix->draw(16, 10, RoomPix, tr("-SHADOW"), RED, QColor(), AlignLeft), FALSE);
break;
case 3 : repaint(pix->draw(38, 10, RoomPix, tr("\"BLINKY\""), RED, QColor(), AlignLeft), FALSE);
break;
case 4 : introMonster(1);
break;
case 5 : repaint(pix->draw(16, 16, RoomPix, tr("-SPEEDY"), PINK, QColor(), AlignLeft), FALSE);
break;
case 6 : repaint(pix->draw(38, 16, RoomPix, tr("\"PINKY\""), PINK, QColor(), AlignLeft), FALSE);
break;
case 7 : introMonster(2);
break;
case 8 : repaint(pix->draw(16, 22, RoomPix, tr("-BASHFUL"), CYAN, QColor(), AlignLeft), FALSE);
break;
case 9 : repaint(pix->draw(38, 22, RoomPix, tr("\"INKY\""), CYAN, QColor(), AlignLeft), FALSE);
break;
case 10 : introMonster(3);
break;
case 11 : repaint(pix->draw(16, 28, RoomPix, tr("-POKEY"), ORANGE, QColor(), AlignLeft), FALSE);
break;
case 12 : repaint(pix->draw(38, 28, RoomPix, tr("\"CLYDE\""), ORANGE, QColor(), AlignLeft), FALSE);
break;
case 13 : pts.sprintf("%d", pointScore);
repaint(pix->draw(28, 44, RoomPix, pts.data(), WHITE, QColor(), AlignRight), FALSE);
repaint(pix->draw(31, 44, RoomPix, "\x1C\x1D\x1E", WHITE, QColor(), AlignLeft), FALSE);
pts.sprintf("%d", energizerScore);
repaint(pix->draw(28, 48, RoomPix, pts.data(), WHITE, QColor(), AlignRight), FALSE);
repaint(pix->draw(31, 48, RoomPix, "\x1C\x1D\x1E", WHITE, QColor(), AlignLeft), FALSE);
break;
case 14 : // "@ 1980 MIDWAY MFG.CO."
#if defined( KDE2_PORT )
repaint(pix->draw(30, 58, RoomPix, "© 1998-2002 J.THÖNNISSEN", PINK), FALSE);
#elif defined( QPE_PORT )
repaint(pix->draw(30, 55, RoomPix, "© 1998-2002 J.THÖNNISSEN", PINK), FALSE);
repaint(pix->draw(29, 58, RoomPix, tr("QTOPIA PORT: CATALIN CLIMOV"), GREEN), FALSE);
repaint(pix->draw(29, 61, RoomPix, tr("PRESS CURSOR TO START"), GREEN), FALSE);
#endif
break;
}
}
void Referee::introPlay()
{
if (!gameState.testBit(Introducing) || gameState.testBit(Ready))
return;
if (gameState.testBit(Paused) || gameState.testBit(HallOfFame)) {
QTimer::singleShot(afterPauseMS, this, SLOT(introPlay()));
return;
}
if (!gameState.testBit(Init)) {
if (monstersEaten == 4) {
stop();
QTimer::singleShot(introPostAnimationMS, this, SLOT(demo()));
}
if (pacman->direction() == W) {
int id = -1;
if (pacman->position() == 37*BoardWidth-6)
id = 0;
else
if (board->isMonster(37*BoardWidth-6))
for (Monster *m = monsters->first(); m != 0; m = monsters->next())
if (m && m->position() == 37*BoardWidth-6) {
id = m->id();
id++;
break;
}
if (id >= 0 && id <= 4)
for (Monster *m = monsters->first(); m != 0; m = monsters->next())
if (m && m->id() == id && m->position() == OUT) {
m->setPosition(37*BoardWidth-1);
m->setDirection(W);
m->setDangerous(dangerousTicks[level], monsterIQ[level]);
board->set(37*BoardWidth-1, monsterhome, id);
repaint(pix->rect(m->position(), MonsterPix));
break;
}
}
return;
}
if (timerCount < 15)
introPaint(timerCount);
switch (timerCount) {
case 13 : board->set(44*BoardWidth+22, Point);
pix->drawPoint(44*BoardWidth+22);
repaint(pix->rect(44*BoardWidth+22, PointPix), FALSE);
energizers->at(0)->setPosition(48*BoardWidth+22);
energizers->at(0)->setOn();
repaint(pix->rect(48*BoardWidth+22, EnergizerPix), FALSE);
break;
case 14 : energizers->at(1)->setPosition(36*BoardWidth+10);
energizers->at(1)->setOn();
repaint(pix->rect(36*BoardWidth+10, EnergizerPix), FALSE);
for (int pos = 8; pos < BoardWidth; pos++) {
board->set(34*BoardWidth+pos, out);
board->set(38*BoardWidth+pos, out);
}
board->set(36*BoardWidth+8, out);
break;
case 15 : gameState.clearBit(Init);
initPacman();
pacman->setDemo(TRUE);
pacman->setPosition(37*BoardWidth-1);
repaintFigures();
start();
return;
}
if (timerCount++ < 15)
QTimer::singleShot(introAnimationMS, this, SLOT(introPlay()));
}
void Referee::demo()
{
if (gameState.testBit(Ready))
return;
if (gameState.testBit(Paused) || gameState.testBit(HallOfFame)) {
QTimer::singleShot(afterPauseMS, this, SLOT(demo()));
return;
}
stop();
stopEnergizer();
gameState.fill(FALSE);
gameState.setBit(Init);
gameState.setBit(Demonstration);
level = 0;
emit setLevel(level);
board->init(Demo, mapName.at(0));
pix->setLevel(level);
initPacman();
initFruit();
initMonsters();
initEnergizers();
gameState.clearBit(Init);
repaint();
timerCount = 0;
QTimer::singleShot(playerDurMS, this, SLOT(start()));
}
void Referee::play()
{
stop();
stopEnergizer();
gameState.fill(FALSE);
gameState.setBit(Init);
gameState.setBit(Playing);
gameState.setBit(Player);
gameState.setBit(Ready);
lifes = 3;
level = 1;
points = 0;
extraLifeScoreIndex = 0;
nextExtraLifeScore = extraLifeScore[extraLifeScoreIndex];
if (nextExtraLifeScore < 0)
nextExtraLifeScore *= -1;
board->init(Level, mapName.at(level));
pix->setLevel(level);
initPacman();
initFruit();
initMonsters();
initEnergizers();
repaint();
emit toggleNew();
emit setLifes(lifes);
emit setLevel(level);
emit setPoints(points);
repaint(pix->rect(board->position(monsterhome, 0), tr("PLAYER ONE")), FALSE);
repaint(pix->rect(board->position(fruithome), tr("READY!")), FALSE);
timerCount = 0;
QTimer::singleShot(playerDurMS, this, SLOT(ready()));
}
void Referee::ready()
{
if (gameState.testBit(Paused) || gameState.testBit(HallOfFame)) {
QTimer::singleShot(afterPauseMS, this, SLOT(ready()));
return;
}
if (gameState.testBit(Player)) {
emit setLifes(--lifes);
gameState.clearBit(Player);
gameState.clearBit(Init);
repaint(pix->rect(board->position(monsterhome, 0), tr("PLAYER ONE")), FALSE);
repaintFigures();
QTimer::singleShot(playerDurMS, this, SLOT(ready()));
return;
}
if (gameState.testBit(Ready)) {
gameState.clearBit(Ready);
repaint(pix->rect(board->position(fruithome), tr("READY!")), FALSE);
start();
} else {
gameState.setBit(Ready);
gameState.clearBit(Init);
repaint(pix->rect(board->position(fruithome), tr("READY!")), FALSE);
QTimer::singleShot(readyDurMS, this, SLOT(ready()));
}
}
void Referee::levelUp()
{
stop();
stopEnergizer();
gameState.setBit(LevelDone);
pacman->setPosition(pacman->position()); // set mouthPosition to "0"
repaint(pix->rect(pacman->position(), PacmanPix));
timerCount = 0;
QTimer::singleShot(levelUpPreAnimationMS, this, SLOT(levelUpPlay()));
}
void Referee::levelUpPlay()
{
if (gameState.testBit(Ready))
return;
if (gameState.testBit(Paused) || gameState.testBit(HallOfFame)) {
QTimer::singleShot(afterPauseMS, this, SLOT(levelUpPlay()));
return;
}
switch (timerCount) {
case 0 : gameState.setBit(Init);
setOnEnergizers();
repaintFigures();
break;
case 1 : gameState.clearBit(LevelDone);
repaint(pix->rect(pacman->position(), PacmanPix));
break;
}
if (timerCount++ < 2) {
QTimer::singleShot(levelUpAnimationMS, this, SLOT(levelUpPlay()));
return;
}
gameState.clearBit(Init);
if (gameState.testBit(Demonstration)) {
hallOfFame();
return;
}
if (level < maxLevel)
level++;
board->init(Level, mapName.at(level));
pix->setLevel(level);
initPacman();
initFruit();
initMonsters();
initEnergizers();
repaint();
emit setLevel(level);
ready();
}
void Referee::start()
{
if (gameState.testBit(Ready))
return;
if (gameState.testBit(Paused) || gameState.testBit(HallOfFame)) {
QTimer::singleShot(afterPauseMS, this, SLOT(start()));
return;
}
if (gameState.testBit(Scoring)) {
gameState.clearBit(Scoring);
repaint(pix->rect(pix->rect(pacman->position(), MonsterPix),
pix->rect(pacman->position(), MonsterScorePix, monstersEaten-1)));
}
if (!gameTimer)
gameTimer = startTimer( speed [level] );
if (!energizerTimer)
energizerTimer = startTimer( energizerAnimationMS );
}
void Referee::start(int t)
{
gameTimer = startTimer(t);
}
void Referee::stop()
{
if (gameTimer) {
killTimer (gameTimer);
gameTimer = 0;
}
}
void Referee::stopEnergizer()
{
if (energizerTimer) {
killTimer (energizerTimer);
energizerTimer = 0;
}
}
void Referee::killed()
{
if (gameState.testBit(Ready))
return;
if (!gameState.testBit(Dying)) {
gameState.setBit(Dying);
pacman->setDirection(X, TRUE);
for (Monster *m = monsters->first(); m != 0; m = monsters->next())
if (m)
m->setDirection(X);
QTimer::singleShot(dyingPreAnimationMS, this, SLOT(killed()));
} else {
stop();
if (gameState.testBit(Paused) || gameState.testBit(HallOfFame)) {
QTimer::singleShot(afterPauseMS, this, SLOT(killed()));
return;
}
gameState.setBit(Init);
repaintFigures();
timerCount = 0;
killedPlay();
}
}
void Referee::killedPlay()
{
if (!gameState.testBit(Dying) || gameState.testBit(Ready))
return;
if (gameState.testBit(Paused) || gameState.testBit(HallOfFame)) {
QTimer::singleShot(afterPauseMS, this, SLOT(killedPlay()));
return;
}
if (timerCount <= pix->maxPixmaps(DyingPix)) {
repaint(pix->rect(pacman->position(), PacmanPix), FALSE);
if (timerCount >= pix->maxPixmaps(DyingPix)-1 || timerCount == 0)
QTimer::singleShot(dyingPostAnimationMS, this, SLOT(killedPlay()));
else
QTimer::singleShot(dyingAnimationMS, this, SLOT(killedPlay()));
timerCount++;
} else {
gameState.clearBit(Dying);
stopEnergizer();
if (lifes == 0) {
gameState.setBit(GameOver);
gameState.clearBit(Playing);
for (int e = 0; e < board->energizers(); e++) {
energizers->at(e)->setOff();
repaint(pix->rect(board->position(energizer, e), EnergizerPix), FALSE);
}
repaint(pix->rect(board->position(fruithome), tr("GAME OVER")), FALSE);
QTimer::singleShot(gameOverDurMS, this, SLOT(hallOfFame()));
} else {
gameState.clearBit(Init);
initPacman();
initFruit();
initMonsters();
initEnergizers();
emit setLifes(--lifes);
repaintFigures();
ready();
}
}
}
void Referee::initPacman()
{
pacman->setMaxPixmaps(pix->maxPixmaps(PacmanPix));
pacman->setDemo(gameState.testBit(Demonstration));
pacman->setPosition(board->position(pacmanhome));
pacman->setDirection(W, TRUE);
pacman->setAlive(pacmanTicks[level]);
}
void Referee::initFruit(bool fullInitialization)
{
if (fullInitialization) {
fruit->setMaxPixmaps(pix->maxPixmaps(FruitPix));
if (fruitIndex[level] == 0)
fruit->setLevel(level, fruitAppearsTicks[level],
fruitDurTicks[level], fruitTicks[level]);
else if (fruitIndex[level] < 0)
fruit->setLevel(pix->maxPixmaps(FruitPix)+1,
fruitAppearsTicks[level],
fruitDurTicks[level], fruitTicks[level]);
else
fruit->setLevel(fruitIndex[level], fruitAppearsTicks[level],
fruitDurTicks[level], fruitTicks[level]);
}
if (board->tunnels() > 0)
fruit->setMovement(board->position(tunnel, rand() % board->tunnels()),
board->position(tunnel, rand() % board->tunnels()),
fruitIQ[level]);
}
void Referee::initMonsters()
{
if( !monsters->isEmpty())
monsters->clear();
if( !monsterRect->isEmpty())
monsterRect->clear();
for (int id = 0; id < (gameState.testBit(Introducing) ? 4 : board->monsters()); id++) {
Monster *m = new Monster(board, id);
monsters->append(m);
QRect *r = new QRect();
monsterRect->append(r);
if (!gameState.testBit(Introducing)) {
m->setFreedom(board->position(prisonexit));
m->setDangerous(dangerousTicks[level], monsterIQ[level]);
if (id == 0)
m->setPrison(board->position(prisonentry));
else {
m->setPrison(board->position(monsterhome, id));
m->setArrested(arrestTicks[level], arrestDurTicks[level]*id);
}
m->setPosition(board->position(monsterhome, id));
switch(id) {
case 0 : m->setDirection(W); break;
case 1 : m->setDirection(N); break;
default : m->setDirection(S);
}
}
m->setMaxPixmaps(pix->maxPixmaps(MonsterPix), pix->maxPixmaps(EyesPix));
}
}
void Referee::initEnergizers()
{
if( !energizers->isEmpty())
energizers->clear();
if( !energizerRect->isEmpty())
energizerRect->clear();
for (int id = 0; id < (gameState.testBit(Introducing) ? 2 : board->energizers()); id++) {
Energizer *e = new Energizer(board);
energizers->append(e);
QRect *r = new QRect();
energizerRect->append(r);
if (!gameState.testBit(Introducing)) {
e->setPosition(board->position(energizer, id));
e->setOn();
}
e->setMaxPixmaps(pix->maxPixmaps(EnergizerPix));
}
}
void Referee::setOnEnergizers()
{
for (int e = 0; e < board->energizers(); e++) {
energizers->at(e)->setOn();
}
}
void Referee::setFocusOutPause(bool FocusOutPause)
{
focusOutPause = FocusOutPause;
}
void Referee::setFocusInContinue(bool FocusInContinue)
{
focusInContinue = FocusInContinue;
}
void Referee::focusInEvent(QFocusEvent *)
{
if (focusInContinue && focusedPause &&
gameState.testBit(Paused) && gameState.testBit(Playing)) {
pause();
}
}
void Referee::focusOutEvent(QFocusEvent *)
{
if (focusOutPause && !gameState.testBit(Paused) && gameState.testBit(Playing)) {
focusedPause = TRUE;
pause();
}
}
diff --git a/noncore/games/kpacman/status.cpp b/noncore/games/kpacman/status.cpp
index 1ef910d..2a17c21 100644
--- a/noncore/games/kpacman/status.cpp
+++ b/noncore/games/kpacman/status.cpp
@@ -1,368 +1,368 @@
#include "portable.h"
#if defined( KDE2_PORT )
#include <kapp.h>
#include <klocale.h>
#include <kstddirs.h>
#include <status.h>
#include <status.moc>
#elif defined( QPE_PORT )
#include <qpe/qpeapplication.h>
-#include "config.h"
+#include <qpe/config.h>
#include "status.h"
#endif
#include <qpixmap.h>
#include <qbitmap.h>
#include <qstring.h>
#include <qmsgbox.h>
#include <qfileinfo.h>
Status::Status( QWidget *parent, const char *name, int Scheme, int Mode ) :
QWidget( parent, name )
{
qWarning("Status::Status");
actualLifes = 0;
actualLevel = 0;
lifesPix = NULL;
levelPix = NULL;
scheme = Scheme;
mode = Mode;
level = 0;
confScheme();
}
QList<QPixmap> *Status::loadPixmap(QWidget *parent, QString pixmapName,
QList<QPixmap> *pixmaps)
{
if (pixmaps == NULL) {
pixmaps = new QList<QPixmap>;
pixmaps->setAutoDelete(TRUE);
}
if (!pixmaps->isEmpty())
pixmaps->clear();
QPixmap PIXMAP(pixmapName);
if (PIXMAP.isNull() || PIXMAP.mask() == NULL) {
QString msg = tr("The pixmap could not be contructed.\n\n"
"The file '@PIXMAPNAME@' does not exist,\n"
"or is of an unknown format.");
msg.replace(QRegExp("@PIXMAPNAME@"), pixmapName);
QMessageBox::information(parent, tr("Initialization Error"),
(const char *) msg);
return 0;
}
int height = PIXMAP.height();
int width = (height == 0) ? 0 : PIXMAP.width()/(PIXMAP.width()/height);
QBitmap BITMAP;
QBitmap MASK;
BITMAP = *PIXMAP.mask();
MASK.resize(width, height);
for (int x = 0; x < PIXMAP.width()/width; x++) {
QPixmap *pixmap = new QPixmap(width, height);
pixmaps->append(pixmap);
bitBlt(pixmap, 0, 0, &PIXMAP, x*width, 0, width, height, CopyROP, TRUE);
bitBlt(&MASK, 0, 0, &BITMAP, x*width, 0, width, height, CopyROP, TRUE);
pixmap->setMask(MASK);
}
return pixmaps;
}
void Status::paintEvent( QPaintEvent *)
{
for (int x = 0; x < actualLifes && !lifesPix->isEmpty(); x++)
bitBlt(this, lifesPix->at(0)->width()+(lifesPix->at(0)->width()*x),
(height()-lifesPix->at(0)->height())/2,
lifesPix->at(0), 0, 0,
lifesPix->at(0)->width(), lifesPix->at(0)->height());
for (int x = 0; x < actualLevel && !levelPix->isEmpty(); x++) {
erase((width()-levelPix->at(x)->width()*2)-(levelPix->at(x)->width()*levelPos[x]),
(height()-levelPix->at(x)->height())/2,
levelPix->at(x)->width(), levelPix->at(x)->height());
bitBlt(this, (width()-levelPix->at(x)->width()*2)-(levelPix->at(x)->width()*levelPos[x]),
(height()-levelPix->at(x)->height())/2,
levelPix->at(x), 0, 0,
levelPix->at(x)->width(), levelPix->at(x)->height());
}
}
void Status::initPixmaps()
{
if (lastLifesPixmapName != lifesPixmapName.at(level)) {
lifesPix = loadPixmap(this, lifesPixmapName.at(level), lifesPix);
lastLifesPixmapName = lifesPixmapName.at(level);
}
if (lastLevelPixmapName != levelPixmapName.at(level)) {
levelPix = loadPixmap(this, levelPixmapName.at(level), levelPix);
lastLevelPixmapName = levelPixmapName.at(level);
}
}
QString Status::decodeHexOctString(QString s)
{
QString value;
QString valids;
int pos, xpos = 0, opos = 0;
int v, len, leadin;
const char *ptr;
uchar c;
while (((xpos = s.find(QRegExp("\\\\x[0-9a-fA-F]+"), xpos)) != -1) ||
((opos = s.find(QRegExp("\\\\[0-7]+"), opos)) != -1)) {
if (xpos != -1) {
valids = "0123456789abcdef";
leadin = 2;
pos = xpos;
} else {
valids = "01234567";
leadin = 1;
pos = opos;
}
c = '\0';
len = 0;
value = s.mid(pos+leadin, 3);
ptr = (const char *) value;
while (*ptr != '\0' && (v = valids.find(*ptr++, 0, FALSE)) != -1) {
c = (c * valids.length()) + v;
len++;
}
value.fill(c, 1);
s.replace(pos, len+leadin, value);
}
return s;
}
void Status::fillArray(QArray<int> &array, QString values, int max)
{
array.resize(max);
int last = 0;
bool ok;
QString value;
for (uint i = 0; i < array.size(); i++) {
if (values.find(',') < 0 && values.length() > 0) {
value = values;
values = "";
}
if (values.find(',') >= 0) {
value = values.left(values.find(','));
values.remove(0,values.find(',')+1);
}
array[i] = value.toInt(&ok);
if (ok)
last = array[i];
else
array[i] = last;
}
}
void Status::fillStrList(QStrList &list, QString values, int max)
{
if (!list.isEmpty())
list.clear();
QString last = "";
QString value;
for (uint i = 0; i < (uint) max; i++) {
if (values.find(',') < 0 && values.length() > 0) {
value = values;
values = "";
}
if (values.find(',') >= 0) {
value = values.left(values.find(','));
values.remove(0,values.find(',')+1);
}
if (!value.isEmpty())
last = decodeHexOctString(value);
list.append(last);
}
}
void Status::fillPixmapName(QStrList &pixmapName)
{
QStrList list = pixmapName;
if (!pixmapName.isEmpty())
pixmapName.clear();
QString pixmap;
QFileInfo fileInfo;
for (uint i = 0; i < list.count(); i++) {
pixmap = list.at(i);
if (pixmap.left(1) != "/" && pixmap.left(1) != "~")
pixmap = FIND_APP_DATA( pixmapDirectory+pixmap );
fileInfo.setFile(pixmap);
if (!fileInfo.isReadable() || !fileInfo.isFile())
pixmap = "";
pixmapName.append(pixmap);
}
}
void Status::confLevels(bool defGroup)
{
APP_CONFIG_BEGIN( cfg );
if (defGroup || cfg->hasKey("Levels"))
maxLevel = cfg->readNumEntry("Levels", 13);
APP_CONFIG_END( cfg );
}
void Status::confMisc(bool defGroup)
{
APP_CONFIG_BEGIN( cfg );
if (defGroup || cfg->hasKey("LevelPosition"))
fillArray(levelPos, cfg->readEntry("LevelPosition", "0,1,2,3,,4,,5,,6,,7"), maxLevel);
if (defGroup || cfg->hasKey("PixmapDirectory")) {
pixmapDirectory = cfg->readEntry("PixmapDirectory");
if (pixmapDirectory.left(1) != "/" && pixmapDirectory.left(1) != "~")
pixmapDirectory.insert(0, "pics/");
if (pixmapDirectory.right(1) != "/")
pixmapDirectory.append("/");
}
if (defGroup || cfg->hasKey("LifesPixmapName"))
fillStrList(lifesPixmapName,
cfg->readEntry("LifesPixmapName", "lifes.xpm"), maxLevel+1);
if (defGroup || cfg->hasKey("LevelPixmapName"))
fillStrList(levelPixmapName,
- cfg->readEntry("LevelPixmapName", "level.xpm"), maxLevel+1);
+ cfg->readEntry("LevelPixmapName", "fruit.xpm"), maxLevel+1);
APP_CONFIG_END( cfg );
}
void Status::confScheme()
{
APP_CONFIG_BEGIN( cfg );
SAVE_CONFIG_GROUP( cfg, oldgroup );
QString newgroup;
// if not set, read mode and scheme from the configfile
if (mode == -1 && scheme == -1) {
scheme = cfg->readNumEntry("Scheme", -1);
mode = cfg->readNumEntry("Mode", -1);
// if mode is not set in the defGroup-group, lookup the scheme group
if (scheme != -1 || mode == -1) {
newgroup.sprintf("Scheme %d", scheme);
cfg->setGroup(newgroup);
mode = cfg->readNumEntry("Mode", -1);
RESTORE_CONFIG_GROUP( cfg, oldgroup );
}
}
confLevels();
if (mode != -1) {
newgroup.sprintf("Mode %d", mode);
cfg->setGroup(newgroup);
confLevels(FALSE);
}
if (scheme != -1) {
newgroup.sprintf("Scheme %d", scheme);
cfg->setGroup(newgroup);
confLevels(FALSE);
}
RESTORE_CONFIG_GROUP( cfg, oldgroup );
confMisc();
if (mode != -1) {
newgroup.sprintf("Mode %d", mode);
cfg->setGroup(newgroup);
confMisc(FALSE);
}
if (scheme != -1) {
newgroup.sprintf("Scheme %d", scheme);
cfg->setGroup(newgroup);
confMisc(FALSE);
}
fillPixmapName(lifesPixmapName);
fillPixmapName(levelPixmapName);
initPixmaps();
setFixedHeight(minHeight());
RESTORE_CONFIG_GROUP( cfg, oldgroup );
APP_CONFIG_END( cfg );
}
void Status::setScheme(int Scheme, int Mode)
{
mode = Mode;
scheme = Scheme;
confScheme();
repaint();
}
int Status::minHeight()
{
if (lifesPix->isEmpty() && levelPix->isEmpty())
return 0;
if (levelPix->isEmpty())
return lifesPix->at(0)->height();
if (lifesPix->isEmpty())
return levelPix->at(0)->height();
return (lifesPix->at(0)->height() > levelPix->at(0)->height()) ?
lifesPix->at(0)->height() : levelPix->at(0)->height();
}
int Status::minWidth()
{
if (lifesPix->isEmpty() && levelPix->isEmpty())
return 0;
if (levelPix->isEmpty())
return lifesPix->at(0)->width();
if (lifesPix->isEmpty())
return levelPix->at(0)->width();
return (lifesPix->at(0)->width() > levelPix->at(0)->width()) ?
lifesPix->at(0)->width() : levelPix->at(0)->width();
}
void Status::setLifes(int lifes)
{
actualLifes = lifes;
repaint();
}
void Status::setLevel(int Level)
{
level = Level;
initPixmaps();
actualLevel = (level > (int) levelPix->count()) ? (int) levelPix->count() : level;
repaint();
}