-rw-r--r-- | noncore/games/kpacman/kpacman.cpp | 23 | ||||
-rw-r--r-- | noncore/games/kpacman/kpacman.h | 18 | ||||
-rw-r--r-- | noncore/games/kpacman/kpacmanwidget.cpp | 9 | ||||
-rw-r--r-- | noncore/games/kpacman/referee.cpp | 4 | ||||
-rw-r--r-- | noncore/games/kpacman/score.cpp | 61 |
5 files changed, 14 insertions, 101 deletions
diff --git a/noncore/games/kpacman/kpacman.cpp b/noncore/games/kpacman/kpacman.cpp index 7df6ef0..d9d2d69 100644 --- a/noncore/games/kpacman/kpacman.cpp +++ b/noncore/games/kpacman/kpacman.cpp @@ -1,265 +1,260 @@ #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 <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(); - view = new KpacmanWidget( this, QString(name)+"widget"); + m_view = new QWidget( this, "m_view" ); + m_view->setBackgroundColor( black ); + m_layout = new QGridLayout( m_view ); + m_layout->setMargin( 7 ); -#ifndef QWS - setFixedSize(view->width(), view->height()); -#else - setCaption( "Kpacman" ); -#endif + 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(); -#ifndef QWS - menuBar->show(); - view->show(); - setMenu(menuBar); - setView(view); -#else - setCentralWidget( view ); -#endif + setCentralWidget( m_view ); } Kpacman::~Kpacman() { 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 QWS 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 QWS _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); 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 diff --git a/noncore/games/kpacman/kpacman.h b/noncore/games/kpacman/kpacman.h index d7de9de..2c1de70 100644 --- a/noncore/games/kpacman/kpacman.h +++ b/noncore/games/kpacman/kpacman.h @@ -1,95 +1,83 @@ #ifndef KPACMAN_H #define KPACMAN_H #ifdef HAVE_CONFIG_H #include <config.h> #endif #include "portable.h" -#if defined( KDE2_PORT ) -#include <kapp.h> -#include <klocale.h> -#include <ktmainwindow.h> -#include <kmenubar.h> -#elif defined( QPE_PORT ) #include <qmainwindow.h> class QMenuBar; -#endif - #include <qregexp.h> #include "kpacmanwidget.h" #include <qpopmenu.h> #include <qlist.h> #include <qfileinf.h> +#include <qlayout.h> -#if defined( KDE2_PORT ) -#include <referee.h> -#include <status.h> -#include <score.h> -#include <keys.h> -#elif defined( QPE_PORT ) #include "referee.h" #include "status.h" #include "score.h" #include "keys.h" -#endif class Kpacman : public KTMainWindow { Q_OBJECT public: Kpacman(QWidget *parent = 0, const char *name = 0); virtual ~Kpacman(); public slots: void forcedHallOfFame(bool); private slots: void newKpacman(); void pauseKpacman(); void toggleHallOfFame(); void toggleNew(); void togglePaused(); void quitKpacman(); void schemeChecked(int); void toggleFocusOutPause(); void toggleFocusInContinue(); void toggleHideMouseCursor(); void confKeys(); protected: private: KpacmanWidget *view; void menu(); int lookupSchemes(); + QGridLayout *m_layout; + QWidget *m_view; KMenuBar *_menuBar; QPopupMenu *gamePopup; QPopupMenu *optionsPopup; QPopupMenu *modesPopup; QList<QPopupMenu> *schemesPopup; int newID; int pauseID; int hofID; QArray<int> modeID; QArray<int> schemeID; QArray<int> schemeMode; int focusOutPauseID; int focusInContinueID; int hideMouseCursorID; bool focusOutPause; bool focusInContinue; bool hideMouseCursor; }; #endif // KPACMAN_H diff --git a/noncore/games/kpacman/kpacmanwidget.cpp b/noncore/games/kpacman/kpacmanwidget.cpp index 215dcda..feb782c 100644 --- a/noncore/games/kpacman/kpacmanwidget.cpp +++ b/noncore/games/kpacman/kpacmanwidget.cpp @@ -1,162 +1,153 @@ #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 "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 ) { 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); -#ifndef QWS - setFixedSize(referee->width(), bitfont->height()*3 + referee->height() + status->height()); -#else setBackgroundColor( black ); -#endif } 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); -#ifndef QWS - setFixedSize(referee->width(), - bitfont->height()*3 + referee->height() + status->height()); -#endif - score->repaint(FALSE); referee->repaint(FALSE); status->repaint(FALSE); } void KpacmanWidget::resizeEvent( QResizeEvent * ) { referee->setGeometry(0, bitfont->height()*3, referee->width(), referee->height()); referee->setBackgroundColor(BLACK); 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/referee.cpp b/noncore/games/kpacman/referee.cpp index 70916f0..81f331b 100644 --- a/noncore/games/kpacman/referee.cpp +++ b/noncore/games/kpacman/referee.cpp @@ -542,388 +542,388 @@ void Referee::confMisc(bool defGroup) } 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(); #ifdef QWS // "OK" => new game if ( key == Key_F33 || key == Key_F2 || key == Key_Enter ) play(); else if ( !gameState.testBit(Playing) && - key == Key_Up || + ( key == Key_Up || key == Key_Down || key == Key_Right || - key == Key_Left ) + key == Key_Left )) play(); // "Space" => pause //else if ( key == Key_Space || key == Key_F3 ) // pause(); // "Menu" => hall of fame //else if ( key == Key_F11 || key == Key_F4 ) // toggleHallOfFame(); #endif 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); diff --git a/noncore/games/kpacman/score.cpp b/noncore/games/kpacman/score.cpp index 17dbf0a..b3ff3d9 100644 --- a/noncore/games/kpacman/score.cpp +++ b/noncore/games/kpacman/score.cpp @@ -289,354 +289,293 @@ void Score::confTiming(bool defGroup) if (defGroup || cfg->hasKey("AfterPauseMS")) afterPauseMS = cfg->readNumEntry("AfterPauseMS", 1000); APP_CONFIG_END( cfg ); } void Score::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 ); } } int oldCursorBlinkMS = cursorBlinkMS; confTiming(); if (mode != -1) { newgroup.sprintf("Mode %d", mode); cfg->setGroup(newgroup); confTiming(FALSE); } if (scheme != -1) { newgroup.sprintf("Scheme %d", scheme); cfg->setGroup(newgroup); confTiming(FALSE); } if (cursorBlinkMS != oldCursorBlinkMS) { if (cursorBlinkTimer) killTimer(cursorBlinkTimer); cursorBlinkTimer = startTimer(cursorBlinkMS); } RESTORE_CONFIG_GROUP( cfg, oldgroup ); APP_CONFIG_END( cfg ); } void Score::setScheme(int Scheme, int Mode, Bitfont *font) { mode = Mode; scheme = Scheme; confScheme(); bitfont = font; for (int p = 0; p < maxPlayer; p++) for (uint i = 0; i < playerName[p].length(); i++) if (playerName[p].at(i) < bitfont->firstChar() || playerName[p].at(i) > bitfont->lastChar()) playerName[p].at(i) = playerName[p].at(i).upper(); for (int i = 0; i < 10; i++) for (uint j = 0; j < hallOfFame[i].name.length(); j++) if (hallOfFame[i].name.at(j) < bitfont->firstChar() || hallOfFame[i].name.at(j) > bitfont->lastChar()) hallOfFame[i].name.at(j) = hallOfFame[i].name.at(j).upper(); if (cursor.chr.unicode() < bitfont->firstChar() || cursor.chr.unicode() > bitfont->lastChar()) cursor.chr = cursor.chr.upper(); } void Score::set(int score) { set(score, 0); } void Score::set(int score, int player) { if (player < 0 || player >= maxPlayer) return; lastPlayer = player; playerScore[lastPlayer] = score; QString s; s.sprintf("%6d0", playerScore[lastPlayer]/10); repaint(rect(0, 1, s), FALSE); if (score > HighScore) { HighScore = score; s.sprintf("%8d0", HighScore/10); repaint(rect(8, 1, s), FALSE); } } /* * Set the score for player after the game if over. If the score is in the * high scores then the hall of fame is updated (shifted) and the scoreboard * is shown. */ void Score::setScore(int level, int player) { lastScore = -1; if (player < 0 || player >= maxPlayer || level == 0) { if (level != 0) emit toggleNew(); QTimer::singleShot(hallOfFameMS, this, SLOT(end())); return; } lastPlayer = player; for (int i = 0; i < 10; i++) if ( playerScore[lastPlayer] > hallOfFame[i].points) { lastScore = i; break; } if (lastScore < 0) { emit toggleNew(); QTimer::singleShot(hallOfFameMS, this, SLOT(end())); return; } for (int i = 9; i > lastScore && i > 0; i--) hallOfFame[i] = hallOfFame[i-1]; hallOfFame[lastScore].points = playerScore[lastPlayer]; hallOfFame[lastScore].levels = level; hallOfFame[lastScore].moment = QDateTime::currentDateTime(); hallOfFame[lastScore].name = playerName[lastPlayer]; cursor.x = 14; cursor.y = 11+lastScore; cursor.chr = hallOfFame[lastScore].name.at(cursor.x-14); // startTimer(cursorBlinkMS); setFocus(); } /* * Read the highscores, if no file or a file shorter than 4 bytes (versions before 0.2.4 stores only * the points of one highscore) exists - the highscores were initialized with default values. */ void Score::read() { if (highscoreFile.exists() && highscoreFile.size() > 4) { if (highscoreFile.open(IO_ReadOnly)) { QDataStream s(&highscoreFile); char *name; for (int i = 0; i < 10; i++) { s >> hallOfFame[i].points >> hallOfFame[i].levels >> hallOfFame[i].duration >> hallOfFame[i].moment >> name; hallOfFame[i].name = QString::fromLatin1(name); delete(name); } highscoreFile.close(); } } else { for (int i = 0; i < 10; i++) { hallOfFame[i].points = 5000; hallOfFame[i].levels = 0; hallOfFame[i].duration = QTime(); hallOfFame[i].moment = QDateTime(); hallOfFame[i].name = "???"; } // write(); } for (int i = 0; i < 10; i++) for (uint j = 0; j < hallOfFame[i].name.length(); j++) if (hallOfFame[i].name.at(j) < bitfont->firstChar() || hallOfFame[i].name.at(j) > bitfont->lastChar()) hallOfFame[i].name.at(j) = hallOfFame[i].name.at(j).upper(); HighScore = hallOfFame[0].points; } void Score::write() { -#ifndef QWS - if (!highscoreFile.exists() && highscoreFile.name() == systemHighscoreFileInfo.filePath()) - KMessageBox::information(0, - tr("You're going to create the highscore-file\n" - "'%1'\n" - "for your maschine, that should be used systemwide.\n" - "\n" - "To grant access to the other users, set the appropriate rights (a+w)\n" - "on that file or ask your systemadministator for that favor.\n" - "\n" - "To use a different directory or filename for the highscores," - "specify them in the configfile (kpacmanrc:highscoreFilePath)." - ).arg(systemHighscoreFileInfo.filePath())); - - if (highscoreFile.name() == privateHighscoreFileInfo.filePath()) - KMessageBox::information(0, - tr("You're using a private highscore-file, that's mostly because of\n" - "missing write-access to the systemwide file\n" - "'%1' .\n" - "\n" - "Ask your systemadministrator for granting you access to that file,\n" - "by setting the appropriate rights (a+w) on it.\n" - "\n" - "To use a different directory or filename for the highscores," - "specify them in the configfile (kpacmanrc:highscoreFilePath)." - ).arg(systemHighscoreFileInfo.filePath()), - QString::null, "PrivateHighscore"); -#endif if (highscoreFile.open(IO_WriteOnly)) { QDataStream s(&highscoreFile); for (int i = 0; i < 10; i++) s << hallOfFame[i].points << hallOfFame[i].levels << hallOfFame[i].duration << hallOfFame[i].moment << hallOfFame[i].name.latin1(); highscoreFile.close(); } } void Score::setPause(bool Paused) { paused = Paused; QRect r = bitfont->rect(tr("PAUSED")); r.moveCenter(QPoint(this->width()/2, this->height()/2)); repaint(r, TRUE); // repaint 1UP or 2UP repaint(FALSE); } void Score::end() { if (paused) { QTimer::singleShot(afterPauseMS, this, SLOT(end())); return; } // repaint 1UP or 2UP lastPlayer = -1; repaint(FALSE); emit forcedHallOfFame(FALSE); } /* * Return the date in a formatted QString. The format can be changed using internationalization * of the string "YY/MM/DD". Invalid QDate's where returned as "00/00/00". */ QString Score::formatDate(QDate date) { QString s = tr("@YY@/@MM@/@DD@"); QString dd; dd.sprintf("%02d", date.isValid() ? date.year() % 100 : 0); s.replace(QRegExp("@YY@"), dd); dd.sprintf("%02d", date.isValid() ? date.month() : 0); s.replace(QRegExp("@MM@"), dd); dd.sprintf("%02d", date.isValid() ? date.day() : 0); s.replace(QRegExp("@DD@"), dd); return s; } QRect Score::rect(int col, float row, QString str, int align) { QRect r = bitfont->rect(str); r.moveBy(x(col), y(row)); int dx = 0; int dy = 0; if (align & AlignLeft || align & AlignRight) { dx = (str.length()-1) * (bitfont->width()/2); if (align & AlignRight) dx *= -1; } if (align & AlignTop || align & AlignBottom) { dy = bitfont->height()/2; if (align & AlignBottom) dy *= -1; } if (dx != 0 || dy != 0) r.moveBy(dx, dy); return r; } int Score::x(int col) { return col*bitfont->width(); } int Score::y(float row) { return (int) (row*(bitfont->height()+bitfont->height()/4)); } /** * Ermittelt die zu benutzende "highscore"-Datei, in die auch geschrieben werden kann. * Über den "highscoreFilePath"-KConfig-Eintrag, kann abweichend von der Standardlokation * der Standort der "highscore"-Datei spezifiziert werden. * Wenn die systemweite "highscore"-Datei nicht beschrieben werden kann, wird mit einer * privaten Datei gearbeitet. */ QFileInfo Score::locateHighscoreFilePath() { -#ifndef QWS - QFileInfo systemHighscoreDirPath; - QStringList systemHighscoreDirs; - - // Schreibfähige "private" highscore-Datei ermitteln für den fallback. - privateHighscoreFileInfo.setFile(KGlobal::dirs()->saveLocation("appdata")+highscoreName); - - // FilePath aus der Konfigurationsdatei benutzen - systemHighscoreFileInfo.setFile(cfg->readEntry("HighscoreFilePath")); - - // Kein Wert aus der Konfiguration erhalten, dann die "system"-Datei suchen. - if (systemHighscoreFileInfo.filePath().isEmpty()) - systemHighscoreDirs = KGlobal::dirs()->resourceDirs("appdata"); - else - systemHighscoreDirs = QStringList(systemHighscoreFileInfo.filePath()); - - for (QStringList::Iterator i = systemHighscoreDirs.begin(); i != systemHighscoreDirs.end(); ++i) { - - systemHighscoreFileInfo.setFile(*i); - if (systemHighscoreFileInfo.fileName().isEmpty()) - systemHighscoreFileInfo.setFile(systemHighscoreFileInfo.dirPath()+"/"+highscoreName); - - // privateHighscoreFileInfo für die "system" Suche ignorieren - if (systemHighscoreFileInfo.filePath() != privateHighscoreFileInfo.filePath()) - if (!systemHighscoreFileInfo.exists()) { - systemHighscoreDirPath.setFile(systemHighscoreFileInfo.dirPath()); - if (systemHighscoreDirPath.exists() && systemHighscoreDirPath.isWritable()) - return systemHighscoreFileInfo; - } else - if (systemHighscoreFileInfo.isWritable()) - return systemHighscoreFileInfo; - } -#endif return privateHighscoreFileInfo; } |