From 3c76a4b5a784f2d30cf97f202666ad80a97b00d2 Mon Sep 17 00:00:00 2001 From: "D. Polders" Date: Tue, 20 Dec 2016 21:25:35 +0100 Subject: [PATCH] Go-to Random Game feature --- es-app/src/guis/GuiGamelistOptions.cpp | 13 ++++++++ es-app/src/main.cpp | 2 ++ es-app/src/views/SystemView.cpp | 6 ++++ es-app/src/views/ViewController.cpp | 31 +++++++++++++++++++ es-app/src/views/ViewController.h | 1 + .../src/views/gamelist/BasicGameListView.cpp | 1 + .../views/gamelist/ISimpleGameListView.cpp | 4 +++ 7 files changed, 58 insertions(+) diff --git a/es-app/src/guis/GuiGamelistOptions.cpp b/es-app/src/guis/GuiGamelistOptions.cpp index cb8f45d68..9d2b3f8ab 100644 --- a/es-app/src/guis/GuiGamelistOptions.cpp +++ b/es-app/src/guis/GuiGamelistOptions.cpp @@ -35,6 +35,19 @@ GuiGamelistOptions::GuiGamelistOptions(Window* window, SystemData* system) : Gui }; mMenu.addRow(row); + row.elements.clear(); + row.addElement(std::make_shared(mWindow, "SURPRISE ME!", Font::get(FONT_SIZE_MEDIUM), 0x777777FF), true); + row.input_handler = [&](InputConfig* config, Input input) { + if (config->isMappedTo("a", input) && input.value) + { + ViewController::get()->goToRandomGame(); + delete this; + return true; + } + return false; + }; + mMenu.addRow(row); + // sort list by mListSort = std::make_shared(mWindow, "SORT GAMES BY", false); for(unsigned int i = 0; i < FileSorts::SortTypes.size(); i++) diff --git a/es-app/src/main.cpp b/es-app/src/main.cpp index c3d030ec4..dec399bde 100644 --- a/es-app/src/main.cpp +++ b/es-app/src/main.cpp @@ -166,6 +166,8 @@ void onExit() int main(int argc, char* argv[]) { + srand((unsigned int)time(NULL)); + unsigned int width = 0; unsigned int height = 0; diff --git a/es-app/src/views/SystemView.cpp b/es-app/src/views/SystemView.cpp index 272d4c634..47ede5124 100644 --- a/es-app/src/views/SystemView.cpp +++ b/es-app/src/views/SystemView.cpp @@ -134,6 +134,11 @@ bool SystemView::input(InputConfig* config, Input input) ViewController::get()->goToGameList(getSelected()); return true; } + if (config->isMappedTo("x", input)) + { + ViewController::get()->goToRandomGame(); + return true; + } }else{ if(config->isMappedTo("left", input) || config->isMappedTo("right", input) || @@ -286,6 +291,7 @@ std::vector SystemView::getHelpPrompts() else prompts.push_back(HelpPrompt("left/right", "choose")); prompts.push_back(HelpPrompt("a", "select")); + prompts.push_back(HelpPrompt("x", "random")); return prompts; } diff --git a/es-app/src/views/ViewController.cpp b/es-app/src/views/ViewController.cpp index cc83eece5..de35e614e 100644 --- a/es-app/src/views/ViewController.cpp +++ b/es-app/src/views/ViewController.cpp @@ -119,6 +119,37 @@ void ViewController::goToGameList(SystemData* system) playViewTransition(); } +void ViewController::goToRandomGame() +{ + unsigned int total = 0; + for(auto it = SystemData::sSystemVector.begin(); it != SystemData::sSystemVector.end(); it++) + { + if ((*it)->getName() != "retropie") + total += (*it)->getGameCount(); + } + + // get random number in range + int target = std::round(((double)std::rand() / (double)RAND_MAX) * total); + + for (auto it = SystemData::sSystemVector.begin(); it != SystemData::sSystemVector.end(); it++) + { + if ((*it)->getName() != "retropie") + { + if ((target - (int)(*it)->getGameCount()) >= 0) + { + target -= (int)(*it)->getGameCount(); + } + else + { + goToGameList(*it); + std::vector list = (*it)->getRootFolder()->getFilesRecursive(GAME); + getGameListView(*it)->setCursor(list.at(target)); + return; + } + } + } +} + void ViewController::playViewTransition() { Eigen::Vector3f target(Eigen::Vector3f::Identity()); diff --git a/es-app/src/views/ViewController.h b/es-app/src/views/ViewController.h index 2658f44a9..24f634399 100644 --- a/es-app/src/views/ViewController.h +++ b/es-app/src/views/ViewController.h @@ -30,6 +30,7 @@ public: void goToGameList(SystemData* system); void goToSystemView(SystemData* system); void goToStart(); + void goToRandomGame(); void onFileChanged(FileData* file, FileChangeType change); diff --git a/es-app/src/views/gamelist/BasicGameListView.cpp b/es-app/src/views/gamelist/BasicGameListView.cpp index d3cbc017a..0cd5b023c 100644 --- a/es-app/src/views/gamelist/BasicGameListView.cpp +++ b/es-app/src/views/gamelist/BasicGameListView.cpp @@ -118,5 +118,6 @@ std::vector BasicGameListView::getHelpPrompts() prompts.push_back(HelpPrompt("a", "launch")); prompts.push_back(HelpPrompt("b", "back")); prompts.push_back(HelpPrompt("select", "options")); + prompts.push_back(HelpPrompt("x", "random")); return prompts; } diff --git a/es-app/src/views/gamelist/ISimpleGameListView.cpp b/es-app/src/views/gamelist/ISimpleGameListView.cpp index dd6df5b63..6fae30059 100644 --- a/es-app/src/views/gamelist/ISimpleGameListView.cpp +++ b/es-app/src/views/gamelist/ISimpleGameListView.cpp @@ -102,6 +102,10 @@ bool ISimpleGameListView::input(InputConfig* config, Input input) ViewController::get()->goToPrevGameList(); return true; } + }else if (config->isMappedTo("x", input)) + { + ViewController::get()->goToRandomGame(); + return true; } }