Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 625f752fb9 |
@@ -7,14 +7,10 @@ on:
|
|||||||
- '*LICENSE'
|
- '*LICENSE'
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || format('run-{0}', github.run_id) }}
|
|
||||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
SCCACHE_GHA_ENABLED: "true"
|
SCCACHE_GHA_ENABLED: "true"
|
||||||
RUSTC_WRAPPER: "sccache"
|
RUSTC_WRAPPER: "sccache"
|
||||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
# SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-linux:
|
build-linux:
|
||||||
@@ -26,13 +22,13 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- name: GCC x86_64
|
- name: GCC x86_64
|
||||||
runner: ubuntu-24.04
|
runner: ubuntu-latest
|
||||||
preset: gcc
|
preset: gcc
|
||||||
artifact_arch: x86_64
|
artifact_arch: x86_64
|
||||||
- name: GCC aarch64
|
# - name: GCC aarch64
|
||||||
runner: ubuntu-24.04-arm
|
# runner: ubuntu-24.04-arm
|
||||||
preset: gcc
|
# preset: gcc
|
||||||
artifact_arch: aarch64
|
# artifact_arch: aarch64
|
||||||
# - name: Clang x86_64
|
# - name: Clang x86_64
|
||||||
# runner: ubuntu-latest
|
# runner: ubuntu-latest
|
||||||
# preset: clang
|
# preset: clang
|
||||||
@@ -54,7 +50,7 @@ jobs:
|
|||||||
libxss-dev libfuse2 libusb-1.0-0-dev libdecor-0-dev libpipewire-0.3-dev libunwind-dev
|
libxss-dev libfuse2 libusb-1.0-0-dev libdecor-0-dev libpipewire-0.3-dev libunwind-dev
|
||||||
|
|
||||||
- name: Setup sccache
|
- name: Setup sccache
|
||||||
uses: mozilla-actions/sccache-action@v0.0.10
|
uses: mozilla-actions/sccache-action@v0.0.9
|
||||||
|
|
||||||
- name: Print sccache stats
|
- name: Print sccache stats
|
||||||
run: sccache --show-stats
|
run: sccache --show-stats
|
||||||
@@ -71,9 +67,9 @@ jobs:
|
|||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@v7
|
uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
name: dusklight-${{env.DUSK_VERSION}}-linux-${{matrix.preset}}-${{matrix.artifact_arch}}
|
name: dusk-${{env.DUSK_VERSION}}-linux-${{matrix.preset}}-${{matrix.artifact_arch}}
|
||||||
path: |
|
path: |
|
||||||
build/install/Dusklight-*.AppImage
|
build/install/Dusk-*.AppImage
|
||||||
build/install/debug.tar.*
|
build/install/debug.tar.*
|
||||||
|
|
||||||
build-apple:
|
build-apple:
|
||||||
@@ -128,7 +124,7 @@ jobs:
|
|||||||
rustup target add x86_64-apple-darwin
|
rustup target add x86_64-apple-darwin
|
||||||
|
|
||||||
- name: Setup sccache
|
- name: Setup sccache
|
||||||
uses: mozilla-actions/sccache-action@v0.0.10
|
uses: mozilla-actions/sccache-action@v0.0.9
|
||||||
|
|
||||||
- name: Configure CMake
|
- name: Configure CMake
|
||||||
run: cmake --preset ${{matrix.preset}}
|
run: cmake --preset ${{matrix.preset}}
|
||||||
@@ -139,9 +135,9 @@ jobs:
|
|||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@v7
|
uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
name: dusklight-${{env.DUSK_VERSION}}-${{matrix.artifact_name}}
|
name: dusk-${{env.DUSK_VERSION}}-${{matrix.artifact_name}}
|
||||||
path: |
|
path: |
|
||||||
build/install/Dusklight.app
|
build/install/Dusk.app
|
||||||
build/install/debug.tar.*
|
build/install/debug.tar.*
|
||||||
|
|
||||||
build-android:
|
build-android:
|
||||||
@@ -179,7 +175,7 @@ jobs:
|
|||||||
java-version: 17
|
java-version: 17
|
||||||
|
|
||||||
- name: Setup Android SDK
|
- name: Setup Android SDK
|
||||||
uses: android-actions/setup-android@v4
|
uses: android-actions/setup-android@v3
|
||||||
|
|
||||||
- name: Install Android SDK packages
|
- name: Install Android SDK packages
|
||||||
run: sdkmanager "platforms;android-36" "build-tools;36.1.0" "ndk;${ANDROID_NDK_VERSION}"
|
run: sdkmanager "platforms;android-36" "build-tools;36.1.0" "ndk;${ANDROID_NDK_VERSION}"
|
||||||
@@ -190,13 +186,13 @@ jobs:
|
|||||||
rustup target add ${{matrix.rust_target}}
|
rustup target add ${{matrix.rust_target}}
|
||||||
|
|
||||||
- name: Setup sccache
|
- name: Setup sccache
|
||||||
uses: mozilla-actions/sccache-action@v0.0.10
|
uses: mozilla-actions/sccache-action@v0.0.9
|
||||||
|
|
||||||
- name: Configure CMake
|
- name: Configure CMake
|
||||||
run: cmake --preset ${{matrix.preset}}
|
run: cmake --preset ${{matrix.preset}}
|
||||||
|
|
||||||
- name: Build native library
|
- name: Build native library
|
||||||
run: cmake --build --preset ${{matrix.preset}} --target dusklight
|
run: cmake --build --preset ${{matrix.preset}} --target dusk
|
||||||
|
|
||||||
- name: Stage stripped JNI library
|
- name: Stage stripped JNI library
|
||||||
run: ANDROID_STAGE_ABIS="${{matrix.abi}}" platforms/android/scripts/stage-jni-libs.sh
|
run: ANDROID_STAGE_ABIS="${{matrix.abi}}" platforms/android/scripts/stage-jni-libs.sh
|
||||||
@@ -208,7 +204,7 @@ jobs:
|
|||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@v7
|
uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
name: dusklight-${{env.DUSK_VERSION}}-android-${{matrix.artifact_arch}}
|
name: dusk-${{env.DUSK_VERSION}}-android-${{matrix.artifact_arch}}
|
||||||
path: platforms/android/app/build/outputs/apk/release/app-${{matrix.abi}}-release-unsigned.apk
|
path: platforms/android/app/build/outputs/apk/release/app-${{matrix.abi}}-release-unsigned.apk
|
||||||
|
|
||||||
build-windows:
|
build-windows:
|
||||||
@@ -225,12 +221,12 @@ jobs:
|
|||||||
msvc_arch: amd64
|
msvc_arch: amd64
|
||||||
vcpkg_arch: x64
|
vcpkg_arch: x64
|
||||||
artifact_arch: x86_64
|
artifact_arch: x86_64
|
||||||
- name: MSVC arm64
|
# - name: MSVC arm64
|
||||||
runner: windows-latest
|
# runner: windows-11-arm
|
||||||
preset: arm64-msvc
|
# preset: arm64-msvc
|
||||||
msvc_arch: amd64_arm64
|
# msvc_arch: arm64
|
||||||
vcpkg_arch: arm64
|
# vcpkg_arch: arm64
|
||||||
artifact_arch: arm64
|
# artifact_arch: arm64
|
||||||
# - name: Clang x86_64
|
# - name: Clang x86_64
|
||||||
# runner: windows-latest
|
# runner: windows-latest
|
||||||
# preset: clang
|
# preset: clang
|
||||||
@@ -259,7 +255,7 @@ jobs:
|
|||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
choco install ninja
|
choco install ninja
|
||||||
vcpkg install freetype:${{matrix.vcpkg_arch}}-windows zstd:${{matrix.vcpkg_arch}}-windows
|
vcpkg install freetype:${{matrix.vcpkg_arch}}-windows-static zstd:${{matrix.vcpkg_arch}}-windows-static
|
||||||
|
|
||||||
- name: Configure CMake
|
- name: Configure CMake
|
||||||
run: cmake --preset x-windows-ci-${{matrix.preset}}
|
run: cmake --preset x-windows-ci-${{matrix.preset}}
|
||||||
@@ -270,7 +266,7 @@ jobs:
|
|||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@v7
|
uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
name: dusklight-${{env.DUSK_VERSION}}-win32-msvc-${{matrix.artifact_arch}}
|
name: dusk-${{env.DUSK_VERSION}}-win32-msvc-${{matrix.artifact_arch}}
|
||||||
path: |
|
path: |
|
||||||
build/install/*.exe
|
build/install/*.exe
|
||||||
build/install/*.dll
|
build/install/*.dll
|
||||||
|
|||||||
@@ -41,10 +41,6 @@ compile_commands.json
|
|||||||
# MacOS
|
# MacOS
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
# direnv / nix
|
|
||||||
.direnv/
|
|
||||||
.envrc
|
|
||||||
|
|
||||||
# ISOs
|
# ISOs
|
||||||
*.iso
|
*.iso
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
{
|
||||||
"name": "(gdb) Launch Dusklight MSVC",
|
"name": "(gdb) Launch Dusk MSVC",
|
||||||
"type": "cppvsdbg",
|
"type": "cppvsdbg",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"program": "${command:cmake.launchTargetPath}",
|
"program": "${command:cmake.launchTargetPath}",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cmake.buildDirectory": "${workspaceFolder}/build/dusklight/${buildType}/${variant:tp_version}",
|
"cmake.buildDirectory": "${workspaceFolder}/build/dusk/${buildType}/${variant:tp_version}",
|
||||||
"cmake.generator": "Ninja",
|
"cmake.generator": "Ninja",
|
||||||
"cmake.configureSettings": {
|
"cmake.configureSettings": {
|
||||||
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
|
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
|
||||||
|
|||||||
@@ -5,20 +5,8 @@ if (NOT CMAKE_BUILD_TYPE)
|
|||||||
"Build type options: Debug Release RelWithDebInfo MinSizeRel" FORCE)
|
"Build type options: Debug Release RelWithDebInfo MinSizeRel" FORCE)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
set(DUSK_VERSION_OVERRIDE "" CACHE STRING "Override version string (skips git detection and format validation)")
|
# obtain revision info from git
|
||||||
|
find_package(Git)
|
||||||
if (DUSK_VERSION_OVERRIDE)
|
|
||||||
set(DUSK_WC_DESCRIBE "${DUSK_VERSION_OVERRIDE}")
|
|
||||||
set(DUSK_VERSION_STRING "0.0.0.0")
|
|
||||||
set(DUSK_SHORT_VERSION_STRING "0.0.0")
|
|
||||||
set(DUSK_VERSION_CODE "1")
|
|
||||||
set(DUSK_WC_REVISION "")
|
|
||||||
set(DUSK_WC_BRANCH "")
|
|
||||||
set(DUSK_WC_DATE "")
|
|
||||||
message(STATUS "Dusklight version overridden to ${DUSK_WC_DESCRIBE}")
|
|
||||||
else ()
|
|
||||||
# obtain revision info from git
|
|
||||||
find_package(Git)
|
|
||||||
if (GIT_FOUND)
|
if (GIT_FOUND)
|
||||||
# make sure version information gets re-run when the current Git HEAD changes
|
# make sure version information gets re-run when the current Git HEAD changes
|
||||||
execute_process(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --git-path HEAD
|
execute_process(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --git-path HEAD
|
||||||
@@ -62,9 +50,6 @@ endif ()
|
|||||||
|
|
||||||
if (DUSK_WC_DESCRIBE MATCHES "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)([-+].*)?$")
|
if (DUSK_WC_DESCRIBE MATCHES "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)([-+].*)?$")
|
||||||
set(DUSK_SHORT_VERSION_STRING "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}")
|
set(DUSK_SHORT_VERSION_STRING "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}")
|
||||||
set(_ver_major ${CMAKE_MATCH_1})
|
|
||||||
set(_ver_minor ${CMAKE_MATCH_2})
|
|
||||||
set(_ver_patch ${CMAKE_MATCH_3})
|
|
||||||
set(DUSK_VERSION_TWEAK "0")
|
set(DUSK_VERSION_TWEAK "0")
|
||||||
if (DUSK_WC_DESCRIBE MATCHES "^v[0-9]+\\.[0-9]+\\.[0-9]+-([0-9]+)(-dirty)?$")
|
if (DUSK_WC_DESCRIBE MATCHES "^v[0-9]+\\.[0-9]+\\.[0-9]+-([0-9]+)(-dirty)?$")
|
||||||
set(DUSK_VERSION_TWEAK "${CMAKE_MATCH_1}")
|
set(DUSK_VERSION_TWEAK "${CMAKE_MATCH_1}")
|
||||||
@@ -72,36 +57,22 @@ if (DUSK_WC_DESCRIBE MATCHES "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)([-+].*)?$")
|
|||||||
set(DUSK_VERSION_TWEAK "${CMAKE_MATCH_1}")
|
set(DUSK_VERSION_TWEAK "${CMAKE_MATCH_1}")
|
||||||
endif ()
|
endif ()
|
||||||
set(DUSK_VERSION_STRING "${DUSK_SHORT_VERSION_STRING}.${DUSK_VERSION_TWEAK}")
|
set(DUSK_VERSION_STRING "${DUSK_SHORT_VERSION_STRING}.${DUSK_VERSION_TWEAK}")
|
||||||
if(DUSK_VERSION_TWEAK GREATER 999)
|
|
||||||
set(_tweak 999)
|
|
||||||
else()
|
|
||||||
set(_tweak ${DUSK_VERSION_TWEAK})
|
|
||||||
endif()
|
|
||||||
# encoding: major*1e7 + minor*1e5 + patch*1e3 + tweak; collision-free for major<210, minor<100, patch<100, tweak<=999
|
|
||||||
math(EXPR DUSK_VERSION_CODE
|
|
||||||
"${_ver_major} * 10000000 + ${_ver_minor} * 100000 + ${_ver_patch} * 1000 + ${_tweak}")
|
|
||||||
else ()
|
else ()
|
||||||
set(DUSK_WC_DESCRIBE "UNKNOWN-VERSION")
|
set(DUSK_WC_DESCRIBE "UNKNOWN-VERSION")
|
||||||
set(DUSK_VERSION_STRING "0.0.0.0")
|
set(DUSK_VERSION_STRING "0.0.0.0")
|
||||||
set(DUSK_SHORT_VERSION_STRING "0.0.0")
|
set(DUSK_SHORT_VERSION_STRING "0.0.0")
|
||||||
set(DUSK_VERSION_CODE "1")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
# Add version information to CI environment variables
|
# Add version information to CI environment variables
|
||||||
if(DEFINED ENV{GITHUB_ENV})
|
if(DEFINED ENV{GITHUB_ENV})
|
||||||
file(APPEND "$ENV{GITHUB_ENV}" "DUSK_VERSION=${DUSK_WC_DESCRIBE}\n")
|
file(APPEND "$ENV{GITHUB_ENV}" "DUSK_VERSION=${DUSK_WC_DESCRIBE}\n")
|
||||||
file(APPEND "$ENV{GITHUB_ENV}" "DUSK_VERSION_CODE=${DUSK_VERSION_CODE}\n")
|
|
||||||
endif()
|
endif()
|
||||||
message(STATUS "Dusklight version set to ${DUSK_WC_DESCRIBE}")
|
message(STATUS "Dusk version set to ${DUSK_WC_DESCRIBE}")
|
||||||
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
|
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
|
||||||
project(dusklight LANGUAGES C CXX VERSION ${DUSK_VERSION_STRING})
|
project(dusk LANGUAGES C CXX VERSION ${DUSK_VERSION_STRING})
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
enable_language(OBJC OBJCXX)
|
enable_language(OBJC OBJCXX)
|
||||||
endif ()
|
endif ()
|
||||||
# Adjust CMAKE_SYSTEM_PROCESSOR on Windows to match compiler target
|
|
||||||
include(cmake/WindowsTargetProcessor.cmake)
|
|
||||||
if (APPLE AND NOT TVOS AND CMAKE_SYSTEM_NAME STREQUAL tvOS)
|
if (APPLE AND NOT TVOS AND CMAKE_SYSTEM_NAME STREQUAL tvOS)
|
||||||
# ios.toolchain.cmake hack for SDL
|
# ios.toolchain.cmake hack for SDL
|
||||||
set(TVOS ON)
|
set(TVOS ON)
|
||||||
@@ -141,6 +112,11 @@ option(DUSK_BUILD_WARNINGS "Enable compiler warnings (off by default)")
|
|||||||
option(DUSK_SELECTED_OPT "If on, selected parts of the project will be compiled with optimizations on Debug, intending to make the game run at 30 FPS. Note for MSVC: you will need to remove '/RTC1' from your debug flags in CMake.")
|
option(DUSK_SELECTED_OPT "If on, selected parts of the project will be compiled with optimizations on Debug, intending to make the game run at 30 FPS. Note for MSVC: you will need to remove '/RTC1' from your debug flags in CMake.")
|
||||||
option(DUSK_MOVIE_SUPPORT "If on, compile against libjpeg-turbo to enable THP file decoding" ON)
|
option(DUSK_MOVIE_SUPPORT "If on, compile against libjpeg-turbo to enable THP file decoding" ON)
|
||||||
option(DUSK_ENABLE_UPDATE_CHECKER "Enable update checking support" ON)
|
option(DUSK_ENABLE_UPDATE_CHECKER "Enable update checking support" ON)
|
||||||
|
|
||||||
|
if(ANDROID)
|
||||||
|
set(DUSK_MOVIE_SUPPORT OFF)
|
||||||
|
endif ()
|
||||||
|
|
||||||
option(DUSK_ENABLE_SENTRY_NATIVE "Enable sentry-native crash reporting support" OFF)
|
option(DUSK_ENABLE_SENTRY_NATIVE "Enable sentry-native crash reporting support" OFF)
|
||||||
set(DUSK_SENTRY_DSN "" CACHE STRING "Sentry DSN")
|
set(DUSK_SENTRY_DSN "" CACHE STRING "Sentry DSN")
|
||||||
set(DUSK_SENTRY_ENVIRONMENT "development" CACHE STRING "Sentry environment")
|
set(DUSK_SENTRY_ENVIRONMENT "development" CACHE STRING "Sentry environment")
|
||||||
@@ -158,9 +134,9 @@ endif ()
|
|||||||
if (DUSK_MOVIE_SUPPORT)
|
if (DUSK_MOVIE_SUPPORT)
|
||||||
find_package(libjpeg-turbo 3.0 CONFIG QUIET)
|
find_package(libjpeg-turbo 3.0 CONFIG QUIET)
|
||||||
if (libjpeg-turbo_FOUND)
|
if (libjpeg-turbo_FOUND)
|
||||||
message(STATUS "dusklight: Using system libjpeg-turbo")
|
message(STATUS "dusk: Using system libjpeg-turbo")
|
||||||
else ()
|
else ()
|
||||||
message(STATUS "dusklight: Fetching libjpeg-turbo")
|
message(STATUS "dusk: Fetching libjpeg-turbo")
|
||||||
include(ExternalProject)
|
include(ExternalProject)
|
||||||
set(_jpeg_install_dir ${CMAKE_BINARY_DIR}/libjpeg-turbo-install)
|
set(_jpeg_install_dir ${CMAKE_BINARY_DIR}/libjpeg-turbo-install)
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
@@ -170,7 +146,6 @@ if (DUSK_MOVIE_SUPPORT)
|
|||||||
endif ()
|
endif ()
|
||||||
set(_jpeg_cmake_args
|
set(_jpeg_cmake_args
|
||||||
-DCMAKE_INSTALL_PREFIX=${_jpeg_install_dir}
|
-DCMAKE_INSTALL_PREFIX=${_jpeg_install_dir}
|
||||||
-DCMAKE_PROJECT_INCLUDE=${CMAKE_CURRENT_SOURCE_DIR}/cmake/WindowsTargetProcessor.cmake
|
|
||||||
-DENABLE_SHARED=OFF
|
-DENABLE_SHARED=OFF
|
||||||
-DWITH_TURBOJPEG=ON
|
-DWITH_TURBOJPEG=ON
|
||||||
-DWITH_JAVA=OFF
|
-DWITH_JAVA=OFF
|
||||||
@@ -180,8 +155,6 @@ if (DUSK_MOVIE_SUPPORT)
|
|||||||
list(APPEND _jpeg_cmake_args -DCMAKE_TOOLCHAIN_FILE=${_jpeg_toolchain_file})
|
list(APPEND _jpeg_cmake_args -DCMAKE_TOOLCHAIN_FILE=${_jpeg_toolchain_file})
|
||||||
endif ()
|
endif ()
|
||||||
set(_jpeg_passthrough_vars
|
set(_jpeg_passthrough_vars
|
||||||
ANDROID_ABI
|
|
||||||
ANDROID_PLATFORM
|
|
||||||
CMAKE_BUILD_TYPE
|
CMAKE_BUILD_TYPE
|
||||||
CMAKE_C_COMPILER
|
CMAKE_C_COMPILER
|
||||||
CMAKE_C_COMPILER_LAUNCHER
|
CMAKE_C_COMPILER_LAUNCHER
|
||||||
@@ -253,13 +226,13 @@ endif ()
|
|||||||
include(FetchContent)
|
include(FetchContent)
|
||||||
|
|
||||||
# Declare all dependencies first so CMake can download them in parallel
|
# Declare all dependencies first so CMake can download them in parallel
|
||||||
message(STATUS "dusklight: Fetching cxxopts")
|
message(STATUS "dusk: Fetching cxxopts")
|
||||||
FetchContent_Declare(cxxopts
|
FetchContent_Declare(cxxopts
|
||||||
URL https://github.com/jarro2783/cxxopts/archive/refs/tags/v3.3.1.tar.gz
|
URL https://github.com/jarro2783/cxxopts/archive/refs/tags/v3.3.1.tar.gz
|
||||||
URL_HASH SHA256=3bfc70542c521d4b55a46429d808178916a579b28d048bd8c727ee76c39e2072
|
URL_HASH SHA256=3bfc70542c521d4b55a46429d808178916a579b28d048bd8c727ee76c39e2072
|
||||||
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
||||||
)
|
)
|
||||||
message(STATUS "dusklight: Fetching nlohmann/json")
|
message(STATUS "dusk: Fetching nlohmann/json")
|
||||||
FetchContent_Declare(json
|
FetchContent_Declare(json
|
||||||
URL https://github.com/nlohmann/json/releases/download/v3.12.0/json.tar.xz
|
URL https://github.com/nlohmann/json/releases/download/v3.12.0/json.tar.xz
|
||||||
URL_HASH SHA256=42f6e95cad6ec532fd372391373363b62a14af6d771056dbfc86160e6dfff7aa
|
URL_HASH SHA256=42f6e95cad6ec532fd372391373363b62a14af6d771056dbfc86160e6dfff7aa
|
||||||
@@ -268,7 +241,7 @@ FetchContent_Declare(json
|
|||||||
FetchContent_MakeAvailable(cxxopts json)
|
FetchContent_MakeAvailable(cxxopts json)
|
||||||
|
|
||||||
if (DUSK_ENABLE_SENTRY_NATIVE)
|
if (DUSK_ENABLE_SENTRY_NATIVE)
|
||||||
message(STATUS "dusklight: Fetching sentry-native")
|
message(STATUS "dusk: Fetching sentry-native")
|
||||||
set(SENTRY_BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
|
set(SENTRY_BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
|
||||||
set(SENTRY_BACKEND crashpad CACHE STRING "" FORCE)
|
set(SENTRY_BACKEND crashpad CACHE STRING "" FORCE)
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
@@ -293,12 +266,6 @@ if (DUSK_ENABLE_SENTRY_NATIVE)
|
|||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
# Use signed char on ARM to match the original game (and x86)
|
|
||||||
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _arch)
|
|
||||||
if(_arch MATCHES "^(arm|aarch64)" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
|
|
||||||
add_compile_options(-fsigned-char)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL Windows)
|
if (CMAKE_SYSTEM_NAME STREQUAL Windows)
|
||||||
set(PLATFORM_NAME win32)
|
set(PLATFORM_NAME win32)
|
||||||
elseif (CMAKE_SYSTEM_NAME STREQUAL Darwin)
|
elseif (CMAKE_SYSTEM_NAME STREQUAL Darwin)
|
||||||
@@ -319,15 +286,15 @@ include(files.cmake)
|
|||||||
|
|
||||||
# TODO: version handling for res includes
|
# TODO: version handling for res includes
|
||||||
|
|
||||||
set(DUSK_BUNDLE_NAME Dusklight)
|
set(DUSK_BUNDLE_NAME Dusk)
|
||||||
set(DUSK_BUNDLE_IDENTIFIER dev.twilitrealm.dusk)
|
set(DUSK_BUNDLE_IDENTIFIER dev.twilitrealm.dusk)
|
||||||
set(DUSK_COMPANY_NAME "Twilit Realm")
|
set(DUSK_COMPANY_NAME "Twilit Realm")
|
||||||
set(DUSK_FILE_DESCRIPTION "Dusklight")
|
set(DUSK_FILE_DESCRIPTION "Dusk")
|
||||||
set(DUSK_PRODUCT_NAME "Dusklight")
|
set(DUSK_PRODUCT_NAME "Dusk")
|
||||||
set(DUSK_COPYRIGHT "Copyright (C) Twilit Realm contributors")
|
set(DUSK_COPYRIGHT "Copyright (C) Twilit Realm contributors")
|
||||||
|
|
||||||
source_group("dolzel" FILES ${DOLZEL_FILES} ${Z2AUDIOLIB_FILES} ${REL_FILES})
|
source_group("dolzel" FILES ${DOLZEL_FILES} ${Z2AUDIOLIB_FILES} ${REL_FILES})
|
||||||
source_group("dusklight" FILES ${DUSK_FILES} ${DUSK_HTTP_BACKEND_FILES})
|
source_group("dusk" FILES ${DUSK_FILES} ${DUSK_HTTP_BACKEND_FILES})
|
||||||
|
|
||||||
set(GAME_COMPILE_DEFS TARGET_PC WIDESCREEN_SUPPORT=1 AVOID_UB=1 VERSION=0 MTX_USE_PS=1)
|
set(GAME_COMPILE_DEFS TARGET_PC WIDESCREEN_SUPPORT=1 AVOID_UB=1 VERSION=0 MTX_USE_PS=1)
|
||||||
|
|
||||||
@@ -355,10 +322,6 @@ endif ()
|
|||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
list(APPEND GAME_LIBS Ws2_32)
|
list(APPEND GAME_LIBS Ws2_32)
|
||||||
if (CMAKE_BUILD_TYPE STREQUAL Debug)
|
|
||||||
list(APPEND GAME_LIBS dbghelp)
|
|
||||||
list(APPEND GAME_COMPILE_DEFS DUSK_CRASH_DBGHELP=1)
|
|
||||||
endif ()
|
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/no_backend.cpp)
|
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/no_backend.cpp)
|
||||||
@@ -368,30 +331,30 @@ if (DUSK_ENABLE_UPDATE_CHECKER)
|
|||||||
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/winhttp.cpp)
|
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/winhttp.cpp)
|
||||||
list(APPEND GAME_LIBS winhttp)
|
list(APPEND GAME_LIBS winhttp)
|
||||||
list(APPEND GAME_COMPILE_DEFS DUSK_HTTP_BACKEND_WINHTTP=1)
|
list(APPEND GAME_COMPILE_DEFS DUSK_HTTP_BACKEND_WINHTTP=1)
|
||||||
message(STATUS "dusklight: Enabled update checker (WinHTTP)")
|
message(STATUS "dusk: Enabled update checker (WinHTTP)")
|
||||||
elseif (ANDROID)
|
elseif (ANDROID)
|
||||||
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/android.cpp)
|
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/android.cpp)
|
||||||
list(APPEND GAME_COMPILE_DEFS DUSK_HTTP_BACKEND_ANDROID=1)
|
list(APPEND GAME_COMPILE_DEFS DUSK_HTTP_BACKEND_ANDROID=1)
|
||||||
message(STATUS "dusklight: Enabled update checker (Android)")
|
message(STATUS "dusk: Enabled update checker (Android)")
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
find_library(FOUNDATION_FRAMEWORK Foundation REQUIRED)
|
find_library(FOUNDATION_FRAMEWORK Foundation REQUIRED)
|
||||||
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/url_session.mm)
|
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/url_session.mm)
|
||||||
set_source_files_properties(src/dusk/http/url_session.mm PROPERTIES COMPILE_FLAGS -fobjc-arc)
|
set_source_files_properties(src/dusk/http/url_session.mm PROPERTIES COMPILE_FLAGS -fobjc-arc)
|
||||||
list(APPEND GAME_LIBS ${FOUNDATION_FRAMEWORK})
|
list(APPEND GAME_LIBS ${FOUNDATION_FRAMEWORK})
|
||||||
list(APPEND GAME_COMPILE_DEFS DUSK_HTTP_BACKEND_URLSESSION=1)
|
list(APPEND GAME_COMPILE_DEFS DUSK_HTTP_BACKEND_URLSESSION=1)
|
||||||
message(STATUS "dusklight: Enabled update checker (NSURLSession)")
|
message(STATUS "dusk: Enabled update checker (NSURLSession)")
|
||||||
elseif (CMAKE_SYSTEM_NAME STREQUAL Linux)
|
elseif (CMAKE_SYSTEM_NAME STREQUAL Linux)
|
||||||
find_package(CURL QUIET OPTIONAL_COMPONENTS HTTPS SSL)
|
find_package(CURL QUIET OPTIONAL_COMPONENTS HTTPS SSL)
|
||||||
if (CURL_FOUND AND CURL_HTTPS_FOUND AND CURL_SSL_FOUND)
|
if (CURL_FOUND AND CURL_HTTPS_FOUND AND CURL_SSL_FOUND)
|
||||||
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/curl.cpp)
|
set(DUSK_HTTP_BACKEND_SOURCE src/dusk/http/curl.cpp)
|
||||||
list(APPEND GAME_LIBS CURL::libcurl)
|
list(APPEND GAME_LIBS CURL::libcurl)
|
||||||
list(APPEND GAME_COMPILE_DEFS DUSK_HTTP_BACKEND_LIBCURL=1)
|
list(APPEND GAME_COMPILE_DEFS DUSK_HTTP_BACKEND_LIBCURL=1)
|
||||||
message(STATUS "dusklight: Enabled update checker (libcurl)")
|
message(STATUS "dusk: Enabled update checker (libcurl)")
|
||||||
else ()
|
else ()
|
||||||
message(STATUS "dusklight: Disabled update checker (libcurl + HTTPS/SSL not found)")
|
message(STATUS "dusk: Disabled update checker (libcurl + HTTPS/SSL not found)")
|
||||||
endif ()
|
endif ()
|
||||||
else ()
|
else ()
|
||||||
message(STATUS "dusklight: Disabled update checker (unsupported platform)")
|
message(STATUS "dusk: Disabled update checker (unsupported platform)")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
list(APPEND DUSK_FILES ${DUSK_HTTP_BACKEND_SOURCE})
|
list(APPEND DUSK_FILES ${DUSK_HTTP_BACKEND_SOURCE})
|
||||||
@@ -469,41 +432,31 @@ endif ()
|
|||||||
|
|
||||||
set(DUSK_FILES src/dusk/main.cpp ${GAME_BASE_FILES} ${GAME_DEBUG_FILES})
|
set(DUSK_FILES src/dusk/main.cpp ${GAME_BASE_FILES} ${GAME_DEBUG_FILES})
|
||||||
if(ANDROID)
|
if(ANDROID)
|
||||||
add_library(dusklight SHARED ${DUSK_FILES})
|
add_library(dusk SHARED ${DUSK_FILES})
|
||||||
set_target_properties(dusklight PROPERTIES OUTPUT_NAME main)
|
set_target_properties(dusk PROPERTIES OUTPUT_NAME main)
|
||||||
else ()
|
else ()
|
||||||
add_executable(dusklight ${DUSK_FILES})
|
add_executable(dusk ${DUSK_FILES})
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
target_compile_definitions(dusklight PRIVATE ${GAME_COMPILE_DEFS})
|
target_compile_definitions(dusk PRIVATE ${GAME_COMPILE_DEFS})
|
||||||
target_include_directories(dusklight PRIVATE ${GAME_INCLUDE_DIRS})
|
target_include_directories(dusk PRIVATE ${GAME_INCLUDE_DIRS})
|
||||||
target_link_libraries(dusklight PRIVATE aurora::main ${GAME_LIBS} ${JSYSTEM_LINK_LIBRARIES})
|
target_link_libraries(dusk PRIVATE aurora::main ${GAME_LIBS} ${JSYSTEM_LINK_LIBRARIES})
|
||||||
target_precompile_headers(dusklight PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_SOURCE_DIR}/include/dusk_pch.hpp>")
|
target_precompile_headers(dusk PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_SOURCE_DIR}/include/dusk_pch.hpp>")
|
||||||
if (TARGET crashpad_handler)
|
if (TARGET crashpad_handler)
|
||||||
add_dependencies(dusklight crashpad_handler)
|
add_dependencies(dusk crashpad_handler)
|
||||||
add_custom_command(TARGET dusklight POST_BUILD
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
||||||
"$<TARGET_FILE:crashpad_handler>"
|
|
||||||
"$<TARGET_FILE_DIR:dusklight>"
|
|
||||||
COMMENT "Copying crashpad handler"
|
|
||||||
)
|
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (ANDROID)
|
if (ANDROID)
|
||||||
# SDLActivity loads SDL_main via dlsym on Android. Since aurora::main is a static
|
# SDLActivity loads SDL_main via dlsym on Android. Since aurora::main is a static
|
||||||
# archive, force an undefined reference so the linker keeps the SDL_main object.
|
# archive, force an undefined reference so the linker keeps the SDL_main object.
|
||||||
target_link_options(dusklight PRIVATE "-Wl,-u,SDL_main")
|
target_link_options(dusk PRIVATE "-Wl,-u,SDL_main")
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL Linux)
|
|
||||||
target_link_options(dusklight PRIVATE "-Wl,--build-id=sha1")
|
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (NOT APPLE)
|
if (NOT APPLE)
|
||||||
add_custom_command(TARGET dusklight POST_BUILD
|
add_custom_command(TARGET dusk POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||||
"${CMAKE_SOURCE_DIR}/res"
|
"${CMAKE_SOURCE_DIR}/res"
|
||||||
"$<TARGET_FILE_DIR:dusklight>/res"
|
"$<TARGET_FILE_DIR:dusk>/res"
|
||||||
COMMENT "Copying resources"
|
COMMENT "Copying resources"
|
||||||
)
|
)
|
||||||
endif ()
|
endif ()
|
||||||
@@ -511,9 +464,9 @@ endif ()
|
|||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(DUSK_WINDOWS_RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/platforms/windows)
|
set(DUSK_WINDOWS_RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/platforms/windows)
|
||||||
set(DUSK_WINDOWS_ICON_PNG ${CMAKE_CURRENT_SOURCE_DIR}/res/icon.png)
|
set(DUSK_WINDOWS_ICON_PNG ${CMAKE_CURRENT_SOURCE_DIR}/res/icon.png)
|
||||||
set(DUSK_WINDOWS_ICON_ICO ${CMAKE_CURRENT_BINARY_DIR}/dusklight.ico)
|
set(DUSK_WINDOWS_ICON_ICO ${CMAKE_CURRENT_BINARY_DIR}/dusk.ico)
|
||||||
set(DUSK_WINDOWS_RC ${CMAKE_CURRENT_BINARY_DIR}/dusklight.rc)
|
set(DUSK_WINDOWS_RC ${CMAKE_CURRENT_BINARY_DIR}/dusk.rc)
|
||||||
set(DUSK_WINDOWS_MANIFEST ${CMAKE_CURRENT_BINARY_DIR}/dusklight.manifest)
|
set(DUSK_WINDOWS_MANIFEST ${CMAKE_CURRENT_BINARY_DIR}/dusk.manifest)
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${DUSK_WINDOWS_ICON_ICO}
|
OUTPUT ${DUSK_WINDOWS_ICON_ICO}
|
||||||
@@ -526,14 +479,14 @@ if (WIN32)
|
|||||||
COMMENT "Generating Windows icon"
|
COMMENT "Generating Windows icon"
|
||||||
)
|
)
|
||||||
|
|
||||||
configure_file(${DUSK_WINDOWS_RESOURCE_DIR}/dusklight.manifest.in ${DUSK_WINDOWS_MANIFEST} @ONLY)
|
configure_file(${DUSK_WINDOWS_RESOURCE_DIR}/dusk.manifest.in ${DUSK_WINDOWS_MANIFEST} @ONLY)
|
||||||
configure_file(${DUSK_WINDOWS_RESOURCE_DIR}/dusklight.rc.in ${DUSK_WINDOWS_RC} @ONLY)
|
configure_file(${DUSK_WINDOWS_RESOURCE_DIR}/dusk.rc.in ${DUSK_WINDOWS_RC} @ONLY)
|
||||||
|
|
||||||
target_sources(dusklight PRIVATE ${DUSK_WINDOWS_ICON_ICO} ${DUSK_WINDOWS_RC})
|
target_sources(dusk PRIVATE ${DUSK_WINDOWS_ICON_ICO} ${DUSK_WINDOWS_RC})
|
||||||
set_target_properties(dusklight PROPERTIES WIN32_EXECUTABLE TRUE)
|
set_target_properties(dusk PROPERTIES WIN32_EXECUTABLE TRUE)
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
target_link_options(dusklight PRIVATE /MANIFEST:NO)
|
target_link_options(dusk PRIVATE /MANIFEST:NO)
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
@@ -549,10 +502,10 @@ if (APPLE)
|
|||||||
file(GLOB_RECURSE DUSK_RESOURCE_FILES
|
file(GLOB_RECURSE DUSK_RESOURCE_FILES
|
||||||
"${DUSK_RESOURCE_DIR}/Assets.car"
|
"${DUSK_RESOURCE_DIR}/Assets.car"
|
||||||
"${DUSK_RESOURCE_DIR}/Base.lproj/*"
|
"${DUSK_RESOURCE_DIR}/Base.lproj/*"
|
||||||
"${DUSK_RESOURCE_DIR}/Dusklight.icns")
|
"${DUSK_RESOURCE_DIR}/Dusk.icns")
|
||||||
file(GLOB_RECURSE DUSK_APP_RESOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/res/*")
|
file(GLOB_RECURSE DUSK_APP_RESOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/res/*")
|
||||||
target_sources(dusklight PRIVATE ${DUSK_RESOURCE_FILES})
|
target_sources(dusk PRIVATE ${DUSK_RESOURCE_FILES})
|
||||||
target_sources(dusklight PRIVATE ${DUSK_APP_RESOURCE_FILES})
|
target_sources(dusk PRIVATE ${DUSK_APP_RESOURCE_FILES})
|
||||||
foreach (FILE ${DUSK_RESOURCE_FILES})
|
foreach (FILE ${DUSK_RESOURCE_FILES})
|
||||||
file(RELATIVE_PATH NEW_FILE "${DUSK_RESOURCE_DIR}" ${FILE})
|
file(RELATIVE_PATH NEW_FILE "${DUSK_RESOURCE_DIR}" ${FILE})
|
||||||
get_filename_component(NEW_FILE_PATH ${NEW_FILE} DIRECTORY)
|
get_filename_component(NEW_FILE_PATH ${NEW_FILE} DIRECTORY)
|
||||||
@@ -564,36 +517,29 @@ if (APPLE)
|
|||||||
set_property(SOURCE ${FILE} PROPERTY MACOSX_PACKAGE_LOCATION "Resources/${NEW_FILE_PATH}")
|
set_property(SOURCE ${FILE} PROPERTY MACOSX_PACKAGE_LOCATION "Resources/${NEW_FILE_PATH}")
|
||||||
endforeach ()
|
endforeach ()
|
||||||
set_target_properties(
|
set_target_properties(
|
||||||
dusklight PROPERTIES
|
dusk PROPERTIES
|
||||||
MACOSX_BUNDLE TRUE
|
MACOSX_BUNDLE TRUE
|
||||||
MACOSX_BUNDLE_BUNDLE_NAME ${DUSK_BUNDLE_NAME}
|
MACOSX_BUNDLE_BUNDLE_NAME ${DUSK_BUNDLE_NAME}
|
||||||
MACOSX_BUNDLE_GUI_IDENTIFIER ${DUSK_BUNDLE_IDENTIFIER}
|
MACOSX_BUNDLE_GUI_IDENTIFIER ${DUSK_BUNDLE_IDENTIFIER}
|
||||||
MACOSX_BUNDLE_BUNDLE_VERSION ${DUSK_VERSION_STRING}
|
MACOSX_BUNDLE_BUNDLE_VERSION ${DUSK_VERSION_STRING}
|
||||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${DUSK_SHORT_VERSION_STRING}
|
MACOSX_BUNDLE_SHORT_VERSION_STRING ${DUSK_SHORT_VERSION_STRING}
|
||||||
MACOSX_BUNDLE_INFO_PLIST ${DUSK_INFO_PLIST}
|
MACOSX_BUNDLE_INFO_PLIST ${DUSK_INFO_PLIST}
|
||||||
OUTPUT_NAME Dusklight
|
OUTPUT_NAME Dusk
|
||||||
XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "YES"
|
XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "YES"
|
||||||
XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "YES"
|
XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "YES"
|
||||||
)
|
)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (APPLE AND NOT IOS AND NOT TVOS)
|
|
||||||
find_library(APPKIT_FRAMEWORK AppKit REQUIRED)
|
|
||||||
target_sources(dusklight PRIVATE src/dusk/file_select_macos.mm)
|
|
||||||
set_source_files_properties(src/dusk/file_select_macos.mm PROPERTIES COMPILE_FLAGS -fobjc-arc)
|
|
||||||
target_link_libraries(dusklight PRIVATE ${APPKIT_FRAMEWORK})
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (IOS)
|
if (IOS)
|
||||||
find_library(UIKIT_FRAMEWORK UIKit REQUIRED)
|
find_library(UIKIT_FRAMEWORK UIKit REQUIRED)
|
||||||
find_library(UNIFORM_TYPE_IDENTIFIERS_FRAMEWORK UniformTypeIdentifiers REQUIRED)
|
find_library(UNIFORM_TYPE_IDENTIFIERS_FRAMEWORK UniformTypeIdentifiers REQUIRED)
|
||||||
target_sources(dusklight PRIVATE src/dusk/ios/FileSelectDialog.m)
|
target_sources(dusk PRIVATE src/dusk/ios/FileSelectDialog.m)
|
||||||
set_source_files_properties(src/dusk/ios/FileSelectDialog.m PROPERTIES COMPILE_FLAGS -fobjc-arc)
|
set_source_files_properties(src/dusk/ios/FileSelectDialog.m PROPERTIES COMPILE_FLAGS -fobjc-arc)
|
||||||
target_link_libraries(dusklight PRIVATE ${UIKIT_FRAMEWORK} ${UNIFORM_TYPE_IDENTIFIERS_FRAMEWORK})
|
target_link_libraries(dusk PRIVATE ${UIKIT_FRAMEWORK} ${UNIFORM_TYPE_IDENTIFIERS_FRAMEWORK})
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
include(extern/aurora/cmake/AuroraCopyRuntimeDLLs.cmake)
|
include(extern/aurora/cmake/AuroraCopyRuntimeDLLs.cmake)
|
||||||
aurora_copy_runtime_dlls(dusklight)
|
aurora_copy_runtime_dlls(dusk)
|
||||||
|
|
||||||
if (DUSK_SELECTED_OPT)
|
if (DUSK_SELECTED_OPT)
|
||||||
if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
|
if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
|
||||||
@@ -631,13 +577,13 @@ function(get_target_prefix target result_var)
|
|||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
endfunction()
|
endfunction()
|
||||||
list(APPEND BINARY_TARGETS dusklight)
|
list(APPEND BINARY_TARGETS dusk)
|
||||||
set(EXTRA_TARGETS "")
|
set(EXTRA_TARGETS "")
|
||||||
if (TARGET crashpad_handler)
|
if (TARGET crashpad_handler)
|
||||||
list(APPEND EXTRA_TARGETS crashpad_handler)
|
list(APPEND EXTRA_TARGETS crashpad_handler)
|
||||||
endif ()
|
endif ()
|
||||||
install(TARGETS ${BINARY_TARGETS} ${EXTRA_TARGETS} DESTINATION ${CMAKE_INSTALL_PREFIX})
|
install(TARGETS ${BINARY_TARGETS} ${EXTRA_TARGETS} DESTINATION ${CMAKE_INSTALL_PREFIX})
|
||||||
aurora_install_runtime_dlls(dusklight ${CMAKE_INSTALL_PREFIX})
|
aurora_install_runtime_dlls(dusk ${CMAKE_INSTALL_PREFIX})
|
||||||
if (NOT APPLE)
|
if (NOT APPLE)
|
||||||
install(DIRECTORY ${CMAKE_SOURCE_DIR}/res DESTINATION ${CMAKE_INSTALL_PREFIX})
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/res DESTINATION ${CMAKE_INSTALL_PREFIX})
|
||||||
endif ()
|
endif ()
|
||||||
|
|||||||
@@ -30,14 +30,10 @@
|
|||||||
"CMAKE_CXX_COMPILER_LAUNCHER": "sccache",
|
"CMAKE_CXX_COMPILER_LAUNCHER": "sccache",
|
||||||
"DUSK_ENABLE_SENTRY_NATIVE": {
|
"DUSK_ENABLE_SENTRY_NATIVE": {
|
||||||
"type": "BOOL",
|
"type": "BOOL",
|
||||||
"value": true
|
"value": false
|
||||||
},
|
},
|
||||||
"DUSK_SENTRY_DSN": "$env{SENTRY_DSN}",
|
"DUSK_SENTRY_DSN": "$env{SENTRY_DSN}",
|
||||||
"DUSK_SENTRY_ENVIRONMENT": "production",
|
"DUSK_SENTRY_ENVIRONMENT": "production"
|
||||||
"Rust_RUSTUP_INSTALL_MISSING_TARGET": {
|
|
||||||
"type": "BOOL",
|
|
||||||
"value": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -253,11 +249,22 @@
|
|||||||
"type": "BOOL",
|
"type": "BOOL",
|
||||||
"value": false
|
"value": false
|
||||||
},
|
},
|
||||||
"CMAKE_DISABLE_FIND_PACKAGE_PkgConfig": {
|
"CMAKE_DISABLE_FIND_PACKAGE_BZip2": {
|
||||||
"type": "BOOL",
|
"type": "BOOL",
|
||||||
"value": true
|
"value": true
|
||||||
},
|
},
|
||||||
"CMAKE_IGNORE_PREFIX_PATH": "/opt/homebrew"
|
"CMAKE_DISABLE_FIND_PACKAGE_LibLZMA": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": true
|
||||||
|
},
|
||||||
|
"CMAKE_DISABLE_FIND_PACKAGE_zstd": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": true
|
||||||
|
},
|
||||||
|
"CMAKE_DISABLE_FIND_PACKAGE_Freetype": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": true
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"vendor": {
|
"vendor": {
|
||||||
"microsoft.com/VisualStudioSettings/CMake/1.0": {
|
"microsoft.com/VisualStudioSettings/CMake/1.0": {
|
||||||
@@ -322,13 +329,7 @@
|
|||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install",
|
"CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install",
|
||||||
"CMAKE_TOOLCHAIN_FILE": "$env{ANDROID_HOME}/ndk/$env{ANDROID_NDK_VERSION}/build/cmake/android.toolchain.cmake",
|
"CMAKE_TOOLCHAIN_FILE": "$env{ANDROID_HOME}/ndk/$env{ANDROID_NDK_VERSION}/build/cmake/android.toolchain.cmake",
|
||||||
"ANDROID_PLATFORM": "android-28",
|
"ANDROID_PLATFORM": "android-28"
|
||||||
"BUILD_SHARED_LIBS": {
|
|
||||||
"type": "BOOL",
|
|
||||||
"value": false
|
|
||||||
},
|
|
||||||
"AURORA_SDL3_VERSION": "3.4.8",
|
|
||||||
"AURORA_SDL3_REF": "refs/tags/release-3.4.8"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -357,13 +358,7 @@
|
|||||||
"inherits": [
|
"inherits": [
|
||||||
"android-base",
|
"android-base",
|
||||||
"ci"
|
"ci"
|
||||||
],
|
]
|
||||||
"cacheVariables": {
|
|
||||||
"DUSK_ENABLE_SENTRY_NATIVE": {
|
|
||||||
"type": "BOOL",
|
|
||||||
"value": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "x-android-ci-arm64",
|
"name": "x-android-ci-arm64",
|
||||||
@@ -415,7 +410,7 @@
|
|||||||
},
|
},
|
||||||
"CMAKE_OSX_DEPLOYMENT_TARGET": "11.0",
|
"CMAKE_OSX_DEPLOYMENT_TARGET": "11.0",
|
||||||
"CMAKE_IGNORE_PREFIX_PATH": "/opt/homebrew",
|
"CMAKE_IGNORE_PREFIX_PATH": "/opt/homebrew",
|
||||||
"BUILD_SHARED_LIBS": {
|
"DUSK_MOVIE_SUPPORT": {
|
||||||
"type": "BOOL",
|
"type": "BOOL",
|
||||||
"value": false
|
"value": false
|
||||||
}
|
}
|
||||||
@@ -436,6 +431,7 @@
|
|||||||
"x-macos-ci"
|
"x-macos-ci"
|
||||||
],
|
],
|
||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
|
"AURORA_DAWN_PROVIDER": "vendor",
|
||||||
"CMAKE_OSX_ARCHITECTURES": "x86_64",
|
"CMAKE_OSX_ARCHITECTURES": "x86_64",
|
||||||
"Rust_CARGO_TARGET": "x86_64-apple-darwin"
|
"Rust_CARGO_TARGET": "x86_64-apple-darwin"
|
||||||
}
|
}
|
||||||
@@ -447,7 +443,11 @@
|
|||||||
],
|
],
|
||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"CMAKE_C_COMPILER_LAUNCHER": "sccache",
|
"CMAKE_C_COMPILER_LAUNCHER": "sccache",
|
||||||
"CMAKE_CXX_COMPILER_LAUNCHER": "sccache"
|
"CMAKE_CXX_COMPILER_LAUNCHER": "sccache",
|
||||||
|
"DUSK_MOVIE_SUPPORT": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -457,7 +457,11 @@
|
|||||||
],
|
],
|
||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"CMAKE_C_COMPILER_LAUNCHER": "sccache",
|
"CMAKE_C_COMPILER_LAUNCHER": "sccache",
|
||||||
"CMAKE_CXX_COMPILER_LAUNCHER": "sccache"
|
"CMAKE_CXX_COMPILER_LAUNCHER": "sccache",
|
||||||
|
"DUSK_MOVIE_SUPPORT": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -495,10 +499,7 @@
|
|||||||
"inherits": [
|
"inherits": [
|
||||||
"x-windows-ci",
|
"x-windows-ci",
|
||||||
"windows-arm64-msvc"
|
"windows-arm64-msvc"
|
||||||
],
|
]
|
||||||
"cacheVariables": {
|
|
||||||
"VCPKG_TARGET_TRIPLET": "arm64-windows"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildPresets": [
|
"buildPresets": [
|
||||||
@@ -544,7 +545,7 @@
|
|||||||
"description": "iOS release build with debug info",
|
"description": "iOS release build with debug info",
|
||||||
"displayName": "iOS RelWithDebInfo",
|
"displayName": "iOS RelWithDebInfo",
|
||||||
"targets": [
|
"targets": [
|
||||||
"dusklight"
|
"dusk"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -553,7 +554,7 @@
|
|||||||
"description": "tvOS release build with debug info",
|
"description": "tvOS release build with debug info",
|
||||||
"displayName": "tvOS RelWithDebInfo",
|
"displayName": "tvOS RelWithDebInfo",
|
||||||
"targets": [
|
"targets": [
|
||||||
"dusklight"
|
"dusk"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -562,7 +563,7 @@
|
|||||||
"description": "Android arm64-v8a release build with debug info",
|
"description": "Android arm64-v8a release build with debug info",
|
||||||
"displayName": "Android arm64-v8a RelWithDebInfo",
|
"displayName": "Android arm64-v8a RelWithDebInfo",
|
||||||
"targets": [
|
"targets": [
|
||||||
"dusklight"
|
"dusk"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -571,7 +572,7 @@
|
|||||||
"description": "Android x86_64 release build with debug info",
|
"description": "Android x86_64 release build with debug info",
|
||||||
"displayName": "Android x86_64 RelWithDebInfo",
|
"displayName": "Android x86_64 RelWithDebInfo",
|
||||||
"targets": [
|
"targets": [
|
||||||
"dusklight"
|
"dusk"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -580,7 +581,7 @@
|
|||||||
"description": "(Internal) Android CI arm64-v8a",
|
"description": "(Internal) Android CI arm64-v8a",
|
||||||
"displayName": "(Internal) Android CI arm64-v8a",
|
"displayName": "(Internal) Android CI arm64-v8a",
|
||||||
"targets": [
|
"targets": [
|
||||||
"dusklight"
|
"dusk"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,30 +1,27 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="res/logo.png" alt="Logo" width="640">
|
<img src="res/logo-mascot.png" alt="Logo" width="640">
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://twilitrealm.dev">Official Website</a>
|
<a href="https://twilitrealm.dev">Official Website</a>
|
||||||
•
|
•
|
||||||
<a href="https://discord.gg/6NpMhefCK9">Discord</a>
|
<a href="https://discord.gg/dusktp">Discord</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
# Overview
|
# Overview
|
||||||
|
|
||||||
Dusklight is a reverse-engineered reimplementation of Twilight Princess.
|
Dusk is a reverse-engineered reimplementation of Twilight Princess.
|
||||||
|
|
||||||
It aims to be as accurate as possible to the original while also providing new options, enhancements, and tools to customize your experience.
|
It aims to be as accurate as possible to the original while also providing new options, enhancements, and tools to customize your experience.
|
||||||
|
|
||||||
# Setup
|
# Setup
|
||||||
|
|
||||||
> [!IMPORTANT]
|
> [!IMPORTANT]
|
||||||
> Dusklight does *not* provide any copyrighted assets. You must provide your own copy of the original game.
|
> Dusk does *not* provide any copyrighted assets. You must provide your own copy of the original game.
|
||||||
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> At a minimum, Dusklight requires a GPU with support for either D3D12, Vulkan, or Metal. Your experience with specific hardware, operating systems, and drivers may vary. In particular, older Intel iGPUs have a high likelihood of incompatibility. We are also aware of a number of issues on devices with Adreno GPUs and are working to resolve them.
|
|
||||||
|
|
||||||
### 1. Verify your dump
|
### 1. Verify your dump
|
||||||
|
|
||||||
First, make sure your dump of the game is clean and supported by Dusklight. You can do this by checking the SHA-1 hash of your dump against this list of supported versions:
|
First, make sure your dump of the game is clean and supported by Dusk. You can do this by checking the SHA-1 hash of your dump against this list of supported versions:
|
||||||
|
|
||||||
| Version | SHA-1 hash |
|
| Version | SHA-1 hash |
|
||||||
|--------------| ------------------------------------------ |
|
|--------------| ------------------------------------------ |
|
||||||
@@ -33,12 +30,12 @@ First, make sure your dump of the game is clean and supported by Dusklight. You
|
|||||||
|
|
||||||
*Support for other versions of the game is planned in the future.
|
*Support for other versions of the game is planned in the future.
|
||||||
|
|
||||||
### 2. Download [Dusklight](https://github.com/TwilitRealm/dusklight/releases)
|
### 2. Download [Dusk](https://github.com/TwilitRealm/dusk/releases)
|
||||||
|
|
||||||
### 3. Setup the game
|
### 3. Setup the game
|
||||||
**Windows / macOS / Linux**
|
**Windows / macOS / Linux**
|
||||||
- Extract the .zip file
|
- Extract the .zip file
|
||||||
- Launch Dusklight
|
- Launch Dusk
|
||||||
- Press **Select Disc Image** and provide the path to your supported game dump
|
- Press **Select Disc Image** and provide the path to your supported game dump
|
||||||
- Press **Play**!
|
- Press **Play**!
|
||||||
|
|
||||||
@@ -46,20 +43,20 @@ First, make sure your dump of the game is clean and supported by Dusklight. You
|
|||||||
- Follow the [iOS setup guide](docs/ios-install-altstore.md)
|
- Follow the [iOS setup guide](docs/ios-install-altstore.md)
|
||||||
|
|
||||||
**Android**
|
**Android**
|
||||||
- Install the Dusklight APK
|
- Install the Dusk apk
|
||||||
- Launch Dusklight
|
- Launch Dusk
|
||||||
- Press **Select Disc Image** and provide the path to your supported game dump
|
- Press **Select Disc Image** and provide the path to your supported game dump
|
||||||
- Press **Play**!
|
- Press **Play**!
|
||||||
|
|
||||||
# Building
|
# Building
|
||||||
|
|
||||||
If you'd like to build Dusklight from source, please read the [build instructions](docs/building.md).
|
If you'd like to build Dusk from source, please read the [build instructions](docs/building.md).
|
||||||
|
|
||||||
Pull requests are welcomed! Note that we do not accept contributions that are primarily AI-generated and will close your PR if we suspect as much. Please also see the [code conventions](docs/code-conventions.md).
|
Pull requests are welcomed! Note that we do not accept contributions that are primarily AI-generated and will close your PR if we suspect as much.
|
||||||
|
|
||||||
# Credits
|
# Credits
|
||||||
|
|
||||||
Special thanks to the [TP decompilation](https://github.com/zeldaret/tp) team, the GC/Wii decompilation community, the [Aurora](https://github.com/encounter/aurora) developers, the [TP speedrunning community](https://zsrtp.link), and all [contributors](https://github.com/TwilitRealm/dusklight/graphs/contributors).
|
Special thanks to the [TP decompilation](https://github.com/zeldaret/tp) team, the GC/Wii decompilation community, the [Aurora](https://github.com/encounter/aurora) developers, the [TP speedrunning community](https://zsrtp.link), and all [contributors](https://github.com/TwilitRealm/dusk/graphs/contributors).
|
||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|||||||
@@ -1,27 +1,18 @@
|
|||||||
#!/bin/bash -ex
|
#!/bin/bash -ex
|
||||||
|
shopt -s extglob
|
||||||
if [[ -n "${GITHUB_WORKSPACE:-}" ]]; then
|
|
||||||
cd "$GITHUB_WORKSPACE"
|
|
||||||
fi
|
|
||||||
|
|
||||||
build_dir="$PWD/build"
|
|
||||||
linuxdeploy="$build_dir/linuxdeploy-$(uname -m).AppImage"
|
|
||||||
lib_dir="/usr/lib/$(uname -m)-linux-gnu"
|
|
||||||
|
|
||||||
# Get linuxdeploy
|
# Get linuxdeploy
|
||||||
mkdir -p "$build_dir"
|
cd "$RUNNER_WORKSPACE"
|
||||||
curl -fL "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-$(uname -m).AppImage" -o "$linuxdeploy"
|
curl -fOL https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-$(uname -m).AppImage
|
||||||
chmod +x "$linuxdeploy"
|
chmod +x linuxdeploy-$(uname -m).AppImage
|
||||||
|
|
||||||
# Build AppImage
|
# Build AppImage
|
||||||
|
cd "$GITHUB_WORKSPACE"
|
||||||
mkdir -p build/appdir/usr/{bin,share/{applications,icons/hicolor}}
|
mkdir -p build/appdir/usr/{bin,share/{applications,icons/hicolor}}
|
||||||
for install_path in build/install/*; do
|
cp -r build/install/!(*.*) build/appdir/usr/bin
|
||||||
[[ "$(basename "$install_path")" == *.* ]] && continue
|
|
||||||
cp -r "$install_path" build/appdir/usr/bin
|
|
||||||
done
|
|
||||||
cp -r platforms/freedesktop/{16x16,32x32,48x48,64x64,128x128,256x256,512x512,1024x1024} build/appdir/usr/share/icons/hicolor
|
cp -r platforms/freedesktop/{16x16,32x32,48x48,64x64,128x128,256x256,512x512,1024x1024} build/appdir/usr/share/icons/hicolor
|
||||||
cp platforms/freedesktop/dev.twilitrealm.dusk.desktop build/appdir/usr/share/applications
|
cp platforms/freedesktop/dusk.desktop build/appdir/usr/share/applications
|
||||||
|
|
||||||
cd build/install
|
cd build/install
|
||||||
VERSION="$DUSK_VERSION" NO_STRIP=1 "$linuxdeploy" \
|
VERSION="$DUSK_VERSION" NO_STRIP=1 "$RUNNER_WORKSPACE"/linuxdeploy-$(uname -m).AppImage \
|
||||||
-l "$lib_dir/libusb-1.0.so" --appdir "$build_dir/appdir" --output appimage
|
-l /usr/lib/x86_64-linux-gnu/libusb-1.0.so --appdir "$GITHUB_WORKSPACE"/build/appdir --output appimage
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
|
||||||
if (CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "ARM64" OR CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "ARM64EC")
|
|
||||||
set(CMAKE_SYSTEM_PROCESSOR "ARM64")
|
|
||||||
elseif (CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "x64")
|
|
||||||
set(CMAKE_SYSTEM_PROCESSOR "AMD64")
|
|
||||||
elseif (CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "X86")
|
|
||||||
set(CMAKE_SYSTEM_PROCESSOR "X86")
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
@@ -1,165 +1,51 @@
|
|||||||
# Building Dusklight
|
### Building
|
||||||
|
#### Prerequisites
|
||||||
## Dependencies
|
|
||||||
|
|
||||||
The following dependencies are required:
|
|
||||||
|
|
||||||
* [CMake 3.25+](https://cmake.org)
|
* [CMake 3.25+](https://cmake.org)
|
||||||
|
* Windows: Install `CMake Tools` in Visual Studio
|
||||||
|
* macOS: `brew install cmake`
|
||||||
* [Python 3+](https://python.org)
|
* [Python 3+](https://python.org)
|
||||||
|
* Windows: [Microsoft Store](https://go.microsoft.com/fwlink?linkID=2082640)
|
||||||
### Windows
|
* Verify it's added to `%PATH%` by typing `python` in `cmd`.
|
||||||
|
* macOS: `brew install python@3`
|
||||||
* Install [CMake 3.25+](https://cmake.org) by searching `CMake Tools` in Visual Studio
|
* **[Windows]** [Visual Studio 2026 Community](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx)
|
||||||
* Install Python 3 from the [Microsoft Store](https://go.microsoft.com/fwlink?linkID=2082640) and verify it's added to `%PATH%` by typing `python` in `cmd`.
|
* Select `C++ Development` and verify the following packages are included:
|
||||||
|
* `Windows 11 SDK`
|
||||||
Recommended IDEs:
|
* `CMake Tools`
|
||||||
|
* `C++ Clang Compiler`
|
||||||
* [Visual Studio 2026 Community](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx). During installation:
|
* `C++ Clang-cl`
|
||||||
* Select `C++ Development` and verify the following packages are included:
|
* **[macOS]** [Xcode 16.4+](https://developer.apple.com/xcode/download/)
|
||||||
* `Windows 11 SDK`
|
* **[Linux]** Actively tested on Ubuntu 24.04, Arch Linux & derivatives.
|
||||||
* `CMake Tools`
|
* Ubuntu 24.04+ packages
|
||||||
* `C++ Clang Compiler`
|
```
|
||||||
* `C++ Clang-cl`
|
build-essential curl git ninja-build clang lld zlib1g-dev libcurl4-openssl-dev \
|
||||||
|
libglu1-mesa-dev libdbus-1-dev libvulkan-dev libxi-dev libxrandr-dev libasound2-dev libpulse-dev \
|
||||||
### macOS
|
libudev-dev libpng-dev libncurses5-dev cmake libx11-xcb-dev python3 python-is-python3 \
|
||||||
|
libclang-dev libfreetype-dev libxinerama-dev libxcursor-dev python3-markupsafe libgtk-3-dev \
|
||||||
* Make sure [Homebrew](https://brew.sh) is installed
|
libxss-dev libxtst-dev
|
||||||
* Install [CMake 3.25+](https://cmake.org)
|
```
|
||||||
|
* Arch Linux packages
|
||||||
|
```
|
||||||
|
base-devel cmake ninja llvm vulkan-headers python python-markupsafe clang lld alsa-lib libpulse libxrandr freetype2
|
||||||
|
```
|
||||||
|
* Fedora packages
|
||||||
|
```
|
||||||
|
cmake vulkan-headers ninja-build clang-devel llvm-devel libpng-devel
|
||||||
|
```
|
||||||
|
* It's also important that you install the developer tools and libraries
|
||||||
|
```
|
||||||
|
sudo dnf groupinstall "Development Tools" "Development Libraries"
|
||||||
|
```
|
||||||
|
#### Setup
|
||||||
|
Clone and initialize the Dusk repository
|
||||||
```sh
|
```sh
|
||||||
brew install cmake
|
git clone --recursive https://github.com/TwilitRealm/dusk.git
|
||||||
```
|
cd dusk
|
||||||
|
|
||||||
* Install Python 3
|
|
||||||
|
|
||||||
```sh
|
|
||||||
brew install python@3
|
|
||||||
```
|
|
||||||
|
|
||||||
Recommended IDEs:
|
|
||||||
|
|
||||||
* [Xcode 16.4 or later](https://developer.apple.com/xcode/)
|
|
||||||
* [Visual Studio Code](https://code.visualstudio.com/download/)
|
|
||||||
* [CLion](https://www.jetbrains.com/clion/)
|
|
||||||
|
|
||||||
### Linux
|
|
||||||
|
|
||||||
Actively tested on Ubuntu 24.04, Arch Linux & derivatives.
|
|
||||||
|
|
||||||
**Ubuntu 24.04+ packages**
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Click to expand</summary>
|
|
||||||
|
|
||||||
* Run the following command to install the required dependencies:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
sudo apt update && sudo apt install -y \
|
|
||||||
build-essential \
|
|
||||||
clang \
|
|
||||||
cmake \
|
|
||||||
curl \
|
|
||||||
git \
|
|
||||||
libasound2-dev \
|
|
||||||
libclang-dev \
|
|
||||||
libcurl4-openssl-dev \
|
|
||||||
libdbus-1-dev \
|
|
||||||
libfreetype-dev \
|
|
||||||
libglu1-mesa-dev \
|
|
||||||
libgtk-3-dev \
|
|
||||||
libncurses5-dev \
|
|
||||||
libpng-dev \
|
|
||||||
libpulse-dev \
|
|
||||||
libudev-dev \
|
|
||||||
libvulkan-dev \
|
|
||||||
libx11-xcb-dev \
|
|
||||||
libxcursor-dev \
|
|
||||||
libxi-dev \
|
|
||||||
libxinerama-dev \
|
|
||||||
libxrandr-dev \
|
|
||||||
libxss-dev \
|
|
||||||
libxtst-dev \
|
|
||||||
lld \
|
|
||||||
ninja-build \
|
|
||||||
python-is-python3 \
|
|
||||||
python3 \
|
|
||||||
python3-markupsafe \
|
|
||||||
zlib1g-dev
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
**Arch Linux packages**
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Click to expand</summary>
|
|
||||||
|
|
||||||
* Run the following command to install the required dependencies:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
sudo pacman -S --needed \
|
|
||||||
alsa-lib \
|
|
||||||
base-devel \
|
|
||||||
clang \
|
|
||||||
cmake \
|
|
||||||
freetype2 \
|
|
||||||
libpulse \
|
|
||||||
libxrandr \
|
|
||||||
lld \
|
|
||||||
llvm \
|
|
||||||
ninja \
|
|
||||||
python \
|
|
||||||
python-markupsafe \
|
|
||||||
vulkan-headers
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
**Fedora packages**
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Click to expand</summary>
|
|
||||||
|
|
||||||
* Run the following command to install the required dependencies:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
sudo dnf install -y \
|
|
||||||
clang-devel \
|
|
||||||
cmake \
|
|
||||||
libpng-devel \
|
|
||||||
llvm-devel \
|
|
||||||
ninja-build \
|
|
||||||
vulkan-headers
|
|
||||||
```
|
|
||||||
|
|
||||||
* It's also important that you install the developer tools and libraries
|
|
||||||
|
|
||||||
```sh
|
|
||||||
sudo dnf groupinstall \
|
|
||||||
"Development Libraries" "Development Tools"
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
Recommended IDEs:
|
|
||||||
|
|
||||||
* [CLion](https://www.jetbrains.com/clion/)
|
|
||||||
* [Visual Studio Code](https://code.visualstudio.com/download/)
|
|
||||||
|
|
||||||
## Building
|
|
||||||
|
|
||||||
* Clone and initialize the Dusklight repository:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
git clone --recursive https://github.com/TwilitRealm/dusklight.git
|
|
||||||
git pull
|
git pull
|
||||||
cd dusklight
|
|
||||||
git submodule update --init --recursive
|
git submodule update --init --recursive
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Building
|
||||||
|
|
||||||
**CLion (Windows / macOS / Linux)**
|
**CLion (Windows / macOS / Linux)**
|
||||||
|
|
||||||
Open the project directory in CLion. Enable the appropriate presets for your platform:
|
Open the project directory in CLion. Enable the appropriate presets for your platform:
|
||||||
@@ -178,8 +64,7 @@ cmake --build --preset macos-default-relwithdebinfo
|
|||||||
```
|
```
|
||||||
|
|
||||||
Alternate presets available:
|
Alternate presets available:
|
||||||
|
- `macos-default-debug`: Clang, Debug
|
||||||
* `macos-default-debug`: Clang, Debug
|
|
||||||
|
|
||||||
**ninja (Linux)**
|
**ninja (Linux)**
|
||||||
|
|
||||||
@@ -189,10 +74,9 @@ cmake --build --preset linux-default-relwithdebinfo
|
|||||||
```
|
```
|
||||||
|
|
||||||
Alternate presets available:
|
Alternate presets available:
|
||||||
|
- `linux-default-debug`: GCC, Debug
|
||||||
* `linux-default-debug`: GCC, Debug
|
- `linux-clang-relwithdebinfo`: Clang, RelWithDebInfo
|
||||||
* `linux-clang-relwithdebinfo`: Clang, RelWithDebInfo
|
- `linux-clang-debug`: Clang, Debug
|
||||||
* `linux-clang-debug`: Clang, Debug
|
|
||||||
|
|
||||||
**ninja (Windows)**
|
**ninja (Windows)**
|
||||||
|
|
||||||
@@ -202,27 +86,13 @@ cmake --build --preset windows-msvc-relwithdebinfo
|
|||||||
```
|
```
|
||||||
|
|
||||||
Alternate presets available:
|
Alternate presets available:
|
||||||
|
- `windows-msvc-debug`: MSVC, Debug
|
||||||
|
- `windows-clang-relwithdebinfo`: Clang-cl, RelWithDebInfo
|
||||||
|
- `windows-clang-debug`: Clang-cl, Debug
|
||||||
|
|
||||||
* `windows-msvc-debug`: MSVC, Debug
|
#### Running
|
||||||
* `windows-clang-relwithdebinfo`: Clang-cl, RelWithDebInfo
|
Pass the disc image as a positional argument. Supported formats: ISO (GCM), RVZ, WIA, WBFS, CISO, GCZ
|
||||||
* `windows-clang-debug`: Clang-cl, Debug
|
|
||||||
|
|
||||||
## Running
|
|
||||||
|
|
||||||
**Windows / Linux**
|
|
||||||
|
|
||||||
* Pass the disc image as a positional argument using the `--dvd` flag. Supported formats are: ISO (GCM), RVZ, WIA, WBFS, CISO, GCZ
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
build/{preset}/dusklight --dvd /path/to/game.iso
|
build/{preset}/dusk /path/to/game.rvz
|
||||||
```
|
|
||||||
|
|
||||||
**macOS**
|
|
||||||
|
|
||||||
macOS builds an `.app` bundle which contains the executable and all necessary resources.
|
|
||||||
|
|
||||||
* Pass the disc image as a positional argument using the `--dvd` flag. Supported formats are: ISO (GCM), RVZ, WIA, WBFS, CISO, GCZ
|
|
||||||
|
|
||||||
```sh
|
|
||||||
build/{preset}/Dusklight.app/Contents/MacOS/Dusklight --dvd /path/to/game.iso
|
|
||||||
```
|
```
|
||||||
|
If no path is specified, Dusk defaults to `game.iso` in the current working directory.
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
# Code conventions for Dusk
|
|
||||||
|
|
||||||
## Upstream when appropriate
|
|
||||||
|
|
||||||
Bug fixes, documentation improvements, code cleanup, etc that also apply to the [original decompilation project](https://github.com/zeldaret/tp) should preferably be PR'd there.
|
|
||||||
|
|
||||||
## Properly indicate Dusk-modified code
|
|
||||||
|
|
||||||
When modifying original game code (i.e. in decomp) for Dusk's purposes, please clearly delineate such code as being Dusk-specific. Generally, this can be done by using `#if TARGET_PC` and keeping the original code in place. Use `#if AVOID_UB` for Undefined Behavior fixes to the original codebase.
|
|
||||||
|
|
||||||
## Miscellaneous things
|
|
||||||
|
|
||||||
* The original codebase makes heavy use of global `operator new` and similar overloads to allocate into a strict tree of heaps. This would cause many linkage headaches for us, so effectively all uses of `new` or `delete` in the original game code have been replaced with `JKR_NEW`, `JKR_DELETE`, or similar macros. See `JKRHeap.h` for the full list.
|
|
||||||
@@ -1,48 +1,46 @@
|
|||||||
# Installing Dusklight on iOS via iloader
|
# Installing Dusk on iOS via AltStore
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- A Windows, Linux, or macOS device
|
- Mac with Homebrew installed
|
||||||
- iOS device connected to computer via USB
|
- iPhone connected via USB
|
||||||
- Dusklight IPA file (download the latest `Dusklight-vX.X.X-ios-arm64.ipa` from the [releases page](https://github.com/TwilitRealm/dusklight/releases))
|
- Dusk IPA file (download the latest `Dusk-vX.X.X-ios-arm64.ipa` from the [releases page](https://github.com/TwilitRealm/dusk/releases))
|
||||||
- Legally acquired game disc - `GZ2E01` (Gamecube USA) or `GZ2PE01` (Gamecube PAL)
|
- Game disc - `GZ2E01` (Gamecube USA) or `GZ2PE01` (Gamecube PAL)
|
||||||
|
|
||||||
## 1. Install iloader
|
## 1. Install AltServer
|
||||||
|
|
||||||
- Executable bundles can be installed from [iloader's main page](https://iloader.app/) or [their GitHub](https://github.com/nab138/iloader) for Windows, Linux, and macOS.
|
```sh
|
||||||
- Windows WILL require iTunes to be installed
|
brew install altserver
|
||||||
- Linux WILL require usbmuxd to be installed, this is installed by default in most distros though
|
open -a AltServer
|
||||||
|
```
|
||||||
|
|
||||||
|
AltServer will appear in your menu bar.
|
||||||
|
|
||||||
## 2. Enable Developer Mode (iOS 16+)
|
## 2. Enable Developer Mode (iOS 16+)
|
||||||
|
|
||||||
- On your iPhone, go to **Settings > Privacy & Security > Developer Mode**
|
- On your iPhone, go to **Settings > Privacy & Security > Developer Mode**
|
||||||
- Toggle it on, put in your device passcode, and restart when prompted
|
- Toggle it on and restart when prompted
|
||||||
|
|
||||||
## 3. Install Dusklight on Your iPhone
|
## 3. Install AltStore on Your iPhone
|
||||||
|
|
||||||
1. Sign into your Apple ID (this is required for registering app IDs, it is sent securely directly to Apple and not stored by iloader)
|
- Click AltServer in the menu bar
|
||||||
* You may be prompted to put in a code from your iOS device if you have 2FA enabled, do so
|
- Click **Install AltStore > [Your iPhone]**
|
||||||
2. Plug in your iOS device via USB into your PC. If you're missing a dependency, an error pop-up will tell you to install it
|
- Enter your Apple ID credentials when prompted
|
||||||
* You will need to hit `Refresh` after plugging it in at this stage so that it can be detected, it does not automatically refresh
|
- On your iPhone, go to **Settings > General > VPN & Device Management**
|
||||||
3. Leave settings unchanged (the Anisette server should stay Sidestore (.io))
|
- Tap your Apple ID under "Developer App" and tap **Trust**
|
||||||
3.(a) Installing SideStore directly is not required, but provides you a way to install Dusklight on your phone without being plugged into a computer later
|
|
||||||
4. Press `Import IPA` and choose your downloaded `Dusklight-v.X.X.X-ios-arm64.ipa`, it will begin installing on your device
|
|
||||||
|
|
||||||
**NOTE:** *At various stages, you may be prompted to trust your device, do so*
|
|
||||||
|
|
||||||
## 3. Getting Dusklight trusted
|
|
||||||
When installing sideloaded iOS applications, at first you will need to manually trust the app due to Apple's security policies
|
|
||||||
* Go to **Settings > General > VPN & Device Management**
|
|
||||||
* Tap the Apple ID you signed into iloader with under "Developer App" and tap **Trust**
|
|
||||||
* Tap **Allow** on the pop-up
|
|
||||||
|
|
||||||
## 4. Copy Files to Your iPhone
|
## 4. Copy Files to Your iPhone
|
||||||
|
|
||||||
Transfer the game disc (and optionally, the Dusklight IPA) to your iPhone so they are accessible in the Files app. A few ways to do this:
|
Transfer the IPA and game disc to your iPhone so they're accessible in the Files app. A few ways to do this:
|
||||||
|
|
||||||
- **AirDrop** - Right-click the files on your Mac and choose Share > AirDrop
|
- **AirDrop** - Right-click the files on your Mac and choose Share > AirDrop
|
||||||
- **iCloud Drive** - Place files in iCloud Drive on your Mac and they'll sync to Files on your iPhone
|
- **iCloud Drive** - Place files in iCloud Drive on your Mac and they'll sync to Files on your iPhone
|
||||||
- **USB transfer** - Connect your iPhone and drag files via Finder's sidebar
|
- **USB transfer** - Connect your iPhone and drag files via Finder's sidebar
|
||||||
- **Cloud storage** - Upload to Google Drive, Dropbox, etc. and download on your iPhone
|
- **Cloud storage** - Upload to Google Drive, Dropbox, etc. and download on your iPhone
|
||||||
|
|
||||||
You may now use Dusklight on iOS and iPadOS!
|
## 5. Install via AltStore
|
||||||
|
|
||||||
|
- Open **AltStore** on your iPhone
|
||||||
|
- Go to the **My Apps** tab
|
||||||
|
- Tap the **+** button (top left)
|
||||||
|
- Open the **Files** app and select the `.ipa` file
|
||||||
@@ -1411,7 +1411,6 @@ set(DOLPHIN_FILES
|
|||||||
)
|
)
|
||||||
|
|
||||||
set(DUSK_FILES
|
set(DUSK_FILES
|
||||||
include/dusk/action_bindings.h
|
|
||||||
include/dusk/endian_gx.hpp
|
include/dusk/endian_gx.hpp
|
||||||
include/dusk/config.hpp
|
include/dusk/config.hpp
|
||||||
include/dusk/dvd_asset.hpp
|
include/dusk/dvd_asset.hpp
|
||||||
@@ -1420,10 +1419,7 @@ set(DUSK_FILES
|
|||||||
src/d/actor/d_a_alink_dusk.cpp
|
src/d/actor/d_a_alink_dusk.cpp
|
||||||
src/dusk/asserts.cpp
|
src/dusk/asserts.cpp
|
||||||
src/dusk/config.cpp
|
src/dusk/config.cpp
|
||||||
src/dusk/crash_handler.cpp
|
|
||||||
src/dusk/crash_reporting.cpp
|
src/dusk/crash_reporting.cpp
|
||||||
src/dusk/data.cpp
|
|
||||||
src/dusk/data.hpp
|
|
||||||
src/dusk/endian.cpp
|
src/dusk/endian.cpp
|
||||||
src/dusk/extras.c
|
src/dusk/extras.c
|
||||||
src/dusk/file_select.cpp
|
src/dusk/file_select.cpp
|
||||||
@@ -1439,8 +1435,6 @@ set(DUSK_FILES
|
|||||||
src/dusk/layout.cpp
|
src/dusk/layout.cpp
|
||||||
src/dusk/logging.cpp
|
src/dusk/logging.cpp
|
||||||
src/dusk/settings.cpp
|
src/dusk/settings.cpp
|
||||||
src/dusk/speedrun.cpp
|
|
||||||
src/dusk/string.cpp
|
|
||||||
src/dusk/stubs.cpp
|
src/dusk/stubs.cpp
|
||||||
src/dusk/update_check.cpp
|
src/dusk/update_check.cpp
|
||||||
src/dusk/update_check.hpp
|
src/dusk/update_check.hpp
|
||||||
@@ -1450,16 +1444,18 @@ set(DUSK_FILES
|
|||||||
src/dusk/imgui/ImGuiConsole.cpp
|
src/dusk/imgui/ImGuiConsole.cpp
|
||||||
src/dusk/imgui/ImGuiEngine.cpp
|
src/dusk/imgui/ImGuiEngine.cpp
|
||||||
src/dusk/imgui/ImGuiEngine.hpp
|
src/dusk/imgui/ImGuiEngine.hpp
|
||||||
|
src/dusk/imgui/ImGuiMenuGame.cpp
|
||||||
|
src/dusk/imgui/ImGuiMenuGame.hpp
|
||||||
src/dusk/imgui/ImGuiBloomWindow.cpp
|
src/dusk/imgui/ImGuiBloomWindow.cpp
|
||||||
src/dusk/imgui/ImGuiBloomWindow.hpp
|
src/dusk/imgui/ImGuiBloomWindow.hpp
|
||||||
src/dusk/imgui/ImGuiMenuTools.cpp
|
src/dusk/imgui/ImGuiMenuTools.cpp
|
||||||
src/dusk/imgui/ImGuiMenuTools.hpp
|
src/dusk/imgui/ImGuiMenuTools.hpp
|
||||||
src/dusk/imgui/ImGuiActorSpawner.cpp
|
|
||||||
src/dusk/imgui/ImGuiProcessOverlay.cpp
|
src/dusk/imgui/ImGuiProcessOverlay.cpp
|
||||||
src/dusk/imgui/ImGuiCameraOverlay.cpp
|
src/dusk/imgui/ImGuiCameraOverlay.cpp
|
||||||
src/dusk/imgui/ImGuiHeapOverlay.cpp
|
src/dusk/imgui/ImGuiHeapOverlay.cpp
|
||||||
src/dusk/imgui/ImGuiControllerOverlay.cpp
|
src/dusk/imgui/ImGuiControllerOverlay.cpp
|
||||||
src/dusk/imgui/ImGuiStubLog.cpp
|
src/dusk/imgui/ImGuiStubLog.cpp
|
||||||
|
src/dusk/imgui/ImGuiMapLoader.cpp
|
||||||
src/dusk/imgui/ImGuiSaveEditor.cpp
|
src/dusk/imgui/ImGuiSaveEditor.cpp
|
||||||
src/dusk/imgui/ImGuiStateShare.hpp
|
src/dusk/imgui/ImGuiStateShare.hpp
|
||||||
src/dusk/imgui/ImGuiStateShare.cpp
|
src/dusk/imgui/ImGuiStateShare.cpp
|
||||||
@@ -1498,8 +1494,6 @@ set(DUSK_FILES
|
|||||||
src/dusk/ui/prelaunch.hpp
|
src/dusk/ui/prelaunch.hpp
|
||||||
src/dusk/ui/preset.cpp
|
src/dusk/ui/preset.cpp
|
||||||
src/dusk/ui/preset.hpp
|
src/dusk/ui/preset.hpp
|
||||||
src/dusk/ui/reporting.cpp
|
|
||||||
src/dusk/ui/reporting.hpp
|
|
||||||
src/dusk/ui/select_button.cpp
|
src/dusk/ui/select_button.cpp
|
||||||
src/dusk/ui/select_button.hpp
|
src/dusk/ui/select_button.hpp
|
||||||
src/dusk/ui/settings.cpp
|
src/dusk/ui/settings.cpp
|
||||||
@@ -1510,8 +1504,6 @@ set(DUSK_FILES
|
|||||||
src/dusk/ui/tab_bar.hpp
|
src/dusk/ui/tab_bar.hpp
|
||||||
src/dusk/ui/ui.cpp
|
src/dusk/ui/ui.cpp
|
||||||
src/dusk/ui/ui.hpp
|
src/dusk/ui/ui.hpp
|
||||||
src/dusk/ui/warp.cpp
|
|
||||||
src/dusk/ui/warp.hpp
|
|
||||||
src/dusk/ui/window.cpp
|
src/dusk/ui/window.cpp
|
||||||
src/dusk/ui/window.hpp
|
src/dusk/ui/window.hpp
|
||||||
src/dusk/achievements.cpp
|
src/dusk/achievements.cpp
|
||||||
@@ -1526,7 +1518,6 @@ set(DUSK_FILES
|
|||||||
src/dusk/discord.hpp
|
src/dusk/discord.hpp
|
||||||
src/dusk/discord_presence.cpp
|
src/dusk/discord_presence.cpp
|
||||||
src/dusk/version.cpp
|
src/dusk/version.cpp
|
||||||
src/dusk/action_bindings.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(DUSK_HTTP_BACKEND_FILES
|
set(DUSK_HTTP_BACKEND_FILES
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
"nodes": {
|
"nodes": {
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1778869304,
|
"lastModified": 1775710090,
|
||||||
"narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=",
|
"narHash": "sha256-ar3rofg+awPB8QXDaFJhJ2jJhu+KqN/PRCXeyuXR76E=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "d233902339c02a9c334e7e593de68855ad26c4cb",
|
"rev": "4c1018dae018162ec878d42fec712642d214fdfa",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
@@ -1,374 +1,33 @@
|
|||||||
{
|
{
|
||||||
description = "Dusklight — native PC port of the Twilight Princess decompilation";
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
||||||
inputs.nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
};
|
||||||
|
outputs = { self, nixpkgs }:
|
||||||
outputs =
|
|
||||||
{ self, nixpkgs }:
|
|
||||||
let
|
let
|
||||||
inherit (nixpkgs) lib;
|
pkgs = import nixpkgs { system = "x86_64-linux"; };
|
||||||
|
dusk = pkgs.stdenv.mkDerivation {
|
||||||
supportedSystems = [
|
name = "dusk";
|
||||||
"x86_64-linux"
|
src = ./.;
|
||||||
"aarch64-linux"
|
nativeBuildInputs = [
|
||||||
"x86_64-darwin"
|
pkgs.cmake
|
||||||
"aarch64-darwin"
|
pkgs.pkg-config
|
||||||
];
|
pkgs.wayland
|
||||||
forAllSystems = lib.genAttrs supportedSystems;
|
];
|
||||||
|
buildInputs = [
|
||||||
dawnVersion = "v20260423.175430";
|
pkgs.libGL
|
||||||
nodVersion = "v2.0.0-alpha.8";
|
pkgs.libX11
|
||||||
versionSuffix = "nix-" + (self.shortRev or self.dirtyShortRev or "dirty");
|
pkgs.libXcursor
|
||||||
|
pkgs.libxi
|
||||||
dawnInfo = {
|
pkgs.libxcb
|
||||||
"x86_64-linux" = {
|
pkgs.libxrandr
|
||||||
triple = "linux-x86_64";
|
pkgs.libxscrnsaver
|
||||||
hash = "sha256-HXfKTLHtMPwupnFnaflCARtXVPuS/0PoCePXidjE5xs=";
|
pkgs.libxtst
|
||||||
};
|
pkgs.libjpeg8
|
||||||
"aarch64-linux" = {
|
pkgs.libxkbcommon
|
||||||
triple = "linux-aarch64";
|
pkgs.libglvnd
|
||||||
hash = "sha256-34yyFpfqBZUwoFXQ41F0AwAU78FaNihOSY0oriwn6B0=";
|
];
|
||||||
};
|
|
||||||
"aarch64-darwin" = {
|
|
||||||
triple = "darwin-arm64";
|
|
||||||
hash = "sha256-eQnzrBp6gjiBek1VYQ9A5W13ClYWrDDKjIqv/7eNTR4=";
|
|
||||||
};
|
|
||||||
"x86_64-darwin" = {
|
|
||||||
triple = "darwin-x86_64";
|
|
||||||
hash = "sha256-QGWiGdxiI9kci3NPXH6QFFirxn16851zB/w3jqhIBJ4=";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
in {
|
||||||
nodPrebuiltInfo = {
|
packages.x86_64-linux.default = dusk;
|
||||||
"x86_64-linux" = {
|
|
||||||
triple = "linux-x86_64";
|
|
||||||
hash = "sha256-mUqvLsbsqaZ+HAjMmHYPYO+MgtanGRTw7Gzn5uXR5rE=";
|
|
||||||
};
|
|
||||||
"aarch64-darwin" = {
|
|
||||||
triple = "macos-arm64";
|
|
||||||
hash = "sha256-UPy1ywCcv0K6VJOU3uUelJuUdBh3UNaPRlyP5LOBeDw=";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
perSystem =
|
|
||||||
system:
|
|
||||||
let
|
|
||||||
pkgs = import nixpkgs { inherit system; };
|
|
||||||
inherit (pkgs.stdenv.hostPlatform) isDarwin;
|
|
||||||
hasNodPrebuilt = nodPrebuiltInfo ? ${system};
|
|
||||||
|
|
||||||
aurora = pkgs.fetchFromGitHub {
|
|
||||||
owner = "encounter";
|
|
||||||
repo = "aurora";
|
|
||||||
rev = "10006618ee493f248b8597e4dfa1d2871d76a1d9";
|
|
||||||
hash = "sha256-lY2xuVyB7aPJ9+2wwLRB3F5U/BuPSxdSpegdG+qNd9o=";
|
|
||||||
};
|
|
||||||
|
|
||||||
dawn = pkgs.fetchzip {
|
|
||||||
url = "https://github.com/encounter/dawn-build/releases/download/${dawnVersion}/dawn-${dawnInfo.${system}.triple}.tar.gz";
|
|
||||||
hash = dawnInfo.${system}.hash;
|
|
||||||
stripRoot = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
corrosion = pkgs.fetchFromGitHub {
|
|
||||||
owner = "corrosion-rs";
|
|
||||||
repo = "corrosion";
|
|
||||||
rev = "v0.6.1";
|
|
||||||
hash = "sha256-ppuDNObfKhneD9AlnPAvyCRHKW3BidXKglD1j/LE9CM=";
|
|
||||||
};
|
|
||||||
|
|
||||||
nodFromSource = pkgs.stdenv.mkDerivation (finalAttrs: {
|
|
||||||
pname = "nod";
|
|
||||||
version = nodVersion;
|
|
||||||
src = pkgs.fetchFromGitHub {
|
|
||||||
owner = "encounter";
|
|
||||||
repo = "nod";
|
|
||||||
rev = nodVersion;
|
|
||||||
hash = "sha256-+zrtVzjo0+X/6uMcNUn1+FaSR+jOhrcQSDNBFjw0NDs=";
|
|
||||||
};
|
|
||||||
cargoDeps = pkgs.rustPlatform.importCargoLock {
|
|
||||||
lockFile = "${finalAttrs.src}/Cargo.lock";
|
|
||||||
};
|
|
||||||
postPatch = ''
|
|
||||||
substituteInPlace CMakeLists.txt \
|
|
||||||
--replace-warn "add_subdirectory(nod-ffi/examples)" ""
|
|
||||||
'';
|
|
||||||
nativeBuildInputs = [
|
|
||||||
pkgs.cmake
|
|
||||||
pkgs.ninja
|
|
||||||
pkgs.rustPlatform.cargoSetupHook
|
|
||||||
pkgs.cargo
|
|
||||||
pkgs.rustc
|
|
||||||
];
|
|
||||||
CARGO_NET_OFFLINE = "true";
|
|
||||||
cmakeFlags = [
|
|
||||||
"-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
|
|
||||||
"-DFETCHCONTENT_SOURCE_DIR_CORROSION=${corrosion}"
|
|
||||||
"-DNOD_ENABLE_INSTALL=ON"
|
|
||||||
"-DBUILD_SHARED_LIBS=OFF"
|
|
||||||
];
|
|
||||||
doCheck = false;
|
|
||||||
});
|
|
||||||
|
|
||||||
nod =
|
|
||||||
if hasNodPrebuilt then
|
|
||||||
pkgs.fetchzip {
|
|
||||||
url = "https://github.com/encounter/nod/releases/download/${nodVersion}/libnod-${
|
|
||||||
nodPrebuiltInfo.${system}.triple
|
|
||||||
}.tar.gz";
|
|
||||||
hash = nodPrebuiltInfo.${system}.hash;
|
|
||||||
stripRoot = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
nodFromSource;
|
|
||||||
|
|
||||||
fetchContentDirs = {
|
|
||||||
DAWN_PREBUILT = dawn;
|
|
||||||
NOD_PREBUILT = nod;
|
|
||||||
CXXOPTS = pkgs.cxxopts.src;
|
|
||||||
JSON = pkgs.nlohmann_json.src;
|
|
||||||
XXHASH = pkgs.xxHash.src;
|
|
||||||
ZSTD = pkgs.zstd.src;
|
|
||||||
FMT = pkgs.fetchzip {
|
|
||||||
url = "https://github.com/fmtlib/fmt/archive/refs/tags/11.1.4.tar.gz";
|
|
||||||
hash = "sha256-sUbxlYi/Aupaox3JjWFqXIjcaQa0LFjclQAOleT+FRA=";
|
|
||||||
};
|
|
||||||
TRACY = pkgs.fetchzip {
|
|
||||||
url = "https://github.com/wolfpld/tracy/archive/a64b9a20294d59421a2f57aeca3c6383d8c48169.tar.gz";
|
|
||||||
hash = "sha256-hbNGOsGeyGSvCJ2No8RkwOib1lX2on3vNZSzyVkZdXw=";
|
|
||||||
};
|
|
||||||
IMGUI = pkgs.fetchFromGitHub {
|
|
||||||
owner = "ocornut";
|
|
||||||
repo = "imgui";
|
|
||||||
rev = "v1.91.9b-docking";
|
|
||||||
hash = "sha256-mQOJ6jCN+7VopgZ61yzaCnt4R1QLrW7+47xxMhFRHLQ=";
|
|
||||||
};
|
|
||||||
SQLITE3 = pkgs.fetchzip {
|
|
||||||
url = "https://sqlite.org/2026/sqlite-amalgamation-3510300.zip";
|
|
||||||
hash = "sha256-pNMR8zxaaqfAzQ0AQBOXMct4usdjey1Q0Gnitg06UhM=";
|
|
||||||
};
|
|
||||||
RMLUI = pkgs.fetchzip {
|
|
||||||
url = "https://github.com/mikke89/RmlUi/archive/f9b8c9e2935d5df2c7dff2c190d3968e99b0c3dc.tar.gz";
|
|
||||||
hash = "sha256-g4O/JZUrrcseOz8o2QJRt+2CeuiLnVeuDJc906xvuIg=";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
dusklight = pkgs.stdenv.mkDerivation {
|
|
||||||
pname = "dusklight";
|
|
||||||
version = versionSuffix;
|
|
||||||
src = ./.;
|
|
||||||
|
|
||||||
postUnpack = ''
|
|
||||||
chmod -R u+w "$sourceRoot"
|
|
||||||
rm -rf "$sourceRoot/extern/aurora"
|
|
||||||
mkdir -p "$sourceRoot/extern"
|
|
||||||
cp -r ${aurora} "$sourceRoot/extern/aurora"
|
|
||||||
chmod -R u+w "$sourceRoot/extern/aurora"
|
|
||||||
substituteInPlace "$sourceRoot/extern/aurora/CMakeLists.txt" \
|
|
||||||
--replace-warn "add_subdirectory(tests)" ""
|
|
||||||
'';
|
|
||||||
|
|
||||||
nativeBuildInputs = [
|
|
||||||
pkgs.cmake
|
|
||||||
pkgs.ninja
|
|
||||||
pkgs.pkg-config
|
|
||||||
pkgs.python3
|
|
||||||
pkgs.python3Packages.markupsafe
|
|
||||||
]
|
|
||||||
++ lib.optionals (!isDarwin) [ pkgs.autoPatchelfHook ];
|
|
||||||
|
|
||||||
buildInputs = [
|
|
||||||
pkgs.sdl3
|
|
||||||
pkgs.freetype
|
|
||||||
pkgs.zstd
|
|
||||||
pkgs.cxxopts
|
|
||||||
pkgs.nlohmann_json
|
|
||||||
pkgs.xxHash
|
|
||||||
pkgs.abseil-cpp
|
|
||||||
pkgs.zlib
|
|
||||||
pkgs.libpng
|
|
||||||
pkgs.libjpeg_turbo
|
|
||||||
pkgs.curl
|
|
||||||
pkgs.openssl
|
|
||||||
]
|
|
||||||
++ lib.optionals isDarwin [
|
|
||||||
pkgs.apple-sdk_15
|
|
||||||
pkgs.libiconv
|
|
||||||
]
|
|
||||||
++ lib.optionals (!isDarwin) [
|
|
||||||
pkgs.libGL
|
|
||||||
pkgs.libGLU
|
|
||||||
pkgs.libglvnd
|
|
||||||
pkgs.vulkan-loader
|
|
||||||
pkgs.libX11
|
|
||||||
pkgs.libxcb
|
|
||||||
pkgs.libXcursor
|
|
||||||
pkgs.libxi
|
|
||||||
pkgs.libxrandr
|
|
||||||
pkgs.libxscrnsaver
|
|
||||||
pkgs.libxtst
|
|
||||||
pkgs.libxinerama
|
|
||||||
pkgs.libxkbcommon
|
|
||||||
pkgs.wayland
|
|
||||||
pkgs.libdecor
|
|
||||||
pkgs.alsa-lib
|
|
||||||
pkgs.libpulseaudio
|
|
||||||
pkgs.pipewire
|
|
||||||
pkgs.dbus
|
|
||||||
pkgs.udev
|
|
||||||
pkgs.libusb1
|
|
||||||
pkgs.libunwind
|
|
||||||
pkgs.gtk3
|
|
||||||
];
|
|
||||||
|
|
||||||
cmakeBuildType = "RelWithDebInfo";
|
|
||||||
ninjaFlags = [ "dusklight" ];
|
|
||||||
|
|
||||||
cmakeFlags = [
|
|
||||||
"-DDUSK_VERSION_OVERRIDE=${versionSuffix}"
|
|
||||||
"-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
|
|
||||||
"-DAURORA_DAWN_PROVIDER=package"
|
|
||||||
"-DAURORA_DAWN_LINKAGE=static"
|
|
||||||
"-DAURORA_NOD_PROVIDER=package"
|
|
||||||
"-DAURORA_NOD_LINKAGE=static"
|
|
||||||
"-DAURORA_SDL3_PROVIDER=system"
|
|
||||||
]
|
|
||||||
++ lib.mapAttrsToList (key: src: "-DFETCHCONTENT_SOURCE_DIR_${key}=${src}") fetchContentDirs;
|
|
||||||
|
|
||||||
installPhase =
|
|
||||||
if isDarwin then
|
|
||||||
''
|
|
||||||
runHook preInstall
|
|
||||||
mkdir -p "$out/Applications"
|
|
||||||
cp -r Dusklight.app "$out/Applications/Dusklight.app"
|
|
||||||
runHook postInstall
|
|
||||||
''
|
|
||||||
else
|
|
||||||
''
|
|
||||||
runHook preInstall
|
|
||||||
install -Dm755 dusklight "$out/bin/dusklight"
|
|
||||||
cp -r "$src/res" "$out/bin/res"
|
|
||||||
install -Dm644 "$src/platforms/freedesktop/dev.twilitrealm.dusk.desktop" \
|
|
||||||
"$out/share/applications/dev.twilitrealm.dusk.desktop"
|
|
||||||
for size in 16 32 48 64 128 256 512 1024; do
|
|
||||||
install -Dm644 "$src/platforms/freedesktop/''${size}x''${size}/apps/dev.twilitrealm.dusk.png" \
|
|
||||||
"$out/share/icons/hicolor/''${size}x''${size}/apps/dev.twilitrealm.dusk.png"
|
|
||||||
done
|
|
||||||
runHook postInstall
|
|
||||||
'';
|
|
||||||
|
|
||||||
dontStrip = true;
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
description = "Dusklight — native PC port of the Twilight Princess decompilation";
|
|
||||||
homepage = "https://github.com/zeldaret/tp";
|
|
||||||
platforms = supportedSystems;
|
|
||||||
mainProgram = "dusklight";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Tooling common to every supported host (Linux and macOS).
|
|
||||||
commonDevTools = [
|
|
||||||
pkgs.cmake
|
|
||||||
pkgs.ninja
|
|
||||||
pkgs.pkg-config
|
|
||||||
pkgs.git
|
|
||||||
pkgs.python3
|
|
||||||
pkgs.python3Packages.markupsafe
|
|
||||||
pkgs.rustc
|
|
||||||
pkgs.cargo
|
|
||||||
pkgs.sccache
|
|
||||||
];
|
|
||||||
|
|
||||||
# Linux-only system libraries — mirrors the apt deps from .github/workflows/build.yml
|
|
||||||
# so the cmake presets resolve the same set of headers as CI.
|
|
||||||
linuxDevDeps = [
|
|
||||||
# Compilers / linkers
|
|
||||||
pkgs.clang
|
|
||||||
pkgs.lld
|
|
||||||
# C/C++ utilities
|
|
||||||
pkgs.curl
|
|
||||||
pkgs.openssl
|
|
||||||
pkgs.zlib
|
|
||||||
pkgs.libpng
|
|
||||||
pkgs.libjpeg_turbo
|
|
||||||
pkgs.freetype
|
|
||||||
pkgs.zstd
|
|
||||||
pkgs.fmt
|
|
||||||
pkgs.tracy
|
|
||||||
pkgs.cxxopts
|
|
||||||
pkgs.abseil-cpp
|
|
||||||
pkgs.sdl3
|
|
||||||
pkgs.ncurses
|
|
||||||
pkgs.libunwind
|
|
||||||
pkgs.libusb1
|
|
||||||
pkgs.fuse
|
|
||||||
# Wayland / display server
|
|
||||||
pkgs.wayland
|
|
||||||
pkgs.wayland-protocols
|
|
||||||
pkgs.libxkbcommon
|
|
||||||
pkgs.libdecor
|
|
||||||
# OpenGL / Vulkan
|
|
||||||
pkgs.libGL
|
|
||||||
pkgs.libGLU
|
|
||||||
pkgs.libglvnd
|
|
||||||
pkgs.vulkan-headers
|
|
||||||
pkgs.vulkan-loader
|
|
||||||
# X11
|
|
||||||
pkgs.libX11
|
|
||||||
pkgs.libxcb
|
|
||||||
pkgs.libXcursor
|
|
||||||
pkgs.libxi
|
|
||||||
pkgs.libxrandr
|
|
||||||
pkgs.libxscrnsaver
|
|
||||||
pkgs.libxtst
|
|
||||||
pkgs.libxinerama
|
|
||||||
# Audio
|
|
||||||
pkgs.alsa-lib
|
|
||||||
pkgs.libpulseaudio
|
|
||||||
pkgs.pipewire
|
|
||||||
# System integration
|
|
||||||
pkgs.dbus
|
|
||||||
pkgs.udev
|
|
||||||
pkgs.gtk3
|
|
||||||
];
|
|
||||||
|
|
||||||
# On macOS we deliberately avoid pulling Nix's cc-wrapper so CMake picks up
|
|
||||||
# Apple Clang and the Xcode SDK directly, matching the macOS CI workflow.
|
|
||||||
darwinShell = pkgs.mkShellNoCC {
|
|
||||||
packages = commonDevTools;
|
|
||||||
shellHook = ''
|
|
||||||
echo "Dusklight dev shell (macOS)"
|
|
||||||
echo "Requires Xcode Command Line Tools for Apple Clang and the macOS SDK."
|
|
||||||
echo "Configure: cmake --preset macos-default-relwithdebinfo"
|
|
||||||
echo "Build: cmake --build --preset macos-default-relwithdebinfo"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
linuxShell = pkgs.mkShell {
|
|
||||||
packages = commonDevTools ++ linuxDevDeps;
|
|
||||||
shellHook = ''
|
|
||||||
echo "Dusklight dev shell (Linux)"
|
|
||||||
echo "Configure: cmake --preset linux-default-relwithdebinfo"
|
|
||||||
echo " cmake --preset linux-clang-relwithdebinfo"
|
|
||||||
echo "Build: cmake --build --preset <preset>"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
packages = {
|
|
||||||
default = dusklight;
|
|
||||||
dusklight = dusklight;
|
|
||||||
}
|
|
||||||
// lib.optionalAttrs (!hasNodPrebuilt) { nod = nodFromSource; };
|
|
||||||
|
|
||||||
devShells.default = if isDarwin then darwinShell else linuxShell;
|
|
||||||
};
|
|
||||||
|
|
||||||
systems = forAllSystems perSystem;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
packages = lib.mapAttrs (_: s: s.packages) systems;
|
|
||||||
devShells = lib.mapAttrs (_: s: s.devShells) systems;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4564,7 +4564,6 @@ public:
|
|||||||
cXyz mIBChainInterpCurrHandRoot;
|
cXyz mIBChainInterpCurrHandRoot;
|
||||||
bool mIBChainInterpPrevValid;
|
bool mIBChainInterpPrevValid;
|
||||||
bool mIBChainInterpCurrValid;
|
bool mIBChainInterpCurrValid;
|
||||||
bool mIsRollstab = false;
|
|
||||||
#endif
|
#endif
|
||||||
}; // Size: 0x385C
|
}; // Size: 0x385C
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
#include <thp.h>
|
#include <thp.h>
|
||||||
#else
|
#else
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
|
||||||
#endif
|
#endif
|
||||||
#include "f_op/f_op_actor.h"
|
#include "f_op/f_op_actor.h"
|
||||||
#include "d/d_drawlist.h"
|
#include "d/d_drawlist.h"
|
||||||
@@ -126,7 +125,6 @@ struct daMP_THPPlayer {
|
|||||||
/* 0x0D4 */ s32 curCount;
|
/* 0x0D4 */ s32 curCount;
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
/* 0x0D8 */ std::atomic<s32> videoDecodeCount;
|
/* 0x0D8 */ std::atomic<s32> videoDecodeCount;
|
||||||
std::chrono::steady_clock::time_point thpPlaybackClock;
|
|
||||||
#else
|
#else
|
||||||
/* 0x0D8 */ s32 videoDecodeCount;
|
/* 0x0D8 */ s32 videoDecodeCount;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ private:
|
|||||||
#define PLAYER_CREATE_ANM_HEAP_F(heap, type, fmt, ...) \
|
#define PLAYER_CREATE_ANM_HEAP_F(heap, type, fmt, ...) \
|
||||||
{ \
|
{ \
|
||||||
char pcah_name_buf[32]; \
|
char pcah_name_buf[32]; \
|
||||||
snprintf(pcah_name_buf, sizeof(pcah_name_buf), fmt, ##__VA_ARGS__); \
|
sprintf(pcah_name_buf, fmt, ##__VA_ARGS__); \
|
||||||
(heap).createHeap(type, pcah_name_buf); \
|
(heap).createHeap(type, pcah_name_buf); \
|
||||||
\
|
\
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -444,7 +444,8 @@ public:
|
|||||||
/* 0x1C */ f32 mFovy;
|
/* 0x1C */ f32 mFovy;
|
||||||
/* 0x20 */ f32 mBank;
|
/* 0x20 */ f32 mBank;
|
||||||
/* 0x24 */ fopAc_ac_c* mRelActor;
|
/* 0x24 */ fopAc_ac_c* mRelActor;
|
||||||
/* 0x28 */ char mRelUseMask[4];
|
/* 0x28 */ char mRelUseMask;
|
||||||
|
/* 0x29 */ char field_0x29;
|
||||||
/* 0x2C */ int mTimer;
|
/* 0x2C */ int mTimer;
|
||||||
/* 0x30 */ bool field_0x30;
|
/* 0x30 */ bool field_0x30;
|
||||||
/* 0x34 */ cXyz mBasePos;
|
/* 0x34 */ cXyz mBasePos;
|
||||||
@@ -525,7 +526,7 @@ public:
|
|||||||
/* 0x3C */ fopAc_ac_c* field_0x3c;
|
/* 0x3C */ fopAc_ac_c* field_0x3c;
|
||||||
/* 0x40 */ fopAc_ac_c* field_0x40;
|
/* 0x40 */ fopAc_ac_c* field_0x40;
|
||||||
/* 0x44 */ fpc_ProcID field_0x44;
|
/* 0x44 */ fpc_ProcID field_0x44;
|
||||||
/* 0x48 */ char field_0x48[4];
|
/* 0x48 */ char field_0x48;
|
||||||
/* 0x4C */ int field_0x4c;
|
/* 0x4C */ int field_0x4c;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -540,7 +541,11 @@ public:
|
|||||||
/* 0x3C */ f32 field_0x3c;
|
/* 0x3C */ f32 field_0x3c;
|
||||||
/* 0x40 */ fopAc_ac_c* mRelActor;
|
/* 0x40 */ fopAc_ac_c* mRelActor;
|
||||||
/* 0x44 */ fpc_ProcID mRelActorID;
|
/* 0x44 */ fpc_ProcID mRelActorID;
|
||||||
/* 0x48 */ char mRelUseMask[8];
|
/* 0x48 */ char mRelUseMask;
|
||||||
|
/* 0x49 */ char field_0x49;
|
||||||
|
/* 0x4A */ char field_0x4a;
|
||||||
|
/* 0x4B */ char field_0x4b;
|
||||||
|
/* 0x4C */ u8 field_0x4c[4];
|
||||||
/* 0x50 */ int mTimer;
|
/* 0x50 */ int mTimer;
|
||||||
/* 0x54 */ int mTransType;
|
/* 0x54 */ int mTransType;
|
||||||
/* 0x58 */ f32 mCushion;
|
/* 0x58 */ f32 mCushion;
|
||||||
@@ -691,7 +696,8 @@ public:
|
|||||||
/* 0x24 */ f32* field_0x24;
|
/* 0x24 */ f32* field_0x24;
|
||||||
/* 0x28 */ f32 field_0x28;
|
/* 0x28 */ f32 field_0x28;
|
||||||
/* 0x2C */ fopAc_ac_c* mRelActor;
|
/* 0x2C */ fopAc_ac_c* mRelActor;
|
||||||
/* 0x30 */ char mRelUseMask[4];
|
/* 0x30 */ char mRelUseMask;
|
||||||
|
/* 0x31 */ char field_0x31;
|
||||||
/* 0x34 */ int mTimer;
|
/* 0x34 */ int mTimer;
|
||||||
/* 0x38 */ int field_0x38;
|
/* 0x38 */ int field_0x38;
|
||||||
/* 0x3C */ int mChoice;
|
/* 0x3C */ int mChoice;
|
||||||
@@ -774,7 +780,8 @@ public:
|
|||||||
/* 0xAC */ f32 field_0xac;
|
/* 0xAC */ f32 field_0xac;
|
||||||
/* 0xB0 */ fopAc_ac_c* mRelActor;
|
/* 0xB0 */ fopAc_ac_c* mRelActor;
|
||||||
/* 0xB4 */ fpc_ProcID mRelActorID;
|
/* 0xB4 */ fpc_ProcID mRelActorID;
|
||||||
/* 0xB8 */ char mRelUseMask[4];
|
/* 0xB8 */ char mRelUseMask;
|
||||||
|
/* 0xB9 */ char field_0xb9;
|
||||||
/* 0xBC */ f32 mCushion;
|
/* 0xBC */ f32 mCushion;
|
||||||
/* 0xC0 */ u32 field_0xc0[6];
|
/* 0xC0 */ u32 field_0xc0[6];
|
||||||
};
|
};
|
||||||
@@ -910,12 +917,7 @@ public:
|
|||||||
char* getEvStringPntData(char*, char*);
|
char* getEvStringPntData(char*, char*);
|
||||||
char* getEvStringPntData(char*);
|
char* getEvStringPntData(char*);
|
||||||
bool getEvXyzData(cXyz*, char*, cXyz);
|
bool getEvXyzData(cXyz*, char*, cXyz);
|
||||||
#if TARGET_PC
|
|
||||||
template<size_t N>
|
|
||||||
bool getEvStringData(char (&)[N], char*, char*);
|
|
||||||
#else
|
|
||||||
bool getEvStringData(char*, char*, char*);
|
bool getEvStringData(char*, char*, char*);
|
||||||
#endif
|
|
||||||
fopAc_ac_c* getEvActor(char*);
|
fopAc_ac_c* getEvActor(char*);
|
||||||
fopAc_ac_c* getEvActor(char*, char*);
|
fopAc_ac_c* getEvActor(char*, char*);
|
||||||
bool pauseEvCamera();
|
bool pauseEvCamera();
|
||||||
|
|||||||
@@ -1851,7 +1851,7 @@ inline u16 dComIfGs_getDeathCount() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
inline TEXT_SPAN dComIfGs_getPlayerName() {
|
inline char* dComIfGs_getPlayerName() {
|
||||||
return g_dComIfG_gameInfo.info.getPlayer().getPlayerInfo().getPlayerName();
|
return g_dComIfG_gameInfo.info.getPlayer().getPlayerInfo().getPlayerName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1859,7 +1859,7 @@ inline void dComIfGs_setPlayerName(const char* i_name) {
|
|||||||
g_dComIfG_gameInfo.info.getPlayer().getPlayerInfo().setPlayerName(i_name);
|
g_dComIfG_gameInfo.info.getPlayer().getPlayerInfo().setPlayerName(i_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline TEXT_SPAN dComIfGs_getHorseName() {
|
inline char* dComIfGs_getHorseName() {
|
||||||
return g_dComIfG_gameInfo.info.getPlayer().getPlayerInfo().getHorseName();
|
return g_dComIfG_gameInfo.info.getPlayer().getPlayerInfo().getHorseName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -196,11 +196,7 @@ public:
|
|||||||
/* 0x108 */ int mSkipTimer;
|
/* 0x108 */ int mSkipTimer;
|
||||||
/* 0x10C */ int mSkipParameter;
|
/* 0x10C */ int mSkipParameter;
|
||||||
/* 0x110 */ BOOL mIsSkipFade;
|
/* 0x110 */ BOOL mIsSkipFade;
|
||||||
#if TARGET_PC
|
|
||||||
/* 0x114 */ char mSkipEventName[21];
|
|
||||||
#else
|
|
||||||
/* 0x114 */ char mSkipEventName[20];
|
/* 0x114 */ char mSkipEventName[20];
|
||||||
#endif
|
|
||||||
/* 0x128 */ u8 mCompulsory;
|
/* 0x128 */ u8 mCompulsory;
|
||||||
/* 0x129 */ bool mRoomInfoSet;
|
/* 0x129 */ bool mRoomInfoSet;
|
||||||
/* 0x12C */ int mRoomNo;
|
/* 0x12C */ int mRoomNo;
|
||||||
|
|||||||
@@ -46,10 +46,10 @@ private:
|
|||||||
/* 0x22 */ u8 field_0x22;
|
/* 0x22 */ u8 field_0x22;
|
||||||
/* 0x24 */ CPaneMgrAlpha* mDatBase;
|
/* 0x24 */ CPaneMgrAlpha* mDatBase;
|
||||||
/* 0x28 */ CPaneMgrAlpha* mNoDatBase;
|
/* 0x28 */ CPaneMgrAlpha* mNoDatBase;
|
||||||
/* 0x2C */ TEXT_SPAN mPlayerName;
|
/* 0x2C */ char* mPlayerName;
|
||||||
/* 0x30 */ TEXT_SPAN mSaveDate;
|
/* 0x30 */ char* mSaveDate;
|
||||||
/* 0x34 */ TEXT_SPAN mPlayTime;
|
/* 0x34 */ char* mPlayTime;
|
||||||
/* 0x38 */ TEXT_SPAN mSaveStatus;
|
/* 0x38 */ char* mSaveStatus;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (dFile_info_c::*warningFunc)(void);
|
typedef void (dFile_info_c::*warningFunc)(void);
|
||||||
|
|||||||
@@ -11,42 +11,7 @@
|
|||||||
|
|
||||||
class dFile_info_c;
|
class dFile_info_c;
|
||||||
class J2DPicture;
|
class J2DPicture;
|
||||||
#if TARGET_PC
|
|
||||||
static bool cachedPanes = false;
|
|
||||||
|
|
||||||
struct PaneCache {
|
|
||||||
u64 tag;
|
|
||||||
f32 origTransX;
|
|
||||||
f32 origTransY;
|
|
||||||
bool cached;
|
|
||||||
};
|
|
||||||
|
|
||||||
static PaneCache mSelDtPanes[] = {
|
|
||||||
{MULTI_CHAR('tate_n0'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('tate_n1'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('ken_n0'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('ken_n1'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('fuku_n0'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('fuku_n1'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('fuku_n2'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('gray_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('b_base'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('b_base1'), 0.0f, false},
|
|
||||||
};
|
|
||||||
|
|
||||||
static PaneCache fileSelPanes[] = {
|
|
||||||
{MULTI_CHAR('w_uzu00'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('w_uzu01'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('w_uzu02'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('w_uzu03'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('w_uzu04'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('w_uzu05'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('w_uzu06'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('w_uzu07'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('w_uzu08'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('w_uzu09'), 0.0f, false},
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
class dDlst_FileSel_c : public dDlst_base_c {
|
class dDlst_FileSel_c : public dDlst_base_c {
|
||||||
public:
|
public:
|
||||||
void draw();
|
void draw();
|
||||||
@@ -565,7 +530,7 @@ public:
|
|||||||
/* 0x0130 */ int field_0x0130;
|
/* 0x0130 */ int field_0x0130;
|
||||||
/* 0x0134 */ int field_0x0134;
|
/* 0x0134 */ int field_0x0134;
|
||||||
/* 0x0138 */ CPaneMgrAlpha* mErrorMsgTxtPane[2];
|
/* 0x0138 */ CPaneMgrAlpha* mErrorMsgTxtPane[2];
|
||||||
/* 0x0140 */ TEXT_SPAN mErrorMsgStringPtr[2];
|
/* 0x0140 */ char* mErrorMsgStringPtr[2];
|
||||||
/* 0x0148 */ u8 mErrorTxtDispIdx;
|
/* 0x0148 */ u8 mErrorTxtDispIdx;
|
||||||
/* 0x0149 */ u8 field_0x0149;
|
/* 0x0149 */ u8 field_0x0149;
|
||||||
/* 0x014A */ bool field_0x014a;
|
/* 0x014A */ bool field_0x014a;
|
||||||
@@ -609,7 +574,7 @@ public:
|
|||||||
/* 0x020A */ u8 mFadeTimer;
|
/* 0x020A */ u8 mFadeTimer;
|
||||||
/* 0x020B */ u8 field_0x020b;
|
/* 0x020B */ u8 field_0x020b;
|
||||||
/* 0x020C */ CPaneMgrAlpha* mHeaderTxtPane[2];
|
/* 0x020C */ CPaneMgrAlpha* mHeaderTxtPane[2];
|
||||||
/* 0x0214 */ TEXT_SPAN mHeaderStringPtr[2];
|
/* 0x0214 */ char* mHeaderStringPtr[2];
|
||||||
/* 0x021C */ u8 mHeaderTxtDispIdx;
|
/* 0x021C */ u8 mHeaderTxtDispIdx;
|
||||||
/* 0x021D */ u8 field_0x021d;
|
/* 0x021D */ u8 field_0x021d;
|
||||||
/* 0x021E */ u8 field_0x021e;
|
/* 0x021E */ u8 field_0x021e;
|
||||||
@@ -626,7 +591,7 @@ public:
|
|||||||
/* 0x024B */ u8 field_0x024b;
|
/* 0x024B */ u8 field_0x024b;
|
||||||
/* 0x024C */ u8 field_0x024c;
|
/* 0x024C */ u8 field_0x024c;
|
||||||
/* 0x024B */ u8 field_0x024d[3];
|
/* 0x024B */ u8 field_0x024d[3];
|
||||||
/* 0x0250 */ TEXT_SPAN mModoruStringPtr;
|
/* 0x0250 */ char* mModoruStringPtr;
|
||||||
/* 0x0254 */ STControl* stick;
|
/* 0x0254 */ STControl* stick;
|
||||||
/* 0x0258 */ u8 mIsDataNew[3];
|
/* 0x0258 */ u8 mIsDataNew[3];
|
||||||
/* 0x025B */ u8 mIsNoData[3];
|
/* 0x025B */ u8 mIsNoData[3];
|
||||||
|
|||||||
@@ -223,9 +223,6 @@ private:
|
|||||||
/* 0x8F */ u8 field_0x8f;
|
/* 0x8F */ u8 field_0x8f;
|
||||||
/* 0x90 */ u8 field_0x90;
|
/* 0x90 */ u8 field_0x90;
|
||||||
/* 0x91 */ u8 field_0x91;
|
/* 0x91 */ u8 field_0x91;
|
||||||
#if TARGET_PC
|
|
||||||
bool previousMirror;
|
|
||||||
#endif
|
|
||||||
}; // Size: 0x94
|
}; // Size: 0x94
|
||||||
|
|
||||||
class dMap_HIO_list_c : public dMpath_HIO_n::hioList_c {
|
class dMap_HIO_list_c : public dMpath_HIO_n::hioList_c {
|
||||||
|
|||||||
@@ -15,49 +15,6 @@ class dMenu_Fishing_c;
|
|||||||
class dMenu_Skill_c;
|
class dMenu_Skill_c;
|
||||||
class dMenu_Insect_c;
|
class dMenu_Insect_c;
|
||||||
class dSelect_cursor_c;
|
class dSelect_cursor_c;
|
||||||
#if TARGET_PC
|
|
||||||
static bool cachedPanes = false;
|
|
||||||
|
|
||||||
struct PaneCache {
|
|
||||||
u64 tag;
|
|
||||||
f32 origTransX;
|
|
||||||
f32 origTransY;
|
|
||||||
bool cached;
|
|
||||||
};
|
|
||||||
|
|
||||||
static PaneCache mpScreenPanes[] = {
|
|
||||||
{MULTI_CHAR('sa_tex_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('op_tex_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('heart_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('wolf_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('item_0_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('item_1_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('item_2_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('fish_3_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('lett_4_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('maki_5_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('fuku_n0'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('fuku_n1'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('fuku_n2'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('tate_n0'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('tate_n1'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('ken_n0'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('ken_n1'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('kabu_6n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('t_t00'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('f_t00'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('itemn_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('infotxtn'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('sa_op_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('title_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('menu_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('w_er_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('center_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('info_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('lavel_n'), 0.0f, false},
|
|
||||||
{MULTI_CHAR('modelbgn'), 0.0f, false},
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class dMenu_Collect2D_c;
|
class dMenu_Collect2D_c;
|
||||||
class dMenu_Collect2DTop_c : public dDlst_base_c {
|
class dMenu_Collect2DTop_c : public dDlst_base_c {
|
||||||
|
|||||||
@@ -183,11 +183,6 @@ public:
|
|||||||
/* 0xDD8 */ u8 field_0xdd8;
|
/* 0xDD8 */ u8 field_0xdd8;
|
||||||
/* 0xDD9 */ u8 field_0xdd9;
|
/* 0xDD9 */ u8 field_0xdd9;
|
||||||
/* 0xDDA */ u8 field_0xdda;
|
/* 0xDDA */ u8 field_0xdda;
|
||||||
|
|
||||||
#if TARGET_PC
|
|
||||||
J2DTextBox* mpPoeCountPane;
|
|
||||||
J2DPicture* mpPoeCountIcon;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class dMenu_Dmap_c {
|
class dMenu_Dmap_c {
|
||||||
|
|||||||
@@ -421,12 +421,6 @@ public:
|
|||||||
/* 0xC2 */ u8 mAlphaButtonZ;
|
/* 0xC2 */ u8 mAlphaButtonZ;
|
||||||
/* 0xC3 */ u8 mAlphaAnalogStick;
|
/* 0xC3 */ u8 mAlphaAnalogStick;
|
||||||
/* 0xC4 */ u8 mAlphaDpad;
|
/* 0xC4 */ u8 mAlphaDpad;
|
||||||
|
|
||||||
#if TARGET_PC
|
|
||||||
J2DTextBox* mpPoeCountPane;
|
|
||||||
J2DPicture* mpPoeCountIcon;
|
|
||||||
u8 mSelectRegionNo;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* D_MENU_D_MENU_FMAP2D_H */
|
#endif /* D_MENU_D_MENU_FMAP2D_H */
|
||||||
|
|||||||
@@ -76,11 +76,6 @@ public:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if TARGET_PC
|
|
||||||
static void getDmapPoeCount(const std::string& stageName, int& nowCount, int& totalCount);
|
|
||||||
static void getFmapPoeCount(const int regionNo, int& nowCount, int& totalCount);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct Stage_c {
|
struct Stage_c {
|
||||||
// Incomplete class
|
// Incomplete class
|
||||||
|
|
||||||
|
|||||||
@@ -313,7 +313,7 @@ private:
|
|||||||
/* 0x00B8 */ int field_0xb8;
|
/* 0x00B8 */ int field_0xb8;
|
||||||
/* 0x00BC */ int field_0xbc;
|
/* 0x00BC */ int field_0xbc;
|
||||||
/* 0x00C0 */ CPaneMgrAlpha* mpErrTxtPane[2];
|
/* 0x00C0 */ CPaneMgrAlpha* mpErrTxtPane[2];
|
||||||
/* 0x00C8 */ TEXT_SPAN mpErrTxt[2];
|
/* 0x00C8 */ char* mpErrTxt[2];
|
||||||
/* 0x00D0 */ u8 mErrTxtType;
|
/* 0x00D0 */ u8 mErrTxtType;
|
||||||
/* 0x00D1 */ u8 mErrTxtAnmComplete;
|
/* 0x00D1 */ u8 mErrTxtAnmComplete;
|
||||||
/* 0x00D2 */ u8 field_0xd2;
|
/* 0x00D2 */ u8 field_0xd2;
|
||||||
@@ -344,7 +344,7 @@ private:
|
|||||||
/* 0x0160 */ J2DAnmTevRegKey* field_0x160;
|
/* 0x0160 */ J2DAnmTevRegKey* field_0x160;
|
||||||
/* 0x0164 */ int field_0x164;
|
/* 0x0164 */ int field_0x164;
|
||||||
/* 0x0168 */ CPaneMgrAlpha* mpHeaderTxtPane[2];
|
/* 0x0168 */ CPaneMgrAlpha* mpHeaderTxtPane[2];
|
||||||
/* 0x0170 */ TEXT_SPAN mpHeaderTxt[2];
|
/* 0x0170 */ char* mpHeaderTxt[2];
|
||||||
/* 0x0178 */ u8 mHeaderTxtType; // 0: Select Menu 1: YesNo Menu
|
/* 0x0178 */ u8 mHeaderTxtType; // 0: Select Menu 1: YesNo Menu
|
||||||
/* 0x0179 */ u8 mHeaderAnmComplete;
|
/* 0x0179 */ u8 mHeaderAnmComplete;
|
||||||
/* 0x017A */ u8 field_0x17a;
|
/* 0x017A */ u8 field_0x17a;
|
||||||
|
|||||||
@@ -67,9 +67,9 @@ public:
|
|||||||
s16 decFloatingMessageTimer();
|
s16 decFloatingMessageTimer();
|
||||||
void resetFloatingMessage();
|
void resetFloatingMessage();
|
||||||
void decMsgKeyWaitTimer();
|
void decMsgKeyWaitTimer();
|
||||||
void getString(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry);
|
void getString(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry);
|
||||||
void getStringKana(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry);
|
void getStringKana(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry);
|
||||||
void getStringKanji(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry);
|
void getStringKanji(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry);
|
||||||
f32 getStringLength(J2DTextBox* i_textbox, char* i_string);
|
f32 getStringLength(J2DTextBox* i_textbox, char* i_string);
|
||||||
f32 getStringLength(JUTFont* i_font, f32 param_2, f32 param_3, char* i_string);
|
f32 getStringLength(JUTFont* i_font, f32 param_2, f32 param_3, char* i_string);
|
||||||
void onDirectUseItem(int);
|
void onDirectUseItem(int);
|
||||||
@@ -348,15 +348,15 @@ inline CPaneMgr* dMeter2Info_getMeterItemPanePtr(s32 i_idx) {
|
|||||||
return g_meter2_info.getMeterItemPanePtr(i_idx);
|
return g_meter2_info.getMeterItemPanePtr(i_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void dMeter2Info_getString(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry) {
|
inline void dMeter2Info_getString(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry) {
|
||||||
g_meter2_info.getString(i_stringID, o_string, i_msgEntry);
|
g_meter2_info.getString(i_stringID, o_string, i_msgEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void dMeter2Info_getStringKanji(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry) {
|
inline void dMeter2Info_getStringKanji(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry) {
|
||||||
g_meter2_info.getStringKanji(i_stringID, o_string, i_msgEntry);
|
g_meter2_info.getStringKanji(i_stringID, o_string, i_msgEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void dMeter2Info_getStringKana(u32 i_stringID, TEXT_SPAN o_string, JMSMesgEntry_c* i_msgEntry) {
|
inline void dMeter2Info_getStringKana(u32 i_stringID, char* o_string, JMSMesgEntry_c* i_msgEntry) {
|
||||||
g_meter2_info.getStringKana(i_stringID, o_string, i_msgEntry);
|
g_meter2_info.getStringKana(i_stringID, o_string, i_msgEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
#ifndef D_METER_D_METER_BUTTON_H
|
#ifndef D_METER_D_METER_BUTTON_H
|
||||||
#define D_METER_D_METER_BUTTON_H
|
#define D_METER_D_METER_BUTTON_H
|
||||||
|
|
||||||
#include "global.h"
|
|
||||||
#include "JSystem/J2DGraph/J2DScreen.h"
|
#include "JSystem/J2DGraph/J2DScreen.h"
|
||||||
#include "JSystem/J2DGraph/J2DTextBox.h"
|
#include "JSystem/J2DGraph/J2DTextBox.h"
|
||||||
#include "d/d_drawlist.h"
|
#include "d/d_drawlist.h"
|
||||||
@@ -195,7 +194,7 @@ public:
|
|||||||
/* 0x0FC */ CPaneMgr* field_0x0fc[4];
|
/* 0x0FC */ CPaneMgr* field_0x0fc[4];
|
||||||
/* 0x10C */ JKRHeap* mpHeap;
|
/* 0x10C */ JKRHeap* mpHeap;
|
||||||
/* 0x110 */ void* mpFishingTex;
|
/* 0x110 */ void* mpFishingTex;
|
||||||
/* 0x114 */ char mButtonText[2][DUSK_IF_ELSE(32, 15)];
|
/* 0x114 */ char mButtonText[2][15];
|
||||||
/* 0x132 */ u8 field_0x132[0x134 - 0x132];
|
/* 0x132 */ u8 field_0x132[0x134 - 0x132];
|
||||||
/* 0x134 */ f32 field_0x134;
|
/* 0x134 */ f32 field_0x134;
|
||||||
/* 0x138 */ f32 field_0x138;
|
/* 0x138 */ f32 field_0x138;
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
#include "JSystem/JMessage/JMessage.h"
|
#include "JSystem/JMessage/JMessage.h"
|
||||||
#include "SSystem/SComponent/c_xyz.h"
|
#include "SSystem/SComponent/c_xyz.h"
|
||||||
#include "dusk/endian.h"
|
#include "dusk/endian.h"
|
||||||
#include "dusk/string.hpp"
|
|
||||||
|
|
||||||
#if REGION_JPN
|
#if REGION_JPN
|
||||||
#define D_MSG_CLASS_PAGE_CNT_MAX 30
|
#define D_MSG_CLASS_PAGE_CNT_MAX 30
|
||||||
@@ -68,7 +67,7 @@ struct jmessage_tReference : public JMessage::TReference {
|
|||||||
void pageSend();
|
void pageSend();
|
||||||
void selectMessage();
|
void selectMessage();
|
||||||
void inputNumber();
|
void inputNumber();
|
||||||
TEXT_SPAN getWord(int);
|
char* getWord(int);
|
||||||
void resetWord();
|
void resetWord();
|
||||||
void setCharactor(u16);
|
void setCharactor(u16);
|
||||||
void addCharactor(u16);
|
void addCharactor(u16);
|
||||||
@@ -229,11 +228,11 @@ struct jmessage_tReference : public JMessage::TReference {
|
|||||||
f32 getSelRubyCharSpace() { return mSelRubyCharSpace; }
|
f32 getSelRubyCharSpace() { return mSelRubyCharSpace; }
|
||||||
f32 getRubySize() { return mRubySize; }
|
f32 getRubySize() { return mRubySize; }
|
||||||
f32 getRubyCharSpace() { return mRubyCharSpace; }
|
f32 getRubyCharSpace() { return mRubyCharSpace; }
|
||||||
TEXT_SPAN getSelTextPtr(int idx) { return mSelText[idx]; }
|
char* getSelTextPtr(int idx) { return mSelText[idx]; }
|
||||||
TEXT_SPAN getSelRubyPtr(int idx) { return mSelRuby[idx]; }
|
char* getSelRubyPtr(int idx) { return mSelRuby[idx]; }
|
||||||
TEXT_SPAN getTextPtr() { return mText; }
|
char* getTextPtr() { return mText; }
|
||||||
TEXT_SPAN getTextSPtr() { return mTextS; }
|
char* getTextSPtr() { return mTextS; }
|
||||||
TEXT_SPAN getRubyPtr() { return mRuby; }
|
char* getRubyPtr() { return mRuby; }
|
||||||
u8 getSelectRubyFlag() { return mSelectRubyFlag; }
|
u8 getSelectRubyFlag() { return mSelectRubyFlag; }
|
||||||
f32 getSelTBoxWidth() { return mSelTBoxWidth; }
|
f32 getSelTBoxWidth() { return mSelTBoxWidth; }
|
||||||
u8 getSelectPos() { return mSelectPos; }
|
u8 getSelectPos() { return mSelectPos; }
|
||||||
@@ -464,7 +463,7 @@ struct jmessage_tRenderingProcessor : public JMessage::TRenderingProcessor {
|
|||||||
f32 getLineLength(int);
|
f32 getLineLength(int);
|
||||||
void do_strcat(char*, bool, bool, bool);
|
void do_strcat(char*, bool, bool, bool);
|
||||||
void do_rubyset(void const*, u32);
|
void do_rubyset(void const*, u32);
|
||||||
void do_rubystrcat(char*, TEXT_SPAN, f32, f32);
|
void do_rubystrcat(char*, char*, f32, f32);
|
||||||
void do_name1();
|
void do_name1();
|
||||||
void do_numset(s16);
|
void do_numset(s16);
|
||||||
void push_word();
|
void push_word();
|
||||||
|
|||||||
@@ -53,8 +53,8 @@ public:
|
|||||||
void demoMessageGroupLocal();
|
void demoMessageGroupLocal();
|
||||||
void endFlowGroupLocal();
|
void endFlowGroupLocal();
|
||||||
void changeGroupLocal(s16);
|
void changeGroupLocal(s16);
|
||||||
bool getStringLocal(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*, TEXT_SPAN,
|
bool getStringLocal(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*, char*,
|
||||||
TEXT_SPAN, TEXT_SPAN, s16*);
|
char*, char*, s16*);
|
||||||
bool isGetItemMessage();
|
bool isGetItemMessage();
|
||||||
bool isKanbanMessage();
|
bool isKanbanMessage();
|
||||||
bool isHowlMessage();
|
bool isHowlMessage();
|
||||||
@@ -121,7 +121,7 @@ public:
|
|||||||
static void endFlowGroup();
|
static void endFlowGroup();
|
||||||
static void changeGroup(s16);
|
static void changeGroup(s16);
|
||||||
static bool getString(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*,
|
static bool getString(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*,
|
||||||
TEXT_SPAN, TEXT_SPAN, TEXT_SPAN, s16*);
|
char*, char*, char*, s16*);
|
||||||
static void* getMsgDtPtr();
|
static void* getMsgDtPtr();
|
||||||
static void setProcessID(fpc_ProcID);
|
static void setProcessID(fpc_ProcID);
|
||||||
static msg_class* getActor();
|
static msg_class* getActor();
|
||||||
@@ -246,12 +246,12 @@ public:
|
|||||||
|
|
||||||
static void setWord(const char* i_word);
|
static void setWord(const char* i_word);
|
||||||
void setWordLocal(const char* i_word) {
|
void setWordLocal(const char* i_word) {
|
||||||
SAFE_STRCPY(mWord, i_word);
|
strcpy(mWord, i_word);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setSelectWord(int i_no, const char* i_word);
|
static void setSelectWord(int i_no, const char* i_word);
|
||||||
void setSelectWordLocal(int i_no, const char* i_word) {
|
void setSelectWordLocal(int i_no, const char* i_word) {
|
||||||
SAFE_STRCPY(mSelectWord[i_no], i_word);
|
strcpy(mSelectWord[i_no], i_word);
|
||||||
}
|
}
|
||||||
|
|
||||||
jmessage_tSequenceProcessor* getSequenceProcessor() { return mpSeqProc; }
|
jmessage_tSequenceProcessor* getSequenceProcessor() { return mpSeqProc; }
|
||||||
@@ -426,8 +426,8 @@ inline void dMsgObject_setTalkActor(fopAc_ac_c* actor) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline bool dMsgObject_getString(u32 i_msgId, J2DTextBox* i_tbox, J2DTextBox* i_rubyTbox,
|
inline bool dMsgObject_getString(u32 i_msgId, J2DTextBox* i_tbox, J2DTextBox* i_rubyTbox,
|
||||||
JUTFont* i_font, COutFont_c* i_outFont, TEXT_SPAN o_text,
|
JUTFont* i_font, COutFont_c* i_outFont, char* o_text,
|
||||||
TEXT_SPAN o_ruby, TEXT_SPAN o_textS, s16* param_8) {
|
char* o_ruby, char* o_textS, s16* param_8) {
|
||||||
return dMsgObject_getMsgObjectClass()->getString(i_msgId, i_tbox, i_rubyTbox, i_font, i_outFont, o_text, o_ruby,
|
return dMsgObject_getMsgObjectClass()->getString(i_msgId, i_tbox, i_rubyTbox, i_font, i_outFont, o_text, o_ruby,
|
||||||
o_textS, param_8);
|
o_textS, param_8);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,12 +20,12 @@ public:
|
|||||||
f32 getStringPageLocal(u32, u8, u8, J2DTextBox*, J2DTextBox*, JUTFont*,
|
f32 getStringPageLocal(u32, u8, u8, J2DTextBox*, J2DTextBox*, JUTFont*,
|
||||||
COutFont_c*, u8);
|
COutFont_c*, u8);
|
||||||
u8 getPageMax(int);
|
u8 getPageMax(int);
|
||||||
f32 getMessageLocal(u32, TEXT_SPAN);
|
f32 getMessageLocal(u32, char*);
|
||||||
|
|
||||||
virtual f32 getString(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*, u8);
|
virtual f32 getString(u32, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*, u8);
|
||||||
virtual f32 getStringPage(u32, u8, u8, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*,
|
virtual f32 getStringPage(u32, u8, u8, J2DTextBox*, J2DTextBox*, JUTFont*, COutFont_c*,
|
||||||
u8);
|
u8);
|
||||||
virtual f32 getMessage(u32, TEXT_SPAN);
|
virtual f32 getMessage(u32, char*);
|
||||||
virtual void resetStringLocal(J2DTextBox*);
|
virtual void resetStringLocal(J2DTextBox*);
|
||||||
virtual void drawOutFontLocal(J2DTextBox*, f32);
|
virtual void drawOutFontLocal(J2DTextBox*, f32);
|
||||||
virtual void drawFontLocal(J2DTextBox*, u8, f32, f32, f32, f32, u32, u8);
|
virtual void drawFontLocal(J2DTextBox*, u8, f32, f32, f32, f32, u32, u8);
|
||||||
|
|||||||
@@ -6,14 +6,14 @@
|
|||||||
class dMsgUnit_c {
|
class dMsgUnit_c {
|
||||||
public:
|
public:
|
||||||
dMsgUnit_c();
|
dMsgUnit_c();
|
||||||
void setTag(int, int, TEXT_SPAN, bool);
|
void setTag(int, int, char*, bool);
|
||||||
|
|
||||||
virtual ~dMsgUnit_c();
|
virtual ~dMsgUnit_c();
|
||||||
};
|
};
|
||||||
|
|
||||||
extern dMsgUnit_c g_msg_unit;
|
extern dMsgUnit_c g_msg_unit;
|
||||||
|
|
||||||
inline void dMsgUnit_setTag(int param_0, int param_1, TEXT_SPAN param_2) {
|
inline void dMsgUnit_setTag(int param_0, int param_1, char* param_2) {
|
||||||
g_msg_unit.setTag(param_0, param_1, param_2, true);
|
g_msg_unit.setTag(param_0, param_1, param_2, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ public:
|
|||||||
u8 isInputEnd() { return mIsInputEnd; }
|
u8 isInputEnd() { return mIsInputEnd; }
|
||||||
char* getInputStrPtr() { return mInputStr; }
|
char* getInputStrPtr() { return mInputStr; }
|
||||||
void hideIcon() { mSelIcon->setAlphaRate(0.0f); }
|
void hideIcon() { mSelIcon->setAlphaRate(0.0f); }
|
||||||
void setNextNameStr(char* i_name) { SAFE_STRCPY(mNextNameStr,i_name); }
|
void setNextNameStr(char* i_name) { strcpy(mNextNameStr,i_name); }
|
||||||
void draw() { _draw(); }
|
void draw() { _draw(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -140,9 +140,9 @@ private:
|
|||||||
/* 0x02C */ J2DAnmTextureSRTKey* mCursorTexKey;
|
/* 0x02C */ J2DAnmTextureSRTKey* mCursorTexKey;
|
||||||
/* 0x030 */ int mCurTexAnmF;
|
/* 0x030 */ int mCurTexAnmF;
|
||||||
/* 0x034 */ CPaneMgrAlpha* mNameCursor[8];
|
/* 0x034 */ CPaneMgrAlpha* mNameCursor[8];
|
||||||
/* 0x054 */ TEXT_SPAN mNameText[8];
|
/* 0x054 */ char* mNameText[8];
|
||||||
/* 0x074 */ CPaneMgr* mMojiIcon[65];
|
/* 0x074 */ CPaneMgr* mMojiIcon[65];
|
||||||
/* 0x178 */ TEXT_SPAN mMojiText[65];
|
/* 0x178 */ char* mMojiText[65];
|
||||||
/* 0x27C */ J2DPane* mMojiPane;
|
/* 0x27C */ J2DPane* mMojiPane;
|
||||||
/* 0x280 */ J2DPane* mMenuPane;
|
/* 0x280 */ J2DPane* mMenuPane;
|
||||||
/* 0x284 */ CPaneMgr* mMenuIcon[4];
|
/* 0x284 */ CPaneMgr* mMenuIcon[4];
|
||||||
|
|||||||
@@ -488,25 +488,21 @@ public:
|
|||||||
}
|
}
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
u16 getDeathCount() const { return mDeathCount; }
|
u16 getDeathCount() const { return mDeathCount; }
|
||||||
TEXT_SPAN getPlayerName() const { return const_cast<char(&)[17]>(mPlayerName); }
|
|
||||||
#else
|
|
||||||
char* getPlayerName() const { return const_cast<char*>(mPlayerName); }
|
|
||||||
#endif
|
#endif
|
||||||
|
char* getPlayerName() const { return const_cast<char*>(mPlayerName); }
|
||||||
void setPlayerName(const char* i_name) {
|
void setPlayerName(const char* i_name) {
|
||||||
#if AVOID_UB
|
#if AVOID_UB
|
||||||
dusk::SafeStringCopyTruncate(mPlayerName, i_name);
|
strncpy(mPlayerName, i_name, sizeof(mPlayerName) - 1);
|
||||||
|
mPlayerName[sizeof(mPlayerName) - 1] = '\0';
|
||||||
#else
|
#else
|
||||||
strcpy(mPlayerName, i_name);
|
strcpy(mPlayerName, i_name);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#if TARGET_PC
|
|
||||||
TEXT_SPAN getHorseName() const { return const_cast<char(&)[17]>(mHorseName); }
|
|
||||||
#else
|
|
||||||
char* getHorseName() const { return const_cast<char*>(mHorseName); }
|
char* getHorseName() const { return const_cast<char*>(mHorseName); }
|
||||||
#endif
|
|
||||||
void setHorseName(const char* i_name) {
|
void setHorseName(const char* i_name) {
|
||||||
#if AVOID_UB
|
#if AVOID_UB
|
||||||
dusk::SafeStringCopyTruncate(mHorseName, i_name);
|
strncpy(mHorseName, i_name, sizeof(mHorseName) - 1);
|
||||||
|
mHorseName[sizeof(mHorseName) - 1] = '\0';
|
||||||
#else
|
#else
|
||||||
strcpy(mHorseName, i_name);
|
strcpy(mHorseName, i_name);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ public:
|
|||||||
f32 getPositionX() const { return mPositionX; }
|
f32 getPositionX() const { return mPositionX; }
|
||||||
f32 getPositionY() const { return mPositionY; }
|
f32 getPositionY() const { return mPositionY; }
|
||||||
|
|
||||||
void refreshAspectScale(f32 param_0);
|
void refreshAspectScale();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void onUpdateFlag() { mUpdateFlag = true; }
|
void onUpdateFlag() { mUpdateFlag = true; }
|
||||||
|
|||||||
@@ -1225,7 +1225,7 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
static JKRExpHeap* getMemoryBlockHeap(int i_no) { return mMemoryBlock[i_no]; }
|
static JKRExpHeap* getMemoryBlockHeap(int i_no) { return mMemoryBlock[i_no]; }
|
||||||
static TEXT_SPAN getDemoArcName() { return mDemoArcName; }
|
static char* getDemoArcName() { return mDemoArcName; }
|
||||||
static void offNoChangeRoom() { mNoChangeRoom = false; }
|
static void offNoChangeRoom() { mNoChangeRoom = false; }
|
||||||
static void onNoChangeRoom() { mNoChangeRoom = true; }
|
static void onNoChangeRoom() { mNoChangeRoom = true; }
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include <queue>
|
#include <queue>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <unordered_map>
|
#include <unordered_set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "nlohmann/json.hpp"
|
#include "nlohmann/json.hpp"
|
||||||
|
|
||||||
@@ -47,7 +47,6 @@ public:
|
|||||||
// Signals are visible to all achievement checks within the same tick, then cleared.
|
// Signals are visible to all achievement checks within the same tick, then cleared.
|
||||||
void signal(const char* key);
|
void signal(const char* key);
|
||||||
bool hasSignal(const char* key) const;
|
bool hasSignal(const char* key) const;
|
||||||
int signalCount(const char* key) const;
|
|
||||||
|
|
||||||
std::vector<Achievement> getAchievements() const;
|
std::vector<Achievement> getAchievements() const;
|
||||||
|
|
||||||
@@ -63,7 +62,7 @@ private:
|
|||||||
void processEntry(Entry& e);
|
void processEntry(Entry& e);
|
||||||
|
|
||||||
std::vector<Entry> m_entries;
|
std::vector<Entry> m_entries;
|
||||||
std::unordered_map<std::string_view, int> m_signals;
|
std::unordered_set<std::string_view> m_signals;
|
||||||
bool m_loaded = false;
|
bool m_loaded = false;
|
||||||
bool m_dirty = false;
|
bool m_dirty = false;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <unordered_map>
|
|
||||||
|
|
||||||
#include "dusk/config_var.hpp"
|
|
||||||
|
|
||||||
namespace dusk {
|
|
||||||
|
|
||||||
enum class ActionBinds {
|
|
||||||
FIRST_PERSON_CAMERA,
|
|
||||||
CALL_MIDNA,
|
|
||||||
OPEN_DUSKLIGHT_MENU,
|
|
||||||
TURBO_SPEED_BUTTON,
|
|
||||||
COUNT,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ActionBindData {
|
|
||||||
std::array<config::ActionBindConfigVar, 4>* configVars{};
|
|
||||||
std::string actionName{};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ActionBindPressData {
|
|
||||||
bool pressedCurFrame{false};
|
|
||||||
bool pressedPrevFrame{false};
|
|
||||||
};
|
|
||||||
|
|
||||||
using ActionBindsMap = std::unordered_map<ActionBinds, ActionBindData>;
|
|
||||||
|
|
||||||
ActionBindsMap& getActionBinds();
|
|
||||||
|
|
||||||
bool isActionBound(ActionBinds action, u32 port);
|
|
||||||
|
|
||||||
void updateActionBindings();
|
|
||||||
|
|
||||||
bool getActionBindTrig(ActionBinds action, u32 port);
|
|
||||||
|
|
||||||
bool getActionBindHold(ActionBinds action, u32 port);
|
|
||||||
|
|
||||||
bool getActionBindHoldAnyPort(ActionBinds action);
|
|
||||||
|
|
||||||
int getActionBindButton(ActionBinds action, u32 port);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -7,12 +7,7 @@ namespace dusk {
|
|||||||
*
|
*
|
||||||
* This gets used for file paths and such, and cannot be changed!
|
* This gets used for file paths and such, and cannot be changed!
|
||||||
*/
|
*/
|
||||||
constexpr auto AppName = "Dusklight";
|
constexpr auto AppName = "Dusk";
|
||||||
|
|
||||||
/**
|
|
||||||
* Previous AppName to migrate data from.
|
|
||||||
*/
|
|
||||||
constexpr auto LegacyAppName = "Dusk";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief The internal organization name for the game.
|
* \brief The internal organization name for the game.
|
||||||
|
|||||||
@@ -1,19 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cmath>
|
|
||||||
#include <dolphin/types.h>
|
#include <dolphin/types.h>
|
||||||
|
|
||||||
namespace dusk::audio {
|
namespace dusk::audio {
|
||||||
|
|
||||||
// Converts a 0-1 volume to a linear amplitude multiplier.
|
|
||||||
// The curve is -4 dB per 10% step: 100% = 0 dB, 90% = -4 dB, ..., 0% = -inf dB
|
|
||||||
inline f32 MasterVolumeToLinear(f32 v) {
|
|
||||||
if (v <= 0.0f) {
|
|
||||||
return 0.0f;
|
|
||||||
}
|
|
||||||
return std::pow(10.0f, (v - 1.0f) * 2.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the audio system and start playing audio.
|
* Initialize the audio system and start playing audio.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
#include <m_Do/m_Do_MemCardRWmng.h>
|
#include <m_Do/m_Do_MemCardRWmng.h>
|
||||||
#include <m_Do/m_Do_MemCard.h>
|
#include <m_Do/m_Do_MemCard.h>
|
||||||
#include <d/actor/d_a_alink.h>
|
|
||||||
|
|
||||||
void noAutoSave();
|
void noAutoSave();
|
||||||
void triggerAutoSave();
|
void triggerAutoSave();
|
||||||
@@ -14,6 +13,5 @@ void enterAutoSave();
|
|||||||
void autoSaving();
|
void autoSaving();
|
||||||
void waitingForWrite();
|
void waitingForWrite();
|
||||||
void endAutoSave();
|
void endAutoSave();
|
||||||
void toggleAutoSave(bool enabled);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
#ifndef DUSK_CONFIG_HPP
|
#ifndef DUSK_CONFIG_HPP
|
||||||
#define DUSK_CONFIG_HPP
|
#define DUSK_CONFIG_HPP
|
||||||
|
|
||||||
#include <functional>
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include "nlohmann/json.hpp"
|
#include "nlohmann/json.hpp"
|
||||||
#include "config_var.hpp"
|
#include "config_var.hpp"
|
||||||
@@ -112,18 +111,6 @@ void Save();
|
|||||||
*/
|
*/
|
||||||
ConfigVarBase* GetConfigVar(std::string_view name);
|
ConfigVarBase* GetConfigVar(std::string_view name);
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Resets all custom action bindings for a specific port to nothing
|
|
||||||
*
|
|
||||||
* @param port The port to be cleared of action bindings
|
|
||||||
*/
|
|
||||||
void ClearAllActionBindings(int port);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Call a function on every registered CVar.
|
|
||||||
*/
|
|
||||||
void EnumerateRegistered(std::function<void(ConfigVarBase&)> callback);
|
|
||||||
|
|
||||||
template <ConfigValue T>
|
template <ConfigValue T>
|
||||||
const ConfigImplBase* GetConfigImpl() {
|
const ConfigImplBase* GetConfigImpl() {
|
||||||
static ConfigImpl<T> config;
|
static ConfigImpl<T> config;
|
||||||
|
|||||||
@@ -48,13 +48,6 @@ enum class ConfigVarLayer : u8 {
|
|||||||
* Will not get saved to config.
|
* Will not get saved to config.
|
||||||
*/
|
*/
|
||||||
Override,
|
Override,
|
||||||
|
|
||||||
/**
|
|
||||||
* The CVar is temporarily overridden by speedrun mode.
|
|
||||||
* Will not get saved to config. Cleared when speedrun mode is disabled.
|
|
||||||
* Lower priority than Override, so launch args still win.
|
|
||||||
*/
|
|
||||||
Speedrun,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class ConfigImplBase;
|
class ConfigImplBase;
|
||||||
@@ -120,12 +113,6 @@ public:
|
|||||||
* This is necessary to make it legal to access.
|
* This is necessary to make it legal to access.
|
||||||
*/
|
*/
|
||||||
void markRegistered();
|
void markRegistered();
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear a speedrun-mode override if one is active on this CVar.
|
|
||||||
* Safe to call on any CVar, no-op if not at the Speedrun layer.
|
|
||||||
*/
|
|
||||||
virtual void clearSpeedrunOverride() {}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@@ -175,7 +162,6 @@ class ConfigVar : public ConfigVarBase {
|
|||||||
T defaultValue;
|
T defaultValue;
|
||||||
T value;
|
T value;
|
||||||
T overrideValue;
|
T overrideValue;
|
||||||
ConfigVarLayer priorLayer = ConfigVarLayer::Default;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
@@ -203,7 +189,6 @@ public:
|
|||||||
case ConfigVarLayer::Value:
|
case ConfigVarLayer::Value:
|
||||||
return value;
|
return value;
|
||||||
case ConfigVarLayer::Override:
|
case ConfigVarLayer::Override:
|
||||||
case ConfigVarLayer::Speedrun:
|
|
||||||
return overrideValue;
|
return overrideValue;
|
||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
@@ -254,54 +239,8 @@ public:
|
|||||||
overrideValue = std::move(newValue);
|
overrideValue = std::move(newValue);
|
||||||
layer = ConfigVarLayer::Override;
|
layer = ConfigVarLayer::Override;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Give a CVar a speedrun-mode override value.
|
|
||||||
*
|
|
||||||
* Lower priority than a launch-arg override. Cleared when speedrun mode is disabled.
|
|
||||||
* The overridden value will not get saved to config.
|
|
||||||
*
|
|
||||||
* @param newValue The new value the CVar will get.
|
|
||||||
*/
|
|
||||||
void setSpeedrunValue(T newValue) {
|
|
||||||
checkRegistered();
|
|
||||||
if (layer != ConfigVarLayer::Override) {
|
|
||||||
priorLayer = layer;
|
|
||||||
overrideValue = std::move(newValue);
|
|
||||||
layer = ConfigVarLayer::Speedrun;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void clearOverride() {
|
|
||||||
checkRegistered();
|
|
||||||
if (layer == ConfigVarLayer::Override) {
|
|
||||||
overrideValue = {};
|
|
||||||
layer = ConfigVarLayer::Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void clearSpeedrunOverride() override {
|
|
||||||
checkRegistered();
|
|
||||||
if (layer == ConfigVarLayer::Speedrun) {
|
|
||||||
overrideValue = {};
|
|
||||||
layer = priorLayer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Get the user-persisted value, ignoring any temporary overrides.
|
|
||||||
*
|
|
||||||
* Used by Save() to write the correct value even when a speedrun override is active.
|
|
||||||
*/
|
|
||||||
[[nodiscard]] constexpr const T& getValueForSave() const noexcept {
|
|
||||||
checkRegistered();
|
|
||||||
const ConfigVarLayer effectiveLayer = (layer == ConfigVarLayer::Speedrun) ? priorLayer : layer;
|
|
||||||
return effectiveLayer == ConfigVarLayer::Default ? defaultValue : value;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
using ActionBindConfigVar = ConfigVar<int>;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // DUSK_CONFIG_VAR_HPP
|
#endif // DUSK_CONFIG_VAR_HPP
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
namespace dusk::crash_handler {
|
|
||||||
|
|
||||||
void install();
|
|
||||||
|
|
||||||
} // namespace dusk::crash_handler
|
|
||||||
@@ -1,17 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace dusk::crash_reporting {
|
namespace dusk {
|
||||||
|
|
||||||
enum class Consent {
|
void InitializeCrashReporting();
|
||||||
Unavailable,
|
void ShutdownCrashReporting();
|
||||||
Unknown,
|
|
||||||
Given,
|
|
||||||
Revoked,
|
|
||||||
};
|
|
||||||
|
|
||||||
void initialize();
|
} // namespace dusk
|
||||||
void shutdown();
|
|
||||||
Consent get_consent();
|
|
||||||
void set_consent(bool enabled);
|
|
||||||
|
|
||||||
} // namespace dusk::crash_reporting
|
|
||||||
|
|||||||
@@ -227,28 +227,6 @@ struct BE<Mtx> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef f32 Mtx23[2][3];
|
|
||||||
template <>
|
|
||||||
struct BE<Mtx23> {
|
|
||||||
BE<f32> contents[2][3];
|
|
||||||
|
|
||||||
auto& operator[](int x) {
|
|
||||||
return contents[x];
|
|
||||||
}
|
|
||||||
|
|
||||||
auto& operator[](int x) const {
|
|
||||||
return contents[x];
|
|
||||||
}
|
|
||||||
|
|
||||||
void to_host(Mtx23& mtx) const {
|
|
||||||
for (int i = 0; i < 2; i++) {
|
|
||||||
for (int j = 0; j < 3; j++) {
|
|
||||||
mtx[i][j] = contents[i][j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void be_swap(T& val) {
|
void be_swap(T& val) {
|
||||||
val = BE<T>::swap(val);
|
val = BE<T>::swap(val);
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "settings.h"
|
|
||||||
|
|
||||||
class camera_process_class;
|
class camera_process_class;
|
||||||
class view_class;
|
class view_class;
|
||||||
@@ -18,8 +17,7 @@ void ensure_initialized();
|
|||||||
void begin_record();
|
void begin_record();
|
||||||
void end_record();
|
void end_record();
|
||||||
void begin_sim_tick();
|
void begin_sim_tick();
|
||||||
uint64_t sim_tick_seq();
|
void begin_frame(bool enabled, bool is_sim_frame, float step);
|
||||||
void begin_frame(FrameInterpMode mode, bool is_sim_frame, float step);
|
|
||||||
void interpolate();
|
void interpolate();
|
||||||
float get_interpolation_step();
|
float get_interpolation_step();
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ constexpr const char* SHOW_DEBUG_OVERLAY = "F3";
|
|||||||
constexpr const char* SHOW_HEAP_VIEWER = "F4";
|
constexpr const char* SHOW_HEAP_VIEWER = "F4";
|
||||||
constexpr const char* SHOW_PLAYER_INFO = "F5";
|
constexpr const char* SHOW_PLAYER_INFO = "F5";
|
||||||
constexpr const char* SHOW_SAVE_EDITOR = "F6";
|
constexpr const char* SHOW_SAVE_EDITOR = "F6";
|
||||||
|
constexpr const char* SHOW_MAP_LOADER = "F7";
|
||||||
constexpr const char* SHOW_STATE_SHARE = "F8";
|
constexpr const char* SHOW_STATE_SHARE = "F8";
|
||||||
constexpr const char* SHOW_DEBUG_CAMERA = "F9";
|
constexpr const char* SHOW_DEBUG_CAMERA = "F9";
|
||||||
constexpr const char* SHOW_AUDIO_DEBUG = "F10";
|
constexpr const char* SHOW_AUDIO_DEBUG = "F10";
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
#ifndef DUSK_IO_HPP
|
#ifndef DUSK_IO_HPP
|
||||||
#define DUSK_IO_HPP
|
#define DUSK_IO_HPP
|
||||||
|
|
||||||
#include <filesystem>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
// I can't believe it's 2026 and neither SDL (no error codes) nor
|
// I can't believe it's 2026 and neither SDL (no error codes) nor
|
||||||
// C++ (no error codes) have a file system API functional enough for me to use.
|
// C++ (no error codes) have a file system API functional enough for me to use.
|
||||||
// Here you go, this one's inspired by C#. I only wrote the functions I need.
|
// Here you go, this one's inspired by C#. I only wrote the functions I need.
|
||||||
|
|
||||||
|
|
||||||
namespace dusk::io {
|
namespace dusk::io {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -82,7 +83,9 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Get direct access to the underlying FILE* handle.
|
* Get direct access to the underlying FILE* handle.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] void* GetFileHandle() const noexcept { return file; }
|
[[nodiscard]] void* GetFileHandle() const noexcept {
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write data to the file.
|
* Write data to the file.
|
||||||
@@ -92,14 +95,7 @@ public:
|
|||||||
FILE* ToInner();
|
FILE* ToInner();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts a std::filesystem::path to a std::string, UTF-8, without exploding on Windows.
|
|
||||||
*/
|
|
||||||
inline std::string fs_path_to_string(const std::filesystem::path& path) {
|
|
||||||
const auto u8str = path.u8string();
|
|
||||||
return {reinterpret_cast<const char*>(u8str.c_str())};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace dusk::io
|
|
||||||
|
|
||||||
#endif // DUSK_IO_HPP
|
#endif // DUSK_IO_HPP
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ namespace dusk {
|
|||||||
void InitializeFileLogging(const std::filesystem::path& configDir, AuroraLogLevel logLevel);
|
void InitializeFileLogging(const std::filesystem::path& configDir, AuroraLogLevel logLevel);
|
||||||
void ShutdownFileLogging();
|
void ShutdownFileLogging();
|
||||||
const char* GetLogFilePath();
|
const char* GetLogFilePath();
|
||||||
int GetLogFileDescriptor();
|
|
||||||
void SendToStubLog(AuroraLogLevel level, const char* module, const char* message);
|
void SendToStubLog(AuroraLogLevel level, const char* module, const char* message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,11 +19,7 @@ extern bool StubLogEnabled;
|
|||||||
|
|
||||||
extern aurora::Module DuskLog;
|
extern aurora::Module DuskLog;
|
||||||
|
|
||||||
#ifndef NDEBUG
|
|
||||||
#define STUB_LOG() DuskLog.debug("{} is a stub", __FUNCTION__)
|
#define STUB_LOG() DuskLog.debug("{} is a stub", __FUNCTION__)
|
||||||
#else
|
|
||||||
#define STUB_LOG()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
#define STUB_RET(...) \
|
#define STUB_RET(...) \
|
||||||
|
|||||||
@@ -1,26 +1,36 @@
|
|||||||
#ifndef DUSK_MAIN_H
|
#ifndef DUSK_MAIN_H
|
||||||
#define DUSK_MAIN_H
|
#define DUSK_MAIN_H
|
||||||
|
|
||||||
#include <filesystem>
|
#if defined(__APPLE__)
|
||||||
|
#include <TargetConditionals.h>
|
||||||
namespace dusk {
|
|
||||||
|
|
||||||
extern bool IsRunning;
|
|
||||||
extern bool IsShuttingDown;
|
|
||||||
extern bool IsGameLaunched;
|
|
||||||
extern bool RestartRequested;
|
|
||||||
extern std::filesystem::path ConfigPath;
|
|
||||||
extern std::filesystem::path CachePath;
|
|
||||||
|
|
||||||
#if defined(__ANDROID__) || (defined(TARGET_OS_IOS) && TARGET_OS_IOS) || \
|
|
||||||
(defined(TARGET_OS_TV) && TARGET_OS_TV)
|
|
||||||
inline constexpr bool SupportsProcessRestart = false;
|
|
||||||
#else
|
|
||||||
inline constexpr bool SupportsProcessRestart = true;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void RequestRestart() noexcept;
|
#include <filesystem>
|
||||||
|
|
||||||
} // namespace dusk
|
#if defined(_WIN32) || \
|
||||||
|
(defined(__APPLE__) && !TARGET_OS_IOS && !TARGET_OS_TV && !TARGET_OS_MACCATALYST) || \
|
||||||
|
(defined(__linux__) && !defined(__ANDROID__))
|
||||||
|
#define DUSK_CAN_OPEN_DATA_FOLDER 1
|
||||||
|
#else
|
||||||
|
#define DUSK_CAN_OPEN_DATA_FOLDER 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace dusk {
|
||||||
|
extern bool IsRunning;
|
||||||
|
extern bool IsShuttingDown;
|
||||||
|
extern bool IsGameLaunched;
|
||||||
|
extern bool RestartRequested;
|
||||||
|
extern std::filesystem::path ConfigPath;
|
||||||
|
|
||||||
|
#if defined(__ANDROID__) || (defined(TARGET_OS_IOS) && TARGET_OS_IOS) || \
|
||||||
|
(defined(TARGET_OS_TV) && TARGET_OS_TV)
|
||||||
|
inline constexpr bool SupportsProcessRestart = false;
|
||||||
|
#else
|
||||||
|
inline constexpr bool SupportsProcessRestart = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void RequestRestart() noexcept;
|
||||||
|
bool OpenDataFolder();
|
||||||
|
}
|
||||||
|
|
||||||
#endif // DUSK_MAIN_H
|
#endif // DUSK_MAIN_H
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
#ifndef DUSK_CONFIG_H
|
#ifndef DUSK_CONFIG_H
|
||||||
#define DUSK_CONFIG_H
|
#define DUSK_CONFIG_H
|
||||||
|
|
||||||
#include <array>
|
|
||||||
|
|
||||||
#include "dusk/config_var.hpp"
|
#include "dusk/config_var.hpp"
|
||||||
|
|
||||||
namespace dusk {
|
namespace dusk {
|
||||||
@@ -15,17 +13,6 @@ enum class BloomMode : int {
|
|||||||
Dusk = 2,
|
Dusk = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class DepthOfFieldMode : int {
|
|
||||||
Off = 0,
|
|
||||||
Classic = 1,
|
|
||||||
Dusk = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class Resampler : int {
|
|
||||||
Bilinear = 0,
|
|
||||||
Area = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class GameLanguage : u8 {
|
enum class GameLanguage : u8 {
|
||||||
English = OS_LANGUAGE_ENGLISH,
|
English = OS_LANGUAGE_ENGLISH,
|
||||||
German = OS_LANGUAGE_GERMAN,
|
German = OS_LANGUAGE_GERMAN,
|
||||||
@@ -45,18 +32,6 @@ enum class GyroMode : u8 {
|
|||||||
Mouse = 1,
|
Mouse = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class FrameInterpMode : u8 {
|
|
||||||
Off = 0,
|
|
||||||
Capped = 1,
|
|
||||||
Unlimited = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class MenuScaling : u8 {
|
|
||||||
GameCube = 0,
|
|
||||||
Wii = 1,
|
|
||||||
Dusklight = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace config {
|
namespace config {
|
||||||
template <>
|
template <>
|
||||||
struct ConfigEnumRange<BloomMode> {
|
struct ConfigEnumRange<BloomMode> {
|
||||||
@@ -64,18 +39,6 @@ struct ConfigEnumRange<BloomMode> {
|
|||||||
static constexpr auto max = BloomMode::Dusk;
|
static constexpr auto max = BloomMode::Dusk;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
|
||||||
struct ConfigEnumRange<DepthOfFieldMode> {
|
|
||||||
static constexpr auto min = DepthOfFieldMode::Off;
|
|
||||||
static constexpr auto max = DepthOfFieldMode::Dusk;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct ConfigEnumRange<Resampler> {
|
|
||||||
static constexpr auto min = Resampler::Bilinear;
|
|
||||||
static constexpr auto max = Resampler::Area;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct ConfigEnumRange<GameLanguage> {
|
struct ConfigEnumRange<GameLanguage> {
|
||||||
static constexpr auto min = GameLanguage::English;
|
static constexpr auto min = GameLanguage::English;
|
||||||
@@ -93,19 +56,7 @@ struct ConfigEnumRange<GyroMode> {
|
|||||||
static constexpr auto min = GyroMode::Sensor;
|
static constexpr auto min = GyroMode::Sensor;
|
||||||
static constexpr auto max = GyroMode::Mouse;
|
static constexpr auto max = GyroMode::Mouse;
|
||||||
};
|
};
|
||||||
|
}
|
||||||
template <>
|
|
||||||
struct ConfigEnumRange<FrameInterpMode> {
|
|
||||||
static constexpr auto min = FrameInterpMode::Off;
|
|
||||||
static constexpr auto max = FrameInterpMode::Unlimited;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct ConfigEnumRange<MenuScaling> {
|
|
||||||
static constexpr auto min = MenuScaling::GameCube;
|
|
||||||
static constexpr auto max = MenuScaling::Dusklight;
|
|
||||||
};
|
|
||||||
} // namespace config
|
|
||||||
|
|
||||||
// Persistent user settings
|
// Persistent user settings
|
||||||
|
|
||||||
@@ -119,7 +70,6 @@ struct UserSettings {
|
|||||||
ConfigVar<bool> lockAspectRatio;
|
ConfigVar<bool> lockAspectRatio;
|
||||||
ConfigVar<bool> enableFpsOverlay;
|
ConfigVar<bool> enableFpsOverlay;
|
||||||
ConfigVar<int> fpsOverlayCorner;
|
ConfigVar<int> fpsOverlayCorner;
|
||||||
ConfigVar<int> maxFrameRate;
|
|
||||||
} video;
|
} video;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@@ -157,7 +107,6 @@ struct UserSettings {
|
|||||||
ConfigVar<bool> instantText;
|
ConfigVar<bool> instantText;
|
||||||
ConfigVar<bool> sunsSong;
|
ConfigVar<bool> sunsSong;
|
||||||
ConfigVar<bool> autoSave;
|
ConfigVar<bool> autoSave;
|
||||||
ConfigVar<bool> enhancedMapMenus;
|
|
||||||
|
|
||||||
// Preferences
|
// Preferences
|
||||||
ConfigVar<bool> enableMirrorMode;
|
ConfigVar<bool> enableMirrorMode;
|
||||||
@@ -166,21 +115,16 @@ struct UserSettings {
|
|||||||
ConfigVar<bool> enableLinkDollRotation;
|
ConfigVar<bool> enableLinkDollRotation;
|
||||||
ConfigVar<bool> enableAchievementToasts;
|
ConfigVar<bool> enableAchievementToasts;
|
||||||
ConfigVar<bool> enableControllerToasts;
|
ConfigVar<bool> enableControllerToasts;
|
||||||
ConfigVar<bool> enableDiscordPresence;
|
|
||||||
ConfigVar<MenuScaling> menuScalingMode;
|
|
||||||
|
|
||||||
// Graphics
|
// Graphics
|
||||||
ConfigVar<BloomMode> bloomMode;
|
ConfigVar<BloomMode> bloomMode;
|
||||||
ConfigVar<float> bloomMultiplier;
|
ConfigVar<float> bloomMultiplier;
|
||||||
ConfigVar<DepthOfFieldMode> depthOfFieldMode;
|
|
||||||
ConfigVar<bool> disableWaterRefraction;
|
ConfigVar<bool> disableWaterRefraction;
|
||||||
ConfigVar<bool> enableTextureReplacements;
|
ConfigVar<bool> enableFrameInterpolation;
|
||||||
ConfigVar<FrameInterpMode> enableFrameInterpolation;
|
|
||||||
ConfigVar<int> internalResolutionScale;
|
ConfigVar<int> internalResolutionScale;
|
||||||
ConfigVar<int> shadowResolutionMultiplier;
|
ConfigVar<int> shadowResolutionMultiplier;
|
||||||
ConfigVar<Resampler> resampler;
|
ConfigVar<bool> enableDepthOfField;
|
||||||
ConfigVar<bool> enableMapBackground;
|
ConfigVar<bool> enableMapBackground;
|
||||||
ConfigVar<bool> disableCutscenePillarboxing;
|
|
||||||
|
|
||||||
// Audio
|
// Audio
|
||||||
ConfigVar<bool> noLowHpSound;
|
ConfigVar<bool> noLowHpSound;
|
||||||
@@ -200,10 +144,6 @@ struct UserSettings {
|
|||||||
ConfigVar<bool> freeCamera;
|
ConfigVar<bool> freeCamera;
|
||||||
ConfigVar<bool> invertCameraXAxis;
|
ConfigVar<bool> invertCameraXAxis;
|
||||||
ConfigVar<bool> invertCameraYAxis;
|
ConfigVar<bool> invertCameraYAxis;
|
||||||
ConfigVar<bool> invertFirstPersonXAxis;
|
|
||||||
ConfigVar<bool> invertFirstPersonYAxis;
|
|
||||||
ConfigVar<bool> invertAirSwimX;
|
|
||||||
ConfigVar<bool> invertAirSwimY;
|
|
||||||
ConfigVar<float> freeCameraSensitivity;
|
ConfigVar<float> freeCameraSensitivity;
|
||||||
ConfigVar<bool> debugFlyCam;
|
ConfigVar<bool> debugFlyCam;
|
||||||
ConfigVar<bool> debugFlyCamLockEvents;
|
ConfigVar<bool> debugFlyCamLockEvents;
|
||||||
@@ -212,7 +152,6 @@ struct UserSettings {
|
|||||||
// Cheats
|
// Cheats
|
||||||
ConfigVar<bool> infiniteHearts;
|
ConfigVar<bool> infiniteHearts;
|
||||||
ConfigVar<bool> infiniteArrows;
|
ConfigVar<bool> infiniteArrows;
|
||||||
ConfigVar<bool> infiniteSeeds;
|
|
||||||
ConfigVar<bool> infiniteBombs;
|
ConfigVar<bool> infiniteBombs;
|
||||||
ConfigVar<bool> infiniteOil;
|
ConfigVar<bool> infiniteOil;
|
||||||
ConfigVar<bool> infiniteOxygen;
|
ConfigVar<bool> infiniteOxygen;
|
||||||
@@ -223,26 +162,19 @@ struct UserSettings {
|
|||||||
ConfigVar<bool> alwaysGreatspin;
|
ConfigVar<bool> alwaysGreatspin;
|
||||||
ConfigVar<bool> enableFastIronBoots;
|
ConfigVar<bool> enableFastIronBoots;
|
||||||
ConfigVar<bool> canTransformAnywhere;
|
ConfigVar<bool> canTransformAnywhere;
|
||||||
ConfigVar<bool> fastRoll;
|
|
||||||
ConfigVar<bool> fastSpinner;
|
ConfigVar<bool> fastSpinner;
|
||||||
ConfigVar<bool> freeMagicArmor;
|
ConfigVar<bool> freeMagicArmor;
|
||||||
ConfigVar<bool> invincibleEnemies;
|
|
||||||
|
|
||||||
// Technical
|
// Technical
|
||||||
ConfigVar<bool> restoreWiiGlitches;
|
ConfigVar<bool> restoreWiiGlitches;
|
||||||
|
|
||||||
// Controls
|
// Controls
|
||||||
ConfigVar<bool> enableTurboKeybind;
|
ConfigVar<bool> enableTurboKeybind;
|
||||||
ConfigVar<bool> enableResetKeybind;
|
|
||||||
|
|
||||||
// Tools
|
// Tools
|
||||||
ConfigVar<bool> speedrunMode;
|
ConfigVar<bool> speedrunMode;
|
||||||
ConfigVar<bool> liveSplitEnabled;
|
ConfigVar<bool> liveSplitEnabled;
|
||||||
ConfigVar<bool> showSpeedrunRTATimer;
|
|
||||||
ConfigVar<bool> recordingMode;
|
ConfigVar<bool> recordingMode;
|
||||||
ConfigVar<bool> removeQuestMapMarkers;
|
|
||||||
ConfigVar<bool> showInputViewer;
|
|
||||||
ConfigVar<bool> showInputViewerGyro;
|
|
||||||
} game;
|
} game;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@@ -252,18 +184,11 @@ struct UserSettings {
|
|||||||
ConfigVar<bool> skipPreLaunchUI;
|
ConfigVar<bool> skipPreLaunchUI;
|
||||||
ConfigVar<bool> showPipelineCompilation;
|
ConfigVar<bool> showPipelineCompilation;
|
||||||
ConfigVar<bool> wasPresetChosen;
|
ConfigVar<bool> wasPresetChosen;
|
||||||
|
ConfigVar<bool> enableCrashReporting;
|
||||||
ConfigVar<bool> checkForUpdates;
|
ConfigVar<bool> checkForUpdates;
|
||||||
ConfigVar<int> cardFileType;
|
ConfigVar<int> cardFileType;
|
||||||
ConfigVar<bool> enableAdvancedSettings;
|
ConfigVar<bool> enableAdvancedSettings;
|
||||||
} backend;
|
} backend;
|
||||||
|
|
||||||
// Arrays of size 4 for 4 ports
|
|
||||||
struct {
|
|
||||||
std::array<ActionBindConfigVar, 4> firstPersonCamera;
|
|
||||||
std::array<ActionBindConfigVar, 4> callMidna;
|
|
||||||
std::array<ActionBindConfigVar, 4> openDusklightMenu;
|
|
||||||
std::array<ActionBindConfigVar, 4> turboSpeedButton;
|
|
||||||
} actionBindings;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
UserSettings& getSettings();
|
UserSettings& getSettings();
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <aurora/aurora.h>
|
|
||||||
|
|
||||||
namespace dusk {
|
|
||||||
|
|
||||||
struct SpeedrunInfo {
|
|
||||||
void startRun() {
|
|
||||||
m_isRunStarted = true;
|
|
||||||
m_startTimestamp = OSGetTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
void stopRun() {
|
|
||||||
m_isRunStarted = false;
|
|
||||||
m_endTimestamp = OSGetTime() - m_startTimestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void reset() {
|
|
||||||
m_isRunStarted = false;
|
|
||||||
m_startTimestamp = 0;
|
|
||||||
m_endTimestamp = 0;
|
|
||||||
m_isPauseIGT = false;
|
|
||||||
m_loadStartTimestamp = 0;
|
|
||||||
m_totalLoadTime = 0;
|
|
||||||
m_igtTimer = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool m_isRunStarted = false;
|
|
||||||
OSTime m_startTimestamp = 0;
|
|
||||||
OSTime m_endTimestamp = 0;
|
|
||||||
|
|
||||||
bool m_isPauseIGT = false;
|
|
||||||
OSTime m_loadStartTimestamp = 0;
|
|
||||||
OSTime m_totalLoadTime = 0;
|
|
||||||
OSTime m_igtTimer = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern SpeedrunInfo m_speedrunInfo;
|
|
||||||
|
|
||||||
void resetForSpeedrunMode();
|
|
||||||
|
|
||||||
} // namespace dusk
|
|
||||||
@@ -1,55 +1,22 @@
|
|||||||
#ifndef DUSK_STRING_HPP
|
#ifndef DUSK_STRING_HPP
|
||||||
#define DUSK_STRING_HPP
|
#define DUSK_STRING_HPP
|
||||||
#include <cstdarg>
|
|
||||||
|
#include "global.h"
|
||||||
|
#include <cstring>
|
||||||
|
#include <dolphin/os.h>
|
||||||
|
|
||||||
namespace dusk {
|
namespace dusk {
|
||||||
|
|
||||||
struct TextSpan {
|
inline void strncpyProxy(char* dst, const char* src, size_t count) {
|
||||||
char* buffer;
|
#if _MSC_VER
|
||||||
size_t size;
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable : 4996)
|
||||||
constexpr operator char*() const {
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr TextSpan(char* buffer, size_t size) : buffer(buffer), size(size) { }
|
|
||||||
|
|
||||||
template<size_t BufSize>
|
|
||||||
constexpr TextSpan(char (&buffer)[BufSize]) : buffer(buffer), size(BufSize) {
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr TextSpan() : buffer(nullptr), size(0) { }
|
|
||||||
|
|
||||||
constexpr TextSpan operator++(int) {
|
|
||||||
const auto prev = *this;
|
|
||||||
|
|
||||||
if (size > 0) [[likely]] {
|
|
||||||
size--;
|
|
||||||
}
|
|
||||||
buffer++;
|
|
||||||
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr char& operator*() const {
|
|
||||||
if (size == 0) [[unlikely]] {
|
|
||||||
CrashSpawnEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
return *buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
static void CrashSpawnEmpty();
|
|
||||||
};
|
|
||||||
|
|
||||||
#if TARGET_PC
|
|
||||||
#define TEXT_SPAN dusk::TextSpan
|
|
||||||
#else
|
|
||||||
#define TEXT_SPAN char*
|
|
||||||
#endif
|
#endif
|
||||||
|
strncpy(dst, src, count);
|
||||||
void SafeStringCopyTruncate(char* buffer, size_t bufSize, const char* src);
|
#if _MSC_VER
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copy a string to a fixed-size array.
|
* Copy a string to a fixed-size array.
|
||||||
@@ -58,28 +25,13 @@ void SafeStringCopyTruncate(char* buffer, size_t bufSize, const char* src);
|
|||||||
template <size_t BufSize>
|
template <size_t BufSize>
|
||||||
void SafeStringCopyTruncate(char (&buffer)[BufSize], const char* src) {
|
void SafeStringCopyTruncate(char (&buffer)[BufSize], const char* src) {
|
||||||
static_assert(BufSize > 0, "Target buffer cannot be size zero");
|
static_assert(BufSize > 0, "Target buffer cannot be size zero");
|
||||||
SafeStringCopyTruncate(buffer, BufSize, src);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SafeStringCopy(char* buffer, size_t bufSize, const char* src);
|
if (buffer == src) {
|
||||||
void SafeStringCat(char* buffer, size_t bufSize, const char* src);
|
CRASH("Cannot copy string to same buffer");
|
||||||
int SafeStringVPrintf(char* buffer, size_t bufSize, const char* src, std::va_list args);
|
}
|
||||||
|
|
||||||
inline void SafeStringCopy(TextSpan dst, const char* src) {
|
strncpyProxy(buffer, src, BufSize);
|
||||||
SafeStringCopy(dst.buffer, dst.size, src);
|
buffer[BufSize - 1] = 0;
|
||||||
}
|
|
||||||
|
|
||||||
inline void SafeStringCat(TextSpan dst, const char* src) {
|
|
||||||
SafeStringCat(dst.buffer, dst.size, src);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int SafeStringPrintf(TextSpan dst, const char* format, ...) {
|
|
||||||
std::va_list args;
|
|
||||||
va_start(args, format);
|
|
||||||
const auto ret = SafeStringVPrintf(dst.buffer, dst.size, format, args);
|
|
||||||
va_end(args);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -89,40 +41,18 @@ inline int SafeStringPrintf(TextSpan dst, const char* format, ...) {
|
|||||||
template <size_t BufSize>
|
template <size_t BufSize>
|
||||||
void SafeStringCopy(char (&buffer)[BufSize], const char* src) {
|
void SafeStringCopy(char (&buffer)[BufSize], const char* src) {
|
||||||
static_assert(BufSize > 0, "Target buffer cannot be size zero");
|
static_assert(BufSize > 0, "Target buffer cannot be size zero");
|
||||||
SafeStringCopy(buffer, BufSize, src);
|
if (buffer == src) {
|
||||||
|
CRASH("Cannot copy string to same buffer");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen(src) > BufSize - 1) {
|
||||||
|
CRASH("Destination buffer too small!");
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpyProxy(buffer, src, BufSize);
|
||||||
|
buffer[BufSize - 1] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <size_t BufSize>
|
|
||||||
void SafeStringCat(char (&buffer)[BufSize], const char* src) {
|
|
||||||
static_assert(BufSize > 0, "Target buffer cannot be size zero");
|
|
||||||
SafeStringCat(buffer, BufSize, src);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <size_t BufSize>
|
|
||||||
int SafeStringPrintf(char (&buffer)[BufSize], const char* format, ...) {
|
|
||||||
static_assert(BufSize > 0, "Target buffer cannot be size zero");
|
|
||||||
|
|
||||||
std::va_list args;
|
|
||||||
va_start(args, format);
|
|
||||||
const auto ret = SafeStringVPrintf(buffer, BufSize, format, args);
|
|
||||||
va_end(args);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if TARGET_PC
|
|
||||||
#define SAFE_STRCPY dusk::SafeStringCopy
|
|
||||||
#define SAFE_STRCAT dusk::SafeStringCat
|
|
||||||
#define SAFE_SPRINTF dusk::SafeStringPrintf
|
|
||||||
#define SAFE_STRCPY_BOUNDED dusk::SafeStringCopy
|
|
||||||
#define SAFE_STRCAT_BOUNDED dusk::SafeStringCat
|
|
||||||
#else
|
|
||||||
#define SAFE_STRCPY strcpy
|
|
||||||
#define SAFE_STRCAT strcat
|
|
||||||
#define SAFE_SPRINTF sprintf
|
|
||||||
#define SAFE_STRCPY_BOUNDED strcpy
|
|
||||||
#define SAFE_STRCPY_BOUNDED strcat
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // DUSK_STRING_HPP
|
#endif // DUSK_STRING_HPP
|
||||||
|
|||||||
@@ -17,24 +17,16 @@
|
|||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
#include <intrin.h>
|
#include <intrin.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef __APPLE__
|
|
||||||
#include <mach/mach_time.h>
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
|
||||||
#include <immintrin.h>
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class Limiter {
|
class Limiter {
|
||||||
public:
|
public:
|
||||||
using duration_t = Uint64;
|
using duration_t = Uint64;
|
||||||
|
|
||||||
void Reset() {
|
void Reset() { m_oldTime = SDL_GetTicksNS(); }
|
||||||
m_oldTime = SDL_GetTicksNS();
|
|
||||||
}
|
|
||||||
|
|
||||||
duration_t Sleep(duration_t targetFrameTime) {
|
void Sleep(duration_t targetFrameTime) {
|
||||||
if (targetFrameTime == 0) {
|
if (targetFrameTime == 0) {
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Uint64 start = SDL_GetTicksNS();
|
const Uint64 start = SDL_GetTicksNS();
|
||||||
@@ -49,8 +41,6 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reset();
|
Reset();
|
||||||
|
|
||||||
return adjustedSleepTime;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
duration_t SleepTime(duration_t targetFrameTime) {
|
duration_t SleepTime(duration_t targetFrameTime) {
|
||||||
@@ -84,6 +74,7 @@ private:
|
|||||||
if (!initialized || numSleeps++ % 1000 == 0) {
|
if (!initialized || numSleeps++ % 1000 == 0) {
|
||||||
LARGE_INTEGER freq;
|
LARGE_INTEGER freq;
|
||||||
if (QueryPerformanceFrequency(&freq) == 0) {
|
if (QueryPerformanceFrequency(&freq) == 0) {
|
||||||
|
DuskLog.warn("QueryPerformanceFrequency failed: {}", GetLastError());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
countPerNs = static_cast<double>(freq.QuadPart) / 1e9;
|
countPerNs = static_cast<double>(freq.QuadPart) / 1e9;
|
||||||
@@ -107,33 +98,6 @@ private:
|
|||||||
#endif
|
#endif
|
||||||
} while (current.QuadPart - start.QuadPart < ticksToWait);
|
} while (current.QuadPart - start.QuadPart < ticksToWait);
|
||||||
}
|
}
|
||||||
#elif defined (__APPLE__)
|
|
||||||
void NanoSleep(const duration_t duration) {
|
|
||||||
// Hybrid approach using Apple Mach
|
|
||||||
uint64_t start_mach = mach_absolute_time();
|
|
||||||
|
|
||||||
mach_timebase_info_data_t timebase_info;
|
|
||||||
mach_timebase_info(&timebase_info);
|
|
||||||
|
|
||||||
uint64_t total_mach_ticks = (duration * timebase_info.denom) / timebase_info.numer;
|
|
||||||
uint64_t target_mach = start_mach + total_mach_ticks;
|
|
||||||
|
|
||||||
uint64_t buffer_ns = 2'000'000ULL;
|
|
||||||
uint64_t buffer_mach_ticks = (buffer_ns * timebase_info.denom) / timebase_info.numer;
|
|
||||||
|
|
||||||
if (total_mach_ticks > buffer_mach_ticks) {
|
|
||||||
uint64_t sleep_until_mach = target_mach - buffer_mach_ticks;
|
|
||||||
mach_wait_until(sleep_until_mach);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (mach_absolute_time() < target_mach) {
|
|
||||||
#if defined(__aarch64__) || defined(__arm__)
|
|
||||||
asm volatile("yield" ::: "memory"); // Hardware hint, not a scheduler hint.
|
|
||||||
#else
|
|
||||||
_mm_pause();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
void NanoSleep(const duration_t duration) { SDL_DelayPrecise(duration); }
|
void NanoSleep(const duration_t duration) { SDL_DelayPrecise(duration); }
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ struct fopAcM_search_prm {
|
|||||||
struct fOpAcm_HIO_entry_c : public mDoHIO_entry_c {
|
struct fOpAcm_HIO_entry_c : public mDoHIO_entry_c {
|
||||||
virtual ~fOpAcm_HIO_entry_c() {}
|
virtual ~fOpAcm_HIO_entry_c() {}
|
||||||
|
|
||||||
#if DEBUG && !TARGET_PC
|
#if DEBUG
|
||||||
void removeHIO(const fopAc_ac_c* i_this) { removeHIO(*i_this); }
|
void removeHIO(const fopAc_ac_c* i_this) { removeHIO(*i_this); }
|
||||||
void removeHIO(const fopAc_ac_c& i_this) { removeHIO(i_this.base); }
|
void removeHIO(const fopAc_ac_c& i_this) { removeHIO(i_this.base); }
|
||||||
void removeHIO(const fopEn_enemy_c& i_this) { removeHIO(i_this.base); }
|
void removeHIO(const fopEn_enemy_c& i_this) { removeHIO(i_this.base); }
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, fopAc_ac_c* i_talkActor, u32 param_2
|
|||||||
fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, u32 param_1);
|
fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, u32 param_1);
|
||||||
fpc_ProcID fopMsgM_messageSetDemo(u32 i_msgidx);
|
fpc_ProcID fopMsgM_messageSetDemo(u32 i_msgidx);
|
||||||
msg_class* fopMsgM_SearchByID(fpc_ProcID i_id);
|
msg_class* fopMsgM_SearchByID(fpc_ProcID i_id);
|
||||||
TEXT_SPAN fopMsgM_messageGet(TEXT_SPAN i_stringBuf, u32 i_msgId);
|
char* fopMsgM_messageGet(char* i_stringBuf, u32 i_msgId);
|
||||||
fpc_ProcID fop_Timer_create(s16 i_procName, u8 i_mode, u32 i_limitMs, u8 i_type, u8 param_4,
|
fpc_ProcID fop_Timer_create(s16 i_procName, u8 i_mode, u32 i_limitMs, u8 i_type, u8 param_4,
|
||||||
f32 param_5, f32 param_6, f32 param_7, f32 param_8,
|
f32 param_5, f32 param_6, f32 param_7, f32 param_8,
|
||||||
fopMsgCreateFunc i_createFunc);
|
fopMsgCreateFunc i_createFunc);
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ private:
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
struct J2DIndTexMtxInfo {
|
struct J2DIndTexMtxInfo {
|
||||||
/* 0x00 */ BE(Mtx23) mMtx;
|
/* 0x00 */ Mtx23 mMtx;
|
||||||
/* 0x18 */ s8 mScaleExp;
|
/* 0x18 */ s8 mScaleExp;
|
||||||
|
|
||||||
J2DIndTexMtxInfo& operator=(const J2DIndTexMtxInfo& other) {
|
J2DIndTexMtxInfo& operator=(const J2DIndTexMtxInfo& other) {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
#include "JSystem/J2DGraph/J2DMaterial.h"
|
#include "JSystem/J2DGraph/J2DMaterial.h"
|
||||||
#include "JSystem/J2DGraph/J2DPane.h"
|
#include "JSystem/J2DGraph/J2DPane.h"
|
||||||
#include "dusk/endian.h"
|
#include "dusk/endian.h"
|
||||||
#include "dusk/string.hpp"
|
|
||||||
|
|
||||||
class J2DMaterial;
|
class J2DMaterial;
|
||||||
class JUTFont;
|
class JUTFont;
|
||||||
@@ -99,8 +98,7 @@ public:
|
|||||||
void initiate(ResFONT const*, char const*, s16, J2DTextBoxHBinding,
|
void initiate(ResFONT const*, char const*, s16, J2DTextBoxHBinding,
|
||||||
J2DTextBoxVBinding);
|
J2DTextBoxVBinding);
|
||||||
void private_readStream(J2DPane*, JSURandomInputStream*, JKRArchive*);
|
void private_readStream(J2DPane*, JSURandomInputStream*, JKRArchive*);
|
||||||
TEXT_SPAN getStringPtr() const;
|
char* getStringPtr() const;
|
||||||
dusk::TextSpan getSpan() const;
|
|
||||||
s32 setString(s16, char const*, ...);
|
s32 setString(s16, char const*, ...);
|
||||||
s32 setString(char const*, ...);
|
s32 setString(char const*, ...);
|
||||||
|
|
||||||
|
|||||||
@@ -1575,12 +1575,6 @@ struct J3DAlphaComp {
|
|||||||
u8 getRef1() const { return mRef1; }
|
u8 getRef1() const { return mRef1; }
|
||||||
|
|
||||||
void load() const {
|
void load() const {
|
||||||
#ifdef AVOID_UB
|
|
||||||
if (mID > 255) {
|
|
||||||
J3DGDSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
J3DGDSetAlphaCompare((GXCompare)getComp0(), mRef0, (GXAlphaOp)getOp(), (GXCompare)getComp1(), mRef1);
|
J3DGDSetAlphaCompare((GXCompare)getComp0(), mRef0, (GXAlphaOp)getOp(), (GXCompare)getComp1(), mRef1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -287,28 +287,28 @@ template <typename T>
|
|||||||
class JASPoolAllocObject {
|
class JASPoolAllocObject {
|
||||||
public:
|
public:
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
static void* operator new(size_t n, JKRHeapToken) IF_DUSK(noexcept) {
|
static void* operator new(size_t n, JKRHeapToken) {
|
||||||
return operator new(n);
|
return operator new(n);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void* operator new(size_t n) IF_DUSK(noexcept) {
|
static void* operator new(size_t n) {
|
||||||
#if PLATFORM_GCN
|
#if PLATFORM_GCN
|
||||||
JASMemPool<T>& memPool_ = getMemPool_();
|
JASMemPool<T>& memPool_ = getMemPool_();
|
||||||
#endif
|
#endif
|
||||||
return memPool_.alloc(n);
|
return memPool_.alloc(n);
|
||||||
}
|
}
|
||||||
static void* operator new(size_t n, void* ptr) IF_DUSK(noexcept) {
|
static void* operator new(size_t n, void* ptr) {
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
static void operator delete(void* ptr, size_t n, JKRHeapToken) IF_DUSK(noexcept) {
|
static void operator delete(void* ptr, size_t n, JKRHeapToken) {
|
||||||
operator delete(ptr, n);
|
operator delete(ptr, n);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void operator delete(void* ptr, size_t n) IF_DUSK(noexcept) {
|
static void operator delete(void* ptr, size_t n) {
|
||||||
#if PLATFORM_GCN
|
#if PLATFORM_GCN
|
||||||
JASMemPool<T>& memPool_ = getMemPool_();
|
JASMemPool<T>& memPool_ = getMemPool_();
|
||||||
#endif
|
#endif
|
||||||
@@ -402,28 +402,28 @@ template <typename T>
|
|||||||
class JASPoolAllocObject_MultiThreaded {
|
class JASPoolAllocObject_MultiThreaded {
|
||||||
public:
|
public:
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
static void* operator new(size_t n, JKRHeapToken) IF_DUSK(noexcept) {
|
static void* operator new(size_t n, JKRHeapToken) {
|
||||||
return operator new(n);
|
return operator new(n);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void* operator new(size_t n) IF_DUSK(noexcept) {
|
static void* operator new(size_t n) {
|
||||||
#if PLATFORM_GCN
|
#if PLATFORM_GCN
|
||||||
JASMemPool_MultiThreaded<T>& memPool_ = getMemPool();
|
JASMemPool_MultiThreaded<T>& memPool_ = getMemPool();
|
||||||
#endif
|
#endif
|
||||||
return memPool_.alloc(n);
|
return memPool_.alloc(n);
|
||||||
}
|
}
|
||||||
static void* operator new(size_t n, void* ptr) IF_DUSK(noexcept) {
|
static void* operator new(size_t n, void* ptr) {
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
static void operator delete(void* ptr, size_t n, JKRHeapToken) IF_DUSK(noexcept) {
|
static void operator delete(void* ptr, size_t n, JKRHeapToken) {
|
||||||
return operator delete(ptr, n);
|
return operator delete(ptr, n);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void operator delete(void* ptr, size_t n) IF_DUSK(noexcept) {
|
static void operator delete(void* ptr, size_t n) {
|
||||||
#if PLATFORM_GCN
|
#if PLATFORM_GCN
|
||||||
JASMemPool_MultiThreaded<T>& memPool_ = getMemPool();
|
JASMemPool_MultiThreaded<T>& memPool_ = getMemPool();
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -237,11 +237,11 @@ enum class JKRHeapToken {
|
|||||||
Dummy
|
Dummy
|
||||||
};
|
};
|
||||||
|
|
||||||
inline void* operator new(size_t, JKRHeapToken, void* where) noexcept {
|
inline void* operator new(size_t, JKRHeapToken, void* where) {
|
||||||
return where;
|
return where;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void* operator new[](size_t, JKRHeapToken, void* where) noexcept {
|
inline void* operator new[](size_t, JKRHeapToken, void* where) {
|
||||||
return where;
|
return where;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -264,21 +264,21 @@ inline void* operator new[](size_t, JKRHeapToken, void* where) noexcept {
|
|||||||
#define JKR_HEAP_TOKEN_PARAM
|
#define JKR_HEAP_TOKEN_PARAM
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept);
|
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM);
|
||||||
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, int alignment) IF_DUSK(noexcept);
|
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, int alignment);
|
||||||
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, JKRHeap* heap, int alignment) IF_DUSK(noexcept);
|
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, JKRHeap* heap, int alignment);
|
||||||
|
|
||||||
// On PC, these new[] overloads are only used to catch usages of JKR_NEW with [].
|
// On PC, these new[] overloads are only used to catch usages of JKR_NEW with [].
|
||||||
void* operator new[](size_t size JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept);
|
void* operator new[](size_t size JKR_HEAP_TOKEN_PARAM);
|
||||||
void* operator new[](size_t size JKR_HEAP_TOKEN_PARAM, int alignment) IF_DUSK(noexcept);
|
void* operator new[](size_t size JKR_HEAP_TOKEN_PARAM, int alignment);
|
||||||
void* operator new[](size_t size JKR_HEAP_TOKEN_PARAM, JKRHeap* heap, int alignment) IF_DUSK(noexcept);
|
void* operator new[](size_t size JKR_HEAP_TOKEN_PARAM, JKRHeap* heap, int alignment);
|
||||||
|
|
||||||
void operator delete(void* ptr JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept);
|
void operator delete(void* ptr JKR_HEAP_TOKEN_PARAM);
|
||||||
void operator delete[](void* ptr JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept);
|
void operator delete[](void* ptr JKR_HEAP_TOKEN_PARAM);
|
||||||
|
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void jkrDelete(T* ptr) IF_DUSK(noexcept) {
|
void jkrDelete(T* ptr) {
|
||||||
if (ptr == nullptr) {
|
if (ptr == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -298,7 +298,7 @@ void jkrDelete(T* ptr) IF_DUSK(noexcept) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void jkrDelete(void* ptr) IF_DUSK(noexcept) {
|
inline void jkrDelete(void* ptr) {
|
||||||
if (ptr == nullptr) {
|
if (ptr == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -322,7 +322,7 @@ constexpr bool newArgsHasCustomAlignment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename... Args>
|
template<typename T, typename... Args>
|
||||||
T* jkrNewArray(size_t count, std::in_place_type_t<T>, Args&&... args) IF_DUSK(noexcept) {
|
T* jkrNewArray(size_t count, std::in_place_type_t<T>, Args&&... args) {
|
||||||
size_t allocSize = count * sizeof(T);
|
size_t allocSize = count * sizeof(T);
|
||||||
if constexpr (!std::is_trivially_destructible<T>()) {
|
if constexpr (!std::is_trivially_destructible<T>()) {
|
||||||
static_assert(
|
static_assert(
|
||||||
@@ -333,10 +333,6 @@ T* jkrNewArray(size_t count, std::in_place_type_t<T>, Args&&... args) IF_DUSK(no
|
|||||||
}
|
}
|
||||||
|
|
||||||
void* ptr = operator new(allocSize, JKRHeapToken::Dummy, args...);
|
void* ptr = operator new(allocSize, JKRHeapToken::Dummy, args...);
|
||||||
if (!ptr) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
T* dataPtr;
|
T* dataPtr;
|
||||||
if constexpr (!std::is_trivially_destructible<T>()) {
|
if constexpr (!std::is_trivially_destructible<T>()) {
|
||||||
auto length = static_cast<size_t*>(ptr);
|
auto length = static_cast<size_t*>(ptr);
|
||||||
@@ -356,7 +352,7 @@ T* jkrNewArray(size_t count, std::in_place_type_t<T>, Args&&... args) IF_DUSK(no
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void jkrDeleteArray(T* pointer) IF_DUSK(noexcept) {
|
void jkrDeleteArray(T* pointer) {
|
||||||
if (pointer == nullptr) {
|
if (pointer == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -376,7 +372,7 @@ void jkrDeleteArray(T* pointer) IF_DUSK(noexcept) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void jkrDeleteArray(void* pointer) IF_DUSK(noexcept) {
|
inline void jkrDeleteArray(void* pointer) {
|
||||||
if (pointer == nullptr) {
|
if (pointer == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
|
|
||||||
#include "dusk/string.hpp"
|
|
||||||
|
|
||||||
J2DMaterialFactory::J2DMaterialFactory(J2DMaterialBlock const& param_0) {
|
J2DMaterialFactory::J2DMaterialFactory(J2DMaterialBlock const& param_0) {
|
||||||
mMaterialNum = param_0.field_0x8;
|
mMaterialNum = param_0.field_0x8;
|
||||||
mpMaterialInitData = JSUConvertOffsetToPtr<J2DMaterialInitData>(¶m_0, param_0.field_0xc);
|
mpMaterialInitData = JSUConvertOffsetToPtr<J2DMaterialInitData>(¶m_0, param_0.field_0xc);
|
||||||
@@ -94,7 +92,7 @@ J2DMaterial* J2DMaterialFactory::create(J2DMaterial* param_0, int index, u32 par
|
|||||||
}
|
}
|
||||||
if (local_380 == NULL && J2DScreen::getDataManage() != NULL) {
|
if (local_380 == NULL && J2DScreen::getDataManage() != NULL) {
|
||||||
char acStack_230[257];
|
char acStack_230[257];
|
||||||
SAFE_STRCPY(acStack_230, param_3->getName(texNo));
|
strcpy(acStack_230, param_3->getName(texNo));
|
||||||
local_380 = J2DScreen::getDataManage()->get(acStack_230);
|
local_380 = J2DScreen::getDataManage()->get(acStack_230);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -113,7 +111,7 @@ J2DMaterial* J2DMaterialFactory::create(J2DMaterial* param_0, int index, u32 par
|
|||||||
}
|
}
|
||||||
if (local_388 == NULL && J2DScreen::getDataManage() != NULL) {
|
if (local_388 == NULL && J2DScreen::getDataManage() != NULL) {
|
||||||
char acStack_334[257];
|
char acStack_334[257];
|
||||||
SAFE_STRCPY(acStack_334, param_4->getName(param_0->getTevBlock()->getFontNo()));
|
strcpy(acStack_334, param_4->getName(param_0->getTevBlock()->getFontNo()));
|
||||||
local_388 = J2DScreen::getDataManage()->get(acStack_334);
|
local_388 = J2DScreen::getDataManage()->get(acStack_334);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,14 +68,8 @@ void J2DIndTevStage::load(u8 tevStage) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void J2DIndTexMtx::load(u8 indTexMtx) {
|
void J2DIndTexMtx::load(u8 indTexMtx) {
|
||||||
#ifdef TARGET_PC
|
|
||||||
Mtx23 mtx;
|
|
||||||
mIndTexMtxInfo.mMtx.to_host(mtx);
|
|
||||||
GXSetIndTexMtx((GXIndTexMtxID)(GX_ITM_0 + indTexMtx), mtx, mIndTexMtxInfo.mScaleExp);
|
|
||||||
#else
|
|
||||||
GXSetIndTexMtx((GXIndTexMtxID)(GX_ITM_0 + indTexMtx), mIndTexMtxInfo.mMtx,
|
GXSetIndTexMtx((GXIndTexMtxID)(GX_ITM_0 + indTexMtx), mIndTexMtxInfo.mMtx,
|
||||||
mIndTexMtxInfo.mScaleExp);
|
mIndTexMtxInfo.mScaleExp);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void J2DIndTexCoordScale::load(u8 indTexStage) {
|
void J2DIndTexCoordScale::load(u8 indTexStage) {
|
||||||
|
|||||||
@@ -309,12 +309,8 @@ void J2DTextBox::draw(f32 posX, f32 posY, f32 param_2, J2DTextBoxHBinding hBind)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEXT_SPAN J2DTextBox::getStringPtr() const {
|
char* J2DTextBox::getStringPtr() const {
|
||||||
#if TARGET_PC
|
|
||||||
return { mStringPtr, mStringLength };
|
|
||||||
#else
|
|
||||||
return mStringPtr;
|
return mStringPtr;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 J2DTextBox::setString(char const* string, ...) {
|
s32 J2DTextBox::setString(char const* string, ...) {
|
||||||
@@ -334,7 +330,7 @@ s32 J2DTextBox::setString(char const* string, ...) {
|
|||||||
|
|
||||||
if (mStringPtr) {
|
if (mStringPtr) {
|
||||||
mStringLength = len + 1;
|
mStringLength = len + 1;
|
||||||
SAFE_STRCPY_BOUNDED(mStringPtr, mStringLength, string);
|
strcpy(mStringPtr, string);
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
#include <JSystem/JUtility/JUTAssert.h>
|
#include <JSystem/JUtility/JUTAssert.h>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
#include "dusk/string.hpp"
|
|
||||||
|
|
||||||
u32 JAHVirtualNode::smVirNodeNum;
|
u32 JAHVirtualNode::smVirNodeNum;
|
||||||
|
|
||||||
void JAHVirtualNode::virtualMessage(JAHControl& control) {
|
void JAHVirtualNode::virtualMessage(JAHControl& control) {
|
||||||
@@ -79,7 +77,7 @@ void JAHVirtualNode::setVirNodeName(const char* name) {
|
|||||||
// clang-format off
|
// clang-format off
|
||||||
JUT_ASSERT(141, size<32);
|
JUT_ASSERT(141, size<32);
|
||||||
// clang-format on
|
// clang-format on
|
||||||
SAFE_STRCPY(mName, name);
|
strcpy(mName, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
JAHVirtualNode::JAHVirtualNode(const char* name) : mTree(this) {
|
JAHVirtualNode::JAHVirtualNode(const char* name) : mTree(this) {
|
||||||
|
|||||||
@@ -4,9 +4,7 @@
|
|||||||
#include "JSystem/JAHostIO/JAHioMessage.h"
|
#include "JSystem/JAHostIO/JAHioMessage.h"
|
||||||
#include "JSystem/JAHostIO/JAHioMgr.h"
|
#include "JSystem/JAHostIO/JAHioMgr.h"
|
||||||
#include "JSystem/JAHostIO/JAHioNode.h"
|
#include "JSystem/JAHostIO/JAHioNode.h"
|
||||||
|
|
||||||
#include "JSystem/JHostIO/JORServer.h"
|
#include "JSystem/JHostIO/JORServer.h"
|
||||||
#include "dusk/string.hpp"
|
|
||||||
|
|
||||||
JAHioNode* JAHioNode::smCurrentNode;
|
JAHioNode* JAHioNode::smCurrentNode;
|
||||||
|
|
||||||
@@ -34,7 +32,7 @@ void JAHioNode::updateNode() {
|
|||||||
void JAHioNode::setNodeName(const char* name) {
|
void JAHioNode::setNodeName(const char* name) {
|
||||||
int size = strlen(name) + 1;
|
int size = strlen(name) + 1;
|
||||||
JUT_ASSERT(51, size < 32);
|
JUT_ASSERT(51, size < 32);
|
||||||
SAFE_STRCPY(mName, name);
|
strcpy(mName, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JAHioNode::genMessage(JORMContext* mctx) {
|
void JAHioNode::genMessage(JORMContext* mctx) {
|
||||||
|
|||||||
@@ -9,8 +9,6 @@
|
|||||||
#include <os.h>
|
#include <os.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "dusk/string.hpp"
|
|
||||||
|
|
||||||
JASHeap* JASWaveArcLoader::sAramHeap;
|
JASHeap* JASWaveArcLoader::sAramHeap;
|
||||||
|
|
||||||
JASHeap* JASWaveArcLoader::getRootHeap() {
|
JASHeap* JASWaveArcLoader::getRootHeap() {
|
||||||
@@ -24,7 +22,7 @@ char JASWaveArcLoader::sCurrentDir[DIR_MAX] = "/AudioRes/Waves/";
|
|||||||
|
|
||||||
void JASWaveArcLoader::setCurrentDir(char const* dir) {
|
void JASWaveArcLoader::setCurrentDir(char const* dir) {
|
||||||
JUT_ASSERT(40, std::strlen(dir) < DIR_MAX - 1);
|
JUT_ASSERT(40, std::strlen(dir) < DIR_MAX - 1);
|
||||||
SAFE_STRCPY(sCurrentDir, dir);
|
strcpy(sCurrentDir, dir);
|
||||||
u32 len = strlen(sCurrentDir);
|
u32 len = strlen(sCurrentDir);
|
||||||
if (sCurrentDir[len - 1] != '/') {
|
if (sCurrentDir[len - 1] != '/') {
|
||||||
JUT_ASSERT(45, len + 1 < DIR_MAX);
|
JUT_ASSERT(45, len + 1 < DIR_MAX);
|
||||||
@@ -172,8 +170,8 @@ void JASWaveArc::setFileName(char const* fileName) {
|
|||||||
length = length + strlen(fileName);
|
length = length + strlen(fileName);
|
||||||
char* path = JKR_NEW_ARRAY_ARGS(char, length + 1, JASKernel::getSystemHeap(), -4);
|
char* path = JKR_NEW_ARRAY_ARGS(char, length + 1, JASKernel::getSystemHeap(), -4);
|
||||||
JUT_ASSERT(322, path);
|
JUT_ASSERT(322, path);
|
||||||
SAFE_STRCPY_BOUNDED(path, length + 1, currentDir);
|
strcpy(path, currentDir);
|
||||||
SAFE_STRCAT_BOUNDED(path, length + 1, fileName);
|
strcat(path, fileName);
|
||||||
path[length] = '\0';
|
path[length] = '\0';
|
||||||
int entryNum = DVDConvertPathToEntrynum(path);
|
int entryNum = DVDConvertPathToEntrynum(path);
|
||||||
JKR_DELETE_ARRAY(path);
|
JKR_DELETE_ARRAY(path);
|
||||||
|
|||||||
@@ -370,28 +370,28 @@ constexpr auto FRAME_PERIOD = std::chrono::duration_cast<std::chrono::nanosecond
|
|||||||
constexpr auto RETRACE_PERIOD = FRAME_PERIOD / 2;
|
constexpr auto RETRACE_PERIOD = FRAME_PERIOD / 2;
|
||||||
|
|
||||||
static void waitPrecise(Limiter& limiter, Limiter::duration_t targetNs) {
|
static void waitPrecise(Limiter& limiter, Limiter::duration_t targetNs) {
|
||||||
const auto sleepTime = limiter.Sleep(targetNs);
|
const auto sleepTime = limiter.SleepTime(targetNs);
|
||||||
dusk::frameUsagePct =
|
dusk::frameUsagePct =
|
||||||
100.0f * (1.0f - static_cast<float>(sleepTime) / static_cast<float>(targetNs));
|
100.0f * (1.0f - static_cast<float>(sleepTime) / static_cast<float>(targetNs));
|
||||||
|
limiter.Sleep(targetNs);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void waitForTick(u32 p1, u16 p2) {
|
static void waitForTick(u32 p1, u16 p2) {
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
static Limiter limiter;
|
if (dusk::getSettings().game.enableFrameInterpolation && !dusk::getTransientSettings().skipFrameRateLimit) {
|
||||||
|
|
||||||
if (dusk::frame_interp::is_enabled() && !dusk::getTransientSettings().skipFrameRateLimit) {
|
|
||||||
dusk::frameUsagePct = 0.f;
|
dusk::frameUsagePct = 0.f;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dusk::getTransientSettings().skipFrameRateLimit) {
|
if (dusk::getTransientSettings().skipFrameRateLimit) {
|
||||||
p1 = OS_TIMER_CLOCK / 120;
|
p1 = OS_TIMER_CLOCK / 120;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
if (fopOvlpM_IsPeek() && dusk::getTransientSettings().stateShareLoadActive) {
|
if (fopOvlpM_IsPeek() && dusk::getTransientSettings().stateShareLoadActive) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ZoneScopedC(tracy::Color::DimGray);
|
ZoneScopedC(tracy::Color::DimGray);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include "dusk/string.hpp"
|
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
|
||||||
JKRFileCache* JKRFileCache::mount(const char* path, JKRHeap* heap, const char* param_3) {
|
JKRFileCache* JKRFileCache::mount(const char* path, JKRHeap* heap, const char* param_3) {
|
||||||
|
|||||||
@@ -4,11 +4,10 @@
|
|||||||
|
|
||||||
#define MSL_USE_INLINES 1 // needed to inline tolower call. not inlined elsewhere in the repo
|
#define MSL_USE_INLINES 1 // needed to inline tolower call. not inlined elsewhere in the repo
|
||||||
|
|
||||||
#include <cctype>
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <cctype>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "JSystem/JKernel/JKRHeap.h"
|
#include "JSystem/JKernel/JKRHeap.h"
|
||||||
#include "dusk/string.hpp"
|
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
|
||||||
JKRFileLoader* JKRFileLoader::sCurrentVolume;
|
JKRFileLoader* JKRFileLoader::sCurrentVolume;
|
||||||
@@ -105,7 +104,7 @@ const char* JKRFileLoader::fetchVolumeName(char* buffer, s32 bufferSize, const c
|
|||||||
static char rootPath[2] = "/";
|
static char rootPath[2] = "/";
|
||||||
|
|
||||||
if (strcmp(path, "/") == 0) {
|
if (strcmp(path, "/") == 0) {
|
||||||
SAFE_STRCPY_BOUNDED(buffer, bufferSize, rootPath);
|
strcpy(buffer, rootPath);
|
||||||
return rootPath;
|
return rootPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -559,7 +559,7 @@ void* operator new(size_t size) {
|
|||||||
return JKRHeap::alloc(size, 4, NULL);
|
return JKRHeap::alloc(size, 4, NULL);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM) noexcept {
|
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM) {
|
||||||
if (sCurrentHeap == NULL) {
|
if (sCurrentHeap == NULL) {
|
||||||
return fallback_alloc(size, 0, false);
|
return fallback_alloc(size, 0, false);
|
||||||
}
|
}
|
||||||
@@ -576,7 +576,7 @@ void* operator new(size_t size, int alignment) {
|
|||||||
return JKRHeap::alloc(size, alignment, NULL);
|
return JKRHeap::alloc(size, alignment, NULL);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, int alignment) noexcept {
|
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, int alignment) {
|
||||||
void* mem = JKRHeap::alloc(size, alignment, nullptr);
|
void* mem = JKRHeap::alloc(size, alignment, nullptr);
|
||||||
if (mem == nullptr) {
|
if (mem == nullptr) {
|
||||||
return fallback_alloc(size, abs(alignment), true);
|
return fallback_alloc(size, abs(alignment), true);
|
||||||
@@ -585,7 +585,7 @@ void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, int alignment) noexcept {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, JKRHeap* heap, int alignment) IF_DUSK(noexcept) {
|
void* operator new(size_t size JKR_HEAP_TOKEN_PARAM, JKRHeap* heap, int alignment) {
|
||||||
void* mem = JKRHeap::alloc(size, alignment, heap);
|
void* mem = JKRHeap::alloc(size, alignment, heap);
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
if (mem == nullptr) {
|
if (mem == nullptr) {
|
||||||
@@ -600,7 +600,7 @@ void* operator new[](size_t size) {
|
|||||||
return JKRHeap::alloc(size, 4, NULL);
|
return JKRHeap::alloc(size, 4, NULL);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void* operator new[](size_t JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept) {
|
void* operator new[](size_t JKR_HEAP_TOKEN_PARAM) {
|
||||||
OSPanic(__FILE__, __LINE__, "Allocation should go through JKR_NEW_ARRAY instead");
|
OSPanic(__FILE__, __LINE__, "Allocation should go through JKR_NEW_ARRAY instead");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -610,12 +610,12 @@ void* operator new[](size_t size, int alignment) {
|
|||||||
return JKRHeap::alloc(size, alignment, NULL);
|
return JKRHeap::alloc(size, alignment, NULL);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void* operator new[](size_t JKR_HEAP_TOKEN_PARAM, int) IF_DUSK(noexcept) {
|
void* operator new[](size_t JKR_HEAP_TOKEN_PARAM, int) {
|
||||||
OSPanic(__FILE__, __LINE__, "Allocation should go through JKR_NEW_ARRAY instead");
|
OSPanic(__FILE__, __LINE__, "Allocation should go through JKR_NEW_ARRAY instead");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void* operator new[](size_t JKR_HEAP_TOKEN_PARAM, JKRHeap*, int) IF_DUSK(noexcept) {
|
void* operator new[](size_t JKR_HEAP_TOKEN_PARAM, JKRHeap*, int) {
|
||||||
OSPanic(__FILE__, __LINE__, "Allocation should go through JKR_NEW_ARRAY instead");
|
OSPanic(__FILE__, __LINE__, "Allocation should go through JKR_NEW_ARRAY instead");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -624,7 +624,7 @@ void operator delete(void* ptr) {
|
|||||||
JKRHeap::free(ptr, NULL);
|
JKRHeap::free(ptr, NULL);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void operator delete(void* ptr JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept) {
|
void operator delete(void* ptr JKR_HEAP_TOKEN_PARAM) {
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
return;
|
return;
|
||||||
JKRHeap* heap = JKRHeap::findFromRoot(ptr);
|
JKRHeap* heap = JKRHeap::findFromRoot(ptr);
|
||||||
@@ -645,7 +645,7 @@ void operator delete[](void* ptr) {
|
|||||||
JKRHeap::free(ptr, NULL);
|
JKRHeap::free(ptr, NULL);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void operator delete[](void* ptr JKR_HEAP_TOKEN_PARAM) IF_DUSK(noexcept) {
|
void operator delete[](void* ptr JKR_HEAP_TOKEN_PARAM) {
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
return;
|
return;
|
||||||
JKRHeap* heap = JKRHeap::findFromRoot(ptr);
|
JKRHeap* heap = JKRHeap::findFromRoot(ptr);
|
||||||
|
|||||||
@@ -7,8 +7,6 @@
|
|||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "dusk/string.hpp"
|
|
||||||
|
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
#include "dusk/os.h"
|
#include "dusk/os.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -276,7 +274,7 @@ void JKRThreadSwitch::draw(JKRThreadName_* thread_name_list, JUTConsole* console
|
|||||||
|
|
||||||
if (!thread_print_name) {
|
if (!thread_print_name) {
|
||||||
char buffer[16];
|
char buffer[16];
|
||||||
SAFE_SPRINTF(buffer, "%d", loadInfo->getId());
|
sprintf(buffer, "%d", loadInfo->getId());
|
||||||
thread_print_name = buffer;
|
thread_print_name = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -76,7 +76,6 @@ void JPARegistAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JPARegistPrmAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
void JPARegistPrmAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||||
ZoneScoped;
|
|
||||||
JPABaseEmitter* emtr = work->mpEmtr;
|
JPABaseEmitter* emtr = work->mpEmtr;
|
||||||
GXColor prm = ptcl->mPrmClr;
|
GXColor prm = ptcl->mPrmClr;
|
||||||
prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r);
|
prm.r = COLOR_MULTI(prm.r, emtr->mGlobalPrmClr.r);
|
||||||
@@ -88,7 +87,6 @@ void JPARegistPrmAlpha(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JPARegistPrmAlphaEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
void JPARegistPrmAlphaEnv(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||||
ZoneScoped;
|
|
||||||
JPABaseEmitter* emtr = work->mpEmtr;
|
JPABaseEmitter* emtr = work->mpEmtr;
|
||||||
GXColor prm = ptcl->mPrmClr;
|
GXColor prm = ptcl->mPrmClr;
|
||||||
GXColor env = ptcl->mEnvClr;
|
GXColor env = ptcl->mEnvClr;
|
||||||
@@ -227,7 +225,6 @@ void JPAGenTexCrdMtxPrj(JPAEmitterWorkData* param_0) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JPAGenCalcTexCrdMtxAnm(JPAEmitterWorkData* work) {
|
void JPAGenCalcTexCrdMtxAnm(JPAEmitterWorkData* work) {
|
||||||
ZoneScoped;
|
|
||||||
JPABaseShape* shape = work->mpRes->getBsp();
|
JPABaseShape* shape = work->mpRes->getBsp();
|
||||||
f32 dVar16 = work->mpEmtr->mTick;
|
f32 dVar16 = work->mpEmtr->mTick;
|
||||||
f32 dVar15 = 0.5f * (1.0f + shape->getTilingS());
|
f32 dVar15 = 0.5f * (1.0f + shape->getTilingS());
|
||||||
@@ -259,7 +256,6 @@ void JPAGenCalcTexCrdMtxAnm(JPAEmitterWorkData* work) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
||||||
ZoneScoped;
|
|
||||||
JPABaseShape* shape = work->mpRes->getBsp();
|
JPABaseShape* shape = work->mpRes->getBsp();
|
||||||
f32 dVar16 = param_1->mAge;
|
f32 dVar16 = param_1->mAge;
|
||||||
f32 dVar15 = 0.5f * (1.0f + shape->getTilingS());
|
f32 dVar15 = 0.5f * (1.0f + shape->getTilingS());
|
||||||
@@ -290,17 +286,14 @@ void JPALoadCalcTexCrdMtxAnm(JPAEmitterWorkData* work, JPABaseParticle* param_1)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JPALoadTex(JPAEmitterWorkData* work) {
|
void JPALoadTex(JPAEmitterWorkData* work) {
|
||||||
ZoneScoped;
|
|
||||||
work->mpResMgr->load(work->mpRes->getTexIdx(work->mpRes->getBsp()->getTexIdx()), GX_TEXMAP0);
|
work->mpResMgr->load(work->mpRes->getTexIdx(work->mpRes->getBsp()->getTexIdx()), GX_TEXMAP0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JPALoadTexAnm(JPAEmitterWorkData* work) {
|
void JPALoadTexAnm(JPAEmitterWorkData* work) {
|
||||||
ZoneScoped;
|
|
||||||
work->mpResMgr->load(work->mpRes->getTexIdx(work->mpEmtr->mTexAnmIdx), GX_TEXMAP0);
|
work->mpResMgr->load(work->mpRes->getTexIdx(work->mpEmtr->mTexAnmIdx), GX_TEXMAP0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JPALoadTexAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
void JPALoadTexAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||||
ZoneScoped;
|
|
||||||
work->mpResMgr->load(work->mpRes->getTexIdx(ptcl->mTexAnmIdx), GX_TEXMAP0);
|
work->mpResMgr->load(work->mpRes->getTexIdx(ptcl->mTexAnmIdx), GX_TEXMAP0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -453,7 +446,6 @@ void JPADrawBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZoneScoped;
|
|
||||||
JGeometry::TVec3<f32> pos;
|
JGeometry::TVec3<f32> pos;
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
Mtx ptclPosMtx;
|
Mtx ptclPosMtx;
|
||||||
@@ -483,7 +475,6 @@ void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZoneScoped;
|
|
||||||
if (work->mpRes->getUsrIdx() == 0x89d7) {
|
if (work->mpRes->getUsrIdx() == 0x89d7) {
|
||||||
int a = 0;
|
int a = 0;
|
||||||
}
|
}
|
||||||
@@ -527,7 +518,6 @@ void JPADrawYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZoneScoped;
|
|
||||||
JGeometry::TVec3<f32> local_48;
|
JGeometry::TVec3<f32> local_48;
|
||||||
MTXMultVec(work->mPosCamMtx, ¶m_1->mPosition, &local_48);
|
MTXMultVec(work->mPosCamMtx, ¶m_1->mPosition, &local_48);
|
||||||
Mtx local_38;
|
Mtx local_38;
|
||||||
@@ -552,7 +542,6 @@ void JPADrawRotYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZoneScoped;
|
|
||||||
JGeometry::TVec3<f32> local_48;
|
JGeometry::TVec3<f32> local_48;
|
||||||
MTXMultVec(work->mPosCamMtx, ¶m_1->mPosition, &local_48);
|
MTXMultVec(work->mPosCamMtx, ¶m_1->mPosition, &local_48);
|
||||||
f32 sinRot = JMASSin(param_1->mRotateAngle);
|
f32 sinRot = JMASSin(param_1->mRotateAngle);
|
||||||
@@ -1279,8 +1268,6 @@ void JPADrawStripeX(JPAEmitterWorkData* param_0) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JPADrawEmitterCallBackB(JPAEmitterWorkData* work) {
|
void JPADrawEmitterCallBackB(JPAEmitterWorkData* work) {
|
||||||
ZoneScoped;
|
|
||||||
|
|
||||||
JPABaseEmitter* emtr = work->mpEmtr;
|
JPABaseEmitter* emtr = work->mpEmtr;
|
||||||
if (emtr->mpEmtrCallBack == NULL) {
|
if (emtr->mpEmtrCallBack == NULL) {
|
||||||
return;
|
return;
|
||||||
@@ -1295,7 +1282,6 @@ void JPADrawParticleCallBack(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZoneScoped;
|
|
||||||
emtr->mpPtclCallBack->draw(emtr, ptcl);
|
emtr->mpPtclCallBack->draw(emtr, ptcl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,6 @@
|
|||||||
#include <gx.h>
|
#include <gx.h>
|
||||||
|
|
||||||
void JPALoadExTex(JPAEmitterWorkData* work) {
|
void JPALoadExTex(JPAEmitterWorkData* work) {
|
||||||
ZoneScoped;
|
|
||||||
|
|
||||||
JPAExTexShape* ets = work->mpRes->getEts();
|
JPAExTexShape* ets = work->mpRes->getEts();
|
||||||
|
|
||||||
GXTexCoordID secTexCoordID = GX_TEXCOORD1;
|
GXTexCoordID secTexCoordID = GX_TEXCOORD1;
|
||||||
|
|||||||
@@ -655,7 +655,7 @@ value_or_fun:
|
|||||||
|
|
||||||
value:
|
value:
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
if (dusk::frame_interp::is_enabled() && u <= 5 &&
|
if (dusk::getSettings().game.enableFrameInterpolation && u <= 5 &&
|
||||||
(operation == data::UNK_0x2 || operation == data::UNK_0x3 || operation == data::UNK_0x12))
|
(operation == data::UNK_0x2 || operation == data::UNK_0x3 || operation == data::UNK_0x12))
|
||||||
{
|
{
|
||||||
dusk::frame_interp::request_presentation_sync();
|
dusk::frame_interp::request_presentation_sync();
|
||||||
@@ -666,7 +666,7 @@ value:
|
|||||||
|
|
||||||
value_n:
|
value_n:
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
if (dusk::frame_interp::is_enabled() &&
|
if (dusk::getSettings().game.enableFrameInterpolation &&
|
||||||
(pN == TAdaptor_camera::sauVariableValue_3_POSITION_XYZ || pN == TAdaptor_camera::sauVariableValue_3_TARGET_POSITION_XYZ) &&
|
(pN == TAdaptor_camera::sauVariableValue_3_POSITION_XYZ || pN == TAdaptor_camera::sauVariableValue_3_TARGET_POSITION_XYZ) &&
|
||||||
(operation == data::UNK_0x2 || operation == data::UNK_0x3 || operation == data::UNK_0x12))
|
(operation == data::UNK_0x2 || operation == data::UNK_0x3 || operation == data::UNK_0x12))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
#include "JSystem/JSystem.h" // IWYU pragma: keep
|
#include "JSystem/JSystem.h" // IWYU pragma: keep
|
||||||
|
|
||||||
#include <cstdio>
|
#include "JSystem/JUtility/JUTConsole.h"
|
||||||
#include <vi.h>
|
|
||||||
#include "JSystem/J2DGraph/J2DOrthoGraph.h"
|
#include "JSystem/J2DGraph/J2DOrthoGraph.h"
|
||||||
#include "JSystem/JKernel/JKRHeap.h"
|
#include "JSystem/JKernel/JKRHeap.h"
|
||||||
#include "JSystem/JUtility/JUTAssert.h"
|
#include "JSystem/JUtility/JUTAssert.h"
|
||||||
#include "JSystem/JUtility/JUTConsole.h"
|
|
||||||
#include "JSystem/JUtility/JUTDirectPrint.h"
|
#include "JSystem/JUtility/JUTDirectPrint.h"
|
||||||
#include "JSystem/JUtility/JUTVideo.h"
|
#include "JSystem/JUtility/JUTVideo.h"
|
||||||
#include "dusk/string.hpp"
|
#include <vi.h>
|
||||||
|
#include <cstdio>
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
|
||||||
JUTConsoleManager* JUTConsoleManager::sManager;
|
JUTConsoleManager* JUTConsoleManager::sManager;
|
||||||
@@ -205,10 +204,10 @@ void JUTConsole::doDraw(JUTConsole::EConsoleType consoleType) const {
|
|||||||
mFont->drawString_scale((int)f31, sp94, mFontSizeX, mFontSizeY, spA8, TRUE);
|
mFont->drawString_scale((int)f31, sp94, mFontSizeX, mFontSizeY, spA8, TRUE);
|
||||||
f31 += mFontSizeX * 13.0f;
|
f31 += mFontSizeX * 13.0f;
|
||||||
if (sp88) {
|
if (sp88) {
|
||||||
SAFE_SPRINTF(spB8, "ALL");
|
sprintf(spB8, "ALL");
|
||||||
} else {
|
} else {
|
||||||
f32 f29 = sp8C / (f32)(sp90 - mHeight);
|
f32 f29 = sp8C / (f32)(sp90 - mHeight);
|
||||||
SAFE_SPRINTF(spB8, "%3d%%(%dL)", (int)(100.0 * f29), sp90);
|
sprintf(spB8, "%3d%%(%dL)", (int)(100.0 * f29), sp90);
|
||||||
}
|
}
|
||||||
mFont->drawString_scale(f31, sp94, mFontSizeX, mFontSizeY, spB8, TRUE);
|
mFont->drawString_scale(f31, sp94, mFontSizeX, mFontSizeY, spB8, TRUE);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,6 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
#include "dusk/string.hpp"
|
|
||||||
#ifdef __REVOLUTION_SDK__
|
#ifdef __REVOLUTION_SDK__
|
||||||
#include <revolution.h>
|
#include <revolution.h>
|
||||||
#else
|
#else
|
||||||
@@ -847,8 +845,8 @@ bool JUTException::queryMapAddress(char* mapPath, u32 address, s32 section_id, u
|
|||||||
bool begin_with_newline) {
|
bool begin_with_newline) {
|
||||||
if (mapPath) {
|
if (mapPath) {
|
||||||
char buffer[80];
|
char buffer[80];
|
||||||
SAFE_STRCPY(buffer, mapPath);
|
strcpy(buffer, mapPath);
|
||||||
SAFE_STRCAT(buffer, ".map");
|
strcat(buffer, ".map");
|
||||||
if (queryMapAddress_single(buffer, address, section_id, out_addr, out_size, out_line,
|
if (queryMapAddress_single(buffer, address, section_id, out_addr, out_size, out_line,
|
||||||
line_length, print, begin_with_newline) == true)
|
line_length, print, begin_with_newline) == true)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,10 +4,6 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include "os_report.h"
|
#include "os_report.h"
|
||||||
|
|
||||||
#if TARGET_PC
|
|
||||||
#include "dusk/action_bindings.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
u32 JUTGamePad::CRumble::sChannelMask[4] = {
|
u32 JUTGamePad::CRumble::sChannelMask[4] = {
|
||||||
PAD_CHAN0_BIT,
|
PAD_CHAN0_BIT,
|
||||||
PAD_CHAN1_BIT,
|
PAD_CHAN1_BIT,
|
||||||
@@ -89,9 +85,6 @@ u32 JUTGamePad::sRumbleSupported;
|
|||||||
|
|
||||||
u32 JUTGamePad::read() {
|
u32 JUTGamePad::read() {
|
||||||
sRumbleSupported = PADRead(mPadStatus);
|
sRumbleSupported = PADRead(mPadStatus);
|
||||||
#if TARGET_PC
|
|
||||||
dusk::updateActionBindings();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
switch (sClampMode) {
|
switch (sClampMode) {
|
||||||
case EClampStick:
|
case EClampStick:
|
||||||
|
|||||||
@@ -13,33 +13,20 @@ inline denormal_state denormals_enable()
|
|||||||
}
|
}
|
||||||
inline void denormals_restore(denormal_state saved) { _mm_setcsr(saved); }
|
inline void denormals_restore(denormal_state saved) { _mm_setcsr(saved); }
|
||||||
|
|
||||||
#elif defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)
|
#elif defined(__aarch64__) || defined(_M_ARM64)
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#if defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM64) || defined(_M_ARM64EC))
|
|
||||||
#include <intrin.h>
|
|
||||||
#endif
|
|
||||||
using denormal_state = uint64_t;
|
using denormal_state = uint64_t;
|
||||||
inline denormal_state denormals_enable()
|
inline denormal_state denormals_enable()
|
||||||
{
|
{
|
||||||
#if defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM64) || defined(_M_ARM64EC))
|
|
||||||
denormal_state saved = static_cast<denormal_state>(_ReadStatusReg(ARM64_FPCR));
|
|
||||||
_WriteStatusReg(ARM64_FPCR, static_cast<__int64>(saved | (1ULL << 24))); // FZ
|
|
||||||
return saved;
|
|
||||||
#else
|
|
||||||
denormal_state saved;
|
denormal_state saved;
|
||||||
asm volatile("mrs %0, fpcr" : "=r"(saved));
|
asm volatile("mrs %0, fpcr" : "=r"(saved));
|
||||||
asm volatile("msr fpcr, %0" :: "r"(saved | (1ULL << 24))); // FZ
|
asm volatile("msr fpcr, %0" :: "r"(saved | (1ULL << 24))); // FZ
|
||||||
return saved;
|
return saved;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
inline void denormals_restore(denormal_state saved)
|
inline void denormals_restore(denormal_state saved)
|
||||||
{
|
{
|
||||||
#if defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM64) || defined(_M_ARM64EC))
|
|
||||||
_WriteStatusReg(ARM64_FPCR, static_cast<__int64>(saved));
|
|
||||||
#else
|
|
||||||
asm volatile("msr fpcr, %0" :: "r"(saved));
|
asm volatile("msr fpcr, %0" :: "r"(saved));
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(__arm__) || defined(_M_ARM)
|
#elif defined(__arm__) || defined(_M_ARM)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Android Shell
|
# Android Shell
|
||||||
|
|
||||||
This directory contains a minimal SDLActivity-based Android app wrapper for Dusklight.
|
This directory contains a minimal SDLActivity-based Android app wrapper for Dusk.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,8 @@ plugins {
|
|||||||
id 'com.android.application'
|
id 'com.android.application'
|
||||||
}
|
}
|
||||||
|
|
||||||
def versionNameStr = (System.getenv("DUSK_VERSION") ?: "v0.1.0").replaceFirst("^v", "")
|
|
||||||
def versionCodeInt = (System.getenv("DUSK_VERSION_CODE") ?: "100000").toInteger()
|
|
||||||
|
|
||||||
def duskRepoDir = rootProject.projectDir.parentFile.parentFile
|
def duskRepoDir = rootProject.projectDir.parentFile.parentFile
|
||||||
def duskGeneratedAssetsDir = layout.buildDirectory.dir('generated/assets/dusklight').get().asFile
|
def duskGeneratedAssetsDir = layout.buildDirectory.dir('generated/assets/dusk').get().asFile
|
||||||
def syncDuskAssets = tasks.register('syncDuskAssets', Sync) {
|
def syncDuskAssets = tasks.register('syncDuskAssets', Sync) {
|
||||||
from(new File(duskRepoDir, 'res')) {
|
from(new File(duskRepoDir, 'res')) {
|
||||||
into 'res'
|
into 'res'
|
||||||
@@ -23,8 +20,8 @@ android {
|
|||||||
applicationId 'dev.twilitrealm.dusk'
|
applicationId 'dev.twilitrealm.dusk'
|
||||||
minSdk 26
|
minSdk 26
|
||||||
targetSdk 36
|
targetSdk 36
|
||||||
versionCode versionCodeInt
|
versionCode 1
|
||||||
versionName versionNameStr
|
versionName '0.1.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
|
|||||||
@@ -1,18 +1,13 @@
|
|||||||
package dev.twilitrealm.dusk;
|
package dev.twilitrealm.dusk;
|
||||||
|
|
||||||
import android.app.ActionBar;
|
import android.app.ActionBar;
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.ActivityNotFoundException;
|
|
||||||
import android.content.ClipData;
|
import android.content.ClipData;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
|
||||||
import android.provider.DocumentsContract;
|
|
||||||
import android.provider.OpenableColumns;
|
import android.provider.OpenableColumns;
|
||||||
import android.provider.Settings;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
@@ -27,15 +22,6 @@ import java.util.List;
|
|||||||
|
|
||||||
public class DuskActivity extends SDLActivity {
|
public class DuskActivity extends SDLActivity {
|
||||||
private static final String TAG = "DuskActivity";
|
private static final String TAG = "DuskActivity";
|
||||||
private static final int FOLDER_DIALOG_REQUEST_CODE = 0x4455;
|
|
||||||
private static final int MANAGE_STORAGE_REQUEST_CODE = 0x4456;
|
|
||||||
private static final String EXTERNAL_STORAGE_AUTHORITY =
|
|
||||||
"com.android.externalstorage.documents";
|
|
||||||
|
|
||||||
private long folderDialogUserdata = 0;
|
|
||||||
private boolean awaitingManageStoragePermission = false;
|
|
||||||
|
|
||||||
private static native void nativeFolderDialogResult(long userdata, String path, String error);
|
|
||||||
|
|
||||||
private static String[] splitArgs(String raw) {
|
private static String[] splitArgs(String raw) {
|
||||||
List<String> out = new ArrayList<>();
|
List<String> out = new ArrayList<>();
|
||||||
@@ -92,9 +78,6 @@ public class DuskActivity extends SDLActivity {
|
|||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
hideSystemBars();
|
hideSystemBars();
|
||||||
if (awaitingManageStoragePermission) {
|
|
||||||
resumeFolderDialogAfterPermissionGrant();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -164,229 +147,9 @@ public class DuskActivity extends SDLActivity {
|
|||||||
if (resultCode == RESULT_OK) {
|
if (resultCode == RESULT_OK) {
|
||||||
persistUriPermissions(data);
|
persistUriPermissions(data);
|
||||||
}
|
}
|
||||||
if (requestCode == FOLDER_DIALOG_REQUEST_CODE) {
|
|
||||||
finishFolderDialog(resultCode, data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
super.onActivityResult(requestCode, resultCode, data);
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean showFolderDialog(long userdata) {
|
|
||||||
if (userdata == 0 || folderDialogUserdata != 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
folderDialogUserdata = userdata;
|
|
||||||
if (requiresManageStoragePermission() && !hasManageStoragePermission()) {
|
|
||||||
if (!requestManageStoragePermission()) {
|
|
||||||
finishFolderDialogWithError("Unable to request Android file access permission");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
openFolderDialog();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void openFolderDialog() {
|
|
||||||
runOnUiThread(() -> {
|
|
||||||
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
|
|
||||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION |
|
|
||||||
Intent.FLAG_GRANT_WRITE_URI_PERMISSION |
|
|
||||||
Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION |
|
|
||||||
Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
|
|
||||||
|
|
||||||
try {
|
|
||||||
startActivityForResult(intent, FOLDER_DIALOG_REQUEST_CODE);
|
|
||||||
} catch (ActivityNotFoundException e) {
|
|
||||||
Log.w(TAG, "Unable to open folder dialog.", e);
|
|
||||||
finishFolderDialog(Activity.RESULT_CANCELED, null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean requiresManageStoragePermission() {
|
|
||||||
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.R;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasManageStoragePermission() {
|
|
||||||
return !requiresManageStoragePermission() || Environment.isExternalStorageManager();
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean requestManageStoragePermission() {
|
|
||||||
if (!requiresManageStoragePermission()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
awaitingManageStoragePermission = true;
|
|
||||||
runOnUiThread(() -> {
|
|
||||||
if (tryStartManageStorageIntent(
|
|
||||||
new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
|
|
||||||
.setData(Uri.parse("package:" + getPackageName()))) ||
|
|
||||||
tryStartManageStorageIntent(
|
|
||||||
new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
finishFolderDialogWithError("Unable to request Android file access permission");
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean tryStartManageStorageIntent(Intent intent) {
|
|
||||||
try {
|
|
||||||
startActivityForResult(intent, MANAGE_STORAGE_REQUEST_CODE);
|
|
||||||
return true;
|
|
||||||
} catch (ActivityNotFoundException e) {
|
|
||||||
Log.w(TAG, "Unable to open all-files access settings.", e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void resumeFolderDialogAfterPermissionGrant() {
|
|
||||||
awaitingManageStoragePermission = false;
|
|
||||||
if (folderDialogUserdata == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasManageStoragePermission()) {
|
|
||||||
openFolderDialog();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
finishFolderDialogWithError(
|
|
||||||
"Allow \"All files access\" for Dusklight before choosing a custom data folder");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void finishFolderDialogWithError(String error) {
|
|
||||||
long userdata = folderDialogUserdata;
|
|
||||||
folderDialogUserdata = 0;
|
|
||||||
awaitingManageStoragePermission = false;
|
|
||||||
if (userdata != 0) {
|
|
||||||
nativeFolderDialogResult(userdata, null, error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void finishFolderDialog(int resultCode, Intent data) {
|
|
||||||
long userdata = folderDialogUserdata;
|
|
||||||
folderDialogUserdata = 0;
|
|
||||||
if (userdata == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (resultCode == RESULT_OK && data != null && data.getData() != null) {
|
|
||||||
String path = getRealPathForUri(data.getData());
|
|
||||||
if (path != null && !path.isEmpty()) {
|
|
||||||
nativeFolderDialogResult(userdata, path, null);
|
|
||||||
} else {
|
|
||||||
nativeFolderDialogResult(
|
|
||||||
userdata, null, "Selected folder is not available as a filesystem path");
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
nativeFolderDialogResult(userdata, null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getRealPathForUri(Uri uri) {
|
|
||||||
if (uri == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
String scheme = uri.getScheme();
|
|
||||||
if ("file".equals(scheme)) {
|
|
||||||
return uri.getPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!"content".equals(scheme) ||
|
|
||||||
!EXTERNAL_STORAGE_AUTHORITY.equals(uri.getAuthority()) ||
|
|
||||||
Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
return getExternalStoragePathForDocumentId(getExternalStorageDocumentId(uri));
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
Log.w(TAG, "Unable to resolve URI: " + uri, e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String getExternalStorageDocumentId(Uri uri) {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && isTreeDocumentUri(uri)) {
|
|
||||||
return DocumentsContract.getTreeDocumentId(uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
return DocumentsContract.getDocumentId(uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean isTreeDocumentUri(Uri uri) {
|
|
||||||
List<String> segments = uri.getPathSegments();
|
|
||||||
return segments.size() >= 2 && "tree".equals(segments.get(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getExternalStoragePathForDocumentId(String documentId) {
|
|
||||||
if (documentId == null || documentId.isEmpty()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (documentId.startsWith("raw:")) {
|
|
||||||
return documentId.substring("raw:".length());
|
|
||||||
}
|
|
||||||
|
|
||||||
String[] parts = documentId.split(":", 2);
|
|
||||||
String volumeId = parts[0];
|
|
||||||
String relativePath = parts.length > 1 ? parts[1] : "";
|
|
||||||
|
|
||||||
File root = getExternalStorageRoot(volumeId);
|
|
||||||
if (root == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return relativePath.isEmpty()
|
|
||||||
? root.getAbsolutePath()
|
|
||||||
: new File(root, relativePath).getAbsolutePath();
|
|
||||||
}
|
|
||||||
|
|
||||||
private File getExternalStorageRoot(String volumeId) {
|
|
||||||
if ("primary".equalsIgnoreCase(volumeId)) {
|
|
||||||
return Environment.getExternalStorageDirectory();
|
|
||||||
}
|
|
||||||
if ("home".equalsIgnoreCase(volumeId)) {
|
|
||||||
return new File(
|
|
||||||
Environment.getExternalStorageDirectory(), Environment.DIRECTORY_DOCUMENTS);
|
|
||||||
}
|
|
||||||
|
|
||||||
File[] externalFilesDirs = getExternalFilesDirs(null);
|
|
||||||
if (externalFilesDirs != null) {
|
|
||||||
for (File externalFilesDir : externalFilesDirs) {
|
|
||||||
File root = getStorageRootForExternalFilesDir(externalFilesDir);
|
|
||||||
if (root != null && volumeId.equalsIgnoreCase(root.getName())) {
|
|
||||||
return root;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
File fallback = new File("/storage", volumeId);
|
|
||||||
return fallback.exists() ? fallback : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private File getStorageRootForExternalFilesDir(File externalFilesDir) {
|
|
||||||
if (externalFilesDir == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
String path = externalFilesDir.getAbsolutePath();
|
|
||||||
int androidDir = path.indexOf("/Android/");
|
|
||||||
if (androidDir <= 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new File(path.substring(0, androidDir));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void persistUriPermissions(Intent data) {
|
private void persistUriPermissions(Intent data) {
|
||||||
if (data == null) {
|
if (data == null) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -14,22 +14,15 @@ import android.provider.DocumentsContract.Root;
|
|||||||
import android.provider.DocumentsProvider;
|
import android.provider.DocumentsProvider;
|
||||||
import android.webkit.MimeTypeMap;
|
import android.webkit.MimeTypeMap;
|
||||||
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
|
|
||||||
public class DuskDocumentsProvider extends DocumentsProvider {
|
public class DuskDocumentsProvider extends DocumentsProvider {
|
||||||
public static final String AUTHORITY = "dev.twilitrealm.dusk.documents";
|
public static final String AUTHORITY = "dev.twilitrealm.dusk.documents";
|
||||||
|
|
||||||
private static final String ROOT_ID = "dusk";
|
private static final String ROOT_ID = "dusk";
|
||||||
private static final String ROOT_DOCUMENT_ID = "root";
|
private static final String ROOT_DOCUMENT_ID = "root";
|
||||||
private static final String LOCATION_DESCRIPTOR_NAME = "data_location.json";
|
|
||||||
private static final String DIRECTORY_MIME_TYPE = Document.MIME_TYPE_DIR;
|
private static final String DIRECTORY_MIME_TYPE = Document.MIME_TYPE_DIR;
|
||||||
|
|
||||||
private static final String[] DEFAULT_ROOT_PROJECTION = new String[] {
|
private static final String[] DEFAULT_ROOT_PROJECTION = new String[] {
|
||||||
@@ -53,19 +46,13 @@ public class DuskDocumentsProvider extends DocumentsProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCreate() {
|
public boolean onCreate() {
|
||||||
if (!isCustomDataPathEnabled()) {
|
ensureUserDirectories();
|
||||||
ensureUserDirectories();
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Cursor queryRoots(String[] projection) throws FileNotFoundException {
|
public Cursor queryRoots(String[] projection) throws FileNotFoundException {
|
||||||
final MatrixCursor result = new MatrixCursor(resolveRootProjection(projection));
|
final MatrixCursor result = new MatrixCursor(resolveRootProjection(projection));
|
||||||
if (isCustomDataPathEnabled()) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
final File root = getRootDirectory();
|
final File root = getRootDirectory();
|
||||||
final MatrixCursor.RowBuilder row = result.newRow();
|
final MatrixCursor.RowBuilder row = result.newRow();
|
||||||
|
|
||||||
@@ -235,14 +222,9 @@ public class DuskDocumentsProvider extends DocumentsProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private File getRootDirectory() throws FileNotFoundException {
|
private File getRootDirectory() throws FileNotFoundException {
|
||||||
if (isCustomDataPathEnabled()) {
|
|
||||||
throw new FileNotFoundException(
|
|
||||||
"Dusk DocumentsProvider is disabled while a custom data path is configured");
|
|
||||||
}
|
|
||||||
|
|
||||||
final File root = getContext().getFilesDir();
|
final File root = getContext().getFilesDir();
|
||||||
if (root == null) {
|
if (root == null) {
|
||||||
throw new FileNotFoundException("Dusklight files directory is unavailable");
|
throw new FileNotFoundException("Dusk files directory is unavailable");
|
||||||
}
|
}
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
@@ -259,7 +241,7 @@ public class DuskDocumentsProvider extends DocumentsProvider {
|
|||||||
final String relativePath = documentId.substring(ROOT_DOCUMENT_ID.length() + 1);
|
final String relativePath = documentId.substring(ROOT_DOCUMENT_ID.length() + 1);
|
||||||
final File file = new File(root, relativePath);
|
final File file = new File(root, relativePath);
|
||||||
if (!isInside(root, file)) {
|
if (!isInside(root, file)) {
|
||||||
throw new FileNotFoundException("Document escapes Dusklight files directory: " + documentId);
|
throw new FileNotFoundException("Document escapes Dusk files directory: " + documentId);
|
||||||
}
|
}
|
||||||
if (!file.exists()) {
|
if (!file.exists()) {
|
||||||
throw new FileNotFoundException("Document does not exist: " + documentId);
|
throw new FileNotFoundException("Document does not exist: " + documentId);
|
||||||
@@ -273,7 +255,7 @@ public class DuskDocumentsProvider extends DocumentsProvider {
|
|||||||
return ROOT_DOCUMENT_ID;
|
return ROOT_DOCUMENT_ID;
|
||||||
}
|
}
|
||||||
if (!isInside(root, file)) {
|
if (!isInside(root, file)) {
|
||||||
throw new FileNotFoundException("File escapes Dusklight files directory: " + file);
|
throw new FileNotFoundException("File escapes Dusk files directory: " + file);
|
||||||
}
|
}
|
||||||
|
|
||||||
final String rootPath = canonicalPath(root);
|
final String rootPath = canonicalPath(root);
|
||||||
@@ -291,42 +273,6 @@ public class DuskDocumentsProvider extends DocumentsProvider {
|
|||||||
new File(root, "EUR/Card A").mkdirs();
|
new File(root, "EUR/Card A").mkdirs();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isCustomDataPathEnabled() {
|
|
||||||
if (getContext() == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final File filesDir = getContext().getFilesDir();
|
|
||||||
if (filesDir == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final File descriptor = new File(filesDir, LOCATION_DESCRIPTOR_NAME);
|
|
||||||
if (!descriptor.isFile()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
final JSONObject json = new JSONObject(readText(descriptor));
|
|
||||||
return "custom".equals(json.optString("mode", "default"));
|
|
||||||
} catch (IOException | JSONException e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String readText(File file) throws IOException {
|
|
||||||
try (FileInputStream input = new FileInputStream(file);
|
|
||||||
ByteArrayOutputStream output = new ByteArrayOutputStream())
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[4096];
|
|
||||||
int bytesRead;
|
|
||||||
while ((bytesRead = input.read(buffer)) != -1) {
|
|
||||||
output.write(buffer, 0, bytesRead);
|
|
||||||
}
|
|
||||||
return output.toString(StandardCharsets.UTF_8.name());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String[] resolveRootProjection(String[] projection) {
|
private static String[] resolveRootProjection(String[] projection) {
|
||||||
return projection != null ? projection : DEFAULT_ROOT_PROJECTION;
|
return projection != null ? projection : DEFAULT_ROOT_PROJECTION;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
|||||||
private static final String TAG = "SDL";
|
private static final String TAG = "SDL";
|
||||||
private static final int SDL_MAJOR_VERSION = 3;
|
private static final int SDL_MAJOR_VERSION = 3;
|
||||||
private static final int SDL_MINOR_VERSION = 4;
|
private static final int SDL_MINOR_VERSION = 4;
|
||||||
private static final int SDL_MICRO_VERSION = 8;
|
private static final int SDL_MICRO_VERSION = 4;
|
||||||
/*
|
/*
|
||||||
// Display InputType.SOURCE/CLASS of events and devices
|
// Display InputType.SOURCE/CLASS of events and devices
|
||||||
//
|
//
|
||||||
@@ -570,7 +570,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
|||||||
public static int getNaturalOrientation() {
|
public static int getNaturalOrientation() {
|
||||||
int result = SDL_ORIENTATION_UNKNOWN;
|
int result = SDL_ORIENTATION_UNKNOWN;
|
||||||
|
|
||||||
Activity activity = getContext();
|
Activity activity = (Activity)getContext();
|
||||||
if (activity != null) {
|
if (activity != null) {
|
||||||
Configuration config = activity.getResources().getConfiguration();
|
Configuration config = activity.getResources().getConfiguration();
|
||||||
Display display = activity.getWindowManager().getDefaultDisplay();
|
Display display = activity.getWindowManager().getDefaultDisplay();
|
||||||
@@ -590,7 +590,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
|||||||
public static int getCurrentRotation() {
|
public static int getCurrentRotation() {
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
Activity activity = getContext();
|
Activity activity = (Activity)getContext();
|
||||||
if (activity != null) {
|
if (activity != null) {
|
||||||
Display display = activity.getWindowManager().getDefaultDisplay();
|
Display display = activity.getWindowManager().getDefaultDisplay();
|
||||||
switch (display.getRotation()) {
|
switch (display.getRotation()) {
|
||||||
@@ -1292,7 +1292,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
|||||||
public static double getDiagonal()
|
public static double getDiagonal()
|
||||||
{
|
{
|
||||||
DisplayMetrics metrics = new DisplayMetrics();
|
DisplayMetrics metrics = new DisplayMetrics();
|
||||||
Activity activity = getContext();
|
Activity activity = (Activity)getContext();
|
||||||
if (activity == null) {
|
if (activity == null) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
@@ -1940,7 +1940,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Activity activity = getContext();
|
Activity activity = (Activity)getContext();
|
||||||
if (activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
|
if (activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
|
||||||
activity.requestPermissions(new String[]{permission}, requestCode);
|
activity.requestPermissions(new String[]{permission}, requestCode);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Dusklight</string>
|
<string name="app_name">Dusk</string>
|
||||||
<string name="documents_provider_root_name">Dusklight Data</string>
|
<string name="documents_provider_root_name">Dusk Data</string>
|
||||||
<string name="documents_provider_summary">Saves, texture packs, settings, and logs</string>
|
<string name="documents_provider_summary">Saves, texture packs, settings, and logs</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -14,5 +14,5 @@ dependencyResolutionManagement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rootProject.name = "dusklight-android"
|
rootProject.name = "dusk-android"
|
||||||
include ':app'
|
include ':app'
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 928 KiB After Width: | Height: | Size: 928 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 1014 B After Width: | Height: | Size: 1014 B |
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 279 KiB After Width: | Height: | Size: 279 KiB |