diff --git a/source/game/pause.cpp b/source/game/pause.cpp index 4fa6e973d..e7a1d06ed 100644 --- a/source/game/pause.cpp +++ b/source/game/pause.cpp @@ -19,6 +19,14 @@ #include "system\vid.h" #include "game\pause.h" +#ifndef __GFX_FONT_H__ +#include "gfx\font.h" +#endif + +#ifndef __GFX_SPRBANK_H__ +#include "gfx\sprbank.h" +#endif + #ifndef __GUI_GFRAME_H__ #include "gui\gframe.h" #endif @@ -27,6 +35,10 @@ #include "gui\gfactory.h" #endif +#ifndef __GUI_GTEXTBOX_H__ +#include "gui\gtextbox.h" +#endif + #ifndef __MEMORY_HEADER__ #include "mem\memory.h" #endif @@ -50,6 +62,10 @@ #include #endif +#ifndef __SPR_SPRITES_H__ +#include +#endif + /*---------------------------------------------------------------------- Tyepdefs && Defines @@ -74,7 +90,7 @@ Returns: ---------------------------------------------------------------------- */ static const int FRAME_WIDTH =352; -static const int FRAME_HEIGHT =160; +static const int FRAME_HEIGHT =160-64; static const int TEXT_BOX_WIDTH =300; static const int TEXT_BOX_HEIGHT =20; static const int TEXT_SPACING =13; @@ -86,95 +102,108 @@ static CGUITextReadout::TextReadoutData inv_readoutdata[2]={{0,STR__OFF},{1,STR_ void CPauseMenu::init() { - m_guiFrame=new ("Conversation GUI") CGUIControlFrame(); - m_guiFrame->init(0); - m_guiFrame->setObjectXYWH((INGAME_SCREENW-FRAME_WIDTH)/2,(INGAME_SCREENH-FRAME_HEIGHT)/2,FRAME_WIDTH,FRAME_HEIGHT); - m_guiFrame->setFlags(CGUIObject::FLAG_DRAWBORDER); + int xpos; + CGUITextBox *tb; - int xpos=TEXT_SPACING/2; -#if defined (__USER_paul__) || defined (__USER_charles__) - CGUIFactory::createValueButtonFrame(m_guiFrame, + // MAIN MENU + m_pauseGuiFrame=new ("Conversation GUI") CGUIControlFrame(); + m_pauseGuiFrame->init(0); + m_pauseGuiFrame->setObjectXYWH((INGAME_SCREENW-FRAME_WIDTH)/2,(INGAME_SCREENH-FRAME_HEIGHT)/2,FRAME_WIDTH,FRAME_HEIGHT); + m_pauseGuiFrame->setFlags(CGUIObject::FLAG_DRAWBORDER); + + xpos=TEXT_SPACING/2; + tb=new ("textbox") CGUITextBox(); + tb->init(m_pauseGuiFrame); + tb->setObjectXYWH((FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT); + tb->setText(STR__PAUSE_MENU__GAME_PAUSED); + xpos+=TEXT_SPACING*2; + CGUIFactory::createValueButtonFrame(m_pauseGuiFrame, (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, STR__PAUSE_MENU__CONTINUE, - &m_exitPauseMenuFlag,true); - xpos+=TEXT_SPACING; - CGUIFactory::createValueButtonFrame(m_guiFrame, + &m_responseFlag,RESPONSE__CONTINUE); + xpos+=TEXT_SPACING*2; + CGUIFactory::createValueButtonFrame(m_pauseGuiFrame, (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, STR__PAUSE_MENU__QUIT, - &m_quitGameFlag,true); - xpos+=TEXT_SPACING+(TEXT_SPACING/2); + &m_responseFlag,RESPONSE__QUIT); - - CGUIFactory::createCycleButtonFrame(m_guiFrame, +#ifdef __VERSION_DEBUG__ + xpos+=8; + CGUIFactory::createCycleButtonFrame(m_pauseGuiFrame, (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, STR__INVINCIBILE_SPONGEBOB, &invincibleSponge,inv_data,inv_readoutdata); - xpos+=TEXT_SPACING+(TEXT_SPACING/2); - CGUIFactory::createValueButtonFrame(m_guiFrame, + xpos+=TEXT_SPACING; +#if defined (__USER_paul__) || defined (__USER_charles__) + CGUIFactory::createValueButtonFrame(m_pauseGuiFrame, (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, STR__DEBUG__BASICUNARMED_MODE, &newmode,PLAYER_MODE_BASICUNARMED); - xpos+=TEXT_SPACING; - CGUIFactory::createValueButtonFrame(m_guiFrame, + xpos+=8; + CGUIFactory::createValueButtonFrame(m_pauseGuiFrame, (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, STR__DEBUG__FULLUNARMED_MODE, &newmode,PLAYER_MODE_FULLUNARMED); - xpos+=TEXT_SPACING; - CGUIFactory::createValueButtonFrame(m_guiFrame, + xpos+=8; + CGUIFactory::createValueButtonFrame(m_pauseGuiFrame, (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, STR__DEBUG__BALLOON_MODE, &newmode,PLAYER_MODE_BALLOON); - xpos+=TEXT_SPACING; - CGUIFactory::createValueButtonFrame(m_guiFrame, + xpos+=8; + CGUIFactory::createValueButtonFrame(m_pauseGuiFrame, (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, STR__DEBUG__BUBBLEMIXTURE_MODE, &newmode,PLAYER_MODE_BUBBLE_MIXTURE); - xpos+=TEXT_SPACING; - CGUIFactory::createValueButtonFrame(m_guiFrame, + xpos+=8; + CGUIFactory::createValueButtonFrame(m_pauseGuiFrame, (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, STR__DEBUG__NET_MODE, &newmode,PLAYER_MODE_NET); - xpos+=TEXT_SPACING; - CGUIFactory::createValueButtonFrame(m_guiFrame, + xpos+=8; + CGUIFactory::createValueButtonFrame(m_pauseGuiFrame, (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, STR__DEBUG__CORALBLOWER_MODE, &newmode,PLAYER_MODE_CORALBLOWER); - xpos+=TEXT_SPACING; - CGUIFactory::createValueButtonFrame(m_guiFrame, + xpos+=8; + CGUIFactory::createValueButtonFrame(m_pauseGuiFrame, (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, STR__DEBUG__JELLYLAUNCHER_MODE, &newmode,PLAYER_MODE_JELLY_LAUNCHER); - xpos+=TEXT_SPACING; - CGUIFactory::createValueButtonFrame(m_guiFrame, + xpos+=8; + CGUIFactory::createValueButtonFrame(m_pauseGuiFrame, (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, STR__DEBUG__DEAD_MODE, &newmode,PLAYER_MODE_DEAD); - xpos+=TEXT_SPACING; -#else - xpos+=TEXT_SPACING*4; - CGUIFactory::createValueButtonFrame(m_guiFrame, - (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, - STR__PAUSE_MENU__CONTINUE, - &m_exitPauseMenuFlag,true); - xpos+=TEXT_SPACING*2; - CGUIFactory::createValueButtonFrame(m_guiFrame, - (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, - STR__PAUSE_MENU__QUIT, - &m_quitGameFlag,true); - xpos+=TEXT_SPACING*2; - - - CGUIFactory::createCycleButtonFrame(m_guiFrame, - (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, - STR__INVINCIBILE_SPONGEBOB, - &invincibleSponge,inv_data,inv_readoutdata); - xpos+=TEXT_SPACING*2; +#endif #endif - m_guiSpatReadout=new ("SpatReadout") CGUISpatCountReadout(); - m_guiSpatReadout->init(m_guiFrame); - m_guiSpatReadout->setObjectXYWH(10,10,120,40); + + // CONFIRM QUIT MENU + m_confirmQuitGuiFrame=new ("Conversation GUI") CGUIControlFrame(); + m_confirmQuitGuiFrame->init(0); + m_confirmQuitGuiFrame->setObjectXYWH((INGAME_SCREENW-FRAME_WIDTH)/2,(INGAME_SCREENH-FRAME_HEIGHT)/2,FRAME_WIDTH,FRAME_HEIGHT); + m_confirmQuitGuiFrame->setFlags(CGUIObject::FLAG_DRAWBORDER); + + xpos=TEXT_SPACING/2; + tb=new ("textbox") CGUITextBox(); + tb->init(m_confirmQuitGuiFrame); + tb->setObjectXYWH((FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT); + tb->setText(STR__PAUSE_MENU__CONFIRM_QUIT); + xpos+=TEXT_SPACING*2; + CGUIFactory::createValueButtonFrame(m_confirmQuitGuiFrame, + (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, + STR__NO, + &m_responseFlag,RESPONSE__CONFIRM_QUIT_NO); + xpos+=TEXT_SPACING*2; + CGUIFactory::createValueButtonFrame(m_confirmQuitGuiFrame, + (FRAME_WIDTH-TEXT_BOX_WIDTH)/2,xpos,TEXT_BOX_WIDTH,TEXT_BOX_HEIGHT, + STR__YES, + &m_responseFlag,RESPONSE__CONFIRM_QUIT_YES); + + + m_fontBank=new ("PauseMenuFont") FontBank(); + m_fontBank->initialise(&standardFont); m_active=false; } @@ -188,7 +217,9 @@ void CPauseMenu::init() ---------------------------------------------------------------------- */ void CPauseMenu::shutdown() { - m_guiFrame->shutdown(); + m_fontBank->dump(); delete m_fontBank; + m_confirmQuitGuiFrame->shutdown(); + m_pauseGuiFrame->shutdown(); } @@ -202,14 +233,12 @@ void CPauseMenu::select() { int chapter,level; m_active=true; - m_exitPauseMenuFlag=false; - m_quitGameFlag=false; - m_guiFrame->select(); + m_currentState=STATE__MAIN_MENU; + m_responseFlag=RESPONSE__WAITING; + m_pauseGuiFrame->select(); chapter=GameScene.getChapterNumber()-1; level=GameScene.getLevelNumber()-1; - m_guiSpatReadout->setSpatCounts(GameScene.getPlayer()->getSpatulasHeld(), - GameScene.getTotalSpatCountForThisLevel()); } @@ -222,7 +251,6 @@ void CPauseMenu::select() void CPauseMenu::unselect() { m_active=false; - m_guiFrame->unselect(); } /*---------------------------------------------------------------------- Function: @@ -230,22 +258,66 @@ void CPauseMenu::unselect() Params: Returns: ---------------------------------------------------------------------- */ -#include "game\game.h" -#include "player\player.h" void CPauseMenu::think(int _frames) { if(m_active) { - m_guiFrame->think(_frames); - if(m_exitPauseMenuFlag|| - m_quitGameFlag|| - newmode!=-1) + switch(m_currentState) { - if(m_quitGameFlag) - { - CGameScene::setReadyToExit(); - } - unselect(); + // Main menu + case STATE__MAIN_MENU: + m_pauseGuiFrame->think(_frames); + switch(m_responseFlag) + { + case RESPONSE__WAITING: + break; + + case RESPONSE__CONTINUE: + m_pauseGuiFrame->unselect(); + unselect(); + break; + + case RESPONSE__QUIT: + m_pauseGuiFrame->unselect(); + m_confirmQuitGuiFrame->select(); + m_currentState=STATE__CONFIRM_QUIT; + m_responseFlag=RESPONSE__WAITING; + break; + + case RESPONSE__CONFIRM_QUIT_YES: + case RESPONSE__CONFIRM_QUIT_NO: + ASSERT(0); + break; + } + break; + + // Confirm quit menu + case STATE__CONFIRM_QUIT: + m_confirmQuitGuiFrame->think(_frames); + switch(m_responseFlag) + { + case RESPONSE__WAITING: + break; + + case RESPONSE__CONTINUE: + case RESPONSE__QUIT: + ASSERT(0); + break; + + case RESPONSE__CONFIRM_QUIT_YES: + m_confirmQuitGuiFrame->unselect(); + CGameScene::setReadyToExit(); + unselect(); + break; + + case RESPONSE__CONFIRM_QUIT_NO: + m_pauseGuiFrame->select(); + m_confirmQuitGuiFrame->unselect(); + m_currentState=STATE__MAIN_MENU; + m_responseFlag=RESPONSE__WAITING; + break; + } + break; } } } @@ -261,11 +333,46 @@ void CPauseMenu::render() { if(m_active) { - m_guiFrame->render(); + switch(m_currentState) + { + case STATE__MAIN_MENU: + renderLives(); + m_pauseGuiFrame->render(); + break; + case STATE__CONFIRM_QUIT: + m_confirmQuitGuiFrame->render(); + break; + } } } +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CPauseMenu::renderLives() +{ + int x,y; + SpriteBank *sb; + sFrameHdr *fh; + char buf[5]; + + x=345; + y=140; + sb=GameScene.getSpriteBank(); + fh=sb->getFrameHeader(FRM__PANTS); + sb->printFT4(fh,x,y,0,0,0); + x+=fh->W; + sprintf(buf,"x5"); + y+=fh->H-m_fontBank->getStringHeight(buf); + m_fontBank->print(x,y,buf); + +} + + /*---------------------------------------------------------------------- Function: Purpose: diff --git a/source/game/pause.h b/source/game/pause.h index 12d79cbe4..ce8078006 100644 --- a/source/game/pause.h +++ b/source/game/pause.h @@ -44,12 +44,33 @@ public: private: - int m_active; - int m_exitPauseMenuFlag; - int m_quitGameFlag; + typedef enum + { + STATE__MAIN_MENU, + STATE__CONFIRM_QUIT, + } STATE; - class CGUIControlFrame *m_guiFrame; - class CGUISpatCountReadout *m_guiSpatReadout; + enum + { + RESPONSE__WAITING, + RESPONSE__CONTINUE, + RESPONSE__QUIT, + RESPONSE__CONFIRM_QUIT_YES, + RESPONSE__CONFIRM_QUIT_NO, + }; + + + void renderLives(); + + + int m_active; + int m_responseFlag; + STATE m_currentState; + + class CGUIControlFrame *m_pauseGuiFrame; + class CGUIControlFrame *m_confirmQuitGuiFrame; + + class FontBank *m_fontBank; };