From e27fbac7be5ed73254e97099d93159c0290d3d90 Mon Sep 17 00:00:00 2001 From: "wagic.jeck" Date: Thu, 19 Nov 2009 03:13:55 +0000 Subject: [PATCH] Jeck - Language is now a per-profile option settable in the options menu. Also, game no longer crashes when no language files are present. --- projects/mtg/include/GameOptions.h | 2 +- projects/mtg/include/GameStateMenu.h | 2 +- projects/mtg/include/OptionItem.h | 19 +++++- projects/mtg/src/GameOptions.cpp | 2 +- projects/mtg/src/GameStateMenu.cpp | 9 ++- projects/mtg/src/GameStateOptions.cpp | 5 ++ projects/mtg/src/OptionItem.cpp | 84 +++++++++++++++++++++++++++ 7 files changed, 118 insertions(+), 5 deletions(-) diff --git a/projects/mtg/include/GameOptions.h b/projects/mtg/include/GameOptions.h index bcf6c2be3..b1dae0818 100644 --- a/projects/mtg/include/GameOptions.h +++ b/projects/mtg/include/GameOptions.h @@ -23,7 +23,6 @@ public: enum { //Global settings ACTIVE_PROFILE, - LANG, DIFFICULTY_MODE_UNLOCKED, MOMIR_MODE_UNLOCKED, EVILTWIN_MODE_UNLOCKED, @@ -31,6 +30,7 @@ public: LAST_GLOBAL = RANDOMDECK_MODE_UNLOCKED, //Values /must/ match ordering in optionNames, or everything loads wrong. //Profile settings + LANG, ACTIVE_THEME, ACTIVE_MODE, MUSICVOLUME, diff --git a/projects/mtg/include/GameStateMenu.h b/projects/mtg/include/GameStateMenu.h index 53cc450ea..2b6e145e8 100644 --- a/projects/mtg/include/GameStateMenu.h +++ b/projects/mtg/include/GameStateMenu.h @@ -43,7 +43,7 @@ class GameStateMenu: public GameState, public JGuiListener void setLang(int id); string getLang(string s); void loadLangMenu(); - + bool langChoices; public: GameStateMenu(GameApp* parent); virtual ~GameStateMenu(); diff --git a/projects/mtg/include/OptionItem.h b/projects/mtg/include/OptionItem.h index ab1d60d45..f02c3822e 100644 --- a/projects/mtg/include/OptionItem.h +++ b/projects/mtg/include/OptionItem.h @@ -408,11 +408,28 @@ class OptionSelect:public OptionItem{ size_t prior_value; }; +class OptionLanguage: public OptionSelect{ + public: + OptionLanguage(string _displayValue); + + virtual void addSelection(string s) {addSelection(s,s);}; + virtual void addSelection(string s,string show); + virtual void initSelections(); + virtual void confirmChange(bool confirmed); + virtual void Reload(); + virtual bool Visible(); + virtual bool Selectable(); + virtual void setData(); +protected: + vector actual_data; +}; + + class OptionDirectory:public OptionSelect{ public: virtual void Reload(); OptionDirectory(string _root, int _id, string _displayValue); -private: + protected: string root; }; diff --git a/projects/mtg/src/GameOptions.cpp b/projects/mtg/src/GameOptions.cpp index a23d2a1cf..ba1342fab 100644 --- a/projects/mtg/src/GameOptions.cpp +++ b/projects/mtg/src/GameOptions.cpp @@ -12,12 +12,12 @@ const char * Options::optionNames[] = { //Global options "Profile", - "Lang", "prx_handler", "prx_rimom", "prx_eviltwin", "prx_rnddeck", //Options set on a per-profile basis + "Lang", "Theme", "Mode", "musicVolume", diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp index d3258fae1..89e4af27e 100644 --- a/projects/mtg/src/GameStateMenu.cpp +++ b/projects/mtg/src/GameStateMenu.cpp @@ -73,6 +73,7 @@ GameStateMenu::GameStateMenu(GameApp* parent): GameState(parent) yW = 55; mVolume = 0; scroller = NULL; + langChoices = false; } GameStateMenu::~GameStateMenu() {} @@ -303,6 +304,7 @@ void GameStateMenu::loadLangMenu(){ file.close(); } if (lang.size()){ + langChoices = true; string filen = mDit->d_name; langs.push_back(filen.substr(0,filen.size()-4)); subMenuController->Add(langs.size(),lang.c_str()); @@ -319,7 +321,12 @@ void GameStateMenu::Update(float dt) if (MENU_STATE_MINOR_NONE == (currentState & MENU_STATE_MINOR)) { if (!subMenuController) loadLangMenu(); } - subMenuController->Update(dt); + if(!langChoices){ + currentState = MENU_STATE_MAJOR_LOADING_CARDS; + SAFE_DELETE(subMenuController); + } + else + subMenuController->Update(dt); break; case MENU_STATE_MAJOR_LOADING_CARDS : if (mReadConf){ diff --git a/projects/mtg/src/GameStateOptions.cpp b/projects/mtg/src/GameStateOptions.cpp index d94f7d4c9..dfce76345 100644 --- a/projects/mtg/src/GameStateOptions.cpp +++ b/projects/mtg/src/GameStateOptions.cpp @@ -46,6 +46,9 @@ void GameStateOptions::Start() optionsList = NEW WGuiList("Game"); optionsList->Add(NEW WGuiHeader("Interface Options")); + WDecoConfirm * cLang = NEW WDecoConfirm(this,NEW OptionLanguage("Language")); + cLang->confirm = "Use this Language"; + optionsList->Add(cLang); optionsList->Add(NEW WDecoEnum(NEW OptionInteger(Options::CLOSEDHAND,"Closed hand",1,1,0))); optionsList->Add(NEW WDecoEnum(NEW OptionInteger(Options::HANDDIRECTION,"Hand direction",1,1,0))); optionsList->Add(NEW WDecoEnum(NEW OptionInteger(Options::MANADISPLAY,"Mana display",2,1,0))); @@ -120,6 +123,8 @@ void GameStateOptions::Update(float dt) } if(mReload){ options.reloadProfile(true); + Translator::EndInstance(); + Translator::GetInstance()->init(); optionsTabs->Reload(); mReload = false; } diff --git a/projects/mtg/src/OptionItem.cpp b/projects/mtg/src/OptionItem.cpp index 49747e2ba..b3306cbe5 100644 --- a/projects/mtg/src/OptionItem.cpp +++ b/projects/mtg/src/OptionItem.cpp @@ -291,7 +291,91 @@ void OptionProfile::confirmChange(bool confirmed){ } return; } +//OptionLanguage +OptionLanguage::OptionLanguage(string _displayValue) : OptionSelect(Options::LANG,_displayValue) +{ + Reload(); + initSelections(); +}; +void OptionLanguage::setData(){ + if(id == INVALID_OPTION) return; + + if (value < selections.size()){ + options[id] = GameOption(actual_data[value]); + Translator::EndInstance(); + Translator::GetInstance()->init(); + } +} +void OptionLanguage::confirmChange(bool confirmed){ + if(!confirmed) + value = prior_value; + else{ + setData(); + if(Changed()){ + options[id] = GameOption(actual_data[value]); + Translator::EndInstance(); + Translator::GetInstance()->init(); + } + prior_value = value; + } +} +void OptionLanguage::Reload(){ + struct dirent *mDit; + DIR *mDip; + + mDip = opendir("Res/lang"); + + while ((mDit = readdir(mDip))){ + string filename = "Res/lang/"; + filename += mDit->d_name; + std::ifstream file(filename.c_str()); + string s; + string lang; + if(file){ + if(std::getline(file,s)){ + if (!s.size()){ + lang = ""; + }else{ + if (s[s.size()-1] == '\r') + s.erase(s.size()-1); //Handle DOS files + size_t found = s.find("#LANG:"); + if (found != 0) lang = ""; + else lang = s.substr(6); + } + } + file.close(); + } + + if (lang.size()){ + string filen = mDit->d_name; + addSelection(filen.substr(0,filen.size()-4),lang); + } + } + closedir(mDip); + initSelections(); +} +void OptionLanguage::addSelection(string s,string show){ + selections.push_back(show); + actual_data.push_back(s); +} +void OptionLanguage::initSelections(){ + //Find currently active bit in the list. + for(size_t i=0;i 1) + return true; + return false; +} +bool OptionLanguage::Selectable(){ + if(selections.size() > 1) + return true; + return false; +} //OptionDirectory void OptionDirectory::Reload(){ DIR *mDip;