From a82d4b51bb272686f5d8455977320f674eaef5ce Mon Sep 17 00:00:00 2001 From: "jean.chalard" Date: Tue, 30 Dec 2008 05:24:38 +0000 Subject: [PATCH] J : * New menu style - step one. More improvements are to come, but this should be stable and have a good portion of what is to be done. --- projects/mtg/Makefile | 9 +- projects/mtg/bin/Res/graphics/f3.png | Bin 7668 -> 7507 bytes projects/mtg/include/GameState.h | 13 +- projects/mtg/include/GameStateDeckViewer.h | 6 +- projects/mtg/include/GameStateMenu.h | 258 +++++++++++++-------- projects/mtg/include/SimpleMenu.h | 30 ++- projects/mtg/include/SimpleMenuItem.h | 16 +- projects/mtg/include/config.h | 5 +- projects/mtg/src/ActionLayer.cpp | 2 +- projects/mtg/src/GameApp.cpp | 10 +- projects/mtg/src/GameStateDuel.cpp | 6 +- projects/mtg/src/GameStateOptions.cpp | 2 +- projects/mtg/src/GameStateShop.cpp | 2 +- projects/mtg/src/MTGGuiPlay.cpp | 13 +- projects/mtg/src/MenuItem.cpp | 7 +- projects/mtg/src/ShopItem.cpp | 2 +- projects/mtg/src/SimpleMenu.cpp | 146 ++++++++++-- projects/mtg/src/SimpleMenuItem.cpp | 30 ++- projects/mtg/src/Subtypes.cpp | 2 +- 19 files changed, 367 insertions(+), 192 deletions(-) diff --git a/projects/mtg/Makefile b/projects/mtg/Makefile index a5276225d..b0d3c2d7e 100644 --- a/projects/mtg/Makefile +++ b/projects/mtg/Makefile @@ -13,6 +13,10 @@ PSPSDK = $(shell psp-config --pspsdk-path) PSPDIR = $(shell psp-config --psp-prefix) TARGET = template endif +ifeq ($(MAKECMDGOALS),debug) +DEFAULT_RULE = debug +TARGET_ARCHITECTURE = linux +endif ifeq ($(MAKECMDGOALS),linux) DEFAULT_RULE = linux TARGET_ARCHITECTURE = linux @@ -52,9 +56,12 @@ CXXFLAGS := $(INCDIR) $(CXXFLAGS) LDFLAGS := $(LIBS) + all: $(DEFAULT_RULE) -debug: CXXFLAGS += -ggdb3 -D_DEBUG -DDEBUG +debug: CXXFLAGS = -Wall -W -Werror -Wno-unused -DDEVHOOK -DPSPFW3XX -fno-exceptions -fno-rtti -ggdb3 -D_DEBUG -DDEBUG -DLINUX $(INCDIR) + + ifeq ($(TARGET_ARCHITECTURE),psp) diff --git a/projects/mtg/bin/Res/graphics/f3.png b/projects/mtg/bin/Res/graphics/f3.png index 0e921551f0aa0b484d78c99f581ba7db41da82cb..7eb56fe43e5435ab9c71e2c1ea29303b0c5fbcd5 100644 GIT binary patch literal 7507 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 diff --git a/projects/mtg/include/GameState.h b/projects/mtg/include/GameState.h index b66e52e90..458d7bce3 100644 --- a/projects/mtg/include/GameState.h +++ b/projects/mtg/include/GameState.h @@ -7,16 +7,15 @@ class JGE; #include -enum _gameSates +enum ENUM_GAME_STATE { - GAME_STATE_MENU, - GAME_STATE_DUEL, - GAME_STATE_DECK_VIEWER, - GAME_STATE_SHOP, - GAME_STATE_OPTIONS + GAME_STATE_MENU = 0x01, + GAME_STATE_DUEL = 0x02, + GAME_STATE_DECK_VIEWER = 0x03, + GAME_STATE_SHOP = 0x04, + GAME_STATE_OPTIONS = 0x05, }; - class GameApp; class GameState diff --git a/projects/mtg/include/GameStateDeckViewer.h b/projects/mtg/include/GameStateDeckViewer.h index 16139009a..9e34da520 100644 --- a/projects/mtg/include/GameStateDeckViewer.h +++ b/projects/mtg/include/GameStateDeckViewer.h @@ -153,7 +153,7 @@ class GameStateDeckViewer: public GameState, public JGuiListener - menu = NEW SimpleMenu(11,this,menuFont,SCREEN_WIDTH/2-100,20,200); + menu = NEW SimpleMenu(11,this,menuFont,SCREEN_WIDTH/2-100,20); menu->Add(11,"Save"); menu->Add(12,"Back to main menu"); menu->Add(13, "Cancel"); @@ -185,7 +185,7 @@ class GameStateDeckViewer: public GameState, public JGuiListener //menuFont = NEW JLBFont("graphics/f3",16); menuFont = GameApp::CommonRes->GetJLBFont("graphics/f3"); - welcome_menu = NEW SimpleMenu(10,this,menuFont,20,20,200); + welcome_menu = NEW SimpleMenu(10,this,menuFont,20,20); char buffer[100]; for (int i=1; i < 6; i++){ sprintf(buffer, RESPATH"/player/deck%i.txt",i); @@ -325,7 +325,7 @@ class GameStateDeckViewer: public GameState, public JGuiListener price = pricelist->getPrice(card->getMTGId()) / 2; price = price - price * (rnd -10)/100; sprintf(buffer,"%s : %i credits",card->getName(),price); - sellMenu = NEW SimpleMenu(2,this,mFont,SCREEN_WIDTH-300,SCREEN_HEIGHT/2,270,buffer); + sellMenu = NEW SimpleMenu(2,this,mFont,SCREEN_WIDTH-300,SCREEN_HEIGHT/2,buffer); sellMenu->Add(20,"Yes"); sellMenu->Add(21,"No"); } diff --git a/projects/mtg/include/GameStateMenu.h b/projects/mtg/include/GameStateMenu.h index dd93b8f4e..e9b163f93 100644 --- a/projects/mtg/include/GameStateMenu.h +++ b/projects/mtg/include/GameStateMenu.h @@ -12,21 +12,51 @@ #include "../include/GameOptions.h" - -#define STATE_MENU 0 -#define STATE_SUBMENU 1 -#define STATE_LOADING_MENU 2 -#define STATE_LOADING_CARDS 3 -#define STATE_FIRST_TIME 4 -#define STATE_WARNING 5 - -#define GAME_VERSION "WTH?! 0.3.1 - by WilLoW" +static const char* GAME_VERSION = "WTH?! 0.3.1 - by WilLoW"; #define ALPHA_WARNING 0 #define DEFAULT_ANGLE_MULTIPLIER 0.4 #define MAX_ANGLE_MULTIPLIER (3*M_PI) #define MIN_ANGLE_MULTIPLIER 0.4 -#define STEP_ANGLE_MULTIPLIER 0.0002 +static const double STEP_ANGLE_MULTIPLIER = 0.0002; + + +enum ENUM_MENU_STATE_MAJOR + { + MENU_STATE_MAJOR_MAINMENU = 0x01, + MENU_STATE_MAJOR_SUBMENU = 0x02, + MENU_STATE_MAJOR_LOADING_MENU = 0x03, + MENU_STATE_MAJOR_LOADING_CARDS = 0x04, + MENU_STATE_MAJOR_FIRST_TIME = 0x05, + MENU_STATE_MAJOR_WARNING = 0x06, + MENU_STATE_MAJOR_DUEL = 0x07, + + MENU_STATE_MAJOR = 0xFF + }; + +enum ENUM_MENU_STATE_MINOR + { + MENU_STATE_MINOR_NONE = 0, + MENU_STATE_MINOR_SUBMENU_CLOSING = 0x100, + + MENU_STATE_MINOR = 0xF00 + }; + + +enum +{ + MENUITEM_PLAY, + MENUITEM_DECKEDITOR, + MENUITEM_SHOP, + MENUITEM_OPTIONS, + MENUITEM_EXIT, + SUBMENUITEM_1PLAYER, + SUBMENUITEM_2PLAYER, + SUBMENUITEM_DEMO, + SUBMENUITEM_CANCEL, + SUBMENUITEM_TESTSUITE +}; + class GameStateMenu: public GameState, public JGuiListener @@ -107,28 +137,21 @@ class GameStateMenu: public GameState, public JGuiListener } } - - mFont = GameApp::CommonRes->GetJLBFont("graphics/f3"); //mFont->SetBase(0); // using 2nd font mGuiController = NEW JGuiController(100, this); //mGuiController->SetShadingBackground(10, 45, 80, 100, ARGB(255,0,0,0)); if (mGuiController) { - mGuiController->Add(NEW MenuItem(1, mFont, "Play", 80, 50 + SCREEN_HEIGHT/2, mIcons[8], mIcons[9],"graphics/particle1.psi",GameApp::CommonRes->GetQuad("particles"), true)); - mGuiController->Add(NEW MenuItem(2, mFont, "Deck Editor", 160, 50 + SCREEN_HEIGHT/2, mIcons[2], mIcons[3],"graphics/particle2.psi",GameApp::CommonRes->GetQuad("particles"))); - mGuiController->Add(NEW MenuItem(3, mFont, "Shop", 240, 50 + SCREEN_HEIGHT/2, mIcons[0], mIcons[1],"graphics/particle3.psi",GameApp::CommonRes->GetQuad("particles"))); - mGuiController->Add(NEW MenuItem(4, mFont, "Options", 320, 50 + SCREEN_HEIGHT/2, mIcons[6], mIcons[7],"graphics/particle4.psi",GameApp::CommonRes->GetQuad("particles"))); - mGuiController->Add(NEW MenuItem(5, mFont, "Exit", 400, 50 + SCREEN_HEIGHT/2, mIcons[4], mIcons[5],"graphics/particle5.psi",GameApp::CommonRes->GetQuad("particles"))); + mGuiController->Add(NEW MenuItem(MENUITEM_PLAY, mFont, "Play", 80, 50 + SCREEN_HEIGHT/2, mIcons[8], mIcons[9],"graphics/particle1.psi",GameApp::CommonRes->GetQuad("particles"), true)); + mGuiController->Add(NEW MenuItem(MENUITEM_DECKEDITOR, mFont, "Deck Editor", 160, 50 + SCREEN_HEIGHT/2, mIcons[2], mIcons[3],"graphics/particle2.psi",GameApp::CommonRes->GetQuad("particles"))); + mGuiController->Add(NEW MenuItem(MENUITEM_SHOP, mFont, "Shop", 240, 50 + SCREEN_HEIGHT/2, mIcons[0], mIcons[1],"graphics/particle3.psi",GameApp::CommonRes->GetQuad("particles"))); + mGuiController->Add(NEW MenuItem(MENUITEM_OPTIONS, mFont, "Options", 320, 50 + SCREEN_HEIGHT/2, mIcons[6], mIcons[7],"graphics/particle4.psi",GameApp::CommonRes->GetQuad("particles"))); + mGuiController->Add(NEW MenuItem(MENUITEM_EXIT, mFont, "Exit", 400, 50 + SCREEN_HEIGHT/2, mIcons[4], mIcons[5],"graphics/particle5.psi",GameApp::CommonRes->GetQuad("particles"))); } - currentState = STATE_LOADING_CARDS; - - - - - + currentState = MENU_STATE_MAJOR_LOADING_CARDS | MENU_STATE_MINOR_NONE; } @@ -160,7 +183,7 @@ class GameStateMenu: public GameState, public JGuiListener virtual void Start(){ JRenderer::GetInstance()->ResetPrivateVRAM(); JRenderer::GetInstance()->EnableVSync(true); -subMenuController = NULL; + subMenuController = NULL; if (GameApp::HasMusic && !GameApp::music && GameOptions::GetInstance()->values[OPTIONS_MUSICVOLUME] > 0){ GameApp::music = JSoundSystem::GetInstance()->LoadMusic("sound/Track0.mp3"); @@ -224,69 +247,80 @@ subMenuController = NULL; } timeIndex += dt * 2; - if (currentState == STATE_LOADING_CARDS){ - if (mReadConf){ - mParent->collection->load(mCurrentSetFileName, mCurrentSetName); - }else{ - mReadConf = 1; - } - if (!nextCardSet()){ - //How many cards total ? - sprintf(nbcardsStr, "Database: %i cards", mParent->collection->totalCards()); - //Check for first time comer - std::ifstream file(RESPATH"/player/collection.dat"); - if(file){ - file.close(); - currentState = STATE_WARNING; + switch (MENU_STATE_MAJOR & currentState) + { + case MENU_STATE_MAJOR_LOADING_CARDS : + if (mReadConf){ + mParent->collection->load(mCurrentSetFileName, mCurrentSetName); }else{ - currentState = STATE_FIRST_TIME; + mReadConf = 1; } - } - }else if (currentState == STATE_FIRST_TIME){ - //Give the player cards from the set for which we have the most variety - int setId = 0; - int maxcards = 0; - for (int i=0; i< MtgSets::SetsList->nb_items; i++){ - int value = mParent->collection->countBySet(i); - if (value > maxcards){ - maxcards = value; - setId = i; - } - } - createUsersFirstDeck(setId); - currentState = STATE_WARNING; - }else if (currentState == STATE_WARNING){ - if (!ALPHA_WARNING){ - currentState = STATE_MENU; - }else{ - if (mEngine->GetButtonClick(PSP_CTRL_CIRCLE)) currentState = STATE_MENU; - } - }else{ - if (currentState == STATE_MENU && mGuiController!=NULL){ - mGuiController->Update(dt); - SAFE_DELETE(subMenuController); - } - if (currentState == STATE_SUBMENU){ - if( subMenuController){ - subMenuController->Update(dt); - }else{ - - subMenuController = NEW SimpleMenu(102, this,mFont, 50,170,SCREEN_WIDTH-120); - - if (subMenuController){ - subMenuController->Add(11,"1 Player"); - subMenuController->Add(12, "2 Players"); - subMenuController->Add(13,"Demo"); - subMenuController->Add(14, "Cancel"); -#ifdef TESTSUITE - subMenuController->Add(666, "Test Suite"); -#endif - + if (!nextCardSet()){ + //How many cards total ? + sprintf(nbcardsStr, "Database: %i cards", mParent->collection->totalCards()); + //Check for first time comer + std::ifstream file(RESPATH"/player/collection.dat"); + if(file){ + file.close(); + currentState = MENU_STATE_MAJOR_WARNING | MENU_STATE_MINOR_NONE; + }else{ + currentState = MENU_STATE_MAJOR_FIRST_TIME | MENU_STATE_MINOR_NONE; } } + break; + case MENU_STATE_MAJOR_FIRST_TIME : + { + //Give the player cards from the set for which we have the most variety + int setId = 0; + int maxcards = 0; + for (int i=0; i< MtgSets::SetsList->nb_items; i++){ + int value = mParent->collection->countBySet(i); + if (value > maxcards){ + maxcards = value; + setId = i; + } + } + createUsersFirstDeck(setId); + } + currentState = MENU_STATE_MAJOR_WARNING | MENU_STATE_MINOR_NONE; + break; + case MENU_STATE_MAJOR_WARNING : + if (!ALPHA_WARNING){ + currentState = MENU_STATE_MAJOR_MAINMENU | MENU_STATE_MINOR_NONE; + }else{ + if (mEngine->GetButtonClick(PSP_CTRL_CIRCLE)) currentState = MENU_STATE_MAJOR_MAINMENU | MENU_STATE_MINOR_NONE; + } + break; + case MENU_STATE_MAJOR_MAINMENU : + if (mGuiController!=NULL){ + mGuiController->Update(dt); + } + break; + case MENU_STATE_MAJOR_SUBMENU : + subMenuController->Update(dt); + mGuiController->Update(dt); + break; + case MENU_STATE_MAJOR_DUEL : + if (MENU_STATE_MINOR_NONE == (currentState & MENU_STATE_MINOR)) + { + mParent->SetNextState(GAME_STATE_DUEL); + currentState = MENU_STATE_MAJOR_MAINMENU; + } + } + switch (MENU_STATE_MINOR & currentState) + { + case MENU_STATE_MINOR_SUBMENU_CLOSING : + if (subMenuController->closed) + { + SAFE_DELETE(subMenuController); + currentState &= ~MENU_STATE_MINOR_SUBMENU_CLOSING; + } + else + subMenuController->Update(dt); + break; + case MENU_STATE_MINOR_NONE : + ;// Nothing to do. } - } - if (currentState == STATE_WARNING && !ALPHA_WARNING) currentState = STATE_MENU; if (yW <= 55) { if (mEngine->GetButtonState(PSP_CTRL_SQUARE)) angleMultiplier += STEP_ANGLE_MULTIPLIER; @@ -362,7 +396,7 @@ subMenuController = NULL; JRenderer * renderer = JRenderer::GetInstance(); renderer->ClearScreen(ARGB(0,0,0,0)); - if (currentState == STATE_LOADING_CARDS){ + if ((currentState & MENU_STATE_MAJOR) == MENU_STATE_MAJOR_LOADING_CARDS){ char text[512]; sprintf(text, "LOADING SET: %s", mCurrentSetName); mFont->DrawString(text,SCREEN_WIDTH/2,SCREEN_HEIGHT/2,JGETEXT_CENTER); @@ -391,11 +425,11 @@ subMenuController = NULL; mFont->DrawString(nbcardsStr,10, SCREEN_HEIGHT-15); mFont->SetScale(1.f); mFont->SetColor(ARGB(255,255,255,255)); - if (currentState == STATE_SUBMENU && subMenuController){ + if (subMenuController){ subMenuController->Render(); } - if (currentState == STATE_WARNING){ + if ((currentState & MENU_STATE_MAJOR) == MENU_STATE_MAJOR_WARNING){ renderer->FillRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT,ARGB(128,0,0,0)); mFont->DrawString("IMPORTANT NOTE" ,SCREEN_WIDTH/2,10,JGETEXT_CENTER); @@ -426,49 +460,68 @@ subMenuController = NULL; switch (controllerId){ case 101: createUsersFirstDeck(controlId); - currentState = STATE_MENU; + currentState = MENU_STATE_MAJOR_MAINMENU | MENU_STATE_MINOR_NONE; break; default: switch (controlId) { - case 1: - currentState = STATE_SUBMENU; + case MENUITEM_PLAY: +#ifdef TESTSUITE + subMenuController = NEW SimpleMenu(102, this, mFont, 180,110); +#else + subMenuController = NEW SimpleMenu(102, this, mFont, 180,110); +#endif + if (subMenuController){ + subMenuController->Add(SUBMENUITEM_1PLAYER,"1 Player"); + subMenuController->Add(SUBMENUITEM_2PLAYER, "2 Players"); + subMenuController->Add(SUBMENUITEM_DEMO,"Demo"); + subMenuController->Add(SUBMENUITEM_CANCEL, "Cancel"); +#ifdef TESTSUITE + subMenuController->Add(SUBMENUITEM_TESTSUITE, "Test Suite"); +#endif + currentState = MENU_STATE_MAJOR_SUBMENU | MENU_STATE_MINOR_NONE; + } break; - case 2: + case MENUITEM_DECKEDITOR: mParent->SetNextState(GAME_STATE_DECK_VIEWER); break; - case 3: + case MENUITEM_SHOP: mParent->SetNextState(GAME_STATE_SHOP); break; - case 4: + case MENUITEM_OPTIONS: mParent->SetNextState(GAME_STATE_OPTIONS); break; - case 5: + case MENUITEM_EXIT: mEngine->End(); break; - case 11: + case SUBMENUITEM_1PLAYER: mParent->players[0] = PLAYER_TYPE_HUMAN; mParent->players[1] = PLAYER_TYPE_CPU; - mParent->SetNextState(GAME_STATE_DUEL); + subMenuController->Close(); + currentState = MENU_STATE_MAJOR_DUEL | MENU_STATE_MINOR_SUBMENU_CLOSING; break; - case 12: + case SUBMENUITEM_2PLAYER: mParent->players[0] = PLAYER_TYPE_HUMAN; mParent->players[1] = PLAYER_TYPE_HUMAN; - mParent->SetNextState(GAME_STATE_DUEL); + subMenuController->Close(); + currentState = MENU_STATE_MAJOR_DUEL | MENU_STATE_MINOR_SUBMENU_CLOSING; break; - case 13: + case SUBMENUITEM_DEMO: mParent->players[0] = PLAYER_TYPE_CPU; mParent->players[1] = PLAYER_TYPE_CPU; - mParent->SetNextState(GAME_STATE_DUEL); + subMenuController->Close(); + currentState = MENU_STATE_MAJOR_DUEL | MENU_STATE_MINOR_SUBMENU_CLOSING; break; - case 14: - currentState = STATE_MENU; + case SUBMENUITEM_CANCEL: + subMenuController->Close(); + currentState = MENU_STATE_MAJOR_MAINMENU | MENU_STATE_MINOR_SUBMENU_CLOSING; break; #ifdef TESTSUITE - case 666: + case SUBMENUITEM_TESTSUITE: mParent->players[0] = PLAYER_TYPE_TESTSUITE; mParent->players[1] = PLAYER_TYPE_TESTSUITE; - mParent->SetNextState(GAME_STATE_DUEL); + subMenuController->Close(); + currentState = MENU_STATE_MAJOR_DUEL | MENU_STATE_MINOR_SUBMENU_CLOSING; break; #endif } @@ -481,4 +534,3 @@ subMenuController = NULL; #endif - diff --git a/projects/mtg/include/SimpleMenu.h b/projects/mtg/include/SimpleMenu.h index 470969e66..947c9ef01 100644 --- a/projects/mtg/include/SimpleMenu.h +++ b/projects/mtg/include/SimpleMenu.h @@ -4,22 +4,48 @@ #ifndef _SIMPLEMENU_H_ #define _SIMPLEMENU_H_ +#include #include #include -#include +#include "hge/hgeparticle.h" class SimpleMenu:public JGuiController{ + private: + // See SimpleMenu.cpp for values + static const unsigned SIDE_SIZE; + static const unsigned VMARGIN; + static const unsigned HMARGIN; + static const unsigned LINE_HEIGHT; + static const char* spadeLPath; + static const char* spadeRPath; + static const char* jewelPath; + static const char* sidePath; + static const char* titleFontPath; + private: int mHeight, mWidth, mX, mY; JLBFont* mFont; std::string title; int displaytitle; int maxItems,startId; + hgeParticleSystem* stars; + float selectionT, selectionY; + float timeOpen; + + static JQuad *spadeR, *spadeL, *jewel, *side; + static JLBFont* titleFont; + void drawHorzPole(int x, int y, int width); + void drawVertPole(int x, int y, int height); + public: - SimpleMenu(int id, JGuiListener* listener, JLBFont* font, int x, int y, int width, const char * _title = NULL, int _maxItems = 10); + SimpleMenu(int id, JGuiListener* listener, JLBFont* font, int x, int y, const char * _title = "", int _maxItems = 10); void Render(); void Update(float dt); void Add(int id, const char * Text); + void Close(); + + float selectionTargetY; + bool closed; }; diff --git a/projects/mtg/include/SimpleMenuItem.h b/projects/mtg/include/SimpleMenuItem.h index 322956dc2..cef17b9a6 100644 --- a/projects/mtg/include/SimpleMenuItem.h +++ b/projects/mtg/include/SimpleMenuItem.h @@ -5,6 +5,7 @@ #include #include #include +#include "SimpleMenu.h" using std::string; @@ -16,18 +17,20 @@ class SimpleMenuItem: public JGuiObject { private: bool mHasFocus; + SimpleMenu* parent; JLBFont *mFont; string mText; - int mX; - int mY; - float mScale; float mTargetScale; - - public: - SimpleMenuItem(int id, JLBFont *font, const char* text, int x, int y, bool hasFocus = false); + SimpleMenuItem(SimpleMenu* _parent, int id, JLBFont *font, const char* text, int x, int y, bool hasFocus = false); + + int mX; + int mY; + + void Relocate(int x, int y); + int GetWidth(); void RenderWithOffset(float yOffset); virtual void Render(); @@ -39,4 +42,3 @@ class SimpleMenuItem: public JGuiObject }; #endif - diff --git a/projects/mtg/include/config.h b/projects/mtg/include/config.h index a2319394d..f9a36849e 100644 --- a/projects/mtg/include/config.h +++ b/projects/mtg/include/config.h @@ -5,9 +5,8 @@ #define TESTSUITE 1 #endif -#ifdef _DEBUG -//if you get the following error :'_NORMAL_BLOCK' : undeclared identifier, -// try to add #include "crtdbg.h" somewhere in your code before including this file +#if defined (_DEBUG) && defined (WIN32) +#include "crtdbg.h" #define NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) #else #define NEW new diff --git a/projects/mtg/src/ActionLayer.cpp b/projects/mtg/src/ActionLayer.cpp index 00eb38c9d..4cf81ca48 100644 --- a/projects/mtg/src/ActionLayer.cpp +++ b/projects/mtg/src/ActionLayer.cpp @@ -164,7 +164,7 @@ void ActionLayer::setMenuObject(Targetable * object){ SAFE_DELETE(abilitiesMenu); JLBFont * mFont = GameApp::CommonRes->GetJLBFont(MAIN_FONT); - abilitiesMenu = NEW SimpleMenu(10, this, mFont, 100, 100, 200); + abilitiesMenu = NEW SimpleMenu(10, this, mFont, 100, 100); for (int i=0;i #include @@ -97,6 +96,9 @@ void GameApp::Create() CommonRes->CreateQuad("particles", "graphics/particles.png", 0, 0, 32, 32); CommonRes->GetQuad("particles")->SetHotSpot(16,16); + CommonRes->CreateQuad("stars", "graphics/particles.png", 64, 0, 32, 32); + CommonRes->GetQuad("stars")->SetHotSpot(16,16); + CommonRes->LoadJLBFont("graphics/f3",16); CommonRes->LoadJLBFont("graphics/magic",16); @@ -121,7 +123,6 @@ void GameApp::Create() mGameStates[GAME_STATE_MENU] = NEW GameStateMenu(this); mGameStates[GAME_STATE_MENU]->Create(); - mGameStates[GAME_STATE_DUEL] = NEW GameStateDuel(this); mGameStates[GAME_STATE_DUEL]->Create(); @@ -131,15 +132,10 @@ void GameApp::Create() mGameStates[GAME_STATE_OPTIONS] = NEW GameStateOptions(this); mGameStates[GAME_STATE_OPTIONS]->Create(); - - //mGameStates[GAME_STATE_GAME] = NEW GameStateGAME(this); mCurrentState = NULL; mNextState = mGameStates[GAME_STATE_MENU]; - - - } diff --git a/projects/mtg/src/GameStateDuel.cpp b/projects/mtg/src/GameStateDuel.cpp index ddf6668a9..ac406a6f4 100644 --- a/projects/mtg/src/GameStateDuel.cpp +++ b/projects/mtg/src/GameStateDuel.cpp @@ -50,7 +50,7 @@ void GameStateDuel::Start() opponentMenuFont = NEW JLBFont("graphics/f3",16); - menu = NEW SimpleMenu(11,this,mFont,SCREEN_WIDTH/2-100,20,200); + menu = NEW SimpleMenu(11,this,mFont,SCREEN_WIDTH/2-100,20); menu->Add(12,"Back to main menu"); menu->Add(13, "Cancel"); @@ -61,7 +61,7 @@ void GameStateDuel::Start() if (mParent->players[i] == PLAYER_TYPE_HUMAN){ if (!deckmenu){ decksneeded = 1; - deckmenu = NEW SimpleMenu(1,this,mFont, 10 , 10, 100, "Choose a Deck"); + deckmenu = NEW SimpleMenu(1,this,mFont, 10 , 10, "Choose a Deck"); char buffer[100]; for (int j=1; j<6; j++){ sprintf(buffer, RESPATH"/player/deck%i.txt",j); @@ -196,7 +196,7 @@ void GameStateDuel::Update(float dt) else{ if (mParent->players[0] == PLAYER_TYPE_HUMAN){ if (!opponentMenu){ - opponentMenu = NEW SimpleMenu(13,this,opponentMenuFont,10,10,SCREEN_WIDTH/2,"choose Opponent"); + opponentMenu = NEW SimpleMenu(13,this,opponentMenuFont,10,10,"Choose Opponent"); opponentMenu->Add(0,"Random"); nbAIDecks = 0; int found = 1; diff --git a/projects/mtg/src/GameStateOptions.cpp b/projects/mtg/src/GameStateOptions.cpp index cb90663b7..bcd78c1ab 100644 --- a/projects/mtg/src/GameStateOptions.cpp +++ b/projects/mtg/src/GameStateOptions.cpp @@ -27,7 +27,7 @@ void GameStateOptions::Start() if (GameApp::HasMusic) optionsList->Add(NEW OptionItem(OPTIONS_MUSICVOLUME, "Music volume", 100, 10)); optionsList->Add(NEW OptionItem(OPTIONS_SFXVOLUME, "SFX volume", 100, 10)); JLBFont * mFont = GameApp::CommonRes->GetJLBFont("graphics/f3"); - optionsMenu = NEW SimpleMenu(102, this,mFont, 50,170,SCREEN_WIDTH-120); + 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"); diff --git a/projects/mtg/src/GameStateShop.cpp b/projects/mtg/src/GameStateShop.cpp index f3877079f..00ce692cd 100644 --- a/projects/mtg/src/GameStateShop.cpp +++ b/projects/mtg/src/GameStateShop.cpp @@ -92,7 +92,7 @@ void GameStateShop::Update(float dt) if (menu){ menu->Update(dt); }else{ - menu = NEW SimpleMenu(11,this,mFont,SCREEN_WIDTH/2-100,20,200); + menu = NEW SimpleMenu(11,this,mFont,SCREEN_WIDTH/2-100,20); menu->Add(12,"Save & Back to main menu"); menu->Add(13, "Cancel"); } diff --git a/projects/mtg/src/MTGGuiPlay.cpp b/projects/mtg/src/MTGGuiPlay.cpp index 13edeef7f..5dd8f09b9 100644 --- a/projects/mtg/src/MTGGuiPlay.cpp +++ b/projects/mtg/src/MTGGuiPlay.cpp @@ -356,13 +356,6 @@ void MTGGuiPlay::Render(){ RenderPlayerInfo(0); RenderPlayerInfo(1); - if (mCount && mObjects[mCurr] != NULL){ - mObjects[mCurr]->Render(); - if (hasFocus && mCurr >= offset && showBigCards){ - ((CardGui *)mObjects[mCurr])->RenderBig(-1,-1,showBigCards-1); - } - } - if (mGlitterAlpha < 0){ mGlitterAlpha = 510; int position = rand() % 2; @@ -378,6 +371,12 @@ void MTGGuiPlay::Render(){ renderer->RenderQuad(mGlitter,mGlitterX,mGlitterY, (float)(mGlitterAlpha)/(float)255, 1.2*float(mGlitterAlpha)/float(255),1.2*float(mGlitterAlpha)/float(255)); mGlitterAlpha-=10; + if (mCount && mObjects[mCurr] != NULL){ + mObjects[mCurr]->Render(); + if (hasFocus && mCurr >= offset && showBigCards){ + ((CardGui *)mObjects[mCurr])->RenderBig(-1,-1,showBigCards-1); + } + } } MTGGuiPlay::~MTGGuiPlay(){ diff --git a/projects/mtg/src/MenuItem.cpp b/projects/mtg/src/MenuItem.cpp index ac3599f9b..31b3ea256 100644 --- a/projects/mtg/src/MenuItem.cpp +++ b/projects/mtg/src/MenuItem.cpp @@ -35,9 +35,9 @@ void MenuItem::Render() if (mHasFocus) { - if (!updatedSinceLastRender){ + /* if (!updatedSinceLastRender){ mParticleSys->Update(lastDt); - } + }*/ // set additive blending renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE); mParticleSys->Render(); @@ -75,10 +75,7 @@ void MenuItem::Update(float dt) mScale = mTargetScale; } - if (mHasFocus){ mParticleSys->Update(dt); - } - } diff --git a/projects/mtg/src/ShopItem.cpp b/projects/mtg/src/ShopItem.cpp index 75294cbb7..4b2240657 100644 --- a/projects/mtg/src/ShopItem.cpp +++ b/projects/mtg/src/ShopItem.cpp @@ -162,7 +162,7 @@ void ShopItems::Update(float dt){ char buffer[4096]; sprintf(buffer,"%s : %i credits",item->getText(),price); if(!dialog){ - dialog = NEW SimpleMenu(1,this,mFont,SCREEN_WIDTH-300,SCREEN_HEIGHT/2,270,buffer); + dialog = NEW SimpleMenu(1,this,mFont,SCREEN_WIDTH-300,SCREEN_HEIGHT/2,buffer); dialog->Add(1,"Yes"); dialog->Add(2,"No"); } diff --git a/projects/mtg/src/SimpleMenu.cpp b/projects/mtg/src/SimpleMenu.cpp index 13d1290b2..505af7269 100644 --- a/projects/mtg/src/SimpleMenu.cpp +++ b/projects/mtg/src/SimpleMenu.cpp @@ -1,37 +1,125 @@ #include "../include/config.h" #include "../include/SimpleMenu.h" #include "../include/SimpleMenuItem.h" +#include "JTypes.h" +#include "../include/GameApp.h" -SimpleMenu::SimpleMenu(int id, JGuiListener* listener, JLBFont* font, int x, int y, int width, const char * _title, int _maxItems): JGuiController(id, listener){ - mHeight = 0; - mWidth = width; +const unsigned SimpleMenu::SIDE_SIZE = 7; +const unsigned SimpleMenu::VMARGIN = 8; +const unsigned SimpleMenu::HMARGIN = 27; +const unsigned SimpleMenu::LINE_HEIGHT = 20; +const char* SimpleMenu::spadeLPath = "graphics/spade_ul.png"; +const char* SimpleMenu::spadeRPath = "graphics/spade_ur.png"; +const char* SimpleMenu::jewelPath = "graphics/jewel.png"; +const char* SimpleMenu::sidePath = "graphics/menuside.png"; +const char* SimpleMenu::titleFontPath = "graphics/smallface"; + + +JQuad* SimpleMenu::spadeR = NULL; +JQuad* SimpleMenu::spadeL = NULL; +JQuad* SimpleMenu::jewel = NULL; +JQuad* SimpleMenu::side = NULL; +JLBFont* SimpleMenu::titleFont = NULL; + +SimpleMenu::SimpleMenu(int id, JGuiListener* listener, JLBFont* font, int x, int y, const char * _title, int _maxItems): JGuiController(id, listener){ + mHeight = 2 * VMARGIN; + mWidth = 0; mX = x; mY = y; mFont = font; - if (_title){ - displaytitle = 1; - title = _title; - mHeight = 20; - }else{ - displaytitle = 0; - } + title = _title; startId = 0; maxItems = _maxItems; + side = NULL; + selectionT = 0; + timeOpen = 0; + closed = false; + + JRenderer* renderer = JRenderer::GetInstance(); + static JTexture* spadeLTex = renderer->LoadTexture(spadeLPath, TEX_TYPE_USE_VRAM); + static JTexture* spadeRTex = renderer->LoadTexture(spadeRPath, TEX_TYPE_USE_VRAM); + static JTexture* jewelTex = renderer->LoadTexture(jewelPath, TEX_TYPE_USE_VRAM); + static JTexture* sideTex = renderer->LoadTexture(sidePath, TEX_TYPE_USE_VRAM); + if (NULL == spadeL) spadeL = NEW JQuad(spadeLTex, 2, 1, 16, 13); + if (NULL == spadeR) spadeR = NEW JQuad(spadeRTex, 2, 1, 16, 13); + if (NULL == jewel) jewel = NEW JQuad(jewelTex, 0, 0, 3, 3); + if (NULL == side) side = NEW JQuad(sideTex, 0, 1, 1, 7); + if (NULL == titleFont) + { + GameApp::CommonRes->LoadJLBFont(titleFontPath, 7); + titleFont = GameApp::CommonRes->GetJLBFont(titleFontPath); + } + + stars = NEW hgeParticleSystem("graphics/stars.psi", GameApp::CommonRes->GetQuad("stars")); + stars->MoveTo(mX, mY); +} + +void SimpleMenu::drawHorzPole(int x, int y, int width) +{ + JRenderer* renderer = JRenderer::GetInstance(); + + renderer->RenderQuad(side, x + 5, y - SIDE_SIZE / 2, 0, width - 10); + spadeR->SetHFlip(true); + spadeL->SetHFlip(false); + renderer->RenderQuad(spadeR, x - 9, y - 6); + renderer->RenderQuad(spadeL, x + width - 5, y - 6); + + renderer->RenderQuad(jewel, x - 1, y - 1); + renderer->RenderQuad(jewel, x + width - 1, y - 1); +} +void SimpleMenu::drawVertPole(int x, int y, int height) +{ + JRenderer* renderer = JRenderer::GetInstance(); + + renderer->RenderQuad(side, x - SIDE_SIZE / 2, y + height - 5, -M_PI/2, height - 10); + spadeR->SetHFlip(false); + spadeL->SetHFlip(true); + renderer->RenderQuad(spadeR, x - 6, y + 7, -M_PI/2); + renderer->RenderQuad(spadeL, x - 6, y + height + 11, -M_PI/2); + + renderer->RenderQuad(jewel, x - 1, y - 1); + renderer->RenderQuad(jewel, x - 1, y + height - 1); } void SimpleMenu::Render(){ + if (0 == mWidth) + { + for (int i = startId; i < startId + mCount; ++i) + { + int width = (static_cast(mObjects[i]))->GetWidth(); + if (mWidth < width) mWidth = width; + } + mWidth += 2*HMARGIN; + for (int i = startId; i < startId + mCount; ++i) + static_cast(mObjects[i])->Relocate(mX + mWidth / 2, mY + VMARGIN + i * LINE_HEIGHT); + stars->Fire(); + selectionTargetY = selectionY = mY + VMARGIN; + timeOpen = 0; + } mFont->SetColor(ARGB(255,255,255,255)); JRenderer * renderer = JRenderer::GetInstance(); - renderer->FillRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT,ARGB(70,0,0,0)); - renderer->FillRoundRect(mX,mY,mWidth,mHeight,10,ARGB(255,17,17,17)); - renderer->FillRoundRect(mX+2,mY+2,mWidth - 4,mHeight-4,10,ARGB(255,62,62,62)); - if (displaytitle){ - mFont->DrawString(title.c_str(), mX+10, mY+10); - } + + float height = mHeight; + if (timeOpen < 1) + height *= timeOpen > 0 ? timeOpen : -timeOpen; + + renderer->FillRect(mX, mY, mWidth, height, ARGB(180,0,0,0)); + + drawVertPole(mX, mY - 16, height + 32); + drawVertPole(mX + mWidth, mY - 16, height + 32); + drawHorzPole(mX - 16, mY, mWidth + 32); + if (!title.empty()) + titleFont->DrawString(title.c_str(), mX+mWidth/2, mY - 3, JGETEXT_CENTER); for (int i = startId; i < startId + maxItems ; i++){ if (i > mCount-1) break; - ((SimpleMenuItem * )mObjects[i])->RenderWithOffset(-20*startId); + if ((static_cast(mObjects[i]))->mY - LINE_HEIGHT * startId < mY + height - LINE_HEIGHT + 7) + (static_cast(mObjects[i]))->RenderWithOffset(-LINE_HEIGHT*startId); } + renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_DST_ALPHA); + stars->Render(); + renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); + + drawHorzPole(mX - 25, mY + height, mWidth + 50); } void SimpleMenu::Update(float dt){ @@ -41,13 +129,27 @@ void SimpleMenu::Update(float dt){ }else if (mCurr < startId){ startId = mCurr; } + stars->Update(dt); + selectionT += 3*dt; + selectionY += (selectionTargetY - selectionY) * 8 * dt; + stars->MoveTo(mX + HMARGIN + ((mWidth-2*HMARGIN)*(1+cos(selectionT))/2), selectionY + 5 * cos(selectionT*2.35) + LINE_HEIGHT / 2 - LINE_HEIGHT * startId); + if (timeOpen < 0) + { + timeOpen += dt * 10; + if (timeOpen >= 0) { timeOpen = 0; closed = true; } + } + else + { + timeOpen += dt * 10; + } } void SimpleMenu::Add(int id, const char * text){ - int y = mCount*20; - if (displaytitle) y+=20; - JGuiController::Add(NEW SimpleMenuItem(id, mFont, text, mWidth/2 + mX + 10, mY + 10 + y, (mCount == 0))); - if (mCount <= maxItems) mHeight += 20; + JGuiController::Add(NEW SimpleMenuItem(this, id, mFont, text, 0, mY + VMARGIN + mCount*LINE_HEIGHT, (mCount == 0))); + if (mCount <= maxItems) mHeight += LINE_HEIGHT; } - +void SimpleMenu::Close() +{ + timeOpen = -1.0; +} diff --git a/projects/mtg/src/SimpleMenuItem.cpp b/projects/mtg/src/SimpleMenuItem.cpp index a1ddf088d..65124d948 100644 --- a/projects/mtg/src/SimpleMenuItem.cpp +++ b/projects/mtg/src/SimpleMenuItem.cpp @@ -2,41 +2,31 @@ #include "../include/SimpleMenuItem.h" -SimpleMenuItem::SimpleMenuItem(int id, JLBFont *font, const char* text, int x, int y, bool hasFocus): JGuiObject(id), mFont(font), mX(x), mY(y) +SimpleMenuItem::SimpleMenuItem(SimpleMenu* _parent, int id, JLBFont *font, const char* text, int x, int y, bool hasFocus): JGuiObject(id), parent(_parent), mFont(font), mX(x), mY(y) { - mText = text; mHasFocus = hasFocus; mScale = 1.0f; mTargetScale = 1.0f; - - if (hasFocus) Entering(); mFont->SetScale(1.2f); - } void SimpleMenuItem::RenderWithOffset(float yOffset) { - mFont->SetScale(mScale); mFont->SetColor(ARGB(255,255,255,255)); - if (mHasFocus) - { - mFont->SetColor(ARGB(255,255,255,0)); - } mFont->DrawString(mText.c_str(), mX, mY + yOffset, JGETEXT_CENTER); mFont->SetScale(1.0f); } void SimpleMenuItem::Render() { - - RenderWithOffset(0); + RenderWithOffset(0); } void SimpleMenuItem::Update(float dt) @@ -56,20 +46,16 @@ void SimpleMenuItem::Update(float dt) } - - void SimpleMenuItem::Entering() { - mHasFocus = true; - mTargetScale = 1.2f; + parent->selectionTargetY = mY; } bool SimpleMenuItem::Leaving(u32 key) { mHasFocus = false; - mTargetScale = 1.0f; return true; } @@ -79,3 +65,13 @@ bool SimpleMenuItem::ButtonPressed() return true; } +void SimpleMenuItem::Relocate(int x, int y) +{ + mX = x; + mY = y; +} + +int SimpleMenuItem::GetWidth() +{ + return mFont->GetStringWidth(mText.c_str()); +} diff --git a/projects/mtg/src/Subtypes.cpp b/projects/mtg/src/Subtypes.cpp index 0ac69857b..1bc74f131 100644 --- a/projects/mtg/src/Subtypes.cpp +++ b/projects/mtg/src/Subtypes.cpp @@ -14,7 +14,7 @@ Subtypes::Subtypes(){ int Subtypes::Add(string value){ int result = find(value); if (result) return result; -#if defined (WIN32) || defined (LINUX) +#if defined (WIN32) char buf[4096]; sprintf(buf, "Adding new type: *%s*\n",value.c_str()); OutputDebugString(buf);