From 7f7320f904062200c08005cf4db2a5e3753bc96d Mon Sep 17 00:00:00 2001 From: "wagic.jeck" Date: Tue, 20 Oct 2009 03:46:18 +0000 Subject: [PATCH] Jeck - Some basic options handling rewrites, main menu update, example alternate theme (for testing). I'm closing issues 44 and 45, as hopefully this resolves them satisfactorily. * The alternate theme is just useful for testing themes, but please comment on the changes to the main theme. * Options reading and initializing separated from UI. * Options UI abstracted a bit, made more easily extensible. * With some extension, the options UI could be used as the basis for more complicated themes, if we load a file and use it to do stuff like GameStateOptions::Start() --- projects/mtg/bin/Res/graphics/menutitle.png | Bin 43710 -> 25046 bytes projects/mtg/bin/Res/graphics/movingW.png | Bin 7328 -> 0 bytes projects/mtg/bin/Res/graphics/preview.png | Bin 0 -> 27105 bytes .../mtg/bin/Res/themes/Inverted/menuicons.png | Bin 0 -> 29784 bytes .../mtg/bin/Res/themes/Inverted/menutitle.png | Bin 0 -> 24648 bytes .../mtg/bin/Res/themes/Inverted/particle1.psi | Bin 0 -> 128 bytes .../mtg/bin/Res/themes/Inverted/particle2.psi | Bin 0 -> 128 bytes .../mtg/bin/Res/themes/Inverted/particle3.psi | Bin 0 -> 128 bytes .../mtg/bin/Res/themes/Inverted/particle4.psi | Bin 0 -> 128 bytes .../mtg/bin/Res/themes/Inverted/particle5.psi | Bin 0 -> 128 bytes .../mtg/bin/Res/themes/Inverted/preview.png | Bin 0 -> 26415 bytes projects/mtg/include/GameOptions.h | 158 +- projects/mtg/include/GameStateMenu.h | 2 - projects/mtg/include/GameStateOptions.h | 14 +- projects/mtg/include/OptionItem.h | 517 ++++--- projects/mtg/include/WResourceManager.h | 11 +- projects/mtg/src/GameApp.cpp | 1 - projects/mtg/src/GameOptions.cpp | 382 +++-- projects/mtg/src/GameStateMenu.cpp | 75 +- projects/mtg/src/GameStateOptions.cpp | 140 +- projects/mtg/src/MenuItem.cpp | 17 +- projects/mtg/src/OptionItem.cpp | 1274 ++++++++++------- projects/mtg/src/SimpleMenu.cpp | 6 +- projects/mtg/src/SimplePad.cpp | 18 +- projects/mtg/src/WCachedResource.cpp | 4 +- 25 files changed, 1482 insertions(+), 1137 deletions(-) delete mode 100644 projects/mtg/bin/Res/graphics/movingW.png create mode 100644 projects/mtg/bin/Res/graphics/preview.png create mode 100644 projects/mtg/bin/Res/themes/Inverted/menuicons.png create mode 100644 projects/mtg/bin/Res/themes/Inverted/menutitle.png create mode 100644 projects/mtg/bin/Res/themes/Inverted/particle1.psi create mode 100644 projects/mtg/bin/Res/themes/Inverted/particle2.psi create mode 100644 projects/mtg/bin/Res/themes/Inverted/particle3.psi create mode 100644 projects/mtg/bin/Res/themes/Inverted/particle4.psi create mode 100644 projects/mtg/bin/Res/themes/Inverted/particle5.psi create mode 100644 projects/mtg/bin/Res/themes/Inverted/preview.png diff --git a/projects/mtg/bin/Res/graphics/menutitle.png b/projects/mtg/bin/Res/graphics/menutitle.png index 2237f625017cf92394d36f9e808460588de2dcd6..dccfc9eecf335664dbc34660a0b077c560cfda0b 100644 GIT binary patch literal 25046 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

