mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-01-30 23:10:14 -05:00
Introduce App Directory Path (#572)
* Introduce app directory path concept * macos: Remove hacky way of using applicaiton directory * Update the new SaveManager * Address stack user after return * Remove unecessary property * Use std::string for filepath * Improve clang specific detections * Use new path system for imgui files * Improve helper for getting relative paths
This commit is contained in:
parent
97ad234c8c
commit
7b04f67884
@ -63,9 +63,10 @@ make setup -j8 DEBUG=0
|
|||||||
# Compile the code (watch the -j parameter as above)
|
# Compile the code (watch the -j parameter as above)
|
||||||
make -j8 DEBUG=0
|
make -j8 DEBUG=0
|
||||||
# Create macOS app bundle
|
# Create macOS app bundle
|
||||||
make filledappbundle
|
make appbundle
|
||||||
```
|
```
|
||||||
9. Launch soh app in the soh folder!
|
9. Copy your OTR file to ~/Library/Application\ Support/com.shipofharkinian.soh
|
||||||
|
10. Launch soh app in the soh folder!
|
||||||
|
|
||||||
# Compatible Roms
|
# Compatible Roms
|
||||||
```
|
```
|
||||||
|
@ -49,7 +49,7 @@ LDFLAGS := -lm -ldl \
|
|||||||
-L../StormLib/build -L../libultraship -lbz2 -pthread -lultraship -lstorm
|
-L../StormLib/build -L../libultraship -lbz2 -pthread -lultraship -lstorm
|
||||||
|
|
||||||
ifeq ($(UNAME), Darwin)
|
ifeq ($(UNAME), Darwin)
|
||||||
LDFLAGS += $(shell pkg-config --libs glew libpng zlib) $(shell sdl2-config --libs) -framework OpenGL
|
LDFLAGS += $(shell pkg-config --libs glew libpng zlib) $(shell sdl2-config --libs) -framework OpenGL -framework Foundation
|
||||||
INC += $(shell pkg-config --cflags libpng)
|
INC += $(shell pkg-config --cflags libpng)
|
||||||
else
|
else
|
||||||
LDFLAGS += -lpng -lGL -lGLEW -lX11 -lz -lSDL2 -lpulse
|
LDFLAGS += -lpng -lGL -lGLEW -lX11 -lz -lSDL2 -lpulse
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
CXX ?= g++
|
CXX ?= g++
|
||||||
CC ?= gcc
|
CC ?= gcc
|
||||||
AR := ar
|
AR := ar
|
||||||
FORMAT := clang-format-11
|
FORMAT := clang-format-11
|
||||||
UNAME := $(shell uname)
|
UNAME := $(shell uname)
|
||||||
|
|
||||||
@ -11,6 +11,15 @@ DEBUG ?= 1
|
|||||||
OPTFLAGS ?= -O0
|
OPTFLAGS ?= -O0
|
||||||
LTO ?= 0
|
LTO ?= 0
|
||||||
|
|
||||||
|
# flag to save whether the compiler being used is clang or gcc by checking CXX --version
|
||||||
|
CXX_IS_CLANG ?= $(shell $(CXX) --version | grep -c clang)
|
||||||
|
ifeq ($(CXX_IS_CLANG),1)
|
||||||
|
MXX := $(CXX)
|
||||||
|
else
|
||||||
|
MXX ?= clang++
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
WARN := -Wall -Wextra -Werror \
|
WARN := -Wall -Wextra -Werror \
|
||||||
-Wno-unused-variable \
|
-Wno-unused-variable \
|
||||||
-Wno-unused-parameter \
|
-Wno-unused-parameter \
|
||||||
@ -29,8 +38,7 @@ WARN := -Wall -Wextra -Werror \
|
|||||||
CWARN :=
|
CWARN :=
|
||||||
CXXWARN := -Wno-deprecated-enum-enum-conversion -Wno-deprecated-copy
|
CXXWARN := -Wno-deprecated-enum-enum-conversion -Wno-deprecated-copy
|
||||||
|
|
||||||
COMPILER_VERSION := $(shell $(CXX) --version)
|
ifneq ($(CXX_IS_CLANG),1)
|
||||||
ifneq '' '$(findstring g++,$(COMPILER_VERSION))'
|
|
||||||
WARN += -Wno-error=stringop-overflow
|
WARN += -Wno-error=stringop-overflow
|
||||||
CXXWARN += -Wno-error=maybe-uninitialized
|
CXXWARN += -Wno-error=maybe-uninitialized
|
||||||
endif
|
endif
|
||||||
@ -39,12 +47,17 @@ CXXFLAGS := $(WARN) $(CXXWARN) -std=c++20 -D_GNU_SOURCE -DENABLE_OPENGL -DSPDLOG
|
|||||||
CFLAGS := $(WARN) $(CWARN) -std=c99 -D_GNU_SOURCE -DENABLE_OPENGL -DSPDLOG_ACTIVE_LEVEL=0
|
CFLAGS := $(WARN) $(CWARN) -std=c99 -D_GNU_SOURCE -DENABLE_OPENGL -DSPDLOG_ACTIVE_LEVEL=0
|
||||||
CPPFLAGS := -MMD
|
CPPFLAGS := -MMD
|
||||||
|
|
||||||
ifeq ($(UNAME), Darwin) #APPLE
|
MMFLAGS := -Wno-deprecated-declarations -ObjC++ -fobjc-weak -fobjc-arc
|
||||||
CPPFLAGS += $(shell pkg-config --cflags sdl2 glew) -framework OpenGL
|
|
||||||
|
# if not using clang, ask clang to use gcc standard library
|
||||||
|
ifneq ($(CXX_IS_CLANG),1)
|
||||||
|
STD_ISYSTEM=$(shell ${CXX} -xc++ -E -v - < /dev/null 2>&1 | grep "> search starts here" -A2 | tail -n 2 | head -n 1)
|
||||||
|
CXX_ISYSTEM=$(shell ${CXX} -xc++ -E -v - < /dev/null 2>&1 | grep "> search starts here" -A2 | tail -n 2 | tail -n 1)
|
||||||
|
MMFLAGS += -stdlib++-isystem ${STD_ISYSTEM} -cxx-isystem ${CXX_ISYSTEM}
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(UNAME), Linux)
|
ifeq ($(UNAME), Darwin) #APPLE
|
||||||
WARN += -Wno-error=stringop-overflow # This is required with clang on Linux.
|
CPPFLAGS += $(shell pkg-config --cflags sdl2 glew) -framework OpenGL -framework Foundation
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(DEBUG),0)
|
ifneq ($(DEBUG),0)
|
||||||
@ -78,12 +91,19 @@ C_FILES := \
|
|||||||
libultraship/mixer.c \
|
libultraship/mixer.c \
|
||||||
libultraship/Lib/stb/stb_impl.c
|
libultraship/Lib/stb/stb_impl.c
|
||||||
|
|
||||||
|
MM_FILES := \
|
||||||
|
libultraship/OSXFolderManager.mm
|
||||||
|
|
||||||
FMT_FILES := $(shell find libultraship/ -type f \( -name "*.cpp" -o -name "*.h" \) -a -not -path "libultraship/Lib/*")
|
FMT_FILES := $(shell find libultraship/ -type f \( -name "*.cpp" -o -name "*.h" \) -a -not -path "libultraship/Lib/*")
|
||||||
|
|
||||||
O_FILES := \
|
O_FILES := \
|
||||||
$(CXX_FILES:%.cpp=build/%.o) \
|
$(CXX_FILES:%.cpp=build/%.o) \
|
||||||
$(C_FILES:%.c=build/%.o)
|
$(C_FILES:%.c=build/%.o)
|
||||||
|
|
||||||
|
ifeq ($(UNAME), Darwin) #APPLE
|
||||||
|
O_FILES += $(MM_FILES:%.mm=build/%.o)
|
||||||
|
endif
|
||||||
|
|
||||||
D_FILES := $(O_FILES:%.o=%.d)
|
D_FILES := $(O_FILES:%.o=%.d)
|
||||||
|
|
||||||
LIB := libultraship.a
|
LIB := libultraship.a
|
||||||
@ -117,6 +137,9 @@ build/%.o: %.cpp
|
|||||||
build/%.o: %.c
|
build/%.o: %.c
|
||||||
$(CC) $(CFLAGS) $(CPPFLAGS) $(OPTFLAGS) $(INC_DIRS) -c $< -o $@
|
$(CC) $(CFLAGS) $(CPPFLAGS) $(OPTFLAGS) $(INC_DIRS) -c $< -o $@
|
||||||
|
|
||||||
|
build/%.o: %.mm
|
||||||
|
$(MXX) $(MMFLAGS) $(CXXFLAGS) $(OPTFLAGS) $(INC_DIRS) -c $< -o $@
|
||||||
|
|
||||||
$(LIB): $(O_FILES)
|
$(LIB): $(O_FILES)
|
||||||
$(AR) rcs $@ $^
|
$(AR) rcs $@ $^
|
||||||
|
|
||||||
|
@ -56,10 +56,10 @@ namespace Ship {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ConfigFile::CreateDefaultConfig() {
|
bool ConfigFile::CreateDefaultConfig() {
|
||||||
(*this)["ARCHIVE"]["Main Archive"] = "oot.otr";
|
(*this)["ARCHIVE"]["Main Archive"] = "";
|
||||||
(*this)["ARCHIVE"]["Patches Directory"] = "";
|
(*this)["ARCHIVE"]["Patches Directory"] = "";
|
||||||
|
|
||||||
(*this)["SAVE"]["Save Filename"] = "oot_save.sav";
|
(*this)["SAVE"]["Save Filename"] = "";
|
||||||
|
|
||||||
(*this)["CONTROLLERS"]["CONTROLLER 1"] = "Auto";
|
(*this)["CONTROLLERS"]["CONTROLLER 1"] = "Auto";
|
||||||
(*this)["CONTROLLERS"]["CONTROLLER 2"] = "Unplugged";
|
(*this)["CONTROLLERS"]["CONTROLLER 2"] = "Unplugged";
|
||||||
|
@ -8,10 +8,14 @@
|
|||||||
#include "spdlog/sinks/stdout_color_sinks.h"
|
#include "spdlog/sinks/stdout_color_sinks.h"
|
||||||
#include "spdlog/sinks/sohconsole_sink.h"
|
#include "spdlog/sinks/sohconsole_sink.h"
|
||||||
#include "ModManager.h"
|
#include "ModManager.h"
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include "OSXFolderManager.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Ship {
|
namespace Ship {
|
||||||
std::weak_ptr<GlobalCtx2> GlobalCtx2::Context;
|
std::weak_ptr<GlobalCtx2> GlobalCtx2::Context;
|
||||||
ModManager* INSTANCE;
|
ModManager* INSTANCE;
|
||||||
|
|
||||||
std::shared_ptr<GlobalCtx2> GlobalCtx2::GetInstance() {
|
std::shared_ptr<GlobalCtx2> GlobalCtx2::GetInstance() {
|
||||||
return Context.lock();
|
return Context.lock();
|
||||||
}
|
}
|
||||||
@ -29,6 +33,22 @@ namespace Ship {
|
|||||||
return GetInstance();
|
return GetInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string GlobalCtx2::GetAppDirectoryPath() {
|
||||||
|
#ifdef __APPLE__
|
||||||
|
FolderManager folderManager;
|
||||||
|
std::string fpath = std::string(folderManager.pathForDirectory(NSApplicationSupportDirectory, NSUserDomainMask));
|
||||||
|
fpath.append("/com.shipofharkinian.soh");
|
||||||
|
return fpath;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ".";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GlobalCtx2::GetPathRelativeToAppDirectory(const char* path) {
|
||||||
|
return GlobalCtx2::GetAppDirectoryPath() + "/" + path;
|
||||||
|
}
|
||||||
|
|
||||||
GlobalCtx2::GlobalCtx2(const std::string& Name) : Name(Name), MainPath(""), PatchesPath("") {
|
GlobalCtx2::GlobalCtx2(const std::string& Name) : Name(Name), MainPath(""), PatchesPath("") {
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -40,14 +60,14 @@ namespace Ship {
|
|||||||
|
|
||||||
void GlobalCtx2::InitWindow() {
|
void GlobalCtx2::InitWindow() {
|
||||||
InitLogging();
|
InitLogging();
|
||||||
Config = std::make_shared<ConfigFile>(GlobalCtx2::GetInstance(), "shipofharkinian.ini");
|
Config = std::make_shared<ConfigFile>(GlobalCtx2::GetInstance(), GetPathRelativeToAppDirectory("shipofharkinian.ini"));
|
||||||
MainPath = (*Config)["ARCHIVE"]["Main Archive"];
|
MainPath = (*Config)["ARCHIVE"]["Main Archive"];
|
||||||
if (MainPath.empty()) {
|
if (MainPath.empty()) {
|
||||||
MainPath = "oot.otr";
|
MainPath = GetPathRelativeToAppDirectory("oot.otr");
|
||||||
}
|
}
|
||||||
PatchesPath = (*Config)["ARCHIVE"]["Patches Directory"];
|
PatchesPath = (*Config)["ARCHIVE"]["Patches Directory"];
|
||||||
if (PatchesPath.empty()) {
|
if (PatchesPath.empty()) {
|
||||||
PatchesPath = "./";
|
PatchesPath = GetAppDirectoryPath() + "/";
|
||||||
}
|
}
|
||||||
ResMan = std::make_shared<ResourceMgr>(GlobalCtx2::GetInstance(), MainPath, PatchesPath);
|
ResMan = std::make_shared<ResourceMgr>(GlobalCtx2::GetInstance(), MainPath, PatchesPath);
|
||||||
Win = std::make_shared<Window>(GlobalCtx2::GetInstance());
|
Win = std::make_shared<Window>(GlobalCtx2::GetInstance());
|
||||||
@ -67,11 +87,13 @@ namespace Ship {
|
|||||||
|
|
||||||
void GlobalCtx2::InitLogging() {
|
void GlobalCtx2::InitLogging() {
|
||||||
try {
|
try {
|
||||||
|
auto logPath = GetPathRelativeToAppDirectory(("logs/" + GetName() + ".log").c_str());
|
||||||
|
|
||||||
// Setup Logging
|
// Setup Logging
|
||||||
spdlog::init_thread_pool(8192, 1);
|
spdlog::init_thread_pool(8192, 1);
|
||||||
auto SohConsoleSink = std::make_shared<spdlog::sinks::soh_sink_mt>();
|
auto SohConsoleSink = std::make_shared<spdlog::sinks::soh_sink_mt>();
|
||||||
auto ConsoleSink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
|
auto ConsoleSink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
|
||||||
auto FileSink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("logs/" + GetName() + ".log", 1024 * 1024 * 10, 10);
|
auto FileSink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(logPath, 1024 * 1024 * 10, 10);
|
||||||
SohConsoleSink->set_level(spdlog::level::trace);
|
SohConsoleSink->set_level(spdlog::level::trace);
|
||||||
ConsoleSink->set_level(spdlog::level::trace);
|
ConsoleSink->set_level(spdlog::level::trace);
|
||||||
FileSink->set_level(spdlog::level::trace);
|
FileSink->set_level(spdlog::level::trace);
|
||||||
|
@ -24,6 +24,9 @@ namespace Ship {
|
|||||||
std::shared_ptr<spdlog::logger> GetLogger() { return Logger; }
|
std::shared_ptr<spdlog::logger> GetLogger() { return Logger; }
|
||||||
std::shared_ptr<ConfigFile> GetConfig() { return Config; }
|
std::shared_ptr<ConfigFile> GetConfig() { return Config; }
|
||||||
|
|
||||||
|
static std::string GetAppDirectoryPath();
|
||||||
|
static std::string GetPathRelativeToAppDirectory(const char* path);
|
||||||
|
|
||||||
void WriteSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size);
|
void WriteSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size);
|
||||||
void ReadSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size);
|
void ReadSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size);
|
||||||
|
|
||||||
|
@ -304,6 +304,11 @@ namespace SohImGui {
|
|||||||
SohImGui::overlay->TextDrawNotification(30.0f, true, "Press F1 to access enhancements menu");
|
SohImGui::overlay->TextDrawNotification(30.0f, true, "Press F1 to access enhancements menu");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto imguiIniPath = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("imgui.ini");
|
||||||
|
auto imguiLogPath = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("imgui_log.txt");
|
||||||
|
io->IniFilename = strcpy(new char[imguiIniPath.length() + 1], imguiIniPath.c_str());
|
||||||
|
io->LogFilename = strcpy(new char[imguiLogPath.length() + 1], imguiLogPath.c_str());
|
||||||
|
|
||||||
if (UseViewports()) {
|
if (UseViewports()) {
|
||||||
io->ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
|
io->ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
|
||||||
}
|
}
|
||||||
|
60
libultraship/libultraship/OSXFolderManager.h
Normal file
60
libultraship/libultraship/OSXFolderManager.h
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
//
|
||||||
|
// OSXFolderManager.h
|
||||||
|
// libultraship
|
||||||
|
//
|
||||||
|
// Created by David Chavez on 28.06.22.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef OSXFolderManager_h
|
||||||
|
#define OSXFolderManager_h
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
namespace Ship {
|
||||||
|
enum {
|
||||||
|
NSApplicationDirectory = 1,
|
||||||
|
NSDemoApplicationDirectory,
|
||||||
|
NSDeveloperApplicationDirectory,
|
||||||
|
NSAdminApplicationDirectory,
|
||||||
|
NSLibraryDirectory,
|
||||||
|
NSDeveloperDirectory,
|
||||||
|
NSUserDirectory,
|
||||||
|
NSDocumentationDirectory,
|
||||||
|
NSDocumentDirectory,
|
||||||
|
NSCoreServiceDirectory,
|
||||||
|
NSAutosavedInformationDirectory = 11,
|
||||||
|
NSDesktopDirectory = 12,
|
||||||
|
NSCachesDirectory = 13,
|
||||||
|
NSApplicationSupportDirectory = 14,
|
||||||
|
NSDownloadsDirectory = 15,
|
||||||
|
NSInputMethodsDirectory = 16,
|
||||||
|
NSMoviesDirectory = 17,
|
||||||
|
NSMusicDirectory = 18,
|
||||||
|
NSPicturesDirectory = 19,
|
||||||
|
NSPrinterDescriptionDirectory = 20,
|
||||||
|
NSSharedPublicDirectory = 21,
|
||||||
|
NSPreferencePanesDirectory = 22,
|
||||||
|
NSApplicationScriptsDirectory = 23,
|
||||||
|
NSItemReplacementDirectory = 99,
|
||||||
|
NSAllApplicationsDirectory = 100,
|
||||||
|
NSAllLibrariesDirectory = 101,
|
||||||
|
NSTrashDirectory = 102
|
||||||
|
};
|
||||||
|
typedef unsigned long SearchPathDirectory;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
NSUserDomainMask = 1, // user's home directory --- place to install user's personal items (~)
|
||||||
|
NSLocalDomainMask = 2, // local to the current machine --- place to install items available to everyone on this machine (/Library)
|
||||||
|
NSNetworkDomainMask = 4, // publically available location in the local area network --- place to install items available on the network (/Network)
|
||||||
|
NSSystemDomainMask = 8, // provided by Apple, unmodifiable (/System)
|
||||||
|
NSAllDomainsMask = 0x0ffff // all domains: all of the above and future items
|
||||||
|
};
|
||||||
|
typedef unsigned long SearchPathDomainMask;
|
||||||
|
|
||||||
|
class FolderManager {
|
||||||
|
public:
|
||||||
|
const char *pathForDirectory(SearchPathDirectory directory, SearchPathDomainMask domainMask);
|
||||||
|
const char *pathForDirectoryAppropriateForItemAtPath(SearchPathDirectory directory, SearchPathDomainMask domainMask, const char *itemPath, bool create = false);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* OSXFolderManager_h */
|
37
libultraship/libultraship/OSXFolderManager.mm
Normal file
37
libultraship/libultraship/OSXFolderManager.mm
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
//
|
||||||
|
// OSXFolderManager.m
|
||||||
|
// libultraship
|
||||||
|
//
|
||||||
|
// Created by David Chavez on 28.06.22.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "OSXFolderManager.h"
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
using namespace Ship;
|
||||||
|
|
||||||
|
const char * FolderManager::pathForDirectory(SearchPathDirectory directory, SearchPathDomainMask domainMask) {
|
||||||
|
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||||
|
NSArray *URLs = [fileManager URLsForDirectory:(NSSearchPathDirectory)directory inDomains:domainMask];
|
||||||
|
if (URLs.count == 0) return NULL;
|
||||||
|
|
||||||
|
NSURL *URL = [URLs objectAtIndex:0];
|
||||||
|
NSString *path = URL.path;
|
||||||
|
|
||||||
|
// `fileSystemRepresentation` on an `NSString` gives a path suitable for POSIX APIs
|
||||||
|
return path.fileSystemRepresentation;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * FolderManager::pathForDirectoryAppropriateForItemAtPath(SearchPathDirectory directory,
|
||||||
|
SearchPathDomainMask domainMask, const char *itemPath, bool create) {
|
||||||
|
|
||||||
|
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||||
|
NSString *nsPath = [fileManager stringWithFileSystemRepresentation:itemPath length:strlen(itemPath)];
|
||||||
|
NSURL *itemURL = (nsPath ? [NSURL fileURLWithPath:nsPath] : nil);
|
||||||
|
|
||||||
|
NSURL *URL = [fileManager URLForDirectory:(NSSearchPathDirectory)directory
|
||||||
|
inDomain:domainMask
|
||||||
|
appropriateForURL:itemURL
|
||||||
|
create:create error:NULL];
|
||||||
|
return URL.path.fileSystemRepresentation;
|
||||||
|
}
|
@ -120,6 +120,7 @@ ifeq ($(UNAME), Darwin) #APPLE
|
|||||||
LDLIBS += \
|
LDLIBS += \
|
||||||
$(addprefix -framework , \
|
$(addprefix -framework , \
|
||||||
OpenGL \
|
OpenGL \
|
||||||
|
Foundation \
|
||||||
) \
|
) \
|
||||||
$(shell sdl2-config --libs) $(shell pkg-config --libs glew)
|
$(shell sdl2-config --libs) $(shell pkg-config --libs glew)
|
||||||
endif
|
endif
|
||||||
@ -224,9 +225,6 @@ appbundle: macosx/$(APPNAME).icns
|
|||||||
cp macosx/PkgInfo $(APPBUNDLECONTENTS)/
|
cp macosx/PkgInfo $(APPBUNDLECONTENTS)/
|
||||||
cp macosx/$(APPNAME).icns $(APPBUNDLEICON)/
|
cp macosx/$(APPNAME).icns $(APPBUNDLEICON)/
|
||||||
cp $(TARGET) $(APPBUNDLEEXE)/soh
|
cp $(TARGET) $(APPBUNDLEEXE)/soh
|
||||||
cp macosx/launcher.sh $(APPBUNDLEEXE)/launcher.sh
|
|
||||||
clang -ObjC macosx/appsupport.m -arch arm64 -arch x86_64 -framework Foundation -o macosx/appsupport
|
|
||||||
cp macosx/appsupport $(APPBUNDLEEXE)/appsupport
|
|
||||||
otool -l $(TARGET) | grep -A 2 LC_RPATH | tail -n 1 | awk '{print $2}' | dylibbundler -od -b -x $(APPBUNDLEEXE)/soh -d $(APPBUNDLECONTENTS)/libs
|
otool -l $(TARGET) | grep -A 2 LC_RPATH | tail -n 1 | awk '{print $2}' | dylibbundler -od -b -x $(APPBUNDLEEXE)/soh -d $(APPBUNDLECONTENTS)/libs
|
||||||
|
|
||||||
macosx/$(APPNAME).icns: macosx/$(APPNAME)Icon.png
|
macosx/$(APPNAME).icns: macosx/$(APPNAME)Icon.png
|
||||||
@ -244,7 +242,3 @@ macosx/$(APPNAME).icns: macosx/$(APPNAME)Icon.png
|
|||||||
cp macosx/$(APPNAME)Icon.png macosx/$(APPNAME).iconset/icon_512x512@2x.png
|
cp macosx/$(APPNAME)Icon.png macosx/$(APPNAME).iconset/icon_512x512@2x.png
|
||||||
iconutil -c icns -o macosx/$(APPNAME).icns macosx/$(APPNAME).iconset
|
iconutil -c icns -o macosx/$(APPNAME).icns macosx/$(APPNAME).iconset
|
||||||
rm -r macosx/$(APPNAME).iconset
|
rm -r macosx/$(APPNAME).iconset
|
||||||
|
|
||||||
filledappbundle: appbundle
|
|
||||||
cp ./oot.otr $(APPBUNDLEEXE)/oot.otr
|
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<key>CFBundleName</key>
|
<key>CFBundleName</key>
|
||||||
<string>Ship of Harkinian</string>
|
<string>Ship of Harkinian</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>launcher.sh</string>
|
<string>soh</string>
|
||||||
<key>CFBundleGetInfoString</key>
|
<key>CFBundleGetInfoString</key>
|
||||||
<string>2.0.0</string>
|
<string>2.0.0</string>
|
||||||
<key>CFBundleIconFile</key>
|
<key>CFBundleIconFile</key>
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
#import <Foundation/Foundation.h>
|
|
||||||
int main(void) {
|
|
||||||
NSString *appSupportDir = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject];
|
|
||||||
//If there isn't an App Support Directory yet ...
|
|
||||||
if (![[NSFileManager defaultManager] fileExistsAtPath:appSupportDir isDirectory:NULL]) {
|
|
||||||
NSError *error = nil;
|
|
||||||
//Create one
|
|
||||||
if (![[NSFileManager defaultManager] createDirectoryAtPath:appSupportDir withIntermediateDirectories:YES attributes:nil error:&error]) {
|
|
||||||
NSLog(@"%@", error.localizedDescription);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// *** OPTIONAL *** Mark the directory as excluded from iCloud backups
|
|
||||||
NSURL *url = [NSURL fileURLWithPath:appSupportDir];
|
|
||||||
if (![url setResourceValue:@YES
|
|
||||||
forKey:NSURLIsExcludedFromBackupKey
|
|
||||||
error:&error])
|
|
||||||
{
|
|
||||||
NSLog(@"Error excluding %@ from backup %@", url.lastPathComponent, error.localizedDescription);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
NSLog(@"Yay");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printf("%s\n", [appSupportDir UTF8String]);
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
APPPATH="${0%/*}"
|
|
||||||
cd "${APPPATH}"
|
|
||||||
APPPATH=$(pwd)
|
|
||||||
APPSUPPORT=$(./appsupport)
|
|
||||||
mkdir -p "${APPSUPPORT}/com.shipofharkinian.soh"
|
|
||||||
cd "${APPSUPPORT}/com.shipofharkinian.soh"
|
|
||||||
cp "${APPPATH}/oot.otr" .
|
|
||||||
${APPPATH}/soh
|
|
@ -500,8 +500,9 @@ template <typename Numeric> bool is_number(const std::string& s) {
|
|||||||
|
|
||||||
void DebugConsole_LoadCVars()
|
void DebugConsole_LoadCVars()
|
||||||
{
|
{
|
||||||
if (File::Exists("cvars.cfg")) {
|
auto cvarsConfig = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("cvars.cfg");
|
||||||
const auto lines = File::ReadAllLines("cvars.cfg");
|
if (File::Exists(cvarsConfig)) {
|
||||||
|
const auto lines = File::ReadAllLines(cvarsConfig);
|
||||||
|
|
||||||
for (const std::string& line : lines) {
|
for (const std::string& line : lines) {
|
||||||
std::vector<std::string> cfg = StringHelper::Split(line, " = ");
|
std::vector<std::string> cfg = StringHelper::Split(line, " = ");
|
||||||
@ -535,5 +536,7 @@ void DebugConsole_SaveCVars()
|
|||||||
output += StringHelper::Sprintf("%s = %f\n", cvar.first.c_str(), cvar.second->value.valueFloat);
|
output += StringHelper::Sprintf("%s = %f\n", cvar.first.c_str(), cvar.second->value.valueFloat);
|
||||||
}
|
}
|
||||||
|
|
||||||
File::WriteAllText("cvars.cfg", output);
|
|
||||||
|
auto cvarsConfig = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("cvars.cfg");
|
||||||
|
File::WriteAllText(cvarsConfig, output);
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,6 @@ OTRGlobals* OTRGlobals::Instance;
|
|||||||
SaveManager* SaveManager::Instance;
|
SaveManager* SaveManager::Instance;
|
||||||
|
|
||||||
OTRGlobals::OTRGlobals() {
|
OTRGlobals::OTRGlobals() {
|
||||||
|
|
||||||
context = Ship::GlobalCtx2::CreateInstance("Ship of Harkinian");
|
context = Ship::GlobalCtx2::CreateInstance("Ship of Harkinian");
|
||||||
gSaveStateMgr = std::make_shared<SaveStateMgr>();
|
gSaveStateMgr = std::make_shared<SaveStateMgr>();
|
||||||
gRandomizer = std::make_shared<Randomizer>();
|
gRandomizer = std::make_shared<Randomizer>();
|
||||||
@ -1158,7 +1157,7 @@ std::filesystem::path GetSaveFile(Ship::ConfigFile& Conf) {
|
|||||||
std::string fileName = Conf.get("SAVE").get("Save Filename");
|
std::string fileName = Conf.get("SAVE").get("Save Filename");
|
||||||
|
|
||||||
if (fileName.empty()) {
|
if (fileName.empty()) {
|
||||||
Conf["SAVE"]["Save Filename"] = "oot_save.sav";
|
Conf["SAVE"]["Save Filename"] = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("oot_save.sav");
|
||||||
Conf.Save();
|
Conf.Save();
|
||||||
}
|
}
|
||||||
std::filesystem::path saveFile = std::filesystem::absolute(fileName);
|
std::filesystem::path saveFile = std::filesystem::absolute(fileName);
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "SaveManager.h"
|
#include "SaveManager.h"
|
||||||
|
#include "OTRGlobals.h"
|
||||||
|
|
||||||
#include "z64.h"
|
#include "z64.h"
|
||||||
#include "functions.h"
|
#include "functions.h"
|
||||||
@ -14,11 +15,9 @@
|
|||||||
|
|
||||||
extern "C" SaveContext gSaveContext;
|
extern "C" SaveContext gSaveContext;
|
||||||
|
|
||||||
static const std::filesystem::path sSavePath("Save"); // TODO maybe let this be user-configurable?
|
|
||||||
static const std::filesystem::path sGlobalPath = sSavePath / "global.sav";
|
|
||||||
|
|
||||||
std::filesystem::path SaveManager::GetFileName(int fileNum) {
|
std::filesystem::path SaveManager::GetFileName(int fileNum) {
|
||||||
return sSavePath / (std::string("file") + std::to_string(fileNum + 1) + ".sav");
|
const std::filesystem::path sSavePath(Ship::GlobalCtx2::GetPathRelativeToAppDirectory("Save"));
|
||||||
|
return sSavePath / ("file" + std::to_string(fileNum + 1) + ".sav");
|
||||||
}
|
}
|
||||||
|
|
||||||
SaveManager::SaveManager() {
|
SaveManager::SaveManager() {
|
||||||
@ -128,15 +127,20 @@ void SaveManager::SaveRandomizer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SaveManager::Init() {
|
void SaveManager::Init() {
|
||||||
|
const std::filesystem::path sSavePath(Ship::GlobalCtx2::GetPathRelativeToAppDirectory("Save"));
|
||||||
|
const std::filesystem::path sGlobalPath = sSavePath / std::string("global.sav");
|
||||||
|
auto sOldSavePath = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("oot_save.sav");
|
||||||
|
auto sOldBackupSavePath = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("oot_save.bak");
|
||||||
|
|
||||||
// If the save directory does not exist, create it
|
// If the save directory does not exist, create it
|
||||||
if (!std::filesystem::exists(sSavePath)) {
|
if (!std::filesystem::exists(sSavePath)) {
|
||||||
std::filesystem::create_directory(sSavePath);
|
std::filesystem::create_directory(sSavePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there is a lingering unversioned save, convert it
|
// If there is a lingering unversioned save, convert it
|
||||||
if (std::filesystem::exists("oot_save.sav")) {
|
if (std::filesystem::exists(sOldSavePath)) {
|
||||||
ConvertFromUnversioned();
|
ConvertFromUnversioned();
|
||||||
std::filesystem::rename("oot_save.sav", "oot_save.bak");
|
std::filesystem::rename(sOldSavePath, sOldBackupSavePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the global save file exist, load it. Otherwise, create it.
|
// If the global save file exist, load it. Otherwise, create it.
|
||||||
|
Loading…
Reference in New Issue
Block a user