diff --git a/projects/mtg/bin/Res/graphics/iconspsp.png b/projects/mtg/bin/Res/graphics/iconspsp.png index 0ac33d7d8..dc5bf55e2 100644 Binary files a/projects/mtg/bin/Res/graphics/iconspsp.png and b/projects/mtg/bin/Res/graphics/iconspsp.png differ diff --git a/projects/mtg/bin/daily_build/template.exe b/projects/mtg/bin/daily_build/template.exe index 717454d11..5d1d279e4 100644 Binary files a/projects/mtg/bin/daily_build/template.exe and b/projects/mtg/bin/daily_build/template.exe differ diff --git a/projects/mtg/include/GameOptions.h b/projects/mtg/include/GameOptions.h index fae9276ed..00abc3cec 100644 --- a/projects/mtg/include/GameOptions.h +++ b/projects/mtg/include/GameOptions.h @@ -116,7 +116,7 @@ public: //These return a filepath accurate to the current mode/profile/theme, and can //optionally fallback to a file within a certain directory. //The sanity=false option returns the adjusted path even if the file doesn't exist. - string profileFile(string filename="", string fallback="", bool sanity=true,bool relative=false); + string profileFile(string filename="", string fallback="", bool sanity=false,bool relative=false); void reloadProfile(bool images = true); //Reloads profile using current options[ACTIVE_PROFILE] void checkProfile(); //Confirms that a profile is loaded and contains a collection. diff --git a/projects/mtg/include/GameState.h b/projects/mtg/include/GameState.h index 6498cc99c..762bba549 100644 --- a/projects/mtg/include/GameState.h +++ b/projects/mtg/include/GameState.h @@ -30,8 +30,6 @@ class GameState JGE* mEngine; public: - - static const char * const menuTexts[]; GameState(GameApp* parent); virtual ~GameState() {} diff --git a/projects/mtg/include/GameStateDeckViewer.h b/projects/mtg/include/GameStateDeckViewer.h index d33c76500..6009696b2 100644 --- a/projects/mtg/include/GameStateDeckViewer.h +++ b/projects/mtg/include/GameStateDeckViewer.h @@ -53,7 +53,8 @@ private: float mSlide; int mAlpha; int mStage; - + int nbDecks; + int deckNum; int colorFilter; JMusic * bgMusic; JQuad * backQuad; @@ -74,11 +75,12 @@ private: int hudAlpha; float scrollSpeed; int delSellMenu; + string newDeckname; public: GameStateDeckViewer(GameApp* parent); virtual ~GameStateDeckViewer(); - + void updateDecks(); void rotateCards(int direction); void loadIndexes(MTGCard * current = NULL); void switchDisplay(); diff --git a/projects/mtg/src/GameApp.cpp b/projects/mtg/src/GameApp.cpp index a8c855634..160b36049 100644 --- a/projects/mtg/src/GameApp.cpp +++ b/projects/mtg/src/GameApp.cpp @@ -17,7 +17,6 @@ #include "../include/DeckStats.h" #include "../include/Translate.h" -const char * const GameState::menuTexts[]= {"--NEW--","Deck 1", "Deck 2", "Deck 3", "Deck 4", "Deck 5", "Deck 6"} ; hgeParticleSystem* GameApp::Particles[] = {NULL,NULL,NULL,NULL,NULL,NULL}; int GameApp::HasMusic = 1; JMusic * GameApp::music = NULL; diff --git a/projects/mtg/src/GameOptions.cpp b/projects/mtg/src/GameOptions.cpp index e953475bc..98c09944c 100644 --- a/projects/mtg/src/GameOptions.cpp +++ b/projects/mtg/src/GameOptions.cpp @@ -203,6 +203,7 @@ GameSettings::~GameSettings(){ SAFE_DELETE(globalOptions); SAFE_DELETE(profileOptions); SAFE_DELETE(themeOptions); + SAFE_DELETE(keypad); } GameOption& GameSettings::operator[](string option_name){ @@ -223,11 +224,11 @@ int GameSettings::save(){ if(profileOptions){ //Force our directories to exist. MAKEDIR(RESPATH"/profiles"); - string temp = profileFile("","",false,false); + string temp = profileFile(); MAKEDIR(temp.c_str()); temp+="/stats"; MAKEDIR(temp.c_str()); - temp = profileFile(PLAYER_SETTINGS,"",false); + temp = profileFile(PLAYER_SETTINGS); profileOptions->save(); } @@ -289,7 +290,7 @@ void GameSettings::checkProfile(){ //If it doesn't exist, load current profile. if(!profileOptions) - profileOptions = NEW GameOptions(profileFile(PLAYER_SETTINGS,"",false)); + profileOptions = NEW GameOptions(profileFile(PLAYER_SETTINGS)); //Load theme options if(!themeOptions){ @@ -343,7 +344,7 @@ void GameSettings::createUsersFirstDeck(int setId){ if(theGame == NULL || theGame->collection == NULL) return; - MTGDeck *mCollection = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), theGame->collection); + MTGDeck *mCollection = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), theGame->collection); //10 lands of each int sets[] = {setId}; if (!mCollection->addRandomCards(10, sets,1, Constants::RARITY_L,"Forest")){ diff --git a/projects/mtg/src/GameStateDeckViewer.cpp b/projects/mtg/src/GameStateDeckViewer.cpp index 17f4b3599..08971b12f 100644 --- a/projects/mtg/src/GameStateDeckViewer.cpp +++ b/projects/mtg/src/GameStateDeckViewer.cpp @@ -9,6 +9,8 @@ GameStateDeckViewer::GameStateDeckViewer(GameApp* parent): GameState(parent) { bgMusic = NULL; scrollSpeed = MED_SPEED; + nbDecks = 0; + deckNum = 0; } GameStateDeckViewer::~GameStateDeckViewer() { @@ -67,14 +69,27 @@ void GameStateDeckViewer::switchDisplay(){ loadIndexes(); } +void GameStateDeckViewer::updateDecks(){ + SAFE_DELETE(welcome_menu); + + welcome_menu = NEW SimpleMenu(10,this,menuFont,20,20); + nbDecks = fillDeckMenu(welcome_menu,options.profileFile()); + deckNum = 0; + newDeckname = ""; + welcome_menu->Add(nbDecks+1, "--NEW--"); + welcome_menu->Add(-1, "Cancel"); + +} + void GameStateDeckViewer::Start() { + newDeckname = ""; hudAlpha = 0; delSellMenu = 0; pricelist = NEW PriceList(RESPATH"/settings/prices.dat",mParent->collection); playerdata = NEW PlayerData(mParent->collection); sellMenu = NULL; - myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), mParent->collection)); + myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), mParent->collection)); displayed_deck = myCollection; myDeck = NULL; menuFont = resources.GetJLBFont(Constants::MENU_FONT); @@ -83,8 +98,10 @@ void GameStateDeckViewer::Start() 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"); + menu->Add(12,"Rename deck"); + menu->Add(13,"Switch decks without saving"); + menu->Add(14,"Back to main menu"); + menu->Add(15,"Cancel"); //icon images @@ -114,7 +131,8 @@ void GameStateDeckViewer::Start() //menuFont = NEW JLBFont("graphics/f3",16); menuFont = resources.GetJLBFont("f3"); welcome_menu = NEW SimpleMenu(10,this,menuFont,20,20); - int nbDecks = fillDeckMenu(welcome_menu,options.profileFile()); + nbDecks = fillDeckMenu(welcome_menu,options.profileFile()); + deckNum = 0; welcome_menu->Add(nbDecks+1, "--NEW--"); welcome_menu->Add(-1, "Cancel"); @@ -135,6 +153,7 @@ void GameStateDeckViewer::Start() mRotation = 0; mSlide = 0; mAlpha = 255; + newDeckname = ""; //mEngine->ResetPrivateVRAM(); //mEngine->EnableVSync(true); currentCard = NULL; @@ -189,6 +208,22 @@ int GameStateDeckViewer::Remove(MTGCard * card){ void GameStateDeckViewer::Update(float dt) { + if(options.keypadActive()){ + options.keypadUpdate(dt); + + if(newDeckname != ""){ + newDeckname = options.keypadFinish(); + + if(newDeckname != ""){ + loadDeck(deckNum); + if(myDeck && myDeck->parent) + myDeck->parent->meta_name = newDeckname; + } + newDeckname = ""; + } + //Prevent screen from updating. + return; + } // mParent->effect->UpdateBig(dt); hudAlpha = 255-(last_user_activity * 500); if (hudAlpha < 0) hudAlpha = 0; @@ -660,13 +695,15 @@ void GameStateDeckViewer::Render() } if (sellMenu) sellMenu->Render(); + if(options.keypadActive()) + options.keypadRender(); } int GameStateDeckViewer::loadDeck(int deckid){ SAFE_DELETE(myCollection); string profile = options[Options::ACTIVE_PROFILE].str; - myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), mParent->collection)); + myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), mParent->collection)); displayed_deck = myCollection; char deckname[256]; sprintf(deckname,"deck%i.txt",deckid); @@ -692,11 +729,20 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId) case 10: if (controlId == -1){ mParent->SetNextState(GAME_STATE_MENU); - return; + break; + } + else if(controlId == nbDecks+1){ + char buf[512]; + deckNum = controlId; + sprintf(buf,"deck%i",deckNum); + options.keypadStart(buf,&newDeckname); + options.keypadTitle("Deck name"); + //Fallthrough to deck editing. } loadDeck(controlId); mStage = STAGE_WAITING; - return; + deckNum = controlId; + break; } switch (controlId) @@ -709,9 +755,19 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId) mStage = STAGE_WAITING; break; case 12: - mParent->SetNextState(GAME_STATE_MENU); + if(myDeck && myDeck->parent){ + options.keypadStart(myDeck->parent->meta_name,&newDeckname); + options.keypadTitle("Rename deck"); + } break; case 13: + updateDecks(); + mStage = STAGE_WELCOME; + break; + case 14: + mParent->SetNextState(GAME_STATE_MENU); + break; + case 15: mStage = STAGE_WAITING; break; case 20: @@ -735,5 +791,4 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId) delSellMenu = 1; break; } - } \ No newline at end of file diff --git a/projects/mtg/src/GameStateDuel.cpp b/projects/mtg/src/GameStateDuel.cpp index 25f9d359d..fdd7dc421 100644 --- a/projects/mtg/src/GameStateDuel.cpp +++ b/projects/mtg/src/GameStateDuel.cpp @@ -139,12 +139,12 @@ void GameStateDuel::loadPlayerRandom(int playerId, int isAI, int mode){ void GameStateDuel::loadPlayerMomir(int playerId, int isAI){ string deckFileSmall = "momir"; char empty[] = ""; - MTGDeck * tempDeck = NEW MTGDeck(options.profileFile("momir.txt").c_str(), mParent->collection); + MTGDeck * tempDeck = NEW MTGDeck(options.profileFile("momir.txt","",true).c_str(), mParent->collection); deck[playerId] = NEW MTGPlayerCards(mParent->collection, tempDeck); if (!isAI) // Human Player - mPlayers[playerId] = NEW HumanPlayer(deck[playerId], options.profileFile("momir.txt").c_str(), deckFileSmall); + mPlayers[playerId] = NEW HumanPlayer(deck[playerId], options.profileFile("momir.txt","",true).c_str(), deckFileSmall); else - mPlayers[playerId] = NEW AIMomirPlayer(deck[playerId], options.profileFile("momir.txt").c_str(), deckFileSmall, empty); + mPlayers[playerId] = NEW AIMomirPlayer(deck[playerId], options.profileFile("momir.txt","",true).c_str(), deckFileSmall, empty); delete tempDeck; } diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp index 1361e951f..dec4d626b 100644 --- a/projects/mtg/src/GameStateMenu.cpp +++ b/projects/mtg/src/GameStateMenu.cpp @@ -231,7 +231,7 @@ void GameStateMenu::fillScroller(){ sprintf(buff2, _("You have unlocked %i expansions out of %i").c_str(),nbunlocked, MtgSets::SetsList->nb_items); scroller->Add(buff2); - DeckDataWrapper* ddw = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), mParent->collection)); + DeckDataWrapper* ddw = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), mParent->collection)); int totalCards = ddw->getCount(); if (totalCards){ sprintf(buff2, _("You have a total of %i cards in your collection").c_str(),totalCards); @@ -319,7 +319,7 @@ void GameStateMenu::Update(float dt) options[Options::ACTIVE_PROFILE].str = "Default"; //check for deleted collection / first-timer - std::ifstream file(options.profileFile(PLAYER_COLLECTION,"",false).c_str()); + std::ifstream file(options.profileFile(PLAYER_COLLECTION).c_str()); if(file){ file.close(); resources.Release(mSplash); diff --git a/projects/mtg/src/GameStateShop.cpp b/projects/mtg/src/GameStateShop.cpp index 9f77a04fc..a0b2e8cbc 100644 --- a/projects/mtg/src/GameStateShop.cpp +++ b/projects/mtg/src/GameStateShop.cpp @@ -23,7 +23,6 @@ void GameStateShop::Create(){ } - void GameStateShop::Start() { menu = NULL; diff --git a/projects/mtg/src/PlayerData.cpp b/projects/mtg/src/PlayerData.cpp index 95bd964c9..5ddbcc491 100644 --- a/projects/mtg/src/PlayerData.cpp +++ b/projects/mtg/src/PlayerData.cpp @@ -9,7 +9,7 @@ PlayerData::PlayerData(MTGAllCards * allcards){ //CREDITS credits = 3000; //Default value - std::ifstream file(options.profileFile(PLAYER_SAVEFILE,"",false).c_str()); + std::ifstream file(options.profileFile(PLAYER_SAVEFILE).c_str()); std::string s; if(file){ if(std::getline(file,s)){ @@ -21,12 +21,12 @@ PlayerData::PlayerData(MTGAllCards * allcards){ } //COLLECTION - collection = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), allcards); + collection = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), allcards); } int PlayerData::save(){ - std::ofstream file(options.profileFile(PLAYER_SAVEFILE,"",false).c_str()); + std::ofstream file(options.profileFile(PLAYER_SAVEFILE).c_str()); char writer[64]; if (file){ sprintf(writer,"%i\n", credits); diff --git a/projects/mtg/src/SimplePad.cpp b/projects/mtg/src/SimplePad.cpp index c41034005..d810d2aec 100644 --- a/projects/mtg/src/SimplePad.cpp +++ b/projects/mtg/src/SimplePad.cpp @@ -1,410 +1,421 @@ -#include "../include/config.h" -#include "../include/SimplePad.h" -#include "JTypes.h" -#include "../include/GameApp.h" -#include "../include/Translate.h" - - -#define ALPHA_COLUMNS 8 -#define ALPHA_ROWS 8 - -#define KPD_UP 0 -#define KPD_DOWN 1 -#define KPD_LEFT 2 -#define KPD_RIGHT 3 - -SimpleKey::SimpleKey( string _ds, int _id){ - displayValue = _ds; id = _id; - for(int x=0;x<4;x++) - adjacency[x] = KPD_NOWHERE; -} - -void SimplePad::linkKeys(int from, int to, int dir){ - - if(keys[from] && keys[to]){ - keys[from]->adjacency[dir] = to; - switch(dir){ - case KPD_UP: - case KPD_LEFT: - dir++; - break; - default: - dir--; - } - keys[to]->adjacency[dir] = from; - } -} - -SimplePad::SimplePad(){ - nbitems = 0; - bActive = false; - selected = 0; - priorKey = 0; - cursor = 0; - bShowCancel = false; - bShowNumpad = false; - bCapslock = true; - char buf[2]; - buf[1] = '\0'; - SimpleKey * k; - - for(int x=0;x KPD_A) - k->adjacency[KPD_LEFT] = idx-1; - if(idx < KPD_Z) - k->adjacency[KPD_RIGHT] = idx+1; - if(idx > ALPHA_COLUMNS) - k->adjacency[KPD_UP] = idx-1-ALPHA_COLUMNS; - else - k->adjacency[KPD_UP] = KPD_INPUT; - if(idx < 25-ALPHA_COLUMNS) - k->adjacency[KPD_DOWN] = idx+1+ALPHA_COLUMNS; - } - - Add("Spacebar",KPD_SPACE); - - for(int x=25-ALPHA_COLUMNS;x<26;x++) - keys[x]->adjacency[KPD_DOWN] = KPD_SPACE; - - k=Add("Confirm",KPD_OK); - keys[KPD_Z]->adjacency[KPD_RIGHT] = KPD_OK; - k->adjacency[KPD_UP] = KPD_CAPS; - k->adjacency[KPD_LEFT] = KPD_Z; - k->adjacency[KPD_DOWN] = KPD_CANCEL; - - k=Add("Cancel",KPD_CANCEL); - k->adjacency[KPD_UP] = KPD_OK; - k->adjacency[KPD_LEFT] = KPD_SPACE; - - k=Add("Del",KPD_DEL); - keys[KPD_I]->adjacency[KPD_RIGHT] = KPD_DEL; - k->adjacency[KPD_UP] = KPD_9; - k->adjacency[KPD_DOWN] = KPD_CAPS; - k->adjacency[KPD_LEFT] = KPD_I; - - k=Add("Caps",KPD_CAPS); - keys[KPD_R]->adjacency[KPD_RIGHT] = KPD_CAPS; - keys[KPD_R]->adjacency[KPD_DOWN] = KPD_Z; - k->adjacency[KPD_UP] = KPD_DEL; - k->adjacency[KPD_DOWN] = KPD_OK; - k->adjacency[KPD_LEFT] = KPD_R; - - - for(int x=0;x<10;x++){ - buf[0] = '0'+x; - Add(buf,KPD_0+x); - if(x < 8) - linkKeys(KPD_0+x,KPD_A+x,KPD_DOWN); - if(x > 0) - linkKeys(KPD_0+x,KPD_0+x-1,KPD_LEFT); - } - - keys[KPD_8]->adjacency[KPD_DOWN] = KPD_DEL; - keys[KPD_9]->adjacency[KPD_DOWN] = KPD_DEL; - - keys[KPD_0]->adjacency[KPD_LEFT] = KPD_NOWHERE; - keys[KPD_A]->adjacency[KPD_LEFT] = KPD_NOWHERE; - keys[KPD_J]->adjacency[KPD_LEFT] = KPD_NOWHERE; - keys[KPD_S]->adjacency[KPD_LEFT] = KPD_NOWHERE; - -} - -SimplePad::~SimplePad() -{ - for(int x=0;x= KPD_MAX) - return NULL; - - keys[nbitems++] = NEW SimpleKey(display,id); - return keys[nbitems-1]; -} -void SimplePad::pressKey(unsigned char key){ - string input = ""; - - if(isalpha(key)) { - if(bCapslock) - input += toupper(key); - else - input += key; - - if(cursor < buffer.size()) - cursor++; - - buffer.insert(cursor,input); - } - else if(key == KPD_CAPS) - bCapslock = !bCapslock; - else if(key == KPD_DEL) { - if(!buffer.size()) - return; - - if(cursor >= buffer.size()) { - cursor = buffer.size(); - buffer = buffer.substr(0,cursor-1); - } - else - buffer = buffer.substr(0,cursor) + buffer.substr(cursor+1); - - cursor--; - } - else if(key == KPD_OK) - Finish(); - else if(key == KPD_CANCEL) { - bCanceled = true; - Finish(); - } - -} -void SimplePad::MoveSelection(unsigned char moveto) -{ - if(!bShowNumpad && moveto >= KPD_0 && moveto <= KPD_9 ) - moveto = KPD_INPUT; - else if(!bShowCancel && moveto == KPD_CANCEL ) - moveto = KPD_SPACE; - - if(selected < KPD_MAX && selected >= 0) - priorKey = selected; - - if(moveto < KPD_MAX) { - selected = moveto; - } - else if(moveto == KPD_INPUT) - selected = KPD_INPUT; -} - -void SimplePad::Update(float dt){ - JGE * mEngine = JGE::GetInstance(); - - //We can always confirm! - if(mEngine->GetButtonClick(PSP_CTRL_START)) - { - if(selected != KPD_OK) - selected = KPD_OK; - else - Finish(); - return; - } - - if(selected == KPD_SPACE){ - if(bShowCancel && mEngine->GetButtonClick(PSP_CTRL_RIGHT)) - selected = KPD_CANCEL; - else if (mEngine->GetButtonClick(PSP_CTRL_LEFT)||mEngine->GetButtonClick(PSP_CTRL_RIGHT) - ||mEngine->GetButtonClick(PSP_CTRL_UP)||mEngine->GetButtonClick(PSP_CTRL_DOWN)) - selected = priorKey; - } //Moving within/from the text field. - else if(selected == KPD_INPUT){ - if (mEngine->GetButtonClick(PSP_CTRL_DOWN) ) - selected = priorKey; - if (mEngine->GetButtonClick(PSP_CTRL_LEFT)){ - if(cursor > 0) - cursor--; - } - else if (mEngine->GetButtonClick(PSP_CTRL_RIGHT)){ - if(cursor < buffer.size()) - cursor++; - } - } - else if(selected >= 0 && keys[selected]){ - if (mEngine->GetButtonClick(PSP_CTRL_LEFT)) - MoveSelection(keys[selected]->adjacency[KPD_LEFT]); - else if (mEngine->GetButtonClick(PSP_CTRL_RIGHT)) - MoveSelection(keys[selected]->adjacency[KPD_RIGHT]); - if (mEngine->GetButtonClick(PSP_CTRL_DOWN)) - MoveSelection(keys[selected]->adjacency[KPD_DOWN]); - else if (mEngine->GetButtonClick(PSP_CTRL_UP)) - MoveSelection(keys[selected]->adjacency[KPD_UP]); - } - - - //These bits require a valid key... - if(selected >= 0 && selected < nbitems && keys[selected]){ - if (mEngine->GetButtonClick(PSP_CTRL_CIRCLE)) - pressKey(keys[selected]->id); - } - if (buffer.size() > 0 && mEngine->GetButtonClick(PSP_CTRL_CROSS)) - buffer = buffer.substr(0,buffer.size() - 1); - if (buffer.size() && mEngine->GetButtonClick(PSP_CTRL_LTRIGGER)){ - if(cursor > 0) - cursor--; - } - else if (mEngine->GetButtonClick(PSP_CTRL_RTRIGGER)){ - if(cursor < buffer.size()) - cursor++; - else{ - buffer += ' '; - cursor = buffer.size(); - } - } - - mX = 50; - mY = 50; - -} -void SimplePad::Start(string value, string * _dest) { - bActive = true; - bCanceled=false; - buffer = value; - original = buffer; - dest = _dest; - cursor = buffer.size(); -} - -string SimplePad::Finish() { - bActive = false; - if(bCanceled){ - dest = NULL; - return original; - } - if(dest != NULL){ - dest->clear(); dest->insert(0,buffer); - dest = NULL; - } - return buffer; -} - -void SimplePad::Render(){ - //This could use some cleaning up to make margins more explicit - JLBFont * mFont = resources.GetJLBFont("f3"); - - int offX = 0, offY = 0; - int kH = mFont->GetHeight(); - int hSpacing = mFont->GetStringWidth("W"); - int rowLen = mFont->GetStringWidth("JKLMNOPQR") + 14*7; - int vSpacing = 0; - int kW = hSpacing; - - JRenderer * renderer = JRenderer::GetInstance(); - - - if(title != "") - vSpacing = kH+8; - else - vSpacing = 0; - - offY = vSpacing; - 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))); - 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))); - - //Draw text-entry title, if we've got one. - if(title != ""){ - mFont->DrawString(title.c_str(),mX,mY); - mY+=kH+12; - } - - //Draw cursor. - if(cursor < buffer.size()) - { - 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))); - } - 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))); - } - - mFont->SetColor(options[Metrics::KEYPAD_TC].asColor(ARGB(255,0,0,0))); - mFont->DrawString(buffer.c_str(),mX,mY); - offY += kH + 12; - - if(!bShowNumpad) - vSpacing -= kH + 12; - - for(int x=0;x= KPD_0 && x <= KPD_9 && !bShowNumpad)) - continue; - - switch(x){ - case KPD_0: - offX = 0; - offY = vSpacing; - break; - case KPD_A: - offX = 0; - offY = vSpacing+(kH+12)*1; - break; - case KPD_J: - offX = 0; - offY = vSpacing+(kH+12)*2; - break; - case KPD_S: - offX = 0; - offY = vSpacing+(kH+12)*3; - break; - case KPD_SPACE: - offX = 0; - offY = vSpacing+(kH+12)*4; - break; - case KPD_OK: - offX = rowLen + hSpacing; - offY = vSpacing+(kH+12)*3; - break; - case KPD_CANCEL: - offX = rowLen + hSpacing; - offY = vSpacing+(kH+12)*4; - break; - case KPD_DEL: - offX = rowLen + hSpacing; - offY = vSpacing+(kH+12)*1; - break; - case KPD_CAPS: - offX = rowLen + hSpacing; - offY = vSpacing+(kH+12)*2; - break; - } - - 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))); - } - 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))); - } - - char vkey[2]; - vkey[1] = '\0'; - vkey[0] = keys[x]->id; - - - if(isalpha(vkey[0])) { - if(bCapslock) vkey[0] = toupper(vkey[0]); - mFont->DrawString(vkey,mX+offX,mY+offY); - } - else - mFont->DrawString(keys[x]->displayValue.c_str(),mX+offX,mY+offY); - offX += kW + 14; - } -} - -unsigned int SimplePad::cursorPos(){ - if(cursor > buffer.size()) - return buffer.size(); - - return cursor; -} +#include "../include/config.h" +#include "../include/SimplePad.h" +#include "JTypes.h" +#include "../include/GameApp.h" +#include "../include/Translate.h" + + +#define ALPHA_COLUMNS 8 +#define ALPHA_ROWS 8 + +#define KPD_UP 0 +#define KPD_DOWN 1 +#define KPD_LEFT 2 +#define KPD_RIGHT 3 + +SimpleKey::SimpleKey( string _ds, int _id){ + displayValue = _ds; id = _id; + for(int x=0;x<4;x++) + adjacency[x] = KPD_NOWHERE; +} + +void SimplePad::linkKeys(int from, int to, int dir){ + + if(keys[from] && keys[to]){ + keys[from]->adjacency[dir] = to; + switch(dir){ + case KPD_UP: + case KPD_LEFT: + dir++; + break; + default: + dir--; + } + keys[to]->adjacency[dir] = from; + } +} + +SimplePad::SimplePad(){ + nbitems = 0; + bActive = false; + selected = 0; + priorKey = 0; + cursor = 0; + bShowCancel = false; + bShowNumpad = false; + bCapslock = true; + char buf[2]; + buf[1] = '\0'; + SimpleKey * k; + + for(int x=0;x KPD_A) + k->adjacency[KPD_LEFT] = idx-1; + if(idx < KPD_Z) + k->adjacency[KPD_RIGHT] = idx+1; + if(idx > ALPHA_COLUMNS) + k->adjacency[KPD_UP] = idx-1-ALPHA_COLUMNS; + else + k->adjacency[KPD_UP] = KPD_INPUT; + if(idx < 25-ALPHA_COLUMNS) + k->adjacency[KPD_DOWN] = idx+1+ALPHA_COLUMNS; + } + + Add("Spacebar",KPD_SPACE); + + for(int x=25-ALPHA_COLUMNS;x<26;x++) + keys[x]->adjacency[KPD_DOWN] = KPD_SPACE; + + k=Add("Confirm",KPD_OK); + keys[KPD_Z]->adjacency[KPD_RIGHT] = KPD_OK; + k->adjacency[KPD_UP] = KPD_CAPS; + k->adjacency[KPD_LEFT] = KPD_Z; + k->adjacency[KPD_DOWN] = KPD_CANCEL; + + k=Add("Cancel",KPD_CANCEL); + k->adjacency[KPD_UP] = KPD_OK; + k->adjacency[KPD_LEFT] = KPD_SPACE; + + k=Add("Del",KPD_DEL); + keys[KPD_I]->adjacency[KPD_RIGHT] = KPD_DEL; + k->adjacency[KPD_UP] = KPD_9; + k->adjacency[KPD_DOWN] = KPD_CAPS; + k->adjacency[KPD_LEFT] = KPD_I; + + k=Add("Caps",KPD_CAPS); + keys[KPD_R]->adjacency[KPD_RIGHT] = KPD_CAPS; + keys[KPD_R]->adjacency[KPD_DOWN] = KPD_Z; + k->adjacency[KPD_UP] = KPD_DEL; + k->adjacency[KPD_DOWN] = KPD_OK; + k->adjacency[KPD_LEFT] = KPD_R; + + + for(int x=0;x<10;x++){ + buf[0] = '0'+x; + Add(buf,KPD_0+x); + if(x < 8) + linkKeys(KPD_0+x,KPD_A+x,KPD_DOWN); + if(x > 0) + linkKeys(KPD_0+x,KPD_0+x-1,KPD_LEFT); + } + + keys[KPD_8]->adjacency[KPD_DOWN] = KPD_DEL; + keys[KPD_9]->adjacency[KPD_DOWN] = KPD_DEL; + + keys[KPD_0]->adjacency[KPD_LEFT] = KPD_NOWHERE; + keys[KPD_A]->adjacency[KPD_LEFT] = KPD_NOWHERE; + keys[KPD_J]->adjacency[KPD_LEFT] = KPD_NOWHERE; + keys[KPD_S]->adjacency[KPD_LEFT] = KPD_NOWHERE; + +} + +SimplePad::~SimplePad() +{ + for(int x=0;x= KPD_MAX) + return NULL; + + keys[nbitems++] = NEW SimpleKey(display,id); + return keys[nbitems-1]; +} +void SimplePad::pressKey(unsigned char key){ + string input = ""; + + if(isalpha(key)) { + if(bCapslock) + input += toupper(key); + else + input += key; + + if(cursor < buffer.size()) + cursor++; + + buffer.insert(cursor,input); + } + else if(key == KPD_CAPS) + bCapslock = !bCapslock; + else if(key == KPD_DEL) { + if(!buffer.size()) + return; + + if(cursor >= buffer.size()) { + cursor = buffer.size(); + buffer = buffer.substr(0,cursor-1); + } + else + buffer = buffer.substr(0,cursor) + buffer.substr(cursor+1); + + cursor--; + } + else if(key == KPD_OK) + Finish(); + else if(key == KPD_CANCEL) { + bCanceled = true; + Finish(); + } + +} +void SimplePad::MoveSelection(unsigned char moveto) +{ + if(!bShowNumpad && moveto >= KPD_0 && moveto <= KPD_9 ) + moveto = KPD_INPUT; + else if(!bShowCancel && moveto == KPD_CANCEL ) + moveto = KPD_SPACE; + + if(selected < KPD_MAX && selected >= 0) + priorKey = selected; + + if(moveto < KPD_MAX) { + selected = moveto; + } + else if(moveto == KPD_INPUT) + selected = KPD_INPUT; +} + +void SimplePad::Update(float dt){ + JGE * mEngine = JGE::GetInstance(); + + //Start button changes capslock setting. + if(mEngine->GetButtonClick(PSP_CTRL_START)) + { + if(selected != KPD_OK) + selected = KPD_OK; + else + Finish(); + } + else if(mEngine->GetButtonClick(PSP_CTRL_SELECT)){ + bCapslock = !bCapslock; + } + + if(selected == KPD_SPACE){ + if(bShowCancel && mEngine->GetButtonClick(PSP_CTRL_RIGHT)) + selected = KPD_CANCEL; + else if (mEngine->GetButtonClick(PSP_CTRL_LEFT)||mEngine->GetButtonClick(PSP_CTRL_RIGHT) + ||mEngine->GetButtonClick(PSP_CTRL_UP)||mEngine->GetButtonClick(PSP_CTRL_DOWN)) + selected = priorKey; + } //Moving within/from the text field. + else if(selected == KPD_INPUT){ + if (mEngine->GetButtonClick(PSP_CTRL_DOWN) ) + selected = priorKey; + if (mEngine->GetButtonClick(PSP_CTRL_LEFT)){ + if(cursor > 0) + cursor--; + } + else if (mEngine->GetButtonClick(PSP_CTRL_RIGHT)){ + if(cursor < buffer.size()) + cursor++; + } + } + else if(selected >= 0 && keys[selected]){ + if (mEngine->GetButtonClick(PSP_CTRL_LEFT)) + MoveSelection(keys[selected]->adjacency[KPD_LEFT]); + else if (mEngine->GetButtonClick(PSP_CTRL_RIGHT)) + MoveSelection(keys[selected]->adjacency[KPD_RIGHT]); + if (mEngine->GetButtonClick(PSP_CTRL_DOWN)) + MoveSelection(keys[selected]->adjacency[KPD_DOWN]); + else if (mEngine->GetButtonClick(PSP_CTRL_UP)) + MoveSelection(keys[selected]->adjacency[KPD_UP]); + } + + + //These bits require a valid key... + if(selected >= 0 && selected < nbitems && keys[selected]){ + if (mEngine->GetButtonClick(PSP_CTRL_CIRCLE)) + pressKey(keys[selected]->id); + } + if (buffer.size() > 0 && mEngine->GetButtonClick(PSP_CTRL_CROSS)) + buffer = buffer.substr(0,buffer.size() - 1); + if (buffer.size() && mEngine->GetButtonClick(PSP_CTRL_LTRIGGER)){ + if(cursor > 0) + cursor--; + } + else if (mEngine->GetButtonClick(PSP_CTRL_RTRIGGER)){ + if(cursor < buffer.size()) + cursor++; + else{ + buffer += ' '; + cursor = buffer.size(); + } + } + + mX = 50; + mY = 50; + + //Clear input buffer. + mEngine->ResetInput(); +} +void SimplePad::Start(string value, string * _dest) { + bActive = true; + bCanceled=false; + buffer = value; + original = buffer; + dest = _dest; + cursor = buffer.size(); + //Clear input buffer. + JGE * mEngine = JGE::GetInstance(); + mEngine->ResetInput(); +} + +string SimplePad::Finish() { + bActive = false; + + //Clear input buffer. + JGE * mEngine = JGE::GetInstance(); + mEngine->ResetInput(); + + //Return result. + if(bCanceled){ + dest = NULL; + return original; + } + if(dest != NULL){ + dest->clear(); dest->insert(0,buffer); + dest = NULL; + } + return buffer; +} + +void SimplePad::Render(){ + //This could use some cleaning up to make margins more explicit + JLBFont * mFont = resources.GetJLBFont("f3"); + + int offX = 0, offY = 0; + int kH = mFont->GetHeight(); + int hSpacing = mFont->GetStringWidth("W"); + int rowLen = mFont->GetStringWidth("JKLMNOPQR") + 14*7; + int vSpacing = 0; + int kW = hSpacing; + + JRenderer * renderer = JRenderer::GetInstance(); + + + vSpacing = kH+8; + + + offY = vSpacing; + 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))); + 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))); + + //Draw text-entry title, if we've got one. + if(title != ""){ + mFont->DrawString(title.c_str(),mX,mY); + } + mY+=kH+12; + + //Draw cursor. + if(cursor < buffer.size()) + { + 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))); + } + 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))); + } + + mFont->SetColor(options[Metrics::KEYPAD_TC].asColor(ARGB(255,0,0,0))); + mFont->DrawString(buffer.c_str(),mX,mY); + offY += kH + 12; + + if(!bShowNumpad) + vSpacing -= kH + 12; + + for(int x=0;x= KPD_0 && x <= KPD_9 && !bShowNumpad)) + continue; + + switch(x){ + case KPD_0: + offX = 0; + offY = vSpacing; + break; + case KPD_A: + offX = 0; + offY = vSpacing+(kH+12)*1; + break; + case KPD_J: + offX = 0; + offY = vSpacing+(kH+12)*2; + break; + case KPD_S: + offX = 0; + offY = vSpacing+(kH+12)*3; + break; + case KPD_SPACE: + offX = 0; + offY = vSpacing+(kH+12)*4; + break; + case KPD_OK: + offX = rowLen + hSpacing; + offY = vSpacing+(kH+12)*3; + break; + case KPD_CANCEL: + offX = rowLen + hSpacing; + offY = vSpacing+(kH+12)*4; + break; + case KPD_DEL: + offX = rowLen + hSpacing; + offY = vSpacing+(kH+12)*1; + break; + case KPD_CAPS: + offX = rowLen + hSpacing; + offY = vSpacing+(kH+12)*2; + break; + } + + 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))); + } + 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))); + } + + char vkey[2]; + vkey[1] = '\0'; + vkey[0] = keys[x]->id; + + + if(isalpha(vkey[0])) { + if(bCapslock) vkey[0] = toupper(vkey[0]); + mFont->DrawString(vkey,mX+offX,mY+offY); + } + else + mFont->DrawString(keys[x]->displayValue.c_str(),mX+offX,mY+offY); + offX += kW + 14; + } +} + +unsigned int SimplePad::cursorPos(){ + if(cursor > buffer.size()) + return buffer.size(); + + return cursor; +}