00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
00104 for (u8 i=0; i<3; ++i)
00105 gameTop->pickupSpawners[i] = NULL;
00106
00107 if (gameTop->player1 != NULL)
00108 gameTop->player1 = NULL;
00109 if (gameTop->player2 != NULL)
00110 gameTop->player2 = NULL;
00111
00112
00113 gameTop->deactivate();
00114 deactivate();
00115 PA_WaitForVBL();
00116 menuTop->activate();
00117 menuBase->activate();
00118
00119 UnpauseTimer(gameTop->statTimerID);
00120 } else if (Pad.Released.A)
00121 {
00122 gamePaused = false;
00123
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) {
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
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
00211 if (gameTop->pickupSpawners[i] != NULL)
00212 gameTop->pickupSpawners[i]->addSpawnTime(3, gameTop->pickupMask[pType]);
00213
00214 ++pickupsActive;
00215 resetIdleTime(i);
00216
00217
00218
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
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)
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();
00296 spawnerSpriteR->makeStatic();
00297
00298 for (u8 i=0; i<10; ++i)
00299 {
00300 spawnerSprites[i]->updateSprite();
00301 spawnerSprites[i]->makeStatic();
00302 }
00303
00304
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 }