New descriptive text popup feature for deck selection

http://wololo.net/forum/viewtopic.php?f=13&t=2423
This commit is contained in:
techdragon.nguyen@gmail.com
2010-11-18 15:48:48 +00:00
parent f7bcbb42dc
commit 2a8f8074e6
17 changed files with 5715 additions and 5198 deletions
+68 -67
View File
@@ -16,106 +16,107 @@
#include "JGE.h" #include "JGE.h"
#include "JSprite.h" #include "JSprite.h"
#define MAX_GUIOBJECT 64 #define MAX_GUIOBJECT 64
#define JGUI_STYLE_LEFTRIGHT 0x01 #define JGUI_STYLE_LEFTRIGHT 0x01
#define JGUI_STYLE_UPDOWN 0x02 #define JGUI_STYLE_UPDOWN 0x02
#define JGUI_STYLE_WRAPPING 0x04 #define JGUI_STYLE_WRAPPING 0x04
#define JGUI_INITIAL_DELAY 0.4 #define JGUI_INITIAL_DELAY 0.4
#define JGUI_REPEAT_DELAY 0.2 #define JGUI_REPEAT_DELAY 0.2
const int kCancelMenuID = -1; const int kCancelMenuID = -1;
const int kInfoMenuID = -200;
class JGuiListener class JGuiListener
{ {
public: public:
virtual ~JGuiListener() {} virtual ~JGuiListener()
virtual void ButtonPressed(int controllerId, int controlId) = 0; {
}
virtual void ButtonPressed(int controllerId, int controlId) = 0;
}; };
class JGuiObject class JGuiObject
{ {
protected: protected:
static JGE* mEngine; static JGE* mEngine;
private: private:
int mId; int mId;
public:
JGuiObject(int id);
virtual ~JGuiObject();
public: virtual void Render() = 0;
JGuiObject(int id); virtual std::ostream& toString(std::ostream&) const = 0;
virtual ~JGuiObject(); virtual void Update(float dt);
virtual void Render() = 0; virtual void Entering(); // when focus is transferring to this obj
virtual std::ostream& toString(std::ostream&) const = 0; virtual bool Leaving(JButton key); // when focus is transferring away from this obj, true to go ahead
virtual void Update(float dt); virtual bool ButtonPressed(); // action button pressed, return false to ignore
virtual void Entering(); // when focus is transferring to this obj // Used for mouse support so that the GUI engine can found out which Object was selected
virtual bool Leaving(JButton key); // when focus is transferring away from this obj, true to go ahead virtual bool getTopLeft(int& top, int& left)
virtual bool ButtonPressed(); // action button pressed, return false to ignore {
return false;
}
;
// Used for mouse support so that the GUI engine can found out which Object was selected int GetId();
virtual bool getTopLeft(int& top, int& left) {return false;};
int GetId();
}; };
class JGuiController class JGuiController
{ {
protected: protected:
static JGE* mEngine; static JGE* mEngine;
int mId; int mId;
bool mActive; bool mActive;
JButton mActionButton;
JButton mCancelButton;
int mCurr;
int mStyle;
JButton mActionButton; JSprite* mCursor;
JButton mCancelButton; bool mShowCursor;
int mCurr; int mCursorX;
int mStyle; int mCursorY;
JSprite* mCursor; int mBgX;
bool mShowCursor; int mBgY;
int mCursorX; const JTexture* mBg;
int mCursorY; PIXEL_TYPE mShadingColor;
Rect* mShadingBg;
int mBgX; JGuiListener* mListener;
int mBgY; //int mKeyHoldTime;
const JTexture* mBg;
PIXEL_TYPE mShadingColor;
Rect* mShadingBg;
JGuiListener* mListener; public:
//int mKeyHoldTime; vector<JGuiObject*> mObjects;
int mCount;
public: JGuiController(int id, JGuiListener* listener);
vector<JGuiObject*> mObjects; ~JGuiController();
int mCount;
JGuiController(int id, JGuiListener* listener); virtual void Render();
~JGuiController(); virtual void Update(float dt);
virtual bool CheckUserInput(JButton key);
virtual void Render(); void Add(JGuiObject* ctrl);
virtual void Update(float dt); void RemoveAt(int i);
virtual bool CheckUserInput(JButton key); void Remove(int id);
void Remove(JGuiObject* ctrl);
void Add(JGuiObject* ctrl); void SetActionButton(JButton button);
void RemoveAt(int i); void SetStyle(int style);
void Remove(int id); void SetCursor(JSprite* cursor);
void Remove(JGuiObject* ctrl);
void SetActionButton(JButton button); bool IsActive();
void SetStyle(int style); void SetActive(bool flag);
void SetCursor(JSprite* cursor);
bool IsActive();
void SetActive(bool flag);
//void SetImageBackground(const JTexture* tex, int x, int y);
//void SetShadingBackground(int x, int y, int width, int height, PIXEL_TYPE color);
}; };
ostream& operator<<(ostream &out, const JGuiObject &j); ostream& operator<<(ostream &out, const JGuiObject &j);
+159 -150
View File
@@ -15,233 +15,242 @@ JGE* JGuiObject::mEngine = NULL;
JGE* JGuiController::mEngine = NULL; JGE* JGuiController::mEngine = NULL;
JGuiObject::JGuiObject(int id) :
JGuiObject::JGuiObject(int id): mId(id) mId(id)
{ {
mEngine = JGE::GetInstance(); mEngine = JGE::GetInstance();
} }
JGuiObject::~JGuiObject() JGuiObject::~JGuiObject()
{ {
// JGERelease(); // JGERelease();
} }
bool JGuiObject::Leaving(JButton key __attribute__((unused))) bool JGuiObject::Leaving(JButton key __attribute__((unused)))
{ {
return true; return true;
} }
bool JGuiObject::ButtonPressed() bool JGuiObject::ButtonPressed()
{ {
return false; return false;
} }
void JGuiObject::Entering() void JGuiObject::Entering()
{ {
} }
int JGuiObject::GetId() int JGuiObject::GetId()
{ {
return mId; return mId;
} }
void JGuiObject::Update(float dt __attribute__((unused))) void JGuiObject::Update(float dt __attribute__((unused)))
{ {
} }
ostream& operator<<(ostream &out, const JGuiObject &j) ostream& operator<<(ostream &out, const JGuiObject &j)
{ {
return j.toString(out); return j.toString(out);
} }
JGuiController::JGuiController(int id, JGuiListener* listener) : mId(id), mListener(listener) JGuiController::JGuiController(int id, JGuiListener* listener) :
mId(id), mListener(listener)
{ {
mEngine = JGE::GetInstance(); mEngine = JGE::GetInstance();
mBg = NULL; mBg = NULL;
mShadingBg = NULL; mShadingBg = NULL;
mCount = 0; mCount = 0;
mCurr = 0; mCurr = 0;
mCursorX = SCREEN_WIDTH/2; mCursorX = SCREEN_WIDTH / 2;
mCursorY = SCREEN_HEIGHT/2; mCursorY = SCREEN_HEIGHT / 2;
mShowCursor = false; mShowCursor = false;
mActionButton = JGE_BTN_OK; mActionButton = JGE_BTN_OK;
mCancelButton = JGE_BTN_MENU; mCancelButton = JGE_BTN_MENU;
mStyle = JGUI_STYLE_WRAPPING; mStyle = JGUI_STYLE_WRAPPING;
mActive = true; mActive = true;
} }
JGuiController::~JGuiController() JGuiController::~JGuiController()
{ {
for (int i=0;i<mCount;i++) for (int i = 0; i < mCount; i++)
if (mObjects[i]!=NULL) if (mObjects[i] != NULL) delete mObjects[i];
delete mObjects[i];
} }
void JGuiController::Render() void JGuiController::Render()
{ {
for (int i=0;i<mCount;i++) for (int i = 0; i < mCount; i++)
if (mObjects[i]!=NULL) if (mObjects[i] != NULL) mObjects[i]->Render();
mObjects[i]->Render();
} }
bool JGuiController::CheckUserInput(JButton key){ bool JGuiController::CheckUserInput(JButton key)
{
if (!mCount) return false; if (!mCount) return false;
if (key == mActionButton) if (key == mActionButton)
{
if (mObjects[mCurr] != NULL && mObjects[mCurr]->ButtonPressed())
{ {
if (mListener != NULL) if (!mObjects.empty() && mObjects[mCurr] != NULL && mObjects[mCurr]->ButtonPressed())
mListener->ButtonPressed(mId, mObjects[mCurr]->GetId());
return true;
}
}
else if (key == mCancelButton)
{
if (mListener != NULL)
{
mListener->ButtonPressed(mId, kCancelMenuID);
}
}
else if ((JGE_BTN_LEFT == key) || (JGE_BTN_UP == key)) // || mEngine->GetAnalogY() < 64 || mEngine->GetAnalogX() < 64)
{
int n = mCurr;
n--;
if (n<0)
{
if ((mStyle&JGUI_STYLE_WRAPPING))
n = mCount-1;
else
n = 0;
}
if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(JGE_BTN_UP))
{
mCurr = n;
mObjects[mCurr]->Entering();
}
return true;
}
else if ((JGE_BTN_RIGHT == key) || (JGE_BTN_DOWN == key)) // || mEngine->GetAnalogY()>192 || mEngine->GetAnalogX()>192)
{
int n = mCurr;
n++;
if (n>mCount-1)
{
if ((mStyle&JGUI_STYLE_WRAPPING))
n = 0;
else
n = mCount-1;
}
if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(JGE_BTN_DOWN))
{
mCurr = n;
mObjects[mCurr]->Entering();
}
return true;
}
else
{ // a dude may have clicked somewhere, we're gonna select the closest object from where he clicked
int x, y;
unsigned int distance2;
unsigned int minDistance2 = -1;
int n = mCurr;
if(mEngine->GetLeftClickCoordinates(x, y))
{
for(int i = 0; i < mCount; i++)
{
int top, left;
if(mObjects[i]->getTopLeft(top, left))
{ {
distance2 = (top-y)*(top-y) + (left-x)*(left-x); if (mListener != NULL) mListener->ButtonPressed(mId, mObjects[mCurr]->GetId());
if(distance2 < minDistance2) return true;
{
minDistance2 = distance2;
n = i;
}
} }
}
if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(JGE_BTN_DOWN))
{
mCurr = n;
mObjects[mCurr]->Entering();
}
mEngine->LeftClickedProcessed();
return true;
} }
} else if (key == mCancelButton)
return false; {
if (mListener != NULL)
{
mListener->ButtonPressed(mId, kCancelMenuID);
}
}
else if (JGE_BTN_CANCEL == key)
{
if (mListener != NULL) mListener->ButtonPressed(mId, kInfoMenuID);
}
else if ((JGE_BTN_LEFT == key) || (JGE_BTN_UP == key)) // || mEngine->GetAnalogY() < 64 || mEngine->GetAnalogX() < 64)
{
int n = mCurr;
n--;
if (n < 0)
{
if ((mStyle & JGUI_STYLE_WRAPPING))
n = mCount - 1;
else
n = 0;
}
if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(JGE_BTN_UP))
{
mCurr = n;
mObjects[mCurr]->Entering();
}
return true;
}
else if ((JGE_BTN_RIGHT == key) || (JGE_BTN_DOWN == key)) // || mEngine->GetAnalogY()>192 || mEngine->GetAnalogX()>192)
{
int n = mCurr;
n++;
if (n > mCount - 1)
{
if ((mStyle & JGUI_STYLE_WRAPPING))
n = 0;
else
n = mCount - 1;
}
if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(JGE_BTN_DOWN))
{
mCurr = n;
mObjects[mCurr]->Entering();
}
return true;
}
else
{ // a dude may have clicked somewhere, we're gonna select the closest object from where he clicked
int x, y;
unsigned int distance2;
unsigned int minDistance2 = -1;
int n = mCurr;
if (mEngine->GetLeftClickCoordinates(x, y))
{
for (int i = 0; i < mCount; i++)
{
int top, left;
if (mObjects[i]->getTopLeft(top, left))
{
distance2 = (top - y) * (top - y) + (left - x) * (left - x);
if (distance2 < minDistance2)
{
minDistance2 = distance2;
n = i;
}
}
}
if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(JGE_BTN_DOWN))
{
mCurr = n;
mObjects[mCurr]->Entering();
}
mEngine->LeftClickedProcessed();
return true;
}
}
return false;
} }
void JGuiController::Update(float dt) void JGuiController::Update(float dt)
{ {
for (int i=0;i<mCount;i++) for (int i = 0; i < mCount; i++)
if (mObjects[i]!=NULL) if (mObjects[i] != NULL) mObjects[i]->Update(dt);
mObjects[i]->Update(dt);
JButton key = mEngine->ReadButton(); JButton key = mEngine->ReadButton();
CheckUserInput(key); CheckUserInput(key);
} }
void JGuiController::Add(JGuiObject* ctrl) void JGuiController::Add(JGuiObject* ctrl)
{ {
mObjects.push_back(ctrl); mObjects.push_back(ctrl);
mCount++; mCount++;
} }
void JGuiController::RemoveAt(int i){ void JGuiController::RemoveAt(int i)
{
if (!mObjects[i]) return; if (!mObjects[i]) return;
mObjects.erase(mObjects.begin()+i); mObjects.erase(mObjects.begin() + i);
delete mObjects[i]; delete mObjects[i];
mCount--; mCount--;
if (mCurr == mCount) if (mCurr == mCount) mCurr = 0;
mCurr = 0; return;
return;
} }
void JGuiController::Remove(int id) void JGuiController::Remove(int id)
{ {
for (int i=0;i<mCount;i++) for (int i = 0; i < mCount; i++)
{ {
if (mObjects[i] != NULL && mObjects[i]->GetId()==id) { if (mObjects[i] != NULL && mObjects[i]->GetId() == id)
RemoveAt(i); {
return; RemoveAt(i);
} return;
}
} }
} }
void JGuiController::Remove(JGuiObject* ctrl) void JGuiController::Remove(JGuiObject* ctrl)
{ {
for (int i=0;i<mCount;i++) for (int i = 0; i < mCount; i++)
{ {
if (mObjects[i] != NULL && mObjects[i]==ctrl) { if (mObjects[i] != NULL && mObjects[i] == ctrl)
RemoveAt(i); {
return; RemoveAt(i);
} return;
}
} }
} }
void JGuiController::SetActionButton(JButton button)
void JGuiController::SetActionButton(JButton button) { mActionButton = button; } {
void JGuiController::SetStyle(int style) { mStyle = style; } mActionButton = button;
void JGuiController::SetCursor(JSprite* cursor) { mCursor = cursor; } }
bool JGuiController::IsActive() { return mActive; } void JGuiController::SetStyle(int style)
void JGuiController::SetActive(bool flag) { mActive = flag; } {
mStyle = style;
}
void JGuiController::SetCursor(JSprite* cursor)
{
mCursor = cursor;
}
bool JGuiController::IsActive()
{
return mActive;
}
void JGuiController::SetActive(bool flag)
{
mActive = flag;
}
+1 -1
View File
@@ -1,4 +1,4 @@
OBJS = objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIStats.o objs/AllAbilities.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardPrimitive.o objs/CardSelector.o objs/CardSelectorSingleton.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DeckDataWrapper.o objs/DeckEditorMenu.o objs/DeckMenu.o objs/DeckMenuItem.o objs/DeckMetaData.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateAwards.o objs/GameStateDeckViewer.o objs/GameStateDuel.o objs/DeckManager.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GameStateStory.o objs/GameStateTransitions.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGPack.o objs/MTGRules.o objs/Navigator.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/Pos.o objs/PrecompiledHeader.o objs/PriceList.o objs/ReplacementEffects.o objs/Rules.o objs/SimpleMenu.o objs/SimpleMenuItem.o objs/SimplePad.o objs/StoryFlow.o objs/StyleManager.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/ThisDescriptor.o objs/Token.o objs/Translate.o objs/TranslateKeys.o objs/Trash.o objs/utils.o objs/WEvent.o objs/WResourceManager.o objs/WCachedResource.o objs/WDataSrc.o objs/WGui.o objs/WFilter.o objs/Tasks.o objs/WFont.o OBJS = objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIStats.o objs/AllAbilities.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardPrimitive.o objs/CardSelector.o objs/CardSelectorSingleton.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DeckDataWrapper.o objs/DeckEditorMenu.o objs/DeckMenu.o objs/DeckMenuItem.o objs/DeckMetaData.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateAwards.o objs/GameStateDeckViewer.o objs/GameStateDuel.o objs/DeckManager.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GameStateStory.o objs/GameStateTransitions.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGPack.o objs/MTGRules.o objs/Navigator.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/Pos.o objs/PrecompiledHeader.o objs/PriceList.o objs/ReplacementEffects.o objs/Rules.o objs/SimpleMenu.o objs/SimpleMenuItem.o objs/SimplePad.o objs/SimplePopup.o objs/StoryFlow.o objs/StyleManager.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/ThisDescriptor.o objs/Token.o objs/Translate.o objs/TranslateKeys.o objs/Trash.o objs/utils.o objs/WEvent.o objs/WResourceManager.o objs/WCachedResource.o objs/WDataSrc.o objs/WGui.o objs/WFilter.o objs/Tasks.o objs/WFont.o
DEPS = $(patsubst objs/%.o, deps/%.d, $(OBJS)) DEPS = $(patsubst objs/%.o, deps/%.d, $(OBJS))
RESULT = $(shell psp-config --psp-prefix 2> Makefile.cache) RESULT = $(shell psp-config --psp-prefix 2> Makefile.cache)
+52 -40
View File
@@ -1,6 +1,6 @@
/* /*
A class for very simple menus structure A class for menus with a fixed layout
*/ */
#ifndef _DeckMenu_H_ #ifndef _DeckMenu_H_
#define _DeckMenu_H_ #define _DeckMenu_H_
@@ -10,54 +10,66 @@
#include "DeckMetaData.h" #include "DeckMetaData.h"
#include "TextScroller.h" #include "TextScroller.h"
class DeckMenu:public JGuiController{ class DeckMenu: public JGuiController
protected: {
protected:
float mHeight, mWidth, mX, mY; float mHeight, mWidth, mX, mY;
float titleX, titleY, titleWidth; float titleX, titleY, titleWidth;
float descX, descY, descHeight, descWidth; float descX, descY, descHeight, descWidth;
float statsX, statsY, statsHeight, statsWidth; float statsX, statsY, statsHeight, statsWidth;
float avatarX, avatarY; float avatarX, avatarY;
float starsOffsetX; float detailedInfoBoxX, detailedInfoBoxY;
float starsOffsetX;
bool menuInitialized; bool menuInitialized;
string backgroundName; string backgroundName;
int fontId; int fontId;
string title; string title;
string displayTitle; string displayTitle;
WFont * mFont; WFont * mFont;
float menuFontScale; float menuFontScale;
float titleFontScale; float titleFontScale;
int maxItems, startId; int maxItems, startId;
float selectionT, selectionY; float selectionT, selectionY;
float timeOpen; float timeOpen;
static hgeParticleSystem* stars; static hgeParticleSystem* stars;
void initMenuItems(); void initMenuItems();
string getDescription(); string getDescription();
string getMetaInformation(); string getMetaInformation();
DeckMetaData *selectedDeck;
public: public:
TextScroller * scroller; TextScroller * scroller;
bool autoTranslate; bool autoTranslate;
DeckMenu(int id, JGuiListener* listener, int fontId, const string _title = "", const float& mFontScale = 1.0f );
~DeckMenu();
void Render(); //used for detailed info button
void Update(float dt); JQuad * pspIcons[8];
void Add(int id, const char * Text, string desc = "", bool forceFocus = false, DeckMetaData *deckMetaData = NULL); JTexture * pspIconsTexture;
void Close(); DeckMetaData * getSelectedDeck();
void updateScroller(); bool selectedDeckHasDetails();
void RenderBackground(); int selectedDeckId;
bool showDetailsScreen;
bool enableDetails;
float selectionTargetY;
bool closed;
float selectionTargetY; DeckMenu(int id, JGuiListener* listener, int fontId, const string _title = "", const int& startIndex = 0, const float& mFontScale = 1.0f);
bool closed; ~DeckMenu();
static void destroy();
void Render();
void Update(float dt);
void Add(int id, const char * Text, string desc = "", bool forceFocus = false, DeckMetaData *deckMetaData = NULL);
void Close();
void updateScroller();
void RenderBackground();
static void destroy();
}; };
#endif #endif
+70 -58
View File
@@ -1,89 +1,101 @@
#ifndef _DECKSTATS_H_ #ifndef _DECKSTATS_H_
#define _DECKSTATS_H_ #define _DECKSTATS_H_
#include <map> #include <map>
#include <string> #include <string>
#include <vector> #include <vector>
#include "MTGDefinitions.h" #include "MTGDefinitions.h"
#include <DeckDataWrapper.h>
using namespace std; using namespace std;
class Player; class Player;
class GameObserver; class GameObserver;
class DeckStat{ class DeckStat
{
public: public:
int nbgames; int nbgames;
int victories; int victories;
DeckStat(int _nbgames = 0 , int _victories = 0):nbgames(_nbgames),victories(_victories){}; DeckStat(int _nbgames = 0, int _victories = 0);
int percentVictories(); int percentVictories();
}; };
class DeckStats{ class DeckStats
{
protected: protected:
static DeckStats * mInstance; static DeckStats * mInstance;
public: public:
map<string, DeckStat *>stats; map<string, DeckStat *> stats;
static DeckStats * GetInstance(); static DeckStats * GetInstance();
void saveStats(Player * player, Player * opponent, GameObserver * game); void saveStats(Player * player, Player * opponent, GameObserver * game);
void save(const char * filename); void save(const char * filename);
void save(Player * player); void save(Player * player);
void load(const char * filename); void load(const char * filename);
void load(Player * player); void load(Player * player);
void cleanStats(); void cleanStats();
~DeckStats(); ~DeckStats();
int percentVictories(string opponentsDeckFile); int percentVictories(string opponentsDeckFile);
int percentVictories(); int percentVictories();
DeckStat * getDeckStat(string opponentsFile); DeckStat * getDeckStat(string opponentsFile);
int nbGames(); int nbGames();
}; };
class StatsWrapper
class StatsWrapper { {
public: public:
StatsWrapper( int deckId ); StatsWrapper(int deckId);
~StatsWrapper(); StatsWrapper(string filename);
~StatsWrapper();
// Stats parameters and status void initStatistics(string deckstats);
int currentPage;
int pageCount;
bool needUpdate;
// Actual stats // Stats parameters and status
int percentVictories; int mDeckId;
int gamesPlayed; int currentPage;
int cardCount; int pageCount;
int countLands; bool needUpdate;
int totalPrice;
int totalManaCost;
float avgManaCost;
int totalCreatureCost;
float avgCreatureCost;
int totalSpellCost;
float avgSpellCost;
int countManaProducers;
int countCreatures, countSpells, countInstants, countEnchantments, countSorceries, countArtifacts; // Actual stats
int percentVictories;
int gamesPlayed;
int cardCount;
int countLands;
int totalPrice;
int totalManaCost;
float avgManaCost;
int totalCreatureCost;
float avgCreatureCost;
int totalSpellCost;
float avgSpellCost;
int countManaProducers;
float noLandsProbInTurn[Constants::STATS_FOR_TURNS]; int countCreatures, countSpells, countInstants, countEnchantments, countSorceries, countArtifacts;
float noCreaturesProbInTurn[Constants::STATS_FOR_TURNS];
int countCardsPerCost[Constants::STATS_MAX_MANA_COST+1]; float noLandsProbInTurn[Constants::STATS_FOR_TURNS];
int countCardsPerCostAndColor[Constants::STATS_MAX_MANA_COST+1][Constants::MTG_NB_COLORS+1]; float noCreaturesProbInTurn[Constants::STATS_FOR_TURNS];
int countCreaturesPerCost[Constants::STATS_MAX_MANA_COST+1];
int countCreaturesPerCostAndColor[Constants::STATS_MAX_MANA_COST+1][Constants::MTG_NB_COLORS+1];
int countSpellsPerCost[Constants::STATS_MAX_MANA_COST+1];
int countSpellsPerCostAndColor[Constants::STATS_MAX_MANA_COST+1][Constants::MTG_NB_COLORS+1];
int countLandsPerColor[Constants::MTG_NB_COLORS+1];
int countBasicLandsPerColor[Constants::MTG_NB_COLORS+1];
int countNonLandProducersPerColor[Constants::MTG_NB_COLORS+1];
int totalCostPerColor[Constants::MTG_NB_COLORS+1];
int totalColoredSymbols;
vector<string> aiDeckNames; int countCardsPerCost[Constants::STATS_MAX_MANA_COST + 1];
vector<DeckStat*> aiDeckStats; int countCardsPerCostAndColor[Constants::STATS_MAX_MANA_COST + 1][Constants::MTG_NB_COLORS + 1];
int countCreaturesPerCost[Constants::STATS_MAX_MANA_COST + 1];
int countCreaturesPerCostAndColor[Constants::STATS_MAX_MANA_COST + 1][Constants::MTG_NB_COLORS + 1];
int countSpellsPerCost[Constants::STATS_MAX_MANA_COST + 1];
int countSpellsPerCostAndColor[Constants::STATS_MAX_MANA_COST + 1][Constants::MTG_NB_COLORS + 1];
int countLandsPerColor[Constants::MTG_NB_COLORS + 1];
int countBasicLandsPerColor[Constants::MTG_NB_COLORS + 1];
int countNonLandProducersPerColor[Constants::MTG_NB_COLORS + 1];
int totalCostPerColor[Constants::MTG_NB_COLORS + 1];
int totalColoredSymbols;
void updateStats(string filename, MTGAllCards * collection);
void updateStats(DeckDataWrapper *mtgDeck);
int countCardsByType(const char * _type, DeckDataWrapper * myDeck);
float noLuck(int n, int a, int x);
vector<string> aiDeckNames;
vector<DeckStat*> aiDeckStats;
}; };
#endif #endif
+69 -70
View File
@@ -23,7 +23,7 @@
#define NO_USER_ACTIVITY_SHOWCARD_DELAY 0.1 #define NO_USER_ACTIVITY_SHOWCARD_DELAY 0.1
enum enum
{ {
STAGE_TRANSITION_RIGHT = 0, STAGE_TRANSITION_RIGHT = 0,
STAGE_TRANSITION_LEFT = 1, STAGE_TRANSITION_LEFT = 1,
STAGE_WAITING = 2, STAGE_WAITING = 2,
@@ -33,8 +33,7 @@ enum
STAGE_WELCOME = 6, STAGE_WELCOME = 6,
STAGE_MENU = 7, STAGE_MENU = 7,
STAGE_FILTERS = 8 STAGE_FILTERS = 8
}; };
// TODO: need a better name for MENU_FIRST_MENU, this is reused for the 1st submenu of // TODO: need a better name for MENU_FIRST_MENU, this is reused for the 1st submenu of
// available options in the duel menu // available options in the duel menu
@@ -47,10 +46,10 @@ enum
MENU_LANGUAGE_SELECTION = 103, MENU_LANGUAGE_SELECTION = 103,
}; };
// enums for menu options // enums for menu options
// TODO: make these enums a little more descriptive. (ie should reflect what menu they are attached to ) // TODO: make these enums a little more descriptive. (ie should reflect what menu they are attached to )
enum DECK_VIEWER_MENU_ITEMS enum DECK_VIEWER_MENU_ITEMS
{ {
MENU_ITEM_NEW_DECK = -30, MENU_ITEM_NEW_DECK = -30,
MENU_ITEM_CHEAT_MODE = -12, MENU_ITEM_CHEAT_MODE = -12,
MENU_ITEM_CANCEL = kCancelMenuID, MENU_ITEM_CANCEL = kCancelMenuID,
@@ -62,10 +61,10 @@ enum DECK_VIEWER_MENU_ITEMS
MENU_ITEM_SAVE_AS_AI_DECK = 5, MENU_ITEM_SAVE_AS_AI_DECK = 5,
MENU_ITEM_YES = 20, MENU_ITEM_YES = 20,
MENU_ITEM_NO = 21, MENU_ITEM_NO = 21,
MENU_ITEM_FILTER_BY = 22 MENU_ITEM_FILTER_BY = 22,
MENUITEM_MORE_INFO = kInfoMenuID
};
};
#define ALL_COLORS -1 #define ALL_COLORS -1
@@ -81,73 +80,73 @@ enum DECK_VIEWER_MENU_ITEMS
class GameStateDeckViewer: public GameState, public JGuiListener class GameStateDeckViewer: public GameState, public JGuiListener
{ {
private: private:
JQuad * mIcons[7]; JQuad * mIcons[7];
JQuad * pspIcons[8]; JQuad * pspIcons[8];
JTexture * pspIconsTexture; JTexture * pspIconsTexture;
float last_user_activity; float last_user_activity;
float onScreenTransition; float onScreenTransition;
float mRotation; float mRotation;
float mSlide; float mSlide;
int mAlpha; int mAlpha;
int mStage; int mStage;
int nbDecks; int nbDecks;
int deckNum; int deckNum;
int useFilter; int useFilter;
JMusic * bgMusic; JMusic * bgMusic;
JQuad * backQuad; JQuad * backQuad;
int lastPos; int lastPos;
int lastTotal; int lastTotal;
WGuiFilters * filterMenu; WGuiFilters * filterMenu;
WSrcDeckViewer * source; WSrcDeckViewer * source;
DeckEditorMenu * welcome_menu; DeckEditorMenu * welcome_menu;
SimpleMenu * subMenu; SimpleMenu * subMenu;
DeckEditorMenu * menu; DeckEditorMenu * menu;
PriceList* pricelist; PriceList* pricelist;
PlayerData * playerdata; PlayerData * playerdata;
int price; int price;
DeckDataWrapper * displayed_deck; DeckDataWrapper * displayed_deck;
DeckDataWrapper * myDeck; DeckDataWrapper * myDeck;
DeckDataWrapper * myCollection; DeckDataWrapper * myCollection;
MTGCard * cardIndex[7]; MTGCard * cardIndex[7];
StatsWrapper *stw; StatsWrapper *stw;
int hudAlpha; int hudAlpha;
string newDeckname; string newDeckname;
bool isAIDeckSave; bool isAIDeckSave;
bool mSwitching; bool mSwitching;
void saveDeck(); //Saves the deck and additional necessary information void saveDeck(); //Saves the deck and additional necessary information
void saveAsAIDeck(string deckName); // saves deck as an AI Deck void saveAsAIDeck(string deckName); // saves deck as an AI Deck
int getCurrentPos(); int getCurrentPos();
public: public:
GameStateDeckViewer(GameApp* parent); GameStateDeckViewer(GameApp* parent);
virtual ~GameStateDeckViewer(); virtual ~GameStateDeckViewer();
void updateDecks(); void updateDecks();
void rotateCards(int direction); void rotateCards(int direction);
void loadIndexes(); void loadIndexes();
void updateFilters(); void updateFilters();
void rebuildFilters(); void rebuildFilters();
void switchDisplay(); void switchDisplay();
void Start(); void Start();
virtual void End(); virtual void End();
void addRemove(MTGCard * card); void addRemove(MTGCard * card);
virtual void Update(float dt); virtual void Update(float dt);
void renderOnScreenBasicInfo(); void renderOnScreenBasicInfo();
void renderSlideBar(); void renderSlideBar();
void renderDeckBackground(); void renderDeckBackground();
void renderOnScreenMenu(); void renderOnScreenMenu();
virtual void renderCard(int id, float rotation); virtual void renderCard(int id, float rotation);
virtual void renderCard (int id); virtual void renderCard(int id);
virtual void Render(); virtual void Render();
int loadDeck(int deckid); int loadDeck(int deckid);
void LoadDeckStatistics(int deckId); void LoadDeckStatistics(int deckId);
void buildEditorMenu(); void buildEditorMenu();
virtual void ButtonPressed(int controllerId, int controlId); virtual void ButtonPressed(int controllerId, int controlId);
void updateStats(); void updateStats();
int countCardsByType(const char * _type); int countCardsByType(const char * _type);
}; };
// n cards total, a of them are desired, x drawn // n cards total, a of them are desired, x drawn
+45 -42
View File
@@ -1,9 +1,9 @@
#ifndef _GAME_STATE_DUEL_H_ #ifndef _GAME_STATE_DUEL_H_
#define _GAME_STATE_DUEL_H_ #define _GAME_STATE_DUEL_H_
#include "GameState.h" #include "GameState.h"
#include "SimpleMenu.h" #include "SimpleMenu.h"
#include "SimplePopup.h"
#include "DeckMenu.h" #include "DeckMenu.h"
#include "MTGDeck.h" #include "MTGDeck.h"
#include "GameObserver.h" #include "GameObserver.h"
@@ -16,58 +16,61 @@ class TestSuite;
class Credits; class Credits;
class Rules; class Rules;
class GameStateDuel: public GameState, public JGuiListener class GameStateDuel: public GameState, public JGuiListener
{ {
private: private:
#ifdef TESTSUITE #ifdef TESTSUITE
TestSuite * testSuite; TestSuite * testSuite;
#endif #endif
Credits * credits; Credits * credits;
int mGamePhase; int mGamePhase;
Player * mCurrentPlayer; Player * mCurrentPlayer;
Player * mPlayers[2]; Player * mPlayers[2];
MTGPlayerCards * deck[2]; MTGPlayerCards * deck[2];
GameObserver * game; GameObserver * game;
DeckMenu * deckmenu; DeckMenu * deckmenu;
DeckMenu * opponentMenu; DeckMenu * opponentMenu;
SimpleMenu * menu; SimpleMenu * menu;
bool premadeDeck; SimplePopup * popupScreen; // used for informational screens, modal
int OpponentsDeckid; static int selectedPlayerDeckId;
string musictrack; static int selectedAIDeckId;
Rules * rules;
bool MusicExist(string FileName); bool premadeDeck;
void loadPlayer(int playerId, int decknb = 0, int isAI = 0); int OpponentsDeckid;
void ensureOpponentMenu(); //loads the opponentMenu if it doesn't exist string musictrack;
void initScroller(); Rules * rules;
public: bool MusicExist(string FileName);
GameStateDuel(GameApp* parent); void loadPlayer(int playerId, int decknb = 0, int isAI = 0);
virtual ~GameStateDuel(); void ensureOpponentMenu(); //loads the opponentMenu if it doesn't exist
void initScroller();
public:
GameStateDuel(GameApp* parent);
virtual ~GameStateDuel();
#ifdef TESTSUITE #ifdef TESTSUITE
void loadTestSuitePlayers(); void loadTestSuitePlayers();
#endif #endif
virtual void ButtonPressed(int ControllerId, int ControlId); virtual void ButtonPressed(int ControllerId, int ControlId);
virtual void Start(); virtual void Start();
virtual void End(); virtual void End();
virtual void Update(float dt); virtual void Update(float dt);
virtual void Render(); virtual void Render();
void initRand (unsigned seed = 0); void initRand(unsigned seed = 0);
enum ENUM_DUEL_STATE_MENU_ITEM enum ENUM_DUEL_STATE_MENU_ITEM
{ {
MENUITEM_CANCEL = kCancelMenuID, MENUITEM_CANCEL = kCancelMenuID,
MENUITEM_NEW_DECK = -10, MENUITEM_NEW_DECK = -10,
MENUITEM_RANDOM_PLAYER = -11, MENUITEM_RANDOM_PLAYER = -11,
MENUITEM_RANDOM_AI = -12, MENUITEM_RANDOM_AI = -12,
MENUITEM_MAIN_MENU = -13, MENUITEM_MAIN_MENU = -13,
MENUITEM_EVIL_TWIN = -14, MENUITEM_EVIL_TWIN = -14,
MENUITEM_MULLIGAN = -15 MENUITEM_MULLIGAN = -15,
}; MENUITEM_MORE_INFO = kInfoMenuID
};
}; };
#endif #endif
+77 -53
View File
@@ -11,65 +11,89 @@ class MTGPlayerCards;
class MTGInPlay; class MTGInPlay;
class ManaPool; class ManaPool;
class Player: public Damageable{ class Player: public Damageable
protected: {
ManaPool * manaPool; protected:
ManaPool * manaPool;
public: public:
enum ENUM_PLAY_MODE enum ENUM_PLAY_MODE
{ {
MODE_TEST_SUITE, MODE_TEST_SUITE, MODE_HUMAN, MODE_AI,
MODE_HUMAN, };
MODE_AI,
}; JTexture * mAvatarTex;
JQuad * mAvatar;
int playMode;
int canPutLandsIntoPlay;
int nomaxhandsize;
int castedspellsthisturn;
int onlyonecast;
int castcount;
int nocreatureinstant;
int nospellinstant;
int onlyoneinstant;
int castrestrictedcreature;
int castrestrictedspell;
MTGPlayerCards * game;
string deckFile;
string deckFileSmall;
string deckName;
Player(MTGDeck * deck, string deckFile, string deckFileSmall);
virtual ~Player();
virtual void End();
virtual int displayStack()
{
return 1;
}
const string getDisplayName() const;
int typeAsTarget()
{
return TARGET_PLAYER;
}
int afterDamage();
int poisoned();
int damaged();
int prevented();
void unTapPhase();
MTGInPlay * inPlay();
ManaPool * getManaPool();
void cleanupPhase();
virtual int Act(float dt)
{
return 0;
}
virtual void End(); virtual int isAI()
int typeAsTarget(){return TARGET_PLAYER;} {
const string getDisplayName() const; return 0;
virtual int displayStack(){return 1;} }
JTexture * mAvatarTex;
JQuad * mAvatar;
int playMode;
int canPutLandsIntoPlay;
int nomaxhandsize;
int castedspellsthisturn;
int onlyonecast;
int castcount;
int nocreatureinstant;
int nospellinstant;
int onlyoneinstant;
int castrestrictedcreature;
int castrestrictedspell;
MTGPlayerCards * game;
int afterDamage();
int poisoned();
int damaged();
int prevented();
Player(MTGDeck * deck, string deckFile, string deckFileSmall);
virtual ~Player();
void unTapPhase();
MTGInPlay * inPlay();
ManaPool * getManaPool();
void cleanupPhase();
virtual int Act(float dt){return 0;};
virtual int isAI(){return 0;};
Player * opponent();
int getId();
JQuad * getIcon();
string deckFile;
string deckFileSmall;
string deckName;
virtual int receiveEvent(WEvent * event){return 0;}; Player * opponent();
virtual void Render(){}; int getId();
void loadAvatar(string file); JQuad * getIcon();
virtual int receiveEvent(WEvent * event)
{
return 0;
}
virtual void Render()
{
}
void loadAvatar(string file);
}; };
class HumanPlayer: public Player{ class HumanPlayer: public Player
public: {
HumanPlayer(MTGDeck * deck, string deckFile, string deckFileSmall); public:
HumanPlayer(string deckFile); HumanPlayer(MTGDeck * deck, string deckFile, string deckFileSmall);
HumanPlayer(string deckFile);
}; };
+48
View File
@@ -0,0 +1,48 @@
/*
* SimplePopup.h
* Created on: Nov 18, 2010
*
* Simple popup dialog box for displaying information only.
*/
#ifndef SIMPLEPOPUP_H_
#define SIMPLEPOPUP_H_
#pragma once
#include <JGui.h>
#include <JTypes.h>
#include <WFont.h>
#include <DeckMetaData.h>
class SimplePopup: public JGuiController
{
private:
float mHeight, mWidth, mX, mY;
int mMaxLines;
int mFontId;
DeckMetaData * mDeckInformation;
string mTitle;
WFont *mTextFont;
StatsWrapper *stw;
void drawHorzPole(float x, float y, float width);
void drawVertPole(float x, float y, float height);
public:
MTGAllCards * mCollection;
bool autoTranslate;
bool closed;
SimplePopup(int id, JGuiListener* listener, const int fontId, const char * _title = "", DeckMetaData* deckInfo = NULL, MTGAllCards * collection = NULL);
~SimplePopup(void);
void Render();
void Update(DeckMetaData* deckMetaData);
string getDetailedInformation(string deckFilename);
void Update(float dt);
void Close();
};
#endif /* SIMPLEPOPUP_H_ */
+7 -8
View File
@@ -6,13 +6,13 @@
#include "GameApp.h" #include "GameApp.h"
#include <iomanip> #include <iomanip>
DeckEditorMenu::DeckEditorMenu(int id, JGuiListener* listener, int fontId, const char * _title, DeckDataWrapper *_selectedDeck, DeckEditorMenu::DeckEditorMenu(int id, JGuiListener* listener, int fontId, const char * _title, DeckDataWrapper *_selectedDeck, StatsWrapper *stats) :
StatsWrapper *stats) :
DeckMenu(id, listener, fontId, _title), selectedDeck(_selectedDeck), stw(stats) DeckMenu(id, listener, fontId, _title), selectedDeck(_selectedDeck), stw(stats)
{ {
backgroundName = "DeckEditorMenuBackdrop"; backgroundName = "DeckEditorMenuBackdrop";
deckTitle = selectedDeck ? selectedDeck->parent->meta_name : ""; deckTitle = selectedDeck ? selectedDeck->parent->meta_name : "";
enableDetails = false;
mX = 123; mX = 123;
mY = 70; mY = 70;
@@ -37,6 +37,7 @@ DeckEditorMenu::DeckEditorMenu(int id, JGuiListener* listener, int fontId, const
float scrollerWidth = 80; float scrollerWidth = 80;
SAFE_DELETE(scroller); // need to delete the scroller init in the base class SAFE_DELETE(scroller); // need to delete the scroller init in the base class
this->showDetailsScreen = false;
scroller = NEW TextScroller(Fonts::MAIN_FONT, 40, 230, scrollerWidth, 100, 1, 1); scroller = NEW TextScroller(Fonts::MAIN_FONT, 40, 230, scrollerWidth, 100, 1, 1);
} }
@@ -56,8 +57,7 @@ void DeckEditorMenu::Render()
mainFont->SetColor(currentColor); mainFont->SetColor(currentColor);
} }
if (stw && selectedDeck) if (stw && selectedDeck) drawDeckStatistics();
drawDeckStatistics();
} }
@@ -67,7 +67,7 @@ void DeckEditorMenu::drawDeckStatistics()
deckStatsString deckStatsString
<< "------- Deck Summary -----" << endl << "------- Deck Summary -----" << endl
<< "Cards: "<< selectedDeck->getCount() << endl << "Cards: "<< stw->cardCount << endl
<< "Creatures: "<< setw(2) << stw->countCreatures << "Creatures: "<< setw(2) << stw->countCreatures
<< " Enchantments: " << stw->countEnchantments << endl << " Enchantments: " << stw->countEnchantments << endl
<< "Instants: " << setw(4) << stw->countInstants << "Instants: " << setw(4) << stw->countInstants
@@ -79,7 +79,6 @@ void DeckEditorMenu::drawDeckStatistics()
<< "U: " << setw(2) << left << stw->countLandsPerColor[ Constants::MTG_COLOR_BLUE ] + stw->countBasicLandsPerColor[ Constants::MTG_COLOR_BLUE ] << " " << "U: " << setw(2) << left << stw->countLandsPerColor[ Constants::MTG_COLOR_BLUE ] + stw->countBasicLandsPerColor[ Constants::MTG_COLOR_BLUE ] << " "
<< "B: " << setw(2) << left << stw->countLandsPerColor[ Constants::MTG_COLOR_BLACK ] + stw->countBasicLandsPerColor[ Constants::MTG_COLOR_BLACK ] << " " << "B: " << setw(2) << left << stw->countLandsPerColor[ Constants::MTG_COLOR_BLACK ] + stw->countBasicLandsPerColor[ Constants::MTG_COLOR_BLACK ] << " "
<< "W: " << setw(2) << left << stw->countLandsPerColor[ Constants::MTG_COLOR_WHITE ] + stw->countBasicLandsPerColor[ Constants::MTG_COLOR_WHITE ] << endl << "W: " << setw(2) << left << stw->countLandsPerColor[ Constants::MTG_COLOR_WHITE ] + stw->countBasicLandsPerColor[ Constants::MTG_COLOR_WHITE ] << endl
<< " --- Card color count --- " << endl << " --- Card color count --- " << endl
<< "A: " << setw(2) << left << selectedDeck->getCount(Constants::MTG_COLOR_ARTIFACT) << " " << "A: " << setw(2) << left << selectedDeck->getCount(Constants::MTG_COLOR_ARTIFACT) << " "
<< "G: " << setw(2) << left << selectedDeck->getCount(Constants::MTG_COLOR_GREEN) << " " << "G: " << setw(2) << left << selectedDeck->getCount(Constants::MTG_COLOR_GREEN) << " "
@@ -93,8 +92,8 @@ void DeckEditorMenu::drawDeckStatistics()
<< "Mana: " << setprecision(2) << stw->avgManaCost << " " << "Mana: " << setprecision(2) << stw->avgManaCost << " "
<< "Spell: " << setprecision(2) << stw->avgSpellCost << endl; << "Spell: " << setprecision(2) << stw->avgSpellCost << endl;
WFont *mainFont = resources.GetWFont( Fonts::MAIN_FONT ); WFont *mainFont = resources.GetWFont(Fonts::MAIN_FONT);
mainFont->DrawString( deckStatsString.str().c_str(), descX, descY + 25 ); mainFont->DrawString(deckStatsString.str().c_str(), descX, descY + 25);
} }
DeckEditorMenu::~DeckEditorMenu() DeckEditorMenu::~DeckEditorMenu()
+71 -24
View File
@@ -17,6 +17,7 @@ namespace
const float kLineHeight = 20; const float kLineHeight = 20;
const float kDescriptionVerticalBoxPadding = 5; const float kDescriptionVerticalBoxPadding = 5;
const float kDescriptionHorizontalBoxPadding = 5; const float kDescriptionHorizontalBoxPadding = 5;
const int DETAILED_INFO_THRESHOLD = 4;
} }
hgeParticleSystem* DeckMenu::stars = NULL; hgeParticleSystem* DeckMenu::stars = NULL;
@@ -30,12 +31,14 @@ hgeParticleSystem* DeckMenu::stars = NULL;
// * descriptive information 125 // * descriptive information 125
// *** Need to make this configurable in a file somewhere to allow for class reuse // *** Need to make this configurable in a file somewhere to allow for class reuse
DeckMenu::DeckMenu(int id, JGuiListener* listener, int fontId, const string _title, const float& mFontScale) : DeckMenu::DeckMenu(int id, JGuiListener* listener, int fontId, const string _title, const int& startIndex, const float& mFontScale) :
JGuiController(id, listener), fontId(fontId), menuFontScale(mFontScale) JGuiController(id, listener), fontId(fontId), menuFontScale(mFontScale)
{ {
backgroundName = "DeckMenuBackdrop"; backgroundName = "DeckMenuBackdrop";
selectedDeck = NULL;
enableDetails = true;
mY = 55; mY = 55;
mWidth = 176; mWidth = 176;
mX = 125; mX = 125;
@@ -49,6 +52,8 @@ DeckMenu::DeckMenu(int id, JGuiListener* listener, int fontId, const string _tit
descHeight = 145; descHeight = 145;
descWidth = 220; descWidth = 220;
detailedInfoBoxX = 400;
detailedInfoBoxY = 235;
starsOffsetX = 50; starsOffsetX = 50;
statsX = 280; statsX = 280;
@@ -56,6 +61,8 @@ DeckMenu::DeckMenu(int id, JGuiListener* listener, int fontId, const string _tit
statsHeight = 50; statsHeight = 50;
statsWidth = 227; statsWidth = 227;
selectedDeckId = startIndex;
avatarX = 230; avatarX = 230;
avatarY = 8; avatarY = 8;
@@ -85,8 +92,7 @@ DeckMenu::DeckMenu(int id, JGuiListener* listener, int fontId, const string _tit
selectionTargetY = selectionY = kVerticalMargin; selectionTargetY = selectionY = kVerticalMargin;
if (NULL == stars) if (NULL == stars) stars = NEW hgeParticleSystem(resources.RetrievePSI("stars.psi", resources.GetQuad("stars")));
stars = NEW hgeParticleSystem(resources.RetrievePSI("stars.psi", resources.GetQuad("stars")));
stars->FireAt(mX, mY); stars->FireAt(mX, mY);
updateScroller(); updateScroller();
@@ -108,6 +114,21 @@ void DeckMenu::RenderBackground()
} }
} }
DeckMetaData * DeckMenu::getSelectedDeck()
{
if (selectedDeck) return selectedDeck;
return NULL;
}
bool DeckMenu::selectedDeckHasDetails()
{
DeckMetaData * currentMenuItem = getSelectedDeck();
if (currentMenuItem) return (enableDetails && currentMenuItem->getGamesPlayed() > DETAILED_INFO_THRESHOLD);
return false;
}
void DeckMenu::initMenuItems() void DeckMenu::initMenuItems()
{ {
float sY = mY + kVerticalMargin; float sY = mY + kVerticalMargin;
@@ -116,10 +137,21 @@ void DeckMenu::initMenuItems()
float y = mY + kVerticalMargin + i * kLineHeight; float y = mY + kVerticalMargin + i * kLineHeight;
DeckMenuItem * currentMenuItem = static_cast<DeckMenuItem*> (mObjects[i]); DeckMenuItem * currentMenuItem = static_cast<DeckMenuItem*> (mObjects[i]);
currentMenuItem->Relocate(mX, y); currentMenuItem->Relocate(mX, y);
if (currentMenuItem->hasFocus()) if (currentMenuItem->hasFocus()) sY = y;
sY = y;
} }
selectionTargetY = selectionY = sY; selectionTargetY = selectionY = sY;
//Grab a texture in VRAM.
pspIconsTexture = resources.RetrieveTexture("iconspsp.png", RETRIEVE_LOCK);
char buf[512];
for (int i = 0; i < 8; i++)
{
sprintf(buf, "iconspsp%d", i);
pspIcons[i] = resources.RetrieveQuad("iconspsp.png", (float) i * 32, 0, 32, 32, buf);
pspIcons[i]->SetHotSpot(16, 16);
}
} }
void DeckMenu::Render() void DeckMenu::Render()
@@ -134,32 +166,47 @@ void DeckMenu::Render()
timeOpen = 0; timeOpen = 0;
menuInitialized = true; menuInitialized = true;
} }
if (timeOpen < 1) if (timeOpen < 1) height *= timeOpen > 0 ? timeOpen : -timeOpen;
height *= timeOpen > 0 ? timeOpen : -timeOpen;
renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE);
stars->Render();
renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA);
for (int i = startId; i < startId + maxItems; i++) for (int i = startId; i < startId + maxItems; i++)
{ {
if (i > mCount - 1) if (i > mCount - 1) break;
break;
DeckMenuItem *currentMenuItem = static_cast<DeckMenuItem*> (mObjects[i]); DeckMenuItem *currentMenuItem = static_cast<DeckMenuItem*> (mObjects[i]);
if (currentMenuItem->mY - kLineHeight * startId < mY + height - kLineHeight + 7) if (currentMenuItem->mY - kLineHeight * startId < mY + height - kLineHeight + 7)
{ {
if (currentMenuItem->hasFocus()) if (currentMenuItem->hasFocus())
{ {
selectedDeckId = i;
selectedDeck = currentMenuItem->meta;
WFont *mainFont = resources.GetWFont(Fonts::MAIN_FONT);
// display the "more info" button if special condition is met
if (selectedDeckHasDetails())
{
showDetailsScreen = true;
float pspIconsSize = 0.5;
const string detailedInfoString = "Detailed Info";
float stringWidth = mainFont->GetStringWidth(detailedInfoString.c_str());
float boxStartX = detailedInfoBoxX - stringWidth / 2;
DWORD currentColor = mainFont->GetColor();
renderer->FillRoundRect( boxStartX, detailedInfoBoxY - 5, stringWidth,
mainFont->GetHeight() + 15, .5, ARGB( 125, 0, 255, 255) );
renderer->RenderQuad(pspIcons[5], detailedInfoBoxX, detailedInfoBoxY + 2, 0, pspIconsSize, pspIconsSize);
mainFont->SetColor(currentColor);
mainFont->DrawString(detailedInfoString, boxStartX, detailedInfoBoxY + 10);
}
else
showDetailsScreen = false;
// display the avatar image // display the avatar image
if (currentMenuItem->imageFilename.size() > 0) if (currentMenuItem->imageFilename.size() > 0)
{ {
JQuad * quad = resources.RetrieveTempQuad(currentMenuItem->imageFilename, TEXTURE_SUB_AVATAR); JQuad * quad = resources.RetrieveTempQuad(currentMenuItem->imageFilename, TEXTURE_SUB_AVATAR);
if (quad) if (quad) renderer->RenderQuad(quad, avatarX, avatarY);
renderer->RenderQuad(quad, avatarX, avatarY);
} }
// fill in the description part of the screen // fill in the description part of the screen
string text = currentMenuItem->desc; string text = currentMenuItem->desc;
WFont *mainFont = resources.GetWFont(Fonts::MAIN_FONT);
mainFont->DrawString(text.c_str(), descX, descY); mainFont->DrawString(text.c_str(), descX, descY);
mFont->SetColor(ARGB(255,255,255,255)); mFont->SetColor(ARGB(255,255,255,255));
@@ -200,8 +247,7 @@ void DeckMenu::Update(float dt)
JGuiController::Update(dt); JGuiController::Update(dt);
if (mCurr > startId + maxItems - 1) if (mCurr > startId + maxItems - 1)
startId = mCurr - maxItems + 1; startId = mCurr - maxItems + 1;
else if (mCurr < startId) else if (mCurr < startId) startId = mCurr;
startId = mCurr;
stars->Update(dt); stars->Update(dt);
selectionT += 3 * dt; selectionT += 3 * dt;
selectionY += (selectionTargetY - selectionY) * 8 * dt; selectionY += (selectionTargetY - selectionY) * 8 * dt;
@@ -224,14 +270,13 @@ void DeckMenu::Update(float dt)
closed = false; closed = false;
timeOpen += dt * 10; timeOpen += dt * 10;
} }
if (scroller) scroller->Update(dt);
scroller->Update(dt);
} }
void DeckMenu::Add(int id, const char * text, string desc, bool forceFocus, DeckMetaData * deckMetaData) void DeckMenu::Add(int id, const char * text, string desc, bool forceFocus, DeckMetaData * deckMetaData)
{ {
DeckMenuItem * menuItem = NEW DeckMenuItem(this, id, fontId, text, 0, mY + kVerticalMargin + mCount * kLineHeight, DeckMenuItem * menuItem = NEW DeckMenuItem(this, id, fontId, text, 0, mY + kVerticalMargin + mCount * kLineHeight,
(mCount == 0), autoTranslate, deckMetaData); (mCount == 0), autoTranslate, deckMetaData);
Translator * t = Translator::GetInstance(); Translator * t = Translator::GetInstance();
map<string, string>::iterator it = t->deckValues.find(text); map<string, string>::iterator it = t->deckValues.find(text);
if (it != t->deckValues.end()) //translate decks desc if (it != t->deckValues.end()) //translate decks desc
@@ -240,8 +285,8 @@ void DeckMenu::Add(int id, const char * text, string desc, bool forceFocus, Deck
menuItem->desc = deckMetaData ? deckMetaData->getDescription() : desc; menuItem->desc = deckMetaData ? deckMetaData->getDescription() : desc;
JGuiController::Add(menuItem); JGuiController::Add(menuItem);
if (mCount <= maxItems) if (mCount <= maxItems) mHeight += kLineHeight;
mHeight += kLineHeight;
if (forceFocus) if (forceFocus)
{ {
mObjects[mCurr]->Leaving(JGE_BTN_DOWN); mObjects[mCurr]->Leaving(JGE_BTN_DOWN);
@@ -259,7 +304,7 @@ void DeckMenu::updateScroller()
{ {
ostringstream taskDescription; ostringstream taskDescription;
taskDescription << "[ " << setw(4) << (*it)->getReward() << " / " << (*it)->getExpiration() << " ] " taskDescription << "[ " << setw(4) << (*it)->getReward() << " / " << (*it)->getExpiration() << " ] "
<< (*it)->getDesc() << endl; << (*it)->getDesc() << endl;
scroller->Add(taskDescription.str()); scroller->Add(taskDescription.str());
} }
} }
@@ -277,5 +322,7 @@ void DeckMenu::destroy()
DeckMenu::~DeckMenu() DeckMenu::~DeckMenu()
{ {
resources.Release(pspIconsTexture);
SAFE_DELETE(scroller); SAFE_DELETE(scroller);
scroller = NULL;
} }
+256 -32
View File
@@ -3,13 +3,18 @@
#include "DeckStats.h" #include "DeckStats.h"
#include "Player.h" #include "Player.h"
#include "GameObserver.h" #include "GameObserver.h"
#include "MTGDeck.h"
#include "ManaCostHybrid.h"
DeckStats * DeckStats::mInstance = NULL; DeckStats * DeckStats::mInstance = NULL;
DeckStat::DeckStat(int _nbgames, int _victories) : nbgames(_nbgames), victories(_victories)
{
}
int DeckStat::percentVictories() int DeckStat::percentVictories()
{ {
if (nbgames == 0) if (nbgames == 0) return 50;
return 50;
return (100 * victories / nbgames); return (100 * victories / nbgames);
} }
@@ -159,10 +164,8 @@ void DeckStats::saveStats(Player *player, Player *opponent, GameObserver * game)
int victory = 1; int victory = 1;
if (!game->gameOver) if (!game->gameOver)
{ {
if (player->life == opponent->life) if (player->life == opponent->life) return;
return; if (player->life < opponent->life) victory = 0;
if (player->life < opponent->life)
victory = 0;
} }
else if (game->gameOver == player) else if (game->gameOver == player)
{ {
@@ -181,18 +184,27 @@ void DeckStats::saveStats(Player *player, Player *opponent, GameObserver * game)
} }
save(player); save(player);
} }
StatsWrapper::StatsWrapper(int deckId) StatsWrapper::StatsWrapper(int deckId)
{ {
// Load deck statistics mDeckId = deckId;
char buffer[512]; char buffer[512];
sprintf(buffer, "stats/player_deck%i.txt", deckId);
string deckstats = options.profileFile(buffer);
initStatistics(deckstats);
}
StatsWrapper::StatsWrapper(string deckstats)
{
initStatistics(deckstats);
}
void StatsWrapper::initStatistics(string deckstats)
{
// Load deck statistics
DeckStats * stats = DeckStats::GetInstance(); DeckStats * stats = DeckStats::GetInstance();
aiDeckNames.clear(); aiDeckNames.clear();
aiDeckStats.clear(); aiDeckStats.clear();
sprintf(buffer, "stats/player_deck%i.txt", deckId);
string deckstats = options.profileFile(buffer);
if (fileExists(deckstats.c_str())) if (fileExists(deckstats.c_str()))
{ {
stats->load(deckstats.c_str()); stats->load(deckstats.c_str());
@@ -202,30 +214,27 @@ StatsWrapper::StatsWrapper(int deckId)
// Detailed deck statistics against AI // Detailed deck statistics against AI
int found = 1; int found = 1;
int nbDecks = 0; int nbDecks = 0;
while (found) found = 0;
char buffer[512];
char smallDeckName[512];
sprintf(buffer, "%s/deck%i.txt", RESPATH"/ai/baka", nbDecks + 1);
if (fileExists(buffer))
{ {
found = 0; MTGDeck * mtgd = NEW MTGDeck(buffer, NULL, 1);
char buffer[512]; found = 1;
char smallDeckName[512]; nbDecks++;
sprintf(buffer, "%s/deck%i.txt", RESPATH"/ai/baka", nbDecks + 1);
if (fileExists(buffer)) sprintf(smallDeckName, "%s_deck%i", "ai_baka", nbDecks);
DeckStat* deckStat = stats->getDeckStat(string(smallDeckName));
if ((deckStat != NULL) && (deckStat->nbgames > 0))
{ {
MTGDeck * mtgd = NEW MTGDeck(buffer, NULL, 1); int percentVictories = stats->percentVictories(string(smallDeckName));
found = 1; aiDeckNames.push_back(string(mtgd->meta_name));
nbDecks++; aiDeckStats.push_back(deckStat);
sprintf(smallDeckName, "%s_deck%i", "ai_baka", nbDecks);
DeckStat* deckStat = stats->getDeckStat(string(smallDeckName));
if ((deckStat != NULL) && (deckStat->nbgames > 0))
{
int percentVictories = stats->percentVictories(string(smallDeckName));
aiDeckNames.push_back(string(mtgd->meta_name));
aiDeckStats.push_back(deckStat);
}
delete mtgd;
} }
delete mtgd;
} }
} }
else else
@@ -235,8 +244,223 @@ StatsWrapper::StatsWrapper(int deckId)
} }
} }
void StatsWrapper::updateStats(string filename, MTGAllCards *collection)
{
if (fileExists(filename.c_str()))
{
MTGDeck * mtgd = NEW MTGDeck(filename.c_str(), collection);
DeckDataWrapper *deckDataWrapper = NEW DeckDataWrapper(mtgd);
updateStats(deckDataWrapper);
SAFE_DELETE( mtgd );
SAFE_DELETE( deckDataWrapper );
}
}
void StatsWrapper::updateStats(DeckDataWrapper *myDeck)
{
if (!this->needUpdate || !myDeck) return;
this->needUpdate = false;
this->cardCount = myDeck->getCount(WSrcDeck::UNFILTERED_COPIES);
this->countLands = myDeck->getCount(Constants::MTG_COLOR_LAND);
this->totalPrice = myDeck->totalPrice();
this->countManaProducers = 0;
// Mana cost
int currentCount, convertedCost;
ManaCost * currentCost;
this->totalManaCost = 0;
this->totalCreatureCost = 0;
this->totalSpellCost = 0;
MTGCard * current = myDeck->getCard();
// Clearing arrays
for (int i = 0; i <= Constants::STATS_MAX_MANA_COST; i++)
{
this->countCardsPerCost[i] = 0;
this->countCreaturesPerCost[i] = 0;
this->countSpellsPerCost[i] = 0;
}
for (int i = 0; i <= Constants::MTG_NB_COLORS; i++)
{
this->totalCostPerColor[i] = 0;
this->countLandsPerColor[i] = 0;
this->countBasicLandsPerColor[i] = 0;
this->countNonLandProducersPerColor[i] = 0;
}
for (int i = 0; i <= Constants::STATS_MAX_MANA_COST; i++)
{
for (int k = 0; k <= Constants::MTG_NB_COLORS; k++)
{
this->countCardsPerCostAndColor[i][k] = 0;
this->countCreaturesPerCostAndColor[i][k] = 0;
this->countSpellsPerCostAndColor[i][k] = 0;
}
}
for (int ic = 0; ic < myDeck->Size(true); ic++)
{
current = myDeck->getCard(ic, true);
currentCost = current->data->getManaCost();
convertedCost = currentCost->getConvertedCost();
currentCount = myDeck->count(current);
// Add to the cards per cost counters
this->totalManaCost += convertedCost * currentCount;
if (convertedCost > Constants::STATS_MAX_MANA_COST)
{
convertedCost = Constants::STATS_MAX_MANA_COST;
}
this->countCardsPerCost[convertedCost] += currentCount;
if (current->data->isCreature())
{
this->countCreaturesPerCost[convertedCost] += currentCount;
this->totalCreatureCost += convertedCost * currentCount;
}
else if (current->data->isSpell())
{
this->countSpellsPerCost[convertedCost] += currentCount;
this->totalSpellCost += convertedCost * currentCount;
}
// Lets look for mana producing abilities
vector<string> abilitiesVector;
string thisstring = current->data->magicText;
abilitiesVector = split(thisstring, '\n');
for (int v = 0; v < (int) abilitiesVector.size(); v++)
{
string s = abilitiesVector[v];
size_t t = s.find("add");
if (t != string::npos)
{
s = s.substr(t + 3);
ManaCost * mc = ManaCost::parseManaCost(s);
for (int j = 0; j < Constants::MTG_NB_COLORS; j++)
{
if (mc->hasColor(j))
{
if (current->data->isLand())
{
if (current->data->hasType("Basic"))
{
this->countBasicLandsPerColor[j] += currentCount;
}
else
{
this->countLandsPerColor[j] += currentCount;
}
}
else
{
this->countNonLandProducersPerColor[j] += currentCount;
}
}
}
SAFE_DELETE(mc);
}
}
// Add to the per color counters
// a. regular costs
for (int j = 0; j < Constants::MTG_NB_COLORS; j++)
{
this->totalCostPerColor[j] += currentCost->getCost(j) * currentCount;
if (current->data->hasColor(j))
{
// Add to the per cost and color counter
this->countCardsPerCostAndColor[convertedCost][j] += currentCount;
if (current->data->isCreature())
{
this->countCreaturesPerCostAndColor[convertedCost][j] += currentCount;
}
else if (current->data->isSpell())
{
this->countSpellsPerCostAndColor[convertedCost][j] += currentCount;
}
}
}
// b. Hybrid costs
ManaCostHybrid * hybridCost;
int i;
i = 0;
while ((hybridCost = currentCost->getHybridCost(i++)) != NULL)
{
this->totalCostPerColor[hybridCost->color1] += hybridCost->value1 * currentCount;
this->totalCostPerColor[hybridCost->color2] += hybridCost->value2 * currentCount;
}
}
this->totalColoredSymbols = 0;
for (int j = 1; j < Constants::MTG_NB_COLORS; j++)
{
this->totalColoredSymbols += this->totalCostPerColor[j];
}
this->countCardsPerCost[0] -= this->countLands;
// Counts by type
this->countCreatures = countCardsByType("Creature", myDeck);
this->countInstants = countCardsByType("Instant", myDeck);
this->countEnchantments = countCardsByType("Enchantment", myDeck);
this->countSorceries = countCardsByType("Sorcery", myDeck);
this->countSpells = this->countInstants + this->countEnchantments + this->countSorceries;
//this->countArtifacts = countCardsByType("Artifact", myDeck);
// Average mana costs
this->avgManaCost = ((this->cardCount - this->countLands) <= 0) ? 0 : (float) this->totalManaCost / (this->cardCount
- this->countLands);
this->avgCreatureCost = (this->countCreatures <= 0) ? 0 : (float) this->totalCreatureCost / this->countCreatures;
this->avgSpellCost = (this->countSpells <= 0) ? 0 : (float) this->totalSpellCost / this->countSpells;
// Probabilities
// TODO: this could be optimized by reusing results
for (int i = 0; i < Constants::STATS_FOR_TURNS; i++)
{
this->noLandsProbInTurn[i] = noLuck(this->cardCount, this->countLands, 7 + i) * 100;
this->noCreaturesProbInTurn[i] = noLuck(this->cardCount, this->countCreatures, 7 + i) * 100;
}
}
// This should probably be cached in DeckDataWrapper
// or at least be calculated for all common types in one go
int StatsWrapper::countCardsByType(const char * _type, DeckDataWrapper * myDeck)
{
int result = 0;
for (int i = 0; i < myDeck->Size(true); i++)
{
MTGCard * current = myDeck->getCard(i, true);
if (current->data->hasType(_type))
{
result += myDeck->count(current);
}
}
return result;
}
// n cards total, a of them are of desired type (A), x drawn
// returns probability of no A's
float StatsWrapper::noLuck(int n, int a, int x)
{
if ((a >= n) || (a == 0)) return 1;
if ((n == 0) || (x == 0) || (x > n) || (n - a < x)) return 0;
a = n - a;
float result = 1;
for (int i = 0; i < x; i++)
result *= (float) (a - i) / (n - i);
return result;
}
StatsWrapper::~StatsWrapper() StatsWrapper::~StatsWrapper()
{ {
aiDeckNames.clear(); aiDeckNames.clear();
aiDeckStats.clear(); aiDeckStats.clear();
} }
+68 -94
View File
@@ -18,6 +18,7 @@
#include "WDataSrc.h" #include "WDataSrc.h"
#include "DeckEditorMenu.h" #include "DeckEditorMenu.h"
#include "SimpleMenu.h" #include "SimpleMenu.h"
#include "utils.h"
//!! helper function; this is probably handled somewhere in the code already. //!! helper function; this is probably handled somewhere in the code already.
// If not, should be placed in general library // If not, should be placed in general library
@@ -27,13 +28,11 @@ void StringExplode(string str, string separator, vector<string>* results)
found = str.find_first_of(separator); found = str.find_first_of(separator);
while (found != string::npos) while (found != string::npos)
{ {
if (found > 0) if (found > 0) results->push_back(str.substr(0, found));
results->push_back(str.substr(0, found));
str = str.substr(found + 1); str = str.substr(found + 1);
found = str.find_first_of(separator); found = str.find_first_of(separator);
} }
if (str.length() > 0) if (str.length() > 0) results->push_back(str);
results->push_back(str);
} }
GameStateDeckViewer::GameStateDeckViewer(GameApp* parent) : GameStateDeckViewer::GameStateDeckViewer(GameApp* parent) :
@@ -95,21 +94,18 @@ void GameStateDeckViewer::rotateCards(int direction)
} }
void GameStateDeckViewer::rebuildFilters() void GameStateDeckViewer::rebuildFilters()
{ {
if (!filterMenu) if (!filterMenu) filterMenu = NEW WGuiFilters("Filter by...", NULL);
filterMenu = NEW WGuiFilters("Filter by...", NULL);
if (source) if (source)
SAFE_DELETE(source); SAFE_DELETE(source);
source = NEW WSrcDeckViewer(myDeck, myCollection); source = NEW WSrcDeckViewer(myDeck, myCollection);
filterMenu->setSrc(source); filterMenu->setSrc(source);
if (displayed_deck != myDeck) if (displayed_deck != myDeck) source->swapSrc();
source->swapSrc();
filterMenu->Finish(true); filterMenu->Finish(true);
updateStats(); updateStats();
} }
void GameStateDeckViewer::updateFilters() void GameStateDeckViewer::updateFilters()
{ {
if (!displayed_deck) if (!displayed_deck) return;
return;
filterMenu->recolorFilter(useFilter - 1); filterMenu->recolorFilter(useFilter - 1);
filterMenu->Finish(true); filterMenu->Finish(true);
@@ -171,8 +167,8 @@ void GameStateDeckViewer::updateDecks()
newDeckname = ""; newDeckname = "";
nbDecks = playerDeckList.size() + 1; nbDecks = playerDeckList.size() + 1;
welcome_menu->Add(MENU_ITEM_NEW_DECK, "--NEW--"); welcome_menu->Add(MENU_ITEM_NEW_DECK, "--NEW--");
if (options[Options::CHEATMODE].number && (!myCollection || myCollection->getCount(WSrcDeck::UNFILTERED_MIN_COPIES) < 4)) if (options[Options::CHEATMODE].number && (!myCollection || myCollection->getCount(WSrcDeck::UNFILTERED_MIN_COPIES) < 4)) welcome_menu->Add(
welcome_menu->Add(MENU_ITEM_CHEAT_MODE, "--UNLOCK CARDS--"); MENU_ITEM_CHEAT_MODE, "--UNLOCK CARDS--");
welcome_menu->Add(MENU_ITEM_CANCEL, "Cancel"); welcome_menu->Add(MENU_ITEM_CANCEL, "Cancel");
// update the deckmanager with the latest information // update the deckmanager with the latest information
@@ -187,7 +183,7 @@ void GameStateDeckViewer::buildEditorMenu()
deckSummaryInformation << "All changes are final." << endl; deckSummaryInformation << "All changes are final." << endl;
if (menu) if (menu)
SAFE_DELETE( menu ); SAFE_DELETE( menu );
//Build menu. //Build menu.
JRenderer::GetInstance()->FillRoundRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 100, ARGB(0, 0, 0, 0) ); JRenderer::GetInstance()->FillRoundRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 100, ARGB(0, 0, 0, 0) );
menu = NEW DeckEditorMenu(MENU_DECK_BUILDER, this, Fonts::OPTION_FONT, "Deck Editor", myDeck, stw); menu = NEW DeckEditorMenu(MENU_DECK_BUILDER, this, Fonts::OPTION_FONT, "Deck Editor", myDeck, stw);
@@ -286,8 +282,7 @@ void GameStateDeckViewer::End()
void GameStateDeckViewer::addRemove(MTGCard * card) void GameStateDeckViewer::addRemove(MTGCard * card)
{ {
if (!card) if (!card) return;
return;
if (displayed_deck->Remove(card, 1, (displayed_deck == myDeck))) if (displayed_deck->Remove(card, 1, (displayed_deck == myDeck)))
{ {
if (displayed_deck == myCollection) if (displayed_deck == myCollection)
@@ -372,8 +367,7 @@ void GameStateDeckViewer::Update(float dt)
return; return;
} }
hudAlpha = 255 - ((int) last_user_activity * 500); hudAlpha = 255 - ((int) last_user_activity * 500);
if (hudAlpha < 0) if (hudAlpha < 0) hudAlpha = 0;
hudAlpha = 0;
if (subMenu) if (subMenu)
{ {
subMenu->Update(dt); subMenu->Update(dt);
@@ -399,15 +393,13 @@ void GameStateDeckViewer::Update(float dt)
last_user_activity = 0; last_user_activity = 0;
mStage = STAGE_TRANSITION_UP; mStage = STAGE_TRANSITION_UP;
useFilter++; useFilter++;
if (useFilter >= MAX_SAVED_FILTERS) if (useFilter >= MAX_SAVED_FILTERS) useFilter = 0;
useFilter = 0;
break; break;
case JGE_BTN_DOWN: case JGE_BTN_DOWN:
last_user_activity = 0; last_user_activity = 0;
mStage = STAGE_TRANSITION_DOWN; mStage = STAGE_TRANSITION_DOWN;
useFilter--; useFilter--;
if (useFilter < 0) if (useFilter < 0) useFilter = MAX_SAVED_FILTERS - 1;
useFilter = MAX_SAVED_FILTERS - 1;
break; break;
case JGE_BTN_CANCEL: case JGE_BTN_CANCEL:
options[Options::DISABLECARDS].number = !options[Options::DISABLECARDS].number; options[Options::DISABLECARDS].number = !options[Options::DISABLECARDS].number;
@@ -453,25 +445,22 @@ void GameStateDeckViewer::Update(float dt)
{ {
filterMenu = NEW WGuiFilters("Filter by...", NULL); filterMenu = NEW WGuiFilters("Filter by...", NULL);
if (source) if (source)
SAFE_DELETE(source); SAFE_DELETE(source);
source = NEW WSrcDeckViewer(myDeck, myCollection); source = NEW WSrcDeckViewer(myDeck, myCollection);
filterMenu->setSrc(source); filterMenu->setSrc(source);
if (displayed_deck != myDeck) if (displayed_deck != myDeck) source->swapSrc();
source->swapSrc();
} }
filterMenu->Entering(JGE_BTN_NONE); filterMenu->Entering(JGE_BTN_NONE);
break; break;
case JGE_BTN_PREV: case JGE_BTN_PREV:
if (last_user_activity < NO_USER_ACTIVITY_HELP_DELAY) if (last_user_activity < NO_USER_ACTIVITY_HELP_DELAY)
last_user_activity = NO_USER_ACTIVITY_HELP_DELAY + 1; last_user_activity = NO_USER_ACTIVITY_HELP_DELAY + 1;
else if ((mStage == STAGE_ONSCREEN_MENU) && (--stw->currentPage < 0)) else if ((mStage == STAGE_ONSCREEN_MENU) && (--stw->currentPage < 0)) stw->currentPage = stw->pageCount;
stw->currentPage = stw->pageCount;
break; break;
case JGE_BTN_NEXT: case JGE_BTN_NEXT:
if (last_user_activity < NO_USER_ACTIVITY_HELP_DELAY) if (last_user_activity < NO_USER_ACTIVITY_HELP_DELAY)
last_user_activity = NO_USER_ACTIVITY_HELP_DELAY + 1; last_user_activity = NO_USER_ACTIVITY_HELP_DELAY + 1;
else if ((mStage == STAGE_ONSCREEN_MENU) && (++stw->currentPage > stw->pageCount)) else if ((mStage == STAGE_ONSCREEN_MENU) && (++stw->currentPage > stw->pageCount)) stw->currentPage = 0;
stw->currentPage = 0;
break; break;
default: // no keypress default: // no keypress
if (last_user_activity > NO_USER_ACTIVITY_HELP_DELAY) if (last_user_activity > NO_USER_ACTIVITY_HELP_DELAY)
@@ -605,18 +594,17 @@ void GameStateDeckViewer::renderOnScreenBasicInfo()
WCardFilter * wc = displayed_deck->getFiltersRoot(); WCardFilter * wc = displayed_deck->getFiltersRoot();
if (wc) if (wc)
sprintf(buffer, "%s %i of %i cards (%i unique)", (displayed_deck == myDeck) ? "DECK: " : " ", sprintf(buffer, "%s %i of %i cards (%i unique)", (displayed_deck == myDeck) ? "DECK: " : " ", nowCopies, allCopies,
nowCopies, allCopies, displayed_deck->getCount(WSrcDeck::FILTERED_UNIQUE)); displayed_deck->getCount(WSrcDeck::FILTERED_UNIQUE));
else else
sprintf(buffer, "%s%i cards (%i unique)", (displayed_deck == myDeck) ? "DECK: " : " ", sprintf(buffer, "%s%i cards (%i unique)", (displayed_deck == myDeck) ? "DECK: " : " ", allCopies, displayed_deck->getCount(
allCopies, displayed_deck->getCount(WSrcDeck::UNFILTERED_UNIQUE)); WSrcDeck::UNFILTERED_UNIQUE));
float w = mFont->GetStringWidth(buffer); float w = mFont->GetStringWidth(buffer);
renderer->FillRoundRect(SCREEN_WIDTH - (w + 27), y + 5, w + 10, 15, 5, ARGB(128,0,0,0)); renderer->FillRoundRect(SCREEN_WIDTH - (w + 27), y + 5, w + 10, 15, 5, ARGB(128,0,0,0));
mFont->DrawString(buffer, SCREEN_WIDTH - 22, y + 15, JGETEXT_RIGHT); mFont->DrawString(buffer, SCREEN_WIDTH - 22, y + 15, JGETEXT_RIGHT);
if (useFilter != 0) if (useFilter != 0) renderer->RenderQuad(mIcons[useFilter - 1], SCREEN_WIDTH - 10, y + 15, 0.0f, 0.5, 0.5);
renderer->RenderQuad(mIcons[useFilter - 1], SCREEN_WIDTH - 10, y + 15, 0.0f, 0.5, 0.5);
} }
//returns position of the current card (cusor) in the currently viewed color/filter //returns position of the current card (cusor) in the currently viewed color/filter
@@ -627,10 +615,8 @@ int GameStateDeckViewer::getCurrentPos()
int currentPos = displayed_deck->getOffset(); int currentPos = displayed_deck->getOffset();
currentPos += 2; //we start by displaying card number 3 currentPos += 2; //we start by displaying card number 3
currentPos = currentPos % total + 1; currentPos = currentPos % total + 1;
if (currentPos < 0) if (currentPos < 0) currentPos = (total + currentPos);
currentPos = (total + currentPos); if (!currentPos) currentPos = total;
if (!currentPos)
currentPos = total;
return currentPos; return currentPos;
} }
@@ -639,8 +625,7 @@ void GameStateDeckViewer::renderSlideBar()
WFont * mFont = resources.GetWFont(Fonts::MAIN_FONT); WFont * mFont = resources.GetWFont(Fonts::MAIN_FONT);
int total = displayed_deck->Size(); int total = displayed_deck->Size();
if (total == 0) if (total == 0) return;
return;
float filler = 15; float filler = 15;
float y = SCREEN_HEIGHT_F - 25; float y = SCREEN_HEIGHT_F - 25;
@@ -696,9 +681,9 @@ void GameStateDeckViewer::renderDeckBackground()
maxC2 = maxC1; maxC2 = maxC1;
} }
PIXEL_TYPE colors[] = { ARGB(255, Constants::_r[maxC1], Constants::_g[maxC1], Constants::_b[maxC1]), PIXEL_TYPE colors[] = { ARGB(255, Constants::_r[maxC1], Constants::_g[maxC1], Constants::_b[maxC1]),
ARGB(255, Constants::_r[maxC1], Constants::_g[maxC1], Constants::_b[maxC1]), ARGB(255, Constants::_r[maxC1], Constants::_g[maxC1], Constants::_b[maxC1]),
ARGB(255, Constants::_r[maxC2], Constants::_g[maxC2], Constants::_b[maxC2]), ARGB(255, Constants::_r[maxC2], Constants::_g[maxC2], Constants::_b[maxC2]),
ARGB(255, Constants::_r[maxC2], Constants::_g[maxC2], Constants::_b[maxC2]), }; ARGB(255, Constants::_r[maxC2], Constants::_g[maxC2], Constants::_b[maxC2]), };
JRenderer::GetInstance()->FillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, colors); JRenderer::GetInstance()->FillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, colors);
@@ -776,7 +761,7 @@ void GameStateDeckViewer::renderOnScreenMenu()
sprintf(buffer, "%i", value); sprintf(buffer, "%i", value);
font->DrawString(buffer, SCREEN_WIDTH - 190 + rightTransition + nb_letters * 13, SCREEN_HEIGHT / 2 + 40); font->DrawString(buffer, SCREEN_WIDTH - 190 + rightTransition + nb_letters * 13, SCREEN_HEIGHT / 2 + 40);
r->RenderQuad(mIcons[j], SCREEN_WIDTH - 197 + rightTransition + nb_letters * 13, SCREEN_HEIGHT / 2 + 46, 0, 0.5, r->RenderQuad(mIcons[j], SCREEN_WIDTH - 197 + rightTransition + nb_letters * 13, SCREEN_HEIGHT / 2 + 46, 0, 0.5,
0.5); 0.5);
if (value > 9) if (value > 9)
{ {
nb_letters += 3; nb_letters += 3;
@@ -973,19 +958,19 @@ void GameStateDeckViewer::renderOnScreenMenu()
// Horizontal table lines // Horizontal table lines
r->DrawLine(27 + leftTransition, posY - 20, 60 + (Constants::MTG_NB_COLORS - 2) * 15 + leftTransition, posY - 20, r->DrawLine(27 + leftTransition, posY - 20, 60 + (Constants::MTG_NB_COLORS - 2) * 15 + leftTransition, posY - 20,
ARGB(128, 255, 255, 255)); ARGB(128, 255, 255, 255));
r->DrawLine(27 + leftTransition, posY - 1, 60 + (Constants::MTG_NB_COLORS - 2) * 15 + leftTransition, posY - 1, r->DrawLine(27 + leftTransition, posY - 1, 60 + (Constants::MTG_NB_COLORS - 2) * 15 + leftTransition, posY - 1,
ARGB(128, 255, 255, 255)); ARGB(128, 255, 255, 255));
r->DrawLine(27 + leftTransition, 2 * 10 + posY + 12, 60 + (Constants::MTG_NB_COLORS - 2) * 15 + leftTransition, 2 * 10 r->DrawLine(27 + leftTransition, 2 * 10 + posY + 12, 60 + (Constants::MTG_NB_COLORS - 2) * 15 + leftTransition, 2 * 10
+ posY + 12, ARGB(128, 255, 255, 255)); + posY + 12, ARGB(128, 255, 255, 255));
r->DrawLine(27 + leftTransition, 3 * 10 + posY + 14, 60 + (Constants::MTG_NB_COLORS - 2) * 15 + leftTransition, 3 * 10 r->DrawLine(27 + leftTransition, 3 * 10 + posY + 14, 60 + (Constants::MTG_NB_COLORS - 2) * 15 + leftTransition, 3 * 10
+ posY + 14, ARGB(128, 255, 255, 255)); + posY + 14, ARGB(128, 255, 255, 255));
// Vertical table lines // Vertical table lines
r->DrawLine(26 + leftTransition, posY - 20, 26 + leftTransition, 3 * 10 + posY + 14, ARGB(128, 255, 255, 255)); r->DrawLine(26 + leftTransition, posY - 20, 26 + leftTransition, 3 * 10 + posY + 14, ARGB(128, 255, 255, 255));
r->DrawLine(43 + leftTransition, posY - 20, 43 + leftTransition, 3 * 10 + posY + 14, ARGB(128, 255, 255, 255)); r->DrawLine(43 + leftTransition, posY - 20, 43 + leftTransition, 3 * 10 + posY + 14, ARGB(128, 255, 255, 255));
r->DrawLine(60 + leftTransition + (Constants::MTG_NB_COLORS - 2) * 15, posY - 20, 60 + leftTransition r->DrawLine(60 + leftTransition + (Constants::MTG_NB_COLORS - 2) * 15, posY - 20, 60 + leftTransition
+ (Constants::MTG_NB_COLORS - 2) * 15, 3 * 10 + posY + 14, ARGB(128, 255, 255, 255)); + (Constants::MTG_NB_COLORS - 2) * 15, 3 * 10 + posY + 14, ARGB(128, 255, 255, 255));
font->DrawString(_("BL"), 27 + leftTransition, posY); font->DrawString(_("BL"), 27 + leftTransition, posY);
font->DrawString(_("NB"), 27 + leftTransition, posY + 10); font->DrawString(_("NB"), 27 + leftTransition, posY + 10);
@@ -1044,7 +1029,7 @@ void GameStateDeckViewer::renderOnScreenMenu()
sprintf(buffer, _("%i").c_str(), stw->countLandsPerColor[i] + stw->countBasicLandsPerColor[i]); sprintf(buffer, _("%i").c_str(), stw->countLandsPerColor[i] + stw->countBasicLandsPerColor[i]);
font->DrawString(buffer, 20 + leftTransition, posY); font->DrawString(buffer, 20 + leftTransition, posY);
sprintf(buffer, _("(%i%%)").c_str(), (int) (100 * (float) (stw->countLandsPerColor[i] sprintf(buffer, _("(%i%%)").c_str(), (int) (100 * (float) (stw->countLandsPerColor[i]
+ stw->countBasicLandsPerColor[i]) / totalProducedSymbols)); + stw->countBasicLandsPerColor[i]) / totalProducedSymbols));
font->DrawString(buffer, 33 + leftTransition, posY); font->DrawString(buffer, 33 + leftTransition, posY);
posX = 72; posX = 72;
for (int j = 0; j < stw->countLandsPerColor[i] + stw->countBasicLandsPerColor[i]; j++) for (int j = 0; j < stw->countLandsPerColor[i] + stw->countBasicLandsPerColor[i]; j++)
@@ -1119,22 +1104,22 @@ void GameStateDeckViewer::renderOnScreenMenu()
// Horizontal table lines // Horizontal table lines
r->DrawLine(27 + leftTransition, posY - 20, 75 + (Constants::MTG_NB_COLORS - 2) * 15 + leftTransition, posY - 20, r->DrawLine(27 + leftTransition, posY - 20, 75 + (Constants::MTG_NB_COLORS - 2) * 15 + leftTransition, posY - 20,
ARGB(128, 255, 255, 255)); ARGB(128, 255, 255, 255));
r->DrawLine(27 + leftTransition, posY - 1, 75 + (Constants::MTG_NB_COLORS - 2) * 15 + leftTransition, posY - 1, r->DrawLine(27 + leftTransition, posY - 1, 75 + (Constants::MTG_NB_COLORS - 2) * 15 + leftTransition, posY - 1,
ARGB(128, 255, 255, 255)); ARGB(128, 255, 255, 255));
r->DrawLine(27 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12, 75 + (Constants::MTG_NB_COLORS - 2) r->DrawLine(27 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12, 75 + (Constants::MTG_NB_COLORS - 2)
* 15 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12, ARGB(128, 255, 255, 255)); * 15 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12, ARGB(128, 255, 255, 255));
// Vertical table lines // Vertical table lines
r->DrawLine(26 + leftTransition, posY - 20, 26 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12, r->DrawLine(26 + leftTransition, posY - 20, 26 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12,
ARGB(128, 255, 255, 255)); ARGB(128, 255, 255, 255));
r->DrawLine(41 + leftTransition, posY - 20, 41 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12, r->DrawLine(41 + leftTransition, posY - 20, 41 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12,
ARGB(128, 255, 255, 255)); ARGB(128, 255, 255, 255));
r->DrawLine(58 + leftTransition, posY - 20, 58 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12, r->DrawLine(58 + leftTransition, posY - 20, 58 + leftTransition, Constants::STATS_MAX_MANA_COST * 10 + posY + 12,
ARGB(128, 255, 255, 255)); ARGB(128, 255, 255, 255));
r->DrawLine(75 + leftTransition + (Constants::MTG_NB_COLORS - 2) * 15, posY - 20, 75 + leftTransition r->DrawLine(75 + leftTransition + (Constants::MTG_NB_COLORS - 2) * 15, posY - 20, 75 + leftTransition
+ (Constants::MTG_NB_COLORS - 2) * 15, Constants::STATS_MAX_MANA_COST * 10 + posY + 12, + (Constants::MTG_NB_COLORS - 2) * 15, Constants::STATS_MAX_MANA_COST * 10 + posY + 12,
ARGB(128, 255, 255, 255)); ARGB(128, 255, 255, 255));
for (int i = 0; i <= Constants::STATS_MAX_MANA_COST; i++) for (int i = 0; i <= Constants::STATS_MAX_MANA_COST; i++)
{ {
@@ -1148,7 +1133,7 @@ void GameStateDeckViewer::renderOnScreenMenu()
font->DrawString(buffer, 64 + leftTransition + j * 15, posY); font->DrawString(buffer, 64 + leftTransition + j * 15, posY);
} }
r->FillRect(77.f + leftTransition + (Constants::MTG_NB_COLORS - 2) * 15.0f, posY + 2.0f, (*countPerCost)[i] * 5.0f, r->FillRect(77.f + leftTransition + (Constants::MTG_NB_COLORS - 2) * 15.0f, posY + 2.0f, (*countPerCost)[i] * 5.0f,
8.0f, graphColor); 8.0f, graphColor);
posY += 10; posY += 10;
} }
@@ -1157,7 +1142,7 @@ void GameStateDeckViewer::renderOnScreenMenu()
font->DrawString(buffer, 20 + leftTransition, posY); font->DrawString(buffer, 20 + leftTransition, posY);
posY += 15; posY += 15;
sprintf(buffer, _("C - Converted mana cost. Cards with cost>%i are included in the last row.").c_str(), sprintf(buffer, _("C - Converted mana cost. Cards with cost>%i are included in the last row.").c_str(),
Constants::STATS_MAX_MANA_COST); Constants::STATS_MAX_MANA_COST);
font->DrawString(buffer, 20 + leftTransition, posY); font->DrawString(buffer, 20 + leftTransition, posY);
posY += 10; posY += 10;
font->DrawString(_("# - Total number of cards with given cost"), 20 + leftTransition, posY); font->DrawString(_("# - Total number of cards with given cost"), 20 + leftTransition, posY);
@@ -1275,8 +1260,7 @@ void GameStateDeckViewer::renderOnScreenMenu()
void GameStateDeckViewer::updateStats() void GameStateDeckViewer::updateStats()
{ {
if (!stw->needUpdate || !myDeck) if (!stw->needUpdate || !myDeck) return;
return;
stw->needUpdate = false; stw->needUpdate = false;
stw->cardCount = myDeck->getCount(WSrcDeck::UNFILTERED_COPIES); stw->cardCount = myDeck->getCount(WSrcDeck::UNFILTERED_COPIES);
stw->countLands = myDeck->getCount(Constants::MTG_COLOR_LAND); stw->countLands = myDeck->getCount(Constants::MTG_COLOR_LAND);
@@ -1345,8 +1329,7 @@ void GameStateDeckViewer::updateStats()
// Lets look for mana producing abilities // Lets look for mana producing abilities
vector<string> abilityStrings; vector<string> abilityStrings;
string thisstring = current->data->magicText; abilityStrings = split(current->data->magicText, '\n');
StringExplode(thisstring, "\n", &abilityStrings);
for (int v = 0; v < (int) abilityStrings.size(); v++) for (int v = 0; v < (int) abilityStrings.size(); v++)
{ {
@@ -1431,7 +1414,7 @@ void GameStateDeckViewer::updateStats()
// Average mana costs // Average mana costs
stw->avgManaCost = ((stw->cardCount - stw->countLands) <= 0) ? 0 : (float) stw->totalManaCost / (stw->cardCount stw->avgManaCost = ((stw->cardCount - stw->countLands) <= 0) ? 0 : (float) stw->totalManaCost / (stw->cardCount
- stw->countLands); - stw->countLands);
stw->avgCreatureCost = (stw->countCreatures <= 0) ? 0 : (float) stw->totalCreatureCost / stw->countCreatures; stw->avgCreatureCost = (stw->countCreatures <= 0) ? 0 : (float) stw->totalCreatureCost / stw->countCreatures;
stw->avgSpellCost = (stw->countSpells <= 0) ? 0 : (float) stw->totalSpellCost / stw->countSpells; stw->avgSpellCost = (stw->countSpells <= 0) ? 0 : (float) stw->totalSpellCost / stw->countSpells;
@@ -1471,15 +1454,14 @@ void GameStateDeckViewer::renderCard(int id, float rotation)
float x_center = x_center_0 + cos((rotation + 8 - id) * M_PI / 12) * (right_border - x_center_0); float x_center = x_center_0 + cos((rotation + 8 - id) * M_PI / 12) * (right_border - x_center_0);
float scale = max_scale / 1.12f * cos((x_center - x_center_0) * 1.5f / (right_border - x_center_0)) + 0.2f * max_scale * cos( float scale = max_scale / 1.12f * cos((x_center - x_center_0) * 1.5f / (right_border - x_center_0)) + 0.2f * max_scale * cos(
cos((x_center - x_center_0) * 0.15f / (right_border - x_center_0))); cos((x_center - x_center_0) * 0.15f / (right_border - x_center_0)));
float x = x_center; // ; float x = x_center; // ;
float y = (SCREEN_HEIGHT_F) / 2.0f + SCREEN_HEIGHT_F * mSlide * (scale + 0.2f); float y = (SCREEN_HEIGHT_F) / 2.0f + SCREEN_HEIGHT_F * mSlide * (scale + 0.2f);
int alpha = (int) (255 * (scale + 1.0 - max_scale)); int alpha = (int) (255 * (scale + 1.0 - max_scale));
if (!card) if (!card) return;
return;
JQuad * quad = NULL; JQuad * quad = NULL;
int cacheError = CACHE_ERROR_NONE; int cacheError = CACHE_ERROR_NONE;
@@ -1500,8 +1482,7 @@ void GameStateDeckViewer::renderCard(int id, float rotation)
} }
int quadAlpha = alpha; int quadAlpha = alpha;
if (!displayed_deck->count(card)) if (!displayed_deck->count(card)) quadAlpha /= 2;
quadAlpha /= 2;
if (quad) if (quad)
{ {
if (quad == backQuad) if (quad == backQuad)
@@ -1520,8 +1501,7 @@ void GameStateDeckViewer::renderCard(int id, float rotation)
{ {
Pos pos = Pos(x, y, scale * 285 / 250, 0.0, 255); Pos pos = Pos(x, y, scale * 285 / 250, 0.0, 255);
CardGui::DrawCard(card, pos, DrawMode::kText); CardGui::DrawCard(card, pos, DrawMode::kText);
if (!options[Options::DISABLECARDS].number) if (!options[Options::DISABLECARDS].number) quad = resources.RetrieveCard(card, CACHE_THUMB);
quad = resources.RetrieveCard(card, CACHE_THUMB);
if (quad) if (quad)
{ {
float _scale = 285 * scale / quad->mHeight; float _scale = 285 * scale / quad->mHeight;
@@ -1533,7 +1513,7 @@ void GameStateDeckViewer::renderCard(int id, float rotation)
if (quadAlpha > 0) if (quadAlpha > 0)
{ {
JRenderer::GetInstance()->FillRect(x - scale * 100.0f, y - scale * 142.5f, scale * 200.0f, scale * 285.0f, JRenderer::GetInstance()->FillRect(x - scale * 100.0f, y - scale * 142.5f, scale * 200.0f, scale * 285.0f,
ARGB(quadAlpha,0,0,0)); ARGB(quadAlpha,0,0,0));
} }
if (last_user_activity < 3) if (last_user_activity < 3)
{ {
@@ -1564,8 +1544,7 @@ void GameStateDeckViewer::Render()
JRenderer * r = JRenderer::GetInstance(); JRenderer * r = JRenderer::GetInstance();
r->ClearScreen(ARGB(0,0,0,0)); r->ClearScreen(ARGB(0,0,0,0));
if (displayed_deck == myDeck && mStage != STAGE_MENU) if (displayed_deck == myDeck && mStage != STAGE_MENU) renderDeckBackground();
renderDeckBackground();
int order[3] = { 1, 2, 3 }; int order[3] = { 1, 2, 3 };
if (mRotation < 0.5 && mRotation > -0.5) if (mRotation < 0.5 && mRotation > -0.5)
{ {
@@ -1613,29 +1592,24 @@ void GameStateDeckViewer::Render()
{ {
menu->Render(); menu->Render();
} }
if (subMenu) if (subMenu) subMenu->Render();
subMenu->Render();
if (filterMenu && !filterMenu->isFinished()) if (filterMenu && !filterMenu->isFinished()) filterMenu->Render();
filterMenu->Render();
if (options.keypadActive()) if (options.keypadActive()) options.keypadRender();
options.keypadRender();
} }
int GameStateDeckViewer::loadDeck(int deckid) int GameStateDeckViewer::loadDeck(int deckid)
{ {
if (!stw) if (!stw) stw = new StatsWrapper(deckid);
stw = new StatsWrapper(deckid);
stw->currentPage = 0; stw->currentPage = 0;
stw->pageCount = 9; stw->pageCount = 9;
stw->needUpdate = true; stw->needUpdate = true;
if (!playerdata) if (!playerdata) playerdata = NEW PlayerData(mParent->collection);
playerdata = NEW PlayerData(mParent->collection);
SAFE_DELETE(myCollection); SAFE_DELETE(myCollection);
myCollection = NEW DeckDataWrapper(playerdata->collection); myCollection = NEW DeckDataWrapper(playerdata->collection);
myCollection->Sort(WSrcCards::SORT_ALPHA); myCollection->Sort(WSrcCards::SORT_ALPHA);
@@ -1707,6 +1681,10 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
mSwitching = false; mSwitching = false;
break; break;
} }
else if (controlId == MENUITEM_MORE_INFO)
{
break;
}
else if (controlId == MENU_ITEM_CHEAT_MODE) else if (controlId == MENU_ITEM_CHEAT_MODE)
{ // (PSY) Cheatmode: Complete the collection { // (PSY) Cheatmode: Complete the collection
playerdata->collection->complete(); // Add the cards playerdata->collection->complete(); // Add the cards
@@ -1714,8 +1692,7 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
for (int i = 0; i < setlist.size(); i++) for (int i = 0; i < setlist.size(); i++)
{ // Update unlocked sets { // Update unlocked sets
GameOptionAward * goa = dynamic_cast<GameOptionAward*> (&options[Options::optionSet(i)]); GameOptionAward * goa = dynamic_cast<GameOptionAward*> (&options[Options::optionSet(i)]);
if (goa) if (goa) goa->giveAward();
goa->giveAward();
} }
options.save(); options.save();
SAFE_DELETE(myCollection); SAFE_DELETE(myCollection);
@@ -1787,8 +1764,7 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
break; break;
case MENU_ITEM_FILTER_BY: case MENU_ITEM_FILTER_BY:
mStage = STAGE_FILTERS; mStage = STAGE_FILTERS;
if (!filterMenu) if (!filterMenu) rebuildFilters();
rebuildFilters();
filterMenu->Entering(JGE_BTN_NONE); filterMenu->Entering(JGE_BTN_NONE);
break; break;
} }
@@ -1824,10 +1800,8 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
// returns probability of no A's // returns probability of no A's
float noLuck(int n, int a, int x) float noLuck(int n, int a, int x)
{ {
if ((a >= n) || (a == 0)) if ((a >= n) || (a == 0)) return 1;
return 1; if ((n == 0) || (x == 0) || (x > n) || (n - a < x)) return 0;
if ((n == 0) || (x == 0) || (x > n) || (n - a < x))
return 0;
a = n - a; a = n - a;
float result = 1; float result = 1;
+147 -53
View File
@@ -31,6 +31,8 @@ enum ENUM_DUEL_STATE
DUEL_STATE_START, DUEL_STATE_START,
DUEL_STATE_END, DUEL_STATE_END,
DUEL_STATE_CHOOSE_DECK1, DUEL_STATE_CHOOSE_DECK1,
DUEL_STATE_DECK1_DETAILED_INFO,
DUEL_STATE_DECK2_DETAILED_INFO,
DUEL_STATE_CHOOSE_DECK1_TO_2, DUEL_STATE_CHOOSE_DECK1_TO_2,
DUEL_STATE_CHOOSE_DECK2, DUEL_STATE_CHOOSE_DECK2,
DUEL_STATE_CHOOSE_DECK2_TO_PLAY, DUEL_STATE_CHOOSE_DECK2_TO_PLAY,
@@ -46,9 +48,14 @@ enum ENUM_DUEL_MENUS
{ {
DUEL_MENU_GAME_MENU, DUEL_MENU_GAME_MENU,
DUEL_MENU_CHOOSE_DECK, DUEL_MENU_CHOOSE_DECK,
DUEL_MENU_CHOOSE_OPPONENT DUEL_MENU_CHOOSE_OPPONENT,
DUEL_MENU_DETAILED_DECK1_INFO,
DUEL_MENU_DETAILED_DECK2_INFO
}; };
int GameStateDuel::selectedPlayerDeckId = 0;
int GameStateDuel::selectedAIDeckId = 0;
GameStateDuel::GameStateDuel(GameApp* parent) : GameStateDuel::GameStateDuel(GameApp* parent) :
GameState(parent) GameState(parent)
{ {
@@ -62,6 +69,8 @@ GameStateDuel::GameStateDuel(GameApp* parent) :
deckmenu = NULL; deckmenu = NULL;
opponentMenu = NULL; opponentMenu = NULL;
menu = NULL; menu = NULL;
popupScreen = NULL;
#ifdef TESTSUITE #ifdef TESTSUITE
testSuite = NULL; testSuite = NULL;
#endif #endif
@@ -100,7 +109,8 @@ void GameStateDuel::Start()
{ {
decksneeded = 1; decksneeded = 1;
deckmenu = NEW DeckMenu(DUEL_MENU_CHOOSE_DECK, this, Fonts::OPTION_FONT, "Choose a Deck", MENU_FONT_SCALE); deckmenu = NEW DeckMenu(DUEL_MENU_CHOOSE_DECK, this, Fonts::OPTION_FONT, "Choose a Deck",
GameStateDuel::selectedPlayerDeckId);
DeckManager *deckManager = DeckManager::GetInstance(); DeckManager *deckManager = DeckManager::GetInstance();
vector<DeckMetaData *> playerDeckList = getValidDeckMetaData(options.profileFile()); vector<DeckMetaData *> playerDeckList = getValidDeckMetaData(options.profileFile());
@@ -109,8 +119,7 @@ void GameStateDuel::Start()
if (nbDecks) if (nbDecks)
{ {
decksneeded = 0; decksneeded = 0;
if (nbDecks > 1) if (nbDecks > 1) deckmenu->Add(MENUITEM_RANDOM_PLAYER, "Random", "Play with a random deck.");
deckmenu->Add(MENUITEM_RANDOM_PLAYER, "Random", "Play with a random deck.");
} }
renderDeckMenu(deckmenu, playerDeckList); renderDeckMenu(deckmenu, playerDeckList);
@@ -118,6 +127,7 @@ void GameStateDuel::Start()
deckManager->updateMetaDataList(&playerDeckList, false); deckManager->updateMetaDataList(&playerDeckList, false);
playerDeckList.clear(); playerDeckList.clear();
DebugTrace("INFO: Player Deck menu has a size of " << sizeof( deckmenu ) );
break; break;
} }
} }
@@ -170,8 +180,7 @@ void GameStateDuel::loadPlayer(int playerId, int decknb, int isAI)
{ //AI Player, chooses deck { //AI Player, chooses deck
AIPlayerFactory playerCreator; AIPlayerFactory playerCreator;
Player * opponent = NULL; Player * opponent = NULL;
if (playerId == 1) if (playerId == 1) opponent = mPlayers[0];
opponent = mPlayers[0];
mPlayers[playerId] = playerCreator.createAIPlayer(mParent->collection, opponent, decknb); mPlayers[playerId] = playerCreator.createAIPlayer(mParent->collection, opponent, decknb);
deck[playerId] = mPlayers[playerId]->game; deck[playerId] = mPlayers[playerId]->game;
} }
@@ -180,8 +189,7 @@ void GameStateDuel::loadPlayer(int playerId, int decknb, int isAI)
{ //Random deck { //Random deck
AIPlayerFactory playerCreator; AIPlayerFactory playerCreator;
Player * opponent = NULL; Player * opponent = NULL;
if (playerId == 1) if (playerId == 1) opponent = mPlayers[0];
opponent = mPlayers[0];
mPlayers[playerId] = playerCreator.createAIPlayer(mParent->collection, opponent); mPlayers[playerId] = playerCreator.createAIPlayer(mParent->collection, opponent);
deck[playerId] = mPlayers[playerId]->game; deck[playerId] = mPlayers[playerId]->game;
} }
@@ -189,8 +197,7 @@ void GameStateDuel::loadPlayer(int playerId, int decknb, int isAI)
void GameStateDuel::initRand(unsigned int seed) void GameStateDuel::initRand(unsigned int seed)
{ {
if (!seed) if (!seed) seed = time(0);
seed = time(0);
srand(seed); srand(seed);
} }
@@ -246,6 +253,8 @@ void GameStateDuel::End()
SAFE_DELETE(menu); SAFE_DELETE(menu);
SAFE_DELETE(opponentMenu); SAFE_DELETE(opponentMenu);
SAFE_DELETE(deckmenu); SAFE_DELETE(deckmenu);
SAFE_DELETE(popupScreen);
#ifdef TESTSUITE #ifdef TESTSUITE
SAFE_DELETE(testSuite); SAFE_DELETE(testSuite);
#endif #endif
@@ -267,12 +276,13 @@ bool GameStateDuel::MusicExist(string FileName)
void GameStateDuel::ensureOpponentMenu() void GameStateDuel::ensureOpponentMenu()
{ {
if (!opponentMenu) if (opponentMenu == NULL)
{ {
opponentMenu = NEW DeckMenu(DUEL_MENU_CHOOSE_OPPONENT, this, Fonts::OPTION_FONT, "Choose Your Opponent", MENU_FONT_SCALE); opponentMenu = NEW DeckMenu(DUEL_MENU_CHOOSE_OPPONENT, this, Fonts::OPTION_FONT, "Choose Your Opponent",
GameStateDuel::selectedAIDeckId);
opponentMenu->Add(MENUITEM_RANDOM_AI, "Random"); opponentMenu->Add(MENUITEM_RANDOM_AI, "Random");
if (options[Options::EVILTWIN_MODE_UNLOCKED].number) if (options[Options::EVILTWIN_MODE_UNLOCKED].number) opponentMenu->Add(MENUITEM_EVIL_TWIN, "Evil Twin", _(
opponentMenu->Add(MENUITEM_EVIL_TWIN, "Evil Twin", _("Can you play against yourself?").c_str()); "Can you play against yourself?").c_str());
DeckManager * deckManager = DeckManager::GetInstance(); DeckManager * deckManager = DeckManager::GetInstance();
vector<DeckMetaData*> opponentDeckList = fillDeckMenu(opponentMenu, JGE_GET_RES("ai/baka"), "ai_baka", mPlayers[0]); vector<DeckMetaData*> opponentDeckList = fillDeckMenu(opponentMenu, JGE_GET_RES("ai/baka"), "ai_baka", mPlayers[0]);
deckManager->updateMetaDataList(&opponentDeckList, true); deckManager->updateMetaDataList(&opponentDeckList, true);
@@ -286,9 +296,14 @@ void GameStateDuel::Update(float dt)
switch (mGamePhase) switch (mGamePhase)
{ {
case DUEL_STATE_ERROR_NO_DECK: case DUEL_STATE_ERROR_NO_DECK:
if (JGE_BTN_OK == mEngine->ReadButton()) if (JGE_BTN_OK == mEngine->ReadButton()) mParent->SetNextState(GAME_STATE_DECK_VIEWER);
mParent->SetNextState(GAME_STATE_DECK_VIEWER);
break; break;
case DUEL_STATE_DECK1_DETAILED_INFO:
case DUEL_STATE_DECK2_DETAILED_INFO:
popupScreen->Update(dt);
break;
case DUEL_STATE_CHOOSE_DECK1: case DUEL_STATE_CHOOSE_DECK1:
if (mParent->gameType == GAME_TYPE_MOMIR) if (mParent->gameType == GAME_TYPE_MOMIR)
{ {
@@ -331,10 +346,11 @@ void GameStateDuel::Update(float dt)
#endif #endif
else else
{ {
if (!rules) if (!rules) rules = NEW Rules("mtg.txt");
rules = NEW Rules("mtg.txt");
if (mParent->players[0] == PLAYER_TYPE_HUMAN) if (mParent->players[0] == PLAYER_TYPE_HUMAN)
deckmenu->Update(dt); {
if (!popupScreen || popupScreen->closed) deckmenu->Update(dt);
}
else else
{ {
loadPlayer(0); loadPlayer(0);
@@ -406,19 +422,17 @@ void GameStateDuel::Update(float dt)
musictrack = "ai_baka_music.mp3"; musictrack = "ai_baka_music.mp3";
else if (mParent->gameType == GAME_TYPE_MOMIR) else if (mParent->gameType == GAME_TYPE_MOMIR)
musictrack = "ai_baka_music_momir.mp3"; musictrack = "ai_baka_music_momir.mp3";
else if (mParent->gameType == GAME_TYPE_RANDOM1 || mParent->gameType == GAME_TYPE_RANDOM2) else if (mParent->gameType == GAME_TYPE_RANDOM1 || mParent->gameType == GAME_TYPE_RANDOM2) musictrack
musictrack = "ai_baka_music_random.mp3"; = "ai_baka_music_random.mp3";
if (!MusicExist(musictrack)) if (!MusicExist(musictrack)) musictrack = "ai_baka_music.mp3";
musictrack = "ai_baka_music.mp3";
GameApp::playMusic(musictrack); GameApp::playMusic(musictrack);
} }
game->Update(dt); game->Update(dt);
if (game->gameOver) if (game->gameOver)
{ {
if (game->players[1]->playMode != Player::MODE_TEST_SUITE) if (game->players[1]->playMode != Player::MODE_TEST_SUITE) credits->compute(game->players[0], game->players[1], mParent);
credits->compute(game->players[0], game->players[1], mParent);
mGamePhase = DUEL_STATE_END; mGamePhase = DUEL_STATE_END;
#ifdef TESTSUITE #ifdef TESTSUITE
if (mParent->players[1] == PLAYER_TYPE_TESTSUITE) if (mParent->players[1] == PLAYER_TYPE_TESTSUITE)
@@ -445,13 +459,13 @@ void GameStateDuel::Update(float dt)
if (!menu) if (!menu)
{ {
menu = NEW SimpleMenu(DUEL_MENU_GAME_MENU, this, Fonts::MENU_FONT, SCREEN_WIDTH / 2 - 100, 25, menu = NEW SimpleMenu(DUEL_MENU_GAME_MENU, this, Fonts::MENU_FONT, SCREEN_WIDTH / 2 - 100, 25,
game->players[1]->deckName.c_str()); game->players[1]->deckName.c_str());
int cardsinhand = game->players[0]->game->hand->nb_cards; int cardsinhand = game->players[0]->game->hand->nb_cards;
//almosthumane - mulligan //almosthumane - mulligan
if ((game->turn < 1) && (cardsinhand != 0) && game->currentGamePhase == Constants::MTG_PHASE_FIRSTMAIN if ((game->turn < 1) && (cardsinhand != 0) && game->currentGamePhase == Constants::MTG_PHASE_FIRSTMAIN
&& game->players[0]->game->inPlay->nb_cards == 0 && game->players[0]->game->graveyard->nb_cards && game->players[0]->game->inPlay->nb_cards == 0 && game->players[0]->game->graveyard->nb_cards == 0
== 0 && game->players[0]->game->exile->nb_cards == 0) //1st Play Check && game->players[0]->game->exile->nb_cards == 0) //1st Play Check
//IF there was no play at the moment automatically mulligan //IF there was no play at the moment automatically mulligan
{ {
menu->Add(MENUITEM_MULLIGAN, "Mulligan"); menu->Add(MENUITEM_MULLIGAN, "Mulligan");
@@ -491,8 +505,7 @@ void GameStateDuel::Update(float dt)
break; break;
default: default:
if (JGE_BTN_OK == mEngine->ReadButton()) if (JGE_BTN_OK == mEngine->ReadButton()) mParent->SetNextState(GAME_STATE_MENU);
mParent->SetNextState(GAME_STATE_MENU);
} }
} }
@@ -502,8 +515,7 @@ void GameStateDuel::Render()
JRenderer * r = JRenderer::GetInstance(); JRenderer * r = JRenderer::GetInstance();
r->ClearScreen(ARGB(0,0,0,0)); r->ClearScreen(ARGB(0,0,0,0));
if (game) if (game) game->Render();
game->Render();
switch (mGamePhase) switch (mGamePhase)
{ {
@@ -557,15 +569,19 @@ void GameStateDuel::Render()
case DUEL_STATE_CHOOSE_DECK1_TO_2: case DUEL_STATE_CHOOSE_DECK1_TO_2:
case DUEL_STATE_CHOOSE_DECK2: case DUEL_STATE_CHOOSE_DECK2:
case DUEL_STATE_CHOOSE_DECK2_TO_PLAY: case DUEL_STATE_CHOOSE_DECK2_TO_PLAY:
case DUEL_STATE_DECK1_DETAILED_INFO:
case DUEL_STATE_DECK2_DETAILED_INFO:
if (mParent->gameType != GAME_TYPE_CLASSIC) if (mParent->gameType != GAME_TYPE_CLASSIC)
mFont->DrawString(_("LOADING DECKS").c_str(), 0, SCREEN_HEIGHT / 2); mFont->DrawString(_("LOADING DECKS").c_str(), 0, SCREEN_HEIGHT / 2);
else else
{ {
if (opponentMenu) if (opponentMenu)
opponentMenu->Render(); opponentMenu->Render();
else if (deckmenu) else if (deckmenu && !deckmenu->closed) deckmenu->Render();
deckmenu->Render();
if (menu) menu->Render();
if (popupScreen && !popupScreen->closed) popupScreen->Render();
} }
break; break;
case DUEL_STATE_ERROR_NO_DECK: case DUEL_STATE_ERROR_NO_DECK:
@@ -583,8 +599,7 @@ void GameStateDuel::Render()
mFont->SetColor(ARGB(255,255,255,255)); mFont->SetColor(ARGB(255,255,255,255));
mFont->DrawString(buffer, SCREEN_WIDTH / 2, 0, JGETEXT_CENTER); mFont->DrawString(buffer, SCREEN_WIDTH / 2, 0, JGETEXT_CENTER);
} }
if (menu) if (menu) menu->Render();
menu->Render();
} }
} }
@@ -595,8 +610,44 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
int aiDeckSize = deckManager->getAIDeckOrderList()->size(); int aiDeckSize = deckManager->getAIDeckOrderList()->size();
switch (controllerId) switch (controllerId)
{ {
case DUEL_MENU_DETAILED_DECK1_INFO:
if ((popupScreen || deckmenu->selectedDeckHasDetails()))
{
DeckMetaData* selectedDeck = deckmenu->getSelectedDeck();
if (!popupScreen->closed)
{
popupScreen->Close();
mGamePhase = DUEL_STATE_CHOOSE_DECK1;
SAFE_DELETE( popupScreen );
}
else
{
popupScreen->Update(selectedDeck);
popupScreen->Render();
}
}
break;
case DUEL_MENU_DETAILED_DECK2_INFO:
if ((popupScreen || opponentMenu->selectedDeckHasDetails()))
{
DeckMetaData* selectedDeck = opponentMenu->getSelectedDeck();
if (!popupScreen->closed)
{
popupScreen->Close();
mGamePhase = DUEL_STATE_CHOOSE_DECK2_TO_PLAY;
SAFE_DELETE( popupScreen );
}
else
{
popupScreen->Update(selectedDeck);
popupScreen->Render();
}
}
break;
case DUEL_MENU_CHOOSE_OPPONENT: case DUEL_MENU_CHOOSE_OPPONENT:
{
switch (controlId) switch (controlId)
{ {
case MENUITEM_RANDOM_AI: case MENUITEM_RANDOM_AI:
@@ -612,12 +663,34 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
opponentMenu->Close(); opponentMenu->Close();
deckmenu->Close(); deckmenu->Close();
mParent->SetNextState(DUEL_STATE_CHOOSE_DECK1); mParent->SetNextState(DUEL_STATE_CHOOSE_DECK1);
mGamePhase = DUEL_MENU_GAME_MENU; mGamePhase = DUEL_STATE_CHOOSE_DECK1;
break;
}
else if (controlId == MENUITEM_MORE_INFO && opponentMenu->showDetailsScreen)
{
DeckMetaData* selectedDeck = opponentMenu->getSelectedDeck();
if (!popupScreen)
{
popupScreen = NEW SimplePopup(DUEL_MENU_DETAILED_DECK2_INFO, this, Fonts::MAIN_FONT, "Detailed Information",
selectedDeck, mParent->collection);
popupScreen->Render();
selectedAIDeckId = selectedDeck->getDeckId();
}
else
{
popupScreen->Update(selectedDeck);
}
mGamePhase = DUEL_STATE_DECK2_DETAILED_INFO;
break;
}
else if (controlId == MENUITEM_MORE_INFO && !opponentMenu->showDetailsScreen)
{
// do nothing, ignore all key requests until popup is dismissed.
break; break;
} }
else if (controlId != MENUITEM_EVIL_TWIN && aiDeckSize > 0) // evil twin else if (controlId != MENUITEM_EVIL_TWIN && aiDeckSize > 0) // evil twin
deckNumber = deckManager->getAIDeckOrderList()->at(controlId - 1)->getDeckId(); deckNumber = deckManager->getAIDeckOrderList()->at(controlId - 1)->getDeckId();
loadPlayer(1, deckNumber, 1); loadPlayer(1, deckNumber, 1);
OpponentsDeckid = deckNumber; OpponentsDeckid = deckNumber;
opponentMenu->Close(); opponentMenu->Close();
@@ -625,9 +698,9 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
break; break;
} }
break; break;
}
case DUEL_MENU_CHOOSE_DECK: case DUEL_MENU_CHOOSE_DECK:
{
if (controlId == MENUITEM_RANDOM_PLAYER) // Random Player Deck Selection if (controlId == MENUITEM_RANDOM_PLAYER) // Random Player Deck Selection
{ {
vector<DeckMetaData *> * playerDeckList = deckManager->getPlayerDeckOrderList(); vector<DeckMetaData *> * playerDeckList = deckManager->getPlayerDeckOrderList();
@@ -639,11 +712,32 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
} }
else if (controlId == MENUITEM_MAIN_MENU || controlId == MENUITEM_CANCEL) // user clicked on "Cancel" else if (controlId == MENUITEM_MAIN_MENU || controlId == MENUITEM_CANCEL) // user clicked on "Cancel"
{ {
if (deckmenu) if (deckmenu) deckmenu->Close();
deckmenu->Close();
mGamePhase = DUEL_STATE_BACK_TO_MAIN_MENU; mGamePhase = DUEL_STATE_BACK_TO_MAIN_MENU;
break; break;
} }
else if (controlId == MENUITEM_MORE_INFO && deckmenu->showDetailsScreen)
{
DeckMetaData* selectedDeck = deckmenu->getSelectedDeck();
if (!popupScreen)
{
popupScreen = NEW SimplePopup(DUEL_MENU_DETAILED_DECK1_INFO, this, Fonts::MAIN_FONT, "Detailed Information",
selectedDeck, mParent->collection);
popupScreen->Render();
selectedPlayerDeckId = deckmenu->selectedDeckId;
}
else
{
popupScreen->Update(selectedDeck);
}
mGamePhase = DUEL_STATE_DECK1_DETAILED_INFO;
break;
}
else if (controlId == MENUITEM_MORE_INFO)
{
// do nothing
break;
}
if (controlId < 0) if (controlId < 0)
{ {
mParent->SetNextState(GAME_STATE_DECK_VIEWER); mParent->SetNextState(GAME_STATE_DECK_VIEWER);
@@ -652,8 +746,7 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
if (mGamePhase == DUEL_STATE_CHOOSE_DECK1) if (mGamePhase == DUEL_STATE_CHOOSE_DECK1)
{ {
vector<DeckMetaData *> * playerDeck = deckManager->getPlayerDeckOrderList(); vector<DeckMetaData *> * playerDeck = deckManager->getPlayerDeckOrderList();
if (!premadeDeck && controlId > 0) if (!premadeDeck && controlId > 0) deckNumber = playerDeck->at(controlId - 1)->getDeckId();
deckNumber = playerDeck->at(controlId - 1)->getDeckId();
loadPlayer(0, deckNumber); loadPlayer(0, deckNumber);
deckmenu->Close(); deckmenu->Close();
mGamePhase = DUEL_STATE_CHOOSE_DECK1_TO_2; mGamePhase = DUEL_STATE_CHOOSE_DECK1_TO_2;
@@ -666,9 +759,9 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
mGamePhase = DUEL_STATE_CHOOSE_DECK2_TO_PLAY; mGamePhase = DUEL_STATE_CHOOSE_DECK2_TO_PLAY;
} }
break; break;
}
default: default:
{
switch (controlId) switch (controlId)
{ {
@@ -682,13 +775,14 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
break; break;
case MENUITEM_MULLIGAN: case MENUITEM_MULLIGAN:
//almosthumane - mulligan //almosthumane - mulligan
{
int cardsinhand = game->players[0]->game->hand->nb_cards; int cardsinhand = game->players[0]->game->hand->nb_cards;
for (int i = 0; i < cardsinhand; i++) //Discard hand for (int i = 0; i < cardsinhand; i++) //Discard hand
game->currentPlayer->game->putInZone(game->currentPlayer->game->hand->cards[0], game->currentPlayer->game->hand, game->currentPlayer->game->putInZone(game->currentPlayer->game->hand->cards[0],
game->currentPlayer->game->library); game->currentPlayer->game->hand,
game->currentPlayer->game->library);
game->currentPlayer->game->library->shuffle(); //Shuffle game->currentPlayer->game->library->shuffle(); //Shuffle
@@ -697,9 +791,9 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
menu->Close(); menu->Close();
mGamePhase = DUEL_STATE_CANCEL; mGamePhase = DUEL_STATE_CANCEL;
break; break;
}
//END almosthumane - mulligan //END almosthumane - mulligan
} }
}
} }
} }
+87 -143
View File
@@ -43,8 +43,7 @@ static inline int getGrade(int v)
//MTGAllCards //MTGAllCards
int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primitive) int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primitive)
{ {
if ('#' == s[0]) if ('#' == s[0]) return 0;
return 0;
size_t i = s.find_first_of('='); size_t i = s.find_first_of('=');
if (i == string::npos || 0 == i) if (i == string::npos || 0 == i)
{ {
@@ -61,26 +60,22 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
case 'a': case 'a':
if (0 == strcmp("auto", key)) if (0 == strcmp("auto", key))
{ {
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
primitive->addMagicText(val); primitive->addMagicText(val);
} }
else if (0 == strncmp("auto", key, 4)) else if (0 == strncmp("auto", key, 4))
{ {
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
primitive->addMagicText(val, key + 4); primitive->addMagicText(val, key + 4);
} }
else if (0 == strcmp("alias", key)) else if (0 == strcmp("alias", key))
{ {
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
primitive->alias = atoi(val); primitive->alias = atoi(val);
} }
else if (0 == strcmp("abilities", key)) else if (0 == strcmp("abilities", key))
{ {
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
string value = val; string value = val;
//Specific Abilities //Specific Abilities
std::transform(value.begin(), value.end(), value.begin(), ::tolower); std::transform(value.begin(), value.end(), value.begin(), ::tolower);
@@ -112,8 +107,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
break; break;
case 'c': //color case 'c': //color
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
{ {
string value = val; string value = val;
std::transform(value.begin(), value.end(), value.begin(), ::tolower); std::transform(value.begin(), value.end(), value.begin(), ::tolower);
@@ -128,12 +122,11 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
break; break;
case 'g': //grade case 'g': //grade
if (s.size() - i - 1 > 2) if (s.size() - i - 1 > 2) currentGrade = getGrade(val[2]);
currentGrade = getGrade(val[2]);
break; break;
case 'k': //kicker case 'k': //kicker
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
if (ManaCost * cost = primitive->getManaCost()) if (ManaCost * cost = primitive->getManaCost())
{ {
string value = val; string value = val;
@@ -141,9 +134,9 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
cost->kicker = ManaCost::parseManaCost(value); cost->kicker = ManaCost::parseManaCost(value);
} }
break; break;
case 'o': //othercost case 'o': //othercost
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
if (ManaCost * cost = primitive->getManaCost()) if (ManaCost * cost = primitive->getManaCost())
{ {
string value = val; string value = val;
@@ -151,9 +144,9 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
cost->alternative = ManaCost::parseManaCost(value); cost->alternative = ManaCost::parseManaCost(value);
} }
break; break;
case 'b': //buyback case 'b': //buyback
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
if (ManaCost * cost = primitive->getManaCost()) if (ManaCost * cost = primitive->getManaCost())
{ {
string value = val; string value = val;
@@ -162,8 +155,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
} }
break; break;
case 'f': //flashback case 'f': //flashback
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
if (ManaCost * cost = primitive->getManaCost()) if (ManaCost * cost = primitive->getManaCost())
{ {
string value = val; string value = val;
@@ -173,14 +165,12 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
break; break;
case 'i': //id case 'i': //id
if (!card) if (!card) card = NEW MTGCard();
card = NEW MTGCard();
card->setMTGId(atoi(val)); card->setMTGId(atoi(val));
break; break;
case 'm': //mana case 'm': //mana
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
{ {
string value = val; string value = val;
std::transform(value.begin(), value.end(), value.begin(), ::tolower); std::transform(value.begin(), value.end(), value.begin(), ::tolower);
@@ -189,26 +179,21 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
break; break;
case 'n': //name case 'n': //name
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive(); if (0 == strcmp("Bloodrock Cyclops", val)) cout << "val" << endl;
if (0 == strcmp("Bloodrock Cyclops", val))
cout << "val" << endl;
primitive->setName(val); primitive->setName(val);
break; break;
case 'p': case 'p':
if ('r' == key[1]) if ('r' == key[1])
{ // primitive { // primitive
if (!card) if (!card) card = NEW MTGCard();
card = NEW MTGCard();
map<string, CardPrimitive*>::iterator it = primitives.find(val); map<string, CardPrimitive*>::iterator it = primitives.find(val);
if (it != primitives.end()) if (it != primitives.end()) card->setPrimitive(it->second);
card->setPrimitive(it->second);
} }
else else
{ //power { //power
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
primitive->setPower(atoi(val)); primitive->setPower(atoi(val));
} }
break; break;
@@ -216,8 +201,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
case 'r': //retrace/rarity case 'r': //retrace/rarity
if ('e' == key[1]) if ('e' == key[1])
{ //retrace { //retrace
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
if (ManaCost * cost = primitive->getManaCost()) if (ManaCost * cost = primitive->getManaCost())
{ {
string value = val; string value = val;
@@ -227,15 +211,13 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
} }
else else
{//rarity {//rarity
if (!card) if (!card) card = NEW MTGCard();
card = NEW MTGCard();
card->setRarity(val[0]); card->setRarity(val[0]);
} }
break; break;
case 's': //subtype case 's': //subtype
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
while (true) while (true)
{ {
char* found = strchr(val, ' '); char* found = strchr(val, ' ');
@@ -254,8 +236,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
break; break;
case 't': case 't':
if (!primitive) if (!primitive) primitive = NEW CardPrimitive();
primitive = NEW CardPrimitive();
if (0 == strcmp("target", key)) if (0 == strcmp("target", key))
{ {
string value = val; string value = val;
@@ -282,12 +263,11 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
} }
} }
} }
else if (0 == strcmp("toughness", key)) else if (0 == strcmp("toughness", key)) primitive->setToughness(atoi(val));
primitive->setToughness(atoi(val));
break; break;
default: default:
DebugTrace("MTGDECK Parsing Error: " << s); DebugTrace( endl << "MTGDECK Parsing Error: " << " [" << primitive->getName() << "]" << s << std::endl);
break; break;
} }
@@ -321,8 +301,7 @@ int MTGAllCards::load(const char * config_file, const char * set_name, int autol
MTGSetInfo *si = setlist.getInfo(set_id); MTGSetInfo *si = setlist.getInfo(set_id);
std::ifstream setFile(config_file, ios::in | ios::ate); std::ifstream setFile(config_file, ios::in | ios::ate);
if (!setFile) if (!setFile) return total_cards;
return total_cards;
streampos fileSize = setFile.tellg(); streampos fileSize = setFile.tellg();
setFile.seekg(0, ios::beg); setFile.seekg(0, ios::beg);
@@ -336,13 +315,10 @@ int MTGAllCards::load(const char * config_file, const char * set_name, int autol
while (true) while (true)
{ {
if (!std::getline(stream, s)) if (!std::getline(stream, s)) return total_cards;
return total_cards; if (!s.size()) continue;
if (!s.size())
continue;
if (s[s.size() - 1] == '\r') if (s[s.size() - 1] == '\r') s.erase(s.size() - 1); // Handle DOS files
s.erase(s.size() - 1); // Handle DOS files
switch (conf_read_mode) switch (conf_read_mode)
{ {
case MTGAllCards::READ_ANYTHING: case MTGAllCards::READ_ANYTHING:
@@ -358,8 +334,7 @@ int MTGAllCards::load(const char * config_file, const char * set_name, int autol
{ {
int fileGrade = getGrade(s[8]); int fileGrade = getGrade(s[8]);
int maxGrade = options[Options::MAX_GRADE].number; int maxGrade = options[Options::MAX_GRADE].number;
if (!maxGrade) if (!maxGrade) maxGrade = Constants::GRADE_BORDERLINE; //Default setting for grade is borderline?
maxGrade = Constants::GRADE_BORDERLINE; //Default setting for grade is borderline?
if (fileGrade > maxGrade) if (fileGrade > maxGrade)
{ {
return total_cards; return total_cards;
@@ -370,19 +345,16 @@ int MTGAllCards::load(const char * config_file, const char * set_name, int autol
case MTGAllCards::READ_METADATA: case MTGAllCards::READ_METADATA:
if (s[0] == '[' && s[1] == '/') if (s[0] == '[' && s[1] == '/')
conf_read_mode = MTGAllCards::READ_ANYTHING; conf_read_mode = MTGAllCards::READ_ANYTHING;
else if (si) else if (si) si->processConfLine(s);
si->processConfLine(s);
continue; continue;
case MTGAllCards::READ_CARD: case MTGAllCards::READ_CARD:
if (s[0] == '[' && s[1] == '/') if (s[0] == '[' && s[1] == '/')
{ {
conf_read_mode = MTGAllCards::READ_ANYTHING; conf_read_mode = MTGAllCards::READ_ANYTHING;
if (tempPrimitive) if (tempPrimitive) tempPrimitive = addPrimitive(tempPrimitive, tempCard);
tempPrimitive = addPrimitive(tempPrimitive, tempCard);
if (tempCard) if (tempCard)
{ {
if (tempPrimitive) if (tempPrimitive) tempCard->setPrimitive(tempPrimitive);
tempCard->setPrimitive(tempPrimitive);
addCardToCollection(tempCard, set_id); addCardToCollection(tempCard, set_id);
} }
tempCard = NULL; tempCard = NULL;
@@ -395,7 +367,6 @@ int MTGAllCards::load(const char * config_file, const char * set_name, int autol
continue; continue;
} }
} }
return total_cards; return total_cards;
} }
@@ -517,8 +488,7 @@ bool MTGAllCards::addCardToCollection(MTGCard * card, int setId)
collection[newId] = card; //Push card into collection. collection[newId] = card; //Push card into collection.
MTGSetInfo * si = setlist.getInfo(setId); MTGSetInfo * si = setlist.getInfo(setId);
if (si) if (si) si->count(card); //Count card in set info
si->count(card); //Count card in set info
++total_cards; ++total_cards;
return true; return true;
} }
@@ -526,8 +496,7 @@ bool MTGAllCards::addCardToCollection(MTGCard * card, int setId)
CardPrimitive * MTGAllCards::addPrimitive(CardPrimitive * primitive, MTGCard * card) CardPrimitive * MTGAllCards::addPrimitive(CardPrimitive * primitive, MTGCard * card)
{ {
int maxGrade = options[Options::MAX_GRADE].number; int maxGrade = options[Options::MAX_GRADE].number;
if (!maxGrade) if (!maxGrade) maxGrade = Constants::GRADE_BORDERLINE; //Default setting for grade is borderline?
maxGrade = Constants::GRADE_BORDERLINE; //Default setting for grade is borderline?
if (currentGrade > maxGrade) if (currentGrade > maxGrade)
{ {
SAFE_DELETE(primitive); SAFE_DELETE(primitive);
@@ -546,7 +515,7 @@ CardPrimitive * MTGAllCards::addPrimitive(CardPrimitive * primitive, MTGCard * c
{ {
//ERROR //ERROR
//Todo move the deletion somewhere else ? //Todo move the deletion somewhere else ?
DebugTrace ("MTGDECK: primitives conflict: "<< key); DebugTrace("MTGDECK: primitives conflict: "<< key);
SAFE_DELETE(primitive); SAFE_DELETE(primitive);
return NULL; return NULL;
} }
@@ -579,17 +548,14 @@ MTGCard * MTGAllCards::getCardById(int id)
MTGCard * MTGAllCards::_(int index) MTGCard * MTGAllCards::_(int index)
{ {
if (index >= total_cards) if (index >= total_cards) return NULL;
return NULL;
return getCardById(ids[index]); return getCardById(ids[index]);
} }
MTGCard * MTGAllCards::getCardByName(string name) MTGCard * MTGAllCards::getCardByName(string name)
{ {
if (!name.size()) if (!name.size()) return NULL;
return NULL; if (name[0] == '#') return NULL;
if (name[0] == '#')
return NULL;
int cardnb = atoi(name.c_str()); int cardnb = atoi(name.c_str());
if (cardnb) if (cardnb)
@@ -613,12 +579,10 @@ MTGCard * MTGAllCards::getCardByName(string name)
for (it = collection.begin(); it != collection.end(); it++) for (it = collection.begin(); it != collection.end(); it++)
{ {
MTGCard * c = it->second; MTGCard * c = it->second;
if (setId != -1 && setId != c->setId) if (setId != -1 && setId != c->setId) continue;
continue;
string cardName = c->data->name; string cardName = c->data->name;
std::transform(cardName.begin(), cardName.end(), cardName.begin(), ::tolower); std::transform(cardName.begin(), cardName.end(), cardName.begin(), ::tolower);
if (cardName.compare(name) == 0) if (cardName.compare(name) == 0) return c;
return c;
} }
return NULL; return NULL;
@@ -632,6 +596,7 @@ MTGDeck::MTGDeck(MTGAllCards * _allcards)
filename = ""; filename = "";
meta_name = ""; meta_name = "";
} }
int MTGDeck::totalPrice() int MTGDeck::totalPrice()
{ {
int total = 0; int total = 0;
@@ -640,12 +605,12 @@ int MTGDeck::totalPrice()
for (it = cards.begin(); it != cards.end(); it++) for (it = cards.begin(); it != cards.end(); it++)
{ {
int nb = it->second; int nb = it->second;
if (nb) if (nb) total += pricelist->getPrice(it->first);
total += pricelist->getPrice(it->first);
} }
SAFE_DELETE(pricelist); SAFE_DELETE(pricelist);
return total; return total;
} }
MTGDeck::MTGDeck(const char * config_file, MTGAllCards * _allcards, int meta_only) MTGDeck::MTGDeck(const char * config_file, MTGAllCards * _allcards, int meta_only)
{ {
total_cards = 0; total_cards = 0;
@@ -661,10 +626,8 @@ MTGDeck::MTGDeck(const char * config_file, MTGAllCards * _allcards, int meta_onl
{ {
while (std::getline(file, s)) while (std::getline(file, s))
{ {
if (!s.size()) if (!s.size()) continue;
continue; if (s[s.size() - 1] == '\r') s.erase(s.size() - 1); //Handle DOS files
if (s[s.size() - 1] == '\r')
s.erase(s.size() - 1); //Handle DOS files
if (s[0] == '#') if (s[0] == '#')
{ {
size_t found = s.find("NAME:"); size_t found = s.find("NAME:");
@@ -676,15 +639,13 @@ MTGDeck::MTGDeck(const char * config_file, MTGAllCards * _allcards, int meta_onl
found = s.find("DESC:"); found = s.find("DESC:");
if (found != string::npos) if (found != string::npos)
{ {
if (meta_desc.size()) if (meta_desc.size()) meta_desc.append("\n");
meta_desc.append("\n");
meta_desc.append(s.substr(found + 5)); meta_desc.append(s.substr(found + 5));
continue; continue;
} }
continue; continue;
} }
if (meta_only) if (meta_only) break;
break;
int cardnb = atoi(s.c_str()); int cardnb = atoi(s.c_str());
if (cardnb) if (cardnb)
{ {
@@ -733,8 +694,7 @@ MTGCard * MTGDeck::getCardById(int mtgId)
int MTGDeck::addRandomCards(int howmany, int * setIds, int nbSets, int rarity, const char * _subtype, int * colors, int nbcolors) int MTGDeck::addRandomCards(int howmany, int * setIds, int nbSets, int rarity, const char * _subtype, int * colors, int nbcolors)
{ {
if (howmany <= 0) if (howmany <= 0) return 1;
return 1;
int unallowedColors[Constants::MTG_NB_COLORS + 1]; int unallowedColors[Constants::MTG_NB_COLORS + 1];
for (int i = 0; i < Constants::MTG_NB_COLORS; ++i) for (int i = 0; i < Constants::MTG_NB_COLORS; ++i)
@@ -750,12 +710,10 @@ int MTGDeck::addRandomCards(int howmany, int * setIds, int nbSets, int rarity, c
} }
int collectionTotal = database->totalCards(); int collectionTotal = database->totalCards();
if (!collectionTotal) if (!collectionTotal) return 0;
return 0;
char subtype[4096]; char subtype[4096];
if (_subtype) if (_subtype) sprintf(subtype, "%s", _subtype);
sprintf(subtype, "%s", _subtype);
vector<int> subcollection; vector<int> subcollection;
int subtotal = 0; int subtotal = 0;
@@ -764,13 +722,12 @@ int MTGDeck::addRandomCards(int howmany, int * setIds, int nbSets, int rarity, c
MTGCard * card = database->_(i); MTGCard * card = database->_(i);
int r = card->getRarity(); int r = card->getRarity();
if (r != Constants::RARITY_T && (rarity == -1 || r == rarity) && // remove tokens if (r != Constants::RARITY_T && (rarity == -1 || r == rarity) && // remove tokens
card->setId != MTGSets::INTERNAL_SET && //remove cards that are defined in primitives. Those are workarounds (usually tokens) and should only be used internally card->setId != MTGSets::INTERNAL_SET && //remove cards that are defined in primitives. Those are workarounds (usually tokens) and should only be used internally
(!_subtype || card->data->hasSubtype(subtype))) (!_subtype || card->data->hasSubtype(subtype)))
{ {
int ok = 0; int ok = 0;
if (!nbSets) if (!nbSets) ok = 1;
ok = 1;
for (int j = 0; j < nbSets; ++j) for (int j = 0; j < nbSets; ++j)
{ {
if (card->setId == setIds[j]) if (card->setId == setIds[j])
@@ -801,8 +758,8 @@ int MTGDeck::addRandomCards(int howmany, int * setIds, int nbSets, int rarity, c
} }
if (subtotal == 0) if (subtotal == 0)
{ {
if (rarity == Constants::RARITY_M) if (rarity == Constants::RARITY_M) return addRandomCards(howmany, setIds, nbSets, Constants::RARITY_R, _subtype, colors,
return addRandomCards(howmany, setIds, nbSets, Constants::RARITY_R, _subtype, colors, nbcolors); nbcolors);
return 0; return 0;
} }
for (int i = 0; i < howmany; i++) for (int i = 0; i < howmany; i++)
@@ -828,8 +785,7 @@ int MTGDeck::add(MTGDeck * deck)
int MTGDeck::add(int cardid) int MTGDeck::add(int cardid)
{ {
if (!database->getCardById(cardid)) if (!database->getCardById(cardid)) return 0;
return 0;
if (cards.find(cardid) == cards.end()) if (cards.find(cardid) == cards.end())
{ {
cards[cardid] = 1; cards[cardid] = 1;
@@ -845,8 +801,7 @@ int MTGDeck::add(int cardid)
int MTGDeck::add(MTGCard * card) int MTGDeck::add(MTGCard * card)
{ {
if (!card) if (!card) return 0;
return 0;
return (add(card->getId())); return (add(card->getId()));
} }
@@ -897,8 +852,7 @@ int MTGDeck::removeAll()
int MTGDeck::remove(int cardid) int MTGDeck::remove(int cardid)
{ {
if (cards.find(cardid) == cards.end() || cards[cardid] == 0) if (cards.find(cardid) == cards.end() || cards[cardid] == 0) return 0;
return 0;
cards[cardid]--; cards[cardid]--;
total_cards--; total_cards--;
//initCounters(); //initCounters();
@@ -907,8 +861,7 @@ int MTGDeck::remove(int cardid)
int MTGDeck::remove(MTGCard * card) int MTGDeck::remove(MTGCard * card)
{ {
if (!card) if (!card) return 0;
return 0;
return (remove(card->getId())); return (remove(card->getId()));
} }
@@ -1000,8 +953,7 @@ MTGSets::~MTGSets()
MTGSetInfo* MTGSets::getInfo(int setID) MTGSetInfo* MTGSets::getInfo(int setID)
{ {
if (setID < 0 || setID >= (int) setinfo.size()) if (setID < 0 || setID >= (int) setinfo.size()) return NULL;
return NULL;
return setinfo[setID]; return setinfo[setID];
} }
@@ -1022,8 +974,8 @@ MTGSetInfo* MTGSets::randomSet(int blockId, int atleast)
a = rand() % size(); a = rand() % size();
for (int i = a; i < size(); i++) for (int i = a; i < size(); i++)
{ {
if (unlocked[i] && (blockId == -1 || setinfo[i]->block == blockId) && (atleast == -1 || setinfo[i]->totalCards() if (unlocked[i] && (blockId == -1 || setinfo[i]->block == blockId) &&
>= atleast)) (atleast == -1 || setinfo[i]->totalCards() >= atleast))
{ {
free(unlocked); free(unlocked);
return setinfo[i]; return setinfo[i];
@@ -1031,8 +983,8 @@ MTGSetInfo* MTGSets::randomSet(int blockId, int atleast)
} }
for (int i = 0; i < a; i++) for (int i = 0; i < a; i++)
{ {
if (unlocked[i] && (blockId == -1 || setinfo[i]->block == blockId) && (atleast == -1 || setinfo[i]->totalCards() if (unlocked[i] && (blockId == -1 || setinfo[i]->block == blockId) &&
>= atleast)) (atleast == -1 || setinfo[i]->totalCards() >= atleast))
{ {
free(unlocked); free(unlocked);
return setinfo[i]; return setinfo[i];
@@ -1040,19 +992,18 @@ MTGSetInfo* MTGSets::randomSet(int blockId, int atleast)
} }
blockId = -1; blockId = -1;
iter++; iter++;
if (iter == 2) if (iter == 2) atleast = -1;
atleast = -1;
} }
free(unlocked); free(unlocked);
return NULL; return NULL;
} }
int blockSize(int blockId); int blockSize(int blockId);
int MTGSets::Add(const char * name) int MTGSets::Add(const char * name)
{ {
int setid = findSet(name); int setid = findSet(name);
if (setid != -1) if (setid != -1) return setid;
return setid;
MTGSetInfo* s = NEW MTGSetInfo(name); MTGSetInfo* s = NEW MTGSetInfo(name);
setinfo.push_back(s); setinfo.push_back(s);
@@ -1068,20 +1019,17 @@ int MTGSets::findSet(string name)
for (int i = 0; i < (int) setinfo.size(); i++) for (int i = 0; i < (int) setinfo.size(); i++)
{ {
MTGSetInfo* s = setinfo[i]; MTGSetInfo* s = setinfo[i];
if (!s) if (!s) continue;
continue;
string set = s->id; string set = s->id;
std::transform(set.begin(), set.end(), set.begin(), ::tolower); std::transform(set.begin(), set.end(), set.begin(), ::tolower);
if (set.compare(name) == 0) if (set.compare(name) == 0) return i;
return i;
} }
return -1; return -1;
} }
int MTGSets::findBlock(string s) int MTGSets::findBlock(string s)
{ {
if (!s.size()) if (!s.size()) return -1;
return -1;
string comp = s; string comp = s;
std::transform(comp.begin(), comp.end(), comp.begin(), ::tolower); std::transform(comp.begin(), comp.end(), comp.begin(), ::tolower);
@@ -1089,8 +1037,7 @@ int MTGSets::findBlock(string s)
{ {
string b = blocks[i]; string b = blocks[i];
std::transform(b.begin(), b.end(), b.begin(), ::tolower); std::transform(b.begin(), b.end(), b.begin(), ::tolower);
if (b.compare(comp) == 0) if (b.compare(comp) == 0) return i;
return i;
} }
blocks.push_back(s); blocks.push_back(s);
@@ -1101,24 +1048,23 @@ int MTGSets::operator[](string id)
{ {
return findSet(id); return findSet(id);
} }
string MTGSets::operator[](int id) string MTGSets::operator[](int id)
{ {
if (id < 0 || id >= (int) setinfo.size()) if (id < 0 || id >= (int) setinfo.size()) return "";
return "";
MTGSetInfo * si = setinfo[id]; MTGSetInfo * si = setinfo[id];
if (!si) if (!si) return "";
return "";
return si->id; return si->id;
} }
int MTGSets::getSetNum(MTGSetInfo*i) int MTGSets::getSetNum(MTGSetInfo*i)
{ {
int it; int it;
for (it = 0; it < size(); it++) for (it = 0; it < size(); it++)
{ {
if (setinfo[it] == i) if (setinfo[it] == i) return it;
return it;
} }
return -1; return -1;
} }
@@ -1132,6 +1078,7 @@ MTGSetInfo::~MTGSetInfo()
{ {
SAFE_DELETE(mPack); SAFE_DELETE(mPack);
} }
MTGSetInfo::MTGSetInfo(string _id) MTGSetInfo::MTGSetInfo(string _id)
{ {
string whitespaces(" \t\f\v\n\r"); string whitespaces(" \t\f\v\n\r");
@@ -1155,8 +1102,7 @@ MTGSetInfo::MTGSetInfo(string _id)
void MTGSetInfo::count(MTGCard*c) void MTGSetInfo::count(MTGCard*c)
{ {
if (!c) if (!c) return;
return;
switch (c->getRarity()) switch (c->getRarity())
{ {
@@ -1188,22 +1134,21 @@ int MTGSetInfo::totalCards()
string MTGSetInfo::getName() string MTGSetInfo::getName()
{ {
if (name.size()) if (name.size()) return name; //Pretty name is translated when rendering.
return name; //Pretty name is translated when rendering.
return id; //Ugly name as well. return id; //Ugly name as well.
} }
string MTGSetInfo::getBlock() string MTGSetInfo::getBlock()
{ {
if (block < 0 || block >= (int) setlist.blocks.size()) if (block < 0 || block >= (int) setlist.blocks.size()) return "None";
return "None";
return setlist.blocks[block]; return setlist.blocks[block];
} }
void MTGSetInfo::processConfLine(string line) void MTGSetInfo::processConfLine(string line)
{ {
size_t i = line.find_first_of("="); size_t i = line.find_first_of("=");
if (i == string::npos) if (i == string::npos) return;
return;
string key = line.substr(0, i); string key = line.substr(0, i);
std::transform(key.begin(), key.end(), key.begin(), ::tolower); std::transform(key.begin(), key.end(), key.begin(), ::tolower);
@@ -1215,6 +1160,5 @@ void MTGSetInfo::processConfLine(string line)
author = value; author = value;
else if (key.compare("block") == 0) else if (key.compare("block") == 0)
block = setlist.findBlock(value.c_str()); block = setlist.findBlock(value.c_str());
else if (key.compare("year") == 0) else if (key.compare("year") == 0) year = atoi(value.c_str());
year = atoi(value.c_str());
} }
+115
View File
@@ -0,0 +1,115 @@
/*
* SimplePopup.cpp
*
* Created on: Nov 18, 2010
* Author: Michael
*/
#include "PrecompiledHeader.h"
#include "SimplePopup.h"
#include "JTypes.h"
#include "GameApp.h"
#include "DeckStats.h"
#include "DeckManager.h"
#include <iomanip>
SimplePopup::SimplePopup(int id, JGuiListener* listener, const int fontId, const char * _title, DeckMetaData* deckMetaData, MTGAllCards * collection) :
JGuiController(id, listener), mFontId(fontId), mCollection(collection)
{
mX = 35;
mY = 50;
mTitle = _title;
mMaxLines = 10;
mTextFont = resources.GetWFont(fontId);
this->mCount = 1;
stw = NULL;
Update(deckMetaData);
}
void SimplePopup::Render()
{
closed = false;
JRenderer *r = JRenderer::GetInstance();
string detailedInformation = getDetailedInformation(mDeckInformation->getFilename());
mTextFont->SetScale(0.85f);
const float textWidth = 183.0f;
const float textHeight = mTextFont->GetHeight() * 10;
r->DrawRoundRect(mX, mY, textWidth, textHeight, 2.0f, ARGB( 255, 125, 255, 0) );
r->FillRoundRect(mX, mY, textWidth, textHeight, 2.0f, ARGB( 255, 0, 0, 0 ) );
mTextFont->DrawString(detailedInformation.c_str(), mX + 20 , mY + 10);
}
void SimplePopup::Update(DeckMetaData* selectedDeck)
{
mDeckInformation = selectedDeck;
SAFE_DELETE(stw);
stw = NEW StatsWrapper(mDeckInformation->getDeckId());
stw->updateStats(mDeckInformation->getFilename(), mCollection);
}
string SimplePopup::getDetailedInformation(string filename)
{
ostringstream oss;
oss
<< "------- Deck Summary -----" << endl
<< "Cards: "<< stw->cardCount << endl
<< "Creatures: "<< setw(2) << stw->countCreatures
<< " Enchantments: " << stw->countEnchantments << endl
<< "Instants: " << setw(4) << stw->countInstants
<< " Sorceries: " << setw(2) << stw->countSorceries << endl
<< "Lands: "
<< "A: " << setw(2) << left << stw->countLandsPerColor[ Constants::MTG_COLOR_ARTIFACT ] + stw->countBasicLandsPerColor[ Constants::MTG_COLOR_ARTIFACT ] << " "
<< "G: " << setw(2) << left << stw->countLandsPerColor[ Constants::MTG_COLOR_GREEN ] + stw->countLandsPerColor[ Constants::MTG_COLOR_GREEN ] << " "
<< "R: " << setw(2) << left << stw->countLandsPerColor[ Constants::MTG_COLOR_RED ] + stw->countBasicLandsPerColor[ Constants::MTG_COLOR_RED ] << " "
<< "U: " << setw(2) << left << stw->countLandsPerColor[ Constants::MTG_COLOR_BLUE ] + stw->countBasicLandsPerColor[ Constants::MTG_COLOR_BLUE ] << " "
<< "B: " << setw(2) << left << stw->countLandsPerColor[ Constants::MTG_COLOR_BLACK ] + stw->countBasicLandsPerColor[ Constants::MTG_COLOR_BLACK ] << " "
<< "W: " << setw(2) << left << stw->countLandsPerColor[ Constants::MTG_COLOR_WHITE ] + stw->countBasicLandsPerColor[ Constants::MTG_COLOR_WHITE ] << endl
<< " --- Mana Curve --- " << endl;
for ( int costIdx = 0; costIdx < 15; ++costIdx )
if ( stw->countCardsPerCost[ costIdx ] > 0 )
oss << costIdx << ": " << setw(2) << left << stw->countCardsPerCost[ costIdx ] << " ";
oss << endl;
oss
<< " --- Average Cost --- " << endl
<< "Creature: "<< setprecision(2) << stw->avgCreatureCost << endl
<< "Mana: " << setprecision(2) << stw->avgManaCost << " "
<< "Spell: " << setprecision(2) << stw->avgSpellCost << endl;
return oss.str();
}
void SimplePopup::Update(float dt)
{
JButton key = mEngine->ReadButton();
CheckUserInput(key);
}
void SimplePopup::Close()
{
closed = true;
mCount = 0;
}
SimplePopup::~SimplePopup(void)
{
mTextFont = NULL;
mDeckInformation = NULL;
SAFE_DELETE(stw);
}
void SimplePopup::drawHorzPole(float x, float y, float width)
{
}
void SimplePopup::drawVertPole(float x, float y, float height)
{
}
+12
View File
@@ -837,6 +837,10 @@
RelativePath=".\src\SimplePad.cpp" RelativePath=".\src\SimplePad.cpp"
> >
</File> </File>
<File
RelativePath=".\src\SimplePopup.cpp"
>
</File>
<File <File
RelativePath=".\src\StoryFlow.cpp" RelativePath=".\src\StoryFlow.cpp"
> >
@@ -1254,6 +1258,10 @@
RelativePath=".\include\Rules.h" RelativePath=".\include\Rules.h"
> >
</File> </File>
<File
RelativePath=".\include\ShopItem.h"
>
</File>
<File <File
RelativePath=".\include\SimpleMenu.h" RelativePath=".\include\SimpleMenu.h"
> >
@@ -1266,6 +1274,10 @@
RelativePath=".\include\SimplePad.h" RelativePath=".\include\SimplePad.h"
> >
</File> </File>
<File
RelativePath=".\include\SimplePopup.h"
>
</File>
<File <File
RelativePath=".\include\StoryFlow.h" RelativePath=".\include\StoryFlow.h"
> >