C:/DevKitPro/!MDuel/source/menuGBottom.cpp

Go to the documentation of this file.
00001 /*
00002  * Marshmallow Duel DS v2
00003  * Copyright © 2007 Sam Pospischil http://pospi.spadgos.com
00004  * 
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License as published by
00007  * the Free Software Foundation; either version 2 of the License, or
00008  * (at your option) any later version.
00009  * 
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00013  * GNU General Public License for more details.
00014  * 
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
00018  */
00019 
00020 #include "menuGBottom.h"
00021 #include "gameManager.h"
00022 #include "menuBottom.h"
00023 #include "pickupSpawner.h"
00024 
00030 menuGBottom::menuGBottom(u8 newScreen) : spriteManager(newScreen), gameTop(NULL), menuTop(NULL), menuBase(NULL), 
00031         gameOver(false), gamePaused(false), pickupsActive(0), continueMsg(NULL), quitMsg(NULL), spawnerSpriteL(NULL),
00032         spawnerSpriteR(NULL)
00033 {
00034         
00035 }
00036         
00037 menuGBottom::~menuGBottom()
00038 {
00039         
00040 }
00041 
00046 void menuGBottom::gameTick()
00047 {
00048         if (!gamePaused)
00049                 spriteManager::gameTick();
00050         
00051         PA_OutputText(screen, (gameTop->pointsToWin > 10 ? 1 : 2), 22, "%d / %d", gameTop->p1score, gameTop->pointsToWin);
00052         PA_OutputText(screen, (gameTop->pointsToWin > 10 ? 22 : 23), 22, "%d / %d", gameTop->p2score, gameTop->pointsToWin);
00053                 
00054         if (gameOver)
00055         {
00056                 if (continueMsg == NULL)
00057                 {
00058                         continueMsg = new spriteObject(this);
00059                         continueMsg->setPallete(menuSprite.palleteID);
00060                         continueMsg->giveSprite(menuSprite.spriteData, OBJ_SIZE_64X32, 32, 16, 0, 128, 191-8);
00061                         continueMsg->setLayer(0);
00062                         continueMsg->setFrame(7);
00063                         continueMsg->makeStatic();
00064                 }
00065                 
00066                 if (gameTop->p1score == gameTop->p2score)
00067                         PA_OutputText(screen, 9, 20, "Game Tied!");
00068                 else
00069                         PA_OutputText(screen, 9, 20, "%s wins!", (gameTop->p1score > gameTop->p2score ? const_cast<char*>(macros::getPlayerName(menuBase->player1id, menuBase->playerNames, false).c_str()) : const_cast<char*>(macros::getPlayerName(menuBase->player2id, menuBase->playerNames, false).c_str())));
00070                 if (Pad.Released.A)
00071                 {
00072                         gameTop->deactivate();
00073                         deactivate();
00074                         PA_WaitForVBL();
00075                         menuTop->activate();
00076                         menuBase->activate();
00077                 }
00078         }
00079         else if (gamePaused)
00080         {
00081                 if (continueMsg == NULL)
00082                 {
00083                         continueMsg = new spriteObject(this);
00084                         continueMsg->setPallete(menuSprite.palleteID);
00085                         continueMsg->giveSprite(menuSprite.spriteData, OBJ_SIZE_64X32, 32, 16, 0, 96, 191-8);
00086                         continueMsg->setLayer(0);
00087                         continueMsg->setFrame(7);
00088                         continueMsg->makeStatic();
00089                         PA_OutputText(screen, 10, 20, "Game Paused");
00090                 }
00091                 if (quitMsg == NULL)
00092                 {
00093                         quitMsg = new spriteObject(this);
00094                         quitMsg->setPallete(menuSprite.palleteID);
00095                         quitMsg->giveSprite(menuSprite.spriteData, OBJ_SIZE_64X32, 32, 16, 0, 160, 191-8);
00096                         quitMsg->setLayer(0);
00097                         quitMsg->setFrame(8);
00098                         quitMsg->makeStatic();
00099                 }
00100                 
00101                 if (Pad.Released.B)
00102                 {
00103                         //have to do all this stuff first or the game's goin to crash bigtime
00104                         for (u8 i=0; i<3; ++i)
00105                                 gameTop->pickupSpawners[i] = NULL;
00106                         //gameTop->clearOutSprites();
00107                         if (gameTop->player1 != NULL)
00108                                 gameTop->player1 = NULL;
00109                         if (gameTop->player2 != NULL)
00110                                 gameTop->player2 = NULL;
00111                         //gameTop->refreshPalletes();
00112                         
00113                         gameTop->deactivate();
00114                         deactivate();
00115                         PA_WaitForVBL();
00116                         menuTop->activate();
00117                         menuBase->activate();
00118                         //start main timer
00119                         UnpauseTimer(gameTop->statTimerID);
00120                 } else if (Pad.Released.A)              //with release means player2 doesnt move afterwards
00121                 {
00122                         gamePaused = false;
00123                         //start main timer
00124                         UnpauseTimer(gameTop->statTimerID);
00125                 }
00126         } else {
00127                 if (continueMsg != NULL)
00128                 {
00129                         continueMsg->destroy();
00130                         continueMsg = NULL;
00131                         PA_OutputText(screen, 10, 20, "           ");
00132                 }
00133                 if (quitMsg != NULL)
00134                 {
00135                         quitMsg->destroy();
00136                         quitMsg = NULL;
00137                 }
00138                 for (u8 i=0; i<3; ++i)
00139                 {
00140                         if (spawnerCounters[i] == 0 && gameTop->pickupMask.size() > 0 && pickupsActive < menuBase->numPickups && gameTop->allowPickupSpawning())
00141                                 spawnPickup(i);
00142                         if (spawnerCounters[i] > -1)
00143                                 spawnerCounters[i]--;
00144                 }
00145         }
00146 }
00147 
00154 void menuGBottom::resetIdleTime(u8 spawnerNum)
00155 {
00156         if (menuBase->numPickups < 3) {         //pick a random one if we have less Pickups than spawners
00157                 spawnerNum = PA_RandMax(2);
00158                 
00159                 u8 i = 0;
00160                 while (spawnerCounters[spawnerNum] > 0 && i < 3) {
00161                         ++spawnerNum;
00162                         spawnerNum %= 3;
00163                         ++i;
00164                 }
00165         }
00166         spawnerCounters[spawnerNum] = PA_RandMinMax(pickupSpawner::IDLEMIN, pickupSpawner::IDLEMAX)*spriteObject::TICKSPERFRAME;
00167 }
00168 
00176 void menuGBottom::spawnPickup(u8 i)
00177 {
00178         //spawn a pickup icon on the bottom screen
00179         u8 pType = PA_RandMax(gameTop->pickupMask.size()-1);
00180         
00181         spriteObject *icon = new spriteObject(this);
00182         icon->setPallete(pickupSprite.palleteID);
00183         icon->giveSprite(pickupSprite.spriteData, OBJ_SIZE_16X16, 8, 8);
00184         icon->setFrame(gameTop->pickupMask[pType]+3);
00185         icon->setLayer(1);
00186         spriteObject *icons = new spriteObject(this);
00187         icons->setPallete(pickupSprite.palleteID);
00188         icons->giveSprite(pickupSprite.spriteData, OBJ_SIZE_16X16, 8, 8);
00189         icons->setAnim(0,2,spriteObject::ANIMSPEED);
00190         icons->setLayer(1);
00191         icons->addChild(icon);
00192         icons->setPos(128, 100);
00193         float speedx, speedy;
00194         if (i==2)
00195         {
00196                 speedx = 0;
00197                 speedy = -1;
00198                 icons->setLifetime(2);
00199         } else if (i==1) {
00200                 speedx = 1;
00201                 speedy = 0;
00202                 icons->setLifetime(3);
00203         } else {
00204                 speedx = -1;
00205                 speedy = 0;
00206                 icons->setLifetime(3);
00207         }
00208         icons->setSpeed(speedx, speedy);
00209         
00210         //now tell top screen to spawn it soon
00211         if (gameTop->pickupSpawners[i] != NULL)
00212                 gameTop->pickupSpawners[i]->addSpawnTime(3, gameTop->pickupMask[pType]);
00213         
00214         ++pickupsActive;
00215         resetIdleTime(i);
00216         
00217         
00218         //make pretty flashy animations
00219         if (menuBase->showPickups) {
00220                 u8 f[3] = {3, 3, 5};
00221                 vector<u8> temp(f, f+3);
00222                 spawnerSpriteL->setArbitraryAnim(temp, false);
00223                 u8 g[3] = {4, 4, 6};
00224                 vector<u8> temp2(g, g+3);
00225                 spawnerSpriteR->setArbitraryAnim(temp2, false);
00226         }
00227 }
00228 
00233 void menuGBottom::loadBackground()
00234 {
00235         //PA_SetVideoMode(screen, 1);
00236         PA_EasyBgLoad(screen, 3, ::spawnerBG);
00237                 
00238         u8 spriteOffset = (menuBase->showPickups ? _SPAWNERSPRITEMININDEX : 0);
00239         
00240         spriteObject * spawnerSprites[8];
00241         
00242         for (u8 i=0; i<10; ++i)
00243         {
00244                 spawnerSprites[i] = new spriteObject(this);
00245                 spawnerSprites[i]->setPallete(spawnerSprite.palleteID);
00246                 spawnerSprites[i]->giveSprite(spawnerSprite.spriteData, OBJ_SIZE_64X64, 32, 32, spriteOffset);
00247                 
00248                 if (i<4)
00249                         spawnerSprites[i]->setLayer(0);
00250                 else {
00251                         spawnerSprites[i]->setLayer(1);
00252                         if (menuBase->showPickups)              //just dont transparentify the glass to hide :P
00253                                 spawnerSprites[i]->setTransparency(6);
00254                 }
00255         }
00256         
00257         spawnerSprites[0]->setFrame(0);
00258         spawnerSprites[0]->setPos(128, -27);
00259         spawnerSprites[1]->setFrame(1);
00260         spawnerSprites[1]->setPos(128, 37);
00261         spawnerSprites[2]->setFrame(2);
00262         spawnerSprites[2]->setPos(32, 101);
00263         spawnerSprites[3]->setFrame(2);
00264         spawnerSprites[3]->setPos(224, 101);
00265         spawnerSprites[3]->setFlipped(true);
00266         
00267         spawnerSprites[4]->setFrame(9);
00268         spawnerSprites[4]->setPos(32, 101);
00269         spawnerSprites[5]->setFrame(10);
00270         spawnerSprites[5]->setPos(96, 101);
00271         spawnerSprites[6]->setFrame(10);
00272         spawnerSprites[6]->setPos(160, 101);
00273         spawnerSprites[6]->setFlipped(true);
00274         spawnerSprites[7]->setFrame(9);
00275         spawnerSprites[7]->setPos(224, 101);
00276         spawnerSprites[7]->setFlipped(true);
00277         spawnerSprites[8]->setFrame(7);
00278         spawnerSprites[8]->setPos(128, -27);
00279         spawnerSprites[9]->setFrame(8);
00280         spawnerSprites[9]->setPos(128, 37);
00281         
00282         spawnerSpriteL = new spriteObject(this);
00283         spawnerSpriteL->setPallete(spawnerSprite.palleteID);
00284         spawnerSpriteL->giveSprite(spawnerSprite.spriteData, OBJ_SIZE_64X64, 32, 32, spriteOffset, 96, 101);
00285         spawnerSpriteL->setLayer(0);
00286         spawnerSpriteL->setFrame(5);
00287         spawnerSpriteR = new spriteObject(this);
00288         spawnerSpriteR->setPallete(spawnerSprite.palleteID);
00289         spawnerSpriteR->giveSprite(spawnerSprite.spriteData, OBJ_SIZE_64X64, 32, 32, spriteOffset, 160, 101);
00290         spawnerSpriteR->setLayer(0);
00291         spawnerSpriteR->setFrame(6);
00292 
00293         spawnerSpriteL->updateSprite();
00294         spawnerSpriteR->updateSprite();
00295         spawnerSpriteL->makeStatic();           //maybe not..?
00296         spawnerSpriteR->makeStatic();
00297         
00298         for (u8 i=0; i<10; ++i)
00299         {
00300                 spawnerSprites[i]->updateSprite();
00301                 spawnerSprites[i]->makeStatic();
00302         }
00303         
00304         //this text goes here because we only need to draw it once
00305         PA_OutputText(screen, 1, 21, const_cast<char*>(macros::getPlayerName(menuBase->player1id, menuBase->playerNames).c_str()));
00306         PA_OutputText(screen, 22, 21, const_cast<char*>(macros::getPlayerName(menuBase->player2id, menuBase->playerNames).c_str()));
00307         PA_OutputText(screen, 15, 21, "VS");
00308 }
00309 
00311 void menuGBottom::loadMenuSpriteSet(const unsigned short *p, const unsigned char *s)
00312 {
00313         loadSpriteSet(&menuSprite, p, s);
00314 }
00315 
00317 void menuGBottom::loadSpawnerSpriteSet(const unsigned short *p, const unsigned char *s)
00318 {
00319         loadSpriteSet(&spawnerSprite, p, s);
00320 }
00321 
00323 void menuGBottom::loadPickupSpriteSet(const unsigned short *p, const unsigned char *s)
00324 {
00325         loadSpriteSet(&pickupSprite, p, s);
00326 }

Generated on Tue Mar 13 23:27:53 2007 for MDuel DS by  doxygen 1.5.1-p1