Files
wagic/projects/mtg/src/GameStateDeckViewer.cpp
Eduardo MG a371cef279 Blood macros, more kindred changes
Created a macros for blood token, tribal to kindred changes, typo in background on various files,

Bug fixes:
Fiendslayer Paladin
Dire Fleet Poisoner
Shapers of Nature
Raptor Hatchling
Emiel the Blessed
Path of Discovery
Departed Deckhand
2025-05-26 18:46:55 -06:00

2091 lines
78 KiB
C++

/*
* GameStateDeckViewer.cpp
* Class handling the Deck Editor
*/
#include "PrecompiledHeader.h"
#include <math.h>
#include <iomanip>
#include "GameStateDuel.h"
#include "GameStateDeckViewer.h"
#include "Translate.h"
#include "ManaCostHybrid.h"
#include "MTGCardInstance.h"
#include "WFilter.h"
#include "WDataSrc.h"
#include "DeckManager.h"
#include "DeckMetaData.h"
#include "DeckEditorMenu.h"
#include "SimpleMenu.h"
#include "utils.h"
#include "AIPlayer.h"
#include "GameApp.h"
#include "CarouselDeckView.h"
#include "GridDeckView.h"
#define NO_USER_ACTIVITY_HELP_DELAY 10
static std::string kBgFile = "";
GameStateDeckViewer::GameStateDeckViewer(GameApp* parent) :
GameState(parent, "deckeditor"), mView(NULL), mCurrentView(CAROUSEL_VIEW)
{
bgMusic = NULL;
isAIDeckSave = false;
mSwitching = false;
welcome_menu = NULL;
myCollection = NULL;
myDeck = NULL;
mySideboard = NULL;
myCommandZone = NULL;
myDungeonZone = 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) - 125, SCREEN_HEIGHT_F - 20, JGE_BTN_SEC);
sb_cmd_dng_Button = NEW InteractiveButton(NULL, kSBActionId, Fonts::MAIN_FONT, "View SB", (SCREEN_WIDTH_F/ 2) - 35, SCREEN_HEIGHT_F - 20, JGE_BTN_CTRL);
filterButton = NEW InteractiveButton(NULL, kFilterButtonId, Fonts::MAIN_FONT, "Filter", (SCREEN_WIDTH_F - 116), SCREEN_HEIGHT_F - 20, JGE_BTN_SOUND);
menuButton = NEW InteractiveButton(NULL, kMenuButtonId, Fonts::MAIN_FONT, "Menu", (SCREEN_WIDTH_F - 76), SCREEN_HEIGHT_F - 20, JGE_BTN_MENU);
//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);
toggleUpButton = NEW InteractiveButton(NULL, kToggleUpButton, Fonts::MAIN_FONT, "UP", 10, 25, JGE_BTN_DOWN);
toggleDownButton = NEW InteractiveButton(NULL, kToggleDownButton, Fonts::MAIN_FONT, "DN", SCREEN_WIDTH_F-25, 25, JGE_BTN_UP);
toggleLeftButton = NEW InteractiveButton(NULL, kToggleLeftButton, Fonts::MAIN_FONT, "<<", 10, SCREEN_HEIGHT_F/2, JGE_BTN_LEFT);
toggleRightButton = NEW InteractiveButton(NULL, kToggleRightButton, Fonts::MAIN_FONT, ">>", SCREEN_WIDTH_F-20, SCREEN_HEIGHT_F/2, JGE_BTN_RIGHT);
}
GameStateDeckViewer::~GameStateDeckViewer()
{
SAFE_DELETE(bgMusic);
SAFE_DELETE(toggleDeckButton);
SAFE_DELETE(sellCardButton);
SAFE_DELETE(sb_cmd_dng_Button);
SAFE_DELETE(statsPrevButton);
SAFE_DELETE(filterButton);
SAFE_DELETE(toggleViewButton);
SAFE_DELETE(mView);
SAFE_DELETE(toggleUpButton);
SAFE_DELETE(toggleDownButton);
SAFE_DELETE(toggleLeftButton);
SAFE_DELETE(toggleRightButton);
if (myDeck)
{
SAFE_DELETE(myDeck->parent);
SAFE_DELETE(myDeck);
}
if (mySideboard)
{
SAFE_DELETE(mySideboard->parent);
SAFE_DELETE(mySideboard);
}
if (myCommandZone)
{
SAFE_DELETE(myCommandZone->parent);
SAFE_DELETE(myCommandZone);
}
if (myDungeonZone)
{
SAFE_DELETE(myDungeonZone->parent);
SAFE_DELETE(myDungeonZone);
}
if (myCollection)
{
SAFE_DELETE(myCollection->parent);
SAFE_DELETE(myCollection);
}
SAFE_DELETE(filterMenu);
kBgFile = ""; //Reset the chosen background.
}
void GameStateDeckViewer::rebuildFilters()
{
if (!filterMenu) filterMenu = NEW WGuiFilters("Filter by...", NULL);
if (source)
SAFE_DELETE(source);
source = NEW WSrcDeckViewer(myDeck, myCollection);
filterMenu->setSrc(source);
if (mView->deck() != myDeck) source->swapSrc();
filterMenu->Finish(true);
// no stats need updating if there isn't a deck to update
if (mStatsWrapper && myDeck)
mStatsWrapper->updateStats( myDeck );;
}
void GameStateDeckViewer::updateFilters()
{
if (!mView->deck() || !filterMenu) return;
filterMenu->recolorFilter(mView->filter() - 1);
filterMenu->Finish(true);
mStatsWrapper->updateStats( myDeck );;
return;
}
void GameStateDeckViewer::toggleCollection()
{
if(mView->deck() == mySideboard || mView->deck() == myCommandZone || mView->deck() == myDungeonZone)
return;
if (mView->deck() == myCollection)
{
toggleDeckButton->setText("Collection");
mView->SetDeck(myDeck);
}
else
{
toggleDeckButton->setText("View Deck");
mView->SetDeck(myCollection);
}
source->swapSrc();
updateFilters();
}
void GameStateDeckViewer::toggleSB_CMD_DNG()
{
if(mView->deck() == myDeck)
return;
if (mView->deck() == myCollection)
{
mView->SetDeck(mySideboard);
sb_cmd_dng_Button->setText("View CMD");
}
else if (mView->deck() == mySideboard)
{
mView->SetDeck(myCommandZone);
sb_cmd_dng_Button->setText("View DNG");
}
else if (mView->deck() == myCommandZone)
{
mView->SetDeck(myDungeonZone);
sb_cmd_dng_Button->setText("View Coll.");
}
else
{
mView->SetDeck(myCollection);
sb_cmd_dng_Button->setText("View SB");
}
//source->swapSrc();
//updateFilters();
}
//after renaming and on the first start.
//reloadWelcomeMenu
void GameStateDeckViewer::updateDecks()
{
SAFE_DELETE(welcome_menu);
welcome_menu = NEW DeckEditorMenu(MENU_DECK_SELECTION, this, Fonts::OPTION_FONT, "Choose Deck To Edit");
vector<DeckMetaData *> playerDeckList = fillDeckMenu(welcome_menu, options.profileFile(), "", NULL, 0, GAME_TYPE_CLASSIC, true); // Show all decks in deck editor menu...
newDeckname = "";
welcome_menu->Add(MENU_ITEM_NEW_DECK, "--NEW--");
if (options[Options::CHEATMODE].number && (!myCollection || myCollection->getCount(WSrcDeck::UNFILTERED_MIN_COPIES) < 4))
{
welcome_menu->Add(MENU_ITEM_CHEAT_MODE, "--UNLOCK CARDS--");
}
welcome_menu->Add(MENU_ITEM_CANCEL, "Cancel");
// update the deckmanager with the latest information
DeckManager::GetInstance()->updateMetaDataList(&playerDeckList, false);
}
void GameStateDeckViewer::buildEditorMenu()
{
SAFE_DELETE(deckMenu);
deckMenu = NEW DeckEditorMenu(MENU_DECK_BUILDER, this, Fonts::OPTION_FONT, "Deck Editor", myDeck, mStatsWrapper);
deckMenu->Add(MENU_ITEM_FILTER_BY, _("Filter By..."), _("Narrow down the list of cards. "));
deckMenu->Add(MENU_ITEM_SWITCH_DECKS_NO_SAVE, _("Switch Decks"), _("No changes. View another deck."));
deckMenu->Add(MENU_ITEM_SAVE_RENAME, _("Rename Deck"), _("Change the name of the deck"));
deckMenu->Add(MENU_ITEM_SAVE_RETURN_MAIN_MENU, _("Save & Quit Editor"), _("Save changes. Return to the main menu"));
deckMenu->Add(MENU_ITEM_SAVE_AS_AI_DECK, _("Save As AI Deck"), _("All changes are final."));
deckMenu->Add(MENU_ITEM_MAIN_MENU, _("Quit Editor"), _("No changes. Return to the main menu."));
deckMenu->Add(MENU_ITEM_TOGGLE_VIEW, _("Toggle View"), _("Toggle view grid/carousel."));
deckMenu->Add(MENU_ITEM_EDITOR_CANCEL, _("Cancel"), _("Close menu."));
}
void GameStateDeckViewer::Start()
{
hudAlpha = 0;
mSwitching = false;
subMenu = NULL;
sbMenu = NULL;
myDeck = NULL;
mySideboard = NULL;
myCommandZone = NULL;
myDungeonZone = NULL;
mStage = STAGE_WELCOME;
last_user_activity = NO_USER_ACTIVITY_HELP_DELAY + 1;
onScreenTransition = 0;
pricelist = NEW PriceList("settings/prices.dat", MTGCollection());
playerdata = NEW PlayerData(MTGCollection());
myCollection = NEW DeckDataWrapper(playerdata->collection);
myCollection->Sort(WSrcCards::SORT_ALPHA);
setupView(mCurrentView, myCollection);
toggleDeckButton->setText("View Deck");
//Icons
mIcons = manaIcons;
for (int i = 0; i < Constants::NB_Colors; i++)
{
mIcons[i]->SetHotSpot(16, 16);
}
//Grab a texture in VRAM.
pspIconsTexture = WResourceManager::Instance()->RetrieveTexture("iconspsp.png", RETRIEVE_MANAGE);
char buf[512];
for (int i = 0; i < 8; i++)
{
sprintf(buf, "iconspsp%d", i);
pspIcons[i] = WResourceManager::Instance()->RetrieveQuad("iconspsp.png", (float) i * 32, 0, 32, 32, buf);
pspIcons[i]->SetHotSpot(16, 16);
}
#ifndef TOUCH_ENABLED
toggleDeckButton->setImage( pspIcons[6] );
sellCardButton->setImage( pspIcons[7] );
#endif
//init welcome menu
updateDecks();
GameApp::playMusic("Track1.mp3");
mEngine->ResetInput();
JRenderer::GetInstance()->EnableVSync(true);
}
void GameStateDeckViewer::End()
{
JRenderer::GetInstance()->EnableVSync(false);
SAFE_DELETE(welcome_menu);
SAFE_DELETE(deckMenu);
SAFE_DELETE(subMenu);
SAFE_DELETE(sbMenu);
WResourceManager::Instance()->Release(pspIconsTexture);
if (myCollection)
{
SAFE_DELETE(myCollection);
}
if (myDeck)
{
SAFE_DELETE(myDeck->parent);
SAFE_DELETE(myDeck);
}
if (mySideboard)
{
SAFE_DELETE(mySideboard->parent);
SAFE_DELETE(mySideboard);
}
if (myCommandZone)
{
SAFE_DELETE(myCommandZone->parent);
SAFE_DELETE(myCommandZone);
}
if (myDungeonZone)
{
SAFE_DELETE(myDungeonZone->parent);
SAFE_DELETE(myDungeonZone);
}
SAFE_DELETE(pricelist);
SAFE_DELETE(playerdata);
SAFE_DELETE(filterMenu);
SAFE_DELETE(source);
kBgFile = ""; //Reset the chosen background.
}
void GameStateDeckViewer::addRemove(MTGCard * card)
{
if (!card) return;
if ((card->getRarity() == Constants::RARITY_T) || (card->getId() < 1)) return;
if (mView->deck()->Remove(card, 1, (mView->deck() == myDeck)))
{
if (mView->deck() == myCollection)
{
myDeck->Add(card);
myDeck->Sort(WSrcCards::SORT_ALPHA);
}
else
{
myCollection->Add(card);
}
}
myCollection->validate();
myDeck->validate();
mStatsWrapper->needUpdate = true;
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::CMDaddRemove(MTGCard * card)
{
if (!card) return;
if ((card->getRarity() == Constants::RARITY_T) || (card->getId() < 1)) return;
if (mView->deck()->Remove(card, 1, (mView->deck() == myCommandZone)))
{
if (mView->deck() == myCollection)
{
myCommandZone->Add(card);
myCommandZone->Sort(WSrcCards::SORT_ALPHA);
}
else
{
myCollection->Add(card);
}
}
myCollection->validate();
myCommandZone->validate();
mStatsWrapper->needUpdate = true;
mView->reloadIndexes();
}
void GameStateDeckViewer::DNGaddRemove(MTGCard * card)
{
if (!card) return;
if ((card->getRarity() != Constants::RARITY_T) || (card->getId() < 1)) return;
if (mView->deck()->Remove(card, 1, (mView->deck() == myDungeonZone)))
{
if (mView->deck() == myCollection)
{
myDungeonZone->Add(card);
myDungeonZone->Sort(WSrcCards::SORT_ALPHA);
}
else
{
myCollection->Add(card);
}
}
myCollection->validate();
myDungeonZone->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");
if(!card->data->hasType("Dungeon")){
sbMenu->Add(SBMENU_ADD_NORMAL, "Add to Deck");
sbMenu->Add(SBMENU_ADD_SB, "Add to Sideboard");
if(card->data->hasType("Legendary") && (card->data->hasType("Creature") || card->data->basicAbilities[Constants::CANBECOMMANDER] || card->data->hasType("Background")))
sbMenu->Add(SBMENU_ADD_CMD, "Choose as Commander");
} else
sbMenu->Add(SBMENU_ADD_DNG, "Add to Dungeons");
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
}
else if (mView->deck() == myCommandZone)
{
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
sbMenu->Add(SBMENU_ADD_CMD, "Remove as Commander");
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
}
else if (mView->deck() == mySideboard)
{
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
sbMenu->Add(SBMENU_ADD_SB, "Remove from Sideboard");
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
}
else if (mView->deck() == myDungeonZone)
{
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
sbMenu->Add(SBMENU_ADD_DNG, "Remove from Dungeons");
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
}
else if (mView->deck() == myDeck)
{
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_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::insertCommandZone()
{
if(myCommandZone->getCount())
{
vector<string> newCMD;
for (int i = 0; i < myCommandZone->Size(true); i++)
{
MTGCard * current = myCommandZone->getCard(i, true);
int howmanyinDeck = myCommandZone->count(current);
for (int i = 0; i < howmanyinDeck; i++)
{
stringstream cid;
cid << current->getMTGId();
newCMD.push_back(cid.str());
}
}
myDeck->parent->replaceCMD(newCMD);
}
}
void GameStateDeckViewer::insertDungeonZone()
{
if(myDungeonZone->getCount())
{
vector<string> newDNG;
for (int i = 0; i < myDungeonZone->Size(true); i++)
{
MTGCard * current = myDungeonZone->getCard(i, true);
int howmanyinDeck = myDungeonZone->count(current);
for (int i = 0; i < howmanyinDeck; i++)
{
stringstream cid;
cid << current->getMTGId();
newDNG.push_back(cid.str());
}
}
myDeck->parent->replaceDNG(newDNG);
}
}
void GameStateDeckViewer::saveDeck()
{
//update the corresponding meta data object
DeckMetaData *metaData = DeckManager::GetInstance()->getDeckMetaDataById( myDeck->parent->meta_id, false );
if ( newDeckname.length() > 0 )
metaData->setDeckName( newDeckname );
mSwitching = true;
//insert sideboards to mydeck parents
insertSideBoard();
//insert commanders to mydeck parents
insertCommandZone();
//insert dungeons to mydeck parents
insertDungeonZone();
//save deck
myDeck->save();
playerdata->save();
pricelist->save();
}
/**
save the deck in a readable format to allow people to edit the file offline
*/
void GameStateDeckViewer::saveAsAIDeck(string deckName)
{
int deckId = AIPlayer::getTotalAIDecks() + 1;
std::ostringstream oss;
oss << "deck" <<deckId;
string aiDeckName = oss.str();
oss.str("");
if (myDeck->parent->meta_desc == "")
oss << endl << "Can you beat your own creations?" << endl << "User created AI Deck # " << deckId;
else
oss << myDeck->parent->meta_desc;
string deckDesc = oss.str();
string filepath = "ai/baka/";
filepath.append(aiDeckName).append(".txt");
DebugTrace("saving AI deck " << filepath);
myDeck->save(filepath, true, deckName, deckDesc);
AIPlayer::invalidateTotalAIDecks(); //We added one AI deck, so we need to invalidate the count cache
}
void GameStateDeckViewer::sellCard()
{
last_user_activity = 0;
SAFE_DELETE(subMenu);
char buffer[4096];
{
MTGCard * card = mView->getActiveCard();
if (card && mView->deck()->count(card))
{
int price = pricelist->getSellPrice(card);
sprintf(buffer, "%s : %i %s", _(card->data->getName()).c_str(), price, _("credits").c_str());
const float menuXOffset = SCREEN_WIDTH_F - 300;
const float menuYOffset = SCREEN_HEIGHT_F / 2;
subMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), MENU_CARD_PURCHASE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, buffer);
subMenu->Add(MENU_ITEM_YES, "Yes");
subMenu->Add(MENU_ITEM_NO, "No", "", true);
}
}
mStatsWrapper->needUpdate = true;
}
bool GameStateDeckViewer::userPressedButton()
{
return ((toggleDeckButton->ButtonPressed())
|| (sellCardButton->ButtonPressed())
|| (sb_cmd_dng_Button->ButtonPressed())
|| (statsPrevButton->ButtonPressed())
|| (filterButton->ButtonPressed())
|| (menuButton->ButtonPressed())
|| (toggleViewButton->ButtonPressed())
|| (toggleUpButton->ButtonPressed())
|| (toggleDownButton->ButtonPressed())
|| (toggleLeftButton->ButtonPressed())
|| (toggleRightButton->ButtonPressed())
);
}
void GameStateDeckViewer::setButtonState(bool state)
{
toggleDeckButton->setIsSelectionValid(state);
sellCardButton->setIsSelectionValid(state);
sb_cmd_dng_Button->setIsSelectionValid(state);
statsPrevButton->setIsSelectionValid(state);
filterButton->setIsSelectionValid(state);
menuButton->setIsSelectionValid(state);
toggleViewButton->setIsSelectionValid(state);
toggleUpButton->setIsSelectionValid(state);
toggleDownButton->setIsSelectionValid(state);
toggleLeftButton->setIsSelectionValid(state);
toggleRightButton->setIsSelectionValid(state);
}
void GameStateDeckViewer::RenderButtons()
{
if(mView->deck() != mySideboard && mView->deck() != myCommandZone && mView->deck() != myDungeonZone)
toggleDeckButton->Render();
sellCardButton->Render();
if(mView->deck() != myDeck)
sb_cmd_dng_Button->Render();
if(mView->deck() != mySideboard && mView->deck() != myCommandZone && mView->deck() != myDungeonZone)
filterButton->Render();
menuButton->Render();
statsPrevButton->Render();
toggleViewButton->Render();
toggleUpButton->Render();
toggleDownButton->Render();
toggleLeftButton->Render();
toggleRightButton->Render();
}
void GameStateDeckViewer::setupView(GameStateDeckViewer::AvailableView view, DeckDataWrapper *deck)
{
SAFE_DELETE(mView);
if(view == CAROUSEL_VIEW) mView = NEW CarouselDeckView();
else if(view == GRID_VIEW) mView = NEW GridDeckView();
mView->SetDeck(deck);
updateFilters();
}
void GameStateDeckViewer::toggleView()
{
if(mCurrentView == CAROUSEL_VIEW)
{
mCurrentView = GRID_VIEW;
toggleViewButton->setText("Carousel");
}
else
{
mCurrentView = CAROUSEL_VIEW;
toggleViewButton->setText("Grid");
}
setupView(mCurrentView, mView->deck());
}
void GameStateDeckViewer::Update(float dt)
{
if (options.keypadActive())
{
options.keypadUpdate(dt);
if (newDeckname != "")
{
newDeckname = options.keypadFinish();
if (newDeckname != "")
{
if (isAIDeckSave)
{
saveAsAIDeck(newDeckname);
isAIDeckSave = false;
}
else if (myDeck && myDeck->parent)
{
myDeck->parent->meta_name = newDeckname;
saveDeck();
updateDecks();
}
mStage = STAGE_WAITING;
}
newDeckname = "";
}
//Prevent screen from updating.
return;
}
hudAlpha = 255 - (int)(MAX(last_user_activity-2.0f, 0) * 500);
if (hudAlpha < 0) hudAlpha = 0;
if (subMenu)
{
subMenu->Update(dt);
if (subMenu->isClosed())
{
SAFE_DELETE(subMenu);
}
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();
switch (button)
{
case JGE_BTN_LEFT:
case JGE_BTN_RIGHT:
case JGE_BTN_UP:
case JGE_BTN_DOWN:
if(mView->ButtonPressed(button))
{
last_user_activity = 0;
mStage = STAGE_WAITING;
}
break;
case JGE_BTN_CANCEL:
options[Options::DISABLECARDS].number = !options[Options::DISABLECARDS].number;
break;
case JGE_BTN_CTRL:
if (last_user_activity > 0.2)
{
last_user_activity = 0;
toggleSB_CMD_DNG();
}
break;
case JGE_BTN_PRI:
if (last_user_activity > 0.2)
{
last_user_activity = 0;
toggleCollection();
}
break;
case JGE_BTN_MAX:
if (last_user_activity > 0.2)
{
last_user_activity = 0;
toggleView();
}
break;
case JGE_BTN_OK:
{
// verify that none of the buttons fired
if (userPressedButton())
{
Update(dt);
break;
}
int x, y;
if (mEngine->GetLeftClickCoordinates(x, y))
{
mEngine->LeftClickedProcessed();
if(mView->Click(x, y) != NULL)
{
//addRemove(mView->getActiveCard());
choiceAddRemove(mView->getActiveCard());
}
}
else
{
if(mView->Click() != NULL)
{
//addRemove(mView->getActiveCard());
choiceAddRemove(mView->getActiveCard());
}
}
last_user_activity = 0;
mStage = STAGE_WAITING;
break;
}
case JGE_BTN_SEC:
sellCard();
break;
case JGE_BTN_MENU:
if(mView->deck() == mySideboard || mView->deck() == myCommandZone || mView->deck() == myDungeonZone)
{
mView->SetDeck(myCollection);
sb_cmd_dng_Button->setText("View SB");
}
else
{
mStage = STAGE_MENU;
buildEditorMenu();
}
break;
case JGE_BTN_SOUND:
if (mView->deck() == mySideboard || mView->deck() == myCommandZone || mView->deck() == myDungeonZone)
break;//SB is for viewing add or remove only
else if(!mView->ButtonPressed(JGE_BTN_CTRL))
{
mStage = STAGE_FILTERS;
if (!filterMenu)
{
filterMenu = NEW WGuiFilters("Filter by...", NULL);
if (source)
SAFE_DELETE(source);
source = NEW WSrcDeckViewer(myDeck, myCollection);
filterMenu->setSrc(source);
if (mView->deck() != myDeck) source->swapSrc();
}
filterMenu->Entering(JGE_BTN_NONE);
}
break;
case JGE_BTN_PREV:
if (last_user_activity < NO_USER_ACTIVITY_HELP_DELAY)
last_user_activity = NO_USER_ACTIVITY_HELP_DELAY + 1;
else if ((mStage == STAGE_ONSCREEN_MENU) && (--mStatsWrapper->currentPage < 0)) mStatsWrapper->currentPage = mStatsWrapper->pageCount;
break;
case JGE_BTN_NEXT:
if (last_user_activity < NO_USER_ACTIVITY_HELP_DELAY)
last_user_activity = NO_USER_ACTIVITY_HELP_DELAY + 1;
else if ((mStage == STAGE_ONSCREEN_MENU) && (++mStatsWrapper->currentPage > mStatsWrapper->pageCount)) mStatsWrapper->currentPage = 0;
break;
default: // no keypress
if (last_user_activity > NO_USER_ACTIVITY_HELP_DELAY)
{
if (mStage != STAGE_ONSCREEN_MENU)
{
mStage = STAGE_ONSCREEN_MENU;
onScreenTransition = 1;
}
else
{
if (onScreenTransition > 0)
onScreenTransition -= 0.05f;
else
onScreenTransition = 0;
}
}
else
last_user_activity += dt;
break;
}
}
mView->Update(dt);
if(mView->dirtyFilters)
{
updateFilters();
mView->reloadIndexes();
mView->dirtyFilters = false;
}
if (mStage == STAGE_WELCOME)
welcome_menu->Update(dt);
else if (mStage == STAGE_MENU)
deckMenu->Update(dt);
else if (mStage == STAGE_FILTERS)
{
JButton key = mEngine->ReadButton();
if (filterMenu)
{
if (key == JGE_BTN_CTRL)
{
//useFilter = 0;
filterMenu->Finish(true);
filterMenu->Update(dt);
mView->reloadIndexes();
return;
}
if (!filterMenu->isFinished())
{
filterMenu->CheckUserInput(key);
filterMenu->Update(dt);
mView->reloadIndexes();
}
else
{
mStage = STAGE_WAITING;
updateFilters();
mView->reloadIndexes();
}
}
}
}
void GameStateDeckViewer::renderOnScreenBasicInfo()
{
JRenderer *renderer = JRenderer::GetInstance();
WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT);
char buffer[256];
float y = 0;
int allCopies, nowCopies;
nowCopies = mView->deck()->getCount(WSrcDeck::FILTERED_COPIES);
allCopies = mView->deck()->getCount(WSrcDeck::UNFILTERED_COPIES);
WCardFilter * wc = mView->deck()->getFiltersRoot();
if (wc)
sprintf(buffer, "%s %i of %i cards (%i unique)", (mView->deck() == myDeck) ? "DECK: " : " ", nowCopies, allCopies,
mView->deck()->getCount(WSrcDeck::FILTERED_UNIQUE));
else
sprintf(buffer, "%s%i cards (%i unique)", (mView->deck() == myDeck) ? "DECK: " : " ", allCopies,
mView->deck()->getCount(WSrcDeck::UNFILTERED_UNIQUE));
float w = mFont->GetStringWidth(buffer);
PIXEL_TYPE backupColor = mFont->GetColor();
renderer->FillRoundRect(SCREEN_WIDTH - (w + 27), y, w + 5, 4, 5, ARGB(hudAlpha/2,0,0,0));
mFont->SetColor(ARGB(hudAlpha,255,255,255));
mFont->DrawString(buffer, SCREEN_WIDTH - 20, y + 1, JGETEXT_RIGHT);
mFont->SetColor(backupColor);
if (mView->filter() != 0) renderer->RenderQuad(mIcons[mView->filter() - 1].get(), SCREEN_WIDTH - 10, y + 15, 0.0f, 0.5, 0.5);
}
void GameStateDeckViewer::renderSlideBar()
{
WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT);
int total = mView->deck()->Size();
if (total == 0) return;
float filler = 25;
float y = SCREEN_HEIGHT_F - 30;
float bar_size = SCREEN_WIDTH_F - 2 * filler;
JRenderer * r = JRenderer::GetInstance();
int currentPos = mView->getPosition();
float cursor_pos = bar_size * currentPos / total;
//r->FillRoundRect(filler + 5, y + 5, bar_size, 0, 4, ARGB(hudAlpha/2,0,0,0));
//r->DrawLine(filler + cursor_pos + 5, y + 5, filler + cursor_pos + 5, y + 10, ARGB(hudAlpha/2,0,0,0));
r->FillRoundRect(filler, y, bar_size, 0, 4, ARGB(hudAlpha/2,128,128,128));
r->DrawRoundRect(filler, y, bar_size, 0, 4, ARGB(hudAlpha/2,0,0,0));
r->DrawLine(filler + cursor_pos, y, filler + cursor_pos, y + 8, ARGB(hudAlpha,0,255,0));
char buffer[256];
string deckname = _("Collection");
if (mView->deck() == myDeck)
{
deckname = _("Deck");
}
sprintf(buffer, "%s - %i/%i", deckname.c_str(), currentPos, total);
mFont->SetColor(ARGB(hudAlpha,255,255,255));
mFont->DrawString(buffer, SCREEN_WIDTH / 2, y-2, JGETEXT_CENTER);
mFont->SetColor(ARGB(255,255,255,255));
}
void GameStateDeckViewer::renderDeckBackground()
{
int max1 = 0;
int maxC1 = 4;
int max2 = 0;
int maxC2 = 4;
for (int i = 0; i < Constants::NB_Colors - 1; i++)
{
int value = myDeck->getCount(i);
if (value > max1)
{
max2 = max1;
maxC2 = maxC1;
max1 = value;
maxC1 = i;
}
else if (value > max2)
{
max2 = value;
maxC2 = i;
}
}
if (max2 < max1 / 2)
{
maxC2 = maxC1;
}
PIXEL_TYPE colors[] = { ARGB(255, Constants::_r[maxC1], Constants::_g[maxC1], Constants::_b[maxC1]),
ARGB(255, Constants::_r[maxC1], Constants::_g[maxC1], Constants::_b[maxC1]),
ARGB(255, Constants::_r[maxC2], Constants::_g[maxC2], Constants::_b[maxC2]),
ARGB(255, Constants::_r[maxC2], Constants::_g[maxC2], Constants::_b[maxC2]), };
JRenderer::GetInstance()->FillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, colors);
}
void GameStateDeckViewer::renderOnScreenMenu()
{
WFont * font = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT);
font->SetColor(ARGB(255,255,255,255));
JRenderer * r = JRenderer::GetInstance();
float pspIconsSize = 0.5;
float fH = font->GetHeight() + 1;
float leftTransition = onScreenTransition * 84;
float rightTransition = onScreenTransition * 204;
float leftPspX = 40 - leftTransition;
float leftPspY = SCREEN_HEIGHT / 2 - 20;
float rightPspX = SCREEN_WIDTH - 100 + rightTransition;
float rightPspY = SCREEN_HEIGHT / 2 - 20;
#ifdef TOUCH_ENABLED
bool renderPSPIcons = false;
#else
bool renderPSPIcons = true;
#endif
if (mStatsWrapper->currentPage == 0)
{
//FillRects
r->FillRect(0 - (onScreenTransition * 84), 0, 84, SCREEN_HEIGHT, ARGB(128,0,0,0));
r->FillRect(SCREEN_WIDTH - 204 + (onScreenTransition * 204), 0, 204, SCREEN_HEIGHT, ARGB(128,0,0,0));
if (renderPSPIcons)
{
//LEFT PSP CIRCLE render
r->FillCircle(leftPspX, leftPspY, 40, ARGB(128,50,50,50));
r->RenderQuad(pspIcons[0].get(), leftPspX, leftPspY - 20, 0, pspIconsSize, pspIconsSize);
r->RenderQuad(pspIcons[1].get(), leftPspX, leftPspY + 20, 0, pspIconsSize, pspIconsSize);
r->RenderQuad(pspIcons[2].get(), leftPspX - 20, leftPspY, 0, pspIconsSize, pspIconsSize);
r->RenderQuad(pspIcons[3].get(), leftPspX + 20, leftPspY, 0, pspIconsSize, pspIconsSize);
font->DrawString(_("Prev."), leftPspX - 35, leftPspY - 15);
font->DrawString(_("Next"), leftPspX + 15, leftPspY - 15);
font->DrawString(_("card"), leftPspX - 35, leftPspY);
font->DrawString(_("card"), leftPspX + 15, leftPspY);
font->DrawString(_("Next edition"), leftPspX - 33, leftPspY - 35);
font->DrawString(_("Prev. edition"), leftPspX - 33, leftPspY + 25);
//RIGHT PSP CIRCLE render
r->FillCircle(rightPspX + (onScreenTransition * 204), rightPspY, 40, ARGB(128,50,50,50));
r->RenderQuad(pspIcons[4].get(), rightPspX + 20, rightPspY, 0, pspIconsSize, pspIconsSize);
r->RenderQuad(pspIcons[5].get(), rightPspX, rightPspY - 20, 0, pspIconsSize, pspIconsSize);
r->RenderQuad(pspIcons[6].get(), rightPspX - 20, rightPspY, 0, pspIconsSize, pspIconsSize);
r->RenderQuad(pspIcons[7].get(), rightPspX, rightPspY + 20, 0, pspIconsSize, pspIconsSize);
font->DrawString(_("Toggle Images"), rightPspX - 35, rightPspY - 40);
if (mView->deck() == myCollection)
{
font->DrawString(_("Add card"), rightPspX + 20, rightPspY - 15);
font->DrawString(_("View Deck"), rightPspX - 20, rightPspY - 15, JGETEXT_RIGHT);
}
else
{
font->DrawString(_("Remove card"), rightPspX + 20, rightPspY - 15);
font->DrawString(_("View Collection"), rightPspX - 20, rightPspY - 15, JGETEXT_RIGHT);
}
font->DrawString(_("Sell card"), rightPspX - 30, rightPspY + 20);
//Bottom menus
font->DrawString(_("menu"), SCREEN_WIDTH - 35 + rightTransition, SCREEN_HEIGHT - 15);
font->DrawString(_("filter"), SCREEN_WIDTH - 95 + rightTransition, SCREEN_HEIGHT - 15);
if (mView->deck() == myCollection)
{
font->DrawString(_("in: collection"), 5 - leftTransition, 5);
font->DrawString(_("Use SQUARE to view your deck,"), SCREEN_WIDTH - 200 + rightTransition, 5);
}
else
{
font->DrawString(_("in: deck"), 5 - leftTransition, 5);
font->DrawString(_("Use SQUARE to view collection,"), SCREEN_WIDTH - 200 + rightTransition, 5);
}
font->DrawString(_("Press L/R to cycle through"), SCREEN_WIDTH - 200 + rightTransition, 5 + fH);
font->DrawString(_("deck statistics."), SCREEN_WIDTH - 200 + rightTransition, 5 + fH * 2);
}
else
{
// print stuff here about the editor commands
float textYOffset = SCREEN_HEIGHT_F/2;
font->DrawString(_("Click on the card image"), SCREEN_WIDTH - 200 + rightTransition, textYOffset - (2 * fH));
if (mView->deck() == myCollection)
font->DrawString(_("to add card to deck."), SCREEN_WIDTH - 200 + rightTransition, textYOffset - fH);
else
font->DrawString(_("to remove card from deck."), SCREEN_WIDTH - 200 + rightTransition, textYOffset - fH);
}
//Your Deck Information
char buffer[300];
int nb_letters = 0;
int value = myDeck->getCount(WSrcDeck::UNFILTERED_COPIES);
int sb_value = mySideboard->getCount(WSrcDeck::UNFILTERED_COPIES);
int cmd_value = myCommandZone->getCount(WSrcDeck::UNFILTERED_COPIES);
int dng_value = myDungeonZone->getCount(WSrcDeck::UNFILTERED_COPIES);
sprintf(buffer, _("Your Deck: %i cards.\nSideboard: %i cards.\nCommanders: %i cards.\nDungeons: %i cards").c_str(), value, sb_value,cmd_value,dng_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)
{
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 - 195 + rightTransition + modx + nb_letters * 8, SCREEN_HEIGHT / 2 + 55);
nb_letters += 3;
}
}
}
else
{
mStatsWrapper->updateStats( myDeck );;
char buffer[300];
leftTransition = -(onScreenTransition / 2) * SCREEN_WIDTH;
rightTransition = -leftTransition;
r->FillRect(0 + leftTransition, 0, SCREEN_WIDTH / 2, SCREEN_HEIGHT, ARGB(128,0,0,0));
r->FillRect(SCREEN_WIDTH / 2 + rightTransition, 0, SCREEN_WIDTH / 2, SCREEN_HEIGHT, ARGB(128,0,0,0));
r->FillRect(10 + leftTransition, 10, SCREEN_WIDTH / 2 - 10, SCREEN_HEIGHT - 20, ARGB(128,0,0,0));
r->FillRect(SCREEN_WIDTH / 2 + rightTransition, 10, SCREEN_WIDTH / 2 - 10, SCREEN_HEIGHT - 20, ARGB(128,0,0,0));
#ifndef TOUCH_ENABLED
font->DrawString(_("menu"), SCREEN_WIDTH - 35 + rightTransition, SCREEN_HEIGHT - 15);
font->DrawString(_("filter"), SCREEN_WIDTH - 95 + rightTransition, SCREEN_HEIGHT - 15);
#endif
int nb_letters = 0;
float posX, posY;
DWORD graphColor;
graphColor = ARGB(200, 155, 155, 155);
string STATS_TITLE_FORMAT = _("%i: %s");
switch (mStatsWrapper->currentPage)
{
case 1: // Counts, price
// Title
sprintf(buffer, STATS_TITLE_FORMAT.c_str(), mStatsWrapper->currentPage, _("Statistics Summary").c_str());
font->DrawString(buffer, 10 + 20 + leftTransition, 10);
posY = 30;
posX = 180;
sprintf(buffer, _("Your Deck: %i cards").c_str(), mStatsWrapper->cardCount);
font->DrawString(buffer, 20 + 20 + leftTransition, posY);
posY += 10;
// Counts by color
for (int j = 0; j < Constants::NB_Colors; j++)
{
int value = myDeck->getCount(j);
if (value > 0)
{
sprintf(buffer, "%i", value);
font->DrawString(buffer, 38 + nb_letters * 13 + 20 + leftTransition, posY + 5);
r->RenderQuad(mIcons[j].get(), 30 + nb_letters * 13 + 20 + leftTransition, posY + 11, 0, 0.5, 0.5);
if (value > 9)
{
nb_letters += 3;
}
else
{
nb_letters += 2;
}
}
}
posY += 25;
r->DrawLine(posX - 4 + 20 + leftTransition, posY - 1, posX - 4 + 20 + leftTransition, posY + 177, ARGB(128, 255, 255, 255));
r->DrawLine(19 + 20 + leftTransition, posY - 1, 19 + 20 + leftTransition, posY + 177, ARGB(128, 255, 255, 255));
r->DrawLine(posX + 40 + 20 + leftTransition, posY - 1, posX + 40 + 20 + leftTransition, posY + 177, ARGB(128, 255, 255, 255));
r->DrawLine(20 + 20 + leftTransition, posY - 1, posX + 40 + 20 + leftTransition, posY - 1, ARGB(128, 255, 255, 255));
font->DrawString(_("Lands"), 20 + 20 + leftTransition, posY);
sprintf(buffer, _("%i").c_str(), mStatsWrapper->countLands);
font->DrawString(buffer, posX + 20 + leftTransition, posY);
posY += 14;
r->DrawLine(20 + 20 + leftTransition, posY - 1, posX + 40 + 20 + leftTransition, posY - 1, ARGB(128, 255, 255, 255));
font->DrawString(_("Creatures"), 20 + 20 + leftTransition, posY);
sprintf(buffer, _("%i").c_str(), mStatsWrapper->countCreatures);
font->DrawString(buffer, posX + 20 + leftTransition, posY);
posY += 14;
r->DrawLine(20 + 20 + leftTransition, posY - 1, posX + 40 + 20 + leftTransition, posY - 1, ARGB(128, 255, 255, 255));
font->DrawString(_("Spells"), 20 + 20 + leftTransition, posY);
sprintf(buffer, _("%i").c_str(), mStatsWrapper->countSpells);
font->DrawString(buffer, posX + 20 + leftTransition, posY);
posY += 10;
font->DrawString(_("Instants"), 30 + 20 + leftTransition, posY);
sprintf(buffer, _("%i").c_str(), mStatsWrapper->countInstants);
font->DrawString(buffer, posX + 20 + leftTransition, posY);
posY += 10;
font->DrawString(_("Enchantments"), 30 + 20 + leftTransition, posY);
sprintf(buffer, _("%i").c_str(), mStatsWrapper->countEnchantments);
font->DrawString(buffer, posX + 20 + leftTransition, posY);
posY += 10;
font->DrawString(_("Sorceries"), 30 + 20 + leftTransition, posY);
sprintf(buffer, _("%i").c_str(), mStatsWrapper->countSorceries);
font->DrawString(buffer, posX + 20 + leftTransition, posY);
//sprintf(buffer, "Artifacts: %i", stw->countArtifacts);
//mFont->DrawString(buffer, 20, 123);
posY += 14;
r->DrawLine(20 + 20 + leftTransition, posY - 1, posX + 40 + 20 + leftTransition, posY - 1, ARGB(128, 255, 255, 255));
font->DrawString(_("Average converted mana cost"), 20 + 20 + leftTransition, posY);
sprintf(buffer, _("%2.2f").c_str(), mStatsWrapper->avgManaCost);
font->DrawString(buffer, posX + 20 + leftTransition, posY);
posY += 14;
r->DrawLine(20 + 20 + leftTransition, posY - 1, posX + 40 + 20 + leftTransition, posY - 1, ARGB(128, 255, 255, 255));
font->DrawString(_("Probabilities"), 20 + 20 + leftTransition, posY);
posY += 10;
font->DrawString(_("No land in 1st hand"), 30 + 20 + leftTransition, posY);
sprintf(buffer, _("%2.2f%%").c_str(), mStatsWrapper->noLandsProbInTurn[0]);
font->DrawString(buffer, posX + 20 + leftTransition, posY);
posY += 10;
font->DrawString(_("No land in 9 cards"), 30 + 20 + leftTransition, posY);
sprintf(buffer, _("%2.2f%%").c_str(), mStatsWrapper->noLandsProbInTurn[2]);
font->DrawString(buffer, posX + 20 + leftTransition, posY);
posY += 10;
font->DrawString(_("No creatures in 1st hand"), 30 + 20 + leftTransition, posY);
sprintf(buffer, _("%2.2f%%").c_str(), mStatsWrapper->noCreaturesProbInTurn[0]);
font->DrawString(buffer, posX + 20 + leftTransition, posY);
// Playgame Statistics
posY += 14;
r->DrawLine(20 + 20 + leftTransition, posY - 1, posX + 40 + 20 + leftTransition, posY - 1, ARGB(128, 255, 255, 255));
font->DrawString(_("Playgame statistics"), 20 + 20 + leftTransition, posY);
posY += 10;
font->DrawString(_("Games played"), 30 + 20 + leftTransition, posY);
sprintf(buffer, _("%i").c_str(), mStatsWrapper->gamesPlayed);
font->DrawString(buffer, posX + 20 + leftTransition, posY);
posY += 10;
font->DrawString(_("Victory ratio"), 30 + 20 + leftTransition, posY);
sprintf(buffer, _("%i%%").c_str(), mStatsWrapper->percentVictories);
font->DrawString(buffer, posX + 20 + leftTransition, posY);
posY += 15;
r->DrawLine(20 + 20 + leftTransition, posY - 1, posX + 40 + 20 + leftTransition, posY - 1, ARGB(128, 255, 255, 255));
font->DrawString(_("Total price (credits)"), 20 + 20 + leftTransition, posY);
sprintf(buffer, _("%i ").c_str(), mStatsWrapper->totalPrice);
font->DrawString(buffer, posX + 20 + leftTransition, posY);
r->DrawLine(20 + 20 + leftTransition, posY + 13, posX + 40 + 20 + leftTransition, posY + 13, ARGB(128, 255, 255, 255));
break;
case 5: // Land statistics
sprintf(buffer, STATS_TITLE_FORMAT.c_str(), mStatsWrapper->currentPage, _("Mana production").c_str());
font->DrawString(buffer, 10 + 20 + leftTransition, 10);
font->DrawString(_("Counts of manasources per type and color:"), 20 + 20 + leftTransition, 30);
posY = 70;
// Column titles
for (int j = 0; j < Constants::NB_Colors - 1; j++)
{
r->RenderQuad(mIcons[j].get(), 52 + j * 15 + 20 + leftTransition, posY - 10, 0, 0.5, 0.5);
}
//font->DrawString(_("C"), 30 + leftTransition, posY-16);
//font->DrawString(_("Ty"), 27 + leftTransition, posY-16);
// Horizontal table lines
r->DrawLine(27 + 20 + leftTransition, posY - 20, 60 + (Constants::NB_Colors - 2) * 15 + 20 + leftTransition, posY - 20,
ARGB(128, 255, 255, 255));
r->DrawLine(27 + 20 + leftTransition, posY - 1, 60 + (Constants::NB_Colors - 2) * 15 + 20 + leftTransition, posY - 1,
ARGB(128, 255, 255, 255));
r->DrawLine(27 + 20 + leftTransition, 2 * 10 + posY + 12, 60 + (Constants::NB_Colors - 2) * 15 + 20 + leftTransition, 2 * 10
+ posY + 12, ARGB(128, 255, 255, 255));
r->DrawLine(27 + 20 + leftTransition, 3 * 10 + posY + 14, 60 + (Constants::NB_Colors - 2) * 15 + 20 + leftTransition, 3 * 10
+ posY + 14, ARGB(128, 255, 255, 255));
// Vertical table lines
r->DrawLine(26 + 20 + leftTransition, posY - 20, 26 + 20 + leftTransition, 3 * 10 + posY + 14, ARGB(128, 255, 255, 255));
r->DrawLine(43 + 20 + leftTransition, posY - 20, 43 + 20 + leftTransition, 3 * 10 + posY + 14, ARGB(128, 255, 255, 255));
r->DrawLine(60 + 20 + leftTransition + (Constants::NB_Colors - 2) * 15, posY - 20, 60 + 20 + leftTransition
+ (Constants::NB_Colors - 2) * 15, 3 * 10 + posY + 14, ARGB(128, 255, 255, 255));
font->DrawString(_("BL"), 27 + 20 + leftTransition, posY);
font->DrawString(_("NB"), 27 + 20 + leftTransition, posY + 10);
font->DrawString(_("O"), 30 + 20 + leftTransition, posY + 20);
font->DrawString(_("T"), 30 + 20 + leftTransition, posY + 33);
int curCount;
for (int j = 0; j < Constants::NB_Colors - 1; j++)
{
curCount = mStatsWrapper->countBasicLandsPerColor[j];
if(curCount == 0) {
sprintf(buffer, ".");
} else {
sprintf(buffer, "%i", curCount);
}
font->DrawString(buffer, 49 + 20 + leftTransition + j * 15, posY);
curCount = mStatsWrapper->countLandsPerColor[j];
if(curCount == 0) {
sprintf(buffer, ".");
} else {
sprintf(buffer, "%i", curCount);
}
font->DrawString(buffer, 49 + 20 + leftTransition + j * 15, posY + 10);
curCount = mStatsWrapper->countNonLandProducersPerColor[j];
if(curCount == 0) {
sprintf(buffer, ".");
} else {
sprintf(buffer, "%i", curCount);
}
font->DrawString(buffer, 49 + 20 + leftTransition + j * 15, posY + 20);
curCount = mStatsWrapper->countLandsPerColor[j] + mStatsWrapper->countBasicLandsPerColor[j] + mStatsWrapper->countNonLandProducersPerColor[j];
if(curCount == 0) {
sprintf(buffer, ".");
} else {
sprintf(buffer, "%i", curCount);
}
font->DrawString(buffer, 49 + 20 + leftTransition + j * 15, posY + 33);
}
posY += 55;
font->DrawString(_("BL - Basic lands"), 20 + 20 + leftTransition, posY);
posY += 10;
font->DrawString(_("NB - Non-basic lands"), 20 + 20 + leftTransition, posY);
posY += 10;
font->DrawString(_("O - Other (non-land) manasources"), 26 + 20 + leftTransition, posY);
posY += 10;
font->DrawString(_("T - Totals"), 26 + 20 + leftTransition, posY);
break;
case 6: // Land statistics - in symbols
sprintf(buffer, STATS_TITLE_FORMAT.c_str(), mStatsWrapper->currentPage, _("Mana production - in mana symbols").c_str());
font->DrawString(buffer, 10 + 20 + leftTransition, 10);
font->DrawString(_("Total colored mana symbols in lands' production:"), 20 + 20 + leftTransition, 30);
int totalProducedSymbols;
totalProducedSymbols = 0;
for (int i = 1; i < Constants::NB_Colors - 1; i++)
{
totalProducedSymbols += mStatsWrapper->countLandsPerColor[i] + mStatsWrapper->countBasicLandsPerColor[i]; //!! Move to updatestats!
}
posY = 50;
for (int i = 1; i < Constants::NB_Colors - 1; i++)
{
if (mStatsWrapper->countLandsPerColor[i] + mStatsWrapper->countBasicLandsPerColor[i] > 0)
{
sprintf(buffer, _("%i").c_str(), mStatsWrapper->countLandsPerColor[i] + mStatsWrapper->countBasicLandsPerColor[i]);
font->DrawString(buffer, 20 + leftTransition, posY);
sprintf(buffer, _("(%i%%)").c_str(), (int) (100 * (float) (mStatsWrapper->countLandsPerColor[i]
+ mStatsWrapper->countBasicLandsPerColor[i]) / totalProducedSymbols));
font->DrawString(buffer, 33 + 20 + leftTransition, posY);
posX = 72;
for (int j = 0; j < mStatsWrapper->countLandsPerColor[i] + mStatsWrapper->countBasicLandsPerColor[i]; j++)
{
r->RenderQuad(mIcons[i].get(), posX + 20 + leftTransition, posY + 6, 0, 0.5, 0.5);
posX += ((j + 1) % 10 == 0) ? 17 : 13;
if ((((j + 1) % 30) == 0) && (j < mStatsWrapper->countLandsPerColor[i] + mStatsWrapper->countBasicLandsPerColor[i] - 1))
{
posX = 72;
posY += 15;
}
}
posY += 17;
}
}
break;
case 2: // Mana cost detail
case 3:
case 4:
int (*countPerCost)[Constants::STATS_MAX_MANA_COST + 1];
int (*countPerCostAndColor)[Constants::STATS_MAX_MANA_COST + 1][Constants::MTG_NB_COLORS + 1];
float avgCost;
switch (mStatsWrapper->currentPage)
{ // Nested switch on the same variable. Oh yes.
case 2: // Total counts
// Title
sprintf(buffer, STATS_TITLE_FORMAT.c_str(), mStatsWrapper->currentPage, _("Mana cost detail").c_str());
font->DrawString(buffer, 10 + 20 + leftTransition, 10);
font->DrawString(_("Card counts per mana cost:"), 20 + 20 + leftTransition, 30);
avgCost = mStatsWrapper->avgManaCost;
countPerCost = &mStatsWrapper->countCardsPerCost;
countPerCostAndColor = &mStatsWrapper->countCardsPerCostAndColor;
break;
case 3: // Creature counts
// Title
sprintf(buffer, STATS_TITLE_FORMAT.c_str(), mStatsWrapper->currentPage, _("Mana cost detail - Creatures").c_str());
font->DrawString(buffer, 10 + 20 + leftTransition, 10);
font->DrawString(_("Creature counts per mana cost:"), 20 + 20 + leftTransition, 30);
avgCost = mStatsWrapper->avgCreatureCost;
countPerCost = &mStatsWrapper->countCreaturesPerCost;
countPerCostAndColor = &mStatsWrapper->countCreaturesPerCostAndColor;
break;
case 4: // Spell counts
// Title
sprintf(buffer, STATS_TITLE_FORMAT.c_str(), mStatsWrapper->currentPage, _("Mana cost detail - Spells").c_str());
font->DrawString(buffer, 10 + 20 + leftTransition, 10);
font->DrawString(_("Non-creature spell counts per mana cost:"), 20 + 20 + leftTransition, 30);
avgCost = mStatsWrapper->avgSpellCost;
countPerCost = &mStatsWrapper->countSpellsPerCost;
countPerCostAndColor = &mStatsWrapper->countSpellsPerCostAndColor;
break;
default:
countPerCost = NULL;
countPerCostAndColor = NULL;
avgCost = 0;
break;
}
posY = 70;
// Column titles
for (int j = 0; j < Constants::NB_Colors - 1; j++)
{
r->RenderQuad(mIcons[j].get(), 67 + j * 15 + 20 + leftTransition, posY - 10, 0, 0.5, 0.5);
}
font->DrawString(_("C"), 30 + 20 + leftTransition, posY - 16);
font->DrawString(_("#"), 45 + 20 + leftTransition, posY - 16);
// Horizontal table lines
r->DrawLine(27 + 20 + leftTransition, posY - 20, 75 + (Constants::NB_Colors - 2) * 15 + 20 + leftTransition, posY - 20,
ARGB(128, 255, 255, 255));
r->DrawLine(27 + 20 + leftTransition, posY - 1, 75 + (Constants::NB_Colors - 2) * 15 + 20 + leftTransition, posY - 1,
ARGB(128, 255, 255, 255));
r->DrawLine(27 + 20 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12, 75 + (Constants::NB_Colors - 2)
* 15 + 20 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12, ARGB(128, 255, 255, 255));
// Vertical table lines
r->DrawLine(26 + 20 + leftTransition, posY - 20, 26 + 20 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12,
ARGB(128, 255, 255, 255));
r->DrawLine(41 + 20 + leftTransition, posY - 20, 41 + 20 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12,
ARGB(128, 255, 255, 255));
r->DrawLine(58 + 20 + leftTransition, posY - 20, 58 + 20 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12,
ARGB(128, 255, 255, 255));
r->DrawLine(75 + 20 + leftTransition + (Constants::NB_Colors - 2) * 15, posY - 20, 75 + 20 + leftTransition
+ (Constants::NB_Colors - 2) * 15, Constants::STATS_MAX_MANA_COST * 10 + posY + 12,
ARGB(128, 255, 255, 255));
for (int i = 0; i <= Constants::STATS_MAX_MANA_COST; i++)
{
sprintf(buffer, _("%i").c_str(), i);
font->DrawString(buffer, 30 + 20 + leftTransition, posY);
sprintf(buffer, ((*countPerCost)[i] > 0) ? _("%i").c_str() : ".", (*countPerCost)[i]);
font->DrawString(buffer, 45 + 20 + leftTransition, posY);
for (int j = 0; j < Constants::NB_Colors - 1; j++)
{
sprintf(buffer, ((*countPerCostAndColor)[i][j] > 0) ? _("%i").c_str() : ".", (*countPerCostAndColor)[i][j]);
font->DrawString(buffer, 64 + 20 + leftTransition + j * 15, posY);
}
r->FillRect(77.f + 20 + leftTransition + (Constants::NB_Colors - 2) * 15.0f, posY + 2.0f, (*countPerCost)[i] * 5.0f,
8.0f, graphColor);
posY += 10;
}
posY += 10;
sprintf(buffer, _("Average converted mana cost: %2.2f").c_str(), avgCost);
font->DrawString(buffer, 20 + 20 + leftTransition, posY);
posY += 15;
sprintf(buffer, _("C - Converted mana cost. Cards with cost>%i are included in the last row.").c_str(),
Constants::STATS_MAX_MANA_COST);
font->DrawString(buffer, 20 + 20 + leftTransition, posY);
posY += 10;
font->DrawString(_("# - Total number of cards with given cost"), 20 + 20 + leftTransition, posY);
break;
case 8:
// Title
sprintf(buffer, STATS_TITLE_FORMAT.c_str(), mStatsWrapper->currentPage, _("Probabilities").c_str());
font->DrawString(buffer, 10 + 20 + leftTransition, 10);
// No lands detail
float graphScale, graphWidth;
graphWidth = 100;
graphScale = (mStatsWrapper->noLandsProbInTurn[0] == 0) ? 0 : (graphWidth / mStatsWrapper->noLandsProbInTurn[0]);
font->DrawString(_("No lands in first n cards:"), 20 + 20 + leftTransition, 30);
posY = 50;
for (int i = 0; i < Constants::STATS_FOR_TURNS; i++)
{
sprintf(buffer, _("%i:").c_str(), i + 7);
font->DrawString(buffer, 30 + 20 + leftTransition, posY);
sprintf(buffer, _("%2.2f%%").c_str(), mStatsWrapper->noLandsProbInTurn[i]);
font->DrawString(buffer, 45 + 20 + leftTransition, posY);
r->FillRect(84 + 20 + leftTransition, posY + 2, graphScale * mStatsWrapper->noLandsProbInTurn[i], 8, graphColor);
posY += 10;
}
// No creatures probability detail
posY += 10;
font->DrawString(_("No creatures in first n cards:"), 20 + 20 + leftTransition, posY);
posY += 20;
graphScale = (mStatsWrapper->noCreaturesProbInTurn[0] == 0) ? 0 : (graphWidth / mStatsWrapper->noCreaturesProbInTurn[0]);
for (int i = 0; i < Constants::STATS_FOR_TURNS; i++)
{
sprintf(buffer, _("%i:").c_str(), i + 7);
font->DrawString(buffer, 30 + 20 + leftTransition, posY);
sprintf(buffer, _("%2.2f%%").c_str(), mStatsWrapper->noCreaturesProbInTurn[i]);
font->DrawString(buffer, 45 + 20 + leftTransition, posY);
r->FillRect(84 + 20 + leftTransition, posY + 2, graphScale * mStatsWrapper->noCreaturesProbInTurn[i], 8, graphColor);
posY += 10;
}
break;
case 7: // Total mana cost per color
// Title
sprintf(buffer, STATS_TITLE_FORMAT.c_str(), mStatsWrapper->currentPage, _("Mana cost per color").c_str());
font->DrawString(buffer, 10 + 20 + leftTransition, 10);
font->DrawString(_("Total colored mana symbols in cards' casting costs:"), 20 + 20 + leftTransition, 30);
posY = 50;
for (int i = 1; i < Constants::NB_Colors - 1; i++)
{
if (mStatsWrapper->totalCostPerColor[i] > 0)
{
sprintf(buffer, _("%i").c_str(), mStatsWrapper->totalCostPerColor[i]);
font->DrawString(buffer, 20 + leftTransition, posY);
sprintf(buffer, _("(%i%%)").c_str(), (int) (100 * (float) mStatsWrapper->totalCostPerColor[i] / mStatsWrapper->totalColoredSymbols));
font->DrawString(buffer, 33 + leftTransition, posY);
posX = 72;
for (int j = 0; j < mStatsWrapper->totalCostPerColor[i]; j++)
{
r->RenderQuad(mIcons[i].get(), posX + 20 + leftTransition, posY + 6, 0, 0.5, 0.5);
posX += ((j + 1) % 10 == 0) ? 17 : 13;
if ((((j + 1) % 30) == 0) && (j < mStatsWrapper->totalCostPerColor[i] - 1))
{
posX = 72;
posY += 15;
}
}
posY += 17;
}
}
break;
case 9: // Victory statistics
// Title
sprintf(buffer, STATS_TITLE_FORMAT.c_str(), mStatsWrapper->currentPage, _("Victory statistics").c_str());
font->DrawString(buffer, 10 + 20 + leftTransition, 10);
font->DrawString(_("Victories against AI:"), 20 + 20 + leftTransition, 30);
sprintf(buffer, _("Games played: %i").c_str(), mStatsWrapper->gamesPlayed);
font->DrawString(buffer, 20 + 20 + leftTransition, 45);
sprintf(buffer, _("Victory ratio: %i%%").c_str(), mStatsWrapper->percentVictories);
font->DrawString(buffer, 20 + 20 + leftTransition, 55);
int AIsPerColumn = 19;
posY = 70;
posX = 20;
// ToDo: Multiple pages when too many AI decks are present
for (int i = 0; i < (int) mStatsWrapper->aiDeckStats.size(); i++)
{
sprintf(buffer, _("%.14s").c_str(), mStatsWrapper->aiDeckNames.at(i).c_str());
font->DrawString(buffer, posX + (i < 2 * AIsPerColumn ? leftTransition : rightTransition), posY);
sprintf(buffer, _("%i/%i").c_str(), mStatsWrapper->aiDeckStats.at(i)->victories, mStatsWrapper->aiDeckStats.at(i)->nbgames);
font->DrawString(buffer, posX + (i < AIsPerColumn ? leftTransition : rightTransition) + 80, posY);
sprintf(buffer, _("%i%%").c_str(), mStatsWrapper->aiDeckStats.at(i)->percentVictories());
font->DrawString(buffer, posX + (i < AIsPerColumn ? leftTransition : rightTransition) + 110, posY);
posY += 10;
if (((i + 1) % AIsPerColumn) == 0)
{
posY = 70;
posX += 155;
}
}
break;
}
}
}
void GameStateDeckViewer::Render()
{
setButtonState(false);
WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT);
JRenderer::GetInstance()->ClearScreen(ARGB(0,0,0,0));
#if !defined (PSP)
//Now it's possibile to randomly use up to 10 background images for deck editor background (if random index is 0, it will be rendered the default "bgdeckeditor.jpg" image).
JTexture * wpTex = NULL;
if(kBgFile == ""){
char temp[4096];
sprintf(temp, "bgdeckeditor%i.jpg", std::rand() % 10);
kBgFile.assign(temp);
wpTex = WResourceManager::Instance()->RetrieveTexture(kBgFile);
if (wpTex) {
JQuadPtr wpQuad = WResourceManager::Instance()->RetrieveTempQuad(kBgFile);
if (wpQuad.get())
JRenderer::GetInstance()->RenderQuad(wpQuad.get(), 0, 0, 0, SCREEN_WIDTH_F / wpQuad->mWidth, SCREEN_HEIGHT_F / wpQuad->mHeight);
else {
kBgFile = "bgdeckeditor.jpg"; //Fallback to default background image for deck editor background.
wpTex = NULL;
}
} else
kBgFile = "bgdeckeditor.jpg"; //Fallback to default background image for deck editor background.
}
if(!wpTex)
wpTex = WResourceManager::Instance()->RetrieveTexture(kBgFile);
if (wpTex)
{
JQuadPtr wpQuad = WResourceManager::Instance()->RetrieveTempQuad(kBgFile);
JRenderer::GetInstance()->RenderQuad(wpQuad.get(), 0, 0, 0, SCREEN_WIDTH_F / wpQuad->mWidth, SCREEN_HEIGHT_F / wpQuad->mHeight);
}
/*if (mView->deck() == myDeck && mStage != STAGE_MENU)
renderDeckBackground();*/
#else
JTexture * wpTex = WResourceManager::Instance()->RetrieveTexture("pspbgdeckeditor.jpg");
if (wpTex)
{
JQuadPtr wpQuad = WResourceManager::Instance()->RetrieveTempQuad("pspbgdeckeditor.jpg");
JRenderer::GetInstance()->RenderQuad(wpQuad.get(), 0, 0, 0, SCREEN_WIDTH_F / wpQuad->mWidth, SCREEN_HEIGHT_F / wpQuad->mHeight);
}
/*if (mView->deck() == myDeck && mStage != STAGE_MENU)
renderDeckBackground();*/
#endif
mView->Render();
if (mView->deck()->Size() > 0)
{
setButtonState(true);
renderSlideBar();
}
else
{
mFont->DrawString(_("No Card"), SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, JGETEXT_CENTER);
}
if (mStage == STAGE_ONSCREEN_MENU)
{
renderOnScreenMenu();
}
else if (mStage == STAGE_WELCOME)
{
setButtonState(false);
welcome_menu->Render();
}
else
{
setButtonState(true);
renderOnScreenBasicInfo();
}
if (mStage == STAGE_MENU)
{
setButtonState(false);
deckMenu->Render();
}
if (subMenu) subMenu->Render();
if (sbMenu) sbMenu->Render();
if (filterMenu && !filterMenu->isFinished())
{
setButtonState(false);
filterMenu->Render();
}
if (options.keypadActive()) options.keypadRender();
RenderButtons();
}
int GameStateDeckViewer::loadDeck(int deckid)
{
if (!mStatsWrapper)
{
DeckManager *deckManager = DeckManager::GetInstance();
mStatsWrapper = deckManager->getExtendedStatsForDeckId( deckid, MTGCollection(), false );
}
mStatsWrapper->currentPage = 0;
mStatsWrapper->pageCount = 9;
mStatsWrapper->needUpdate = true;
if (!playerdata) playerdata = NEW PlayerData(MTGCollection());
SAFE_DELETE(myCollection);
myCollection = NEW DeckDataWrapper(playerdata->collection);
myCollection->Sort(WSrcCards::SORT_ALPHA);
mView->SetDeck(myCollection);
char deckname[256];
sprintf(deckname, "deck%i.txt", deckid);
if (myDeck)
{
SAFE_DELETE(myDeck->parent);
SAFE_DELETE(myDeck);
}
myDeck = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(deckname, "", false).c_str(), MTGCollection()));
// 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);
int howmanyinDeck = myDeck->count(current);
for (int i = myCollection->count(current); i < howmanyinDeck; i++)
{
bPure = false;
if (cheatmode)
{ //Are we cheating?
playerdata->collection->add(current); //Yup, add it to collection permanently.
myCollection->Add(current);
}
else
{
myDeck->Remove(current,howmanyinDeck-i); //Nope. Remove it from deck.
break;
}
}
myCollection->Remove(current, myDeck->count(current));
}
if (!bPure)
{
myDeck->validate();
myCollection->validate();
}
//sb
if (mySideboard)
{
SAFE_DELETE(mySideboard->parent);
SAFE_DELETE(mySideboard);
}
//cmd
if (myCommandZone)
{
SAFE_DELETE(myCommandZone->parent);
SAFE_DELETE(myCommandZone);
}
//dng
if (myDungeonZone)
{
SAFE_DELETE(myDungeonZone->parent);
SAFE_DELETE(myDungeonZone);
}
//temp deck for sb?
MTGDeck * sbtempDeck = 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];
sbtempDeck->add(atoi(cardID.c_str()));
}
}
}
mySideboard = NEW DeckDataWrapper(sbtempDeck);
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
//temp deck for cmd?
MTGDeck * cmdtempDeck = NEW MTGDeck(MTGCollection());
if(myDeck->parent)
{//add cards from commanders lists
if(myDeck->parent->CommandZone.size())
{
for(unsigned int j = 0; j < myDeck->parent->CommandZone.size(); j++)
{
string cardID = myDeck->parent->CommandZone[j];
cmdtempDeck->add(atoi(cardID.c_str()));
}
}
}
myCommandZone = NEW DeckDataWrapper(cmdtempDeck);
for (int i = 0; i < myCommandZone->Size(true); i++)
{
MTGCard * current = myCommandZone->getCard(i, true);
int howmanyinDeck = myCommandZone->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
{
myCommandZone->Remove(current,howmanyinDeck-i); //Nope. Remove it from sb.
break;
}
}
myCollection->Remove(current, myCommandZone->count(current));
}
if (!cPure)
{
myCommandZone->validate();
myCollection->validate();
}
//endcmd
//temp deck for dng?
MTGDeck * dngtempDeck = NEW MTGDeck(MTGCollection());
if(myDeck->parent)
{//add cards from commanders lists
if(myDeck->parent->DungeonZone.size())
{
for(unsigned int j = 0; j < myDeck->parent->DungeonZone.size(); j++)
{
string cardID = myDeck->parent->DungeonZone[j];
dngtempDeck->add(atoi(cardID.c_str()));
}
}
}
myDungeonZone = NEW DeckDataWrapper(dngtempDeck);
for (int i = 0; i < myDungeonZone->Size(true); i++)
{
MTGCard * current = myDungeonZone->getCard(i, true);
int howmanyinDeck = myDungeonZone->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
{
myDungeonZone->Remove(current,howmanyinDeck-i); //Nope. Remove it from sb.
break;
}
}
myCollection->Remove(current, myDungeonZone->count(current));
}
if (!cPure)
{
myDungeonZone->validate();
myCollection->validate();
}
//enddng
myDeck->Sort(WSrcCards::SORT_ALPHA);
mySideboard->Sort(WSrcCards::SORT_ALPHA);
myCommandZone->Sort(WSrcCards::SORT_ALPHA);
myDungeonZone->Sort(WSrcCards::SORT_ALPHA);
SAFE_DELETE(filterMenu);
rebuildFilters();
mView->reloadIndexes();
return 1;
}
void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
{
int deckIdNumber = controlId;
int deckListSize = 0;
string defaultAiName;
DeckManager *deckManager = DeckManager::GetInstance();
vector<DeckMetaData *> * deckList;
switch (controllerId)
{
case MENU_DECK_SELECTION: //Deck menu
if (controlId == MENU_ITEM_CANCEL)
{
if (!mSwitching)
mParent->DoTransition(TRANSITION_FADE, GAME_STATE_MENU);
else
mStage = STAGE_WAITING;
mSwitching = false;
break;
}
else if (controlId == MENUITEM_MORE_INFO)
{
break;
}
else if (controlId == MENU_ITEM_CHEAT_MODE)
{ // (PSY) Cheatmode: Complete the collection
playerdata->collection->complete(); // Add the cards
playerdata->collection->save(); // Save the new collection
for (int i = 0; i < setlist.size(); i++)
{ // Update unlocked sets
GameOptionAward * goa = dynamic_cast<GameOptionAward*> (&options[Options::optionSet(i)]);
if (goa) goa->giveAward();
}
options.save();
SAFE_DELETE(myCollection);
myCollection = NEW DeckDataWrapper(playerdata->collection);
myCollection->Sort(WSrcCards::SORT_ALPHA);
mView->SetDeck(myCollection);
rebuildFilters();
mView->reloadIndexes();
mStage = STAGE_WELCOME;
break;
}
mStage = STAGE_WAITING;
deckList = deckManager->getPlayerDeckOrderList();
deckListSize = deckList->size();
if (controlId == MENU_ITEM_NEW_DECK) // new deck option selected
deckIdNumber = deckList->size() + 1;
else if (deckListSize > 0 && controlId <= deckListSize)
deckIdNumber = deckList->at(controlId - 1)-> getDeckId();
else
deckIdNumber = controlId;
loadDeck(deckIdNumber);
mStage = STAGE_WAITING;
break;
case MENU_DECK_BUILDER: //Save / exit menu
switch (controlId)
{
case MENU_ITEM_SAVE_RETURN_MAIN_MENU:
saveDeck();
mParent->DoTransition(TRANSITION_FADE, GAME_STATE_MENU);
break;
case MENU_ITEM_SAVE_RENAME:
if (myDeck && myDeck->parent)
{
options.keypadStart(myDeck->parent->meta_name, &newDeckname);
options.keypadTitle("Rename deck");
}
break;
case MENU_ITEM_SAVE_AS_AI_DECK:
// find the next unused ai deck number
// warn user that once saved, no edits can be made
// save entire collection to ai as spelled out card with count
// bring user to main deck editor menu.
isAIDeckSave = true;
defaultAiName = myDeck && myDeck->parent ? myDeck->parent->meta_name : "Custom AI Deck";
options.keypadStart(defaultAiName, &newDeckname);
options.keypadTitle("Name Custom AI Deck");
updateDecks();
mStage = STAGE_WELCOME;
mSwitching = true;
break;
case MENU_ITEM_SWITCH_DECKS_NO_SAVE:
mStage = STAGE_WELCOME;
mSwitching = true;
break;
case MENU_ITEM_MAIN_MENU:
mParent->DoTransition(TRANSITION_FADE, GAME_STATE_MENU);
break;
case MENU_ITEM_EDITOR_CANCEL:
mStage = STAGE_WAITING;
break;
case MENU_ITEM_FILTER_BY:
mStage = STAGE_FILTERS;
if (!filterMenu) rebuildFilters();
filterMenu->Entering(JGE_BTN_NONE);
break;
case MENU_ITEM_TOGGLE_VIEW:
mStage = STAGE_WAITING;
last_user_activity = 0;
toggleView();
break;
}
break;
case MENU_CARD_PURCHASE: // Yes/ No sub menu.
switch (controlId)
{
case MENU_ITEM_YES:
{
MTGCard * card = mView->getActiveCard();
if (card)
{
int rnd = (rand() % 25);
int price = pricelist->getSellPrice(card);
playerdata->credits += price;
GameApp::mycredits = playerdata->credits;
price = price - (rnd * price) / 100;
pricelist->setPrice(card->getMTGId(), price);
playerdata->collection->remove(card->getMTGId());
mView->deck()->Remove(card, 1);
mView->deck()->validate();
mStatsWrapper->needUpdate = true;
mView->reloadIndexes();
}
}
case MENU_ITEM_NO:
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_CMD:
{
MTGCard * card = mView->getActiveCard();
if (card)
CMDaddRemove(card);
sbMenu->Close();
break;
}
case SBMENU_ADD_DNG:
{
MTGCard * card = mView->getActiveCard();
if (card)
DNGaddRemove(card);
sbMenu->Close();
break;
}
case SBMENU_ADD_CANCEL:
sbMenu->Close();
break;
}
}
}
/*
to keep actions consistent across the different platforms, we need to branch the way swipes are interpreted. iOS5 changes
the way a swipe moves a document on the page. swipe down is to simulate dragging the page down instead of moving down
on a page.
*/
void GameStateDeckViewer::OnScroll(int inXVelocity, int inYVelocity)
{
int magnitude = static_cast<int>( sqrtf( (float )( (inXVelocity * inXVelocity) + (inYVelocity * inYVelocity))));
bool flickHorizontal = (abs(inXVelocity) > abs(inYVelocity));
bool flickUp = !flickHorizontal && (inYVelocity > 0) ? true : false;
bool flickRight = flickHorizontal && (inXVelocity < 0) ? true : false;
if (flickHorizontal)
{
if(abs(inXVelocity) > 300)
{
//FIXME: this 500 is a bit arbitrary
int numCards = (magnitude / 500) % 8;
mView->changePositionAnimated(flickRight ? numCards : - numCards);
}
}
else
{
if(abs(inYVelocity) > 300)
{
//FIXME: this 500 is a bit arbitrary
int numFilters = (magnitude / 500);
mView->changeFilterAnimated(flickUp ? numFilters : - numFilters);
}
}
last_user_activity = 0;
}