diff --git a/.gitignore b/.gitignore index dd50cdb..d0755b1 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,7 @@ bin/ lib/ -oneshot\.dir/ +*.dir/ x64/ Makefile* @@ -28,6 +28,7 @@ __pycache__ /dist /debug /release +steamshim_parent/build/ object_script.* rpgscript.bat @@ -53,3 +54,5 @@ conan_imports_manifest\.txt package/ oclint/ + +steamworks/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 018b32f..2cb38bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,44 +2,18 @@ cmake_minimum_required(VERSION 2.8.11) Project(oneshot) include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) -conan_basic_setup() +conan_basic_setup(TARGETS) ## Setup options ## -option(STEAM "Build for Steam" ON) +option(STEAM "Build for Steam" OFF) +set(STEAMWORKS_PATH "${CMAKE_CURRENT_SOURCE_DIR}/steamworks" CACHE PATH "Path to Steamworks folder") +option(DEBUG "Debug mode" OFF) ## Misc setup ## set(CMAKE_INCLUDE_CURRENT_DIR ON) -# IF("${CMAKE_SYSTEM}" MATCHES "Linux") -# SET(LINUX ON) -# ENDIF() - -# set(CMAKE_OSX_DEPLOYMENT_TARGET 10.6) - -# IF(LINUX) -# if(CMAKE_SIZEOF_VOID_P MATCHES "8" AND NOT(FORCE32) ) -# set(CMAKE_EXECUTABLE_SUFFIX ".bin.x86_64") -# set(BIN_RPATH "\$ORIGIN/lib64") -# set(LIB_PATH "lib64") -# else() -# set(CMAKE_EXECUTABLE_SUFFIX ".bin.x86") -# set(BIN_RPATH "\$ORIGIN/lib") -# set(LIB_PATH "lib") -# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FILE_OFFSET_BITS=64") -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_FILE_OFFSET_BITS=64") -# endif() -# elseif(APPLE) -# SET(BIN_RPATH "@executable_path/../Frameworks") -# set(LIB_PATH "lib") -# endif() - -# set(CMAKE_SKIP_BUILD_RPATH TRUE) -# set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) -# set(CMAKE_INSTALL_RPATH ${BIN_RPATH}) -# set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) - ## Setup main source ## set(MAIN_HEADERS @@ -150,10 +124,13 @@ set(MAIN_SOURCE if(WIN32) list(APPEND MAIN_SOURCE assets/resources.rc) list(APPEND DEFINES UNICODE) - list(APPEND PLATFORM_LIBRARIES Secur32) + list(APPEND PLATFORM_LIBRARIES Secur32 Shlwapi) include_directories( ${CMAKE_CURRENT_BINARY_DIR}/windows ) +elseif(APPLE) + list(APPEND MAIN_HEADERS src/mac-desktop.h) + list(APPEND MAIN_SOURCE src/mac-desktop.mm) endif() if (STEAM) @@ -262,6 +239,7 @@ set(BINDING_HEADERS binding-mri/sceneelement-binding.h binding-mri/viewportelement-binding.h binding-mri/flashable-binding.h + binding-mri/journal-binding.h ) set(BINDING_SOURCE binding-mri/binding-mri.cpp @@ -302,4 +280,31 @@ add_executable(${PROJECT_NAME} MACOSX_BUNDLE WIN32 target_compile_definitions(${PROJECT_NAME} PRIVATE ${DEFINES}) target_include_directories(${PROJECT_NAME} PRIVATE src) -target_link_libraries(${PROJECT_NAME} ${CONAN_LIBS} ${PLATFORM_LIBRARIES}) +target_link_libraries(${PROJECT_NAME} + CONAN_PKG::boost + CONAN_PKG::openal + CONAN_PKG::physfs + CONAN_PKG::pixman + CONAN_PKG::ruby + CONAN_PKG::sdl2 + CONAN_PKG::sdl2_image + CONAN_PKG::sdl2_ttf + CONAN_PKG::sdl_sound-mkxp + CONAN_PKG::sigc++ + ${PLATFORM_LIBRARIES}) + +IF(APPLE) + add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND cmake -P "${CMAKE_SOURCE_DIR}/patches/mac/CompleteBundle.cmake" VERBATIM) +ENDIF() + +if(STEAM) + add_subdirectory(steamshim_parent) + + # steam_appid.txt + configure_file( + "${CMAKE_SOURCE_DIR}/steam_appid.txt" + "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/steam_appid.txt" + COPYONLY) +endif() + +add_subdirectory(scripts) diff --git a/Info.plist b/Info.plist deleted file mode 100644 index 6c19ba0..0000000 --- a/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - NSPrincipalClass - NSApplication - CFBundleIconFile - - CFBundlePackageType - APPL - CFBundleGetInfoString - Created by Qt/QMake - CFBundleSignature - ???? - CFBundleExecutable - OneShot - CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:rfc1034identifier} - NOTE - This file was generated by Qt/QMake. - - diff --git a/README.md b/README.md index 434c663..232ee30 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ Thanks to [hunternet93](https://github.com/hunternet93) for starting the reimple * Ruby * Python 3 (journal reimplementation only) * PyQt5 for Python 3 (journal reimplementation only) +* Steamworks SDK (optional, place contents of sdk folder in ZIP into "steamworks" folder in root) ### Building with Conan diff --git a/cleanup.sh b/cleanup.sh index 162189c..61a250d 100755 --- a/cleanup.sh +++ b/cleanup.sh @@ -1,9 +1,18 @@ #!/bin/sh rm -rf journal/mac/__pycache__ -rm -rf steamshim_parent/steamshim +rm -rf steamshim_parent/build +rm -rf steamshim_parent/CMakeFiles +rm -rf steamshim_parent/CMakeCache.txt rm -rf build +rm -rf bin +rm -rf lib rm -rf dist +rm -rf x64 +rm -rf *.sln +rm -rf *.vcxproj +rm -rf *.vcxproj.filters +rm -rf *.user rm -rf _______.app rm -rf OneShot.app rm -rf OneShot @@ -13,6 +22,9 @@ rm -rf cmake_install.cmake rm -rf CMakeCache.txt rm -rf conanbuildinfo.txt rm -rf conaninfo.txt +rm -rf conan_imports_manifest.txt +rm -rf *.xxd +rm -rf *.dir if [ -f .qmake.stash ] then make distclean diff --git a/conanfile.py b/conanfile.py index 2aa3874..d4d24d8 100644 --- a/conanfile.py +++ b/conanfile.py @@ -3,37 +3,51 @@ import os.path class MkxpConan(ConanFile): - name = "mkxp" + name = "oneshot" version = "0.0.0" license = "GPLv2" url = "https://github.com/elizagamedev/mkxp-oneshot" description = "OneShot game runtime" - settings = "os", "compiler", "build_type", "arch" + settings = "os", "compiler", "build_type", "arch", "cppstd" generators = "cmake" exports_sources = "*" requires = ( "boost/1.68.0@conan/stable", "openal/1.18.2@bincrafters/stable", - "physfs/3.0.1@eliza/stable", + "physfs/stable-3.0@eliza/stable", "pixman/0.34.0@bincrafters/stable", - "ruby-mkxp/2.5.1@eliza/stable", + "ruby/trunk@eliza/stable", "sdl2/2.0.8@bincrafters/stable", "sdl2_image/2.0.3@bincrafters/stable", "sdl2_ttf/2.0.14@eliza/stable", "sdl_sound-mkxp/1.0.1@eliza/stable", - "sigc++/2.10.0@eliza/stable", + "sigc++/2.10.0@bincrafters/stable", ) + build_requires = ( + "ruby_installer/2.3.3@bincrafters/stable", + ) + options = { + "platform": ["standalone", "steam"], + } default_options = ( + "platform=standalone", "boost:without_test=True", "cygwin_installer:packages=xxd", + "openal:shared=True", ) def build_requirements(self): if tools.os_info.is_windows: self.build_requires("cygwin_installer/2.9.0@bincrafters/stable") + def requirements(self): + if self.options.platform == "steam": + self.requires("steamworks/1.42@eliza/stable") + def build_configure(self): cmake = CMake(self) + if self.options.platform == "steam": + cmake.definitions["STEAM"] = "ON" cmake.configure() cmake.build() @@ -57,7 +71,11 @@ class MkxpConan(ConanFile): self.do_copy_deps(self.copy_deps) def do_copy_deps(self, copy): - deps = set(self.deps_cpp_info.deps) - deps.discard("cygwin_installer") + deps = set(self.deps_cpp_info.deps) - set(( + "cygwin_installer", + "msys2_installer", + "ruby_installer")) for dep in deps: copy("*.dll", dst="bin", src="bin", root_package=dep, keep_path=False) + if self.settings.build_type == "Debug": + copy("*.pdb", dst="bin", root_package=dep, keep_path=False) diff --git a/make-oneshot-linux.sh b/make-oneshot-linux.sh index a6e8ce7..d4adede 100755 --- a/make-oneshot-linux.sh +++ b/make-oneshot-linux.sh @@ -7,6 +7,7 @@ cd `dirname $0` linux_version="0.1.0" make_threads=8 ONESHOT_PATH=$HOME/.steam/steam/steamapps/common/OneShot +STEAMWORKS_PATH=/usr/steamworks # Colors white="\033[0;37m" # White - Regular @@ -24,8 +25,10 @@ echo "-> ${cyan}Compile engine...${color_reset}" make -j${make_threads} echo "-> ${cyan}Compile steamshim...${color_reset}" cd steamshim_parent -HOST=linux64 make -j${make_threads} -cd .. +mkdir build && cd build +cmake -DSTEAMWORKS_PATH=${STEAMWORKS_PATH} .. +make -j${make_threads} +cd ../.. echo "-> ${cyan}Compile journal...${color_reset}" pyinstaller journal/unix/journal.spec --onefile --windowed diff --git a/make-oneshot-mac.command b/make-oneshot-mac.command index d98d1fc..fe72cd2 100755 --- a/make-oneshot-mac.command +++ b/make-oneshot-mac.command @@ -7,7 +7,6 @@ cd `dirname $0` mac_version="1.1.0" make_threads=8 ONESHOT_PATH=$HOME/Library/Application\ Support/Steam/steamapps/common/OneShot - # Colors white="\033[0;37m" # White - Regular bold="\033[1;37m" # White - Bold @@ -28,8 +27,9 @@ if [[ $use_qmake == True ]] make -j${make_threads} echo "-> ${cyan}Compile steamshim...${color_reset}" cd steamshim_parent - HOST=osx make -j${make_threads} - cd .. + # mkdir build && cd build + STEAMWORKS=./steamworks make -j${make_threads} + cd .. # cd ../.. else echo "${bold}WARNING: Conan/CMake method not ready yet.${color_reset}" fi diff --git a/rpgscript - solstice.bat b/rpgscript - solstice.bat deleted file mode 100644 index 44344f0..0000000 --- a/rpgscript - solstice.bat +++ /dev/null @@ -1,2 +0,0 @@ -"C:\Ruby23\bin\ruby.exe" rpgscript.rb "C:\Users\GIR\Documents\oneshot scripts and stuff\mkxp-oneshot\scripts" "C:\Users\GIR\Dropbox\Oneshot Project\Solstice\Game" -pause \ No newline at end of file diff --git a/rpgscript.bat b/rpgscript.bat deleted file mode 100644 index 718a041..0000000 --- a/rpgscript.bat +++ /dev/null @@ -1,2 +0,0 @@ -"C:\Ruby23\bin\ruby.exe" rpgscript.rb "C:\Users\GIR\Documents\oneshot scripts and stuff\mkxp-oneshot\scripts" "C:\Users\GIR\Dropbox\Oneshot Project\Game" -pause \ No newline at end of file diff --git a/rpgscript.rb b/rpgscript.rb index a9dd243..cb3ab46 100755 --- a/rpgscript.rb +++ b/rpgscript.rb @@ -33,8 +33,8 @@ Dir.entries(game_data_dir).each do |e| end unless target_path - STDERR.puts "error: could not determine game engine version" - exit 1 + STDERR.puts "warning: could not determine game engine version, assuming XP" + target_path = File.join(game_data_dir, 'xScripts.rxdata') end # Generate path of script list diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt new file mode 100644 index 0000000..717c6c1 --- /dev/null +++ b/scripts/CMakeLists.txt @@ -0,0 +1,125 @@ +set(scripts + Credits_Message.rb + Data_FastTravel.rb + Data_Footsteps.rb + Data_Item.rb + Data_SpecialEventData.rb + Data_TileText.rb + Demo.rb + Desktop_Message.rb + Doc_Message.rb + EdText.rb + Ed_Message.rb + FastTravel.rb + Game_Actor.rb + Game_Actors.rb + Game_BattleAction.rb + Game_Battler 1.rb + Game_Battler 2.rb + Game_Battler 3.rb + Game_Character 1.rb + Game_Character 2.rb + Game_Character 3.rb + Game_CommonEvent.rb + Game_Enemy.rb + Game_Event.rb + Game_FastTravel.rb + Game_Follower.rb + Game_Light.rb + Game_Map.rb + Game_Oneshot.rb + Game_Party.rb + Game_Picture.rb + Game_Player.rb + Game_Screen.rb + Game_SelfSwitches.rb + Game_Switches.rb + Game_System.rb + Game_Temp.rb + Game_Variables.rb + Interpreter 1.rb + Interpreter 2.rb + Interpreter 3.rb + Interpreter 4.rb + Interpreter 5.rb + Interpreter 6.rb + Interpreter 7.rb + Main.rb + Particles.rb + Persistent.rb + Puzzle_Film.rb + Puzzle_Pixel.rb + Puzzle_Safe.rb + Puzzle_Sokoban.rb + RPG.rb + SaveLoad.rb + Scene_Debug.rb + Scene_End.rb + Scene_Equip.rb + Scene_File.rb + Scene_Item.rb + Scene_Load.rb + Scene_Map.rb + Scene_Menu.rb + Scene_Name.rb + Scene_Save.rb + Scene_Skill.rb + Scene_Status.rb + Scene_Title.rb + Script.rb + Sprite_Battler.rb + Sprite_Character.rb + Sprite_Footprint.rb + Sprite_Footsplash.rb + Sprite_Light.rb + Sprite_MapText.rb + Sprite_Picture.rb + Sprite_Timer.rb + Spriteset_Map.rb + Window_Base.rb + Window_BattleResult.rb + Window_BattleStatus.rb + Window_Command.rb + Window_DebugLeft.rb + Window_DebugRight.rb + Window_EquipItem.rb + Window_EquipLeft.rb + Window_EquipRight.rb + Window_Gold.rb + Window_Help.rb + Window_InputNumber.rb + Window_Item.rb + Window_MainMenu.rb + Window_MenuStatus.rb + Window_Message.rb + Window_NameEdit.rb + Window_NameInput.rb + Window_PartyCommand.rb + Window_PlayTime.rb + Window_SaveFile.rb + Window_Selectable.rb + Window_Settings.rb + Window_ShopBuy.rb + Window_ShopCommand.rb + Window_ShopNumber.rb + Window_ShopSell.rb + Window_ShopStatus.rb + Window_Skill.rb + Window_SkillStatus.rb + Window_Status.rb + Window_Steps.rb + Window_Target.rb + i18n_English.rb + i18n_Japanese.rb + i18n_Language.rb) + +find_program(RUBY_EXE ruby + DOC "Location of the Ruby executable") +set(game_dir "${CMAKE_BINARY_DIR}/bin") +set(xscripts "${game_dir}/Data/xScripts.rxdata") +add_custom_command( + OUTPUT "${xscripts}" + COMMAND "${RUBY_EXE}" "${CMAKE_SOURCE_DIR}/rpgscript.rb" "${CMAKE_CURRENT_LIST_DIR}" "${game_dir}" + DEPENDS _scripts.txt ${scripts} + COMMENT "Bundling xScripts.rxdata") +add_custom_target(xScripts ALL DEPENDS "${xscripts}") diff --git a/scripts/Window_Message.rb b/scripts/Window_Message.rb index 5a4af1b..ded48d9 100644 --- a/scripts/Window_Message.rb +++ b/scripts/Window_Message.rb @@ -401,10 +401,7 @@ class Window_Message < Window_Selectable $game_system.se_play($data_system.cancel_se) $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1) terminate_message - end - - # Confirm - if Input.trigger?(Input::ACTION) + elsif Input.trigger?(Input::ACTION) $game_system.se_play($data_system.decision_se) $game_temp.choice_proc.call(self.index) terminate_message diff --git a/src/config.cpp b/src/config.cpp index ec6c8af..2a27175 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include @@ -35,17 +35,26 @@ #include "util.h" #include "sdl-util.h" +namespace std +{ + std::ostream& operator<<(std::ostream &os, const std::vector &vec) + { + for (auto item : vec) + { + os << item << " "; + } + return os; + } +} + static std::string prefPath(const char *org, const char *app) { - char *path = SDL_GetPrefPath(org, app); + const char *path = PHYSFS_getPrefDir(org, app); if (!path) return std::string(); - std::string str(path); - SDL_free(path); - - return str; + return path; } template @@ -117,9 +126,9 @@ void Config::read(int argc, char *argv[]) po::options_description podesc; podesc.add_options() PO_DESC_ALL - ("preloadScript", po::value()->composing()) - ("fontSub", po::value()->composing()) - ("rubyLoadpath", po::value()->composing()) + ("preloadScript", po::value()->composing()->default_value(StringVec())) + ("fontSub", po::value()->composing()->default_value(StringVec())) + ("rubyLoadpath", po::value()->composing()->default_value(StringVec())) ; po::variables_map vm; diff --git a/src/filesystem.cpp b/src/filesystem.cpp index 8bf1cf8..1b7e032 100644 --- a/src/filesystem.cpp +++ b/src/filesystem.cpp @@ -40,11 +40,8 @@ #include #ifdef __APPLE__ -#define OS_OSX -#endif - -#ifdef OS_OSX -#include + #define OS_OSX + #include #endif struct SDLRWIoContext @@ -321,8 +318,6 @@ FileSystem::FileSystem(const char *argv0, p = new FileSystemPrivate; p->havePathCache = false; - PHYSFS_init(argv0); - PHYSFS_registerArchiver(&RGSS1_Archiver); PHYSFS_registerArchiver(&RGSS2_Archiver); PHYSFS_registerArchiver(&RGSS3_Archiver); @@ -465,7 +460,7 @@ struct FontSetsCBData }; static PHYSFS_EnumerateCallbackResult -findFontsFolderCB (void *data, const char *dir, const char *fname) +fontSetEnumCB (void *data, const char *dir, const char *fname) { FontSetsCBData *d = static_cast(data); @@ -473,7 +468,7 @@ findFontsFolderCB (void *data, const char *dir, const char *fname) const char *ext = findExt(fname); if (!ext) - return PHYSFS_ENUM_STOP; + return PHYSFS_ENUM_OK; char lowExt[8]; size_t i; @@ -483,7 +478,7 @@ findFontsFolderCB (void *data, const char *dir, const char *fname) lowExt[i] = '\0'; if (strcmp(lowExt, "ttf") && strcmp(lowExt, "otf") && strcmp(lowExt, "ttc")) - return PHYSFS_ENUM_STOP; + return PHYSFS_ENUM_OK; char filename[512]; snprintf(filename, sizeof(filename), "%s/%s", dir, fname); @@ -507,7 +502,7 @@ void FileSystem::initFontSets(SharedFontState &sfs) { FontSetsCBData d = { p, &sfs }; - PHYSFS_enumerate("Fonts", findFontsFolderCB, &d); + PHYSFS_enumerate("Fonts", fontSetEnumCB, &d); } struct OpenReadEnumData diff --git a/src/main.cpp b/src/main.cpp index bebb63d..d3c51a8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #ifdef _MSC_VER #include @@ -46,10 +47,6 @@ #include "binding.h" -#ifdef __WINDOWS__ -#include "resource.h" -#endif - #include "icon.png.xxd" #ifdef STEAM @@ -234,6 +231,9 @@ int main(int argc, char *argv[]) } #endif + /* Initialize physfs here so that config can call PHYSFS_getPrefDir */ + PHYSFS_init(argv[0]); + /* now we load the config */ Config conf; conf.read(argc, argv); @@ -252,7 +252,7 @@ int main(int argc, char *argv[]) if (conf.windowTitle.empty()) conf.windowTitle = conf.game.title; - int imgFlags = IMG_INIT_PNG | IMG_INIT_JPG; + int imgFlags = IMG_INIT_PNG; if (IMG_Init(imgFlags) != imgFlags) { showInitError(std::string("Error initializing SDL_image: ") + SDL_GetError()); diff --git a/steamshim_parent/CMakeLists.txt b/steamshim_parent/CMakeLists.txt new file mode 100644 index 0000000..59803e5 --- /dev/null +++ b/steamshim_parent/CMakeLists.txt @@ -0,0 +1,18 @@ +add_executable(steamshim WIN32 + steamshim_parent.cpp) + +target_compile_definitions(steamshim PRIVATE + -DGAME_LAUNCH_NAME="oneshot") + +if(DEBUG) + target_compile_definitions(steamshim PRIVATE + -DSTEAMSHIM_DEBUG) +endif() + +if(WIN32) + target_sources(steamshim PRIVATE + resources.rc) +endif() + +target_link_libraries(steamshim PRIVATE + CONAN_PKG::steamworks) diff --git a/steamshim_parent/Makefile b/steamshim_parent/Makefile deleted file mode 100644 index 7800230..0000000 --- a/steamshim_parent/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -TARGET := steamshim -GAME_LAUNCH_NAME ?= oneshot - -CXX ?= clang++ -WINDRES ?= windres -HOST ?= linux64 -FLAGS := -I$(STEAMWORKS)/public -DGAME_LAUNCH_NAME=\"$(GAME_LAUNCH_NAME)\" -Wall -DEBUG ?= 0 - -ifeq ($(HOST),w32) - FLAGS += -L$(STEAMWORKS)/redistributable_bin -else ifeq ($(HOST),linux32) - FLAGS += -L$(STEAMWORKS)/redistributable_bin/linux32 -m32 -else ifeq ($(HOST),linux64) - FLAGS += -L$(STEAMWORKS)/redistributable_bin/linux64 -m64 -else ifeq ($(HOST),osx) - FLAGS += -L$(STEAMWORKS)/redistributable_bin/osx32 -endif - -FLAGS += -lsteam_api - -ifeq ($(DEBUG),1) - FLAGS += -DSTEAMSHIM_DEBUG -else ifeq ($(HOST),w32) - FLAGS += -mwindows -endif - -SRC := steamshim_parent.cpp -RES := resources.rc -RESOBJ := resources.o - -ifeq ($(HOST),w32) -$(TARGET).exe: $(SRC) $(RESOBJ) - $(CXX) $^ -o $@ $(FLAGS) -$(RESOBJ): $(RES) - $(WINDRES) $< $@ -else -$(TARGET): $(SRC) - $(CXX) $^ -o $@ $(FLAGS) -endif - -clean: - rm -f $(TARGET) $(TARGET).exe $(RESOBJ) - -.PHONY: clean