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:
@@ -276,7 +276,7 @@ void CardGui::alternateRender(MTGCard * card, const Pos& pos){
|
||||
#ifdef _DEBUG
|
||||
else{
|
||||
char buf[2048];
|
||||
sprintf(buf, "\n==\nTypeless card: %s %s\n", setlist[card->setId].c_str(), card->data->getName().c_str());
|
||||
sprintf(buf, "Typeless card: %s %s (%i)\n", setlist[card->setId].c_str(), card->data->getName().c_str(), card->getId());
|
||||
OutputDebugString(buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "../include/Translate.h"
|
||||
#include "../include/MTGDeck.h"
|
||||
#include "../include/GameObserver.h"
|
||||
#include "../include/GameStateShop.h"
|
||||
|
||||
CreditBonus::CreditBonus(int _value, string _text){
|
||||
value = _value;
|
||||
@@ -150,6 +151,7 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app){
|
||||
|
||||
|
||||
playerdata->credits += value;
|
||||
GameStateShop::passOneDay();
|
||||
playerdata->taskList->passOneDay();
|
||||
if (playerdata->taskList->getTaskCount() < 6) {
|
||||
playerdata->taskList->addRandomTask();
|
||||
|
||||
@@ -2,180 +2,67 @@
|
||||
#include "../include/DeckDataWrapper.h"
|
||||
#include "../include/MTGDeck.h"
|
||||
#include "../include/PriceList.h"
|
||||
#include "../include/WDataSrc.h"
|
||||
|
||||
DeckDataWrapper::DeckDataWrapper(MTGDeck * deck){
|
||||
parent = deck;
|
||||
for (int i = 0; i <= Constants::MTG_NB_COLORS; i++){
|
||||
colors[i] = 0;
|
||||
}
|
||||
parent = deck;
|
||||
for(int c=0;c<Constants::MTG_NB_COLORS;c++)
|
||||
counts[c] = 0;
|
||||
Add(deck);
|
||||
|
||||
currentColor = -1;
|
||||
}
|
||||
|
||||
int DeckDataWrapper::Add(MTGDeck * deck){
|
||||
map<int,int>::iterator it;
|
||||
for (it = deck->cards.begin(); it!=deck->cards.end(); it++){
|
||||
MTGCard * card = deck->getCardById(it->first);
|
||||
Add(card,it->second);
|
||||
}
|
||||
return 1;
|
||||
if(loadMatches(deck))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
int DeckDataWrapper::Remove(MTGCard * c, int quantity,bool erase){
|
||||
if(WSrcDeck::Remove(c,quantity,erase)){
|
||||
for(int i=0;i<Constants::MTG_NB_COLORS;i++){
|
||||
if(c->data->hasColor(i))
|
||||
counts[i]-=quantity;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int DeckDataWrapper::Add(MTGCard * c, int quantity){
|
||||
if(WSrcDeck::Add(c,quantity)){
|
||||
for(int i=0;i<Constants::MTG_NB_COLORS;i++){
|
||||
if(c->data && c->data->hasColor(i))
|
||||
counts[i]+=quantity;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int DeckDataWrapper::getCount(int color){
|
||||
if(color < 0 || color >=Constants::MTG_NB_COLORS)
|
||||
return Size(true);
|
||||
return counts[color];
|
||||
}
|
||||
void DeckDataWrapper::updateCounts(){
|
||||
map<int,int>::iterator it;
|
||||
for(int c=0;c<Constants::MTG_NB_COLORS;c++)
|
||||
counts[c] = 0;
|
||||
|
||||
void DeckDataWrapper::save(){
|
||||
parent->removeAll();
|
||||
map<MTGCard *,int,Cmp1>::iterator it;
|
||||
for ( it=cards.begin() ; it != cards.end(); it++ ){
|
||||
MTGCard * current = (*it).first;
|
||||
for (int i = 0; i < (*it).second; i++){
|
||||
parent->add(current);
|
||||
for(int i=0;i<Size(true);i++){
|
||||
for(int c=0;c<Constants::MTG_NB_COLORS;c++){
|
||||
MTGCard * card = getCard(c,true);
|
||||
if(card->data->hasColor(c)){
|
||||
it = copies.find(card->getMTGId());
|
||||
if(it != copies.end())
|
||||
counts[c]+=it->second;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void DeckDataWrapper::save(){
|
||||
Rebuild(parent);
|
||||
parent->save();
|
||||
}
|
||||
|
||||
|
||||
DeckDataWrapper::~DeckDataWrapper(){
|
||||
SAFE_DELETE(parent);
|
||||
}
|
||||
|
||||
void DeckDataWrapper::updateCounts(MTGCard * card, int increment){
|
||||
if (!card){
|
||||
for (int i = 0; i < Constants::MTG_NB_COLORS+1; i++){
|
||||
colors[i] = 0;
|
||||
}
|
||||
map<MTGCard *,int,Cmp1>::iterator it;
|
||||
for ( it=cards.begin() ; it != cards.end(); it++ ){
|
||||
MTGCard * current = (*it).first;
|
||||
colors[Constants::MTG_NB_COLORS] += (*it).second;
|
||||
for (int i = 0; i < Constants::MTG_NB_COLORS; i++){
|
||||
if (current->data->hasColor(i)) colors[i]+=(*it).second;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
colors[Constants::MTG_NB_COLORS] += increment;
|
||||
for (int i = 0; i < Constants::MTG_NB_COLORS; i++){
|
||||
if (card->data->hasColor(i)) colors[i]+=increment;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int DeckDataWrapper::Add(MTGCard * card, int quantity){
|
||||
if(cards.find(card) == cards.end()){
|
||||
cards[card] = quantity;
|
||||
}else{
|
||||
cards[card]+= quantity;
|
||||
}
|
||||
updateCounts(card,quantity);
|
||||
return cards[card];
|
||||
}
|
||||
|
||||
int DeckDataWrapper::Remove(MTGCard * card){
|
||||
if(cards.find(card) == cards.end() || cards[card] <= 0) return 0;
|
||||
cards[card]--;
|
||||
updateCounts(card,-1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int DeckDataWrapper::count(MTGCard * card){
|
||||
if(cards.find(card) == cards.end()){
|
||||
cards[card] = 0;
|
||||
}
|
||||
return cards[card];
|
||||
}
|
||||
|
||||
int DeckDataWrapper::countByName(MTGCard * card){
|
||||
string name = card->data->name;
|
||||
int total = 0;
|
||||
map<MTGCard *,int,Cmp1>::iterator it,it_origin;
|
||||
it = cards.find(card);
|
||||
if(it == cards.end()){
|
||||
cards[card] = 0;
|
||||
it = cards.find(card);
|
||||
}
|
||||
it_origin = it;
|
||||
|
||||
while(it !=cards.end()){
|
||||
MTGCard * _card = (*it).first;
|
||||
if (name.compare(_card->data->name) !=0){
|
||||
it = cards.end();
|
||||
}else{
|
||||
total+= (*it).second;
|
||||
it++;
|
||||
}
|
||||
}
|
||||
|
||||
it = cards.find(card);
|
||||
if (it == cards.begin()) return total;
|
||||
it--;
|
||||
while(1){
|
||||
MTGCard * _card = (*it).first;
|
||||
if (name.compare(_card->data->name) !=0){
|
||||
break;
|
||||
}else{
|
||||
total+= (*it).second;
|
||||
if (it == cards.begin()) break;
|
||||
it--;
|
||||
|
||||
}
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
|
||||
MTGCard * DeckDataWrapper::getNext(MTGCard * previous, int color){
|
||||
map<MTGCard *,int,Cmp1>::iterator it;
|
||||
|
||||
it = cards.find(previous);
|
||||
|
||||
while(1){
|
||||
if (it == cards.end()){
|
||||
it = cards.begin();
|
||||
}else{
|
||||
it++;
|
||||
}
|
||||
if (it == cards.end()) return NULL;
|
||||
MTGCard * card = (*it).first;
|
||||
if (card == previous) return NULL;
|
||||
if ((*it).second >0 && (color ==-1 || card->data->hasColor(color))){
|
||||
return card;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MTGCard * DeckDataWrapper::getPrevious(MTGCard * next, int color){
|
||||
map<MTGCard *,int,Cmp1>::iterator it;
|
||||
it = cards.find(next);
|
||||
|
||||
while(1){
|
||||
if (it == cards.begin()){
|
||||
it = cards.end();
|
||||
}else{
|
||||
it--;
|
||||
}
|
||||
if (it == cards.end()) return NULL;
|
||||
MTGCard * card = (*it).first;
|
||||
if (card == next) return NULL;
|
||||
if ((*it).second >0 && (color ==-1 || card->data->hasColor(color))){
|
||||
return card;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int DeckDataWrapper::getCount(int color){
|
||||
if (color == -1) return colors[Constants::MTG_NB_COLORS];
|
||||
return colors[color];
|
||||
}
|
||||
|
||||
int DeckDataWrapper::totalPrice(){
|
||||
int total = 0;
|
||||
PriceList * pricelist = NEW PriceList(RESPATH"/settings/prices.dat",this->parent->database);
|
||||
map<MTGCard *,int,Cmp1>::iterator it;
|
||||
for ( it=cards.begin() ; it != cards.end(); it++ ){
|
||||
MTGCard * current = (*it).first;
|
||||
int nb = (*it).second;
|
||||
if (nb) total += pricelist->getPrice(current->getMTGId());
|
||||
}
|
||||
delete pricelist;
|
||||
return total;
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "../include/DeckStats.h"
|
||||
#include "../include/DeckMetaData.h"
|
||||
#include "../include/Translate.h"
|
||||
#include "../include/WFilter.h"
|
||||
|
||||
#define DEFAULT_DURATION .25
|
||||
|
||||
@@ -233,7 +234,7 @@ void GameApp::Destroy()
|
||||
|
||||
SAFE_DELETE(music);
|
||||
Translator::EndInstance();
|
||||
|
||||
WCFilterFactory::Destroy();
|
||||
SimpleMenu::destroy();
|
||||
|
||||
options.theGame = NULL;
|
||||
|
||||
@@ -210,20 +210,23 @@ bool GameStateAwards::enterSet(int setid){
|
||||
SAFE_DELETE(detailview);
|
||||
SAFE_DELETE(setSrc);
|
||||
|
||||
setSrc = NEW WSrcMTGSet(setid);
|
||||
setSrc = NEW WSrcCards();
|
||||
setSrc->addFilter(NEW WCFilterSet(setid));
|
||||
setSrc->loadMatches(mParent->collection);
|
||||
setSrc->bakeFilters();
|
||||
setSrc->Sort(WSrcCards::SORT_COLLECTOR);
|
||||
|
||||
detailview = NEW WGuiMenu(PSP_CTRL_DOWN,PSP_CTRL_UP);
|
||||
|
||||
WGuiList * spoiler = NEW WGuiList("Spoiler",setSrc);
|
||||
spoiler->setX(210);
|
||||
spoiler->setWidth(SCREEN_WIDTH - 220);
|
||||
while(true){
|
||||
MTGCard * c = setSrc->getCard();
|
||||
for(int t=0;t<setSrc->Size();t++){
|
||||
MTGCard * c = setSrc->getCard(t);
|
||||
if(c)
|
||||
spoiler->Add(NEW WGuiItem(c->data->name));
|
||||
if(!setSrc->next())
|
||||
break;
|
||||
}
|
||||
setSrc->setPos(0);
|
||||
setSrc->setOffset(0);
|
||||
spoiler->Entering(0);
|
||||
WGuiCardImage * wi = NEW WGuiCardImage(setSrc);
|
||||
wi->setX(105);
|
||||
@@ -257,18 +260,18 @@ bool GameStateAwards::enterStats(int option){
|
||||
MTGCard * costly = NULL;
|
||||
MTGCard * strong = NULL;
|
||||
MTGCard * tough = NULL;
|
||||
map<MTGCard *,int,Cmp1>::iterator it;
|
||||
|
||||
for (it = ddw->cards.begin(); it!=ddw->cards.end(); it++){
|
||||
MTGCard * c = it->first;
|
||||
for (int t=0;t<ddw->Size();t++){
|
||||
MTGCard * c = ddw->getCard(t);
|
||||
if(!c)
|
||||
continue;
|
||||
if(!c->data->isLand() && (many == NULL || it->second > dupes)){
|
||||
int count = ddw->count(c);
|
||||
if(!c->data->isLand() && (many == NULL || count > dupes)){
|
||||
many = c;
|
||||
dupes = it->second;
|
||||
dupes = count;
|
||||
}
|
||||
unique++;
|
||||
counts[c->setId]+=it->second;
|
||||
counts[c->setId]+=count;
|
||||
if(costly == NULL
|
||||
|| c->data->getManaCost()->getConvertedCost() > costly->data->getManaCost()->getConvertedCost())
|
||||
costly = c;
|
||||
@@ -290,7 +293,7 @@ bool GameStateAwards::enterStats(int option){
|
||||
sprintf(buf,_("Total Value: %ic").c_str(),ddw->totalPrice());
|
||||
detailview->Add(NEW WGuiItem(buf,WGuiItem::NO_TRANSLATE));//ddw->colors
|
||||
|
||||
sprintf(buf,_("Total Cards (including duplicates): %i").c_str(),ddw->getCount());
|
||||
sprintf(buf,_("Total Cards (including duplicates): %i").c_str(),ddw->totalCopies());
|
||||
detailview->Add(NEW WGuiItem(buf,WGuiItem::NO_TRANSLATE));//ddw->colors
|
||||
|
||||
sprintf(buf,_("Unique Cards: %i").c_str(),unique);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -377,7 +377,6 @@ void GameStateMenu::Update(float dt)
|
||||
if (!nextDirectory(RESPATH"/sets/","_cards.dat")){
|
||||
//Remove temporary translations
|
||||
Translator::GetInstance()->tempValues.clear();
|
||||
|
||||
//Debug
|
||||
#ifdef _DEBUG
|
||||
char buf[4096];
|
||||
|
||||
+503
-104
@@ -8,35 +8,100 @@
|
||||
#include "../include/MTGDeck.h"
|
||||
#include "../include/Translate.h"
|
||||
#include "../include/GameOptions.h"
|
||||
#include <hge/hgedistort.h>
|
||||
|
||||
float GameStateShop::_x1[] = { 79, 19, 27,103,154,187,102,144,198,133,183};
|
||||
float GameStateShop::_y1[] = {150,194,222,167,164,156,195,190,175,220,220};
|
||||
|
||||
float GameStateShop::_x2[] = {103, 48, 74,135,183,215,138,181,231,171,225};
|
||||
float GameStateShop::_y2[] = {155,179,218,165,166,155,195,186,177,225,216};
|
||||
|
||||
float GameStateShop::_x3[] = { 48, 61, 9, 96,139,190, 81,146,187, 97,191};
|
||||
float GameStateShop::_y3[] = {164,205,257,184,180,170,219,212,195,251,252};
|
||||
|
||||
float GameStateShop::_x4[] = { 76, 90, 65,131,171,221,123,187,225,141,237};
|
||||
float GameStateShop::_y4[] = {169,188,250,182,182,168,220,208,198,259,245};
|
||||
|
||||
int GameStateShop::randomKey = 0;
|
||||
|
||||
GameStateShop::GameStateShop(GameApp* parent): GameState(parent) {
|
||||
shop = NULL;
|
||||
menu = NULL;
|
||||
for(int i=0;i<8;i++)
|
||||
altThumb[i] = NULL;
|
||||
mBack = NULL;
|
||||
boosterDisplay = NULL;
|
||||
mBg = NULL;
|
||||
mBgTex = NULL;
|
||||
taskList = NULL;
|
||||
menu = NULL;
|
||||
srcCards = NULL;
|
||||
shopMenu = NULL;
|
||||
bigDisplay = NULL;
|
||||
myCollection = NULL;
|
||||
pricelist = NULL;
|
||||
playerdata = NULL;
|
||||
booster = NULL;
|
||||
lightAlpha = 0;
|
||||
filterMenu = NULL;
|
||||
alphaChange = 0;
|
||||
for(int i=0;i<SHOP_ITEMS;i++){
|
||||
mPrices[i] = 0;
|
||||
mCounts[i] = 0;
|
||||
}
|
||||
mTouched = false;
|
||||
if(randomKey == 0)
|
||||
randomKey = rand();
|
||||
}
|
||||
|
||||
|
||||
GameStateShop::~GameStateShop() {
|
||||
End();
|
||||
End();
|
||||
}
|
||||
|
||||
void GameStateShop::Create(){
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void GameStateShop::Start()
|
||||
{
|
||||
void GameStateShop::Start(){
|
||||
menu = NULL;
|
||||
bListCards = false;
|
||||
mTouched = false;
|
||||
mStage = STAGE_FADE_IN;
|
||||
mElapsed = 0;
|
||||
booster = NULL;
|
||||
srcCards = NEW WSrcUnlockedCards(.25);
|
||||
srcCards->setElapsed(15);
|
||||
WCFilterFactory * wff = WCFilterFactory::GetInstance();
|
||||
|
||||
//srcCards->addFilter(wff->Construct("c:red;&t:instant;"));
|
||||
//srcCards->bakeFilters();
|
||||
|
||||
bigSync = 0;
|
||||
shopMenu = NEW WGuiMenu(PSP_CTRL_DOWN,PSP_CTRL_UP,true,&bigSync);
|
||||
MTGAllCards * ac = GameApp::collection;
|
||||
playerdata = NEW PlayerData(ac);;
|
||||
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), ac));
|
||||
pricelist = NEW PriceList(RESPATH"/settings/prices.dat",ac);
|
||||
for(int i=0;i<SHOP_SLOTS;i++){
|
||||
WGuiCardDistort * dist;
|
||||
if(i < BOOSTER_SLOTS)
|
||||
dist = NEW WGuiCardDistort(NULL,true);
|
||||
else{
|
||||
dist = NEW WGuiCardDistort(srcCards,true);
|
||||
dist->mOffset.setOffset(i-BOOSTER_SLOTS);
|
||||
}
|
||||
dist->xy = WDistort(_x1[i],_y1[i],_x2[i],_y2[i],_x3[i],_y3[i],_x4[i],_y4[i]);
|
||||
shopMenu->Add(NEW WGuiButton(dist,-102,i,this));
|
||||
}
|
||||
shopMenu->Entering(0);
|
||||
|
||||
if(!bigDisplay){
|
||||
bigDisplay = NEW WGuiCardImage(srcCards);
|
||||
bigDisplay->mOffset.Hook(&bigSync);
|
||||
bigDisplay->mOffset.setOffset(-BOOSTER_SLOTS);
|
||||
bigDisplay->setX(385);
|
||||
bigDisplay->setY(135);
|
||||
}
|
||||
|
||||
//alternateRender doesn't lock, so lock our thumbnails for hgeDistort.
|
||||
altThumb[0] = resources.RetrieveTexture("artifact_thumb.jpg", RETRIEVE_LOCK);
|
||||
altThumb[1] = resources.RetrieveTexture("green_thumb.jpg", RETRIEVE_LOCK);
|
||||
@@ -47,6 +112,7 @@ void GameStateShop::Start()
|
||||
altThumb[6] = resources.RetrieveTexture("land_thumb.jpg", RETRIEVE_LOCK);
|
||||
altThumb[7] = resources.RetrieveTexture("gold_thumb.jpg", RETRIEVE_LOCK);
|
||||
|
||||
|
||||
mBack = resources.GetQuad("back");
|
||||
resources.Unmiss("shop.jpg"); //Last resort.
|
||||
mBgTex = resources.RetrieveTexture("shop.jpg", RETRIEVE_LOCK, TEXTURE_SUB_5551);
|
||||
@@ -57,109 +123,294 @@ void GameStateShop::Start()
|
||||
|
||||
JRenderer::GetInstance()->EnableVSync(true);
|
||||
|
||||
shop = NULL;
|
||||
taskList = NULL;
|
||||
load();
|
||||
}
|
||||
|
||||
string GameStateShop::descPurchase(int controlId, bool tiny){
|
||||
char buffer[4096];
|
||||
string name;
|
||||
if(controlId < BOOSTER_SLOTS){
|
||||
if(mBooster[controlId].altSet == mBooster[controlId].mainSet)
|
||||
mBooster[controlId].altSet = 0;
|
||||
if(mBooster[controlId].altSet)
|
||||
sprintf(buffer,_("%s & %s Booster (15 Cards)").c_str(),mBooster[controlId].mainSet->id.c_str(),mBooster[controlId].altSet->id.c_str());
|
||||
else
|
||||
sprintf(buffer,_("%s Booster (15 Cards)").c_str(),mBooster[controlId].mainSet->id.c_str());
|
||||
name = buffer;
|
||||
}
|
||||
else{
|
||||
MTGCard * c = srcCards->getCard(controlId-BOOSTER_SLOTS);
|
||||
if(!c)
|
||||
return "";
|
||||
name = c->data->getName();
|
||||
}
|
||||
if(mInventory[controlId] <= 0){
|
||||
if(tiny)
|
||||
sprintf(buffer,_("SOLD OUT").c_str(),name.c_str());
|
||||
else
|
||||
sprintf(buffer,_("%s : SOLD OUT").c_str(),name.c_str());
|
||||
return buffer;
|
||||
}
|
||||
|
||||
if(tiny)
|
||||
return name;
|
||||
|
||||
if(mCounts[controlId] < 1)
|
||||
sprintf(buffer,_("%s : %i credits").c_str(),name.c_str(),mPrices[controlId]);
|
||||
else
|
||||
sprintf(buffer,_("%s (%i) : %i credits").c_str(),name.c_str(),mCounts[controlId],mPrices[controlId]);
|
||||
return buffer;
|
||||
}
|
||||
void GameStateShop::assembleBooster(int controlId){
|
||||
int mSet = -1;
|
||||
MTGSetInfo * si = setlist.randomSet(-1);
|
||||
mBooster[controlId].mainSet = si;
|
||||
mBooster[controlId].altSet = NULL;
|
||||
|
||||
int mSetCount = si->counts[MTGSetInfo::TOTAL_CARDS];
|
||||
if(mSetCount < 80){
|
||||
if(rand() % 100 < 50){ //50% Chance of picking a pure pack instead. Combo packs are more rare :)
|
||||
si = setlist.randomSet(-1,80);
|
||||
mSetCount = si->counts[MTGSetInfo::TOTAL_CARDS];
|
||||
mBooster[controlId].mainSet = si;
|
||||
}else
|
||||
mBooster[controlId].altSet = setlist.randomSet(si->block,mSetCount);
|
||||
}
|
||||
else {
|
||||
mBooster[controlId].altSet = NULL;
|
||||
if(rand() % 100 < 10) //10% chance of having a mixed booster anyways.
|
||||
mBooster[controlId].altSet = setlist.randomSet(si->block);
|
||||
}
|
||||
|
||||
for(int attempts=0;attempts<10;attempts++){
|
||||
if(mBooster[controlId].altSet != mBooster[controlId].mainSet)
|
||||
break;
|
||||
mBooster[controlId].altSet = setlist.randomSet(-1,mSetCount);
|
||||
}
|
||||
|
||||
int price = mBooster[controlId].mainSet->boosterCost();
|
||||
mInventory[controlId] = 2+rand()%4;
|
||||
if(mBooster[controlId].altSet != NULL){
|
||||
price += mBooster[controlId].altSet->boosterCost();
|
||||
price /= 2;
|
||||
price = price + .05 * price; //Mixed sets add a 5% premium.
|
||||
mInventory[controlId] = 1+rand()%2;
|
||||
}
|
||||
mPrices[controlId] = price;
|
||||
}
|
||||
void GameStateShop::beginPurchase(int controlId){
|
||||
JLBFont * mFont = resources.GetJLBFont(Constants::MENU_FONT);
|
||||
mFont->SetScale(DEFAULT_MENU_FONT_SCALE);
|
||||
SAFE_DELETE(menu);
|
||||
if(mInventory[controlId] <= 0){
|
||||
menu = NEW SimpleMenu(-145,this,Constants::MENU_FONT,SCREEN_WIDTH-300,SCREEN_HEIGHT/2,_("Sold Out").c_str());
|
||||
menu->Add(-1,"Ok");
|
||||
}
|
||||
else if(playerdata->credits - mPrices[controlId] < 0){
|
||||
menu = NEW SimpleMenu(-145,this,Constants::MENU_FONT,SCREEN_WIDTH-300,SCREEN_HEIGHT/2,_("Not enough credits").c_str());
|
||||
menu->Add(-1,"Ok");
|
||||
if(options[Options::CHEATMODE].number) {
|
||||
menu->Add(-2,"Steal it");
|
||||
}
|
||||
}
|
||||
else{
|
||||
string s;
|
||||
if(controlId < BOOSTER_SLOTS)
|
||||
s = _("Purchase Booster");
|
||||
else
|
||||
s = _("Purchase Card");
|
||||
menu = NEW SimpleMenu(-145,this,Constants::MENU_FONT,SCREEN_WIDTH-300,SCREEN_HEIGHT/2,s.c_str());
|
||||
menu->Add(controlId,"Yes");
|
||||
menu->Add(-1,"No");
|
||||
}
|
||||
}
|
||||
|
||||
void GameStateShop::purchaseCard(int controlId){
|
||||
MTGCard * c = srcCards->getCard(controlId-BOOSTER_SLOTS);
|
||||
if(!c || !c->data || playerdata->credits - mPrices[controlId] < 0)
|
||||
return;
|
||||
playerdata->collection->add(c);
|
||||
myCollection->Add(c);
|
||||
playerdata->credits -= mPrices[controlId];
|
||||
mCounts[controlId]++;
|
||||
mInventory[controlId]--;
|
||||
mTouched = true;
|
||||
menu->Close();
|
||||
}
|
||||
void GameStateShop::purchaseBooster(int controlId){
|
||||
if(playerdata->credits - mPrices[controlId] < 0)
|
||||
return;
|
||||
playerdata->credits -= mPrices[controlId];
|
||||
mInventory[controlId]--;
|
||||
WSrcCards * pool = NEW WSrcCards();
|
||||
WCFilterSet *main, *alt;
|
||||
|
||||
int num = setlist.getSetNum(mBooster[controlId].mainSet);
|
||||
main = NEW WCFilterSet(num);
|
||||
if(mBooster[controlId].altSet){
|
||||
num = setlist.getSetNum(mBooster[controlId].altSet);
|
||||
alt = NEW WCFilterSet(num);
|
||||
pool->addFilter(NEW WCFilterOR(main,alt));
|
||||
}else
|
||||
pool->addFilter(main);
|
||||
pool->loadMatches(srcCards,true);
|
||||
pool->Shuffle();
|
||||
|
||||
SAFE_DELETE(booster);
|
||||
booster = NEW MTGDeck(mParent->collection);
|
||||
|
||||
//Add cards to booster. Pool is shuffled, so just step through.
|
||||
int carryover = 1;
|
||||
if(!(rand() % 8)){
|
||||
pool->addFilter(NEW WCFilterRarity(Constants::RARITY_M));
|
||||
carryover = pool->addToDeck(booster,carryover);
|
||||
}
|
||||
pool->clearFilters();
|
||||
pool->addFilter(NEW WCFilterRarity(Constants::RARITY_R));
|
||||
carryover = pool->addToDeck(booster,carryover);
|
||||
pool->clearFilters();
|
||||
pool->addFilter(NEW WCFilterRarity(Constants::RARITY_U));
|
||||
carryover = pool->addToDeck(booster,carryover+3);
|
||||
pool->clearFilters();
|
||||
pool->addFilter(NEW WCFilterRarity(Constants::RARITY_C));
|
||||
carryover = pool->addToDeck(booster,carryover+11);
|
||||
|
||||
myCollection->Add(booster);
|
||||
makeDisplay(booster);
|
||||
|
||||
save(true);
|
||||
SAFE_DELETE(pool);
|
||||
menu->Close();
|
||||
}
|
||||
|
||||
int GameStateShop::purchasePrice(int offset){
|
||||
MTGCard * c = NULL;
|
||||
if(!pricelist || !srcCards || (c = srcCards->getCard(offset)) == NULL)
|
||||
return 0;
|
||||
int rnd = abs(c->getMTGId() + randomKey) % 20;
|
||||
float price = (float) pricelist->getPrice(c->getMTGId());
|
||||
price = price + price * (rnd -10)/100;
|
||||
return (int) (price + price * srcCards->filterFee());
|
||||
}
|
||||
|
||||
void GameStateShop::load(){
|
||||
if (shop) shop->saveAll();
|
||||
SAFE_DELETE(shop);
|
||||
int sets[500];
|
||||
int boosterSets[500];
|
||||
int unlocked[500];
|
||||
int nbsets = 0;
|
||||
int nbboostersets = 0;
|
||||
|
||||
//Figure out which sets are available.
|
||||
for (int i = 0; i < setlist.size(); i++){
|
||||
unlocked[i] = options[Options::optionSet(i)].number;
|
||||
}
|
||||
for (int i = 0; i < setlist.size(); i++){
|
||||
if (unlocked[i]){
|
||||
sets[nbsets] = i;
|
||||
nbsets++;
|
||||
if (mParent->collection->countBySet(i) > 80){ //Only sets with more than 80 cards can get boosters and starters
|
||||
boosterSets[nbboostersets] = i;
|
||||
nbboostersets++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (nbboostersets){
|
||||
for (int i = 0; i < SHOP_BOOSTERS; i++){
|
||||
setIds[i] = boosterSets[(rand() % nbboostersets)];
|
||||
}
|
||||
}else{
|
||||
for (int i = 0; i < SHOP_BOOSTERS; i++){
|
||||
setIds[i] = (rand() % setlist.size());
|
||||
}
|
||||
}
|
||||
JQuad * mBackThumb = resources.GetQuad("back_thumb");
|
||||
|
||||
|
||||
|
||||
shop = NEW ShopItems(10, this, resources.GetJLBFont(Constants::MAIN_FONT), 10, 0, mParent->collection, setIds);
|
||||
MTGSetInfo * si = NULL;
|
||||
for (int i = 0; i < SHOP_BOOSTERS; i++){
|
||||
si = setlist.getInfo(setIds[i]);
|
||||
if(!si)
|
||||
for(int i=0;i<BOOSTER_SLOTS;i++)
|
||||
assembleBooster(i);
|
||||
for(int i=BOOSTER_SLOTS;i<SHOP_ITEMS;i++){
|
||||
MTGCard * c = NULL;
|
||||
if((c = srcCards->getCard(i-BOOSTER_SLOTS)) == NULL){
|
||||
mPrices[i] = 0;
|
||||
mCounts[i] = 0;
|
||||
mInventory[i] = 0;
|
||||
continue;
|
||||
|
||||
sprintf(setNames[i], "%s %s (%i %s)", si->id.c_str(), _("Booster").c_str(), si->boosterSize(), _("Cards").c_str());
|
||||
shop->Add(setNames[i],mBack,mBackThumb, si->boosterCost());
|
||||
}
|
||||
|
||||
MTGDeck * tempDeck = NEW MTGDeck(mParent->collection);
|
||||
tempDeck->addRandomCards(8,sets,nbsets);
|
||||
for (map<int,int>::iterator it = tempDeck->cards.begin(); it!=tempDeck->cards.end(); it++){
|
||||
for (int j = 0; j < it->second; j++){
|
||||
shop->Add(it->first);
|
||||
}
|
||||
}
|
||||
delete tempDeck;
|
||||
}
|
||||
mPrices[i] = purchasePrice(i);
|
||||
mCounts[i] = myCollection->countByName(c);
|
||||
switch(c->getRarity()){
|
||||
case Constants::RARITY_C:
|
||||
mInventory[i] = 2 + rand() % 8;
|
||||
break;
|
||||
case Constants::RARITY_L:
|
||||
mInventory[i] = 100;
|
||||
break;
|
||||
case Constants::RARITY_U:
|
||||
mInventory[i] = 1 + rand() % 5;
|
||||
break;
|
||||
case Constants::RARITY_R:
|
||||
mInventory[i] = 1 + rand() % 2;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
void GameStateShop::save(bool force)
|
||||
{
|
||||
if(mTouched || force){
|
||||
if(pricelist)
|
||||
pricelist->save();
|
||||
if(playerdata)
|
||||
playerdata->save();
|
||||
}
|
||||
mTouched = false;
|
||||
}
|
||||
void GameStateShop::End()
|
||||
{
|
||||
save();
|
||||
JRenderer::GetInstance()->EnableVSync(false);
|
||||
resources.Release(mBgTex);
|
||||
mBgTex = NULL;
|
||||
mBg = NULL;
|
||||
mElapsed = 0;
|
||||
SAFE_DELETE(shopMenu);
|
||||
SAFE_DELETE(bigDisplay);
|
||||
SAFE_DELETE(srcCards);
|
||||
SAFE_DELETE(playerdata);
|
||||
SAFE_DELETE(pricelist);
|
||||
SAFE_DELETE(myCollection);
|
||||
SAFE_DELETE(booster);
|
||||
SAFE_DELETE(filterMenu);
|
||||
deleteDisplay();
|
||||
|
||||
//Release alternate thumbnails.
|
||||
for(int i=0;i<8;i++){
|
||||
resources.Release(altThumb[i]);
|
||||
altThumb[i] = NULL;
|
||||
}
|
||||
|
||||
SAFE_DELETE(shop);
|
||||
SAFE_DELETE(menu);
|
||||
SAFE_DELETE(taskList);
|
||||
}
|
||||
|
||||
void GameStateShop::Destroy(){
|
||||
}
|
||||
|
||||
void GameStateShop::beginFilters(){
|
||||
if(!filterMenu){
|
||||
filterMenu = NEW WGuiFilters("Ask about...",srcCards);
|
||||
filterMenu->setY(2);
|
||||
filterMenu->setHeight(SCREEN_HEIGHT-2);
|
||||
}
|
||||
mStage = STAGE_ASK_ABOUT;
|
||||
filterMenu->Entering(0);
|
||||
}
|
||||
void GameStateShop::Update(float dt)
|
||||
{
|
||||
{
|
||||
if(menu && menu->closed)
|
||||
SAFE_DELETE(menu);
|
||||
srcCards->Update(dt);
|
||||
alphaChange = (500 - (rand() % 1000)) * dt;
|
||||
lightAlpha+= alphaChange;
|
||||
if (lightAlpha < 0) lightAlpha = 0;
|
||||
if (lightAlpha > 50) lightAlpha = 50;
|
||||
// mParent->effect->UpdateSmall(dt);
|
||||
// mParent->effect->UpdateBig(dt);
|
||||
if(mStage != STAGE_FADE_IN)
|
||||
mElapsed += dt;
|
||||
|
||||
u32 btn;
|
||||
if (menu){
|
||||
menu->Update(dt);
|
||||
if (menu->closed) SAFE_DELETE(menu);
|
||||
}
|
||||
switch(mStage){
|
||||
case STAGE_SHOP_MENU:
|
||||
if (!menu){
|
||||
if (menu){
|
||||
menu->Update(dt);
|
||||
}else{
|
||||
menu = NEW SimpleMenu(11,this,Constants::MENU_FONT,SCREEN_WIDTH/2-100,20);
|
||||
menu->Add(22,"Ask about...");
|
||||
menu->Add(14,"Check task board");
|
||||
if(options[Options::CHEATMODE].number)
|
||||
menu->Add(-2,"Steal 1,000 credits");
|
||||
menu->Add(12,"Save & Back to Main Menu");
|
||||
menu->Add(14,"See available tasks");
|
||||
menu->Add(13, "Cancel");
|
||||
}
|
||||
break;
|
||||
case STAGE_SHOP_TASKS:
|
||||
if(menu){
|
||||
menu->Update(dt);
|
||||
return;
|
||||
}
|
||||
if(taskList){
|
||||
@@ -173,7 +424,7 @@ void GameStateShop::Update(float dt)
|
||||
if(!menu){
|
||||
menu = NEW SimpleMenu(11,this,Constants::MENU_FONT,SCREEN_WIDTH/2-100,20);
|
||||
menu->Add(12,"Save & Back to Main Menu");
|
||||
menu->Add(15,"Close tasks");
|
||||
menu->Add(15,"Return to shop");
|
||||
menu->Add(13, "Cancel");
|
||||
}
|
||||
}
|
||||
@@ -193,18 +444,67 @@ void GameStateShop::Update(float dt)
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case STAGE_ASK_ABOUT:
|
||||
btn = mEngine->ReadButton();
|
||||
if(menu && !menu->closed){
|
||||
menu->CheckUserInput(btn);
|
||||
menu->Update(dt);
|
||||
return;
|
||||
}
|
||||
if(filterMenu){
|
||||
if(btn == PSP_CTRL_SELECT){
|
||||
filterMenu->Finish();
|
||||
filterMenu->Update(dt);
|
||||
return;
|
||||
}
|
||||
if(filterMenu->isFinished()){
|
||||
load();
|
||||
mStage = STAGE_SHOP_SHOP;
|
||||
}else{
|
||||
filterMenu->CheckUserInput(btn);
|
||||
filterMenu->Update(dt);
|
||||
}
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case STAGE_SHOP_SHOP:
|
||||
btn = mEngine->ReadButton();
|
||||
if(menu && !menu->closed){
|
||||
menu->CheckUserInput(btn);
|
||||
menu->Update(dt);
|
||||
return;
|
||||
}
|
||||
if (btn == PSP_CTRL_START){
|
||||
if(boosterDisplay){
|
||||
deleteDisplay();
|
||||
return;
|
||||
}
|
||||
mStage = STAGE_SHOP_MENU;
|
||||
return;
|
||||
}else if(btn == PSP_CTRL_SELECT){
|
||||
beginFilters();
|
||||
}else if(btn == PSP_CTRL_SQUARE){
|
||||
load();
|
||||
}
|
||||
if (shop){
|
||||
shop->CheckUserInput(btn);
|
||||
shop->Update(dt);
|
||||
srcCards->Shuffle();
|
||||
load();
|
||||
}else if(btn == PSP_CTRL_TRIANGLE){
|
||||
options[Options::DISABLECARDS].number = !options[Options::DISABLECARDS].number;
|
||||
}else if (boosterDisplay){
|
||||
if(btn == PSP_CTRL_CROSS)
|
||||
deleteDisplay();
|
||||
else {
|
||||
boosterDisplay->CheckUserInput(btn);
|
||||
boosterDisplay->Update(dt);}
|
||||
return;
|
||||
}else if(btn == PSP_CTRL_CROSS){
|
||||
bListCards = !bListCards;
|
||||
}else if(shopMenu){
|
||||
if(shopMenu->CheckUserInput(btn))
|
||||
srcCards->Touch();
|
||||
}
|
||||
|
||||
if(shopMenu)
|
||||
shopMenu->Update(dt);
|
||||
|
||||
break;
|
||||
case STAGE_FADE_IN:
|
||||
mParent->DoAnimation(TRANSITION_FADE_IN);
|
||||
@@ -213,57 +513,156 @@ void GameStateShop::Update(float dt)
|
||||
}
|
||||
}
|
||||
|
||||
void GameStateShop::makeDisplay(MTGDeck * d){
|
||||
deleteDisplay();
|
||||
boosterDisplay = NEW CardDisplay(12,NULL, SCREEN_WIDTH - 200, SCREEN_HEIGHT/2,this,NULL,5);
|
||||
|
||||
map<int,int>::iterator it;
|
||||
|
||||
for (it = d->cards.begin(); it!=d->cards.end(); it++){
|
||||
MTGCard * c = d->getCardById(it->first);
|
||||
MTGCardInstance * ci = NEW MTGCardInstance(c, NULL);
|
||||
boosterDisplay->AddCard(ci);
|
||||
subBooster.push_back(ci);
|
||||
}
|
||||
}
|
||||
void GameStateShop::deleteDisplay(){
|
||||
vector<MTGCardInstance*>::iterator i;
|
||||
for(i=subBooster.begin();i!=subBooster.end();i++){
|
||||
if(!*i) continue;
|
||||
delete *i;
|
||||
}
|
||||
subBooster.clear();
|
||||
SAFE_DELETE(boosterDisplay);
|
||||
}
|
||||
void GameStateShop::Render()
|
||||
{
|
||||
//Erase
|
||||
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
|
||||
JRenderer * r = JRenderer::GetInstance();
|
||||
r->ClearScreen(ARGB(0,0,0,0));
|
||||
if(mStage == STAGE_FADE_IN)
|
||||
return;
|
||||
|
||||
if (mBg) r->RenderQuad(mBg,0,0);
|
||||
if (mBg)
|
||||
r->RenderQuad(mBg,0,0);
|
||||
|
||||
JQuad * quad = resources.RetrieveTempQuad("shop_light.jpg",TEXTURE_SUB_5551);
|
||||
if (quad){
|
||||
r->EnableTextureFilter(false);
|
||||
r->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE);
|
||||
quad->SetColor(ARGB(lightAlpha,255,255,255));
|
||||
r->RenderQuad(quad,0,0);
|
||||
r->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA);
|
||||
r->EnableTextureFilter(true);
|
||||
}
|
||||
|
||||
if(shopMenu)
|
||||
shopMenu->Render();
|
||||
if(filterMenu && !filterMenu->isFinished())
|
||||
filterMenu->Render();
|
||||
else{
|
||||
if(boosterDisplay)
|
||||
boosterDisplay->Render();
|
||||
else if(bigDisplay){
|
||||
if(bigDisplay->mOffset.getPos() >= 0)
|
||||
bigDisplay->setSource(srcCards);
|
||||
else
|
||||
bigDisplay->setSource(NULL);
|
||||
bigDisplay->Render();
|
||||
float elp = srcCards->getElapsed();
|
||||
//Render the card list overlay.
|
||||
if( bListCards || elp > LIST_FADEIN){
|
||||
char alpha = 200;
|
||||
if(!bListCards && elp < LIST_FADEIN+.25){
|
||||
alpha = 800 *(elp-LIST_FADEIN);
|
||||
}
|
||||
r->FillRoundRect(300,10, 160, SHOP_SLOTS * 20 + 15,5,ARGB(alpha,0,0,0));
|
||||
alpha+=55;
|
||||
for(int i=0;i<SHOP_SLOTS;i++){
|
||||
if (i == shopMenu->getSelected())
|
||||
mFont->SetColor(ARGB(alpha,255,255,0));
|
||||
else
|
||||
mFont->SetColor(ARGB(alpha,255,255,255));
|
||||
char buffer[512];
|
||||
string s = descPurchase(i,true);
|
||||
sprintf(buffer, "%s", s.c_str());
|
||||
float x = 310;
|
||||
float y = 25 + 20*i;
|
||||
mFont->DrawString(buffer,x,y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Render the info bar
|
||||
r->FillRect(0,SCREEN_HEIGHT-17,SCREEN_WIDTH,17,ARGB(128,0,0,0));
|
||||
char c[512];
|
||||
sprintf(c,_("credits: %i").c_str(), playerdata->credits);
|
||||
mFont->SetColor(ARGB(255,255,255,255));
|
||||
mFont->DrawString(c, 5, SCREEN_HEIGHT - 12);
|
||||
sprintf(c, "%s", _("[]:other cards").c_str());
|
||||
unsigned int len = 4 + mFont->GetStringWidth(c);
|
||||
mFont->DrawString(c,SCREEN_WIDTH-len,SCREEN_HEIGHT-14);
|
||||
|
||||
mFont->SetColor(ARGB(255,255,255,0));
|
||||
mFont->DrawString(descPurchase(bigSync.getPos()).c_str(), SCREEN_WIDTH/2, SCREEN_HEIGHT - 14,JGETEXT_CENTER);
|
||||
mFont->SetColor(ARGB(255,255,255,255));
|
||||
|
||||
if (shop)
|
||||
shop->Render();
|
||||
|
||||
if (mStage == STAGE_SHOP_TASKS && taskList) {
|
||||
taskList->Render();
|
||||
}
|
||||
|
||||
if (menu){
|
||||
if (menu)
|
||||
menu->Render();
|
||||
}
|
||||
}
|
||||
|
||||
void GameStateShop::ButtonPressed(int controllerId, int controlId)
|
||||
{
|
||||
if (controllerId == 10){
|
||||
if (shop)
|
||||
shop->pricedialog(controlId);
|
||||
int sel = bigSync.getOffset();
|
||||
|
||||
switch(controllerId){
|
||||
case -102: //Buying something...
|
||||
beginPurchase(controlId);
|
||||
return;
|
||||
case -145:
|
||||
if(controlId == -1){ //Nope, don't buy.
|
||||
menu->Close();
|
||||
return;
|
||||
}
|
||||
if(sel > -1 && sel < SHOP_ITEMS){
|
||||
if(controlId == -2)
|
||||
playerdata->credits += mPrices[sel];
|
||||
if(sel < BOOSTER_SLOTS) //Clicked a booster.
|
||||
purchaseBooster(sel);
|
||||
else
|
||||
purchaseCard(sel);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else{
|
||||
switch(controlId){
|
||||
case 12:
|
||||
if (shop) shop->saveAll();
|
||||
if (taskList) taskList->save();
|
||||
mParent->DoTransition(TRANSITION_FADE,GAME_STATE_MENU);
|
||||
mStage = STAGE_SHOP_SHOP;
|
||||
break;
|
||||
case 14:
|
||||
mStage = STAGE_SHOP_TASKS;
|
||||
if (!taskList)
|
||||
taskList = NEW TaskList();
|
||||
taskList->Start();
|
||||
break;
|
||||
case 15:
|
||||
if(taskList)
|
||||
taskList->End();
|
||||
break;
|
||||
default:
|
||||
mStage = STAGE_SHOP_SHOP;
|
||||
}
|
||||
if (menu) menu->Close();
|
||||
//Basic Menu.
|
||||
switch(controlId){
|
||||
case 12:
|
||||
if (taskList) taskList->save();
|
||||
mParent->DoTransition(TRANSITION_FADE,GAME_STATE_MENU);
|
||||
mStage = STAGE_SHOP_SHOP;
|
||||
break;
|
||||
case 14:
|
||||
mStage = STAGE_SHOP_TASKS;
|
||||
if (!taskList)
|
||||
taskList = NEW TaskList();
|
||||
taskList->Start();
|
||||
break;
|
||||
case 15:
|
||||
if(taskList)
|
||||
taskList->End();
|
||||
break;
|
||||
case 22:
|
||||
beginFilters();
|
||||
break;
|
||||
case -2:
|
||||
playerdata->credits += 1000;
|
||||
default:
|
||||
mStage = STAGE_SHOP_SHOP;
|
||||
}
|
||||
SAFE_DELETE(menu);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include "../include/Translate.h"
|
||||
#include "../include/OptionItem.h"
|
||||
#include "../include/GameOptions.h"
|
||||
#include "../include/DeckDataWrapper.h"
|
||||
|
||||
TransitionBase::TransitionBase(GameApp* parent, GameState* _from, GameState* _to, float duration): GameState(parent){
|
||||
from = _from;
|
||||
@@ -15,7 +14,12 @@ TransitionBase::TransitionBase(GameApp* parent, GameState* _from, GameState* _to
|
||||
mDuration = duration;
|
||||
bAnimationOnly = false;
|
||||
}
|
||||
|
||||
TransitionBase::~TransitionBase(){
|
||||
if(!bAnimationOnly){
|
||||
if(from)
|
||||
from->End();
|
||||
}
|
||||
}
|
||||
void TransitionBase::Update(float dt){
|
||||
if(from && !Finished())
|
||||
from->Update(dt);
|
||||
@@ -36,12 +40,7 @@ void TransitionBase::Start() {
|
||||
void TransitionBase::End() {
|
||||
mElapsed = 0;
|
||||
};
|
||||
TransitionBase::~TransitionBase(){
|
||||
if(!bAnimationOnly){
|
||||
if(from)
|
||||
from->End();
|
||||
}
|
||||
}
|
||||
|
||||
void TransitionFade::Render(){
|
||||
if(from)
|
||||
from->Render();
|
||||
|
||||
@@ -30,7 +30,6 @@ MTGCard::MTGCard(MTGCard * source){
|
||||
mtgid = source->mtgid;
|
||||
setId = source->setId;
|
||||
data = source->data;
|
||||
|
||||
}
|
||||
|
||||
int MTGCard::init(){
|
||||
@@ -57,7 +56,6 @@ int MTGCard::getMTGId(){
|
||||
int MTGCard::getId(){
|
||||
return mtgid;
|
||||
}
|
||||
|
||||
char MTGCard::getRarity(){
|
||||
return rarity;
|
||||
}
|
||||
|
||||
@@ -727,6 +727,43 @@ MTGSetInfo* MTGSets::getInfo(int setID){
|
||||
return setinfo[setID];
|
||||
}
|
||||
|
||||
MTGSetInfo* MTGSets::randomSet(int blockId, int atleast){
|
||||
char * unlocked = (char *)calloc(size(),sizeof(char));
|
||||
int attempts = 50;
|
||||
//Figure out which sets are available.
|
||||
for (int i = 0; i < size(); i++){
|
||||
unlocked[i] = options[Options::optionSet(i)].number;
|
||||
}
|
||||
//No luck randomly. Now iterate from a random location.
|
||||
int a = 0, iter = 0;
|
||||
while(iter < 3){
|
||||
a = rand()%size();
|
||||
for(int i=a;i<size();i++){
|
||||
if(unlocked[i]
|
||||
&& (blockId == -1 || setinfo[i]->block == blockId)
|
||||
&& (atleast == -1 || setinfo[i]->totalCards() >= atleast)){
|
||||
free(unlocked);
|
||||
return setinfo[i];
|
||||
}
|
||||
}
|
||||
for(int i=0;i<a;i++){
|
||||
if(unlocked[i]
|
||||
&& (blockId == -1 || setinfo[i]->block == blockId)
|
||||
&& (atleast == -1 || setinfo[i]->totalCards() >= atleast)){
|
||||
free(unlocked);
|
||||
return setinfo[i];
|
||||
}
|
||||
}
|
||||
blockId = -1;
|
||||
iter++;
|
||||
if(iter == 2)
|
||||
atleast = -1;
|
||||
}
|
||||
free(unlocked);
|
||||
return NULL;
|
||||
}
|
||||
int blockSize(int blockId);
|
||||
|
||||
int MTGSets::Add(const char * name){
|
||||
int setid = findSet(name);
|
||||
if(setid != -1)
|
||||
@@ -781,12 +818,18 @@ string MTGSets::operator[](int id){
|
||||
|
||||
return si->id;
|
||||
}
|
||||
|
||||
int MTGSets::getSetNum(MTGSetInfo*i){
|
||||
int it;
|
||||
for(it=0;it<size();it++){
|
||||
if(setinfo[it] == i)
|
||||
return it;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
int MTGSets::size(){
|
||||
return (int) setinfo.size();
|
||||
}
|
||||
|
||||
|
||||
//MTGSetInfo
|
||||
MTGSetInfo::MTGSetInfo(string _id) {
|
||||
string whitespaces (" \t\f\v\n\r");
|
||||
|
||||
+1
-1206
File diff suppressed because it is too large
Load Diff
@@ -1,554 +0,0 @@
|
||||
#include "../include/config.h"
|
||||
#include "../include/ShopItem.h"
|
||||
#include "../include/GameStateShop.h"
|
||||
#include "../include/CardGui.h"
|
||||
#include "../include/WResourceManager.h"
|
||||
#include "../include/Translate.h"
|
||||
#include <hge/hgedistort.h>
|
||||
|
||||
|
||||
|
||||
float ShopItems::_x1[] = { 79, 19, 27,103,154,187,102,144,198,133,183};
|
||||
float ShopItems::_y1[] = {150,194,222,167,164,156,195,190,175,220,220};
|
||||
|
||||
float ShopItems::_x2[] = {103, 48, 74,135,183,215,138,181,231,171,225};
|
||||
float ShopItems::_y2[] = {155,179,218,165,166,155,195,186,177,225,216};
|
||||
|
||||
float ShopItems::_x3[] = { 48, 61, 9, 96,139,190, 81,146,187, 97,191};
|
||||
float ShopItems::_y3[] = {164,205,257,184,180,170,219,212,195,251,252};
|
||||
|
||||
float ShopItems::_x4[] = { 76, 90, 65,131,171,221,123,187,225,141,237};
|
||||
float ShopItems::_y4[] = {169,188,250,182,182,168,220,208,198,259,245};
|
||||
|
||||
|
||||
ShopItem::ShopItem(int id, JLBFont *font, char* text, JQuad * _quad,JQuad * _thumb, float _xy[], bool hasFocus, int _price): JGuiObject(id), mFont(font), mText(text), quad(_quad), thumb(_thumb), price(_price)
|
||||
{
|
||||
for (int i = 0; i < 8; ++i){
|
||||
xy[i] = _xy[i];
|
||||
}
|
||||
quantity = 10;
|
||||
card = NULL;
|
||||
mHasFocus = hasFocus;
|
||||
mRelease = false;
|
||||
|
||||
mScale = 1.0f;
|
||||
mTargetScale = 1.0f;
|
||||
|
||||
mesh=NEW hgeDistortionMesh(2,2);
|
||||
mesh->SetTexture(thumb->mTex);
|
||||
float x0,y0,w0,h0;
|
||||
thumb->GetTextureRect(&x0,&y0,&w0,&h0);
|
||||
mesh->SetTextureRect(x0,y0,w0,h0);
|
||||
mesh->Clear(ARGB(0xFF,0xFF,0xFF,0xFF));
|
||||
mesh->SetDisplacement(0, 0, xy[0],xy[1], HGEDISP_NODE);
|
||||
mesh->SetDisplacement(1, 0, xy[2] - w0,xy[3], HGEDISP_NODE);
|
||||
mesh->SetDisplacement(0, 1,xy[4],xy[5]-h0, HGEDISP_NODE);
|
||||
mesh->SetDisplacement(1, 1, xy[6]-w0,xy[7]-h0, HGEDISP_NODE);
|
||||
mesh->SetColor(1,1,ARGB(255,100,100,100));
|
||||
mesh->SetColor(0,1,ARGB(255,100,100,100));
|
||||
mesh->SetColor(1,0,ARGB(255,100,100,100));
|
||||
mesh->SetColor(0,0,ARGB(255,200,200,200));
|
||||
if (hasFocus)
|
||||
Entering();
|
||||
}
|
||||
|
||||
ShopItem::ShopItem(int id, JLBFont *font, int _cardid, float _xy[], bool hasFocus, MTGAllCards * collection, int _price, DeckDataWrapper * ddw): JGuiObject(id), mFont(font), price(_price){
|
||||
for (int i = 0; i < 8; ++i){
|
||||
xy[i] = _xy[i];
|
||||
}
|
||||
mHasFocus = hasFocus;
|
||||
mRelease = false;
|
||||
mScale = 1.0f;
|
||||
mTargetScale = 1.0f;
|
||||
|
||||
if (hasFocus)
|
||||
Entering();
|
||||
|
||||
card = collection->getCardById(_cardid);
|
||||
updateCount(ddw);
|
||||
|
||||
quantity = 1 + (rand() % 4);
|
||||
if (card->getRarity() == Constants::RARITY_L) quantity = 50;
|
||||
quad = NULL;
|
||||
|
||||
mesh = NULL;
|
||||
thumb = NULL;
|
||||
updateThumb();
|
||||
}
|
||||
|
||||
|
||||
int ShopItem::updateCount(DeckDataWrapper * ddw){
|
||||
if (!card) return 0;
|
||||
nameCount = ddw->countByName(card);
|
||||
return nameCount;
|
||||
}
|
||||
|
||||
ShopItem::~ShopItem(){
|
||||
OutputDebugString("delete shopitem\n");
|
||||
if(thumb)
|
||||
resources.Release(thumb->mTex);
|
||||
SAFE_DELETE(mesh);
|
||||
}
|
||||
|
||||
const char * ShopItem::getText(){
|
||||
return mText.c_str();
|
||||
}
|
||||
|
||||
void ShopItem::updateThumb(){
|
||||
if(card == NULL)
|
||||
return;
|
||||
|
||||
if(thumb && mRelease)
|
||||
resources.Release(thumb->mTex);
|
||||
mRelease = false;
|
||||
|
||||
if(mesh)
|
||||
SAFE_DELETE(mesh);
|
||||
else if(thumb)
|
||||
SAFE_DELETE(thumb);
|
||||
|
||||
thumb = resources.RetrieveCard(card,RETRIEVE_LOCK,TEXTURE_SUB_THUMB);
|
||||
#if defined (WIN32) || defined (LINUX)
|
||||
//On pcs we render the big image if the thumbnail is not available
|
||||
if (!thumb) thumb = resources.RetrieveCard(card,RETRIEVE_LOCK);
|
||||
#endif
|
||||
if (!thumb)
|
||||
thumb = CardGui::alternateThumbQuad(card);
|
||||
else
|
||||
mRelease = true;
|
||||
|
||||
|
||||
if (thumb){
|
||||
mesh=NEW hgeDistortionMesh(2,2);
|
||||
mesh->SetTexture(thumb->mTex);
|
||||
float x0,y0,w0,h0;
|
||||
thumb->GetTextureRect(&x0,&y0,&w0,&h0);
|
||||
mesh->SetTextureRect(x0,y0,w0,h0);
|
||||
mesh->Clear(ARGB(0xFF,0xFF,0xFF,0xFF));
|
||||
mesh->SetDisplacement(0, 0, xy[0],xy[1], HGEDISP_NODE);
|
||||
mesh->SetDisplacement(1, 0, xy[2] - w0,xy[3], HGEDISP_NODE);
|
||||
mesh->SetDisplacement(0, 1,xy[4],xy[5]-h0, HGEDISP_NODE);
|
||||
mesh->SetDisplacement(1, 1, xy[6]-w0,xy[7]-h0, HGEDISP_NODE);
|
||||
mesh->SetColor(1,1,ARGB(255,100,100,100));
|
||||
mesh->SetColor(0,1,ARGB(255,100,100,100));
|
||||
mesh->SetColor(1,0,ARGB(255,100,100,100));
|
||||
mesh->SetColor(0,0,ARGB(255,200,200,200));
|
||||
}else{
|
||||
mesh = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void ShopItem::Render(){
|
||||
if (mHasFocus){
|
||||
mFont->SetColor(ARGB(255,255,255,0));
|
||||
}else{
|
||||
mFont->SetColor(ARGB(255,255,255,255));
|
||||
}
|
||||
if (!quantity){
|
||||
mFont->SetColor(ARGB(255,128,128,128));
|
||||
}
|
||||
|
||||
if (card){
|
||||
if (nameCount){
|
||||
char buffer[512];
|
||||
sprintf(buffer, "%s (%i)", _(card->data->name).c_str(), nameCount );
|
||||
mText = buffer;
|
||||
}else{
|
||||
mText = _(card->data->name).c_str();
|
||||
}
|
||||
}
|
||||
|
||||
JRenderer * renderer = JRenderer::GetInstance();
|
||||
|
||||
if (mesh){
|
||||
mesh->Render(0,0);
|
||||
}else{
|
||||
//ERROR Management
|
||||
}
|
||||
if (mHasFocus){
|
||||
if (card) quad = resources.RetrieveCard(card);
|
||||
if (quad){
|
||||
float scale = 0.9 * 285/ quad->mHeight;
|
||||
quad->SetColor(ARGB(255,255,255,255));
|
||||
renderer->RenderQuad(quad,SCREEN_WIDTH - 105,SCREEN_HEIGHT/2 - 5,0, scale,scale);
|
||||
}else{
|
||||
if (card) CardGui::alternateRender(card,Pos(SCREEN_WIDTH - 105,SCREEN_HEIGHT/2 - 5,0.9f* 285/250, 0,255));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ShopItem::Update(float dt)
|
||||
{
|
||||
if (mScale < mTargetScale){
|
||||
mScale += 8.0f*dt;
|
||||
if (mScale > mTargetScale)
|
||||
mScale = mTargetScale;
|
||||
}else if (mScale > mTargetScale){
|
||||
mScale -= 8.0f*dt;
|
||||
if (mScale < mTargetScale)
|
||||
mScale = mTargetScale;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void ShopItem::Entering()
|
||||
{
|
||||
for (int i = 0; i < 2; ++i){
|
||||
for (int j = 0; j < 2; ++j){
|
||||
mesh->SetColor(i,j,ARGB(255,255,255,255));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mHasFocus = true;
|
||||
mTargetScale = 1.2f;
|
||||
}
|
||||
|
||||
|
||||
bool ShopItem::Leaving(u32 key)
|
||||
{
|
||||
mesh->SetColor(1,1,ARGB(255,100,100,100));
|
||||
mesh->SetColor(0,1,ARGB(255,100,100,100));
|
||||
mesh->SetColor(1,0,ARGB(255,100,100,100));
|
||||
mesh->SetColor(0,0,ARGB(255,200,200,200));
|
||||
|
||||
mHasFocus = false;
|
||||
mTargetScale = 1.0f;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool ShopItem::ButtonPressed()
|
||||
{
|
||||
return (quantity >0);
|
||||
}
|
||||
|
||||
|
||||
ShopItems::ShopItems(int id, JGuiListener* listener, JLBFont* font, int x, int y, MTGAllCards * _collection, int _setIds[]): JGuiController(id, listener), mX(x), mY(y), mFont(font), collection(_collection){
|
||||
mHeight = 0;
|
||||
showPriceDialog = -1;
|
||||
dialog = NULL;
|
||||
pricelist = NEW PriceList(RESPATH"/settings/prices.dat",_collection);
|
||||
playerdata = NEW PlayerData(_collection);
|
||||
display = NULL;
|
||||
for (int i=0; i < SHOP_BOOSTERS; i++){
|
||||
setIds[i] = _setIds[i];
|
||||
};
|
||||
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), _collection));
|
||||
showCardList = true;
|
||||
|
||||
mBgAA = NULL;
|
||||
mBgAATex = resources.RetrieveTexture("shop_aliasing.png",RETRIEVE_LOCK);
|
||||
if(mBgAATex){
|
||||
mBgAA = resources.RetrieveQuad("shop_aliasing.png");
|
||||
mBgAA->SetTextureRect(0,1,250,119);
|
||||
}
|
||||
|
||||
lightAlpha = 0;
|
||||
alphaChange = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ShopItems::Add(int cardid){
|
||||
int rnd = (rand() % 20);
|
||||
int price = pricelist->getPrice(cardid);
|
||||
price = price + price * (rnd -10)/100;
|
||||
float xy[] = {_x1[mCount],_y1[mCount],_x2[mCount],_y2[mCount],_x3[mCount],_y3[mCount],_x4[mCount],_y4[mCount]};
|
||||
JGuiController::Add(NEW ShopItem(mCount, mFont, cardid, xy, (mCount == 0),collection, price,myCollection));
|
||||
mHeight += 22;
|
||||
}
|
||||
|
||||
void ShopItems::Add(char * text, JQuad * quad,JQuad * thumb, int price){
|
||||
float xy[] = {_x1[mCount],_y1[mCount],_x2[mCount],_y2[mCount],_x3[mCount],_y3[mCount],_x4[mCount],_y4[mCount]};
|
||||
JGuiController::Add(NEW ShopItem(mCount, mFont, text, quad, thumb, xy, (mCount == 0), price));
|
||||
mHeight += 22;
|
||||
}
|
||||
|
||||
void ShopItems::Update(float dt){
|
||||
|
||||
if (display){
|
||||
display->Update(dt);
|
||||
}else{
|
||||
if (showPriceDialog!=-1){
|
||||
ShopItem * item = ((ShopItem *)mObjects[showPriceDialog]);
|
||||
int price = item->price;
|
||||
char buffer[4096];
|
||||
sprintf(buffer,"%s : %i credits",item->getText(),price);
|
||||
if(!dialog){
|
||||
dialog = NEW SimpleMenu(1,this,Constants::MENU_FONT,SCREEN_WIDTH-300,SCREEN_HEIGHT/2,buffer);
|
||||
dialog->Add(1,"Yes");
|
||||
dialog->Add(2,"No");
|
||||
if(options[Options::CHEATMODE].number) {
|
||||
dialog->Add(3,"*Steal 1,000 credits*");
|
||||
}
|
||||
}
|
||||
else{
|
||||
dialog->Update(dt);
|
||||
}
|
||||
}else{
|
||||
SAFE_DELETE(dialog);
|
||||
JGuiController::Update(dt);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
alphaChange = (500 - (rand() % 1000)) * dt;
|
||||
lightAlpha+= alphaChange;
|
||||
if (lightAlpha < 0) lightAlpha = 0;
|
||||
if (lightAlpha > 50) lightAlpha = 50;
|
||||
}
|
||||
|
||||
|
||||
void ShopItems::Render(){
|
||||
JGuiController::Render();
|
||||
JRenderer * r = JRenderer::GetInstance();
|
||||
|
||||
|
||||
if (mBgAA)
|
||||
r->RenderQuad(mBgAA,0,SCREEN_HEIGHT-127);
|
||||
|
||||
JQuad * quad = resources.RetrieveTempQuad("shop_light.jpg",TEXTURE_SUB_5551);
|
||||
if (quad){
|
||||
r->EnableTextureFilter(false);
|
||||
r->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE);
|
||||
quad->SetColor(ARGB(lightAlpha,255,255,255));
|
||||
r->RenderQuad(quad,0,0);
|
||||
r->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA);
|
||||
r->EnableTextureFilter(true);
|
||||
}
|
||||
|
||||
|
||||
if (display) display->Render();
|
||||
|
||||
if (showPriceDialog!=-1){
|
||||
if(dialog){
|
||||
dialog->Render();
|
||||
}
|
||||
}
|
||||
|
||||
mFont->SetColor(ARGB(255,255,255,255));
|
||||
char c[4096];
|
||||
r->FillRect(0,SCREEN_HEIGHT-17,SCREEN_WIDTH,17,ARGB(128,0,0,0));
|
||||
sprintf(c, "%s", _("[]:other cards").c_str());
|
||||
unsigned int len = 4 + mFont->GetStringWidth(c);
|
||||
mFont->DrawString(c,SCREEN_WIDTH-len,SCREEN_HEIGHT-14);
|
||||
|
||||
char credits[512];
|
||||
sprintf(credits,_("credits: %i").c_str(), playerdata->credits);
|
||||
mFont->SetColor(ARGB(200,0,0,0));
|
||||
mFont->DrawString(credits, 5, SCREEN_HEIGHT - 12);
|
||||
mFont->SetColor(ARGB(255,255,255,255));
|
||||
mFont->DrawString(credits, 5, SCREEN_HEIGHT - 14);
|
||||
|
||||
if(mCurr >= 0){
|
||||
mFont->SetColor(ARGB(255,255,255,0));
|
||||
ShopItem * item = ((ShopItem *)mObjects[mCurr]);
|
||||
mFont->DrawString(item->mText.c_str(), SCREEN_WIDTH/2 - 50, SCREEN_HEIGHT - 14,JGETEXT_CENTER);
|
||||
mFont->SetColor(ARGB(255,255,255,255));
|
||||
}
|
||||
|
||||
if (showCardList){
|
||||
r->FillRoundRect(290,5, 160, mCount * 20 + 15,5,ARGB(200,0,0,0));
|
||||
|
||||
for (int i = 0; i< mCount; ++i){
|
||||
if (!mObjects[i]) continue;
|
||||
ShopItem * s = (ShopItem *)(mObjects[i]);
|
||||
if (i == mCurr) mFont->SetColor(ARGB(255,255,255,0));
|
||||
else mFont->SetColor(ARGB(255,255,255,255));
|
||||
char buffer[512];
|
||||
sprintf(buffer, "%s", s->getText());
|
||||
float x = 300;
|
||||
float y = 10 + 20*i;
|
||||
mFont->DrawString(buffer,x,y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ShopItems::pricedialog(int id, int mode){
|
||||
if (mode){
|
||||
showPriceDialog = id;
|
||||
}else{
|
||||
showPriceDialog = -1;
|
||||
}
|
||||
}
|
||||
|
||||
void ShopItems::ButtonPressed(int controllerId, int controlId){
|
||||
if (controllerId == 12){
|
||||
safeDeleteDisplay();
|
||||
return;
|
||||
}
|
||||
|
||||
ShopItem * item = ((ShopItem *)mObjects[showPriceDialog]);
|
||||
int price = item->price;
|
||||
switch(controlId){
|
||||
case 1:
|
||||
if (playerdata->credits >= price){
|
||||
playerdata->credits -= price;
|
||||
if (item->card){
|
||||
int rnd = (rand() % 25);
|
||||
price = price + (rnd * price)/100;
|
||||
pricelist->setPrice(item->card->getMTGId(),price);
|
||||
playerdata->collection->add(item->card);
|
||||
item->quantity--;
|
||||
myCollection->Add(item->card);
|
||||
item->nameCount++;
|
||||
item->price = price;
|
||||
}else{
|
||||
safeDeleteDisplay();
|
||||
display = NEW CardDisplay(12,NULL, SCREEN_WIDTH - 200, SCREEN_HEIGHT/2,this,NULL,5);
|
||||
|
||||
MTGDeck * tempDeck = NEW MTGDeck(playerdata->collection->database);
|
||||
int rare_or_mythic = Constants::RARITY_R;
|
||||
int rnd = rand() % 8;
|
||||
if (rnd == 0) rare_or_mythic = Constants::RARITY_M;
|
||||
int sets[] = {setIds[showPriceDialog]};
|
||||
MTGSetInfo* si = setlist.getInfo(setIds[showPriceDialog]);
|
||||
|
||||
tempDeck->addRandomCards(si->booster[MTGSetInfo::RARE], sets,1,rare_or_mythic);
|
||||
tempDeck->addRandomCards(si->booster[MTGSetInfo::UNCOMMON], sets,1,Constants::RARITY_U);
|
||||
tempDeck->addRandomCards(si->booster[MTGSetInfo::COMMON], sets,1,Constants::RARITY_C);
|
||||
tempDeck->addRandomCards(si->booster[MTGSetInfo::LAND], sets,1,Constants::RARITY_L);
|
||||
|
||||
//Check for duplicates. Does not guarentee none, just makes them extremely unlikely.
|
||||
//Code is kind of inefficient, but shouldn't be used often enough to matter.
|
||||
int loops=0;
|
||||
for(map<int,int>::iterator it = tempDeck->cards.begin();it!= tempDeck->cards.end() && loops < 15;it++,loops++){
|
||||
int dupes = it->second - 1;
|
||||
if(dupes <= 0)
|
||||
continue;
|
||||
|
||||
for(int x=0;x<dupes;x++)
|
||||
tempDeck->remove(it->first);
|
||||
|
||||
int rarity = (int) tempDeck->database->getCardById(it->first)->getRarity();
|
||||
tempDeck->addRandomCards(dupes,sets,1,rarity);
|
||||
it = tempDeck->cards.begin();
|
||||
}
|
||||
|
||||
playerdata->collection->add(tempDeck);
|
||||
myCollection->Add(tempDeck);
|
||||
|
||||
for (int j = 0; j < mCount; j++){
|
||||
ShopItem * si = ((ShopItem *)mObjects[j]);
|
||||
si->updateCount(myCollection);
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
for(int cycle=0;cycle<4;cycle++)
|
||||
for (map<int,int>::iterator it = tempDeck->cards.begin(); it!=tempDeck->cards.end(); it++){
|
||||
MTGCard * c = tempDeck->getCardById(it->first);
|
||||
char rarity = c->getRarity();
|
||||
if((cycle == 0 && rarity == Constants::RARITY_L)
|
||||
|| (cycle == 1 && rarity == Constants::RARITY_C)
|
||||
|| (cycle == 2 && rarity == Constants::RARITY_U)
|
||||
|| (cycle == 3 && (rarity == Constants::RARITY_R || rarity == Constants::RARITY_M)))
|
||||
for (int j = 0; j < it->second; j++){
|
||||
MTGCardInstance * card = NEW MTGCardInstance(c, NULL);
|
||||
displayCards[i] = card;
|
||||
display->AddCard(card);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
delete tempDeck;
|
||||
}
|
||||
//Check if we just scored an award...
|
||||
if(myCollection && myCollection->totalPrice() > 10000){
|
||||
GameOptionAward * goa = dynamic_cast<GameOptionAward *>(&options[Options::AWARD_COLLECTOR]);
|
||||
if(goa)
|
||||
goa->giveAward();
|
||||
}
|
||||
showPriceDialog = -1;
|
||||
}else{
|
||||
//error not enough money
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (item->card){
|
||||
int rnd = (rand() % 25);
|
||||
price = price - (rnd * price)/100;
|
||||
pricelist->setPrice(item->card->getMTGId(),price);
|
||||
}
|
||||
showPriceDialog = -1;
|
||||
break;
|
||||
case 3: // (PSY) Cheatmode: get free money
|
||||
playerdata->credits += 1000;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ShopItems::safeDeleteDisplay(){
|
||||
if (!display) return;
|
||||
for (int i = 0; i < display->mCount; i++){
|
||||
delete displayCards[i];
|
||||
}
|
||||
SAFE_DELETE(display);
|
||||
}
|
||||
|
||||
void ShopItems::saveAll(){
|
||||
savePriceList();
|
||||
playerdata->save();
|
||||
}
|
||||
|
||||
void ShopItems::savePriceList(){
|
||||
pricelist->save();
|
||||
}
|
||||
|
||||
ShopItems::~ShopItems(){
|
||||
SAFE_DELETE(pricelist);
|
||||
SAFE_DELETE(playerdata);
|
||||
SAFE_DELETE(dialog);
|
||||
safeDeleteDisplay();
|
||||
SAFE_DELETE(myCollection);
|
||||
resources.Release(mBgAATex);
|
||||
}
|
||||
|
||||
ostream& ShopItem::toString(ostream& out) const
|
||||
{
|
||||
return out << "ShopItem ::: mHasFocus : " << mHasFocus
|
||||
<< " ; mFont : " << mFont
|
||||
<< " ; mText : " << mText
|
||||
<< " ; quad : " << quad
|
||||
<< " ; thumb : " << thumb
|
||||
<< " ; mScale : " << mScale
|
||||
<< " ; mTargetScale : " << mTargetScale
|
||||
<< " ; nameCount : " << nameCount
|
||||
<< " ; quantity : " << quantity
|
||||
<< " ; card : " << card
|
||||
<< " ; price : " << price;
|
||||
}
|
||||
|
||||
bool ShopItems::CheckUserInput(u32 key){
|
||||
if (display && display->CheckUserInput(key))
|
||||
return true;
|
||||
if(showPriceDialog==-1){
|
||||
u32 buttons[] = {PSP_CTRL_LEFT,PSP_CTRL_DOWN,PSP_CTRL_RIGHT,PSP_CTRL_UP,PSP_CTRL_CIRCLE};
|
||||
for (int i = 0; i < 5; ++i){
|
||||
if (key == buttons[i])
|
||||
showCardList = false;
|
||||
}
|
||||
|
||||
if(key == PSP_CTRL_TRIANGLE){
|
||||
options[Options::DISABLECARDS].number = !options[Options::DISABLECARDS].number;
|
||||
vector<JGuiObject*>::iterator it;
|
||||
for(it=mObjects.begin();it!=mObjects.end();it++){
|
||||
ShopItem * si = dynamic_cast<ShopItem*>(*it);
|
||||
if(si)
|
||||
si->updateThumb();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (key == PSP_CTRL_CROSS){
|
||||
showCardList = !showCardList;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if(dialog)
|
||||
return dialog->CheckUserInput(key);
|
||||
|
||||
return JGuiController::CheckUserInput(key);
|
||||
}
|
||||
@@ -164,8 +164,6 @@ void Task::loadAIDeckNames() {
|
||||
while (found){
|
||||
found = 0;
|
||||
char buffer[512];
|
||||
char smallDeckName[512];
|
||||
char deckDesc[512];
|
||||
sprintf(buffer, "%s/deck%i.txt",RESPATH"/ai/baka",nbDecks + 1);
|
||||
|
||||
if(fileExists(buffer)){
|
||||
|
||||
@@ -0,0 +1,490 @@
|
||||
#include "../include/config.h"
|
||||
#include "../include/OptionItem.h"
|
||||
#include "../include/PlayerData.h"
|
||||
#include "../include/Translate.h"
|
||||
#include "../include/PriceList.h"
|
||||
#include "../include/Subtypes.h"
|
||||
#include <algorithm>
|
||||
|
||||
//WSyncable
|
||||
bool WSyncable::Hook(WSyncable* s){
|
||||
if(hooked)
|
||||
return false;
|
||||
hooked = s;
|
||||
return true;
|
||||
}
|
||||
int WSyncable::getPos(){
|
||||
if(hooked)
|
||||
return hooked->getPos()+currentPos;
|
||||
return currentPos;
|
||||
}
|
||||
bool WSyncable::next(){
|
||||
if(hooked)
|
||||
return hooked->next();
|
||||
++currentPos;
|
||||
return true;
|
||||
}
|
||||
bool WSyncable::prev(){
|
||||
if(hooked)
|
||||
return hooked->prev();
|
||||
--currentPos;
|
||||
return true;
|
||||
}
|
||||
|
||||
//WSrcImage
|
||||
JQuad * WSrcImage::getImage( int offset){
|
||||
return resources.RetrieveTempQuad(filename);
|
||||
}
|
||||
|
||||
WSrcImage::WSrcImage(string s){
|
||||
filename = s;
|
||||
}
|
||||
//WSrcCards
|
||||
WSrcCards::WSrcCards(float delay){
|
||||
mDelay = delay;
|
||||
mLastInput = 0;
|
||||
currentPos = 0;
|
||||
filtersRoot=NULL;
|
||||
}
|
||||
JQuad * WSrcCards::getImage( int offset){
|
||||
#if defined WIN32 || defined LINUX //Loading delay only on PSP.
|
||||
#else
|
||||
if(mDelay && mLastInput < mDelay){
|
||||
return resources.RetrieveCard(getCard(offset),RETRIEVE_EXISTING);
|
||||
}
|
||||
#endif
|
||||
|
||||
return resources.RetrieveCard(getCard(offset));
|
||||
}
|
||||
JQuad * WSrcCards::getThumb( int offset){
|
||||
return resources.RetrieveCard(getCard(offset),RETRIEVE_THUMB);
|
||||
}
|
||||
WSrcCards::~WSrcCards(){
|
||||
clearFilters();
|
||||
cards.clear();
|
||||
}
|
||||
void WSrcCards::bakeFilters(){
|
||||
vector<MTGCard*> temp;
|
||||
|
||||
setOffset(0);
|
||||
for(int t=0;t<Size();t++){
|
||||
temp.push_back(getCard(t));
|
||||
}
|
||||
setOffset(0);
|
||||
cards.clear();
|
||||
cards.swap(temp);
|
||||
clearFilters();
|
||||
return;
|
||||
}
|
||||
|
||||
bool WSrcCards::matchesFilters(MTGCard * c){
|
||||
if(!c) return false;
|
||||
if(!filtersRoot) return true;
|
||||
return filtersRoot->isMatch(c);
|
||||
}
|
||||
int WSrcCards::Size(bool all){
|
||||
if(!all && filtersRoot)
|
||||
return (int) validated.size();
|
||||
return (int) cards.size();
|
||||
}
|
||||
MTGCard * WSrcCards::getCard(int offset, bool ignore){
|
||||
int oldpos;
|
||||
int size = (int) cards.size();
|
||||
MTGCard * c = NULL;
|
||||
if(!ignore && filtersRoot)
|
||||
size = (int) validated.size();
|
||||
|
||||
if(!size)
|
||||
return NULL;
|
||||
|
||||
oldpos = currentPos;
|
||||
if(offset != 0)
|
||||
currentPos += offset;
|
||||
while(currentPos < 0)
|
||||
currentPos = size+currentPos;
|
||||
currentPos = currentPos % size;
|
||||
|
||||
if(!ignore && filtersRoot)
|
||||
c = cards[validated[currentPos]];
|
||||
else
|
||||
c = cards[currentPos];
|
||||
currentPos = oldpos;
|
||||
return c;
|
||||
}
|
||||
int WSrcCards::loadMatches(MTGAllCards* ac){
|
||||
map<int, MTGCard *>::iterator it;
|
||||
int count = 0;
|
||||
if(!ac)
|
||||
return count;
|
||||
|
||||
for(it=ac->collection.begin();it!=ac->collection.end();it++){
|
||||
if(it->second && (matchesFilters(it->second))){
|
||||
cards.push_back(it->second);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
validateFilters();
|
||||
return count;
|
||||
}
|
||||
int WSrcCards::loadMatches(MTGDeck * deck){
|
||||
map<int, int>::iterator it;
|
||||
int count = 0;
|
||||
if(!deck)
|
||||
return count;
|
||||
for(it=deck->cards.begin();it!=deck->cards.end();it++){
|
||||
MTGCard * c = deck->getCardById(it->first);
|
||||
if(c && (matchesFilters(c))){
|
||||
cards.push_back(c);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
validateFilters();
|
||||
return count;
|
||||
}
|
||||
int WSrcCards::loadMatches(WSrcCards* src, bool all){
|
||||
int count = 0;
|
||||
if(!src)
|
||||
return count;
|
||||
|
||||
MTGCard * c = NULL;
|
||||
size_t t = 0;
|
||||
int oldp = src->getOffset();
|
||||
src->setOffset(0);
|
||||
for(int t=0;t<src->Size(all);t++){
|
||||
c = src->getCard(t,all);
|
||||
if(matchesFilters(c)){
|
||||
cards.push_back(c);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
src->setOffset(oldp);
|
||||
validateFilters();
|
||||
return count;
|
||||
}
|
||||
int WSrcCards::addToDeck(MTGDeck * i, int num){
|
||||
int oldpos = getOffset();
|
||||
int added = 0;
|
||||
int cycles = 0;
|
||||
|
||||
if(!i){
|
||||
if(num < 0)
|
||||
return 0;
|
||||
return num;
|
||||
}
|
||||
|
||||
setOffset(0);
|
||||
if(num < 0){ //Add it all;
|
||||
MTGCard * c;
|
||||
for(;;){
|
||||
c = getCard();
|
||||
if(!c || !next())
|
||||
break;
|
||||
i->add(c);
|
||||
}
|
||||
}else while(added < num){
|
||||
MTGCard * c = getCard();
|
||||
if(!next() || !c){
|
||||
if(++cycles == WSrcCards::MAX_CYCLES){ //Abort the search, too many cycles.
|
||||
setOffset(oldpos);
|
||||
return num - added;
|
||||
}
|
||||
setOffset(0);
|
||||
continue;
|
||||
}else{
|
||||
i->add(c);
|
||||
added++;
|
||||
}
|
||||
}
|
||||
setOffset(oldpos);
|
||||
return 0;
|
||||
}
|
||||
bool WSrcCards::next(){
|
||||
int oldpos = currentPos;
|
||||
bool bMatch = true;
|
||||
int size = (int)cards.size();
|
||||
if(filtersRoot)
|
||||
size = (int)validated.size();
|
||||
if(currentPos+1 >= size)
|
||||
return false;
|
||||
currentPos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WSrcCards::prev(){
|
||||
int oldpos = currentPos;
|
||||
bool bMatch = true;
|
||||
if(currentPos == 0)
|
||||
return false;
|
||||
|
||||
currentPos--;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WSrcCards::setOffset(int pos){
|
||||
if(pos < 0 || pos >= (int) cards.size())
|
||||
return false;
|
||||
|
||||
currentPos = pos;
|
||||
if(!matchesFilters(cards[currentPos]))
|
||||
return next();
|
||||
|
||||
return true;
|
||||
}
|
||||
void WSrcCards::Shuffle(){
|
||||
vector<MTGCard*> a;
|
||||
MTGCard * temp;
|
||||
vector<MTGCard*>::iterator k;
|
||||
|
||||
while(cards.size()){
|
||||
k = cards.begin();
|
||||
k += rand() % cards.size();
|
||||
temp = *k;
|
||||
cards.erase(k);
|
||||
a.push_back(temp);
|
||||
}
|
||||
#if defined WIN32 || defined LINUX //PC performs a double shuffle for less streaking.
|
||||
while(a.size()){
|
||||
k = a.begin();
|
||||
k += rand() % a.size();
|
||||
temp = *k;
|
||||
a.erase(k);
|
||||
cards.push_back(temp);
|
||||
}
|
||||
#else //PSP does a straight swap for speed.
|
||||
cards.swap(a);
|
||||
#endif
|
||||
validateFilters();
|
||||
}
|
||||
void WSrcCards::validateFilters(){
|
||||
validated.clear();
|
||||
for(size_t t=0;t<cards.size();t++){
|
||||
if(matchesFilters(cards[t]))
|
||||
validated.push_back(t);
|
||||
}
|
||||
}
|
||||
bool WSrcCards::thisCard(int mtgid){
|
||||
for(size_t t=0;t<cards.size();t++){
|
||||
if(cards[t] && cards[t]->getId() == mtgid){
|
||||
currentPos = (int) t;
|
||||
return matchesFilters(cards[currentPos]);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void WSrcCards::addFilter(WCardFilter * f) {
|
||||
if(filtersRoot == NULL)
|
||||
filtersRoot = f;
|
||||
else
|
||||
filtersRoot = NEW WCFilterAND(f,filtersRoot);
|
||||
validateFilters();
|
||||
currentPos = 0;
|
||||
}
|
||||
float WSrcCards::filterFee(){
|
||||
if(filtersRoot)
|
||||
return filtersRoot->filterFee();
|
||||
return 0;
|
||||
};
|
||||
void WSrcCards::clearFilters() {
|
||||
SAFE_DELETE(filtersRoot);
|
||||
validated.clear();
|
||||
}
|
||||
|
||||
void WSrcCards::Sort(int method){
|
||||
switch(method){
|
||||
case SORT_COLLECTOR:
|
||||
std::sort(cards.begin(),cards.end(),WCSortCollector());
|
||||
break;
|
||||
case SORT_ALPHA:
|
||||
default:
|
||||
std::sort(cards.begin(),cards.end(),WCSortAlpha());
|
||||
break;
|
||||
}
|
||||
validateFilters();
|
||||
}
|
||||
//WSrcUnlockedCards
|
||||
WSrcUnlockedCards::WSrcUnlockedCards(float delay): WSrcCards(mDelay){
|
||||
MTGAllCards * ac = GameApp::collection;
|
||||
map<int, MTGCard*>::iterator it;
|
||||
|
||||
char * unlocked = NULL;
|
||||
unlocked = (char *)calloc(setlist.size(),sizeof(char));
|
||||
//Figure out which sets are available.
|
||||
for (int i = 0; i < setlist.size(); i++){
|
||||
unlocked[i] = options[Options::optionSet(i)].number;
|
||||
}
|
||||
|
||||
for(it=ac->collection.begin();it!=ac->collection.end();it++){
|
||||
if(it->second && unlocked[it->second->setId])
|
||||
cards.push_back(it->second);
|
||||
}
|
||||
if(unlocked){
|
||||
free(unlocked);
|
||||
unlocked = NULL;
|
||||
}
|
||||
|
||||
|
||||
if(cards.size()){
|
||||
Shuffle();
|
||||
currentPos = 0;
|
||||
}
|
||||
}
|
||||
|
||||
//WSrcDeck
|
||||
int WSrcDeck::loadMatches(MTGDeck * deck){
|
||||
map<int, int>::iterator it;
|
||||
int count = 0;
|
||||
if(!deck)
|
||||
return count;
|
||||
for(it=deck->cards.begin();it!=deck->cards.end();it++){
|
||||
MTGCard * c = deck->getCardById(it->first);
|
||||
if(c && matchesFilters(c)){
|
||||
Add(c,it->second);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
validateFilters();
|
||||
return count;
|
||||
}
|
||||
|
||||
int WSrcDeck::Add(MTGCard * c, int quantity){
|
||||
if(!c)
|
||||
return 0;
|
||||
if(copies.find(c->getMTGId()) == copies.end())
|
||||
cards.push_back(c); //FIXME Make sure these two stay synced.
|
||||
copies[c->getMTGId()] += quantity;
|
||||
totalCards += quantity;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int WSrcDeck::Remove(MTGCard * c, int quantity, bool erase){
|
||||
if(!c) return 0;
|
||||
map<int,int>::iterator it = copies.find(c->getMTGId());
|
||||
if(it == copies.end()) return 0;
|
||||
int amt = it->second;
|
||||
if(amt < quantity)
|
||||
return 0;
|
||||
amt -= quantity;
|
||||
it->second = amt;
|
||||
if(erase && amt == 0){
|
||||
copies.erase(it);
|
||||
vector<MTGCard*>::iterator i = find(cards.begin(),cards.end(),c);
|
||||
if(i != cards.end())
|
||||
cards.erase(i);
|
||||
}
|
||||
totalCards -= quantity;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void WSrcDeck::Rebuild(MTGDeck * d){
|
||||
d->removeAll();
|
||||
map<int,int>::iterator it;
|
||||
for ( it=copies.begin() ; it != copies.end(); it++ ){
|
||||
for (int i = 0; i < it->second; i++){
|
||||
d->add(it->first);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int WSrcDeck::count(MTGCard * c){
|
||||
if(copies.find(c->getMTGId()) == copies.end())
|
||||
return 0;
|
||||
return copies[c->getMTGId()];
|
||||
}
|
||||
|
||||
int WSrcDeck::countByName(MTGCard * card, bool editions){
|
||||
string name = card->data->getLCName();
|
||||
int total = 0;
|
||||
vector<MTGCard*>::iterator it;
|
||||
for(it = cards.begin();it!=cards.end();it++){
|
||||
if(*it && (*it)->data->getLCName() == card->data->getLCName()){
|
||||
if(editions)
|
||||
total++;
|
||||
else
|
||||
total += copies[card->getMTGId()];
|
||||
}
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
int WSrcDeck::totalPrice(){
|
||||
int total = 0;
|
||||
PriceList * pricelist = NEW PriceList(RESPATH"/settings/prices.dat",GameApp::collection);
|
||||
map<int,int>::iterator it;
|
||||
for ( it=copies.begin() ; it != copies.end(); it++ ){
|
||||
int nb = it->second;
|
||||
if (nb) total += pricelist->getPrice(it->first);
|
||||
}
|
||||
delete pricelist;
|
||||
return total;
|
||||
}
|
||||
|
||||
int WSrcDeck::totalCopies(){
|
||||
return totalCards;
|
||||
}
|
||||
//Sorting methods:
|
||||
|
||||
bool WCSortAlpha::operator()(const MTGCard*l, const MTGCard*r){
|
||||
if(!l || !r || !l->data || !r->data)
|
||||
return false;
|
||||
string ln = l->data->getLCName();
|
||||
string rn = r->data->getLCName();
|
||||
return (ln < rn);
|
||||
}
|
||||
bool WCSortCollector::operator()(const MTGCard*l, const MTGCard*r){
|
||||
if(!l || !r || !l->data || !r->data)
|
||||
return false;
|
||||
|
||||
if(l->setId != r->setId)
|
||||
return (l->setId < r->setId);
|
||||
|
||||
int lc, rc;
|
||||
lc = l->data->countColors(); rc = r->data->countColors();
|
||||
if(lc == 0) lc = 999;
|
||||
if(rc == 0) rc = 999;
|
||||
|
||||
int isW = (int)l->data->hasColor(Constants::MTG_COLOR_WHITE) - (int) r->data->hasColor(Constants::MTG_COLOR_WHITE);
|
||||
int isU = (int)l->data->hasColor(Constants::MTG_COLOR_BLUE) - (int) r->data->hasColor(Constants::MTG_COLOR_BLUE);
|
||||
int isB = (int)l->data->hasColor(Constants::MTG_COLOR_BLACK) - (int) r->data->hasColor(Constants::MTG_COLOR_BLACK);
|
||||
int isR = (int)l->data->hasColor(Constants::MTG_COLOR_RED) - (int) r->data->hasColor(Constants::MTG_COLOR_RED);
|
||||
int isG = (int)l->data->hasColor(Constants::MTG_COLOR_GREEN) - (int) r->data->hasColor(Constants::MTG_COLOR_GREEN);
|
||||
int isArt = (int)l->data->hasType(Subtypes::TYPE_ARTIFACT) - (int) r->data->hasType(Subtypes::TYPE_ARTIFACT);
|
||||
int isLand = (int)l->data->hasType(Subtypes::TYPE_LAND) - (int) r->data->hasType(Subtypes::TYPE_LAND);
|
||||
|
||||
//Nested if hell. TODO: Farm these out to their own objects as a user-defined filter/sort system.
|
||||
if(!isLand){
|
||||
int isBasic = (int)l->data->hasType("Basic") - (int) r->data->hasType("Basic");
|
||||
if(!isBasic){
|
||||
if(!isArt){
|
||||
if(lc == rc){
|
||||
if(!isG){
|
||||
if(!isR){
|
||||
if(!isB){
|
||||
if(!isU){
|
||||
if(!isW){
|
||||
string ln = l->data->getLCName();
|
||||
string rn = r->data->getLCName();
|
||||
if(ln.substr(0,4) == "the ")
|
||||
ln = ln.substr(4);
|
||||
if(rn.substr(0,4) == "the ")
|
||||
rn = rn.substr(4);
|
||||
return (ln < rn);
|
||||
}
|
||||
return (isW < 0);
|
||||
}
|
||||
return (isU < 0);
|
||||
}
|
||||
return (isB < 0);
|
||||
}
|
||||
return (isR < 0);
|
||||
}
|
||||
return (isG < 0);
|
||||
}
|
||||
return (lc < rc);
|
||||
}
|
||||
return (isArt < 0);
|
||||
}
|
||||
else return(isBasic < 0);
|
||||
}
|
||||
return (isLand < 0);
|
||||
}
|
||||
@@ -0,0 +1,329 @@
|
||||
#include "../include/config.h"
|
||||
#include "../include/OptionItem.h"
|
||||
#include "../include/PlayerData.h"
|
||||
#include "../include/Translate.h"
|
||||
#include <algorithm>
|
||||
|
||||
|
||||
//WCFilterFactory
|
||||
WCFilterFactory* WCFilterFactory::me = NULL;
|
||||
|
||||
WCFilterFactory* WCFilterFactory::GetInstance() {
|
||||
if(!me)
|
||||
me = NEW WCFilterFactory();
|
||||
return me;
|
||||
}
|
||||
void WCFilterFactory::Destroy(){
|
||||
SAFE_DELETE(me);
|
||||
}
|
||||
size_t WCFilterFactory::findNext(string src, size_t start,char open, char close){
|
||||
int num = 0;
|
||||
for(size_t x=start;x<src.size();x++){
|
||||
if(src[x] == open)
|
||||
num++;
|
||||
if(src[x] == close){
|
||||
num--;
|
||||
if(num == 0)
|
||||
return x;
|
||||
}
|
||||
}
|
||||
return string::npos;
|
||||
}
|
||||
WCardFilter * WCFilterFactory::Construct(string in){
|
||||
size_t x = 0;
|
||||
string src;
|
||||
|
||||
for(x=0;x < in.size();x++){
|
||||
if(isspace(in[x]))
|
||||
continue;
|
||||
src+=in[x];
|
||||
}
|
||||
|
||||
if(!src.size())
|
||||
return NEW WCFilterNULL(); //Empty string.
|
||||
|
||||
|
||||
for(size_t i=0;i<src.size();i++){
|
||||
unsigned char c = src[i];
|
||||
if(isspace(c))
|
||||
continue;
|
||||
if(c == '('){ //Parenthesis
|
||||
size_t endp = findNext(src,i);
|
||||
if(endp != string::npos){
|
||||
WCFilterGROUP * g = NEW WCFilterGROUP(Construct(src.substr(i+1,endp-1)));
|
||||
if(endp < src.size()){
|
||||
if(src[endp+1] == '|')
|
||||
return NEW WCFilterOR(g,Construct(src.substr(endp+2)));
|
||||
else if(src[endp+1] == '&')
|
||||
return NEW WCFilterAND(g,Construct(src.substr(endp+2)));
|
||||
else
|
||||
return g;
|
||||
}
|
||||
}
|
||||
else
|
||||
return NEW WCFilterNULL();
|
||||
}else if(c == '{'){ //Negation
|
||||
size_t endp = findNext(src,i,'{','}');
|
||||
if(endp != string::npos){
|
||||
WCFilterNOT * g = NEW WCFilterNOT(Construct(src.substr(i+1,endp-1)));
|
||||
if(endp < src.size()){
|
||||
if(src[endp+1] == '|')
|
||||
return NEW WCFilterOR(g,Construct(src.substr(endp+2)));
|
||||
else if(src[endp+1] == '&')
|
||||
return NEW WCFilterAND(g,Construct(src.substr(endp+2)));
|
||||
else
|
||||
return g;
|
||||
}
|
||||
}
|
||||
else
|
||||
return NEW WCFilterNULL();
|
||||
}else if(c == '&'){ //And
|
||||
return NEW WCFilterAND(Construct(src.substr(0,i)),Construct(src.substr(i+1)));
|
||||
}
|
||||
else if(c == '|'){ //Or
|
||||
return NEW WCFilterOR(Construct(src.substr(0,i)),Construct(src.substr(i+1)));
|
||||
}
|
||||
}
|
||||
return Leaf(src);
|
||||
}
|
||||
|
||||
WCardFilter * WCFilterFactory::Leaf(string src){
|
||||
string filter;
|
||||
|
||||
for(size_t i=0;i<src.size();i++){
|
||||
unsigned char c = src[i];
|
||||
if(isspace(c))
|
||||
continue;
|
||||
if(c == '('){ //Scan to ')', call Construct.
|
||||
size_t end = src.find(")",i);
|
||||
if(end != string::npos){
|
||||
string expr = src.substr(i+1,i-end);
|
||||
return NEW WCFilterGROUP(Construct(expr));
|
||||
}
|
||||
}else if(c == '{'){ //Scan to '}', call Construct.
|
||||
size_t end = src.find("}",i);
|
||||
if(end != string::npos){
|
||||
string expr = src.substr(i+1,i-end);
|
||||
return NEW WCFilterNOT(Construct(expr));
|
||||
}
|
||||
}else if(c == ':'){ //Scan ahead to ';', inbetween this is an argument
|
||||
size_t end = src.find(";",i);
|
||||
if(end != string::npos && filter.size()){
|
||||
string arg = src.substr(i+1,end-i-1);
|
||||
return Terminal(filter,arg);
|
||||
}
|
||||
}
|
||||
else
|
||||
filter += c;
|
||||
|
||||
}
|
||||
return NEW WCFilterNULL();
|
||||
}
|
||||
|
||||
WCardFilter * WCFilterFactory::Terminal(string type, string arg){
|
||||
std::transform(type.begin(),type.end(),type.begin(),::tolower);
|
||||
if(type == "r" || type == "rarity")
|
||||
return NEW WCFilterRarity(arg);
|
||||
else if(type == "c" || type == "color")
|
||||
return NEW WCFilterColor(arg);
|
||||
else if(type == "s" || type == "set")
|
||||
return NEW WCFilterSet(arg);
|
||||
else if(type == "t" || type == "type")
|
||||
return NEW WCFilterType(arg);
|
||||
else if(type == "a" || type == "ability")
|
||||
return NEW WCFilterAbility(arg);
|
||||
|
||||
return NEW WCFilterNULL();
|
||||
}
|
||||
|
||||
//WCFilterSet
|
||||
WCFilterSet::WCFilterSet(string arg){
|
||||
setid = setlist.findSet(arg);
|
||||
}
|
||||
string WCFilterSet::getCode(){
|
||||
char buf[256];
|
||||
sprintf(buf,"set:%s;",setlist[setid].c_str());
|
||||
return buf;
|
||||
};
|
||||
|
||||
//WCFilterColor
|
||||
bool WCFilterColor::isMatch(MTGCard * c){
|
||||
if(!c || !c->data)
|
||||
return false;
|
||||
return (c->data->hasColor(color) > 0);
|
||||
}
|
||||
string WCFilterColor::getCode(){
|
||||
char buf[12];
|
||||
char c = '?';
|
||||
if(color < 0 || color >= Constants::MTG_NB_COLORS)
|
||||
c = Constants::MTGColorChars[color];
|
||||
sprintf(buf,"color:%c;",c);
|
||||
return buf;
|
||||
};
|
||||
WCFilterColor::WCFilterColor(string arg){
|
||||
color = -1;
|
||||
char c = tolower(arg[0]);
|
||||
for(int i=0;i<Constants::MTG_NB_COLORS;i++){
|
||||
if(Constants::MTGColorChars[i] == c){
|
||||
color = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//WCFilterRarity
|
||||
float WCFilterRarity::filterFee(){
|
||||
switch(rarity){
|
||||
case 'M': return 0.4f;
|
||||
case 'R': return 0.2f;
|
||||
case 'U': return 0.1f;
|
||||
case 'C': return 0.01f;
|
||||
}
|
||||
return 0.0f;
|
||||
}
|
||||
bool WCFilterRarity::isMatch(MTGCard * c){
|
||||
if(!c || !c->data)
|
||||
return false;
|
||||
return (c->getRarity() == rarity);
|
||||
}
|
||||
string WCFilterRarity::getCode(){
|
||||
char buf[64];
|
||||
const char* rarities[7] = {"any","token","land","common","uncommon","rare","mythic"};
|
||||
int x = 0;
|
||||
switch(rarity){
|
||||
case 'M': x=6; break;
|
||||
case 'R': x=5; break;
|
||||
case 'U': x=4; break;
|
||||
case 'C': x=3; break;
|
||||
case 'L': x=2; break;
|
||||
case 'T': x=1; break;
|
||||
}
|
||||
sprintf(buf,"rarity:%s;",rarities[x]);
|
||||
return buf;
|
||||
};
|
||||
WCFilterRarity::WCFilterRarity(string arg){
|
||||
rarity = -1;
|
||||
char c = toupper(arg[0]);
|
||||
switch(c){
|
||||
case 'M':
|
||||
case 'R':
|
||||
case 'U':
|
||||
case 'C':
|
||||
case 'L':
|
||||
case 'T':
|
||||
rarity = c;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//WCFilterAbility
|
||||
bool WCFilterAbility::isMatch(MTGCard * c){
|
||||
if(ability < 0)
|
||||
return false;
|
||||
map<int,int>::iterator it = c->data->basicAbilities.find(ability);
|
||||
|
||||
if(it != c->data->basicAbilities.end()){
|
||||
if(it->second > 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
WCFilterAbility::WCFilterAbility(string arg){
|
||||
std::transform(arg.begin(),arg.end(),arg.begin(),::tolower);
|
||||
for(int i = 0;i<Constants::NB_BASIC_ABILITIES;i++){
|
||||
if(arg == Constants::MTGBasicAbilities[i]){
|
||||
ability = i;
|
||||
return;
|
||||
}
|
||||
}
|
||||
ability = -1;
|
||||
}
|
||||
string WCFilterAbility::getCode(){
|
||||
char buf[64];
|
||||
if(ability < 0 || ability >= Constants::NB_BASIC_ABILITIES)
|
||||
return "";
|
||||
sprintf(buf,"ability:%s;",Constants::MTGBasicAbilities[ability]);
|
||||
return buf;
|
||||
};
|
||||
float WCFilterAbility::filterFee(){
|
||||
switch(ability){
|
||||
case Constants::SHROUD:
|
||||
case Constants::DEATHTOUCH:
|
||||
case Constants::UNBLOCKABLE:
|
||||
case Constants::WITHER:
|
||||
case Constants::PERSIST:
|
||||
return 0.4f;
|
||||
case Constants::PROTECTIONBLACK:
|
||||
case Constants::PROTECTIONWHITE:
|
||||
case Constants::PROTECTIONBLUE:
|
||||
case Constants::PROTECTIONRED:
|
||||
case Constants::PROTECTIONGREEN:
|
||||
case Constants::DOUBLESTRIKE:
|
||||
case Constants::LIFELINK:
|
||||
return 0.35f;
|
||||
case Constants::TRAMPLE:
|
||||
case Constants::FLYING:
|
||||
case Constants::FEAR:
|
||||
case Constants::VIGILANCE:
|
||||
case Constants::FIRSTSTRIKE:
|
||||
return 0.3f;
|
||||
case Constants::PLAINSHOME:
|
||||
case Constants::SWAMPHOME:
|
||||
case Constants::ISLANDHOME:
|
||||
case Constants::MOUNTAINHOME:
|
||||
case Constants::FORESTHOME:
|
||||
return -0.1f;
|
||||
case Constants::DEFENDER:
|
||||
case Constants::CLOUD:
|
||||
return 0.1f;
|
||||
default:
|
||||
return 0.2f;
|
||||
}
|
||||
return 0.0f;
|
||||
}
|
||||
//WCFilterType
|
||||
bool WCFilterType::isMatch(MTGCard * c){
|
||||
return c->data->hasType(type.c_str());
|
||||
}
|
||||
string WCFilterType::getCode(){
|
||||
char buf[4068];
|
||||
sprintf(buf,"type:%s;",type.c_str());
|
||||
return buf;
|
||||
}
|
||||
//Misc. filter code
|
||||
float WCFilterAND::filterFee(){
|
||||
return lhs->filterFee() + rhs->filterFee();
|
||||
}
|
||||
float WCFilterOR::filterFee(){
|
||||
if(lhs->filterFee() > rhs->filterFee())
|
||||
return lhs->filterFee();
|
||||
return rhs->filterFee();
|
||||
}
|
||||
string WCFilterNOT::getCode(){
|
||||
char buf[4068];
|
||||
sprintf(buf,"{%s}",kid->getCode().c_str());
|
||||
return buf;
|
||||
}
|
||||
string WCFilterGROUP::getCode(){
|
||||
char buf[4068];
|
||||
sprintf(buf,"(%s)",kid->getCode().c_str());
|
||||
return buf;
|
||||
}
|
||||
|
||||
string WCFilterAND::getCode(){
|
||||
char buf[4068];
|
||||
sprintf(buf,"%s&%s",lhs->getCode().c_str(),rhs->getCode().c_str());
|
||||
return buf;
|
||||
}
|
||||
string WCFilterOR::getCode(){
|
||||
char buf[4068];
|
||||
sprintf(buf,"%s|%s",lhs->getCode().c_str(),rhs->getCode().c_str());
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
bool WCFilterOR::isMatch(MTGCard *c){
|
||||
if(lhs->isMatch(c))
|
||||
return true;
|
||||
if(rhs->isMatch(c))
|
||||
return true;
|
||||
return false;
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user