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

@@ -7,6 +7,7 @@
#include "../include/Translate.h"
#include "../include/ManaCostHybrid.h"
#include "../include/MTGCardInstance.h"
#include "../include/WFilter.h"
#include <vector>
@@ -29,47 +30,78 @@ void StringExplode(string str, string separator, vector<string>* results){
GameStateDeckViewer::GameStateDeckViewer(GameApp* parent): GameState(parent) {
bgMusic = NULL;
scrollSpeed = MED_SPEED;
nbDecks = 0;
deckNum = 0;
useFilter[0] = 0;
useFilter[1] = 0;
mSwitching = false;
welcome_menu = NULL;
myCollection = NULL;
myDeck = NULL;
filterDeck = NULL;
filterCollection = NULL;
}
GameStateDeckViewer::~GameStateDeckViewer() {
SAFE_DELETE(bgMusic);
SAFE_DELETE(myDeck);
SAFE_DELETE(myCollection);
SAFE_DELETE(filterDeck);
SAFE_DELETE(filterCollection);
}
void GameStateDeckViewer::rotateCards(int direction){
int maxCards=displayed_deck->getCount(colorFilter);
if (maxCards==0)
return;
int left = direction;
if (left){
MTGCard * currentCard = displayed_deck->getNext(cardIndex[6],colorFilter);
for (int i = 1; i<7; i++){
cardIndex[i-1] = cardIndex[i];
}
cardIndex[6] = currentCard;
}else{
MTGCard * currentCard = displayed_deck->getPrevious(cardIndex[0],colorFilter);
for (int i = 5; i>=0; i--){
cardIndex[i+1] = cardIndex[i];
}
cardIndex[0] = currentCard;
}
if (left)
displayed_deck->next();
else
displayed_deck->prev();
loadIndexes();
}
void GameStateDeckViewer::updateFilters(){
displayed_deck->clearFilters();
int i = (displayed_deck == myDeck);
void GameStateDeckViewer::loadIndexes(MTGCard * current){
for (int i = 0; i < 7; i++){
cardIndex[i] = NULL;
if(useFilter[i] == 0){
if(i && filterDeck)
filterDeck->Finish();
else if(filterCollection)
filterCollection->Finish();
return;
}
MTGCard * _current = current;
_current = displayed_deck->getNext(NULL,colorFilter);
WCFilterFactory * wc = WCFilterFactory::GetInstance();
switch(useFilter[i]-1){
case Constants::MTG_COLOR_ARTIFACT:
displayed_deck->addFilter(wc->Construct("c:x;"));
break;
case Constants::MTG_COLOR_GREEN:
displayed_deck->addFilter(wc->Construct("c:g;"));
break;
case Constants::MTG_COLOR_BLUE:
displayed_deck->addFilter(wc->Construct("c:u;"));
break;
case Constants::MTG_COLOR_RED:
displayed_deck->addFilter(wc->Construct("c:r;"));
break;
case Constants::MTG_COLOR_BLACK:
displayed_deck->addFilter(wc->Construct("c:b;"));
break;
case Constants::MTG_COLOR_WHITE:
displayed_deck->addFilter(wc->Construct("c:w;"));
break;
case Constants::MTG_COLOR_LAND:
displayed_deck->addFilter(wc->Construct("t:Land;"));
break;
}
//No sanity checking for color filters
//if(!displayed_deck->Size())
// displayed_deck->clearFilters();
}
void GameStateDeckViewer::loadIndexes(){
int x=0;
for (int i = 0; i < 7; i++){
cardIndex[i] = _current;
_current = displayed_deck->getNext(_current,colorFilter);
cardIndex[i] = displayed_deck->getCard(i);
}
}
@@ -80,6 +112,7 @@ void GameStateDeckViewer::switchDisplay(){
displayed_deck = myCollection;
}
currentCard = NULL;
updateFilters();
loadIndexes();
}
@@ -103,7 +136,9 @@ void GameStateDeckViewer::Start()
pricelist = NEW PriceList(RESPATH"/settings/prices.dat",mParent->collection);
playerdata = NEW PlayerData(mParent->collection);
sellMenu = NULL;
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), mParent->collection));
MTGDeck * myC = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), mParent->collection);
myCollection = NEW DeckDataWrapper(myC);
myCollection->Sort(WSrcCards::SORT_ALPHA);
displayed_deck = myCollection;
myDeck = NULL;
@@ -113,6 +148,7 @@ void GameStateDeckViewer::Start()
menu->Add(2,"Switch decks without saving");
if(options[Options::CHEATMODE].number)
menu->Add(-1,"*Complete collection & reset*");
menu->Add(22,"Filter by...");
menu->Add(3,"Back to main menu");
menu->Add(4,"Cancel");
@@ -154,16 +190,14 @@ void GameStateDeckViewer::Start()
JSoundSystem::GetInstance()->PlayMusic(GameApp::music, true);
}
}
colorFilter = ALL_COLORS;
mStage = STAGE_WELCOME;
mRotation = 0;
mSlide = 0;
mAlpha = 255;
currentCard = NULL;
loadIndexes(currentCard);
loadIndexes();
last_user_activity = NO_USER_ACTIVITY_HELP_DELAY + 1;
onScreenTransition = 0;
@@ -187,30 +221,30 @@ void GameStateDeckViewer::End()
SAFE_DELETE(myDeck);
SAFE_DELETE(pricelist);
SAFE_DELETE(playerdata);
SAFE_DELETE(filterDeck);
SAFE_DELETE(filterCollection);
}
void GameStateDeckViewer::addRemove(MTGCard * card){
if (!card) return;
if (displayed_deck->Remove(card)){
if (displayed_deck->Remove(card,1,(displayed_deck==myDeck))){
if (displayed_deck == myCollection){
myDeck->Add(card);
myDeck->Sort(WSrcCards::SORT_ALPHA);
}else{
myCollection->Add(card);
}
}
stw.needUpdate = true;
loadIndexes();
}
int GameStateDeckViewer::Remove(MTGCard * card){
if (!card) return 0;
int result = displayed_deck->Remove(card);
return result;
}
void GameStateDeckViewer::Update(float dt)
{
int myD = (displayed_deck == myDeck);
if(options.keypadActive()){
options.keypadUpdate(dt);
@@ -244,25 +278,27 @@ void GameStateDeckViewer::Update(float dt)
{
case PSP_CTRL_LEFT :
last_user_activity = 0;
currentCard = displayed_deck->getNext(currentCard,colorFilter);
currentCard = displayed_deck->getCard(1);
mStage = STAGE_TRANSITION_LEFT;
break;
case PSP_CTRL_RIGHT :
last_user_activity = 0;
currentCard = displayed_deck->getPrevious(currentCard,colorFilter);
currentCard = displayed_deck->getCard(-1);
mStage = STAGE_TRANSITION_RIGHT;
break;
case PSP_CTRL_UP :
last_user_activity = 0;
mStage = STAGE_TRANSITION_UP;
colorFilter--;
if (colorFilter < -1) colorFilter = Constants::MTG_COLOR_LAND;
useFilter[myD]++;
if(useFilter[myD] >= MAX_SAVED_FILTERS)
useFilter[myD] = 0;
break;
case PSP_CTRL_DOWN :
last_user_activity = 0;
mStage = STAGE_TRANSITION_DOWN;
colorFilter ++;
if (colorFilter > Constants::MTG_COLOR_LAND) colorFilter =-1;
useFilter[myD]--;
if(useFilter[myD] < 0)
useFilter[myD] = MAX_SAVED_FILTERS-1;
break;
case PSP_CTRL_TRIANGLE:
options[Options::DISABLECARDS].number = !options[Options::DISABLECARDS].number;
@@ -284,7 +320,7 @@ void GameStateDeckViewer::Update(float dt)
char buffer[4096];
{
MTGCard * card = cardIndex[2];
if (card && displayed_deck->cards[card]){
if (card && displayed_deck->count(card)){
int rnd = (rand() % 20);
price = pricelist->getPrice(card->getMTGId()) / 2;
price = price - price * (rnd -10)/100;
@@ -308,12 +344,16 @@ void GameStateDeckViewer::Update(float dt)
mStage = STAGE_MENU;
break;
case PSP_CTRL_SELECT :
if (scrollSpeed == HIGH_SPEED)
scrollSpeed = MED_SPEED;
else if (scrollSpeed == MED_SPEED)
scrollSpeed = LOW_SPEED;
else
scrollSpeed = HIGH_SPEED;
mStage = STAGE_FILTERS;
if(displayed_deck == myDeck){
if(!filterDeck)
filterDeck = NEW WGuiFilters("Filter by...",myDeck);
filterDeck->Entering(0);
}else if(displayed_deck == myCollection){
if(!filterCollection)
filterCollection = NEW WGuiFilters("Filter by...",myCollection);
filterCollection->Entering(0);
}
break;
case PSP_CTRL_LTRIGGER :
if (last_user_activity < NO_USER_ACTIVITY_HELP_DELAY){
@@ -350,7 +390,7 @@ void GameStateDeckViewer::Update(float dt)
} if (mStage == STAGE_TRANSITION_RIGHT || mStage == STAGE_TRANSITION_LEFT) {
if (mStage == STAGE_TRANSITION_RIGHT){
mRotation -= dt * scrollSpeed;
mRotation -= dt * MED_SPEED;
if (mRotation < -1.0f){
do {
rotateCards(mStage);
@@ -360,7 +400,7 @@ void GameStateDeckViewer::Update(float dt)
mRotation = 0;
}
}else if(mStage == STAGE_TRANSITION_LEFT){
mRotation += dt * scrollSpeed;
mRotation += dt * MED_SPEED;
if (mRotation > 1.0f){
do {
rotateCards(mStage);
@@ -374,7 +414,8 @@ void GameStateDeckViewer::Update(float dt)
if (mStage == STAGE_TRANSITION_DOWN){
mSlide -= 0.05f;
if (mSlide < -1.0f){
loadIndexes(currentCard);
updateFilters();
loadIndexes();
mSlide = 1;
}else if (mSlide > 0 && mSlide < 0.05){
mStage = STAGE_WAITING;
@@ -383,7 +424,8 @@ void GameStateDeckViewer::Update(float dt)
} if (mStage == STAGE_TRANSITION_UP){
mSlide += 0.05f;
if (mSlide > 1.0f){
loadIndexes(currentCard);
updateFilters();
loadIndexes();
mSlide = -1;
}else if (mSlide < 0 && mSlide > -0.05){
mStage = STAGE_WAITING;
@@ -396,6 +438,44 @@ void GameStateDeckViewer::Update(float dt)
welcome_menu->Update(dt);
}else if (mStage == STAGE_MENU){
menu->Update(dt);
}else if(mStage == STAGE_FILTERS){
u32 key = mEngine->ReadButton();
if(displayed_deck == myDeck){
if(filterDeck){
if(key == PSP_CTRL_SELECT){
useFilter[(displayed_deck == myDeck)] = 0;
filterDeck->Finish();
filterDeck->Update(dt);
loadIndexes();
return;
}
if(!filterDeck->isFinished()){
filterDeck->CheckUserInput(key);
filterDeck->Update(dt);
} else {
mStage = STAGE_WAITING;
loadIndexes();
}
}
}else{
if(filterCollection ){
if(key == PSP_CTRL_SELECT){
useFilter[(displayed_deck == myDeck)] = 0;
filterCollection->Finish();
filterCollection->Update(dt);
loadIndexes();
return;
}
if(!filterCollection->isFinished()){
filterCollection->CheckUserInput(key);
filterCollection->Update(dt);
} else {
mStage = STAGE_WAITING;
loadIndexes();
}
}
}
}
@@ -404,43 +484,37 @@ void GameStateDeckViewer::Update(float dt)
void GameStateDeckViewer::renderOnScreenBasicInfo(){
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
char buffer[30], buffer2[30];
char buffer[256];
int myD = (displayed_deck == myDeck);
float y = 0;
JRenderer::GetInstance()->FillRoundRect(SCREEN_WIDTH-125,y-5,110,15,5,ARGB(128,0,0,0));
sprintf(buffer, "DECK: %i", myDeck->getCount());
mFont->DrawString(buffer, SCREEN_WIDTH-120 , y);
if (colorFilter != ALL_COLORS){
sprintf(buffer2, "( %i)", myDeck->getCount(colorFilter));
mFont->DrawString(buffer2, SCREEN_WIDTH-55 , y);
JRenderer::GetInstance()->RenderQuad(mIcons[colorFilter], SCREEN_WIDTH-42 , y + 6 , 0.0f,0.5,0.5);
}
int now, total;
now = displayed_deck->Size();
total = displayed_deck->Size(true);
if(now != total)
sprintf(buffer, "%s%i of %i (%i cards)", (displayed_deck == myDeck) ? "DECK: " : " ", now, total,displayed_deck->totalCopies());
else
sprintf(buffer, "%s%i (%i cards)", (displayed_deck == myDeck) ? "DECK: " : " " , total,displayed_deck->totalCopies());
mFont->DrawString(buffer, SCREEN_WIDTH-22, y+5,JGETEXT_RIGHT);
if (useFilter[myD] != 0)
JRenderer::GetInstance()->RenderQuad(mIcons[useFilter[myD]-1], SCREEN_WIDTH-10 , y + 10 , 0.0f,0.5,0.5);
}
void GameStateDeckViewer::renderSlideBar(){
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
int total = displayed_deck->getCount(colorFilter);
int total = displayed_deck->Size();
float filler = 15;
float y = SCREEN_HEIGHT_F-25;
float bar_size = SCREEN_WIDTH_F - 2*filler;
JRenderer * r = JRenderer::GetInstance();
typedef map<MTGCard *,int,Cmp1>::reverse_iterator rit;
int currentPos = 0;
{
rit end = rit(displayed_deck->cards.begin());
rit it = rit(displayed_deck->cards.find(cardIndex[2]));
if (-1 == colorFilter)
for (; it != end; ++it)
currentPos += it->second;
else
for (; it != end; ++it)
if (it->first->data->hasColor(colorFilter)) currentPos += it->second;
}
int currentPos = displayed_deck->getOffset();
if(total == 0)
return;
currentPos = abs(currentPos) % total;
float cursor_pos = bar_size * currentPos / total;
r->FillRoundRect(filler + 5,y+5,bar_size,0,3,ARGB(hudAlpha/2,0,0,0));
@@ -530,8 +604,8 @@ void GameStateDeckViewer::renderOnScreenMenu(){
font->DrawString(_("Next"), leftPspX + 15, leftPspY-15);
font->DrawString(_("card"), leftPspX - 35, leftPspY);
font->DrawString(_("card"), leftPspX + 15, leftPspY);
font->DrawString(_("Next color"), leftPspX - 33, leftPspY - 35);
font->DrawString(_("Prev. color"), leftPspX -33 , leftPspY +25);
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));
@@ -552,6 +626,7 @@ void GameStateDeckViewer::renderOnScreenMenu(){
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);
@@ -596,6 +671,7 @@ void GameStateDeckViewer::renderOnScreenMenu(){
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));
font->DrawString(_("menu"), SCREEN_WIDTH-35 +rightTransition, SCREEN_HEIGHT-15);
font->DrawString(_("filter"), SCREEN_WIDTH-95 +rightTransition, SCREEN_HEIGHT-15);
int nb_letters = 0;
float posX, posY;
@@ -1021,7 +1097,7 @@ void GameStateDeckViewer::updateStats() {
stw.totalManaCost = 0;
stw.totalCreatureCost = 0;
stw.totalSpellCost = 0;
MTGCard * current = myDeck->getNext();
MTGCard * current = myDeck->getCard();
// Clearing arrays
for (int i=0; i<=STATS_MAX_MANA_COST; i++) {
@@ -1045,10 +1121,11 @@ void GameStateDeckViewer::updateStats() {
}
}
while (current){
for(int ic=0;ic<myDeck->Size();ic++){
current = myDeck->getCard(ic);
currentCost = current->data->getManaCost();
convertedCost = currentCost->getConvertedCost();
currentCount = myDeck->cards[current];
currentCount = myDeck->count(current);
// Add to the cards per cost counters
stw.totalManaCost += convertedCost * currentCount;
@@ -1133,9 +1210,6 @@ void GameStateDeckViewer::updateStats() {
stw.totalCostPerColor[hybridCost->color1] += hybridCost->value1*currentCount;
stw.totalCostPerColor[hybridCost->color2] += hybridCost->value2*currentCount;
}
current = myDeck->getNext(current);
}
stw.totalColoredSymbols = 0;
@@ -1172,13 +1246,11 @@ void GameStateDeckViewer::updateStats() {
// or at least be calculated for all common types in one go
int GameStateDeckViewer::countCardsByType(const char * _type) {
int result = 0;
MTGCard * current = myDeck->getNext();
while (current){
for(int i=0;i<myDeck->Size();i++){
MTGCard * current = myDeck->getCard(i);
if(current->data->hasType(_type)){
result += myDeck->cards[current];
result += myDeck->count(current);
}
current = myDeck->getNext(current);
}
return result;
}
@@ -1221,7 +1293,7 @@ void GameStateDeckViewer::renderCard(int id, float rotation){
if (quad){
showName = 0;
int quadAlpha = alpha;
if ( !displayed_deck->cards[card]) quadAlpha /=2;
if ( !displayed_deck->count(card)) quadAlpha /=2;
quad->SetColor(ARGB(mAlpha,quadAlpha,quadAlpha,quadAlpha));
float _scale = scale *(285 / quad->mHeight);
JRenderer::GetInstance()->RenderQuad(quad, x , y , 0.0f,_scale,_scale);
@@ -1249,7 +1321,7 @@ void GameStateDeckViewer::renderCard(int id, float rotation){
float qtY = y -135*scale;
float qtX = x + 40*scale;
char buffer[4096];
sprintf(buffer, "x%i", displayed_deck->cards[card]);
sprintf(buffer, "x%i", displayed_deck->count(card));
JLBFont * font = mFont;
font->SetColor(ARGB(fontAlpha/2,0,0,0));
JRenderer::GetInstance()->FillRect(qtX, qtY,font->GetStringWidth(buffer) + 6,16,ARGB(fontAlpha/2,0,0,0));
@@ -1271,15 +1343,8 @@ void GameStateDeckViewer::Render() {
JRenderer * r = JRenderer::GetInstance();
r->ClearScreen(ARGB(0,0,0,0));
if(displayed_deck == myDeck){
if(displayed_deck == myDeck)
renderDeckBackground();
}
int order[3] = {1,2,3};
if (mRotation < 0.5 && mRotation > -0.5){
order[1]=3;
@@ -1298,7 +1363,7 @@ void GameStateDeckViewer::Render() {
renderCard(order[i],mRotation);
}
if (displayed_deck->getCount(colorFilter)>0){
if (displayed_deck->Size()>0){
renderSlideBar();
}else{
mFont->DrawString(_("No Card"), SCREEN_WIDTH/2, SCREEN_HEIGHT/2,JGETEXT_CENTER);
@@ -1317,19 +1382,30 @@ void GameStateDeckViewer::Render() {
}
if (sellMenu) sellMenu->Render();
if(displayed_deck == myDeck){
if(filterDeck && !filterDeck->isFinished())
filterDeck->Render();
}else{
if(filterCollection && !filterCollection->isFinished())
filterCollection->Render();
}
if(options.keypadActive())
options.keypadRender();
}
int GameStateDeckViewer::loadDeck(int deckid){
SAFE_DELETE(myCollection);
stw.currentPage = 0;
stw.pageCount = 9;
stw.needUpdate = true;
string profile = options[Options::ACTIVE_PROFILE].str;
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), mParent->collection));
//string profile = options[Options::ACTIVE_PROFILE].str;
//SAFE_DELETE(myCollection);
//myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), mParent->collection));
displayed_deck = myCollection;
char deckname[256];
sprintf(deckname,"deck%i.txt",deckid);
@@ -1337,24 +1413,18 @@ int GameStateDeckViewer::loadDeck(int deckid){
myDeck = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(deckname,"",false,false).c_str(), mParent->collection));
// Check whether the cards in the deck are actually available in the player's collection:
MTGCard * current = myDeck->getNext();
int cheatmode = options[Options::CHEATMODE].number;
while (current){
int howmanyinDeck = myDeck->cards[current];
for (int i = 0; i < howmanyinDeck; i++){
int deleted = myCollection->Remove(current);
if (!deleted){ // Card was not present in the collection
if (cheatmode) { // (PSY) Are we in cheatmode?
playerdata->collection->add(current); // (PSY) Yes - add the card to the collection
} else {
myDeck->Remove(current); // No - remove the card from the deck
}
}
for(int i=0;i<myDeck->Size();i++){
MTGCard * current = myDeck->getCard(i);
int howmanyinDeck = myDeck->count(current);
for (int i = myCollection->count(current); i < howmanyinDeck; i++){
if(cheatmode) //Are we cheating?
playerdata->collection->add(current); //Yup, add it to collection.
else
myDeck->Remove(current); //Nope. Remove it from deck.
}
current = myDeck->getNext(current);
}
currentCard = NULL;
loadIndexes();
// Load deck statistics
// TODO: Code cleanup (Copypasted with slight changes from GameStateMenu.cpp)
char buffer[512];
@@ -1400,6 +1470,9 @@ int GameStateDeckViewer::loadDeck(int deckid){
stw.gamesPlayed = 0;
stw.percentVictories = 0;
}
myDeck->Sort(WSrcCards::SORT_ALPHA);
loadIndexes();
return 1;
}
@@ -1451,6 +1524,18 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
case 4:
mStage = STAGE_WAITING;
break;
case 22:
mStage = STAGE_FILTERS;
if(displayed_deck == myDeck){
if(!filterDeck)
filterDeck = NEW WGuiFilters("Filter by...",myDeck);
filterDeck->Entering(0);
}else if(displayed_deck == myCollection){
if(!filterCollection)
filterCollection = NEW WGuiFilters("Filter by...",myCollection);
filterCollection->Entering(0);
}
break;
}
break;
case 2:
@@ -1464,7 +1549,8 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
price = price - (rnd * price)/100;
pricelist->setPrice(card->getMTGId(),price*2);
playerdata->collection->remove(card->getMTGId());
Remove(card);
displayed_deck->Remove(card,1);
loadIndexes();
}
}
case 21: