diff --git a/makefile.gfx b/makefile.gfx index eb1c3b40c..cd139cbca 100644 --- a/makefile.gfx +++ b/makefile.gfx @@ -220,7 +220,8 @@ UI_GFX_NONTRANS_IN := $(foreach FILE,$(UI_GFX_NONTRANS),$(UI_GFX_DIR)/$(FILE)) UI_GFX_TRANS := +bambootopleft.bmp +bamboobotleft.bmp +bambootopright.bmp +bamboobotright.bmp \ +bamboohorizontal.bmp +bamboovertical.bmp \ +butU.bmp +butD.bmp +butL.bmp +butR.bmp \ - +butC.bmp +butS.bmp +butX.bmp +butT.bmp + +butC.bmp +butS.bmp +butX.bmp +butT.bmp \ + +mappointer.bmp UI_GFX_TRANS_IN := $(foreach FILE,$(UI_GFX_TRANS),$(UI_GFX_DIR)/$(FILE)) #### diff --git a/source/map/map.cpp b/source/map/map.cpp index 8c34c411f..c4413de5a 100644 --- a/source/map/map.cpp +++ b/source/map/map.cpp @@ -46,6 +46,18 @@ #include "fileio\fileio.h" #endif +#ifndef __GUI_GFRAME_H__ +#include "gui\gframe.h" +#endif + +#ifndef __GUI_GFACTORY_H__ +#include "gui\gfactory.h" +#endif + +#ifndef __MATHTABLE_HEADER__ +#include "utils\mathtab.h" +#endif + /* Std Lib ------- */ @@ -57,6 +69,10 @@ #include #endif +#ifndef __SPR_SPRITES_H__ +#include +#endif + /*---------------------------------------------------------------------- Tyepdefs && Defines @@ -92,31 +108,55 @@ enum MAP_LEVEL_WIDTH=140, MAP_LEVEL_HEIGHT=60, + MAP_LEVEL_TOP_BORDER=20, + MAP_LEVEL_Y_SPACING=8, + MAP_LEVEL_X_SPACING=4, + + + MAP_INSTRUCTIONS_WIDTH=416, + MAP_INSTRUCTIONS_HEIGHT=32, + MAP_INSTRUCTIONS_BOTTOM_OFFSET=40, }; -int MAP_LEVEL_TOP_BORDER=20; -int MAP_LEVEL_Y_SPACING=10; -int MAP_LEVEL_X_SPACING=4; -int s_levelMaps[6]= +static int s_levelMaps[5][6]= { - MAP_C1_L1_GFX, - MAP_C1_L2_GFX, - MAP_C1_L3_GFX, - MAP_C1_L4_GFX, - MAP_C1_BOSS_GFX, - MAP_C1_FAIR_GFX, + { MAP_C1_L1_GFX, MAP_C1_L2_GFX, MAP_C1_L3_GFX, MAP_C1_L4_GFX, MAP_C1_BOSS_GFX, MAP_C1_FAIR_GFX }, + { MAP_C1_L1_GFX, MAP_C1_L2_GFX, MAP_C1_L3_GFX, MAP_C1_L4_GFX, MAP_C1_BOSS_GFX, MAP_C1_FAIR_GFX }, + { MAP_C1_L1_GFX, MAP_C1_L2_GFX, MAP_C1_L3_GFX, MAP_C1_L4_GFX, MAP_C1_BOSS_GFX, MAP_C1_FAIR_GFX }, + { MAP_C1_L1_GFX, MAP_C1_L2_GFX, MAP_C1_L3_GFX, MAP_C1_L4_GFX, MAP_C1_BOSS_GFX, MAP_C1_FAIR_GFX }, + { MAP_C1_L1_GFX, MAP_C1_L2_GFX, MAP_C1_L3_GFX, MAP_C1_L4_GFX, MAP_C1_BOSS_GFX, MAP_C1_FAIR_GFX }, }; +static int s_questItems[5][4]= +{ + { FRM__C1_L1_JELLY, FRM__C1_L2_SEAWEED, FRM__C1_L3_SEANUTBUTTER, FRM__C1_L4_BREADSLICE }, + { FRM__C2_L1_FALSETEETH, FRM__C2_L2_KELPKREAM, FRM__C2_L3_MUDPACK, FRM__C2_L4_SPONGE }, + { FRM__C3_L1_SLIPPERS, FRM__C3_L2_CLAMBRA, FRM__C3_L3_STARFISHMASK, FRM__C3_L4_SUPERPANTZ }, + { FRM__C4_COIN, FRM__C4_COIN, FRM__C4_COIN, FRM__C4_KELPBAR }, + { FRM__C5_L1_HAMMER, FRM__C5_L2_ARIEL, FRM__C5_L3_OILCAN, FRM__C5_L4_WRENCH }, +}; +static int s_levelNumbers[5][4]= +{ + { 0, 1, 2, 3, 4, 25 }, + { 5, 6, 7, 8, 9, 26 }, + { 10, 11, 12, 13, 14, 27 }, + { 15, 16, 17, 18, 19, 28 }, + { 20, 21, 22, 23, 24, 29 }, +} + void CMapScene::init() { m_font=new ("map screen font") FontBank(); m_font->initialise(&standardFont); m_font->setJustification(FontBank::JUST_CENTRE); - m_font->setOt(5); + m_font->setOt(10); + m_font->setColour(0,0,0); + m_font->setJustification(FontBank::JUST_LEFT); + + m_spriteBank=new ("map screen sprite") SpriteBank(); + m_spriteBank->load(SPRITES_SPRITES_SPR); - m_readyToExit=false; -// CFader::setFadingIn(CFader::BLACK_FADE); // Generate the map background image int i,x,y,xpos,ypos; @@ -130,8 +170,10 @@ void CMapScene::init() xpos=256-((MAP_LEVEL_WIDTH*3)/2)-MAP_LEVEL_X_SPACING; for(x=0;x<3;x++) { -// if(isLevelOpen - copyImageToScreen(s_levelMaps[i],xpos,ypos,MAP_LEVEL_WIDTH,MAP_LEVEL_HEIGHT); + if(isLevelOpen(m_currentChapterSelection,i)) + { + copyImageToScreen(s_levelMaps[m_currentChapterSelection][i],xpos,ypos,MAP_LEVEL_WIDTH,MAP_LEVEL_HEIGHT); + } i++; xpos+=MAP_LEVEL_WIDTH+MAP_LEVEL_X_SPACING; } @@ -139,6 +181,23 @@ void CMapScene::init() } SetScreenImage((u8*)m_screenImage); + + // Generate the ui box at the bottom of the screen + m_guiFrame=new ("Conversation GUI") CGUIControlFrame(); + m_guiFrame->init(0); + m_guiFrame->setObjectXYWH((512-MAP_INSTRUCTIONS_WIDTH)/2,256-MAP_INSTRUCTIONS_BOTTOM_OFFSET-MAP_INSTRUCTIONS_HEIGHT,MAP_INSTRUCTIONS_WIDTH,MAP_INSTRUCTIONS_HEIGHT); +// m_guiFrame->setOt(OT_POS); + m_guiFrame->setFlags(CGUIObject::FLAG_DRAWBORDER); + + + m_readyToExit=false; +// CFader::setFadingIn(CFader::BLACK_FADE); + + + m_currentChapterSelection=0; + m_currentLevelSelection=0; + m_pointerPos.vx=256; + m_pointerPos.vy=-50; } @@ -150,8 +209,10 @@ void CMapScene::init() ---------------------------------------------------------------------- */ void CMapScene::shutdown() { + m_guiFrame->shutdown(); ClearScreenImage(); MemFree(m_screenImage); + m_spriteBank->dump(); delete m_spriteBank; m_font->dump(); delete m_font; } @@ -164,8 +225,40 @@ void CMapScene::shutdown() ---------------------------------------------------------------------- */ void CMapScene::render() { - m_font->setColour(255,255,255); - m_font->print(256,100,"MAP SCREEN!!!"); + int i,x,y,xpos,ypos; + int compilerGetsComfused; + char spatCount[10]; + sFrameHdr *fh; + POLY_FT4 *ft4; + + // Render spatula counts and quest items + i=0; + ypos=MAP_PARCHMENT_START_Y+MAP_LEVEL_TOP_BORDER; + for(y=0;y<2;y++) + { + xpos=256-((MAP_LEVEL_WIDTH*3)/2)-MAP_LEVEL_X_SPACING; + compilerGetsComfused=y==0?3:1; // 3 on top row, 1 on bottom - put this in the for loop and the complier breaks :o + for(x=0;xprint(xpos,ypos,spatCount); + fh=m_spriteBank->getFrameHeader(s_questItems[m_currentChapterSelection][i]); + ft4=m_spriteBank->printFT4Scaled(fh,xpos+MAP_LEVEL_WIDTH-fh->W,ypos+MAP_LEVEL_HEIGHT-fh->H,0,0,10,128); + if(!hasQuestItemBeenCollected(m_currentChapterSelection,i)) + { + setRGB0(ft4,10,10,10); + } + i++; + xpos+=MAP_LEVEL_WIDTH+MAP_LEVEL_X_SPACING; + } + ypos+=MAP_LEVEL_HEIGHT+MAP_LEVEL_Y_SPACING; + } + + // Selection cursor + fh=m_spriteBank->getFrameHeader(FRM__MAPPOINTER); + m_spriteBank->printFT4(fh,m_pointerPos.vx-(fh->W/2),m_pointerPos.vy-(fh->H/2),0,0,9); + + m_guiFrame->render(); } @@ -179,12 +272,73 @@ void CMapScene::think(int _frames) { if(!CFader::isFading()&&!m_readyToExit) { + // Move cursor + if(PadGetDown(0)&PAD_LEFT) + { + do + { + if(--m_currentLevelSelection<0)m_currentLevelSelection=5; + } + while(!isLevelOpen(m_currentChapterSelection,m_currentLevelSelection)); + } + else if(PadGetDown(0)&PAD_RIGHT) + { + do + { + if(++m_currentLevelSelection>5)m_currentLevelSelection=0; + } + while(!isLevelOpen(m_currentChapterSelection,m_currentLevelSelection)); + } + + // Calc where the pointer should be + m_pointerSin=(m_pointerSin+(_frames*70))&4095; + m_pointerTarget.vx=256-((MAP_LEVEL_WIDTH*3)/2)-MAP_LEVEL_X_SPACING+ + ((m_currentLevelSelection%3)*(MAP_LEVEL_WIDTH+MAP_LEVEL_X_SPACING))+ + (MAP_LEVEL_WIDTH/2); + m_pointerTarget.vy=MAP_PARCHMENT_START_Y+MAP_LEVEL_TOP_BORDER+ + ((m_currentLevelSelection/3)*(MAP_LEVEL_HEIGHT+MAP_LEVEL_Y_SPACING))+ + (MAP_LEVEL_HEIGHT)+ + (msin(m_pointerSin)*4>>12); + + // Move the pointer + for(int i=0;i<_frames;i++) + { + int delta; + + delta=m_pointerTarget.vx-m_pointerPos.vx; + if(delta<0) + { + delta/=2; + if(!delta)delta=-1; + } + else if(delta>0) + { + delta/=2; + if(!delta)delta=+1; + } + m_pointerPos.vx+=delta; + + delta=m_pointerTarget.vy-m_pointerPos.vy; + if(delta<0) + { + delta/=2; + if(!delta)delta=-1; + } + else if(delta>0) + { + delta/=2; + if(!delta)delta=+1; + } + m_pointerPos.vy+=delta; + } + if(PadGetDown(0)&(PAD_CROSS|PAD_START)) { m_readyToExit=true; // CFader::setFadingOut(CFader::BLACK_FADE); GameState::setNextScene(&FrontEndScene); } + m_guiFrame->think(_frames); } } @@ -200,7 +354,6 @@ int CMapScene::readyToShutdown() return m_readyToExit&&!CFader::isFading(); } - /*---------------------------------------------------------------------- Function: Purpose: @@ -227,5 +380,32 @@ void CMapScene::copyImageToScreen(int _file,int _x,int _y,int _w,int _h) MemFree(image); } +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int CMapScene::isLevelOpen(int _chapter,int _level) +{ + return true;//_level<4; +} + +int CMapScene::getSpatulaCollectedCount(int _chapter,int _level) +{ + return 10+_level; +} + +int CMapScene::getSpatulaAvailableCount(int _chapter,int _level) +{ + return 30; +} + +int CMapScene::hasQuestItemBeenCollected(int _chapter,int _level) +{ + return _level<2; +} + + /*=========================================================================== end */ \ No newline at end of file diff --git a/source/map/map.h b/source/map/map.h index 522b1b124..8d4c7eb46 100644 --- a/source/map/map.h +++ b/source/map/map.h @@ -22,6 +22,10 @@ #include "system\gstate.h" #endif +#ifndef _GLOBAL_HEADER_ +#include "system\global.h" // Doh.. just for DVECTOR :/ +#endif + /* Std Lib ------- */ @@ -47,6 +51,10 @@ public: private: void copyImageToScreen(int _file,int _x,int _y,int _w,int _h); + int isLevelOpen(int _chapter,int _level); + int getSpatulaCollectedCount(int _chapter,int _level); + int getSpatulaAvailableCount(int _chapter,int _level); + int hasQuestItemBeenCollected(int _chapter,int _level); class FontBank *m_font; @@ -54,6 +62,15 @@ private: char *m_screenImage; + class CGUIControlFrame *m_guiFrame; + class SpriteBank *m_spriteBank; + + int m_currentChapterSelection; + int m_currentLevelSelection; + DVECTOR m_pointerPos; + DVECTOR m_pointerTarget; + int m_pointerSin; + };