Jeck - Added full filtering system to deck editor and shop. I've spent 24hours on pure debugging, but there are likely a couple bugs I've missed. So please, if you find something, make an issue of it! :P Also split OptionItem classes into separate files, and added support for mixed-set boosters (which I think are way, way cool).

This commit is contained in:
wagic.jeck
2010-02-08 01:03:07 +00:00
parent 64d592f588
commit 83e2b04547
31 changed files with 4125 additions and 2742 deletions

View File

@@ -8,35 +8,100 @@
#include "../include/MTGDeck.h"
#include "../include/Translate.h"
#include "../include/GameOptions.h"
#include <hge/hgedistort.h>
float GameStateShop::_x1[] = { 79, 19, 27,103,154,187,102,144,198,133,183};
float GameStateShop::_y1[] = {150,194,222,167,164,156,195,190,175,220,220};
float GameStateShop::_x2[] = {103, 48, 74,135,183,215,138,181,231,171,225};
float GameStateShop::_y2[] = {155,179,218,165,166,155,195,186,177,225,216};
float GameStateShop::_x3[] = { 48, 61, 9, 96,139,190, 81,146,187, 97,191};
float GameStateShop::_y3[] = {164,205,257,184,180,170,219,212,195,251,252};
float GameStateShop::_x4[] = { 76, 90, 65,131,171,221,123,187,225,141,237};
float GameStateShop::_y4[] = {169,188,250,182,182,168,220,208,198,259,245};
int GameStateShop::randomKey = 0;
GameStateShop::GameStateShop(GameApp* parent): GameState(parent) {
shop = NULL;
menu = NULL;
for(int i=0;i<8;i++)
altThumb[i] = NULL;
mBack = NULL;
boosterDisplay = NULL;
mBg = NULL;
mBgTex = NULL;
taskList = NULL;
menu = NULL;
srcCards = NULL;
shopMenu = NULL;
bigDisplay = NULL;
myCollection = NULL;
pricelist = NULL;
playerdata = NULL;
booster = NULL;
lightAlpha = 0;
filterMenu = NULL;
alphaChange = 0;
for(int i=0;i<SHOP_ITEMS;i++){
mPrices[i] = 0;
mCounts[i] = 0;
}
mTouched = false;
if(randomKey == 0)
randomKey = rand();
}
GameStateShop::~GameStateShop() {
End();
End();
}
void GameStateShop::Create(){
}
void GameStateShop::Start()
{
void GameStateShop::Start(){
menu = NULL;
bListCards = false;
mTouched = false;
mStage = STAGE_FADE_IN;
mElapsed = 0;
booster = NULL;
srcCards = NEW WSrcUnlockedCards(.25);
srcCards->setElapsed(15);
WCFilterFactory * wff = WCFilterFactory::GetInstance();
//srcCards->addFilter(wff->Construct("c:red;&t:instant;"));
//srcCards->bakeFilters();
bigSync = 0;
shopMenu = NEW WGuiMenu(PSP_CTRL_DOWN,PSP_CTRL_UP,true,&bigSync);
MTGAllCards * ac = GameApp::collection;
playerdata = NEW PlayerData(ac);;
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), ac));
pricelist = NEW PriceList(RESPATH"/settings/prices.dat",ac);
for(int i=0;i<SHOP_SLOTS;i++){
WGuiCardDistort * dist;
if(i < BOOSTER_SLOTS)
dist = NEW WGuiCardDistort(NULL,true);
else{
dist = NEW WGuiCardDistort(srcCards,true);
dist->mOffset.setOffset(i-BOOSTER_SLOTS);
}
dist->xy = WDistort(_x1[i],_y1[i],_x2[i],_y2[i],_x3[i],_y3[i],_x4[i],_y4[i]);
shopMenu->Add(NEW WGuiButton(dist,-102,i,this));
}
shopMenu->Entering(0);
if(!bigDisplay){
bigDisplay = NEW WGuiCardImage(srcCards);
bigDisplay->mOffset.Hook(&bigSync);
bigDisplay->mOffset.setOffset(-BOOSTER_SLOTS);
bigDisplay->setX(385);
bigDisplay->setY(135);
}
//alternateRender doesn't lock, so lock our thumbnails for hgeDistort.
altThumb[0] = resources.RetrieveTexture("artifact_thumb.jpg", RETRIEVE_LOCK);
altThumb[1] = resources.RetrieveTexture("green_thumb.jpg", RETRIEVE_LOCK);
@@ -47,6 +112,7 @@ void GameStateShop::Start()
altThumb[6] = resources.RetrieveTexture("land_thumb.jpg", RETRIEVE_LOCK);
altThumb[7] = resources.RetrieveTexture("gold_thumb.jpg", RETRIEVE_LOCK);
mBack = resources.GetQuad("back");
resources.Unmiss("shop.jpg"); //Last resort.
mBgTex = resources.RetrieveTexture("shop.jpg", RETRIEVE_LOCK, TEXTURE_SUB_5551);
@@ -57,109 +123,294 @@ void GameStateShop::Start()
JRenderer::GetInstance()->EnableVSync(true);
shop = NULL;
taskList = NULL;
load();
}
string GameStateShop::descPurchase(int controlId, bool tiny){
char buffer[4096];
string name;
if(controlId < BOOSTER_SLOTS){
if(mBooster[controlId].altSet == mBooster[controlId].mainSet)
mBooster[controlId].altSet = 0;
if(mBooster[controlId].altSet)
sprintf(buffer,_("%s & %s Booster (15 Cards)").c_str(),mBooster[controlId].mainSet->id.c_str(),mBooster[controlId].altSet->id.c_str());
else
sprintf(buffer,_("%s Booster (15 Cards)").c_str(),mBooster[controlId].mainSet->id.c_str());
name = buffer;
}
else{
MTGCard * c = srcCards->getCard(controlId-BOOSTER_SLOTS);
if(!c)
return "";
name = c->data->getName();
}
if(mInventory[controlId] <= 0){
if(tiny)
sprintf(buffer,_("SOLD OUT").c_str(),name.c_str());
else
sprintf(buffer,_("%s : SOLD OUT").c_str(),name.c_str());
return buffer;
}
if(tiny)
return name;
if(mCounts[controlId] < 1)
sprintf(buffer,_("%s : %i credits").c_str(),name.c_str(),mPrices[controlId]);
else
sprintf(buffer,_("%s (%i) : %i credits").c_str(),name.c_str(),mCounts[controlId],mPrices[controlId]);
return buffer;
}
void GameStateShop::assembleBooster(int controlId){
int mSet = -1;
MTGSetInfo * si = setlist.randomSet(-1);
mBooster[controlId].mainSet = si;
mBooster[controlId].altSet = NULL;
int mSetCount = si->counts[MTGSetInfo::TOTAL_CARDS];
if(mSetCount < 80){
if(rand() % 100 < 50){ //50% Chance of picking a pure pack instead. Combo packs are more rare :)
si = setlist.randomSet(-1,80);
mSetCount = si->counts[MTGSetInfo::TOTAL_CARDS];
mBooster[controlId].mainSet = si;
}else
mBooster[controlId].altSet = setlist.randomSet(si->block,mSetCount);
}
else {
mBooster[controlId].altSet = NULL;
if(rand() % 100 < 10) //10% chance of having a mixed booster anyways.
mBooster[controlId].altSet = setlist.randomSet(si->block);
}
for(int attempts=0;attempts<10;attempts++){
if(mBooster[controlId].altSet != mBooster[controlId].mainSet)
break;
mBooster[controlId].altSet = setlist.randomSet(-1,mSetCount);
}
int price = mBooster[controlId].mainSet->boosterCost();
mInventory[controlId] = 2+rand()%4;
if(mBooster[controlId].altSet != NULL){
price += mBooster[controlId].altSet->boosterCost();
price /= 2;
price = price + .05 * price; //Mixed sets add a 5% premium.
mInventory[controlId] = 1+rand()%2;
}
mPrices[controlId] = price;
}
void GameStateShop::beginPurchase(int controlId){
JLBFont * mFont = resources.GetJLBFont(Constants::MENU_FONT);
mFont->SetScale(DEFAULT_MENU_FONT_SCALE);
SAFE_DELETE(menu);
if(mInventory[controlId] <= 0){
menu = NEW SimpleMenu(-145,this,Constants::MENU_FONT,SCREEN_WIDTH-300,SCREEN_HEIGHT/2,_("Sold Out").c_str());
menu->Add(-1,"Ok");
}
else if(playerdata->credits - mPrices[controlId] < 0){
menu = NEW SimpleMenu(-145,this,Constants::MENU_FONT,SCREEN_WIDTH-300,SCREEN_HEIGHT/2,_("Not enough credits").c_str());
menu->Add(-1,"Ok");
if(options[Options::CHEATMODE].number) {
menu->Add(-2,"Steal it");
}
}
else{
string s;
if(controlId < BOOSTER_SLOTS)
s = _("Purchase Booster");
else
s = _("Purchase Card");
menu = NEW SimpleMenu(-145,this,Constants::MENU_FONT,SCREEN_WIDTH-300,SCREEN_HEIGHT/2,s.c_str());
menu->Add(controlId,"Yes");
menu->Add(-1,"No");
}
}
void GameStateShop::purchaseCard(int controlId){
MTGCard * c = srcCards->getCard(controlId-BOOSTER_SLOTS);
if(!c || !c->data || playerdata->credits - mPrices[controlId] < 0)
return;
playerdata->collection->add(c);
myCollection->Add(c);
playerdata->credits -= mPrices[controlId];
mCounts[controlId]++;
mInventory[controlId]--;
mTouched = true;
menu->Close();
}
void GameStateShop::purchaseBooster(int controlId){
if(playerdata->credits - mPrices[controlId] < 0)
return;
playerdata->credits -= mPrices[controlId];
mInventory[controlId]--;
WSrcCards * pool = NEW WSrcCards();
WCFilterSet *main, *alt;
int num = setlist.getSetNum(mBooster[controlId].mainSet);
main = NEW WCFilterSet(num);
if(mBooster[controlId].altSet){
num = setlist.getSetNum(mBooster[controlId].altSet);
alt = NEW WCFilterSet(num);
pool->addFilter(NEW WCFilterOR(main,alt));
}else
pool->addFilter(main);
pool->loadMatches(srcCards,true);
pool->Shuffle();
SAFE_DELETE(booster);
booster = NEW MTGDeck(mParent->collection);
//Add cards to booster. Pool is shuffled, so just step through.
int carryover = 1;
if(!(rand() % 8)){
pool->addFilter(NEW WCFilterRarity(Constants::RARITY_M));
carryover = pool->addToDeck(booster,carryover);
}
pool->clearFilters();
pool->addFilter(NEW WCFilterRarity(Constants::RARITY_R));
carryover = pool->addToDeck(booster,carryover);
pool->clearFilters();
pool->addFilter(NEW WCFilterRarity(Constants::RARITY_U));
carryover = pool->addToDeck(booster,carryover+3);
pool->clearFilters();
pool->addFilter(NEW WCFilterRarity(Constants::RARITY_C));
carryover = pool->addToDeck(booster,carryover+11);
myCollection->Add(booster);
makeDisplay(booster);
save(true);
SAFE_DELETE(pool);
menu->Close();
}
int GameStateShop::purchasePrice(int offset){
MTGCard * c = NULL;
if(!pricelist || !srcCards || (c = srcCards->getCard(offset)) == NULL)
return 0;
int rnd = abs(c->getMTGId() + randomKey) % 20;
float price = (float) pricelist->getPrice(c->getMTGId());
price = price + price * (rnd -10)/100;
return (int) (price + price * srcCards->filterFee());
}
void GameStateShop::load(){
if (shop) shop->saveAll();
SAFE_DELETE(shop);
int sets[500];
int boosterSets[500];
int unlocked[500];
int nbsets = 0;
int nbboostersets = 0;
//Figure out which sets are available.
for (int i = 0; i < setlist.size(); i++){
unlocked[i] = options[Options::optionSet(i)].number;
}
for (int i = 0; i < setlist.size(); i++){
if (unlocked[i]){
sets[nbsets] = i;
nbsets++;
if (mParent->collection->countBySet(i) > 80){ //Only sets with more than 80 cards can get boosters and starters
boosterSets[nbboostersets] = i;
nbboostersets++;
}
}
}
if (nbboostersets){
for (int i = 0; i < SHOP_BOOSTERS; i++){
setIds[i] = boosterSets[(rand() % nbboostersets)];
}
}else{
for (int i = 0; i < SHOP_BOOSTERS; i++){
setIds[i] = (rand() % setlist.size());
}
}
JQuad * mBackThumb = resources.GetQuad("back_thumb");
shop = NEW ShopItems(10, this, resources.GetJLBFont(Constants::MAIN_FONT), 10, 0, mParent->collection, setIds);
MTGSetInfo * si = NULL;
for (int i = 0; i < SHOP_BOOSTERS; i++){
si = setlist.getInfo(setIds[i]);
if(!si)
for(int i=0;i<BOOSTER_SLOTS;i++)
assembleBooster(i);
for(int i=BOOSTER_SLOTS;i<SHOP_ITEMS;i++){
MTGCard * c = NULL;
if((c = srcCards->getCard(i-BOOSTER_SLOTS)) == NULL){
mPrices[i] = 0;
mCounts[i] = 0;
mInventory[i] = 0;
continue;
sprintf(setNames[i], "%s %s (%i %s)", si->id.c_str(), _("Booster").c_str(), si->boosterSize(), _("Cards").c_str());
shop->Add(setNames[i],mBack,mBackThumb, si->boosterCost());
}
MTGDeck * tempDeck = NEW MTGDeck(mParent->collection);
tempDeck->addRandomCards(8,sets,nbsets);
for (map<int,int>::iterator it = tempDeck->cards.begin(); it!=tempDeck->cards.end(); it++){
for (int j = 0; j < it->second; j++){
shop->Add(it->first);
}
}
delete tempDeck;
}
mPrices[i] = purchasePrice(i);
mCounts[i] = myCollection->countByName(c);
switch(c->getRarity()){
case Constants::RARITY_C:
mInventory[i] = 2 + rand() % 8;
break;
case Constants::RARITY_L:
mInventory[i] = 100;
break;
case Constants::RARITY_U:
mInventory[i] = 1 + rand() % 5;
break;
case Constants::RARITY_R:
mInventory[i] = 1 + rand() % 2;
break;
}
}
}
void GameStateShop::save(bool force)
{
if(mTouched || force){
if(pricelist)
pricelist->save();
if(playerdata)
playerdata->save();
}
mTouched = false;
}
void GameStateShop::End()
{
save();
JRenderer::GetInstance()->EnableVSync(false);
resources.Release(mBgTex);
mBgTex = NULL;
mBg = NULL;
mElapsed = 0;
SAFE_DELETE(shopMenu);
SAFE_DELETE(bigDisplay);
SAFE_DELETE(srcCards);
SAFE_DELETE(playerdata);
SAFE_DELETE(pricelist);
SAFE_DELETE(myCollection);
SAFE_DELETE(booster);
SAFE_DELETE(filterMenu);
deleteDisplay();
//Release alternate thumbnails.
for(int i=0;i<8;i++){
resources.Release(altThumb[i]);
altThumb[i] = NULL;
}
SAFE_DELETE(shop);
SAFE_DELETE(menu);
SAFE_DELETE(taskList);
}
void GameStateShop::Destroy(){
}
void GameStateShop::beginFilters(){
if(!filterMenu){
filterMenu = NEW WGuiFilters("Ask about...",srcCards);
filterMenu->setY(2);
filterMenu->setHeight(SCREEN_HEIGHT-2);
}
mStage = STAGE_ASK_ABOUT;
filterMenu->Entering(0);
}
void GameStateShop::Update(float dt)
{
{
if(menu && menu->closed)
SAFE_DELETE(menu);
srcCards->Update(dt);
alphaChange = (500 - (rand() % 1000)) * dt;
lightAlpha+= alphaChange;
if (lightAlpha < 0) lightAlpha = 0;
if (lightAlpha > 50) lightAlpha = 50;
// mParent->effect->UpdateSmall(dt);
// mParent->effect->UpdateBig(dt);
if(mStage != STAGE_FADE_IN)
mElapsed += dt;
u32 btn;
if (menu){
menu->Update(dt);
if (menu->closed) SAFE_DELETE(menu);
}
switch(mStage){
case STAGE_SHOP_MENU:
if (!menu){
if (menu){
menu->Update(dt);
}else{
menu = NEW SimpleMenu(11,this,Constants::MENU_FONT,SCREEN_WIDTH/2-100,20);
menu->Add(22,"Ask about...");
menu->Add(14,"Check task board");
if(options[Options::CHEATMODE].number)
menu->Add(-2,"Steal 1,000 credits");
menu->Add(12,"Save & Back to Main Menu");
menu->Add(14,"See available tasks");
menu->Add(13, "Cancel");
}
break;
case STAGE_SHOP_TASKS:
if(menu){
menu->Update(dt);
return;
}
if(taskList){
@@ -173,7 +424,7 @@ void GameStateShop::Update(float dt)
if(!menu){
menu = NEW SimpleMenu(11,this,Constants::MENU_FONT,SCREEN_WIDTH/2-100,20);
menu->Add(12,"Save & Back to Main Menu");
menu->Add(15,"Close tasks");
menu->Add(15,"Return to shop");
menu->Add(13, "Cancel");
}
}
@@ -193,18 +444,67 @@ void GameStateShop::Update(float dt)
}
#endif
break;
case STAGE_ASK_ABOUT:
btn = mEngine->ReadButton();
if(menu && !menu->closed){
menu->CheckUserInput(btn);
menu->Update(dt);
return;
}
if(filterMenu){
if(btn == PSP_CTRL_SELECT){
filterMenu->Finish();
filterMenu->Update(dt);
return;
}
if(filterMenu->isFinished()){
load();
mStage = STAGE_SHOP_SHOP;
}else{
filterMenu->CheckUserInput(btn);
filterMenu->Update(dt);
}
return;
}
break;
case STAGE_SHOP_SHOP:
btn = mEngine->ReadButton();
if(menu && !menu->closed){
menu->CheckUserInput(btn);
menu->Update(dt);
return;
}
if (btn == PSP_CTRL_START){
if(boosterDisplay){
deleteDisplay();
return;
}
mStage = STAGE_SHOP_MENU;
return;
}else if(btn == PSP_CTRL_SELECT){
beginFilters();
}else if(btn == PSP_CTRL_SQUARE){
load();
}
if (shop){
shop->CheckUserInput(btn);
shop->Update(dt);
srcCards->Shuffle();
load();
}else if(btn == PSP_CTRL_TRIANGLE){
options[Options::DISABLECARDS].number = !options[Options::DISABLECARDS].number;
}else if (boosterDisplay){
if(btn == PSP_CTRL_CROSS)
deleteDisplay();
else {
boosterDisplay->CheckUserInput(btn);
boosterDisplay->Update(dt);}
return;
}else if(btn == PSP_CTRL_CROSS){
bListCards = !bListCards;
}else if(shopMenu){
if(shopMenu->CheckUserInput(btn))
srcCards->Touch();
}
if(shopMenu)
shopMenu->Update(dt);
break;
case STAGE_FADE_IN:
mParent->DoAnimation(TRANSITION_FADE_IN);
@@ -213,57 +513,156 @@ void GameStateShop::Update(float dt)
}
}
void GameStateShop::makeDisplay(MTGDeck * d){
deleteDisplay();
boosterDisplay = NEW CardDisplay(12,NULL, SCREEN_WIDTH - 200, SCREEN_HEIGHT/2,this,NULL,5);
map<int,int>::iterator it;
for (it = d->cards.begin(); it!=d->cards.end(); it++){
MTGCard * c = d->getCardById(it->first);
MTGCardInstance * ci = NEW MTGCardInstance(c, NULL);
boosterDisplay->AddCard(ci);
subBooster.push_back(ci);
}
}
void GameStateShop::deleteDisplay(){
vector<MTGCardInstance*>::iterator i;
for(i=subBooster.begin();i!=subBooster.end();i++){
if(!*i) continue;
delete *i;
}
subBooster.clear();
SAFE_DELETE(boosterDisplay);
}
void GameStateShop::Render()
{
//Erase
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
JRenderer * r = JRenderer::GetInstance();
r->ClearScreen(ARGB(0,0,0,0));
if(mStage == STAGE_FADE_IN)
return;
if (mBg) r->RenderQuad(mBg,0,0);
if (mBg)
r->RenderQuad(mBg,0,0);
JQuad * quad = resources.RetrieveTempQuad("shop_light.jpg",TEXTURE_SUB_5551);
if (quad){
r->EnableTextureFilter(false);
r->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE);
quad->SetColor(ARGB(lightAlpha,255,255,255));
r->RenderQuad(quad,0,0);
r->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA);
r->EnableTextureFilter(true);
}
if(shopMenu)
shopMenu->Render();
if(filterMenu && !filterMenu->isFinished())
filterMenu->Render();
else{
if(boosterDisplay)
boosterDisplay->Render();
else if(bigDisplay){
if(bigDisplay->mOffset.getPos() >= 0)
bigDisplay->setSource(srcCards);
else
bigDisplay->setSource(NULL);
bigDisplay->Render();
float elp = srcCards->getElapsed();
//Render the card list overlay.
if( bListCards || elp > LIST_FADEIN){
char alpha = 200;
if(!bListCards && elp < LIST_FADEIN+.25){
alpha = 800 *(elp-LIST_FADEIN);
}
r->FillRoundRect(300,10, 160, SHOP_SLOTS * 20 + 15,5,ARGB(alpha,0,0,0));
alpha+=55;
for(int i=0;i<SHOP_SLOTS;i++){
if (i == shopMenu->getSelected())
mFont->SetColor(ARGB(alpha,255,255,0));
else
mFont->SetColor(ARGB(alpha,255,255,255));
char buffer[512];
string s = descPurchase(i,true);
sprintf(buffer, "%s", s.c_str());
float x = 310;
float y = 25 + 20*i;
mFont->DrawString(buffer,x,y);
}
}
}
}
//Render the info bar
r->FillRect(0,SCREEN_HEIGHT-17,SCREEN_WIDTH,17,ARGB(128,0,0,0));
char c[512];
sprintf(c,_("credits: %i").c_str(), playerdata->credits);
mFont->SetColor(ARGB(255,255,255,255));
mFont->DrawString(c, 5, SCREEN_HEIGHT - 12);
sprintf(c, "%s", _("[]:other cards").c_str());
unsigned int len = 4 + mFont->GetStringWidth(c);
mFont->DrawString(c,SCREEN_WIDTH-len,SCREEN_HEIGHT-14);
mFont->SetColor(ARGB(255,255,255,0));
mFont->DrawString(descPurchase(bigSync.getPos()).c_str(), SCREEN_WIDTH/2, SCREEN_HEIGHT - 14,JGETEXT_CENTER);
mFont->SetColor(ARGB(255,255,255,255));
if (shop)
shop->Render();
if (mStage == STAGE_SHOP_TASKS && taskList) {
taskList->Render();
}
if (menu){
if (menu)
menu->Render();
}
}
void GameStateShop::ButtonPressed(int controllerId, int controlId)
{
if (controllerId == 10){
if (shop)
shop->pricedialog(controlId);
int sel = bigSync.getOffset();
switch(controllerId){
case -102: //Buying something...
beginPurchase(controlId);
return;
case -145:
if(controlId == -1){ //Nope, don't buy.
menu->Close();
return;
}
if(sel > -1 && sel < SHOP_ITEMS){
if(controlId == -2)
playerdata->credits += mPrices[sel];
if(sel < BOOSTER_SLOTS) //Clicked a booster.
purchaseBooster(sel);
else
purchaseCard(sel);
}
return;
}
else{
switch(controlId){
case 12:
if (shop) shop->saveAll();
if (taskList) taskList->save();
mParent->DoTransition(TRANSITION_FADE,GAME_STATE_MENU);
mStage = STAGE_SHOP_SHOP;
break;
case 14:
mStage = STAGE_SHOP_TASKS;
if (!taskList)
taskList = NEW TaskList();
taskList->Start();
break;
case 15:
if(taskList)
taskList->End();
break;
default:
mStage = STAGE_SHOP_SHOP;
}
if (menu) menu->Close();
//Basic Menu.
switch(controlId){
case 12:
if (taskList) taskList->save();
mParent->DoTransition(TRANSITION_FADE,GAME_STATE_MENU);
mStage = STAGE_SHOP_SHOP;
break;
case 14:
mStage = STAGE_SHOP_TASKS;
if (!taskList)
taskList = NEW TaskList();
taskList->Start();
break;
case 15:
if(taskList)
taskList->End();
break;
case 22:
beginFilters();
break;
case -2:
playerdata->credits += 1000;
default:
mStage = STAGE_SHOP_SHOP;
}
SAFE_DELETE(menu);
}