qLYak!q-P1qWRfGex6Cx~h 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 AyVNpO1m5}-@9wC%tNW~wWt!-_|;rG;Em@i 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 literal 43710 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 literal 0 HcmV?d00001 diff --git a/projects/mtg/bin/Res/themes/Inverted/menuicons.png b/projects/mtg/bin/Res/themes/Inverted/menuicons.png new file mode 100644 index 0000000000000000000000000000000000000000..4300ec316da1e80d9f03efffd3aadee9c2ed6b0f GIT binary patch literal 29784 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 literal 0 HcmV?d00001 diff --git a/projects/mtg/bin/Res/themes/Inverted/menutitle.png b/projects/mtg/bin/Res/themes/Inverted/menutitle.png new file mode 100644 index 0000000000000000000000000000000000000000..06740554fcc694edc51d13575920d8b2f1385184 GIT binary patch literal 24648 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%0Aqo&?T^HJ&am7ASM#& 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 literal 0 HcmV?d00001 diff --git a/projects/mtg/bin/Res/themes/Inverted/particle1.psi b/projects/mtg/bin/Res/themes/Inverted/particle1.psi new file mode 100644 index 0000000000000000000000000000000000000000..67d72d1a8467cabf9727cd7801d857c0958d07c7 GIT binary patch literal 128 zcmZQzU}0!u0D*@6Pb~QCXD!RL2l0N^y|n|;23<<_Kye3$^Pl$@+%`J^5(5Dse;Z7L*v_&q*;W&12GD#s28n^x6v?>T0|4QbA>{x7 literal 0 HcmV?d00001 diff --git a/projects/mtg/bin/Res/themes/Inverted/particle3.psi b/projects/mtg/bin/Res/themes/Inverted/particle3.psi new file mode 100644 index 0000000000000000000000000000000000000000..77b5b991c933e0029280967e993c315c3c673ddb GIT binary patch literal 128 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 O0000 values; }; +class GameOptionEnum: public GameOption { +public: + virtual string menuStr(); + virtual bool write(std::ofstream * file, string name); + virtual bool read(string input); + EnumDefinition * def; +}; + +class OptionVolume: public EnumDefinition{ +public: + enum { MUTE = 0, MAX = 100 }; + static EnumDefinition * getInstance() {return &mDef;}; +private: + OptionVolume(); + static OptionVolume mDef; +}; +class OptionClosedHand: public EnumDefinition { +public: + enum { INVISIBLE = 0, VISIBLE = 1 }; + static EnumDefinition * getInstance() {return &mDef;}; +private: + OptionClosedHand(); + static OptionClosedHand mDef; +}; +class OptionHandDirection: public EnumDefinition { +public: + enum { VERTICAL = 0, HORIZONTAL = 1}; + static EnumDefinition * getInstance() {return &mDef;}; +private: + OptionHandDirection(); + static OptionHandDirection mDef; +}; +class OptionManaDisplay: public EnumDefinition { +public: + enum { DYNAMIC = 0, STATIC = 1, BOTH = 2}; + static EnumDefinition * getInstance() {return &mDef;}; +private: + OptionManaDisplay(); + static OptionManaDisplay mDef; +}; +class OptionDifficulty: public EnumDefinition { +public: + enum { NORMAL = 0, HARD = 1, HARDER = 2, EVIL = 3}; + static EnumDefinition * getInstance() {return &mDef;}; +private: + OptionDifficulty(); + static OptionDifficulty mDef; +}; + class GameOptions { public: string mFilename; int save(); int load(); + GameOption * get(int); GameOption& operator[](int); GameOptions(string filename); ~GameOptions(); private: - bool load_option(int id, string input); //Sends an option to the proper reader. - bool read_default(int id, string input); - bool read_enum(int id, string input, EnumDefinition * def); - - bool save_option(std::ofstream * file, int id, string name, GameOption * opt); //Sends an option to the proper writer. - bool write_default(std::ofstream * file, string name, GameOption * opt); - bool write_enum(std::ofstream * file, string name, GameOption * opt, EnumDefinition * def); - - map values; + vector values; }; class GameSettings{ @@ -210,10 +187,11 @@ public: void checkProfile(); //Confirms that a profile is loaded and contains a collection. void createUsersFirstDeck(int setId); + GameOption * get(int); GameOption& operator[](int); + GameOptions* profileOptions; GameOptions* globalOptions; - GameOptions* themeOptions; static GameOption invalid_option; @@ -224,4 +202,4 @@ private: extern GameSettings options; -#endif +#endif \ No newline at end of file diff --git a/projects/mtg/include/GameStateMenu.h b/projects/mtg/include/GameStateMenu.h index 9e37b06e4..d49a2d54e 100644 --- a/projects/mtg/include/GameStateMenu.h +++ b/projects/mtg/include/GameStateMenu.h @@ -18,10 +18,8 @@ class GameStateMenu: public GameState, public JGuiListener int hasChosenGameType; JQuad * mIcons[10]; JTexture * bgTexture; - JTexture * movingWTexture; JQuad * mBg; JQuad * mSplash; - JQuad * mMovingW; float mCreditsYPos; int currentState; //JMusic * bgMusic; diff --git a/projects/mtg/include/GameStateOptions.h b/projects/mtg/include/GameStateOptions.h index fd137f8cd..455173748 100644 --- a/projects/mtg/include/GameStateOptions.h +++ b/projects/mtg/include/GameStateOptions.h @@ -6,10 +6,9 @@ #define SHOW_OPTIONS 1 #define SHOW_OPTIONS_MENU 2 -#define SHOW_OPTIONS_PROFILE 3 class GameApp; -class OptionsMenu; +class WGuiTabMenu; class SimpleMenu; class SimplePad; @@ -17,13 +16,13 @@ class GameStateOptions: public GameState, public JGuiListener { private: float timer; + bool mReload; public: SimpleMenu * optionsMenu; - SimpleMenu * confirmMenu; - OptionsMenu * optionsTabs; - + WGuiTabMenu * optionsTabs; int mState; + GameStateOptions(GameApp* parent); virtual ~GameStateOptions(); @@ -33,8 +32,9 @@ private: virtual void Render(); void ButtonPressed(int controllerId, int ControlId); + string newProfile; + }; -#endif - +#endif \ No newline at end of file diff --git a/projects/mtg/include/OptionItem.h b/projects/mtg/include/OptionItem.h index e8c244302..57945409f 100644 --- a/projects/mtg/include/OptionItem.h +++ b/projects/mtg/include/OptionItem.h @@ -14,37 +14,337 @@ using std::string; #define MAX_ONSCREEN_OPTIONS 8 #define OPTION_CENTER 4 -#define OPTIONS_SUBMODE_NORMAL 0 -#define OPTIONS_SUBMODE_RELOAD 1 -#define OPTIONS_SUBMODE_PROFILE 2 -#define OPTIONS_SUBMODE_MODE 3 -#define OPTIONS_SUBMODE_THEME 4 - -class OptionItem { +class WGuiColor{ public: - string displayValue; - int id; - int hasFocus; - bool canSelect; - bool bHidden; + enum { + SCROLLBAR, + SCROLLBUTTON, + //Foregrounds only after this + TEXT, + TEXT_HEADER, + TEXT_FAIL, + TEXT_TAB, + TEXT_BODY, + //Backgrounds only after this + BACK, + BACK_HEADER, + BACK_FAIL, + BACK_TAB, + }; +}; + +//Complete item interface +class WGuiBase{ +public: + WGuiBase() {}; + virtual ~WGuiBase() {}; + + virtual bool Selectable() {return true;}; + virtual bool isModal() {return false;}; + virtual bool Visible() {return true;}; + + virtual bool Changed() {return false;}; + virtual void confirmChange(bool confirmed) {}; + virtual PIXEL_TYPE getColor(int type)=0; + + virtual void Entering(u32 key)=0; + virtual bool Leaving(u32 key)=0; + + virtual void Update(float dt)=0; + virtual void updateValue(){}; + virtual void Render()=0; + virtual void setData()=0; + virtual void ButtonPressed(int controllerId, int controlId){}; + virtual void Reload(){}; + virtual void Overlay(){}; + + virtual bool hasFocus()=0; + virtual void setFocus(bool bFocus)=0; + virtual float getX()=0; + virtual float getY()=0; + virtual float getWidth()=0; + virtual float getHeight()=0; + virtual int getId() {return INVALID_ID;}; + virtual string getDisplay(){return "";}; + + virtual void setModal(bool val){}; + virtual void setDisplay(string s){}; + virtual void setX(float _x){}; + virtual void setY(float _y){}; + virtual void setWidth(float _w){}; + virtual void setHeight(float _h){}; + virtual void setId(int _id){}; + virtual void setHidden(bool bHidden) {}; + virtual void setVisible(bool bVisisble) {}; +}; + +//This is our base class for concrete items. +class WGuiItem: public WGuiBase{ +public: + virtual void Entering(u32 key); + virtual bool Leaving(u32 key); + virtual void Update(float dt); + virtual void Render(); + + WGuiItem(string _display); + virtual ~WGuiItem() {}; + + + virtual PIXEL_TYPE getColor(int type); + virtual void setData(){}; + + virtual bool hasFocus() {return mFocus;}; + virtual void setFocus(bool bFocus) {mFocus = bFocus;}; + + virtual string getDisplay(){return displayValue;}; + virtual void setDisplay(string s){displayValue=s;}; + + virtual int getId() {return INVALID_ID;}; + virtual float getX() {return x;}; + virtual float getY() {return y;}; + virtual float getWidth() {return width;}; + virtual float getHeight() {return height;}; + virtual void setId(int _id){}; + virtual void setX(float _x){x = _x;}; + virtual void setY(float _y){y = _y;}; + virtual void setWidth(float _w){width = _w;}; + virtual void setHeight(float _h){height = _h;}; + +protected: + bool mFocus; float x, y; float width, height; - virtual ostream& toString(ostream& out)const; + string displayValue; +}; +class OptionItem: public WGuiItem{ +public: OptionItem( int _id, string _displayValue); virtual ~OptionItem() {}; - virtual bool Selectable() {return (canSelect && !bHidden);}; - virtual void Entering(); - virtual bool Leaving(); + //Accessors + virtual int getId() {return id;}; + virtual void setId(int _id){id = _id;}; + +protected: + int id; +}; + +//This is our base class for decorators. It wraps everything about WGuiBase. +class WGuiDeco: public WGuiBase{ +public: + WGuiDeco(WGuiBase* _it) {it = _it;}; + virtual ~WGuiDeco() {SAFE_DELETE(it);}; + + virtual bool Selectable() {return it->Selectable();}; + virtual bool Visible() {return it->Visible();}; + virtual bool Changed() {return it->Changed();}; + virtual void confirmChange(bool confirmed) {it->confirmChange(confirmed);}; + + virtual void Entering(u32 key) {it->Entering(key);}; + virtual bool Leaving(u32 key) {return it->Leaving(key);}; + virtual void Update(float dt) {it->Update(dt);}; + virtual void updateValue() {it->updateValue();}; + virtual void Reload() {it->Reload();}; + virtual void Overlay() {it->Overlay();}; + virtual void Render() {it->Render();}; + virtual void setData() {it->setData();}; + + virtual void ButtonPressed(int controllerId, int controlId) {it->ButtonPressed(controllerId, controlId);}; + + virtual bool hasFocus() {return it->hasFocus();}; + virtual string getDisplay() {return it->getDisplay();}; + virtual int getId() {return it->getId();}; + virtual float getX() {return it->getX();}; + virtual float getY() {return it->getY();}; + virtual float getWidth() {return it->getWidth();}; + virtual float getHeight() {return it->getHeight();}; + virtual PIXEL_TYPE getColor(int type) {return it->getColor(type);}; + + virtual void setFocus(bool bFocus) {it->setFocus(bFocus);}; + virtual void setDisplay(string s) {it->setDisplay(s);}; + virtual void setId(int _id) {it->setId(_id);}; + virtual void setX(float _x) {it->setX(_x);}; + virtual void setY(float _y) {it->setY(_y);}; + virtual void setWidth(float _w) {it->setWidth(_w);}; + virtual void setHeight(float _h) {it->setHeight(_h);}; + virtual void setHidden(bool bHidden) {it->setHidden(bHidden);}; + virtual void setVisible(bool bVisisble) {it->setVisible(bVisisble);}; +protected: + WGuiBase * it; +}; + +class WGuiSplit: public WGuiItem{ +public: + WGuiSplit(WGuiBase* _left,WGuiBase* _right); + ~WGuiSplit(); + + virtual void Reload(); + virtual void Overlay(); + virtual void setData(); + virtual bool isModal(); + virtual void setModal(bool val); + virtual void Render(); virtual void Update(float dt); - virtual void updateValue()=0; - virtual void Reload(){}; - virtual void Render()=0; - virtual void setData()=0; - virtual int Submode() {return OPTIONS_SUBMODE_NORMAL;}; - virtual void cancelSubmode() {}; - virtual void acceptSubmode() {}; + virtual void setX(float _x); + virtual void setY(float _y); + virtual void setWidth(float _w); + virtual void setHeight(float _h); + virtual float getHeight(); + virtual void ButtonPressed(int controllerId, int controlId); + virtual void confirmChange(bool confirmed); + + virtual void Entering(u32 key); + virtual bool Leaving(u32 key); + + bool bRight; + float percentRight; + WGuiBase* right; + WGuiBase* left; +}; + +class WDecoConfirm: public WGuiDeco{ +public: + WDecoConfirm(JGuiListener * _listener, WGuiBase * it); + ~WDecoConfirm(); + + virtual bool isModal(); + virtual void setData(); + virtual void setModal(bool val); + virtual void Entering(u32 key); + virtual bool Leaving(u32 key); + virtual void Update(float dt); + virtual void Overlay(); + virtual void ButtonPressed(int controllerId, int controlId); + + string confirm; + string cancel; +protected: + enum { + OP_UNCONFIRMED, + OP_CONFIRMING, + OP_CONFIRMED, + } mState; + SimpleMenu * confirmMenu; + JGuiListener * listener; + bool bModal; +}; + +class WDecoEnum : public WGuiDeco { + public: + WDecoEnum(WGuiBase * _it,EnumDefinition *_edef = NULL); + virtual void Render(); + string lookupVal(int value); + protected: + EnumDefinition * edef; +}; + +class WGuiButton: public WGuiDeco{ +public: + WGuiButton( WGuiBase* _it, int _controller, int _control, JGuiListener * jgl); + virtual void updateValue(); + virtual void Update(float dt); + virtual bool Selectable() {return Visible();}; + virtual PIXEL_TYPE getColor(int type); +protected: + int control, controller; + JGuiListener * mListener; +}; + + +class WGuiImage: public WGuiItem{ +public: + WGuiImage(string _file, int _w, int _h, int _margin); + virtual bool Selectable() {return false;}; + virtual JQuad * getImage(); + virtual void Render(); + virtual float getHeight(); + +protected: + bool exact; + int margin; + int imgW, imgH; + string filename; +}; + +class WGuiText:public WGuiItem { + public: + WGuiText(string _displayValue): WGuiItem(_displayValue) {}; + virtual bool Selectable() {return false;}; + virtual void Render(); +}; + +class WGuiHeader:public WGuiItem{ + public: + WGuiHeader(string _displayValue): WGuiItem(_displayValue) {}; + + virtual bool Selectable() {return false;}; + virtual void Render(); +}; + + +class WGuiList: public WGuiItem{ + public: + WGuiList(string name); + ~WGuiList(); + + string failMsg; + int nbitems; + int current; + + virtual bool hasFocus() {return mFocus;}; + virtual void setFocus(bool bFocus) {mFocus = bFocus;}; + virtual bool Leaving(u32 key); + virtual void Entering(u32 key); + virtual void Render(); + virtual void renderBack(WGuiBase * it); + virtual void Reload(); + virtual void ButtonPressed(int controllerId, int controlId); + virtual void Update(float dt); + virtual void setData(); + virtual bool isModal(); + virtual void setModal(bool val); + + void Add(WGuiBase * item); + WGuiBase * Current(); + void nextOption(); + void prevOption(); + + WGuiBase * operator[](int); +protected: + bool mFocus; + WGuiBase * listItems[MAX_OPTION_ITEMS]; +}; + +class WGuiMenu{ +public: + + virtual ~WGuiMenu(); + WGuiMenu(u32 next, u32 prev); + + virtual void Render(); + virtual void Reload(); + virtual void Update(float dt); + virtual void ButtonPressed(int controllerId, int controlId); + virtual void Add(WGuiBase* item); + + WGuiBase * Current(); + void nextItem(); + void prevItem(); + void setData(); + +protected: + u32 buttonNext, buttonPrev; + vector items; + int currentItem; +}; + +class WGuiTabMenu: public WGuiMenu { + public: + WGuiTabMenu() : WGuiMenu(PSP_CTRL_RTRIGGER,PSP_CTRL_LTRIGGER) {}; + virtual void Render(); + virtual void Add(WGuiBase * it); + void save(); }; class OptionInteger:public OptionItem{ @@ -57,10 +357,10 @@ class OptionInteger:public OptionItem{ OptionInteger(int _id, string _displayValue, int _maxValue = 1, int _increment = 1, int _defV = 0, string _sDef = ""); virtual void Reload() {if(id != INVALID_OPTION) value = options[id].number;}; + virtual bool Changed() {return value != options[id].number;}; virtual void Render(); virtual void setData(); virtual void updateValue(){value+=increment; if (value>maxValue) value=0;}; - virtual ostream& toString(ostream& out) const; }; class OptionString:public OptionItem{ @@ -71,36 +371,11 @@ class OptionString:public OptionItem{ virtual void Render(); virtual void setData(); virtual void updateValue(); + virtual bool Changed() {return value != options[id].str;}; virtual void Reload() {if(id != INVALID_OPTION) value = options[id].str;}; - virtual ostream& toString(ostream& out) const; bool bShowValue; }; -class OptionNewProfile:public OptionString{ - public: - OptionNewProfile(string _displayValue) : OptionString(INVALID_OPTION, _displayValue) {bShowValue=false;}; - virtual void updateValue(); - virtual void Update(float dt); - virtual int Submode(); - bool bChanged; -}; - -class OptionHeader:public OptionItem{ - public: - OptionHeader(string _displayValue): OptionItem(INVALID_OPTION, _displayValue) { canSelect=false;}; - virtual void Render(); - virtual void setData() {}; - virtual void updateValue() {}; -}; - -class OptionText:public OptionItem{ - public: - OptionText(string _displayValue): OptionItem(INVALID_OPTION, _displayValue) { canSelect=false;}; - virtual void Render(); - virtual void setData() {}; - virtual void updateValue() {}; -}; - class OptionSelect:public OptionItem{ public: size_t value; @@ -110,13 +385,16 @@ class OptionSelect:public OptionItem{ OptionSelect(int _id, string _displayValue): OptionItem(_id, _displayValue) {value = 0;}; virtual void Reload(){initSelections();}; virtual void Render(); + virtual bool Selectable(); + virtual void Entering(u32 key); + virtual bool Changed() {return (value != prior_value);}; virtual void setData(); virtual void initSelections(); virtual void updateValue(){value++; if (value > selections.size() - 1) value=0;}; - virtual ostream& toString(ostream& out) const; + protected: + size_t prior_value; }; - class OptionDirectory:public OptionSelect{ public: virtual void Reload(); @@ -128,138 +406,31 @@ private: class OptionTheme:public OptionDirectory{ public: OptionTheme(); -}; - -class OptionVolume: public OptionInteger{ - public: - OptionVolume(int _id, string _displayName, bool _bMusic = false); - virtual void updateValue(); -private: - bool bMusic; + JQuad * getImage(); + virtual float getHeight(); + virtual void Render(); + virtual void confirmChange(bool confirmed); + virtual bool Visible(); }; class OptionProfile:public OptionDirectory{ public: - OptionProfile(GameApp * _app); - ~OptionProfile(); + OptionProfile(GameApp * _app, JGuiListener * jgl); virtual void addSelection(string s); - virtual bool Leaving(); - virtual void Entering(); + virtual bool Selectable() {return canSelect;}; + virtual bool Changed() {return (initialValue != value);}; + virtual void Entering(u32 key); + virtual void Reload(); virtual void Render(); + virtual void confirmChange(bool confirmed); virtual void Update(float dt); virtual void updateValue(); - virtual int Submode(); - virtual void cancelSubmode(); - virtual void acceptSubmode(); void populate(); private: - bool bCheck; - JQuad * mAvatar; - JTexture * mAvatarTex; GameApp * app; + JGuiListener * listener; + bool canSelect; string preview; size_t initialValue; }; - -class OptionsList{ - public: - string sectionName; - string failMsg; - int nbitems; - int current; - OptionsList(string name); - ~OptionsList(); - bool Leaving(); - void Entering(); - void Render(); - void reloadValues(); - void Update(float dt); - void Add(OptionItem * item); - void save(); - int Submode(); - void acceptSubmode(); - void cancelSubmode(); - - OptionItem * operator[](int); -private: - OptionItem * listItems[MAX_OPTION_ITEMS]; -}; - -class OptionsMenu -{ - public: - JLBFont * mFont; - OptionsList * tabs[MAX_OPTION_TABS]; - int nbitems; - int current; - - OptionsMenu(); - ~OptionsMenu(); - - bool isTab(string name); - int Submode(); - void acceptSubmode(); - void cancelSubmode(); - void Render(); - void reloadValues(); - void Update(float dt); - void Add(OptionsList * tab); - void save(); - -}; - -class OptionEnum : public OptionItem { - protected: - unsigned index; - public: - OptionEnum(int id, string displayValue); - virtual void Reload(); - virtual void Render(); - virtual void setData(); - virtual void updateValue(); - //ourDefined is a virtual wrapper for getDefinition() - virtual EnumDefinition * ourDefined() const {return getDefinition();}; - - static EnumDefinition * getDefinition(); - virtual ostream& toString(ostream& out) const; -}; - -class OptionClosedHand : public OptionEnum { - public: - friend class GameSettings; - enum { INVISIBLE = 0, VISIBLE = 1 }; - OptionClosedHand(int id, string displayValue); - - static EnumDefinition * getDefinition(); - EnumDefinition * ourDefined() const { return getDefinition();}; - -private: - static EnumDefinition * definition; -}; -class OptionHandDirection : public OptionEnum { - public: - friend class GameSettings; - enum { VERTICAL = 0, HORIZONTAL = 1}; - OptionHandDirection(int id, string displayValue); - - static EnumDefinition * getDefinition(); - EnumDefinition * ourDefined() const { return getDefinition();}; - -private: - static EnumDefinition * definition; -}; - -class OptionManaDisplay : public OptionEnum { - public: - friend class GameSettings; - enum { DYNAMIC = 0, STATIC = 1, BOTH = 2}; - OptionManaDisplay(int id, string displayValue); - - static EnumDefinition * getDefinition(); - EnumDefinition * ourDefined() const { return getDefinition();}; - -private: - static EnumDefinition * definition; -}; - -#endif +#endif \ No newline at end of file diff --git a/projects/mtg/include/WResourceManager.h b/projects/mtg/include/WResourceManager.h index 580266aa6..0b4e034a1 100644 --- a/projects/mtg/include/WResourceManager.h +++ b/projects/mtg/include/WResourceManager.h @@ -44,15 +44,16 @@ enum ENUM_RETRIEVE_STYLE{ }; enum ENUM_CACHE_SUBTYPE{ - CACHE_NORMAL = (1<<0), //Use default values. Not really a flag. + CACHE_NORMAL = (1<<0), //Use default values. Not really a flag. CACHE_EXISTING = (1<<1), //Retrieve it only if it already exists //Because these bits only modify how a cached resource's Attempt() is called, //We can use them over and over for each resource type. - TEXTURE_SUB_CARD = (1<<2), //Retrieve using cardFile, not graphicsFile. - TEXTURE_SUB_AVATAR = (1<<5), //Retrieve using avatarFile, not graphicsFile. - TEXTURE_SUB_THUMB = (1<<3),//Retrieve prepending "thumbnails\" to the filename. - TEXTURE_SUB_5551 = (1<<4), //For textures. If we have to allocate, use RGBA5551. + TEXTURE_SUB_EXACT = (1<<2), //Don't do any fiddling with the filename. + TEXTURE_SUB_CARD = (1<<3), //Retrieve using cardFile, not graphicsFile. + TEXTURE_SUB_AVATAR = (1<<4), //Retrieve using avatarFile, not graphicsFile. + TEXTURE_SUB_THUMB = (1<<5),//Retrieve prepending "thumbnails\" to the filename. + TEXTURE_SUB_5551 = (1<<6), //For textures. If we have to allocate, use RGBA5551. }; diff --git a/projects/mtg/src/GameApp.cpp b/projects/mtg/src/GameApp.cpp index 1cf56eba2..ee6655a78 100644 --- a/projects/mtg/src/GameApp.cpp +++ b/projects/mtg/src/GameApp.cpp @@ -36,7 +36,6 @@ GameApp::GameApp(): JApp() nbUpdates = 0; totalFPS = 0; #endif - mScreenShotCount = 0; for (int i=0; i < MAX_STATE ; i++) diff --git a/projects/mtg/src/GameOptions.cpp b/projects/mtg/src/GameOptions.cpp index 825b28d4c..2bd97533b 100644 --- a/projects/mtg/src/GameOptions.cpp +++ b/projects/mtg/src/GameOptions.cpp @@ -10,6 +10,12 @@ #include const char * Options::optionNames[] = { +//Global options + "Profile", + "prx_handler", + "prx_rimom", + "prx_eviltwin", + "prx_rnddeck", //Options set on a per-profile basis "Theme", "Mode", @@ -40,42 +46,6 @@ const char * Options::optionNames[] = { "interruptEndTurn", "interruptCleanup", "interruptAfterEnd", -//Global options - "_gProfile", - "_gprx_handler", - "_gprx_rimom", - "_gprx_eviltwin", - "_gprx_rnddeck", -//Theme metrics - "_tLoadingTC", - "_tStatsTC", - "_tScrollerTC", - "_tScrollerFC", - "_tMainMenuTC", - "_tPopupMenuFC", - "_tPopupMenuTC", - "_tPopupMenuTCH", - "_tMsgFailTC", - "_tOptionItemFC", - "_tOptionItemTC", - "_tOptionItemTCH", - "_tOptionHeaderFC", - "_tOptionHeaderTC", - "_tOptionScrollbarFC", - "_tOptionScrollbarFCH", - "_tOptionHeaderFC", - "_tOptionHeaderFCH", - "_tOptionTabTC", - "_tOptionHeaderTCH", - "_tOptionTextTC", - "_tOptionTextFC", - "_tKeyTC", - "_tKeyTCH", - "_tKeyFC", - "_tKeyFCH", - "_tKeypadFC", - "_tKeypadFCH", - "_tKeypadTC" }; int Options::getID(string name){ if(!name.size()) @@ -184,39 +154,6 @@ int Options::optionInterrupt(int gamePhase){ return INVALID_OPTION; } -//Theme metrics -/* -const string Metrics::LOADING_TC = "_tLoadingTC"; -const string Metrics::STATS_TC = "_tStatsTC"; -const string Metrics::SCROLLER_TC = "_tScrollerTC"; -const string Metrics::SCROLLER_FC = "_tScrollerFC"; -const string Metrics::MAINMENU_TC = "_tMainMenuTC"; -const string Metrics::POPUP_MENU_FC = "_tPopupMenuFC"; -const string Metrics::POPUP_MENU_TC = "_tPopupMenuTC"; -const string Metrics::POPUP_MENU_TCH = "_tPopupMenuTCH"; -const string Metrics::MSG_FAIL_TC = "_tMsgFailTC"; -const string Metrics::OPTION_ITEM_FC = "_tOptionItemFC"; -const string Metrics::OPTION_ITEM_TC = "_tOptionItemTC"; -const string Metrics::OPTION_ITEM_TCH = "_tOptionItemTCH"; -const string Metrics::OPTION_HEADER_FC = "_tOptionHeaderFC"; -const string Metrics::OPTION_HEADER_TC = "_tOptionHeaderTC"; -const string Metrics::OPTION_SCROLLBAR_FC = "_tOptionScrollbarFC"; -const string Metrics::OPTION_SCROLLBAR_FCH = "_tOptionScrollbarFCH"; -const string Metrics::OPTION_TAB_FC = "_tOptionHeaderFC"; -const string Metrics::OPTION_TAB_FCH = "_tOptionHeaderFCH"; -const string Metrics::OPTION_TAB_TC = "_tOptionTabTC"; -const string Metrics::OPTION_TAB_TCH = "_tOptionHeaderTCH"; -const string Metrics::OPTION_TEXT_TC = "_tOptionTextTC"; -const string Metrics::OPTION_TEXT_FC = "_tOptionTextFC"; -const string Metrics::KEY_TC = "_tKeyTC"; -const string Metrics::KEY_TCH = "_tKeyTCH"; -const string Metrics::KEY_FC = "_tKeyFC"; -const string Metrics::KEY_FCH = "_tKeyFCH"; -const string Metrics::KEYPAD_FC = "_tKeypadFC"; -const string Metrics::KEYPAD_FCH = "_tKeypadFCH"; -const string Metrics::KEYPAD_TC = "_tKeypadTC"; */ - - GameOption::GameOption(int value) : number(value){} GameOption::GameOption(string value) : number(0), str(value) {} GameOption::GameOption(int num, string str) : number(num), str(str) {} @@ -267,16 +204,10 @@ PIXEL_TYPE GameOption::asColor(PIXEL_TYPE fallback) return ARGB(color[3],color[0],color[1],color[2]); } -GameOptions::GameOptions(string filename){ - mFilename = filename; - load(); -} - -bool GameOptions::read_default(int id, string input){ +bool GameOption::read(string input){ bool bNumeric = true; if(!input.size()){ - values[id] = GameOption(0); return true; //Default reader doesn't care about invalid formatting. } @@ -289,41 +220,47 @@ bool GameOptions::read_default(int id, string input){ } if(bNumeric) - values[id] = GameOption(atoi(input.c_str())); + number = atoi(input.c_str()); else - values[id] = GameOption(input); - + str = input; return true; } -bool GameOptions::read_enum(int id, string input, EnumDefinition * def){ - if(!def) +string GameOption::menuStr(){ + if(number){ + char buf[12]; + sprintf(buf,"%d",number); + } + + if(str.size()) + return str; + + return "0"; +} +bool GameOption::write(std::ofstream * file, string name){ + char writer[1024]; + + if(!file) return false; - std::transform(input.begin(),input.end(),input.begin(),::tolower); + if(str ==""){ + if(number == 0) //This is absolutely default. No need to write it. + return true; - vector::iterator it; - for(it=def->values.begin();it != def->values.end();it++){ - if(it->second == input){ - values[id] = GameOption(it->first); - return true; - } - } + //It's a number! + sprintf(writer,"%s=%d\n", name.c_str(), number); + } + else + sprintf(writer,"%s=%s\n", name.c_str(), str.c_str()); - return false; + (*file)<str ==""){ - if(opt->number == 0) //This is absolutely default. No need to write it. - return true; - - //It's a number! - sprintf(writer,"%s=%d\n", name.c_str(), opt->number); - } - else - sprintf(writer,"%s=%s\n", name.c_str(), opt->str.c_str()); - - (*file)<number < 0 || opt->number >= (int) def->values.size()) - return false; - - char writer[1024]; - sprintf(writer,"%s=%s\n", name.c_str(), def->values[opt->number].second.c_str()); - - (*file)<::iterator it; - for ( it=values.begin() ; it != values.end(); it++ ){ + for ( int x=0; x < (int) values.size(); x++ ){ //Check that this is a valid option. - string name = Options::getName(it->first); - if(!name.size()) + string name = Options::getName(x); + GameOption * opt = get(x); + if(!name.size() || !opt) continue; //Save it. - save_option(&file, it->first, name, &it->second); + opt->write(&file, name); } file.close(); @@ -421,11 +304,58 @@ int GameOptions::save(){ return 1; } -GameOption& GameOptions::operator[](int optionID) { +GameOption& GameOptions::operator[](int optionID){ + GameOption * go = get(optionID); + if(!go) + return GameSettings::invalid_option; + + return *go; +} + +GameOption * GameOptions::get(int optionID) { + GameOption * go = NULL; + GameOptionEnum * goEnum = NULL; + + //Invalid options! + if(optionID < 0) + return NULL; + + //Option doesn't exist, so build it + int x = (int) values.size(); + values.reserve(optionID); + + while(x <= optionID){ + switch(optionID){ + case Options::HANDDIRECTION: + goEnum = NEW GameOptionEnum(); + goEnum->def = OptionHandDirection::getInstance(); + go = goEnum; + break; + case Options::CLOSEDHAND: + goEnum = NEW GameOptionEnum(); + goEnum->def = OptionClosedHand::getInstance(); + go = goEnum; + break; + case Options::MANADISPLAY: + goEnum = NEW GameOptionEnum(); + goEnum->def = OptionManaDisplay::getInstance(); + go = goEnum; + break; + default: + go = NEW GameOption(); + break; + } + values.push_back(go); + x++; + } + return values[optionID]; } GameOptions::~GameOptions(){ + for(vector::iterator it=values.begin();it!=values.end();it++) + SAFE_DELETE(*it); + values.clear(); } GameSettings options; @@ -435,7 +365,6 @@ GameSettings::GameSettings() globalOptions = NULL; theGame = NULL; profileOptions = NULL; - themeOptions = NULL; //reloadProfile should be before using options. } @@ -443,41 +372,30 @@ GameSettings::~GameSettings(){ //Destructor no longer saves, to prevent conflicts when MtgSets::SetsList == NULL SAFE_DELETE(globalOptions); SAFE_DELETE(profileOptions); - SAFE_DELETE(themeOptions); SAFE_DELETE(keypad); - SAFE_DELETE(OptionHandDirection::definition); - SAFE_DELETE(OptionClosedHand::definition); - SAFE_DELETE(OptionManaDisplay::definition); } GameOption GameSettings::invalid_option = GameOption(0); GameOption& GameSettings::operator[](int optionID){ + GameOption * go = get(optionID); + if(!go) + return invalid_option; + + return *go; +} + +GameOption* GameSettings::get(int optionID){ string option_name = Options::getName(optionID); - //Last chance sanity checking. - if(!option_name.size()){ - OutputDebugString("Error: Accessing invalid option.\n"); - invalid_option.number = 0; - invalid_option.str = ""; - return invalid_option; - } + if(optionID < 0) + return &invalid_option; + else if(globalOptions && optionID <= Options::LAST_GLOBAL) + return globalOptions->get(optionID); + else if(profileOptions) + return profileOptions->get(optionID); - if(option_name.size() > 2){ - if(option_name[0] == '_' && option_name[1] == 't'){ - if(themeOptions) - return (*themeOptions)[optionID]; - } - else if(option_name[0] == '_' && option_name[1] == 'g'){ - if(globalOptions) - return (*globalOptions)[optionID]; - } - } - - if(profileOptions) - return (*profileOptions)[optionID]; - - return invalid_option; + return &invalid_option; } @@ -543,31 +461,18 @@ string GameSettings::profileFile(string filename, string fallback,bool sanity, b void GameSettings::reloadProfile(bool images){ SAFE_DELETE(profileOptions); - SAFE_DELETE(themeOptions); checkProfile(); if(images) resources.Refresh(); //Update images } void GameSettings::checkProfile(){ - char buf[512]; - if(!globalOptions) globalOptions = NEW GameOptions(GLOBAL_SETTINGS); //If it doesn't exist, load current profile. if(!profileOptions) profileOptions = NEW GameOptions(profileFile(PLAYER_SETTINGS,"",false)); - - //Load theme options - if(!themeOptions){ - if(!profileOptions || (*profileOptions)[Options::ACTIVE_THEME].isDefault()) - sprintf(buf,RESPATH"/graphics/metrics.txt"); - else - sprintf(buf,RESPATH"/themes/%s/metrics.txt",(*profileOptions)[Options::ACTIVE_THEME].str.c_str()); - - themeOptions = NEW GameOptions(buf); - } //Validation of collection, etc, only happens if the game is up. if(theGame == NULL || theGame->collection == NULL) @@ -694,5 +599,74 @@ int EnumDefinition::findIndex(int value){ return it - values.begin(); } - return 0; //Default! + return INVALID_ID; //Failed! } + +string GameOptionEnum::menuStr(){ + if(def){ + int idx = def->findIndex(number); + if(idx != INVALID_ID) + return def->values[idx].second; + } + + char buf[32]; + sprintf(buf,"%d",number); + return buf; +} + +bool GameOptionEnum::write(std::ofstream * file, string name){ + if(!file || !def || number < 0 || number >= (int) def->values.size()) + return false; + + char writer[1024]; + sprintf(writer,"%s=%s\n", name.c_str(), menuStr().c_str()); + + (*file)<::iterator it; + for(it=def->values.begin();it != def->values.end();it++){ + if(it->second == input){ + number = it->first; + return true; + } + } + + return false; +} +OptionClosedHand OptionClosedHand::mDef; +OptionClosedHand::OptionClosedHand(){ + mDef.values.push_back(EnumDefinition::assoc(INVISIBLE, "invisible")); + mDef.values.push_back(EnumDefinition::assoc(VISIBLE, "visible")); +}; + +OptionHandDirection OptionHandDirection::mDef; +OptionHandDirection::OptionHandDirection(){ + mDef.values.push_back(EnumDefinition::assoc(VERTICAL, "vertical")); + mDef.values.push_back(EnumDefinition::assoc(HORIZONTAL, "horizontal")); +}; +OptionManaDisplay OptionManaDisplay::mDef; +OptionManaDisplay::OptionManaDisplay(){ + mDef.values.push_back(EnumDefinition::assoc(STATIC, "Simple")); + mDef.values.push_back(EnumDefinition::assoc(DYNAMIC, "Eye candy")); + mDef.values.push_back(EnumDefinition::assoc(BOTH, "Both")); +}; +OptionVolume OptionVolume::mDef; +OptionVolume::OptionVolume(){ + mDef.values.push_back(EnumDefinition::assoc(MUTE, "Mute")); + mDef.values.push_back(EnumDefinition::assoc(MAX, "Max")); +}; +OptionDifficulty OptionDifficulty::mDef; +OptionDifficulty::OptionDifficulty(){ + mDef.values.push_back(EnumDefinition::assoc(NORMAL, "Normal")); + mDef.values.push_back(EnumDefinition::assoc(HARDER, "Harder")); + mDef.values.push_back(EnumDefinition::assoc(HARD, "Hard")); + mDef.values.push_back(EnumDefinition::assoc(EVIL, "Evil")); +}; \ No newline at end of file diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp index e63c57b6b..9f9f5ea9e 100644 --- a/projects/mtg/src/GameStateMenu.cpp +++ b/projects/mtg/src/GameStateMenu.cpp @@ -66,7 +66,6 @@ GameStateMenu::GameStateMenu(GameApp* parent): GameState(parent) gameTypeMenu = NULL; mSplash = NULL; mBg = NULL; - mMovingW = NULL; //bgMusic = NULL; timeIndex = 0; angleMultiplier = MIN_ANGLE_MULTIPLIER; @@ -81,6 +80,7 @@ GameStateMenu::~GameStateMenu() {} void GameStateMenu::Create() { mDip = NULL; + mGuiController = NULL; mReadConf = 0; mCurrentSetName[0] = 0; @@ -97,18 +97,6 @@ void GameStateMenu::Create() } } - JLBFont * mFont = resources.GetJLBFont(Constants::MENU_FONT); - mFont->SetColor(options[Metrics::LOADING_TC].asColor()); - mGuiController = NEW JGuiController(100, this); - if (mGuiController) - { - mGuiController->Add(NEW MenuItem(MENUITEM_PLAY, mFont, "Play", 80, 50 + SCREEN_HEIGHT/2, mIcons[8], mIcons[9],"graphics/particle1.psi",resources.GetQuad("particles"), true)); - mGuiController->Add(NEW MenuItem(MENUITEM_DECKEDITOR, mFont, "Deck Editor", 160, 50 + SCREEN_HEIGHT/2, mIcons[2], mIcons[3],"graphics/particle2.psi",resources.GetQuad("particles"))); - mGuiController->Add(NEW MenuItem(MENUITEM_SHOP, mFont, "Shop", 240, 50 + SCREEN_HEIGHT/2, mIcons[0], mIcons[1],"graphics/particle3.psi",resources.GetQuad("particles"))); - mGuiController->Add(NEW MenuItem(MENUITEM_OPTIONS, mFont, "Options", 320, 50 + SCREEN_HEIGHT/2, mIcons[6], mIcons[7],"graphics/particle4.psi",resources.GetQuad("particles"))); - mGuiController->Add(NEW MenuItem(MENUITEM_EXIT, mFont, "Exit", 400, 50 + SCREEN_HEIGHT/2, mIcons[4], mIcons[5],"graphics/particle5.psi",resources.GetQuad("particles"))); - } - currentState = MENU_STATE_MAJOR_LOADING_CARDS | MENU_STATE_MINOR_NONE; scroller = NEW TextScroller(resources.GetJLBFont(Constants::MAIN_FONT), SCREEN_WIDTH/2 - 90 , SCREEN_HEIGHT-17,180); scrollerSet = 0; @@ -122,13 +110,25 @@ void GameStateMenu::Destroy() SAFE_DELETE(subMenuController); SAFE_DELETE(gameTypeMenu); resources.Release(bgTexture); - resources.Release(movingWTexture); SAFE_DELETE(scroller); } void GameStateMenu::Start(){ JRenderer::GetInstance()->EnableVSync(true); subMenuController = NULL; + SAFE_DELETE(mGuiController); + mGuiController = NEW JGuiController(100, this); + if (mGuiController) + { + JLBFont * mFont = resources.GetJLBFont(Constants::MENU_FONT); + mFont->SetColor(ARGB(255,255,255,255)); + mGuiController->Add(NEW MenuItem(MENUITEM_PLAY, mFont, "Play", 80, 50 + SCREEN_HEIGHT/2, mIcons[8], mIcons[9],"particle1.psi",resources.GetQuad("particles"), true)); + mGuiController->Add(NEW MenuItem(MENUITEM_DECKEDITOR, mFont, "Deck Editor", 160, 50 + SCREEN_HEIGHT/2, mIcons[2], mIcons[3],"particle2.psi",resources.GetQuad("particles"))); + mGuiController->Add(NEW MenuItem(MENUITEM_SHOP, mFont, "Shop", 240, 50 + SCREEN_HEIGHT/2, mIcons[0], mIcons[1],"particle3.psi",resources.GetQuad("particles"))); + mGuiController->Add(NEW MenuItem(MENUITEM_OPTIONS, mFont, "Options", 320, 50 + SCREEN_HEIGHT/2, mIcons[6], mIcons[7],"particle4.psi",resources.GetQuad("particles"))); + mGuiController->Add(NEW MenuItem(MENUITEM_EXIT, mFont, "Exit", 400, 50 + SCREEN_HEIGHT/2, mIcons[4], mIcons[5],"particle5.psi",resources.GetQuad("particles"))); + } + if (GameApp::HasMusic && !GameApp::music && options[Options::MUSICVOLUME].number > 0){ GameApp::music = resources.ssLoadMusic("Track0.mp3"); @@ -145,13 +145,9 @@ void GameStateMenu::Start(){ if (options[Options::RANDOMDECK_MODE_UNLOCKED].number) hasChosenGameType = 0; bgTexture = resources.RetrieveTexture("menutitle.png", RETRIEVE_LOCK); - movingWTexture = resources.RetrieveTexture("movingW.png", RETRIEVE_LOCK); mBg = resources.RetrieveQuad("menutitle.png", 0, 0, 256, 166); // Create background quad for rendering. - mMovingW = resources.RetrieveQuad("movingW.png", 2, 2, 84, 62); - - mBg->SetHotSpot(105,50); - mMovingW->SetHotSpot(72,16); + mBg->SetHotSpot(128,50); //How many cards total ? PlayerData * playerdata = NEW PlayerData(mParent->collection); @@ -274,18 +270,14 @@ void GameStateMenu::End() JRenderer::GetInstance()->EnableVSync(false); resources.Release(bgTexture); - resources.Release(movingWTexture); - - resources.Release(mBg); - resources.Release(mMovingW); + SAFE_DELETE(mGuiController); } void GameStateMenu::Update(float dt) { - timeIndex += dt * 2; switch (MENU_STATE_MAJOR & currentState) { @@ -376,6 +368,13 @@ void GameStateMenu::Update(float dt) case MENU_STATE_MINOR_NONE : ;// Nothing to do. } + + if(mEngine->GetButtonState(PSP_CTRL_LTRIGGER)) { + //Reset deck of cards + angleMultiplier = MIN_ANGLE_MULTIPLIER; + yW = 55; + } + if (yW <= 55) { if (mEngine->GetButtonState(PSP_CTRL_SQUARE)) angleMultiplier += STEP_ANGLE_MULTIPLIER; @@ -386,7 +385,7 @@ void GameStateMenu::Update(float dt) if (mEngine->GetButtonState(PSP_CTRL_TRIANGLE) && (dt != 0)) { angleMultiplier = (cos(timeIndex)*angleMultiplier - M_PI/3 - 0.1 - angleW) / dt; - yW = yW + 5*dt + (yW - 55) *5* dt; + yW = yW + 5*dt + (yW - 45) *5* dt; } else angleW = cos(timeIndex)*angleMultiplier - M_PI/3 - 0.1; @@ -422,29 +421,29 @@ void GameStateMenu::Render() }else{ mFont = resources.GetJLBFont(Constants::MAIN_FONT); PIXEL_TYPE colors[] = - { - ARGB(255, 3, 2, 0), - ARGB(255, 8, 3, 0), - ARGB(255,21,12, 0), - ARGB(255,50,34, 0) - }; + { + + ARGB(255,3,3,0), + ARGB(255,8,8,0), + ARGB(255,21,21,10), + ARGB(255,50,50,30), + }; + renderer->FillRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT,colors); - renderer->FillRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT,colors); - renderer->RenderQuad(mBg, SCREEN_WIDTH/2, 50); - if (yW < 2*SCREEN_HEIGHT) renderer->RenderQuad(mMovingW, SCREEN_WIDTH/2 - 10, yW, angleW); if (mGuiController!=NULL) mGuiController->Render(); mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); - mFont->SetColor(options[Metrics::STATS_TC].asColor(ARGB(128,255,255,255))); + mFont->SetColor(ARGB(128,255,255,255)); mFont->DrawString(GAME_VERSION, SCREEN_WIDTH-10,5,JGETEXT_RIGHT); mFont->DrawString(nbcardsStr,10, 5); mFont->SetScale(1.f); - mFont->SetColor(options[Metrics::SCROLLER_TC].asColor()); + mFont->SetColor(ARGB(255,255,255,255)); - renderer->FillRoundRect(SCREEN_WIDTH/2 - 100,SCREEN_HEIGHT-20, 191,6,5,options[Metrics::SCROLLER_FC].asColor(ARGB(100,10,5,0))); + renderer->FillRoundRect(SCREEN_WIDTH/2 - 100,SCREEN_HEIGHT-20, 191,6,5,ARGB(100,10,5,0)); scroller->Render(); + renderer->RenderQuad(mBg, SCREEN_WIDTH/2, 50); if (subMenuController){ subMenuController->Render(); } @@ -569,9 +568,7 @@ ostream& GameStateMenu::toString(ostream& out) const << " ; hasChosenGameType : " << hasChosenGameType << " ; mIcons : " << mIcons << " ; bgTexture : " << bgTexture - << " ; movingWTexture : " << movingWTexture << " ; mBg : " << mBg - << " ; mMovingW : " << mMovingW << " ; mCreditsYPos : " << mCreditsYPos << " ; currentState : " << currentState << " ; mVolume : " << mVolume diff --git a/projects/mtg/src/GameStateOptions.cpp b/projects/mtg/src/GameStateOptions.cpp index e714580e5..41425d064 100644 --- a/projects/mtg/src/GameStateOptions.cpp +++ b/projects/mtg/src/GameStateOptions.cpp @@ -10,7 +10,7 @@ GameStateOptions::GameStateOptions(GameApp* parent): GameState(parent) { optionsTabs = NULL; optionsMenu = NULL; - confirmMenu = NULL; + mReload = false; } @@ -20,57 +20,61 @@ GameStateOptions::~GameStateOptions() { void GameStateOptions::Start() { + newProfile = ""; timer = 0; mState = SHOW_OPTIONS; JRenderer::GetInstance()->EnableVSync(true); - OptionsList * optionsList; + WGuiList * optionsList; - optionsList = NEW OptionsList("Settings"); + optionsList = NEW WGuiList("Settings"); - optionsList->Add(NEW OptionHeader("General Options")); - if (GameApp::HasMusic) optionsList->Add(NEW OptionVolume(Options::MUSICVOLUME, "Music volume", true)); - optionsList->Add(NEW OptionVolume(Options::SFXVOLUME, "SFX volume")); + optionsList->Add(NEW WGuiHeader("General Options")); + if (GameApp::HasMusic) + optionsList->Add(NEW WDecoEnum(NEW OptionInteger(Options::MUSICVOLUME,"Music volume",100,10,100),OptionVolume::getInstance())); + optionsList->Add(NEW WDecoEnum(NEW OptionInteger(Options::SFXVOLUME,"SFX volume",100,10,100),OptionVolume::getInstance())); optionsList->Add(NEW OptionInteger(Options::OSD, "Display InGame extra information")); if (options[Options::DIFFICULTY_MODE_UNLOCKED].number) - optionsList->Add(NEW OptionInteger(Options::DIFFICULTY, "Difficulty", 3, 1)); + optionsList->Add(NEW WDecoEnum(NEW OptionInteger(Options::DIFFICULTY,"Difficulty",3,1,0),OptionDifficulty::getInstance())); optionsList->Add(NEW OptionInteger(Options::INTERRUPT_SECONDS, "Seconds to pause for an Interrupt", 20, 1)); optionsList->Add(NEW OptionInteger(Options::INTERRUPTMYSPELLS, "Interrupt my spells")); optionsList->Add(NEW OptionInteger(Options::INTERRUPTMYABILITIES, "Interrupt my abilities")); - optionsTabs = NEW OptionsMenu(); + optionsTabs = NEW WGuiTabMenu(); optionsTabs->Add(optionsList); - optionsList = NEW OptionsList("Game"); - optionsList->Add(NEW OptionClosedHand(Options::CLOSEDHAND, "Closed hand")); - optionsList->Add(NEW OptionHandDirection(Options::HANDDIRECTION, "Hand direction")); - optionsList->Add(NEW OptionManaDisplay(Options::MANADISPLAY, "Mana display")); + optionsList = NEW WGuiList("Game"); + optionsList->Add(NEW WGuiHeader("Interface Options")); + optionsList->Add(NEW WDecoEnum(NEW OptionInteger(Options::CLOSEDHAND,"Closed hand",2,1,0))); + optionsList->Add(NEW WDecoEnum(NEW OptionInteger(Options::CLOSEDHAND,"Hand direction",2,1,0))); + optionsList->Add(NEW WDecoEnum(NEW OptionInteger(Options::MANADISPLAY,"Mana display",3,1,0))); optionsList->Add(NEW OptionInteger(Options::REVERSETRIGGERS, "Reverse left and right triggers")); optionsList->Add(NEW OptionInteger(Options::DISABLECARDS,"Disable card image loading")); optionsTabs->Add(optionsList); - optionsList = NEW OptionsList("Profiles"); - OptionNewProfile * key = NEW OptionNewProfile("New Profile"); - key->bShowValue = false; - optionsList->Add(key); - OptionProfile * pickProf = NEW OptionProfile(mParent); - optionsList->Add(pickProf); - OptionTheme * theme = NEW OptionTheme(); - optionsList->Add(theme); + optionsList = NEW WGuiList("User"); + optionsList->Add(NEW WGuiHeader("User Options")); + + WDecoConfirm * cPrf = NEW WDecoConfirm(this,NEW OptionProfile(mParent,this)); + cPrf->confirm = "Use this Profile"; + OptionDirectory * od = NEW OptionTheme(); + WDecoConfirm * cThm = NEW WDecoConfirm(this,od); + cThm->confirm = "Use this Theme"; + optionsList->Add(NEW WGuiSplit(cPrf,cThm)); + optionsList->Add(NEW WGuiButton(NEW WGuiHeader("New Profile"),-102,4,this)); optionsTabs->Add(optionsList); - optionsList = NEW OptionsList("Credits"); + + optionsList = NEW WGuiList("Credits"); optionsList->failMsg = ""; optionsTabs->Add(optionsList); JLBFont * mFont = resources.GetJLBFont("f3"); - optionsMenu = NEW SimpleMenu(102, this,mFont, 50,170); + optionsMenu = NEW SimpleMenu(-102, this,mFont, 50,170); optionsMenu->Add(1, "Save & Back to Main Menu"); optionsMenu->Add(2, "Back to Main Menu"); optionsMenu->Add(3, "Cancel"); - confirmMenu = NEW SimpleMenu(103, this,mFont, 50,170); - confirmMenu->Add(1, "Use this profile"); - confirmMenu->Add(2, "Cancel"); + optionsTabs->Current()->Entering(0); } @@ -79,7 +83,6 @@ void GameStateOptions::End() JRenderer::GetInstance()->EnableVSync(false); SAFE_DELETE(optionsTabs); SAFE_DELETE(optionsMenu); - SAFE_DELETE(confirmMenu); } @@ -89,30 +92,29 @@ void GameStateOptions::Update(float dt) if(options.keypadActive()){ options.keypadUpdate(dt); - } - else if (mState == SHOW_OPTIONS){ - - switch(optionsTabs->Submode()){ - case OPTIONS_SUBMODE_RELOAD: - optionsTabs->acceptSubmode(); - optionsTabs->reloadValues(); - mState = SHOW_OPTIONS; - break; - case OPTIONS_SUBMODE_PROFILE: - mState = SHOW_OPTIONS_PROFILE; - break; - default: - if (PSP_CTRL_START == mEngine->ReadButton() ) - mState = SHOW_OPTIONS_MENU; - - optionsTabs->Update(dt); - break; - } - }else if(mState == SHOW_OPTIONS_MENU){ - optionsMenu->Update(dt); - }else if(mState == SHOW_OPTIONS_PROFILE){ - confirmMenu->Update(dt); + if(newProfile != ""){ + newProfile = options.keypadFinish(); + if(newProfile != ""){ + options[Options::ACTIVE_PROFILE] = newProfile; + options.reloadProfile(false); + optionsTabs->Reload(); + } + newProfile = ""; + } + } + else switch(mState){ + default: + case SHOW_OPTIONS: + optionsTabs->Update(dt); + + if (mEngine->ReadButton() == PSP_CTRL_START){ + mState = SHOW_OPTIONS_MENU; + } + break; + case SHOW_OPTIONS_MENU: + optionsMenu->Update(dt); + break; } } @@ -161,24 +163,22 @@ void GameStateOptions::Render() optionsTabs->Render(); - switch(mState){ - case SHOW_OPTIONS_MENU: - optionsMenu->Render(); - break; - case SHOW_OPTIONS_PROFILE: - confirmMenu->Render(); - break; + if(mReload){ + optionsTabs->Reload(); + mReload = false; } + if(mState == SHOW_OPTIONS_MENU) + optionsMenu->Render(); + if(options.keypadActive()) options.keypadRender(); } - void GameStateOptions::ButtonPressed(int controllerId, int controlId) { //Exit menu? - if(controllerId == 102) + if(controllerId == -102) switch (controlId){ case 1: optionsTabs->save(); @@ -188,22 +188,14 @@ void GameStateOptions::ButtonPressed(int controllerId, int controlId) case 3: mState = SHOW_OPTIONS; break; - } - //Profile confirmation? - else if(controllerId == 103) - switch (controlId){ - case 1: - //Load the New profile. - optionsTabs->acceptSubmode(); - optionsTabs->reloadValues(); - //Reset the current settings to those of the profile... - mState = SHOW_OPTIONS; + case 4: + options.keypadStart("",&newProfile); + options.keypadTitle("New Profile"); break; - case 2: - optionsTabs->cancelSubmode(); - mState = SHOW_OPTIONS; + case 5: + mReload = true; break; } -}; - - + else + optionsTabs->ButtonPressed(controllerId, controlId); +}; \ No newline at end of file diff --git a/projects/mtg/src/MenuItem.cpp b/projects/mtg/src/MenuItem.cpp index f0b1c4248..e0ffb1a7f 100644 --- a/projects/mtg/src/MenuItem.cpp +++ b/projects/mtg/src/MenuItem.cpp @@ -7,7 +7,7 @@ MenuItem::MenuItem(int id, JLBFont *font, string text, int x, int y, JQuad * _of { mText = _(text); updatedSinceLastRender = 1; - mParticleSys = NEW hgeParticleSystem(particle, particleTex); + mParticleSys = NEW hgeParticleSystem(resources.RetrievePSI(particle, particleTex)); mParticleSys->MoveTo(mX, mY); mHasFocus = hasFocus; @@ -27,14 +27,27 @@ void MenuItem::Render() { JRenderer * renderer = JRenderer::GetInstance(); + if (mHasFocus) { + PIXEL_TYPE start = ARGB(46,255,255,200); + if(mParticleSys) + start = mParticleSys->info.colColorStart.GetHWColor(); + + PIXEL_TYPE colors[] = + { + ARGB(0,0,0,0), + start, + ARGB(0,0,0,0), + start, + }; + renderer->FillRect(255,0,SCREEN_WIDTH-155,SCREEN_HEIGHT,colors); // set additive blending renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE); mParticleSys->Render(); // set normal blending renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); - mFont->SetColor(options[Metrics::MAINMENU_TC].asColor()); + mFont->SetColor(ARGB(255,255,255,255)); onQuad->SetColor(ARGB(70,255,255,255)); renderer->RenderQuad(onQuad, SCREEN_WIDTH , SCREEN_HEIGHT/2 , 0,8,8); onQuad->SetColor(ARGB(255,255,255,255)); diff --git a/projects/mtg/src/OptionItem.cpp b/projects/mtg/src/OptionItem.cpp index fd916f6bc..8b26ad25c 100644 --- a/projects/mtg/src/OptionItem.cpp +++ b/projects/mtg/src/OptionItem.cpp @@ -7,52 +7,92 @@ #include #include -//Option Item +//WGuiItem +void WGuiItem::Entering(u32 key){ + mFocus = true; +} -void OptionItem::Update(float dt){ +bool WGuiItem::Leaving(u32 key){ + mFocus = false; + return true; +} + +PIXEL_TYPE WGuiItem::getColor(int type){ + switch(type){ + case WGuiColor::TEXT_BODY: + case WGuiColor::SCROLLBUTTON: + return ARGB(255,255,255,255); + case WGuiColor::SCROLLBAR: + return ARGB(150,50,50,50); + case WGuiColor::BACK_HEADER: + return ARGB(150,80,80,80); + default: + if(type < WGuiColor::BACK){ + if(hasFocus()) + return ARGB(255,255,255,0); + else + return ARGB(255,255,255,255); + } + else + return ARGB(150,50,50,50); + } + return ARGB(150,50,50,50); +} + +void WGuiItem::Render(){ + JLBFont * mFont = resources.GetJLBFont(Constants::OPTION_FONT); + mFont->SetColor(getColor(WGuiColor::TEXT)); + JRenderer * renderer = JRenderer::GetInstance(); + float fH = (height-mFont->GetHeight())/2; + mFont->DrawString(displayValue.c_str(),x+(width/2),y+fH,JGETEXT_CENTER); +} + +WGuiItem::WGuiItem(string _display){ + displayValue = _display; + mFocus = false; + width=SCREEN_WIDTH; + height=20; +} + +void WGuiItem::Update(float dt){ JGE * mEngine = JGE::GetInstance(); - if (hasFocus){ + if (mFocus){ if (mEngine->GetButtonClick(PSP_CTRL_CIRCLE)) updateValue(); } } -void OptionItem::Entering(){ - hasFocus = true; +//WGuiHeader +void WGuiHeader::Render(){ + JLBFont * mFont = resources.GetJLBFont(Constants::OPTION_FONT); + mFont->SetColor(getColor(WGuiColor::TEXT)); + + JRenderer * renderer = JRenderer::GetInstance(); + mFont->DrawString(displayValue.c_str(),x+width/2,y,JGETEXT_CENTER); } -bool OptionItem::Leaving(){ - hasFocus = false; - return true; +//WGuiText +void WGuiText::Render(){ + JLBFont * mFont = resources.GetJLBFont(Constants::OPTION_FONT); + mFont->SetScale(.8); + mFont->SetColor(getColor(WGuiColor::TEXT_BODY)); + + JRenderer * renderer = JRenderer::GetInstance(); + mFont->DrawString(displayValue.c_str(),x,y,JGETEXT_LEFT); + mFont->SetScale(1); } -ostream& OptionItem::toString(ostream& out) const{ -return out << "OptionItem ::: displayValue : " << displayValue - << " ; id : " << id - << " ; hasFocus : " << hasFocus - << " ; x,y : " << x << "," << y; -} - -OptionItem::OptionItem( int _id, string _displayValue) { +//OptionItem +OptionItem::OptionItem( int _id, string _displayValue): WGuiItem(_displayValue) { id = _id; - displayValue = _(_displayValue); - canSelect=true; - hasFocus=false; - bHidden=false; - width = SCREEN_WIDTH; - height = 20; + mFocus=false; } -//Option Integer - +//OptionInteger void OptionInteger::Render(){ JLBFont * mFont = resources.GetJLBFont(Constants::OPTION_FONT); - if (hasFocus){ - mFont->SetColor(options[Metrics::OPTION_ITEM_TCH].asColor(ARGB(255,255,255,0))); - }else{ - mFont->SetColor(options[Metrics::OPTION_ITEM_TC].asColor()); - } + mFont->SetColor(getColor(WGuiColor::TEXT)); JRenderer * renderer = JRenderer::GetInstance(); - renderer->FillRoundRect(x-5,y-2,width-x-5,height,2,options[Metrics::OPTION_ITEM_FC].asColor(ARGB(150,50,50,50))); + mFont->DrawString(displayValue.c_str(),x,y); char buf[512]; if (maxValue == 1){ @@ -76,7 +116,6 @@ OptionInteger::OptionInteger(int _id, string _displayValue, int _maxValue, int _ maxValue = _maxValue; increment = _increment; value = ::options[id].number; - hasFocus = false; x = 0; y = 0; } @@ -86,105 +125,58 @@ void OptionInteger::setData(){ options[id] = GameOption(value); } - -ostream& OptionInteger::toString(ostream& out) const{ - return out << "OptionItem ::: displayValue : " << displayValue - << " ; id : " << id - << " ; value : " << value - << " ; hasFocus : " << hasFocus - << " ; maxValue : " << maxValue - << " ; increment : " << increment - << " ; x,y : " << x << "," << y; -} - //Option Select - void OptionSelect::initSelections(){ //Find currently active bit in the list. - for(size_t i=0;iSetColor(options[Metrics::OPTION_ITEM_TCH].asColor(ARGB(255,255,255,0))); - }else{ - mFont->SetColor(options[Metrics::OPTION_ITEM_TC].asColor()); - } + mFont->SetColor(getColor(WGuiColor::TEXT)); JRenderer * renderer = JRenderer::GetInstance(); - renderer->FillRoundRect(x-5,y-2,width-x-5,height,2,options[Metrics::OPTION_ITEM_FC].asColor(ARGB(150,50,50,50))); mFont->DrawString(displayValue.c_str(),x,y); if (value < selections.size()) - mFont->DrawString(selections[value].c_str(),width-10,y,JGETEXT_RIGHT); + mFont->DrawString(selections[value].c_str(),x+width-10,y,JGETEXT_RIGHT); else - mFont->DrawString("Unset",width-10,y,JGETEXT_RIGHT); + mFont->DrawString("Unset",x+width-10,y,JGETEXT_RIGHT); } -void OptionSelect::setData() -{ +void OptionSelect::setData(){ if(id == INVALID_OPTION) return; if (value < selections.size()) options[id] = GameOption(selections[value]); } +bool OptionSelect::Selectable(){ + return (selections.size() > 1); +} -void OptionSelect::addSelection(string s) -{ +void OptionSelect::addSelection(string s){ selections.push_back(s); } - -ostream& OptionSelect::toString(ostream& out) const -{ - return out << "OptionItem ::: displayValue : " << displayValue - << " ; id : " << id - << " ; value : " << value - << " ; hasFocus : " << hasFocus - << " ; x,y : " << x << "," << y; -} - -//OptionHeader - -void OptionHeader::Render(){ - JLBFont * mFont = resources.GetJLBFont(Constants::OPTION_FONT); - mFont->SetColor(options[Metrics::OPTION_HEADER_TC].asColor()); - - JRenderer * renderer = JRenderer::GetInstance(); - renderer->FillRoundRect(x-5,y-2,width-x-5,height,2,options[Metrics::OPTION_HEADER_FC].asColor(ARGB(150,80,80,80))); - mFont->DrawString(displayValue.c_str(),width/2,y,JGETEXT_CENTER); -} - -void OptionText::Render(){ - JLBFont * mFont = resources.GetJLBFont(Constants::OPTION_FONT); - mFont->SetScale(.8); - mFont->SetColor(options[Metrics::OPTION_TEXT_TC].asColor()); - - JRenderer * renderer = JRenderer::GetInstance(); - renderer->FillRoundRect(x-5,y-2,width-x-5,height,2,options[Metrics::OPTION_TEXT_FC].asColor(ARGB(150,80,80,80))); - mFont->DrawString(displayValue.c_str(),x,y,JGETEXT_LEFT); - mFont->SetScale(1); -} - //OptionProfile - -OptionProfile::~OptionProfile(){ - SAFE_DELETE(mAvatarTex); - SAFE_DELETE(mAvatar); -} - -int OptionProfile::Submode(){ - if(value != initialValue && bCheck){ - bCheck=false; //Just about to check it! - return OPTIONS_SUBMODE_PROFILE; - } - return OPTIONS_SUBMODE_NORMAL; -} +OptionProfile::OptionProfile(GameApp * _app, JGuiListener * jgl): OptionDirectory(RESPATH"/profiles",Options::ACTIVE_PROFILE, "Profile"){ + app = _app; + listener = jgl; + height=60; + addSelection("Default"); + sort(selections.begin(),selections.end()); + mFocus = false; + populate(); + initSelections(); +}; void OptionProfile::addSelection(string s){ OptionDirectory::addSelection(s); @@ -194,21 +186,8 @@ void OptionProfile::addSelection(string s){ canSelect = true; else canSelect = false; + } - -OptionProfile::OptionProfile(GameApp * _app): OptionDirectory(RESPATH"/profiles",Options::ACTIVE_PROFILE, "Profile"){ - app = _app; - height=100; - addSelection("Default"); - sort(selections.begin(),selections.end()); - initSelections(); - mAvatarTex=NULL; - mAvatar=NULL; - hasFocus=false; - populate(); - bCheck=false; -}; - void OptionProfile::updateValue(){ value++; if (value > selections.size() - 1) @@ -217,6 +196,10 @@ void OptionProfile::updateValue(){ populate(); } +void OptionProfile::Reload(){ + OptionDirectory::Reload(); + populate(); +} void OptionProfile::populate(){ string temp = options[Options::ACTIVE_PROFILE].str; if (value >= selections.size()){ //TODO fail gracefully. @@ -224,23 +207,13 @@ void OptionProfile::populate(){ } options[Options::ACTIVE_PROFILE].str = selections[value]; - - SAFE_DELETE(mAvatar); - SAFE_DELETE(mAvatarTex); - mAvatarTex = JRenderer::GetInstance()->LoadTexture(options.profileFile("avatar.jpg","",true,true).c_str(), false); - if (mAvatarTex){ - mAvatar = NEW JQuad(mAvatarTex, 0, 0, 35, 50); - } - PlayerData * pdata = NEW PlayerData(app->collection); - options[Options::ACTIVE_PROFILE] = temp; char buf[512]; sprintf(buf,"Credits: %i\nCards: %i",pdata->credits,pdata->collection->totalCards()); preview = buf; - SAFE_DELETE(pdata); } @@ -250,79 +223,61 @@ void OptionProfile::Render(){ mFont->SetScale(1); int spacing = 2+(int)mFont->GetHeight(); - //Draw faux option. Not highlighted if we've only one. - if (hasFocus && selections.size() > 1){ - mFont->SetColor(options[Metrics::OPTION_ITEM_TCH].asColor(ARGB(255,255,255,0))); - renderer->FillRoundRect(x-5,y-2,width-x-5,20,2,options[Metrics::OPTION_HEADER_FC].asColor(ARGB(150,80,80,80))); - mFont->DrawString("Change Profile",SCREEN_WIDTH/2,y,JGETEXT_CENTER); - }else{ - mFont->SetColor(options[Metrics::OPTION_ITEM_TC].asColor()); - renderer->FillRoundRect(x-5,y-2,width-x-5,20,2,options[Metrics::OPTION_HEADER_FC].asColor(ARGB(150,80,80,80))); - mFont->DrawString("Profile",SCREEN_WIDTH/2,y,JGETEXT_CENTER); - } - - - //Draw preview box. - renderer->FillRoundRect(x-5,y-2+25,width-x-5,height-25,2,options[Metrics::OPTION_ITEM_FC].asColor(ARGB(150,50,50,50))); - int pX, pY; pX = x; - pY = y+30; + pY = y; + char buf[512]; + if(selections[value] == "Default") + sprintf(buf,"player/avatar.jpg"); + else + sprintf(buf,"profiles/%s/avatar.jpg",selections[value].c_str()); + + JQuad * mAvatar = resources.RetrieveQuad(buf,0,0,0,0,"temporary",RETRIEVE_NORMAL,TEXTURE_SUB_EXACT); + if(mAvatar){ renderer->RenderQuad(mAvatar,x,pY); pX += 40; } - mFont->SetColor(options[Metrics::OPTION_TEXT_TC].asColor()); + mFont->SetColor(getColor(WGuiColor::TEXT_HEADER)); mFont->DrawString(selections[value].c_str(),pX,pY,JGETEXT_LEFT); mFont->SetScale(.8); + mFont->SetColor(getColor(WGuiColor::TEXT_BODY)); mFont->DrawString(preview.c_str(),pX,pY+spacing,JGETEXT_LEFT); mFont->SetScale(1); + } void OptionProfile::Update(float dt){ JGE * mEngine = JGE::GetInstance(); - if (hasFocus){ - if (mEngine->GetButtonClick(PSP_CTRL_CIRCLE)) updateValue(); + + if (mFocus && mEngine->GetButtonClick(PSP_CTRL_CIRCLE)){ + updateValue(); + mEngine->ReadButton(); } } - -void OptionProfile::Entering(){ - hasFocus = true; - bCheck = false; +void OptionProfile::Entering(u32 key){ + mFocus = true; initialValue = value; } -bool OptionProfile::Leaving(){ - //Choice must be confirmed. - if(value != initialValue){ - bCheck = true; - return false; - } - hasFocus = false; - return true; -} - -void OptionProfile::cancelSubmode() -{ +void OptionProfile::confirmChange(bool confirmed){ if (initialValue >= selections.size()) - return; + return; - options[Options::ACTIVE_PROFILE] = selections[initialValue]; - value = initialValue; - options.reloadProfile(false); - populate(); - bCheck = false; -} -void OptionProfile::acceptSubmode() -{ - if (value >= selections.size()) - return; + int result; - options[Options::ACTIVE_PROFILE] = selections[value]; - initialValue = value; - options.reloadProfile(); - populate(); - bCheck = false; + if(confirmed) + result = value; + else result = initialValue; + + options[Options::ACTIVE_PROFILE] = selections[result]; + value = result; + + options.reloadProfile(false); + populate(); + if(listener && confirmed) + listener->ButtonPressed(-102,5); + return; } //OptionDirectory @@ -380,51 +335,90 @@ OptionDirectory::OptionDirectory(string _root, int _id, string _displayValue): O initSelections(); } -OptionsList::OptionsList(string name){ - sectionName = name; +//WGuiList +WGuiList::WGuiList(string name): WGuiItem(name){ failMsg = "NO OPTIONS AVAILABLE"; nbitems = 0; current = -1; + width = SCREEN_WIDTH-10; + y = 0; + x = 0; + mFocus = false; } -OptionsList::~OptionsList(){ +WGuiList::~WGuiList(){ for (int i = 0 ; i < nbitems; i++){ SAFE_DELETE(listItems[i]); } } - -void OptionsList::Add(OptionItem * item){ +void WGuiList::setModal(bool val){ + listItems[current]->setModal(val); +} +bool WGuiList::isModal(){ + if(current >= 0 && current < nbitems) + if(listItems[current]->isModal()) + return true; + return false; +} +void WGuiList::Add(WGuiBase * item){ if (nbitems < MAX_OPTION_ITEMS){ listItems[nbitems] = item; nbitems++; } } -bool OptionsList::Leaving(){ - if(current >= 0 && current < nbitems) - return listItems[current]->Leaving(); +bool WGuiList::Leaving(u32 key){ + if(key == PSP_CTRL_DOWN && current < nbitems-1) + return false; + else if(key == PSP_CTRL_UP && current > 0) + return false; + if(current >= 0 && current < nbitems) + if(!listItems[current]->Leaving(key)) + return false; + + mFocus = false; return true; } -void OptionsList::Entering(){ +void WGuiList::Entering(u32 key){ + mFocus = true; + //Try to force a selectable option. if(current == -1){ for (int i = 0 ; i < nbitems; i++){ if(listItems[i]->Selectable()) { current = i; - listItems[current]->Entering(); break; } } } if(current >= 0 && current < nbitems) - listItems[current]->Entering(); + listItems[current]->Entering(key); + return; } -void OptionsList::Render(){ +void WGuiList::renderBack(WGuiBase * it){ + if(!it) + return; + WGuiHeader * header = dynamic_cast(it); + JRenderer * renderer = JRenderer::GetInstance(); + if(header) + renderer->FillRoundRect(it->getX()-5,it->getY()-2,it->getWidth()-5,it->getHeight(),2,it->getColor(WGuiColor::BACK_HEADER)); + else{ + WGuiSplit * split = dynamic_cast(it); + if(split && split->left->Visible() && split->right->Visible()){ + if(split->left) + renderer->FillRoundRect(split->left->getX()-5,split->getY()-2,split->left->getWidth()-5,split->getHeight(),2,split->left->getColor(WGuiColor::BACK)); + if(split->right) + renderer->FillRoundRect(split->right->getX()-5,split->getY()-2,split->right->getWidth()-5,split->getHeight(),2,split->right->getColor(WGuiColor::BACK)); + } + else + renderer->FillRoundRect(it->getX()-5,it->getY()-2,it->getWidth()-5,it->getHeight(),2,it->getColor(WGuiColor::BACK)); + + } +} +void WGuiList::Render(){ JRenderer * renderer = JRenderer::GetInstance(); - - int width = SCREEN_WIDTH; int listHeight=40; int listSelectable=0; int adjustedCurrent=0; @@ -434,8 +428,8 @@ void OptionsList::Render(){ //List is empty. if (!nbitems && failMsg != ""){ JLBFont * mFont = resources.GetJLBFont(Constants::OPTION_FONT); - mFont->SetColor(options[Metrics::MSG_FAIL_TC].asColor(ARGB(255,155,155,155))); - mFont->DrawString(failMsg.c_str(),SCREEN_WIDTH/2, 40, JGETEXT_RIGHT); + mFont->SetColor(getColor(WGuiColor::TEXT_FAIL)); + mFont->DrawString(failMsg.c_str(),x+width/2, y, JGETEXT_RIGHT); return; } @@ -444,14 +438,15 @@ void OptionsList::Render(){ for (int i = 0 ; i < nbitems; i++){ if(listItems[i]->Selectable()) { current = i; - listItems[current]->Entering(); + if(hasFocus()) + listItems[current]->Entering(0); break; } } } //Find out how large our list is. for (int pos=0;pos < nbitems; pos++){ - listHeight+=listItems[pos]->height+5; + listHeight+=listItems[pos]->getHeight()+5; if(listItems[pos]->Selectable()){ listSelectable++; if(pos < current) adjustedCurrent++; @@ -460,46 +455,50 @@ void OptionsList::Render(){ //Always fill screen if(listHeight > SCREEN_HEIGHT) - { - width -= 10; + { for (start=current;start > 0; start--){ - if(listItems[start]->bHidden) + if(!listItems[start]->Visible()) continue; - vHeight += listItems[start]->height+5; + vHeight += listItems[start]->getHeight()+5; if(vHeight >= (SCREEN_HEIGHT-60)/2) break; } vHeight = 0; for (nowPos=nbitems;nowPos > 1; nowPos--){ - if(listItems[start]->bHidden) + if(!listItems[start]->Visible()) continue; - vHeight += listItems[nowPos-1]->height+5; + vHeight += listItems[nowPos-1]->getHeight()+5; } if(vHeight <= SCREEN_HEIGHT-40 && nowPos < start) start = nowPos; - } vHeight = 0; - nowPos = 40; + nowPos = 0; //Render items. if(start >= 0) { for (int pos=0;pos < nbitems; pos++){ - if(listItems[pos]->bHidden) + if(!listItems[pos]->Visible()) continue; if(pos < start){ - vHeight += listItems[pos]->height + 5; + vHeight += listItems[pos]->getHeight() + 5; continue; } - listItems[pos]->x = 10; - listItems[pos]->y = nowPos; - listItems[pos]->width = width; - nowPos += listItems[pos]->height + 5; + + + listItems[pos]->setY(y+nowPos); + listItems[pos]->setX(x); + if(listHeight > SCREEN_HEIGHT && listSelectable > 1) + listItems[pos]->setWidth(width-10); + else + listItems[pos]->setWidth(width); + nowPos += listItems[pos]->getHeight() + 5; + renderBack(listItems[pos]); listItems[pos]->Render(); if(nowPos > SCREEN_HEIGHT) break; @@ -510,225 +509,111 @@ void OptionsList::Render(){ int barPosition = 35+((float)adjustedCurrent/listSelectable)*(SCREEN_HEIGHT-40); int barLength = (SCREEN_HEIGHT-40) / listSelectable; if(barLength < 4) barLength = 4; - width = (SCREEN_WIDTH-(width-5))/2; //Find center of blank space by options. - renderer->FillRect(SCREEN_WIDTH-width-1,39,2,SCREEN_HEIGHT-42, - options[Metrics::OPTION_SCROLLBAR_FC].asColor(ARGB(150,150,150,150))); - renderer->FillRoundRect(SCREEN_WIDTH-width-4,barPosition,5,barLength,2, - options[Metrics::OPTION_SCROLLBAR_FCH].asColor(ARGB(255,255,255,255))); + renderer->FillRect(x+width-8,39,2,SCREEN_HEIGHT-42, + getColor(WGuiColor::SCROLLBAR)); + renderer->FillRoundRect(x+width-12,barPosition,5,barLength,2, + getColor(WGuiColor::SCROLLBUTTON)); + } + + //Render current overlay. + if(current > 0 && current < nbitems && listItems[current]->Visible()) + listItems[current]->Overlay(); } - } } -void OptionsList::save(){ +void WGuiList::setData(){ for (int i = 0; i < nbitems; i++){ listItems[i]->setData(); } } -void OptionsList::Update(float dt){ - JGE * mEngine = JGE::GetInstance(); - int potential = current; +WGuiBase * WGuiList::Current(){ + if(current >= 0 && current < nbitems) + return listItems[current]; - if (mEngine->GetButtonClick(PSP_CTRL_UP)) - { - if (potential > 0){ - potential--; - while(potential > 0 && listItems[potential]->Selectable() == false) - potential--; - if(potential < 0 || !listItems[potential]->Selectable()) - potential = -1; - else if(listItems[current]->Leaving()){ - current = potential; - listItems[current]->Entering(); - } - } - } - else if (mEngine->GetButtonClick(PSP_CTRL_DOWN)) - { - if (potential < nbitems-1){ + return NULL; +} + +void WGuiList::nextOption(){ + int potential = current; + + if (potential < nbitems-1){ + potential++; + while(potential < nbitems-1 && listItems[potential]->Selectable() == false) potential++; - while(potential < nbitems-1 && listItems[potential]->Selectable() == false) - potential++; - if(potential == nbitems || !listItems[potential]->Selectable()) - potential = -1; - else if(potential != current && listItems[current]->Leaving()){ - current = potential; - listItems[current]->Entering(); - } + if(potential == nbitems || !listItems[potential]->Selectable()) + potential = -1; + else if(potential != current && listItems[current]->Leaving(PSP_CTRL_DOWN)){ + current = potential; + listItems[current]->Entering(PSP_CTRL_DOWN); } } - for (int i = 0 ; i < nbitems; i++){ - listItems[i]->Update(dt); +} +void WGuiList::prevOption(){ + int potential = current; + + if (potential > 0){ + potential--; + while(potential > 0 && listItems[potential]->Selectable() == false) + potential--; + if(potential < 0 || !listItems[potential]->Selectable()) + potential = -1; + else if(listItems[current]->Leaving(PSP_CTRL_UP)){ + current = potential; + listItems[current]->Entering(PSP_CTRL_UP); + } } } - -void OptionsMenu::Add(OptionsList * tab){ - if (nbitems < MAX_OPTION_TABS){ - tabs[nbitems] = tab; - nbitems++; - if (current < 0){ - current = 0; - } - - } -} - -void OptionsMenu::Render(){ - if (nbitems == 0){ - mFont->DrawString("NO OPTIONS AVAILABLE",SCREEN_WIDTH/2, 5, JGETEXT_RIGHT); - return; - } - - JRenderer * renderer = JRenderer::GetInstance(); - - int offset = 0; - for(int i=0;iGetStringWidth(tabs[i]->sectionName.c_str()); - if(i == current){ - mFont->SetColor(options[Metrics::OPTION_TAB_TCH].asColor()); - renderer->FillRoundRect(offset+5,5,w + 5,25,2,options[Metrics::OPTION_TAB_FCH].asColor(ARGB(150,150,150,150))); - } - else{ - mFont->SetColor(options[Metrics::OPTION_TAB_TC].asColor(ARGB(255,155,155,155))); - renderer->FillRoundRect(offset+5,5,w + 5,25,2,options[Metrics::OPTION_TAB_FC].asColor(ARGB(150,50,50,50))); - } - mFont->DrawString(tabs[i]->sectionName.c_str(),offset+10,10); - offset += w + 10 + 2; - } - - if(current > -1 && current < nbitems && tabs[current]) - tabs[current]->Render(); -} - -void OptionsMenu::Update(float dt){ +void WGuiList::Update(float dt){ JGE * mEngine = JGE::GetInstance(); - if(current < 0 || current >= nbitems) + bool kidModal = false; + + if(current >= 0 && current < nbitems) + kidModal = listItems[current]->isModal(); + + if(!kidModal && hasFocus()){ + if (mEngine->GetButtonClick(PSP_CTRL_UP)) + prevOption(); + else if (mEngine->GetButtonClick(PSP_CTRL_DOWN)) + nextOption(); + } + + if(current >= 0 && current < nbitems) + listItems[current]->Update(dt); + + for (int i = 0 ; i < nbitems; i++){ + if(i != current) + listItems[i]->Update(dt); + } +} + +void WGuiList::ButtonPressed(int controllerId, int controlId){ + WGuiBase * it; + + if(!(it = Current())) return; - - //We use the shoulder buttons to switch tabs, if we've got them. - if (mEngine->GetButtonClick(PSP_CTRL_LTRIGGER)) - { - if (current > 0) - { - if(tabs[current]->Leaving()){ - current--; - tabs[current]->Entering(); - } - } - } - else if (mEngine->GetButtonClick(PSP_CTRL_RTRIGGER)) - { - if (current < nbitems -1) - { - if(tabs[current]->Leaving()){ - current++; - tabs[current]->Entering(); - } - } - } - - tabs[current]->Update(dt); + + it->ButtonPressed(controllerId,controlId); } -OptionsMenu::OptionsMenu(){ - nbitems=0; - current=0; - mFont = resources.GetJLBFont(Constants::OPTION_FONT); - for(int x=0;xsave(); - - ::options.save(); -} - -bool OptionsMenu::isTab(string name){ - if(current <0 || current >= nbitems) - return false; - else if(tabs[current]->sectionName == name) - return true; - - return false; -} - -int OptionsMenu::Submode() -{ - if(current <0 || current >= nbitems) - return OPTIONS_SUBMODE_NORMAL; - - return tabs[current]->Submode(); -} - -void OptionsMenu::acceptSubmode() -{ - if(current > -1 && current < nbitems) - tabs[current]->acceptSubmode(); -} -void OptionsMenu::reloadValues() -{ - for(int i=0;ireloadValues(); -} - -void OptionsMenu::cancelSubmode() -{ - if(current > -1 && current < nbitems) - tabs[current]->cancelSubmode(); -} - - -int OptionsList::Submode() -{ - if(current <0 || current >= nbitems) - return OPTIONS_SUBMODE_NORMAL; - - return listItems[current]->Submode(); -} - -void OptionsList::reloadValues() +void WGuiList::Reload() { for(int i=0;iReload(); } } -void OptionsList::acceptSubmode() -{ - if(current > -1 && current < nbitems) - listItems[current]->acceptSubmode(); -} - -void OptionsList::cancelSubmode() -{ - if(current > -1 && current < nbitems) - listItems[current]->cancelSubmode(); -} - //OptionString void OptionString::Render(){ JLBFont * mFont = resources.GetJLBFont(Constants::OPTION_FONT); - if (hasFocus){ - mFont->SetColor(options[Metrics::OPTION_ITEM_TCH].asColor(ARGB(255,255,255,0))); - }else{ - mFont->SetColor(options[Metrics::OPTION_ITEM_TC].asColor()); - } + mFont->SetColor(getColor(WGuiColor::TEXT)); JRenderer * renderer = JRenderer::GetInstance(); - renderer->FillRoundRect(x-5,y-2,width-x-5,height,2,options[Metrics::OPTION_ITEM_FC].asColor(ARGB(150,50,50,50))); if(!bShowValue){ - mFont->DrawString(displayValue.c_str(),(x+width)/2,y,JGETEXT_CENTER); + mFont->DrawString(displayValue.c_str(),x+(width/2),y,JGETEXT_CENTER); } else{ mFont->DrawString(displayValue.c_str(),x,y); @@ -746,37 +631,6 @@ void OptionString::updateValue(){ options.keypadTitle(displayValue); } -void OptionNewProfile::updateValue(){ - options.keypadStart("",&value); - options.keypadTitle(displayValue); -} - -void OptionNewProfile::Update(float dt){ - if(value != ""){ - string temp; - temp = options[Options::ACTIVE_PROFILE].str; - value = options.keypadFinish(); - if(value == "") - return; - - if(temp != value){ - options[Options::ACTIVE_PROFILE] = value; - options.reloadProfile(false); - } - value = ""; - bChanged = true; - } - OptionItem::Update(dt); -} - -int OptionNewProfile::Submode(){ - if(bChanged){ - bChanged=false; //Just about to check it! - return OPTIONS_SUBMODE_RELOAD; - } - return OPTIONS_SUBMODE_NORMAL; -} - OptionString::OptionString(int _id, string _displayValue): OptionItem(_id, _displayValue) { bShowValue=true; @@ -784,141 +638,507 @@ OptionString::OptionString(int _id, string _displayValue): OptionItem(_id, _disp value=options[_id].str; } -ostream& OptionString::toString(ostream& out) const{ -return out << "OptionString ::: displayValue : " << displayValue - << " ; id : " << id - << " ; value : " << value - << " ; hasFocus : " << hasFocus - << " ; x,y : " << x << "," << y; -} - OptionTheme::OptionTheme(): OptionDirectory(RESPATH"/themes",Options::ACTIVE_THEME, "Current Theme"){ addSelection("Default"); sort(selections.begin(),selections.end()); initSelections(); - hasFocus=false; - if(selections.size() == 1) - bHidden = true; + mFocus=false; +} +JQuad * OptionTheme::getImage(){ + char buf[512]; + string val = selections[value]; + if(val == "Default") + sprintf(buf,"graphics/preview.png"); + else + sprintf(buf,"themes/%s/preview.png",val.c_str()); + + return resources.RetrieveQuad(buf,0,0,0,0,"temporary",RETRIEVE_NORMAL,TEXTURE_SUB_EXACT); } -void OptionVolume::updateValue(){ - value+=increment; - if (value>maxValue) - value=0; +float OptionTheme::getHeight(){ + return 130; +}; +void OptionTheme::Render(){ + JRenderer * renderer = JRenderer::GetInstance(); + JQuad * q = getImage(); + JLBFont * mFont = resources.GetJLBFont(Constants::OPTION_FONT); + mFont->SetColor(getColor(WGuiColor::TEXT_HEADER)); + char buf[512]; + sprintf(buf,"Theme: %s",selections[value].c_str()); + + if(q){ + float scale = 128 / q->mHeight; + renderer->RenderQuad(q,x, y,0,scale,scale); + } + + mFont->DrawString(buf,x,y); } -OptionVolume::OptionVolume(int id, string displayName, bool music): OptionInteger(id, displayName, 100, 10, 0, "Muted") { - bMusic = music; +bool OptionTheme::Visible(){ + if(selections.size() <= 1) + return false; + + return true; } -void OptionEnum::setData() +void OptionTheme::confirmChange(bool confirmed){ + if(!confirmed) + value = prior_value; + else{ + setData(); + prior_value = value; + resources.Refresh(); //Update images + Reload(); + } +} +string WDecoEnum::lookupVal(int value){ + + if(edef == NULL){ + int id = getId(); + if(id != INVALID_ID){ + GameOptionEnum * goEnum = dynamic_cast(options.get(getId())); + if(goEnum) + edef = goEnum->def; + } + } + + if(edef){ + int idx = edef->findIndex(value); + if(idx != INVALID_ID) + return edef->values[idx].second; + } + + char buf[32]; + sprintf(buf,"%d",value); + return buf; +} + +void WDecoEnum::Render() { - EnumDefinition * def = ourDefined(); - if(def) - options[id] = GameOption(def->values[index].first); + JLBFont * mFont = resources.GetJLBFont(Constants::OPTION_FONT); + mFont->SetColor(getColor(WGuiColor::TEXT)); + JRenderer * renderer = JRenderer::GetInstance(); + mFont->DrawString(getDisplay().c_str(),getX(),getY()); + OptionInteger* opt = dynamic_cast(it); + if(opt) + mFont->DrawString(lookupVal(opt->value).c_str(), getWidth() -10, getY(), JGETEXT_RIGHT); } -void OptionEnum::updateValue() -{ - EnumDefinition * def = ourDefined(); - if(!def) +WDecoEnum::WDecoEnum(WGuiBase * _it, EnumDefinition *_edef) : WGuiDeco(_it) {edef = _edef;} + +//WDecoConfirm + +WDecoConfirm::WDecoConfirm(JGuiListener * _listener, WGuiBase * _it): WGuiDeco(_it){ + listener = _listener; + confirm = "Confirm"; + cancel = "Cancel"; + confirmMenu = NULL; + bModal = false; + mState = OP_CONFIRMED; +} + +WDecoConfirm::~WDecoConfirm(){ + SAFE_DELETE(confirmMenu); +} + +void WDecoConfirm::Entering(u32 key){ + setFocus(true); + + if(it) + it->Entering(key); + + SAFE_DELETE(confirmMenu); + mState = OP_CONFIRMED; + JLBFont * mFont = resources.GetJLBFont("f3"); + confirmMenu = NEW SimpleMenu(444, listener,mFont, 50,170); + confirmMenu->Add(1,confirm.c_str()); + confirmMenu->Add(2,cancel.c_str()); +} + +bool WDecoConfirm::isModal(){ + if(bModal || (it && it->isModal())) + return true; + + return false; +} + +void WDecoConfirm::setModal(bool val){ + bModal = val; +} +void WDecoConfirm::setData(){ + if(!it) return; - ++index; - if (index >= def->values.size()) index = 0; + it->confirmChange(true); + it->setData(); } -void OptionEnum::Render() -{ - EnumDefinition * def = ourDefined(); +bool WDecoConfirm::Leaving(u32 key){ + if(!it) + return true; - JLBFont * mFont = resources.GetJLBFont(Constants::OPTION_FONT); - if (hasFocus) - mFont->SetColor(options[Metrics::OPTION_ITEM_TCH].asColor(ARGB(255,255,255,0))); - else - mFont->SetColor(options[Metrics::OPTION_ITEM_TC].asColor()); - JRenderer * renderer = JRenderer::GetInstance(); - renderer->FillRoundRect(x-5,y-2,width-x-5,height,2,options[Metrics::OPTION_ITEM_FC].asColor(ARGB(150,50,50,50))); - mFont->DrawString(displayValue.c_str(),x,y); + //Choice must be confirmed. + if(mState == OP_UNCONFIRMED){ + if(!isModal()) + setModal(true); + if(!it->Changed()) + mState = OP_CONFIRMED; + else + mState = OP_CONFIRMING; + } + + if(mState == OP_CONFIRMED && it->Leaving(key)){ + setFocus(false); + setModal(false); + SAFE_DELETE(confirmMenu); + return true; + } - if(def) - mFont->DrawString(def->values[index].second.c_str(), width -10, y, JGETEXT_RIGHT); - else - mFont->DrawString("Default", width -10, y, JGETEXT_RIGHT); + return false; } -OptionEnum::OptionEnum(int id, string displayValue) : OptionItem(id, displayValue){ - Reload(); -} -void OptionEnum::Reload() -{ - EnumDefinition * def = ourDefined(); - if(def != NULL) - index = def->findIndex(options[id].number); +void WDecoConfirm::Update(float dt){ + if (hasFocus()){ + JGE * mEngine = JGE::GetInstance(); + if (mState == OP_CONFIRMED && mEngine->GetButtonClick(PSP_CTRL_CIRCLE)) mState = OP_UNCONFIRMED; + + if (it && mState != OP_CONFIRMING){ + it->Update(dt); + } + else + confirmMenu->Update(dt); + } } -EnumDefinition * OptionEnum::getDefinition(){ +void WDecoConfirm::Overlay(){ + if (confirmMenu && mState == OP_CONFIRMING) + confirmMenu->Render(); + + if(it) + it->Overlay(); +} + +void WDecoConfirm::ButtonPressed(int controllerId, int controlId){ + if(controllerId == 444){ + setModal(false); + switch(controlId){ + case 1: + mState = OP_CONFIRMED; + if(it) + it->confirmChange(true); + break; + case 2: + mState = OP_CONFIRMED; + if(it) + it->confirmChange(false); + break; + } + } + else + it->ButtonPressed(controllerId,controlId); +} + +//WDecoImage +WGuiImage::WGuiImage(string _file, int _w, int _h, int _margin): WGuiItem("") { + imgW = _w; + imgH = _h; + margin = _margin; + filename = _file; + exact = false; +} + +float WGuiImage::getHeight(){ + + if(imgH == 0 ){ + JQuad * q = getImage(); + if(q) + return MAX(height,q->mHeight+(2*margin)); + } + + return MAX(height,imgH+(2*margin)); +} +JQuad * WGuiImage::getImage(){ + if(exact) + return resources.RetrieveQuad(filename,0,0,0,0,"temporary",RETRIEVE_NORMAL,TEXTURE_SUB_EXACT); + else + return resources.RetrieveTempQuad(filename); +} + +void WGuiImage::Render(){ + JRenderer * renderer = JRenderer::GetInstance(); + JQuad * q = getImage(); + if(q){ + renderer->RenderQuad(q,x+margin, y+margin,0,1,1); + } +} + +WGuiButton::WGuiButton( WGuiBase* _it, int _controller, int _control, JGuiListener * jgl): WGuiDeco(_it) { + control = _control; + controller = _controller; + mListener = jgl; +} + +void WGuiButton::updateValue(){ + if(mListener) + mListener->ButtonPressed(controller, control); +} + +void WGuiButton::Update(float dt){ + JGE * mEngine = JGE::GetInstance(); + if (hasFocus()){ + if (mEngine->GetButtonClick(PSP_CTRL_CIRCLE)) updateValue(); + } +} + +PIXEL_TYPE WGuiButton::getColor(int type){ + if(type == WGuiColor::BACK && hasFocus()) + return it->getColor(WGuiColor::BACK_HEADER); + return it->getColor(type); +}; + +WGuiSplit::WGuiSplit(WGuiBase* _left, WGuiBase* _right) : WGuiItem("") { + right = _right; + left = _left; + bRight = false; + percentRight = 0.5f; + if(!left->Selectable()) + bRight = true; +} +WGuiSplit::~WGuiSplit(){ + SAFE_DELETE(left); + SAFE_DELETE(right); +} + +void WGuiSplit::setData(){ + left->setData(); + right->setData(); +} +void WGuiSplit::setX(float _x){ + x = _x; + left->setX(x); + right->setX(x+(1-percentRight)*width); +} +void WGuiSplit::setY(float _y){ + y = _y; + left->setY(y); + right->setY(y); +} +void WGuiSplit::setWidth(float _w){ + width = _w; + if(right->Visible()) + left->setWidth((1-percentRight)*width); + else + left->setWidth(width); + + right->setWidth(percentRight*width); +} +void WGuiSplit::setHeight(float _h){ + left->setHeight(_h); + right->setHeight(_h); + height = _h; +} +float WGuiSplit::getHeight(){ + float lH, rH; + lH = left->getHeight(); + rH = right->getHeight(); + if(lH > rH) + return lH; + + return rH; +} + +void WGuiSplit::Render(){ + if(right->Visible()) + right->Render(); + if(left->Visible()) + left->Render(); +} + +bool WGuiSplit::isModal(){ + if(bRight) + return right->isModal(); + + return left->isModal(); +} +void WGuiSplit::setModal(bool val){ + if(bRight) + return right->setModal(val); + + return left->setModal(val); +} + +void WGuiSplit::Update(float dt){ + JGE * mEngine = JGE::GetInstance(); + + if(hasFocus() && !isModal()){ + if (!bRight && mEngine->GetButtonClick(PSP_CTRL_RIGHT) && right->Selectable()) + { + if(left->Leaving(PSP_CTRL_RIGHT)){ + bRight = !bRight; + right->Entering(PSP_CTRL_RIGHT); + } + } + else if (bRight && mEngine->GetButtonClick(PSP_CTRL_LEFT) && left->Selectable()) + { + if(right->Leaving(PSP_CTRL_LEFT)){ + bRight = !bRight; + left->Entering(PSP_CTRL_LEFT); + } + } + } + + if(bRight) + right->Update(dt); + else + left->Update(dt); +} + +void WGuiSplit::Entering(u32 key){ + mFocus = true; + if(bRight) + right->Entering(key); + else + left->Entering(key); +} +bool WGuiSplit::Leaving(u32 key){ + + if(bRight){ + if(right->Leaving(key)){ + mFocus = false; + return true; + } + } + else{ + if(left->Leaving(key)){ + mFocus = false; + return true; + } + } + + return false; +} +void WGuiSplit::Overlay(){ + if(bRight) + right->Overlay(); + else + left->Overlay(); +} +void WGuiSplit::ButtonPressed(int controllerId, int controlId) +{ + if(bRight) + right->ButtonPressed(controllerId, controlId); + else + left->ButtonPressed(controllerId, controlId); +} +void WGuiSplit::Reload(){ + left->Reload(); + right->Reload(); +} +void WGuiSplit::confirmChange(bool confirmed){ + if(bRight) + right->confirmChange(confirmed); + else + left->confirmChange(confirmed); +} + +//WGuiMenu +WGuiMenu::WGuiMenu(u32 next = PSP_CTRL_RIGHT, u32 prev = PSP_CTRL_LEFT){ + buttonNext = next; + buttonPrev = prev; + currentItem = 0; +} +WGuiMenu::~WGuiMenu(){ + for(vector::iterator it = items.begin();it!=items.end();it++) + SAFE_DELETE(*it); + items.clear(); +} + +void WGuiMenu::setData(){ + for(vector::iterator it = items.begin();it!=items.end();it++) + (*it)->setData(); +}; + +void WGuiMenu::Reload(){ + for(vector::iterator it = items.begin();it!=items.end();it++) + (*it)->Reload(); +}; + +void WGuiMenu::Render(){ + for(vector::iterator it = items.begin();it!=items.end();it++) + (*it)->Render(); +} + +void WGuiMenu::ButtonPressed(int controllerId, int controlId){ + WGuiBase * it = Current(); + if(!it) return; + it->ButtonPressed(controllerId,controlId); +} + +WGuiBase * WGuiMenu::Current(){ + if(currentItem >= 0 && currentItem < (int) items.size()) + return items[currentItem]; return NULL; } - -ostream& OptionEnum::toString(ostream& out) const -{ - EnumDefinition * def = ourDefined(); - - if(!def) - return (out << "OptionEnum ::: INVALID"); - - return (out << "OptionEnum ::: " << def->values[index].second); +void WGuiMenu::Add(WGuiBase * it){ + if(it) + items.push_back(it); } -EnumDefinition * OptionClosedHand::definition = NULL; - -EnumDefinition * OptionClosedHand::getDefinition(){ - if(!definition){ - definition = NEW EnumDefinition(); - definition->values.push_back(EnumDefinition::assoc(INVISIBLE, "invisible")); - definition->values.push_back(EnumDefinition::assoc(VISIBLE, "visible")); +//WGuiTabMenu +void WGuiMenu::Update(float dt){ + JGE * mEngine = JGE::GetInstance(); + + WGuiBase * c = Current(); + if(c && !c->isModal()){ + if (mEngine->GetButtonClick(buttonPrev)){ + if (currentItem > 0 && c->Leaving(buttonPrev)){ + currentItem--; + c = Current(); + c->Entering(buttonPrev); + } + } + else if (mEngine->GetButtonClick(buttonNext)){ + if (currentItem < (int)items.size()-1 && c->Leaving(buttonNext)){ + currentItem++; + c = Current(); + c->Entering(buttonNext); + } + } } - return definition; + if(c) + c->Update(dt); } -OptionClosedHand::OptionClosedHand(int id, string displayName) : OptionEnum(id, displayName) -{ - getDefinition(); - Reload(); -}; - -EnumDefinition * OptionHandDirection::definition = NULL; - -EnumDefinition * OptionHandDirection::getDefinition(){ - if(!definition){ - definition = NEW EnumDefinition(); - definition->values.push_back(EnumDefinition::assoc(VERTICAL, "vertical")); - definition->values.push_back(EnumDefinition::assoc(HORIZONTAL, "horizontal")); +void WGuiTabMenu::Add(WGuiBase * it){ + if (it){ + it->setY(40); + it->setX(10); + WGuiMenu::Add(it); } - return definition; } -OptionHandDirection::OptionHandDirection(int id, string displayName) : OptionEnum(id, displayName) -{ - getDefinition(); - Reload(); -}; +void WGuiTabMenu::Render(){ + JLBFont * mFont = resources.GetJLBFont(Constants::OPTION_FONT); + JRenderer * renderer = JRenderer::GetInstance(); -EnumDefinition * OptionManaDisplay::definition = NULL; + if (!items.size()) + return; -EnumDefinition * OptionManaDisplay::getDefinition(){ - if(!definition){ - definition = NEW EnumDefinition(); - definition->values.push_back(EnumDefinition::assoc(STATIC, "simple")); - definition->values.push_back(EnumDefinition::assoc(DYNAMIC, "Eye candy")); - definition->values.push_back(EnumDefinition::assoc(BOTH, "Both")); + int offset = 0; + + for(vector::iterator it = items.begin();it!=items.end();it++){ + int w = mFont->GetStringWidth((*it)->getDisplay().c_str()); + mFont->SetColor((*it)->getColor(WGuiColor::TEXT_TAB)); + renderer->FillRoundRect(offset+5,5,w + 5,25,2,(*it)->getColor(WGuiColor::BACK_TAB)); + mFont->DrawString((*it)->getDisplay().c_str(),offset+10,10); + offset += w + 10 + 2; } - return definition; + + WGuiBase * c = Current(); + if(c) + c->Render(); } -OptionManaDisplay::OptionManaDisplay(int id, string displayName) : OptionEnum(id, displayName) -{ - getDefinition(); - Reload(); -}; - +void WGuiTabMenu::save(){ + setData(); + ::options.save(); +} \ No newline at end of file diff --git a/projects/mtg/src/SimpleMenu.cpp b/projects/mtg/src/SimpleMenu.cpp index 829d02bbd..e17559c7c 100644 --- a/projects/mtg/src/SimpleMenu.cpp +++ b/projects/mtg/src/SimpleMenu.cpp @@ -117,7 +117,7 @@ void SimpleMenu::Render() { float height = mHeight; if (timeOpen < 1) height *= timeOpen > 0 ? timeOpen : -timeOpen; - renderer->FillRect(mX, mY, mWidth, height, options[Metrics::POPUP_MENU_FC].asColor(ARGB(180,0,0,0))); + renderer->FillRect(mX, mY, mWidth, height, ARGB(180,0,0,0)); drawVertPole(mX, mY - 16, height + 32); drawVertPole(mX + mWidth, mY - 16, height + 32); @@ -135,9 +135,9 @@ void SimpleMenu::Render() { if ((static_cast(mObjects[i]))->mY - LINE_HEIGHT * startId < mY + height - LINE_HEIGHT + 7) { if (static_cast(mObjects[i])->hasFocus()){ resources.GetJLBFont(Constants::MAIN_FONT)->DrawString(static_cast(mObjects[i])->desc.c_str(),mX+mWidth+10,mY+15); - mFont->SetColor(options[Metrics::POPUP_MENU_TCH].asColor(ARGB(255,255,255,0))); + mFont->SetColor(ARGB(255,255,255,0)); } else { - mFont->SetColor(options[Metrics::POPUP_MENU_TC].asColor(ARGB(150,255,255,255))); + mFont->SetColor(ARGB(150,255,255,255)); } (static_cast(mObjects[i]))->RenderWithOffset(-LINE_HEIGHT*startId); } diff --git a/projects/mtg/src/SimplePad.cpp b/projects/mtg/src/SimplePad.cpp index 2bbbbd6aa..b70c5a6ad 100644 --- a/projects/mtg/src/SimplePad.cpp +++ b/projects/mtg/src/SimplePad.cpp @@ -319,10 +319,10 @@ void SimplePad::Render(){ if(bShowNumpad) offY += kH+14; //Draw Keypad Background. - renderer->FillRoundRect(mX-kW,mY-kH,(kW+12)*11,(kH+14)*5+offY,2,options[Metrics::POPUP_MENU_FC].asColor(ARGB(180,0,0,0))); + renderer->FillRoundRect(mX-kW,mY-kH,(kW+12)*11,(kH+14)*5+offY,2,ARGB(180,0,0,0)); offY = vSpacing; //Draw text entry bubble - renderer->FillRoundRect(mX-kW/2,mY+offY,(kW+12)*9+kW/2,kH,2,options[Metrics::KEYPAD_FCH].asColor(ARGB(255,255,255,255))); + renderer->FillRoundRect(mX-kW/2,mY+offY,(kW+12)*9+kW/2,kH,2,ARGB(255,255,255,255)); //Draw text-entry title, if we've got one. if(title != ""){ @@ -335,16 +335,16 @@ void SimplePad::Render(){ { kW = mFont->GetStringWidth(buffer.substr(cursor,1).c_str()); renderer->FillRoundRect(mX+mFont->GetStringWidth(buffer.substr(0,cursor).c_str()),mY+kH-4, - kW,4,2,options[Metrics::KEY_FCH].asColor(ARGB(150,150,150,0))); + kW,4,2,ARGB(150,150,150,0)); } else { cursor = buffer.size(); renderer->FillRoundRect(mX+mFont->GetStringWidth(buffer.substr(0,cursor).c_str()),mY+kH-4, - kW,4,2,options[Metrics::KEY_FCH].asColor(ARGB(150,150,150,0))); + kW,4,2,ARGB(150,150,150,0)); } - mFont->SetColor(options[Metrics::KEYPAD_TC].asColor(ARGB(255,0,0,0))); + mFont->SetColor(ARGB(255,0,0,0)); mFont->DrawString(buffer.c_str(),mX,mY); offY += kH + 12; @@ -399,12 +399,12 @@ void SimplePad::Render(){ kW = mFont->GetStringWidth(keys[x]->displayValue.c_str()); //Render a key. if(x != selected){ - renderer->FillRoundRect(mX+offX-4,mY+offY-4,kW+8,kH+4,2,options[Metrics::POPUP_MENU_FC].asColor(ARGB(180,50,50,50))); - mFont->SetColor(options[Metrics::POPUP_MENU_TCH].asColor(ARGB(255,255,255,0))); + renderer->FillRoundRect(mX+offX-4,mY+offY-4,kW+8,kH+4,2,ARGB(180,50,50,50)); + mFont->SetColor(ARGB(255,255,255,0)); } else{ - renderer->FillRoundRect(mX+offX-4,mY+offY-4,kW+8,kH+4,2,options[Metrics::POPUP_MENU_FC].asColor(ARGB(255,100,100,100))); - mFont->SetColor(options[Metrics::POPUP_MENU_TC].asColor(ARGB(255,255,255,255))); + renderer->FillRoundRect(mX+offX-4,mY+offY-4,kW+8,kH+4,2,ARGB(255,100,100,100)); + mFont->SetColor(ARGB(255,255,255,255)); } char vkey[2]; diff --git a/projects/mtg/src/WCachedResource.cpp b/projects/mtg/src/WCachedResource.cpp index 4881798d8..2c8897ff9 100644 --- a/projects/mtg/src/WCachedResource.cpp +++ b/projects/mtg/src/WCachedResource.cpp @@ -253,7 +253,9 @@ bool WCachedTexture::Attempt(string filename, int submode, int & error){ string realname; //Form correct filename. - if(submode & TEXTURE_SUB_CARD){ + if(submode & TEXTURE_SUB_EXACT) + realname = filename; + else if(submode & TEXTURE_SUB_CARD){ if(submode & TEXTURE_SUB_THUMB){ for(string::size_type i= 0;i < filename.size();i++){ if(filename[i] == '\\' || filename[i] == '/'){