MDA loading on non-Windows platforms

- On Android, MDAs are now loaded from APK assets.
- On Mac/Linux, MDAs are now installed by 'make install', and loaded
  from installation directory.
- MDAs and fonts are moved into a new toplevel directory, resources/.
This commit is contained in:
kichikuou
2020-05-24 16:39:18 +09:00
parent 47e86d9a05
commit b683924564
49 changed files with 94 additions and 107 deletions
+1 -1
View File
@@ -35,7 +35,7 @@ android {
if (!project.hasProperty('EXCLUDE_NATIVE_LIBS')) {
sourceSets.main {
jniLibs.srcDir 'libs'
assets.srcDir '../../fonts'
assets.srcDir '../../resources'
}
aaptOptions {
// Disable asset compression for fonts.
+9 -8
View File
@@ -17,6 +17,7 @@ if (ANDROID)
android/mako.cpp
)
target_link_libraries(system3 PRIVATE SDL2 SDL2_ttf)
set(DEFAULT_FONT_PATH fonts/)
elseif (EMSCRIPTEN)
add_executable(system3)
@@ -49,12 +50,6 @@ else() # NOT (ANDROID OR EMSCRIPTEN)
pkg_check_modules(SDL2TTF REQUIRED IMPORTED_TARGET SDL2_ttf)
target_link_libraries(system3 PRIVATE PkgConfig::SDL2 PkgConfig::SDL2TTF)
set(DEFAULT_FONT_PATH ${CMAKE_INSTALL_PREFIX}/share/system3/fonts/)
install(TARGETS system3 RUNTIME DESTINATION bin)
install(FILES ../fonts/MTLc3m.ttf ../fonts/MTLc3m.ttf.license
DESTINATION share/system3/fonts)
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
target_sources(system3 PRIVATE win/nact_win.cpp win/mako.cpp res3/Script1.rc)
target_link_libraries(system3 PRIVATE winmm)
@@ -62,6 +57,12 @@ else() # NOT (ANDROID OR EMSCRIPTEN)
pkg_check_modules(SDL2MIXER REQUIRED IMPORTED_TARGET SDL2_mixer)
target_sources(system3 PRIVATE linux/nact_linux.cpp linux/mako.cpp)
target_link_libraries(system3 PRIVATE PkgConfig::SDL2MIXER)
set(RESOURCE_PATH ${CMAKE_INSTALL_PREFIX}/share/system3/)
set(DEFAULT_FONT_PATH ${CMAKE_INSTALL_PREFIX}/share/system3/fonts/)
install(TARGETS system3 RUNTIME DESTINATION bin)
install(DIRECTORY ../resources/
DESTINATION share/system3
FILES_MATCHING PATTERN *.MDA)
endif()
endif()
@@ -93,6 +94,6 @@ target_sources(system3 PRIVATE
target_compile_definitions(system3 PRIVATE
$<$<CONFIG:Debug>:_DEBUG_CONSOLE>
DEFAULT_FONT_PATH="${DEFAULT_FONT_PATH}")
DEFAULT_FONT_PATH="${DEFAULT_FONT_PATH}"
RESOURCE_PATH="${RESOURCE_PATH}")
target_include_directories(system3 PRIVATE . sys)
target_compile_definitions(system3 PRIVATE)
+43 -43
View File
@@ -92,49 +92,49 @@ IDI_ICON1 ICON DISCARDABLE "icon1.ico"
// MDA
//
AMUS_AB.MDA MDA DISCARDABLE "AMUS_AB.MDA"
AMUS_AL1.MDA MDA DISCARDABLE "AMUS_AL1.MDA"
AMUS_AL2.MDA MDA DISCARDABLE "AMUS_AL2.MDA"
AMUS_AL3.MDA MDA DISCARDABLE "AMUS_AL3.MDA"
AMUS_ALL.MDA MDA DISCARDABLE "AMUS_ALL.MDA"
AMUS_AMB.MDA MDA DISCARDABLE "AMUS_AMB.MDA"
AMUS_AT.MDA MDA DISCARDABLE "AMUS_AT.MDA"
AMUS_AYM.MDA MDA DISCARDABLE "AMUS_AYM.MDA"
AMUS_BEE.MDA MDA DISCARDABLE "AMUS_BEE.MDA"
AMUS_CRS.MDA MDA DISCARDABLE "AMUS_CRS.MDA"
AMUS_DLK.MDA MDA DISCARDABLE "AMUS_DLK.MDA"
AMUS_DPS.MDA MDA DISCARDABLE "AMUS_DPS.MDA"
AMUS_DRS.MDA MDA DISCARDABLE "AMUS_DRS.MDA"
AMUS_INT.MDA MDA DISCARDABLE "AMUS_INT.MDA"
AMUS_KNG.MDA MDA DISCARDABLE "AMUS_KNG.MDA"
AMUS_LP2.MDA MDA DISCARDABLE "AMUS_LP2.MDA"
AMUS_MGN.MDA MDA DISCARDABLE "AMUS_MGN.MDA"
AMUS_OTM.MDA MDA DISCARDABLE "AMUS_OTM.MDA"
AMUS_OY.MDA MDA DISCARDABLE "AMUS_OY.MDA"
AMUS_PSG.MDA MDA DISCARDABLE "AMUS_PSG.MDA"
AMUS_R3H.MDA MDA DISCARDABLE "AMUS_R3H.MDA"
AMUS_R4.MDA MDA DISCARDABLE "AMUS_R4.MDA"
AMUS_R41.MDA MDA DISCARDABLE "AMUS_R41.MDA"
AMUS_R42.MDA MDA DISCARDABLE "AMUS_R42.MDA"
AMUS_RG2.MDA MDA DISCARDABLE "AMUS_RG2.MDA"
AMUS_SDP.MDA MDA DISCARDABLE "AMUS_SDP.MDA"
AMUS_SG.MDA MDA DISCARDABLE "AMUS_SG.MDA"
AMUS_T1.MDA MDA DISCARDABLE "AMUS_T1.MDA"
AMUS_T2.MDA MDA DISCARDABLE "AMUS_T2.MDA"
AMUS_VX.MDA MDA DISCARDABLE "AMUS_VX.MDA"
BMUS_AKA.MDA MDA DISCARDABLE "BMUS_AKA.MDA"
BMUS_ANT.MDA MDA DISCARDABLE "BMUS_ANT.MDA"
BMUS_FAH.MDA MDA DISCARDABLE "BMUS_FAH.MDA"
BMUS_KAM.MDA MDA DISCARDABLE "BMUS_KAM.MDA"
BMUS_KAT.MDA MDA DISCARDABLE "BMUS_KAT.MDA"
BMUS_MTK.MDA MDA DISCARDABLE "BMUS_MTK.MDA"
BMUS_NAI.MDA MDA DISCARDABLE "BMUS_NAI.MDA"
BMUS_NOB.MDA MDA DISCARDABLE "BMUS_NOB.MDA"
BMUS_RAB.MDA MDA DISCARDABLE "BMUS_RAB.MDA"
BMUS_SIN.MDA MDA DISCARDABLE "BMUS_SIN.MDA"
BMUS_SOT.MDA MDA DISCARDABLE "BMUS_SOT.MDA"
BMUS_TNM.MDA MDA DISCARDABLE "BMUS_TNM.MDA"
CMUS_T1.MDA MDA DISCARDABLE "CMUS_T1.MDA"
AMUS_AB.MDA MDA DISCARDABLE "../../resources/mda/AMUS_AB.MDA"
AMUS_AL1.MDA MDA DISCARDABLE "../../resources/mda/AMUS_AL1.MDA"
AMUS_AL2.MDA MDA DISCARDABLE "../../resources/mda/AMUS_AL2.MDA"
AMUS_AL3.MDA MDA DISCARDABLE "../../resources/mda/AMUS_AL3.MDA"
AMUS_ALL.MDA MDA DISCARDABLE "../../resources/mda/AMUS_ALL.MDA"
AMUS_AMB.MDA MDA DISCARDABLE "../../resources/mda/AMUS_AMB.MDA"
AMUS_AT.MDA MDA DISCARDABLE "../../resources/mda/AMUS_AT.MDA"
AMUS_AYM.MDA MDA DISCARDABLE "../../resources/mda/AMUS_AYM.MDA"
AMUS_BEE.MDA MDA DISCARDABLE "../../resources/mda/AMUS_BEE.MDA"
AMUS_CRS.MDA MDA DISCARDABLE "../../resources/mda/AMUS_CRS.MDA"
AMUS_DLK.MDA MDA DISCARDABLE "../../resources/mda/AMUS_DLK.MDA"
AMUS_DPS.MDA MDA DISCARDABLE "../../resources/mda/AMUS_DPS.MDA"
AMUS_DRS.MDA MDA DISCARDABLE "../../resources/mda/AMUS_DRS.MDA"
AMUS_INT.MDA MDA DISCARDABLE "../../resources/mda/AMUS_INT.MDA"
AMUS_KNG.MDA MDA DISCARDABLE "../../resources/mda/AMUS_KNG.MDA"
AMUS_LP2.MDA MDA DISCARDABLE "../../resources/mda/AMUS_LP2.MDA"
AMUS_MGN.MDA MDA DISCARDABLE "../../resources/mda/AMUS_MGN.MDA"
AMUS_OTM.MDA MDA DISCARDABLE "../../resources/mda/AMUS_OTM.MDA"
AMUS_OY.MDA MDA DISCARDABLE "../../resources/mda/AMUS_OY.MDA"
AMUS_PSG.MDA MDA DISCARDABLE "../../resources/mda/AMUS_PSG.MDA"
AMUS_R3H.MDA MDA DISCARDABLE "../../resources/mda/AMUS_R3H.MDA"
AMUS_R4.MDA MDA DISCARDABLE "../../resources/mda/AMUS_R4.MDA"
AMUS_R41.MDA MDA DISCARDABLE "../../resources/mda/AMUS_R41.MDA"
AMUS_R42.MDA MDA DISCARDABLE "../../resources/mda/AMUS_R42.MDA"
AMUS_RG2.MDA MDA DISCARDABLE "../../resources/mda/AMUS_RG2.MDA"
AMUS_SDP.MDA MDA DISCARDABLE "../../resources/mda/AMUS_SDP.MDA"
AMUS_SG.MDA MDA DISCARDABLE "../../resources/mda/AMUS_SG.MDA"
AMUS_T1.MDA MDA DISCARDABLE "../../resources/mda/AMUS_T1.MDA"
AMUS_T2.MDA MDA DISCARDABLE "../../resources/mda/AMUS_T2.MDA"
AMUS_VX.MDA MDA DISCARDABLE "../../resources/mda/AMUS_VX.MDA"
BMUS_AKA.MDA MDA DISCARDABLE "../../resources/mda/BMUS_AKA.MDA"
BMUS_ANT.MDA MDA DISCARDABLE "../../resources/mda/BMUS_ANT.MDA"
BMUS_FAH.MDA MDA DISCARDABLE "../../resources/mda/BMUS_FAH.MDA"
BMUS_KAM.MDA MDA DISCARDABLE "../../resources/mda/BMUS_KAM.MDA"
BMUS_KAT.MDA MDA DISCARDABLE "../../resources/mda/BMUS_KAT.MDA"
BMUS_MTK.MDA MDA DISCARDABLE "../../resources/mda/BMUS_MTK.MDA"
BMUS_NAI.MDA MDA DISCARDABLE "../../resources/mda/BMUS_NAI.MDA"
BMUS_NOB.MDA MDA DISCARDABLE "../../resources/mda/BMUS_NOB.MDA"
BMUS_RAB.MDA MDA DISCARDABLE "../../resources/mda/BMUS_RAB.MDA"
BMUS_SIN.MDA MDA DISCARDABLE "../../resources/mda/BMUS_SIN.MDA"
BMUS_SOT.MDA MDA DISCARDABLE "../../resources/mda/BMUS_SOT.MDA"
BMUS_TNM.MDA MDA DISCARDABLE "../../resources/mda/BMUS_TNM.MDA"
CMUS_T1.MDA MDA DISCARDABLE "../../resources/mda/CMUS_T1.MDA"
/////////////////////////////////////////////////////////////////////////////
//
+41 -55
View File
@@ -7,55 +7,34 @@
#ifdef _WIN32
#include <windows.h>
#undef ERROR
#include <SDL_syswm.h>
#endif
#include "dri.h"
#include "crc32.h"
#include "../fileio.h"
extern SDL_Window* g_window;
namespace {
SDL_RWops* open_resource(const char* name, const char* type) {
#ifdef _WIN32
uint8* load_resource(const char* name, const char* type) {
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
if (!SDL_GetWindowWMInfo(g_window, &info)) {
WARNING("SDL_GetWindowWMInfo failed: %s", SDL_GetError());
return NULL;
}
HINSTANCE hInst = info.info.win.hinstance;
HGLOBAL hGlobal = LoadResource(hInst, FindResource(hInst, name, type));
// On Windows, read from resource.
HINSTANCE hInst = GetModuleHandle(NULL);
HRSRC hRes = FindResource(hInst, name, type);
HGLOBAL hGlobal = LoadResource(hInst, hRes);
if (!hGlobal) {
WARNING("Cannot load resource %s (type: %s)", name, type);
return NULL;
}
return (uint8*)LockResource(hGlobal);
}
void free_resource(uint8* data) {
}
return SDL_RWFromConstMem(LockResource(hGlobal), SizeofResource(hInst, hRes));
#else
uint8* load_resource(const char* name, const char* type) {
FILE* fp = fopen(name, "rb");
if (!fp)
return NULL;
fseek(fp, 0, SEEK_END);
long len = ftell(fp);
fseek(fp, 0, SEEK_SET);
uint8* buf = (uint8*)malloc(len);
fread(buf, 1, len, fp);
fclose(fp);
return buf;
}
void free_resource(uint8* data) {
free(data);
}
// On Android, read from APK assets.
// On other platforms, read from a file under RESOURCE_PATH.
char path[_MAX_PATH];
sprintf_s(path, _MAX_PATH, "%s%s/%s", RESOURCE_PATH, type, name);
return SDL_RWFromFile(path, "rb");
#endif
}
} // namespace
uint8* DRI::load(const char* file_name, int page, int* size)
{
@@ -243,33 +222,37 @@ uint8* DRI::load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size)
return NULL;
}
uint8 *data = load_resource(name, "mda");
if(!data) {
SDL_RWops* rw = open_resource(name, "mda");
if (!rw)
return NULL;
}
uint8 buf[4];
// ページの位置を取得
int link_sector = data[0] | (data[1] << 8);
int data_sector = data[2] | (data[3] << 8);
SDL_RWread(rw, buf, 4, 1);
int link_sector = buf[0] | (buf[1] << 8);
int data_sector = buf[2] | (buf[3] << 8);
if(page > (data_sector - link_sector) * 128 - 1) {
// ページ番号不正
free_resource(data);
SDL_RWclose(rw);
return NULL;
}
int disk_index = data[(link_sector - 1) * 256 + (page - 1) * 2 + 0];
int link_index = data[(link_sector - 1) * 256 + (page - 1) * 2 + 1];
SDL_RWseek(rw, (link_sector - 1) * 256 + (page - 1) * 2, RW_SEEK_SET);
SDL_RWread(rw, buf, 2, 1);
int disk_index = buf[0];
int link_index = buf[1];
if(disk_index == 0 || disk_index == 0x1a) {
// 欠番
free_resource(data);
SDL_RWclose(rw);
return NULL;
}
// AMUS.MDA以外にリンクされている場合はリソースを開き直す
if(disk_index == 2) {
free_resource(data);
SDL_RWclose(rw);
switch(crc32_b) {
case CRC32_DPS_SG_FAHREN: // D.P.S. SG - Fahren Fliegen
name = "BMUS_FAH";
@@ -314,11 +297,11 @@ uint8* DRI::load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size)
if(name == NULL) {
return NULL;
}
if((data = load_resource(name, "mda")) == NULL) {
if((rw = open_resource(name, "mda")) == NULL) {
return NULL;
}
} else if(disk_index == 3) {
free_resource(data);
SDL_RWclose(rw);
switch(crc32_a) {
case CRC32_TOUSHIN_HINT: // 闘神都市 ヒントディスク
name = "CMUS_T1";
@@ -330,28 +313,31 @@ uint8* DRI::load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size)
if(name == NULL) {
return NULL;
}
if((data = load_resource(name, "mda")) == NULL) {
if((rw = open_resource(name, "mda")) == NULL) {
return NULL;
}
} else if(disk_index != 1) {
// AMUS.MDA以外にリンクされている場合は失敗
free_resource(data);
SDL_RWclose(rw);
return NULL;
}
// データ取得
int start_sector = data[link_index * 2 + 0] | (data[link_index * 2 + 1] << 8);
int end_sector = data[link_index * 2 + 2] | (data[link_index * 2 + 3] << 8);
SDL_RWseek(rw, link_index * 2, RW_SEEK_SET);
SDL_RWread(rw, buf, 4, 1);
int start_sector = buf[0] | (buf[1] << 8);
int end_sector = buf[2] | (buf[3] << 8);
if((*size = (end_sector - start_sector) * 256) == 0) {
// サイズ不正
free_resource(data);
SDL_RWclose(rw);
return NULL;
}
uint8* buffer = (uint8*)malloc(*size);
memcpy(buffer, &data[(start_sector - 1) * 256], *size);
SDL_RWseek(rw, (start_sector - 1) * 256, RW_SEEK_SET);
SDL_RWread(rw, buffer, *size, 1);
free_resource(data);
SDL_RWclose(rw);
return buffer;
}