mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2025-01-18 07:05:39 +00:00
Browsing multiple systems is now possible! Just press left or right.
Also, config files can have comments (lines that start wih #).
This commit is contained in:
parent
561e4a7f44
commit
f368a1f4cd
|
@ -14,4 +14,5 @@ You can build it by just running `make`.
|
||||||
Configuring
|
Configuring
|
||||||
===========
|
===========
|
||||||
|
|
||||||
At the moment, the software looks for a file named "systems.cfg" in the directory it is run from. An example is included, though at the moment only one system should be defined.
|
At the moment, the software looks for a file named "systems.cfg" in the directory it is run from. An example is included.
|
||||||
|
|
||||||
|
|
0
mame/fakemamegame.zip
Normal file
0
mame/fakemamegame.zip
Normal file
|
@ -17,11 +17,11 @@ std::string GameData::getName()
|
||||||
|
|
||||||
std::string GameData::getValidPath()
|
std::string GameData::getValidPath()
|
||||||
{
|
{
|
||||||
//a quick and dirty way to insert a backslash before spaces
|
//a quick and dirty way to insert a backslash before most characters that would mess up a bash path
|
||||||
std::string path = mPath;
|
std::string path = mPath;
|
||||||
for(unsigned int i = 0; i < path.length(); i++)
|
for(unsigned int i = 0; i < path.length(); i++)
|
||||||
{
|
{
|
||||||
if(path[i] == *" ")
|
if(path[i] == *" " || path[i] == *"'" || path[i] == *"\"" || path[i] == *"\\")
|
||||||
{
|
{
|
||||||
path.insert(i, "\\");
|
path.insert(i, "\\");
|
||||||
i++;
|
i++;
|
||||||
|
|
|
@ -56,6 +56,7 @@ void InputManager::processEvent(SDL_Event* event)
|
||||||
//catch emergency quit event
|
//catch emergency quit event
|
||||||
if(event->key.keysym.sym == SDLK_F4)
|
if(event->key.keysym.sym == SDLK_F4)
|
||||||
{
|
{
|
||||||
|
//I have no idea if SDL will delete this event, but we're quitting, so I don't think it really matters
|
||||||
SDL_Event* quit = new SDL_Event();
|
SDL_Event* quit = new SDL_Event();
|
||||||
quit->type = SDL_QUIT;
|
quit->type = SDL_QUIT;
|
||||||
SDL_PushEvent(quit);
|
SDL_PushEvent(quit);
|
||||||
|
|
|
@ -29,7 +29,8 @@ void Renderer::drawText(std::string text, int x, int y, int color)
|
||||||
if(!font)
|
if(!font)
|
||||||
loadFonts();
|
loadFonts();
|
||||||
|
|
||||||
//SDL_Color sdlcolor = (SDL_Color)color; //SDL_MapRGB(//{(char)color, (char)(*(&color + 1)), (char)(*(&color + 2))};
|
//SDL_Color is a struct of four bytes, with the first three being colors. An int is four bytes.
|
||||||
|
//So, we can just pretend the int is an SDL_Color.
|
||||||
SDL_Color* sdlcolor = (SDL_Color*)&color;
|
SDL_Color* sdlcolor = (SDL_Color*)&color;
|
||||||
|
|
||||||
SDL_Surface* textSurf = TTF_RenderText_Blended(font, text.c_str(), *sdlcolor);
|
SDL_Surface* textSurf = TTF_RenderText_Blended(font, text.c_str(), *sdlcolor);
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
std::vector<SystemData*> SystemData::sSystemVector;
|
||||||
|
|
||||||
namespace fs = boost::filesystem;
|
namespace fs = boost::filesystem;
|
||||||
|
|
||||||
SystemData::SystemData(std::string name, std::string startPath, std::string extension, std::string command)
|
SystemData::SystemData(std::string name, std::string startPath, std::string extension, std::string command)
|
||||||
|
@ -103,15 +105,17 @@ std::string SystemData::getName()
|
||||||
return mName;
|
return mName;
|
||||||
}
|
}
|
||||||
|
|
||||||
//creates system files from information located in a config file
|
|
||||||
std::vector<SystemData*> SystemData::loadConfig(std::string path)
|
|
||||||
|
|
||||||
|
//creates systems from information located in a config file
|
||||||
|
void SystemData::loadConfig(std::string path)
|
||||||
{
|
{
|
||||||
|
deleteSystems();
|
||||||
|
|
||||||
std::cout << "Loading system config file \"" << path << "\"...\n";
|
std::cout << "Loading system config file \"" << path << "\"...\n";
|
||||||
|
|
||||||
std::vector<SystemData*> returnVec;
|
|
||||||
|
|
||||||
std::ifstream file(path.c_str());
|
std::ifstream file(path.c_str());
|
||||||
|
|
||||||
if(file.is_open())
|
if(file.is_open())
|
||||||
{
|
{
|
||||||
std::string line;
|
std::string line;
|
||||||
|
@ -120,8 +124,8 @@ std::vector<SystemData*> SystemData::loadConfig(std::string path)
|
||||||
{
|
{
|
||||||
std::getline(file, line);
|
std::getline(file, line);
|
||||||
|
|
||||||
//skip blank lines
|
//skip blank lines and comments
|
||||||
if(line.empty())
|
if(line.empty() || line[0] == *"#")
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
//find the name (left of the equals sign) and the value (right of the equals sign)
|
//find the name (left of the equals sign) and the value (right of the equals sign)
|
||||||
|
@ -141,6 +145,7 @@ std::vector<SystemData*> SystemData::loadConfig(std::string path)
|
||||||
|
|
||||||
if(lineValid)
|
if(lineValid)
|
||||||
{
|
{
|
||||||
|
//map the value to the appropriate variable
|
||||||
if(varName == "NAME")
|
if(varName == "NAME")
|
||||||
sysName = varValue;
|
sysName = varValue;
|
||||||
else if(varName == "PATH")
|
else if(varName == "PATH")
|
||||||
|
@ -155,21 +160,30 @@ std::vector<SystemData*> SystemData::loadConfig(std::string path)
|
||||||
//we have all our variables - create the system object
|
//we have all our variables - create the system object
|
||||||
if(!sysName.empty() && !sysPath.empty() &&!sysExtension.empty() && !sysCommand.empty())
|
if(!sysName.empty() && !sysPath.empty() &&!sysExtension.empty() && !sysCommand.empty())
|
||||||
{
|
{
|
||||||
returnVec.push_back(new SystemData(sysName, sysPath, sysExtension, sysCommand));
|
sSystemVector.push_back(new SystemData(sysName, sysPath, sysExtension, sysCommand));
|
||||||
|
|
||||||
//reset the variables for the next block (should there be one)
|
//reset the variables for the next block (should there be one)
|
||||||
sysName = ""; sysPath = ""; sysExtension = "";
|
sysName = ""; sysPath = ""; sysExtension = ""; sysCommand = "";
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
std::cerr << "Error reading config file \"" << path << "\" - no equals sign found on line \"" << line << "\"!\n";
|
std::cerr << "Error reading config file \"" << path << "\" - no equals sign found on line \"" << line << "\"!\n";
|
||||||
return returnVec;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
std::cerr << "Error - could not load config file \"" << path << "\"!\n";
|
std::cerr << "Error - could not load config file \"" << path << "\"!\n";
|
||||||
return returnVec;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "Finished loading config file - created " << returnVec.size() << " systems.\n";
|
std::cout << "Finished loading config file - created " << sSystemVector.size() << " systems.\n";
|
||||||
return returnVec;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SystemData::deleteSystems()
|
||||||
|
{
|
||||||
|
for(unsigned int i = 0; i < sSystemVector.size(); i++)
|
||||||
|
{
|
||||||
|
delete sSystemVector.at(i);
|
||||||
|
}
|
||||||
|
sSystemVector.clear();
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,11 @@ public:
|
||||||
|
|
||||||
void buildGameList();
|
void buildGameList();
|
||||||
void launchGame(unsigned int i);
|
void launchGame(unsigned int i);
|
||||||
static std::vector<SystemData*> loadConfig(std::string path);
|
//static std::vector<SystemData*> loadConfig(std::string path);
|
||||||
|
static void deleteSystems();
|
||||||
|
static void loadConfig(std::string path);
|
||||||
|
|
||||||
|
static std::vector<SystemData*> sSystemVector;
|
||||||
private:
|
private:
|
||||||
std::string mName;
|
std::string mName;
|
||||||
std::string mStartPath;
|
std::string mStartPath;
|
||||||
|
|
|
@ -1,17 +1,16 @@
|
||||||
#include "GuiGameList.h"
|
#include "GuiGameList.h"
|
||||||
#include "../InputManager.h"
|
#include "../InputManager.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <SDL/SDL.h>
|
|
||||||
|
|
||||||
GuiGameList::GuiGameList(SystemData* system)
|
GuiGameList::GuiGameList()
|
||||||
{
|
{
|
||||||
mSystem = system;
|
std::cout << "Creating GuiGameList\n";
|
||||||
|
|
||||||
mList = new GuiList();
|
mList = new GuiList();
|
||||||
updateList();
|
|
||||||
|
|
||||||
addChild(mList);
|
addChild(mList);
|
||||||
|
|
||||||
|
setSystemId(0);
|
||||||
|
|
||||||
Renderer::registerComponent(this);
|
Renderer::registerComponent(this);
|
||||||
InputManager::registerComponent(this);
|
InputManager::registerComponent(this);
|
||||||
}
|
}
|
||||||
|
@ -19,9 +18,25 @@ GuiGameList::GuiGameList(SystemData* system)
|
||||||
GuiGameList::~GuiGameList()
|
GuiGameList::~GuiGameList()
|
||||||
{
|
{
|
||||||
Renderer::unregisterComponent(this);
|
Renderer::unregisterComponent(this);
|
||||||
|
delete mList;
|
||||||
|
|
||||||
InputManager::unregisterComponent(this);
|
InputManager::unregisterComponent(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GuiGameList::setSystemId(int id)
|
||||||
|
{
|
||||||
|
//make sure the id is within range
|
||||||
|
if(id >= (int)SystemData::sSystemVector.size())
|
||||||
|
id -= SystemData::sSystemVector.size();
|
||||||
|
if(id < 0)
|
||||||
|
id += SystemData::sSystemVector.size();
|
||||||
|
|
||||||
|
mSystemId = id;
|
||||||
|
mSystem = SystemData::sSystemVector.at(mSystemId);
|
||||||
|
|
||||||
|
updateList();
|
||||||
|
}
|
||||||
|
|
||||||
void GuiGameList::onRender()
|
void GuiGameList::onRender()
|
||||||
{
|
{
|
||||||
Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), 0xFFFFFF);
|
Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), 0xFFFFFF);
|
||||||
|
@ -31,11 +46,21 @@ void GuiGameList::onRender()
|
||||||
|
|
||||||
void GuiGameList::onInput(InputManager::InputButton button, bool keyDown)
|
void GuiGameList::onInput(InputManager::InputButton button, bool keyDown)
|
||||||
{
|
{
|
||||||
if(button == InputManager::BUTTON1 && keyDown)
|
if(button == InputManager::BUTTON1 && mSystem->getGameCount() > 0)
|
||||||
{
|
{
|
||||||
SDL_EnableKeyRepeat(0, 0);
|
//SDL_EnableKeyRepeat(0, 0);
|
||||||
mSystem->launchGame(mList->getSelection());
|
if(!keyDown)
|
||||||
SDL_EnableKeyRepeat(500, 100);
|
mSystem->launchGame(mList->getSelection());
|
||||||
|
//SDL_EnableKeyRepeat(500, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(button == InputManager::RIGHT && keyDown)
|
||||||
|
{
|
||||||
|
setSystemId(mSystemId + 1);
|
||||||
|
}
|
||||||
|
if(button == InputManager::LEFT && keyDown)
|
||||||
|
{
|
||||||
|
setSystemId(mSystemId - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,6 +71,7 @@ void GuiGameList::updateList()
|
||||||
for(unsigned int i = 0; i < mSystem->getGameCount(); i++)
|
for(unsigned int i = 0; i < mSystem->getGameCount(); i++)
|
||||||
{
|
{
|
||||||
GameData* game = mSystem->getGame(i);
|
GameData* game = mSystem->getGame(i);
|
||||||
|
|
||||||
mList->addObject(game->getName(), game);
|
mList->addObject(game->getName(), game);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,15 +10,17 @@
|
||||||
class GuiGameList : GuiComponent
|
class GuiGameList : GuiComponent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
GuiGameList(SystemData* system);
|
GuiGameList();
|
||||||
~GuiGameList();
|
~GuiGameList();
|
||||||
|
|
||||||
void updateList();
|
void updateList();
|
||||||
|
void setSystemId(int id);
|
||||||
|
|
||||||
void onRender();
|
void onRender();
|
||||||
void onInput(InputManager::InputButton button, bool keyDown);
|
void onInput(InputManager::InputButton button, bool keyDown);
|
||||||
private:
|
private:
|
||||||
SystemData* mSystem;
|
SystemData* mSystem;
|
||||||
|
int mSystemId;
|
||||||
GuiList* mList;
|
GuiList* mList;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -17,16 +17,20 @@ void GuiList::onRender()
|
||||||
const int cutoff = 40;
|
const int cutoff = 40;
|
||||||
const int entrySize = 40;
|
const int entrySize = 40;
|
||||||
|
|
||||||
|
int startEntry = 0;
|
||||||
|
|
||||||
//number of entries that can fit on the screen simultaniously
|
//number of entries that can fit on the screen simultaniously
|
||||||
int screenCount = (Renderer::getScreenHeight() - cutoff) / entrySize;
|
int screenCount = (Renderer::getScreenHeight() - cutoff) / entrySize;
|
||||||
screenCount -= 1;
|
screenCount -= 1;
|
||||||
|
|
||||||
int startEntry = mSelection - (screenCount * 0.5);
|
if((int)mNameVector.size() >= screenCount)
|
||||||
if(startEntry < 0)
|
{
|
||||||
startEntry = 0;
|
startEntry = mSelection - (screenCount * 0.5);
|
||||||
if(startEntry >= (int)mNameVector.size() - screenCount)
|
if(startEntry < 0)
|
||||||
startEntry = mNameVector.size() - screenCount;
|
startEntry = 0;
|
||||||
|
if(startEntry >= (int)mNameVector.size() - screenCount)
|
||||||
|
startEntry = mNameVector.size() - screenCount;
|
||||||
|
}
|
||||||
|
|
||||||
int y = cutoff;
|
int y = cutoff;
|
||||||
int color = 0xFF0000;
|
int color = 0xFF0000;
|
||||||
|
@ -37,7 +41,11 @@ void GuiList::onRender()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = startEntry; i < startEntry + screenCount; i++)
|
int listCutoff = startEntry + screenCount;
|
||||||
|
if(listCutoff > (int)mNameVector.size())
|
||||||
|
listCutoff = mNameVector.size();
|
||||||
|
|
||||||
|
for(int i = startEntry; i < listCutoff; i++)
|
||||||
{
|
{
|
||||||
if(mSelection == i)
|
if(mSelection == i)
|
||||||
{
|
{
|
||||||
|
@ -77,6 +85,7 @@ void GuiList::clear()
|
||||||
{
|
{
|
||||||
mNameVector.clear();
|
mNameVector.clear();
|
||||||
mPointerVector.clear();
|
mPointerVector.clear();
|
||||||
|
mSelection = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string GuiList::getSelectedName()
|
std::string GuiList::getSelectedName()
|
||||||
|
|
|
@ -34,9 +34,8 @@ int main()
|
||||||
|
|
||||||
//GuiTitleScreen* testGui = new GuiTitleScreen();
|
//GuiTitleScreen* testGui = new GuiTitleScreen();
|
||||||
|
|
||||||
//test systemData
|
SystemData::loadConfig("./systems.cfg");
|
||||||
SystemData* testSystem = SystemData::loadConfig("./systems.cfg").at(0);
|
GuiGameList* testGui = new GuiGameList();
|
||||||
GuiGameList* testGui = new GuiGameList(testSystem);
|
|
||||||
|
|
||||||
|
|
||||||
bool running = true;
|
bool running = true;
|
||||||
|
@ -65,7 +64,7 @@ int main()
|
||||||
}
|
}
|
||||||
|
|
||||||
delete testGui;
|
delete testGui;
|
||||||
delete testSystem;
|
SystemData::deleteSystems();
|
||||||
|
|
||||||
std::cout << "EmulationStation cleanly shutting down...\n";
|
std::cout << "EmulationStation cleanly shutting down...\n";
|
||||||
|
|
||||||
|
|
11
systems.cfg
11
systems.cfg
|
@ -2,3 +2,14 @@ NAME=Super Nintendo Entertainment System
|
||||||
PATH=./snes/
|
PATH=./snes/
|
||||||
EXTENSION=.smc
|
EXTENSION=.smc
|
||||||
COMMAND=retroarch -L ~/libretro-pocketsnes.so %ROM%
|
COMMAND=retroarch -L ~/libretro-pocketsnes.so %ROM%
|
||||||
|
|
||||||
|
NAME=MAME
|
||||||
|
PATH=./mame/
|
||||||
|
EXTENSION=.zip
|
||||||
|
COMMAND=echo %ROM%
|
||||||
|
|
||||||
|
# This is just a dud to test error handling. Also, comment support! Woo!
|
||||||
|
NAME=Fake System
|
||||||
|
PATH=./fakedir/
|
||||||
|
EXTENSION=.fake
|
||||||
|
COMMAND=this will never be called
|
||||||
|
|
Loading…
Reference in a new issue