Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
65601dd130
|
@ -110,6 +110,7 @@ set(MAIN_HEADERS
|
||||||
src/flashable.h
|
src/flashable.h
|
||||||
src/font.h
|
src/font.h
|
||||||
src/input.h
|
src/input.h
|
||||||
|
src/iniconfig.h
|
||||||
src/plane.h
|
src/plane.h
|
||||||
src/scene.h
|
src/scene.h
|
||||||
src/sprite.h
|
src/sprite.h
|
||||||
|
@ -167,6 +168,7 @@ set(MAIN_SOURCE
|
||||||
src/filesystem.cpp
|
src/filesystem.cpp
|
||||||
src/font.cpp
|
src/font.cpp
|
||||||
src/input.cpp
|
src/input.cpp
|
||||||
|
src/iniconfig.cpp
|
||||||
src/plane.cpp
|
src/plane.cpp
|
||||||
src/scene.cpp
|
src/scene.cpp
|
||||||
src/sprite.cpp
|
src/sprite.cpp
|
||||||
|
|
6
mkxp.pro
6
mkxp.pro
|
@ -8,6 +8,10 @@ INCLUDEPATH += . src
|
||||||
|
|
||||||
CONFIG(release, debug|release): DEFINES += NDEBUG
|
CONFIG(release, debug|release): DEFINES += NDEBUG
|
||||||
|
|
||||||
|
CONFIG += c++11
|
||||||
|
# And for older qmake versions..
|
||||||
|
QMAKE_CXXFLAGS += -std=c++11
|
||||||
|
|
||||||
isEmpty(BINDING) {
|
isEmpty(BINDING) {
|
||||||
BINDING = MRI
|
BINDING = MRI
|
||||||
}
|
}
|
||||||
|
@ -89,6 +93,7 @@ HEADERS += \
|
||||||
src/flashable.h \
|
src/flashable.h \
|
||||||
src/font.h \
|
src/font.h \
|
||||||
src/input.h \
|
src/input.h \
|
||||||
|
src/iniconfig.h \
|
||||||
src/plane.h \
|
src/plane.h \
|
||||||
src/scene.h \
|
src/scene.h \
|
||||||
src/sprite.h \
|
src/sprite.h \
|
||||||
|
@ -145,6 +150,7 @@ SOURCES += \
|
||||||
src/filesystem.cpp \
|
src/filesystem.cpp \
|
||||||
src/font.cpp \
|
src/font.cpp \
|
||||||
src/input.cpp \
|
src/input.cpp \
|
||||||
|
src/iniconfig.cpp \
|
||||||
src/plane.cpp \
|
src/plane.cpp \
|
||||||
src/scene.cpp \
|
src/scene.cpp \
|
||||||
src/sprite.cpp \
|
src/sprite.cpp \
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "debugwriter.h"
|
#include "debugwriter.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "sdl-util.h"
|
#include "sdl-util.h"
|
||||||
|
#include "iniconfig.h"
|
||||||
|
|
||||||
#ifdef INI_ENCODING
|
#ifdef INI_ENCODING
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -321,26 +322,32 @@ void Config::readGameINI()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
po::options_description podesc;
|
|
||||||
podesc.add_options()
|
|
||||||
("Game.Title", po::value<std::string>())
|
|
||||||
("Game.Scripts", po::value<std::string>())
|
|
||||||
;
|
|
||||||
|
|
||||||
po::variables_map vm;
|
|
||||||
std::string iniFilename = execName + ".ini";
|
std::string iniFilename = execName + ".ini";
|
||||||
SDLRWStream iniFile(iniFilename.c_str(), "r");
|
SDLRWStream iniFile(iniFilename.c_str(), "r");
|
||||||
|
|
||||||
if (iniFile)
|
if (iniFile)
|
||||||
{
|
{
|
||||||
try
|
INIConfiguration ic;
|
||||||
|
if(ic.load(iniFile.stream()))
|
||||||
{
|
{
|
||||||
po::store(po::parse_config_file(iniFile.stream(), podesc, true), vm);
|
GUARD_ALL( game.title = ic.getStringProperty("Game", "Title"); );
|
||||||
po::notify(vm);
|
GUARD_ALL( game.scripts = ic.getStringProperty("Game", "Scripts"); );
|
||||||
|
|
||||||
|
strReplace(game.scripts, '\\', '/');
|
||||||
|
|
||||||
|
if (game.title.empty())
|
||||||
|
{
|
||||||
|
Debug() << iniFilename + ": Could not find Game.Title property";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (game.scripts.empty())
|
||||||
|
{
|
||||||
|
Debug() << iniFilename + ": Could not find Game.Scripts property";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (po::error &error)
|
else
|
||||||
{
|
{
|
||||||
Debug() << iniFilename + ":" << error.what();
|
Debug() << iniFilename + ": Failed to parse ini file";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -348,11 +355,6 @@ void Config::readGameINI()
|
||||||
Debug() << "FAILED to open" << iniFilename;
|
Debug() << "FAILED to open" << iniFilename;
|
||||||
}
|
}
|
||||||
|
|
||||||
GUARD_ALL( game.title = vm["Game.Title"].as<std::string>(); );
|
|
||||||
GUARD_ALL( game.scripts = vm["Game.Scripts"].as<std::string>(); );
|
|
||||||
|
|
||||||
strReplace(game.scripts, '\\', '/');
|
|
||||||
|
|
||||||
#ifdef INI_ENCODING
|
#ifdef INI_ENCODING
|
||||||
/* Can add more later */
|
/* Can add more later */
|
||||||
const char *languages[] =
|
const char *languages[] =
|
||||||
|
|
|
@ -311,18 +311,32 @@ struct FileSystemPrivate
|
||||||
bool havePathCache;
|
bool havePathCache;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void throwPhysfsError(const char *desc)
|
||||||
|
{
|
||||||
|
PHYSFS_ErrorCode ec = PHYSFS_getLastErrorCode();
|
||||||
|
const char *englishStr = PHYSFS_getErrorByCode(ec);
|
||||||
|
|
||||||
|
throw Exception(Exception::PHYSFSError, "%s: %s", desc, englishStr);
|
||||||
|
}
|
||||||
|
|
||||||
FileSystem::FileSystem(const char *argv0,
|
FileSystem::FileSystem(const char *argv0,
|
||||||
bool allowSymlinks)
|
bool allowSymlinks)
|
||||||
{
|
{
|
||||||
|
if (PHYSFS_init(argv0) == 0)
|
||||||
|
throwPhysfsError("Error initializing PhysFS");
|
||||||
|
|
||||||
|
/* One error (=return 0) turns the whole product to 0 */
|
||||||
|
int er = 1;
|
||||||
|
er *= PHYSFS_registerArchiver(&RGSS1_Archiver);
|
||||||
|
er *= PHYSFS_registerArchiver(&RGSS2_Archiver);
|
||||||
|
er *= PHYSFS_registerArchiver(&RGSS3_Archiver);
|
||||||
|
|
||||||
|
if (er == 0)
|
||||||
|
throwPhysfsError("Error registering PhysFS RGSS archiver");
|
||||||
|
|
||||||
p = new FileSystemPrivate;
|
p = new FileSystemPrivate;
|
||||||
p->havePathCache = false;
|
p->havePathCache = false;
|
||||||
|
|
||||||
PHYSFS_init(argv0);
|
|
||||||
|
|
||||||
PHYSFS_registerArchiver(&RGSS1_Archiver);
|
|
||||||
PHYSFS_registerArchiver(&RGSS2_Archiver);
|
|
||||||
PHYSFS_registerArchiver(&RGSS3_Archiver);
|
|
||||||
|
|
||||||
if (allowSymlinks)
|
if (allowSymlinks)
|
||||||
PHYSFS_permitSymbolicLinks(1);
|
PHYSFS_permitSymbolicLinks(1);
|
||||||
}
|
}
|
||||||
|
@ -469,7 +483,7 @@ fontSetEnumCB (void *data, const char *dir, const char *fname)
|
||||||
const char *ext = findExt(fname);
|
const char *ext = findExt(fname);
|
||||||
|
|
||||||
if (!ext)
|
if (!ext)
|
||||||
return PHYSFS_ENUM_STOP;
|
return PHYSFS_ENUM_OK;
|
||||||
|
|
||||||
char lowExt[8];
|
char lowExt[8];
|
||||||
size_t i;
|
size_t i;
|
||||||
|
@ -479,7 +493,7 @@ fontSetEnumCB (void *data, const char *dir, const char *fname)
|
||||||
lowExt[i] = '\0';
|
lowExt[i] = '\0';
|
||||||
|
|
||||||
if (strcmp(lowExt, "ttf") && strcmp(lowExt, "otf"))
|
if (strcmp(lowExt, "ttf") && strcmp(lowExt, "otf"))
|
||||||
return PHYSFS_ENUM_STOP;
|
return PHYSFS_ENUM_OK;
|
||||||
|
|
||||||
char filename[512];
|
char filename[512];
|
||||||
snprintf(filename, sizeof(filename), "%s/%s", dir, fname);
|
snprintf(filename, sizeof(filename), "%s/%s", dir, fname);
|
||||||
|
|
|
@ -6,10 +6,6 @@
|
||||||
|
|
||||||
#include "debugwriter.h"
|
#include "debugwriter.h"
|
||||||
|
|
||||||
#ifdef SHARED_FLUID
|
|
||||||
#include <fluidsynth.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if __LINUX__ || __ANDROID__
|
#if __LINUX__ || __ANDROID__
|
||||||
#define FLUID_LIB "libfluidsynth.so.1"
|
#define FLUID_LIB "libfluidsynth.so.1"
|
||||||
#elif __MACOSX__
|
#elif __MACOSX__
|
||||||
|
|
|
@ -1,6 +1,12 @@
|
||||||
#ifndef FLUIDFUN_H
|
#ifndef FLUIDFUN_H
|
||||||
#define FLUIDFUN_H
|
#define FLUIDFUN_H
|
||||||
|
|
||||||
|
#ifdef SHARED_FLUID
|
||||||
|
# include <fluidsynth.h>
|
||||||
|
#else
|
||||||
|
# define FLUIDSYNTH_VERSION_MAJOR 2
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct _fluid_hashtable_t fluid_settings_t;
|
typedef struct _fluid_hashtable_t fluid_settings_t;
|
||||||
typedef struct _fluid_synth_t fluid_synth_t;
|
typedef struct _fluid_synth_t fluid_synth_t;
|
||||||
|
|
||||||
|
@ -19,7 +25,12 @@ typedef int (*FLUIDSYNTHPROGRAMCHANGEPROC)(fluid_synth_t* synth, int chan, int p
|
||||||
typedef fluid_settings_t* (*NEWFLUIDSETTINGSPROC)(void);
|
typedef fluid_settings_t* (*NEWFLUIDSETTINGSPROC)(void);
|
||||||
typedef fluid_synth_t* (*NEWFLUIDSYNTHPROC)(fluid_settings_t* settings);
|
typedef fluid_synth_t* (*NEWFLUIDSYNTHPROC)(fluid_settings_t* settings);
|
||||||
typedef void (*DELETEFLUIDSETTINGSPROC)(fluid_settings_t* settings);
|
typedef void (*DELETEFLUIDSETTINGSPROC)(fluid_settings_t* settings);
|
||||||
|
|
||||||
|
#if FLUIDSYNTH_VERSION_MAJOR == 1
|
||||||
typedef int (*DELETEFLUIDSYNTHPROC)(fluid_synth_t* synth);
|
typedef int (*DELETEFLUIDSYNTHPROC)(fluid_synth_t* synth);
|
||||||
|
#else
|
||||||
|
typedef void (*DELETEFLUIDSYNTHPROC)(fluid_synth_t* synth);
|
||||||
|
#endif
|
||||||
|
|
||||||
#define FLUID_FUNCS \
|
#define FLUID_FUNCS \
|
||||||
FLUID_FUN(settings_setnum, FLUIDSETTINGSSETNUMPROC) \
|
FLUID_FUN(settings_setnum, FLUIDSETTINGSSETNUMPROC) \
|
||||||
|
|
|
@ -759,6 +759,9 @@ void Graphics::transition(int duration,
|
||||||
|
|
||||||
setBrightness(255);
|
setBrightness(255);
|
||||||
|
|
||||||
|
/* Capture new scene */
|
||||||
|
p->screen.composite();
|
||||||
|
|
||||||
/* The PP frontbuffer will hold the current scene after the
|
/* The PP frontbuffer will hold the current scene after the
|
||||||
* composition step. Since the backbuffer is unused during
|
* composition step. Since the backbuffer is unused during
|
||||||
* the transition, we can reuse it as the target buffer for
|
* the transition, we can reuse it as the target buffer for
|
||||||
|
@ -766,9 +769,6 @@ void Graphics::transition(int duration,
|
||||||
TEXFBO ¤tScene = p->screen.getPP().frontBuffer();
|
TEXFBO ¤tScene = p->screen.getPP().frontBuffer();
|
||||||
TEXFBO &transBuffer = p->screen.getPP().backBuffer();
|
TEXFBO &transBuffer = p->screen.getPP().backBuffer();
|
||||||
|
|
||||||
/* Capture new scene */
|
|
||||||
p->screen.composite();
|
|
||||||
|
|
||||||
/* If no transition bitmap is provided,
|
/* If no transition bitmap is provided,
|
||||||
* we can use a simplified shader */
|
* we can use a simplified shader */
|
||||||
TransShader &transShader = shState->shaders().trans;
|
TransShader &transShader = shState->shaders().trans;
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
#include "iniconfig.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
std::string toLowerCase(const std::string& str)
|
||||||
|
{
|
||||||
|
std::string lower = str;
|
||||||
|
std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
|
||||||
|
return lower;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string trim(const std::string& str, const std::string& chars = "\t\n\v\f\r ")
|
||||||
|
{
|
||||||
|
std::string trimmed = str;
|
||||||
|
trimmed.erase(trimmed.find_last_not_of(chars) + 1);
|
||||||
|
trimmed.erase(0, trimmed.find_first_not_of(chars));
|
||||||
|
return trimmed;
|
||||||
|
}
|
||||||
|
|
||||||
|
INIConfiguration::Section::Section (const std::string& sname) : m_Name (sname), m_PropertyMap()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool INIConfiguration::Section::getStringProperty (const std::string& name, std::string& outPropStr) const
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
outPropStr = m_PropertyMap.at(toLowerCase(name)).m_Value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (std::out_of_range& oorexcept)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool INIConfiguration::load (std::istream& is)
|
||||||
|
{
|
||||||
|
if (!is.good())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string currSectionName;
|
||||||
|
|
||||||
|
std::string line;
|
||||||
|
std::getline (is, line);
|
||||||
|
|
||||||
|
while (!is.eof() && !is.bad())
|
||||||
|
{
|
||||||
|
if (line[0] == '[')
|
||||||
|
{
|
||||||
|
currSectionName = line.substr (1, line.find_last_of (']') - 1);
|
||||||
|
}
|
||||||
|
else if (line[0] != '#' && line.length() > 2)
|
||||||
|
{
|
||||||
|
int crloc = line.length() - 1;
|
||||||
|
|
||||||
|
if (crloc >= 0 && line[crloc] == '\r') //check for Windows-style newline
|
||||||
|
line.resize (crloc); //and correct
|
||||||
|
|
||||||
|
size_t equalsPos = line.find_first_of ("=");
|
||||||
|
|
||||||
|
if (equalsPos != std::string::npos)
|
||||||
|
{
|
||||||
|
std::string key = line.substr (0, equalsPos);
|
||||||
|
std::string val = line.substr (equalsPos + 1);
|
||||||
|
|
||||||
|
addProperty (currSectionName, key , val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::getline (is, line);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is.bad())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string INIConfiguration::getStringProperty(const std::string& sname, const std::string& name, const std::string& def) const
|
||||||
|
{
|
||||||
|
auto sectionIt = m_SectionMap.find(toLowerCase(sname));
|
||||||
|
|
||||||
|
if (sectionIt != m_SectionMap.end())
|
||||||
|
{
|
||||||
|
std::string prop;
|
||||||
|
|
||||||
|
if(sectionIt->second.getStringProperty(name, prop))
|
||||||
|
{
|
||||||
|
return prop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
|
||||||
|
void INIConfiguration::addProperty (const std::string& sname, const std::string& name, const std::string& val)
|
||||||
|
{
|
||||||
|
if (m_SectionMap.find (toLowerCase(sname)) == m_SectionMap.end())
|
||||||
|
{
|
||||||
|
m_SectionMap.emplace (toLowerCase(sname), Section (sname));
|
||||||
|
}
|
||||||
|
|
||||||
|
Section::Property p;
|
||||||
|
p.m_Name = trim(name);
|
||||||
|
p.m_Value = trim(val);
|
||||||
|
|
||||||
|
m_SectionMap.at (toLowerCase(sname)).m_PropertyMap[toLowerCase(p.m_Name)] = p;
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
#ifndef INICONFIG_H
|
||||||
|
#define INICONFIG_H
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
class INIConfiguration
|
||||||
|
{
|
||||||
|
class Section
|
||||||
|
{
|
||||||
|
friend class INIConfiguration;
|
||||||
|
|
||||||
|
struct Property
|
||||||
|
{
|
||||||
|
std::string m_Name;
|
||||||
|
std::string m_Value;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::map<std::string, Property> property_map;
|
||||||
|
public:
|
||||||
|
Section (const Section& s) = default;
|
||||||
|
Section (Section&& s) = default;
|
||||||
|
|
||||||
|
bool getStringProperty (const std::string& name, std::string& outPropStr) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
explicit Section (const std::string& name);
|
||||||
|
|
||||||
|
std::string m_Name;
|
||||||
|
property_map m_PropertyMap;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::map<std::string, Section> section_map;
|
||||||
|
public:
|
||||||
|
bool load (std::istream& inStream);
|
||||||
|
|
||||||
|
std::string getStringProperty(const std::string& sname, const std::string& name, const std::string& def = "") const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void addProperty (const std::string& sname, const std::string& name, const std::string& val);
|
||||||
|
|
||||||
|
private:
|
||||||
|
section_map m_SectionMap;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // INICONFIG_H
|
|
@ -35,6 +35,9 @@
|
||||||
#include "quadarray.h"
|
#include "quadarray.h"
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#ifndef M_PI
|
||||||
|
# define M_PI 3.14159265358979323846
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <SDL_rect.h>
|
#include <SDL_rect.h>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue