This commit is contained in:
parent
2dc3efd0d7
commit
992756d1b0
5 changed files with 393 additions and 125 deletions
|
@ -143,6 +143,17 @@ void CGameSlotManager::eraseGameSlot(unsigned int _slot)
|
||||||
slot->m_kelpTokenCollectedFlags[i][j]=0;
|
slot->m_kelpTokenCollectedFlags[i][j]=0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __USER_paul__
|
||||||
|
slot->m_kelpTokensHeld=82;
|
||||||
|
#else
|
||||||
|
slot->m_kelpTokensHeld=0;
|
||||||
|
#endif
|
||||||
|
for(i=0;i<CShopScene::NUM_SHOP_ITEM_IDS;i++)
|
||||||
|
{
|
||||||
|
slot->m_partyItemsHeld[i]=false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,10 @@
|
||||||
Includes
|
Includes
|
||||||
-------- */
|
-------- */
|
||||||
|
|
||||||
|
#ifndef __SHOP_SHOP_H__
|
||||||
|
#include "shop\shop.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
// Just for ASSERT()..
|
// Just for ASSERT()..
|
||||||
#ifndef __SYSTEM_DBG_H__
|
#ifndef __SYSTEM_DBG_H__
|
||||||
#include "system\dbg.h"
|
#include "system\dbg.h"
|
||||||
|
@ -58,6 +62,8 @@ public:
|
||||||
unsigned char m_maxLevelCompleted;
|
unsigned char m_maxLevelCompleted;
|
||||||
unsigned char m_spatulaCollectedFlags[NUM_CHAPTERS*NUM_LEVELS_WITH_SPATULAS][16]; // Enuf space for 128 spats per level
|
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..
|
unsigned char m_kelpTokenCollectedFlags[NUM_CHAPTERS][16]; // Same again..
|
||||||
|
unsigned char m_kelpTokensHeld;
|
||||||
|
unsigned char m_partyItemsHeld[CShopScene::NUM_SHOP_ITEM_IDS];
|
||||||
|
|
||||||
// Spat functions..
|
// Spat functions..
|
||||||
int getSpatulaCollectedCount(unsigned int _chapter,unsigned int _level)
|
int getSpatulaCollectedCount(unsigned int _chapter,unsigned int _level)
|
||||||
|
@ -124,6 +130,26 @@ public:
|
||||||
ASSERT(_token<=128);
|
ASSERT(_token<=128);
|
||||||
return (m_kelpTokenCollectedFlags[_chapter][_token>>3]>>(_token&7))&1?false:true;
|
return (m_kelpTokenCollectedFlags[_chapter][_token>>3]>>(_token&7))&1?false:true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Shop
|
||||||
|
int getNumberOfKelpTokensHeld()
|
||||||
|
{
|
||||||
|
return m_kelpTokensHeld;
|
||||||
|
}
|
||||||
|
void useKelpTokens(int _count)
|
||||||
|
{
|
||||||
|
ASSERT(((int)m_kelpTokensHeld-_count)>=0);
|
||||||
|
m_kelpTokensHeld-=_count;
|
||||||
|
}
|
||||||
|
int isPartyItemHeld(int _itemNumber)
|
||||||
|
{
|
||||||
|
return m_partyItemsHeld[_itemNumber];
|
||||||
|
}
|
||||||
|
void buyPartyItem(int _itemNumber)
|
||||||
|
{
|
||||||
|
ASSERT(!m_partyItemsHeld[_itemNumber]);
|
||||||
|
m_partyItemsHeld[_itemNumber]=true;
|
||||||
|
}
|
||||||
} GameSlot;
|
} GameSlot;
|
||||||
|
|
||||||
static void init();
|
static void init();
|
||||||
|
|
|
@ -54,6 +54,10 @@
|
||||||
#include "game\gameslot.h"
|
#include "game\gameslot.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __SOUND_SOUND_H__
|
||||||
|
#include "sound\sound.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Std Lib
|
/* Std Lib
|
||||||
------- */
|
------- */
|
||||||
|
@ -383,6 +387,7 @@ void CMapScene::think(int _frames)
|
||||||
}
|
}
|
||||||
if(lastLevel!=m_currentLevelSelection)
|
if(lastLevel!=m_currentLevelSelection)
|
||||||
{
|
{
|
||||||
|
CSoundMediator::playSfx(CSoundMediator::SFX_FRONT_END__MOVE_CURSOR);
|
||||||
m_pointerArrivedAtTarget=false;
|
m_pointerArrivedAtTarget=false;
|
||||||
m_pointerSin=0;
|
m_pointerSin=0;
|
||||||
}
|
}
|
||||||
|
@ -435,6 +440,7 @@ void CMapScene::think(int _frames)
|
||||||
if(m_pointerArrivedAtTarget&&
|
if(m_pointerArrivedAtTarget&&
|
||||||
PadGetDown(0)&PAD_CROSS)
|
PadGetDown(0)&PAD_CROSS)
|
||||||
{
|
{
|
||||||
|
CSoundMediator::playSfx(CSoundMediator::SFX_FRONT_END__OK);
|
||||||
s_globalLevelSelectThing=s_mapLevelData[m_currentChapterSelection][m_currentLevelSelection].m_globalLevelNumber;
|
s_globalLevelSelectThing=s_mapLevelData[m_currentChapterSelection][m_currentLevelSelection].m_globalLevelNumber;
|
||||||
m_readyToExit=true;
|
m_readyToExit=true;
|
||||||
// CFader::setFadingOut(CFader::BLACK_FADE);
|
// CFader::setFadingOut(CFader::BLACK_FADE);
|
||||||
|
|
|
@ -62,6 +62,18 @@
|
||||||
#include "gui\gtextbox.h"
|
#include "gui\gtextbox.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __SOUND_SOUND_H__
|
||||||
|
#include "sound\sound.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __GAME_GAMESLOT_H__
|
||||||
|
#include "game\gameslot.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __MAP_MAP_H__
|
||||||
|
#include "map\map.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Std Lib
|
/* Std Lib
|
||||||
------- */
|
------- */
|
||||||
|
@ -98,6 +110,7 @@
|
||||||
Vars
|
Vars
|
||||||
---- */
|
---- */
|
||||||
|
|
||||||
|
// 82 tokens in total
|
||||||
CShopScene::SHOPITEM CShopScene::s_shopItems[NUM_SHOP_ITEM_IDS]=
|
CShopScene::SHOPITEM CShopScene::s_shopItems[NUM_SHOP_ITEM_IDS]=
|
||||||
{
|
{
|
||||||
{ 1, FRM_BLOWER },
|
{ 1, FRM_BLOWER },
|
||||||
|
@ -110,9 +123,7 @@ CShopScene::SHOPITEM CShopScene::s_shopItems[NUM_SHOP_ITEM_IDS]=
|
||||||
{ 8, FRM_TEDDY },
|
{ 8, FRM_TEDDY },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
xmPlayingId s_playId;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CShopScene ShopScene;
|
CShopScene ShopScene;
|
||||||
|
|
||||||
|
@ -123,10 +134,10 @@ CShopScene ShopScene;
|
||||||
Params:
|
Params:
|
||||||
Returns:
|
Returns:
|
||||||
---------------------------------------------------------------------- */
|
---------------------------------------------------------------------- */
|
||||||
int fx=48;
|
int fx=76;
|
||||||
int fy=155;
|
int fy=80;
|
||||||
int fw=416;
|
int fw=200;
|
||||||
int fh=64;
|
int fh=20;
|
||||||
void CShopScene::init()
|
void CShopScene::init()
|
||||||
{
|
{
|
||||||
m_image=CFileIO::loadFile(BACKDROP_SHOP_GFX);
|
m_image=CFileIO::loadFile(BACKDROP_SHOP_GFX);
|
||||||
|
@ -141,19 +152,53 @@ void CShopScene::init()
|
||||||
m_spriteBank=new ("shop sprites") SpriteBank();
|
m_spriteBank=new ("shop sprites") SpriteBank();
|
||||||
m_spriteBank->load(SHOP_SHOP_SPR);
|
m_spriteBank->load(SHOP_SHOP_SPR);
|
||||||
|
|
||||||
|
|
||||||
// GUI Frame
|
// GUI Frame
|
||||||
CGUITextBox *tb;
|
m_guiFrame=new ("Token count frame") CGUIGroupFrame();
|
||||||
m_guiFrame=new ("Token Count Frame") CGUIGroupFrame();
|
|
||||||
m_guiFrame->init(0);
|
m_guiFrame->init(0);
|
||||||
m_guiFrame->setOt(0);
|
m_guiFrame->setOt(5);
|
||||||
m_guiFrame->setFlags(CGUIObject::FLAG_DRAWBORDER);
|
m_guiFrame->setFlags(CGUIObject::FLAG_DRAWBORDER);
|
||||||
m_guiFrame->setObjectXYWH(fx,fy,fw,fh);
|
m_guiFrame->setObjectXYWH(SHOP_MAIN_UI_X,SHOP_MAIN_UI_Y,SHOP_MAIN_UI_W,SHOP_MAIN_UI_H);
|
||||||
|
|
||||||
|
m_guiConfirmPurchaseFrame=new ("Confirm purchase frame") CGUIControlFrame();
|
||||||
|
m_guiConfirmPurchaseFrame->init(0);
|
||||||
|
m_guiConfirmPurchaseFrame->setOt(4);
|
||||||
|
m_guiConfirmPurchaseFrame->setFlags(CGUIObject::FLAG_DRAWBORDER);
|
||||||
|
m_guiConfirmPurchaseFrame->setObjectXYWH(SHOP_QUERY_UI_X,SHOP_QUERY_UI_Y,SHOP_QUERY_UI_W,SHOP_QUERY_UI_H);
|
||||||
|
CGUIFactory::createValueButtonFrame(m_guiConfirmPurchaseFrame,
|
||||||
|
fx,fy,fw,fh,
|
||||||
|
STR__YES,
|
||||||
|
&m_queryAnswer,
|
||||||
|
ANSWER_YES);
|
||||||
|
CGUIFactory::createValueButtonFrame(m_guiConfirmPurchaseFrame,
|
||||||
|
fx,fy+fh,fw,fh,
|
||||||
|
STR__NO,
|
||||||
|
&m_queryAnswer,
|
||||||
|
ANSWER_NO);
|
||||||
|
|
||||||
|
m_guiCannotAffordFrame=new ("Cannot afford frame") CGUIControlFrame();
|
||||||
|
m_guiCannotAffordFrame->init(0);
|
||||||
|
m_guiCannotAffordFrame->setOt(4);
|
||||||
|
m_guiCannotAffordFrame->setFlags(CGUIObject::FLAG_DRAWBORDER);
|
||||||
|
m_guiCannotAffordFrame->setObjectXYWH(SHOP_QUERY_UI_X,SHOP_QUERY_UI_Y,SHOP_QUERY_UI_W,SHOP_QUERY_UI_H);
|
||||||
|
CGUIFactory::createValueButtonFrame(m_guiCannotAffordFrame,
|
||||||
|
fx,fy,fw,fh,
|
||||||
|
STR__OK,
|
||||||
|
&m_queryAnswer,
|
||||||
|
ANSWER_OK);
|
||||||
|
|
||||||
|
|
||||||
m_readyToExit=false;
|
m_readyToExit=false;
|
||||||
CFader::setFadingIn(CFader::BLACK_FADE);
|
CFader::setFadingIn(CFader::BLACK_FADE);
|
||||||
|
|
||||||
m_currentlySelectedItem=0;
|
m_currentlySelectedItem=0;
|
||||||
m_flashSin=0;
|
m_flashSin=0;
|
||||||
|
|
||||||
|
s_playId=NOT_PLAYING;
|
||||||
|
|
||||||
|
m_state=SHOP_STATE__FADING_IN;
|
||||||
|
|
||||||
|
m_mainUiYOffset=SHOP_STATE__SELECT_ITEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -165,6 +210,8 @@ void CShopScene::init()
|
||||||
---------------------------------------------------------------------- */
|
---------------------------------------------------------------------- */
|
||||||
void CShopScene::shutdown()
|
void CShopScene::shutdown()
|
||||||
{
|
{
|
||||||
|
m_guiCannotAffordFrame->shutdown();
|
||||||
|
m_guiConfirmPurchaseFrame->shutdown();
|
||||||
m_guiFrame->shutdown();
|
m_guiFrame->shutdown();
|
||||||
|
|
||||||
m_spriteBank->dump(); delete m_spriteBank;
|
m_spriteBank->dump(); delete m_spriteBank;
|
||||||
|
@ -180,62 +227,60 @@ void CShopScene::shutdown()
|
||||||
Params:
|
Params:
|
||||||
Returns:
|
Returns:
|
||||||
---------------------------------------------------------------------- */
|
---------------------------------------------------------------------- */
|
||||||
int shopx=180;
|
|
||||||
int shopy=38;
|
|
||||||
int shopw=512-(180*2);
|
|
||||||
int shopygap=51;
|
|
||||||
int shopitemsperrow=4;
|
|
||||||
int shopflashspeed=200;
|
|
||||||
int shopflashbase=128;
|
|
||||||
int shopflashrange=50;
|
|
||||||
int shopboughtrgb=45;
|
|
||||||
void CShopScene::render()
|
void CShopScene::render()
|
||||||
{
|
{
|
||||||
SHOPITEM *shopItem;
|
SHOPITEM *shopItem;
|
||||||
int i,x,y,gap;
|
int i,x,y,gap;
|
||||||
POLY_FT4 *ft4;
|
POLY_FT4 *ft4;
|
||||||
|
|
||||||
|
|
||||||
|
renderUi();
|
||||||
|
|
||||||
shopItem=s_shopItems;
|
shopItem=s_shopItems;
|
||||||
x=shopx;
|
x=SHOP_ICON_XBASE;
|
||||||
y=shopy;
|
y=SHOP_ICON_YBASE;
|
||||||
gap=shopw/(shopitemsperrow-1);
|
gap=SHOP_ICON_WIDTH/(SHOP_ICON_ITEMS_PER_ROW-1);
|
||||||
for(i=0;i<NUM_SHOP_ITEM_IDS;i++)
|
for(i=0;i<NUM_SHOP_ITEM_IDS;i++)
|
||||||
{
|
{
|
||||||
// Icon
|
// Icon
|
||||||
sFrameHdr *fh=m_spriteBank->getFrameHeader(shopItem->m_frame);
|
sFrameHdr *fh=m_spriteBank->getFrameHeader(shopItem->m_frame);
|
||||||
ft4=m_spriteBank->printFT4(fh,x-fh->W/2,y,0,0,0);
|
ft4=m_spriteBank->printFT4(fh,x-fh->W/2,y,0,0,5);
|
||||||
|
|
||||||
// Cursor?
|
// Cursor?
|
||||||
if(i==m_currentlySelectedItem)
|
if(i==m_currentlySelectedItem)
|
||||||
|
{
|
||||||
|
if(!CFader::isFading())
|
||||||
|
{
|
||||||
|
if(m_state==SHOP_STATE__SELECT_ITEM)
|
||||||
{
|
{
|
||||||
SpriteBank *sb=CGameScene::getSpriteBank();
|
SpriteBank *sb=CGameScene::getSpriteBank();
|
||||||
sFrameHdr *fh=sb->getFrameHeader(FRM__MAPPOINTER);
|
sFrameHdr *fh=sb->getFrameHeader(FRM__MAPPOINTER);
|
||||||
sb->printFT4(fh,x-fh->W,y+30,0,0,0);
|
sb->printFT4(fh,x-fh->W,y+30,0,0,5);
|
||||||
|
}
|
||||||
|
|
||||||
// Flash selected item
|
// Flash selected item
|
||||||
int rgb=((msin(m_flashSin)*shopflashrange)>>12)+shopflashbase;
|
int rgb=((msin(m_flashSin)*SHOP_ICON_FLASH_COLOUR_RANGE)>>12)+SHOP_ICON_FLASH_COLOUR_BASE;
|
||||||
setRGB0(ft4,rgb,rgb,rgb);
|
setRGB0(ft4,rgb,rgb,rgb);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Darken item if already bought
|
// Darken item if already bought
|
||||||
if(!isItemAvailableToBuy(i))
|
if(!isItemAvailableToBuy(i))
|
||||||
{
|
{
|
||||||
setRGB0(ft4,shopboughtrgb,shopboughtrgb,shopboughtrgb);
|
setRGB0(ft4,SHOP_ICON_PURCHASED_RGB,SHOP_ICON_PURCHASED_RGB,SHOP_ICON_PURCHASED_RGB);
|
||||||
}
|
}
|
||||||
|
|
||||||
shopItem++;
|
shopItem++;
|
||||||
if(i%shopitemsperrow==shopitemsperrow-1)
|
if(i%SHOP_ICON_ITEMS_PER_ROW==SHOP_ICON_ITEMS_PER_ROW-1)
|
||||||
{
|
{
|
||||||
x=shopx;
|
x=SHOP_ICON_XBASE;
|
||||||
y+=shopygap;
|
y+=SHOP_ICON_Y_GAP;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
x+=gap;
|
x+=gap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
renderUi();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -247,6 +292,15 @@ void CShopScene::render()
|
||||||
---------------------------------------------------------------------- */
|
---------------------------------------------------------------------- */
|
||||||
void CShopScene::think(int _frames)
|
void CShopScene::think(int _frames)
|
||||||
{
|
{
|
||||||
|
if(m_state==SHOP_STATE__FADING_IN)
|
||||||
|
{
|
||||||
|
if(!CFader::isFading())
|
||||||
|
{
|
||||||
|
m_state=SHOP_STATE__SELECT_ITEM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(m_state==SHOP_STATE__SELECT_ITEM&&!CFader::isFading())
|
||||||
|
{
|
||||||
int pad;
|
int pad;
|
||||||
|
|
||||||
pad=PadGetDown(0);
|
pad=PadGetDown(0);
|
||||||
|
@ -258,6 +312,7 @@ void CShopScene::think(int _frames)
|
||||||
m_currentlySelectedItem=NUM_SHOP_ITEM_IDS-1;
|
m_currentlySelectedItem=NUM_SHOP_ITEM_IDS-1;
|
||||||
}
|
}
|
||||||
m_flashSin=0;
|
m_flashSin=0;
|
||||||
|
playSound(CSoundMediator::SFX_FRONT_END__MOVE_CURSOR);
|
||||||
}
|
}
|
||||||
else if(pad&PAD_RIGHT)
|
else if(pad&PAD_RIGHT)
|
||||||
{
|
{
|
||||||
|
@ -267,11 +322,92 @@ void CShopScene::think(int _frames)
|
||||||
m_currentlySelectedItem=0;
|
m_currentlySelectedItem=0;
|
||||||
}
|
}
|
||||||
m_flashSin=0;
|
m_flashSin=0;
|
||||||
|
playSound(CSoundMediator::SFX_FRONT_END__MOVE_CURSOR);
|
||||||
|
}
|
||||||
|
else if(pad&PAD_CROSS)
|
||||||
|
{
|
||||||
|
if(isItemAvailableToBuy(m_currentlySelectedItem))
|
||||||
|
{
|
||||||
|
int cost,available;
|
||||||
|
cost=s_shopItems[m_currentlySelectedItem].m_cost;
|
||||||
|
available=CGameSlotManager::getSlotData()->getNumberOfKelpTokensHeld();
|
||||||
|
if(available>=cost)
|
||||||
|
{
|
||||||
|
playSound(CSoundMediator::SFX_FRONT_END__SELECT);
|
||||||
|
m_state=SHOP_STATE__CONFIRM_PURCHASE;
|
||||||
|
m_queryAnswer=ANSWER_NONE;
|
||||||
|
m_guiConfirmPurchaseFrame->select();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
playSound(CSoundMediator::SFX_FRONT_END__ERROR);
|
||||||
|
m_state=SHOP_STATE__CANNOT_AFFORD_ITEM;
|
||||||
|
m_queryAnswer=ANSWER_NONE;
|
||||||
|
m_guiCannotAffordFrame->select();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
playSound(CSoundMediator::SFX_FRONT_END__ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(pad&PAD_TRIANGLE)
|
||||||
|
{
|
||||||
|
m_readyToExit=true;
|
||||||
|
CFader::setFadingOut();
|
||||||
|
GameState::setNextScene(&MapScene);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_flashSin=(m_flashSin+(_frames*shopflashspeed))&4095;
|
|
||||||
|
|
||||||
m_guiFrame->think(_frames);
|
m_guiFrame->think(_frames);
|
||||||
|
}
|
||||||
|
else if(m_state==SHOP_STATE__CONFIRM_PURCHASE)
|
||||||
|
{
|
||||||
|
m_guiConfirmPurchaseFrame->think(_frames);
|
||||||
|
if(m_queryAnswer==ANSWER_YES)
|
||||||
|
{
|
||||||
|
CGameSlotManager::getSlotData()->buyPartyItem(m_currentlySelectedItem);
|
||||||
|
CGameSlotManager::getSlotData()->useKelpTokens(s_shopItems[m_currentlySelectedItem].m_cost);
|
||||||
|
m_state=SHOP_STATE__SELECT_ITEM;
|
||||||
|
m_guiConfirmPurchaseFrame->unselect();
|
||||||
|
}
|
||||||
|
else if(m_queryAnswer==ANSWER_NO)
|
||||||
|
{
|
||||||
|
m_state=SHOP_STATE__SELECT_ITEM;
|
||||||
|
m_guiConfirmPurchaseFrame->unselect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(m_state==SHOP_STATE__CANNOT_AFFORD_ITEM)
|
||||||
|
{
|
||||||
|
m_guiCannotAffordFrame->think(_frames);
|
||||||
|
|
||||||
|
if(m_queryAnswer==ANSWER_OK)
|
||||||
|
{
|
||||||
|
m_state=SHOP_STATE__SELECT_ITEM;
|
||||||
|
m_guiCannotAffordFrame->unselect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
m_flashSin=(m_flashSin+(_frames*SHOP_ICON_FLASH_SPEED))&4095;
|
||||||
|
|
||||||
|
|
||||||
|
// Slide the main UI menu about..
|
||||||
|
if(m_state!=SHOP_STATE__SELECT_ITEM||m_readyToExit)
|
||||||
|
{
|
||||||
|
m_mainUiYOffset+=30*_frames;
|
||||||
|
if(m_mainUiYOffset>MAIN_UI_MAX_Y_OFFSET)
|
||||||
|
{
|
||||||
|
m_mainUiYOffset=MAIN_UI_MAX_Y_OFFSET;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_mainUiYOffset-=30*_frames;
|
||||||
|
if(m_mainUiYOffset<0)
|
||||||
|
{
|
||||||
|
m_mainUiYOffset=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -289,56 +425,50 @@ int CShopScene::readyToShutdown()
|
||||||
|
|
||||||
/*----------------------------------------------------------------------
|
/*----------------------------------------------------------------------
|
||||||
Function:
|
Function:
|
||||||
Purpose: Ugh...
|
Purpose: Ugh... I *really* hope this works ok with all languages, otherwise
|
||||||
|
it might just be easier to start again :/
|
||||||
Params:
|
Params:
|
||||||
Returns:
|
Returns:
|
||||||
---------------------------------------------------------------------- */
|
---------------------------------------------------------------------- */
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int
|
|
||||||
tokenx,tokeny,
|
|
||||||
itemx,itemy,
|
|
||||||
pricex,pricey,
|
|
||||||
boxx,boxy,boxw,boxh,
|
|
||||||
gaptoreadout,
|
|
||||||
instructionsy,
|
|
||||||
instructionsygap,
|
|
||||||
instructionsbuttonyoffset,
|
|
||||||
instructionsbuttonspace,
|
|
||||||
instructionsbuttongap,
|
|
||||||
xborder,
|
|
||||||
|
|
||||||
|
|
||||||
end;
|
|
||||||
} shopdata;
|
|
||||||
|
|
||||||
shopdata shop=
|
|
||||||
{
|
|
||||||
10,42, // tokenx,tokeny,
|
|
||||||
10,6, // itemx,itemy,
|
|
||||||
110,17, // pricex,pricey,
|
|
||||||
10,5,180,500, // boxx,boxy,boxw,boxh,
|
|
||||||
5, // gaptoreadout
|
|
||||||
7, // instructionsy,
|
|
||||||
16, // instructionsygap,
|
|
||||||
3, // instructionsbuttonyoffset,
|
|
||||||
10, // instructionsbuttonspace,
|
|
||||||
5, // instructionsbuttongap,
|
|
||||||
10, // xborder,
|
|
||||||
};
|
|
||||||
|
|
||||||
void CShopScene::renderUi()
|
void CShopScene::renderUi()
|
||||||
{
|
{
|
||||||
int xbase,ybase;
|
int xbase,ybase;
|
||||||
SpriteBank *sb;
|
SpriteBank *sb;
|
||||||
int w1,w2,w3,instructionsWidth,instructionsXBase;
|
int w1,w2,w3,instructionsWidth,instructionsXBase;
|
||||||
|
int maxInstructionsWidth;
|
||||||
sFrameHdr *fh1,*fh2;
|
sFrameHdr *fh1,*fh2;
|
||||||
int x,y;
|
int x,y;
|
||||||
char buf[100];
|
char buf[100];
|
||||||
|
|
||||||
|
|
||||||
xbase=fx;
|
m_font->setPrintArea(SHOP_QUERY_UI_X+10,SHOP_QUERY_UI_Y+5,SHOP_QUERY_UI_W-20,SHOP_QUERY_UI_H-10);
|
||||||
ybase=fy;
|
m_font->setJustification(FontBank::JUST_CENTRE);
|
||||||
|
if(m_state==SHOP_STATE__CONFIRM_PURCHASE)
|
||||||
|
{
|
||||||
|
int cost,available;
|
||||||
|
char buf[100];
|
||||||
|
cost=s_shopItems[m_currentlySelectedItem].m_cost;
|
||||||
|
available=CGameSlotManager::getSlotData()->getNumberOfKelpTokensHeld();
|
||||||
|
sprintf(buf,TranslationDatabase::getString(STR__SHOP_SCREEN__CONFIRM_PURCHASE),cost,available);
|
||||||
|
m_font->print((SHOP_QUERY_UI_W-20)/2,0,buf);
|
||||||
|
m_guiConfirmPurchaseFrame->render();
|
||||||
|
}
|
||||||
|
else if(m_state==SHOP_STATE__CANNOT_AFFORD_ITEM)
|
||||||
|
{
|
||||||
|
int cost,available;
|
||||||
|
char buf[100];
|
||||||
|
cost=s_shopItems[m_currentlySelectedItem].m_cost;
|
||||||
|
available=CGameSlotManager::getSlotData()->getNumberOfKelpTokensHeld();
|
||||||
|
sprintf(buf,TranslationDatabase::getString(STR__SHOP_SCREEN__CANNOT_AFFORD_PURCHASE),cost,available);
|
||||||
|
m_font->print((SHOP_QUERY_UI_W-20)/2,0,buf);
|
||||||
|
m_guiCannotAffordFrame->render();
|
||||||
|
}
|
||||||
|
m_font->setPrintArea(0,0,512,256);
|
||||||
|
|
||||||
|
|
||||||
|
m_guiFrame->setObjectXYWH(SHOP_MAIN_UI_X,SHOP_MAIN_UI_Y+m_mainUiYOffset,SHOP_MAIN_UI_W,SHOP_MAIN_UI_H);
|
||||||
|
xbase=SHOP_MAIN_UI_X;
|
||||||
|
ybase=SHOP_MAIN_UI_Y+m_mainUiYOffset;
|
||||||
sb=CGameScene::getSpriteBank();
|
sb=CGameScene::getSpriteBank();
|
||||||
|
|
||||||
// Instructions
|
// Instructions
|
||||||
|
@ -350,73 +480,72 @@ void CShopScene::renderUi()
|
||||||
instructionsWidth=w1;
|
instructionsWidth=w1;
|
||||||
if(w2>instructionsWidth)instructionsWidth=w2;
|
if(w2>instructionsWidth)instructionsWidth=w2;
|
||||||
if(w3>instructionsWidth)instructionsWidth=w3;
|
if(w3>instructionsWidth)instructionsWidth=w3;
|
||||||
instructionsXBase=fw-instructionsWidth-shop.xborder;
|
instructionsXBase=SHOP_MAIN_UI_W-instructionsWidth-SHOP_XBORDER;
|
||||||
|
|
||||||
x=xbase+instructionsXBase;
|
x=xbase+instructionsXBase;
|
||||||
y=ybase+shop.instructionsy;
|
y=ybase+SHOP_INSTRUCTIONS_Y_BASE;
|
||||||
m_font->print(x,y,STR__SHOP_SCREEN__LEFT_RIGHT_TO_SELECT_ITEM);
|
m_font->print(x,y,STR__SHOP_SCREEN__LEFT_RIGHT_TO_SELECT_ITEM);
|
||||||
fh1=sb->getFrameHeader(FRM__BUTL);
|
fh1=sb->getFrameHeader(FRM__BUTL);
|
||||||
fh2=sb->getFrameHeader(FRM__BUTR);
|
fh2=sb->getFrameHeader(FRM__BUTR);
|
||||||
x-=shop.instructionsbuttonspace+fh2->W;
|
x-=SHOP_SPACE_BETWEEN_INSTRUCTIONS_AND_BUTTONS+fh2->W;
|
||||||
y+=shop.instructionsbuttonyoffset;
|
y+=SHOP_Y_BUTTON_OFFSET_FORM_TOP_OF_TEXT;
|
||||||
sb->printFT4(fh2,x,y,0,0,0);
|
sb->printFT4(fh2,x,y,0,0,5);
|
||||||
x-=shop.instructionsbuttongap+fh1->W;
|
x-=SHOP_GAP_BETWEEN_INSTRUCTION_BUTTONS+fh1->W;
|
||||||
sb->printFT4(fh1,x,y,0,0,0);
|
sb->printFT4(fh1,x,y,0,0,5);
|
||||||
int maxInstructionsWidth=xbase+fy-x;
|
maxInstructionsWidth=xbase+SHOP_MAIN_UI_Y-x;
|
||||||
|
|
||||||
x=xbase+instructionsXBase;
|
x=xbase+instructionsXBase;
|
||||||
y=ybase+shop.instructionsy+shop.instructionsygap;
|
y=ybase+SHOP_INSTRUCTIONS_Y_BASE+SHOP_Y_GAP_BETWEEN_INSTRUCTION_LINES;
|
||||||
m_font->print(x,y,STR__SHOP_SCREEN__CROSS_TO_PURCHASE);
|
m_font->print(x,y,STR__SHOP_SCREEN__CROSS_TO_PURCHASE);
|
||||||
fh1=sb->getFrameHeader(FRM__BUTX);
|
fh1=sb->getFrameHeader(FRM__BUTX);
|
||||||
x-=shop.instructionsbuttonspace+fh2->W;
|
x-=SHOP_SPACE_BETWEEN_INSTRUCTIONS_AND_BUTTONS+fh2->W;
|
||||||
y+=shop.instructionsbuttonyoffset;
|
y+=SHOP_Y_BUTTON_OFFSET_FORM_TOP_OF_TEXT;
|
||||||
sb->printFT4(fh1,x-1,y,0,0,0);
|
sb->printFT4(fh1,x-1,y,0,0,5);
|
||||||
|
|
||||||
x=xbase+instructionsXBase;
|
x=xbase+instructionsXBase;
|
||||||
y=ybase+shop.instructionsy+(shop.instructionsygap*2);
|
y=ybase+SHOP_INSTRUCTIONS_Y_BASE+(SHOP_Y_GAP_BETWEEN_INSTRUCTION_LINES*2);
|
||||||
m_font->print(x,y,STR__SHOP_SCREEN__TRIANGLE_TO_EXIT);
|
m_font->print(x,y,STR__SHOP_SCREEN__TRIANGLE_TO_EXIT);
|
||||||
fh1=sb->getFrameHeader(FRM__BUTT);
|
fh1=sb->getFrameHeader(FRM__BUTT);
|
||||||
x-=shop.instructionsbuttonspace+fh2->W;
|
x-=SHOP_SPACE_BETWEEN_INSTRUCTIONS_AND_BUTTONS+fh2->W;
|
||||||
y+=shop.instructionsbuttonyoffset;
|
y+=SHOP_Y_BUTTON_OFFSET_FORM_TOP_OF_TEXT;
|
||||||
sb->printFT4(fh1,x-1,y,0,0,0);
|
sb->printFT4(fh1,x-1,y,0,0,5);
|
||||||
|
|
||||||
|
|
||||||
// Item price
|
// Item price
|
||||||
int x1,x2;
|
int x1,x2;
|
||||||
x1=shop.xborder;
|
x1=SHOP_XBORDER;
|
||||||
x2=fy-maxInstructionsWidth-(shop.xborder*1);
|
x2=SHOP_MAIN_UI_Y-maxInstructionsWidth-(SHOP_XBORDER*1);
|
||||||
m_font->setJustification(FontBank::JUST_CENTRE);
|
m_font->setJustification(FontBank::JUST_CENTRE);
|
||||||
if(isItemAvailableToBuy(m_currentlySelectedItem))
|
if(isItemAvailableToBuy(m_currentlySelectedItem))
|
||||||
{
|
{
|
||||||
SHOPITEM *shopItem;
|
SHOPITEM *shopItem;
|
||||||
shopItem=&s_shopItems[m_currentlySelectedItem];
|
shopItem=&s_shopItems[m_currentlySelectedItem];
|
||||||
fh1=m_spriteBank->getFrameHeader(shopItem->m_frame);
|
fh1=m_spriteBank->getFrameHeader(shopItem->m_frame);
|
||||||
x=xbase+shop.itemx;
|
x=xbase+SHOP_ITEM_X_POS;
|
||||||
y=ybase+shop.itemy;
|
y=ybase+SHOP_ITEM_Y_POS;
|
||||||
sb->printFT4(fh1,x,y,0,0,0);
|
sb->printFT4(fh1,x,y,0,0,5);
|
||||||
|
|
||||||
x1+=32;
|
x1+=32;
|
||||||
|
|
||||||
m_font->setPrintArea(xbase+x1,ybase,x2-x1,100);
|
m_font->setPrintArea(xbase+x1,ybase,x2-x1,100);
|
||||||
m_font->print((x2-x1)/2,3,STR__SHOP_SCREEN__PRICE);
|
m_font->print((x2-x1)/2,SHOP_PRICE_Y_GAP_FROM_TOP,STR__SHOP_SCREEN__PRICE);
|
||||||
|
|
||||||
sprintf(buf,"%d",shopItem->m_cost);
|
sprintf(buf,"%d",shopItem->m_cost);
|
||||||
m_font->print((x2-x1)/2,5+m_font->getStringHeight(STR__SHOP_SCREEN__PRICE),buf);
|
m_font->print((x2-x1)/2,SHOP_PRICE_Y_GAP_FROM_TOP+m_font->getStringHeight(STR__SHOP_SCREEN__PRICE),buf);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_font->setPrintArea(xbase+x1,ybase,x2-x1,100);
|
m_font->setPrintArea(xbase+x1,ybase,x2-x1,100);
|
||||||
m_font->print((x2-x1)/2,3,STR__SHOP_SCREEN__ITEM_ALREADY_PURCHASED);
|
m_font->print((x2-x1)/2,SHOP_PRICE_Y_GAP_FROM_TOP,STR__SHOP_SCREEN__ITEM_ALREADY_PURCHASED);
|
||||||
}
|
}
|
||||||
m_font->setPrintArea(0,0,512,256);
|
m_font->setPrintArea(0,0,512,256);
|
||||||
|
|
||||||
// Available token count
|
// Available token count
|
||||||
x=xbase+shop.tokenx;
|
x=xbase+SHOP_TOKEN_COUNT_X_POS;
|
||||||
y=ybase+shop.tokeny;
|
y=ybase+SHOP_TOKEN_COUNT_Y_POS;
|
||||||
fh1=m_spriteBank->getFrameHeader(FRM_SMALLTOKEN);
|
fh1=m_spriteBank->getFrameHeader(FRM_SMALLTOKEN);
|
||||||
m_spriteBank->printFT4(fh1,x,y,0,0,0);
|
m_spriteBank->printFT4(fh1,x,y,0,0,5);
|
||||||
x+=fh1->W;
|
x+=fh1->W;
|
||||||
sprintf(buf,"x%d",99);
|
sprintf(buf,"x%d",CGameSlotManager::getSlotData()->getNumberOfKelpTokensHeld());
|
||||||
m_font->setJustification(FontBank::JUST_LEFT);
|
m_font->setJustification(FontBank::JUST_LEFT);
|
||||||
m_font->print(x,y,buf);
|
m_font->print(x,y,buf);
|
||||||
|
|
||||||
|
@ -432,7 +561,29 @@ int maxInstructionsWidth=xbase+fy-x;
|
||||||
---------------------------------------------------------------------- */
|
---------------------------------------------------------------------- */
|
||||||
int CShopScene::isItemAvailableToBuy(int _itemNumber)
|
int CShopScene::isItemAvailableToBuy(int _itemNumber)
|
||||||
{
|
{
|
||||||
return _itemNumber!=3;
|
return !CGameSlotManager::getSlotData()->isPartyItemHeld(_itemNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------
|
||||||
|
Function:
|
||||||
|
Purpose:
|
||||||
|
Params:
|
||||||
|
Returns:
|
||||||
|
---------------------------------------------------------------------- */
|
||||||
|
void CShopScene::playSound(int _sfxId)
|
||||||
|
{
|
||||||
|
if(s_playId!=NOT_PLAYING)
|
||||||
|
{
|
||||||
|
CSoundMediator::stopAndUnlockSfx(s_playId);
|
||||||
|
}
|
||||||
|
s_playId=CSoundMediator::playSfx((CSoundMediator::SFXID)_sfxId,true);
|
||||||
|
/*
|
||||||
|
if(s_playId)
|
||||||
|
{
|
||||||
|
PAUL_DBGMSG("Didn't play..!?");
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,13 +44,6 @@ public:
|
||||||
int readyToShutdown();
|
int readyToShutdown();
|
||||||
char *getSceneName() {return"Shop";}
|
char *getSceneName() {return"Shop";}
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
void renderUi();
|
|
||||||
|
|
||||||
int isItemAvailableToBut(int _itemNumber);
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
SHOPITEM_BLOWER,
|
SHOPITEM_BLOWER,
|
||||||
|
@ -63,6 +56,62 @@ private:
|
||||||
SHOPITEM_TEDDY,
|
SHOPITEM_TEDDY,
|
||||||
NUM_SHOP_ITEM_IDS
|
NUM_SHOP_ITEM_IDS
|
||||||
} SHOPITEM_ID;
|
} SHOPITEM_ID;
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
void renderUi();
|
||||||
|
|
||||||
|
int isItemAvailableToBuy(int _itemNumber);
|
||||||
|
void playSound(int _sfxId);
|
||||||
|
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
// Icon stuff
|
||||||
|
SHOP_ICON_XBASE=180,
|
||||||
|
SHOP_ICON_YBASE=38,
|
||||||
|
SHOP_ICON_WIDTH=512-(SHOP_ICON_XBASE*2),
|
||||||
|
SHOP_ICON_Y_GAP=51,
|
||||||
|
SHOP_ICON_ITEMS_PER_ROW=4,
|
||||||
|
|
||||||
|
SHOP_ICON_FLASH_SPEED=200,
|
||||||
|
SHOP_ICON_FLASH_COLOUR_BASE=128,
|
||||||
|
SHOP_ICON_FLASH_COLOUR_RANGE=150,
|
||||||
|
|
||||||
|
SHOP_ICON_PURCHASED_RGB=40,
|
||||||
|
|
||||||
|
|
||||||
|
// UI stuff
|
||||||
|
SHOP_MAIN_UI_X=48,
|
||||||
|
SHOP_MAIN_UI_Y=155,
|
||||||
|
SHOP_MAIN_UI_W=416,
|
||||||
|
SHOP_MAIN_UI_H=64,
|
||||||
|
|
||||||
|
SHOP_XBORDER=10,
|
||||||
|
|
||||||
|
SHOP_GAP_BETWEEN_INSTRUCTION_BUTTONS=5,
|
||||||
|
SHOP_SPACE_BETWEEN_INSTRUCTIONS_AND_BUTTONS=10,
|
||||||
|
SHOP_Y_BUTTON_OFFSET_FORM_TOP_OF_TEXT=3,
|
||||||
|
SHOP_INSTRUCTIONS_Y_BASE=7,
|
||||||
|
SHOP_Y_GAP_BETWEEN_INSTRUCTION_LINES=16,
|
||||||
|
|
||||||
|
SHOP_PRICE_Y_GAP_FROM_TOP=5,
|
||||||
|
|
||||||
|
SHOP_ITEM_X_POS=10,
|
||||||
|
SHOP_ITEM_Y_POS=6,
|
||||||
|
|
||||||
|
SHOP_TOKEN_COUNT_X_POS=10,
|
||||||
|
SHOP_TOKEN_COUNT_Y_POS=42,
|
||||||
|
|
||||||
|
|
||||||
|
// Overlay UI for confirmation
|
||||||
|
SHOP_QUERY_UI_X=80,
|
||||||
|
SHOP_QUERY_UI_Y=50,
|
||||||
|
SHOP_QUERY_UI_W=352,
|
||||||
|
SHOP_QUERY_UI_H=128,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int m_cost;
|
int m_cost;
|
||||||
|
@ -71,17 +120,42 @@ private:
|
||||||
static SHOPITEM s_shopItems[NUM_SHOP_ITEM_IDS];
|
static SHOPITEM s_shopItems[NUM_SHOP_ITEM_IDS];
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SHOP_STATE__FADING_IN,
|
||||||
|
SHOP_STATE__SELECT_ITEM,
|
||||||
|
SHOP_STATE__CONFIRM_PURCHASE,
|
||||||
|
SHOP_STATE__CANNOT_AFFORD_ITEM,
|
||||||
|
} SHOP_STATE;
|
||||||
|
SHOP_STATE m_state;
|
||||||
|
|
||||||
class ScalableFontBank *m_font;
|
class ScalableFontBank *m_font;
|
||||||
class SpriteBank *m_spriteBank;
|
class SpriteBank *m_spriteBank;
|
||||||
int m_readyToExit;
|
int m_readyToExit;
|
||||||
unsigned char *m_image;
|
unsigned char *m_image;
|
||||||
|
|
||||||
class CGUIGroupFrame *m_guiFrame;
|
class CGUIGroupFrame *m_guiFrame;
|
||||||
|
class CGUIControlFrame *m_guiConfirmPurchaseFrame;
|
||||||
|
class CGUIControlFrame *m_guiCannotAffordFrame;
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
ANSWER_NONE=0,
|
||||||
|
ANSWER_OK=1,
|
||||||
|
ANSWER_YES=1,
|
||||||
|
ANSWER_NO,
|
||||||
|
};
|
||||||
|
int m_queryAnswer;
|
||||||
|
|
||||||
int m_currentlySelectedItem;
|
int m_currentlySelectedItem;
|
||||||
int m_flashSin;
|
int m_flashSin;
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
MAIN_UI_MAX_Y_OFFSET=120,
|
||||||
|
};
|
||||||
|
int m_mainUiYOffset;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue