This commit is contained in:
Paul 2001-06-06 02:11:50 +00:00
parent 2dc3efd0d7
commit 992756d1b0
5 changed files with 393 additions and 125 deletions

View file

@ -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;
}
} }

View file

@ -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();

View file

@ -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);

View file

@ -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..!?");
}
*/
} }

View file

@ -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;
}; };