HdPack loading fixes
This commit is contained in:
parent
26b64330e3
commit
a680f799e1
3 changed files with 1299 additions and 104 deletions
|
@ -13,6 +13,15 @@
|
||||||
|
|
||||||
#define checkConstraint(x, y) if(!(x)) { MessageManager::Log(y); return; }
|
#define checkConstraint(x, y) if(!(x)) { MessageManager::Log(y); return; }
|
||||||
|
|
||||||
|
static const char windowsSlash = '\\';
|
||||||
|
static const char unixSlash = '/';
|
||||||
|
#if defined(_WIN32)
|
||||||
|
#define convertPathToNative(filepath) std::replace(filepath.begin(), filepath.end(), unixSlash, windowsSlash)
|
||||||
|
#else
|
||||||
|
#define convertPathToNative(filepath) std::replace(filepath.begin(), filepath.end(), windowsSlash, unixSlash)
|
||||||
|
#endif
|
||||||
|
#define convertPathToNativeVector(vector, idx) if (vector.size() > idx) { convertPathToNative(vector[idx]); }
|
||||||
|
|
||||||
HdPackLoader::HdPackLoader()
|
HdPackLoader::HdPackLoader()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -165,14 +174,17 @@ bool HdPackLoader::LoadPack()
|
||||||
ProcessOverscanTag(tokens);
|
ProcessOverscanTag(tokens);
|
||||||
} else if(lineContent.substr(0, 5) == "<img>") {
|
} else if(lineContent.substr(0, 5) == "<img>") {
|
||||||
lineContent = lineContent.substr(5);
|
lineContent = lineContent.substr(5);
|
||||||
|
convertPathToNative(lineContent);
|
||||||
if(!ProcessImgTag(lineContent)) {
|
if(!ProcessImgTag(lineContent)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if(lineContent.substr(0, 7) == "<patch>") {
|
} else if(lineContent.substr(0, 7) == "<patch>") {
|
||||||
tokens = StringUtilities::Split(lineContent.substr(7), ',');
|
tokens = StringUtilities::Split(lineContent.substr(7), ',');
|
||||||
|
convertPathToNativeVector(tokens, 0);
|
||||||
ProcessPatchTag(tokens);
|
ProcessPatchTag(tokens);
|
||||||
} else if(lineContent.substr(0, 12) == "<background>") {
|
} else if(lineContent.substr(0, 12) == "<background>") {
|
||||||
tokens = StringUtilities::Split(lineContent.substr(12), ',');
|
tokens = StringUtilities::Split(lineContent.substr(12), ',');
|
||||||
|
convertPathToNativeVector(tokens, 0);
|
||||||
ProcessBackgroundTag(tokens, conditions);
|
ProcessBackgroundTag(tokens, conditions);
|
||||||
} else if(lineContent.substr(0, 11) == "<condition>") {
|
} else if(lineContent.substr(0, 11) == "<condition>") {
|
||||||
tokens = StringUtilities::Split(lineContent.substr(11), ',');
|
tokens = StringUtilities::Split(lineContent.substr(11), ',');
|
||||||
|
@ -186,9 +198,11 @@ bool HdPackLoader::LoadPack()
|
||||||
ProcessOptionTag(tokens);
|
ProcessOptionTag(tokens);
|
||||||
} else if(lineContent.substr(0, 5) == "<bgm>") {
|
} else if(lineContent.substr(0, 5) == "<bgm>") {
|
||||||
tokens = StringUtilities::Split(lineContent.substr(5), ',');
|
tokens = StringUtilities::Split(lineContent.substr(5), ',');
|
||||||
|
convertPathToNativeVector(tokens, 2);
|
||||||
ProcessBgmTag(tokens);
|
ProcessBgmTag(tokens);
|
||||||
} else if(lineContent.substr(0, 5) == "<sfx>") {
|
} else if(lineContent.substr(0, 5) == "<sfx>") {
|
||||||
tokens = StringUtilities::Split(lineContent.substr(5), ',');
|
tokens = StringUtilities::Split(lineContent.substr(5), ',');
|
||||||
|
convertPathToNativeVector(tokens, 2);
|
||||||
ProcessSfxTag(tokens);
|
ProcessSfxTag(tokens);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -242,8 +242,18 @@ extern "C" {
|
||||||
{ 0 },
|
{ 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct retro_system_content_info_override content_overrides[] = {
|
||||||
|
{
|
||||||
|
"nes|fds|unf|unif", /* extensions */
|
||||||
|
false, /* need_fullpath */
|
||||||
|
false /* persistent_data */
|
||||||
|
},
|
||||||
|
{ NULL, false, false }
|
||||||
|
};
|
||||||
|
|
||||||
retroEnv(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars);
|
retroEnv(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars);
|
||||||
retroEnv(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports);
|
retroEnv(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports);
|
||||||
|
retroEnv(RETRO_ENVIRONMENT_SET_CONTENT_INFO_OVERRIDE, (void*)content_overrides);
|
||||||
}
|
}
|
||||||
|
|
||||||
RETRO_API void retro_set_video_refresh(retro_video_refresh_t sendFrame)
|
RETRO_API void retro_set_video_refresh(retro_video_refresh_t sendFrame)
|
||||||
|
@ -1034,7 +1044,43 @@ extern "C" {
|
||||||
_console->GetSettings()->SetControllerType(2, ControllerType::None);
|
_console->GetSettings()->SetControllerType(2, ControllerType::None);
|
||||||
_console->GetSettings()->SetControllerType(3, ControllerType::None);
|
_console->GetSettings()->SetControllerType(3, ControllerType::None);
|
||||||
|
|
||||||
VirtualFile romData(game->data, game->size, game->path);
|
// Attempt to fetch extended game info
|
||||||
|
const struct retro_game_info_ext *gameExt = NULL;
|
||||||
|
const void *gameData = NULL;
|
||||||
|
size_t gameSize = 0;
|
||||||
|
string gamePath("");
|
||||||
|
if (retroEnv(RETRO_ENVIRONMENT_GET_GAME_INFO_EXT, &gameExt)) {
|
||||||
|
gameData = gameExt->data;
|
||||||
|
gameSize = gameExt->size;
|
||||||
|
if (gameExt->file_in_archive) {
|
||||||
|
// We don't have a 'physical' file in this
|
||||||
|
// case, but the core still needs a filename
|
||||||
|
// in order to detect associated content
|
||||||
|
// (i.e. HdPacks). We therefore fake it, using
|
||||||
|
// the content directory, canonical content
|
||||||
|
// name, and content file extension
|
||||||
|
#if defined(_WIN32)
|
||||||
|
char slash = '\\';
|
||||||
|
#else
|
||||||
|
char slash = '/';
|
||||||
|
#endif
|
||||||
|
gamePath = string(gameExt->dir) +
|
||||||
|
string(1, slash) +
|
||||||
|
string(gameExt->name) +
|
||||||
|
"." +
|
||||||
|
string(gameExt->ext);
|
||||||
|
} else {
|
||||||
|
gamePath = gameExt->full_path;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// No extended game info; all we have is the
|
||||||
|
// content fullpath from the retro_game_info
|
||||||
|
// struct
|
||||||
|
gamePath = game->path;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load content
|
||||||
|
VirtualFile romData(gameData, gameSize, gamePath);
|
||||||
bool result = _console->Initialize(romData);
|
bool result = _console->Initialize(romData);
|
||||||
|
|
||||||
if(result) {
|
if(result) {
|
||||||
|
@ -1084,7 +1130,9 @@ extern "C" {
|
||||||
|
|
||||||
info->library_name = "Mesen";
|
info->library_name = "Mesen";
|
||||||
info->library_version = _mesenVersion.c_str();
|
info->library_version = _mesenVersion.c_str();
|
||||||
info->need_fullpath = false;
|
// need_fullpath is required since HdPacks are
|
||||||
|
// identified via the rom file name
|
||||||
|
info->need_fullpath = true;
|
||||||
info->valid_extensions = "nes|fds|unf|unif";
|
info->valid_extensions = "nes|fds|unf|unif";
|
||||||
info->block_extract = false;
|
info->block_extract = false;
|
||||||
}
|
}
|
||||||
|
|
1337
Libretro/libretro.h
1337
Libretro/libretro.h
File diff suppressed because it is too large
Load diff
Loading…
Add table
Reference in a new issue