mirror of
https://github.com/d0k3/GodMode9.git
synced 2025-06-26 13:42:47 +00:00
184 lines
4.9 KiB
C
184 lines
4.9 KiB
C
|
#ifndef NO_LUA
|
||
|
#include "gm9lua.h"
|
||
|
#include "utils.h"
|
||
|
#include "fs.h"
|
||
|
#include "language.h"
|
||
|
#include "ui.h"
|
||
|
#include "game.h"
|
||
|
#include "ips.h"
|
||
|
#include "bps.h"
|
||
|
|
||
|
static int title_decrypt(lua_State* L) {
|
||
|
CheckLuaArgCount(L, 1, "title.decrypt");
|
||
|
const char* path = luaL_checkstring(L, 1);
|
||
|
const char* whichfailed = "";
|
||
|
|
||
|
u64 filetype = IdentifyFileType(path);
|
||
|
bool ret;
|
||
|
if (filetype & BIN_KEYDB) {
|
||
|
ret = (CryptAesKeyDb(path, true, false) == 0);
|
||
|
whichfailed = "CryptAesKeyDb";
|
||
|
} else {
|
||
|
ret = (CryptGameFile(path, true, false) == 0);
|
||
|
whichfailed = "CryptGameFile";
|
||
|
}
|
||
|
|
||
|
if (!ret) {
|
||
|
return luaL_error(L, "%s failed on %s", whichfailed, path);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int title_encrypt(lua_State* L) {
|
||
|
CheckLuaArgCount(L, 1, "title.encrypt");
|
||
|
const char* path = luaL_checkstring(L, 1);
|
||
|
const char* whichfailed = "";
|
||
|
|
||
|
u64 filetype = IdentifyFileType(path);
|
||
|
bool ret;
|
||
|
if (filetype & BIN_KEYDB) {
|
||
|
ret = (CryptAesKeyDb(path, true, true) == 0);
|
||
|
whichfailed = "CryptAesKeyDb";
|
||
|
} else {
|
||
|
ret = (CryptGameFile(path, true, true) == 0);
|
||
|
whichfailed = "CryptGameFile";
|
||
|
}
|
||
|
|
||
|
if (!ret) {
|
||
|
return luaL_error(L, "%s failed on %s", whichfailed, path);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int title_install(lua_State* L) {
|
||
|
bool extra = CheckLuaArgCountPlusExtra(L, 1, "title.install");
|
||
|
const char* path = luaL_checkstring(L, 1);
|
||
|
|
||
|
u32 flags = 0;
|
||
|
if (extra) {
|
||
|
flags = GetFlagsFromTable(L, 2, flags, TO_EMUNAND);
|
||
|
};
|
||
|
|
||
|
bool ret = (InstallGameFile(path, (flags & TO_EMUNAND)) == 0);
|
||
|
if (!ret) {
|
||
|
return luaL_error(L, "InstallGameFile failed on %s", path);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int title_build_cia(lua_State* L) {
|
||
|
bool extra = CheckLuaArgCountPlusExtra(L, 1, "title.build_cia");
|
||
|
const char* path = luaL_checkstring(L, 1);
|
||
|
|
||
|
u32 flags = 0;
|
||
|
if (extra) {
|
||
|
flags = GetFlagsFromTable(L, 2, flags, LEGIT);
|
||
|
};
|
||
|
|
||
|
bool ret = (BuildCiaFromGameFile(path, (flags & LEGIT)) == 0);
|
||
|
if (!ret) {
|
||
|
return luaL_error(L, "BuildCiaFromGameFile failed on %s", path);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int title_extract_code(lua_State* L) {
|
||
|
CheckLuaArgCount(L, 2, "title.extract_code");
|
||
|
const char* path_src = luaL_checkstring(L, 1);
|
||
|
const char* path_dst = luaL_checkstring(L, 2);
|
||
|
|
||
|
u64 filetype = IdentifyFileType(path_src);
|
||
|
if (!FTYPE_HASCODE(filetype)) {
|
||
|
return luaL_error(L, "%s does not have code", path_src);
|
||
|
} else {
|
||
|
CheckWritePermissionsLuaError(L, path_dst);
|
||
|
ShowString("%s", STR_EXTRACTING_DOT_CODE);
|
||
|
bool ret = (ExtractCodeFromCxiFile(path_src, path_dst, NULL) == 0);
|
||
|
if (!ret) {
|
||
|
return luaL_error(L, "failed to extract code from %s", path_src);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int title_compress_code(lua_State* L) {
|
||
|
CheckLuaArgCount(L, 2, "title.compress_code");
|
||
|
const char* path_src = luaL_checkstring(L, 1);
|
||
|
const char* path_dst = luaL_checkstring(L, 2);
|
||
|
|
||
|
CheckWritePermissionsLuaError(L, path_dst);
|
||
|
ShowString("%s", STR_COMPRESSING_DOT_CODE);
|
||
|
bool ret = (CompressCode(path_src, path_dst) == 0);
|
||
|
if (!ret) {
|
||
|
return luaL_error(L, "failed to compress code from %s", path_src);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int title_apply_ips(lua_State* L) {
|
||
|
CheckLuaArgCount(L, 3, "title.apply_ips");
|
||
|
const char* path_patch = luaL_checkstring(L, 1);
|
||
|
const char* path_src = luaL_checkstring(L, 2);
|
||
|
const char* path_target = luaL_checkstring(L, 3);
|
||
|
|
||
|
bool ret = (ApplyIPSPatch(path_patch, path_src, path_target) == 0);
|
||
|
if (!ret) {
|
||
|
return luaL_error(L, "ApplyIPSPatch failed");
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int title_apply_bps(lua_State* L) {
|
||
|
CheckLuaArgCount(L, 3, "title.apply_bps");
|
||
|
const char* path_patch = luaL_checkstring(L, 1);
|
||
|
const char* path_src = luaL_checkstring(L, 2);
|
||
|
const char* path_target = luaL_checkstring(L, 3);
|
||
|
|
||
|
bool ret = (ApplyBPSPatch(path_patch, path_src, path_target) == 0);
|
||
|
if (!ret) {
|
||
|
return luaL_error(L, "ApplyBPSPatch failed");
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int title_apply_bpm(lua_State* L) {
|
||
|
CheckLuaArgCount(L, 3, "title.apply_bpm");
|
||
|
const char* path_patch = luaL_checkstring(L, 1);
|
||
|
const char* path_src = luaL_checkstring(L, 2);
|
||
|
const char* path_target = luaL_checkstring(L, 3);
|
||
|
|
||
|
bool ret = (ApplyBPMPatch(path_patch, path_src, path_target) == 0);
|
||
|
if (!ret) {
|
||
|
return luaL_error(L, "ApplyBPMPatch failed");
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static const luaL_Reg title_lib[] = {
|
||
|
{"decrypt", title_decrypt},
|
||
|
{"encrypt", title_encrypt},
|
||
|
{"install", title_install},
|
||
|
{"build_cia", title_build_cia},
|
||
|
{"extract_code", title_extract_code},
|
||
|
{"compress_code", title_compress_code},
|
||
|
{"apply_ips", title_apply_ips},
|
||
|
{"apply_bps", title_apply_bps},
|
||
|
{"apply_bpm", title_apply_bpm},
|
||
|
{NULL, NULL}
|
||
|
};
|
||
|
|
||
|
int gm9lua_open_title(lua_State* L) {
|
||
|
luaL_newlib(L, title_lib);
|
||
|
return 1;
|
||
|
}
|
||
|
#endif
|