diff --git a/source/backend/gameover.cpp b/source/backend/gameover.cpp index f08fe560c..080c73ada 100644 --- a/source/backend/gameover.cpp +++ b/source/backend/gameover.cpp @@ -27,10 +27,6 @@ #include "pad\pads.h" #endif -#ifndef __PRIM_HEADER__ -#include "gfx\prim.h" -#endif - #ifndef __FRONTEND_FRONTEND_H__ #include "frontend\frontend.h" #endif @@ -39,6 +35,22 @@ #include "gfx\fader.h" #endif +#ifndef _FILEIO_HEADER_ +#include "fileio\fileio.h" +#endif + +#ifndef __VID_HEADER_ +#include "system\vid.h" +#endif + +#ifndef __MATHTABLE_HEADER__ +#include "utils\mathtab.h" +#endif + +#ifndef __LOCALE_TEXTDBASE_H__ +#include "locale\textdbase.h" +#endif + /* Std Lib ------- */ @@ -78,13 +90,22 @@ CGameOverScene GameOverScene; ---------------------------------------------------------------------- */ void CGameOverScene::init() { - m_font=new ("game over font") FontBank(); + m_image=CFileIO::loadFile(BACKDROP_GAMEOVER_GFX); + ASSERT(m_image); + SetScreenImage((u8*)m_image); + + m_font=new ("game over font") ScalableFontBank(); m_font->initialise(&standardFont); - m_font->setJustification(FontBank::JUST_CENTRE); + m_font->setJustification(ScalableFontBank::JUST_CENTRE); m_font->setOt(5); m_readyToExit=false; CFader::setFadingIn(CFader::BLACK_FADE); + + initContinue(); + initGameOver(); + + m_state=STATE__CONTINUE; } @@ -97,6 +118,8 @@ void CGameOverScene::init() void CGameOverScene::shutdown() { m_font->dump(); delete m_font; + + MemFree(m_image); } @@ -108,15 +131,19 @@ void CGameOverScene::shutdown() ---------------------------------------------------------------------- */ void CGameOverScene::render() { - POLY_F4 *f4; - - f4=GetPrimF4(); - setXYWH(f4,0,0,512,256); - setRGB0(f4,0,0,0); - AddPrimToList(f4,10); - - m_font->setColour(255,255,255); - m_font->print(256,100,STR__BACKEND__GAME_OVER); + switch(m_state) + { + case STATE__CONTINUE: + renderContinue(); + break; + case STATE__CONTINUE_TIMED_OUT: + renderContinue(); + renderGameOver(); + break; + case STATE__GAME_OVER: + renderGameOver(); + break; + } } @@ -130,13 +157,27 @@ void CGameOverScene::think(int _frames) { if(!CFader::isFading()&&!m_readyToExit) { - if(PadGetDown(0)&(PAD_CROSS|PAD_START)) + if(PadGetDown(0)&PAD_START) { m_readyToExit=true; CFader::setFadingOut(CFader::BLACK_FADE); GameState::setNextScene(&FrontEndScene); } } + + switch(m_state) + { + case STATE__CONTINUE: + thinkContinue(_frames); + break; + case STATE__CONTINUE_TIMED_OUT: + thinkContinue(_frames); + thinkGameOver(_frames); + break; + case STATE__GAME_OVER: + thinkGameOver(_frames); + break; + } } @@ -152,5 +193,148 @@ int CGameOverScene::readyToShutdown() } +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CGameOverScene::initContinue() +{ + m_continueFontSin=0; + m_continueFontOffset=100<<2; + m_continueTimer=10*GameState::getOneSecondInFrames()*COUNTDOWN_TIME_MODIFIER; +} +void CGameOverScene::thinkContinue(int _frames) +{ + int move; + + // Slide the text onscreen + if(m_state==STATE__CONTINUE) + { + if(!CFader::isFading()) + { + if(m_continueFontOffset) + { + move=m_continueFontOffset/10; + if(move==0) + { + move=1; + } + m_continueFontOffset-=move; + if(m_continueFontOffset<0) + { + m_continueFontOffset=0; + } + } + else + { + // Countdown ( wait for text to stop first ) + if(m_continueTimer) + { + if(PadGetDown(0)&PAD_CROSS) + { + m_continueTimer-=m_continueTimer%(GameState::getOneSecondInFrames()*COUNTDOWN_TIME_MODIFIER); + } + else + { + m_continueTimer-=_frames; + } + + if(m_continueTimer<=0) + { + m_continueTimer=0; + m_state=STATE__CONTINUE_TIMED_OUT; + } + } + } + } + } + else if(m_state==STATE__CONTINUE_TIMED_OUT) + { + // Slide text back off the screen + m_continueFontOffset=m_continueFontOffset-(100<<2); + move=m_continueFontOffset/10; + if(move==0) + { + move=1; + } + m_continueFontOffset-=move; + if(m_continueFontOffset>(100<<2)) + { + m_continueFontOffset=0; + m_state=STATE__GAME_OVER; + } + m_continueFontOffset=m_continueFontOffset+(100<<2); + } + + // Change the text size + m_continueFontSin=(m_continueFontSin+(_frames*CONTINUE_STROBE_SPEED))&4095; +} +void CGameOverScene::renderContinue() +{ + if(!CFader::isFading()) + { + int yOfs; + char buf[100]; + + m_font->setColour(255,255,255); + yOfs=m_continueFontOffset>>2; + + sprintf(buf,TranslationDatabase::getString(STR__BACKEND__CONTINUE)); + m_font->setScale(((msin(m_continueFontSin)*CONTINUE_FONT_SCALE)>>12)+CONTINUE_FONT_BASE_SIZE); + m_font->print(256,50-m_font->getStringHeight(buf)-yOfs,buf); + + sprintf(buf,"%d",m_continueTimer/(GameState::getOneSecondInFrames()*COUNTDOWN_TIME_MODIFIER)); + m_font->setScale(CONTINUE_FONT_SCALE+CONTINUE_FONT_BASE_SIZE); + m_font->print(256,80-m_font->getStringHeight(buf)-yOfs,buf); + + if(m_continueFontSin>512&m_state==STATE__CONTINUE) + { + sprintf(buf,TranslationDatabase::getString(STR__BACKEND__PRESS_START)); + m_font->setColour(255,0,0); + m_font->print(256,200-m_font->getStringHeight(buf),buf); + } + } +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CGameOverScene::initGameOver() +{ +} +void CGameOverScene::thinkGameOver(int _frames) +{ +} +int bigscale=510; +void CGameOverScene::renderGameOver() +{ + char buf[100],*bufPtr; + char letter[]=" \0"; + int i,len,step,x; + + m_font->setColour(255,255,255); + + sprintf(buf,"PARTIE TERMINEE");//TranslationDatabase::getString(STR__BACKEND__GAME_OVER)); + m_font->setScale(bigscale); + + bufPtr=buf; + len=strlen(buf); + step=(400<<2)/len; + x=256-(((len*step)/2)>>2); + for(i=0;iprint(x-(m_font->getStringWidth(letter)/2),100,letter); + DrawLine(x,20,x,236,255,255,255,0); + x+=step>>2; + } +} + /*=========================================================================== end */ \ No newline at end of file diff --git a/source/backend/gameover.h b/source/backend/gameover.h index 2e9d99d29..548b8aec0 100644 --- a/source/backend/gameover.h +++ b/source/backend/gameover.h @@ -42,12 +42,43 @@ public: void render(); void think(int _frames); int readyToShutdown(); - char *getSceneName() {return"GameOver";} + char *getSceneName() {return"GameOver/Continue";} private: - class FontBank *m_font; - int m_readyToExit; + typedef enum + { + STATE__CONTINUE, + STATE__CONTINUE_TIMED_OUT, + STATE__GAME_OVER, + } GAMEOVER_STATE; + + + // Continue + enum + { + CONTINUE_STROBE_SPEED=75, + CONTINUE_FONT_SCALE=100, + CONTINUE_FONT_BASE_SIZE=400, + COUNTDOWN_TIME_MODIFIER=2, // Seconds last this many times longer + }; + void initContinue(); + void thinkContinue(int _frames); + void renderContinue(); + int m_continueFontOffset; + int m_continueFontSin; + int m_continueTimer; + + // Game over + void initGameOver(); + void thinkGameOver(int _frames); + void renderGameOver(); + + + GAMEOVER_STATE m_state; + class ScalableFontBank *m_font; + int m_readyToExit; + unsigned char *m_image; }; diff --git a/source/game/gameslot.cpp b/source/game/gameslot.cpp index 3d3767638..ee214e465 100644 --- a/source/game/gameslot.cpp +++ b/source/game/gameslot.cpp @@ -127,13 +127,22 @@ void CGameSlotManager::eraseGameSlot(unsigned int _slot) slot->m_lives=INITIAL_LIVES; slot->m_continues=INITIAL_CONTINUES; slot->m_maxLevelCompleted=0; - for(i=0;im_spatulaCollectedFlags[i][j]=0; } } + + for(i=0;im_kelpTokenCollectedFlags[i][j]=0; + } + } } diff --git a/source/game/gameslot.h b/source/game/gameslot.h index b2477a5a3..6c58d0cfb 100644 --- a/source/game/gameslot.h +++ b/source/game/gameslot.h @@ -45,10 +45,8 @@ public: NUM_GAME_SLOTS=4, - NUM_CHAPTERS_WITH_SPATULAS=5, + NUM_CHAPTERS=5, NUM_LEVELS_WITH_SPATULAS=4, - NUM_CHAPTERS_WITH_KELP_TOKENS=1, - NUM_LEVELS_WITH_KELP_TOKENS=5, }; @@ -58,13 +56,13 @@ public: unsigned char m_lives; unsigned char m_continues; unsigned char m_maxLevelCompleted; - unsigned char m_spatulaCollectedFlags[NUM_CHAPTERS_WITH_SPATULAS*NUM_LEVELS_WITH_SPATULAS][16]; // Enuf space for 128 spats per level - unsigned char m_kelpTokenCollectedFlags[NUM_CHAPTERS_WITH_KELP_TOKENS*NUM_LEVELS_WITH_KELP_TOKENS][16]; // Same again.. + unsigned char m_spatulaCollectedFlags[NUM_CHAPTERS*NUM_LEVELS_WITH_SPATULAS][16]; // Enuf space for 128 spats per level + unsigned char m_kelpTokenCollectedFlags[NUM_CHAPTERS][16]; // Same again.. // Spat functions.. int getSpatulaCollectedCount(unsigned int _chapter,unsigned int _level) { - ASSERT(_chapter<=NUM_CHAPTERS_WITH_SPATULAS); + ASSERT(_chapter<=NUM_CHAPTERS); ASSERT(_level<=NUM_LEVELS_WITH_SPATULAS); int i,j,count; count=0; @@ -81,14 +79,14 @@ public: } void collectSpatula(unsigned int _chapter,unsigned int _level,unsigned int _spat) { - ASSERT(_chapter<=NUM_CHAPTERS_WITH_SPATULAS); + ASSERT(_chapter<=NUM_CHAPTERS); ASSERT(_level<=NUM_LEVELS_WITH_SPATULAS); ASSERT(_spat<=128); m_spatulaCollectedFlags[(_chapter*NUM_LEVELS_WITH_SPATULAS)+_level][_spat>>3]|=1<<(_spat&7); } int isSpatulaUncollected(unsigned int _chapter,unsigned int _level,unsigned int _spat) { - ASSERT(_chapter<=NUM_CHAPTERS_WITH_SPATULAS); + ASSERT(_chapter<=NUM_CHAPTERS); ASSERT(_level<=NUM_LEVELS_WITH_SPATULAS); ASSERT(_spat<=128); return (m_spatulaCollectedFlags[(_chapter*NUM_LEVELS_WITH_SPATULAS)+_level][_spat>>3]>>(_spat&7))&1?false:true; @@ -97,13 +95,13 @@ public: // Kelp Token functions.. int getKelpTokenCollectedCount(unsigned int _chapter,unsigned int _level) { - ASSERT(_chapter==NUM_CHAPTERS_WITH_SPATULAS); - ASSERT(_level<=NUM_LEVELS_WITH_KELP_TOKENS); + ASSERT(_chapter==NUM_CHAPTERS); + ASSERT(_level==NUM_LEVELS_WITH_SPATULAS+1); int i,j,count; count=0; for(i=0;i<8;i++) { - unsigned char flags=m_kelpTokenCollectedFlags[(_chapter*NUM_LEVELS_WITH_KELP_TOKENS)+_level][i]; + unsigned char flags=m_kelpTokenCollectedFlags[_level][i]; for(j=0;j<8;j++) { if(flags&1)count++; @@ -114,17 +112,17 @@ public: } void collectKelpToken(unsigned int _chapter,unsigned int _level,unsigned int _token) { - ASSERT(_chapter==NUM_CHAPTERS_WITH_SPATULAS); - ASSERT(_level<=NUM_LEVELS_WITH_KELP_TOKENS); + ASSERT(_chapter==NUM_CHAPTERS); + ASSERT(_level<=NUM_LEVELS_WITH_SPATULAS+1); ASSERT(_token<=128); - m_kelpTokenCollectedFlags[(_chapter*NUM_LEVELS_WITH_KELP_TOKENS)+_level][_token>>3]|=1<<(_token&7); + m_kelpTokenCollectedFlags[_level][_token>>3]|=1<<(_token&7); } int isKelpTokenUncollected(unsigned int _chapter,unsigned int _level,unsigned int _token) { - ASSERT(_chapter==NUM_CHAPTERS_WITH_SPATULAS); - ASSERT(_level<=NUM_LEVELS_WITH_KELP_TOKENS); + ASSERT(_chapter==NUM_CHAPTERS); + ASSERT(_level<=NUM_LEVELS_WITH_SPATULAS+1); ASSERT(_token<=128); - return (m_kelpTokenCollectedFlags[(_chapter*NUM_LEVELS_WITH_KELP_TOKENS)+_level][_token>>3]>>(_token&7))&1?false:true; + return (m_kelpTokenCollectedFlags[_level][_token>>3]>>(_token&7))&1?false:true; } } GameSlot; diff --git a/source/game/pause.cpp b/source/game/pause.cpp index 2a286f8b6..10476ab2c 100644 --- a/source/game/pause.cpp +++ b/source/game/pause.cpp @@ -211,8 +211,8 @@ void CPauseMenu::select() m_quitGameFlag=false; m_guiFrame->select(); - chapter=GameScene.getChapterNumber(); - level=GameScene.getLevelNumber(); + chapter=GameScene.getChapterNumber()-1; + level=GameScene.getLevelNumber()-1; m_guiSpatReadout->setSpatCounts(CGameSlotManager::getSlotData()->getSpatulaCollectedCount(chapter,level), GameScene.getTotalSpatCountForThisLevel()); } diff --git a/source/level/level.cpp b/source/level/level.cpp index 928efe782..982130638 100644 --- a/source/level/level.cpp +++ b/source/level/level.cpp @@ -88,6 +88,10 @@ #include "game\gameslot.h" #endif +#ifndef __LOCALE_TEXTDBASE_H__ +#include "locale\textdbase.h" +#endif + #include "fx\fx.h" #include "fx\fxfallingtile.h" @@ -124,36 +128,35 @@ sLvlTab LvlTable[]= { // C1 - {1,1, CHAPTER01_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER01_LEVEL01_LVL,LEVELS_CHAPTER01_LEVEL01_TEX, CSoundMediator::SONG_CHAPTER1_LEVEL1}, - {1,2, CHAPTER01_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER01_LEVEL02_LVL,LEVELS_CHAPTER01_LEVEL02_TEX, CSoundMediator::SONG_CHAPTER1_LEVEL2}, - {1,3, CHAPTER01_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER01_LEVEL03_LVL,LEVELS_CHAPTER01_LEVEL03_TEX, CSoundMediator::SONG_CHAPTER1_LEVEL3}, - {1,4, CHAPTER01_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER01_LEVEL04_LVL,LEVELS_CHAPTER01_LEVEL04_TEX, CSoundMediator::SONG_CHAPTER1_LEVEL4}, + {1,1, CHAPTER01_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER01_LEVEL01_LVL,LEVELS_CHAPTER01_LEVEL01_TEX, CSoundMediator::SONG_CHAPTER1_LEVEL1, STR__CHAPTER_1,STR__CHAPTER_1_LEVEL_1 }, + {1,2, CHAPTER01_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER01_LEVEL02_LVL,LEVELS_CHAPTER01_LEVEL02_TEX, CSoundMediator::SONG_CHAPTER1_LEVEL2, STR__CHAPTER_1,STR__CHAPTER_1_LEVEL_2 }, + {1,3, CHAPTER01_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER01_LEVEL03_LVL,LEVELS_CHAPTER01_LEVEL03_TEX, CSoundMediator::SONG_CHAPTER1_LEVEL3, STR__CHAPTER_1,STR__CHAPTER_1_LEVEL_3 }, + {1,4, CHAPTER01_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER01_LEVEL04_LVL,LEVELS_CHAPTER01_LEVEL04_TEX, CSoundMediator::SONG_CHAPTER1_LEVEL4, STR__CHAPTER_1,STR__CHAPTER_1_LEVEL_4 }, + {1,5, CHAPTER06_LEVEL01_INF_TOTAL_ITEM_KELP_TOKEN, LEVELS_CHAPTER06_LEVEL01_LVL,LEVELS_CHAPTER06_LEVEL01_TEX, CSoundMediator::SONG_CHAPTER6_ROLLERCOASTER, STR__KELP_WORLD,STR__CHAPTER_6_LEVEL_1 }, // C2 - {2,1, CHAPTER02_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER02_LEVEL01_LVL,LEVELS_CHAPTER02_LEVEL01_TEX, CSoundMediator::SONG_CHAPTER2_LEVEL1}, - {2,2, CHAPTER02_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER02_LEVEL02_LVL,LEVELS_CHAPTER02_LEVEL02_TEX, CSoundMediator::SONG_CHAPTER2_LEVEL2}, - {2,3, CHAPTER02_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER02_LEVEL03_LVL,LEVELS_CHAPTER02_LEVEL03_TEX, CSoundMediator::SONG_CHAPTER2_LEVEL3}, - {2,4, CHAPTER02_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER02_LEVEL04_LVL,LEVELS_CHAPTER02_LEVEL04_TEX, CSoundMediator::SONG_CHAPTER2_LEVEL4}, + {2,1, CHAPTER02_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER02_LEVEL01_LVL,LEVELS_CHAPTER02_LEVEL01_TEX, CSoundMediator::SONG_CHAPTER2_LEVEL1, STR__CHAPTER_2,STR__CHAPTER_2_LEVEL_1 }, + {2,2, CHAPTER02_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER02_LEVEL02_LVL,LEVELS_CHAPTER02_LEVEL02_TEX, CSoundMediator::SONG_CHAPTER2_LEVEL2, STR__CHAPTER_2,STR__CHAPTER_2_LEVEL_2 }, + {2,3, CHAPTER02_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER02_LEVEL03_LVL,LEVELS_CHAPTER02_LEVEL03_TEX, CSoundMediator::SONG_CHAPTER2_LEVEL3, STR__CHAPTER_2,STR__CHAPTER_2_LEVEL_3 }, + {2,4, CHAPTER02_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER02_LEVEL04_LVL,LEVELS_CHAPTER02_LEVEL04_TEX, CSoundMediator::SONG_CHAPTER2_LEVEL4, STR__CHAPTER_2,STR__CHAPTER_2_LEVEL_4 }, + {2,5, CHAPTER06_LEVEL02_INF_TOTAL_ITEM_KELP_TOKEN, LEVELS_CHAPTER06_LEVEL02_LVL,LEVELS_CHAPTER06_LEVEL02_TEX, CSoundMediator::SONG_CHAPTER6_SNAILRACE, STR__KELP_WORLD,STR__CHAPTER_6_LEVEL_2 }, // C3 - {3,1, CHAPTER03_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER03_LEVEL01_LVL,LEVELS_CHAPTER03_LEVEL01_TEX, CSoundMediator::SONG_CHAPTER3_LEVEL1}, - {3,2, CHAPTER03_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER03_LEVEL02_LVL,LEVELS_CHAPTER03_LEVEL02_TEX, CSoundMediator::SONG_CHAPTER3_LEVEL2}, - {3,3, CHAPTER03_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER03_LEVEL03_LVL,LEVELS_CHAPTER03_LEVEL03_TEX, CSoundMediator::SONG_CHAPTER3_LEVEL3}, - {3,4, CHAPTER03_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER03_LEVEL04_LVL,LEVELS_CHAPTER03_LEVEL04_TEX, CSoundMediator::SONG_CHAPTER3_LEVEL4}, + {3,1, CHAPTER03_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER03_LEVEL01_LVL,LEVELS_CHAPTER03_LEVEL01_TEX, CSoundMediator::SONG_CHAPTER3_LEVEL1, STR__CHAPTER_3,STR__CHAPTER_3_LEVEL_1 }, + {3,2, CHAPTER03_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER03_LEVEL02_LVL,LEVELS_CHAPTER03_LEVEL02_TEX, CSoundMediator::SONG_CHAPTER3_LEVEL2, STR__CHAPTER_3,STR__CHAPTER_3_LEVEL_2 }, + {3,3, CHAPTER03_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER03_LEVEL03_LVL,LEVELS_CHAPTER03_LEVEL03_TEX, CSoundMediator::SONG_CHAPTER3_LEVEL3, STR__CHAPTER_3,STR__CHAPTER_3_LEVEL_3 }, + {3,4, CHAPTER03_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER03_LEVEL04_LVL,LEVELS_CHAPTER03_LEVEL04_TEX, CSoundMediator::SONG_CHAPTER3_LEVEL4, STR__CHAPTER_3,STR__CHAPTER_3_LEVEL_4 }, + {3,5, CHAPTER06_LEVEL03_INF_TOTAL_ITEM_KELP_TOKEN, LEVELS_CHAPTER06_LEVEL03_LVL,LEVELS_CHAPTER06_LEVEL03_TEX, CSoundMediator::SONG_CHAPTER6_BIGWHEEL, STR__KELP_WORLD,STR__CHAPTER_6_LEVEL_3 }, // C4 - {4,1, CHAPTER04_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER04_LEVEL01_LVL,LEVELS_CHAPTER04_LEVEL01_TEX, CSoundMediator::SONG_CHAPTER4_LEVEL1}, - {4,2, CHAPTER04_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER04_LEVEL02_LVL,LEVELS_CHAPTER04_LEVEL02_TEX, CSoundMediator::SONG_CHAPTER4_LEVEL2}, - {4,3, CHAPTER04_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER04_LEVEL03_LVL,LEVELS_CHAPTER04_LEVEL03_TEX, CSoundMediator::SONG_CHAPTER4_LEVEL3}, - {4,4, CHAPTER04_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER04_LEVEL04_LVL,LEVELS_CHAPTER04_LEVEL04_TEX, CSoundMediator::SONG_CHAPTER4_LEVEL4}, + {4,1, CHAPTER04_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER04_LEVEL01_LVL,LEVELS_CHAPTER04_LEVEL01_TEX, CSoundMediator::SONG_CHAPTER4_LEVEL1, STR__CHAPTER_4,STR__CHAPTER_4_LEVEL_1 }, + {4,2, CHAPTER04_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER04_LEVEL02_LVL,LEVELS_CHAPTER04_LEVEL02_TEX, CSoundMediator::SONG_CHAPTER4_LEVEL2, STR__CHAPTER_4,STR__CHAPTER_4_LEVEL_2 }, + {4,3, CHAPTER04_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER04_LEVEL03_LVL,LEVELS_CHAPTER04_LEVEL03_TEX, CSoundMediator::SONG_CHAPTER4_LEVEL3, STR__CHAPTER_4,STR__CHAPTER_4_LEVEL_3 }, + {4,4, CHAPTER04_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER04_LEVEL04_LVL,LEVELS_CHAPTER04_LEVEL04_TEX, CSoundMediator::SONG_CHAPTER4_LEVEL4, STR__CHAPTER_4,STR__CHAPTER_4_LEVEL_4 }, + {4,5, CHAPTER06_LEVEL04_INF_TOTAL_ITEM_KELP_TOKEN, LEVELS_CHAPTER06_LEVEL04_LVL,LEVELS_CHAPTER06_LEVEL04_TEX, CSoundMediator::SONG_CHAPTER6_TUNNELOFLOVE, STR__KELP_WORLD,STR__CHAPTER_6_LEVEL_4 }, // C5 - {5,1, CHAPTER05_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER05_LEVEL01_LVL,LEVELS_CHAPTER05_LEVEL01_TEX, CSoundMediator::SONG_CHAPTER5_LEVEL1}, - {5,2, CHAPTER05_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER05_LEVEL02_LVL,LEVELS_CHAPTER05_LEVEL02_TEX, CSoundMediator::SONG_CHAPTER5_LEVEL2}, - {5,3, CHAPTER05_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER05_LEVEL03_LVL,LEVELS_CHAPTER05_LEVEL03_TEX, CSoundMediator::SONG_CHAPTER5_LEVEL3}, - {5,4, CHAPTER05_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER05_LEVEL04_LVL,LEVELS_CHAPTER05_LEVEL04_TEX, CSoundMediator::SONG_CHAPTER5_LEVEL4}, -// C6 - {6,1, CHAPTER06_LEVEL01_INF_TOTAL_ITEM_KELP_TOKEN, LEVELS_CHAPTER06_LEVEL01_LVL,LEVELS_CHAPTER06_LEVEL01_TEX, CSoundMediator::SONG_CHAPTER6_ROLLERCOASTER}, - {6,2, CHAPTER06_LEVEL02_INF_TOTAL_ITEM_KELP_TOKEN, LEVELS_CHAPTER06_LEVEL02_LVL,LEVELS_CHAPTER06_LEVEL02_TEX, CSoundMediator::SONG_CHAPTER6_SNAILRACE}, - {6,3, CHAPTER06_LEVEL03_INF_TOTAL_ITEM_KELP_TOKEN, LEVELS_CHAPTER06_LEVEL03_LVL,LEVELS_CHAPTER06_LEVEL03_TEX, CSoundMediator::SONG_CHAPTER6_BIGWHEEL}, - {6,4, CHAPTER06_LEVEL04_INF_TOTAL_ITEM_KELP_TOKEN, LEVELS_CHAPTER06_LEVEL04_LVL,LEVELS_CHAPTER06_LEVEL04_TEX, CSoundMediator::SONG_CHAPTER6_TUNNELOFLOVE}, - {6,5, CHAPTER06_LEVEL05_INF_TOTAL_ITEM_KELP_TOKEN, LEVELS_CHAPTER06_LEVEL05_LVL,LEVELS_CHAPTER06_LEVEL05_TEX, CSoundMediator::SONG_CHAPTER6_TUNNELOFLOVE}, + {5,1, CHAPTER05_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER05_LEVEL01_LVL,LEVELS_CHAPTER05_LEVEL01_TEX, CSoundMediator::SONG_CHAPTER5_LEVEL1, STR__CHAPTER_5,STR__CHAPTER_5_LEVEL_1 }, + {5,2, CHAPTER05_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER05_LEVEL02_LVL,LEVELS_CHAPTER05_LEVEL02_TEX, CSoundMediator::SONG_CHAPTER5_LEVEL2, STR__CHAPTER_5,STR__CHAPTER_5_LEVEL_2 }, + {5,3, CHAPTER05_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER05_LEVEL03_LVL,LEVELS_CHAPTER05_LEVEL03_TEX, CSoundMediator::SONG_CHAPTER5_LEVEL3, STR__CHAPTER_5,STR__CHAPTER_5_LEVEL_3 }, + {5,4, CHAPTER05_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, LEVELS_CHAPTER05_LEVEL04_LVL,LEVELS_CHAPTER05_LEVEL04_TEX, CSoundMediator::SONG_CHAPTER5_LEVEL4, STR__CHAPTER_5,STR__CHAPTER_5_LEVEL_4 }, + {5,5, CHAPTER06_LEVEL05_INF_TOTAL_ITEM_KELP_TOKEN, LEVELS_CHAPTER06_LEVEL05_LVL,LEVELS_CHAPTER06_LEVEL05_TEX, CSoundMediator::SONG_CHAPTER6_TUNNELOFLOVE, STR__KELP_WORLD,STR__CHAPTER_6_LEVEL_5 }, // FMA {6,99, 0, LEVELS_FMA_SHADYSHOALS_LVL,LEVELS_FMA_SHADYSHOALS_TEX, CSoundMediator::SONG_TITLE}, @@ -234,29 +237,29 @@ bool Finished=false; void CLevel::DisplayLoadingScreen(sLvlTab *lvlTab) { FontBank font; -char buf[128]; +char buf[256]; u8 *s_image; int i; font.initialise(&standardFont); font.setJustification(FontBank::JUST_CENTRE); - sprintf(buf,"LOADING CHAPTER %d LEVEL %d",lvlTab->Chapter,lvlTab->Level); + sprintf(buf,"%s\n\n%s",TranslationDatabase::getString(lvlTab->ChapterLoadingText),TranslationDatabase::getString(lvlTab->LevelLoadingText)); s_image=CFileIO::loadFile(loadingScreens[lvlTab->Chapter-1]); ASSERT(s_image); SetScreenImage(s_image); for(i=0;i<2;i++) { font.setColour(255,255,255); - font.print(256 ,120 ,buf); + font.print(256 ,100 ,buf); font.setColour(0,0,0); - font.print(256-1,120-1,buf); - font.print(256-1,120 ,buf); - font.print(256-1,120+1,buf); - font.print(256 ,120-1,buf); - font.print(256 ,120+1,buf); - font.print(256+1,120-1,buf); - font.print(256+1,120 ,buf); - font.print(256+1,120+1,buf); + font.print(256-1,100-1,buf); + font.print(256-1,100 ,buf); + font.print(256-1,100+1,buf); + font.print(256 ,100-1,buf); + font.print(256 ,100+1,buf); + font.print(256+1,100-1,buf); + font.print(256+1,100 ,buf); + font.print(256+1,100+1,buf); PrimDisplay(); VSync(0); VidSwapDraw(); @@ -424,7 +427,7 @@ void CLevel::initThings(int _respawningLevel) createThisPickup=true; isSpat=(PICKUP_TYPE)ItemList->Type==PICKUP__SPATULA; - if(isSpat&&CGameSlotManager::getSlotData()->isSpatulaUncollected(GameScene.getChapterNumber(),GameScene.getLevelNumber(),spatNumber)==false) + if(isSpat&&CGameSlotManager::getSlotData()->isSpatulaUncollected(GameScene.getChapterNumber()-1,GameScene.getLevelNumber()-1,spatNumber)==false) { createThisPickup=false; } diff --git a/source/level/level.h b/source/level/level.h index 750b700ed..cb1f4f89c 100644 --- a/source/level/level.h +++ b/source/level/level.h @@ -16,6 +16,7 @@ struct sLvlTab u8 totalSpatCount; FileEquate LevelFilename,TexFilename; int songId; + u16 ChapterLoadingText,LevelLoadingText; }; /*****************************************************************************/ diff --git a/source/map/map.cpp b/source/map/map.cpp index 03fddaad1..03d5b8033 100644 --- a/source/map/map.cpp +++ b/source/map/map.cpp @@ -118,40 +118,40 @@ CMapScene MapScene; CMapScene::sMapLevelData CMapScene::s_mapLevelData[MAP_NUM_CHAPTERS][MAP_NUM_LEVELS_PER_CHAPTER]= { - // mapFile globalLevelNumber spatularOrTokenCounts questItemFrame kelpWorldLevel + // mapFile globalLevelNumber spatulaOrTokenCounts questItemFrame kelpWorldLevel { { MAP_C1_L1_GFX, 0, CHAPTER01_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C1_L1_QUEST_ITEM, false }, { MAP_C1_L2_GFX, 1, CHAPTER01_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C1_L2_QUEST_ITEM, false }, { MAP_C1_L3_GFX, 2, CHAPTER01_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C1_L3_QUEST_ITEM, false }, { MAP_C1_L4_GFX, 3, CHAPTER01_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C1_L4_QUEST_ITEM, false }, - { MAP_C1_FAIR_GFX, 20, CHAPTER06_LEVEL01_INF_TOTAL_ITEM_KELP_TOKEN, -1, true }, + { MAP_C1_FAIR_GFX, 4, CHAPTER06_LEVEL01_INF_TOTAL_ITEM_KELP_TOKEN, -1, true }, }, { - { MAP_C2_L1_GFX, 4, CHAPTER02_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C2_L1_QUEST_ITEM, false }, - { MAP_C2_L2_GFX, 5, CHAPTER02_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C2_L2_QUEST_ITEM, false }, - { MAP_C2_L3_GFX, 6, CHAPTER02_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C2_L3_QUEST_ITEM, false }, - { MAP_C2_L4_GFX, 7, CHAPTER02_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C2_L4_QUEST_ITEM, false }, - { MAP_C2_FAIR_GFX, 21, CHAPTER06_LEVEL02_INF_TOTAL_ITEM_KELP_TOKEN, -1, true }, + { MAP_C2_L1_GFX, 5, CHAPTER02_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C2_L1_QUEST_ITEM, false }, + { MAP_C2_L2_GFX, 6, CHAPTER02_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C2_L2_QUEST_ITEM, false }, + { MAP_C2_L3_GFX, 7, CHAPTER02_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C2_L3_QUEST_ITEM, false }, + { MAP_C2_L4_GFX, 8, CHAPTER02_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C2_L4_QUEST_ITEM, false }, + { MAP_C2_FAIR_GFX, 9, CHAPTER06_LEVEL02_INF_TOTAL_ITEM_KELP_TOKEN, -1, true }, }, { - { MAP_C3_L1_GFX, 8, CHAPTER03_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C3_L1_QUEST_ITEM, false }, - { MAP_C3_L2_GFX, 9, CHAPTER03_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C3_L2_QUEST_ITEM, false }, - { MAP_C3_L3_GFX, 10, CHAPTER03_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C3_L3_QUEST_ITEM, false }, - { MAP_C3_L4_GFX, 11, CHAPTER03_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C3_L4_QUEST_ITEM, false }, - { MAP_C3_FAIR_GFX, 22, CHAPTER06_LEVEL03_INF_TOTAL_ITEM_KELP_TOKEN, -1, true }, + { MAP_C3_L1_GFX, 10, CHAPTER03_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C3_L1_QUEST_ITEM, false }, + { MAP_C3_L2_GFX, 11, CHAPTER03_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C3_L2_QUEST_ITEM, false }, + { MAP_C3_L3_GFX, 12, CHAPTER03_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C3_L3_QUEST_ITEM, false }, + { MAP_C3_L4_GFX, 13, CHAPTER03_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C3_L4_QUEST_ITEM, false }, + { MAP_C3_FAIR_GFX, 14, CHAPTER06_LEVEL03_INF_TOTAL_ITEM_KELP_TOKEN, -1, true }, }, { - { MAP_C4_L1_GFX, 12, CHAPTER04_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C4_QUEST_ITEM_1, false }, - { MAP_C4_L2_GFX, 13, CHAPTER04_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C4_QUEST_ITEM_1, false }, - { MAP_C4_L3_GFX, 14, CHAPTER04_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C4_QUEST_ITEM_1, false }, - { MAP_C4_L4_GFX, 15, CHAPTER04_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C4_QUEST_ITEM_2, false }, - { MAP_C4_FAIR_GFX, 23, CHAPTER06_LEVEL04_INF_TOTAL_ITEM_KELP_TOKEN, -1, true }, + { MAP_C4_L1_GFX, 15, CHAPTER04_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C4_QUEST_ITEM_1, false }, + { MAP_C4_L2_GFX, 16, CHAPTER04_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C4_QUEST_ITEM_1, false }, + { MAP_C4_L3_GFX, 17, CHAPTER04_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C4_QUEST_ITEM_1, false }, + { MAP_C4_L4_GFX, 18, CHAPTER04_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C4_QUEST_ITEM_2, false }, + { MAP_C4_FAIR_GFX, 19, CHAPTER06_LEVEL04_INF_TOTAL_ITEM_KELP_TOKEN, -1, true }, }, { - { MAP_C5_L1_GFX, 16, CHAPTER05_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C5_L1_QUEST_ITEM, false }, - { MAP_C5_L2_GFX, 17, CHAPTER05_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C5_L2_QUEST_ITEM, false }, - { MAP_C5_L3_GFX, 18, CHAPTER05_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C5_L3_QUEST_ITEM, false }, - { MAP_C5_L4_GFX, 19, CHAPTER05_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C5_L4_QUEST_ITEM, false }, + { MAP_C5_L1_GFX, 20, CHAPTER05_LEVEL01_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C5_L1_QUEST_ITEM, false }, + { MAP_C5_L2_GFX, 21, CHAPTER05_LEVEL02_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C5_L2_QUEST_ITEM, false }, + { MAP_C5_L3_GFX, 22, CHAPTER05_LEVEL03_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C5_L3_QUEST_ITEM, false }, + { MAP_C5_L4_GFX, 23, CHAPTER05_LEVEL04_INF_TOTAL_ITEM_GOLDEN_SPATULA, FRM__C5_L4_QUEST_ITEM, false }, { MAP_C5_FAIR_GFX, 24, CHAPTER06_LEVEL05_INF_TOTAL_ITEM_KELP_TOKEN, -1, true }, }, }; @@ -180,7 +180,6 @@ void CMapScene::init() { m_font=new ("map screen font") FontBank(); m_font->initialise(&standardFont); - m_font->setJustification(FontBank::JUST_CENTRE); m_font->setOt(10); m_font->setJustification(FontBank::JUST_LEFT); @@ -217,12 +216,15 @@ void CMapScene::shutdown() ---------------------------------------------------------------------- */ void CMapScene::render() { + SpriteBank *sb; sMapLevelData *level; int i; sFrameHdr *fh; DVECTOR pos; + POLY_FT4 *ft4; char buf[100]; + sb=CGameScene::getSpriteBank(); level=&s_mapLevelData[m_currentChapterSelection][0]; // Render spatula/kelp counts and quest items @@ -233,11 +235,10 @@ void CMapScene::render() if(!level->m_kelpWorldLevel) { // Normal level - POLY_FT4 *ft4; m_font->setColour(253,251,67); - sprintf(buf,"00/%d",level->m_spatularOrTokenCounts); - fh=CGameScene::getSpriteBank()->getFrameHeader(level->m_questItemFrame); - ft4=CGameScene::getSpriteBank()->printFT4(fh,pos.vx+MAP_LEVEL_WIDTH-fh->W,pos.vy+MAP_LEVEL_HEIGHT-fh->H,0,0,10); + sprintf(buf,"%d/%d",CGameSlotManager::getSlotData()->getSpatulaCollectedCount(m_currentChapterSelection,i),level->m_spatulaOrTokenCounts); + fh=sb->getFrameHeader(level->m_questItemFrame); + ft4=sb->printFT4(fh,pos.vx+MAP_LEVEL_WIDTH-fh->W,pos.vy+MAP_LEVEL_HEIGHT-fh->H,0,0,10); if(!hasQuestItemBeenCollected(m_currentChapterSelection,i)) { setRGB0(ft4,50,50,50); @@ -247,7 +248,7 @@ void CMapScene::render() { // Bonuse level m_font->setColour(67,251,67); - sprintf(buf,"00/%d",level->m_spatularOrTokenCounts); + sprintf(buf,"-");//"%d/%d",CGameSlotManager::getSlotData()->getKelpTokenCollectedCount(m_currentChapterSelection,i),level->m_spatulaOrTokenCounts); } m_font->print(pos.vx,pos.vy,buf); @@ -255,9 +256,9 @@ void CMapScene::render() level++; } - // Selection cursor - fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__MAPPOINTER); - CGameScene::getSpriteBank()->printFT4(fh,m_pointerPos.vx-(fh->W/2),m_pointerPos.vy-(fh->H/2),0,0,9); + renderPointer(); + renderInstructions(); + sprintf(buf,"Chapter %d, Level %d",m_currentChapterSelection+1,m_currentLevelSelection+1); m_font->setColour(0,255,0); @@ -267,6 +268,77 @@ m_font->print(25,25,buf); } +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CMapScene::renderPointer() +{ + SpriteBank *sb; + sFrameHdr *fh; + POLY_FT4 *ft4; + + sb=CGameScene::getSpriteBank(); + fh=sb->getFrameHeader(FRM__MAPPOINTER); + ft4=sb->printFT4(fh,m_pointerPos.vx-(fh->W/2),m_pointerPos.vy-(fh->H/2),0,0,9); + if(!m_pointerArrivedAtTarget) + { + setSemiTrans(ft4,true); + } +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CMapScene::renderInstructions() +{ + // Instructions + SpriteBank *sb; + sFrameHdr *fh1,*fh2; + int width; + int x,y; + + sb=CGameScene::getSpriteBank(); + m_font->setColour(MAP_INSTRUCTIONS_TEXT_R,MAP_INSTRUCTIONS_TEXT_G,MAP_INSTRUCTIONS_TEXT_B); + + y=MAP_INSTRUCTIONS_YSTART; + fh1=sb->getFrameHeader(FRM__BUTL); + fh2=sb->getFrameHeader(FRM__BUTR); + width=fh1->W+MAP_INSTRUCTIONS_GAP_BETWEEN_BUTTONS+fh2->W+MAP_INSTRUCTIONS_GAP_BETWEEN_BUTTONS_AND_TEXT+m_font->getStringWidth(STR__MAP_SCREEN__LEFT_RIGHT_TO_SELECT_LEVEL); + x=256-(width/2); + sb->printFT4(fh1,x,y+MAP_INSTRUCTIONS_BUTTON_Y_OFFSET,0,0,0); + x+=fh1->W+MAP_INSTRUCTIONS_GAP_BETWEEN_BUTTONS; + sb->printFT4(fh2,x,y+MAP_INSTRUCTIONS_BUTTON_Y_OFFSET,0,0,0); + x+=fh2->W+MAP_INSTRUCTIONS_GAP_BETWEEN_BUTTONS_AND_TEXT; + m_font->print(x,y,STR__MAP_SCREEN__LEFT_RIGHT_TO_SELECT_LEVEL); + + y+=MAP_INSTRUCTIONS_Y_SPACE_BETWEEN_LINES; + fh1=sb->getFrameHeader(FRM__BUTU); + fh2=sb->getFrameHeader(FRM__BUTD); + width=fh1->W+MAP_INSTRUCTIONS_GAP_BETWEEN_BUTTONS+fh2->W+MAP_INSTRUCTIONS_GAP_BETWEEN_BUTTONS_AND_TEXT+m_font->getStringWidth(STR__MAP_SCREEN__UP_DOWN_TO_SELECT_CHAPTER); + x=256-(width/2); + sb->printFT4(fh1,x,y+MAP_INSTRUCTIONS_BUTTON_Y_OFFSET,0,0,0); + x+=fh1->W+MAP_INSTRUCTIONS_GAP_BETWEEN_BUTTONS; + sb->printFT4(fh2,x,y+MAP_INSTRUCTIONS_BUTTON_Y_OFFSET,0,0,0); + x+=fh2->W+MAP_INSTRUCTIONS_GAP_BETWEEN_BUTTONS_AND_TEXT; + m_font->print(x,y,STR__MAP_SCREEN__UP_DOWN_TO_SELECT_CHAPTER); + + y+=MAP_INSTRUCTIONS_Y_SPACE_BETWEEN_LINES; + fh1=sb->getFrameHeader(FRM__BUTX); + width=fh1->W+MAP_INSTRUCTIONS_GAP_BETWEEN_BUTTONS_AND_TEXT+m_font->getStringWidth(STR__MAP_SCREEN__X_TO_START); + x=256-(width/2); + sb->printFT4(fh1,x,y+MAP_INSTRUCTIONS_BUTTON_Y_OFFSET,0,0,0); + x+=fh1->W+MAP_INSTRUCTIONS_GAP_BETWEEN_BUTTONS_AND_TEXT; + m_font->print(x,y,STR__MAP_SCREEN__X_TO_START); +} + + /*---------------------------------------------------------------------- Function: Purpose: @@ -290,6 +362,7 @@ void CMapScene::think(int _frames) } // Move cursor + int lastLevel=m_currentLevelSelection; if(PadGetDown(0)&PAD_LEFT) { do @@ -306,9 +379,17 @@ void CMapScene::think(int _frames) } while(!isLevelOpen(m_currentChapterSelection,m_currentLevelSelection)); } + if(lastLevel!=m_currentLevelSelection) + { + m_pointerArrivedAtTarget=false; + m_pointerSin=0; + } // Calc where the pointer should be - m_pointerSin=(m_pointerSin+(_frames*70))&4095; + if(m_pointerArrivedAtTarget) + { + m_pointerSin=(m_pointerSin+(_frames*70))&4095; + } m_pointerTarget=getPointerTargetPosition(); // Move the pointer @@ -319,31 +400,38 @@ void CMapScene::think(int _frames) delta=m_pointerTarget.vx-m_pointerPos.vx; if(delta<0) { - delta/=2; + delta/=3; if(!delta)delta=-1; } else if(delta>0) { - delta/=2; + delta/=3; if(!delta)delta=+1; } m_pointerPos.vx+=delta; - delta=m_pointerTarget.vy-m_pointerPos.vy; + delta=(m_pointerTarget.vy+(msin(m_pointerSin)*4>>12))-m_pointerPos.vy; if(delta<0) { - delta/=2; + delta/=3; if(!delta)delta=-1; } else if(delta>0) { - delta/=2; + delta/=3; if(!delta)delta=+1; } m_pointerPos.vy+=delta; + + if(!m_pointerArrivedAtTarget&& + m_pointerTarget.vx==m_pointerPos.vx&&m_pointerTarget.vy==m_pointerPos.vy) + { + m_pointerArrivedAtTarget=true; + } } - if(PadGetDown(0)&(PAD_CROSS|PAD_START)) + if(m_pointerArrivedAtTarget&& + PadGetDown(0)&PAD_CROSS) { s_globalLevelSelectThing=s_mapLevelData[m_currentChapterSelection][m_currentLevelSelection].m_globalLevelNumber; m_readyToExit=true; @@ -376,7 +464,6 @@ void CMapScene::generateMapScreenImage() { int i; - m_currentLevelSelection=0; memset(m_screenImage,0,512*256*2); copyImageToScreen(MAP_MAP_BACKGROUND_GFX,MAP_PARCHMENT_START_X,MAP_PARCHMENT_START_Y,MAP_PARCHMENT_WIDTH,MAP_PARCHMENT_HEIGHT); @@ -389,6 +476,7 @@ void CMapScene::generateMapScreenImage() } m_pointerPos=getPointerTargetPosition(); + m_pointerArrivedAtTarget=true; } @@ -430,7 +518,7 @@ DVECTOR CMapScene::getPointerTargetPosition() pos=s_mapLevelPositions[m_currentLevelSelection]; pos.vx+=(MAP_LEVEL_WIDTH/2); - pos.vy+=MAP_LEVEL_HEIGHT+(msin(m_pointerSin)*4>>12); + pos.vy+=MAP_LEVEL_HEIGHT;//+(msin(m_pointerSin)*4>>12); return pos; } @@ -452,18 +540,6 @@ int CMapScene::getSpatulaCollectedCount(unsigned int _chapter,unsigned int _lev return CGameSlotManager::getSlotData()->getSpatulaCollectedCount(_chapter,_level); } -int CMapScene::getSpatulaAvailableCount(unsigned int _chapter,unsigned int _level) -{ - ASSERT(!s_mapLevelData[_chapter][_level].m_kelpWorldLevel); - return s_mapLevelData[_chapter][_level].m_spatularOrTokenCounts; -} - -int CMapScene::getKelpTokenAvailableCount(unsigned int _chapter,unsigned int _level) -{ - ASSERT(s_mapLevelData[_chapter][_level].m_kelpWorldLevel); - return s_mapLevelData[_chapter][_level].m_spatularOrTokenCounts; -} - int CMapScene::hasQuestItemBeenCollected(unsigned int _chapter,unsigned int _level) { return _level&1; diff --git a/source/map/map.h b/source/map/map.h index 7762fdfbd..ce3820b87 100644 --- a/source/map/map.h +++ b/source/map/map.h @@ -59,12 +59,15 @@ private: MAP_LEVEL_WIDTH=140, MAP_LEVEL_HEIGHT=60, - MAP_LEVEL_TOP_BORDER=20, - - MAP_INSTRUCTIONS_WIDTH=416, - MAP_INSTRUCTIONS_HEIGHT=32, - MAP_INSTRUCTIONS_BOTTOM_OFFSET=40, + MAP_INSTRUCTIONS_YSTART=173, + MAP_INSTRUCTIONS_BUTTON_Y_OFFSET=3, + MAP_INSTRUCTIONS_TEXT_R=128, + MAP_INSTRUCTIONS_TEXT_G=64, + MAP_INSTRUCTIONS_TEXT_B=64, + MAP_INSTRUCTIONS_GAP_BETWEEN_BUTTONS=5, + MAP_INSTRUCTIONS_GAP_BETWEEN_BUTTONS_AND_TEXT=10, + MAP_INSTRUCTIONS_Y_SPACE_BETWEEN_LINES=15, MAP_NUM_CHAPTERS=5, MAP_NUM_LEVELS_PER_CHAPTER=5, @@ -74,19 +77,21 @@ private: { int m_mapFile; int m_globalLevelNumber; - int m_spatularOrTokenCounts; + int m_spatulaOrTokenCounts; int m_questItemFrame; int m_kelpWorldLevel; } sMapLevelData; + + void renderPointer(); + void renderInstructions(); + void generateMapScreenImage(); void copyImageToScreen(int _file,int _x,int _y,int _w,int _h); DVECTOR getPointerTargetPosition(); int isLevelOpen(unsigned int _chapter,unsigned int _level); int getSpatulaCollectedCount(unsigned int _chapter,unsigned int _level); - int getSpatulaAvailableCount(unsigned int _chapter,unsigned int _level); - int getKelpTokenAvailableCount(unsigned int _chapter,unsigned int _level); int hasQuestItemBeenCollected(unsigned int _chapter,unsigned int _level); @@ -100,6 +105,7 @@ private: DVECTOR m_pointerPos; DVECTOR m_pointerTarget; int m_pointerSin; + int m_pointerArrivedAtTarget; static sMapLevelData s_mapLevelData[MAP_NUM_CHAPTERS][MAP_NUM_LEVELS_PER_CHAPTER]; static DVECTOR s_mapLevelPositions[MAP_NUM_LEVELS_PER_CHAPTER]; diff --git a/source/pickups/pspatula.cpp b/source/pickups/pspatula.cpp index e86cf97a9..354482daf 100644 --- a/source/pickups/pspatula.cpp +++ b/source/pickups/pspatula.cpp @@ -110,7 +110,7 @@ DVECTOR CSpatulaPickup::getSizeForPlacement() void CSpatulaPickup::collect(class CPlayer *_player) { CBasePickup::collect(_player); - CGameSlotManager::getSlotData()->collectSpatula(GameScene.getChapterNumber(),GameScene.getLevelNumber(),m_spatulaNumber); + CGameSlotManager::getSlotData()->collectSpatula(GameScene.getChapterNumber()-1,GameScene.getLevelNumber()-1,m_spatulaNumber); } /*----------------------------------------------------------------------