diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0e68eb4..1f2fa4a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -137,6 +137,7 @@ endif() target_sources(system3 PRIVATE sdlmain.cpp + config.cpp fileio.cpp resource.cpp utfsjis.cpp diff --git a/src/android/mako.cpp b/src/android/mako.cpp index 0abef4b..5a57166 100644 --- a/src/android/mako.cpp +++ b/src/android/mako.cpp @@ -1,6 +1,7 @@ #include #include #include +#include "../config.h" #include "jnihelper.h" #include "dri.h" #include "mako.h" @@ -23,7 +24,7 @@ void audio_callback(void*, Uint8* stream, int len) { } // namespace -MAKO::MAKO(NACT* parent, const MAKOConfig& config) : +MAKO::MAKO(NACT* parent, const Config& config) : use_fm(config.use_fm), current_music(0), next_loop(0), diff --git a/src/config.cpp b/src/config.cpp new file mode 100644 index 0000000..42fc87a --- /dev/null +++ b/src/config.cpp @@ -0,0 +1,28 @@ +#include "config.h" + +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +Config::Config(int argc, char *argv[]) +{ + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "-gamedir") == 0) + chdir(argv[++i]); + else if (strcmp(argv[i], "-noantialias") == 0) + no_antialias = true; + else if (strcmp(argv[i], "-savedir") == 0) + save_dir = argv[++i]; + else if (strcmp(argv[i], "-fontfile") == 0) + font_file = argv[++i]; + else if (strcmp(argv[i], "-playlist") == 0) + playlist = argv[++i]; + else if (strcmp(argv[i], "-fm") == 0) + use_fm = true; + else if (strcmp(argv[i], "-game") == 0) + game_id = argv[++i]; + } +} diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..c871fbf --- /dev/null +++ b/src/config.h @@ -0,0 +1,18 @@ +#ifndef CONFIG_H_ +#define CONFIG_H_ + +#include + +struct Config { + public: + std::string font_file; + std::string game_id; + std::string save_dir; + std::string playlist; + bool use_fm = false; + bool no_antialias = false; + + Config(int argc, char *argv[]); +}; + +#endif // CONFIG_H_ diff --git a/src/emscripten/mako.cpp b/src/emscripten/mako.cpp index 143e24d..76b64b8 100644 --- a/src/emscripten/mako.cpp +++ b/src/emscripten/mako.cpp @@ -16,7 +16,7 @@ std::unique_ptr fm; } // namespace -MAKO::MAKO(NACT* parent, const MAKOConfig& config) : +MAKO::MAKO(NACT* parent, const Config& config) : use_fm(true), current_music(0), next_loop(0), diff --git a/src/linux/mako.cpp b/src/linux/mako.cpp index 4737e70..4e23c46 100644 --- a/src/linux/mako.cpp +++ b/src/linux/mako.cpp @@ -11,6 +11,7 @@ #include "mako.h" #include "mako_midi.h" #include "fm/mako_fmgen.h" +#include "../config.h" #include "dri.h" // MIX_INIT_FLUIDSYNTH was renamed to MIX_INIT_MID in SDL_mixer 2.0.2 @@ -36,7 +37,7 @@ void FMHook(void *udata, Uint8 *stream, int len) { } // namespace -MAKO::MAKO(NACT* parent, const MAKOConfig& config) : +MAKO::MAKO(NACT* parent, const Config& config) : use_fm(config.use_fm), current_music(0), next_loop(0), @@ -44,7 +45,7 @@ MAKO::MAKO(NACT* parent, const MAKOConfig& config) : { int mix_init_flags = MIX_INIT_MID; - if (config.playlist && load_playlist(config.playlist)) + if (!config.playlist.empty() && load_playlist(config.playlist.c_str())) mix_init_flags |= MIX_INIT_MP3 | MIX_INIT_OGG; strcpy_s(amus, 16, "AMUS.DAT"); diff --git a/src/sdlmain.cpp b/src/sdlmain.cpp index 81c0a1e..105dd8f 100644 --- a/src/sdlmain.cpp +++ b/src/sdlmain.cpp @@ -1,12 +1,13 @@ #include #include "common.h" +#include "config.h" #include "fileio.h" #include "sys/nact.h" -#include "sys/mako.h" #ifdef _WIN32 #include #else -#include +#include +#include #endif #ifdef __EMSCRIPTEN__ #include @@ -17,8 +18,9 @@ SDL_Window* g_window; int main(int argc, char *argv[]) { - SDL_Init(SDL_INIT_VIDEO); + Config config(argc, argv); + SDL_Init(SDL_INIT_VIDEO); #ifdef __EMSCRIPTEN__ // Stop SDL from calling emscripten_sleep() in functions that are called // indirectly, which does not work with ASYNCIFY_IGNORE_INDIRECT=1. For @@ -33,33 +35,11 @@ int main(int argc, char *argv[]) #endif g_window = SDL_CreateWindow("Scenario Decoder SYSTEM3", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 400, flags); - const char* font_file = NULL; - MAKOConfig mako_config; - const char* game_id = NULL; - const char* save_dir = NULL; - - for (int i = 1; i < argc; i++) { - if (strcmp(argv[i], "-gamedir") == 0) - chdir(argv[++i]); - else if (strcmp(argv[i], "-noantialias") == 0) - ags_setAntialiasedStringMode(0); - else if (strcmp(argv[i], "-savedir") == 0) - save_dir = argv[++i]; - else if (strcmp(argv[i], "-fontfile") == 0) - font_file = argv[++i]; - else if (strcmp(argv[i], "-playlist") == 0) - mako_config.playlist = argv[++i]; - else if (strcmp(argv[i], "-fm") == 0) - mako_config.use_fm = true; - else if (strcmp(argv[i], "-game") == 0) - game_id = argv[++i]; - } - // system3 初期化 - NACT* nact = NACT::create(game_id, font_file, mako_config); + NACT* nact = NACT::create(config); - if (save_dir && save_dir[0]) { - std::string path(save_dir); + if (!config.save_dir.empty()) { + std::string path = config.save_dir; if (path[path.size() - 1] == '@') { path.pop_back(); const char* gid = nact->get_game_id(); @@ -100,7 +80,7 @@ int main(int argc, char *argv[]) restart = nact->mainloop(); delete nact; if (restart) - nact = NACT::create(game_id, font_file, mako_config); + nact = NACT::create(config); } SDL_DestroyWindow(g_window); diff --git a/src/sys/ags.cpp b/src/sys/ags.cpp index 00a8a02..1fe4130 100644 --- a/src/sys/ags.cpp +++ b/src/sys/ags.cpp @@ -7,6 +7,7 @@ #include "ags.h" #include #include "crc32.h" +#include "../config.h" #include "../fileio.h" extern SDL_Window* g_window; @@ -34,7 +35,7 @@ static SDL_Surface* display_surface; box[n].ey = y2; \ } -AGS::AGS(NACT* parent, const char* fontfile) : nact(parent), dirty(false) +AGS::AGS(NACT* parent, const Config& config) : nact(parent), dirty(false) { sdlRenderer = SDL_CreateRenderer(g_window, -1, 0); SDL_RenderSetLogicalSize(sdlRenderer, 640, 400); @@ -61,10 +62,10 @@ AGS::AGS(NACT* parent, const char* fontfile) : nact(parent), dirty(false) // フォント TTF_Init(); - if (fontfile) { - rw_font = SDL_RWFromFile(fontfile, "rb"); + if (!config.font_file.empty()) { + rw_font = SDL_RWFromFile(config.font_file.c_str(), "rb"); if (!rw_font) - parent->fatal("Cannot open font file %s", fontfile); + parent->fatal("Cannot open font file %s", config.font_file.c_str()); } else { rw_font = open_resource(FONT_RESOURCE_NAME, "fonts"); if (!rw_font) @@ -84,6 +85,8 @@ AGS::AGS(NACT* parent, const char* fontfile) : nact(parent), dirty(false) parent->fatal("TTF_OpenFontRW failed: %s", TTF_GetError()); } } + if (config.no_antialias) + ags_setAntialiasedStringMode(0); // カーソル初期化 for(int i = 0; i < 10; i++) { diff --git a/src/sys/ags.h b/src/sys/ags.h index 260b6d7..43785b0 100644 --- a/src/sys/ags.h +++ b/src/sys/ags.h @@ -36,6 +36,8 @@ inline uint32* surface_line(SDL_Surface* surface, int y) return (uint32*)((uint8*)surface->pixels + surface->pitch * y); } +struct Config; + class AGS { protected: @@ -91,7 +93,7 @@ private: uint32 fader_screen[640 * 480]; public: - AGS(NACT* parent, const char* fontfile); + AGS(NACT* parent, const Config& config); ~AGS(); void update_screen(); @@ -221,4 +223,6 @@ public: int cursor_index; }; +extern "C" void ags_setAntialiasedStringMode(int on); + #endif diff --git a/src/sys/mako.h b/src/sys/mako.h index 2995893..708a99d 100644 --- a/src/sys/mako.h +++ b/src/sys/mako.h @@ -20,15 +20,12 @@ enum BGMDevice { BGM_CD }; -struct MAKOConfig { - const char *playlist = nullptr; - bool use_fm = false; -}; +struct Config; class MAKO { public: - MAKO(NACT* parent, const MAKOConfig& config); + MAKO(NACT* parent, const Config& config); ~MAKO(); void play_music(int page); diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index 71d6b18..06d809d 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -10,6 +10,7 @@ #include "mako.h" #include "msgskip.h" #include "dri.h" +#include "../config.h" #include "../fileio.h" #include "crc32.h" @@ -17,7 +18,7 @@ extern SDL_Window* g_window; // 初期化 -NACT::NACT(int sys_ver, uint32 crc32_a, uint32 crc32_b, const char* font_file, const MAKOConfig& mako_config) +NACT::NACT(int sys_ver, uint32 crc32_a, uint32 crc32_b, const Config& config) : sys_ver(sys_ver), crc32_a(crc32_a), crc32_b(crc32_b), lang(get_language()) { platform_initialize(); @@ -84,8 +85,8 @@ NACT::NACT(int sys_ver, uint32 crc32_a, uint32 crc32_b, const char* font_file, c memset(pcm, 0, sizeof(pcm)); // 各種クラス生成 - ags = new AGS(this, font_file); - mako = new MAKO(this, mako_config); + ags = new AGS(this, config); + mako = new MAKO(this, config); msgskip = new MsgSkip(this); #ifdef USE_JOY @@ -538,16 +539,16 @@ void NACT::fatal(const char* format, ...) { fatal_error = true; } -NACT* NACT::create(const char* game_id, const char* font_file, const MAKOConfig& mako_config) { - uint32 crc32_a = NACT::calc_crc32("ADISK.DAT", game_id); - uint32 crc32_b = NACT::calc_crc32("BDISK.DAT", game_id); +NACT* NACT::create(const Config& config) { + uint32 crc32_a = NACT::calc_crc32("ADISK.DAT", config.game_id); + uint32 crc32_b = NACT::calc_crc32("BDISK.DAT", config.game_id); int sys_ver = NACT::get_sys_ver(crc32_a, crc32_b); switch (sys_ver) { case 1: - return new NACT_Sys1(crc32_a, crc32_b, font_file, mako_config); + return new NACT_Sys1(crc32_a, crc32_b, config); case 2: - return new NACT_Sys2(crc32_a, crc32_b, font_file, mako_config); + return new NACT_Sys2(crc32_a, crc32_b, config); default: - return new NACT_Sys3(crc32_a, crc32_b, font_file, mako_config); + return new NACT_Sys3(crc32_a, crc32_b, config); } } diff --git a/src/sys/nact.h b/src/sys/nact.h index c046763..1c1fd3f 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -7,6 +7,7 @@ #ifndef _NACT_H_ #define _NACT_H_ +#include #include #include "../common.h" #include "localization.h" @@ -81,13 +82,13 @@ class AGS; class MAKO; class MsgSkip; -struct MAKOConfig; +struct Config; class NACT { public: - static NACT* create(const char* game_id, const char* font_file, const MAKOConfig& mako_config); - NACT(int sys_ver, uint32 crc32_a, uint32 crc32_b, const char* font_file, const MAKOConfig& mako_config); + static NACT* create(const Config& config); + NACT(int sys_ver, uint32 crc32_a, uint32 crc32_b, const Config& config); virtual ~NACT(); protected: @@ -228,7 +229,7 @@ protected: #endif int mouse_x = 0, mouse_y = 0; - static uint32 calc_crc32(const char* file_name, const char* game_id); + static uint32 calc_crc32(const char* file_name, const std::string& game_id); // Y27 ダイアログ void text_dialog(); @@ -279,7 +280,7 @@ private: class NACT_Sys1 final : public NACT { public: - NACT_Sys1(uint32 crc32_a, uint32 crc32_b, const char* font_file, const MAKOConfig& mako_config); + NACT_Sys1(uint32 crc32_a, uint32 crc32_b, const Config& config); protected: void cmd_calc() override; void cmd_branch() override; @@ -330,7 +331,7 @@ private: class NACT_Sys2 final : public NACT { public: - NACT_Sys2(uint32 crc32_a, uint32 crc32_b, const char* font_file, const MAKOConfig& mako_config); + NACT_Sys2(uint32 crc32_a, uint32 crc32_b, const Config& config); protected: void cmd_calc() override; void cmd_branch() override; @@ -375,7 +376,7 @@ protected: class NACT_Sys3 final : public NACT { public: - NACT_Sys3(uint32 crc32_a, uint32 crc32_b, const char* font_file, const MAKOConfig& mako_config); + NACT_Sys3(uint32 crc32_a, uint32 crc32_b, const Config& config); protected: void cmd_calc() override; void cmd_branch() override; @@ -418,6 +419,4 @@ protected: uint16 cali2() override; }; -extern "C" void ags_setAntialiasedStringMode(int on); - #endif // _NACT_H_ diff --git a/src/sys/nact_crc32.cpp b/src/sys/nact_crc32.cpp index 8bc540a..121a630 100644 --- a/src/sys/nact_crc32.cpp +++ b/src/sys/nact_crc32.cpp @@ -90,11 +90,11 @@ const CRCTable* lookup(uint32 crc32_a, uint32 crc32_b) } // namespace -uint32 NACT::calc_crc32(const char* file_name, const char* game_id) +uint32 NACT::calc_crc32(const char* file_name, const std::string& game_id) { - if (game_id) { + if (!game_id.empty()) { for (const CRCTable* t = crc_table; t->id; t++) { - if (strcmp(t->id, game_id) == 0) + if (t->id == game_id) return file_name[0] == 'A' ? t->crc32_a : t->crc32_b; } } diff --git a/src/sys/nact_sys1.cpp b/src/sys/nact_sys1.cpp index 3708e44..a8e9f02 100644 --- a/src/sys/nact_sys1.cpp +++ b/src/sys/nact_sys1.cpp @@ -65,8 +65,8 @@ } \ } -NACT_Sys1::NACT_Sys1(uint32 crc32_a, uint32 crc32_b, const char* font_file, const MAKOConfig& mako_config) - : NACT(1, crc32_a, crc32_b, font_file, mako_config) +NACT_Sys1::NACT_Sys1(uint32 crc32_a, uint32 crc32_b, const Config& config) + : NACT(1, crc32_a, crc32_b, config) { switch (crc32_a) { case CRC32_DPS: diff --git a/src/sys/nact_sys2.cpp b/src/sys/nact_sys2.cpp index ae41e63..4bbae44 100644 --- a/src/sys/nact_sys2.cpp +++ b/src/sys/nact_sys2.cpp @@ -57,8 +57,8 @@ } \ } -NACT_Sys2::NACT_Sys2(uint32 crc32_a, uint32 crc32_b, const char* font_file, const MAKOConfig& mako_config) - : NACT(2, crc32_a, crc32_b, font_file, mako_config) +NACT_Sys2::NACT_Sys2(uint32 crc32_a, uint32 crc32_b, const Config& config) + : NACT(2, crc32_a, crc32_b, config) { } diff --git a/src/sys/nact_sys3.cpp b/src/sys/nact_sys3.cpp index ef2815d..e0cdedf 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -14,8 +14,8 @@ #include "../fileio.h" #include "texthook.h" -NACT_Sys3::NACT_Sys3(uint32 crc32_a, uint32 crc32_b, const char* font_file, const MAKOConfig& mako_config) - : NACT(3, crc32_a, crc32_b, font_file, mako_config) +NACT_Sys3::NACT_Sys3(uint32 crc32_a, uint32 crc32_b, const Config& config) + : NACT(3, crc32_a, crc32_b, config) { } diff --git a/src/win/mako.cpp b/src/win/mako.cpp index 6494450..7dab20f 100644 --- a/src/win/mako.cpp +++ b/src/win/mako.cpp @@ -13,6 +13,7 @@ #include "mako.h" #include "mako_midi.h" #include "fm/mako_fmgen.h" +#include "../config.h" #include "dri.h" #include "crc32.h" @@ -241,14 +242,14 @@ void audio_callback(void*, Uint8* stream, int len) { } // namespace -MAKO::MAKO(NACT* parent, const MAKOConfig& config) : +MAKO::MAKO(NACT* parent, const Config& config) : use_fm(config.use_fm), current_music(0), next_loop(0), nact(parent) { - if (config.playlist) - load_playlist(config.playlist); + if (!config.playlist.empty()) + load_playlist(config.playlist.c_str()); strcpy_s(amus, 16, "AMUS.DAT"); strcpy_s(amse, 16, "AMSE.DAT"); // 実際には使わない