/*========================================================================= maintitl.cpp Author: PKG Created: Project: Spongebob Purpose: Copyright (c) 2000 Climax Development Ltd ===========================================================================*/ /*---------------------------------------------------------------------- Includes -------- */ #include "frontend\maintitl.h" #ifndef __GFX_SPRBANK_H__ #include "gfx\sprbank.h" #endif #ifndef __GFX_FONT_H__ #include "gfx\font.h" #endif #ifndef __MATHTABLE_HEADER__ #include "utils\mathtab.h" #endif #ifndef __LOCALE_TEXTDBASE_H__ #include "locale\textdbase.h" #endif #ifndef __PAD_PADS_H__ #include "pad\pads.h" #endif #ifndef __GFX_FADER_H__ #include "gfx\fader.h" #endif #ifndef __GUI_GFACTORY_H__ #include "gui\gfactory.h" #endif #ifndef __GUI_GFRAME_H__ #include "gui\gframe.h" #endif #ifndef _FILEIO_HEADER_ #include "fileio\fileio.h" #endif #ifndef __VID_HEADER_ #include "system\vid.h" #endif /* Std Lib ------- */ /* Data ---- */ #ifndef __SPR_FRONTEND_H__ #include #endif /*---------------------------------------------------------------------- Tyepdefs && Defines ------------------- */ /*---------------------------------------------------------------------- Structure defintions -------------------- */ /*---------------------------------------------------------------------- Function Prototypes ------------------- */ /*---------------------------------------------------------------------- Vars ---- */ /////////////// int seaw=1; int seah=50; int seaspeed=20; int seagap=120; int seascale=4200; int seascalegrow=-50; int colourbase=64; int colourscale=4000; int colourpostscale=10; int sval=0; /////////////// /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ void CFrontEndMainTitles::init() { m_sprites=new ("MainTitle Sprites") SpriteBank(); m_sprites->load(FRONTEND_FRONTEND_SPR); m_smallFont=new ("MainTitle SmallFont") FontBank(); m_smallFont->initialise(&standardFont); m_smallFont->setJustification(FontBank::JUST_CENTRE); // Create the main menu ( START GAME/OPTIONS/CREDITS ) m_mainMenu=new ("Main Menu GUI") CGUIControlFrame(); m_mainMenu->init(NULL); m_mainMenu->setObjectXYWH(106,140,300,60); m_mainMenu->clearFlags(CGUIObject::FLAG_DRAWBORDER); CGUIFactory::createValueButtonFrame(m_mainMenu, 50,0,200,20, STR__FRONTEND__START_GAME, &m_startGameFlag,true); CGUIFactory::createValueButtonFrame(m_mainMenu, 50,20,200,20, STR__FRONTEND__OPTIONS, &m_gotoOptionsFlag,true); CGUIFactory::createValueButtonFrame(m_mainMenu, 50,40,200,20, STR__FRONTEND__CREDITS, &m_gotoCreditsFlag,true); } /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ void CFrontEndMainTitles::shutdown() { m_mainMenu->shutdown(); // GUI items delete themselves when shutdown.. m_smallFont->dump(); delete m_smallFont; m_sprites->dump(); delete m_sprites; } /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ static u8 *s_image; void CFrontEndMainTitles::select() { m_mode=MODE__PRESS_START; m_mainMenu->select(); m_startGameFlag=false; m_gotoOptionsFlag=false; m_gotoCreditsFlag=false; m_demoTimeout=0; s_image=CFileIO::loadFile(BACKDROP_SKY_GFX); ASSERT(s_image); SetScreenImage(s_image); CFader::setFadingIn(); } /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ void CFrontEndMainTitles::unselect() { ClearScreenImage(); MemFree(s_image); s_image=NULL; m_mainMenu->unselect(); } typedef struct { int x,y; }xy; xy pos[10]={{0,0},{3,0},{-3,0},{0,2},{0,-2}}; int posnum=5; /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ int isx=39; int isy=3; int isw=100; int ish=56; void CFrontEndMainTitles::render() { sFrameHdr *fh; POLY_FT4 *ft4; // Game logo/title CFrontEndScene::renderLogo(); // The island fh=m_sprites->getFrameHeader(FRM__ISLAND); m_sprites->printFT4(fh,ISLAND_LEFT_X,ISLAND_BOTTOM_Y-(fh->H),0,0,221); // Sky /* // POLY_FT4 *CFrontEndMainTitles::prepareSeaPortionFT4(sFrameHdr *_fh,int _x,int _y,int _w,int _h,int _rgb) if(xstep&&ystep) { int x,y,f; sFrameHdr *fh; POLY_FT4 *ft4; fh=m_sprites->getFrameHeader(FRM_SKY); for(x=0;x<512;x+=xstep) { for(y=0;y<128;y+=ystep) { for(f=0;f>2,y<<1,xstep>>2,ystep<<1,128); setXYWH(ft4,x+pos[f].x,y+pos[f].y,xstep,ystep); if(f) { setSemiTrans(ft4,true); } AddPrimToList(ft4,1000-f); } } } } else { POLY_G4 *g4; g4=GetPrimG4(); setXYWH(g4,0,0,512,256); setRGB0(g4,99,50,50); setRGB1(g4,50,50,99); setRGB2(g4,50,99,50); setRGB3(g4,99,50,99); AddPrimToList(g4,1001); } */ /* fh=m_sprites->getFrameHeader(FRM_SKY); for(int i=0;iprintFT4(fh,0,0,0,0,1020-i); setXYWH(ft4,pos[i].x,pos[i].y,512,HORIZON_LEVEL); if(i) setSemiTrans(ft4,true); } */ renderSeaSection(m_sprites->getFrameHeader(FRM__ISLAND),isx,HORIZON_LEVEL+isy,isw,ish); renderSeaSection(m_sprites->getFrameHeader(FRM_SKY),0,HORIZON_LEVEL,512,256-HORIZON_LEVEL+SEA_OVERLAP); switch(m_mode) { case MODE__PRESS_START: renderPressStart(); break; case MODE__SELECT_OPTION: m_mainMenu->render(); break; default: break; } } /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ void CFrontEndMainTitles::think(int _frames) { sval=(sval+(seaspeed*_frames))&4095; switch(m_mode) { case MODE__PRESS_START: if(!CFader::isFading()&&PadGetDown(0)&PAD_START) { m_mode=MODE__SELECT_OPTION; } break; case MODE__SELECT_OPTION: m_mainMenu->think(_frames); if(m_startGameFlag) { CFader::setFadingOut(); m_mode=MODE__GOTO_CHOOSE_SLOT; } else if(m_gotoOptionsFlag) { CFader::setFadingOut(); m_mode=MODE__GOTO_OPTIONS; } else if(m_gotoCreditsFlag) { CFader::setFadingOut(); m_mode=MODE__GOTO_CREDITS; } break; default: break; } if(m_mode==MODE__PRESS_START||m_mode==MODE__SELECT_OPTION) { if(!PadGetHeld(0)) { m_demoTimeout+=_frames; if(m_demoTimeout>DEMO_TIMEOUT_IN_SECONDS*GameState::getOneSecondInFrames()) { CFader::setFadingOut(); m_mode=MODE__GOTO_DEMO; } } else { m_demoTimeout=0; } } } /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ int CFrontEndMainTitles::isReadyToExit() { return !CFader::isFading()&&(m_mode==MODE__GOTO_CHOOSE_SLOT||m_mode==MODE__GOTO_OPTIONS||m_mode==MODE__GOTO_DEMO||m_mode==MODE__GOTO_CREDITS); } /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ CFrontEndScene::FrontEndMode CFrontEndMainTitles::getNextMode() { CFrontEndScene::FrontEndMode ret; ret=CFrontEndScene::MODE__NONE; switch(m_mode) { case MODE__PRESS_START: case MODE__SELECT_OPTION: ASSERT(0); break; case MODE__GOTO_CHOOSE_SLOT: ret=CFrontEndScene::MODE__CHOOSE_SLOT; break; case MODE__GOTO_OPTIONS: ret=CFrontEndScene::MODE__GAME_OPTIONS; break; case MODE__GOTO_DEMO: ret=CFrontEndScene::MODE__DEMO; break; case MODE__GOTO_CREDITS: ret=CFrontEndScene::MODE__CREDITS; break; } return ret; } /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ POLY_FT4 *CFrontEndMainTitles::prepareSeaPortionFT4(sFrameHdr *_fh,int _x,int _y,int _w,int _h,int _rgb) { int u,v,w,h; POLY_FT4 *ft4; w=(_fh->W*_w)>>8; h=(_fh->H*_h)>>8; u=_fh->U+((_fh->W*_x)>>8); v=_fh->V+_fh->H-((_fh->H*_y)>>8)-h; ft4=GetPrimFT4(); setShadeTexPolyFT4(ft4); setShadeTex(ft4,0); setRGB0(ft4,_rgb,_rgb,_rgb); ft4->u0=u; ft4->u1=u+w; ft4->u2=u; ft4->u3=u+w; ft4->v0=v+h-1; ft4->v1=v+h-1; ft4->v2=v-1; ft4->v3=v-1; ft4->tpage=_fh->TPage; ft4->clut=_fh->Clut; return ft4; } /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ typedef struct { int x,y; int colour; } SeaGrid; void CFrontEndMainTitles::renderSeaSection(sFrameHdr *_fh,int _x,int _y,int _w,int _h) { int xloop,yloop; int xstep,ystep; int x,y; int scale; POLY_FT4 *ft4; SeaGrid grid[seaw+1][seah+1]; int waveval; // Grow the grid xstep=(_w<<8)/seaw; ystep=(_h<<8)/seah; y=_y<<8; waveval=sval; scale=seascale; for(yloop=0;yloop>8)+0; grid[xloop][yloop].y=(y>>8)+(msin(waveval)/scale); // grid[xloop][yloop].colour=colourbase+((msin(waveval)/colourscale)*colourpostscale); x+=xstep; } y+=ystep; scale+=seascalegrow; waveval=(waveval+seagap)&4095; } // Draw it xstep=(256<<8)/seaw; ystep=(256<<8)/seah; y=0; for(yloop=0;yloop>8,y>>8,xstep>>8,ystep>>8,64);//grid[xloop][yloop].colour); ft4->x0=grid[xloop ][yloop ].x; ft4->y0=grid[xloop ][yloop ].y; ft4->x1=grid[xloop+1][yloop ].x; ft4->y1=grid[xloop+1][yloop ].y; ft4->x3=grid[xloop+1][yloop+1].x; ft4->y3=grid[xloop+1][yloop+1].y; ft4->x2=grid[xloop ][yloop+1].x; ft4->y2=grid[xloop ][yloop+1].y; AddPrimToList(ft4,1000); x+=xstep; } y+=ystep; } //////////////////////// bg POLY_F4 *f4; f4=GetPrimF4(); setXYWH(f4,0,HORIZON_LEVEL,512,256-HORIZON_LEVEL); setRGB0(f4,80,70,60); AddPrimToList(f4,1020); //////////////////////// bg } /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ void CFrontEndMainTitles::renderPressStart() { if(!CFader::isFading()) { m_smallFont->setColour(PRESS_START_TEXT_R,PRESS_START_TEXT_G,PRESS_START_TEXT_B); m_smallFont->print(256,PRESS_START_TEXT_Y,STR__FRONTEND__PRESS_START); } } /*=========================================================================== end */