mirror of
https://github.com/kichikuou/system3-sdl2.git
synced 2026-09-22 22:58:12 +03:00
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:
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user