support for wish cards and deck sideboard

This commit is contained in:
Anthony Calosa
2017-03-07 23:42:34 +08:00
parent 24e3fd3267
commit 030dca051a
16 changed files with 431 additions and 99 deletions

View File

@@ -37,16 +37,19 @@ GameStateDeckViewer::GameStateDeckViewer(GameApp* parent) :
welcome_menu = NULL;
myCollection = NULL;
myDeck = NULL;
mySideboard = NULL;
filterMenu = NULL;
source = NULL;
hudAlpha = 0;
subMenu = NULL;
sbMenu = NULL;
deckMenu = NULL;
mStatsWrapper = NULL;
statsPrevButton = NEW InteractiveButton(NULL, kPrevStatsButtonId, Fonts::MAIN_FONT, "Stats", SCREEN_WIDTH_F - 35, SCREEN_HEIGHT_F - 20, JGE_BTN_PREV);
toggleDeckButton = NEW InteractiveButton(NULL, kToggleDeckActionId, Fonts::MAIN_FONT, "View Deck", 10, SCREEN_HEIGHT_F - 20, JGE_BTN_PRI);
sellCardButton = NEW InteractiveButton(NULL, kSellCardActionId, Fonts::MAIN_FONT, "Sell Card", (SCREEN_WIDTH_F/ 2) - 100, SCREEN_HEIGHT_F - 20, JGE_BTN_SEC);
sellCardButton = NEW InteractiveButton(NULL, kSellCardActionId, Fonts::MAIN_FONT, "Sell Card", (SCREEN_WIDTH_F/ 2) - 125, SCREEN_HEIGHT_F - 20, JGE_BTN_SEC);
sbButton = NEW InteractiveButton(NULL, kSBActionId, Fonts::MAIN_FONT, "View SB", (SCREEN_WIDTH_F/ 2) - 35, SCREEN_HEIGHT_F - 20, JGE_BTN_SOUND);
filterButton = NEW InteractiveButton(NULL, kFilterButtonId, Fonts::MAIN_FONT, "Filter", (SCREEN_WIDTH_F - 116), SCREEN_HEIGHT_F - 20, JGE_BTN_CTRL);
//TODO: Check if that button is available:
toggleViewButton = NEW InteractiveButton(NULL, kSwitchViewButton, Fonts::MAIN_FONT, "Grid", (SCREEN_WIDTH_F/ 2) + 50, SCREEN_HEIGHT_F - 20, JGE_BTN_MAX);
@@ -61,6 +64,7 @@ GameStateDeckViewer::~GameStateDeckViewer()
SAFE_DELETE(bgMusic);
SAFE_DELETE(toggleDeckButton);
SAFE_DELETE(sellCardButton);
SAFE_DELETE(sbButton);
SAFE_DELETE(statsPrevButton);
SAFE_DELETE(filterButton);
SAFE_DELETE(toggleViewButton);
@@ -75,6 +79,11 @@ GameStateDeckViewer::~GameStateDeckViewer()
SAFE_DELETE(myDeck->parent);
SAFE_DELETE(myDeck);
}
if (mySideboard)
{
SAFE_DELETE(mySideboard->parent);
SAFE_DELETE(mySideboard);
}
if (myCollection)
{
SAFE_DELETE(myCollection->parent);
@@ -110,9 +119,12 @@ void GameStateDeckViewer::updateFilters()
void GameStateDeckViewer::toggleCollection()
{
if(mView->deck() == mySideboard)
return;
if (mView->deck() == myCollection)
{
toggleDeckButton->setText("View Collection");
toggleDeckButton->setText("Collection");
mView->SetDeck(myDeck);
}
else
@@ -124,6 +136,23 @@ void GameStateDeckViewer::toggleCollection()
updateFilters();
}
void GameStateDeckViewer::toggleSideBoard()
{
if(mView->deck() == myDeck)
return;
if (mView->deck() == myCollection)
{
mView->SetDeck(mySideboard);
}
else
{
mView->SetDeck(myCollection);
}
//source->swapSrc();
//updateFilters();
}
//after renaming and on the first start.
//reloadWelcomeMenu
void GameStateDeckViewer::updateDecks()
@@ -164,7 +193,9 @@ void GameStateDeckViewer::Start()
hudAlpha = 0;
mSwitching = false;
subMenu = NULL;
sbMenu = NULL;
myDeck = NULL;
mySideboard = NULL;
mStage = STAGE_WELCOME;
last_user_activity = NO_USER_ACTIVITY_HELP_DELAY + 1;
@@ -215,6 +246,7 @@ void GameStateDeckViewer::End()
SAFE_DELETE(welcome_menu);
SAFE_DELETE(deckMenu);
SAFE_DELETE(subMenu);
SAFE_DELETE(sbMenu);
WResourceManager::Instance()->Release(pspIconsTexture);
if (myCollection)
@@ -226,6 +258,11 @@ void GameStateDeckViewer::End()
SAFE_DELETE(myDeck->parent);
SAFE_DELETE(myDeck);
}
if (mySideboard)
{
SAFE_DELETE(mySideboard->parent);
SAFE_DELETE(mySideboard);
}
SAFE_DELETE(pricelist);
SAFE_DELETE(playerdata);
SAFE_DELETE(filterMenu);
@@ -254,6 +291,75 @@ void GameStateDeckViewer::addRemove(MTGCard * card)
mView->reloadIndexes();
}
void GameStateDeckViewer::SBaddRemove(MTGCard * card)
{
if (!card) return;
if ((card->getRarity() == Constants::RARITY_T) || (card->getId() < 1)) return;
if (mView->deck()->Remove(card, 1, (mView->deck() == mySideboard)))
{
if (mView->deck() == myCollection)
{
mySideboard->Add(card);
mySideboard->Sort(WSrcCards::SORT_ALPHA);
}
else
{
myCollection->Add(card);
}
}
myCollection->validate();
mySideboard->validate();
mStatsWrapper->needUpdate = true;
mView->reloadIndexes();
}
void GameStateDeckViewer::choiceAddRemove(MTGCard * card)
{
if (!card) return;
if ((card->getRarity() == Constants::RARITY_T) || (card->getId() < 1)) return;
last_user_activity = 0;
const float menuXOffset = SCREEN_WIDTH_F - 300;
const float menuYOffset = SCREEN_HEIGHT_F / 2;
SAFE_DELETE(sbMenu);
{
if (mView->deck() == myCollection)
{
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
sbMenu->Add(SBMENU_ADD_NORMAL, "Add to Deck");
sbMenu->Add(SBMENU_ADD_SB, "Add to Sideboard");
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
}
else
{
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
sbMenu->Add(SBMENU_ADD_NORMAL, "Remove Card");
//sbMenu->Add(SBMENU_ADD_SB, "Add to Sideboard");
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
}
}
mStatsWrapper->needUpdate = true;
}
void GameStateDeckViewer::insertSideBoard()
{
if(mySideboard->getCount())
{
vector<string> newSB;
for (int i = 0; i < mySideboard->Size(true); i++)
{
MTGCard * current = mySideboard->getCard(i, true);
int howmanyinDeck = mySideboard->count(current);
for (int i = 0; i < howmanyinDeck; i++)
{
stringstream cid;
cid << current->getMTGId();
newSB.push_back(cid.str());
}
}
myDeck->parent->replaceSB(newSB);
}
}
void GameStateDeckViewer::saveDeck()
{
//update the corresponding meta data object
@@ -261,6 +367,9 @@ void GameStateDeckViewer::saveDeck()
if ( newDeckname.length() > 0 )
metaData->setDeckName( newDeckname );
mSwitching = true;
//insert sideboards to mydeck parents
insertSideBoard();
//save deck
myDeck->save();
playerdata->save();
pricelist->save();
@@ -315,6 +424,7 @@ bool GameStateDeckViewer::userPressedButton()
{
return ((toggleDeckButton->ButtonPressed())
|| (sellCardButton->ButtonPressed())
|| (sbButton->ButtonPressed())
|| (statsPrevButton->ButtonPressed())
|| (filterButton->ButtonPressed())
|| (toggleViewButton->ButtonPressed())
@@ -329,6 +439,7 @@ void GameStateDeckViewer::setButtonState(bool state)
{
toggleDeckButton->setIsSelectionValid(state);
sellCardButton->setIsSelectionValid(state);
sbButton->setIsSelectionValid(state);
statsPrevButton->setIsSelectionValid(state);
filterButton->setIsSelectionValid(state);
toggleViewButton->setIsSelectionValid(state);
@@ -340,9 +451,13 @@ void GameStateDeckViewer::setButtonState(bool state)
void GameStateDeckViewer::RenderButtons()
{
toggleDeckButton->Render();
if(mView->deck() != mySideboard)
toggleDeckButton->Render();
sellCardButton->Render();
filterButton->Render();
if(mView->deck() != myDeck)
sbButton->Render();
if(mView->deck() != mySideboard)
filterButton->Render();
statsPrevButton->Render();
toggleViewButton->Render();
toggleUpButton->Render();
@@ -418,6 +533,15 @@ void GameStateDeckViewer::Update(float dt)
}
return;
}
if (sbMenu)
{
sbMenu->Update(dt);
if (sbMenu->isClosed())
{
SAFE_DELETE(sbMenu);
}
return;
}
if (mStage == STAGE_WAITING || mStage == STAGE_ONSCREEN_MENU)
{
JButton button = mEngine->ReadButton();
@@ -436,6 +560,13 @@ void GameStateDeckViewer::Update(float dt)
case JGE_BTN_CANCEL:
options[Options::DISABLECARDS].number = !options[Options::DISABLECARDS].number;
break;
case JGE_BTN_SOUND:
if (last_user_activity > 0.2)
{
last_user_activity = 0;
toggleSideBoard();
}
break;
case JGE_BTN_PRI:
if (last_user_activity > 0.2)
{
@@ -465,14 +596,16 @@ void GameStateDeckViewer::Update(float dt)
mEngine->LeftClickedProcessed();
if(mView->Click(x, y) != NULL)
{
addRemove(mView->getActiveCard());
//addRemove(mView->getActiveCard());
choiceAddRemove(mView->getActiveCard());
}
}
else
{
if(mView->Click() != NULL)
{
addRemove(mView->getActiveCard());
//addRemove(mView->getActiveCard());
choiceAddRemove(mView->getActiveCard());
}
}
@@ -485,11 +618,20 @@ void GameStateDeckViewer::Update(float dt)
break;
case JGE_BTN_MENU:
mStage = STAGE_MENU;
buildEditorMenu();
if(mView->deck() == mySideboard)
{
toggleSideBoard();
}
else
{
mStage = STAGE_MENU;
buildEditorMenu();
}
break;
case JGE_BTN_CTRL:
if(!mView->ButtonPressed(JGE_BTN_CTRL))
if (mView->deck() == mySideboard)
break;//SB is for viewing add or remove only
else if(!mView->ButtonPressed(JGE_BTN_CTRL))
{
mStage = STAGE_FILTERS;
if (!filterMenu)
@@ -774,27 +916,21 @@ void GameStateDeckViewer::renderOnScreenMenu()
char buffer[300];
int nb_letters = 0;
int value = myDeck->getCount(WSrcDeck::UNFILTERED_COPIES);
sprintf(buffer, _("Your Deck: %i cards").c_str(), value);
font->DrawString(buffer, SCREEN_WIDTH - 200 + rightTransition, SCREEN_HEIGHT / 2 + 25);
int sb_value = mySideboard->getCount(WSrcDeck::UNFILTERED_COPIES);
sprintf(buffer, _("Your Deck: %i cards.\nSideboard: %i cards").c_str(), value, sb_value);
font->DrawString(buffer, SCREEN_WIDTH - 200 + rightTransition, SCREEN_HEIGHT / 2 + 15);
for (int j = 0; j < Constants::NB_Colors; j++)
{
int value = myDeck->getCount(j);
if (value > 0)
if(value > 0)
{
int modx = value < 9?2:0;
r->RenderQuad(mIcons[j].get(), SCREEN_WIDTH - 190 + rightTransition + nb_letters * 8, SCREEN_HEIGHT / 2 + 49, 0, 0.45f,0.45f);
sprintf(buffer, "%i", value);
font->DrawString(buffer, SCREEN_WIDTH - 190 + rightTransition + nb_letters * 13, SCREEN_HEIGHT / 2 + 40);
r->RenderQuad(mIcons[j].get(), SCREEN_WIDTH - 197 + rightTransition + nb_letters * 13, SCREEN_HEIGHT / 2 + 46, 0, 0.5,
0.5);
if (value > 9)
{
nb_letters += 3;
}
else
{
nb_letters += 2;
}
font->DrawString(buffer, SCREEN_WIDTH - 195 + rightTransition + modx + nb_letters * 8, SCREEN_HEIGHT / 2 + 55);
nb_letters += 3;
}
}
@@ -1330,6 +1466,8 @@ void GameStateDeckViewer::Render()
if (subMenu) subMenu->Render();
if (sbMenu) sbMenu->Render();
if (filterMenu && !filterMenu->isFinished())
{
setButtonState(false);
@@ -1372,6 +1510,7 @@ int GameStateDeckViewer::loadDeck(int deckid)
// Check whether the cards in the deck are actually available in the player's collection:
int cheatmode = options[Options::CHEATMODE].number;
bool bPure = true;
bool cPure = true;
for (int i = 0; i < myDeck->Size(true); i++)
{
MTGCard * current = myDeck->getCard(i, true);
@@ -1398,8 +1537,56 @@ int GameStateDeckViewer::loadDeck(int deckid)
myDeck->validate();
myCollection->validate();
}
//sb
if (mySideboard)
{
SAFE_DELETE(mySideboard->parent);
SAFE_DELETE(mySideboard);
}
//temp deck for sb?
MTGDeck * tempDeck = NEW MTGDeck(MTGCollection());
if(myDeck->parent)
{//add cards from sdeboard lists
if(myDeck->parent->Sideboard.size())
{
for(unsigned int j = 0; j < myDeck->parent->Sideboard.size(); j++)
{
string cardID = myDeck->parent->Sideboard[j];
tempDeck->add(atoi(cardID.c_str()));
}
}
}
mySideboard = NEW DeckDataWrapper(tempDeck);
for (int i = 0; i < mySideboard->Size(true); i++)
{
MTGCard * current = mySideboard->getCard(i, true);
int howmanyinDeck = mySideboard->count(current);
for (int i = myCollection->count(current); i < howmanyinDeck; i++)
{
cPure = false;
if (cheatmode)
{ //Are we cheating?
playerdata->collection->add(current); //Yup, add it to collection permanently.
myCollection->Add(current);
}
else
{
mySideboard->Remove(current,howmanyinDeck-i); //Nope. Remove it from sb.
break;
}
}
myCollection->Remove(current, mySideboard->count(current));
}
if (!cPure)
{
mySideboard->validate();
myCollection->validate();
}
//endsb
myDeck->Sort(WSrcCards::SORT_ALPHA);
mySideboard->Sort(WSrcCards::SORT_ALPHA);
SAFE_DELETE(filterMenu);
rebuildFilters();
mView->reloadIndexes();
@@ -1537,6 +1724,30 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
subMenu->Close();
break;
}
case SBMENU_CHOICE: // sideboard
switch (controlId)
{
case SBMENU_ADD_NORMAL:
{
MTGCard * card = mView->getActiveCard();
if (card)
addRemove(card);
sbMenu->Close();
break;
}
case SBMENU_ADD_SB:
{
MTGCard * card = mView->getActiveCard();
if (card)
SBaddRemove(card);
sbMenu->Close();
break;
}
case SBMENU_ADD_CANCEL:
sbMenu->Close();
break;
}
}
}